核心数据+本地化

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)

以上是关于核心数据+本地化的主要内容,如果未能解决你的问题,请参考以下文章

StackMob 本地核心数据存储

核心数据更改是不是反映在本地 NSManagedObject 子类变量中?

核心数据 - 观察变化并注册本地通知

是否有可能推断上一次本地核心数据存储完全同步到 iCloud 的时间?

将本地核心数据数据库与 Web 服务同步

核心数据与 Ensembles 同步:在本地模型更改之前,不会拉下远程更改