Internationalization 翻译文件中关键值的最佳实践

Internationalization 翻译文件中关键值的最佳实践,internationalization,translation,Internationalization,Translation,通常,转换方法采用键>值映射,并使用键将其转换为值。现在,我认识到两种不同的方法来命名您的翻译键,在我的团队中,我们并没有就什么似乎是最好的方法达成共识 方法1: 使用完整的英语单词或句子: Name => Name Please enter your email address => Please enter your email address 方法2: 使用关键词描述情况: NAME => Name ENTER_EMAIL => Please enter your

通常,转换方法采用键>值映射,并使用键将其转换为值。现在,我认识到两种不同的方法来命名您的翻译键,在我的团队中,我们并没有就什么似乎是最好的方法达成共识

方法1: 使用完整的英语单词或句子:

Name => Name
Please enter your email address => Please enter your email address
方法2: 使用关键词描述情况:

NAME => Name
ENTER_EMAIL => Please enter your email address
我个人更喜欢方法1,因为它直接显示消息的含义。如果翻译不存在,您可以回到关键点,这不会导致任何问题。但是,当翻译频繁更改时,该方法很麻烦,因为所有文件都需要更新。对于较长的文本,这些键变得非常大。这可以通过使用类似于
ENTER_EMAIL
的键来解决,但措辞完全脱离上下文。抽象翻译键的列表将是巨大的,您需要所有键的元数据来解释它们的用法,冲突可能会发生得更容易


是有一种两全其美的方法还是第三种方法?如何在应用程序中使用翻译密钥?在我们的例子中,它是一个基于php的Web应用程序,但我认为上面的问题足够笼统,可以笼统地谈论i18n。

这也是iOS/OSX开发人员面临的问题。对他们来说,甚至还有一个假设方法1的例子。当然,苹果开发者不必使用这个工具——我不需要

虽然使用方法1获得的安全网很好(即,如果忘记对字符串进行本地化,则可以显示键),但其缺点是可能导致键冲突。有时,由于语法规则或上下文的差异,一段相同的显示文本需要以两种不同的方式进行本地化。例如,“E-mail”的法语翻译为“E-mail”,如果是对话标题,则为“E-mail”;如果是按钮,“Envoyer un-mail”,则为“Envoyer un-mail”(法语中“E-mail”一词仅为名词,不能用作动词,而英语中它既是名词又是动词)。使用方法2,您可以使用键“EMAIL_TITLE”和“EMAIL_”按钮来解决此问题,作为奖励,这将向翻译人员提供提示,帮助他们正确翻译

方法2的另一个优点是,您可以更改英文文本,而不必担心更新英文和所有本地化的密钥


所以我推荐方法2

为什么不同时使用两个世界?我使用方法#1表示短字符串,使用方法#2表示完整句子的长字符串。我不怕把两者混为一谈

例如,在以下字符串中,如果在新的应用程序版本中修改了用户体验,则文本可能会更改:

"screen description" = "Tap the plus button to add a new item. Tap an item for more options or to edit its details.";
因此,在这里应用方法2是有意义的。 但是,对于以下示例中的简单字符串,方法#1更有用:

"Preferences" = "Preferences";

一般来说,当人们试图将事情标准化时,我常常觉得这是一种限制。就我个人而言,我更喜欢一种更“无政府主义”的方法,其中有几种方法是有效的(不仅是在这个方法1和方法2线程中,而且在一个开发团队为编码风格而斗争时也是如此)。

有趣的问题。我也倾向于选择#1,但如果情况允许,我会选择混合型。当然,我更喜欢#2,但要求总是有英语(或原语)条目。每个记录还应包括上次更新的日期/时间,以指出已更改的消息以及更新翻译的需要。另外,应该存储一个记录,告诉您原始语言是什么。您的
EMAIL\u TITLE
EMAIL\u按钮
是一个非常好的例子,但是我认为这不是一个现实的例子。作为英国的开发者,你不知道这个法国案例。所以你首先要写
电子邮件
(#1)或
电子邮件
(#2)。然后你的法语翻译人员返回消息,他需要两个键,因此你将按钮更改为
电子邮件(按钮)
(#1)或
电子邮件按钮
(#2)。这两种方法的过程是相同的,最终会发生冲突,需要解决这个问题。您对此有何看法?开发人员需要了解一些国际化规则。他们不必知道特定的语言,只是在这种情况下,一段文本不能在不同的上下文中重复使用(即使在英语中它不是问题的地方)。因此,在开发应用程序时,当您为“电子邮件”按钮引入一个新字符串时,即使您看到有“电子邮件”,也会在字符串表中添加一个条目但对于不同的上下文来说已经存在。请注意,对于许多平台来说,这种不可重用规则是有帮助的,因为UI视图是在捆绑包中本地化的,并且您不需要编写代码来加载字符串表中的每一段文本(因此您经常会得到同一段英文文本的多个实例进行翻译,但这没关系,因为它们的上下文可能不同)最后,我们将讨论方法1,但我将接受你的答案(因为一切都解释得很好)。使用gettext,我们现在可以扫描完整的代码库。如果英语句子已更改,则会在gettext文件中自动更新。我们还可以使用POedit将键复制到值上,这比预期的要容易得多。我们还没有达到您提到的限制条件,但这可能是因为我们只有英语、荷兰语、德语和俄语版本,还没有法语版本。如果我们问我们的翻译,我们会看到发生了什么:)也可以看到,例如,它可能是一个社交网络的链接,在美国是Facebook,但在中国是微博。因此,msgid可能类似于socialSiteUrl和socialSiteLabel。