我有一个NSString类似“你赢了。是查克·诺里斯。”的本地化。这个的法语翻译是“Gagne. il s'agissait bien de Chuck Norris”。但是当名字以元音开头时,它应该说“Gagné. il s'agissait bien d'Alfred Hitchcock”。
是否NSString为这些情况提供支持,或者我是否需要手动翻译每种可能性?
我有一个NSString类似“你赢了。是查克·诺里斯。”的本地化。这个的法语翻译是“Gagne. il s'agissait bien de Chuck Norris”。但是当名字以元音开头时,它应该说“Gagné. il s'agissait bien d'Alfred Hitchcock”。
是否NSString为这些情况提供支持,或者我是否需要手动翻译每种可能性?
如果您尝试使用 之类的工具进行本地化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 %@!"使名称的性别和拼写不影响本地化。不同的语言在这里会有不同的选择。
请看一下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}]"
顺便说一句,也完全支持性别依赖。让我知道这个案例,我会告诉你如何使用它们。
披露:我是该库的创建者和维护者。如果您发现任何语言都缺少某些规则,请告诉我,我很乐意添加它们。