2010-04-22 32 views
6

tôi cần một db coredata đa ngôn ngữ trong ứng dụng iphone của mình. Tôi có thể tạo cơ sở dữ liệu khác nhau cho mỗi ngôn ngữ nhưng tôi hy vọng rằng trong sdk iphone tồn tại một cách tự động để quản lý dữ liệu trong dữ liệu lõi ngôn ngữ khác nhau như cho các nguồn lực và chuỗi.Thực hành tốt cho dữ liệu đa ngôn ngữ trong Dữ liệu chính

Ai đó có một số gợi ý?

+1

Thiên Chúa - hoặc tốt? :) –

Trả lời

11

Tôi đã làm điều gì đó tương tự như Shortseller, nhưng không sử dụng danh mục.

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

InternationalBookLocalizedBook là cả hai đối tượng tùy chỉnh quản lý với một mối quan hệ một-nhiều (một cuốn sách quốc tế để nhiều sách địa phương).

Trong việc thực hiện InternationalBook, tôi đã thêm một accessor tùy chỉnh cho 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] là một phương pháp học mà trả về ngôn ngữ và mã quốc gia của người dùng: en_US, fr_FR, vv Xem tài liệu hướng dẫn trên NSLocale để biết chi tiết.

Xem phần "Phương thức thuộc tính tùy chỉnh và phương pháp truy cập mối quan hệ một-một" của Hướng dẫn lập trình dữ liệu cốt lõi để được giải thích về willAccessValueForKey:didAccessValueForKey:.

Khi điền dữ liệu, tôi lấy một chuỗi đại diện cho ngôn ngữ hiện tại của người dùng ([DataManager localeString]) và lưu trữ cùng với tiêu đề sách được bản địa hóa trong đối tượng LocalizedBook mới. Mỗi cá thể LocalizedBook được thêm vào NSMutableSet, thể hiện mối quan hệ một-nhiều.

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"]; 

Kể từ khi danh hiệu cục bộ đang được lưu trữ trong đối tượng LocalizedBook quản lý, bạn có thể làm cho title thuộc tính một thoáng qua, nhưng nếu bạn làm điều đó bạn không thể sử dụng title trong một vị ngữ.

Điều tốt đẹp về cách tiếp cận này là việc thực hiện mối quan hệ nhiều-nhiều là minh bạch đối với bất kỳ người tiêu dùng nào. Bạn chỉ cần yêu cầu internationalBook.title và trình truy cập tùy chỉnh trả về giá trị thích hợp dựa trên ngôn ngữ của người dùng đằng sau hậu trường.

+0

Thực sự hữu ích cảm ơn bạn Gordon, tôi đang sử dụng nó. –

+0

Tuyệt vời, nhưng làm cách nào để bạn quản lý tình huống khi người dùng thay đổi ngôn ngữ? IMHO yêu cầu người dùng khởi động lại ứng dụng là thô lỗ, nhưng nếu không thì phải thực hiện rất nhiều công việc để cập nhật tất cả văn bản được tìm nạp và hiển thị trong tất cả các trình điều khiển chế độ xem. – Centurion

0

Tôi đã tạo các lớp mô hình cho các thực thể dữ liệu cốt lõi.
Sau đó, tôi đã xác định các lớp trình trợ giúp danh mục có chức năng để đặt và nhận các thuộc tính đa ngôn ngữ (ví dụ: tên).
Vì vậy, tôi có một Sản phẩm (ví dụ: mã và giá) và thực thể ProductLanguage (với ngôn ngữ và tên thuộc tính).
Tôi không bao giờ truy cập trực tiếp ProductLanguage, nhưng luôn sử dụng chức năng tên được xác định trên mô hình Sản phẩm (qua danh mục). Điều này đã làm việc tốt cho tôi sofar.

0

Giống như Gordon, tôi sử dụng mã tương tự, nhưng không sử dụng các tệp văn bản được tạo bởi mô hình. Tôi sử dụng mã này trong tập tin .m của tôi, nơi tôi muốn hiển thị dữ liệu.
Như tôi đã bắt đầu từ Apple mẫu, tôi đặt mã này chính xác trong
- (void) configureCell: (UITableViewCell *) tế bào atIndexPath: (NSIndexPath *) indexPath
của TableViewController.m tôi

P.S: Chỉ cần hiểu, tôi sử dụng các tiền tố này: tbl_ cho các bảng (thực thể), rel_ cho các mối quan hệ, fld_ cho các trường (thuộc tính).

Hy vọng điều này sẽ hữu ích.

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]]; 
} 
Các vấn đề liên quan