Почему аргументы Spring MessageSource не заполнены правильно в некоторых локалях? - PullRequest
28 голосов
/ 13 июня 2011
mailconfirm.mail.body=<html><body><h3 style="margin: 0 0 1em;">Hi, {0}!</h3>\
    To confirm your email address click on the confirmation link given bellow. If clicking on the link doesn't work, copy and paste the link in a new browser tab. <br /><br />\
    <a href="http://www.domain.com/confirm_email.html?action=activate&hash={1}">http://www.domain.com/confirm_email.html?action=activate&hash={1}</a><br /><br />\
    Kind regards,<br />\
    Your Something
    </body></html>

Это выше конкретное сообщение, используемое для кода ниже.

String country = "AU";
Object[] args = new Object[] { account.getLogin(), confirm.getHash() };

helper.setText(appContext.getMessage("mailconfirm.mail.body", args,
                new Locale(country)), true);

Я отлаживал оба аргумента, и они оба имеют правильные значения. При отладке строки appContext.getMessage я увидел, что параметр {1} не заполнен правильным значением, однако {0} равно.

Есть идеи, что может быть не так? Я подозреваю, что это может быть какая-то языковая проблема.

Ответы [ 4 ]

62 голосов
/ 13 июня 2011

Проблема решена! Похоже, что проблема была в том, что сообщение mailconfirm.mail.body содержало апостроф где-то после {0} и между {1}. После замены doesn't на does not проблема была устранена. Я не знал, что апострофы не могут быть использованы там. Постскриптум Это ошибка или просто моя ошибка, и апострофы следует избегать?

mailconfirm.mail.body=<html><body><h3 style="margin: 0 0 1em;">Hi, {0}!</h3>\
    To confirm your email address, click on the confirmation link given bellow. If clicking on the link doesn't work, copy and paste the link in a new browser tab. <br /><br />\
    <a href="http://www.domain.com/confirm_email.html?action=activate&hash={1}">http://www.domain.com/confirm_email.html?action=activate&hash={1}</a><br /><br />\
    Kind regards,<br />\
    Your Something
    </body></html>

Один doesn't мне потребовалось около часа, чтобы понять это и выдвинуть исправление. Хахаха .. Отныне я считаю апострофы злом!

32 голосов
/ 04 октября 2013

Spring's ResourceBundleMessageSource (который, я думаю, вы используете) использует MessageFormat для замены заполнителей ({0}) внутри сообщений.MessageFormat требует экранирования одинарных кавычек (') с использованием двух одинарных кавычек ('') (см .: MessageFormat Javadoc ).

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

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

См. сообщение в блоге для получения более подробной информации.

7 голосов
/ 12 июля 2014

Я не могу убедить свою бизнес-команду добавить двойных апос в необходимых местах, и иногда они тоже забывают. Поэтому я просто переопределил ReloadableResourceBundleMessageSource#loadProperties как: если значение содержит "'" & "{0", то замените "'" на "''" и вставьте в свойства тот же ключ.

0 голосов
/ 28 декабря 2018

Альтернативой является использование String.format, замените {X} на %s.

mailconfirm.mail.body=<html><body><h3 style="margin: 0 0 1em;">Hi, %s!</h3>\
    To confirm your email address click on the confirmation link given bellow. If clicking on the link doesn't work, copy and paste the link in a new browser tab. <br /><br />\
    <a href="http://www.domain/confirm_email.html?action=activate&hash=%s">http://www.domain/confirm_email.html?action=activate&hash=%s</a><br /><br />\
    Kind regards,<br />\
    Your Something
    </body></html>


String whatEver = messageSource.getMessage("mailconfirm.mail.body", null, locale);

whatEver = String.format(whatEver,account.getLogin(), confirm.getHash() );

Надеюсь, это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...