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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:45:02