// i18n — Ukrainian / English translations

const _T = {
  en: {
    // Common
    loading:      'Loading…',
    saving:       'Saving…',
    save:         'Save',
    cancel:       'Cancel',
    retry:        'Retry',
    edit:         'Edit',
    online:       'Online',
    offline:      'Offline',
    warning:      'Warning',
    all:          'All',
    any:          'Any',
    players:      'Players',
    servers:      'Servers',
    region:       'Region',
    status:       'Status',
    host:         'Host',
    name:         'Name',
    id:           'ID',
    drift:        'Config drift',
    slots:        'Slots',
    ping:         'Ping',

    // Mods Matrix
    'nav.mods':            'Mods Matrix',
    'mods.title':          'Mods Matrix',
    'mods.subtitle':       'Mod versions across all servers',
    'mods.loading':        'Reading configs…',
    'mods.refresh':        '↻ Refresh',
    'mods.refreshing':     '↻ Refreshing…',
    'mods.filter_diff':    'Differences only',
    'mods.search':         'Search mod…',
    'mods.col_mod':        'Mod',
    'mods.col_id':         'Workshop ID',
    'mods.no_mods':        'No mods found.',
    'mods.not_installed':  '—',
    'mods.panel_title':    'Update mod',
    'mods.target_version':    'Target version',
    'mods.version_placeholder': 'empty = auto/latest',
    'mods.apply_to':       'Apply to',
    'mods.select_all':     'All',
    'mods.select_none':    'None',
    'mods.apply_btn':      'Apply',
    'mods.applying':       'Applying…',
    'mods.done':           '✓ Updated {n} server(s)',
    'mods.errors':         '✗ Errors on {n} server(s)',
    'mods.out_of_sync':    'out of sync',
    'mods.not_on_server':  'not installed',
    'mods.stats':          '{total} mods · {diff} out of sync',
    'mods.tab_matrix':     'Matrix',
    'mods.tab_server':     'Per-server',
    'mods.remove_btn':     'Remove',
    'mods.apply_add_btn':  'Apply / Add',
    'mods.installed':      'Installed',
    'mods.missing':        'Missing',
    'mods.select_all':     'Select all',
    'mods.select_none':    'Deselect all',
    'mods.select_server':  'Select server…',
    'mods.no_mods_server': 'No mods on this server.',
    'mods.add_mod':        '+ Add mod',
    'mods.add_mod_title':  'Add mod',
    'mods.field_url':      'Workshop URL or ID-slug',
    'mods.looking_up':     'Fetching mod info…',
    'mods.lookup_failed':  'Could not fetch mod info',
    'mods.field_workshop': 'Workshop ID',
    'mods.field_name':     'Mod name',
    'mods.field_version':  'Version',
    'mods.save_btn':       'Save',
    'mods.saved':          '✓ Saved to Gitea',
    'mods.col_order':      '#',
    'mods.already_exists': 'Mod {id} is already in the list',
    'mods.stage_btn':       'Stage',
    'mods.stage_remove_btn':'Stage Remove',
    'mods.staged_title':    'Staged changes ({n})',
    'mods.staged_clear':    'Clear all',
    'mods.publishing':      'Publishing…',
    'mods.publish_btn':     'Publish {n} changes',

    // Boot / auth
    'boot.connecting':           'Connecting…',
    'boot.conn_error':           'Connection error',
    'boot.access_denied_label':  'CIE Panel · Access denied',
    'boot.access_denied_title':  'Account not found',
    'boot.access_denied_body':   "Your Gitea account {username} has not been added to the panel.\nContact the server owner to get access.",
    'boot.login_other':          'Sign in with another account',

    // Nav / topbar
    'nav.dashboard':   'Dashboard',
    'nav.editor':      'Config Editor',
    'nav.mods':        'Mods',
    'nav.audit':       'Audit Log',
    'nav.settings':    'Settings',
    'nav.operations':  'Operations',
    'nav.online_of':   '{online}/{total} online',
    'audit.title':       'Audit Log',
    'audit.subtitle':    'Gitea commit history',
    'audit.no_commits':  'No commits found.',
    'audit.col_sha':     'SHA',
    'audit.col_server':  'Server',
    'audit.col_message': 'Message',
    'audit.col_author':  'Author',
    'audit.col_date':    'Date',
    'nav.drift':       'Drift',

    // Dashboard
    search_placeholder:     'Search id, name or host…',
    'dash.title':           'Fleet Dashboard',
    'dash.subtitle':        '{n} SERVERS · 2 REGIONS · GITEA SYNCED',
    'dash.refresh':         '↻ Refresh',
    'dash.refreshing':      '↻ Refreshing…',
    'dash.loading':         'Loading servers…',
    'dash.no_match':        'No servers match the current filter.',
    'dash.capacity':        '{pct}% capacity',
    'dash.drift_vs':        'vs main',
    'dash.col_server':      'Server',
    'dash.col_config':      'Config',
    'dash.col_last_update': 'Last update',

    // Config Editor
    'editor.title':           'Config Editor',
    'editor.gitea_ok':        'GITEA ● connected',
    'editor.unsaved_warn':    '● Unsaved changes',
    'editor.invalid_json':    '● Invalid JSON',
    'editor.back':            '← Dashboard',
    'editor.save_btn':        'Save to Gitea',
    'editor.tab_form':        'Form',
    'editor.tab_json':        'JSON',
    'editor.state_synced':    'Synced',
    'editor.state_unsaved':   'Unsaved',
    'editor.loading_cfg':     'Loading config…',
    'editor.load_fail':       'Failed to load:',
    'editor.committed':       '✓ Committed to Gitea',
    'editor.diff_title':      'Review changes before saving',
    'editor.diff_confirm':    'Save to Gitea',
    'editor.unsaved_confirm': 'Unsaved changes will be lost. Continue?',
    'editor.lines':           'Lines',
    'editor.bytes':           'Bytes',
    'editor.schema':          'Schema',

    // Form view (read-only config fields)
    'form.general':       'General',
    'form.network':       'Network',
    'form.gameplay':      'Gameplay',
    'form.operating':     'Operating',
    'form.mods':          'Mods',
    'form.server_name':   'Server name',
    'form.scenario':      'Scenario',
    'form.scenario_pick': 'Pick',
    'form.max_players':   'Max players',
    'form.slots':         'slots',
    'form.server_pw':     'Server password',
    'form.server_pw_empty': '(none — public)',
    'form.admin_pw':      'Admin password',
    'form.visible':       'Visible in browser',
    'form.cross_platform':'Cross-platform',
    'form.bind_addr':     'Bind address',
    'form.bind_port':     'Bind port',
    'form.public_addr':   'Public address',
    'form.public_port':   'Public port',
    'form.rcon_port':     'RCON port',
    'form.server_view':   'Server view distance',
    'form.net_view':      'Network view distance',
    'form.min_grass':     'Min grass distance',
    'form.dist_m':        'm',
    'form.no_third':      'Disable third person',
    'form.battleye':      'BattlEye',
    'form.von_ui':        'VON disable UI',
    'form.player_save':   'Player save interval',
    'form.sec':           'sec',
    'form.ai_limit':      'AI limit',
    'form.slot_res':      'Slot reservation',
    'form.join_queue':    'Join queue size',
    'form.mod_name':      'Name',
    'form.mod_workshop':  'Workshop ID',
    'form.mod_version':   'Version',

    // Settings
    'settings.title':            'Settings',
    'settings.subtitle':         'PANEL CONFIGURATION · WORKSPACE CIE-OPS',
    'settings.nav_servers':      'Server roster',
    'settings.nav_users':        'Users & access',
    'settings.nav_gitea':        'Gitea connection',
    'settings.nav_discord':      'Discord webhook',
    'settings.servers_title':    'Server roster',
    'settings.servers_count':    '{n} servers managed',
    'settings.col_server':       'Server',
    'settings.save_order':       'Save order',
    'settings.add_server_btn':   '+ Add server',
    'settings.add_server_title': 'Add server',
    'settings.edit_server_title':'Edit server',
    'settings.field_id_desc':    'cie-eu-01',
    'settings.field_name_desc':  'displayed in panel',
    'settings.field_a2s_desc':   'usually 2303',
    'settings.required':         'Fill in all required fields',
    'settings.remove_server':    'Remove server {id} from roster?',
    'settings.remove_user':      'Remove user {id}?',
    'settings.users_title':      'Users & access',
    'settings.users_desc':       'Owner can change roster and connections. Admins can only edit configs.',
    'settings.col_user':         'User',
    'settings.col_role':         'Role',
    'settings.col_access':       'Server access',
    'settings.col_last_active':  'Last active',
    'settings.all_servers':      'All servers',
    'settings.add_user_btn':     '+ Add user',
    'settings.add_user_title':   'Add user',
    'settings.field_gitea_user': 'Gitea username',
    'settings.field_role':       'Role',
    'settings.field_access':     'Server access',
    'settings.access_desc':      'comma-separated, empty = all',
    'settings.add_user_submit':  'Add user',
    'settings.edit_user_title':  'Edit user',
    'settings.gitea_title':      'Gitea connection',
    'settings.gitea_desc':       'Server configs are committed to a Gitea repo. Gitea is the single source of truth.',
    'settings.gitea_connected':  'Connected',
    'settings.gitea_base_url':   'Base URL',
    'settings.gitea_base_url_desc': 'Gitea instance URL',
    'settings.gitea_repo':       'Repository',
    'settings.gitea_branch':     'Default branch',
    'settings.gitea_token':      'Access token',
    'settings.gitea_token_desc': 'Token with repo write scope',
    'settings.test_connection':  'Test connection',
    'settings.discord_title':    'Discord webhook',
    'settings.discord_desc':     'Notifications on config save and server health changes.',
    'settings.discord_enabled':  'Enabled',
    'settings.discord_url':      'Webhook URL',
    'settings.discord_url_desc': 'Discord → Server Settings → Integrations',
    'settings.discord_channel':  'Channel',
    'settings.discord_on_save':  'Notify on save',
    'settings.discord_on_fail':  'Notify on failure',
    'settings.discord_fail_desc':'Ping when config pull fails at server start',
    'settings.send_test':        'Send test message',

    // Scenarios (settings)
    'settings.nav_scenarios':    'Scenarios',
    'settings.scenarios_title':  'Scenario list',
    'settings.scenarios_desc':   'Shown in the Scenario Picker in Config Editor.',
    'settings.col_scenario_id':  'Scenario ID',
    'settings.scenario_id_desc': '{HEX}Missions/File.conf',
    'settings.add_scenario_title': 'Add scenario',
    'settings.add_scenario_btn': '+ Add',
    'settings.remove_scenario':  'Remove scenario "{name}"?',
  },

  uk: {
    // Common
    loading:      'Завантаження…',
    saving:       'Збереження…',
    save:         'Зберегти',
    cancel:       'Скасувати',
    retry:        'Повторити',
    edit:         'Редагувати',
    online:       'Онлайн',
    offline:      'Офлайн',
    warning:      'Увага',
    all:          'Всі',
    any:          'Будь-який',
    players:      'Гравці',
    servers:      'Сервери',
    region:       'Регіон',
    status:       'Статус',
    host:         'Хост',
    name:         'Назва',
    id:           'ID',
    drift:        'Розбіжність конфігів',
    slots:        'Слоти',
    ping:         'Пінг',

    // Mods Matrix
    'nav.mods':            'Матриця модів',
    'mods.title':          'Матриця модів',
    'mods.subtitle':       'Версії модів по всіх серверах',
    'mods.loading':        'Читання конфігів…',
    'mods.refresh':        '↻ Оновити',
    'mods.refreshing':     '↻ Оновлення…',
    'mods.filter_diff':    'Тільки розбіжності',
    'mods.search':         'Пошук моду…',
    'mods.col_mod':        'Мод',
    'mods.col_id':         'Workshop ID',
    'mods.no_mods':        'Моди не знайдено.',
    'mods.not_installed':  '—',
    'mods.panel_title':    'Оновити мод',
    'mods.target_version':    'Цільова версія',
    'mods.version_placeholder': 'порожньо = авто/остання',
    'mods.apply_to':       'Застосувати до',
    'mods.select_all':     'Всі',
    'mods.select_none':    'Жодного',
    'mods.apply_btn':      'Застосувати',
    'mods.applying':       'Оновлення…',
    'mods.done':           '✓ Оновлено {n} сервер(ів)',
    'mods.errors':         '✗ Помилки на {n} сервер(ах)',
    'mods.out_of_sync':    'розбіжність',
    'mods.not_on_server':  'не встановлено',
    'mods.stats':          '{total} модів · {diff} з розбіжностями',
    'mods.tab_matrix':     'Матриця',
    'mods.tab_server':     'По серверах',
    'mods.remove_btn':     'Видалити',
    'mods.apply_add_btn':  'Застосувати / Додати',
    'mods.installed':      'Встановлено',
    'mods.missing':        'Відсутній',
    'mods.select_all':     'Вибрати всі',
    'mods.select_none':    'Зняти всі',
    'mods.select_server':  'Виберіть сервер…',
    'mods.no_mods_server': 'На цьому сервері немає модів.',
    'mods.add_mod':        '+ Додати мод',
    'mods.add_mod_title':  'Додати мод',
    'mods.field_url':      'URL воркшопу або ID-слаг',
    'mods.looking_up':     'Отримуємо інфо про мод…',
    'mods.lookup_failed':  'Не вдалося отримати інфо',
    'mods.field_workshop': 'Workshop ID',
    'mods.field_name':     'Назва моду',
    'mods.field_version':  'Версія',
    'mods.save_btn':       'Зберегти',
    'mods.saved':          '✓ Збережено в Gitea',
    'mods.col_order':      '#',
    'mods.already_exists': 'Мод {id} вже є в списку',
    'mods.stage_btn':       'Застейджити',
    'mods.stage_remove_btn':'Застейджити видалення',
    'mods.staged_title':    'Незапубліковані зміни ({n})',
    'mods.staged_clear':    'Очистити',
    'mods.publishing':      'Публікуємо…',
    'mods.publish_btn':     'Опублікувати {n} змін',

    // Boot / auth
    'boot.connecting':           'Підключення…',
    'boot.conn_error':           'Помилка підключення',
    'boot.access_denied_label':  'CIE Panel · Немає доступу',
    'boot.access_denied_title':  'Акаунт не знайдено',
    'boot.access_denied_body':   'Твій Gitea акаунт {username} не додано до панелі.\nЗверніcь до власника сервера щоб отримати доступ.',
    'boot.login_other':          'Увійти з іншим акаунтом',

    // Nav / topbar
    'nav.dashboard':   'Дашборд',
    'nav.editor':      'Редактор конфігів',
    'nav.mods':        'Моди',
    'nav.audit':       'Аудит',
    'nav.settings':    'Налаштування',
    'nav.operations':  'Операції',
    'nav.online_of':   '{online}/{total} онлайн',
    'audit.title':       'Аудит лог',
    'audit.subtitle':    'Історія комітів Gitea',
    'audit.no_commits':  'Коміти не знайдено.',
    'audit.col_sha':     'SHA',
    'audit.col_server':  'Сервер',
    'audit.col_message': 'Повідомлення',
    'audit.col_author':  'Автор',
    'audit.col_date':    'Дата',
    'nav.drift':       'Розбіжність',

    // Dashboard
    search_placeholder:     'Пошук id, назви або host…',
    'dash.title':           'Флот',
    'dash.subtitle':        '{n} СЕРВЕРІВ · 2 РЕГІОНИ · GITEA SYNCED',
    'dash.refresh':         '↻ Оновити',
    'dash.refreshing':      '↻ Оновлення…',
    'dash.loading':         'Завантаження серверів…',
    'dash.no_match':        'Немає серверів що відповідають фільтру.',
    'dash.capacity':        '{pct}% завантаженість',
    'dash.drift_vs':        'від main',
    'dash.col_server':      'Сервер',
    'dash.col_config':      'Конфіг',
    'dash.col_last_update': 'Оновлено',

    // Config Editor
    'editor.title':           'Редактор конфігів',
    'editor.gitea_ok':        'GITEA ● підключено',
    'editor.unsaved_warn':    '● Незбережені зміни',
    'editor.invalid_json':    '● Невалідний JSON',
    'editor.back':            '← Дашборд',
    'editor.save_btn':        'Зберегти в Gitea',
    'editor.tab_form':        'Форма',
    'editor.tab_json':        'JSON',
    'editor.state_synced':    'Синхронізовано',
    'editor.state_unsaved':   'Незбережено',
    'editor.loading_cfg':     'Завантаження конфігу…',
    'editor.load_fail':       'Помилка завантаження:',
    'editor.committed':       '✓ Збережено в Gitea',
    'editor.diff_title':      'Перевір зміни перед збереженням',
    'editor.diff_confirm':    'Зберегти в Gitea',
    'editor.unsaved_confirm': 'Незбережені зміни буде втрачено. Продовжити?',
    'editor.lines':           'Рядки',
    'editor.bytes':           'Байти',
    'editor.schema':          'Схема',

    // Form view
    'form.general':        'Загальне',
    'form.network':        'Мережа',
    'form.gameplay':       'Геймплей',
    'form.operating':      'Операційне',
    'form.mods':           'Моди',
    'form.server_name':    'Назва сервера',
    'form.scenario':       'Сценарій',
    'form.scenario_pick':  'Вибрати',
    'form.max_players':    'Макс. гравців',
    'form.slots':          'слотів',
    'form.server_pw':      'Пароль сервера',
    'form.server_pw_empty':'(немає — публічний)',
    'form.admin_pw':       'Пароль адміна',
    'form.visible':        'Видимий у браузері',
    'form.cross_platform': 'Кросплатформний',
    'form.bind_addr':      "Адреса прив'язки",
    'form.bind_port':      "Порт прив'язки",
    'form.public_addr':    'Публічна адреса',
    'form.public_port':    'Публічний порт',
    'form.rcon_port':      'RCON порт',
    'form.server_view':    'Дистанція видимості',
    'form.net_view':       'Мережева дистанція',
    'form.min_grass':      'Мін. дистанція трави',
    'form.dist_m':         'м',
    'form.no_third':       'Вимкнути третю особу',
    'form.battleye':       'BattlEye',
    'form.von_ui':         'VON вимкнути UI',
    'form.player_save':    'Інтервал збереження',
    'form.sec':            'сек',
    'form.ai_limit':       'Ліміт AI',
    'form.slot_res':       'Резервування слоту',
    'form.join_queue':     'Розмір черги',
    'form.mod_name':       'Назва',
    'form.mod_workshop':   'Workshop ID',
    'form.mod_version':    'Версія',

    // Settings
    'settings.title':            'Налаштування',
    'settings.subtitle':         'КОНФІГУРАЦІЯ ПАНЕЛІ · WORKSPACE CIE-OPS',
    'settings.nav_servers':      'Список серверів',
    'settings.nav_users':        'Користувачі та доступ',
    'settings.nav_gitea':        "З'єднання Gitea",
    'settings.nav_discord':      'Discord вебхук',
    'settings.servers_title':    'Список серверів',
    'settings.servers_count':    '{n} серверів',
    'settings.col_server':       'Сервер',
    'settings.save_order':       'Зберегти порядок',
    'settings.add_server_btn':   '+ Додати сервер',
    'settings.add_server_title': 'Додати сервер',
    'settings.edit_server_title':'Редагувати сервер',
    'settings.field_id_desc':    'cie-eu-01',
    'settings.field_name_desc':  'відображається в панелі',
    'settings.field_a2s_desc':   'зазвичай 2303',
    'settings.required':         "Заповни всі обов'язкові поля",
    'settings.remove_server':    'Видалити сервер {id} зі списку?',
    'settings.remove_user':      'Видалити користувача {id}?',
    'settings.users_title':      'Користувачі та доступ',
    'settings.users_desc':       "Власник може змінювати список та з'єднання. Адміни можуть тільки редагувати конфіги.",
    'settings.col_user':         'Користувач',
    'settings.col_role':         'Роль',
    'settings.col_access':       'Доступ до серверів',
    'settings.col_last_active':  'Остання активність',
    'settings.all_servers':      'Всі сервери',
    'settings.add_user_btn':     '+ Додати користувача',
    'settings.add_user_title':   'Додати користувача',
    'settings.field_gitea_user': "Gitea ім'я користувача",
    'settings.field_role':       'Роль',
    'settings.field_access':     'Доступ до серверів',
    'settings.access_desc':      'через кому, пусто = всі',
    'settings.add_user_submit':  'Додати',
    'settings.edit_user_title':  'Редагувати користувача',
    'settings.gitea_title':      "З'єднання Gitea",
    'settings.gitea_desc':       'Конфіги серверів зберігаються в Gitea репо. Gitea — єдине джерело правди.',
    'settings.gitea_connected':  'Підключено',
    'settings.gitea_base_url':   'Base URL',
    'settings.gitea_base_url_desc': 'URL Gitea інстансу',
    'settings.gitea_repo':       'Репозиторій',
    'settings.gitea_branch':     'Гілка за замовчуванням',
    'settings.gitea_token':      'Токен доступу',
    'settings.gitea_token_desc': 'Токен з правом запису в репо',
    'settings.test_connection':  "Тест з'єднання",
    'settings.discord_title':    'Discord вебхук',
    'settings.discord_desc':     'Сповіщення при збереженні конфігу та зміні стану сервера.',
    'settings.discord_enabled':  'Увімкнено',
    'settings.discord_url':      'Webhook URL',
    'settings.discord_url_desc': 'Discord → Server Settings → Integrations',
    'settings.discord_channel':  'Канал',
    'settings.discord_on_save':  'Сповіщати при збереженні',
    'settings.discord_on_fail':  'Сповіщати при збої',
    'settings.discord_fail_desc':'Пінг коли не вдалося завантажити конфіг при старті',
    'settings.send_test':        'Надіслати тестове повідомлення',

    // Scenarios (settings)
    'settings.nav_scenarios':    'Сценарії',
    'settings.scenarios_title':  'Список сценаріїв',
    'settings.scenarios_desc':   'Відображаються у пікері сценаріїв в Config Editor.',
    'settings.col_scenario_id':  'Scenario ID',
    'settings.scenario_id_desc': '{HEX}Missions/File.conf',
    'settings.add_scenario_title': 'Додати сценарій',
    'settings.add_scenario_btn': '+ Додати',
    'settings.remove_scenario':  'Видалити сценарій "{name}"?',
  },

  zh: {
    // Common
    loading:      '加载中…',
    saving:       '保存中…',
    save:         '保存',
    cancel:       '取消',
    retry:        '重试',
    edit:         '编辑',
    online:       '在线',
    offline:      '离线',
    warning:      '警告',
    all:          '全部',
    any:          '任意',
    players:      '玩家',
    servers:      '服务器',
    region:       '地区',
    status:       '状态',
    host:         '主机',
    name:         '名称',
    id:           'ID',
    drift:        '配置偏差',
    slots:        '槽位',
    ping:         '延迟',

    // Mods Matrix
    'nav.mods':            '模组矩阵',
    'mods.title':          '模组矩阵',
    'mods.subtitle':       '所有服务器的模组版本',
    'mods.loading':        '读取配置中…',
    'mods.refresh':        '↻ 刷新',
    'mods.refreshing':     '↻ 刷新中…',
    'mods.filter_diff':    '仅显示差异',
    'mods.search':         '搜索模组…',
    'mods.col_mod':        '模组',
    'mods.col_id':         'Workshop ID',
    'mods.no_mods':        '未找到模组。',
    'mods.not_installed':  '—',
    'mods.panel_title':    '更新模组',
    'mods.target_version':    '目标版本',
    'mods.version_placeholder': '留空 = 自动/最新',
    'mods.apply_to':       '应用到',
    'mods.select_all':     '全选',
    'mods.select_none':    '取消全选',
    'mods.apply_btn':      '应用',
    'mods.applying':       '应用中…',
    'mods.done':           '✓ 已更新 {n} 个服务器',
    'mods.errors':         '✗ {n} 个服务器出错',
    'mods.out_of_sync':    '不同步',
    'mods.not_on_server':  '未安装',
    'mods.stats':          '{total} 个模组 · {diff} 个不同步',
    'mods.tab_matrix':     '矩阵',
    'mods.tab_server':     '按服务器',
    'mods.remove_btn':     '删除',
    'mods.apply_add_btn':  '应用 / 添加',
    'mods.installed':      '已安装',
    'mods.missing':        '缺失',
    'mods.select_server':  '选择服务器…',
    'mods.no_mods_server': '此服务器没有模组。',
    'mods.add_mod':        '+ 添加模组',
    'mods.add_mod_title':  '添加模组',
    'mods.field_url':      'Workshop URL 或 ID',
    'mods.looking_up':     '获取模组信息中…',
    'mods.lookup_failed':  '无法获取模组信息',
    'mods.field_workshop': 'Workshop ID',
    'mods.field_name':     '模组名称',
    'mods.field_version':  '版本',
    'mods.save_btn':       '保存',
    'mods.saved':          '✓ 已保存到 Gitea',
    'mods.col_order':      '#',
    'mods.already_exists': '模组 {id} 已在列表中',
    'mods.stage_btn':       '暂存',
    'mods.stage_remove_btn':'暂存删除',
    'mods.staged_title':    '暂存更改 ({n})',
    'mods.staged_clear':    '清除全部',
    'mods.publishing':      '发布中…',
    'mods.publish_btn':     '发布 {n} 项更改',

    // Boot / auth
    'boot.connecting':           '连接中…',
    'boot.conn_error':           '连接错误',
    'boot.access_denied_label':  'CIE Panel · 拒绝访问',
    'boot.access_denied_title':  '账户未找到',
    'boot.access_denied_body':   '你的 Gitea 账户 {username} 未被添加到面板。\n请联系服务器所有者以获得访问权限。',
    'boot.login_other':          '使用其他账户登录',

    // Nav / topbar
    'nav.dashboard':   '仪表盘',
    'nav.editor':      '配置编辑器',
    'nav.mods':        '模组',
    'nav.audit':       '审计日志',
    'nav.settings':    '设置',
    'nav.operations':  '操作',
    'nav.online_of':   '{online}/{total} 在线',
    'audit.title':       '审计日志',
    'audit.subtitle':    'Gitea 提交历史',
    'audit.no_commits':  '未找到提交。',
    'audit.col_sha':     'SHA',
    'audit.col_server':  '服务器',
    'audit.col_message': '消息',
    'audit.col_author':  '作者',
    'audit.col_date':    '日期',
    'nav.drift':       '配置偏差',

    // Dashboard
    search_placeholder:     '搜索 id、名称或主机…',
    'dash.title':           '服务器总览',
    'dash.subtitle':        '{n} 台服务器 · 2 个地区 · GITEA 同步',
    'dash.refresh':         '↻ 刷新',
    'dash.refreshing':      '↻ 刷新中…',
    'dash.loading':         '加载服务器中…',
    'dash.no_match':        '没有符合当前筛选条件的服务器。',
    'dash.capacity':        '容量 {pct}%',
    'dash.drift_vs':        '对比 main',
    'dash.col_server':      '服务器',
    'dash.col_config':      '配置',
    'dash.col_last_update': '最后更新',

    // Config Editor
    'editor.title':           '配置编辑器',
    'editor.gitea_ok':        'GITEA ● 已连接',
    'editor.unsaved_warn':    '● 未保存更改',
    'editor.invalid_json':    '● JSON 无效',
    'editor.back':            '← 仪表盘',
    'editor.save_btn':        '保存到 Gitea',
    'editor.tab_form':        '表单',
    'editor.tab_json':        'JSON',
    'editor.state_synced':    '已同步',
    'editor.state_unsaved':   '未保存',
    'editor.loading_cfg':     '加载配置中…',
    'editor.load_fail':       '加载失败：',
    'editor.committed':       '✓ 已提交到 Gitea',
    'editor.diff_title':      '保存前请检查更改',
    'editor.diff_confirm':    '保存到 Gitea',
    'editor.unsaved_confirm': '未保存的更改将丢失。是否继续？',
    'editor.lines':           '行数',
    'editor.bytes':           '字节',
    'editor.schema':          '结构',

    // Form view
    'form.general':       '常规',
    'form.network':       '网络',
    'form.gameplay':      '游戏设置',
    'form.operating':     '运行设置',
    'form.mods':          '模组',
    'form.server_name':   '服务器名称',
    'form.scenario':      '场景',
    'form.scenario_pick': '选择',
    'form.max_players':   '最大玩家数',
    'form.slots':         '槽位',
    'form.server_pw':     '服务器密码',
    'form.server_pw_empty': '（无 — 公开）',
    'form.admin_pw':      '管理员密码',
    'form.visible':       '在浏览器中可见',
    'form.cross_platform':'跨平台',
    'form.bind_addr':     '绑定地址',
    'form.bind_port':     '绑定端口',
    'form.public_addr':   '公共地址',
    'form.public_port':   '公共端口',
    'form.rcon_port':     'RCON 端口',
    'form.server_view':   '服务器视野距离',
    'form.net_view':      '网络视野距离',
    'form.min_grass':     '最小草地距离',
    'form.dist_m':        '米',
    'form.no_third':      '禁用第三人称',
    'form.battleye':      'BattlEye',
    'form.von_ui':        '禁用 VON UI',
    'form.player_save':   '玩家保存间隔',
    'form.sec':           '秒',
    'form.ai_limit':      'AI 上限',
    'form.slot_res':      '槽位保留',
    'form.join_queue':    '排队人数',
    'form.mod_name':      '名称',
    'form.mod_workshop':  'Workshop ID',
    'form.mod_version':   '版本',

    // Settings
    'settings.title':            '设置',
    'settings.subtitle':         '面板配置 · 工作区 CIE-OPS',
    'settings.nav_servers':      '服务器列表',
    'settings.nav_users':        '用户与权限',
    'settings.nav_gitea':        'Gitea 连接',
    'settings.nav_discord':      'Discord Webhook',
    'settings.servers_title':    '服务器列表',
    'settings.servers_count':    '管理 {n} 台服务器',
    'settings.col_server':       '服务器',
    'settings.save_order':       '保存顺序',
    'settings.add_server_btn':   '+ 添加服务器',
    'settings.add_server_title': '添加服务器',
    'settings.edit_server_title':'编辑服务器',
    'settings.field_id_desc':    'cie-eu-01',
    'settings.field_name_desc':  '显示在面板中',
    'settings.field_a2s_desc':   '通常为 2303',
    'settings.required':         '请填写所有必填字段',
    'settings.remove_server':    '从列表中删除服务器 {id}？',
    'settings.remove_user':      '删除用户 {id}？',
    'settings.users_title':      '用户与权限',
    'settings.users_desc':       '所有者可更改服务器列表和连接。管理员只能编辑配置。',
    'settings.col_user':         '用户',
    'settings.col_role':         '角色',
    'settings.col_access':       '服务器访问',
    'settings.col_last_active':  '最后活动',
    'settings.all_servers':      '所有服务器',
    'settings.add_user_btn':     '+ 添加用户',
    'settings.add_user_title':   '添加用户',
    'settings.field_gitea_user': 'Gitea 用户名',
    'settings.field_role':       '角色',
    'settings.field_access':     '服务器访问',
    'settings.access_desc':      '逗号分隔，留空 = 全部',
    'settings.add_user_submit':  '添加用户',
    'settings.edit_user_title':  '编辑用户',
    'settings.gitea_title':      'Gitea 连接',
    'settings.gitea_desc':       '服务器配置提交到 Gitea 仓库。Gitea 是唯一可信来源。',
    'settings.gitea_connected':  '已连接',
    'settings.gitea_base_url':   'Base URL',
    'settings.gitea_base_url_desc': 'Gitea 实例 URL',
    'settings.gitea_repo':       '仓库',
    'settings.gitea_branch':     '默认分支',
    'settings.gitea_token':      '访问令牌',
    'settings.gitea_token_desc': '具有仓库写入权限的令牌',
    'settings.test_connection':  '测试连接',
    'settings.discord_title':    'Discord Webhook',
    'settings.discord_desc':     '配置保存和服务器状态变更时发送通知。',
    'settings.discord_enabled':  '已启用',
    'settings.discord_url':      'Webhook URL',
    'settings.discord_url_desc': 'Discord → 服务器设置 → 集成',
    'settings.discord_channel':  '频道',
    'settings.discord_on_save':  '保存时通知',
    'settings.discord_on_fail':  '失败时通知',
    'settings.discord_fail_desc':'服务器启动时配置拉取失败则 Ping',
    'settings.send_test':        '发送测试消息',

    // Scenarios (settings)
    'settings.nav_scenarios':    '场景',
    'settings.scenarios_title':  '场景列表',
    'settings.scenarios_desc':   '显示在配置编辑器的场景选择器中。',
    'settings.col_scenario_id':  'Scenario ID',
    'settings.scenario_id_desc': '{HEX}Missions/File.conf',
    'settings.add_scenario_title': '添加场景',
    'settings.add_scenario_btn': '+ 添加',
    'settings.remove_scenario':  '删除场景 "{name}"？',
  },
};

// ── Context ───────────────────────────────────────────────────────────────────

const LangContext = React.createContext({ lang: 'en', t: k => k, switchLang: () => {} });

function LangProvider({ children }) {
  const [lang, setLang] = React.useState(() => localStorage.getItem('cie_lang') || 'en');

  function t(key, vars) {
    let str = (_T[lang] && _T[lang][key] !== undefined)
      ? _T[lang][key]
      : (_T.en[key] !== undefined ? _T.en[key] : key);
    if (vars) {
      Object.keys(vars).forEach(k => {
        str = str.split('{' + k + '}').join(String(vars[k]));
      });
    }
    return str;
  }

  function switchLang(target) {
    const cycle = { en: 'uk', uk: 'zh', zh: 'en' };
    const next = target || cycle[lang] || 'en';
    localStorage.setItem('cie_lang', next);
    setLang(next);
  }

  return (
    <LangContext.Provider value={{ lang, t, switchLang }}>
      {children}
    </LangContext.Provider>
  );
}

function useLang() {
  return React.useContext(LangContext);
}

window.CIE_I18N = { LangContext, LangProvider, useLang };
