Rails 2.3 a lokalizace aplikace
Vložil xHire
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í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/…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á rád v gitu
pořádek
):
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_localeprivate 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. ![]()
Odpověz

