How to Build a Multilingual App: a demo with PHP and Gettext

függetlenül attól, hogy weboldalt vagy teljes értékű webes alkalmazást épít, a szélesebb közönség számára való hozzáférhetővé tétele gyakran megköveteli, hogy különböző nyelveken és helyszíneken legyen elérhető.

a legtöbb emberi nyelv közötti alapvető különbségek ezt nem könnyítik meg. A nyelvtani szabályok, A nyelvi árnyalatok, a dátumformátumok és más különbségek együttesen teszik a lokalizációt egyedülálló és félelmetes kihívássá.

Tekintsük ezt az egyszerű példát.

az angol nyelvű pluralizáció szabályai meglehetősen egyszerűek: lehet egy szó vagy egy szó többes számú alakja.

más nyelvekben – például a szláv nyelvekben – az egyes szám mellett két többes szám is létezik. Előfordulhat, hogy összesen négy, öt vagy hat többes számú nyelvet is talál, például Szlovén, ír vagy arab nyelven.

a kód szervezésének módja, valamint az összetevők és az interfész kialakítása fontos szerepet játszik annak meghatározásában, hogy milyen könnyen lehet lokalizálni az alkalmazást.

nemzetközivé (i18n) a codebase, segít biztosítani, hogy lehet igazítani a különböző nyelveken vagy régiókban viszonylag könnyen. A nemzetközivé válás általában egyszer történik, lehetőleg a projekt elején, hogy elkerüljék a forráskód hatalmas változásait az úton.

Hogyan építsünk egy többnyelvű alkalmazást: egy Demo PHP és Gettext

miután a kódbázis nemzetközivé vált, a honosítás (l10n) az alkalmazás tartalmának egy adott nyelvre/területi beállításra történő lefordításának kérdésévé válik.

a honosítást minden alkalommal el kell végezni, amikor új nyelvet vagy régiót kell támogatni. Továbbá, amikor a felület egy része (szöveget tartalmaz) frissül, új tartalom válik elérhetővé – amelyet ezután lokalizálni kell (azaz le kell fordítani) az összes támogatott helyre.

ebben a cikkben megtanuljuk, hogyan lehet nemzetközivé tenni és lokalizálni a PHP-ben írt szoftvereket. Áttekintjük a különböző megvalósítási lehetőségeket és a rendelkezésünkre álló különböző eszközöket a folyamat megkönnyítése érdekében.

eszközök nemzetközivé

a PHP szoftver nemzetközivé tételének legegyszerűbb módja a tömbfájlok használata. A tömbök lefordított karakterláncokkal lesznek feltöltve, amelyeket aztán fel lehet keresni a sablonokon belül:

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

ez azonban aligha ajánlott módja a komoly projekteknek, mivel mindenképpen karbantartási kérdéseket vet fel az úton. Néhány kérdés még a legelején is megjelenhet, például a változó interpoláció vagy a főnevek pluralizációjának támogatásának hiánya stb.

az egyik legklasszikusabb eszköz (gyakran az i18n és az l10n referenciájaként) egy Gettext nevű Unix eszköz.

bár nyúlik vissza 1995, ez még mindig egy átfogó eszköz fordítására szoftver, amely szintén könnyen használható. Bár elég könnyű elkezdeni, még mindig hatékony támogató eszközökkel rendelkezik.

Gettext az, amit fogunk használni ebben a bejegyzésben. Bemutatunk egy nagyszerű GUI alkalmazást, amely felhasználható az l10n forrásfájlok egyszerű frissítésére, elkerülve ezzel a parancssor kezelésének szükségességét.

könyvtárak, hogy megkönnyítsék a dolgokat

főbb PHP webes keretek és könyvtárak, amelyek támogatják a Gettext-et

vannak jelentős PHP webes keretrendszerek és könyvtárak, amelyek támogatják a Gettext-et és az i18n egyéb implementációit. néhányuk könnyebben telepíthető, mint mások, vagy sport kiegészítő funkciókat vagy különböző i18n fájlformátumokat támogatnak. Bár ebben a dokumentumban a PHP maggal ellátott eszközökre összpontosítunk, itt van néhány említésre méltó lista:

  • oscarotero / Gettext: Gettext támogatás objektum-orientált felülettel; tartalmazza a továbbfejlesztett segítő funkciók, erős extractors több fájlformátumok (néhány közülük nem támogatja natívan a gettext parancs). A .mo/.po fájlokon túl más formátumokba is exportálhat, ami hasznos lehet, ha integrálni kell a fordítási fájlokat a rendszer más részeibe, például egy JavaScript interfészbe.

  • symfony / translation: sok különböző formátumot támogat, de javasolja a részletes XLIFF használatát. nem tartalmaz segítő funkciókat vagy beépített extractor-t, de támogatja a strtr() belső használatát.

  • zend / i18n: Támogatja az array és az INI fájlokat, vagy a Gettext formátumokat. Gyorsítótárazási réteget valósít meg, hogy ne kelljen minden alkalommal elolvasni a fájlrendszert. Ide tartoznak a nézetsegítők, valamint a locale-aware bemeneti szűrők és validátorok is. Nincs azonban üzenetelszívója.

más keretrendszerek tartalmazzák az i18n modulokat is, de ezek a kódbázisukon kívül nem érhetők el:

  • Laravel: támogatja az alapvető tömbfájlokat; nincs automatikus kivonója, de tartalmaz egy @lang segítőt a sablonfájlokhoz.

  • Yii: Támogatja array, Gettext, és adatbázis-alapú fordítás, és tartalmaz egy üzenet extractor. A Intl kiterjesztés támogatja, a PHP 5.3 óta elérhető, az ICU projekt alapján. Ez lehetővé teszi a Yii számára, hogy erőteljes helyettesítéseket hajtson végre, például a számok, a dátumok, az idők, az intervallumok, a pénznem és a sorszámok helyesírását.

ha úgy dönt, hogy az egyik olyan könyvtárat választja, amely nem biztosít extraktorokat, akkor érdemes a Gettext formátumokat használni, így használhatja az eredeti Gettext eszközláncot (beleértve a Poedit-et is) a fejezet többi részében leírtak szerint.

a Gettext telepítése

lehet, hogy telepítenie kell a Gettext-et és a kapcsolódó PHP könyvtárat a csomagkezelő, például az apt-get vagy a yum használatával. A telepítés után engedélyezze a extension=gettext.so (Linux/Unix) vagy extension=php_gettext.dll (Windows) hozzáadásával a php.ini fájlhoz.

itt a Poedit-et is használjuk fordítási fájlok létrehozásához. Valószínűleg megtalálja a rendszer csomagkezelőjében; elérhető Unix, Mac és Windows számára, és ingyenesen letölthető a weboldaláról is.

a Gettext fájlok típusai

a Gettext használata során általában három fájltípus van.

a legfontosabbak a Po (Portable Object) és a Mo (Machine Object) fájlok, az első az olvasható “lefordított objektumok” listája, a második pedig a megfelelő bináris (a Gettext által a lokalizáció során értelmezhető). Van egy POT (Po Template) fájl is, amely egyszerűen tartalmazza a forrásfájlok összes meglévő kulcsát, és útmutatóként használható az összes PO fájl létrehozásához és frissítéséhez.

a sablonfájlok nem kötelezőek; attól függően, hogy milyen eszközt használ az l10n elvégzéséhez, csak a PO/MO fájlokkal lesz rendben. Nyelvenként és régiónként egy pár PO/MO fájl lesz, de domainenként csak egy POT.

tartományok elválasztása

nagy projektekben előfordulhat, hogy külön kell fordítani a fordításokat, amikor ugyanazok a szavak különböző kontextusokban más jelentést közvetítenek.

ezekben az esetekben különböző “domainekre” kell felosztani őket, amelyek alapvetően POT/PO/MO fájlok csoportjai, ahol a fájlnév az említett fordítási tartomány.

a kis és közepes méretű projektek az egyszerűség kedvéért általában csak egy domaint használnak; a neve tetszőleges, de a kódmintáinkhoz a “main”-T fogjuk használni.

a Symfony projektekben például a tartományokat használják az érvényesítési üzenetek fordításának elválasztására.

területi Kód

a területi beállítás egyszerűen egy nyelv egy változatát azonosító kód. Az ISO 639-1 és az ISO 3166-1 alpha-2 specifikációk szerint van meghatározva: két kisbetűk a nyelvhez, opcionálisan egy aláhúzás és két nagybetűk az ország vagy a regionális kód azonosítására.

ritka nyelvek esetében három betűt használnak.

egyes beszélők számára az országrész feleslegesnek tűnhet. Valójában egyes nyelveknek nyelvjárásai vannak különböző országokban, például az osztrák német (de_AT) vagy a brazil portugál (pt_BR). A második részt arra használják, hogy megkülönböztessék ezeket a nyelvjárásokat – ha nincs jelen, akkor a nyelv “általános” vagy “hibrid” változatának tekintik.

könyvtárszerkezet

a Gettext használatához be kell tartanunk a mappák meghatározott szerkezetét.

először ki kell választania egy tetszőleges gyökeret az l10n fájlokhoz a forrástárban. Benne van egy mappa minden szükséges területi beállításhoz, valamint egy rögzített “LC_MESSAGES” mappa, amely tartalmazza az összes PO/MO párt.

LC_MESSAGES mappa

többes számú formák

mint a bevezetőben mondtuk, a különböző nyelvek eltérő pluralizációs szabályokat alkalmazhatnak. Gettext azonban megment minket ez a baj.

új létrehozásakor .po fájl, akkor meg kell, hogy állapítsa meg a pluralizációs szabályokat, hogy a nyelv, és lefordított darabokat, amelyek többes számú érzékeny lesz egy másik formában minden ilyen szabályok.

amikor a Gettext-et kódban hívja, meg kell adnia a mondathoz kapcsolódó számot (például a “n üzeneted van.”, meg kell adnod az n) értékét, és ki fogja dolgozni a megfelelő formát – szükség esetén akár karakterlánc-helyettesítéssel is.

a többes számú szabályok Az egyes szabályokhoz logikai teszttel szükséges szabályok számából állnak (legfeljebb egy szabály tesztje elhagyható). Például:

  • Japán: nplurals=1; plural=0; – egy szabály: nincsenek többes számú formák

  • Magyar: nplurals=2; plural=(n != 1); – két szabály: csak akkor használjon többes számot, ha n nem 1,egyébként használja az egyes számot.

  • brazil portugál: nplurals=2; plural=(n > 1); – két szabály, csak akkor használjon többes számot, ha n nagyobb, mint 1, egyébként használja az egyes számot.

a mélyebb magyarázat érdekében online elérhető egy informatív LingoHub oktatóanyag.

a Gettext a megadott szám alapján határozza meg, hogy melyik szabályt használja, és a karakterlánc helyes honosított változatát fogja használni. Olyan karakterláncok esetében, ahol a pluralizációt kezelni kell, be kell illesztenie a .po fájl egy másik mondat minden többes számú szabály definiált.

minta végrehajtása

mindezek után az elmélet, menjünk egy kicsit gyakorlati. Itt egy részlet a .po Fájl (ne aggódj még túl sokat a szintaxis, hanem csak kap egyfajta teljes tartalom):

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"

az első szakasz fejlécként működik, az msgid és msgstr üres.

leírja a fájl kódolását, többes számú alakokat és még néhány dolgot. A második rész lefordít egy egyszerű karakterláncot angolról brazil portugálra, a harmadik pedig ugyanezt teszi, de kihasználja a karakterlánc cseréjét sprintf – ről, lehetővé téve a fordítás számára, hogy tartalmazza a felhasználónevet és a látogatás dátumát.

az utolsó szakasz a pluralizációs formák mintája, az egyes és többes számváltozatot msgid – ként jeleníti meg angolul, a megfelelő fordításokat pedig msgstr 0 és 1-ként (a többes számú szabály által megadott számot követve).

ott a karakterlánc-helyettesítést is használják, így a szám közvetlenül a mondatban látható, a %d használatával. A többes számú alakoknak mindig két msgid (egyes és többes szám) van, ezért nem tanácsos összetett nyelvet használni fordítási forrásként.

lokalizációs kulcsok

mint bizonyára észrevette, a tényleges angol mondatot használjuk forrásazonosítóként. Ez a msgid ugyanaz, mint az összes .po fájlok, vagyis más nyelvek ugyanolyan formátumúak és ugyanazok a msgid mezők, de lefordítva msgstr sorok.

a fordítási kulcsokról szólva itt két szabványos “filozófiai” megközelítés létezik:

1. msgstr mint valódi mondat

ennek a megközelítésnek a fő előnyei a következők:

  • ha a szoftvernek vannak olyan részei, amelyeket nem fordítottak le egy adott nyelven, akkor a megjelenített gomb továbbra is fenntart valamilyen jelentést. Például, ha tudja, hogyan kell lefordítani angolról spanyolra, de segítségre van szüksége a francia nyelvre történő fordításhoz, akkor közzéteheti az új oldalt hiányzó francia mondatokkal, és a weboldal egyes részei angolul jelennek meg.

  • sokkal könnyebb a fordító számára, hogy megértse, mi történik, és megfelelő fordítást készítsen a msgidalapján.

  • “ingyenes “l10n – t ad egy nyelvhez-a forráshoz.

másrészt az elsődleges hátrány az, hogy ha meg kell változtatnia a tényleges szöveget, akkor ugyanazt a msgid fájlt kell kicserélnie több nyelvi fájlra.

2. az msgstr mint egyedi, strukturált kulcs

ez strukturált módon írja le az alkalmazásban lévő mondatszerepet, beleértve a sablont vagy annak részét, ahol a karakterlánc található, annak tartalma helyett.

ez egy nagyszerű módja a kód szervezésének, elválasztva a szöveges tartalmat a sablonlogikától. Ez azonban problémákat vethet fel a fordító számára, aki elmulasztja a kontextust.

más fordítások alapjául forrásnyelvi fájlra lenne szükség. Például a fejlesztőnek ideális esetben lenne egy ” en.po “fájl, amelyet a fordítók elolvasnának, hogy megértsék, mit kell írni a” fr.po”.

a hiányzó fordítások értelmetlen kulcsokat jelenítenének meg a képernyőn (“top_menu.Üdvözöljük “helyett” Hello there, felhasználó!”az említett lefordítatlan francia oldalon).

ez jó, mivel arra kényszerítené a fordítást, hogy teljes legyen a közzététel előtt – de rossz, mivel a fordítási problémák valóban szörnyűek lennének a felületen. Néhány könyvtár azonban tartalmaz egy lehetőséget, hogy egy adott nyelvet “tartalékként” adjon meg, hasonló viselkedéssel, mint a másik megközelítés.

a Gettext kézikönyv az első megközelítést részesíti előnyben, mivel általában könnyebb a fordítók és a felhasználók számára baj esetén. Ezt a megközelítést fogjuk használni itt is.

meg kell azonban jegyezni, hogy a Symfony dokumentáció előnyben részesíti a kulcsszó alapú fordítást, lehetővé téve az összes fordítás független módosítását anélkül, hogy a sablonokat is befolyásolná.

mindennapi használat

egy közös alkalmazás, akkor használja néhány Gettext funkciók írása közben statikus szöveget az oldalakon.

ezek a mondatok akkor jelennek meg .po fájlokat, lefordítani, lefordítani. mo fájlokat, majd által használt Gettext, amikor teszi a tényleges felület. Tekintettel arra, hogy kössük össze azt, amit eddig megbeszéltünk egy lépésről lépésre:

1. Minta sablonfájl, beleértve néhány különböző gettext hívást

<?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() egyszerűen lefordítja a msgid a megfelelő msgstr egy adott nyelv. Van még a _() gyorsírás funkció, amely ugyanúgy működik

  • ngettext() ugyanezt teszi, de többes számú szabályokkal

  • van még dgettext() és dngettext(), amely lehetővé teszi, hogy felülbírálja a tartomány egyetlen hívás (bővebben tartomány konfiguráció a következő példában)

2. Egy minta telepítőfájl (i18n_setup.a gettext

beállítása a Gettext használatával egy kis boilerplate kódot igényel, de leginkább a locales könyvtár konfigurálásáról és a megfelelő paraméterek (egy területi és egy tartomány) kiválasztásáról szól.

<?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. Fordítás előkészítése az első futtatáshoz

a Gettext egyik nagy előnye az egyéni keretrendszer i18n csomagokkal szemben a kiterjedt és hatékony fájlformátum.

talán azt gondolod: “Ó ember, ezt elég nehéz megérteni és kézzel szerkeszteni, egy egyszerű tömb könnyebb lenne!”Ne tévesszen be, az olyan alkalmazások, mint a Poedit, itt vannak, hogy segítsenek – sokat. A programot a weboldalukról szerezheti be, ingyenes és minden platformon elérhető. Ez egy nagyon egyszerű eszköz, hogy megszokja, és egy nagyon erős egy ugyanakkor – az összes funkcióját Gettext áll rendelkezésre. Itt fogunk dolgozni a legújabb verzióval, Poedit 1.8.

Kilátás a Poedit belsejében.

az első futtatáskor válassza a” fájl > új… ” lehetőséget a menüből. Meg fogják kérni a nyelvet; válassza ki/szűrje le a lefordítani kívánt nyelvet, vagy használja a korábban említett formátumot, például en_US vagy pt_BR.

a nyelv kiválasztása.

Most mentse el a fájlt – az általunk említett könyvtárszerkezettel is. Ezután kattintson a “kivonat a forrásokból” gombra, és itt konfigurálhatja a különböző beállításokat a kibontási és fordítási feladatokhoz. Ön képes lesz arra, hogy megtalálja azokat később a “katalógus > tulajdonságok”:

  • forrás utak: Tartalmazza az összes mappát a projektből, ahol gettext() (és testvérek) hívják – ez általában a sablonok/nézetek mappa(ok). Ez az egyetlen kötelező beállítás.

  • fordítási tulajdonságok:

    • a projekt neve és verziója, a csapat és a csapat e-mail címe: hasznos információ, amely a .po fájl fejléc.
    • többes számú formák: ezek a szabályok, amelyeket korábban említettünk. Akkor hagyja az alapértelmezett beállítás a legtöbb időt, mint Poedit már tartalmaz egy praktikus adatbázis többes számú szabályok sok nyelven.
    • karakterkészletek: UTF-8, lehetőleg.
    • forráskód karakterkészlet: a kódbázis által használt karakterkészlet-valószínűleg UTF-8 is, igaz?
  • forrás kulcsszavak: az alapul szolgáló szoftver tudja, hogyan néz ki a gettext() és a hasonló függvényhívások több programozási nyelven, de akár saját fordítási függvényeket is létrehozhat. Itt lesz, hogy hozzáadja ezeket a többi módszert. Ezt később a “tippek” részben tárgyaljuk.

miután beállította ezeket a tulajdonságokat, a Poedit átvizsgálja a forrásfájlokat, hogy megtalálja az összes lokalizációs hívást. Minden vizsgálat után a Poedit egy összefoglalót jelenít meg arról, hogy mit találtak és mit távolítottak el a forrásfájlokból. Az új bejegyzések üresek lesznek a fordítási táblázatban, lehetővé téve a karakterláncok lokalizált verzióinak megadását. Mentse el, és egy .mo fájl (újra)ugyanabba a mappába kerül, és presto!, a projekt nemzetközivé vált!

projekt nemzetközivé.

a Poedit általános fordításokat is javasolhat az internetről és a korábbi fájlokból. Ez praktikus, így csak ellenőrizni kell, hogy van-e értelme, és elfogadja őket. Ha nem biztos a fordításban, megjelölheti Fuzzy – ként, és sárga színnel jelenik meg. A kék bejegyzések azok, amelyeknek nincs fordítása.

4. Sztringek fordítása

amint azt már észrevetted, a lokalizált sztringeknek két fő típusa van: egyszerű és többes számú.

az egyszerűeknek csak két dobozuk van: forrás és lokalizált karakterlánc. A forrás karakterlánc nem módosítható, mivel a Gettext / Poedit nem tartalmazza a forrásfájlok megváltoztatásának képességét; inkább magát a forrást kell megváltoztatnia, és újra kell szkennelnie a fájlokat. (Tipp: Ha jobb egérgombbal kattint egy fordítási sorra, megjelenik egy tipp a forrásfájlokkal és a sorokkal, ahol az adott karakterláncot használják.)

a többes számú űrlap karakterláncok két mezőt tartalmaznak a két forrás karakterlánc megjelenítéséhez, valamint füleket, így konfigurálhatja a különböző végső űrlapokat.

a végleges űrlapok konfigurálása.

példa egy többes számú karakterláncra a Poedit-en, mindegyikhez egy fordítási lapot mutatva.

amikor megváltoztatja a forráskód fájljait, és frissítenie kell a fordításokat, csak nyomja meg a Frissítés gombot, és a Poedit újra beolvassa a kódot, eltávolítja a nem létező bejegyzéseket, egyesíti a megváltoztatottakat és újakat ad hozzá.

a Poedit megpróbálhat kitalálni néhány fordítást is, más fordítások alapján. Ezek a találgatások és a módosított bejegyzések egy “Fuzzy” jelölőt kapnak, amely jelzi, hogy felülvizsgálatra van szükségük, sárga színnel jelenik meg a listában.

ez akkor is hasznos, ha van egy fordítócsapata, és valaki megpróbál írni valamit, amiben nem biztos: csak jelölje meg homályosan, és valaki más később felülvizsgálja.

végül javasoljuk, hogy hagyja meg a “> lefordítatlan bejegyzések megtekintése először” jelölést, mivel ez segít elkerülni a bejegyzések elfelejtését. Ebből a menüből megnyithatja a felhasználói felület olyan részeit is, amelyek lehetővé teszik, hogy szükség esetén kontextuális információkat hagyjon a fordítók számára.

tippek & trükkök

a webszerverek végül gyorsítótárazhatják a .mo fájlokat.

ha a PHP-t modulként futtatja az Apache-on (mod_php), akkor a .mo fájl gyorsítótárazásával kapcsolatos problémák merülhetnek fel. Ez történik az első olvasáskor, majd frissítéséhez szükség lehet A kiszolgáló újraindítására.

Nginx és PHP5 esetén általában csak néhány oldalfrissítés szükséges a fordítási gyorsítótár frissítéséhez, PHP7 esetén pedig ritkán van rá szükség.

a könyvtárak segítő funkciókat biztosítanak a lokalizációs kód rövid tartásához.

ahogy sokan kedvelik, könnyebb a _()használata a gettext() helyett. Számos egyedi i18n könyvtár a keretrendszerekből valami hasonlót használ t() is, hogy a lefordított kódot rövidebbé tegye. Ez azonban az egyetlen funkció, amely parancsikont sportol.

lehet, hogy hozzá szeretne adni néhányat a projekthez, például __() vagy _n() a ngettext() – hez, vagy esetleg egy divatos _r(), amely csatlakozik a gettext() és sprintf() hívásokhoz. Más könyvtárak, mint például az oscarotero Gettext is nyújtanak segítő funkciók, mint ezek.

ezekben az esetekben utasítania kell a Gettext segédprogramot arra, hogyan kell kibontani a karakterláncokat az új funkciókból. Ne félj, nagyon könnyű. Ez csak egy mező a .po fájl vagy egy beállítási képernyő a Poeditben(a szerkesztőben ez az opció a “katalógus > tulajdonságok > forrás kulcsszavak”).

Emlékezz: A Gettext már sok nyelv alapértelmezett funkcióit ismeri, ezért ne aggódjon, ha ez a lista üresnek tűnik. A listába bele kell foglalnia az új funkciók specifikációit, ezt a speciális formátumot követve:

  • ha valami olyasmit hoz létre, mint t(), amely egyszerűen visszaadja a karakterlánc fordítását, akkor t – ként adhatja meg. A Gettext tudni fogja, hogy az Egyetlen függvény argumentum a lefordítandó karakterlánc;

  • ha a függvénynek egynél több argumentuma van, megadhatja, hogy melyikben legyen az első karakterlánc, és szükség esetén a többes számot is. Például, ha a függvény aláírásunk __('one user', '%d users', $number), akkor a specifikáció __:1,2 lenne, vagyis az első forma az első argumentum, a második forma pedig a második argumentum. Ha a számod az első argumentum helyett, akkor a specifikáció __:2,3 lesz, jelezve, hogy az első forma a második argumentum stb.

miután ezeket az új szabályokat belefoglalta a .po fájl, egy új vizsgálat hozza az új húrok ugyanolyan könnyen, mint korábban.

tedd PHP App többnyelvű Gettext

Gettext egy nagyon hatékony eszköz nemzetközivé a PHP projekt. Azon rugalmasságán túl, amely lehetővé teszi számos emberi nyelv támogatását, több mint 20 programozási nyelv támogatása lehetővé teszi, hogy a PHP használatával kapcsolatos ismereteit könnyen átvihesse más nyelvekre, például Pythonra, Java-ra vagy C# – ra.

ezenkívül a Poedit segíthet a kód és a lefordított karakterláncok közötti út simításában, így a folyamat egyszerűbbé és könnyebben követhetővé válik. A Crowdin integrációval egyszerűsítheti a megosztott fordítási erőfeszítéseket is.

amikor csak lehetséges, fontolja meg más nyelveket, amelyeket a felhasználók beszélhetnek. Ez leginkább a nem angol nyelvű projektek esetében fontos: növelheti felhasználói hozzáférését, ha angolul, valamint anyanyelvén kiadja.

természetesen nem minden projektnek van szüksége nemzetközivé válásra, de sokkal könnyebb elindítani az i18n-t egy projekt csecsemőkorában, még akkor is, ha eredetileg nem volt rá szükség, mint később megtenni az úton, ha később követelményré válik. És olyan eszközökkel, mint a Gettext és a Poedit, könnyebb, mint valaha.

kapcsolódó: Bevezetés A PHP 7: mi új és mi ment

Leave a Reply

Az e-mail-címet nem tesszük közzé.