Ruby on rails 截取并处理助手中缺少的翻译

Ruby on rails 截取并处理助手中缺少的翻译,ruby-on-rails,ruby,rails-i18n,Ruby On Rails,Ruby,Rails I18n,我有一个助手函数,可以生成有用的HTML标记。My函数通常使用一些参数调用,包括一些用I18nMy_helper(t(:translation_symbol))翻译的文本。 我使用I18nttranslation helper来实现这一点,它(如果保持不变)为没有翻译的文本输出一些… 我想知道如何最好地“截取”这个翻译 我可以在助手中适当地渲染它们 在我的助手之外的正常行为 在我看来,我应该可以把两者都称为 <%= my_helper(t(:my_text)) %> # My h

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

我使用I18n
t
translation helper来实现这一点,它(如果保持不变)为没有翻译的文本输出一些

我想知道如何最好地“截取”这个翻译

  • 我可以在助手中适当地渲染它们
  • 在我的助手之外的正常行为
在我看来,我应该可以把两者都称为

<%= 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>
#我的助手需要处理缺少的翻译
#我想要默认的I18n标记(或自定义标记)“fr.my_text”
我的助手

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
def my_helper(text=nil)
#假设我的文本没有翻译,文本将有价值
#=>“fr.my_text”
如果缺少翻译?(文本)
#处理缺失翻译的代码
doSomething(删除\u翻译\u缺少\u标记(文本))
通知\u翻译\u缺失
其他的
doSomething(文本)
结束
结束
def翻译_缺失?(文本)
#使用某些正则表达式模式检测“”
结束
def删除\u翻译\u缺少\u标记(文本)
#使用某些正则表达式模式从“fr.my_text”提取my_文本
结束
有没有更好的办法?我对使用脏的正则表达式解决方案感到很难过

编辑:额外要求

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

  • 覆盖
    t
    helper到
    rescue I18n::missingtransationdata=>e
  • 如果引发异常,请创建并返回一个自定义对象

    • 如果在html.erb中呈现,将输出通常的
      为什么不将默认选项设置为translate方法,如下所示:

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

      有关设置
      I18n.translate
      方法的默认值的详细信息,请参阅。

      我认为您可以利用这样一个事实,即I18n可以配置为在缺少翻译时引发异常。您可以将
      ActionView::Base.raise\u on\u missing\u translations=true
      设置为在缺少翻译时全局引发异常,也可以将
      :raise=>true
      选项传递给
      t
      翻译助手

      更新:由于您已经在视图中使用了
      t
      帮助程序,并且不想更改它们,因此我认为您唯一的选择是覆盖
      ApplicationHelper
      中的
      t
      帮助程序:

      # ApplicationHelper
      
      def t(key, options = {})
        # try to translate as usual
        I18n.t(key, options.merge(raise: true)
      rescue I18n::MissingTranslationData => e
        # do whatever you want on translation missing, e.g. send notification to someone
        # ...
        "Oh-oh!"
      end
      

      此帮助程序返回翻译文本,如果缺少翻译,则返回“oh-oh”。而且它应该像您当前的视图一样工作。

      因为缺少翻译似乎是您应用程序中的一个痛点,而不是让您的应用程序代码一直关注翻译是否存在,如果可能的话,我建议您确保每次调用
      t
      ,都有翻译,不管语言环境如何(这都是基于这样的假设:调用
      my\u helper(t(:translation\u symbol))
      中的
      :translation\u symbol
      键都是静态的,保存在
      config/locales
      目录中,并且不是动态生成的)

      您可以使用来执行此操作:

      • 确保你的应用程序没有丢失或未使用的键,因此你应该能够删除助手方法中丢失的翻译处理部分
      • 如果存在任何丢失或未使用的翻译,则使您的测试套件/构建过程失败,这样就不会有任何其他接触代码库的人无意中偷看任何翻译。看

      写入<代码>默认值
      就像已经在编写翻译一样。我不想那样。这种默认对我来说毫无用处。我如何检测我的助手中是否缺少翻译?这将在我的助手之外生成异常。但在我的助手之外,我不希望出现例外情况,否则我的网站将崩溃。如果可能的话,我希望避免在我的视图中使用额外的标记(很抱歉,我不能通过查看所有视图来逐个添加
      raise:true
      )。但基本上我仍然需要添加一些标记,我可以在以后检测到。。。我在想,当调用
      my_helper(t(:my_text))
      时,
      t(:my_text)
      可能会输出某种中间对象,可以由我的助手轻松解释,但如果在外部调用(如在捕获块中),则
      将被调用到
      (或调用任何方法)会生成默认的
      你最终找到了一个解决方案,让你得到了你想要的吗?@PaulFioravanti事实上我发现了一些我认为很酷的东西,但我无法在我的视图中将最终文本呈现为HTML。好的,好的。希望你最终得到你想要的工作。我不认为我会在运行时处理丢失的翻译,但是:我认为如果它们对你的应用来说是一个足够大的问题,那么在你部署应用之前,你应该确保没有丢失的翻译,我在一个非常敏捷的开发环境中工作,我的客户通常还不知道他想要什么样的文本(而且,如果他知道英语,他可能还不知道法语)。如果我想翻译的话,标题弹出确实能帮助我很快找到翻译