Обновить представление с переходом Spring WebFlow - PullRequest
1 голос
/ 28 октября 2010

Я пытаюсь добавить локализацию в свое веб-приложение, созданное с помощью Spring WebFlow и facelets. Я хочу добавить поддержку английского и французского языков. Я создал два файла messages_fr.properties и messages_en.properties.

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

<f:loadBundle basename="messages" var="msg" />
...
<h:commandLink id="changeLocaleFr" action="changeLocale"
class="flag fr">
    <f:param name="ln" value="fr" />
</h:commandLink>
<h:commandLink id="changeLocaleEn" action="changeLocale"
class="flag en">
    <f:param name="ln" value="en" />
</h:commandLink>

Я настроил локальный распознаватель сеансов

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

и перехватчик локальных изменений

<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="ln" />
</bean>

, который я добавил к своему отображению обработчика потока

<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
    <property name="flowRegistry" ref="flowRegistry" />
    <property name="interceptors">
        <list>
            <ref bean="localeChangeInterceptor"></ref>
        </list>
    </property>
    <property name="order" value="0" />
</bean>

В моем потоке есть глобальный переход для changeLocale

<global-transitions>
    <transition on="changeLocale" />
</global-transitions>

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

1 Ответ

1 голос
/ 21 сентября 2012

Полагаю, это связано с тем, что корень представления JSF вообще не изменился при обработке действия changeLocale.Попробуйте добавить код, подобный этому, при обработке изменения локали:

FacesContext context = FacesContext.getCurrentInstance();
context.setViewRoot(context.getApplication().getViewHandler().createView(context, context.getViewRoot().getViewId()));

Таким образом JSF вынужден обновлять состояние всех компонентов.

...