2010-03-17 13 views
10

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" 

Respuesta

27

Para especificar el orden de sustitución, utilice %[email protected] y %[email protected] como sus especificadores de formato. La cadena de formato localizado puede usarlos en cualquier orden. Por ejemplo, supongamos que tu clave de cadena es "Comida favorita". Llame al

NSString *summary = 
      [NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil), 
             userName, favoriteFood]; 

La localización coloca los especificadores de formato donde sea que tenga sentido para su configuración regional. Ejemplo:

"FavoriteFood" = "%[email protected] is the favorite food of %[email protected]"; 

Ver String Format Specifiers

+0

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

+1

Siga el enlace y busque "especificadores posicionales". Además, pruébalo. Esta es una herramienta esencial para la localización. –

+0

El '% $ 1 @' debe ser '% 1 $ @' al final de su ejemplo. – bovine

-1

Aplicando NSLocalizedString() a la cadena de formato @"%@'s favorite food is %@" debe permitir que sea reemplazado con el orden correcto de las palabras y posesivos para el idioma local.

+0

Tal vez entienden mal NSLocalizedString. ¿Cómo se permite cambiar el orden de las variables de sustitución? – SooDesuNe

+0

@SooDesuNe, no creo que lo haga; pero tu ejemplo no tiene ese problema. ¿Hay algún idioma que coloque el objeto antes del tema? Wikipedia me dice que hay algunos idiomas nativos de Brasil, y Klingon ... ¿tal vez no sea tan importante? –

+0

@SooDesuNe: como en la respuesta de Jon Reid, puede usar especificadores de formato de cadena específicos de la posición para encargarse del problema del pedido. – Isaac