Jak zbudować wielojęzyczną aplikację: Demo z PHP i Gettext

niezależnie od tego, czy budujesz stronę internetową, czy pełnoprawną aplikację internetową, udostępnienie jej szerszej publiczności często wymaga, aby była dostępna w różnych językach i lokalizacjach.

podstawowe różnice między większością ludzkich języków sprawiają, że nie jest to łatwe. Różnice w regułach gramatycznych, niuansach językowych, formatach dat i nie tylko sprawiają, że lokalizacja jest wyjątkowym i potężnym wyzwaniem.

rozważ ten prosty przykład.

Zasady pluralizacji w języku angielskim są dość proste: możesz mieć pojedynczą formę słowa lub liczbę mnogą słowa.

w innych językach, takich jak języki słowiańskie, istnieją dwie formy liczby mnogiej oprócz liczby pojedynczej. Możesz nawet znaleźć języki z łącznie czterema, pięcioma lub sześcioma formami liczby mnogiej, na przykład w słoweńskim, irlandzkim lub arabskim.

sposób organizacji kodu oraz sposób projektowania komponentów i interfejsu odgrywają ważną rolę w określaniu, jak łatwo można zlokalizować aplikację.

Internacjonalizacja (i18n) Twojej bazy kodu pomaga zapewnić, że można ją z łatwością dostosować do różnych języków lub regionów. Internacjonalizacja odbywa się zazwyczaj raz, najlepiej na początku projektu, aby uniknąć konieczności dużych zmian w kodzie źródłowym w dół drogi.

Jak zbudować wielojęzyczną aplikację: Demo z PHP i Gettext

po umiędzynarodowieniu kodu, lokalizacja (l10n) staje się kwestią tłumaczenia zawartości aplikacji na określony Język/Ustawienia regionalne.

lokalizacja musi być wykonywana za każdym razem, gdy nowy język lub region musi być obsługiwany. Ponadto, za każdym razem, gdy część interfejsu (zawierająca tekst) jest aktualizowana, nowa zawartość staje się dostępna – która następnie musi być zlokalizowana (tj. przetłumaczona) we wszystkich obsługiwanych lokalizacjach.

w tym artykule dowiemy się, jak umiędzynarodowić i zlokalizować oprogramowanie napisane w PHP. Przejdziemy przez różne opcje wdrożenia i różne narzędzia, które są dostępne do naszej dyspozycji, aby ułatwić proces.

narzędzia do internacjonalizacji

najprostszym sposobem internacjonalizacji oprogramowania PHP jest użycie plików tablicowych. Tablice będą wypełniane przetłumaczonych ciągów, które mogą być następnie przeglądane z poziomu szablonów:

<h1><?=$TRANS?></h1>

nie jest to jednak zalecany sposób na poważne projekty, ponieważ z pewnością będzie to powodować problemy z konserwacją w przyszłości. Niektóre kwestie mogą pojawić się nawet na samym początku, takie jak brak wsparcia dla zmiennej interpolacji lub mnogości rzeczowników i tak dalej.

jednym z najbardziej klasycznych narzędzi (często traktowanym jako odniesienie dla i18n i l10n) jest uniksowe narzędzie o nazwie Gettext.

chociaż sięga 1995 roku, nadal jest wszechstronnym narzędziem do tłumaczenia oprogramowania, które jest również łatwe w użyciu. Chociaż rozpoczęcie pracy jest dość łatwe, nadal ma potężne narzędzia pomocnicze.

Gettext jest tym, czego będziemy używać w tym poście. Będziemy prezentować świetną aplikację GUI, która może być używana do łatwej aktualizacji plików źródłowych l10n, unikając w ten sposób konieczności radzenia sobie z wierszem poleceń.

Biblioteki ułatwiają

główne frameworki i biblioteki PHP obsługujące Gettext

istnieją główne frameworki i biblioteki PHP, które obsługują Gettext i inne implementacje i18n. niektóre są łatwiejsze do zainstalowania niż inne, mają dodatkowe funkcje lub obsługują różne formaty plików i18n. Chociaż w tym dokumencie skupiamy się na narzędziach dostarczanych z rdzeniem PHP, oto lista innych, o których warto wspomnieć:

  • oscarotero / Gettext: Obsługa Gettext z interfejsem zorientowanym obiektowo; zawiera ulepszone funkcje pomocnicze, potężne ekstraktory dla kilku formatów plików (niektóre z nich nie są obsługiwane natywnie przez polecenie gettext). Może również eksportować do formatów wykraczających poza pliki. mo/. po, co może być przydatne, jeśli chcesz zintegrować pliki tłumaczeń z innymi częściami systemu, takimi jak interfejs JavaScript.

  • symfony / translation: obsługuje wiele różnych formatów, ale zaleca używanie gadatliwych XLIFFÓW. nie zawiera funkcji pomocniczych ani wbudowanego ekstraktora, ale obsługuje symbole zastępcze używające wewnętrznie strtr().

  • zend / i18n: Obsługuje pliki tablicowe i INI lub formaty Gettext. Implementuje warstwę buforowania, aby uniknąć konieczności czytania systemu plików za każdym razem. Zawiera również helpery widoków oraz filtry i walidatory uwzględniające ustawienia regionalne. Jednak nie ma ekstraktora wiadomości.

Inne frameworki zawierają również moduły i18n, ale nie są one dostępne poza ich bazami kodowymi:

  • Laravel: obsługuje podstawowe pliki tablicowe; nie ma automatycznego ekstraktora, ale zawiera pomocnika @lang dla plików szablonów.

  • Yii: Obsługuje tablice, Gettext i tłumaczenie bazodanowe oraz zawiera ekstraktor wiadomości. Wspierany przez rozszerzenie Intl, dostępne od PHP 5.3 i oparte na projekcie ICU. Dzięki temu Yii może uruchamiać potężne zamienniki, takie jak pisownia liczb, formatowanie dat, czasów, przedziałów, waluty i porządków.

jeśli zdecydujesz się skorzystać z jednej z bibliotek, które nie dostarczają żadnych ekstraktorów, możesz użyć formatów Gettext, dzięki czemu możesz użyć oryginalnego zestawu narzędzi Gettext (w tym Poedit), jak opisano w dalszej części rozdziału.

instalacja Gettext

może być konieczne zainstalowanie Gettext i powiązanej biblioteki PHP przy użyciu menedżera pakietów, takiego jak apt-get lub yum. Po zainstalowaniu włącz go, dodając extension=gettext.so(Linux / Unix) lub extension=php_gettext.dll (Windows) do pliku php.ini.

tutaj również będziemy używać Poedit do tworzenia plików tłumaczeniowych. Prawdopodobnie znajdziesz go w menedżerze pakietów systemu; jest on dostępny dla systemów Unix, Mac i Windows i można go pobrać za darmo na jego stronie internetowej, jak również.

rodzaje plików Gettext

istnieją trzy typy plików, z którymi zwykle masz do czynienia podczas pracy z Gettext.

głównymi są pliki PO (Portable Object) i MO (Machine Object), z których pierwszy jest listą czytelnych „przetłumaczonych obiektów”, a drugi jest odpowiadającym im plikiem binarnym (do interpretacji przez Gettext podczas lokalizacji). Istnieje również plik POT (szablon PO), który po prostu zawiera wszystkie istniejące klucze z plików źródłowych i może być używany jako przewodnik do generowania i aktualizowania wszystkich plików PO.

pliki szablonów nie są obowiązkowe; w zależności od narzędzia, którego używasz do l10n, będziesz w porządku tylko z plikami PO / MO. Będziesz mieć jedną parę plików PO / MO na język i region, ale tylko jedną pulę na domenę.

rozdzielanie domen

w dużych projektach są przypadki, w których konieczne może być oddzielenie tłumaczeń, gdy te same słowa przekazują różne znaczenie w różnych kontekstach.

w takich przypadkach musisz podzielić je na różne „domeny”, które są w zasadzie nazwanymi grupami plików POT/PO/MO, gdzie nazwa pliku to wspomniana domena tłumaczenia.

małe i średnie projekty Zwykle, dla uproszczenia, używają tylko jednej domeny; jej nazwa jest dowolna, ale użyjemy „main” dla naszych próbek kodu.

na przykład w projektach Symfony domeny są używane do oddzielenia tłumaczenia komunikatów walidacyjnych.

Kod lokalny

locale to po prostu kod identyfikujący jedną wersję języka. Jest on zdefiniowany zgodnie ze specyfikacjami ISO 639-1 i ISO 3166-1 alpha-2: dwie małe litery dla języka, opcjonalnie po nich podkreślnik i dwie duże litery identyfikujące kod kraju lub regionu.

w rzadkich językach używa się trzech liter.

dla niektórych mówców część wiejska może wydawać się zbędna. W rzeczywistości niektóre języki mają dialekty w różnych krajach, takie jak austriacki Niemiecki (de_AT) lub Brazylijski Portugalski (pt_BR). Druga część służy do rozróżniania tych dialektów – gdy nie występuje, jest traktowana jako” generyczna „lub” hybrydowa ” wersja języka.

struktura katalogów

aby użyć Gettext, będziemy musieli przestrzegać określonej struktury folderów.

najpierw musisz wybrać dowolny root dla plików l10n w repozytorium źródłowym. Wewnątrz niego będziesz mieć folder dla każdego potrzebnego locale i stały folder „LC_MESSAGES”, który będzie zawierał wszystkie Twoje pary PO/MO.

Katalog LC_MESSAGES

formy liczby mnogiej

jak powiedzieliśmy we wstępie, różne języki mogą mieć różne zasady pluralizacji. Jednak Gettext oszczędza nam tego kłopotu.

podczas tworzenia nowego .plik po, będziesz musiał zadeklarować reguły pluralizacji dla tego języka, a przetłumaczone utwory, które są wrażliwe na liczbę mnogą, będą miały inną formę dla każdej z tych reguł.

wywołując Gettext w kodzie, musisz podać numer związany ze zdaniem (np. dla frazy ” masz n wiadomości.”, będziesz musiał podać wartość n), i opracuje prawidłową formę do użycia – nawet używając podstawienia ciągu, jeśli zajdzie taka potrzeba.

reguły liczby mnogiej składają się z liczby reguł niezbędnych z testem logicznym dla każdej reguły (test dla co najwyżej jednej reguły można pominąć). Na przykład:

  • Japoński: nplurals=1; plural=0; – jedna zasada: nie ma form liczby mnogiej

  • angielski: nplurals=2; plural=(n != 1); – dwie zasady: używaj liczby mnogiej tylko wtedy, gdy n nie jest 1, w przeciwnym razie używaj liczby pojedynczej.

  • brazylijski portugalski: nplurals=2; plural=(n > 1); – dwie zasady, użyj liczby mnogiej tylko wtedy, gdy n jest większe niż 1, w przeciwnym razie użyj liczby pojedynczej.

aby uzyskać głębsze Wyjaśnienie, dostępny jest pouczający samouczek LingoHub online.

Gettext określi, której reguły użyć na podstawie podanej liczby i użyje poprawnej zlokalizowanej wersji łańcucha. W przypadku ciągów, w których należy obsługiwać pluralizację, należy uwzględnić w .po tworzy inne zdanie dla każdej zdefiniowanej reguły liczby mnogiej.

przykładowa implementacja

po tej całej teorii, przejdźmy trochę do rzeczy. Oto fragment a .plik po (nie martw się jeszcze zbytnio o składnię, ale zamiast tego po prostu zapoznaj się z ogólną treścią):

msgid ""msgstr """Language: pt_BR\n""Content-Type: text/plain; charset=UTF-8\n""Plural-Forms: nplurals=2; plural=(n > 1);\n"msgid "We're now translating some strings"msgstr "Nós estamos traduzindo algumas strings agora"msgid "Hello %1$s! Your last visit was on %2$s"msgstr "Olá %1$s! Sua última visita foi em %2$s"msgid "Only one unread message"msgid_plural "%d unread messages"msgstr "Só uma mensagem não lida"msgstr "%d mensagens não lidas"

pierwsza sekcja działa jak nagłówek, mając msgid i msgstr puste.

opisuje kodowanie plików, formy liczby mnogiej i kilka innych rzeczy. Druga sekcja tłumaczy prosty ciąg z angielskiego na Brazylijski Portugalski, a trzecia robi to samo, ale wykorzystuje zamianę ciągów z sprintf, umożliwiając tłumaczenie zawierające nazwę użytkownika i datę wizyty.

ostatnia sekcja jest próbką form pluralizacyjnych, wyświetlając wersję liczby pojedynczej i mnogiej jako msgid w języku angielskim i ich odpowiednie tłumaczenia jako msgstr 0 i 1 (zgodnie z liczbą podaną przez regułę liczby mnogiej).

tam również używana jest zamiana ciągu znaków, więc liczba może być widoczna bezpośrednio w zdaniu, używając %d. Liczba mnoga zawsze ma dwie msgid (liczba pojedyncza i liczba mnoga), więc zaleca się, aby nie używać złożonego języka jako źródła tłumaczenia.

Klucze lokalizacyjne

jak zapewne zauważyłeś, używamy prawdziwego angielskiego zdania jako identyfikatora źródłowego. Że msgid jest taki sam używany przez wszystkie Twoje .pliki po, co oznacza, że inne języki będą miały ten sam format i te same pola msgid, ale przetłumaczone msgstr linie.

mówiąc o kluczach tłumaczeniowych, istnieją dwa standardowe podejścia „filozoficzne”:

1. msgstr jako prawdziwe zdanie

główne zalety tego podejścia to:

  • jeśli części oprogramowania są nieprzetłumaczone w danym języku, wyświetlany klucz nadal zachowuje pewne znaczenie. Na przykład, jeśli wiesz, jak przetłumaczyć z angielskiego na hiszpański, ale potrzebujesz pomocy w tłumaczeniu na Francuski, możesz opublikować nową stronę z brakującymi francuskimi zdaniami, a części witryny będą wyświetlane w języku angielskim.

  • znacznie łatwiej jest tłumaczowi zrozumieć, co się dzieje i dokonać właściwego tłumaczenia w oparciu o msgid.

  • daje „darmowy” l10n dla jednego języka – źródłowego.

z drugiej strony, główną wadą jest to, że jeśli chcesz zmienić rzeczywisty tekst, musisz zastąpić ten sam msgid w kilku plikach językowych.

2. msgstr jako unikalny, uporządkowany klucz

opisywałby rolę zdania w aplikacji w sposób uporządkowany, w tym szablon lub część, w której znajduje się łańcuch znaków zamiast jego zawartości.

jest to świetny sposób na uporządkowanie kodu, oddzielenie zawartości tekstu od logiki szablonu. Może to jednak stanowić problem dla tłumacza, który tęskniłby za kontekstem.

plik źródłowy byłby potrzebny jako podstawa dla innych tłumaczeń. Na przykład, deweloper najlepiej byłoby mieć ” en.po ” plik, który Tłumacze czytaliby, aby zrozumieć, w czym pisać „fr.po”.

brakujące tłumaczenia wyświetli bezsensowne klucze na ekranie („top_menu.Witaj „zamiast” Witaj użytkowniku!”na wspomnianej niepublikowanej francuskiej stronie).

to dobrze, ponieważ wymusiłoby to Ukończenie tłumaczenia przed opublikowaniem – ale źle, ponieważ problemy z tłumaczeniem byłyby naprawdę okropne w interfejsie. Niektóre biblioteki zawierają jednak opcję określenia danego języka jako „awaryjnego”, zachowując się podobnie jak inne podejście.

Podręcznik Gettext preferuje pierwsze podejście, ponieważ ogólnie jest łatwiejszy dla tłumaczy i użytkowników w razie problemów. Takie podejście będziemy stosować również tutaj.

należy jednak zauważyć, że dokumentacja Symfony preferuje tłumaczenie oparte na słowach kluczowych, aby umożliwić niezależne zmiany wszystkich tłumaczeń bez wpływu na szablony.

codzienne użytkowanie

w zwykłej aplikacji można używać niektórych funkcji Gettext podczas pisania statycznego tekstu na stronach.

te zdania pojawią się wtedy wpliki po, zostaną przetłumaczone, skompilowane do plików. mo, a następnie wykorzystane przez Gettext podczas renderowania rzeczywistego interfejsu. Biorąc to pod uwagę, spójrzmy na to, co do tej pory omówiliśmy w przykładzie krok po kroku:

1. Przykładowy plik szablonu, zawierający różne wywołania gettext

<?php include 'i18n_setup.php' ?><div> <h1><?=sprintf(gettext('Welcome, %s!'), $name)?></h1> <!-- code indented this way only for legibility → <?php if ($unread): ?> <h2> <?=sprintf( ngettext('Only one unread message', '%d unread messages', $unread), $unread )?> </h2> <?php endif ?></div><h1><?=gettext('Introduction')?></h1><p><?=gettext('We\'re now translating some strings')?></p>
  • gettext() po prostu tłumaczy msgid na odpowiadającą jej msgstr dla danego języka. Jest też funkcja skrótu _(), która działa w ten sam sposób

  • ngettext() robi to samo, ale z regułami liczby mnogiej

  • istnieje również dgettext() i dngettext(), które pozwalają nadpisać domenę dla pojedynczego wywołania (więcej na temat konfiguracji domeny w następnym przykładzie)

2. Przykładowy plik instalacyjny (i18n_setup.użycie Gettext wymaga trochę kodu boilerplate, ale chodzi głównie o skonfigurowanie katalogu locales i wybranie odpowiednich parametrów (locale i domena).

<?php/** * Verifies if the given $locale is supported in the project * @param string $locale * @return bool */function valid($locale) { return in_array($locale, ) && valid($_GET)) { // the locale can be changed through the query-string $lang = $_GET; //you should sanitize this! setcookie('lang', $lang); //it's stored in a cookie so it can be reused} elseif (isset($_COOKIE) && valid($_COOKIE)) { // if the cookie is present instead, let's just keep it $lang = $_COOKIE; //you should sanitize this!} elseif (isset($_SERVER)) { // default: look for the languages the browser says the user accepts $langs = explode(',', $_SERVER); array_walk($langs, function (&$lang) { $lang = strtr(strtok($lang, ';'), ); }); foreach ($langs as $browser_lang) { if (valid($browser_lang)) { $lang = $browser_lang; break; } }}// here we define the global system locale given the found languageputenv("LANG=$lang");// this might be useful for date functions (LC_TIME) or money formatting (LC_MONETARY), for instancesetlocale(LC_ALL, $lang);// this will make Gettext look for ../locales/<lang>/LC_MESSAGES/main.mobindtextdomain('main', '../locales');// indicates in what encoding the file should be readbind_textdomain_codeset('main', 'UTF-8');// if your application has additional domains, as cited before, you should bind them here as wellbindtextdomain('forum', '../locales');bind_textdomain_codeset('forum', 'UTF-8');// here we indicate the default domain the gettext() calls will respond totextdomain('main');// this would look for the string in forum.mo instead of main.mo// echo dgettext('forum', 'Welcome back!');?>

3. Przygotowanie tłumaczenia do pierwszego uruchomienia

jedną z wielkich zalet Gettext w stosunku do niestandardowych pakietów framework i18n jest jego rozbudowany i potężny format plików.

być może myślisz „o człowieku, to jest dość trudne do zrozumienia i edycji ręcznie, prosta tablica byłoby łatwiejsze!”Nie popełnij błędu, aplikacje takie jak Poedit są tutaj, aby pomóc – bardzo. Możesz pobrać program ze swojej strony internetowej, jest bezpłatny i Dostępny dla wszystkich platform. Jest to dość łatwe narzędzie, do którego można się przyzwyczaić, a jednocześnie bardzo potężne-wykorzystujące wszystkie dostępne funkcje Gettext. Będziemy pracować tutaj z najnowszą wersją, Poedit 1.8.

Widok wewnątrz Poedit.

w pierwszym uruchomieniu, należy wybrać „plik > Nowy …” z menu. Zostaniesz poproszony o język; wybierz / filtruj język, na który chcesz przetłumaczyć, lub użyj formatu, o którym wspomnieliśmy wcześniej, na przykład en_US lub pt_BR.

wybór języka.

teraz, zapisz plik-używając tej struktury katalogów, o której również wspomnieliśmy. Następnie należy kliknąć „Wyodrębnij ze źródeł”, a tutaj skonfigurujesz różne ustawienia dla zadań ekstrakcji i tłumaczenia. Znajdziesz je później poprzez „katalog > właściwości”:

  • ścieżki źródłowe: Dołącz wszystkie foldery z projektu, w których gettext() (i rodzeństwo) są wywoływane-zwykle jest to folder(y) szablonów/widoków. Jest to jedyne obowiązkowe ustawienie.

  • właściwości tłumaczenia:

    • nazwa i wersja projektu, zespół i adres e-mail zespołu: Przydatne informacje, które idą w .nagłówek pliku po.
    • formy liczby mnogiej: są to Zasady, o których wspominaliśmy wcześniej. Możesz pozostawić go z domyślną opcją przez większość czasu, ponieważ Poedit zawiera już poręczną bazę reguł liczby mnogiej dla wielu języków.
    • Charsets: UTF-8, najlepiej.
    • kod źródłowy: kodowanie używane przez twoją bazę kodową-prawdopodobnie również UTF-8, Prawda?
  • źródło słowa kluczowe: oprogramowanie bazowe wie, jak gettext() i podobne wywołania funkcji wyglądają w kilku językach programowania, ale równie dobrze można utworzyć własne funkcje tłumaczeniowe. To będzie tutaj dodasz te inne metody. Zostanie to omówione w dalszej części sekcji „Porady”.

po ustawieniu tych właściwości, Poedit uruchomi skanowanie plików źródłowych, aby znaleźć wszystkie wywołania lokalizacyjne. Po każdym skanowaniu Poedit wyświetli podsumowanie tego, co zostało znalezione i co zostało usunięte z plików źródłowych. Nowe wpisy będą puste w tabeli tłumaczeń, co pozwoli na wprowadzenie zlokalizowanych wersji tych ciągów. Zapisz go, a plik. mo zostanie (ponownie)skompilowany do tego samego folderu i, presto!, Twój projekt jest umiędzynarodowiony!

projekt umiędzynarodowiony.

Poedit może również sugerować wspólne tłumaczenia z sieci i z poprzednich plików. Jest poręczny, więc musisz tylko sprawdzić, czy mają sens i zaakceptować je. Jeśli nie masz pewności co do tłumaczenia, możesz oznaczyć je jako rozmyte i będzie wyświetlane na Żółto. Niebieskie wpisy to te, które nie mają tłumaczenia.

4. Tłumaczenie strun

jak zapewne zauważyłeś, istnieją dwa główne typy strun zlokalizowanych: proste i te z formami liczby mnogiej.

proste mają tylko dwa pola: source i localized string. Łańcuch źródłowy nie może być modyfikowany, ponieważ Gettext / Poedit nie zawiera możliwości zmiany plików źródłowych; raczej będziesz musiał zmienić samo źródło i ponownie przeskanować pliki. (Końcówka: Jeśli klikniesz prawym przyciskiem myszy linię tłumaczenia, wyświetli podpowiedź z plikami źródłowymi i liniami, w których ten ciąg jest używany.)

ciągi znaków w liczbie mnogiej zawierają dwa pola pokazujące dwa ciągi źródłowe oraz tabulatory umożliwiające konfigurację różnych form końcowych.

Konfigurowanie formularzy końcowych.

przykład ciągu znaków w liczbie mnogiej na Poedit, pokazujący zakładkę tłumaczenia dla każdego z nich.

za każdym razem, gdy zmieniasz pliki kodu źródłowego i chcesz zaktualizować tłumaczenia, po prostu naciśnij Odśwież, a Poedit ponownie przeskanuje kod, usuwając nieistniejące wpisy, łącząc te, które się zmieniły i dodając nowe.

Poedit może również próbować odgadnąć niektóre tłumaczenia, bazując na innych, które zrobiłeś. Te domysły i zmienione wpisy otrzymają znacznik „rozmyty”, wskazujący, że wymagają recenzji, wyświetlany na Żółto na liście.

jest to również przydatne, jeśli masz zespół tłumaczy i ktoś próbuje napisać coś, czego nie jest pewien: po prostu zaznacz go rozmytym, a ktoś inny przejrzy go później.

na koniec zaleca się pozostawienie oznaczonego „Zobacz > nieprzetłumaczone wpisy”, ponieważ pomoże to uniknąć zapomnienia jakichkolwiek wpisów. Z tego menu można również otworzyć części interfejsu użytkownika, które pozwalają pozostawić informacje kontekstowe dla tłumaczy w razie potrzeby.

porady& triki

serwery internetowe mogą w końcu buforować pliki .mo.

jeśli używasz PHP jako modułu na Apache (mod_php), możesz napotkać problemy z buforowaniem pliku .mo. Dzieje się to przy pierwszym czytaniu, a następnie, aby go zaktualizować, może być konieczne ponowne uruchomienie serwera.

na Nginx i PHP5 zwykle trwa tylko kilka odświeżeń strony, aby odświeżyć pamięć podręczną tłumaczenia, a na PHP7 jest to rzadko potrzebne.

biblioteki zapewniają funkcje pomocnicze, aby Kod lokalizacyjny był krótki.

jako preferowany przez wiele osób, łatwiej jest używać _()zamiast gettext(). Wiele niestandardowych bibliotek i18n z frameworków używa również czegoś podobnego do t(), aby skrócić przetłumaczony kod. Jednak jest to jedyna funkcja, która ma skrót.

możesz dodać do swojego projektu kilka innych, takich jak __() lub _n() dla ngettext(), lub może fantazyjny _r(), który dołączyłby do połączeń gettext() i sprintf(). Inne biblioteki, takie jak Gettext oscarotero, również zapewniają funkcje pomocnicze, takie jak te.

w takich przypadkach musisz poinstruować narzędzie Gettext, jak wyodrębnić Ciągi z tych nowych funkcji. Nie bój się, to bardzo proste. To tylko pole w … plik po lub ekran ustawień w Poedit (w edytorze opcja ta znajduje się wewnątrz „Catalog > Properties > sources keywords”).

pamiętaj: Gettext zna już domyślne funkcje dla wielu języków, więc nie martw się, jeśli lista wydaje się pusta. Na tej liście należy uwzględnić specyfikacje nowych funkcji, zgodnie z tym konkretnym formatem:

  • jeśli utworzysz coś takiego jak t(), które po prostu zwróci tłumaczenie dla ciągu znaków, możesz określić je jako t. Gettext będzie wiedział, że jedynym argumentem funkcji jest łańcuch, który ma być przetłumaczony;

  • jeśli funkcja ma więcej niż jeden argument, możesz określić, w którym z nich jest pierwszy ciąg i, w razie potrzeby, również liczbę mnogą. Na przykład, jeśli sygnatura naszej funkcji to __('one user', '%d users', $number), Specyfikacja to __:1,2, co oznacza, że pierwsza forma jest pierwszym argumentem, a druga forma jest drugim argumentem. Jeśli twoja liczba jest pierwszym argumentem, spec będzie __:2,3, wskazując, że pierwsza forma jest drugim argumentem, i tak dalej.

po włączeniu tych nowych zasad do.plik po, nowe skanowanie przyniesie nowe ciągi tak łatwo, jak wcześniej.

spraw, aby Twoja aplikacja PHP była Wielojęzyczna dzięki Gettext

Gettext jest bardzo potężnym narzędziem do umiędzynarodowienia twojego projektu PHP. Poza elastycznością, która umożliwia obsługę wielu języków ludzkich, Obsługa ponad 20 języków programowania pozwala łatwo przenieść wiedzę na temat używania go z PHP do innych języków, takich jak Python, Java lub C#.

co więcej, Poedit może pomóc wygładzić ścieżkę między kodem a przetłumaczonych ciągów, dzięki czemu proces jest prostszy i łatwiejszy do naśladowania. Może również usprawnić wspólne wysiłki tłumaczeniowe dzięki integracji Crowdin.

w miarę możliwości rozważ inne języki, którymi mogą posługiwać się Twoi użytkownicy. Jest to szczególnie ważne w przypadku projektów nieanglojęzycznych: możesz zwiększyć dostęp użytkownika, jeśli wydasz go w języku angielskim, a także w swoim ojczystym języku.

oczywiście nie wszystkie projekty mają potrzebę internacjonalizacji, ale o wiele łatwiej jest uruchomić i18n w okresie niemowlęcym, nawet jeśli początkowo nie jest to potrzebne, niż zrobić to później, jeśli później stanie się to wymogiem. A dzięki narzędziom takim jak Gettext i Poedit jest to łatwiejsze niż kiedykolwiek.

Related: Wprowadzenie do PHP 7: Co nowego i czego nie ma

Leave a Reply

Twój adres e-mail nie zostanie opublikowany.