本地化连接或动态字符串

Soo*_*uNe 10 cocoa localization objective-c

我熟悉使用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];
Run Code Online (Sandbox Code Playgroud)

这适用于英语,但并非每种语言都使用与英语相同的单词排序,例如,从日语到英语的同一个语言的逐字翻译将为:

UserName最喜欢的食物披萨是

更不用说这并不是每种语言都占有一席之地.

有哪些技术可用于本地化这种连锁句子?

更新其他人的好处:@Jon Reed是对的,位置说明者对本地化非常重要.他链接的文档只包含对它们可以与NSString,NSLog和其他人一起使用的事实的引用,该链接并不真正告诉我们如何使用它们.

我找到了这个链接,这很好地解释了.它也比我更好地解释了我的问题.从链接:

printf和sprintf的格式字符串(参见Printf)给翻译带来了特殊问题.请考虑以下事项:1

 printf(_"String `%s' has %d characters\n",
           string, length(string))) A possible German
Run Code Online (Sandbox Code Playgroud)

这个翻译可能是:

 "%d Zeichen lang ist die Zeichenkette `%s'\n" The problem
Run Code Online (Sandbox Code Playgroud)

应该是显而易见的:格式规范的顺序与原来不同!尽管gettext可以在运行时返回已翻译的字符串,但它无法在调用printf时更改参数顺序.

要解决这个问题,printf格式说明符可能有一个额外的可选元素,我们称之为位置说明符.例如:

 "%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" Here, the
Run Code Online (Sandbox Code Playgroud)

位置说明符由整数计数组成,它指示要使用的参数和'$'.计数是从一开始的,格式字符串本身不包括在内.因此,在下面的示例中,'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"
Run Code Online (Sandbox Code Playgroud)

Jon*_*eid 27

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

NSString *summary =
            [NSString stringWithFormat:NSLocalizedString(@"FavoriteFood", nil), 
                                       userName, favoriteFood];
Run Code Online (Sandbox Code Playgroud)

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

"FavoriteFood" = "%2$@ is the favorite food of %1$@";
Run Code Online (Sandbox Code Playgroud)

请参见字符串格式说明符