'use client'; import type { RefObject } from 'react'; import { useMemo } from 'react'; import { useTranslation } from '../../../i18n/useTranslation'; type LanguageEntry = { code: string; name: string; }; type Props = { headerRef: RefObject; totalKeys: number; onScan: () => void; isScanning: boolean; isAutoFixing: boolean; onBackToAdmin: () => void; isDirty: boolean; onSave: () => void; saved: boolean; saveError: string; allLanguages: LanguageEntry[]; activeLang: string; setActiveLang: (code: string) => void; isBuiltin: (code: string) => boolean; onDeleteLanguageRequest: (code: string) => void; onOpenAddLanguage: () => void; allTabStats: { total: number; translated: number; missing: number }; translationProgressPercent: number; wizardMissingKeysCount: number; onOpenTranslationWizard: () => void; }; export default function LanguageManagementTopSection({ headerRef, totalKeys, onScan, isScanning, isAutoFixing, onBackToAdmin, isDirty, onSave, saved, saveError, allLanguages, activeLang, setActiveLang, isBuiltin, onDeleteLanguageRequest, onOpenAddLanguage, allTabStats, translationProgressPercent, wizardMissingKeysCount, onOpenTranslationWizard, }: Props) { const { t } = useTranslation(); const prioritizedLanguages = useMemo(() => { const byCode = new Map(allLanguages.map((lang) => [lang.code, lang])); const english = byCode.get('en'); const german = byCode.get('de'); const rest = allLanguages .filter((lang) => lang.code !== 'en' && lang.code !== 'de') .sort((a, b) => a.name.localeCompare(b.name)); return [english, german, ...rest].filter((lang): lang is LanguageEntry => Boolean(lang)); }, [allLanguages]); const englishLanguage = prioritizedLanguages.find((lang) => lang.code === 'en'); const germanLanguage = prioritizedLanguages.find((lang) => lang.code === 'de'); const otherLanguages = prioritizedLanguages.filter((lang) => lang.code !== 'en' && lang.code !== 'de'); const renderLanguageButton = (lang: LanguageEntry) => ( ); return ( <> {/* ── Hero header card ─────────────────────────────────── */}
{t('autofix.ka8c928ac')}

{t('autofix.k346a2c64')}

{t('autofix.k7227f13d')} {totalKeys} {t('autofix.k511d7fab')}

{saved && !isDirty && ( {t('autofix.kac6aab53')} )}
{/* stat pills */}
{allLanguages.length} {allLanguages.length === 1 ? t('autofix.k20eb1f87') : t('autofix.ka6cf3286')} {totalKeys} {t('autofix.k3931709b')} {activeLang !== 'en' && ( 0 ? 'border-red-200 bg-red-50 text-red-700' : 'border-emerald-200 bg-emerald-50 text-emerald-700' }`}> {allTabStats.missing > 0 ? `${allTabStats.missing} ${t('autofix.k571ffd91')}` : t('autofix.kdcc78d97')} )}
{/* ── Save error banner ────────────────────────────────── */} {saveError && (
{saveError}
)} {/* ── Language tabs card ───────────────────────────────── */}
{englishLanguage && renderLanguageButton(englishLanguage)} {germanLanguage && renderLanguageButton(germanLanguage)} {otherLanguages.map((lang) => renderLanguageButton(lang))}
{/* ── Translation progress card ────────────────────────── */} {activeLang !== 'en' && (
{t('autofix.kb8f33873')} {allTabStats.translated} / {allTabStats.total} {t('autofix.k33f55455')}
{translationProgressPercent}%
)} {/* ── Wizard nudge card ────────────────────────────────── */} {activeLang !== 'en' && allTabStats.missing > 0 && wizardMissingKeysCount > 0 && (

{t('autofix.k5e5e8744')}

{allLanguages.find((l) => l.code === activeLang)?.name ?? activeLang} still has{' '} {wizardMissingKeysCount}{t('autofix.k0a50d234')}

)} ); }