iOS字符串文件冲突 - 源语言中的字符串相同,目标不同

时间:2013-12-18 04:16:40

标签: ios cocoa localization nslocalizedstring

所以,我正在将应用程序从日语本地化为英语。

在日语中,(例如)“先生”之间没有区别和“女士”(/“太太”),所以我需要做这样的事情:

/* Salutation format for user (male) */
"%@様" = "Mr. %@";

/* Salutation format for user (female) */
"%@様" = "Ms. %@";

如您所见,日语本地化在两种情况下都使用相同的字符串。我的印象是,当字符串文件包含多个具有相同“源”(即左侧)字符串的条目时,“注释”用于确定使用哪一个。 事实证明我错了,评论参数只是对人工翻译的一种帮助,完全被NSLocalizedString() 忽略了。

因此,如果我运行应用程序,则无论用户的性别如何,下面的两个代码路径都会生成相同的字符串:

NSString* userName;
BOOL userIsMale;

/* userName and userIsMale are set... */

NSString* format;

if(userIsMale){
    // MALE
    format = NSLocalizedString(@"%@様", 
                               @"Salutation format for user (male)");
}
else{
    // FEMALE
    format = NSLocalizedString(@"%@様", 
                               @"Salutation format for user (female)");
}

NSString* salutation = [NSString stringWithFormat:format, userName];

那么,我应该如何处理这样的案件?

2 个答案:

答案 0 :(得分:6)

嗯,实际上NSLocalizedString的“左侧”是关键。所以你可以这样做:

NSLocalizedString(@"SalutForUserMale", @"Salutation format for user (male)");
NSLocalizedString(@"SalutForUserFemale", @"Salutation format for user (female)");

然后在您的基础*.strings文件(日语我推测)中,您将拥有:

"SalutForUserMale" = "%@様";
"SalutForUserFemale" = "%@様";

在您的英文*.strings文件中,您将拥有:

"SalutForUserMale" = "Mr. %@";
"SalutForUserFemale" = "Ms. %@";

答案 1 :(得分:2)

Localizable.strings文件只不过是键值列表。你使用日语短语作为键是不寻常的,但我想它是有效的。我认为这是因为原始应用程序是用日语(?)开发的。我通常使用英语短语键,但无论如何。

关键在于如果您想要两个不同的短语,即使只是一个翻译,您的所有翻译中也必须有两个不同的密钥。如果你的基础语言中有某些东西没有被区分,但是在它的翻译中,那么你可以只用两个新的“拆分”现有的密钥。只需稍微更改或添加一个数字,请参见下文:

/* english .strings file */
"hello_world_key" = "Hello World";
"Yes1" = "Yes"; // same in english but different values in german
"Yes2" = "Yes";

/* german .strings file */
"hello_world_key" = "Hallo Welt";
"Yes1" = "Ja";
"Yes2" = "Jawohl";