visual studio microsoft español descargar community iphone localization internationalization nslocalizedstring

iphone - microsoft - visual studio installer



Localización avanzada con omisión de argumentos en Xcode (2)

Esto no es un error. Los argumentos numerados no son parte del estándar C, sino que forman parte de IEEE Std 1003.1, que dice lo siguiente (énfasis mío):

El formato puede contener especificaciones de conversión de argumentos numerados (es decir, "% n $" y "* m $") o especificaciones de conversión de argumentos sin numerar (es decir,% y *), pero no ambas. La única excepción a esto es que %% se puede mezclar con el formulario "% n $". Los resultados de mezclar especificaciones de argumento numeradas y no numeradas en una cadena de formato no están definidas. Cuando se usan especificaciones de argumento numeradas, especificar el argumento Nth requiere que todos los argumentos iniciales, desde el primero hasta el (n-1) th, se especifiquen en la cadena de formato.

Tengo esta cadena formateada en la que estoy trabajando un traductor.

INGLÉS

"Check out the %1$@ %2$@ in %3$@: %4$@" = "Check out the %1$@ %2$@ in %3$@: %4$@"

TRADUCCIÓN AL ALEMÁN

"Check out the %1$@ %2$@ in %3$@: %4$@" = "Hör Dir mal %2$@ in %3$@ an: %4$@";

Estos se pasan a una [NSString stringWithFormat:] :

////////////////////////////////////// // Share Over Twitter NSString *frmt = NSLocalizedString(@"Check out the %1$@ %2$@ in %3$@: %4$@", @"The default tweet for sharing sounds. Use %1$@ for where the sound type (Sound, mix, playlist) will be, %2$@ for where the audio name will be, %3$@ for the app name, and %3$@ for where the sound link will be."); NSString *urlString = [NSString stringWithFormat:@"sounds/%@", SoundSoundID(audio)]; NSString *url = ([audio audioType] == UAAudioTypeSound ? UrlFor(urlString) : APP_SHORTLINK); NSString *msg = [NSString stringWithFormat: frmt, [[Audio titleForAudioType:[audio audioType]] lowercaseString], [NSString stringWithFormat:@"/"%@/"", AudioName(audio)], APP_NAME, url]; returnString = msg;

Con el resultado deseado y real de:

INGLÉS

desired: "Check out the sound "This Sound Name" in My App Name: link_to_sound" actual: "Check out the sound "This Sound Name" in My App Name: link_to_sound"

ALEMÁN

desired: "Hör Dir mal "This Sound Name" in My App Name an: link_to_sound" actual: "Hör Dir mal sound in "This Sound Name" an: My App Name"



EL PROBLEMA El problema es que estaba bajo la suposición de que al usar una variable numerada en -[NSString stringWithFormat:] , podría hacer cosas como esta, donde la variable %1$@ se omite por completo. Si observa, la traducción al alemán de la cadena de formato no utiliza el primer argumento ( %1$@ ), pero sigue apareciendo ("sonido") en la cadena de salida.

¿Qué estoy haciendo mal?


Parece un error para mí. Creo que deberías presentar un error .

El motor de formateo de fprintf es independiente de fprintf , por lo que podría haber algunas diferencias. Por ejemplo,

printf("a %3$s/n", "b", "c", "d"); // prints "a d" NSLog(@"a %3$s/n", "b", "c", "d"); // prints "a b"

Debe proporcionar todos los especificadores anteriores porque no es necesario corregir el ancho de un argumento, por ejemplo

printf("%2$llx %1$llx/n", 1LL, 2LL); // prints "2 1" printf("%2$llx/n", 1LL, 2LL); // prints "200000000" !! NSLog(@"%2$llx %1$llx/n", 1LL, 2LL); // prints "2 1" NSLog(@"%2$llx/n", 1LL, 2LL); // prints "1"

El printf del iPhone OS omite 4 bytes en 1 especificador faltante, y el formateador de CFString omite 0 bytes.

Las soluciones son:

  1. Reordena tus índices, por ejemplo

    "Check out the %4$@ %1$@ in %2$@: %3$@" "Hör Dir mal %1$@ in %2$@ an: %3$@";

    o

  2. usa el formato

    [@"%1$10p%2$10p%3$10p%4$10p" stringByAppendingString:frmt]

    para forzar todos los argumentos que se utilizarán, y luego cortar los primeros 40 caracteres con -substringFromIndex: o

  3. Convierta todos los objetos ObjC en cadenas C ( char* ) y use snprintf .

  4. Escribe tu propio motor de formateo.