我有一个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}]"
顺便说一句,也完全支持性别依赖。让我知道这个案例,我会告诉你如何使用它们。
披露:我是该库的创建者和维护者。如果您发现任何语言都缺少某些规则,请告诉我,我很乐意添加它们。