HTMLとXMLにおける言語タグ

想定する読者: XHTML/HTMLコーダー(エディタやスクリプトを使用)、スクリプトデベロッパー(PHP、JSPなど)、スキーマデベロッパー(DTD、XML Schema、RelaxNGなど)、XSLTデペロッパー、Webプロジェクトマネージャ、規格実装者、およびBCP 47を使用してどのように言語タグを構成するかの要約を必要とする人。

要約

用語

この記事では、言語タグとしてfr-CAなどの言語属性の値を参照します。タグの一部として記述するときfrCA部分をサブタグと呼びます。言語や国のISOリストのメンバーとして記述する場合、frCAはコードと呼ばれます。

言語タグは、HTMLとXML文書でテキストまたは他の項目の言語を示すために使用されます。HTMLで言語タグの指定はlang 属性を使用し、XMLではxml:lang属性を使用します。

どちらの場合も、これらの要素の1つが(同じ方法で)別の言語を宣言しない限り、言語情報は、宣言された内側の要素に継承されます。

RFCは、IETFが仕様と呼ぶものです。各RFCは固有の番号を持っています。残念ながら、RFC 1766やRFC 3066が他の仕様によって廃止されて置き換えられていることを、これらRFCを読んだときに伝えることはできません。

言語タグの構文は、IETFBCP 47で定義されています。 BCPは、"Best Current Practice"(現時点でのベストプラクティス)の略で、更新時に番号が変化するRFCシリーズに対する永続的な名前です。言語タグの構文を説明する最新のRFCは、RFC 5646, Tags for the Identification of Languagesであり、古いRFC 46463066、および1766を廃止します。

以前は、さまざまなISO規格でコードのリストを参照してサブタグを検索していましたが、現在は、IANA Language Subtag Registryですべてのサブタグを検索できます。以下で新しいレジストリについて説明します。

注意! 言語タグを選択するためのステップバイステップのガイダンスが必要なら、Choosing a language tagを読むべきです。ここでは、BCP 47で記述されるような、言語タグに関わる構文や概念の高レベルの概要を提供します。

ほとんどの言語タグは、2文字か3文字の言語サブタグで構成されます。 多くは、言語サブタグの後に2文字か3文字の領域サブタグが続きます。RFC 5646はまた、必要な場所で多数の追加のサブタグを許可します。用字、異形、拡張、および私用サブタグを含む、追加のサブタグは、次のセクションで簡潔に説明されます。

言語タグを作成するときのゴールデンルールは、できるだけタグを短くすることです。有用な区別する情報を加える箇所を除いて、領域、用字または他のサブタグを避けてください。たとえば、日本だけで話されるような日本語であると言う必要がある特別な理由がない場合、日本語に対してja-JPではなく、jaを使用するのです。

例:

コード 言語 サブタグ
en 英語 言語
mas マサイ語 言語
fr-CA カナダで使われるフランス語 言語+領域
es-419 ラテンアメリカで使われるようなスペイン語 言語+領域
zh-Hans 簡体字で書かれる中国語 言語+用字

HTMLとXMLはまた、空の文字列を使用することで言語の継承を防ぐ手段を提供します。すなわち、xml:lang=""。これは本質的に、この情報にどの言語も関連付けないことを表します。

以下の文書は、どのように言語タグを組み立てるかについての追加の詳細を提供します。

言語タグを組み立てる

RFC 3066のような、RFC 5646とそれ以前の仕様との間の主な相違点は、以下の通りです:

  1. 有効なサブタグを探すただ1つの場所、新しいIANA registryがあります。
  2. サブタグは固定された位置と長さを持ちます。これは、言語タグのマッチングをより簡単にします。
  3. 言語タグの潜在的な構成要素の周りにより多くの柔軟性を持ちます。

RFC 3066は基本的に、そのままの言語コードか、言語コードに国コードを加えたもの、あるいはIANA language tag registryで特別に登録されたごく少数の値のいずれかの言語タグを構成します。

RFC 5646は、より多くのサブタグのタイプを供給し、さまざまな方法でサブタグを組み合わせることができます。 これは、人生がはるか複雑なもののように見えるかもしれませんが、一般に言語タグを選択することは簡単な問題であり続けるでしょう―しかし、言語タグを扱うためにはさらなるパワーを必要とします。実際には、ほとんどの人に対して、RFC 5646は、多くの方法で人生をより楽にするでしょう―ひとつは、有効なサブタグを探す必要がある場所は1つのみしかありません。

RFC 1766は共通の言語の違いを識別するための追加オプションを提供していますが、RFC 5646は以前に有効であったすべてのタグを含みます。RFC 1766、RFC 3066、またはRFC 4646を使用している場合、タグに変更を加える必要はありません。

以下のリストは、利用可能なサブタグのさまざまなタイプを示しています。以降のセクションでどのようにこれらを使用するかについて説明します。

言語-拡張言語-用字-領域-変種-拡張-私用

レジストリのエントリは、大文字と小文字に関して一定の規則に従います。たとえば、言語タグは小文字であり、領域タグは大文字であり、用字タグは頭文字が大文字で始まります。これは単なる慣習にすぎません。実行するシステムの規則によって制約されない限り、これらのサブタグを使用するとき、好きなように使用できます。HTMLとXMLのマークアップ言語では、大文字・小文字を問題にしません。

サブタグのレジストリを使用する

上記のように、以前は、さまざまなISO規格でコードのリストを参照してサブタグを検索していましたが、現在は、1ヶ所ですべてのサブタグを検索できます。ISOコードリストと比べて、IANA registryは初め少し複雑に見えますが、いったん構造を理解してしまえば、簡単に使用できます。

レジストリは大きなテキストファイルです。言語サブタグを見つけるには、英語で、その言語の名前に対するページを検索します。'フランス語'を検索するならば、このようなレコードを見つけるでしょう:

%%
Type: language
Subtag: fr
Description: French
Added: 2005-10-16
Suppress-Script: Latn
%%

このレコードのタイプがlanguageであることに注意してください。 探しものは、frの値を示す、Subtagとラベルのついたコードです。

同じように、他のタグを探すことができます。たとえば、タグfr-CA(カナダで使用されるフランス語)を作成するために、'Canada'を検索して、'region'タイプのタグを見つけたことを確認するでしょう。

しかし、サブタグを選ぶとき際に心に留める必要がある追加事項があります。たとえば、冗長(redundant)または廃止(deprecated)としてレジストリに記載されているサブタグを避けるべきですし、特定の所定のサブタグとの組み合わせでは異形サブタグを使用する必要があります。サブタグの選択に関する詳細は、Choosing a language tagを参照してください。

リチャード・イシダはまた、ユーザーフレンドリーなレジストリ検索のためのツールを作成しています。

以下のセクションは特定のサブタグに関する詳細があります。

主要言語サブタグ

言語サブタグ

en
ast

BCP 47仕様で続きを読む:

2.2.1 Primary Language Subtag

4.1 Choice of Language Tag

4.1.1 Tagging Encompassed Languages

すべての言語タグは、主要言語サブタグで始まらなければなりません。

言語のみの言語タグを含む、単純な例:

これらのコードはISO 639言語コードに由来し、最新の状態に保たれています。

RFC 3066が有効なサブタグのリストを供給することなく、単にユーザーにISO 639を参照していたので、ISO コードリストが2文字と3文字の両方(ときには複数の3文字コード)を含む場合に、言語にタグ付けする方法について混乱することがありました。現在では、すべての有効なサブタグが1つのIANA registryに記載されています。これは、言語ごとにISOリストから1つの値だけを採用します。2文字のISOコードが利用可能な場合、それがレジストリにあるでしょう。そうでなければ、レジストリは1つの3文字コードを含むでしょう。これで事態はより簡単になるはずです。

RFC 5646が発行された時点で、7000以上の新しいISO 639-3の3文字コードがサブタグレジストリに追加されました。

これは、スペイン語に対する主要言語サブタグesのレジストリでの例です:

%%
Type: language
Subtag: es
Description: Spanish
Description: Castilian
Added: 2005-10-16
Suppress-Script: Latn
%%

コードは大文字・小文字を区別しないにもかかわらず、通例小文字で書かれますが、これは単なる慣例です。

拡張言語サブタグ

拡張言語サブタグ

zh-yue
ar-afb

BCP 47仕様で続きを読む:

2.2.2 Extended Language Subtags

4.1.2 Using Extended Language Subtags

拡張言語サブタグは、'extlang'サブタグとも呼ばれます。拡張言語サブタグは、常に特定の主要言語サブタグの後に付けなければならず、とりうる言語タグは1つのみかもしれませんし、2つ以上かもしれません。

拡張言語サブタグを含む言語タグの例:

主要言語+拡張言語の組み合わせは、古い言語タグ形式に対応するために提供されていますが、各主要言語+拡張言語の組み合わせに対して利用可能な単一の言語サブタグがあります。できるだけ主要言語+拡張言語の組み合わせではなく、単一の言語サブタグを使用するべきです。たとえば、広東語に対してzh-yueよりもyueを、湾岸方言に対してar-afbよりafbを可能であれば使用します。

拡張言語サブタグは常に3文字の長さです。レジストリ内の各エントリは、拡張言語サブタグに先行しなければならない言語を指定するPrefix項目を含みます。また、同等の言語タグを示すPreferred-Value項目を含みます。

これはレジストリでの、アラビア語湾岸方言afbに対する拡張言語コードの例です:

%%
Type: extlang
Subtag: afb
Description: Gulf Arabic
Added: 2009-07-29
Preferred-Value: afb
Prefix: ar Macrolanguage: ar
%%
			

マクロ言語 拡張サブタグで使用される主要言語サブタグは、マクロ言語として知られており、より具体的な主要言語サブタグを含む多数の言語を網羅しています。マクロ言語サブタグは単独で使用できますが、使われる文脈でのその意味に関する規則が存在しない限り、必ずしも正確ではありません。

たとえば、zhは中国語を意味しますが、しばしば相互に理解できない多くの中国語の方言を含みます。これはBCP 47で明示的に指定されていないものの、zh自身が使用されるとき、通常含まれる範囲で優勢な言語を意味するために使用されます。たとえば、慣習的にzhは、優勢である中国語の北京方言形式を表すと考えられます。完全な明快さが必要とされる場所で、相互運用性を壊さない限りcmnを代わりに使用することができます。しかし、客家語のような北京方言でない言語を表すためにzhを使用する場合、明示的なコード(この場合、hak)を使用したほうがより良くなります。

一方、zh-Hansは、その一般的な意味でのzhを扱います。これは、読者の方言にかかわらず、中国語が同じ流儀で書かれる傾向があるため、簡体字で書いていることを示すのに便利な方法です。

用字サブタグ

用字サブタグ

zh-Hans
az-Latn

BCP 47仕様で続きを読む:

2.2.3 Script Subtag

4.1 Choice of Language Tag

用字サブタグを含む言語タグの例:

用字サブタグは、RFC 4646で初めて導入されました。このサブタグはISO 15924用字コードに由来し、最新の状態に保たれています。

ただ1つの用字サブタグは言語タグに出現することができ、言語または拡張サブタグの直後に続かなければなりません。これは、常に4文字の長さです。

あなたが区別をするために必要な場合にのみ、用字タグを使用するべきです。 RFC 4646の共著者である、アディソン・フィリップスは、「現在、用字タグを使用していない実質的にどんな内容に対しても、将来において用字タグを使用しないことは、相変わらずベストプラクティスとなります。」と述べています。

内容が書かれていないことを具体的に示したい場合、そのためのサブタグがあります。たとえば、英語での文書内容ではなく、音声録音であることを明確にするために、en-Zxxxを使用できます。

実際には、レジストリにおいて多くの言語のサブタグエントリは、Suppress script項目を含むことによって、用字タグの使用を強く思いとどまらせます。上記のスペインの例では、通常、スペイン語はアルファベットを使用して書かれることを示す項目があります。通常、Latnサブタグはesと共に使用すべきではありません。

この例は、ロシア語などの言語に使用される、キリル文字の用字Cyrlに対するレジストリ項目を示しています:

%%
Type: script
Subtag: Cyrl
Description: Cyrillic
Added: 2005-10-16
%%

言語タグの一般的な用途に対して、用字を指定する必要なさそうであるけれども、しばらくの間必要とするいくらかの状況があります。その一例は中国です。中国語には、しばしば互いに難解な多数の方言がありますが、これらの方言は、すべて簡体字か繁体字のどちらかを使用して書かれています。一般に、簡体字か繁体字のどちらかとして中国の文字を分類したいと思っていましたが、最近までその方法がありませんでした。簡体字を意味するためにシンガポールでさえzh-CN(中国で話される中国語を意味する)のように、および繁体字に対してzh-TW(台湾で話される中国語を意味する)と意味を歪曲する必要がありました。(しかし、繁体字に対してzh-HKを使用する。)一貫性のために一部場合において古い言語タグを使用し続ける必要があるかもしれませんが、簡体字および繁体字で書かれた中国語に対するzh-Hanszh-Hant の有用性は、一貫性と正確性を向上させるべきであり、そしてすでに広く使われるようになっています。

領域サブタグ

領域サブタグ

en-GB
es-005
zh-Hant-HK

BCP 47仕様で続きを読む:

2.2.4 Region Subtag

4.1 Choice of Language Tag

領域サブタグを含む言語タグの例:

RFC 3066の領域サブタグは、ISO 3166国コードから値を採用しました。 これらの2文字コードは新しいレジストリからなおも利用可能ですが、レジストリは3桁のUN M.49リージョンコードも記載します。このコードの利点は、国以上を表すことができることです。たとえば、ローカライゼーショングループは、しばらくの間、特定の国のスペイン語よりもむしろラテンアメリカのスペイン語で書かれものとして慎重に分類したがっていました。RFC 5646で、これは可能です。適切な言語タグはes-419です。

ただ1つの領域サブタグが言語タグに出現することができ、言語と拡張、拡張サブタグの後に出現しなければなりません。これは、2文字の英字か3桁の数字コードです。en-USなどの言語タグに対して使われているのと同様に、領域コードは言語コードの直後になります。

あなたが区別をするために必要な場合にのみ、領域タグを使用するべきです。イタリアで話されるようなイタリア語を話していることを明確に強調する必要がない限り、イタリア語に対して it-ITではなくitを使用するべきです。同じことが、他の可能な組み合わせにあてはまります。

レジストリからの例は、オーストリアに対するコードAT、および北アフリカに対するコード015を示します:

%%
Type: region
Subtag: AT
Description: Austria
Added: 2005-10-16
%%
Type: region
Subtag: 015
Description: Northern Africa
Added: 2005-10-16
%%

異形サブタグ

異形サブタグ

sl-nedis
sl-IT-nedis
de-CH-1901

BCP 47仕様で続きを読む:

2.2.5 Variant Subtags

4.1 Choice of Language Tag

異形サブタグは、方言または言語、用字および領域サブタグの組み合わせでカバーできない用字の変種を示すために使用される値です。異形サブタグは、言語または領域サブタグの後に出現しなければなりませんが、用字と領域サブタグが異形サブタグの前に先行する必要はありません。

専門分野で働いている場合を除いて、異形サブタグを使用する必要はほとんどありません。

以下の例は、異形サブタグが何をするかを理解するのに役立つかもしれません。

このレジストリからの例は、スロベニア語のNadiza方言に対するコード、nedisを示します:

%%
Type: variant
Subtag: nedis
Description: Natisone dialect
Description: Nadiza dialect
Added: 2005-10-16
Prefix: sl
%%

レジストリにおいて、これらのサブタグは'Prefix'項目によって特定の言語に(および、このサブタグと主要言語サブタグの間におそらく追加のサブタグと)関連付けられます。上記のnedisの例は、スロベニア語と同時のときのみ使用できます。

現在利用できない特定の方言または用字のニュアンスを表現する必要がある場合、異形サブタグまたはレジストリでの包摂する対するサブタグを、RFC 5646で説明される登録手順を使用して提案するべきです。

拡張および私用サブタグ

拡張サブタグ

de-DE-u-co-phonebk

私用サブタグ

en-US-x-twain

BCP 47仕様で続きを読む:

2.2.7 Private Use Subtags

2.2.6 Extension Subtags

4.1 Choice of Language Tag

あなたが本当にこれらのサブタグを使用する必要があると思われる場合、この記事よりもむしろ、仕様書を読むべきです。

拡張よび私用サブタグは、1文字のタグ、つまり"札"によって導入されます。組織は拡張のための札を提案できます。これは、用途がRFC(IETF仕様)で記述しなければならないことを意味します。うまく審査を通過した場合、札はレジストリに追加されます。札xは、私的用途のために予約されています。複合的なサブタグが、札の後に許可されます。しかし、すべてのサブタグに関して、それぞれの長さは8文字以下でなければなりません。

拡張サブタグは、言語タグの拡張を可能にします。たとえば、拡張サブタグuは、言語やロケール動作に関する情報を追加するためにUnicodeコンソーシアムによって登録されています。多くのロケール識別子には、追加の"手直し"や言語、文化、地域、または他の変種内の特定の値に対するオプションを必要とします。この拡張は、一般的な交換に対する言語タグ内でこれらの追加特性の手直しを使用に対するメカニズムを提供します。

たとえば、次の例は、電話帳の照合順序が、文書内のソートされたデータがその照合順序に従ってソートされたアプリケーションによって使用されるべきであることを示しています。

u-拡張は、サブタグの詳細について、Unicodeコンソーシアムの共通ロケールデータリポジトリ(CLDR)を指すRFC 6067で定義されています。これは、BCP 47で定義されていません。

私用サブタグは、サブタグレジストリに出現せず、仲間内での私的な合意によって選択および維持されます。

これらのサブタグは、私的な合意の中でのみ意味を持ち、ウェブで相互運用可能に使用できないので、それらは細心の注意を払って使用されるべきであり、可能な限り避けるべきです。

私用サブタグの以下の例は、閉じたコミュニティの中のみで、米国英語の固有のタイプを識別するかもしれません。私的な合意の外では、その意味を当てにできません。

除外されたおよび冗長な登録

BCP 47仕様で続きを読む:

2.2.8 Grandfathered and Redundant Registrations

除外されたタグは、後方互換性のために提供される特別な例です。除外されたタグは、現在のレジストリ内のサブタグから完全に構成することができない、RFC 4646の前に登録されているサブタグであるか、現在の言語タグで定義される構文に適合しません。

冗長なタグは、一続きのサブタグで構成されており、現在のレジストリから別のサブタグを組み合わせることによって作成できる、RFC 4646の前に登録されている言語タグです。オリジナルの登録は、'歴史的好奇心の問題として'主にレジストリに残っています。

多くの除外されたタグは、サブタグまたはレジストリ内のサブタグの組み合わせに取って代わりました。このような除外されたタグは、現在廃止されており、通常は代わりにどのようにしてその言語を表すべきかをを示すPreferred-Value項目を含みます。たとえば、次の除外されたタグの例は、art-lojbanの代わりにjbo言語サブタグを使用すべきであることを示します。

%%
Type: grandfathered 
Tag: art-lojban 
Description: Lojban 
Added: 2001-11-11 
Deprecated: 2003-09-02 
Preferred-Value: jbo 
%%

言語タグのマッチング

多数のアプリケーションに対して、異なる言語タグをマッチングすることは重要です。BCP 47によると、enen-GBとマッチすると言います。たとえば、次のCSSコードは、疑似属性:langをサポートするブラウザですべての英文を赤に着色します。

:lang(en) { color: red; }

次のコードにおいて、lang="en-GB"として記述されたテキストは赤くなるでしょう。

<p>En janvier, toutes les boutiques de Londres affichent des panneaux 
<span lang="en-GB">SALE</span>, mais en fait ces magasins sont bien propres!</p>

一方、以下のCSS宣言を与えると、

:lang(en-GB) { color: red; }

単語'SALE'は次のコードで赤になるべきではありません

<p>En janvier, toutes les boutiques de Londres affichent des panneaux 
<span lang="en">SALE</span>, mais en fait ces magasins sont bien propres!</p>

RFC 5646において追加タグの可能性のために、マッチングはもう少し複雑です。さらに、手引きであるRFC 4647 Matching of Language Tagsは、マッチングに複数の可能なアプローチについて説明します。マッチングは別の文書で説明されるでしょう。

ところで

HTMLに対する言語タグは最初に、F. YergeauほかによるRFC 2070 Internationalization of the Hypertext Markup Languageで正式に定義されました。HTML 4に組み込まれたRFC 2070は、歴史的と再分類されています。

ISO言語コードに変更があったことに注意してください。1989に、iwinjiは撤回され、heidyiに置換されました。つい最近、チェコスロバキアを表すために使用されたISO国コードcsは、セルビアおよびモンテネグロを表すよう変更されました。長期にわたるテキストに割り当てられたコードを比較する場合、そのような変化は混乱を導くかもしれない。新しいIANAサブタグレジストリは、タグが新しいタグによって廃止され、取って代わられることを許容しますが、サブタグの意味を取り除くまたは変更を一切しません。また、ISOが未来の同様の方針に従うと予想されます。

多くのW3Cおよびウェブ関連の仕様が、言語タグを使用します:

言語情報はまた、画像やオーディオファイルの中などのオブジェクトに添付できることに注意してください。