Participate in origin trial for Accept-Language Reduction
Accept-Language Reduction is an effort to reduce passive fingerprinting surfaces by reducing the user's language preferences in the Accept-Language
header and only sending the user's most preferred language (just one).
Beginning with the Chrome 109 Beta, we'll open up the origin trial for Accept-Language Reduction enabling sites to opt into receiving the reduced Accept-Language
header. This will allow sites to discover and fix problems before the reduced Accept-Language
becomes the default behavior in Chrome in a future release. To test the feature before it launches to stable population, be sure to opt in and test before the release date for Chrome 109 (currently scheduled for Jan 10th, 2023).
Check out the examples of Accept-Language
header before and after the reduction below.
Current
Accept-Language: en-GB,en;q=0.9,de;q=0.8,fr;q=0.7
Proposed
Accept-Language: en-GB
Below is an overview of the origin trial and what to expect. You can share your feedback on this change or any issues you encounter during the origin trial in the Accept-Language Reduction GitHub repository.
What is Accept-Language?
The Accept-Language string is shared on every HTTP request and exposed in JavaScript to all resources loaded by the browser. Currently, it contains all of the user's preferred languages.
Why is Accept-Language being reduced?
Accept-Language Reduction is an effort to reduce passive fingerprinting surfaces in Chrome.
Currently, the Accept-Language
header is shared by default on every HTTP request and exposed in JavaScript to all resources loaded by the browser. It contains all language preferences of the user. Rather than the browser sending the full list of languages that the user has configured in case sites wish to provide multilingual content, we are introducing a new way for sites to indicate multilingual content and the browser will take responsibility to do the language negotiation and display the preferred language.
Another reason is that many sites may not be using the Accept-Language
headers for language negotiation at all (for example, one study indicates only 7.2% of the top 10,000 sites use Accept-Language
). Chrome Incognito mode already reduced the Accept-Language
to one.
What does this mean for web developers?
Sites that rely on Accept-Language
to do language negotiation should prepare to receive reduced Accept-Language
and consider participating in the origin trial. The reduced Accept-Language
values will appear in:
- The
Accept-Language
HTTP request header. - The
navigator.languages
JavaScript getter.
The browser will take responsibility for language negotiation to select the user's preferred language to send to sites. To make this happen, sites need to add two headers Variants
(a new header indicates sites supporting languages) Accept-Language
and Content-Language
in the response header (see detailed example below).
The reduced Accept-Language
plans currently don't include iOS and WebView, and those platforms will continue to get users' full list of Accept-Language
. Support for these platforms is planned for a later date.
Origin trial for Accept-Language Reduction
An origin trial requires the participating site to provide a token in its response which tells the browser to enable the specified trial. However, this means that on the browser's initial request to the site it has no way of knowing if the site is participating in an origin trial. This means that the initial request in a session will not send the reduced Accept-Language header
. Requests for subresources in that page, both same-origin and cross-origin, will receive the reduced Accept-Language
header. Subsequent same-origin navigations will also receive the reduced Accept-Language
header. Cross-origin navigations will revert to sending the full header, while the cross-origin requests within the page (such as third-party iframe requests) will still send the reduced Accept-Language
header if the top-level frame request has a valid origin trial token.
This is similar to the User-Agent reduction origin trial and if you would like to learn more about the internal Chromium implementation, you can read more in Implementing Reduce Accept-Language HTTP header.
Participate in the Accept-Language Reduction origin trial
You can read further guidance in Getting started with Chrome's origin trials, but the essential steps are shown below.
Step 1
To register for the origin trial and get a token for your domains, visit the Trial for Accept-Language Reduction page.
Step 2
Update your HTTP response headers:
- Add
Origin-Trial: <ORIGIN TRIAL TOKEN>
to your HTTP response header, where <ORIGIN TRIAL TOKEN
> contains the token you got when registering for the origin trial. - Add
Content-Language
to your HTTP response header to indicate the language(s) intended for the audience. - Add
Variants
to your HTTP response header to indicate sites supported languages. - [Optional] Add
Vary: Accept-Language
to your HTTP response to create a cache key for content negotiation. - Setting those headers will only trigger browser language negotiation (a potential restart for the initial request) for the given origin. To make sites display the correct language representation for the users, you also need to update sites sending the content based on the user's Accept-Language header (see example below).
If the response headers contain a valid Origin-Trial
token, Content-Language
and valid Variants
header, then all subresource requests (for example, for images or stylesheets) and subnavigations (for example, iframes) will send the reduced Accept-Language string, even if the origins of those requests are not enrolled in the origin trial.
Step 3
Load your website in Chrome M109 Beta (or later) and start receiving the reduced Accept-Language string.
Submit any issues or feedback to the Accept-Language Reduction GitHub repository.
Demo
For a demonstration of a multilingual site which opted-in the origin trial (along with the source code) see https://reduce-accept-language.glitch.me/.
For a demonstration of opt-in and opt-out the origin trial (along with the source code) see https://reduce-accept-language-ot.glitch.me/.
For example, example.com
supports ja
(Japanese) and en
(English). A request may be:
GET / HTTP/1.1
Host: example.com
Accept-Language: en
The site knows the user prefers content in English based on the user's accept-language. The response headers may include:
HTTP/1.1 200 OK
Content-Language: en
Variants: Accept-Language=(en ja)
Origin-Token: a-valid-token
If user has a preference for Japanese language content, the request would be:
GET / HTTP/1.1
Host: example.com
Accept-Language: ja
In this case, the site responds with headers for Japanese content:
HTTP/1.1 200 OK
Content-Language: ja
Variants: Accept-Language=(en ja)
Origin-Token: a-valid-token
On the server-side, the site may be looking for specific language support but falling back to a default if no support is detected:
if(accept_language == 'ja') {
res.response('ja_page')
}
else {
res.response('en_page')
}
In the example above, example.com
responds either en
or ja
based on the Accept-Language
value, defaulting to en
if none match. In this case, the site can also provide redirects to corresponding language pages either /en
or /ja
based on the Accept-Language
value. See detailed examples related to redirects on the implementation doc.
Third-party origin trial support
We currently don't support registering your domains as a third-party for the trial. If you operate a service that is implemented as a subresource across origins (like ad serving or analytics), you will only receive the reduced Accept-Language
header if the top-level site is participating in the origin trial.
Validate that the origin trial is working
The guide to troubleshooting Chrome's origin trials provides a full checklist for ensuring your token is correctly configured.
You configure multiple languages and their priority from chrome://settings/languages
or Settings → Languages. Consider selecting a language your site does not support and moving that to the top of the list to ensure that the additional renegotiation is triggered.
The initial response's headers containing the origin trial token should look like:
Subsequent request headers containing the reduced Accept-Language look like:
Stop participating in the origin trial
At any given point in time during the trial, you can stop participating and receive the full list of user's Accept-Language. To stop participating:
- Remove the
Origin-Trial
header for the Accept-Language Reduction trial from your HTTP response. - [Optional] Remove
Variants
header which is added to opt-in the origin trial in your HTTP response if you are not interested in sending this header. You can also useVariants
with an empty value to accomplish this. - [Optional] Remove
Content-Language
header which is added to opt-in the origin trial in your HTTP response if you are not interested in sending this header.
Origin trial duration
The Accept-Language Reduction origin trial will run for at least six months, which corresponds to about six Chrome milestones. The origin trial will appear in M109 and end with M114 (it means the last Chrome release that has the trial available). At that point, Chrome will evaluate the feedback from the origin trial before proceeding with sending the reduced Accept-Language string in a phased manner: first reduce the Accept-Language HTTP header and then reduce the JS interface. If a site needs more time to test they can opt into a subsequent deprecation origin trial, which would allow them to access the full Accept-Language string for at least another six months. We will publish more details on the deprecation trial when it's ready.
Share feedback
Submit any issues or feedback to the Accept-Language Reduction GitHub repository.