2010-07-22 19 views
17

Tôi có một ứng dụng mà tôi đang dịch sang nhiều ngôn ngữ khác nhau. Vấn đề là các ứng dụng sẽ có một vài giá trị khác nhau ở Úc hơn sẽ ở New Zealand, đó là cả hai nước nói tiếng Anh.Bản địa hóa ứng dụng iPhone - Các sự cố tiếng Anh?

Tôi đã tạo tệp ngôn ngữ en_AU và en_NZ nhưng cả hai đều sử dụng tệp tiếng Anh chuẩn. Tôi đã xóa tệp ngôn ngữ tiếng Anh, nhưng nó vẫn tiếp tục xảy ra ...

Bất kỳ ý tưởng nào về cách tôi có thể làm việc này?

Cảm ơn bạn,

--d

+0

xóa tệp tiếng Anh gây ra nhiều sự cố ... Tôi có nhiều ngôn ngữ khác đang hoạt động, nhưng khi tôi muốn sử dụng cùng một ngôn ngữ nhưng cho các vùng khác nhau, nó không hoạt động: S – dewberry

Trả lời

37

Bản địa hoá iPhone (hoặc là tin cục bộ?) Không chịu bất cứ thông báo về khu vực các bộ sử dụng (ví dụ, UK, Aus, NZ). Chỉ có một bản dịch tiếng Anh "" có sẵn theo mặc định. Tuy nhiên, bạn có thể hack xung quanh với những thứ để buộc nó sử dụng một cài đặt dịch thuật khác - Tôi vừa thực hiện việc này để chọn giữa "tiếng Anh" (Mỹ) và "en_GB" (tiếng Anh của Anh).

Trong file main.m của bạn, thay đổi nó để nó trông giống như dưới đây (đặt trong các thử nghiệm của riêng bạn cho NZ hoặc AU)

int main(int argc, char *argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

// Set up the locale jiggery pokery 
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0]; 
NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode]; 
if ([language isEqualToString:@"en"] && [locale isEqualToString:@"GB"]) { 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en_GB", @"en", nil] forKey:@"AppleLanguages"]; 
} 

int retVal = UIApplicationMain(argc, argv, nil, nil); 
[pool release]; 
return retVal; 

}

này bật ngôn ngữ người sử dụng (ví dụ: " vi ") vào ngôn ngữ NSString và miền địa phương của người dùng (ví dụ: NZ, GB, AU) vào miền địa phương NSString. Nếu chúng (trong trường hợp của tôi) phù hợp với vi và GB, thì tôi đặt cài đặt tùy chọn ngôn ngữ mặc định của người dùng thành "en_GB", sau đó "vi".

Sau đó, trong các đại biểu ứng dụng ứng dụng của bạn: Phương pháp didFinishLaunchingWithOptions bạn muốn loại bỏ NSUserDefaults cài đặt bạn chỉ cần đặt với mã

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"]; 

Đó là an toàn để loại bỏ vào thời điểm này bởi vì tất cả các gói khởi động đã được hoàn thành. Bây giờ, ứng dụng của bạn sẽ sử dụng tệp Localization.strings trong thư mục en_GB.lproj.

Đó là một chút của một giải pháp khủng khiếp, hacky, nhưng nó hoạt động cho tôi.

+0

, nó hoạt động cho tôi ... nó chỉ hoạt động! tuyệt vời, cảm ơn bạn! – dewberry

+0

Cảm ơn câu trả lời này. Thực sự đã giúp tôi ở đây để giải quyết vấn đề của tôi. – AppAspect

+0

Cảm ơn NSString * language = [[NSLocale preferredLanguages] objectAtIndex: 0]; – CReaTuS

4

Apple documents this missing iOS feature here.

Chú ý: Trong iOS, giao diện bó không dùng tiếng địa phương hoặc kịch bản thông tin vào tài khoản khi tìm kiếm các nguồn lực địa phương; chỉ mã trình chỉ định ngôn ngữ là được xem xét. Do đó, nếu dự án của bạn bao gồm dự án cụ thể theo ngôn ngữ thư mục có cả ngôn ngữ và chỉ định khu vực, những thư mục đó sẽ bị bỏ qua. Giao diện gói trong Mac OS X hỗ trợ người thiết kế khu vực trong dự án cụ thể theo ngôn ngữ thư mục.

14

Tôi đã nghĩ ra một phiên bản được cải thiện một chút về câu trả lời được chấp nhận của rickerbh. Điều đầu tiên để nhận ra là mặc định của người dùng được sắp xếp thành các tên miền và khóa @"AppleLanguages" không đến từ tên miền của ứng dụng, nhưng từ một số miền cao hơn cấp bậc của miền.Điều này có nghĩa là hoàn toàn an toàn khi xóa nó khỏi các giá trị mặc định của người dùng:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

Sau khi gọi mã này, bạn sẽ nhận thấy rằng gọi số [defaults objectForKey:@"AppleLanguages"] vẫn trả về giá trị. Vì vậy, thay vì xóa @"AppleLanguages" vào một thời điểm nào đó sau này, điều này có thể gặp sự cố tùy thuộc vào độ phức tạp của ứng dụng, bạn muốn làm ngược lại: xóa @"AppleLanguages" ngay lập tức. Về cơ bản, điều này đặt lại giá trị mặc định của nó và nắm bắt bất kỳ thay đổi nào đối với hệ thống đã tạo, ví dụ, nếu người dùng đã thay đổi ngôn ngữ ưa thích của mình.

Dưới đây là những gì tôi làm:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults removeObjectForKey:@"AppleLanguages"]; 

NSMutableArray *appleLanguages = [[defaults objectForKey:@"AppleLanguages"] mutableCopy]; 
NSString *region = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode]; 
NSArray *languages = [appleLanguages filteredArrayUsingPredicateFormat:@"not (self contains '-')"]; 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    [appleLanguages removeObject:languageAndRegion]; 
} 
for (NSString *language in languages) { 
    NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region]; 
    NSInteger index = [appleLanguages indexOfObject:language]; 
    [appleLanguages insertObject:languageAndRegion atIndex:index]; 
} 
[defaults setObject:appleLanguages forKey:@"AppleLanguages"]; 

(. Lưu ý rằng filteredArrayUsingPredicateFormat: là một phương pháp mở rộng, tôi đã viết Đó không phải là khoa học tên lửa để tìm ra những gì nó làm hoặc làm thế nào nó hoạt động.)

Điều này tạo ra tin cục bộ cho mọi ngôn ngữ trong danh sách được kết hợp với vùng của người dùng. Ví dụ: nếu danh sách gốc là es en en-GB và vùng của người dùng là AU, chúng tôi sẽ nhận được es-AU es en-AU en en-GB. Lưu ý rằng es-AU không tồn tại, nhưng nó không có sự khác biệt. Vì ứng dụng không tìm thấy các bản địa hóa hoặc tài nguyên liên quan, ứng dụng này chỉ bỏ qua nó.

+1

Với ios 8.1, đây là giải pháp. – Mike

+0

Điều này có vẻ chắc chắn. Một điều cần thêm, @selector (filterArrayUsingPredicateFormat :) là một phương thức danh mục trên NSArray mà bạn có thể tìm thấy ở đây: https://github.com/huguesbr/library-ios/blob/master/Categories/NSArray%2BFilteredSortedShortcuts.m –

+0

Ngoài ra , nơi nào bạn đặt này trong mã của bạn: trong ứng dụng đại biểu hoặc chức năng "chính" của bạn? –

0

Tôi đã gặp vấn đề tương tự với tiếng Đức và nghĩ rằng tôi đã tìm thấy giải pháp "đúng". Sai lầm là, ban đầu ngôn ngữ cơ sở của tôi chỉ là "tiếng Đức (de)", khi thêm nội địa hóa "Đức/Áo (de_AT)", các tập tin bị bỏ qua. Khi thay đổi ngôn ngữ cơ sở thành "tiếng Đức/Đức (de_DE)", bản dịch tiếng Austrian không bị bỏ qua.

0

Đáng chú ý ở đây XCode rất gây hiểu lầm - bạn có thể chuyển đến Dự án (không phải Mục tiêu), Thông tin, Bản địa hóa, nhấn nút + xuất hiện trong danh sách ngôn ngữ, sau đó cuộn xuống cuối danh sách ngôn ngữ xuất hiện trong cửa sổ bật lên cho đến khi bạn chuyển sang "Khác" (có mũi tên phải bên cạnh nó), điều này sẽ mở ra một danh sách lớn đẹp bao gồm các biến thể khu vực cho ngôn ngữ. Tuy nhiên, các biến thể khu vực này không hoạt động trên iPhone - bạn không nhận được bất kỳ thứ gì (như được tài liệu hóa bởi Apple và được tham chiếu trong một câu trả lời khác xuất hiện ở đây). Rõ ràng một trong những giải pháp dựa trên mã được liệt kê ở trên là cần thiết.

Các vấn đề liên quan