2009-03-06 2 views
10

Sto cercando di trovare un modo gestibile per tradurre ogni stringa visibile in un'applicazione iPhone. La documentazione ufficiale di Apple dice di usare i file .strings per le stringhe programmatiche, mentre si usa l'opzione integrata "aggiungi file localizzato" in xcode per localizzare i file di pennini.Localizzazione IPhone: è possibile tradurre facilmente i file pennino senza dover copiare il pennino per ogni lingua?

Il problema che vedo con questo è che se l'interfaccia utente deve cambiare dopo la localizzazione, allora avremmo bisogno di aggiornare i pennini per ogni lingua singolarmente che non è ottimale. C'è un modo più semplice per legare forse le stringhe visualizzate nei file pennino ai valori rilevanti in un file .strings? o dovrei programmaticamente impostare le stringhe per ciascun elemento dell'interfaccia utente (che è leggermente migliore ma comunque fastidioso)?

risposta

3

Il meglio che puoi fare è ricorsivamente ciclo attraverso ogni vista e quindi impostare il testo su di essi:

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

Attenzione: potrebbe essere di deve controllare altri insiemi di selettori per catturare tutto . Questa non è una best practice, ma sembra molto meno lavoro

+0

Approccio interessante ; Lo proverò quando la nostra app progredirà di più. – Kevlar

+0

Ho provato questo e ottenere uno stack overflow (cioè un ciclo infinito) – mamcx

+0

Spiacente, c'è un errore di battitura nell'ultima riga. Dovrebbe essere translateView (bundle, subview); invece di translateView (bundle, view); ovviamente – rpetrich

2

Penso che vogliate leggere lo strumento della riga di comando: ibtool. Dovrebbe semplificare quello che stai cercando di fare.

+1

Mentre aiuta con il processo di traduzione stesso, risulta comunque avere un file di pennino separato alla fine che è quello che spero di evitare. grazie per il puntatore però. – Kevlar

+0

Non l'ho usato prima perché non localizziamo internamente. Avevo l'impressione che potessi usarlo per "estrarre" i file su qualcosa che puoi localizzare e poi reinserire nel file pennino. Il file pennino aiuta sicuramente con la GUI però .. –

+0

ibtool dovrebbe essere in grado di reintegrare le stringhe nei file di pennini principali che vengono modificati, al fine di sputare nuovi file di pennini che hanno sia le nuove stringhe che le nuove modifiche del pennino. Vedere "Esecuzione degli aggiornamenti di localizzazione incrementali" in http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/IB_UserGuide/LocalizingNibFiles/LocalizingNibFiles.html#//apple_ref/doc/uid/TP40005344-CH13 – mahboudz

0

Forse dovresti aggiornare ogni stringa manualmente. Supponiamo che tu abbia un array, o un file xml, di stringhe in lingue diverse, quando l'utente cambia lingua, ottieni la stringa tradotta dall'array e poi la cambi nell'interfaccia utente.

Marco

15

Il programma integrato da riga di comando di ibtool ti consente di farlo. È possibile scaricare le stringhe da un XIB, localizzarle, quindi creare un nuovo XIB basato sull'XIB esistente ma utilizzando le stringhe localizzate. Quindi puoi sempre avere un set base di XIB e ricrearli tutti quando cambiano le stringhe localizzate. Maggiori informazioni qui: http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/.

0

ho sempre impostato tutte le stringhe necessarie nel metodo viewDidLoad() con solo avendo segnaposto nel .xib. In questo modo posso localizzare facilmente qualsiasi .xib con solo l'aggiornamento .string file