Ruby on Rails: Translate Routes
Pokud budete vyvíjet multi-language aplikace, určitě se budete muset zamyslet nad překladem rout, protože nebude možné
generovat adresy jenom na základě vytvořeného routes.rb.
Proč vymýšlet nové řešení, když jž řešení existují hotová?
Řešení je například v použití pluginu Translate_routes (http://github.com/raul/translate_routes).
Pracuje s verzí Rails 2.3.x a je možné jej implementovat bez zásadního zásahu do kódu.
Plugin vytváří jednoduchou
transparentní vrstvu nad vašimi routami, které překládá a směruje.
Instalace
Instalace je velmi jednoduchá, z githubu stačí plugin stáhnout a nakopírovat do /vendor/plugins, mezi
ostatní pluginy. Plugin je nyní připraven k použití.
Překlady adres
Pro překlady adres si musíme vytvořit lokalizační Yaml schéma. To umístíme libovolně do adresářové struktury,
doporučuji do adresáře locales pod výstížným názvem (například i18n-routes.yml, jak je
uvedeno v ukázkovém příkladu).
Nyní si do lokalizačního souboru můžeme uvést definice nových adres ve tvaru:
1 2 3 4 5 6 |
cz: login: prihlasit register: registrace en: login: login register: registration |
Kde cz, en značí jednotlivé jazykové mutace nastavované aplikací v I18n.locale za nimiž
následují routy a překlady adres.
Pokud máme lokalizační soubor vytvořený (nemusíme definovat všechny adresy), upravíme soubor routes.rb, do kterého
přidáme:
1 |
ActionController::Routing::Translator.translate_from_file 'locales', 'i18n-routes.yml' |
Tímto voláme metodu translate_from_file(*path) z translate_routes a předáme jí cestu k námi vytvořenému
yaml souboru (jednotlívé části cesty oddělujeme čárkou).
Pokud vaše apliace nenastavuje hodnotu pro I18n.locale, musíte do application_controlleru doplnit
before_filter:
1 |
before_filter :set_locale_from_url |
Tanto filter volá přímo metodu z translate_routes. Nebo si tuto proměnnou naplnit jinak.
Po restartu serveru by mělo všechno fungovat (Můžete ověřit příkazem rake routes).
Odstranění prefixu jazyka
Plugin automaticky doplňuje prefix jazyka do url adres, krom defaultního jazyka (nastaveného v hodnotě
I18n.default_locale), což můžete změnit pomocí hodnoty @@prefix_on_default_locale v
routes.rb (hned za voláním translátoru):
1 2 |
ActionController::Routing::Translator.translate_from_file 'locales', 'i18n-routes.yml' ActionController::Routing::Translator.prefix_on_default_locale = true |
Pokud chcete používat url adresy úplně bez prefixu (například při použití více domén směrovaných na stejný systém), tak
to bohužel plugin defaultně nenabízí. V tomto případě je třeba upravit plugin. Najděte si sobuor
translate_routes.rb.
Aby bylo možné toto nastavení měnit, můžeme si vytvořit proměnnou apply_prefix, přes kterou budeme toto
chování měnit:
1 2 |
mattr_accessor :apply_prefix @@apply_prefix = true #set prefix in other language |
Jako defaultní hodnotu necháme true, přesně tak, aby byla zachována původní funkčnost pluginu a upravíme funkci
add_prefix:
1 2 3 |
def self.add_prefix?(lang) @@prefix_on_default_locale || lang != default_locale && @@apply_prefix end |
Hotovo – v routes.rb si nyní můžete upravit volání translatoru:
1 2 |
ActionController::Routing::Translator.translate_from_file 'locales', 'i18n-routes.yml' ActionController::Routing::Translator.apply_prefix = false |
Závěrem
I když nechcete využívat překlady adres, je dobé tento plugin implementovat do své aplikace. Díky němu můžete v
budoucnosti jedndouše měnit názvy akcí a adres.