fix(i18n): eliminate all raw translation key leaks across admin pages

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

- Audited every 'key | translate' and translateService.t() usage under features/admin against en/ru/hy; 37 static keys and 8 dynamic namespaces were missing and rendered as raw keys
- Added full adminTransactions namespace (was entirely absent), adminUsers table/invite/session keys with scopeValue/statusValue/invitationStatus maps, adminMonitoring section titles and categoryValue/queueStatus/webhookStatus/levelValue maps, adminAnalytics.topProducts, adminProducts.variants/archived
- Resolved leaf/object key conflicts: dynamic 'adminMonitoring.category.*' renamed to categoryValue.*, 'adminTransactions.type.*' to typeValue.* so the leaf labels translate correctly
- Monitoring event severity now translated (levelValue) instead of raw English enum
- Merchant wording over technical: 'Background queues', 'Webhook deliveries', 'Activity log', 'Running smoothly/Slowed down/Stopped'
- Verified zero missing keys in en/ru/hy via AST-level key extraction
This commit is contained in:
sdarbinyan
2026-07-18 22:44:39 +04:00
parent 6af746c561
commit 574f038738
6 changed files with 369 additions and 5 deletions

View File

@@ -1530,6 +1530,8 @@ export const ru: Translations = {
addVariant: 'Добавить вариант',
variantName: 'Название варианта',
variantsHint: 'Каждый вариант — это отдельный покупаемый вариант товара (например, размер или цвет) со своей ценой и остатком.',
variants: 'Варианты',
archived: 'В архиве',
seoExplain: 'Это то, что видно в результатах поиска — понятные заголовок и описание помогают найти товар.',
searchTitle: 'Заголовок для поиска',
searchTitleHint: 'Заголовок, показываемый в результатах поиска. Делайте его коротким.',
@@ -1585,10 +1587,98 @@ export const ru: Translations = {
emptyTitle: 'Пользователи не найдены',
emptyDescription: 'Пригласите коллегу, чтобы начать.',
invitationsEmptyTitle: 'Нет ожидающих приглашений',
title: 'Команда',
name: 'Имя',
email: 'Email',
scope: 'Рабочая область',
role: 'Роль',
roles: 'Роли',
lastLogin: 'Последний вход',
sessions: 'Активные сессии',
currentSession: 'Текущая сессия',
invite: 'Пригласить участника',
sendInvite: 'Отправить приглашение',
revoke: 'Отозвать',
passwordlessHint: 'Участники входят через Telegram — пароли не нужны.',
confirmSuspend: 'Заблокировать этого участника? Доступ будет закрыт немедленно.',
scopeValue: {
marketplace: 'Витрина',
office: 'Бэк-офис',
},
statusValue: {
active: 'Активен',
invited: 'Приглашён',
suspended: 'Заблокирован',
},
invitationStatus: {
pending: 'Ожидает',
accepted: 'Принято',
expired: 'Истекло',
revoked: 'Отозвано',
},
},
adminTransactions: {
search: 'Поиск транзакций',
type: 'Тип',
method: 'Способ оплаты',
fraud: 'Проверка на мошенничество',
flagged: 'Помечено',
retry: 'Повторить',
audit: 'История',
emptyTitle: 'Транзакции не найдены',
emptyDescription: 'Попробуйте изменить фильтр или поисковый запрос.',
status: {
all: 'Все статусы',
pending: 'В обработке',
success: 'Успешно',
failed: 'Ошибка',
retried: 'Повторено',
},
typeValue: {
all: 'Все типы',
payment: 'Оплата',
refund: 'Возврат',
qr_payment: 'Оплата по QR',
},
},
adminMonitoring: {
eventsEmptyTitle: 'События не найдены',
eventsEmptyDescription: 'Попробуйте изменить фильтр категории или поисковый запрос.',
health: 'Проверки состояния',
queues: 'Фоновые очереди',
depth: 'В ожидании',
webhooks: 'Доставка вебхуков',
endpoint: 'Получатель',
event: 'Событие',
events: 'Журнал активности',
category: 'Категория',
level: 'Важность',
message: 'Описание',
categoryValue: {
all: 'Все категории',
audit: 'Действия администраторов',
security: 'Безопасность',
login: 'Вход',
failed_login: 'Неудачный вход',
api: 'API',
error: 'Ошибка',
warning: 'Предупреждение',
},
queueStatus: {
healthy: 'Работает штатно',
degraded: 'Замедлена',
down: 'Остановлена',
},
webhookStatus: {
delivered: 'Доставлено',
failed: 'Ошибка',
pending: 'Ожидает',
},
levelValue: {
info: 'Инфо',
warning: 'Предупреждение',
error: 'Ошибка',
},
systemState: 'Состояние системы',
backendConnectivity: 'Бэкенд',
connected: 'Подключено',
@@ -1603,6 +1693,7 @@ export const ru: Translations = {
adminAnalytics: {
topProductsEmptyTitle: 'Нет продаж товаров за этот период',
topProductsEmptyDescription: 'Попробуйте выбрать более широкий диапазон дат.',
topProducts: 'Топ товаров',
print: 'Печать',
tabsLabel: 'Разделы аналитики',
tab: {