3-1 配置中文语系
Rails 支持多国语系(Internationalization,简称 I18n),预设的语系是英文,请先修改 config/application.rb 将预设改为中文:
class Application < Rails::Application
+ config.i18n.default_locale = "zh-CN"
end
所谓的多国语系的功能,是指网站中的句子和单字,可以根据用户的需求进行切换。实际的作法就是准备翻译词汇档,然后将样板中本来写死的文字,置换成调用 I18n 方法。
例如,请新增 config/locales/zh-CN.yml 这个词汇 YAML 档:
"zh-CN":
event_list: 活動列表
admin:
event_list: 活動列表管理
修改config/locales/en.yml
"en":
+ event_list: Event List
+ admin:
event_list: Admin Event List
注意 YAML 格式的缩排必须使用两个空格,Tab 是不允许的。直接复制贴上可能会有问题,请小心检查缩排。
修改app/views/events/index.html.erb
- <h1>Event List</h1>
+ <h1><%= t("event_list") %></h1>
修改app/views/admin/events/index.html.erb
- <h1>Admin Event List</h1>
+ <h1><%= t("admin.event_list") %></h1>
也可以写成
t("event_list", :scope => "admin")结果是一样的
其中 t 等同于I18n.t,是个Helper 方法,会根据语系来做字串的替换。
重启服务器,浏览看看就会发现这个单字被替换成中文了。
新增词汇档案需要重启服务器,修改词汇不需要。
3-2 词汇中内嵌变数
有些句子可能会需要内嵌变数,可以使用 %{variable_name} 的语法,例如:
"zh-CN":
+ hello: "亲~ %{name} 你好:"
"en":
- hello: "Hello world"
+ hello: "Hi %{name},"
修改app/views/layouts/application.html.erb
- <%= current_user.display_name %>
+ <%= t( "hello", :name => current_user.display_name) %>
如果我们的网站不需要支援多国语系,你可能会觉得这样做有点辛苦,直接将中文写在样板上就好了。
但这个功能对于团队协作开发网站仍然非常有帮助,因为写程式的时候不一定会先确定文案规格,用I18n 来处理的话,最后只需要让 PM 统一修改翻译词汇档即可。
3-3 安装 Rails 中文翻译词汇档
Rails 本身就有用到 I18n 的功能,可以安装 rails-i18n 这个 gem 有开源社区做好的中文翻译:
编辑 Gemfile,加上
gem "rails-i18n"
执行bundle
重启服务器。会被翻译的词汇请参考github.com/svenfuchs/r…
3-4 安装 Devise 翻译档
Devise 也有用到 I18n,可以安装 devise-i18n 这个 gem 有开源社区做好的中文翻译:
请编辑Gemfile,加上
gem "devise-i18n"
执行bundle
重启服务器。会被翻译的词汇请参考github.com/tigrish/dev…
3-5 Model 字段翻译
在套用上述的翻译词汇档之后,你可能会注意到 Model 验证错误讯息会变成如 Name 不能为空字符,如果需要进一步中文化字段名称,你可以新增 config/locales/events.yml 内容如下:
zh-CN:
+ activerecord:
+ attributes:
+ event:
+ name: "活动名称"
+ description: "描述"
其实,翻译档档名叫 events.yml、zh-TW.yml、en.yml 什么都无所谓,重要的是 YAML 结构中第一层要对应 locale 的名称,也就是zh-CN,Rails 会加载 config/locales 下所有的 YAML 词汇档案。
3-6 如何让使用者可以切换多语系
刚刚我们准备了中文和英文翻译档案,但是并没有提供切换的机制。
接下来请编辑 app/controllers/application_controller.rb 中加入:
+ before_action :set_locale
+
+ def set_locale
+ # 可以将 ["en","zh-CN"] 设定为 VALID_LANG 放到 config/environment.rb 中
+ if params[:locale] && I18n.available_locales.include?( params[:locale].to_sym )
+ session[:locale] = params[:locale]
+ end
+
+ I18n.locale = session[:locale] || I18n.default_locale
+ end
修改app/views/layouts/application.html.erb
+ <%= link_to "中文版", :controller => controller_name, :action => action_name, :locale => "zh-CN" %>
+ <%= link_to "English", :controller => controller_name, :action => action_name, :locale => "en" %>
</div>
</body>
浏览并点选中文版、English 就会进行切换了。
3-7 语系样板
除了上述一个单字一个单字的翻译词汇替换之外,如果样板内大多是属于较为静态的内容,Rails 也提供了不同语系可以有不同样板,你只要将样板命名加上语系附档名即可,例如我们来产生FAQ 页面:
执行bin/rails generate controller pages
编辑config/routes.rb
+ get "/faq" => "pages#faq"
新增app/views/pages/faq.zh-CN.html.erb
新增app/views/pages/faq.en.html.erb
如此在英文版的时候就会使用 faq.en.html.erb 这个样板,中文版时使用 faq.zh-CN.html.erb 这个样板。
最后,编辑 app/views/layouts/application.html.erb 放上FAQ 页面的连结:
<%= yield %>
+ <%= link_to "FAQ", faq_path %>