[파이썬] Flask를 이용한 다국어 지원

Flask는 파이썬으로 개발된 웹 프레임워크로, 다국어 지원 기능을 간편하게 구현할 수 있는 강력한 도구입니다. 다국어 지원은 웹 애플리케이션의 국제화를 가능하게 하며, 다양한 언어로 웹사이트를 제공할 수 있습니다. 이번 블로그 포스트에서는 Flask를 이용하여 다국어 지원을 구현하는 방법에 대해 알아보겠습니다.

Flask-Babel

Flask-Babel은 Flask 애플리케이션에서 다국어 지원을 위한 확장 모듈입니다. 이 모듈을 사용하면 간편하고 효율적으로 다국어 지원을 구현할 수 있습니다.

설치

먼저 Flask-Babel을 설치해야 합니다. 커맨드 라인에서 다음 명령을 입력하여 Flask-Babel을 설치합니다.

pip install Flask-Babel

설정

Flask 애플리케이션에서 다국어 지원을 사용하기 위해 아래와 같이 설정해야 합니다.

from flask import Flask
from flask_babel import Babel

app = Flask(__name__)
babel = Babel(app)

app.config['BABEL_DEFAULT_LOCALE'] = 'en'  # 기본 언어로 영어 설정
app.config['BABEL_TRANSLATION_DIRECTORIES'] = 'translations'  # 번역 파일이 위치할 디렉토리

@babel.localeselector
def get_locale():
    return request.accept_languages.best_match(app.config['LANGUAGES'])

BABEL_DEFAULT_LOCALE 설정은 애플리케이션의 기본 언어를 지정하는 것입니다. 위 예제에서는 영어로 설정되어 있습니다.

BABEL_TRANSLATION_DIRECTORIES 설정은 번역 파일이 위치할 디렉토리를 지정하는 것입니다. 번역 파일은 이 디렉토리에 저장되어야 합니다.

get_locale 함수는 현재 사용자의 언어를 결정하는 역할을 합니다. 위 예제에서는 사용자가 웹 브라우저에서 지정한 언어를 사용하거나, 지정한 언어가 없을 경우에 기본 언어인 영어를 사용하도록 설정되어 있습니다.

번역 파일

번역 파일은 translations 디렉토리에 저장되어야 합니다. 이 디렉토리에는 각 언어에 대한 디렉토리를 생성하고, 그 안에 messages.po 파일을 생성해야 합니다. 예를 들어 en 디렉토리에는 messages.po 파일이 있어야 합니다.

번역 파일을 생성하려면 pybabel을 사용합니다. 커맨드 라인에서 다음 명령을 실행하여 번역 파일을 생성합니다.

pybabel init -i messages.pot -d translations -l en

위 명령에서 en은 생성하려는 언어 코드입니다. 원하는 언어 코드로 변경하여 사용하세요.

번역 사용

다국어로 번역할 문자열을 다음과 같이 표시할 수 있습니다.

from flask_babel import gettext as _

@app.route('/')
def index():
    message = _("Hello, world!")
    return message

gettext 함수는 번역되지 않은 문자열을 번역하는 역할을 합니다. message 변수는 번역된 문자열을 담고 있습니다.

번역 업데이트

애플리케이션에 새로운 번역 문자열이 추가되거나 수정되었다면, 번역 파일 업데이트가 필요합니다. 커맨드 라인에서 다음 명령을 실행하여 번역 파일을 업데이트할 수 있습니다.

pybabel update -i messages.pot -d translations

이후에 translations 디렉토리 안에 있는 각 언어 디렉토리의 messages.po 파일을 수정하여 새로운 번역을 추가하거나 수정할 수 있습니다.

결론

Flask를 이용한 다국어 지원은 Flask-Babel 확장 모듈을 사용하여 간편하게 구현할 수 있습니다. Flask-Babel을 이용하면 번역 파일을 관리하고, 다국어로 문자열을 번역하는 작업을 효율적으로 처리할 수 있습니다. 다국어 지원을 통해 웹 애플리케이션을 국제화하여 다양한 언어로 제공할 수 있습니다.