Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Amiga E - locale.library
(Article écrit par Pierre Girard et extrait d'Amiga News - décembre 1996)
|
|
Je suppose que vous êtes en train de vous dire que ce sujet a déjà été traité. C'est vrai, mais d'abord pas en E, et ensuite
tout le monde n'a pas la collection complète des Amiga News. Mais bon, ce n'est pas tout, mettons-nous au travail.
Do you speak french ?
C'est à peu près ce qu'il fallait dire à son Amiga avant que les ingénieurs de chez Commodore (ce nom vous dit quelque chose ?)
ne nous concoctent un moyen simple de créer des logiciels multilingues. Ces petits malins ont créé une nouvelle bibliothèque
de fonctions (Kickstart >= 2.1) dénommée locale.library, facilitant le travail des programmeurs pour rendre leurs logiciels
utilisables dans plusieurs pays, et, par là même, comblant les utilisateurs ne parlant ni la langue de Benny Hill, ni celle
de Papa Schultz.
Mise en oeuvre
Le fonctionnement est celui d'une bibliothèque standard. Il faut d'abord l'ouvrir en spécifiant au minimum la version 38. Ensuite,
il faut ouvrir ce que l'on appelle la locale, c'est-à-dire, en fait, le langage souhaité pour l'utilisation du programme. Je
sens que ce n'est pas très clair. La fonction OpenLocale(name) ouvre la locale "name" ou plus simplement la locale définie
dans les préférences du Workbench si le nom est égal à NULL. Cette fonction remplit une structure locale auparavant définie.
Une fois que l'on sait le langage à utiliser, il ne reste plus qu'à ouvrir le fichier "catalog" correspondant au langage, ce
qui est réalisé par la fonction OpenCatalogA(locale,name,taglist). En mettant locale à 0, on choisit d'utiliser la locale par
défaut. Voilà, c'est tout pour l'initialisation. Il faut quand même savoir que la fonction pour récupérer une châine de caractère
dans un catalogue a comme syntaxe GetCatalogStr(locale,stringnum).
Le programme
Passé cette théorie rébarbative qui n'est qu'une redite des autodocs, passons au plus intéressant, c'est-à-dire le cas pratique.
Si vous avez jeté un coup d'oeil au programme ci-dessous, vous vous demandez sans doute où sont passés toutes les fonctions
décrites dans le paragraphe au-dessus ! Eh bien, ce mois-ci, au lieu de faire mot à mot dans le programme ce que j'annonce dans
la théorie, j'ai choisi une autre approche, plus proche de ce que fait le programmeur normal dans un cas comme celui de la
localisation d'un programme. J'ai utilisé un programme externe pour créer le fichier "catalog" et même les routines d'accès
à ce catalogue.
Ce programme merveilleux s'appelle Flexcat. Je vous conseille la version 1.5 disponible sur Aminet (ou sur les CD du même nom)
qui marche avec les versions 3.0+ du E (sinon c'est un peu plus compliqué). Comment faire ? D'abord, il faut ouvrir le module
créé par Flexcat avec MODULE "*nom". Ensuite, il reste à définir la structure du catalogue à ouvrir avec DEF cat:PTR TO catalog_nom,
et ouvrir la locale.library. En fait, c'est presque tout. Toutes les routines d'ouverture du catalogue et la recherche des chaînes
de caractères se trouvent dans le module. Cette définition est orientée objet, ce qui signifie qu'il suffit de connaître le nom
des objets et des méthodes pour programmer le reste.
Ainsi, "cat" est le nom de la structure et tout le reste représente les différentes chaînes de caractères. Il existe en tout et pour
tout quatre méthodes : "create" pour créer la structure du catalogue (cat.create()), "open()" pour ouvrir le catalogue, "close()"
pour... (vous avez trouvé ?) et "getstr()" pour récupérer un message. C'est dans un cas comme celui-ci que l'on trouve que le E
est un langage fantastique. Ainsi, dans le cas du nom de la fenêtre, il suffit de remplacer la chaîne de caractère habituelle par
cat.msgwintitle.getstr() pour avoir le texte correspondant du catalogue !
Les fichiers de description
Pour définir le catalogue, il faut créer à la main un fichier .cd (catalog description). Regardez bien la syntaxe, je n'ai pas la
place de décrire très en détail. Après avoir signalé la version, le langage par défaut, et initialisé codeset à 0 (attention au #),
il ne reste plus qu'à remplir les messages. Le principal est bien sûr le nom du message suivi entre parenthèses, si l'on le désire,
d'un numéro d'identification, la longueur min. et max. (en général, on évitera en remplaçant le tout par (//). Mais pour créer le
catalogue, il faut aussi un fichier de traduction .cd (catalog translation). Celui-ci a quasiment la même forme que le fichier
.cd excepté que les commandes dont précédées de ## et qu'il ne possède aucun identificateur ni indicateur de longueur.
Compilation
Il faut tout d'abord créer le fichier source du module wingadlocale.e qu'il faudra ensuite compiler. Cette action se réalise
grâce à Flexcat wingad.cd wingadlocale.e=E30b.sd. Ensuite, il faut compiler le module wingadlocale.e afin d'obtenir le module
windgadlocale.m. Il faut maintenant créer la fichier catalogue grâce à FlexCat wingad.cd french.ct CATALOG
locale:catalogs/français/wingad.catalog. Voilà, tout est prêt et il ne reste plus qu'à compiler notre petit programme wingad.e
(que j'ai trouvé je ne sais où dans le domaine public et modifié). On lance et hop c'est en français. On va dans les prefs,
on change le langage par défaut et hop c'est en anglais.
Bon, plus de place... stop... amusez-vous bien... stop... bye...
/* Wingad:Utilisation simple de la locale.library */
MODULE 'intuition/intuition'
MODULE 'locale'
MODULE 'libraries/locale'
MODULE '*wingadlocale'
CONST BUFSIZE=GADGETSIZE*3, IFLAGS=IDCMP_CLOSEWINDOW+IDCMP_GADGETUP
DEF buf[BUFSIZE]:ARRAY,next,w,gad:PTR TO gadget
DEF cat:PTR TO catalog_wingad
PROC main()
localebase:=OpenLibrary('locale.library', 0)
NEW cat.create()
cat.open()
next:=Gadget (buf,NIL,1,0,20,20,200, cat.msgbouton1.getstr())
next:=Gadget (next,buf,2,0,20,35,200, cat.msgbouton2.getstr())
next:=Gadget (next,buf,3,0,20,50,200, cat.msgbouton3.getstr())
IF w:=OpenW (20,11,300,100,IFLAGS,$F, cat.msgwintitle.getstr(), NIL, 1, buf)
WHILE WaitIMessage(w)<>IDCMP_CLOSEWINDOW
gad:=MsgIaddr()
TextF(20,80,cat.msgpressedgadget.getstr())
TextF(20,90,'#\d',gad.userdata)
ENDWHILE
CloseW(w)
ENDIF
cat.close()
CloseLibrary(localebase);
ENDPROC
;Fichier Wingad.cd
#version 1
#language english
# codeset 0
;
; Ma première fenêtre en E
msgwintitle (//)
My first window in E!
;
; Ceci est le bouton 1
msgbouton1 (//)
This is first gadget
;
; Ceci est le bouton 2
msgbouton2 (//)
This is second gadget
;
; Ceci est le bouton 3
msgbouton3 (//)
This is third gadget
;
; Vous avez appuyé sur le gadget
msgpressedgadget (//)
You pressed gadget
;Fichier french.ct
## version $VER: wingad 1.0 (28.10.96)
## language français
## codeset 0
;
; Ma première fenêtre en E
msgwintitle
Ma première fenêtre en E
;
; Ceci est le bouton 1
msgbouton1
Ceci est le bouton 1
;
; Ceci est le bouton 2
msgbouton2
Ceci est le bouton 2
;
; Ceci est le bouton 3
msgbouton3
Ceci est le bouton 3
;
; Vous avez appuyé sur le gadget
msgpressedgadget
Vous avez appuyé sur le gadget
|
|