2016-06-16 14 views
2

현재 난 내 faces-config.xml 등의 섹션이 있습니다.JSF 2.2 : 다음과 같이 구성 가능한 로케일 외부에 직면-config.xml에

문제는 내 전쟁에서 faces-config.xml을 건드리지 않고도 이러한 로케일을 정의 할 수 있어야한다는 것입니다. 아이디어는 예를 들어 사용 가능한 모든 로케일을 정의하는 자원 경로의 구성 파일.

이미 programatic approach을 사용해 보았습니다. 또한이 article에 따라 병합되어야하는 ressource 경로에서 특정 파일을 정의하고 액세스 할 수있는 다른 모듈의 META-INF에서 두 번째 faces-config.xml을 사용했습니다. 각 경우의 두 번째 파일에는 위 섹션이 유효한 faces-config.xml 형식으로 포함되어 있습니다. 둘 다 어떤 영향도주지 않습니다 (오류나 행동의 변화 없음)

원본 faces-config를 건드리지 않고이 작업을 수행하는 좋은 방법이 있습니까?

귀 모듈을 변경하고 어느 위치에서나 프로그래밍 방식으로 자원에 액세스 할 수 있습니다. 불행히도 .war의 faces-config.xml을 조정하는 것은 옵션이 아닙니다.

+0

@Kukeltje : 불행히도 대답이 도움이되지 않습니다. 그러나 질문은 실제로 매우 유사하게 보인다. 나는 이미 모든 리소스를 내 자신의 논리로 해결했다. 브라우저 허용 언어 처리를 myfaces 구현에만 맡기를 바랐다. – Abaddon666

+0

문제는 브라우저 언어와 자신의 설정을 사용하는 것을 선택하게하려는 것이다. 따라서 브라우저에서 보낸 로케일을 어떻게 든 처리해야합니다. 불행히도 Faces를 사용하여 이것을 수행하는 유일한 방법은 locale-config을 정의하는 것입니다.그렇지 않으면 우리는 요청에 의해 스스로를 추출해야합니다. – Abaddon666

답변

1

여기서 볼 수있는 한 오해가 있습니다. 사용자 정의 리졸버/리소스 번들/기타를 사용하고 다른 모든 것을 제어 할 수있는 경우에는 locale-config에서 아무 것도 구성 할 필요가 없습니다. 당신이 Add Resource Bundles Programmatically에서 답을 보면

, 당신은 OmniFaces Faces.getLocale()가 된 ResourceBundle에 로케일을 전달하는 데 사용됩니다 참조

Locale userLocale = Faces.getLocale(); 
ResourceBundle b = ResourceBundle.getBundle("msgs", userLocale); 

그래서 효과적으로 수행하는 것은, 그것을하지 자동적를 프로그램 적 선택한 지역을 통과하다 locale-config에 구성된 항목을 사용하십시오.

IN Faces.getLocale() 일부 코드가 locale-config를 사용하는 것이 존재하는 사실은 사람들이 뭔가 locale-config 구성이 때 일반 정상 JSF에서 예상대로 작동 그래서이 사용할 수 있는지 확인하는 것입니다. 16 번 줄에서는 사용자가 요청한 로켈을 보냅니다. 라인 18에서 그것은 (사용자 정의 구현에서 생략 할 수 있습니다!)를 supported-locale에 대해이 점검되고 일치하는 경우 default-locale (7-12 라인 수에 생략 할 수 있습니다)

1 /** 
2  * {@inheritDoc} 
3  * @see Faces#getLocale() 
4  */ 
5 public static Locale getLocale(FacesContext context) { 
6  Locale locale = null; 
7  UIViewRoot viewRoot = context.getViewRoot(); 
8 
9  // Prefer the locale set in the view. 
10  if (viewRoot != null) { 
11   locale = viewRoot.getLocale(); 
12  } 
13 
14  // Then the client preferred locale. 
15  if (locale == null) { 
16   Locale clientLocale = context.getExternalContext().getRequestLocale(); 
17 
18   if (getSupportedLocales(context).contains(clientLocale)) { 
19    locale = clientLocale; 
20   } 
21  } 
22 
23  // Then the JSF default locale. 
24  if (locale == null) { 
25   locale = context.getApplication().getDefaultLocale(); 
26  } 
27 
28  // Finally the system default locale. 
29  if (locale == null) { 
30   locale = Locale.getDefault(); 
31  } 
32 
33  return locale; 
34 } 
를 사용

그래서이 코드는 사용자가 응용 프로그램에서 선호 로케일을 구성했는지 여부와 브라우저에서 IF로 지원되는 로케일을 사용했는지를 먼저 확인하는 것을 포함하여 원하는대로 완전히 조정될 수 있습니다.

+0

설명을 주셔서 감사합니다. 나는 (다른) 프로그래밍 방식으로 Faces를 우회하여 사용자 설정과 예제와 비슷한 요청을 기반으로 로케일을 설정하려고합니다. – Abaddon666

+0

나는 얼굴은 브라우저 언어를 처리하지만, 간단한 평가 후에는 스스로 결정하기가 더 쉬워졌습니다. – Abaddon666

+0

당신은 환영합니다. 당신을 위해 '얼굴/얼굴'이란 무엇입니까? omnifaces util 클래스 또는 다른 것? – Kukeltje