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
相关产品推荐
相关产品推荐

