首页 > 解决方案 > 如何有选择地停用 Rails I18n translation_missing spans?

问题描述

在我的 Rails 5.2 应用程序中,我几乎所有的 UI(管理区域除外)都使用 t() 进行了国际化。“翻译缺失”跨度经常破坏布局,但我认为这是值得付出的代价,以便知道我何时可能拼错了键或未提交文件或其他内容。然而,有一个地方跨度确实不起作用,那就是当涉及到人们在我的小组中所拥有的自我描述的角色时。这些角色可以是我的 en.yml 中的预定义字符串,例如“coordinator”、“treasurer”等,但它们也可以是写入的,例如“minister of awesome”。这样做t("groups.roles." + role)不起作用,因为“翻译缺失”跨度会弄乱布局。这在以前版本的 Rails 中不是问题,因为生产环境中自动禁用了“翻译缺失”跨度,并且只显示了密钥的最后一部分,即正是我想要的功能。在 Rails 5.2 中,跨度也出现在生产环境中,这是一个问题,至少对于这一部分而言。

我真正想要的功能,曾经是标准的,是:

  1. 如果翻译存在,则显示它。
  2. 如果翻译不存在,则显示来自 en.yml 的英文字符串(英文被定义为备用语言)
  3. 如果英文也不存在,则显示密钥的最后一部分。在开发中“缺少翻译”跨度,而在生产中没有它们。

标签: ruby-on-railsinternationalizationruby-on-rails-5rails-i18n

解决方案


我在这里浏览了有关如何在生产中禁用这些错误消息的所有答案,建议的解决方案似乎适用于 Rails 4 或不起作用。或者它们具有停用后备翻译的副作用,这对我来说是一个不可接受的权衡,因为我的大部分应用程序都需要英语后备。覆盖或扩展TranslationHelper似乎是一项艰巨的任务,尤其是因为我只希望在生产中删除跨度(就像它曾经工作的那样)。因此,就我的情况而言,就目前而言,我决定不进行完全覆盖,并且只在我希望缺少不成问题的翻译的地方更改了助手:

def human_role(role)
  str = t("groups.roles." + role)
  if str.include?("translation missing")
    role
  else 
    str
  end
end

推荐阅读