iOS资源Bundle中本地化.strings文件无法加载非英文语言求助
iOS自定义本地化Bundle无法加载非英文资源的问题排查与解决
问题原因分析
- NSLocalizedString调用参数缺失:默认
NSLocalizedString使用主Bundle和Localizable.strings表,若未明确指定bundle和tableName参数,会导致无法找到自定义Bundle内的myTexts.strings文件。 - 自定义Bundle未适配当前语言:直接通过
Bundle(path:)初始化的是基础Bundle,不会自动根据系统语言切换到对应本地化子Bundle,始终读取默认语言(en)的资源。 - 资源Bundle本地化配置遗漏:资源Bundle的target可能未添加捷克语(cs)本地化,或
myTexts.strings的cs语言版本未正确关联到Bundle target。
可行解决方案
1. 修正NSLocalizedString调用方式
必须明确指定自定义Bundle和对应的表名(myTexts),示例代码:
let key = "your_target_string_key" let localizedString = NSLocalizedString( key, tableName: "myTexts", bundle: yourCustomBundle, value: key, comment: "" )
2. 初始化适配当前语言的自定义Bundle
直接初始化的基础Bundle不会自动切换语言,需手动根据系统首选语言加载对应本地化子Bundle:
func loadLocalizedCustomBundle() -> Bundle { guard let baseBundlePath = Bundle.main.path(forResource: "TheBundleName", ofType: "bundle"), let baseBundle = Bundle(path: baseBundlePath) else { fatalError("Failed to load base custom bundle") } let preferredLanguages = Locale.preferredLanguages var localizedBundle = baseBundle for language in preferredLanguages { // 先尝试完整语言代码(如cs-CZ) if let lprojPath = baseBundle.path(forResource: language, ofType: "lproj"), let bundle = Bundle(path: lprojPath) { localizedBundle = bundle break } // 再尝试仅语言代码(如cs) guard let languageCode = language.components(separatedBy: "-").first else { continue } if let lprojPath = baseBundle.path(forResource: languageCode, ofType: "lproj"), let bundle = Bundle(path: lprojPath) { localizedBundle = bundle break } } return localizedBundle } // 使用示例 let customBundle = loadLocalizedCustomBundle()
3. 检查资源Bundle的本地化配置
- 打开资源Bundle的target,进入Info选项卡,在Localizations列表中确认已添加捷克语(cs)。
- 选中
myTexts.strings文件,打开右侧File Inspector,确认Localization部分已勾选cs,且对应的cs.lproj/myTexts.strings内容正确。 - 构建App后,右键App包选择显示包内容,检查
TheBundleName.bundle内是否存在cs.lproj目录,且目录下有myTexts.strings文件。
4. 测试注意事项
- 切换系统语言后,重启App(iOS语言切换后部分资源需重启才能加载)。
- 测试时可通过
localizedBundle.path(forResource: "myTexts", ofType: "strings")验证是否正确加载了cs语言的strings文件。
内容的提问来源于stack exchange,提问作者Tomáš Kafka
相关产品推荐
相关产品推荐

