import { Button, Card, CardContent, CardHeader, CardTitle, FormField, Input, Label, Badge, } from '@/components/ui'; import { useTranslationKeys, useUpdateUITranslation, 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 } = useTranslation(); const [selectedLocale, setSelectedLocale] = useState('en'); const [searchTerm, setSearchTerm] = useState(''); const [selectedKey, setSelectedKey] = useState(null); const [translationValue, setTranslationValue] = useState(''); const { data: translationKeys } = useTranslationKeys(selectedLocale); const { mutate: updateTranslation, isPending: isUpdating } = useUpdateUITranslation(); 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, searchTerm]); const selectedKeyData = useMemo(() => { if (!selectedKey || !translationKeys?.keys) return null; return translationKeys.keys.find((k) => k.key === selectedKey); }, [selectedKey, translationKeys]); const handleSave = () => { if (!selectedKey) return; updateTranslation( { locale: selectedLocale, key: selectedKey, value: translationValue, }, { onSuccess: () => { // Query will refetch automatically }, } ); }; 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 {t('admin.localization.ui.translatedBadge')}; case 'missing': return {t('admin.localization.ui.missingBadge')}; default: return {status}; } }; return (
{/* Header */}

{t('admin.localization.ui.title')}

{t('admin.localization.ui.description')}

{/* Locale Selector and Stats */}
{translationKeys && (
{t('admin.localization.ui.total')} {translationKeys.total}
{t('admin.localization.ui.translated')} {translationKeys.translated}
{t('admin.localization.ui.missing')} {translationKeys.missing}
)}
{/* Translation Keys List */} {t('admin.localization.ui.translationKeys')} 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 ? `${t('admin.localization.ui.editPrefix')} ${selectedKey}` : t('admin.localization.ui.selectKey')} {selectedKeyData && ( <>