The*_*ner 6 locale ruby-on-rails rails-i18n ruby-on-rails-4
我正在尝试开发双语应用程序.
但是,我发现默认的i18n gem不会持久化语言环境.
我有这个索引页面并提供了一个更改默认语言的链接.
<% if I18n.locale == I18n.default_locale %>
<%= link_to "English", :locale=>'en'%>
<% else %>
<%= link_to "Français", :locale=>'fr'%>
<%end%>
Run Code Online (Sandbox Code Playgroud)
问题是当我登录到另一个页面时,语言环境会回退到默认语言.
所以,我只是想知道如何保持用户语言选择并持续使用该语言环境直到用户注销.
提前致谢.
我建议您阅读有关I18n的Rails指南,以了解I18n在Rails中的工作方式。很明显,的更改I18n.locale是临时的,并且将在每个会话中重置。
根据您的要求,您可以将选定的语言环境存储在中session。这是示例代码:
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_action :set_locale
def set_locale
I18n.locale = params[:locale] || session[:locale] || I18n.default_locale
session[:locale] = I18n.locale
end
end
Run Code Online (Sandbox Code Playgroud)
然后,您可以清除session[:locale]用户退出的时间。
# app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
def sign_out
# ...
session.delete :locale
end
end
Run Code Online (Sandbox Code Playgroud)
如果你看docs它说
您可能想将所选区域设置存储在会话或 cookie 中,但不要这样做。区域设置应该是透明的并且是 URL 的一部分。这样您就不会破坏人们对网络本身的基本假设:如果您向朋友发送 URL,他们应该看到与您相同的页面和内容。
如果您在域名或网址中设置本地变量,那么它有几个优点
1. The locale is an obvious part of the URL.
2. People intuitively grasp in which language the content will be displayed.
3. It is very trivial to implement in Rails.
4. Search engines seem to like that content in different languages lives at different, inter-linked domains.
Run Code Online (Sandbox Code Playgroud)
使固定
A。您可以在 url 中传递本地变量,然后将其设置为过滤器:
在这种情况下,您的网址将类似于www.example.com/books?locale=ja or www.example.com/ja/books应用程序控制器中的您可以在过滤器中设置本地网址
before_action :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
Run Code Online (Sandbox Code Playgroud)
在每个 URL 中包含显式选项(例如 link_to( books_url(locale: I18n.locale))) 会很乏味,而且可能是不可能的,因此您可以在应用程序控制器中通过类似的内容覆盖 Rails default_url_options
# app/controllers/application_controller.rb
def default_url_options(options={})
logger.debug "default_url_options is passed options: #{options.inspect}\n"
{ locale: I18n.locale }
end
Run Code Online (Sandbox Code Playgroud)
这将允许每个依赖于 url_for 的帮助器方法(例如 root_path 或 root_url 等命名路由的帮助器、books_path 或 books_url 等资源路由等)现在将自动在查询字符串中包含区域设置,如下所示:http://www。 example.com/?locale=ja。
但如果你更喜欢使用你的网址,www.example.com/en/books你需要重写default_url_options方法,并且你必须像这样限制你的路由范围:
# config/routes.rb
scope "(:locale)", locale: /en|nl/ do
resources :books
end
Run Code Online (Sandbox Code Playgroud)
人们可以在浏览器或其他客户端(例如curl)中设置Accept-Language,您可以在应用程序控制器中像这样使用它:
def set_locale
logger.debug "* Accept-Language: #{request.env['HTTP_ACCEPT_LANGUAGE']}"
I18n.locale = extract_locale_from_accept_language_header
logger.debug "* Locale set to '#{I18n.locale}'"
end
private
def extract_locale_from_accept_language_header
request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3395 次 |
| 最近记录: |