2012年2月9日木曜日

NSLocalizedStringとstringWIthFormatを使ってiPhoneアプリの多言語化

どうも、俺@仕事中です。
今日はiPhoneアプリをNSLocalizedString()とNSString stringWithFormatを使って多言語対応する方法のめもめもです。

日本語環境のみに作ったアプリを
NSString *str = @"にほんご";
英語圏で使うようにするには

NSString *str = NSLocalizedString(@"key", @"comment");
としておき、ターミナルから

genstrings -a $(find ./ -name "*.m");
とすればLocalizable.stringsファイルができるので、Xcode内にドラッグ&ドロップ(Xcode4では「Supporting Files」が適当かな)します。
Localizable.stringsはUtilitiesのFile Inspectorから作成する言語とText−Encoding(UTF-16)を設定します。
Localizable.strings内では
・Localizable.strings(English)
"key" = "Japanese;"

・Localizable.strings(Japanese)
"key" = "にほんご"
としておけば、"key"と記述した部分をそれぞれの言語に変更してくれます。
※ここでは"Japanese"と"にほんご"に置換してくれる。

これら詳しい説明は
NSLocalizedStringでiphoneアプリ多言語対応 Xcode4 - はるかなる熊がとても参考になりました。


ところで、英語と日本語では文法的に単語の出てくる順番が異なるときが出てくる。
例えば
私は「テトリス」で「100」pt取った。
という日本語を英語にすると
I took 「100」pt in 「Tetris」.
となる。「」で囲まれた単語が異なる場合がある。
こういう場合、まずobjective-cのソースコードでは英語に合わせて作ったほうが分かりやすい。

NSString *str = [NSString stringWithFormat: NSLocalizedString(@"long sentence", @"some comment"), @"100", @"Tetris"]
こうしておいた上で、それぞれのLocalizable.stringsでは
・Localizable.strings(English)
"long sentence" = "I took %d pt in %@.";

・Localizable.strings(Japanese)
"long sentence" = "わたしは%$2@で%1$d取った。";
とする。
stringWithFormat の%$n@でフォーマットに入れる変数の順番を変更できるのです。(nは整数)


以上でぇぇぇぇぇぇす。