[python] FastAPI에서 국제화 지원하기

FastAPI는 Python으로 작성된 빠르고, 현대적인 웹 프레임워크입니다. 이 프레임워크는 깔끔한 구조와 높은 성능을 가지고 있으며, 국제화 기능을 원활하게 지원합니다. 국제화는 애플리케이션을 여러 언어와 문화권에 맞춰 사용할 수 있도록 하는 중요한 기능입니다. FastAPI에서는 국제화를 쉽게 구현할 수 있는 다양한 방법을 제공합니다.

Flask-Babel 라이브러리 사용하기

FastAPI에서 국제화를 구현하는 한 가지 방법은 Flask-Babel 라이브러리를 사용하는 것입니다. Flask-Babel은 Flask 웹 프레임워크의 국제화 지원을 위해 개발된 라이브러리로, FastAPI에서도 잘 동작합니다.

필요한 패키지를 설치하기 위해 다음 명령어를 실행합니다:

pip install Flask-Babel

다음으로, FastAPI 애플리케이션에서 Flask-Babel을 초기화합니다. 아래 코드를 참고하세요:

from fastapi import FastAPI
from flask_babel import Babel

app = FastAPI()
babel = Babel(app)

이제 다국어 지원을 위한 메시지 카탈로그 파일(.po)을 생성해야 합니다. 이 파일은 각 언어에 대한 번역을 담고 있습니다. 메시지 카탈로그 파일을 생성하려면 다음 명령어를 실행하세요:

pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .

이 명령어는 현재 디렉터리에서 messages.pot 파일을 생성합니다. 이 파일을 다국어 번역이 필요한 언어에 맞게 복사하고, 번역을 완료한 다음 해당 파일을 .mo로 컴파일합니다.

애플리케이션에서 알맞은 언어로 설정하는 방법은 다음과 같습니다:

from flask import request
from flask_babel import gettext

@app.middleware("http")
async def set_locale(request: Request, call_next):
    accept_languages = request.headers.get("Accept-Language")
    locale = get_best_match(accept_languages)
    
    # 사용자의 세션 혹은 프로필을 기반으로 사용자 설정 언어 가져오기

    request.state.locale = locale
    request.state.gettext = gettext
    response = await call_next(request)

    return response

이제 뷰 함수에서 다음과 같이 번역된 문자열을 사용할 수 있습니다:

@app.get("/hello")
async def hello(request: Request)
    return request.state.gettext("Hello, World!")

다양한 언어에 대한 라우트 설정하기

또 다른 방법으로는 다양한 언어에 대한 라우트를 설정하는 것입니다. 일반적으로, 다국어 웹 애플리케이션은 각 언어별로 고유한 라우트를 가지고 있습니다. 이를 위해 FastAPI는 Path 클래스를 사용할 수 있습니다.

from fastapi import FastAPI, Path

app = FastAPI()

@app.get("/{lang}/hello")
async def hello(lang: str = Path(..., title="Language"))
    return f"Hello in {lang}"

이렇게 설정하면 /en/hello, /fr/hello와 같은 URL을 통해 각 언어별로 다른 인사말을 출력할 수 있습니다.

결론

FastAPI는 Flask-Babel 및 다양한 언어별 라우트 설정과 같은 다양한 방법을 통해 국제화를 지원합니다. 애플리케이션을 여러 언어와 문화권에서 사용할 수 있도록 국제화 기능을 적용하여 다국어 애플리케이션을 개발할 수 있습니다.