Возможно ли динамическое чтение статического текста из файлов свойств в шаблоне скорости? - PullRequest
1 голос
/ 01 декабря 2010

привет всем у меня есть приложение Java EE (Spring Framework), который использует шаблоны VM который содержит статические тексты, такие как:

<span> hello world </span>

быть примерно таким:

<span> <fmt:message key="hi.message" /> </span>

и мне было интересно, можно ли читать эти тексты из файла свойств (en / fr) в зависимости от локали пользователя, как в JSP, так что я буду использовать один шаблон для всех локалей, а текст будет динамическим

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

Ответы [ 4 ]

2 голосов
/ 01 декабря 2010

Velocity Tools ' ResourceTool class - инструмент для доступа к ResourceBundles и форматирования сообщений в нем Ответ на предыдущий вопрос описывает , как настроить Velocity Tools

В файле конфигурации инструментов добавьте следующую строку, чтобы включить ResourceTool. Вы можете указать локаль по умолчанию, но обычно используется локаль от HttpServletRequest.getLocale().

Toolbox configuration example:
 <tools>
   <toolbox scope="request">
     <tool class="org.apache.velocity.tools.generic.ResourceTool"
              bundles="myresources"
              locale="en_US"/>
   </toolbox>
 </tools>

Если ваш пакет ресурсов содержит

bar=The args are {0} and {1}.

вы можете использовать следующее в вашем шаблоне

$text.bar                 ->  The args are {0} and {1}.
$text.bar.insert(4)       ->  The args are 4 and {1}.
$text.bar.insert(4,true)  ->  The args are 4 and true.

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

EasyFactoryConfiguration config = new EasyFactoryConfiguration();
config.toolbox("request").tool(ResourceTool.class)
    .property("bundles", "myresources")
    .property("locale", "en_US");

ToolManager manager = new ToolManager(false, false);
manager.configure(config);

Context context = manager.createContext();
context.put("name", "Jarl");

Template template = Velocity.getTemplate("mytemplate.vm");

StringWriter writer = new StringWriter();
template.merge(context, writer);
System.out.println(writer.toString());

mytemplate.vm:

$text.greeting $name

myresources_en_US.properties:

greeting=Hello

выход

Hello Jarl
2 голосов
/ 01 декабря 2010

Spring MVC поставляется с (очень) полезными velocimacros (см. Spring MVC документация ). Одним из них является # springMessageText.

В вашем файле hello.vm:

<span>#springMessageText("hi.message", "Hello Default!")</span>

Этот макрос будет читать сообщение из ваших источников сообщений, в зависимости от текущей локали (используя встроенный ResourceBundleMessageSource из Spring).

messages_fr_FR.properties

hi.message=Bonjour

messages_en_GB.propertie

hi.message=Hello

Если для текущей локали пакет недоступен, появится сообщение по умолчанию «Hello Default!» используется.

По умолчанию Spring читает сообщения * .properties. Но вы можете указать больше источников сообщений в вашей конфигурации servlet.xml (здесь сообщения * .properties и другие сообщения * .properties):

<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
      <list>
        <value>messages</value>
        <value>othermessages</value>
      </list>
    </property>
</bean>

Как SpringMVC узнает о текущей локали?

Ну, это все встроенный SpringMVC. ResourceBundleMessageSource считывает ключи в соответствии с локалью. Я думаю, что LocaleResolver настроен по умолчанию (используя локаль, отправленную по запросу клиента), но вы можете зарегистрировать свой собственный localeResolver .

Я рекомендую вам проверить все доступные springmvc velocimacros и скоростные инструменты (очень полезно!).

1 голос
/ 04 января 2011

это из-за вашей кодировки, попробуйте сначала вручную изменить кодировку страницы (обычно в инструментах).

Я немного продвинулся в этом, но не намного дальше .. Источник автоматически устанавливает кодировку в iso-8859-1, я установил для него значение utf-8, однако мои строки на иврите изменились на gibrish, также уничтожил возможность вручную выбрать правильную кодировку, поскольку ни один из них, кажется, не декодирует ее правильно.

Буду очень признателен за решение этой проблемы.

0 голосов
/ 02 декабря 2010

Мы не можем использовать макросы вне веб-приложения, как в моем случае, поэтому решение будет использовать messageSource

model.put("messagesource", this.messagesource);
// adding this e.g. should do the trick
model.put("keyHelloCustomer", "the_key_you_use_in_your_properties_file");
model.put("noArgs", new Object[]{});
model.put("locale", yourOwnPrivateMethodToDetermineWhichLocaleToUse()); 

и в виртуальной машине:

${messageSource.getMessage($keyHelloCustomer, $noArgs, $locale)}

ссылка: http://forum.springsource.org/showthread.php?t=82018

...