【问题标题】:Localizing concatenated or dynamic strings本地化串联或动态字符串
【发布时间】: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


    【解决方案1】:

    要指定替换顺序,请使用%1$@%2$@ 作为格式说明符。本地化格式字符串可以按任何顺序使用它们。例如,假设您的字符串键是“FavoriteFood”。打电话

    NSString *summary =
                [NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil), 
                                           userName, favoriteFood];
    

    本地化将格式说明符放置在对其语言环境有意义的任何地方。示例:

    "FavoriteFood" = "%2$@ is the favorite food of %1$@";
    

    String Format Specifiers

    【讨论】:

    • 我关注了您的链接,并阅读了本地化字符串资源 (developer.apple.com/mac/library/documentation/MacOSX/Conceptual/…)。我没有看到对您提到的格式说明符的任何引用 (%2$@) 请您稍微解释一下吗?
    • 点击链接,搜索“位置说明符”。另外,试一试。这是本地化的必备工具。
    • 示例末尾的%$1@ 应该是%1$@
    • @Jon Reid,我无法编译 NSString* aText = [NSLocalizedString(@"FavoriteFood", nil), userName, favoriteFood];我错过了什么吗?谢谢
    • @HussainSaleem 哇,不知道我是怎么错过的。 :-P 我已经更新了示例。
    【解决方案2】:

    NSLocalizedString() 应用于格式字符串@"%@'s favorite food is %@" 应该可以将其替换为当地语言的正确词序和所有格。

    【讨论】:

    • 也许我误解了 NSLocalizedString。它如何允许改变替换变量的顺序?
    • @SooDesuNe,我不这么认为;但你的例子没有这个问题。有没有将宾语放在主语之前的语言?维基百科告诉我有几种巴西本土语言,还有克林贡语……也许这没什么大不了的?
    • @SooDesuNe:正如 Jon Reid 的回答,您可以使用特定于位置的字符串格式说明符来处理排序问题。
    • @ZaneClaes:不,根据芝加哥风格手册,“Atticus's”是正确的所有格单数。
    • 糟糕,我用了一个糟糕的例子,对不起;但问题仍然存在。一个更好的例子是琼斯。该规则适用于复数所有格,因此它变成 Jones' 而不是 Jones's
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多