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

有人有提示吗?

最佳答案

我做了一些类似于Shortseller的事情,但是没有使用类别。

iphone - 核心数据中多语言数据的良好做法-LMLPHP
InternationalBookLocalizedBook都是具有一对多关系(一本国际图书到许多本地化图书)的自定义托管对象。

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;
}
[DataManager localeString]是一个类方法,它返回用户的语言和国家/地区代码:en_USfr_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属性设为 transient ,但是如果这样做,则不能在谓词中使用title

这种方法的好处是,对所有关系的实现对任何消费者都是透明的。您只需请求internationalBook.title,然后自定义访问器就会根据用户在幕后的语言环境返回适当的值。

关于iphone - 核心数据中多语言数据的良好做法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2689570/

10-16 17:48
查看更多