
自定义view中的字符串不能自动加入Localizable.xcstrings文件中,自定义代码:
css
import SwiftUI
struct FeatureCard: View {
var title: String
var systemImage: String
var color: Color
var body: some View {
VStack {
Image(systemName: systemImage)
.font(.system(size: 30))
.foregroundColor(color)
.padding(.bottom, 8)
Text(title)
.font(.system(size: 14, weight: .medium))
.multilineTextAlignment(.center)
}
.frame(width: 100, height: 100)
.background(.ultraThinMaterial)
.cornerRadius(15)
.shadow(color: .black.opacity(0.1), radius: 5, x: 0, y: 2)
}
}
你当前定义中:
var title: String 这正是导致 Xcode 无法自动将这些字符串提取到 Localizable.xcstrings 的核心原因。
🧠 原理再强调一下:
Xcode 的 String Catalog 只能自动收集 SwiftUI 中使用 Text("字符串字面量") 或 LocalizedStringKey 的字符串。
你现在传进去的是 String 类型(虽然你传的是字面量),但因为类型是 String,SwiftUI 会自动调用 Text(verbatim:) 初始化器,而这个是不参与本地化提取的。
✅ 正确写法:
改成 LocalizedStringKey 请将 title: String 改成:
var title: LocalizedStringKey
这是 SwiftUI 专门为本地化设计的类型。
改完后你的 FeatureCard 组件如下:
less
struct FeatureCard: View {
var title: LocalizedStringKey // ✅ 改这里
var systemImage: String
var color: Color
var body: some View {
VStack {
Image(systemName: systemImage)
.font(.system(size: 30))
.foregroundColor(color)
.padding(.bottom, 8)
Text(title) // ✅ 这样才会被 Xcode 编译器识别为可本地化的 key
.font(.system(size: 14, weight: .medium))
.multilineTextAlignment(.center)
}
.frame(width: 100, height: 100)
.background(.ultraThinMaterial)
.cornerRadius(15)
.shadow(color: .black.opacity(0.1), radius: 5, x: 0, y: 2)
}
}
调用的时候什么都不需要改,你依然可以这样写:
less
FeatureCard(title: "提取资源", systemImage: "square.and.arrow.down", color: .blue)
🧪 检查是否生效的方法:
-
✅ 清理工程(Product → Clean Build Folder)
-
✅ 重新构建项目(Cmd + B)
-
✅ 在 Xcode 的左侧导航栏中找到 Localizable.xcstrings,检查是否已经自动添加了 "提取资源"、"海外素材" 等字符串。
-
❗注意不要使用字符串拼接、格式化等方式传参(这会打破静态分析)。
✨ 额外建议(增强维护性):
为了更好地维护和集中管理你这些本地化 Key,建议你可以额外定义一个 enum 或 struct:
csharp
struct LocalizedKeys {
static let extractResources = LocalizedStringKey("提取资源")
static let overseasMaterial = LocalizedStringKey("海外素材")
static let xhsLivePhoto = LocalizedStringKey("红薯实况图")
// ...其他key
}
然后调用时使用:
less
FeatureCard(title: LocalizedKeys.extractResources, systemImage: "square.and.arrow.down", color: .blue)
更易于管理和本地化多语言版本。