Compare commits

..

10 Commits

Author SHA1 Message Date
Zexin Yuan
8d83b4e084
Merge c372ba03ddd169622c8be17ccbe78643db51bc8f into 25667e84b7f54b6cc6cb1a0a790413d73348b71d 2026-02-06 22:40:15 +02:00
Elian Doran
25667e84b7
fix(deps): update dependency force-graph to v1.51.1 (#8632)
Some checks are pending
Checks / main (push) Waiting to run
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Deploy Documentation / Build and Deploy Documentation (push) Waiting to run
Dev / Test development (push) Waiting to run
Dev / Build Docker image (push) Blocked by required conditions
Dev / Check Docker build (Dockerfile) (push) Blocked by required conditions
Dev / Check Docker build (Dockerfile.alpine) (push) Blocked by required conditions
/ Check Docker build (Dockerfile) (push) Waiting to run
/ Check Docker build (Dockerfile.alpine) (push) Waiting to run
/ Build Docker images (Dockerfile, ubuntu-24.04-arm, linux/arm64) (push) Blocked by required conditions
/ Build Docker images (Dockerfile.alpine, ubuntu-latest, linux/amd64) (push) Blocked by required conditions
/ Build Docker images (Dockerfile.legacy, ubuntu-24.04-arm, linux/arm/v7) (push) Blocked by required conditions
/ Build Docker images (Dockerfile.legacy, ubuntu-24.04-arm, linux/arm/v8) (push) Blocked by required conditions
/ Merge manifest lists (push) Blocked by required conditions
playwright / E2E tests on linux-arm64 (push) Waiting to run
playwright / E2E tests on linux-x64 (push) Waiting to run
2026-02-06 22:40:03 +02:00
Elian Doran
72e0d77be5
chore(i18n): fix more issues related to Irish 2026-02-06 21:44:39 +02:00
Elian Doran
9ac4b9ed4f
docs(dev): refresh adding new locale 2026-02-06 21:18:29 +02:00
Elian Doran
b3b89ba05c
chore(i18n): fix calendar mapping for Irish 2026-02-06 21:16:07 +02:00
Elian Doran
00dc04df25
chire(pdfjs): fix handling of Irish 2026-02-06 20:46:26 +02:00
Elian Doran
21d47c3fef
chore(i18n): fix issues with ga 2026-02-06 20:24:16 +02:00
Elian Doran
66de94f050
feat(i18n): enable Irish language 2026-02-06 19:56:37 +02:00
Elian Doran
1917adb322
chore(scripts): improve messages for translation check script 2026-02-06 19:38:24 +02:00
renovate[bot]
715f42b6c3
fix(deps): update dependency force-graph to v1.51.1 2026-02-05 01:13:22 +00:00
13 changed files with 35 additions and 20 deletions

View File

@ -42,7 +42,7 @@
"color": "5.0.3",
"debounce": "3.0.0",
"draggabilly": "3.0.0",
"force-graph": "1.51.0",
"force-graph": "1.51.1",
"globals": "17.3.0",
"i18next": "25.8.0",
"i18next-http-backend": "3.0.2",

View File

@ -79,6 +79,7 @@ export const LOCALE_MAPPINGS: Record<DISPLAYABLE_LOCALE_IDS, (() => Promise<{ de
es: () => import("@fullcalendar/core/locales/es"),
fr: () => import("@fullcalendar/core/locales/fr"),
it: () => import("@fullcalendar/core/locales/it"),
ga: null,
cn: () => import("@fullcalendar/core/locales/zh-cn"),
tw: () => import("@fullcalendar/core/locales/zh-tw"),
ro: () => import("@fullcalendar/core/locales/ro"),

View File

@ -34,6 +34,7 @@ const LOCALE_MAPPINGS: Record<DISPLAYABLE_LOCALE_IDS, Options["locale"] | null>
"en-GB": "en",
es: "es",
fr: "fr",
ga: null,
it: "it",
ja: "ja",
pt: "pt",

View File

@ -2,6 +2,7 @@ import { LOCALES } from "@triliumnext/commons";
import { readdirSync } from "fs";
import { join } from "path";
import { describe, expect, it } from "vitest";
import { LANGUAGE_MAPPINGS } from "./i18n.js";
const localeDir = join(__dirname, "../../../../../../node_modules/@excalidraw/excalidraw/dist/prod/locales");
@ -21,9 +22,9 @@ describe("Canvas i18n", () => {
for (const locale of LOCALES) {
if (locale.contentOnly || locale.devOnly) continue;
const languageCode = LANGUAGE_MAPPINGS[locale.id];
if (!supportedLanguageCodes.has(languageCode)) {
if (languageCode && !supportedLanguageCodes.has(languageCode)) {
console.log("Supported locales:", Array.from(supportedLanguageCodes.values()).join(", "));
expect.fail(`Unable to find locale for ${locale.id} -> ${languageCode}.`)
expect.fail(`Unable to find locale for ${locale.id} -> ${languageCode}.`);
}
}
});

View File

@ -10,6 +10,7 @@ export const LANGUAGE_MAPPINGS: Record<DISPLAYABLE_LOCALE_IDS, Language["code"]
en_rtl: "en",
es: "es-ES",
fr: "fr-FR",
ga: null,
it: "it-IT",
ja: "ja-JP",
pt: "pt-PT",

View File

@ -29,7 +29,7 @@ describe("CK config", () => {
if (expectedLocale === "cn") expectedLocale = "zh";
if (expectedLocale === "tw") expectedLocale = "zh-tw";
if (locale.id !== "en") {
if (locale.id !== "en" && locale.id !== "ga") {
expect((config.language as any).ui).toMatch(new RegExp(`^${expectedLocale}`));
expect(config.translations, locale.id).toBeDefined();
expect(config.translations, locale.id).toHaveLength(2);

View File

@ -4,8 +4,9 @@ Once the Weblate translations for a single language have reached ~50% in coverag
To do so:
1. In `packages/commons` look for `i18n.ts` and add a new entry to `UNSORTED_LOCALES` for the language.
2. In `apps/server` look for `services/i18n.ts` and add a mapping for the new language in `DAYJS_LOADER`. Sort the entire list.
2. In `packages/commons` look for `dayjs.ts` and add a mapping for the new language in `DAYJS_LOADER`. Sort the entire list.
3. In `apps/client`, look for `collections/calendar/index.tsx` and modify `LOCALE_MAPPINGS` to add support to the new language.
4. In `apps/client`, look for `widgets/type_widgets/canvas/i18n.ts` and modify `LANGUAGE_MAPPINGS`. A unit test ensures that the language is actually loadable.
5. In `apps/client`, look for `widgets/type_widgets/MindMap.tsx` and modify `LOCALE_MAPPINGS`. The type definitions should already validate if the new value is supported by Mind Elixir.
6. In `packages/ckeditor5`, look for `i18n.ts` and modify `LOCALE_MAPPINGS`. The import validation should already check if the new value is supported by CKEditor, and there's also a test to ensure it.
6. In `packages/ckeditor5`, look for `i18n.ts` and modify `LOCALE_MAPPINGS`. The import validation should already check if the new value is supported by CKEditor, and there's also a test to ensure it.
7. Locale mappings for PDF.js might need adjustment. To do so, in `packages/pdfjs-viewer/scripts/build.ts` there is `LOCALE_MAPPINGS`.

View File

@ -40,6 +40,7 @@ const LOCALE_MAPPINGS: Record<DISPLAYABLE_LOCALE_IDS, LocaleMapping | null> = {
coreTranslation: () => import("ckeditor5/translations/fr.js"),
premiumFeaturesTranslation: () => import("ckeditor5-premium-features/translations/fr.js"),
},
ga: null,
it: {
languageCode: "it",
coreTranslation: () => import("ckeditor5/translations/it.js"),

View File

@ -41,6 +41,7 @@ export const DAYJS_LOADER: Record<LOCALE_IDS, () => Promise<typeof import("dayjs
"es": () => import("dayjs/locale/es.js"),
"fa": () => import("dayjs/locale/fa.js"),
"fr": () => import("dayjs/locale/fr.js"),
"ga": () => import("dayjs/locale/ga.js"),
"it": () => import("dayjs/locale/it.js"),
"he": () => import("dayjs/locale/he.js"),
"ja": () => import("dayjs/locale/ja.js"),

View File

@ -19,6 +19,7 @@ const UNSORTED_LOCALES = [
{ id: "en-GB", name: "English (United Kingdom)", electronLocale: "en_GB" },
{ id: "es", name: "Español", electronLocale: "es" },
{ id: "fr", name: "Français", electronLocale: "fr" },
{ id: "ga", name: "Gaeilge", electronLocale: "en" },
{ id: "it", name: "Italiano", electronLocale: "it" },
{ id: "ja", name: "日本語", electronLocale: "ja" },
{ id: "pt_br", name: "Português (Brasil)", electronLocale: "pt_BR" },

View File

@ -10,7 +10,8 @@ const build = new BuildHelper("packages/pdfjs-viewer");
const watchMode = process.argv.includes("--watch");
const LOCALE_MAPPINGS: Record<string, string> = {
"es": "es-ES"
"es": "es-ES",
"ga": "ga-IE"
};
async function main() {
@ -28,8 +29,9 @@ async function main() {
// Copy locales.
const localeMappings = {};
for (const locale of LOCALES) {
if (locale.id === "en" || locale.contentOnly || locale.devOnly) continue;
const mappedLocale = LOCALE_MAPPINGS[locale.electronLocale] || locale.electronLocale.replace("_", "-");
if (locale.contentOnly || locale.devOnly) continue;
const mappedLocale = LOCALE_MAPPINGS[locale.id] || locale.electronLocale.replace("_", "-");
if (mappedLocale === "en") continue;
const localePath = `${locale.id}/viewer.ftl`;
build.copy(`viewer/locale/${mappedLocale}/viewer.ftl`, `web/locale/${localePath}`);
localeMappings[locale.id] = localePath;

14
pnpm-lock.yaml generated
View File

@ -258,8 +258,8 @@ importers:
specifier: 3.0.0
version: 3.0.0
force-graph:
specifier: 1.51.0
version: 1.51.0
specifier: 1.51.1
version: 1.51.1
globals:
specifier: 17.3.0
version: 17.3.0
@ -8799,8 +8799,8 @@ packages:
resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
engines: {node: '>= 0.4'}
force-graph@1.51.0:
resolution: {integrity: sha512-aTnihCmiMA0ItLJLCbrQYS9mzriopW24goFPgUnKAAmAlPogTSmFWqoBPMXzIfPb7bs04Hur5zEI4WYgLW3Sig==}
force-graph@1.51.1:
resolution: {integrity: sha512-uEEX8iRzgq1IKRISOw6RrB2RLMhcI25xznQYrCTVvxZHZZ+A2jH6qIolYuwavVxAMi64pFp2yZm4KFVdD993cg==}
engines: {node: '>=12'}
foreach@2.0.6:
@ -15999,6 +15999,8 @@ snapshots:
'@ckeditor/ckeditor5-core': 47.4.0
'@ckeditor/ckeditor5-utils': 47.4.0
ckeditor5: 47.4.0
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)':
dependencies:
@ -16729,6 +16731,8 @@ snapshots:
'@ckeditor/ckeditor5-ui': 47.4.0
'@ckeditor/ckeditor5-utils': 47.4.0
ckeditor5: 47.4.0
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-restricted-editing@47.4.0':
dependencies:
@ -25101,7 +25105,7 @@ snapshots:
dependencies:
is-callable: 1.2.7
force-graph@1.51.0:
force-graph@1.51.1:
dependencies:
'@tweenjs/tween.js': 25.0.0
accessor-fn: 1.5.3

View File

@ -2,20 +2,21 @@ import { LOCALES } from "../../packages/commons/src/lib/i18n";
import { getLanguageStats } from "./utils";
async function main() {
const languageStats = await getLanguageStats("client");
const localeIdsWithCoverage = languageStats.results
const project = "client";
const languageStats = await getLanguageStats(project);
const localesWithCoverage = languageStats.results
.filter(language => language.translated_percent > 50)
.map(language => language.language_code);
for (const localeId of localeIdsWithCoverage) {
for (const localeData of localesWithCoverage) {
const { language_code: localeId, translated_percent: percentage, language } = localeData;
const locale = LOCALES.find(l => l.id === localeId);
if (!locale) {
console.error(`Locale not found for id: ${localeId}`);
console.error(`❌ Language ${language.name} (${localeId}) has a coverage of ${percentage}% in '${project}', but it is not supported by the application.`);
process.exit(1);
}
}
console.log("Translation coverage check passed.");
console.log("Translation coverage check passed.");
}
main();