Accept-Language
2013-07-25 うさみけんた@tadsan
Accept-Languageとは
日本語でくれ!
中国語でくれ!
こんにちは!
你好!
Accept-Language: ja
Accept-Language: zh
Accept-Languageとは
Accept-Language: ja-JP
日本の日本語でくれ!
台湾の中国語でくれ!
Accept-Language: zh-TW
こんにちは!
你好!
Accept-Languageとは
Accept-Language: ja-Hira
ひらがな日本語でくれ!
繁体字中国語でくれ!
Accept-Language: zh-Hant
こんにちは!
你好!
Accept-Languageとは
Accept-Language: ja-Hira-JP
日本のひらがな日本語でry
台湾の繁体字中国語でry
Accept-Language: zh-Hant-TW
こんにちは!
你好!
RFC5646 LanguageTag
• IETF言語タグと呼ばれる
• 自然言語を特定するための仕様
• 言語名-用字系-地域 のように繋げて書く
• 日本語は日本でしか利用されてないので、

基本的にはjaでも差し支えない
• en-US, en-GB のように地域を詳しく書くこと
もできる
RFC5646 LanguageTag
• ところで、中国語圏は超広い
• 共通語(北京方言がベース)と各地の方言がある
• 政治的歴史的経緯により、中国本土・台湾・香
港などでそれぞれ文字が違う (言語はほぼ同じ)
• zh-CN, zh-TW のように言語と地域を組合せる
• zh-Hant, zh-Hansのように用字系を指定する
RFC5646 LanguageTag
RFC5646 LanguageTag
• 注意: あくまで言語の地域(方言)を表現する
• スペイン語(es)やポルトガル語(pt)は南米などの

旧植民地でも通用するが、文法や語彙には、

差異がある。
• 通貨やタイムゾーンを表現するものではない
• OSの設定を英語(en-US)にしてるからって、

アメリカのタイムゾーンにされたら嫌でしょ
RFC2616 HTTP/1.1
• リクエスト時にAccept-Languageヘッダで

言語を指定することができる
• 詳細にカスタマイズできるブラウザもあるけど、
OSの言語設定を使ってよしなに送る
RFC2616 HTTP/1.1
• , で区切って複数の言語を指定できる
• ja,zh-Hans,ko-KR,en-US,en
• ja-JP;q=1.0 のように 0∼1 の間の数字を

付加することで優先度を表現することができる
• 無指定は 1 (最優先)
RFC2616 HTTP/1.1
• ja,ko;q=0.8,zh;q=0.8,en-US;q=0.6,en;q=0.5
• 日本語最優先でね
• 中国語と韓国語でもいいよ(優先度おなじ)
• なかったらアメリカ英語ね
• それもなかったらなんでもいいから英語で
RFC2616 HTTP/1.1
• Chromeならネットワークタブで見れるよ
RFC2616 HTTP/1.1
• 実装例
• ja;q=0.1,en-US;q=0.2,zh;q=0.6	
• ↓解体する
• [(0.1,ja),(0.2,en-US),(0.6,zh)]	
• ↓ソートする	
• [zh, en-US, ja]
RFC2616 HTTP/1.1
• 実装例
• 実際にはスペースが入ってくるから適度に

削ってやってね
• PHP: trim, Ruby: String#chomp
• 変な文字列を渡されても実行時エラーを

出さないように気をつけて実装してね
• 0<q≦1 の範囲外は無視すればいいよ
RFC2616 HTTP/1.1
• Qiitaにも説明書いたよ

http://qiita.com/tadsan/items/24cf40f067295df2ffb8
• PHPに実装してみたよ(Localeのラッパー)

https://github.com/zonuexe/php-http-accept-language
• pixivに入ってる処理はもっと適当だよ!
• もっと適当にやっても案外うまくいく
• 現実の要求に応じて適切に実装すべき
   _
   \ヽ, ,、
     `''|/ノ
      .|
 _    |
 \`ヽ、|
   \, V
      `L,,_
      |ヽ、)
     .|
    /           ,、
    /        ヽYノ
   .|       r''ヽ、.|
   |        `ー-ヽ|ヮ
    |            `|
   ヽ,    ,r      .|
     ヽ,r'''ヽ!'-‐'''''ヽ、ノ
 ,,,..---r'",r, , 、`ヽ、 ヾ
 ヽ、__/ ./ハレハ i`ヽ、 `''r`ミ_
   .レ//r,,,、 レ'レハヾ,  L,,_ `ヽ、
    "レ, l;;;l   l;;;l`i.リレ' リ ̄~~
     ヽ、 ワ `"/-'`'`'
       `''''''''"      ┼ヽ  -|r‐、. レ |
                 d⌒) ./| _ノ  __ノ
使用フォント
セプテンバーM・L

Accept-language