Question

Est-il possible, avec des faisceaux de ressources et MessageFormat d'avoir le résultat suivant?

  • quand je l'appelle getBundle("message.07", "test") pour obtenir "Group test"
  • quand je l'appelle getBundle("message.07", null) pour obtenir "No group selected"

Chaque exemple, je trouve sur Internet est avec des planètes, avec des fichiers sur le disque et ainsi de suite.

Je dois seulement vérifier si un paramètre est null ( ou n'existe pas ) dans le fichier des propriétés du faisceau de ressources. J'espère trouver un format spécial pour le paramètre null quelque chose comme {0,choice,null#No group selected|notnull#Group {0}}.

La méthode que j'utiliser pour obtenir les faisceaux est:

public String getBundle(String key, Object... params) {
  try {
    String message = resourceBundle.getString(key);
    if (params.length == 0) {
      return message;
    } else {
      return MessageFormat.format(message, params);
    }
  } catch (Exception e) {
    return "???";
  }
}

Je demande également cette méthode pour d'autres faisceaux, comme

  • getBundle("message.08", 1, 2) => "Page 1 of 2" (toujours les paramètres, pas besoin de vérifier null)
  • getBundle("message.09") => "Open file" (aucun paramètre, pas besoin de vérifier null)

Que dois-je écrire dans mon fichier .properties pour message.07 d'avoir le résultat décrit
Ce que j'est maintenant:

message.07=Group {0} 
message.08=Page {0} of {1}    # message with parameters where I always send them
message.09=Open file          # message without parameters
Était-ce utile?

La solution

Votre fichier .properties,

message.07=Group {0} 
message.08=Page {0} of {1}
message.09=Open file
message.null = No group selected

Et alors vous devez changer votre code pour mettre un params de vérification explicite null. Et si null vous pouvez faire quelque chose comme resourceBundle.getString(NULL_MSG). Où NULL_MSG sera cela,

private static final String NULL_MSG = "message.null";

Donc, maintenant votre méthode originale deviendrait quelque chose comme ça.

public String getBundle(String key, Object... params) {
  String message = null;
  try {
    if (params == null) {
      message = resourceBundle.getString(NULL_MSG);
    } else {
      message = MessageFormat.format(resourceBundle.getString(key), params);
    }
  } catch (Exception e) {
    e.printStackTrace();
  }
  return message;
}

Appel ma méthode comme ci-dessous,

getBundle("message.07", "test") // returning 'Group test'
getBundle("message.07", null) // returning 'No group selected'
getBundle("message.08", 1, 2) // returning 'Page 1 of 2'
getBundle("message.08", null) // returning 'No group selected'
getBundle("message.09", new Object[0]) // returning 'Open file'
getBundle("message.09", null) // returning 'No group selected'

Maintenant, dites-moi où est le problème?

Autres conseils

Je recommande pas d'essayer de changer la fonctionnalité du faisceau (même si vous avez une méthode getBundle encapsulation).

Il suffit de faire dans votre code:

getBundle(param == null? "message.07.null": "message.07", param)

Ou faire une autre méthode:

getBundleOrNull("message.07", param, "message.07.null")

qui fait

public String getBundleOrNull(String key, value, nullKey) {
   return getBundle(value == null? nullKey: key: value);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top