v148 · web app · shipped
Manifest Localization
Web app manifests can now carry built-in translations for name, short name, description, and icons using _localized-suffixed fields. The browser picks the closest match to the user's language — no server-side manifest switching or separate manifest files needed.
at a glance
| Shipped in | Chrome 148, Microsoft Edge 148 |
|---|---|
| Status | Enabled by default |
| Flag | None |
| Standards position | W3C Web Application Manifest + Localizable Manifests |
| Spec | Developing Localizable Manifests — W3C Working Draft |
| Explainer | Localization support for web app manifests — Chrome for Developers |
| ChromeStatus | 5090807862394880 — Manifest Localization |
why it exists
Before Chrome 148, a PWA that needed localized names had to either serve a different manifest from a different URL per locale, or use server-side content negotiation to rewrite the manifest dynamically. Neither approach integrates cleanly with install-time metadata or icon selection. Manifest Localization bakes translations directly into the manifest file using a standardised _localized suffix convention, matching the existing pattern used by the web app manifest specification's internationalization work in W3C.
the manifest fields
Any localizable manifest member gains a companion field whose name is the original field name with _localized appended. Each companion field is an object whose keys are BCP 47 language tags and whose values are localization entries.
| Original field | Localized companion | Value type |
|---|---|---|
name | name_localized | object mapping lang tag → localization entry |
short_name | short_name_localized | same |
description | description_localized | same |
icons | icons_localized | object mapping lang tag → array of icon objects |
Localization entry
| Key | Required | Description |
|---|---|---|
value | Yes | The translated string (or array of icon objects for icons_localized). |
dir | No | Text direction override: "ltr", "rtl", or "auto". Defaults to the manifest's top-level dir. |
lang | No | Language override for the value. Defaults to the map key. |
example
Localizing name and short_name
{
"name": "Weather Now",
"name_localized": {
"fr": { "value": "Météo en direct" },
"de": { "value": "Aktuelles Wetter" },
"ja": { "value": "天気ナウ" },
"ar": { "value": "الطقس الآن", "dir": "rtl" }
},
"short_name": "Weather",
"short_name_localized": {
"fr": { "value": "Météo" },
"de": { "value": "Wetter" },
"ja": { "value": "天気" },
"ar": { "value": "الطقس", "dir": "rtl" }
},
"description": "Real-time weather for your location.",
"description_localized": {
"fr": { "value": "Météo en temps réel pour votre emplacement." },
"de": { "value": "Echtzeit-Wetter für Ihren Standort." }
},
"start_url": "/",
"display": "standalone",
"icons": [
{ "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png" }
]
}
Language selection
The browser matches the user's preferred language (from the OS or browser settings) against the keys in the localized maps using BCP 47 lookup (subtag fallback). A French-Canadian user (fr-CA) sees the fr value if no fr-CA key is present. If no matching key is found, the base (non-suffixed) field value is used.
Locale-specific icons
{
"icons": [
{ "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png" }
],
"icons_localized": {
"ja": [
{ "src": "/icons/icon-512-ja.png", "sizes": "512x512", "type": "image/png" }
]
}
}
Source: Chrome for Developers — Manifest Localization blog, May 2026.
browser support
| Browser | Support |
|---|---|
| Chrome 148+ (desktop + Android) | Enabled by default |
| Microsoft Edge 148+ | Enabled by default |
| Firefox | No position |
| Safari | No position |