[38] 本稿では、 [Q@en[lang]] と呼ばれるものについて説明しています。 [Q@en[lang]] は[[英語]]の [Q@en[[[language]]]] の省略形として非常に良く用いられる語で、 文脈によって[[自然言語]]を指したり[[プログラム言語]]、 [[マーク付け言語]]その他、あるいはそれらをまとめて指したりします。 [[自然言語]]を指定する[[プロトコル要素]]等に関しては、 [Q[[[言語情報]]]]の項も併せてご覧下さい。 * lang 属性 (HTML, XHTML 1) [11] [[HTML]] のほとんどの[[要素型]]で定義されている[[属性]] [CODE(HTMLa)[lang]] は、その[[要素]]の[[属性値]]および文[[内容]] (text content) の基底言語 (base language) を指定します。 この属性の値は [CODE(SGML)[%[[LanguageCode]];]] 型 ([[IETF]] の[[言語札]]) であり、[[大文字]]・[[小文字]]は区別されません。 既定値は[RUBYB[未知] [unknown]]です。 [25] 仕様書: - [[HTML 4]] -- [CODE(HTMLa)[lang]] 属性 - [[XHTML 1.0]] -- [CSECTION[C.7. The [CODE(HTMLa)[lang]] and [CODE(HTMLa)[xml:lang]] Attributes]] (参考) [15] なお、ここで[[言語]]とは[[自然言語]]であって、 [[プログラム言語]]は除外されています。 ( 参照。) [12] この属性の値は、 [[UA]] が種々の用途で使います。 に挙げられている例としては: - [[検索円陣]]の補助情報 - [[発話合成]]の補助情報 - 高品質[[写植]]のための[[異体グリフ]]選択の補助 - [[引用符]]集合を選ぶための補助 - [[ハイフン付け]], [[合字]] ([[リガチャ]]), [[文字間]]の決定の補助 - 綴り検査・文法検査の補助情報 があります。 [13] [CODE(HTMLa)[lang]] 属性の意図は、 UA が特定言語における旧来の文化的慣習に基づいてより有意義に内容を[[描画]]できるようにということにあります。 UA に特定言語では型破りな文字をさほど意味のない方法で描画することを求めるものではありません。 UA は、 [CODE(HTMLa)[lang]] 属性で指定された値に関わらず、 全ての文字を描画するように最前の努力をなさなければなりません [HTML4]。 という良く分からない文章の心は、 [CODE(HTML)[[CODE(HTMLa)[lang]]=en]] にしたら (そうしなければ表示されていたはずの) 漢字が[[豆腐]]とかに化けてしまう糞 UA 逝っとくれと、そういうことですかねぇ。 >>4 の例からみても。違いますか? [[#comment]] ** 代替 [24] [[XHTML 1.0]] で [[XML]] の [CODE(XMLa)[[[xml]]:lang]] 属性が [[XHTML]] に取り入れられました。 [[XHTML 1.0]] 互換性指針によれば、[WEAK[互換性指針に従う文書は]] [CODE(HTMLa)[lang]] と [CODE(HTMLa)[xml:lang]] の両方を指定するべきです。 [CODE(HTMLa)[xml:lang]] が優先されます。 [SRC[XHTML 1.0 C.7]] [[#comment]] ** 継承 [16] ある要素の言語は、次の情報から決定されます。 (先のものが優先度が高い。) = その要素の [CODE(HTMLa)[lang]] 属性値 = 一番近い [CODE(HTMLa)[lang]] 属性を持つ要素の [CODE(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 ではできません。 実装者はその辺注意されたし。 [22] 表の中では [CODE(SGML)[%[[cellvalign]]]] と同じ継承規則が使われると HTML 4 では規定されています。 [[#comment]] ** 言語札の階層性 [10] 言語札は [SAMP(lang)[ja-JP]], [SAMP(lang)[en-US]] のような階層構造を持っています。 HTML 4 は、言語情報による処理に際して、まず全体の一致を試み、 次に最初の部分の一致によるべきだとしています。 参照。 こうすれば、たとえ [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 の継承に関する規定もありました。 [36] '''XHTML m12n における事実上の廃止''' [[XHTML m12n]] では[[抽象モジュール]]定義に [CODE(HTMLa)@en[[[lang]]]] [[属性]]は含まれず、[[遺物再定義]] [[DTDモジュール]]の定義にひっそり含まれています。 [[XHTML m12n]] を基に構築されている [[XHTML 1.1]] や [[XHTML Basic]] にはそもそも[[遺物]]モジュールが取込まれていませんから、 [CODE(HTMLa)@en[[[lang]]]] [[属性]]は存在しません。 仕様書: - [[XHTML m12n]] -- [[遺物再定義]] [[DTDモジュール]] [49] [CITE@en[XHTML+RDFa and @lang]] ([[Shane McCarron]] 著, [TIME[2009-01-30 02:21:49 +09:00]] 版) > The XHTML 2 Working Group has been asked to re-introduce the lang attribute into XHTML family languages. Basically this is so that assistive technologies will correctly identify the language of content. > It will also address some issues that arise when content is served up as text/html instead of application/xhtml+xml. ** 例 [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]] ** 関連 [39] '''文字コードとの関係''' [CODE(HTMLa)@en[[[lang]]]] [[属性]]は、 [[文字コード]] ([[符号化文字集合]]や[[符号化方式]]) とは[[直交]]するものです。[[文字コード]]の選択によって [CODE(HTMLa)@en[[[lang]]]] [[属性]]の要/不要や値が影響を受けることは''ありません''。 [40] '''文字種との関係''' [CODE(HTMLa)@en[[[lang]]]] [[属性]]による[[言語]]の指定は、 その[[要素]]の[[内容]]として使われる[[文字]]の種類 ([[用字系]]や[[正書法]]等) とは直接は関係''ありません''。 [[言語]]と[[文字]]の種類の間には元々強い関係が存在するので、 [CODE(HTMLa)@en[[[lang]]]] [[属性]]と[[内容]]の[[文字]]にも強い関係が認められますが、 それ以上の制約は存在しません。例えば、 [CODE(HTMLa)@en[[[lang]]]] が [CODE(lang)@en[[[ja]]]] で、[[内容]]が[[アラビア文字]]であったとしても、 (それが[[日本語]]を表記したものなら) 何ら問題ありません。 [41] '''レンダリングとの関係''' [CODE(HTMLa)@en[[[lang]]]] [[属性]]による[[言語]]の指定は、 その[[要素]]の[[内容]]を[[視覚的]]、[[音声]]、その他の方法によって適切に[[レンダリング]]するための情報の1つとして利用されます。 [[#comment]] ** メモ [37] [CODE(HTMLa)@en[[[lang]]]] [[属性]]が [[XML]] に取込まれて [CODE(XMLa)@en[[[xml]]:[[lang]]]] [[属性]]となった背景には、 [[XLink 1.0]] と同様に、 [[HTML]] に限らず汎用的に使えそうなものは [[XML]] 系[[マーク付け言語]]共用の語彙にしてしまおうという思惑が見え隠れしています。 それ自体は至極結構なことですが、それがために旧来の [[HTML]] と [[XHTML 1]] の致命的な断絶を招いてしまいました。言語属性の普及状況がいまいちなのも [[XHTML 1]] の普及状況がいまいちなのもこの問題が大きな原因の 1つだというのは言い過ぎでしょうか。 [42] [CITE@en-US[Internationalization Best Practices: Specifying Language in XHTML & HTML Content]] ([CODE[2007-02-16 05:52:24 +09:00]] 版) ([[名無しさん]]) [44] [CITE@en[lang attributes accross (X)HTML versions - W3C Q&A Weblog]] ([CODE[2007-08-31 19:12:14 +09:00]] 版) [47] [CITE@en[MAMA: Common attributes - Opera Developer Community]] ([TIME[2008-11-25 20:33:55 +09:00]] 版) * 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]]]] (決定できない) という言語札もあったりしますが、空文字列はもっと積極的に、どの言語にも属さない場合 (絵とか) に使う、のではないでしょうかねぇ。 ([[名無しさん]]) [35] [[XInclude 1.0]] では言語情報を[[取込み]]の前後で保存するために [CODE(InfoProp)[[[言語]]]][[特性]]を定義し、 [CODE(XMLa)@en[[[xml]]:[[lang]]]] 属性 (とそこに記された情報) の処理を規定しています。 ** 応用 [46] [[Atom 1.0]] や [[AtomPub]] で定義されたすべての[[要素]]は [CODE(XMLa)@en[[[xml]]:[[lang]]]] [[属性]]を持つことができます。どちらの仕様でも指定された[[言語]]はその[[要素]]と[[子孫]]に適用されると説明されていますが、 [[Atom 1.0]] では更に [[Language-Sensitive]] とされた[[要素]]や[[属性]]にのみ有意であると規定されています [SRC@en[[[Atom 1.0]] 2.]]。 ;; [CITE@en[RFC 4287 - The Atom Syndication Format]] ([TIME[2008-08-30 23:12:03 +09:00]] 版) ;; [CITE@en[RFC 5023 - The Atom Publishing Protocol]] ([TIME[2008-11-20 18:52:14 +09:00]] 版) [55] [CITE@en[Speech Synthesis Markup Language (SSML) Version 1.1]] ([TIME[2010-09-08 00:26:19 +09:00]] 版) * 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 困難だよねぇ。 [43] [CITE[d:id:quaa]] ([CODE[2007-08-06 19:32:28 +09:00]] 版) * メモ [1] [CODE(HTML)[lang]] 属性の値で [[CJK]] [[字形]]を区別するのは、間違ってはいませんが良い考えではありません。 (でも [[Unicode]] には他に方法はないです。) [2] >>1 [[異体字タグ]]? 萎えるな。それに [[XML]] でそれは使えるんだろうか? [45] [CITE[英語翻訳 - エキサイト 翻訳]] ([TIME[2008-02-11 12:33:33 +09:00]] 版) > [PRE(CSS illegal example code)[ .en_m { lang: EN; font-family: Verdana; } .en_s { lang: EN; font-family: Verdana; } ]PRE] [48] [CITE[Document Structure – SVG Tiny 1.2]] ([TIME[2008-12-20 02:31:29 +09:00]] 版) [50] [CITE[EMMA: Extensible MultiModal Annotation markup language]] ([TIME[2009-02-03 15:38:28 +09:00]] 版) 本文では [[BCP 47]] (日付は2006年、リンク先は最新版) を参照していますが、[[データ型]]としては [[XML Schema]] (日付は第2版、リンク先は最新版) の [CODE(XML)@en[[[xs:language]]]] になっています。 [51] [CITE[IRC logs: freenode / #whatwg / 20090508]] ([TIME[2009-08-07 07:55:55 +09:00]] 版) [52] [CITE[IRC logs: freenode / #whatwg / 20090602]] ([TIME[2009-08-23 20:57:07 +09:00]] 版) [53] [CITE@en[XHTML2 Working Group Teleconference -- 16 Sep 2009]] ([TIME[2009-09-16 23:43:23 +09:00]] 版) [54] [CITE[IRC logs: freenode / #whatwg / 20100205]] ([TIME[2010-02-06 17:25:36 +09:00]] 版) [56] [CITE@en[Speech Synthesis Markup Language (SSML) Version 1.1]] ( ([TIME[2010-09-08 00:26:19 +09:00]] 版)) [57] [CITE@en[RFC 3920 - Extensible Messaging and Presence Protocol (XMPP): Core]] ([TIME[2011-03-31 08:02:17 +09:00]] 版) [CODE(XML)@en[[[NMTOKEN]]]] でなければ[['''なりません''']]。 [[RFC 3066]] [[言語タグ]]でなければ[['''なりません''']]。 [58] [CITE[Document Structure – SVG 1.1 (Second Edition)]] ( ([TIME[2011-08-10 12:35:27 +09:00]] 版)) [REFS[ - [72] [CITE@en[RFC 5196 - Session Initiation Protocol (SIP) User Agent Capability Extension to Presence Information Data Format (PIDF)]] ([TIME[2011-11-20 19:42:05 +09:00]] 版) - [74] [CITE@en[RFC 4482 - CIPID: Contact Information for the Presence Information Data Format]] ([TIME[2011-11-20 21:10:10 +09:00]] 版) ]REFS] [73] >>72 では省略時の既定値が [CODE(lang)@en[[[i-default]]]] です。 [75] [CITE[Web Application Description Language]] ( ([TIME[2009-09-10 03:59:24 +09:00]] 版)) [76] [CITE@en[Web Applications 1.0 r7421 Encourage lang=[SPAN[']][SPAN[']] on root element.]] ( ([TIME[2012-09-29 03:44:00 +09:00]] 版)) [77] [CITE@en[Re: xml:lang in the light of error frequencies]] ( ([[Ian Hickson]] 著, [TIME[2008-08-12 19:12:39 +09:00]] 版))