Должен ли я использовать java.text.MessageFormat для локализованных сообщений без заполнителей? - PullRequest
11 голосов
/ 30 января 2009

Мы локализуем текст пользовательского интерфейса для веб-приложения, работающего на Java 5, и имеем дилемму о том, как мы выводим сообщения, определенные в файлах свойств - тип, используемый java.util.Properties .

Некоторые сообщения содержат заполнитель, который будет заполнен с использованием java.text.MessageFormat . Например:

search.summary = Your search for {0} found {1} items.

MessageFormat раздражает, потому что одиночная кавычка является специальным символом, несмотря на то, что встречается в английском тексте. Вы должны ввести два для буквальной одинарной кавычки:

warning.item = This item''s {0} is not valid.

Однако три четверти из примерно 1000 сообщений приложения не содержат заполнителя. Это означает, что мы можем выводить их напрямую, избегая MessageFormat и оставляя одиночные кавычки в покое:

help.url = The web page's URL

Вопрос: следует ли нам использовать MessageFormat для всех сообщений, для согласованного синтаксиса или избегать MessageFormat там, где это возможно, поэтому большинству сообщений не нужно экранировать?

В любом случае, есть свои плюсы и минусы.

Обратите внимание, что документация API для MessageFormat признает проблему и предлагает решение:

Правила использования кавычек в шаблоны формата сообщений, к сожалению, показали, что несколько сбивает с толку. В частности, это не всегда очевидно локализаторам ли одинарные кавычки нужно удвоить или нет. Удостовериться информировать локализаторов о правилах, и сказать им (например, с помощью комментарии в ресурсном источнике файлы) какие строки будут обработаны по MessageFormat.

Ответы [ 5 ]

2 голосов
/ 03 апреля 2009

В итоге мы решили обойти проблему с одинарными кавычками, всегда используя «фигурные» кавычки:

warning.item = This item\u2019s {0} is not valid.
2 голосов
/ 30 января 2009

Просто напишите свою собственную реализацию MessageFormat без этой раздражающей функции. Вы можете посмотреть код SLF4J Logger .

У них есть собственная версия средства форматирования сообщений, которую можно использовать следующим образом:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

Пустые заполнители могут использоваться с порядком по умолчанию и нумероваться для некоторых случаев локализации, когда разные языки делают перестановки слов или частей предложений.

1 голос
/ 30 января 2009

Используйте `символ вместо 'для цитирования. Мы используем его все время без проблем.

Используйте MessageFormat только тогда, когда вам это нужно, иначе они только раздувают код и не имеют никакого дополнительного значения.

0 голосов
/ 30 января 2009

На мой взгляд, последовательность важна для такого рода вещей. Файлы свойств и MessageFormat уже имеют множество ограничений. Если вы обнаружите эти проблемы, вы можете «скомпилировать» файлы свойств, чтобы сгенерировать правильно сформированные. Но я бы сказал, что использовать MessageFormat везде. Таким образом, поскольку вы поддерживаете код, вам не нужно беспокоиться о том, какие строки отформатированы, а какие нет. Это становится проще, поскольку вы можете передать обработку сообщений в библиотеку и не беспокоиться о деталях на высоком уровне.

0 голосов
/ 30 января 2009

Другая альтернатива ... При загрузке файла свойств просто оберните входной поток в FilterInpuStream, который удваивает каждую отдельную кавычку.

...