本地化连接或动态字符串

时间:2010-03-17 01:40:45

标签: objective-c cocoa localization

我熟悉使用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
     

翻译可能是:

 "%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"

2 个答案:

答案 0 :(得分:27)

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

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

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

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

请参阅String Format Specifiers

答案 1 :(得分:-1)

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