Domanda

Ho un progetto XCode, con i file di interfaccia XIB costruiti usando Interface Builder. Sto costruendo file XIB localizzati utilizzando ibtool per estrarre le stringhe, traducendoli, e utilizzando di nuovo ibtool per costruire localizzato file XIB.

Tuttavia, fare questo significa che devo tradurre tutte le voci nei menu delle applicazioni, inclusi quelli che sono completamente standard (File, Salva, Open, Riduci, etc.). C'è un modo per evitare questo?

È stato utile?

Soluzione 2

Quindi, a quanto pare nessun modo per aggirare questo.

Altri suggerimenti

ho sviluppato una soluzione a questo problema.

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

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

se trovate alcune stringhe o lingue mancanti che Aapple ha incluso nelle loro applicazioni di base, si prega di inviare una patch sopra.

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

http://www.bdunagan.com/2009 / 03/15 / ibtool-localizzazione-made-facile /

Si cita verso la fine di questo articolo:

  

ibtool cercherà attraverso MainMenu.xib per ogni stringa user-visibile e inserire la stringa con un'ObjectID associata in MainMenu.strings, essenzialmente un dizionario di stringhe digitato da ObjectID. Ancora meglio, lo strumento li ordina per ObjectID, file .strings modo di versione sono ben diff'able. Posso facilmente vedere che cosa sono aggiunte le stringhe, rimossi, o semplicemente cambiate. Lasciatemi ripetere questo perché è così incredibilmente a portata di mano: i file .strings diff bene! Naturalmente, questi file sono .strings unicode, quindi non sono grep'able. Qui di seguito è un esempio dell'output per una stringa:

andare avanti e prendere uno sguardo Spero davvero che ti aiuta tanto quanto mi ha aiutato!

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

- (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 qualche UniversalTranslation.plist (che potrebbe essere probabilmente raccolte automaticamente attraverso l'uso creativo di translate.google.com)

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