Internationalisation d’une base de données
Disons que vous soyez en charge d’une application web écrite en PHP/MySQL, par exemple l’intranet de votre entreprise, et que vous ayez soudainement besoin de l’internationaliser parce que votre entreprise installe des bureaux à l’étranger et que, malheureusement, notre merveilleuse langue française n’est pas parlée dans tous les pays du monde.
Pour les templates, pas de problème, gettext est là pour ça (je reviendrais peut-être dessus dans un futur article, si je suis motivé). Si vous n’avez pas envie de mettre les mains dans le système, votre framework propose sûrement une émulation plus ou moins performante en pur PHP, ou, au pire, une solution “maison”. Bref, ça c’est facile.
Ce qui pose plus de problèmes, ce sont les données présentes en base. Par exemple : la liste de catégories pour les tickets d’incidents des clients. Elle est stockée en base dans une table qui contient notamment l’intitulé de cette catégorie. Oui, mais cet intitulé doit être traduit. Et comme les catégories sont gérées dynamiquement, ce n’est pas envisage d’utiliser la méthode gettext qui repose sur des fichiers statiques.
Transformer le modèle
Nous allons commencer par ajouter une table pour stocker les traductions. Si on envisage la catégorie comme un élément identifié par un id uniquement, les traductions sont liées à une catégorie par une relation “1-N” : 1 catégorie possède N traductions. Chaque traduction est identifiée par un code de langue. L’idée est de retirer les champs contenant du texte à traduire de la catégorie, et de les stocker dans la table contenant les traductions
On crée donc les tables suivantes :
CREATE TABLE `category` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `created_at` DATETIME NOT NULL, `deleted_at` DATETIME NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB; CREATE TABLE `category_i18n` ( `category_id` INT UNSIGNED NOT NULL, `lang` VARCHAR(6) NOT NULL, `name` VARCHAR(45) NOT NULL, PRIMARY KEY (`lang`, `category_id`), INDEX `category_i18n_category_fk` (`category_id` ASC), CONSTRAINT `category_i18n_category_fk` FOREIGN KEY (`category_id` ) REFERENCES `category` (`id` ) ON DELETE CASCADE ) ENGINE = InnoDB;
