Pergunta

Eu tenho um projeto Xcode, com os arquivos de interface XIB criados usando o interface Builder. Estou construindo arquivos XIB localizados usando ibtool para extrair cordas, traduzi -las e usar ibtool Novamente para criar arquivos XIB localizados.

No entanto, fazer isso significa que tenho que traduzir todos os itens nos menus de aplicativos, incluindo aqueles que são completamente padrão (arquivo, salvar, abrir, minimizar etc.). Existe uma maneira de evitar isso?

Foi útil?

Solução 2

Então, aparentemente, não há como contornar isso.

Outras dicas

Eu desenvolvi uma solução para esse problema.

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

Procure "tradutor", ele traduzirá seu arquivo mainmenu.strings em uma dúzia de idiomas com as traduções padrão da Apple para as seqüências de strings de itens de menu padrão.

Se você encontrar algumas cordas ou idiomas que a Aapple incluiu em seus aplicativos básicos, envie um patch.

Eu tenho procurado uma solução semelhante há algum tempo e encontrei este recurso

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

Ele cita no final do artigo:

O iBtool examinará o mainmenu.xib para todas as string visível do usuário e inserirá essa string com um ObjectID associado em mainmenu.strings, essencialmente um dicionário de strings digitado pelo ObjectID. Melhor ainda, a ferramenta os classifica pelo ObjectID, para que os arquivos .Strings de versão sejam bem difíceis. Posso ver facilmente quais strings são adicionadas, removidas ou apenas alteradas. Deixe -me repetir isso porque é incrivelmente útil: os arquivos .strings Dif diferem bem! Obviamente, esses arquivos .strings são unicode, portanto não são grep'able. Abaixo está um exemplo da saída para uma string:

Vá em frente e dê uma olhada, eu realmente espero que ajude você tanto quanto me ajudou!

Tradutor por https://github.com/core-code/miscapps/blob/master/translator/translator/mainmenutranslations.plisté legal, mas se você não quiser lidar com 30 arquivos mainmenu.string em sua compilação (pessoalmente não) - você pode apenas adicionar mainmenutranslations.plist aos seus recursos (230kb descompactos é minúsculo) e fazê -lo rapidamente isto:

- (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 chamá -lo de

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

Eu gostaria que houvesse uma Universaltranslation.Plist em algum lugar (que provavelmente poderia ser coletado automaticamente através do uso criativo de tradução.google.com)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top