# 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) を使って取得できます