拦截并处理助手中缺少的翻译

时间:2016-03-10 21:25:04

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

我有一个帮助函数,可以生成有用的HTML标记。我的函数通常使用一些参数调用,包括一些用I18n my_helper( t(:translation_symbol) )翻译的文本。

我使用I18n t翻译帮助器,如果不加改动,则为没有翻译的文本输出一些<span class="translation missing">...</span>

我想知道如何最好地拦截&#34;这个翻译错过了

  • 我可以在我的助手中适当地渲染它们
  • 我帮助者以外的正常行为

在我的观点中,我应该可以同时调用

<%= my_helper(t(:my_text)) %> # My helper needs to handle missing translations
<%= t(:my_text) %> # I want default I18n markup (or a custom one) '<span class="translation missing">fr.my_text</span>

我的助手

def my_helper(text=nil)
  # Suppose my_text doesn't have a translation, text will have value 
  # => '<span class="translation-missing">fr.my_text</span>'
  if translation_missing?(text)
    # Code to handle missing translation
    doSomething(remove_translation_missing_markup(text))
    notify_translation_missing
  else
    doSomething(text)
  end
end

def translation_missing?(text)
  # Uses some regex pattern to detect '<span class="translation-missing">'
end
def remove_translation_missing_markup(text)
  # Uses some regex pattern to extract my_text from '<span class="translation-missing">fr.my_text</span>'
end

有更好的解决方法吗?我对使用脏的正则表达式解决方案感到很难。

编辑:额外要求

  • 视图上没有其他标记:我不想单独查看我的文件,以便为每个翻译添加raise: truedefault: xxx。如果需要在任何地方更改行为,我可以覆盖t方法。
  • 在我的助手中,我需要一种方便的方式来操作,如果找到了翻译,只需要翻译的文本,但是对于缺少的翻译,我需要能够轻松地提取翻译的完整路径(fr.namespace.translation_symbol )和原始翻译符号(translation_symbol),因此我可以在自定义标记中添加自己translation_missing

EDIT2:我在想类似的东西

  • t帮助程序覆盖为rescue I18n::MissingTranslationData => e
  • 如果引发异常,请创建并返回一个自定义对象
    • 如果在html.erb中呈现,则会输出通常的<span class="translation..."
    • 包含我可以在助手中重复使用的有用字段(翻译路径,translation_string)

3 个答案:

答案 0 :(得分:2)

我认为您可以利用I18n可以配置为在翻译缺失时引发异常的事实。您可以将ActionView::Base.raise_on_missing_translations = true设置为在缺少翻译时全局引发异常,也可以将:raise => true选项传递给t翻译帮助程序。

更新:由于您已经在视图中使用了t个助手,并且您不想更改它们,因此我认为您唯一的选择是覆盖t帮助器。 {1}}:

ApplicationHelper

这个帮助者要么返回翻译的文本,要么&#34;哦 - 哦&#34;如果翻译失踪。它应该在您当前的视图中按原样运行。

答案 1 :(得分:2)

由于缺少翻译似乎是您应用中的一个难点,而不是让您的应用代码始终关注翻译是否存在,如果可能,我会主张确保您始终 t的每次潜在电话的翻译,无论语言环境如何(这都假设您:translation_symbol来电中的my_helper(t(:translation_symbol))键都是static,保存在config/locales目录中,不是动态生成的。

您可以使用I18n-tasks gem来执行此操作:

  • 确保您的应用没有丢失未使用的密钥,因此您应该能够删除辅助方法中缺少的翻译处理部分
  • 如果有任何遗漏或未使用的翻译,请使您的测试套件/构建过程失败,因此没有其他触及代码库的人会意外地偷偷摸摸。见instructions on copying over their RSpec test

答案 2 :(得分:1)

为什么不将translate方法的默认选项设置如下:

<%= t(:my_text, default: "not here") %>

有关设置I18n.translate方法的默认值的详细信息,请参阅http://guides.rubyonrails.org/i18n.html#defaults