2012-09-10 6 views
19

Digamos que mi aplicación solo se ejecuta en inglés. Pero no quiero lanzar una nueva versión para cada vez que agregue un nuevo idioma. Mi propuesta es cargar este archivo localizable.strings de forma remota en mi aplicación.¿Puedo cargar un archivo localizable.strings en una aplicación iOS por aire?

Mi aplicación tiene la capacidad de cargar archivos desde sitios ftp.

¿Creen que es posible cargar idiomas de esta manera? ¿O la aplicación tiene que compilar el archivo de idioma en tiempo de compilación?

+0

¿La misma pregunta que http://stackoverflow.com/questions/12358379/is-it-possible-to-access-the-app-bundles-en-lproj? –

+0

La pregunta parece haber sido respondida [aquí] (http://stackoverflow.com/a/6075533/1651167) – Shelm

+1

Es similar pero las personas responden preguntas diferentes según cómo se soliciten. Obviamente, esta es la mejor respuesta a continuación. – mskw

Respuesta

32

Todos los recursos de cadenas localizadas (más muchos otros tipos de recursos) se extraen del paquete. Por lo general, una aplicación utiliza el "paquete principal", que es el creado por XCode junto con su aplicación. Pero puede crear por separado cualquier otro paquete, siempre que lo haga con la estructura correcta, luego puede descargarlo en su aplicación y finalmente extraer una cadena localizada utilizando la función NSLocalizedStringFromTableInBundle().

Así que digamos que usted extrae de la traducción en la lengua "CLAVE" clave, la sintaxis normal sería:

NSString *translated = NSLocalizedStringFromTable(@"key",nil,nil); 

pero hay una variante de esta opción que le permite especificar el paquete:

NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil); 

en el caso estándar se reemplaza con myBundle[NSBundle mainBundle] pero si desea utilizar otro paquete puede especificar que de esta manera:

NSString *myBundlePath = "the path to the downloaded bundle"; 
NSBundle *myBundle = [NSBundle bundleWithPath:myBundlePath]; 
NSString *translated = NSLocalizedStringFromTableInBundle(@"key",nil,myBundle,nil); 

La estructura completa de un paquete se puede ver en la "Guía de programación del paquete" en la documentación de Apple, pero en su caso, usted puede simplemente crear de esta manera:

  • en su Mac crear un directorio, y llámalo "MyBundle"
  • dentro de este directorio mueve tus cadenas localizadas (si tienes varios idiomas en el paquete, entonces el archivo localizable.strings estará dentro de los directorios de lproj: en.lproj, it.lproj, fr .lproj, ...)
  • a continuación, cambie el nombre del directorio a "MyBundle.bundle"

Notarás con la última operación que ahora este objeto se ve como un objeto independiente, pero de hecho es un directorio.

Ahora puede decidir tener un enfoque de paquetes múltiples o seguir una técnica de paquete único: en este último caso puede empaquetar todos los idiomas y luego usar el paquete único actualizado para la traducción de idiomas utilizando las reglas de localización automática del sistema ; en el otro caso, puede hacer un paquete para cada idioma y luego, en función del idioma seleccionado actualmente, cargar el paquete apropiado y elegirlo para sus traducciones.

+3

¡Muy útil! Desafortunadamente, si desea agregar localizaciones de metadatos de la App Store (que probablemente desee si agrega una nueva localización), debe enviar una actualización de la aplicación de todos modos ... –

+0

¿para qué se usarían los metadatos de la App Store? – mskw

+1

Sí, la localización de metadatos implica la reenvío de la aplicación.En tal caso, fusionaría sus nuevos idiomas en el paquete. Pero la simplicidad del enfoque del paquete descargado es tal que puede proporcionar localización (y correcciones de error de traducción) mucho antes de cualquier actualización de la aplicación. Seguro que en la próxima actualización de la aplicación (correcciones de errores, nuevas funciones) fusionará nuevos idiomas en el paquete principal y también actualizará los metadatos. – viggio24

Cuestiones relacionadas