Localisation et Internationalisation

Il semble que la manière dont Gambas traite la localisation et l’internationalisation ne soit pas très claire, alors voici un petit article à ce sujet...

Si vous n’avez jamais entendu parler de Localisation et d’ Internationalisation, je vous suggère de jeter d’abord un œil sur l’article Wikipedia.

Les Variables d’Environnement du Langage

Le comportement d’un programme international doit être adapté en adéquation avec :
  • Le pays de l’utilisateur.

  • Sa langue.

Dans Gambas, ces deux informations sont extraites des variables d’environnement du système suivantes : $LC_ALL, or $LANG.

La variable d’environnement $LANG est utilisée seulement si $LC_ALL n’est pas définie. A partir d là, nous n’utiliserons que $LANG dans ce document.

La syntaxe de $LANG est la suivante :
xx_YY.ZZZZ

  • xx est une chaîne de deux caractères en minuscule, et représente le langage de l’utilisateur.

  • YY est une chaîne de deux caractères en majuscules, et représente le pays de l’utilisateur.

  • ZZZZ est habituellement le jeu de caractères du système.

Tous les caractères qui suivent la chaîne xx_YY sont ignorés par Gambas.

Pour exécuter un programme sous une localisation différente, vous pouvez faire :
$ cd /path/to/my/project
$ LANG=fr_FR gbx2
Ou bien définissez la variable LANG dans l’onglet Environment du dialog propriété du projet.

Sur certains systèmes, comme Mandriva, vous devez définir la variable $LANG et la variable $LANGUAGE avec la localisation désirée. Sinon les chaînes ne seront pas traduites.
$ cd /path/to/my/project
$ LANGUAGE=fr_FR LANG=fr_FR gbx2

Traduction des Chaînes

Dans votre projet, vous avez deux différentes sortes de chaînes :
  • Les chaînes qui sont vues par l’utilisateur (une étiquette texte, un message...), et ceci doit être traduit.

  • Les chaînes qui sont internes (une clé de collection, le nom d’un champ, un paramètre programme...), et cela ne doit pas être traduit.

Vous devez dire explicitement à Gambas quelles chaînes doivent être traduites, et celles qui ne le doivent pas.

Les chaînes qui doivent être traduites doivent être placées entre parenthèses :
PRINT "Une chaîne qui  ne doit pas être traduite "
PRINT ("Une chaîne qui  doit être traduite ")

Notez que toutes les propriétés Text des contrôles sont automatiquement marquées traductibles.

Gambas utilise en interne le système de traduction GNU : les chaînes traduites sont enregistrées dans les fichiers xx_YY.mo, où xx et YY ont la même définition que plus haut.

Si un fichier spécifique de traduction pour la langue xx_YY ne peut pas être trouvé, un fichier de traduction plus général xx.mo est essayé.

Par exemple, si le fichier de traduction fr_CA (Français Quebec) n’existe pas, alors la langue fr (Common French) sera utilisée.

Si, pour un raison quelconque, les fonctions traduction GNU ne peuvent commuter vers la langue enregistrée dans les variables d’environnement, les chaînes ne seront alors pas traduites et les réglages de localisation numérique et de date ne seront pas honorés.

Manipulations de Chaînes

Gambas possède deux jeux de fonctions de manipulation de chaînes : celles qui ne s’occupent que des chaînes ASCII, et celles qui peuvent traiter des chaînes UTF-8.

Chaque fois que vous avez à manipuler une chaîne qui doit être traduite, vous devez utiliser les fonctions UTF-8. Ces fonctions sont toutes membres de la classe statique String.

Autrement, je vous suggère de toujours utiliser les caractères ASCII et les fonctions natives ASCII, parce qu’elles sont plus rapides.

Les fonctions natives ASCII sont :
Asc, Chr$, InStr, RInStr, LCase$, Left$, Right$, Mid$, Len, LTrim$, RTrim$, Trim$... Voyez Fonctions de chaîne de caractères pour toutes celles ci.

Conversions de Chaînes

Vous avez souvent à traduire un nombre Gambas ou une date en chaîne de caractères, et le contraire.

Alors, vous devez savoir si la chaîne qui représente la valeur numérique ou la date sera vue par l’utilisateur. Parce que dans ce cas, la valeur numérique ou la date doit être traduite en accord avec les réglages de localisation du pays et de la langue de l’utilisateur. Aussi, vous devez utiliser les fonctions Gambas qui permettent des réglages de localisation.

Ces fonctions sont : Str$, et Val.

Str$() convertit une valeur quelconque en chaîne localisée, tandis que Val() tente de convertir une chaîne vers une valeur spécifique en devinant le type de donnée d’après le contenu de la chaîne : par exemple, si Val() voit des séparateurs de date ou d’heure, selon les réglages de localisation, elle supposera que la chaîne doit être convertie en date.

Autrement, si la chaîne de représentation de la valeur numérique ou de la date ne devait pas être vue par l’utilisateur (un paramétrage d’ application enregistré dans un fichier texte par exemple), vous devez alors avoir recours aux fonctions Gambas qui n’utilisent pas de réglage de localisation *.

Ces fonctions sont :
CBool, CByte, CDate, CFloat, CInt, CLong, CSingle, CShort, CStr.

Actuellement, ces fonctions utilisent une localisation par défaut appelée "C", qui est exactement la même que "en_US", c.a.d. la localisation des gens vivant aux Etats-Unis d’Amérique. C’est la principale raison de la confusion, je pense!

Vous utiliserez CStr() pour convertir en chaîne, et toutes les autres fonctions pour convertir à partir d’une chaîne vers un type de données spécifique. La conversion doit être entièrement bijective, c.a.d. CStr(CXXX(uneChaîne)) = uneChaîne, et CXXX(CStr(uneValeur)) = uneValeur =. Prenez garde, il n’y a pas de garantie totale!

Localisation GUI

Une difficulté de localisation vient des langues écrites de gauche à droite : Arabe, Farsi, Hébreu. L’interface utilisateur doit inverser certains de ses composants pour suivre la direction d’écriture.

Cela peut être automatique, à partir du moment ou vous utilisez toujours * des conteneurs de disposition comme HBox, VBox, HPanel et VPanel, ou des conteneurs qui ont leur propriété Arrangement activée.

Les autres parties du GUI (menus, étiquettes, "widget" barre de défilement...) s’adapteront, pour autant que le " toolkit " d’arrangement (qt or GTK+) se comporte correctement.

Pour essayer un GUI inversé, vous pouvez fixer la variable environnementale $GB_REVERSE avant de démarrer votre programme. Si quelque chose ne s’affiche pas correctement, dites-le s’il vous plaît,.

Exemple

Voilà ce que vous voyez si vous exécutez LANG=fa LANGUAGE=fa gambas2 sur ma Mandriva :

Voir aussi