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! / こんにちは、世界!");
ローカライゼーションパイプラインの設計原則
- デフォルト言語の保証:言語判定が失敗した場合でも、必ず
enやjaなどの基底言語をフォールバックとして提供 - クッキー/セッション優先度:ユーザーがUI上で明示的に選択した言語は、
Accept-Languageより高優先度で適用 - 地域サブタグの粒度対応:例えば
pt-BRとpt-PTを別個に管理し、ptを汎用フォールバックとする - 静的リソースの言語分岐:CSS/JS内のテキストやエラーメッセージも、言語コードに基づいてビルド時または実行時に差分解決
テスト戦略のポイント
言語ヘッダーのバリエーションを網羅的に検証するには、次のようなテストケースを含めることが推奨されます:
Accept-Language: fr-FR,fr;q=0.9,en;q=0.8→fr-FRを選択Accept-Language: zh-Hans,zh;q=0.9,en;q=0.5→zh-Hans(簡体字中国語)にマッチAccept-Language: xx-YY,zz;q=0.1→ デフォルト言語へフォールバック
Actix Webの型安全なヘッダー操作と、Rustのコンパイル時検証を組み合わせることで、多言語対応アプリケーションの信頼性と保守性を同時に向上させることができます。