Traduction

← Le volet web · 33 diapositives · flèches ou clic pour avancer

Traduction - Interfaces versus Contenus
Provenance des traductions variées
Provenance de la traduction des données - CONTENU - FR - EN
Provenance de la traduction d'interface - INTERFACE - EN - FR
Provenance de la traduction de tout - CONTENU - INTERFACE - FR - EN - EN - FR
Provenance de la traduction FR - CONTENU - INTERFACE - FR - FR
Provenance de la traduction EN - CONTENU - INTERFACE - EN - EN
Traduction - Des Interfaces
Que sont les textes d'interface ? - Tout ce quine vient pas de la base de données - Les titres, sous-titres, sous-sous-titres - souvent balises <h1>, <h2>, <h3> - Les textes statiques : mission, message d'accueil, instructions, aides - certains <p> - Les textes des liens : invites à l'action - balise <a> - Les libellés des formulaires et leur sous-titres - balise <label>, balise <legend>,…
Traduction des interfaces : code vue php - <header> - <h1> <?=_('Site des Pokémon')?> </h1> - </header> - <h2> <?=_("Section membre")?> </h2> - <section><h3> <?=_("Inscription d'un membre")?> </h3> - <form> - <fieldset> - <legend> <?=_("Identification")?> </legend> - <div><label> <?=_("Prénom")?> </label><input type="text"/></div> - </fieldset> - </form> - </section>
Traduction des interfaces - http://php.net/manual/en/function.gettext.php - https://poedit.net/ - .pot = fichier texte clé-valeur qui sert de base pour toutes les langues - .po = fichier texte clé-valeur pour une langue - .mo = fichier compilé pour une langue - On conserve les fichiers .po et on déploie les fichiers .mo avec le même nom - locales/fr_CA/LC_MESSAGES/messages.mo -…
Traduction des interfaces - http://php.net/manual/en/function.gettext.php - https://poedit.net/ - .pot = fichier texte clé-valeur qui sert de base pour toutes les langues - .po = fichier texte clé-valeur pour une langue - .mo = fichier compilé pour une langue - On conserve les fichiers .po et on déploie les fichiers .mo avec le même nom - locales/fr_CA/LC_MESSAGES/ messages .mo -…
Traduction des interfaces : linux - $locale = "en_CA.utf8"; // $locale = "en_CA"; - $racine = "/var/www/aubergesdumonde.com/locales/"; - $domaine = " messages "; - putenv('LANG='.$locale); - setlocale(LC_MESSAGES,$locale); - bindtextdomain($domaine,$racine); - textdomain($domaine);
Traduction des interfaces : linux - /locale /en_CA /LC_MESSAGES monsite.po monsite.mo /fr_CA /LC_MESSAGES monsite.po monsite.mo
Traduction des interfaces : windows - $locale = "en_CA"; - $racine = "C:/wamp64/www/traduction/locales/"; - $domaine = "messages"; - putenv('LC_ALL='.$locale); - setlocale(LC_ALL, $locale); - bindtextdomain($domaine,$racine); - textdomain($domaine);
Traduction des interfaces : windows + bug - $locale = "en_CA"; - $racine = "C:/wamp64/www/traduction/locales/"; - $domaine = "messages"; - include "gettext.inc"; - putenv('LC_ALL='.$locale); - T_setlocale(LC_MESSAGES, $locale); - setlocale(LC_ALL,$locale); - bindtextdomain($domaine,'./locales'); - textdomain($domaine);
Traduction des interfaces : windows + bug - $locale = "en_CA"; - $racine = "C:/wamp64/www/traduction/locales/"; - $domaine = "messages"; - include "alternative/POParser.php"; - $parseur = new POParser("locales/$locale/cache"); - $traductions = $parseur->parse("locales/$locale/LC_MESSAGES/messages.po"); - function _($cle) - { - global $traductions; - return isset($traductions[$cle]) ?…
Travail de traduction - Installer et activer le module gettext dans les environnements dev et prod - dev = windows et prod = linux - Transformer les interfaces de vues : appeler la fonction _() pour tous les textes - Générer le fichier .pot de votre site - Traduire des copies de ce fichiers pour chaque langue : les fichiers .po - L'outil génère souvent automatiquement les versions compilées .mo -…
Processus d'installation du module gettext - Sous Windows : - Programmer un appel à la fonction _( ) - Fatal error: Uncaught Error: Call to undefined function _() in C:\Bitnami\wampstack-7.1.13-1\apache2\htdocs\monde-pokemons\src\liste-pokemon.php:84 Stack trace: #0 {main} thrown in C:\Bitnami\wampstack-7.1.13-1\apache2\htdocs\monde-pokemons\src\liste-pokemon.php on line 84 - Installer gettext…
Configurations de la stack web linux - /etc/php/7.0/apache2 /php.ini - /etc/apache2/apache2.conf ou /etc/apache2/httpd.conf - /etc/apache2/sites-available et /etc/apache2/sites-enabled - 000-default.conf (site par défaut) - /etc/apache2/mods-available et /etc/apache2/mods-enabled
Module gettext sous Linux - apt-cache search gettext | grep php - apt-get install php-php-gettext - cd /etc/php/7.0/apache2 / - cat php.ini | grep gettext - jed php.ini (pour décommenter extension=php_gettext.dll)
Traduction - Du Contenu
Que sont les textes de données ? - Tout ce qui vient de la base de données et qui est dynamique - Les noms des produits, des personnages, leur description - On les reconnait à : - Dans le code, on utilise des classes et non des id pour les adresser
Comment organiser la base de données - Exemple : Magasin - table categorie : liste de quelque categories avec les champs - nom - slug - idCategorie - table produit : relation one-to-many avec categorie (une categorie pour plusieurs produits) - idProduit - nom - resume - description - illustration (ne se traduit pas) - idCategorie
La base de données non-traduite - idCategorie - nom - slug - 1 - Plage - plage - 2 - Riviere - riviere - 3 - Piscine - piscine - idProduit - nom - resume - description - illustration - idCategorie - 1 - palme - 1 - 2 - masque - 1 - 3 - serviette - 2
La base de données non-traduite - idCategorie - nom - slug - 1 - Plage - plage - 2 - Riviere - riviere - 3 - Piscine - piscine - idProduit - nom - resume - description - illustration - idCategorie - 1 - palme - 1 - 2 - masque - 1 - 3 - serviette - 2
Comment organiser la base de données ? - 2 possibilités évidentes - dupliquer les champs textes - pas très élégant, brise pas le modèle MLD original, excepté pour le nom des champs - très rapide, les sélect ne changent pas - si une seule langue de traduction, pas un one-to-many de textes - créer des one-to-many pour les textes traduit - très flexible pour ajouter des traductions - élégant - brise…
Duplkiquer les champs texte - idCategorie - nom-fr - slug-fr - nom-en - slug-en - 1 - Plage - plage - Beach - beach - 2 - Riviere - riviere - River - river - 3 - Piscine - piscine - Pool - pool - idProduit - nom-fr - resume-fr - description-fr - nom-en - resume-en - description-en - illustration - idCategorie - 1 - palme - 1 - 2 - masque - 1 - 3 - serviette - 2
Dupliquer les champs texte - Transparent pour le reste du code - renommage dans le SQL : - (dans lequel $locale est 'fr' ou 'en') - class ProduitDAO - { - function lireProduit($id) - { - $SQL_LIRE_PRODUIT = "SELECT nom- $locale as nom, resume-$locale as resume, description-$locale as description, illustration FROM produit WHERE idProduit = $id"; // TODO $id doit etre en requete preparee - } - }
Duplkiquer les champs texte - idCategorie - nom-fr - slug-fr - nom-en - slug-en - 1 - Plage - plage - Beach - beach - 2 - Riviere - riviere - River - river - 3 - Piscine - piscine - Pool - pool - idProduit - nom-fr - resume-fr - description-fr - nom-en - resume-en - description-en - illustration - idCategorie - 1 - palme - 1 - 2 - masque - 1 - 3 - serviette - 2 - SELECT nom-fr as nom, resume-fr…
Créer une entrée dérivée par langue - idCategorie - illustration - 1 - 2 - 3 - idCategorie - locale - nom - slug - 1 - fr - Plage - plage - 1 - en - Beach - beach - 2 - fr - Rivière - riviere - 2 - en - River - river - 3 - fr - Piscine - piscine - 3 - en - Pool - pool - Pour chaque rangée de la table principale, on a N rangée dans la table des textes, avec N est égal au nombre de langues. Dans…
Créer une entrée dérivée par langue - Nécessite une jointure - class CategorieDAO - { - function lireCategorie($id) - { - // TODO $id doit etre en requete preparee - $SQL_LIRE_PRODUIT = "SELECT * FROM categorie LEFT JOIN categorieTexte ON categorieTexte.idCategorie = categorie.idCategorie AND categorieTexte.locale = '$locale' WHERE idCategorie = $id"; - } - }
Créer une entrée dérivée par langue - idCategorie - illustration - 1 - 2 - 3 - idCategorie - locale - nom - slug - 1 - fr - Plage - plage - 1 - en - Beach - beach - 2 - fr - Rivière - riviere - 2 - en - River - river - 3 - fr - Piscine - piscine - 3 - en - Pool - pool - SELECT * FROM categorie - LEFT JOIN categorieTexte ON categorieTexte.idCategorie = categorie.idCategorie AND…