2009-03-06 16 views
10

Tôi đang cố gắng tìm một cách có thể quản lý để dịch mọi chuỗi hiển thị trong ứng dụng iPhone. Tài liệu chính thức của Apple cho biết sử dụng các tệp .strings cho các chuỗi có lập trình, trong khi sử dụng tùy chọn "thêm tệp được bản địa hóa" được tích hợp trong xcode để bản địa hóa các tệp nib.Nội địa hóa IPhone: Có thể dịch các tệp nib dễ dàng mà không cần phải sao chép ngòi cho mỗi ngôn ngữ không?

Vấn đề tôi thấy với điều này là nếu giao diện người dùng cần thay đổi sau khi bản địa hóa xảy ra, thì chúng tôi sẽ cần phải cập nhật ngòi bút cho từng ngôn ngữ riêng lẻ ít hơn tối ưu. Có cách nào đơn giản hơn để có thể buộc các chuỗi được hiển thị trong các tệp nib với các giá trị có liên quan trong tệp .strings không? hoặc tôi sẽ phải lập trình phải thiết lập những chuỗi cho mỗi yếu tố ui (đó là tốt hơn một chút nhưng vẫn gây phiền nhiễu)?

Trả lời

3

Điều tốt nhất bạn có thể làm là đệ quy loop qua từng xem và sau đó thiết lập các văn bản trên họ:

static void translateView(NSBundle *bundle, UIView *view) 
{ 
    id idView = view; 
    if ([idView respondsToSelector:@selector(text)] && [view respondsToSelector:@selector(setText:)]) 
     [idView setText:[bundle localizedStringForKey:[idView text] value:nil table:nil]]; 
    if ([idView respondsToSelector:@selector(title)] && [view respondsToSelector:@selector(setTitle:)]) 
     [idView setTitle:[bundle localizedStringForKey:[idView title] value:nil table:nil]]; 
    if ([idView respondsToSelector:@selector(placeholder)] && [view respondsToSelector:@selector(setPlaceholder:)]) 
     [idView setPlaceholder:[bundle localizedStringForKey:[idView placeholder] value:nil table:nil]]; 
    if ([idView respondsToSelector:@selector(prompt)] && [view respondsToSelector:@selector(setPrompt:)]) 
     [idView setPrompt:[bundle localizedStringForKey:[idView prompt] value:nil table:nil]]; 
    if ([idView respondsToSelector:@selector(titleForState:)] && [view respondsToSelector:@selector(setTitle:forState:)]) 
     [idView setTitle:[bundle localizedStringForKey:[idView titleForState:UIControlStateNormal] value:nil table:nil] forState:UIControlStateNormal]; 
    if ([idView isKindOfClass:[UITabBar class]] || [idView isKindOfClass:[UIToolbar class]]) 
     for (UIBarItem *item in [idView items]) 
      [item setTitle:[bundle localizedStringForKey:[item title] value:nil table:nil]]; 
    for (UIView *subview in [view subviews]) 
     translateView(bundle, subview); 
} 

Cảnh báo: Bạn có thể của phải kiểm tra bộ khác của bộ chọn để bắt tất cả mọi thứ . Đây không phải là phương pháp hay nhất, nhưng có vẻ như ít công việc hơn

+0

Cách tiếp cận thú vị ; Tôi sẽ dùng thử khi ứng dụng của chúng tôi tiến triển nhiều hơn. – Kevlar

+0

Tôi thử điều này và nhận được một ngăn xếp tràn (tức là một vòng lặp vô hạn) – mamcx

+0

Xin lỗi, có một lỗi đánh máy trong dòng cuối cùng. Nó phải được dịchView (bundle, subview); thay vì dịchView (bó, xem); tất nhiên là – rpetrich

2

Tôi nghĩ bạn muốn đọc về công cụ dòng lệnh: ibtool. Nó sẽ đơn giản hóa những gì bạn đang muốn làm.

+1

Mặc dù nó giúp ích cho quá trình dịch, nó vẫn dẫn đến một tệp nib riêng biệt ở cuối mà tôi hy vọng tránh. cảm ơn cho con trỏ mặc dù. – Kevlar

+0

Tôi đã không sử dụng nó trước khi chúng tôi không bản địa hóa trong nhà. Tôi đã ấn tượng rằng bạn có thể sử dụng nó để 'giải nén' các tập tin vào một cái gì đó mà bạn có thể bản địa hóa và sau đó chèn lại vào tập tin nib. Các tập tin nib chắc chắn sẽ giúp với GUI mặc dù .. –

+0

ibtool sẽ có thể reintegrate chuỗi trở lại thành tập tin nib chính được thay đổi, để nhổ ra các tập tin nib mới có cả hai chuỗi mới và thay đổi nib mới. Xem "Thực hiện cập nhật bản địa hóa gia tăng" trong http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/IB_UserGuide/LocalizingNibFiles/LocalizingNibFiles.html#//apple_ref/doc/uid/TP40005344-CH13 – mahboudz

0

Có lẽ bạn nên cập nhật mọi chuỗi theo cách thủ công. Giả sử bạn có một mảng, hoặc một tệp xml, các chuỗi bằng các ngôn ngữ khác nhau, khi người dùng thay đổi ngôn ngữ chỉ nhận chuỗi đã dịch từ mảng và sau đó thay đổi nó thành giao diện người dùng.

Marco

15

Chương trình dòng lệnh tích hợp của Apple ibtool cho phép bạn thực hiện việc này. Bạn có thể đổ các chuỗi từ XIB, bản địa hoá chúng, sau đó tạo một XIB mới dựa trên XIB hiện có nhưng sử dụng các chuỗi được bản địa hóa. Vì vậy, bạn luôn có thể có một bộ cơ sở của XIB và tạo lại tất cả khi các chuỗi được bản địa hóa thay đổi. Thông tin thêm tại đây: http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/.

0

tôi luôn đặt tất cả các chuỗi cần thiết trong phương pháp viewDidLoad() với chỉ có placeholders trong .xib. Bằng cách này tôi có thể bản địa hóa mọi tệp .xib một cách dễ dàng chỉ với các tệp .string cập nhật

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