核心数据中多语言数据的良好实践

Luc*_*tti 6 database iphone core-data

我需要在我的iPhone应用程序中使用多语言coredata数据库.我可以为每种语言创建不同的数据库但我希望在iphone sdk中存在一种自动方式来管理不同语言核心数据中的数据,例如资源和字符串.

有人有一些提示吗?

小智 11

我做过类似于Shortseller的事情,但没有使用类别.

alt text http://i40.tinypic.com/x3ryp.png

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;
}
Run Code Online (Sandbox Code Playgroud)

[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"];
Run Code Online (Sandbox Code Playgroud)

由于本地化标题存储在LocalizedBook托管对象中,因此可以使title属性成为瞬态,但如果这样做,则无法title在谓词中使用.

这种方法的好处在于,对多个关系的实现对任何消费者都是透明的.您只需请求internationalBook.title并且自定义访问者根据用户在幕后的区域设置返回适当的值.