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

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

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top