2010-11-17 9 views
5

Ho un progetto XCode, con i file di interfaccia XIB creati utilizzando Interface Builder. Sto creando file XIB localizzati usando ibtool per estrarre stringhe, traducendole e usando ancora ibtool per creare file XIB localizzati.Evitare la traduzione di voci di menu standard nel progetto XCode

Tuttavia, facendo ciò significa che devo tradurre tutti gli elementi nei menu dell'applicazione, compresi quelli che sono completamente standard (File, Salva, Apri, Riduci, ecc.). C'è un modo per evitarlo?

risposta

1

Quindi, a quanto pare non c'è modo di aggirare questo.

0

Sono stato alla ricerca di una soluzione simile per un po 'e ho trovato questa risorsa

http://www.bdunagan.com/2009/03/15/ibtool-localization-made-easy/

Si cita verso la fine di questo articolo:

ibtool cercherà attraverso MainMenu. xib per ogni stringa visibile dall'utente e inserisci quella stringa con un ObjectID associato in MainMenu.strings, essenzialmente un dizionario di stringhe digitato da ObjectID. Ancora meglio, lo strumento li ordina in base all'ObjectID, quindi i file delle versioni .strings sono facilmente distinguibili. Posso facilmente vedere quali stringhe vengono aggiunte, rimosse o semplicemente modificate. Permettetemi di ripeterlo perché è così incredibilmente maneggevole: i file .strings si differenziano bene! Naturalmente, questi file .strings sono in unicode, quindi non sono inafferrabili. Di seguito è riportato un esempio dell'output per una stringa:

Vai avanti e dai un'occhiata Spero davvero che ti aiuti tanto quanto mi ha aiutato!

+0

Ho paura di fraintendere il mio problema: utilizzo già ibtool per mantenere le traduzioni. Questo, tuttavia, non risolve il problema di non voler tradurre tutte le voci di menu standard dell'app (Copia, Incolla, ecc.). –

+0

Ah, vorrei poterti aiutare di più. – austinbv

2

ho sviluppato una soluzione a questo problema.

https://www.corecode.io/index_opensource.html

look per "traduttore", che si tradurrà il vostro file MainMenu.strings in una dozzina di lingue con le traduzioni standard di Apple per le stringhe voce di menu standard.

se si trovano alcune stringhe o lingue mancanti che Aapple ha incluso nelle loro app di base, si prega di inviare una patch oltre.

+0

nota che tutte le 32 lingue in cui Mac OS X è ora supportato. il suo "database" principale è qui, patch benvenuti: https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plist – user1259710

+0

Molto utile, grazie user1259710!Speriamo che Xcode 6 renda tutto più semplice per gli sviluppatori non inglesi ... – wdyp

+0

"Window" manca per più lingue (non tutte). – Leo

0

Translator da https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plist è cool, ma se non si vuole affrontare con 30 file MainMenu.string nel build (io personalmente non) - si può semplicemente aggiungere MainMenuTranslations.plist alle risorse (230KB compresso è molto piccolo) e di farlo al volo come questo:

- (void) processMenu: (NSString*) app { 
    NSDictionary* d = [self loadMenuTranslations: app]; 
    NSMenu* mm = NSApplication.sharedApplication.mainMenu; 
    for (int i = 0; i < mm.numberOfItems; i++) { 
     NSMenuItem* mi = [mm itemAtIndex: i]; 
     mi.title = [self translateMenu: mi.title withDictionary: d]; 
     NSMenu* sm = [[mm itemAtIndex: i] submenu]; 
     sm.title = [self translateMenu: sm.title withDictionary: d]; 
     for (int j = 0; j < sm.numberOfItems; j++) { 
      NSMenuItem* mi = [sm itemAtIndex: j]; 
      mi.title = [self translateMenu: mi.title withDictionary: d]; 
     } 
    } 
} 

- (NSString*) translateMenu: (NSString*) key withDictionary: (NSDictionary*) dictionary { 
    for (NSString* lang in dictionary) { 
     NSDictionary* translation = dictionary[lang]; 
     NSString* t = translation[key]; 
     if (t != null) { 
      return t; 
     } 
    } 
    return key; 
} 

- (NSDictionary*) loadMenuTranslations: (NSString*) app { 
    NSArray* langs = [NSUserDefaults.standardUserDefaults objectForKey: @"AppleLanguages"]; 
    NSURL* url = [NSBundle.mainBundle URLForResource:@"MainMenuTranslations.plist" withExtension: null]; 
    NSMutableDictionary* r = NSMutableDictionary.new; 
    NSDictionary* translations = [NSDictionary dictionaryWithContentsOfURL: url]; 
    for (NSString* lang in langs) { 
     NSString* locale = [NSString stringWithFormat:@"%@.lproj", lang]; 
     NSDictionary* translation = translations[locale]; 
     NSMutableDictionary* d = [NSMutableDictionary.alloc initWithCapacity: translations.count * 3/2]; 
     for (NSString* k in translation) { 
      NSString* v = translation[k]; 
      NSString* key = k; 
      if ([k indexOf: @"APPLICATIONNAME"] >= 0) { 
       key = [k stringByReplacingOccurrencesOfString: @"APPLICATIONNAME" withString: app]; 
      } 
      if ([v indexOf: @"APPLICATIONNAME"] >= 0) { 
       v = [v stringByReplacingOccurrencesOfString: @"APPLICATIONNAME" withString: app]; 
      } 
      d[key] = v; 
     } 
     if (d.count > 0) { 
      r[lang] = d; 
     } 
    } 
    return r; 
} 

basta chiamare da

- (void) applicationDidFinishLaunching: (NSNotification*) n { 
    // ... 
    [self processMenu: @"<your app name>"]; 
} 

Vorrei che ci sia un UniversalTranslation.plist da qualche parte (che potrebbe essere probabilmente raccolti automaticamente attraverso l'uso creativo di translate.google.com)