Quellcode durchsuchen

feat(i18n): add Ukrainian (uk) locale support (#28061)

MYMDO vor 2 Monaten
Ursprung
Commit
cbd2620c46

+ 6 - 0
packages/app/src/context/language.tsx

@@ -18,6 +18,7 @@ export type Locale =
   | "ja"
   | "pl"
   | "ru"
+  | "uk"
   | "ar"
   | "no"
   | "br"
@@ -45,6 +46,7 @@ const LOCALES: readonly Locale[] = [
   "ja",
   "pl",
   "ru",
+  "uk",
   "bs",
   "ar",
   "no",
@@ -65,6 +67,7 @@ const INTL: Record<Locale, string> = {
   ja: "ja",
   pl: "pl",
   ru: "ru",
+  uk: "uk",
   ar: "ar",
   no: "nb-NO",
   br: "pt-BR",
@@ -85,6 +88,7 @@ const LABEL_KEY: Record<Locale, keyof Dictionary> = {
   ja: "language.ja",
   pl: "language.pl",
   ru: "language.ru",
+  uk: "language.uk",
   ar: "language.ar",
   no: "language.no",
   br: "language.br",
@@ -110,6 +114,7 @@ const loaders: Record<Exclude<Locale, "en">, () => Promise<Dictionary>> = {
   ja: () => merge(import("@/i18n/ja"), import("@opencode-ai/ui/i18n/ja")),
   pl: () => merge(import("@/i18n/pl"), import("@opencode-ai/ui/i18n/pl")),
   ru: () => merge(import("@/i18n/ru"), import("@opencode-ai/ui/i18n/ru")),
+  uk: () => merge(import("@/i18n/uk"), import("@opencode-ai/ui/i18n/uk")),
   ar: () => merge(import("@/i18n/ar"), import("@opencode-ai/ui/i18n/ar")),
   no: () => merge(import("@/i18n/no"), import("@opencode-ai/ui/i18n/no")),
   br: () => merge(import("@/i18n/br"), import("@opencode-ai/ui/i18n/br")),
@@ -145,6 +150,7 @@ const localeMatchers: Array<{ locale: Locale; match: (language: string) => boole
   { locale: "ja", match: (language) => language.startsWith("ja") },
   { locale: "pl", match: (language) => language.startsWith("pl") },
   { locale: "ru", match: (language) => language.startsWith("ru") },
+  { locale: "uk", match: (language) => language.startsWith("uk") },
   { locale: "ar", match: (language) => language.startsWith("ar") },
   {
     locale: "no",

+ 1 - 0
packages/app/src/i18n/en.ts

@@ -416,6 +416,7 @@ export const dict = {
   "language.no": "Norsk",
   "language.br": "Português (Brasil)",
   "language.bs": "Bosanski",
+  "language.uk": "Українська",
   "language.th": "ไทย",
   "language.tr": "Türkçe",
 

+ 2 - 1
packages/app/src/i18n/parity.test.ts

@@ -12,12 +12,13 @@ import { dict as ko } from "./ko"
 import { dict as no } from "./no"
 import { dict as pl } from "./pl"
 import { dict as ru } from "./ru"
+import { dict as uk } from "./uk"
 import { dict as th } from "./th"
 import { dict as zh } from "./zh"
 import { dict as zht } from "./zht"
 import { dict as tr } from "./tr"
 
-const locales = [ar, br, bs, da, de, es, fr, ja, ko, no, pl, ru, th, tr, zh, zht]
+const locales = [ar, br, bs, da, de, es, fr, ja, ko, no, pl, ru, uk, th, tr, zh, zht]
 const keys = ["command.session.previous.unseen", "command.session.next.unseen"] as const
 
 describe("i18n parity", () => {

+ 963 - 0
packages/app/src/i18n/uk.ts

@@ -0,0 +1,963 @@
+export const dict = {
+  "command.category.suggested": "Рекомендовані",
+  "command.category.view": "Вигляд",
+  "command.category.project": "Проєкт",
+  "command.category.provider": "Провайдер",
+  "command.category.server": "Сервер",
+  "command.category.session": "Сесія",
+  "command.category.theme": "Тема",
+  "command.category.language": "Мова",
+  "command.category.file": "Файл",
+  "command.category.context": "Контекст",
+  "command.category.terminal": "Термінал",
+  "command.category.model": "Модель",
+  "command.category.mcp": "MCP",
+  "command.category.agent": "Агент",
+  "command.category.permissions": "Дозволи",
+  "command.category.workspace": "Робоча область",
+  "command.category.settings": "Налаштування",
+
+  "theme.scheme.system": "Системна",
+  "theme.scheme.light": "Світла",
+  "theme.scheme.dark": "Темна",
+
+  "command.sidebar.toggle": "Перемкнути бічну панель",
+  "command.project.open": "Відкрити проєкт",
+  "command.project.previous": "Попередній проєкт",
+  "command.project.next": "Наступний проєкт",
+  "command.project.index": "Перемкнути на проєкт {{index}}",
+  "command.provider.connect": "Підключити провайдера",
+  "command.server.switch": "Перемкнути сервер",
+  "command.settings.open": "Відкрити налаштування",
+  "command.session.previous": "Попередня сесія",
+  "command.session.next": "Наступна сесія",
+  "command.session.previous.unseen": "Попередня непрочитана сесія",
+  "command.session.next.unseen": "Наступна непрочитана сесія",
+  "command.session.archive": "Архівувати сесію",
+
+  "command.palette": "Палітра команд",
+
+  "command.theme.cycle": "Перемкнути тему",
+  "command.theme.set": "Використати тему: {{theme}}",
+  "command.theme.scheme.cycle": "Перемкнути кольорову схему",
+  "command.theme.scheme.set": "Використати кольорову схему: {{scheme}}",
+
+  "command.language.cycle": "Перемкнути мову",
+  "command.language.set": "Використати мову: {{language}}",
+
+  "command.session.new": "Нова сесія",
+  "command.file.open": "Відкрити файл",
+  "command.tab.close": "Закрити вкладку",
+  "command.context.addSelection": "Додати виділення до контексту",
+  "command.context.addSelection.description": "Додати вибрані рядки з поточного файлу",
+  "command.input.focus": "Фокус на полі введення",
+  "command.terminal.toggle": "Перемкнути термінал",
+  "command.fileTree.toggle": "Перемкнути дерево файлів",
+  "command.review.toggle": "Перемкнути огляд",
+  "command.terminal.new": "Новий термінал",
+  "command.terminal.new.description": "Створити нову вкладку термінала",
+  "command.steps.toggle": "Перемкнути кроки",
+  "command.steps.toggle.description": "Показати або приховати кроки для поточного повідомлення",
+  "command.message.previous": "Попереднє повідомлення",
+  "command.message.previous.description": "Перейти до попереднього повідомлення користувача",
+  "command.message.next": "Наступне повідомлення",
+  "command.message.next.description": "Перейти до наступного повідомлення користувача",
+  "command.model.choose": "Вибрати модель",
+  "command.model.choose.description": "Вибрати іншу модель",
+  "command.mcp.toggle": "Перемкнути MCP",
+  "command.mcp.toggle.description": "Перемкнути MCP",
+  "command.agent.cycle": "Перемкнути агента",
+  "command.agent.cycle.description": "Перемкнути на наступного агента",
+  "command.agent.cycle.reverse": "Перемкнути агента в зворотному напрямку",
+  "command.agent.cycle.reverse.description": "Перемкнути на попереднього агента",
+  "command.model.variant.cycle": "Перемкнути рівень мислення",
+  "command.model.variant.cycle.description": "Перемкнути на наступний рівень зусилля",
+  "command.prompt.mode.shell": "Команда",
+  "command.prompt.mode.normal": "Запит",
+  "command.permissions.autoaccept.enable": "Автоматично приймати дозволи",
+  "command.permissions.autoaccept.disable": "Зупинити автоматичне прийняття дозволів",
+  "command.workspace.toggle": "Перемкнути робочі області",
+  "command.workspace.toggle.description": "Увімкнути або вимкнути декілька робочих областей на бічній панелі",
+  "command.session.undo": "Скасувати",
+  "command.session.undo.description": "Скасувати останнє повідомлення",
+  "command.session.redo": "Повторити",
+  "command.session.redo.description": "Повторити останнє скасоване повідомлення",
+  "command.session.compact": "Стиснути сесію",
+  "command.session.compact.description": "Підсумувати сесію, щоб зменшити розмір контексту",
+  "command.session.fork": "Відгалузити від повідомлення",
+  "command.session.fork.description": "Створити нову сесію з попереднього повідомлення",
+  "command.session.share": "Поділитися сесією",
+  "command.session.share.description": "Поділитися цією сесією та скопіювати URL у буфер обміну",
+  "command.session.unshare": "Припинити поширення сесії",
+  "command.session.unshare.description": "Припинити поширення цієї сесії",
+
+  "palette.search.placeholder": "Пошук файлів, команд і сесій",
+  "palette.empty": "Результатів не знайдено",
+  "palette.group.commands": "Команди",
+  "palette.group.files": "Файли",
+
+  "dialog.provider.search.placeholder": "Пошук провайдерів",
+  "dialog.provider.empty": "Провайдерів не знайдено",
+  "dialog.provider.group.popular": "Популярні",
+  "dialog.provider.group.other": "Інші",
+  "dialog.provider.tag.recommended": "Рекомендовані",
+  "dialog.provider.opencode.note": "Відібрані моделі, включаючи Claude, GPT, Gemini та інші",
+  "dialog.provider.opencode.tagline": "Надійні оптимізовані моделі",
+  "dialog.provider.opencodeGo.tagline": "Недорога підписка для всіх",
+  "dialog.provider.anthropic.note": "Прямий доступ до моделей Claude, включаючи Pro та Max",
+  "dialog.provider.copilot.note": "Моделі AI для допомоги в кодуванні через GitHub Copilot",
+  "dialog.provider.openai.note": "Моделі GPT для швидких і універсальних завдань AI",
+  "dialog.provider.google.note": "Моделі Gemini для швидких структурованих відповідей",
+  "dialog.provider.openrouter.note": "Доступ до всіх підтримуваних моделей від одного провайдера",
+  "dialog.provider.vercel.note": "Уніфікований доступ до моделей AI з інтелектуальною маршрутизацією",
+
+  "dialog.model.select.title": "Вибрати модель",
+  "dialog.model.search.placeholder": "Пошук моделей",
+  "dialog.model.empty": "Немає результатів моделей",
+  "dialog.model.manage": "Керувати моделями",
+  "dialog.model.manage.description": "Налаштуйте, які моделі відображатимуться у виборі моделей.",
+  "dialog.model.manage.provider.toggle": "Перемкнути всі моделі {{provider}}",
+
+  "dialog.model.unpaid.freeModels.title": "Безкоштовні моделі від OpenCode",
+  "dialog.model.unpaid.addMore.title": "Додати більше моделей від популярних провайдерів",
+
+  "dialog.provider.viewAll": "Показати більше провайдерів",
+
+  "provider.connect.title": "Підключити {{provider}}",
+  "provider.connect.title.anthropicProMax": "Увійти з Claude Pro/Max",
+  "provider.connect.selectMethod": "Виберіть спосіб входу для {{provider}}.",
+  "provider.connect.method.apiKey": "Ключ API",
+  "provider.connect.status.inProgress": "Авторизація виконується...",
+  "provider.connect.status.waiting": "Очікування авторизації...",
+  "provider.connect.status.failed": "Авторизація не вдалася: {{error}}",
+  "provider.connect.apiKey.description":
+    "Введіть ключ API {{provider}}, щоб підключити обліковий запис і використовувати моделі {{provider}} у OpenCode.",
+  "provider.connect.apiKey.label": "Ключ API {{provider}}",
+  "provider.connect.apiKey.placeholder": "Ключ API",
+  "provider.connect.apiKey.required": "Ключ API обов'язковий",
+  "provider.connect.opencodeZen.line1":
+    "OpenCode Zen надає доступ до відібраного набору надійних оптимізованих моделей для агентів кодування.",
+  "provider.connect.opencodeZen.line2":
+    "З одним ключем API ви отримаєте доступ до таких моделей, як Claude, GPT, Gemini, GLM та інших.",
+  "provider.connect.opencodeZen.visit.prefix": "Відвідайте ",
+  "provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
+  "provider.connect.opencodeZen.visit.suffix": ", щоб отримати ключ API.",
+  "provider.connect.oauth.code.visit.prefix": "Відвідайте ",
+  "provider.connect.oauth.code.visit.link": "це посилання",
+  "provider.connect.oauth.code.visit.suffix":
+    ", щоб отримати код авторизації, підключити обліковий запис і використовувати моделі {{provider}} у OpenCode.",
+  "provider.connect.oauth.code.label": "Код авторизації {{method}}",
+  "provider.connect.oauth.code.placeholder": "Код авторизації",
+  "provider.connect.oauth.code.required": "Код авторизації обов'язковий",
+  "provider.connect.oauth.code.invalid": "Недійсний код авторизації",
+  "provider.connect.oauth.auto.visit.prefix": "Відвідайте ",
+  "provider.connect.oauth.auto.visit.link": "це посилання",
+  "provider.connect.oauth.auto.visit.suffix":
+    " і введіть код нижче, щоб підключити обліковий запис і використовувати моделі {{provider}} у OpenCode.",
+  "provider.connect.oauth.auto.confirmationCode": "Код підтвердження",
+  "provider.connect.toast.connected.title": "{{provider}} підключено",
+  "provider.connect.toast.connected.description": "Моделі {{provider}} тепер доступні для використання.",
+
+  "provider.custom.title": "Користувацький провайдер",
+  "provider.custom.description.prefix": "Налаштуйте провайдера, сумісного з OpenAI. Перегляньте ",
+  "provider.custom.description.link": "документацію з налаштування провайдера",
+  "provider.custom.description.suffix": ".",
+  "provider.custom.field.providerID.label": "ID провайдера",
+  "provider.custom.field.providerID.placeholder": "myprovider",
+  "provider.custom.field.providerID.description": "Малі літери, цифри, дефіси або підкреслення",
+  "provider.custom.field.name.label": "Відображувана назва",
+  "provider.custom.field.name.placeholder": "Мій AI Провайдер",
+  "provider.custom.field.baseURL.label": "Базовий URL",
+  "provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
+  "provider.custom.field.apiKey.label": "Ключ API",
+  "provider.custom.field.apiKey.placeholder": "Ключ API",
+  "provider.custom.field.apiKey.description": "Необов'язково. Залиште порожнім, якщо ви керуєте авторизацією через заголовки.",
+  "provider.custom.models.label": "Моделі",
+  "provider.custom.models.id.label": "ID",
+  "provider.custom.models.id.placeholder": "model-id",
+  "provider.custom.models.name.label": "Назва",
+  "provider.custom.models.name.placeholder": "Відображувана назва",
+  "provider.custom.models.remove": "Видалити модель",
+  "provider.custom.models.add": "Додати модель",
+  "provider.custom.headers.label": "Заголовки (необов'язково)",
+  "provider.custom.headers.key.label": "Заголовок",
+  "provider.custom.headers.key.placeholder": "Назва-Заголовка",
+  "provider.custom.headers.value.label": "Значення",
+  "provider.custom.headers.value.placeholder": "значення",
+  "provider.custom.headers.remove": "Видалити заголовок",
+  "provider.custom.headers.add": "Додати заголовок",
+  "provider.custom.error.providerID.required": "ID провайдера обов'язкове",
+  "provider.custom.error.providerID.format": "Використовуйте малі літери, цифри, дефіси або підкреслення",
+  "provider.custom.error.providerID.exists": "ID провайдера вже існує",
+  "provider.custom.error.name.required": "Відображувана назва обов'язкова",
+  "provider.custom.error.baseURL.required": "Базовий URL обов'язковий",
+  "provider.custom.error.baseURL.format": "Має починатися з http:// або https://",
+  "provider.custom.error.required": "Обов'язково",
+  "provider.custom.error.duplicate": "Дублікат",
+
+  "provider.disconnect.toast.disconnected.title": "{{provider}} відключено",
+  "provider.disconnect.toast.disconnected.description": "Моделі {{provider}} більше недоступні.",
+
+  "model.tag.free": "Безкоштовно",
+  "model.tag.latest": "Остання",
+  "model.provider.anthropic": "Anthropic",
+  "model.provider.openai": "OpenAI",
+  "model.provider.google": "Google",
+  "model.provider.xai": "xAI",
+  "model.provider.meta": "Meta",
+  "model.input.text": "текст",
+  "model.input.image": "зображення",
+  "model.input.audio": "аудіо",
+  "model.input.video": "відео",
+  "model.input.pdf": "pdf",
+  "model.tooltip.allows": "Дозволяє: {{inputs}}",
+  "model.tooltip.reasoning.allowed": "Підтримує мислення",
+  "model.tooltip.reasoning.none": "Без мислення",
+  "model.tooltip.context": "Ліміт контексту {{limit}}",
+
+  "common.search.placeholder": "Пошук",
+  "common.goBack": "Назад",
+  "common.goForward": "Вперед",
+  "common.loading": "Завантаження",
+  "common.loading.ellipsis": "...",
+  "common.cancel": "Скасувати",
+  "common.open": "Відкрити",
+  "common.connect": "Підключити",
+  "common.disconnect": "Відключити",
+  "common.continue": "Продовжити",
+  "common.submit": "Надіслати",
+  "common.save": "Зберегти",
+  "common.saving": "Збереження...",
+  "common.default": "За замовчуванням",
+  "common.attachment": "вкладення",
+
+  "prompt.placeholder.shell": "Введіть команду термінала... {{example}}",
+  "prompt.placeholder.normal": "Запитайте що завгодно... \"{{example}}\"",
+  "prompt.placeholder.simple": "Запитайте що завгодно...",
+  "prompt.placeholder.summarizeComments": "Підсумувати коментарі…",
+  "prompt.placeholder.summarizeComment": "Підсумувати коментар…",
+  "prompt.mode.shell": "Команда",
+  "prompt.mode.normal": "Запит",
+  "prompt.mode.shell.exit": "esc для виходу",
+  "session.child.promptDisabled": "Сесії підагентів не можна надсилати запити.",
+  "session.child.backToParent": "Назад до основної сесії.",
+
+  "prompt.example.1": "Виправити TODO у коді",
+  "prompt.example.2": "Який технологічний стек цього проєкту?",
+  "prompt.example.3": "Виправити зламані тести",
+  "prompt.example.4": "Пояснити, як працює автентифікація",
+  "prompt.example.5": "Знайти та виправити вразливості безпеки",
+  "prompt.example.6": "Додати модульні тести для сервісу користувача",
+  "prompt.example.7": "Рефакторити цю функцію, щоб зробити її більш читабельною",
+  "prompt.example.8": "Що означає ця помилка?",
+  "prompt.example.9": "Допоможіть мені налагодити цю проблему",
+  "prompt.example.10": "Згенерувати документацію API",
+  "prompt.example.11": "Оптимізувати запити до бази даних",
+  "prompt.example.12": "Додати валідацію введення",
+  "prompt.example.13": "Створити новий компонент для...",
+  "prompt.example.14": "Як розгорнути цей проєкт?",
+  "prompt.example.15": "Перевірити мій код на відповідність найкращим практикам",
+  "prompt.example.16": "Додати обробку помилок до цієї функції",
+  "prompt.example.17": "Пояснити цей регулярний вираз",
+  "prompt.example.18": "Конвертувати це в TypeScript",
+  "prompt.example.19": "Додати логування по всьому коду",
+  "prompt.example.20": "Які залежності застарілі?",
+  "prompt.example.21": "Допоможіть написати скрипт міграції",
+  "prompt.example.22": "Реалізувати кешування для цього ендпоінта",
+  "prompt.example.23": "Додати посторінкову навігацію до цього списку",
+  "prompt.example.24": "Створити команду CLI для...",
+  "prompt.example.25": "Як тут працюють змінні середовища?",
+
+  "prompt.popover.emptyResults": "Немає відповідних результатів",
+  "prompt.popover.emptyCommands": "Немає відповідних команд",
+  "prompt.dropzone.label": "Перетягніть сюди зображення, PDF або текстові файли",
+  "prompt.dropzone.file.label": "Перетягніть, щоб @згадати файл",
+  "prompt.slash.badge.custom": "користувацький",
+  "prompt.slash.badge.skill": "навичка",
+  "prompt.slash.badge.mcp": "mcp",
+  "prompt.context.active": "активний",
+  "prompt.context.includeActiveFile": "Включити активний файл",
+  "prompt.context.removeActiveFile": "Видалити активний файл з контексту",
+  "prompt.context.removeFile": "Видалити файл з контексту",
+  "prompt.action.attachFile": "Додати файли",
+  "prompt.attachment.remove": "Видалити вкладення",
+  "prompt.action.send": "Надіслати",
+  "prompt.action.stop": "Зупинити",
+
+  "prompt.toast.pasteUnsupported.title": "Непідтримуване вкладення",
+  "prompt.toast.pasteUnsupported.description": "Сюди можна прикріплювати лише зображення, PDF або текстові файли.",
+  "prompt.toast.modelAgentRequired.title": "Виберіть агента та модель",
+  "prompt.toast.modelAgentRequired.description": "Виберіть агента та модель перед надсиланням запиту.",
+  "prompt.toast.worktreeCreateFailed.title": "Не вдалося створити робоче дерево",
+  "prompt.toast.sessionCreateFailed.title": "Не вдалося створити сесію",
+  "prompt.toast.shellSendFailed.title": "Не вдалося надіслати команду термінала",
+  "prompt.toast.commandSendFailed.title": "Не вдалося надіслати команду",
+  "prompt.toast.promptSendFailed.title": "Не вдалося надіслати запит",
+  "prompt.toast.promptSendFailed.description": "Не вдалося отримати сесію",
+
+  "dialog.mcp.title": "MCP",
+  "dialog.mcp.description": "{{enabled}} з {{total}} увімкнено",
+  "dialog.mcp.empty": "MCP не налаштовано",
+
+  "dialog.lsp.empty": "LSP автоматично виявлені за типами файлів",
+  "dialog.plugins.empty": "Плагіни налаштовані в opencode.json",
+
+  "mcp.status.connected": "підключено",
+  "mcp.status.failed": "помилка",
+  "mcp.status.needs_auth": "потрібна авторизація",
+  "mcp.status.disabled": "вимкнено",
+  "mcp.auth.clickToAuthenticate": "Натисніть для автентифікації",
+
+  "dialog.fork.empty": "Немає повідомлень для відгалуження",
+
+  "dialog.directory.search.placeholder": "Пошук папок",
+  "dialog.directory.empty": "Папок не знайдено",
+
+  "app.server.unreachable": "Не вдалося досягти {{server}}",
+  "app.server.retrying": "Автоматичне повторення...",
+  "app.server.otherServers": "Інші сервери",
+
+  "dialog.server.title": "Сервери",
+  "dialog.server.description": "Перемкніть сервер OpenCode, до якого підключається ця програма.",
+  "dialog.server.search.placeholder": "Пошук серверів",
+  "dialog.server.empty": "Ще немає серверів",
+  "dialog.server.add.title": "Додати сервер",
+  "dialog.server.add.url": "Адреса сервера",
+  "dialog.server.add.placeholder": "http://localhost:4096",
+  "dialog.server.add.error": "Не вдалося підключитися до сервера",
+  "dialog.server.add.checking": "Перевірка...",
+  "dialog.server.add.button": "Додати сервер",
+  "dialog.server.add.name": "Назва сервера (необов'язково)",
+  "dialog.server.add.namePlaceholder": "Localhost",
+  "dialog.server.add.username": "Ім'я користувача (необов'язково)",
+  "dialog.server.add.usernamePlaceholder": "ім'я користувача",
+  "dialog.server.add.password": "Пароль (необов'язково)",
+  "dialog.server.add.passwordPlaceholder": "пароль",
+  "dialog.server.edit.title": "Редагувати сервер",
+  "dialog.server.default.title": "Сервер за замовчуванням",
+  "dialog.server.default.description":
+    "Підключатися до цього сервера під час запуску програми замість запуску локального сервера. Потребує перезапуску.",
+  "dialog.server.default.none": "Сервер не вибрано",
+  "dialog.server.default.set": "Встановити поточний сервер як сервер за замовчуванням",
+  "dialog.server.default.clear": "Очистити",
+  "dialog.server.action.remove": "Видалити сервер",
+
+  "dialog.server.menu.edit": "Редагувати",
+  "dialog.server.menu.default": "Встановити за замовчуванням",
+  "dialog.server.menu.defaultRemove": "Видалити за замовчуванням",
+  "dialog.server.menu.delete": "Видалити",
+  "dialog.server.current": "Поточний сервер",
+  "dialog.server.status.default": "За замовчуванням",
+  "server.row.noUsername": "без імені користувача",
+
+  "dialog.project.edit.title": "Редагувати проєкт",
+  "dialog.project.edit.name": "Назва",
+  "dialog.project.edit.icon": "Іконка",
+  "dialog.project.edit.icon.alt": "Іконка проєкту",
+  "dialog.project.edit.icon.hint": "Натисніть або перетягніть зображення",
+  "dialog.project.edit.icon.recommended": "Рекомендовано: 128x128px",
+  "dialog.project.edit.color": "Колір",
+  "dialog.project.edit.color.select": "Вибрати колір {{color}}",
+  "dialog.project.edit.worktree.startup": "Скрипт запуску робочої області",
+  "dialog.project.edit.worktree.startup.description": "Виконується після створення нової робочої області (worktree).",
+  "dialog.project.edit.worktree.startup.placeholder": "напр. bun install",
+
+  "dialog.releaseNotes.action.getStarted": "Розпочати",
+  "dialog.releaseNotes.action.next": "Далі",
+  "dialog.releaseNotes.action.hideFuture": "Не показувати це в майбутньому",
+  "dialog.releaseNotes.media.alt": "Попередній перегляд релізу",
+
+  "context.breakdown.title": "Розподіл контексту",
+  "context.breakdown.note": "Приблизний розподіл вхідних токенів. \"Інше\" включає визначення інструментів і накладні витрати.",
+  "context.breakdown.system": "Система",
+  "context.breakdown.user": "Користувач",
+  "context.breakdown.assistant": "Асистент",
+  "context.breakdown.tool": "Виклики інструментів",
+  "context.breakdown.other": "Інше",
+
+  "context.systemPrompt.title": "Системний запит",
+  "context.rawMessages.title": "Сировинні повідомлення",
+
+  "context.stats.session": "Сесія",
+  "context.stats.messages": "Повідомлення",
+  "context.stats.provider": "Провайдер",
+  "context.stats.model": "Модель",
+  "context.stats.limit": "Ліміт контексту",
+  "context.stats.totalTokens": "Всього токенів",
+  "context.stats.usage": "Використання",
+  "context.stats.inputTokens": "Вхідні токени",
+  "context.stats.outputTokens": "Вихідні токени",
+  "context.stats.reasoningTokens": "Токени мислення",
+  "context.stats.cacheTokens": "Токени кешу (читання/запис)",
+  "context.stats.userMessages": "Повідомлення користувача",
+  "context.stats.assistantMessages": "Повідомлення асистента",
+  "context.stats.totalCost": "Загальна вартість",
+  "context.stats.sessionCreated": "Сесію створено",
+  "context.stats.lastActivity": "Остання активність",
+
+  "context.usage.tokens": "Токени",
+  "context.usage.usage": "Використання",
+  "context.usage.cost": "Вартість",
+  "context.usage.clickToView": "Натисніть, щоб переглянути контекст",
+  "context.usage.view": "Переглянути використання контексту",
+
+  "language.en": "English",
+  "language.zh": "简体中文",
+  "language.zht": "繁體中文",
+  "language.ko": "한국어",
+  "language.de": "Deutsch",
+  "language.es": "Español",
+  "language.fr": "Français",
+  "language.da": "Dansk",
+  "language.ja": "日本語",
+  "language.pl": "Polski",
+  "language.ru": "Русский",
+  "language.ar": "العربية",
+  "language.no": "Norsk",
+  "language.br": "Português (Brasil)",
+  "language.bs": "Bosanski",
+  "language.uk": "Українська",
+  "language.th": "ไทย",
+  "language.tr": "Türkçe",
+
+  "toast.language.title": "Мова",
+  "toast.language.description": "Перемкнено на {{language}}",
+
+  "toast.theme.title": "Тему змінено",
+  "toast.scheme.title": "Кольорова схема",
+
+  "toast.workspace.enabled.title": "Робочі області увімкнено",
+  "toast.workspace.enabled.description": "Кілька робочих дерев тепер відображаються на бічній панелі",
+  "toast.workspace.disabled.title": "Робочі області вимкнено",
+  "toast.workspace.disabled.description": "Тільки головне робоче дерево відображається на бічній панелі",
+
+  "toast.permissions.autoaccept.on.title": "Автоматичне прийняття дозволів",
+  "toast.permissions.autoaccept.on.description": "Запити дозволів будуть автоматично схвалюватися",
+  "toast.permissions.autoaccept.off.title": "Автоматичне прийняття дозволів зупинено",
+  "toast.permissions.autoaccept.off.description": "Запити дозволів вимагатимуть схвалення",
+
+  "toast.model.none.title": "Модель не вибрано",
+  "toast.model.none.description": "Підключіть провайдера, щоб підсумувати цю сесію",
+
+  "toast.file.loadFailed.title": "Не вдалося завантажити файл",
+  "toast.file.listFailed.title": "Не вдалося отримати список файлів",
+
+  "toast.context.noLineSelection.title": "Не вибрано рядків",
+  "toast.context.noLineSelection.description": "Спочатку виберіть діапазон рядків у вкладці файлу.",
+
+  "toast.session.share.copyFailed.title": "Не вдалося скопіювати URL у буфер обміну",
+  "toast.session.share.success.title": "Сесію опубліковано",
+  "toast.session.share.success.description": "Посилання скопійовано в буфер обміну!",
+  "toast.session.share.failed.title": "Не вдалося опублікувати сесію",
+  "toast.session.share.failed.description": "Під час публікації сесії сталася помилка",
+
+  "toast.session.unshare.success.title": "Поширення сесії припинено",
+  "toast.session.unshare.success.description": "Поширення сесії успішно припинено!",
+  "toast.session.unshare.failed.title": "Не вдалося припинити поширення сесії",
+  "toast.session.unshare.failed.description": "Під час припинення поширення сесії сталася помилка",
+
+  "toast.session.listFailed.title": "Не вдалося завантажити сесії для {{project}}",
+  "toast.project.reloadFailed.title": "Не вдалося перезавантажити {{project}}",
+
+  "toast.update.title": "Доступне оновлення",
+  "toast.update.description": "Нова версія OpenCode ({{version}}) тепер доступна для встановлення.",
+  "toast.update.action.installRestart": "Встановити та перезапустити",
+  "toast.update.action.notYet": "Не зараз",
+
+  "error.page.title": "Щось пішло не так",
+  "error.page.description": "Під час завантаження програми сталася помилка.",
+  "error.page.details.label": "Деталі помилки",
+  "error.page.action.restart": "Перезапустити",
+  "error.page.action.report": "Повідомити про помилку",
+  "error.page.action.reported": "Помилку повідомлено",
+  "error.page.action.checking": "Перевірка...",
+  "error.page.action.checkUpdates": "Перевірити оновлення",
+  "error.page.action.updateTo": "Оновити до {{version}}",
+  "error.page.circular": "[Циклічне]",
+  "error.page.report.prefix": "Будь ласка, повідомте про цю помилку команді OpenCode",
+  "error.page.report.discord": "на Discord",
+  "error.page.version": "Версія: {{version}}",
+
+  "error.dev.rootNotFound":
+    "Кореневий елемент не знайдено. Ви забули додати його до index.html? Або, можливо, атрибут id було написано з помилкою?",
+
+  "error.globalSync.connectFailed": "Не вдалося підключитися до сервера. Чи працює сервер за адресою `{{url}}`?",
+  "error.globalSDK.noServerAvailable": "Сервер недоступний",
+  "error.globalSDK.serverNotAvailable": "Сервер недоступний",
+  "error.childStore.persistedCacheCreateFailed": "Не вдалося створити постійний кеш",
+  "error.childStore.persistedProjectMetadataCreateFailed": "Не вдалося створити постійні метадані проєкту",
+  "error.childStore.persistedProjectIconCreateFailed": "Не вдалося створити постійну іконку проєкту",
+  "error.childStore.storeCreateFailed": "Не вдалося створити сховище",
+  "directory.error.invalidUrl": "Недійсний каталог у URL.",
+
+  "error.chain.unknown": "Невідома помилка",
+  "error.server.invalidConfiguration": "Недійсна конфігурація",
+  "error.chain.causedBy": "Причина:",
+  "error.chain.apiError": "Помилка API",
+  "error.chain.status": "Статус: {{status}}",
+  "error.chain.retryable": "Повторювано: {{retryable}}",
+  "error.chain.responseBody": "Тіло відповіді:\n{{body}}",
+  "error.chain.didYouMean": "Можливо, ви мали на увазі: {{suggestions}}",
+  "error.chain.modelNotFound": "Модель не знайдено: {{provider}}/{{model}}",
+  "error.chain.checkConfig": "Перевірте назви провайдерів/моделей у конфігурації (opencode.json)",
+  "error.chain.mcpFailed": "Сервер MCP \"{{name}}\" не працює. Зверніть увагу, OpenCode ще не підтримує автентифікацію MCP.",
+  "error.chain.providerAuthFailed": "Автентифікація провайдера не вдалася ({{provider}}): {{message}}",
+  "error.chain.providerInitFailed":
+    "Не вдалося ініціалізувати провайдера \"{{provider}}\". Перевірте облікові дані та конфігурацію.",
+  "error.chain.configJsonInvalid": "Файл конфігурації {{path}} не є дійсним JSON(C)",
+  "error.chain.configJsonInvalidWithMessage": "Файл конфігурації {{path}} не є дійсним JSON(C): {{message}}",
+  "error.chain.configDirectoryTypo":
+    "Каталог \"{{dir}}\" у {{path}} недійсний. Перейменуйте каталог на \"{{suggestion}}\" або видаліть його. Це поширена помилка.",
+  "error.chain.configFrontmatterError": "Не вдалося розібрати frontmatter у {{path}}:\n{{message}}",
+  "error.chain.configInvalid": "Файл конфігурації {{path}} недійсний",
+  "error.chain.configInvalidWithMessage": "Файл конфігурації {{path}} недійсний: {{message}}",
+
+  "notification.permission.title": "Потрібен дозвіл",
+  "notification.permission.description": "{{sessionTitle}} у {{projectName}} потребує дозволу",
+  "notification.question.title": "Запитання",
+  "notification.question.description": "{{sessionTitle}} у {{projectName}} має запитання",
+  "notification.action.goToSession": "Перейти до сесії",
+
+  "notification.session.responseReady.title": "Відповідь готова",
+  "notification.session.error.title": "Помилка сесії",
+  "notification.session.error.fallbackDescription": "Сталася помилка",
+
+  "home.recentProjects": "Нещодавні проєкти",
+  "home.empty.title": "Немає нещодавніх проєктів",
+  "home.empty.description": "Почніть, відкривши локальний проєкт",
+
+  "session.tab.session": "Сесія",
+  "session.tab.review": "Огляд",
+  "session.tab.context": "Контекст",
+  "session.panel.reviewAndFiles": "Огляд і файли",
+  "session.review.filesChanged": "Змінено файлів: {{count}}",
+  "session.review.change.one": "Зміна",
+  "session.review.change.other": "Зміни",
+  "session.review.loadingChanges": "Завантаження змін...",
+  "session.review.empty": "У цій сесії ще немає змін",
+  "session.review.noVcs": "Систему контролю версій Git не виявлено, зміни не відображаються",
+  "session.review.noVcs.createGit.title": "Створити Git-репозиторій",
+  "session.review.noVcs.createGit.description": "Відстежуйте, переглядайте та скасовуйте зміни в цьому проєкті",
+  "session.review.noVcs.createGit.actionLoading": "Створення Git-репозиторію...",
+  "session.review.noVcs.createGit.action": "Створити Git-репозиторій",
+  "session.review.noSnapshot": "Відстеження знімків вимкнено в конфігурації, тому зміни сесії недоступні",
+  "session.review.noChanges": "Немає змін",
+  "session.review.noUncommittedChanges": "Ще немає незафіксованих змін",
+  "session.review.noBranchChanges": "Ще немає змін у гілці",
+
+  "session.files.selectToOpen": "Виберіть файл для відкриття",
+  "session.files.all": "Усі файли",
+  "session.files.empty": "Немає файлів",
+  "session.files.binaryContent": "Бінарний файл (вміст не може бути відображено)",
+
+  "session.messages.renderEarlier": "Відобразити раніші повідомлення",
+  "session.messages.loadingEarlier": "Завантаження раніших повідомлень...",
+  "session.messages.loadEarlier": "Завантажити раніші повідомлення",
+  "session.messages.loading": "Завантаження повідомлень...",
+  "session.messages.jumpToLatest": "Перейти до останніх",
+
+  "session.context.addToContext": "Додати {{selection}} до контексту",
+  "session.todo.title": "Завдання",
+  "session.todo.collapse": "Згорнути",
+  "session.todo.expand": "Розгорнути",
+  "session.todo.progress": "Виконано {{done}} з {{total}} завдань",
+  "session.question.progress": "{{current}} з {{total}} запитань",
+  "session.followupDock.summary.one": "{{count}} повідомлення в черзі",
+  "session.followupDock.summary.other": "{{count}} повідомлень у черзі",
+  "session.followupDock.sendNow": "Надіслати зараз",
+  "session.followupDock.edit": "Редагувати",
+  "session.followupDock.collapse": "Згорнути повідомлення в черзі",
+  "session.followupDock.expand": "Розгорнути повідомлення в черзі",
+  "session.revertDock.summary.one": "{{count}} скасоване повідомлення",
+  "session.revertDock.summary.other": "{{count}} скасованих повідомлень",
+  "session.revertDock.collapse": "Згорнути скасовані повідомлення",
+  "session.revertDock.expand": "Розгорнути скасовані повідомлення",
+  "session.revertDock.restore": "Відновити повідомлення",
+
+  "session.new.title": "Створити що завгодно",
+  "session.new.worktree.main": "Основна гілка",
+  "session.new.worktree.mainWithBranch": "Основна гілка ({{branch}})",
+  "session.new.worktree.create": "Створити нове робоче дерево",
+  "session.new.lastModified": "Востаннє змінено",
+
+  "session.header.search.placeholder": "Пошук {{project}}",
+  "session.header.searchFiles": "Пошук файлів",
+  "session.header.openIn": "Відкрити в",
+  "session.header.open.action": "Відкрити {{app}}",
+  "session.header.open.ariaLabel": "Відкрити в {{app}}",
+  "session.header.open.menu": "Параметри відкриття",
+  "session.header.open.copyPath": "Копіювати шлях",
+  "session.header.open.finder": "Finder",
+  "session.header.open.fileExplorer": "Провідник файлів",
+  "session.header.open.fileManager": "Файловий менеджер",
+  "session.header.open.app.vscode": "VS Code",
+  "session.header.open.app.cursor": "Cursor",
+  "session.header.open.app.zed": "Zed",
+  "session.header.open.app.textmate": "TextMate",
+  "session.header.open.app.antigravity": "Antigravity",
+  "session.header.open.app.terminal": "Термінал",
+  "session.header.open.app.iterm2": "iTerm2",
+  "session.header.open.app.ghostty": "Ghostty",
+  "session.header.open.app.warp": "Warp",
+  "session.header.open.app.xcode": "Xcode",
+  "session.header.open.app.androidStudio": "Android Studio",
+  "session.header.open.app.powershell": "PowerShell",
+  "session.header.open.app.sublimeText": "Sublime Text",
+
+  "status.popover.trigger": "Статус",
+  "status.popover.ariaLabel": "Конфігурації серверів",
+  "status.popover.tab.servers": "Сервери",
+  "status.popover.tab.mcp": "MCP",
+  "status.popover.tab.lsp": "LSP",
+  "status.popover.tab.plugins": "Плагіни",
+  "status.popover.action.manageServers": "Керувати серверами",
+
+  "session.share.popover.title": "Опублікувати в інтернеті",
+  "session.share.popover.description.shared":
+    "Ця сесія є публічною в інтернеті. Вона доступна будь-кому за посиланням.",
+  "session.share.popover.description.unshared":
+    "Опублікуйте сесію публічно в інтернеті. Вона буде доступна будь-кому за посиланням.",
+  "session.share.action.share": "Поділитися",
+  "session.share.action.publish": "Опублікувати",
+  "session.share.action.publishing": "Публікація...",
+  "session.share.action.unpublish": "Скасувати публікацію",
+  "session.share.action.unpublishing": "Скасування публікації...",
+  "session.share.action.view": "Переглянути",
+  "session.share.copy.copied": "Скопійовано",
+  "session.share.copy.copyLink": "Копіювати посилання",
+
+  "lsp.tooltip.none": "Немає серверів LSP",
+  "lsp.label.connected": "{{count}} LSP",
+
+  "prompt.loading": "Завантаження запиту...",
+  "terminal.loading": "Завантаження термінала...",
+  "terminal.title": "Термінал",
+  "terminal.title.numbered": "Термінал {{number}}",
+  "terminal.close": "Закрити термінал",
+  "terminal.connectionLost.title": "З'єднання втрачено",
+  "terminal.connectionLost.abnormalClose": "WebSocket закрито аномально: {{code}}",
+  "terminal.connectionLost.description":
+    "З'єднання з терміналом було перервано. Це може статися під час перезапуску сервера.",
+
+  "common.closeTab": "Закрити вкладку",
+  "common.dismiss": "Відхилити",
+  "common.moreCountSuffix": " (ще {{count}})",
+  "common.requestFailed": "Запит не виконано",
+  "common.moreOptions": "Більше опцій",
+  "common.learnMore": "Дізнатися більше",
+  "common.rename": "Перейменувати",
+  "common.reset": "Скинути",
+  "common.archive": "Архівувати",
+  "common.delete": "Видалити",
+  "common.close": "Закрити",
+  "common.edit": "Редагувати",
+  "common.loadMore": "Завантажити більше",
+  "common.key.esc": "ESC",
+  "common.key.ctrl": "Ctrl",
+  "common.key.alt": "Alt",
+  "common.key.shift": "Shift",
+  "common.key.meta": "Meta",
+  "common.key.space": "Пробіл",
+  "common.key.backspace": "Backspace",
+  "common.key.enter": "Enter",
+  "common.key.tab": "Tab",
+  "common.key.delete": "Delete",
+  "common.key.home": "Home",
+  "common.key.end": "End",
+  "common.key.pageUp": "Page Up",
+  "common.key.pageDown": "Page Down",
+  "common.key.insert": "Insert",
+  "common.unknown": "невідомо",
+
+  "common.time.justNow": "Щойно",
+  "common.time.minutesAgo.short": "{{count}} хв тому",
+  "common.time.hoursAgo.short": "{{count}} год тому",
+  "common.time.daysAgo.short": "{{count}} дн тому",
+
+  "sidebar.menu.toggle": "Перемкнути меню",
+  "sidebar.nav.projectsAndSessions": "Проєкти та сесії",
+  "sidebar.settings": "Налаштування",
+  "sidebar.help": "Довідка",
+  "sidebar.workspaces.enable": "Увімкнути робочі області",
+  "sidebar.workspaces.disable": "Вимкнути робочі області",
+  "sidebar.gettingStarted.title": "Початок роботи",
+  "sidebar.gettingStarted.line1": "OpenCode містить безкоштовні моделі, тому ви можете почати негайно.",
+  "sidebar.gettingStarted.line2": "Підключіть будь-якого провайдера, щоб використовувати моделі, включаючи Claude, GPT, Gemini тощо.",
+  "sidebar.project.recentSessions": "Нещодавні сесії",
+  "sidebar.project.viewAllSessions": "Переглянути всі сесії",
+  "sidebar.project.clearNotifications": "Очистити сповіщення",
+  "sidebar.empty.title": "Немає відкритих проєктів",
+  "sidebar.empty.description": "Відкрийте проєкт, щоб почати",
+
+  "debugBar.ariaLabel": "Діагностика продуктивності розробки",
+  "debugBar.na": "н/д",
+  "debugBar.nav.label": "NAV",
+  "debugBar.nav.tip":
+    "Останній завершений перехід маршруту, що торкається сторінки сесії, виміряний від запуску маршрутизатора до першого відображення після стабілізації.",
+  "debugBar.fps.label": "FPS",
+  "debugBar.fps.tip": "Поточна кількість кадрів за секунду за останні 5 секунд.",
+  "debugBar.frame.label": "FRAME",
+  "debugBar.frame.tip": "Найгірший час кадру за останні 5 секунд.",
+  "debugBar.jank.label": "JANK",
+  "debugBar.jank.tip": "Кадри понад 32 мс за останні 5 секунд.",
+  "debugBar.long.label": "LONG",
+  "debugBar.long.tip": "Заблокований час і кількість довгих завдань за останні 5 секунд. Макс. завдання: {{max}}.",
+  "debugBar.delay.label": "DELAY",
+  "debugBar.delay.tip": "Найгірша спостережувана затримка введення за останні 5 секунд.",
+  "debugBar.inp.label": "INP",
+  "debugBar.inp.tip":
+    "Приблизна тривалість взаємодії за останні 5 секунд. Це схоже на INP, а не на офіційний Web Vitals INP.",
+  "debugBar.cls.label": "CLS",
+  "debugBar.cls.tip": "Сукупний зсув макета за весь час роботи програми.",
+  "debugBar.mem.label": "MEM",
+  "debugBar.mem.tipUnavailable": "Використана купа JS проти ліміту купи. Тільки Chromium.",
+  "debugBar.mem.tip": "Використана купа JS проти ліміту купи. {{used}} з {{limit}}.",
+
+  "app.name.desktop": "OpenCode Desktop",
+
+  "settings.section.desktop": "Робочий стіл",
+  "settings.section.server": "Сервер",
+  "settings.tab.general": "Загальні",
+  "settings.tab.shortcuts": "Скорочення",
+  "settings.desktop.section.wsl": "WSL",
+  "settings.desktop.wsl.title": "Інтеграція WSL",
+  "settings.desktop.wsl.description": "Запускати сервер OpenCode всередині WSL на Windows.",
+
+  "settings.general.section.appearance": "Зовнішній вигляд",
+  "settings.general.section.advanced": "Додатково",
+  "settings.general.section.notifications": "Системні сповіщення",
+  "settings.general.section.updates": "Оновлення",
+  "settings.general.section.sounds": "Звукові ефекти",
+  "settings.general.section.feed": "Стрічка",
+  "settings.general.section.display": "Дисплей",
+
+  "settings.general.row.language.title": "Мова",
+  "settings.general.row.language.description": "Змінити мову інтерфейсу OpenCode",
+  "settings.general.row.shell.title": "Командна оболонка термінала",
+  "settings.general.row.shell.description":
+    "Виберіть оболонку для термінала. Сумісні оболонки також використовуються для викликів інструментів агента.",
+  "settings.general.row.shell.autoDefault": "Авто (за замовчуванням)",
+  "settings.general.row.shell.terminalOnly": "тільки термінал",
+  "settings.general.row.appearance.title": "Зовнішній вигляд",
+  "settings.general.row.appearance.description": "Налаштуйте вигляд OpenCode на вашому пристрої",
+  "settings.general.row.colorScheme.title": "Кольорова схема",
+  "settings.general.row.colorScheme.description": "Виберіть, чи OpenCode використовує системну, світлу або темну тему",
+  "settings.general.row.theme.title": "Тема",
+  "settings.general.row.theme.description": "Налаштуйте тему OpenCode.",
+  "settings.general.row.font.title": "Шрифт коду",
+  "settings.general.row.font.description": "Налаштуйте шрифт, який використовується в блоках коду",
+  "settings.general.row.terminalFont.title": "Шрифт термінала",
+  "settings.general.row.terminalFont.description": "Налаштуйте шрифт, який використовується в терміналі",
+  "settings.general.row.uiFont.title": "Шрифт інтерфейсу",
+  "settings.general.row.uiFont.description": "Налаштуйте шрифт, який використовується в інтерфейсі",
+  "settings.general.row.followup.title": "Поведінка продовження",
+  "settings.general.row.followup.description": "Виберіть, чи продовження виконується негайно, чи чекає в черзі",
+  "settings.general.row.followup.option.queue": "Черга",
+  "settings.general.row.followup.option.steer": "Керування",
+  "settings.general.row.showFileTree.title": "Дерево файлів",
+  "settings.general.row.showFileTree.description": "Показувати перемикач і панель дерева файлів у сесіях на робочому столі",
+  "settings.general.row.showNavigation.title": "Елементи навігації",
+  "settings.general.row.showNavigation.description": "Показувати кнопки назад і вперед у заголовку робочого столу",
+  "settings.general.row.showSearch.title": "Палітра команд",
+  "settings.general.row.showSearch.description": "Показувати кнопку пошуку та палітри команд у заголовку робочого столу",
+  "settings.general.row.showTerminal.title": "Термінал",
+  "settings.general.row.showTerminal.description": "Показувати кнопку термінала в заголовку робочого столу",
+  "settings.general.row.showStatus.title": "Статус сервера",
+  "settings.general.row.showStatus.description": "Показувати кнопку статусу сервера в заголовку робочого столу",
+  "settings.general.row.reasoningSummaries.title": "Показувати підсумки мислення",
+  "settings.general.row.reasoningSummaries.description": "Відображати підсумки мислення моделі на часовій шкалі",
+  "settings.general.row.shellToolPartsExpanded.title": "Розгортати частини інструменту оболонки",
+  "settings.general.row.shellToolPartsExpanded.description":
+    "Показувати частини інструменту оболонки розгорнутими за замовчуванням на часовій шкалі",
+  "settings.general.row.editToolPartsExpanded.title": "Розгортати частини інструменту редагування",
+  "settings.general.row.editToolPartsExpanded.description":
+    "Показувати частини інструментів редагування, запису та патчів розгорнутими за замовчуванням на часовій шкалі",
+  "settings.general.row.showSessionProgressBar.title": "Показувати індикатор прогресу сесії",
+  "settings.general.row.showSessionProgressBar.description":
+    "Відображати анімований індикатор прогресу вгорі сесії, коли агент працює",
+
+  "settings.general.row.wayland.title": "Використовувати нативний Wayland",
+  "settings.general.row.wayland.description": "Вимкнути резервний X11 на Wayland. Потребує перезапуску.",
+  "settings.general.row.wayland.tooltip":
+    "На Linux з моніторами з різною частотою оновлення нативний Wayland може бути більш стабільним.",
+
+  "settings.general.row.releaseNotes.title": "Нотатки до релізу",
+  "settings.general.row.releaseNotes.description": "Показувати спливаючі вікна \"Що нового\" після оновлень",
+
+  "settings.updates.row.startup.title": "Перевіряти оновлення під час запуску",
+  "settings.updates.row.startup.description": "Автоматично перевіряти наявність оновлень під час запуску OpenCode",
+  "settings.updates.row.check.title": "Перевірити оновлення",
+  "settings.updates.row.check.description": "Вручну перевірити наявність оновлень і встановити, якщо доступні",
+  "settings.updates.action.checkNow": "Перевірити зараз",
+  "settings.updates.action.checking": "Перевірка...",
+  "settings.updates.toast.latest.title": "У вас актуальна версія",
+  "settings.updates.toast.latest.description": "Ви використовуєте останню версію OpenCode.",
+  "sound.option.none": "Немає",
+  "sound.option.alert01": "Alert 01",
+  "sound.option.alert02": "Alert 02",
+  "sound.option.alert03": "Alert 03",
+  "sound.option.alert04": "Alert 04",
+  "sound.option.alert05": "Alert 05",
+  "sound.option.alert06": "Alert 06",
+  "sound.option.alert07": "Alert 07",
+  "sound.option.alert08": "Alert 08",
+  "sound.option.alert09": "Alert 09",
+  "sound.option.alert10": "Alert 10",
+  "sound.option.bipbop01": "Bip-bop 01",
+  "sound.option.bipbop02": "Bip-bop 02",
+  "sound.option.bipbop03": "Bip-bop 03",
+  "sound.option.bipbop04": "Bip-bop 04",
+  "sound.option.bipbop05": "Bip-bop 05",
+  "sound.option.bipbop06": "Bip-bop 06",
+  "sound.option.bipbop07": "Bip-bop 07",
+  "sound.option.bipbop08": "Bip-bop 08",
+  "sound.option.bipbop09": "Bip-bop 09",
+  "sound.option.bipbop10": "Bip-bop 10",
+  "sound.option.staplebops01": "Staplebops 01",
+  "sound.option.staplebops02": "Staplebops 02",
+  "sound.option.staplebops03": "Staplebops 03",
+  "sound.option.staplebops04": "Staplebops 04",
+  "sound.option.staplebops05": "Staplebops 05",
+  "sound.option.staplebops06": "Staplebops 06",
+  "sound.option.staplebops07": "Staplebops 07",
+  "sound.option.nope01": "Nope 01",
+  "sound.option.nope02": "Nope 02",
+  "sound.option.nope03": "Nope 03",
+  "sound.option.nope04": "Nope 04",
+  "sound.option.nope05": "Nope 05",
+  "sound.option.nope06": "Nope 06",
+  "sound.option.nope07": "Nope 07",
+  "sound.option.nope08": "Nope 08",
+  "sound.option.nope09": "Nope 09",
+  "sound.option.nope10": "Nope 10",
+  "sound.option.nope11": "Nope 11",
+  "sound.option.nope12": "Nope 12",
+  "sound.option.yup01": "Yup 01",
+  "sound.option.yup02": "Yup 02",
+  "sound.option.yup03": "Yup 03",
+  "sound.option.yup04": "Yup 04",
+  "sound.option.yup05": "Yup 05",
+  "sound.option.yup06": "Yup 06",
+
+  "settings.general.notifications.agent.title": "Агент",
+  "settings.general.notifications.agent.description":
+    "Показувати системне сповіщення, коли агент завершує роботу або потребує уваги",
+  "settings.general.notifications.permissions.title": "Дозволи",
+  "settings.general.notifications.permissions.description": "Показувати системне сповіщення, коли потрібен дозвіл",
+  "settings.general.notifications.errors.title": "Помилки",
+  "settings.general.notifications.errors.description": "Показувати системне сповіщення, коли виникає помилка",
+
+  "settings.general.sounds.agent.title": "Агент",
+  "settings.general.sounds.agent.description": "Відтворювати звук, коли агент завершує роботу або потребує уваги",
+  "settings.general.sounds.permissions.title": "Дозволи",
+  "settings.general.sounds.permissions.description": "Відтворювати звук, коли потрібен дозвіл",
+  "settings.general.sounds.errors.title": "Помилки",
+  "settings.general.sounds.errors.description": "Відтворювати звук, коли виникає помилка",
+
+  "settings.shortcuts.title": "Скорочення клавіш",
+  "settings.shortcuts.reset.button": "Скинути до стандартних",
+  "settings.shortcuts.reset.toast.title": "Скорочення скинуто",
+  "settings.shortcuts.reset.toast.description": "Скорочення клавіш були скинуті до стандартних.",
+  "settings.shortcuts.conflict.title": "Скорочення вже використовується",
+  "settings.shortcuts.conflict.description": "{{keybind}} вже призначено для {{titles}}.",
+  "settings.shortcuts.unassigned": "Не призначено",
+  "settings.shortcuts.pressKeys": "Натисніть клавіші",
+  "settings.shortcuts.search.placeholder": "Пошук скорочень",
+  "settings.shortcuts.search.empty": "Скорочень не знайдено",
+
+  "settings.shortcuts.group.general": "Загальні",
+  "settings.shortcuts.group.session": "Сесія",
+  "settings.shortcuts.group.navigation": "Навігація",
+  "settings.shortcuts.group.modelAndAgent": "Модель та агент",
+  "settings.shortcuts.group.terminal": "Термінал",
+  "settings.shortcuts.group.prompt": "Запит",
+
+  "settings.providers.title": "Провайдери",
+  "settings.providers.description": "Налаштування провайдерів будуть доступні тут.",
+  "settings.providers.section.connected": "Підключені провайдери",
+  "settings.providers.connected.empty": "Немає підключених провайдерів",
+  "settings.providers.connected.environmentDescription": "Підключено зі змінних середовища",
+  "settings.providers.section.popular": "Популярні провайдери",
+  "settings.providers.custom.description": "Додайте провайдера, сумісного з OpenAI, за базовим URL.",
+  "settings.providers.tag.environment": "Середовище",
+  "settings.providers.tag.config": "Конфігурація",
+  "settings.providers.tag.custom": "Користувацький",
+  "settings.providers.tag.other": "Інше",
+  "settings.models.title": "Моделі",
+  "settings.models.description": "Налаштування моделей будуть доступні тут.",
+  "settings.agents.title": "Агенти",
+  "settings.agents.description": "Налаштування агентів будуть доступні тут.",
+  "settings.commands.title": "Команди",
+  "settings.commands.description": "Налаштування команд будуть доступні тут.",
+  "settings.mcp.title": "MCP",
+  "settings.mcp.description": "Налаштування MCP будуть доступні тут.",
+
+  "settings.permissions.title": "Дозволи",
+  "settings.permissions.description": "Керуйте тим, які інструменти сервер може використовувати за замовчуванням.",
+  "settings.permissions.section.tools": "Інструменти",
+  "settings.permissions.toast.updateFailed.title": "Не вдалося оновити дозволи",
+
+  "settings.permissions.action.allow": "Дозволити",
+  "settings.permissions.action.ask": "Запитувати",
+  "settings.permissions.action.deny": "Заборонити",
+
+  "settings.permissions.tool.read.title": "Читання",
+  "settings.permissions.tool.read.description": "Читання файлу (відповідає шляху файлу)",
+  "settings.permissions.tool.edit.title": "Редагування",
+  "settings.permissions.tool.edit.description": "Зміна файлів, включаючи редагування, запис і патчі",
+  "settings.permissions.tool.glob.title": "Glob",
+  "settings.permissions.tool.glob.description": "Зіставлення файлів за допомогою glob-шаблонів",
+  "settings.permissions.tool.grep.title": "Grep",
+  "settings.permissions.tool.grep.description": "Пошук вмісту файлів за допомогою регулярних виразів",
+  "settings.permissions.tool.list.title": "Список",
+  "settings.permissions.tool.list.description": "Список файлів у каталозі",
+  "settings.permissions.tool.bash.title": "Bash",
+  "settings.permissions.tool.bash.description": "Запуск команд оболонки",
+  "settings.permissions.tool.task.title": "Завдання",
+  "settings.permissions.tool.task.description": "Запуск підагентів",
+  "settings.permissions.tool.skill.title": "Навичка",
+  "settings.permissions.tool.skill.description": "Завантаження навички за назвою",
+  "settings.permissions.tool.lsp.title": "LSP",
+  "settings.permissions.tool.lsp.description": "Виконання запитів мовного сервера",
+  "settings.permissions.tool.todowrite.title": "Todo Write",
+  "settings.permissions.tool.todowrite.description": "Оновлення списку завдань",
+  "settings.permissions.tool.webfetch.title": "Web Fetch",
+  "settings.permissions.tool.webfetch.description": "Отримання вмісту з URL",
+  "settings.permissions.tool.websearch.title": "Web Search",
+  "settings.permissions.tool.websearch.description": "Пошук в інтернеті",
+  "settings.permissions.tool.external_directory.title": "Зовнішній каталог",
+  "settings.permissions.tool.external_directory.description": "Доступ до файлів за межами каталогу проєкту",
+  "settings.permissions.tool.doom_loop.title": "Цикл приреченості",
+  "settings.permissions.tool.doom_loop.description": "Виявлення повторюваних викликів інструментів з однаковими вхідними даними",
+
+  "session.delete.failed.title": "Не вдалося видалити сесію",
+  "session.delete.title": "Видалити сесію",
+  "session.delete.confirm": 'Видалити сесію "{{name}}"?',
+  "session.delete.button": "Видалити сесію",
+
+  "workspace.new": "Нова робоча область",
+  "workspace.type.local": "локальна",
+  "workspace.type.sandbox": "пісочниця",
+  "workspace.create.failed.title": "Не вдалося створити робочу область",
+  "workspace.delete.failed.title": "Не вдалося видалити робочу область",
+  "workspace.resetting.title": "Скидання робочої області",
+  "workspace.resetting.description": "Це може зайняти хвилину.",
+  "workspace.reset.failed.title": "Не вдалося скинути робочу область",
+  "workspace.reset.success.title": "Робочу область скинуто",
+  "workspace.reset.success.description": "Робоча область тепер відповідає гілці за замовчуванням.",
+  "workspace.error.stillPreparing": "Робоча область все ще готується",
+  "workspace.status.checking": "Перевірка незлитих змін...",
+  "workspace.status.error": "Не вдалося перевірити статус git.",
+  "workspace.status.clean": "Незлитих змін не виявлено.",
+  "workspace.status.dirty": "Виявлено незлиті зміни в цій робочій області.",
+  "workspace.delete.title": "Видалити робочу область",
+  "workspace.delete.confirm": 'Видалити робочу область "{{name}}"?',
+  "workspace.delete.button": "Видалити робочу область",
+  "workspace.reset.title": "Скинути робочу область",
+  "workspace.reset.confirm": 'Скинути робочу область "{{name}}"?',
+  "workspace.reset.button": "Скинути робочу область",
+  "workspace.reset.archived.none": "Жодна активна сесія не буде заархівована.",
+  "workspace.reset.archived.one": "1 сесію буде заархівовано.",
+  "workspace.reset.archived.many": "{{count}} сесій буде заархівовано.",
+  "workspace.reset.note": "Це скине робочу область, щоб вона відповідала гілці за замовчуванням.",
+}

+ 2 - 0
packages/console/app/src/i18n/index.ts

@@ -11,6 +11,7 @@ import { dict as da } from "~/i18n/da"
 import { dict as ja } from "~/i18n/ja"
 import { dict as pl } from "~/i18n/pl"
 import { dict as ru } from "~/i18n/ru"
+import { dict as uk } from "~/i18n/uk"
 import { dict as ar } from "~/i18n/ar"
 import { dict as no } from "~/i18n/no"
 import { dict as br } from "~/i18n/br"
@@ -35,6 +36,7 @@ export function i18n(locale: Locale): Dict {
   if (locale === "ja") return { ...base, ...ja }
   if (locale === "pl") return { ...base, ...pl }
   if (locale === "ru") return { ...base, ...ru }
+  if (locale === "uk") return { ...base, ...uk }
   if (locale === "ar") return { ...base, ...ar }
   if (locale === "no") return { ...base, ...no }
   if (locale === "br") return { ...base, ...br }

+ 785 - 0
packages/console/app/src/i18n/uk.ts

@@ -0,0 +1,785 @@
+import { dict as en } from "./en"
+
+export const dict = {
+  ...en,
+  "nav.github": "GitHub",
+  "nav.docs": "Документація",
+  "nav.changelog": "Журнал змін",
+  "nav.discord": "Discord",
+  "nav.x": "X",
+  "nav.enterprise": "Enterprise",
+  "nav.zen": "Zen",
+  "nav.login": "Увійти",
+  "nav.free": "Завантажити",
+  "nav.home": "Головна",
+  "nav.openMenu": "Відкрити меню",
+  "nav.getStartedFree": "Почати безкоштовно",
+  "nav.logoAlt": "OpenCode",
+
+  "nav.context.copyLogo": "Копіювати логотип як SVG",
+  "nav.context.copyWordmark": "Копіювати знак як SVG",
+  "nav.context.brandAssets": "Бренд-матеріали",
+
+  "footer.github": "GitHub",
+  "footer.docs": "Документація",
+  "footer.changelog": "Журнал змін",
+  "footer.discord": "Discord",
+  "footer.x": "X",
+
+  "legal.brand": "Бренд",
+  "legal.privacy": "Конфіденційність",
+  "legal.terms": "Умови",
+
+  "email.title": "Дізнайтеся першими про нові продукти",
+  "email.subtitle": "Приєднуйтесь до списку очікування для раннього доступу.",
+  "email.placeholder": "Електронна адреса",
+  "email.subscribe": "Підписатися",
+  "email.success": "Майже готово! Перевірте пошту та підтвердьте адресу",
+
+  "notFound.title": "Не знайдено | opencode",
+  "notFound.heading": "404 — Сторінку не знайдено",
+  "notFound.home": "Головна",
+  "notFound.docs": "Документація",
+  "notFound.github": "GitHub",
+  "notFound.discord": "Discord",
+  "notFound.logoLightAlt": "світлий логотип opencode",
+  "notFound.logoDarkAlt": "темний логотип opencode",
+
+  "user.logout": "Вийти",
+
+  "auth.callback.error.codeMissing": "Не знайдено код авторизації.",
+
+  "workspace.select": "Виберіть робочий простір",
+  "workspace.createNew": "+ Створити новий робочий простір",
+  "workspace.modal.title": "Створити новий робочий простір",
+  "workspace.modal.placeholder": "Введіть назву робочого простору",
+
+  "common.cancel": "Скасувати",
+  "common.creating": "Створення...",
+  "common.create": "Створити",
+  "common.contactUs": "Зв'яжіться з нами",
+
+  "common.videoUnsupported": "Ваш браузер не підтримує відео.",
+  "common.figure": "Рис. {{n}}.",
+  "common.faq": "FAQ",
+  "common.learnMore": "Дізнатися більше",
+
+  "error.invalidPlan": "Недійсний план",
+  "error.workspaceRequired": "ID робочого простору обов'язкове",
+  "error.alreadySubscribed": "Цей робочий простір уже має підписку",
+  "error.limitRequired": "Ліміт обов'язковий.",
+  "error.monthlyLimitInvalid": "Встановіть дійсний місячний ліміт.",
+  "error.workspaceNameRequired": "Назва робочого простору обов'язкова.",
+  "error.nameTooLong": "Назва має містити не більше 255 символів.",
+  "error.emailRequired": "Електронна адреса обов'язкова",
+  "error.roleRequired": "Роль обов'язкова",
+  "error.idRequired": "ID обов'язкове",
+  "error.nameRequired": "Назва обов'язкова",
+  "error.providerRequired": "Провайдер обов'язковий",
+  "error.apiKeyRequired": "Ключ API обов'язковий",
+  "error.modelRequired": "Модель обов'язкова",
+  "error.reloadAmountMin": "Сума поповнення має бути щонайменше ${{amount}}",
+  "error.reloadTriggerMin": "Поріг балансу має бути щонайменше ${{amount}}",
+
+  "app.meta.description": "OpenCode — відкритий агент для програмування.",
+
+  "home.title": "OpenCode | Відкритий AI-агент для кодування",
+
+  "temp.title": "opencode | AI-агент для кодування, створений для термінала",
+  "temp.hero.title": "AI-агент для кодування, створений для термінала",
+  "temp.zen": "opencode zen",
+  "temp.getStarted": "Почати",
+  "temp.feature.native.title": "Рідний TUI",
+  "temp.feature.native.body": "Чуйний, рідний інтерфейс термінала з темами",
+  "temp.feature.zen.beforeLink": "A",
+  "temp.feature.zen.link": "добірка моделей",
+  "temp.feature.zen.afterLink": "від opencode",
+  "temp.feature.models.beforeLink": "Підтримує 75+ LLM-провайдерів через",
+  "temp.feature.models.afterLink": ", включаючи локальні моделі",
+  "temp.screenshot.caption": "OpenCode TUI з темою tokyonight",
+  "temp.screenshot.alt": "OpenCode TUI з темою tokyonight",
+  "temp.logoLightAlt": "світлий логотип opencode",
+  "temp.logoDarkAlt": "темний логотип opencode",
+
+  "home.banner.badge": "Нове",
+  "home.banner.text": "Десктопний застосунок доступний у бета-версії",
+  "home.banner.platforms": "на macOS, Windows та Linux",
+  "home.banner.downloadNow": "Завантажити зараз",
+  "home.banner.downloadBetaNow": "Завантажити бета-версію десктопного застосунку",
+
+  "home.hero.title": "Відкритий AI-агент для кодування",
+  "home.hero.subtitle.a": "Безкоштовні моделі включено або підключіть будь-яку модель від будь-якого провайдера,",
+  "home.hero.subtitle.b": "включно з Claude, GPT, Gemini та іншими.",
+
+  "home.install.ariaLabel": "Параметри встановлення",
+
+  "home.what.title": "Що таке OpenCode?",
+  "home.what.body": "OpenCode — це відкритий агент, який допомагає писати код у терміналі, IDE або на десктопі.",
+  "home.what.lsp.title": "LSP увімкнено",
+  "home.what.lsp.body": "Автоматично завантажує потрібні LSP для LLM",
+  "home.what.multiSession.title": "Багатосесійність",
+  "home.what.multiSession.body": "Запускайте кількох агентів паралельно в одному проекті",
+  "home.what.shareLinks.title": "Посилання для обміну",
+  "home.what.shareLinks.body": "Діліться посиланням на будь-яку сесію для обговорення або налагодження",
+  "home.what.copilot.title": "GitHub Copilot",
+  "home.what.copilot.body": "Увійдіть через GitHub, щоб використовувати свій обліковий запис Copilot",
+  "home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
+  "home.what.chatgptPlus.body": "Увійдіть через OpenAI, щоб використовувати ChatGPT Plus або Pro",
+  "home.what.anyModel.title": "Будь-яка модель",
+  "home.what.anyModel.body": "75+ LLM-провайдерів через Models.dev, включаючи локальні моделі",
+  "home.what.anyEditor.title": "Будь-який редактор",
+  "home.what.anyEditor.body": "Доступний як термінальний інтерфейс, десктопний застосунок та розширення IDE",
+  "home.what.readDocs": "Читати документацію",
+
+  "home.growth.title": "Відкритий AI-агент для кодування",
+  "home.growth.body":
+    "З понад <strong>{{stars}}</strong> зірками на GitHub, <strong>{{contributors}}</strong> учасниками та понад <strong>{{commits}}</strong> комітами, OpenCode використовують понад <strong>{{monthlyUsers}}</strong> розробників щомісяця.",
+  "home.growth.githubStars": "Зірки GitHub",
+  "home.growth.contributors": "Учасники",
+  "home.growth.monthlyDevs": "Розробників на місяць",
+
+  "home.privacy.title": "Створено для конфіденційності",
+  "home.privacy.body":
+    "OpenCode не зберігає ваш код або контекстні дані, тому може працювати в середовищах з чутливими даними.",
+  "home.privacy.learnMore": "Дізнатися більше про",
+  "home.privacy.link": "конфіденційність",
+
+  "home.faq.q1": "Що таке OpenCode?",
+  "home.faq.a1":
+    "OpenCode — це відкритий агент, який допомагає писати та запускати код з будь-якою AI-моделлю. Доступний як термінальний інтерфейс, десктопний застосунок або розширення IDE.",
+  "home.faq.q2": "Як почати користуватися OpenCode?",
+  "home.faq.a2.before": "Найпростіший спосіб почати — прочитати",
+  "home.faq.a2.link": "вступ",
+  "home.faq.q3": "Чи потрібні додаткові AI-підписки для використання OpenCode?",
+  "home.faq.a3.p1":
+    "Не обов'язково, OpenCode має набір безкоштовних моделей, які можна використовувати без реєстрації.",
+  "home.faq.a3.p2.beforeZen": "Крім цього, ви можете використовувати будь-які популярні моделі, створивши обліковий запис",
+  "home.faq.a3.p2.afterZen": ".",
+  "home.faq.a3.p3":
+    "Хоча ми рекомендуємо Zen, OpenCode також працює з усіма популярними провайдерами, такими як OpenAI, Anthropic, xAI тощо.",
+  "home.faq.a3.p4.beforeLocal": "Ви навіть можете підключити свої",
+  "home.faq.a3.p4.localLink": "локальні моделі",
+  "home.faq.q4": "Чи можу я використовувати свої наявні AI-підписки з OpenCode?",
+  "home.faq.a4.p1":
+    "Так, OpenCode підтримує підписки всіх основних провайдерів. Ви можете використовувати Claude Pro/Max, ChatGPT Plus/Pro або GitHub Copilot.",
+  "home.faq.q5": "Чи можна використовувати OpenCode лише в терміналі?",
+  "home.faq.a5.beforeDesktop": "Вже ні! OpenCode тепер доступний як застосунок для",
+  "home.faq.a5.desktop": "десктопа",
+  "home.faq.a5.and": "та",
+  "home.faq.a5.web": "вебу",
+  "home.faq.q6": "Скільки коштує OpenCode?",
+  "home.faq.a6":
+    "OpenCode є 100% безкоштовним. Він також має набір безкоштовних моделей. Додаткові витрати можливі, якщо ви підключите іншого провайдера.",
+  "home.faq.q7": "А як щодо даних та конфіденційності?",
+  "home.faq.a7.p1": "Ваші дані зберігаються лише тоді, коли ви використовуєте безкоштовні моделі або створюєте посилання для обміну.",
+  "home.faq.a7.p2.beforeModels": "Дізнайтеся більше про",
+  "home.faq.a7.p2.modelsLink": "наші моделі",
+  "home.faq.a7.p2.and": "та",
+  "home.faq.a7.p2.shareLink": "сторінки обміну",
+  "home.faq.q8": "Чи є OpenCode відкритим?",
+  "home.faq.a8.p1": "Так, OpenCode повністю відкритий. Вихідний код доступний публічно на",
+  "home.faq.a8.p2": "під ліцензією",
+  "home.faq.a8.mitLicense": "MIT License",
+  "home.faq.a8.p3":
+    ", тобто кожен може використовувати, змінювати або сприяти його розвитку. Будь-хто зі спільноти може створювати issues, надсилати pull request'и та розширювати функціональність.",
+
+  "home.zenCta.title": "Отримайте доступ до надійних оптимізованих моделей для агентів кодування",
+  "home.zenCta.body":
+    "Zen дає доступ до добірки AI-моделей, які OpenCode протестував спеціально для агентів кодування. Не турбуйтеся про нестабільну якість — використовуйте перевірені моделі.",
+  "home.zenCta.link": "Дізнатися про Zen",
+
+  "zen.title": "OpenCode Zen | Добірка надійних оптимізованих моделей для агентів кодування",
+  "zen.hero.title": "Надійні оптимізовані моделі для агентів кодування",
+  "zen.hero.body":
+    "Zen дає доступ до добірки AI-моделей, які OpenCode протестував спеціально для агентів кодування. Не турбуйтеся про нестабільну якість — використовуйте перевірені моделі.",
+
+  "zen.faq.q1": "Що таке OpenCode Zen?",
+  "zen.faq.a1":
+    "Zen — це добірка AI-моделей, протестованих для агентів кодування, створена командою OpenCode.",
+  "zen.faq.q2": "Чому Zen точніший?",
+  "zen.faq.a2":
+    "Zen надає лише моделі, спеціально протестовані для агентів кодування. Ви ж не використовуєте масло ніж для стейка — не використовуйте погані моделі для кодування.",
+  "zen.faq.q3": "Чи Zen дешевший?",
+  "zen.faq.a3":
+    "Zen не є прибутковим. Zen передає вам вартість від провайдерів моделей. Чим вище використання Zen, тим кращі ціни OpenCode може узгодити та передати вам.",
+  "zen.faq.q4": "Скільки коштує Zen?",
+  "zen.faq.a4.p1.beforePricing": "Zen",
+  "zen.faq.a4.p1.pricingLink": "стягує плату за запит",
+  "zen.faq.a4.p1.afterPricing": "без націнок — ви платите рівно стільки, скільки стягує провайдер моделі.",
+  "zen.faq.a4.p2.beforeAccount": "Загальна вартість залежить від використання. Ви можете встановити місячні ліміти в",
+  "zen.faq.a4.p2.accountLink": "обліковому записі",
+  "zen.faq.a4.p3":
+    "Щоб покрити витрати, OpenCode додає лише невелику комісію за обробку платежу в розмірі $1.23 за кожне поповнення балансу $20.",
+  "zen.faq.q5": "А як щодо даних та конфіденційності?",
+  "zen.faq.a5.beforeExceptions":
+    "Усі моделі Zen розміщені в США. Провайдери дотримуються політики нульового зберігання та не використовують ваші дані для навчання моделей, за",
+  "zen.faq.a5.exceptionsLink": "такими винятками",
+  "zen.faq.q6": "Чи можна встановити ліміти витрат?",
+  "zen.faq.a6": "Так, ви можете встановити місячні ліміти витрат в обліковому записі.",
+  "zen.faq.q7": "Чи можна скасувати?",
+  "zen.faq.a7": "Так, ви можете вимкнути оплату в будь-який час і використовувати залишок.",
+  "zen.faq.q8": "Чи можна використовувати Zen з іншими агентами кодування?",
+  "zen.faq.a8":
+    "Хоча Zen чудово працює з OpenCode, ви можете використовувати Zen з будь-яким агентом. Дотримуйтесь інструкцій з налаштування у вашому агенті.",
+
+  "zen.cta.start": "Почати з Zen",
+  "zen.pricing.title": "Додати $20 балансу Pay as you go",
+  "zen.pricing.fee": "(+$1.23 комісія за обробку карти)",
+  "zen.pricing.body": "Використовуйте з будь-яким агентом. Встановлюйте місячні ліміти. Скасуйте в будь-який час.",
+  "zen.problem.title": "Яку проблему вирішує Zen?",
+  "zen.problem.body":
+    "Доступно багато моделей, але лише деякі добре працюють з агентами кодування. Більшість провайдерів налаштовують їх по-різному з різними результатами.",
+  "zen.problem.subtitle": "Ми вирішуємо це для всіх, а не лише для користувачів OpenCode.",
+  "zen.problem.item1": "Тестування вибраних моделей та консультації з їхніми командами",
+  "zen.problem.item2": "Співпраця з провайдерами для забезпечення правильної доставки",
+  "zen.problem.item3": "Бенчмаркінг усіх комбінацій моделей та провайдерів, які ми рекомендуємо",
+  "zen.how.title": "Як працює Zen",
+  "zen.how.body": "Хоча ми пропонуємо використовувати Zen з OpenCode, ви можете використовувати Zen з будь-яким агентом.",
+  "zen.how.step1.title": "Зареєструйтеся та додайте $20 балансу",
+  "zen.how.step1.beforeLink": "дотримуйтесь",
+  "zen.how.step1.link": "інструкцій з налаштування",
+  "zen.how.step2.title": "Використовуйте Zen із прозорими цінами",
+  "zen.how.step2.link": "платіть за запит",
+  "zen.how.step2.afterLink": "без націнок",
+  "zen.how.step3.title": "Автоматичне поповнення",
+  "zen.how.step3.body": "коли баланс досягає $5, ми автоматично додаємо $20",
+  "zen.privacy.title": "Ваша конфіденційність важлива для нас",
+  "zen.privacy.beforeExceptions":
+    "Усі моделі Zen розміщені в США. Провайдери дотримуються політики нульового зберігання та не використовують ваші дані для навчання моделей, за",
+  "zen.privacy.exceptionsLink": "такими винятками",
+
+  "go.title": "OpenCode Go | Недорогі моделі кодування для всіх",
+  "go.meta.description":
+    "Go починається від $5 за перший місяць, потім $10/місяць, з generous 5-годинними лімітами запитів для GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.5 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, DeepSeek V4 Pro та DeepSeek V4 Flash.",
+  "go.hero.title": "Недорогі моделі кодування для всіх",
+  "go.hero.body":
+    "Go надає агентне програмування програмістам у всьому світі, пропонуючи щедрі ліміти та надійний доступ до найкращих моделей з відкритим кодом.",
+
+  "go.cta.start": "Підписатися на Go",
+  "go.cta.template": "{{text}} {{price}}",
+  "go.cta.text": "Підписатися на Go",
+  "go.cta.price": "$10/місяць",
+  "go.cta.promo": "$5 перший місяць",
+  "go.pricing.body": "Використовуйте з будь-яким агентом. $5 перший місяць, потім $10/місяць. Поповнюйте за потреби. Скасуйте в будь-який час.",
+  "go.graph.free": "Безкоштовно",
+  "go.graph.freePill": "Big Pickle та безкоштовні моделі",
+  "go.graph.go": "Go",
+  "go.graph.label": "Запитів за 5 годин",
+  "go.graph.usageLimits": "Ліміти використання",
+  "go.graph.tick": "{{n}}x",
+  "go.graph.aria": "Запитів за 5 год: {{free}} vs {{go}}",
+
+  "go.testimonials.brand.zen": "Zen",
+  "go.testimonials.brand.go": "Go",
+  "go.testimonials.handle": "@OpenCode",
+  "go.testimonials.dax.name": "Dax Raad",
+  "go.testimonials.dax.title": "ex-CEO, Terminal Products",
+  "go.testimonials.dax.quoteAfter": "змінило моє життя, це справді очевидний вибір.",
+  "go.testimonials.jay.name": "Jay V",
+  "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint",
+  "go.testimonials.jay.quoteBefore": "4 з 5 людей у нашій команді люблять використовувати",
+  "go.testimonials.jay.quoteAfter": ".",
+  "go.testimonials.adam.name": "Adam Elmore",
+  "go.testimonials.adam.title": "ex-Hero, AWS",
+  "go.testimonials.adam.quoteBefore": "Я не можу достатньо рекомендувати",
+  "go.testimonials.adam.quoteAfter": ". Серйозно, це дійсно добре.",
+  "go.testimonials.david.name": "David Hill",
+  "go.testimonials.david.title": "ex-Head of Design, Laravel",
+  "go.testimonials.david.quoteBefore": "Завдяки",
+  "go.testimonials.david.quoteAfter": "я знаю, що всі моделі протестовані та ідеальні для агентів кодування.",
+  "go.testimonials.frank.name": "Frank Wang",
+  "go.testimonials.frank.title": "ex-Intern, Nvidia (4 times)",
+  "go.testimonials.frank.quote": "Хотів би я досі бути в Nvidia.",
+  "go.problem.title": "Яку проблему вирішує Go?",
+  "go.problem.body":
+    "Ми зосереджені на тому, щоб зробити досвід OpenCode доступним для якомога більшої кількості людей. OpenCode Go — це недорога підписка: $5 за перший місяць, потім $10/місяць. Вона надає щедрі ліміти та надійний доступ до найкращих моделей з відкритим кодом.",
+  "go.problem.subtitle": " ",
+  "go.problem.item1": "Недорога підписка",
+  "go.problem.item2": "Щедрі ліміти та надійний доступ",
+  "go.problem.item3": "Створено для якомога більшої кількості програмістів",
+  "go.problem.item4":
+    "Включає GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.5 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, DeepSeek V4 Pro та DeepSeek V4 Flash",
+  "go.how.title": "Як працює Go",
+  "go.how.body": "Go починається від $5 за перший місяць, потім $10/місяць. Використовуйте з OpenCode або будь-яким агентом.",
+  "go.how.step1.title": "Створіть обліковий запис",
+  "go.how.step1.beforeLink": "дотримуйтесь",
+  "go.how.step1.link": "інструкцій з налаштування",
+  "go.how.step2.title": "Підпишіться на Go",
+  "go.how.step2.link": "$5 перший місяць",
+  "go.how.step2.afterLink": "потім $10/місяць із щедрими лімітами",
+  "go.how.step3.title": "Почніть кодувати",
+  "go.how.step3.body": "з надійним доступом до моделей з відкритим кодом",
+  "go.privacy.title": "Ваша конфіденційність важлива для нас",
+  "go.privacy.body":
+    "План розроблений переважно для міжнародних користувачів, з моделями, розміщеними в США, ЄС та Сінгапурі для стабільного глобального доступу.",
+  "go.privacy.contactAfter": "якщо у вас є запитання.",
+  "go.privacy.beforeExceptions":
+    "Моделі Go розміщені в США. Провайдери дотримуються політики нульового зберігання та не використовують ваші дані для навчання моделей, за",
+  "go.privacy.exceptionsLink": "такими винятками",
+  "go.faq.q1": "Що таке OpenCode Go?",
+  "go.faq.a1":
+    "Go — це недорога підписка, яка надає надійний доступ до найкращих моделей з відкритим кодом для агентного кодування.",
+  "go.faq.q2": "Які моделі включає Go?",
+  "go.faq.a2": "Go включає моделі, перелічені нижче, із щедрими лімітами та надійним доступом.",
+  "go.faq.q3": "Чи Go те саме, що Zen?",
+  "go.faq.a3":
+    "Ні. Zen — це плата за використання, тоді як Go починається від $5 за перший місяць, потім $10/місяць, із щедрими лімітами та надійним доступом до моделей з відкритим кодом.",
+  "go.faq.q4": "Скільки коштує Go?",
+  "go.faq.a4.p1.beforePricing": "Go коштує",
+  "go.faq.a4.p1.pricingLink": "$5 за перший місяць",
+  "go.faq.a4.p1.afterPricing": "потім $10/місяць із щедрими лімітами.",
+  "go.faq.a4.p2.beforeAccount": "Ви можете керувати підпискою в",
+  "go.faq.a4.p2.accountLink": "обліковому записі",
+  "go.faq.a4.p3": "Скасуйте в будь-який час.",
+  "go.faq.q5": "А як щодо даних та конфіденційності?",
+  "go.faq.a5.body":
+    "План розроблений переважно для міжнародних користувачів, з моделями в США, ЄС та Сінгапурі. Провайдери дотримуються політики нульового зберігання.",
+  "go.faq.a5.beforeExceptions":
+    "Моделі Go розміщені в США. Провайдери дотримуються політики нульового зберігання та не використовують ваші дані для навчання моделей, за",
+  "go.faq.a5.exceptionsLink": "такими винятками",
+  "go.faq.q6": "Чи можна поповнити баланс?",
+  "go.faq.a6": "Якщо вам потрібно більше використання, ви можете поповнити баланс в обліковому записі.",
+  "go.faq.q7": "Чи можна скасувати?",
+  "go.faq.a7": "Так, ви можете скасувати в будь-який час.",
+  "go.faq.q8": "Чи можна використовувати Go з іншими агентами кодування?",
+  "go.faq.a8": "Так, ви можете використовувати Go з будь-яким агентом.",
+
+  "go.faq.q9": "Яка різниця між безкоштовними моделями та Go?",
+  "go.faq.a9":
+    "Безкоштовні моделі включають Big Pickle та акційні моделі з лімітом 200 запитів/день. Go включає GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.5 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, DeepSeek V4 Pro та DeepSeek V4 Flash із вищими лімітами.",
+
+  "zen.api.error.rateLimitExceeded": "Перевищено ліміт запитів. Спробуйте пізніше.",
+  "zen.api.error.modelNotSupported": "Модель {{model}} не підтримується",
+  "zen.api.error.modelFormatNotSupported": "Модель {{model}} не підтримується для формату {{format}}",
+  "zen.api.error.noProviderAvailable": "Немає доступного провайдера",
+  "zen.api.error.providerNotSupported": "Провайдер {{provider}} не підтримується",
+  "zen.api.error.missingApiKey": "Відсутній ключ API.",
+  "zen.api.error.invalidApiKey": "Недійсний ключ API.",
+  "zen.api.error.subscriptionQuotaExceeded": "Перевищено квоту підписки. Повторіть через {{retryIn}}.",
+  "zen.api.error.goSubscriptionRollingLimitExceeded":
+    "Досягнуто 5-годинного ліміту використання. Скидається через {{retryIn}}. Щоб продовжити, увімкніть використання з доступного балансу: {{consoleGoUrl}}",
+  "zen.api.error.goSubscriptionWeeklyLimitExceeded":
+    "Досягнуто тижневого ліміту використання. Скидається через {{retryIn}}. Щоб продовжити, увімкніть використання з доступного балансу: {{consoleGoUrl}}",
+  "zen.api.error.goSubscriptionMonthlyLimitExceeded":
+    "Досягнуто місячного ліміту використання. Скидається через {{retryIn}}. Щоб продовжити, увімкніть використання з доступного балансу: {{consoleGoUrl}}",
+  "zen.api.error.noPaymentMethod": "Немає способу оплати. Додайте метод оплати: {{billingUrl}}",
+  "zen.api.error.insufficientBalance": "Недостатньо коштів. Керуйте оплатою: {{billingUrl}}",
+  "zen.api.error.workspaceMonthlyLimitReached":
+    "Ваш робочий простір досяг місячного ліміту витрат ${{amount}}. Керуйте лімітами: {{billingUrl}}",
+  "zen.api.error.userMonthlyLimitReached":
+    "Ви досягли місячного ліміту витрат ${{amount}}. Керуйте лімітами: {{membersUrl}}",
+  "zen.api.error.modelDisabled": "Модель вимкнено",
+  "zen.api.error.trialEnded":
+    "Безкоштовна акція для {{model}} закінчилася. Ви можете продовжити використання, підписавшись на OpenCode Go — {{link}}",
+
+  "black.meta.title": "OpenCode Black | Доступ до найкращих моделей кодування",
+  "black.meta.description": "Отримайте доступ до Claude, GPT, Gemini та інших із планами підписки OpenCode Black.",
+  "black.hero.title": "Доступ до найкращих моделей кодування",
+  "black.hero.subtitle": "Включаючи Claude, GPT, Gemini та інші",
+  "black.title": "OpenCode Black | Ціни",
+  "black.paused": "Реєстрація в план Black тимчасово призупинена.",
+  "black.plan.icon20": "План Black 20",
+  "black.plan.icon100": "План Black 100",
+  "black.plan.icon200": "План Black 200",
+  "black.plan.multiplier100": "5x більше використання ніж Black 20",
+  "black.plan.multiplier200": "20x більше використання ніж Black 20",
+  "black.price.perMonth": "на місяць",
+  "black.price.perPersonBilledMonthly": "за особу з щомісячною оплатою",
+  "black.terms.1": "Ваша підписка не розпочнеться негайно",
+  "black.terms.2": "Вас додадуть до списку очікування та активують незабаром",
+  "black.terms.3": "Картку буде списано лише після активації підписки",
+  "black.terms.4": "Діють ліміти використання, інтенсивне автоматичне використання може швидше вичерпати ліміти",
+  "black.terms.5": "Підписки призначені для фізичних осіб, зверніться в Enterprise для команд",
+  "black.terms.6": "Ліміти можуть бути змінені, а плани можуть бути припинені в майбутньому",
+  "black.terms.7": "Скасуйте підписку в будь-який час",
+  "black.action.continue": "Продовжити",
+  "black.finePrint.beforeTerms": "Зазначені ціни не включають податки",
+  "black.finePrint.terms": "Умови надання послуг",
+  "black.workspace.title": "OpenCode Black | Виберіть робочий простір",
+  "black.workspace.selectPlan": "Виберіть робочий простір для цього плану",
+  "black.workspace.name": "Робочий простір {{n}}",
+  "black.subscribe.title": "Підписатися на OpenCode Black",
+  "black.subscribe.paymentMethod": "Спосіб оплати",
+  "black.subscribe.loadingPaymentForm": "Завантаження форми оплати...",
+  "black.subscribe.selectWorkspaceToContinue": "Виберіть робочий простір для продовження",
+  "black.subscribe.failurePrefix": "Ой!",
+  "black.subscribe.error.generic": "Сталася помилка",
+  "black.subscribe.error.invalidPlan": "Недійсний план",
+  "black.subscribe.error.workspaceRequired": "ID робочого простору обов'язкове",
+  "black.subscribe.error.alreadySubscribed": "Цей робочий простір уже має підписку",
+  "black.subscribe.processing": "Обробка...",
+  "black.subscribe.submit": "Підписатися ${{plan}}",
+  "black.subscribe.form.chargeNotice": "Платіж буде списано лише після активації підписки",
+  "black.subscribe.success.title": "Ви в списку очікування OpenCode Black",
+  "black.subscribe.success.subscriptionPlan": "План підписки",
+  "black.subscribe.success.planName": "OpenCode Black {{plan}}",
+  "black.subscribe.success.amount": "Сума",
+  "black.subscribe.success.amountValue": "${{plan}} на місяць",
+  "black.subscribe.success.paymentMethod": "Спосіб оплати",
+  "black.subscribe.success.dateJoined": "Дата приєднання",
+  "black.subscribe.success.chargeNotice": "Вашу картку буде списано після активації підписки",
+
+  "workspace.nav.zen": "Zen",
+  "workspace.nav.go": "Go",
+  "workspace.nav.usage": "Використання",
+  "workspace.nav.apiKeys": "Ключі API",
+  "workspace.nav.members": "Учасники",
+  "workspace.nav.billing": "Оплата",
+  "workspace.nav.settings": "Налаштування",
+
+  "workspace.home.banner.beforeLink": "Надійні оптимізовані моделі для агентів кодування.",
+  "workspace.lite.banner.beforeLink": "Недорогі моделі кодування для всіх.",
+  "workspace.home.billing.loading": "Завантаження...",
+  "workspace.home.billing.enable": "Увімкнути оплату",
+  "workspace.home.billing.currentBalance": "Поточний баланс",
+
+  "workspace.newUser.feature.tested.title": "Протестовані та перевірені моделі",
+  "workspace.newUser.feature.tested.body":
+    "Ми протестували моделі спеціально для агентів кодування, щоб забезпечити найкращу продуктивність.",
+  "workspace.newUser.feature.quality.title": "Найвища якість",
+  "workspace.newUser.feature.quality.body":
+    "Доступ до моделей, налаштованих для оптимальної продуктивності — без зниження якості.",
+  "workspace.newUser.feature.lockin.title": "Без блокування (Lock-in)",
+  "workspace.newUser.feature.lockin.body":
+    "Використовуйте Zen з будь-яким агентом і продовжуйте користуватися іншими провайдерами.",
+  "workspace.newUser.copyApiKey": "Копіювати ключ API",
+  "workspace.newUser.copyKey": "Копіювати ключ",
+  "workspace.newUser.copied": "Скопійовано!",
+  "workspace.newUser.step.enableBilling": "Увімкнути оплату",
+  "workspace.newUser.step.login.before": "Запустіть",
+  "workspace.newUser.step.login.after": "і виберіть opencode",
+  "workspace.newUser.step.pasteKey": "Вставте ключ API",
+  "workspace.newUser.step.models.before": "Запустіть opencode і виконайте",
+  "workspace.newUser.step.models.after": "щоб вибрати модель",
+
+  "workspace.models.title": "Моделі",
+  "workspace.models.subtitle.beforeLink": "Керуйте доступом учасників до моделей.",
+  "workspace.models.table.model": "Модель",
+  "workspace.models.table.enabled": "Увімкнено",
+
+  "workspace.providers.title": "Принесіть власний ключ (BYOK)",
+  "workspace.providers.subtitle": "Налаштуйте власні ключі API від AI-провайдерів.",
+  "workspace.providers.placeholder": "Введіть ключ API {{provider}} ({{prefix}}...)",
+  "workspace.providers.configure": "Налаштувати",
+  "workspace.providers.edit": "Редагувати",
+  "workspace.providers.delete": "Видалити",
+  "workspace.providers.saving": "Збереження...",
+  "workspace.providers.save": "Зберегти",
+  "workspace.providers.table.provider": "Провайдер",
+  "workspace.providers.table.apiKey": "Ключ API",
+
+  "workspace.usage.title": "Історія використання",
+  "workspace.usage.subtitle": "Останнє використання API та витрати.",
+  "workspace.usage.empty": "Зробіть перший API-запит, щоб почати.",
+  "workspace.usage.table.date": "Дата",
+  "workspace.usage.table.model": "Модель",
+  "workspace.usage.table.input": "Вхід",
+  "workspace.usage.table.output": "Вихід",
+  "workspace.usage.table.cost": "Вартість",
+  "workspace.usage.table.session": "Сесія",
+  "workspace.usage.breakdown.input": "Вхід",
+  "workspace.usage.breakdown.cacheRead": "Читання кешу",
+  "workspace.usage.breakdown.cacheWrite": "Запис кешу",
+  "workspace.usage.breakdown.output": "Вихід",
+  "workspace.usage.breakdown.reasoning": "Міркування",
+  "workspace.usage.subscription": "Black (${{amount}})",
+  "workspace.usage.lite": "Go (${{amount}})",
+  "workspace.usage.byok": "BYOK (${{amount}})",
+
+  "workspace.cost.title": "Вартість",
+  "workspace.cost.subtitle": "Витрати в розрізі моделей.",
+  "workspace.cost.allModels": "Усі моделі",
+  "workspace.cost.allKeys": "Усі ключі",
+  "workspace.cost.deletedSuffix": "(видалено)",
+  "workspace.cost.empty": "Немає даних про використання за вибраний період.",
+  "workspace.cost.subscriptionShort": "підп",
+
+  "workspace.keys.title": "Ключі API",
+  "workspace.keys.subtitle": "Керуйте ключами API для доступу до сервісів opencode.",
+  "workspace.keys.create": "Створити ключ API",
+  "workspace.keys.placeholder": "Введіть назву ключа",
+  "workspace.keys.empty": "Створіть ключ API шлюзу opencode",
+  "workspace.keys.table.name": "Назва",
+  "workspace.keys.table.key": "Ключ",
+  "workspace.keys.table.createdBy": "Створено",
+  "workspace.keys.table.lastUsed": "Останнє використання",
+  "workspace.keys.copyApiKey": "Копіювати ключ API",
+  "workspace.keys.delete": "Видалити",
+
+  "workspace.members.title": "Учасники",
+  "workspace.members.subtitle": "Керуйте учасниками робочого простору та їхніми дозволами.",
+  "workspace.members.invite": "Запросити учасника",
+  "workspace.members.inviting": "Запрошення...",
+  "workspace.members.beta.beforeLink": "Робочі простори безкоштовні для команд під час бета-версії.",
+  "workspace.members.form.invitee": "Запрошений",
+  "workspace.members.form.emailPlaceholder": "Введіть email",
+  "workspace.members.form.role": "Роль",
+  "workspace.members.form.monthlyLimit": "Місячний ліміт витрат",
+  "workspace.members.noLimit": "Без ліміту",
+  "workspace.members.noLimitLowercase": "без ліміту",
+  "workspace.members.invited": "запрошено",
+  "workspace.members.edit": "Редагувати",
+  "workspace.members.delete": "Видалити",
+  "workspace.members.saving": "Збереження...",
+  "workspace.members.save": "Зберегти",
+  "workspace.members.table.email": "Email",
+  "workspace.members.table.role": "Роль",
+  "workspace.members.table.monthLimit": "Ліміт на місяць",
+  "workspace.members.role.admin": "Адміністратор",
+  "workspace.members.role.adminDescription": "Може керувати моделями, учасниками та оплатою",
+  "workspace.members.role.member": "Учасник",
+  "workspace.members.role.memberDescription": "Може створювати ключі API лише для себе",
+
+  "workspace.settings.title": "Налаштування",
+  "workspace.settings.subtitle": "Оновіть назву робочого простору та налаштування.",
+  "workspace.settings.workspaceName": "Назва робочого простору",
+  "workspace.settings.defaultName": "Стандартна",
+  "workspace.settings.updating": "Оновлення...",
+  "workspace.settings.save": "Зберегти",
+  "workspace.settings.edit": "Редагувати",
+
+  "workspace.billing.title": "Оплата",
+  "workspace.billing.subtitle.beforeLink": "Керуйте способами оплати.",
+  "workspace.billing.contactUs": "Зв'яжіться з нами",
+  "workspace.billing.subtitle.afterLink": "якщо у вас є запитання.",
+  "workspace.billing.currentBalance": "Поточний баланс",
+  "workspace.billing.add": "Додати $",
+  "workspace.billing.enterAmount": "Введіть суму",
+  "workspace.billing.loading": "Завантаження...",
+  "workspace.billing.addAction": "Додати",
+  "workspace.billing.addBalance": "Поповнити баланс",
+  "workspace.billing.alipay": "Alipay",
+  "workspace.billing.wechat": "WeChat Pay",
+  "workspace.billing.linkedToStripe": "Підключено до Stripe",
+  "workspace.billing.manage": "Керувати",
+  "workspace.billing.enable": "Увімкнути оплату",
+
+  "workspace.monthlyLimit.title": "Місячний ліміт",
+  "workspace.monthlyLimit.subtitle": "Встановіть місячний ліміт використання для облікового запису.",
+  "workspace.monthlyLimit.placeholder": "50",
+  "workspace.monthlyLimit.setting": "Встановлення...",
+  "workspace.monthlyLimit.set": "Встановити",
+  "workspace.monthlyLimit.edit": "Редагувати ліміт",
+  "workspace.monthlyLimit.noLimit": "Ліміт використання не встановлено.",
+  "workspace.monthlyLimit.currentUsage.beforeMonth": "Поточне використання за",
+  "workspace.monthlyLimit.currentUsage.beforeAmount": "становить $",
+
+  "workspace.redeem.title": "Активувати купон",
+  "workspace.redeem.subtitle": "Активуйте код купона для отримання коштів або бонусів.",
+  "workspace.redeem.placeholder": "Введіть код купона",
+  "workspace.redeem.redeem": "Активувати",
+  "workspace.redeem.redeeming": "Активація...",
+  "workspace.redeem.success": "Купон успішно активовано.",
+
+  "workspace.reload.title": "Автоматичне поповнення",
+  "workspace.reload.disabled.before": "Автоматичне поповнення",
+  "workspace.reload.disabled.state": "вимкнено",
+  "workspace.reload.disabled.after": "Увімкніть для автоматичного поповнення при низькому балансі.",
+  "workspace.reload.enabled.before": "Автоматичне поповнення",
+  "workspace.reload.enabled.state": "увімкнено",
+  "workspace.reload.enabled.middle": "Ми поповнимо",
+  "workspace.reload.processingFee": "комісія за обробку",
+  "workspace.reload.enabled.after": "коли баланс досягне",
+  "workspace.reload.edit": "Редагувати",
+  "workspace.reload.enable": "Увімкнути",
+  "workspace.reload.enableAutoReload": "Увімкнути автоматичне поповнення",
+  "workspace.reload.reloadAmount": "Поповнити на $",
+  "workspace.reload.whenBalanceReaches": "Коли баланс досягне $",
+  "workspace.reload.saving": "Збереження...",
+  "workspace.reload.save": "Зберегти",
+  "workspace.reload.failedAt": "Поповнення не вдалося о",
+  "workspace.reload.reason": "Причина:",
+  "workspace.reload.updatePaymentMethod": "Оновіть спосіб оплати та спробуйте ще раз.",
+  "workspace.reload.retrying": "Повтор...",
+  "workspace.reload.retry": "Повторити",
+  "workspace.reload.error.paymentFailed": "Платіж не вдався.",
+
+  "workspace.payments.title": "Історія платежів",
+  "workspace.payments.subtitle": "Останні платіжні транзакції.",
+  "workspace.payments.table.date": "Дата",
+  "workspace.payments.table.paymentId": "ID платежу",
+  "workspace.payments.table.amount": "Сума",
+  "workspace.payments.table.receipt": "Квитанція",
+  "workspace.payments.type.credit": "кредит",
+  "workspace.payments.type.subscription": "підписка",
+  "workspace.payments.view": "Переглянути",
+
+  "workspace.black.loading": "Завантаження...",
+  "workspace.black.time.day": "день",
+  "workspace.black.time.days": "дні",
+  "workspace.black.time.hour": "година",
+  "workspace.black.time.hours": "годин(и)",
+  "workspace.black.time.minute": "хвилина",
+  "workspace.black.time.minutes": "хвилин(и)",
+  "workspace.black.time.fewSeconds": "кілька секунд",
+  "workspace.black.subscription.title": "Підписка",
+  "workspace.black.subscription.message": "Ви підписані на OpenCode Black за ${{plan}} на місяць.",
+  "workspace.black.subscription.manage": "Керувати підпискою",
+  "workspace.black.subscription.rollingUsage": "Використання (5 год)",
+  "workspace.black.subscription.weeklyUsage": "Тижневе використання",
+  "workspace.black.subscription.resetsIn": "Скидається через",
+  "workspace.black.subscription.useBalance": "Використовуйте доступний баланс після досягнення лімітів",
+  "workspace.black.waitlist.title": "Список очікування",
+  "workspace.black.waitlist.joined": "Ви в списку очікування на план OpenCode Black за ${{plan}} на місяць.",
+  "workspace.black.waitlist.ready": "Ми готові зареєструвати вас на план OpenCode Black за ${{plan}} на місяць.",
+  "workspace.black.waitlist.leave": "Залишити список очікування",
+  "workspace.black.waitlist.leaving": "Вихід...",
+  "workspace.black.waitlist.left": "Вишли",
+  "workspace.black.waitlist.enroll": "Зареєструватися",
+  "workspace.black.waitlist.enrolling": "Реєстрація...",
+  "workspace.black.waitlist.enrolled": "Зареєстровано",
+  "workspace.black.waitlist.enrollNote":
+    "Після натискання «Зареєструватися» підписка почнеться негайно, а картку буде списано.",
+
+  "workspace.lite.loading": "Завантаження...",
+  "workspace.lite.time.day": "день",
+  "workspace.lite.time.days": "дні",
+  "workspace.lite.time.hour": "година",
+  "workspace.lite.time.hours": "годин(и)",
+  "workspace.lite.time.minute": "хвилина",
+  "workspace.lite.time.minutes": "хвилин(и)",
+  "workspace.lite.time.fewSeconds": "кілька секунд",
+  "workspace.lite.subscription.message": "Ви підписані на OpenCode Go.",
+  "workspace.lite.subscription.manage": "Керувати підпискою",
+  "workspace.lite.subscription.rollingUsage": "Ковзне використання",
+  "workspace.lite.subscription.weeklyUsage": "Тижневе використання",
+  "workspace.lite.subscription.monthlyUsage": "Місячне використання",
+  "workspace.lite.subscription.resetsIn": "Скидається через",
+  "workspace.lite.subscription.useBalance": "Використовуйте доступний баланс після досягнення лімітів",
+  "workspace.lite.subscription.selectProvider":
+    'Виберіть "OpenCode Go" як провайдера в конфігурації opencode.',
+  "workspace.lite.black.message":
+    "Ви вже підписані на OpenCode Black або в списку очікування. Спочатку скасуйте підписку, якщо хочете перейти на Go.",
+  "workspace.lite.other.message":
+    "Інший учасник цього робочого простору вже підписаний на OpenCode Go.",
+  "workspace.lite.promo.description":
+    "OpenCode Go починається від {{price}}, потім $10/місяць, із щедрими лімітами.",
+  "workspace.lite.promo.price": "$5 за перший місяць",
+  "workspace.lite.promo.modelsTitle": "Що включено",
+  "workspace.lite.promo.footer":
+    "План призначений для міжнародних користувачів. Ціни можуть змінюватися.",
+  "workspace.lite.promo.subscribe": "Підписатися на Go",
+  "workspace.lite.promo.subscribing": "Перенаправлення...",
+  "workspace.lite.promo.otherMethods": "Інші способи оплати",
+  "workspace.lite.promo.selectMethod": "Виберіть спосіб оплати",
+
+  "download.title": "OpenCode | Завантажити",
+  "download.meta.description": "Завантажте OpenCode для macOS, Windows та Linux",
+  "download.hero.title": "Завантажити OpenCode",
+  "download.hero.subtitle": "Доступно в бета-версії для macOS, Windows та Linux",
+  "download.hero.button": "Завантажити для {{os}}",
+  "download.section.terminal": "Термінал OpenCode",
+  "download.section.desktop": "Десктоп OpenCode (Бета)",
+  "download.section.extensions": "Розширення OpenCode",
+  "download.section.integrations": "Інтеграції OpenCode",
+  "download.action.download": "Завантажити",
+  "download.action.install": "Встановити",
+
+  "download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
+  "download.platform.macosIntel": "macOS (Intel)",
+  "download.platform.windowsX64": "Windows (x64)",
+  "download.platform.linuxDeb": "Linux (.deb)",
+  "download.platform.linuxRpm": "Linux (.rpm)",
+
+  "download.faq.a3.beforeLocal":
+    "Не обов'язково, але ймовірно. Вам знадобиться AI-підписка, якщо ви хочете підключити платного провайдера, хоча ви можете працювати з",
+  "download.faq.a3.localLink": "локальними моделями",
+  "download.faq.a3.afterLocal.beforeZen": "безкоштовно. Хоча ми рекомендуємо",
+  "download.faq.a3.afterZen":
+    ", OpenCode працює з усіма популярними провайдерами, такими як OpenAI, Anthropic, xAI тощо.",
+
+  "download.faq.a5.p1": "OpenCode є 100% безкоштовним.",
+  "download.faq.a5.p2.beforeZen":
+    "Будь-які додаткові витрати будуть з вашої підписки у провайдера моделі. Ми рекомендуємо",
+  "download.faq.a5.p2.afterZen": ".",
+
+  "download.faq.a6.p1": "Ваші дані зберігаються лише при створенні посилань для обміну в OpenCode.",
+  "download.faq.a6.p2.beforeShare": "Дізнайтеся більше про",
+  "download.faq.a6.shareLink": "сторінки обміну",
+
+  "enterprise.title": "OpenCode | Enterprise-рішення для вашої організації",
+  "enterprise.meta.description": "Зв'яжіться з OpenCode для Enterprise-рішень",
+  "enterprise.hero.title": "Ваш код належить вам",
+  "enterprise.hero.body1":
+    "OpenCode працює безпечно всередині вашої організації без зберігання даних, ліцензійних обмежень. Почніть пробний період із командою, потім розгорніть через SSO та внутрішній AI-шлюз.",
+  "enterprise.hero.body2": "Дайте знати, чим ми можемо допомогти.",
+  "enterprise.form.name.label": "Повне ім'я",
+  "enterprise.form.name.placeholder": "Джеф Безос",
+  "enterprise.form.role.label": "Посада",
+  "enterprise.form.role.placeholder": "Голова правління",
+  "enterprise.form.company.label": "Компанія",
+  "enterprise.form.company.placeholder": "Acme Inc",
+  "enterprise.form.email.label": "Робоча електронна адреса",
+  "enterprise.form.email.placeholder": "jeff@amazon.com",
+  "enterprise.form.phone.label": "Номер телефону",
+  "enterprise.form.phone.placeholder": "+1 234 567 8900",
+  "enterprise.form.message.label": "Яку проблему ви намагаєтеся вирішити?",
+  "enterprise.form.message.placeholder": "Нам потрібна допомога з...",
+  "enterprise.form.send": "Надіслати",
+  "enterprise.form.sending": "Надсилання...",
+  "enterprise.form.success": "Повідомлення надіслано, ми зв'яжемося найближчим часом.",
+  "enterprise.form.success.submitted": "Форму успішно надіслано.",
+  "enterprise.form.error.allFieldsRequired": "Усі поля обов'язкові.",
+  "enterprise.form.error.invalidEmailFormat": "Недійсний формат email.",
+  "enterprise.form.error.internalServer": "Внутрішня помилка сервера.",
+  "enterprise.faq.title": "FAQ",
+  "enterprise.faq.q1": "Що таке OpenCode Enterprise?",
+  "enterprise.faq.a1":
+    "OpenCode Enterprise для організацій, які хочуть гарантувати, що код і дані ніколи не залишають їхню інфраструктуру.",
+  "enterprise.faq.q2": "Як почати з OpenCode Enterprise?",
+  "enterprise.faq.a2":
+    "Почніть із внутрішнього тестування з командою. OpenCode за замовчуванням не зберігає код. Потім зв'яжіться з нами для обговорення цін.",
+  "enterprise.faq.q3": "Як працює ціноутворення enterprise?",
+  "enterprise.faq.a3":
+    "Ми пропонуємо ціну за робоче місце. Якщо у вас власний LLM-шлюз, ми не стягуємо плату за токени.",
+  "enterprise.faq.q4": "Чи безпечні мої дані з OpenCode Enterprise?",
+  "enterprise.faq.a4":
+    "Так. OpenCode не зберігає ваш код або контекст. Вся обробка відбувається локально або через прямі API-виклики.",
+
+  "brand.title": "OpenCode | Бренд",
+  "brand.meta.description": "Рекомендації щодо бренду OpenCode",
+  "brand.heading": "Рекомендації щодо бренду",
+  "brand.subtitle": "Ресурси та матеріали для роботи з брендом OpenCode.",
+  "brand.downloadAll": "Завантажити всі матеріали",
+
+  "changelog.title": "OpenCode | Журнал змін",
+  "changelog.meta.description": "Нотатки про випуски та журнал змін OpenCode",
+  "changelog.hero.title": "Журнал змін",
+  "changelog.hero.subtitle": "Нові оновлення та покращення OpenCode",
+  "changelog.empty": "Записів у журналі змін не знайдено.",
+  "changelog.viewJson": "Переглянути JSON",
+
+  "bench.list.title": "Бенчмарк",
+  "bench.list.heading": "Бенчмарки",
+  "bench.list.table.agent": "Агент",
+  "bench.list.table.model": "Модель",
+  "bench.list.table.score": "Результат",
+  "bench.submission.error.allFieldsRequired": "Усі поля обов'язкові.",
+
+  "bench.detail.title": "Бенчмарк — {{task}}",
+  "bench.detail.notFound": "Завдання не знайдено",
+  "bench.detail.na": "Н/Д",
+  "bench.detail.labels.agent": "Агент",
+  "bench.detail.labels.model": "Модель",
+  "bench.detail.labels.task": "Завдання",
+  "bench.detail.labels.repo": "Репозиторій",
+  "bench.detail.labels.from": "Від",
+  "bench.detail.labels.to": "До",
+  "bench.detail.labels.prompt": "Prompt",
+  "bench.detail.labels.commit": "Коміт",
+  "bench.detail.labels.averageDuration": "Середня тривалість",
+  "bench.detail.labels.averageScore": "Середній результат",
+  "bench.detail.labels.averageCost": "Середня вартість",
+  "bench.detail.labels.summary": "Підсумок",
+  "bench.detail.labels.runs": "Запуски",
+  "bench.detail.labels.score": "Результат",
+  "bench.detail.labels.base": "База",
+  "bench.detail.labels.penalty": "Штраф",
+  "bench.detail.labels.weight": "вага",
+  "bench.detail.table.run": "Запуск",
+  "bench.detail.table.score": "Результат (База — Штраф)",
+  "bench.detail.table.cost": "Вартість",
+  "bench.detail.table.duration": "Тривалість",
+  "bench.detail.run.title": "Запуск {{n}}",
+  "bench.detail.rawJson": "Сирий JSON",
+}

+ 7 - 0
packages/console/app/src/lib/language.ts

@@ -11,6 +11,7 @@ export const LOCALES = [
   "ja",
   "pl",
   "ru",
+  "uk",
   "ar",
   "no",
   "br",
@@ -41,6 +42,7 @@ const LABEL = {
   ja: "日本語",
   pl: "Polski",
   ru: "Русский",
+  uk: "Українська",
   ar: "العربية",
   no: "Norsk",
   br: "Português (Brasil)",
@@ -61,6 +63,7 @@ const TAG = {
   ja: "ja",
   pl: "pl",
   ru: "ru",
+  uk: "uk",
   ar: "ar",
   no: "no",
   br: "pt-BR",
@@ -81,6 +84,7 @@ const DOCS = {
   ja: "ja",
   pl: "pl",
   ru: "ru",
+  uk: "uk",
   ar: "ar",
   no: "nb",
   br: "pt-br",
@@ -104,6 +108,7 @@ const DOCS_SEGMENT = new Set([
   "ru",
   "th",
   "tr",
+  "uk",
   "zh-cn",
   "zh-tw",
 ])
@@ -124,6 +129,7 @@ const DOCS_LOCALE = {
   ru: "ru",
   th: "th",
   tr: "tr",
+  uk: "uk",
   "zh-cn": "zh",
   "zh-tw": "zht",
 } as const satisfies Record<string, Locale>
@@ -239,6 +245,7 @@ function match(input: string): Locale | null {
   if (value.startsWith("ja")) return "ja"
   if (value.startsWith("pl")) return "pl"
   if (value.startsWith("ru")) return "ru"
+  if (value.startsWith("uk")) return "uk"
   if (value.startsWith("ar")) return "ar"
   if (value.startsWith("tr")) return "tr"
   if (value.startsWith("th")) return "th"

+ 6 - 0
packages/desktop/src/renderer/i18n/index.ts

@@ -11,6 +11,7 @@ import { dict as desktopDa } from "./da"
 import { dict as desktopJa } from "./ja"
 import { dict as desktopPl } from "./pl"
 import { dict as desktopRu } from "./ru"
+import { dict as desktopUk } from "./uk"
 import { dict as desktopAr } from "./ar"
 import { dict as desktopNo } from "./no"
 import { dict as desktopBr } from "./br"
@@ -27,6 +28,7 @@ import { dict as appDa } from "../../../../app/src/i18n/da"
 import { dict as appJa } from "../../../../app/src/i18n/ja"
 import { dict as appPl } from "../../../../app/src/i18n/pl"
 import { dict as appRu } from "../../../../app/src/i18n/ru"
+import { dict as appUk } from "../../../../app/src/i18n/uk"
 import { dict as appAr } from "../../../../app/src/i18n/ar"
 import { dict as appNo } from "../../../../app/src/i18n/no"
 import { dict as appBr } from "../../../../app/src/i18n/br"
@@ -44,6 +46,7 @@ export type Locale =
   | "ja"
   | "pl"
   | "ru"
+  | "uk"
   | "ar"
   | "no"
   | "br"
@@ -64,6 +67,7 @@ const LOCALES: readonly Locale[] = [
   "ja",
   "pl",
   "ru",
+  "uk",
   "bs",
   "ar",
   "no",
@@ -89,6 +93,7 @@ function detectLocale(): Locale {
     if (language.toLowerCase().startsWith("ja")) return "ja"
     if (language.toLowerCase().startsWith("pl")) return "pl"
     if (language.toLowerCase().startsWith("ru")) return "ru"
+    if (language.toLowerCase().startsWith("uk")) return "uk"
     if (language.toLowerCase().startsWith("ar")) return "ar"
     if (
       language.toLowerCase().startsWith("no") ||
@@ -148,6 +153,7 @@ function build(locale: Locale): Dictionary {
   if (locale === "ja") return { ...base, ...i18n.flatten(appJa), ...i18n.flatten(desktopJa) }
   if (locale === "pl") return { ...base, ...i18n.flatten(appPl), ...i18n.flatten(desktopPl) }
   if (locale === "ru") return { ...base, ...i18n.flatten(appRu), ...i18n.flatten(desktopRu) }
+  if (locale === "uk") return { ...base, ...i18n.flatten(appUk), ...i18n.flatten(desktopUk) }
   if (locale === "ar") return { ...base, ...i18n.flatten(appAr), ...i18n.flatten(desktopAr) }
   if (locale === "no") return { ...base, ...i18n.flatten(appNo), ...i18n.flatten(desktopNo) }
   if (locale === "br") return { ...base, ...i18n.flatten(appBr), ...i18n.flatten(desktopBr) }

+ 28 - 0
packages/desktop/src/renderer/i18n/uk.ts

@@ -0,0 +1,28 @@
+export const dict = {
+  "desktop.menu.checkForUpdates": "Перевірити оновлення...",
+  "desktop.menu.installCli": "Встановити CLI...",
+  "desktop.menu.reloadWebview": "Перезавантажити Webview",
+  "desktop.menu.restart": "Перезапустити",
+
+  "desktop.dialog.chooseFolder": "Виберіть теку",
+  "desktop.dialog.chooseFile": "Виберіть файл",
+  "desktop.dialog.saveFile": "Зберегти файл",
+
+  "desktop.updater.checkFailed.title": "Не вдалося перевірити оновлення",
+  "desktop.updater.checkFailed.message": "Не вдалося перевірити наявність оновлень",
+  "desktop.updater.none.title": "Немає доступних оновлень",
+  "desktop.updater.none.message": "Ви вже використовуєте найновішу версію OpenCode",
+  "desktop.updater.downloadFailed.title": "Помилка оновлення",
+  "desktop.updater.downloadFailed.message": "Не вдалося завантажити оновлення",
+  "desktop.updater.downloaded.title": "Оновлення завантажено",
+  "desktop.updater.downloaded.prompt":
+    "Версію {{version}} OpenCode завантажено. Бажаєте встановити її та перезапустити?",
+  "desktop.updater.installFailed.title": "Помилка оновлення",
+  "desktop.updater.installFailed.message": "Не вдалося встановити оновлення",
+
+  "desktop.cli.installed.title": "CLI встановлено",
+  "desktop.cli.installed.message":
+    "CLI встановлено до {{path}}\n\nПерезапустіть термінал, щоб використовувати команду 'opencode'.",
+  "desktop.cli.failed.title": "Не вдалося встановити",
+  "desktop.cli.failed.message": "Не вдалося встановити CLI: {{error}}",
+}

+ 167 - 0
packages/ui/src/i18n/uk.ts

@@ -0,0 +1,167 @@
+export const dict: Record<string, string> = {
+  "ui.sessionReview.title": "Зміни сесії",
+  "ui.sessionReview.title.git": "Зміни Git",
+  "ui.sessionReview.title.branch": "Зміни гілки",
+  "ui.sessionReview.title.lastTurn": "Зміни останнього кроку",
+  "ui.sessionReview.diffStyle.unified": "Об'єднаний",
+  "ui.sessionReview.diffStyle.split": "Розділений",
+  "ui.sessionReview.expandAll": "Розгорнути все",
+  "ui.sessionReview.collapseAll": "Згорнути все",
+  "ui.sessionReview.change.added": "Додано",
+  "ui.sessionReview.change.removed": "Видалено",
+  "ui.sessionReview.change.modified": "Змінено",
+  "ui.sessionReview.image.loading": "Завантаження...",
+  "ui.sessionReview.image.placeholder": "Зображення",
+  "ui.sessionReview.largeDiff.title": "Завеликий diff для відображення",
+  "ui.sessionReview.largeDiff.meta": "Ліміт: {{limit}} змінених рядків. Поточно: {{current}} змінених рядків.",
+  "ui.sessionReview.largeDiff.renderAnyway": "Все одно відобразити",
+  "ui.sessionReview.openFile": "Відкрити файл",
+  "ui.sessionReview.selection.line": "рядок {{line}}",
+  "ui.sessionReview.selection.lines": "рядки {{start}}-{{end}}",
+
+  "ui.fileMedia.kind.image": "зображення",
+  "ui.fileMedia.kind.audio": "аудіо",
+  "ui.fileMedia.state.removed": "{{kind}} видалено",
+  "ui.fileMedia.state.loading": "Завантаження {{kind}}...",
+  "ui.fileMedia.state.error": "Не вдалося завантажити {{kind}}",
+  "ui.fileMedia.state.unavailable": "{{kind}} недоступне",
+  "ui.fileMedia.binary.title": "Бінарний файл",
+  "ui.fileMedia.binary.description.path": "Неможливо відобразити {{path}}, оскільки це бінарний файл.",
+  "ui.fileMedia.binary.description.default": "Неможливо відобразити цей файл, оскільки він бінарний.",
+
+  "ui.lineComment.label.prefix": "Коментар до ",
+  "ui.lineComment.label.suffix": "",
+  "ui.lineComment.editorLabel.prefix": "Коментування: ",
+  "ui.lineComment.editorLabel.suffix": "",
+  "ui.lineComment.placeholder": "Додати коментар",
+  "ui.lineComment.submit": "Коментувати",
+
+  "ui.sessionTurn.steps.show": "Показати кроки",
+  "ui.sessionTurn.steps.hide": "Приховати кроки",
+  "ui.sessionTurn.summary.response": "Відповідь",
+  "ui.sessionTurn.diff.showMore": "Показати більше змін ({{count}})",
+  "ui.sessionTurn.diffs.changed": "Змінено",
+  "ui.sessionTurn.diffs.showAll": "Показати всі",
+  "ui.sessionTurn.diffs.showLess": "Показати менше",
+  "ui.sessionTurn.diffs.more": "+{{count}} інших файлів",
+
+  "ui.sessionTurn.retry.retrying": "повтор",
+  "ui.sessionTurn.retry.inSeconds": "за {{seconds}}с",
+  "ui.sessionTurn.retry.attempt": "спроба №{{attempt}}",
+  "ui.sessionTurn.retry.attemptLine": "{{line}} — спроба №{{attempt}}",
+  "ui.sessionTurn.retry.geminiHot": "gemini зараз перевантажений",
+  "ui.sessionTurn.error.freeUsageExceeded": "Перевищено ліміт безкоштовного використання",
+  "ui.sessionTurn.error.addCredits": "Додати кредити",
+
+  "ui.sessionTurn.status.delegating": "Делегування роботи",
+  "ui.sessionTurn.status.planning": "Планування наступних кроків",
+  "ui.sessionTurn.status.gatheringContext": "Дослідження",
+  "ui.sessionTurn.status.gatheredContext": "Досліджено",
+  "ui.sessionTurn.status.searchingCodebase": "Пошук у кодовій базі",
+  "ui.sessionTurn.status.searchingWeb": "Пошук в інтернеті",
+  "ui.sessionTurn.status.makingEdits": "Внесення змін",
+  "ui.sessionTurn.status.runningCommands": "Виконання команд",
+  "ui.sessionTurn.status.thinking": "Міркування",
+  "ui.sessionTurn.status.thinkingWithTopic": "Міркування — {{topic}}",
+  "ui.sessionTurn.status.gatheringThoughts": "Збирання думок",
+  "ui.sessionTurn.status.consideringNextSteps": "Розгляд наступних кроків",
+
+  "ui.messagePart.diagnostic.error": "Помилка",
+  "ui.messagePart.title.edit": "Редагувати",
+  "ui.messagePart.title.write": "Написати",
+  "ui.messagePart.option.typeOwnAnswer": "Введіть власну відповідь",
+  "ui.messagePart.review.title": "Перевірте свої відповіді",
+  "ui.messagePart.questions.dismissed": "Питання відхилено",
+  "ui.messagePart.compaction": "Сесію стиснуто",
+  "ui.messagePart.context.read.one": "{{count}} читання",
+  "ui.messagePart.context.read.other": "{{count}} читань",
+  "ui.messagePart.context.search.one": "{{count}} пошук",
+  "ui.messagePart.context.search.other": "{{count}} пошуків",
+  "ui.messagePart.context.list.one": "{{count}} список",
+  "ui.messagePart.context.list.other": "{{count}} списків",
+
+  "ui.list.loading": "Завантаження",
+  "ui.list.empty": "Немає результатів",
+  "ui.list.clearFilter": "Очистити фільтр",
+  "ui.list.emptyWithFilter.prefix": "Немає результатів для",
+  "ui.list.emptyWithFilter.suffix": "",
+
+  "ui.fileSearch.placeholder": "Знайти",
+  "ui.fileSearch.previousMatch": "Попередній збіг",
+  "ui.fileSearch.nextMatch": "Наступний збіг",
+  "ui.fileSearch.close": "Закрити пошук",
+
+  "ui.messageNav.newMessage": "Нове повідомлення",
+
+  "ui.textField.copyToClipboard": "Копіювати в буфер обміну",
+  "ui.textField.copyLink": "Копіювати посилання",
+  "ui.textField.copied": "Скопійовано",
+
+  "ui.imagePreview.alt": "Попередній перегляд зображення",
+  "ui.scrollView.ariaLabel": "контент для прокручування",
+
+  "ui.tool.read": "Читання",
+  "ui.tool.loaded": "Завантажено",
+  "ui.tool.list": "Список",
+  "ui.tool.glob": "Glob",
+  "ui.tool.grep": "Grep",
+  "ui.tool.task": "Завдання",
+  "ui.tool.webfetch": "Веб-отримання",
+  "ui.tool.websearch": "Веб-пошук",
+  "ui.tool.shell": "Оболонка",
+  "ui.tool.patch": "Патч",
+  "ui.tool.todos": "Завдання",
+  "ui.tool.todos.read": "Читати завдання",
+  "ui.tool.questions": "Питання",
+  "ui.tool.agent": "Агент {{type}}",
+  "ui.tool.agent.default": "Агент",
+  "ui.tool.skill": "Навичка",
+
+  "ui.basicTool.called": "Викликано `{{tool}}`",
+  "ui.toolErrorCard.failed": "Помилка",
+  "ui.toolErrorCard.copyError": "Копіювати помилку",
+
+  "ui.common.file.one": "файл",
+  "ui.common.file.other": "файлів",
+  "ui.common.question.one": "питання",
+  "ui.common.question.other": "питань",
+
+  "ui.common.add": "Додати",
+  "ui.common.back": "Назад",
+  "ui.common.cancel": "Скасувати",
+  "ui.common.confirm": "Підтвердити",
+  "ui.common.dismiss": "Відхилити",
+  "ui.common.close": "Закрити",
+  "ui.common.next": "Далі",
+  "ui.common.submit": "Надіслати",
+
+  "ui.permission.deny": "Заборонити",
+  "ui.permission.allowAlways": "Дозволяти завжди",
+  "ui.permission.allowOnce": "Дозволити один раз",
+
+  "ui.message.expand": "Розгорнути повідомлення",
+  "ui.message.collapse": "Згорнути повідомлення",
+  "ui.message.copy": "Копіювати",
+  "ui.message.copyMessage": "Копіювати повідомлення",
+  "ui.message.forkMessage": "Відгалузити в нову сесію",
+  "ui.message.revertMessage": "Скинути до цього моменту",
+  "ui.message.copyResponse": "Копіювати відповідь",
+  "ui.message.copied": "Скопійовано",
+  "ui.message.duration.seconds": "{{count}}с",
+  "ui.message.duration.minutesSeconds": "{{minutes}}хв {{seconds}}с",
+  "ui.message.interrupted": "Перервано",
+  "ui.message.queued": "У черзі",
+  "ui.message.attachment.alt": "вкладення",
+
+  "ui.patch.action.deleted": "Видалено",
+  "ui.patch.action.created": "Створено",
+  "ui.patch.action.moved": "Переміщено",
+  "ui.patch.action.patched": "Пропатчено",
+
+  "ui.question.subtitle.answered": "{{count}} відповідей",
+  "ui.question.answer.none": "(немає відповіді)",
+  "ui.question.review.notAnswered": "(не відповіли)",
+  "ui.question.multiHint": "Виберіть усі відповідні варіанти",
+  "ui.question.singleHint": "Виберіть одну відповідь",
+  "ui.question.custom.placeholder": "Введіть свою відповідь...",
+}

+ 3 - 0
packages/web/src/i18n/locales.ts

@@ -14,6 +14,7 @@ export const docsLocale = [
   "ru",
   "th",
   "tr",
+  "uk",
   "zh-cn",
   "zh-tw",
 ] as const
@@ -46,6 +47,7 @@ export const localeAlias = {
   ru: "ru",
   th: "th",
   tr: "tr",
+  uk: "uk",
   zh: "zh-cn",
   "zh-cn": "zh-cn",
   zht: "zh-tw",
@@ -63,6 +65,7 @@ const starts = [
   ["ja", "ja"],
   ["pl", "pl"],
   ["ru", "ru"],
+  ["uk", "uk"],
   ["ar", "ar"],
   ["th", "th"],
   ["tr", "tr"],

BIN
screenshot-uk.png