web-dev-qa-db-ja.com

NSLocalizedStringは、Localizable.strings(IOS)の値ではなく、キーのみを取得します

「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)に設定しても機能しますが、アラートビューにはキーのみが表示されます。誰が間違っているか知っていますか?

40
Smiden

実際のデバイスでアプリをテストし、機能しました

11
Smiden

私の場合は、誤ってファイルに「Localization.strings」という名前を付けていて、気付いていなかったためです(Localizable.stringsという名前にする必要があります)。前に説明したように、症状はコンパイラが文字列を見つけることができないためです。それ以外の場合、原因はいくつでもありますが、通常はセミコロンまたは引用符が欠落しています。一度に多くのローカライズを行っている場合、これらを見つけるのは困難です。学んだ教訓は、開発プロセスの早い段階でローカライズファイルの構築を開始し、それらを見つけやすくすることです。

97
Jim Rota

同じ問題、ファイル名を使用して解決:Localizable.strings

25
Pelanes

Localizable.stringsファイルが追加されていることを再確認してください

ターゲット-> BuildPhases->バンドルリソースのコピー

私には自動的に追加されていませんでした。

11
virsunen

私は5時間ソリューションを探してきましたが、アプリのローカリゼーションを機能させるためにできる限りのことを試しました。

問題は、私のプロジェクトのポッドの1つにLocalizable.stringsファイルがあったことです(実際には、名前を変更していないのはParseポッドでした)。そのため、Localizable.stringsファイルはアプリで認識されませんでした。

ファイルの名前を「MyappnameLocalizable.strings」に変更し、NSLocalizedStringを次のように使用して、問題を修正しました。

        NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")
9
aiwis31

これは、何らかの理由でランタイムが指定されたキーを見つけられない場合に発生します。あなたの場合、タイプミスが原因である可能性が最も高い:CONNECTIONERRORITLETTITLEが欠けているLocalizable.stringsファイルに関するコンパイル時の警告/エラーにも注意してください。バランスの取れていない"または欠落している;がある場合、ファイルを正しくコンパイル/読み取ることができません。

8
DarkDust

IOSシミュレーターでこれに問題がありました。シミュレーター・ディレクトリーのLocalization.stringsファイルを削除することになりました

(/ Users /(me)/ Library/Application Support/iPhone Simulator/5.0/Applications /(etc)/(project)/(application.app)

そこにcdし、そこで見つかったLocalization.stringsのすべてのコピーを削除します。

何らかの理由で、ビルドクリーン、iOSシミュレーターの終了、XCodeの終了などの通常のゴム製チキンブードゥーは動作しませんでしたが、これは動作しました。少なくとも私にとっては、今日。

8
Andrew Lewis

ファイルの名前をLocalizable.stringsに変更し、ファイルインスペクターのターゲットが設定されていることを確認します。構文エラーを避けるために、Localizable.stringsファイルを右クリックして、[開く]、[ASCIIプロパティリスト]の順にクリックします。また、プロジェクトのクリーニングとビルドが私の場合に役立ちました。

7
Nick Greg

InfoPlist.stringsファイルの名前をLocalizable.strings(double clic)に変更すると、そのキーの正しい文字列が取得されます。

6
Pelanes

NSLocalizedStringを使用すると、コンテンツを取得するためにキーの正確な大文字と小文字の区別が必要になります。あなたはこれが言うことに気付くでしょう

NSLocalizedString(@"CONNECTIONERRORITLE",nil)

あるべき時

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)

最初の部分の最後の部分を見ると、「TITLE」ではなく「ITLE」と表示されます

6
CodaFi

Localizable.stringsファイルが見つかっているかどうかを確認するには、.appビルドのコンテンツを確認します。コードでこれを行うこともできます。

// enは英語などなので、ここで指定しますNSString * path = [[NSBundle mainBundle] pathForResource:@ "en" ofType:@ "lproj"];

パスがNULLの場合、ファイルが見つからないことを意味します。

4
Komposr

行末にダブルセミコロンを書いた場合、NSLocalizationは機能しません。 「;;」がある場合は、Localizable.stringsファイルを確認する必要があります

3
BurtK

文字列ファイルに余分なセミコロンがある場合、ローカライズされません。

2
Teja Nandamuri

提案された解決策はどれも私にとってはうまくいきませんでしたが、製品の.appファイルを削除することで問題を解決しました

1
Matthew

私の場合、きれいなプロジェクトを試してみて、まだ機能しない派生データを削除しました。文字列ファイル内のいくつかの改行を削除すると、Xcodeは再び文字列を見つけます。

1
BillChan

同様の問題に直面しました。突然、ローカライズ可能な文字列がまったく機能しませんでした。次に、古い.stringsコピーを使用してファイル比較を使用しましたが、最後に誤ってキーを削除してしまったことがわかりました。

したがって、形式が間違っている場合、Xcodeは文字列を読み取れません。

これは期待される形式です"Key" = "Value";

1
sandyios

を置く; Localizable.stringsファイルの行の最後。

1
Vincent

同様の問題に対する答えを探しているときに私はこれにつまずいたので、私はここに私の解決策を残しています:

キーに「\ n」ではなく「\ u2028」が含まれている場合、値ではなく常にキーのみが返されます。ローカライズのバグのようです。

1
Luke

1つの言語が適切に機能し、他の言語が半分の時間機能し、他の時間はそのキーのローカライズバージョンではなくキーを取得したときに問題が発生しました。

私の場合の問題は、手動でバージョン管理の競合をマージした後、「>>>>>」という余分な行が残っていて、プロジェクトが文句を言わず(セミコロンを逃したときのように文句を言わない)、適切にビルドされていたので、 「>>>>>」の前のすべてのキーが翻訳され、その後のすべてのキーが翻訳されていました。

より単純な解決策が失敗した場合、すべての行を調べて余分な文字(「>>>>>」だけでなく、他の余分な文字も)を探すか、バージョン管理を使用している場合、 Localizable.stringsファイルを作成し、手動で変更を行い、後でコミットを追加します。

0
sabius

シミュレータの設定をリセットするとうまくいきました。

iOSシミュレーター>コンテンツと設定をリセット...

0
clocksmith

keyまたはvalueの前に「@」を置かないようにしてください。

@"key" = @"value";

それだけでする必要があります:

"key" = "value";

「@」は、キーにアクセスするときにのみキーの前に移動します。

NSWebLocalizedString(@"key", @"label for coder");
0
craned

ローカライズファイルの最初の行にはマッピングが含まれている必要があります。そうでない場合、SDKはファイルを読み取りません。

0
Clint Johnson

このアプローチを使用して解決しました。

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)
0
MrMins

スウィフト4:

外部フレームワークで使用するなど、複数のバンドルを使用する場合:

var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")
0
Ahmed Lotfy

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

単体テストで問題が発生している場合、シミュレータで動作します;)

0
ergunkocak

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: "")
    }
}
_

それが役に立てば幸い。

0
Liam

ローカライズが突然文字列の翻訳を停止したときに、すべてが機能しました。これは、ファイルが何らかの形でXcodeで読み取れないことを意味します。

これは、Localized.stringsファイルに不適切な文字を貼り付けたために起こりました。問題のある文字(Unicode以外の文字?悪い引用符?わからない)を含む数行を削除すると、すべてが正常に戻りました。

問題のある行を見つけるために、ブレークポイントを作成し、翻訳されない最初の行にヒットするまで、デバッガーでファイル内の文字列を手動で翻訳しました。

0
Eran Goldin