Java Spring局部解算器链接

Java Spring局部解算器链接,java,spring,spring-mvc,localization,internationalization,Java,Spring,Spring Mvc,Localization,Internationalization,是否可以链接区域设置解析程序 我想从以下位置获取区域设置值: 会话if使用我接受的语言映射 cookie if映射到我接受的语言 如果两者都不包含区域设置信息,则将其从accept语言中提取出来,并与我接受的区域设置进行最佳匹配 您将如何做到这一点?我认为您需要编写自己的代码来包装Spring的区域设置解析程序列表。一个接一个地调用它们,直到解析了Locale。如果列表未生成区域设置,则在LocaleResolver中提供默认行为 以下是一些您可能会发现有用的链接: 或者,如果您更喜欢从两个

是否可以链接区域设置解析程序

我想从以下位置获取区域设置值:

  • 会话if使用我接受的语言映射

  • cookie if映射到我接受的语言

  • 如果两者都不包含区域设置信息,则将其从accept语言中提取出来,并与我接受的区域设置进行最佳匹配


  • 您将如何做到这一点?

    我认为您需要编写自己的代码来包装Spring的区域设置解析程序列表。一个接一个地调用它们,直到解析了
    Locale
    。如果列表未生成
    区域设置
    ,则在
    LocaleResolver
    中提供默认行为

    以下是一些您可能会发现有用的链接:

    或者,如果您更喜欢从两个链接查看:

    package org.lds.stack.web.spring.i18n;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Locale;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.LocaleResolver;
    import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
    import org.springframework.web.servlet.i18n.FixedLocaleResolver;
    
    /**
     * This locale resolver provides the ability to define a list of resolvers from which to determine
     * the locale.  This allows us to give preference to certain locale resolution schemes by putting
     * them earlier in the list.  
     * <p/>
     * 
     * The order of resolvers from which to find the given locale (or set a specified locale) could be
     * defined in the spring context file with something like:
     * 
     * <pre>
     * &lt;bean id=&quot;localeResolver&quot; class=&quot;org.lds.stack.web.spring.i18n.ChainedLocaleResolver&quot;&gt;
     *      &lt;property name=&quot;localeResolvers&quot;&gt;
     *          &lt;list&gt;
     *              &lt;bean class=&quot;org.lds.stack.web.spring.i18n.UrlLocaleResolver&quot; /&gt;
     *              &lt;bean class=&quot;org.lds.stack.web.spring.i18n.NoDefaultSessionLocaleResolver&quot; /&gt;
     *              &lt;bean class=&quot;org.lds.stack.web.spring.i18n.NoDefaultCookieLocaleResolver&quot;&gt;
     *                  &lt;property name=&quot;cookieMaxAge&quot; value=&quot;31536000&quot;/&gt;
     *              &lt;/bean&gt;
     *              &lt;bean class=&quot;org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver&quot; /&gt;
     *              &lt;bean class=&quot;org.springframework.web.servlet.i18n.FixedLocaleResolver&quot; /&gt;
     *          &lt;/list&gt;
     *      &lt;/property&gt;
     *  &lt;/bean&gt;
     * </pre>
     * 
     * This allows you to remove, or re-order the locale resolution schemes to meet your needs.
     * Also note that the id of localeResolver is significant.  The Spring Framework knows to use this
     * resolver as the LocaleResolver by virtue of the id being "localeResolver".
     * <p/>
     * 
     * NOTE: If the default resolver order, shown above, will work for your application, then you can 
     * skip this verbose definition by utilizing the stack-web namespace handler, providing any exposed 
     * attribute values for minor customizations.  The namespace handler is defined as follows:
     * 
     * <pre>
     * &lt;stack-web:locale-resolver /&gt;
     * </pre>
     * 
     * Additionally, in order to change the locale based on a url parameter, you can configure a
     * LocaleChangeInterceptor, which will call the set method of all of the locales in the chained
     * resolver, so that they can be found when resolveLocale(...) is called on them.  
     * <p/>
     * 
     * The interceptor configuration might look as follows:
     * <pre>
     *  &lt;mvc:interceptors&gt;
     *      &lt;bean id=&quot;localeChangeInterceptor&quot; class=&quot;org.springframework.web.servlet.i18n.LocaleChangeInterceptor&quot; /&gt;
     *  &lt;/mvc:interceptors&gt;
     * </pre>
     */
    public class ChainedLocaleResolver implements LocaleResolver {
    
        private List<LocaleResolver> localeResolvers;
    
        public ChainedLocaleResolver() {
            //if anything other than this default order or set is desired, the list of resolvers
            //to be chained should be set up in the bean definition as shown above
            localeResolvers = new ArrayList<LocaleResolver>();
            //TODO: Is the Url resolver necessary if we have an interceptor that changes the locale from the url?
            localeResolvers.add(new UrlLocaleResolver());
            localeResolvers.add(new NoDefaultSessionLocaleResolver());
            NoDefaultCookieLocaleResolver cookieLocaleResolver = new NoDefaultCookieLocaleResolver();
            cookieLocaleResolver.setCookieMaxAge(31536000);
            localeResolvers.add(cookieLocaleResolver);
            //TODO: may need to create a NoDefault, but that seems difficult as the implementation is provided
            //by the javax.servlet, ..., Also, maybe we could just remove the fixedLocaleResolver, as this one
            //gets the default, and then if people did not use this one, they could add the fixed one back in.
            localeResolvers.add(new AcceptHeaderLocaleResolver());
            localeResolvers.add(new FixedLocaleResolver());
        }
    
        @Override
        public Locale resolveLocale(HttpServletRequest request) {
            Locale locale = null;
            for (LocaleResolver resolver : getLocaleResolvers()) {
                locale = resolver.resolveLocale(request);
                if (locale != null) {
                    return locale;
                }
            }
            return locale;
        }
    
        @Override
        public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
            for (LocaleResolver resolver : getLocaleResolvers()) {
                try {
                    resolver.setLocale(request, response, locale);
                } catch (UnsupportedOperationException uoe) {}
            }
        }
    
        public List<LocaleResolver> getLocaleResolvers() {
            return localeResolvers;
        }
        public void setLocaleResolvers(List<LocaleResolver> localeResolvers) {
            this.localeResolvers = localeResolvers;
        }
    }
    
    package org.lds.stack.web.spring.i18n;
    导入java.util.ArrayList;
    导入java.util.List;
    导入java.util.Locale;
    导入javax.servlet.http.HttpServletRequest;
    导入javax.servlet.http.HttpServletResponse;
    导入org.springframework.web.servlet.LocaleResolver;
    导入org.springframework.web.servlet.i18n.acceptHeaderLocalerResolver;
    导入org.springframework.web.servlet.i18n.FixedLocaleResolver;
    /**
    *此区域设置冲突解决程序提供了定义冲突解决程序列表的功能,从中可以确定
    *地点。这使我们可以通过将
    *他们在名单的前面。
    *

    * *解析程序查找给定区域设置(或设置指定区域设置)的顺序可以是 *在spring上下文文件中定义,如下所示: * * *bean id=“localeResolver”class=“org.lds.stack.web.spring.i18n.ChainedLocaleResolver” *property name=“localeresolver” *名单 *bean class=“org.lds.stack.web.spring.i18n.UrlLocaleResolver”/ *bean class=“org.lds.stack.web.spring.i18n.nodeFaultSessionLocalerResolver”/ *bean class=“org.lds.stack.web.spring.i18n.NoDefaultCookieLocaleResolver” *property name=“cookieMaxAge”value=“31536000”/ */豆 *bean class=“org.springframework.web.servlet.i18n.AcceptHeaderLocalerResolver”/ *bean class=“org.springframework.web.servlet.i18n.FixedLocaleResolver”/ */列表 */属性 */豆 * * *这允许您删除或重新排序区域设置解析方案以满足您的需要。 *还请注意,localeResolver的id是重要的。Spring框架知道如何使用它 *由于id为“LocaleResolver”,因此解析程序为LocaleResolver。 *

    * *注意:如果上面显示的默认解析器顺序适用于您的应用程序,那么您可以 *通过使用堆栈web命名空间处理程序跳过此详细定义,提供任何公开的 *次要自定义的属性值。命名空间处理程序的定义如下: * * *堆栈web:区域设置解析器/ * * *此外,为了根据url参数更改区域设置,您可以配置 *LocaleChangeInterceptor,它将调用链接中所有区域设置的set方法 *解析程序,以便在对它们调用resolveLocale(…)时可以找到它们。 *

    * *拦截器配置可能如下所示: * *mvc:拦截器 *bean id=“localeChangeInterceptor”class=“org.springframework.web.servlet.i18n.localeChangeInterceptor”/ */mvc:拦截器 * */ 公共类ChainedLocaleResolver实现LocaleResolver{ 私有列表本地解决方案; public ChainedLocaleResolver(){ //如果需要此默认顺序或集合以外的任何内容,则会显示冲突解决程序列表 //要链接的对象应该在bean定义中设置,如上所示 localeResolvers=newarraylist(); //TODO:如果我们有一个拦截器可以从Url更改语言环境,那么Url解析器是必要的吗? 添加(新的URLLOCALERESOLVERS()); 添加(新的nodeFaultSessionLocalerResolver()); NoDefaultCookieLocaleResolver cookieLocaleResolver=新的NoDefaultCookieLocaleResolver(); cookieLocaleResolver.setCookieMaxAge(31536000); 添加(cookieLocaleResolver); //TODO:可能需要创建一个NoDefault,但由于提供了实现,这似乎很困难 //通过javax.servlet,…,也许我们可以删除fixedLocaleResolver,就像这个一样 //获取默认值,然后如果用户未使用此值,则可以将固定值添加回。 添加(新的AcceptHeaderLocalerResolver()); 添加(新的FixedLocaleResolver()); } @凌驾 公共区域设置resolveLocale(HttpServletRequest请求){ Locale=null; for(LocaleResolver解析程序:getlocaleresolver()){ locale=resolver.resolveLocale(请求); if(区域设置!=null){ 返回区域设置; } } 返回区域设置; } @凌驾 public void setLocale(HttpServletRequest请求、HttpServletResponse响应、Locale){ for(LocaleResolver解析程序:getlocaleresolver()){ 试一试{ setLocale(请求、响应、区域设置); }捕获(不支持操作异常uoe){} } } 公共列表getLocaleResolver(){ 返回本地解算器; } public void setLocaleresolver(列出Localeresolver){ this.localeResolvers=localeResolvers; } }


    第二个链接给出404。这个代码是包的一部分吗?(希望是一个Maven软件包)在其中分发许可证?@Daniele:fixed@Michael:代码和JavaDoc在我的答案中。这些链接仅供参考