【发布时间】:2018-06-28 04:52:24
【问题描述】:
是否可以在 Rails 5 中使用 I18n 加载单个页面时使用多种语言。例如:我有一个问答页面,问题可以用“英语”显示,下面是另一种区域语言作为翻译供用户理解。表示同时显示两种语言。它可以实现吗?有什么方法可以做同样的事情。
谢谢。
【问题讨论】:
标签: ruby-on-rails internationalization multilingual rails-i18n ruby-on-rails-5.2
是否可以在 Rails 5 中使用 I18n 加载单个页面时使用多种语言。例如:我有一个问答页面,问题可以用“英语”显示,下面是另一种区域语言作为翻译供用户理解。表示同时显示两种语言。它可以实现吗?有什么方法可以做同样的事情。
谢谢。
【问题讨论】:
标签: ruby-on-rails internationalization multilingual rails-i18n ruby-on-rails-5.2
rails-i18n 提供了一个方法with-locale 来覆盖特定代码块的全局设置区域设置。例如如果您已将全局 I18n.locale 设置为,对特定请求说“日语”:
# application_controller.rb
I18n.locale = :ja
但您想在视图中显示某些内容,使用不同的语言环境,如您所说的“英语”,您可以按以下方式进行:
<!-- my_view.html.erb -->
<% I18n.with_locale(:en) do %>
<%= t_question %> <!-- assuming `t_question` is a method, which returns the localised text (in this case, in english) for question in your application -->
<% end %>
<%= t_answer %> <!-- this should render the answer in japanese -->
【讨论】:
我认为在类似的页面中这是不可能的,但对于不同的页面是可能的。
设置语言的有效方法是将其作为前缀添加到 URL。这使搜索引擎能够更好地管理不同的语言版本。假设我们希望 localhost:3000/de 显示我们主页的德语版本, localhost:3000/en 显示英文版本。我们需要在config/routes.rb中写
myapp::Application.routes.draw do
scope "(:locale)", :locale => /en|de/ do
root :to => 'page#index'
get "page/index"
end
end
接下来,我们需要在 app/controllers/application_controller.rb 中设置一个 before_filter。该过滤器将路由设置的参数locale设置为I18n.locale:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :set_locale
private
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
end
【讨论】:
with_locale 以不同的语言显示模板的各个部分。