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