Estoy familiarizado con el uso de NSLocalizedString() para localizar cadenas, pero el problema que tengo hoy requiere un poco más de delicadeza. Mi situación es la siguiente:Localizar cadenas concatenas o dinámicas
NSString *userName; //the users name, entered by the user. Does not need localized
NSString *favoriteFood; //the users favorite food, also entered by user, and not needing localized
NSString *summary = [NSString stringWithFormat:@"%@'s favorite food is %@", userName, favoriteFood];
Esto funciona muy bien para Inglés, pero no todos los idiomas utiliza el mismo orden de palabras como Inglés, por ejemplo, una traducción palabra por palabra de la misma frase o comentario del japonés al Inglés haría leer: la pizza comida favorita
de UserName es
no hablar de que 's no es hacer un posesivo en todos los idiomas.
¿Qué técnicas están disponibles para localizar este tipo de oración concatenada?
ACTUALIZACIÓN EN BENEFICIO DE OTROS: @Jon Reed tiene razón, los especificadores posicionales son muy importantes para la localización. El documento que vincula solo contiene una referencia al hecho de que se puede usar con NSString, NSLog y otros, el enlace realmente no dice CÓMO usarlos.
Encontré this link, eso lo explica bien. También explica mi pregunta mejor que yo. Desde el enlace:
Las cadenas de formato de printf y sprintf (ver Printf) presentan un problema especial para la traducción. Considere el siguiente: 1
printf(_"String `%s' has %d characters\n", string, length(string))) A possible German
traducción de esto podría ser:
"%d Zeichen lang ist die Zeichenkette `%s'\n" The problem
debería ser obvio: el orden de las especificaciones de formato es diferente de la original! Aunque gettext puede devolver la cadena traducida al runtime, no puede cambiar el orden del argumento en la llamada a printf.
Para resolver este problema, formato printf especificadores pueden tener un elemento opcional adicional, lo que llamamos un especificador posicional . Por ejemplo:
"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" Here, the
especificador de posición consiste en un recuento número entero, que indica qué argumento de usar, y un ‘$’. Los recuentos son basados en uno, y la cadena de formato no está incluida. Por lo tanto, en el siguiente ejemplo , 'cadena' es el primer argumento y 'length (cadena)' se la segunda:
$ gawk 'BEGIN { > string = "Dont Panic" > printf _"%2$d characters live in \"%1$s\"\n", > string, length(string) > }' -| 10 characters live in "Dont Panic"
Seguí su enlace y leí Recursos de cadena de localización (http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPInternational/Articles/StringsFiles.html) también. No vi ninguna referencia a los especificadores de formato que mencionas (% 2 $ @) ¿Puedes explicar eso un poco por favor? – SooDesuNe
Siga el enlace y busque "especificadores posicionales". Además, pruébalo. Esta es una herramienta esencial para la localización. –
El '% $ 1 @' debe ser '% 1 $ @' al final de su ejemplo. – bovine