Localizzazione iPhone: è possibile tradurre facilmente i file pennino senza dover copiare il pennino per ogni lingua?

StackOverflow https://stackoverflow.com/questions/619867

Domanda

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 usa il "aggiungi file localizzato" incorporato opzione in xcode per localizzare i file pennino.

Il problema che vedo in questo è che se l'interfaccia utente deve cambiare dopo che si verifica la localizzazione, allora dovremmo aggiornare i pennini per ogni lingua individualmente che è meno che ottimale. Esiste un modo più semplice per legare forse le stringhe visualizzate nei file pennino ai valori rilevanti in un file .strings? o dovrei impostare a livello di codice quelle stringhe per ogni elemento dell'interfaccia utente (che è leggermente migliore ma comunque fastidioso)?

È stato utile?

Soluzione

Il meglio che puoi fare è ricorrere in modo ricorsivo a ciascuna vista e quindi impostare il testo su di esse:

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

Avvertenza: potrebbe essere necessario controllare altri set di selettori per catturare tutto. Questa non è una buona pratica, ma sembra molto meno lavoro

Altri suggerimenti

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

Penso che tu voglia leggere dello strumento da riga di comando: ibtool. Dovrebbe semplificare ciò che stai cercando di fare.

Puoi localizzare automaticamente i pennini senza duplicarli seguendo questa semplice guida:

http://programminghacks.net/2011 / 06/03 / ios-pennino-localizzazione-in-localizzabile-stringhe /

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

Marco

Ho sempre impostato tutte le stringhe necessarie nel metodo viewDidLoad () con solo segnaposto nel file .xib. In questo modo posso localizzare facilmente qualsiasi file .xib aggiornando solo i file .string

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top