NIH ou Aide interactive multi-langues

(Système d'aide interactive permettant une cohabitation harmonieuse entres applications anglophones et applications traduites)
La version courante est 0.2
Auteur: Benoît GILON
Logo de HTMLEdit v3


Présentation du contexte

Le système d'internationalisation d'applications sous RISC OS est sans doute l'un des plus flexibles qui soit sur notre planète.
Pour les personnes souhaitant développer des applications multi-langages, elles utilisent alors les outils standard de développement, avec un fichier par type de ressource et langue supportée (ou un répertoire par langue supportée).
Les applications écrites en BASIC peuvent tirer parti de la perle d'astuce au sein du code ResFind (écrit par Olaf krumnow et Herbert zur Hedden du German Archimedes Group).
Les programmes écrits en C peuvent tirer profit du programme SetRes écrit par votre serviteur pour toutes les applications Toolbox (ou bien se référer à l'article Local pour des applications utilisant la RISCOSlib).
L'aide interactive permet aux applications clientes, lorsqu'elles retournent des messages à afficher dans la fenêtre de l'application !Help, de spécifier au sein du texte des tokens qui sont ensuite traduits par l'application !Help en messages en clair après consultation dans un dictionnaire.
Cela permet de raccourcir les données échangées (et donc permet de faire tenir la totalité du texte dans un unique message Wimp).
Chaque token est préfixé au sein du texte transmis par un caractère d'échappement qui est la barre inverse '\' et son code se trouve représenté par un unique caractère dont le code est supérieur à l'espace.
Vous pouvez vous rendre compte de ce mécanisme en consultant les fichiers dont le chemin d'accès correspond au pattern 'Resources:$.Resources.*.Messages'. Allez dans les sous répertoires correspondant à toute application tournant sous le bureau.
Malheureusement, le bénéfice de cette facilité ne pouvait s'effectuer que si toutes les applications utilisent la même langue. A priori, cela doit être l'Anglais parce que:
Si vous vous contentez de traduire les définitions des tokens dans le fichier Messages local à l'application !Help. Vous vous retrouverez avec des messages "franglais" du plus beau style du type:
"Cliquez SELECT pour merge the paths.". La partie italique soulignée et de couleur rouge provient de la traduction du token '\S' effectuée par l'application !Help. et le reste du message a comme origine l'application cliente, anglophone nouvellement installée.
Ma nature maniaque (disons perfectionniste ;-) me sussure que cela ne doit pas se produire sur un bureau d'une machine dont je vante par ailleurs les qualités d'ergonomie auprès de mes collègues de bureau.
Donc et jusqu'à maintenant, toutes les définitions destinées à l'aide interactive présentes dans les fichiers de ressources pour une langue supportée autre que l'Anglais ne comportent aucun token.
Ceci implique:

Fonctionnalité des outils proposés

Ce qui est proposé dans le présent article est une méthode permettant la gestion par une application !Help patchée de deux jeux de tokens séparés: Bien entendu, les nouvelles applications localisées utiliseront dans leur fichier de ressources le nouveau jeu de tokens. La sélection du nouveau jeu s'effecturea en dédoublant le préfixe '\'. Ainsi, la donnée "\\Srassembler les chemins." transitant vers l'application !Help provoquera l'affichage du message "Cliquez SELECT pour rassembler les chemins." dans la fenêtre !Help.
Cela implique:

Patch de l'application !Help (fichier !RunImage)

La procédure chargée de la traduction des données incluses dans le message provenant de l'application cliente est la procédure "e" dont le code suivant est une partie:
DEFPROCe:LOCALx%,T%,M%,A%,p%,m%,N%,I%,y%,oa%: \
SYS39,a%+20,n%,512+(1<<31)TOp%,,A%:A%+=n%:?A%=13:p%?-1=13:t$=$(a%+20):IFt$=c$ENDPROC
c$=t$:y%=J%:FORx%=n%TOA%:?y%=?x%:IF?x%<>ASC("\")THEN
y%+=1
ELSE:x%+=1:IF?x%=ASC("\")THEN
y%+=1
ELSE:$(y%)=FNa("T"+CHR$(?x%)):IF?y%=ASC("T")AND?(y%+1)=?x%ANDLEN($(y%))=2THEN?y%=ASC("\")
y%+=LEN($(y%))
ENDIF
ENDIF
Le code suivant est la version patchée: une variable locale z$ supplémentaire contient la première lettre du token à chercher dans le fichier Messages local.
DEF PROCe:LOCAL x%,T%,M%,A%,p%,m%,N%,I%,y%,oa%,z$: \
SYS39,a%+20,n%,512+(1<<31)TOp%,,A%:A%+=n%:?A%=13:p%?-1=13:t$=$(a%+20):IF t$=c$ENDPROC
c$=t$:y%=J%:FOR x%=n%TOA%:?y%=?x%:IF?x%<>ASC("\")THEN
y%+=1
ELSE:x%+=1:IF?x%=ASC("\")THENx%+=1:z$="U"ELSEz$="T"
$(y%)=FNa(z$+CHR$(?x%)):IF?y%=ASC(z$)AND?(y%+1)=?x%ANDLEN($(y%))=2THEN?y%=ASC("\")
y%+=LEN($(y%))
ENDIF

Mise en place de la variable Help$Path

Cela se fait habituellement au sein du fichier !Run de l'application !Help. Comme !Help est une application BASIC, il est naturel d'adopter la solution de l'utilisation de ResFind.
Voici le fichier d'origine de !Run situé dans Resources:$.Apps.!Help:
| > !Run
| Check for the required amount of memory first
WimpSlot -min 32K -max 32K
| Having succeeded there, do not start up if
| Help is already running.
If "<Help$Dir>"<>"" Then Error Help is already running
| Then start the application
Set Help$Dir <Obey$Dir>
Set Help$Path <Obey$Dir>.,Resources:$.Resources.Help.
Run Help:!RunLink
Et maintenant le nouveau fichier (une version modifiée existe et se trouve dans l'archive si l'application doit être accessible à travers l'icône Apps de la barre d'icônes; utilisation de la commande RISC OS AddAp).
| > !Run
| Check for the required amount of memory first
WimpSlot -min 32K -max 32K
| Having succeeded there, do not start up if Help is already running.
If "<Help$Dir>"<>"" Then Error Help is already running
| Then start the application
Run <Obey$Dir>.Resources.ResFind
Unset HelpRes$Path
Unset Help$Dir
If "<HelpRes$Dir>"="<Obey$Dir>" Then /Resources:$.Apps.!Help
Set Help$Path <HelpRes$Dir>.,Resources:$.Resources.Help.
Unset HelpRes$Dir
Set Help$Dir Resources:$.Apps.!Help
Run <Obey$Dir>.!RunImage

Modification des applications clientes

Applications utilisant la Toolbox

Nous nous appliquerons à transformer des applications clientes utilisant le programme SetRes maintes fois utilisées dans les applications que j'ai écrites.
Pour mémoire, SetRes positionne une variable d'environnement <AppNameR$Dir> en fonction d'un paramètre fourni en entrée "<AppName>" et de la valeur du country couramment positionné.
Pour toute langue supportée, nous aurons deux fichiers res (en présumant que tous les textes de messages à destination de l'aide interactive se trouvent dans ce fichier).
  1. Un fichier se trouvant dans <AppNameR$Dir> pour les messages n'utilisant pas les tokens;
  2. Un fichier se trouvant dans <AppNameR$Dir>.nhelp pour les messages utilisant les tokens.
Le problème avec l'API toolbox_initialize est qu'elle requiert que le chemin où trouver les fichiers res et Messages soit unique et ne semble pas accepter de désignation de pseudo FS pour contourner ce point.
Pour le moment, nous dupliquerons le fichier Messages dans chaque répertoire. Peut être une solution plus économe verra le jour dans quelques temps. Le choix de sélectionner un fichier ou un autre se fera sur les critères suivants: Le nouveau fichier nhelp.res sera choisi si toutes les conditions suivantes sont respectées: Le programme qui assure ces vérifications est un petit programme BASIC (s'appuyant sur du code tiré de ResFind) et qui est joint à l'archive.
Ce programme part de la valeur actuelle de la variable <AppName>R$Dir et va l'enrichir en fonction des conclusions sur les fait exposé ci-dessus.

Applications en BASIC ou utilisant la RISCOSLib

Le mécanisme de mise à jour des applications BASIC s'effectue par utilisation de deux petits modules écrits eux-même en BASIC. La variable système sera actualisée si toutes les assertions suivantes se révèlent vraies: Le changement de valeur de la variable s'opérant, un essai d'accéder au fichier par la désignation AppNameRes:Messages accédera au fichier <AppNameRes$Dir>.nhelp.Messages et non plus <AppNameRes$Dir>.Messages.

Parmi les applications de ce type qui ont été converties afin de les rendre compatibles avec NIH, on peut citer la dernière version de !Player de ESP ainsi que le résultat de mon initiative de localisation de !StrongED (4.62) que vous pourrez trouver également sur ce site.

Une application "Helper": !NIHTool

Celle-ci est un outil vous aidant dans les tâches suivantes: Typiquement, le processus peut être résumé: il considère trois entrées (dont deux sont des fichiers, et la dernière étant un jeu d'options positionnées par l'utilisateur de l'outil). Ces deux paramètres (et d'autres) peuvent être entrés avec l'aide de la boîte de dialogue ci-dessous:
NIHTool setup window

Les options plus ésotériques peuvent être activées par utilsation du menu surgissant (popup) ci-dessous:

NIHTool setup menu

Conclusion

Après ces quelques aménagements, vous aurez un système: A ceux qui s'emploient à traduire des briques du système RISC OS, j'espère que la lecture de cet article les aura aidé. N'hésitez pas à me contacter pour toute demande de renseignements complémentaires.

Toute remarque constructive est la bienvenue.

La traduction des messages de l'application !Help elle même ainsi que des définitions des tokens (texte en clair) n'est pas terminée à ce jour; (une version complète verra le jour sur ce site).
La première application qui va adopter ce dispositif sera mon carnet d'addresses sous RISC OS, suivie de toute nouvelle application que je pourrais écrire.