Интернационализация строки Java, поддерживающая RTL с параметрами - PullRequest
0 голосов
/ 27 октября 2019

Мне нужно отобразить сообщение об ошибке в моей программе, используя параметры (или шаблоны, если вы предпочитаете), такие как:

Connection to {0} failed with {1} status

Строка уже скомпилирована (переведена) длялокаль, но Мне интересно, нужно ли мне написать функцию для заполнения шаблона или она уже доступна в стандартной Java 8 .

Я попробовал {N}(ключи параметров) в моем переводчике, и, к счастью, языки, на которые я нацеливаюсь, не будут переводить ключи параметров, но они будут "искажать" стандартные вещи в стиле java / C, такие как %s, поэтому вызов String.format() не будетработать без каких-либо пользовательских накладных расходов.

До этого момента я работал над проблемой, и, насколько мне известно, это лучший способ поддержки интернационализации RTL и LTR для сообщений об ошибках.

Если вы знаете лучший метод (не включающий библиотеки), я полностью выслушаю ваш ответ и / или комментарии.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Это одна из самых старых функций обработки текста Java , существовавшая задолго до того, как в Java была добавлена ​​поддержка строк формата C:

String param1 = "google.com", param2 = "ACCESS DENIED";

String formatted = MessageFormat.format(
    "Connection to {0} failed with {1} status", param1, param2);

System.out.println(formatted);

Метод, использованный вышеэто уже удобный метод для

String param1 = "google.com", param2 = "ACCESS DENIED";
String f = "Connection to {0} failed with {1} status";

MessageFormat format = new MessageFormat(f);
String formatted = format.format(new Object[] {param1, param2});

System.out.println(formatted);

, который устраняет необходимость объявлять другой вспомогательный метод static самостоятельно.

Когда в Java 5 была добавлена ​​функция форматирования в стиле C,в класс String были помещены удобные методы, однако я бы не хотел называть формат в стиле C «стандартным стилем java / C». Когда вы посмотрите на API java.text с датой, номером, выбором и форматером сообщения и тем, как вы можете встроить первое в второе, вы заметите, насколько оно мощнее, чем новая функция java.util.Formatter в Java 5, в то время как естьк сожалению, нет взаимодействия между этими функциями.

Еще более новый java.time API имеет собственные средства форматирования / синтаксического анализа, но обеспечивает мост к java.text API, хотя вы не можете встроить их в MessageFormat так же. И он не обеспечивает никакого взаимодействия с java.util.Formatter API.

Таким образом, API форматирования Java представляет собой набор изолированных функций. Но учтите, что когда вы собираетесь использовать эти сообщения с API ведения журнала, высоки шансы, что он уже использует MessageFormat при входе в систему с параметрами, такими как logger.log(Level.ERROR, "Connection to {0} failed with {1} status", param1, param2);. В этом отношении вы должны проверить документацию API ведения журнала.

0 голосов
/ 27 октября 2019

Итак, во время ожидания я придумал это как базовую функцию, которую можно вызывать напрямую или с помощью специального обработчика:

public static String compileLocaleTemplate(String template, String... parameters){
    for (int i=0; i < parameters.length; i++){
        String tag = "{"+i+"}";
        template = template.replace(tag, parameters[i]);
    }
    return template;
}

Он быстрый и грязный, так как он этого не делаетвыполнить любую проверку ошибок, но она должна работать (теоретически).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...