multi localizable language app ios xcode uialertview nslocalizedstring localizable.strings

language - NSLocalizedString solo recupera la clave, no el valor en Localizable.strings(IOS)



multi language ios app swift (27)

Hice un archivo de cadenas llamado "Localizable.strings" y le agregué dos idiomas, como sigue:

"CONNECTIONERROR" = "Check that you have a working internet connection."; "CONNECTIONERRORTITLE" = "Network error";

También he convertido los archivos a Unicode UTF-8 Sin embargo, cuando creo un UIAlertView como este:

UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"CONNECTIONERRORITLE",nil) message:NSLocalizedString(@"CONNECTIONERROR",nil) delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];

la vista de alerta solo muestra el texto clave, no el valor. Funciona si, por ejemplo, configuro un texto UITextviews en NSLocalizedString (@ "CONNECTIONERROR", nil), pero la vista de alerta solo muestra la clave. Alguien sabe lo que está mal?


¿Has intentado limpiar y reconstruir el proyecto?


Asegúrate de no poner ''@'' delante de tu key o value así:

@"key" = @"value";

Debería ser justo:

"key" = "value";

La ''@'' solo va delante de la tecla cuando se accede a ella:

NSWebLocalizedString(@"key", @"label for coder");


Cambie el nombre del archivo InfoPlist.strings a Localizable.strings (doble clic) y luego obtendrá la cadena correcta para esa clave.


Cambie el nombre del archivo a Localizable.strings, asegúrese de que el objetivo en el inspector de archivos esté configurado. Para evitar errores de sintaxis, haga clic derecho en Localizable.strings file-> open as-> ASCII property list También, la limpieza del proyecto y la construcción de nuevo me ayudaron en mi caso.


Cambie su nombre de archivo .strings a Localizable.strings , funcionó para mí.


Cuando estás desarrollando un SDK. Necesitas alguna operación adicional.

1) crea Localizable.strings como de costumbre en YourLocalizeDemoSDK.

2) crea la misma Localizable.strings en YourLocalizeDemo.

3) encuentre su ruta de paquete de YourLocalizeDemoSDK.

Swift4 :

// if you use NSLocalizeString in NSObject, you can use it like this let value = NSLocalizedString("key", tableName: nil, bundle: Bundle(for: type(of: self)), value: "", comment: "")

Bundle(for: type(of: self)) ayuda a encontrar el paquete en YourLocalizeDemoSDK. Si utiliza Bundle.main en Bundle.main lugar, obtendrá un valor incorrecto (de hecho, será la misma cadena con la clave).

Pero si desea usar la extensión de cadena mencionada por dr OX . Necesitas hacer algo más. La extensión de origen se ve así.

extension String { var localized: String { return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") } }

Como sabemos, estamos desarrollando un SDK, Bundle.main obtendrá el paquete del paquete de YourLocalizeDemo. Eso no es lo que queremos. Necesitamos el paquete en YourLocalizeDemoSDK. Este es un truco para encontrarlo rápidamente.

Ejecute el código siguiente en una instancia de NSObject en YourLocalizeDemoSDK. Y obtendrá la URL de YourLocalizeDemoSDK.

let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL let mainBundleURL = Bundle.main.bundleURL

Imprima las dos URL, encontrará que podemos compilar la base bundleURLofSDK en mainBundleURL. En este caso, será:

let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main

Y la extensión String será:

extension String { var localized: String { let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "") } }

Espero eso ayude.


El uso de NSLocalizedString significa que necesita el caso EXACTO y la ortografía de su clave para poder obtener el contenido de la misma. Notarás que este dice

NSLocalizedString(@"CONNECTIONERRORITLE",nil)

cuando debería ser

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)

Si miras la última parte de la primera, dice ''ITLE'', no ''TITLE''


En mi caso fue porque había nombrado erróneamente el archivo "Localization.strings" y no lo había notado (tiene que llamarse Localizable.strings). Como se explicó anteriormente, el síntoma se debe a que el compilador no puede encontrar la cadena. De lo contrario, la causa podría ser cualquier cantidad de cosas, pero por lo general es un punto o coma faltante o comillas. Estos son difíciles de encontrar cuando estás haciendo muchas localizaciones a la vez. La lección aprendida es comenzar a construir su archivo de localización desde el principio en su proceso de desarrollo y compilarlo sobre la marcha, para que sea más fácil detectarlo.


En mi caso, intenté limpiar el proyecto y eliminar datos derivados aún no funciona. Elimino varios saltos de línea en el archivo de cadenas y luego Xcode encuentra las cadenas nuevamente.


Enfrenté un problema similar, de repente mis cadenas localizables no funcionaron en absoluto. Luego usé la comparación de archivos con la antigua copia .strings, y al final encontré que accidentalmente había borrado una clave.

Definitivamente, si el formato es incorrecto, Xcode no leerá las cadenas por usted.

Este es el formato que espera "Clave" = "Valor";


Estaba teniendo problemas con esto en el simulador de iOS. Terminé borrando el archivo Localization.strings en el directorio del simulador

(/ Users / (me) / Library / Application Support / iPhone Simulator / 5.0 / Applications / (etc) / (project) / (application.app)

cd allí y elimine todas las copias de Localization.strings que se encuentran allí.

Por alguna razón, el vudú de pollo de goma habitual de Build Clean, salió de iOS Simulator, salió de XCode, etc. no funcionaba, pero esto fue así. Al menos para mí, hoy.


Esto sucede cuando el tiempo de ejecución no puede encontrar la clave especificada, por el motivo que sea. En su caso, es más probable debido a un error tipográfico: CONNECTIONERRORITLE falta una T para TITLE . También preste atención a cualquier advertencia / error al compilar con respecto al archivo Localizable.strings : si hay " desequilibrado " o falta ; el archivo no se puede compilar / leer correctamente.


He estado buscando la solución durante 5 horas, he intentado todo lo posible para que la localización de mi aplicación funcione.

El problema era que uno de los Pods de mi proyecto tenía un archivo Localizable.strings (en realidad era Parse pod que no lo había cambiado). Por lo tanto, mi aplicación no reconoce mi archivo Localizable.strings.

Solucioné el problema cambiando el nombre del archivo a "MyappnameLocalizable.strings" y usando NSLocalizedString de esta manera:

NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")


La primera línea del archivo de localización debe contener una asignación; de lo contrario, el SDK no leerá el archivo.


Lo resolví usando este enfoque.

El archivo de localize se creó con el nombre main.Strings . Luego, abro los archivos main.Strings (para cada idioma agregado) y los main.Strings manualmente con el nombre localize.strings y los main.strings uno por uno a mi proyecto, también main.strings .

La segunda cosa para evaluar es: verificar. su archivo, todas las keys tienen que terminar ; y asegúrese de que todas las quotes estén abiertas y cerradas correctamente.

Y puedes usar en swift 4 :

myButon.setTitle(NSLocalizedString("forgotpassword.key", comment: ""), for: UIControlState.normal)


Mismo problema, resuelto usando el nombre de archivo: Localizable.strings


Ninguna de las soluciones sugeridas funcionó para mí, pero resolví el problema al eliminar el archivo .app en Productos


Para saber si se encuentra el archivo Localizable.strings, verifique el contenido de su compilación .app y también puede hacer esto en el código:

// es para inglés, por ejemplo, así que especifique el suyo aquí NSString * path = [[NSBundle mainBundle] pathForResource: @ "en" ofType: @ "lproj"];

Si la ruta es NULL, significa que no se encontró el archivo.


Para xcode 9.2, la eliminación de los archivos "Localizable.strings" de los simuladores para el proyecto utilizando la consola me lo resolvió. Aquí están los comandos para los perezosos como yo;)

No olvides reemplazar YOUR_APP_NAME_HERE con tu nombre de proyecto

Script de Shell:

cd cd Library/Developer/CoreSimulator/Devices/ find . -name "Localizable.strings" | grep "YOUR_APP_NAME_HERE.app" | xargs rm

Si está experimentando el problema con las Pruebas unitarias, funcionará en el simulador;)


Poner un ; al final de las líneas en los archivos Localizable.strings.


Probó la aplicación en un dispositivo real y funcionó


Restablecer la configuración del simulador funcionó para mí.

Simulador de iOS> Restablecer contenido y configuración ...


Si escribió punto y coma dobles al final de una línea, NSLocalization no funciona. Debería marcar el archivo Localizable.strings si hay '';;''


Si tiene un punto y coma adicional en su archivo de cadenas, no se localiza.


Swift 4:

Si usa más de un paquete tal como lo usa en un marco externo:

var currentBundle = Bundle.main NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")


Tenía todo funcionando cuando de pronto la localización simplemente dejó de traducir cadenas. Esto significa que el archivo es de alguna manera ilegible para Xcode.

Esto me había pasado porque había pegado un personaje malo en el archivo Localized.strings . Cuando eliminé las pocas líneas con el carácter ofensivo (¿un carácter no unicode? Signos de comillas mal? No se podía decir) todo volvió a la normalidad.

Para encontrar las líneas ofensivas hice un punto de interrupción y traduje manualmente las cadenas de mi archivo en el depurador, hasta que toco el primero que no se traducirá.


Verifique que el archivo Localizable.strings se está agregando a

Objetivos -> Fases de compilación -> Copiar recursos de paquete

No se ha agregado automáticamente para mí.