Fork me on GitHub

The WebDevil

Enjoy development

Надо сделать сайт с поддержкой многоязычности. И вот к чему я пришел.

Во-первых, структура публикаций выходит одинаковая (новости, статьи…).
То есть для использования прекрасно подходит SingleTableInheritance. При таком подходе все поля очень близких по структуре классов сводятся в одну таблицу в БД.
Также надо добавить поле “type” – тип публикации. Он будет содержать имя класса, на самом деле.
multilingual db - step2

Далее, надо что-то сделать с языком. Вариант №1 – сделать композитный первичный ключ, который будет состоять из id + language. Но мне больше нравится вариант с разделением локализуемой части и нелокализуемой:
diagram2.png
И далее по ссылкам:
compositekeys gem и ее практическое использование в rails

Также для Content задействовал Scope-out.

Чтобы модель “знала” какой язык сейчас запрошен:

## config/environment.rb
...
$language = 'ru'
...

## config/initializers/activerecord_localized.rb
class ActiveRecord::Base
  def self.set_language(lang)
    @@language = lang
  end
end
## app/controllers/application.rb
class ApplicationController < ActionController::Base
...
  before_filter :set_model_language
  private
  def set_model_language
    @@language = params[:lang] || $language
    ActiveRecord::Base.set_language @@language
  end
end

## app/models/news.rb
class Content < ActiveRecord::Base
  scope_out :localized, :conditions => ['language=?', defined?(@@language) ? @@language : $language]
...    
end

Задумался, как бы получше сделать локализацию Views. Пока думаю о написании helper’а, который будет подставлять из конфига стоки вместо констант – как упрощенный вариант ActiveCulture.

Кто чего подскажет?

3 Responses to “Rails and multilingual site”

  1. Эм… не советовал бы использовать language поле в Content
    потому как при выборке база отдаст быстрее Нужные ноды, так как они меньше по размерам , чем нужные контент по языку.

    DeViL

  2. я после долгих танцев с бубном пришел к выводу, что иногда проще сделать шаблоном – типа @@@NAME@@@ – берем из словаря по коду NAME , значение.

    Конвертацию я сделал на выходе.
    т.е. у меня делаеться вся страничка, а перед ее выводом я конверчю.

    интернет бизнес

  3. интернет бизнес
    я думал в сторону < %= t :text_to_translate %>

    dm