Pozor, od 6. 6. 2025 bude můj web přístupný již jen v rámci skutečného Internetu – v historickém vypínám.

Můj malý svět

Obrať obličej k slunci
a stíny budou padat za tebe
  • Eko náhrady
  • Stop Heuréce
  • Zkušenosti s firmami
  • 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:

    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/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

    Komentáře

    Jak přidat komentář? E-mailem! :·) Na komentare -zavináč- mujmalysvet -tečka- cz – do předmětu „Komentář: Rails 2.3 a lokalizace aplikace“. Připojit můžete i svou přezdívku a domovskou stránku.