使用 and/or 重用本地化字符串的最实用方法是什么

What is the most practical approach to using and/or reusing localized strings

问题

假设我至少有 3 个不同的对话框视图:

Create Would you like to create this? [Cancel][OK]


Save Would you like to save this? [Cancel][OK]


Delete Would you like to delete this? [Cancel][OK]


创建要在这种情况下使用的 key/value 对的最实用方法是什么?

选项 1:每个视图的唯一键

createTitle : "Create"
createDescription : "Would you like to create this?"
createPositiveButton: "OK"
createNegativeButton: "Cancel"

saveTitle : "Save"
saveDescription : "Would you like to save this?"
savePositiveButton: "OK"
saveNegativeButton: "Cancel"

deleteTitle : "Delete"
deleteDescription : "Would you like to delete this?"
deletePositiveButton: "OK"
deleteNegativeButton: "Cancel"

缺点:键之间有很多重复值。花很多时间来改变每一个,例如,如果你想改变 OkAccept

选项 2:普通字符串的可重用变量

genericPositiveButton: "OK"
genericNegativeButton: "Cancel"

createTitle : "Create"
createDescription : "Would you like to create this?"

saveTitle : "Save"
saveDescription : "Would you like to save this?"

deleteTitle : "Delete"
deleteDescription : "Would you like to delete this?"

缺点:如果需要个别改动,比如把OK改成Confirm Create Confirm SaveConfirm Delete那么代码中的变量就需要改了。

总结

显然这里没有放之四海而皆准的答案,但我想知道是否有一套关于本地化文件变量的使用和重用的最佳实践,尤其是在大型多平台中申请。

您在这里没有具体说明语言,所以我将在 Rails 上使用 Ruby 来散列一个简单的玩具示例。

选项 3:翻译缺失时回退

verbs:
  save: 'save'
  delete: 'delete'
  create: 'create'
dialogs:
  default:
    ok: 'OK'
    cancel: 'Cancel'
    title: '%{verb}'
    text: 'Would you like to %{verb} this?'
  delete:
    text: 'Are you sure you want to %{verb} this? Warning: This cannot be undone'
  save:
    ok: 'Confirm %{verb}'

然后您可以使用足够智能的助手来使用这些回退:

module DialogHelper
  def dialog_text(verb, field)
    translated_verb = t("verbs.#{verb}")
    t("dialogs.#{verb}.#{field}", default: t("dialogs.default.#{field}", verb: translated_verb), verb: translated_verb)
  end

  def nicely_render_a_dialog(verb)
    render(partial: 'nice_dialog_box', locals: {verb: verb}) # This then calls dialog_text(verb, 'ok'), dialog_text(verb, 'cancel') repeatedly
  end

  def create_dialog
    nicely_render_a_dialog('create')
  end

  # et cetera...
end

如果您想更改默认的 "OK" 文本,它只在一个地方定义。如果你想专门覆盖删除确认文本,你只需在 dialogs.delete 子树下写一个案例。我还没有找到任何已发布的此类最佳实践,但我想一个层次结构,可能具有多层回退,将提供您所追求的那种灵活性。

我支持选项 1。并且加倍努力。

但实际上,这是一个重要的设计决定,您应该与您的国际化团队讨论一下。准备好在现在的投资和以后更快、更便宜的本地化与现在更快、更便宜的首次上市时间和以后的返工成本之间进行谨慎的权衡。 "Practical" 通常归结为对这些权衡的一组权重。

这是选项 1 的情况。现在投资,以便以后更快、更便宜的本地化。你说你有兴趣"especially in a large multi-platform application"。假设 "large" 也表示 "ready to be localised into a large number of languages around the world" 和 "large enough to harvest economies of scale"。

任何大规模完成的本地化都应该涉及自动化,由核心开发人员、本地化团队和进行翻译的语言服务提供商进行。一个重要的自动化是使用 translation memory。此工具可识别源短语何时与已翻译的源短语相同或相似,并提供翻译以供与该源短语重复使用。

随着您本地化到越来越多的语言,您越来越有可能遇到原始开发人员不知道的区别,因为它们与原始开发人员使用的语言无关紧要。

在你的示例中,"this" 这个词突然出现在我面前。你省略了句子的宾语,即命名正在创建或保存的事物的名词。您没有规定根据隐含对象的性别或数量以不同方式拒绝单词 "this"。您应该会遇到一种语言,在这种语言中,对象需要是明确的,或者对对象的引用在创建和保存时拼写不同。

当您允许将消息存储为完整单元时,您就允许翻译人员和本地化人员控制他们获得正确短语所需的控制权。

您不必担心将 "OK" 更改为 "Accept" 所需的努力。如果你有自动化,并且按钮文本的键拼写一致,那么你应该能够编写一个工具来批量更改。例如,正则表达式可以识别键 "createPositiveButton"、"deletePositiveButton" 和 "savePositiveButton",然后将所有这些键之后的 "OK" 文本更改为 "Accept",在一个动作。