Question

J'ai un projet XCode, avec les fichiers d'interface créés à l'aide XIB Interface Builder. Je construis des fichiers localisés en utilisant XIB ibtool pour extraire les chaînes, les traduire et utiliser ibtool à nouveau pour créer des fichiers localisés XIB.

Cependant, cela signifie que je dois traduire tous les éléments dans les menus de l'application, y compris ceux qui sont tout à fait standard (Fichier, Enregistrer, Ouvrir, minimisez, etc.). Y at-il un moyen d'éviter cela?

Était-ce utile?

La solution 2

Donc, apparemment pas moyen de contourner cela.

Autres conseils

J'ai développé une solution à ce problème.

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

regard pour « Translator », il traduira vos MainMenu.strings fichier dans une douzaine de langues avec les traductions Apple standard pour les chaînes standard élément de menu.

si vous trouvez des chaînes ou des langues manquantes qui Aapple a inclus dans leurs applications de base, s'il vous plaît envoyer un patch sur.

Je suis à la recherche d'une solution similaire pour un certain temps et je trouve cette ressource

http://www.bdunagan.com/2009 / 03/15 / ibtool-localisation faite-facile /

Il cite vers la fin de l'article:

  

ibtool regardera au travers MainMenu.xib pour chaque chaîne visible par l'utilisateur et insérez cette chaîne avec un ObjectID associé dans MainMenu.strings, essentiellement un dictionnaire de chaînes par calées ObjectID. Mieux encore, l'outil les trie par ObjectID, donc versionnés fichiers .strings sont bien diff'able. Je peux voir facilement ce que les chaînes sont ajoutés, supprimés ou tout simplement changé. Permettez-moi de répéter cela parce qu'il est si incroyablement pratique: les fichiers .strings diff bien! Bien sûr, ces fichiers sont .strings unicode, donc ils ne sont pas grep'able. Voici un exemple de la sortie d'une chaîne:

Allez-y et jetez un oeil je l'espère vraiment vous aide autant qu'il m'a aidé!

Traducteur par https://github.com/ core-code / MiscApps / blob / maître / Traducteur / Traducteur / MainMenuTranslations.plist est cool, mais si vous ne voulez pas traiter avec 30 fichiers MainMenu.string dans votre build (Personnellement, je ne) - vous pouvez simplement ajouter MainMenuTranslations.plist à vos ressources (230KB non compressé est minuscule) et de le faire à la volée comme ceci:

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

appeler juste de

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

Je souhaite qu'il y ait un UniversalTranslation.plist quelque part (ce qui pourrait être probablement collectées automatiquement par l'utilisation créative de translate.google.com)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top