Хорошие методы для нескольких данных языка в Базовых Данных

мне нужен многоязычный coredata дб в моем приложении для iPhone. Я мог создать другую базу данных для каждого языка, но я надеюсь, что в iPhone sdk существуют автоматически способ управлять данными в различных данных ядра языка как для ресурсов и строки.

У кого-то есть некоторые подсказки?

6
задан Peter Hosey 9 May 2010 в 06:15
поделиться

2 ответа

Я сделал что-то похожее на Shortseller, но без использования категорий.

alt text

InternationalBook и LocalizedBook являются настраиваемыми управляемыми объектами с отношением «один ко многим» (одна международная книга ко многим локализованным книгам).

В реализации InternationalBook я добавил специальный метод доступа для title :

- (NSString *)title {
    [self willAccessValueForKey:@"title"];
    NSString *locTitle = nil;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"locale==%@", [DataManager localeString]];
    NSSet *localizedSet = [self.localizedBook filteredSetUsingPredicate:predicate];
    if ([localizedSet count] > 0) {
        locTitle = [[localizedSet valueForKey:@"localizedTitle"] anyObject];
    }
    [self didAccessValueForKey:@"title"];
    return locTitle;
}
{{1 }}

[DataManager localeString] - это метод класса, который возвращает язык и код страны пользователя: en_US , fr_FR и т. Д. Подробнее см. Документацию на NSLocale .

См. Раздел «Пользовательские атрибуты и методы доступа к однозначным отношениям» Руководства по программированию основных данных для объяснения willAccessValueForKey: и didAccessValueForKey: .

При заполнении данных я беру строку, представляющую текущий языковой стандарт пользователя ( [DataManager localeString] ), и сохраняю ее вместе с локализованным названием книги в новом объекте LocalizedBook . . Каждый экземпляр LocalizedBook добавляется в NSMutableSet , который представляет отношение «один ко многим».

NSMutableSet *bookLocalizations = [internationalBook mutableSetValueForKey:@"localizedBook"]; // internationalBook is an instance of InternationalBook
// set the values for locale and localizedTitle
LocalizedBook *localizedBook = (LocalizedBook *)[NSEntityDescription insertnNewObjectEntityForName:@"LocalizedBook" inManagedObjectContext:self.bookMOC];
localizedBook.locale = [DataManager localeString];
localizedBook.localizedTitle = theLocalizedTitle; // assume theLocalizedTitle has been defined.
[bookLocalizations addObject:localizedBook];
[bookLocalizations setValue:localizedBook forKey:@"localizedBook"];

Поскольку локализованные заголовки хранятся в управляемом объекте LocalizedBook , вы можете сделать атрибут title временным, но если вы это сделаете, вы не сможете использовать title в предикате.

Этот подход хорош тем, что реализация отношения ко многим прозрачна для любых потребителей. Вы просто запрашиваете internationalBook.title , и настраиваемый метод доступа возвращает соответствующее значение, зависящее от локали пользователя за кулисами.

11
ответ дан 9 December 2019 в 22:31
поделиться

Я создал классы моделей для основных сущностей данных.
Затем я определил вспомогательные классы категорий с функциями, которые нужно установить и получить многоязычные свойства (например, имя).
Итак, у меня есть Product (например, код и цена) и ProductLanguage (со свойствами языка и имени) Entity.
Я никогда не обращаюсь к ProductLanguage напрямую, но всегда использую функцию имени, определенную в модели продукта (через категорию). Это хорошо сработало для меня.

0
ответ дан 9 December 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: