diff --git a/packages/app/src/context/language.tsx b/packages/app/src/context/language.tsx index 51dc09cd7d9f..533b805053f1 100644 --- a/packages/app/src/context/language.tsx +++ b/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 = { ja: "ja", pl: "pl", ru: "ru", + uk: "uk", ar: "ar", no: "nb-NO", br: "pt-BR", @@ -85,6 +88,7 @@ const LABEL_KEY: Record = { 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, () => Promise> = { 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", diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts index 6bb9d3fc447d..2f82d0a78d3a 100644 --- a/packages/app/src/i18n/en.ts +++ b/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", diff --git a/packages/app/src/i18n/parity.test.ts b/packages/app/src/i18n/parity.test.ts index c06a55ab171d..8ad1beb56b0c 100644 --- a/packages/app/src/i18n/parity.test.ts +++ b/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", () => { diff --git a/packages/app/src/i18n/uk.ts b/packages/app/src/i18n/uk.ts new file mode 100644 index 000000000000..4ee63748929a --- /dev/null +++ b/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": "Це скине робочу область, щоб вона відповідала гілці за замовчуванням.", +} diff --git a/packages/console/app/src/i18n/index.ts b/packages/console/app/src/i18n/index.ts index a49fbe375880..a855ccfa3efe 100644 --- a/packages/console/app/src/i18n/index.ts +++ b/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 } diff --git a/packages/console/app/src/i18n/uk.ts b/packages/console/app/src/i18n/uk.ts new file mode 100644 index 000000000000..442acb9a6b7b --- /dev/null +++ b/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": + "З понад {{stars}} зірками на GitHub, {{contributors}} учасниками та понад {{commits}} комітами, OpenCode використовують понад {{monthlyUsers}} розробників щомісяця.", + "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", +} diff --git a/packages/console/app/src/lib/language.ts b/packages/console/app/src/lib/language.ts index 5e80179e4774..a196f663db4c 100644 --- a/packages/console/app/src/lib/language.ts +++ b/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 @@ -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" diff --git a/packages/desktop/src/renderer/i18n/index.ts b/packages/desktop/src/renderer/i18n/index.ts index be87f94f9159..a88fed708027 100644 --- a/packages/desktop/src/renderer/i18n/index.ts +++ b/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) } diff --git a/packages/desktop/src/renderer/i18n/uk.ts b/packages/desktop/src/renderer/i18n/uk.ts new file mode 100644 index 000000000000..f9a6212b228b --- /dev/null +++ b/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}}", +} diff --git a/packages/ui/src/i18n/uk.ts b/packages/ui/src/i18n/uk.ts new file mode 100644 index 000000000000..8bfb3e4404dc --- /dev/null +++ b/packages/ui/src/i18n/uk.ts @@ -0,0 +1,167 @@ +export const dict: Record = { + "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": "Введіть свою відповідь...", +} diff --git a/packages/web/src/i18n/locales.ts b/packages/web/src/i18n/locales.ts index 67e36dfe1489..d1b3e74d1f07 100644 --- a/packages/web/src/i18n/locales.ts +++ b/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"], diff --git a/screenshot-uk.png b/screenshot-uk.png new file mode 100644 index 000000000000..b7c7b4573e49 Binary files /dev/null and b/screenshot-uk.png differ