www.www.zaachi.com »  Blog/Ruby on Rails  »  Ruby on Rails: Translate Routes

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.

 

Reklama

Pokud mě chcete podpořit a jste milovník jedné stopy, navštivte můj projekt: MotoArena.cz

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:

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:

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:

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):

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:

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:

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:

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.

 

 


linkuj topclanky
Komentáře (0)

Autor: Zaachi
Publikováno: 7.5.2010 07:44:15


Mohlo by vás zajímat:
Routovani v Ruby on Rails I - routes.rb
Seriál Ruby on Rails 1: Začínáme s Ruby
Seriál Ruby on Rails 5: Počítání s Ruby
Sitemap v Ruby on Rails
TOPLIST.cz
rss coments img img img