2011-11-29 14 views
52

私はiPhoneのストーリーボードをいくつか見てきました。たとえば、ナビゲーションアイテムのタイトルはNewsとなります。このタイトルは他の言語に翻訳する必要があります。iOSストーリーボードをローカライズする方法

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

代わりに何をすることができますか?私は英語のストーリーボードしか持たず、NSLocalizedStringを使ってViewControllerの各要素を手動で翻訳する必要がありますか?

+9

@WTP:あなたは多くのことを持っている場合はむしろ、あなたはおそらく*複数の*ストーリーボードを使用する必要があります。 5本または10本のストーリーボードは確かに100本以上のxibです。 –

+0

[iOS 6でBase Internationalizationのための単一のストーリーボードファイルを使用する](http://forums.macrumors.com/showthread.php?t=1467446)をチェックすると、必要な作業を行う詳細な方法が見つかります。 – mikezang

+0

これを見てください: http://stackoverflow.com/questions/38631740/how-to-shift-all-uiview-from-left-to-right-in-ios-objective-c/38631847#38631847 – Dhiru

答えて

10

あなたは、コード内のUI要素のタイトルを変更することにより、ローカライズを行うことができます:あなたはたとえばオランダでアプリをローカライズする場合は、Dutch.lproj/Localizable.stringsでこれを持っているでしょう

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

"News" = "Nieuws"; 

これは、すべてのUI要素と言語で実行できます。

+1

@Dennis Madsenはい。 –

+0

UIのサイズを変更する必要がある場合(翻訳が長すぎて切り捨てられるなど)これは、NSLocalizedStringを使ってプログラムでテキストを置き換えるのではなく、xibファイルをローカライズするときに簡単に行うことの1つです。しかし、私はストーリーボードがこれを許しているかどうかわかりません(私はまだストーリーボードを試していません)。 – Clafou

+1

@Clafouサイズをローカライズ可能な文字列に入れ、実行時に数値に変換することができます。 –

6

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

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

アプローチは は、スクリプトはあなたが行った変更を伝播の世話を聞かせて、ローカライズする言語ごとに個別のストーリーボードを持つことです元のストーリーボード 他のすべての言語

39

iOS 6では、Base Internationalizationを使用することができます。すべてのstoryboardファイルとxib/nibファイルは、Base.lprojという名前のフォルダに1回だけ存在します。 GUI要素のローカライゼーションは、各ローカリゼーションディレクトリの関連する.stringsファイルに配置されます。

たとえば、 "MainStoryboard.storyboard"はBase.lprojに配置されます。 "MainStoryboard.strings"と呼ばれる関連ファイルはen.lprojと、あなたが適用するローカライゼーションに配置されます。

これは実際には非常に面白いです、特にレイアウトの制約と組み合わせて!

+0

Base InternationalizationはiOS 5または4で動作しますか?ありがとう! –

+4

残念ながら、iOS 6以降のみ。 iOS 5をターゲットとして設定すると、エラーメッセージが表示されます。 – freytag

1

は、私はそれがあなたのストーリーボードのすべてのローカライズであなたをASIST :)ここでは、ここでhttp://www.albertmata.net/articles/introduction-to-internationalization-using-storyboards-on-ios-5.html

+0

私はこれがストーリーボードのローカリゼーションに行く方法だと信じています! – Josejulio

+1

リンクが壊れているhttp://www.lwxted.com/blog/2012/localization-ios-development/このアプリケーションをチェックするhttps://github.com/EldhoseIssac/LocalizationHelperを使用してローカライゼーションを支援する – Eldhose

+0

@リンクは悪いあまりにも。 – ThomasW

107

のiOS 6ではチュートリアルがある「の使用ベースを言う[情報]タブの下のプロジェクト設定があるのに役立ちますibtoolあなたはコマンドラインを学ぶ示唆します国際化 "を意味する。チェックボックスをオンにすると、ストーリーボードからすべての文字列が国際化された.stringsファイルに引き出されます。

この方法で、ストーリーボードを複数コピーする必要はありません。

- (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 
    } 

    // ... 
} 

と何かを持っている:展開のiOS 5の目標と私はストーリーボード上の私の最初のViewControllerがUITabBarControllerである私のタブをローカライズするために、このようなものを使用してストーリーボードとアプリケーションのために

enter image description here

+3

これについての良いチュートリアルはhttp://forums.macrumors.com/showthread.php?t=1467446 –

+0

コードなしのローカライズ:https://iosdevcenters.blogspot.com/2016/12/localize-your- apps-to-support-multiple.html –

+0

ストーリーボードの内容が変更された場合、これらの文字列ファイルを更新するにはどうすればよいですか? – algrid

3

のファイルのように:

// MARK: TabBar 
"tabBarItem0" = "My First Tab Label"; 
"tabBarItem1" = "My Second Tab Label"; 
"tabBarItem2" = "My Third Tab Label"; 
+0

これは機能しますが、次の項目を追加するまで、タブバーの項目アイコンをノックアウトします:[tabBarItems [0] setImage:[UIImage imageNamed:@ "tabIcon1.png"]];タブバーの各項目の –

2

多言語ローカリゼーションはw ell。 NSLocalizedString()をコードで呼び出す代わりに、ストーリーボードにキーを直接指定することができます。不要なアウトレットを避け、定型コードを減らすことができます。

https://github.com/negusoft/Polyglot