Ruby on rails 截取并处理助手中缺少的翻译
我有一个助手函数,可以生成有用的HTML标记。My函数通常使用一些参数调用,包括一些用I18nRuby 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
My_helper(t(:translation_symbol))翻译的文本。
我使用I18nt
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
- 覆盖
helper到t
rescue I18n::missingtransationdata=>e
- 如果引发异常,请创建并返回一个自定义对象
- 如果在html.erb中呈现,将输出通常的
就像已经在编写翻译一样。我不想那样。这种默认对我来说毫无用处。我如何检测我的助手中是否缺少翻译?这将在我的助手之外生成异常。但在我的助手之外,我不希望出现例外情况,否则我的网站将崩溃。如果可能的话,我希望避免在我的视图中使用额外的标记(很抱歉,我不能通过查看所有视图来逐个添加为什么不将默认选项设置为translate方法,如下所示:
<%= t(:my_text, default: "not here") %>
有关设置
方法的默认值的详细信息,请参阅。我认为您可以利用这样一个事实,即I18n可以配置为在缺少翻译时引发异常。您可以将I18n.translate
设置为在缺少翻译时全局引发异常,也可以将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。好的,好的。希望你最终得到你想要的工作。我不认为我会在运行时处理丢失的翻译,但是:我认为如果它们对你的应用来说是一个足够大的问题,那么在你部署应用之前,你应该确保没有丢失的翻译,我在一个非常敏捷的开发环境中工作,我的客户通常还不知道他想要什么样的文本(而且,如果他知道英语,他可能还不知道法语)。如果我想翻译的话,标题弹出确实能帮助我很快找到翻译
- 如果在html.erb中呈现,将输出通常的