RubyMotionで多言語対応するためにはresources
ディレクトリ配下に、言語に応じたディレクトリと、それぞれの言語で使用する設定ファイルを配置する必要があります。
ディレクトリ構造
例えば日本語版と英語版を作る場合には以下のようにディレクトリを作成します。それぞれja.lproj
ディレクトリが日本語版、en.lproj
ディレクトリが英語版を指します。
[RUBY_MOTION_ROOT]
└/resources
├── /ja.lproj
│ ├── InfoPlist.strings
│ └── Localizable.strings
└── /en.lproj
├── InfoPlist.strings
└── Localizable.strings
InfoPlist.strings
InfoPlist.strings
ファイルには言語別のアプリ名を設定します。
- CFBundleName
- そのアプリであることが分かる16字未満の値を設定します。
- CFBundleDisplayName
- アイコンの下に表示されるアプリ名を設定します。
ja.proj/InfoPlist.strings
CFBundleName = "日本語ですよ";
CFBundleDisplayName = "日本語";
en.proj/InfoPlist.strings
CFBundleName = "English Ver";
CFBundleDisplayName = "English";
Localizable.strings
Localizable.strings
ファイルには言語別にアプリ内で使用する文字列を設定します。
形式は以下の通りです。
"key" = "value";
ja.proj/Localizable.strings
"run" = "実行";
"build" = "ビルド";
"stop" = "中止";
en.proj/Localizable.strings
"run" = "Run";
"build" = "Build";
"stop" = "Stop";
アプリ内で使用する場合
ObjectiveCではNSLocalizedString((NSString *)key, (NSString *)comment)
でキーを指定して使用することができますが、どうやらこのメソッドはマクロのようで、RubyMotionから使用することができません。
使用する場合は自分でNSBundleから取得する方法と、BubbleWrapを使用する方法があります。
NSBundleを使用する場合
以下のようなコードを読み込んでおくと便利です。(RubyMotionフォーラムからの引用です)
module Kernal
def localized_string(*args)
key = args.shift
default = args.shift || key
NSBundle.mainBundle.localizedStringForKey(key, value:default, table:nil)
end
end
BubbleWrapを使用する場合
以下のようなコードでローカライズされた文字列を取得することができます。
BW::localized_string(:run, 'Run')