2013-12-18 26 views
3

因此,我正在本地化一个日语到英语的应用程序。iOS字符串文件冲突 - 源字符串中的字符串相同,目标不同

在日语中,没有区别(说)“先生”和“女士”(/“夫人”),所以我需要做这样的事情:

/* 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]; 

所以,我应该如何处理这样的情况?

+0

我不知道如何得到新的想法,这似乎很愚蠢,但你可以给它一个空间给“@%@様”我增加了空间和其他空间“@%@様”。这只是一个尝试,不认为它是解决方案 –

+1

,并检查本地化字符串“%@様”=“Mr.%@”的格式;它以“key”=“value”开头;格式在每个对的开头添加“@” –

+0

是的,我的Localizable.strings示例的语法是错误的,我会修复它。谢谢。 –

回答

5

那么,其实“左侧”的NSLocalizedString是一个关键。所以,你可以这样做:

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

然后在你的基地*.strings文件(日本我相信),你会:

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

而在你的英语*.strings文件中,可以有:

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

谢谢你,你是绝对正确的。唯一需要注意的是,当输入未找到时,您将丢失“使用密钥字符串作为默认值”的后备功能(如果缺少条目 - 如果手动创建/扩展字符串文件的可能性很大),并且用户最终可能面临神秘的字符串。但这是一个值得考虑/测试的风险。 –

1

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"; 
相关问题