ios 如何在Swift UI中实现本地化

siv3szwd  于 12个月前  发布在  iOS
关注(0)|答案(8)|浏览(168)

有人能帮帮我吗?我在Swift UI中找不到任何关于本地化的描述。任何人都可以请给予建议或更好的例子,如何本地化,例如Text()

wb1gzix0

wb1gzix01#

当你查看Textdocumentation时,你可以看到它将LocalizedStringKey而不是String带入其初始化器:

init(_ key: LocalizedStringKey, tableName: String? = nil, bundle: Bundle? = nil, comment: StaticString? = nil)

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

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

当您选择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))
        }
    }
}
5us2dqdw

5us2dqdw2#

有一件事你可以做错了,这是不是很清楚,在任何解释我见过。事实证明,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!"
j7dteeu8

j7dteeu83#

在将字符串交给Text()之前,您可以简单地将其 Package 在LocalizedStringKey中。
可本地化的.strings文件:

"Dismiss" = "关闭";
"Cancel" = "取消";

SwiftUI视图文件:

Text(LocalizedStringKey("Dismiss"))
p5cysglq

p5cysglq4#

对于swift UI文件,您只需要从localization.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";

结果在这里:

ykejflvf

ykejflvf5#

要本地化您的应用,您需要:
1.使用SwiftUI元素,如:Text(“Nice”). Nice成为Localizable. strings中的键。
1.如果SwiftUI元素中没有text,则需要使用NSLocalizedString
1.选择您的应用程序目标。
1.出口本地化:编辑->导出本地化...
1.将导出的文件给予翻译人员。
1.导入翻译:编辑->导入本地化...

vktxenjb

vktxenjb6#

要在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)
}
ttcibm8c

ttcibm8c7#

我创建了这个自定义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:$0)}).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"])
kq0g1dla

kq0g1dla8#

来自WWDC 2023的新消息:String Catalog

相关问题