Основные данные + локализация - PullRequest
0 голосов
/ 17 октября 2018

У меня есть простой базовый объект данных «Задача для выполнения», который содержит атрибут типа String.Core Data модель заполняется из файла при первом запуске приложения, а атрибуты «Задача для выполнения» содержит следующие значения: «Выполнить», «Прогулка», «Спать» и т. Д.)

Я хочу локализовать атрибуты «Задача для выполнения» на разных языках, О.Но я не понимаю, как

  1. Как правильно сохранять внутри Core Data локализованные атрибуты для 3 языков (en, fr, es)?

  2. Как получить локализованные атрибуты из Core Data.Для опытаесли язык телефона установлен во Францию, вернуть "courir" вместо "Run"?

1 Ответ

0 голосов
/ 17 октября 2018

Сохранить в CoreData «ключи», «закрытый» набор ключей, например: "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
         }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...