Ruby on rails Rails 3.2的L10N工作解决方案
我正在开发一个多语言的EN/RU网站,我需要一个解决方案,允许我翻译数据库记录 是否有任何第三方插件允许您维护多语言网站?理想情况下,它应该在最坏的情况下使用或搭建脚手架 我使用now,它还通过rails_admin创建了一个翻译。但是无法指定区域设置。它只为您当前的语言环境创建翻译,也就是说,无法真正翻译记录,因为它只是复制原始条目。我看不出有什么办法可以翻译成英文 提前谢谢 GemfileRuby on rails Rails 3.2的L10N工作解决方案,ruby-on-rails,localization,internationalization,ruby-on-rails-plugins,Ruby On Rails,Localization,Internationalization,Ruby On Rails Plugins,我正在开发一个多语言的EN/RU网站,我需要一个解决方案,允许我翻译数据库记录 是否有任何第三方插件允许您维护多语言网站?理想情况下,它应该在最坏的情况下使用或搭建脚手架 我使用now,它还通过rails_admin创建了一个翻译。但是无法指定区域设置。它只为您当前的语言环境创建翻译,也就是说,无法真正翻译记录,因为它只是复制原始条目。我看不出有什么办法可以翻译成英文 提前谢谢 Gemfile source 'https://rubygems.org' gem 'rails', '3.2.0'
source 'https://rubygems.org'
gem 'rails', '3.2.0'
gem 'sqlite3'
gem 'pg', :require => 'pg'
gem 'memcache-client'
# Gems used only for assets and not required
# in production environments by default.
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'uglifier', '>= 1.0.3'
end
gem 'jquery-rails'
gem 'russian'
gem 'dynamic_form'
gem 'friendly_id', '~> 4.0.0'
gem 'routing-filter'
gem 'devise'
gem 'cancan'
gem 'paper_trail', '~> 2'
gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git'
gem 'globalize3', '~> 0.2.0.beta6', :git => 'git://github.com/svenfuchs/globalize3.git'
# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'
# To use Jbuilder templates for JSON
# gem 'jbuilder'
gem 'unicorn'
gem 'capistrano'
# To use debugger
# gem 'ruby-debug19', :require => 'ruby-debug'
config/application.rb
config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.default_locale = :ru
models/page.rb
class Page < ActiveRecord::Base
translates :title, :content
validates_presence_of :title
end
Rails控制台输出:
Loading development environment (Rails 3.2.0)
1.9.3p0 :001 > p = Page.new(:title => 'Test 1')
Page::Translation Load (0.2ms) SELECT "page_translations".* FROM "page_translations" WHERE "page_translations"."page_id" IS NULL AND "page_translations"."locale" = 'ru' LIMIT 1
=> #<Page id: nil, title: "Test 1", slug: nil, content: nil, created_at: nil, updated_at: nil>
1.9.3p0 :002 > p.save
(0.1ms) begin transaction
SQL (13.9ms) INSERT INTO "pages" ("content", "created_at", "slug", "title", "updated_at") VALUES (?, ?, ?, ?, ?) [["content", nil], ["created_at", Tue, 24 Jan 2012 14:01:28 MSK +04:00], ["slug", nil], ["title", "Test 1"], ["updated_at", Tue, 24 Jan 2012 14:01:28 MSK +04:00]]
SQL (0.5ms) INSERT INTO "page_translations" ("content", "created_at", "locale", "page_id", "title", "updated_at") VALUES (?, ?, ?, ?, ?, ?) [["content", nil], ["created_at", Tue, 24 Jan 2012 14:01:28 MSK +04:00], ["locale", "ru"], ["page_id", 5], ["title", nil], ["updated_at", Tue, 24 Jan 2012 14:01:28 MSK +04:00]]
Page::Translation Load (0.1ms) SELECT "page_translations".* FROM "page_translations" WHERE "page_translations"."page_id" = 5 AND "page_translations"."locale" = 'ru' LIMIT 1
(0.4ms) UPDATE "page_translations" SET "title" = 'Test 1', "updated_at" = '2012-01-24 10:01:28.298579' WHERE "page_translations"."id" = 5
Page::Translation Load (0.1ms) SELECT "page_translations".* FROM "page_translations" WHERE "page_translations"."id" = ? LIMIT 1 [["id", 5]]
(2.2ms) commit transaction
=> true
如果您只有两种语言,最好将翻译保留在同一个表中,例如:
create_table "articles" do |t|
...
t.column "title_ru", :string
t.column "title_en", :string
t.column "body_ru", :text
t.column "body_en", :text
...
end
然后扩展ActiveRecord::基类以提供转换方法:
module Translate
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def translate *columns
columns.each do |column|
class_eval <<-EOV
def #{column}
unless self.send("#{column}_#{I18n.locale}")
self.send("#{column}_#{I18n.locale}")
else
#{column}_#{I18n.default_locale}
end
end
EOV
end
end
end
end
ActiveRecord::Base.send :include, Translate
之后,从模型中调用该方法:
class Article < ActiveRecord::Base
...
translate :title, :body
...
end
现在,您可以在不使用globalize3的情况下编辑title\u ru和title\u en条目。globalize3将覆盖允许您在保存属性时指定区域设置的
product.write_attribute(:title, 'Hows going', locale:'ua')
product.save!
read_属性也是如此。由于这是未记录的,我不确定使用它是否会有任何不良后果。可能是: