我需要在我的iPhone應用程序中使用多語言coredata數據庫。我可以爲每種語言創建不同的數據庫,但我希望在iphone sdk中存在一種自動的方式來管理不同語言核心數據(如資源和字符串)中的數據。核心數據中多語言數據的最佳實踐
有人有一些提示?
我需要在我的iPhone應用程序中使用多語言coredata數據庫。我可以爲每種語言創建不同的數據庫,但我希望在iphone sdk中存在一種自動的方式來管理不同語言核心數據(如資源和字符串)中的數據。核心數據中多語言數據的最佳實踐
有人有一些提示?
我做了類似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;
}
[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
,並且自定義訪問器根據用戶的場景設置在幕後返回適當的值。
真的很有用謝謝戈登,我正在使用它。 – 2010-04-29 08:05:19
非常好,但是當用戶更改語言環境時,您如何處理這種情況?恕我直言,要求用戶重新啓動應用程序是不禮貌的,但除此之外,爲了更新所有視圖控制器中所有提取和顯示的文本,必須完成大量工作。 – Centurion 2013-03-07 15:53:53
我已經爲核心數據實體生成了模型類。
然後我用函數定義了類別助手類來設置和獲取多語言屬性(例如名稱)。
因此,我有一個產品(例如代碼和價格)和一個ProductLanguage(具有語言和名稱屬性)實體。
我從不直接訪問ProductLanguage,但始終使用在產品模型(通過類別)上定義的名稱函數。這對我來說很好。
像戈登一樣,我使用非常相似的代碼,但沒有使用模型生成的書面文件。我在我想要顯示數據的.m文件中使用此代碼。
當我從蘋果開始模板,我把這段代碼恰好
- (空)configureCell:(*的UITableViewCell)單元atIndexPath:(NSIndexPath *)indexPath
我TableViewController.m的
P.S:爲了理解,我使用這些前綴:表(實體)爲tbl_,關係爲rel_,字段(屬性)爲fld_。
希望這會有所幫助。
NSSet *sourceSet = [NSSet setWithArray:[[tbl_MainTable rel_Localization]allObjects]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"fld_Locale == %@", [[NSLocale preferredLanguages] objectAtIndex:0]];
NSSet *filteredSet = [sourceSet filteredSetUsingPredicate:predicate];
//NSLog(@"%@", filteredSet); NSLog(@"%@", [[filteredSet valueForKey:@"fld_Name"] anyObject]);
if ([filteredSet count] > 0)
{
[cell.detailTextLabel setText:[[filteredSet valueForKey:@"fld_Name"] anyObject]];
}
上帝 - 還是好? :) – 2010-04-22 11:18:54