2012-08-24 4 views
4

로캘 확인자를 연결할 수 있습니까?스프링 로캘 리졸버 체인 연결

내가로부터 로케일 값을 싶습니다

  1. 세션을 경우 내 가능 언어

  2. 쿠키의 경우를 가진지도 내 가능 언어

  3. 두 경우와지도 로케일 정보를 포함하지 마십시오. 허용 ​​언어에서 추출한 후 허용 된 로케일과 가장 일치하는 항목을 선택하십시오.

어떻게 하시겠습니까?

답변

1

스프링의 로케일 분석자 목록을 래핑하는 자신의 LocaleResolver을 작성해야한다고 생각합니다. Locale이 해결 될 때까지 하나씩 호출합니다. 목록에 Locale이 없으면 LocaleResolver에 기본 동작을 제공합니다.

http://code.lds.org/maven-sites/stack/modules/web-spring/3.0.8-SNAPSHOT/apidocs/org/lds/stack/web/spring/i18n/ChainedLocaleResolver.html

https://mvnrepository.com/artifact/org.lds.stack.web/stack-web-spring/3.0.8

아니면 두 링크에서보기를 선호하는 경우 :

다음은 유용 할 수있는 몇 가지 링크입니다

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; 
    } 
} 
+0

두 번째 링크 (404)를 제공합니다. 이 코드가 패키지의 일부입니까? (잘하면 Maven 패키지) 어떤 라이센스가 배포되어 있는가? –

+0

모든 링크가 깨졌습니다. – Daniele

+1

@Daniele : fixed – Bogdan

관련 문제