Blog ENI : Toute la veille numérique !
💥 Un livre PAPIER acheté
= La version EN LIGNE offerte pendant 1 an !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

Internationalisation

Introduction

La plupart des programmes sont écrits en anglais, langue la plus couramment parlée à notre époque. Ceux, en particulier, qui ne la maîtrisent pas, préfèrent les logiciels dont l’interface utilisateur est traduite dans leur langue maternelle. Cela pose le problème de la langue utilisée dans un programme.

Quelle langue utiliser lorsque vous programmez ? Nous distinguons deux endroits où le programmeur doit faire ce choix. Il n’est pas souhaitable de traduire les commentaires et les noms des fonctions, variables et autres éléments du langage C car à part les commentaires, ce sont des mots-clés et non du langage humain. Par contre, l’interface utilisateur, prévue pour communiquer avec l’homme, peut être écrite pour utiliser la langue de l’utilisateur. En effet, un programme qui s’exprime dans la même langue que vous est beaucoup plus convivial. L’objet de ce chapitre est de proposer des recettes pour permettre à un programme de communiquer dans le plus grand nombre de langues possibles, en facilitant le plus possible le travail de traduction.

La première recette est la seule de ce chapitre à ne pas véritablement concerner d’autres personnes que le programmeur. Il s’agit en effet d’internationaliser votre programme, à savoir le rendre capable d’utiliser...

Internationaliser un programme avec gettext

Problème

Vous souhaitez que votre programme s’exprime dans la langue définie dans la variable d’environnement $LANG.

Solution

Adaptez le code source pour l’utilisation de gettext. Puis remplacez toute chaîne "chaîne" par _("chaîne"). Puis, générez un fichier PO à l’aide de xgettext et compilez-le avec msgfmt. Placez-le dans le répertoire adéquat.

Discussion

Voici un exemple de code sur lequel le travail d’internationalisation n’a pas été effectué :


#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
 
int 
main (int argc, char **argv) 
{ 
  char *a; 
  char b[] = "Un texte"; 
  a = strdup ("Un autre texte"); 
  printf ("La variable 'a' contient '%s'\n", a); 
  printf ("La variable 'b' contient '%s'\n", b); 
  exit (EXIT_SUCCESS); 
}
 

Pour internationaliser ce code, suivons les trois étapes suivantes.

 Étape 1. Ajoutez le code suivant au début de chaque fichier source :


#include <locale.h> 
#include <libintl.h> 
 
#define gettext_noop(String) String 
 
#define _(String) gettext (String) 
#define N_(String) gettext_noop (String)
 

 Étape 2. Ajoutez...

Traduire un programme internationalisé avec gettext

Problème

Un programme est prêt à être traduit et vous souhaitez démarrer la traduction des chaînes de caractères.

Solution

Créez un fichier PO en copiant le fichier modèle pour les traductions. Puis éditez-le pour traduire les chaînes de caractères qui correspondent à celles de l’interface utilisateur. Générez un fichier MO avec msgfmt et installez-le dans le répertoire des locales.

Discussion

La création d’un fichier PO s’effectue par copie du fichier modèle dont l’extension est .pot, et qui contient toutes les chaînes de caractères à traduire. Ce fichier n’existant pas forcément, voici comment le générer avec xgettext :

xgettext -L C --keyword=_ --keyword=N_ fichiers_source1.c
                             fichier_source2.c ... 

Si votre code contient comme le nôtre des caractères non ASCII, il se peut que xgettext ait des difficultés et vous invite à utiliser l’option --from-code. Dans ce cas, essayez un encodage autre que ASCII avec par exemple --from-code=UTF-8 ou --from-code=ISO-8859-15.

Cette commande génère un fichier message.po que nous renommons du même nom que le contenu de la macro PACKAGE utilisée dans le programme, avec l’extension pot, par exemple exemple.pot. Voici ce que contient...

Maintenir à jour la liste des chaînes à traduire

Problème

Un programme est déjà traduit dans la langue souhaitée, mais partiellement ou de façon incorrecte. Vous voulez corriger ou compléter cette traduction.

Solution

Vérifiez d’abord que le fichier modèle des traductions est bien à jour. Puis mettez à jour le fichier des traductions dit PO avec msgmerge. Enfin, éditez la traduction et regénérez un fichier binaire dit MO.

Discussion

Pour mettre à jour le fichier modèle des traductions (dont l’extension est .pot), afin de s’assurer qu’il est bien à jour, nous utilisons xgettext comme indiqué dans la recette précédente. Lorsque ce fichier, généralement appelé exemple.pot si le projet s’appelle exemple, est à jour, nous exécutons ceci :


msgmerge -o fr.po.new fr.po exemple.pot
 

Cette commande crée dans fr.po.new une mise à jour du fichier fr.po contenant les traductions françaises en tenant compte du fichier modèle des traductions exemple.pot. Nous pouvons ensuite supprimer l’ancien fichier fr.po et renommer le nouveau fr.po.new en fr.po.

La suite des opérations est semblable à la recette précédente : nous regénérons un fichier MO avec msgfmt et nous remplaçons le précédent...

Éviter certains pièges linguistiques

Problème

Certaines langues utilisent une construction de phrase différente des autres. Vous souhaitez adopter un style de programmation afin de faciliter la tâche au traducteur.

Solution

Essayez d’avoir une langue d’origine (l’anglais en général) la plus claire possible. Placez dans les chaînes de caractères des phrases complètes et évitez de concaténer des mots. Préférez l’utilisation des formats à la concaténation des chaînes de caractères.

Discussion

La première chose à respecter lorsque vous souhaitez programmer afin d’être traduit est d’écrire des phrases claires et sans ambiguïtés qui seront facilement comprises du traducteur. C’est à la fois un respect envers lui et l’assurance d’éviter des pièges linguistiques. En effet, une chaîne ambiguë ou difficile à comprendre suscitera facilement des erreurs. Le texte no memory qui signifie en français mot à mot pas de mémoire peut être traduit ainsi, mais aussi plus de mémoire. Le texte Out of memory signifie par contre clairement plus de mémoire disponible. Dans le même ordre d’idées, le traducteur fera attention aux faux amis, comme complete en anglais qui signifie fini et non pas complété (éventuellement complet).

Le style suivant rend délicate la traduction :


strcpy (string, _("Error ")); ...