[Django] Request Header 활용 2 : 클라이언트 브라우저 언어 탐색

David Im·2022년 8월 9일
1

본 글은 야간모드에 최적화 되어있습니다. 우측 상단에서 해 혹은 달모양을 클릭시어 velog 설정을 야간모드로 해주시면 더욱 편안하게 읽으실 수 있습니다.

Request Header를 통한 클라이언트 브라우저 언어 탐색

두번째는 Request Header를 통한 클라이언트 브라우저의 언어를 알아내는 방법이다.

우리 회사의 경우에는 일반적인 번역기능을 통하지 않고, 최대한 원어느낌을 살려서 17개 언어에 대해서 번역을 진행하여 해당 번역내용을 각 언어를 사용하는 사람에게 맞춰 제공한다.

물론 회원가입 시 국적을 받아서 해당 국가의 언어를 사용하도록 하지만, 기왕이면 사용자가 아니더라도 접속했을 때 해당 브라우저의 언어에 맞춰서 미리 번역내용을 맞춰 전달하면 좀 더 빠르고 접근성이 좋지 않을까 라는 생각도 들었다.

그리고 이번에 이 포스트를 작성하계 된 계기는 회원가입시에 환영이메일+가입쿠폰을 전달하는 이메일을 가입시 자동으로 발송하기 위함이다.

일반 가입은 상관없었지만 소셜로그인으로 가입하는 경우에는 국적이나 언어정보를 따로 받고있지 않아서, 사용자가 사용하는 브라우저의 제1언어를 기반으로 보내기로 했다.

Request Header에서 어떠한 부분이 언어 정보를 가지고 있는가?

이전 포스트에서 ip를 가지고 있던 부분이 헤더의 HTTP_X_FORWARDED_FOR와 REMOTE_ADDR가 가지고 있었다면, 언어는 HTTP_ACCEPT_LANGUAGE 라는 곳에 포함되어있다.

해당 부분은 유저가 접속해서 사용하는 브라우저마다 설정된 언어값을 가져오는데, 일반적인 크롬과 사파리의 경우에는 아래와 같이 가져온다

# chrome
Accept-Language: ko, en-US;q=0.8, en;q=0.7

# Safari
Accept-Language: ko

여기서 보면 크롬과 사파리가 가지고 있는 Accept-Language의 값이 다른것을 알 수 있는데, 이것은 브라우저에 사용자가 등록해놓은 사용언어별로 가져오는것으로 보인다.

나는 현재 크롬에 한국어, 영어(미국), 영어 순으로 등록을 해두었고 사파리는 별도로 지정해놓지 않고 한국어로만 되어있기때문이다.

실제로 일본어를 추가했더니 크롬에서는 맨 뒤에 ja가 생겼다.

그런데 여기서 궁금증이 하나 생겼다. Accept-language에서 여러개를 보내주는 크롬의 경우 언어별로 뒤에 q=0.8 이런식으로 숫자가 붙어서 전달되는데 이것이 무엇인지 궁금했다.


Accept-language의 언어 선호도

그래서 찾아본 결과 아래와 같은 답을 얻을 수 있었다.

q뒤에 붙은 값은 언어 품질 요소라는 것으로, 언어의 선호도 수치를 나타낸다.

위에 적혀있듯, 기본적으로는 q=1을 기준으로 선호도가 가장 높은것을 의미하고, 그 아래로 값이 낮아질수록 선호하는 언어가 아님을 나타낸다.

예시로 들었던 내 브라우저 Accept-language를 다시 살펴보자.

Accept-language : ko, en-us;q=0.8, en;q=0.7

이제 q 값이 의미하는 내용을 알았으니 우리는 저게 어떤것을 의미하는 것인지 알 수 있다.

"나는 한국어를 가장 기본으로 사용하고, 미국식 영어, 영어도 받아들인다. 하지만 그중에서 우선적으로 선호하는 것은 미국식 영어를 선호한다. " 라는 의미로 해석할 수 있다.

그럼, Accept-language의 특징에 대해서 정리해보면 다음과 같다.

  • 기본적으로 설정되어있는 OS의 언어 혹은 브라우저의 언어는 가장 첫번째에 위치하게 되고 별도의 q값이 붙지 않는다.
  • q의 값은 선호도를 의미하고 그 순서에 따라 선호도가 달라진다. -> 선호도가 낮다고 해서 브라우저에서 해당언어에 대한 인식을 안받는것이 아님
  • 브라우저마다 설정해놓은 언어가 다른 경우 브라우저의 언어에 따라 보여주지만 기본적으로는 모국어를 바탕으로 하여 accept-language를 보내준다.

Django에서 Request Header를 통한 언어 판별

Request Header에서 언어를 어떻게 적용시키고 불러오는지 알았으니 실제로 적용해보았다.

내가 찾아본 방법은 두가지인데 두 방법 모두 쓸만하기에 작성해보았다.

Request Header 내에서 직접 꺼내서 사용하는 방법

user_langs = request.META.get('HTTP_ACCEPT_LANGUAGE')

print(f'user_language in REQUEST :: {user_langs})

# result
> user_language in REQUEST :: ko,en;q=0.9,ja;q=0.8,ko-KR;q=0.7,en-US;q=0.6

IP와 동일하게 request header 내의 META 정보에서 가져와서 사용하는 방법이다.

해당 방법은 브라우저별로 Accept-language 안에 있는 선호도가 포함된 모든 언어들을 전부 가져온다.

그래서 이 유저가 어떤 언어를 주력으로 사용하고 있으며, 다른 언어는 어떤 언어를 선호하는지까지 확인해볼 수 있다.

자신이 사용자가 주력으로 사용하는 언어외에 어떤 언어를 선호하는지까지 확인하고 싶다면 이 방법을 활용하도록 하자.

만약 주력으로 사용하는 언어만 필요한 경우에는 아래처럼 위 결과내용을 split으로 하여 쉼표(,) 기준으로 잘라 맨 첫번째 배열의 내용만 꺼내어 사용하면 된다.

user_languages = user_langs.split(,)[0]

> user_languages :: ko

만약 두번째, 세번째 선호도의 언어까지 꺼낸다고 한다면 기본언어를 제외한 2번째부터 세미콜론(;)을 기준으로 하여 잘라내서 언어값만 뽑아사용하면 된다.


Django에서 지원하는 module을 사용하여 꺼내는 방법

이 방법은 header를 통해서 가져오는 방법은 맞지만 자신이 기본언어 외에는 필요한 내용이 없다 싶으면 이 방법이 조금 더 수월하고 깔끔한 코드를 통해 언어를 가져올 수 있는 것 같다.

from django.utils.translation import get_language_from_request

...

user_language = get_language_from_request(request)

> user_language : ko

django의 utils에서 지원하는 translation 모듈안에 있는 내장함수를 활용하는 방법으로, request안에서 언어값을 뽑아주는 함수를 활용한 것이다.

정말 간단하게 한줄로 브라우저의 기본 설정 언어를 추려 낼 수 있지만, 브라우저에 다른언어가 설정되어있다고 해도 그 언어들은 보여주지 않는다는 단점이 있다.

나는 기본언어 외에는 필요가 없던터라 해당 방식을 이용해서 적용했다.


참고자료

profile
코더보다 개발자로, 결과와 과정의 시너지를 만들어 가고 싶은 주니어 개발자

0개의 댓글