Swift包管理器本地化

Swift包管理器本地化,swift,localization,swift-package-manager,Swift,Localization,Swift Package Manager,我想知道,本地化如何与swift软件包配合使用。我看了WWDC20/10169视频-Swift软件包:资源和本地化。我正试图在我自己的项目中做同样的事情 如果我进行了与WWDC视频相同的配置,并将.environment(\.locale,locale(标识符:“es”))添加到视图预览中,它就会工作(但仅当在sp内部进行测试时) 当我尝试在实际应用程序中使用本地化资源时,问题就开始了。 这个过程非常简单——我只使用一个带有本地化字符串的视图,该字符串来自应用程序内部的包。出于测试目的,我使用特

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

如果我进行了与WWDC视频相同的配置,并将
.environment(\.locale,locale(标识符:“es”))
添加到
视图
预览中,它就会工作(但仅当在sp内部进行测试时)

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

我的舱单:

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\u bundle\u 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
文本(“欢迎”,Bundle:.module)

结果是一样的-它不会改变语言-我总是得到dev language-
en

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

这是一本书


那么我的问题是——我做错了什么?错误在哪里?

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

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