Svobodni.cz

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/envi­ronment.rb (stačí odkomentovat úplně dole):

config.i18n.de­fault_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/rau­l/translate_rou­tes.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 :-D):

rm -f vendor/plugin­s/translate_rou­tes/.gitignore find vendor/plugin­s/translate_rou­tes -type f | xargs -i chmod 644 {} find vendor/plugin­s/translate_rou­tes -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::Rou­ting::Transla­tor.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/controller­s/application_con­troller.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/initia­lizers/transla­te_routes.rb:

# enable prefixing URIs with default locale too ActionController::Rou­ting::Transla­tor.prefix_on_de­fault_locale = true

Automatické rozpoznávání jazyka uživatele

Nainstalujeme plugin http_accept_lan­guage:

./script/plugin install git://github.com/i­ain/http_accep­t_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/plugin­s/http_accept_lan­guage/lib/http_­accept_langua­ge.rb:

  1. nový řádek 46: x = cs_cz x
  2. 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/envi­ronment.rb.

Aby se to promítlo i do URI, přidáme nový before_filter do app/controller­s/application_con­troller.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.compa­tible_language_from(I18n­.available_lo­cales) redirect_to url_for(:locale  ⇒ locale.to_s) else redirect_to url_for(:locale  ⇒ I18n.default_lo­cale.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