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

@@ -1535,6 +1535,8 @@ export const en: Translations = {
addVariant: 'Add variant',
variantName: 'Variant name',
variantsHint: 'Each variant is a purchasable option of this product, e.g. a size or color, with its own price and stock.',
variants: 'Variants',
archived: 'Archived',
seoExplain: 'This is what shows up in search results — a clear title and description help customers find this product.',
searchTitle: 'Search title',
searchTitleHint: 'The headline shown in search results. Keep it short and descriptive.',
@@ -1590,10 +1592,98 @@ export const en: Translations = {
emptyTitle: 'No users found',
emptyDescription: 'Invite a teammate to get started.',
invitationsEmptyTitle: 'No pending invitations',
title: 'Team members',
name: 'Name',
email: 'Email',
scope: 'Workspace',
role: 'Role',
roles: 'Roles',
lastLogin: 'Last sign-in',
sessions: 'Active sessions',
currentSession: 'This session',
invite: 'Invite member',
sendInvite: 'Send invitation',
revoke: 'Revoke',
passwordlessHint: 'Team members sign in with Telegram - no passwords to manage.',
confirmSuspend: 'Suspend this team member? They will lose access immediately.',
scopeValue: {
marketplace: 'Storefront',
office: 'Back office',
},
statusValue: {
active: 'Active',
invited: 'Invited',
suspended: 'Suspended',
},
invitationStatus: {
pending: 'Pending',
accepted: 'Accepted',
expired: 'Expired',
revoked: 'Revoked',
},
},
adminTransactions: {
search: 'Search transactions',
type: 'Type',
method: 'Payment method',
fraud: 'Fraud check',
flagged: 'Flagged',
retry: 'Retry',
audit: 'History',
emptyTitle: 'No transactions found',
emptyDescription: 'Try a different filter or search term.',
status: {
all: 'All statuses',
pending: 'Pending',
success: 'Successful',
failed: 'Failed',
retried: 'Retried',
},
typeValue: {
all: 'All types',
payment: 'Payment',
refund: 'Refund',
qr_payment: 'QR payment',
},
},
adminMonitoring: {
eventsEmptyTitle: 'No events found',
eventsEmptyDescription: 'Try a different category filter or search term.',
health: 'Health checks',
queues: 'Background queues',
depth: 'Waiting',
webhooks: 'Webhook deliveries',
endpoint: 'Destination',
event: 'Event',
events: 'Activity log',
category: 'Category',
level: 'Severity',
message: 'Description',
categoryValue: {
all: 'All categories',
audit: 'Admin activity',
security: 'Security',
login: 'Sign-in',
failed_login: 'Failed sign-in',
api: 'API',
error: 'Error',
warning: 'Warning',
},
queueStatus: {
healthy: 'Running smoothly',
degraded: 'Slowed down',
down: 'Stopped',
},
webhookStatus: {
delivered: 'Delivered',
failed: 'Failed',
pending: 'Pending',
},
levelValue: {
info: 'Info',
warning: 'Warning',
error: 'Error',
},
systemState: 'System state',
backendConnectivity: 'Backend',
connected: 'Connected',
@@ -1608,6 +1698,7 @@ export const en: Translations = {
adminAnalytics: {
topProductsEmptyTitle: 'No product sales in this period',
topProductsEmptyDescription: 'Try a wider date range.',
topProducts: 'Top products',
print: 'Print',
tabsLabel: 'Analytics sections',
tab: {