2013-05-22 3 views
0

Я использую интернационализацию в своем веб-приложении, используя struts2 и плитки. он работает для сообщений, определенных в messages_en.properties и messages.properties. Проблема, с которой я сталкиваюсь, касается названий моих веб-страниц. Я создал два файла определений файлов, один для французских плит-defs.xml, а другой для английских плит-defs_en.xml. На всех моих действиях я поставил i18n-перехватчик. Но когда я запрашиваю изменение языка, мои заголовки не меняются. Кто-то, у кого есть начало решения?Интернационализация плиток

спасибо

Это моя связь с моими локали действия:

<s:url var="urlfr" action="locale"> 
      <s:param name="request_locale">fr</s:param> 
     </s:url> 
     <s:a href="%{urlfr}"> 
      <img title="francais" alt="" 
       src="/baseline/pages/images/flag-fr.gif"> 
     </s:a> 
    &nbsp; 
    <s:url var="urlen" action="locale"> 
      <s:param name="request_locale">en</s:param> 
     </s:url> 
     <s:a href="%{urlen}"> 
      <img title="englais" alt="" src="/baseline/pages/images/flag-gb.gif"> 
     </s:a> 

Моей локаль действия возвращает только успех, и это мой struts.xml где я объявил мои действия

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 
<constant name="struts.custom.i18n.resources" value="messages" /> 
<constant name="struts.devMode" value="true" /> 
<constant name="struts.enable.SlashesInActionNames" value="true" /> 


<package name="user" namespace="/user" extends="struts-default"> 
    <result-types> 
     <result-type name="tiles" 
      class="org.apache.struts2.views.tiles.TilesResult" /> 
    </result-types> 
    <interceptors> 
     <interceptor name="post" class="domain.PostOnlyInterceptor" /> 
     <interceptor-stack name="postStack"> 
      <interceptor-ref name="i18n" /> 
      <interceptor-ref name="post" /> 
      <interceptor-ref name="defaultStack" /> 
     </interceptor-stack> 
    </interceptors> 

    <action name="listPaysAction" class="regionAction" method="listePaysParRegion"> 
     <interceptor-ref name="params" /> 
     <interceptor-ref name="prepare" /> 
     <interceptor-ref name="defaultStack" /> 
     <result name="success" type="tiles">accueil</result> 
    </action> 

</package> 

</struts> 
+0

Показать код. Это действительно не должно быть проблемой плитки, она просто собирает представления. Если представления не делают i18n правильно, это должна быть проблема struts2/jsp. Также не вижу необходимости в французской/английской плитки. Можно увидеть возможные причины для плиток, которые поддерживают языки с разными потоками макета, но они оба слева направо ... – Quaternion

ответ

2

Я нашел ответ для меня, который работает.

Чтобы установить локаль так, что плитка будет использовать tiles_fr.xml, сделайте следующее:

Locale locale = LocaleUtility.langToLocale("fr"); 
session.setAttribute(DefaultLocaleResolver.LOCALE_KEY, locale); 

То есть, если у вас есть доступ к HttpSession.

Я пытался установить плитки и распорки для использования «fr» в фильтре. Таким образом, у меня есть доступ к моему HttpSession:

HttpSession session=request.getSession(); 
Locale locale = LocaleUtility.langToLocale("fr"); // fr is hard coded for now. 

Config.set(session, Config.FMT_LOCALE, locale); 
session.setAttribute(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE, locale); 
session.setAttribute(DefaultLocaleResolver.LOCALE_KEY, locale); 

Видимо,

Config.set(session, Config.FMT_LOCALE, locale); 

не делает ничего. Я видел, как другие говорят, что это работает, но это не работает для плиток. Но я оставил его там. На всякий случай мне это нужно и в jstl.

Но сделав это, вы сделаете свои global_fr.properties, а также ваши файлы tiles_fr.xml.

+0

Это сработало, но я использую 'Locale locale = new Locale ('language');' вместо 'Locale locale = LocaleUtility.langToLocale ("fr"); ' – user1310305

+0

yes. любой из них будет работать, независимо от того, выполняете ли вы 'new Locale()' или 'langToLocale()', до тех пор, пока вы, что вы установили в сеансе, является объектом «Locale», он будет работать. – ns123

Смежные вопросы