如何在 Swift UI 中实现本地化

Ole*_*h H 27 localization ios swift swiftui xcode11.1

有谁能够帮助我?我在 Swift UI 中找不到任何关于本地化的描述。任何人都可以提供建议或更好地举例说明如何本地化Text()吗?

LuL*_*aGa 45

当您查看文档时Text您会发现它的初始值设定项中LocalizedStringKey没有 a String

init(_ key: LocalizedStringKey, tableName: String? = nil, bundle: Bundle? = nil, comment: StaticString? = nil)
Run Code Online (Sandbox Code Playgroud)

它使本地化变得非常简单。您所要做的就是:

  • 创建一个“字符串文件”类型的新文件,将其命名为 Localizable.strings
  • 选择新文件并导航到右侧面板中的文件检查器,然后单击本地化...
  • 将您的项目文件转到 Localizations 部分并将另一种语言添加到列表中 - Xcode 将为您创建本地化文件

当您选择您时,Localizable.strings您将看到它包含原始语言和您刚刚添加的语言的文件。这就是您放置翻译的地方,即键 - 本地化文本对。

如果你有这样的文字是你的应用程序:

Text("Hello World!")
Run Code Online (Sandbox Code Playgroud)

您现在必须添加到您Localizable.strings的翻译中:

对于您的基本语言:

"Hello World!" = "Hello World!";
Run Code Online (Sandbox Code Playgroud)

以及您的第二语言(在本例中为德语):

"Hello World!" = "Hallo Welt!";
Run Code Online (Sandbox Code Playgroud)

要查看本地化的预览,您可以像这样定义它们:

struct ContentViewView_Previews: PreviewProvider {

    static var previews: some View {
        ForEach(["en", "de"], id: \.self) { id in
            ContentView()
                .environment(\.locale, .init(identifier: id))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现了问题@LuLuGaGa。事实证明,我并没有像我所说的那样严格遵守指示。我的本地化字符串文件位于子文件夹中。把它放在项目级别,效果很好 (5认同)
  • 还发现(我认为)调用字符串文件除 *Localized* 之外的任何内容都意味着它不起作用 (5认同)

c r*_*ald 12

有一件事你可能会做错,但在我见过的任何解释中都没有说得很清楚。事实证明, Text("hello") 仅在您传递给它一个literal时才被解释为一个本地化键。如果传递 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!"
Run Code Online (Sandbox Code Playgroud)

  • 如果 cap2 有动态值的占位符,那么我们将如何传递该值,例如让 cap2: LocalizedStringKey = "hello %@"。显示字符串“Hello ABC”,其中 ABC 是动态值 (2认同)

Mik*_*Lee 7

您可以简单地将字符串包装在 LocalizedStringKey 中,然后再将其传递给 Text()。

\n\n

Localized.strings 文件:

\n\n
"Dismiss" = "\xe5\x85\xb3\xe9\x97\xad";\n"Cancel" = "\xe5\x8f\x96\xe6\xb6\x88";\n
Run Code Online (Sandbox Code Playgroud)\n\n

SwiftUI视图文件:

\n\n
Text(LocalizedStringKey("Dismiss"))\n
Run Code Online (Sandbox Code Playgroud)\n


Ole*_*h H 6

对于 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"))
    }
}
Run Code Online (Sandbox Code Playgroud)

这是 .strings 文件中的一个例子

"selectLanguage" = "Select language";
"languagesList" = "Languages list";
Run Code Online (Sandbox Code Playgroud)

结果在这里:

截屏


Ram*_*mis 6

要本地化您的应用程序,您需要:

  1. 使用 SwiftUI 元素,例如:Text("Nice")。Nice 成为 Localized.strings 中的关键。
  2. 如果文本不在 SwiftUI 元素中,则需要使用NSLocalizedString
  3. 选择您的应用程序目标。
  4. 导出本地化:编辑->导出本地化...
  5. 将导出的文件提供给翻译人员。
  6. 导入翻译:编辑->导入本地化...