import { useSyncExternalStore } from "react";

export type Locale = "ru" | "en";

const STORAGE_KEY = "steampanel_locale";

let _locale: Locale = (localStorage.getItem(STORAGE_KEY) as Locale) || "ru";
const _listeners = new Set<() => void>();

function notify() {
  _listeners.forEach((l) => l());
}

export function getLocale(): Locale {
  return _locale;
}

export function setLocale(l: Locale) {
  _locale = l;
  localStorage.setItem(STORAGE_KEY, l);
  notify();
}

export function useLocale(): [Locale, (l: Locale) => void] {
  const locale = useSyncExternalStore(
    (cb) => {
      _listeners.add(cb);
      return () => _listeners.delete(cb);
    },
    () => _locale,
  );
  return [locale, setLocale];
}

type Dict = Record<string, string>;
type Translations = { ru: Dict; en: Dict };

const translations: Translations = {
  ru: {
    // -- Layout --
    "header.accounts": "Аккаунтов",
    // -- Tabs --
    "tab.accounts": "Аккаунты",
    "tab.mafiles": "Mafile Management",
    "tab.tools": "Настройки",
    "tab.logs": "Логи",
    // -- Section labels --
    "section.dataType": "Тип данных",
    // -- Column headers (shared) --
    "col.browser": "Войти",
    "col.profile": "Профиль",
    "col.lastOnline": "Отлега",
    "col.steamId": "Steam ID",
    "col.login": "Логин",
    "col.password": "Пароль",
    "col.loginPass": "Login:Pass",
    "col.email": "Email",
    "col.emailPass": "Email Pass",
    "col.emailLoginPass": "Email:Pass",
    "col.phone": "Телефон",
    "col.status": "Статус",
    "col.ban": "Бан",
    "col.vac": "VAC",
    "col.limit": "Лимит",
    "col.twofa": "2FA",
    "col.mafile": "Mafile",
    "col.proxy": "Прокси",
    "col.notes": "Заметки",
    "col.actions": "Действия",
    "col.prime": "Prime",
    "col.trophy": "Trophy",
    "col.behavior": "Behavior",
    "col.license": "Лицензии",
    "col.token": "Токен",
    "col.balance": "Баланс",
    "col.country": "Страна",
    // -- Actions --
    "action.selectAction": "— Действие",
    "action.validate": "Валидация",
    "action.changePassword": "Сменить пароль",
    "action.randomPassword": "Случайный пароль",
    "action.changeEmail": "Сменить email",
    "action.changePhone": "Сменить телефон",
    "action.removePhone": "Удалить телефон",
    "action.removeGuard": "Удалить Guard",
    "action.noRevocationCode": "Нет revocation_code в mafile",
    "action.enableAutoAccept": "Вкл. автопринятие",
    "action.disableAutoAccept": "Выкл. авто-принятие входа",
    "action.enableAutoAcceptLogin": "Вкл. авто-принятие входа",
    "action.enableAutoConfirm": "Вкл. авто-подтверждения",
    "action.disableAutoConfirm": "Выкл. авто-подтверждения",
    "tip.autoConfirmActive": "Авто-подтверждения включены",
    "action.generate2fa": "Сгенерировать 2FA код",
    "action.confirmations": "Подтверждения",
    // -- Action prompts --
    "prompt.newPassword": "Введите новый пароль",
    "prompt.newEmail": "Введите новый email",
    "prompt.newPhone": "Введите новый номер телефона",
    "prompt.removePhone":
      "Введите номер телефона (на который переставится старый)",
    "prompt.enterValue": "Введите значение...",
    // -- Confirm dialogs --
    "confirm.removeGuard": "Удалить Steam Guard для этого аккаунта?",
    "confirm.deleteAccount": "Удалить аккаунт?",
    "confirm.deleteSelected": "Удалить {count} выбранных аккаунтов?",
    "confirm.deleteAll": "Удалить ВСЕ {count} аккаунтов? Это необратимо!",
    "confirm.deleteLogpassSelected": "Удалить {count} аккаунт(ов)?",
    "confirm.deleteLogpassAll": "Удалить все {count} аккаунтов?",
    "confirm.deleteTokenSelected": "Удалить {count} токен(ов)?",
    "confirm.deleteTokenAll": "Удалить все {count} токенов?",
    "confirm.deleteToken": "Удалить токен {name}?",
    "confirm.deleteLogpass": "Удалить {name}?",
    "confirm.assignProxies": "Назначить прокси аккаунтам без прокси?",
    "confirm.reassignProxies": "Переназначить прокси на все аккаунты?",
    "confirm.reassignProxiesAll": "Переназначить прокси всем аккаунтам?",
    "confirm.clearProxies": "Очистить прокси у всех аккаунтов?",
    "confirm.executeBulk": "Выполнить «{action}» для {count} аккаунтов?",
    "confirm.yes": "Да",
    "confirm.title": "Подтверждения",
    "confirm.loading": "Загрузка подтверждений...",
    "confirm.empty": "Нет ожидающих подтверждений",
    "confirm.acceptAll": "Принять все",
    "confirm.denyAll": "Отклонить все",
    "confirm.refresh": "Обновить",
    "confirm.accepted": "Принято",
    "confirm.denied": "Отклонено",
    "confirm.respondFailed": "Не удалось обработать подтверждение",
    // -- Buttons --
    "btn.import": "Импорт",
    "btn.add": "Добавить",
    "btn.save": "Сохранить",
    "btn.cancel": "Отмена",
    "btn.execute": "Выполнить",
    "btn.deleteSelected": "Удалить выбранные",
    "btn.deleteAll": "Удалить все",
    "btn.assignProxies": "Назначить прокси",
    "btn.reassign": "Переназначить",
    "btn.clearProxies": "Очистить прокси",
    "btn.validate": "Валидировать",
    "btn.fullParse": "Полный парс",
    "btn.fullCheck": "Полная проверка",
    "btn.generate": "Сгенерировать",
    // -- Toast messages --
    "toast.copied": "Скопировано",
    "toast.copyFailed": "Не удалось скопировать",
    "toast.noteSaved": "Заметка сохранена",
    "toast.noteSaveError": "Ошибка сохранения",
    "toast.accountDeleted": "Аккаунт удален",
    "toast.accountAdded": "Аккаунт добавлен",
    "toast.saved": "Сохранено",
    "toast.done": "Готово",
    "toast.error": "Ошибка",
    "toast.selectAction": "Выберите действие",
    "toast.selectAccounts": "Выберите аккаунты",
    "toast.noAccounts": "Нет аккаунтов",
    "toast.autoAcceptEnabled": "Автопринятие включено для {count} акк.",
    "toast.autoAcceptOn": "Авто-принятие входа включено",
    "toast.autoAcceptOff": "Авто-принятие входа выключено",
    "toast.taskCancelled": "Задача отменена",
    "toast.browserOpening": "Браузер открывается...",
    "toast.cookiesExpiredRevalidating":
      "Куки устарели. Запущена повторная валидация...",
    "toast.cookiesExpired": "Куки устарели. Провалидируйте аккаунт заново.",
    "toast.proxyCleared": "Прокси убран у {name}",
    "toast.proxiesReassigned": "Переназначено {used} прокси на {count} акк.",
    "toast.proxiesAssigned": "Назначено {used} прокси на {count} аккаунтов",
    "toast.proxiesAssignedShort": "Назначено {count} аккаунтам",
    "toast.proxiesReassignedShort": "Переназначено {count} аккаунтам",
    "toast.proxiesClearedCount": "Очищено прокси у {count} аккаунтов",
    "toast.proxiesClearedShort": "Очищено у {count} аккаунтов",
    "toast.deleted": "Удалено: {count}",
    "toast.sentToMafile": "{count} акк. отправлено в Mafile Management",
    "toast.settingsSaved": "Настройки сохранены",
    "toast.proxyFormatError": "Не удалось распознать прокси. Проверьте формат.",
    "toast.proxiesAdded": "Добавлено {count} прокси",
    "toast.proxiesDeleted": "Удалено {count} прокси",
    "toast.exportDone": "Экспорт завершён",
    "toast.uploaded": "Загружено: {count}",
    "toast.uploadedWithErrors": "Загружено: {uploaded}, ошибок: {errors}",
    "toast.importResult": "Импортировано: {imported}, Пропущено: {skipped}",
    "toast.fileEmpty": "Файл пуст",
    // -- Task types --
    "task.validate": "Валидация",
    "task.changePassword": "Смена пароля",
    "task.randomPassword": "Случ. пароль",
    "task.changeEmail": "Смена email",
    "task.changePhone": "Смена телефона",
    "task.removePhone": "Удал. телефона",
    "task.removeGuard": "Удал. Guard",
    // -- Badges / statuses --
    "status.unknown": "Неизвестен",
    "status.valid": "Валидный",
    "status.invalid": "Невалидный",
    "status.locked": "Заблокирован",
    "status.limited": "Ограничен",
    "status.banned": "БАН",
    "status.ok": "ОК",
    // -- Tooltips --
    "tip.openBrowser": "Открыть Steam в браузере",
    "tip.copyPassword": "Копировать пароль",
    "tip.copyLoginPass": "Копировать login:pass",
    "tip.copyEmailPass": "Копировать пароль email",
    "tip.copyEmailLoginPass": "Копировать email:pass",
    "tip.show": "Показать",
    "tip.hide": "Скрыть",
    "tip.gen2fa": "Сгенерировать и скопировать 2FA код",
    "tip.code": "Код",
    "tip.addNote": "Нажмите чтобы добавить заметку",
    "tip.edit": "Редактировать",
    "tip.delete": "Удалить",
    "tip.autoAcceptActive": "Авто-принятие входа",
    "tip.validate": "Валидировать",
    "tip.columnSettings": "Настройки столбцов",
    "tip.deleteProxy": "Удалить прокси",
    "tip.clickToCopy": "Клик для копирования",
    "tip.proxyError": "Ошибка прокси: {error}",
    // -- Placeholders --
    "ph.search": "Поиск: логин / Steam ID / заметка / lvl>10",
    "ph.searchLogpass": "Поиск: логин / Steam ID / заметка / игра / lvl>10",
    "ph.login": "Логин",
    "ph.password": "Пароль",
    "ph.proxy": "Прокси",
    "ph.proxyOptional": "Прокси (необязательно)",
    "ph.notes": "Заметки",
    "ph.notesOptional": "Заметки (необязательно)",
    "ph.loginOptional": "Логин (необязательно)",
    "ph.emailPassword": "Пароль от email",
    // -- Empty states --
    "empty.accounts": "Нет аккаунтов. Импортируйте файл",
    "empty.logpass": "Аккаунтов нет. Импортируйте файл.",
    "empty.tokens": "Токенов нет. Импортируйте или добавьте токены.",
    "empty.logs": "Нет логов",
    "empty.tasks": "Нет задач",
    // -- Modals --
    "modal.addAccount": "Добавить аккаунт",
    "modal.editAccount": "Редактировать аккаунт",
    "modal.importAccounts": "Импорт аккаунтов",
    "modal.addToken": "Добавить токен",
    "modal.importTokens": "Импорт токенов",
    // -- Import --
    "import.formats": "Форматы",
    "import.formatsColon": "Форматы:",
    "import.delimiter": "разделитель",
    "import.or": "или",
    "import.dragTxt": "Перетащите .txt файл или нажмите для выбора",
    "import.dragTxtCsv": "Перетащите .txt / .csv файл или нажмите для выбора",
    "import.dragMafile": "Перетащите .mafile файлы или нажмите для выбора",
    "import.attachMafile": "Прикрепить .mafile (необязательно)",
    "import.selected": "Выбран: {name}",
    "import.uploading": "Загрузка...",
    "import.importBtn": "Импортировать",
    "import.tokenFormat": "refresh_token (по одному на строку)",
    // -- Pagination --
    "paging.shown": "Показано {visible} из {total}…",
    // -- Proxy labels --
    "proxy.label": "Прокси {num}",
    "proxy.title": "Прокси",
    "proxy.count": "{count} шт.",
    "proxy.protocol": "Протокол:",
    "proxy.format": "Формат:",
    "proxy.customFormat": "Свой формат...",
    "proxy.formatConstructor": "Конструктор формата:",
    "proxy.preview": "Предпросмотр:",
    "proxy.dragFile": "Перетащите .txt файл с прокси или нажмите для выбора",
    "proxy.addBtn": "Добавить",
    "proxy.checking": "Проверка...",
    "proxy.checkAll": "Проверить все",
    "proxy.deleteAllBtn": "Удалить все прокси",
    "proxy.confirmDeleteAll":
      "Удалить все прокси? Это действие нельзя отменить.",
    "proxy.checkResult": "Всего: {total} | Живых: {alive} | Мёртвых: {dead}",
    "proxy.removeProxy": "Убрать прокси",
    "proxy.reassignProxy": "Переназначить прокси",
    "proxy.perLine": "Прокси по одному на строку ({format})",
    "proxy.deleteProxy": "Удалить прокси",
    // -- Tools --
    "tools.2faGenerator": "Генератор 2FA кода",
    "tools.validationSettings": "Настройки валидации",
    "tools.loadProfile": "Загружать профиль (никнейм, аватар)",
    "tools.checkBans": "Проверять баны",
    "tools.maxThreads": "Макс. потоков:",
    "tools.autoRevalidateBrowser": "Автовалидация при мёртвых куках (браузер)",
    "tools.autoProxyOnImport": "Авто-назначение прокси при импорте",
    "tools.autoValidateOnImport": "Авто-валидация при импорте",
    "tools.importSettings": "Настройки импорта",
    "tools.autoProxyOnImportDesc": "Авто-назначить прокси сразу после импорта",
    "tools.autoValidateOnImportDesc":
      "Авто-валидировать аккаунты сразу после импорта",
    "tools.importTabMafile": "Mafile",
    "tools.importTabLogpass": "Log:Pass",
    "tools.importTabToken": "Token",
    "tools.clickCopy": "Клик для копирования",
    "tools.genErrorStr": "Ошибка",
    "tools.servicesSettings": "Фоновые сервисы",
    "tools.autoAcceptInterval": "Интервал auto-accept (сек):",
    "tools.autoConfirmInterval": "Интервал auto-confirm (сек):",
    // -- Logs panel --
    "logs.title": "Лог",
    "logs.clear": "Очистить",
    "logs.activeTasks": "Активные задачи",
    // -- Mafile tab --
    "mafile.upload": "Загрузка Mafile",
    "mafile.exportSettings": "Настройки экспорта",
    "mafile.exportFormat": "Формат:",
    "mafile.flatFiles": "Плоские файлы (.mafile)",
    "mafile.perAccountFolder": "Папка на аккаунт",
    "mafile.singleFile": "Одним файлом",
    "mafile.variables": "Переменные:",
    "mafile.folderName": "Название папки:",
    "mafile.mafileName": "Название .mafile:",
    "mafile.txtSettings": "Настройки .txt",
    "mafile.addGlobalTxt": "Добавить общий",
    "mafile.withAllAccounts": "со всеми аккаунтами",
    "mafile.addTxtPerFolder": "Добавить .txt в каждую папку",
    "mafile.skipFolders": "Не создавать папку для каждого аккаунта",
    "mafile.txtFolderName": "Название .txt в папке:",
    "mafile.txtLineFormat": "Формат строки .txt:",
    "mafile.mafileFields": "Поля Mafile",
    "mafile.sessionFields": "Поля Session",
    "mafile.export": "Экспорт",
    "mafile.noAccounts": "нет аккаунтов",
    "mafile.sentAccounts": "Отправленные аккаунты",
    "mafile.clearBtn": "Очистить",
    "mafile.insert": "Вставить {value}",
    "mafile.emptyTitle": "Нет выбранных аккаунтов",
    "mafile.emptyHint":
      "Выберите аккаунты в таблице и отправьте сюда для экспорта mafile",
    "mafile.accountsCount": "акк.",
    "mafile.withMafile": "с mafile",
    "mafile.namingSection": "Шаблоны имён",
    "mafile.flat_mafiles": "Файлы",
    "mafile.per_account_folder": "Папки",
    "mafile.single_file": "Один файл",
    // -- Settings drawer --
    "settings.display": "Отображение",
    "settings.hidePasswords": "Скрывать пароли (спойлер)",
    // -- Token disclaimer --
    "token.disclaimerTitle": "Вкладка в разработке",
    "token.disclaimerBody1":
      "Функциональность вкладки Token <strong>не завершена</strong> и находится в стадии разработки.",
    "token.disclaimerBody2":
      "⚠ Валидация токенов может привести к их инвалидации (убить токены). Используйте на свой страх и риск.",
    "token.disclaimerBody3":
      "Импорт, редактирование и любые действия с токенами могут работать некорректно.",
    "token.acceptRisk": "Я понимаю риски и хочу продолжить",
    // -- 2FA --
    "twofa.copied": "2FA: {code} (скопировано)",
    "twofa.error": "Ошибка 2FA: {error}",
    // -- Misc --
    "misc.task": "Задача {id}",
    "misc.taskAction": "Задача {id} - {action} ({login})",
    "misc.taskCount": "Задача {id} ({count} акк.)",
    "misc.error": "Ошибка: {error}",
    "misc.proxyErrorCheck": "Ошибка проверки: {error}",
    "misc.exportError": "Ошибка экспорта: {error}",
    "misc.genError": "Ошибка генерации: {error}",
    "misc.errorStr": "Ошибка",
    "misc.insert": "Вставить",
  },

  en: {
    // -- Layout --
    "header.accounts": "Accounts",
    // -- Tabs --
    "tab.accounts": "Accounts",
    "tab.mafiles": "Mafile Management",
    "tab.tools": "Settings",
    "tab.logs": "Logs",
    // -- Section labels --
    "section.dataType": "Data Type",
    // -- Column headers --
    "col.browser": "Login",
    "col.profile": "Profile",
    "col.lastOnline": "Last Online",
    "col.steamId": "Steam ID",
    "col.login": "Login",
    "col.password": "Password",
    "col.loginPass": "Login:Pass",
    "col.email": "Email",
    "col.emailPass": "Email Pass",
    "col.emailLoginPass": "Email:Pass",
    "col.phone": "Phone",
    "col.status": "Status",
    "col.ban": "Ban",
    "col.vac": "VAC",
    "col.limit": "Limit",
    "col.twofa": "2FA",
    "col.mafile": "Mafile",
    "col.proxy": "Proxy",
    "col.notes": "Notes",
    "col.actions": "Actions",
    "col.prime": "Prime",
    "col.trophy": "Trophy",
    "col.behavior": "Behavior",
    "col.license": "Licenses",
    "col.token": "Token",
    "col.balance": "Balance",
    "col.country": "Country",
    // -- Actions --
    "action.selectAction": "— Action",
    "action.validate": "Validate",
    "action.changePassword": "Change password",
    "action.randomPassword": "Random password",
    "action.changeEmail": "Change email",
    "action.changePhone": "Change phone",
    "action.removePhone": "Remove phone",
    "action.removeGuard": "Remove Guard",
    "action.noRevocationCode": "No revocation_code in mafile",
    "action.enableAutoAccept": "Enable auto-accept",
    "action.disableAutoAccept": "Disable login auto-accept",
    "action.enableAutoAcceptLogin": "Enable login auto-accept",
    "action.enableAutoConfirm": "Enable auto-confirm",
    "action.disableAutoConfirm": "Disable auto-confirm",
    "tip.autoConfirmActive": "Auto-confirm active",
    "action.generate2fa": "Generate 2FA code",
    "action.confirmations": "Confirmations",
    // -- Action prompts --
    "prompt.newPassword": "Enter new password",
    "prompt.newEmail": "Enter new email",
    "prompt.newPhone": "Enter new phone number",
    "prompt.removePhone":
      "Enter phone number (old number will be transferred to it)",
    "prompt.enterValue": "Enter value...",
    // -- Confirm dialogs --
    "confirm.removeGuard": "Remove Steam Guard for this account?",
    "confirm.deleteAccount": "Delete account?",
    "confirm.deleteSelected": "Delete {count} selected accounts?",
    "confirm.deleteAll": "Delete ALL {count} accounts? This is irreversible!",
    "confirm.deleteLogpassSelected": "Delete {count} account(s)?",
    "confirm.deleteLogpassAll": "Delete all {count} accounts?",
    "confirm.deleteTokenSelected": "Delete {count} token(s)?",
    "confirm.deleteTokenAll": "Delete all {count} tokens?",
    "confirm.deleteToken": "Delete token {name}?",
    "confirm.deleteLogpass": "Delete {name}?",
    "confirm.assignProxies": "Assign proxies to accounts without proxies?",
    "confirm.reassignProxies": "Reassign proxies to all accounts?",
    "confirm.reassignProxiesAll": "Reassign proxies to all accounts?",
    "confirm.clearProxies": "Clear proxies from all accounts?",
    "confirm.executeBulk": "Execute «{action}» for {count} accounts?",
    "confirm.yes": "Yes",
    "confirm.title": "Confirmations",
    "confirm.loading": "Loading confirmations...",
    "confirm.empty": "No pending confirmations",
    "confirm.acceptAll": "Accept all",
    "confirm.denyAll": "Deny all",
    "confirm.refresh": "Refresh",
    "confirm.accepted": "Accepted",
    "confirm.denied": "Denied",
    "confirm.respondFailed": "Failed to process confirmation",
    // -- Buttons --
    "btn.import": "Import",
    "btn.add": "Add",
    "btn.save": "Save",
    "btn.cancel": "Cancel",
    "btn.execute": "Execute",
    "btn.deleteSelected": "Delete selected",
    "btn.deleteAll": "Delete all",
    "btn.assignProxies": "Assign proxies",
    "btn.reassign": "Reassign",
    "btn.clearProxies": "Clear proxies",
    "btn.validate": "Validate",
    "btn.fullParse": "Full parse",
    "btn.fullCheck": "Full Check",
    "btn.generate": "Generate",
    // -- Toast messages --
    "toast.copied": "Copied",
    "toast.copyFailed": "Failed to copy",
    "toast.noteSaved": "Note saved",
    "toast.noteSaveError": "Error saving",
    "toast.accountDeleted": "Account deleted",
    "toast.accountAdded": "Account added",
    "toast.saved": "Saved",
    "toast.done": "Done",
    "toast.error": "Error",
    "toast.selectAction": "Select an action",
    "toast.selectAccounts": "Select accounts",
    "toast.noAccounts": "No accounts",
    "toast.autoAcceptEnabled": "Auto-accept enabled for {count} accounts",
    "toast.autoAcceptOn": "Login auto-accept enabled",
    "toast.autoAcceptOff": "Login auto-accept disabled",
    "toast.taskCancelled": "Task cancelled",
    "toast.browserOpening": "Opening browser...",
    "toast.cookiesExpiredRevalidating": "Cookies expired. Re-validating...",
    "toast.cookiesExpired": "Cookies expired. Re-validate the account.",
    "toast.proxyCleared": "Proxy removed from {name}",
    "toast.proxiesReassigned": "Reassigned {used} proxies to {count} accounts",
    "toast.proxiesAssigned": "Assigned {used} proxies to {count} accounts",
    "toast.proxiesAssignedShort": "Assigned to {count} accounts",
    "toast.proxiesReassignedShort": "Reassigned to {count} accounts",
    "toast.proxiesClearedCount": "Cleared proxies from {count} accounts",
    "toast.proxiesClearedShort": "Cleared from {count} accounts",
    "toast.deleted": "Deleted: {count}",
    "toast.sentToMafile": "{count} accounts sent to Mafile Management",
    "toast.settingsSaved": "Settings saved",
    "toast.proxyFormatError": "Failed to parse proxies. Check the format.",
    "toast.proxiesAdded": "Added {count} proxies",
    "toast.proxiesDeleted": "Deleted {count} proxies",
    "toast.exportDone": "Export complete",
    "toast.uploaded": "Uploaded: {count}",
    "toast.uploadedWithErrors": "Uploaded: {uploaded}, errors: {errors}",
    "toast.importResult": "Imported: {imported}, Skipped: {skipped}",
    "toast.fileEmpty": "File is empty",
    // -- Task types --
    "task.validate": "Validation",
    "task.changePassword": "Password change",
    "task.randomPassword": "Random password",
    "task.changeEmail": "Email change",
    "task.changePhone": "Phone change",
    "task.removePhone": "Phone removal",
    "task.removeGuard": "Guard removal",
    // -- Badges / statuses --
    "status.unknown": "Unknown",
    "status.valid": "Valid",
    "status.invalid": "Invalid",
    "status.locked": "Locked",
    "status.limited": "Limited",
    "status.banned": "BANNED",
    "status.ok": "OK",
    // -- Tooltips --
    "tip.openBrowser": "Open Steam in browser",
    "tip.copyPassword": "Copy password",
    "tip.copyLoginPass": "Copy login:pass",
    "tip.copyEmailPass": "Copy email password",
    "tip.copyEmailLoginPass": "Copy email:pass",
    "tip.show": "Show",
    "tip.hide": "Hide",
    "tip.gen2fa": "Generate and copy 2FA code",
    "tip.code": "Code",
    "tip.addNote": "Click to add a note",
    "tip.edit": "Edit",
    "tip.delete": "Delete",
    "tip.autoAcceptActive": "Login auto-accept",
    "tip.validate": "Validate",
    "tip.columnSettings": "Column settings",
    "tip.deleteProxy": "Delete proxy",
    "tip.clickToCopy": "Click to copy",
    "tip.proxyError": "Proxy error: {error}",
    // -- Placeholders --
    "ph.search": "Search: login / Steam ID / notes / lvl>10",
    "ph.searchLogpass": "Search: login / Steam ID / notes / game / lvl>10",
    "ph.login": "Login",
    "ph.password": "Password",
    "ph.proxy": "Proxy",
    "ph.proxyOptional": "Proxy (optional)",
    "ph.notes": "Notes",
    "ph.notesOptional": "Notes (optional)",
    "ph.loginOptional": "Login (optional)",
    "ph.emailPassword": "Email password",
    // -- Empty states --
    "empty.accounts": "No accounts. Import a file",
    "empty.logpass": "No accounts. Import a file.",
    "empty.tokens": "No tokens. Import or add tokens.",
    "empty.logs": "No logs",
    "empty.tasks": "No tasks",
    // -- Modals --
    "modal.addAccount": "Add account",
    "modal.editAccount": "Edit account",
    "modal.importAccounts": "Import accounts",
    "modal.addToken": "Add token",
    "modal.importTokens": "Import tokens",
    // -- Import --
    "import.formats": "Formats",
    "import.formatsColon": "Formats:",
    "import.delimiter": "delimiter",
    "import.or": "or",
    "import.dragTxt": "Drag a .txt file or click to select",
    "import.dragTxtCsv": "Drag a .txt / .csv file or click to select",
    "import.dragMafile": "Drag .mafile files or click to select",
    "import.attachMafile": "Attach .mafile (optional)",
    "import.selected": "Selected: {name}",
    "import.uploading": "Uploading...",
    "import.importBtn": "Import",
    "import.tokenFormat": "refresh_token (one per line)",
    // -- Pagination --
    "paging.shown": "Showing {visible} of {total}…",
    // -- Proxy labels --
    "proxy.label": "Proxy {num}",
    "proxy.title": "Proxies",
    "proxy.count": "{count} total",
    "proxy.protocol": "Protocol:",
    "proxy.format": "Format:",
    "proxy.customFormat": "Custom format...",
    "proxy.formatConstructor": "Format constructor:",
    "proxy.preview": "Preview:",
    "proxy.dragFile": "Drag a .txt file with proxies or click to select",
    "proxy.addBtn": "Add",
    "proxy.checking": "Checking...",
    "proxy.checkAll": "Check all",
    "proxy.deleteAllBtn": "Delete all proxies",
    "proxy.confirmDeleteAll": "Delete all proxies? This cannot be undone.",
    "proxy.checkResult": "Total: {total} | Alive: {alive} | Dead: {dead}",
    "proxy.removeProxy": "Remove proxy",
    "proxy.reassignProxy": "Reassign proxy",
    "proxy.perLine": "Proxies one per line ({format})",
    "proxy.deleteProxy": "Delete proxy",
    // -- Tools --
    "tools.2faGenerator": "2FA Code Generator",
    "tools.validationSettings": "Validation Settings",
    "tools.loadProfile": "Load profile (nickname, avatar)",
    "tools.checkBans": "Check bans",
    "tools.maxThreads": "Max threads:",
    "tools.autoRevalidateBrowser": "Auto-revalidate on dead cookies (browser)",
    "tools.autoProxyOnImport": "Auto-assign proxies on import",
    "tools.autoValidateOnImport": "Auto-validate on import",
    "tools.importSettings": "Import Settings",
    "tools.autoProxyOnImportDesc": "Auto-assign proxies right after import",
    "tools.autoValidateOnImportDesc":
      "Auto-validate accounts right after import",
    "tools.importTabMafile": "Mafile",
    "tools.importTabLogpass": "Log:Pass",
    "tools.importTabToken": "Token",
    "tools.clickCopy": "Click to copy",
    "tools.genErrorStr": "Error",
    "tools.servicesSettings": "Background Services",
    "tools.autoAcceptInterval": "Auto-accept interval (sec):",
    "tools.autoConfirmInterval": "Auto-confirm interval (sec):",
    // -- Logs panel --
    "logs.title": "Log",
    "logs.clear": "Clear",
    "logs.activeTasks": "Active Tasks",
    // -- Mafile tab --
    "mafile.upload": "Upload Mafile",
    "mafile.exportSettings": "Export Settings",
    "mafile.exportFormat": "Format:",
    "mafile.flatFiles": "Flat files (.mafile)",
    "mafile.perAccountFolder": "Folder per account",
    "mafile.singleFile": "Single file",
    "mafile.variables": "Variables:",
    "mafile.folderName": "Folder name:",
    "mafile.mafileName": ".mafile name:",
    "mafile.txtSettings": ".txt Settings",
    "mafile.addGlobalTxt": "Add global",
    "mafile.withAllAccounts": "with all accounts",
    "mafile.addTxtPerFolder": "Add .txt to each folder",
    "mafile.skipFolders": "Don't create folder for each account",
    "mafile.txtFolderName": ".txt name in folder:",
    "mafile.txtLineFormat": ".txt line format:",
    "mafile.mafileFields": "Mafile Fields",
    "mafile.sessionFields": "Session Fields",
    "mafile.export": "Export",
    "mafile.noAccounts": "no accounts",
    "mafile.sentAccounts": "Sent Accounts",
    "mafile.clearBtn": "Clear",
    "mafile.insert": "Insert {value}",
    "mafile.emptyTitle": "No accounts selected",
    "mafile.emptyHint":
      "Select accounts in the table and send them here for mafile export",
    "mafile.accountsCount": "accs",
    "mafile.withMafile": "with mafile",
    "mafile.namingSection": "Naming templates",
    "mafile.flat_mafiles": "Files",
    "mafile.per_account_folder": "Folders",
    "mafile.single_file": "Single file",
    // -- Settings drawer --
    "settings.display": "Display",
    "settings.hidePasswords": "Hide passwords (spoiler)",
    // -- Token disclaimer --
    "token.disclaimerTitle": "Tab under development",
    "token.disclaimerBody1":
      "Token tab functionality is <strong>not complete</strong> and is under development.",
    "token.disclaimerBody2":
      "⚠ Token validation may invalidate (kill) tokens. Use at your own risk.",
    "token.disclaimerBody3":
      "Import, editing and any actions with tokens may work incorrectly.",
    "token.acceptRisk": "I understand the risks and want to continue",
    // -- 2FA --
    "twofa.copied": "2FA: {code} (copied)",
    "twofa.error": "2FA Error: {error}",
    // -- Misc --
    "misc.task": "Task {id}",
    "misc.taskAction": "Task {id} - {action} ({login})",
    "misc.taskCount": "Task {id} ({count} accounts)",
    "misc.error": "Error: {error}",
    "misc.proxyErrorCheck": "Check error: {error}",
    "misc.exportError": "Export error: {error}",
    "misc.genError": "Generation error: {error}",
    "misc.errorStr": "Error",
    "misc.insert": "Insert",
  },
};

export function t(
  key: string,
  params?: Record<string, string | number>,
): string {
  const dict = translations[_locale] || translations.ru;
  let text = dict[key] ?? translations.ru[key] ?? key;
  if (params) {
    for (const [k, v] of Object.entries(params)) {
      text = text.replace(`{${k}}`, String(v));
    }
  }
  return text;
}

export function useT() {
  useSyncExternalStore(
    (cb) => {
      _listeners.add(cb);
      return () => _listeners.delete(cb);
    },
    () => _locale,
  );
  return t;
}
