如何在类中存储可通过Localizable String翻译的字符串
解决分类名称翻译问题的方案
直接初始化时使用本地化字符串
你完全可以在类的数组初始化中用String(localized:),和你其他部分的写法逻辑一致。先在Localizable.strings文件中添加对应分类名称的键值对,比如:
// Localizable.strings(中文示例) "Lodging" = "住宿"; "Food" = "餐饮"; "Airfare" = "机票";
然后修改CategoryModel的初始化代码,把硬编码的分类名替换为本地化字符串:
@MainActor @Observable final class CategoryModel { var catItem = [ Category(catNum: 0, catName: String(localized: "Lodging"), catBudget: 0, catPix: "bed.double.fill", catInUse: false, catCustom: false), Category(catNum: 1, catName: String(localized: "Food"), catBudget: 0, catPix: "cart", catInUse: false, catCustom: false), Category(catNum: 2, catName: String(localized: "Airfare"), catBudget: 0, catPix: "airplane", catInUse: false, catCustom: false), // ... 其他分类项 ] }
这种方式适配你的场景——用户可选择启用/禁用分类,但基础分类列表固定的情况。初始化时就会根据当前系统语言加载对应的翻译文本。
支持动态切换语言的进阶写法
如果你的APP需要支持不重启就能切换语言,上面的写法就不够了(初始化时的翻译不会自动更新)。这时可以把分类名的本地化key单独存储,用计算属性动态获取翻译:
- 修改
Category结构体,存储本地化key而非翻译后的文本:
struct Category { let catNum: Int let catNameKey: String // 存储Localizable中的键 var catBudget: Double let catPix: String var catInUse: Bool let catCustom: Bool // 动态获取当前语言的翻译 var catName: String { String(localized: catNameKey) } }
- 更新
CategoryModel的初始化代码:
@MainActor @Observable final class CategoryModel { var catItem = [ Category(catNum: 0, catNameKey: "Lodging", catBudget: 0, catPix: "bed.double.fill", catInUse: false, catCustom: false), Category(catNum: 1, catNameKey: "Food", catBudget: 0, catPix: "cart", catInUse: false, catCustom: false), Category(catNum: 2, catNameKey: "Airfare", catBudget: 0, catPix: "airplane", catInUse: false, catCustom: false), // ... 其他分类项 ] }
这样每次访问catName时,都会根据当前语言环境返回最新的翻译,语言切换后无需重新初始化数组就能看到更新后的分类名。
自定义分类的处理说明
如果后续要支持用户自定义分类,这类名称通常不需要翻译(直接保留用户输入的原始文本即可)。你可以通过catCustom字段区分系统默认分类和用户自定义分类,只对系统分类应用上述本地化逻辑。
内容的提问来源于stack exchange,提问作者Galen Smith
相关产品推荐
相关产品推荐

