foo*_*olo 6 ruby-on-rails i18n-gem
请在视图中考虑以下代码:
<%= link_to 'Delete!', item , :confirm => t('action.item.confirm_deletion'), :method => :delete %>
Run Code Online (Sandbox Code Playgroud)
它通常会出现:
<a href="/items/123" data-confirm="Confirm deletion?" data-method="delete" rel="nofollow">Delete!</a>
Run Code Online (Sandbox Code Playgroud)
但是如果由于某种原因(不完整的yml文件,拼写错误等)缺少action.item.confirm_deletion的翻译,它会出现:
<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>
Run Code Online (Sandbox Code Playgroud)
这是无效的html,用户将在主页上看到损坏的html标签.在某些情况下,它也可能存在安全风险.
我知道我可以在每次调用I18n.t函数时使用应用一些转义,但这对于任务来说感觉不必要地重复.
所以我的问题是:有没有办法让"翻译缺失" - 消息不包含HTML代码.
有多种解决方案适合您。
您可以将翻译方法别名为您自己的,并使用自定义: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
Run Code Online (Sandbox Code Playgroud)
或者您可以覆盖默认值:
module I18n
class MissingTranslation
def html_message
"translation missing: #{keys.join('.')}"
end
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2344 次 |
| 最近记录: |