* lang 属性 (HTML, XHTML 1) [11] [[HTML]] のほとんどの[[要素型]]で定義されている[[属性]] [CODE(HTMLa)[lang]] は、その[[要素]]の[[属性値]]および文[[内容]] (text content) の基底言語 (base language) を指定します。 この属性の値は [CODE(SGML)[%[[LanguageCode]];]] 型 ([[IETF]] の[[言語札]]) であり、[[大文字]]・[[小文字]]は区別されません。 既定値は[RUBYB[未知][unknown]]です。 ( 参照。) [15] なお、ここで[[言語]]とは[[自然言語]]であって、 [[プログラム言語]]は除外されています。 ( 参照。) [12] この属性の値は、 [[UA]] が種々の用途で使います。 に挙げられている例としては: - [[検索円陣]]の補助情報 - [[発話合成]]の補助情報 - 高品質[[写植]]のための[[異体グリフ]]選択の補助 - [[引用符]]集合を選ぶための補助 - [[ハイフン付け]], [[合字]] ([[リガチャ]]), [[文字間]]の決定の補助 - 綴り検査・文法検査の補助情報 があります。 [13] [CODE(HTMLa)[lang]] 属性の意図は、 UA が特定言語における旧来の文化的慣習に基づいてより有意義に内容を[[描画]]できるようにということにあります。 UA に特定言語では型破りな文字をさほど意味のない方法で描画することを求めるものではありません。 UA は、 [CODE(HTMLa)[lang]] 属性で指定された値に関わらず、 全ての文字を描画するように最前の努力をなさなければなりません [HTML4]。 という良く分からない文章の心は、 [CODE(HTML)[[CODE(HTMLa)[lang]]=en]] にしたら (そうしなければ表示されていたはずの) 漢字が[[豆腐]]とかに化けてしまう糞 UA 逝っとくれと、そういうことですかねぇ。 >>4 の例からみても。違いますか? [[#comment]] ** 継承 [16] ある要素の言語は、次の情報から決定されます。 (先のものが優先度が高い。) = その要素の [CODE(HTMLa)[lang]] 属性値 = 一番近い [CODE(HTMLa)[lang]] 属性を持つ要素の [CDE(HTMLa)[lang]] 属性値 =- 一般には、[[先祖要素]] =- [[表]]の[[こま]]では、その[[行]]の最初のこまだったりもする。 = [[HTTP]] の [CODE(HTTP)[[[Content-Language]]]] 頭欄 = [[UA]] の既定値・利用者の設定 ( 参照。) [17] 実際には HTML は HTTP 以外でも使われますから、 HTTP に限らず転送プロトコル一般の言語情報を第3位と解釈するのがよいでしょう。 転送プロトコルが複数組み合わされる場合は (各プロトコル(群)で特に規定がある場合はそれによるとし、そうでない場合は) 内側の (HTML 文書に近い) プロトコルの情報が優先されるとするのがよいでしょう。 [18] [CODE(HTMLa)[[[http-equiv]]]] な [CODE(HTMLe)[[[meta]]]] 要素を使って [CODE(HTTP)[Content-Language]] を指定する方法も実際には良く使われています。 HTML 4 が触れていない以上、厳密に HTML 4 に従う UA では無視するのが良いのかもしれませんが、現実路線(謎)の UA は HTTP など上位プロトコルが言語情報を持たないときにはこれを参照してもよいのではないでしょうか。 [19] ところで、 HTTP では [SAMP(HTTP)[Content-Language: ja.en]] のように複数の言語を指定できるのですが、 HTML 4 ではできません。 実装者はその辺注意されたし。 [[#comment]] ** 言語札の階層性 [10] 言語札は [SAMP(lang)[ja-JP]], [SAMP(lang)[en-US]] のような階層構造を持っています。 HTML 4 は、言語情報による処理に際して、まず全体の一致を試み、 次に最初の部分の一致によるべきだとしています。 参照。 こうすれば、たとえ [SAMP(lang)[ja-JP]] の処理を知らなくても、 [SAMP(lang)[ja]] の処理さえ知っていれば、それなりの結果が期待できます。 [[#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]] とちゃんと指定しておかないと、引用符は決定できないと思うのですけどねぇ。) [[#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'' [[#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]] * メモ [1] [CODE(HTML)[lang]] 属性の値で [[CJK]] [[字形]]を区別するのは、間違ってはいませんが良い考えではありません。 (でも [[Unicode]] には他に方法はないです。) [2] >>1 [[異体字タグ]]? 萎えるな。それに [[XML]] でそれは使えるんだろうか?