From 9697b186ece7afa057880ce79feb752e11dd6eaf Mon Sep 17 00:00:00 2001 From: leekelleher Date: Mon, 24 Nov 2025 11:47:50 +0000 Subject: [PATCH 1/4] Adds localization manifests for region-specific cultures This is to support backwards-compatibility and v13 upgradability. --- .../src/assets/lang/en.ts | 27 +- .../packages/core/localization/manifests.ts | 278 +++++++++++------- 2 files changed, 191 insertions(+), 114 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts index 05fa44a2d0b2..7d7d2abd47e9 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts @@ -2877,29 +2877,52 @@ export default { ar: 'العربية', bs: 'Bosanski', cs: 'Česky', + 'cs-cz': 'Česky (Czechia)', cy: 'Cymraeg', + 'cy-gb': 'Cymraeg (UK)', da: 'Dansk', + 'da-dk': 'Dansk (Danmark)', de: 'Deutsch', + 'de-de': 'Deutsch (Deutschland)', + 'de-ch': 'Deutsch (Schweiz)', en: 'English (UK)', 'en-us': 'English (US)', es: 'Español', + 'es-es': 'Español (España)', fr: 'Français', - he: 'Hebrew', + 'fr-fr': 'Français (France)', + 'fr-ch': 'Français (Suisse)', + he: 'עברית', + 'he-il': 'עברית (ישראל)', hr: 'Hrvatski', + 'hr-hr': 'Hrvatski (Hrvatska)', it: 'Italiano', + 'it-it': 'Italiano (Italia)', + 'it-ch': 'Italiano (Svizerra)', ja: '日本語', + 'ja-jp': '日本語 (日本)', ko: '한국어', + 'ko-kr': '한국어 (한국)', nb: 'Norsk Bokmål', + 'nb-no': 'Norsk (Bokmål)', nl: 'Nederlands', + 'nl-nl': 'Nederlands (Nederland)', pl: 'Polski', + 'pl-pl': 'Polski (Polska)', pt: 'Português', 'pt-br': 'Português (Brasil)', - ro: 'Romana', + ro: 'Română', + 'ro-ro': 'Română (România)', ru: 'Русский', + 'ru-ru': 'Русский (Россия)', sv: 'Svenska', + 'sv-se': 'Svenska (Sverige)', tr: 'Türkçe', + 'tr-tr': 'Türkçe (Türkiye Cumhuriyeti)', uk: 'Українська', + 'uk-ua': 'Українська (Україна)', zh: '中文', + 'zh-cn': '中文(简体,中国)', 'zh-tw': '中文(正體,台灣)', vi: 'Tiếng Việt', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts index 17760f4434da..f429831c7cf2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/localization/manifests.ts @@ -4,281 +4,335 @@ export const manifests: Array = [ { type: 'localization', alias: 'Umb.Localization.AR', - weight: 100, name: 'Arabic Backoffice UI Localization', - meta: { - culture: 'ar', - }, + meta: { culture: 'ar' }, js: () => import('../../../assets/lang/ar.js'), }, { type: 'localization', alias: 'Umb.Localization.BS', - weight: 100, name: 'Bosnian Backoffice UI Localization', - meta: { - culture: 'bs', - }, + meta: { culture: 'bs' }, js: () => import('../../../assets/lang/bs.js'), }, { type: 'localization', alias: 'Umb.Localization.CS', - weight: 100, name: 'Czech Backoffice UI Localization', - meta: { - culture: 'cs', - }, + meta: { culture: 'cs' }, js: () => import('../../../assets/lang/cs.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.CS_CZ', + name: 'Czech (Czechia) Backoffice UI Localization', + meta: { culture: 'cs-CZ' }, + }, { type: 'localization', alias: 'Umb.Localization.CY', - weight: 100, name: 'Welsh Backoffice UI Localization', - meta: { - culture: 'cy', - }, + meta: { culture: 'cy' }, js: () => import('../../../assets/lang/cy.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.CY_GB', + name: 'Welsh (UK) Backoffice UI Localization', + meta: { culture: 'cy-GB' }, + }, { type: 'localization', alias: 'Umb.Localization.DA', - weight: 100, name: 'Danish Backoffice UI Localization', - meta: { - culture: 'da', - }, + meta: { culture: 'da' }, js: () => import('../../../assets/lang/da.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.DA-DK', + name: 'Danish (Denmark) Backoffice UI Localization', + meta: { culture: 'da-DK' }, + }, { type: 'localization', alias: 'Umb.Localization.DE', - weight: 100, name: 'German Backoffice UI Localization', - meta: { - culture: 'de', - }, + meta: { culture: 'de' }, js: () => import('../../../assets/lang/de.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.DE_DE', + name: 'German (Germany) Backoffice UI Localization', + meta: { culture: 'de-DE' }, + }, + { + type: 'localization', + alias: 'Umb.Localization.DE_CH', + name: 'German (Switzerland) Backoffice UI Localization', + meta: { culture: 'de-CH' }, + }, { type: 'localization', alias: 'Umb.Localization.EN', - weight: 100, name: 'English (United Kingdom) Backoffice UI Localization', - meta: { - culture: 'en', - }, + meta: { culture: 'en' }, js: () => import('../../../assets/lang/en.js'), }, { type: 'localization', alias: 'Umb.Localization.EN_US', - weight: 100, name: 'English (United States) Backoffice UI Localization', - meta: { - culture: 'en-US', - }, + meta: { culture: 'en-US' }, js: () => import('../../../assets/lang/en-us.js'), }, { type: 'localization', alias: 'Umb.Localization.ES', - weight: 100, name: 'Spanish Backoffice UI Localization', - meta: { - culture: 'es', - }, + meta: { culture: 'es' }, js: () => import('../../../assets/lang/es.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.ES_ES', + name: 'Spanish (Spain) Backoffice UI Localization', + meta: { culture: 'es-ES' }, + }, { type: 'localization', alias: 'Umb.Localization.FR', - weight: 100, name: 'French Backoffice UI Localization', - meta: { - culture: 'fr', - }, + meta: { culture: 'fr' }, js: () => import('../../../assets/lang/fr.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.FR_FR', + name: 'French (France) Backoffice UI Localization', + meta: { culture: 'fr-FR' }, + }, + { + type: 'localization', + alias: 'Umb.Localization.FR_CH', + name: 'French (Switzerland) Backoffice UI Localization', + meta: { culture: 'fr-CH' }, + }, { type: 'localization', alias: 'Umb.Localization.HE', - weight: 100, name: 'Hebrew Backoffice UI Localization', - meta: { - culture: 'he', - }, + meta: { culture: 'he' }, js: () => import('../../../assets/lang/he.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.HE_IL', + name: 'Hebrew (Israel) Backoffice UI Localization', + meta: { culture: 'he-IL' }, + }, { type: 'localization', alias: 'Umb.Localization.HR', - weight: 100, name: 'Croatian Backoffice UI Localization', - meta: { - culture: 'hr', - }, + meta: { culture: 'hr' }, js: () => import('../../../assets/lang/hr.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.HR_HR', + name: 'Croatian (Croatia) Backoffice UI Localization', + meta: { culture: 'hr-HR' }, + }, { type: 'localization', alias: 'Umb.Localization.IT', - weight: 100, name: 'Italian Backoffice UI Localization', - meta: { - culture: 'it', - }, + meta: { culture: 'it' }, js: () => import('../../../assets/lang/it.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.IT_IT', + name: 'Italian (Italy) Backoffice UI Localization', + meta: { culture: 'it-IT' }, + }, + { + type: 'localization', + alias: 'Umb.Localization.IT_CH', + name: 'Italian (Switzerland) Backoffice UI Localization', + meta: { culture: 'it-CH' }, + }, { type: 'localization', alias: 'Umb.Localization.JA', - weight: 100, name: 'Japanese Backoffice UI Localization', - meta: { - culture: 'ja', - }, + meta: { culture: 'ja' }, js: () => import('../../../assets/lang/ja.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.JA_JP', + name: 'Japanese (Japan) Backoffice UI Localization', + meta: { culture: 'ja-JP' }, + }, { type: 'localization', alias: 'Umb.Localization.KO', - weight: 100, name: 'Korean Backoffice UI Localization', - meta: { - culture: 'ko', - }, + meta: { culture: 'ko' }, js: () => import('../../../assets/lang/ko.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.KO_KR', + name: 'Korean (Korea) Backoffice UI Localization', + meta: { culture: 'ko-KR' }, + }, { type: 'localization', alias: 'Umb.Localization.NB', - weight: 100, name: 'Norwegian Backoffice UI Localization', - meta: { - culture: 'nb', - }, + meta: { culture: 'nb' }, js: () => import('../../../assets/lang/nb.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.NB_NO', + name: 'Norwegian (Norway) Backoffice UI Localization', + meta: { culture: 'nb-NO' }, + }, { type: 'localization', alias: 'Umb.Localization.NL', - weight: 100, name: 'Dutch Backoffice UI Localization', - meta: { - culture: 'nl', - }, + meta: { culture: 'nl' }, js: () => import('../../../assets/lang/nl.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.NL_NL', + name: 'Dutch (Netherlands) Backoffice UI Localization', + meta: { culture: 'nl-NL' }, + }, { type: 'localization', alias: 'Umb.Localization.PL', - weight: 100, name: 'Polish Backoffice UI Localization', - meta: { - culture: 'pl', - }, + meta: { culture: 'pl' }, js: () => import('../../../assets/lang/pl.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.PL_PL', + name: 'Polish (Poland) Backoffice UI Localization', + meta: { culture: 'pl-PL' }, + }, { type: 'localization', alias: 'Umb.Localization.PT', - weight: 100, name: 'Portuguese Backoffice UI Localization', - meta: { - culture: 'pt', - }, + meta: { culture: 'pt' }, js: () => import('../../../assets/lang/pt.js'), }, { type: 'localization', alias: 'Umb.Localization.PT_BR', - weight: 100, name: 'Portuguese (Brazil) Backoffice UI Localization', - meta: { - culture: 'pt-BR', - }, + meta: { culture: 'pt-BR' }, js: () => import('../../../assets/lang/pt-br.js'), }, { type: 'localization', alias: 'Umb.Localization.RO', - weight: 100, name: 'Romanian Backoffice UI Localization', - meta: { - culture: 'ro', - }, + meta: { culture: 'ro' }, js: () => import('../../../assets/lang/ro.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.RO_RO', + name: 'Romanian (Romania) Backoffice UI Localization', + meta: { culture: 'ro-RO' }, + }, { type: 'localization', alias: 'Umb.Localization.RU', - weight: 100, name: 'Russian Backoffice UI Localization', - meta: { - culture: 'ru', - }, + meta: { culture: 'ru' }, js: () => import('../../../assets/lang/ru.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.RU_RU', + name: 'Russian (Russia) Backoffice UI Localization', + meta: { culture: 'ru-RU' }, + }, { type: 'localization', alias: 'Umb.Localization.SV', - weight: 100, name: 'Swedish Backoffice UI Localization', - meta: { - culture: 'sv', - }, + meta: { culture: 'sv' }, js: () => import('../../../assets/lang/sv.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.SV_SE', + name: 'Swedish (Sweden) Backoffice UI Localization', + meta: { culture: 'sv-SE' }, + }, { type: 'localization', alias: 'Umb.Localization.TR', - weight: 100, name: 'Turkish Backoffice UI Localization', - meta: { - culture: 'tr', - }, + meta: { culture: 'tr' }, js: () => import('../../../assets/lang/tr.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.TR_TR', + name: 'Turkish (Türkiye) Backoffice UI Localization', + meta: { culture: 'tr-TR' }, + }, { type: 'localization', alias: 'Umb.Localization.UK', - weight: 100, name: 'Ukrainian Backoffice UI Localization', - meta: { - culture: 'uk', - }, + meta: { culture: 'uk' }, js: () => import('../../../assets/lang/uk.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.UK_UA', + name: 'Ukrainian (Ukraine) Backoffice UI Localization', + meta: { culture: 'uk-UA' }, + }, { type: 'localization', alias: 'Umb.Localization.ZH', - weight: 100, name: 'Chinese Backoffice UI Localization', - meta: { - culture: 'zh', - }, + meta: { culture: 'zh' }, js: () => import('../../../assets/lang/zh.js'), }, + { + type: 'localization', + alias: 'Umb.Localization.ZH_CN', + name: 'Chinese (Simplified, China) Backoffice UI Localization', + meta: { culture: 'zh-CN' }, + }, { type: 'localization', alias: 'Umb.Localization.ZH_TW', - weight: 100, name: 'Chinese (Taiwan) Backoffice UI Localization', - meta: { - culture: 'zh-TW', - }, + meta: { culture: 'zh-TW' }, js: () => import('../../../assets/lang/zh-tw.js'), }, { type: 'localization', alias: 'Umb.Localization.VI', - weight: 100, name: 'Vietnamese Backoffice UI Localization', - meta: { - culture: 'vi', - }, + meta: { culture: 'vi' }, js: () => import('../../../assets/lang/vi.js'), }, ]; From dad9ef3ada5f6b0d44806095b1d4fdea1bed27e0 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Mon, 24 Nov 2025 11:48:49 +0000 Subject: [PATCH 2/4] Removed `uiCulture` from Vietnamese localizations since it duplicated the English fallback texts. --- .../src/assets/lang/vi.ts | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/vi.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/vi.ts index 4eb741360a76..dddedeb197f7 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/vi.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/vi.ts @@ -2819,34 +2819,4 @@ export default { resetUrlMessage: 'Bạn có chắc chắn muốn đặt lại URL này không?', resetUrlLabel: 'Đặt lại', }, - uiCulture: { - ar: 'العربية', - bs: 'Bosanski', - cs: 'Česky', - cy: 'Cymraeg', - da: 'Dansk', - de: 'Deutsch', - en: 'English (UK)', - 'en-us': 'English (US)', - es: 'Español', - fr: 'Français', - he: 'Hebrew', - hr: 'Hrvatski', - it: 'Italiano', - ja: '日本語', - ko: '한국어', - nb: 'Norsk Bokmål', - nl: 'Nederlands', - pl: 'Polski', - pt: 'Português', - 'pt-br': 'Português (Brasil)', - ro: 'Romana', - ru: 'Русский', - sv: 'Svenska', - tr: 'Türkçe', - uk: 'Українська', - zh: '中文', - 'zh-tw': '中文(正體,台灣)', - vi: 'Tiếng Việt', - }, } as UmbLocalizationDictionary; From c08fee5062f75112473d277bb91981389181a9bc Mon Sep 17 00:00:00 2001 From: leekelleher Date: Mon, 24 Nov 2025 11:49:20 +0000 Subject: [PATCH 3/4] 'en' localization file formatting --- src/Umbraco.Web.UI.Client/src/assets/lang/en.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts index 7d7d2abd47e9..f47bcdf33c08 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts @@ -2555,16 +2555,21 @@ export default { }, welcomeDashboard: { umbracoForumHeadline: 'The Umbraco community forum', - umbracoForumDescription: 'The forum is the central hub for the Umbraco developer community. This is where developers, integrators, and contributors come together to ask questions, share knowledge, and collaborate on all things Umbraco.', + umbracoForumDescription: + 'The forum is the central hub for the Umbraco developer community. This is where developers, integrators, and contributors come together to ask questions, share knowledge, and collaborate on all things Umbraco.', umbracoForumButton: 'Visit the Umbraco community forum', umbracoCommunityHeadline: 'The Umbraco community site', - umbracoCommunityDescription: 'The gathering place for all things Umbraco. Whether you write, teach, test, give feedback, or want to connect with others, there’s a way for you to be part of the Friendly Umbraco community.', + umbracoCommunityDescription: + 'The gathering place for all things Umbraco. Whether you write, teach, test, give feedback, or want to connect with others, there’s a way for you to be part of the Friendly Umbraco community.', documentationHeadline: 'Documentation', - documentationDescription: 'Your guide to everything Umbraco. Learn how to get started, explore new features, and discover best practices through clear examples and explanations.', + documentationDescription: + 'Your guide to everything Umbraco. Learn how to get started, explore new features, and discover best practices through clear examples and explanations.', resourcesHeadline: 'Resources', - resourcesDescription: 'Explore Umbraco resources to learn, build, and grow your skills. Find blogs, tutorials, demos, documentation, and videos to help you make the most of Umbraco.', + resourcesDescription: + 'Explore Umbraco resources to learn, build, and grow your skills. Find blogs, tutorials, demos, documentation, and videos to help you make the most of Umbraco.', trainingHeadline: 'Training', - trainingDescription: 'Master Umbraco with official training. Get practical experience through instructor-led courses and earn certifications that help you grow your skills and career.', + trainingDescription: + 'Master Umbraco with official training. Get practical experience through instructor-led courses and earn certifications that help you grow your skills and career.', }, blockEditor: { headlineCreateBlock: 'Pick Element Type', From 928388fdcf9468e60b0a10140b753fee85ca0f70 Mon Sep 17 00:00:00 2001 From: Lee Kelleher Date: Mon, 24 Nov 2025 12:04:06 +0000 Subject: [PATCH 4/4] Update src/Umbraco.Web.UI.Client/src/assets/lang/en.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/Umbraco.Web.UI.Client/src/assets/lang/en.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts index f47bcdf33c08..652ae2f129b3 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts +++ b/src/Umbraco.Web.UI.Client/src/assets/lang/en.ts @@ -2903,7 +2903,7 @@ export default { 'hr-hr': 'Hrvatski (Hrvatska)', it: 'Italiano', 'it-it': 'Italiano (Italia)', - 'it-ch': 'Italiano (Svizerra)', + 'it-ch': 'Italiano (Svizzera)', ja: '日本語', 'ja-jp': '日本語 (日本)', ko: '한국어',