[29]
[[選択子]]の 
[DFN[[CODE(CSS)@en[:lang([VAR@ja[[[言語タグ]]]])]] [[擬似クラス]]]]は、
指定された[[言語]]の[[要素]]と[[一致]]します。

* 仕様書

[REFS[
- [59] '''[CITE@en[Selectors Level 3]] ([TIME[2011-09-29 22:16:17 +09:00]] 版) <http://www.w3.org/TR/selectors/#lang-pseudo>'''
- [72] [CITE@en-US-x-hixie[WebVTT Standard]] ([TIME[2012-11-05 21:05:39 +09:00]] 版) <http://dev.w3.org/html5/webvtt/#pseudo-cue-selector>
]REFS]

* 意味

[61] [CODE(CSS)@en[[[:lang()]]]] [[擬似クラス]]は、[[要素]]の[[自然言語]]が指定された値と等しいか、
または指定された値の後に [CODE(CSS)[[[-]]]] が続いている時、その[[要素]]と[[一致]]します。
ここで[[要素]]の[[自然言語]]は[[文書言語]]によって定義されるものであり、必要に応じて [[BCP 47]]
の[[言語タグ]]の構文に正規化したもの、とされています。 [SRC[>>59]]

[73] [[WebVTT]] では、[[WebVTT内部節点オブジェクト]]は [[WebVTT節点オブジェクト]]の[[適用可能な言語]]によって[[言語]]が決まります
[SRC[>>72]]。

;; [74] つまり [CODE[[[<lang>]]]] によって指定された[[言語]] (の[[継承]]を考慮したもの) 
が [CODE(CSS)@en[[[:lang()]]]] の[[一致]]の判定に用いられます。

[3] 関連: [[言語タグの一致]]

* 構文

[63] [CODE(CSS)@en[[[:lang]]]] の直後に括弧で括って[[言語タグ]]を指定する必要があります。

[66] [[言語タグ]]は [[CSS]] の[[識別子]]で[['''なければなりません''']]。
[[言語タグ]]として正しいものである必要はありません。 [SRC[>>59]]

* 大文字と小文字

[64] [CODE(CSS)@en[[[lang]]]] の部分は[[ASCII大文字・小文字不区別]]です。

[65] [[言語タグ]]も[[ASCII大文字・小文字不区別]]です [SRC[>>59]]。

* 要素の言語

[33]
[[一致]]判定の対象となる、[[文書木]]側の[[言語]]の情報源は、
[[文書]]の[[マーク付け言語]]によって異なります。
[[HTML]] では [CODE(HTMLa)@en[[[lang]]]]
[[属性]]や [[HTTP]] からの情報が使われますし、
[[XML]] では [CODE(XMLa)@en[[[xml]]:[[lang]]]]
[[属性]]や[[マーク付け言語]]依存の方法で得られた情報が使われます。
[SRC@en[[[CSS 2]], [[CSS 2.1]], Selectors3 >>59]]

[62] ... という話は仕様書では例として挙げられているだけのようで、
詳細は各[[マーク付け言語]]の仕様が規定するべきということと思われます。
但し [[CSS 2.1]] や[[選択子3]]では、各[[文書]]や[[プロトコル]]で
[[BCP 47]] の[[言語札]]を使うことや [[XML]]
では [CODE(XMLa)@en[[[xml]]:[[lang]]]] 
[[属性]]を使うことが推奨されています [SRC[>>59]]。

* 妥当性

[67] 構文的に正しくないと[[非妥当]]です。例えば[[言語タグ]]が指定されていないと[[非妥当]]です
[SRC[>>59]]。

* 歴史

[31]
[CODE(CSS)@en[:lang([VAR[C]])]] で、 [CODE(CSS)@en[[VAR[C]]]]
は[[言語札]]を指定します。[[言語札]]として [[CSS 2]]
勧告では [[HTML 4.0]] と [[RFC 1766]] が、選択子勧告候補 
[SRC@en[Selectors3 CR]] では [[HTML 4.01]] と [[RFC 3066]]
が参照されています。 [[HTML 4]] は [[RFC 1766]]
を参照しています。

[[CSS 2.1]] 作業原案は[[ハイフン]]区切りの文字列とだけ規定しています。
また、空文字列でもよく、その場合何と一致するかは未定義とされています。

;; メモ: 執筆の時点で Selectors 勧告候補は CSS 2.0 
勧告に基づいた規定になっており、次の原案で CSS 2.1
作業原案における改訂を反映するものと思われます。

** CSS2

[REFS[
- [70] [CITE@en[Selectors]] ([TIME[1998-03-25 23:00:31 +09:00]] 版) <http://www.w3.org/TR/1998/PR-CSS2-19980324/selector.html#x40>
- [30] [[CSS 2]]
-- [CSECTION@en[5.11.4 The language pseudo-class: :lang]]
<http://www.w3.org/TR/CSS2/selector.html#lang>
]REFS]

[71] >>70 で追加されました。

** 選択子3

[REFS[
- [60] [CITE@en[Selectors]]
-- [CSECTION@en[6.6.3 The language pseudo-class :lang]]
<http://www.w3.org/TR/2001/CR-css3-selectors-20011113/#lang-pseudo>
]REFS]

[32]
[CODE(CSS)@en[:lang([VAR@en[C]])]] [[擬似クラス]]と[[言語]]との[[一致]]の判定は
[[属性選択子]]の [CODE(CSS)[[[|=]]]] [[演算子]]と同じ方法によります。
[SRC@en[[[CSS 2]], [[CSS 2.1]]]]
という規定がなぜか Selectors 勧告候補にはありませんでした。

** WebVTT
[REFS[
- [75] [CITE@en[Web Applications 1.0 r7504        Add <lang> to WebVTT.]] ([TIME[2012-11-06 06:03:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=7503&to=7504>
]REFS]

[76] >>75 で [CODE@en[[[<lang>]]]] が定義されたのに伴い、 [CODE(CSS)@en[[[:lang()]]]]
との対応も規定されることになりました。

* 関連

[68] [[属性選択子]]で [CODE(CSS)[[[|=]]]] を指定した場合と同じように機能しますが、
[CODE(CSS)@en[[[:lang]]]] は実装が知っている[[文書]]の[[意味]]に基づき効果が及ぶ点が異なっています
[SRC[>>59]]。

[EG[
[69] 例えば [CODE(CSS)@en[[[:lang(ja)]]]] は [CODE(HTMLa)@en[[[lang]]]] [[属性]]が
[CODE(lang)[[[ja]]]] である[[要素]]だけでなく、 (それを継承している) [[子孫]]の[[要素]]にも[[一致]]します。
また [CODE(HTMLa)@en[[[lang]]]] [[属性]]が明示されていなくても、 [[HTTP]]
の [CODE(HTTP)@en[[[Content-Language]]]] 欄に指定されていれば、それを継承している[[要素]]にも[[一致]]します。
更に [CODE(HTMLa)@en[[[lang]]]] と [CODE(XMLa)@en[[[xml:lang]]]] が混在していても正しく動作します。
]EG]

[77] [[XPath 1.0]] にも [CODE(XPathFunction)@en[[[lang()]]]] [[関数]]があり、同じように使うことができますが、
[[XPath]] は [[XML]] の [CODE(XMLa)@en[[[xml:lang]]]] [[属性]]しか考慮しておらず若干動作が異なります。

* メモ

[34]
巷の [[CSS]] の解説の中には、
[PRE(CSS example code)[
:lang(ja)
]PRE]

と
[PRE(CSS example code)[
[lang|="ja"]
]PRE]

が同じだとしているものがありますが、
>>32 や >>33 の通り同じでは''ありません''。
似たような意味を持つことは確かですが、
似ているからこそ読者の誤解を招かないように正確な解説を心がけるべきです。

[FIG(quote)[
[FIGCAPTION[
[1] [CITE@en[Safari 9.0]]
([TIME[2015-11-04 23:34:57 +09:00]] 版)
<https://developer.apple.com/library/safari/releasenotes/General/WhatsNewInSafari/Articles/Safari_9.html#//apple_ref/doc/uid/TP40014305-CH9-SW34>
]FIGCAPTION]

> The following CSS4 selectors are now fully supported by Safari.
> :lang

]FIG]


[2] [CITE@en['''['''selectors-4''']''' Defer to css-text for definition of content language so…]]
([[fantasai]]著, [TIME[2018-01-27 09:10:03 +09:00]])
<https://github.com/w3c/csswg-drafts/commit/9eed0f927a7a5baea1d86737d15a96c1365cde00>