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

时间:2017-04-03 21:26:14

标签: localization internationalization multilingual

问题

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

  

创建您想要创建吗? [取消] [OK]

  

保存您要保存吗? [取消] [OK]

  

删除您要删除吗? [取消] [OK]

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

选项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"

缺点:键之间有许多重复值。花费大量时间来更改每一个,例如,如果您想将Ok更改为Accept

选项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,则需要更改代码中的变量。

摘要

显然这里没有一个通用的答案,但我想知道是否有一套关于本地化文件变量的使用和重用的最佳实践,特别是在大型多平台应用程序中。

2 个答案:

答案 0 :(得分:1)

我主张选项1.然后加倍。

但实际上,这是一项重要的设计决定,您应该与国际化团队讨论。准备好现在进行谨慎的投资权衡,以及更快,更便宜的本地化后期,而不是现在更快,更便宜的第一个市场时间和以后的返工成本。 “实用”通常归结为对这些权衡的一系列权重。

以下是选项1的情况。立即投资,以便以后更快,更便宜的本地化。你说你感兴趣“特别是在大型多平台应用程序中”。让我们假设“大”也意味着“准备好在世界各地融入大量语言”,并且“足够大以收获规模经济”。

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

随着您对越来越多的语言进行本地化,您越来越有可能遇到原始开发人员不知道要做的区别,因为它们与原始开发人员所说的语言并不重要。

在你的例子中,“this”这个词跳了出来。您省略了句子的对象,名称是为正在创建或保存的事物命名的。根据隐含对象的性别或数量,您没有对“this”这个词做出不同的规定。您应该期望遇到一种语言,其中对象需要明确,或者对于创建与保存的拼写不同。

当您允许将消息存储为完整单元时,您可以让翻译人员和本地人员获得正确使用该短语所需的控制权。

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

答案 1 :(得分:0)

你在这里没有特定的语言,所以我将使用Ruby on Rails将一个简单的玩具示例混合在一起。

选项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

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