Gettext:消息ID是英文文本的好主意吗?

我们正在准备将我们的PHP网站翻译成各种语言,PHP中的gettext支持看起来像是要走的路。

我看到的所有教程build议使用英文文本作为消息ID,即

gettext(“你好!”)

但这真的是一个好主意吗? 假设有人在营销中想把文字改成“你好,你们都!”。 那么你不必更新所有的语言文件,因为那个string – 实际上是消息ID – 已经改变了吗?

有一些通用的ID,如“hello.message”和英文翻译文件是更好吗?

我使用了有意义的ID,例如“ welcome_back_1 ”,这个welcome_back_1就是“ welcome back, %1 ”等等。我总是用英语作为我的“基础”语言,所以在最坏的情况下,当一个特定的语言没有消息ID时,回落英语。

我不喜欢用实际的英文短语作为消息ID,因为如果英文改变,ID也是如此。 如果您使用一些自动化工具,这可能不会对您造成太大的影响,但这让我感到困扰。 我不喜欢使用简单的代码(比如msg3975),因为它们没有任何意义,所以阅读代码比较困难,除非你随处可见垃圾评论。

哇,我很惊讶没有人主张用英语作为关键。 我在一些软件项目中使用了这种风格,恕我直言,它工作得很好。 代码的可读性很好,如果你改变一个英文string,很明显这个消息需要考虑重新翻译(这是一件好事)。

如果您只是纠正拼写或做其他一些肯定不需要翻译的更改,则更新资源文件中该string的ID是一件简单的事情。

也就是说,我现在正在评估是否要采取这种方式来让I18N进入一个新的项目,所以最好听一些关于为什么它不是一个好主意的想法。

我强烈反对理查德·哈里森的回答,他说这是“唯一的途径”。 亲爱的提问者,不要相信只有这样的答案,因为“唯一的方式”不存在。

这是另一种方式,恕我直言比理查兹方法有几个优势:

  • 首先使用原始英文string的原始版本。
  • 不要显示这些原始string,而是创build一个英语翻译文件
  • 将原始string复制到翻译的开头

优点:

  • 可读的代码
  • 如果与您的视图显示的内容不相同,则代码中的文本非常接近
  • 如果要更改英文文本,则不要更改原始string,而是更改翻译
  • 如果你想翻译相同的东西两次,只需要写一个稍微不同的原始string或者只是添加“这个和那个版本”,你仍然有一个完全可读的代码

ID为英文的原因是,如果翻译因任何原因而失败,则返回ID–当前语言和令牌的翻译不可用或其他错误。 那当然假定开发者正在写原始英文文本,而不是一些文档人员。

另外,如果英文文本改变,那么其他翻译可能需要更新?

在实践中,我们也使用纯ID而不是英文文本,但这意味着我们必须做大量额外的工作来默认英文。

总之不要这样做。

英语中的同一个词/短语通常可以有不止一个意思,而每个意思是不同的翻译。

为您的string定义助记符号,并将英语视为另一种语言。

同意其他海报,代码中的身份证号码是代码可读性的噩梦。

Ex本地化工程师

你不是已经回答了你自己的问题吗? 🙂

显然,如果你打算支持你的应用程序的国际化,你应该把所有的语言实现看成是一样的。 如果有人决定需要更改string,则可以在所有语言文件中进行类似的更改。 带有签入的元数据应该将所有的语言文件组合在一起进行相同的更改。 如果您的“默认”语言的处理方式不同,则更难以维护。

我甚至会说,你永远不会(对于大多数从不)从自由文本作为任何东西的关键。 想象一下,如果SO使用查询标题作为这个页面的关键。 如果有人链接到它,然后标题被编辑,链接不再有效。

你的问题是类似的,除了你也将负责更新所有链接…

就像道格拉斯·利德(Douglas Leeder)提到的那样,尽pipe一个使用英语和另一种语言的界面混杂在一起,但是你可能想要做的就是使用英语作为默认(备份)语言,但是也是非常有趣的。

有很多事情要考虑,答案并不那么容易。

用简单的英文

优点

  • 易于编写和读取代码
  • 在大多数情况下,即使没有在代码中运行翻译function,它也能工作

缺点

  • 所涉及的程序员也必须是好的撰稿人:)
  • 即使在你需要运行的第一语言是其他语言的情况下(即,我们正在开始使用捷克语的项目,我们将它们本地化到EN中),你也需要用英语完整地写出准确的文本。
  • 在很多情况下,你需要使用上下文。 如果你不能从begginig做到这一点,那么稍后再添加它们还是有很多工作的。 解释:在英语中,一个单词可以有许多不同的方法 – 而且您需要使用上下文来区分它们 – 并不总是那么容易(订单=sorting顺序,或者它可以是采购订单)。
  • 稍后在这个过程中纠正英文可能非常困难。 源string的更正通常会导致已经翻译的短语的丢失。 只是因为你修改了英文,才会把翻译翻译成3种不同的语言。

使用键

优点

  • 您甚至可以使用英语语言的本地化平台function。 也就是说,我们正在使用可爱的Crowdin平台。 翻译pipe理有很多方便的工具 – 或者说是一个完整的工作stream程:对不同的翻译进行投票,翻译历史logging,词汇表(有助于保持翻译/语言连贯性),校对,批准等等。更顺利。

  • 发送英文文本进行校对比较容易。通常,让撰稿人直接修改你的代码不是一个好主意:)

缺点

  • 更复杂的项目设置。
  • 较难使用%d,%s等

除了上述考虑之外,还有很多情况下,您希望“密钥”(“msgid”)与源文本(英文)不同。 例如,在HTML视图中,我可能想要说[yyyy]该锚标记的目标和标签取决于用户的区域设置。 例如,它可能是一个社交networking的链接,在美国它将是Facebook,但在中国它将是微博。 所以MsgIds可能是像socialSiteUrl和socialSiteLabel。

我使用混合。

对于基本的string,我不认为会有冲突/变化/奇怪的意思,我会把关键是一样的英文。

在这一天结束的时候,翻译者应该能够坐下来改变每种语言的文本(所以他们的意思相匹配),而不必牵涉已经完成了他/她的工作的程序员。

这让我觉得正确的答案是使用gettext的修改版本,你把这样的string

 _(id, backup_text, context) _('ABOUT_ME', 'About Me', 'HOMEPAGE') 

上下文是可选的

为什么这样? 因为您需要识别系统中使用唯一ID不是英文文本的文本,而这些文本可能会在其他地方重复使用。

您还应该将备份,ID和上下文保留在代码中的相同位置,以减less差异。

id也必须是可读的,这会带来同义词和重复使用的问题(即使是id),我们可以像这样的“HOMEPAGE_ABOUT_ME”或“MAIL_LETTER”这样的ID前缀,但是

  1. 人们忘记在开始时这样做,以后再改变是一个问题
  2. 它更加灵活,使系统能够通过id和上下文进行分组

这就是为什么我最后还添加了上下文variables的原因

备份文本可以是任何东西,甚至可以是“[ABOUT_ME @ HOMEPAGE文本未能加载,请联系example@example.com]”

它不会使用像“poedit”这样的当前的gettext编辑程序,但是我认为你可以为翻译定义自定义的variables名称,比如只是“t()”而没有下划线。

我知道gettext也支持上下文,但没有很好的logging或广泛使用。

PS我不确定最好的可变顺序来执行良好和可扩展的代码,所以build议是值得欢迎的。