9

我使用的是Ruby on Rails 3.1,我想知道如何正确处理与部分模板文件相关的国际化。也就是说,...在部分模板文件中使用国际化的麻烦

...我app/views/users/flag.html.erb文件我有:

<%= t('.test_key1') %> 
<%= render :partial => "https://stackoverflow.com/users/flag_form" %> 

...我app/views/users/_flag_form.html.erb文件我有:

<%= t('.test_key2') %> 

如果我config/locales/views/users/en.yml文件( note:我按照official RoR guide的规定组织档案)我用

en: 
    users: 
    flag: 
     test_key1: Test 1 text 
     test_key2: Test 2 text 

Test 1 text的显示在 “主” 模板app/views/users/flag.html.erbTest 2 text不是用于部分模板app/views/users/_flag_form.html.erb)。 我该如何解决这个问题,以便正确显示Test 2 text

+0

这不会解决你的问题(和我),但可以帮助理解其中轨寻找翻译https://github.com/256dpi/rails-i18n-debug – masciugo 2012-11-19 15:33:39

回答

10

一种方法是使用范围,而不是使用句号的“延迟加载”。 像这样的东西应该工作:

I18n.t :test_key2, :scope => 'users.flag' 

或使用:

I18n.t "users.flag.test_key2" 

最后,你甚至可以将它传递给部分在

<%= render :partial => "https://stackoverflow.com/users/flag_form", :locals => { :test_key => t('.test_key1') } %> 

你也应该检出的附录部分在这个网站上,因为它可能会列出我丢失的东西: http://www.unixgods.org/~tilo/Rails/where_is_Rails_trying_to_lookup_L10N_strings.html

+0

你的链接是死的:( – 2015-10-30 14:22:57

0

我写过这个。你怎么看待这件事?

def translate_for_partials key, *args 
    I18n.t("#{params[:controller].gsub('/', '.')}.#{params[:action]}.#{key}", *args) 
end 

这样做是不是很糟糕?

+0

在意见,你可以做一个更清洁的版本: I18n.t(“#{controller_name}。#{controller.action_name}。#{key}”) – Magnuss 2013-05-08 08:12:05

+0

Magnuss,这是嵌套控制器'params [:控制器] .gsub('/','。')' – 2016-01-18 09:10:58

15

配置/语言环境/ en.yml

en: 
    users: 
    flag: 
     test_key1: Test 1 text 
    flag_form: 
     test_key2: Test 2 text 

应用/视图/用户/ flag.html.erb

<%= t('.test_key1') %> 
<%= render :partial => "https://stackoverflow.com/users/flag_form" %> 

应用/视图/用户/ _flag_form.html .erb

<%= t('.test_key2') %> 

NB:

  1. 滑轨路径视图必须YAML路径分配给符号匹配。您需要在YAML文件中创建与视图名称匹配的条目。由于它是局部的,省略尾部下划线。
  2. 了解更多关于lazy lookups
+2

TL; DR在_partial文件名中保留下划线,不加下划线地构建你的YAML树en:user:partial: – givanse 2013-12-10 23:02:20