jak vytvořit vícejazyčnou aplikaci: Demo s PHP a Gettextem
ať už stavíte webovou stránku nebo plnohodnotnou webovou aplikaci, zpřístupnění širšímu publiku často vyžaduje, aby byla k dispozici v různých jazycích a lokalitách.
zásadní rozdíly mezi většinou lidských jazyků, aby to nic jiného než snadné. Rozdíly v gramatických pravidlech, jazykové nuance, formáty data, a více kombinovat, aby se lokalizace stala jedinečnou a hrozivou výzvou.
zvažte tento jednoduchý příklad.
pravidla pluralizace v angličtině jsou velmi jednoduchá: můžete mít singulární formu slova nebo množné číslo slova.
v jiných jazycích, i když – jako jsou slovanské jazyky – existují dvě množné tvary kromě jednotného čísla. Můžete dokonce najít jazyky s celkem čtyřmi, pěti nebo šesti množnými formami, například ve slovinštině, irštině nebo arabštině.
způsob, jakým je váš kód organizován a jak jsou navrženy vaše komponenty a rozhraní, hraje důležitou roli při určování, jak snadno můžete lokalizovat svou aplikaci.
internacionalizace (i18n) vaší kódové základny pomáhá zajistit, aby mohla být relativně snadno přizpůsobena různým jazykům nebo regionům. Internacionalizace se obvykle provádí jednou, nejlépe na začátku projektu, aby se zabránilo nutnosti obrovských změn ve zdrojovém kódu po silnici.
jakmile je vaše kódová základna internacionalizována, lokalizace (l10n) se stává otázkou překladu obsahu vaší aplikace do konkrétního jazyka/národního prostředí.
lokalizace musí být provedena pokaždé, když je třeba podporovat nový jazyk nebo oblast. Také, kdykoli je část rozhraní (obsahující text) aktualizována, bude k dispozici nový obsah – který pak musí být lokalizován (tj.
v tomto článku se naučíme, jak internacionalizovat a lokalizovat software napsaný v PHP. Projdeme různé možnosti implementace a různé nástroje, které máme k dispozici, abychom tento proces usnadnili.
nástroje pro internacionalizaci
nejjednodušší způsob, jak internacionalizovat PHP software je pomocí souborů pole. Pole budou naplněna přeloženými řetězci, které pak lze vyhledat v šablonách:
<h1><?=$TRANS?></h1>
to je, nicméně, stěží doporučený způsob pro seriózní projekty, protože to určitě bude představovat problémy s údržbou po silnici. Některé problémy se mohou objevit i na samém začátku, jako je nedostatek podpory pro proměnnou interpolaci nebo pluralizaci podstatných jmen a tak dále.
jedním z nejklasičtějších nástrojů (často užívaných jako reference pro i18n a l10n) je unixový nástroj nazvaný Gettext.
ačkoli sahá až do roku 1995, je to stále komplexní nástroj pro překlad softwaru, který je také snadno použitelný. I když je docela snadné začít, stále má výkonné podpůrné nástroje.
Gettext je to, co budeme používat v tomto příspěvku. Představíme skvělou GUI aplikaci, kterou lze použít k snadné aktualizaci zdrojových souborů l10n, čímž se vyhneme nutnosti vypořádat se s příkazovým řádkem.
knihovny, aby se věci snadno
existují hlavní PHP webové rámce a knihovny, které podporují Gettext a další implementace i18n. některé se snadněji instalují než jiné, nebo sportují další funkce nebo podporují různé formáty souborů i18n. Přestože se v tomto dokumentu zaměřujeme na nástroje dodávané s jádrem PHP, zde je seznam některých dalších, které stojí za zmínku:
-
oscarotero / Gettext: podpora Gettext s objektově orientovaným rozhraním; obsahuje vylepšené pomocné funkce, výkonné extraktory pro několik formátů souborů(některé z nich nejsou nativně podporovány příkazem
gettext
). Lze také exportovat do formátů mimo jen. mo/. po soubory, které mohou být užitečné, pokud potřebujete integrovat své překladové soubory do jiných částí systému, jako je JavaScript rozhraní. -
symfony / translation: Podporuje mnoho různých formátů, ale doporučuje používat podrobnou XLIFF je. nezahrnuje pomocné funkce nebo vestavěný extraktor, ale podporuje zástupné symboly pomocí
strtr()
interně. -
zend / i18n: Podporuje soubory array a INI nebo formáty Gettext. Implementuje vrstvu ukládání do mezipaměti, aby se zabránilo nutnosti číst systém souborů pokaždé. Také zahrnuje zobrazení pomocníky, a locale-aware vstupní filtry a validátory. Nemá však žádný extraktor zpráv.
jiné rámce také zahrnují moduly i18n, ale ty nejsou k dispozici mimo jejich kódové základny:
-
Laravel: podporuje základní soubory pole; nemá automatický extraktor, ale obsahuje
@lang
pomocník pro soubory šablon. -
Yii: Podporuje překlad založený na poli, Gettextu A databázi a obsahuje extraktor zpráv. Podporováno rozšířením
Intl
, které je k dispozici od PHP 5.3 a je založeno na projektu ICU. To umožňuje Yii spouštět výkonné náhrady, jako je hláskování čísel, formátování dat, časů, intervalů, měny a ordinálů.
pokud se rozhodnete pro jednu z knihoven, které neposkytují žádné extraktory, možná budete chtít použít formáty Gettext, takže můžete použít původní gettext toolchain (včetně Poedit), jak je popsáno ve zbytku kapitoly.
instalace Gettext
možná budete muset nainstalovat Gettext a související PHP knihovnu pomocí správce balíčků, jako je apt-get nebo yum. Po instalaci jej povolte přidáním extension=gettext.so
(Linux/Unix) nebo extension=php_gettext.dll
(Windows) do souboru php.ini
.
zde budeme také používat Poedit k vytváření překladových souborů. Pravděpodobně jej najdete ve správci balíčků systému; je k dispozici pro Unix, Mac a Windows a lze jej zdarma stáhnout také na jeho webových stránkách.
typy souborů Gettext
při práci s Gettextem se obvykle jedná o tři typy souborů.
hlavní jsou soubory PO (Portable Object) a MO (Machine Object), první je seznam čitelných „přeložených objektů“ a druhý je odpovídající binární (interpretovat Gettext při lokalizaci). K dispozici je také soubor POT (po Template), který jednoduše obsahuje všechny existující klíče ze zdrojových souborů a může být použit jako průvodce pro generování a aktualizaci všech souborů PO.
soubory šablon nejsou povinné; v závislosti na nástroji, který používáte k provádění l10n, budete v pořádku pouze se soubory PO/MO. Budete mít jeden pár souborů PO / MO na jazyk a oblast, ale pouze jeden POT na doménu.
oddělování domén
ve velkých projektech jsou některé případy, kdy možná budete muset oddělit překlady, když stejná slova vyjadřují jiný význam v různých kontextech.
v těchto případech je budete muset rozdělit do různých „domén“, což jsou v podstatě pojmenované skupiny souborů POT / PO / MO, kde název souboru je uvedená překladová doména.
malé a střední projekty obvykle pro jednoduchost používají pouze jednu doménu; její název je libovolný, ale pro naše vzorky kódu použijeme „hlavní“.
v projektech Symfony se například domény používají k oddělení překladu pro validační zprávy.
Locale Code
locale je jednoduše kód, který identifikuje jednu verzi jazyka. Je definován podle specifikací ISO 639-1 a ISO 3166-1 alpha-2: Dvě malá písmena pro jazyk, volitelně následovaná podtržítkem a dvěma velkými písmeny identifikujícími zemi nebo regionální kód.
pro vzácné jazyky se používají tři písmena.
u některých řečníků se část země může zdát nadbytečná. Ve skutečnosti mají některé jazyky dialekty v různých zemích, jako je rakouská němčina (de_AT) nebo brazilská portugalština (pt_BR). Druhá část se používá k rozlišení mezi těmito dialekty-pokud není přítomna , je považována za „obecnou “ nebo“ hybridní “ verzi jazyka.
adresářová struktura
abychom mohli používat Gettext, musíme dodržovat specifickou strukturu složek.
nejprve musíte vybrat libovolný kořen pro soubory l10n ve zdrojovém úložišti. Uvnitř budete mít složku pro každé potřebné národní prostředí a pevnou složku „LC_MESSAGES“, která bude obsahovat všechny vaše páry PO/MO.
množné tvary
jak jsme řekli v úvodu, různé jazyky mohou mít různá pluralizační pravidla. Gettext nám však tento problém ušetří.
při vytváření nového .po souboru, budete muset deklarovat pravidla pluralizace pro tento jazyk, a přeložené kusy, které jsou citlivé na množné číslo, budou mít pro každé z těchto pravidel jinou formu.
při volání Gettextu v kódu budete muset zadat číslo související s větou (např. pro frázi “ máte n zpráv.“, budete muset zadat hodnotu n) A bude fungovat správný formulář, který chcete použít – v případě potřeby i pomocí substituce řetězce.
množná pravidla se skládají z počtu pravidel nezbytných pro booleovský test pro každé pravidlo (test pro nejvýše jedno pravidlo může být vynechán). Například:
-
Japonec:
nplurals=1; plural=0;
– jedno pravidlo: neexistují žádné množné tvary -
Czech:
nplurals=2; plural=(n != 1);
– dvě pravidla: použijte množné číslo pouze v případě, že n Není 1, jinak použijte singulární formulář. -
Brazilská portugalština:
nplurals=2; plural=(n > 1);
– dvě pravidla, použijte množné číslo pouze tehdy, když je n větší než 1, jinak použijte jednotnou formu.
pro hlubší vysvětlení je k dispozici informativní tutoriál LingoHub online.
Gettext určí, které pravidlo použít na základě poskytnutého čísla, a použije správnou lokalizovanou verzi řetězce. Pro řetězce, kde je třeba řešit pluralizaci, budete muset zahrnout do .po soubor jinou větu pro každé množné pravidlo definované.
Ukázková implementace
po celé té teorii, pojďme trochu praktické. Zde je výňatek z a .po souboru (nebojte se ještě příliš mnoho o syntaxi, ale místo toho jen získat představu o celkovém obsahu):
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"
první část funguje jako záhlaví, přičemž msgid
a msgstr
jsou prázdné.
popisuje kódování souborů, množné tvary a několik dalších věcí. Druhá část překládá jednoduchý řetězec z angličtiny do brazilské portugalštiny a třetí dělá totéž, ale využívá nahrazení řetězce z sprintf
, což umožňuje překladu obsahovat uživatelské jméno a datum návštěvy.
poslední část je ukázkou pluralizačních forem, které zobrazují singulární a množné číslo jako msgid
v angličtině a jejich odpovídající překlady jako msgstr
0 a 1 (podle čísla daného plurálním pravidlem).
tam se také používá náhrada řetězce, takže číslo lze vidět přímo ve větě pomocí %d
. Množné tvary mají vždy dvě msgid
(singulární a množné číslo), proto se doporučuje nepoužívat jako zdroj překladu složitý jazyk.
lokalizační klíče
jak jste si možná všimli, používáme skutečnou anglickou větu jako zdrojové ID. To msgid
je stejné jako u všech vašich .soubory po, což znamená, že jiné jazyky budou mít stejný formát a stejná pole msgid
, ale přeložené řádky msgstr
.
když už mluvíme o překladových klíčích, existují zde dva standardní“ filozofické “ přístupy:
1. msgstr jako reálnou větu
hlavní výhody tohoto přístupu jsou:
-
pokud jsou části softwaru nepřeložené v daném jazyce, zobrazený klíč si stále zachová nějaký význam. Například, pokud víte, jak přeložit z angličtiny do španělštiny, ale potřebujete pomoc s překladem do francouzštiny, můžete publikovat novou stránku s chybějícími francouzskými větami, a části webu by se místo toho zobrazovaly v angličtině.
-
pro překladatele je mnohem snazší pochopit, co se děje, a provést správný překlad založený na
msgid
. -
to vám dává „zdarma“ l10n pro jeden jazyk-zdroj jeden.
na druhou stranu hlavní nevýhodou je, že pokud potřebujete změnit skutečný text, musíte nahradit stejný msgid
v několika jazykových souborech.
2. msgstr jako jedinečný strukturovaný klíč
to by popisovalo roli věty v aplikaci strukturovaným způsobem, včetně šablony nebo části, kde je řetězec umístěn místo jeho obsahu.
je to skvělý způsob, jak uspořádat kód a oddělit textový obsah od logiky šablony. To by však mohlo představovat problémy překladateli, který by postrádal kontext.
zdrojový jazykový soubor by byl potřebný jako základ pro další překlady. Například vývojář by v ideálním případě měl “ en.po „Soubor, že překladatelé by četl pochopit, co psát v“ fr.po“.
Chybějící překlady by zobrazovaly na obrazovce nesmyslné klávesy („top_menu.Vítejte „místo“ Ahoj, uživatel!“na zmíněné nepřeložené francouzské stránce).
to je dobré, protože by to přinutilo překlad dokončit před publikováním – ale špatné, protože problémy s překladem by byly v rozhraní opravdu hrozné. Některé knihovny však obsahují možnost určit daný jazyk jako „záložní“, který má podobné chování jako jiný přístup.
příručka Gettext upřednostňuje první přístup, protože je obecně jednodušší pro překladatele a uživatele v případě potíží. To je přístup, který budeme používat i zde.
je však třeba poznamenat, že dokumentace Symfony upřednostňuje překlad založený na klíčových slovech, aby umožnila nezávislé změny všech překladů bez ovlivnění šablon.
každodenní použití
v běžné aplikaci byste při psaní statického textu na svých stránkách používali některé funkce Gettext.
tyto věty by se pak objevily .po soubory, dostat přeloženy, zkompilované do. mo soubory, a pak používá Gettext při vykreslování skutečné rozhraní. Vzhledem k tomu spojme to, o čem jsme dosud diskutovali, v příkladu krok za krokem:
1. Ukázkový soubor šablony, včetně některých různých volání 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()
jednoduše překládámsgid
do odpovídajícíhomsgstr
pro daný jazyk. K dispozici je také zkrácená funkce_()
, která funguje stejným způsobem -
ngettext()
dělá to samé, ale s množnými pravidly -
k dispozici jsou také
dgettext()
adngettext()
, které umožňují přepsat doménu pro jedno volání (více o konfiguraci domény v dalším příkladu)
2. Ukázkový instalační soubor (i18n_setup.php, jak bylo použito výše), výběr správného národního prostředí a konfigurace Gettext
pomocí Gettext zahrnuje trochu kódu boilerplate, ale je to hlavně o konfiguraci adresáře locales a výběru vhodných parametrů(národní prostředí a doména).
<?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. Příprava překladu pro první spuštění
jednou z velkých výhod, které má Gettext oproti balíčkům custom framework i18n, je jeho rozsáhlý a výkonný Formát souboru.
možná si myslíte “ Ach člověče, to je docela těžké pochopit a upravit ručně, jednoduché pole by bylo jednodušší!“Nenechte se mýlit, aplikace jako Poedit jsou tu, aby vám pomohly-hodně. Program můžete získat z jejich webových stránek, je zdarma a je k dispozici pro všechny platformy. Je to docela snadný nástroj, na který si zvyknete, a zároveň velmi výkonný – pomocí všech funkcí, které má Gettext k dispozici. Budeme zde pracovat s nejnovější verzí, Poedit 1.8.
při prvním spuštění byste měli z nabídky Vybrat „soubor > nový…“. Budete požádáni o jazyk; vyberte / filtrujte jazyk, do kterého chcete přeložit, nebo použijte formát, který jsme zmínili dříve, například en_US
nebo pt_BR
.
Nyní uložte soubor-pomocí této adresářové struktury, kterou jsme také zmínili. Pak byste měli kliknout na „extrahovat ze zdrojů“ a zde nakonfigurujete různá nastavení pro úlohy extrakce a překladu. Budete moci najít všechny ty později přes „katalog > vlastnosti“:
-
zdrojové cesty: Zahrňte všechny složky z projektu, kde se nazývají
gettext()
(a sourozenci) – obvykle se jedná o složky šablony/pohledy. Toto je jediné povinné nastavení. -
vlastnosti překladu:
- název projektu a verze, tým a e-mailová adresa týmu: užitečné informace, které jde v.hlavička souboru po.
- množné tvary: toto jsou pravidla, která jsme zmínili dříve. Většinu času jej můžete ponechat s výchozí volbou, protože Poedit již obsahuje praktickou databázi pravidel množného čísla pro mnoho jazyků.
- znakové sady: UTF-8, nejlépe.
- znaková sada zdrojového kódu: znaková sada používaná vaší kódovou základnou-pravděpodobně také UTF-8, že?
-
klíčová slova Zdroje: Základní software ví, jak
gettext()
a podobné volání funkcí vypadají v několika programovacích jazycích, Ale můžete si také vytvořit vlastní překladové funkce. To bude tady budete přidávat tyto další metody. To bude popsáno později v části „Tipy“.
po nastavení těchto vlastností Poedit provede skenování zdrojových souborů a vyhledá všechna lokalizační volání. Po každém skenování Poedit zobrazí souhrn toho, co bylo nalezeno a co bylo odstraněno ze zdrojových souborů. Nové položky budou prázdné do překladové tabulky, což vám umožní zadat lokalizované verze těchto řetězců. Uložte jej a soubor .mo bude (znovu)sestaven do stejné složky a presto!, váš projekt je internacionalizován!
Poedit může také navrhnout běžné překlady z webu a z předchozích souborů. Je to užitečné, takže stačí zkontrolovat, zda mají smysl, a přijmout je. Pokud si nejste jisti překladem, můžete jej označit jako Fuzzy a zobrazí se žlutě. Modré položky jsou ty, které nemají žádný překlad.
4. Překlad řetězců
jak jste si možná všimli, existují dva hlavní typy lokalizovaných řetězců: jednoduché a množné.
jednoduché mají pouze dvě pole: zdrojový a lokalizovaný řetězec. Zdrojový řetězec nelze upravit, protože Gettext / Poedit nezahrnují možnost měnit zdrojové soubory; spíše budete muset změnit samotný zdroj a znovu skenovat soubory. (Tip: Pokud kliknete pravým tlačítkem myši na překladový řádek, zobrazí se nápověda se zdrojovými soubory a řádky, kde se tento řetězec používá.)
množné řetězce obsahují dvě pole pro zobrazení dvou zdrojových řetězců a karet, takže můžete konfigurovat různé konečné formuláře.
příklad řetězce s množným číslem na Poedit, zobrazující kartu překladu pro každý z nich.
kdykoli změníte soubory zdrojového kódu a potřebujete aktualizovat překlady, stačí stisknout Obnovit a Poedit znovu prohledá kód, odstraní neexistující položky, sloučí ty, které se změnily, a přidá nové.
Poedit se také může pokusit uhodnout některé překlady na základě jiných překladů, které jste udělali. Tyto odhady a změněné položky obdrží značku „Fuzzy“, což znamená, že potřebují kontrolu, zobrazenou žlutě v seznamu.
je také užitečné, pokud máte překladatelský tým a někdo se pokusí napsat něco, o čem si není jistý: stačí to označit Fuzzy a někdo jiný to později zkontroluje.
nakonec se doporučuje ponechat „Zobrazit > nepřeložené položky jako první“ označené, protože vám to pomůže vyhnout se zapomenutí jakýchkoli záznamů. Z této nabídky můžete také otevřít části uživatelského rozhraní, které vám v případě potřeby umožní ponechat kontextové informace překladatelům.
tipy & triky
webové servery mohou skončit ukládání do mezipaměti vašich souborů. mo.
pokud používáte PHP jako modul na Apache (mod_php), můžete mít problémy s uložením souboru. mo do mezipaměti. Stává se to při prvním čtení a poté, abyste jej aktualizovali, možná budete muset restartovat server.
na Nginx a PHP5 obvykle trvá jen několik aktualizací stránky, aby se obnovila mezipaměť překladu, a na PHP7 je to zřídka potřeba.
knihovny poskytují pomocné funkce, které udržují krátký lokalizační kód.
jak mnoho lidí preferuje, je snadnější použít _()
místo gettext()
. Mnoho vlastních knihoven i18n z rámců používá také něco podobného t()
, aby se přeložený kód zkrátil. To je však jediná funkce, která sportuje zkratku.
možná budete chtít přidat do svého projektu některé další, například __()
nebo _n()
pro ngettext()
, nebo možná Fantazie _r()
, která by se připojila k volání gettext()
a sprintf()
. Jiné knihovny, jako je oscarotero Gettext, také poskytují pomocné funkce, jako jsou tyto.
v těchto případech budete muset instruovat nástroj Gettext, jak extrahovat řetězce z těchto nových funkcí. Nebojte se, je to velmi snadné. Je to jen pole v .po souboru nebo obrazovce Nastavení v Poedit (v editoru je tato volba uvnitř „Katalog > vlastnosti > zdroje klíčová slova“).
zapamatovat si: Gettext již zná výchozí funkce pro mnoho jazyků, takže se nemusíte obávat, pokud se tento seznam zdá prázdný. Do tohoto seznamu musíte zahrnout SPECIFIKACE nových funkcí podle tohoto konkrétního formátu:
-
pokud vytvoříte něco jako
t()
, které jednoduše vrátí překlad pro řetězec, můžete jej zadat jakot
. Gettext bude vědět, že jediným argumentem funkce je řetězec, který má být přeložen; -
pokud má funkce více než jeden argument, můžete určit, ve kterém z nich je první řetězec a v případě potřeby také množné číslo. Například, pokud je náš podpis funkce
__('one user', '%d users', $number)
, SPECIFIKACE by byla__:1,2
, což znamená, že první forma je první argument a druhá forma je druhý argument. Pokud vaše číslo přijde jako první argument místo toho, spec by__:2,3
, označující první formulář je druhý argument, a tak dále.
po zahrnutí těchto nových pravidel do .po souboru, Nové skenování přinese vaše nové řetězce stejně snadno jako dříve.
Udělej si svůj PHP aplikace Vícejazyčné s Gettext
Gettext je velmi mocný nástroj pro internacionalizaci PHP projektu. Kromě své flexibility, která umožňuje podporu velkého počtu lidských jazyků, vám Podpora více než 20 programovacích jazyků umožňuje snadno přenést své znalosti o používání s PHP do jiných jazyků, jako je Python, Java nebo C#.
kromě toho může Poedit pomoci vyhladit cestu mezi kódem a přeloženými řetězci, čímž je proces přímočařejší a snáze sledovatelný. To může také zefektivnit sdílené překladatelské úsilí s jeho crowdin integrace.
kdykoli je to možné, zvažte další jazyky, kterými mohou uživatelé mluvit. To je většinou důležité pro neanglické projekty: můžete zvýšit přístup uživatele, pokud jej uvolníte v angličtině i ve svém rodném jazyce.
samozřejmě, že ne všechny projekty potřebují internacionalizaci, ale je mnohem snazší začít i18n během dětství projektu, i když to zpočátku nebylo potřeba, než to udělat později po silnici, pokud se následně stane požadavkem. A s nástroji jako Gettext a Poedit je to jednodušší než kdy jindy.