Comment transformeriez-vous une application Web préexistante en une application multilingue?

StackOverflow https://stackoverflow.com/questions/156911

Question

Je vais travailler sur un projet dans lequel une application Web assez volumineuse doit être modifiée pour gérer plusieurs langues. La chose fonctionne avec un code PHP fait à la main, mais c'est assez propre.

Je me demandais quelle serait la meilleure façon de le faire?

  1. Créer quelque chose par moi-même, essayer de m'adapter à l'architecture réelle.

  2. Réécrivez une bonne partie de celle-ci en utilisant un framework (par exemple, Symfony) qui gérera i18n pour moi?

Pour l'option 1, où dois-je stocker les données i18n? * .po, xliff, pure DB?

J'ai envisagé une alternative: utiliser Symfony uniquement pour la traduction, mais configurer le contrôleur pour charger le site Web tel qu'il est déjà. Rapide, mais sale. D’autre part, cela nous permet d’apporter les modifications suivantes en évoluant lentement vers la version complète de Symfony: ce site Web est vraiment un bon candidat pour cela.

Mais il existe peut-être des moteurs de traduction autonomes qui feraient mieux le travail que tout un framework Web. C'est un peu comme utiliser un bazooka pour tuer une mouche ...

Était-ce utile?

La solution

Il existe un certain nombre de moyens pour résoudre ce problème. Aucun d’entre eux "de la meilleure façon" et tous avec des problèmes à court terme ou à long terme. La toute première chose à dire est que les sites multilingues ne sont pas faciles, les traducteurs et les personnes adorables, mais il est difficile de travailler avec et la plupart des programmeurs considèrent le problème comme un problème technique. Il existe également une autre dimension, en dehors du champ de cette réponse, que vous traduisiez ou localisiez. Cela implique de regarder les mœurs culturelles du public cible, puis d'adapter le langage, le style, la mise en page, la couleur, la police de caractères, etc. à cette culture. Enfin, n'utilisez pas la traduction automatique, MT, que ce soit pour des problèmes graves ou nécessitant une grande précision. Lors de l’acquisition de traducteurs, assurez-vous qu’ils traduisent d’une langue étrangère vers leur langue maternelle, ce qui signifie qu’ils comprennent toutes les nuances de la langue cible.

D'accord. Solutions. Si vous ne voulez pas réécrire le site, clonez simplement le site que vous avez et traduisez les copies dans la langue cible. En supposant que la base de code soit stable, vous pouvez utiliser un VCS pour gérer les modifications de code. Vous pouvez modifier certaines parties du site pour les adapter à la langue cible. Par exemple, le texte français est en moyenne 30% plus volumineux que le texte anglais équivalent. Ainsi, si vous utilisez un seul site, vous rencontrerez peut-être des problèmes de formatage et devrez échanger vos données. fichier css différent en fonction de la langue. Cela peut sembler une façon maladroite de le faire, mais dans combien de temps les sites vont-ils exister? Les frais de gestion liés à cette méthode pourraient bien être inférieurs à ceux d’autres options.

Deuxième façon sans reconstruire. Remplacez tout le contenu du site actuel par des balises, puis placez la langue différente dans des tables de fichiers ou de bases de données, recherchez la langue souhaitée par l'utilisateur (avez-vous des utilisateurs enregistrés qui peuvent faire une préférence ou voulez-vous obtenir la balise de langue du navigateur? il s’agira d’URL point-com point-fr, point-d qui fera le choix) et remplacera ensuite les balises par la langue cible. Ensuite, vous devez traiter séparément les problèmes de dimensionnement et d’image. Cette solution est effective lorsque des frameworks tels que Symfony et Zend doivent implémenter l10n.

Ensuite, vous pouvez reconstruire avec un framework ou avec gettext et éventuellement avoir une solution plus propre, mais souvenez-vous que les frameworks ont été conçus pour résoudre d'autres problèmes, pas de traduction et que le composant de traduction est entré dans le framework comme solution partielle et non comme solution complète.

Le gros problème avec toutes les solutions est la maintenance en cours. Parce que vous avez non seulement une base de code, mais également plusieurs bases de langue à gérer. À moins que vous ne trouviez une solution vraiment intelligente et efficace, la tâche en cours sera difficile.

Autres conseils

Travailler avec les fichiers de langues.

  1. Remplacez chaque chaîne de texte par une variable
  2. Créez un fichier de langue par langue et définissez-y chaque variable avec le texte correspondant. (french.inc, dutch.inc ...)
  3. Incluez le bon fichier dans chaque page.

Cela concerne les petits sites.

Si vous grossissez, remplacez les fichiers par une base de données. :)

Il est important de noter que la traduction nécessite deux étapes:

  1. Internationalisation: c’est-à-dire permettre à votre site de gérer plusieurs langues
  2. Localisation: cela inclut la traduction de vos textes (obtenus à l'étape 1) dans chaque langue que vous envisagez de prendre en charge

En savoir plus sur cela dans Wikipedia .

L’étape 1 vous obligerait à prendre en compte le fait que certaines langues sont écrites de droite à gauche (RTL) et que des caractères non européens tels que le japonais ou le chinois sont utilisés. Si vous ne prévoyez pas de gérer ces langues et caractères, la procédure sera peut-être plus simple.

Pour ce type de situation, je préférerais avoir un fichier de langue (autant de fichiers de langue que de langues que je prévois de prendre en charge, en les nommant langcode.php comme dans en.php ou fr.php ) avec un tableau associatif contenant tous les textes utilisés sur le site. La procédure se déroulerait comme suit:

  1. Analysez votre site pour chaque texte à localiser
  2. Pour chaque page / section, je créerais un tableau $ lang ['nom de section'] []
  3. Pour chaque texte, je créerais une entrée $ lang ['nom de section'] ['nom de texte']
  4. Je créerais une classe Lang.php qui recevrait un paramètre lang lors de l'instanciation, mais qui aurait une valeur par défaut si aucun lang n'est reçu (cette méthode charge langcode.php en fonction du paramètre ou une valeur par défaut en fonction de la langue de votre choix)
  5. La classe aurait une méthode setPage () qui recevrait la page / section à afficher
  6. La classe aurait une méthode show () qui recevrait le texte à afficher ( show () serait appelée autant de fois que des textes étaient affichés dans un page donnée ... show () étant une sorte de wrapper pour echo $ lang ['mypage'] ['mytext'] )

De cette façon, vous pouvez utiliser autant de langues que vous le souhaitez, très facilement. Vous pouvez même avoir un administrateur de langue dans lequel vous ouvrez votre page de langue de base (vous venez en fait de lire les tableaux de manière récursive et de les afficher sous forme de zones de texte) et vous pouvez ensuite "Enregistrer sous ...". une autre langue.

J'utilise une approche similaire dans mon site . Il n’ya qu’une seule page, mais sites de plusieurs pages avec cette idée.

Si vous avez un contenu soumis par l'utilisateur ou un système de gestion de contenu plutôt compliqué, l'histoire sera différente. Vous pouvez rechercher des frameworks compatibles i18n (Drupal me vient à l’esprit).

Vous pouvez consulter Zend_Translate , qui est assez complet, bien documenté et la qualité globale du code est excellente. Il vous permet également d’utiliser une API unifiée pour gettext, csv, db, fichier ini, array ou tout ce que vous allez sauvegarder en convertissant vos chaînes traduites.

Regardez aussi / regardez ce fil de discussion: Quels sont les bons outils / frameworks pour i18n d’une base de code php? . Cela ressemble à votre question.

Si c'est un support de caractères multi-octets, alors il pourrait être intéressant de vérifier les fonctions de chaîne multi-octets en PHP:

http://uk.php.net/manual/fr/book .mbstring.php

Ceci gérera mieux les caractères multi-octets.

J'utilise les paramètres hl et gettext qui combinent déjà les traductions du moteur avec leur propre fichier .po, ce qui fait apparaître de nouvelles traductions et langues lorsque le moteur ou mon django / gae exemple ajoute:

{% get_current_language as LANGUAGE_CODE %}{{ LANGUAGE_CODE }}{% get_available_languages as LANGUAGES %}{% for LANGUAGE in LANGUAGES %}{% ifnotequal LANGUAGE_CODE LANGUAGE.0 %}{{ LANGUAGE.0 }}{% endifnotequal %}{% endfor %}

Donc, éviter les doublons et utiliser pleinement les traductions déjà laissées ici laisse apparaître les noms de mois arabe manquants, par exemple, à apparaître directement lorsque l’équipe du moteur ajoute ou application

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top