multi localize localizable language i18n app ios internationalization

ios - localize - UiTextView localizado con el archivo de cadenas xib



multi language ios swift (10)

Uso la internacionalización básica en xCode para administrar varios idiomas en mi aplicación.

En un archivo xib tengo este objeto:

Xrj-9E-2VK it''s an UITextView

En el archivo de cadenas correspondiente:

"Xrj-9E-2VK.text" = "text translated in french"

Pero mi texto todavía está en inglés.

Cualquier sugerencia ?


Archivo de un error con Apple. Hágales saber que esto está sucediendo y que le causa a usted (y a mí) tiempo y frustración. Todo este sistema de localización no está para que recurramos a NSLocalizedString ..


Conseguí esto para trabajar con Xcode 5.1.1 y iOS7.

Seleccione el ViewController que desea localizar en el panel de archivo izquierdo. En el panel derecho, seleccione el inspector de archivos.

Verá un botón "Localizar ...". Toque el botón. Se le presentará una lista desplegable de idiomas que puede seleccionar. Seleccione Base y luego toque "Localizar".

En el panel derecho, la sección de Localización ahora tendrá seleccionada la opción "Base" y se mostrarán sus otros idiomas. Seleccione los idiomas que desea admitir. Deje el idioma "nativo" de su aplicación sin marcar.

Definitivamente hay problemas de almacenamiento en caché. Descubrí que los cambios solo aparecen a veces después de haber eliminado la aplicación del simulador y cuando elimino los datos derivados de Xcode.


Esta es mi respuesta Swift 2:

No queremos repetir la corrección en cada UIViewController, así que comencemos con una extensión:

import UIKit extension UIViewController { // if the property "Selectable" = NO it will reset the font and fontcolor when setText is used. // So turn Selectable ON func localizeUITextViewsFromStoryboard(storyboardName: String) { for view in self.view.subviews { if let textView = view as? UITextView, let restorationIdentifier = textView.restorationIdentifier { let key = "/(restorationIdentifier).text" let localizedText = NSLocalizedString(key, tableName: storyboardName, comment: "") if localizedText != key { textView.text = localizedText } } } } }

En cada UIViewController donde necesitamos esta solución, escribimos

override func viewDidLoad() { super.viewDidLoad() self.localizeUITextViewsFromStoryboard("Main") }

Este código utiliza el ID de restauración de la UITextViews. Esto significa que necesitamos copiar el ID de objeto al identificador de restauración en el guión gráfico para cada UITextView.


Esto todavía aparece en Xcode 6 y IOS 8, y las respuestas anteriores no me satisfacen.

Aquí está mi solución simple y rápida:

  1. Selecciona el XIB y luego en el inspector de archivos.
  2. Debajo de "Localización", encuentra el idioma que no funciona
  3. Cambie "Cadenas localizables" a "Interface Builder Cocoa Touch XIB"
  1. Ejecuta la aplicación, la traducción debería estar bien ahora!

Luego puede volver a "Cadenas localizables" si lo prefiere ... En este caso, tenga en cuenta que debe ejecutar al menos una vez la aplicación con el "Interface Builder Cocoa Touch XIB". Opción seleccionada.


He encontrado la siguiente solución hasta que Apple corrige este error (grave) que todavía existe en iOS 7:

Realmente necesita ''mezclar'' el ''método de localización base'' (= método preferido para Xcode 5 y iOS 7) con el método ''más antiguo'' de usar el archivo ''Localizable.strings''

1) cree el archivo ''Localizable.strings'' (Archivo -> Nuevo -> iOS -> recurso -> archivo .strings)

2) use Xcode para crear versiones localizadas de este archivo para cada idioma que use (seleccione el archivo ''Localizable.strings'', en el Inspector de archivos en ''Localización'', haga clic en el botón de selección junto a cada idioma que use).

3) en su viewController cree un IBOutlet @property para el UITextField:

@property (weak, nonatomic) IBOutlet UITextView *localizedTextView;

4) debajo de ''viewDidLoad'' agregue el siguiente código:

self.localizedTextView.text = NSLocalizedString(@"textFieldKey", @"comment for the translator");

5) en cada archivo ''Localizable.strings'' agregue:

"textFieldKey" = "el texto traducido que desea colocar en el campo de texto";

Deberias hacer eso !

Tenga en cuenta que Apple probablemente solucionará este error en algún lugar en el futuro cercano, en ese caso, la traducción se tomará del ''storyboard base localizado'' (el que tiene las referencias del objeto, como "a8N-K9-eJb.text" = "algún texto traducido". En ese caso, puede eliminar el archivo ''Localization.strings'' y usar la localización base nuevamente para un UITextField



Puede usar NSLocalizedStringFromTable para recuperar los textos generados por el IBcode de xcode de la siguiente manera, en viewDidLoad:

self.intro_text.text = NSLocalizedStringFromTable(@"2Vy-59-WN8.text", @"Main", @"");

Donde 2Vy-59-WN8.text es la clave generada que puede encontrar en Main.strings para el UITextView.

Por cierto: esto es un error de xcode / IB, no un error de iOS.


Si desea usar el archivo MainStoryboard.strings existente, puede asignar mediante programación el texto de su vista de texto usando localizedStringForKey: value: table: como esto

[[NSBundle mainBundle] localizedStringForKey:@"abc-12-3ba.text" value:@"" table:@"MainStoryboard"]


Xcode 7 sigue pareciendo buggy ...

Antes de intentar cualquier cosa complicada prueba estos 3 simples pasos:

  1. Eliminar la aplicación del dispositivo (no del simulador)
  2. Producto -> Limpiar
  3. Ejecutar en dispositivo

Buena suerte.


ACTUALIZAR

La mejor manera de cambiar realmente el texto es usar directamente el setter de la UITextView.

Si su texto NO está formateado, simplemente use:

[textView setText:NSLocalizedString(key, comment)];

Si tu texto está formateado, tienes que usar:

[textView setAttributedText:[[NSMutableAttributedString alloc] initWithString:NSLocalizedString(key, comment)]];

Ya no es necesario utilizar la solución alternativa con el método actualizado.

Ambiente de trabajo

Para poder lograr esto, la solución más sencilla que he encontrado es simplemente agregar un UITextView adicional con el texto traducido exactamente en el mismo lugar que el otro y ocultarlo.

Para mostrar la vista correcta, hago esto en el método viewDidLoad del controlador:

NSString *language = [[NSLocale preferredLanguages] firstObject]; if ([language isEqualToString:FRENCH_LANGUAGE]) { //@"fr" UITextView.hidden = YES; UITextViewFR.hidden = NO; }

Aunque esta solución definitivamente no es elegante, es ciertamente una buena solución cuando no tiene que mantener muchas traducciones.

Dicho esto, el uso de la secuencia localizada del guión gráfico no funciona. Agregar un IBOutlet y establecer el atributo de texto con una NSLocalizedString tampoco funcionaba. He buscado una solución y parece que nadie realmente ha podido encontrar una respuesta clara para esa.