【发布时间】:2010-03-17 01:40:44
【问题描述】:
我熟悉使用 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];
这适用于英语,但并非每种语言都使用与英语相同的词序,例如,将相同句子从日语逐字翻译成英语会变成:
用户名最喜欢的食物披萨是
更不用说 's is 并不是所有语言的所有格。
有哪些技术可用于定位此类连接句子?
为了他人的利益而更新: @Jon Reed 是对的,位置说明符对本地化非常重要。他链接的文档仅包含对它们可以与 NSString、NSLog 等一起使用的事实的引用,该链接并没有真正告诉如何使用它们。
我找到了this link,这很好解释。它也比我更好地解释了我的问题。从链接:
printf 和 sprintf 的格式字符串 (见 Printf)提出了一个特殊的问题 用于翻译。考虑 以下:1
printf(_"String `%s' has %d characters\n", 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位置说明符由一个 整数计数,表示哪个 要使用的参数和一个“$”。计数是 基于 1 和格式字符串 本身不包括在内。因此,在 下面的例子,“字符串”是 第一个参数和“长度(字符串)”是 第二个:
$ gawk 'BEGIN { > string = "Dont Panic" > printf _"%2$d characters live in \"%1$s\"\n", > string, length(string) > }' -| 10 characters live in "Dont Panic"
【问题讨论】:
标签: objective-c cocoa localization