我有一个帮助函数,可以生成有用的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: true
或default: xxx
。如果需要在任何地方更改行为,我可以覆盖t
方法。 fr.namespace.translation_symbol
)和原始翻译符号(translation_symbol
),因此我可以在自定义标记中添加自己translation_missing
。EDIT2:我在想类似的东西
t
帮助程序覆盖为rescue I18n::MissingTranslationData => e
<span class="translation..."
答案 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来执行此操作:
答案 2 :(得分:1)
为什么不将translate方法的默认选项设置如下:
<%= t(:my_text, default: "not here") %>
有关设置I18n.translate
方法的默认值的详细信息,请参阅http://guides.rubyonrails.org/i18n.html#defaults。