この問題は次の場合に発生します。
- 少なくとも 2 つのファイルが あります
*/<locale>.lproj/<table_name>.strings
。たとえば、2 つのファイルがあります。*/en.lproj/Localizable.strings
*.strings
ファイルで複数の言語をサポートしている
おそらく.strings
、同じ名前で 2 つ以上のファイルを作成することはないでしょう。この問題は通常、リソースにファイルがある外部ライブラリを使用する場合に発生します。Localizable.strings
おそらくリソースLocalizable.strings
にファイルがあり、それが XCode が解決できない競合です。
TL; DR; 一般的なヒント:他の開発者がサード パーティ コードとして使用するライブラリを作成する場合は、ファイルを作成してその中で使用する代わりに、カスタム名のローカライズ可能な文字列テーブル (例: ) を作成して使用します。Localizable.strings
NSLocalizedString()
MyLibName.strings
NSLocalizedStringFromTable
問題の例と詳細な説明:
「problem-demo」リポジトリを作成しました: https://github.com/kajot/LocalizedStringsMergingFailure
特に、他のすべての実行に失敗するテスト: https://github.com/kajot/LocalizedStringsMergingFailure/blob/master/LocalizedStringsMergingFailureTests/LocalizedStringsMergingFailureTests.m
│ ├── KJAppDelegate.h
│ ├── KJAppDelegate.m
│ ├── Localizations1
│ │ ├── de.lproj
│ │ │ └── Localizable.strings
│ │ └── en.lproj
│ │ └── Localizable.strings
│ ├── Localizations2
│ │ ├── de.lproj
│ │ │ └── Localizable.strings
│ │ └── en.lproj
│ │ └── Localizable.strings
OTHERビルドごとに、XCode はLocalizable.strings
バンドル内に破損したファイルを作成します。解決策: 同じ名前の複数のLocalizedString
テーブルを同じターゲットに作成/追加しないでください。
LocalizedString
テーブルは一連の*/<locale>.lproj/<tableName>.strings
ファイルです。上記の例では、2 つのテーブルがあり、それぞれに名前が付けられLocalizable
ています (テーブルのデフォルト名)。
テーブルが呼び出された場合Localizable
、次を使用してテーブルからローカライズされた文字列を取得します
`NSLocalizedString(key, optionalComment)`.
解決:
これらの 2 つのテーブルをマージする (対応するファイルを同じ言語からの翻訳で連結する) か、テーブルの 1 つの名前を変更することができます。
2 番目のアプローチの例 (テーブルの 1 つの名前を変更):
│ ├── KJAppDelegate.h
│ ├── KJAppDelegate.m
│ ├── Localizations1
│ │ ├── de.lproj
│ │ │ └── Localizable.strings
│ │ └── en.lproj
│ │ └── Localizable.strings
│ ├── Localizations2
│ │ ├── de.lproj
│ │ │ └── NewTableName.strings
│ │ └── en.lproj
│ │ └── NewTableName.strings
NewTableName
これで、 を使用して新しいテーブル ( ) から翻訳を取得し、 を使用NSLocalizedStringFromTable(key, @"NewTableName", optionalComment)
して「元の」テーブル ( Localizable
)から翻訳を取得できますNSLocalizedString(key, optionalComment)
。