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

iOS应用内切换语言:Storyboard生效但Localized Strings失效求助

排查NSLocalizedString不生效的问题

我之前也碰到过一模一样的情况——Storyboard的语言切换系统帮你处理了,但代码里的NSLocalizedString得手动适配自定义语言包,毕竟它默认只会读取main bundle的默认语言资源。下面是几个关键排查点和解决方案:

1. 核心问题:NSLocalizedString默认不跟随自定义语言切换

系统的Storyboard本地化是通过自身机制单独处理的,但代码里的NSLocalizedString默认只会加载main bundle的语言文件,不会自动切换你选中的语言。你需要做两件事:

  • 保存当前选中的语言代码
  • 自定义一个本地化方法,从对应语言的bundle里读取字符串

示例代码改造

先写一个简单的本地化工具类,用来管理当前语言和读取对应资源:

class LocalizationHelper {
    // 用UserDefaults保存当前选中的语言
    static var currentLanguage: String {
        get { UserDefaults.standard.string(forKey: "CurrentAppLanguage") ?? "en" }
        set { UserDefaults.standard.set(newValue, forKey: "CurrentAppLanguage") }
    }
    
    // 自定义本地化方法,读取对应语言的bundle
    static func localized(_ key: String, comment: String = "") -> String {
        guard let bundlePath = Bundle.main.path(forResource: currentLanguage, ofType: "lproj") else {
            return key // 找不到对应语言包时返回键名
        }
        let languageBundle = Bundle(path: bundlePath) ?? Bundle.main
        return NSLocalizedString(key, tableName: nil, bundle: languageBundle, value: "", comment: comment)
    }
}

然后修改你的语言切换逻辑,更新保存的语言值:

fileprivate extension LoginViewController { 
    @IBAction func changeLanguage(_ sender: UIButton) { 
        if sender == currentBtn { return } 
        currentBtn?.backgroundColor = nil 
        switch sender { 
        case gbBtn: 
            LocalizationHelper.currentLanguage = "en"
        case rsBtn: 
            LocalizationHelper.currentLanguage = "sr"
        default: break 
        }
        currentBtn = sender 
        currentBtn?.backgroundColor = .white
        // 这里可以加个界面刷新逻辑,比如重新设置当前页面的代码本地化元素
        refreshLocalizedUI()
    }
    
    // 刷新当前页面的代码本地化UI
    func refreshLocalizedUI() {
        // 比如如果有代码设置的标签、按钮文字,在这里重新赋值
        // exampleLabel.text = LocalizationHelper.localized("example_key")
    }
}

最后替换弹窗里的NSLocalizedString:

@IBAction func alertAction(_ sender: Any) { 
    let alert = UIAlertController(
        title: LocalizationHelper.localized("pera"),
        message: LocalizationHelper.localized("toma"),
        preferredStyle: .alert
    ) 
    alert.addAction(UIAlertAction(title: LocalizationHelper.localized("stisni"), style: .default, handler: nil)) 
    self.present(alert, animated: true) 
}

2. 再核对Strings文件的配置细节

虽然Storyboard生效,但还是要确认:

  • en.lproj和sr.lproj文件夹都在项目根目录,里面的Localizable.strings文件存在,键名完全匹配(比如"pera" = "Your English Title";、"pera" = "Твој српски наслов";,注意引号和分号不能少,拼写大小写完全一致)
  • 检查Strings文件的Target Membership是否勾选了你的主应用target,否则编译时不会打包进app

3. 清理缓存(兜底方案)

如果以上都做了还是没生效,大概率是Xcode缓存问题:

  • 按Command+Shift+K清理Xcode缓存,重新编译
  • 删除模拟器/真机上的app,重新安装

内容的提问来源于stack exchange,提问作者MMDev11070

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:02:02