1

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

是否NSString为这些情况提供支持,或者我是否需要手动翻译每种可能性?

4

2 回答 2

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 %@!"使名称的性别和拼写不影响本地化。不同的语言在这里会有不同的选择。

于 2012-06-26T13:09:21.657 回答
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}]"

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

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

于 2014-05-15T23:05:39.963 回答