Cocoa可以自动处理法语中本地化字符串的收缩吗?

时间:2012-06-26 13:00:35

标签: cocoa localization nsstring

我有一个本地化的NSString,就像“你赢了。这是查克诺里斯。”。法语翻译是“Gagne.il s'agissait bien de Chuck Norris”。但当名字以元音开头时,应该说“Gagné.ils'agissait bien d'Alfred Hitchcock”。

NSString是否支持这些情况,还是我需要手动转换每种可能性?

2 个答案:

答案 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}]"

顺便说一下,性别依赖性也得到了完全支持。让我知道这个案子,我会告诉你如何使用它们。

披露:我是该图书馆的创建者和维护者。如果您发现任何语言缺少某些规则,请告诉我,我很乐意添加它们。