Les bibliothèques JMRI sont destinées à être utilisables dans le monde entier. Pour ce faire, ils font usage des fonctionnalités "internationalisation" intégrées dans le langage Java et les bibliothèques.
JMRI utilise les paramètres locaux par défaut pour localiser l'information d'internationalisation. Cela signifie que JMRI présentera son interface utilisateur dans le langage Java défini comme la valeur par défaut pour cet ordinateur.
Les locales sont spécifiées par une Langue, et éventuellement un Pays. La langue est un code à deux lettres minuscules; le pays est une code de deux lettre majuscules. "en" est l'anglais, "fr" est le français , "de" est l'allemand, et "de_CH" est l'allemand parlé en Suisse.
Lorsque Java cherche des ressources ( voir ), il recherche d'abord un fichier avec la Locale complète en cours à la fin de son nom (foo_de_CH.properties, par exemple). Si cela échoue, il tente un fichier se terminant seulement par la localisation de la langue en cours : foo_de.properties. Et si cela échoue, il va à la valeur par défaut sans suffixe: foo.properties. Un mécanisme similaire est utilisé au sein des fichiers XML.
En installant les fichiers appropriés et en permettant à l'utilisateur de sélectionner la locale par défaut (dans le cadre des préférences avancées), nous pouvons adapter le programme aux différents pays et langues.
Par exemple, le fichier de propriétés qui est utilisé pour configurer le fichier
panneau contient des lignes telles que:
FieldRoadName = Nom de Route:
A la gauche du signe égal est le nom de la ressource que le programme utilise
pour se référer à la chaîne, à droite du signe égal est la
chaîne qui sera affichée.
Par convention, les noms des éléments de ressource de l'interface graphique commence par l'un des termes
Obtenir une copie propre du code source depuis le référentiel source JMRI. (Pour plus d'informations pour le faire , Svp voir la page sur l'obtention d'une copie du code.)
cd java/src/apps cp AppsBundle.properties AppsBundle_xy.propertieset ainsi de suite. La meilleure façon de trouver les suffixes appropriés consiste à définir le programme de votre Langue particulière via les préférences avancées , -->Affichage --> et onglet Langue, quitter et redémarrer le programme, et puis regarder le suffixe que le module JMRI affiche adans l'écran de démarrage/fenêtre principale ( ligne du bas, entre les crochets après la version Java ).. Vous pouvez également consulter la liste officielle des langues (première partie du suffixe) et liste des pays/régions (deuxième partie optionnelle du suffixe).
Vous pouvez ensuite modifier les fichiers dans une langue spécifique pour saisir du texte dans dans votre propre langue.
Les lignes dans le fichier qui contiennent quelque chose comme $Release: $;
sont des vestiges des vieux systèmes de contrôle de version; elles peuvent être ignorées ou effacées.
Ils y a plusieurs fichiers .properties* qui sont utilisés qui sont utilisés pour des contrôles internes,
et ne doivent pas être traduit. Ils sont marqués par un commentaire en haut
du fichier. Les exemples sont les fichiers apps/AppsStructureBundle.properties
jmri/web/server/Services.properties
et jmri/web/server/FilePaths.properties
.
Le dossier xml/config/parts/jmri/
contient des chaines de texte supplémentaires pour
traduire pour les programmeurs etc. Juste comme dans fichier décodeur XML,
les chaines traduites sont insérées comme des éléments
<name xml:lang="da">Votre Traduction</name>
dans chaque nœud.
Nous fournissons une liste d'éditeurs pour travailler efficacement
sur ces fichiers
S'il ya un problème à ce stade, vérifier pour voir quel est le langage figurant sur l'écran de démarrage de l'application. Montre-t-il le même suffixe (par exemple _fr ou _cs_CZ) que celui donné donné à vos fichiers? Le suffixe que le programme utilise est déterminé par la locale sélectionné dans les préférences ci-dessus.
Pour rendre votre travail disponible aux autres utilisateurs JMRI, s'il vous plaît partager avec nous. Pour ce faire:
svn diff java/src> patch.txt
et les utilisateurs de Windows peuvent faire la même chose avec leur application SVN.
<variable label="Vmid" CV="6" default="22" item="Vmid"> <decVal max="64"/> <label> Vmid </label> <label xml:lang="fr"> Vmoy </label> </variables>
Dans les fichiers XML, les attributs de "l'élément" doivent rester non traduit, comme le fait la totalité du fichier xml/names.xml.
Les fichiers d'aide en anglais se trouvent dans le répertoire help/en. Si vous voulez créer un ensemble complet de fichiers:
<html lang="fr">
.JMRI se dirige vers un ensemble de conventions sur la façon de structurer et utiliser la grande quantité d'informations I18N nécessaire. Vous pourrez toujours trouver le code avec des approches plus anciennes, mais vous devrez écrire un nouveau code à l'aide des nouvelles conventions décrites ci-dessous
Les groupements des ressources JMRI sont organisées dans un arbre hiérarchisé.
Par exemple, le code dans le paquet jmri.jmrit.display
peut trouver une ressource dans un groupement dans le paquet jmri.jmrit.display
, le paquet
jmri.jmrit
ou enfin le paquet jmri
. Comme un cas particulier dans ce domaine, le paquet apps*
est
considéré comme étant en dessous du paquet jmri
lui-même, de sorte que le code dans
l'arborescence des apps*
peut aussi référencer le paquet jmri
.
Les références croisées-paquet, par exemple entre jmri.jmrit
et jmri.jmrix
, sont découragées
et celles qui existent sont supprimées.
L'accès se fait via une classe groupement locale pour chaque paquet. Une caractéristique est une
jmri.jmrit.Bundle
.
Il propose deux méthodes clés á utiliser pour accéder (traduit) à la chaine ressource:
static String getMessage(String key) static String getMessage(String key, Object ... subs)
La première offre un accès direct à une chaîne via
String msg = Bundle.getMessage("Titre")
La seconde permet d'insérer des informations spécifiques dans un message du genre
Nom Système LT1 est déjà utilisé
Ici "LT1" ne peut pas être dans le fichier .properties, car il n'est connu seulement que lorsque le programme est exécuté. Différentes langues peuvent mettre cette partie du message dans différents endroits, et accepter que se soit important. Cela a abouti à mettre un espace réservé dans la définition du message:
Error123 = Nom système {0} est déjà en cours d'utilisation
{1}
, {2}
, etc)
Ensuite, formater le message final en insérant le contenu en elle:
String msg = Bundle.getMessage("Erreur123", badname);
Le premier argument est la clé du message suivie par une ou plusieurs chaînes de caractères à insérer dans le message. (C'est mieux que de créer votre propre chaîne de sortie en utilisant par exemple String.format () car elle permet aux termes insérés d'apparaître dans des ordres différents dans différentes langues.)
Différentes langues peuvent avoir besoin d'un nombre différent de lignes pour exprimer un message, ou peut-être besoin de le casser avant ou après qu'une valeur particulière ait été insérée. Il est donc préférable d'utiliser "\n" dans un un message unique pour créer des sauts de ligne, plutôt que de fournir plusieurs lignes dans le code lui-même.
Certaines parties de JMRI restent en Anglais en raison de notre population de développeurs.
En particulier, des commentaires et des noms de variables dans le code doivent rester en
Anglais, comme les messages envoyés sur le système de rapport.
Dans le code Java, ces chaînes peuvent être marqués avec un commentaire "// NOI18N
"
ajouté à la fin de la ligne. Si nécessaire, mettre ceci après un autre commentaire:
firePropertyChange("size", oldSize, newSize); // promptly! // NOI18N
Si votre paquet ne possède pas déjà une classe Bundle*, vous pouvez l'ajouter par:
java/src/jmri/jmrit/Bundle.java
dans votre paquet comme:
java/src/jmri/mypackage/Bundle.java
Bundle.properties
dans votre répertoire package
pour contenir vos propriétés de chaînes de caractères.java/test/jmri/jmrit/BundleTest.java
à votre
Répertoire de test JUnit pour vérifier que vos chaînes fonctionnent:
java/test/jmri/jmrit/BundleTest.java
dans java/test/jmri/mypackage/BundleTest.java
suivie de la modification de la déclaration de votre paquet dans ce fichier pour pointer vers votre
paquet, en ajoutant un peu de vos chaînes pour les tests (y compris ceux que vous
référencez à partir des bundles parents, le cas échéant), et incluant une référence
dans votre classe PackageTest.
java.util.ResourceBundle.getBundle ("jmri.jmrit.beantable.LogixTableBundle");
L'argument getBundle est le nom du paquet complet (non pas le fichier) pour le fichier propriété de cette classe qui sera utilisé. Vous pouvez avoir à référencer plus d'un de ces objets si vous voulez regarder les chaînes dans plus d'un fichier properties.
Vous pouvez ensuite récupérer des chaînes particulières comme ceci:
java.util.ResourceBundle.getBundle ("jmri.jmrit.beantable.LogixTableBundle") getString ("ButtonNew").;
Nous vous recommandons de ne définir qu'une variable de classe statique pour maintenir la
référence à l'objet Bundle, cela finit par consommer beaucoup
de mémoire permanente dans un programme de la taille de JMRI. Allez-y et
appeler le getBundle ()
à chaque fois, c'est rapide, car il fonctionne à travers
un cache faiblement référencé et nettoyeur de la mémoire.
String choice = LocaleSelector.getAttribute (choiceElement, "choice")
où "choiceElement" est un objet Element JDOM contenant un (Traduction possible)
attribut "choix". "Null" sera retourné si rien n'est trouvé.
Les nombres "10*10*10+2+3/10" est écrit dedifférentes manières en des emplacements différents: "1002,3", "1,002.3", "1.002,3" et peut-être d'autres choses.
JMRI fournit un utilitaire utile pour manipuler ceux-ci sur l'entrée:
double d = jmri.util.IntlUtilities.doubleValue("1,002.3"); float f = jmri.util.IntlUtilities.floatValue("1,002.3");
Notez que cela peut lancer une java.text.ParseException
, si l'entrée est non
analysable.
Si tout va bien, tout le texte du message aura été traduit en MAJUSCULES. Tout ce que vous avez écrit et qui reste en minuscules n'a pas été complètement internationalisé.
*Apps = Application
*Bundle = Groupement
*Properties = Propriétés
*GUI = Interface Graphique Utilisateur