2011-05-22 8 views
6

Estoy desarrollando mi propio framework usando Xcode 4, y lo estoy usando en dos aplicaciones de muestra (una de consola y una de Mac OS X Cocoa).Xcode 4: la localización de marcos no funciona

Estoy tratando de agregar localización al framework, así que he creado dos versiones de un archivo Localizable.strings (versiones en y fr), pero cada vez que trato de imprimir una cadena localizada de las aplicaciones de muestra, Solo obtengo su nombre técnico. Por ejemplo, con la siguiente línea dentro el código del marco:

NSLog(NSLocalizedString(@"LOC_TEST", nil)); 

Consigo solamente "LOC_TEST" muestra en la representación ...

localización funciona bien con la propia aplicación de cacao sin embargo (que significa cadenas localizadas del Cacao de aplicaciones se muestran apropiadamente).

Siguiendo this article, me han tratado de añadir localizaciones en el archivo plist del marco:

<key>CFBundleLocalizations</key> 
<array> 
    <string>en</string> 
    <string>fr</string> 
</array> 

pero no cambiar nada ...

¿Qué me falta?

Respuesta

10

La causa por no recoger un archivo .strings justo al lado de marco está en NSLocalizedString macro: ubicación

#define NSLocalizedString(key, comment) [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil] 

del Marco de archivo .strings no es [NSBundle mainBundle] como se especifica en la macro.

Por lo que veo, necesitarás usar NSLocalizedStringFromTableInBundle en su lugar y especificar la ubicación del paquete de tu marco.

1

El "nombre técnico" como lo llamas es en realidad una Clave. Sus archivos .strings se verán como:

/* no comment */ "LOC_TEST" = "LOC_TEST";

En en.lproj/Localizable.strings, reemplace segundo LOC_TEST (el que está después de =) con su cadena en inglés. Haga lo mismo en fr.lproj con su texto en francés.

+0

Gracias por su ayuda, pero parece que la consola de aplicaciones no son compatibles con la localización en absoluto. Publiqué esta pregunta hace un año, y reemplacé esa aplicación de consola con una aplicación de Cocoa normal desde entonces. ¡Ahora todo funciona bien! – Romain

2

La respuesta aceptada es correcta, NSLocalizedString no funcionará, ya que el uso de [NSBundle mainBundle] así que estoy usando esta macro en mi marco

#define LOCALIZED_STRING(key) [[NSBundle bundleForClass:[self class]] localizedStringForKey:(key) value:@"" table:nil] 
0

ejemplo:

la puso en su archivo .m:

#ifndef NSFrameworkLocalizedStrings 
#define NSFrameworkLocalizedStrings(key) \ 
NSLocalizedStringFromTableInBundle(key, @"YOUR_BUNDLE_NAME", [NSBundle bundleWithPath:[[[NSBundle frameworkBundle] resourcePath] stringByAppendingPathComponent:@"YOUR_BUNDLE_NAME.bundle"]], nil) 
#endif 

y utilizar este método:

+ (NSBundle *)frameworkBundle { 
    static NSBundle* frameworkBundle = nil; 
    static dispatch_once_t predicate; 
    dispatch_once(&predicate, ^{ 
     frameworkBundle = [NSBundle bundleForClass:[self class]]; 
    }); 

    //NSLog(@"frameworkBundle %@",frameworkBundle); 
    return frameworkBundle; 
} 

Disfrute √ http://www.LegoTechApps.com (Marco de descarga que ahorrar su tiempo)