Language Tags in HTTP

この頁では、HTTPHTMLで「言語」を表現する時に使用する言語タグや、その指定方法などについて解説します。

言語タグとは

はじめに

言語タグとは、データ内の「言語(自然言語)」に関する情報を表現するために、HTTPヘッダHTMLの中で使用します。 RFC 2616のsection 3.10に記述されています。

言語タグは、他の人間との情報のコミュニケーションのため、人間によって話され、書かれ、あるいは別の方法で伝えられる自然言語を識別する。 コンピュータ言語は完全に除外される。 HTTP では、Accept-LanguageContent-Language 各フィールドにおいて言語タグを使用する。

HTTP 言語タグの構文や登録は、RFC 1766 で定義されたものと同じである。 要約すると、言語タグは、第一の言語タグと空の可能性のあるサブタグのいくつかから成る。

 language-tag  = primary-tag *( "-" subtag )
 primary-tag   = 1*8ALPHA
 subtag        = 1*8ALPHA

ホワイトスペースはタグの中では認められず、すべてのタグで大文字・小文字を区別しない。 言語タグの名前空間は IANA によって管理されている。 例えば、言語タグには以下のような物がは含まれる。

 en, en-US, en-cockney, i-cherokee, x-pig-latin

第一タグの二文字は、ISO-639 の言語短縮形であり、サブタグの最初の二文字は、ISO-3166 カントリーコードである。 (上記の後ろ三つのタグは登録されていないタグである; しかし、全て将来に登録されるかもしれないタグの例である。)

(※) 上記文中のRFC 1766は、その後別のRFCによって置き換えられています。 最新の情報については、RFC INDEXで追跡してください。 (追跡方法は、RFCについてでご確認ください)

HTTPでは、Accept-LanguageContent-Languageといった、言語に関するHTTPヘッダにおいて、メッセージボディで使用されている自然言語を示すために使用します。 通信シーケンスに関しては、以下の図をご覧ください。

図 言語タグを使ったサーバ駆動型ネゴシエーション

Accept-LanguageContent-Languageに含まれる言語タグには、ISO 639ISO 3166といった自然言語を表すための定型的な略語が使われます。

Accept-Language

Accept-Language リクエストヘッダフィールドは、Accept に似ているが、リクエストへのレスポンスとして望む自然言語のセットを限定する。 言語タグは、section 3.10 にて定義されている。

 Accept-Language = "Accept-Language" ":"
                   1#( language-range [ ";" "q" "=" qvalue ] )
 language-range  = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )

それぞれの languege-range では、そのレンジで指定する言語に対するユーザの優先度を示す品質値をつける事ができる。 品質値の既定は、"q=1" である。例を見よ。

 Accept-Language: da, en-gb;q=0.8, en;q=0.7

これは、"私はデンマーク語を望むが、イギリス英語か、他の英語でも受け入れる。" という事を意味する。 もし languege-range が、タグに一致する時、あるいはタグの接頭辞に等しくてそれに続く文字が "-" である時には、言語タグに一致する。 Accept-Language フィールドに特別なレンジである "*" がある場合は、その Accept-Language フィールド内に無いあらゆるタグに一致する。

ユーザが使用したい自然言語を示すために使用されます。 複数の言語を指定するすることができ、その場合の優先度は品質値で指定します。

(※) 言語タグの利用によるセキュリティリスクについてもご確認ください。

Content-Language

Content-Language エンティティヘッダフィールドは、それと共に送られるエンティティの読者の自然言語を表す。 ただし、エンティティボディで使われている言語のすべてとは一致しないかもしれない事に注意せよ。

 Content-Language  = "Content-Language" ":" 1#language-tag

言語タグは、section 3.10 にて定義されている。 Content-Language の主な目的は、ユーザ自身が望む言語に応じて、エンティティを識別したり区別したりできるようにするためである。そのため、もしボディの内容がデンマーク語を理解できる人のみを対象にしているのならば、それに合ったフィールドは次のようになる。

 Content-Language: da

レスポンスのエンティティに使用されている自然言語を示すためのフィールドです。 ここにも、複数の言語タグを指定することができますが、その場合の「リソースに含まれる言語の割合」などを表現することはできません。 言語タグの使用例を参照ください。

言語タグの使用例

言語タグは、HTTPヘッダHTMLの中で使用されますが、使用場面によって意味合いが少しずつ変わります。 上記文中のRFC 1766を置き換えた、RFC 3066のsection 2.4をご覧下さい。

タグとそれが関連する情報との間の関係は、それが表れる状況を記述する標準によって定義される。 それ故に、この節ではその使用が可能な例のみを与える。

この4つのパターンについて、具体的にContent-Languageの使用例をご覧ください。

パターン1:リソースを構成する自然言語が単一の場合

まずは、最も単純なパターンです。

 HTTP/1.1 200 OK
 Content-Type: text/plain
 Content-Language: ja
 Content-Length: 10

 こんにちは

この例では、「HTTPレスポンスで返されるtext/plainファイルは日本語で記述されている」と解釈できます。 また、HTTPレスポンスで転送できるデータは文書に限らないため、以下のような利用も考えられます。 RFC 3282のsection 2.1の例をご覧ください。

Liverpool の下町にて録音された声

 Content-type: audio/basic
 Content-Language: en-scouse

Star Trek からの引用

 Content-type: video/mpeg
 Content-Language: i-klingon

このように、音声データや、動画データなどにもContent-Languageを送っておけば、レスポンスを利用するクライアント側で「このデータの言語は○○語です」などと表示するなどして、音声や動画を見ることなく、ユーザに通知することができます。

パターン2:リソースを構成する自然言語が複数の場合

次に、複数ファイルがパッケージングされているパターンなどです。

 HTTP/1.1 200 OK
 Content-Type: application/x-tar
 Content-Encoding: gzip
 Content-Language: ja, en
 (以下略)

この例では、「返されるアーカイブ内には日本語のリソースと英語のリソースがそれぞれ含まれている(が、1つのレスポンスとして返す)」と解釈できます。 また、以下のようなパターンも考えられます。 RFC 3282のsection 2.1の例をご覧ください。

英仏辞典(※)

 Content-type: application/dictionary
 Content-Language: en, fr (This is a dictionary)

(※) ただし、RFC 2616ではContent-Language中でコメント(括弧付の文言)を使用することはできません。

これは、「和英辞典」の場合です。 最初のアーカイブの場合、Content-Languageの意味は「『日本語のリソース』と『英語のリソース』が2つある」というように解釈できますが、この場合は「主に日本人が読むリソースだけれども、『日本語の使用比率』と『英語の使用比率』が同等程度である」というように解釈ができます。

パターン3:リソースが一度に複数返され、それぞれの自然言語が異なる場合

3番目のパターンは、MIMEマルチパートタイプです。

公式な欧州委員会の (その公用語のいくつかによる) 文書

 Content-type: multipart/alternative
 Content-Language: da, de, el, en, fr, it

この例は、どちらも複数のデータを1つのレスポンスボディの中に含めて転送しているという点で、アーカイブの例とよく似ています。 違う点は、アーカイブが「『アーカイバ』という外部プログラム」を利用しているのに対して、この例では「『マルチパートタイプ』という転送プロトコルの仕組み」を利用しているという点です。

パターン4:一つのリソース中に、別の自然言語が組み込まれて使用されている場合

最後のパターンは、HTMLXMLのようなマークアップ言語の場合です。

 HTTP/1.1 200 OK
 Content-Type: text/html
 Content-Language: ja
 (以下ヘッダ略)

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 <html lang="ja">
 (中略)

 <p>トイレットペーパーは、中国語では<span lang="zh">手紙</span>と書くそうですよ。</p>

 (中略)
 </html>

このパターンのポイントは、Content-Languageヘッダではjaという言語タグを返しているということです。 これにより、「このHTMLは日本語を理解できる人向けに記述されているが、その上で一部だけ日本語以外の言語(この場合は中国語)を使用している」ということを示しています。 和英辞典の例と比べて、「対象言語の使用比率」は日本語が圧倒的に大きいので、この場合は「このレスポンスの構成言語は日本語」とのみ書かれているわけです。

ISO 639に基づく主要タグの値

このサイトでは、primary-tag主要タグと訳します。 主要タグについて、RFC 3066 の section 2.2をご覧下さい。

主要タグについては以下の規則が適用される:

他の全てのタグが予約されている理由は、新たな ISO 639 の改訂版に向けて制限なくあるべきであるからである; すなわち、"i" や "x" の使用は最小限我々が当面の要求に直面するようなメカニズムをここで拡張できるためのものである。

主要タグとなりうる値には、いくつか種類がありますが、最も一般的なものはISO 639にある2文字コードです。 以下の表は、主要タグとそれが示す言語名の対応について、RFC 3066の参照文献ともなっているISO 639:1988に基づいて、当サイトが作成したものです。 以下で定義した言語名は、当サイトが独自に定義した読み方であり、「正しい読み方」を保証するものではないことをご了承下さい。

ISO 639:1988 に基づく主要タグ値と言語名の対応表
主要タグ値言語名
aaアファル語
abアプカジア語
afアフリカーンス語
amアムハラ語
arアラビア語
asアッサム語
ayアイマラ語
azアゼルバイジャン語
baバシュキール語
be白ロシア語
bgブルガリア語
bhビハール語
biビスラマ語
bnベンガル語
boチベット語
brブルターニュ語
caカタロニア語
coコルシカ語
csチェコ語
cyウェールズ語
daデンマーク語
deドイツ語
dzブータン語
elギリシャ語
en英語
eoエスペラント
esスペイン語
etエストニア語
euバスク語
faペルシャ語
fiフィンランド語
fjフィジー語
foフェロー語
frフランス語
fyフリジア語
gaアイルランド語
gdスコットランド・ゲール語
glガリシア語
gnグアラニー語
guグジャラト語
haハウサ語
heヘブライ語
hiヒンディー語
hrクロアチア語
huハンガリー語
hyアルメニア語
iaインタルリンガ
ie国際語
ikイヌピア語
idインドネシア語
isアイスランド語
itイタリア語
iuイヌイット語
ja日本語
jvジャワ語
kaグルジア語
kkカザフ語
klグリーンランド語
kmカンボジア語
knカンナダ語
ko韓国語
ksカシミール語
kuクルド語
kyキルギス語
laラテン語
lnリンガラ語
loラオス語
ltリトアニア語
lvラトビア語
mgマダガスカル語
miマオリ語
mkマケドニア語
mlマラヤーラム語
mnモンゴル語
moモルダビア語
mrマラッタ語
msマレー語
mtマルタ語
myビルマ語
naナウル語
neネパール語
nlオランダ語
noノルウェー語
ocオキタン語
omオロモ語
orオリア語
paパンジャブ語
plポーランド語
psパシュト語
ptポルトガル語
quクエチュア語
rmレトロマンス語
rnキルンディ語
roルーマニア語
ruロシア語
rwキニャルワンダ語
saサンスクリット語
sdシンド語
sgサングロ語
shセルボ・クロアチア語
siシンハラ語
skスルバキア語
slスロベニア語
smサモア語
snショナ語
soソマリ語
sqアルバニア語
srセルビア語
ssシスワティ語
stセソト語
suスーダン語
svスウェーデン語
swスワヒリ語
taタミル語
teテルグ語
tgタジク語
thタイ語
tiチグリニャ語
tkトルクメン語
tlタガログ語
tnセツワナ語
toトンガ語
trトルコ語
tsツォンガ語
ttタタール語
twトウィ語
ugウイグル語
ukウクライナ語
urウルドゥー語
uzウズベク語
viベトナム語
voヴォラピュック語
woウォロフ語
xhコーサ語
yiイディッシュ語
yoヨルバ語
zh中国語
zuズールー語

また、公的な機関に定義されていない言語名を使用したい場合は、主要タグの先頭にx-をつければ、好きな値を使用することができます。

ISO 3166に基づくサブタグの値

RFC 3066のsection 2.2では、引き続き、主要タグの直後に続く第二サブタグについても記述されています。

第二サブタグについては以下の規則が適用される:

第三及びそれ以降のサブタグについて、構文上つけ加えられる規則はない。

その全てがこの章によってその解釈を割り当てられるコードにて構築されるようなタグは、その使用の前に IANA にて登録される必要はない。

サブタグ中の情報は、例えば以下のようであるだろう:

ここでは、4種類の例が列挙されていますが、最も一般的なものは“言語名-国名”というタイプのものです。 この国名は上にある通り、ISO 3166に基づいて決定されています。 以下の表は、国名を表すサブタグとそれが示す国名の対応について、RFC 3066の参照文献ともなっているISO 3166:1988に基づいて、当サイトが作成したものです。 以下で定義した国名は、当サイトが独自に定義した読み方であり、「正しい読み方」を保証するものではないことをご了承下さい。

ISO 3166:1988 に基づく言語サブタグ値と国名の対応表
サブタグ値国名
ADアンドラ
AEアラブ首長国連邦 (UAE)
AFアフガニスタン
AGアンティグアバーブーダ
AIアンギラ
ALアルバニア
AMアルメニア
ANオランダ領アンティル
AOアンゴラ
AQ南極
ARアルゼンチン
ASアメリカ領サモア
ATオーストリア
AUオーストラリア
AWアルバ
AZアゼルバイジャン
BAボスニア・ヘルツェゴビナ
BBバルバドス
BDバングラディシュ
BEベルギー
BFブルキナファソ
BGブルガリア
BHバーレーン
BIブルンジ
BJベナン
BMバミューダ諸島
BNブルネイ
BOボリビア
BRブラジル
BSバハマ諸島
BTブータン
BVブーベ島
BWボツワナ
BYべラルーシ
BZベリーズ
CAカナダ
CCココス (キーリング) 諸島
CDコンゴ民主共和国
CF中央アフリカ
CGコンゴ
CHスイス
CIコートジボアール
CKクック諸島
CLチリ
CMカメルーン
CN中国
COコロンビア
CRコスタリカ
CUキューバ
CVカポベルデ
CXクリスマス島
CYキプロス
CZチェコ
DEドイツ
DJジブチ
DKデンマーク
DMドミニカ
DOドミニカ共和国
DZアルジェリア
ECエクアドル
EEエストニア
EGエジプト
EH西サハラ
ERエリトリア
ESスペイン
ETエチオピア
FIフィンランド
FJフィジー
FKフォークランド諸島
FMミクロネシア
FOフェロー諸島
FRフランス
FXフランス・メトロポリタン
GAガボン
GBイギリス (Great Britain)
GDグレナダ
GEグルジア
GFフランス領ギアナ
GHガーナ
GIジブラルタル
GLグリーンランド
GMガンビア
GNギニア
GPグアドループ島
GQ赤道ギニア
GRギリシャ
GS南ジョージ・南サンドイッチ諸島
GTグアテマラ
GUグアム
GWギニアビサウ
GYガイアナ
HK香港
HNホンジュラス
HRクロアチア
HTハイチ
HUハンガリー
IDインドネシア
IEアイルランド
ILイスラエル
INインド
IOイギリス領インド洋領域
IQイラク
IRイラン
ISアイスランド
ITイタリア
JMジャマイカ
JOヨルダン
JP日本
KEケニア
KGキルギスタン
KHカンボジア
KIキリバス
KMコモロ
KNセントキッツネイビス
KP北朝鮮
KR韓国
KWクウェート
KYケイマン諸島
KZカザフスタン
LAラオス
LBレバノン
LCセントルシア
LIリヒテンシュタイン
LKスリランカ
LRリベリア
LSレソト
LTリトアニア
LUルクセンブルク
LVラトビア
LYリビア
MAモロッコ
MCモナコ
MDモルドバ
MGマダガスカル
MHマーシャル諸島
MKマケドニア
MLマリ
MMミャンマー
MNモンゴル
MOマカオ
MP北マリアナ諸島
MQマルチニーク
MRモーリタニア
MSモントセラト
MTマルタ
MUモーリシャス
MVモルディブ
MWマラウイ
MXメキシコ
MYマレーシア
MZモザンビーク
NAナミビア
NCニューカレドニア
NEニジェール
NFノーフォーク諸島
NGナイジェリア
NIニカラグア
NLオランダ
NOノルウェー
NPネパール
NRナウル
NUニウエ
NZニュージーランド
OMオマーン
PAパナマ
PEペルー
PFフランス領ポリネシア
PGパプアニューギニア
PHフィリピン
PKパキスタン
PLポーランド
PMサンピエール・ミクロン
PNピトケアン
PRプエルトリコ
PTポルトガル
PWパラオ
PYパラグアイ
QAカタール
REレユニオン島
ROルーマニア
RUロシア
RWルワンダ
SAサウジアラビア
SBソロモン諸島
SCセーシェル
SDスーダン
SEスウェーデン
SGシンガポール
SHセントヘレナ
SIスロベニア
SJスバールバル・ヤンマイエン諸島
SKスロバキア
SLシエラレオネ
SMサンマリノ
SNセネガル
SOソマリア
SRスリナム
STセントメ・プリンシペ
SVエルサルバドル
SYシリア
SZスワジランド
TCタークス・カイコス諸島
TDチャド
TFフランス南方領
TGトーゴ
THタイ
TJタジキスタン
TKトケラウ
TMトルクメニスタン
TNチュニジア
TOトンガ
TP東ティモール
TRトルコ
TTトリニダード・トバゴ
TVツバル
TW台湾
TZタンザニア
UAウクライナ
UGウガンダ
UKイギリス (United Kingdom)
UMアメリカ合衆国外諸島
USアメリカ
UYウルグアイ
UZウズベキスタン
VAヴァチカン市国
VCセントビンセント・グレナディン
VEベネズエラ
VGイギリス領ヴァージン諸島
VIアメリカ領ヴァージン諸島
VNベトナム
VUバヌアツ
WFワリス・フツナ諸島
WSサモア
YEイエメン
YTマイヨット
YUユーゴスラビア
ZA南アフリカ
ZMザンビア
ZRザイール
ZWジンバブエ

第二サブタグ以降には、国名だけでなく、地域名を入れる場合もあります。 たとえば、沖縄の言葉で記述された文書のContent-Languageには、ja-okinawaja-JP-okinawaなどのタグを使って、受信者に通知することができます。

言語タグの利用によるセキュリティリスクについて

Accept-Languageを利用すると、ユーザが利用できる自然言語をサーバに示すことができますが、このヘッダを不用意に利用してしまうことで、セキュリティ上の問題を引き起こす可能性が指摘されています。 RFC 2616のsection 14.4、および15.1.4をご覧ください。

ユーザが、すべてのリクエストに完全な言語優先度を伴った Accept-Language ヘッダを送信する事は、プライバシー保護の立場とは逆のものとなるかもしれない。 この問題の議論について、section 15.1.4 参照。

Accept リクエストヘッダは、アクセスされたすべてのサーバにユーザに関する情報を表す事ができる。 特に Accept-Language ヘッダは、特定の言語を理解するという事がしばしば特定の民族グループの一員である事と強く関連付けられているため、個人的な性質であるとみなすであろう情報を表す。 リクエスト毎に送られる Accept-Language ヘッダの内容を設定するためのオプションを提供するユーザエージェントは、設定のプロセス中にそれがユーザのプライバシーの損失になるという事に気づかせるようなメッセージを含むようにする事が強く推奨される。

プライバシーの損失をより制限するためには、ユーザエージェントが既定では Accept-Language ヘッダを送信しないようにし、サーバによって生成された Vary レスポンスヘッダフィールドを見つけ、その送信によってサービスの品質を向上できるとわかった場合に、サーバに Accept-Language ヘッダを送る事を開始するどうかをユーザに尋ねるようにする。

ユーザによって設定された詳細な Accept ヘッダフィールドがリクエストごとに送られ、特にそれらが品質値を含んでいたら、比較的信頼でき長い間住んでいる{long-lived} ユーザを識別するものとしてサーバによって使われうる。 そのようなユーザを識別するものは、内容供給者がクリックの追跡{click-trail tracking} をできるようにし、共同で作業する内容供給者が個々のユーザのサーバ越しのクリックの追跡{cross-server click-trail} やフォーム提出と一致できるようにする。 プロクシの内側でない多くのユーザにとって、ユーザエージェントが実行されているホストのネットワークアドレスも長く住んでいる{long-lived} ユーザを識別するものとして役に立つという事に注意せよ。 プロクシがプライバシーを高めるために使用されている環境においては、ユーザエージェントはエンドユーザに accept ヘッダコンフィギュレーションオプションを提供する事には保守的であるべきである。 極端なプライバシー手段として、プロクシは中継されたリクエストにおける accept ヘッダをフィルタできる。 高いヘッダ設定機能を供給する一般的な目的のユーザエージェントは、伴う可能性のあるプライバシーの損失に関してユーザに警告すべきである

たとえば、Accept-Language: jaというヘッダが送信された時、サーバ側では「日本語を使うユーザからのアクセスがあった」ということがわかります。 世界中で日本語が公用語になっているのは日本だけですから、すなわち日本語を使う人間のほとんどは日本人です。 ここで問題とされていることは、「ユーザが日本人である」ということによる差別が発生するかもしれないということです。

基本的にAccept-Languageは送られるべきですが、クライアントがセキュリティ上の観点から、送るべきではないと判断した場合には送らなくてもかまいません。 たとえば、サーバ駆動型ネゴシエーションを利用しようとしなければ、このヘッダは必要ありません。

参照文献

Webリソース