feat: base english language, also fallback to english

This commit is contained in:
2026-08-25 08:32:19 +05:00
parent 2301b0e165
commit 74a18d91a7
8 changed files with 767 additions and 273 deletions
+77
View File
@@ -0,0 +1,77 @@
import { describe, expect, it } from 'vitest';
import { TOOLS } from '../registry';
import { en } from './en';
import { ru } from './ru';
describe('секция tools словарей покрывает реестр', () => {
it('у каждого инструмента есть перевод ru с непустыми title/description', () => {
for (const tool of TOOLS) {
const strings = ru.tools[tool.id];
expect(strings, `нет перевода для ${tool.id}`).toBeDefined();
expect(strings?.title, `${tool.id}: title`).toBeTruthy();
expect(strings?.description, `${tool.id}: description`).toBeTruthy();
}
});
it('переведены подписи всех параметров', () => {
for (const tool of TOOLS) {
const params = ru.tools[tool.id]?.params ?? {};
for (const param of tool.params) {
const label = params[param.id];
expect(label, `${tool.id}.${param.id}: нет перевода подписи`).toBeDefined();
expect(label?.length).toBeGreaterThan(0);
}
}
});
it('переведены подписи всех опций select', () => {
for (const tool of TOOLS) {
const options = ru.tools[tool.id]?.options ?? {};
for (const param of tool.params) {
if (param.type !== 'select') continue;
const labels = options[param.id] ?? {};
for (const option of param.options) {
const label = labels[option.value];
expect(label, `${tool.id}.${param.id}[${option.value}]: нет перевода`).toBeDefined();
expect(label.length).toBeGreaterThan(0);
}
}
}
});
it('в словарях нет лишних ключей инструментов и параметров', () => {
const ids = new Set(TOOLS.map((tool) => tool.id));
for (const dict of [ru.tools, en.tools]) {
for (const id of Object.keys(dict)) {
expect(ids.has(id), `лишний инструмент в словаре: ${id}`).toBe(true);
const tool = TOOLS.find((t) => t.id === id)!;
const paramIds = new Set(tool.params.map((p) => p.id));
for (const paramId of Object.keys(dict[id].params ?? {})) {
expect(paramIds.has(paramId), `${id}: лишний параметр ${paramId}`).toBe(true);
}
const selectIds = new Set(
tool.params.filter((p) => p.type === 'select').map((p) => p.id)
);
for (const paramId of Object.keys(dict[id].options ?? {})) {
expect(selectIds.has(paramId), `${id}: options у не-select параметра ${paramId}`).toBe(
true
);
}
}
}
});
it('тексты-результаты анализаторов переведены в обоих словарях', () => {
const expectations: Array<[string, string[]]> = [
['png-is-grayscale', ['grayscaleYes', 'grayscaleNo']],
['png-is-transparent', ['transparentYes', 'transparentNo']],
['png-orientation', ['orientationPortrait', 'orientationLandscape', 'orientationSquare']]
];
for (const [id, keys] of expectations) {
for (const key of keys) {
expect(en.tools[id]?.results?.[key], `${id}.${key} (en)`).toBeDefined();
expect(ru.tools[id]?.results?.[key], `${id}.${key} (ru)`).toBeDefined();
}
}
});
});