2009-03-06 12 views
10

Próbuję znaleźć łatwy do przetłumaczenia sposób na przetłumaczenie wszystkich widocznych ciągów w aplikacji na iPhone'a. Oficjalna dokumentacja firmy Apple mówi o używaniu plików .strings dla programowych łańcuchów znaków, podczas gdy używa wbudowanej opcji "dodaj zlokalizowany plik" w xcode, aby zlokalizować pliki nib.Lokalizacja IPhone: Czy można łatwo tłumaczyć pliki stalówki bez konieczności kopiowania stalówki dla każdego języka?

Problem polega na tym, że jeśli interfejs użytkownika musi się zmienić po lokalizacji, to będziemy musieli zaktualizować końcówki dla każdego języka indywidualnie, co jest mniej niż optymalne. Czy istnieje prostszy sposób na powiązanie łańcuchów wyświetlanych w plikach nib z odpowiednimi wartościami w pliku .strings? czy musiałbym programowo ustawić te łańcuchy dla każdego elementu interfejsu użytkownika (co jest nieco lepsze, ale nadal denerwujące)?

Odpowiedz

3

Najlepsze co możesz zrobić, to rekurencyjnie pętli każdego widoku, a następnie ustawić tekst na nich:

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); 
} 

Ostrzeżenie: może wam trzeba sprawdzić inne zestawy selektorów do połowu wszystko . To nie jest najlepsza praktyka, ale wygląda na to, że znacznie mniej pracy.

+0

Interesujące podejście ; Wypróbuję to, gdy nasza aplikacja będzie się rozwijać. – Kevlar

+0

Próbuję tego i otrzymuję przepełnienie stosu (tj. Nieskończoną pętlę) – mamcx

+0

Niestety, w ostatnim wierszu jest literówka. Powinien to być translateView (bundle, subview); zamiast translateView (bundle, view); oczywiście – rpetrich

2

Myślę, że chcesz przeczytać o narzędziu wiersza poleceń: ibtool. Powinno to uprościć to, co chcesz zrobić.

+1

Chociaż pomaga to samemu procesowi tłumaczenia, to wciąż daje oddzielny plik końcówki, co mam nadzieję uniknąć. dzięki za wskaźnik. – Kevlar

+0

Nie używałem go wcześniej, ponieważ nie umiejscawiamy w domu. Miałem wrażenie, że można go użyć do "wyodrębnienia" plików do czegoś, co można zlokalizować, a następnie ponownie wstawić do pliku nib. Plik nib z pewnością pomaga w GUI .. –

+0

ibtool powinien móc ponownie zintegrować łańcuchy z głównymi plikami nib, które zostały zmienione, aby wypluć nowe pliki końcówek, które zmieniają zarówno nowe ciągi, jak i nową końcówkę. Zobacz "Wykonywanie przyrostowych aktualizacji lokalizacji" w http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/IB_UserGuide/LocalizingNibFiles/LocalizingNibFiles.html#//apple_ref/doc/uid/TP40005344-CH13 – mahboudz

0

Być może powinieneś zaktualizować każdy ciąg ręcznie. Załóżmy, że masz tablicę lub plik xml ciągów w różnych językach, kiedy użytkownik zmienia język, po prostu pobierz przetłumaczony ciąg z tablicy, a następnie zmień go na interfejs.

Marco

15

Wbudowany w Apple program wiersza poleceń ibtool pozwala to zrobić. Możesz zrzucić ciągi z XIB, zlokalizować je, a następnie utworzyć nowy XIB na podstawie istniejącego XIB, ale używając zlokalizowanych ciągów. Więc zawsze możesz mieć podstawowy zestaw XIB i odtwarzać je za każdym razem, gdy zmieniają się zlokalizowane łańcuchy. Więcej informacji tutaj: http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/.

0

zawsze ustawić wszystkie sznurki potrzebne w metodzie viewDidLoad() z jedynie o zastępcze w .xib. W ten sposób mogę łatwo zlokalizować dowolny plik .xib z tylko aktualizacją plików .string

Powiązane problemy