我正在尝试使用i18n进行Rails应用程序的国际化。我用两种语言进行了一些小测试:英语和法语。
我的问题是i18n始终转换为默认语言环境。因此,如果使用的是英语,则所有内容都将使用英语,而使用法语则相同。
这是我尝试过的:
config / initializers / locales.rb
# Permitted locales available for the application
I18n.available_locales = [:en, :fr]
app / controllers / application_controller.rb
class ApplicationController < ActionController::Base
def default_url_options
{ locale: I18n.locale }
end
end
config / application.rb
module LanguageApp
class Application < Rails::Application
...
config.i18n.load_path += Dir["#{Rails.root.to_s}/config/locales/**/*.{rb,yml}"]
config.i18n.default_locale = :en
# I change the default locale here to :fr or :en
end
end
config / routes.rb
root to: "home#index"
get '/:locale/about' => 'about#index'
get '/:locale' => 'home#index'
我这样组织yml文件:
config / locales / views / about / en.yml
en:
about: "This page is about us."
config / locales / views / about / fr.yml
fr:
about: "Cette page est à propos de nous."
config / locales / views / home / en.yml
en:
welcome: "Hello world"
config / locales / views / home / fr.yml
fr:
welcome: "Bonjour le monde"
最后是我的观点:
app / views / about / index.html.erb
About us page. <%= t(:about) %>
app / views / home / index.html.erb
This is the homepage. <%= t(:welcome) %>
我认为问题可能出在我整理yml文件的方式上,但我不明白为什么i18n仅转换为默认语言环境而“忽略”其他语言。
编辑:
要在运行Rails服务器的浏览器中尝试此操作,我尝试访问以下URL:
localhost:3000
localhost:3000/en
localhost:3000/fr
这3个网址为我提供了相同的内容,因此:fr语言环境实际上不起作用(它返回的内容与:en相同)
与
相同localhost:3000/en/about
localhost:3000/fr/about
我也在rails控制台中尝试过:
> I18n.t(:welcome, :en)
"Hello world"
> I18n.t(:welcome, :fr)
"Hello world"
答案 0 :(得分:0)
首先设置请求的语言环境:
class ApplicationController < ActionController::Base
around_action :switch_locale
def switch_locale(&action)
I18n.with_locale(params[:locale] || I18n.default_locale, &action)
end
def default_url_options
{ locale: I18n.locale }
end
end
不要像许多较早的答案/教程那样使用I18n.locale=
。
I18n.locale可能泄漏到相同请求的后续请求中 线程/进程(如果未在每个控制器中一致地设置)。对于 在一个POST请求中执行I18n.locale =:es的示例将具有 以后对未设置控制器的控制器的所有请求的效果 语言环境,但仅在该特定线程/进程中。是因为, 而不是I18n.locale =您可以使用I18n.with_locale 有这个泄漏问题。
-Rails Guides
如果要为特定视图创建翻译,则应嵌套键,而不仅仅是使用平散列:
en:
home:
welcome: "Hello World"
fr:
home:
welcome: "Bonjour le monde"
然后在视图中使用隐式查找:
<h1><%= t(.welcome) %></h1>
这会将密钥解析为home.welcome
。