【问题标题】:Swift package manager localizationSwift 包管理器本地化
【发布时间】:2021-03-18 15:56:52
【问题描述】:

我想知道,本地化如何与 swift 包配合使用。我看了 WWDC20/10169 视频 - Swift 包:资源和本地化。我正在尝试在自己的项目中做同样的事情。

如果我进行相同的配置(如 WWDC 视频)并将 .environment(\.locale, Locale(identifier: "es")) 添加到 View 预览,它可以工作(但仅在 sp 内测试时)。

当我尝试在实际应用程序中使用本地化资源时,问题就开始了。 这个过程非常简单——我只是使用来自应用程序包中的本地化字符串的视图。出于测试目的,我使用特定语言环境(方案设置)启动我的应用程序 - 结果,我总是得到en 翻译。

我的清单:

let package = Package(
  name: "MyLibrary",
  defaultLocalization: "en",
  platforms: [
    .iOS(.v14),
  ],
  products: [
    .library(
      name: "MyLibrary",
      targets: ["MyLibrary"]),
  ],
  dependencies: [
  ],
  targets: [
    .target(
      name: "MyLibrary",
      dependencies: [],
      path: "Sources"
    ),
    .testTarget(
      name: "MyLibraryTests",
      dependencies: ["MyLibrary"]),
  ]
)

包的结构:

resource_bundle_accessor 生成良好 - 所以我可以访问 Bundle.module,并且确实可以按预期列出所有本地化 - en 和 es。

我还在项目本身中添加了支持的语言:

这是一个快速演示:

为了生成本地化字符串,我想使用 SwiftGen:

extension L10n {
  private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String {
    let format = BundleToken.bundle.localizedString(forKey: key, value: nil, table: table)
    return String(format: format, locale: Locale.current, arguments: args)
  }
}

// swiftlint:disable convenience_type
private final class BundleToken {
  static let bundle: Bundle = {
    #if SWIFT_PACKAGE
    return Bundle.module
    #else
    return Bundle(for: BundleToken.self)
    #endif
  }()
}
// swiftlint:enable convenience_type

另外,我测试过

let text = NSLocalizedString("welcome", tableName: "Localizable", bundle: .module, value: "", comment: "")

或来自Bundle - Bundle.module.localizedString 方法和来自SwiftUI Text("welcome", bundle: .module) 的类似方法。

结果相同 - 它不会改变语言 - 我总是得到开发语言 - en。

我还可以确认,该构建包含本地化(在 lib 包中的 testLocalization.app 内):

这是link for project。

所以我的问题 - 我做错了什么?哪里出错了?

【问题讨论】:

    标签: swift localization swift-package-manager


    【解决方案1】:

    我找到了这个问题的原因 - 应用程序本身需要本地化并且在项目设置中设置它是不够的,相反,我们还应该在 info plist 中添加CFBundleLocalizations,并将所需的本地化作为字符串数组。即使在官方文档中说只支持少数本地化,我们也可以在那里添加额外的(使用与 lproj 文件夹相同的语言环境代码),一切都会正常工作。

    <key>CFBundleLocalizations</key>
    <array>
        <string>en</string>
        <string>es</string>
        <string>uk-UA</string>
    </array>
    

    来自过时的旧文档:

    应用程序可以通知系统它支持额外的 通过其信息属性列表 (Info.plist) 文件进行本地化。 指定未包含在包的 .lproj 中的本地化 目录,将 CFBundleLocalizations 键添加到此文件。价值 因为键是一个字符串数组,每个字符串都包含一个 ISO 语言指示符,如“语言和区域设置”中所述 指定。”

    像往常一样,Apple 没有在任何与 SP 相关的文档中提及这一点...

    -----更新

    正确的解决方案是“在应用程序的 Info.plist 中将 CFBundleAllowMixedLocalizations 设置为 YES 是正确的解决方案” - 来自SDGGiesbrecht

    【讨论】:

      猜你喜欢
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2018-12-08
      • 1970-01-01
      • 2020-08-11
      相关资源
      最近更新 更多