iOS SwiftUI:不修改应用当前Locale,获取本地化字符串及检查存在性
SwiftUI中指定语言获取本地化翻译+检查翻译存在性
核心思路
NSLocalizedString默认依赖系统当前Locale,没法直接指定目标语言。要解决这个问题,我们可以直接读取对应语言的.lproj资源文件夹里的Localizable.strings文件,解析出所有键值对——这样既能自由指定语言获取翻译,也能快速检查某个键有没有被本地化过。
实现工具类
写个LocalizationManager工具类,封装加载、缓存、查询的逻辑,方便全局调用:
1. 加载指定语言的本地化字典
import Foundation class LocalizationManager { // 缓存已加载的字典,避免重复读文件浪费性能 private static var cachedDictionaries: [String: [String: String]] = [:] /// 获取指定语言的所有本地化键值对 /// - Parameter langCode: 语言代码(比如"en"、"zh-Hans") /// - Returns: 键值对字典,加载失败返回空 static func getLocalizedDict(for langCode: String) -> [String: String] { // 先查缓存 if let cached = cachedDictionaries[langCode] { return cached } // 找到对应语言的lproj文件夹路径,加载资源包 guard let lprojPath = Bundle.main.path(forResource: langCode, ofType: "lproj"), let langBundle = Bundle(path: lprojPath), let localizedDict = langBundle.localizedStringDictionary else { cachedDictionaries[langCode] = [:] return [:] } cachedDictionaries[langCode] = localizedDict return localizedDict } /// 获取指定语言下某个键的翻译 /// - Parameters: /// - key: 本地化键 /// - langCode: 语言代码 /// - Returns: 翻译后的字符串,找不到就返回key本身 static func getString(for key: String, langCode: String) -> String { let dict = getLocalizedDict(for: langCode) return dict[key] ?? key } }
2. 检查键是否在任意本地化资源中存在
给工具类加个扩展,遍历所有支持的语言,检查目标键是否存在:
extension LocalizationManager { /// 检查某个本地化键是否在任意语言的资源中存在 /// - Parameter key: 要检查的键 /// - Returns: 存在返回true,否则false static func isKeyLocalizedAnywhere(_ key: String) -> Bool { // 获取项目支持的所有语言 guard let supportedLangs = Bundle.main.localizations else { return false } for lang in supportedLangs { // 跳过Base本地化(如果有的话) guard lang != "Base" else { continue } let dict = getLocalizedDict(for: lang) if dict.keys.contains(key) { return true } } return false } }
SwiftUI里的使用示例
获取指定语言的翻译
直接调用工具类方法,在View里展示不同语言的翻译:
struct ContentView: View { var body: some View { VStack(spacing: 20) { Text(LocalizationManager.getString(for: "welcome_msg", langCode: "en")) Text(LocalizationManager.getString(for: "welcome_msg", langCode: "zh-Hans")) } .padding() } }
检查键是否已本地化
比如在设置页或者调试页里展示检查结果:
struct LocalizationCheckView: View { let testKey = "welcome_msg" var body: some View { Text("\(testKey):\(LocalizationManager.isKeyLocalizedAnywhere(testKey) ? "已本地化" : "未本地化")") .padding() } }
注意点
- 确保项目里对应语言的
.lproj文件夹存在,且里面有Localizable.strings文件 - 语言代码要和文件夹名称完全匹配(比如
zh-Hans.lproj对应代码"zh-Hans") - 缓存机制能提升性能,如果需要动态更新本地化资源,可以清空
cachedDictionaries重新加载
内容的提问来源于stack exchange,提问作者Serhii R
相关产品推荐
相关产品推荐

