[1] 各種の[[プラットフォーム]]や[[応用]]は[DFN[利用者の言語]]の概念を持っています。

* 概要

[2] 
[[自然言語]]は[[ロケール]]の根幹となる構成要素です。
現代の多くの[[プラットフォーム]]は[[プロセス]]ごとに[[ロケール]]を決められます。

[3] 
通常は[[ロケール]]の[[言語]]は1つだけですが、 
[[Webブラウザー]]のように複数の[[言語]]を[[利用者]]の[[好み]]として指定できるようになっている[[応用]]もあります。

* Web における利用者の言語


[16] 
一般的には[[利用者の言語]]は[[ロケール]]の[[言語]]であり、
[[利用者インターフェイス]]の[[翻訳テキスト]]の選択に使う[[言語]]であり、
[[数値]]や[[日時]]の表示や入力に使う[[言語]]であるべきです。

[17] 
複数の[[言語]]が通用する地域の[[利用者]]や、
外国の[[言語]]を解する[[利用者]]などは、
[[利用者インターフェイス]]の[[言語]]と違う[[言語]]も良しとすることがあります。
多くの [[Webブラウザー]]は複数の[[言語]]を選ぶ機能を持っています。

-*-*-

[5] [[Webプラットフォーム]]は[[利用者の言語]]にアクセスする機能をいくつか提供しています。

[FIG(list middle)[ [6] [[Web]] における[[利用者の言語]]の取得

- [CODE[navigator.language]]
- [CODE[navigator.languages]]
- [CODE[Accept-Language:]]
- [CODE[languagechange]]
- [CODE[onlanguagechange]]

[HISTORY[

- [CODE[navigator.systemLanguage]]
- [CODE[navigator.userLanguage]]
- [CODE[system-language]]

]HISTORY]

]FIG]


[REFS[

- [35] [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-5.3.5>
- [4] [CITE@en-US-x-hixie[HTML Standard]], [TIME[2025-11-13T08:49:39.000Z]], [TIME[2025-11-16T07:16:39.964Z]] <https://html.spec.whatwg.org/#language-preferences>
-- [418] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-02 23:06:24 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#a-plausible-language>

]REFS]

-*-*-


[10] いくつかの処理は[[利用者の言語]]に依存する挙動を持ちます。

[FIG(list middle)[ [11] [[Web]] における[[利用者の言語]]の参照

- [CODE[toLocaleString]]
- [[文字コードの判定]]
- [CODE[details]] [SRC[>>14]]
- [CODE[<input type=file>]] [SRC[>>12]]
- [CODE[input]] [[ボタン]] [SRC[>>13, >>15]]
- [[利用者インターフェイス]]全般の文言
- [[日時入力]]
- [[数値入力]]
- [[色の選択]]
- [[綴り検査]]
- [[機械翻訳]]の翻訳先

[HISTORY[

- [CODE[isindex]]
- [CODE[time]]

]HISTORY]

]FIG]


[18] こうした挙動が(広義の)[[ロケール]]を構成する諸[[言語]]のうちどれを使うべきか、
諸仕様は必ずしも整理されておらず曖昧なところがありますが、
表示する文言の決定は[[利用者インターフェイス]]の[[言語]]によるべきであり、
[[API]] が返すのは[[利用者の言語]]の設定によるべきであり、
判定や表示の[[アルゴリズム]]で参照するのは[[利用者の言語]]の設定によるべきでしょう。

;; [19] なお、
仕様書で[[ロケール]]依存とされているものの一部を含め、
[[Webアプリケーション]]の[[利用者インターフェイス]]の部分を構成することになる機能の一部については、
[[翻訳テキスト]]の選択は[[利用者の言語]]ではなく[[節点の言語]]によるべきという考え方もあります。


[REFS[

- [14] 
[CITE@en-US-x-hixie[HTML Standard]], [TIME[2025-11-13T08:49:39.000Z]], [TIME[2025-11-16T07:39:39.027Z]] <https://html.spec.whatwg.org/#the-details-and-summary-elements>
- [12] [CITE@en-US-x-hixie[HTML Standard]], [TIME[2025-11-13T08:49:39.000Z]], [TIME[2025-11-16T07:38:10.423Z]] <https://html.spec.whatwg.org/#the-input-element-as-a-file-upload-control>
- [13] [CITE@en-US-x-hixie[HTML Standard]], [TIME[2025-11-13T08:49:39.000Z]], [TIME[2025-11-16T07:38:43.940Z]] <https://html.spec.whatwg.org/#the-input-element-as-a-button>
- [15] 
[CITE@en-US-x-hixie[HTML Standard]], [TIME[2025-11-13T08:49:39.000Z]], [TIME[2025-11-16T07:40:18.365Z]] <https://html.spec.whatwg.org/#using-the-input-element-to-define-a-command>


]REFS]

** 値の決定


[8] 
[[利用者]]の[[プライバシー]]の保護のため、[[Webブラウザー]]は[[利用者]]情報を秘匿することが認められています。
その場合は代替となる値を使うことになっています。
[SRC[>>418]]

[9] 
このため [CITE[HTML Standard]] は
[CODE[navigator.language]] の値を
either a plausible language or the user's most preferred language 
とし、
[CODE[navigator.languages]]
の値を
either one or more plausible languages, or the user's preferred languages
とし、
[CODE[Accept-Language:]]
の値をそれらと同じリストを使うべきとしています。
[SRC[>>418]]

** 複数の値の解釈

[56] [[言語の折衝]], [CODE[Accept-Language:]],
[CODE[navigator.languages]] も参照.




** 利用者インターフェイス



[412] [[利用者エージェント]]は何らかの形で[[利用者]]の望む言語を[[利用者]]が指定できるようにする必要があります。
[[利用者]]にそのような方法を提供しない[[利用者エージェント]]は、
[CODE(HTTP)@en[[[Accept-Language:]]]] [[ヘッダー]]を送信しては[['''なりません''']]。 [SRC[>>35]]

[50] 一般的な [[Webブラウザー]]は、設定画面に[[自然言語]]の指定機能が用意されているのが普通です。
選択肢からいくつかの[[言語]]を選んだり、それ以外の[[言語タグ]]を追加したりできるのが普通です。

[51] [[既定]]では、[[プラットフォーム]]の言語設定が [[Webブラウザー]]にも反映されるようになっているのが一般的です。
[[プラットフォーム]]の言語設定を変化させた時に自動的に [[Webブラウザー]]にも反映されるのかどうかは不明です。
自動的に反映されるべきかもしれませんし、[[利用者]]の個別設定があればそれが優先されるべきかもしれません。

[413] [[利用者]]は普通[[言語範囲]]の一致の仕組みに詳しくないですから、
[[利用者エージェント]]は何らかの配慮をする[RUBYB[べき]@en[ought to]]です。
例えば[[利用者]]が [CODE(lang)@en[[[eb-GB]]]] を選択した時に、
[CODE(lang)@en[[[en]]]] も追加することを提案するとよさそうです。 [SRC[>>35]]

[52] 一般的な実装では、[[利用者]]が非論理的な指定をできてしまい、
特に何の警告も発されないことがあります。例えば、
[CODE[en-GB, ja, en]] のような指定は、
[[利用者]]が[[英語]]と[[日本語]]のどちらを求めているのか、
真意が定かではありません。[[サーバー]]は決めかねて、
[[利用者]]の意図に沿わない動作をするかもしれません。
[[利用者]]が試行錯誤している場合など、深い意図もなくそのような指定をしてしまうこともありますから、
[[利用者エージェント]]が問題のありそうな指定を検出して[[利用者]]に警告できれば良いのですが、
どのような指定方法だと問題となるかもあまり明確ではありませんし、
[[利用者]]がそう頻繁に使いそうな設定項目でもありませんから、
実装を複雑化させるコストに見合わないかもしれません。むしろ設定画面の奥の方に押し込んで、
不注意な[[利用者]]がうっかり触ることが内容にした方が良いのかもしれません。


** プライバシー

[7] 
[[利用者の言語]]の情報は [[fingerprinting vector]] です。
かなり繊細な[[利用者]]の[[プライバシー]]に関わる情報であり、
慎重な取り扱いが求められます。
[SEE[ [[Webのプライバシー]] ]]



[410] [CODE(HTTP)@en[[[Accept-Language:]]]] [[ヘッダー]]は[[利用者]]の[[プライバシー]]に関わる情報を漏らすものですから、
注意が必要です。

[411] とはいえどの [[Webブラウザー]]もこの[[ヘッダー]]をすべての[[要求]]につけて送信するようです。

[416] 実際には[[言語]]の情報だけでは個人を特定することはできないでしょうが、
話者が少数の[[言語]]の場合や、[[言語]]の組み合わせ、あるいは[[言語]]とそれ以外の情報の組み合わせによって、
個人を特定したり、複数の[[要求]]や複数のサイトにわたった行動の追跡に用いたりすることができるかもしれません。
また、話者が多数の[[言語]]であっても、あまりその[[言語]]の話者がいない
[[Webサイト]]を閲覧すると、同様に特定したり追跡したりできるかもしれません。

;; [420] [[fingerprinting vector]] の項も参照してください。

[421] [[匿名化サービス]]を使っている場合、[[言語]]としては [CODE(lang)@en[[[en-US]]]]
を用いることが提案されています [SRC[>>418]]。


[419] [[利用者エージェント]]は、
[CODE[Accept-Language:]]
と
[CODE[navigator.languages]]
で同じ[[言語]]リストを用いる[['''べきです''']] [SRC[>>418]]。



* メモ