Railsy dostarczają bardzo prosty a zarazem bardzo przydatny mechanizm i18n służący do tworzenia różnych wersji językowych. Na początku zainstalujemy sobie plugin globalize2.
./script/plugin install git://github.com/joshmh/globalize2.git
Dzięki temu teraz w modelu możemy określić jakie pola będziemy poddawać tłumaczeniom (translates), ale o tym za chwile.
Na wstępie skonfigurujmy sobie i18n. Konfiguracja odbywa się w pliku: config/enviroment.rb. Przejdźmy do linii 50, odkomentujmy ją usuwając "#"
jeśli linia u Was tak wygląda tak:
Config.i18n.load_path << Dir[File.join(RAILS_ROOT, 'my', 'locales', '*.{rb,yml}')]
to zmieńcie ją na:
Config.i18n.load_path += Dir[File.join(RAILS_ROOT, 'my', 'locales', '*.{rb,yml}')]
Odkomentujmy jeszcze 51 linię i ustawmy domyślny język strony na polski:
config.i18n.default_locale = :pl
[zrestarujmy aplikację]
Teraz zajmiemy się plikiem migracyjnym.
Utworzymy tabele z jakimiś regionami.
class CreateRegions < ActiveRecord::Migration
def self.up
create_table :regions do |t|
t.column :value, :integer, :null => false #jakąś wartość tutaj będziemy trzymać
end
#tabela z tłumaczeniami, nazwa jest bardzo ważna musi się kończyć na _translations
create_table :region_translations do |t|
t.string :locale #tutaj się określa język, 'pl', 'en', etc.
t.references :region #odwołanie do tabeli region kolumna region_id
t.string :name, :null => false, :limit => 50
end
#importujemy przykładowe dane
Region.create(:id => 1, :value => 123)
#dodajemy tlumaczenia
RegionTranslation.create(:locale => 'pl', :region_id => 1, :name => 'region polski')
RegionTranslation.create(:locale => 'en', :region_id => 1, :name => 'region angielski')
end
def self.down
drop_table :regions
drop_table :region_translations
end
end
Importujemy:
rake db:migrate
Przechodzimy do modelu Models/region.rb
class Region < ActiveRecord::Base
end
dodajemy translates:
class Region < ActiveRecord::Base
translates :name #jaka kolumna jest poddawana tłumaczeniom
end
To by było na tyle :) użyjmy teraz tego mechanizmu:
#Zapis:
I18n.locale = 'en' #ustawiamy jaki język chcemy
r = Region.new
r.id = 19
r.value = 'cos'
r.name = 'nazwa po angielsku'
r.save
#Select:
I18n.locale = 'en'
r = Region.find_by_id 19
p r.name #wypisze'nazwa po angielsku'
Jeśli chcemy zmienić język wystarczy przestawić I18n.locale = 'pl' :) czy można prościej?
Ustawmy jeszcze w kontrolerze, by za każdym razem przeprowadzał sprawdzenie jaki język chcemy.
plik: app/controllers/application.rb
dodajemy
before_filter :set_locale
def set_locale
session[:locale] = params[:locale] if params[:locale]
I18n.locale = session[:locale] || I18n.default_locale
end
Dopiszmy w config/routes.rb :locale do routingów
:controller/:action/:id' zamieniamy na :locale/:controller/:action/:id'
No i super nasz model może zawierać kilka wersji językowych, lecz co ze statycznymi tekstami na stronie? Typu:
app/views/home.erb:
<%= 'Cześć, witaj na mojej stronie :)' =>
Jak to zmienić na język angielski? Myślę że prościej na świecie się już na prawdę nie da.
Idziemy do katalogu: config/locales tworzymy tam 2 pliki, en.yml oraz pl.yml (zawierać będą tłumaczenia).
Na pierwszy ogień bierzemy pl.yml
pl:
home:
hello: "Cześć, witaj na mojej stronie :)"
a w en.yml wpisujemy
pl:
home:
hello: "Hi, welcome to my page :)"
przechodzimy z powrotem do app/views/home.erb i zmieniamy:
<%= 'Cześć, witaj na mojej stronie :)' =>
na
<%= t 'home.hello' =>
I wszystko działa jak należy :) Magia railsów ;)