Ruby on rails Rails产品:区域设置切换
在我的应用程序中,我使用会话切换了区域设置。逻辑保持在控制器中:Ruby on rails Rails产品:区域设置切换,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,在我的应用程序中,我使用会话切换了区域设置。逻辑保持在控制器中: class SetLanguageController < ApplicationController def russian I18n.locale = :ru set_session_and_redirect end def english I18n.locale = :en set_session_and_redirect end private def
class SetLanguageController < ApplicationController
def russian
I18n.locale = :ru
set_session_and_redirect
end
def english
I18n.locale = :en
set_session_and_redirect
end
private
def set_session_and_redirect
session[:locale] = I18n.locale
redirect_to :back
rescue ActionController::RedirectBackError
redirect_to :root
end
end
路由中的区域设置代码不需要提问,但如果您感兴趣
get 'rus_locale' => 'set_language#russian'
get 'eng_locale' => 'set_language#english'
它在开发过程中工作得很好,但在生产过程中工作得很好
application.rb
config.i18n.load_path += Dir[Rails.root.join('config','locales', '*.yml').to_s]
config.i18n.default_locale = :ru
我怎样才能使它在生产中发挥作用?谢谢我解决了在应用程序控制器中设置before\u过滤器的问题,如
before_filter :set_locale
def set_locale
I18n.locale = session[:locale] ? session[:locale] : I18n.default_locale
end
但这个解决方案是假的,因为它实际上并没有解决问题的本质——以前的代码是在开发中工作的,而是在生产中工作的。如果您知道如何更灵活地修复它,您将成为wellcome强健的I18n实现:
添加locales.rb初始值设定项以定义您支持的I18n.available\u语言环境:
config/initializers/locales.rb
允许应用程序使用的区域设置
I18n.available_locales=[:en,:fr]
在每种语言的语言环境文件中设置语言名称值,例如fr.yml:
fr:
语言名称:法语
当您添加更多语言时,此ERB将允许您在它们之间切换:
// app/views/layouts/_languages.html.erb
<span class="languages">
<% I18n.available_locales.each do |locale| %>
<% if I18n.locale == locale %>
<%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ), {style: "display:none" } %>
<% else %>
<%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ) %>
<% end %>
<% end %>
</span>
您是否在生产中使用任何类型的缓存?如果是这样,缓存键是否包含区域设置?@PeterGoldstein恐怕我不太明白你的意思。我使用默认的rails会话方法。如果我没有回答你的问题,你能解释一下吗。仅限生产的问题的一个典型来源是缓存,因为它通常在开发中被禁用。所以这是个好地方。由于您的内容将依赖于区域设置,因此如果您正在缓存,则区域设置将需要位于cache_键中。在生产环境中,什么不起作用?这不是在切换区域设置吗?我的问题应该更清楚一点。有什么错误吗?你怎么知道它没有切换?有没有像Peter Goldstein所说的那样涉及缓存?
// app/views/layouts/_languages.html.erb
<span class="languages">
<% I18n.available_locales.each do |locale| %>
<% if I18n.locale == locale %>
<%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ), {style: "display:none" } %>
<% else %>
<%= link_to I18n.t('language_name', locale: locale), url_for( params.clone.permit!.merge(locale: locale, only_path: true ) %>
<% end %>
<% end %>
</span>