在以下情况下会出现此问题:
- 你至少有两个文件
*/<locale>.lproj/<table_name>.strings
,例如两个文件*/en.lproj/Localizable.strings
*.strings
您的文件支持不止一种语言
您可能不会创建两个以上.strings
同名的文件。当您使用其资源中包含文件的外部库时,通常会发生此问题。您的Localizable.strings
资源中可能有Localizable.strings
文件- 这是 XCode 无法解决的冲突。
TL; 博士;一般提示:如果您创建一个库以供其他开发人员用作第三方代码,而不是创建Localizable.strings
文件并NSLocalizedString()
在其中使用,创建自定义命名的可本地化字符串表(例如MyLibName.strings
)并使用NSLocalizedStringFromTable
.
问题示例及详细描述:
我创建了一个“问题演示”存储库: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
table 是一组*/<locale>.lproj/<tableName>.strings
文件。在上面的示例中,有两个表,每个都命名Localizable
(表的默认名称)。
如果调用了一个表Localizable
,您可以通过使用从表中获取本地化字符串
`NSLocalizedString(key, optionalComment)`.
解决方案:
您可以合并这两个表(将对应的文件与相同语言的翻译连接起来)或更改其中一个表的名称。
第二种方法的示例(更改其中一个表的名称):
│ ├── 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)
。