Plugin « Traduction » V2

Plugin permettant la gestion des traductions multilangues coté site public

Après avoir réalisé plusieurs sites multilingues (et pas mal galéré dessus), je me suis penché sur un problème majeur ... la gestion du multilinguisme coté site public.

La question était la suivante : comment gérer les fichiers de langue (local_#LANG) sans avoir à les faire « à la main » au fur et à mesure de l’avancée de la programmation du site et permettre de « sectoriser » les mots et petits textes à traduire afin de ne pas avoir, au bout de quelques jours, des listes imbuvables de plusieurs dizaines (voire même centaines) de mots dans lesquelles on ne peut s’y retrouver !!!

J’ai donc créé ce petit plugin qui vous permet de pouvoir gérer cela très facilement.

Si vous avez déjà installer la V1 du plugin, la mise à jour se fait automatiquement et sans douleur


-  ce plugin dans sa version actuelle ne fonctionne pas avec spip 2.x.x
-  je lui ai apporté quelques améliorations pour spip 2.x.x
-  vous le trouverez ici -> Items & Traductions

Effectuer la mise à jour :
-  Désactivez le plugin dans votre interface
-  Remplacez la V1 par la V2
-  Réactivez le plugin ... le reste se fait tout seul !!!

Effets de la mise à jour :
-  Les traductions présentes dans les différentes tables sont ajoutées dans la table principale après ajout des champs de langue dans cette dèrnière
-  Suppression des tables des langues
-  Suppression des champs de langues dans la table des secteurs

Modifications depuis la V1 :
-  Plus que 2 tables à la place de 3 à n tables selon le nombres de langues utilisées sur le site
-  Repérage de la langue native du site en rouge dans le menu de gauche
-  Blocage des ajouts de secteurs et d’item si l’interface n’est pas dans la langue native du site (pour éviter aux traducteurs d’avoir la main sur ses parties sensibles du plugin)
-  Lors de la saisie d’un item, une vérification automatique se fait évitant ainsi des items trop courts (3 caractères minimum) ainsi que les doublons, votre item est OK si le carré à droite du champ de saisie de l’item est vert, sinon vous ne pouvez pas valider votre item
-  1 seule langue (la langue native) pour la gestion des secteurs
-  Interface plus intuitif pour les traducteurs proposant pour chaque item le descriptif et la « valeur » dans la langue native

Révisions

V2.1


-  Un petit bug s’était glissé lors de la réalisation de la V2 depuis la V1, du coup, la création des fichiers de langues posait problème.
-  Bug rectifié grâce à la vigilance de bobMorane ... merci

Installation

L’installation se déroule comme pour tous les autres plugins, cf. http://www.spip.net/fr_article3396.html

Celui ci va créer les tables nécessaires dans la base SPIP ainsi que les fichiers de langues dans le dossier « squelettes ».

Gestion des secteurs

Commencez par créer vos secteurs :
-  le descriptif vous permet de vous repérer dans les différents secteurs que vous aller créer
-  vous nommez ensuite le secteur, vous pouvez n’utiliser qu’une langue à ce niveau là, pensez tout de même à vos traducteurs le cas échéant !!!
-  vous pouvez toujours revenir sur un secteur créé en le sélectionnant dans la liste en dessous du formulaire de saisie

Création et édition des items

Il suffit ensuite de sélectionner la langue de base du site dans la liste de gauche pour accéder au menu de création des items, dans le formulaire de saisie :
-  « item à traduire » correspond au « mot » que vous aller placer sur vos squelettes avec le code multi <:mot_a_traduire:> [1]
-  vous avez ensuite le descriptif pour vous y retrouver
-  puis la « traduction » qui correspond à ce qui sera affiché sur votre site
-  pour accédez à la liste complète des « mots » d’un secteur il suffit de cliquer sur le secteur souhaité dans la liste en dessous du formulaire de saisie.

Gestion des traductions

A partir de cet écran, vous pouvez gérer vos items de traduction et obtenir aussi les items au format SPIP à insérer dans vos squelettes, soit les actions :
-  changer une traduction : en modifiant directement la valeur dans les champs de texte.
-  modifier un item : en cliquant sur « modifier » (on ne peut pas changer l’item de traduction lui même, ce qui est logique car s’il est utilisé sur le site, cela ne correspondra plus, mais on peut changer son secteur et son descriptif)
-  supprimer un item

Voilà, je ne suis pas très fort en explications, mais j’espère que vous aurez compris comment fonctionne mon plugin.

pour le télécharger c’est juste là !!!

Traduction V2.1

Notes

[1Plus d’explication sur l’usage de ce code dans la documentation officielle Internationaliser les squelettes (paragraphe « 1. Méthode des fichiers de langue »)

Discussion

11 discussions

  • Bonjour à tous,

    voilà déjà quelques temps (6 mois, je sais je n’ai pas été rapide sur le coup) que l’on me demande de porter ce plugin pour spip 2, c’est aujourd’hui chose faite !

    Rendez-vous sur cette page pour en profiter !

    Xavier

    Répondre à ce message

  • 2
    Bisi2poche

    Bonjour,

    à première vue, le problème de penchaki est en deux parties :

    1- L’affichage du code provient de l’utilisation des balises

    <? [...] ?>

    au lieu de

    <?PHP [...] ?>

    (A savoir que la directive short_open_tag de php n’est plus active par défaut, il est recommandé d’utiliser les balises complètes

    <?PHP [...] ?>

    )

    2- En activant le short_open_tag, on obtient un message d’erreur (voir image jointe) qui laisse entendre que l’on doit d’abord avoir installé puis désinstallé la version 1 pour que la v2 puisse mettre à jour les tables de la BDD. C’est bien celà ? (je vais essayer si je trouve la v1)

    • Bisi2poche

      Je viens de comprendre une partie du problème :

      Dans la définition du squelette on peut normalement indiquer plusieurs répertoires séparés par des «  : »
      (ex : « mon_squelette:mon_squelette/modeles »)

      Lors de l’installation du plugin (inc/traduction_install.php @80) la valeur est utilisée pour créer ou controler le répertoire « lang » et les fichiers « lang/local_#LANG#.php » dans le squelette. Dans l’exemple, on essait donc de créer « mon_squelette:mon_squelette/modeles/lang/... »

      Je sais pas si c’est le plus propre qu’il y est, mais pour ma part, en ajoutant le code suivant avant la ligne 80 ( if(!is_dir(’../’. ), ce problème est résolu :

      <?php
          $dossiers_squelettes = explode(':',$GLOBALS['dossier_squelettes']);<br>
          sort($dossiers_squelettes);<br>
          $dossier_squelette = $dossiers_squelettes[0];<br>
      ?>



      Après j’ai encore ces erreurs :

      Une erreur est survenue lors de la mise à jour du plugin Les anciennes tables de ’spip_traductions_langues’ ont été supprimées avec succés Les champs de langues de la table ’spip_traduction_secteurs’ ont été supprimés avec succés spip_traductions : Table non créée spip_traductions_secteurs : Table non créée


      snif :(

    • Merci Bisi2poche ...

      Je vais tenter de poursuivre ...

    Répondre à ce message

  • Bonjour ,

    Je viens de migrer vers la SPIP 2.0.1 de spip et pour la version du plugin : traductionV2.rar-2

    voici ce que j’obtient :

    $val) if($val != «  » && (!in_array($val,$Row_Liste_champs_table_traduction[$val]))) $global_maj = 1 ; // ajout du champ de la langue dans la table spip_traductions if(!$Maj_table_spip_langues = spip_query_db("ALTER TABLE spip_traductions ADD ".$val." BLOB NOT NULL  ))$erreur_maj = 1 ; // mise a jour de la table spip traduction pour les items de la langue if(in_array(’spip_traductions_’.$val,$listing_table_traduction_maj)) $Recup_trad_v1 = spip_query_db(’select * from spip_traductions_’.$val) ; $Row_Recup_trad_v1 = mysql_fetch_assoc($Recup_trad_v1) ; do if(!$Insert_recup_v1 = spip_query_db( »update spip_traductions set « .$val. » = \« ».$Row_Recup_trad_v1[’item_traduction_langue’].«  » where id_traduction = « .$Row_Recup_trad_v1[’id_traduction’]))$erreur_maj = 1 ; while($Row_Recup_trad_v1 = mysql_fetch_assoc($Recup_trad_v1)) ; // suppression de la table de langue de la V1 qui ne sert plus if(!$Suppression_table_v1 = spip_query_db( »DROP TABLE spip_traductions_« .$val))$erreur_maj_sup_table = 1 ; // suppression de l’item langue dans la table secteurs if(!$Suppression_champs_secteur = spip_query_db( »ALTER TABLE spip_traductions_secteurs DROP item_secteurs_« .$val))$erreur_maj_sup_champs = 1 ; if($global_maj == 1) if($erreur_maj == 0)$reponse_init_plugin .= _T(’traduction:maj_ok’) ; else $reponse_init_plugin .= _T(’traduction:maj_ko’) ; if($erreur_maj_sup_table == 0)$reponse_init_plugin .= _T(’traduction:maj_sup_table_ok’) ; else $reponse_init_plugin .= _T(’traduction:maj_sup_table_ko’) ; if($erreur_maj_sup_champs == 0)$reponse_init_plugin .= _T(’traduction:maj_sup_champs_ok’) ; else $reponse_init_plugin .= _T(’traduction:maj_sup_champs_ko’) ; // fin maj depuis la V1 // creation du fichier config if(!file_exists( »../plugins/traduction/config.php« )) if(!fopen( »../plugins/traduction/config.php« , »w+« ))$reponse_init_plugin .= _T(’traduction:droits_fichier_config’) ; else $prepa_config = «  » ; $File_config = fopen( »../plugins/traduction/config.php« , »w+« ) ; fwrite($File_config,$prepa_config) ; fclose($File_config) ; $reponse_init_plugin .= _T(’traduction:fichier_config_ok’) ; // creation des fichiers de langue // on commence par creer le dossier de langue if(!is_dir(’../’.$GLOBALS[’dossier_squelettes’].’/lang’) && !mkdir(’../’.$GLOBALS[’dossier_squelettes’].’/lang’,0777)) $reponse_init_plugin .= _T(’traduction:droits_dossier_squelette’) ; else //on prepares l’ecriture des fichiers de langue $prepa_fichier = «  » ; // on boucle sur les langues actives pour créer les fichiers de langue foreach($tableau_langues as $key=>$val) if($val != «  » && (!file_exists(’../’.$GLOBALS[’dossier_squelettes’].’/lang/local_’.$val.’.php’))) $fichier_langue = fopen(’../’.$GLOBALS[’dossier_squelettes’].’/lang/local_’.$val.’.php’,’w+’) ; fwrite($fichier_langue,$prepa_fichier) ; chmod(’../’.$GLOBALS[’dossier_squelettes’].’/lang/local_’.$val,0666) ; if(file_exists(’../’.$GLOBALS[’dossier_squelettes’].’/lang/local_’.$val.’.php’)) $reponse_init_plugin .= ’local_’.$val. » : « ._T(’traduction:fichier_ok’) ; else $reponse_init_plugin .= ’local_’.$val. » : "._T(’traduction:fichier_ko’) ; // initialisation du plugin, on liste les tables pour // vérifier si les tables associées au plugin existent déjà $liste_table_traduction = mysql_list_tables($GLOBALS[spip_mysql_db]) ; $row = mysql_fetch_row($liste_table_traduction) ; $listing_table_traduction = array() ; while($row = mysql_fetch_row($liste_table_traduction)) $table_traduction = $row[0] ; array_push($listing_table_traduction,$table_traduction) ; // si les tables n’existent pas, on les génère if(!in_array(’spip_traductions’,$listing_table_traduction)) // table des traductions $create_table_spip_traductions = « CREATE TABLE spip_traductions (id_traduction BIGINT( 255 ) NOT NULL AUTO_INCREMENT PRIMARY KEY, item_traduction VARCHAR( 255 ) NOT NULL, exp_traduction VARCHAR( 255 ) NOT NULL, secteur_traduction INT( 50 ) NOT NULL DEFAULT 0) ENGINE = MYISAM ; » ; if($Result_create_table_spip_traductions = spip_query_db($create_table_spip_traductions)) $reponse_init_plugin .= ’spip_traductions’.’ : ’._T(’traduction:table_ok’) ; else $reponse_init_plugin .= ’spip_traductions’.’ : ’._T(’traduction:table_ko’) ; // table des secteurs de traductions // pour permettre de classifier un peu tout sinon c’est le b... ! if(!in_array(’spip_traductions_secteurs’,$listing_table_traduction)) $create_table_spip_traductions_secteurs = « CREATE TABLE spip_traductions_secteurs (id_secteurs_traduction BIGINT( 255 ) NOT NULL AUTO_INCREMENT PRIMARY KEY, item_secteurs_traduction VARCHAR( 255 ) NOT NULL) ENGINE = MYISAM ; » ; if($Result_create_table_spip_traductions_secteurs = spip_query_db($create_table_spip_traductions_secteurs)) $reponse_init_plugin .= ’spip_traductions_secteurs’.’ : ’._T(’traduction:table_trad_ok’) ; else $reponse_init_plugin .= ’spip_traductions_secteurs’.’ : ’._T(’traduction:table_trad_ko’) ; // on liste les champs de la table spip_traductions pour ajouter les langues actives $Liste_champs_table_traduction = « SHOW COLUMNS FROM spip_traductions » ; $Result_Liste_champs_table_traduction = spip_query_db($Liste_champs_table_traduction) ; $Row_Liste_champs_table_traduction = mysql_fetch_row($Result_Liste_champs_table_traduction) ; // mise a jour de la table spip_traductions foreach($tableau_langues as $key=>$val) if($val != «  » && (!in_array($val,$Row_Liste_champs_table_traduction[$val])))$create_table_spip_langues = spip_query_db("ALTER TABLE spip_traductions ADD ".$val." BLOB NOT NULL ;") ; if($reponse_init_plugin != «  ») debut_boite_info() ; echo « 

     »._T(’traduction:infos’)."
    «  ; echo »

    « .stripslashes($reponse_init_plugin). »
    " ; fin_boite_info() ;  ?>

    Avez vous une idée des modifications à apporter ?
    Merci
    Panchaki

    Répondre à ce message

  • ce plugin fonctionne t’il sur spip 2.0 ? sinon pour quand la version compatible avec ?

    Répondre à ce message

  • 1

    Ce plug-in m’a l’air bien sympathique mais lorsque je l’installe (j’ai déjà installé plusieurs plug je sais faire) j’ai cet erreur qui apparaît dans la colonne gauche de la page des plug-ins :

    Fatal error: in_array() [<a href='function.in-array'>function.in-array</a>]: Wrong datatype for second argument in /mnt/140/sdc/9/0/batirsaintest/plugins/traduction/inc/traduction_install.php on line 37

    l’onglet traduction est créer dans éditions mais le lien m’affiche une page blanche.

    Merci de l’aide que vous pourriez m’apportez.

    • Et la liste des plug-in disparait.

      J’ai oublié de dire également que j’était sous spip 1.9.2d et que j’avais ces plug installé :

      • acces groupe 1.9.2
      • Agenda pour SPIP 1.9.2
      • cfg : moteur de configuration
      • Le Couteau Suisse
      • Inscription2
      • Widget Calendrier

    Répondre à ce message

  • Hello,
    je m’excuse mais après installation du plugin (apparemment fructueuse) et après son activation, je ne vois pas du tout comment arriver à la page traduction... fâcheux !

    Depuis quel lien dans l’espace privé les nouvelles fonctions sont-elles actives ?

    NB : je ne sais pas si cela a qqch à voir : après activation du plugin, petit message en rouge :

    Infos plugin « Traduction »
    Une erreur est survenue lors de la mise à jour du plugin
    Les anciennes tables de ’spip_traductions_langues’ ont été supprimées avec succés
    _
    Les champs de langues de la table ’spip_traduction_secteurs’ ont été supprimés avec succés

    merci de votre aide, je suis impatient de pouvoir utiliser ce plugin !

    L

    Répondre à ce message

  • bobMorane

    Très beau travail, j’ai toutefois rencontré des problèmes au démarrage de la V2, ça pourra certainement servir à d’autres :
    fichier php_ajax.php
    il faut remplacer les lignes 4 à 12

    $Lister_mots = « select * from spip_traductions » ;
    $Result_Lister_mots = spip_query_db($Lister_mots) ;
    $Row_Lister_mots = mysql_fetch_assoc($Result_Lister_mots) ;
    do
    $lister_traductions = « select * from spip_traductions_ ».$langue." where id_traduction = « .$Row_Lister_mots[’id_traduction’] ;
    $Result_lister_traductions = spip_query_db($lister_traductions) ;
    $Row_lister_traductions = mysql_fetch_assoc($Result_lister_traductions) ;
    $liste_item .= »’« .$Row_Lister_mots[’item_traduction’]. »’ => ’« .addslashes($Row_lister_traductions[’item_traduction_langue’]). »’,\n" ;
    while($Row_Lister_mots = mysql_fetch_assoc($Result_Lister_mots)) ;

    par

    $lister_traductions = « select * from spip_traductions where $langue != ’’ » ;
    $Result_lister_traductions = spip_query_db($lister_traductions) ;
    while($Row_lister_traductions = mysql_fetch_assoc($Result_lister_traductions))
    $liste_item .= « ’ ».$Row_lister_traductions[’item_traduction’].« ’ => ’ ».addslashes($Row_lister_traductions[$langue]).« ’,\n » ;

    c’est certainement un petit oubli, ça semblait faire appel à l’architecture de la V1.

    Ensuite, les fichiers de langue étaient sur ma version de SPIP dans le dosssier /ecrire/lang/public_*et non dans /lang/local_*

    Et un petit truc qui serait super intéressant à rajouter car très frustrant, lors de l’installation, initialiser la table traduction grâce au fichier de langue par défaut.

    Sinon, encore bravo pour ce travail !

    Répondre à ce message

  • Ploufplouf

    Bonjour,

    Je viens d’installer le plugin sur la dernière version de spip 1.9.2d et apparemment il ne fonctionne pas. Je l’ai installé comme tout autre plugin mais lorsque que je vais dans mo onglet de traduction il m’affiche le code php.
    Quelqu’un aurait-il une solution à ce problème ?

    Répondre à ce message

  • 2
    taoufik karkar

    Je viens de télécharger le plugin traduction. D’avance je dis merci ! Car SPIP est vraiement multilingue dans sa conception native . Il lui manquait des petits outils qui lui permettent d’exploiter ses possibilités. Depuis longtemps je voulais retravailler la traduction en arabe fournie par spip.zip car
    elle est plus adaptée à l’arabe du moyen orient qu’à celui du maghreb. (vocbulaire, dénomination des mois, etc...)

    • Si tu as envie de proposer une traduction « pour le maghreb » des fichiers SPIP, fais-le sur la liste spip-trad. SPIP comprend déjà plusieurs versions occitanes, pourquoi pas plusieurs versions arabes ?

    • Plusieurs versions arabes serait une excellente idée...!

    Répondre à ce message

  • Christophe Danaux

    Bonjour,

    Est-ce ça marche aussi pour les labels des formulaires du plugins forms@tables ?

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom