46

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

4

30 に答える 30

111

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

于 2012-07-01T17:14:52.977 に答える
27

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

于 2014-03-20T15:15:08.967 に答える
19

.stringsあなたのファイル名をに変更してくださいLocalizable.strings、それは私のために働きました。

于 2017-06-22T07:34:16.517 に答える
18

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

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

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

編集2021: XCode 12では、Localizable.stringsに追加する必要があります

ターゲット->ビルドフェーズ->リソースのコンパイル

于 2014-09-02T16:36:58.743 に答える
13

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

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

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

        NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")
于 2015-08-19T11:54:00.547 に答える
10

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

于 2012-04-20T17:08:25.740 に答える
9

iOSシミュレータでこれに問題がありました。シミュレータディレクトリのLocalization.stringsファイルを削除してしまいました

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

そこにcdして、そこにあるLocalization.stringsのすべてのコピーを削除します。

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

于 2012-07-25T20:18:00.387 に答える
8

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

于 2012-02-12T18:02:54.743 に答える
7

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

于 2015-07-02T08:11:50.253 に答える
6

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

NSLocalizedString(@"CONNECTIONERRORITLE",nil)

いつあるべきか

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)

最初の部分の最後の部分を見ると、「タイトル」ではなく「ITLE」と表示されています

于 2012-02-12T18:03:01.893 に答える
6

行の終わりにダブルセミコロンを書き込んだ場合、NSLocalizationは機能しません。';;'がある場合は、Localizable.stringsファイルを確認する必要があります。

于 2013-11-29T06:21:07.183 に答える
6

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

于 2014-07-07T19:47:18.433 に答える
5

SDKを開発しているとき。追加の操作が必要です。

1)YourLocalizeDemoSDKで通常どおりLocalizable.stringsを作成します。

2)YourLocalizeDemoに同じLocalizable.stringsを作成します。

3)YourLocalizeDemoSDKのバンドルパスを見つけます。

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すると、間違った値が取得されます(実際には、キーと同じ文字列になります)。

ただし、 drOXで説明されている文字列拡張子を使用する場合。もう少しやる必要があります。オリジン拡張子は次のようになります。

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}

ご存知のとおり、SDKを開発しておりBundle.main、YourLocalizeDemoのバンドルを取得します。それは私たちが望んでいることではありません。YourLocalizeDemoSDKのバンドルが必要です。これはすぐに見つけるためのトリックです。

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

それが役に立てば幸い。

于 2018-07-05T02:08:21.543 に答える
4

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

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

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

于 2013-07-24T17:06:28.603 に答える
3

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

于 2015-10-07T18:48:37.620 に答える
2

同様の問題に直面しました。突然、ローカライズ可能な文字列がまったく機能しなくなりました。それから私はfile-compareを古い.stringsコピーと比較しました、そしてついに私はその中のキーを誤って削除したことに気づきました。

したがって、フォーマットが間違っていると、Xcodeは文字列を読み取れません。

これは、 "Key"="Value";が期待する形式です。

于 2016-01-18T11:49:31.280 に答える
2

同様の問題の答えを探しているときにこれに遭遇したので、ここに解決策を残します。

キーに「\n」ではなく「\u2028」が含まれている場合、キーは常にキーのみを返し、値は返しません。ローカリゼーションのバグのようです。

于 2018-10-24T03:02:49.433 に答える
2

Localizable.stringsにすべてのキーが存在するにもかかわらず、一部のキーが値を取得しないという問題に対処していました。

ファイルを作成した開発者が1行に2つのセミコロンを追加したため、このファイルの解析が非常に不安定になったことがわかりました。

2つのセミコロンが隣り合っているのを見つけて、そのうちの1つを削除した後、アプリはコンパイルされなくなりました。この時点で、セミコロンのない行を見つけることができました。それらを修正し、アプリをコンパイルした後、すべての文字列が正常に機能しました。

したがって、同じ行に2つのセミコロンがあると、他の行にセミコロンがないにもかかわらず、ファイルがコンパイルされます。

Appleの.stringsファイル用パーサーは非常に原始的であるように見えます。

残念ながら、私たちの場合、plistリンターは役に立たなかった。この問題を見つけて修正するために、Localizable.stringsファイル(2000行を超える長さ)の内容全体をコピーして貼り付け、20行のチャンクにコピーして毎回コンパイルし始めました。リンターがキャッチできない問題を見つける唯一の方法でした。

于 2020-09-30T13:37:26.120 に答える
1

置く; Localizable.stringsファイルの行の終わり。

于 2014-02-04T11:11:36.130 に答える
1

シミュレーターの設定をリセットすることは私のために働いた。

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

于 2014-09-04T20:50:22.173 に答える
1

私の場合、プロジェクトをクリーンアップしようとしましたが、派生データの削除はまだ機能しません。文字列ファイルのいくつかの改行を削除してから、Xcodeが文字列を再度検索します。

于 2014-12-08T13:24:17.483 に答える
1

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

于 2015-08-19T19:55:28.147 に答える
1

ある言語が適切に機能し、他の言語が半分の時間機能し、別の時間はそのキーのローカライズ版ではなく、キーを取得しているときに問題が発生しました。

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

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

于 2018-12-13T18:01:29.053 に答える
0

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

于 2013-12-22T03:53:53.443 に答える
0

keyの前などに「@」を付けないでくださいvalue

@"key" = @"value";

それはちょうどあるべきです:

"key" = "value";

'@'は、キーにアクセスするときにのみキーの前に表示されます。

NSWebLocalizedString(@"key", @"label for coder");
于 2014-10-02T18:54:38.243 に答える
0

プロジェクトのクリーニングと再構築を試みましたか?

于 2015-04-30T16:38:24.257 に答える
0

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

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

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

于 2015-07-10T21:43:01.113 に答える
0

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

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

于 2018-03-14T08:38:28.390 に答える
0

スウィフト4:

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

var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")
于 2018-05-22T09:24:04.647 に答える
0

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

localizeファイルは。という名前で作成されましたmain.Stringsmain.Strings次に、 (追加された言語ごとに)ファイルを開き、名前localize.stringsを手動で変更してプロジェクトに1つずつ追加し、また、を削除しましたmain.strings

次に評価するのは、チェックです。あなたのファイル、すべてはkeysで終わる必要があり、すべてが正しく開かれ、閉じられている;ことを確認してください。quotes

そして、あなたは迅速な4で使用することができます:

myButon.setTitle(NSLocalizedString("forgotpassword.key", comment: ""), for: UIControlState.normal)
于 2018-09-14T00:32:49.943 に答える