Должен ли я использовать java.text.MessageFormat для локализованных сообщений без заполнителей?

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

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

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

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

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

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

help.url = The web page URL

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

warning.item = This item\u2019s {0} is not valid.

Ответ 3

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

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

Ответ 4

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

Ответ 5

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