Comment construire une Application Multilingue: Une Démo Avec PHP et Gettext

Que vous construisiez un site Web ou une application Web à part entière, la rendre accessible à un public plus large nécessite souvent qu’elle soit disponible dans différentes langues et lieux.

Les différences fondamentales entre la plupart des langues humaines rendent cela tout sauf facile. Les différences dans les règles de grammaire, les nuances de langue, les formats de date, etc. se combinent pour faire de la localisation un défi unique et formidable.

Considérons cet exemple simple.

Les règles de pluralisation en anglais sont assez simples: vous pouvez avoir une forme singulière d’un mot ou une forme plurielle d’un mot.

Dans d’autres langues, cependant, comme les langues slaves, il existe deux formes plurielles en plus du singulier. Vous pouvez même trouver des langues avec un total de quatre, cinq ou six formes plurielles, comme en slovène, en irlandais ou en arabe.

La façon dont votre code est organisé et la conception de vos composants et de votre interface jouent un rôle important pour déterminer la facilité avec laquelle vous pouvez localiser votre application.

L’internationalisation (i18n) de votre base de code permet de s’assurer qu’elle peut être adaptée à différentes langues ou régions avec une relative facilité. L’internationalisation se fait généralement une fois, de préférence au début du projet pour éviter d’avoir besoin d’énormes changements dans le code source en cours de route.

 Comment créer une application multilingue : Une démo avec PHP et Gettext

Une fois votre base de code internationalisée, la localisation (l10n) devient une question de traduction du contenu de votre application dans une langue / locale spécifique.

La localisation doit être effectuée chaque fois qu’une nouvelle langue ou région doit être prise en charge. De plus, chaque fois qu’une partie de l’interface (contenant du texte) est mise à jour, un nouveau contenu devient disponible – qui doit ensuite être localisé (c’est-à-dire traduit) dans toutes les locales prises en charge.

Dans cet article, nous allons apprendre à internationaliser et à localiser des logiciels écrits en PHP. Nous passerons en revue les différentes options de mise en œuvre et les différents outils mis à notre disposition pour faciliter le processus.

Outils d’internationalisation

Le moyen le plus simple d’internationaliser un logiciel PHP consiste à utiliser des fichiers tableau. Les tableaux seront remplis de chaînes traduites, qui peuvent ensuite être recherchées à partir de modèles:

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

Ce n’est cependant pas un moyen recommandé pour les projets sérieux, car cela posera certainement des problèmes de maintenance sur la route. Certains problèmes peuvent même apparaître au tout début, comme le manque de support pour l’interpolation variable ou la pluralisation des noms, etc.

L’un des outils les plus classiques (souvent pris comme référence pour i18n et l10n) est un outil Unix appelé Gettext.

Bien que datant de 1995, c’est toujours un outil complet de traduction de logiciels qui est également facile à utiliser. Bien qu’il soit assez facile de commencer, il dispose toujours d’outils de support puissants.

Gettext est ce que nous utiliserons dans cet article. Nous présenterons une excellente application GRAPHIQUE qui peut être utilisée pour mettre à jour facilement vos fichiers source l10n, évitant ainsi la nécessité de traiter la ligne de commande.

Bibliothèques Pour Faciliter Les Choses

 Principaux frameworks web PHP et bibliothèques prenant en charge Gettext

Il existe de grands frameworks et bibliothèques Web PHP qui prennent en charge Gettext et d’autres implémentations d’i18n. Certains sont plus faciles à installer que d’autres, ou arborent des fonctionnalités supplémentaires ou prennent en charge différents formats de fichiers i18n. Bien que dans ce document, nous nous concentrons sur les outils fournis avec le noyau PHP, voici une liste de quelques autres qui méritent d’être mentionnés:

  • oscarotero/Gettext : Prise en charge de Gettext avec une interface orientée objet; comprend des fonctions d’assistance améliorées, des extracteurs puissants pour plusieurs formats de fichiers (certains d’entre eux ne sont pas pris en charge nativement par la commande gettext). Peut également exporter vers des formats au-delà des fichiers .mo /.po, ce qui peut être utile si vous devez intégrer vos fichiers de traduction dans d’autres parties du système, comme une interface JavaScript.

  • symfony / translation: Prend en charge de nombreux formats différents, mais recommande d’utiliser des XLIFF verbeux. N’inclut pas de fonctions d’assistance ni d’extracteur intégré, mais prend en charge les espaces réservés en utilisant strtr() en interne.

  • zend / i18n: Prend en charge les fichiers array et INI, ou les formats Gettext. Implémente une couche de mise en cache pour éviter d’avoir à lire le système de fichiers à chaque fois. Comprend également des assistants d’affichage, des filtres d’entrée et des validateurs tenant compte des paramètres régionaux. Cependant, il n’a pas d’extracteur de message.

D’autres frameworks incluent également des modules i18n, mais ceux-ci ne sont pas disponibles en dehors de leurs bases de code:

  • Laravel: Prend en charge les fichiers de tableau de base; n’a pas d’extracteur automatique mais inclut un assistant @lang pour les fichiers de modèle.

  • Yii: Prend en charge la traduction de tableaux, de Gettext et de bases de données, et inclut un extracteur de messages. Soutenu par l’extension Intl, disponible depuis PHP 5.3, et basé sur le projet ICU. Cela permet à Yii d’exécuter des remplacements puissants, tels que l’orthographe des nombres, la mise en forme des dates, des heures, des intervalles, de la devise et des ordinaux.

Si vous décidez d’opter pour l’une des bibliothèques qui ne fournissent pas d’extracteurs, vous voudrez peut-être utiliser les formats Gettext, vous pouvez donc utiliser la chaîne d’outils Gettext d’origine (y compris Poedit) comme décrit dans le reste du chapitre.

Installation de Gettext

Vous devrez peut-être installer Gettext et la bibliothèque PHP associée en utilisant votre gestionnaire de paquets, comme apt-get ou yum. Une fois installé, activez-le en ajoutant extension=gettext.so (Linux/Unix) ou extension=php_gettext.dll (Windows) à votre fichier php.ini.

Ici, nous utiliserons également Poedit pour créer des fichiers de traduction. Vous le trouverez probablement dans le gestionnaire de paquets de votre système; il est disponible pour Unix, Mac et Windows et peut également être téléchargé gratuitement sur son site Web.

Types de fichiers Gettext

Il existe trois types de fichiers que vous traitez habituellement lorsque vous travaillez avec Gettext.

Les principaux sont les fichiers PO (Objet portable) et MO (Objet Machine), le premier étant une liste d' »objets traduits » lisibles et le second étant le binaire correspondant (à interpréter par Gettext lors de la localisation). Il existe également un fichier POT (modèle PO), qui contient simplement toutes les clés existantes de vos fichiers source, et peut être utilisé comme guide pour générer et mettre à jour tous les fichiers PO.

Les fichiers modèles ne sont pas obligatoires; selon l’outil que vous utilisez pour faire l10n, vous serez très bien avec uniquement des fichiers PO / MO. Vous aurez une paire de fichiers PO/MO par langue et région, mais un seul POT par domaine.

Séparation des domaines

Dans certains cas, dans les grands projets, vous devrez peut-être séparer les traductions lorsque les mêmes mots véhiculent une signification différente dans différents contextes.

Dans ces cas, vous devrez les diviser en différents « domaines », qui sont essentiellement des groupes nommés de fichiers POT / PO / MO, où le nom de fichier est ledit domaine de traduction.

Les projets de petite et moyenne taille utilisent généralement, pour simplifier, un seul domaine; son nom est arbitraire, mais nous utiliserons « main » pour nos échantillons de code.

Dans les projets Symfony, par exemple, les domaines sont utilisés pour séparer la traduction des messages de validation.

Code locale

Une locale est simplement un code qui identifie une version d’une langue. Il est défini selon les spécifications ISO 639-1 et ISO 3166-1 alpha-2 : deux lettres minuscules pour la langue, éventuellement suivies d’un trait de soulignement et de deux lettres majuscules identifiant le code pays ou régional.

Pour les langues rares, trois lettres sont utilisées.

Pour certains locuteurs, la partie pays peut sembler redondante. En fait, certaines langues ont des dialectes dans différents pays, comme l’allemand autrichien (de_AT) ou le portugais brésilien (pt_BR). La deuxième partie est utilisée pour faire la distinction entre ces dialectes – lorsqu’elle n’est pas présente, elle est considérée comme une version « générique » ou « hybride » de la langue.

Structure du répertoire

Pour utiliser Gettext, nous devrons adhérer à une structure spécifique de dossiers.

Tout d’abord, vous devez sélectionner une racine arbitraire pour vos fichiers l10n dans votre référentiel source. À l’intérieur, vous aurez un dossier pour chaque locale nécessaire et un dossier « LC_MESSAGES » fixe qui contiendra toutes vos paires PO / MO.

 Dossier LC_MESSAGES

Formes plurielles

Comme nous l’avons dit en introduction, différentes langues peuvent avoir des règles de pluralisation différentes. Cependant, Gettext nous évite ce problème.

Lors de la création d’un nouveau.fichier po, vous devrez déclarer les règles de pluralisation pour cette langue, et les pièces traduites sensibles au pluriel auront une forme différente pour chacune de ces règles.

Lorsque vous appelez Gettext dans le code, vous devrez spécifier un numéro lié à la phrase (par exemple pour la phrase « Vous avez n messages. », vous devrez spécifier la valeur de n), et cela déterminera la forme correcte à utiliser – même en utilisant la substitution de chaîne si nécessaire.

Les règles plurielles sont composées du nombre de règles nécessaires avec un test booléen pour chaque règle (le test pour au plus une règle peut être omis). Par exemple:

  • Japonais : nplurals=1; plural=0; – une règle : il n’y a pas de formes plurielles

  • Français: nplurals=2; plural=(n != 1); – deux règles: utilisez la forme plurielle uniquement lorsque n n’est pas 1, sinon utilisez la forme singulière.

  • Portugais brésilien: nplurals=2; plural=(n > 1); – deux règles, utilisez la forme plurielle uniquement lorsque n est supérieur à 1, sinon utilisez la forme singulière.

Pour une explication plus approfondie, un didacticiel LingoHub informatif est disponible en ligne.

Gettext déterminera la règle à utiliser en fonction du nombre fourni et utilisera la version localisée correcte de la chaîne. Pour les chaînes où la pluralisation doit être gérée, vous devrez inclure dans le.po dépose une phrase différente pour chaque règle de pluriel définie.

Exemple d’implémentation

Après toute cette théorie, soyons un peu pratiques. Voici un extrait d’un.fichier po (ne vous inquiétez pas encore trop de la syntaxe, mais obtenez simplement une idée du contenu global):

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 première section fonctionne comme un en-tête, les msgid et msgstr étant vides.

Il décrit l’encodage du fichier, les formes plurielles et quelques autres choses. La deuxième section traduit une chaîne simple de l’anglais au portugais brésilien, et la troisième fait de même, mais exploite le remplacement de la chaîne à partir de sprintf, permettant à la traduction de contenir le nom d’utilisateur et la date de visite.

La dernière section est un échantillon de formes de pluralisation, affichant la version au singulier et au pluriel comme msgid en anglais et leurs traductions correspondantes comme msgstr 0 et 1 (suivant le nombre donné par la règle du pluriel).

Là, le remplacement de chaîne est également utilisé, de sorte que le nombre peut être vu directement dans la phrase, en utilisant %d. Les formes plurielles ont toujours deux msgid (singulier et pluriel), il est donc conseillé de ne pas utiliser une langue complexe comme source de traduction.

Clés de localisation

Comme vous l’avez peut-être remarqué, nous utilisons la phrase anglaise réelle comme identifiant source. Que msgid est le même utilisé tout au long de votre.les fichiers po, ce qui signifie que les autres langues auront le même format et les mêmes champs msgid mais les lignes traduites msgstr.

En parlant de clés de traduction, il existe ici deux approches « philosophiques » standard:

1. msgstr en tant que phrase réelle

Les principaux avantages de cette approche sont:

  • S’il y a des parties du logiciel non traduites dans une langue donnée, la clé affichée conservera toujours une certaine signification. Par exemple, si vous savez traduire de l’anglais vers l’espagnol mais que vous avez besoin d’aide pour traduire en français, vous pouvez publier la nouvelle page avec des phrases en français manquantes, et des parties du site Web seraient affichées en anglais à la place.

  • Il est beaucoup plus facile pour le traducteur de comprendre ce qui se passe et de faire une traduction correcte basée sur le msgid.

  • Il vous donne l10n « gratuit » pour une langue – celle source.

D’un autre côté, le principal inconvénient est que, si vous devez modifier le texte réel, vous devez remplacer le même msgid dans plusieurs fichiers de langue.

2. msgstr en tant que clé unique et structurée

, Cela décrirait le rôle de la phrase dans l’application de manière structurée, y compris le modèle ou la partie où se trouve la chaîne au lieu de son contenu.

C’est un excellent moyen d’organiser le code, en séparant le contenu du texte de la logique du modèle. Cependant, cela pourrait poser des problèmes au traducteur qui manquerait le contexte.

Un fichier de langue source serait nécessaire comme base pour d’autres traductions. Par exemple, le développeur aurait idéalement un « en.fichier po, que les traducteurs liraient pour comprendre dans quoi écrire  » fr.po ».

Les traductions manquantes afficheraient des clés sans signification à l’écran (« top_menu.bienvenue « au lieu de » Bonjour là, Utilisateur! » sur ladite page française non traduite).

C’est bien car cela forcerait la traduction à être terminée avant la publication – mais mauvais car les problèmes de traduction seraient vraiment terribles dans l’interface. Certaines bibliothèques, cependant, incluent une option pour spécifier un langage donné comme « repli », ayant un comportement similaire à celui de l’autre approche.

Le manuel Gettext privilégie la première approche car, en général, il est plus facile pour les traducteurs et les utilisateurs en cas de problème. C’est l’approche que nous utiliserons également ici.

Il convient cependant de noter que la documentation Symfony privilégie la traduction basée sur des mots clés, pour permettre des modifications indépendantes de toutes les traductions sans affecter également les modèles.

Utilisation quotidienne

Dans une application commune, vous utiliseriez certaines fonctions Gettext lors de l’écriture de texte statique dans vos pages.

Ces phrases apparaîtraient alors dans.les fichiers po sont traduits, compilés en fichiers .mo, puis utilisés par Gettext lors du rendu de l’interface réelle. Étant donné cela, attachons ensemble ce dont nous avons discuté jusqu’à présent dans un exemple étape par étape:

1. Un exemple de fichier de modèle, comprenant différents appels 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() traduit simplement un msgid dans son msgstr correspondant pour une langue donnée. Il y a aussi la fonction de raccourci _() qui fonctionne de la même manière

  • ngettext() fait la même chose mais avec des règles plurielles

  • Il existe également dgettext() et dngettext(), qui vous permettent de remplacer le domaine pour un seul appel (plus d’informations sur la configuration du domaine dans l’exemple suivant)

2. Un exemple de fichier de configuration (i18n_setup.php comme utilisé ci-dessus), la sélection des paramètres régionaux corrects et la configuration de Gettext

En utilisant Gettext implique un peu de code standard, mais il s’agit principalement de configurer le répertoire des paramètres régionaux et de choisir les paramètres appropriés (une locale et un domaine).

<?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. Préparation de la traduction pour la première exécution

L’un des grands avantages de Gettext par rapport aux paquets de framework i18n personnalisés est son format de fichier étendu et puissant.

Vous pensez peut-être « Oh mec, c’est assez difficile à comprendre et à éditer à la main, un tableau simple serait plus facile! »Ne vous y trompez pas, des applications comme Poedit sont là pour vous aider – beaucoup. Vous pouvez obtenir le programme sur leur site Web, il est gratuit et disponible pour toutes les plateformes. C’est un outil assez facile à utiliser, et très puissant en même temps – en utilisant toutes les fonctionnalités disponibles de Gettext. Nous allons travailler ici avec la dernière version, Poedit 1.8.

 Voir à l'intérieur de Poedit.

Lors de la première exécution, vous devez sélectionner « Fichier > Nouveau New » dans le menu. On vous demandera la langue; sélectionnez / filtrez la langue vers laquelle vous souhaitez traduire, ou utilisez le format mentionné précédemment, tel que en_US ou pt_BR.

 Sélection de la langue.

Maintenant, enregistrez le fichier – en utilisant la structure de répertoire que nous avons également mentionnée. Ensuite, vous devez cliquer sur « Extraire des sources », et ici vous configurerez divers paramètres pour les tâches d’extraction et de traduction. Vous pourrez trouver toutes celles-ci plus tard via les propriétés du « Catalogue > »:

  • Chemins sources: Incluez tous les dossiers du projet où gettext() (et les frères et sœurs) sont appelés – il s’agit généralement de vos dossiers modèles /vues. C’est le seul paramètre obligatoire.

  • Propriétés de traduction:

    • Nom et version du projet, Adresse e-mail de l’équipe et de l’équipe: Informations utiles qui se trouvent dans le.en-tête du fichier po.
    • Formes plurielles: Ce sont les règles que nous avons mentionnées précédemment. Vous pouvez le laisser avec l’option par défaut la plupart du temps, car Poedit inclut déjà une base de données pratique de règles plurielles pour de nombreuses langues.
    • Jeux de caractères : UTF-8, de préférence.
    • Jeu de caractères de code source: Le jeu de caractères utilisé par votre base de code – probablement aussi UTF-8, non?
  • Mots-clés source: Le logiciel sous-jacent sait à quoi ressemblent gettext() et les appels de fonctions similaires dans plusieurs langages de programmation, mais vous pouvez aussi créer vos propres fonctions de traduction. Ce sera ici que vous ajouterez ces autres méthodes. Cela sera discuté plus loin dans la section « Conseils ».

Après avoir défini ces propriétés, Poedit effectuera une analyse de vos fichiers source pour trouver tous les appels de localisation. Après chaque analyse, Poedit affichera un résumé de ce qui a été trouvé et de ce qui a été supprimé des fichiers source. Les nouvelles entrées seront vides dans la table de traduction, vous permettant d’entrer les versions localisées de ces chaînes. Enregistrez-le et un fichier .mo sera (re)compilé dans le même dossier et, presto!, votre projet est internationalisé !

 Projet internationalisé.

Poedit peut également suggérer des traductions courantes à partir du Web et de fichiers précédents. C’est pratique, il vous suffit donc de vérifier s’ils ont du sens et de les accepter. Si vous n’êtes pas sûr d’une traduction, vous pouvez la marquer comme floue et elle sera affichée en jaune. Les entrées bleues sont celles qui n’ont pas de traduction.

4. Traduire des chaînes

Comme vous l’avez peut-être remarqué, il existe deux principaux types de chaînes localisées: les chaînes simples et celles avec des formes plurielles.

Les simples n’ont que deux cases: source et chaîne localisée. La chaîne source ne peut pas être modifiée, car Gettext / Poedit n’inclut pas la possibilité de modifier vos fichiers source; vous devrez plutôt changer la source elle-même et réanalyser les fichiers. (Conseil: Si vous cliquez avec le bouton droit sur une ligne de traduction, un indice apparaîtra avec les fichiers source et les lignes où cette chaîne est utilisée.)

Les chaînes de formes plurielles comprennent deux cases pour afficher les deux chaînes de sources et des onglets pour que vous puissiez configurer les différentes formes finales.

 Configuration des formulaires finaux.

Exemple d’une chaîne avec une forme plurielle sur Poedit, montrant un onglet de traduction pour chacun.

Chaque fois que vous modifiez vos fichiers de code source et que vous devez mettre à jour les traductions, appuyez simplement sur Actualiser et Poedit analysera à nouveau le code, supprimant les entrées inexistantes, fusionnant celles qui ont changé et en ajoutant de nouvelles.

Poedit peut également essayer de deviner certaines traductions, en fonction d’autres que vous avez faites. Ces suppositions et les entrées modifiées recevront un marqueur « Flou », indiquant qu’elles doivent être revues, affiché en jaune dans la liste.

C’est également utile si vous avez une équipe de traduction et que quelqu’un essaie d’écrire quelque chose dont il n’est pas sûr: il suffit de le marquer flou et quelqu’un d’autre le révisera plus tard.

Enfin, il est conseillé de laisser « View > Entrées non traduites en premier » marqué, car cela vous aidera à éviter d’oublier les entrées. À partir de ce menu, vous pouvez également ouvrir des parties de l’interface utilisateur qui vous permettent de laisser des informations contextuelles aux traducteurs si nécessaire.

Conseils & Astuces

Les serveurs Web peuvent finir par mettre en cache vos fichiers .mo.

Si vous utilisez PHP en tant que module sur Apache (mod_php), vous pourriez rencontrer des problèmes avec la mise en cache du fichier .mo. Cela arrive la première fois qu’il est lu, puis, pour le mettre à jour, vous devrez peut-être redémarrer le serveur.

Sur Nginx et PHP5, il ne faut généralement que quelques actualisations de page pour actualiser le cache de traduction, et sur PHP7, cela est rarement nécessaire.Les bibliothèques

fournissent des fonctions d’assistance pour garder le code de localisation court.

Comme beaucoup de gens le préfèrent, il est plus facile d’utiliser _() au lieu de gettext(). De nombreuses bibliothèques i18n personnalisées à partir de frameworks utilisent également quelque chose de similaire à t() pour raccourcir le code traduit. Cependant, c’est la seule fonction qui arbore un raccourci.

Vous voudrez peut-être en ajouter d’autres dans votre projet, tels que __() ou _n() pour ngettext(), ou peut-être une fantaisie _r() qui rejoindrait les appels gettext() et sprintf(). D’autres bibliothèques, telles que Gettext d’oscarotero, fournissent également des fonctions d’assistance comme celles-ci.

Dans ces cas, vous devrez indiquer à l’utilitaire Gettext comment extraire les chaînes de ces nouvelles fonctions. N’ayez pas peur, c’est très facile. C’est juste un champ dans le.fichier po ou un écran de paramètres dans Poedit (dans l’éditeur, cette option se trouve dans « Catalog > Properties > Sources keywords »).

Rappelez-vous: Gettext connaît déjà les fonctions par défaut pour de nombreuses langues, alors ne vous inquiétez pas si cette liste semble vide. Vous devez inclure dans cette liste les spécifications des nouvelles fonctions, en suivant ce format spécifique:

  • Si vous créez quelque chose comme t(), qui renvoie simplement la traduction d’une chaîne, vous pouvez la spécifier comme t. Gettext saura que le seul argument de fonction est la chaîne à traduire;

  • Si la fonction a plus d’un argument, vous pouvez spécifier dans lequel se trouve la première chaîne et, si nécessaire, la forme plurielle. Par exemple, si notre signature de fonction est __('one user', '%d users', $number), la spécification serait __:1,2, ce qui signifie que la première forme est le premier argument et la deuxième forme est le deuxième argument. Si votre nombre vient comme premier argument à la place, la spécification serait __:2,3, indiquant que la première forme est le deuxième argument, et ainsi de suite.

Après avoir inclus ces nouvelles règles dans le.fichier po, une nouvelle analyse apportera vos nouvelles chaînes aussi facilement qu’auparavant.

Rendez votre application PHP multilingue Avec Gettext

Gettext est un outil très puissant pour internationaliser votre projet PHP. Au-delà de sa flexibilité qui permet de prendre en charge un grand nombre de langages humains, sa prise en charge de plus de 20 langages de programmation vous permet de transférer facilement vos connaissances de son utilisation avec PHP vers d’autres langages comme Python, Java ou C#.

De plus, Poedit peut aider à lisser le chemin entre le code et les chaînes traduites, rendant le processus plus simple et plus facile à suivre. Il peut également rationaliser les efforts de traduction partagée avec son intégration Crowdin.

Dans la mesure du possible, envisagez d’autres langues que vos utilisateurs pourraient parler. Ceci est surtout important pour les projets non-anglais: Vous pouvez améliorer votre accès utilisateur si vous le publiez en anglais ainsi que dans votre langue maternelle.

Bien sûr, tous les projets n’ont pas besoin d’internationalisation, mais il est beaucoup plus facile de démarrer i18n pendant les balbutiements d’un projet, même s’il n’est pas nécessaire au départ, que de le faire plus tard si cela devenait par la suite une exigence. Et, avec des outils comme Gettext et Poedit, c’est plus facile que jamais.

Connexe: Introduction À PHP 7: Quoi De Neuf Et Ce Qui A Disparu

Leave a Reply

Votre adresse e-mail ne sera pas publiée.