# python: ロケール検出のカスタマイズ
URL: https://generaltranslation.com/ja/docs/python/tutorials/custom-locale-detection.mdx
---
title: ロケール検出のカスタマイズ
description: get_locale を使ってロケール検出をカスタマイズする方法と、デフォルトの動作
---
## デフォルトの動作
[`initialize_gt`](/docs/python/api/initialize-gt) に `get_locale` コールバックを指定しない場合、GT は各リクエストで HTTP の `Accept-Language` ヘッダーからユーザーのロケールを自動的に判定します。
1. `Accept-Language` ヘッダーを読み取る (例: `en-US,en;q=0.9,es;q=0.8`)
2. それを quality value の高い順に並んだロケールのリストとして解析する
3. 設定済みの `locales` と照合し、最も適したものを見つける
4. 一致するものがなければ `default_locale` にフォールバックする
つまり、追加設定をしなくても、対応する翻訳がある限り、ユーザーにはブラウザが要求した言語のコンテンツが表示されます。
```python
from flask import Flask
from gt_flask import initialize_gt
app = Flask(__name__)
# get_locale なし — デフォルトで Accept-Language を解析
initialize_gt(
app,
default_locale="en",
locales=["es", "fr"],
)
```
```python
from fastapi import FastAPI
from gt_fastapi import initialize_gt
app = FastAPI()
# get_locale なし — デフォルトで Accept-Language を解析
initialize_gt(
app,
default_locale="en",
locales=["es", "fr"],
)
```
***
## カスタム `get_locale`
デフォルトの動作を上書きするには、`initialize_gt` に `get_locale` コールバックを渡します。このコールバックはリクエストオブジェクトを受け取り、ロケールを表す文字列を返す必要があります。
```python
from flask import Flask
from gt_flask import initialize_gt
app = Flask(__name__)
def get_locale(request) -> str:
# まずクエリパラメータを確認
locale = request.args.get("lang")
if locale:
return locale
# 次に cookie を確認
locale = request.cookies.get("locale")
if locale:
return locale
# 最後にデフォルトを使用
return "en"
initialize_gt(
app,
default_locale="en",
locales=["es", "fr"],
get_locale=get_locale,
)
```
```python
from fastapi import FastAPI, Request
from gt_fastapi import initialize_gt
app = FastAPI()
def get_locale(request: Request) -> str:
# まずクエリパラメータを確認
locale = request.query_params.get("lang")
if locale:
return locale
# 次に cookie を確認
locale = request.cookies.get("locale")
if locale:
return locale
# 最後にデフォルトを使用
return "en"
initialize_gt(
app,
default_locale="en",
locales=["es", "fr"],
get_locale=get_locale,
)
```
***
## 内部的な動作
* **FastAPI**: `initialize_gt` は、すべてのリクエストで実行される HTTP ミドルウェアを登録します。`get_locale` が指定されている場合は `get_locale(request)` を呼び出し、指定されていない場合は `Accept-Language` を解析します。解決されたロケールは `I18nManager` に設定され、[`t()`](/docs/python/api/t) はそこから読み取ります。
* **Flask**: `initialize_gt` は、同じロジックを持つ `before_request` Hook を登録します。
***
## よくあるパターン
### URL パスのプレフィックス
URL パスからロケールを取得します (例: `/es/about`, `/fr/home`) :
```python
def get_locale(request) -> str:
parts = request.url.path.strip("/").split("/")
supported = {"es", "fr", "de"}
if parts and parts[0] in supported:
return parts[0]
return "en"
```
### ユーザープロフィール
認証済みユーザーの環境設定からロケールを取得します:
```python
def get_locale(request) -> str:
user = get_current_user(request) # 認証ロジック
if user and user.preferred_locale:
return user.preferred_locale
return "en"
```
### サブドメイン
`es.example.com` のようなサブドメインからロケールを検出します。
```python
def get_locale(request) -> str:
host = request.headers.get("host", "")
subdomain = host.split(".")[0]
if subdomain in ("es", "fr", "de"):
return subdomain
return "en"
```
***
## 注意事項
* `get_locale` 関数は、常に有効なロケール文字列を返すようにしてください
* 用意されていないロケールが返された場合、`t()` は `default_locale` の元の内容にフォールバックします
* この関数には、フレームワークの生のリクエストオブジェクトが渡されます。FastAPI では `Request`、Flask では Flask の `request` です
* 解決されたロケールは、コード内のほかの場所でも [`get_locale()`](/docs/python/api/get-locale) を使って取得できます