You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS资源Bundle中本地化.strings文件无法加载非英文语言求助

iOS自定义本地化Bundle无法加载非英文资源的问题排查与解决

问题原因分析

  1. NSLocalizedString调用参数缺失:默认NSLocalizedString使用主Bundle和Localizable.strings表,若未明确指定bundle和tableName参数,会导致无法找到自定义Bundle内的myTexts.strings文件。
  2. 自定义Bundle未适配当前语言:直接通过Bundle(path:)初始化的是基础Bundle,不会自动根据系统语言切换到对应本地化子Bundle,始终读取默认语言(en)的资源。
  3. 资源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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:35:22