■1a. 必要な物
ソフトウェアを日本語化するには以下の物が必要です。
- RCファイルをRES形式に変換するソフトウェア
- BRCC32.exe (実質フリー・Delphi に付属) 、その他
RC ファイルを RES 形式に変換する為のソフトで、他には GoRC 等があります。GoRCは日本語の処理が出来ていない模様なので、実際には使えません。BRCC を手に入れるには Borland Delphi をダウンロードする必要があります。
Delphi は、Personal 版ならフリーで利用できます。Delphi Download Homepageの「Downloads (keys where required)」にあるリンクから登録して、キーを入手する必要があります。詳細は忘れました。「Delphiをインストールしたディレクトリ\Borland\Delphi6\Bin」内にある brcc32.exe を使います。
- リソースを編集するソフトウェア
- Resource Hacker や eXeScope 等
Resource Hackerはフリーウェアで、eXeScopeはシェアウェア(二千円)。
ResHacker をダウンロードするにはResource Hackerへ行き、下の方にある「Resource Hacker™ translations:」の項の「Japanese」を選択します。
eXeScope はTechnoCityにあります。
- 置換機能と差分表示機能があるエディタ
■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 からも抽出が可能です。

■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」とする。
まず初めに、フォーム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ファイルの内容を全部コピーして、エディタに貼り付けます。
次に、2b-1a. 抽出で作成した二つ目のファイル―フォームB―と翻訳したフォームAとを比較し、フォームAに差分マークが表示されるようにする。フォームAにマークされたら、フォームBから削除・変更された箇所を追加・修正する。ただし、おおよそ関係ないと思われる"Caption"や"Top"等の値を変更する必要は有りません。追加・変更するのは Object 等です。
■2b-3.組み込む
編集し終えたら、そのDFMファイルの中身を全部コピーして、ResHackerで開いた同じリソースの箇所と入れ替えます(実際には古いリソースである英語を全部選択して、コピーした日本語版を貼り付ける)。
あとは、エラーが起きないかをチェックしながらリソースを書き換えていく。
