iOSストーリーボードをローカライズする方法
-
25-10-2019 - |
質問
私はいくつかのビューを備えたiPhoneストーリーボードを持っています。たとえば、ナビゲーションアイテムのタイトルに名前が付けられています News
, 、他の言語用に翻訳する必要があります。
ストーリーボードに新しいローカリゼーションを追加すると、新しい言語用の現在のストーリーボードの複製が作成されました。ここでは、ナビゲーションアイテムのタイトルを変更できますが、私にとってはあまり役に立たないようです。ストーリーボードに100のビューが含まれており、10の言語をサポートする必要がある場合はどうなりますか?元のストーリーボードで何かを変更する必要がある場合は、すべての言語で同じ変更を加える必要があります。それは非常に奇妙に思えます。これはどのような状況で役立ちますか?
代わりに何ができますか?英語のストーリーボードのみを持っていて、ViewControllerの各要素を使用して手動で翻訳する必要がありますか NSLocalizedString
?
解決
コード内のUI要素のタイトルを変更することにより、ローカリゼーションを行うことができます。
self.title = NSLocalizedString("News", nil);
たとえば、オランダ語でアプリをローカライズしたい場合は、 Dutch.lproj/Localizable.strings
:
"News" = "Nieuws";
その後、すべてのUI要素と言語に対してこれを行うことができます。
他のヒント
iOS 6には、「ベースインターナショナル化を使用する」という情報タブの下にプロジェクト設定があります。ボックスをチェックすると、すべての文字列がストーリーボードから、国際化された.Stringsファイルに引き出します。
これにより、ストーリーボードの複数のコピーを使用する必要はありません。
iOS 6の時点で、ベース国際化:すべてのストーリーボードとXIB/NIBファイルを使用することを決定できます。Base.lprojという名前のフォルダーには一度だけ存在します。 GUI要素のローカリゼーションは、各ローカリゼーションディレクトリの関連する.Stringsファイルに配置されます。
たとえば、「Mainstoryboard.Storyboard」はbase.lprojに配置されます。 「MainStoryboard.Strings」と呼ばれる関連ファイルは、en.lprojおよび適用される任意のローカリゼーションに配置されます。
これは、特にレイアウトの制約と組み合わせて、本当に非常にハンサムです!
このビデオチュートリアルはここで役立つかもしれません:
http://www.youtube.com/watch?v=cf1rf02qvzq
アプローチは、各言語がローカライズするための個別のストーリーボードを使用し、他のすべての言語の元のストーリーボードで行った変更を伝播するスクリプトに注意を払うことです。
iOS 5の展開ターゲットとストーリーボードの展開ターゲットを備えたアプリの場合、このようなものを使用して、ストーリーボード上の最初のViewControllerがあるタブをローカライズします。 UITabBarController
:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// ...
if ([self.window.rootViewController isKindOfClass:UITabBarController.class]) {
UITabBarController *tabBarController = (UITabBarController *) self.window.rootViewController;
// Localize tab items
NSArray *tabBarItems = tabBarController.tabBar.items;
[tabBarItems enumerateObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(UITabBarItem *item, NSUInteger tabIndex, BOOL *stop) {
NSString *keyName = [NSString stringWithFormat:@"tabBarItem%i", tabIndex];
item.title = NSLocalizedString(keyName, @"TabBarItems");
}];
} else {
// The root view controller is not the UITTabBarController
}
// ...
}
そして、私の中にこのようなものがあります Localizable.strings
ファイル:
// MARK: TabBar
"tabBarItem0" = "My First Tab Label";
"tabBarItem1" = "My Second Tab Label";
"tabBarItem2" = "My Third Tab Label";
ポリグロットのローカリゼーションも役立つかもしれません。 nslocalizedString()をコードで呼び出す代わりに、ストーリーボードでキーを直接指定できます。不必要なアウトレットを避け、ボイラープレートコードを削減できます。
コマンドラインibtoolを学ぶことをお勧めします。それはあなたのすべてのストーリーボードをローカライズするのに役立ちます。:)こちらはここにあります。 http://www.albertmata.net/articles/introduction-ternationalization-using-storyboards on-ios-5.html