import { Button, Card, CardContent, CardHeader, CardTitle, FormField, Input, Label, Badge } from '@/components/ui'; import { useTranslationKeys, useUpdateUITranslation, useBulkUpdateUITranslations, useAutoTranslateMissing } from '@/hooks/api/useAdminAPI.ts'; import { useTranslation } from '@/hooks/useI18n.tsx'; import { Save, Download, Upload, Sparkles, Search } from 'lucide-react'; import { useState, useMemo } from 'react'; import { Combobox } from '@/components/ui/Combobox.tsx'; const LocalizationUIPage = () => { const { t, currentLocale } = useTranslation(); const [selectedLocale, setSelectedLocale] = useState('en'); const [searchTerm, setSearchTerm] = useState(''); const [selectedKey, setSelectedKey] = useState(null); const [translationValue, setTranslationValue] = useState(''); const [isBulkMode, setIsBulkMode] = useState(false); const [bulkUpdates, setBulkUpdates] = useState>({}); const { data: translationKeys, isLoading } = useTranslationKeys(selectedLocale); const { mutate: updateTranslation, isPending: isUpdating } = useUpdateUITranslation(); const { mutate: bulkUpdate, isPending: isBulkUpdating } = useBulkUpdateUITranslations(); const { mutate: autoTranslate, isPending: isAutoTranslating } = useAutoTranslateMissing(); const filteredKeys = useMemo(() => { if (!translationKeys?.keys) return []; if (!searchTerm) return translationKeys.keys; const term = searchTerm.toLowerCase(); return translationKeys.keys.filter( (key) => key.key.toLowerCase().includes(term) || key.source.toLowerCase().includes(term) ); }, [translationKeys?.keys, searchTerm]); const selectedKeyData = useMemo(() => { if (!selectedKey || !translationKeys?.keys) return null; return translationKeys.keys.find((k) => k.key === selectedKey); }, [selectedKey, translationKeys?.keys]); const handleSave = () => { if (!selectedKey) return; updateTranslation( { locale: selectedLocale, key: selectedKey, value: translationValue, }, { onSuccess: () => { // Query will refetch automatically }, } ); }; const handleBulkSave = () => { const updates = Object.entries(bulkUpdates).map(([key, value]) => ({ locale: selectedLocale, key, value, })); bulkUpdate(updates, { onSuccess: () => { setBulkUpdates({}); setIsBulkMode(false); }, }); }; const handleAutoTranslate = () => { autoTranslate( { sourceLocale: 'ru', // Russian is the source targetLocale: selectedLocale, }, { onSuccess: () => { // Query will refetch automatically }, } ); }; const getStatusBadge = (status: string) => { switch (status) { case 'translated': return ✓ Translated; case 'missing': return Missing; default: return {status}; } }; return (
{/* Header */}

{t('adminPage.localization.ui.title') || 'UI Translations'}

{t('adminPage.localization.ui.description') || 'Manage all frontend UI text translations'}

{/* Locale Selector and Stats */}
{translationKeys && (
Total: {translationKeys.total}
Translated: {translationKeys.translated}
Missing: {translationKeys.missing}
)}
{/* Translation Keys List */} Translation Keys setSearchTerm(e.target.value)} icon={} />
{filteredKeys.map((keyData) => (
{ setSelectedKey(keyData.key); setTranslationValue(keyData.value || keyData.source); }} >
{keyData.key} {getStatusBadge(keyData.status)}

{keyData.source}

))}
{/* Translation Editor */} {selectedKey ? `Edit: ${selectedKey}` : 'Select a translation key'} {selectedKeyData && ( <>