Проверьте параметр null в файле .properties для MessageFormat

StackOverflow https://stackoverflow.com/questions/2085584

Вопрос

Возможно ли с помощью пакетов ресурсов и MessageFormat получить следующий результат?

  • когда я звоню getBundle("message.07", "test") чтобы получить "Group test"
  • когда я звоню getBundle("message.07", null) чтобы получить "No group selected"

Каждый пример, который я нашел в Интернете, связан с планетами, с файлами на диске и так далее.

Мне нужно только проверить, является ли один параметр null (или не существует) в файле свойств пакета ресурсов.Я надеюсь найти специальный формат для параметра null, что-то вроде {0,choice,null#No group selected|notnull#Group {0}}.

Метод, который я использую для получения пакетов, является:

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

Я также вызываю этот метод для других пакетов, таких как

  • getBundle("message.08", 1, 2) => "Page 1 of 2" (всегда параметры, нет необходимости проверять наличие null)
  • getBundle("message.09") => "Open file" (нет параметров, нет необходимости проверять наличие null)

Что я должен написать в моем файле .properties для message.07 чтобы получить описание результата?
То, что у меня есть сейчас, это:

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
Это было полезно?

Решение

Ваш .properties файл,

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

И затем вам нужно изменить свой код, чтобы поставить явную проверку params для null.И если null тогда вы можете сделать что-то вроде resourceBundle.getString(NULL_MSG).Где NULL_MSG будет это,

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

Итак, теперь ваш первоначальный метод стал бы чем-то вроде этого.

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

Вызываю мой метод, как показано ниже,

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'

А теперь скажи мне, в чем проблема?

Другие советы

Я рекомендую не пытаться изменять функциональность пакета (даже если у вас есть метод getBundle, инкапсулирующий его).

Просто сделайте в своем коде:

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

Или сделайте другой метод:

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

это делает

public String getBundleOrNull(String key, value, nullKey) {
   return getBundle(value == null? nullKey: key: value);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top