Come costruire un multilingue App: Una demo con PHP e Gettext

Se si sta costruendo un sito web o una vera e propria applicazione web, rendendolo accessibile a un pubblico più ampio spesso richiede che sia disponibile in diverse lingue e locali.

Le differenze fondamentali tra la maggior parte delle lingue umane rendono tutto questo tutt’altro che facile. Le differenze di regole grammaticali, sfumature linguistiche, formati di data e altro ancora si combinano per rendere la localizzazione una sfida unica e formidabile.

Considera questo semplice esempio.

Le regole di pluralizzazione in inglese sono piuttosto semplici: puoi avere una forma singolare di una parola o una forma plurale di una parola.

In altre lingue, anche se-come le lingue slave-ci sono due forme plurali oltre a quella singolare. Puoi anche trovare lingue con un totale di quattro, cinque o sei forme plurali, come in sloveno, irlandese o arabo.

Il modo in cui il codice è organizzato e il modo in cui i componenti e l’interfaccia sono progettati, gioca un ruolo importante nel determinare la facilità con cui è possibile localizzare l’applicazione.

L’internazionalizzazione (i18n) della tua base di codice, aiuta a garantire che possa essere adattato a diverse lingue o regioni con relativa facilità. L’internazionalizzazione viene solitamente eseguita una volta, preferibilmente all’inizio del progetto per evitare di richiedere enormi cambiamenti nel codice sorgente lungo la strada.

Come costruire un'app multilingue: una demo con PHP e Gettext

Una volta che la tua base di codice è stata internazionalizzata, la localizzazione (l10n) diventa una questione di tradurre il contenuto della tua applicazione in una lingua/locale specifica.

La localizzazione deve essere eseguita ogni volta che una nuova lingua o regione deve essere supportata. Inoltre, ogni volta che una parte dell’interfaccia (contenente testo) viene aggiornata, diventa disponibile un nuovo contenuto, che deve quindi essere localizzato (cioè tradotto) in tutte le impostazioni locali supportate.

In questo articolo, impareremo come internazionalizzare e localizzare il software scritto in PHP. Passeremo attraverso le varie opzioni di implementazione e i diversi strumenti che sono disponibili a nostra disposizione per facilitare il processo.

Strumenti per l’internazionalizzazione

Il modo più semplice per internazionalizzare il software PHP è utilizzando i file array. Gli array saranno popolati con stringhe tradotte, che possono quindi essere cercate all’interno dei modelli:

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

Questo è, tuttavia, difficilmente un modo consigliato per progetti seri, come sarà sicuramente porre problemi di manutenzione lungo la strada. Alcuni problemi potrebbero persino apparire all’inizio, come la mancanza di supporto per l’interpolazione variabile o la pluralizzazione dei nomi e così via.

Uno degli strumenti più classici (spesso preso come riferimento per i18n e l10n) è uno strumento Unix chiamato Gettext.

Sebbene risalga al 1995, è ancora uno strumento completo per tradurre software che è anche facile da usare. Mentre è abbastanza facile da iniziare, ha ancora potenti strumenti di supporto.

Gettext è quello che useremo in questo post. Presenteremo una grande applicazione GUI che può essere utilizzata per aggiornare facilmente i file sorgente l10n, evitando così la necessità di gestire la riga di comando.

Librerie Per Rendere le Cose Facili

Principali web PHP framework e librerie che supportano Gettext

Ci sono importanti web PHP framework e librerie che supportano Gettext e altre implementazioni di i18n. Alcuni sono più facili da installare rispetto ad altri, o sport caratteristiche aggiuntive o il supporto di diversi formati di file i18n. Anche se in questo documento, ci concentriamo sugli strumenti forniti con il core PHP, ecco un elenco di alcuni altri degni di nota:

  • oscarotero / Gettext: supporto Gettext con un’interfaccia orientata agli oggetti; include funzioni di supporto migliorate, potenti estrattori per diversi formati di file (alcuni dei quali non supportati nativamente dal comando gettext). Può anche esportare in formati oltre i file.mo/. po, che possono essere utili se è necessario integrare i file di traduzione in altre parti del sistema, come un’interfaccia JavaScript.

  • symfony / translation: Supporta molti formati diversi, ma raccomanda l’uso di XLIFF dettagliati. Non include funzioni di supporto o un estrattore incorporato, ma supporta i segnaposto che usano strtr() internamente.

  • zend / i18n: Supporta array e file INI, o formati Gettext. Implementa un livello di caching per evitare di dover leggere il file system ogni volta. Include anche gli helper di visualizzazione e i filtri di input e i validatori basati sulle impostazioni locali. Tuttavia, non ha estrattore di messaggi.

Altri framework includono anche moduli i18n, ma questi non sono disponibili al di fuori delle loro basi di codice:

  • Laravel: Supporta i file array di base; non ha estrattore automatico ma include un @lang helper per i file modello.

  • Yii: Supporta array, Gettext, e la traduzione basata su database, e include un estrattore di messaggi. Supportato dall’estensione Intl, disponibile da PHP 5.3 e basato sul progetto ICU. Ciò consente a Yii di eseguire sostituzioni potenti, come l’ortografia di numeri, la formattazione di date, orari, intervalli, valuta e ordinali.

Se si decide di utilizzare una delle librerie che non forniscono estrattori, è possibile utilizzare i formati Gettext, in modo da poter utilizzare la toolchain Gettext originale (incluso Poedit) come descritto nel resto del capitolo.

Installazione di Gettext

Potrebbe essere necessario installare Gettext e la relativa libreria PHP utilizzando il gestore di pacchetti, come apt-get o yum. Una volta installato, attivalo aggiungendo extension=gettext.so (Linux/Unix) o extension=php_gettext.dll (Windows) al tuo file php.ini.

Qui useremo anche Poedit per creare file di traduzione. Probabilmente lo troverai nel gestore di pacchetti del tuo sistema; è disponibile per Unix, Mac e Windows e può essere scaricato gratuitamente anche sul suo sito web.

Tipi di file Gettext

Ci sono tre tipi di file che di solito si trattano mentre si lavora con Gettext.

I principali sono file PO (Portable Object) e MO (Machine Object), il primo è un elenco di “oggetti tradotti” leggibili e il secondo è il binario corrispondente (da interpretare da Gettext quando si esegue la localizzazione). C’è anche un file POT (PO Template), che contiene semplicemente tutte le chiavi esistenti dai file di origine e può essere utilizzato come guida per generare e aggiornare tutti i file PO.

I file del modello non sono obbligatori; a seconda dello strumento che stai usando per fare l10n, starai bene solo con i file PO / MO. Avrai una coppia di file PO/MO per lingua e regione, ma solo un POT per dominio.

Separare i domini

Ci sono alcuni casi, in grandi progetti, in cui potrebbe essere necessario separare le traduzioni quando le stesse parole trasmettono significati diversi in contesti diversi.

In questi casi, è necessario dividerli in diversi “domini”, che sono fondamentalmente denominati gruppi di file POT/PO/MO, in cui il nome del file è il suddetto dominio di traduzione.

I progetti di piccole e medie dimensioni di solito, per semplicità, usano un solo dominio; il suo nome è arbitrario, ma useremo “main” per i nostri esempi di codice.

Nei progetti Symfony, ad esempio, i domini sono usati per separare la traduzione per i messaggi di convalida.

Codice locale

Un locale è semplicemente un codice che identifica una versione di una lingua. È definito seguendo le specifiche ISO 639-1 e ISO 3166-1 alpha-2: due lettere minuscole per la lingua, eventualmente seguite da un trattino basso e due lettere maiuscole che identificano il paese o il codice regionale.

Per le lingue rare, vengono utilizzate tre lettere.

Per alcuni oratori, la parte country può sembrare ridondante. In effetti, alcune lingue hanno dialetti in diversi paesi, come il tedesco austriaco (de_AT) o il portoghese brasiliano (pt_BR). La seconda parte è usata per distinguere tra quei dialetti-quando non è presente, è presa come una versione” generica “o” ibrida ” della lingua.

Struttura di directory

Per utilizzare Gettext, dovremo aderire a una struttura specifica di cartelle.

In primo luogo, è necessario selezionare una radice arbitraria per i file l10n nel repository di origine. Al suo interno, avrai una cartella per ogni locale necessario e una cartella “LC_MESSAGES” fissa che conterrà tutte le tue coppie PO/MO.

Cartella LC_MESSAGES

Forme plurali

Come abbiamo detto nell’introduzione, lingue diverse potrebbero sfoggiare regole di pluralizzazione diverse. Tuttavia, Gettext ci salva questo problema.

Quando si crea un nuovo .file po, dovrai dichiarare le regole di pluralizzazione per quella lingua e i pezzi tradotti che sono sensibili al plurale avranno una forma diversa per ciascuna di queste regole.

Quando si chiama Gettext in code, è necessario specificare un numero relativo alla frase (ad esempio per la frase “Hai n messaggi.”, dovrai specificare il valore di n), e risolverà il modulo corretto da usare, anche usando la sostituzione delle stringhe se necessario.

Le regole plurali sono composte dal numero di regole necessarie con un test booleano per ogni regola (il test per un massimo di una regola può essere omesso). Ad esempio:

  • Giapponese: nplurals=1; plural=0; – una regola: non ci sono forme plurali

  • Inglese: nplurals=2; plural=(n != 1); – due regole: usa la forma plurale solo quando n non è 1, altrimenti usa la forma singolare.

  • Portoghese brasiliano: nplurals=2; plural=(n > 1); – due regole, usa la forma plurale solo quando n è maggiore di 1, altrimenti usa la forma singolare.

Per una spiegazione più approfondita, c’è un tutorial informativo LingoHub disponibile online.

Gettext determinerà quale regola utilizzare in base al numero fornito e utilizzerà la versione localizzata corretta della stringa. Per le stringhe in cui la pluralizzazione deve essere gestita, è necessario includere nel .file po una frase diversa per ogni regola plurale definita.

Esempio di implementazione

Dopo tutta quella teoria, andiamo un po ‘ pratico. Ecco un estratto di un .file po (non preoccuparti ancora troppo della sintassi, ma invece di avere un’idea del contenuto generale):

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"

La prima sezione funziona come un’intestazione, con msgid e msgstr vuoti.

Descrive la codifica del file, le forme plurali e poche altre cose. La seconda sezione traduce una semplice stringa dall’inglese al portoghese brasiliano, e la terza fa lo stesso, ma sfrutta la sostituzione delle stringhe da sprintf, consentendo alla traduzione di contenere il nome utente e la data di visita.

L’ultima sezione è un esempio di forme di pluralizzazione, mostrando la versione singolare e plurale come msgid in inglese e le loro corrispondenti traduzioni come msgstr 0 e 1 (seguendo il numero dato dalla regola plurale).

Lì, viene utilizzata anche la sostituzione delle stringhe, quindi il numero può essere visto direttamente nella frase, usando %d. Le forme plurali hanno sempre due msgid (singolare e plurale), quindi è consigliabile non utilizzare un linguaggio complesso come fonte di traduzione.

Chiavi di localizzazione

Come avrai notato, stiamo usando la frase inglese reale come ID sorgente. Che msgid è lo stesso utilizzato in tutta la tua .file po, il che significa che altre lingue avranno lo stesso formato e gli stessi campi msgid ma tradotti msgstr linee.

Parlando di chiavi di traduzione, ci sono due approcci “filosofici” standard qui:

1. msgid come frase reale

I principali vantaggi di questo approccio sono:

  • Se ci sono parti del software non tradotte in una determinata lingua, la chiave visualizzata manterrà comunque un significato. Ad esempio, se sai come tradurre dall’inglese allo spagnolo ma hai bisogno di aiuto per tradurre in francese, potresti pubblicare la nuova pagina con frasi francesi mancanti e parti del sito Web verranno visualizzate in inglese.

  • È molto più facile per il traduttore capire cosa sta succedendo e fare una traduzione corretta basata su msgid.

  • Ti dà l10n “libero” per una lingua-quella di origine.

D’altra parte, lo svantaggio principale è che, se è necessario modificare il testo effettivo, è necessario sostituire lo stesso msgid su più file di lingua.

2. msgid come chiave unica e strutturata

Questo descriverebbe il ruolo della frase nell’applicazione in modo strutturato, incluso il modello o la parte in cui si trova la stringa anziché il suo contenuto.

Questo è un ottimo modo per organizzare il codice, separando il contenuto del testo dalla logica del modello. Tuttavia, ciò potrebbe presentare problemi al traduttore che perderebbe il contesto.

Un file della lingua di origine sarebbe necessario come base per altre traduzioni. Ad esempio, lo sviluppatore avrebbe idealmente un “en.po “file, che i traduttori avrebbero letto per capire cosa scrivere in” fr.po”.

Le traduzioni mancanti mostrerebbero chiavi prive di significato sullo schermo (“top_menu.benvenuto “invece di” Ciao, Utente!”sulla suddetta pagina francese non tradotta).

Questo è buono in quanto costringerebbe la traduzione a essere completa prima della pubblicazione, ma male come i problemi di traduzione sarebbero davvero terribili nell’interfaccia. Alcune librerie, tuttavia, includono un’opzione per specificare una determinata lingua come “fallback”, con un comportamento simile all’altro approccio.

Il manuale Gettext favorisce il primo approccio in quanto, in generale, è più facile per i traduttori e gli utenti in caso di problemi. Questo è l’approccio che useremo anche qui.

Va notato, però, che la documentazione di Symfony favorisce la traduzione basata su parole chiave, per consentire modifiche indipendenti di tutte le traduzioni senza influenzare anche i template.

Uso quotidiano

In un’applicazione comune, è possibile utilizzare alcune funzioni Gettext durante la scrittura di testo statico nelle pagine.

Quelle frasi sarebbero quindi visualizzate in .file po, vengono tradotti, compilati in file. mo e quindi utilizzati da Gettext durante il rendering dell’interfaccia effettiva. Detto questo, leghiamo insieme ciò che abbiamo discusso finora in un esempio passo-passo:

1. Un file modello di esempio, incluse alcune diverse chiamate 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() semplicemente traduce un msgid nel suo corrispondente msgstr per una determinata lingua. C’è anche la stenografia funzione _() che funziona allo stesso modo

  • ngettext() non lo stesso, ma con regole plurale

  • C’è anche dgettext() e dngettext(), che permette di ignorare il dominio per una singola chiamata (più sulla configurazione del dominio nel prossimo esempio)

2. Un file di configurazione di esempio (i18n_setup.php come usato sopra), selezionare la localizzazione corretta e configurare Gettext

L’uso di Gettext comporta un po ‘ di codice boilerplate, ma si tratta principalmente di configurare la directory delle impostazioni locali e scegliere i parametri appropriati (una locale e un dominio).

<?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. Preparare la traduzione per la prima esecuzione

Uno dei grandi vantaggi di Gettext rispetto ai pacchetti framework i18n personalizzati è il suo ampio e potente formato di file.

Forse stai pensando ” Oh uomo, è abbastanza difficile da capire e modificare a mano, un semplice array sarebbe più facile!”Non commettere errori, applicazioni come Poedit sono qui per aiutare-molto. È possibile ottenere il programma dal loro sito web, è gratuito e disponibile per tutte le piattaforme. È uno strumento abbastanza facile da abituare e molto potente allo stesso tempo, utilizzando tutte le funzionalità che Gettext ha a disposizione. Lavoreremo qui con l’ultima versione, Poedit 1.8.

Vista all'interno di Poedit.

Nella prima esecuzione, è necessario selezionare “File > Nuovo New” dal menu. Ti verrà chiesto per la lingua; selezionare / filtrare la lingua in cui si desidera tradurre o utilizzare il formato menzionato prima, ad esempio en_US o pt_BR.

Selezione della lingua.

Ora, salva il file-usando anche quella struttura di directory che abbiamo menzionato. Quindi fai clic su “Estrai da fonti” e qui configurerai varie impostazioni per le attività di estrazione e traduzione. Sarete in grado di trovare tutti quelli in seguito attraverso “Catalogo > Proprietà”:

  • Percorsi sorgente: Includi tutte le cartelle del progetto in cui sono chiamati gettext() (e fratelli) – di solito sono le tue cartelle templates/views. Questa è l’unica impostazione obbligatoria.

  • Proprietà di traduzione:

    • Nome del progetto e la versione, il team e l’indirizzo e-mail del team: Informazioni utili che va nel .intestazione del file po.
    • Forme plurali: queste sono le regole che abbiamo menzionato prima. Puoi lasciarlo con l’opzione predefinita la maggior parte del tempo, poiché Poedit include già un pratico database di regole plurali per molte lingue.
    • Set di caratteri: UTF-8, preferibilmente.
    • Codice sorgente charset: il set di caratteri utilizzato dalla tua base di codice-probabilmente anche UTF-8, giusto?
  • Parole chiave di origine: Il software sottostante sa come le chiamate di funzione gettext() e simili appaiono in diversi linguaggi di programmazione, ma potresti anche creare le tue funzioni di traduzione. Sarà qui che aggiungerai quegli altri metodi. Questo sarà discusso più avanti nella sezione” Suggerimenti”.

Dopo aver impostato tali proprietà, Poedit eseguirà una scansione attraverso i file di origine per trovare tutte le chiamate di localizzazione. Dopo ogni scansione, Poedit visualizzerà un riepilogo di ciò che è stato trovato e ciò che è stato rimosso dai file di origine. Le nuove voci saranno vuote nella tabella di traduzione, consentendo di inserire le versioni localizzate di tali stringhe. Salvalo e un file. mo verrà (ri) compilato nella stessa cartella e, presto!, il suo progetto è internazionalizzato!

Progetto internazionalizzato.

Poedit può anche suggerire traduzioni comuni dal web e da file precedenti. È utile quindi devi solo controllare se hanno senso e accettarli. Se non siete sicuri di una traduzione, è possibile contrassegnare come Fuzzy, e verrà visualizzato in giallo. Le voci blu sono quelle che non hanno traduzione.

4. Tradurre stringhe

Come avrete notato, ci sono due tipi principali di stringhe localizzate: quelle semplici e quelle con forme plurali.

Quelli semplici hanno solo due caselle: sorgente e stringa localizzata. La stringa di origine non può essere modificata, poiché Gettext / Poedit non include la possibilità di modificare i file di origine; piuttosto, sarà necessario modificare l’origine stessa e rieseguire i file. (Suggerimento: Se si fa clic con il pulsante destro del mouse su una riga di traduzione, verrà visualizzato un suggerimento con i file di origine e le righe in cui viene utilizzata quella stringa.)

Le stringhe di forma plurale includono due caselle per mostrare le due stringhe di origine e le schede in modo da poter configurare le diverse forme finali.

Configurazione dei moduli finali.

Esempio di una stringa con una forma plurale su Poedit, che mostra una scheda di traduzione per ciascuno di essi.

Ogni volta che cambi i file del codice sorgente e devi aggiornare le traduzioni, premi Aggiorna e Poedit eseguirà una nuova scansione del codice, rimuovendo voci inesistenti, unendo quelle che sono cambiate e aggiungendone di nuove.

Poedit potrebbe anche provare a indovinare alcune traduzioni, basate su altre che hai fatto. Queste ipotesi e le voci modificate riceveranno un marcatore “Fuzzy”, che indica che hanno bisogno di revisione, visualizzato in giallo nell’elenco.

È utile anche se hai un team di traduzione e qualcuno cerca di scrivere qualcosa di cui non è sicuro: basta contrassegnarlo Fuzzy e qualcun altro lo esaminerà più tardi.

Infine, si consiglia di lasciare “Visualizza > Voci non tradotte prima” contrassegnato, in quanto ti aiuterà a evitare di dimenticare qualsiasi voce. Da quel menu, è anche possibile aprire parti dell’interfaccia utente che consentono di lasciare informazioni contestuali per i traduttori, se necessario.

Suggerimenti& Trucchi

I server Web potrebbero finire per memorizzare nella cache i file .mo.

Se stai eseguendo PHP come modulo su Apache (mod_php), potresti incontrare problemi con il file .mo che viene memorizzato nella cache. Succede la prima volta che viene letto e quindi, per aggiornarlo, potrebbe essere necessario riavviare il server.

Su Nginx e PHP5 di solito ci vogliono solo un paio di aggiornamenti di pagina per aggiornare la cache di traduzione, e su PHP7 è raramente necessario.

Le librerie forniscono funzioni di supporto per mantenere il codice di localizzazione breve.

Come preferito da molte persone, è più facile usare _()invece di gettext(). Molte librerie i18n personalizzate dai framework usano anche qualcosa di simile a t(), per abbreviare il codice tradotto. Tuttavia, questa è l’unica funzione che mette in mostra una scorciatoia.

Potresti voler aggiungere nel tuo progetto alcuni altri, come __() o _n() per ngettext(), o forse una fantasia _r() che si unirebbe alle chiamate gettext() e sprintf(). Altre librerie, come Gettext di oscarotero forniscono anche funzioni di supporto come queste.

In questi casi, è necessario istruire l’utilità Gettext su come estrarre le stringhe da quelle nuove funzioni. Non aver paura, è molto facile. E ‘ solo un campo nel .file po o una schermata delle impostazioni in Poedit (nell’editor, tale opzione è all’interno di”Catalogo > Proprietà > Parole chiave Sorgenti”).

Ricorda: Gettext conosce già le funzioni predefinite per molte lingue, quindi non preoccuparti se quell’elenco sembra vuoto. È necessario includere in tale elenco le specifiche delle nuove funzioni, seguendo questo formato specifico:

  • Se crei qualcosa come t(), che restituisce semplicemente la traduzione per una stringa, puoi specificarla come t. Gettext saprà che l’unico argomento della funzione è la stringa da tradurre;

  • Se la funzione ha più di un argomento, è possibile specificare in quale sia la prima stringa e, se necessario, anche la forma plurale. Ad esempio, se la nostra firma della funzione è __('one user', '%d users', $number), la specifica sarebbe __:1,2, il che significa che il primo modulo è il primo argomento e il secondo modulo è il secondo argomento. Se il tuo numero viene invece come primo argomento, la specifica sarebbe __:2,3, indicando che il primo modulo è il secondo argomento e così via.

Dopo aver incluso quelle nuove regole nel .file po, una nuova scansione porterà le nuove stringhe con la stessa facilità di prima.

Rendi multilingue la tua app PHP con Gettext

Gettext è uno strumento molto potente per internazionalizzare il tuo progetto PHP. Al di là della sua flessibilità che consente il supporto per un gran numero di linguaggi umani, il suo supporto per più di 20 linguaggi di programmazione consente di trasferire facilmente la vostra conoscenza di usarlo con PHP ad altri linguaggi come Python, Java, o C#.

Inoltre, Poedit può aiutare a lisciare il percorso tra il codice e le stringhe tradotte, rendendo il processo più semplice e più facile da seguire. Può anche semplificare gli sforzi di traduzione condivisa con la sua integrazione Crowdin.

Quando possibile, considera altre lingue che i tuoi utenti potrebbero parlare. Questo è per lo più importante per i progetti non in inglese: puoi aumentare l’accesso dell’utente se lo rilasci in inglese e nella tua lingua madre.

Naturalmente, non tutti i progetti hanno bisogno di internazionalizzazione, ma è molto più facile iniziare i18n durante l’infanzia di un progetto, anche se non inizialmente necessario, piuttosto che farlo più tardi lungo la strada se successivamente diventa un requisito. E, con strumenti come Gettext e Poedit è più facile che mai.

Related: Introduzione a PHP 7: Cosa c’è di nuovo e cosa è andato

Leave a Reply

Il tuo indirizzo email non sarà pubblicato.