我正在 SwiftUI 中进行本地化工作。我创建了包含几个条目的本地化文件,如下所示:
我创建了一个 LocalizedError ,如下所示:
enum NewDriverLicenseFormError: LocalizedError, Identifiable {
var id: UUID {
UUID()
}
case firstName
var errorDescription: String? {
switch self {
case .firstName:
return NSLocalizedString("First name cannot be empty.", comment: "")
}
}
我将预览区域设置更改为使用西班牙语:
#Preview("NewDriverLicenseScreen Spanish") {
NewDriverLicenseScreen()
.environment(\.locale, Locale(identifier: "es"))
}
当我运行 NewDriverLicenseScreen(视图)时,名字以西班牙语显示,但 ValidationSummaryView 中显示的错误消息不以西班牙语显示。
struct NewDriverLicenseScreen: View {
@State private var newDriverLicenseForm = NewDriverLicenseForm()
var body: some View {
Form {
TextField("First name", text: $newDriverLicenseForm.firstName)
Button("Submit") {
if newDriverLicenseForm.validate() {
}
}
ValidationSummaryView(errorMessages: newDriverLicenseForm.errorMessages)
}
}
}
struct ValidationSummaryView: View {
let errorMessages: [NewDriverLicenseFormError]
var body: some View {
ForEach(errorMessages) { errorMessage in
Text(errorMessage.localizedDescription)
}
}
}
任何想法!
NSLocalizedString
不知道 SwiftUI 的 EnvironmentValues
。它仅在设备的区域设置上运行。
您可以向错误类型添加
LocalizedStringKey
属性。将其赋予 Text
将正确定位字符串,因为 Text
知道 EnvironmentValues
。
var localisationKey: LocalizedStringKey {
switch self {
case .firstName:
return "First name cannot be empty."
}
这将自动在字符串目录中生成一个条目。
用途:
ForEach(errorMessages) { errorMessage in
Text(errorMessage.localisationKey)
}