Passer son site PHPWebGallery en UTF-8


[English version at the end]

Attention, cette modification n’est pas 100% sûre, et pas très propre. En particulier, les impacts sur l’envoi de mail sont flous, et je n’utilise pas toutes les fonctionalités de PWG, donc je n’ai pas forcément vu tous les problèmes… Mon but était de pouvoir gérer les caractères croates comme č que je n’arrivais pas à gérer en iso-8859-1.

J’ai testé la manipulation sous PHP 4.3.10 / MySQL 4.1.9  / PWG 1.7.0 et PHP 4.4.9 / MySQL  5.0.44 /PWG 1.7.0 (OVH).

Pour en savoir plus sur les liens PHP / MySQL / UTF-8, vous pouvez lire ce tutoriel qui m’a bien aidée.

  1. Modifier chaque fichier de langue common.lang.php dans les sous-répertoires de <installPWG>/language/, pour avoir
    $lang_info['charset'] = 'utf-8' ;

    Ceci permet de dire au navigateur web que le jeu de caractères utilisé est UTF-8

    Convertir en UTF-8 sans BOM avec Notepad++

  2. Convertir les fichiers de langues au format UTF-8 sans BOM. En effet, une fois que le navigateur web attend du UTF-8, il faut lui envoyer du UTF-8… Pour ma part, j’ai fait ça à la main via l’éditeur   Notepad++, en ouvrant et en convertissant chaque fichier php à la main. Les fichiers de langues sont dans : <installPWG>/language/, un répertoire par langue. Il est important d’utiliser UTF-8 sans BOM, sinon une partie du fichier est envoyé au serveur avant les header HTTP est c’est le bin’s.
    Eventuellement, il faut aussi convertir les fichiers des plugins, qui n’utilisent pas tous les fichiers de languages.
  3. Lire et insérer dans la base de données en UTF-8. Pour cela, modifier le fichier <installPWG>/include/common.inc.php pour ajouter la commande : mysql_query(« SET NAMES ‘utf8′ »)
    mysql_select_db( $cfgBase )or die ( "Could not connect to database" );
    mysql_query("SET NAMES 'utf8'");
  4. Modifier l’interclassement et le charset des champs de la base de données. Attention, là ça devient sérieux. Pour ma part, j’ai fait un script qui modifie tous les champs dont l’interclassement est latin1_swedish_ci vers utf8_general_ci :  Modifier sa base PWG vers UTF8
    C’est un peu bourrin et un peu risqué : j’ai pourri ma base dans la première version du script qui n’avait pas remis les valeurs par défaut des champs modifiés, mais ça a l’air de marcher. A noter que le script devrait sans doute copier toutes les propriétés des colonnes modifiées plutôt que la seule « Default » durant la modification ... Faire une sauvegarde de sa base (structure et données) avant la manip est obligatoire. Utilisez le script à vos risques et périls et testez-le sur une copie de votre base d’abord…
  5. Modifier le charset des flux RSS : include/feed.creator.class.php , modifier :
    var $encoding = "utf-8";
  6. Impact sur la récupération de tags IPTC : si comme moi vous récupérez des informations depuis les tags IPTC de vos photos, et que ces tags ne sont pas en UTF-8 (c’est mon cas, j’utilise xnview pour récuperer ces tags), il faut les convertir en utf-8 avant de les insérer dans la base de données, en modifiant la fonction clean_iptc_value dans include\fonctions_metadata.inc.php. Ce n’est pas très propre de modifier directement cette fonction, car au prochain upgrade de PWG, il faudra tout refaire, mais bon, de mon côté j’ai déjà modifié plein d’autres trucs, je ne suis pas à ça près.  La même manipulation est peut-être à faire aussi sur les EXIF si vous les utilisez.
    function clean_iptc_value($value)
    {
      // strip leading zeros (weird Kodak Scanner software)
      while ( isset($value[0]) and $value[0] == chr(0))
      {
        $value = substr($value, 1);
      }
      // remove binary nulls
      $value = str_replace(chr(0x00), ' ', $value);
    
      //change to UTF-8
      $value = utf8_encode($value);
    
      return $value;
    }
  7. Impact sur les envois de mail : il faudrait envoyer le charset utf-8 au lieu de
    iso-8859-1, mais je n’ai pas trouvé comment. Ca n’a pas l’air d’avoir d’impact sur les envois de mails qui ne contiennent pas de caractères UTF-8, les caractères accentués habituels s’affichent correctement avec le format HTML.

—————————-
English version

I did migrate my PWG web site to UTF-8 this summer, and here is  how I did it. I have PHP 4.3.10 / MySQL 4.1.9  / PWG 1.7.0 and PHP 4.4.9 / MySQL  5.0.44 /PWG 1.7.0. Depending on the MySQl version, I guess steps might be different.

1 – Modify each  common.lang.php in  <installPWG>/language/ to have :

$lang_info[‘charset’] = ‘utf-8’ ;

2 – Convert the language files to « UTF-8 without BOM »  (I used Notepad++ to do this). It would be better to convert all PHP files and templates to this format, but I don’t know any massive converter tool. If you have some plugins, you might need to convert the PHP files to  « UTF-8 without BOM »  too, because some plugins don’t rely on the language files.

3 – Read and insert  in the DB using  UTF-8 : modify include/common.inc.php and add :  mysql_query(”SET NAMES ‘utf8′”)

4 – The big part : modify the database itself.  I wrote a PHP script to modify each column which had collation latin1_swedish_ci to put utf8_general_ci instead  (I did not modify the other columns, nor the tables themselves). Just running the script was fine for me, but I am not sure there isn’t any bug  with it that I did not see yet. For exemple, it  should probably get *all* columns properties and restore them to their current values when changing the collation (I just copied the ‘default’ one , because if not, it was not set anymore, which was a big problem).

You can have a look at the script here, use it with caution : Modifier sa base PWG vers UTF8
5. Modify the charset for RSS  feeds : include/feed.creator.class.php  :
var $encoding = « utf-8 »;

6. Impact on  IPTC tags (if they are not in UTF-8, which is my case) : modify clean_iptc_value in include\fonctions_metadata.inc.php. It might be good to do the same for EXIF tags, but I don’t use them, so I did not bother making the change.

function clean_iptc_value($value)
{
// strip leading zeros (weird Kodak Scanner software)
while ( isset($value[0]) and $value[0] == chr(0))
{
$value = substr($value, 1);
}
// remove binary nulls
$value = str_replace(chr(0x00), ‘ ‘, $value);

//change to UTF-8
$value = utf8_encode($value);

return $value;
}

7. I tried making changes for mail sending, but did not find how. Anyway, it is a feature I don’t really use.

        

    2 Commentaires sur “Passer son site PHPWebGallery en UTF-8”

    1. je suis tombé sur ton site par hazard

      Quel version de phpwebgallery tu utilises ?

      Jolie thèmes (ou template) tu le post dans les extensions ?

      La prochaine version sera tout uft-8

      Tu as traduits les fichiers langues en Croate ?

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *