Newer
Older
gnexus-tasks / frontend / src / locales / uk.ts
// Українська локаль — типізована як typeof ru, щоб пропущені ключі ловив vue-tsc.
import type ru from './ru'

export default {
  common: {
    all: 'Усі',
    noProject: '— без проєкту —',
    none: '— немає —',
    choose: '— оберіть —',
    notSet: '— не вказано —',
    error: 'Помилка запиту',
    save: 'Зберегти',
    cancel: 'Скасувати',
    edit: 'Редагувати',
    preview: 'Попередній перегляд',
    confirmTitle: 'Підтвердження',
    delete: 'Видалити',
    open: 'Відкрити',
    // Кнопка закриття в модалок без власної дії (0.94): у перегляду нічого
    // підтверджувати, а «Скасувати» читалося б як відмова від чогось
    close: 'Закрити',
    move: 'Перемістити',
    actions: 'Дії',
    expand: 'Розгорнути',
    collapse: 'Згорнути',
    deleteConfirmTask: 'Видалити задачу «{title}»? Дію не можна скасувати.',
    deleteConfirmProject: 'Видалити проєкт «{name}»? Задачі залишаться, але без проєкту.',
    archive: 'До архіву',
    archiveTitle: 'Надіслати до архіву',
    saved: 'Збережено',
    created: 'Створено',
    create: 'Створити',
    taskDeleted: 'Задачу видалено',
    loading: 'Завантаження…',
    projectDeleted: 'Проєкт видалено',
    taskApproved: 'Задачу затверджено',
    taskTaken: 'Задачу взято в роботу',
    taskFinished: 'Задачу завершено',
    yes: 'Так',
    no: 'Ні',
    back: 'Назад',
  },
  nav: {
    sections: 'Розділи',
    subtitle: 'GNexus Tasks — особисті задачі',
    signIn: 'Увійти',
    account: 'Акаунт',
    signOut: 'Вийти',
    task: 'Завдання',
    home: 'Головна',
    stack: 'Вхідний стек',
    list: 'Список задач',
    achievements: 'Досягнення',
    stats: 'Статистика',
    projects: 'Проєкти',
    archive: 'Архів',
    journal: 'Журнал',
    options: 'Видача завдання',
    settings: 'Налаштування',
    extension: 'Розширення',
  },
  // Прогрес: спільний для сторінки «Досягнення» та саду (сад вимкнено в 0.58,
  // повернеться пізніше — тексти нейтральні, без рослин і «садівника»)
  progress: {
    title: 'Досягнення',
    level: 'Рівень {n}',
    xpTotal: '{n} XP',
    levelProgress: 'До наступного рівня: {xp} / {span} XP',
    aboutOpen: 'Як це працює',
    aboutTitle: 'Як це працює',
    levelsTitle: 'Дерево звань',
    levelsHint:
      'Пороги XP та звання кожного рівня. Рівень росте з досвіду за завдання — нічого не згорає й не віднімається.',
    levelCurrent: 'поточний',
    achievements: 'Досягнення',
    coins: 'монет: {n}',
    coinsHint: 'Монети за виконані завдання, створення завдань і проєктів, нові рівні — накопичуються',
    achDone: 'Усі щаблі пройдено (вищий — {r})',
    achStep: 'Щабель: римська — номер, дріб — прогрес до наступного',
    about: [
      'Кожне виконане завдання приносить досвід і монети — прогрес лише зростає і ніколи не зменшується.',
      'За виконання нараховується XP: база 10 + бонус за пріоритет (до 15) + бонус за обсяг за оцінкою часу (до 15) + 10 за «ментально складне» — чесна нагорода за силу волі. Великі й термінові справи цінніші.',
      'Накопичений XP підвищує рівень — від «Паростка» до «Легенди саду». Рівень не падає: XP не згорає і не віднімається, навіть якщо завдання видалити.',
      'Монети надходять за виконані завдання (стільки ж, скільки XP), за створення завдань і проєктів та за нові рівні. Поки що вони накопичуються — стануть у пригоді, коли сад повернеться.',
      'Досягнення відзначають віхи: виконані завдання, рівні, різні проєкти, години роботи, строгі дедлайни, «ментально складні» завдання. У кожного ступені I, II, III — прогрес видно завжди.',
      'Завдання, виконане з режиму «3 варіанти», відзначається меткою «обрав і зробив». Закриття «не хочеться робити» завжди святкується золотом — сила волі того варта. Нічого не згорає, серій і покарань немає — лише приємні нагороди.',
    ],
    levels: [
      'Паросток',
      'Сіянець',
      'Садівник',
      'Городник',
      'Дендролог',
      'Лісничий',
      'Садовий майстер',
      'Хранитель саду',
      'Королівський садівник',
      'Магістр садівництва',
      'Ландшафтний архітектор',
      'Хранитель легенд',
      'Легенда саду',
    ],
    ach: {
      firstDone: 'Перший паросток',
      done10: 'Десятка',
      level5: 'Висоти',
      sprinter: 'Спринтер',
      explorer: 'Різнобічний',
      marathon: 'Марафонець',
      deadlineBoss: 'Дедлайн-бос',
      chooser: 'Обрав і зробив',
      willpower: 'Подолання',
      recurring: 'Ритм життя',
      projectDone: 'Проєкт під ключ',
    },
    achHint: {
      firstDone: 'Закрийте перше завдання — віху відкрито.',
      done10: 'Закрийте 10, 50 і 100 завдань — по ступені за кожну віху.',
      level5: 'Досягніть 5, 10 і 15 рівня.',
      sprinter: 'Закрийте 3, 10 і 25 завдань за один день.',
      explorer: 'Майте закриті завдання в 3, 5 і 8 різних проєктах.',
      marathon: 'Накопичите 10, 50 і 100 годин роботи над завданнями — за фактом або оцінкою.',
      deadlineBoss: 'Закрийте 5, 15 і 30 завдань із суворим дедлайном-датою.',
      chooser: 'Закрийте 5, 25 і 50 завдань, узятих із режиму «3 варіанти».',
      willpower: 'Закрийте 5, 25 і 50 завдань із міткою «не хочеться робити».',
      recurring: 'Закрийте регулярне завдання.',
      projectDone: 'Завершіть проєкт повністю: усі його завдання (від трьох) закриті.',
    },
  },
  garden: {
    title: 'Сад',
    plants: 'рослин: {n}',
    levelsHint:
      'Пороги XP та нагороди кожного рівня: нові види рослин (ціна насіння) й розширення мапи. Рівень росте з досвіду за завдання — нічого не згорає.',
    rewardCreateTask: 'створення завдання',
    rewardCreateProject: 'створення проєкту',
    lastReward: 'Остання нагорода за: {title} — {date}',
    emptyTitle: 'Сад поки порожній',
    emptyText: 'Закрийте перше завдання — на грядці зросте рослина.',
    coins: 'монет: {n}',
    coinsHint: 'Валюта саду: витрачається на ріст рослин і декорації',
    shop: 'Маркет',
    shopTitle: 'Маркет саду',
    buy: 'Купити',
    notEnoughCoins: 'Не вистачає {n} монет',
    lockedUntil: 'Відкриється на рівні {n}',
    expansion: 'Розширення саду',
    expansionHint: 'Більше землі — {n} клітинок до периметра карти',
    expansionCurrent: 'Поточна карта: {cols}×{rows}',
    expansionMax: 'Вся земля відкрита',
    inventory: 'Інвентар',
    inventoryHint: 'Перетягніть декорацію або насіння на карту; декорацію можна повернути назад',
    inventoryEmpty: 'Поки порожньо: куплені декорації чекають тут — перетягніть їх на карту',
    zoomIn: 'Наблизити',
    zoomOut: 'Віддалити',
    zoomReset: 'Скинути вид',
    fullscreen: 'На весь екран',
    fullscreenExit: 'Вийти з повного екрана',
    boughtHint: 'Куплено: {name} — перетягніть її з інвентаря під картою на сад',
    decorations: 'Декорації',
    decorationsHint: 'Прикрасьте сад — декорації не дають бонусів, лише настрій',
    unique: 'унікальна',
    rareOnly: 'лише рідкісні рослини',
    seeds: 'Насіння рослин',
    seedsHint:
      'Види, відкриті рівнем, можна купити: насіння потрапляє в інвентар — перетягніть його на вільну клітинку. Рідкісні/епік народжуються лише із завдань.',
    seedBought: 'Насіння куплено — перетягніть його з інвентаря на грядку',
    speciesHint:
      'Досвід відкриває нові види й землю, монети купують насіння, ріст та прикраси. Вид фіксується за рослиною в момент народження.',
    upgrade: 'Виростити — {n} монет',
    maxStage: 'Повністю виросло',
    stage: { sprout: 'Паросток', bush: 'Кущ', bloom: 'Цвітіння' },
    speciesNames: {
      'ph-flower': 'Квітка',
      'ph-leaf': 'Зелень',
      'ph-tree-evergreen': 'Ялина',
      'ph-flower-lotus': 'Лотос',
      'ph-cactus': 'Кактус',
      'ph-tree': 'Дуб',
      'ph-drop': 'Роса',
      'ph-sun': 'Соняшник',
      'ph-tree-structure': 'Бонсай',
      'ph-butterfly': 'Метеликів кущ',
      'ph-campfire': 'Горобина',
      'ph-sparkle': 'Зорецвіт',
      'ph-fire': 'Вогнецвіт',
    },
    decorNames: {
      fence: 'Огорожа',
      bush: 'Кущ',
      flowerbed: 'Клумба',
      lantern: 'Фонар',
      bench: 'Лавка',
      birdbath: 'Поїлка для птахів',
      flag: 'Флюгер',
      birdhouse: 'Шпаківня',
      gem: 'Садове самоцвіт',
      pond: 'Ставок',
      greenhouse: 'Теплиця',
      gazebo: 'Альтанка',
    },
  },
  gamify: {
    praise: [
      'Чудово зроблено!',
      'Готово — півсправи!',
      'Ще один крок уперед.',
      'Красота!',
      'Так тримати!',
      'Мінус одне завдання, плюс настрій.',
    ],
    chosen: 'обрав і зробив',
    willpower: 'сила волі',
    willpowerText: 'Сила волі! Того варто було.',
    coins: 'монет',
    createdReward: 'Створено — краплина досвіду вже ваша',
    daily: 'Щоденна нагорода за візит',
    // Мандат ШІ-агента (ТЗ 3.20): події приходять по SSE з іншої сесії —
    // агент взяв завдання або закрив його й чекає на приймання
    claimed: 'Агент узяв завдання в роботу',
    claimedText: '{name} взялася до справи — не чіпайте завдання, поки вона працює',
    review: 'Робота чекає на приймання',
    reviewText: '«{title}» — подивіться, що зроблено, і прийміть або поверніть',
  },
  stats: {
    title: 'Статистика',
    modeDay: 'День',
    modeWeek: 'Тиждень',
    modeMonth: 'Місяць',
    today: 'Сьогодні, {date}',
    prevPeriod: 'Попередній період',
    nextPeriod: 'Наступний період',
    ofDays: 'з {n} дн.',
    totalVs: 'За період виконано: {n} · минулого разу: {m}',
    chartTitle: 'Виконані завдання',
    legendNow: 'Зараз',
    legendPrev: 'Попередній період',
    heatmapHalf: 'Активність за півроку',
    heatmapYear: 'Активність за рік',
    heatTasks: 'Завдання',
    heatXp: 'XP',
    heatLess: 'менше',
    heatMore: 'більше',
    heatHalf: 'Півроку',
    heatYear: 'Рік',
    emptyTitle: 'Поки немає даних',
    emptyText: 'Закрийте пару завдань — і тут з’явиться динаміка з порівнянням.',
    metric: {
      closed: 'Виконано завдань',
      xp: 'XP отримано',
      created: 'Створено завдань',
      hours: 'Години роботи',
      activeDays: 'Дні з результатом',
    },
  },
  home: {
    title: 'Головне',
    stackCount: 'у стеці: {n}',
    activeCount: 'активних: {n}',
    inProgress: 'У роботі',
    overdue: 'Прострочено',
    deadlines: 'Дедлайни на тиждень',
    next: 'Наступні',
    overview: 'Огляд',
    projects: 'Активні проєкти',
    totalTasks: 'Усього завдань',
    doneMonth: 'Виконано за місяць',
    doneAll: 'Виконано загалом',
    clearTitle: 'Усе спокійно',
    clearText: 'Немає активних завдань — гарний момент розібрати стек.',
  },
  stack: {
    title: 'Вхідний стек',
    count: 'Завдань у стеці: {n}',
    quickPlaceholder: 'Кинути задачу — лише текст, решта потім…',
    quickAdd: 'Кинути',
    newTask: 'Нове завдання',
    added: 'Задачу кинуто в стек',
    detailTitle: 'Деталізація задачі',
    emptyTitle: 'Стек порожній',
    emptyText: 'Киньте першу задачу — деталізація підбереться автоматично.',
    uploading: 'завантаження…',
    proposal: 'Пропозиція ШІ:',
    proposalPending: 'Деталізація підбирається…',
    approveProposal: 'Так, все вірно',
    detail: 'Деталізувати',
    redetail: 'Перепитати ШІ',
    deleteAttachment: 'Видалити вкладення',
    promptProject: 'Назва нового проєкту:',
    promptTag: 'Назва нового теґу:',
    newProject: 'Новий проєкт',
    newTag: 'Новий теґ',
    approve: 'Затвердити',
    form: {
      title: 'Заголовок',
      description: 'Опис (Markdown, Ctrl+V — картинка)',
      preview: 'Попередній перегляд Markdown',
      project: 'Проєкт',
      tagsPlaceholder: 'Додати теґ…',
      tags: 'Теґи',
      priority: 'Пріоритет',
      estimate: 'Оцінка часу',
      budget: 'Бюджет (у валюті налаштувань)',
      cost: 'Оцінка витрат (у валюті налаштувань)',
      estimateLegend: 'Оцінка',
      extra: 'Додатково',
      bugtrailDone: 'Заповнено з багрепорту',
      bugtrailFailed: 'Звіт BugTrail не відкрився',
    },
    deadline: {
      legend: 'Дедлайн',
      date: 'Строгий — дата',
      period: 'Нестрогий — період',
    },
    recur: {
      legend: 'Тип задачі',
      oneTime: 'Одноразова',
      recurring: 'Регулярна (повторюється)',
      kind: 'Правило повторення',
      interval: 'Інтервал, днів',
      weekdays: 'Дні тижня',
      monthlyDay: 'День місяця (1–31, без дня — останній)',
    },
  },
  tree: {
    addSubtask: 'Додати підзадачу',
    promptSubtask: 'Підзадача:',
  },
  task: {
    notFoundTitle: 'Задачу не знайдено',
    notFoundText: 'Можливо, задачу видалено або посилання застаріло.',
    proposalTitle: 'Пропозиція ШІ',
    proposalHint: 'Перевірте деталі та затвердіть — задача потрапить до списку.',
    proposalNotRight: 'Не те',
    description: 'Опис',
    editTitle: 'Змінити назву',
    editDescription: 'Редагувати опис',
    deadlineConflict: 'Дедлайн: або дата, або період — не обидва',
    descriptionEmpty: 'Опис порожній — деталізуйте задачу.',
    readmeFrom: 'README.md з репозиторію',
    attachments: 'Вкладення',
    fields: 'Параметри',
    dates: 'Дати',
    field: {
      project: 'Проєкт',
      taskType: 'Тип задачі',
      priority: 'Пріоритет',
      estimate: 'Оцінка часу',
      actual: 'Фактично',
      money: 'Гроші',
      deadline: 'Дедлайн',
      recurrence: 'Повторення',
      created: 'Створено',
      approved: 'Затверджено',
      done: 'Завершено',
    },
    subtasks: 'Підзадачі',
    noSubtasks: 'Підзадач немає',
    statusTitle: 'Статус',
    changeStatus: 'Змінити статус',
    takeWork: 'Взяти в роботу',
    finishWork: 'Завершено',
    finishTitle: 'Завершити завдання?',
    finishComment: 'Коментар до закриття (необовʼязково)',
    mentallyHard: {
      set: 'Не хочеться робити',
      unset: 'Зняти «ментально складне»',
      badge: 'ментально складне',
    },
    // Мандат ШІ-агента (ТЗ 3.20): позначки завдання й плашка оренди
    mandate: {
      eligible: 'Доступне для ШІ-агента',
      eligibleHint: 'Завдання зможе взяти Наві — ШІ-агент. Без позначки вона його не чіпає.',
      shortBadge: 'ШІ',
      createdBadge: 'створено агентом',
      createdBy: 'Завдання створив агент «{name}»',
      agent: 'агент',
      claimedUntil: 'Взято {name} · до {time}',
    },
    // Приймання роботи агента (ТЗ 3.20): закрито, але ще не прийнято
    accept: {
      title: 'Приймання роботи',
      pendingBadge: 'чекає приймання',
      pendingHint: 'Завдання закрив агент — роботу треба прийняти або повернути',
      hint: 'Завдання закрив {name}. Подивіться, що зроблено, і прийміть роботу або поверніть її.',
      report: 'Звіт агента',
      accept: 'Прийняти',
      reject: 'Повернути в роботу',
      accepted: 'Роботу прийнято',
      rejected: 'Завдання повернулося в роботу',
      rejectTitle: 'Повернути завдання в роботу?',
      rejectComment: 'Що не так (необовʼязково)',
    },
    subtaskCreated: 'Підзадачу створено — потрапила у стек на деталізацію',
    createdRaw: 'Завдання потрапило у стек — деталізуйте його там',
    // Промпт для ШІ-агента (0.87): текст завдання, який власник копіює та передає
    // своєму агенту. Лише факти про завдання — що з ним робити, вирішує власник
    ai: {
      menu: 'Промпт для ШІ',
      title: 'Промпт для ШІ-агента',
      hint: 'Текст завдання для передачі ШІ-агенту. За потреби відредагуйте та скопіюйте.',
      copy: 'Копіювати промпт',
      close: 'Закрити',
      intro: 'Завдання з GNexus Tasks.',
      taskSection: 'Завдання',
      descriptionSection: 'Опис',
      proposalSection: 'Деталізація (пропозиція ШІ, не затверджено)',
      subtasksSection: 'Підзадачі',
      linkSection: 'Посилання',
      id: 'ID',
      titleField: 'Заголовок',
      status: 'Статус',
      tags: 'Теги',
      parentTask: 'Батьківське завдання',
      eligible: 'Доступне для ШІ-агента',
      eligibleYes: 'так',
      eligibleNo: 'ні',
      claimed: 'Взято в роботу',
      descriptionEmpty: 'Опис порожній.',
    },
    actions: 'Дії',
    addTag: 'Додати теґ…',
    // Проєкт задачі в меню картки (0.82): перейти до проєкту й перенести
    // в інший — сусідні пункти, це одне питання «у якому проєкті задача»
    goToProject: 'Перейти до проєкту',
    moveToProject: 'Перемістити до проєкту',
    // Пункт меню картки (0.83): «Перемістити до проєкту» в китовому меню (220px)
    // рвалося на два рядки, а в меню питання звучить як «до якого проєкту»
    moveToOther: 'До іншого проєкту',
    moveHint: 'Завдання «{title}» переїде до вибраного проєкту',
    moved: 'Завдання перенесено до «{project}»',
    movedOut: 'Завдання вилучено з проєкту',
  },
  projectPage: {
    notFoundTitle: 'Проєкт не знайдено',
    notFoundText: 'Можливо, проєкт видалено або посилання застаріло.',
    note: 'Нотатка',
    editNote: 'Редагувати нотатку',
    noteEmpty: 'Нотатки ще немає — додайте її через «Редагувати».',
    readmeTitle: 'README з репозиторію',
    readmeMissing: 'README у репозиторії не знайдено — перевірте посилання в параметрах проєкту.',
    readmeError: 'Не вдалося прочитати README — репозиторій не відповів.',
    noteCollapsedHint: 'Нотатка велика — показано початок',
    noteExpand: 'Розгорнути',
    noteCollapse: 'Згорнути',
    progress: 'Задачі проєкту: {done}/{total}',
    newTask: 'Нова задача',
    taskCreated: 'Задачу створено — потрапила у стек на деталізацію',
    promptTask: 'Нова задача проєкту:',
    emptyTitle: 'Задач немає',
    emptyText: 'Створіть першу задачу проєкту або послабте фільтри.',
    tree: 'Дерево проєкту',
    stats: 'Статистика',
    total: 'Всього задач',
    doneN: 'Завершено',
    inProgress: 'У роботі',
    toDo: 'До виконання',
    overdue: 'Прострочено',
    taskCount: '{n} задач',
    openSite: 'Відкрити сайт',
    // Активність проєкту (0.83): та сама сітка «як у GitHub», що в статистиці,
    // але за завданнями одного проєкту; півроку, картка в сайдбарі сторінки проєкту
    activity: 'Активність',
    heatCell: '{date} — закрито {done}, створено {created}',
    // Хмара теґів (0.83): клік по теґу ставить підрядковий фільтр за його іменем
    tagShow: 'Показати завдання з теґом «{name}»',
    tagHide: 'Зняти фільтр за теґом «{name}»',
    tagCount: 'Завдань із цим теґом: {n}',
  },
  list: {
    title: 'Список задач',
    count: 'Знайдено: {n}',
    emptyTitle: 'Нічого не знайдено',
    emptyText: 'Спробуйте послабити фільтри або киньте нову задачу у стек.',
    filterStatus: 'Статус',
    filterTag: 'Теґ',
    filterTagSearch: 'Пошук за теґом',
    filterTagHint: 'Почніть вводити назву теґу',
    filterTagClear: 'Скинути фільтр за теґом',
    filterPrioritized: 'Пріоритетні',
    // Другий перемикач (0.91, ТЗ 3.5): лишити в списку тільки регулярні
    filterRecurring: 'Регулярні',
    noTagsFound: 'Теґів не знайдено',
    // Приймання (0.85, ТЗ 3.20): не статус, а окрема вкладка-площина
    tabReview: 'Чекає на приймання',
    // Підпис перемикача (0.94): «показати, що створив агент»
    createdAgent: 'Створені агентом',
  },
  // Журнал дій (ТЗ 3.20): хто, що і коли робив із завданнями
  journal: {
    title: 'Журнал',
    count: 'Записів: {n}',
    empty: 'Записів немає — тут зʼявляться дії із завданнями',
    filterKind: 'Тип події',
    filterKindAll: 'Усі події',
    filterActor: 'Актор',
    filterActorAll: 'Усі актори',
    actorUser: 'Я',
    actorAgent: 'Агент',
    // Коментар запису — за іконкою (0.94): у комірці він не вміщався
    showComment: 'Показати коментар',
    col: {
      when: 'Коли',
      event: 'Подія',
      task: 'Завдання',
      project: 'Проєкт',
      actor: 'Актор',
      comment: 'Коментар',
    },
    // Види записів — значення з tasklog.py, читаються людськими словами
    kind: {
      created: 'Завдання створено',
      eligible_changed: 'Доступність агенту',
      claimed: 'Взяте агентом',
      released: 'Повернуте агентом',
      status_changed: 'Зміна статусу',
      completed: 'Завдання закрито',
      accepted: 'Роботу прийнято',
      rejected: 'Роботу повернуто',
      deleted: 'Завдання видалено',
    },
    // Машинні коди коментаря для зміни прапорця (on/off) і видалений проєкт
    eligibleOn: 'Відкрите для агента',
    eligibleOff: 'Закрите для агента',
    projectGone: 'Проєкт видалено',
    taskDeleted: 'Завдання видалено — заголовок збережено в записі',
    via: {
      ui: 'з інтерфейсу',
      api: 'через API',
      mcp: 'через MCP',
    },
  },
  options: {
    title: 'Видача завдання',
    done: 'Готово',
    notNow: 'Не зараз — інші варіанти',
    availableHours: 'Доступний час, годин',
    suggest: 'Запропонувати',
    choose: 'Робимо зараз',
    emptyTitle: 'Варіантів немає',
    emptyText: 'Вільних задач під цей час не знайшлося — киньте щось у стек або зменште час.',
  },
  projects: {
    title: 'Проєкти',
    count: 'Проєктів: {n}',
    new: 'Новий проєкт',
    emptyTitle: 'Проєктів немає',
    emptyText:
      'Створіть проєкт — задачі можна буде групувати й додавати нотатки з ресурсами.',
    prompt: 'Назва нового проєкту:',
    promptLabel: 'Назва проєкту',
    taskCounts: 'Задач закрито {done}/{total}',
    noTasksYet: 'Завдань у проєкті поки немає',
    progressLabel: 'Закрито {done} з {total}',
    inProgress: '{n} у роботі',
    overdue: 'прострочено {n}',
    nextDeadline: 'Найближчий дедлайн: {date}',
    lastActivity: 'Остання активність за задачами: {date}',
    noActivity: 'без активності',
    colorNone: 'Без кольору',
    sitePlaceholder: 'https://example.com',
    repositoryPlaceholder: 'https://git.example.com/owner/repo',
    withTasks: 'Із завданнями',
    withoutTasks: 'Без завдань',
    pinned: 'Закріплені',
    pinnedLabel: 'Закріплено',
    pin: 'Закріпити проєкт',
    unpin: 'Відкріпити проєкт',
    archived: 'Проєкт надіслано до архіву',
    archiveConfirm:
      'Надіслати проєкт «{name}» і його задачі ({n}) до архіву? Все можна буде відновити.',
    edit: 'Редагувати',
    delete: 'Видалити проєкт',
    form: {
      name: 'Назва',
      relevance: 'Актуальність',
      priority: 'Пріоритет',
      note: 'Нотатка (Markdown: посилання, контекст)',
      preview: 'Попередній перегляд',
      color: 'Колір',
      siteUrl: 'Сайт',
      repositoryUrl: 'Репозиторій',
    },
  },
  pagination: {
    prev: 'Назад',
    next: 'Вперед',
    pageOf: 'Сторінка {n} з {m}',
    aria: 'Посторінкова навігація',
  },
  archive: {
    title: 'Архів',
    count: 'Проєктів: {n}',
    emptyTitle: 'Архів порожній',
    emptyText: 'Сюди потрапляють проєкти, надіслані до архіву, — разом із усіма задачами та історією.',
    restore: 'Відновити',
    restored: '«{name}» відновлено з архіву',
    deleteForever: 'Видалити назавжди',
    deleteConfirm:
      'Видалити «{name}» назавжди? Проєкт і всі його задачі буде втрачено безповоротно.',
    banner: 'Проєкт в архіві — історія доступна лише для перегляду. Відновіть його, щоб продовжити роботу.',
  },
  settings: {
    title: 'Налаштування',
    currencyTitle: 'Валюта бюджетів',
    currencyHint:
      'Одиниця обирається один раз і застосовується в усіх сумах: бюджет задачі, оцінка витрат.',
    currencyUnit: 'Одиниця вимірювання',
    saved: 'Збережено — застосовується в усіх видах.',
    languageTitle: 'Мова інтерфейсу',
    languageHint:
      'Обрана мова застосовується одразу. «Як в акаунті» — мова береться з gnexus auth.',
    languageUnit: 'Мова',
    languageAuto: 'Як в акаунті (SSO)',
    langRu: 'Русский',
    langEn: 'English',
    langUk: 'Українська',
    mcpTokenTitle: 'Токени MCP',
    mcpTokenHint:
      'Токен для ІІ-агента (наприклад, Claude): агент діє від вашого імені та бачить лише ваші дані. Значення показується один раз під час створення — одразу скопіюйте його в конфіг агента.',
    mcpTokenCreated: 'Токен створено. Він більше не буде показаний — скопіюйте зараз.',
    mcpTokenShown: 'Я зберіг токен',
    mcpTokenCopyFailed: 'Не вдалося скопіювати — виділіть і скопіюйте вручну',
    mcpTokenUnnamed: 'Без назви',
    mcpTokenDelete: 'Відкликати',
    mcpTokenNone: 'Токенів поки немає — створіть перший, щоб підключити агента.',
    mcpTokenLabel: 'Назва (наприклад, «ноутбук»)',
    mcpTokenLabelPlaceholder: 'для чого цей агент',
    mcpTokenCreate: 'Згенерувати',
    mcpOpen: 'Як підключити',

    // Системні сповіщення (ТЗ 3.21)
    pushTitle: 'Сповіщення',
    pushHint:
      'Системні сповіщення на пристрій — вони надходять, навіть коли застосунок закрито: агент узяв завдання, робота чекає на приймання, настав строк або час за ритмом.',
    pushSwitch: 'Надсилати сповіщення на цей пристрій',
    pushDevices: 'Підключених пристроїв: {n}',
    pushOn: 'Сповіщення увімкнено на цьому пристрої.',
    pushOff: 'Сповіщення вимкнено на цьому пристрої.',
    pushDenied:
      'Браузер заборонив сповіщення для цього сайту. Дозвіл повертають у налаштуваннях браузера — тут його не запитують.',
    pushUnsupported:
      'Цей браузер не вміє системних сповіщень або сторінка відкрита без HTTPS. Встановлений на телефон застосунок підходить: на iPhone — з iOS 16.4.',
    pushUnconfigured:
      'Сервер не налаштований на надсилання сповіщень — потрібні ключі VAPID у його середовищі.',
    pushRequestDenied:
      'Браузер не показав запит. Увімкніть сповіщення для сайту в налаштуваннях браузера і спробуйте ще раз.',
    pushFailed: 'Не вдалося увімкнути сповіщення',
    quietSwitch: 'Не турбувати з 22:00 до 09:00',
    quietHint:
      'У цьому вікні нагадування мовчать і в чергу не стають: щойно вікно скінчиться, прийде нагадування за станом справ на той день. Про роботу агента повідомляємо і в тихі години — вона чекає на ваше рішення.',
  },
  ext: {
    title: 'Розширення швидкого захоплення',
    whatTitle: 'Що це таке',
    whatText:
      'Клік по іконці розширення в треї браузера — і задача в стеку, не відкриваючи сервіс. У попапі дві вкладки: «Додати» (перший рядок — назва, решта — опис; можна вибрати проєкт) і «Активні» — лише перегляд, клік по задачі відкриває її в сервісі.',
    tokenTitle: 'Крок 1. Токен доступу',
    tokenText:
      'Розширення підключається персональним MCP-токеном (як ІІІ-агенти): створіть його в «Налаштуваннях → Токени MCP» — значення показується один раз.',
    tokenButton: 'Відкрити Налаштування',
    downloadTitle: 'Крок 2. Завантажити та розпакувати',
    downloadButton: 'Завантажити ZIP',
    downloadHint: 'Розпакуйте архів у будь-яку папку.',
    installTitle: 'Крок 3. Завантажити розширення в браузер',
    chromeText:
      'Chrome/Chromium: відкрийте chrome://extensions, увімкніть «Developer mode» → «Load unpacked» → виберіть розпаковану папку.',
    firefoxText:
      'Firefox: відкрийте about:debugging#/runtime/this-firefox → «Load Temporary Add-on…» → файл manifest.json з архіву.',
    connectTitle: 'Крок 4. Підключити',
    connectText:
      'Клікніть по іконці розширення, вставте токен із кроку 1 і натисніть «Підключити». Відкликання токена в «Налаштуваннях» вимикає розширення.',
    pwaTitle: 'Доступно з веб-версії',
    pwaNote:
      'Сторінка прихована у встановленому застосунку (PWA) — відкрийте сервіс у звичайній вкладці браузера.',
  },
  mcp: {
    title: 'MCP для ІІ-агентів',
    whatTitle: 'Що це таке',
    whatText:
      'У застосунок вбудовано MCP-сервер (Model Context Protocol): ІІ-агенти підключаються до нього й працюють з вашими задачами від вашого імені — створюють, шукають, оновлюють і закривають їх. Закриття задачі агентом дає ті самі нагороди, що й у застосунку: XP, монети, рослину в саду; у регулярної задачі наступний екземпляр створюється автоматично.',
    toolsTitle: 'Інструменти',
    toolsHint:
      'Сервер сам пояснює агенту порядок роботи: починати з проєктів, привʼязувати задачі до проєкту, не вигадувати ідентифікатори та слідувати підказкам у помилках.',
    toolListProjects: 'список проєктів: нотатки, статус, кількість відкритих задач',
    toolGetProject: 'контекст проєкту: нотатка і відкриті задачі',
    toolCreateTask: 'створити задачу (досить заголовка, бажано з проєктом)',
    toolUpdateTask: 'оновити поля задачі; закриття — status="done"',
    toolCompleteTask: 'завершити задачу (можна вказати фактичний час)',
    toolListTasks: 'пошук і фільтри: проєкт, тег, статус, підрядок',
    toolGetTask: 'повні дані задачі, включно з вкладеннями',
    toolListTags: 'довідник тегів',
    connectTitle: 'Як підключити агента',
    connectText:
      'Транспорт — Streamable HTTP. Адреса збігається з адресою цього застосунку. Для підключення потрібен токен доступу.',
    connectUrlLabel: 'Адреса сервера',
    connectTokenLabel: 'Токен доступу',
    connectTokenText:
      'Агент діє від вашого імені. Створіть персональний токен у Налаштуваннях — розділ «Токени MCP» — і вставте його сюди.',

    connectClaudeLabel: 'Claude Code — одна команда',
    connectJsonLabel: 'Універсальний JSON (Claude Desktop та інші клієнти)',
    copy: 'Копіювати',
    copied: 'Адресу скопійовано',
    copyFailed: 'Не вдалося скопіювати',
    projectTitle: 'Контекст проєкту',
    projectText:
      'Агент бачить ваші проєкти з нотатками та їхні відкриті задачі. Сервер інструктує агента починати роботу з проєктів (list_projects → get_project), привʼязувати створювані задачі до проєкту й перечитувати get_project, повертаючись до розмови після перерви, — так задачі не губляться поза контекстом свого проєкту.',
  },
  md: {
    bold: 'Жирний',
    boldText: 'жирний текст',
    italic: 'Курсив',
    italicText: 'курсивний текст',
    heading: 'Заголовок',
    list: 'Список',
    checklist: 'Чек-ліст',
    link: 'Посилання',
    linkText: 'текст посилання',
    code: 'Код',
  },
  login: {
    signIn: 'Увійти через GNEXUS',
    subtitle: 'Ваші завдання, проєкти та сад — в одному місці',
  },
  duration: {
    hours: 'Години',
    minutes: 'Хвилини',
    h: 'год',
    min: 'хв',
  },
  taskui: {
    openProject: 'Відкрити проєкт',
    priority: {
      very_low: 'Дуже низький',
      low: 'Низький',
      medium: 'Середній',
      high: 'Високий',
      urgent: 'Терміново',
    },
    status: {
      to_do: 'До виконання',
      in_progress: 'У роботі',
      done: 'Завершено',
      cancelled: 'Скасовано',
      deferred: 'Відкладено',
    },
    relevance: {
      active: 'Активний',
      paused: 'Призупинено',
    },
    time: {
      hm: '{h} год {m} хв',
      h: '{h} год',
      m: '{m} хв',
    },
    money: {
      budget: 'бюджет {amount}',
      estimate: 'оцінка {amount}',
    },
    currency: {
      UAH: '₴ Гривня (UAH)',
      USD: '$ Долар (USD)',
      EUR: '€ Євро (EUR)',
      GBP: '£ Фунт (GBP)',
      PLN: 'zł Злотий (PLN)',
    },
    deadline: {
      day: 'протягом дня',
      week: 'протягом тижня',
      month: 'протягом місяця',
      year: 'протягом року',
      until: 'до {date}',
    },
    countdown: {
      today: 'Сьогодні',
      tomorrow: 'Завтра',
      inDays: 'Через {n} день | Через {n} дні | Через {n} днів',
      overdueDays: 'Прострочено на {n} день | Прострочено на {n} дні | Прострочено на {n} днів',
    },
    ago: {
      today: 'Сьогодні',
      yesterday: 'Вчора',
      days: '{n} день тому | {n} дні тому | {n} днів тому',
      weeks: '{n} тиждень тому | {n} тижні тому | {n} тижнів тому',
      weeksOne: 'тиждень тому',
      months: '{n} місяць тому | {n} місяці тому | {n} місяців тому',
      monthsOne: 'місяць тому',
      years: '{n} рік тому | {n} роки тому | {n} років тому',
      yearsOne: 'рік тому',
    },
    recur: {
      kind: {
        interval: 'Кожні N днів',
        weekdays: 'Дні тижня',
        monthly: 'День місяця',
      },
      daily: 'щодня',
      weekly: 'щотижня',
      everyN: 'кожні {n} дн.',
      byWeekdays: 'за днями тижня',
      monthlyDay: 'щомісяця {day}-го',
      recurring: 'регулярна',
      // Дата регулярної читається як «коли пора» (0.91)
      next: 'наст. {date}',
      // Підказка до мітки в списку (0.91, ТЗ 3.5)
      hintNext: 'Регулярна: {rule}. Наступний екземпляр — {date}',
      hint: 'Регулярна: {rule}. Після закриття з’явиться наступний екземпляр',
    },
  },
} satisfies typeof ru