Frage

Ich habe ein XCode-Projekt, mit den XIB Interface-Dateien gebaut Interface Builder verwenden. Ich baue lokalisierte XIB Dateien von ibtool zu extrahieren Strings, übersetzen sie, und mit ibtool wieder aufzubauen lokalisierte XIB-Dateien.

Allerdings tun dies bedeutet, dass ich alle Elemente in den Anwendungsmenüs zu übersetzen, einschließlich derer, die völlig Standard sind (Datei, Speichern, Öffnen, Minimieren, etc.). Gibt es eine Möglichkeit das?

zu vermeiden
War es hilfreich?

Lösung 2

Also, anscheinend kein Weg vorbei.

Andere Tipps

i eine Lösung für dieses Problem entwickelt haben.

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

sucht „Übersetzer“, wird sie Ihre MainMenu.strings Datei in ein Dutzend Sprache mit den Standard-Apple-Übersetzungen für den Standard-Menüpunkt Strings übersetzen.

, wenn Sie einige Strings oder Sprachen finden fehlen, dass Aapple in ihrer Basis-Anwendungen enthalten ist, wenden Sie sich bitte über einen Patch senden.

Ich habe für eine ähnliche Lösung für eine Weile suchen und ich fand diese Ressource

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

Es zitiert gegen Ende des Artikels:

  

ibtool wird für jeden Benutzer sichtbare Zeichenfolge durch MainMenu.xib suchen und diese Zeichenfolge mit einem zugehörigen ObjectID in MainMenu.strings einzufügen, im Wesentlichen ein Wörterbuch von Strings von ObjectID verkeilt. Noch besser ist, sie durch ObjectID das Werkzeug sortiert, so sind versioniert .strings Dateien schön diff'able. Ich kann leicht sehen, was Saiten hinzugefügt, entfernt oder einfach verändert. Lassen Sie mich das wiederholen, weil es so unglaublich praktisch: .strings Dateien gut diff! Natürlich sind diese .strings Dateien Unicode, so dass sie nicht grep'able sind. Unten ist ein Beispiel für die Ausgabe für eine Zeichenfolge:

Gehen Sie weiter und werfen Sie einen Blick Ich hoffe wirklich, dass es Ihnen so viel hilft, wie es mir geholfen!

Übersetzer von https://github.com/ Kern-Code / MiscApps / Blob / Master / Übersetzer / Übersetzer / MainMenuTranslations.plist cool, aber wenn Sie nicht mit 30 MainMenu.string Dateien in Ihrem Build umgehen wollen (ich persönlich nicht) - Sie können nur MainMenuTranslations.plist auf Ihre Ressourcen hinzuzufügen (230KB unkomprimiert ist winzig) und tun es im Fluge wie folgt aus:

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

rufen Sie es aus

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

Ich wünschte, es ist ein UniversalTranslation.plist irgendwo (was wahrscheinlich über kreativen Einsatz von translate.google.com automatisch gesammelt werden)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top