From 77429f59823c8c6df9cfee95d4c663043b017f46 Mon Sep 17 00:00:00 2001 From: Luke Parker <10430890+Hona@users.noreply.github.com> Date: Wed, 8 Jul 2026 14:57:28 +1000 Subject: [PATCH] feat(app): sync product translations (#35856) --- package.json | 1 + packages/app/src/i18n/ar.ts | 150 ++++- packages/app/src/i18n/br.ts | 155 +++++- packages/app/src/i18n/bs.ts | 153 ++++- packages/app/src/i18n/da.ts | 151 ++++- packages/app/src/i18n/de.ts | 154 +++++- packages/app/src/i18n/es.ts | 154 +++++- packages/app/src/i18n/fr.ts | 155 +++++- packages/app/src/i18n/ja.ts | 154 +++++- packages/app/src/i18n/ko.ts | 155 +++++- packages/app/src/i18n/no.ts | 167 +++++- packages/app/src/i18n/parity.test.ts | 135 ++++- packages/app/src/i18n/pl.ts | 163 +++++- packages/app/src/i18n/ru.ts | 153 ++++- packages/app/src/i18n/th.ts | 161 +++++- packages/app/src/i18n/tr.ts | 160 +++++- packages/app/src/i18n/uk.ts | 122 ++++ packages/app/src/i18n/zh.ts | 134 ++++- packages/app/src/i18n/zht.ts | 146 ++++- .../session/timeline/message-timeline.tsx | 6 +- .../src/components/session-turn.tsx | 6 +- packages/ui/src/i18n/ar.ts | 24 + packages/ui/src/i18n/br.ts | 24 + packages/ui/src/i18n/bs.ts | 24 + packages/ui/src/i18n/da.ts | 24 + packages/ui/src/i18n/de.ts | 25 + packages/ui/src/i18n/en.ts | 3 +- packages/ui/src/i18n/es.ts | 24 + packages/ui/src/i18n/fr.ts | 24 + packages/ui/src/i18n/ja.ts | 28 +- packages/ui/src/i18n/ko.ts | 25 + packages/ui/src/i18n/no.ts | 25 + packages/ui/src/i18n/pl.ts | 24 + packages/ui/src/i18n/ru.ts | 24 + packages/ui/src/i18n/th.ts | 24 + packages/ui/src/i18n/tr.ts | 24 + packages/ui/src/i18n/uk.ts | 32 +- packages/ui/src/i18n/zh.ts | 24 + packages/ui/src/i18n/zht.ts | 24 + script/translate-app.md | 21 + script/translate-app.test.ts | 168 ++++++ script/translate-app.ts | 523 ++++++++++++++++++ 42 files changed, 3790 insertions(+), 83 deletions(-) create mode 100644 script/translate-app.md create mode 100644 script/translate-app.test.ts create mode 100644 script/translate-app.ts diff --git a/package.json b/package.json index e5526b22ff..e65499f878 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "prepare": "husky", "random": "echo 'Random script'", "sso": "aws sso login --sso-session=opencode --no-browser", + "translate:app": "bun run script/translate-app.ts", "test": "echo 'do not run tests from root' && exit 1" }, "workspaces": { diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts index a5174a5900..c60920d107 100644 --- a/packages/app/src/i18n/ar.ts +++ b/packages/app/src/i18n/ar.ts @@ -21,6 +21,9 @@ export const dict = { "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": "فتح الإعدادات", @@ -39,6 +42,7 @@ export const dict = { "command.session.new": "جلسة جديدة", "command.file.open": "فتح ملف", "command.tab.close": "إغلاق علامة التبويب", + "command.tab.reopenClosed": "إعادة فتح علامة التبويب المغلقة", "command.context.addSelection": "إضافة التحديد إلى السياق", "command.context.addSelection.description": "إضافة الأسطر المحددة من الملف الحالي", "command.input.focus": "التركيز على حقل الإدخال", @@ -193,6 +197,11 @@ export const dict = { "model.input.video": "فيديو", "model.input.pdf": "pdf", "model.tooltip.allows": "يسمح: {{inputs}}", + "model.tooltip.context.label": "السياق", + "model.tooltip.inputs": "المدخلات", + "model.tooltip.model": "النموذج", + "model.tooltip.provider": "الموفر", + "model.tooltip.reasoning": "الاستنتاج", "model.tooltip.reasoning.allowed": "يسمح بالاستنتاج", "model.tooltip.reasoning.none": "بدون استنتاج", "model.tooltip.context": "حد السياق {{limit}}", @@ -202,6 +211,7 @@ export const dict = { "common.loading": "جارٍ التحميل", "common.loading.ellipsis": "...", "common.cancel": "إلغاء", + "common.clear": "مسح", "common.connect": "اتصال", "common.disconnect": "قطع الاتصال", "common.continue": "إرسال", @@ -218,6 +228,8 @@ export const dict = { "prompt.mode.shell": "Shell", "prompt.mode.normal": "Prompt", "prompt.mode.shell.exit": "esc للخروج", + "session.child.promptDisabled": "لا يمكن إرسال موجّهات إلى جلسات الوكلاء الفرعيين.", + "session.child.backToParent": "العودة إلى الجلسة الرئيسية.", "prompt.example.1": "إصلاح TODO في قاعدة التعليمات البرمجية", "prompt.example.2": "ما هو المكدس التقني لهذا المشروع؟", "prompt.example.3": "إصلاح الاختبارات المعطلة", @@ -314,6 +326,74 @@ export const dict = { "dialog.server.menu.delete": "حذف", "dialog.server.current": "الخادم الحالي", "dialog.server.status.default": "افتراضي", + "wsl.server.add": "إضافة خادم WSL", + "wsl.server.addShort": "إضافة WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "خادم WSL", + "wsl.server.retryStart": "إعادة محاولة التشغيل", + "wsl.server.updating": "جارٍ التحديث...", + "wsl.onboarding.step.distro": "اختر توزيعة", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "جارٍ التحقق من WSL...", + "wsl.onboarding.restartRequired": "يحتاج Windows إلى إعادة التشغيل لإكمال تثبيت WSL.", + "wsl.onboarding.ready": "WSL جاهز.", + "wsl.onboarding.required": "يلزم WSL للمتابعة.", + "wsl.onboarding.checkingDistros": "جارٍ التحقق من التوزيعات...", + "wsl.onboarding.installingDistro": "جارٍ تثبيت {{distro}}...", + "wsl.onboarding.checkingDistro": "جارٍ التحقق من {{distro}}...", + "wsl.onboarding.listingDistros": "جارٍ سرد التوزيعات...", + "wsl.onboarding.distroReady": "{{distro}} جاهزة.", + "wsl.onboarding.distroNotInstalled": "لم يتم تثبيت {{distro}} بعد.", + "wsl.onboarding.openDistroOnce": "افتح {{distro}} مرة واحدة لإكمال الإعداد.", + "wsl.onboarding.finishingDistro": "جارٍ إكمال إعداد {{distro}}.", + "wsl.onboarding.pickDistro": "اختر توزيعة أو ثبّت واحدة أدناه.", + "wsl.onboarding.checkingOpencode": "جارٍ التحقق من OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "جارٍ التحقق من OpenCode في {{distro}}...", + "wsl.onboarding.updatingOpencode": "جارٍ تحديث OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "جارٍ تحديث OpenCode في {{distro}}...", + "wsl.onboarding.updateOpencodeIn": "حدّث OpenCode في {{distro}}.", + "wsl.onboarding.updateOpencode": "تحديث OpenCode", + "wsl.onboarding.opencodeReadyIn": "OpenCode جاهز في {{distro}}.", + "wsl.onboarding.opencodeReady": "OpenCode جاهز.", + "wsl.onboarding.installOpencodeIn": "ثبّت OpenCode في {{distro}}.", + "wsl.onboarding.installOpencode": "تثبيت OpenCode", + "wsl.onboarding.chooseDistroFirst": "اختر توزيعة أولاً.", + "wsl.onboarding.loadFailed": "فشل تحميل حالة WSL.", + "wsl.onboarding.loading": "جارٍ التحميل...", + "wsl.onboarding.installedDistros": "التوزيعات المثبتة", + "wsl.onboarding.checkAgain": "تحقق مجددًا", + "wsl.onboarding.distroStatus.ready": "جاهزة", + "wsl.onboarding.distroStatus.checking": "جارٍ التحقق...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode غير مثبت", + "wsl.onboarding.distroStatus.missingTools": "bash و curl مفقودان", + "wsl.onboarding.distroStatus.unsupported": "غير مدعومة · استخدم WSL 2", + "wsl.onboarding.needAnotherDistro": "هل تحتاج إلى توزيعة أخرى؟", + "wsl.onboarding.needAnotherDistroHint": "ثبّت توزيعة Linux من كتالوج WSL", + "wsl.onboarding.wslNotInstalled.title": "WSL غير مثبت", + "wsl.onboarding.wslNotInstalled.description": + "يلزم WSL (نظام Windows الفرعي لـ Linux) قبل أن يتمكن OpenCode من إضافة خادم WSL", + "wsl.onboarding.wslUnavailable.title": "WSL غير متاح", + "wsl.onboarding.wslUnavailable.description": "تعذر على OpenCode التحقق من WSL على هذا الجهاز.", + "wsl.onboarding.installWsl": "تثبيت WSL", + "wsl.onboarding.windowsRestartRequired": "أعد تشغيل Windows لإكمال تثبيت WSL، ثم أعد فتح OpenCode.", + "wsl.onboarding.next": "التالي", + "wsl.onboarding.refresh": "تحديث", + "wsl.onboarding.allDistrosAdded": "تمت إضافة جميع التوزيعات المثبتة بالفعل.", + "wsl.onboarding.noDistros": "لم يتم اكتشاف أي توزيعات بعد.", + "wsl.onboarding.install": "تثبيت", + "wsl.onboarding.installing": "جارٍ التثبيت...", + "wsl.onboarding.installDistro": "تثبيت توزيعة", + "wsl.onboarding.searchDistros": "البحث عن توزيعات", + "wsl.onboarding.wsl2Required": "يلزم WSL 2.", + "wsl.onboarding.toolsRequired": "تحتاج هذه التوزيعة إلى bash و curl.", + "wsl.onboarding.openTerminal": "فتح المحطة الطرفية", + "wsl.onboarding.path": "المسار: {{path}}", + "wsl.onboarding.notFound": "غير موجود", + "wsl.onboarding.version": "الإصدار: {{version}}", + "wsl.onboarding.unknown": "غير معروف", + "wsl.onboarding.desktopVersion": "سطح المكتب {{version}}", + "wsl.onboarding.versionMismatch": "لا يتطابق الإصدار المثبت مع إصدار تطبيق سطح المكتب.", + "wsl.onboarding.adding": "جارٍ الإضافة...", "dialog.project.edit.title": "تحرير المشروع", "dialog.project.edit.name": "الاسم", "dialog.project.edit.icon": "أيقونة", @@ -370,6 +450,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", "toast.language.title": "لغة", @@ -406,10 +487,12 @@ export const dict = { "toast.update.action.notYet": "ليس الآن", "error.page.title": "حدث خطأ ما", "error.page.description": "حدث خطأ أثناء تحميل التطبيق.", + "error.page.description.localServerStartup": "حدث خطأ أثناء بدء تشغيل الخادم المحلي.", "error.page.details.label": "تفاصيل الخطأ", "error.page.action.restart": "إعادة تشغيل", "error.page.action.report": "الإبلاغ عن الخطأ", "error.page.action.reported": "تم الإبلاغ عن الخطأ", + "error.page.action.exportLogs": "تصدير السجلات", "error.page.action.checking": "جارٍ التحقق...", "error.page.action.checkUpdates": "التحقق من وجود تحديثات", "error.page.action.updateTo": "تحديث إلى {{version}}", @@ -450,16 +533,38 @@ export const dict = { "home.recentProjects": "المشاريع الحديثة", "home.empty.title": "لا توجد مشاريع حديثة", "home.empty.description": "ابدأ بفتح مشروع محلي", + "home.title": "الرئيسية", + "home.projects": "المشاريع", + "home.project.add": "إضافة مشروع", + "home.recentlyClosed": "المغلقة مؤخرًا", + "home.server.collapse": "طي مشاريع الخادم", + "home.server.expand": "توسيع مشاريع الخادم", + "home.sessions.search.placeholder": "البحث في الجلسات", + "home.sessions.search.placeholder.scoped": "البحث في جلسات {{scope}}", + "home.sessions.search.sessions": "الجلسات", + "home.sessions.search.noResults": "لم يتم العثور على جلسات لـ {{query}}", + "home.sessions.empty": "لا يوجد شيء هنا بعد", + "home.sessions.empty.description": "أنشئ جلسة للبدء", + "home.sessions.group.today": "اليوم", + "home.sessions.group.yesterday": "أمس", + "home.sessions.group.older": "الأقدم", "session.tab.session": "جلسة", "session.tab.review": "مراجعة", "session.tab.context": "سياق", + "session.tab.unknown": "جلسة غير معروفة", "session.panel.reviewAndFiles": "المراجعة والملفات", + "session.error.notFound": "لا يمكن العثور على هذه الجلسة", + "session.error.notFound.description": "يشير هذا التبويب إلى جلسة لم تعد موجودة على هذا الخادم.", + "session.error.notFound.closeTab": "إغلاق علامة التبويب", + "session.error.serverConnection": "تعذر الاتصال بهذا الخادم", "session.review.filesChanged": "تم تغيير {{count}} ملفات", "session.review.change.one": "تغيير", "session.review.change.other": "تغييرات", "session.review.loadingChanges": "جارٍ تحميل التغييرات...", "session.review.empty": "لا توجد تغييرات في هذه الجلسة بعد", "session.review.noChanges": "لا توجد تغييرات", + "session.review.noUncommittedChanges": "لا توجد تغييرات غير مُودَعة بعد", + "session.review.noBranchChanges": "لا توجد تغييرات في الفرع بعد", "session.review.noVcs": "لم يتم اكتشاف نظام التحكم في الإصدار Git، لن يتم عرض التغييرات", "session.review.noSnapshot": "تم تعطيل تتبع اللقطات في التكوين، لذا فإن تغييرات الجلسة غير متوفرة", "session.files.selectToOpen": "اختر ملفًا لفتحه", @@ -475,6 +580,10 @@ export const dict = { "session.todo.title": "المهام", "session.todo.collapse": "طي", "session.todo.expand": "توسيع", + "session.question.minimize": "تصغير السؤال", + "session.question.restore": "استعادة السؤال", + "session.question.pending.one": "{{count}} سؤال معلق", + "session.question.pending.other": "الأسئلة المعلقة: {{count}}", "session.followupDock.summary.one": "{{count}} رسالة في الانتظار", "session.followupDock.summary.other": "{{count}} رسائل في الانتظار", "session.followupDock.sendNow": "إرسال الآن", @@ -487,9 +596,16 @@ export const dict = { "session.revertDock.expand": "توسيع الرسائل التي تم التراجع عنها", "session.revertDock.restore": "استعادة الرسالة", "session.new.title": "ابنِ أي شيء", + "session.new.project.new": "مشروع جديد", + "session.new.project.search": "البحث عن المشاريع", + "session.new.project.add": "إضافة مشروع", "session.new.worktree.main": "الفرع الرئيسي", "session.new.worktree.mainWithBranch": "الفرع الرئيسي ({{branch}})", "session.new.worktree.create": "إنشاء شجرة عمل جديدة", + "session.new.workspace.runIn": "تشغيل الجلسة في", + "session.new.workspace.triggerLocal": "محلي", + "session.new.workspace.local": "المستودع المحلي", + "session.new.workspace.existing": "مساحة عمل…", "session.new.lastModified": "آخر تعديل", "session.header.search.placeholder": "بحث {{project}}", "session.header.searchFiles": "بحث عن الملفات", @@ -550,6 +666,8 @@ export const dict = { "sidebar.project.recentSessions": "الجلسات الحديثة", "sidebar.project.viewAllSessions": "عرض جميع الجلسات", "sidebar.project.clearNotifications": "مسح الإشعارات", + "sidebar.empty.title": "لا توجد مشاريع مفتوحة", + "sidebar.empty.description": "افتح مشروعًا للبدء", "app.name.desktop": "OpenCode Desktop", "settings.section.desktop": "سطح المكتب", "settings.section.server": "الخادم", @@ -559,6 +677,7 @@ export const dict = { "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": "المؤثرات الصوتية", @@ -566,6 +685,11 @@ export const dict = { "settings.general.section.display": "شاشة العرض", "settings.general.row.language.title": "اللغة", "settings.general.row.language.description": "تغيير لغة العرض لـ OpenCode", + "settings.general.row.shell.title": "Shell المحطة الطرفية", + "settings.general.row.shell.description": + "اختر shell المستخدم في المحطة الطرفية. تُستخدم واجهات shell المتوافقة أيضًا في استدعاءات أدوات الوكيل.", + "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": "مخطط الألوان", @@ -574,14 +698,29 @@ export const dict = { "settings.general.row.theme.description": "تخصيص سمة OpenCode.", "settings.general.row.font.title": "خط الكود", "settings.general.row.font.description": "خصّص الخط المستخدم في كتل التعليمات البرمجية", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "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.mobileTitlebarBottom.title": "التنقل السفلي", + "settings.general.row.mobileTitlebarBottom.description": + "وضع شريط العنوان وعلامات تبويب الجلسات أسفل الشاشة على الأجهزة المحمولة", + "settings.general.row.showCustomAgents.title": "الوكلاء المخصصون", + "settings.general.row.showCustomAgents.description": "إظهار محدد الوكلاء في محرر الرسائل", "settings.general.row.reasoningSummaries.title": "إظهار ملخصات الاستنتاج", "settings.general.row.reasoningSummaries.description": "عرض ملخصات استنتاج النموذج في الشريط الزمني", "settings.general.row.shellToolPartsExpanded.title": "توسيع أجزاء أداة shell", @@ -590,6 +729,11 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "توسيع أجزاء أداة edit", "settings.general.row.editToolPartsExpanded.description": "إظهار أجزاء أدوات edit و write و patch موسعة بشكل افتراضي في الشريط الزمني", + "settings.general.row.newLayoutDesigns.title": "التخطيط والتصاميم الجديدة", + "settings.general.row.newLayoutDesigns.description": + "تمكين التخطيط والصفحة الرئيسية ومحرر الرسائل وواجهة الجلسة المعاد تصميمها", + "settings.general.row.pinchZoom.title": "التكبير بإيماءة القرص", + "settings.general.row.pinchZoom.description": "السماح بإيماءة القرص على لوحة اللمس وإيماءة Ctrl-scroll للتكبير", "settings.general.row.wayland.title": "استخدام Wayland الأصلي", "settings.general.row.wayland.description": "تعطيل التراجع إلى X11 على Wayland. يتطلب إعادة التشغيل.", "settings.general.row.wayland.tooltip": @@ -602,6 +746,8 @@ export const dict = { "settings.updates.row.check.description": "التحقق يدويًا من التحديثات وتثبيتها إذا كانت متاحة", "settings.updates.action.checkNow": "تحقق الآن", "settings.updates.action.checking": "جارٍ التحقق...", + "settings.updates.action.downloading": "جارٍ التنزيل...", + "settings.updates.action.installing": "جارٍ التثبيت...", "settings.updates.toast.latest.title": "أنت على آخر إصدار", "settings.updates.toast.latest.description": "أنت تستخدم أحدث إصدار من OpenCode.", "sound.option.none": "بلا", diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts index 2e53bb1af0..12911744e2 100644 --- a/packages/app/src/i18n/br.ts +++ b/packages/app/src/i18n/br.ts @@ -21,6 +21,9 @@ export const dict = { "theme.scheme.dark": "Escuro", "command.sidebar.toggle": "Alternar barra lateral", "command.project.open": "Abrir projeto", + "command.project.previous": "Projeto anterior", + "command.project.next": "Próximo projeto", + "command.project.index": "Alternar para o projeto {{index}}", "command.provider.connect": "Conectar provedor", "command.server.switch": "Trocar servidor", "command.settings.open": "Abrir configurações", @@ -39,6 +42,7 @@ export const dict = { "command.session.new": "Nova sessão", "command.file.open": "Abrir arquivo", "command.tab.close": "Fechar aba", + "command.tab.reopenClosed": "Reabrir aba fechada", "command.context.addSelection": "Adicionar seleção ao contexto", "command.context.addSelection.description": "Adicionar as linhas selecionadas do arquivo atual", "command.input.focus": "Focar entrada", @@ -193,6 +197,11 @@ export const dict = { "model.input.video": "vídeo", "model.input.pdf": "pdf", "model.tooltip.allows": "Permite: {{inputs}}", + "model.tooltip.context.label": "Contexto", + "model.tooltip.inputs": "Entradas", + "model.tooltip.model": "Modelo", + "model.tooltip.provider": "Provedor", + "model.tooltip.reasoning": "Raciocínio", "model.tooltip.reasoning.allowed": "Permite raciocínio", "model.tooltip.reasoning.none": "Sem raciocínio", "model.tooltip.context": "Limite de contexto {{limit}}", @@ -202,6 +211,7 @@ export const dict = { "common.loading": "Carregando", "common.loading.ellipsis": "...", "common.cancel": "Cancelar", + "common.clear": "Limpar", "common.connect": "Conectar", "common.disconnect": "Desconectar", "common.continue": "Enviar", @@ -218,6 +228,8 @@ export const dict = { "prompt.mode.shell": "Shell", "prompt.mode.normal": "Prompt", "prompt.mode.shell.exit": "esc para sair", + "session.child.promptDisabled": "Não é possível enviar prompts em sessões de subagentes.", + "session.child.backToParent": "Voltar à sessão principal.", "prompt.example.1": "Corrigir um TODO no código", "prompt.example.2": "Qual é a stack tecnológica deste projeto?", "prompt.example.3": "Corrigir testes quebrados", @@ -314,6 +326,75 @@ export const dict = { "dialog.server.menu.delete": "Excluir", "dialog.server.current": "Servidor atual", "dialog.server.status.default": "Padrão", + "wsl.server.add": "Adicionar servidor WSL", + "wsl.server.addShort": "Adicionar WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "Servidor WSL", + "wsl.server.retryStart": "Tentar iniciar novamente", + "wsl.server.updating": "Atualizando...", + "wsl.onboarding.step.distro": "Escolher distribuição", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "Verificando o WSL...", + "wsl.onboarding.restartRequired": "O Windows precisa ser reiniciado para concluir a instalação do WSL.", + "wsl.onboarding.ready": "O WSL está pronto.", + "wsl.onboarding.required": "O WSL é necessário para continuar.", + "wsl.onboarding.checkingDistros": "Verificando distribuições...", + "wsl.onboarding.installingDistro": "Instalando {{distro}}...", + "wsl.onboarding.checkingDistro": "Verificando {{distro}}...", + "wsl.onboarding.listingDistros": "Listando distribuições...", + "wsl.onboarding.distroReady": "{{distro}} está pronta.", + "wsl.onboarding.distroNotInstalled": "{{distro}} ainda não está instalada.", + "wsl.onboarding.openDistroOnce": "Abra {{distro}} uma vez para concluir a configuração.", + "wsl.onboarding.finishingDistro": "Concluindo a configuração de {{distro}}.", + "wsl.onboarding.pickDistro": "Escolha uma distribuição ou instale uma abaixo.", + "wsl.onboarding.checkingOpencode": "Verificando o OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "Verificando o OpenCode em {{distro}}...", + "wsl.onboarding.updatingOpencode": "Atualizando o OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "Atualizando o OpenCode em {{distro}}...", + "wsl.onboarding.updateOpencodeIn": "Atualize o OpenCode em {{distro}}.", + "wsl.onboarding.updateOpencode": "Atualizar o OpenCode", + "wsl.onboarding.opencodeReadyIn": "O OpenCode está pronto em {{distro}}.", + "wsl.onboarding.opencodeReady": "O OpenCode está pronto.", + "wsl.onboarding.installOpencodeIn": "Instale o OpenCode em {{distro}}.", + "wsl.onboarding.installOpencode": "Instalar o OpenCode", + "wsl.onboarding.chooseDistroFirst": "Escolha primeiro uma distribuição.", + "wsl.onboarding.loadFailed": "Falha ao carregar o estado do WSL.", + "wsl.onboarding.loading": "Carregando...", + "wsl.onboarding.installedDistros": "Distribuições instaladas", + "wsl.onboarding.checkAgain": "Verificar novamente", + "wsl.onboarding.distroStatus.ready": "Pronta", + "wsl.onboarding.distroStatus.checking": "Verificando...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode não instalado", + "wsl.onboarding.distroStatus.missingTools": "bash e curl ausentes", + "wsl.onboarding.distroStatus.unsupported": "Sem suporte · Use o WSL 2", + "wsl.onboarding.needAnotherDistro": "Precisa de outra distribuição?", + "wsl.onboarding.needAnotherDistroHint": "Instale uma distribuição Linux pelo catálogo do WSL", + "wsl.onboarding.wslNotInstalled.title": "WSL não instalado", + "wsl.onboarding.wslNotInstalled.description": + "O WSL (Windows Subsystem for Linux) é necessário para que o OpenCode possa adicionar um servidor WSL", + "wsl.onboarding.wslUnavailable.title": "WSL indisponível", + "wsl.onboarding.wslUnavailable.description": "O OpenCode não conseguiu verificar o WSL neste computador.", + "wsl.onboarding.installWsl": "Instalar o WSL", + "wsl.onboarding.windowsRestartRequired": + "Reinicie o Windows para concluir a instalação do WSL e abra o OpenCode novamente.", + "wsl.onboarding.next": "Próximo", + "wsl.onboarding.refresh": "Atualizar", + "wsl.onboarding.allDistrosAdded": "Todas as distribuições instaladas já foram adicionadas.", + "wsl.onboarding.noDistros": "Nenhuma distribuição detectada ainda.", + "wsl.onboarding.install": "Instalar", + "wsl.onboarding.installing": "Instalando...", + "wsl.onboarding.installDistro": "Instalar distribuição", + "wsl.onboarding.searchDistros": "Buscar distribuições", + "wsl.onboarding.wsl2Required": "O WSL 2 é necessário.", + "wsl.onboarding.toolsRequired": "Esta distribuição precisa do bash e do curl.", + "wsl.onboarding.openTerminal": "Abrir terminal", + "wsl.onboarding.path": "Caminho: {{path}}", + "wsl.onboarding.notFound": "não encontrado", + "wsl.onboarding.version": "Versão: {{version}}", + "wsl.onboarding.unknown": "desconhecido", + "wsl.onboarding.desktopVersion": "desktop {{version}}", + "wsl.onboarding.versionMismatch": "A versão instalada não corresponde à versão do aplicativo para desktop.", + "wsl.onboarding.adding": "Adicionando...", "dialog.project.edit.title": "Editar projeto", "dialog.project.edit.name": "Nome", "dialog.project.edit.icon": "Ícone", @@ -371,6 +452,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", "toast.language.title": "Idioma", @@ -407,10 +489,12 @@ export const dict = { "toast.update.action.notYet": "Agora não", "error.page.title": "Algo deu errado", "error.page.description": "Ocorreu um erro ao carregar a aplicação.", + "error.page.description.localServerStartup": "Ocorreu um erro ao iniciar o servidor local.", "error.page.details.label": "Detalhes do Erro", "error.page.action.restart": "Reiniciar", "error.page.action.report": "Reportar erro", "error.page.action.reported": "Erro reportado", + "error.page.action.exportLogs": "Exportar logs", "error.page.action.checking": "Verificando...", "error.page.action.checkUpdates": "Verificar atualizações", "error.page.action.updateTo": "Atualizar para {{version}}", @@ -453,10 +537,30 @@ export const dict = { "home.recentProjects": "Projetos recentes", "home.empty.title": "Nenhum projeto recente", "home.empty.description": "Comece abrindo um projeto local", + "home.title": "Início", + "home.projects": "Projetos", + "home.project.add": "Adicionar projeto", + "home.recentlyClosed": "Projetos fechados recentemente", + "home.server.collapse": "Recolher projetos do servidor", + "home.server.expand": "Expandir projetos do servidor", + "home.sessions.search.placeholder": "Buscar sessões", + "home.sessions.search.placeholder.scoped": "Buscar sessões em {{scope}}", + "home.sessions.search.sessions": "Sessões", + "home.sessions.search.noResults": "Nenhuma sessão encontrada para {{query}}", + "home.sessions.empty": "Nada por aqui ainda", + "home.sessions.empty.description": "Crie uma sessão para começar", + "home.sessions.group.today": "Hoje", + "home.sessions.group.yesterday": "Ontem", + "home.sessions.group.older": "Mais antigas", "session.tab.session": "Sessão", "session.tab.review": "Revisão", "session.tab.context": "Contexto", + "session.tab.unknown": "Sessão desconhecida", "session.panel.reviewAndFiles": "Revisão e arquivos", + "session.error.notFound": "Esta sessão não foi encontrada", + "session.error.notFound.description": "Esta aba aponta para uma sessão que não existe mais neste servidor.", + "session.error.notFound.closeTab": "Fechar aba", + "session.error.serverConnection": "Não é possível conectar a este servidor", "session.review.filesChanged": "{{count}} Arquivos Alterados", "session.review.change.one": "Alteração", "session.review.change.other": "Alterações", @@ -466,6 +570,8 @@ export const dict = { "session.review.noSnapshot": "O rastreamento de snapshot está desabilitado na configuração, então as alterações da sessão estão indisponíveis", "session.review.noChanges": "Sem alterações", + "session.review.noUncommittedChanges": "Ainda não há alterações sem commit", + "session.review.noBranchChanges": "Ainda não há alterações na branch", "session.files.selectToOpen": "Selecione um arquivo para abrir", "session.files.all": "Todos os arquivos", "session.files.empty": "Nenhum arquivo", @@ -479,6 +585,10 @@ export const dict = { "session.todo.title": "Tarefas", "session.todo.collapse": "Recolher", "session.todo.expand": "Expandir", + "session.question.minimize": "Minimizar pergunta", + "session.question.restore": "Restaurar pergunta", + "session.question.pending.one": "{{count}} pergunta pendente", + "session.question.pending.other": "{{count}} perguntas pendentes", "session.followupDock.summary.one": "{{count}} mensagem na fila", "session.followupDock.summary.other": "{{count}} mensagens na fila", "session.followupDock.sendNow": "Enviar agora", @@ -491,9 +601,16 @@ export const dict = { "session.revertDock.expand": "Expandir mensagens revertidas", "session.revertDock.restore": "Restaurar mensagem", "session.new.title": "Crie qualquer coisa", + "session.new.project.new": "Novo projeto", + "session.new.project.search": "Buscar projetos", + "session.new.project.add": "Adicionar projeto", "session.new.worktree.main": "Branch principal", "session.new.worktree.mainWithBranch": "Branch principal ({{branch}})", "session.new.worktree.create": "Criar novo worktree", + "session.new.workspace.runIn": "Executar sessão em", + "session.new.workspace.triggerLocal": "Local", + "session.new.workspace.local": "Repositório local", + "session.new.workspace.existing": "Espaço de trabalho…", "session.new.lastModified": "Última modificação", "session.header.search.placeholder": "Buscar {{project}}", "session.header.searchFiles": "Buscar arquivos", @@ -557,15 +674,18 @@ export const dict = { "sidebar.project.recentSessions": "Sessões recentes", "sidebar.project.viewAllSessions": "Ver todas as sessões", "sidebar.project.clearNotifications": "Limpar notificações", + "sidebar.empty.title": "Nenhum projeto aberto", + "sidebar.empty.description": "Abra um projeto para começar", "app.name.desktop": "OpenCode Desktop", "settings.section.desktop": "Desktop", "settings.section.server": "Servidor", "settings.tab.general": "Geral", "settings.tab.shortcuts": "Atalhos", "settings.desktop.section.wsl": "WSL", - "settings.desktop.wsl.title": "WSL integration", + "settings.desktop.wsl.title": "Integração com WSL", "settings.desktop.wsl.description": "Executar o servidor OpenCode dentro do WSL no Windows.", "settings.general.section.appearance": "Aparência", + "settings.general.section.advanced": "Avançado", "settings.general.section.notifications": "Notificações do sistema", "settings.general.section.updates": "Atualizações", "settings.general.section.sounds": "Efeitos sonoros", @@ -573,6 +693,11 @@ export const dict = { "settings.general.section.display": "Tela", "settings.general.row.language.title": "Idioma", "settings.general.row.language.description": "Alterar o idioma de exibição do OpenCode", + "settings.general.row.shell.title": "Shell do terminal", + "settings.general.row.shell.description": + "Escolha o shell usado no terminal. Os shells compatíveis também são usados nas chamadas de ferramentas do agente.", + "settings.general.row.shell.autoDefault": "Automático (Padrão)", + "settings.general.row.shell.terminalOnly": "somente no terminal", "settings.general.row.appearance.title": "Aparência", "settings.general.row.appearance.description": "Personalize como o OpenCode aparece no seu dispositivo", "settings.general.row.colorScheme.title": "Esquema de cores", @@ -581,8 +706,8 @@ export const dict = { "settings.general.row.theme.description": "Personalize como o OpenCode é tematizado.", "settings.general.row.font.title": "Fonte de código", "settings.general.row.font.description": "Personalize a fonte usada em blocos de código", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "Fonte do terminal", + "settings.general.row.terminalFont.description": "Personalize a fonte usada no terminal", "settings.general.row.uiFont.title": "Fonte da interface", "settings.general.row.uiFont.description": "Personalize a fonte usada em toda a interface", "settings.general.row.followup.title": "Comportamento de acompanhamento", @@ -590,6 +715,22 @@ export const dict = { "Escolha se os prompts de acompanhamento orientam imediatamente ou esperam na fila", "settings.general.row.followup.option.queue": "Fila", "settings.general.row.followup.option.steer": "Orientar", + "settings.general.row.showFileTree.title": "Árvore de arquivos", + "settings.general.row.showFileTree.description": "Mostrar o painel da árvore de arquivos nas sessões", + "settings.general.row.showNavigation.title": "Controles de navegação", + "settings.general.row.showNavigation.description": + "Mostrar os botões de voltar e avançar na barra de título do desktop", + "settings.general.row.showSearch.title": "Paleta de comandos", + "settings.general.row.showSearch.description": "Mostrar o botão de busca e paleta de comandos na barra de título", + "settings.general.row.showTerminal.title": "Terminal", + "settings.general.row.showTerminal.description": "Mostrar o botão do terminal na barra de título do desktop", + "settings.general.row.showStatus.title": "Status do servidor", + "settings.general.row.showStatus.description": "Mostrar o botão de status do servidor na barra de título", + "settings.general.row.mobileTitlebarBottom.title": "Navegação inferior", + "settings.general.row.mobileTitlebarBottom.description": + "Posicionar a barra de título e as abas da sessão na parte inferior da tela em dispositivos móveis", + "settings.general.row.showCustomAgents.title": "Agentes personalizados", + "settings.general.row.showCustomAgents.description": "Mostrar o seletor de agentes na área de composição", "settings.general.row.reasoningSummaries.title": "Mostrar resumos de raciocínio", "settings.general.row.reasoningSummaries.description": "Exibir resumos de raciocínio do modelo na linha do tempo", "settings.general.row.shellToolPartsExpanded.title": "Expandir partes da ferramenta shell", @@ -598,6 +739,12 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "Expandir partes da ferramenta de edição", "settings.general.row.editToolPartsExpanded.description": "Mostrar partes das ferramentas de edição, escrita e patch expandidas por padrão na linha do tempo", + "settings.general.row.newLayoutDesigns.title": "Novo layout e design", + "settings.general.row.newLayoutDesigns.description": + "Ativar o layout, a página inicial, a área de composição e a interface de sessão reformulados", + "settings.general.row.pinchZoom.title": "Zoom com gesto de pinça", + "settings.general.row.pinchZoom.description": + "Permitir gestos de pinça no trackpad e de Ctrl+rolagem para aplicar zoom", "settings.general.row.wayland.title": "Usar Wayland nativo", "settings.general.row.wayland.description": "Desabilitar fallback X11 no Wayland. Requer reinicialização.", "settings.general.row.wayland.tooltip": @@ -610,6 +757,8 @@ export const dict = { "settings.updates.row.check.description": "Verificar atualizações manualmente e instalar se houver", "settings.updates.action.checkNow": "Verificar agora", "settings.updates.action.checking": "Verificando...", + "settings.updates.action.downloading": "Baixando...", + "settings.updates.action.installing": "Instalando...", "settings.updates.toast.latest.title": "Você está atualizado", "settings.updates.toast.latest.description": "Você está usando a versão mais recente do OpenCode.", "sound.option.none": "Nenhum", diff --git a/packages/app/src/i18n/bs.ts b/packages/app/src/i18n/bs.ts index c5b9e1a6d8..086ecc1b4c 100644 --- a/packages/app/src/i18n/bs.ts +++ b/packages/app/src/i18n/bs.ts @@ -23,6 +23,9 @@ export const dict = { "command.sidebar.toggle": "Prikaži/sakrij bočnu traku", "command.project.open": "Otvori projekat", + "command.project.previous": "Prethodni projekat", + "command.project.next": "Sljedeći projekat", + "command.project.index": "Prebaci na projekat {{index}}", "command.provider.connect": "Poveži provajdera", "command.server.switch": "Promijeni server", "command.settings.open": "Otvori postavke", @@ -45,6 +48,7 @@ export const dict = { "command.session.new": "Nova sesija", "command.file.open": "Otvori datoteku", "command.tab.close": "Zatvori karticu", + "command.tab.reopenClosed": "Ponovo otvori zatvorenu karticu", "command.context.addSelection": "Dodaj odabir u kontekst", "command.context.addSelection.description": "Dodaj odabrane linije iz trenutne datoteke", "command.input.focus": "Fokusiraj polje za unos", @@ -209,6 +213,11 @@ export const dict = { "model.input.video": "video", "model.input.pdf": "pdf", "model.tooltip.allows": "Podržava: {{inputs}}", + "model.tooltip.context.label": "Kontekst", + "model.tooltip.inputs": "Ulazi", + "model.tooltip.model": "Model", + "model.tooltip.provider": "Provajder", + "model.tooltip.reasoning": "Rasuđivanje", "model.tooltip.reasoning.allowed": "Podržava rasuđivanje", "model.tooltip.reasoning.none": "Bez rasuđivanja", "model.tooltip.context": "Limit konteksta {{limit}}", @@ -219,6 +228,7 @@ export const dict = { "common.loading": "Učitavanje", "common.loading.ellipsis": "...", "common.cancel": "Otkaži", + "common.clear": "Očisti", "common.connect": "Poveži", "common.disconnect": "Prekini vezu", "common.continue": "Pošalji", @@ -236,6 +246,8 @@ export const dict = { "prompt.mode.shell": "Shell", "prompt.mode.normal": "Prompt", "prompt.mode.shell.exit": "esc za izlaz", + "session.child.promptDisabled": "Sesijama podagenta nije moguće slati upite.", + "session.child.backToParent": "Nazad na glavnu sesiju.", "prompt.example.1": "Popravi TODO u bazi koda", "prompt.example.2": "Koji je tehnološki stack ovog projekta?", @@ -342,6 +354,75 @@ export const dict = { "dialog.server.menu.delete": "Izbriši", "dialog.server.current": "Trenutni server", "dialog.server.status.default": "Podrazumijevano", + "wsl.server.add": "Dodaj WSL server", + "wsl.server.addShort": "Dodaj WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "WSL server", + "wsl.server.retryStart": "Ponovi pokretanje", + "wsl.server.updating": "Ažuriranje...", + "wsl.onboarding.step.distro": "Odaberi distribuciju", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "Provjera WSL-a...", + "wsl.onboarding.restartRequired": "Potrebno je ponovo pokrenuti Windows da bi se završila instalacija WSL-a.", + "wsl.onboarding.ready": "WSL je spreman.", + "wsl.onboarding.required": "WSL je potreban za nastavak.", + "wsl.onboarding.checkingDistros": "Provjera distribucija...", + "wsl.onboarding.installingDistro": "Instaliranje {{distro}}...", + "wsl.onboarding.checkingDistro": "Provjera {{distro}}...", + "wsl.onboarding.listingDistros": "Učitavanje liste distribucija...", + "wsl.onboarding.distroReady": "Distribucija {{distro}} je spremna.", + "wsl.onboarding.distroNotInstalled": "Distribucija {{distro}} još nije instalirana.", + "wsl.onboarding.openDistroOnce": "Otvori {{distro}} jednom da završiš postavljanje.", + "wsl.onboarding.finishingDistro": "Završavanje postavljanja za {{distro}}.", + "wsl.onboarding.pickDistro": "Odaberi distribuciju ili instaliraj jednu ispod.", + "wsl.onboarding.checkingOpencode": "Provjera OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "Provjera OpenCode u distribuciji {{distro}}...", + "wsl.onboarding.updatingOpencode": "Ažuriranje OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "Ažuriranje OpenCode u distribuciji {{distro}}...", + "wsl.onboarding.updateOpencodeIn": "Ažuriraj OpenCode u distribuciji {{distro}}.", + "wsl.onboarding.updateOpencode": "Ažuriraj OpenCode", + "wsl.onboarding.opencodeReadyIn": "OpenCode je spreman u distribuciji {{distro}}.", + "wsl.onboarding.opencodeReady": "OpenCode je spreman.", + "wsl.onboarding.installOpencodeIn": "Instaliraj OpenCode u distribuciji {{distro}}.", + "wsl.onboarding.installOpencode": "Instaliraj OpenCode", + "wsl.onboarding.chooseDistroFirst": "Prvo odaberi distribuciju.", + "wsl.onboarding.loadFailed": "Nije uspjelo učitavanje WSL stanja.", + "wsl.onboarding.loading": "Učitavanje...", + "wsl.onboarding.installedDistros": "Instalirane distribucije", + "wsl.onboarding.checkAgain": "Provjeri ponovo", + "wsl.onboarding.distroStatus.ready": "Spremno", + "wsl.onboarding.distroStatus.checking": "Provjera...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode nije instaliran", + "wsl.onboarding.distroStatus.missingTools": "Nedostaju bash i curl", + "wsl.onboarding.distroStatus.unsupported": "Nije podržano · Koristi WSL 2", + "wsl.onboarding.needAnotherDistro": "Treba ti druga distribucija?", + "wsl.onboarding.needAnotherDistroHint": "Instaliraj Linux distribuciju iz WSL kataloga", + "wsl.onboarding.wslNotInstalled.title": "WSL nije instaliran", + "wsl.onboarding.wslNotInstalled.description": + "WSL (Windows Subsystem for Linux) je potreban da bi OpenCode mogao dodati WSL server", + "wsl.onboarding.wslUnavailable.title": "WSL nije dostupan", + "wsl.onboarding.wslUnavailable.description": "OpenCode nije mogao provjeriti WSL na ovom uređaju.", + "wsl.onboarding.installWsl": "Instaliraj WSL", + "wsl.onboarding.windowsRestartRequired": + "Ponovo pokreni Windows da završiš instalaciju WSL-a, zatim ponovo otvori OpenCode.", + "wsl.onboarding.next": "Dalje", + "wsl.onboarding.refresh": "Osvježi", + "wsl.onboarding.allDistrosAdded": "Sve instalirane distribucije su već dodane.", + "wsl.onboarding.noDistros": "Još nema otkrivenih distribucija.", + "wsl.onboarding.install": "Instaliraj", + "wsl.onboarding.installing": "Instaliranje...", + "wsl.onboarding.installDistro": "Instaliraj distribuciju", + "wsl.onboarding.searchDistros": "Pretraži distribucije", + "wsl.onboarding.wsl2Required": "Potreban je WSL 2.", + "wsl.onboarding.toolsRequired": "Ovoj distribuciji su potrebni bash i curl.", + "wsl.onboarding.openTerminal": "Otvori terminal", + "wsl.onboarding.path": "Putanja: {{path}}", + "wsl.onboarding.notFound": "nije pronađeno", + "wsl.onboarding.version": "Verzija: {{version}}", + "wsl.onboarding.unknown": "nepoznato", + "wsl.onboarding.desktopVersion": "desktop {{version}}", + "wsl.onboarding.versionMismatch": "Instalirana verzija ne odgovara verziji desktop aplikacije.", + "wsl.onboarding.adding": "Dodavanje...", "dialog.project.edit.title": "Uredi projekat", "dialog.project.edit.name": "Naziv", @@ -405,6 +486,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", @@ -453,10 +535,12 @@ export const dict = { "error.page.title": "Nešto je pošlo po zlu", "error.page.description": "Došlo je do greške prilikom učitavanja aplikacije.", + "error.page.description.localServerStartup": "Došlo je do greške pri pokretanju lokalnog servera.", "error.page.details.label": "Detalji greške", "error.page.action.restart": "Restartuj", "error.page.action.report": "Prijavi grešku", "error.page.action.reported": "Greška prijavljena", + "error.page.action.exportLogs": "Izvezi logove", "error.page.action.checking": "Provjera...", "error.page.action.checkUpdates": "Provjeri ažuriranja", "error.page.action.updateTo": "Ažuriraj na {{version}}", @@ -504,11 +588,31 @@ export const dict = { "home.recentProjects": "Nedavni projekti", "home.empty.title": "Nema nedavnih projekata", "home.empty.description": "Kreni tako što ćeš otvoriti lokalni projekat", + "home.title": "Početna", + "home.projects": "Projekti", + "home.project.add": "Dodaj projekat", + "home.recentlyClosed": "Nedavno zatvoreni projekti", + "home.server.collapse": "Sažmi projekte servera", + "home.server.expand": "Proširi projekte servera", + "home.sessions.search.placeholder": "Pretraži sesije", + "home.sessions.search.placeholder.scoped": "Pretraži sesije u {{scope}}", + "home.sessions.search.sessions": "Sesije", + "home.sessions.search.noResults": "Nema pronađenih sesija za {{query}}", + "home.sessions.empty": "Ovdje još nema ničega", + "home.sessions.empty.description": "Kreiraj sesiju za početak", + "home.sessions.group.today": "Danas", + "home.sessions.group.yesterday": "Jučer", + "home.sessions.group.older": "Starije", "session.tab.session": "Sesija", "session.tab.review": "Pregled", "session.tab.context": "Kontekst", + "session.tab.unknown": "Nepoznata sesija", "session.panel.reviewAndFiles": "Pregled i datoteke", + "session.error.notFound": "Ova sesija nije pronađena", + "session.error.notFound.description": "Ova kartica upućuje na sesiju koja više ne postoji na ovom serveru.", + "session.error.notFound.closeTab": "Zatvori karticu", + "session.error.serverConnection": "Nije moguće povezati se s ovim serverom", "session.review.filesChanged": "Izmijenjeno {{count}} datoteka", "session.review.change.one": "Izmjena", "session.review.change.other": "Izmjene", @@ -518,6 +622,8 @@ export const dict = { "session.review.noSnapshot": "Praćenje snimaka (snapshot) je onemogućeno u konfiguraciji, pa promjene sesije nisu dostupne", "session.review.noChanges": "Nema izmjena", + "session.review.noUncommittedChanges": "Još nema nepotvrđenih promjena", + "session.review.noBranchChanges": "Još nema promjena na grani", "session.files.selectToOpen": "Odaberi datoteku za otvaranje", "session.files.all": "Sve datoteke", @@ -534,6 +640,10 @@ export const dict = { "session.todo.title": "Zadaci", "session.todo.collapse": "Sažmi", "session.todo.expand": "Proširi", + "session.question.minimize": "Minimiziraj pitanje", + "session.question.restore": "Vrati pitanje", + "session.question.pending.one": "{{count}} pitanje na čekanju", + "session.question.pending.other": "{{count}} pitanja na čekanju", "session.followupDock.summary.one": "{{count}} poruka na čekanju", "session.followupDock.summary.other": "{{count}} poruka na čekanju", "session.followupDock.sendNow": "Pošalji sada", @@ -547,9 +657,16 @@ export const dict = { "session.revertDock.restore": "Vrati poruku", "session.new.title": "Napravi bilo šta", + "session.new.project.new": "Novi projekat", + "session.new.project.search": "Pretraži projekte", + "session.new.project.add": "Dodaj projekat", "session.new.worktree.main": "Glavna grana", "session.new.worktree.mainWithBranch": "Glavna grana ({{branch}})", "session.new.worktree.create": "Kreiraj novi worktree", + "session.new.workspace.runIn": "Pokreni sesiju u", + "session.new.workspace.triggerLocal": "Lokalno", + "session.new.workspace.local": "Lokalni repozitorij", + "session.new.workspace.existing": "Radni prostor…", "session.new.lastModified": "Posljednja izmjena", "session.header.search.placeholder": "Pretraži {{project}}", @@ -618,6 +735,8 @@ export const dict = { "sidebar.project.recentSessions": "Nedavne sesije", "sidebar.project.viewAllSessions": "Prikaži sve sesije", "sidebar.project.clearNotifications": "Očisti obavijesti", + "sidebar.empty.title": "Nema otvorenih projekata", + "sidebar.empty.description": "Otvori projekat za početak", "app.name.desktop": "OpenCode Desktop", @@ -630,6 +749,7 @@ export const dict = { "settings.desktop.wsl.description": "Pokreni OpenCode server unutar WSL-a na Windowsu.", "settings.general.section.appearance": "Izgled", + "settings.general.section.advanced": "Napredno", "settings.general.section.notifications": "Sistemske obavijesti", "settings.general.section.updates": "Ažuriranja", "settings.general.section.sounds": "Zvučni efekti", @@ -638,6 +758,11 @@ export const dict = { "settings.general.row.language.title": "Jezik", "settings.general.row.language.description": "Promijeni jezik prikaza u OpenCode-u", + "settings.general.row.shell.title": "Shell terminala", + "settings.general.row.shell.description": + "Odaberi shell koji se koristi za terminal. Kompatibilni shellovi koriste se i za pozive alata agenta.", + "settings.general.row.shell.autoDefault": "Automatski (podrazumijevano)", + "settings.general.row.shell.terminalOnly": "samo terminal", "settings.general.row.appearance.title": "Izgled", "settings.general.row.appearance.description": "Prilagodi kako OpenCode izgleda na tvom uređaju", "settings.general.row.colorScheme.title": "Šema boja", @@ -646,14 +771,30 @@ export const dict = { "settings.general.row.theme.description": "Prilagodi temu OpenCode-a.", "settings.general.row.font.title": "Font za kod", "settings.general.row.font.description": "Prilagodi font koji se koristi u blokovima koda", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "Font terminala", + "settings.general.row.terminalFont.description": "Prilagodite font koji se koristi u terminalu", "settings.general.row.uiFont.title": "UI font", "settings.general.row.uiFont.description": "Prilagodi font koji se koristi u cijelom interfejsu", "settings.general.row.followup.title": "Ponašanje nadovezivanja", "settings.general.row.followup.description": "Odaberi da li upiti nadovezivanja usmjeravaju odmah ili čekaju u redu", "settings.general.row.followup.option.queue": "Red čekanja", "settings.general.row.followup.option.steer": "Usmjeri", + "settings.general.row.showFileTree.title": "Stablo datoteka", + "settings.general.row.showFileTree.description": "Prikaži stablo datoteka u sesijama", + "settings.general.row.showNavigation.title": "Kontrole navigacije", + "settings.general.row.showNavigation.description": + "Prikaži dugmad za nazad i naprijed u naslovnoj traci desktop aplikacije", + "settings.general.row.showSearch.title": "Paleta komandi", + "settings.general.row.showSearch.description": "Prikaži dugme za pretragu i paletu komandi u naslovnoj traci", + "settings.general.row.showTerminal.title": "Terminal", + "settings.general.row.showTerminal.description": "Prikaži dugme terminala u naslovnoj traci desktop aplikacije", + "settings.general.row.showStatus.title": "Status servera", + "settings.general.row.showStatus.description": "Prikaži dugme statusa servera u naslovnoj traci", + "settings.general.row.mobileTitlebarBottom.title": "Donja navigacija", + "settings.general.row.mobileTitlebarBottom.description": + "Postavi naslovnu traku i kartice sesije na dno ekrana na mobilnim uređajima", + "settings.general.row.showCustomAgents.title": "Prilagođeni agenti", + "settings.general.row.showCustomAgents.description": "Prikaži izbor agenta u uređivaču poruke", "settings.general.row.reasoningSummaries.title": "Prikaži sažetke rasuđivanja", "settings.general.row.reasoningSummaries.description": "Prikaži sažetke rasuđivanja modela na vremenskoj traci", @@ -663,6 +804,12 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "Proširi dijelove alata za uređivanje", "settings.general.row.editToolPartsExpanded.description": "Prikaži dijelove alata za uređivanje, pisanje i patch podrazumijevano proširene na vremenskoj traci", + "settings.general.row.newLayoutDesigns.title": "Novi raspored i dizajn", + "settings.general.row.newLayoutDesigns.description": + "Omogući redizajnirani raspored, početnu stranicu, uređivač poruke i interfejs sesije", + "settings.general.row.pinchZoom.title": "Zumiranje štipanjem", + "settings.general.row.pinchZoom.description": + "Dozvoli zumiranje gestom štipanja na dodirnoj ploči i pomoću Ctrl-pomjeranja", "settings.general.row.wayland.title": "Koristi nativni Wayland", "settings.general.row.wayland.description": "Onemogući X11 fallback na Waylandu. Zahtijeva restart.", "settings.general.row.wayland.tooltip": @@ -677,6 +824,8 @@ export const dict = { "settings.updates.row.check.description": "Ručno provjeri ažuriranja i instaliraj ako su dostupna", "settings.updates.action.checkNow": "Provjeri sada", "settings.updates.action.checking": "Provjera...", + "settings.updates.action.downloading": "Preuzimanje...", + "settings.updates.action.installing": "Instaliranje...", "settings.updates.toast.latest.title": "Sve je ažurno", "settings.updates.toast.latest.description": "Koristiš najnoviju verziju OpenCode-a.", "sound.option.none": "Nijedan", diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts index ad43c1d111..859bea230b 100644 --- a/packages/app/src/i18n/da.ts +++ b/packages/app/src/i18n/da.ts @@ -23,6 +23,9 @@ export const dict = { "command.sidebar.toggle": "Skift sidebjælke", "command.project.open": "Åbn projekt", + "command.project.previous": "Forrige projekt", + "command.project.next": "Næste projekt", + "command.project.index": "Skift til projekt {{index}}", "command.provider.connect": "Tilslut udbyder", "command.server.switch": "Skift server", "command.settings.open": "Åbn indstillinger", @@ -45,6 +48,7 @@ export const dict = { "command.session.new": "Ny session", "command.file.open": "Åbn fil", "command.tab.close": "Luk fane", + "command.tab.reopenClosed": "Åbn lukket fane igen", "command.context.addSelection": "Tilføj markering til kontekst", "command.context.addSelection.description": "Tilføj markerede linjer fra den aktuelle fil", "command.input.focus": "Fokuser inputfelt", @@ -208,6 +212,11 @@ export const dict = { "model.input.video": "video", "model.input.pdf": "pdf", "model.tooltip.allows": "Tillader: {{inputs}}", + "model.tooltip.context.label": "Kontekst", + "model.tooltip.inputs": "Input", + "model.tooltip.model": "Model", + "model.tooltip.provider": "Udbyder", + "model.tooltip.reasoning": "Tænkning", "model.tooltip.reasoning.allowed": "Tillader tænkning", "model.tooltip.reasoning.none": "Ingen tænkning", "model.tooltip.context": "Kontekstgrænse {{limit}}", @@ -217,6 +226,7 @@ export const dict = { "common.loading": "Indlæser", "common.loading.ellipsis": "...", "common.cancel": "Annuller", + "common.clear": "Ryd", "common.connect": "Forbind", "common.disconnect": "Frakobl", "common.continue": "Indsend", @@ -234,6 +244,8 @@ export const dict = { "prompt.mode.shell": "Shell", "prompt.mode.normal": "Prompt", "prompt.mode.shell.exit": "esc for at afslutte", + "session.child.promptDisabled": "Der kan ikke sendes prompts til underagentsessioner.", + "session.child.backToParent": "Tilbage til hovedsessionen.", "prompt.example.1": "Ret en TODO i koden", "prompt.example.2": "Hvad er teknologistakken for dette projekt?", @@ -340,6 +352,75 @@ export const dict = { "dialog.server.menu.delete": "Slet", "dialog.server.current": "Nuværende server", "dialog.server.status.default": "Standard", + "wsl.server.add": "Tilføj WSL-server", + "wsl.server.addShort": "Tilføj WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "WSL-server", + "wsl.server.retryStart": "Prøv at starte igen", + "wsl.server.updating": "Opdaterer...", + "wsl.onboarding.step.distro": "Vælg distribution", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "Tjekker WSL...", + "wsl.onboarding.restartRequired": "Windows skal genstartes for at fuldføre installationen af WSL.", + "wsl.onboarding.ready": "WSL er klar.", + "wsl.onboarding.required": "WSL er påkrævet for at fortsætte.", + "wsl.onboarding.checkingDistros": "Tjekker distributioner...", + "wsl.onboarding.installingDistro": "Installerer {{distro}}...", + "wsl.onboarding.checkingDistro": "Tjekker {{distro}}...", + "wsl.onboarding.listingDistros": "Henter liste over distributioner...", + "wsl.onboarding.distroReady": "{{distro}} er klar.", + "wsl.onboarding.distroNotInstalled": "{{distro}} er ikke installeret endnu.", + "wsl.onboarding.openDistroOnce": "Åbn {{distro}} én gang for at fuldføre opsætningen.", + "wsl.onboarding.finishingDistro": "Fuldfører opsætningen af {{distro}}.", + "wsl.onboarding.pickDistro": "Vælg en distribution, eller installer en nedenfor.", + "wsl.onboarding.checkingOpencode": "Tjekker OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "Tjekker OpenCode i {{distro}}...", + "wsl.onboarding.updatingOpencode": "Opdaterer OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "Opdaterer OpenCode i {{distro}}...", + "wsl.onboarding.updateOpencodeIn": "Opdater OpenCode i {{distro}}.", + "wsl.onboarding.updateOpencode": "Opdater OpenCode", + "wsl.onboarding.opencodeReadyIn": "OpenCode er klar i {{distro}}.", + "wsl.onboarding.opencodeReady": "OpenCode er klar.", + "wsl.onboarding.installOpencodeIn": "Installer OpenCode i {{distro}}.", + "wsl.onboarding.installOpencode": "Installer OpenCode", + "wsl.onboarding.chooseDistroFirst": "Vælg først en distribution.", + "wsl.onboarding.loadFailed": "Kunne ikke indlæse WSL-status.", + "wsl.onboarding.loading": "Indlæser...", + "wsl.onboarding.installedDistros": "Installerede distributioner", + "wsl.onboarding.checkAgain": "Tjek igen", + "wsl.onboarding.distroStatus.ready": "Klar", + "wsl.onboarding.distroStatus.checking": "Tjekker...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode er ikke installeret", + "wsl.onboarding.distroStatus.missingTools": "Mangler bash, curl", + "wsl.onboarding.distroStatus.unsupported": "Ikke understøttet · Brug WSL 2", + "wsl.onboarding.needAnotherDistro": "Har du brug for en anden distribution?", + "wsl.onboarding.needAnotherDistroHint": "Installer en Linux-distribution fra WSL-kataloget", + "wsl.onboarding.wslNotInstalled.title": "WSL er ikke installeret", + "wsl.onboarding.wslNotInstalled.description": + "WSL (Windows Subsystem for Linux) er påkrævet, før OpenCode kan tilføje en WSL-server", + "wsl.onboarding.wslUnavailable.title": "WSL er ikke tilgængelig", + "wsl.onboarding.wslUnavailable.description": "OpenCode kunne ikke bekræfte WSL på denne maskine.", + "wsl.onboarding.installWsl": "Installer WSL", + "wsl.onboarding.windowsRestartRequired": + "Genstart Windows for at fuldføre installationen af WSL, og åbn derefter OpenCode igen.", + "wsl.onboarding.next": "Næste", + "wsl.onboarding.refresh": "Opdater", + "wsl.onboarding.allDistrosAdded": "Alle installerede distributioner er allerede tilføjet.", + "wsl.onboarding.noDistros": "Ingen distributioner fundet endnu.", + "wsl.onboarding.install": "Installer", + "wsl.onboarding.installing": "Installerer...", + "wsl.onboarding.installDistro": "Installer distribution", + "wsl.onboarding.searchDistros": "Søg efter distributioner", + "wsl.onboarding.wsl2Required": "WSL 2 er påkrævet.", + "wsl.onboarding.toolsRequired": "Denne distribution kræver bash og curl.", + "wsl.onboarding.openTerminal": "Åbn terminal", + "wsl.onboarding.path": "Sti: {{path}}", + "wsl.onboarding.notFound": "ikke fundet", + "wsl.onboarding.version": "Version: {{version}}", + "wsl.onboarding.unknown": "ukendt", + "wsl.onboarding.desktopVersion": "desktop {{version}}", + "wsl.onboarding.versionMismatch": "Den installerede version matcher ikke desktopappens version.", + "wsl.onboarding.adding": "Tilføjer...", "dialog.project.edit.title": "Rediger projekt", "dialog.project.edit.name": "Navn", @@ -403,6 +484,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", @@ -450,10 +532,12 @@ export const dict = { "error.page.title": "Noget gik galt", "error.page.description": "Der opstod en fejl under indlæsning af applikationen.", + "error.page.description.localServerStartup": "Der opstod en fejl under start af den lokale server.", "error.page.details.label": "Fejldetaljer", "error.page.action.restart": "Genstart", "error.page.action.report": "Rapportér fejl", "error.page.action.reported": "Fejl rapporteret", + "error.page.action.exportLogs": "Eksportér logfiler", "error.page.action.checking": "Tjekker...", "error.page.action.checkUpdates": "Tjek for opdateringer", "error.page.action.updateTo": "Opdater til {{version}}", @@ -501,11 +585,31 @@ export const dict = { "home.recentProjects": "Seneste projekter", "home.empty.title": "Ingen seneste projekter", "home.empty.description": "Kom i gang ved at åbne et lokalt projekt", + "home.title": "Hjem", + "home.projects": "Projekter", + "home.project.add": "Tilføj projekt", + "home.recentlyClosed": "Lukket for nylig", + "home.server.collapse": "Skjul serverprojekter", + "home.server.expand": "Udvid serverprojekter", + "home.sessions.search.placeholder": "Søg i sessioner", + "home.sessions.search.placeholder.scoped": "Søg i sessioner i {{scope}}", + "home.sessions.search.sessions": "Sessioner", + "home.sessions.search.noResults": "Ingen sessioner fundet for {{query}}", + "home.sessions.empty": "Intet her endnu", + "home.sessions.empty.description": "Opret en session for at komme i gang", + "home.sessions.group.today": "I dag", + "home.sessions.group.yesterday": "I går", + "home.sessions.group.older": "Ældre", "session.tab.session": "Session", "session.tab.review": "Gennemgang", "session.tab.context": "Kontekst", + "session.tab.unknown": "Ukendt session", "session.panel.reviewAndFiles": "Gennemgang og filer", + "session.error.notFound": "Denne session kan ikke findes", + "session.error.notFound.description": "Denne fane henviser til en session, der ikke længere findes på denne server.", + "session.error.notFound.closeTab": "Luk fane", + "session.error.serverConnection": "Kan ikke oprette forbindelse til denne server", "session.review.filesChanged": "{{count}} Filer ændret", "session.review.change.one": "Ændring", "session.review.change.other": "Ændringer", @@ -515,6 +619,8 @@ export const dict = { "session.review.noSnapshot": "Snapshot-sporing er deaktiveret i konfigurationen, så sessionsændringer er ikke tilgængelige", "session.review.noChanges": "Ingen ændringer", + "session.review.noUncommittedChanges": "Ingen ændringer uden commit endnu", + "session.review.noBranchChanges": "Ingen grenændringer endnu", "session.files.selectToOpen": "Vælg en fil at åbne", "session.files.all": "Alle filer", "session.files.empty": "Ingen filer", @@ -529,6 +635,10 @@ export const dict = { "session.todo.title": "Opgaver", "session.todo.collapse": "Skjul", "session.todo.expand": "Udvid", + "session.question.minimize": "Minimer spørgsmål", + "session.question.restore": "Gendan spørgsmål", + "session.question.pending.one": "{{count}} afventende spørgsmål", + "session.question.pending.other": "{{count}} afventende spørgsmål", "session.followupDock.summary.one": "{{count}} besked i kø", "session.followupDock.summary.other": "{{count}} beskeder i kø", "session.followupDock.sendNow": "Send nu", @@ -542,9 +652,16 @@ export const dict = { "session.revertDock.restore": "Gendan besked", "session.new.title": "Byg hvad som helst", + "session.new.project.new": "Nyt projekt", + "session.new.project.search": "Søg efter projekter", + "session.new.project.add": "Tilføj projekt", "session.new.worktree.main": "Hovedgren", "session.new.worktree.mainWithBranch": "Hovedgren ({{branch}})", "session.new.worktree.create": "Opret nyt worktree", + "session.new.workspace.runIn": "Kør session i", + "session.new.workspace.triggerLocal": "Lokal", + "session.new.workspace.local": "Lokalt repository", + "session.new.workspace.existing": "Arbejdsområde…", "session.new.lastModified": "Sidst ændret", "session.header.search.placeholder": "Søg {{project}}", @@ -614,6 +731,8 @@ export const dict = { "sidebar.project.recentSessions": "Seneste sessioner", "sidebar.project.viewAllSessions": "Vis alle sessioner", "sidebar.project.clearNotifications": "Ryd notifikationer", + "sidebar.empty.title": "Ingen åbne projekter", + "sidebar.empty.description": "Åbn et projekt for at komme i gang", "app.name.desktop": "OpenCode Desktop", "settings.section.desktop": "Desktop", @@ -625,6 +744,7 @@ export const dict = { "settings.desktop.wsl.description": "Kør OpenCode-serveren inde i WSL på Windows.", "settings.general.section.appearance": "Udseende", + "settings.general.section.advanced": "Avanceret", "settings.general.section.notifications": "Systemmeddelelser", "settings.general.section.updates": "Opdateringer", "settings.general.section.sounds": "Lydeffekter", @@ -633,6 +753,11 @@ export const dict = { "settings.general.row.language.title": "Sprog", "settings.general.row.language.description": "Ændr visningssproget for OpenCode", + "settings.general.row.shell.title": "Terminalshell", + "settings.general.row.shell.description": + "Vælg den shell, der bruges i din terminal. Kompatible shells bruges også til agentens værktøjskald.", + "settings.general.row.shell.autoDefault": "Automatisk (standard)", + "settings.general.row.shell.terminalOnly": "kun terminal", "settings.general.row.appearance.title": "Udseende", "settings.general.row.appearance.description": "Tilpas hvordan OpenCode ser ud på din enhed", "settings.general.row.colorScheme.title": "Farveskema", @@ -641,14 +766,29 @@ export const dict = { "settings.general.row.theme.description": "Tilpas hvordan OpenCode er temabestemt.", "settings.general.row.font.title": "Kode-skrifttype", "settings.general.row.font.description": "Tilpas skrifttypen, der bruges i kodeblokke", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "Terminalskrifttype", + "settings.general.row.terminalFont.description": "Tilpas den skrifttype, der bruges i terminalen", "settings.general.row.uiFont.title": "UI-skrifttype", "settings.general.row.uiFont.description": "Tilpas skrifttypen, der bruges i hele brugerfladen", "settings.general.row.followup.title": "Opfølgningsadfærd", "settings.general.row.followup.description": "Vælg om opfølgende forespørgsler skal styre straks eller vente i kø", "settings.general.row.followup.option.queue": "Kø", "settings.general.row.followup.option.steer": "Styr", + "settings.general.row.showFileTree.title": "Filtræ", + "settings.general.row.showFileTree.description": "Vis filtræspanelet i sessioner", + "settings.general.row.showNavigation.title": "Navigationsknapper", + "settings.general.row.showNavigation.description": "Vis tilbage- og frem-knapperne i desktopappens titellinje", + "settings.general.row.showSearch.title": "Kommandopalette", + "settings.general.row.showSearch.description": "Vis knappen til søgning og kommandopaletten i titellinjen", + "settings.general.row.showTerminal.title": "Terminal", + "settings.general.row.showTerminal.description": "Vis terminalknappen i desktopappens titellinje", + "settings.general.row.showStatus.title": "Serverstatus", + "settings.general.row.showStatus.description": "Vis serverstatusknappen i titellinjen", + "settings.general.row.mobileTitlebarBottom.title": "Navigation nederst", + "settings.general.row.mobileTitlebarBottom.description": + "Placer titellinjen og sessionsfanerne nederst på skærmen på mobilenheder", + "settings.general.row.showCustomAgents.title": "Brugerdefinerede agenter", + "settings.general.row.showCustomAgents.description": "Vis agentvælgeren i promptfeltet", "settings.general.row.reasoningSummaries.title": "Vis tænkeoversigter", "settings.general.row.reasoningSummaries.description": "Vis model tænkeoversigter i tidslinjen", @@ -657,6 +797,11 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "Udvid edit-værktøjsdele", "settings.general.row.editToolPartsExpanded.description": "Vis edit-, write- og patch-værktøjsdele udvidet som standard i tidslinjen", + "settings.general.row.newLayoutDesigns.title": "Nyt layout og design", + "settings.general.row.newLayoutDesigns.description": + "Aktivér det nydesignede layout, startsiden, promptfeltet og sessionsbrugerfladen", + "settings.general.row.pinchZoom.title": "Knib for at zoome", + "settings.general.row.pinchZoom.description": "Tillad knibebevægelser på pegefeltet og Ctrl-rulning for at zoome", "settings.general.row.wayland.title": "Brug native Wayland", "settings.general.row.wayland.description": "Deaktiver X11-fallback på Wayland. Kræver genstart.", "settings.general.row.wayland.tooltip": @@ -671,6 +816,8 @@ export const dict = { "settings.updates.row.check.description": "Tjek manuelt for opdateringer og installer, hvis tilgængelig", "settings.updates.action.checkNow": "Tjek nu", "settings.updates.action.checking": "Tjekker...", + "settings.updates.action.downloading": "Downloader...", + "settings.updates.action.installing": "Installerer...", "settings.updates.toast.latest.title": "Du er opdateret", "settings.updates.toast.latest.description": "Du kører den nyeste version af OpenCode.", diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts index d0ec9507e0..c96dc232a5 100644 --- a/packages/app/src/i18n/de.ts +++ b/packages/app/src/i18n/de.ts @@ -25,6 +25,9 @@ export const dict = { "theme.scheme.dark": "Dunkel", "command.sidebar.toggle": "Seitenleiste umschalten", "command.project.open": "Projekt öffnen", + "command.project.previous": "Vorheriges Projekt", + "command.project.next": "Nächstes Projekt", + "command.project.index": "Zu Projekt {{index}} wechseln", "command.provider.connect": "Anbieter verbinden", "command.server.switch": "Server wechseln", "command.settings.open": "Einstellungen öffnen", @@ -43,6 +46,7 @@ export const dict = { "command.session.new": "Neue Sitzung", "command.file.open": "Datei öffnen", "command.tab.close": "Tab schließen", + "command.tab.reopenClosed": "Geschlossenen Tab wieder öffnen", "command.context.addSelection": "Auswahl zum Kontext hinzufügen", "command.context.addSelection.description": "Ausgewählte Zeilen aus der aktuellen Datei hinzufügen", "command.input.focus": "Eingabefeld fokussieren", @@ -198,6 +202,11 @@ export const dict = { "model.input.video": "Video", "model.input.pdf": "PDF", "model.tooltip.allows": "Erlaubt: {{inputs}}", + "model.tooltip.context.label": "Kontext", + "model.tooltip.inputs": "Eingaben", + "model.tooltip.model": "Modell", + "model.tooltip.provider": "Anbieter", + "model.tooltip.reasoning": "Reasoning", "model.tooltip.reasoning.allowed": "Erlaubt Reasoning", "model.tooltip.reasoning.none": "Kein Reasoning", "model.tooltip.context": "Kontextlimit {{limit}}", @@ -207,6 +216,7 @@ export const dict = { "common.loading": "Laden", "common.loading.ellipsis": "...", "common.cancel": "Abbrechen", + "common.clear": "Leeren", "common.connect": "Verbinden", "common.disconnect": "Trennen", "common.continue": "Absenden", @@ -223,6 +233,8 @@ export const dict = { "prompt.mode.shell": "Shell", "prompt.mode.normal": "Prompt", "prompt.mode.shell.exit": "esc zum Verlassen", + "session.child.promptDisabled": "Unteragenten-Sitzungen können keine Prompts erhalten.", + "session.child.backToParent": "Zurück zur Hauptsitzung.", "prompt.example.1": "Ein TODO in der Codebasis beheben", "prompt.example.2": "Was ist der Tech-Stack dieses Projekts?", "prompt.example.3": "Fehlerhafte Tests beheben", @@ -320,6 +332,75 @@ export const dict = { "dialog.server.menu.delete": "Löschen", "dialog.server.current": "Aktueller Server", "dialog.server.status.default": "Standard", + "wsl.server.add": "WSL-Server hinzufügen", + "wsl.server.addShort": "WSL hinzufügen", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "WSL-Server", + "wsl.server.retryStart": "Start erneut versuchen", + "wsl.server.updating": "Wird aktualisiert...", + "wsl.onboarding.step.distro": "Distribution auswählen", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "WSL wird geprüft...", + "wsl.onboarding.restartRequired": "Windows muss neu gestartet werden, um die WSL-Installation abzuschließen.", + "wsl.onboarding.ready": "WSL ist bereit.", + "wsl.onboarding.required": "WSL ist erforderlich, um fortzufahren.", + "wsl.onboarding.checkingDistros": "Distributionen werden geprüft...", + "wsl.onboarding.installingDistro": "{{distro}} wird installiert...", + "wsl.onboarding.checkingDistro": "{{distro}} wird geprüft...", + "wsl.onboarding.listingDistros": "Distributionen werden aufgelistet...", + "wsl.onboarding.distroReady": "{{distro}} ist bereit.", + "wsl.onboarding.distroNotInstalled": "{{distro}} ist noch nicht installiert.", + "wsl.onboarding.openDistroOnce": "Öffnen Sie {{distro}} einmal, um die Einrichtung abzuschließen.", + "wsl.onboarding.finishingDistro": "Einrichtung von {{distro}} wird abgeschlossen.", + "wsl.onboarding.pickDistro": "Wählen Sie eine Distribution aus oder installieren Sie unten eine.", + "wsl.onboarding.checkingOpencode": "OpenCode wird geprüft...", + "wsl.onboarding.checkingOpencodeIn": "OpenCode in {{distro}} wird geprüft...", + "wsl.onboarding.updatingOpencode": "OpenCode wird aktualisiert...", + "wsl.onboarding.updatingOpencodeIn": "OpenCode in {{distro}} wird aktualisiert...", + "wsl.onboarding.updateOpencodeIn": "Aktualisieren Sie OpenCode in {{distro}}.", + "wsl.onboarding.updateOpencode": "OpenCode aktualisieren", + "wsl.onboarding.opencodeReadyIn": "OpenCode ist in {{distro}} bereit.", + "wsl.onboarding.opencodeReady": "OpenCode ist bereit.", + "wsl.onboarding.installOpencodeIn": "Installieren Sie OpenCode in {{distro}}.", + "wsl.onboarding.installOpencode": "OpenCode installieren", + "wsl.onboarding.chooseDistroFirst": "Wählen Sie zuerst eine Distribution aus.", + "wsl.onboarding.loadFailed": "WSL-Status konnte nicht geladen werden.", + "wsl.onboarding.loading": "Wird geladen...", + "wsl.onboarding.installedDistros": "Installierte Distributionen", + "wsl.onboarding.checkAgain": "Erneut prüfen", + "wsl.onboarding.distroStatus.ready": "Bereit", + "wsl.onboarding.distroStatus.checking": "Wird geprüft...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode nicht installiert", + "wsl.onboarding.distroStatus.missingTools": "Fehlend: bash, curl", + "wsl.onboarding.distroStatus.unsupported": "Nicht unterstützt · WSL 2 verwenden", + "wsl.onboarding.needAnotherDistro": "Andere Distribution benötigt?", + "wsl.onboarding.needAnotherDistroHint": "Installieren Sie eine Linux-Distribution aus dem WSL-Katalog", + "wsl.onboarding.wslNotInstalled.title": "WSL nicht installiert", + "wsl.onboarding.wslNotInstalled.description": + "WSL (Windows Subsystem for Linux) ist erforderlich, bevor OpenCode einen WSL-Server hinzufügen kann", + "wsl.onboarding.wslUnavailable.title": "WSL nicht verfügbar", + "wsl.onboarding.wslUnavailable.description": "OpenCode konnte WSL auf diesem Computer nicht überprüfen.", + "wsl.onboarding.installWsl": "WSL installieren", + "wsl.onboarding.windowsRestartRequired": + "Starten Sie Windows neu, um die WSL-Installation abzuschließen, und öffnen Sie dann OpenCode erneut.", + "wsl.onboarding.next": "Weiter", + "wsl.onboarding.refresh": "Aktualisieren", + "wsl.onboarding.allDistrosAdded": "Alle installierten Distributionen wurden bereits hinzugefügt.", + "wsl.onboarding.noDistros": "Noch keine Distributionen erkannt.", + "wsl.onboarding.install": "Installieren", + "wsl.onboarding.installing": "Wird installiert...", + "wsl.onboarding.installDistro": "Distribution installieren", + "wsl.onboarding.searchDistros": "Distributionen durchsuchen", + "wsl.onboarding.wsl2Required": "WSL 2 ist erforderlich.", + "wsl.onboarding.toolsRequired": "Diese Distribution benötigt bash und curl.", + "wsl.onboarding.openTerminal": "Terminal öffnen", + "wsl.onboarding.path": "Pfad: {{path}}", + "wsl.onboarding.notFound": "nicht gefunden", + "wsl.onboarding.version": "Version: {{version}}", + "wsl.onboarding.unknown": "unbekannt", + "wsl.onboarding.desktopVersion": "Desktop {{version}}", + "wsl.onboarding.versionMismatch": "Die installierte Version entspricht nicht der Version der Desktop-App.", + "wsl.onboarding.adding": "Wird hinzugefügt...", "dialog.project.edit.title": "Projekt bearbeiten", "dialog.project.edit.name": "Name", "dialog.project.edit.icon": "Icon", @@ -378,6 +459,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", "toast.language.title": "Sprache", @@ -414,10 +496,12 @@ export const dict = { "toast.update.action.notYet": "Noch nicht", "error.page.title": "Etwas ist schiefgelaufen", "error.page.description": "Beim Laden der Anwendung ist ein Fehler aufgetreten.", + "error.page.description.localServerStartup": "Beim Starten des lokalen Servers ist ein Fehler aufgetreten.", "error.page.details.label": "Fehlerdetails", "error.page.action.restart": "Neustart", "error.page.action.report": "Fehler melden", "error.page.action.reported": "Fehler gemeldet", + "error.page.action.exportLogs": "Protokolle exportieren", "error.page.action.checking": "Prüfen...", "error.page.action.checkUpdates": "Nach Updates suchen", "error.page.action.updateTo": "Auf {{version}} aktualisieren", @@ -461,10 +545,31 @@ export const dict = { "home.recentProjects": "Letzte Projekte", "home.empty.title": "Keine letzten Projekte", "home.empty.description": "Starten Sie, indem Sie ein lokales Projekt öffnen", + "home.title": "Startseite", + "home.projects": "Projekte", + "home.project.add": "Projekt hinzufügen", + "home.recentlyClosed": "Kürzlich geschlossen", + "home.server.collapse": "Serverprojekte einklappen", + "home.server.expand": "Serverprojekte ausklappen", + "home.sessions.search.placeholder": "Sitzungen durchsuchen", + "home.sessions.search.placeholder.scoped": "Sitzungen in {{scope}} durchsuchen", + "home.sessions.search.sessions": "Sitzungen", + "home.sessions.search.noResults": "Keine Sitzungen für {{query}} gefunden", + "home.sessions.empty": "Hier ist noch nichts", + "home.sessions.empty.description": "Erstellen Sie eine Sitzung, um loszulegen", + "home.sessions.group.today": "Heute", + "home.sessions.group.yesterday": "Gestern", + "home.sessions.group.older": "Älter", "session.tab.session": "Sitzung", "session.tab.review": "Überprüfung", "session.tab.context": "Kontext", + "session.tab.unknown": "Unbekannte Sitzung", "session.panel.reviewAndFiles": "Überprüfung und Dateien", + "session.error.notFound": "Diese Sitzung wurde nicht gefunden", + "session.error.notFound.description": + "Dieser Tab verweist auf eine Sitzung, die auf diesem Server nicht mehr existiert.", + "session.error.notFound.closeTab": "Tab schließen", + "session.error.serverConnection": "Verbindung zu diesem Server nicht möglich", "session.review.filesChanged": "{{count}} Dateien geändert", "session.review.change.one": "Änderung", "session.review.change.other": "Änderungen", @@ -474,6 +579,8 @@ export const dict = { "session.review.noSnapshot": "Snapshot-Tracking ist in der Konfiguration deaktiviert, daher sind Sitzungsänderungen nicht verfügbar", "session.review.noChanges": "Keine Änderungen", + "session.review.noUncommittedChanges": "Noch keine nicht committeten Änderungen", + "session.review.noBranchChanges": "Noch keine Branch-Änderungen", "session.files.selectToOpen": "Datei zum Öffnen auswählen", "session.files.all": "Alle Dateien", "session.files.empty": "Keine Dateien", @@ -487,6 +594,10 @@ export const dict = { "session.todo.title": "Aufgaben", "session.todo.collapse": "Einklappen", "session.todo.expand": "Ausklappen", + "session.question.minimize": "Frage minimieren", + "session.question.restore": "Frage wiederherstellen", + "session.question.pending.one": "{{count}} ausstehende Frage", + "session.question.pending.other": "{{count}} ausstehende Fragen", "session.followupDock.summary.one": "{{count}} Nachricht in der Warteschlange", "session.followupDock.summary.other": "{{count}} Nachrichten in der Warteschlange", "session.followupDock.sendNow": "Jetzt senden", @@ -499,9 +610,16 @@ export const dict = { "session.revertDock.expand": "Zurückgesetzte Nachrichten ausklappen", "session.revertDock.restore": "Nachricht wiederherstellen", "session.new.title": "Baue, was du willst", + "session.new.project.new": "Neues Projekt", + "session.new.project.search": "Projekte durchsuchen", + "session.new.project.add": "Projekt hinzufügen", "session.new.worktree.main": "Haupt-Branch", "session.new.worktree.mainWithBranch": "Haupt-Branch ({{branch}})", "session.new.worktree.create": "Neuen Worktree erstellen", + "session.new.workspace.runIn": "Sitzung ausführen in", + "session.new.workspace.triggerLocal": "Lokal", + "session.new.workspace.local": "Lokales Repository", + "session.new.workspace.existing": "Arbeitsbereich…", "session.new.lastModified": "Zuletzt geändert", "session.header.search.placeholder": "{{project}} durchsuchen", "session.header.searchFiles": "Dateien suchen", @@ -566,6 +684,8 @@ export const dict = { "sidebar.project.recentSessions": "Letzte Sitzungen", "sidebar.project.viewAllSessions": "Alle Sitzungen anzeigen", "sidebar.project.clearNotifications": "Benachrichtigungen löschen", + "sidebar.empty.title": "Keine Projekte geöffnet", + "sidebar.empty.description": "Öffnen Sie ein Projekt, um loszulegen", "app.name.desktop": "OpenCode Desktop", "settings.section.desktop": "Desktop", "settings.section.server": "Server", @@ -575,6 +695,7 @@ export const dict = { "settings.desktop.wsl.title": "WSL-Integration", "settings.desktop.wsl.description": "OpenCode-Server innerhalb von WSL unter Windows ausführen.", "settings.general.section.appearance": "Erscheinungsbild", + "settings.general.section.advanced": "Erweitert", "settings.general.section.notifications": "Systembenachrichtigungen", "settings.general.section.updates": "Updates", "settings.general.section.sounds": "Soundeffekte", @@ -582,6 +703,11 @@ export const dict = { "settings.general.section.display": "Anzeige", "settings.general.row.language.title": "Sprache", "settings.general.row.language.description": "Die Anzeigesprache für OpenCode ändern", + "settings.general.row.shell.title": "Terminal-Shell", + "settings.general.row.shell.description": + "Wählen Sie die Shell für Ihr Terminal aus. Kompatible Shells werden auch für Tool-Aufrufe von Agenten verwendet.", + "settings.general.row.shell.autoDefault": "Automatisch (Standard)", + "settings.general.row.shell.terminalOnly": "nur Terminal", "settings.general.row.appearance.title": "Erscheinungsbild", "settings.general.row.appearance.description": "Anpassen, wie OpenCode auf Ihrem Gerät aussieht", "settings.general.row.colorScheme.title": "Farbschema", @@ -591,8 +717,8 @@ export const dict = { "settings.general.row.theme.description": "Das Thema von OpenCode anpassen.", "settings.general.row.font.title": "Code-Schriftart", "settings.general.row.font.description": "Die in Codeblöcken verwendete Schriftart anpassen", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "Terminalschriftart", + "settings.general.row.terminalFont.description": "Passe die im Terminal verwendete Schriftart an", "settings.general.row.uiFont.title": "UI-Schriftart", "settings.general.row.uiFont.description": "Die im gesamten Interface verwendete Schriftart anpassen", "settings.general.row.followup.title": "Verhalten bei Folgefragen", @@ -600,6 +726,23 @@ export const dict = { "Wählen Sie, ob Folgefragen sofort steuern oder in einer Warteschlange warten", "settings.general.row.followup.option.queue": "Warteschlange", "settings.general.row.followup.option.steer": "Steuern", + "settings.general.row.showFileTree.title": "Dateibaum", + "settings.general.row.showFileTree.description": "Dateibaum in Sitzungen anzeigen", + "settings.general.row.showNavigation.title": "Navigationssteuerung", + "settings.general.row.showNavigation.description": + "Schaltflächen zum Vor- und Zurücknavigieren in der Desktop-Titelleiste anzeigen", + "settings.general.row.showSearch.title": "Befehlspalette", + "settings.general.row.showSearch.description": + "Schaltfläche für Suche und Befehlspalette in der Titelleiste anzeigen", + "settings.general.row.showTerminal.title": "Terminal", + "settings.general.row.showTerminal.description": "Terminal-Schaltfläche in der Desktop-Titelleiste anzeigen", + "settings.general.row.showStatus.title": "Serverstatus", + "settings.general.row.showStatus.description": "Serverstatus-Schaltfläche in der Titelleiste anzeigen", + "settings.general.row.mobileTitlebarBottom.title": "Navigation unten", + "settings.general.row.mobileTitlebarBottom.description": + "Titelleiste und Sitzungs-Tabs auf Mobilgeräten am unteren Bildschirmrand platzieren", + "settings.general.row.showCustomAgents.title": "Benutzerdefinierte Agenten", + "settings.general.row.showCustomAgents.description": "Agentenauswahl im Eingabebereich anzeigen", "settings.general.row.reasoningSummaries.title": "Reasoning-Zusammenfassungen anzeigen", "settings.general.row.reasoningSummaries.description": "Zusammenfassungen des Modell-Reasonings in der Timeline anzeigen", @@ -609,6 +752,11 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "Edit-Tool-Abschnitte ausklappen", "settings.general.row.editToolPartsExpanded.description": "Edit-, Write- und Patch-Tool-Abschnitte standardmäßig in der Timeline ausgeklappt anzeigen", + "settings.general.row.newLayoutDesigns.title": "Neues Layout und Design", + "settings.general.row.newLayoutDesigns.description": + "Neu gestaltetes Layout, Startseite, Eingabebereich und Sitzungsoberfläche aktivieren", + "settings.general.row.pinchZoom.title": "Zoom per Fingergeste", + "settings.general.row.pinchZoom.description": "Zoomen per Zwei-Finger- und Ctrl-Scroll-Geste erlauben", "settings.general.row.wayland.title": "Natives Wayland verwenden", "settings.general.row.wayland.description": "X11-Fallback unter Wayland deaktivieren. Erfordert Neustart.", "settings.general.row.wayland.tooltip": @@ -621,6 +769,8 @@ export const dict = { "settings.updates.row.check.description": "Manuell nach Updates suchen und installieren, wenn verfügbar", "settings.updates.action.checkNow": "Jetzt prüfen", "settings.updates.action.checking": "Wird geprüft...", + "settings.updates.action.downloading": "Wird heruntergeladen...", + "settings.updates.action.installing": "Wird installiert...", "settings.updates.toast.latest.title": "Du bist auf dem neuesten Stand", "settings.updates.toast.latest.description": "Du verwendest die aktuelle Version von OpenCode.", "sound.option.none": "Keine", diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts index a6371d7312..5ef7862cd6 100644 --- a/packages/app/src/i18n/es.ts +++ b/packages/app/src/i18n/es.ts @@ -23,6 +23,9 @@ export const dict = { "command.sidebar.toggle": "Alternar barra lateral", "command.project.open": "Abrir proyecto", + "command.project.previous": "Proyecto anterior", + "command.project.next": "Siguiente proyecto", + "command.project.index": "Cambiar al proyecto {{index}}", "command.provider.connect": "Conectar proveedor", "command.server.switch": "Cambiar servidor", "command.settings.open": "Abrir ajustes", @@ -45,6 +48,7 @@ export const dict = { "command.session.new": "Nueva sesión", "command.file.open": "Abrir archivo", "command.tab.close": "Cerrar pestaña", + "command.tab.reopenClosed": "Reabrir pestaña cerrada", "command.context.addSelection": "Añadir selección al contexto", "command.context.addSelection.description": "Añadir las líneas seleccionadas del archivo actual", "command.input.focus": "Enfocar entrada", @@ -208,6 +212,11 @@ export const dict = { "model.input.video": "video", "model.input.pdf": "pdf", "model.tooltip.allows": "Permite: {{inputs}}", + "model.tooltip.context.label": "Contexto", + "model.tooltip.inputs": "Entradas", + "model.tooltip.model": "Modelo", + "model.tooltip.provider": "Proveedor", + "model.tooltip.reasoning": "Razonamiento", "model.tooltip.reasoning.allowed": "Permite razonamiento", "model.tooltip.reasoning.none": "Sin razonamiento", "model.tooltip.context": "Límite de contexto {{limit}}", @@ -218,6 +227,7 @@ export const dict = { "common.loading": "Cargando", "common.loading.ellipsis": "...", "common.cancel": "Cancelar", + "common.clear": "Limpiar", "common.connect": "Conectar", "common.disconnect": "Desconectar", "common.continue": "Enviar", @@ -235,6 +245,8 @@ export const dict = { "prompt.mode.shell": "Shell", "prompt.mode.normal": "Prompt", "prompt.mode.shell.exit": "esc para salir", + "session.child.promptDisabled": "No se pueden enviar prompts a las sesiones de subagentes.", + "session.child.backToParent": "Volver a la sesión principal.", "prompt.example.1": "Arreglar un TODO en el código", "prompt.example.2": "¿Cuál es el stack tecnológico de este proyecto?", @@ -341,6 +353,75 @@ export const dict = { "dialog.server.menu.delete": "Eliminar", "dialog.server.current": "Servidor actual", "dialog.server.status.default": "Predeterminado", + "wsl.server.add": "Añadir servidor WSL", + "wsl.server.addShort": "Añadir WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "Servidor WSL", + "wsl.server.retryStart": "Reintentar el inicio", + "wsl.server.updating": "Actualizando...", + "wsl.onboarding.step.distro": "Elegir distribución", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "Comprobando WSL...", + "wsl.onboarding.restartRequired": "Es necesario reiniciar Windows para terminar de instalar WSL.", + "wsl.onboarding.ready": "WSL está listo.", + "wsl.onboarding.required": "Se necesita WSL para continuar.", + "wsl.onboarding.checkingDistros": "Comprobando distribuciones...", + "wsl.onboarding.installingDistro": "Instalando {{distro}}...", + "wsl.onboarding.checkingDistro": "Comprobando {{distro}}...", + "wsl.onboarding.listingDistros": "Listando distribuciones...", + "wsl.onboarding.distroReady": "La distribución {{distro}} está lista.", + "wsl.onboarding.distroNotInstalled": "La distribución {{distro}} aún no está instalada.", + "wsl.onboarding.openDistroOnce": "Abre {{distro}} una vez para completar la configuración.", + "wsl.onboarding.finishingDistro": "Completando la configuración de {{distro}}.", + "wsl.onboarding.pickDistro": "Elige una distribución o instala una abajo.", + "wsl.onboarding.checkingOpencode": "Comprobando OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "Comprobando OpenCode en {{distro}}...", + "wsl.onboarding.updatingOpencode": "Actualizando OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "Actualizando OpenCode en {{distro}}...", + "wsl.onboarding.updateOpencodeIn": "Actualiza OpenCode en {{distro}}.", + "wsl.onboarding.updateOpencode": "Actualizar OpenCode", + "wsl.onboarding.opencodeReadyIn": "OpenCode está listo en {{distro}}.", + "wsl.onboarding.opencodeReady": "OpenCode está listo.", + "wsl.onboarding.installOpencodeIn": "Instala OpenCode en {{distro}}.", + "wsl.onboarding.installOpencode": "Instalar OpenCode", + "wsl.onboarding.chooseDistroFirst": "Elige primero una distribución.", + "wsl.onboarding.loadFailed": "No se pudo cargar el estado de WSL.", + "wsl.onboarding.loading": "Cargando...", + "wsl.onboarding.installedDistros": "Distribuciones instaladas", + "wsl.onboarding.checkAgain": "Comprobar de nuevo", + "wsl.onboarding.distroStatus.ready": "Lista", + "wsl.onboarding.distroStatus.checking": "Comprobando...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode no está instalado", + "wsl.onboarding.distroStatus.missingTools": "Faltan bash y curl", + "wsl.onboarding.distroStatus.unsupported": "No compatible · Usa WSL 2", + "wsl.onboarding.needAnotherDistro": "¿Necesitas otra distribución?", + "wsl.onboarding.needAnotherDistroHint": "Instala una distribución de Linux desde el catálogo de WSL", + "wsl.onboarding.wslNotInstalled.title": "WSL no está instalado", + "wsl.onboarding.wslNotInstalled.description": + "Se necesita WSL (Subsistema de Windows para Linux) para que OpenCode pueda añadir un servidor WSL", + "wsl.onboarding.wslUnavailable.title": "WSL no disponible", + "wsl.onboarding.wslUnavailable.description": "OpenCode no pudo comprobar WSL en este equipo.", + "wsl.onboarding.installWsl": "Instalar WSL", + "wsl.onboarding.windowsRestartRequired": + "Reinicia Windows para terminar de instalar WSL y, después, vuelve a abrir OpenCode.", + "wsl.onboarding.next": "Siguiente", + "wsl.onboarding.refresh": "Actualizar", + "wsl.onboarding.allDistrosAdded": "Ya se han añadido todas las distribuciones instaladas.", + "wsl.onboarding.noDistros": "Aún no se han detectado distribuciones.", + "wsl.onboarding.install": "Instalar", + "wsl.onboarding.installing": "Instalando...", + "wsl.onboarding.installDistro": "Instalar distribución", + "wsl.onboarding.searchDistros": "Buscar distribuciones", + "wsl.onboarding.wsl2Required": "Se necesita WSL 2.", + "wsl.onboarding.toolsRequired": "Esta distribución necesita bash y curl.", + "wsl.onboarding.openTerminal": "Abrir terminal", + "wsl.onboarding.path": "Ruta: {{path}}", + "wsl.onboarding.notFound": "no encontrado", + "wsl.onboarding.version": "Versión: {{version}}", + "wsl.onboarding.unknown": "desconocida", + "wsl.onboarding.desktopVersion": "escritorio {{version}}", + "wsl.onboarding.versionMismatch": "La versión instalada no coincide con la versión de la aplicación de escritorio.", + "wsl.onboarding.adding": "Añadiendo...", "dialog.project.edit.title": "Editar proyecto", "dialog.project.edit.name": "Nombre", @@ -405,6 +486,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", @@ -453,10 +535,12 @@ export const dict = { "error.page.title": "Algo salió mal", "error.page.description": "Ocurrió un error al cargar la aplicación.", + "error.page.description.localServerStartup": "Ocurrió un error al iniciar el servidor local.", "error.page.details.label": "Detalles del error", "error.page.action.restart": "Reiniciar", "error.page.action.report": "Informar error", "error.page.action.reported": "Error informado", + "error.page.action.exportLogs": "Exportar registros", "error.page.action.checking": "Comprobando...", "error.page.action.checkUpdates": "Buscar actualizaciones", "error.page.action.updateTo": "Actualizar a {{version}}", @@ -505,11 +589,31 @@ export const dict = { "home.recentProjects": "Proyectos recientes", "home.empty.title": "Sin proyectos recientes", "home.empty.description": "Empieza abriendo un proyecto local", + "home.title": "Inicio", + "home.projects": "Proyectos", + "home.project.add": "Añadir proyecto", + "home.recentlyClosed": "Proyectos cerrados recientemente", + "home.server.collapse": "Contraer proyectos del servidor", + "home.server.expand": "Expandir proyectos del servidor", + "home.sessions.search.placeholder": "Buscar sesiones", + "home.sessions.search.placeholder.scoped": "Buscar sesiones en {{scope}}", + "home.sessions.search.sessions": "Sesiones", + "home.sessions.search.noResults": "No se encontraron sesiones para {{query}}", + "home.sessions.empty": "Aún no hay nada", + "home.sessions.empty.description": "Crea una sesión para empezar", + "home.sessions.group.today": "Hoy", + "home.sessions.group.yesterday": "Ayer", + "home.sessions.group.older": "Anteriores", "session.tab.session": "Sesión", "session.tab.review": "Revisión", "session.tab.context": "Contexto", + "session.tab.unknown": "Sesión desconocida", "session.panel.reviewAndFiles": "Revisión y archivos", + "session.error.notFound": "No se encuentra esta sesión", + "session.error.notFound.description": "Esta pestaña apunta a una sesión que ya no existe en este servidor.", + "session.error.notFound.closeTab": "Cerrar pestaña", + "session.error.serverConnection": "No se puede conectar a este servidor", "session.review.filesChanged": "{{count}} Archivos Cambiados", "session.review.change.one": "Cambio", "session.review.change.other": "Cambios", @@ -519,6 +623,8 @@ export const dict = { "session.review.noSnapshot": "El seguimiento de instantáneas está deshabilitado en la configuración, por lo que los cambios de sesión no están disponibles", "session.review.noChanges": "Sin cambios", + "session.review.noUncommittedChanges": "Aún no hay cambios sin confirmar", + "session.review.noBranchChanges": "Aún no hay cambios en la rama", "session.files.selectToOpen": "Selecciona un archivo para abrir", "session.files.all": "Todos los archivos", @@ -535,6 +641,10 @@ export const dict = { "session.todo.title": "Tareas", "session.todo.collapse": "Contraer", "session.todo.expand": "Expandir", + "session.question.minimize": "Minimizar pregunta", + "session.question.restore": "Restaurar pregunta", + "session.question.pending.one": "{{count}} pregunta pendiente", + "session.question.pending.other": "{{count}} preguntas pendientes", "session.followupDock.summary.one": "{{count}} mensaje en cola", "session.followupDock.summary.other": "{{count}} mensajes en cola", "session.followupDock.sendNow": "Enviar ahora", @@ -548,9 +658,16 @@ export const dict = { "session.revertDock.restore": "Restaurar mensaje", "session.new.title": "Construye lo que quieras", + "session.new.project.new": "Nuevo proyecto", + "session.new.project.search": "Buscar proyectos", + "session.new.project.add": "Añadir proyecto", "session.new.worktree.main": "Rama principal", "session.new.worktree.mainWithBranch": "Rama principal ({{branch}})", "session.new.worktree.create": "Crear nuevo árbol de trabajo", + "session.new.workspace.runIn": "Ejecutar sesión en", + "session.new.workspace.triggerLocal": "Local", + "session.new.workspace.local": "Repositorio local", + "session.new.workspace.existing": "Espacio de trabajo…", "session.new.lastModified": "Última modificación", "session.header.search.placeholder": "Buscar {{project}}", @@ -621,6 +738,8 @@ export const dict = { "sidebar.project.recentSessions": "Sesiones recientes", "sidebar.project.viewAllSessions": "Ver todas las sesiones", "sidebar.project.clearNotifications": "Borrar notificaciones", + "sidebar.empty.title": "No hay proyectos abiertos", + "sidebar.empty.description": "Abre un proyecto para empezar", "app.name.desktop": "OpenCode Desktop", @@ -633,6 +752,7 @@ export const dict = { "settings.desktop.wsl.description": "Ejecutar el servidor OpenCode dentro de WSL en Windows.", "settings.general.section.appearance": "Apariencia", + "settings.general.section.advanced": "Avanzado", "settings.general.section.notifications": "Notificaciones del sistema", "settings.general.section.updates": "Actualizaciones", "settings.general.section.sounds": "Efectos de sonido", @@ -641,6 +761,11 @@ export const dict = { "settings.general.row.language.title": "Idioma", "settings.general.row.language.description": "Cambiar el idioma de visualización para OpenCode", + "settings.general.row.shell.title": "Shell del terminal", + "settings.general.row.shell.description": + "Elige el shell que se usará en el terminal. Los shells compatibles también se usarán para las llamadas a herramientas del agente.", + "settings.general.row.shell.autoDefault": "Automático (Predeterminado)", + "settings.general.row.shell.terminalOnly": "solo en el terminal", "settings.general.row.appearance.title": "Apariencia", "settings.general.row.appearance.description": "Personaliza cómo se ve OpenCode en tu dispositivo", "settings.general.row.colorScheme.title": "Esquema de color", @@ -649,8 +774,8 @@ export const dict = { "settings.general.row.theme.description": "Personaliza el tema de OpenCode.", "settings.general.row.font.title": "Fuente de código", "settings.general.row.font.description": "Personaliza la fuente usada en bloques de código", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "Fuente del terminal", + "settings.general.row.terminalFont.description": "Personaliza la fuente utilizada en el terminal", "settings.general.row.uiFont.title": "Fuente de la interfaz", "settings.general.row.uiFont.description": "Personaliza la fuente usada en toda la interfaz", "settings.general.row.followup.title": "Comportamiento de seguimiento", @@ -658,6 +783,23 @@ export const dict = { "Elige si los prompts de seguimiento se dirigen inmediatamente o esperan en una cola", "settings.general.row.followup.option.queue": "Cola", "settings.general.row.followup.option.steer": "Dirigir", + "settings.general.row.showFileTree.title": "Árbol de archivos", + "settings.general.row.showFileTree.description": "Mostrar el panel del árbol de archivos en las sesiones", + "settings.general.row.showNavigation.title": "Controles de navegación", + "settings.general.row.showNavigation.description": + "Mostrar los botones para retroceder y avanzar en la barra de título de la aplicación de escritorio", + "settings.general.row.showSearch.title": "Paleta de comandos", + "settings.general.row.showSearch.description": + "Mostrar el botón de búsqueda y paleta de comandos en la barra de título", + "settings.general.row.showTerminal.title": "Terminal", + "settings.general.row.showTerminal.description": "Mostrar el botón del terminal en la barra de título", + "settings.general.row.showStatus.title": "Estado del servidor", + "settings.general.row.showStatus.description": "Mostrar el botón de estado del servidor en la barra de título", + "settings.general.row.mobileTitlebarBottom.title": "Navegación inferior", + "settings.general.row.mobileTitlebarBottom.description": + "Colocar la barra de título y las pestañas de sesión en la parte inferior de la pantalla en dispositivos móviles", + "settings.general.row.showCustomAgents.title": "Agentes personalizados", + "settings.general.row.showCustomAgents.description": "Mostrar el selector de agentes en el editor", "settings.general.row.reasoningSummaries.title": "Mostrar resúmenes de razonamiento", "settings.general.row.reasoningSummaries.description": "Mostrar resúmenes del razonamiento del modelo en la línea de tiempo", @@ -667,6 +809,12 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "Expandir partes de la herramienta de edición", "settings.general.row.editToolPartsExpanded.description": "Mostrar las partes de las herramientas de edición, escritura y parcheado expandidas por defecto en la línea de tiempo", + "settings.general.row.newLayoutDesigns.title": "Nuevo diseño y estilos", + "settings.general.row.newLayoutDesigns.description": + "Activar el nuevo diseño de la interfaz, la página de inicio, el editor y las sesiones", + "settings.general.row.pinchZoom.title": "Pellizcar para ampliar", + "settings.general.row.pinchZoom.description": + "Permitir ampliar con el gesto de pellizco del panel táctil y con Ctrl-scroll", "settings.general.row.wayland.title": "Usar Wayland nativo", "settings.general.row.wayland.description": "Deshabilitar fallback a X11 en Wayland. Requiere reinicio.", "settings.general.row.wayland.tooltip": @@ -682,6 +830,8 @@ export const dict = { "settings.updates.row.check.description": "Buscar actualizaciones manualmente e instalarlas si hay alguna", "settings.updates.action.checkNow": "Buscar ahora", "settings.updates.action.checking": "Buscando...", + "settings.updates.action.downloading": "Descargando...", + "settings.updates.action.installing": "Instalando...", "settings.updates.toast.latest.title": "Estás al día", "settings.updates.toast.latest.description": "Estás usando la última versión de OpenCode.", "sound.option.none": "Ninguno", diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts index 7ebd34e66b..77a543180d 100644 --- a/packages/app/src/i18n/fr.ts +++ b/packages/app/src/i18n/fr.ts @@ -21,6 +21,9 @@ export const dict = { "theme.scheme.dark": "Sombre", "command.sidebar.toggle": "Basculer la barre latérale", "command.project.open": "Ouvrir un projet", + "command.project.previous": "Projet précédent", + "command.project.next": "Projet suivant", + "command.project.index": "Passer au projet {{index}}", "command.provider.connect": "Connecter un fournisseur", "command.server.switch": "Changer de serveur", "command.settings.open": "Ouvrir les paramètres", @@ -39,6 +42,7 @@ export const dict = { "command.session.new": "Nouvelle session", "command.file.open": "Ouvrir un fichier", "command.tab.close": "Fermer l'onglet", + "command.tab.reopenClosed": "Rouvrir l'onglet fermé", "command.context.addSelection": "Ajouter la sélection au contexte", "command.context.addSelection.description": "Ajouter les lignes sélectionnées du fichier actuel", "command.input.focus": "Focus sur l'entrée", @@ -193,6 +197,11 @@ export const dict = { "model.input.video": "vidéo", "model.input.pdf": "pdf", "model.tooltip.allows": "Autorise : {{inputs}}", + "model.tooltip.context.label": "Contexte", + "model.tooltip.inputs": "Entrées", + "model.tooltip.model": "Modèle", + "model.tooltip.provider": "Fournisseur", + "model.tooltip.reasoning": "Raisonnement", "model.tooltip.reasoning.allowed": "Autorise le raisonnement", "model.tooltip.reasoning.none": "Sans raisonnement", "model.tooltip.context": "Limite de contexte {{limit}}", @@ -202,6 +211,7 @@ export const dict = { "common.loading": "Chargement", "common.loading.ellipsis": "...", "common.cancel": "Annuler", + "common.clear": "Effacer", "common.connect": "Connecter", "common.disconnect": "Déconnecter", "common.continue": "Soumettre", @@ -218,6 +228,8 @@ export const dict = { "prompt.mode.shell": "Shell", "prompt.mode.normal": "Prompt", "prompt.mode.shell.exit": "esc pour quitter", + "session.child.promptDisabled": "Les sessions de sous-agents ne peuvent pas recevoir de messages.", + "session.child.backToParent": "Revenir à la session principale.", "prompt.example.1": "Corriger un TODO dans la base de code", "prompt.example.2": "Quelle est la pile technique de ce projet ?", "prompt.example.3": "Réparer les tests échoués", @@ -315,6 +327,75 @@ export const dict = { "dialog.server.menu.delete": "Supprimer", "dialog.server.current": "Serveur actuel", "dialog.server.status.default": "Défaut", + "wsl.server.add": "Ajouter un serveur WSL", + "wsl.server.addShort": "Ajouter WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "Serveur WSL", + "wsl.server.retryStart": "Réessayer de démarrer", + "wsl.server.updating": "Mise à jour...", + "wsl.onboarding.step.distro": "Choisir une distribution", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "Vérification de WSL...", + "wsl.onboarding.restartRequired": "Windows doit redémarrer pour terminer l'installation de WSL.", + "wsl.onboarding.ready": "WSL est prêt.", + "wsl.onboarding.required": "WSL est requis pour continuer.", + "wsl.onboarding.checkingDistros": "Vérification des distributions...", + "wsl.onboarding.installingDistro": "Installation de {{distro}}...", + "wsl.onboarding.checkingDistro": "Vérification de {{distro}}...", + "wsl.onboarding.listingDistros": "Récupération de la liste des distributions...", + "wsl.onboarding.distroReady": "{{distro}} est prête.", + "wsl.onboarding.distroNotInstalled": "{{distro}} n'est pas encore installée.", + "wsl.onboarding.openDistroOnce": "Ouvrez {{distro}} une fois pour terminer la configuration.", + "wsl.onboarding.finishingDistro": "Finalisation de la configuration de {{distro}}.", + "wsl.onboarding.pickDistro": "Choisissez une distribution ou installez-en une ci-dessous.", + "wsl.onboarding.checkingOpencode": "Vérification d'OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "Vérification d'OpenCode dans {{distro}}...", + "wsl.onboarding.updatingOpencode": "Mise à jour d'OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "Mise à jour d'OpenCode dans {{distro}}...", + "wsl.onboarding.updateOpencodeIn": "Mettez à jour OpenCode dans {{distro}}.", + "wsl.onboarding.updateOpencode": "Mettre à jour OpenCode", + "wsl.onboarding.opencodeReadyIn": "OpenCode est prêt dans {{distro}}.", + "wsl.onboarding.opencodeReady": "OpenCode est prêt.", + "wsl.onboarding.installOpencodeIn": "Installez OpenCode dans {{distro}}.", + "wsl.onboarding.installOpencode": "Installer OpenCode", + "wsl.onboarding.chooseDistroFirst": "Choisissez d'abord une distribution.", + "wsl.onboarding.loadFailed": "Impossible de charger l'état de WSL.", + "wsl.onboarding.loading": "Chargement...", + "wsl.onboarding.installedDistros": "Distributions installées", + "wsl.onboarding.checkAgain": "Vérifier à nouveau", + "wsl.onboarding.distroStatus.ready": "Prête", + "wsl.onboarding.distroStatus.checking": "Vérification...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode non installé", + "wsl.onboarding.distroStatus.missingTools": "bash et curl manquants", + "wsl.onboarding.distroStatus.unsupported": "Non prise en charge · Utilisez WSL 2", + "wsl.onboarding.needAnotherDistro": "Besoin d'une autre distribution ?", + "wsl.onboarding.needAnotherDistroHint": "Installez une distribution Linux depuis le catalogue WSL", + "wsl.onboarding.wslNotInstalled.title": "WSL n'est pas installé", + "wsl.onboarding.wslNotInstalled.description": + "WSL (Windows Subsystem for Linux) est requis avant qu'OpenCode puisse ajouter un serveur WSL", + "wsl.onboarding.wslUnavailable.title": "WSL indisponible", + "wsl.onboarding.wslUnavailable.description": "OpenCode n'a pas pu vérifier WSL sur cet appareil.", + "wsl.onboarding.installWsl": "Installer WSL", + "wsl.onboarding.windowsRestartRequired": + "Redémarrez Windows pour terminer l'installation de WSL, puis rouvrez OpenCode.", + "wsl.onboarding.next": "Suivant", + "wsl.onboarding.refresh": "Actualiser", + "wsl.onboarding.allDistrosAdded": "Toutes les distributions installées ont déjà été ajoutées.", + "wsl.onboarding.noDistros": "Aucune distribution détectée pour l'instant.", + "wsl.onboarding.install": "Installer", + "wsl.onboarding.installing": "Installation...", + "wsl.onboarding.installDistro": "Installer une distribution", + "wsl.onboarding.searchDistros": "Rechercher des distributions", + "wsl.onboarding.wsl2Required": "WSL 2 est requis.", + "wsl.onboarding.toolsRequired": "Cette distribution nécessite bash et curl.", + "wsl.onboarding.openTerminal": "Ouvrir le terminal", + "wsl.onboarding.path": "Chemin : {{path}}", + "wsl.onboarding.notFound": "introuvable", + "wsl.onboarding.version": "Version : {{version}}", + "wsl.onboarding.unknown": "inconnue", + "wsl.onboarding.desktopVersion": "desktop {{version}}", + "wsl.onboarding.versionMismatch": "La version installée ne correspond pas à celle de l'application desktop.", + "wsl.onboarding.adding": "Ajout...", "dialog.project.edit.title": "Modifier le projet", "dialog.project.edit.name": "Nom", "dialog.project.edit.icon": "Icône", @@ -373,6 +454,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", "toast.language.title": "Langue", @@ -410,10 +492,12 @@ export const dict = { "toast.update.action.notYet": "Pas encore", "error.page.title": "Quelque chose s'est mal passé", "error.page.description": "Une erreur s'est produite lors du chargement de l'application.", + "error.page.description.localServerStartup": "Une erreur s'est produite lors du démarrage du serveur local.", "error.page.details.label": "Détails de l'erreur", "error.page.action.restart": "Redémarrer", "error.page.action.report": "Signaler l'erreur", "error.page.action.reported": "Erreur signalée", + "error.page.action.exportLogs": "Exporter les journaux", "error.page.action.checking": "Vérification...", "error.page.action.checkUpdates": "Vérifier les mises à jour", "error.page.action.updateTo": "Mettre à jour vers {{version}}", @@ -458,16 +542,38 @@ export const dict = { "home.recentProjects": "Projets récents", "home.empty.title": "Aucun projet récent", "home.empty.description": "Commencez par ouvrir un projet local", + "home.title": "Accueil", + "home.projects": "Projets", + "home.project.add": "Ajouter un projet", + "home.recentlyClosed": "Récemment fermés", + "home.server.collapse": "Réduire les projets du serveur", + "home.server.expand": "Développer les projets du serveur", + "home.sessions.search.placeholder": "Rechercher des sessions", + "home.sessions.search.placeholder.scoped": "Rechercher les sessions dans {{scope}}", + "home.sessions.search.sessions": "Sessions", + "home.sessions.search.noResults": "Aucune session trouvée pour {{query}}", + "home.sessions.empty": "Rien ici pour l'instant", + "home.sessions.empty.description": "Créez une session pour commencer", + "home.sessions.group.today": "Aujourd'hui", + "home.sessions.group.yesterday": "Hier", + "home.sessions.group.older": "Plus anciennes", "session.tab.session": "Session", "session.tab.review": "Revue", "session.tab.context": "Contexte", + "session.tab.unknown": "Session inconnue", "session.panel.reviewAndFiles": "Revue et fichiers", + "session.error.notFound": "Cette session est introuvable", + "session.error.notFound.description": "Cet onglet pointe vers une session qui n'existe plus sur ce serveur.", + "session.error.notFound.closeTab": "Fermer l'onglet", + "session.error.serverConnection": "Impossible de se connecter à ce serveur", "session.review.filesChanged": "{{count}} fichiers modifiés", "session.review.change.one": "Modification", "session.review.change.other": "Modifications", "session.review.loadingChanges": "Chargement des modifications...", "session.review.empty": "Aucune modification dans cette session pour l'instant", "session.review.noChanges": "Aucune modification", + "session.review.noUncommittedChanges": "Aucune modification non validée pour l'instant", + "session.review.noBranchChanges": "Aucune modification de branche pour l'instant", "session.review.noVcs": "Aucun système de contrôle de version Git détecté, modifications non affichées", "session.review.noSnapshot": "Le suivi des instantanés est désactivé dans la configuration, les modifications de session sont donc indisponibles", @@ -484,6 +590,10 @@ export const dict = { "session.todo.title": "Tâches", "session.todo.collapse": "Réduire", "session.todo.expand": "Développer", + "session.question.minimize": "Réduire la question", + "session.question.restore": "Restaurer la question", + "session.question.pending.one": "{{count}} question en attente", + "session.question.pending.other": "{{count}} questions en attente", "session.followupDock.summary.one": "{{count}} message en file d'attente", "session.followupDock.summary.other": "{{count}} messages en file d'attente", "session.followupDock.sendNow": "Envoyer maintenant", @@ -496,9 +606,16 @@ export const dict = { "session.revertDock.expand": "Développer les messages annulés", "session.revertDock.restore": "Restaurer le message", "session.new.title": "Créez ce que vous voulez", + "session.new.project.new": "Nouveau projet", + "session.new.project.search": "Rechercher des projets", + "session.new.project.add": "Ajouter un projet", "session.new.worktree.main": "Branche principale", "session.new.worktree.mainWithBranch": "Branche principale ({{branch}})", "session.new.worktree.create": "Créer un nouvel arbre de travail", + "session.new.workspace.runIn": "Exécuter la session dans", + "session.new.workspace.triggerLocal": "Local", + "session.new.workspace.local": "Dépôt local", + "session.new.workspace.existing": "Espace de travail…", "session.new.lastModified": "Dernière modification", "session.header.search.placeholder": "Rechercher {{project}}", "session.header.searchFiles": "Rechercher des fichiers", @@ -564,6 +681,8 @@ export const dict = { "sidebar.project.recentSessions": "Sessions récentes", "sidebar.project.viewAllSessions": "Voir toutes les sessions", "sidebar.project.clearNotifications": "Effacer les notifications", + "sidebar.empty.title": "Aucun projet ouvert", + "sidebar.empty.description": "Ouvrez un projet pour commencer", "app.name.desktop": "OpenCode Desktop", "settings.section.desktop": "Bureau", "settings.section.server": "Serveur", @@ -573,6 +692,7 @@ export const dict = { "settings.desktop.wsl.title": "Intégration WSL", "settings.desktop.wsl.description": "Exécuter le serveur OpenCode dans WSL sur Windows.", "settings.general.section.appearance": "Apparence", + "settings.general.section.advanced": "Avancé", "settings.general.section.notifications": "Notifications système", "settings.general.section.updates": "Mises à jour", "settings.general.section.sounds": "Effets sonores", @@ -580,6 +700,11 @@ export const dict = { "settings.general.section.display": "Affichage", "settings.general.row.language.title": "Langue", "settings.general.row.language.description": "Changer la langue d'affichage pour OpenCode", + "settings.general.row.shell.title": "Shell du terminal", + "settings.general.row.shell.description": + "Choisissez le shell utilisé par votre terminal. Les shells compatibles sont également utilisés pour les appels d'outils de l'agent.", + "settings.general.row.shell.autoDefault": "Auto (par défaut)", + "settings.general.row.shell.terminalOnly": "terminal uniquement", "settings.general.row.appearance.title": "Apparence", "settings.general.row.appearance.description": "Personnaliser l'apparence d'OpenCode sur votre appareil", "settings.general.row.colorScheme.title": "Schéma de couleurs", @@ -588,8 +713,8 @@ export const dict = { "settings.general.row.theme.description": "Personnaliser le thème d'OpenCode.", "settings.general.row.font.title": "Police de code", "settings.general.row.font.description": "Personnaliser la police utilisée dans les blocs de code", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "Police du terminal", + "settings.general.row.terminalFont.description": "Personnalisez la police utilisée dans le terminal", "settings.general.row.uiFont.title": "Police de l'interface", "settings.general.row.uiFont.description": "Personnaliser la police utilisée dans toute l'interface", "settings.general.row.followup.title": "Comportement de suivi", @@ -597,6 +722,24 @@ export const dict = { "Choisissez si les messages de suivi dirigent immédiatement ou attendent dans une file d'attente", "settings.general.row.followup.option.queue": "File d'attente", "settings.general.row.followup.option.steer": "Diriger", + "settings.general.row.showFileTree.title": "Arborescence des fichiers", + "settings.general.row.showFileTree.description": "Afficher le panneau d'arborescence des fichiers dans les sessions", + "settings.general.row.showNavigation.title": "Commandes de navigation", + "settings.general.row.showNavigation.description": + "Afficher les boutons précédent et suivant dans la barre de titre de l'application desktop", + "settings.general.row.showSearch.title": "Palette de commandes", + "settings.general.row.showSearch.description": + "Afficher le bouton de recherche et de palette de commandes dans la barre de titre", + "settings.general.row.showTerminal.title": "Terminal", + "settings.general.row.showTerminal.description": + "Afficher le bouton du terminal dans la barre de titre de l'application desktop", + "settings.general.row.showStatus.title": "État du serveur", + "settings.general.row.showStatus.description": "Afficher le bouton d'état du serveur dans la barre de titre", + "settings.general.row.mobileTitlebarBottom.title": "Navigation en bas", + "settings.general.row.mobileTitlebarBottom.description": + "Placer la barre de titre et les onglets de session en bas de l'écran sur mobile", + "settings.general.row.showCustomAgents.title": "Agents personnalisés", + "settings.general.row.showCustomAgents.description": "Afficher le sélecteur d'agent dans la zone de saisie", "settings.general.row.reasoningSummaries.title": "Afficher les résumés de raisonnement", "settings.general.row.reasoningSummaries.description": "Afficher les résumés de raisonnement du modèle dans la chronologie", @@ -606,6 +749,12 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "Développer les parties de l'outil edit", "settings.general.row.editToolPartsExpanded.description": "Afficher les parties des outils edit, write et patch développées par défaut dans la chronologie", + "settings.general.row.newLayoutDesigns.title": "Nouvelle mise en page et nouveaux designs", + "settings.general.row.newLayoutDesigns.description": + "Activer la nouvelle mise en page et les nouvelles interfaces d'accueil, de saisie et de session", + "settings.general.row.pinchZoom.title": "Pincer pour zoomer", + "settings.general.row.pinchZoom.description": + "Autoriser les gestes de pincement du pavé tactile et Ctrl-défilement pour zoomer", "settings.general.row.wayland.title": "Utiliser Wayland natif", "settings.general.row.wayland.description": "Désactiver le repli X11 sur Wayland. Nécessite un redémarrage.", "settings.general.row.wayland.tooltip": @@ -618,6 +767,8 @@ export const dict = { "settings.updates.row.check.description": "Vérifier manuellement les mises à jour et installer si disponible", "settings.updates.action.checkNow": "Vérifier maintenant", "settings.updates.action.checking": "Vérification...", + "settings.updates.action.downloading": "Téléchargement...", + "settings.updates.action.installing": "Installation...", "settings.updates.toast.latest.title": "Vous êtes à jour", "settings.updates.toast.latest.description": "Vous utilisez la dernière version d'OpenCode.", "sound.option.none": "Aucun", diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts index ad5dcf5387..24d1a29e8a 100644 --- a/packages/app/src/i18n/ja.ts +++ b/packages/app/src/i18n/ja.ts @@ -21,6 +21,9 @@ export const dict = { "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": "設定を開く", @@ -39,6 +42,7 @@ export const dict = { "command.session.new": "新しいセッション", "command.file.open": "ファイルを開く", "command.tab.close": "タブを閉じる", + "command.tab.reopenClosed": "閉じたタブを再度開く", "command.context.addSelection": "選択範囲をコンテキストに追加", "command.context.addSelection.description": "現在のファイルから選択した行を追加", "command.input.focus": "入力欄にフォーカス", @@ -149,7 +153,7 @@ export const dict = { "provider.custom.field.providerID.placeholder": "myprovider", "provider.custom.field.providerID.description": "小文字、数字、ハイフン、アンダースコア", "provider.custom.field.name.label": "表示名", - "provider.custom.field.name.placeholder": "My AI Provider", + "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キー", @@ -192,6 +196,11 @@ export const dict = { "model.input.video": "動画", "model.input.pdf": "pdf", "model.tooltip.allows": "対応: {{inputs}}", + "model.tooltip.context.label": "コンテキスト", + "model.tooltip.inputs": "入力", + "model.tooltip.model": "モデル", + "model.tooltip.provider": "プロバイダー", + "model.tooltip.reasoning": "推論", "model.tooltip.reasoning.allowed": "推論を許可", "model.tooltip.reasoning.none": "推論なし", "model.tooltip.context": "コンテキスト上限 {{limit}}", @@ -201,6 +210,7 @@ export const dict = { "common.loading": "読み込み中", "common.loading.ellipsis": "...", "common.cancel": "キャンセル", + "common.clear": "クリア", "common.connect": "接続", "common.disconnect": "切断", "common.continue": "送信", @@ -217,6 +227,8 @@ export const dict = { "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": "壊れたテストを修正", @@ -313,6 +325,75 @@ export const dict = { "dialog.server.menu.delete": "削除", "dialog.server.current": "現在のサーバー", "dialog.server.status.default": "デフォルト", + "wsl.server.add": "WSLサーバーを追加", + "wsl.server.addShort": "WSLを追加", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "WSLサーバー", + "wsl.server.retryStart": "起動を再試行", + "wsl.server.updating": "更新中...", + "wsl.onboarding.step.distro": "ディストリビューションを選択", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "WSLを確認中...", + "wsl.onboarding.restartRequired": "WSLのインストールを完了するにはWindowsの再起動が必要です。", + "wsl.onboarding.ready": "WSLの準備ができました。", + "wsl.onboarding.required": "続行するにはWSLが必要です。", + "wsl.onboarding.checkingDistros": "ディストリビューションを確認中...", + "wsl.onboarding.installingDistro": "{{distro}}をインストール中...", + "wsl.onboarding.checkingDistro": "{{distro}}を確認中...", + "wsl.onboarding.listingDistros": "ディストリビューションの一覧を取得中...", + "wsl.onboarding.distroReady": "{{distro}}の準備ができました。", + "wsl.onboarding.distroNotInstalled": "{{distro}}はまだインストールされていません。", + "wsl.onboarding.openDistroOnce": "セットアップを完了するには、{{distro}}を一度開いてください。", + "wsl.onboarding.finishingDistro": "{{distro}}のセットアップを完了しています。", + "wsl.onboarding.pickDistro": "ディストリビューションを選択するか、以下からインストールしてください。", + "wsl.onboarding.checkingOpencode": "OpenCodeを確認中...", + "wsl.onboarding.checkingOpencodeIn": "{{distro}}内のOpenCodeを確認中...", + "wsl.onboarding.updatingOpencode": "OpenCodeを更新中...", + "wsl.onboarding.updatingOpencodeIn": "{{distro}}内のOpenCodeを更新中...", + "wsl.onboarding.updateOpencodeIn": "{{distro}}内のOpenCodeを更新してください。", + "wsl.onboarding.updateOpencode": "OpenCodeを更新", + "wsl.onboarding.opencodeReadyIn": "{{distro}}内のOpenCodeの準備ができました。", + "wsl.onboarding.opencodeReady": "OpenCodeの準備ができました。", + "wsl.onboarding.installOpencodeIn": "{{distro}}にOpenCodeをインストールしてください。", + "wsl.onboarding.installOpencode": "OpenCodeをインストール", + "wsl.onboarding.chooseDistroFirst": "先にディストリビューションを選択してください。", + "wsl.onboarding.loadFailed": "WSLの状態を読み込めませんでした。", + "wsl.onboarding.loading": "読み込み中...", + "wsl.onboarding.installedDistros": "インストール済みのディストリビューション", + "wsl.onboarding.checkAgain": "再確認", + "wsl.onboarding.distroStatus.ready": "準備完了", + "wsl.onboarding.distroStatus.checking": "確認中...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCodeがインストールされていません", + "wsl.onboarding.distroStatus.missingTools": "bash、curlがありません", + "wsl.onboarding.distroStatus.unsupported": "非対応 · WSL 2を使用してください", + "wsl.onboarding.needAnotherDistro": "別のディストリビューションが必要ですか?", + "wsl.onboarding.needAnotherDistroHint": "WSLカタログからLinuxディストリビューションをインストール", + "wsl.onboarding.wslNotInstalled.title": "WSLがインストールされていません", + "wsl.onboarding.wslNotInstalled.description": + "OpenCodeでWSLサーバーを追加するには、WSL (Windows Subsystem for Linux) が必要です", + "wsl.onboarding.wslUnavailable.title": "WSLを利用できません", + "wsl.onboarding.wslUnavailable.description": "このマシンのWSLを確認できませんでした。", + "wsl.onboarding.installWsl": "WSLをインストール", + "wsl.onboarding.windowsRestartRequired": + "WSLのインストールを完了するにはWindowsを再起動し、OpenCodeをもう一度開いてください。", + "wsl.onboarding.next": "次へ", + "wsl.onboarding.refresh": "更新", + "wsl.onboarding.allDistrosAdded": "インストール済みのディストリビューションはすべて追加済みです。", + "wsl.onboarding.noDistros": "ディストリビューションはまだ検出されていません。", + "wsl.onboarding.install": "インストール", + "wsl.onboarding.installing": "インストール中...", + "wsl.onboarding.installDistro": "ディストリビューションをインストール", + "wsl.onboarding.searchDistros": "ディストリビューションを検索", + "wsl.onboarding.wsl2Required": "WSL 2が必要です。", + "wsl.onboarding.toolsRequired": "このディストリビューションにはbashとcurlが必要です。", + "wsl.onboarding.openTerminal": "ターミナルを開く", + "wsl.onboarding.path": "パス: {{path}}", + "wsl.onboarding.notFound": "見つかりません", + "wsl.onboarding.version": "バージョン: {{version}}", + "wsl.onboarding.unknown": "不明", + "wsl.onboarding.desktopVersion": "デスクトップ {{version}}", + "wsl.onboarding.versionMismatch": "インストールされているバージョンがデスクトップアプリのバージョンと一致しません。", + "wsl.onboarding.adding": "追加中...", "dialog.project.edit.title": "プロジェクトを編集", "dialog.project.edit.name": "名前", "dialog.project.edit.icon": "アイコン", @@ -370,6 +451,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", "toast.language.title": "言語", @@ -406,10 +488,12 @@ export const dict = { "toast.update.action.notYet": "今はしない", "error.page.title": "問題が発生しました", "error.page.description": "アプリケーションの読み込み中にエラーが発生しました。", + "error.page.description.localServerStartup": "ローカルサーバーの起動中にエラーが発生しました。", "error.page.details.label": "エラー詳細", "error.page.action.restart": "再起動", "error.page.action.report": "エラーを報告", "error.page.action.reported": "エラーを報告しました", + "error.page.action.exportLogs": "ログをエクスポート", "error.page.action.checking": "確認中...", "error.page.action.checkUpdates": "アップデートを確認", "error.page.action.updateTo": "{{version}}にアップデート", @@ -451,10 +535,30 @@ export const dict = { "home.recentProjects": "最近のプロジェクト", "home.empty.title": "最近のプロジェクトはありません", "home.empty.description": "ローカルプロジェクトを開いて始めましょう", + "home.title": "ホーム", + "home.projects": "プロジェクト", + "home.project.add": "プロジェクトを追加", + "home.recentlyClosed": "最近閉じたプロジェクト", + "home.server.collapse": "サーバーのプロジェクトを折りたたむ", + "home.server.expand": "サーバーのプロジェクトを展開", + "home.sessions.search.placeholder": "セッションを検索", + "home.sessions.search.placeholder.scoped": "{{scope}}のセッションを検索", + "home.sessions.search.sessions": "セッション", + "home.sessions.search.noResults": "{{query}}に一致するセッションが見つかりません", + "home.sessions.empty": "まだ何もありません", + "home.sessions.empty.description": "セッションを作成して始めましょう", + "home.sessions.group.today": "今日", + "home.sessions.group.yesterday": "昨日", + "home.sessions.group.older": "それ以前", "session.tab.session": "セッション", "session.tab.review": "レビュー", "session.tab.context": "コンテキスト", + "session.tab.unknown": "不明なセッション", "session.panel.reviewAndFiles": "レビューとファイル", + "session.error.notFound": "このセッションが見つかりません", + "session.error.notFound.description": "このタブが参照するセッションは、このサーバーには存在しません。", + "session.error.notFound.closeTab": "タブを閉じる", + "session.error.serverConnection": "このサーバーに接続できません", "session.review.filesChanged": "{{count}} ファイル変更", "session.review.change.one": "変更", "session.review.change.other": "変更", @@ -463,6 +567,8 @@ export const dict = { "session.review.noVcs": "Gitバージョン管理システムが検出されないため、変更は表示されません", "session.review.noSnapshot": "設定でスナップショット追跡が無効になっているため、セッションの変更は利用できません", "session.review.noChanges": "変更なし", + "session.review.noUncommittedChanges": "コミットされていない変更はまだありません", + "session.review.noBranchChanges": "ブランチの変更はまだありません", "session.files.selectToOpen": "開くファイルを選択", "session.files.all": "すべてのファイル", "session.files.empty": "ファイルなし", @@ -476,6 +582,10 @@ export const dict = { "session.todo.title": "ToDo", "session.todo.collapse": "折りたたむ", "session.todo.expand": "展開", + "session.question.minimize": "質問を最小化", + "session.question.restore": "質問を復元", + "session.question.pending.one": "{{count}}件の保留中の質問", + "session.question.pending.other": "{{count}}件の保留中の質問", "session.followupDock.summary.one": "{{count}} 件のメッセージが待機中", "session.followupDock.summary.other": "{{count}} 件のメッセージが待機中", "session.followupDock.sendNow": "今すぐ送信", @@ -488,9 +598,16 @@ export const dict = { "session.revertDock.expand": "ロールバックされたメッセージを展開", "session.revertDock.restore": "メッセージを復元", "session.new.title": "何でも作る", + "session.new.project.new": "新しいプロジェクト", + "session.new.project.search": "プロジェクトを検索", + "session.new.project.add": "プロジェクトを追加", "session.new.worktree.main": "メインブランチ", "session.new.worktree.mainWithBranch": "メインブランチ ({{branch}})", "session.new.worktree.create": "新しいワークツリーを作成", + "session.new.workspace.runIn": "セッションの実行先", + "session.new.workspace.triggerLocal": "ローカル", + "session.new.workspace.local": "ローカルリポジトリ", + "session.new.workspace.existing": "ワークスペース…", "session.new.lastModified": "最終更新", "session.header.search.placeholder": "{{project}}を検索", "session.header.searchFiles": "ファイルを検索", @@ -554,6 +671,8 @@ export const dict = { "sidebar.project.recentSessions": "最近のセッション", "sidebar.project.viewAllSessions": "すべてのセッションを表示", "sidebar.project.clearNotifications": "通知をクリア", + "sidebar.empty.title": "開いているプロジェクトはありません", + "sidebar.empty.description": "プロジェクトを開いて始めましょう", "app.name.desktop": "OpenCode Desktop", "settings.section.desktop": "デスクトップ", "settings.section.server": "サーバー", @@ -563,6 +682,7 @@ export const dict = { "settings.desktop.wsl.title": "WSL連携", "settings.desktop.wsl.description": "WindowsのWSL環境でOpenCodeサーバーを実行します。", "settings.general.section.appearance": "外観", + "settings.general.section.advanced": "詳細設定", "settings.general.section.notifications": "システム通知", "settings.general.section.updates": "アップデート", "settings.general.section.sounds": "効果音", @@ -570,6 +690,11 @@ export const dict = { "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": "配色", @@ -578,8 +703,8 @@ export const dict = { "settings.general.row.theme.description": "OpenCodeのテーマをカスタマイズします。", "settings.general.row.font.title": "コードフォント", "settings.general.row.font.description": "コードブロックで使用するフォントをカスタマイズします", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "ターミナルのフォント", + "settings.general.row.terminalFont.description": "ターミナルで使用するフォントをカスタマイズ", "settings.general.row.uiFont.title": "UIフォント", "settings.general.row.uiFont.description": "インターフェース全体で使用するフォントをカスタマイズします", "settings.general.row.followup.title": "フォローアップの動作", @@ -587,6 +712,21 @@ export const dict = { "フォローアッププロンプトを即座に実行するか、キューで待機させるかを選択します", "settings.general.row.followup.option.queue": "キューに追加", "settings.general.row.followup.option.steer": "即座に実行 (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.mobileTitlebarBottom.title": "下部ナビゲーション", + "settings.general.row.mobileTitlebarBottom.description": + "モバイルではタイトルバーとセッションタブを画面下部に配置します", + "settings.general.row.showCustomAgents.title": "カスタムエージェント", + "settings.general.row.showCustomAgents.description": "コンポーザーにエージェント選択を表示します", "settings.general.row.reasoningSummaries.title": "推論の要約を表示", "settings.general.row.reasoningSummaries.description": "タイムラインにモデルの推論の要約を表示します", "settings.general.row.shellToolPartsExpanded.title": "shell ツールパーツを展開", @@ -595,6 +735,12 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "edit ツールパーツを展開", "settings.general.row.editToolPartsExpanded.description": "タイムラインで edit、write、patch ツールパーツをデフォルトで展開して表示します", + "settings.general.row.newLayoutDesigns.title": "新しいレイアウトとデザイン", + "settings.general.row.newLayoutDesigns.description": + "刷新されたレイアウト、ホーム、コンポーザー、セッションUIを有効にします", + "settings.general.row.pinchZoom.title": "ピンチでズーム", + "settings.general.row.pinchZoom.description": + "トラックパッドのピンチ操作とCtrl+スクロール操作によるズームを許可します", "settings.general.row.wayland.title": "ネイティブWaylandを使用", "settings.general.row.wayland.description": "WaylandでのX11フォールバックを無効にします。再起動が必要です。", "settings.general.row.wayland.tooltip": @@ -607,6 +753,8 @@ export const dict = { "settings.updates.row.check.description": "手動でアップデートを確認し、利用可能ならインストールします", "settings.updates.action.checkNow": "今すぐ確認", "settings.updates.action.checking": "確認中...", + "settings.updates.action.downloading": "ダウンロード中...", + "settings.updates.action.installing": "インストール中...", "settings.updates.toast.latest.title": "最新です", "settings.updates.toast.latest.description": "OpenCode は最新バージョンです。", "sound.option.none": "なし", diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts index 15f1f28013..cf789f5644 100644 --- a/packages/app/src/i18n/ko.ts +++ b/packages/app/src/i18n/ko.ts @@ -575,8 +575,8 @@ export const dict = { "settings.general.row.theme.description": "OpenCode 테마 사용자 지정", "settings.general.row.font.title": "코드 글꼴", "settings.general.row.font.description": "코드 블록에 사용되는 글꼴을 사용자 지정", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "터미널 글꼴", + "settings.general.row.terminalFont.description": "터미널에서 사용할 글꼴을 설정합니다", "settings.general.row.uiFont.title": "UI 글꼴", "settings.general.row.uiFont.description": "인터페이스 전반에 사용되는 글꼴을 사용자 지정", "settings.general.row.followup.title": "후속 조치 동작", @@ -848,4 +848,155 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "영구 프로젝트 아이콘 생성 실패", "error.childStore.storeCreateFailed": "저장소 생성 실패", "terminal.connectionLost.abnormalClose": "WebSocket이 비정상적으로 닫힘: {{code}}", + + "command.project.previous": "이전 프로젝트", + "command.project.next": "다음 프로젝트", + "command.project.index": "{{index}}번 프로젝트로 전환", + "command.tab.reopenClosed": "닫은 탭 다시 열기", + "model.tooltip.context.label": "컨텍스트", + "model.tooltip.inputs": "입력", + "model.tooltip.model": "모델", + "model.tooltip.provider": "공급자", + "model.tooltip.reasoning": "추론", + "common.clear": "지우기", + "session.child.promptDisabled": "하위 에이전트 세션에는 프롬프트를 입력할 수 없습니다.", + "session.child.backToParent": "메인 세션으로 돌아가기.", + + "wsl.server.add": "WSL 서버 추가", + "wsl.server.addShort": "WSL 추가", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "WSL 서버", + "wsl.server.retryStart": "시작 재시도", + "wsl.server.updating": "업데이트 중...", + "wsl.onboarding.step.distro": "배포판 선택", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "WSL 확인 중...", + "wsl.onboarding.restartRequired": "WSL 설치를 완료하려면 Windows를 다시 시작해야 합니다.", + "wsl.onboarding.ready": "WSL이 준비되었습니다.", + "wsl.onboarding.required": "계속하려면 WSL이 필요합니다.", + "wsl.onboarding.checkingDistros": "배포판 확인 중...", + "wsl.onboarding.installingDistro": "{{distro}} 배포판 설치 중...", + "wsl.onboarding.checkingDistro": "{{distro}} 배포판 확인 중...", + "wsl.onboarding.listingDistros": "배포판 목록 확인 중...", + "wsl.onboarding.distroReady": "{{distro}} 배포판이 준비되었습니다.", + "wsl.onboarding.distroNotInstalled": "{{distro}} 배포판이 아직 설치되지 않았습니다.", + "wsl.onboarding.openDistroOnce": "설정을 완료하려면 {{distro}} 배포판을 한 번 여세요.", + "wsl.onboarding.finishingDistro": "{{distro}} 배포판 설정을 마무리하는 중입니다.", + "wsl.onboarding.pickDistro": "배포판을 선택하거나 아래에서 설치하세요.", + "wsl.onboarding.checkingOpencode": "OpenCode 확인 중...", + "wsl.onboarding.checkingOpencodeIn": "{{distro}}에서 OpenCode 확인 중...", + "wsl.onboarding.updatingOpencode": "OpenCode 업데이트 중...", + "wsl.onboarding.updatingOpencodeIn": "{{distro}}에서 OpenCode 업데이트 중...", + "wsl.onboarding.updateOpencodeIn": "{{distro}}에서 OpenCode를 업데이트하세요.", + "wsl.onboarding.updateOpencode": "OpenCode 업데이트", + "wsl.onboarding.opencodeReadyIn": "{{distro}}에서 OpenCode를 사용할 준비가 되었습니다.", + "wsl.onboarding.opencodeReady": "OpenCode가 준비되었습니다.", + "wsl.onboarding.installOpencodeIn": "{{distro}}에 OpenCode를 설치하세요.", + "wsl.onboarding.installOpencode": "OpenCode 설치", + "wsl.onboarding.chooseDistroFirst": "먼저 배포판을 선택하세요.", + "wsl.onboarding.loadFailed": "WSL 상태를 불러오지 못했습니다.", + "wsl.onboarding.loading": "로딩 중...", + "wsl.onboarding.installedDistros": "설치된 배포판", + "wsl.onboarding.checkAgain": "다시 확인", + "wsl.onboarding.distroStatus.ready": "준비됨", + "wsl.onboarding.distroStatus.checking": "확인 중...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode가 설치되지 않음", + "wsl.onboarding.distroStatus.missingTools": "bash, curl 없음", + "wsl.onboarding.distroStatus.unsupported": "지원되지 않음 · WSL 2 사용", + "wsl.onboarding.needAnotherDistro": "다른 배포판이 필요하신가요?", + "wsl.onboarding.needAnotherDistroHint": "WSL 카탈로그에서 Linux 배포판을 설치하세요", + "wsl.onboarding.wslNotInstalled.title": "WSL이 설치되지 않음", + "wsl.onboarding.wslNotInstalled.description": + "OpenCode에서 WSL 서버를 추가하려면 WSL (Windows Subsystem for Linux)이 필요합니다", + "wsl.onboarding.wslUnavailable.title": "WSL을 사용할 수 없음", + "wsl.onboarding.wslUnavailable.description": "OpenCode에서 이 컴퓨터의 WSL을 확인할 수 없습니다.", + "wsl.onboarding.installWsl": "WSL 설치", + "wsl.onboarding.windowsRestartRequired": "WSL 설치를 완료하려면 Windows를 다시 시작한 다음 OpenCode를 다시 여세요.", + "wsl.onboarding.next": "다음", + "wsl.onboarding.refresh": "새로 고침", + "wsl.onboarding.allDistrosAdded": "설치된 모든 배포판이 이미 추가되었습니다.", + "wsl.onboarding.noDistros": "아직 감지된 배포판이 없습니다.", + "wsl.onboarding.install": "설치", + "wsl.onboarding.installing": "설치 중...", + "wsl.onboarding.installDistro": "배포판 설치", + "wsl.onboarding.searchDistros": "배포판 검색", + "wsl.onboarding.wsl2Required": "WSL 2가 필요합니다.", + "wsl.onboarding.toolsRequired": "이 배포판에는 bash와 curl이 필요합니다.", + "wsl.onboarding.openTerminal": "터미널 열기", + "wsl.onboarding.path": "경로: {{path}}", + "wsl.onboarding.notFound": "찾을 수 없음", + "wsl.onboarding.version": "버전: {{version}}", + "wsl.onboarding.unknown": "알 수 없음", + "wsl.onboarding.desktopVersion": "데스크톱 {{version}}", + "wsl.onboarding.versionMismatch": "설치된 버전이 데스크톱 앱 버전과 일치하지 않습니다.", + "wsl.onboarding.adding": "추가 중...", + + "language.uk": "Українська", + "error.page.description.localServerStartup": "로컬 서버를 시작하는 동안 오류가 발생했습니다.", + "error.page.action.exportLogs": "로그 내보내기", + + "home.title": "홈", + "home.projects": "프로젝트", + "home.project.add": "프로젝트 추가", + "home.recentlyClosed": "최근에 닫은 항목", + "home.server.collapse": "서버 프로젝트 접기", + "home.server.expand": "서버 프로젝트 펼치기", + "home.sessions.search.placeholder": "세션 검색", + "home.sessions.search.placeholder.scoped": "{{scope}}에서 세션 검색", + "home.sessions.search.sessions": "세션", + "home.sessions.search.noResults": "{{query}}에 해당하는 세션을 찾을 수 없습니다", + "home.sessions.empty": "아직 아무것도 없습니다", + "home.sessions.empty.description": "세션을 생성하여 시작하세요", + "home.sessions.group.today": "오늘", + "home.sessions.group.yesterday": "어제", + "home.sessions.group.older": "이전", + + "session.tab.unknown": "알 수 없는 세션", + "session.error.notFound": "이 세션을 찾을 수 없습니다", + "session.error.notFound.description": "이 탭은 이 서버에 더 이상 존재하지 않는 세션을 가리킵니다.", + "session.error.notFound.closeTab": "탭 닫기", + "session.error.serverConnection": "이 서버에 연결할 수 없습니다", + "session.review.noUncommittedChanges": "아직 커밋되지 않은 변경 사항이 없습니다", + "session.review.noBranchChanges": "아직 브랜치 변경 사항이 없습니다", + "session.question.minimize": "질문 최소화", + "session.question.restore": "질문 복원", + "session.question.pending.one": "{{count}}개의 대기 중인 질문", + "session.question.pending.other": "{{count}}개의 대기 중인 질문", + "session.new.project.new": "새 프로젝트", + "session.new.project.search": "프로젝트 검색", + "session.new.project.add": "프로젝트 추가", + "session.new.workspace.runIn": "세션 실행 위치", + "session.new.workspace.triggerLocal": "로컬", + "session.new.workspace.local": "로컬 저장소", + "session.new.workspace.existing": "작업 공간…", + + "sidebar.empty.title": "열린 프로젝트 없음", + "sidebar.empty.description": "프로젝트를 열어 시작하세요", + + "settings.general.section.advanced": "고급", + "settings.general.row.shell.title": "터미널 셸", + "settings.general.row.shell.description": + "터미널에서 사용할 셸을 선택하세요. 호환되는 셸은 에이전트 도구 호출에도 사용됩니다.", + "settings.general.row.shell.autoDefault": "자동 (기본값)", + "settings.general.row.shell.terminalOnly": "터미널 전용", + "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.mobileTitlebarBottom.title": "하단 탐색", + "settings.general.row.mobileTitlebarBottom.description": "모바일에서 제목 표시줄과 세션 탭을 화면 하단에 배치", + "settings.general.row.showCustomAgents.title": "사용자 지정 에이전트", + "settings.general.row.showCustomAgents.description": "입력창에 에이전트 선택기 표시", + "settings.general.row.newLayoutDesigns.title": "새 레이아웃 및 디자인", + "settings.general.row.newLayoutDesigns.description": "새롭게 디자인된 레이아웃, 홈, 입력창 및 세션 UI 활성화", + "settings.general.row.pinchZoom.title": "핀치 줌", + "settings.general.row.pinchZoom.description": "트랙패드 핀치 및 Ctrl-스크롤 제스처로 확대/축소 허용", + "settings.updates.action.downloading": "다운로드 중...", + "settings.updates.action.installing": "설치 중...", } diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts index 8ec11de192..f3faa31382 100644 --- a/packages/app/src/i18n/no.ts +++ b/packages/app/src/i18n/no.ts @@ -77,7 +77,7 @@ export const dict = { "command.permissions.autoaccept.enable": "Aksepter tillatelser automatisk", "command.permissions.autoaccept.disable": "Stopp automatisk akseptering av tillatelser", "command.workspace.toggle": "Veksle arbeidsområder", - "command.workspace.toggle.description": "Enable or disable multiple workspaces in the sidebar", + "command.workspace.toggle.description": "Aktiver eller deaktiver flere arbeidsområder i sidefeltet", "command.session.undo": "Angre", "command.session.undo.description": "Angre siste melding", "command.session.redo": "Gjør om", @@ -469,7 +469,7 @@ export const dict = { "Rotelement ikke funnet. Glemte du å legge det til i index.html? Eller kanskje id-attributten er feilstavet?", "error.serverSync.connectFailed": "Kunne ikke koble til server. Kjører det en server på `{{url}}`?", - "directory.error.invalidUrl": "Invalid directory in URL.", + "directory.error.invalidUrl": "Ugyldig mappe i URL-en.", "error.chain.unknown": "Ukjent feil", "error.chain.causedBy": "Forårsaket av:", @@ -649,8 +649,8 @@ export const dict = { "settings.general.row.theme.description": "Tilpass hvordan OpenCode er tematisert.", "settings.general.row.font.title": "Kodefont", "settings.general.row.font.description": "Tilpass skrifttypen som brukes i kodeblokker", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "Terminalskrift", + "settings.general.row.terminalFont.description": "Tilpass skrifttypen som brukes i terminalen", "settings.general.row.uiFont.title": "UI-skrift", "settings.general.row.uiFont.description": "Tilpass skrifttypen som brukes i hele grensesnittet", "settings.general.row.followup.title": "Oppfølgingsadferd", @@ -936,4 +936,163 @@ export const dict = { "error.childStore.persistedProjectIconCreateFailed": "Kunne ikke opprette vedvarende prosjektikon", "error.childStore.storeCreateFailed": "Kunne ikke opprette lager", "terminal.connectionLost.abnormalClose": "WebSocket lukket unormalt: {{code}}", + + "command.project.previous": "Forrige prosjekt", + "command.project.next": "Neste prosjekt", + "command.project.index": "Bytt til prosjekt {{index}}", + "command.tab.reopenClosed": "Åpne lukket fane på nytt", + + "model.tooltip.context.label": "Kontekst", + "model.tooltip.inputs": "Inndata", + "model.tooltip.model": "Modell", + "model.tooltip.provider": "Leverandør", + "model.tooltip.reasoning": "Resonnering", + + "common.clear": "Tøm", + + "session.child.promptDisabled": "Underagentsesjoner kan ikke motta forespørsler.", + "session.child.backToParent": "Tilbake til hovedsesjonen.", + + "wsl.server.add": "Legg til WSL-server", + "wsl.server.addShort": "Legg til WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "WSL-server", + "wsl.server.retryStart": "Prøv å starte på nytt", + "wsl.server.updating": "Oppdaterer...", + "wsl.onboarding.step.distro": "Velg distribusjon", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "Sjekker WSL...", + "wsl.onboarding.restartRequired": "Windows må startes på nytt for å fullføre installasjonen av WSL.", + "wsl.onboarding.ready": "WSL er klart.", + "wsl.onboarding.required": "WSL kreves for å fortsette.", + "wsl.onboarding.checkingDistros": "Sjekker distribusjoner...", + "wsl.onboarding.installingDistro": "Installerer {{distro}}...", + "wsl.onboarding.checkingDistro": "Sjekker {{distro}}...", + "wsl.onboarding.listingDistros": "Lister distribusjoner...", + "wsl.onboarding.distroReady": "{{distro}} er klar.", + "wsl.onboarding.distroNotInstalled": "{{distro}} er ikke installert ennå.", + "wsl.onboarding.openDistroOnce": "Åpne {{distro}} én gang for å fullføre oppsettet.", + "wsl.onboarding.finishingDistro": "Fullfører oppsettet for {{distro}}.", + "wsl.onboarding.pickDistro": "Velg en distribusjon eller installer en nedenfor.", + "wsl.onboarding.checkingOpencode": "Sjekker OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "Sjekker OpenCode i {{distro}}...", + "wsl.onboarding.updatingOpencode": "Oppdaterer OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "Oppdaterer OpenCode i {{distro}}...", + "wsl.onboarding.updateOpencodeIn": "Oppdater OpenCode i {{distro}}.", + "wsl.onboarding.updateOpencode": "Oppdater OpenCode", + "wsl.onboarding.opencodeReadyIn": "OpenCode er klar i {{distro}}.", + "wsl.onboarding.opencodeReady": "OpenCode er klar.", + "wsl.onboarding.installOpencodeIn": "Installer OpenCode i {{distro}}.", + "wsl.onboarding.installOpencode": "Installer OpenCode", + "wsl.onboarding.chooseDistroFirst": "Velg en distribusjon først.", + "wsl.onboarding.loadFailed": "Kunne ikke laste inn WSL-status.", + "wsl.onboarding.loading": "Laster...", + "wsl.onboarding.installedDistros": "Installerte distribusjoner", + "wsl.onboarding.checkAgain": "Sjekk på nytt", + "wsl.onboarding.distroStatus.ready": "Klar", + "wsl.onboarding.distroStatus.checking": "Sjekker...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode er ikke installert", + "wsl.onboarding.distroStatus.missingTools": "Mangler bash, curl", + "wsl.onboarding.distroStatus.unsupported": "Ikke støttet · Bruk WSL 2", + "wsl.onboarding.needAnotherDistro": "Trenger du en annen distribusjon?", + "wsl.onboarding.needAnotherDistroHint": "Installer en Linux-distribusjon fra WSL-katalogen", + "wsl.onboarding.wslNotInstalled.title": "WSL er ikke installert", + "wsl.onboarding.wslNotInstalled.description": + "WSL (Windows Subsystem for Linux) kreves før OpenCode kan legge til en WSL-server", + "wsl.onboarding.wslUnavailable.title": "WSL er utilgjengelig", + "wsl.onboarding.wslUnavailable.description": "OpenCode kunne ikke bekrefte WSL på denne maskinen.", + "wsl.onboarding.installWsl": "Installer WSL", + "wsl.onboarding.windowsRestartRequired": + "Start Windows på nytt for å fullføre installasjonen av WSL, og åpne deretter OpenCode på nytt.", + "wsl.onboarding.next": "Neste", + "wsl.onboarding.refresh": "Oppdater", + "wsl.onboarding.allDistrosAdded": "Alle installerte distribusjoner er allerede lagt til.", + "wsl.onboarding.noDistros": "Ingen distribusjoner oppdaget ennå.", + "wsl.onboarding.install": "Installer", + "wsl.onboarding.installing": "Installerer...", + "wsl.onboarding.installDistro": "Installer distribusjon", + "wsl.onboarding.searchDistros": "Søk etter distribusjoner", + "wsl.onboarding.wsl2Required": "WSL 2 er påkrevd.", + "wsl.onboarding.toolsRequired": "Denne distribusjonen trenger bash og curl.", + "wsl.onboarding.openTerminal": "Åpne terminal", + "wsl.onboarding.path": "Bane: {{path}}", + "wsl.onboarding.notFound": "ikke funnet", + "wsl.onboarding.version": "Versjon: {{version}}", + "wsl.onboarding.unknown": "ukjent", + "wsl.onboarding.desktopVersion": "skrivebordsapp {{version}}", + "wsl.onboarding.versionMismatch": "Den installerte versjonen samsvarer ikke med versjonen av skrivebordsappen.", + "wsl.onboarding.adding": "Legger til...", + + "language.uk": "Українська", + + "error.page.description.localServerStartup": "Det oppstod en feil under oppstart av den lokale serveren.", + "error.page.action.exportLogs": "Eksporter logger", + + "home.title": "Hjem", + "home.projects": "Prosjekter", + "home.project.add": "Legg til prosjekt", + "home.recentlyClosed": "Nylig lukket", + "home.server.collapse": "Fold sammen serverprosjekter", + "home.server.expand": "Utvid serverprosjekter", + "home.sessions.search.placeholder": "Søk etter sesjoner", + "home.sessions.search.placeholder.scoped": "Søk etter sesjoner i {{scope}}", + "home.sessions.search.sessions": "Sesjoner", + "home.sessions.search.noResults": "Ingen sesjoner funnet for {{query}}", + "home.sessions.empty": "Ingenting her ennå", + "home.sessions.empty.description": "Opprett en sesjon for å komme i gang", + "home.sessions.group.today": "I dag", + "home.sessions.group.yesterday": "I går", + "home.sessions.group.older": "Eldre", + + "session.tab.unknown": "Ukjent sesjon", + "session.error.notFound": "Denne sesjonen finnes ikke", + "session.error.notFound.description": "Denne fanen peker til en sesjon som ikke lenger finnes på denne serveren.", + "session.error.notFound.closeTab": "Lukk fane", + "session.error.serverConnection": "Kan ikke koble til denne serveren", + "session.review.noUncommittedChanges": "Ingen ucommittede endringer ennå", + "session.review.noBranchChanges": "Ingen grenendringer ennå", + "session.question.minimize": "Minimer spørsmål", + "session.question.restore": "Gjenopprett spørsmål", + "session.question.pending.one": "{{count}} ventende spørsmål", + "session.question.pending.other": "{{count}} ventende spørsmål", + "session.new.project.new": "Nytt prosjekt", + "session.new.project.search": "Søk etter prosjekter", + "session.new.project.add": "Legg til prosjekt", + "session.new.workspace.runIn": "Kjør sesjonen i", + "session.new.workspace.triggerLocal": "Lokalt", + "session.new.workspace.local": "Lokalt depot", + "session.new.workspace.existing": "Arbeidsområde…", + + "sidebar.empty.title": "Ingen åpne prosjekter", + "sidebar.empty.description": "Åpne et prosjekt for å komme i gang", + + "settings.general.section.advanced": "Avansert", + "settings.general.row.shell.title": "Terminalskall", + "settings.general.row.shell.description": + "Velg skallet som skal brukes i terminalen. Kompatible skall brukes også til agentens verktøykall.", + "settings.general.row.shell.autoDefault": "Automatisk (standard)", + "settings.general.row.shell.terminalOnly": "kun terminal", + "settings.general.row.showFileTree.title": "Filtre", + "settings.general.row.showFileTree.description": "Vis filtrepanelet i sesjoner", + "settings.general.row.showNavigation.title": "Navigasjonskontroller", + "settings.general.row.showNavigation.description": + "Vis tilbake- og fremoverknappene på tittellinjen i skrivebordsappen", + "settings.general.row.showSearch.title": "Kommandopalett", + "settings.general.row.showSearch.description": "Vis knappen for søk og kommandopalett på tittellinjen", + "settings.general.row.showTerminal.title": "Terminal", + "settings.general.row.showTerminal.description": "Vis terminalknappen på tittellinjen i skrivebordsappen", + "settings.general.row.showStatus.title": "Serverstatus", + "settings.general.row.showStatus.description": "Vis serverstatusknappen på tittellinjen", + "settings.general.row.mobileTitlebarBottom.title": "Navigasjon nederst", + "settings.general.row.mobileTitlebarBottom.description": + "Plasser tittellinjen og sesjonsfanene nederst på mobilskjermen", + "settings.general.row.showCustomAgents.title": "Egendefinerte agenter", + "settings.general.row.showCustomAgents.description": "Vis agentvelgeren i skrivefeltet", + "settings.general.row.newLayoutDesigns.title": "Ny layout og utforming", + "settings.general.row.newLayoutDesigns.description": + "Aktiver ny layout og utforming for startsiden, skrivefeltet og sesjonsgrensesnittet", + "settings.general.row.pinchZoom.title": "Knip for å zoome", + "settings.general.row.pinchZoom.description": "Tillat knipebevegelser på styreflaten og Ctrl-rulling for å zoome", + "settings.updates.action.downloading": "Laster ned...", + "settings.updates.action.installing": "Installerer...", } satisfies Partial> diff --git a/packages/app/src/i18n/parity.test.ts b/packages/app/src/i18n/parity.test.ts index 8ad1beb56b..725b5f68a0 100644 --- a/packages/app/src/i18n/parity.test.ts +++ b/packages/app/src/i18n/parity.test.ts @@ -1,33 +1,118 @@ import { describe, expect, test } from "bun:test" -import { dict as en } from "./en" -import { dict as ar } from "./ar" -import { dict as br } from "./br" -import { dict as bs } from "./bs" -import { dict as da } from "./da" -import { dict as de } from "./de" -import { dict as es } from "./es" -import { dict as fr } from "./fr" -import { dict as ja } from "./ja" -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, uk, th, tr, zh, zht] -const keys = ["command.session.previous.unseen", "command.session.next.unseen"] as const +const appLocales = [ + "ar", + "br", + "bs", + "da", + "de", + "es", + "fr", + "ja", + "ko", + "no", + "pl", + "ru", + "uk", + "th", + "tr", + "zh", + "zht", +] as const +const desktopLocales = appLocales.filter((locale) => locale !== "th" && locale !== "tr") + +const domains = [ + { + name: "app", + source: "./en.ts", + target: (locale: string) => `./${locale}.ts`, + locales: appLocales, + }, + { + name: "ui", + source: "../../../ui/src/i18n/en.ts", + target: (locale: string) => `../../../ui/src/i18n/${locale}.ts`, + locales: appLocales, + }, + { + name: "desktop", + source: "../../../desktop/src/renderer/i18n/en.ts", + target: (locale: string) => `../../../desktop/src/renderer/i18n/${locale}.ts`, + locales: desktopLocales, + }, +] as const describe("i18n parity", () => { - test("non-English locales translate targeted unseen session keys", () => { - for (const locale of locales) { - for (const key of keys) { - expect(locale[key]).toBeDefined() - expect(locale[key]).not.toBe(en[key]) + test("non-English locales have every English key", async () => { + for (const domain of domains) { + const source = await dictionary(domain.source) + for (const locale of domain.locales) { + const target = await dictionary(domain.target(locale)) + const missing = Object.keys(source).filter((key) => !Object.hasOwn(target, key)) + const extra = Object.keys(target).filter((key) => !Object.hasOwn(source, key)) + expect({ domain: domain.name, locale, missing, extra }).toEqual({ + domain: domain.name, + locale, + missing: [], + extra: [], + }) + } + } + }) + + test("non-English locales preserve English placeholders", async () => { + for (const domain of domains) { + const source = await dictionary(domain.source) + for (const locale of domain.locales) { + const target = await dictionary(domain.target(locale)) + const mismatched = Object.keys(source).filter( + (key) => Object.hasOwn(target, key) && placeholders(source[key]).join() !== placeholders(target[key]).join(), + ) + expect({ domain: domain.name, locale, mismatched }).toEqual({ domain: domain.name, locale, mismatched: [] }) + } + } + }) + + test("non-English locales translate targeted unseen session keys", async () => { + const source = await dictionary("./en.ts") + for (const locale of appLocales) { + const target = await dictionary(`./${locale}.ts`) + for (const key of ["command.session.previous.unseen", "command.session.next.unseen"]) { + expect(target[key]).toBeDefined() + expect(target[key]).not.toBe(source[key]) + } + } + }) + + test("changed-file summary keys preserve rendered English copy and localize complete phrases", async () => { + const source = await dictionary("../../../ui/src/i18n/en.ts") + expect(source["ui.sessionTurn.diffs.changed.one"].replace("{{count}}", "1")).toBe("1 Changed file") + expect(source["ui.sessionTurn.diffs.changed.other"].replace("{{count}}", "2")).toBe("2 Changed files") + expect(source["ui.sessionTurn.diffs.changed"]).toBeUndefined() + + for (const locale of appLocales) { + const target = await dictionary(`../../../ui/src/i18n/${locale}.ts`) + for (const key of ["ui.sessionTurn.diffs.changed.one", "ui.sessionTurn.diffs.changed.other"]) { + expect(target[key].trim()).not.toBe("") + expect(placeholders(target[key])).toEqual(["count"]) } } }) }) + +async function dictionary(file: string) { + const module: unknown = await import(file) + if (typeof module !== "object" || module === null || !("dict" in module) || !isDictionary(module.dict)) { + throw new Error(`Invalid translation dictionary: ${file}`) + } + return module.dict +} + +function isDictionary(value: unknown): value is Record { + if (typeof value !== "object" || value === null || Array.isArray(value)) return false + return Object.values(value).every((item) => typeof item === "string") +} + +function placeholders(value: string) { + return Array.from(value.matchAll(/{{\s*([^}]+?)\s*}}/g), (match) => match[1]).sort() +} diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts index fcf9927da0..295d8e615a 100644 --- a/packages/app/src/i18n/pl.ts +++ b/packages/app/src/i18n/pl.ts @@ -21,6 +21,9 @@ export const dict = { "theme.scheme.dark": "Ciemny", "command.sidebar.toggle": "Przełącz pasek boczny", "command.project.open": "Otwórz projekt", + "command.project.previous": "Poprzedni projekt", + "command.project.next": "Następny projekt", + "command.project.index": "Przełącz na projekt {{index}}", "command.provider.connect": "Połącz dostawcę", "command.server.switch": "Przełącz serwer", "command.settings.open": "Otwórz ustawienia", @@ -39,6 +42,7 @@ export const dict = { "command.session.new": "Nowa sesja", "command.file.open": "Otwórz plik", "command.tab.close": "Zamknij kartę", + "command.tab.reopenClosed": "Otwórz ponownie zamkniętą kartę", "command.context.addSelection": "Dodaj zaznaczenie do kontekstu", "command.context.addSelection.description": "Dodaj zaznaczone linie z bieżącego pliku", "command.input.focus": "Fokus na pole wejściowe", @@ -194,6 +198,11 @@ export const dict = { "model.input.video": "wideo", "model.input.pdf": "pdf", "model.tooltip.allows": "Obsługuje: {{inputs}}", + "model.tooltip.context.label": "Kontekst", + "model.tooltip.inputs": "Dane wejściowe", + "model.tooltip.model": "Model", + "model.tooltip.provider": "Dostawca", + "model.tooltip.reasoning": "Wnioskowanie", "model.tooltip.reasoning.allowed": "Obsługuje wnioskowanie", "model.tooltip.reasoning.none": "Brak wnioskowania", "model.tooltip.context": "Limit kontekstu {{limit}}", @@ -203,6 +212,7 @@ export const dict = { "common.loading": "Ładowanie", "common.loading.ellipsis": "...", "common.cancel": "Anuluj", + "common.clear": "Wyczyść", "common.connect": "Połącz", "common.disconnect": "Rozłącz", "common.continue": "Prześlij", @@ -219,6 +229,8 @@ export const dict = { "prompt.mode.shell": "Terminal", "prompt.mode.normal": "Prompt", "prompt.mode.shell.exit": "esc aby wyjść", + "session.child.promptDisabled": "Nie można wysyłać promptów w sesjach podagentów.", + "session.child.backToParent": "Wróć do głównej sesji.", "prompt.example.1": "Napraw TODO w bazie kodu", "prompt.example.2": "Jaki jest stos technologiczny tego projektu?", "prompt.example.3": "Napraw zepsute testy", @@ -315,6 +327,75 @@ export const dict = { "dialog.server.menu.delete": "Usuń", "dialog.server.current": "Obecny serwer", "dialog.server.status.default": "Domyślny", + "wsl.server.add": "Dodaj serwer WSL", + "wsl.server.addShort": "Dodaj WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "Serwer WSL", + "wsl.server.retryStart": "Ponów uruchamianie", + "wsl.server.updating": "Aktualizowanie...", + "wsl.onboarding.step.distro": "Wybierz dystrybucję", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "Sprawdzanie WSL...", + "wsl.onboarding.restartRequired": "Aby dokończyć instalację WSL, uruchom ponownie system Windows.", + "wsl.onboarding.ready": "WSL jest gotowy.", + "wsl.onboarding.required": "Aby kontynuować, wymagany jest WSL.", + "wsl.onboarding.checkingDistros": "Sprawdzanie dystrybucji...", + "wsl.onboarding.installingDistro": "Instalowanie {{distro}}...", + "wsl.onboarding.checkingDistro": "Sprawdzanie {{distro}}...", + "wsl.onboarding.listingDistros": "Pobieranie listy dystrybucji...", + "wsl.onboarding.distroReady": "Dystrybucja {{distro}} jest gotowa.", + "wsl.onboarding.distroNotInstalled": "Dystrybucja {{distro}} nie jest jeszcze zainstalowana.", + "wsl.onboarding.openDistroOnce": "Uruchom raz {{distro}}, aby dokończyć konfigurację.", + "wsl.onboarding.finishingDistro": "Kończenie konfiguracji {{distro}}.", + "wsl.onboarding.pickDistro": "Wybierz dystrybucję lub zainstaluj jedną z poniższych.", + "wsl.onboarding.checkingOpencode": "Sprawdzanie OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "Sprawdzanie OpenCode w dystrybucji {{distro}}...", + "wsl.onboarding.updatingOpencode": "Aktualizowanie OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "Aktualizowanie OpenCode w dystrybucji {{distro}}...", + "wsl.onboarding.updateOpencodeIn": "Zaktualizuj OpenCode w dystrybucji {{distro}}.", + "wsl.onboarding.updateOpencode": "Zaktualizuj OpenCode", + "wsl.onboarding.opencodeReadyIn": "OpenCode jest gotowy w dystrybucji {{distro}}.", + "wsl.onboarding.opencodeReady": "OpenCode jest gotowy.", + "wsl.onboarding.installOpencodeIn": "Zainstaluj OpenCode w dystrybucji {{distro}}.", + "wsl.onboarding.installOpencode": "Zainstaluj OpenCode", + "wsl.onboarding.chooseDistroFirst": "Najpierw wybierz dystrybucję.", + "wsl.onboarding.loadFailed": "Nie udało się załadować stanu WSL.", + "wsl.onboarding.loading": "Ładowanie...", + "wsl.onboarding.installedDistros": "Zainstalowane dystrybucje", + "wsl.onboarding.checkAgain": "Sprawdź ponownie", + "wsl.onboarding.distroStatus.ready": "Gotowa", + "wsl.onboarding.distroStatus.checking": "Sprawdzanie...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode nie jest zainstalowany", + "wsl.onboarding.distroStatus.missingTools": "Brak bash i curl", + "wsl.onboarding.distroStatus.unsupported": "Nieobsługiwana · Użyj WSL 2", + "wsl.onboarding.needAnotherDistro": "Potrzebujesz innej dystrybucji?", + "wsl.onboarding.needAnotherDistroHint": "Zainstaluj dystrybucję systemu Linux z katalogu WSL", + "wsl.onboarding.wslNotInstalled.title": "WSL nie jest zainstalowany", + "wsl.onboarding.wslNotInstalled.description": + "WSL (Podsystem Windows dla systemu Linux) jest wymagany, zanim OpenCode będzie mógł dodać serwer WSL", + "wsl.onboarding.wslUnavailable.title": "WSL jest niedostępny", + "wsl.onboarding.wslUnavailable.description": "OpenCode nie mógł zweryfikować WSL na tym komputerze.", + "wsl.onboarding.installWsl": "Zainstaluj WSL", + "wsl.onboarding.windowsRestartRequired": + "Uruchom ponownie system Windows, aby dokończyć instalację WSL, a następnie ponownie otwórz OpenCode.", + "wsl.onboarding.next": "Dalej", + "wsl.onboarding.refresh": "Odśwież", + "wsl.onboarding.allDistrosAdded": "Wszystkie zainstalowane dystrybucje zostały już dodane.", + "wsl.onboarding.noDistros": "Nie wykryto jeszcze żadnych dystrybucji.", + "wsl.onboarding.install": "Zainstaluj", + "wsl.onboarding.installing": "Instalowanie...", + "wsl.onboarding.installDistro": "Zainstaluj dystrybucję", + "wsl.onboarding.searchDistros": "Szukaj dystrybucji", + "wsl.onboarding.wsl2Required": "Wymagany jest WSL 2.", + "wsl.onboarding.toolsRequired": "Ta dystrybucja wymaga bash i curl.", + "wsl.onboarding.openTerminal": "Otwórz terminal", + "wsl.onboarding.path": "Ścieżka: {{path}}", + "wsl.onboarding.notFound": "nie znaleziono", + "wsl.onboarding.version": "Wersja: {{version}}", + "wsl.onboarding.unknown": "nieznana", + "wsl.onboarding.desktopVersion": "aplikacja komputerowa {{version}}", + "wsl.onboarding.versionMismatch": "Zainstalowana wersja nie jest zgodna z wersją aplikacji komputerowej.", + "wsl.onboarding.adding": "Dodawanie...", "dialog.project.edit.title": "Edytuj projekt", "dialog.project.edit.name": "Nazwa", "dialog.project.edit.icon": "Ikona", @@ -324,7 +405,8 @@ export const dict = { "dialog.project.edit.color": "Kolor", "dialog.project.edit.color.select": "Wybierz kolor {{color}}", "dialog.project.edit.worktree.startup": "Skrypt uruchamiania przestrzeni roboczej", - "dialog.project.edit.worktree.startup.description": "Runs after creating a new workspace (worktree).", + "dialog.project.edit.worktree.startup.description": + "Uruchamiany po utworzeniu nowej przestrzeni roboczej (worktree).", "dialog.project.edit.worktree.startup.placeholder": "np. bun install", "context.breakdown.title": "Podział kontekstu", "context.breakdown.note": 'Przybliżony podział tokenów wejściowych. "Inne" obejmuje definicje narzędzi i narzut.', @@ -371,6 +453,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", "toast.language.title": "Język", @@ -407,10 +490,12 @@ export const dict = { "toast.update.action.notYet": "Jeszcze nie", "error.page.title": "Coś poszło nie tak", "error.page.description": "Wystąpił błąd podczas ładowania aplikacji.", + "error.page.description.localServerStartup": "Wystąpił błąd podczas uruchamiania serwera lokalnego.", "error.page.details.label": "Szczegóły błędu", "error.page.action.restart": "Restartuj", "error.page.action.report": "Zgłoś błąd", "error.page.action.reported": "Błąd zgłoszony", + "error.page.action.exportLogs": "Eksportuj dzienniki", "error.page.action.checking": "Sprawdzanie...", "error.page.action.checkUpdates": "Sprawdź aktualizacje", "error.page.action.updateTo": "Zaktualizuj do {{version}}", @@ -430,7 +515,8 @@ export const dict = { "error.chain.didYouMean": "Czy miałeś na myśli: {{suggestions}}", "error.chain.modelNotFound": "Model nie znaleziony: {{provider}}/{{model}}", "error.chain.checkConfig": "Sprawdź swoją konfigurację (opencode.json) nazwy dostawców/modeli", - "error.chain.mcpFailed": 'MCP server "{{name}}" failed. Note, OpenCode does not support MCP authentication yet.', + "error.chain.mcpFailed": + "Serwer MCP „{{name}}” nie uruchomił się. Uwaga: OpenCode nie obsługuje jeszcze uwierzytelniania MCP.", "error.chain.providerAuthFailed": "Uwierzytelnianie dostawcy nie powiodło się ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'Nie udało się zainicjować dostawcy "{{provider}}". Sprawdź poświadczenia i konfigurację.', @@ -452,10 +538,30 @@ export const dict = { "home.recentProjects": "Ostatnie projekty", "home.empty.title": "Brak ostatnich projektów", "home.empty.description": "Zacznij od otwarcia lokalnego projektu", + "home.title": "Strona główna", + "home.projects": "Projekty", + "home.project.add": "Dodaj projekt", + "home.recentlyClosed": "Ostatnio zamknięte", + "home.server.collapse": "Zwiń projekty serwera", + "home.server.expand": "Rozwiń projekty serwera", + "home.sessions.search.placeholder": "Szukaj sesji", + "home.sessions.search.placeholder.scoped": "Szukaj sesji w {{scope}}", + "home.sessions.search.sessions": "Sesje", + "home.sessions.search.noResults": "Nie znaleziono sesji dla {{query}}", + "home.sessions.empty": "Jeszcze nic tu nie ma", + "home.sessions.empty.description": "Utwórz sesję, aby rozpocząć", + "home.sessions.group.today": "Dzisiaj", + "home.sessions.group.yesterday": "Wczoraj", + "home.sessions.group.older": "Starsze", "session.tab.session": "Sesja", "session.tab.review": "Przegląd", "session.tab.context": "Kontekst", + "session.tab.unknown": "Nieznana sesja", "session.panel.reviewAndFiles": "Przegląd i pliki", + "session.error.notFound": "Nie można znaleźć tej sesji", + "session.error.notFound.description": "Ta karta wskazuje sesję, która nie istnieje już na tym serwerze.", + "session.error.notFound.closeTab": "Zamknij kartę", + "session.error.serverConnection": "Nie można połączyć się z tym serwerem", "session.review.filesChanged": "Zmieniono {{count}} plików", "session.review.change.one": "Zmiana", "session.review.change.other": "Zmiany", @@ -464,6 +570,8 @@ export const dict = { "session.review.noVcs": "Nie wykryto systemu kontroli wersji Git, zmiany nie są wyświetlane", "session.review.noSnapshot": "Śledzenie migawek jest wyłączone w konfiguracji, więc zmiany w sesji są niedostępne", "session.review.noChanges": "Brak zmian", + "session.review.noUncommittedChanges": "Brak jeszcze niezatwierdzonych zmian", + "session.review.noBranchChanges": "Brak jeszcze zmian w gałęzi", "session.files.selectToOpen": "Wybierz plik do otwarcia", "session.files.all": "Wszystkie pliki", "session.files.empty": "Brak plików", @@ -477,6 +585,10 @@ export const dict = { "session.todo.title": "Zadania", "session.todo.collapse": "Zwiń", "session.todo.expand": "Rozwiń", + "session.question.minimize": "Zminimalizuj pytanie", + "session.question.restore": "Przywróć pytanie", + "session.question.pending.one": "{{count}} oczekujące pytanie", + "session.question.pending.other": "Pytania oczekujące: {{count}}", "session.followupDock.summary.one": "{{count}} wiadomość w kolejce", "session.followupDock.summary.other": "{{count}} wiadomości w kolejce", "session.followupDock.sendNow": "Wyślij teraz", @@ -489,9 +601,16 @@ export const dict = { "session.revertDock.expand": "Rozwiń cofnięte wiadomości", "session.revertDock.restore": "Przywróć wiadomość", "session.new.title": "Zbuduj cokolwiek", + "session.new.project.new": "Nowy projekt", + "session.new.project.search": "Szukaj projektów", + "session.new.project.add": "Dodaj projekt", "session.new.worktree.main": "Główna gałąź", "session.new.worktree.mainWithBranch": "Główna gałąź ({{branch}})", "session.new.worktree.create": "Utwórz nowe drzewo robocze", + "session.new.workspace.runIn": "Uruchom sesję w", + "session.new.workspace.triggerLocal": "Lokalnie", + "session.new.workspace.local": "Lokalne repozytorium", + "session.new.workspace.existing": "Przestrzeń robocza…", "session.new.lastModified": "Ostatnio zmodyfikowano", "session.header.search.placeholder": "Szukaj {{project}}", "session.header.searchFiles": "Szukaj plików", @@ -555,15 +674,18 @@ export const dict = { "sidebar.project.recentSessions": "Ostatnie sesje", "sidebar.project.viewAllSessions": "Zobacz wszystkie sesje", "sidebar.project.clearNotifications": "Wyczyść powiadomienia", + "sidebar.empty.title": "Brak otwartych projektów", + "sidebar.empty.description": "Otwórz projekt, aby rozpocząć", "app.name.desktop": "OpenCode Desktop", "settings.section.desktop": "Pulpit", "settings.section.server": "Serwer", "settings.tab.general": "Ogólne", "settings.tab.shortcuts": "Skróty", "settings.desktop.section.wsl": "WSL", - "settings.desktop.wsl.title": "WSL integration", - "settings.desktop.wsl.description": "Run the OpenCode server inside WSL on Windows.", + "settings.desktop.wsl.title": "Integracja z WSL", + "settings.desktop.wsl.description": "Uruchamiaj serwer OpenCode wewnątrz WSL w systemie Windows.", "settings.general.section.appearance": "Wygląd", + "settings.general.section.advanced": "Zaawansowane", "settings.general.section.notifications": "Powiadomienia systemowe", "settings.general.section.updates": "Aktualizacje", "settings.general.section.sounds": "Efekty dźwiękowe", @@ -571,6 +693,11 @@ export const dict = { "settings.general.section.display": "Ekran", "settings.general.row.language.title": "Język", "settings.general.row.language.description": "Zmień język wyświetlania dla OpenCode", + "settings.general.row.shell.title": "Powłoka terminala", + "settings.general.row.shell.description": + "Wybierz powłokę używaną w terminalu. Zgodne powłoki są również używane przez wywołania narzędzi agenta.", + "settings.general.row.shell.autoDefault": "Automatycznie (domyślna)", + "settings.general.row.shell.terminalOnly": "tylko terminal", "settings.general.row.appearance.title": "Wygląd", "settings.general.row.appearance.description": "Dostosuj wygląd OpenCode na swoim urządzeniu", "settings.general.row.colorScheme.title": "Schemat kolorów", @@ -580,14 +707,30 @@ export const dict = { "settings.general.row.theme.description": "Dostosuj motyw OpenCode.", "settings.general.row.font.title": "Czcionka kodu", "settings.general.row.font.description": "Dostosuj czcionkę używaną w blokach kodu", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "Czcionka terminala", + "settings.general.row.terminalFont.description": "Dostosuj czcionkę używaną w terminalu", "settings.general.row.uiFont.title": "Czcionka interfejsu", "settings.general.row.uiFont.description": "Dostosuj czcionkę używaną w całym interfejsie", "settings.general.row.followup.title": "Zachowanie kontynuacji", "settings.general.row.followup.description": "Wybierz, czy kontynuacja ma być natychmiastowa, czy czekać w kolejce", "settings.general.row.followup.option.queue": "Kolejka", "settings.general.row.followup.option.steer": "Sterowanie", + "settings.general.row.showFileTree.title": "Drzewo plików", + "settings.general.row.showFileTree.description": "Pokaż panel drzewa plików w sesjach", + "settings.general.row.showNavigation.title": "Elementy nawigacji", + "settings.general.row.showNavigation.description": + "Pokaż przyciski Wstecz i Dalej na pasku tytułu aplikacji komputerowej", + "settings.general.row.showSearch.title": "Paleta poleceń", + "settings.general.row.showSearch.description": "Pokaż przycisk wyszukiwania i palety poleceń na pasku tytułu", + "settings.general.row.showTerminal.title": "Terminal", + "settings.general.row.showTerminal.description": "Pokaż przycisk terminala na pasku tytułu aplikacji komputerowej", + "settings.general.row.showStatus.title": "Status serwera", + "settings.general.row.showStatus.description": "Pokaż przycisk statusu serwera na pasku tytułu", + "settings.general.row.mobileTitlebarBottom.title": "Dolna nawigacja", + "settings.general.row.mobileTitlebarBottom.description": + "Umieść pasek tytułu i karty sesji u dołu ekranu na urządzeniach mobilnych", + "settings.general.row.showCustomAgents.title": "Agenci niestandardowi", + "settings.general.row.showCustomAgents.description": "Pokaż wybór agenta w edytorze wiadomości", "settings.general.row.reasoningSummaries.title": "Pokaż podsumowania wnioskowania", "settings.general.row.reasoningSummaries.description": "Wyświetlaj podsumowania wnioskowania modelu na osi czasu", "settings.general.row.shellToolPartsExpanded.title": "Rozwijaj elementy narzędzia shell", @@ -596,6 +739,12 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "Rozwijaj elementy narzędzia edit", "settings.general.row.editToolPartsExpanded.description": "Domyślnie pokazuj rozwinięte elementy narzędzi edit, write i patch na osi czasu", + "settings.general.row.newLayoutDesigns.title": "Nowy układ i wygląd", + "settings.general.row.newLayoutDesigns.description": + "Włącz przeprojektowany układ, stronę główną, edytor wiadomości i interfejs sesji", + "settings.general.row.pinchZoom.title": "Powiększanie gestem szczypania", + "settings.general.row.pinchZoom.description": + "Zezwalaj na powiększanie gestem szczypania na gładziku i przewijaniem z klawiszem Ctrl", "settings.general.row.wayland.title": "Użyj natywnego Wayland", "settings.general.row.wayland.description": "Wyłącz fallback X11 na Wayland. Wymaga restartu.", "settings.general.row.wayland.tooltip": @@ -608,6 +757,8 @@ export const dict = { "settings.updates.row.check.description": "Ręcznie sprawdź aktualizacje i zainstaluj, jeśli są dostępne", "settings.updates.action.checkNow": "Sprawdź teraz", "settings.updates.action.checking": "Sprawdzanie...", + "settings.updates.action.downloading": "Pobieranie...", + "settings.updates.action.installing": "Instalowanie...", "settings.updates.toast.latest.title": "Masz najnowszą wersję", "settings.updates.toast.latest.description": "Korzystasz z najnowszej wersji OpenCode.", "sound.option.none": "Brak", diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts index b2f58b101b..7ef78bb480 100644 --- a/packages/app/src/i18n/ru.ts +++ b/packages/app/src/i18n/ru.ts @@ -23,6 +23,9 @@ export const dict = { "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": "Открыть настройки", @@ -45,6 +48,7 @@ export const dict = { "command.session.new": "Новая сессия", "command.file.open": "Открыть файл", "command.tab.close": "Закрыть вкладку", + "command.tab.reopenClosed": "Повторно открыть закрытую вкладку", "command.context.addSelection": "Добавить выделение в контекст", "command.context.addSelection.description": "Добавить выбранные строки из текущего файла", "command.input.focus": "Фокус на поле ввода", @@ -208,6 +212,11 @@ export const dict = { "model.input.video": "видео", "model.input.pdf": "pdf", "model.tooltip.allows": "Разрешено: {{inputs}}", + "model.tooltip.context.label": "Контекст", + "model.tooltip.inputs": "Входные данные", + "model.tooltip.model": "Модель", + "model.tooltip.provider": "Провайдер", + "model.tooltip.reasoning": "Рассуждение", "model.tooltip.reasoning.allowed": "Разрешает рассуждение", "model.tooltip.reasoning.none": "Без рассуждения", "model.tooltip.context": "Лимит контекста {{limit}}", @@ -218,6 +227,7 @@ export const dict = { "common.loading": "Загрузка", "common.loading.ellipsis": "...", "common.cancel": "Отмена", + "common.clear": "Очистить", "common.connect": "Подключить", "common.disconnect": "Отключить", "common.continue": "Отправить", @@ -235,6 +245,8 @@ export const dict = { "prompt.mode.shell": "Оболочка", "prompt.mode.normal": "Промпт", "prompt.mode.shell.exit": "esc для выхода", + "session.child.promptDisabled": "В сессиях субагентов нельзя отправлять запросы.", + "session.child.backToParent": "Вернуться к основной сессии.", "prompt.example.1": "Исправить TODO в коде", "prompt.example.2": "Какой технологический стек этого проекта?", @@ -341,6 +353,75 @@ export const dict = { "dialog.server.menu.delete": "Удалить", "dialog.server.current": "Текущий сервер", "dialog.server.status.default": "По умолч.", + "wsl.server.add": "Добавить сервер WSL", + "wsl.server.addShort": "Добавить WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "Сервер WSL", + "wsl.server.retryStart": "Повторить запуск", + "wsl.server.updating": "Обновление...", + "wsl.onboarding.step.distro": "Выбрать дистрибутив", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "Проверка WSL...", + "wsl.onboarding.restartRequired": "Чтобы завершить установку WSL, перезапустите Windows.", + "wsl.onboarding.ready": "WSL готова к работе.", + "wsl.onboarding.required": "Для продолжения требуется WSL.", + "wsl.onboarding.checkingDistros": "Проверка дистрибутивов...", + "wsl.onboarding.installingDistro": "Установка {{distro}}...", + "wsl.onboarding.checkingDistro": "Проверка {{distro}}...", + "wsl.onboarding.listingDistros": "Получение списка дистрибутивов...", + "wsl.onboarding.distroReady": "Дистрибутив {{distro}} готов к работе.", + "wsl.onboarding.distroNotInstalled": "Дистрибутив {{distro}} пока не установлен.", + "wsl.onboarding.openDistroOnce": "Откройте {{distro}} один раз, чтобы завершить настройку.", + "wsl.onboarding.finishingDistro": "Завершение настройки {{distro}}.", + "wsl.onboarding.pickDistro": "Выберите дистрибутив или установите его ниже.", + "wsl.onboarding.checkingOpencode": "Проверка OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "Проверка OpenCode в {{distro}}...", + "wsl.onboarding.updatingOpencode": "Обновление OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "Обновление OpenCode в {{distro}}...", + "wsl.onboarding.updateOpencodeIn": "Обновите OpenCode в {{distro}}.", + "wsl.onboarding.updateOpencode": "Обновить OpenCode", + "wsl.onboarding.opencodeReadyIn": "OpenCode в {{distro}} готов к работе.", + "wsl.onboarding.opencodeReady": "OpenCode готов к работе.", + "wsl.onboarding.installOpencodeIn": "Установите OpenCode в {{distro}}.", + "wsl.onboarding.installOpencode": "Установить OpenCode", + "wsl.onboarding.chooseDistroFirst": "Сначала выберите дистрибутив.", + "wsl.onboarding.loadFailed": "Не удалось загрузить состояние WSL.", + "wsl.onboarding.loading": "Загрузка...", + "wsl.onboarding.installedDistros": "Установленные дистрибутивы", + "wsl.onboarding.checkAgain": "Проверить снова", + "wsl.onboarding.distroStatus.ready": "Готов", + "wsl.onboarding.distroStatus.checking": "Проверка...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode не установлен", + "wsl.onboarding.distroStatus.missingTools": "Отсутствуют bash и curl", + "wsl.onboarding.distroStatus.unsupported": "Не поддерживается · Используйте WSL 2", + "wsl.onboarding.needAnotherDistro": "Нужен другой дистрибутив?", + "wsl.onboarding.needAnotherDistroHint": "Установите дистрибутив Linux из каталога WSL", + "wsl.onboarding.wslNotInstalled.title": "WSL не установлена", + "wsl.onboarding.wslNotInstalled.description": + "Для добавления сервера WSL в OpenCode требуется WSL (Windows Subsystem for Linux)", + "wsl.onboarding.wslUnavailable.title": "WSL недоступна", + "wsl.onboarding.wslUnavailable.description": "OpenCode не смог проверить WSL на этом компьютере.", + "wsl.onboarding.installWsl": "Установить WSL", + "wsl.onboarding.windowsRestartRequired": + "Перезапустите Windows, чтобы завершить установку WSL, затем снова откройте OpenCode.", + "wsl.onboarding.next": "Далее", + "wsl.onboarding.refresh": "Обновить", + "wsl.onboarding.allDistrosAdded": "Все установленные дистрибутивы уже добавлены.", + "wsl.onboarding.noDistros": "Дистрибутивы пока не обнаружены.", + "wsl.onboarding.install": "Установить", + "wsl.onboarding.installing": "Установка...", + "wsl.onboarding.installDistro": "Установить дистрибутив", + "wsl.onboarding.searchDistros": "Поиск дистрибутивов", + "wsl.onboarding.wsl2Required": "Требуется WSL 2.", + "wsl.onboarding.toolsRequired": "Для этого дистрибутива нужны bash и curl.", + "wsl.onboarding.openTerminal": "Открыть терминал", + "wsl.onboarding.path": "Путь: {{path}}", + "wsl.onboarding.notFound": "не найден", + "wsl.onboarding.version": "Версия: {{version}}", + "wsl.onboarding.unknown": "неизвестно", + "wsl.onboarding.desktopVersion": "приложение {{version}}", + "wsl.onboarding.versionMismatch": "Установленная версия не соответствует версии приложения.", + "wsl.onboarding.adding": "Добавление...", "dialog.project.edit.title": "Редактировать проект", "dialog.project.edit.name": "Название", @@ -405,6 +486,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", @@ -452,10 +534,12 @@ export const dict = { "error.page.title": "Что-то пошло не так", "error.page.description": "Произошла ошибка при загрузке приложения.", + "error.page.description.localServerStartup": "Произошла ошибка при запуске локального сервера.", "error.page.details.label": "Детали ошибки", "error.page.action.restart": "Перезапустить", "error.page.action.report": "Сообщить об ошибке", "error.page.action.reported": "Об ошибке сообщено", + "error.page.action.exportLogs": "Экспортировать журналы", "error.page.action.checking": "Проверка...", "error.page.action.checkUpdates": "Проверить обновления", "error.page.action.updateTo": "Обновить до {{version}}", @@ -505,11 +589,31 @@ export const dict = { "home.recentProjects": "Недавние проекты", "home.empty.title": "Нет недавних проектов", "home.empty.description": "Начните с открытия локального проекта", + "home.title": "Главная", + "home.projects": "Проекты", + "home.project.add": "Добавить проект", + "home.recentlyClosed": "Недавно закрытые", + "home.server.collapse": "Свернуть проекты сервера", + "home.server.expand": "Развернуть проекты сервера", + "home.sessions.search.placeholder": "Поиск сессий", + "home.sessions.search.placeholder.scoped": "Поиск сессий в {{scope}}", + "home.sessions.search.sessions": "Сессии", + "home.sessions.search.noResults": "Сессии по запросу {{query}} не найдены", + "home.sessions.empty": "Здесь пока ничего нет", + "home.sessions.empty.description": "Создайте сессию, чтобы начать", + "home.sessions.group.today": "Сегодня", + "home.sessions.group.yesterday": "Вчера", + "home.sessions.group.older": "Ранее", "session.tab.session": "Сессия", "session.tab.review": "Обзор", "session.tab.context": "Контекст", + "session.tab.unknown": "Неизвестная сессия", "session.panel.reviewAndFiles": "Обзор и файлы", + "session.error.notFound": "Эта сессия не найдена", + "session.error.notFound.description": "Эта вкладка указывает на сессию, которой больше нет на этом сервере.", + "session.error.notFound.closeTab": "Закрыть вкладку", + "session.error.serverConnection": "Не удаётся подключиться к этому серверу", "session.review.filesChanged": "{{count}} файлов изменено", "session.review.change.one": "Изменение", "session.review.change.other": "Изменения", @@ -518,6 +622,8 @@ export const dict = { "session.review.noVcs": "Система контроля версий Git не обнаружена, изменения не отображаются", "session.review.noSnapshot": "Отслеживание снимков отключено в настройках, поэтому изменения сессии недоступны", "session.review.noChanges": "Нет изменений", + "session.review.noUncommittedChanges": "Пока нет незафиксированных изменений", + "session.review.noBranchChanges": "Пока нет изменений в ветке", "session.files.selectToOpen": "Выберите файл, чтобы открыть", "session.files.all": "Все файлы", "session.files.empty": "Нет файлов", @@ -532,6 +638,10 @@ export const dict = { "session.todo.title": "Задачи", "session.todo.collapse": "Свернуть", "session.todo.expand": "Развернуть", + "session.question.minimize": "Свернуть вопрос", + "session.question.restore": "Восстановить вопрос", + "session.question.pending.one": "{{count}} вопрос без ответа", + "session.question.pending.other": "Вопросы без ответа: {{count}}", "session.followupDock.summary.one": "{{count}} сообщение в очереди", "session.followupDock.summary.other": "{{count}} сообщений в очереди", "session.followupDock.sendNow": "Отправить сейчас", @@ -545,9 +655,16 @@ export const dict = { "session.revertDock.restore": "Восстановить сообщение", "session.new.title": "Создавайте что угодно", + "session.new.project.new": "Новый проект", + "session.new.project.search": "Поиск проектов", + "session.new.project.add": "Добавить проект", "session.new.worktree.main": "Основная ветка", "session.new.worktree.mainWithBranch": "Основная ветка ({{branch}})", "session.new.worktree.create": "Создать новый worktree", + "session.new.workspace.runIn": "Запустить сессию в", + "session.new.workspace.triggerLocal": "Локально", + "session.new.workspace.local": "Локальный репозиторий", + "session.new.workspace.existing": "Рабочее пространство…", "session.new.lastModified": "Последнее изменение", "session.header.search.placeholder": "Поиск {{project}}", @@ -619,6 +736,8 @@ export const dict = { "sidebar.project.recentSessions": "Недавние сессии", "sidebar.project.viewAllSessions": "Посмотреть все сессии", "sidebar.project.clearNotifications": "Очистить уведомления", + "sidebar.empty.title": "Нет открытых проектов", + "sidebar.empty.description": "Откройте проект, чтобы начать", "app.name.desktop": "OpenCode Desktop", "settings.section.desktop": "Приложение", @@ -630,6 +749,7 @@ export const dict = { "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": "Звуковые эффекты", @@ -638,6 +758,11 @@ export const dict = { "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": "Цветовая схема", @@ -646,8 +771,8 @@ export const dict = { "settings.general.row.theme.description": "Настройте оформление OpenCode.", "settings.general.row.font.title": "Шрифт кода", "settings.general.row.font.description": "Настройте шрифт, используемый в блоках кода", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "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": "Поведение уточняющих вопросов", @@ -655,6 +780,22 @@ export const dict = { "Выберите, отправлять ли уточняющие вопросы сразу или помещать их в очередь", "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.mobileTitlebarBottom.title": "Нижняя навигация", + "settings.general.row.mobileTitlebarBottom.description": + "На мобильных устройствах размещать строку заголовка и вкладки сессии внизу экрана", + "settings.general.row.showCustomAgents.title": "Пользовательские агенты", + "settings.general.row.showCustomAgents.description": "Показывать выбор агента в редакторе запросов", "settings.general.row.reasoningSummaries.title": "Показывать сводки рассуждений", "settings.general.row.reasoningSummaries.description": "Отображать сводки рассуждений модели в ленте", @@ -664,6 +805,12 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "Разворачивать элементы инструмента edit", "settings.general.row.editToolPartsExpanded.description": "Показывать элементы инструментов edit, write и patch в ленте развернутыми по умолчанию", + "settings.general.row.newLayoutDesigns.title": "Новая компоновка и оформление", + "settings.general.row.newLayoutDesigns.description": + "Включить обновлённую компоновку, главную страницу, редактор запросов и интерфейс сессии", + "settings.general.row.pinchZoom.title": "Масштабирование щипком", + "settings.general.row.pinchZoom.description": + "Разрешить масштабирование жестом щипка на трекпаде и прокруткой с Ctrl", "settings.general.row.wayland.title": "Использовать нативный Wayland", "settings.general.row.wayland.description": "Отключить X11 fallback на Wayland. Требуется перезапуск.", "settings.general.row.wayland.tooltip": @@ -678,6 +825,8 @@ export const dict = { "settings.updates.row.check.description": "Проверить обновления вручную и установить, если доступны", "settings.updates.action.checkNow": "Проверить сейчас", "settings.updates.action.checking": "Проверка...", + "settings.updates.action.downloading": "Загрузка...", + "settings.updates.action.installing": "Установка...", "settings.updates.toast.latest.title": "У вас последняя версия", "settings.updates.toast.latest.description": "Вы используете последнюю версию OpenCode.", "sound.option.none": "Нет", diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts index d066f3c616..686db7407c 100644 --- a/packages/app/src/i18n/th.ts +++ b/packages/app/src/i18n/th.ts @@ -23,6 +23,9 @@ export const dict = { "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": "เปิดการตั้งค่า", @@ -32,7 +35,7 @@ export const dict = { "command.session.next.unseen": "เซสชันที่ยังไม่ได้อ่านถัดไป", "command.session.archive": "จัดเก็บเซสชัน", - "command.palette": "คำสั่งค้นหา", + "command.palette": "ชุดคำสั่ง", "command.theme.cycle": "เปลี่ยนธีม", "command.theme.set": "ใช้ธีม: {{theme}}", @@ -45,6 +48,7 @@ export const dict = { "command.session.new": "เซสชันใหม่", "command.file.open": "เปิดไฟล์", "command.tab.close": "ปิดแท็บ", + "command.tab.reopenClosed": "เปิดแท็บที่ปิดไปอีกครั้ง", "command.context.addSelection": "เพิ่มส่วนที่เลือกไปยังบริบท", "command.context.addSelection.description": "เพิ่มบรรทัดที่เลือกจากไฟล์ปัจจุบัน", "command.input.focus": "โฟกัสช่องป้อนข้อมูล", @@ -163,7 +167,7 @@ export const dict = { "provider.custom.field.providerID.placeholder": "myprovider", "provider.custom.field.providerID.description": "ตัวอักษรพิมพ์เล็ก ตัวเลข ยัติภังค์ หรือขีดล่าง", "provider.custom.field.name.label": "ชื่อที่แสดง", - "provider.custom.field.name.placeholder": "My AI Provider", + "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", @@ -208,6 +212,11 @@ export const dict = { "model.input.video": "วิดีโอ", "model.input.pdf": "PDF", "model.tooltip.allows": "อนุญาต: {{inputs}}", + "model.tooltip.context.label": "บริบท", + "model.tooltip.inputs": "ข้อมูลนำเข้า", + "model.tooltip.model": "โมเดล", + "model.tooltip.provider": "ผู้ให้บริการ", + "model.tooltip.reasoning": "การใช้เหตุผล", "model.tooltip.reasoning.allowed": "อนุญาตการใช้เหตุผล", "model.tooltip.reasoning.none": "ไม่มีการใช้เหตุผล", "model.tooltip.context": "ขีดจำกัดบริบท {{limit}}", @@ -218,6 +227,7 @@ export const dict = { "common.loading": "กำลังโหลด", "common.loading.ellipsis": "...", "common.cancel": "ยกเลิก", + "common.clear": "ล้าง", "common.connect": "เชื่อมต่อ", "common.disconnect": "ยกเลิกการเชื่อมต่อ", "common.continue": "ส่ง", @@ -235,6 +245,8 @@ export const dict = { "prompt.mode.shell": "เชลล์", "prompt.mode.normal": "พรอมต์", "prompt.mode.shell.exit": "กด esc เพื่อออก", + "session.child.promptDisabled": "ไม่สามารถส่งพรอมต์ในเซสชันเอเจนต์ย่อยได้.", + "session.child.backToParent": "กลับไปยังเซสชันหลัก.", "prompt.example.1": "แก้ไข TODO ในโค้ดเบส", "prompt.example.2": "เทคโนโลยีของโปรเจกต์นี้คืออะไร?", @@ -341,6 +353,75 @@ export const dict = { "dialog.server.menu.delete": "ลบ", "dialog.server.current": "เซิร์ฟเวอร์ปัจจุบัน", "dialog.server.status.default": "ค่าเริ่มต้น", + "wsl.server.add": "เพิ่มเซิร์ฟเวอร์ WSL", + "wsl.server.addShort": "เพิ่ม WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "เซิร์ฟเวอร์ WSL", + "wsl.server.retryStart": "ลองเริ่มอีกครั้ง", + "wsl.server.updating": "กำลังอัปเดต...", + "wsl.onboarding.step.distro": "เลือกดิสโทร", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "กำลังตรวจสอบ WSL...", + "wsl.onboarding.restartRequired": "ต้องรีสตาร์ท Windows เพื่อให้การติดตั้ง WSL เสร็จสมบูรณ์.", + "wsl.onboarding.ready": "WSL พร้อมใช้งานแล้ว.", + "wsl.onboarding.required": "ต้องมี WSL เพื่อดำเนินการต่อ.", + "wsl.onboarding.checkingDistros": "กำลังตรวจสอบดิสโทร...", + "wsl.onboarding.installingDistro": "กำลังติดตั้ง {{distro}}...", + "wsl.onboarding.checkingDistro": "กำลังตรวจสอบ {{distro}}...", + "wsl.onboarding.listingDistros": "กำลังแสดงรายการดิสโทร...", + "wsl.onboarding.distroReady": "{{distro}} พร้อมใช้งานแล้ว.", + "wsl.onboarding.distroNotInstalled": "ยังไม่ได้ติดตั้ง {{distro}}.", + "wsl.onboarding.openDistroOnce": "เปิด {{distro}} หนึ่งครั้งเพื่อให้การตั้งค่าเสร็จสมบูรณ์.", + "wsl.onboarding.finishingDistro": "กำลังตั้งค่า {{distro}} ให้เสร็จสมบูรณ์.", + "wsl.onboarding.pickDistro": "เลือกดิสโทรหรือติดตั้งจากรายการด้านล่าง.", + "wsl.onboarding.checkingOpencode": "กำลังตรวจสอบ OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "กำลังตรวจสอบ OpenCode ใน {{distro}}...", + "wsl.onboarding.updatingOpencode": "กำลังอัปเดต OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "กำลังอัปเดต OpenCode ใน {{distro}}...", + "wsl.onboarding.updateOpencodeIn": "อัปเดต OpenCode ใน {{distro}}.", + "wsl.onboarding.updateOpencode": "อัปเดต OpenCode", + "wsl.onboarding.opencodeReadyIn": "OpenCode พร้อมใช้งานใน {{distro}} แล้ว.", + "wsl.onboarding.opencodeReady": "OpenCode พร้อมใช้งานแล้ว.", + "wsl.onboarding.installOpencodeIn": "ติดตั้ง OpenCode ใน {{distro}}.", + "wsl.onboarding.installOpencode": "ติดตั้ง OpenCode", + "wsl.onboarding.chooseDistroFirst": "เลือกดิสโทรก่อน.", + "wsl.onboarding.loadFailed": "ไม่สามารถโหลดสถานะ WSL ได้.", + "wsl.onboarding.loading": "กำลังโหลด...", + "wsl.onboarding.installedDistros": "ดิสโทรที่ติดตั้งแล้ว", + "wsl.onboarding.checkAgain": "ตรวจสอบอีกครั้ง", + "wsl.onboarding.distroStatus.ready": "พร้อมใช้งาน", + "wsl.onboarding.distroStatus.checking": "กำลังตรวจสอบ...", + "wsl.onboarding.distroStatus.opencodeMissing": "ยังไม่ได้ติดตั้ง OpenCode", + "wsl.onboarding.distroStatus.missingTools": "ไม่มี bash, curl", + "wsl.onboarding.distroStatus.unsupported": "ไม่รองรับ · ใช้ WSL 2", + "wsl.onboarding.needAnotherDistro": "ต้องการดิสโทรอื่น?", + "wsl.onboarding.needAnotherDistroHint": "ติดตั้งดิสทริบิวชัน Linux จากแค็ตตาล็อก WSL", + "wsl.onboarding.wslNotInstalled.title": "ยังไม่ได้ติดตั้ง WSL", + "wsl.onboarding.wslNotInstalled.description": + "ต้องมี WSL (Windows Subsystem for Linux) ก่อนที่ OpenCode จะเพิ่มเซิร์ฟเวอร์ WSL ได้", + "wsl.onboarding.wslUnavailable.title": "WSL ไม่พร้อมใช้งาน", + "wsl.onboarding.wslUnavailable.description": "OpenCode ไม่สามารถตรวจสอบ WSL บนเครื่องนี้ได้.", + "wsl.onboarding.installWsl": "ติดตั้ง WSL", + "wsl.onboarding.windowsRestartRequired": + "รีสตาร์ท Windows เพื่อให้การติดตั้ง WSL เสร็จสมบูรณ์ แล้วเปิด OpenCode อีกครั้ง.", + "wsl.onboarding.next": "ถัดไป", + "wsl.onboarding.refresh": "รีเฟรช", + "wsl.onboarding.allDistrosAdded": "เพิ่มดิสโทรที่ติดตั้งไว้ทั้งหมดแล้ว.", + "wsl.onboarding.noDistros": "ยังไม่พบดิสโทร.", + "wsl.onboarding.install": "ติดตั้ง", + "wsl.onboarding.installing": "กำลังติดตั้ง...", + "wsl.onboarding.installDistro": "ติดตั้งดิสโทร", + "wsl.onboarding.searchDistros": "ค้นหาดิสโทร", + "wsl.onboarding.wsl2Required": "ต้องใช้ WSL 2.", + "wsl.onboarding.toolsRequired": "ดิสโทรนี้ต้องมี bash และ curl.", + "wsl.onboarding.openTerminal": "เปิดเทอร์มินัล", + "wsl.onboarding.path": "เส้นทาง: {{path}}", + "wsl.onboarding.notFound": "ไม่พบ", + "wsl.onboarding.version": "เวอร์ชัน: {{version}}", + "wsl.onboarding.unknown": "ไม่ทราบ", + "wsl.onboarding.desktopVersion": "เดสก์ท็อป {{version}}", + "wsl.onboarding.versionMismatch": "เวอร์ชันที่ติดตั้งไม่ตรงกับเวอร์ชันของแอปเดสก์ท็อป.", + "wsl.onboarding.adding": "กำลังเพิ่ม...", "dialog.project.edit.title": "แก้ไขโปรเจกต์", "dialog.project.edit.name": "ชื่อ", @@ -403,6 +484,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", @@ -451,10 +533,12 @@ export const dict = { "error.page.title": "เกิดข้อผิดพลาด", "error.page.description": "เกิดข้อผิดพลาดระหว่างการโหลดแอปพลิเคชัน", + "error.page.description.localServerStartup": "เกิดข้อผิดพลาดขณะเริ่มเซิร์ฟเวอร์ในเครื่อง.", "error.page.details.label": "รายละเอียดข้อผิดพลาด", "error.page.action.restart": "รีสตาร์ท", "error.page.action.report": "รายงานข้อผิดพลาด", "error.page.action.reported": "รายงานข้อผิดพลาดแล้ว", + "error.page.action.exportLogs": "ส่งออกบันทึก", "error.page.action.checking": "กำลังตรวจสอบ...", "error.page.action.checkUpdates": "ตรวจสอบการอัปเดต", "error.page.action.updateTo": "อัปเดตเป็น {{version}}", @@ -500,11 +584,31 @@ export const dict = { "home.recentProjects": "โปรเจกต์ล่าสุด", "home.empty.title": "ไม่มีโปรเจกต์ล่าสุด", "home.empty.description": "เริ่มต้นโดยเปิดโปรเจกต์ในเครื่อง", + "home.title": "หน้าหลัก", + "home.projects": "โปรเจกต์", + "home.project.add": "เพิ่มโปรเจกต์", + "home.recentlyClosed": "ที่ปิดไปล่าสุด", + "home.server.collapse": "ย่อโปรเจกต์ของเซิร์ฟเวอร์", + "home.server.expand": "ขยายโปรเจกต์ของเซิร์ฟเวอร์", + "home.sessions.search.placeholder": "ค้นหาเซสชัน", + "home.sessions.search.placeholder.scoped": "ค้นหาเซสชันใน {{scope}}", + "home.sessions.search.sessions": "เซสชัน", + "home.sessions.search.noResults": "ไม่พบเซสชันสำหรับ {{query}}", + "home.sessions.empty": "ยังไม่มีอะไรที่นี่", + "home.sessions.empty.description": "สร้างเซสชันเพื่อเริ่มต้น", + "home.sessions.group.today": "วันนี้", + "home.sessions.group.yesterday": "เมื่อวาน", + "home.sessions.group.older": "ก่อนหน้านี้", "session.tab.session": "เซสชัน", "session.tab.review": "ตรวจสอบ", "session.tab.context": "บริบท", + "session.tab.unknown": "เซสชันที่ไม่รู้จัก", "session.panel.reviewAndFiles": "ตรวจสอบและไฟล์", + "session.error.notFound": "ไม่พบเซสชันนี้", + "session.error.notFound.description": "แท็บนี้อ้างถึงเซสชันที่ไม่มีอยู่บนเซิร์ฟเวอร์นี้แล้ว.", + "session.error.notFound.closeTab": "ปิดแท็บ", + "session.error.serverConnection": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์นี้", "session.review.filesChanged": "{{count}} ไฟล์ที่เปลี่ยนแปลง", "session.review.change.one": "การเปลี่ยนแปลง", "session.review.change.other": "การเปลี่ยนแปลง", @@ -513,6 +617,8 @@ export const dict = { "session.review.noVcs": "ไม่ตรวจพบระบบควบคุมเวอร์ชัน Git การเปลี่ยนแปลงจะไม่แสดง", "session.review.noSnapshot": "การติดตามสแนปชอตถูกปิดใช้งานในการกำหนดค่า ดังนั้นการเปลี่ยนแปลงเซสชันจึงไม่พร้อมใช้งาน", "session.review.noChanges": "ไม่มีการเปลี่ยนแปลง", + "session.review.noUncommittedChanges": "ยังไม่มีการเปลี่ยนแปลงที่รอคอมมิต", + "session.review.noBranchChanges": "ยังไม่มีการเปลี่ยนแปลงในสาขา", "session.files.selectToOpen": "เลือกไฟล์เพื่อเปิด", "session.files.empty": "ไม่มีไฟล์", @@ -529,6 +635,10 @@ export const dict = { "session.todo.title": "สิ่งที่ต้องทำ", "session.todo.collapse": "ย่อ", "session.todo.expand": "ขยาย", + "session.question.minimize": "ย่อคำถาม", + "session.question.restore": "คืนค่าคำถาม", + "session.question.pending.one": "คำถามที่รอดำเนินการ {{count}} ข้อ", + "session.question.pending.other": "คำถามที่รอดำเนินการ {{count}} ข้อ", "session.followupDock.summary.one": "{{count}} ข้อความในคิว", "session.followupDock.summary.other": "{{count}} ข้อความในคิว", "session.followupDock.sendNow": "ส่งทันที", @@ -542,9 +652,16 @@ export const dict = { "session.revertDock.restore": "กู้คืนข้อความ", "session.new.title": "สร้างอะไรก็ได้", + "session.new.project.new": "โปรเจกต์ใหม่", + "session.new.project.search": "ค้นหาโปรเจกต์", + "session.new.project.add": "เพิ่มโปรเจกต์", "session.new.worktree.main": "สาขาหลัก", "session.new.worktree.mainWithBranch": "สาขาหลัก ({{branch}})", "session.new.worktree.create": "สร้าง worktree ใหม่", + "session.new.workspace.runIn": "เรียกใช้เซสชันใน", + "session.new.workspace.triggerLocal": "ในเครื่อง", + "session.new.workspace.local": "รีโพซิทอรีในเครื่อง", + "session.new.workspace.existing": "พื้นที่ทำงาน…", "session.new.lastModified": "แก้ไขล่าสุด", "session.header.search.placeholder": "ค้นหา {{project}}", @@ -612,6 +729,8 @@ export const dict = { "sidebar.project.recentSessions": "เซสชันล่าสุด", "sidebar.project.viewAllSessions": "ดูเซสชันทั้งหมด", "sidebar.project.clearNotifications": "ล้างการแจ้งเตือน", + "sidebar.empty.title": "ไม่มีโปรเจกต์ที่เปิดอยู่", + "sidebar.empty.description": "เปิดโปรเจกต์เพื่อเริ่มต้น", "app.name.desktop": "OpenCode Desktop", @@ -624,6 +743,7 @@ export const dict = { "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": "เสียงเอฟเฟกต์", @@ -632,6 +752,11 @@ export const dict = { "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": "โทนสี", @@ -640,14 +765,29 @@ export const dict = { "settings.general.row.theme.description": "ปรับแต่งวิธีการที่ OpenCode มีธีม", "settings.general.row.font.title": "ฟอนต์โค้ด", "settings.general.row.font.description": "ปรับแต่งฟอนต์ที่ใช้ในบล็อกโค้ด", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "ฟอนต์เทอร์มินัล", + "settings.general.row.terminalFont.description": "ปรับแต่งฟอนต์ที่ใช้ในเทอร์มินัล", "settings.general.row.uiFont.title": "ฟอนต์ UI", "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.mobileTitlebarBottom.title": "การนำทางด้านล่าง", + "settings.general.row.mobileTitlebarBottom.description": + "วางแถบชื่อเรื่องและแท็บเซสชันไว้ด้านล่างของหน้าจอบนอุปกรณ์เคลื่อนที่", + "settings.general.row.showCustomAgents.title": "เอเจนต์ที่กำหนดเอง", + "settings.general.row.showCustomAgents.description": "แสดงตัวเลือกเอเจนต์ในช่องเขียนข้อความ", "settings.general.row.reasoningSummaries.title": "แสดงสรุปการใช้เหตุผล", "settings.general.row.reasoningSummaries.description": "แสดงสรุปการใช้เหตุผลของโมเดลในไทม์ไลน์", "settings.general.row.shellToolPartsExpanded.title": "ขยายส่วนเครื่องมือ shell", @@ -655,6 +795,11 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "ขยายส่วนเครื่องมือ edit", "settings.general.row.editToolPartsExpanded.description": "แสดงส่วนเครื่องมือ edit, write และ patch แบบขยายตามค่าเริ่มต้นในไทม์ไลน์", + "settings.general.row.newLayoutDesigns.title": "เลย์เอาต์และดีไซน์ใหม่", + "settings.general.row.newLayoutDesigns.description": + "เปิดใช้เลย์เอาต์ หน้าแรก ช่องเขียนข้อความ และ UI เซสชันที่ออกแบบใหม่", + "settings.general.row.pinchZoom.title": "บีบนิ้วเพื่อซูม", + "settings.general.row.pinchZoom.description": "อนุญาตให้ใช้ท่าบีบนิ้วบนแทร็คแพดและ Ctrl-scroll เพื่อซูม", "settings.general.row.wayland.title": "ใช้ Wayland แบบเนทีฟ", "settings.general.row.wayland.description": "ปิดใช้งาน X11 fallback บน Wayland ต้องรีสตาร์ท", "settings.general.row.wayland.tooltip": "บน Linux ที่มีจอภาพรีเฟรชเรตแบบผสม Wayland แบบเนทีฟอาจเสถียรกว่า", @@ -668,6 +813,8 @@ export const dict = { "settings.updates.row.check.description": "ตรวจสอบการอัปเดตด้วยตนเองและติดตั้งหากมี", "settings.updates.action.checkNow": "ตรวจสอบทันที", "settings.updates.action.checking": "กำลังตรวจสอบ...", + "settings.updates.action.downloading": "กำลังดาวน์โหลด...", + "settings.updates.action.installing": "กำลังติดตั้ง...", "settings.updates.toast.latest.title": "คุณเป็นเวอร์ชันล่าสุดแล้ว", "settings.updates.toast.latest.description": "คุณกำลังใช้งาน OpenCode เวอร์ชันล่าสุด", @@ -857,10 +1004,10 @@ export const dict = { "dialog.server.add.usernamePlaceholder": "ชื่อผู้ใช้", "dialog.server.add.passwordPlaceholder": "รหัสผ่าน", "server.row.noUsername": "ไม่มีชื่อผู้ใช้", - "session.review.noVcs.createGit.title": "สร้าง Git repository", + "session.review.noVcs.createGit.title": "สร้าง Git รีโพซิทอรี", "session.review.noVcs.createGit.description": "ติดตาม ตรวจสอบ และเลิกทำสิ่งเปลี่ยนแปลงในโปรเจกต์นี้", - "session.review.noVcs.createGit.actionLoading": "กำลังสร้าง Git repository...", - "session.review.noVcs.createGit.action": "สร้าง Git repository", + "session.review.noVcs.createGit.actionLoading": "กำลังสร้าง Git รีโพซิทอรี...", + "session.review.noVcs.createGit.action": "สร้าง Git รีโพซิทอรี", "session.todo.progress": "เสร็จสิ้น {{done}} จาก {{total}} รายการ", "session.question.progress": "{{current}} จาก {{total}} คำถาม", "session.header.open.finder": "Finder", diff --git a/packages/app/src/i18n/tr.ts b/packages/app/src/i18n/tr.ts index 9053173599..b578f89cca 100644 --- a/packages/app/src/i18n/tr.ts +++ b/packages/app/src/i18n/tr.ts @@ -27,6 +27,9 @@ export const dict = { "command.sidebar.toggle": "Kenar çubuğunu aç/kapat", "command.project.open": "Proje aç", + "command.project.previous": "Önceki proje", + "command.project.next": "Sonraki proje", + "command.project.index": "{{index}} numaralı projeye geç", "command.provider.connect": "Sağlayıcı bağla", "command.server.switch": "Sunucu değiştir", "command.settings.open": "Ayarları aç", @@ -49,6 +52,7 @@ export const dict = { "command.session.new": "Yeni oturum", "command.file.open": "Dosya aç", "command.tab.close": "Sekmeyi kapat", + "command.tab.reopenClosed": "Kapatılan sekmeyi yeniden aç", "command.context.addSelection": "Seçimi bağlama ekle", "command.context.addSelection.description": "Mevcut dosyadan seçili satırları ekle", "command.input.focus": "Girişi odakla", @@ -132,7 +136,7 @@ export const dict = { "provider.connect.status.waiting": "Yetkilendirme bekleniyor...", "provider.connect.status.failed": "Yetkilendirme başarısız: {{error}}", "provider.connect.apiKey.description": - "{{provider}} hesabınızı bağlamak ve OpenCode'da {{provider}} modellerini kullanmak için {{provider}} API anahtarınızı girin.", + "{{provider}} hesabınızı bağlamak ve OpenCode'da {{provider}} modellerini kullanmak için API anahtarınızı girin.", "provider.connect.apiKey.label": "{{provider}} API anahtarı", "provider.connect.apiKey.placeholder": "API anahtarı", "provider.connect.apiKey.required": "API anahtarı gerekli", @@ -143,10 +147,10 @@ export const dict = { "provider.connect.opencodeZen.visit.prefix": "", "provider.connect.opencodeZen.visit.link": "opencode.ai/zen", "provider.connect.opencodeZen.visit.suffix": " adresini ziyaret ederek API anahtarınızı alın.", - "provider.connect.oauth.code.visit.prefix": - "Hesabınızı bağlamak ve OpenCode'da {{provider}} modellerini kullanmak için ", + "provider.connect.oauth.code.visit.prefix": "Yetkilendirme kodunuzu almak için ", "provider.connect.oauth.code.visit.link": "bu bağlantıya", - "provider.connect.oauth.code.visit.suffix": " tıklayarak yetkilendirme kodunuzu alın.", + "provider.connect.oauth.code.visit.suffix": + " gidin; ardından hesabınızı bağlayarak OpenCode'da {{provider}} modellerini kullanın.", "provider.connect.oauth.code.label": "{{method}} yetkilendirme kodu", "provider.connect.oauth.code.placeholder": "Yetkilendirme kodu", "provider.connect.oauth.code.required": "Yetkilendirme kodu gerekli", @@ -213,6 +217,11 @@ export const dict = { "model.input.video": "video", "model.input.pdf": "pdf", "model.tooltip.allows": "Kabul eder: {{inputs}}", + "model.tooltip.context.label": "Bağlam", + "model.tooltip.inputs": "Girdiler", + "model.tooltip.model": "Model", + "model.tooltip.provider": "Sağlayıcı", + "model.tooltip.reasoning": "Akıl yürütme", "model.tooltip.reasoning.allowed": "Akıl yürütme destekler", "model.tooltip.reasoning.none": "Akıl yürütme yok", "model.tooltip.context": "Bağlam limiti {{limit}}", @@ -223,6 +232,7 @@ export const dict = { "common.loading": "Yükleniyor", "common.loading.ellipsis": "...", "common.cancel": "İptal", + "common.clear": "Temizle", "common.connect": "Bağlan", "common.disconnect": "Bağlantı Kes", "common.continue": "Gönder", @@ -240,6 +250,8 @@ export const dict = { "prompt.mode.shell": "Kabuk", "prompt.mode.normal": "Komut", "prompt.mode.shell.exit": "çıkmak için esc", + "session.child.promptDisabled": "Alt ajan oturumlarına istem gönderilemez.", + "session.child.backToParent": "Ana oturuma dön.", "prompt.example.1": "Kod tabanındaki bir TODO'yu düzelt", "prompt.example.2": "Bu projenin teknoloji yığını nedir?", @@ -346,6 +358,75 @@ export const dict = { "dialog.server.menu.delete": "Sil", "dialog.server.current": "Mevcut Sunucu", "dialog.server.status.default": "Varsayılan", + "wsl.server.add": "WSL sunucusu ekle", + "wsl.server.addShort": "WSL ekle", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "WSL sunucusu", + "wsl.server.retryStart": "Başlatmayı yeniden dene", + "wsl.server.updating": "Güncelleniyor...", + "wsl.onboarding.step.distro": "Dağıtım seç", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "WSL kontrol ediliyor...", + "wsl.onboarding.restartRequired": "WSL kurulumunu tamamlamak için Windows'un yeniden başlatılması gerekiyor.", + "wsl.onboarding.ready": "WSL hazır.", + "wsl.onboarding.required": "Devam etmek için WSL gerekli.", + "wsl.onboarding.checkingDistros": "Dağıtımlar kontrol ediliyor...", + "wsl.onboarding.installingDistro": "{{distro}} kuruluyor...", + "wsl.onboarding.checkingDistro": "{{distro}} kontrol ediliyor...", + "wsl.onboarding.listingDistros": "Dağıtımlar listeleniyor...", + "wsl.onboarding.distroReady": "{{distro}} hazır.", + "wsl.onboarding.distroNotInstalled": "{{distro}} henüz kurulu değil.", + "wsl.onboarding.openDistroOnce": "Kurulumu tamamlamak için {{distro}} dağıtımını bir kez açın.", + "wsl.onboarding.finishingDistro": "{{distro}} kurulumu tamamlanıyor.", + "wsl.onboarding.pickDistro": "Bir dağıtım seçin veya aşağıdan bir dağıtım kurun.", + "wsl.onboarding.checkingOpencode": "OpenCode kontrol ediliyor...", + "wsl.onboarding.checkingOpencodeIn": "{{distro}} içinde OpenCode kontrol ediliyor...", + "wsl.onboarding.updatingOpencode": "OpenCode güncelleniyor...", + "wsl.onboarding.updatingOpencodeIn": "{{distro}} içinde OpenCode güncelleniyor...", + "wsl.onboarding.updateOpencodeIn": "{{distro}} içindeki OpenCode'u güncelleyin.", + "wsl.onboarding.updateOpencode": "OpenCode'u güncelle", + "wsl.onboarding.opencodeReadyIn": "{{distro}} içinde OpenCode hazır.", + "wsl.onboarding.opencodeReady": "OpenCode hazır.", + "wsl.onboarding.installOpencodeIn": "OpenCode'u {{distro}} içine kurun.", + "wsl.onboarding.installOpencode": "OpenCode'u kur", + "wsl.onboarding.chooseDistroFirst": "Önce bir dağıtım seçin.", + "wsl.onboarding.loadFailed": "WSL durumu yüklenemedi.", + "wsl.onboarding.loading": "Yükleniyor...", + "wsl.onboarding.installedDistros": "Kurulu dağıtımlar", + "wsl.onboarding.checkAgain": "Tekrar kontrol et", + "wsl.onboarding.distroStatus.ready": "Hazır", + "wsl.onboarding.distroStatus.checking": "Kontrol ediliyor...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode kurulu değil", + "wsl.onboarding.distroStatus.missingTools": "bash ve curl eksik", + "wsl.onboarding.distroStatus.unsupported": "Desteklenmiyor · WSL 2 kullanın", + "wsl.onboarding.needAnotherDistro": "Başka bir dağıtım mı gerekiyor?", + "wsl.onboarding.needAnotherDistroHint": "WSL kataloğundan bir Linux dağıtımı kurun", + "wsl.onboarding.wslNotInstalled.title": "WSL kurulu değil", + "wsl.onboarding.wslNotInstalled.description": + "OpenCode'un WSL sunucusu ekleyebilmesi için önce WSL (Linux için Windows Alt Sistemi) kurulmalıdır", + "wsl.onboarding.wslUnavailable.title": "WSL kullanılamıyor", + "wsl.onboarding.wslUnavailable.description": "OpenCode bu makinede WSL'yi doğrulayamadı.", + "wsl.onboarding.installWsl": "WSL'yi kur", + "wsl.onboarding.windowsRestartRequired": + "WSL kurulumunu tamamlamak için Windows'u yeniden başlatın, ardından OpenCode'u tekrar açın.", + "wsl.onboarding.next": "İleri", + "wsl.onboarding.refresh": "Yenile", + "wsl.onboarding.allDistrosAdded": "Kurulu tüm dağıtımlar zaten eklenmiş.", + "wsl.onboarding.noDistros": "Henüz dağıtım algılanmadı.", + "wsl.onboarding.install": "Kur", + "wsl.onboarding.installing": "Kuruluyor...", + "wsl.onboarding.installDistro": "Dağıtım kur", + "wsl.onboarding.searchDistros": "Dağıtım ara", + "wsl.onboarding.wsl2Required": "WSL 2 gerekli.", + "wsl.onboarding.toolsRequired": "Bu dağıtım için bash ve curl gerekli.", + "wsl.onboarding.openTerminal": "Terminali aç", + "wsl.onboarding.path": "Yol: {{path}}", + "wsl.onboarding.notFound": "bulunamadı", + "wsl.onboarding.version": "Sürüm: {{version}}", + "wsl.onboarding.unknown": "bilinmiyor", + "wsl.onboarding.desktopVersion": "masaüstü {{version}}", + "wsl.onboarding.versionMismatch": "Kurulu sürüm masaüstü uygulamasının sürümüyle eşleşmiyor.", + "wsl.onboarding.adding": "Ekleniyor...", "dialog.project.edit.title": "Projeyi düzenle", "dialog.project.edit.name": "Ad", @@ -408,6 +489,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", @@ -456,10 +538,12 @@ export const dict = { "error.page.title": "Bir şeyler yanlış gitti", "error.page.description": "Uygulama yüklenirken bir hata oluştu.", + "error.page.description.localServerStartup": "Yerel sunucu başlatılırken bir hata oluştu.", "error.page.details.label": "Hata Detayları", "error.page.action.restart": "Yeniden Başlat", "error.page.action.report": "Hatayı Bildir", "error.page.action.reported": "Hata Bildirildi", + "error.page.action.exportLogs": "Günlükleri Dışa Aktar", "error.page.action.checking": "Kontrol ediliyor...", "error.page.action.checkUpdates": "Güncellemeleri kontrol et", "error.page.action.updateTo": "{{version}} sürümüne güncelle", @@ -509,11 +593,31 @@ export const dict = { "home.recentProjects": "Son projeler", "home.empty.title": "Son proje yok", "home.empty.description": "Yerel bir proje açarak başlayın", + "home.title": "Ana Sayfa", + "home.projects": "Projeler", + "home.project.add": "Proje ekle", + "home.recentlyClosed": "Yakın zamanda kapatılanlar", + "home.server.collapse": "Sunucu projelerini daralt", + "home.server.expand": "Sunucu projelerini genişlet", + "home.sessions.search.placeholder": "Oturum ara", + "home.sessions.search.placeholder.scoped": "{{scope}} kapsamında oturum ara", + "home.sessions.search.sessions": "Oturumlar", + "home.sessions.search.noResults": "{{query}} için oturum bulunamadı", + "home.sessions.empty": "Henüz burada bir şey yok", + "home.sessions.empty.description": "Başlamak için bir oturum oluşturun", + "home.sessions.group.today": "Bugün", + "home.sessions.group.yesterday": "Dün", + "home.sessions.group.older": "Daha eski", "session.tab.session": "Oturum", "session.tab.review": "İnceleme", "session.tab.context": "Bağlam", + "session.tab.unknown": "Bilinmeyen Oturum", "session.panel.reviewAndFiles": "İnceleme ve dosyalar", + "session.error.notFound": "Bu oturum bulunamıyor", + "session.error.notFound.description": "Bu sekme, artık bu sunucuda bulunmayan bir oturuma yönlendiriyor.", + "session.error.notFound.closeTab": "Sekmeyi Kapat", + "session.error.serverConnection": "Bu sunucuya bağlanılamıyor", "session.review.filesChanged": "{{count}} Dosya Değişti", "session.review.change.one": "Değişiklik", "session.review.change.other": "Değişiklik", @@ -523,6 +627,8 @@ export const dict = { "session.review.noSnapshot": "Yapılandırmada anlık görüntü takibi devre dışı bırakıldı, bu nedenle oturum değişiklikleri kullanılamıyor", "session.review.noChanges": "Değişiklik yok", + "session.review.noUncommittedChanges": "Henüz commit edilmemiş değişiklik yok", + "session.review.noBranchChanges": "Henüz dal değişikliği yok", "session.files.selectToOpen": "Açmak için bir dosya seçin", "session.files.all": "Tüm dosyalar", @@ -539,6 +645,10 @@ export const dict = { "session.todo.title": "Görevler", "session.todo.collapse": "Daralt", "session.todo.expand": "Genişlet", + "session.question.minimize": "Soruyu küçült", + "session.question.restore": "Soruyu geri yükle", + "session.question.pending.one": "{{count}} bekleyen soru", + "session.question.pending.other": "{{count}} bekleyen soru", "session.followupDock.summary.one": "{{count}} sıradaki mesaj", "session.followupDock.summary.other": "{{count}} sıradaki mesaj", "session.followupDock.sendNow": "Şimdi gönder", @@ -552,9 +662,16 @@ export const dict = { "session.revertDock.restore": "Mesajı geri yükle", "session.new.title": "İstediğini yap", + "session.new.project.new": "Yeni proje", + "session.new.project.search": "Proje ara", + "session.new.project.add": "Proje ekle", "session.new.worktree.main": "Ana dal", "session.new.worktree.mainWithBranch": "Ana dal ({{branch}})", "session.new.worktree.create": "Yeni çalışma ağacı oluştur", + "session.new.workspace.runIn": "Oturumu şurada çalıştır", + "session.new.workspace.triggerLocal": "Yerel", + "session.new.workspace.local": "Yerel depo", + "session.new.workspace.existing": "Çalışma alanı…", "session.new.lastModified": "Son değişiklik", "session.header.search.placeholder": "{{project}} ara", @@ -624,6 +741,8 @@ export const dict = { "sidebar.project.recentSessions": "Son oturumlar", "sidebar.project.viewAllSessions": "Tüm oturumları görüntüle", "sidebar.project.clearNotifications": "Bildirimleri temizle", + "sidebar.empty.title": "Açık proje yok", + "sidebar.empty.description": "Başlamak için bir proje açın", "app.name.desktop": "OpenCode Masaüstü", @@ -636,6 +755,7 @@ export const dict = { "settings.desktop.wsl.description": "OpenCode sunucusunu Windows'ta WSL içinde çalıştırın.", "settings.general.section.appearance": "Görünüm", + "settings.general.section.advanced": "Gelişmiş", "settings.general.section.notifications": "Sistem bildirimleri", "settings.general.section.updates": "Güncellemeler", "settings.general.section.sounds": "Ses efektleri", @@ -644,6 +764,11 @@ export const dict = { "settings.general.row.language.title": "Dil", "settings.general.row.language.description": "OpenCode'un görünüm dilini değiştirin", + "settings.general.row.shell.title": "Terminal Kabuğu", + "settings.general.row.shell.description": + "Terminalinizde kullanılacak kabuğu seçin. Uyumlu kabuklar, ajan araç çağrılarında da kullanılır.", + "settings.general.row.shell.autoDefault": "Otomatik (Varsayılan)", + "settings.general.row.shell.terminalOnly": "yalnızca terminal", "settings.general.row.appearance.title": "Görünüm", "settings.general.row.appearance.description": "OpenCode'un cihazınızdaki görünümünü özelleştirin", "settings.general.row.colorScheme.title": "Renk şeması", @@ -653,8 +778,8 @@ export const dict = { "settings.general.row.theme.description": "OpenCode'un temasını özelleştirin.", "settings.general.row.font.title": "Kod Yazı Tipi", "settings.general.row.font.description": "Kod bloklarında kullanılan yazı tipini özelleştirin", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "settings.general.row.terminalFont.title": "Terminal yazı tipi", + "settings.general.row.terminalFont.description": "Terminalde kullanılan yazı tipini özelleştirin", "settings.general.row.uiFont.title": "Arayüz Yazı Tipi", "settings.general.row.uiFont.description": "Arayüz genelinde kullanılan yazı tipini özelleştirin", "settings.general.row.followup.title": "Takip davranışı", @@ -662,6 +787,21 @@ export const dict = { "Takip komutlarının hemen yönlendirilmesini mi yoksa sırada beklemesini mi istediğinizi seçin", "settings.general.row.followup.option.queue": "Sıra", "settings.general.row.followup.option.steer": "Yönlendir", + "settings.general.row.showFileTree.title": "Dosya ağacı", + "settings.general.row.showFileTree.description": "Oturumlarda dosya ağacı panelini göster", + "settings.general.row.showNavigation.title": "Gezinme denetimleri", + "settings.general.row.showNavigation.description": "Masaüstü başlık çubuğunda geri ve ileri düğmelerini göster", + "settings.general.row.showSearch.title": "Komut paleti", + "settings.general.row.showSearch.description": "Başlık çubuğunda arama ve komut paleti düğmesini göster", + "settings.general.row.showTerminal.title": "Terminal", + "settings.general.row.showTerminal.description": "Masaüstü başlık çubuğunda terminal düğmesini göster", + "settings.general.row.showStatus.title": "Sunucu durumu", + "settings.general.row.showStatus.description": "Başlık çubuğunda sunucu durumu düğmesini göster", + "settings.general.row.mobileTitlebarBottom.title": "Alt gezinme", + "settings.general.row.mobileTitlebarBottom.description": + "Mobil cihazlarda başlık çubuğunu ve oturum sekmelerini ekranın altına yerleştir", + "settings.general.row.showCustomAgents.title": "Özel ajanlar", + "settings.general.row.showCustomAgents.description": "Yazma alanında ajan seçiciyi göster", "settings.general.row.reasoningSummaries.title": "Akıl yürütme özetlerini göster", "settings.general.row.reasoningSummaries.description": "Zaman çizelgesinde model akıl yürütme özetlerini görüntüle", "settings.general.row.shellToolPartsExpanded.title": "Kabuk araç bileşenlerini genişlet", @@ -670,6 +810,12 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "Düzenleme araç bileşenlerini genişlet", "settings.general.row.editToolPartsExpanded.description": "Zaman çizelgesinde düzenleme, yazma ve yama araç bileşenlerini varsayılan olarak genişletilmiş göster", + "settings.general.row.newLayoutDesigns.title": "Yeni düzen ve tasarımlar", + "settings.general.row.newLayoutDesigns.description": + "Yeniden tasarlanan düzeni, ana sayfayı, yazma alanını ve oturum arayüzünü etkinleştir", + "settings.general.row.pinchZoom.title": "Sıkıştırarak yakınlaştır", + "settings.general.row.pinchZoom.description": + "İzleme dörtgeninde sıkıştırma ve Ctrl-kaydırma hareketleriyle yakınlaştırmaya izin ver", "settings.general.row.wayland.title": "Yerel Wayland kullan", "settings.general.row.wayland.description": @@ -686,6 +832,8 @@ export const dict = { "settings.updates.row.check.description": "Elle güncelleme kontrolü yap ve varsa yükle", "settings.updates.action.checkNow": "Şimdi kontrol et", "settings.updates.action.checking": "Kontrol ediliyor...", + "settings.updates.action.downloading": "İndiriliyor...", + "settings.updates.action.installing": "Kuruluyor...", "settings.updates.toast.latest.title": "Güncelsiniz", "settings.updates.toast.latest.description": "OpenCode'un en son sürümünü kullanıyorsunuz.", diff --git a/packages/app/src/i18n/uk.ts b/packages/app/src/i18n/uk.ts index d875766e88..ff18c8e342 100644 --- a/packages/app/src/i18n/uk.ts +++ b/packages/app/src/i18n/uk.ts @@ -48,6 +48,7 @@ export const dict = { "command.session.new": "Нова сесія", "command.file.open": "Відкрити файл", "command.tab.close": "Закрити вкладку", + "command.tab.reopenClosed": "Повторно відкрити закриту вкладку", "command.context.addSelection": "Додати виділення до контексту", "command.context.addSelection.description": "Додати вибрані рядки з поточного файлу", "command.input.focus": "Фокус на полі введення", @@ -212,6 +213,11 @@ export const dict = { "model.input.video": "відео", "model.input.pdf": "pdf", "model.tooltip.allows": "Дозволяє: {{inputs}}", + "model.tooltip.context.label": "Контекст", + "model.tooltip.inputs": "Вхідні дані", + "model.tooltip.model": "Модель", + "model.tooltip.provider": "Провайдер", + "model.tooltip.reasoning": "Мислення", "model.tooltip.reasoning.allowed": "Підтримує мислення", "model.tooltip.reasoning.none": "Без мислення", "model.tooltip.context": "Ліміт контексту {{limit}}", @@ -222,6 +228,7 @@ export const dict = { "common.loading": "Завантаження", "common.loading.ellipsis": "...", "common.cancel": "Скасувати", + "common.clear": "Очистити", "common.open": "Відкрити", "common.connect": "Підключити", "common.disconnect": "Відключити", @@ -354,6 +361,75 @@ export const dict = { "dialog.server.menu.delete": "Видалити", "dialog.server.current": "Поточний сервер", "dialog.server.status.default": "За замовчуванням", + "wsl.server.add": "Додати сервер WSL", + "wsl.server.addShort": "Додати WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "Сервер WSL", + "wsl.server.retryStart": "Повторити запуск", + "wsl.server.updating": "Оновлення...", + "wsl.onboarding.step.distro": "Вибрати дистрибутив", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "Перевірка WSL...", + "wsl.onboarding.restartRequired": "Щоб завершити встановлення WSL, потрібно перезапустити Windows.", + "wsl.onboarding.ready": "WSL готова до роботи.", + "wsl.onboarding.required": "Для продовження потрібна WSL.", + "wsl.onboarding.checkingDistros": "Перевірка дистрибутивів...", + "wsl.onboarding.installingDistro": "Встановлення {{distro}}...", + "wsl.onboarding.checkingDistro": "Перевірка {{distro}}...", + "wsl.onboarding.listingDistros": "Отримання списку дистрибутивів...", + "wsl.onboarding.distroReady": "{{distro}} готовий до роботи.", + "wsl.onboarding.distroNotInstalled": "{{distro}} ще не встановлено.", + "wsl.onboarding.openDistroOnce": "Відкрийте {{distro}} один раз, щоб завершити налаштування.", + "wsl.onboarding.finishingDistro": "Завершення налаштування {{distro}}.", + "wsl.onboarding.pickDistro": "Виберіть дистрибутив або встановіть один із наведених нижче.", + "wsl.onboarding.checkingOpencode": "Перевірка OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "Перевірка OpenCode у {{distro}}...", + "wsl.onboarding.updatingOpencode": "Оновлення OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "Оновлення OpenCode у {{distro}}...", + "wsl.onboarding.updateOpencodeIn": "Оновіть OpenCode у {{distro}}.", + "wsl.onboarding.updateOpencode": "Оновити OpenCode", + "wsl.onboarding.opencodeReadyIn": "OpenCode готовий до роботи у {{distro}}.", + "wsl.onboarding.opencodeReady": "OpenCode готовий до роботи.", + "wsl.onboarding.installOpencodeIn": "Встановіть OpenCode у {{distro}}.", + "wsl.onboarding.installOpencode": "Встановити OpenCode", + "wsl.onboarding.chooseDistroFirst": "Спочатку виберіть дистрибутив.", + "wsl.onboarding.loadFailed": "Не вдалося завантажити стан WSL.", + "wsl.onboarding.loading": "Завантаження...", + "wsl.onboarding.installedDistros": "Встановлені дистрибутиви", + "wsl.onboarding.checkAgain": "Перевірити ще раз", + "wsl.onboarding.distroStatus.ready": "Готовий", + "wsl.onboarding.distroStatus.checking": "Перевірка...", + "wsl.onboarding.distroStatus.opencodeMissing": "OpenCode не встановлено", + "wsl.onboarding.distroStatus.missingTools": "Немає bash і curl", + "wsl.onboarding.distroStatus.unsupported": "Не підтримується · Використовуйте WSL 2", + "wsl.onboarding.needAnotherDistro": "Потрібен інший дистрибутив?", + "wsl.onboarding.needAnotherDistroHint": "Встановіть дистрибутив Linux із каталогу WSL", + "wsl.onboarding.wslNotInstalled.title": "WSL не встановлено", + "wsl.onboarding.wslNotInstalled.description": + "Для додавання сервера WSL в OpenCode потрібна WSL (Підсистема Windows для Linux)", + "wsl.onboarding.wslUnavailable.title": "WSL недоступна", + "wsl.onboarding.wslUnavailable.description": "OpenCode не вдалося перевірити WSL на цьому комп'ютері.", + "wsl.onboarding.installWsl": "Встановити WSL", + "wsl.onboarding.windowsRestartRequired": + "Перезапустіть Windows, щоб завершити встановлення WSL, а потім знову відкрийте OpenCode.", + "wsl.onboarding.next": "Далі", + "wsl.onboarding.refresh": "Оновити", + "wsl.onboarding.allDistrosAdded": "Усі встановлені дистрибутиви вже додано.", + "wsl.onboarding.noDistros": "Дистрибутивів поки не виявлено.", + "wsl.onboarding.install": "Встановити", + "wsl.onboarding.installing": "Встановлення...", + "wsl.onboarding.installDistro": "Встановити дистрибутив", + "wsl.onboarding.searchDistros": "Пошук дистрибутивів", + "wsl.onboarding.wsl2Required": "Для роботи потрібна WSL 2.", + "wsl.onboarding.toolsRequired": "Для цього дистрибутива потрібні bash і curl.", + "wsl.onboarding.openTerminal": "Відкрити термінал", + "wsl.onboarding.path": "Шлях: {{path}}", + "wsl.onboarding.notFound": "не знайдено", + "wsl.onboarding.version": "Версія: {{version}}", + "wsl.onboarding.unknown": "невідомо", + "wsl.onboarding.desktopVersion": "десктопний застосунок {{version}}", + "wsl.onboarding.versionMismatch": "Встановлена версія не відповідає версії десктопного застосунку.", + "wsl.onboarding.adding": "Додавання...", "server.row.noUsername": "без імені користувача", "dialog.project.edit.title": "Редагувати проєкт", @@ -473,10 +549,12 @@ export const dict = { "error.page.title": "Щось пішло не так", "error.page.description": "Під час завантаження програми сталася помилка.", + "error.page.description.localServerStartup": "Під час запуску локального сервера сталася помилка.", "error.page.details.label": "Деталі помилки", "error.page.action.restart": "Перезапустити", "error.page.action.report": "Повідомити про помилку", "error.page.action.reported": "Помилку повідомлено", + "error.page.action.exportLogs": "Експортувати журнали", "error.page.action.checking": "Перевірка...", "error.page.action.checkUpdates": "Перевірити оновлення", "error.page.action.updateTo": "Оновити до {{version}}", @@ -533,11 +611,31 @@ export const dict = { "home.recentProjects": "Нещодавні проєкти", "home.empty.title": "Немає нещодавніх проєктів", "home.empty.description": "Почніть, відкривши локальний проєкт", + "home.title": "Головна", + "home.projects": "Проєкти", + "home.project.add": "Додати проєкт", + "home.recentlyClosed": "Нещодавно закриті", + "home.server.collapse": "Згорнути проєкти сервера", + "home.server.expand": "Розгорнути проєкти сервера", + "home.sessions.search.placeholder": "Пошук сесій", + "home.sessions.search.placeholder.scoped": "Пошук сесій у {{scope}}", + "home.sessions.search.sessions": "Сесії", + "home.sessions.search.noResults": "Сесій за запитом {{query}} не знайдено", + "home.sessions.empty": "Тут поки нічого немає", + "home.sessions.empty.description": "Створіть сесію, щоб почати", + "home.sessions.group.today": "Сьогодні", + "home.sessions.group.yesterday": "Учора", + "home.sessions.group.older": "Раніше", "session.tab.session": "Сесія", "session.tab.review": "Огляд", "session.tab.context": "Контекст", + "session.tab.unknown": "Невідома сесія", "session.panel.reviewAndFiles": "Огляд і файли", + "session.error.notFound": "Цю сесію не знайдено", + "session.error.notFound.description": "Ця вкладка посилається на сесію, якої більше немає на цьому сервері.", + "session.error.notFound.closeTab": "Закрити вкладку", + "session.error.serverConnection": "Не вдається підключитися до цього сервера", "session.review.filesChanged": "Змінено файлів: {{count}}", "session.review.change.one": "Зміна", "session.review.change.other": "Зміни", @@ -570,6 +668,10 @@ export const dict = { "session.todo.expand": "Розгорнути", "session.todo.progress": "Виконано {{done}} з {{total}} завдань", "session.question.progress": "{{current}} з {{total}} запитань", + "session.question.minimize": "Згорнути запитання", + "session.question.restore": "Відновити запитання", + "session.question.pending.one": "{{count}} запитання очікує відповіді", + "session.question.pending.other": "Запитання, що очікують відповіді: {{count}}", "session.followupDock.summary.one": "{{count}} повідомлення в черзі", "session.followupDock.summary.other": "{{count}} повідомлень у черзі", "session.followupDock.sendNow": "Надіслати зараз", @@ -583,9 +685,16 @@ export const dict = { "session.revertDock.restore": "Відновити повідомлення", "session.new.title": "Створити що завгодно", + "session.new.project.new": "Новий проєкт", + "session.new.project.search": "Пошук проєктів", + "session.new.project.add": "Додати проєкт", "session.new.worktree.main": "Основна гілка", "session.new.worktree.mainWithBranch": "Основна гілка ({{branch}})", "session.new.worktree.create": "Створити нове робоче дерево", + "session.new.workspace.runIn": "Запустити сесію в", + "session.new.workspace.triggerLocal": "Локально", + "session.new.workspace.local": "Локальний репозиторій", + "session.new.workspace.existing": "Робоча область…", "session.new.lastModified": "Востаннє змінено", "session.header.search.placeholder": "Пошук {{project}}", @@ -773,6 +882,11 @@ export const dict = { "settings.general.row.showTerminal.description": "Показувати кнопку термінала в заголовку робочого столу", "settings.general.row.showStatus.title": "Статус сервера", "settings.general.row.showStatus.description": "Показувати кнопку статусу сервера в заголовку", + "settings.general.row.mobileTitlebarBottom.title": "Нижня навігація", + "settings.general.row.mobileTitlebarBottom.description": + "Розмістити заголовок і вкладки сесії внизу екрана на мобільних пристроях", + "settings.general.row.showCustomAgents.title": "Користувацькі агенти", + "settings.general.row.showCustomAgents.description": "Показувати вибір агента в редакторі запиту", "settings.general.row.reasoningSummaries.title": "Показувати підсумки мислення", "settings.general.row.reasoningSummaries.description": "Відображати підсумки мислення моделі на часовій шкалі", "settings.general.row.shellToolPartsExpanded.title": "Розгортати частини інструменту оболонки", @@ -781,6 +895,12 @@ export const dict = { "settings.general.row.editToolPartsExpanded.title": "Розгортати частини інструменту редагування", "settings.general.row.editToolPartsExpanded.description": "Показувати частини інструментів редагування, запису та патчів розгорнутими за замовчуванням на часовій шкалі", + "settings.general.row.newLayoutDesigns.title": "Новий макет і дизайн", + "settings.general.row.newLayoutDesigns.description": + "Увімкнути оновлений макет та інтерфейси головної сторінки, редактора запитів і сесії", + "settings.general.row.pinchZoom.title": "Масштабування щипком", + "settings.general.row.pinchZoom.description": + "Дозволити масштабування жестом щипка на трекпаді та прокручуванням із Ctrl", "settings.general.row.wayland.title": "Використовувати нативний Wayland", "settings.general.row.wayland.description": "Вимкнути резервний X11 на Wayland. Потребує перезапуску.", @@ -796,6 +916,8 @@ export const dict = { "settings.updates.row.check.description": "Вручну перевірити наявність оновлень і встановити, якщо доступні", "settings.updates.action.checkNow": "Перевірити зараз", "settings.updates.action.checking": "Перевірка...", + "settings.updates.action.downloading": "Завантаження...", + "settings.updates.action.installing": "Встановлення...", "settings.updates.toast.latest.title": "У вас актуальна версія", "settings.updates.toast.latest.description": "Ви використовуєте останню версію OpenCode.", "sound.option.none": "Немає", diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts index 15d873ee04..3cccc0c82d 100644 --- a/packages/app/src/i18n/zh.ts +++ b/packages/app/src/i18n/zh.ts @@ -28,6 +28,9 @@ export const dict = { "command.sidebar.toggle": "切换侧边栏", "command.project.open": "打开项目", + "command.project.previous": "上一个项目", + "command.project.next": "下一个项目", + "command.project.index": "切换到项目 {{index}}", "command.provider.connect": "连接提供商", @@ -56,6 +59,7 @@ export const dict = { "command.file.open": "打开文件", "command.tab.close": "关闭标签页", + "command.tab.reopenClosed": "重新打开已关闭的标签页", "command.context.addSelection": "将所选内容添加到上下文", "command.context.addSelection.description": "添加当前文件中选中的行", @@ -230,6 +234,11 @@ export const dict = { "model.input.video": "视频", "model.input.pdf": "pdf", "model.tooltip.allows": "支持:{{inputs}}", + "model.tooltip.context.label": "上下文", + "model.tooltip.inputs": "输入", + "model.tooltip.model": "模型", + "model.tooltip.provider": "提供商", + "model.tooltip.reasoning": "推理", "model.tooltip.reasoning.allowed": "支持推理", "model.tooltip.reasoning.none": "不支持推理", "model.tooltip.context": "上下文上限 {{limit}}", @@ -240,6 +249,7 @@ export const dict = { "common.loading": "加载中", "common.loading.ellipsis": "...", "common.cancel": "取消", + "common.clear": "清除", "common.connect": "连接", "common.disconnect": "断开连接", "common.continue": "提交", @@ -257,6 +267,8 @@ export const dict = { "prompt.mode.shell": "Shell", "prompt.mode.normal": "Prompt", "prompt.mode.shell.exit": "按 esc 退出", + "session.child.promptDisabled": "无法向子智能体会话发送提示词。", + "session.child.backToParent": "返回主会话。", "prompt.example.1": "修复代码库中的一个 TODO", "prompt.example.2": "这个项目的技术栈是什么?", "prompt.example.3": "修复失败的测试", @@ -359,6 +371,73 @@ export const dict = { "dialog.server.menu.delete": "删除", "dialog.server.current": "当前服务器", "dialog.server.status.default": "默认", + "wsl.server.add": "添加 WSL 服务器", + "wsl.server.addShort": "添加 WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "WSL 服务器", + "wsl.server.retryStart": "重试启动", + "wsl.server.updating": "正在更新...", + "wsl.onboarding.step.distro": "选择发行版", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "正在检查 WSL...", + "wsl.onboarding.restartRequired": "Windows 需要重启才能完成 WSL 安装。", + "wsl.onboarding.ready": "WSL 已就绪。", + "wsl.onboarding.required": "需要 WSL 才能继续。", + "wsl.onboarding.checkingDistros": "正在检查发行版...", + "wsl.onboarding.installingDistro": "正在安装 {{distro}}...", + "wsl.onboarding.checkingDistro": "正在检查 {{distro}}...", + "wsl.onboarding.listingDistros": "正在列出发行版...", + "wsl.onboarding.distroReady": "{{distro}} 已就绪。", + "wsl.onboarding.distroNotInstalled": "{{distro}} 尚未安装。", + "wsl.onboarding.openDistroOnce": "打开一次 {{distro}} 以完成设置。", + "wsl.onboarding.finishingDistro": "正在完成 {{distro}} 的设置。", + "wsl.onboarding.pickDistro": "选择一个发行版,或在下方安装。", + "wsl.onboarding.checkingOpencode": "正在检查 OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "正在检查 {{distro}} 中的 OpenCode...", + "wsl.onboarding.updatingOpencode": "正在更新 OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "正在更新 {{distro}} 中的 OpenCode...", + "wsl.onboarding.updateOpencodeIn": "更新 {{distro}} 中的 OpenCode。", + "wsl.onboarding.updateOpencode": "更新 OpenCode", + "wsl.onboarding.opencodeReadyIn": "{{distro}} 中的 OpenCode 已就绪。", + "wsl.onboarding.opencodeReady": "OpenCode 已就绪。", + "wsl.onboarding.installOpencodeIn": "在 {{distro}} 中安装 OpenCode。", + "wsl.onboarding.installOpencode": "安装 OpenCode", + "wsl.onboarding.chooseDistroFirst": "请先选择发行版。", + "wsl.onboarding.loadFailed": "加载 WSL 状态失败。", + "wsl.onboarding.loading": "加载中...", + "wsl.onboarding.installedDistros": "已安装的发行版", + "wsl.onboarding.checkAgain": "重新检查", + "wsl.onboarding.distroStatus.ready": "已就绪", + "wsl.onboarding.distroStatus.checking": "检查中...", + "wsl.onboarding.distroStatus.opencodeMissing": "未安装 OpenCode", + "wsl.onboarding.distroStatus.missingTools": "缺少 bash、curl", + "wsl.onboarding.distroStatus.unsupported": "不支持 · 请使用 WSL 2", + "wsl.onboarding.needAnotherDistro": "需要其他发行版?", + "wsl.onboarding.needAnotherDistroHint": "从 WSL 目录安装 Linux 发行版", + "wsl.onboarding.wslNotInstalled.title": "未安装 WSL", + "wsl.onboarding.wslNotInstalled.description": "OpenCode 需要 WSL(Windows Subsystem for Linux)才能添加 WSL 服务器", + "wsl.onboarding.wslUnavailable.title": "WSL 不可用", + "wsl.onboarding.wslUnavailable.description": "OpenCode 无法验证此设备上的 WSL。", + "wsl.onboarding.installWsl": "安装 WSL", + "wsl.onboarding.windowsRestartRequired": "重启 Windows 以完成 WSL 安装,然后重新打开 OpenCode。", + "wsl.onboarding.next": "下一步", + "wsl.onboarding.refresh": "刷新", + "wsl.onboarding.allDistrosAdded": "所有已安装的发行版均已添加。", + "wsl.onboarding.noDistros": "尚未检测到发行版。", + "wsl.onboarding.install": "安装", + "wsl.onboarding.installing": "正在安装...", + "wsl.onboarding.installDistro": "安装发行版", + "wsl.onboarding.searchDistros": "搜索发行版", + "wsl.onboarding.wsl2Required": "需要 WSL 2。", + "wsl.onboarding.toolsRequired": "此发行版需要 bash 和 curl。", + "wsl.onboarding.openTerminal": "打开终端", + "wsl.onboarding.path": "路径:{{path}}", + "wsl.onboarding.notFound": "未找到", + "wsl.onboarding.version": "版本:{{version}}", + "wsl.onboarding.unknown": "未知", + "wsl.onboarding.desktopVersion": "桌面版 {{version}}", + "wsl.onboarding.versionMismatch": "已安装版本与桌面应用版本不一致。", + "wsl.onboarding.adding": "正在添加...", "dialog.project.edit.title": "编辑项目", "dialog.project.edit.name": "名称", @@ -418,6 +497,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", @@ -456,10 +536,12 @@ export const dict = { "error.page.title": "出了点问题", "error.page.description": "加载应用程序时发生错误。", + "error.page.description.localServerStartup": "启动本地服务器时发生错误。", "error.page.details.label": "错误详情", "error.page.action.restart": "重启", "error.page.action.report": "上报错误", "error.page.action.reported": "错误已上报", + "error.page.action.exportLogs": "导出日志", "error.page.action.checking": "检查中...", "error.page.action.checkUpdates": "检查更新", "error.page.action.updateTo": "更新到 {{version}}", @@ -506,6 +588,9 @@ export const dict = { "home.title": "主页", "home.projects": "项目", "home.project.add": "添加项目", + "home.recentlyClosed": "最近关闭", + "home.server.collapse": "折叠服务器项目", + "home.server.expand": "展开服务器项目", "home.sessions.search.placeholder": "搜索会话", "home.sessions.search.placeholder.scoped": "在 {{scope}} 中搜索会话", "home.sessions.search.sessions": "会话", @@ -519,7 +604,12 @@ export const dict = { "session.tab.session": "会话", "session.tab.review": "审查", "session.tab.context": "上下文", + "session.tab.unknown": "未知会话", "session.panel.reviewAndFiles": "审查和文件", + "session.error.notFound": "找不到此会话", + "session.error.notFound.description": "此标签页指向的会话已不存在于此服务器上。", + "session.error.notFound.closeTab": "关闭标签页", + "session.error.serverConnection": "无法连接到此服务器", "session.review.filesChanged": "{{count}} 个文件变更", "session.review.change.one": "更改", "session.review.change.other": "更改", @@ -528,6 +618,8 @@ export const dict = { "session.review.noVcs": "未检测到 Git 版本控制系统,无法显示更改", "session.review.noSnapshot": "配置中已禁用快照跟踪,因此会话更改不可用", "session.review.noChanges": "无更改", + "session.review.noUncommittedChanges": "尚无未提交的更改", + "session.review.noBranchChanges": "尚无分支更改", "session.files.selectToOpen": "选择要打开的文件", "session.files.all": "所有文件", "session.files.empty": "无文件", @@ -541,6 +633,10 @@ export const dict = { "session.todo.title": "待办事项", "session.todo.collapse": "折叠", "session.todo.expand": "展开", + "session.question.minimize": "最小化问题", + "session.question.restore": "恢复问题", + "session.question.pending.one": "{{count}} 个待处理问题", + "session.question.pending.other": "{{count}} 个待处理问题", "session.followupDock.summary.one": "{{count}} 条排队消息", "session.followupDock.summary.other": "{{count}} 条排队消息", "session.followupDock.sendNow": "立即发送", @@ -553,9 +649,16 @@ export const dict = { "session.revertDock.expand": "展开已回滚消息", "session.revertDock.restore": "恢复消息", "session.new.title": "构建任何东西", + "session.new.project.new": "新建项目", + "session.new.project.search": "搜索项目", + "session.new.project.add": "添加项目", "session.new.worktree.main": "主分支", "session.new.worktree.mainWithBranch": "主分支({{branch}})", "session.new.worktree.create": "创建新的 worktree", + "session.new.workspace.runIn": "运行会话的位置", + "session.new.workspace.triggerLocal": "本地", + "session.new.workspace.local": "本地仓库", + "session.new.workspace.existing": "工作区…", "session.new.lastModified": "最后修改", "session.header.search.placeholder": "搜索 {{project}}", "session.header.searchFiles": "搜索文件", @@ -623,6 +726,8 @@ export const dict = { "sidebar.project.recentSessions": "最近会话", "sidebar.project.viewAllSessions": "查看全部会话", "sidebar.project.clearNotifications": "清除通知", + "sidebar.empty.title": "没有打开的项目", + "sidebar.empty.description": "打开一个项目以开始使用", "app.name.desktop": "OpenCode Desktop", @@ -637,6 +742,7 @@ export const dict = { "settings.desktop.wsl.description": "在 Windows 的 WSL 环境中运行 OpenCode 服务器。", "settings.general.section.appearance": "外观", + "settings.general.section.advanced": "高级", "settings.general.section.notifications": "系统通知", "settings.general.section.updates": "更新", "settings.general.section.sounds": "音效", @@ -644,6 +750,10 @@ export const dict = { "settings.general.section.display": "显示", "settings.general.row.language.title": "语言", "settings.general.row.language.description": "更改 OpenCode 的显示语言", + "settings.general.row.shell.title": "终端 Shell", + "settings.general.row.shell.description": "选择终端使用的 shell。兼容的 shell 也会用于智能体工具调用。", + "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": "配色方案", @@ -652,20 +762,38 @@ export const dict = { "settings.general.row.theme.description": "自定义 OpenCode 的主题。", "settings.general.row.font.title": "代码字体", "settings.general.row.font.description": "自定义代码块使用的字体", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "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.mobileTitlebarBottom.title": "底部导航", + "settings.general.row.mobileTitlebarBottom.description": "在移动设备上将标题栏和会话标签页置于屏幕底部", + "settings.general.row.showCustomAgents.title": "自定义智能体", + "settings.general.row.showCustomAgents.description": "在输入框中显示智能体选择器", "settings.general.row.reasoningSummaries.title": "显示推理摘要", "settings.general.row.reasoningSummaries.description": "在时间线中显示模型推理摘要", "settings.general.row.shellToolPartsExpanded.title": "展开 shell 工具部分", "settings.general.row.shellToolPartsExpanded.description": "默认在时间线中展开 shell 工具部分", "settings.general.row.editToolPartsExpanded.title": "展开编辑工具部分", "settings.general.row.editToolPartsExpanded.description": "默认在时间线中展开 edit、write 和 patch 工具部分", + "settings.general.row.newLayoutDesigns.title": "新版布局和设计", + "settings.general.row.newLayoutDesigns.description": "启用重新设计的布局、主页、输入框和会话界面", + "settings.general.row.pinchZoom.title": "双指缩放", + "settings.general.row.pinchZoom.description": "允许使用触控板双指捏合和 Ctrl-scroll 手势缩放", "settings.general.row.wayland.title": "使用原生 Wayland", "settings.general.row.wayland.description": "在 Wayland 上禁用 X11 回退。需要重启。", "settings.general.row.wayland.tooltip": "在混合刷新率显示器的 Linux 系统上,原生 Wayland 可能更稳定。", @@ -678,6 +806,8 @@ export const dict = { "settings.updates.row.check.description": "手动检查更新并在有更新时安装", "settings.updates.action.checkNow": "立即检查", "settings.updates.action.checking": "正在检查...", + "settings.updates.action.downloading": "正在下载...", + "settings.updates.action.installing": "正在安装...", "settings.updates.toast.latest.title": "已是最新版本", "settings.updates.toast.latest.description": "你正在使用最新版本的 OpenCode。", diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts index 7998dde3ef..afe285f6e5 100644 --- a/packages/app/src/i18n/zht.ts +++ b/packages/app/src/i18n/zht.ts @@ -27,6 +27,9 @@ export const dict = { "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": "開啟設定", @@ -49,6 +52,7 @@ export const dict = { "command.session.new": "新增工作階段", "command.file.open": "開啟檔案", "command.tab.close": "關閉分頁", + "command.tab.reopenClosed": "重新開啟已關閉的分頁", "command.context.addSelection": "將選取內容加入上下文", "command.context.addSelection.description": "加入目前檔案中選取的行", "command.input.focus": "聚焦輸入框", @@ -209,6 +213,11 @@ export const dict = { "model.input.video": "影片", "model.input.pdf": "pdf", "model.tooltip.allows": "支援: {{inputs}}", + "model.tooltip.context.label": "上下文", + "model.tooltip.inputs": "輸入", + "model.tooltip.model": "模型", + "model.tooltip.provider": "供應商", + "model.tooltip.reasoning": "推理", "model.tooltip.reasoning.allowed": "支援推理", "model.tooltip.reasoning.none": "不支援推理", "model.tooltip.context": "上下文上限 {{limit}}", @@ -218,6 +227,7 @@ export const dict = { "common.loading": "載入中", "common.loading.ellipsis": "...", "common.cancel": "取消", + "common.clear": "清除", "common.connect": "連線", "common.disconnect": "中斷連線", "common.continue": "提交", @@ -235,6 +245,8 @@ export const dict = { "prompt.mode.shell": "Shell", "prompt.mode.normal": "Prompt", "prompt.mode.shell.exit": "按 esc 退出", + "session.child.promptDisabled": "無法在子代理程式工作階段中輸入提示詞。", + "session.child.backToParent": "返回主要工作階段。", "prompt.example.1": "修復程式碼庫中的一個 TODO", "prompt.example.2": "這個專案的技術堆疊是什麼?", @@ -340,6 +352,73 @@ export const dict = { "dialog.server.menu.delete": "刪除", "dialog.server.current": "目前伺服器", "dialog.server.status.default": "預設", + "wsl.server.add": "新增 WSL 伺服器", + "wsl.server.addShort": "新增 WSL", + "wsl.server.label": "WSL", + "wsl.server.menu.label": "WSL 伺服器", + "wsl.server.retryStart": "重試啟動", + "wsl.server.updating": "更新中...", + "wsl.onboarding.step.distro": "選擇發行版", + "wsl.onboarding.step.opencode": "OpenCode", + "wsl.onboarding.checkingRuntime": "正在檢查 WSL...", + "wsl.onboarding.restartRequired": "Windows 需要重新啟動,才能完成 WSL 安裝。", + "wsl.onboarding.ready": "WSL 已就緒。", + "wsl.onboarding.required": "需要 WSL 才能繼續。", + "wsl.onboarding.checkingDistros": "正在檢查發行版...", + "wsl.onboarding.installingDistro": "正在安裝 {{distro}}...", + "wsl.onboarding.checkingDistro": "正在檢查 {{distro}}...", + "wsl.onboarding.listingDistros": "正在列出發行版...", + "wsl.onboarding.distroReady": "{{distro}} 已就緒。", + "wsl.onboarding.distroNotInstalled": "尚未安裝 {{distro}}。", + "wsl.onboarding.openDistroOnce": "開啟 {{distro}} 一次以完成設定。", + "wsl.onboarding.finishingDistro": "正在完成 {{distro}} 的設定。", + "wsl.onboarding.pickDistro": "選擇發行版,或在下方安裝。", + "wsl.onboarding.checkingOpencode": "正在檢查 OpenCode...", + "wsl.onboarding.checkingOpencodeIn": "正在檢查 {{distro}} 中的 OpenCode...", + "wsl.onboarding.updatingOpencode": "正在更新 OpenCode...", + "wsl.onboarding.updatingOpencodeIn": "正在更新 {{distro}} 中的 OpenCode...", + "wsl.onboarding.updateOpencodeIn": "更新 {{distro}} 中的 OpenCode。", + "wsl.onboarding.updateOpencode": "更新 OpenCode", + "wsl.onboarding.opencodeReadyIn": "{{distro}} 中的 OpenCode 已就緒。", + "wsl.onboarding.opencodeReady": "OpenCode 已就緒。", + "wsl.onboarding.installOpencodeIn": "在 {{distro}} 中安裝 OpenCode。", + "wsl.onboarding.installOpencode": "安裝 OpenCode", + "wsl.onboarding.chooseDistroFirst": "請先選擇發行版。", + "wsl.onboarding.loadFailed": "無法載入 WSL 狀態。", + "wsl.onboarding.loading": "載入中...", + "wsl.onboarding.installedDistros": "已安裝的發行版", + "wsl.onboarding.checkAgain": "再次檢查", + "wsl.onboarding.distroStatus.ready": "就緒", + "wsl.onboarding.distroStatus.checking": "檢查中...", + "wsl.onboarding.distroStatus.opencodeMissing": "未安裝 OpenCode", + "wsl.onboarding.distroStatus.missingTools": "缺少 bash、curl", + "wsl.onboarding.distroStatus.unsupported": "不支援 · 請使用 WSL 2", + "wsl.onboarding.needAnotherDistro": "需要其他發行版?", + "wsl.onboarding.needAnotherDistroHint": "從 WSL 目錄安裝 Linux 發行版", + "wsl.onboarding.wslNotInstalled.title": "未安裝 WSL", + "wsl.onboarding.wslNotInstalled.description": "新增 WSL 伺服器前,必須先安裝 WSL(Windows Subsystem for Linux)", + "wsl.onboarding.wslUnavailable.title": "WSL 無法使用", + "wsl.onboarding.wslUnavailable.description": "OpenCode 無法確認此電腦上的 WSL。", + "wsl.onboarding.installWsl": "安裝 WSL", + "wsl.onboarding.windowsRestartRequired": "重新啟動 Windows 以完成 WSL 安裝,然後重新開啟 OpenCode。", + "wsl.onboarding.next": "下一步", + "wsl.onboarding.refresh": "重新整理", + "wsl.onboarding.allDistrosAdded": "所有已安裝的發行版都已新增。", + "wsl.onboarding.noDistros": "尚未偵測到發行版。", + "wsl.onboarding.install": "安裝", + "wsl.onboarding.installing": "安裝中...", + "wsl.onboarding.installDistro": "安裝發行版", + "wsl.onboarding.searchDistros": "搜尋發行版", + "wsl.onboarding.wsl2Required": "需要 WSL 2。", + "wsl.onboarding.toolsRequired": "此發行版需要 bash 和 curl。", + "wsl.onboarding.openTerminal": "開啟終端機", + "wsl.onboarding.path": "路徑: {{path}}", + "wsl.onboarding.notFound": "找不到", + "wsl.onboarding.version": "版本: {{version}}", + "wsl.onboarding.unknown": "未知", + "wsl.onboarding.desktopVersion": "桌面版 {{version}}", + "wsl.onboarding.versionMismatch": "已安裝版本與桌面應用程式版本不符。", + "wsl.onboarding.adding": "新增中...", "dialog.project.edit.title": "編輯專案", "dialog.project.edit.name": "名稱", @@ -402,6 +481,7 @@ export const dict = { "language.no": "Norsk", "language.br": "Português (Brasil)", "language.bs": "Bosanski", + "language.uk": "Українська", "language.th": "ไทย", "language.tr": "Türkçe", @@ -449,10 +529,12 @@ export const dict = { "error.page.title": "出了點問題", "error.page.description": "載入應用程式時發生錯誤。", + "error.page.description.localServerStartup": "啟動本機伺服器時發生錯誤。", "error.page.details.label": "錯誤詳情", "error.page.action.restart": "重新啟動", "error.page.action.report": "回報錯誤", "error.page.action.reported": "已回報錯誤", + "error.page.action.exportLogs": "匯出日誌", "error.page.action.checking": "檢查中...", "error.page.action.checkUpdates": "檢查更新", "error.page.action.updateTo": "更新到 {{version}}", @@ -498,17 +580,39 @@ export const dict = { "home.recentProjects": "最近專案", "home.empty.title": "沒有最近專案", "home.empty.description": "透過開啟本地專案開始使用", + "home.title": "首頁", + "home.projects": "專案", + "home.project.add": "新增專案", + "home.recentlyClosed": "最近關閉", + "home.server.collapse": "收合伺服器專案", + "home.server.expand": "展開伺服器專案", + "home.sessions.search.placeholder": "搜尋工作階段", + "home.sessions.search.placeholder.scoped": "在 {{scope}} 中搜尋工作階段", + "home.sessions.search.sessions": "工作階段", + "home.sessions.search.noResults": "找不到符合 {{query}} 的工作階段", + "home.sessions.empty": "這裡還沒有內容", + "home.sessions.empty.description": "建立工作階段以開始使用", + "home.sessions.group.today": "今天", + "home.sessions.group.yesterday": "昨天", + "home.sessions.group.older": "更早", "session.tab.session": "工作階段", "session.tab.review": "審查", "session.tab.context": "上下文", + "session.tab.unknown": "未知的工作階段", "session.panel.reviewAndFiles": "審查與檔案", + "session.error.notFound": "找不到此工作階段", + "session.error.notFound.description": "此分頁指向的工作階段已不存在於此伺服器。", + "session.error.notFound.closeTab": "關閉分頁", + "session.error.serverConnection": "無法連線至此伺服器", "session.review.filesChanged": "{{count}} 個檔案變更", "session.review.change.one": "變更", "session.review.change.other": "變更", "session.review.loadingChanges": "正在載入變更...", "session.review.empty": "此工作階段暫無變更", "session.review.noChanges": "沒有變更", + "session.review.noUncommittedChanges": "尚無未提交的變更", + "session.review.noBranchChanges": "尚無分支變更", "session.review.noVcs": "未偵測到 Git 版本控制系統,無法顯示變更", "session.review.noSnapshot": "設定中已停用快照追蹤,因此無法使用工作階段變更", "session.files.selectToOpen": "選取要開啟的檔案", @@ -525,6 +629,10 @@ export const dict = { "session.todo.title": "待辦事項", "session.todo.collapse": "折疊", "session.todo.expand": "展開", + "session.question.minimize": "最小化問題", + "session.question.restore": "還原問題", + "session.question.pending.one": "{{count}} 個待處理問題", + "session.question.pending.other": "{{count}} 個待處理問題", "session.followupDock.summary.one": "{{count}} 則佇列訊息", "session.followupDock.summary.other": "{{count}} 則佇列訊息", "session.followupDock.sendNow": "立即傳送", @@ -538,9 +646,16 @@ export const dict = { "session.revertDock.restore": "還原訊息", "session.new.title": "建構任何東西", + "session.new.project.new": "新專案", + "session.new.project.search": "搜尋專案", + "session.new.project.add": "新增專案", "session.new.worktree.main": "主分支", "session.new.worktree.mainWithBranch": "主分支 ({{branch}})", "session.new.worktree.create": "建立新的 worktree", + "session.new.workspace.runIn": "工作階段執行位置", + "session.new.workspace.triggerLocal": "本機", + "session.new.workspace.local": "本機儲存庫", + "session.new.workspace.existing": "工作區…", "session.new.lastModified": "最後修改", "session.header.search.placeholder": "搜尋 {{project}}", @@ -608,6 +723,8 @@ export const dict = { "sidebar.project.recentSessions": "最近工作階段", "sidebar.project.viewAllSessions": "查看全部工作階段", "sidebar.project.clearNotifications": "清除通知", + "sidebar.empty.title": "未開啟任何專案", + "sidebar.empty.description": "開啟專案以開始使用", "app.name.desktop": "OpenCode Desktop", "settings.section.desktop": "桌面", @@ -619,6 +736,7 @@ export const dict = { "settings.desktop.wsl.description": "在 Windows 上的 WSL 中執行 OpenCode 伺服器。", "settings.general.section.appearance": "外觀", + "settings.general.section.advanced": "進階", "settings.general.section.notifications": "系統通知", "settings.general.section.updates": "更新", "settings.general.section.sounds": "音效", @@ -627,6 +745,10 @@ export const dict = { "settings.general.row.language.title": "語言", "settings.general.row.language.description": "變更 OpenCode 的顯示語言", + "settings.general.row.shell.title": "終端機 Shell", + "settings.general.row.shell.description": "選擇終端機使用的 Shell。相容的 Shell 也會用於代理程式工具呼叫。", + "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": "配色方案", @@ -635,14 +757,28 @@ export const dict = { "settings.general.row.theme.description": "自訂 OpenCode 的主題。", "settings.general.row.font.title": "程式碼字型", "settings.general.row.font.description": "自訂程式碼區塊使用的字型", - "settings.general.row.terminalFont.title": "Terminal Font", - "settings.general.row.terminalFont.description": "Customise the font used in the terminal", + "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.mobileTitlebarBottom.title": "底部導覽", + "settings.general.row.mobileTitlebarBottom.description": "在行動裝置上將標題列和工作階段分頁置於畫面底部", + "settings.general.row.showCustomAgents.title": "自訂代理程式", + "settings.general.row.showCustomAgents.description": "在輸入區顯示代理程式選擇器", "settings.general.row.reasoningSummaries.title": "顯示推理摘要", "settings.general.row.reasoningSummaries.description": "在時間軸中顯示模型推理摘要", @@ -650,6 +786,10 @@ export const dict = { "settings.general.row.shellToolPartsExpanded.description": "在時間軸中預設展開 shell 工具區塊", "settings.general.row.editToolPartsExpanded.title": "展開 edit 工具區塊", "settings.general.row.editToolPartsExpanded.description": "在時間軸中預設展開 edit、write 和 patch 工具區塊", + "settings.general.row.newLayoutDesigns.title": "新版面與設計", + "settings.general.row.newLayoutDesigns.description": "啟用重新設計的版面、首頁、輸入區和工作階段介面", + "settings.general.row.pinchZoom.title": "雙指縮放", + "settings.general.row.pinchZoom.description": "允許使用觸控板雙指開合和 Ctrl-捲動手勢縮放", "settings.general.row.wayland.title": "使用原生 Wayland", "settings.general.row.wayland.description": "在 Wayland 上停用 X11 後備模式。需要重新啟動。", "settings.general.row.wayland.tooltip": "在混合更新率螢幕的 Linux 系統上,原生 Wayland 可能更穩定。", @@ -663,6 +803,8 @@ export const dict = { "settings.updates.row.check.description": "手動檢查更新並在有更新時安裝", "settings.updates.action.checkNow": "立即檢查", "settings.updates.action.checking": "檢查中...", + "settings.updates.action.downloading": "下載中...", + "settings.updates.action.installing": "安裝中...", "settings.updates.toast.latest.title": "已是最新版本", "settings.updates.toast.latest.description": "你正在使用最新版本的 OpenCode。", diff --git a/packages/app/src/pages/session/timeline/message-timeline.tsx b/packages/app/src/pages/session/timeline/message-timeline.tsx index 2e2c65af3b..d6cc7be972 100644 --- a/packages/app/src/pages/session/timeline/message-timeline.tsx +++ b/packages/app/src/pages/session/timeline/message-timeline.tsx @@ -160,8 +160,10 @@ function TimelineDiffSummaryRow(props: { diffs: SummaryDiff[] }) { >
- {props.diffs.length} {language.t("ui.sessionTurn.diffs.changed")}{" "} - {language.t(props.diffs.length === 1 ? "ui.common.file.one" : "ui.common.file.other")} + {language.t( + props.diffs.length === 1 ? "ui.sessionTurn.diffs.changed.one" : "ui.sessionTurn.diffs.changed.other", + { count: String(props.diffs.length) }, + )} 0}> diff --git a/packages/session-ui/src/components/session-turn.tsx b/packages/session-ui/src/components/session-turn.tsx index 4ebf6459b1..75274fc50e 100644 --- a/packages/session-ui/src/components/session-turn.tsx +++ b/packages/session-ui/src/components/session-turn.tsx @@ -440,8 +440,10 @@ export function SessionTurn( >
- {edited()} {i18n.t("ui.sessionTurn.diffs.changed")}{" "} - {i18n.t(edited() === 1 ? "ui.common.file.one" : "ui.common.file.other")} + {i18n.t( + edited() === 1 ? "ui.sessionTurn.diffs.changed.one" : "ui.sessionTurn.diffs.changed.other", + { count: String(edited()) }, + )} 0}> diff --git a/packages/ui/src/i18n/ar.ts b/packages/ui/src/i18n/ar.ts index dd8cfed6f9..8e112e4d19 100644 --- a/packages/ui/src/i18n/ar.ts +++ b/packages/ui/src/i18n/ar.ts @@ -1,5 +1,7 @@ export const dict = { "ui.sessionReview.title": "تغييرات الجلسة", + "ui.sessionReview.title.git": "تغييرات Git", + "ui.sessionReview.title.branch": "تغييرات الفرع", "ui.sessionReview.title.lastTurn": "تغييرات آخر دور", "ui.sessionReview.diffStyle.unified": "موحد", "ui.sessionReview.diffStyle.split": "منقسم", @@ -16,6 +18,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "Diff كبير جدا لعرضه", "ui.sessionReview.largeDiff.meta": "الحد: {{limit}} سطرًا متغيرًا. الحالي: {{current}} سطرًا متغيرًا.", "ui.sessionReview.largeDiff.renderAnyway": "اعرض على أي حال", + "ui.sessionReviewV2.expandMode": "توسيع الفروقات أو طيها", + "ui.sessionReviewV2.filterFiles": "تصفية الملفات", + "ui.sessionReviewV2.toggleSidebar": "تبديل شجرة الملفات", + "ui.sessionReviewV2.showAllLines": "إظهار جميع الأسطر", + "ui.sessionReviewV2.hideNonDiffLines": "إخفاء الأسطر خارج الفروقات", + "ui.sessionReviewV2.unifiedDiff": "فروقات موحدة", + "ui.sessionReviewV2.splitDiff": "فروقات منقسمة", + "ui.sessionReviewV2.previousFile": "الملف السابق", + "ui.sessionReviewV2.nextFile": "الملف التالي", + "ui.sessionReviewV2.diffView": "عرض الفروقات", + "ui.sessionReviewV2.empty.noGit.title": "لا توجد تغييرات متتبعة", + "ui.sessionReviewV2.empty.noGit.description": "تتبع التغييرات في هذا المشروع وراجعها وتراجع عنها", + "ui.sessionReviewV2.empty.noGit.action": "إنشاء مستودع Git", + "ui.sessionReviewV2.empty.noGit.actionLoading": "جارٍ إنشاء مستودع Git...", + "ui.sessionReviewV2.empty.changes.title": "لا توجد تغييرات في الملفات بعد", + "ui.sessionReviewV2.empty.changes.description": "ستظهر تغييرات المشروع هنا", "ui.fileMedia.kind.image": "صورة", "ui.fileMedia.kind.audio": "صوت", "ui.fileMedia.state.removed": "تمت إزالة {{kind}}", @@ -32,11 +50,17 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "أضف تعليقًا", "ui.lineComment.submit": "تعليق", + "ui.lineComment.cancel": "إلغاء", "ui.sessionTurn.steps.show": "إظهار الخطوات", "ui.sessionTurn.steps.hide": "إخفاء الخطوات", "ui.sessionTurn.summary.response": "استجابة", "ui.sessionTurn.diff.showMore": "إظهار المزيد من التغييرات ({{count}})", + "ui.sessionTurn.diffs.changed.one": "ملف معدل: {{count}}", + "ui.sessionTurn.diffs.changed.other": "الملفات المعدلة: {{count}}", + "ui.sessionTurn.diffs.showAll": "إظهار الكل", + "ui.sessionTurn.diffs.showLess": "إظهار أقل", + "ui.sessionTurn.diffs.more": "ملفات إضافية: {{count}}", "ui.sessionTurn.retry.retrying": "إعادة المحاولة", "ui.sessionTurn.retry.inSeconds": "خلال {{seconds}} ثواني", diff --git a/packages/ui/src/i18n/br.ts b/packages/ui/src/i18n/br.ts index 4b2c418ca5..4661ece487 100644 --- a/packages/ui/src/i18n/br.ts +++ b/packages/ui/src/i18n/br.ts @@ -1,5 +1,7 @@ export const dict = { "ui.sessionReview.title": "Alterações da sessão", + "ui.sessionReview.title.git": "Alterações do Git", + "ui.sessionReview.title.branch": "Alterações da branch", "ui.sessionReview.title.lastTurn": "Alterações do último turno", "ui.sessionReview.diffStyle.unified": "Unificado", "ui.sessionReview.diffStyle.split": "Dividido", @@ -16,6 +18,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "Diff grande demais para renderizar", "ui.sessionReview.largeDiff.meta": "Limite: {{limit}} linhas alteradas. Atual: {{current}} linhas alteradas.", "ui.sessionReview.largeDiff.renderAnyway": "Renderizar mesmo assim", + "ui.sessionReviewV2.expandMode": "Expandir ou recolher diff", + "ui.sessionReviewV2.filterFiles": "Filtrar arquivos", + "ui.sessionReviewV2.toggleSidebar": "Alternar árvore de arquivos", + "ui.sessionReviewV2.showAllLines": "Mostrar todas as linhas", + "ui.sessionReviewV2.hideNonDiffLines": "Ocultar linhas fora do diff", + "ui.sessionReviewV2.unifiedDiff": "Diff unificado", + "ui.sessionReviewV2.splitDiff": "Diff dividido", + "ui.sessionReviewV2.previousFile": "Arquivo anterior", + "ui.sessionReviewV2.nextFile": "Próximo arquivo", + "ui.sessionReviewV2.diffView": "Visualização do diff", + "ui.sessionReviewV2.empty.noGit.title": "Nenhuma alteração rastreada", + "ui.sessionReviewV2.empty.noGit.description": "Rastreie, revise e desfaça alterações neste projeto", + "ui.sessionReviewV2.empty.noGit.action": "Criar repositório Git", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Criando repositório Git...", + "ui.sessionReviewV2.empty.changes.title": "Nenhuma alteração em arquivos ainda", + "ui.sessionReviewV2.empty.changes.description": "As alterações do projeto aparecerão aqui", "ui.fileMedia.kind.image": "imagem", "ui.fileMedia.kind.audio": "áudio", "ui.fileMedia.state.removed": "Removido: {{kind}}", @@ -32,11 +50,17 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "Adicionar comentário", "ui.lineComment.submit": "Comentar", + "ui.lineComment.cancel": "Cancelar", "ui.sessionTurn.steps.show": "Mostrar passos", "ui.sessionTurn.steps.hide": "Ocultar passos", "ui.sessionTurn.summary.response": "Resposta", "ui.sessionTurn.diff.showMore": "Mostrar mais alterações ({{count}})", + "ui.sessionTurn.diffs.changed.one": "Arquivo alterado: {{count}}", + "ui.sessionTurn.diffs.changed.other": "Arquivos alterados: {{count}}", + "ui.sessionTurn.diffs.showAll": "Mostrar tudo", + "ui.sessionTurn.diffs.showLess": "Mostrar menos", + "ui.sessionTurn.diffs.more": "+{{count}} a mais", "ui.sessionTurn.retry.retrying": "tentando novamente", "ui.sessionTurn.retry.inSeconds": "em {{seconds}}s", diff --git a/packages/ui/src/i18n/bs.ts b/packages/ui/src/i18n/bs.ts index be041f1471..eac44effd4 100644 --- a/packages/ui/src/i18n/bs.ts +++ b/packages/ui/src/i18n/bs.ts @@ -4,6 +4,8 @@ type Keys = keyof typeof en export const dict = { "ui.sessionReview.title": "Promjene sesije", + "ui.sessionReview.title.git": "Git promjene", + "ui.sessionReview.title.branch": "Promjene na grani", "ui.sessionReview.title.lastTurn": "Promjene u posljednjem potezu", "ui.sessionReview.diffStyle.unified": "Ujedinjeno", "ui.sessionReview.diffStyle.split": "Podijeljeno", @@ -20,6 +22,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "Diff je prevelik za prikaz", "ui.sessionReview.largeDiff.meta": "Limit: {{limit}} izmijenjenih linija. Trenutno: {{current}} izmijenjenih linija.", "ui.sessionReview.largeDiff.renderAnyway": "Prikaži svejedno", + "ui.sessionReviewV2.expandMode": "Proširi ili sažmi diff", + "ui.sessionReviewV2.filterFiles": "Filtriraj datoteke", + "ui.sessionReviewV2.toggleSidebar": "Prikaži/sakrij stablo datoteka", + "ui.sessionReviewV2.showAllLines": "Prikaži sve linije", + "ui.sessionReviewV2.hideNonDiffLines": "Sakrij linije bez izmjena", + "ui.sessionReviewV2.unifiedDiff": "Ujedinjeni diff", + "ui.sessionReviewV2.splitDiff": "Podijeljeni diff", + "ui.sessionReviewV2.previousFile": "Prethodna datoteka", + "ui.sessionReviewV2.nextFile": "Sljedeća datoteka", + "ui.sessionReviewV2.diffView": "Prikaz diff-a", + "ui.sessionReviewV2.empty.noGit.title": "Nema praćenih promjena", + "ui.sessionReviewV2.empty.noGit.description": "Prati, pregledaj i poništi promjene u ovom projektu", + "ui.sessionReviewV2.empty.noGit.action": "Kreiraj Git repozitorij", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Kreiranje Git repozitorija...", + "ui.sessionReviewV2.empty.changes.title": "Još nema izmjena u datotekama", + "ui.sessionReviewV2.empty.changes.description": "Promjene projekta će se prikazati ovdje", "ui.fileMedia.kind.image": "slika", "ui.fileMedia.kind.audio": "audio", "ui.fileMedia.state.removed": "Uklonjeno: {{kind}}", @@ -36,11 +54,17 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "Dodaj komentar", "ui.lineComment.submit": "Komentariši", + "ui.lineComment.cancel": "Otkaži", "ui.sessionTurn.steps.show": "Prikaži korake", "ui.sessionTurn.steps.hide": "Sakrij korake", "ui.sessionTurn.summary.response": "Odgovor", "ui.sessionTurn.diff.showMore": "Prikaži još izmjena ({{count}})", + "ui.sessionTurn.diffs.changed.one": "Izmijenjena datoteka: {{count}}", + "ui.sessionTurn.diffs.changed.other": "Izmijenjene datoteke: {{count}}", + "ui.sessionTurn.diffs.showAll": "Prikaži sve", + "ui.sessionTurn.diffs.showLess": "Prikaži manje", + "ui.sessionTurn.diffs.more": "+ još {{count}}", "ui.sessionTurn.retry.retrying": "ponovni pokušaj", "ui.sessionTurn.retry.inSeconds": "za {{seconds}}s", diff --git a/packages/ui/src/i18n/da.ts b/packages/ui/src/i18n/da.ts index 91adc52e9d..0057691b2c 100644 --- a/packages/ui/src/i18n/da.ts +++ b/packages/ui/src/i18n/da.ts @@ -1,5 +1,7 @@ export const dict = { "ui.sessionReview.title": "Sessionsændringer", + "ui.sessionReview.title.git": "Git-ændringer", + "ui.sessionReview.title.branch": "Grenændringer", "ui.sessionReview.title.lastTurn": "Ændringer fra sidste tur", "ui.sessionReview.diffStyle.unified": "Samlet", "ui.sessionReview.diffStyle.split": "Opdelt", @@ -17,6 +19,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "Diff er for stor til at blive vist", "ui.sessionReview.largeDiff.meta": "Grænse: {{limit}} ændrede linjer. Nuværende: {{current}} ændrede linjer.", "ui.sessionReview.largeDiff.renderAnyway": "Vis alligevel", + "ui.sessionReviewV2.expandMode": "Udvid eller skjul diff", + "ui.sessionReviewV2.filterFiles": "Filtrer filer", + "ui.sessionReviewV2.toggleSidebar": "Skift filtræ", + "ui.sessionReviewV2.showAllLines": "Vis alle linjer", + "ui.sessionReviewV2.hideNonDiffLines": "Skjul linjer uden ændringer", + "ui.sessionReviewV2.unifiedDiff": "Samlet diff", + "ui.sessionReviewV2.splitDiff": "Opdelt diff", + "ui.sessionReviewV2.previousFile": "Forrige fil", + "ui.sessionReviewV2.nextFile": "Næste fil", + "ui.sessionReviewV2.diffView": "Diffvisning", + "ui.sessionReviewV2.empty.noGit.title": "Ingen sporede ændringer", + "ui.sessionReviewV2.empty.noGit.description": "Spor, gennemgå og fortryd ændringer i dette projekt", + "ui.sessionReviewV2.empty.noGit.action": "Opret et Git-repository", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Opretter Git-repository...", + "ui.sessionReviewV2.empty.changes.title": "Ingen filændringer endnu", + "ui.sessionReviewV2.empty.changes.description": "Projektændringer vises her", "ui.fileMedia.kind.image": "billede", "ui.fileMedia.kind.audio": "lyd", "ui.fileMedia.state.removed": "Fjernet: {{kind}}", @@ -32,10 +50,16 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "Tilføj kommentar", "ui.lineComment.submit": "Kommenter", + "ui.lineComment.cancel": "Annuller", "ui.sessionTurn.steps.show": "Vis trin", "ui.sessionTurn.steps.hide": "Skjul trin", "ui.sessionTurn.summary.response": "Svar", "ui.sessionTurn.diff.showMore": "Vis flere ændringer ({{count}})", + "ui.sessionTurn.diffs.changed.one": "Ændret fil: {{count}}", + "ui.sessionTurn.diffs.changed.other": "Ændrede filer: {{count}}", + "ui.sessionTurn.diffs.showAll": "Vis alle", + "ui.sessionTurn.diffs.showLess": "Vis færre", + "ui.sessionTurn.diffs.more": "+{{count}} mere", "ui.sessionTurn.retry.retrying": "prøver igen", "ui.sessionTurn.retry.inSeconds": "om {{seconds}}s", diff --git a/packages/ui/src/i18n/de.ts b/packages/ui/src/i18n/de.ts index 7b36859bf6..4926527428 100644 --- a/packages/ui/src/i18n/de.ts +++ b/packages/ui/src/i18n/de.ts @@ -4,6 +4,8 @@ type Keys = keyof typeof en export const dict = { "ui.sessionReview.title": "Sitzungsänderungen", + "ui.sessionReview.title.git": "Git-Änderungen", + "ui.sessionReview.title.branch": "Branch-Änderungen", "ui.sessionReview.title.lastTurn": "Änderungen der letzten Runde", "ui.sessionReview.diffStyle.unified": "Vereinheitlicht", "ui.sessionReview.diffStyle.split": "Geteilt", @@ -21,6 +23,23 @@ export const dict = { "ui.sessionReview.largeDiff.title": "Diff zu groß zum Rendern", "ui.sessionReview.largeDiff.meta": "Limit: {{limit}} geänderte Zeilen. Aktuell: {{current}} geänderte Zeilen.", "ui.sessionReview.largeDiff.renderAnyway": "Trotzdem rendern", + "ui.sessionReviewV2.expandMode": "Diff ein- oder ausklappen", + "ui.sessionReviewV2.filterFiles": "Dateien filtern", + "ui.sessionReviewV2.toggleSidebar": "Dateibaum umschalten", + "ui.sessionReviewV2.showAllLines": "Alle Zeilen anzeigen", + "ui.sessionReviewV2.hideNonDiffLines": "Zeilen außerhalb des Diffs ausblenden", + "ui.sessionReviewV2.unifiedDiff": "Vereinheitlichter Diff", + "ui.sessionReviewV2.splitDiff": "Geteilter Diff", + "ui.sessionReviewV2.previousFile": "Vorherige Datei", + "ui.sessionReviewV2.nextFile": "Nächste Datei", + "ui.sessionReviewV2.diffView": "Diff-Ansicht", + "ui.sessionReviewV2.empty.noGit.title": "Keine verfolgten Änderungen", + "ui.sessionReviewV2.empty.noGit.description": + "Änderungen in diesem Projekt verfolgen, überprüfen und rückgängig machen", + "ui.sessionReviewV2.empty.noGit.action": "Git-Repository erstellen", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Git-Repository wird erstellt...", + "ui.sessionReviewV2.empty.changes.title": "Noch keine Dateiänderungen", + "ui.sessionReviewV2.empty.changes.description": "Projektänderungen werden hier angezeigt", "ui.fileMedia.kind.image": "bild", "ui.fileMedia.kind.audio": "audio", "ui.fileMedia.state.removed": "{{kind}} entfernt", @@ -38,10 +57,16 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "Kommentar hinzufügen", "ui.lineComment.submit": "Kommentieren", + "ui.lineComment.cancel": "Abbrechen", "ui.sessionTurn.steps.show": "Schritte anzeigen", "ui.sessionTurn.steps.hide": "Schritte ausblenden", "ui.sessionTurn.summary.response": "Antwort", "ui.sessionTurn.diff.showMore": "Weitere Änderungen anzeigen ({{count}})", + "ui.sessionTurn.diffs.changed.one": "Geänderte Datei: {{count}}", + "ui.sessionTurn.diffs.changed.other": "Geänderte Dateien: {{count}}", + "ui.sessionTurn.diffs.showAll": "Alle anzeigen", + "ui.sessionTurn.diffs.showLess": "Weniger anzeigen", + "ui.sessionTurn.diffs.more": "+{{count}} weitere", "ui.sessionTurn.retry.retrying": "erneuter Versuch", "ui.sessionTurn.retry.inSeconds": "in {{seconds}}s", diff --git a/packages/ui/src/i18n/en.ts b/packages/ui/src/i18n/en.ts index 5e9e02b215..f982766d13 100644 --- a/packages/ui/src/i18n/en.ts +++ b/packages/ui/src/i18n/en.ts @@ -58,7 +58,8 @@ export const dict: Record = { "ui.sessionTurn.steps.hide": "Hide steps", "ui.sessionTurn.summary.response": "Response", "ui.sessionTurn.diff.showMore": "Show more changes ({{count}})", - "ui.sessionTurn.diffs.changed": "Changed", + "ui.sessionTurn.diffs.changed.one": "{{count}} Changed file", + "ui.sessionTurn.diffs.changed.other": "{{count}} Changed files", "ui.sessionTurn.diffs.showAll": "Show all", "ui.sessionTurn.diffs.showLess": "Show less", "ui.sessionTurn.diffs.more": "+{{count}} more files", diff --git a/packages/ui/src/i18n/es.ts b/packages/ui/src/i18n/es.ts index f883531031..59502b8421 100644 --- a/packages/ui/src/i18n/es.ts +++ b/packages/ui/src/i18n/es.ts @@ -1,5 +1,7 @@ export const dict = { "ui.sessionReview.title": "Cambios de la sesión", + "ui.sessionReview.title.git": "Cambios de Git", + "ui.sessionReview.title.branch": "Cambios de la rama", "ui.sessionReview.title.lastTurn": "Cambios del último turno", "ui.sessionReview.diffStyle.unified": "Unificado", "ui.sessionReview.diffStyle.split": "Dividido", @@ -16,6 +18,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "Diff demasiado grande para renderizar", "ui.sessionReview.largeDiff.meta": "Límite: {{limit}} líneas modificadas. Actual: {{current}} líneas modificadas.", "ui.sessionReview.largeDiff.renderAnyway": "Renderizar de todos modos", + "ui.sessionReviewV2.expandMode": "Expandir o colapsar diff", + "ui.sessionReviewV2.filterFiles": "Filtrar archivos", + "ui.sessionReviewV2.toggleSidebar": "Alternar árbol de archivos", + "ui.sessionReviewV2.showAllLines": "Mostrar todas las líneas", + "ui.sessionReviewV2.hideNonDiffLines": "Ocultar líneas sin cambios", + "ui.sessionReviewV2.unifiedDiff": "Diff unificado", + "ui.sessionReviewV2.splitDiff": "Diff dividido", + "ui.sessionReviewV2.previousFile": "Archivo anterior", + "ui.sessionReviewV2.nextFile": "Siguiente archivo", + "ui.sessionReviewV2.diffView": "Vista de diff", + "ui.sessionReviewV2.empty.noGit.title": "No hay cambios rastreados", + "ui.sessionReviewV2.empty.noGit.description": "Rastrea, revisa y deshaz cambios en este proyecto", + "ui.sessionReviewV2.empty.noGit.action": "Crear repositorio Git", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Creando repositorio Git...", + "ui.sessionReviewV2.empty.changes.title": "Aún no hay cambios en los archivos", + "ui.sessionReviewV2.empty.changes.description": "Los cambios del proyecto aparecerán aquí", "ui.fileMedia.kind.image": "imagen", "ui.fileMedia.kind.audio": "audio", "ui.fileMedia.state.removed": "Archivo de {{kind}} eliminado", @@ -32,11 +50,17 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "Añadir comentario", "ui.lineComment.submit": "Comentar", + "ui.lineComment.cancel": "Cancelar", "ui.sessionTurn.steps.show": "Mostrar pasos", "ui.sessionTurn.steps.hide": "Ocultar pasos", "ui.sessionTurn.summary.response": "Respuesta", "ui.sessionTurn.diff.showMore": "Mostrar más cambios ({{count}})", + "ui.sessionTurn.diffs.changed.one": "Archivo modificado: {{count}}", + "ui.sessionTurn.diffs.changed.other": "Archivos modificados: {{count}}", + "ui.sessionTurn.diffs.showAll": "Mostrar todos", + "ui.sessionTurn.diffs.showLess": "Mostrar menos", + "ui.sessionTurn.diffs.more": "+{{count}} más", "ui.sessionTurn.retry.retrying": "reintentando", "ui.sessionTurn.retry.inSeconds": "en {{seconds}}s", diff --git a/packages/ui/src/i18n/fr.ts b/packages/ui/src/i18n/fr.ts index 3ae122d35e..ccf681cc84 100644 --- a/packages/ui/src/i18n/fr.ts +++ b/packages/ui/src/i18n/fr.ts @@ -1,5 +1,7 @@ export const dict = { "ui.sessionReview.title": "Modifications de la session", + "ui.sessionReview.title.git": "Modifications Git", + "ui.sessionReview.title.branch": "Modifications de la branche", "ui.sessionReview.title.lastTurn": "Modifications du dernier tour", "ui.sessionReview.diffStyle.unified": "Unifié", "ui.sessionReview.diffStyle.split": "Divisé", @@ -16,6 +18,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "Diff trop volumineux pour être affiché", "ui.sessionReview.largeDiff.meta": "Limite : {{limit}} lignes modifiées. Actuel : {{current}} lignes modifiées.", "ui.sessionReview.largeDiff.renderAnyway": "Afficher quand même", + "ui.sessionReviewV2.expandMode": "Développer ou réduire le diff", + "ui.sessionReviewV2.filterFiles": "Filtrer les fichiers", + "ui.sessionReviewV2.toggleSidebar": "Afficher ou masquer l'arborescence des fichiers", + "ui.sessionReviewV2.showAllLines": "Afficher toutes les lignes", + "ui.sessionReviewV2.hideNonDiffLines": "Masquer les lignes hors diff", + "ui.sessionReviewV2.unifiedDiff": "Diff unifié", + "ui.sessionReviewV2.splitDiff": "Diff côte à côte", + "ui.sessionReviewV2.previousFile": "Fichier précédent", + "ui.sessionReviewV2.nextFile": "Fichier suivant", + "ui.sessionReviewV2.diffView": "Vue du diff", + "ui.sessionReviewV2.empty.noGit.title": "Aucune modification suivie", + "ui.sessionReviewV2.empty.noGit.description": "Suivre, examiner et annuler les modifications dans ce projet", + "ui.sessionReviewV2.empty.noGit.action": "Créer un dépôt Git", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Création du dépôt Git...", + "ui.sessionReviewV2.empty.changes.title": "Aucune modification de fichier pour l'instant", + "ui.sessionReviewV2.empty.changes.description": "Les modifications du projet apparaîtront ici", "ui.fileMedia.kind.image": "image", "ui.fileMedia.kind.audio": "audio", "ui.fileMedia.state.removed": "Fichier {{kind}} supprimé", @@ -32,11 +50,17 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "Ajouter un commentaire", "ui.lineComment.submit": "Commenter", + "ui.lineComment.cancel": "Annuler", "ui.sessionTurn.steps.show": "Afficher les étapes", "ui.sessionTurn.steps.hide": "Masquer les étapes", "ui.sessionTurn.summary.response": "Réponse", "ui.sessionTurn.diff.showMore": "Afficher plus de modifications ({{count}})", + "ui.sessionTurn.diffs.changed.one": "Fichier modifié : {{count}}", + "ui.sessionTurn.diffs.changed.other": "Fichiers modifiés : {{count}}", + "ui.sessionTurn.diffs.showAll": "Tout afficher", + "ui.sessionTurn.diffs.showLess": "Afficher moins", + "ui.sessionTurn.diffs.more": "+{{count}} de plus", "ui.sessionTurn.retry.retrying": "nouvelle tentative", "ui.sessionTurn.retry.inSeconds": "dans {{seconds}}s", diff --git a/packages/ui/src/i18n/ja.ts b/packages/ui/src/i18n/ja.ts index 1b50cb5ff1..f22c0f6d5f 100644 --- a/packages/ui/src/i18n/ja.ts +++ b/packages/ui/src/i18n/ja.ts @@ -1,8 +1,10 @@ export const dict = { "ui.sessionReview.title": "セッションの変更", + "ui.sessionReview.title.git": "Gitの変更", + "ui.sessionReview.title.branch": "ブランチの変更", "ui.sessionReview.title.lastTurn": "前回ターンの変更", - "ui.sessionReview.diffStyle.unified": "Unified", - "ui.sessionReview.diffStyle.split": "Split", + "ui.sessionReview.diffStyle.unified": "統合差分", + "ui.sessionReview.diffStyle.split": "分割差分", "ui.sessionReview.openFile": "ファイルを開く", "ui.sessionReview.selection.line": "{{line}} 行目", "ui.sessionReview.selection.lines": "{{start}}-{{end}} 行目", @@ -17,6 +19,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "差分が大きすぎて表示できません", "ui.sessionReview.largeDiff.meta": "上限: {{limit}} 変更行。現在: {{current}} 変更行。", "ui.sessionReview.largeDiff.renderAnyway": "それでも表示する", + "ui.sessionReviewV2.expandMode": "差分を展開または折りたたむ", + "ui.sessionReviewV2.filterFiles": "ファイルを絞り込む", + "ui.sessionReviewV2.toggleSidebar": "ファイルツリーを切り替える", + "ui.sessionReviewV2.showAllLines": "すべての行を表示", + "ui.sessionReviewV2.hideNonDiffLines": "差分以外の行を非表示", + "ui.sessionReviewV2.unifiedDiff": "統合差分", + "ui.sessionReviewV2.splitDiff": "分割差分", + "ui.sessionReviewV2.previousFile": "前のファイル", + "ui.sessionReviewV2.nextFile": "次のファイル", + "ui.sessionReviewV2.diffView": "差分ビュー", + "ui.sessionReviewV2.empty.noGit.title": "追跡中の変更はありません", + "ui.sessionReviewV2.empty.noGit.description": "このプロジェクトの変更を追跡、レビュー、取り消しできます", + "ui.sessionReviewV2.empty.noGit.action": "Gitリポジトリを作成", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Gitリポジトリを作成中...", + "ui.sessionReviewV2.empty.changes.title": "ファイルの変更はまだありません", + "ui.sessionReviewV2.empty.changes.description": "プロジェクトの変更がここに表示されます", "ui.fileMedia.kind.image": "画像", "ui.fileMedia.kind.audio": "音声", "ui.fileMedia.state.removed": "{{kind}}は削除されました", @@ -32,10 +50,16 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "へのコメントを作成中", "ui.lineComment.placeholder": "コメントを追加", "ui.lineComment.submit": "コメント", + "ui.lineComment.cancel": "キャンセル", "ui.sessionTurn.steps.show": "ステップを表示", "ui.sessionTurn.steps.hide": "ステップを隠す", "ui.sessionTurn.summary.response": "応答", "ui.sessionTurn.diff.showMore": "さらに変更を表示 ({{count}})", + "ui.sessionTurn.diffs.changed.one": "変更済みファイル: {{count}}件", + "ui.sessionTurn.diffs.changed.other": "変更済みファイル: {{count}}件", + "ui.sessionTurn.diffs.showAll": "すべて表示", + "ui.sessionTurn.diffs.showLess": "一部のみ表示", + "ui.sessionTurn.diffs.more": "+他{{count}}件", "ui.sessionTurn.retry.retrying": "再試行中", "ui.sessionTurn.retry.inSeconds": "{{seconds}}秒後", diff --git a/packages/ui/src/i18n/ko.ts b/packages/ui/src/i18n/ko.ts index d6c480364d..f358810fd2 100644 --- a/packages/ui/src/i18n/ko.ts +++ b/packages/ui/src/i18n/ko.ts @@ -165,4 +165,29 @@ export const dict = { "ui.toolErrorCard.copyError": "오류 복사", "ui.message.duration.seconds": "{{count}}초", "ui.message.duration.minutesSeconds": "{{minutes}}분 {{seconds}}초", + + "ui.sessionReview.title.git": "Git 변경 사항", + "ui.sessionReview.title.branch": "브랜치 변경 사항", + "ui.sessionReviewV2.expandMode": "diff 펼치기 또는 접기", + "ui.sessionReviewV2.filterFiles": "파일 필터링", + "ui.sessionReviewV2.toggleSidebar": "파일 트리 토글", + "ui.sessionReviewV2.showAllLines": "모든 줄 표시", + "ui.sessionReviewV2.hideNonDiffLines": "변경되지 않은 줄 숨기기", + "ui.sessionReviewV2.unifiedDiff": "통합 diff", + "ui.sessionReviewV2.splitDiff": "분할 diff", + "ui.sessionReviewV2.previousFile": "이전 파일", + "ui.sessionReviewV2.nextFile": "다음 파일", + "ui.sessionReviewV2.diffView": "diff 보기", + "ui.sessionReviewV2.empty.noGit.title": "추적 중인 변경 사항 없음", + "ui.sessionReviewV2.empty.noGit.description": "이 프로젝트의 변경 사항을 추적, 검토 및 실행 취소", + "ui.sessionReviewV2.empty.noGit.action": "Git 저장소 생성", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Git 저장소 생성 중...", + "ui.sessionReviewV2.empty.changes.title": "아직 파일 변경 사항 없음", + "ui.sessionReviewV2.empty.changes.description": "프로젝트 변경 사항이 여기에 표시됩니다", + "ui.lineComment.cancel": "취소", + "ui.sessionTurn.diffs.changed.one": "변경된 파일: {{count}}개", + "ui.sessionTurn.diffs.changed.other": "변경된 파일: {{count}}개", + "ui.sessionTurn.diffs.showAll": "모두 표시", + "ui.sessionTurn.diffs.showLess": "간략히 표시", + "ui.sessionTurn.diffs.more": "+{{count}}개 더 보기", } diff --git a/packages/ui/src/i18n/no.ts b/packages/ui/src/i18n/no.ts index ecf67219d5..0ee729adcb 100644 --- a/packages/ui/src/i18n/no.ts +++ b/packages/ui/src/i18n/no.ts @@ -168,4 +168,29 @@ export const dict: Record = { "ui.toolErrorCard.copyError": "Kopier feil", "ui.message.duration.seconds": "{{count}}s", "ui.message.duration.minutesSeconds": "{{minutes}}m {{seconds}}s", + + "ui.sessionReview.title.git": "Git-endringer", + "ui.sessionReview.title.branch": "Grenendringer", + "ui.sessionReviewV2.expandMode": "Utvid eller fold sammen diff", + "ui.sessionReviewV2.filterFiles": "Filtrer filer", + "ui.sessionReviewV2.toggleSidebar": "Vis eller skjul filtreet", + "ui.sessionReviewV2.showAllLines": "Vis alle linjer", + "ui.sessionReviewV2.hideNonDiffLines": "Skjul uendrede linjer", + "ui.sessionReviewV2.unifiedDiff": "Samlet diff", + "ui.sessionReviewV2.splitDiff": "Delt diff", + "ui.sessionReviewV2.previousFile": "Forrige fil", + "ui.sessionReviewV2.nextFile": "Neste fil", + "ui.sessionReviewV2.diffView": "Diffvisning", + "ui.sessionReviewV2.empty.noGit.title": "Ingen sporede endringer", + "ui.sessionReviewV2.empty.noGit.description": "Spor, gjennomgå og angre endringer i dette prosjektet", + "ui.sessionReviewV2.empty.noGit.action": "Opprett et Git-depot", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Oppretter Git-depot...", + "ui.sessionReviewV2.empty.changes.title": "Ingen filendringer ennå", + "ui.sessionReviewV2.empty.changes.description": "Prosjektendringer vises her", + "ui.lineComment.cancel": "Avbryt", + "ui.sessionTurn.diffs.changed.one": "Endret fil: {{count}}", + "ui.sessionTurn.diffs.changed.other": "Endrede filer: {{count}}", + "ui.sessionTurn.diffs.showAll": "Vis alle", + "ui.sessionTurn.diffs.showLess": "Vis færre", + "ui.sessionTurn.diffs.more": "+{{count}} til", } diff --git a/packages/ui/src/i18n/pl.ts b/packages/ui/src/i18n/pl.ts index 6ef40d2daf..4dbbe03add 100644 --- a/packages/ui/src/i18n/pl.ts +++ b/packages/ui/src/i18n/pl.ts @@ -1,5 +1,7 @@ export const dict = { "ui.sessionReview.title": "Zmiany w sesji", + "ui.sessionReview.title.git": "Zmiany Git", + "ui.sessionReview.title.branch": "Zmiany w gałęzi", "ui.sessionReview.title.lastTurn": "Zmiany z ostatniej tury", "ui.sessionReview.diffStyle.unified": "Ujednolicony", "ui.sessionReview.diffStyle.split": "Podzielony", @@ -17,6 +19,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "Diff jest zbyt duży, aby go wyrenderować", "ui.sessionReview.largeDiff.meta": "Limit: {{limit}} zmienionych linii. Obecnie: {{current}} zmienionych linii.", "ui.sessionReview.largeDiff.renderAnyway": "Renderuj mimo to", + "ui.sessionReviewV2.expandMode": "Rozwiń lub zwiń diff", + "ui.sessionReviewV2.filterFiles": "Filtruj pliki", + "ui.sessionReviewV2.toggleSidebar": "Przełącz drzewo plików", + "ui.sessionReviewV2.showAllLines": "Pokaż wszystkie linie", + "ui.sessionReviewV2.hideNonDiffLines": "Ukryj linie spoza zmian", + "ui.sessionReviewV2.unifiedDiff": "Ujednolicony diff", + "ui.sessionReviewV2.splitDiff": "Podzielony diff", + "ui.sessionReviewV2.previousFile": "Poprzedni plik", + "ui.sessionReviewV2.nextFile": "Następny plik", + "ui.sessionReviewV2.diffView": "Widok zmian", + "ui.sessionReviewV2.empty.noGit.title": "Brak śledzonych zmian", + "ui.sessionReviewV2.empty.noGit.description": "Śledź, przeglądaj i cofaj zmiany w tym projekcie", + "ui.sessionReviewV2.empty.noGit.action": "Utwórz repozytorium Git", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Tworzenie repozytorium Git...", + "ui.sessionReviewV2.empty.changes.title": "Brak jeszcze zmian w plikach", + "ui.sessionReviewV2.empty.changes.description": "Zmiany w projekcie pojawią się tutaj", "ui.fileMedia.kind.image": "obraz", "ui.fileMedia.kind.audio": "dźwięk", "ui.fileMedia.state.removed": "{{kind}} usunięty", @@ -32,10 +50,16 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "Dodaj komentarz", "ui.lineComment.submit": "Skomentuj", + "ui.lineComment.cancel": "Anuluj", "ui.sessionTurn.steps.show": "Pokaż kroki", "ui.sessionTurn.steps.hide": "Ukryj kroki", "ui.sessionTurn.summary.response": "Odpowiedź", "ui.sessionTurn.diff.showMore": "Pokaż więcej zmian ({{count}})", + "ui.sessionTurn.diffs.changed.one": "Zmieniony plik: {{count}}", + "ui.sessionTurn.diffs.changed.other": "Zmienione pliki: {{count}}", + "ui.sessionTurn.diffs.showAll": "Pokaż wszystkie", + "ui.sessionTurn.diffs.showLess": "Pokaż mniej", + "ui.sessionTurn.diffs.more": "+{{count}} więcej", "ui.sessionTurn.retry.retrying": "ponawianie", "ui.sessionTurn.retry.inSeconds": "za {{seconds}}s", diff --git a/packages/ui/src/i18n/ru.ts b/packages/ui/src/i18n/ru.ts index ed5c4e8f4f..80694cdbe0 100644 --- a/packages/ui/src/i18n/ru.ts +++ b/packages/ui/src/i18n/ru.ts @@ -1,5 +1,7 @@ export const dict = { "ui.sessionReview.title": "Изменения сессии", + "ui.sessionReview.title.git": "Изменения Git", + "ui.sessionReview.title.branch": "Изменения ветки", "ui.sessionReview.title.lastTurn": "Изменения последнего хода", "ui.sessionReview.diffStyle.unified": "Объединённый", "ui.sessionReview.diffStyle.split": "Разделённый", @@ -17,6 +19,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "Diff слишком большой для отображения", "ui.sessionReview.largeDiff.meta": "Лимит: {{limit}} изменённых строк. Текущий: {{current}} изменённых строк.", "ui.sessionReview.largeDiff.renderAnyway": "Отобразить всё равно", + "ui.sessionReviewV2.expandMode": "Развернуть или свернуть diff", + "ui.sessionReviewV2.filterFiles": "Фильтровать файлы", + "ui.sessionReviewV2.toggleSidebar": "Переключить дерево файлов", + "ui.sessionReviewV2.showAllLines": "Показать все строки", + "ui.sessionReviewV2.hideNonDiffLines": "Скрыть строки без изменений", + "ui.sessionReviewV2.unifiedDiff": "Объединённый diff", + "ui.sessionReviewV2.splitDiff": "Разделённый diff", + "ui.sessionReviewV2.previousFile": "Предыдущий файл", + "ui.sessionReviewV2.nextFile": "Следующий файл", + "ui.sessionReviewV2.diffView": "Просмотр diff", + "ui.sessionReviewV2.empty.noGit.title": "Нет отслеживаемых изменений", + "ui.sessionReviewV2.empty.noGit.description": "Отслеживайте, просматривайте и отменяйте изменения в этом проекте", + "ui.sessionReviewV2.empty.noGit.action": "Создать репозиторий Git", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Создание репозитория Git...", + "ui.sessionReviewV2.empty.changes.title": "Изменений в файлах пока нет", + "ui.sessionReviewV2.empty.changes.description": "Изменения проекта появятся здесь", "ui.fileMedia.kind.image": "изображение", "ui.fileMedia.kind.audio": "аудио", "ui.fileMedia.state.removed": "{{kind}} удалено", @@ -32,10 +50,16 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "Добавить комментарий", "ui.lineComment.submit": "Комментировать", + "ui.lineComment.cancel": "Отмена", "ui.sessionTurn.steps.show": "Показать шаги", "ui.sessionTurn.steps.hide": "Скрыть шаги", "ui.sessionTurn.summary.response": "Ответ", "ui.sessionTurn.diff.showMore": "Показать ещё изменений ({{count}})", + "ui.sessionTurn.diffs.changed.one": "Изменённый файл: {{count}}", + "ui.sessionTurn.diffs.changed.other": "Изменённые файлы: {{count}}", + "ui.sessionTurn.diffs.showAll": "Показать все", + "ui.sessionTurn.diffs.showLess": "Показать меньше", + "ui.sessionTurn.diffs.more": "+ ещё {{count}}", "ui.sessionTurn.retry.retrying": "повтор", "ui.sessionTurn.retry.inSeconds": "через {{seconds}}с", diff --git a/packages/ui/src/i18n/th.ts b/packages/ui/src/i18n/th.ts index e2534041ab..10675a28d4 100644 --- a/packages/ui/src/i18n/th.ts +++ b/packages/ui/src/i18n/th.ts @@ -1,5 +1,7 @@ export const dict = { "ui.sessionReview.title": "การเปลี่ยนแปลงเซสชัน", + "ui.sessionReview.title.git": "การเปลี่ยนแปลงใน Git", + "ui.sessionReview.title.branch": "การเปลี่ยนแปลงในสาขา", "ui.sessionReview.title.lastTurn": "การเปลี่ยนแปลงของเทิร์นล่าสุด", "ui.sessionReview.diffStyle.unified": "แบบรวม", "ui.sessionReview.diffStyle.split": "แบบแยก", @@ -17,6 +19,22 @@ export const dict = { "ui.sessionReview.largeDiff.meta": "ขีดจำกัด: {{limit}} บรรทัดที่เปลี่ยนแปลง. ปัจจุบัน: {{current}} บรรทัดที่เปลี่ยนแปลง.", "ui.sessionReview.largeDiff.renderAnyway": "แสดงผลต่อไป", + "ui.sessionReviewV2.expandMode": "ขยายหรือย่อ diff", + "ui.sessionReviewV2.filterFiles": "กรองไฟล์", + "ui.sessionReviewV2.toggleSidebar": "สลับต้นไม้ไฟล์", + "ui.sessionReviewV2.showAllLines": "แสดงทุกบรรทัด", + "ui.sessionReviewV2.hideNonDiffLines": "ซ่อนบรรทัดที่ไม่มี diff", + "ui.sessionReviewV2.unifiedDiff": "diff แบบรวม", + "ui.sessionReviewV2.splitDiff": "diff แบบแยก", + "ui.sessionReviewV2.previousFile": "ไฟล์ก่อนหน้า", + "ui.sessionReviewV2.nextFile": "ไฟล์ถัดไป", + "ui.sessionReviewV2.diffView": "มุมมอง diff", + "ui.sessionReviewV2.empty.noGit.title": "ไม่มีการเปลี่ยนแปลงที่ติดตามอยู่", + "ui.sessionReviewV2.empty.noGit.description": "ติดตาม ตรวจสอบ และเลิกทำการเปลี่ยนแปลงในโปรเจกต์นี้", + "ui.sessionReviewV2.empty.noGit.action": "สร้าง Git รีโพซิทอรี", + "ui.sessionReviewV2.empty.noGit.actionLoading": "กำลังสร้าง Git รีโพซิทอรี...", + "ui.sessionReviewV2.empty.changes.title": "ยังไม่มีการเปลี่ยนแปลงไฟล์", + "ui.sessionReviewV2.empty.changes.description": "การเปลี่ยนแปลงในโปรเจกต์จะแสดงที่นี่", "ui.fileMedia.kind.image": "รูปภาพ", "ui.fileMedia.kind.audio": "เสียง", "ui.fileMedia.state.removed": "ลบ{{kind}}แล้ว", @@ -33,11 +51,17 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "เพิ่มความคิดเห็น", "ui.lineComment.submit": "แสดงความคิดเห็น", + "ui.lineComment.cancel": "ยกเลิก", "ui.sessionTurn.steps.show": "แสดงขั้นตอน", "ui.sessionTurn.steps.hide": "ซ่อนขั้นตอน", "ui.sessionTurn.summary.response": "การตอบสนอง", "ui.sessionTurn.diff.showMore": "แสดงการเปลี่ยนแปลงเพิ่มเติม ({{count}})", + "ui.sessionTurn.diffs.changed.one": "จำนวนไฟล์ที่เปลี่ยนแปลง: {{count}}", + "ui.sessionTurn.diffs.changed.other": "จำนวนไฟล์ที่เปลี่ยนแปลง: {{count}}", + "ui.sessionTurn.diffs.showAll": "แสดงทั้งหมด", + "ui.sessionTurn.diffs.showLess": "แสดงน้อยลง", + "ui.sessionTurn.diffs.more": "+{{count}} ไฟล์เพิ่มเติม", "ui.sessionTurn.retry.retrying": "กำลังลองใหม่", "ui.sessionTurn.retry.inSeconds": "ใน {{seconds}}วิ", diff --git a/packages/ui/src/i18n/tr.ts b/packages/ui/src/i18n/tr.ts index 0ce4a73b6f..5cdebfd6f4 100644 --- a/packages/ui/src/i18n/tr.ts +++ b/packages/ui/src/i18n/tr.ts @@ -4,6 +4,8 @@ type Keys = keyof typeof en export const dict = { "ui.sessionReview.title": "Oturum değişiklikleri", + "ui.sessionReview.title.git": "Git değişiklikleri", + "ui.sessionReview.title.branch": "Dal değişiklikleri", "ui.sessionReview.title.lastTurn": "Son tur değişiklikleri", "ui.sessionReview.diffStyle.unified": "Birleşik", "ui.sessionReview.diffStyle.split": "Bölünmüş", @@ -21,6 +23,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "Fark gösterimi için çok büyük", "ui.sessionReview.largeDiff.meta": "Limit: {{limit}} değişen satır. Mevcut: {{current}} değişen satır.", "ui.sessionReview.largeDiff.renderAnyway": "Yine de göster", + "ui.sessionReviewV2.expandMode": "Farkı genişlet veya daralt", + "ui.sessionReviewV2.filterFiles": "Dosyaları filtrele", + "ui.sessionReviewV2.toggleSidebar": "Dosya ağacını aç/kapat", + "ui.sessionReviewV2.showAllLines": "Tüm satırları göster", + "ui.sessionReviewV2.hideNonDiffLines": "Fark içermeyen satırları gizle", + "ui.sessionReviewV2.unifiedDiff": "Birleşik fark", + "ui.sessionReviewV2.splitDiff": "Bölünmüş fark", + "ui.sessionReviewV2.previousFile": "Önceki dosya", + "ui.sessionReviewV2.nextFile": "Sonraki dosya", + "ui.sessionReviewV2.diffView": "Fark görünümü", + "ui.sessionReviewV2.empty.noGit.title": "İzlenen değişiklik yok", + "ui.sessionReviewV2.empty.noGit.description": "Bu projedeki değişiklikleri takip et, incele ve geri al", + "ui.sessionReviewV2.empty.noGit.action": "Git deposu oluştur", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Git deposu oluşturuluyor...", + "ui.sessionReviewV2.empty.changes.title": "Henüz dosya değişikliği yok", + "ui.sessionReviewV2.empty.changes.description": "Proje değişiklikleri burada görünecek", "ui.fileMedia.kind.image": "görsel", "ui.fileMedia.kind.audio": "ses", @@ -38,11 +56,17 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "Yorum ekle", "ui.lineComment.submit": "Yorum yap", + "ui.lineComment.cancel": "İptal", "ui.sessionTurn.steps.show": "Adımları göster", "ui.sessionTurn.steps.hide": "Adımları gizle", "ui.sessionTurn.summary.response": "Yanıt", "ui.sessionTurn.diff.showMore": "Daha fazla değişiklik göster ({{count}})", + "ui.sessionTurn.diffs.changed.one": "Değiştirilen dosya: {{count}}", + "ui.sessionTurn.diffs.changed.other": "Değiştirilen dosyalar: {{count}}", + "ui.sessionTurn.diffs.showAll": "Tümünü göster", + "ui.sessionTurn.diffs.showLess": "Daha az göster", + "ui.sessionTurn.diffs.more": "+{{count}} dosya daha", "ui.sessionTurn.retry.retrying": "yeniden deneniyor", "ui.sessionTurn.retry.inSeconds": "{{seconds}}sn içinde", diff --git a/packages/ui/src/i18n/uk.ts b/packages/ui/src/i18n/uk.ts index 8bfb3e4404..abb35c79f5 100644 --- a/packages/ui/src/i18n/uk.ts +++ b/packages/ui/src/i18n/uk.ts @@ -15,6 +15,23 @@ export const dict: Record = { "ui.sessionReview.largeDiff.title": "Завеликий diff для відображення", "ui.sessionReview.largeDiff.meta": "Ліміт: {{limit}} змінених рядків. Поточно: {{current}} змінених рядків.", "ui.sessionReview.largeDiff.renderAnyway": "Все одно відобразити", + "ui.sessionReviewV2.expandMode": "Розгорнути або згорнути diff", + "ui.sessionReviewV2.filterFiles": "Фільтрувати файли", + "ui.sessionReviewV2.toggleSidebar": "Перемкнути дерево файлів", + "ui.sessionReviewV2.showAllLines": "Показати всі рядки", + "ui.sessionReviewV2.hideNonDiffLines": "Приховати рядки поза diff", + "ui.sessionReviewV2.unifiedDiff": "Об'єднаний diff", + "ui.sessionReviewV2.splitDiff": "Розділений diff", + "ui.sessionReviewV2.previousFile": "Попередній файл", + "ui.sessionReviewV2.nextFile": "Наступний файл", + "ui.sessionReviewV2.diffView": "Перегляд diff", + "ui.sessionReviewV2.empty.noGit.title": "Немає відстежуваних змін", + "ui.sessionReviewV2.empty.noGit.description": "Відстежуйте, переглядайте та скасовуйте зміни в цьому проєкті", + "ui.sessionReviewV2.empty.noGit.action": "Створити Git-репозиторій", + "ui.sessionReviewV2.empty.noGit.actionLoading": "Створення Git-репозиторію...", + "ui.sessionReviewV2.empty.changes.title": "Змін у файлах ще немає", + "ui.sessionReviewV2.empty.changes.description": "Зміни проєкту з'являться тут", + "ui.sessionReview.openFile": "Відкрити файл", "ui.sessionReview.selection.line": "рядок {{line}}", "ui.sessionReview.selection.lines": "рядки {{start}}-{{end}}", @@ -35,15 +52,17 @@ export const dict: Record = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "Додати коментар", "ui.lineComment.submit": "Коментувати", + "ui.lineComment.cancel": "Скасувати", "ui.sessionTurn.steps.show": "Показати кроки", "ui.sessionTurn.steps.hide": "Приховати кроки", "ui.sessionTurn.summary.response": "Відповідь", "ui.sessionTurn.diff.showMore": "Показати більше змін ({{count}})", - "ui.sessionTurn.diffs.changed": "Змінено", + "ui.sessionTurn.diffs.changed.one": "Змінений файл: {{count}}", + "ui.sessionTurn.diffs.changed.other": "Змінені файли: {{count}}", "ui.sessionTurn.diffs.showAll": "Показати всі", "ui.sessionTurn.diffs.showLess": "Показати менше", - "ui.sessionTurn.diffs.more": "+{{count}} інших файлів", + "ui.sessionTurn.diffs.more": "+ ще {{count}}", "ui.sessionTurn.retry.retrying": "повтор", "ui.sessionTurn.retry.inSeconds": "за {{seconds}}с", @@ -53,6 +72,15 @@ export const dict: Record = { "ui.sessionTurn.error.freeUsageExceeded": "Перевищено ліміт безкоштовного використання", "ui.sessionTurn.error.addCredits": "Додати кредити", + "dialog.usageExceeded.freeTier.title": "Безкоштовний ліміт вичерпано", + "dialog.usageExceeded.freeTier.description": + "Підпишіться на OpenCode Go для надійного доступу до найкращих моделей із відкритим кодом від $5 на місяць.", + "dialog.usageExceeded.freeTier.actionLabel": "Підписатися", + "dialog.usageExceeded.accountRateLimit.title": "Ліміт Go вичерпано", + "dialog.usageExceeded.accountRateLimit.description": + "Ліміт використання вичерпано. Щоб і надалі користуватися цією моделлю, увімкніть оплату з доступного балансу", + "dialog.usageExceeded.accountRateLimit.actionLabel": "Відкрити налаштування", + "ui.sessionTurn.status.delegating": "Делегування роботи", "ui.sessionTurn.status.planning": "Планування наступних кроків", "ui.sessionTurn.status.gatheringContext": "Дослідження", diff --git a/packages/ui/src/i18n/zh.ts b/packages/ui/src/i18n/zh.ts index 1a385620f1..8a9e18aeea 100644 --- a/packages/ui/src/i18n/zh.ts +++ b/packages/ui/src/i18n/zh.ts @@ -4,6 +4,8 @@ type Keys = keyof typeof en export const dict = { "ui.sessionReview.title": "会话变更", + "ui.sessionReview.title.git": "Git 变更", + "ui.sessionReview.title.branch": "分支变更", "ui.sessionReview.title.lastTurn": "上一轮变更", "ui.sessionReview.diffStyle.unified": "统一", "ui.sessionReview.diffStyle.split": "拆分", @@ -20,6 +22,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "差异过大,无法渲染", "ui.sessionReview.largeDiff.meta": "限制:{{limit}} 行变更。当前:{{current}} 行变更。", "ui.sessionReview.largeDiff.renderAnyway": "仍然渲染", + "ui.sessionReviewV2.expandMode": "展开或折叠差异", + "ui.sessionReviewV2.filterFiles": "筛选文件", + "ui.sessionReviewV2.toggleSidebar": "切换文件树", + "ui.sessionReviewV2.showAllLines": "显示所有行", + "ui.sessionReviewV2.hideNonDiffLines": "隐藏非差异行", + "ui.sessionReviewV2.unifiedDiff": "统一差异", + "ui.sessionReviewV2.splitDiff": "拆分差异", + "ui.sessionReviewV2.previousFile": "上一个文件", + "ui.sessionReviewV2.nextFile": "下一个文件", + "ui.sessionReviewV2.diffView": "差异视图", + "ui.sessionReviewV2.empty.noGit.title": "无已跟踪的变更", + "ui.sessionReviewV2.empty.noGit.description": "在此项目中跟踪、审查和撤销更改", + "ui.sessionReviewV2.empty.noGit.action": "创建 Git 仓库", + "ui.sessionReviewV2.empty.noGit.actionLoading": "正在创建 Git 仓库...", + "ui.sessionReviewV2.empty.changes.title": "尚无文件变更", + "ui.sessionReviewV2.empty.changes.description": "项目变更将显示在此处", "ui.fileMedia.kind.image": "图片", "ui.fileMedia.kind.audio": "音频", "ui.fileMedia.state.removed": "{{kind}}已移除", @@ -36,11 +54,17 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "添加评论", "ui.lineComment.submit": "评论", + "ui.lineComment.cancel": "取消", "ui.sessionTurn.steps.show": "显示步骤", "ui.sessionTurn.steps.hide": "隐藏步骤", "ui.sessionTurn.summary.response": "回复", "ui.sessionTurn.diff.showMore": "显示更多更改({{count}})", + "ui.sessionTurn.diffs.changed.one": "已更改文件:{{count}} 个", + "ui.sessionTurn.diffs.changed.other": "已更改文件:{{count}} 个", + "ui.sessionTurn.diffs.showAll": "全部显示", + "ui.sessionTurn.diffs.showLess": "收起", + "ui.sessionTurn.diffs.more": "+{{count}} 个文件", "ui.sessionTurn.retry.retrying": "重试中", "ui.sessionTurn.retry.inSeconds": "{{seconds}} 秒后", diff --git a/packages/ui/src/i18n/zht.ts b/packages/ui/src/i18n/zht.ts index 941e1df636..19ba8e4106 100644 --- a/packages/ui/src/i18n/zht.ts +++ b/packages/ui/src/i18n/zht.ts @@ -4,6 +4,8 @@ type Keys = keyof typeof en export const dict = { "ui.sessionReview.title": "工作階段變更", + "ui.sessionReview.title.git": "Git 變更", + "ui.sessionReview.title.branch": "分支變更", "ui.sessionReview.title.lastTurn": "上一輪變更", "ui.sessionReview.diffStyle.unified": "整合", "ui.sessionReview.diffStyle.split": "拆分", @@ -20,6 +22,22 @@ export const dict = { "ui.sessionReview.largeDiff.title": "差異過大,無法渲染", "ui.sessionReview.largeDiff.meta": "限制:{{limit}} 行變更。目前:{{current}} 行變更。", "ui.sessionReview.largeDiff.renderAnyway": "仍然渲染", + "ui.sessionReviewV2.expandMode": "展開或收合差異", + "ui.sessionReviewV2.filterFiles": "篩選檔案", + "ui.sessionReviewV2.toggleSidebar": "切換檔案樹", + "ui.sessionReviewV2.showAllLines": "顯示所有行", + "ui.sessionReviewV2.hideNonDiffLines": "隱藏無差異的行", + "ui.sessionReviewV2.unifiedDiff": "整合差異", + "ui.sessionReviewV2.splitDiff": "拆分差異", + "ui.sessionReviewV2.previousFile": "上一個檔案", + "ui.sessionReviewV2.nextFile": "下一個檔案", + "ui.sessionReviewV2.diffView": "差異檢視", + "ui.sessionReviewV2.empty.noGit.title": "沒有追蹤的變更", + "ui.sessionReviewV2.empty.noGit.description": "追蹤、檢閱及復原此專案中的變更", + "ui.sessionReviewV2.empty.noGit.action": "建立 Git 儲存庫", + "ui.sessionReviewV2.empty.noGit.actionLoading": "正在建立 Git 儲存庫...", + "ui.sessionReviewV2.empty.changes.title": "尚無檔案變更", + "ui.sessionReviewV2.empty.changes.description": "專案變更會顯示在這裡", "ui.fileMedia.kind.image": "圖片", "ui.fileMedia.kind.audio": "音訊", "ui.fileMedia.state.removed": "{{kind}}已移除", @@ -36,11 +54,17 @@ export const dict = { "ui.lineComment.editorLabel.suffix": "", "ui.lineComment.placeholder": "新增評論", "ui.lineComment.submit": "評論", + "ui.lineComment.cancel": "取消", "ui.sessionTurn.steps.show": "顯示步驟", "ui.sessionTurn.steps.hide": "隱藏步驟", "ui.sessionTurn.summary.response": "回覆", "ui.sessionTurn.diff.showMore": "顯示更多變更 ({{count}})", + "ui.sessionTurn.diffs.changed.one": "已變更檔案:{{count}} 個", + "ui.sessionTurn.diffs.changed.other": "已變更檔案:{{count}} 個", + "ui.sessionTurn.diffs.showAll": "全部顯示", + "ui.sessionTurn.diffs.showLess": "顯示較少", + "ui.sessionTurn.diffs.more": "+{{count}} 個檔案", "ui.sessionTurn.retry.retrying": "重試中", "ui.sessionTurn.retry.inSeconds": "{{seconds}} 秒後", diff --git a/script/translate-app.md b/script/translate-app.md new file mode 100644 index 0000000000..96615f132b --- /dev/null +++ b/script/translate-app.md @@ -0,0 +1,21 @@ +Translate the product app locale `$1` from the English source dictionaries. English is the read-only source of truth. Its copy is intentional and must never be modified, rewritten, or "improved." + +The translation request below contains the locale glossary, exact source and target files, plus missing, extra, and placeholder-mismatched keys. + +```json +$ARGUMENTS +``` + +Requirements: + +- Edit only the target files listed in the request. Never edit English, another locale, tests, registries, docs, or other packages. +- Treat every English key and value as intentional. Translate from it without changing the English source files in any way. +- Add every missing key with a natural, concise translation suitable for application UI. +- Remove keys listed as extra and repair values listed under `placeholders` so their `{{tokens}}` exactly match English. +- Preserve existing translations unless they have a listed placeholder mismatch. +- Preserve meaning, intent, tone, capitalization, punctuation, whitespace, and formatting. +- Preserve technical terms and artifacts exactly: OpenCode, API names, identifiers, code, commands, flags, paths, URLs, versions, error messages, config keys, and placeholder tokens. +- Apply the locale glossary included in the request. +- `ui.sessionTurn.diffs.changed.one` and `ui.sessionTurn.diffs.changed.other` are complete count phrases. Preserve `{{count}}` and translate the whole phrase naturally rather than composing translated fragments. +- Use only read, glob, grep, and edit tools. Do not run commands or delegate work. +- Finish only when every requested key is synchronized and no other file has changed. diff --git a/script/translate-app.test.ts b/script/translate-app.test.ts new file mode 100644 index 0000000000..4eafbc580a --- /dev/null +++ b/script/translate-app.test.ts @@ -0,0 +1,168 @@ +import { describe, expect, test } from "bun:test" +import { + findDrift, + glossaryFile, + modelVariants, + parseTranslationArgs, + runPool, + sessionIDFromEvents, + sessionModels, + targetFiles, + textFromEvents, + translationConfig, + unexpectedChanges, +} from "./translate-app" + +describe("translate app", () => { + test("parses one locale with the public model defaults", () => { + expect(parseTranslationArgs(["fr"])).toEqual({ + target: "fr", + concurrency: 1, + model: "opencode/gpt-5.5", + variant: "xhigh", + dryRun: false, + check: false, + help: false, + }) + }) + + test("parses all locales with bounded concurrency overrides", () => { + expect( + parseTranslationArgs([ + "all", + "--concurrency", + "7", + "--model", + "opencode/gpt-5.4", + "--variant", + "high", + "--dry-run", + ]), + ).toEqual({ + target: "all", + concurrency: 7, + model: "opencode/gpt-5.4", + variant: "high", + dryRun: true, + check: false, + help: false, + }) + }) + + test("rejects unsupported targets and invalid concurrency", () => { + expect(() => parseTranslationArgs(["en"])).toThrow("Unknown locale") + expect(() => parseTranslationArgs(["fr", "de"])).toThrow("one locale") + expect(() => parseTranslationArgs(["all", "--concurrency", "0"])).toThrow("positive integer") + }) + + test("parses fresh-process parity checks without requesting translation", () => { + expect(parseTranslationArgs(["fr", "--check"]).check).toBe(true) + }) + + test("limits each locale to its app surfaces", () => { + expect(targetFiles("fr")).toEqual([ + "packages/app/src/i18n/fr.ts", + "packages/ui/src/i18n/fr.ts", + "packages/desktop/src/renderer/i18n/fr.ts", + ]) + expect(targetFiles("tr")).toEqual(["packages/app/src/i18n/tr.ts", "packages/ui/src/i18n/tr.ts"]) + }) + + test("maps product locale codes to their glossaries", () => { + expect(glossaryFile("fr")).toBe(".opencode/glossary/fr.md") + expect(glossaryFile("zh")).toBe(".opencode/glossary/zh-cn.md") + expect(glossaryFile("zht")).toBe(".opencode/glossary/zh-tw.md") + }) + + test("finds key and placeholder drift", () => { + expect( + findDrift( + { keep: "Hello {{name}}", missing: "Missing", changed: "{{one}} {{two}}" }, + { keep: "Bonjour {{name}}", extra: "Extra", changed: "{{one}}" }, + ), + ).toEqual({ missing: ["missing"], extra: ["extra"], placeholders: ["changed"] }) + }) + + test("runs work with the requested maximum concurrency", async () => { + const active = new Set() + const peaks: number[] = [] + const result = await runPool([1, 2, 3, 4, 5], 2, async (item) => { + active.add(item) + peaks.push(active.size) + await Bun.sleep(5) + active.delete(item) + return item * 2 + }) + + expect(result).toEqual([2, 4, 6, 8, 10]) + expect(Math.max(...peaks)).toBe(2) + }) + + test("reads the actual model and variant from the completed session", () => { + expect(sessionIDFromEvents('shared: https://example.test\n{"type":"step_start","sessionID":"ses_test"}\n')).toBe( + "ses_test", + ) + expect( + sessionModels({ + messages: [ + { info: { role: "user" } }, + { + info: { + role: "assistant", + providerID: "opencode", + modelID: "gpt-5.5", + variant: "xhigh", + }, + }, + ], + }), + ).toEqual([{ model: "opencode/gpt-5.5", variant: "xhigh" }]) + expect( + textFromEvents( + 'shared: https://example.test\n{"type":"text","sessionID":"ses_test","part":{"text":"finished"}}\n', + ), + ).toBe("finished") + }) + + test("resolves variants from verbose model output", () => { + const output = `opencode/other +{"variants":{}} +opencode/gpt-5.5 +{"variants":{"high":{"reasoningEffort":"high"},"xhigh":{"reasoningEffort":"xhigh"}}} +opencode/next +{"variants":{}} +` + expect(modelVariants(output, "opencode/gpt-5.5")).toEqual({ + high: { reasoningEffort: "high" }, + xhigh: { reasoningEffort: "xhigh" }, + }) + }) + + test("disables side effects and scopes edits for the translation agent", () => { + const config = translationConfig("translate-app-fr", "opencode/gpt-5.5", ["packages/app/src/i18n/fr.ts"]) + expect(config.share).toBe("disabled") + expect(config.formatter).toBe(false) + expect(config.lsp).toBe(false) + expect(config.agent["translate-app-fr"].permission.edit).toEqual({ + "*": "deny", + "packages/app/src/i18n/fr.ts": "allow", + }) + }) + + test("detects edits outside the locale targets", () => { + expect( + unexpectedChanges( + { "script/translate-app.ts": "before" }, + { + "script/translate-app.ts": "before", + "packages/app/src/i18n/fr.ts": "translated", + "packages/app/src/app.tsx": "unexpected", + }, + ["packages/app/src/i18n/fr.ts"], + ), + ).toEqual(["packages/app/src/app.tsx"]) + expect(unexpectedChanges({ "already-dirty.ts": "before" }, { "already-dirty.ts": "after" }, [])).toEqual([ + "already-dirty.ts", + ]) + }) +}) diff --git a/script/translate-app.ts b/script/translate-app.ts new file mode 100644 index 0000000000..e7e669dced --- /dev/null +++ b/script/translate-app.ts @@ -0,0 +1,523 @@ +#!/usr/bin/env bun + +import path from "path" +import { parseArgs } from "util" +import { pathToFileURL } from "url" + +const locales = [ + "ar", + "br", + "bs", + "da", + "de", + "es", + "fr", + "ja", + "ko", + "no", + "pl", + "ru", + "uk", + "th", + "tr", + "zh", + "zht", +] as const +type Locale = (typeof locales)[number] + +const languages = { + ar: "Arabic", + br: "Brazilian Portuguese", + bs: "Bosnian", + da: "Danish", + de: "German", + es: "Spanish", + fr: "French", + ja: "Japanese", + ko: "Korean", + no: "Norwegian Bokmal", + pl: "Polish", + ru: "Russian", + uk: "Ukrainian", + th: "Thai", + tr: "Turkish", + zh: "Simplified Chinese", + zht: "Traditional Chinese", +} as const satisfies Record + +type Dictionary = Record +type Drift = ReturnType +type Domain = { name: string; source: string; target: string; drift: Drift } + +const desktopLocales = new Set(locales.filter((locale) => locale !== "th" && locale !== "tr")) +const root = path.resolve(import.meta.dir, "..") + +export function parseTranslationArgs(args: string[]) { + const parsed = parseArgs({ + args, + options: { + concurrency: { type: "string", short: "c", default: "4" }, + model: { type: "string", default: "opencode/gpt-5.5" }, + variant: { type: "string", default: "xhigh" }, + "dry-run": { type: "boolean", default: false }, + check: { type: "boolean", default: false }, + help: { type: "boolean", short: "h", default: false }, + }, + allowPositionals: true, + }) + const target = parsed.positionals[0] ?? "all" + const concurrency = Number(parsed.values.concurrency) + + if (!parsed.values.help && parsed.positionals.length !== 1) throw new Error("Pass one locale or 'all'.") + if (target !== "all" && !isLocale(target)) throw new Error(`Unknown locale '${target}'.`) + if (!Number.isInteger(concurrency) || concurrency < 1) throw new Error("Concurrency must be a positive integer.") + + return { + target, + concurrency: target === "all" ? concurrency : 1, + model: parsed.values.model, + variant: parsed.values.variant, + dryRun: parsed.values["dry-run"], + check: parsed.values.check, + help: parsed.values.help, + } +} + +export function targetFiles(locale: Locale) { + return [ + `packages/app/src/i18n/${locale}.ts`, + `packages/ui/src/i18n/${locale}.ts`, + ...(desktopLocales.has(locale) ? [`packages/desktop/src/renderer/i18n/${locale}.ts`] : []), + ] +} + +export function glossaryFile(locale: Locale) { + if (locale === "zh") return ".opencode/glossary/zh-cn.md" + if (locale === "zht") return ".opencode/glossary/zh-tw.md" + return `.opencode/glossary/${locale}.md` +} + +export function findDrift(source: Dictionary, target: Dictionary) { + return { + missing: Object.keys(source).filter((key) => !Object.hasOwn(target, key)), + extra: Object.keys(target).filter((key) => !Object.hasOwn(source, key)), + placeholders: Object.keys(source).filter( + (key) => Object.hasOwn(target, key) && tokens(source[key]).join() !== tokens(target[key]).join(), + ), + } +} + +export function sessionIDFromEvents(output: string) { + const match = output.match(/"sessionID"\s*:\s*"([^"]+)"/) + if (!match?.[1]) throw new Error("OpenCode did not report a session ID.") + return match[1] +} + +export function sessionModels(value: unknown) { + if (!isRecord(value) || !Array.isArray(value.messages)) + throw new Error("OpenCode returned an invalid session export.") + return value.messages.flatMap((message) => { + if (!isRecord(message) || !isRecord(message.info) || message.info.role !== "assistant") return [] + if (typeof message.info.providerID !== "string" || typeof message.info.modelID !== "string") { + throw new Error("OpenCode session export omitted the assistant model.") + } + return [ + { + model: `${message.info.providerID}/${message.info.modelID}`, + variant: typeof message.info.variant === "string" ? message.info.variant : undefined, + }, + ] + }) +} + +export function modelVariants(output: string, model: string) { + const normalized = output.replaceAll("\r\n", "\n") + const marker = `${model}\n` + const start = normalized.indexOf(marker) + if (start < 0) throw new Error(`Model not found: ${model}`) + const provider = model.split("/")[0] + const rest = normalized.slice(start + marker.length) + const next = rest.search(new RegExp(`^${escapeRegExp(provider)}/`, "m")) + const metadata: unknown = JSON.parse((next < 0 ? rest : rest.slice(0, next)).trim()) + if (!isRecord(metadata) || !isRecord(metadata.variants)) throw new Error(`Model variants not found: ${model}`) + return metadata.variants +} + +export function translationConfig(agent: string, model: string, targets: string[]) { + return { + $schema: "https://opencode.ai/config.json", + model, + default_agent: agent, + share: "disabled" as const, + formatter: false, + lsp: false, + snapshot: false, + agent: { + [agent]: { + mode: "primary" as const, + model, + permission: { + "*": "deny" as const, + read: "allow" as const, + glob: "allow" as const, + grep: "allow" as const, + edit: Object.fromEntries([["*", "deny"], ...targets.map((target) => [target, "allow"])]), + }, + }, + }, + } +} + +export function unexpectedChanges(before: Record, after: Record, allowed: string[]) { + const targets = new Set(allowed) + return [...new Set([...Object.keys(before), ...Object.keys(after)])] + .filter((file) => !targets.has(file) && before[file] !== after[file]) + .sort() +} + +export async function runPool(items: readonly T[], concurrency: number, task: (item: T) => Promise) { + const results = new Map() + const entries = items.entries() + const worker = async (): Promise => { + const next = entries.next() + if (next.done) return + results.set(next.value[0], await task(next.value[1])) + await worker() + } + + await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, worker)) + return Array.from(results.entries()) + .sort((a, b) => a[0] - b[0]) + .map((entry) => entry[1]) +} + +async function main() { + const options = parseTranslationArgs(Bun.argv.slice(2)) + if (options.help) { + console.log(` +Usage: bun run translate:app -- [options] + +Synchronizes product app translations with the English app, UI, and desktop dictionaries. + +Options: + -c, --concurrency Maximum parallel OpenCode runs for 'all' (default: 4) + --model OpenCode model (default: opencode/gpt-5.5) + --variant Model variant (default: xhigh) + --dry-run Report drift without running OpenCode + --check Exit nonzero when translation drift exists + -h, --help Show this help message + +Examples: + bun run translate:app -- fr + bun run translate:app -- all --concurrency 4 +`) + return + } + + const selected = options.target === "all" ? locales : [options.target] + const plans = await Promise.all(selected.map((locale) => inspect(locale))) + plans.forEach(report) + const pending = plans.filter((plan) => plan.domains.some((domain) => changed(domain.drift))) + if (options.check) { + if (pending.length) process.exitCode = 1 + return + } + if (options.dryRun || pending.length === 0) return + + const targets = pending.flatMap((plan) => plan.domains.map((domain) => domain.target)) + const baseline = await worktreeSnapshot() + const variant = await resolveModelVariant(options.model, options.variant) + console.log(`Resolved ${options.model} (${options.variant}): ${JSON.stringify(variant)}`) + const template = await commandTemplate() + const results = await runPool(pending, options.concurrency, (plan) => + translate(plan, template, options.model, options.variant).catch((error) => ({ + locale: plan.locale, + code: 1, + stdout: "", + stderr: error instanceof Error ? error.message : String(error), + })), + ) + + results.forEach((result) => { + if (result.stdout) process.stdout.write(`\n[${result.locale}]\n${result.stdout}`) + if (result.stderr) process.stderr.write(`\n[${result.locale}]\n${result.stderr}`) + }) + + const failed = results.filter((result) => result.code !== 0) + const checks = await runPool(pending, options.concurrency, (plan) => check(plan.locale)) + const incomplete = checks.filter((result) => result.code !== 0) + const escaped = unexpectedChanges(baseline, await worktreeSnapshot(), targets) + incomplete.forEach((result) => { + if (result.stdout) process.stderr.write(`\n[${result.locale} verification]\n${result.stdout}`) + if (result.stderr) process.stderr.write(`\n[${result.locale} verification]\n${result.stderr}`) + }) + + if (failed.length === 0 && incomplete.length === 0 && escaped.length === 0) { + console.log(`\nTranslated ${pending.map((plan) => plan.locale).join(", ")}.`) + return + } + + if (failed.length) console.error(`\nOpenCode failed for: ${failed.map((result) => result.locale).join(", ")}`) + if (incomplete.length) + console.error(`Translation remains incomplete for: ${incomplete.map((plan) => plan.locale).join(", ")}`) + if (escaped.length) console.error(`Translation changed files outside its locale targets: ${escaped.join(", ")}`) + process.exitCode = 1 +} + +async function worktreeSnapshot() { + const groups = await Promise.all([ + gitPaths(["diff", "--name-only", "-z", "HEAD"]), + gitPaths(["ls-files", "--others", "--exclude-standard", "-z"]), + ]) + const files = [...new Set(groups.flat())] + return Object.fromEntries( + await Promise.all( + files.map(async (file) => { + const target = Bun.file(path.join(root, file)) + if (!(await target.exists())) return [file, ""] as const + const hash = new Bun.CryptoHasher("sha256") + hash.update(await target.arrayBuffer()) + return [file, hash.digest("hex")] as const + }), + ), + ) +} + +async function gitPaths(args: string[]) { + const proc = Bun.spawn(["git", ...args], { + cwd: root, + stdin: "ignore", + stdout: "pipe", + stderr: "pipe", + }) + const result = await Promise.all([new Response(proc.stdout).text(), new Response(proc.stderr).text(), proc.exited]) + if (result[2] !== 0) throw new Error(result[1] || `git ${args.join(" ")} failed`) + return result[0].split("\0").filter(Boolean) +} + +async function check(locale: Locale) { + const proc = Bun.spawn([process.execPath, import.meta.path, locale, "--check"], { + cwd: root, + stdin: "ignore", + stdout: "pipe", + stderr: "pipe", + }) + const result = await Promise.all([new Response(proc.stdout).text(), new Response(proc.stderr).text(), proc.exited]) + return { locale, stdout: result[0], stderr: result[1], code: result[2] } +} + +async function inspect(locale: Locale) { + const domains = await Promise.all( + targetFiles(locale).map(async (target) => { + const source = target.replace(`/${locale}.ts`, "/en.ts") + const dictionaries = await Promise.all([dictionary(source), dictionary(target)]) + return { + name: target.includes("packages/app/") ? "app" : target.includes("packages/ui/") ? "ui" : "desktop", + source, + target, + drift: findDrift(dictionaries[0], dictionaries[1]), + } + }), + ) + return { locale, language: languages[locale], domains } +} + +async function dictionary(file: string) { + const module: unknown = await import(pathToFileURL(path.join(root, file)).href) + if (typeof module !== "object" || module === null || !("dict" in module) || !isDictionary(module.dict)) { + throw new Error(`Invalid translation dictionary: ${file}`) + } + return module.dict +} + +async function commandTemplate() { + return (await Bun.file(path.join(root, "script/translate-app.md")).text()).trim() +} + +async function translate( + plan: { locale: Locale; language: string; domains: Domain[] }, + template: string, + model: string, + variant: string, +) { + const glossary = glossaryFile(plan.locale) + const glossaryContent = (await Bun.file(path.join(root, glossary)).exists()) + ? await Bun.file(path.join(root, glossary)).text() + : undefined + const prompt = template.replaceAll("$1", plan.locale).replaceAll( + "$ARGUMENTS", + JSON.stringify( + { + locale: plan.locale, + language: plan.language, + glossary: glossaryContent ? { file: glossary, content: glossaryContent } : undefined, + domains: plan.domains.map((domain) => ({ + source: domain.source, + target: domain.target, + ...domain.drift, + })), + }, + null, + 2, + ), + ) + const agent = `translate-app-${plan.locale}-${process.pid}` + const env = isolatedEnvironment() + env.OPENCODE_DISABLE_PROJECT_CONFIG = "1" + env.OPENCODE_CONFIG_CONTENT = JSON.stringify( + translationConfig( + agent, + model, + plan.domains.map((domain) => domain.target), + ), + ) + + const proc = Bun.spawn( + [ + "opencode", + "--pure", + "run", + "--dir", + root, + "--agent", + agent, + "--model", + model, + "--variant", + variant, + "--title", + `Translate app ${plan.locale}`, + "--format", + "json", + ], + { + cwd: root, + env, + stdin: "pipe", + stdout: "pipe", + stderr: "pipe", + }, + ) + const stdout = new Response(proc.stdout).text() + const stderr = new Response(proc.stderr).text() + await proc.stdin.write(prompt) + await proc.stdin.end() + const result = await Promise.all([stdout, stderr, proc.exited]) + if (result[2] !== 0) return { locale: plan.locale, stdout: result[0], stderr: result[1], code: result[2] } + + const sessionID = sessionIDFromEvents(result[0]) + const exported = Bun.spawn(["opencode", "--pure", "export", sessionID, "--sanitize"], { + cwd: root, + env, + stdout: "pipe", + stderr: "pipe", + }) + const exportResult = await Promise.all([ + new Response(exported.stdout).text(), + new Response(exported.stderr).text(), + exported.exited, + ]) + if (exportResult[2] !== 0) { + return { locale: plan.locale, stdout: textFromEvents(result[0]), stderr: exportResult[1], code: exportResult[2] } + } + + const session: unknown = JSON.parse(exportResult[0]) + const observed = sessionModels(session) + const mismatch = observed.length === 0 || observed.some((item) => item.model !== model || item.variant !== variant) + const actual = Array.from(new Set(observed.map((item) => `${item.model} (${item.variant ?? "default"})`))).join(", ") + return { + locale: plan.locale, + stdout: `${textFromEvents(result[0])}\nVerified session model: ${actual}\n`, + stderr: mismatch + ? `Requested ${model} (${variant}), but session used ${actual || "no assistant model"}.\n` + : result[1], + code: mismatch ? 1 : 0, + } +} + +function report(plan: { locale: Locale; domains: Domain[] }) { + const details = plan.domains + .map( + (domain) => + `${domain.name}: ${domain.drift.missing.length} missing, ${domain.drift.extra.length} extra, ${domain.drift.placeholders.length} placeholder mismatches`, + ) + .join("; ") + console.log(`[${plan.locale}] ${details}`) +} + +function changed(drift: Drift) { + return drift.missing.length > 0 || drift.extra.length > 0 || drift.placeholders.length > 0 +} + +function isLocale(value: string): value is Locale { + return Object.hasOwn(languages, value) +} + +function isDictionary(value: unknown): value is Dictionary { + if (typeof value !== "object" || value === null || Array.isArray(value)) return false + return Object.values(value).every((item) => typeof item === "string") +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value) +} + +async function resolveModelVariant(model: string, variant: string) { + const provider = model.split("/")[0] + if (!provider || !model.includes("/")) throw new Error(`Model must use provider/model syntax: ${model}`) + const env = isolatedEnvironment() + env.OPENCODE_DISABLE_PROJECT_CONFIG = "1" + const proc = Bun.spawn(["opencode", "--pure", "models", provider, "--verbose"], { + cwd: root, + env, + stdin: "ignore", + stdout: "pipe", + stderr: "pipe", + }) + const result = await Promise.all([new Response(proc.stdout).text(), new Response(proc.stderr).text(), proc.exited]) + if (result[2] !== 0) throw new Error(result[1] || `Unable to resolve model: ${model}`) + const variants = modelVariants(result[0], model) + if (!Object.hasOwn(variants, variant)) throw new Error(`Variant '${variant}' is not configured for ${model}.`) + return variants[variant] +} + +function isolatedEnvironment() { + const env = { ...process.env } + delete env.OPENCODE_CONFIG + delete env.OPENCODE_CONFIG_DIR + delete env.OPENCODE_CONFIG_CONTENT + delete env.OPENCODE_PERMISSION + delete env.OPENCODE_AUTO_SHARE + return env +} + +function escapeRegExp(value: string) { + return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") +} + +export function textFromEvents(output: string) { + return output + .split(/\r?\n/) + .map((line) => line.trim()) + .filter((line) => line.startsWith("{") && line.endsWith("}")) + .flatMap((line) => { + const event: unknown = JSON.parse(line) + if (!isRecord(event) || event.type !== "text" || !isRecord(event.part) || typeof event.part.text !== "string") { + return [] + } + return [event.part.text.trim()] + }) + .filter(Boolean) + .join("\n") +} + +function tokens(value: string) { + return Array.from(value.matchAll(/{{\s*([^}]+?)\s*}}/g), (match) => match[1] ?? "").sort() +} + +if (import.meta.main) { + main().catch((error) => { + console.error(error instanceof Error ? error.message : error) + process.exitCode = 1 + }) +}