xulfr.org

9.5 Localisation

Écrit par Neil Deakin. Traduit par BrainBooster (22/07/2004).
Page originale : http://www.xulplanet.com/tutorials/xultu/locale.html xulplanet.com

XUL et XML fournissent des entités qui sont une solution permettant la localisation.

Entités

De nombreuses applications sont construites de telle sorte que la traduction de l'interface en différentes langues soit le plus simple possible. En général, un table de chaînes est créée pour chaque langue. Au lieu de la coder directement dans l'application, chaque partie de texte est seulement une référence dans la table de chaînes. XML fournit des entités qui peuvent être utilisées dans un but similaire.

Vous devriez déjà être familier avec les entités si vous avez écrit du HTML. Les codes < et > sont des exemples d'entités qui peuvent être utilisées pour placer les signes "supérieur" et "inférieur" dans le texte. XML a une syntaxe qui autorise la déclaration de vos propres entités. Vous pouvez les utiliser de manière à ce que l'entité soit remplacée par sa valeur, qui peut être une chaîne de caractère. Des entités peuvent être employées toutes les fois où du texte est utilisé, y compris les valeurs des attributs. L'exemple ci-dessous décrit l'utilisation d'une entité dans un bouton.

<button label="&findLabel;"/>

Le texte qui apparaîtra sur le libellé sera la valeur de l'entité &findlabel;. Un fichier est créé contenant les déclarations d'entités pour chaque langue supporté. En français, on affectera probablement la valeur de texte 'Trouver' à l'entité &findlabel;.

Les fichiers DTD

Les entités sont déclarées dans des fichiers DTD (Document Type Declaration). Ces types de fichiers sont en général utilisés pour déclarer la syntaxe et la sémantique d'un fichier XML particulier, mais ils autorisent aussi la déclaration d'entités. Dans le système chrome de Mozilla, vous trouverez les fichiers DTD dans le sous-répertoire locales. Vous devriez normalement avoir un fichier DTD (avec un extension DTD) par fichier XUL.

Si vous regardez dans le répertoire chrome, vous devriez voir une archive pour votre langue (fr-FR.jar par défaut pour le français). Vous pouvez avoir les fichier de locales dans des langues multiples, par exemple, Anglais US (en-US) et danois (dk). Dans ces archives vous trouverez les fichiers qui contiennent les traductions pour chaque fenêtre. La structure de l'archive est très similaire à la structure des répertoires utilisée pour les thèmes.

Dans les archives, vous placerez les fichiers DTD, dans lesquels vous déclarez les entités. Normalement vous aurez un fichier DTD par fichier XUL, en général avec le même nom de fichier excepté pour l'extension .dtd. Donc pour la fenêtre de dialogue de recherche de fichiers, vous aurez besoin d'un fichiers nommé findfile.dtd.

Pour les fichier chromes non installés, vous pouvez juste mettre le fichier DTD dans le même répertoire que le fichier XUL.

Une fois que vous avez créé le fichier DTD pour votre fichier XUL, vous aurez besoin d'ajouter une ligne dans le fichier XUL qui indiquera que vous voulez utilisez le fichier DTD. Sinon, des erreurs seront générées car il ne sera pas capable de trouver les entités. Pour faire ceci, ajoutez une ligne de la forme suivante vers le début du fichier XUL :

<!DOCTYPE window SYSTEM "chrome://findfile/locale/findfile.dtd">

Cette ligne spécifie que l'URL indiquée est à utiliser en tant que fichier DTD. Dans ce cas, nous avons déclaré que nous voulons utiliser le fichier DTD findfile.dtd. Cette ligne est en général placée juste avant l'élément window.

Déclarer les entités

Les entités sont déclarées en utilisant une syntaxe simple vue ci-dessous :

<!ENTITY findLabel "Trouver">

Cet exemple crée une entité avec le nom findLabel et la valeur Trouver. Cela signifie que quelque soit l'endroit où le texte &findLabel; apparaîtra dans le fichier XUL, il sera remplacé par le texte Trouver. Dans le fichier DTD d'une autre langue, le texte pour cette langue sera utilisé à la place. Notez que les déclarations d'entités n'ont pas de slash final à la fin.

Par exemple, le texte suivant :

<description value="&findLabel;"/>

est traduit en :

<description value="Trouver"/>

Vous devrez déclarer une entité pour chaque libellé ou chaîne de caractère que vous utiliserez dans votre interface. Vous ne devriez plus avoir de texte affiché directement dans le fichier XUL.

En plus d'utiliser les entités pour les libellés, vous devriez les utiliser pour chaque valeur qui pourrait être différente dans chaque langue. Les touches d'accès et les raccourcis claviers par exemple.

<menuitem label="&undo.label;" accesskey="&undo.key;"/>
<!ENTITY undo.label "Undo">
<!ENTITY undo.key "u">

L'exemple ci-dessus utilise deux entités, une pour le libellé de l'élément de menu Undo et une seconde pour la touche d'accès.

Changer la boite de dialogue de recherche de fichier

Jetons un oeil sur la manière dont nous pourrions utiliser tout ce que nous avons appris en modifiant la boite de dialogue de recherche de fichier de manière à ce qu'elle utilise un fichier DTD pour toutes ses chaînes. La totalité du fichier XUL est décrite ci-dessous avec les changements décrits en rouge.

<?xml version="1.0"?>

<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="findfile.css" type="text/css"?>

<!DOCTYPE window SYSTEM "chrome://findfile/locale/findfile.dtd">

<window
  id="findfile-window"
  title="&findWindow.title;"
  persist="screenX screenY width height"
  orient="horizontal"
  onload="initSearchList()"
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script src="findfile.js"/>

<popupset>
   <popup id="editpopup">
     <menuitem label="Cut" accesskey="&cutCmd.accesskey;"/>
     <menuitem label="Copy" accesskey="&copyCmd.accesskey;"/>
     <menuitem label="Paste" accesskey="&pasteCmd.accesskey;" disabled="true"/>
   </popup>
</popupset>

<keyset>
   <key id="cut_cmd" modifiers="accel" key="&cutCmd.commandkey;"/>
   <key id="copy_cmd" modifiers="accel" key="&copyCmd.commandkey;"/>
   <key id="paste_cmd" modifiers="accel" key="&pasteCmd.commandkey;"/>
   <key id="close_cmd" keycode="VK_ESCAPE" oncommand="window.close();"/>
</keyset>

<vbox flex="1">

 <toolbox>

  <menubar id="findfiles-menubar">
    <menu id="file-menu" label="&fileMenu.label;"
        accesskey="&fileMenu.accesskey;">
      <menupopup id="file-popup">
        <menuitem label="&openCmd.label;"
                  accesskey="&openCmd.accesskey;"/>
        <menuitem label="&saveCmd.label;"
                  accesskey="&saveCmd.accesskey;"/>
        <menuseparator/>
        <menuitem label="&closeCmd.label;"
                  accesskey="&closeCmd.accesskey;" key="close_cmd" oncommand="window.close();"/>
      </menupopup>
    </menu>
    <menu id="edit-menu" label="&editMenu.label;"
          accesskey="&editMenu.accesskey;">
      <menupopup id="edit-popup">
        <menuitem label="&cutCmd.label;"
                  accesskey="&cutCmd.accesskey;" key="cut_cmd"/>
        <menuitem label="&copyCmd.label;"
                  accesskey="&copyCmd.accesskey;" key="copy_cmd"/>
        <menuitem label="&pasteCmd.label;"
                  accesskey="&pasteCmd.accesskey;" key="paste_cmd" disabled="true"/>
      </menupopup>
    </menu>
  </menubar>

  <toolbar id="findfiles-toolbar">
    <toolbarbutton id="opensearch" label="&openCmdToolbar.label;"/>
    <toolbarbutton id="savesearch" label="&saveCmdToolbar.label;"/>
  </toolbar>
 </toolbox>

 <tabbox>
  <tabs>
    <tab label="&searchTab;" selected="true"/>
    <tab label="&optionsTab;"/>
  </tabs>

  <tabpanels>

   <tabpanel id="searchpanel" orient="vertical" context="editpopup">

   <description>
     &findDescription;
   </description>

   <spacer class="titlespace"/>

   <groupbox orient="horizontal">
     <caption label="&findCriteria;"/>

     <menulist id="searchtype">
       <menupopup>
         <menuitem label="&type.name;"/>
         <menuitem label="&type.size;"/>
         <menuitem label="&type.date;"/>
       </menupopup>
     </menulist>
   <spacer class="springspace"/>
     <menulist id="searchmode">
       <menupopup>
         <menuitem label="&mode.is;"/>
         <menuitem label="&mode.isnot;"/>
       </menupopup>
     </menulist>
   <spacer class="springspace"/>

   <menulist id="find-text" flex="1"
             editable="true"
             datasources="file:///mozilla/recents.rdf"
             ref="http://www.xulplanet.com/rdf/recent/all">
     <template>
       <menupopup>
         <menuitem label="rdf:http://www.xulplanet.com/rdf/recent#Label" uri="rdf:*"/>
       </menupopup>
     </template>
   </menulist>

   </groupbox>

  </tabpanel>

  <tabpanel id="optionspanel" orient="vertical">
     <checkbox id="casecheck" label="&casesensitive;"/>
     <checkbox id="wordscheck" label="&matchfilename;"/>
    </tabpanel>

  </tabpanels>
 </tabbox>

 <tree id="results" style="display: none;" flex="1">
   <treecols>
     <treecol id="name" label="&results.filename;" flex="1"/>
     <treecol id="location" label="&results.location;" flex="2"/>
     <treecol id="size" label="&results.size;" flex="1"/>
   </treecols>

   <treechildren>
     <treeitem>
       <treerow>
         <treecell label="mozilla"/>
         <treecell label="/usr/local"/>
         <treecell label="&bytes.before;2520&bytes.after;"/>
       </treerow>
     </treeitem>
   </treechildren>
 </tree>

 <splitter id="splitbar" resizeafter="grow" style="display: none;"/>

 <spacer class="titlespace"/>

 <hbox>
   <progressmeter id="progmeter" value="50%" style="display: none;"/>
   <spacer flex="1"/>
   <button id="find-button" label="&button.find;" default="true"
           oncommand="doFind()"/>
   <button id="cancel-button" label="&button.cancel;"
           oncommand="window.close();"/>
 </hbox>
</vbox>

</window>

Chaque chaîne de caractères a été remplacée par une référence à une entité. Un fichier DTD a été inclus au début du fichier XUL. Chaque entité qui a été ajoutée doit être déclarée dans le fichier DTD. La fenêtre ne sera pas affichée si une entité qui n'est pas déclarée est trouvée dans le fichiers XUL.

Notez que le nom de l'entité n'est pas important. Dans l'exemple ci-dessus, les mots dans les entités ont été séparés par des points. Vous n'avez pas a faire ça. Les noms des entités ici suivent des conventions similaires au reste du code de Mozilla.

Vous pourriez noter que le texte '2520 octets' a été remplacé par deux entités. Ceci parce que la structure de la phrase pourrait être différente dans une autre langue. Par exemple, le nombre pourrait apparaître avant l'équivalent de 'octets' au lieu d'après. bien sûr, cela pourrait être plus compliqué pour l'affichage des Ko ou des Mo selon les besoins.

Les touches d'accès et les raccourcis claviers ont aussi été traduits dans les entités car ils seront peut être différents dans une autre langue.

Voici le fichier DTD (findfile.dtd):

<!ENTITY findWindow.title "Recherche de fichiers">
<!ENTITY fileMenu.label "Fichier">
<!ENTITY editMenu.label "Edition">
<!ENTITY fileMenu.accesskey "f">
<!ENTITY editMenu.accesskey "e">
<!ENTITY openCmd.label "Ouvrir une recherche...">
<!ENTITY saveCmd.label "Sauver une recherche...">
<!ENTITY closeCmd.label "Fermer">
<!ENTITY openCmd.accesskey "o">
<!ENTITY saveCmd.accesskey "s">
<!ENTITY closeCmd.accesskey "c">
<!ENTITY cutCmd.label "Couper">
<!ENTITY copyCmd.label "Copier">
<!ENTITY pasteCmd.label "Coller">
<!ENTITY cutCmd.accesskey "t">
<!ENTITY copyCmd.accesskey "c">
<!ENTITY pasteCmd.accesskey "p">
<!ENTITY cutCmd.commandkey "X">
<!ENTITY copyCmd.commandkey "C">
<!ENTITY pasteCmd.commandkey "V">
<!ENTITY openCmdToolbar.label "Ouvrir">
<!ENTITY saveCmdToolbar.label "Sauver">
<!ENTITY searchTab "Rechercher">
<!ENTITY optionsTab "Options">
<!ENTITY findDescription "Entrez vos critères de recherche ci-dessous et selectionnez le bouton de recherche pour démarrer.">
<!ENTITY findCriteria "Critère de recherche">
<!ENTITY type.name "Nom">
<!ENTITY type.size "Taille">
<!ENTITY type.date "Date de modification">
<!ENTITY mode.is "Est">
<!ENTITY mode.isnot "N'est pas">
<!ENTITY casesensitive "Respecter la casse">
<!ENTITY matchfilename "Rechercher un nom entier">
<!ENTITY results.filename "Nom de fichier">
<!ENTITY results.location "Endroit">
<!ENTITY results.size "Taille">
<!ENTITY bytes.before "">
<!ENTITY bytes.after "octets">
<!ENTITY button.find "Chercher">
<!ENTITY button.cancel "Annuler">

Maintenant pour changer de langue, tout ce que vous avez à faire est de créer un nouveau fichier DTD. En utilisant le système chrome pour ajouter le fichier DTD dans une langue différente, le même fichier XUL peut être utilisé pour toutes les langues.


Pour la prochaine, nous regarderons les fichiers de propriétés.