我有以下导轨代码:
我尝试使用此
设置应用程序的语言 def changelocale
if Settings.language_supported?(params[:locale])
session[:locale] = params[:locale]
I18n.locale = params[:locale]
end
render "startsite"
end
我想要的是语言切换会影响当前页面。渲染" startsite"是问题,但这可能是一个很好的解决方案吗?
感谢
答案 0 :(得分:4)
你需要的是这些片段:
class ApplicationController < ActionController::Base
before_action :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
def default_url_options(options = {})
{ locale: I18n.locale }.merge options
end
end
第一种方法切换语言环境方法,第二种方法始终将语言环境参数附加到请求。
编辑评论:
# config/routes.rb
scope "/:locale" do
resources :books
end
来自rails doc:http://guides.rubyonrails.org/i18n.html
答案 1 :(得分:0)
您会在I18n Guide中看到您可以拥有本地化视图,从而可以通过添加products/show.de.erb
,products/show.en-uk.erb
等来保持“起始地点”。
我希望changelocal
不是行动,而是before_filter
?过滤器是设置区域设置的最佳解决方案,可以减轻您重定向的需要。
答案 2 :(得分:0)
如果上一页不存在,您可以重定向到上一页或root_path
:
def changelocale
if Settings.language_supported?(params[:locale])
session[:locale] = params[:locale]
I18n.locale = params[:locale]
end
redirect_to request.referer.presence || root_path
end
但是这个重定向可能导致404找不到:如果你去某个节目页面,然后点击删除按钮,现在request.referer
指向一个不存在的记录的节目页面。必须谨慎使用。
答案 3 :(得分:0)
如果区域设置是您网址的一部分(看起来像是这样),您只需更改视图中的链接即可切换到另一个版本的网页。
例如,如果您当前的路径为/en/about
,则可以通过/de/about
并使用您想要的区域设置替换当前区域设置来链接到/fr/about
,request.fullpath
链接到。
这样您就不需要任何过滤器或重定向。