好々爺の電脳遊戯録

PCゲームに関してプレイ日記(ログ)やmod、周辺ツールのことなど書いていこうかな、と。

SkyrimSE英語版のメニューテキスト(の記述ファイル)を日本語化するための補助スクリプト

SkyrimSEの日本語化を行う上で、translate_hoge.txt をマージするためのPowerShellスクリプト

なお、Windows10 CreaterUpdate(64bit)環境でしか実行していない。 Windows7や8の環境だと、PowerShell をインストールするところから必要かもしれない。

用意するモノ:

  • SKyrimSE日本語版(v1.4.4) のtranslate_japanese.txt
  • SkyrimSE英語版(1.5.3)のtranslate_english.txt
    それぞれ、 Skyrim - Patch.bsaを展開して用意する。
  • 下に張り付けたPowerShellスクリプト

使い方:

用意したファイルを同一フォルダにおいて、PowerShellスクリプトを実行する。
ちゃんと実行されると、New_translate_english.txtができる。
このファイルの中身をチェックして、英語のままで残った個所で気にある個所を和訳すればよい。 (”Creation Club”関連で課金周りのメッセージやSteam等の認証周りが残るぐらい)

スクリプトのやっていること:

  • $キーワードに対して、日本語版にあるモノはそのままコピー。
  • 新規キーワードに対応する文字列(英文)が、既存キーワードと同じ内容であれば、新規キーワードに同じ訳文をコピー。
  • 誤訳である``$Mauls=大鎚```に対しては適切と思われる和訳へ修正。

差分を自分で見ながら作業したい人へ:

traslate_english.txt と translate_japanese.txt をWinDiffなどで差分をとり、公式でも変更していない個所(単語など)を確認しながら作業するのがよいと思う。

[2017/10/06 追記]
文字コードが確認できるテキストエディタで作業すること。
その際、Unicode(UTF16LE(BOM付))で保存すること。
なお、スクリプトで作成されたファイルの文字コードは、Unicode(UTF16LE(BOM付))になる。
そのため、中身の加工を行わず、ファイル名変更を行うだけなら意識しないでよい。

作業用スクリプト

スクリプト: translate_hoge のマージ用

##
# Filename: SkyrimSE_transLang.ps1
#
# ** UTF-16LE(BOM付き)で編集、保存すること **
#
# コマンドプロンプトで、以下のように実行する
# powershell -NoProfile -ExecutionPolicy Unrestricted .\SkyrimSE_transLang.ps1
#
###
## 入力ファイル名
$File_TransJapanese = "translate_japanese.txt"
$File_TransEnglish = "translate_english.txt"

## 出力ファイル名
$File_NewTransJapanese = "New_translate_english.txt"

## 誤訳修正
# - $Mauls は、名詞ではなく動詞。ウェアウルフ状態でのアタックモーション発生数
# - 誤訳修正しない場合は以下の一行を削除する。
$strMauls="ウェアウルフ状態での殺害数"

###
# 以下、実行ルーチン
#
# 日本語版Fileから全文読み込む
$Lines_TransJapanese = @(Get-Content $File_TransJapanese)

# 日本語版キーワード対照表を作る (ソート済みリスト)
$Dict_Japanese = New-Object 'System.Collections.Generic.SortedDictionary[string, string]'

foreach($line in $Lines_TransJapanese)
{
  $tmpStr = $line.Split("`t")

  # 英語パッチでのキーワード変更の反映
  $jpKeyword = '$LoginError_BNET_CDP_AUTHENTICATION_FAILED'
  $engKeyword = '$LoginError_BNET_CDP_AUTHENTICATION_FAILED_OR_MISSING'
  if ($tmpStr[0].Equals($jpKeyword))
  {
    $tmpStr[0] = $engKeyword
  }

  # 日本語対照表にキーワードと用語を追加する
  $Dict_Japanese.Add($tmpStr[0], $tmpStr[1])
}

# 英語版Fileから全文読み込む
$Lines_TransEnglish = @(Get-Content $File_TransEnglish)

# 作業用対照表と英語版対照表を作る (ソート済みリスト)
$Dict_NonJapanese = New-Object 'System.Collections.Generic.SortedDictionary[string, string]'
$Dict_English = New-Object 'System.Collections.Generic.SortedDictionary[string, string]'

foreach($line in $Lines_TransEnglish)
{
  $tmpStr = $line.Split("`t")
  # 日本語対照表にキーワードが存在しない場合
  if( !($Dict_Japanese.ContainsKey($tmpStr[0])) )
  {
    # 作業用対照表にキーワードと用語を追加する
    $Dict_NonJapanese.Add($tmpStr[0], $tmpStr[1])
    continue
  }

  # 英語対照表にキーワードと用語を追加する
  $Dict_English.Add($tmpStr[0], $tmpStr[1])
}

# 訳文が使いまわせるものを探して適用する
foreach($key in $Dict_NonJapanese.Keys)
{
  $tmpStr = $Dict_NonJapanese[$key]

  # 作業用対照表の用語(英語)に対応するキーワードを英語対照表から探す
  foreach($item in $Dict_English.GetEnumerator())
  {
    if ($item.Value.Equals($tmpStr))
    {
      # 見つけたキーワードが日本語対照表にあったら訳語を取り出す
      if ($Dict_Japanese.ContainsKey($item.Key))
      {
        $tmpStr = $Dict_Japanese[$item.Key]
        break
      }
    }
  }
  # 日本語対照表にキーワードと用語を加える
  # (訳語が取り出せても取り出せなくても加えていく)
  $Dict_Japanese.Add($key, $tmpStr)
}

# 誤訳修正
if (Test-Path Variable:strMauls)
{
  $Dict_Japanese['$Mauls']=$strMauls
}

# 出力用の対照表を作る
$Lines_NewTransJapanese = @()

foreach($item in $Dict_Japanese.GetEnumerator())
{
  $line = $item.Key + "`t" + $item.Value
  $Lines_NewTransJapanese += $line
}

# 変換した内容を出力する
Out-File -InputObject $Lines_NewTransJapanese -FilePath $File_NewTransJapanese