看来看去,挑来挑去,还是选了globalite,原因有几点:1.有中文,比较亲切,并且知道有中国人在关注,总是好事。2.看过几个推荐的,都说还不 错。3.试了一下,上手快,修改量还行,例子写得还可以。4.google code上的,svn速度挺快。
安装这个很简单,甚至都不叫安装,以至于我还翻了半天资料,确认了只需要svn下载就行了。
在vendor/plugins下
svn checkout http://globalite.googlecode.com/svn/trunk/ globalite
注:如果跟你自己的svn混了,那么有两个方法,一个是并入你自己的 svn,另一个是使用externals属性。介绍一下第二个方法:
在项目目录下打入 svn propedit svn:externals vendor/plugins ,在接下来的编辑窗口里输入一行
globalite http://globalite.googlecode.com/svn/trunk/
然后保存退出
再打入命令: svn ci -m "external" vendor/plugins , 提交一下修改
再更新一下:svn up vendor/plugins/
就完成了,svn将不会理会globalite目录,而且下载的时候会自动去google code。
使用也很简单,如果你是一个完全国际化的应用,那么必然要使用一个filter来确定语言,这个filter可以从他的例子里抄来,非常简单。
例子的介绍:
http://www.railsontherun.com/2007/7/2/globalite-sample-application
下载
有了这个filter就可以根据浏览器发出的信息自动转语言,它也可以根据session里或提交参数来改变语言。
再 在项目目录 下建一个lang 目录,再下一级建一个ui目录,里面放上一些语言文件,放心不是po,只是一些最常见的yaml,完全的ruby风格。文件名要根据语言代码和国际代码, 比如:en-US.yml, zh-CN.yml 。里面的内容就是一对对key: value就可以了。注意key要一致。
然后在任何view里,可以写上 <%= :login_key.l("login") %> ,最前面是key,l是方法,后面的参数是找不到翻译内容的缺省显示。注意是英文小写l 而不是数字1。
这样就搞定了,接下去就是海量的翻译了。
附filter代码(从例子里抄来,加了一个format):
安装这个很简单,甚至都不叫安装,以至于我还翻了半天资料,确认了只需要svn下载就行了。
在vendor/plugins下
svn checkout http://globalite.googlecode.com/svn/trunk/ globalite
注:如果跟你自己的svn混了,那么有两个方法,一个是并入你自己的 svn,另一个是使用externals属性。介绍一下第二个方法:
在项目目录下打入 svn propedit svn:externals vendor/plugins ,在接下来的编辑窗口里输入一行
globalite http://globalite.googlecode.com/svn/trunk/
然后保存退出
再打入命令: svn ci -m "external" vendor/plugins , 提交一下修改
再更新一下:svn up vendor/plugins/
就完成了,svn将不会理会globalite目录,而且下载的时候会自动去google code。
使用也很简单,如果你是一个完全国际化的应用,那么必然要使用一个filter来确定语言,这个filter可以从他的例子里抄来,非常简单。
例子的介绍:
http://www.railsontherun.com/2007/7/2/globalite-sample-application
下载
svn checkout http://globalite.googlecode.com/svn/sample/ui globalite-sample-app
找到application.rb,set_locale就是那个filter,不过似乎有点问题,因为FF发出的语言是en-us,后面两个是小写的,在使用前要转成大写才生效。有了这个filter就可以根据浏览器发出的信息自动转语言,它也可以根据session里或提交参数来改变语言。
再 在项目目录 下建一个lang 目录,再下一级建一个ui目录,里面放上一些语言文件,放心不是po,只是一些最常见的yaml,完全的ruby风格。文件名要根据语言代码和国际代码, 比如:en-US.yml, zh-CN.yml 。里面的内容就是一对对key: value就可以了。注意key要一致。
然后在任何view里,可以写上 <%= :login_key.l("login") %> ,最前面是key,l是方法,后面的参数是找不到翻译内容的缺省显示。注意是英文小写l 而不是数字1。
这样就搞定了,接下去就是海量的翻译了。
附filter代码(从例子里抄来,加了一个format):
ruby 代码
- private
- # Set the locale from the parameters, the session, or the navigator
- # If none of these works, the Globalite default locale is set (en-*)
- def set_locale
- # Get the current path and request method (useful in the layout for changing the language)
- @current_path = request.env['PATH_INFO']
- @request_method = request.env['REQUEST_METHOD']
- # Try to get the locale from the parameters, from the session, and then from the navigator
- if params[:user_locale]
- locale_code = format_locale_code(params[:user_locale][:code])
- #debug_log "[set_locale] #{locale_code} locale passed"
- # Store the locale in the session
- session[:locale] = locale_code
- elsif session[:locale]
- locale_code = session[:locale]
- #debug_log "[set_locale] loading locale: #{locale_code} from session"
- else
- locale_code=format_locale_code(get_valid_lang_from_accept_header)
- #debug_log "[set_locale] found a valid http header locale: #{locale_code}"
- end
- Locale.code =locale_code
- #debug_log "[set_locale] Locale set to #{Locale.code}"
- # render the page
- yield
- # reset the locale to its default value
- Locale.reset!
- end
- def format_locale_code(locale_code)
- result=locale_code.to_s
- if result[0,2]
- lang = result[0,2].downcase
- end
- if result[3,5]
- country = result[3,5].upcase
- result="#{lang}-#{country}".to_sym
- else
- result="#{lang}-*".to_sym
- end
- return result
- end
- # Get a sorted array of the navigator languages
- def get_sorted_langs_from_accept_header
- accept_langs = request.env['HTTP_ACCEPT_LANGUAGE'].split(/,/) rescue nil
- return nil unless accept_langs
- # Extract langs and sort by weight
- # Example HTTP_ACCEPT_LANGUAGE: "en-au,en-gb;q=0.8,en;q=0.5,ja;q=0.3"
- wl = {}
- accept_langs.each {|accept_lang|
- if (accept_lang + ';q=1') =~ /^(.+?);q=([^;]+).*/
- wl[($2.to_f rescue -1.0)]= $1
- end
- }
- return wl.sort{|a,b| b[0] <=> a[0] }.map{|a| a[1] }
- end
- # Returns a valid language that best suits the HTTP_ACCEPT_LANGUAGE request header.
- # If no valid language can be deduced, then nil is returned.
- def get_valid_lang_from_accept_header
- # Get the sorted navigator languages and find the first one that matches our available languages
- get_sorted_langs_from_accept_header.detect{|l| get_matching_ui_locale(l) }
- end
- # Returns the UI locale that best matches with the parameter
- # or nil if not found
- def get_matching_ui_locale(locale)
- lang = locale[0,2].downcase
- if locale[3,5]
- country = locale[3,5].upcase
- #debug_log "[globalite] trying to match locale: #{lang}-#{country}"
- locale_code = "#{lang}-#{country}".to_sym
- else
- #debug_log "[globalite] trying to match #{lang}-*"
- locale_code = "#{lang}-*".to_sym
- end
- #locale_code=format_locale_code(locale_code)
- # Check with exact matching
- if Globalite.ui_locales.values.include?(locale_code)
- debug_log "[globalite] Globalite does include #{locale_code}"
- locale_code
- end
- # Check on the language only
- Globalite.ui_locales.values.each do |value|
- value.to_s =~ /#{lang}-*/ ? value : nil
- end
- end