2010-04-22 65 views
6

我需要在我的iPhone應用程序中使用多語言coredata數據庫。我可以爲每種語言創建不同的數據庫,但我希望在iphone sdk中存在一種自動的方式來管理不同語言核心數據(如資源和字符串)中的數據。核心數據中多語言數據的最佳實踐

有人有一些提示?

+1

上帝 - 還是好? :) – 2010-04-22 11:18:54

回答

11

我做了類似Shortseller的事情,但沒有使用類別。

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

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屬性短暫,但如果你做,你不能在謂語使用title

這種方法的好處在於對任何消費者來說,對多關係的實現都是透明的。您只需請求internationalBook.title,並且自定義訪問器根據用戶的場景設置在幕後返回適當的值。

+0

真的很有用謝謝戈登,我正在使用它。 – 2010-04-29 08:05:19

+0

非常好,但是當用戶更改語言環境時,您如何處理這種情況?恕我直言,要求用戶重新啓動應用程序是不禮貌的,但除此之外,爲了更新所有視圖控制器中所有提取和顯示的文本,必須完成大量工作。 – Centurion 2013-03-07 15:53:53

0

我已經爲核心數據實體生成了模型類。
然後我用函數定義了類別助手類來設置和獲取多語言屬性(例如名稱)。
因此,我有一個產品(例如代碼和價格)和一個ProductLanguage(具有語言和名稱屬性)實體。
我從不直接訪問ProductLanguage,但始終使用在產品模型(通過類別)上定義的名稱函數。這對我來說很好。

0

像戈登一樣,我使用非常相似的代碼,但沒有使用模型生成的書面文件。我在我想要顯示數據的.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]]; 
}