Pregunta

¿Es posible, con paquetes de recursos y MessageFormat tener el siguiente resultado?

  • cuando llamo getBundle("message.07", "test") para obtener "Group test"
  • cuando llamo getBundle("message.07", null) para obtener "No group selected"

Todos los ejemplos que he encontrado en Internet es con los planetas, con los archivos en el disco y así sucesivamente.

Sólo tengo que comprobar si un parámetro es null ( o no existe ) en el archivo de propiedades del paquete de recursos. Espero encontrar un formato especial para el parámetro nulo algo así como {0,choice,null#No group selected|notnull#Group {0}}.

El método que utilizo para obtener los paquetes es:

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 "???";
  }
}

También llama a este método para otros paquetes, como

  • getBundle("message.08", 1, 2) => "Page 1 of 2" (siempre parámetros, hay necesidad de comprobar para null)
  • getBundle("message.09") => "Open file" (sin parámetros, no hay necesidad de comprobar null)

¿Qué debo escribir en mis .properties para presentar message.07 tener el resultado descrito?
Lo que tenemos ahora es:

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
¿Fue útil?

Solución

Su archivo .properties,

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

Y entonces usted necesita para cambiar su código para poner params comprobación explícita para null. Y si null entonces usted puede hacer algo como resourceBundle.getString(NULL_MSG). Donde NULL_MSG será esto,

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

Por lo tanto, ahora su método original se convertiría en algo como esto.

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;
}

Llamar a mi método, como a continuación:

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'

Ahora dime dónde está el problema?

Otros consejos

Voy a recomendar no tratar de cambiar la funcionalidad paquete (incluso si tiene un método getBundle encapsular él).

Basta con hacer en el código:

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

O hacer otro método:

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

que hace

public String getBundleOrNull(String key, value, nullKey) {
   return getBundle(value == null? nullKey: key: value);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top