我有一个本地化的NSString
,就像“你赢了。这是查克诺里斯。”。法语翻译是“Gagne.il s'agissait bien de Chuck Norris”。但当名字以元音开头时,应该说“Gagné.ils'agissait bien d'Alfred Hitchcock”。
NSString
是否支持这些情况,还是我需要手动转换每种可能性?
答案 0 :(得分:6)
如果您尝试使用像NSLocalizedString()
这样的工具进行本地化,那么这类变体将会出现在很多语言中(特别是那些具有语法性别的语言)并且要处理很多麻烦。没有内置的change-strings-if-starting-with-a-vowel方法,但是这样的东西是必要的(伪代码):
if (language == LANG_FRENCH) {
if (myName.startsWith(ANY_VOWEL)) {
result = format(@"Gagné ... d'%@", myName);
} else {
result = format(@"Gagné ... de %@", myName);
}
}
为什么我给你伪代码而不是实际代码?因为这是错误的方式来完成这项工作。它很乱,很难看,还有很多边缘情况。例如,法语中的字母“H”可以是“吸气”或“非吸气”,一个取“l”/ d'而另一个取“le / la / de”(比较“l'hôtel” “le hockey”。)区别是任意的,不能仅通过检查单词的拼写来确定。
尝试将格式字符串更改为中性,而不是尝试将格式字符串与名称匹配。请尝试"Il s'agissait bien d'%@."
而不是"Le nom? C'est %@!"
,以便名称的性别和拼写不会影响本地化。不同的语言在这里有不同的选择。
答案 1 :(得分:0)
请查看https://github.com/tr8n/tr8n_objc_clientsdk
它支持语言上下文规则和语言案例。
在您的示例中,您将使用以下宏来本地化英语字符串:
Tr8nLocalizedStringWithTokens(
@"You win. It was {name}.",
@{"name": @"Chuck Norris"}
);
{name}是一个数据令牌。
法语翻译将使用语言案例,如下所示:
"You win. It was {name}." = "Gagne. Il s'agissait bien {name::d_de}"
其中(:: d_de)被定义为Tr8n的语言案例规则,如下所示:
if (match "/^[aeiouAEIOU]/" @value)
then (prepend "d'" @value)
else (prepend "de " @value)
如果您需要它作为资本,请使用:
{name::D_De}
此外,如果您需要将名称设为粗体,请使用Attributed String宏,如下所示:
Tr8nLocalizedAttributedStringWithTokens(
@"You win. It was [bold: {name}].",
@{
@"name": @"Chuck Norris",
@"bold": @{@"font": @{@"style": @"bold"}}
}
);
翻译成法语将是:
"You win. It was [bold: {name}]." = "Gagne. Il s'agissait bien [bold: {name::d_de}]"
顺便说一下,性别依赖性也得到了完全支持。让我知道这个案子,我会告诉你如何使用它们。
披露:我是该图书馆的创建者和维护者。如果您发现任何语言缺少某些规则,请告诉我,我很乐意添加它们。