2010-11-17 10 views
5

Tengo un proyecto XCode, con los archivos de interfaz XIB creados con el Creador de interfaces. Estoy construyendo archivos XIB localizados usando ibtool para extraer cadenas, traducirlas y usar ibtool nuevamente para compilar archivos XIB localizados.Evite traducir elementos de menús estándar en el proyecto XCode

Sin embargo, hacer esto significa que tengo que traducir todos los elementos en los menús de la aplicación, incluidos los que son completamente estándar (Archivo, Guardar, Abrir, Minimizar, etc.). ¿Hay alguna manera de evitar eso?

Respuesta

1

Por lo tanto, aparentemente no hay forma de evitar esto.

0

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

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

Cita hacia el final del artículo:

ibtool observa a través de MainMenu. xib para cada cadena visible por el usuario e inserte esa cadena con un ObjectID asociado en MainMenu.strings, esencialmente un diccionario de cadenas codificadas por ObjectID. Mejor aún, la herramienta los ordena mediante Object ID, por lo que los archivos .strings versionados son muy fáciles de modificar. Puedo ver fácilmente qué cadenas se agregan, eliminan o simplemente cambian. Permítanme repetir esto porque es increíblemente útil: ¡los archivos .strings difieren bien! Por supuesto, estos archivos .strings son unicode, por lo que no son grep'able. A continuación se muestra un ejemplo de la salida de una cadena:

Adelante, eche un vistazo. ¡Realmente espero que lo ayude tanto como a mí!

+0

Me temo que malinterpreta mi problema: ya uso ibtool para mantener las traducciones. Sin embargo, esto no aborda el problema de no querer traducir todos los elementos de menú estándar de la aplicación (Copiar, Pegar, etc.). –

+0

Ah, desearía poder haber ayudado más. – austinbv

2

he desarrollado una solución a este problema.

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

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

si encuentra algunas cadenas o idiomas faltantes que Aapple ha incluido en sus aplicaciones base, envíe un parche.

+0

tenga en cuenta que los 32 idiomas que incorpora Mac OS X ahora son compatibles. su principal "base de datos" está aquí, parches de bienvenida: https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plist – user1259710

+0

Muy útil, gracias user1259710!Esperemos que Xcode 6 haga todo esto más fácil de manera predeterminada para desarrolladores que no sean ingleses ... – wdyp

+0

"Ventana" no se encuentra en varios idiomas (no en todos). – Leo

0

traductor por https://github.com/core-code/MiscApps/blob/master/Translator/Translator/MainMenuTranslations.plist es fresco, pero si usted no quiere tratar con 30 archivos MainMenu.string en su construcción (yo personalmente no lo hacen) - se puede simplemente añadir MainMenuTranslations.plist a sus recursos (230KB sin comprimir es pequeña) y hacerlo sobre la marcha de esta manera:

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

deseo hay un UniversalTranslation.plist algún lugar (que podría ser probablemente recogido automáticamente a través del uso creativo translate.google.com)

Cuestiones relacionadas