2011-01-27 16 views
29

¿Es posible tener varios componentes que tengan localizaciones separadas en una aplicación?Múltiples archivos Localizable.strings en una aplicación para iOS

Por ejemplo, quiero localizar cadenas en mi aplicación, pero también uso ShareKit que se localiza a sí mismo (por lo que mi paquete contendrá 2 Localizable.strings en diferentes lugares). Por lo tanto, ShareKit contiene carpetas como en.lproj y de.lproj que contienen archivos Localizable.strings y deseo crear las mismas para el resto de mi proyecto pero mantenerlas separadas.

He intentado mantenerlos separados y eso ha provocado que las cadenas de mi aplicación no se usen. ¿Algunas ideas?

Respuesta

73

Hay una manera de hacer esto que es bastante simple.

Existen varias macros para localizar, una de las cuales es NSLocalizedStringFromTable().Esta toma tres parámetros:

  1. La cadena de localizar
  2. El nombre de la tabla, que es sólo un nombre de archivo
  3. El comentario, al igual que en NSLocalizedString()

Si utiliza un nombre de tabla entonces puede tener otro archivo de cadenas, es decir, si hago NSLocalizedStringFromTable(@"name", @"MyStrings", @"whatever"); y luego pongo mis cadenas en MyStrings.strings, lo usaré.

Ver Matt Gallagher's recent post acerca de esto.

+0

¡Gracias! Disfruté mucho el artículo de Matt hasta que dijo "evita localizar imágenes, te causará dolor y sufrimiento", meh. – Dimitris

+1

¡Ningún problema! Acerca de las imágenes localizadas, es muy cierto. Es un dolor mantener las imágenes. Es mucho mejor dibujar texto en la parte superior de la imagen. –

+1

¡Genial! Ahora puedo crear un componente reutilizable con sus propias clases/recursos/cadenas localizables en un solo directorio y colocarlo en nuevos proyectos, ¡sin tener que preocuparme por fusionar el archivo global Localizable.strings! –

0

cada archivo/recurso puede ser localizable, también los archivos IB .xib o imágenes jpg/png, solo necesita seleccionar un archivo en su proyecto, abrir información, entrar en la pestaña/sección "general" y presionar el "crear archivo localizable" ... a continuación, puede añadir cualquier idioma que desee, xCode creará un nuevo archivo de la duplicación de la primera y la pondrá en la carpeta correcta ...

Luca

+0

¿Pero qué significa "la carpeta correcta"? En mi caso, quiero tener 2 archivos con el mismo nombre ("Localizable.strings") y me pregunto cómo podría funcionar esto. – Dimitris

+0

ok, la buena noticia es que no tienes que preocuparte realmente por eso ... quiero decir: si solo tienes 1 archivo único llamado "Localizable.strings" ahora, solo intenta hacer lo que dije con eso (seleccionar it, open info, ingresado en la pestaña "general", presione el botón "make file localizable", en la nueva ventana abierta seleccione general-tab y presione el botón "agregar localización", luego elija un nuevo idioma para ese archivo) ... cuando haces ese xCode crea la "carpeta correcta" para mover el archivo antiguo "Localizable.strings" en el filtro inglés y el nuevo archivo (duplicado) en el filtro italiano (o cualquier otro), así que solo edítalo – meronix

+0

Pero quiero tener dos :) Ese es el punto de esta pregunta. – Dimitris

0

oh ok, no conozco ShareKit, pero supongo que no puedes editar sus archivos de texto y solo agregar tus nuevas palabras a esos archivos, ¿no?

entonces usted puede considerar crear su propio archivo de "diccionario" e intentar localizarlo, luego leerlo y ponerlo en un NSDictionary donde puede leer las palabras/valores únicos ... puede insertar un registro en su archivo "myDict.plist" con la tecla "saludo" de tipo String con el valor "Ciao" a la italiana y "hola" en el Inglés uno

NSString *bundle = [[ NSBundle mainBundle] pathForResource:@"myDict" ofType:@"plist"]; 
NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile:bundle]; 
NSString *greetingsTranslatedInTheGoodLanguage = [savedStock objectForKey:@"greeting"]; 
// just to try what you have read: 
NSLog (@"translated by your own dictionary: %@", greetingsTranslatedInTheGoodLanguage); 
[savedStock release]; 

Luca

ps leer los comentarios demasiado ...

+0

disculpa por mi primera versión de esta segunda respuesta, tuve algunos problemas con copy/past in safary ... – meronix

+0

mhm ... lo probé en mi proyecto ... por alguna razón desconocida, el archivo de diccionario siempre se lee en su idioma predeterminado, ignorando las configuraciones, por lo que tiene que hacer diferentes archivos y llamar al bueno usted mismo cuando usa: NSString * bundle = [[NSBundle mainBundle] pathForResource: @ "myDict-ita" ofType: @ " plist "]; o: NSString * bundle = [[NSBundle mainBundle] pathForResource: @ "myDict-eng" OfType: @ "plist"]; y usted puede saber qué idioma está configurado simplemente leyendo una palabra traducida en el archivo utilizado por ShareKit ... – meronix

+0

PUEDO abrir sus archivos Localizable.string y agregar mis cadenas allí. Pero en ese caso estoy alterando SharerKit y tengo un problema cuando quiero actualizarlo más tarde, etc. Así que me preguntaba si existe una buena solución para tener un archivo adicional Localizable.strings y seguir usando la macro NSLocalizedString(), pero supongo no existe tal cosa. Tu solución con NSDictionaries suena bien, pero aún así tendría que cambiar mis hábitos de localización :) – Dimitris

1

No es posible hacer lo que estás pidiendo Puede tener varios archivos Localizable.strings, pero solo uno por idioma en sus respectivas carpetas .lproj.

Entiendo que no desea editar los archivos de ShareKit Localizable.strings porque eso sería un problema al actualizar, pero creo que debe ver cuánto trabajo realmente tomaría. Dependiendo de la cantidad de idiomas que necesite admitir, puede ser menos trabajo localizar sus propias cadenas y agregarlas al final de los archivos de ShareKit Localizable.strings que implementar su propio esquema de localización.

Por cierto, para detectar el idioma del dispositivo está configurado para que puede utilizar:

NSArray *preferedLocalizations = [[NSBundle mainBundle] preferredLocalizations]; 

Esto le da un conjunto de dos letras cadenas de código de idioma. El elemento en el índice 0 es el idioma seleccionado actualmente. Esto podría ser útil si necesita tomar decisiones lógicas basadas en el idioma.

Cuestiones relacionadas