본문 바로가기

Daylogs/Java

Accept-Language 로 언어 자동 설정하기

발생일: 2009.03.28

문제:
국가별로 다른 페이지를 보여주려고 한다.
현재로선 국내에서 접속할 경우 한국어 페이지를,
그 외에서 접속할 경우 영어로 된 페이지를 제공하고 싶다.
요청 IP 를 분석해서 언어를 설정할 수 있을까?

해결책:
국가별 IP 정보를 받아서 자동으로 언어를 설정할 수 있는 방법이 있긴 하지만,
간단하게 구현하고자 하기에는 좀 버거운 방법이다. (국가별 IP 정보를 제공하는 사이트가 있다)

현재 구현하고자 하는 것은 request의 Accept-Language 헤더 값을 이용하는 것으로 충분할 것으로 보인다.
(이에 대한 좋은 토론이 있다.)

주의할 것은, 브라우저마다 Accept-Language 의 리턴값이 다르다는 것이다.
한국어로 설정되어 있을 때
    IE의 경우: ko
    FF의 경우: ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3
와 같은 식으로 표시된다.

lang 이라는 이름의 parameter로 명시적으로 언어를 설정하고,
parameter가 없을 경우, Accept-Language 값을 받아 언어를 설정하는 간단한 메서드를 아래와 같이 만들었다.
한국어 / 영어만 구분한다.

    /**
     * request로부터 페이지의 language를 설정한다.<br/>
     * lang 이름으로 paramemter 가 있고, 그 값이 en 또는 ko 일 경우 그 값을 설정한다.<br/>
     * 만약 parameter가 없거나 올바르지 않을 경우 request의 Accept-Language 값을 가져와,<br/>
     * 한국어일 경우 ko 로 표기, 아닐 경우 en으로 표기한다.
     *
     * @param request
     * @return en 또는 ko 값의 language
     */
    public static String getLanguage(HttpServletRequest request) {
        String paramLang = request.getParameter("lang");
       
        if ("en".equals(paramLang) || "ko".equals(paramLang)) {
            return paramLang;
        }
       
        // request header 로 부터 Accept-Language 를 가져온다
        // 한국어일 경우, 브라우저 별로 아래와 같은 형태로 가져온다
        // FF: ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3
        // IE: ko
        String acceptLang = request.getHeader("Accept-Language");
        String firstLang = acceptLang.split(",")[0];
        if (firstLang.indexOf("ko") > -1) {
            return "ko";
        }
       
        return "en";
    }



**
2009.08.11
IP 정보에 대해 지역 정보를 리턴해주는 쓰기 쉽고 좋은 사이트가 있었다. (IP 로 지역 정보 가져오기 참고)