2011-05-20 12 views
11

Sé que en las aplicaciones de Mac se pueden agregar archivos .strings a la carpeta del proyecto para agregar localizaciones.¿Se pueden agregar archivos de recursos .strings en el tiempo de ejecución?

¿Hay alguna manera de que localizaciones adicionales se pueden agregar a una aplicación (iOS o Mac OS) y sin cargarlos desde el haz recursos en tiempo de compilación. Digamos, descargando una localización adicional y almacenándola en/Documents on iOS?

+0

5 años después hay un producto para esto. https://lokalise.co/ "Ya no es necesario volver a enviar su aplicación para su revisión.Use Lokalise iOS y Android SDK para actualizar cadenas y traducciones con unas pocas líneas de código. " – JoePasq

Respuesta

19

Sí, pero no es lo que piensas.

Puede tomar un archivo de cadenas y cargarlo en un NSString, y luego transformarlo en un diccionario usando -[NSString propertyListFromStringsFileFormat].

Esto le proporcionará una manera de almacenar sus cadenas traducidas a medida en la memoria.

En cuanto a su uso real, deberá definir funciones de traducción personalizadas. IE, no puedes usar NSLocalizedString() y amigos más. Afortunadamente, genstrings (la utilidad que se utiliza para la generación de archivos de cuerdas) le permite especificar custom function names:

genstrings -s "JPLocalizedString" ... 

Esto significa que en el código, puede definir:

NSString* JPLocalizedString(NSString *key, NSString *comment) { 
    return [myLoadedStrings objectForKey:key]; 
} 

Así como JPLocalizedStringFromTable(), JPLocalizedStringFromTableInBundle(), JPLocalizedStringWithDefaultValue(). genstrings recogerá todos esos. (En otras palabras, sólo porque NSLocalizedString es una macro no significa que su versión tiene que ser)

Si usted hace esto y utiliza estas variantes JPLocalizedString, a continuación, genstrings aún generará los archivos de cadenas para usted (siempre que utilice el -s bandera).

Una vez que se invocan estas funciones, puede usar el mecanismo de búsqueda que desee, volviendo por defecto a las versiones NSLocalizedString si no puede encontrar nada.

+1

Gracias, esto era más una pregunta teórica y no tengo planes para implementar esto. – JoePasq

0

Debería poder lograr esto sobrescribiendo NSBundle varios métodos ... en una categoría. (Supongo que todos pasan por -pathForResource:ofType:inDirectory:forLocalization:, pero esto no está documentado por lo que no puede confiar en él, incluso si resulta ser el caso ahora, por lo que debe anular todos ellos).

Yo también sugiera filing an enhancement request para una forma clara de anular el mecanismo de búsqueda.

+1

ooph, mala idea. La única forma en que haría que esto funcione es eliminando el' - [NSBundle localizedStringForKey: value: table: ] ', y esa es una muy mala idea. –

+0

Bueno, lo retiro. Podría usar una subclase de' NSBundle', anular la lógica en el método, e invocar 'super' cuando sea necesario, ** pero * * tendrías que * siempre * usar las macuras 'NSLocalizedStringFromTableInBundle()' o 'NSLocalizedStringWithDefaultValue()' para especificar tu paquete personalizado. –

0

Si desea implementar una versión alternativa de NSLocalizedString() dentro de su aplicación, hay una cantidad de buenas estrategias para eso. Eso le permitiría modificar los valores utilizados dentro de su aplicación. Pero eso no funcionará cuando se trata de Notificaciones Push.

advertencia sin embargo: Notificaciones Push para iOS que utilizan cadenas localizadas, no existe un método de ejecución legal modificar el construido en recursos cadenas que se utilizan para traducir los argumentos localizados enviados desde el servidor en el idioma nativo del dispositivo.

Así que si desea utilizar cadenas localizadas como parte de notificaciones Push, debe transportar en la aplicación al momento de enviar a la tienda. No pueden ser modificados más tarde cargando algo del servidor.

Cuestiones relacionadas