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
Run Code Online (Sandbox Code Playgroud)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应该是显而易见的:格式规范的顺序与原来不同!尽管gettext可以在运行时返回已翻译的字符串,但它无法在调用printf时更改参数顺序.
要解决这个问题,printf格式说明符可能有一个额外的可选元素,我们称之为位置说明符.例如:
Run Code Online (Sandbox Code Playgroud)"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n" Here, the位置说明符由整数计数组成,它指示要使用的参数和'$'.计数是从一开始的,格式字符串本身不包括在内.因此,在下面的示例中,'string'是第一个参数,'length(string)'是第二个参数:
Run Code Online (Sandbox Code Playgroud)$ gawk 'BEGIN { > string = "Dont Panic" > printf _"%2$d characters live in \"%1$s\"\n", > string, length(string) > }' -| 10 characters live in "Dont Panic"
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)
请参见字符串格式说明符
| 归档时间: |
|
| 查看次数: |
3323 次 |
| 最近记录: |