feat: add new dics\translations

This commit is contained in:
2026-09-13 05:11:40 +05:00
parent 3c10147ad8
commit 9a27388119
3 changed files with 139 additions and 154 deletions
+3 -1
View File
@@ -32,11 +32,13 @@ export type HeaderStrings = {
catalog: string; catalog: string;
sectionsAria: string; sectionsAria: string;
footerNote: string; footerNote: string;
home: string;
uiKit: string;
}; };
export type Dict = { export type Dict = {
header: HeaderStrings; header: HeaderStrings;
categories: Record<CategoryId, string>; categories: Record<CategoryId | "all", string>;
home: Record<string, string>; home: Record<string, string>;
catalog: Record<string, string>; catalog: Record<string, string>;
toolPage: Record<string, string>; toolPage: Record<string, string>;
+50 -1
View File
@@ -5,10 +5,13 @@ export const en: Dict = {
workspace: "Workspace", workspace: "Workspace",
catalog: "Catalog", catalog: "Catalog",
sectionsAria: "Sections", sectionsAria: "Sections",
home: "Home page",
uiKit: "UI Kit",
footerNote: footerNote:
"All operations run locally in your browser — your files are never uploaded anywhere.", "All operations run locally in your browser — your files are never uploaded anywhere.",
}, },
categories: { categories: {
all: "All",
convert: "Convert", convert: "Convert",
alpha: "Transparency", alpha: "Transparency",
color: "Color", color: "Color",
@@ -30,7 +33,9 @@ export const en: Dict = {
metaDescription: metaDescription:
"Full catalog of PNG utilities: convert, transparency, color, geometry, analysis and image generation.", "Full catalog of PNG utilities: convert, transparency, color, geometry, analysis and image generation.",
heading: "Tool catalog", heading: "Tool catalog",
lead: "{count} utilities for working with PNG. Everything runs locally in your browser.", lead: "Focused utilities for working with PNG. Inspect, transform, and export — locally in your browser.",
toolsAvailable: "Tools available",
toolsCount: "Tools",
}, },
toolPage: { toolPage: {
fallbackTitle: "Tool", fallbackTitle: "Tool",
@@ -53,6 +58,9 @@ export const en: Dict = {
}, },
sourceCard: { sourceCard: {
replaceImage: "Replace image", replaceImage: "Replace image",
chooseImage: "choose an image",
noSource: "no source — configure the parameters",
alt: "Source image",
}, },
resultCard: { resultCard: {
emptyTitle: "The result will appear here", emptyTitle: "The result will appear here",
@@ -62,9 +70,15 @@ export const en: Dict = {
recalc: "Recalculating…", recalc: "Recalculating…",
nextTool: "⛓ Next tool", nextTool: "⛓ Next tool",
breakChain: "✂ Break the chain", breakChain: "✂ Break the chain",
noResult: "no result yet",
parts: "parts",
format: "Format",
alt: "Result image",
}, },
paramsCard: { paramsCard: {
noParams: "This tool has no parameters — the result is ready as is.", noParams: "This tool has no parameters — the result is ready as is.",
configureOutput: "Configure output",
noSchema: "This tool has no schema yet.",
}, },
textInput: { textInput: {
heading: "Text", heading: "Text",
@@ -78,6 +92,17 @@ export const en: Dict = {
copy: "Copy", copy: "Copy",
downloadTxt: "Download .txt", downloadTxt: "Download .txt",
}, },
actions: {
generate: "Generate",
generating: "Generating…",
openImage: "Open image",
downloadResult: "Download result",
},
textSource: {
placeholder: "Paste base64 / hex / bytes…",
trySample: "Try sample",
render: "Render text",
},
download: { download: {
busy: "Preparing file…", busy: "Preparing file…",
file: "Download .{ext}", file: "Download .{ext}",
@@ -92,6 +117,8 @@ export const en: Dict = {
dropZone: { dropZone: {
pickDefault: "Drop an image here or click to choose a file", pickDefault: "Drop an image here or click to choose a file",
overlayDefault: "Release the file to replace the image", overlayDefault: "Release the file to replace the image",
pickTitle: "Drop a PNG here",
pickHint: "or click to browse — processed locally",
}, },
search: { search: {
placeholder: "Find a tool…", placeholder: "Find a tool…",
@@ -109,6 +136,25 @@ export const en: Dict = {
overlayTitle: "Watermark", overlayTitle: "Watermark",
overlayDrop: "Drop a watermark PNG or click", overlayDrop: "Drop a watermark PNG or click",
overlayRemove: "Remove watermark", overlayRemove: "Remove watermark",
autoUpdate: "updates automatically",
width: "Width",
height: "Height",
from: "From",
to: "To",
font: "Font",
size: "Size",
color: "Color",
bold: "Bold",
fontSans: "Sans",
fontSerif: "Serif",
fontMono: "Mono",
opacity: "Opacity",
angle: "Angle",
backingPlate: "Backing plate",
addColor: "+ Add color",
removeColor: "Remove color",
themeToggle: "Toggle theme",
language: "Language",
}, },
errors: { errors: {
noImageRun: "This tool does not process images", noImageRun: "This tool does not process images",
@@ -151,7 +197,10 @@ export const en: Dict = {
cropSize: "Crop width and height must be positive", cropSize: "Crop width and height must be positive",
sizePositive: "Dimensions must be positive and finite", sizePositive: "Dimensions must be positive and finite",
tooManyParts: "Too many parts ({count}). Maximum is 1000.", tooManyParts: "Too many parts ({count}). Maximum is 1000.",
toolUnknown: 'No tool is registered under "{id}".',
}, },
fields: {},
groups: {},
tools: { tools: {
"png-file-size": { "png-file-size": {
results: { results: {
+86 -152
View File
@@ -1,14 +1,17 @@
import type { Dict } from "./dict"; import type { Dict } from "./dict";
export const ru: Dict = { export const ru: Dict = {
header: { header: {
workspace: "Рабочая область", workspace: "Рабочая область",
catalog: "Каталог", catalog: "Каталог",
sectionsAria: "Разделы", sectionsAria: "Разделы",
home: "Главная",
uiKit: "UI Kit",
footerNote: footerNote:
"Все операции выполняются локально в вашем браузере — файлы никуда не отправляются.", "Все операции выполняются локально в вашем браузере — файлы никуда не отправляются.",
}, },
categories: { categories: {
all: "Все",
convert: "Конвертация", convert: "Конвертация",
alpha: "Прозрачность", alpha: "Прозрачность",
color: "Цвет", color: "Цвет",
@@ -31,7 +34,9 @@ export const ru: Dict = {
metaDescription: metaDescription:
"Полный каталог PNG-утилит: конвертация, прозрачность, цвет, геометрия, анализ и генерация изображений.", "Полный каталог PNG-утилит: конвертация, прозрачность, цвет, геометрия, анализ и генерация изображений.",
heading: "Каталог инструментов", heading: "Каталог инструментов",
lead: "{count} утилит для работы с PNG. Все операции выполняются локально в браузере.", lead: "Утилиты для работы с PNG. Анализируйте, преобразуйте и экспортируйте — локально в браузере.",
toolsAvailable: "Инструментов доступно",
toolsCount: "Инструментов",
}, },
toolPage: { toolPage: {
fallbackTitle: "Инструмент", fallbackTitle: "Инструмент",
@@ -54,6 +59,9 @@ export const ru: Dict = {
}, },
sourceCard: { sourceCard: {
replaceImage: "Заменить изображение", replaceImage: "Заменить изображение",
chooseImage: "выберите изображение",
noSource: "нет источника — настройте параметры",
alt: "Исходное изображение",
}, },
resultCard: { resultCard: {
emptyTitle: "Результат появится здесь", emptyTitle: "Результат появится здесь",
@@ -63,9 +71,15 @@ export const ru: Dict = {
recalc: "Пересчёт…", recalc: "Пересчёт…",
nextTool: "⛓ Следующий инструмент", nextTool: "⛓ Следующий инструмент",
breakChain: "✂ Оборвать цепочку", breakChain: "✂ Оборвать цепочку",
noResult: "результата пока нет",
parts: "частей",
format: "Формат",
alt: "Изображение-результат",
}, },
paramsCard: { paramsCard: {
noParams: "У этого инструмента нет параметров — результат уже готов.", noParams: "У этого инструмента нет параметров — результат уже готов.",
configureOutput: "Настроить вывод",
noSchema: "У этого инструмента пока нет схемы.",
}, },
textInput: { textInput: {
heading: "Текст", heading: "Текст",
@@ -79,6 +93,17 @@ export const ru: Dict = {
copy: "Копировать", copy: "Копировать",
downloadTxt: "Скачать .txt", downloadTxt: "Скачать .txt",
}, },
actions: {
generate: "Сгенерировать",
generating: "Генерация…",
openImage: "Открыть изображение",
downloadResult: "Скачать результат",
},
textSource: {
placeholder: "Вставьте base64 / hex / байты…",
trySample: "Попробовать образец",
render: "Отрисовать текст",
},
download: { download: {
busy: "Готовим файл…", busy: "Готовим файл…",
file: "Скачать .{ext}", file: "Скачать .{ext}",
@@ -93,6 +118,8 @@ export const ru: Dict = {
dropZone: { dropZone: {
pickDefault: "Перетащите изображение сюда или нажмите, чтобы выбрать файл", pickDefault: "Перетащите изображение сюда или нажмите, чтобы выбрать файл",
overlayDefault: "Отпустите файл, чтобы заменить изображение", overlayDefault: "Отпустите файл, чтобы заменить изображение",
pickTitle: "Перетащите PNG сюда",
pickHint: "или нажмите, чтобы выбрать — всё локально",
}, },
search: { search: {
placeholder: "Найдите инструмент…", placeholder: "Найдите инструмент…",
@@ -110,6 +137,25 @@ export const ru: Dict = {
overlayTitle: "Знак", overlayTitle: "Знак",
overlayDrop: "Перетащите PNG-знак или нажмите", overlayDrop: "Перетащите PNG-знак или нажмите",
overlayRemove: "Убрать знак", overlayRemove: "Убрать знак",
autoUpdate: "обновляется автоматически",
width: "Ширина",
height: "Высота",
from: "От",
to: "До",
font: "Шрифт",
size: "Размер",
color: "Цвет",
bold: "Жирный",
fontSans: "Без засечек",
fontSerif: "С засечками",
fontMono: "Моноширинный",
opacity: "Непрозрачность",
angle: "Угол",
backingPlate: "Подложка",
addColor: "+ Добавить цвет",
removeColor: "Удалить цвет",
themeToggle: "Переключить тему",
language: "Язык",
}, },
errors: { errors: {
noImageRun: "Этот инструмент не обрабатывает изображения", noImageRun: "Этот инструмент не обрабатывает изображения",
@@ -152,29 +198,11 @@ export const ru: Dict = {
cropSize: "Ширина и высота области обрезки должны быть положительными", cropSize: "Ширина и высота области обрезки должны быть положительными",
sizePositive: "Размеры должны быть положительными и конечными", sizePositive: "Размеры должны быть положительными и конечными",
tooManyParts: "Слишком много частей ({count}). Ограничение — 1000.", tooManyParts: "Слишком много частей ({count}). Ограничение — 1000.",
toolUnknown: "Инструмента с id «{id}» нет в реестре.",
}, },
fields: {},
groups: {},
tools: { tools: {
"jpg-to-png": {
title: "Конвертировать JPG в PNG",
description:
"Открывает JPEG и сохраняет его как PNG без потерь. Прозрачность, если была, сохраняется.",
},
"webp-to-png": {
title: "Конвертировать WebP в PNG",
description: "Перекодирует WebP-изображение в универсальный PNG.",
},
"gif-to-png": {
title: "Конвертировать GIF в PNG",
description: "Достаёт первый кадр GIF-анимации и сохраняет его как PNG.",
},
"bmp-to-png": {
title: "Конвертировать BMP в PNG",
description: "Перекодирует BMP в компактный PNG без потерь.",
},
"ico-to-png": {
title: "Конвертировать ICO в PNG",
description: "Превращает иконку .ico в обычный PNG нужного размера.",
},
"png-to-bmp": { "png-to-bmp": {
title: "Конвертировать PNG в BMP", title: "Конвертировать PNG в BMP",
description: description:
@@ -288,6 +316,11 @@ export const ru: Dict = {
"Повторяет изображение сеткой из выбранного числа столбцов и строк.", "Повторяет изображение сеткой из выбранного числа столбцов и строк.",
params: { columns: "Столбцов", rows: "Строк" }, params: { columns: "Столбцов", rows: "Строк" },
}, },
"split-into-parts-png": {
title: "Разрезать PNG на части",
description:
"Делит изображение на сетку одинаковых по размеру частей. Холст дополняется прозрачностью, чтобы каждая часть была одного размера.",
},
"center-by-alpha-png": { "center-by-alpha-png": {
title: "Центрировать PNG по содержимому", title: "Центрировать PNG по содержимому",
description: description:
@@ -358,6 +391,36 @@ export const ru: Dict = {
}, },
}, },
}, },
cmyk: {
title: "Конвертировать PNG в цвета CMYK",
description:
"Раскладывает изображение на печатные компоненты Cyan, Magenta, Yellow и Key (чёрный).",
},
hsl: {
title: "Разбить PNG на HSL",
description:
"Раскладывает изображение на компоненты тона, насыщенности и светлоты.",
},
hsi: {
title: "Разбить PNG на HSI",
description:
"Раскладывает изображение на компоненты тона, насыщенности и интенсивности.",
},
hsv: {
title: "Разбить PNG на HSV",
description:
"Раскладывает изображение на компоненты тона, насыщенности и значения (яркости).",
},
lab: {
title: "Конвертировать PNG в цвета LAB",
description:
"Раскладывает изображение на перцепционную светлоту и оппонентные пары зелёный–пурпур / синий–жёлтый.",
},
ycbcr: {
title: "Конвертировать PNG в цвета YCbCr",
description:
"Раскладывает изображение на яркость (Y) и цветоразностные компоненты Cb / Cr.",
},
"black-and-white-png": { "black-and-white-png": {
title: "Чёрно-белый PNG по порогу", title: "Чёрно-белый PNG по порогу",
description: description:
@@ -477,11 +540,6 @@ export const ru: Dict = {
tolerance: "Порог похожести, %", tolerance: "Порог похожести, %",
}, },
}, },
"png-info": {
title: "Информация о PNG",
description:
"Показывает размеры, наличие альфа-канала и количество уникальных цветов загруженного изображения.",
},
"create-empty-png": { "create-empty-png": {
title: "Создать пустой PNG", title: "Создать пустой PNG",
description: description:
@@ -642,83 +700,6 @@ export const ru: Dict = {
grayscaleNo: "Нет — найдены цветные пиксели.", grayscaleNo: "Нет — найдены цветные пиксели.",
}, },
}, },
"png-to-hsl": {
title: "Разложить PNG в HSL",
description:
"Раскладывает изображение на компоненты Тон, Насыщенность и Светлота.",
params: { component: "Компонент", display: "Режим показа" },
options: {
component: { h: "Тон (H)", s: "Насыщенность (S)", l: "Светлота (L)" },
display: { gray: "Градациями серого", color: "Пространство как RGB" },
},
},
"png-to-hsv": {
title: "Разложить PNG в HSV",
description:
"Раскладывает изображение на Тон, Насыщенность и Яркость (Value).",
params: { component: "Компонент", display: "Режим показа" },
options: {
component: { h: "Тон (H)", s: "Насыщенность (S)", v: "Яркость (V)" },
display: { gray: "Градациями серого", color: "Пространство как RGB" },
},
},
"png-to-hsi": {
title: "Разложить PNG в HSI",
description:
"Раскладывает изображение на Тон, Насыщенность и Интенсивность.",
params: { component: "Компонент", display: "Режим показа" },
options: {
component: {
h: "Тон (H)",
s: "Насыщенность (S)",
i: "Интенсивность (I)",
},
display: { gray: "Градациями серого", color: "Пространство как RGB" },
},
},
"png-to-cmyk": {
title: "PNG в CMYK-цвета",
description:
"Раскладывает изображение на печатные компоненты: Голубой, Пурпурный, Жёлтый и Чёрный (Key).",
params: { component: "Компонент", display: "Режим показа" },
options: {
component: {
c: "Голубой (C)",
m: "Пурпурный (M)",
y: "Жёлтый (Y)",
k: "Чёрный (K)",
},
display: { gray: "Градациями серого", color: "Пространство как RGB" },
},
},
"png-to-ycbcr": {
title: "PNG в YCbCr-цвета",
description:
"Раскладывает изображение на Яркость (Y) и цветоразностные компоненты Cb / Cr.",
params: { component: "Компонент", display: "Режим показа" },
options: {
component: {
y: "Яркость (Y)",
cb: "Синий-разностный (Cb)",
cr: "Красный-разностный (Cr)",
},
display: { gray: "Градациями серого", color: "Пространство как RGB" },
},
},
"png-to-lab": {
title: "PNG в LAB-цвета",
description:
"Раскладывает изображение на perceptual-компоненты: Светлость, зелёный–пурпурный и синий–жёлтый.",
params: { component: "Компонент", display: "Режим показа" },
options: {
component: {
l: "Светлость (L)",
a: "Зелёный–пурпурный (a)",
b: "Синий–жёлтый (b)",
},
display: { gray: "Градациями серого", color: "Пространство как RGB" },
},
},
"circle-mask-png": { "circle-mask-png": {
title: "Круглая маска PNG", title: "Круглая маска PNG",
description: description:
@@ -1024,29 +1005,6 @@ export const ru: Dict = {
pattern: { "floyd-steinberg": "Флойд–Стейнберг", bayer: "Байер 4×4" }, pattern: { "floyd-steinberg": "Флойд–Стейнберг", bayer: "Байер 4×4" },
}, },
}, },
"compress-png": {
title: "Сжать PNG",
description:
"Уменьшает размер PNG сокращением палитры до выбранного уровня. Честный компромисс: меньше цветов — меньше файл.",
params: { level: "Уровень сжатия" },
options: {
level: {
light: "Лёгкий (192 цвета)",
balanced: "Сбалансированный (96 цветов)",
strong: "Сильный (44 цвета)",
extreme: "Экстремальный (16 цветов)",
},
},
},
"reduce-to-size-png": {
title: "Вписать PNG в размер",
description:
"Бинарным поиском подбирает размер палитры, чтобы закодированный PNG уложился в целевое количество КБ. Если не влезает даже при 2 цветах — вернёт двухцветный вариант.",
params: {
targetKB: "Целевой размер, КБ",
maxColors: "Максимум цветов для перебора",
},
},
"png-file-size": { "png-file-size": {
title: "Размер файла PNG", title: "Размер файла PNG",
description: description:
@@ -1168,30 +1126,6 @@ export const ru: Dict = {
}, },
}, },
}, },
"watermark-image-png": {
title: "Знак картинкой PNG",
description:
"Накладывает другой PNG (логотип, подпись): масштаб от ширины холста, прозрачность, позиция 3×3. Знак живёт, пока открыта страница, — после восстановления цепочки выберите его заново.",
params: {
scale: "Ширина знака, % от холста",
opacity: "Непрозрачность, %",
position: "Позиция",
margin: "Отступ, px",
},
options: {
position: {
"top-left": "Сверху слева",
"top-center": "Сверху по центру",
"top-right": "Сверху справа",
"middle-left": "По центру слева",
center: "По центру",
"middle-right": "По центру справа",
"bottom-left": "Снизу слева",
"bottom-center": "Снизу по центру",
"bottom-right": "Снизу справа",
},
},
},
"add-text-png": { "add-text-png": {
title: "Надпись на PNG", title: "Надпись на PNG",
description: description: