![](/img/trans.png)
[英]How to configure: Rails - Spree - i18n - /locale in url or default to / for default locale
[英]How to fix: i18n always translate to default locale
我正在尝试使用 i18n 对 Rails 应用程序进行国际化。 我用两种语言做了一些小测试:英语和法语。
我遇到的问题是 i18n 总是转换为默认语言环境。 所以如果是英文,一切都是英文的,法文也是如此。
这是我尝试过的:
配置/初始化程序/locales.rb
# Permitted locales available for the application
I18n.available_locales = [:en, :fr]
应用程序/控制器/application_controller.rb
class ApplicationController < ActionController::Base
def default_url_options
{ locale: I18n.locale }
end
end
配置/应用程序.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
配置/路由.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 个 URL 给了我相同的内容,所以:fr 语言环境实际上不起作用(它返回与:en 相同的翻译)
相同的
localhost:3000/en/about
localhost:3000/fr/about
我也在 Rails 控制台中尝试过:
> I18n.t(:welcome, :en)
"Hello world"
> I18n.t(:welcome, :fr)
"Hello world"
首先设置请求的语言环境:
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 在每个 controller 中的设置不一致,它可能会泄漏到由同一线程/进程服务的后续请求中。 例如,在一个 POST 请求中执行 I18n.locale =:es 将对所有以后对未设置区域设置的控制器的请求产生影响,但仅在该特定线程/进程中。 因此,您可以使用不存在此泄漏问题的 I18n.with_locale 而不是 I18n.locale =。
- 导轨导轨
如果你想为特定视图创建翻译,你应该嵌套键而不是仅仅使用平面散列:
en:
home:
welcome: "Hello World"
fr:
home:
welcome: "Bonjour le monde"
然后在视图中使用隐式查找:
<h1><%= t(.welcome) %></h1>
这解决了home.welcome
的密钥。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.