「Localizable.strings」という名前の文字列ファイルを作成し、次のように2つの言語を追加しました。
"CONNECTIONERROR" = "Check that you have a working internet connection.";
"CONNECTIONERRORTITLE" = "Network error";
また、ファイルをUnicode UTF-8に変換しましたが、次のようなUIAlertViewを作成すると:
UIAlertView *myAlert = [[UIAlertView alloc]
initWithTitle:NSLocalizedString(@"CONNECTIONERRORITLE",nil)
message:NSLocalizedString(@"CONNECTIONERROR",nil)
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
アラートビューには、値ではなくキーテキストのみが表示されます。たとえば、UITextviewsテキストをNSLocalizedString(@ "CONNECTIONERROR"、nil)に設定しても機能しますが、アラートビューにはキーのみが表示されます。誰が間違っているか知っていますか?
実際のデバイスでアプリをテストし、機能しました
私の場合は、誤ってファイルに「Localization.strings」という名前を付けていて、気付いていなかったためです(Localizable.stringsという名前にする必要があります)。前に説明したように、症状はコンパイラが文字列を見つけることができないためです。それ以外の場合、原因はいくつでもありますが、通常はセミコロンまたは引用符が欠落しています。一度に多くのローカライズを行っている場合、これらを見つけるのは困難です。学んだ教訓は、開発プロセスの早い段階でローカライズファイルの構築を開始し、それらを見つけやすくすることです。
同じ問題、ファイル名を使用して解決:Localizable.strings
Localizable.stringsファイルが追加されていることを再確認してください
ターゲット-> BuildPhases->バンドルリソースのコピー
私には自動的に追加されていませんでした。
私は5時間ソリューションを探してきましたが、アプリのローカリゼーションを機能させるためにできる限りのことを試しました。
問題は、私のプロジェクトのポッドの1つにLocalizable.stringsファイルがあったことです(実際には、名前を変更していないのはParseポッドでした)。そのため、Localizable.stringsファイルはアプリで認識されませんでした。
ファイルの名前を「MyappnameLocalizable.strings」に変更し、NSLocalizedStringを次のように使用して、問題を修正しました。
NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")
これは、何らかの理由でランタイムが指定されたキーを見つけられない場合に発生します。あなたの場合、タイプミスが原因である可能性が最も高い:CONNECTIONERRORITLE
にT
のTITLE
が欠けているLocalizable.strings
ファイルに関するコンパイル時の警告/エラーにも注意してください。バランスの取れていない"
または欠落している;
がある場合、ファイルを正しくコンパイル/読み取ることができません。
IOSシミュレーターでこれに問題がありました。シミュレーター・ディレクトリーのLocalization.stringsファイルを削除することになりました
(/ Users /(me)/ Library/Application Support/iPhone Simulator/5.0/Applications /(etc)/(project)/(application.app)
そこにcdし、そこで見つかったLocalization.stringsのすべてのコピーを削除します。
何らかの理由で、ビルドクリーン、iOSシミュレーターの終了、XCodeの終了などの通常のゴム製チキンブードゥーは動作しませんでしたが、これは動作しました。少なくとも私にとっては、今日。
ファイルの名前をLocalizable.stringsに変更し、ファイルインスペクターのターゲットが設定されていることを確認します。構文エラーを避けるために、Localizable.stringsファイルを右クリックして、[開く]、[ASCIIプロパティリスト]の順にクリックします。また、プロジェクトのクリーニングとビルドが私の場合に役立ちました。
InfoPlist.stringsファイルの名前をLocalizable.strings(double clic)に変更すると、そのキーの正しい文字列が取得されます。
NSLocalizedStringを使用すると、コンテンツを取得するためにキーの正確な大文字と小文字の区別が必要になります。あなたはこれが言うことに気付くでしょう
NSLocalizedString(@"CONNECTIONERRORITLE",nil)
あるべき時
NSLocalizedString(@"CONNECTIONERRORTITLE",nil)
最初の部分の最後の部分を見ると、「TITLE」ではなく「ITLE」と表示されます
Localizable.stringsファイルが見つかっているかどうかを確認するには、.appビルドのコンテンツを確認します。コードでこれを行うこともできます。
// enは英語などなので、ここで指定しますNSString * path = [[NSBundle mainBundle] pathForResource:@ "en" ofType:@ "lproj"];
パスがNULLの場合、ファイルが見つからないことを意味します。
行末にダブルセミコロンを書いた場合、NSLocalizationは機能しません。 「;;」がある場合は、Localizable.stringsファイルを確認する必要があります
文字列ファイルに余分なセミコロンがある場合、ローカライズされません。
提案された解決策はどれも私にとってはうまくいきませんでしたが、製品の.appファイルを削除することで問題を解決しました
私の場合、きれいなプロジェクトを試してみて、まだ機能しない派生データを削除しました。文字列ファイル内のいくつかの改行を削除すると、Xcodeは再び文字列を見つけます。
同様の問題に直面しました。突然、ローカライズ可能な文字列がまったく機能しませんでした。次に、古い.stringsコピーを使用してファイル比較を使用しましたが、最後に誤ってキーを削除してしまったことがわかりました。
したがって、形式が間違っている場合、Xcodeは文字列を読み取れません。
これは期待される形式です"Key" = "Value";
を置く; Localizable.stringsファイルの行の最後。
同様の問題に対する答えを探しているときに私はこれにつまずいたので、私はここに私の解決策を残しています:
キーに「\ n」ではなく「\ u2028」が含まれている場合、値ではなく常にキーのみが返されます。ローカライズのバグのようです。
1つの言語が適切に機能し、他の言語が半分の時間機能し、他の時間はそのキーのローカライズバージョンではなくキーを取得したときに問題が発生しました。
私の場合の問題は、手動でバージョン管理の競合をマージした後、「>>>>>」という余分な行が残っていて、プロジェクトが文句を言わず(セミコロンを逃したときのように文句を言わない)、適切にビルドされていたので、 「>>>>>」の前のすべてのキーが翻訳され、その後のすべてのキーが翻訳されていました。
より単純な解決策が失敗した場合、すべての行を調べて余分な文字(「>>>>>」だけでなく、他の余分な文字も)を探すか、バージョン管理を使用している場合、 Localizable.stringsファイルを作成し、手動で変更を行い、後でコミットを追加します。
シミュレータの設定をリセットするとうまくいきました。
iOSシミュレーター>コンテンツと設定をリセット...
key
またはvalue
の前に「@」を置かないようにしてください。
@"key" = @"value";
それだけでする必要があります:
"key" = "value";
「@」は、キーにアクセスするときにのみキーの前に移動します。
NSWebLocalizedString(@"key", @"label for coder");
ローカライズファイルの最初の行にはマッピングが含まれている必要があります。そうでない場合、SDKはファイルを読み取りません。
このアプローチを使用して解決しました。
localize
ファイルは、main.Strings
という名前で作成されました。次に、main.Strings
ファイル(追加された各言語)を開き、localize.strings
という名前で手動で名前を変更し、プロジェクトに1つずつ追加し、main.strings
も削除しました。
2番目に評価するのはcheckです。ファイル、すべてのkeys
は;
で終わる必要があり、すべてのquotes
が適切に開閉されることを確認してください。
そして、Swift 4で使用できます:
myButon.setTitle(NSLocalizedString("forgotpassword.key", comment: ""), for: UIControlState.normal)
スウィフト4:
外部フレームワークで使用するなど、複数のバンドルを使用する場合:
var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")
Xcode 9.2の場合、コンソールを使用してプロジェクトのシミュレーターから「Localizable.strings」ファイルを削除すると解決しました。ここに私のような怠け者のためのコマンドがあります;)
YOUR_APP_NAME_HEREをプロジェクト名に置き換えることを忘れないでください
シェルスクリプト:
cd
cd Library/Developer/CoreSimulator/Devices/
find . -name "Localizable.strings" | grep "YOUR_APP_NAME_HERE.app" | xargs rm
単体テストで問題が発生している場合、シミュレータで動作します;)
SDKを開発しているとき。追加の操作が必要です。
1)YourLocalizeDemoSDKで通常どおりにLocalizable.stringsを作成します。
2)YourLocalizeDemoで同じLocalizable.stringsを作成します。
3)YourLocalizeDemoSDKのBundle Pathを見つけます。
Swift4:
_// if you use NSLocalizeString in NSObject, you can use it like this
let value = NSLocalizedString("key", tableName: nil, bundle: Bundle(for: type(of: self)), value: "", comment: "")
_
Bundle(for: type(of: self))
は、YourLocalizeDemoSDKでバンドルを見つけるのに役立ちます。代わりに_Bundle.main
_を使用すると、間違った値を取得します(実際には、キーと同じ文字列になります)。
ただし、 dr OX で言及されているString拡張機能を使用する場合。もっとする必要があります。 Origin拡張機能は次のようになります。
_extension String {
var localized: String {
return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
}
}
_
ご存知のように、SDKを開発しています。_Bundle.main
_はYourLocalizeDemoのバンドルのバンドルを取得します。それは私たちが望むものではありません。 YourLocalizeDemoSDKにバンドルが必要です。これは、すばやく見つけるための秘isです。
YourLocalizeDemoSDKのNSObjectインスタンスで以下のコードを実行します。そして、YourLocalizeDemoSDKのURLを取得します。
_let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL
_
2つのURLの両方を印刷すると、mainBundleURLに基づいてbundleURLofSDKを構築できることがわかります。この場合、次のようになります。
_let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
_
そして、文字列の拡張子は次のようになります。
_extension String {
var localized: String {
let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
}
}
_
それが役に立てば幸い。
ローカライズが突然文字列の翻訳を停止したときに、すべてが機能しました。これは、ファイルが何らかの形でXcodeで読み取れないことを意味します。
これは、Localized.strings
ファイルに不適切な文字を貼り付けたために起こりました。問題のある文字(Unicode以外の文字?悪い引用符?わからない)を含む数行を削除すると、すべてが正常に戻りました。
問題のある行を見つけるために、ブレークポイントを作成し、翻訳されない最初の行にヒットするまで、デバッガーでファイル内の文字列を手動で翻訳しました。