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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:57:36