Wstęp
W dzisiejszym globalnym świecie, coraz więcej aplikacji internetowych musi obsługiwać różne języki i lokalizacje, aby dotrzeć do szerokiej gamy użytkowników na całym świecie. W tym artykule omówimy, jak skonfigurować i zaimplementować internacjonalizację (i18n) w ramach Symfony 6.2, jednym z najpopularniejszych frameworków PHP. Dzięki temu będziemy mogli obsługiwać tłumaczenia stron w sposób bardziej elastyczny i automatyczny, co pozwoli na lepsze zarządzanie procesem tłumaczeń w naszej aplikacji.
Symfony 6.2 oferuje wyjątkowe wsparcie dla internacjonalizacji, umożliwiając automatyczne rozpoznawanie języka ustawionego w przeglądarce użytkownika. Dzięki temu, nasza aplikacja będzie domyślnie wysyłać tłumaczenia stron w języku preferowanym przez użytkownika, co z pewnością zwiększy komfort korzystania z serwisu.
Jednocześnie, Symfony 6.2 umożliwia uzyskiwanie tłumaczeń poprzez trasę. To oznacza, że użytkownik będzie mógł zmieniać język na żądanie, wpisując odpowiedni kod języka (np. /pl lub /en) w pasku adresu przeglądarki. Funkcja ta jest niezwykle przydatna dla osób, które chcą szybko przełączać między różnymi językami lub dla serwisów, które chcą świadczyć usługi w kilku językach na różnych rynkach.
W dalszej części artykułu przyjrzymy się dokładniej mechanizmom Symfony 6.2 odpowiedzialnym za internacjonalizację, a także pokażemy, jak skonfigurować i zaimplementować te funkcje w praktyce. Dzięki temu, będziesz mógł stworzyć wielojęzyczną aplikację, która będzie przyjazna dla użytkowników z całego świata, obsługując szeroki wachlarz tłumaczeń.
Instalacja pakietu symfony/translation
Aby rozpocząć pracę nad internacjonalizacją naszej aplikacji, musimy zainstalować pakiet symfony/translation. Służy do tego polecenie:
composer require symfony/translationPakiet ten dostarcza niezbędnych narzędzi i komponentów do obsługi tłumaczeń w naszym projekcie.
Konfiguracja frameworka
Po zainstalowaniu pakietu symfony/translation, musimy dostosować konfigurację frameworka. W pliku config/packages/framework.yaml dodajemy następujące linie:
framework:
// ...
set_locale_from_accept_language: true
set_content_language_from_locale: true
enabled_locales: ['pl', 'en']Te ustawienia mają następujące funkcje:
set_locale_from_accept_language: true– automatycznie ustawia lokalizację (język) na podstawie nagłówka „Accept-Language” przeglądarki użytkownika,set_content_language_from_locale: true– ustawia odpowiedni nagłówek „Content-Language” w odpowiedzi serwera, na podstawie wybranej lokalizacji,enabled_locales: ['pl', 'en']– definiuje listę obsługiwanych języków (w tym przypadku polski i angielski).
Konfiguracja tłumaczeń
Następnie konfigurujemy tłumaczenia, dodając poniższy fragment do pliku config/packages/translation.yaml:
framework:
default_locale: plWprowadzone ustawienie default_locale: pl oznacza, że domyślnym językiem naszej aplikacji będzie polski.
Konfiguracja tras
Ostatnim krokiem jest konfiguracja tras, dzięki której użytkownik będzie mógł wybrać język za pomocą odpowiedniego prefixu w adresie URL. W pliku config/routes.yaml dodajemy następujący kod:
app_i18n:
resource: '../src/Controller/'
type: annotation
prefix:
en: '/en'
pl: '/pl'
requirements:
_locale: 'en|pl'
defaults:
_locale: 'pl'Ten fragment konfiguracji pozwala na definiowanie języka poprzez prefixy w adresie URL (np. „/en” lub „/pl”). Zdefiniowane są także wymagania dotyczące wartości _locale, ograniczając je do obsługiwanych języków (w tym przypadku „en” i „pl”).
Dodawanie plików tłumaczeń
Po skonfigurowaniu internacjonalizacji w Symfony 6.2, kolejnym krokiem jest dodanie plików tłumaczeń do naszego projektu. Pliki te będą przechowywane w katalogu translations w głównym folderze aplikacji.
W celu zorganizowania tłumaczeń, tworzymy dwa pliki w katalogu translations:
messages.pl.yaml– zawierający tłumaczenia na język polski,messages.en.yaml– zawierający tłumaczenia na język angielski.
W każdym z tych plików dodajemy odpowiednie klucze z tłumaczeniami. Na przykład, jeśli chcemy przetłumaczyć tekst „hello.world”, dodajemy następujące wpisy:
W pliku messages.pl.yaml:
hello.world: 'Witaj, świecie!'W pliku messages.en.yaml:
hello.world: 'Hello, world!'Takie podejście pozwala na łatwe zarządzanie tłumaczeniami w naszej aplikacji. Wystarczy dodać odpowiednie klucze do plików językowych, a Symfony automatycznie wykorzysta te tłumaczenia w zależności od wybranej lokalizacji.
Dodawanie trasy do kontrolera wykorzystującego tłumaczenia
Poniżej znajduje się kod kontrolera z dodaną trasą:
use Symfony\Contracts\Translation\TranslatorInterface;
#[Route('/indexTest', name: 'app_test')]
public function index(TranslatorInterface $translator): Response
{
$translatedText = $translator->trans('hello.world');
return new Response($translatedText);
}Teraz omówimy, co się dzieje w tym fragmencie kodu:
use Symfony\Contracts\Translation\TranslatorInterface;– importujemy interfejsTranslatorInterface, który jest odpowiedzialny za tłumaczenie tekstu w naszej aplikacji.#[Route('/test', name: 'app_test')]– definiujemy nową trasę o nazwieapp_test, która będzie dostępna pod adresem/test. W przypadku korzystania z prefiksów językowych, trasa będzie dostępna pod adresem/pl/testoraz/en/testdla odpowiednio polskiej i angielskiej wersji językowej.public function index(TranslatorInterface $translator): Response– w metodzieindexkontrolera, wstrzykujemy zależnośćTranslatorInterface. Dzięki temu będziemy mogli korzystać z funkcji tłumaczących tekst w naszym kontrolerze.$translatedText = $translator->trans('hello.world');– używamy metodytrans()na obiekcie$translator, aby przetłumaczyć tekst na podstawie kluczahello.world. Tłumaczenie zostanie automatycznie pobrane z odpowiedniego pliku językowego (messages.pl.yamllubmessages.en.yaml) na podstawie aktualnie wybranej lokalizacji.return new Response($translatedText);– na koniec, zwracamy obiektResponsez przetłumaczonym tekstem. W zależności od ustawień językowych użytkownika, zostanie wyświetlony odpowiedni tekst: „Witaj, świecie!” dla języka polskiego lub „Hello, world!” dla języka angielskiego.
Dzięki zastosowaniu opisanego podejścia, nasza aplikacja będzie obsługiwać tłumaczenia na poziomie kontrolerów, co pozwoli na dynamiczną zmianę treści w zależności od wybranego języka. W kolejnych częściach artykułu omówimy także, jak korzystać z tłumaczeń w szablonach oraz jak zarządzać tłumaczeniami w bardziej zaawansowanych przypadkach.
Możemy teraz przetestować tłumaczenia:
http://symfony.local/pl/test
http://symfony.local/en/test
http://symfony.local/test
Aby przetestować trzecią trasę należy w przeglądarce zmienić język: Ustawienia/Język/Preferowany język i przenosimy interesujący nas język na górę. Następnie odświeżamy stronę i treść strony zmienia się na wybrany język.
Dodawanie trasy do kontrolera, która renderuje widok z wykorzystaniem tłumaczeń
Oto kod kontrolera z dodaną trasą:
#[Route('/test-view', name: 'app_test_view')]
public function indexTestView(): Response
{
return $this->render('test/index.html.twig', [
'controller_name' => 'TestController',
]);
}W powyższym fragmencie kodu:
#[Route('/test-view', name: 'app_test_view')]– definiujemy nową trasę o nazwieapp_test_view, która będzie dostępna pod adresem/test-view. Analogicznie do poprzedniego przykładu, trasa będzie dostępna również z prefiksami językowymi/pl/test-vieworaz/en/test-view.- W metodzie
indexTestView, zamiast korzystać z obiektuResponse, używamy metodyrender()do wyświetlenia szablonutest/index.html.twig. Jako drugi argument przekazujemy tablicę z danymi, które chcemy przekazać do szablonu. W tym przypadku przekazujemy jedynie nazwę kontrolera.
Teraz omówimy szablon test/index.html.twig, który korzysta z tłumaczeń:
{% extends 'base.html.twig' %}
{% block title %}{{ 'hello.world'|trans }}{% endblock %}
{% block body %}
{{ 'hello.world'|trans }}
{% endblock %}W szablonie:
{% extends 'base.html.twig' %}– rozszerzamy szablon bazowy (base.html.twig), aby korzystać z jego struktury i bloków.{% block title %}{{ 'hello.world'|trans }}{% endblock %}– definiujemy zawartość blokutitle. Używamy filtrutransdo tłumaczenia kluczahello.world. W zależności od ustawień językowych użytkownika, w tytule strony pojawi się „Witaj, świecie!” lub „Hello, world!”.{% block body %}{{ 'hello.world'|trans }}{% endblock %}– definiujemy zawartość blokubody. Podobnie jak w blokutitle, używamy filtrutransdo tłumaczenia kluczahello.world. Tekst zostanie wyświetlony w ciele strony zgodnie z aktualnym językiem użytkownika.
Dzięki zastosowaniu przedstawionego podejścia, możemy łatwo korzystać z tłumaczeń w naszych szablonach Twig. W zależności od wybranego języka, Symfony automatycznie wybierze odpowiednie tłumaczenie na podstawie kluczy i plików językowych, co pozwoli na dynamiczną zmianę treści w naszej aplikacji.
Sprawdzenie istniejących tras
Uruchamiamy polecenie:
php bin/console debug:routerPolecenie to jest używane do wyświetlenia informacji na temat zarejestrowanych tras w projekcie Symfony. Daje ono możliwość sprawdzenia, czy trasy są poprawnie skonfigurowane, jak również pozwala na zrozumienie, w jaki sposób aplikacja przetwarza żądania URL.
Po uruchomieniu polecenia, otrzymujemy następujący wynik:
-------------------------------- -------- -------- ------ -----------------------------------
Name Method Scheme Host Path
-------------------------------- -------- -------- ------ -----------------------------------
app_test ANY ANY ANY /test
app_test_view ANY ANY ANY /test-view
app_test.en ANY ANY ANY /en/test
app_test.pl ANY ANY ANY /pl/test
app_test_view.en ANY ANY ANY /en/test-view
app_test_view.pl ANY ANY ANY /pl/test-viewZ wyników tego polecenia możemy zauważyć, że oprócz podstawowych tras /test i /test-view, dostępne są także warianty z prefiksami językowymi /en i /pl. Oznacza to, że konfiguracja internacjonalizacji zadziałała poprawnie, a nasza aplikacja obsługuje różne wersje językowe tras.
Podsumowanie
Podsumowując, w tym artykule przedstawiliśmy, jak skonfigurować internacjonalizację w Symfony 6.2, aby obsługiwać różne wersje językowe naszej aplikacji. Omówiliśmy kolejne kroki, od instalacji pakietu symfony/translation, przez konfigurację plików YAML, po dodawanie plików tłumaczeń i wykorzystanie tłumaczeń w kontrolerach oraz szablonach Twig.
Dzięki opisanym podejściom, możemy stworzyć aplikacje, które będą dynamicznie dostosowywać treść do preferencji językowych użytkownika, co pozwoli na lepsze zrozumienie i większą satysfakcję z korzystania z naszego oprogramowania. Ponadto, zarządzanie tłumaczeniami w oddzielnych plikach językowych ułatwia utrzymanie aplikacji oraz ewentualne wprowadzanie zmian w przyszłości.