Bonjour à tous,
Je suis en train de tester la classe ChoiceFormat pour internationaliser une application.
J'ai fait l'exemple de la documentation et je pensais l'avoir compris, toutefois, dès que j'essaie de sortir de l'exemple prédéfini. ça bug!
Ci-dessous, je vous joins mon code. J'essaie simplement de rajouter une chaine de caractère "Toto" à la fin de ma première ligne. Mais rien à faire.
Je suis obligé d'ajouter un zéro (ou de manière générale une valeur numérique) pour que cela passe et affiche Toto ce qui donne 0Toto alors que je veux juste Toto.
Qu'est ce que j'ai oublié?
Le fichier Pluriel_fr_CA.properties correspondant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 package fr.localisation.app.Pluriel; import java.text.ChoiceFormat; import java.text.Format; import java.text.MessageFormat; import java.text.NumberFormat; import java.util.Locale; import java.util.ResourceBundle; public class Pluriel { public static void mesPluriels() { //--------------------------------------------------------// // Gestion des pluriels //--------------------------------------------------------// ResourceBundle traduction_pluriel = ResourceBundle.getBundle("fr.localisation.app.Pluriel.Pluriel", new Locale("fr", "CA")); MessageFormat messageForm = new MessageFormat(""); messageForm.setLocale(new Locale("fr", "CA")); // Création d'un ChoiceFormat // Chaque numéro de fileLimits correspond à un chiffre dans le template double[] fileLimits = {0,1,2}; // Les Strings recupérer seront liés à chaque numéro. String [] fileStrings = { traduction_pluriel.getString("noFiles"), traduction_pluriel.getString("oneFile"), traduction_pluriel.getString("multipleFiles") }; // Création à proprement dit du ChoiceFormat ChoiceFormat choiceForm = new ChoiceFormat(fileLimits, fileStrings); // Appliquer le pattern présent dans le fichier .properties String pattern = traduction_pluriel.getString("pattern"); messageForm.applyPattern(pattern); // Assigner les formats Format[] formats = {choiceForm, null, NumberFormat.getInstance(), null, null}; messageForm.setFormats(formats); // Configurer les arguments pour utiliser le bon choix Object[] messageArguments = {null, "XDisk", null, 0, "Toto"}; // Il m'oblige à ajouter le 0 avant Toto, sinon, plantage!!! for (int numFiles = 0; numFiles < 4; numFiles++) { messageArguments[0] = new Integer(numFiles); messageArguments[2] = new Integer(numFiles); String result = messageForm.format(messageArguments); System.out.println(result); } } }
Le {3} est inutile, mais je l'ajoute à cause de cette fichue valeur numérique qu'il m'impose.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 pattern = Il {0} sur {1}. (fichier fr_CA) {3}{4} noFiles = n'y a pas de fichiers oneFile = y a un fichier multipleFiles = y a {2} fichiers
Curieusement, sur Format[] formats, je ne suis pas obligé de définir le même nombre d'arguments que messageArguments (ça me parait louche ça), du moment que je mets ma valeur numérique.
Le message d'erreur:
Si quelqu'un arrive me dire ce que j'ai mal fait. Merci d'avance. A bientôt.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given Object as a Number at java.text.DecimalFormat.format(DecimalFormat.java:507) at java.text.Format.format(Format.java:157) at java.text.MessageFormat.subformat(MessageFormat.java:1322) at java.text.MessageFormat.format(MessageFormat.java:865) at java.text.Format.format(Format.java:157) at fr.localisation.app.Pluriel.Pluriel.mesPluriels(Pluriel.java:49) at fr.localisation.app.Main.main(Main.java:23)
Damien.
NOTA: Je suis sous Mac OS El Capitan et Java 1.8.0_131. Editeur : Eclipse
NOTA2 : L'utilisation de MessageText seule fonctionne bien.
A priori, c'est un bug : https://bugs.openjdk.java.net/browse/JDK-8042551
J'ai cru comprendre que je dois modifier un des fichiers du JDK?
Partager