所谓的国际化:就是根据特定的locale信息,提取相应的字符串和其它一些东西(比如时间和货币的格式)等等。
显然,有三个问题需要解决:
1. 如何确定locale。
2. 如何保存这些locale相关的字符串和其它信息。
3. 如何根据locale提取字符串和其它相应的信息。
让我们来看看rails如何处理国际化。(指rails2.2之后)
首先看看第一点,如何确定locale
可以通过几种不同的方法来确定locale。
a. url参数
http://www.example.com?locale=cn
或者
http://www.example.com/cn
在服务器端可以通过在before_filter中获取locale信息:
# 通过before_filter
before_filter :set_locale
def set_locale
I18n.locale = extract_locale_from_uri
end
要注意的是,如果通过此种方法来确定locale,那么所有的url都得附上locale参数。我们可以通过重载以下方法(url_for等方法均依赖于default_url_options方法)
# app/controllers/application_controller.rb
def default_url_options(options={})
logger.debug "default_url_options is passed options:#{options.inspect}\n"
{ :locale => I18n.locale }
end
或者通过设置routes在所有的url中加上prefix:
# routes.rb
map.resources :books, :path_prefix => '/:locale'
b. 域名
http://www.example.cn
对域名方式,同样在before_filter中获取locale信息。只不过修改一下extract方法:
def extract_locale_from_subdomain
parsed_locale = request.subdomains.first (available_locales.include? parsed_locale) ?
parsed_locale : nil
end
c. 客户端提供的信息
客户端可以提供一些信息告诉服务端它所接受和期望的语言是什么。可以有以下几种方式来告知:
c.1. Accept-Language
通过在浏览器中设置Accept-Language,服务器端通过获取此http header的信息来确定。
def extract_locale_from_accept_language_header
request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
end
c.2. ip地址
根据ip地址来分析用户的locale信息。
c.3. profile
注册用户可以把locale信息保存在个人档案中。
接下来让我们看看rails如何解决第二个问题
如何保存locale相关的字符串和其它信息
rails必须知道,本地化的信息被放置何处。在Rails中有几种方法来保存locale信息。
a. yml
# config/locale/en.yml
en:
hello_world: Hello World
hello_flash: Hello Flash
# config/locale/pirate.yml
pirate:
hello_world: Ahoy World
hello_flash: Ahoy Flash
b. 本地化view
一般我们的view template文件是这样的:
app/views/somethings/index.html.erb
当在同个目录下放置一个加上本地化变量的template文件,比如:
app/views/somethings/index.cn.html.erb
当本地locale是cn时,便会render这个文件。
c. 对本地化文件的管理
把所有本地化信息都放置在一个文件中必然会导致混乱,我们可以按照自己的方式来管理这些本地文件,比如:
|-defaults
|---es.rb
|---en.rb
|-models
|---book
|-----es.rb
|-----en.rb
|-views
|---defaults
|-----es.rb
|-----en.rb
|---books
|-----es.rb
|-----en.rb
|---users
|-----es.rb
|-----en.rb
|---navigation
|-----es.rb
|-----en.rb
要注意的是,rails默认不会load层级目录中的文件,所以需要:
# config/environment.rb config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'config', 'locales', '**', '*.{rb,yml}')]
好了,我们已经知道如何放置本地化信息,最后来看一下rails如何根据locale获取这些信息。其实,这里要讲的就是rails国际化API。
提取信息
rails提供了一下几个API:
translate # Lookup text translations
localize # Localize Date and Time objects to local formats
以及它们的alias:
I18n.t 'store.title'
I18n.l Time.now
在需要本地化的地方,只需要这样使用:
# app/views/home/index.html.erb
<h1><%=t :hello_world %></h1>
<p><%= flash[:notice] %></p
<p><%= l Time.now, :format => :short %></p>
好了,本文匆匆到此结束。
如果想跟进一步的了解rails的i18n,可以看一下这篇文章:http://guides.rubyonrails.org/i18n.html
例子:
http://github.com/svenfuchs/rails-i18n/tree/master/rails/locale
http://github.com/rails/rails/blob/master/activerecord/lib/active_record/locale/en.yml
分享到:
- 2009-06-14 16:02
- 浏览 1057
- 评论(1)
- 论坛回复 / 浏览 (1 / 3788)
- 查看更多
相关推荐
rails-i18n, 用于收集 Ruby on Rails i18n 环境数据以及其他有趣的Rails 相关 i18n 内容的存储库 Rails 语言环境数据存储库 中心收集区域设置数据,以便在 ruby 上使用。 gem-安装添加到你的Gemfile:gem 'rails-i18n...
Rubocop :: I18n 一组用于检测项目中需要i18n装饰的字符串的警察。 支持以下框架样式: 文字导轨-i18n安装将此行添加到您的应用程序的Gemfile中: gem 'rubocop-i18n' 然后执行: $ bundle或将其自己安装为: $ ...
rails g i18n:active_record:install 它创建一个迁移: class CreateTranslations < ActiveRecord::Migration def self.up create_table :translations do |t| t.string :locale t.string :key
适用于JavaScript的Ruby on Rails i18n 该gem通过Rack中间件公开您的JSON序列化翻译,以便将它们与JavaScript结合使用。 安装 此宝石正在开发中,这些步骤可能会更改 # Gemfile gem 'rails-i18n-js', :git => '...
如果要在没有Rails的情况下使用此库,则只需将i18n添加到Gemfile : gem 'i18n' 然后使用一些翻译和默认语言环境配置I18n: I18n . load_path << Dir [ File . expand_path ( "config/locales" ) + "/*....
I18nLinter ...只需在Ruby on Rails项目的文件夹中输入i18n_linter ,然后观察可以国际化的字符串即可。 注意:仅报告ruby文件中的字符串。 $ cd my/ruby_on_rails/project $ i18n_linter [options]
Rails这样做:使用嵌套的yml文件的I18n.t('syntax.with.lots.of.dots')我们这样做: _('Just translate my damn text!')使用简单,平坦的mo / po / yml文件,或者直接从db要使用I18n调用,请添加syntax.with.lots....
react-i18n 该模块与 gem集成在一起,并作为的包装器构建。 基本设定 安装模块 $ npm install --save i18n-js react-i18n 设置i18n-js 在Gemfile中 gem 'i18n-js' 您认为* .haml :javascript I18n.default...
rails g refinery : i18n Refinery :: I18n . configure do | config | config . default_locale = :en # config.current_locale = :en # config.default_frontend_locale = :en config . frontend_locales = ...
R18n是一个i18n工具,可将您的Ruby应用程序翻译成多种语言。 它包含一个核心gem和用于框架或环境(Rails,Sinatra,桌面)的现成包装器插件。 快速演示 包装插件使用的出于任何目的。 i18n/en.yml : user : ...
devise-i18n-views已合并到。 您应该停止使用devise-i18n-views并开始使用devise-i18n 1.0.0或更高版本。 将不再发布devise-i18n-views。 devise-i18n-views 如果您不熟悉, “是基于Warden的Rails灵活的身份验证...
I18nTimezones I18n时区-此gem的目的是简单地提供时区转换。 该gem易于与需要i18n时区转换的其他gem结合使用,因此我们可以使用通用的i18n时区转换gem。 如果您要对时区和翻译做任何事情,则无需重新发明轮子并...
I18n在Rails中闪烁。 安装 将此行添加到您的应用程序的Gemfile中: gem "simple_flash", "~> 1.0" 然后执行: $ bundle 用法 SimpleFlash将两个辅助方法添加到您的控制器: redirect_to_with_success和redirect_...
i18n_tools 使用I18n库在 Rails 和 Ruby 应用程序中查找丢失和未使用的翻译的非常简单的 rake 任务。安装 gem install i18n_tools用法如果您在 Rails 中使用 bundler,请将以下内容添加到您的Gemfile : group :...
MailForm库是专门为简化这一过程而设计的,它允许开发者直接从Rails的表单中发送邮件,并且提供了I18n(国际化)支持、验证功能以及添加附件和请求信息的能力。这个库由Plataformatec开发,其最新版本为bd43996。 ...
Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...
mail_form, 在 Rails 中使用 i18n 验证附件和请求信息,直接从表单发送电子邮件 MailForm Rails 3这个 gem 构建在 ActiveModel 之上,展示如何从 Rails 中提取验证。命名和 i18n,而不需要自己实现。本自述文件指的...
Ruby(不带Rails)如果要在不带Rails的情况下使用此库,则只需将i18n添加到Gemfile中:gem'i18n',然后使用一些翻译和默认语言环境配置I18n:I18n.load_path << Dir [File.expand_path (“配置/语言环境”)+...
百济I18n 这是一个小库,可以在JavaScript上提供Rails I18n的翻译。 从借来的特征: 多元化日期/时间本地化号码本地化语言环境回退资产管道支持还有更多! :)用法安装通过NPM npm install baiji-i18n 运行npm ...
I18nRouting I18n_routing是Ruby on Rails的插件,可让您轻松地通过版本2.2以后的Rails中包含的I18n api转换路线。 所有必需的信息都可以在Wiki上找到: 如有疑问,请使用i18_routing谷歌论坛: 适用于Rails 2.3、...