Do French public websites declare the language of their pages?
French accessibility rules require a public page to declare its language and carry a title. We measured five basic HTML declarations on the home page of 600 randomly drawn French public domains. Here are the numbers, and above all what they do not say.
600
domains sampled
31,904
domains in the population
466
answer over HTTPS
134
do not answer
What the 466 responding domains return
| Declaration | Domains | Share |
|---|---|---|
| Character encoding declared (meta tag or HTTP header) | 457 | 98.1 % |
| HTML doctype | 451 | 96.8 % |
| Non empty title tag | 445 | 95.5 % |
| lang attribute on the html tag | 433 | 92.9 % |
| viewport meta tag | 412 | 88.4 % |
What these numbers do not say
Declaring a language is not declaring the right one
This is the most important caveat, and the survey provides the evidence itself. Here are the values actually found in the lang attribute.
| Value found | Domains | Status |
|---|---|---|
| fr-FR | 224 | Valid |
| fr | 167 | Valid |
| fr-fr | 23 | Valid |
| en | 12 | English on a French site |
| fr_FR | 2 | Invalid tag (BCP 47) |
| FR | 1 | Valid |
Twelve French public websites announce their home page as English. Two more declare fr_FR with an underscore, which is not a valid language tag under BCP 47. Those fourteen pages count inside the 92.9% and would fail an audit. The 92.9% figure is therefore a ceiling, not a compliance rate.
The 134 non responses are not 134 broken sites
A domain registered but never put in service, a domain served over plain HTTP only, an expired certificate and a momentarily slow server all produce the same line. The only defensible statement is that 134 of the 600 domains on this list were not serving an HTTPS home page at the time of the survey. They are excluded from the shares and counted separately.
- Missing DNS, refused connection or rejected certificate106
- 4xx or 5xx code returned by the server21
- No answer within 12 seconds4
- Connection closed by the server3
A home page is not a website
The survey covers a single page per domain. Accessibility compliance is judged on a sample of pages by a human auditor, never by a robot: a missing declaration is not proven non compliance, and this survey issues no accessibility verdict.
The method, so the figure can be challenged
The population comes from the urls.txt file published by Etalab, pinned to a precise version. Each host name is lowercased, its www prefix removed, then deduplicated: removing the prefix before deduplication is what turns 35,742 URLs into 31,904 domains, since a town listed under two forms would otherwise count twice. The sample is drawn with a fixed seed over the sorted population, sorting being required for the seed to reproduce the same draw. One request per domain, never a retry.
Etalab urls.txt · blob 2baca606a77d66b5800ac3591c45eefab2708e03 · 35,742 URLs -> 31,904 · seed 20260828
The tool and the data are public
The script is a single Python file with no dependency, under the MIT licence. The repository holds the full survey, line by line, and the detailed method needed to replay it identically.
Why we ran this survey
We test online services and we publish our protocols. One thing struck us: everyone cites the compliance of public websites, almost nobody measures anything verifiable. Declared language and page title are two points a machine can record without human judgement, in one request. We did it, and we publish the result with its limits rather than the figure alone.