Rails 2.3 a lokalizace aplikace
V posledních dvou verzích frameworku RubyOnRails se značně zlepšila situace, co se lokalizace týče. Osobně vnímám tento vývoj pozitivně – mám teď mnohem méně práce a více možností. :-)
Tento návod jsem založil na verzi RoR 2.3, ale s jistou dávkou obezřetnosti bude jistě použitelný i ve verzi 2.2, případně novějších. Základem je především standardní součást RoR – i18n.
Začněme od základů
Nejprve je třeba si stáhnout lokalizované základy od karmiho: http://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/cz.rb a tento soubor uložíme do adresáře config/locales/
.
Dále nastavíme defaultní jazyk v config/environment.rb
(stačí odkomentovat úplně dole):
config.i18n.default_locale = :cz
Veškeré lokalizace je vhodné provádět souměrně – především pak vytvořit config/locales/cz.yml
s obsahem z en.yml
.
Lokalizované routes (URI)
Nainstalujeme plugin translate_routes:
./script/plugin install git://github.com/raul/translate_routes.git
Smažeme zbytečný soubor .gitignore
a nastavíme správná oprávnění (jsem tak trošku perfekcionalista a mám rád v gitu pořádek :-D):
rm -f vendor/plugins/translate_routes/.gitignore
find vendor/plugins/translate_routes -type f | xargs -i chmod 644 {}
find vendor/plugins/translate_routes -type d | xargs -i chmod 755 {}
Dále zapneme lokalizaci routes přidáním následujícího řádku na konec souboru config/routes.rb
:
ActionController::Routing::Translator.i18n
Zapneme výběr příslušného locale podle prvního pole v URI přidáním těchto řádků do app/controllers/application_controller.rb
:
# Localization
before_filter :set_locale_from_url
Nyní vytvoříme soubor pro uvádění lokalizačního kódu v URI ve všech situacích (tedy vč. výchozího locale) config/initializers/translate_routes.rb
:
# enable prefixing URIs with default locale too
ActionController::Routing::Translator.prefix_on_default_locale = true
Automatické rozpoznávání jazyka uživatele
Nainstalujeme plugin http_accept_language:
./script/plugin install git://github.com/iain/http_accept_language.git
Jelikož je teoreticky lepší používat CZ místo CS v označení české lokalizace, tak provedeme následující hack v souboru vendor/plugins/http_accept_language/lib/http_accept_language.rb
:
- nový řádek 46:
x = cs_cz x
- nová metoda na konci souboru (ovšem před koncovým
end
):def cs_cz(lang) if lang == 'cs' return 'cz' else return lang end end
Pokud to není lepší a chceme zachovat CS, tak je nutné přejmenovat soubory config/locales/cz*
na cs*
varianty. Nesmíme zapomenout ani na defaultní locale v config/environment.rb
.
Aby se to promítlo i do URI, přidáme nový before_filter
do app/controllers/application_controller.rb
, ovšem až za filter přidaný v prvním kroku:
before_filter :force_locale
private
def force_locale
unless params[:locale]
# prefer those locales supplied by client in HTTP
if locale = request.compatible_language_from(I18n.available_locales)
redirect_to url_for(:locale => locale.to_s)
else
redirect_to url_for(:locale => I18n.default_locale.to_s)
end
end
end
Nyní již jen stačí přidat přepínač jazyků do příslušného layoutu (není nutné, ale je dobré ho tam mít kvůli vyhledávačům):
<%= link_to 'CZ', url_for(:locale => 'cz') %> |
<%= link_to 'EN', url_for(:locale => 'en') %>
Použití lokalizace
A to nejdůležitější na konec. :-) Lokalizované řetěžce je potřeba nejen mít, ale i řádně použít:
<%=t :web_name %> # alias pro metodu 'translate' -- Vyhledá překlad textu
<%=l Time.now %> # alias pro metodu 'localize' -- Lokalizuje objekty Date a Time do místních formátů
Prostor pro vylepšení
Tento návod samozřejmě není vyčerpávající, ale poskytuje dobrý základ pro lokalizovanou aplikaci. Hned mě napadá pár věcí, které by stálo za to zvážit k implementaci. Především možnost ukládání vybraného locale do cookies nebo případně do profilu uživatele. Nebo implementace pluginu i18n_label. Dále neřeším problematiku lokalizace dat v databázích atd. Je toho ještě poměrně hodně, ale jak říkám: toto mají být pouze základní kameny, na který můžete stavět. ;-)
Zaškatulkováno v kategorii: Ruby on Rails | 16. března 2009