核心数据+本地化
Posted
技术标签:
【中文标题】核心数据+本地化【英文标题】:Core data + localization 【发布时间】:2018-10-17 10:50:54 【问题描述】:我有一个简单的核心数据实体“要执行的任务”,其中包含字符串类型的属性。
Core Data
模型是在首次应用启动时从文件中预填充的,“要执行的任务”属性包含以下值:
跑步、走路、睡觉等。
我想将“要执行的任务”属性本地化为不同语言(Fr、Es)。但我不明白怎么做
如何在Core Data
中正确保存 3 种语言(英语、法语、西班牙语)的本地化属性?
如何从 Core Data 获取本地化属性。对于经验。如果手机语言设置为法国返回“courir”而不是“Run”?
【问题讨论】:
保存本地化的key,就像一个“类型”。检索它,并使用let stringToShow = NSLocalizedString("attributedFromCoreDataName", "")
将其显示给用户或添加扩展以将 CoreData 的“密钥”转换为 Localizable.strings
中的密钥
我是核心数据的新手。您能否更详细地解释需要做什么?
你至少知道如何使用本地化字符串吗?
是的。我已经本地化了我的 UI 元素和变量。
然后在 Core Data 中保存一个近距离的字符串。翻译应该在 CoreData 之外完成
【参考方案1】:
保存到 CoreData “keys”,一组“封闭”的键,例如:
"Run"
, "Walk"
, "Sleep"
.
在您的 Localizable.strings 中:
英语:
"SomeKeyForRun" = "Run";
"SomeKeyForWalk" = "Walk";
"SomeKeyForSleep" = "Sleep";
法语:
"SomeKeyForRun" = "Courir";
"SomeKeyForWalk" = "Marcher";
"SomeKeyForSleep" = "Dormir";
等等
为您的实体创建一个扩展并将其添加为方法/计算变量
extension MyCoreDataEntity
func localizedActivityName() -> String
switch(myCoreDataEntityProperty)
case "Run":
return NSLocalizedString("SomeKeyForRun")
case "Walk":
return NSLocalizedString("SomeKeyForWalk")
case "Sleep":
return NSLocalizedString("SomeKeyForSleep")
default:
return myCoreDataEntityProperty //or "Unknown Activity" etc.
当你想显示活动时:
let activityLocalized: String = myCoreDataEntity.localizedActivityName()
如果情况太多,您可以决定构建密钥的模式,并在 Localizable.strings
中这样做按照我选择的命名约定:
extension MyCoreDataEntity
func localizedActivityName() -> String
return NSLocalizedString("SomeKeyFor" + myCoreDataEntityProperty)
补充说明,我们无法猜测翻译是否存在(例如,如果您忘记了翻译或未管理翻译)。
如果没有找到翻译,我们可以做的是翻译值应该与键相同。这就是为什么有一些命名键的约定也是有用的。有些以__ModuleWhereItSUsed_Key
开头,总是大写,等等。
extension MyCoreDataEntity
func localizedActivityName() -> String
let key = "SomeKeyFor" + myCoreDataEntityProperty
let translation = NSLocalizedString("SomeKeyFor" + myCoreDataEntityProperty)
if key == translation
return myCoreDataEntityProperty //Or "Unknown Activity", default value, etc.
else
return translation
【讨论】:
感谢您的帮助。现在核心数据里面有 20 个键,但几天后我们会再添加 130 个键,也许将来我们会添加更多的词。维护这样的代码将非常困难(使用 switch 语句场景)。 也许在 localizables String 中命名您的 var,使其始终具有相同的模式,并且包含您放入 CoreData 中的“键”。在我的例子中,它可能是:let localizableKey = "SomeKeyFor" + myCoreDataEntityProperty; return NSLocalizedString(localizableKey)
以上是关于核心数据+本地化的主要内容,如果未能解决你的问题,请参考以下文章
核心数据更改是不是反映在本地 NSManagedObject 子类变量中?