[71] [DFN[[RUBYB[言語タグ]@en[language tag]]]]は、[[自然言語]]を識別するための短い[[文字列]]です。
[[ISO]] の定める[[言語符号]]などの組み合わせにより様々な[[言語]]や[[言語]]と[[地域]]や[[用字系]]などの組み合わせによるバリエーションを表現することができます。
[[言語タグ]]は [[IETF]] により [[BCP 47]] として標準化されており、様々な [[IETF]]
の[[プロトコル]]の他 [[HTML]] や [[CSS]] などの [[Web標準]]でも広く使われています。

* 仕様書

[REFS[
- [72] [CITE@en[RFC 5646 - Tags for Identifying Languages]]
<http://tools.ietf.org/html/rfc5646>
- [73] [CITE@en[RFC 4647 - Matching of Language Tags]] ([TIME[2011-06-26 10:41:18 +09:00]] 版) <http://tools.ietf.org/html/rfc4647>
- [74] [CITE[Language Subtag Registry]]
<http://www.iana.org/assignments/language-subtag-registry>
- [75] [CITE@en[IANA | Language Subtag Registry - Registration Templates]]
<http://www.iana.org/assignments/lang-subtags-templates/index.html>
- [76] [CITE[Language Tag Extensions Registry]] 
<http://www.iana.org/assignments/language-tag-extensions-registry>
- [117] 
[CITE@ja-jp[[[meta]] — Meta table (OpenType 1.9) - Typography | Microsoft Learn]], [[PeterCon]], [TIME[2022-12-02T14:36:57.000Z]] <https://learn.microsoft.com/ja-jp/typography/opentype/spec/meta#scriptlangtag-values>

]REFS]

[191] [[IETF]] として初めて[[言語タグ]]を規定した最初の正式な仕様は [[RFC 1766]]
でしたが、 [[RFC 3066]]、[[RFC 4646]] を経て [[RFC 5646]] が現行仕様となっています。
[[RFC 3066]] と [[RFC 4646]] の間に大規模な[[非互換変更]]が行われています。 
(詳しくは[CSECTION[歴史]]の項を参照してください。)

** BCP 47

[84] [[IETF]] [DFN[[[BCP 47]]]] は、現在 [[RFC 5646]] と [[RFC 4647]] により構成されています [SRC[>>72 1.]]。

** IANA 登録簿

[188] [[言語タグ]]で使うことができる[[部分タグ]]や[[祖父化]][[言語タグ]]は [[IANA]]
の登録簿があります (>>74、>>76)。

[189] [[RFC 1766]] や [[RFC 3066]] の時代は [[ISO]] 
の仕様から導出できない追加の[[言語タグ]]を登録してもよいという形でしたが、
[[RFC 4646]] 以降は原則としてすべて登録簿にある[[部分タグ]]を組み合わせて使う形に改められています。

[190] [[RFC 3066]] までの時代の登録簿は機械処理には適さない文書でしたが、
[[RFC 4646]] 以降は機械処理可能な形式になっています。
その書式は [[RFC 4646]] 3. で規定されていましたが、 (非互換に) 変更されて現在は
[[RFC 5646]] 3. で規定されています。

[53] ただし [[IANA]] が公開しているファイルはこの書式に必ずしも適合していません。
機械処理して利用する場合は、適合していなくてもある程度扱えるような配慮が必要です。
改行は [[CRLF]] ではなく、省略可能な [[CR]] と必須の [[LF]] の列として処理する必要があります。
また区切りの [CODE[%%]] の後に[[空白]]が来ても、無視する必要があります。

;; [93] [[IETF]] の身内であるところの [[IANA]] すら仕様を正しく運用できないのは驚くべきことかもしれませんが、 [[IETF]] の仕様の品質としては一般的な部類です。

[143] データファイル (>>144) も参照。

* 呼称

[125] 正式には「[RUBYB[言語タグ]@en[language tag]]」と呼ばれます。

[126] [[Wikipedia]] は [[IETF]] 仕様であることから「IETF言語タグ」
と呼んでいます。

[127] 「[[言語コード]]」と呼ばれることもありますが、
[[言語タグ]]仕様上は[[言語タグ]]に含まれる最初の[[部分タグ]]
(として用いられる [[ISO]] の[[言語コード]]) のことを指すので、
全体として[[言語コード]]と呼ぶのは不正確です。

[128] 値が[[言語タグ]]となる[[属性]]の名前などでは「[CODE[lang]]」
と略されることがよくあります。[[プログラミング言語]]の[[変数]]などの名前としては
「[CODE[tag]]」や「[CODE[langtag]]」などと略されることもあります。

* 構文

[55]
[DFN[[RUBYB[[[言語タグ]]]@en[language tag]]]]は、
1つ以上の[RUBYB[[[部分タグ]]] @en[subtag]]を
[CODE(charname)@en[[[HYPHEN-MINUS]]]] ([CODE(char)[[[-]]]])
で連結した[[文字列]]です。

[EG[
例えば、
[PRE(lang example code)[
ja-Latn-US
]PRE]
... は、3つの[[部分タグ]]から構成される[[言語タグ]]です。狭義の[[言語]]が[[日本語]]
([CODE(lang)[[[ja]]]]) であって、[[ラテン文字]]という[[用字系]]
([CODE(lang)[[[Latn]]]]) によって表記され、[[アメリカ合衆国]]という[[地域]]
([CODE(lang)[[[US]]]]) で用いられている[[言語]]を表しています。
]EG]

-*-*-

[230] 
[[RFC]]
は[[言語タグ]]を
[[ABNF]]
構文で規定しています。

[254] 
[[IETF]]
では一般的に
[[ABNF]]
で規定された構文を
[[US-ASCII]]、
たまに 
[[UTF-8]]
で符号化される[[文字列]]たる[[バイト列]]と解釈しています。

[255] 
しかしながら、
[[言語タグ]]はいろいろな場面で使われており、
あくまで
[[ABNF]]
で規定された[[文字列]]と解されています。
従って
[[HTML]]
や
[[JSON]]
で使われるときは、
その記述に使われる[[文字コード]]の普通の[[文字列]]として扱われます。

[261] 
[[Unicode言語タグ]]は、
[[Unicode]]
に含まれる通常の
[[ASCII文字]]のかわりに、
[[タグ文字]]に含まれる[[ASCII文字]]相当を使った[[文字列]]としています。

** 部分タグ

[56]
[DFN[[RUBYB[[[部分タグ]]]@en[subtag]]]]は、 (狭義の) [[言語]]や[[地域]]などを表す[[文字列]]です。
[[部分タグ]]を複数組み合わせて細かく指定できます。
[[部分タグ]]の長さや位置は、それが何を表すかによって決まっています。
[SRC@en[[[RFC 4646]] 2.1.]]

[FIG(short list)[ [313] [[部分タグ]]の種類
- [[言語部分タグ]]
- [[拡張言語部分タグ]]
- [[用字系部分タグ]]
- [[地域部分タグ]]
- [[変種部分タグ]]
- [[拡張部分タグ]]
]FIG]

[281] [[言語タグ]]の変種である[[Unicode言語識別子]]、[[Unicodeロケール識別子]]は[[部分タグ]]のことを
「[DFN[[RUBYB[[[符号]]]@en[code]]]]」とも呼んでいます。

[REFS[
- [282] [CITE@en-us[UTS #35: Unicode Locale Data Markup Language]] ([TIME[2011-07-19 03:14:51 +09:00]] 版) <http://unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers>
]REFS]

;; [283] 実際に[[部分タグ]]として使われているのは [[ISO]] の仕様によって定められた[[言語符号]]や[[国符号]]だったりするので、
「[[符号]]」と呼びたくなるのも理解できます。

** 大文字と小文字

[58] [[言語タグ]]の ([[ASCII]] の) [[大文字]]と[[小文字]]は、区別''されません''。
[SRC@en[[[RFC 4646]] 2.1., [[RFC 5646]] 2.2.1.]]

[59] 区別はされませんが、 [[IANA]] 登録簿の書式が[['''推奨''']]されています。
[SRC@en[[[RFC 4646]] 2.1., [[RFC 5646]] 2.2.1.]]
[FIG(list)[
- 1つ目''以外''の2[[文字]]の[[部分札]]は、すべて[[大文字]]にします。
- 1つ目''以外''の4[[文字]]の[[部分札]]は、先頭だけ[[大文字]]にします。
- それ以外のすべての[[部分札]]は、[[小文字]]にします。
]FIG]

;; 
[60]
これは、 [[ISO 639-1]] の[[言語符号]]がすべて[[小文字]]、
[[ISO 3166-1]] の[[国名符号]]がすべて[[大文字]]、
[[ISO 15924]] の[[用字系符号]]が先頭だけ[[大文字]]が推奨されていることに由来します。

[164] [[拡張]]の[[部分タグ]]については、すべて[[小文字]]に[[正規化]]されることが期待されています。
[SRC[[[RFC 5646]] 2.2.6.]]

;; [296] [[拡張]]「[CODE(lang)@en[[[t]]]]」は[[拡張]]の一部として[[言語タグ]]を含めることができますが、
その場合の[[正規形]]は、[[地域]]や[[用字系]]も含めてすべて[[小文字]]とされています。

[121] しかしこの正規形への機械的な変換は、[[言語タグ]]の構文を踏まえた若干複雑な処理が必要になります。
分野や実装によっては、 [[BCP 47]] の推奨を無視してすべて[[小文字]]に変換することもあります。

-
[193] [[Unicode言語タグ]]では[[小文字]]が推奨されています。
-
[310] 
[[RDFリテラル]]の[[言語タグ付き文字列]]では[[小文字]]が[[正規形]]とされます。


** 長さ

[231] [[言語タグ]]には長さ制限はありません。一般的には6文字程度に収まりますが、
それより長い[[言語タグ]]もあります。
[SRC[[[RFC 4646]] 4.3., [[RFC 5646]] 4.4.]]

[232] [[プロトコル]]等で長さを制限する場合であっても、最低35文字は認め[['''なければなりません''']]。
[SRC[[[RFC 5646]] 4.4.]]

;; [233] [[RFC 4646]] 4.3. では最低42文字とされていましたが、[[拡張言語]]の仕様が確定したため緩和されました。

[234] 実装や仕様は長い[[言語タグ]]を扱えなくても構いませんが、
何文字まで扱えるのか、長すぎる時にどうなるのかを文書化する[['''べきです''']]。
また実装は長すぎる時に警告する[['''べきです''']]。
[SRC[[[RFC 4646]] 4.3., [[RFC 5646]] 4.4.]]

[235] 実装は長い[[言語タグ]]を切り落としていく時に、[[部分タグ]]の途中でぶった切っては[['''なりません''']]。
[SRC[[[RFC 4646]] 4.3., [[RFC 5646]] 4.4.]]

[EG[
[236] 長い[[言語タグ]]を切り落としていく例 [SRC[[[RFC 4646]] 4.3., [[RFC 5646]] 4.4.]]
- [CODE(lang)[zh-Latn-CN-variant1-a-extend1-x-wadegile-private1]]
- [CODE(lang)[zh-Latn-CN-variant1-a-extend1-x-wadegile]]
- [CODE(lang)[zh-Latn-CN-variant1-a-extend1]]
- [CODE(lang)[zh-Latn-CN-variant1]]
- [CODE(lang)[zh-Latn-CN]]
- [CODE(lang)[zh-Latn]]
- [CODE(lang)[zh]]
]EG]

** 歴史

[268] [[RFC 1766]] では、構文は制限が緩い単純なもので、
- [[部分タグ]]を [CODE(char)[[[-]]]] で連結する
- [[部分タグ]]は1文字から8文字の[[ラテン文字]]

... という制限しかありませんでした [SRC[[[RFC 1766]] 2.]]。

[260] [[RFC 3066]] では、[[数字]]が認められて、
- [[部分タグ]]を [CODE(char)[[[-]]]] で連結する
- [[部分タグ]]は1文字から8文字の[[英数字]]

... という制限になりました [SRC[[[RFC 3066]] 2.1]]。

* 拡張部分タグ

[155] [DFN[[RUBYB[[[拡張]]] @en[[CODE(ABNF)[extension]]]]]]は、
[[言語]]や[[言語タグ]]と併用される、[[言語]]以外の情報を表すために使える[[言語タグ]]の拡張機構です。
[SRC[[[RFC 4646]] 2.2.6., [[RFC 5646]] 2.2.6.]]

;; [297] [[数値]]の表現、[[暦]]、[[照合順序]]といったような[[ロケール]]情報は、
広い意味では[[言語]]を構成する要素ではありますが、[[言語タグ]]本体仕様には含まれておらず、
[[拡張]]として記述する必要があります。



[161] [[拡張]]は、 [[singleton]] と呼ばれる1文字の[[部分タグ]]と、
それに続く1個以上の2-8文字の[[英数字]]の[[部分タグ]]により構成されます。
[[singleton]] は[[拡張]]の種類を表すものであり、 [[IANA]]
に登録しなけてば[['''なりません''']]。
続きの[[部分タグ]]は、その[[拡張]]の仕様に従わなければ[['''なりません''']]。
[SRC[[[RFC 4646]] 2.2.6., [[RFC 5646]] 2.2.6.]]
[[拡張]]は続きの[[部分タグ]]を構文の制約の元で自由に使うことができます。
[[拡張]]が[RUBYB[[[妥当]]]@en[valid]]であるかどうかは、その仕様によって定められます
[SRC[[[RFC 5646]] 2.2.9.]]。

;; [162] [CODE(lang)[[[x]]]] や [CODE(lang)[[[i]]]] は[[拡張]]を表す [[singleton]]
ではありません。

** 文脈

[158] 
[[IETF言語タグ]]の[[拡張部分タグ]]は、
[[言語]]、[[拡張言語]]、[[用字系]]、[[地域]]、[[異体]]の後で、
[[私用]]の前に[['''なければなりません''']]。
[[言語タグ]]全体が[[私用]]であって [CODE(lang)[[[x-]]]] から始まる場合には[[拡張]]を使うことはできません。
[SRC[[[RFC 4646]] 2.2.6., [[RFC 5646]] 2.2.6.]]

[317] 
[CODE[ScriptLangTag]]
では、
[[用字系部分タグ]]、
[[地域部分タグ]]、
[[異体部分タグ]]のいずれよりも後で[[私用部分タグ]]より前に、
0個[[以上]]書けます。
[SRC[>>117]]


-*-*-

[159] [[拡張]]は複数個含めることができますが、同じ種類 (singleton) 
の[[拡張]]を複数個同時に含めては[['''なりません''']]。
[SRC[[[RFC 4646]] 2.2.6., [[RFC 5646]] 2.2.6.]]

[163] [[拡張]]の順序は[[大文字・小文字不区別]]の[[ASCII]]順に[[正準化]]する[['''べきです''']]。
[SRC[[[RFC 4646]] 2.2.6., 4.4., [[RFC 5646]] 2.2.6., 4.5.]]
順序に意味は無いようです。

;; [298] [[拡張]]によっては更に[[正規化]]する方法が規定されています。



** 一覧

- [284] [CODE(lang)[t][拡張T]] : 変換
- [68] [CODE(lang)@en[u][拡張U]] : [[UTS #35]] [[ロケール]]識別子

[26] 
その他提案されているもの:
[[拡張D]]

[HISTORY[
[115] かつて [CODE[s]] も提案されていましたが、 [CODE[t]] に統合されました。
[SEE[ [[拡張T]] ]]
]HISTORY]

-*-*-

[318] 
[CODE[ScriptLangTag]] を規定する [[OpenType]] の仕様書は、
[[拡張U]]や[[拡張T]]より後にも更新されているにも関わらず、
仕様書執筆時点で
[CODE[ScriptLangTag]] 用に定義された[[拡張]]はなく、
何か指定されても無視される、
としています。
[SRC[>>117]]

[319] 
不明瞭ですが、特に [CODE[ScriptLangTag]] 用だと規定がない限りは、
[CODE[ScriptLangTag]] では使えないということでしょうか。

** 歴史

[157] [[拡張]]は [[RFC 4646]] で導入されました。それ以前は同様の仕組みはありませんでした。

[289] [CODE(lang)@en[[[t]]]] は2011年12月16日付で[[IANA]]に登録されています。

* 私用部分タグ

[165] [DFN[[RUBYB[[[私用]]] @en[[CODE(ABNF)[private use]]]][[部分タグ]]]]は、
特定の文脈で[[私的な合意]]の元に意味のある言語の区別を示すものです、
[SRC[[[RFC 4646]] 2.2.7., [[RFC 5646]] 2.2.7.]]
私用の部分タグは登録なしに自由に使うことができますが、
[[合意][当事者間の合意]]の範囲外では意味を共有することができませんし、
異なる[[当事者間の同意]]により同じ文字列が異なる意味で理解されることもあり得ます。

[166] [CODE(lang)[[[x]]]] だけの1文字の[[部分タグ]]の後に1つ以上の[[私用]]の[[部分タグ]]を使うことができます。
[[私用]]の[[部分タグ]]は1文字以上8文字以下の任意の[[英数字]]の列です。
[SRC[[[RFC 4646]] 2.2.7., [[RFC 5646]] 2.2.7.]]

;; [167] [[私用]]の[[部分タグ]]は、たとえ[[言語]]や[[地域]]の[[部分タグ]]と同じように見えたとしても、
(当事者間でそのように合意していない限り) その[[言語]]や[[地域]]を意味しません。
[CODE(lang)[[[en-US]]]] と [CODE(lang)[[[en-X-US]]]] は同じ言語を表すとは限りません。

[169] 他に候補がある場合や一般的な情報交換に供する場合には[[私用]]の[[部分タグ]]を使う[['''べきではありません''']]。
[SRC[[[RFC 4646]] 2.2.7., 4.5., [[RFC 5646]] 2.2.7., 4.6.]]

[170] [[言語]][[部分タグ]]や[[地域]][[部分タグ]]などにもそれぞれ[[私用]]に割り当てられた[[部分タグ]]がありますが、
それらはここでいう[[私用]]の[[部分タグ]]とは別のものです。
[[私用]]に割り当てられた[[部分タグ]]は[[言語タグ]]仕様上、それぞれ[[言語]]、[[地域]]などの意味を保持していますが、
ここでいう[[私用]]の[[部分タグ]]は[[言語タグ]]仕様上不透明なものです。
従って[[私用]][[部分タグ]]よりは[[私用]]に割り当てられた各種の[[部分タグ]]を使う[['''べきである''']]
[SRC[[[RFC 4646]] 4.5., [[RFC 5646]] 4.6.]] とされています。

[183] [[利用者]]は、[[私用]][[部分タグ]]を除き、 [[IANA]]
に登録されていない[[部分タグ]]を使っては[['''なりません''']]。
[SRC[[[RFC 5646]] 2.2.9.]]

[299] [[私用部分タグ]]とは別に、
[[拡張部分タグ]]によってはその一部を[[私用]]としていることがあります。

[21] 
[CODE[ScriptLangTag]] では、[[私用部分タグ]]は無視しても良いとされます。
[SRC[>>117]]

** 文脈

[168] 
[[IETF言語タグ]]の[[私用部分タグ]]は他の[[部分タグ]]より後になければ[MUST[なりません]]。
[[言語部分タグ]]なしで[[私用部分タグ]]だけを使うこともできます。
[SRC[[[RFC 4646]] 2.2.7., [[RFC 5646]] 2.2.7.]]


[2] 
[CODE[ScriptLangTag]]
では、
他の[[部分タグ]]の後に1組[[私用部分タグ]]を置けます。
[SRC[>>117]]

;; [7] [[用字系部分タグ]]が必須なので、
[CODE[ScriptLangTag]] 全体を[[私用部分タグ]]にはできません。

** 実例

[24] 
個別の事例は[[言語タグの一覧]]参照。

-*-*-

[25] 体系的な利用例がいくつかあります。

[41] [[CLCR]] の [[long code]] がこれらしきものを使っています。

[31] [[CLAコード]]が対応関係を定めています。

[309] [[LIISコード]]が [CODE[x-liis[VAR[*]]]] を使っています。

[222] [[Semantic Web]] の世界では [CODE[x-d-[VAR[*]]]] が提案されています。

[312] [CITE@id-x-mtfrom-en[Class Utilities | Apps Script | [[Google]] Developers]], [TIME[2022-08-17T17:43:30.000Z]], [TIME[2022-09-11T05:27:03.736Z]] <https://developers.google.com/apps-script/reference/utilities/utilities>

>
[PRE(html code)[
<html 
      lang="en"
      dir="ltr">
]PRE]

>
[PRE(html code)[
<html 
      lang="id-x-mtfrom-en"
      dir="ltr">
]PRE]

>
[PRE(html code)[
<html 
      lang="zh-TW-x-mtfrom-en"
      dir="ltr">
]PRE]

>
[PRE(html code)[
<html 
      lang="ar-x-mtfrom-en"
      dir="rtl">
]PRE]

>
[PRE(html code)[
<html 
      lang="th-x-mtfrom-en"
      dir="ltr">
]PRE]

[[English]] 原文と各[[言語]]の[[翻訳]]があり、
[[内容折衝]]により、または[[利用者]]の選択により切り替えられる。
[[言語タグ]]は選択言語により切り替わり、
[[English]] 以外では[[私用部分タグ]] [DFN[[CODE[x-mtfrom-en]]]] が付く。

;; [138] [[拡張T]]でも同じことを記述できそうですが、[[拡張T]]はすごく複雑です。

-*-*-

[322] 
[CITE[[[Vimeo]]]]
は[[私用部分タグ]]
[DFN[[CODE[-x-autogen]]]]
を使っています。
[SRC[>>320, >>321]]

[323] 
公開されているドキュメントに記載されているのは 
[DFN[[CODE[en-x-autogen]]]]
だけで [SRC[>>320, >>321]]、
しかも「at the present time」に於いて[[English]]のみであると明言されています 
[SRC[>>320]]
し、ここに指定されるのが [[IETF言語タグ]]であるかも定かではありません。


[324] 
しかし実サイトで [[DOM]] [CODE[TextTrack]] の [F[[CODE[language]]]]
が
[DFN[[CODE[ja-x-autogen]]]]、
[F[[CODE[label]]]]
が
[CODE[日本語 (自動生成)]]
となるものが利用されていることが確認できます。
[TIME[2024-05-27T07:06:17.500Z]]
[F[[CODE[language]]]] の値は [[BCP 47言語タグ]]と定められています。

[325] 
おそらく [[English]] 以外にも[[日本語]]を含むいくつかの[[言語]]に現在は拡大されているのでしょう。
[CODE[x-autogen]] は[[人間]]により作成されたデータではなく、
機械的に[[音声]]から[[文字データ]]に変換されたものであることを意味すると思われます。



[REFS[

[FIG(quote)[
[FIGCAPTION[
[320] [CITE@ja[Player SDK: Embed Options]], [TIME[2024-05-27T07:01:37.000Z]] <https://developer.vimeo.com/player/sdk/embed>
]FIGCAPTION]

>To enable automatically generated closed captions instead, provide the value [CODE[en-x-autogen]]. Please note that, at the present time, automatic captions are always in English.
]FIG]

[FIG(quote)[
[FIGCAPTION[
[321] [CITE@ja[埋め込みでキャプションと字幕をデフォルトで有効にする – ヘルプセンター]], [TIME[2024-05-27T07:02:05.000Z]] <https://help.vimeo.com/hc/ja/articles/12426275503377-%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%A7%E3%82%AD%E3%83%A3%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E5%AD%97%E5%B9%95%E3%82%92%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%A7%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B>
]FIGCAPTION]

>埋め込みコードのように[B[自動生成されたキャプション]]を追加するには、[B["texttrack=en-x-autogen"]]を追加する必要があります。
]FIG]

]REFS]




** 歴史

[171] [[RFC 1766]] と [[RFC 3066]] では、1つ目の[[部分タグ]] 
[WEAK[(当時の用語でいう[RUBYB[一次タグ][primary tag]])]] を
[CODE(lang)[[[x]]]] とすることで[[私用]]を表していました。
2つ目の[[部分タグ]] [WEAK[(当時の用語でいう最初の[RUBYB[部分タグ]@en[subtag]])]]
について、 [[RFC 1766]] では何も規定がなく、 [[RFC 3066]]
では1文字のものは将来の拡張のために予約するとされていました。
3つ目以降の[[部分タグ]]については特に制約なく、 [CODE(lang)[[[x]]]]
を使ったり登録したりすることも認められていました (特に[[私用]]という意味は割り当てられていませんでした)。

[172] [[RFC 4646]] 以後、[[私用]]を表す[[部分タグ]]の最初に使うという意味になっています。

* 祖父化言語タグ

[57] [[RFC 1766]] や [[RFC 3066]] の時代に登録された[[言語タグ]]の中には、
[[RFC 4646]] 以後の[[部分タグ]]の定義に従っていないものがありますが、
それも互換性のため引き続き [[RFC 4646]] 以後の仕様でも使うことが認められています
[SRC[[[RFC 4646]] 2.2.8., [[RFC 5646]] 2.2.8.]]。

[85] [[RFC 4646]] は特別に
[PRE(ABNF code)[
grandfathered = 1*3[[ALPHA]] 1*2("-" 2*8([[ALPHA]] / [[DIGIT]]))
]PRE]
... という構文を認めていました [SRC@en[[[RFC 4646]] 2.1.]]。

[86] ところがこれでは [[RFC 4646]] 以後のより制限が厳しい構文で認めていないものがこちらの構文では認められることになってしまい、
構文の定義として意味をなしていない状態でした。

[87] [[RFC 5646]] では [[RFC 3066]] までに登録されたものを構文定義に列挙する形となっており、
この問題は解消しています。

;; [88] これによって [[RFC 3066]] 時代までに未登録で利用され、 [[RFC 4646]]
以後定義に沿わないことにされてしまった[[言語タグ]]は [[RFC 5646]] の構文に適合しなくなってしまいました。
とはいえ、 [[RFC 4646]] の時に既に [[RFC]] 本文の定義に合致しない状態だったのですが。

[89] [[RFC 5646]] では、新しい構文に一致しないものの例外的に認めているもの (irregular) と、
新しい構文に一致するものの新しい構文から導かれる意味と違う意味で解釈されるべきもの
(regular) の2種類に分類されています。 [SRC[[[RFC 5646]] 2.1., 2.2.8.]]

[90] 
[FIG[
"en-GB-oed" / "i-ami" / "i-bnn" / "i-default" / "i-enochian" / "i-hak" / "i-klingon"
/ "i-lux" / "i-mingo" / "i-navajo" / "i-pwn" / "i-tao" / "i-tay" / "i-tsu" / "sgn-BE-FR"
/ "sgn-BE-NL" / "sgn-CH-DE"

[FIGCAPTION[
[CODE(ABNF)@en[irregular]] に分類されている[[言語タグ]]
]FIGCAPTION]
]FIG]

[91] 
[FIG[
"art-lojban" / "cel-gaulish" / "no-bok" / "no-nyn" / "zh-guoyu"
/ "zh-hakka" / "zh-min" / "zh-min-nan" / "zh-xiang"

[FIGCAPTION[
[CODE(ABNF)@en[regular]] に分類されている[[言語タグ]]
]FIGCAPTION]
]FIG]

[174] [CODE(lang)[[[en-GB-oed]]]] は[[英語]]の一種ですが、それ以外は単独の[[言語]]を表しています。
その多くは単独の一次[[言語]][[部分タグ]]が新たに割り当てられており、
[[IANA]] 登録簿の [[Preferred-Value]] に示されています
[SRC[[[RFC 4646]] 2.2.8., [[RFC 5646]] 2.2.8.]]。

[175] なお、 [[RFC 4646]] で[[祖父化]]に分類されていた[[言語タグ]]のうちの幾つかは、
[[RFC 5646]] のもとでは[[言語]]と[[拡張言語]]の組み合わせと解されるため、
[[冗長]]に再分類されています。

[300] [CODE(lang)@en[[[t]]]] [[拡張]]は[[言語タグ]]をその一部として含めることができますが、
[CODE(ABNF)@en[irregular]] の使用は禁止されています。

[23] 
[CODE[ScriptLangTag]] は[[祖父化言語タグ]]構文を認めていません。


** [CODE(lang)[i-default]]

[228] [CODE(lang)[[[i-default]]]] は、既定の[[言語]]を示すことが要求されている場合を除き、
使う[['''べきではありません''']]。
[SRC[[[RFC 5646]] 4.1.]]


* 部分タグの選択

[213] 大原則として、[[言語タグ]]を構成する時は、可能な限りで粗すぎず、細かすぎない、
必要十分な粒度で言語を特定できるように[[部分タグ]]を選択するべきです。
[SRC[[[RFC 4646]] 4.1., [[RFC 5646]] 4.1.]]

[EG[
[214] 例えば、殆どの場合 [CODE(lang)[[[de-CH-1996]]]] (1996年正書法) は細かすぎで、
[CODE(lang)[[[de-CH]]]] で十分です。
]EG]

[EG[
[215] 普通は [CODE(lang)[[[gem]]]] ([[ゲルマン語族]]) は粗過ぎで、
それが (例えば) [[ドイツ語]]とわかっているなら [CODE(lang)[[[de]]]]
を使うべきです。
]EG]

** 非推奨

[194] [[IANA]] 登録簿には [[Deprecated]] ([[非推奨]]) 欄があります。
[WEAK[(値は非推奨になった日付です。)]]
[SRC[[[RFC 4646]] 3.1., [[RFC 5646]] 3.1.2.]]。

[202] [[妥当性]]を検証する実装は[[非推奨]]な[[部分タグ]]や[[タグ]]を使う[['''べきではありません''']]
[SRC[[[RFC 4646]] 3.1., 4.4., [[RFC 5646]] 3.1.6., 4.5.]]。

[203] [[非推奨]]な[[部分タグ]]や[[言語タグ]]には好ましい値が指定されていることもあれば、
指定されていない (代替がない) こともあります。

** 好ましい値

[195] [[IANA]] 登録簿には [[Preferred-Value]] (好ましい値) 欄があります。
[SRC[[[RFC 4646]] 3.1., [[RFC 5646]] 3.1.2.]]。

- [196] [[言語]]、[[用字系]]、[[地域]]、[[異体]]については、より好ましい別の値 (同じ種類の[[部分タグ]]) が指定されています。
[SRC[[[RFC 5646]] 3.1.2.]]
- [197] [[拡張言語]]、[[祖父化]]、[[冗長]]については、より好ましい[[拡張言語範囲]]が指定されています。
[SRC[[[RFC 5646]] 3.1.2.]]

;; [198] [[RFC 4646]] 3.1. では、[[拡張言語]]は >>196 に分類されていました。また >>197
は[[拡張言語範囲]]ではなく、「完全な[[言語タグ]]」とされていました。

[204] [[非推奨]]かつ好ましい値が指定されている場合にあっては、
好ましい値が最善の選択として利用される[['''べきです''']]。
[[拡張言語]]以外で好ましい値が指定されているなら、必ず[[非推奨]]でもあります。
[SRC[[[RFC 4646]] 3.1., [[RFC 5646]] 3.1.7.]]

[205] なお、好ましい値は必ずしも意味的に等価ではありません。例えば[[地域]]の[[部分タグ]]は[[国]]の独立などがあって変化した時に新しい[[国]]の符号が好ましいとされますが、
必ずしも以前の[[国]]と同じ範囲ではありません。

;; [265] [[RFC 3066]] 以前に登録された [CODE(lang)[[[i-*]]]] 形式の[[言語タグ]]の多くは、
現在では [[ISO]] の[[言語符号]]が割り当てられていて、そちらを使うのが好ましいとされています。
[[RFC 3066]] の当時も、 [[ISO]] の[[言語符号]]が割り当てられたらそちらを使わなければ[['''ならない''']]
[SRC[[[RFC 3066]] 2.3]] とされていました。

[287] 
これは一見[[IANA登録簿]]を読んで機械処理できそうなのですが、
実際はそうとは限りません。
[SEE[ [[ja-Latn-hepburn-heploc]] ]]

** 接頭辞

[199] [[IANA]] 登録簿には [[Prefix]] (接頭辞) 欄があります。
その値は、当該[[部分タグ]]を使う時に[[接頭辞]]となっている[['''べき''']][[言語タグ]]です。
[WEAK[(接頭辞となっているか否かは、[[拡張濾過]]算法に拠ります。)]]
接頭辞は[[拡張言語]]と[[異体]]の登録にのみ含まれます。
[SRC[[[RFC 4646]] 3.1., [[RFC 5646]] 3.1.2., 3.1.8.]]。

[EG[
[206] 例えば [CODE(lang)[[[cmn]]]] ([[官話]]) [[拡張言語]][[部分タグ]]の[[接頭辞]]は
[CODE(lang)[[[zh]]]] ([[中文]]) となっているので、 [CODE(lang)[[[zh-cmn]]]]
とするべきであり、 [CODE(lang)[[[ja-cmn]]]] は不適当です。
]EG]

[EG[
[277] [[Prefix]] に一致するかどうかは[[拡張濾過]]算法により判断されるので、
必ずしも文字列として接頭辞になっていなくても構いません。例えば
[CODE(lang)[es-Latn-CO-x-private]] に [CODE(lang)[es-CO]] は接頭辞として含まれています。
]EG]

* 正規化と比較

** 正準形

[237] [[言語タグ]]は[RUBYB[[[正準形]]]@en[canonical form]]である[['''べきです''']]。
[SRC[[[RFC 4646]] 4.4., [[RFC 5646]] 4.5.]]

[238] [[整形式]][[言語タグ]]は次の手順で[[正準化]]できます
[SRC[[[RFC 5646]] 4.5.]]。
[FIG(steps)[
= [239] [[拡張]]は、 [[singleton]] の大文字・小文字を区別しない [[ASCII]] 順にします。
= [240] [[祖父化]]または[[冗長]]として登録されている[[言語タグ]]であって、
[[Preferred-Value]] が示されていれば、その[[言語タグ]]に置き換えます。
= [241] 各[[部分タグ]]が登録されていて [[Preferred-Value]] が示されていれば、
その[[部分タグ]]に置き換えます。
]FIG]

;; [243] これは [[RFC 4646]] 4.4. に示されていた[[正準化]]の方法とは少し違っています。
両者は実質的に等価だと思いますが、検証していません。

[EG[
[246] [CODE(lang)[[[en-BU]]]] (英語、ビルマ) の[[正準形]]は [CODE(lang)[[[en-MM]]]]
(英語、ミャンマー) です。
]EG]

[EG[
[247] [CODE(lang)[[[en-b-ccc-bbb-a-aaa-X-xyz]]]] は[[正準形]]ではありませんが、
[CODE(lang)[[[en-a-aaa-b-ccc-bbb-x-xyz]]]] は[[正準形]]です。
]EG]

;; [249] ここでいう[[正準化]]には[[大文字・小文字]]の正規化 (>>58) は含まれていません。
また用字形抑制や[[異体]]の順序など、[[言語タグ]]の仕様上[['''推奨''']]されている要件であっても、
[[正準化]]によって満たされないものがあります。

;; [250] [[拡張]]は、それぞれの[[正準形]]をそれぞれにおいて規定できるとされています。

** 拡張言語形

[242] [[整形式]][[言語タグ]]は次の手順で[DFN[[RUBYB[拡張言語形]@en[extlang form]]]]に変形できます。
[SRC[[[RFC 5646]] 4.5.]]
[FIG(steps)[
= [244] [[正準形]]にします。
= [245] [[拡張言語]]でもある[[言語]]ではじまるなら、その[[拡張言語]]の [[Prefix]] を先頭に挿入します。
]FIG]

[248] [[正準形]]では必ず[[拡張言語]]が含まれない形になるので、[[言語]]と[[拡張言語]]の両方を含めた形の方が便利なときには[[拡張言語形]]が良いとされています。

** 言語タグの一致

[SEE[ [[言語タグの一致]] ]]

* 言語タグの適合性

[176] [[言語タグ]]の[[適合性]]については、[[整形式]]と[[妥当]]の2つの基準が設けられています。

** 整形式言語タグ

[177] [[言語タグ]]は [[ABNF]] 構文に一致する時、[RUBY[[[整形式]]][せいけいしき]@en[well-formed]]です。
[SRC[[[RFC 5646]] 2.2.9.]]

[32] 
[[整形式]]とは、[[構文]]として正しい[[言語タグ]]であるということを意味しています。
[[構文]]として正しいとしても、意味のある[[言語タグ]]を構成しているかどうかはわかりません。


** 妥当な言語タグ

[178] [[言語タグ]]は、

- [179] [[整形式]]であり、
- [180] [[異体]][[部分タグ]]に重複がなく、
- [181] [[拡張]][[部分タグ]]の [[singleton]] に重複がなく、
- [182] [[タグ]]全体が[[祖父化]]タグのいずれかであるか、またはタグを構成する[[言語]]、[[拡張言語]]、[[用字系]]、[[地域]]、[[異体]]の[[部分タグ]]がすべて [[IANA]] に登録されたものであれば、

... [DFN[[RUBYB[[[妥当]]]@en[valid]]][妥当な言語タグ]]です。
[SRC[[[RFC 5646]] 2.2.9.]]

[33] 
[[妥当性]]は、[[整形式]]性、つまり[[構文]]的に正しいかどうかに加えて、
[[IANA登録簿]]に登録されて[[意味]]が明確になっていることを表しています。

[EG[
[34] [CODE[ja]] は[[整形式]]であり、[[妥当]]です。
]EG]

[36] 
[[妥当]]な[[言語タグ]]は仕様上「適切」な[[言語タグ]]であるといえますが、
[[妥当]]でないからといって[[言語タグ]]として不適切ということでもありません。
例えば[[私用]]の[[部分タグ]]は定義上[[非妥当]]になります。


*** 冗長言語タグ

[173] 
[[RFC 1766]] や [[RFC 3066]] に基づく手続きにより [[IANA]] に登録された[[言語タグ]]の中には、
[[RFC 4646]] 以後の仕組みに基づかず[RUBYB[[[祖父化]]]@en[grandfathered]]扱いされているものの他、
[CODE(lang)[[[zh-Hant]]]] のように [[RFC 4646]] 
以後の[[部分タグ]]の組み合わせで表現できるものがいくつもあります。
このような[[言語タグ]]もまた [[RFC 4646]] 以後の [[IANA]]
登録簿に含まれており、「[RUBYB[冗長]@en[redundant]]」と分類されています
[SRC[[[RFC 4646]] 2.2.8., [[RFC 5646]] 2.2.8.]]。

** 歴史

[184] [[RFC 5646]] は[[言語タグ]]の[[適合性]]を定義していますが、 [[RFC 4646]]
はそれを処理する[[実装]]の[[適合性]]を定義していました。実装は >>185 と >>186
のいずれかを明示的に引用して適合性を主張する[['''べきだ''']]とされていました
[SRC[[[RFC 4646]] 2.2.9.]]。

[185] [[RFC 4646]] における[[整形式]]性を検証する実装は、 >>177 に加えて、 >>181
もチェックしなければなりませんでした。
[SRC[[[RFC 4646]] 2.2.9.]]

[186] [[RFC 4646]] における[[妥当]]性を検証する実装は、 >>178 に加えて、
対応している[[拡張]]について[[妥当]]性をチェックすることが求められていました。
[[異体]]と[[拡張言語]]について、登録簿上の [[Prefix]] の要件を満たしているかチェックすることも求められていました。
更に、対応している[[登録簿]]や[[拡張]]の版・日付について指定することが求められていました。
[SRC[[[RFC 4646]] 2.2.9.]]

** メモ

[187] [[RFC 4646]] についても [[RFC 5646]] についても、[[妥当]]であるからといって [[RFC]]
上のすべての要件を満たしていることにはなりません。

* 不正な言語タグ

[114] 
構文レベルで不適切な[[言語タグ]]もしばしば使われています。

-*-*-

[113] [[日本語言語タグ]]にもいくつか事例あり。

[FIG(quote)[
[FIGCAPTION[
[7] [CITE@ja-JP[GNU Wget - バグ: bug #26786, TLS SNI support '''['''Savannah''']''']] ([[Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved]] 著, [TIME[2014-09-19 15:03:19 +09:00]] 版) <http://savannah.gnu.org/bugs/?26786>
]FIGCAPTION]

>
[PRE(HTML code)[
<html xmlns="http://www.w3.org/1999/xhtml" lang="'''ja-JP.UTF-8'''" xml:lang="'''ja-JP.UTF-8'''">
]PRE]
]FIG]

[278] [CITE@Japanese[拡大イメージ表示]], [TIME[2022-01-11T09:01:41.000Z]] <https://screenstore.jp/shop/image_view.html?image=000000004236>

>
[PRE(HTML code)[
<meta http-equiv='CHARSET' content='EUC-JP'>
<meta http-equiv='CONTENT-LANGUAGE' content='Japanese'>
<meta http-equiv='Content-Type' content='text/html; charset=EUC-JP'>
]PRE]



[FIG(quote)[
[FIGCAPTION[
[134] ([TIME[2016-03-18 17:54:57 +09:00]] 版)
<http://doc.qt.io/qt-4.8/qcolor.html#setNamedColor>
]FIGCAPTION]

> 
> <html lang="en_US">

]FIG]


[FIG(quote)[
[FIGCAPTION[
[141] [CITE@de_DE[Another RDF Encoding Form (aREF)]]
([[Jakob Voß (voss@gbv.de)]]著, [TIME[2014-10-16 17:22:47 +09:00]])
<https://gbv.github.io/aREF/aREF.html>
]FIGCAPTION]

> <html lang="de_DE">

]FIG]


[FIG(quote)[
[FIGCAPTION[
[217] [CITE@en_us[Building the Future of the Twitter API Platform]]
([TIME[2017-10-13 20:43:58 +09:00]])
<https://blog.twitter.com/developer/en_us/topics/tools/2017/building-the-future-of-the-twitter-api-platform.html>
]FIGCAPTION]

>   <html lang="en_us" prefix="og: http://ogp.me/ns#">

]FIG]


[FIG(quote)[
[FIGCAPTION[
[218] [CITE@en_us[Giving you more characters to express yourself]]
([TIME[2017-11-12 17:33:04 +09:00]])
<https://blog.twitter.com/official/en_us/topics/product/2017/Giving-you-more-characters-to-express-yourself.html>
]FIGCAPTION]

>   <html lang="en_us" prefix="og: http://ogp.me/ns#">

]FIG]

[FIG(quote)[
[FIGCAPTION[
[221] [CITE@ja,zh[電脳戦機バーチャロン×とある魔術の禁書目録 とある魔術の電脳戦機(バーチャロン) 公式サイト]]
([TIME[2018-06-08 12:02:42 +09:00]])
<http://vo-index.sega.jp/outline/istg/index01.html>
]FIGCAPTION]

> <!doctype html>
> <html lang="ja,zh">
> 

]FIG]

[FIG(quote)[
[FIGCAPTION[
[225] [CITE@en[Static Maps API — Map localization — Yandex Technologies]]
([TIME[2020-03-27 15:56:10 +09:00]])
<https://tech.yandex.com/maps/staticapi/doc/1.x/dg/concepts/localization-docpage/>
]FIGCAPTION]

> The locale is set in RFC-3066 format using the lang parameter:
> lang=language-region
> language - Two-letter language code. Specified in ISO 639-1 format. Sets the language for objects on the map (toponyms and controls).
> region - Two-letter country code. Specified in ISO 3166-1 format. Determines regional settings such as measurement units (for indicating distances between objects or driving speeds on a route).
> Note. For the regions RU, UA and TR, distance is shown in kilometers; for US, it is shown in miles.
> The following locales are currently supported:
> lang=tr-TR
> lang=en-US (distance in miles)
> lang=en_RU
> lang=ru-RU
> lang=ru_UA
> lang=uk_UA
> Note. In early versions of the API, the locale was specified after a dash. For example, en-US. This notation is supported for backward compatibility, but is not recommended.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[136] [CITE@en[Apple News Format Reference: Properties]]
([TIME[2016-06-29 11:15:12 +09:00]])
<https://developer.apple.com/library/ios/documentation/General/Conceptual/Apple_News_Format_Ref/Properties.html#//apple_ref/doc/uid/TP40015408-CH2-SW1>
]FIGCAPTION]

> A code that indicates the language of the article. Use the IANA.org language subtag registry to find the appropriate code; e.g., en for English, or the more specific en_GB for English (U.K.) or en_US for English (U.S.).

]FIG]


[FIG(quote)[
[FIGCAPTION[
[137] [CITE@en-US.UTF-8[Welcome '''['''Savannah''']''']]
([[Copyright 2016 Free Software Foundation, Inc. Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.]]著, [TIME[2016-07-12 10:50:48 +09:00]])
<http://savannah.nongnu.org/>
]FIGCAPTION]

> <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US.UTF-8" xml:lang="en-US.UTF-8">

]FIG]

[FIG(quote)[
[FIGCAPTION[
[29] 
[CITE@zh[臺灣華文電子書庫]], [TIME[2023-02-24T09:22:11.000Z]] <https://taiwanebook.ncl.edu.tw/zh-tw/book/NCL-000145761/reader>
]FIGCAPTION]

>
[PRE(html code)[
<html lang="zh_tw">
]PRE]

]FIG]

[288] 
[[CKAN]] という世界中の政府機関等で使われている [[CMS]] が
[CODE[fa_IR]] や [CODE[zh_Hans_CN]] 式の不正な[[言語タグ]]を使っているために、
今も世界中のサーバーでおかしな[[言語タグ]]が量産されています...


[308] 
[[Chrome]] は [CH[-]] と [CH[_]] を同一視しているみたいです。
その上で、既知の[[言語タグ]]と一致するか、 [CH[-]] か [CH[_]]
が続くなら、その[[言語タグ]]とみなすようです。
(少なくても[[フォントの選択]]についてそのようにみえます。)
[[Firefox]] も似たような挙動ですが、 [CH[-]] でも [CH[_]] 
でもない文字が続く場合の動作がもう少し複雑なようです。
[TIME[2024-04-23T13:55:37.200Z]]

[328] 
[CITE@de_DE[Another RDF Encoding Form (aREF)]], [[Jakob Voß (voss@gbv.de)]], [TIME[2014-10-16T08:22:47.000Z]], [TIME[2025-11-06T15:08:07.203Z]] <https://gbv.github.io/aREF/aREF.html>


[329] [CITE@*[ș-uri și ț-uri]], [[Cristian Secară]], [TIME[2025-11-13T14:19:51.000Z]], [TIME[2025-11-13T14:19:57.916Z]] <https://www.secarica.ro/en/rou/s-uri-si-t-uri>

>
[PRE[
<!DOCTYPE html>
<!-- jsn_solid_pro 5.1.6 -->
<html lang="*" dir="ltr">
]PRE]

* 言語タグの集合

[276] [[言語タグ]]と[[ワイルドカード]]によって[[言語タグ]]の[[集合]]を表現する「[[言語範囲]]」
や[[言語範囲]]を複数列挙した「[[言語優先度リスト]]」が
[[HTTP]] の [CODE(HTTP)@en[[[Accept-Language:]]]] などで用いられています。

* ロケールと言語タグ

[8] [[言語]]は[[ロケール]]を構成する一要素であり、[[言語]]と[[ロケール]]は別の概念ではありますが、[[言語]]は[[ロケール]]の最重要要素でもありますから、同一視されることもよくあります。

[9] [[言語タグ]]は [[Unix 系システムのロケールの識別子][POSIX locale]]と
(区切り文字が違うことを除けば)
非常によく似ていて、歴史的にも深く関わっています。

[40] この区切り文字の違いが曲者で、
[[言語タグ]]で間違って [CODE[_]]
を使ったり、
[[ロケール]]の記述で間違って [CODE[-]]
を使ったりする誤用例が散見され、それによる不具合もまま見かけます。
ややこしいことに[[ロケール識別子]]の仕様もいろいろあって、
中には [CODE[-]] を使うものもあります。

[10] [[UTS #35]] は元は [[Unix ロケール識別子][POSIX locale]]由来の独自の構文を規定していましたが、
現在は[[言語タグ]]の [CODE(lang)@en[[[u]]]] 拡張や [CODE(lang)@en[[[t]]]] 拡張という形で両者の要素を混在させたスタイルになっています。
[SEE[ [[Unicodeロケール識別子]] ]]

[12] [[言語タグ]]本体と [CODE(lang)[[[u]]]] 拡張、 [CODE(lang)[[[t]]]] 拡張を合わせれば[[ロケール]]のかなりの側面が一つの識別子により記述できますが、
それでもまだカバーされてない範囲もあります。

[FIG(list)[ [11] [[言語タグ]]で (まだ) 記述できないもの
- [13] [[単位系]] - [[SI]]、[[ヤード・ポンド法]]などの選択
- [19] [[プラットフォーム]]ごとの慣習 - [[Windows]] 風の用語遣い、[[Mac OS X]] 風の用語遣い、など
-- [30] [CODE(lang)[[[u]]]] の [CODE(lang)[[[va]]]] でカバーできるかも?
-- [20] [[Mac OS]] 風を表すために [CODE(lang)@en[[[ja-JP-mac]]]] や [CODE(lang)@en[[[ja-jpm]]]] といった[[言語タグ]]が使われることがあります。
- [129] 対象者の区別や注釈の有無
-- [[子供]]向けの平易な言葉遣い、[[漢字]]の利用の程度の指定
-- [[振り仮名]]の有無の指定、[[白文]]と[[訓読文]]の選択
- [35] [[文字符号化]] 
-- [[Unix 系システムの伝統的なロケール][POSIX locale]]には含まれていたが [[UTS #35]] には
(おそらく意図的に) 含まれていない。
-- [[UTF-8]] への統一が進んでいるので、そろそろ意味がなくなってきています。
]FIG]

;; [130] 枠組みとしてカバーされていても、値が存在しないものもあります。
例えば[[ですます調]]と[[だである調]]の違いや[[候文]]、
戦前[[公用文]]型の片仮名文、[[2ch]] 風[[スラング]]混じり文、
といったバリエーションは言語の異体として区別可能かもしれませんが、
使える値は登録されていません。
[[書き言葉]]と[[話し言葉]]の別、[[語尾]]に「アル」、「にゃん」、
「ごわす」のような特徴的なものを使うかどうかといった違いも表現できる値がありません。
句読点に「、。」を使うか
「,.」を使うかの違いも何らかの方法で理論上記述可能かもしれませんが、
そのような値は現時点でありません。
[[方言]]の違いも、値がありません。

[112] 関連: [[日本語言語タグ]]

* 文脈

[94] [[MIME]] では、 [[RFC 2231]] で拡張された[[引数]]の値の構文で [[RFC 1766]]
により登録された[[言語タグ]]の値を指定できるとされています。

[95] また [CODE(ABNF)@en[[[encoded-word]]]] でも [[RFC 2231]] の拡張により、[[RFC 1766]]
により登録された[[言語タグ]]の値を指定できるとされています。

[208] 
[[MIME]] や [[HTTP]] の [CODE(MIME)@en[Content-Language:]]
[[ヘッダー]]の値や [[HTTP]] の [CODE(HTTP)@en[Accept-Language:]]
[[ヘッダー]]の値の一部として[[言語タグ]]が使われています。

[211] 
[[HTML]] の [CODE[lang]] [[属性]]や [CODE[hreflang]]
[[属性]]の値として[[言語タグ]]が使われています。

[212] 
[[XML]] の [CODE[xml:lang]] [[属性]]の値として[[言語タグ]]が使われています。

[269] 
[[LDAP]] [CODE[lang-]]

[270] [[CPIM]] [CODE[;lang=]]


[HISTORY[
[96] [[Unicode]] の特別な[[文字コード]]を使って [[RFC 1766]] [[言語タグ]]を埋め込む方法がかつて提案されていましたが
([[RFC 2482]])、現在では使われていません。
[SEE[ [[Unicode言語タグ]] ]]

[264] [[MLSF]] は [[UTF-8]] を拡張して特殊な[[バイト列]]として[[言語タグ]]を埋め込む方法でした。
]HISTORY]

[262] [CITE@en[RFC 3367 - Common Name Resolution Protocol (CNRP)]], [TIME[2021-04-11T07:17:52.000Z]], [TIME[2021-04-21T08:38:14.119Z]] <https://tools.ietf.org/html/rfc3367#page-10>

>The language associated with a resource.  The default type of this
property is 'RFC1766' and the vocabulary is drawn from the list of
languages in RFC 1766 [4].  If RFC 1766 is updated, then the
values listed in the updated version are also valid for this type.

[263] 改訂は想定しながら、[[非互換変更]]までは想定できず梯子を外された事例。

[27] 
[CITE@ja[言語サポート | Cloud Speech-to-Text ドキュメント | Google Cloud]], [TIME[2022-11-22T15:21:44.000Z]], [TIME[2022-12-21T08:04:46.144Z]] <https://cloud.google.com/speech-to-text/docs/languages?hl=ja>

[28] 
[[[CODE[name]] (OpenType)]]

-[42] [CITE@en[RFC 4566: SDP: Session Description Protocol]], [TIME[2023-12-02T07:30:22.000Z]], [TIME[2023-12-02T12:14:56.110Z]] <https://www.rfc-editor.org/rfc/rfc4566.html#page-29>
-[43] [CITE[RFC Errata Report » RFC Editor]], [TIME[2023-12-02T12:15:36.000Z]] <https://www.rfc-editor.org/errata/rfc4566>

[[RFC 3066]]

* プロファイル

** LMT

[106] 
[DFN[Language Metadata Table]] ([DFN[LMT]])
は[[IETF言語タグ]]の[[プロファイル]]です。
[SRC[>>102]]

[107] 
映像系の企業の[[標準化団体]]で、映像や音声の[[言語]]の識別に使うための[[言語タグ]]の一覧を管理しています。
[SRC[>>102]]


[REFS[

- [102] [CITE@en[LMT - Media & Entertainment Services Alliance]], [[MESA Operations]], [TIME[2024-04-04T13:55:33.000Z]] <https://www.mesaonline.org/language-metadata-table>
- [108] [CITE@ja[LMT-v1.0-07-31-18.pdf]], [TIME[2023-12-29T18:43:11.000Z]], [TIME[2024-04-04T13:56:59.452Z]] <https://www.mesaonline.org/wp-content/uploads/2018/07/LMT-v1.0-07-31-18.pdf>
- [111] 
[CITE@ja[Language Metadata Table (LMT) V2.0.xlsx - Language-Metadata-Table-LMT-V2.0.pdf]], [TIME[2023-12-29T18:47:39.000Z]], [TIME[2024-04-04T14:01:31.882Z]] <https://www.mesaonline.org/wp-content/uploads/2019/07/Language-Metadata-Table-LMT-V2.0.pdf>


]REFS]

-*-*-

[110] [DFN[EIDR language code]] は [[LMT]] を採用しつつ、[[中文言語タグ]]は例外的な規定を設けています。
[SRC[>>109]]
つまり少しだけ違う[[プロファイル]]です。

[REFS[

-
[109] [CITE@ja[Using EIDR Language Codes.pdf]], [TIME[2023-12-29T17:55:33.000Z]], [TIME[2024-04-04T13:58:12.317Z]] <https://www.eidr.org/documents/Using%20EIDR%20Language%20Codes.pdf>

]REFS]


** Wikidot の言語タグ

[327] [SEE[ [[Wikidotの言語タグ]] ]]

** その他のプロファイル


[47] [CITE@ja[GREEの国際化, その4 - 言語コード | GREE Engineering]], [TIME[2024-04-03T11:48:55.000Z]] <https://labs.gree.jp/blog/2012/11/6439/>

[48] >>47 [[GREE]] 用の[[部分集合]]を紹介している。

* データファイル

[144] [[言語タグ]]について構文的に正しいかどうか以上の処理を行いたい場合、
[[データファイル]]を用意する必要があります。

[145] 理論上は[[プラットフォーム]]の[[ロケール]]システムの一部として提供されている可能性もありますが、
実際にはそのような[[プラットフォーム]]は一般的ではありません。 ([[プラットフォーム]]独自の[[ロケール]]システムに関するデータは提供していても、
[[言語タグ]]一般のデータは提供されません。)

[REFS[
- [146] [CITE@en[data-web-defs/langtags.json at master · manakai/data-web-defs]] ([TIME[2017-03-05 12:36:56 +09:00]]) <https://github.com/manakai/data-web-defs/blob/master/data/langtags.json>
-- [147] ドキュメント: [CITE@en[data-web-defs/langtags.txt at master · manakai/data-web-defs]] ([TIME[2017-03-05 12:37:23 +09:00]]) <https://github.com/manakai/data-web-defs/blob/master/doc/langtags.txt>
]REFS]

[148] >>146 に、 [[JSON]] 形式のデータファイルがあります。
[[IANA登録簿]]や [[Unicode]] の登録簿に登録された[[部分タグ]]の情報が含まれています。

[149] [[言語タグ]]の情報は、[[言語]]というそう頻繁に変わらなそうなものを扱ってはいますが、
数ヶ月に一度程度という意外な高頻度で改訂されています。漏れている[[言語]]が追加されるなど、
細かな変更がちょくちょく行われているようです。

[150] 従って、[[言語タグ]]の情報を扱うシステムは、その情報を定期的に更新する機構を組み込んでおく必要があります。

;; [[ロケール]]も参照。

* 歴史

[REFS[
- [83] [CITE@en[Object Header lines in HTTP]] <http://www.w3.org/Protocols/HTTP/Object_Headers.html#z9>
]REFS]

[37] 非常に古い [[HTTP]] では、 RFC 1766 の [CODE(ABNF)["-"]] を使う方法ではなく [[POSIX]] の [[locale]] 名のように [CODE(ABNF)["_"]] で区切っていました。 

[38] >>37 現在でも間違ってこちらが使われる可能性がありますから、実装は両方に対応しているといいかもしれません。

[39] [[HTML]] 3.0 では [[lang]] 属性の値に [CODE(ABNF)["-"]] の代わりに [CODE(ABNF)["."]] を使っていました。 (''The Body Element and Related Elements'' <http://www.w3.org/MarkUp/html3/docbody.html#Body>)

** RFC 1766


[4] 
[DFN[[[RFC 1766]]]] は、[[言語タグ]]を規定する最初の [[RFC]] でした。
[[RFC 3066]] により[[廃止]]されました。

[REFS[
- [266] [CITE@en[[[RFC 1766]] - Tags for the Identification of Languages]] 
<http://tools.ietf.org/html/rfc1766>
]REFS]


[267] [[IETF]] で初めて[[言語タグ]]を規定した正式な仕様書が [[RFC 1766]]
です。 [[RFC 1766]] は[[標準化過程]] [[RFC]] で、[[提案標準]]でした。

[290] [[IETF]] における[[国際化]]について議論している [[RFC 2130]] と [[RFC 2277]]
では、[[言語タグ]]を [[IETF]] での標準的な言語識別方法としています。

[FIG(quote)[
[286] 
>   The term 'language tag' should be reserved for the short identifier
of RFC 1766 [RFC-1766] that only serves to identify the language.
While there may be other text attributes intimately associated with
the language of the document, such as desired font or text direction,
these should be specified with other identifiers rather than
overloading the language tag.

[FIGCAPTION[
[285] [CITE@en[RFC 2130 - The Report of the IAB Character Set Workshop held 29 February - 1 March, 1996]] ([TIME[2011-09-04 12:12:00 +09:00]] 版) <http://tools.ietf.org/html/rfc2130#page-8>
]FIGCAPTION]
]FIG]

[REFS[
- [6] [CITE@en[[[RFC 2277]] - IETF Policy on Character Sets and Languages]] 
<http://tools.ietf.org/html/rfc2277#section-4.3>
]REFS]

- [291] [[プロトコル]]は [[RFC 1766]] [[言語タグ]]を使う[['''べきです''']]。 [SRC[>>6 4.3.]]
- [292] 明確かつ正当な事由がある場合はこの限りではありません。 [SRC[>>6 4.3.]]

** HTTP/1.1

[257] [[HTTP/1.1]] ([[RFC 2068]], [[RFC 2616]]) は、[[RFC 1766]]
を引用しつつも独自に[[言語タグ]]の構文を規定しています。

[FIG(quote)[
[FIGCAPTION[
[92] 
RFC 2068・2616 (HTTP/1.1) 3.10 Language Tags
]FIGCAPTION]

> A language tag identifies a natural language spoken, written, or
otherwise conveyed by human beings for communication of information
to other human beings. Computer languages are explicitly excluded.
HTTP uses language tags within the Accept-Language and Content-Language fields.

[DFN[言語札識別子]]は、人間が他の人間と情報の通信をするために話したり書いたりその他伝達する自然言語を識別します。
計算機言語は陽に除外します。 HTTP
は [CODE(HTTP)[[[Accept-Language]]]] 欄と [CODE(HTTP)[[[Content-Language]]]]
欄の中で言語札を使います。

> The syntax and registry of HTTP language tags is the same as that
defined by RFC 1766 [1]. In summary, a language tag is composed of 1
or more parts: A primary language tag and a possibly empty series of subtags:

HTTP 言語札の構文と登録簿は [[RFC1766]] で定義されているものと同じです。
要約すると、言語札は一つ以上の部分の組合せ、すなわち
主言語札と空かもしれない部分札の系列です。

>
- language-tag  = primary-tag *( "-" subtag )
- primary-tag   = 1*8ALPHA
- [DEL[[INS[{2068,2616}]] subtag        = 1*8ALPHA]]
- [INS[[INS[{Errata}]] subtag        = 1*8(ALPHA / DIGIT)]]

> White[INS[ ]]space is not allowed within the tag and all tags are case-insensitive. The name space of language tags is administered by the
IANA. Example tags include:

[[空白]]は札の中では認められず、すべての札は大文字・小文字を区別しません。
言語札の名前空間は [[IANA]] で管理します。札の例:

> en, en-US, en-cockney, i-cherokee, x-pig-latin

> where any two-letter primary-tag is an ISO[INS[-]]639 language abbreviation
and any two-letter initial subtag is an ISO[INS[-]]3166 country code. (The
last three tags above are not registered tags; all but the last are
examples of tags which could be registered in future.)

ここで、2文字の主札は [[ISO639]] の言語の略語で、
2文字の最初の部分札は [[ISO3166]] 国名符号です。
(上の最後の3つの札は登録されていない札です。最後のもの以外は将来登録されるかもしれない例です。)

]FIG]

[258] 元々の定義は [[RFC 1766]] に基づく、[[数字]]が認められていないものでした。
[[正誤表]]により [[RFC 3066]] に基づく[[数字]]が使える定義に改められています。

** RFC 3066

[1] 言語札は [[RFC 1766]] が定義していましたが、 [[RFC 3066]] に改訂されました。

[REFS[
- [259] [CITE@en[RFC 3066 - Tags for the Identification of Languages]] 
<http://tools.ietf.org/html/rfc3066>
]REFS]

;; [5] [[RFC 3066]] の項も参照してください。

[78] [[RFC 1766]] は[[標準化過程]] [[RFC]] ([[提案標準]]) でしたが、
[[RFC 3066]] 以後は [[BCP]] ([DFN[[[BCP 47]]]]) となっています。

[REFS[
- [17] ''LANGUAGE TAGS'' <http://www.iana.org/assignments/language-tags> (last updated 2004-06-02)
- [18] ''Directory of language tag applications'' <http://www.iana.org/assignments/lang-tag-apps.htm>
]REFS]

** RFC 4646

[REFS[
- [274] [CITE@en[RFC 4646 - Tags for Identifying Languages]]
<http://tools.ietf.org/html/rfc4646>
]REFS]

;; [77] [[RFC 4646]] の項も参照してください。

[275] [[RFC 3066]] は全面改訂により [[RFC 4646]] に変わっています。 [[RFC 4646]]
は構文についても登録の仕方についても根本的に改めており、
完全には互換性がない新しい仕様となっています。

[REFS[
- [139] [CITE@en[RFC 4645 - Initial Language Subtag Registry]] 
<http://tools.ietf.org/html/rfc4645>
]REFS]

[256] [[RFC 4645]] は、 [[RFC 4646]] の標準化に際して改めて作成された新しい [[IANA]]
登録簿の初期状態の内容 ([DFN[[ABBR[[[ILSR]]][Initial Language Subtag Registry]]]]) 
を用意した方法について説明しています。

[REFS[
- [272] [CITE@en[RFC 4647 - Matching of Language Tags]]
<http://tools.ietf.org/html/rfc4647>
]REFS]

[273] [[RFC 3066]] のうち[[言語範囲]]と一致演算については [[RFC 4647]]
に分離されています。

** RFC 5646

[79] [[RFC 5646]] への改訂では、仕様の全体的な構成と内容は変わっていませんが、
細かな編集上の変更が数多く加わっています。また、前の版で未定義だった[[拡張言語]]が正式に定義されています。

[80] その他、前の版で[[ブラックホール]]になっていた[RUBYB[[[祖父]]]@en[grandfathered]]の [[ABNF]]
定義が改められ、何でも一致する定義から、 [[RFC 3066]] 時代までに登録されて現在の基準には沿わない[[言語タグ]]をすべて列挙する形に改められています。

[81] [[IANA登録簿]]の書式が [[US-ASCII]] から [[UTF-8]] に変更されています。

;; [82] また非互換変更かよ・・・。

[REFS[
[64] [CITE@en[RFC 5646 - Tags for Identifying Languages]]
([TIME[2009-09-09 03:41:39 +09:00]] 版)
<http://tools.ietf.org/html/rfc5646>
]REFS]

[65] [[RFC 4646]] が出てからまだ3年しか経ってないのに改訂とか超うけるwwwwwwwwwwwwwwww

[66] 調べてみたら [[RFC 1766]] → [[RFC 3066]] で5年、 [[RFC 3066]] → [[RFC 4646]]
で5年なのねwwwwwwwww

[70] >>65 逆に、 [[IETF]] でたった3年で改訂版を出せるのが奇跡かもwww

;; [252] というか前回で完成しなかったところを引き続きやってたからか。

[69] [CITE[Diff: rfc4646.txt - rfc5646.txt]] ([TIME[2011-09-04 15:00:06 +09:00]] 版) <http://tools.ietf.org/tools/rfcdiff/rfcdiff.pyht?url1=http://www.ietf.org/rfc/rfc4646.txt&url2=http://www.ietf.org/rfc/rfc5646.txt>

だいぶ変わってるな・・・。

[REFS[
[67] [CITE@en[RFC 5645 - Update to the Language Subtag Registry]]
([TIME[2009-09-09 02:23:51 +09:00]] 版)
<http://tools.ietf.org/html/rfc5645>
]REFS]

[253] [[RFC 5645]] は、 [[RFC 5646]] への改訂に際して行われた大規模な [[IANA]]
登録簿の追加と改訂の内容について説明しています。


**

[280] [[WebHACC]] 付属のツール <https://suika.suikawiki.org/gate/2007/html/langtag/?tag=en>
で[[言語タグ]]の構文解析結果や適合性エラーを見ることができます。

* テスト・ケース

[62]
[REFS[
[DEL[
- [CITE[Re: '''['''Ltru''']''' Re: Test suite for language tags?]] ([TIME[2006-09-20 01:12:23 +09:00]] 版) <http://www1.ietf.org/mail-archive/web/ltru/current/msg05589.html>
]DEL]
[INS[
- [CITE[Re: '''['''Ltru''']''' Re: Test suite for language tags?]] ([TIME[2008-05-28 18:32:25 +09:00]] 版) <http://www.ietf.org/mail-archive/web/ltru/current/msg05590.html>
]INS]
]REFS]

[REFS[
- [251] [CITE[t/langtag-1.dat at master from wakaba/manakai - GitHub]]
<https://github.com/wakaba/manakai/blob/master/t/langtag-1.dat>
]REFS]

* 応用

[192] [[HTML]] の [CODE(HTMLa)@en[[[lang]]]] [[属性]]や [[XML]]
の [CODE(XMLa)@en[[[xml:lang]]]] [[属性]]は [[IETF]] の[[言語タグ]]を値に採用しています。
これらの[[属性]]は[[言語情報]]の不在を示すために[[空文字列]]も値として認めています。

[FIG(short list)[ [229] [[言語タグ]]の[[応用]]
- [CODE[Content-Language:]]
- [CODE[Accept-Language:]]
- [CODE[;lang=]]
- [[GTFS]]
- [[言語タグ付き文字列]]
- [[[CODE[@]] (RDF)]]
- [[OpenType]]
]FIG]

* 関連


[311] 
[[Android]] の[[設定修飾子]]は [[IETF言語タグ]]を構文的に変形したものです。

[314] 
[[OpenType]] 
の
[CODE[ScriptLangTag]] 
は 
[[IETF言語タグ]]と非常によく似ていますが、
[[用字系]]を中心としたものです。


[63] [[OpenDocument]] 1.0 の
[CODE(XMLe)@en[dc:language]] [[要素]]の[[内容]]は [[RFC 3066]] 
[[言語札]]に''似たもの''です。

[316] 
[[POSIX]] の[[ロケール]]識別子は [CODE[-]] ではなく [CODE[_]] を区切りにしていますが、
[[IETF言語タグ]]と非常によく混同されています。

[315] 
その他各種[[言語符号]]は [[IETF言語タグ]]によく似たものも多いです。
[SEE[ [[言語符号]] ]]


* 言語タグの一覧

[SEE[ [[言語タグの一覧]] ]]






* 歴史

** [CODE(SGML)[%LanguageCode;]] 型 (HTML 4)

[151] [ABBR[[[HTML]]][Hypertext Markup Language]]
の [ABBR[[[DTD]]][Document Type Definition]]
で使われている [DFN[[CODE(SGML)[%LanguageCode]] 型]]は、
[[言語札]]を表します。

[REFS[
- [152] [[HTML 4]]
-- <IW:HTML4:"types.html#type-langcode">
-- [[厳密DTD]]:
<IW:HTML4:"sgml/dtd.html#LanguageCode">
-- [[移行用DTD]]:
<IW:HTML4:"sgml/loosedtd.html#LanguageCode">
-[[XHTML 1.0]]
-- [CSECTION[A.1.1. XHTML-1.0-Strict]]
<http://www.w3.org/TR/2002/REC-xhtml1-20020801/dtds.html#dtdentry_xhtml1-strict.dtd_LanguageCode>
-- [CSECTION[A.1.2. XHTML-1.0-Transitional]]
<http://www.w3.org/TR/2002/REC-xhtml1-20020801/dtds.html#dtdentry_xhtml1-transitional.dtd_LanguageCode>
-- [CSECTION[A.1.3. XHTML-1.0-Frameset]]
<http://www.w3.org/TR/2002/REC-xhtml1-20020801/dtds.html#dtdentry_xhtml1-frameset.dtd_LanguageCode>
- [[XHTML m12n]]
--[CSECTION[4.3. Attribute Types]]
<IW:XHTML1m12n:"abstraction.html#dt_LanguageCode">
]REFS]

[153] [[HTML 4]] 本文 (規定), [[DTD]] [[注釈]] (参考) は 
[[RFC 1766]] を参照しています。
[[XHTML 1.0]] [[SE]] [[DTD]] [[注釈]] (規定),
[[XHTML m12n]] [[抽象モジュール]]定義 (規定)
[SRC[XHTML m12n 4.3]] は
[[RFC 3066]] を参照しています。

[154] 
:[[引数実体名]]:[CODE(SGML)[%[[LanguageCode]]]] ([[HTML 4]], [[XHTML 1.0]])
:抽象属性型名:[CODE[LanguageCode]] ([[XHTML m12n]])
:属性型名:[Q[language-code]] ([[HTML 4]])
:[[SGML]] [[属性型]]:[CODE(SGML)[[[NAME]]]] ([[HTML 4]])
:[[XML]] [[属性型]]:[CODE(XML)[[[NMTOKEN]]]] ([[XHTML 1.0]])
:大文字・小文字:大文字正規化 ([[HTML 4]]), 区別無し ([[XHTML 1.0]])

[156] HTML 4 は、 RFC 1766 で定義された[[言語札]]を参照しています。
大文字・小文字は区別されません。
[ABBR[[[SGML]]][Standard Generalized Markup Language]]
的には [CODE(SGML)[[[NAME]]]] です
(つまり、 HTML 4 [[SGML宣言]]の元では大文字に正規化されます)。

[160] RFC 1766 はすでに改訂されていて、 [[ISO 639]]
の3文字符号に対応するとか構文上の重要な変更があります。

では HTML 4 で新しい構文の言語札を使っても良いのか、
微妙なところです。

引用規格は最新版を適用するかどうかの規定はないのですけど、
<IW:HTML4:"references.html#ref-RFC1766">
は [[I-D]] に言及しています。少なくても HTML 4 の著者は改訂があることに気づいているし、読者にもそれなりには注意を促しているのですから、
新しい構文の言語札を使っても、ばちは当たらないでしょう。
(無茶苦茶な論理だ。)

[200] この型が使われているのは、 [CODE(HTMLa)[[[lang]]]] 属性や [CODE(HTMLa)[[[hreflang]]]] 属性ですな。

[201] [CODE(HTMLa)[lang]] 属性は [ABBR[XML][拡張可能マーク付け言語]]
本体仕様に取り込まれ、 [CODE(XMLa)[[[xml]]:[[lang]]]]
属性になりました。こちらは後に空文字列を認めるように修正されています。


[326] 
[CITE@EN-US[Language Codes]], [[InetSDK]], [TIME[2024-08-17T06:08:41.000Z]], [TIME[2000-11-15T02:10:13.546Z]] <https://web.archive.org/web/20001115020300/http://msdn.microsoft.com/workshop/Author/dhtml/reference/language_codes.asp>


**


[22] RFC 3066 によれば、第2小札以降は文法規則 (特に、字数制限: 3〜8文字に注意)
に従う限り自由に使っていいことになっています。このため言語札の一意性は保障されないでしょう。
もっとも言語はそう簡単に増えたり減ったりするものではないですから、滅多なことでは衝突しないでしょうが・・・。
- [44] しかし衝突はしなくても、同じ言語/方言を表す名前が複数存在してしまうことになりかねません。
- [45] 言語札のレベルでは解決できない問題として、言語/方言の区分の方法による非一意性もあります。 
[[日本語言語タグ]]の[[大阪弁]]/[[関西弁]]問題や、台湾の外省人の言語が北京語と同じなのか (違うかな。) とか。
- [46] >>45 でも中国で北京語といったら北京方言のことで、官話方言のことじゃないそうですね。日本語共通語と山手方言とか江戸っ子言葉の関係みたいなもん?



- [49] [WEAK[2003-09-21 05:31:40 +00:00]] ''[[名無しさん]]'': ''スラッシュドット ジャパン | 国コードや言語コードなどに課金?'' <http://slashdot.jp/article.pl?sid=03/09/20/1440224&mode=flat&commentsort=4&threshold=-1>

- [14] ''ISO 639 Joint Advisory Committee'' <http://lcweb.loc.gov/standards/iso639-2/iso639jac.html>
-- [3] [639FAQ] ''ISO 639 Frequently Asked Questions (FAQ) '' <http://lcweb.loc.gov/standards/iso639-2/faq.html>
- [15] ''ISO 639-1 Registration Authority'' <http://linux.infoterm.org/infoterm-e/raiso639-1_start.htm>
- [16] ''ISO 639-2 Registration Authority - Library of Congress'' <http://www.loc.gov/standards/iso639-2/iso639-2ra.html>

[50]
[CITE[Published subjects for languages in ISO 639]] <http://psi.oasis-open.org/iso/639/>

言語符号の [[URI参照]]。 [[ISO 639]] の3文字符号が使われてます。

[[IETF]] はこれを見習ってとっとと言語札の URI 参照表現を定義してください[AA(face)[:)]]
([[名無しさん]] [WEAK[2005-01-10 00:06:08 +00:00]])

[51]
[CITE[ちょっとしたメモ - 地理コードのURI]] <http://www.kanzaki.com/memo/2005/01/09-1>
([[名無しさん]])

[52]
1月11日付で、[Q@en[No linguistic content]]を表す[CODE(lang block)@en[[[zxx]]]]が追加されました。
[Q@en[Used to declare the absence of linguistic information]]。

;; 
[CITE@en[ISO 639-2/RA Change Notice - Codes for the representation of names of languages (Library of Congress)]] 
<http://www.loc.gov/standards/iso639-2/codechanges.html#20060119>

([[名無しさん]] [WEAK[2006-02-07 03:54:43 +00:00]])

[54]
[CITE[I'm not a Klingon : Change in .Net Framework Culture Names for Windows Vista]] <http://blogs.msdn.com/shawnste/archive/2006/06/02/615674.aspx>
([[名無しさん]] [WEAK[2006-11-08 13:18:26 +00:00]])

[61]
[CITE[Language Tags and Locale Identifiers for the World Wide Web]] ([CODE[2006-12-19 13:39:55 +09:00]] 版) <http://www.w3.org/International/core/langtags/>

[209] [[RFC 4646]]/[[RFC 5646]]、同じ要件が何度も微妙に違う表現で繰り返されたりしていて、
とても読みにくくて悪い仕様書だなあ。

[210] [[IANA]] 登録簿や [[ISO]] の仕様に依存しているせいで仕様書本体の規定に抽象的なものが多くて理解しづらいし。

[223] 例示なのに[[助動詞]]が使われていたりおかしいし。

[227] あとは同じものについての話題があちこちの章にばらばらに出てくるからでしょうなー。
今の章構成もそれなりに意味があるのだろうけど、もっとテーマごとにまとめてコンパクトにできるような。

[293] [CITE@EN[W3C XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes]]
( ([TIME[2012-04-05 06:34:51 +09:00]] 版))
<http://www.w3.org/TR/2012/REC-xmlschema11-2-20120405/#language>

[294] [CITE[Packaged Web Apps (Widgets) - Packaging and XML Configuration (Second Edition)]]
( ([TIME[2012-11-22 21:22:20 +09:00]] 版))
<http://w3c.github.com/packed-webapps/packaging/#rule-for-deriving-the-user-agent-locales>

[295] [CITE@en[Re: Language ranges with more than two sub-tag]]
( ([[Norbert Lindenberg]] 著, [TIME[2013-03-05 15:42:00 +09:00]] 版))
<http://lists.w3.org/Archives/Public/www-international/2013JanMar/0327.html>

[301] [CITE[mattcg/language-tags]]
( ([TIME[2014-03-08 09:10:16 +09:00]] 版))
<https://github.com/mattcg/language-tags>

[302] [CITE[mattcg/language-subtag-registry]]
( ([TIME[2014-03-08 09:10:23 +09:00]] 版))
<https://github.com/mattcg/language-subtag-registry>

[303] [CITE@en-us[Metadata API for Media Resources 1.0]]
( ([TIME[2014-03-12 15:50:19 +09:00]] 版))
<http://www.w3.org/TR/mediaont-api-1.0/#widl-MediaAnnotation-language>

[304] [CITE@en-US[Notifications API Standard]]
( ([TIME[2014-02-11 16:20:34 +09:00]] 版))
<http://notifications.spec.whatwg.org/#language-0>

[305] [CITE@en-US[Internationalization Tag Set (ITS) Version 2.0]]
( ([TIME[2013-10-27 19:39:43 +09:00]] 版))
<http://www.w3.org/TR/its20/#LocaleFilter>

[306] [CITE@en-US[Internationalization Tag Set (ITS) Version 2.0]]
( ([TIME[2013-10-27 19:39:43 +09:00]] 版))
<http://www.w3.org/TR/its20/#LocaleFilter>

[307] [CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]]
( ([TIME[2014-06-07 01:55:45 +09:00]] 版))
<https://tools.ietf.org/html/rfc7231#section-3.1.3.1>

[97] [CITE[OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 - Part 1: OpenDocument Schema]]
([TIME[2011-09-29 13:00:00 +09:00]] 版)
<http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#a18_3_16language>

[98] [CITE[OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 - Part 1: OpenDocument Schema]]
([TIME[2011-09-29 13:00:00 +09:00]] 版)
<http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#a19_236fo_language>

[99] [CITE[OASIS Open Document Format for Office Applications (OpenDocument) Version 1.2 - Part 1: OpenDocument Schema]]
([TIME[2011-09-29 13:00:00 +09:00]] 版)
<http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os-part1.html#a19_512style_rfc-language-tag>

[FIG(quote)[
[FIGCAPTION[
[100] [CITE@en[Final: OpenID Connect Core 1.0 incorporating errata set 1]]
([TIME[2014-11-09 04:00:29 +09:00]] 版)
<http://openid.net/specs/openid-connect-core-1_0.html#ClaimsLanguagesAndScripts>
]FIGCAPTION]

> Human-readable Claim Values and Claim Values that reference human-readable values MAY be represented in multiple languages and scripts. To specify the languages and scripts, BCP47 '''['''RFC5646''']''' language tags are added to member names, delimited by a # character. For example, family_name#ja-Kana-JP expresses the Family Name in Katakana in Japanese, which is commonly used to index and represent the phonetics of the Kanji representation of the same represented as family_name#ja-Hani-JP. As another example, both website and website#de Claim Values might be returned, referencing a Web site in an unspecified language and a Web site in German.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[101] [CITE@en[Final: OpenID Connect Dynamic Client Registration 1.0 incorporating errata set 1]]
([TIME[2014-11-09 04:02:08 +09:00]] 版)
<http://openid.net/specs/openid-connect-registration-1_0.html#LanguagesAndScripts>
]FIGCAPTION]

> To specify the languages and scripts, BCP47 '''['''RFC5646''']''' language tags are added to Client Metadata member names, delimited by a # character.

]FIG]




[FIG(quote)[
[FIGCAPTION[
[103] [CITE@en[RFC 3709 - Internet X.509 Public Key Infrastructure: Logotypes in X.509 Certificates]]
([TIME[2015-04-05 18:07:12 +09:00]] 版)
<https://tools.ietf.org/html/rfc3709#page-10>
]FIGCAPTION]

> When language is specified, the language tag MUST use the RFC 3066
>    '''['''LANGCODES''']''' syntax.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[104] [CITE@ja[LibreOffice 4.2 リリースノート - The Document Foundation Wiki]]
([TIME[2015-01-25 22:44:11 +09:00]] 版)
<https://wiki.documentfoundation.org/ReleaseNotes/4.2/ja#.E8.A8.80.E8.AA.9E.E3.82.BF.E3.82.B0.E3.82.B5.E3.83.9D.E3.83.BC.E3.83.88>
]FIGCAPTION]

> カタロニア語(バレンシア) '''['''ca-ES-valencia''']''' を文書の内容として利用できるようになりました。 tdf#68714 (Eike Rathke)
> カタロニア語(バレンシア) のUI翻訳として当座しのぎで '''['''ca-XV''']''' を使っていたのを、正しく '''['''ca-ES-valencia''']''' タグを用いるようになりました。 (Eike Rathke)
> 当座しのぎで '''['''sh-*''']''' という文書言語としていたものを、正しく '''['''sr-Latn-*''']''' とするように、古い '''['''sh-*''']''' も扱えるようにしました。 (Eike Rathke)
> 言語リストに '''['''en-GB-oed''']''' ルール外(grandfathered)タグを "English, Oxford English Dictionary spelling" 用として追加しました。 (Eike Rathke)
> ラテン綴りで書かれたクルド語 '''['''ku-*''']''' の汚いマクロ言語のコードを綺麗にし、それぞれの国ごとに区別したスクリプトで処理するようにしました。 tdf#63460 (Eike Rathke)
> ku → kmr-Latn (北部クルド語、ラテン綴り)
> ku-TR → kmr-Latn-TR (トルコでの北部クルド語、ラテン綴り)
> ku-SY → kmr-Latn-SY (シリアでの北部クルド語、ラテン綴り)
> ku-IQ → ckb-IQ (イラクでの中部クルド語、アラビア綴り)
> ku-IR → ckb-IR (イランでの中部クルド語、アラビア綴り)
> 追加: sdh-IQ (イラクでの南部クルド語、アラビア綴り)

]FIG]


[105] [CITE@en[mediawiki/Names.php at master · wikimedia/mediawiki]]
([TIME[2015-04-25 19:51:05 +09:00]] 版)
<https://github.com/wikimedia/mediawiki/blob/master/languages/Names.php>




[FIG(quote)[
[FIGCAPTION[
[116] ([TIME[2015-04-26 23:18:14 +09:00]] 版)
<https://www.facebook.com/translations/FacebookLocales.xml>
]FIGCAPTION]

> <englishName>Sorani Kurdish</englishName>
> <codes>
> <code>
> <standard>
> <name>FB</name>
> <representation>cb_IQ</representation>
> </standard>
> </code>
> </codes>

]FIG]


[FIG(quote)[
[FIGCAPTION[
[118] ([TIME[2015-04-26 23:19:09 +09:00]] 版)
<https://www.facebook.com/translations/FacebookLocales.xml>
]FIGCAPTION]

> <englishName>Cherokee</englishName>
> <codes>
> <code>
> <standard>
> <name>FB</name>
> <representation>ck_US</representation>
> </standard>
> </code>
> </codes>

]FIG]


[119] [CITE@en[Remove requirements on language tags. Encourage developers to do the … · whatwg/notifications@743cd90]]
([TIME[2015-07-16 13:02:19 +09:00]] 版)
<https://github.com/whatwg/notifications/commit/743cd90906c5fa522d31ef0082b2a6e573385b6b>

[120] [CITE@en[Indicate language is a language tag. Fixes #46 again. · whatwg/notifications@90e2964]]
([TIME[2015-07-18 11:37:40 +09:00]] 版)
<https://github.com/whatwg/notifications/commit/90e29647469fb26b1f707cf93d8c787b92d2bbdc>

[FIG(quote)[
[FIGCAPTION[
[122] [CITE@en[RFC 7591 - OAuth 2.0 Dynamic Client Registration Protocol]]
([TIME[2015-07-15 00:25:14 +09:00]] 版)
<https://tools.ietf.org/html/rfc7591#section-2.2>
]FIGCAPTION]

> 
>    To specify the languages and scripts, BCP 47 '''['''RFC5646''']''' language tags
>    are added to client metadata member names, delimited by a "#"
>    character.  Since JSON '''['''RFC7159''']''' member names are case sensitive, it
>    is RECOMMENDED that language tag values used in Claim Names be
>    spelled using the character case with which they are registered in
>    the "IANA Language Subtag" registry '''['''IANA.Language''']'''.  In particular,
>    normally language names are spelled with lowercase characters, region
>    names are spelled with uppercase characters, and languages are
>    spelled with mixed-case characters.  However, since BCP 47 language
>    tag values are case-insensitive, implementations SHOULD interpret the
>    language tag values supplied in a case insensitive manner.  Per the
>    recommendations in BCP 47, language tag values used in metadata
>    member names should only be as specific as necessary.  For instance,
>    using "fr" might be sufficient in many contexts, rather than "fr-CA"
>    or "fr-FR".
> 

]FIG]


[FIG(quote)[
[FIGCAPTION[
[123] [CITE@EN[XQuery and XPath Full Text 3.0]]
([TIME[2015-11-20 06:32:18 +09:00]] 版)
<http://www.w3.org/TR/2015/REC-xpath-full-text-30-20151124/#ftlanguageoption>
]FIGCAPTION]

> An implementation MUST treat language identifiers that '''['''BCP 47''']''' defines as equivalent as identifying the same language. For example "mn" and "MN" are equivalent, as language tags are case insensitive, and "de" and "deu" are equivalent, as they are different codes for the same language. However, it is implementation-defined whether an implementation treats a particular language identifier with script, region, or variant portions as equivalent to the language identifier without them. For example, an implementation may treat "en-UK" as equivalent "en" and "en-US" but "sr-Latn" as different from "sr" and "sr-Cyrl".

]FIG]


[124] ([TIME[2009-04-04 06:12:29 +09:00]] 版)
<http://unicode.org/repos/cldr/trunk/tools/java/org/unicode/cldr/util/data/langtagTest.txt>

[131] [CITE@en[nototools/lang_data.py at master · googlei18n/nototools]]
([TIME[2016-01-13 16:05:45 +09:00]] 版)
<https://github.com/googlei18n/nototools/blob/master/nototools/lang_data.py>

[FIG(quote)[
[FIGCAPTION[
[132] [CITE@ja[Intl - JavaScript | MDN]]
([TIME[2015-11-07 04:09:02 +09:00]] 版)
<https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Intl>
]FIGCAPTION]

> locales引数は、すべてのUnicode拡張を除去した後、アプリケーションからの優先順位付き要求として解釈されます。ランタイムは、利用可能なローケルと比較し、利用可能なもののうち一番よいローケルを選びます。マッチングアルゴリズムは"lookup" matcherと"best fit" matcherの二つです。"lookup" matcher は、BCP 47で指定されたLookupアルゴリズムに従います。"best fit" matcher では、少なくとも "lookup" matcher と同程度の、しかし可能ならより要求に適したロケールを選択します。

]FIG]


[133] [CITE@en[(Language tag) - SuikaWiki Data]]
([TIME[2016-03-15 16:18:20 +09:00]] 版)
<https://data.suikawiki.org/lang>


[135] [CITE[language_detection_util.cc - Code Search]]
( ([TIME[2016-05-05 12:18:05 +09:00]]))
<https://code.google.com/p/chromium/codesearch/#chromium/src/components/translate/core/language_detection/language_detection_util.cc>





[FIG(quote)[
[FIGCAPTION[
[142] [CITE@en[Web Annotation Data Model]]
([TIME[2017-02-24 02:14:26 +09:00]])
<https://w3c.github.io/web-annotation/model/wd2/#h-external-web-resources>
]FIGCAPTION]

> The value of the property should be a language code following the '''['''bcp47''']''' specification.

]FIG]


[207] [CITE@en[draft-ietf-slim-negotiating-human-language-08 - Negotiating Human Language in Real-Time Communications]]
([TIME[2017-05-14 22:37:55 +09:00]])
<https://tools.ietf.org/html/draft-ietf-slim-negotiating-human-language-08>

[216] [CITE@en[GPHemsley/BCP47: Code for parsing the IANA Language Subtag Registry and implementing BCP 47 support in Firefox.]]
([TIME[2017-06-05 10:44:41 +09:00]])
<https://github.com/GPHemsley/BCP47>






[FIG(quote)[
[FIGCAPTION[
[219] [CITE@en[RFC 4676 - Dynamic Host Configuration Protocol (DHCPv4 and DHCPv6) Option for Civic Addresses Configuration Information]]
([TIME[2018-02-11 18:28:10 +09:00]])
<https://tools.ietf.org/html/rfc4676#section-3.4>
]FIGCAPTION]

>    Language:  The "language" item (CAtype 0) optionally identifies the
>       language used for presenting the address information, drawing from
>       the tags for identifying languages in '''['''4''']''', as discussed in '''['''13''']'''.
>       If omitted, the default value for this tag is "i-default" '''['''3''']'''.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[220] [CITE@en[RFC 4776 - Dynamic Host Configuration Protocol (DHCPv4 and DHCPv6) Option for Civic Addresses Configuration Information]]
([TIME[2018-02-11 17:19:02 +09:00]])
<https://tools.ietf.org/html/rfc4776#page-11>
]FIGCAPTION]

>    Language:  The "language" item (CAtype 0) optionally identifies the
>       language used for presenting the address information, drawing from
>       the tags for identifying languages in '''['''4''']''', as discussed in '''['''13''']'''.
>       If omitted, the default value for this tag is "i-default" '''['''3''']'''.

]FIG]



[224] [CITE[VRML97, ISO/IEC 14772-1:1997 -- 6 Node Reference]]
([TIME[2014-01-31 07:20:50 +09:00]])
<https://www.web3d.org/documents/specifications/14772/V2.0/part1/nodesRef.html#FontStyle>


[226] [CITE[JSON Feed - JSON Feed Version 1.1]]
([TIME[2020-08-11T17:02:07.000Z]], [TIME[2020-10-07T02:57:56.304Z]])
<https://jsonfeed.org/version/1.1#top-level>

[271] [CITE@en[rfc3659]]
([TIME[2021-07-16T03:25:36.000Z]])
<https://datatracker.ietf.org/doc/html/rfc3659#section-7.5>

[FIG(quote)[
[FIGCAPTION[
[279] [CITE@en-US[Interslavic Spellchecker » Extensions]]
([TIME[2022-01-14T02:11:55.000Z]])
<https://extensions.libreoffice.org/en/extensions/show/15995>
]FIGCAPTION]

>  In older versions you might see these language entries instead:
> * {art-Cyrl-x-interslv}
> * {art-Latn-x-interslv}

]FIG]


[140] [CITE@ja[Multilingual names - OpenStreetMap Wiki]], [TIME[2024-04-05T13:30:29.000Z]] <https://wiki.openstreetmap.org/wiki/Multilingual_names#France>

>In Britanny and Normandy, there are also the "Gallo" and "Norman" languages but they still have no specific ISO 639 code assigned (they may be represented in conforming BCP 47 tags as "fr-gallo" or "fr-x-norman" using a private extension only to collect the data, that won't be used interoperably before there's a documented agreement on which subtags to use; for Norman the assigned code "nrf" refers ambiguously to modern Jersiais, Guernésiais or Continental Norman and don't seem to discriminate their own local dialects, so it would still safely replace the "fr-x-norman" private use extension of French, or we could use "nrf-FR" font continental Norman, "nrf-JE" for Jersiais, and "nrf-GG" for Guernésiais if a distinction is really needed at the same place). 


