M1芯片设备中自定义bundle的Localized String无法加载问题咨询
核心问题背景
自定义authorization bundle已完成资源访问权限注册,包含所有支持语言对应的
Localized.strings文件,设备首选语言返回正常,仅Locale.current始终返回En,且问题仅出现在M1(arm64)设备,Intel架构运行完全正常。
可能成因
- 通用包(Universal Binary)资源打包配置错误
项目打包时若针对x86_64和arm64架构做了资源拆分配置,可能出现arm64架构的切片漏拷*.lproj本地化目录、或Localized.strings被错误分配到仅x86_64架构的资源分组的情况。你可以右键bundle选择「显示包内容」,或通过lipo -info <your_bundle_path>命令检查不同架构切片下的资源完整性。 - Info.plist 本地化配置兼容性问题
arm64架构下的系统框架对自定义bundle的本地化查找规则和x86_64存在差异:若你的bundle未在Info.plist中显式将CFBundleAllowMixedLocalizations设置为YES,且主App的本地化支持列表与bundle的支持列表不匹配,arm64运行时会忽略bundle的自定义本地化配置,直接回退到英文作为默认locale。 - 原生arm64进程的环境变量读取逻辑差异
Intel架构下的程序若通过Rosetta转译运行,系统会自动继承全局用户语言环境变量;而原生arm64运行的程序会独立读取进程级语言配置。如果你的代码中直接依赖Locale.current读取系统语言,没有显式指定bundle的本地化查找逻辑,arm64运行时会优先读取bundle自身的CFBundleDevelopmentRegion配置而非系统全局配置,导致始终返回英文。 - Foundation 框架接口的架构适配缺陷
部分旧版Foundation的Locale相关API在arm64架构下存在兼容性问题:若你的bundle使用Bundle.main.localizedString系列API读取本地化字符串,没有显式指定目标bundle实例和对应的locale参数,会出现arm64架构下locale读取异常。可通过显式指定查找逻辑验证:// 优先取系统首选语言而非Locale.current let targetLocale = Locale(identifier: Locale.preferredLanguages.first ?? "en") let localizedStr = yourBundle.localizedString(forKey: "your_key", value: nil, table: nil)
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

