2016-10-03 83 views
4

我有一个多语言的struts应用程序,最近我将struts从2.3.20升级到2.3.29。升级后,泰米尔语不起作用,即使我们选择泰米尔语言,文本也会以英文显示。泰米尔语言选项不支持struts 2.3.29

我在选择泰米尔语言时检查了语言环境设置,它是正确的,即request_locale = ta_IN

我试着在我的自定义拦截器类中扩展I18nInterceptor,然后覆盖如下的方法getLocaleFromParam()方法。这也没有奏效。

所以,请让我知道你是否有任何解决这个问题的方法。

泰米尔语在Struts的2.3.20做工精细

protected Locale getLocaleFromParam(Object requestedLocale) 
{ 
     Locale locale = null; 
     if (requestedLocale != null) { 
      locale = (requestedLocale instanceof Locale) ? 
        (Locale) requestedLocale : 
        LocalizedTextUtil.localeFromString 
           (requestedLocale.toString(), null); 
      if (locale != null) { 
       logger.debug("applied request locale="+locale); 
      } 
     } 
     return locale; 
} 
+0

的代码似乎是正确的,你是怎么加入这个拦截到STRUST?你删除了struts的默认'i18n'拦截器吗? –

+1

请参考http://stackoverflow.com/questions/36245849/struts-2-version-2-3-28-only-accepts-registered-locales –

+0

@AlirezaFattahi我提到了重写getLocaleFromParam()方法的问题。我们如何使用未在JVM中注册的区域设置。我没有删除默认堆栈。新的拦截器代码如下。 <拦截> <拦截器名称= “langSelInterceptor” \t类= “com..LangInter”> <拦截器堆栈名称= “newStack”> <拦截器参考名称= “langSelInterceptor” /> <拦截器参考名称= “defaultStack”/> <动作名称= “loginTamilLocale” 类= “com.Action”> <拦截-REF名称= “newStack”/> –

回答

1

您需要更改替换您的拦截器。

默认堆在下面的支柱定义(https://struts.apache.org/docs/struts-defaultxml.html):

<interceptor-stack name="defaultStack"> 
    <interceptor-ref name="exception"/> 
    <interceptor-ref name="alias"/> 
    <interceptor-ref name="servletConfig"/> 
    <interceptor-ref name="i18n"/> 
    <interceptor-ref name="prepare"/> 
    <interceptor-ref name="chain"/> 
    <interceptor-ref name="scopedModelDriven"/> 
    <interceptor-ref name="modelDriven"/> 
    <interceptor-ref name="fileUpload"/> 
    <interceptor-ref name="checkbox"/> 
    <interceptor-ref name="datetime"/> 
    <interceptor-ref name="multiselect"/> 
    <interceptor-ref name="staticParams"/> 
    <interceptor-ref name="actionMappingParams"/> 
    <interceptor-ref name="params"/> 
    <interceptor-ref name="conversionError"/> 
    <interceptor-ref name="validation"> 
     <param name="excludeMethods">input,back,cancel,browse</param> 
    </interceptor-ref> 
    <interceptor-ref name="workflow"> 
      <param name="excludeMethods">input,back,cancel,browse</param> 
    </interceptor-ref> 
    <interceptor-ref name="debugging"/> 

您需要定义自己的拦截器,并将其添加到默认堆栈

<interceptor name="customi18n" 
     class="foo.bar.CustomI18NInterceptor" /> 

并添加它到你自己的堆栈:

//Give a new name to your stack 
<interceptor-stack name="customDefaultStack"> 
     <interceptor-ref name="exception"/> 
     <interceptor-ref name="alias"/> 
     <interceptor-ref name="servletConfig"/> 
     //Replace your customi18n interceptor 
     <interceptor-ref name="customi18n"/> 
    //Same as above 
    ..... 

请这个堆栈默认

<default-interceptor-ref name="customDefaultStack"/> 
+0

我按照上面告诉你的方式尝试过。仍然没有工作。当我尝试从会话中打印语言环境信息时,它会正确打印泰米尔语言区域设置,即“ta_IN”。它仍然以英文呈现页面。 logger.info(“Locale:”+ session。的getAttribute( “WW_TRANS_I18N_LOCALE”)); –

+0

如果你设置默认语言环境struts \t'' –

+0

会发生什么事情,如果我将ta_IN作为struts.xml中的默认语言环境,它会正常工作。 –