10.5 Localisation

Écrit par Neil Deakin , mise à jour par les contributeurs à MDC .
Traduit par BrainBooster (22/07/2004), mise à jour par Alain B. (04/04/2007) .
Page originale : http://developer.mozilla.org/en/docs/XUL_Tutorial/Localization

Attention : Ce tutoriel est ancien et n'est pas mis à jour. Bien que beaucoup d'informations soient encore valables pour les dernières versions de gecko, beaucoup sont aussi obsolètes. Il est préférable d'aller consulter cette page sur la version française de ce tutoriel sur developer.mozilla.org.

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, une table de chaînes de caractères 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 déjà écrit en HTML. Les codes < et > sont des exemples d'entités qui peuvent être utilisées pour placer les signes "inférieur" et "supé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ères. Des entités peuvent être employées toutes les fois où du texte est utilisé, y compris pour 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 contenant les déclarations d'entités pour chaque langue supportée est créé. En français, on affectera probablement la valeur de texte Rechercher à 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ées 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é qu'il aura une extension .dtd. Donc pour la fenêtre de dialogue de recherche de fichiers, vous aurez besoin d'un fichier nommé findfile.dtd.

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

Note : Vous devez encoder les fichiers en UTF-8 à cause des caractères non ASCII. De ce fait, vous devez les sauvegarder au format UTF-8 (sans BOM). Pour plus d'information, consultez Mozilla language Packs.

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. Il vous suffit d'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.

Vous devez également ajouter la localisation dans le fichier chrome.manifest, par exemple :

locale my_extension en-US locale/english.dtd

Déclarer les entités

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

<!ENTITY findLabel "Rechercher">

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

pour l'anglais:
<!ENTITY findLabel "Find">

Par exemple, le texte suivant :

<description value="&findLabel;"/>

est converti en :

version française:
<description value="Rechercher"/>

version anglaise
<description value="Find"/>

Vous devrez déclarer une entité pour chaque libellé ou chaîne de caractères 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 selon la langue. Les touches d'accès et les raccourcis claviers par exemple.

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

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

Modification de la boîte de dialogue de recherche de fichiers

Jetons un oeil sur la manière dont nous pourrions utiliser tout ce que nous avons appris en modifiant la boîte de dialogue de recherche de fichiers de manière à ce qu'elle utilise un fichier DTD pour toutes ses chaînes de caractères. 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;"
           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é inclu 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é non déclarée est trouvée dans le fichier 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 aurez noter que le texte 2520 octets a été remplacé par deux entités. En fait, la structure de la phrase pourrait être différente dans une autre langue. Par exemple, le nombre pourrait apparaître après l'équivalent du mot 'octets' au lieu d'avant. Bien sûr, il est beaucoup plus compliqué de vouloir 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 "Sauvegarder une recherche...">
<!ENTITY closeCmd.label "Fermer">
<!ENTITY openCmd.accesskey "o">
<!ENTITY saveCmd.accesskey "s">
<!ENTITY closeCmd.accesskey "f">
<!ENTITY cutCmd.label "Couper">
<!ENTITY copyCmd.label "Copier">
<!ENTITY pasteCmd.label "Coller">
<!ENTITY cutCmd.accesskey "p">
<!ENTITY copyCmd.accesskey "c">
<!ENTITY pasteCmd.accesskey "l">
<!ENTITY cutCmd.commandkey "X">
<!ENTITY copyCmd.commandkey "C">
<!ENTITY pasteCmd.commandkey "V">
<!ENTITY openCmdToolbar.label "Ouvrir">
<!ENTITY saveCmdToolbar.label "Sauvegarder">
<!ENTITY searchTab "Rechercher">
<!ENTITY optionsTab "Options">
<!ENTITY findDescription "Entrez votre critère de recherche ci-dessous et appuyer sur le bouton Rechercher.">
<!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 "Recherche sensible à la casse">
<!ENTITY matchfilename "Rechercher un nom entier">
<!ENTITY results.filename "Nom de fichier">
<!ENTITY results.location "Emplacement">
<!ENTITY results.size "Taille">
<!ENTITY bytes.before "">
<!ENTITY bytes.after "octets">
<!ENTITY button.find "Rechercher">
<!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.


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


Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.