ObjecTips

Swift & Objective-C で iOS とか macOS とか

genstrings で Localizable.strings を生成する

genstrings は C や Objective-Cソースコードファイルから .strings ファイルを生成するユーティリティで、以下のマクロと関数を Localizable.strings に書き出してくれる。

NSLocalizedString("key", comment);
CFCopyLocalizedString("key", comment);

また、以下のマクロと関数の場合はテーブル名の .strings ファイルに書き出してくれる。

NSLocalizedStringFromTable("key", Table, comment);
CFCopyLocalizedStringFromTable("key", Table, comment);
NSLocalizedStringFromTableInBundle("key", Table, bundle, comment);
CFCopyLocalizedStringFromTableInBundle("key", Table, bundle, comment);
NSLocalizedStringWithDefaultValue("key", Table, bundle, "value", comment);
CFCopyLocalizedStringWithDefaultValue("key", Table, bundle, "value", comment);

例えば .m ファイルに以下のように記述する。

NSLocalizedString(@"key", @"comment");

そしてターミナル等で genstrings <filepath> とコマンドを実行するとカレントディレクトリに Localizable.strings を生成してくれて、そのファイルの中身は以下のようになっている。

/* comment */
"key" = "key";

ちなみに試してみたところソース上でコメントアウトしている部分に関しても抽出してエントリに追加してくれるらしい。

このコマンドはデフォルトではファイルの上書き保存をするだけでマージはしてくれないので、genstrings で Localizable.strings を生成後に strings ファイルを編集してローカライズを行った後、再びこのコマンドを呼ぶと編集内容が全てクリアされてしまう。
genstrings でファイル生成後にソース上に NSLocalizedString が追記された場合は手動でそれを Localizable.strings に反映させてやる必要がある。


-a オプションの説明には append output to the old strings files. と書かれているが、文字通りエントリを追記していくのみで重複のチェックまでは行ってくれない。
例えばソースに以下のように書かれた .m ファイルに対して

NSLocalizedString(@"key", @"comment");

以下のように2回コマンドを実行する。

genstrings <filepath>
genstrings <filepath>

するとこのようにエントリが単に追記されるだけになる。

/* comment */
"key" = "key";

/* comment */
"key" = "key";

genstrings コマンド自体はそこそこ使える機能だけど重複チェックや差分のマージなど足りない点もあるので他のコマンドやプログラムと組み合わせて使うと良さそう。

関連