Hades Guide

機械翻訳で日本語化する方法(フォント不備のため一部文字化け) for Hades

機械翻訳で日本語化する方法(フォント不備のため一部文字化け)

Overview

英語は分からないけど日本語化したい。機械翻訳の力を借りてやってみよう。

始めに

このガイドはv1.36032を対象にしている。

本文では機械翻訳を使って日本語化する手順を説明する。
各言語のテキストをcsvやjsonで外出しにして簡単に入れ替える事ができるように設計されているので作業自体は単純だ。

このガイドでHadesと書いたら「ローカルファイルを閲覧」で出てくるゲームフォルダのことになる。
なお途中でgawkやWindowsバッチファイルなどが出てくるがインストール手順や使用方法は特に解説しない。
必要なら調べてください。バックアップも適宜取っておくと安心できる。

また機械翻訳についても説明しない。
お好みのツールを使えばいいし、もちろん英語がばっちり分かるという人なら自分で翻訳してもいい。文庫本6冊ぐらいのテキスト量があるが。
誰かしてくれないかな。

简体中文ファイルの代わりに日本語ファイルを組み込む

このゲームには日本語用の言語ファイルが用意されてはいる(ほんのちょっとだけ翻訳してある)のだが、どうやら内部で使用できないように処理をつぶされているようである。
セーブデータを書き換えて日本語を使うようにしても英語に戻ってしまう。
なのでまず同じ漢字を使っている简体中文ファイルを日本語ファイルとして扱うことにする。

まずは简体中文ファイルに日本語ファイルを上書きするところから始める。もちろんゲームの設定でも言語を简体中文にしておく。

  1. HadesContentSubtitlesjaの中身をHadesContentSubtitleszh-CNにコピーして上書きする。
  2. HadesContentGameTextjaの中身をHadesContentGameTextzh-CNにコピーして上書きする。但しコピー前にファイル名の「.ja.sjson」を「.zh-CN.sjson」に置換しておく。またファイル内の「lang = “ja”」も「lang = “zh-CN”」に置換しておく。
  3. HadesContentWinFontszh-CNの中身を一旦削除してからHadesContentWinFontsjaの中身をコピーする。
  4. ゲームを起動して会話文や字幕が英語になっていれば問題なし。

但しこのゲームの日本語フォントには含まれていない文字が多いため一部「*」で表示されてしまう。
しかもこのフォントファイルはxnbファイルだが開発者が独自にバージョンアップして圧縮方法が変更されているためunpackして修正もできない。
zh-CNDefault.xnbには漢字の多くが含まれていて、jaDefault.xnbにはひらがな・カタカナの多くが含まれているのでマージすれば大体の文字が表示できそうだが今のところ不可能。お手上げ。
「*」のところは前後の文脈で判断するしかない。

以下はSupergiant Games公式Discordでの開発者の発言である。

Originally posted by Dexter:

Dexter 2020/02/12
@Karabibik You’re correct about why some XNB extractors don’t work for Pyre/Hades. We bumped up the version number and changed how the files are encoded (mainly an optimization thing). They’re not really XNA .xnb files anymore
For these to be usable we’d need to release some of our tooling, and I’m not sure we’re able to support that right now

字幕ファイルから日本語ファイルを作成する

まず会話ウィンドウを開かずに画面下に表示される字幕から翻訳する。

gawkを使ってHadesContentSubtitleszh-CNのcsvからテキストを切り出して英語ファイルを作り、それを翻訳してできた日本語ファイルを元のCSVにマージするという手順だ。

まず元のCSVの項目内に改行が含まれていると処理の都合上うまく動かないのでこれを半角スペースにでも置換する。
以下の4か所しかないしこの改行コードはどう見てもゴミなんじゃないかなという書き方をしているので置換しても問題ないと思う。

  1. HadesField.csvのHadesField_0506
  2. Intercom.csvのIntercom_1154
  3. ZagreusField.csvのZagreusField_4571
  4. ZagreusHome.csvのZagreusHome_2722

また元のcsvに日本語が含まれておりgawkで取り扱うと文字化けするのでSJISに変換する。

次に以下のファイルをHadesContentSubtitleszh-CNに作成する。

SubtitlesSeparate.awk

function delete_quotes(str) { return substr(str, 2, length(str) – 2) } BEGIN { FPAT = “([^,]+)|(“[^”]+”)” } NR == 1 { id_index = -1 line_index = -1 id_count = 0 for (i = 1; i <= NF; i++) { if ($(i) == “”ID””) { id_count++ if (id_count = 3) { id_index = i } } else if ($(i) == “”Line””) { line_index = i } if (id_index > 0 && line_index > 0) { break; } } } NR > 1 { id_text = delete_quotes($(id_index)) line_text = delete_quotes($(line_index)) if (id_text != “”) { print id_text “t” line_text } } END { }

SubtitlesSeparate.bat

mkdir ja_tsv gawk -f SubtitlesSeparate.awk Achilles.csv > ja_tsvAchilles_ja.tsv gawk -f SubtitlesSeparate.awk Alecto.csv > ja_tsvAlecto_ja.tsv gawk -f SubtitlesSeparate.awk Aphrodite.csv > ja_tsvAphrodite_ja.tsv gawk -f SubtitlesSeparate.awk Ares.csv > ja_tsvAres_ja.tsv gawk -f SubtitlesSeparate.awk Artemis.csv > ja_tsvArtemis_ja.tsv gawk -f SubtitlesSeparate.awk Athena.csv > ja_tsvAthena_ja.tsv gawk -f SubtitlesSeparate.awk Chaos.csv > ja_tsvChaos_ja.tsv gawk -f SubtitlesSeparate.awk Demeter.csv > ja_tsvDemeter_ja.tsv gawk -f SubtitlesSeparate.awk Dionysus.csv > ja_tsvDionysus_ja.tsv gawk -f SubtitlesSeparate.awk Dusa.csv > ja_tsvDusa_ja.tsv gawk -f SubtitlesSeparate.awk Eurydice.csv > ja_tsvEurydice_ja.tsv gawk -f SubtitlesSeparate.awk ExtraLines.csv > ja_tsvExtraLines_ja.tsv gawk -f SubtitlesSeparate.awk Hades.csv > ja_tsvHades_ja.tsv gawk -f SubtitlesSeparate.awk HadesField.csv > ja_tsvHadesField_ja.tsv gawk -f SubtitlesSeparate.awk Hypnos.csv > ja_tsvHypnos_ja.tsv gawk -f SubtitlesSeparate.awk Intercom.csv > ja_tsvIntercom_ja.tsv gawk -f SubtitlesSeparate.awk MegaeraField.csv > ja_tsvMegaeraField_ja.tsv gawk -f SubtitlesSeparate.awk MegaeraHome.csv > ja_tsvMegaeraHome_ja.tsv gawk -f SubtitlesSeparate.awk Minotaur.csv > ja_tsvMinotaur_ja.tsv gawk -f SubtitlesSeparate.awk Nyx.csv > ja_tsvNyx_ja.tsv gawk -f SubtitlesSeparate.awk Orpheus.csv > ja_tsvOrpheus_ja.tsv gawk -f SubtitlesSeparate.awk Patroclus.csv > ja_tsvPatroclus_ja.tsv gawk -f SubtitlesSeparate.awk Persephone.csv > ja_tsvPersephone_ja.tsv gawk -f SubtitlesSeparate.awk Poseidon.csv > ja_tsvPoseidon_ja.tsv gawk -f SubtitlesSeparate.awk Scratch.csv > ja_tsvScratch_ja.tsv gawk -f SubtitlesSeparate.awk Sisyphus.csv > ja_tsvSisyphus_ja.tsv gawk -f SubtitlesSeparate.awk Skelly.csv > ja_tsvSkelly_ja.tsv gawk -f SubtitlesSeparate.awk Storyteller.csv > ja_tsvStoryteller_ja.tsv gawk -f SubtitlesSeparate.awk Thanatos.csv > ja_tsvThanatos_ja.tsv gawk -f SubtitlesSeparate.awk ThanatosField.csv > ja_tsvThanatosField_ja.tsv gawk -f SubtitlesSeparate.awk Theseus.csv > ja_tsvTheseus_ja.tsv gawk -f SubtitlesSeparate.awk Tisiphone.csv > ja_tsvTisiphone_ja.tsv gawk -f SubtitlesSeparate.awk ZagreusField.csv > ja_tsvZagreusField_ja.tsv gawk -f SubtitlesSeparate.awk ZagreusHome.csv > ja_tsvZagreusHome_ja.tsv gawk -f SubtitlesSeparate.awk ZagreusScratch.csv > ja_tsvZagreusScratch_ja.tsv gawk -f SubtitlesSeparate.awk Zeus.csv > ja_tsvZeus_ja.tsv

SubtitlesSeparate.batを実行するとja_tsvにテキストを切り出した英語ファイルの_ja.tsvが作成されるので、これをどうにかして翻訳する。
IDと英文をタブ区切りで組み合わせて出力するようにしておいたので、スプレッドシートで管理もしやすいはずだ。
なお翻訳文に「”」が含まれているとうまく読み取れないので「”」は「’」にでも置換する必要がある。
翻訳後の_ja.tsvは改行コードがLF・文字コードがBOM無しのUTF-8で保存しておく。

日本語字幕ファイルを作成する

以下のファイルをHadesContentSubtitleszh-CNに作成する。

SubtitlesMerge.awk

function delete_quotes(str) { return substr(str, 2, length(str) – 2) } BEGIN { FPAT = “([^,]+)|(“[^”]+”)” OFS = “,” id_index = -1 line_index = -1 } F == 0 { split($0, cols, “t”) data[cols[1]] = cols[2] next } F > 0 { if (id_index < 0) { id_index = 0 line_index = 0 id_count = 0 for (i = 1; i <= NF; i++) { if ($(i) == “”ID””) { id_count++ if (id_count = 3) { id_index = i } } else if ($(i) == “”Line””) { line_index = i } if (id_index > 0 && line_index > 0) { break; } } } else { id_text = delete_quotes($(id_index)) line_text = data[id_text] if (line_text != “”) { $(line_index) = “”” line_text “”” } } print $0 next } END { }

SubtitlesMerge.bat

mkdir ja_csv gawk -f SubtitlesMerge.awk F=0 ja_tsvAchilles_ja.tsv F=1 Achilles.csv > ja_csvAchilles.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvAlecto_ja.tsv F=1 Alecto.csv > ja_csvAlecto.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvAphrodite_ja.tsv F=1 Aphrodite.csv > ja_csvAphrodite.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvAres_ja.tsv F=1 Ares.csv > ja_csvAres.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvArtemis_ja.tsv F=1 Artemis.csv > ja_csvArtemis.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvAthena_ja.tsv F=1 Athena.csv > ja_csvAthena.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvChaos_ja.tsv F=1 Chaos.csv > ja_csvChaos.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvDemeter_ja.tsv F=1 Demeter.csv > ja_csvDemeter.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvDionysus_ja.tsv F=1 Dionysus.csv > ja_csvDionysus.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvDusa_ja.tsv F=1 Dusa.csv > ja_csvDusa.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvEurydice_ja.tsv F=1 Eurydice.csv > ja_csvEurydice.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvExtraLines_ja.tsv F=1 ExtraLines.csv > ja_csvExtraLines.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvHades_ja.tsv F=1 Hades.csv > ja_csvHades.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvHadesField_ja.tsv F=1 HadesField.csv > ja_csvHadesField.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvHypnos_ja.tsv F=1 Hypnos.csv > ja_csvHypnos.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvIntercom_ja.tsv F=1 Intercom.csv > ja_csvIntercom.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvMegaeraField_ja.tsv F=1 MegaeraField.csv > ja_csvMegaeraField.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvMegaeraHome_ja.tsv F=1 MegaeraHome.csv > ja_csvMegaeraHome.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvMinotaur_ja.tsv F=1 Minotaur.csv > ja_csvMinotaur.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvNyx_ja.tsv F=1 Nyx.csv > ja_csvNyx.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvOrpheus_ja.tsv F=1 Orpheus.csv > ja_csvOrpheus.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvPatroclus_ja.tsv F=1 Patroclus.csv > ja_csvPatroclus.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvPersephone_ja.tsv F=1 Persephone.csv > ja_csvPersephone.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvPoseidon_ja.tsv F=1 Poseidon.csv > ja_csvPoseidon.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvScratch_ja.tsv F=1 Scratch.csv > ja_csvScratch.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvSisyphus_ja.tsv F=1 Sisyphus.csv > ja_csvSisyphus.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvSkelly_ja.tsv F=1 Skelly.csv > ja_csvSkelly.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvStoryteller_ja.tsv F=1 Storyteller.csv > ja_csvStoryteller.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvThanatos_ja.tsv F=1 Thanatos.csv > ja_csvThanatos.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvThanatosField_ja.tsv F=1 ThanatosField.csv > ja_csvThanatosField.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvTheseus_ja.tsv F=1 Theseus.csv > ja_csvTheseus.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvTisiphone_ja.tsv F=1 Tisiphone.csv > ja_csvTisiphone.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvZagreusField_ja.tsv F=1 ZagreusField.csv > ja_csvZagreusField.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvZagreusHome_ja.tsv F=1 ZagreusHome.csv > ja_csvZagreusHome.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvZagreusScratch_ja.tsv F=1 ZagreusScratch.csv > ja_csvZagreusScratch.csv gawk -f SubtitlesMerge.awk F=0 ja_tsvZeus_ja.tsv F=1 Zeus.csv > ja_csvZeus.csv

SubtitlesMerge.batを実行するとja_csvに日本語字幕ファイルが作成されるので、改行コードがLF・文字コードがBOM無しのUTF-8に変換してからHadesContentSubtitleszh-CNに上書きする。

但しこのやり方だと同じIDのメッセージが最後のものに統一されてしまう。
同じIDを付けているのは開発者のミスだろうし悪影響が出ていないから気付いていないと思われるので多分問題ない。

ゲームを起動して字幕が日本語になっていれば成功だ。
作成したファイルはもう不要なので削除してもいい。

テキストファイルから日本語ファイルを作成する

次に会話文などのテキストを翻訳する。

字幕と同じくgawkを使ってHadesContentGameTextzh-CNのsjsonからテキストを切り出して英語ファイルを作り、それを翻訳にかけてできた日本語ファイルを元のsjsonにマージするという手順だ。

まず元のsjsonに日本語が含まれておりgawkで取り扱うと文字化けするのでSJISに変換する。

次に以下のファイルをHadesContentSubtitleszh-CNに作成する。
なおここではヘルプファイルなどが適当な翻訳では用語などが混乱して分からなくなるだろうという判断で対象から除外している。
必要ならbatファイルに追記すればいい。

TextSeparate.awk

function delete_quotes(str) { return substr(str, 2, length(str) – 2) } function delete_tags(str) { gsub(/{#[^}]*}/, “”, str) return str } BEGIN { ID_ATTR = “Id = ” DISPLAY_NAME_ATTR = “DisplayName = ” ITEM_END = “}$” id = “” displayName = “” } { if (match($0, ITEM_END)) { if (id != “”) { print id “t” displayName } id = “” displayName = “” } else { i = index($0, ID_ATTR) if (i > 0) { id = substr($0, i + length(ID_ATTR)) id = delete_quotes(id) } else { i = index($0, DISPLAY_NAME_ATTR) if (i > 0) { displayName = substr($0, i + length(DISPLAY_NAME_ATTR)) if (TAG != 1) { displayName = delete_tags(displayName) } displayName = delete_quotes(displayName) } } } } END { }

TextSeparate.bat

mkdir ja_tsv gawk -f TextSeparate.awk TAG=1 CodexText.zh-CN.sjson > ja_tsvCodexText_ja.tsv gawk -f TextSeparate.awk TAG=1 _DeathLoopData.zh-CN.sjson > ja_tsv_DeathLoopData_ja.tsv gawk -f TextSeparate.awk TAG=1 _EncounterData.zh-CN.sjson > ja_tsv_EncounterData_ja.tsv gawk -f TextSeparate.awk TAG=1 _EnemyData.zh-CN.sjson > ja_tsv_EnemyData_ja.tsv gawk -f TextSeparate.awk TAG=1 _LootData.zh-CN.sjson > ja_tsv_LootData_ja.tsv gawk -f TextSeparate.awk TAG=1 _NPCData.zh-CN.sjson > ja_tsv_NPCData_ja.tsv gawk -f TextSeparate.awk TAG=1 _RoomData.zh-CN.sjson > ja_tsv_RoomData_ja.tsv gawk -f TextSeparate.awk TAG=1 _RoomDataAsphodel.zh-CN.sjson > ja_tsv_RoomDataAsphodel_ja.tsv gawk -f TextSeparate.awk TAG=1 _RoomDataElysium.zh-CN.sjson > ja_tsv_RoomDataElysium_ja.tsv gawk -f TextSeparate.awk TAG=1 _RoomDataSecrets.zh-CN.sjson > ja_tsv_RoomDataSecrets_ja.tsv gawk -f TextSeparate.awk TAG=1 _RoomDataStyx.zh-CN.sjson > ja_tsv_RoomDataStyx_ja.tsv gawk -f TextSeparate.awk TAG=1 _RoomDataSurface.zh-CN.sjson > ja_tsv_RoomDataSurface_ja.tsv gawk -f TextSeparate.awk TAG=1 _RoomDataTartarus.zh-CN.sjson > ja_tsv_RoomDataTartarus_ja.tsv

TextSeparate.batを実行するとja_tsvにテキストを切り出した英語ファイルの_ja.tsvが作成されるので、これをどうにかして翻訳する。
なお翻訳文に「”」が含まれているとうまく読み取れないので「”」は「’」にでも置換する必要がある。
{#DialogueItalicFormat}などのタグが混じっていて機械翻訳がやりづらいが何とかする。
もしタグが邪魔で翻訳できないという場合はTextSeparate.batの「TAG=1」を「TAG=0」に置換すればタグが削除された_ja.tsvが作成される。
翻訳後の_ja.tsvは改行コードがCRLF・文字コードがSJISで保存しておく。

日本語テキストファイルを作成する

以下のファイルをHadesContentGameTextzh-CNに作成する。

TextMerge.awk

function delete_quotes(str) { return substr(str, 2, length(str) – 2) } BEGIN { ID_ATTR = “Id = ” DISPLAY_NAME_ATTR = “DisplayName = ” id = “” } F == 0 { split($0, cols, “t”) data[cols[1]] = cols[2] next } F > 0 { i = index($0, DISPLAY_NAME_ATTR) if (i > 0) { print substr($0, 1, i + length(DISPLAY_NAME_ATTR) – 1) “”” data[id] “”” } else { i = index($0, ID_ATTR) if (i > 0) { id = substr($0, i + length(ID_ATTR)) id = delete_quotes(id) } print $0 } next } END { }

TextMerge.bat

mkdir ja_sjson gawk -f TextMerge.awk F=0 ja_tsvCodexText_ja.tsv F=1 CodexText.zh-CN.sjson > ja_sjsonCodexText.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_DeathLoopData_ja.tsv F=1 _DeathLoopData.zh-CN.sjson > ja_sjson_DeathLoopData.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_EncounterData_ja.tsv F=1 _EncounterData.zh-CN.sjson > ja_sjson_EncounterData.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_EnemyData_ja.tsv F=1 _EnemyData.zh-CN.sjson > ja_sjson_EnemyData.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_LootData_ja.tsv F=1 _LootData.zh-CN.sjson > ja_sjson_LootData.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_NPCData_ja.tsv F=1 _NPCData.zh-CN.sjson > ja_sjson_NPCData.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_RoomData_ja.tsv F=1 _RoomData.zh-CN.sjson > ja_sjson_RoomData.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_RoomDataAsphodel_ja.tsv F=1 _RoomDataAsphodel.zh-CN.sjson > ja_sjson_RoomDataAsphodel.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_RoomDataElysium_ja.tsv F=1 _RoomDataElysium.zh-CN.sjson > ja_sjson_RoomDataElysium.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_RoomDataSecrets_ja.tsv F=1 _RoomDataSecrets.zh-CN.sjson > ja_sjson_RoomDataSecrets.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_RoomDataStyx_ja.tsv F=1 _RoomDataStyx.zh-CN.sjson > ja_sjson_RoomDataStyx.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_RoomDataSurface_ja.tsv F=1 _RoomDataSurface.zh-CN.sjson > ja_sjson_RoomDataSurface.zh-CN.sjson gawk -f TextMerge.awk F=0 ja_tsv_RoomDataTartarus_ja.tsv F=1 _RoomDataTartarus.zh-CN.sjson > ja_sjson_RoomDataTartarus.zh-CN.sjson

TextMerge.batを実行するとja_sjsonに日本語テキストファイルが作成されるので、改行コードがCRLF・文字コードがBOM無しのUTF-8に変換してからHadesContentGameTextzh-CNに上書きする。

これもやっぱり同じIDのメッセージが最後のものに統一されてしまう。

ゲームを起動して会話文が日本語になっていれば成功だ。
作成したファイルはもう不要なので削除してもいい。

終わりに

このように日本語が表示される。

字幕

会話文

文字化けして読めない部分はこんな感じ。
せめてひらがなとカタカナだけでも完備してくれていれば…。

フォントに存在しない文字

以下のひらがな・カタカナがHadesContentWinFontsjaDefault.xnbに存在しない。
なお一般的でない文字は省いてある。

ひらがな
カタカナ

フォントに存在しないひらがな・カタカナを無理矢理表示する

読めないよりはマシなのでフォントに存在しないひらがな・カタカナを存在する同じ発音のカタカナ・ひらがなに置換する。
それでもまだ文字化けする文字が残るためローマ字的な物に置換する。

以下がその置換表である。

ひらがな
カタカナ
置換後
u
e
o
DI
PI
wa
WI
WE
VU

翻訳後のja_tsvと同じフォルダに以下のファイルを作成してInvalidKanaReplace.batを実行するとja_tsvのフォントに存在しないひらがな・カタカナを無理矢理表示できる文字に置換したファイルがfixed_kana_ja_tsvに作成される。
この置換前の_ja.tsvは文字コードがSJISでなければならない。

確認して問題なかったらfixed_kana_ja_tsvをja_tsvの代わりに使ってMerge.batで日本語ファイルを作成すればいい。

InvalidKanaReplace.awk

BEGIN { } { gsub(/ぁ/, “ァ”, $0) gsub(/ぃ/, “ィ”, $0) gsub(/お/, “オ”, $0) gsub(/ざ/, “ザ”, $0) gsub(/ぱ/, “パ”, $0) gsub(/ぷ/, “プ”, $0) gsub(/ぺ/, “ペ”, $0) gsub(/ぽ/, “ポ”, $0) gsub(/ゅ/, “ュ”, $0) gsub(/ゲ/, “げ”, $0) gsub(/コ/, “こ”, $0) gsub(/ゴ/, “ご”, $0) gsub(/サ/, “さ”, $0) gsub(/ジ/, “じ”, $0) gsub(/ズ/, “ず”, $0) gsub(/ゼ/, “ぜ”, $0) gsub(/ソ/, “そ”, $0) gsub(/ゾ/, “ぞ”, $0) gsub(/ダ/, “だ”, $0) gsub(/ツ/, “つ”, $0) gsub(/ヅ/, “づ”, $0) gsub(/ヌ/, “ぬ”, $0) gsub(/ビ/, “び”, $0) gsub(/ヘ/, “へ”, $0) gsub(/ホ/, “ほ”, $0) gsub(/ボ/, “ぼ”, $0) gsub(/マ/, “ま”, $0) gsub(/ミ/, “み”, $0) gsub(/ム/, “む”, $0) gsub(/ヤ/, “や”, $0) gsub(/ユ/, “ゆ”, $0) gsub(/ヨ/, “よ”, $0) gsub(/ワ/, “わ”, $0) gsub(/ヲ/, “を”, $0) gsub(/[ぅゥ]/, “u”, $0) gsub(/[ぇェ]/, “e”, $0) gsub(/[ぉォ]/, “o”, $0) gsub(/[ぢヂ]/, “DI”, $0) gsub(/[ぴピ]/, “PI”, $0) gsub(/[ゎヮ]/, “wa”, $0) gsub(/[ゐヰ]/, “WI”, $0) gsub(/[ゑヱ]/, “WE”, $0) gsub(/ヴ/, “VU”, $0) gsub(/・/, “-“, $0) print $0 } END { }

InvalidKanaReplace.bat

mkdir fixed_kana_ja_tsv for %%i in (ja_tsv*.tsv) do ( gawk -f InvalidKanaReplace.awk %%i > fixed_kana_ja_tsv%%~ni%%~xi )

修正前後を比較するとこんな感じ。
読み易くはなっている。

修正前

修正後

英文を付加する

文字化けしている文字が多いと内容の推測もできないので英文を付加する。

翻訳前のen_tsvと翻訳後のja_tsvを用意し、同じフォルダに以下のファイルを作成してenglishAdd.batを実行するとja_tsvに英文を付加したファイルがadded_english_ja_tsvに作成される。
この英文付加前の_ja.tsvは文字コードがSJISでなければならない。

確認して問題なかったらadded_english_ja_tsvをja_tsvの代わりに使ってMerge.batで日本語ファイルを作成すればいい。

englishAdd.awk

BEGIN { FS = “t” OFS = “t” } F == 0 { if ($2 != “” && match($2, /[ぁ-ー]/) == 0) { data[$1] = $2 } next } F > 0 { id_text = $1 add_text = data[id_text] if (add_text != “”) { $2 = $2 “(” add_text “)” } print $0 next } END { }

englishAdd.bat

mkdir added_english_ja_tsv for %%i in (ja_tsv*.tsv) do ( gawk -f englishAdd.awk F=0 en_tsv%%~ni%%~xi F=1 %%i > added_english_ja_tsv%%~ni%%~xi )

英文を付加するとこんな感じに表示される。

枠からはみ出してすごく読みにくい。
そのためフォントサイズを変更することにする。
スクリプトの該当箇所を以下のように書き換える。

HadesContentScriptsNarrative.luaのDisplayTextLine( screen, source, line, parentLine )

CreateTextBox(MergeTables({ Id = anchorId, Text = text, Width = line.TextWidth or 833, OffsetX = line.TextOffsetX or (-395 + narrationTextOffsetX), OffsetY = line.TextOffsetY or (50 + narrationTextOffsetY), Font = “AlegreyaSansExtraBold”, –forAddEnglish FontSize = line.FontSize or 27, FontSize = 16, Justification = “LEFT”, VerticalJustification = “CENTER”, Color = line.TextColor or textColor, LineSpacingBottom = 4, ShadowColor = textShadowColor, ShadowBlur = 0, ShadowOffsetX = 0, ShadowOffsetY = 4, –[[ DataProperties = { CharacterFadeTime = 0.0025, CharacterFadeInterval = 0.0025, CommaFadeInterval = 0.0025, PeriodFadeInterval = 0.0025, RepeatPeriodFadeInterval = 0.0025, QuestionFadeInterval = 0.0025, ExclamationFadeInterval = 0.0025, }, ]]– }, LocalizationData.Narrative.DialogueText ))

HadesContentScriptsCodexScripts.luaのCodexOpenEntry( screen, button )

CreateTextBox(MergeTables({ Id = screen.Components.EntryText.Id, Text = text, Color = Color.CodexText, Font = “AlegreyaSansRegular”, –forAddEnglish FontSize = 20, FontSize = 16, LuaKey = “TempTextData”, LuaValue = { Amount = threshold, Name = button.EntryName}, ShadowBlur = 0, ShadowColor = {0,0,0,1}, ShadowOffset = {0, 2}, Justification = “Left”, VerticalJustification = “Top”, Width = 820, LineSpacingBottom = 10, }, LocalizationData.CodexScripts.EntryText ))

修正後


ここまでやってようやく文章の意味が分かるようになった。
英語の勉強にもなりそうだ。

SteamSolo.com