使用部分模板文件的i18n gem的麻烦

时间:2012-01-07 05:46:03

标签: ruby-on-rails ruby ruby-on-rails-3 internationalization ruby-on-rails-3.1

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

...在我的app/views/users/flag.html.erb文件中:

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

...在我的app/views/users/_flag_form.html.erb文件中:

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

如果在我的config/locales/views/users/en.yml文件中(注意:我正按official RoR guide中的说明组织文件),我使用

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

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

3 个答案:

答案 0 :(得分:17)

<强>配置/区域设置/ 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 => "/users/flag_form" %>

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

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

NB:

  1. 视图的Rails路径必须与符号的YAML路径匹配。您需要在YAML文件中创建与视图名称匹配的条目。省略尾随下划线,因为它是部分的。
  2. 详细了解lazy lookups

答案 1 :(得分:11)

一种方法是使用范围,而不是使用句号“延迟加载”。 这样的事情应该有效:

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

或使用:

I18n.t "users.flag.test_key2"

最后,您甚至可以将其传递给部分,如

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

您还应该查看本网站上的附录部分,因为它可能列出了我遗漏的内容: http://www.unixgods.org/~tilo/Rails/where_is_Rails_trying_to_lookup_L10N_strings.html

答案 2 :(得分:0)

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

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

制作这样的方法是不是很糟糕?