Pregunta

Tengo un proyecto de XCode, con los archivos de interfaz XI ter construidas usando el Interface Builder. Estoy construyendo archivos XIB localizadas mediante el uso de ibtool a extraer cadenas, traducirlos, y el uso de ibtool de nuevo para construir localizada archivos XIB.

Sin embargo, hacer esto significa que tengo que traducir todos los artículos en los menús de aplicaciones, incluyendo aquellos que son completamente estándar (Archivo, Guardar, Abrir, Minimizar, etc.). ¿Hay una manera de evitar eso?

¿Fue útil?

Solución 2

Así que, al parecer, no hay forma de evitar esto.

Otros consejos

he desarrollado una solución a este problema.

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

look para "traductor", que se traducirá su archivo MainMenu.strings en una docena de idiomas con las traducciones de Apple estándar para las cadenas de elementos de menú estándar.

si encuentra algunas cadenas o idiomas que faltan Aapple ha incluido en sus aplicaciones de base, por favor envíe un parche sobre.

He estado buscando una solución similar por un tiempo y me encontré con este recurso

http://www.bdunagan.com/2009 / 03/15 / ibtool-localización-hecho fácil /

Se cita hacia el final del artículo:

  

ibtool observa a través de MainMenu.xib para cada cadena visible para el usuario e insertar esa cadena con un ID de objeto asociada hacia MainMenu.strings, esencialmente, un diccionario de cadenas tecleados por el ID de objeto. Aún mejor, la herramienta les ordena por ID de objeto, por lo versionados archivos .strings son muy bien diff'able. Puedo ver fácilmente lo que se añaden cadenas, eliminan, o simplemente cambiaron. Permítanme repetir esto porque es tan increíblemente útil: .strings archivos diff también! Por supuesto, estos archivos son .strings Unicode, por lo que no son grep'able. A continuación se muestra un ejemplo de la salida de una cadena:

seguir adelante y tomar una mirada realmente espero que le ayuda tanto como me ayudó!

https://github.com/ núcleo de código / MiscApps / burbuja / maestro / traductor / traductor / MainMenuTranslations.plist es bueno, pero si usted no quiere tratar con 30 archivos MainMenu.string en su construcción (yo personalmente no lo hacen) - Usted puede añadir MainMenuTranslations.plist a sus recursos (230KB sin compresión es pequeña) y hacerlo sobre la marcha como esto:

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

acaba de llamarlo desde

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

Me gustaría que en algún lugar hay una UniversalTranslation.plist (que podría ser, probablemente, automáticamente recogido a través del uso creativo de translate.google.com)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top