Obligement - L'Amiga au maximum

Dimanche 25 juin 2017 - 19:18  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


Jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Soutien

N'hésitez pas à soutenir le projet Obligement



Contact

David Brunet

Courriel

 


En pratique : Présentation et utilisation de la locale.library sous AmigaOS 2.1
(Article écrit par Cédric Beust et extrait d'Amiga News - novembre 1992)


On ne comptait plus les rumeurs à son sujet. Depuis plusieurs mois, les habitués d'Usenet dissertaient sur les nouveautés qu'il apporterait. Et enfin, il est là. Le Workbench 2.1 est arrivé. Il apporte de nombreuses améliorations par rapport au 2.0, notamment un pilote PostScript, CrossDOS en standard (le lecteur de disquette PC) et surtout la "localisation" que je vais vous décrire dans cet article.

De quoi s'agit-il ?

Avant tout, c'est une bibliothèque : la locale.library. Elle permet de donner une dimension internationale à vos programmes puisque vous pouvez désormais écrire ceux-ci en plusieurs langues avec une facilité déroutante. L'aspect utilisateur étant trivial (si vous mettez la main sur un programme "localisé", il adaptera automatiquement le langage que vous avez choisi dans vos préférences).

Je vais particulièrement détailler le côté programmation. Il serait de bon ton désormais si vous avez l'intention d'écrire une application de penser à incorporer la locale.library. C'est une surcharge de travail très faible qui donnera à votre application une dimension supplémentaire.

Un programme localisé contient des fichiers auxiliaires qui regroupent toutes les chaînes utilisées dans les différentes langues. L'arborescence couramment utilisée est la suivante :

ProgDir:Catalogs/  English/prog.catalog
                   Français/prog.catalog
                   Italiano/prog.catalog

Si vous avez défini comme préférence locale le français par exemple, la bibliothèque recherche dans l'ordre les fichiers suivants :
  • locale:catalogs/<langue>/prog.catalog.
  • progdir:catalog/<langue>/prog.catalog.
Si la bibliothèque n'arrive à ouvrir aucun de ces fichiers, la localisation échoue et le programme utilise la langue par défaut.

Les contraintes

On n'a rien sans rien. Écrire une application localisée demande un tout petit peu plus d'efforts que si vous décidiez de faire sans. Adapter un ancien programme à la localisation peut être une tâche pénible mais si vous commencez à écrire avec l'idée en tête, le travail demandé est beaucoup moins astreignant.

Pour être plus précis, l'utilisation de la localisation vous impose d'appeler une fonction chaque fois que vous manipulez une chaîne. Cette fonction fait naturellement partie de la locale.library et elle vous retourne automatiquement la phrase traduite en fonction des préférences de l'utilisateur. Il s'agit de la fonction GetCatalogStr().

Mais il ne faut surtout pas oublier les utilisateurs qui se serviront de votre programme sans posséder la locale.library. Il serait inadmissible que votre programme refuse de tourner dans ces conditions. Je vous suggère donc d'écrire une fonction comme celle que j'ai appelée getString() dans le programme d'exemple plus bas et qui vous retournera soit la phrase sélectionnée par la locale.library si celle-ci a pu s'initialiser correctement, soit une phrase par défaut dans la négative. Votre application est dans ce cas limitée à une seule langue (l'anglais est naturellemen fortement conseillé...).

Initialisation de la bibliothèque

Il faut tout d'abord faire la distinction entre une locale et un "catalog" (catalogue). Une locale est une préférence préréglée et se trouve dans votre répertoire Sys:Prefs/Presets/<nom>. Elle sera sauvée par la préférence "Locale" qui vous présente un panneau de contrôle dans lequel vous définirez votre langue de prédilection, votre décalage horaire et votre ville.

locale.library

Une fois ce paramètre réglé, chaque application ouvre son propre catalogue, qui contient toutes les chaînes qu'elle utilise. L'initialisation de la bibliothèque se fait donc en deux temps : ouverture de la locale puis ouverture du catalogue associé à votre application. Naturellement, il faut au préalable avoir ouvert la bibliothèque avec la classique fonction OpenLibrary().

Le code suivant est un exemple d'initialisation :

locale.library

Remarquez qu'en cas d'échec, le programme n'échoue pas : il se contente de signaler que la locale n'a pas pu être ouverte et il fera en sorte de s'en passer par la suite. Si vous passez en paramètre à cette fonction la valeur NULL, elle ouvrira par défaut la locale sélectionnée par l'utilisateur dans ses préférences. Mais rien ne vous empêche d'imposer au programme de s'ouvrir dans un langage précis qui ne soit pas celui des préférences. Ainsi, vous pourriez choisir d'avoir tout votre Workbench en anglais (par habitude) et de lancer ce programme en français (le paramètre à passer est alors le nom du fichier sauvegardé dans Sys:Prefs/Presets).

Le "tag" passé en paramètre à OpenCatalog(OC_BuiltInLanguage) sert à signaler le langage par défaut du programme. Ainsi, si vous demandez à ouvrir la locale "english", la fonction ne fera rien étant donné que ce langage est déjà chargé.

Utilisation pratique

Je vous suggère de faire appel à la fonction suivante pour obtenir une chaîne de la part de la bibliothèque. Cette fonction a le mérite de fonctionner même si la bibliothèque n'a pas pu s'initialiser pour une raison quelconque (pas de locale.library, pas de locale ou bien catalogue non trouvé).

locale.library

Vous passez en paramètre le numéro d'identité de la chaîne recherchée. La fonction met dans la variable "s" la chaîne par défaut (le langage dans lequel le programme est écrit par défaut). Si le catalogue a pu être ouvert, elle retourne la chaîne dans la langue correspondante, sinon elle retourne la chaîne par défaut.

La variable AppStrings est déclarée dans un fichier include qui est automatiquement généré par l'application permettant de créer les fichiers de langue. Il s'agit du programme CatComp.

Le programme CatComp

C'est le programme principal qui est utilisé pour générer les fichiers de langue utilisés par vos programmes. Il travaille sur quatre genres de fichiers :
  • Les fichiers de description (.cd), dans lesquels vous donnez des identités à vos chaînes, leur taille maximale et leur valeur par défaut. Il y a un fichier de description par application.
  • Les fichiers de traduction (.ct), dans lesquels vous spécifiez les traductions des chaînes déclarées dans le fichier de description. Il y a un fichier de traduction par langue additionnelle connue par votre programme.
  • Des fichiers include pour le C.
  • Des fichiers include pour l'assembleur.
La syntaxe de CatComp est la suivante : DESCRIPTOR/A,TRANSLATION,CATALOG/K,CTFILE/K,CFILE/K,ASMFILE/K,VB=VERBOSITY/N:.

La production d'un fichier ".catalog" (le seul utilisable par la bibliothèque) se fait en plusieurs étapes :

description -> traduction -> .catalog
                          -> include

Le fichier include généré vous permet de faire référence aux chaînes utilisées uniquement par un nom symbolique (un #define).

Vous pouvez demander au début à CatComp de générer pour vous un fichier de traduction type (c'est-à-dire qu'il laissera des blancs uniquement pour que vous y ajoutiez vos traductions). Par la suite, à mesure que votre application grandira et se verra augmentée de chaînes, vous éditerez directement le fichier de traduction (car si vous le regénériez, il vous faudrait retaper toutes les traductions entrées jusqu'alors).

Ainsi, la première génération de votre ".catalog" se fera de la façon suivante :

catcomp prog.cd ctfile français.ct

Vous éditez alors "français.ct" car il ne contient aucune traduction. Puis :

catcomp prog.cd français.ct catalog catalogs/français/prog.catalog cfile prog locale_strings.h

Cette commande joint le fichier de description et de traduction en un seul fichier utilisable par la bibliothèque : prog.catalog, qui est placé dans le répertoire "français". Il génère en même temps le fichier include nécessaire pour que vous puissiez retirer des chaînes de ce catalogue à partir de votre programme.

Par la suite, quand vous ajoutez des chaînes à votre application, vous n'avez qu'à éditer à la main "prog.cd", "français.ct" et à reproduire la dernière ligne.

Un exemple de programme localisé

Prenons un exemple simple : nous désirons écrire un programme qui parle anglais par défaut et français en plus. En fonction de l'argument donné (le nom de la locale, ici je ne considère que les cas "english" et "français"), celui-ci répondra une phrase dans la langue désirée. Le programme s'appelle "locale".

Dans un premier temps je définis la chaîne dans le fichier de description. Celui-ci s'appelle "locale.cd". C'est le fichier de référence. Tous les fichiers de traduction en seront dérivés. Notez que la langue par défaut ("built-in") est l'anglais. Je passe donc dans le répertoire "catalogs/" pour faire les manipulations suivantes :

; locale.cd ; C'est la description des chaînes utilisées par le programme.
; Les numéros entre parenthèses sont respectivement le numéro
; (qui doit être incrémenté à chaque chaîne), la taille minimale et
; la taille maximale de la chaîne (et de ses éventuelles traductions).
; Le nom générique (MSG_CHAINE) peut être utilisé directement
; dans le programme C pour peu qu'il ait inclus le fichier .h généré
; par le programme CatComp avec l'option CFILE
MSG_CHAINE (1/1/50)
Hello! This is Locale speaking
;

A partir de ce fichier, je génère un fichier de traduction vide. Comme je vais y mettre les phrases françaises, je décide de l'appeler "français.ct" :

catcomp locale.cd ctfile français.ct

Le fichier généré a l'apparence suivante :

## version $VER: XX.catalog XX.XX (XX.XX.XX)
## codeset X
## language X
;
MSG_CHAINE
; Hello! This is Locale speaking
;

Il ne vous reste plus qu'à remplir les blancs. A l'avenir, vous n'aurez plus à générer ce fichier mais à ajouter les nouvelles chaînes en respectant la syntaxe montrée dans les chaînes précédentes. Notez que CatComp vous facilite la tâche au maximum : il laisse une ligne blanche en dessous du nom générique et vous rappelle en commentaires quelle est la phrase à traduire. Notez également que les indications d'identité, longueur minimale et maximale ne sont plus nécessaires.

Après édition, le fichier "français.ct" est le suivant :

## version $VER: locale.catalog 01.00 (25.08.92)
## codeset 0
## language F
;
MSG_CHAINE
Salut! C'est Locale qui parle
; Hello! This is Locale speaking
;

Dernière étape, génération du catalogue et du fichier d'include :

catcomp locale.ct français.cd catalog catalogs /locale.catalog cfile /locale_strings.h

A ce stade, nous avons l'arborescence suivante :

locale/
   rwed 920927 20:56:08  0  Dir catalogs
   rwed 920927 20:40:15  2  942 locale.c
   rwed 920927 20:56:12  2  799 locale_strings.h
locale/catalogs
   rwed 920927 20:56:11  0  Dir français
   rwed 920927 20:56:08  1  154 français.ct
   rwed 920927 20:40:17  1  505 locale.cd
locale/catalogs/français
   rwed 920927 20:56:12  1  156 locale.catalog

Reste encore à vous donner le programme "locale.c" :

locale.library

Reste une dernière étape avant de pouvoir utiliser notre programme : créer les locales. Pour cela, j'appelle le programme Sys:Prefs/Locale, je définis quelques paramètres et je les sauvegarde dans Sys:Prefs/Presets/<nom>. Je pourrai alors utiliser <nom> comme paramètre au programme locale. On obtient bien le résultat escompté :

1> locale english
Hello! This is Locale speaking
1> locale français
Salut! C'est Locale qui parle
1>

Conclusion

Bien sûr, il ne s'agit que d'un exemple. Une application bien programmée devrait essayer d'ouvrir la locale par défaut si on ne lui en impose aucune (alors qu'ici, je sors du programme). La locale.library possède beaucoup d'autres fonctions destinées à simplifier au maximum les traitements sur les divers alphabets et notations, notamment sur les manipulations de caractères et de dates. Quoi qu'il en soit, vous devriez maintenant avoir une idée très précise sur l'immense progrès apporté par cette bibliothèque. Alors désormais, pensez international !


[Retour en haut] / [Retour aux articles]