【问题标题】:Remove html tags from I18n "translation missing" messages从 I18n“翻译缺失”消息中删除 html 标签
【发布时间】:2012-08-07 10:25:57
【问题描述】:

在视图中考虑以下代码:

<%= link_to 'Delete!', item ,  :confirm => t('action.item.confirm_deletion'), :method => :delete %>

它通常会显示为:

<a href="/items/123" data-confirm="Confirm deletion?" data-method="delete" rel="nofollow">Delete!</a>

但如果 action.item.confirm_deletion 的翻译由于某种原因(不完整的 yml 文件、拼写错误等)丢失,则会显示为:

<a href="/items/123" data-confirm="<span class="translation_missing" title="translation missing: sv.action.item.confirm_deletion">Confirm Deletion</span>" data-method="delete" rel="nofollow">Delete!</a>

这是无效的 html,用户将在主页上看到损坏的 html 标签。 在某些情况下,它也可能存在安全风险。

我知道我可以在每次调用 I18n.t 函数时应用一些转义,但这对于任务来说是不必要的重复。

所以我的问题是: 有没有办法让“翻译缺失”-消息不包含 html 代码。

【问题讨论】:

  • 不太好回答,因为它是 per-t() 调用:t('action.item.confirm_deletion', :default =&gt; 'Are you sure you want to delete this thing?')
  • 谢谢!知道这种可能性总是好的。

标签: ruby-on-rails i18n-gem


【解决方案1】:

有多种解决方案适合您。

您可以将翻译方法别名为您自己的,并使用自定义 :default 值调用(我更喜欢这种方式):

module ActionView
  module Helpers
    module TranslationHelper
      alias_method :translate_without_default :translate

      def translate(key, options = {})
        options.merge!(:default => "translation missing: #{key}") unless options.key?(:default)
        translate_without_default(key, options)
      end
    end
  end
end

或者你可以覆盖默认值:

module I18n
  class MissingTranslation
    def html_message
      "translation missing: #{keys.join('.')}"
    end
  end
end

【讨论】:

  • 谢谢!根据你的第二个提示,我写了一个纯文本版本,用 %(Translation missing: #{keys.join('.')}) 替换空引号
  • 覆盖默认值在 Rails 4.2 上不起作用!
【解决方案2】:

在 Rails 4.2 中,您必须在视图中重新定义 translate 助手:

https://github.com/rails/rails/blob/v4.2.5/actionview/lib/action_view/helpers/translation_helper.rb#L78

在 rails 5 中,您可以在 application.rb 中设置:

config.action_view.debug_missing_translation = false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2019-10-14
    相关资源
    最近更新 更多