言語検出:動的多言語サポート
この記事では、ユーザーの希望言語を自動検出し、その言語でコンテンツを提供する方法について説明します。
問題:グローバルユーザーへの対応
ユーザーは様々な国から様々な言語でアクセスします:
-
インド:ヒンディー語、ベンガル語、タミル語、テルグ語、グジャラート語、マラーティー語、カンナダ語、マラヤーラム語、パンジャブ語、ウルドゥー語
-
ヨーロッパ:ドイツ語、フランス語、スペイン語、イタリア語、ポルトガル語、ロシア語
-
アジア:日本語、韓国語、中国語
ユーザーの言語設定を検出し、自動的に翻訳されたコンテンツを提供する必要があります。
検出の優先順位
複数の情報源を以下の順序で確認します:
1. URLパラメータ (?lang=hi)
2. セッション (初回検出後に保存)
3. クッキー (translation_lang または lang)
4. ブラウザのAccept-Languageヘッダー (将来実装)
5. デフォルト (英語)
この順序の理由
URLパラメータを最初に: 明示的な言語切替を可能にするため
セッションを次に: ブラウジングセッション中に維持されるため
クッキーを3番目に: セッションをまたいで保持されるため (30日間)
デフォルトを最後に: 新規ユーザーのためのフォールバック
実装
def get_locale():
# 1. URLパラメータを確認
lang_param = request.args.get("lang")
if lang_param in valid_langs:
return lang_param
# 2. セッションを確認
if "translation_lang" in session:
return session["translation_lang"]
# 3. クッキーを確認
# ... (実装詳細は省略)
言語切替
ユーザーはURL経由で言語を切替えられます:
/p/Treo-N100-8-256?lang=hi
これにより以下がトリガーされます:
1. セッション設定: session["translation_lang"] = "hi"
2. クッキー設定: translation_lang=hi; Max-Age=2592000 (30日間)
3. リダイレクト: URLからlangパラメータを削除
利点: 言語選択後のクリーンなURL
対応言語
20言語をサポートしています:
インドの言語 (10):
-
ヒンディー語 (hi)
-
ベンガル語 (bn)
-
タミル語 (ta)
-
テルグ語 (te)
-
グジャラート語 (gu)
-
マラーティー語 (mr)
-
カンナダ語 (kn)
-
マラヤーラム語 (ml)
-
パンジャブ語 (pa)
-
ウルドゥー語 (ur)
ヨーロッパの言語 (7):
-
ドイツ語 (de)
-
フランス語 (fr)
-
スペイン語 (es)
-
イタリア語 (it)
-
ポルトガル語 (pt)
-
ロシア語 (ru)
アジアの言語 (3):
-
日本語 (ja)
-
韓国語 (ko)
-
中国語 (zh)
コンテンツ翻訳
異なるコンテンツタイプは異なる翻訳方法を使用します:
静的テンプレート (Flask-Babel)
ナビゲーション、ボタン、ラベルは.poファイル経由で翻訳:
{{ _('Add to Cart') }} → "कार्ट में जोड़ें" (ヒンディー語)
動的コンテンツ (TranslationManager)
製品名、機能はフレーズテーブル経由で翻訳:
"Mini PC" → "मिनी पीसी" (ヒンディー語)
長文コンテンツ (DeepSeek AI)
製品説明、記事はAI経由で翻訳:
"Compact office computer..." → "कॉम्पैक्ट ऑफिस कंप्यूटर..." (ヒンディー語)
詳細は: 翻訳システム を参照
地域別フォーマット
言語選択はフォーマットにも影響します:
数字フォーマット
英語: 1,234.56
ヨーロッパ: 1.234,56 (区切り文字が逆)
インド: 1,23,456 (ラク/クロールのグループ化)
日付フォーマット
英語: Feb 18, 2026
ヨーロッパ: 18.02.2026
インド: 18/02/2026
通貨
英語: ₹1,234
ヨーロッパ: €1.234
国際: $1,234
言語選択UI
ユーザーはドロップダウンで言語を切替えられます:
位置: トップナビゲーションバー
表示: 国旗アイコン + 言語名
動作: ?lang=<コード>でページを再読み込み
SEO考慮事項
URL構造
すべての言語で単一URLを使用します (/hi/, /de/プレフィックスなし):
利点: シンプルなアーキテクチャ、重複コンテンツ問題なし
トレードオフ: 言語ごとのSEO価値が低い
Hreflangタグ
代替言語リンクを追加します:
<link rel="alternate" hreflang="en" href="https://www.thinvent.in/p/Treo-N100">
<link rel="alternate" hreflang="hi" href="https://www.thinvent.in/p/Treo-N100?lang=hi">
<link rel="alternate" hreflang="de" href="https://www.thinvent.in/p/Treo-N100?lang=de">
利点: Googleがどの言語版を表示するかを認識
フォールバック戦略
選択言語の翻訳が欠落している場合:
1. 英語を試す: ほとんどのコンテンツに英語版がある
2. 原文を表示: 何も表示しないより良い
3. 翻訳キューに追加: バッチ処理のために翻訳キューに追加
パフォーマンス
キャッシュ
翻訳はメモリ内にキャッシュされます:
フレーズテーブル: 起動時に一度だけ読み込み
AI翻訳: データベースにキャッシュ
利点: リクエストごとの翻訳オーバーヘッドなし
レイジーローディング
翻訳は必要な時だけ読み込まれます:
製品説明: 製品ページ表示時に読み込み
クエリページコンテンツ: クエリページ表示時に読み込み
利点: 初期ページ読み込みが高速
参考文献
技術的概念
-
国際化 (i18n) - Wikipedia
-
コンテンツネゴシエーション - Wikipedia
ライブラリ
-
Flask-Babel - テンプレート翻訳
-
Babel - 国際化ライブラリ
関連記事
まとめ
言語検出は優先順位システムを使用します:
検出順序:
-
✅ URLパラメータ (
?lang=hi) -
✅ セッション (ブラウジング中)
-
✅ クッキー (30日間)
-
✅ デフォルト (英語)
サポート:
-
✅ 20言語 (10インド語、7ヨーロッパ語、3アジア語)
-
✅ 地域別フォーマット (数字、日付、通貨)
-
✅ SEO hreflangタグ
翻訳方法:
-
✅ Flask-Babel (静的テンプレート)
-
✅ TranslationManager (製品名、機能)
-
✅ DeepSeek AI (説明、記事)
パフォーマンス:
-
✅ メモリ内キャッシュ
-
✅ レイジーローディング
-
✅ AI翻訳のデータベースキャッシュ
これにより、自動言語検出とシームレスな多言語体験が可能になります。