参照。
こうすれば、たとえ [SAMP(lang)[ja-JP]] の処理を知らなくても、
[SAMP(lang)[ja]] の処理さえ知っていれば、それなりの結果が期待できます。
[[#comment]]
** 歴史
[26]
仕様書:
- [DEL[[[RFC 2070]] ([[IETF]] [[提案標準]])]] ([[廃止]])
-- [CSECTION@en[3. The LANG attribute]]
[27]
[[標準]]として最初に [CODE(HTMLa)@en[[[lang]]]]
[[属性]]が [[HTML]] に導入されたのは [[HTML 2.x]]
([[RFC 2070]]) でした。 [[HTML 2.x]] ではすべての[[要素型]]のうち、
意味をなさないと考えられた
[CODE(HTMLe)@en[[[br]]]], [CODE(HTMLe)@en[[[hr]]]],
[CODE(HTMLe)@en[[[base]]]], [CODE(HTMLe)@en[[[nextid]]]],
[CODE(HTMLe)@en[[[meta]]]]
''以外''すべてに [CODE(HTMLa)@en[[[lang]]]]
[[属性]]が追加されました [SRC[[[RFC 2070]] 3.]]。
[28]
[[RFC 2070]] は[[属性値]]として [[RFC 1766]]
の[[言語札]]を参照しつつも構文と意味を独自に規定
[WEAK[(というか[[コピペ]])]] していました。
>>10 の階層的比較に関する規定や >>16
の継承に関する規定もありました。
[[#comment]]
** 例
[14] [HTML4] から。
[PRE[
Her super-powers were the result of
γ-radiation,
he explained.
]PRE]
- UA は、英語の内容を適切な方法の描画 (たとえば引用符の取り扱い) を試みるべきです。
- UA は、英語の文字でなくても最前の努力でもって表示を試みなければなりません。
([CODE(HTMLe)[p]] 要素またはそれより上位の要素でも [CODE(HTML)[[CODE(HTMLa)[lang]]=en]] とちゃんと指定しておかないと、引用符は決定できないと思うのですけどねぇ。)
[23]
[[英語]]の文章の中に[[日本語]]
([[羅馬字]]表記) が混じっている例
[PRE(HTML example)[
Horizontal in vertical ("Tate-chu-yoko")
]PRE]
> [SAMP(HTML)[In Japanese, this effect is known as "Tate-chu-yoko".]]
共に出典は
[CITE[CSS3 Text Module]]
[[#comment]]
* xml:lang 属性 (XML)
- [4] [[xml]]:lang 特殊属性:
- [3] [[XSL-FO]] の [CODE(XML)[xml:lang]] 属性の値には [CODE(XSL)[inherit]] を指定できます。 ([[言語札]>>40] 参照)
-
[5] XML 1.0 [ABBR[FE] [First Edition]] では[[言語札]]の構文も定義されていました () が、 [ABBR[SE] [Second Edition]] では RFC に一任されています。
[7] XML 1.0 [[SE]] Errata では重大な変更が加えられています。型が [CODE(SGML)[[[NMTOKEN]]]] から [CODE(SGML)[[[CDATA]]]] に変更され、空文字列が認められました。
- [8] >>7 空文字列だと言語指定取消し (指定なし。) になります。 ([[XML名前空間]]の 1.1 版と似たような変更ですね。) ''Errata in REC-xml-20001006''
[21]
[CODE(lang)[[[und]]]] (決定できない) という言語札もあったりしますが、空文字列はもっと積極的に、どの言語にも属さない場合 (絵とか) に使う、のではないでしょうかねぇ。
([[名無しさん]])
[[#comment]]
* lang() 関数 (XPath)
[6] [[XPath]] の[[関数]] [CODE(XPath)[[[lang()]]]] って使えないと思いません? 引数に[[言語札]]を与えることで、その言語 (前方一致。) であるかどうかを [[boolean]] として返します。だから例えば、 [[XSLT]] を使って多言語文書から特定言語の段落を抜き出す、とかには使えても、特定要素ノードの言語を調べる、には使えない。 ([CODE(XML)[xml:lang]] 属性使ってもいいけど、この属性の値は継承するから・・・あ、 [CODE(XPath)[ancestor-or-self::*[@xml:lang]/@xml:lang]] という手があるか。)
[20] >>6 でもそれじゃあ上位プロトコルによる情報までは手が及ばない。
っていうか XPath 全体として、上位プロトコル提供の情報には access
不能 or 困難だよねぇ。
[[#comment]]
* [CODE(CSS)@en[:lang([VAR@ja[言語札]])]] 擬似クラス (選択子)
[29]
[[選択子]]の
[DFN[[CODE(CSS)@en[:lang([VAR@ja[[[言語札]]]])]] [[擬似クラス]]]]は、
指定された[[言語]]の[[要素]]と[[一致]]します。
[30]
仕様書:
- [[CSS 2]]
--[CSECTION@en[5.11.4 The language pseudo-class: :lang]]
- [CITE@en[Selectors]]
-- [CSECTION@en[6.6.3 The language pseudo-class :lang]]
** 構文
[31]
[CODE(CSS)@en[:lang([VAR[C]])]] で、 [CODE(CSS)@en[[VAR[C]]]]
は[[言語札]]を指定します。[[言語札]]として [[CSS 2]]
勧告では [[HTML 4.0]] と [[RFC 1766]] が、選択子勧告候補
[SRC@en[Selectors]] では [[HTML 4.01]] と [[RFC 3066]]
が参照されています。 [[HTML 4]] は [[RFC 1766]]
を参照しています。
[[CSS 2.1]] 作業原案は[[ハイフン]]区切りの文字列とだけ規定しています。
また、空文字列でもよく、その場合何と一致するかは未定義とされています。
メモ: 執筆の時点で Selectors 勧告候補は CSS 2.0
勧告に基づいた規定になっており、次の原案で CSS 2.1
作業原案における改訂を反映するものと思われます。
[[#comment]]
** 一致
[32]
[CODE(CSS)@en[:lang([VAR@en[C]])]] [[擬似クラス]]と[[言語]]との[[一致]]の判定は
[[属性選択子]]の [CODE(CSS)[[[|=]]]] [[演算子]]と同じ方法によります。
[SRC@en[[[CSS 2]], [[CSS 2.1]]]]
という規定がなぜか Selectors 勧告候補にはありません。
[33]
[[一致]]判定の対象となる、[[文書木]]側の[[言語]]の情報源は、
[[文書]]の[[マーク付け言語]]によって異なります。
[[HTML]] では [CODE(HTMLa)@en[[[lang]]]]
[[属性]]や [[HTTP]] からの情報が使われますし、
[[XML]] では [CODE(XMLa)@en[[[xml]]:[[lang]]]]
[[属性]]や[[マーク付け言語]]依存の方法で得られた情報が使われます。
[SRC@en[[[CSS 2]], [[CSS 2.1]], Selectors]]
という話は仕様書では例として挙げられているだけのようで、
詳細は各[[マーク付け言語]]の仕様が規定するべきということと思われます。
但し [[CSS 2.1]] には、各[[文書]]や[[プロトコル]]で
[[RFC 3066]] の[[言語札]]を使うことや [[XML]]
では [CODE(XMLa)@en[[[xml]]:[[lang]]]]
[[属性]]を使うことが推奨されています。
[[#comment]]
** メモ
[34]
巷の [[CSS]] の解説の中には、
[PRE(CSS example code)[
:lang(ja)
]PRE]
と
[PRE(CSS example code)[
[lang|="ja"]
]PRE]
が同じだとしているものがありますが、
>>32 や >>33 の通り同じでは''ありません''。
似たような意味を持つことは確かですが、
似ているからこそ読者の誤解を招かないように正確な解説を心がけるべきです。
[[#comment]]
* メモ
[1] [CODE(HTML)[lang]] 属性の値で [[CJK]] [[字形]]を区別するのは、間違ってはいませんが良い考えではありません。 (でも [[Unicode]] には他に方法はないです。)
[2] >>1 [[異体字タグ]]? 萎えるな。それに [[XML]] でそれは使えるんだろうか?