web-dev-qa-db-ja.com

iOSストーリーボードをローカライズする方法

IPhoneのストーリーボードにはいくつかのビューがあります。たとえば、ナビゲーションアイテムのタイトルはNewsという名前で、他の言語に翻訳する必要があります。

ストーリーボードに新しいローカライズを追加すると、新しい言語の現在のストーリーボードの複製が作成されました。ここでは、ナビゲーション項目のタイトルを変更できますが、私にとってはあまり便利ではないようです。ストーリーボードに100ビューが含まれており、10言語をサポートする必要がある場合はどうなりますか?元のストーリーボードで何かを変更する必要がある場合は、すべての言語で同じ変更を行う必要があります。それはとても奇妙に思えます。これはどの状況で役立ちますか?

代わりに何ができますか?英語のストーリーボードのみを用意し、NSLocalizedStringを使用してViewControllerの各要素を手動で翻訳する必要がありますか?

55
dhrm

コード内のUI要素のタイトルを変更することにより、ローカライズを行うことができます。

self.title = NSLocalizedString("News", nil);

たとえば、アプリをオランダ語にローカライズする場合は、Dutch.lproj/Localizable.strings

"News" = "Nieuws";

その後、すべてのUI要素と言語に対してこれを実行できます。

10
user142019

IOS 6の[情報]タブには、[ベースの国際化を使用する]というプロジェクト設定があります。チェックボックスをオンにすると、すべての文字列がストーリーボードから国際化された.stringsファイルにプルされます。

これにより、ストーリーボードのコピーを複数持つ必要がなくなります。

enter image description here

108
Collin

IOS 6の時点で、Base Internationalizationを使用することを決定できます。すべてのストーリーボードとxib/nibファイルは、Base.lprojという名前のフォルダーに1回だけ存在します。 GUI要素のローカライズは、各ローカライズディレクトリの関連する.stringsファイルに配置されます。

たとえば、「MainStoryboard.storyboard」はBase.lprojに配置されます。 「MainStoryboard.strings」と呼ばれる関連ファイルは、en.lprojおよび適用するローカリゼーションに配置されます。

これは、特にレイアウトの制約と組み合わせて、非常にハンサムです!

39
freytag

こちらのビデオチュートリアルが役に立つかもしれません:

http://www.youtube.com/watch?v=cF1Rf02QvZQ

アプローチは、ローカライズする言語ごとに個別のストーリーボードを用意してから、他のすべての言語の元のストーリーボードで行った変更の伝播をスクリプトに任せることです。

6
reabrn

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";
3
Jens Kohl

Polyglot Localizationも役に立つかもしれません。 NSLocalizedString()をコードで呼び出す代わりに、ストーリーボードでキーを直接指定できます。不要なコンセントを避け、定型コードを削減できます。

https://github.com/negusoft/Polyglot

2
blurkidi

すべてのストーリーボードのローカライズに役立つコマンドラインibtoolを学ぶことをお勧めします:)ここにチュートリアルがあります -using-storyboards-on-ios-5.html

1
James Campbell