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:
Reordena tus índices, por ejemplo
"Check out the %4$@ %1$@ in %2$@: %3$@" "Hör Dir mal %1$@ in %2$@ an: %3$@";
o
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:
oConvierta todos los objetos ObjC en cadenas C (
char*
) y usesnprintf
.- Escribe tu propio motor de formateo.