本地化连接或动态字符串
我熟悉使用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和其他文档可以使用的参考,链接并不能真正说明如何使用它们。
我找到了这个链接,这很好地解释了它。 它也比我更好地解释了我的问题。 从链接:
printf和sprintf的格式字符串(请参阅Printf)提供了一个特殊的翻译问题。 考虑以下几点:1
printf(_"String `%s' has %d charactersn",
string, length(string))) A possible German
翻译这可能是:
"%d Zeichen lang ist die Zeichenkette `%s'n" The problem
应该是显而易见的:格式规格的顺序与原来的不同! 尽管gettext可以在运行时返回翻译后的字符串,但它不能在调用printf时更改参数顺序。
为了解决这个问题,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"
要指定替换顺序,请使用%1$@
和%2$@
作为格式说明符。 本地化格式字符串可以按任意顺序使用它们。 例如,说你的字符串键是“FavoriteFood”。 呼叫
NSString *summary =
[NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil),
userName, favoriteFood];
本地化将格式说明符放在适合其语言环境的任何地方。 例:
"FavoriteFood" = "%2$@ is the favorite food of %1$@";
请参阅字符串格式说明符
对格式字符串@"%@'s favorite food is %@"
应用NSLocalizedString()
应该允许将其替换为当地语言的正确词序和所有格。