Domanda

E 'possibile, con pacchetti di risorse e MessageFormat di avere il seguente risultato?

  • quando chiamo getBundle("message.07", "test") ottenere "Group test"
  • quando chiamo getBundle("message.07", null) ottenere "No group selected"

Ogni esempio che ho trovato su Internet è con i pianeti, con i file sul disco e così via.

Ho solo bisogno di controllare se un parametro è null ( o non esiste ) nel file di proprietà del fascio risorsa. Spero di trovare un formato speciale per il parametro qualcosa di nulla come {0,choice,null#No group selected|notnull#Group {0}}.

Il metodo che uso per ottenere i fasci è:

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

Ho anche chiamare questo metodo per altri bundle, come

  • getBundle("message.08", 1, 2) => "Page 1 of 2" (sempre i parametri, non è necessario verificare la presenza di null)
  • getBundle("message.09") => "Open file" (senza parametri, non c'è bisogno di verificare la presenza di null)

Cosa devo scrivere nel mio .properties file per message.07 per avere il risultato descritto?
Quello che ho ora è:

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
È stato utile?

Soluzione

Il file .properties,

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

E quindi è necessario modificare il codice per porre params controllo esplicito per null. E se null allora si può fare qualcosa di simile resourceBundle.getString(NULL_MSG). Dove NULL_MSG sarà questo,

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

Così, ora il vostro metodo originale sarebbe diventato qualcosa di simile.

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

Chiamare il mio metodo come qui di seguito,

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'

Ora mi dica dove è il problema?

Altri suggerimenti

Ti consiglio di non cercare di cambiare la funzionalità pacchetto (anche se si dispone di un metodo getBundle incapsulare esso).

È sufficiente fare nel codice:

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

O fare un altro metodo:

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

che fa

public String getBundleOrNull(String key, value, nullKey) {
   return getBundle(value == null? nullKey: key: value);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top