2008
12.27

Możliwość tworzenia wielojęzycznych aplikacji w rails była dostępna od bardzo dawna. Przed pojawieniem się rails 2.2, w którym mamy bardzo fajne wsparcie dla I18n zazwyczaj korzystaliśmy z pluginów takich jak simple_localization z którego zazwyczaj korzystam, czy też najczęściej polecanego przez wszystkich globalize. Dzięki rails 2.2 to wszystko mamy na starcie i nie musimy instalować żadnych dodatkowych pluginów, czy gemów.

Podoba mi się rozwiązanie, którego doczekaliśmy się w najnowszej odsłonie ruby on rails, ponieważ jest bardzo podobne do tego, z którego korzystałem dzięki simple_localization tj. kilka plików *.yml, w których trzymam sobie tłumaczenia tekstów na stronie.

To wszystko działa bardzo fajnie, jednak problem pojawia się wtedy, gdy mamy zwykłą statyczną stronę z samym tekstem, który powinien być wyświetlony w kilku językach do wyboru. Tak jest dla przykładu jest z działem pomoc na stronie pliksa.

Strona z pomocą jest zwykłym prostym widokiem, w którym mamy cały tekst. Tekstu tego nie ma sensu trzymać w plikach *.yml, ponieważ jest go dużo i było by to nie wygodne. Oczywiście, gdyby się uprzeć to można do tego napisać jakiegoś CMSa i wpisy pobierać z bazy danych, jednak w tym przypadku takie rozwiązanie nie wchodzi w grę z prostego powodu:

  • tekst został raz przygotowany i nie zapowiada się, że będzie często redagowany,
  • nie lubię strzelać do muchy z armaty,
  • pisząc kod nigdy nie zgaduje co będzie potrzebne, a co nie – po prostu jeśli będzie potrzeba posiadania panelu admina do tego, to taki panel się stworzy :)

Pomyślałem sobie, że fajnie by było mieć takie rozwiązanie jakie oferowało mi simple_localization (choć nie wiem czemu u mnie nie działało), czyli tzw. “localized templates”. Ideą tego rozwiązania jest to, że możemy mieć kilka widoków dla jednej akcji w różnym języku, czyli:

  • index.pl.haml
  • index.en.haml

W zależności od tego jaką wartość miał Language#current_language taki widok był renderowany.

Tego samego szukałem w rails 2.2. W dokumentacji niestety niczego podobno nie znalazłem, więc zacząłem googlować wychodząc z założenia, że pewnie ktoś na pewno już spotkał się z takim problemem … i się nie myliłem.

José Valim stworzył plugin/gem localized_templates dzięki któremu dostajemy funkcjonalność, której poszukiwałem.

Jak to działa? W config/environment.rb dodajemy linijkę kodu:

config.gem "josevalim-localized_templates",  :lib => "localized_templates", :source => "http://gems.github.com"

Następnie instalujemy brakującego gema:

# rake gems:install
(in /opt/local/www/test)
gem install josevalim-localized_templates --source http://gems.github.com
Successfully installed josevalim-localized_templates-0.3
1 gem installed
Installing ri documentation for josevalim-localized_templates-0.3...
Installing RDoc documentation for josevalim-localized_templates-0.3...

Teraz wystarczy w app/view stworzyć katalogi z nazwami locales i tam wrzucać widoki trzymając się formatu:

app/view/:locale/:controller/:action

czyli dla przykładu:

app/view/pl/help/faq.haml

PS. Polecam też zajrzeć na stronę wiki Rails 2.2 I18n. Bardzo wiele cennych rad i wskazówek jak jeszcze lepiej wykorzystać I18n w rails.

3 comments so far

Add Your Comment
  1. W edge rails dodali takie cuś, więc teraz będzie działać nawet bez pluginu :)

    http://weblog.rubyonrails.com/2009/1/31/this-week-in-edge-rails

  2. Chcemy wiecej :D

  3. Postaram się pisać częściej :)