Internacjonalizacja (i18n) w Symfony 3

by Yaroslav Shypunov
5 miesięcy ago
202 Views

Jedną z zalet Symfony Framework jest łatwość tworzenia aplikacji wielojęzycznych. Nawet jeżeli nasza aplikacja w pierwszej fazie swojego rozwoju ma obsługiwać wyłącznie jeden język, uruchomienie mechanizmu tłumaczeń niesie ze sobą szereg korzyści. Jedną z nich jest możliwość edycji każdej etykiety w aplikacji poprzez zmianę jednej linijki w pliku tłumaczeń, zamiast ingerencji w kod aplikacji. W tym wpisie przedstawiamy zestaw instrukcji, jak w domyślnej instalacji Symfony Framework 3.x uruchomić i wykorzystać mechanizm tłumaczeń oraz podajemy przykłady, jak wykorzystujemy mechanizm tłumaczeń w IdeaSpot.

Konfiguracja

W pierwszej kolejności edytujemy plik app/config/config.yml. W Symfony 3.x tłumaczenia są już wstępnie przygotowane, jedyne co trzeba zrobić, to odkomentować odpowiednią linię. Odnajdujemy w nim zakomentowaną linię:

framework:
    #translator:      { fallbacks: ["%locale%"] }

i usuwamy komentarz:

framework:
    translator:      { fallbacks: ["%locale%"] }

Jak można zauważyć, fallbacks ustawione jest na wartość parametru %locale%. Wartość tego parametru ustawić można w pliku app/config/parameters.yml. Warto zaktualizować także jego domyślną wartość w pliku app/config/parameters.yml.dist, wtedy przy świeżej instalacji projektu na innej maszynie, wskazane przez nas locale będą domyślną wartością przy instalacji Symfony poprzez composer install:

#app/config/parameters.yml.dist
parameters:
    # .......
    locale: en
    # .......

Przy takiej konfiguracji, jeśli nie zostanie odnalezione tłumaczenie w bieżącym języku aplikacji, wyświetlone zostanie tłumaczenie angielskie.

Pliki z tłumaczeniami

Symfony Framework umożliwia tworzenie tłumaczeń w plikach xlfymlphp. W IdeaSpot wykorzystujemy pliki yml ze względu na ich prostotę i łatwość reorganizacji.

Pliki tłumaczeń znajdować się mogą w następujących lokalizacjach:

  • katalog app/resources/translations
  • katalog app/resources/<bundle>/translations
  • katalog Resources/translations wewnątrz każdego bundle’a.

Nazwa pliku tłumaczeń składa się z trzech elementów: domain.locale.loader, przykładowo: messages.pl.yml.

Przykładowy plik z tłumaczeniami:

# src/IdeaSpot/DemoBundle/Resources/translations/messages.en.yml
header.hello: "Hello!"
header.dashboard: "Dashboard"

Plik tłumaczeń w formacie yml składa się z par identyfikator: „tłumaczenie”.

W powyższym przykładzie warto zwrócić uwagę na fakt, że jako identyfikatory używamy ścieżek do etykiet na stronie rozdzielonych kropkami. Nie jest to wymóg, równie dobrze nasz plik tłumaczeń mógłby wyglądać następująco:

# src/IdeaSpot/DemoBundle/Resources/translations/messages.en.yml
hello: "Hello!"
dashboard: "Dashboard"

Zastosowanie notacji z kropkami niesie jednak ze sobą kilka zalet. Przede wszystkim, natychmiast dostrzec można napisy, które nie zostały jeszcze przetłumaczone. Inną zaletą, którą daje nam format yml, jest możliwość zgrupowania napisów w grupy:

# src/IdeaSpot/DemoBundle/Resources/translations/messages.en.yml
header:
    hello: "Hello!"
    dashboard: "Dashboard"

W kodzie, w celu wywołania powyższych tłumaczeń, używalibyśmy odpowiednio header.helloheader.dashboard, tak samo jak w pierwszym przykładzie. Oszczędzamy jednak dużo miejsca i mamy o wiele czytelniejszą strukturę pliku tłumaczeń.

Ustawienie locale w requestach

Aby Symfony wiedziało, w jakim języku wyświetlić kod, należy ustawić parametr {_locale} dla każdej akcji, która ma być tłumaczona, przykładowo:

ideaspot_dummy_translated:
    path:     /translated.{_locale}.{_format}
    defaults: { _controller: "IdeaSpotDummyBundle:Dummy:translated", _format:  json, _locale: en }
    methods: [POST]
    requirements:
        _format:  json|html
        _locale: en|pl

Fragment zielony umiejscawia locale w URLu naszej akcji – przykładowo naszą akcję wywołalibyśmy pod następującym adresem:

  • /translated.en.html
  • /translated.pl.html

Fragment niebieski ustawia domyślną wartość locale, gdyby żadna wartość nie została podana.

Fragment czerwony określa dopuszczalne wartości locale, w tym przypadku en lub pl.

Tłumaczenie napisów w szablonach TWIG

W celu oznaczenia napisu w szablonach TWIG jako podlegających tłumaczeniu, jedyne co trzeba zrobić, to uruchomić na nich filtr trans. Przykładowo:

<span>{{ someTextVariable }}</span>

zamieniamy na:

<span>{{ someTextVariable|trans }}</span>

 

Tagi: ,

Dodaj komentarz