●雑記帳>●日本語化を楽にする。
目次

●日本語化作業を楽にする。

免責

以下の内容を行って発生した損害など、私は一切責任を負いません。憶測で書かれている箇所もあるので盲目的に信用せず、自己の責任に於いて使用・実行して下さい。


日本語化作業をやっていて、一つ苦になる事がある。それは、対象ソフトのバージョンアップである。正直な話、バージョンが上がらなければ楽であるが、そういう訳にはいかないのでとりあえず対応する。ところが、Resource Hacker(以下ResHacker) には置換機能が無いので、エディタなどにコピー&ペーストなどをするがダイアログなどが多いと、その作業をするだけで萎えてしまう。

そこで登場するのが BRCC32.exe(以下BRCC) と ResHacker の「スクリプト機能」である。この BRCC は、ResHacker や eXeScope など(他のツールでも出来るかも)で抽出した RC ファイルを、それらのツールで取り込むこと事が出来るよう、RES ファイルに変換する為のソフトウェアです。次の項で手順等を説明する。

以下は私が日本語化(バージョンアップ)を行う際の大まかな手順です。

■1a. 必要な物

ソフトウェアを日本語化するには以下の物が必要です。

■2a. 抽出

まずは、翻訳や旧バージョンからの比較をするために RC ファイルに書き出さなければいけません。そこで、ResHacker のスクリプト機能でファイルを抽出します。以下のテキストBATファイルにして保存します。

@ECHO OFF
reshacker.exe -extract FILENAME.exe, Menu.rc, Menu,,
reshacker.exe -extract FILENAME.exe, Dialog.rc, Dialog,,
reshacker.exe -extract FILENAME.exe, String.rc, StringTable,,

抽出するには、他にもスクリプトを用いて行う方法もあります。以下を、VBSファイルとして保存します。「C:\Program Files\ResHacker\Reshacker.exe」を、ご自身が ResHackerを導入した場所に指定する必要があります。そして、抽出したい実行ファイルをDnDします。そすうれば Menu.rc と Dialog.rc と String.rc ファイルがおそらく、DnDしたファイルがある場所に作成されます(スクリプトファイルの編集後は、ルートドライブに作成されるっぽい)。もっと綺麗なスクリプトの書き方があるかもしれませんが、私の腕ではこれが限界です。

''【日本語化用にRCファイルを作成】
Dim WshShell, fso, DnDfile
Set DnDfile = WScript.Arguments
Set WshShell = WScript.CreateObject ("WSCript.shell")
Set fso = CreateObject("Scripting.FileSystemObject")

FileExt = fso.GetExtensionName(DnDfile(I))
''DLL/EXE/LNKかチェック
If LCase(FileExt) = "exe" OR LCase(FileExt) = "dll" OR LCase(FileExt) = "lnk" Then
	''ResHackerのパスとコマンドラインを代入
	RH = "C:\Programs\ResHacker\ResHacker.exe -extract " & DnDfile(I)
	RHD = RH & ", Dialog.rc, Dialog,,"
	RHM = RH & ", Menu.rc, Menu,,"
	RHS = RH & ", String.rc, StringTable,,"

	Return = WshShell.run (RHD,1,TRUE)
	Return = WshShell.run (RHM,1,TRUE)
	WshShell.run RHS
Else
	Wscript.Echo "exeファイルかdllファイル、もしくはそれがリンク先になっているファイルをDnDしてください"
	Wscript.Quit
End If

そして、エディタで開いて置換と編集をします。

以下のスクリプトは、次期バージョンアップに備えて RC ファイルを保存するためのスクリプトです。

''比較用ファイルの作成
Dim WshShell , DnDfile , fso , regEx
Set DnDfile = WScript.Arguments
Set WshShell = WScript.CreateObject ("WSCript.shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Set regEx = New RegExp

fv = fso.GetFileVersion(DnDfile(I))
regEx.Pattern = "コピー ~ "
regEx.IgnoreCase = TRUE
regEx.Global = TRUE
MatchesCopy = regEx.Test(DnDfile(I))
If MatchesCopy = TRUE then
	fn = fv & "_en.rc" ''「コピー ~ 」が含まれると、オリジナルファイルとして"_en"にする
	Else
	fn = fv & "_jp.rc"
End If

RH = "C:\Programs\ResHacker\ResHacker.exe -extract " & DnDfile(I)
RHD = RH & ", Dialog_" & fn & ", Dialog,,"
RHM = RH & ", Menu_" & fn & ", Menu,,"
RHS = RH & ", String_" & fn & ", StringTable,,"
Return = WshShell.run (RHD,1,TRUE)
Return = WshShell.run (RHM,1,TRUE)
WshShell.run RHS

直接 GUI からも抽出が可能です。 ResHackerのGUIから直接、Menuを保存する

■3a. 比較

比較を行うと、旧バージョンからの変更点が一目瞭然です。今回は、丁度更新されていた Quick’n Easy FTPServerを使って説明します。なお、Sakura Editorを使う場合には「タイプ別設定」で「カラー」タブの「色指定」で、「DIFF差分表示」の「追加」、「変更」、「削除」で色を指定しなければいけません。

まずは、新バージョンから抽出した RCファイルを開き、次に旧バージョンの物を開きます。そして、新しいバージョンのファイルのタブをアクティブにしてメニューの検索、DIFF差分表示を選択します。

ダイアログが開かれたら、「他の編集中のファイル」にチェックを入れて旧バージョンのファイルを選択します。そして、右下にある「編集中ファイルが...」では「新ファイル」にチェックします。左下にあるオプションのチェックボックスは、全て無効にして置いた方が良いでしょう。

そうしたら、比較して変更などがあった箇所にはマークがつきます。
文字列が追加されたので、行番号の箇所が青くなります。

なお、変更が無い場合は差分が無い旨のダイアログが表示されます。

■4a. 変換

「抽出」の項で保存したRCファイルを、BRCCを使ってRESファイルに変換します。以下のテキストをBATファイルにして保存します。

@ECHO OFF
REM Delphi以外用。RCをRESに変換
brcc32.exe Dialog.rc
brcc32.exe Menu.rc
brcc32.exe String.rc

■5a.組み込む

「変換」の項で作成したRESファイルを、ResHacker のスクリプト機能を使って組み込みます。以下のテキストをBATファイルにして保存します。

REM ResHackerスクリプト用
reshacker.exe -script FILE.txt

FILE.txtに以下の内容を保存します。

[FILENAMES]
Exe=ORIGINAL.exe
SaveAs=JAPANESE.exe
Log=

[COMMANDS]
-addoverwrite Menu.res, Menu,,
-addoverwrite String.res, StringTable,,
-addoverwrite Dialog.res, Dialog,,

FILE.txt、ORIGINAL.exe、JAPANESE.exeは、分かり易いように書いた物なので、自分がわかりやすい物に書き換えてください。

■1b. Delphi製のプログラム

次は Delphi プログラムに於ける方法を説明します。Delphi製のアプリケーションは、上の方法ではうまくいかないので、若干の工夫が必要です。次にその方法を説明します。

■2b. 必要な物 -Delphi用

1a. 必要な物」に加え、Delphiも使います。

■2b-1a. 抽出

基本は「2a. 抽出」と同じ。しかし、そう出来れば楽なんですが、そうも簡単には出来ません。

RCData を ResHacker の「-extract」コマンドを使って抽出しても、ログファイルでは「正常終了」となります。しかし、RC ファイルには何も記録されていません。これが何故起こるかは解らないので、手動で保存するしかありません。また、同コマンドを使用して各 DFM ファイルを保存して Delphi で開くと、エラーが出て使えませんでした。私の妄想でしかありませんが、このコマンドに対する ResHacker の処理に問題があるみたいです。


RCData 以下のリソースを全て、保存します(写真:1)。ここで注意する点は、それらのファイル名を「写真:2」の「T*(TABOUTFORM や TMAINFORM 等)」と同じにすること。そうしないと後々混乱する事になります。それと、ほとんどの場合で変更する必要の無い「DVCLAL」と「PACKAGEINFO」を保存する必要は無い(と思う)。

メモ:それぞれのDFMファイルを保存するときは、「写真A」のように、表示されているフォームからコピーすると楽になります -写真:A-。Delphi を使ってフォームを書き換えるには、同じ物を二個作成する必要があります(後述)。(簡単な物ではDelphiを使わなくても良いでしょう。)

■2b-1b. 編集

DFM ファイルの編集方法には ResHacker や eXescope などがありますが、Delphi を使って編集する方法もあります(参照:「日本語化パッチ作成Community」の「ディスカッションルーム(掲示板)」にある「RCDataの日本語化 (Delphiを用いた方法)」)。

しかし、Delphi で編集した DFM ファイルを組み込むと、一部のプログラムでは動かなくなる可能性があります。どうやら Delphi で開いて保存した時点で、それを組み込んだらプログラムでエラーが出るようだ。もしかしたら回避方法があるかもしれないが、私は余り詳しくないのでわからない。

やはり、地道に編集・置換するしかないようだ。

(上記の「RCDataの日本語化 (Delphiを用いた方法)」の第四項で、『また、読み込みエラーが出たら"無視"を選択するとよいでしょう。』とあるが、それによって失われたコンポーネントかプロパティを、日本語化をしようとしているプログラムが呼び出す際に、エラーが出る物と見た。)

これを回避するには人力で、力技でやるしかない。以下は、二つ用意した DFM の内の一つのフォームの内容を全て編集・翻訳した前提で話す―これを「フォームA」とし、もう一方―未編集―のものを「フォームB」とする。

  1. まず初めに、フォームAの実体参照(いわゆるエンティティ)みたいな物ををきちんと表示されるように直す作業を、以下の正規表現を使って直す。

    第一段階//Delphiで生成されたエンティティの頭に、アンパサンドをつける。
    置換前:(#[0-9]{5})
    置換後:&$1;
    
    第二段階//Delphiで編集した後では、シングルクオートが無いので、それで挿む。
    置換前:(&#[0-9].*;)
    置換後:'$1'
    
    第三段階//英数字が混ざってると、上の段階でシングルクォートが重なるので、それを修正。
    置換前:''
    置換後:(何も入れない)
    上の内容を、サクラエディタのマクロで書くとこうなる。
    //キーボードマクロのファイル
    S_ReplaceAll('(#[0-9]{5})', '&$1;', 28);//
    S_ReDraw(0);// 再描画
    S_ReplaceAll('(&#[0-9].*;)', '\'$1\'', 28);//
    S_ReDraw(0);// 再描画
    S_ReplaceAll('\'\'', '', 28);//
    S_ReDraw(0);// 再描画

    次に、DFMファイルの初めに「<html><pre>」と入力して、InternetExplorer に DnD します。IE は HTML ファイルと勘違いして表示されるので、上で正常なエンティティに書き換えた箇所が日本語で表示されます。そうしたら、IEに表示されたDFMファイルの内容を全部コピーして、エディタに貼り付けます。

  2. 次に、2b-1a. 抽出で作成した二つ目のファイル―フォームB―と翻訳したフォームAとを比較し、フォームAに差分マークが表示されるようにする。フォームAにマークされたら、フォームBから削除・変更された箇所を追加・修正する。ただし、おおよそ関係ないと思われる"Caption"や"Top"等の値を変更する必要は有りません。追加・変更するのは Object 等です。

■2b-3.組み込む

編集し終えたら、そのDFMファイルの中身を全部コピーして、ResHackerで開いた同じリソースの箇所と入れ替えます(実際には古いリソースである英語を全部選択して、コピーした日本語版を貼り付ける)。

あとは、エラーが起きないかをチェックしながらリソースを書き換えていく。

このページの上部へ移動

Copyright(C) Since 2003-2004 Goemon All rights reserved.