Doki Doki Literature Club

Doki Doki Literature Club

64 ratings
Ren'Py製ゲームの翻訳パッチ作成方法
By Proudust
DDLCの日本語化のために調査したものです。多分他のRen'Py製ゲームでも同様の方法が使えるはずです。
 
Rate  
Favorite
Favorited
Unfavorite
0. はじめに
http://steamcommunity.com/sharedfiles/filedetails/?id=1198057121
このような日本語化をするために試した手順を書いていきます。

とりあえず現状わかっていることを雑にまとめただけなので少しずつわかりやすく書き直したいと思います。
分からない点がありましたらコメント欄にてご指摘お願いします。

他所を参考にDDLC翻訳作業所[docs.google.com]を試作してみました。



こちらも参考になると思います:
Ren'Py製ゲーム翻訳の手引き | まださなぎ[dettalant.com]

参考にしました:
http://steamcommunity.com/sharedfiles/filedetails/?id=851616929
http://steamcommunity.com/sharedfiles/filedetails/?id=1176221672
1. ゲームのアンパック・デコンパイル
ゲームをソースコードまで戻し、原文を取り出します
1-1. Pythonのインストール・環境変数の設定
アンパック、デコンパイルに使用するツールはPythonで書かれているので、Pythonが動作する環境を準備します。


Python公式サイト[www.python.org]からPythonをダウンロードしインストールします。
色んなバージョンがありますがどう違うのか私にはよくわかりません。
私はv2.7.14 32bit版を使っていますが特に問題は起きてないので"Download Python 2.7.14"からダウンロードすればいいでしょう。


またインストールするときは"Add python.exe to Path"を"Will be installed on local hard drive"に変更すると環境変数の設定を勝手にやってくれます。
うっかり付け忘れても場合はggって手動設定すれば大丈夫です。
1-2. rpaファイルのアンパック

スクリプトファイルを取り出すため、rpaファイルをアンパックします。

GitHubからrpatool[github.com]をダウンロードします。

使い方はコマンドプロンプトから以下のコマンドを入力します。
python rpatool -x [アンパックしたいrpaファイル]

ソースデータは"Doki Doki Literature Club\game\scripts.rpa"に全て入っています。中には不純物もありますが必要なのでちゃんと取っておきましょう。
1-3. rpycファイルのデコンパイル

アンパックによりrpycファイルが得られましたが、コンパイルされた状態のため内容を読むことができません。
そのためデコンパイルによりソースファイルに戻し、内容を読める状態にします。

unrpyc[github.com]をダウンロードします。

使い方はコマンドプロンプトから以下のコマンドを入力します。
python un.rpyc [デコンパイルしたいrpycファイル]

"scripts.rpa"にパックされていたrpycファイル全部をデコンパイルしましょう。
2. 翻訳環境構築
ソースコードを取り出せたので次は翻訳パッチを作成するための環境を作成します
2-1. 必要なRen'Pyバージョンの確認

使用するRen'Py SDKのバージョンを、ゲーム本体のビルドに使われたバージョンと揃える必要があります。

ゲーム本体のビルドに使われたバージョンは、ゲームのインストールフォルダにある"log.txt"から確認できます。

右はDDLCの場合で、6.99.12でビルドされたことがわかります。
2-2. Ren'Py SDKの準備
Ren'Py公式サイトからRen'Py SDKをダウンロードします。最新版はこちらに[www.renpy.org]古いバージョンはこちらに[www.renpy.org]あります。

十分な容量のあるドライブの適当な場所に解凍して"renpy.exe"を実行します。起動にやたら時間がかかるのでお茶でも飲みながら待ちましょう。


Ren'Py SDKは日本語に切り替えることができます。
プロジェクトの言語に影響するらしいので日本語に設定しましょう。
右下の"preferences">右の"Language"から"Japanese"を選ぶと日本語になります。
左下の"Return(戻る)"から元のメインメニューに戻れます。
2-3. プロジェクトの作成
まずゲーム本体の入ったフォルダをそのままrenpy.exeのあるフォルダへコピーします。
以下のようなファイル構成になると思います。
Ren'Py SDKを再度開き、プロジェクト内にゲーム本体の入ったフォルダの名前が増えていれば成功です。
"Ren'Py" ├ "[ゲーム名]" │ └ 実行ファイルなど └ "renpy.exe"など

次に作成したプロジェクトにDDLCのソースを展開します。
  • "launcher\game\fonts\MTLc3m.ttf""[ゲーム名]\game"フォルダにコピー

  • アンパックした"scripts.rpa"の内容物を全て"[ゲーム名]\game"フォルダにコピーします。

  • デコンパイルしたしたrpyファイルを全て"[ゲーム名]\game"フォルダにコピーします。

  • "scripts.rpa"を削除
以上の操作を行うとフォルダの内容は以下のようになります。
"[ゲーム名]" └ "game" ├ "audio.rpa" ├ "fonts.rpa" ├ "images.rpa" ├ ("scripts.rpa"の内容物) └ (デコンパイルしたしたrpyファイル)

再びRen'Py SDKを開き、操作したプロジェクトを選んで右下の"プロジェクトの起動"を選びます。
英語のタイトル画面が表示されればひとまず準備完了です。
DDLC既プレイの場合はセーブデータの削除確認画面を挟むので焦らないようにしましょう。(1敗)
2-4. 翻訳の生成
※DDLC本編翻訳の場合は、スプレッドシートから出力したファイルを"[DDLC]\game\tl\Japanese"に配置するだけでOKです


Ren'Py SDKの"翻訳の生成"機能を使用して翻訳の雛形を作成し、フォントを差し替えます。

メインメニュー右の"翻訳の生成"を選びます。


"言語:"の下に"Japanese"と入力し、"翻訳の生成"を選びます。

"翻訳を空の文字列で生成する"にチェックを入れるとデフォルトの翻訳が空欄になってしまいます。入れない場合はデフォルトの翻訳に原文が入っているのでチェックを入れないほうが便利だと思います。

成功した場合は"[プロジェクト名]\game\tl\Japanese"に翻訳スクリプトの雛形が保存されています。
2-5. フォントの差し替え
ゲーム内のフォントを日本語対応のものに差し替えます。

まず適当な日本語フォントを用意し、"[ゲーム名]\game\gui\font"に配置します。DDLC日本語化では18/01/03現在以下のフォントを使用しています。

次に"[ゲーム名]\game\tl\Japanese\screens.rpy"を開き、以下の文を追加します。
この辺りはゲームによって大きく差異があると思うので要調整です。
init python: config.language = "Japanese" translate Japanese python: gui.default_font = "gui/font/VL-Gothic-Regular.ttf" gui.name_font = "gui/font/VL-Gothic-Regular.ttf" gui.interface_font = "gui/font/VL-Gothic-Regular.ttf" gui.button_text_font = gui.interface_font gui.choice_button_text_font = gui.default_font gui.choice_button_borders = Borders(10, 5, 10, 5) translate Japanese style edited: font "gui/font/VL-Gothic-Regular.ttf" translate Japanese style poemgame_text: font "gui/font/mikachanALL.ttc" translate Japanese style navigation_button_text: font "gui/font/VL-Gothic-Regular.ttf" translate Japanese style game_menu_label_text: font "gui/font/VL-Gothic-Regular.ttf" translate Japanese style pref_label_text: font "gui/font/VL-Gothic-Regular.ttf" translate Japanese style check_button_text: font "gui/font/mikachanALL.ttc" translate Japanese style radio_button_text: font "gui/font/mikachanALL.ttc"

もう一度Ren'Py SDKを起動し、"プロジェクトの起動"を行い、タイトルが日本語化されたら成功です。
3. 翻訳
3-1. 台詞の翻訳
生成された翻訳ファイル内の"translate Japanese ~_~:"は指定されたラベルのソースコード一行を別の文へ置き換えるものです。
例えばDDLCで以下のように記述した場合、ニューゲーム直後のサヨリの台詞が、モニカの"test"という台詞に置き換わります。
translate Japanese ch0_main_41e273ca: m "test"
重要なのは台詞だけでなく一行まるごと差し替わるため、話すキャラや立ち絵なども変更可能なことです。
また複数行にまたがる翻訳や、Python文の実行も可能です。
3-2. 選択肢、名前などの翻訳
"translate Japanese strings:"はソースコード内の"old"で指定された文字列を"new"で置き換えるものです。
例えばDDLCで以下のように記述した場合、ソースコード中の"Monika"という文字列が"モニカ"という文字列に置き換わります。
translate Japanese strings: old "Monika" new "モニカ"
こちらは完全一致で置き換えるため、"Monika"を含む台詞などは翻訳されないはずです。
主に選択肢や文字列型変数の翻訳に使用します。
3-3. 文字列型変数の翻訳
Ren'PyではSay文中に[変数名]で文字列型変数の埋め込みが可能です。
DDLCではプレイヤー名は[player]、サヨリの質問(一緒に帰りたいと聞かれたらどうするか)では[ch2_winner]というように埋め込んでいます。

文字列型変数への代入文は台詞や選択肢のようには翻訳されません。
しかし、変数名の後ろに"!t"を追加することで選択肢と同じように翻訳が可能になります。
先程のサヨリの質問の場合では翻訳後の文章に[ch2_winner!t]と埋め込むことで翻訳を反映させています。
3-4. 画像やテキストファイルの翻訳
翻訳に伴い画像やテキストファイルなどの差し替えが必要な場合、"game\tl\Japanese\"内に差し替え後のファイルを置くだけで差し替わります。

例えばDDLCの"gui\poem_dismiss.png"を翻訳したい場合、"game\tl\Japanese\gui\"内に差し替え後の"poem_dismiss.png"を置くことで差し替わります。
3-5. Python文の置き換え
DDLCのプレイヤー名入力の日本語対応のように、単純に翻訳するだけでは足りない場合があります。
その場合はある程度の範囲のPython文をまるごと置き換えることが可能です。

以下はDDLCのプレイヤー名入力部分のソースコードです。(引用して大丈夫かな)
init -501 screen name_input(message, ok_action): modal True zorder 200 style_prefix "confirm" add "gui/overlay/confirm.png" key "K_RETURN" action [Play("sound", gui.activate_sound), ok_action] frame: has vbox: xalign .5 yalign .5 spacing 30 label _(message): style "confirm_prompt" xalign 0.5 input default "" value VariableInputValue("player") length 12 allow "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" hbox: xalign 0.5 spacing 100 textbutton _("OK") action ok_action

これを日本語対応にする場合、以下のような文を翻訳に追加します。
translate Japanese screen: screen name_input(message, ok_action): modal True zorder 200 style_prefix "confirm" add "gui/overlay/confirm.png" key "K_RETURN" action [Play("sound", gui.activate_sound), ok_action] frame: has vbox: xalign .5 yalign .5 spacing 30 label _(message): style "confirm_prompt" xalign 0.5 input default "" value VariableInputValue("player") length 12 pixel_width 168 hbox: xalign 0.5 spacing 100 textbutton _("OK") action ok_action

つまりクラスのメソッド一つを翻訳ファイルから置き換えることが可能です。MinecraftのMODもこれくらい簡単に既存クラスを書き換えられたら楽なのに
4. 配布
4-1. options.rpyへの追記
"options.rpy"内にはビルド時にパックするファイルを指定する文があります。
以下はDDLCの場合の例です。
init python: build.archive("scripts", "all") build.archive("images", "all") build.archive("audio", "all") build.archive("fonts", "all") build.classify("game/**.jpg", "images") build.classify("game/**.png", "images") (中略) build.documentation('*.html') build.documentation('*.txt') build.include_old_themes = False define build.itch_project = "teamsalvato/ddlc"

ここの"build.archive("fonts", "all")""build.classify("game/**.jpg", "images")"の間に以下の文を追加します。
build.archive("jp", "all") build.classify("game/tl/Japanese/**.jpg", "jp") build.classify("game/tl/Japanese/**.png", "jp") build.classify("game/tl/Japanese/**.txt", "jp") build.classify("game/tl/Japanese/**.chr", "jp") build.classify("game/tl/Japanese/**.pdf", "jp") build.classify("game/gui/font/*.ttf", "jp") build.classify("game/gui/font/*.otf", "jp")
こうすることで、ビルド時に日本語化に必要なファイルを纏めた"jp.rpa"が生成されるようになります。
4-2. ビルド
5. おまけ
5-1. コードエディタ
テキストエディタなら何を使っても問題ありません。
ですが、拡張機能によってRenPy向け機能を追加できる、以下のどちらかがおすすめです。
どちらもOSを選ばず、軽量で多機能、日本語化も可能です。


Atom
本体ダウンロード[atom.io]
GitHub社製のコードエディタです。設定方法はここに大体まとまってます。[qiita.com]

Atom用Ren'Py用拡張機能ダウンロード[atom.io]
Ren'Pyスクリプトの構文ハイライトとスニペットなどを追加します。



Visual Studio Code
本体ダウンロード[www.microsoft.com]
Microsoft製のコードエディタです。Visual Studioと名を冠していますが、本家VSとは異なりmacOSやLinuxでも動作しますし、動作も軽快です。

VSCode用Ren'Py用拡張機能ダウンロード[github.com]
残念ながらRen'Py用拡張機能は現在マーケット上から消えてしまっているようですが、GitHub上で開発が進んでいます。



他にもSublime TextというコードエディタもRen'Py用拡張機能があるようですが、よく知らないので名前だけ挙げておきます。
< >
19 Comments
migo0110 Jun 4 @ 7:17am 
お聞きしたいことがあり、投稿させていただきます

こちらの記事を参考に、「1-3.rpycファイルのデコンパイル」を試させていただきました。
ところが、"SyntaxError: Non-ASCII character '\xda' in file un.rpyc on line 1"とのエラーメッセージが表示されてしまい、うまくデコンパイルすることができませんでした。
調べたところ、"UTF-8"と書式を宣言していないことによるためで、un.rpcyのソースコードをDLし、編集して試したところうまくいきました。

当方、pythonの経験がない初心者であり、後学のためお聞きしたいのですが、un.rpycのままエラーメッセージが出ることなくデコンパイルする方法はあるのでしょうか?

Proudust  [author] Feb 25 @ 7:18am 
DDLCのガイドとして公開してはいますが、あくまでRen'Py製ゲームの翻訳パッチ作成方法のガイドなので場違いではないですよ~!
順調に翻訳が進んでいるようで何よりです。頑張ってください!
kazamiyuuma Feb 25 @ 3:04am 
リンクありがとうございました。面白い動画でなるほどと思いつつも一日触ってみまして。どうやら私には上級者過ぎたようです()←気付くのが遅い

ただ、翻訳文章については出来てきていて長くなりそうですが、文章が反映されていることも確認しながらちまちま続けようと思います。
場違いにもかかわらずヒントを掲示して下さったお二方、本当にありがとうございました。
Proudust  [author] Feb 24 @ 2:36am 
DDLCはSteamAPIを使っていないのでよくわかりませんが、以下の動画で別のゲームでの解決方法が載っていました。
この動画で配布されている.iniファイルをそのゲーム用に書き換えることができれば直るかも?
https://www.youtube.com/watch?v=i0qW4KKe9Aw
kazamiyuuma Feb 24 @ 2:17am 
ありがとう……!本当にありがとうございます!!!
おかげでまだ頑張れそうです。
dettalant Feb 23 @ 7:50am 
もし「即ゲームが落ちる」厄介なエラーの場合は……難易度高そうですけれど。
renpyの仕様上まだ手段はあるから諦めないで!

「翻訳の生成」で出てるのが正常な翻訳テンプレートの場合は、それを(アンパックしてない)バニラ状態のgameフォルダにぶっこんで、強引に翻訳確認するのもできる……と思います。

(少なくとも別renpyゲーでは)steamライブラリフォルダ内の`[ゲーム名]/game`フォルダに翻訳の生成で出来た`tl/[言語名]`フォルダをぶっこめば、他をいじらずとも翻訳適用されるのは確認していますので。
dettalant Feb 23 @ 7:49am 
かなりお困りのようなので、横からちょっとした助言をば。

そのscript.rpyエラーコード、文章的には「Steamのソフトウェアを通さずにゲームを起動した」時に出るエラーみたいですね。
それは「プロジェクトをこじ開けての起動 = 正規でない手段での起動」が理由で出てるので、特に間違えてはいない可能性もありますよ。
いわゆる(そのゲームの)仕様ってことですね。

ちなみにですけど、そのエラーは「エラーログ表示後、即ゲームが落ちる」タイプのエラーですか?
エラーログ表示し終えたら、一応ゲームが起動するエラーもあるもので、一応確認。
kazamiyuuma Feb 22 @ 8:33am 
script.rpyを削除した後実行すると一応起動はしましたが(当然scriptを削除しているので、タイトル画面やメニュー画面は表示されましたがゲームとしては動かない)、何故か翻訳の生成もされるのですが、当然ゲームとしては動かず。script.rpyを戻すとまた同じ文章が出ました。
間違えたのかとデータを削除し、rpaファイルをアンパックする所から何回やり直しても同じ文章が出ます。
プロジェクトの起動が出来ない時点で間違えているのだと思いますが判りません。バックアップは当然とってますが、下手に触ると絶対壊します。script.rpyファイルだけ何か間違えたのでしょうか。renpyのバージョンも確認して同じバージョンですlogを何回も確認しました。ゲームのフォルダ以外は触っていません。暇があって気が向いたらで良いです助けて。
kazamiyuuma Feb 22 @ 8:30am 
こんにちは。DOLC(面白かったです)の翻訳では無いのですが良ければお知恵をお貸しください。DDLCではないので当然無視でも仕方がないとは思っています。
こちらに書いてあるガイドを参考にrpaファイルを→rpyc→pryに変更するところまで出来ました。
プロジェクトに名前が増えている事を確認しましたが、ゲーム.exeからは実行できてもプロジェクトからは出来ませんでした。
rpyc、rpyファイルとrpaファイルアンパックした時に出てきた音楽、画像ファイルを張り付けた後rpaファイルをすべて削除しました。
実行するとscript.rpyの中(違うのかも)にエラーが出ました。↓これです

While running game code:
File "game/script.rpy", line 8, in <module>
RuntimeError: Could not initialize Steam library. (SteamAPI_Init() failed)

temjin747es Jan 21 @ 11:29pm 
pythonを省略したら解決しました!ありがとうございます!正しく開封できました!