Actix Webにおける国際化対応:HTTP言語ヘッダーを活用したローカライゼーション実装

Actix Webは、Rust製の高性能Webフレームワークであり、RFC 7231準拠のHTTP言語関連ヘッダー処理機能を標準で備えています。これにより、開発者は明示的な言語検出・コンテンツ言語宣言・フォールバック戦略をシンプルなAPIで実装でき、地域ごとのユーザーに自然なローカライズ体験を提供できます。

Accept-Languageの解析と優先順位付き選択

クライアントが送信するAccept-Languageヘッダーは、カンマ区切りの言語タグと品質値(qパラメータ)から構成されます。Actix Webのhttp::header::AcceptLanguage型は、この構文を安全にパースし、重み付けされた候補リストを生成します。

以下は、リクエストから最適な言語タグを抽出する例です:

use actix_web::{HttpRequest, HttpResponse};
use actix_web::http::header::{AcceptLanguage, LanguageTag, QualityItem};

async fn localized_handler(req: HttpRequest) -> HttpResponse {
    let lang_pref = req
        .headers()
        .get::<AcceptLanguage>()
        .and_then(|al| al.preference())
        .map(|tag| tag.to_string())
        .unwrap_or_else(|| "en".to_owned());

    // 言語コードに基づく翻訳済みメッセージ取得(例:i18nモジュール経由)
    let message = lookup_translation(&lang_pref);

    HttpResponse::Ok()
        .insert_header(("content-language", &lang_pref))
        .body(message)
}

Content-Languageによるレスポンス言語の明示

サーバー側は、返却するコンテンツの自然言語をContent-Languageヘッダーで通知します。Actix Webではhttp::header::ContentLanguage構造体を用いて、複数の候補や品質値を含む形式でも設定可能です。

単一言語の明示例:

use actix_web::http::header::ContentLanguage;

let response = HttpResponse::Ok()
    .insert_header(ContentLanguage::new("ja"))
    .body("こんにちは、世界!");

複数言語(例:バイリンガルコンテンツ)の場合:

use actix_web::http::header::{ContentLanguage, QualityItem, LanguageTag};

let bilingual_tag = vec![
    QualityItem::max(LanguageTag::parse("ja").unwrap()),
    QualityItem::with_weight(LanguageTag::parse("en").unwrap(), 0.9),
];

let response = HttpResponse::Ok()
    .insert_header(ContentLanguage(bilingual_tag))
    .body("Hello, world! / こんにちは、世界!");

ローカライゼーションパイプラインの設計原則

  • デフォルト言語の保証:言語判定が失敗した場合でも、必ずenjaなどの基底言語をフォールバックとして提供
  • クッキー/セッション優先度:ユーザーがUI上で明示的に選択した言語は、Accept-Languageより高優先度で適用
  • 地域サブタグの粒度対応:例えばpt-BRpt-PTを別個に管理し、ptを汎用フォールバックとする
  • 静的リソースの言語分岐:CSS/JS内のテキストやエラーメッセージも、言語コードに基づいてビルド時または実行時に差分解決

テスト戦略のポイント

言語ヘッダーのバリエーションを網羅的に検証するには、次のようなテストケースを含めることが推奨されます:

  • Accept-Language: fr-FR,fr;q=0.9,en;q=0.8fr-FRを選択
  • Accept-Language: zh-Hans,zh;q=0.9,en;q=0.5zh-Hans(簡体字中国語)にマッチ
  • Accept-Language: xx-YY,zz;q=0.1 → デフォルト言語へフォールバック

Actix Webの型安全なヘッダー操作と、Rustのコンパイル時検証を組み合わせることで、多言語対応アプリケーションの信頼性と保守性を同時に向上させることができます。

タグ: Actix-Web rust internationalization http-headers localization

6月18日 21:32 投稿