如何解决:i18n始终会转换为默认语言环境

时间:2019-11-12 10:01:13

标签: ruby-on-rails ruby rails-i18n

我正在尝试使用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"

1 个答案:

答案 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