HandBrake日本語版開発日誌(1/2)
Mac OS X版HandBrakeの日本語化継続中。GUI部分の日本語化はほぼ完了。つづいてソースコード中のテキストの日本語化を進める。プレファレンスやプリセット周りでドロップダウンリストのテキストを参照している部分がところどころあるようなので、その辺りの修正が必要と思われる。
開発メモ:ソースコード中文字列のローカライズ
OS Xでは、ソースコード中の文字列をローカライズする仕組みとして「Stringsファイル」というものが用意されている。これは、ソースコード中で使用する文字列データをリソースフォルダ中のStringsファイル(拡張子は.string)からロードする仕組みで、言語環境に会わせて使用するStringsファイルを切り替えることで、それぞれの言語に合わせた文字列を選択できるようにするものだ。
なお、詳細なドキュメントとしてはADCの Internationalization Programming Topics: Strings Files があるので、こちらも参照すべし。
Stringsファイルの構造
Stringsファイルの構造は次のようになっている。
/* Insert Element menu item */ "Insert Element" = "Insert Element"; /* Error string used for unknown error types. */ "ErrorString_1" = "An unknown error occurred.";
「/*」〜「*/」ガコメントで、続いて「”キー” = “文字列”」というデータが並ぶ構造となっている。Stringsファイルはアプリケーションバンドルの「<言語名>.lproj」ディレクトリ以下に収納されている。ちなみにデフォルトのStringsファイル名は「Localizable.strings」だが、任意の名前を付けることが可能。
Stringsファイルから文字列をロードする
Strginsファイルから文字列を取り出すには、下記の関数を利用できる、
- Core Foundation macros:
- CFCopyLocalizedString
- CFCopyLocalizedStringFromTable
- CFCopyLocalizedStringFromTableInBundle
- CFCopyLocalizedStringWithDefaultValue
- NSLocalizedString
- NSLocalizedStringFromTable
- NSLocalizedStringFromTableInBundle
- NSLocalizedStringWithDefaultValue
たとえばデフォルトStringsファイル(Localizable.strings)中に下記のような記述があったとする。
/* A comment */ "Yes" = "はい";
この場合、下記のようにしてローカライズ文字列を読み出せる。
NSString* theString; theString = NSLocalizedString (@"Yes", @"A comment");
なお、NSLocalizedStringの第2引数は省略可能。また、Localizable.strings以外のStringsファイルからテキストをロードしたい場合はNSLocalizedStringFromTableを利用する。
Stringsファイルを作成するツール
ローカライズする文字列を抜き出すためのツールとして、「genstrings」というものがある。たとえば、下記のように実行すると、カレントディレクトリ以下の*.mファイルからローカライズすべきテキストを抜き出し、Japanese.lprojディレクトリ以下のLocalizable.stringsファイルに書き出すとともに、*.mファイル中のテキスト文字列を「NSLocalizedString(@”文字列”, @”)に置き換えてくれる。
genstrings -o Japanese.lproj *.m
Mac OS X版HandBrake日本語化メモ1
HandBrakeの日本語化 作業メモ。
Appleの開発者向けサイトにある国際化ドキュメント に目を通す。しかし役に立つ話は非常に少ない。マイコミジャーナルの OS X ハッキング! 記事にある、ローカライズ絡みの話にひと通り目を通しておけばOS Xアプリの日本語化についての基礎的な知識は十分っぽい。
あと、今回のような日本語化には ibtool というものを活用すべし、という話。次のように実行すると、nibファイル中のテキスト要素がファイルに書き出される。
ibtool -L en.lproj/MainMenu.nib > ./MainMenu.strings
書き出されたファイルは次のような「アイテム=テキスト」というのが並んでいるテキストファイルとなるので、こいつを翻訳する。
/* Class = "NSMenuItem"; title = "About HandBrake"; ObjectID = "58"; */"58.title" = "About HandBrake";
翻訳後、次のように翻訳したテキストをnibファイルにぶち込む。
ibtool -d de.lproj/MainMenu.strings en.lproj/MainMenu.nib -W de.lproj/MainMenu.nib
ちなみにHandBrakeはリソースファイルにnib形式ではなくxib形式を使っているが、xib形式でも同様にibtoolで処理できるようだ。xib形式はnib形式を扱いやすいように1つのXMLファイルにまとめたものだそうで、普通にInterface Builderで読み込める。nibファイルはファイルシステム的にはディレクトリとして扱われるためSubversionとかでのバージョン管理が厄介だったのだが、xib形式だと純粋に1ファイルなので問題が起こらなくて便利。
で、リソースファイルをぼちぼちと日本語化しつつ、Mac OS X版のソースを眺める。Windows版もそうだったけど、設定項目(プルダウンメニューのやつ)の日本語化が非常にやりづらいソースになっているのだが、とりあえずそれ以外はリソースファイルを書き換えるだけでOKっぽい。