Должен ли я использовать java.text.MessageFormat для локализованных сообщений без заполнителей?
-
20-08-2019 - |
Вопрос
Мы локализуем текст пользовательского интерфейса для веб-приложения, работающего на 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, который удваивает каждую отдельную кавычку.