Points de base
de nombreuses entreprises finiront par tourner leurs marchés cibles à l'échelle mondiale. Cet objectif entraînera la nécessité de traduire un site Web d'une entreprise en une ou plusieurs langues. Même si vous ne travaillez pas pour une grande entreprise, vous devrez peut-être lancer de nouveaux services dans votre langue maternelle (en supposant que vous n'êtes pas un orateur anglais natif) pour cibler le marché local et le marché mondial en anglais. En tant que développeurs, il n'est pas de notre responsabilité de traduire du texte, mais de préparer le site Web à prendre en charge la traduction. Dans PHP, la méthode la plus populaire est via GetText. Il s'agit d'une grande approche car elle permet la séparation de la traduction de l'application, permettant ainsi la parallélisation du processus. Le problème est qu'Apache cache les traductions, donc à moins que vous ne puissiez redémarrer le moteur, toute mise à jour du fichier de traduction n'apparaîtra pas. Ce fait est particulièrement ennuyeux si vous travaillez sur un hébergement partagé et que vous n'avez pas de privilèges d'administrateur. Dans cet article, je décrirai ce problème en détail et expliquerai la solution que j'ai trouvée pour éviter ce problème.
Remarque: Si vous n'êtes pas familier avec les concepts de i18n, de traduction et de getText, je vous recommande fortement de lire cette série avant d'explorer cet article plus loin. Il vous donnera des informations plus détaillées que le bref aperçu que vous trouverez ici et vous aidera à mieux comprendre ces sujets.
Paramètres environnementaux
Il existe de nombreuses façons d'utiliser la traduction dans PHP. La façon la plus simple dont je me souvienne est d'avoir un tableau associatif contenant toutes les chaînes traduites, puis d'utiliser les touches pour récupérer la chaîne correcte. Comme vous pouvez le deviner, cette solution n'est pas évolutive et vous devez éviter d'utiliser cette solution à moins que vous ne travailliez sur un très, très petit projet (peut-être pas plus de 5 lignes de code). Pour des traductions sérieuses, nous pouvons utiliser GetText. Cette approche nous permet d'avoir des fichiers différents pour chaque langue cible, ce qui aide à maintenir la séparation entre la logique métier, la couche de présentation et la traduction (que nous pouvons considérer comme un module complémentaire à la couche de présentation). Avec GetText, nous pouvons paralléliser le processus car lorsque nous traitons certaines fonctionnalités du site Web, les traducteurs peuvent toujours utiliser des logiciels tels que PoEdit pour traduire.
Les traductions doivent être stockées dans des chemins avec des structures fixes. Tout d'abord, nous aurons un dossier racine nommé selon vos préférences (par exemple, "langues"). Dans ce document, nous devons créer un dossier pour chaque langue cible, dont le nom doit se conformer à la norme ISO 3166. Par conséquent, les noms valides pour les traductions italiennes peuvent être "it_it" (italien italien), "it_ch" (Suisse italienne), "en_us" (anglais américain), etc. Dans un dossier avec code de langue, nous devons avoir un dossier appelé "LC_MESSAGES", où nous stockons le fichier de traduction.
Poedit analyse le code source du site Web et extrait la chaîne à traduire en fonction d'un ou plusieurs modèles que nous avons définis dans le logiciel. Il enregistre la chaîne dans un seul fichier avec l'extension .po (objet portable), que le logiciel (ou équivalent) compile dans un fichier .mo binaire. Ce dernier est le format qui nous intéresse avec la fonction getText () de PHP. Le fichier .mo est un fichier que nous devons placer dans le répertoire "LC_MESSAGES" que nous avons créé plus tôt.
L'exemple de code à l'aide de getText () est le suivant (le code a été commenté afin que vous puissiez rapidement comprendre sa fonction):
<?php // 包含翻译文件的根文件夹的名称 $translationsPath = 'languages'; // 要翻译到的语言 $language = 'it_IT'; // 翻译文件的名称(在gettext中称为域) $domain = 'audero'; // 指示此会话将使用哪种语言 putenv("LANG=" . $language); setlocale(LC_ALL, $language); // 设置当前域的路径 bindtextdomain($domain, $translationsPath); // 指定字符编码 bind_textdomain_codeset($domain, 'UTF-8'); // 选择域 textdomain($domain); // 调用gettext()函数(它有一个名为_()的别名) echo gettext("HELLO_WORLD"); // 等效于echo _("HELLO_WORLD"); ?>
Après avoir enregistré le code précédent dans la page et le charger dans le navigateur, si getText () peut trouver le fichier de traduction, vous verrez la traduction que vous avez faite à l'écran.
Jusqu'à présent, tout s'est bien passé. La mauvaise nouvelle est qu'une fois la traduction chargée, Apache l'a cachée. Par conséquent, à moins que nous ne puissions redémarrer le moteur, toutes les mises à jour du fichier de traduction ne seront pas affichées. Ceci est particulièrement ennuyeux si nous travaillons sur un hébergement partagé et que nous n'avons pas de privilèges d'administrateur. Comment résoudre ce problème? AUDERO PARTAGE GetText vient à secourir!
Qu'est-ce que AUDERO GetText partagé
AUDERO PARTAGE GetText est une bibliothèque PHP (en fait juste une classe, mais laissez-moi en rêver) qui vous permet de contourner le problème des traductions chargées via la fonction getText () en cours de mise en cache par Apache. Cette bibliothèque adopte une approche simple et efficace, vous utiliserez donc toujours les dernières traductions. AudeRo Shared GetText nécessite PHP 5.3 ou plus car il utilise des espaces de noms et il y a une structure décrite dans la section précédente. Il a deux méthodes principales: UpdateTranslation () et DeleteoldTranslations (). Le premier est le cœur de la bibliothèque et est également le moyen de mettre en œuvre cette technique. Mais quelle est cette technique? Jetons un coup d'œil à son code pour en savoir plus. Pour le bien comprendre, il convient de souligner que le constructeur de la classe accepte le chemin pour stocker la traduction, la langue à traduire et le nom (domaine) du fichier traduit.
<?php // 包含翻译文件的根文件夹的名称 $translationsPath = 'languages'; // 要翻译到的语言 $language = 'it_IT'; // 翻译文件的名称(在gettext中称为域) $domain = 'audero'; // 指示此会话将使用哪种语言 putenv("LANG=" . $language); setlocale(LC_ALL, $language); // 设置当前域的路径 bindtextdomain($domain, $translationsPath); // 指定字符编码 bind_textdomain_codeset($domain, 'UTF-8'); // 选择域 textdomain($domain); // 调用gettext()函数(它有一个名为_()的别名) echo gettext("HELLO_WORLD"); // 等效于echo _("HELLO_WORLD"); ?>
La première chose que cette méthode doit faire est de tester si le fichier de traduction binaire d'origine (fichier .mo) existe. S'il n'existe pas, la méthode lance une exception. Il calcule ensuite le chemin complet du fichier traduit en fonction des paramètres fournis au constructeur et du dernier horodatage modifié du fichier. Après cela, il crée une nouvelle chaîne qui concatenne le domaine d'origine avec le horodatage précédemment calculé. Une fois terminé, voici l'astuce, qui crée une copie en miroir du fichier de traduction. Si un fichier avec un tel nom existe déjà, la classe est assez intelligente pour éviter cette copie. Enfin, il renvoie le nouveau nom qui sera utilisé dans BindTextDomain (), bind_textDomain_codeset () et TextDomain (). En faisant, Apache verra que la traduction est comme si cela n'avait rien à voir avec la traduction originale, évitant ainsi les problèmes de mise en cache. Comme je l'ai dit, simple et efficace!
"Great Aurelio!", Vous pensiez "mais alors mes dossiers gonflent avec ces copies." C'est pourquoi j'ai créé DeleteoldTranslations (). Il supprime toutes les copies miroir du dossier de traduction sélectionné sauf le dernier.
Maintenant que vous avez appris ce qu'est le GetText partagé AudeRo et ce qu'il peut faire pour vous, voyons comment l'obtenir.
Installation de GetText partagée audorde
Vous pouvez obtenir "AudeRo Shared GetText" via Composer, en ajoutant les lignes suivantes à votre composer.json:
/** * 创建翻译文件的镜像副本 * * @return string 创建的翻译文件的名称(在gettext中称为域) * * @throws \Exception 如果找不到翻译文件 */ public function updateTranslation() { if (!self::translationExists()) { throw new \Exception('在给定路径中找不到翻译文件。'); } $originalTranslationPath = $this->getTranslationPath(); $lastAccess = filemtime($originalTranslationPath); $newTranslationPath = str_replace(self::FILE_EXTENSION, $lastAccess . self::FILE_EXTENSION, $originalTranslationPath); if(!file_exists($newTranslationPath)) { copy($originalTranslationPath, $newTranslationPath); } return $this->domain . $lastAccess; }
Ensuite, exécutez la commande d'installation pour analyser et télécharger les dépendances:
"require": { "audero/audero-shared-gettext": "1.0.*" }
Composer installera la bibliothèque dans le répertoire du fournisseur / Aude de votre projet.
Si vous ne souhaitez pas utiliser Composer (vous le devriez vraiment), vous pouvez obtenir le GetText AUDERORAD GetText via GIT en exécutant la commande suivante:
php composer.phar install
La dernière option dont vous disposez est d'accéder au référentiel et de le télécharger en tant qu'archive.
Comment utiliser le GetText partagé AudeRo
Supposons que vous obteniez AUDERO SHARKING GETTexT en utilisant Composer, sur lequel vous pouvez compter sur son Autoloader pour charger la classe dynamiquement. Ensuite, vous devez créer une instance SharedGetTeX et appeler la méthode dont vous avez besoin. Vous pouvez utiliser l'une des méthodes mentionnées ci-dessus comme indiqué dans l'exemple suivant.
git clone https://github.com/AurelioDeRosa/Audero-Shared-Gettext.git
Conclusion
Cet article vous présente audoiro Shared GetText, une bibliothèque simple (eh bien ... classe) qui vous permet de contourner le problème des traductions chargées via la fonction getText () mise en cache par Apache. AudeRo Shared GetText a une compatibilité approfondie car il vous oblige à avoir au moins PHP 5.3 (il est libéré depuis un certain temps) car il utilise des espaces de noms. N'hésitez pas à utiliser les démos et les fichiers contenus dans le référentiel et si vous trouvez un problème, soumettez une demande et une question de traction. J'ai publié le AUDERO Shared GetText sous la licence CC By-NC 4.0, il est donc gratuit.
Avez-vous rencontré ce problème? Comment l'avez-vous résolu? Ne soyez pas timide et postez votre solution dans les commentaires!
(Ce qui suit est la partie FAQ, qui a été pseudo-originale en fonction du texte d'origine et le texte d'origine est gardé à l'esprit)
FAQ (FAQ) sur la gestion de la traduction GetText sur l'hébergement partagé
L'installation de GetText sur un hébergement partagé peut être un peu délicat, car vous n'avez peut-être pas un accès root. Cependant, vous pouvez toujours l'installer via CPanel ou Plesk. Dans CPanel, vous pouvez trouver l'option pour activer GetText sous la section SELECT PHP Version. Dans Plesk, vous pouvez l'activer dans la section "PHP Settings". Si vous ne trouvez pas ces options, vous devrez peut-être contacter votre fournisseur d'hébergement pour obtenir de l'aide.
Votre traduction GetText ne fonctionne pas pour plusieurs raisons. Un problème courant est que le fichier .mo n'est pas compilé correctement ou que le chemin de fichier est incorrect. Assurez-vous que le fichier .mo se trouve dans le répertoire correct et que le chemin du fichier dans le code est correct. Un autre problème pourrait être que le lieu que vous utilisez n'est pas pris en charge par le serveur. Vous pouvez vérifier cela avec la commande LOCALE -A.
La traduction GetText de débogage peut être effectuée en vérifiant les erreurs dans les fichiers .po et .mo. Vous pouvez ouvrir ces fichiers à l'aide d'outils comme PoEdit et vérifier les erreurs de syntaxe. De plus, vous pouvez utiliser la fonction GetText dans votre code pour vérifier si la traduction est récupérée correctement. Si la fonction renvoie la chaîne d'origine, la traduction ne peut être trouvée.
Oui, vous pouvez utiliser GetText dans WordPress. WordPress utilise GetText comme cadre de localisation. Vous pouvez utiliser les fonctions __ () et _e () dans WordPress pour obtenir des traductions. Ces fonctions utilisent GetText en arrière-plan.
Vous pouvez mettre à jour votre traduction GetText en mettant à jour le fichier .po, puis en le compilant dans un fichier .mo. Un fichier .po est un fichier texte brut que vous pouvez ouvrir avec n'importe quel éditeur de texte. Une fois les modifications effectuées, vous pouvez utiliser un outil comme PoEdit pour compiler le fichier .po dans un fichier .mo.
Cette erreur se produit généralement lorsque le package n'est pas disponible dans le référentiel que votre serveur utilise. Vous pouvez essayer de mettre à jour votre liste de packages à l'aide de la commande sudo apt-get upd. Si l'erreur persiste, vous devrez peut-être ajouter un autre référentiel ou installer le package manuellement.
Vous pouvez utiliser GetText en PHP en utilisant la fonction GetText. Cette fonction prend une chaîne comme argument et renvoie la chaîne traduite. Avant de pouvoir utiliser cette fonction, vous devez définir la fonction locale à l'aide de la fonction SETLOCALE et spécifier le chemin d'accès au fichier .mo à l'aide de la fonction BindTextDomain.
Oui, vous pouvez utiliser GetText sur Ubuntu. Vous pouvez l'installer à l'aide de la commande sudo install getText sudo installation. Après l'installation, vous pouvez utiliser la commande getText dans le terminal pour gérer les fichiers .po et .mo.
Vous pouvez créer des fichiers .po et .mo à l'aide d'outils comme Poedit. Cet outil vous permet de créer et de modifier des fichiers .po et de les compiler automatiquement en fichiers .mo. Vous pouvez également créer des fichiers .po manuellement à l'aide d'un éditeur de texte, mais vous avez besoin d'outils comme PoEdit ou MSGFMT pour les compiler dans des fichiers .mo.
.po Le fichier est un fichier texte brut contenant la chaîne d'origine et sa traduction. Ils peuvent être ouverts et modifiés à l'aide de n'importe quel éditeur de texte. D'un autre côté, le fichier .mo est un fichier binaire généré à partir du fichier .po. Ils sont utilisés par GetText pour obtenir des traductions au moment de l'exécution.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!