export default {
  common: {
    prism: 'Prism',
    refresh: 'Refresh',
    save: 'Save',
    cancel: 'Cancel',
    confirm: 'Confirm',
    search: 'Search',
    delete: 'Delete',
    import: 'Import',
    export: 'Export',
    add: 'Add',
    create: 'Create',
    revoke: 'Revoke',
    copy: 'Copy',
    loading: 'Loading',
    unknown: 'Unknown',
    none: '—',
    success: 'Success',
    failed: 'Failed',
    all: 'All',
    manual: 'Manual',
    subscription: 'Subscription',
    source: 'Source',
    name: 'Name',
    type: 'Type',
    status: 'Status',
    actions: 'Actions',
    upload: 'Upload',
    download: 'Download',
    connections: 'Connections',
    time: 'Time',
    level: 'Level',
    message: 'Message',
    testing: 'Testing',
    saved: 'Saved',
    empty: 'No data',
    management: 'Management',
    logout: 'Sign out',
    minutes: '{n} min',
    seconds: '{n} sec',
    periodHours: 'Last {n} hours',
  },
  nav: {
    dashboard: 'Dashboard',
    subscriptions: 'Subscriptions',
    proxies: 'Proxies',
    outbound: 'Outbound',
    rules: 'Rules',
    trafficLogs: 'Request Logs',
    logs: 'Runtime Logs',
    settings: 'Settings',
  },
  login: {
    subtitle: 'HTTP / SOCKS5 proxy gateway console',
    title: 'Sign in',
    password: 'Password',
    passwordPlaceholder: 'default: admin',
    submit: 'Sign in',
    hint: 'Default password is admin on first use. Change it in Settings.',
    failed: 'Sign in failed',
    wrongPassword: 'Incorrect password',
    wrongPasswordRemaining: 'Incorrect password. {n} attempts left',
    tooManyAttempts: 'Too many attempts. Try again in {wait}',
  },
  dashboard: {
    title: 'Dashboard',
    desc: 'Live traffic, domain/node breakdown, and connection overview',
    checking: 'Checking',
    engineRunning: 'Engine running',
    engineStopped: 'Engine stopped',
    totalNodes: 'Total nodes',
    aliveNodes: 'Alive nodes',
    activeConnections: 'Active connections',
    downloadRate: 'Download rate',
    domainTraffic: 'Domain traffic',
    nodeTraffic: 'Node traffic',
    trafficTrend: 'Traffic trend',
    tabLive: 'Active connections',
    domain: 'Domain',
    outboundNode: 'Outbound node',
    hintLiveDomain: 'Active connection traffic grouped by domain and outbound node',
    hintPeriodDomain: 'Aggregated from request logs by domain and outbound node',
    hintLiveNode: 'Active traffic by leaf proxy node (policy groups skipped)',
    hintPeriodNode: 'Completed request traffic per leaf node in the last 24 hours',
    seriesDownload: 'Download',
    seriesUpload: 'Upload',
  },
  subscriptions: {
    title: 'Subscriptions',
    desc: 'Add and schedule Clash or link-based subscriptions',
    add: 'Add subscription',
    url: 'URL',
    nodeCount: 'Nodes',
    lastFetch: 'Last updated',
    normal: 'OK',
    error: 'Error',
    refresh: 'Refresh',
    dialogTitle: 'Add subscription',
    interval: 'Update interval',
    intervalHint: 'Seconds, minimum 300',
    typeAuto: 'Auto detect',
    typeClash: 'Clash YAML',
    typeLinks: 'Node links',
    typeHint: 'Use Auto detect for short links and Base64 node lists',
    added: 'Subscription added',
    refreshed: 'Refreshed',
    deleted: 'Deleted',
    confirmDelete: 'Delete subscription "{name}"?',
  },
  proxies: {
    title: 'Proxies',
    desc: 'Node status, latency, country tags, and filters',
    rebuildCountries: 'Rebuild countries',
    addNode: 'Add node',
    testAll: 'Test all',
    testingProgress: 'Testing {progress}',
    cancelTest: 'Cancel test',
    testOne: 'Test',
    country: 'Country',
    latency: 'Latency',
    notTested: 'N/A',
    alive: 'Alive',
    filterCountry: 'Filter by country',
    allCountries: 'All countries',
    testingHint: 'Testing nodes one by one. Do not close this page.',
    tabAll: 'All',
    countriesRebuilt: 'Updated country tags for {n} nodes',
    noTestable: 'No nodes to test',
    testCancelled: 'Test cancelled',
    testDone: 'Test completed',
    testDoneFailed: 'Test completed with {n} failures',
    nodeAdded: 'Node added',
    exported: 'Nodes exported',
    exportJson: 'JSON',
    exportLinks: 'Share links (one per line)',
    importTitle: 'Import manual nodes',
    importMode: 'Import mode',
    append: 'Append to existing nodes',
    replace: 'Replace all manual nodes',
    importFile: 'Node file',
    importContent: 'Node content',
    importFileHint: 'JSON or share links (ss/socks5/http/trojan)',
    importPlaceholder: 'One link per line, or paste JSON; lines starting with # are comments',
    importConfirmReplace: 'This will delete all manual nodes and replace them. Continue?',
    importConfirmTitle: 'Confirm import',
    pasteRequired: 'Paste nodes or choose a file',
    imported: 'Imported {n} nodes',
    importedPartial: 'Imported {n}, skipped {s}',
    importFailed: 'Import failed',
    addDialogTitle: 'Add manual node',
    server: 'Server',
    port: 'Port',
    username: 'Username',
    password: 'Password',
    chooseFile: 'Choose file',
  },
  outbound: {
    title: 'Outbound',
    desc: 'Manage policy groups and default outbound; route rules are on the Rules page',
    defaultTitle: 'Default outbound',
    defaultHint: 'Policy group or DIRECT when no rule matches',
    save: 'Save',
    countryPools: 'Country pools (url-test)',
    countryPoolsHint: 'Per-country url-test groups that pick the fastest node',
    policyGroups: 'Policy groups',
    countryPool: 'Country pool',
    currentNode: 'Current node',
    memberCount: 'Members',
    policyGroup: 'Policy group',
    switchNode: 'Switch node',
    auto: '(auto)',
    fallbackHint: 'Ordered fallback without latency test',
    skipDirect: 'Auto latency test (excludes DIRECT)',
    emptyCountry: 'No country pools (tag nodes and reload)',
    emptyPolicy: 'No policy groups',
    saved: 'Default outbound saved',
    groupSwitched: 'Policy group switched',
    policyGroupsHint: 'Only Selector groups allow manual node switch; URLTest / Fallback are chosen by the core',
    typeSelector: 'Manual select',
    typeURLTest: 'URL test',
    typeFallback: 'Fallback',
    typeLoadBalance: 'Load balance',
    typeRelay: 'Relay',
    countryPoolName: '{name} (country pool)',
    policyGroupName: '{name} ({type})',
  },
  rules: {
    title: 'Routing rules',
    desc: 'Manual rules override subscription rules; route domains to country pools',
    testCard: 'Rule match test',
    testPlaceholder: 'Enter URL or domain, e.g. https://www.google.com',
    test: 'Test',
    testHint: 'Simulates merged rule priority; GEOIP/GEOSITE needs local Geo data',
    parsedHost: 'Host',
    matchedRule: 'Matched rule',
    outboundTarget: 'Outbound',
    manualRules: 'Manual rules (high priority)',
    mergedPreview: 'Merged rules preview',
    mergedSummary: '{total} rules, fallback {policy}',
    priority: 'Priority',
    match: 'Match',
    target: 'Target',
    rule: 'Rule',
    seq: '#',
    ruleAdded: 'Rule added',
    ruleDeleted: 'Deleted',
    confirmDelete: 'Delete this rule?',
    urlRequired: 'Enter a URL or domain',
    exported: 'Rules exported',
    exportJson: 'JSON',
    exportText: 'Mihomo text (one per line)',
    importTitle: 'Import manual rules',
    importConfirmReplace: 'This will delete all manual rules and replace them. Continue?',
    pasteRequired: 'Paste rules or choose a file',
    imported: 'Imported {n} rules',
    importedPartial: 'Imported {n}, skipped {s}',
    importFailed: 'Import failed',
    addDialogTitle: 'Add rule',
    matchValue: 'Match value',
    matchPlaceholder: 'e.g. google.com',
    outboundType: 'Outbound type',
    byCountry: 'By country',
    byPolicy: 'Policy / direct',
    outboundTargetLabel: 'Outbound target',
    selectCountryPool: 'Select country pool',
    selectPolicy: 'Select policy or DIRECT',
    countryPoolHint: 'Country pools use url-test to pick the fastest node',
    importFile: 'Rule file',
    importContent: 'Rule content',
    importFileHint: 'JSON or Mihomo rule text (DOMAIN-SUFFIX,example.com,PROXY)',
    importPlaceholder: 'One rule per line or JSON; # for comments',
    chooseFile: 'Choose file',
    importMode: 'Import mode',
    append: 'Append to existing rules',
    replace: 'Replace all manual rules',
    targetDirect: 'DIRECT',
    targetReject: 'REJECT',
    targetProxy: 'PROXY (default group)',
    targetGlobal: 'GLOBAL (subscription group)',
    countryFastest: '{name} (fastest)',
  },
  trafficLogs: {
    title: 'Request logs',
    desc: 'Matched rules, outbound nodes, and results after connections close',
    searchPlaceholder: 'Search domain, rule, or node',
    target: 'Target',
    matchedRule: 'Matched rule',
    outboundNode: 'Outbound node',
    chain: 'Chain',
    traffic: 'Traffic',
    result: 'Result',
    pageSuccess: '{ok}/{total} succeeded on this page',
  },
  logs: {
    title: 'Runtime logs',
    desc: 'Prism and proxy engine logs',
    runtime: 'Runtime',
    audit: 'Audit',
    searchPlaceholder: 'Search keyword',
    action: 'Action',
    resource: 'Resource',
    detail: 'Detail',
  },
  settings: {
    title: 'Settings',
    desc: 'Proxy ports, scheduler, and security',
    reloadEngine: 'Reload engine',
    saved: 'Settings saved',
    engineReloaded: 'Engine reloaded',
    inboundApi: 'Inbound & API',
    proxyInbound: 'Proxy inbound',
    httpPort: 'HTTP port',
    socksPort: 'SOCKS5 port',
    proxyUser: 'Proxy username',
    proxyUserPlaceholder: 'Leave empty to disable auth',
    proxyPass: 'Proxy password',
    proxyPassPlaceholder: 'Leave empty to keep unchanged; clear username to disable auth',
    proxyAuthHint: 'HTTP/SOCKS5 will require these credentials; 127.0.0.1 is exempt',
    adminApi: 'Admin API',
    apiPort: 'API port',
    apiPortHint: 'Restart required after changing',
    mihomoApi: 'Mihomo API',
    apiSecret: 'API Secret',
    apiSecretPlaceholder: 'Clash API secret',
    scheduler: 'Scheduler',
    healthInterval: 'Health check interval',
    seconds: 'seconds',
    logLevel: 'Log level',
    security: 'Security',
    authEnabled: 'Enable login',
    loginMaxAttempts: 'Max login attempts',
    loginMaxAttemptsHint: 'Lock IP after this many failures within the lock window',
    loginLockMinutes: 'Login lock duration',
    loginLockMinutesHint: 'Minutes; blocked IP cannot retry during lock',
    newPassword: 'New password',
    newPasswordPlaceholder: 'Leave empty to keep unchanged',
    appearance: 'Appearance',
    uiLocale: 'Language',
    localeZhCN: '简体中文',
    localeZhTW: '繁體中文',
    localeEn: 'English',
    apiKeys: 'API Keys',
    apiKeysHint: 'Use keys to call the admin API without signing in. Header:',
    applyKey: 'Create API Key',
  },
  apiKey: {
    empty: 'No API keys',
    prefix: 'Key prefix',
    lastUsed: 'Last used',
    createdAt: 'Created',
    neverUsed: 'Never used',
    created: 'API Key created. Copy it now.',
    copied: 'Copied to clipboard',
    confirmRevoke: 'Revoke key "{name}" ({prefix})?',
    revoked: 'Revoked',
    dialogCreate: 'Create API Key',
    dialogSave: 'Save your API Key',
    name: 'Name',
    namePlaceholder: 'e.g. automation, ci',
    onceHint: 'Shown only once. You cannot view the full key again.',
  },
  geo: {
    title: 'Geo data',
    autoDownload: 'Auto download on start',
    autoDownloadHint: 'Download missing Geo files on startup using URLs below',
    countryMmdb: 'Country.mmdb',
    countryMmdbHint: 'GEOIP country database; clear and save to restore default URL',
    geoip: 'GEOIP',
    geoipHint: 'geoip.dat URL; clear and save to restore default',
    geosite: 'GEOSITE',
    geositeHint: 'geosite.dat URL; clear and save to restore default',
    localStatus: 'Local status',
    ready: 'Ready',
    notReady: 'Not ready',
    missing: 'Missing',
    downloadMissing: 'Download missing',
    forceUpdate: 'Force update all',
    updateHint: 'Save URL changes first, then update; GEOIP/GEOSITE rules need all three files',
    updated: 'Updated: {files}',
    upToDate: 'Geo data is up to date',
    updateFailed: 'Update failed',
  },
}
