Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails I18n级联-如何使其工作_Ruby On Rails_Ruby On Rails 4_Cascade_Rails I18n - Fatal编程技术网

Ruby on rails Rails I18n级联-如何使其工作

Ruby on rails Rails I18n级联-如何使其工作,ruby-on-rails,ruby-on-rails-4,cascade,rails-i18n,Ruby On Rails,Ruby On Rails 4,Cascade,Rails I18n,我在书中读到了I18n的级联可能性,但我无法让它发挥作用 我试图将blogpost中提到的代码放入应用程序控制器和初始值设定项中,我还试图传递cascade选项,就像在中的注释中提到的那样,但似乎没有任何效果 关于如何在Rails 4应用程序中启动并运行I18n级联,有人有任何提示或工作示例吗?因此,最终实现了这一点 问题是,默认情况下不包括级联模块,因此您必须自己包含它。 不幸的是,似乎没有预定义的配置选项(如使用config.i18n.fallbacks,但如果我错了,请更正),因此您必须手

我在书中读到了I18n的级联可能性,但我无法让它发挥作用

我试图将blogpost中提到的代码放入应用程序控制器和初始值设定项中,我还试图传递cascade选项,就像在中的注释中提到的那样,但似乎没有任何效果


关于如何在Rails 4应用程序中启动并运行I18n级联,有人有任何提示或工作示例吗?

因此,最终实现了这一点

问题是,默认情况下不包括级联模块,因此您必须自己包含它。 不幸的是,似乎没有预定义的配置选项(如使用
config.i18n.fallbacks
,但如果我错了,请更正),因此您必须手动将其包括在内:

# config/application.rb
module NameOfMyApp
  class Application < Rails::Application
    # some config code here
    I18n.backend.class.send(:include, I18n::Backend::Cascade)
    # more config code
  end
end
在您的视图中,您可以这样使用它:

# app/views/account/index.html.erb
<%= t('accounts.index.title', cascade: true) %> # => "Accounts index title"
<%= t('accounts.index.subtitle', cascade: true) %> # => "Default accounts subtitle"
<%= t('accounts.index.footertext', cascade: true) %> # => "Default text for footer"
#app/views/account/index.html.erb
#=>“账户索引标题”
#=>“默认帐户字幕”
#=>“页脚的默认文本”
它还与以下方面合作:

#app/views/account/index.html.erb
#=>“账户索引标题”
#=>“默认帐户字幕”
#=>“页脚的默认文本”

因此,最终实现了这一目标

问题是,默认情况下不包括级联模块,因此您必须自己包含它。 不幸的是,似乎没有预定义的配置选项(如使用
config.i18n.fallbacks
,但如果我错了,请更正),因此您必须手动将其包括在内:

# config/application.rb
module NameOfMyApp
  class Application < Rails::Application
    # some config code here
    I18n.backend.class.send(:include, I18n::Backend::Cascade)
    # more config code
  end
end
在您的视图中,您可以这样使用它:

# app/views/account/index.html.erb
<%= t('accounts.index.title', cascade: true) %> # => "Accounts index title"
<%= t('accounts.index.subtitle', cascade: true) %> # => "Default accounts subtitle"
<%= t('accounts.index.footertext', cascade: true) %> # => "Default text for footer"
#app/views/account/index.html.erb
#=>“账户索引标题”
#=>“默认帐户字幕”
#=>“页脚的默认文本”
它还与以下方面合作:

#app/views/account/index.html.erb
#=>“账户索引标题”
#=>“默认帐户字幕”
#=>“页脚的默认文本”

对已接受的答案提供了一些附加信息(这很好地帮助我找到了正确的方向)

如果还希望级联查找成为translate助手的默认行为,一种方法是重写translate方法。做这件事时,你要尽可能少地操纵,以使它发挥作用。最有可能的是,这个解决方案也应该是向上兼容的——只要翻译助手在方法签名等方面没有太多变化

# e.g. in config/initializers/i18n.rb
# monkey-patch to let I18n.translate (and its alias 't') cascade for keys by default
ActionView::Base.class_eval do
  def translate(key, options = {})
    super(key, options.merge({ cascade: { skip_root: false } }))
  end
  alias t translate
end

这个解决方案也同样适用于Rails 4.0.4,并用Rails 4.0.4进行了测试。

对公认的答案提供了一些额外的信息(这很好地帮助我找到了正确的方向)

如果还希望级联查找成为translate助手的默认行为,一种方法是重写translate方法。做这件事时,你要尽可能少地操纵,以使它发挥作用。最有可能的是,这个解决方案也应该是向上兼容的——只要翻译助手在方法签名等方面没有太多变化

# e.g. in config/initializers/i18n.rb
# monkey-patch to let I18n.translate (and its alias 't') cascade for keys by default
ActionView::Base.class_eval do
  def translate(key, options = {})
    super(key, options.merge({ cascade: { skip_root: false } }))
  end
  alias t translate
end

此解决方案也适用于,并使用Rails 4.0.4进行了测试。

非常有用。谢谢你回答自己的问题!非常有用。谢谢你回答自己的问题!我记得我曾尝试过类似的解决方案,但我遇到了一些麻烦,尽管一开始看起来很有希望。但是我没有使用skip_root选项,所以这可能会奏效。你知道这个选项实际上是做什么的吗?考虑到级联机制的实现,我想说skip_root选项注意在I18n键的作用域中循环至少运行两次(查看while条件)如果有一个足够大的范围可以再次切片,并且在第一次迭代中没有返回结果。现在,当我深入研究这个问题时,我真的看不出有什么意义——我可能会考虑在一些测试之后再删除这个选项。我记得我尝试了一个类似的解决方案,但是我遇到了一些麻烦,虽然开始时看起来很有前途。但是我没有使用skip_root选项,所以这可能会奏效。你知道这个选项实际上是做什么的吗?考虑到级联机制的实现,我想说skip_root选项注意在I18n键的作用域中循环至少运行两次(查看while条件)如果有一个足够大的范围可以再次切片,并且在第一次迭代中没有返回结果。现在,当我深入研究这个问题时,我真的看不出这个选项的意义——我可能会考虑在一些测试之后再删除这个选项。