Rails多语言支持
Rails I18n(国际化)
Rails在 2.2 版本以后已经把 I18n 模块引入了 Rails 框架,以前的多语言支持大都采用 localization 插件完成的。在 Rails 2.2 版本后,我们只需要在配置文件中开启 I18n,并写相应语种的资源文件就可以了。I18n 演示例子
1、开启I18n 创建一个配置文件,用于存放本地化的信息( RailsProject> config/initializers/i18n.rb),文件内容如下:I18n.default_locale = 'zh' LOCALES_DIRECTORY = "#{RAILS_ROOT}/config/locales/" LANGUAGES = { 'English' => 'en', 'Chinese' => 'zh' }参数解释: I18n.default_locale 指定默认的本地语言 LOCALES_DIRECTORY 指定存放多国语言文件的目录 LANGUAGES 存储所支持语种 2、在layout文件中加入一个下拉框,给用于提供语种选择(RailsProject> app/views/layouts/base.rhtml ),添加代码如下:
<% form_tag '', :method => 'GET', do %> <%= select_tag 'locale', options_for_select(LANGUAGES, I18n.locale), :onchange => 'this.form.submit()' %> <%= submit_tag 'submit' %> <% end %>
注解:LANGUAGES 就是刚在配置文件中声明的LANGUAGES3、创建一个前置过滤器,用于设定本地化语言(RailsProject> app/controllers/application.rb),代码如下:
class ApplicationController < ActionController::Base layout "base" before_filter :set_locale ........... protected def set_locale session[:locale] = params[:locale] if params[:locale] I18n.locale = session[:locale] || I18n.default_locale locale_path = "#{LOCALES_DIRECTORY}#{I18n.locale}.yml" unless I18n.load_path.include? locale_path I18n.load_path << locale_path I18n.backend.send(:init_translations) end rescue Exception => err logger.error err flash.now[:notice] = "#{I18n.locale} translation not available" I18n.load_path -= [locale_path] I18n.locale = session[:locale] = I18n.default_locale end end
4、用I18n.translate方法(简写I18n.t,甚至t),将页面中写死的字符串替换掉(RailsProject> app/views/layouts/base.rhtml),代码如下:
<head> <title><%= I18n.t 'base.title' %></title> </head> <body> ............ </body>
5、在存放多国语言目录下加入各种语种文件
RailsProject> config/locales/zh.yml 代码如下
zh: base: title: "演示Rails的国际化支持"
RailsProject> config/locales/en.yml 代码如下
en: base: title: "Show Rails internationalization support"
至此,重启服务器,你就可以看到双语网站了。