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.
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
Chcemy wiecej :D
Postaram się pisać częściej :)