如何在 Swift UI 中实现本地化
How to implement localization in Swift UI
有人可以帮助我吗?我在 Swift UI 中找不到任何关于本地化的描述。任何人都可以提供建议或更好的如何本地化的示例 Text()
?
当您查看 documentation for Text
时,您会发现它需要 LocalizedStringKey
而不是 String
进入其初始化程序:
init(_ key: LocalizedStringKey, tableName: String? = nil, bundle: Bundle? = nil, comment: StaticString? = nil)
它使本地化变得非常简单。您所要做的就是:
- 创建一个“字符串文件”类型的新文件,将其命名为
Localizable.strings
- select 新文件并导航至右侧面板中的文件检查器并单击本地化...
- 转到您的项目文件的“本地化”部分,然后将另一种语言添加到列表中 - Xcode 将为您创建本地化文件
当您 select 您 Localizable.strings
您会看到它包含原始语言和您刚刚添加的语言的文件。那就是你放置翻译的地方,即键 - 本地化文本对。
如果您有这样的文字,这就是您的应用:
Text("Hello World!")
您现在必须在 Localizable.strings
中添加您的翻译:
您的基础语言:
"Hello World!" = "Hello World!";
以及您的第二语言(在本例中为德语):
"Hello World!" = "Hallo Welt!";
要查看本地化的预览,您可以这样定义它们:
struct ContentViewView_Previews: PreviewProvider {
static var previews: some View {
ForEach(["en", "de"], id: \.self) { id in
ContentView()
.environment(\.locale, .init(identifier: id))
}
}
}
对于swift UI 文件,您只需从本地化.strings 文件中插入字符串键
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Text("selectLanguage")
Text("languagesList")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.environment(\.locale, .init(identifier: "en"))
}
}
这是 .strings 文件中的示例
"selectLanguage" = "Select language";
"languagesList" = "Languages list";
结果在这里:
要本地化您的应用,您需要:
- 使用 SwiftUI 元素,例如:Text("Nice")。尼斯成为 Localizable.strings.
中的关键
- SwiftUI元素中没有文本的情况需要使用NSLocalizedString.
- Select 您的应用目标。
- 导出本地化:编辑 -> 导出本地化...
- 将导出的文件交给译员。
- 导入翻译:编辑 -> 导入本地化...
要在SwiftUI中使用Localazable,可以这样执行:
导入 SwiftUI 以在您的文件中使用 LocalizedStringKey
//MARK: - File where you enum your keys to your Localized file
enum ButtonName: LocalizedStringKey {
case submit
case cancel
}
//MARK: - Your Localized file where are your translation
"submit" = "Submit is pressed";
"cancel" = "Cancel";
//MARK: - In your code
let submitButtonName = ButtonName.submit.rawValue
let cancelButtonName = ButtonName.cancel.rawValue
VStack {
Text(submitButtonName)
Text(cancelButtonName)
}
您可以简单地将字符串包装在 LocalizedStringKey 中,然后再将其提供给 Text()。
Localizable.strings 文件:
"Dismiss" = "关闭";
"Cancel" = "取消";
SwiftUI 视图文件:
Text(LocalizedStringKey("Dismiss"))
有些事情你可能会做错,但我看到的任何解释都没有说得很清楚。事实证明,只有当您将 文字 传递给它时,Text("hello") 才会被解释为本地化键。如果您传递一个 String 类型的变量,则不会发生这种情况。答案是将变量声明为 LocalizedStringKey 类型。
Text("hello") //-> implicitly treats string literal as a key; looks up and displays "Hello World!"
let cap1:String = "hello"
Text(cap1) //-> no lookup for explicit String variable; just displays "hello"
let cap2:LocalizedStringKey = "hello"
Text(cap2) //-> looks up explicit LocalizedStringKey value; displays "Hello World!"
我创建了这个自定义 SwiftUI 文本
struct Localized: View {
var text: String
var arg: Any?
var body: some View {
if let arg = arg {
if let arg = arg as? [Any] {
Text(String(format: NSLocalizedString(text, comment: ""), arg.compactMap({String(describing:[=10=])}).joined(separator: " ")).replacingOccurrences(of: "(null)", with: ""))
} else {
Text(String(format: NSLocalizedString("\(text) %@", comment: ""), String(describing: arg)))
}
} else {
Text(LocalizedStringKey(text))
}
}
}
用法:
Localized(text: "hello")
Localized(text: "this %@ %@", arg: [4, "a"])
有人可以帮助我吗?我在 Swift UI 中找不到任何关于本地化的描述。任何人都可以提供建议或更好的如何本地化的示例 Text()
?
当您查看 documentation for Text
时,您会发现它需要 LocalizedStringKey
而不是 String
进入其初始化程序:
init(_ key: LocalizedStringKey, tableName: String? = nil, bundle: Bundle? = nil, comment: StaticString? = nil)
它使本地化变得非常简单。您所要做的就是:
- 创建一个“字符串文件”类型的新文件,将其命名为
Localizable.strings
- select 新文件并导航至右侧面板中的文件检查器并单击本地化...
- 转到您的项目文件的“本地化”部分,然后将另一种语言添加到列表中 - Xcode 将为您创建本地化文件
当您 select 您 Localizable.strings
您会看到它包含原始语言和您刚刚添加的语言的文件。那就是你放置翻译的地方,即键 - 本地化文本对。
如果您有这样的文字,这就是您的应用:
Text("Hello World!")
您现在必须在 Localizable.strings
中添加您的翻译:
您的基础语言:
"Hello World!" = "Hello World!";
以及您的第二语言(在本例中为德语):
"Hello World!" = "Hallo Welt!";
要查看本地化的预览,您可以这样定义它们:
struct ContentViewView_Previews: PreviewProvider {
static var previews: some View {
ForEach(["en", "de"], id: \.self) { id in
ContentView()
.environment(\.locale, .init(identifier: id))
}
}
}
对于swift UI 文件,您只需从本地化.strings 文件中插入字符串键
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Text("selectLanguage")
Text("languagesList")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.environment(\.locale, .init(identifier: "en"))
}
}
这是 .strings 文件中的示例
"selectLanguage" = "Select language";
"languagesList" = "Languages list";
结果在这里:
要本地化您的应用,您需要:
- 使用 SwiftUI 元素,例如:Text("Nice")。尼斯成为 Localizable.strings. 中的关键
- SwiftUI元素中没有文本的情况需要使用NSLocalizedString.
- Select 您的应用目标。
- 导出本地化:编辑 -> 导出本地化...
- 将导出的文件交给译员。
- 导入翻译:编辑 -> 导入本地化...
要在SwiftUI中使用Localazable,可以这样执行:
导入 SwiftUI 以在您的文件中使用 LocalizedStringKey
//MARK: - File where you enum your keys to your Localized file
enum ButtonName: LocalizedStringKey {
case submit
case cancel
}
//MARK: - Your Localized file where are your translation
"submit" = "Submit is pressed";
"cancel" = "Cancel";
//MARK: - In your code
let submitButtonName = ButtonName.submit.rawValue
let cancelButtonName = ButtonName.cancel.rawValue
VStack {
Text(submitButtonName)
Text(cancelButtonName)
}
您可以简单地将字符串包装在 LocalizedStringKey 中,然后再将其提供给 Text()。
Localizable.strings 文件:
"Dismiss" = "关闭";
"Cancel" = "取消";
SwiftUI 视图文件:
Text(LocalizedStringKey("Dismiss"))
有些事情你可能会做错,但我看到的任何解释都没有说得很清楚。事实证明,只有当您将 文字 传递给它时,Text("hello") 才会被解释为本地化键。如果您传递一个 String 类型的变量,则不会发生这种情况。答案是将变量声明为 LocalizedStringKey 类型。
Text("hello") //-> implicitly treats string literal as a key; looks up and displays "Hello World!"
let cap1:String = "hello"
Text(cap1) //-> no lookup for explicit String variable; just displays "hello"
let cap2:LocalizedStringKey = "hello"
Text(cap2) //-> looks up explicit LocalizedStringKey value; displays "Hello World!"
我创建了这个自定义 SwiftUI 文本
struct Localized: View {
var text: String
var arg: Any?
var body: some View {
if let arg = arg {
if let arg = arg as? [Any] {
Text(String(format: NSLocalizedString(text, comment: ""), arg.compactMap({String(describing:[=10=])}).joined(separator: " ")).replacingOccurrences(of: "(null)", with: ""))
} else {
Text(String(format: NSLocalizedString("\(text) %@", comment: ""), String(describing: arg)))
}
} else {
Text(LocalizedStringKey(text))
}
}
}
用法:
Localized(text: "hello")
Localized(text: "this %@ %@", arg: [4, "a"])