// Українська локаль — типізована як typeof ru, щоб пропущені ключі ловив vue-tsc.
import type ru from './ru'
export default {
common: {
any: '— будь-який —',
anyStatus: '— будь-який статус —',
noProject: '— без проєкту —',
none: '— немає —',
choose: '— оберіть —',
notSet: '— не вказано —',
error: 'Помилка запиту',
save: 'Зберегти',
cancel: 'Скасувати',
edit: 'Редагувати',
preview: 'Попередній перегляд',
confirmTitle: 'Підтвердження',
delete: 'Видалити',
open: 'Відкрити',
expand: 'Розгорнути',
collapse: 'Згорнути',
deleteConfirmTask: 'Видалити задачу «{title}»? Дію не можна скасувати.',
deleteConfirmProject: 'Видалити проєкт «{name}»? Задачі залишаться, але без проєкту.',
archive: 'До архіву',
archiveTitle: 'Надіслати до архіву',
saved: 'Збережено',
created: 'Створено',
create: 'Створити',
taskDeleted: 'Задачу видалено',
projectDeleted: 'Проєкт видалено',
taskApproved: 'Задачу затверджено',
taskTaken: 'Задачу взято в роботу',
taskFinished: 'Задачу завершено',
},
nav: {
sections: 'Розділи',
subtitle: 'GNexus Tasks — особисті задачі',
signIn: 'Увійти',
account: 'Акаунт',
signOut: 'Вийти',
task: 'Завдання',
home: 'Головна',
stack: 'Вхідний стек',
list: 'Список задач',
garden: 'Сад',
stats: 'Статистика',
projects: 'Проєкти',
archive: 'Архів',
options: 'Видача завдання',
settings: 'Налаштування',
},
garden: {
title: 'Сад',
level: 'Рівень {n}',
xpTotal: '{n} XP',
plants: 'рослин: {n}',
levelProgress: 'До наступного рівня: {xp} / {span} XP',
aboutOpen: 'Як це працює',
aboutTitle: 'Як влаштований сад',
levelsTitle: 'Дерево рівнів',
levelsHint:
'Пороги XP та нагороди кожного рівня: нові види рослин (ціна насіння) й розширення мапи. Рівень росте з досвіду за завдання — нічого не згорає.',
levelCurrent: 'поточний',
achDone: 'Усі щаблі пройдено (вищий — {r})',
achStep: 'Щабель: римська — номер, дріб — прогрес до наступного',
rewardCreateTask: 'створення завдання',
rewardCreateProject: 'створення проєкту',
about: [
'Кожне виконане завдання залишає на грядці рослину — сад лише зростає і ніколи не зменшується.',
'За виконання нараховується XP: база 10 + бонус за пріоритет (до 15) + бонус за обсяг за оцінкою часу (до 15) + 10 за «ментально складне» — чесна нагорода за силу волі. Великі й термінові справи цінніші.',
'Накопичений XP підвищує рівень — від «Паростка» до «Легенди саду». Рівень не падає: XP не згорає і не віднімається, навіть якщо завдання видалити.',
'Іноді завдання приносить рідкісну рослину — шанс тим вищий, що «важче» завдання. Епічні рослини дістаються лише великим завершенням.',
'Загальний принцип: досвід відкриває, монети купують. Досвід (рівень) відкриває нові види рослин і землю; монети витрачаються на ріст рослин, декорації та розширення карти. Монети надходять за виконані завдання (половина XP) та за нові рівні.',
'Досягнення відзначають віхи: виконані завдання, рівні, різні проєкти, години роботи, строгі дедлайни, «ментально складні» завдання. У кожного ступені I, II, III — прогрес видно завжди.',
'Завдання, виконане з режиму «3 варіанти», відзначається меткою «обрав і зробив». Закриття «не хочеться робити» завжди святкується золотом — сила волі того варта. Нічого не згорає, серій і покарань немає — лише приємні нагороди.',
],
lastReward: 'Остання нагорода за: {title} — {date}',
emptyTitle: 'Сад поки порожній',
emptyText: 'Закрийте перше завдання — на грядці зросте рослина.',
levels: [
'Паросток',
'Сіянець',
'Садівник',
'Городник',
'Дендролог',
'Лісничий',
'Садовий майстер',
'Хранитель саду',
'Королівський садівник',
'Магістр садівництва',
'Ландшафтний архітектор',
'Хранитель легенд',
'Легенда саду',
],
achievements: 'Досягнення',
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: 'Альтанка',
},
ach: {
firstDone: 'Перший паросток',
done10: 'Десятка',
level5: 'Висоти',
sprinter: 'Спринтер',
explorer: 'Різнобічний',
marathon: 'Марафонець',
deadlineBoss: 'Дедлайн-бос',
chooser: 'Обрав і зробив',
willpower: 'Подолання',
recurring: 'Ритм життя',
projectDone: 'Проєкт під ключ',
},
},
gamify: {
praise: [
'Чудово зроблено!',
'Готово — півсправи!',
'Ще один крок уперед.',
'Красота!',
'Так тримати!',
'Мінус одне завдання, плюс настрій.',
],
rarePlant: 'На грядці зросла рідкісна рослина!',
epicPlant: 'Легендарна рослина в саду!',
chosen: 'обрав і зробив',
willpower: 'сила волі',
willpowerText: 'Сила волі! Того варто було.',
coins: 'монет',
createdReward: 'Створено — краплина досвіду вже ваша',
daily: 'Щоденна нагорода за візит',
},
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: 'Киньте першу задачу — деталізація підбереться автоматично.',
inStack: 'у стеці',
uploading: 'завантаження…',
proposal: 'Пропозиція ШІ:',
proposalPending: 'Деталізація підбирається…',
proposalNewProject: '+ проєкт «{name}»',
approveProposal: 'Так, все вірно',
detail: 'Деталізувати',
redetail: 'Перепитати ШІ',
deleteTask: 'Видалити задачу',
deleteAttachment: 'Видалити вкладення',
promptProject: 'Назва нового проєкту:',
promptTag: 'Назва нового теґу:',
newProject: 'Новий проєкт',
newTag: 'Новий теґ',
approve: 'Затвердити',
form: {
title: 'Заголовок',
description: 'Опис (Markdown, Ctrl+V — картинка)',
preview: 'Попередній перегляд Markdown',
project: 'Проєкт',
tagsPlaceholder: 'Додати теґ…',
tags: 'Теґи',
priority: 'Пріоритет',
estimate: 'Оцінка часу',
budget: 'Бюджет (у валюті налаштувань)',
cost: 'Оцінка витрат (у валюті налаштувань)',
estimateLegend: 'Оцінка',
extra: 'Додатково',
},
deadline: {
legend: 'Дедлайн',
date: 'Строгий — дата',
period: 'Нестрогий — період',
},
recur: {
legend: 'Тип задачі',
oneTime: 'Одноразова',
recurring: 'Регулярна (повторюється)',
kind: 'Правило повторення',
interval: 'Інтервал, днів',
weekdays: 'Дні тижня',
monthlyDay: 'День місяця (1–31, без дня — останній)',
},
},
tree: {
addSubtask: 'Додати підзадачу',
promptSubtask: 'Підзадача:',
},
task: {
notFoundTitle: 'Задачу не знайдено',
notFoundText: 'Можливо, задачу видалено або посилання застаріло.',
proposalNewTitle: 'Новий заголовок',
proposalNewDescription: 'Опис із кроками',
proposalTitle: 'Пропозиція ШІ',
proposalHint: 'Перевірте деталі та затвердіть — задача потрапить до списку.',
proposalMyself: 'Я сам',
description: 'Опис',
editTitle: 'Змінити назву',
editDescription: 'Редагувати опис',
deadlineConflict: 'Дедлайн: або дата, або період — не обидва',
descriptionEmpty: 'Опис порожній — деталізуйте задачу.',
attachments: 'Вкладення',
fields: 'Параметри',
dates: 'Дати',
field: {
project: 'Проєкт',
taskType: 'Тип задачі',
priority: 'Пріоритет',
estimate: 'Оцінка часу',
actual: 'Фактично',
money: 'Гроші',
deadline: 'Дедлайн',
recurrence: 'Повторення',
created: 'Створено',
approved: 'Затверджено',
done: 'Завершено',
},
subtasks: 'Підзадачі',
noSubtasks: 'Підзадач немає',
statusTitle: 'Статус',
changeStatus: 'Змінити статус',
takeWork: 'Взяти в роботу',
mentallyHard: {
set: 'Не хочеться робити',
unset: 'Зняти «ментально складне»',
badge: 'ментально складне',
},
subtaskCreated: 'Підзадачу створено — потрапила у стек на деталізацію',
createdRaw: 'Завдання потрапило у стек — деталізуйте його там',
actions: 'Дії',
addTag: 'Додати теґ…',
},
projectPage: {
notFoundTitle: 'Проєкт не знайдено',
notFoundText: 'Можливо, проєкт видалено або посилання застаріло.',
note: 'Нотатка',
editNote: 'Редагувати нотатку',
noteEmpty: 'Нотатки ще немає — додайте її через «Редагувати».',
progress: 'Задачі проєкту: {done}/{total}',
newTask: 'Нова задача',
taskCreated: 'Задачу створено — потрапила у стек на деталізацію',
promptTask: 'Нова задача проєкту:',
emptyTitle: 'Задач немає',
emptyText: 'Створіть першу задачу проєкту або послабте фільтри.',
tree: 'Дерево проєкту',
stats: 'Статистика',
total: 'Всього задач',
doneN: 'Завершено',
inProgress: 'У роботі',
toDo: 'До виконання',
overdue: 'Прострочено',
taskCount: '{n} задач',
},
list: {
title: 'Список задач',
count: 'Знайдено: {n}',
emptyTitle: 'Нічого не знайдено',
emptyText: 'Спробуйте послабити фільтри або киньте нову задачу у стек.',
filterStatus: 'Статус',
filterProject: 'Проєкт',
filterTag: 'Теґ',
filterPriority: 'Пріоритет',
},
options: {
title: 'Видача завдання',
done: 'Готово',
notNow: 'Не зараз — інші варіанти',
availableHours: 'Доступний час, годин',
suggest: 'Запропонувати',
choose: 'Робимо зараз',
emptyTitle: 'Варіантів немає',
emptyText: 'Вільних задач під цей час не знайшлося — киньте щось у стек або зменште час.',
},
projects: {
title: 'Проєкти',
count: 'Проєктів: {n}',
new: 'Новий проєкт',
emptyTitle: 'Проєктів немає',
emptyText:
'Створіть проєкт — задачі можна буде групувати й додавати нотатки з ресурсами.',
prompt: 'Назва нового проєкту:',
promptLabel: 'Назва проєкту',
taskCounts: 'Задач закрито {done}/{total}',
archived: 'Проєкт надіслано до архіву',
archiveConfirm:
'Надіслати проєкт «{name}» і його задачі ({n}) до архіву? Все можна буде відновити.',
edit: 'Редагувати',
delete: 'Видалити проєкт',
form: {
name: 'Назва',
relevance: 'Актуальність',
priority: 'Пріоритет',
note: 'Нотатка (Markdown: посилання, контекст)',
preview: 'Попередній перегляд',
},
},
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: 'Українська',
mcpHint: "ІІ-агенти (наприклад, Claude) можуть працювати з вашими задачами через MCP.",
mcpOpen: 'Як підключити',
},
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:
'Авторизація — bearer-токен: значення налаштування MCP_TOKEN у конфізі backend (змінна середовища, у .env; до репозиторію не потрапляє). Один токен для всіх агентів — зберігайте його як пароль: будь-хто, хто ним володіє, може керувати задачами.',
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: 'Код',
},
duration: {
hours: 'Години',
minutes: 'Хвилини',
h: 'год',
min: 'хв',
},
taskui: {
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}',
},
recur: {
kind: {
interval: 'Кожні N днів',
weekdays: 'Дні тижня',
monthly: 'День місяця',
},
daily: 'щодня',
weekly: 'щотижня',
everyN: 'кожні {n} дн.',
byWeekdays: 'за днями тижня',
monthlyDay: 'щомісяця {day}-го',
recurring: 'регулярна',
},
},
} satisfies typeof ru