SwiftUI本地化字符串LocalizedStringKey
SwiftUI本地化字符串LocalizedStringKey

SwiftUI本地化字符串LocalizedStringKey

LocalizedStringKey 是 SwiftUI 中用于本地化字符串的类型,可以直接传递给 Text 视图或其他视图来进行本地化。它比 String(localized:) 更方便,特别是在 Text 和按钮等视图中。

LocalizedStringKey 在 Localizable.strings 文件中定义本地化键值,并通过 Text 直接引用这些键。

创建 Localizable.strings 文件

在创建文件时,搜索“String Catalog”文件。

创建完成后,点击左下角添加需要本地化的语言,并设置本地化文字内容。

代码示例

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(spacing: 20) {
            // 直接使用字符串键
            Text("welcome")  // ✅ 自动使用 LocalizedStringKey 进行本地化
            
            // 使用 LocalizedStringKey 显式声明
            Text(LocalizedStringKey("goodbye"))
            
            // 使用动态键(变量)
            let key = "username"
            Text(LocalizedStringKey(key))  // ✅ 仍然可以解析
        }
        .padding()
    }
}

在使用ForEach等遍历时,可以直接使用LocalizedStringKey。

ForEach(countrys,id: \.self) { country in
    Text(LocalizedStringKey(country))
}

LocalizedStringKey vs String

LocalizedStringKey 会直接匹配 Localizable.strings 文件中的键进行本地化。

String 则不会自动进行本地化,需要使用 String(localized:) 或其他方法手动本地化。

// 使用 String 时不会自动本地化
let key = "welcome"
Text(key)  // 这里 key 是一个 String,不会进行本地化

// 显式使用 LocalizedStringKey
let key = "welcome"
Text(LocalizedStringKey(key))  // 这里 key 会进行本地化

动态本地化:使用变量

根据用户的输入或动态值进行本地化,可以将字符串作为 LocalizedStringKey 传递:

struct ContentView: View {
    let country = "China"  // 动态键
    
    var body: some View {
        Text(LocalizedStringKey(country))  // ✅ 通过 Localizable.strings 查找对应的本地化值
    }
}

使用 String(localized:) 进行插值

如果需要进行字符串插值并且希望本地化,可以使用 String(localized:tableName:bundle:):

let name = "张三"
Text(String(localized: "greeting", defaultValue: "Hello, %@!", arguments: [name]))

Localizable.strings 中:

"greeting" = "你好, %@!";

本地化按钮、文本字段等

LocalizedStringKey 也可以用于 Button、TextField 等其他视图:

Button("submit") {
    print("按钮点击")
}
// Localizable.strings
// "submit" = "提交";

TextField("placeholder", text: $text)
// Localizable.strings
// "placeholder" = "请输入内容";

结合 Text 的字符串插值

如果要在 Text 中进行插值并本地化,可以使用 Text(verbatim:):

let itemCount = 5
Text("items_count \(itemCount)")  // ❌ 不会自动本地化

// 使用带格式的方式
Text(String(localized: "items_count", arguments: [itemCount], defaultValue: "%d 个项目"))

// Localizable.strings
// "items_count" = "%d 个项目";

总结

LocalizedStringKey 直接用于 Text 等视图时,可以自动进行本地化。

如果有动态值或插值,可以使用 String(localized:) 进行本地化。

LocalizedStringKey 适用于静态和动态键,避免手动转换 String 的麻烦。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注