2012-07-16 2 views
3

시스템 로케일을 수신 (구현 자세한 내용은 여기 무관)Playframework 2.0.1DateFormatter 내가 재생 2.0/자바에서 사용자 지정 DateFormatter를 썼다

public class DateFormatter extends Formatters.SimpleFormatter<Date> 

내 응용 프로그램 구성은

을 포함 브라우저 옵션에 정의 된
application.langs="pt-br, en" 

언어는 사람들은 (동의-언어)

논리적으로, Lang.preferred (목록) 페이지를 반환이 포함 시스템 (JVM) 로케일, 욕실입니다

@Override 
public Date parse(String date, Locale locale) { 
    ... 
} 

에 내 사용자 지정 DateFormatter 수신

@Override 
public Action onRequest(Request request, Method method) { 

    Lang preferred = Lang.preferred(request.acceptLanguages()); 
    Logger.debug("Preferred language is " + preferred.toLocale()); 

    return super.onRequest(request, method); 
} 
하지만 (그리고 슬프게도)

로케일에 같은 원하는 언어로 t-BR -US, 선호하는 것을 요청하지 않습니다.

정상입니까? 내가 여기서 무엇을 놓치고 있니? 당신은 당신의 요구의 로케일을 설정할 수있는 LocaleContextHolder을 설정할 수 있으며, Global interceptor 사용하여 각 요청에 대해

:

+0

대신 포맷터 방법 매개 변수에 전달 된 로케일을 사용하는이 상황에 맞는 로케일을 사용 /play/src/main/java/play/data/format/Formatters.java#L203), 요청에서 Locale을 얻지 못하기 때문에 실제로 버그라고 생각합니다. 버그 (https://play.lighthouseapp.com/projects/82401-play-20/overview)를 작성해야합니다. –

답변

2

내가이 해결 방법을 사용할 수 있다고 생각

public class Global extends GlobalSettings { 

    @Override 
    public Action onRequest(final Request request, Method actionMethod) { 
     LocaleContextHolder.setLocaleContext(new LocaleContext() { 
      public Locale getLocale() { 
          Lang preferred = Lang.preferred(request.acceptLanguages()); 
       return preferred.toLocale(); 
      } 
     }); 
     return super.onRequest(request, actionMethod); 
    } 

} 

나는 그것을 테스트하지 않았다, 하지만 그만한 가치가 있습니다 :-)

+0

감사합니다. Context ctx = Context.current() Lang preferred = Lang.preferred (ctx.request(). acceptLanguages ​​()); Lang 및 Context 클래스를 사용하여 비슷한 해결 방법을 사용했습니다. 귀하의 솔루션은 중앙 솔루션을 제공하기 때문에 조금 더 좋습니다. 다시 한번 감사드립니다. –

0

슬프게도 nico ekito가 언급 한 전역 오버라이드는 아마도 스레드 때문에 Play 2.2에서 신뢰할만한 해결책이 아닙니다. 내 경험으로는 로케일이 때로 부적절하고 포맷터가 예기치 않게 작동하는 경우가 있습니다 (때로는 다른 언어로 서식을 지정하고 상황에 맞게 설정).

기본적으로 존 스미스의 최종 해결책은 훨씬 더 신뢰할 수 있습니다. https://github.com/playframework/Play20/blob/master/framework/src (소스 코드를 살펴보면

public Date parse(String date, Locale locale) { 
    Context context = Context.current(); 
    Lang preferred = Lang.preferred(context.request().acceptLanguages()); 
    Locale contextLocale = preferred.toLocale() 
    ... 
} 
관련 문제