我熟悉使用NSLocalizedString()来本地化字符串,但我今天遇到的问题需要更多的技巧。我的情况是这样的:
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];
这适用于英语,但不是每种语言都使用与英语相同的单词排序,例如,从日语到英语的同一语言的逐字翻译将会读取:
UserName最喜欢的食物披萨是
更不用说这并不是每种语言都占有欲。
有哪些技巧可用于本地化此类连锁句子?
更新其他人的利益: @Jon Reed是对的,位置说明符对本地化非常重要。他链接的文档只包含一个引用它们可以与NSString,NSLog和其他人一起使用的事实,该链接并没有真正告诉他们如何使用它们。
我找到了this link,这很好地解释了它。它也比我更好地解释了我的问题。从链接:
printf和sprintf的格式字符串 (见Printf)提出了一个特殊问题 翻译。考虑一下 如下:1
printf(_"String `%s' has %d characters\n", string, length(string))) A possible German
翻译可能是:
应该是显而易见的:顺序 格式规格不同 从原来的!即使gettext 可以返回翻译后的字符串 运行时,它无法更改参数 订购printf。"%d Zeichen lang ist die Zeichenkette `%s'\n" The problem
解决这个问题,printf格式 说明者可能有一个额外的 可选元素,我们称之为 位置说明符。例如:
"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" Here, the
位置说明符由一个 整数计数,表示哪个 要使用的参数和'$'。计数是 从一开始,格式字符串 本身不包括在内。因此,在 下面的例子,'string'是 第一个参数和'length(string)'是 第二个:
$ gawk 'BEGIN { > string = "Dont Panic" > printf _"%2$d characters live in \"%1$s\"\n", > string, length(string) > }' -| 10 characters live in "Dont Panic"
答案 0 :(得分:27)
要指定替换顺序,请使用%1$@
和%2$@
作为格式说明符。本地化格式字符串可以按任何顺序使用它们。例如,假设您的字符串键是“FavoriteFood”。呼叫
NSString *summary =
[NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil),
userName, favoriteFood];
本地化将格式说明符放在对其语言环境有意义的地方。例如:
"FavoriteFood" = "%2$@ is the favorite food of %1$@";
答案 1 :(得分:-1)
将NSLocalizedString()
应用于格式字符串@"%@'s favorite food is %@"
应该允许将其替换为正确的字序和本地语言的所有权。