2012-06-27 35 views
27

Tôi gặp phải một số sự cố khi bản địa hóa một ứng dụng Đan Mạch được thực hiện. (Ngôn ngữ, không phải bánh ngọt)Bản địa hóa menu Cắt | Sao chép | Dán trên iOS

Tôi đã đặt CFBundleDevelopmentRegion thành da_DK cho danish trong info.plist của tôi, nhưng cửa sổ xuất hiện cho nhập văn bản vẫn bằng tiếng Anh, ngay cả trên điện thoại chạy hệ điều hành danish.

enter image description here

Làm cách nào để đặt tên công việc, tôi có thể thay đổi điều này?

Thiết bị thử nghiệm là iPhone 4S không bẻ khóa chạy iOS 5.1 với tiếng Đan Mạch làm cài đặt iOS và tài khoản iTunes itunes liên kết.

Tôi không sử dụng .xibs cho thiết kế. tất cả các giao diện được lập trình dưới dạng bộ điều khiển xem.

+0

nên thay đổi khi bạn thay đổi điện thoại, đây là trường hợp lạ mắt –

+0

Đúng vậy. Đã khởi động lại thiết bị nhiều lần, và như bạn thấy từ bàn phím, ngôn ngữ cho iphone là danish ... Tò mò ... –

+0

Hehe! Thật buồn cười! Có lẽ bạn nên gửi một báo cáo sự cố cho Apple về điều này? – Neeku

Trả lời

33

Trong cây tệp của Xcode (Project Navigator), hãy chọn dự án của bạn. trong khung bên phải, hãy chọn lại dự án của bạn. chọn Thông tin và thêm ngôn ngữ của bạn.

configure i18n


Tôi tạo ra một sample project, đây là kết quả:

enter image description here

+0

Xin chào, +1 cho goind phương pháp khoa học về điều này, nhưng bạn có thể thử bao gồm các tệp .strings bị thiếu mà thiếu từ repo git không? các InfoPlist.strings đang thiếu tiếng Đức, Thổ Nhĩ Kỳ và Đan Mạch ... –

+0

Tôi đã sửa lỗi đó và thêm một cuộc gọi NSLocalizedString. Tôi đổi tên InfoPlist thành Localizable.strings, tên mặc định. Tôi không biết, tại sao Xcode lại chọn một tên khác. – vikingosegundo

+0

Nó đã làm các trick:] Gracias, Tak và cảm ơn bạn –

-1

Tìm kiếm nếu tệp .xib của bạn được bản địa hóa (bạn sẽ tìm thấy nó trong thanh tra trên bảng bên phải) nếu như vậy, hãy đi tới Project/Target-Settings của bạn nhấn + -Sign và chọn "Duplicate English to Danish" hoặc một cái gì đó có nghĩa là giống nhau (Tôi không thể kiểm tra đúng mục tại thời điểm này)

Btw nó được gọi là iPhone 4S.

+0

Tôi không sử dụng .xibs cho thiết kế. tất cả các giao diện được lập trình dưới dạng bộ điều khiển xem. –

+0

Thế còn MainWindow.xib thì sao? –

+0

như đã nói, tôi không sử dụng trình tạo giao diện. Im lập trình xây dựng tất cả các chế độ xem của tôi. –

2

Bạn phải khoanh vùng ứng dụng của bạn trong Đan Mạch để làm cho các yếu tố giao diện người dùng tiêu chuẩn xuất hiện trong ngôn ngữ đó. Điều này là để tránh có một giao diện người dùng với các ngôn ngữ hỗn hợp.

Nếu bạn không sử dụng xib, bạn thường làm điều này bằng cách thêm tệp Localizable.strings vào dự án của bạn. Trong hộp thoại "Add File" của Xcode, bạn có thể sử dụng mẫu "Strings File" (dưới "Resources") cho điều này.

Để thực sự bản địa hoá các tập tin chuỗi, mở thanh tra tập tin (1) và nhấp vào nút + trong phần "Localization". Bạn sẽ kết thúc với tệp đang được hiển thị dưới dạng một nhóm trong trình điều hướng dự án, với một mục con cho mỗi ngôn ngữ.

Các tập tin chuỗi có định dạng:

"Label_Text" = "Smørrebrød"; 

(đừng quên dấu chấm phẩy)

Để sử dụng dây cục bộ trong mã của bạn, bạn có thể sử dụng NSLocalizedString vĩ mô như thế này:

myLabel.text = NSLocalizedString(@"Label_Text", nil); 

(Tham số thứ hai là để nhận xét. Điều này có thể hữu ích nếu bạn sử dụng công cụ genstrings để trích xuất các chuỗi có thể định địa chỉ từ mã của bạn và cung cấp cho r chuyển tập tin tới một dịch giả chuyên nghiệp.)

Nếu bạn sử dụng chuỗi tiếng Anh làm khóa, bạn có thể để phiên bản tiếng Anh Localizable.strings trống (nhưng không xóa nó).

Có tệp Localizable.strings bằng ngôn ngữ mà người dùng đã chọn cũng sẽ gây ra các phần tử giao diện người dùng chuẩn, chẳng hạn như menu chỉnh sửa, bộ chọn ảnh, v.v., để xuất hiện bằng ngôn ngữ đó.

2

Nếu bạn không thể làm cho nó hoạt động theo cách chính thức, như được cung cấp bởi @vikingosegundo, bạn có thể làm điều này với một số kỹ thuật sáng tạo (Sáng tạo như trong, oh my god nguy hiểm). Tôi đã phát hiện ra phương pháp này khi tôi vô tình overrode [NSBundle localizedStringForKey:value:tableName:].

1) Thêm một thể loại để NSBundle với các phương pháp sau:

#import <objc/runtime.h> 

+ (void) load { 
    Method original, swizzled; 

    original = class_getInstanceMethod(self, @selector(localizedStringForKey:value:table:)); 
    swizzled = class_getInstanceMethod(self, @selector(swizzled_localizedStringForKey:value:table:)); 
    method_exchangeImplementations(original, swizzled); 
} 

- (NSString*) swizzled_localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName { 

    NSLog(@"Key: %@. Value: %@", key, value); 

    return [self swizzled_localizedStringForKey: key value:value table:tableName]; 
} 

2) Trong trường hợp tôi chỉ cần đăng nhập chìa khóa/giá trị, bạn muốn đặt một if ([key isEqualToString: xxx]) chặn. Trong đó, bạn muốn bắt (ít nhất một số) các giá trị khóa sau: Cắt, Sao chép [Menu], Chọn, Chọn Tất cả, Dán, Xóa [Menu], Thay thế ..., Xác định, Nói, Tạm dừng. Đây là những giá trị mặc định có thể xuất hiện ở đó.

3) Khi bạn đã bắt được giá trị bạn có thể tra cứu trong bảng tùy chỉnh hoặc sử dụng giá trị được mã hóa cứng. Nếu bạn tra cứu trong một bảng tùy chỉnh, hãy chắc chắn rằng bạn đã nắm bắt được trong phương thức bị lu mờ của bạn để tránh việc lặp vô hạn trong bảng tùy chỉnh của bạn.

NB: Tại sao bạn cần phải tráo trở? Bởi vì điều này vượt qua tất cả văn bản của Apple cho ứng dụng của bạn. Bạn sẽ vẫn muốn các giá trị mặc định cho tất cả các chuỗi khác, vì vậy bạn cần phải chuyển sang chế độ mặc định cho các chuỗi mà bạn không quan tâm.

Chúc may mắn. Paul

2

Thử thêm/đặt cờ "Tài nguyên bản địa hóa có thể được trộn lẫn" trong Info.plist thành YES.

2

Bạn có thể thực hiện việc này trực tiếp trong info.plist. Một cái gì đó như thế này:

<key>CFBundleDevelopmentRegion</key> 
<string>en</string> 
<key>CFBundleLocalizations</key> 
<array> 
    <string>en</string> 
    <string>de</string> 
    <string>es</string> 
    <string>ja</string> 
</array>  
Các vấn đề liên quan