diff --git a/tests/shell_labels.mjs b/tests/shell_labels.mjs new file mode 100644 index 0000000..21b6106 --- /dev/null +++ b/tests/shell_labels.mjs @@ -0,0 +1,17 @@ +// The rail's labels and the page titles name their screen words by key (labelKey, TITLE_KEYS), +// so a search for t('…') does not find them: each must still be in both languages. +// (ce35145 removed 'models' and 'gallery' as unused; the rail then showed the raw keys.) +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import { i18n } from '../web/modules/locales.js'; + +const read = name => fs.readFileSync(new URL(`../web/modules/${name}`, import.meta.url), 'utf8'); +const railKeys = [...read('ui_shell_rail.js').matchAll(/labelKey: '([A-Za-z]+)'/g)].map(match => match[1]); +const titles = read('ui_shell_nav.js').match(/const TITLE_KEYS = \{([\s\S]*?)\};/)[1]; +const titleKeys = [...titles.matchAll(/: '([A-Za-z]+)'/g)].map(match => match[1]); + +assert.ok(railKeys.includes('models') && railKeys.includes('gallery')); +assert.ok(titleKeys.includes('gallery')); +for (const key of new Set([...railKeys, ...titleKeys])) { + for (const lang of ['zh', 'en']) assert.ok(i18n[lang][key], `${lang} has no '${key}'`); +} diff --git a/web/modules/locales.js b/web/modules/locales.js index 5af6d2b..dc5cb53 100644 --- a/web/modules/locales.js +++ b/web/modules/locales.js @@ -2602,6 +2602,8 @@ export const i18n = { editRaw: '编辑全文', findPlaceholder: '查找...', replacePlaceholder: '替换为...', + models: '模型', + gallery: '图库', recipeTitle: '工作流', recipeSaveCurrent: '保存当前工作流', recipeSaveTitle: "保存为工作流", @@ -6040,6 +6042,8 @@ export const i18n = { editRaw: 'Edit full text', findPlaceholder: 'Find...', replacePlaceholder: 'Replace with...', + models: 'Models', + gallery: 'Gallery', recipeTitle: 'Workflows', recipeSaveCurrent: 'Save Current Workflow', recipeSaveTitle: "Save workflow",