Ruby & RailsRuby、Rails知识Rails 成功之路

Ruby on Rails网站语言国际化

2016-09-08  本文已影响289人  老码农不上班

涉及到在Git@OSC中的一些应用

Gem

Rails项目双语化的时候需要用到Rails-18nhttp_accept_languageGem

configuration

config/application.rb文件中基本的设置如下

config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] #
config.i18n.default_locale = 'zh-CN'
config.i18n.available_locales = ['zh-CN', 'en', 'zh-TW']
config.i18n.fallbacks = true  #当应用程序需要的语言文件缺失时,使用默认的语言文件default_locale

同时I18n.config.enforce_available_locales默认是true,要改变为true

ApplicationController

用户请求通过路由器发送到对应的action之前应在application_controller中设置好网站的语言种类:
before_filter set_locale

def set_locale
  if cookies[:user_locale] && I18n.available_locales.include?(cookies[:user_locale].to_sym)
    l = cookies[:user_locale].to_sym
  else
    l = http_accept_language.compatible_language_from(I18n.available_locales)
    cookies.permanent[:user_locale] = l
  end
  I18n.locale = l || I18n.locale
end

Git@OSC网站国际化的策略是:首先读取用户的浏览器中是否包含语言设置的cookie(下文会涉及到把语言设置的cookie写到用户浏览器中)并且判断网站是非提供该语言;如果不满足上诉判断,则通过http_accept_language获取用户浏览器对语言设置的偏好,并且与网站中提供的语言匹配出来之后设置到用户浏览器的cookie中,以便下次读取用户的请求中判断是否包含已经设置的语言种类。

用户主动选择网站的语言

国际化的网站中都有语言列表供用户选择,这是用户主动根据自己的语言偏好设置对此网站进行访问。
Git@OSC对此的实现是这样的:

view、controller、model、xxx.js.coffee中对语言配置文件的读取

rails项目config/locals目录下有各种语言以及Gem对应的语言版本配置文件,这些配置文件中rails项目各个模块中的引用不进相同。

网站中时间的国际化

不推荐使用rails的time_ago_in_words帮助方法。原因为这事后端渲染导致了一个问题。比如你打开一个网页,显示的是一分钟前,然而不关闭次网页,一段时间之后应比一分钟之前的“一分钟之前”还要长了,但是后端渲染无法做到动态改变此时间。那么timeago就应运而出现。
添加必要的jquery.timeago.js"这里有各种国际语言供你选择jquery-timeago
首先封装一个帮助方法以便我们在视图中使用app/helpers/time_helper.rb

module TimeHelper
  def timeago(time)
    content_tag(:span, time.iso8601, title: time.iso8601, class: 'timeago')
  end
end

然后在application.js中加入

$('.timeago').timeago()

最后就可以在视图中使用了

"posted #{timeago(post.created_at)} #{t('ago')}"

缓存相关

在rails项目中,国际化的网站有多少中语言就有多少套缓存文件,自然而然我们想到了用不同语言对应的键区分开来。

上一篇下一篇

猜你喜欢

热点阅读