xCode で基本国際化を使用して、アプリで複数の言語を管理しています。
xib ファイルには、次のオブジェクトがあります。
Xrj-9E-2VK it's an UITextView
対応する文字列ファイル:
"Xrj-9E-2VK.text" = "text translated in french"
しかし、私のテキストはまだ英語です。
なにか提案を ?
xCode で基本国際化を使用して、アプリで複数の言語を管理しています。
xib ファイルには、次のオブジェクトがあります。
Xrj-9E-2VK it's an UITextView
対応する文字列ファイル:
"Xrj-9E-2VK.text" = "text translated in french"
しかし、私のテキストはまだ英語です。
なにか提案を ?
Apple が iOS 7 にまだ存在するこの (深刻な) バグを修正するまで、次の回避策を見つけました。
実際には、「基本ローカリゼーション メソッド」(= Xcode 5 および iOS 7 で推奨されるメソッド) と「Localizable.strings」ファイルを使用する「古い」メソッドを「ミックス」する必要があります。
1) ファイル 'Localizable.strings' を作成します (ファイル -> 新規 -> iOS -> リソース -> .strings ファイル)
2) Xcode を使用して、使用する言語ごとにこのファイルのローカライズ バージョンを作成します (「Localizable.strings」ファイルを選択し、「Localization」の下のファイル インスペクターで、使用する各言語の横にある選択ボタンをクリックします)。
3) viewController で、UITextField の IBOutlet @property を作成します。
@property (weak, nonatomic) IBOutlet UITextView *localizedTextView;
4) 「viewDidLoad」の下に次のコードを追加します。
self.localizedTextView.text = NSLocalizedString(@"textFieldKey", @"comment for the translator");
5) 各「Localizable.strings」ファイルに次を追加します。
"textFieldKey" = "textField に入れたい翻訳テキスト";
それはそれを行う必要があります!
Apple は近い将来このバグを修正する可能性が高いことに注意してください。その場合、翻訳は「ベースローカライズされたストーリーボード」(「a8N-K9-eJb.text」などのオブジェクト参照を含むストーリーボード) から取得されます。 = "翻訳されたテキスト". その場合、'Localization.strings' ファイルを削除し、UITextField にベース ローカリゼーションを再度使用できます。
これはまだ Xcode 6 & IOS 8 で表示され、以前の回答では満足できません。
これが私の簡単で迅速な回避策です:
その後、必要に応じて「ローカライズ可能な文字列」に戻ることができます...この場合、「Interface Builder Cocoa Touch XIB」を使用してアプリを少なくとも 1 回実行する必要があることに注意してください。オプションが選択されました。
NSLocalizedStringFromTable を使用して、viewDidLoad で次のように xcode の IB によって生成されたテキストを取得できます。
self.intro_text.text = NSLocalizedStringFromTable(@"2Vy-59-WN8.text", @"Main", @"");
2Vy-59-WN8.text は生成されたキーで、UITextView の Main.strings にあります。
ところで: これは xcode/IB のバグであり、iOS のバグではありません。
これは私のSwift 2の答えです:
各 UIViewController で修正を繰り返したくないので、拡張機能から始めましょう。
import UIKit
extension UIViewController {
// if the property "Selectable" = NO it will reset the font and fontcolor when setText is used.
// So turn Selectable ON
func localizeUITextViewsFromStoryboard(storyboardName: String) {
for view in self.view.subviews {
if let textView = view as? UITextView,
let restorationIdentifier = textView.restorationIdentifier {
let key = "\(restorationIdentifier).text"
let localizedText = NSLocalizedString(key, tableName: storyboardName, comment: "")
if localizedText != key {
textView.text = localizedText
}
}
}
}
}
この修正が必要な各 UIViewController で、次のように記述します。
override func viewDidLoad() {
super.viewDidLoad()
self.localizeUITextViewsFromStoryboard("Main")
}
このコードは、UITextViews の復元 ID を使用します。これは、各 UITextView のストーリーボードでオブジェクト ID を復元識別子にコピーする必要があることを意味します。
Apple にバグを報告します。これが起こっていること、そしてあなた(そして私)に時間とフラストレーションを引き起こしていることを彼らに知らせてください. このローカリゼーション システム全体は、NSLocalizedString にフォールバックさせるためのものではありません。
これを Xcode 5.1.1 および iOS7 で動作させることができました。
左側のファイル パネルで、ローカライズする ViewController を選択します。右側のパネルで、ファイル インスペクターを選択します。
「ローカライズ...」ボタンが表示されます。ボタンをタップします。選択できる言語のドロップダウン リストが表示されます。ベースを選択し、「ローカライズ」をタップします。
右側のパネルのローカリゼーション セクションで [ベース] が選択され、他の言語が一覧表示されます。サポートする言語を選択します。アプリの「ネイティブ」言語をオフのままにします。
確かにキャッシングの問題があります。シミュレーターからアプリを削除した後、および Xcode の派生データを削除したときにのみ、変更が表示されることがあります。
Xcode 7はまだバグがあるようです...
複雑なことを試す前に、次の 3 つの簡単な手順を試してください。
幸運を。
アップデート
実際にテキストを変更する最善の方法は、UITextView からセッターを直接使用することです。
テキストがフォーマットされていない場合は、次を使用してください。
[textView setText:NSLocalizedString(key, comment)];
テキストがフォーマットされている場合は、次を使用する必要があります。
[textView setAttributedText:[[NSMutableAttributedString alloc] initWithString:NSLocalizedString(key, comment)]];
更新されたメソッドで回避策を使用する必要はなくなりました。
回避策
これを達成できるようにするために、私が見つけた最も簡単な解決策は、翻訳されたテキストを他の UITextView とまったく同じ場所に追加して非表示にすることです。
適切なビューを表示するには、コントローラーの viewDidLoad メソッドでこれを行います。
NSString *language = [[NSLocale preferredLanguages] firstObject];
if ([language isEqualToString:FRENCH_LANGUAGE]) { //@"fr"
UITextView.hidden = YES;
UITextViewFR.hidden = NO;
}
この解決策は決して洗練されたものではありませんが、多くの翻訳を保持する必要がない場合には、確かに優れた回避策です。
そうは言っても、ストーリーボードのローカライズされた文字列を使用しても機能しません。IBOutlet を追加し、NSLocalizedString でテキスト属性を設定しても機能しませんでした。私は解決策を探し回りましたが、誰もその明確な答えを見つけることができなかったようです.