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
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