From d9f84a56ad30fe3ee638fbf3213e78ddf2554f57 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Fri, 26 Apr 2024 15:01:52 +0200 Subject: [PATCH 01/10] enhance(l10n): localize en-US link title --- build/flaws/broken-links.ts | 4 +++- kumascript/src/api/web.ts | 7 ++++++- libs/l10n/l10n.ts | 30 ++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 libs/l10n/l10n.ts diff --git a/build/flaws/broken-links.ts b/build/flaws/broken-links.ts index 6650466d31a6..80367385b879 100644 --- a/build/flaws/broken-links.ts +++ b/build/flaws/broken-links.ts @@ -11,6 +11,7 @@ import { isValidLocale } from "../../libs/locale-utils/index.js"; import * as cheerio from "cheerio"; import { Doc } from "../../libs/types/document.js"; import { Flaw } from "./index.js"; +import { ONLY_AVAILABLE_IN_ENGLISH } from "../../libs/l10n/l10n.js"; const _safeToHttpsDomains = new Map(); @@ -50,13 +51,14 @@ function mutateLink( if (isSelfLink) { $element.attr("aria-current", "page"); } else if (enUSFallback) { + const locale = $element.attr("href").match(/^\/([^/]+)\//)[1]; // If we have an English (US) fallback, then we use this first. // As we still suggest the translated version even if we only // have an English (US) version. $element.attr("href", enUSFallback); $element.append(` (${DEFAULT_LOCALE})`); $element.addClass("only-in-en-us"); - $element.attr("title", "Currently only available in English (US)"); + $element.attr("title", ONLY_AVAILABLE_IN_ENGLISH(locale)); } else if (suggestion) { $element.attr("href", suggestion); } else { diff --git a/kumascript/src/api/web.ts b/kumascript/src/api/web.ts index 5697b10a7425..9329b8eec414 100644 --- a/kumascript/src/api/web.ts +++ b/kumascript/src/api/web.ts @@ -5,10 +5,13 @@ import * as util from "./util.js"; import { CONTENT_ROOT } from "../../../libs/env/index.js"; import { KumaThis } from "../environment.js"; +import { DEFAULT_LOCALE } from "../../../libs/constants/index.js"; +import { ONLY_AVAILABLE_IN_ENGLISH } from "../../../libs/l10n/l10n.js"; const DUMMY_BASE_URL = "https://example.com"; const _warned = new Map(); + // The purpose of this function is to make sure `console.warn` is only called once // per 'macro' per 'href'. // There are some macros that use `smartLink` within themselves and these macros @@ -152,9 +155,11 @@ const web = { )}"`; } content ??= enUSPage.short_title ?? enUSPage.title; + const title = ONLY_AVAILABLE_IN_ENGLISH(this.env.locale); + return ( '${content} (en-US)` ); } diff --git a/libs/l10n/l10n.ts b/libs/l10n/l10n.ts new file mode 100644 index 000000000000..31f1f9d6370b --- /dev/null +++ b/libs/l10n/l10n.ts @@ -0,0 +1,30 @@ +type Locale = + | "en-US" + | "es" + | "fr" + | "ja" + | "ko" + | "pt-BR" + | "ru" + | "zh-CN" + | "zh-TW"; +type TranslatedLocale = Exclude; +type Strings = { + "en-US": string; +} & Record; + +function localString(strings: Strings) { + return (locale: string) => strings[locale] ?? strings["en-US"]; +} + +export const ONLY_AVAILABLE_IN_ENGLISH = localString({ + "en-US": "This page is currently only available in English.", + es: "Esta página está disponible solo en inglés.", + fr: "Cette page est actuellement disponible uniquement en anglais.", + ja: "このページは現在、英語のみで利用可能です。", + ko: "이 페이지는 현재 영어로만 제공됩니다.", + "pt-BR": "Esta página está disponível apenas em inglês no momento.", + ru: "Эта страница в настоящее время доступна только на английском.", + "zh-CN": "此页面目前仅提供英文版本。", + "zh-TW": "此頁面目前僅提供英文版本。", +}); From a9de3e3b6b5354141cfa8b7bcd7b218b66cb8786 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Fri, 26 Apr 2024 15:54:38 +0200 Subject: [PATCH 02/10] test: update expectation --- testing/tests/index.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/tests/index.test.ts b/testing/tests/index.test.ts index 7499bb80727c..81ecc6800cfc 100644 --- a/testing/tests/index.test.ts +++ b/testing/tests/index.test.ts @@ -1633,7 +1633,7 @@ test("translated content broken links can fall back to en-us", () => { expect($('article a[href="/en-US/docs/Web/CSS/number"]')).toHaveLength(2); expect($("article a.only-in-en-us")).toHaveLength(2); expect($("article a.only-in-en-us").attr("title")).toBe( - "Currently only available in English (US)" + "Cette page est actuellement disponible uniquement en anglais." ); }); From e6be3115ae2d93a65f59a27a70a85db551dc2b20 Mon Sep 17 00:00:00 2001 From: Claas Augner <495429+caugner@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:56:13 +0200 Subject: [PATCH 03/10] Update libs/l10n/l10n.ts Co-authored-by: Leonid Vinogradov --- libs/l10n/l10n.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/l10n/l10n.ts b/libs/l10n/l10n.ts index 31f1f9d6370b..0f12d88e58fe 100644 --- a/libs/l10n/l10n.ts +++ b/libs/l10n/l10n.ts @@ -24,7 +24,7 @@ export const ONLY_AVAILABLE_IN_ENGLISH = localString({ ja: "このページは現在、英語のみで利用可能です。", ko: "이 페이지는 현재 영어로만 제공됩니다.", "pt-BR": "Esta página está disponível apenas em inglês no momento.", - ru: "Эта страница в настоящее время доступна только на английском.", + ru: "В настоящее время эта страница доступна только на английском языке", "zh-CN": "此页面目前仅提供英文版本。", "zh-TW": "此頁面目前僅提供英文版本。", }); From 264750f8329f07882ead3a7672fcb10548247ab6 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Fri, 26 Apr 2024 16:12:35 +0200 Subject: [PATCH 04/10] chore(l10n): remove periods --- libs/l10n/l10n.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/libs/l10n/l10n.ts b/libs/l10n/l10n.ts index 0f12d88e58fe..1c6376068366 100644 --- a/libs/l10n/l10n.ts +++ b/libs/l10n/l10n.ts @@ -18,13 +18,13 @@ function localString(strings: Strings) { } export const ONLY_AVAILABLE_IN_ENGLISH = localString({ - "en-US": "This page is currently only available in English.", - es: "Esta página está disponible solo en inglés.", - fr: "Cette page est actuellement disponible uniquement en anglais.", + "en-US": "This page is currently only available in English", + es: "Esta página está disponible solo en inglés", + fr: "Cette page est actuellement disponible uniquement en anglais", ja: "このページは現在、英語のみで利用可能です。", - ko: "이 페이지는 현재 영어로만 제공됩니다.", - "pt-BR": "Esta página está disponível apenas em inglês no momento.", + ko: "이 페이지는 현재 영어로만 제공됩니다", + "pt-BR": "Esta página está disponível apenas em inglês no momento", ru: "В настоящее время эта страница доступна только на английском языке", - "zh-CN": "此页面目前仅提供英文版本。", - "zh-TW": "此頁面目前僅提供英文版本。", + "zh-CN": "此页面目前仅提供英文版本", + "zh-TW": "此頁面目前僅提供英文版本", }); From d73040ebeaa0910cba8bd1d45d8920334ca21dbe Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Fri, 26 Apr 2024 16:26:59 +0200 Subject: [PATCH 05/10] fixup! chore(l10n): remove periods --- testing/tests/index.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/tests/index.test.ts b/testing/tests/index.test.ts index 81ecc6800cfc..8ed91f99b4e4 100644 --- a/testing/tests/index.test.ts +++ b/testing/tests/index.test.ts @@ -1633,7 +1633,7 @@ test("translated content broken links can fall back to en-us", () => { expect($('article a[href="/en-US/docs/Web/CSS/number"]')).toHaveLength(2); expect($("article a.only-in-en-us")).toHaveLength(2); expect($("article a.only-in-en-us").attr("title")).toBe( - "Cette page est actuellement disponible uniquement en anglais." + "Cette page est actuellement disponible uniquement en anglais" ); }); From 8f33cc64d8fe9c309ca2b4291cac6f814a46a90d Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Tue, 30 Apr 2024 18:36:05 +0200 Subject: [PATCH 06/10] refactor(libs): move Locale types to types --- libs/l10n/l10n.ts | 13 ++----------- libs/types/core.ts | 11 +++++++++++ 2 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 libs/types/core.ts diff --git a/libs/l10n/l10n.ts b/libs/l10n/l10n.ts index 1c6376068366..bb9c7156651e 100644 --- a/libs/l10n/l10n.ts +++ b/libs/l10n/l10n.ts @@ -1,14 +1,5 @@ -type Locale = - | "en-US" - | "es" - | "fr" - | "ja" - | "ko" - | "pt-BR" - | "ru" - | "zh-CN" - | "zh-TW"; -type TranslatedLocale = Exclude; +import { TranslatedLocale } from "../types/core.js"; + type Strings = { "en-US": string; } & Record; diff --git a/libs/types/core.ts b/libs/types/core.ts new file mode 100644 index 000000000000..5ba1b2a5a985 --- /dev/null +++ b/libs/types/core.ts @@ -0,0 +1,11 @@ +export type Locale = + | "en-US" + | "es" + | "fr" + | "ja" + | "ko" + | "pt-BR" + | "ru" + | "zh-CN" + | "zh-TW"; +export type TranslatedLocale = Exclude; From 580c0a05ba52b392b7d8c97c0c358bff6e12dc61 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Tue, 30 Apr 2024 18:37:17 +0200 Subject: [PATCH 07/10] refactor(l10n): simplify {Strings => LocaleStringMap} --- libs/l10n/l10n.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/libs/l10n/l10n.ts b/libs/l10n/l10n.ts index bb9c7156651e..fb38a2dec989 100644 --- a/libs/l10n/l10n.ts +++ b/libs/l10n/l10n.ts @@ -1,10 +1,8 @@ -import { TranslatedLocale } from "../types/core.js"; +import { Locale } from "../types/core.js"; -type Strings = { - "en-US": string; -} & Record; +type LocaleStringMap = Record; -function localString(strings: Strings) { +function localString(strings: LocaleStringMap) { return (locale: string) => strings[locale] ?? strings["en-US"]; } From 3ae5d784a5ec37711f9d45687b603b9ed4da2ed8 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Tue, 30 Apr 2024 18:38:08 +0200 Subject: [PATCH 08/10] refactor(l10n): rename {local => locale}String() --- libs/l10n/l10n.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/l10n/l10n.ts b/libs/l10n/l10n.ts index fb38a2dec989..8f5b656cf56d 100644 --- a/libs/l10n/l10n.ts +++ b/libs/l10n/l10n.ts @@ -2,11 +2,11 @@ import { Locale } from "../types/core.js"; type LocaleStringMap = Record; -function localString(strings: LocaleStringMap) { +function localeString(strings: LocaleStringMap) { return (locale: string) => strings[locale] ?? strings["en-US"]; } -export const ONLY_AVAILABLE_IN_ENGLISH = localString({ +export const ONLY_AVAILABLE_IN_ENGLISH = localeString({ "en-US": "This page is currently only available in English", es: "Esta página está disponible solo en inglés", fr: "Cette page est actuellement disponible uniquement en anglais", From 8f0236c42be98ec078e8f45a9b0f617477f65490 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Tue, 30 Apr 2024 18:40:19 +0200 Subject: [PATCH 09/10] fix(kumascript): escape title --- kumascript/src/api/web.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kumascript/src/api/web.ts b/kumascript/src/api/web.ts index 9329b8eec414..e6cdcb536cad 100644 --- a/kumascript/src/api/web.ts +++ b/kumascript/src/api/web.ts @@ -7,6 +7,7 @@ import { CONTENT_ROOT } from "../../../libs/env/index.js"; import { KumaThis } from "../environment.js"; import { DEFAULT_LOCALE } from "../../../libs/constants/index.js"; import { ONLY_AVAILABLE_IN_ENGLISH } from "../../../libs/l10n/l10n.js"; +import { htmlEscape } from "./util.js"; const DUMMY_BASE_URL = "https://example.com"; @@ -159,7 +160,7 @@ const web = { return ( '${content} (en-US)` ); } From ca64e366582ec6ac0ad4bb7cd0a655ae61c2ed47 Mon Sep 17 00:00:00 2001 From: Claas Augner Date: Tue, 30 Apr 2024 18:42:45 +0200 Subject: [PATCH 10/10] chore(kumascript): remove unused import --- kumascript/src/api/web.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/kumascript/src/api/web.ts b/kumascript/src/api/web.ts index e6cdcb536cad..4f422870459f 100644 --- a/kumascript/src/api/web.ts +++ b/kumascript/src/api/web.ts @@ -5,7 +5,6 @@ import * as util from "./util.js"; import { CONTENT_ROOT } from "../../../libs/env/index.js"; import { KumaThis } from "../environment.js"; -import { DEFAULT_LOCALE } from "../../../libs/constants/index.js"; import { ONLY_AVAILABLE_IN_ENGLISH } from "../../../libs/l10n/l10n.js"; import { htmlEscape } from "./util.js";