2010-02-02 2 views
7

JSP/Servlet을 통해 다국어 지원을 제공하는 방법은 무엇입니까? 선택한 언어에 따라 런타임에 다른 언어의 정적 데이터를 포함하는 방법은 무엇입니까?JSP/Servlet의 언어 지원

답변

-1

이 문제에는 몇 가지 중요한 측면이 있습니다. 첫 번째 부분은 각 요청의 로켈을 결정하는 것입니다. 다음과 같이 사용할 수 있습니다.

HttpServletRequest req ...; 
String browserLocale = req.getHeader("Accept-Language"); // typically something like 'en' 

다음으로 사이트의 현지화 된 콘텐츠를 관리하는 방법을 결정해야합니다. 가장 Java와 같은 (최선은 아님) 접근 방식은 ResourceBundle을 사용하여 모든 메시지를 외부화하는 것입니다. Isolating Locale Specific Data tutorial에서 I18N, G13N의 핵심 Java 기능에 대해 배울 수 있습니다.

이 접근법을 사용하는 것은 제 생각에는 매우 나쁩니다. 다른 언어의 콘텐츠 크기가 다르고 다르게 다른 레이아웃과 일치하는 등 리소스 번들을 완전히 제거 할 수 있습니다 (다중 로캘 데이터가 많지 않은 경우) 또는 XSLT 또는 로캘 인 다른 템플릿을 사용하여 접근 방식을 늘릴 수 있습니다 특유한.

성능이 뛰어나지 만 높은 개발 간접 접근법 중 하나는 서블릿 필터를 사용하여 트래픽을 언어 (또는 로켈) 특정 하위 사이트로 리디렉션하는 것입니다. 이 경우 http://my.domain.fake/xyz을 타는 사람은 누구나 http://my.domain.fake/en/xyz

으로 리디렉션됩니다. 마지막으로 심각한 웹 프레임 워크의 대부분은 자체적 인 I18N 지원을 사용합니다. 그들의 접근 방식은 프레임 워크 철학에 따라 다릅니다.

+0

이유 때문에 'ServletRequest.getLocale()'이 존재합니다! –

10

"일반 바닐라"JSP/서블릿 애플리케이션에서 가장 좋은 해결책은 JSTLfmt taglib입니다. (방금 jstl-1.2.jar/WEB-INF/lib에 넣으십시오) 사용 방법은 Oracle Java EE 5 tutorial part II chapter 7과이 대답에서 다룹니다 : How to internationalize a Java web application?.

Oracle JSF 또는 Apache Struts와 같은 MVC 프레임 워크를 사용하는 경우 키워드 "internationalization"(i18n) 또는 "현지화"(l10n)를 사용하여 특정 설명서를 참조해야합니다. 대부분의 경우 JSF의 경우 <f:loadBundle> (Oracle Java EE 5 tutorial part II chapter 15)의 특정 태그도 제공합니다.

i18n 태그는 이미 기본 언어/로케일을 ServletRequest#getLocale()으로 확인합니다 (이전에 제안 된대로 머리글을 확인하여 "하위 수준"으로 할 필요는 없습니다. HTTP spec). 사용자가 언어 자체 (드롭 다운?)를 선택하고 세션 범위에 저장하도록하고 해당 taglib에 사용하도록 지시 할 수 있습니다. 여기에 JSTL의 FMT 태그 라이브러리와 예제입니다 :

<fmt:setLocale value="${someSessionBean.locale}" /> 

..where ${someSessionBean.locale}en, en_US, en_UK을 반환 할 수는 것들이다 (당신이 필요하지 않은 현지화 된 텍스트를로드 java.util.ResourceBundle API에 의해 사용 차례 ResourceBundle 자체를 작성 /로드하십시오. taglibs는 이미 그렇게했으며, 링크 된 javadoc을 읽으면 작동 방식에 대해 좀 더 자세히 알 수 있습니다.) 당신이 URL의 최초의 PathInfo의 일부로 사용할 수있는 언어 (예 : 검색 엔진 최적화에 가장 적합 http://example.com/en/로), 다음 가장 /*에 수신하는 이것에 대한 Filter 사용하려는 경우

는의의 PathInfo을 확인 언어 부분을 분할 이를 세션 값으로 저장/비교하고 pathinfo의 언어 부분없이 요청을 원하는 프론트 컨트롤러로 전달합니다.

-1

messages.properties, messages_를 만들 수 있습니까? ??.이 파일을/scr/java 디렉토리에 저장합니다. (여기서 ?? ?? - ko 페이지, ru_RU 등) messages.properties에

예 선 :

About = About 
Buy = Buy 
Company = Company 
ContactUs = Contact Us 

그럼 예 선용 JSP 파일에 붙여 : 지금

Locale locale = Locale.getDefault(); 
    String lng = locale.getCountry(); 

    session.setAttribute("language", lng); 

    if (lng.equals("UA")) 
     locale = new Locale("uk", "UA"); 
    else if (lng.equals("RU")) 
     locale = new Locale("ru", "RU"); 
    else 
     locale = Locale.US; 

    ResourceBundle boundle = ResourceBundle.getBundle("messages", locale); 

    for (Enumeration e = boundle.getKeys(); e.hasMoreElements();) { 
     String key = (String) e.nextElement(); 
     String s = boundle.getString(key); 
     session.setAttribute(key, s); 
    } 

다음 JSP 코드 ($ {About}, $ {Buy}, ...)에 $ {name}을 붙여 넣을 수 있습니다.

+0

이것은 ** 당신이'ResourceBundle'과'Locale' 클래스를 사용하는 방식이 아닌 **입니다! 주제에 대한 기본적인 이해 부족을 보여줍니다. –

관련 문제