Swift开发如何让主项目与私有Pod共用同一Localizable.strings文件
共用本地化资源的落地方案
你的Core模块思路完全可行,以下是可直接落地的全流程配置:
1. Core 私有Pod配置本地化资源
首先在Core模块的podspec文件中添加资源配置,将所有本地化文件打包到独立的Bundle中,避免和主项目/其他Pod资源冲突:
s.resource_bundles = { 'Core' => ['Core/Sources/Resources/**/*.lproj'] }
注意不要使用s.resources配置,资源包独立隔离可以有效避免同名资源覆盖问题,所有语言的Localizable.strings统一放到Core模块对应.lproj目录下即可。
2. 封装跨模块通用的本地化读取方法
在Core模块内部封装兼容应用内切语言的读取工具,其他模块不需要关心资源路径,直接调用公共方法即可:
// 用于定位Core模块自身的Bundle private final class CoreBundleMarker {} private var coreResourceBundle: Bundle { // 先读取Core模块的主Bundle,再找内部打包的Core资源包 guard let resourceBundleURL = Bundle(for: CoreBundleMarker.self).url(forResource: "Core", withExtension: "bundle"), let resourceBundle = Bundle(url: resourceBundleURL) else { assertionFailure("Core资源包加载失败,fallback到主Bundle") return .main } return resourceBundle } /// 全局通用本地化读取方法,支持应用内自定义语言切换 public func appLocalized(_ key: String, comment: String = "") -> String { // 适配应用内手动切换语言的逻辑,优先读用户手动选择的语言包 if let customLanguage = UserDefaults.standard.string(forKey: "UserSelectedLanguage"), let langBundlePath = coreResourceBundle.path(forResource: customLanguage, ofType: "lproj"), let langBundle = Bundle(path: langBundlePath) { return NSLocalizedString(key, bundle: langBundle, comment: comment) } // 无自定义语言时读系统当前语言 return NSLocalizedString(key, bundle: coreResourceBundle, comment: comment) }
3. 适配SwiftGen配置
修改SwiftGen的配置文件swiftgen.yml,指定读取Core模块的本地化文件,生成全局可访问的公共枚举:
strings: inputs: Core/Sources/Resources/en.lproj/Localizable.strings outputs: templateName: structured-swift5 output: Core/Sources/Generated/L10n.swift params: # 生成的代码权限设为public,供其他模块调用 publicAccess: true # 指定使用Core模块内部的资源包读取资源 bundle: coreResourceBundle
配置完成后执行SwiftGen生成代码,所有模块都可以用L10n.xxx.xxx的语法直接调用本地化文案,和你之前的使用习惯完全一致。
4. 其他私有Pod和主项目适配
- 所有业务私有Pod(Authentication、网络层等)在各自的
podspec中添加Core依赖:s.dependency 'Core' - 删除各Pod原有的独立本地化文件,所有新增文案统一在Core模块的
Localizable.strings中维护 - 原有Pod内的本地化调用替换为Core提供的
appLocalized方法或者自动生成的L10n枚举即可
注意事项
- 应用内切换语言完成后,建议发送全局通知,所有展示文案的页面监听通知后刷新UI,即可实现全App文案同步切换
- 所有文案统一维护避免了多Pod重复配置、翻译不一致的问题,新增语言只需要在Core模块添加对应
.lproj目录即可全局生效
内容的提问来源于stack exchange,提问作者Bad_Developer
相关产品推荐
相关产品推荐

