Должен ли я использовать 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, который удваивает каждую отдельную цитату.