问题描述
在我的双语Rails 4应用程序中,我有一个LocalesController
像这样:
In my bi-lingual Rails 4 application I have a LocalesController
like this:
class LocalesController < ApplicationController
def change_locale
if params[:set_locale]
session[:locale] = params[:set_locale]
url_hash = Rails.application.routes.recognize_path URI(request.referer).path
url_hash[:locale] = params[:set_locale]
redirect_to url_hash
end
end
end
用户可以通过以下形式更改其语言环境:
A User can change his locale through this form:
def locale_switcher
form_tag url_for(:controller => 'locales', :action => 'change_locale'), :method => 'get', :id => 'locale_switcher' do
select_tag 'set_locale', options_for_select(LANGUAGES, I18n.locale.to_s)
end
这有效.
但是,现在用户无法通过URL更改语言.
However, right now there's no way for the user to change the language via the URL.
例如如果用户在页面www.app.com/en/projects
上,然后手动将URL更改为www.app.com/fr/projects
,则他应该看到页面的法语版本,但是什么也没发生.
E.g. if a user is on the page www.app.com/en/projects
and then manually changes the URL to www.app.com/fr/projects
, he should see the French version of the page, but instead nothing happens.
这在许多Rails应用程序中可能无关紧要,但在我的系统中非常重要.
This may not matter in many Rails apps but in mine it is quite important.
如何解决?
感谢您的帮助.
推荐答案
这是我在Rails 4应用程序之一中所做的:
This is how I did it in one of Rails 4 applications:
在 config/routes.rb 中:
Rails.application.routes.draw do
scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
# rest of your routes here
# for example:
resources :projects
end
end
确保在 config/environments/production.rb 中未注释此行:
config.i18n.fallbacks = true
如果您希望使用除:en
以外的default_locale
设置,请在 config/application.rb 中取消注释此行:
If you wish to have a default_locale
setup other than :en
, then in config/application.rb, uncomment this line:
config.i18n.default_locale = :de # and then :de will be used as default locale
现在,设置的最后一部分,在ApplicationController
中添加此方法:
Now, last part of your setup, add this method in ApplicationController
:
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
before_action :set_locale
private
def set_locale
I18n.locale = params[:locale] || session[:locale] || I18n.default_locale
session[:locale] = I18n.locale
end
def default_url_options(options={})
logger.debug "default_url_options is passed options: #{options.inspect}\n"
{ locale: I18n.locale }
end
end
现在,您的应用程序可以通过以下方式访问:http://localhost:3000/en/projects
,http://localhost:3000/fr/projects
或http://localhost:3000/projects
.最后一个http://localhost:3000/projects
将使用:en
作为其默认语言环境(除非您在application.rb中进行了更改).
Now, your application can be accessed as: http://localhost:3000/en/projects
, http://localhost:3000/fr/projects
, or http://localhost:3000/projects
. The last one http://localhost:3000/projects
will use :en
as its default locale(unless you make that change in application.rb).
这篇关于如何通过URL更改语言环境?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!