6.4 I18n
- i18n
- helper
在 [4.4.5 使用中文的校验信息] 一节中,我们简单的应用了 I18n,这里我们详细的扩展一下。
因为 Internationalization 的 I 和 N 之间有18个字母,所以它简称 I18n。Rails 通过 I18n 为项目提供多语言包支持,这也要求我们在开发过程中,按照 I18n 的方式处理显示文字。
Rails 默认使用一个单一的 I18n 文件,它在 ,这对于中型以上,以及使用多个 Gem 的应用是不足的,我们将整个文件夹下的所有内容,都加在到 i18n 的路径中:
config/application.rb
这样做的好处是,我们可以把一些 gem 的语言包,放到我们自己项目中维护。比如一些 gem 的 zh-CN 语言包缺失,或者翻译不准确的语言包。
然后设定我们默认的语言包。
config.i18n.default_locale = :"zh-CN"
6.4.2.1 t 和 l
I18n 有两个常用的显示方法:
查找方法 | 对应语言包结构 | 含义 |
I18n.t(“name”) | zh-CN: name: “姓名” | 从根节点开始查找 |
I18n.t(“.name”) | zh-CN: users: show: name: “姓名” | 根据视图路径查找:views/users/show.html.erb |
I18n.t(“name”, scope: “users.show”) | zh-CN: users: show: name: “姓名” | 指定从哪个节点开始查找 |
I18n.l 会按照语言包中定义的时间格式来显示,为了方便编辑,我将它放到了 config/locales/defaults/zh-CN.yml
中,它来自 。
6.4.2.2 使用变量
我们在语言包中可以定义变量:
zh-CN:
显示时,传入该变量:
I18n.t("hello", name: "Ruby")
6.4.2.3 使用复数
在我们的语言里,你
和 你们
是 不一样的含义,而英语里都是 You
,在语言包里可以定义单复数:
调用时:
I18n.t("hello", count: 1)
=> "你好"
I18n.t("hello", count: 2)
=> "你们好"
6.4.2.4 使用HTML
如果 key 带有 _html,或者定义了 html 的 key,会认为它是 安全的 HTML,否则输出将被 escape:
config/locales/en.yml
en:
hello_html: <b>hello!</b>
title:
html: <b>title!</b>
<%= t('welcome') %>
<%= raw t('welcome') %>
<%= t('hello_html') %>
<%= t('title.html') %>
这个例子来自。
6.4.2.4 显示 Model 属性
会显示我们定义在语言包中的属性名称,
Model.model_name.human
则会显示该类的名称。为了方便维护每一个 Model,我们在 locales 目录下,为每个 Model 建立了自己的文件夹,放置单独的语言包。
这是我们Order 的语言包,它在 config/locales/models/order/zh-CN.yml
:
activerecord:
models:
order: 订单
attributes:
number: 订单号
对于一些属性,可能有两种不同的情况,比如性别:
en:
activerecord:
attributes:
user/gender:
female: "Female"
male: "Male"
我们显示的时候,需要这样调用:
before_action :set_locale
def set_locale
end
我们可以将选择的语言包名称储存在 session 中(虽然手册上步推荐这样做),也可以通过地址参数,比如 ?local=zh-CN&....
,或者使用 routes 来设定地址规则,比如 /zh-CN/products/...
来修改显示的语言包。(手册推荐后两种方式)