ruby-on-rails - 适用于 Rails 3.2 的 L10N 解决方案

标签 ruby-on-rails localization internationalization ruby-on-rails-plugins

我正在开发一个多语言 (EN/RU) 网站,我需要一个允许我翻译数据库记录的解决方案吗?

是否有任何第三方插件可以让您维护多语言网站?理想情况下,它应该与 rails_admin 一起使用(或最坏情况下的脚手架)和 routing-filter .

我使用 globalize3现在它也通过 rails_admin 创建了一个翻译。但是没有办法指定语言环境。它只会为您当前的语言环境创建翻译,即没有办法真正翻译记录,因为它只是复制原始条目。而且我看不到创建英文翻译的方法。

提前致谢!

gem 文件

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'

配置/应用程序.rb

config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
config.i18n.default_locale = :ru

模型/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::Base类来提供翻译方法:

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_rutitle_en 条目。

关于ruby-on-rails - 适用于 Rails 3.2 的 L10N 解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8984901/

相关文章:

javascript - 如何防止每个对象出现默认值?只有第一个有效

ruby-on-rails - Rails time_select 中的有效范围

ruby-on-rails - 为什么,rails 服务器没有在 zsh 终端中运行?

ruby-on-rails - Postgres - 每天随机化一次结果

iphone - 为 iPhone 本地化货币

python - 如何为 flask 应用程序设置空白默认语言环境?

ruby-on-rails-3.1 - i18n 格式化文本

localization - UISegmentedControl 和本地化

url - 规范网址和本地化

ruby-on-rails - 如何将自定义 I18n 标签用于 Devise 的提交按钮