【Rails 应用实战】3. 多国语系设置

385 阅读3分钟

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 %>