[1.5]RimworldのMODをExtract translationで出力して日本語化する方法
はじめに
『使いたいMODが日本語化されてない!なら自分で作ろう!』な人に向けた案内です。翻訳方法のみ書いています。MOD公開の方法は書いてません。
▼MOD(ワークショップ)を準備する
Extract translationをサブスクライブする
ゲームを起動してExtract translationを有効にする(再起動)
※翻訳したいMODも有効にしておく
▼言語ファイルを出力する
タイトル画面のメニューボタンの最下に「Extract translation」というボタンが追加されるので、それをクリックする
翻訳したいMODをリストから選択する
画面左上部に「Successfully extracted」と出たら出力完了している。
▽上書きする場合
すでに日本語ファイルをもっている場合は、出力前に翻訳するMODの言語フォルダに[Japanese]として入れておくと、XMLファイルのTODOに[Japanese]のものが入る。
おそらくラベル参照なので、英文を比較して置換しているわけではない。
そのため英文が更新されている場合を考えて、前バージョンとの比較が必要になる。
<VCEF_Fishing.description>TODO</VCEF_Fishing.description>
<!-- EN: Catch fish in designated work zones. -->
<VCEF_Fishing.description>設定された漁業ゾーンで魚を捕まえる</VCEF_Fishing.description>
▽Extract translationですべて出力されるわけではない
Vanilla Cooking Expandedのパッチをすべて翻訳しようと思い立ち、Vanilla Genetics ExpandedをRimWorld Mod データベースからもってきて再出力したらかなりの抜けが出た。
なので「出力された英語は日本語に翻訳を完了したな」と思っても、タイトル画面の「翻訳ファイルを検証する」を行って、「TranslationReport.txt」の「Def-injected translations missing」の項目で確認を行ってみるとよい。
▼General load errorsが起きてフォルダ内のファイルを読み込まない場合
フォルダ名を間違えています。
検証出力では基礎フォルダ名しか出しません。
エラーの起きたフォルダのファイル内の要素、ラベルを元MODに検索をかけて正しいフォルダ名を探します。
例えば「Vanilla Genetics Expanded」を検証して出てきた「AbilityDef: GR_Pounce.label 'pounce'」は「AbilityDef」フォルダに入れても読み込みません。
そのため「Vanilla Genetics Expanded」のファイル内から「AbilityDef」や「AbilityDef>」で検索をかけます。※自分はDevasで検索している
ヒットしたそれらしき「<VFECore.Abilities.AbilityDef>」があったのでファイルを確認します。
<VFECore.Abilities.AbilityDef>
<defName>GR_Pounce</defName>
<label>pounce</label>
<description>This hybrid can jump into combat, quickly closing the distance between it and its enemies.</description>
<abilityClass>GeneticRim.Ability_Pounce</abilityClass>
<targetMode>Location</targetMode>
<castTime>60</castTime>
<range>15</range>
<cooldownTime>5000</cooldownTime>
<iconPath>UI/commands/GR_Pounce</iconPath>
</VFECore.Abilities.AbilityDef>
と出てきたので、この「AbilityDef: GR_Pounce.label 'pounce'」は「VFECore.Abilities.AbilityDef」というフォルダに入れる必要があると分かります。
▼MODに含まれているパッチ(互換性のある)分のMOD翻訳について
元MODの「Patches」フォルダをみると互換性のあるMODがある。
これはExtract translationでは出力されません。(RimTransでも)
パッチ分の翻訳をしたい場合は手動で行います。
(他にいい方法あったら教えて欲しいです)
▽「翻訳ファイルを検証する」で出力する場合
まずはパッチMODなしの翻訳情報を得るため、MODの管理でパッチMODなし状態にする。
ゲームのタイトル画面左上にあるメニューから「翻訳ファイルを検証する」をクリックする。
デスクトップに「TranslationReport.txt」が出力されるので「TranslationReport A.txt」にリネームする。
再度MOD管理で、翻訳するパッチMODを有効にする。
またデスクトップに「TranslationReport.txt」が出力されるので「TranslationReport B.txt」にリネームする。(リネームしなくてもいい)
WinMergeなどのファイル比較ソフトウェアで「TranslationReport A.txt」と「TranslationReport B.txt」を比較する。
「Def-injected translations missing」の箇所の比較に新規で追加されている箇所を、該当するフォルダにXMLファイルを作成、翻訳したら完了です。
▽「Patches」フォルダのファイルを見て書き出す場合
正直いってめんどくさいが、確実な方法。というのも、「翻訳ファイルを検証する」で出力されないものが出てくるためです。
自分が遭遇したものだと、パッチ元の翻訳する部分を上書きするものでした。
例えば「Vanilla Cooking Expanded」の
「<VCE_Wheat.label>小麦</VCE_Wheat.label>」が、
「RimCuisine 2 Core (Continued)」や「VGP Vegetable Garden」のパッチで
「<VCE_Wheat.label>スペルト小麦</VCE_Wheat.label>」に
変更する仕様のため、未翻訳ではないという判定になります。
また、要素が重複している場合はひとつしか読み込まないので、パッチMODが有効の場合と無効の場合に読み込むフォルダを分ける必要があります。
フォルダの読込ファイルの作成方法については次セクションで解説します。
Patchesフォルダの訳したいXMLファイルを見ます。
例として「Vanilla Cooking Expanded」のPatchesフォルダ内にある「AchievementsPatch.xml」を見てみます。
<AchievementsExpanded.AchievementDef>
<defName>VCE_AchievementFiveStarRestaurant</defName>
<label>Five Star Restaurant</label>
<description>Serve a total of 100 Gourmet meals</description>
<bgtexPath>Achievements/VCE_AchievementBackground</bgtexPath>
<tab>VCE_Achievements</tab>
<tracker Class="AchievementsExpanded.ItemCraftTracker">
<def>VCE_MealGourmet</def>
<count>100</count>
</tracker>
<texPath>Achievements/VCE_AchievementFiveStarRestaurant</texPath>
<points>20</points>
</AchievementsExpanded.AchievementDef>
基本的に<label>や<description>が翻訳対象になります。
<defName>は要素名に使用し、その上にある<AchievementsExpanded.AchievementDef>はフォルダ名になります。
なのでこの場合は正規表現で行頭の半角空白を削除し「^\s+」、不必要なタグを削除します。おまけに行末のタグも削除します。「</.*」
<AchievementsExpanded.AchievementDef>
<defName>VCE_AchievementFiveStarRestaurant
<label>Five Star Restaurant
<description>Serve a total of 100 Gourmet meals
だいぶ見やすくなったら、これをXMLファイルに挿入する形に直します。
■AchievementsExpanded.AchievementDef
<!-- EN: Five Star Restaurant -->
<VCE_AchievementFiveStarRestaurant.label>五つ星レストラン</VCE_AchievementFiveStarRestaurant.description>
<!-- EN: Serve a total of 100 Gourmet meals -->
<VCE_AchievementFiveStarRestaurant.description>合計100食のグルメ料理を提供する</VCE_AchievementFiveStarRestaurant.description>
あとは「AchievementsExpanded.AchievementDef」フォルダにXMLファイルに該当箇所をコピペして完了です。
▽パッチの翻訳ファイルの場所について
通常、元MODと同じ場所に入れると、パッチMODを入れていない場合にログにエラー出力される。それを回避するために、「LoadFolders.xml」のファイルを作成して、このMODが読み込まれたらこのパッチの翻訳ファイルの場所を読み込むという命令を出す文を書きます。
ファイルの場所は各々自由に作成できます。自分の場合はverフォルダの中に「Mods」フォルダを作っています。
LoadFolders.xmlの書き方についてはRimWorldwiki(英語)の「Mod Folder Structure」にあります。
要素が重複している場合の対処法としてこのLoadFolders.xmlの命令を使いこなさないといけません。
重複する要素がある場合のフォルダの分け方は以下が考えられます。
「Vanilla Cooking Expanded」のみを読み込んだとき
「RimCuisine 2 Core (Continued)」のみを追加したとき
「VGP Vegetable Garden」のみを追加したとき
「RimCuisine 2 Core (Continued)」と「VGP Vegetable Garden」の両方を追加したとき
LoadFolders.xmlの書き方としては以下になります。
<!-- RimCuisine 2 Core (Continued)とVGP Vegetable Gardenが無効 -->
<li IfModNotActive="mlie.rc2.core, dismarzero.vgp.vgpvegetablegarden">1.5/Mods/VCEonly</li>
<!-- RimCuisine 2 Core (Continued)が有効 VGP Vegetable Gardenが無効 -->
<li IfModActive="mlie.rc2.core" IfModNotActive="dismarzero.vgp.vgpvegetablegarden">1.5/Mods/VGP Vegetable Gardenonly</li>
<!-- RimCuisine 2 Core (Continued)が無効 VGP Vegetable Gardenが有効 -->
<li IfModActive="dismarzero.vgp.vgpvegetablegarden" IfModNotActive="mlie.rc2.core">1.5/Mods/RimCuisine 2 Coreonly</li>
<!-- RimCuisine 2 Core (Continued)とVGP Vegetable Gardenが有効 -->
<li IfModActive="mlie.rc2.core, dismarzero.vgp.vgpvegetablegarden">1.5/Mods/RC2_VGPVG</li>
VCEonlyには「<VCE_Wheat.label>小麦</VCE_Wheat.label>」
どちらか入れていた場合のフォルダに<VCE_Wheat.label>スペルト小麦</VCE_Wheat.label>のXMLファイルをいれれば、きちんと翻訳されます。
これがAとBとCの要素が重複して、別々の名称になる場合は、優先するMODを選ぶ必要も出てきます…翻訳がバラバラになってしまうので管理する側としては要素の重複やめーや!ってなりますね。
HTMLのように、要素に"!important"で翻訳の優先命令を入れれたらいいのにって思います…
▼出力したファイルを翻訳する
ゲームを終了して、選択したMODのフォルダを開く
MODの場所は個人の設定によります。
自分は"ディスク:\Steam\steamapps\workshop\content\294100"
RimPyを導入していれば、対象MODを右クリック[Open folder]で開けます。
選択したMODのフォルダにLanguagesフォルダ内に「Japanese (日本語)」が生成されているので、そのフォルダ内の「DefInjected」や「Keyed」内のxmlファイルを翻訳する。
原文は<!-- EN: 〇〇〇 -->というコメント行で出力されている。
翻訳する箇所はTODOという所のみで、
左の赤枠の「TraderShipsArrival.label」をクリックして、
右の赤枠の箇所の「TODO」を編集する。
▼XMLファイルのメモ
▽リスト化されている部分の翻訳
たまにリスト化のものがコメント行になっているものがあります。
言葉では解説しずらいので図で比較してください。
例えば[special]と[trade]は変換されるので、
<li>questName->[requester_label]との[special][trade]</li>
<li>special->興味深い</li>
<li>special->型破りな</li>
<li>trade->販売</li>
<li>trade->貿易</li>
「興味深い販売」「型破りな貿易」「興味深い貿易」などになります。
▽1.5に追加された図解書
1.5で追加された図解書は研究内容を習得するアイテムで、MODにオリジナル研究がある場合はこれらの翻訳もある可能性があります。
ただ現時点(2024.04.21)ではCoreの有志翻訳が進んでいないので、英語が混じってしまう。
なお、Coreの「DefInjected\RulePackDef」のRulePacks_Book_Descriptions.xmlに図解書・小説・教科書の翻訳ルールがある。
この図解書を翻訳して、ゲームで確認したい場合は、開発者モードの[Spawn thing...]でアイテム生成(ランダム)する。
[Schematic]で図解書
[TextBook]で教科書
[Novel]で小説
Anomaly導入の場合、[Tome]で書物
▼なんか追加されてたMOD用アイコン
RimWorldwiki(英語):About.xml
modIconPathタグが追加されてました。
ゲームを開始する際の読込画面に表示されるMOD一覧にアイコンが表示されます。
▼個人的に使っているツール
XMLEDITOR.NET:XMLファイルを編集する
XML Notepad:XMLファイルを編集する(軽量だが日本語非対応)
RimPy:MODの管理
Devas:フォルダ内のテキストを一括変更する(正規表現対応)
WinMerge:ファイル比較する