diff --git a/landing/components/hero/CyberHeroFeatureStrip.vue b/landing/components/hero/CyberHeroFeatureStrip.vue
index 2e7eab41..7f1dc4a4 100644
--- a/landing/components/hero/CyberHeroFeatureStrip.vue
+++ b/landing/components/hero/CyberHeroFeatureStrip.vue
@@ -20,10 +20,10 @@ const props = defineProps<{
reducedMotion?: boolean;
}>();
-const { locale } = useI18n();
+const { t, locale } = useI18n();
const localizedHeroFeatureRail = computed(() => getLocalizedHeroFeatureRail(locale.value));
const localizedHeroReviewerFeatureCard = computed(() => getLocalizedHeroReviewerFeatureCard(locale.value));
-const statusLabel = computed(() => locale.value === "ru" ? "Статус:" : "Status:");
+const statusLabel = computed(() => t("common.statusLabel"));
const icons = [
mdiRobotOutline,
diff --git a/landing/components/hero/CyberHeroRobot.vue b/landing/components/hero/CyberHeroRobot.vue
index d6547404..0490bd18 100644
--- a/landing/components/hero/CyberHeroRobot.vue
+++ b/landing/components/hero/CyberHeroRobot.vue
@@ -7,12 +7,12 @@ const props = defineProps<{
activeReceiver?: HeroAgentRole | "video" | null;
}>();
-const { locale } = useI18n();
+const { t } = useI18n();
const isSender = computed(() => props.activeSender === props.agent.id);
const isReceiver = computed(() => props.activeReceiver === props.agent.id);
const imageLoading = computed(() => (props.agent.priority ? "eager" : "lazy"));
const imageFetchPriority = computed(() => (props.agent.priority ? "high" : "auto"));
-const statusLabel = computed(() => locale.value === "ru" ? "Статус:" : "Status:");
+const statusLabel = computed(() => t("common.statusLabel"));
const rootStyle = computed(() => ({
"--agent-x": String(props.agent.desktop.x),
diff --git a/landing/components/hero/CyberHeroVideoFrame.vue b/landing/components/hero/CyberHeroVideoFrame.vue
index 89724f91..68cbb030 100644
--- a/landing/components/hero/CyberHeroVideoFrame.vue
+++ b/landing/components/hero/CyberHeroVideoFrame.vue
@@ -1,6 +1,5 @@
@@ -8,12 +7,12 @@ const isRu = computed(() => locale.value === "ru");
id="hero-demo"
class="cyber-video-frame"
role="region"
- :aria-label="isRu ? 'Смотреть демо Agent Teams' : 'Watch Agent Teams demo'"
+ :aria-label="t('hero.videoFrameLabel')"
>
- {{ isRu ? 'Командная лента' : 'Team command feed' }}
- {{ isRu ? 'Живое демо' : 'Live demo' }}
+ {{ t('hero.commandFeed') }}
+ {{ t('hero.liveDemo') }}
diff --git a/landing/components/layout/AppFooter.vue b/landing/components/layout/AppFooter.vue
index 52be6429..7eb6cf17 100644
--- a/landing/components/layout/AppFooter.vue
+++ b/landing/components/layout/AppFooter.vue
@@ -5,7 +5,7 @@ const { t, locale } = useI18n();
const { repoUrl } = useGithubRepo();
const { baseURL } = useRuntimeConfig().app;
const year = new Date().getFullYear();
-const authorLabel = computed(() => locale.value === 'ru' ? 'Автор' : 'Author');
+const authorLabel = computed(() => t('footer.links.author'));
const docsHref = computed(() => {
const base = baseURL.replace(/\/?$/, '/');
return `${base}${locale.value === 'ru' ? 'docs/ru/' : 'docs/'}`;
diff --git a/landing/components/layout/AppHeader.vue b/landing/components/layout/AppHeader.vue
index fc7ed2bd..5e629fc6 100644
--- a/landing/components/layout/AppHeader.vue
+++ b/landing/components/layout/AppHeader.vue
@@ -8,16 +8,15 @@ const menuOpen = ref(false);
const withBase = (path: string) => `${baseURL.replace(/\/?$/, '/')}${path.replace(/^\/+/, '')}`;
const docsHref = computed(() => withBase(locale.value === 'ru' ? 'docs/ru/' : 'docs/'));
-const isRu = computed(() => locale.value === 'ru');
-const openMenuLabel = computed(() => (isRu.value ? 'Открыть меню' : 'Open menu'));
-const closeMenuLabel = computed(() => (isRu.value ? 'Закрыть меню' : 'Close menu'));
+const openMenuLabel = computed(() => t('nav.openMenu'));
+const closeMenuLabel = computed(() => t('nav.closeMenu'));
const navItems = computed(() => [
- { href: '#screenshots', label: t('nav.screenshots'), shortLabel: isRu.value ? 'Скрины' : 'Shots' },
- { href: docsHref.value, label: t('nav.docs'), shortLabel: isRu.value ? 'Док' : 'Docs' },
- { href: '#download', label: t('nav.download'), shortLabel: isRu.value ? 'Скачать' : 'Get' },
- { href: '#comparison', label: t('nav.comparison'), shortLabel: isRu.value ? 'Сравн.' : 'Compare' },
- { href: '#pricing', label: t('nav.pricing'), shortLabel: isRu.value ? 'Беспл.' : 'Free' },
+ { href: '#screenshots', label: t('nav.screenshots'), shortLabel: t('nav.short.screenshots') },
+ { href: docsHref.value, label: t('nav.docs'), shortLabel: t('nav.short.docs') },
+ { href: '#download', label: t('nav.download'), shortLabel: t('nav.short.download') },
+ { href: '#comparison', label: t('nav.comparison'), shortLabel: t('nav.short.comparison') },
+ { href: '#pricing', label: t('nav.pricing'), shortLabel: t('nav.short.pricing') },
{ href: '#faq', label: t('nav.faq'), shortLabel: 'FAQ' },
]);
diff --git a/landing/components/sections/DownloadSection.vue b/landing/components/sections/DownloadSection.vue
index 13c4606e..84e44bb6 100644
--- a/landing/components/sections/DownloadSection.vue
+++ b/landing/components/sections/DownloadSection.vue
@@ -251,7 +251,7 @@ const releaseDate = computed(() => {
day: 'numeric',
});
});
-const linuxRobotBubble = computed(() => locale.value === 'ru' ? 'Готов начать!' : 'Ready to start!');
+const linuxRobotBubble = computed(() => t('download.readyToStart'));
diff --git a/landing/components/sections/HeroSection.vue b/landing/components/sections/HeroSection.vue
index b7877ff4..d6c6dae5 100644
--- a/landing/components/sections/HeroSection.vue
+++ b/landing/components/sections/HeroSection.vue
@@ -54,14 +54,10 @@ const supportedProviders = [
},
] as const;
const supportedProvidersLabel = computed(() => (
- locale.value === "ru"
- ? "Поддерживаем AI-провайдеры"
- : "Supported AI providers"
+ t("hero.supportedProviders")
));
const heroSlogan = computed(() => (
- locale.value === "ru"
- ? "Делайте много, почти ничего не делая"
- : "Get a lot done by doing very little"
+ t("hero.slogan")
));
const heroDownloadUrl = computed(() => {
@@ -74,17 +70,13 @@ const heroDownloadUrl = computed(() => {
const docsHref = computed(() => withBase(locale.value === "ru" ? "docs/ru/" : "docs/"));
const downloadActionSubtitle = computed(() => {
if (!selectedDownloadAsset.value) {
- return locale.value === "ru"
- ? "Для вашей платформы"
- : "For your platform";
+ return t("hero.platformDefault");
}
return selectedDownloadAsset.value.actionSubtitle;
});
const docsActionSubtitle = computed(() => (
- locale.value === "ru"
- ? "Гайды и настройка"
- : "Guides and setup"
+ t("hero.guidesSetup")
));
function clearHeroMessageTimers() {
diff --git a/landing/components/sections/ScreenshotsSection.vue b/landing/components/sections/ScreenshotsSection.vue
index acfc349d..76ac9090 100644
--- a/landing/components/sections/ScreenshotsSection.vue
+++ b/landing/components/sections/ScreenshotsSection.vue
@@ -27,8 +27,8 @@ const screenshots = computed(() => screenshotData.map((s) => ({
width: s.width,
height: s.height,
})));
-const prevLabel = computed(() => locale.value === 'ru' ? 'Предыдущий' : 'Previous');
-const nextLabel = computed(() => locale.value === 'ru' ? 'Следующий' : 'Next');
+const prevLabel = computed(() => t('common.previous'));
+const nextLabel = computed(() => t('common.next'));
const swiperRef = ref
(null);
const swiperReady = ref(false);
diff --git a/landing/components/ui/HeroDemo.vue b/landing/components/ui/HeroDemo.vue
index ee4033d4..2815271e 100644
--- a/landing/components/ui/HeroDemo.vue
+++ b/landing/components/ui/HeroDemo.vue
@@ -1,7 +1,9 @@
-
+
@@ -225,7 +238,7 @@ function statusDotColor(status: string) {
- {{ col === 'progress' ? 'IN PROGRESS' : col.toUpperCase() }}
+ {{ colLabel(col) }}
@@ -249,7 +262,7 @@ function statusDotColor(status: string) {
{{ currentTask || 'Waiting for tasks...' }}
+ >{{ currentTask || t('hero.demo.waiting') }}
diff --git a/landing/components/ui/HeroDemoVideo.vue b/landing/components/ui/HeroDemoVideo.vue
index 3a6f84a7..0c1f8abf 100644
--- a/landing/components/ui/HeroDemoVideo.vue
+++ b/landing/components/ui/HeroDemoVideo.vue
@@ -2,19 +2,15 @@
import { computed, onMounted, onUnmounted, ref } from "vue";
import { mdiPlay } from "@mdi/js";
-const { t, locale } = useI18n();
+const { t } = useI18n();
const config = useRuntimeConfig();
const muxAccentColor = "#00f0ff";
const muxPrimaryColor = "#e6fbff";
const muxSecondaryColor = "#020617";
const muxPlaybackId = computed(() => String(config.public.muxPlaybackId || "").trim());
-const videoTitle = computed(() => (
- locale.value === "ru" ? "Демо-видео Agent Teams" : "Agent Teams demo video"
-));
-const muxVideoTitle = computed(() => (
- locale.value === "ru" ? "Демо Agent Teams" : "Agent Teams demo"
-));
+const videoTitle = computed(() => t("hero.demoVideoTitle"));
+const muxVideoTitle = computed(() => t("hero.demoTitle"));
const muxPlayerUrl = computed(() => {
if (!muxPlaybackId.value) return "";
diff --git a/landing/locales/ar.json b/landing/locales/ar.json
index 61e3f987..9b584773 100644
--- a/landing/locales/ar.json
+++ b/landing/locales/ar.json
@@ -7,7 +7,16 @@
"download": "تحميل",
"pricing": "مجاني",
"faq": "الأسئلة الشائعة",
- "viewOnGithub": "View on GitHub"
+ "viewOnGithub": "View on GitHub",
+ "openMenu": "فتح القائمة",
+ "closeMenu": "إغلاق القائمة",
+ "short": {
+ "screenshots": "صور",
+ "docs": "Docs",
+ "download": "تحميل",
+ "comparison": "مقارنة",
+ "pricing": "مجاني"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "مفتوح المصدر"
},
"watchDemo": "شاهد العرض",
- "videoUnavailable": "الفيديو غير متوفر"
+ "videoUnavailable": "الفيديو غير متوفر",
+ "supportedProviders": "مزودو AI المدعومون",
+ "slogan": "أنجز الكثير بجهد قليل جدًا",
+ "platformDefault": "لمنصتك",
+ "guidesSetup": "الأدلة والإعداد",
+ "videoFrameLabel": "شاهد عرض Agent Teams",
+ "commandFeed": "تدفق أوامر الفريق",
+ "liveDemo": "عرض مباشر",
+ "demoVideoTitle": "فيديو عرض Agent Teams",
+ "demoTitle": "عرض Agent Teams",
+ "demo": {
+ "ariaLabel": "عرض فريق الوكلاء",
+ "live": "LIVE",
+ "waiting": "بانتظار المهام...",
+ "activity": {
+ "authMiddleware": "تنفيذ middleware للمصادقة...",
+ "unitTests": "كتابة اختبارات وحدة للـ API...",
+ "reviewPr": "مراجعة تغييرات PR #42...",
+ "ciPipeline": "إعداد pipeline CI/CD...",
+ "refactorDatabase": "إعادة هيكلة طبقة قاعدة البيانات..."
+ },
+ "tasks": {
+ "authApi": "Auth API",
+ "unitTests": "اختبارات وحدة",
+ "ciSetup": "إعداد CI"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "قيد التنفيذ",
+ "review": "مراجعة",
+ "done": "تم"
+ }
+ }
},
"download": {
"title": "تحميل",
"detected": "تم الكشف",
"systemRequirements": "متطلبات النظام",
- "version": "الإصدار {version}"
+ "version": "الإصدار {version}",
+ "readyToStart": "جاهز للبدء!"
},
"theme": {
"dark": "داكن",
@@ -100,7 +142,10 @@
"sectionSubtitle": "لقطات شاشة حقيقية من التطبيق — لوحة كانبان، مراجعة الكود، فرق الوكلاء، والمزيد."
},
"common": {
- "learnMore": "اعرف المزيد"
+ "learnMore": "اعرف المزيد",
+ "statusLabel": "الحالة:",
+ "previous": "السابق",
+ "next": "التالي"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "أنا أنتظر",
"links": {
"github": "GitHub",
+ "author": "المؤلف",
"docs": "التوثيق"
}
},
diff --git a/landing/locales/bn.json b/landing/locales/bn.json
index b181e2b4..2f8e4e70 100644
--- a/landing/locales/bn.json
+++ b/landing/locales/bn.json
@@ -7,7 +7,16 @@
"download": "ডাউনলোড করা হয়েছে",
"pricing": "মুক্ত",
"faq": "FAQ",
- "viewOnGithub": "প্রদর্শন GitHub"
+ "viewOnGithub": "প্রদর্শন GitHub",
+ "openMenu": "মেনু খুলুন",
+ "closeMenu": "মেনু বন্ধ করুন",
+ "short": {
+ "screenshots": "স্ক্রিন",
+ "docs": "Docs",
+ "download": "ডাউনলোড",
+ "comparison": "তুলনা",
+ "pricing": "ফ্রি"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "উৎস খুলুন"
},
"watchDemo": "নমুনা",
- "videoUnavailable": "ভিডিও উপলব্ধ নয়"
+ "videoUnavailable": "ভিডিও উপলব্ধ নয়",
+ "supportedProviders": "সমর্থিত AI providers",
+ "slogan": "খুব কম কাজ করে অনেক কিছু করুন",
+ "platformDefault": "আপনার platform-এর জন্য",
+ "guidesSetup": "Guides এবং setup",
+ "videoFrameLabel": "Agent Teams demo দেখুন",
+ "commandFeed": "Team command feed",
+ "liveDemo": "Live demo",
+ "demoVideoTitle": "Agent Teams demo video",
+ "demoTitle": "Agent Teams demo",
+ "demo": {
+ "ariaLabel": "Agent team demo",
+ "live": "LIVE",
+ "waiting": "Tasks এর অপেক্ষা...",
+ "activity": {
+ "authMiddleware": "Auth middleware implement হচ্ছে...",
+ "unitTests": "API এর জন্য unit tests লেখা হচ্ছে...",
+ "reviewPr": "PR #42 changes review হচ্ছে...",
+ "ciPipeline": "CI/CD pipeline setup হচ্ছে...",
+ "refactorDatabase": "Database layer refactor হচ্ছে..."
+ },
+ "tasks": {
+ "authApi": "Auth API",
+ "unitTests": "Unit tests",
+ "ciSetup": "CI setup"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "IN PROGRESS",
+ "review": "REVIEW",
+ "done": "DONE"
+ }
+ }
},
"download": {
"title": "ডাউনলোড করা হয়েছে",
"detected": "সনাক্ত",
"systemRequirements": "সিস্টেম প্রয়োজন",
- "version": "সংস্করণ {version}"
+ "version": "সংস্করণ {version}",
+ "readyToStart": "শুরু করার জন্য প্রস্তুত!"
},
"theme": {
"dark": "কালো",
@@ -100,7 +142,10 @@
"sectionSubtitle": "অ্যাপটির বাস্তব স্ক্রিনশট —কানবান বোর্ড, কোড পর্যালোচনা, এজেন্ট দল এবং আরও অনেক কিছু ।"
},
"common": {
- "learnMore": "অারো জানুন"
+ "learnMore": "অারো জানুন",
+ "statusLabel": "স্ট্যাটাস:",
+ "previous": "আগের",
+ "next": "পরের"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "আমি অপেক্ষা করছি",
"links": {
"github": "GitHub",
+ "author": "লেখক",
"docs": "নথিপত্র"
}
},
diff --git a/landing/locales/de.json b/landing/locales/de.json
index f407c51b..611bfacd 100644
--- a/landing/locales/de.json
+++ b/landing/locales/de.json
@@ -7,7 +7,16 @@
"download": "Download",
"pricing": "Kostenlos",
"faq": "FAQ",
- "viewOnGithub": "View on GitHub"
+ "viewOnGithub": "View on GitHub",
+ "openMenu": "Menü öffnen",
+ "closeMenu": "Menü schließen",
+ "short": {
+ "screenshots": "Bilder",
+ "docs": "Docs",
+ "download": "Laden",
+ "comparison": "Vergleich",
+ "pricing": "Gratis"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "Open Source"
},
"watchDemo": "Demo ansehen",
- "videoUnavailable": "Video nicht verfügbar"
+ "videoUnavailable": "Video nicht verfügbar",
+ "supportedProviders": "Unterstützte KI-Anbieter",
+ "slogan": "Viel erledigen mit sehr wenig Aufwand",
+ "platformDefault": "Für Ihre Plattform",
+ "guidesSetup": "Anleitungen und Einrichtung",
+ "videoFrameLabel": "Agent Teams Demo ansehen",
+ "commandFeed": "Team-Befehlsfeed",
+ "liveDemo": "Live-Demo",
+ "demoVideoTitle": "Agent Teams Demo-Video",
+ "demoTitle": "Agent Teams Demo",
+ "demo": {
+ "ariaLabel": "Agententeam-Demo",
+ "live": "LIVE",
+ "waiting": "Warte auf Aufgaben...",
+ "activity": {
+ "authMiddleware": "Auth-Middleware wird implementiert...",
+ "unitTests": "Unit-Tests für API werden geschrieben...",
+ "reviewPr": "PR #42 Änderungen werden geprüft...",
+ "ciPipeline": "CI/CD-Pipeline wird eingerichtet...",
+ "refactorDatabase": "Datenbankschicht wird refaktoriert..."
+ },
+ "tasks": {
+ "authApi": "Auth API",
+ "unitTests": "Unit-Tests",
+ "ciSetup": "CI Setup"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "IN ARBEIT",
+ "review": "REVIEW",
+ "done": "FERTIG"
+ }
+ }
},
"download": {
"title": "Herunterladen",
"detected": "Erkannt",
"systemRequirements": "Systemanforderungen",
- "version": "Version {version}"
+ "version": "Version {version}",
+ "readyToStart": "Bereit zum Start!"
},
"theme": {
"dark": "Dunkel",
@@ -100,7 +142,10 @@
"sectionSubtitle": "Echte Screenshots der App — Kanban-Board, Code-Review, Agenten-Teams und mehr."
},
"common": {
- "learnMore": "Mehr erfahren"
+ "learnMore": "Mehr erfahren",
+ "statusLabel": "Status:",
+ "previous": "Zurück",
+ "next": "Weiter"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "Ich warte",
"links": {
"github": "GitHub",
+ "author": "Autor",
"docs": "Dokumentation"
}
},
diff --git a/landing/locales/en.json b/landing/locales/en.json
index fc0f0476..23d4ee54 100644
--- a/landing/locales/en.json
+++ b/landing/locales/en.json
@@ -7,7 +7,16 @@
"download": "Download",
"pricing": "Free",
"faq": "FAQ",
- "viewOnGithub": "View on GitHub"
+ "viewOnGithub": "View on GitHub",
+ "openMenu": "Open menu",
+ "closeMenu": "Close menu",
+ "short": {
+ "screenshots": "Shots",
+ "docs": "Docs",
+ "download": "Get",
+ "comparison": "Compare",
+ "pricing": "Free"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "Open Source"
},
"watchDemo": "Watch Demo",
- "videoUnavailable": "Video unavailable"
+ "videoUnavailable": "Video unavailable",
+ "supportedProviders": "Supported AI providers",
+ "slogan": "Get a lot done by doing very little",
+ "platformDefault": "For your platform",
+ "guidesSetup": "Guides and setup",
+ "videoFrameLabel": "Watch Agent Teams demo",
+ "commandFeed": "Team command feed",
+ "liveDemo": "Live demo",
+ "demoVideoTitle": "Agent Teams demo video",
+ "demoTitle": "Agent Teams demo",
+ "demo": {
+ "ariaLabel": "Agent team demo",
+ "live": "LIVE",
+ "waiting": "Waiting for tasks...",
+ "activity": {
+ "authMiddleware": "Implementing auth middleware...",
+ "unitTests": "Writing unit tests for API...",
+ "reviewPr": "Reviewing PR #42 changes...",
+ "ciPipeline": "Setting up CI/CD pipeline...",
+ "refactorDatabase": "Refactoring database layer..."
+ },
+ "tasks": {
+ "authApi": "Auth API",
+ "unitTests": "Unit tests",
+ "ciSetup": "CI setup"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "IN PROGRESS",
+ "review": "REVIEW",
+ "done": "DONE"
+ }
+ }
},
"download": {
"title": "Download",
"detected": "Detected",
"systemRequirements": "System requirements",
- "version": "Version {version}"
+ "version": "Version {version}",
+ "readyToStart": "Ready to start!"
},
"theme": {
"dark": "Dark",
@@ -100,7 +142,10 @@
"sectionSubtitle": "Real screenshots from the app — kanban board, code review, agent teams, and more."
},
"common": {
- "learnMore": "Learn more"
+ "learnMore": "Learn more",
+ "statusLabel": "Status:",
+ "previous": "Previous",
+ "next": "Next"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "I'm waiting",
"links": {
"github": "GitHub",
+ "author": "Author",
"docs": "Documentation"
}
},
diff --git a/landing/locales/es.json b/landing/locales/es.json
index 579f122f..3da96d24 100644
--- a/landing/locales/es.json
+++ b/landing/locales/es.json
@@ -7,7 +7,16 @@
"download": "Descargar",
"pricing": "Gratis",
"faq": "FAQ",
- "viewOnGithub": "View on GitHub"
+ "viewOnGithub": "View on GitHub",
+ "openMenu": "Abrir menú",
+ "closeMenu": "Cerrar menú",
+ "short": {
+ "screenshots": "Capturas",
+ "docs": "Docs",
+ "download": "Bajar",
+ "comparison": "Comparar",
+ "pricing": "Gratis"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "Open Source"
},
"watchDemo": "Ver demo",
- "videoUnavailable": "Vídeo no disponible"
+ "videoUnavailable": "Vídeo no disponible",
+ "supportedProviders": "Proveedores de IA compatibles",
+ "slogan": "Haz mucho haciendo muy poco",
+ "platformDefault": "Para tu plataforma",
+ "guidesSetup": "Guías y configuración",
+ "videoFrameLabel": "Ver demo de Agent Teams",
+ "commandFeed": "Feed de comandos del equipo",
+ "liveDemo": "Demo en vivo",
+ "demoVideoTitle": "Vídeo demo de Agent Teams",
+ "demoTitle": "Demo de Agent Teams",
+ "demo": {
+ "ariaLabel": "Demo del equipo de agentes",
+ "live": "LIVE",
+ "waiting": "Esperando tareas...",
+ "activity": {
+ "authMiddleware": "Implementando middleware de autenticación...",
+ "unitTests": "Escribiendo pruebas unitarias para API...",
+ "reviewPr": "Revisando cambios del PR #42...",
+ "ciPipeline": "Configurando pipeline CI/CD...",
+ "refactorDatabase": "Refactorizando capa de base de datos..."
+ },
+ "tasks": {
+ "authApi": "API de auth",
+ "unitTests": "Pruebas unitarias",
+ "ciSetup": "Config CI"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "EN PROGRESO",
+ "review": "REVISIÓN",
+ "done": "LISTO"
+ }
+ }
},
"download": {
"title": "Descargar",
"detected": "Detectado",
"systemRequirements": "Requisitos del sistema",
- "version": "Versión {version}"
+ "version": "Versión {version}",
+ "readyToStart": "Listo para empezar!"
},
"theme": {
"dark": "Oscuro",
@@ -100,7 +142,10 @@
"sectionSubtitle": "Capturas reales de la aplicación — tablero kanban, revisión de código, equipos de agentes y más."
},
"common": {
- "learnMore": "Más información"
+ "learnMore": "Más información",
+ "statusLabel": "Estado:",
+ "previous": "Anterior",
+ "next": "Siguiente"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "Estoy esperando",
"links": {
"github": "GitHub",
+ "author": "Autor",
"docs": "Documentación"
}
},
diff --git a/landing/locales/fr.json b/landing/locales/fr.json
index 675c6833..253de5ac 100644
--- a/landing/locales/fr.json
+++ b/landing/locales/fr.json
@@ -7,7 +7,16 @@
"download": "Télécharger",
"pricing": "Gratuit",
"faq": "FAQ",
- "viewOnGithub": "View on GitHub"
+ "viewOnGithub": "View on GitHub",
+ "openMenu": "Ouvrir le menu",
+ "closeMenu": "Fermer le menu",
+ "short": {
+ "screenshots": "Captures",
+ "docs": "Docs",
+ "download": "Télécharger",
+ "comparison": "Comparer",
+ "pricing": "Gratuit"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "Open Source"
},
"watchDemo": "Voir la démo",
- "videoUnavailable": "Vidéo indisponible"
+ "videoUnavailable": "Vidéo indisponible",
+ "supportedProviders": "Fournisseurs IA compatibles",
+ "slogan": "Faites beaucoup en faisant très peu",
+ "platformDefault": "Pour votre plateforme",
+ "guidesSetup": "Guides et configuration",
+ "videoFrameLabel": "Regarder la démo Agent Teams",
+ "commandFeed": "Flux de commandes d'équipe",
+ "liveDemo": "Démo en direct",
+ "demoVideoTitle": "Vidéo démo Agent Teams",
+ "demoTitle": "Démo Agent Teams",
+ "demo": {
+ "ariaLabel": "Démo d'équipe d'agents",
+ "live": "LIVE",
+ "waiting": "En attente de tâches...",
+ "activity": {
+ "authMiddleware": "Implémentation du middleware d'auth...",
+ "unitTests": "Écriture de tests unitaires pour l'API...",
+ "reviewPr": "Revue des changements PR #42...",
+ "ciPipeline": "Configuration du pipeline CI/CD...",
+ "refactorDatabase": "Refactorisation de la couche base de données..."
+ },
+ "tasks": {
+ "authApi": "API auth",
+ "unitTests": "Tests unitaires",
+ "ciSetup": "Config CI"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "EN COURS",
+ "review": "REVUE",
+ "done": "TERMINÉ"
+ }
+ }
},
"download": {
"title": "Télécharger",
"detected": "Détecté",
"systemRequirements": "Configuration requise",
- "version": "Version {version}"
+ "version": "Version {version}",
+ "readyToStart": "Prêt à commencer!"
},
"theme": {
"dark": "Sombre",
@@ -100,7 +142,10 @@
"sectionSubtitle": "Captures d'écran réelles — tableau kanban, revue de code, équipes d'agents et plus."
},
"common": {
- "learnMore": "En savoir plus"
+ "learnMore": "En savoir plus",
+ "statusLabel": "Statut:",
+ "previous": "Précédent",
+ "next": "Suivant"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "J'attends",
"links": {
"github": "GitHub",
+ "author": "Auteur",
"docs": "Documentation"
}
},
diff --git a/landing/locales/hi.json b/landing/locales/hi.json
index db802dcf..01fd572d 100644
--- a/landing/locales/hi.json
+++ b/landing/locales/hi.json
@@ -7,7 +7,16 @@
"download": "डाउनलोड",
"pricing": "मुफ़्त",
"faq": "FAQ",
- "viewOnGithub": "View on GitHub"
+ "viewOnGithub": "View on GitHub",
+ "openMenu": "मेनू खोलें",
+ "closeMenu": "मेनू बंद करें",
+ "short": {
+ "screenshots": "शॉट्स",
+ "docs": "Docs",
+ "download": "डाउनलोड",
+ "comparison": "तुलना",
+ "pricing": "मुफ्त"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "ओपन सोर्स"
},
"watchDemo": "डेमो देखें",
- "videoUnavailable": "वीडियो उपलब्ध नहीं"
+ "videoUnavailable": "वीडियो उपलब्ध नहीं",
+ "supportedProviders": "समर्थित AI providers",
+ "slogan": "बहुत कम करके बहुत कुछ करें",
+ "platformDefault": "आपके platform के लिए",
+ "guidesSetup": "Guides और setup",
+ "videoFrameLabel": "Agent Teams demo देखें",
+ "commandFeed": "Team command feed",
+ "liveDemo": "Live demo",
+ "demoVideoTitle": "Agent Teams demo video",
+ "demoTitle": "Agent Teams demo",
+ "demo": {
+ "ariaLabel": "Agent team demo",
+ "live": "LIVE",
+ "waiting": "Tasks का इंतज़ार...",
+ "activity": {
+ "authMiddleware": "Auth middleware implement हो रहा है...",
+ "unitTests": "API के लिए unit tests लिखे जा रहे हैं...",
+ "reviewPr": "PR #42 changes review हो रहे हैं...",
+ "ciPipeline": "CI/CD pipeline setup हो रही है...",
+ "refactorDatabase": "Database layer refactor हो रही है..."
+ },
+ "tasks": {
+ "authApi": "Auth API",
+ "unitTests": "Unit tests",
+ "ciSetup": "CI setup"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "IN PROGRESS",
+ "review": "REVIEW",
+ "done": "DONE"
+ }
+ }
},
"download": {
"title": "डाउनलोड",
"detected": "पहचाना गया",
"systemRequirements": "सिस्टम आवश्यकताएँ",
- "version": "संस्करण {version}"
+ "version": "संस्करण {version}",
+ "readyToStart": "शुरू करने के लिए तैयार!"
},
"theme": {
"dark": "डार्क",
@@ -100,7 +142,10 @@
"sectionSubtitle": "ऐप के असली स्क्रीनशॉट — कानबन बोर्ड, कोड रिव्यू, एजेंट टीमें, और बहुत कुछ।"
},
"common": {
- "learnMore": "और जानें"
+ "learnMore": "और जानें",
+ "statusLabel": "स्थिति:",
+ "previous": "पिछला",
+ "next": "अगला"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "मैं इंतज़ार कर रहा हूँ",
"links": {
"github": "GitHub",
+ "author": "लेखक",
"docs": "दस्तावेज़"
}
},
diff --git a/landing/locales/id.json b/landing/locales/id.json
index b736966f..adb69a40 100644
--- a/landing/locales/id.json
+++ b/landing/locales/id.json
@@ -7,7 +7,16 @@
"download": "Unduh",
"pricing": "Bebas",
"faq": "FAQ",
- "viewOnGithub": "Tilik pada GitHub"
+ "viewOnGithub": "Tilik pada GitHub",
+ "openMenu": "Buka menu",
+ "closeMenu": "Tutup menu",
+ "short": {
+ "screenshots": "Gambar",
+ "docs": "Docs",
+ "download": "Unduh",
+ "comparison": "Banding",
+ "pricing": "Gratis"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "Buka Sumber"
},
"watchDemo": "Watch Demo",
- "videoUnavailable": "Video tidak tersedia"
+ "videoUnavailable": "Video tidak tersedia",
+ "supportedProviders": "Penyedia AI yang didukung",
+ "slogan": "Selesaikan banyak hal dengan sangat sedikit aksi",
+ "platformDefault": "Untuk platform Anda",
+ "guidesSetup": "Panduan dan penyiapan",
+ "videoFrameLabel": "Tonton demo Agent Teams",
+ "commandFeed": "Feed perintah tim",
+ "liveDemo": "Demo langsung",
+ "demoVideoTitle": "Video demo Agent Teams",
+ "demoTitle": "Demo Agent Teams",
+ "demo": {
+ "ariaLabel": "Demo tim agen",
+ "live": "LIVE",
+ "waiting": "Menunggu tugas...",
+ "activity": {
+ "authMiddleware": "Menerapkan middleware auth...",
+ "unitTests": "Menulis unit test untuk API...",
+ "reviewPr": "Meninjau perubahan PR #42...",
+ "ciPipeline": "Menyiapkan pipeline CI/CD...",
+ "refactorDatabase": "Merefactor layer database..."
+ },
+ "tasks": {
+ "authApi": "Auth API",
+ "unitTests": "Unit test",
+ "ciSetup": "Setup CI"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "BERJALAN",
+ "review": "REVIEW",
+ "done": "SELESAI"
+ }
+ }
},
"download": {
"title": "Unduh",
"detected": "Terdeteksi",
"systemRequirements": "Kebutuhan sistem",
- "version": "Versi {version}"
+ "version": "Versi {version}",
+ "readyToStart": "Siap mulai!"
},
"theme": {
"dark": "Gelap",
@@ -100,7 +142,10 @@
"sectionSubtitle": "Gambar layar nyata dari aplikasi - papan kanban, ulasan kode, tim agen, dan banyak lagi."
},
"common": {
- "learnMore": "Pelajari lagi"
+ "learnMore": "Pelajari lagi",
+ "statusLabel": "Status:",
+ "previous": "Sebelumnya",
+ "next": "Berikutnya"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "Aku menunggu",
"links": {
"github": "GitHub",
+ "author": "Penulis",
"docs": "Dokumentasi"
}
},
diff --git a/landing/locales/ja.json b/landing/locales/ja.json
index 4f957f5f..fd4ba32b 100644
--- a/landing/locales/ja.json
+++ b/landing/locales/ja.json
@@ -7,7 +7,16 @@
"download": "ダウンロード",
"pricing": "無料",
"faq": "FAQ",
- "viewOnGithub": "View on GitHub"
+ "viewOnGithub": "View on GitHub",
+ "openMenu": "メニューを開く",
+ "closeMenu": "メニューを閉じる",
+ "short": {
+ "screenshots": "画像",
+ "docs": "Docs",
+ "download": "入手",
+ "comparison": "比較",
+ "pricing": "無料"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "オープンソース"
},
"watchDemo": "デモを見る",
- "videoUnavailable": "動画は利用できません"
+ "videoUnavailable": "動画は利用できません",
+ "supportedProviders": "対応 AI プロバイダー",
+ "slogan": "少ない操作で多くをこなす",
+ "platformDefault": "お使いのプラットフォーム向け",
+ "guidesSetup": "ガイドとセットアップ",
+ "videoFrameLabel": "Agent Teams のデモを見る",
+ "commandFeed": "チームコマンドフィード",
+ "liveDemo": "ライブデモ",
+ "demoVideoTitle": "Agent Teams デモ動画",
+ "demoTitle": "Agent Teams デモ",
+ "demo": {
+ "ariaLabel": "エージェントチームのデモ",
+ "live": "LIVE",
+ "waiting": "タスクを待機中...",
+ "activity": {
+ "authMiddleware": "認証ミドルウェアを実装中...",
+ "unitTests": "API のユニットテストを作成中...",
+ "reviewPr": "PR #42 の変更をレビュー中...",
+ "ciPipeline": "CI/CD パイプラインを設定中...",
+ "refactorDatabase": "データベース層をリファクタリング中..."
+ },
+ "tasks": {
+ "authApi": "認証 API",
+ "unitTests": "ユニットテスト",
+ "ciSetup": "CI 設定"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "進行中",
+ "review": "レビュー",
+ "done": "完了"
+ }
+ }
},
"download": {
"title": "ダウンロード",
"detected": "検出済み",
"systemRequirements": "動作環境",
- "version": "バージョン {version}"
+ "version": "バージョン {version}",
+ "readyToStart": "開始できます!"
},
"theme": {
"dark": "ダーク",
@@ -100,7 +142,10 @@
"sectionSubtitle": "アプリの実際のスクリーンショット — カンバンボード、コードレビュー、エージェントチームなど。"
},
"common": {
- "learnMore": "詳細"
+ "learnMore": "詳細",
+ "statusLabel": "ステータス:",
+ "previous": "前へ",
+ "next": "次へ"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "待ってるよ",
"links": {
"github": "GitHub",
+ "author": "作者",
"docs": "ドキュメント"
}
},
diff --git a/landing/locales/ko.json b/landing/locales/ko.json
index 60435aab..91e0e4b4 100644
--- a/landing/locales/ko.json
+++ b/landing/locales/ko.json
@@ -7,7 +7,16 @@
"download": "다운로드",
"pricing": "무료",
"faq": "FAQ",
- "viewOnGithub": "GitHub에서 보기"
+ "viewOnGithub": "GitHub에서 보기",
+ "openMenu": "메뉴 열기",
+ "closeMenu": "메뉴 닫기",
+ "short": {
+ "screenshots": "샷",
+ "docs": "문서",
+ "download": "받기",
+ "comparison": "비교",
+ "pricing": "무료"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "오픈 소스"
},
"watchDemo": "데모 보기",
- "videoUnavailable": "동영상을 사용할 수 없습니다"
+ "videoUnavailable": "동영상을 사용할 수 없습니다",
+ "supportedProviders": "지원되는 AI 제공자",
+ "slogan": "아주 적은 조작으로 많은 일을 처리하세요",
+ "platformDefault": "현재 플랫폼용",
+ "guidesSetup": "가이드 및 설정",
+ "videoFrameLabel": "Agent Teams 데모 보기",
+ "commandFeed": "팀 명령 피드",
+ "liveDemo": "라이브 데모",
+ "demoVideoTitle": "Agent Teams 데모 동영상",
+ "demoTitle": "Agent Teams 데모",
+ "demo": {
+ "ariaLabel": "에이전트 팀 데모",
+ "live": "LIVE",
+ "waiting": "작업 대기 중...",
+ "activity": {
+ "authMiddleware": "인증 미들웨어 구현 중...",
+ "unitTests": "API 단위 테스트 작성 중...",
+ "reviewPr": "PR #42 변경 사항 검토 중...",
+ "ciPipeline": "CI/CD 파이프라인 설정 중...",
+ "refactorDatabase": "데이터베이스 계층 리팩터링 중..."
+ },
+ "tasks": {
+ "authApi": "Auth API",
+ "unitTests": "단위 테스트",
+ "ciSetup": "CI 설정"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "진행 중",
+ "review": "리뷰",
+ "done": "완료"
+ }
+ }
},
"download": {
"title": "다운로드",
"detected": "감지됨",
"systemRequirements": "시스템 요구 사항",
- "version": "버전 {version}"
+ "version": "버전 {version}",
+ "readyToStart": "시작할 준비 완료!"
},
"theme": {
"dark": "다크",
@@ -100,7 +142,10 @@
"sectionSubtitle": "칸반 보드, 코드 리뷰, 에이전트 팀 등 앱의 실제 스크린샷입니다."
},
"common": {
- "learnMore": "자세히 알아보기"
+ "learnMore": "자세히 알아보기",
+ "statusLabel": "상태:",
+ "previous": "이전",
+ "next": "다음"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "기다리고 있어요",
"links": {
"github": "GitHub",
+ "author": "작성자",
"docs": "문서"
}
},
diff --git a/landing/locales/pt.json b/landing/locales/pt.json
index f5b7960c..2f786ee5 100644
--- a/landing/locales/pt.json
+++ b/landing/locales/pt.json
@@ -7,7 +7,16 @@
"download": "Baixar",
"pricing": "Grátis",
"faq": "FAQ",
- "viewOnGithub": "View on GitHub"
+ "viewOnGithub": "View on GitHub",
+ "openMenu": "Abrir menu",
+ "closeMenu": "Fechar menu",
+ "short": {
+ "screenshots": "Imagens",
+ "docs": "Docs",
+ "download": "Baixar",
+ "comparison": "Comparar",
+ "pricing": "Grátis"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "Open Source"
},
"watchDemo": "Ver demo",
- "videoUnavailable": "Vídeo indisponível"
+ "videoUnavailable": "Vídeo indisponível",
+ "supportedProviders": "Provedores de IA compatíveis",
+ "slogan": "Faça muito fazendo muito pouco",
+ "platformDefault": "Para sua plataforma",
+ "guidesSetup": "Guias e configuração",
+ "videoFrameLabel": "Assistir demo do Agent Teams",
+ "commandFeed": "Feed de comandos da equipe",
+ "liveDemo": "Demo ao vivo",
+ "demoVideoTitle": "Vídeo demo do Agent Teams",
+ "demoTitle": "Demo do Agent Teams",
+ "demo": {
+ "ariaLabel": "Demo da equipe de agentes",
+ "live": "LIVE",
+ "waiting": "Aguardando tarefas...",
+ "activity": {
+ "authMiddleware": "Implementando middleware de autenticação...",
+ "unitTests": "Escrevendo testes unitários para API...",
+ "reviewPr": "Revisando mudanças do PR #42...",
+ "ciPipeline": "Configurando pipeline CI/CD...",
+ "refactorDatabase": "Refatorando camada de banco de dados..."
+ },
+ "tasks": {
+ "authApi": "API auth",
+ "unitTests": "Testes unitários",
+ "ciSetup": "Setup CI"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "EM PROGRESSO",
+ "review": "REVISÃO",
+ "done": "PRONTO"
+ }
+ }
},
"download": {
"title": "Baixar",
"detected": "Detectado",
"systemRequirements": "Requisitos do sistema",
- "version": "Versão {version}"
+ "version": "Versão {version}",
+ "readyToStart": "Pronto para começar!"
},
"theme": {
"dark": "Escuro",
@@ -100,7 +142,10 @@
"sectionSubtitle": "Capturas reais do app — quadro kanban, revisão de código, equipes de agentes e mais."
},
"common": {
- "learnMore": "Saiba mais"
+ "learnMore": "Saiba mais",
+ "statusLabel": "Status:",
+ "previous": "Anterior",
+ "next": "Próximo"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "Estou esperando",
"links": {
"github": "GitHub",
+ "author": "Autor",
"docs": "Documentação"
}
},
diff --git a/landing/locales/ru.json b/landing/locales/ru.json
index 4cb982cc..05967f5c 100644
--- a/landing/locales/ru.json
+++ b/landing/locales/ru.json
@@ -7,7 +7,16 @@
"download": "Скачать",
"pricing": "Бесплатно",
"faq": "FAQ",
- "viewOnGithub": "GitHub"
+ "viewOnGithub": "GitHub",
+ "openMenu": "Открыть меню",
+ "closeMenu": "Закрыть меню",
+ "short": {
+ "screenshots": "Скрины",
+ "docs": "Док",
+ "download": "Скачать",
+ "comparison": "Сравн.",
+ "pricing": "Беспл."
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "Open Source"
},
"watchDemo": "Смотреть демо",
- "videoUnavailable": "Видео недоступно"
+ "videoUnavailable": "Видео недоступно",
+ "supportedProviders": "Поддерживаем AI-провайдеры",
+ "slogan": "Делайте много, почти ничего не делая",
+ "platformDefault": "Для вашей платформы",
+ "guidesSetup": "Гайды и настройка",
+ "videoFrameLabel": "Смотреть демо Agent Teams",
+ "commandFeed": "Командная лента",
+ "liveDemo": "Живое демо",
+ "demoVideoTitle": "Демо-видео Agent Teams",
+ "demoTitle": "Демо Agent Teams",
+ "demo": {
+ "ariaLabel": "Демо команды агентов",
+ "live": "LIVE",
+ "waiting": "Ожидание задач...",
+ "activity": {
+ "authMiddleware": "Реализация auth middleware...",
+ "unitTests": "Написание unit-тестов для API...",
+ "reviewPr": "Ревью изменений PR #42...",
+ "ciPipeline": "Настройка CI/CD pipeline...",
+ "refactorDatabase": "Рефакторинг слоя базы данных..."
+ },
+ "tasks": {
+ "authApi": "Auth API",
+ "unitTests": "Unit-тесты",
+ "ciSetup": "CI setup"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "В РАБОТЕ",
+ "review": "РЕВЬЮ",
+ "done": "ГОТОВО"
+ }
+ }
},
"download": {
"title": "Скачать",
"detected": "Определено",
"systemRequirements": "Системные требования",
- "version": "Версия {version}"
+ "version": "Версия {version}",
+ "readyToStart": "Готов начать!"
},
"theme": {
"dark": "Тёмная",
@@ -100,7 +142,10 @@
"sectionSubtitle": "Реальные скриншоты приложения — канбан-доска, код-ревью, команды агентов и многое другое."
},
"common": {
- "learnMore": "Подробнее"
+ "learnMore": "Подробнее",
+ "statusLabel": "Статус:",
+ "previous": "Предыдущий",
+ "next": "Следующий"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "Я жду",
"links": {
"github": "GitHub",
+ "author": "Автор",
"docs": "Документация"
}
},
diff --git a/landing/locales/ur.json b/landing/locales/ur.json
index d14425bf..90a5cc51 100644
--- a/landing/locales/ur.json
+++ b/landing/locales/ur.json
@@ -7,7 +7,16 @@
"download": "گر تے ہوئے",
"pricing": "مفت",
"faq": "FAQ",
- "viewOnGithub": "دیکھیں GitHub"
+ "viewOnGithub": "دیکھیں GitHub",
+ "openMenu": "مینو کھولیں",
+ "closeMenu": "مینو بند کریں",
+ "short": {
+ "screenshots": "تصاویر",
+ "docs": "Docs",
+ "download": "ڈاؤن لوڈ",
+ "comparison": "موازنہ",
+ "pricing": "مفت"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "کھولیں"
},
"watchDemo": "دیمو",
- "videoUnavailable": "ویڈیو غیر درج شدہ"
+ "videoUnavailable": "ویڈیو غیر درج شدہ",
+ "supportedProviders": "حمایت یافتہ AI providers",
+ "slogan": "بہت کم کام کر کے بہت کچھ کریں",
+ "platformDefault": "آپ کے platform کے لیے",
+ "guidesSetup": "Guides اور setup",
+ "videoFrameLabel": "Agent Teams demo دیکھیں",
+ "commandFeed": "Team command feed",
+ "liveDemo": "Live demo",
+ "demoVideoTitle": "Agent Teams demo video",
+ "demoTitle": "Agent Teams demo",
+ "demo": {
+ "ariaLabel": "Agent team demo",
+ "live": "LIVE",
+ "waiting": "Tasks کا انتظار...",
+ "activity": {
+ "authMiddleware": "Auth middleware implement ہو رہا ہے...",
+ "unitTests": "API کے لیے unit tests لکھے جا رہے ہیں...",
+ "reviewPr": "PR #42 changes review ہو رہے ہیں...",
+ "ciPipeline": "CI/CD pipeline setup ہو رہی ہے...",
+ "refactorDatabase": "Database layer refactor ہو رہی ہے..."
+ },
+ "tasks": {
+ "authApi": "Auth API",
+ "unitTests": "Unit tests",
+ "ciSetup": "CI setup"
+ },
+ "columns": {
+ "todo": "TODO",
+ "progress": "IN PROGRESS",
+ "review": "REVIEW",
+ "done": "DONE"
+ }
+ }
},
"download": {
"title": "گر تے ہوئے",
"detected": "غیر متصل",
"systemRequirements": "سسٹم تقاضوں",
- "version": "ورژن {version}"
+ "version": "ورژن {version}",
+ "readyToStart": "شروع کرنے کے لیے تیار!"
},
"theme": {
"dark": "اندھیرا",
@@ -100,7 +142,10 @@
"sectionSubtitle": "ایپ کی طرف سے حقیقی اسکرین — کابینہ بورڈ ، کوڈ جائزہ ، ایجنٹ ٹیموں اور زیادہ سے زیادہ"
},
"common": {
- "learnMore": "مزید سیکھیں"
+ "learnMore": "مزید سیکھیں",
+ "statusLabel": "اسٹیٹس:",
+ "previous": "پچھلا",
+ "next": "اگلا"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "میں انتظار کر رہا ہوں",
"links": {
"github": "GitHub",
+ "author": "مصنف",
"docs": "دستاویز"
}
},
diff --git a/landing/locales/zh.json b/landing/locales/zh.json
index 66cd073e..4c95f12b 100644
--- a/landing/locales/zh.json
+++ b/landing/locales/zh.json
@@ -7,7 +7,16 @@
"download": "下载",
"pricing": "免费",
"faq": "常见问题",
- "viewOnGithub": "View on GitHub"
+ "viewOnGithub": "View on GitHub",
+ "openMenu": "打开菜单",
+ "closeMenu": "关闭菜单",
+ "short": {
+ "screenshots": "截图",
+ "docs": "文档",
+ "download": "下载",
+ "comparison": "比较",
+ "pricing": "免费"
+ }
},
"hero": {
"badge": "Agent Teams",
@@ -22,13 +31,46 @@
"openSource": "开源"
},
"watchDemo": "观看演示",
- "videoUnavailable": "视频不可用"
+ "videoUnavailable": "视频不可用",
+ "supportedProviders": "支持的 AI 提供商",
+ "slogan": "用很少操作完成大量工作",
+ "platformDefault": "适用于你的平台",
+ "guidesSetup": "指南和设置",
+ "videoFrameLabel": "观看 Agent Teams 演示",
+ "commandFeed": "团队命令流",
+ "liveDemo": "实时演示",
+ "demoVideoTitle": "Agent Teams 演示视频",
+ "demoTitle": "Agent Teams 演示",
+ "demo": {
+ "ariaLabel": "代理团队演示",
+ "live": "LIVE",
+ "waiting": "等待任务...",
+ "activity": {
+ "authMiddleware": "正在实现身份验证中间件...",
+ "unitTests": "正在为 API 编写单元测试...",
+ "reviewPr": "正在审查 PR #42 更改...",
+ "ciPipeline": "正在设置 CI/CD 流水线...",
+ "refactorDatabase": "正在重构数据库层..."
+ },
+ "tasks": {
+ "authApi": "认证 API",
+ "unitTests": "单元测试",
+ "ciSetup": "CI 设置"
+ },
+ "columns": {
+ "todo": "待办",
+ "progress": "进行中",
+ "review": "审查",
+ "done": "完成"
+ }
+ }
},
"download": {
"title": "下载",
"detected": "已检测",
"systemRequirements": "系统要求",
- "version": "版本 {version}"
+ "version": "版本 {version}",
+ "readyToStart": "准备开始!"
},
"theme": {
"dark": "深色",
@@ -100,7 +142,10 @@
"sectionSubtitle": "应用的真实截图——看板、代码审查、智能体团队等等。"
},
"common": {
- "learnMore": "了解更多"
+ "learnMore": "了解更多",
+ "statusLabel": "状态:",
+ "previous": "上一个",
+ "next": "下一个"
},
"footer": {
"copyright": "© {year} Agent Teams",
@@ -108,6 +153,7 @@
"robotBubble": "我在等你",
"links": {
"github": "GitHub",
+ "author": "作者",
"docs": "文档"
}
},
diff --git a/src/features/agent-graph/renderer/adapters/TeamGraphAdapter.ts b/src/features/agent-graph/renderer/adapters/TeamGraphAdapter.ts
index ce88d46c..5b331b48 100644
--- a/src/features/agent-graph/renderer/adapters/TeamGraphAdapter.ts
+++ b/src/features/agent-graph/renderer/adapters/TeamGraphAdapter.ts
@@ -85,6 +85,10 @@ export interface TeamGraphData extends TeamViewSnapshot {
runtimeEntriesByMember?: Record
;
}
+export interface TeamGraphAdapterText {
+ hiddenBlockingLinks(count: number): string;
+}
+
function toGraphLaunchVisualState(
visualState: ReturnType['launchVisualState'] | undefined
): GraphNode['launchVisualState'] {
@@ -141,7 +145,8 @@ export class TeamGraphAdapter {
slotAssignments?: Record,
layoutMode: GraphLayoutMode = DEFAULT_TEAM_GRAPH_LAYOUT_MODE,
gridOwnerOrder?: readonly string[],
- activeTaskLogActivity?: Record
+ activeTaskLogActivity?: Record,
+ text?: TeamGraphAdapterText
): GraphDataPort {
if (teamData?.teamName !== teamName) {
return TeamGraphAdapter.#emptyResult(teamName);
@@ -227,7 +232,8 @@ export class TeamGraphAdapter {
memberNodeIdByAlias,
leadId,
leadName,
- activeTaskLogActivity
+ activeTaskLogActivity,
+ text
);
this.#buildProcessNodes(nodes, edges, teamData, teamName, memberNodeIdByAlias);
this.#attachActivityFeeds(nodes, teamData, teamName, leadId, leadName);
@@ -673,7 +679,8 @@ export class TeamGraphAdapter {
memberNodeIdByAlias?: ReadonlyMap,
leadId?: string,
leadName?: string,
- activeTaskLogActivity?: Record
+ activeTaskLogActivity?: Record,
+ text?: TeamGraphAdapterText
): void {
const taskStateById = new Map<
string,
@@ -869,9 +876,10 @@ export class TeamGraphAdapter {
sourceTaskIds: Array.from(edge.sourceTaskIds),
targetTaskIds: Array.from(edge.targetTaskIds),
label:
- edge.aggregateCount > 1 &&
- (edge.source.includes(':overflow:') || edge.target.includes(':overflow:'))
- ? `${edge.aggregateCount} hidden blocking links`
+ edge.aggregateCount > 1 &&
+ (edge.source.includes(':overflow:') || edge.target.includes(':overflow:'))
+ ? (text?.hiddenBlockingLinks(edge.aggregateCount) ??
+ `${edge.aggregateCount} hidden blocking links`)
: undefined,
}))
);
diff --git a/src/features/agent-graph/renderer/hooks/useTeamGraphAdapter.ts b/src/features/agent-graph/renderer/hooks/useTeamGraphAdapter.ts
index 5299417f..e0ccc949 100644
--- a/src/features/agent-graph/renderer/hooks/useTeamGraphAdapter.ts
+++ b/src/features/agent-graph/renderer/hooks/useTeamGraphAdapter.ts
@@ -5,6 +5,7 @@
import { useLayoutEffect, useMemo, useRef, useSyncExternalStore } from 'react';
+import { useAppTranslation } from '@features/localization/renderer';
import { useTeamAgentRuntimeWatcher } from '@renderer/components/team/useTeamAgentRuntimeWatcher';
import { getSnapshot, subscribe } from '@renderer/services/commentReadStorage';
import { useStore } from '@renderer/store';
@@ -65,9 +66,17 @@ export function useTeamGraphAdapter(
options?: UseTeamGraphAdapterOptions
): GraphDataPort {
const isActive = options?.active ?? true;
+ const { t } = useAppTranslation('team');
const adapterRef = useRef(TeamGraphAdapter.create());
const inactiveGraphData = useMemo(() => emptyGraphData(teamName), [teamName]);
const lastActiveGraphDataRef = useRef(inactiveGraphData);
+ const adapterText = useMemo(
+ () => ({
+ hiddenBlockingLinks: (count: number) =>
+ t('agentGraph.blockingEdge.hiddenBlockingLinks', { count }),
+ }),
+ [t]
+ );
const {
teamSnapshot,
@@ -216,7 +225,8 @@ export function useTeamGraphAdapter(
effectiveSlotAssignments,
graphLayoutMode ?? DEFAULT_TEAM_GRAPH_LAYOUT_MODE,
gridOwnerOrder,
- activeTaskLogActivity
+ activeTaskLogActivity,
+ adapterText
);
}, [
isActive,
@@ -236,6 +246,7 @@ export function useTeamGraphAdapter(
graphLayoutMode,
gridOwnerOrder,
activeTaskLogActivity,
+ adapterText,
]);
useLayoutEffect(() => {
diff --git a/src/features/agent-graph/renderer/ui/GraphBlockingEdgePopover.tsx b/src/features/agent-graph/renderer/ui/GraphBlockingEdgePopover.tsx
index 27db9063..674db64d 100644
--- a/src/features/agent-graph/renderer/ui/GraphBlockingEdgePopover.tsx
+++ b/src/features/agent-graph/renderer/ui/GraphBlockingEdgePopover.tsx
@@ -21,26 +21,47 @@ function isOverflowNode(
return Boolean(node?.kind === 'task' && node.isOverflowStack);
}
-function describeNode(node: GraphNode | undefined, fallback: string): string {
+interface BlockingEdgeLabels {
+ hiddenTaskStack: string;
+ hiddenTasks: (count: number) => string;
+ task: string;
+ openBlockerStack: string;
+ openBlockedStack: string;
+ openBlockerTask: string;
+ openBlockedTask: string;
+}
+
+function describeNode(
+ node: GraphNode | undefined,
+ fallback: string,
+ labels: Pick
+): string {
if (!node) return fallback;
if (isOverflowNode(node)) {
return node.overflowCount && node.overflowCount > 1
- ? `${node.overflowCount} hidden tasks`
- : 'Hidden task stack';
+ ? labels.hiddenTasks(node.overflowCount)
+ : labels.hiddenTaskStack;
}
if (isTaskNode(node)) {
- return `${node.displayId ?? node.label} - ${node.sublabel ?? 'Task'}`;
+ return `${node.displayId ?? node.label} - ${node.sublabel ?? labels.task}`;
}
return node.label;
}
-function getActionLabel(node: GraphNode | undefined, role: 'blocker' | 'blocked'): string | null {
+function getActionLabel(
+ node: GraphNode | undefined,
+ role: 'blocker' | 'blocked',
+ labels: Pick<
+ BlockingEdgeLabels,
+ 'openBlockerStack' | 'openBlockedStack' | 'openBlockerTask' | 'openBlockedTask'
+ >
+): string | null {
if (!node) return null;
if (isOverflowNode(node)) {
- return role === 'blocker' ? 'Open blocker stack' : 'Open blocked stack';
+ return role === 'blocker' ? labels.openBlockerStack : labels.openBlockedStack;
}
if (isTaskNode(node)) {
- return role === 'blocker' ? 'Open blocker task' : 'Open blocked task';
+ return role === 'blocker' ? labels.openBlockerTask : labels.openBlockedTask;
}
return null;
}
@@ -71,10 +92,19 @@ export const GraphBlockingEdgePopover = ({
[teamData?.tasks]
);
const relationCount = edge.aggregateCount ?? 1;
- const sourceLabel = describeNode(sourceNode, edge.source);
- const targetLabel = describeNode(targetNode, edge.target);
- const sourceActionLabel = getActionLabel(sourceNode, 'blocker');
- const targetActionLabel = getActionLabel(targetNode, 'blocked');
+ const labels: BlockingEdgeLabels = {
+ hiddenTaskStack: t('agentGraph.blockingEdge.hiddenTaskStack'),
+ hiddenTasks: (count) => t('agentGraph.blockingEdge.hiddenTasks', { count }),
+ task: t('agentGraph.blockingEdge.task'),
+ openBlockerStack: t('agentGraph.blockingEdge.openBlockerStack'),
+ openBlockedStack: t('agentGraph.blockingEdge.openBlockedStack'),
+ openBlockerTask: t('agentGraph.blockingEdge.openBlockerTask'),
+ openBlockedTask: t('agentGraph.blockingEdge.openBlockedTask'),
+ };
+ const sourceLabel = describeNode(sourceNode, edge.source, labels);
+ const targetLabel = describeNode(targetNode, edge.target, labels);
+ const sourceActionLabel = getActionLabel(sourceNode, 'blocker', labels);
+ const targetActionLabel = getActionLabel(targetNode, 'blocked', labels);
const sourceHiddenTasks = resolveEdgeTaskPreview(sourceNode, edge.sourceTaskIds, tasksById);
const targetHiddenTasks = resolveEdgeTaskPreview(targetNode, edge.targetTaskIds, tasksById);
@@ -111,7 +141,7 @@ export const GraphBlockingEdgePopover = ({
variant="outline"
className="border-red-500/30 px-1.5 py-0 text-[10px] text-red-300"
>
- {relationCount} links
+ {t('agentGraph.blockingEdge.links', { count: relationCount })}
)}
diff --git a/src/features/agent-graph/renderer/ui/GraphMemberLogPreviewHud.tsx b/src/features/agent-graph/renderer/ui/GraphMemberLogPreviewHud.tsx
index 51e32def..808caffe 100644
--- a/src/features/agent-graph/renderer/ui/GraphMemberLogPreviewHud.tsx
+++ b/src/features/agent-graph/renderer/ui/GraphMemberLogPreviewHud.tsx
@@ -132,7 +132,14 @@ function hasOpenCodeEmptyStateWarning(preview: MemberLogPreviewMember | undefine
function resolveEmptyText(
preview: MemberLogPreviewMember | undefined,
loading: boolean,
- error: string | null
+ error: string | null,
+ labels: {
+ unsupportedProvider: string;
+ openCodeLogsDelayed: string;
+ logsUnavailable: string;
+ loadingLogs: string;
+ noRecentLogs: string;
+ }
): string {
const hasCodexUnsupportedWarning = preview?.warnings.some(
(warning) => warning.code === 'codex_member_wide_not_supported'
@@ -142,34 +149,47 @@ function resolveEmptyText(
(preview?.coverage.length ?? 0) > 0 &&
preview?.coverage.every((coverage) => coverage.provider === 'codex_native_trace');
if (hasOnlyCodexUnsupportedCoverage) {
- return 'Unsupported provider';
+ return labels.unsupportedProvider;
}
if ((preview?.items.length ?? 0) === 0 && hasOpenCodeDeliveryDelayedWarning(preview)) {
- return 'OpenCode logs delayed';
+ return labels.openCodeLogsDelayed;
}
if ((preview?.items.length ?? 0) === 0 && hasOpenCodeRuntimeWarning(preview)) {
- return 'Logs unavailable';
+ return labels.logsUnavailable;
}
- if (loading && !preview) return 'Loading logs';
- if (error && !preview) return 'Logs unavailable';
- return 'No recent logs';
+ if (loading && !preview) return labels.loadingLogs;
+ if (error && !preview) return labels.logsUnavailable;
+ return labels.noRecentLogs;
}
-function fallbackDisplayTitle(item: MemberLogPreviewItem): string {
+function fallbackDisplayTitle(
+ item: MemberLogPreviewItem,
+ labels: {
+ toolError: string;
+ toolResult: string;
+ toolUse: string;
+ thinking: string;
+ error: string;
+ logEvent: string;
+ }
+): string {
if (item.kind === 'tool_result') {
- return item.tone === 'error' ? 'Tool error' : 'Tool result';
+ return item.tone === 'error' ? labels.toolError : labels.toolResult;
}
if (item.kind === 'tool_use') {
- return item.toolName?.trim() || 'Tool use';
+ return item.toolName?.trim() || labels.toolUse;
}
if (item.kind === 'thinking') {
- return 'Thinking';
+ return labels.thinking;
}
- return item.tone === 'error' ? 'Error' : 'Log event';
+ return item.tone === 'error' ? labels.error : labels.logEvent;
}
-function compactDisplayTitle(item: MemberLogPreviewItem): string {
- const title = item.title.trim() || fallbackDisplayTitle(item);
+function compactDisplayTitle(
+ item: MemberLogPreviewItem,
+ labels: Parameters
[1]
+): string {
+ const title = item.title.trim() || fallbackDisplayTitle(item, labels);
if (title.toLowerCase() === 'tool result') {
return title;
}
@@ -205,7 +225,13 @@ function trimRepeatedTitlePrefix(preview: string, title: string): string {
function compactPreviewText(
item: MemberLogPreviewItem,
displayTitle: string,
- rawDisplayTitle = displayTitle
+ rawDisplayTitle = displayTitle,
+ labels: {
+ noErrorOutput: string;
+ noOutput: string;
+ noInput: string;
+ logEvent: string;
+ }
): string {
const preview = item.preview?.trim();
if (preview) {
@@ -217,12 +243,12 @@ function compactPreviewText(
return compact || preview;
}
if (item.kind === 'tool_result') {
- return item.tone === 'error' ? 'No error output' : 'No output';
+ return item.tone === 'error' ? labels.noErrorOutput : labels.noOutput;
}
if (item.kind === 'tool_use') {
- return 'No input';
+ return labels.noInput;
}
- return item.sourceLabel || 'Log event';
+ return item.sourceLabel || labels.logEvent;
}
function truncateCompactRowPreview(
@@ -281,6 +307,25 @@ export const GraphMemberLogPreviewHud = ({
onOpenMemberProfile,
}: GraphMemberLogPreviewHudProps): React.JSX.Element | null => {
const { t } = useAppTranslation('team');
+ const logPreviewLabels = useMemo(
+ () => ({
+ unsupportedProvider: t('agentGraph.logPreview.unsupportedProvider'),
+ openCodeLogsDelayed: t('agentGraph.logPreview.openCodeLogsDelayed'),
+ logsUnavailable: t('agentGraph.logPreview.logsUnavailable'),
+ loadingLogs: t('agentGraph.logPreview.loading'),
+ noRecentLogs: t('agentGraph.logPreview.noRecentLogs'),
+ toolError: t('agentGraph.logPreview.toolError'),
+ toolResult: t('agentGraph.logPreview.toolResult'),
+ toolUse: t('agentGraph.logPreview.toolUse'),
+ thinking: t('agentGraph.logPreview.thinking'),
+ error: t('agentGraph.logPreview.error'),
+ logEvent: t('agentGraph.logPreview.logEvent'),
+ noErrorOutput: t('agentGraph.logPreview.noErrorOutput'),
+ noOutput: t('agentGraph.logPreview.noOutput'),
+ noInput: t('agentGraph.logPreview.noInput'),
+ }),
+ [t]
+ );
const worldLayerRef = useRef(null);
const shellRefs = useRef(new Map());
const visibleKeyRef = useRef('');
@@ -514,9 +559,14 @@ export const GraphMemberLogPreviewHud = ({
const renderItem = useCallback(
(memberName: string, item: MemberLogPreviewItem) => {
const relativeTime = formatRelativeTime(item.timestamp);
- const rawDisplayTitle = compactDisplayTitle(item);
+ const rawDisplayTitle = compactDisplayTitle(item, logPreviewLabels);
const displayTitle = truncateCompactTitle(rawDisplayTitle);
- const fullPreviewText = compactPreviewText(item, displayTitle, rawDisplayTitle);
+ const fullPreviewText = compactPreviewText(
+ item,
+ displayTitle,
+ rawDisplayTitle,
+ logPreviewLabels
+ );
const previewText = truncateCompactRowPreview(fullPreviewText, displayTitle, relativeTime);
const titleText = compactRowLabel([rawDisplayTitle, relativeTime, fullPreviewText]);
const isHighlighted = highlightedItemIds.has(buildRenderedItemKey(memberName, item.id));
@@ -565,7 +615,7 @@ export const GraphMemberLogPreviewHud = ({
);
},
- [highlightedItemIds, openLogs]
+ [highlightedItemIds, logPreviewLabels, openLogs]
);
if (!enabled || ownerNodes.length === 0) {
@@ -631,7 +681,7 @@ export const GraphMemberLogPreviewHud = ({
className={`${INTERACTIVE_LOG_CONTROL_CLASS} flex h-[72px] min-h-[72px] items-center rounded-md border border-dashed border-white/10 bg-[rgba(8,14,28,0.28)] px-3 text-left text-[11px] text-slate-400/60`}
onClick={() => openLogs(memberName)}
>
- {resolveEmptyText(preview, loading, error)}
+ {resolveEmptyText(preview, loading, error, logPreviewLabels)}
)}
{preview && preview.overflowCount > 0 ? (
diff --git a/src/features/localization/renderer/locales/ar/extensions.json b/src/features/localization/renderer/locales/ar/extensions.json
index 3a1a60fd..698984b7 100644
--- a/src/features/localization/renderer/locales/ar/extensions.json
+++ b/src/features/localization/renderer/locales/ar/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "مضافا إليها API المفتاح",
"addFirst": "أضف مفتاحك الأول",
- "edit": "Edit"
+ "edit": "Edit",
+ "copied": "تم النسخ!",
+ "copyEnvVarName": "نسخ اسم متغير env",
+ "confirmDelete": "انقر مرة أخرى للتأكيد",
+ "delete": "حذف"
},
"empty": {
"title": "لا API المفاتيح الموفرة",
diff --git a/src/features/localization/renderer/locales/ar/settings.json b/src/features/localization/renderer/locales/ar/settings.json
index 6e03c7ec..1f515d2f 100644
--- a/src/features/localization/renderer/locales/ar/settings.json
+++ b/src/features/localization/renderer/locales/ar/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "Copied",
"copy": "تشخيص النسخ",
"hints": "Hints",
- "likelyCause": "السبب الغالب:"
+ "likelyCause": "السبب الغالب:",
+ "windowsSymlinkAdminHint": "Windows: شغّل Agent Teams AI كمسؤول"
},
"models": {
"alreadyDefault": "هذا هو التخلف المختار من قبل",
@@ -64,7 +65,15 @@
"searchPlaceholder": "نماذج البحث",
"selectProjectBeforeTesting": "اختيار سياق المشروع قبل نماذج الاختبار.",
"selectProjectBeforeTestingDefaults": "Select a project context before testing orving OpenCode defaults.",
- "useInTeamPicker": "الاستخدام في مشغل الفريق"
+ "useInTeamPicker": "الاستخدام في مشغل الفريق",
+ "testInProgress": "اختبار النموذج قيد التشغيل بالفعل.",
+ "validationContextRequired": "حدد سياق تحقق أعلاه لتفعيل Test و Set default. الحفظ في team picker يخزن route للفرق الجديدة فقط.",
+ "defaultSaveInProgress": "يتم حفظ OpenCode default.",
+ "routeUnavailableAuth": "يتطلب هذا provider مصادقة قبل استخدام هذا النموذج.",
+ "routeUnavailableFailed": "فشل هذا model route في آخر execution test.",
+ "routeUnavailableUnknown": "هذا النموذج هو OpenCode default الحالي، لكنه غير متاح بعد في live catalog.",
+ "actionsUnavailable": "الإجراءات غير متاحة مؤقتًا.",
+ "routeUnavailableGeneric": "لا يمكن استخدام هذا model route الآن."
},
"providers": {
"catalog": "مُقدِّم الخدمات المفتوحة",
@@ -108,7 +117,8 @@
"needsTest": "اختبار الاحتياجات",
"failed": "فشل",
"unknown": "مجهول",
- "default": "العجز"
+ "default": "العجز",
+ "knownRoute": "route معروف"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API تم تشكيل المفتاح ولكن لم يتم التحقق منه بعد",
"apiKeyModeMissingCredential": "API الطريقة الرئيسية المختارة، ولكن لا API مفتاح تم تشكيله",
"connectedVia": "Connected via {{method}}",
- "unableToVerify": "غير قادر على التحقق"
+ "unableToVerify": "غير قادر على التحقق",
+ "modelsAvailable": "النماذج متاحة"
},
"mode": {
"selectedAuth": "Selected auth: {{authMode}}",
diff --git a/src/features/localization/renderer/locales/ar/team.json b/src/features/localization/renderer/locales/ar/team.json
index df6bc31c..c0d9b113 100644
--- a/src/features/localization/renderer/locales/ar/team.json
+++ b/src/features/localization/renderer/locales/ar/team.json
@@ -28,7 +28,9 @@
"session": "الدورة",
"stallNudge": "كشك",
"start": "البدء",
- "workSync": "تزامن العمل"
+ "workSync": "تزامن العمل",
+ "agentError": "خطأ الوكيل",
+ "apiError": "خطأ API"
},
"bootstrap": {
"acknowledged": "بوتستراب اعترف",
@@ -77,7 +79,11 @@
"action": "الرد"
},
"activeTasks": {
- "inProgress": "قيد التنفيذ"
+ "inProgress": "قيد التنفيذ",
+ "expandInProgress": "توسيع قيد التنفيذ",
+ "collapseInProgress": "طي قيد التنفيذ",
+ "reviewing": "يراجع",
+ "workingOn": "يعمل على"
},
"expandDialog": {
"description": "رؤية موسعة للرسالة"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "ستظهر بيانات الفريق بمجرد الانتهاء من توفيرها",
"context": {
- "title": "السياق"
+ "title": "السياق",
+ "loading": "جار التحميل...",
+ "noSessionLoaded": "لم يتم تحميل أي جلسة",
+ "closePanel": "إغلاق لوحة سياق {{team}}",
+ "loadingContext": "جار تحميل السياق...",
+ "openLeadSession": "افتح جلسة قائد الفريق لعرض السياق."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "لا توجد مصادر للسجلات",
"ariaLabel": "المصدر",
"leadLabel": "الرصاص",
- "selectSourceEmpty": "اختيار مصدر سجل."
+ "selectSourceEmpty": "اختيار مصدر سجل.",
+ "leadDescription": "قائد الفريق",
+ "removedLabel": "تمت الإزالة",
+ "removedDescription": "تمت الإزالة"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} أكثر",
"more_other": "+{{count}} أكثر",
"more_few": "+{{count}} أكثر",
- "more_many": "+{{count}} أكثر"
+ "more_many": "+{{count}} أكثر",
+ "unsupportedProvider": "المزود غير مدعوم",
+ "openCodeLogsDelayed": "سجلات OpenCode متأخرة",
+ "logsUnavailable": "السجلات غير متاحة",
+ "noRecentLogs": "لا توجد سجلات حديثة",
+ "toolError": "خطأ الأداة",
+ "toolResult": "نتيجة الأداة",
+ "toolUse": "استخدام الأداة",
+ "thinking": "تفكير",
+ "error": "خطأ",
+ "logEvent": "حدث سجل",
+ "noErrorOutput": "لا يوجد خرج خطأ",
+ "noOutput": "لا يوجد خرج",
+ "noInput": "لا يوجد إدخال"
},
"blockingEdge": {
"title": "الإعالة",
"blocks": "اللبنات",
"close": "اقترب",
"blockingHiddenTasks": "حجب المهام الخفية",
- "blockedHiddenTasks": "مهام خفية مقفلة"
+ "blockedHiddenTasks": "مهام خفية مقفلة",
+ "links_one": "{{count}} رابط",
+ "links_other": "{{count}} روابط",
+ "hiddenBlockingLinks_one": "{{count}} رابط حظر مخفي",
+ "hiddenBlockingLinks_other": "{{count}} روابط حظر مخفية",
+ "hiddenTaskStack": "مجموعة مهام مخفية",
+ "hiddenTasks_one": "{{count}} مهمة مخفية",
+ "hiddenTasks_other": "{{count}} مهام مخفية",
+ "task": "مهمة",
+ "openBlockerStack": "فتح مجموعة المهام الحاجزة",
+ "openBlockedStack": "فتح مجموعة المهام المحجوبة",
+ "openBlockerTask": "فتح المهمة الحاجزة",
+ "openBlockedTask": "فتح المهمة المحجوبة"
},
"activityHud": {
"activity": "النشاط",
@@ -1778,7 +1817,11 @@
"autoRefresh": "تطهير السيارات",
"wrapLines": "خطوط الغضب",
"loadingTail": "عملية تحديد الموقع",
- "empty": "لم يتم القبض على ملف سجل العمليات لهذا العضو بعد"
+ "empty": "لم يتم القبض على ملف سجل العمليات لهذا العضو بعد",
+ "copy": "نسخ",
+ "fileEmpty": "ملف سجل العملية فارغ.",
+ "showingLast": "عرض آخر {{bytes}}.",
+ "showing": "عرض {{bytes}}."
},
"tasks": {
"empty": "No tasks assigned to this member"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "اثبت او اعيد تشغيل الكود المفتوح من بطاقة مركز المزود ثم اعيد فتح هذا الرقم",
"openCodeAppMcpUnreachable": "البدء من جديد لتنشيط طلب الموافقة المفتوحة MCP الجسر إذا كرر، إعادة تشغيل التطبيق وفتح الوقت.",
"cliBinaryMissing": "تأكد من كلود المحلي CLI وجود ثنائي ويمكن البدء به، ثم إعادة فتح هذا الهاتف.",
- "default": "حل المسألة أعلاه، ثم إعادة فتح هذا الهاتف."
+ "default": "حل المسألة أعلاه، ثم إعادة فتح هذا الهاتف.",
+ "openCodeNodeModulesSymlinkPermission": "شغّل Agent Teams AI كمسؤول، ثم أعد محاولة launch."
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "الأفرقة العاملة"
+ "title": "الأفرقة العاملة",
+ "status": {
+ "active": "نشط",
+ "provisioning": "قيد التشغيل",
+ "idle": "يعمل"
+ },
+ "noProject": "بدون مشروع"
},
"layout": {
"maxPanesReached": "الحد الأقصى {{count}} لقد وصلت"
},
"codexReconnect": {
"description": "جلسة كودوكس تبدو ثابتة أعيد الاتصال",
- "useCode": "رمز الاستخدام"
+ "useCode": "رمز الاستخدام",
+ "generating": "جار الإنشاء...",
+ "openLogin": "فتح تسجيل الدخول",
+ "generateLink": "إنشاء رابط"
},
"effortLevel": {
"label": "مستوى الإنفاق (اختياري)",
@@ -2428,6 +2481,7 @@
"customRole": "دور الجمارك...",
"searchPlaceholder": "أدوار البحث...",
"empty": "لا توجد أدوار",
- "reservedRole": "هذا الدور محجوز"
+ "reservedRole": "هذا الدور محجوز",
+ "emptyCustomRole": "لا يمكن أن يكون الدور فارغا"
}
}
diff --git a/src/features/localization/renderer/locales/bn/extensions.json b/src/features/localization/renderer/locales/bn/extensions.json
index 38efb009..f972892a 100644
--- a/src/features/localization/renderer/locales/bn/extensions.json
+++ b/src/features/localization/renderer/locales/bn/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "যোগ করুন API কি",
"addFirst": "প্রথমে কি যোগ করুন",
- "edit": "সম্পাদনা"
+ "edit": "সম্পাদনা",
+ "copied": "কপি হয়েছে!",
+ "copyEnvVarName": "Env var name copy করুন",
+ "confirmDelete": "Confirm করতে আবার ক্লিক করুন",
+ "delete": "Delete"
},
"empty": {
"title": "না API সংরক্ষিত কি",
diff --git a/src/features/localization/renderer/locales/bn/settings.json b/src/features/localization/renderer/locales/bn/settings.json
index fc69d9b3..442572c8 100644
--- a/src/features/localization/renderer/locales/bn/settings.json
+++ b/src/features/localization/renderer/locales/bn/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "প্রতিলিপি",
"copy": "ডায়গনিস্টিক কপি করুন",
"hints": "ইঙ্গিত",
- "likelyCause": "হতে পারে:"
+ "likelyCause": "হতে পারে:",
+ "windowsSymlinkAdminHint": "Windows: Agent Teams AI অ্যাডমিনিস্ট্রেটর হিসেবে চালান"
},
"models": {
"alreadyDefault": "বর্তমানে নির্বাচিত ডিফল্ট মান ।",
@@ -64,7 +65,15 @@
"searchPlaceholder": "অনুসন্ধানের মডেল",
"selectProjectBeforeTesting": "মডেল পরীক্ষার পূর্বে একটি প্রজেক্ট প্রসঙ্গ নির্বাচন করুন।",
"selectProjectBeforeTestingDefaults": "পরীক্ষা অথবা সংরক্ষণ করার পূর্বে একটি প্রজেক্ট প্রসঙ্গ নির্বাচন করুন ।",
- "useInTeamPicker": "গ্রুপ বাছাইকারী ব্যবহার করো"
+ "useInTeamPicker": "গ্রুপ বাছাইকারী ব্যবহার করো",
+ "testInProgress": "মডেল পরীক্ষা ইতিমধ্যেই চলছে।",
+ "validationContextRequired": "Test এবং Set default চালু করতে উপরে একটি validation context নির্বাচন করুন। team picker-এ সংরক্ষণ করলে শুধু নতুন দলের জন্য route রাখা হয়।",
+ "defaultSaveInProgress": "OpenCode default সংরক্ষণ করা হচ্ছে।",
+ "routeUnavailableAuth": "এই মডেল ব্যবহারের আগে এই provider-এর authentication দরকার।",
+ "routeUnavailableFailed": "এই model route শেষ execution test-এ ব্যর্থ হয়েছে।",
+ "routeUnavailableUnknown": "এই মডেলটি বর্তমান OpenCode default, কিন্তু এখনও live catalog-এ নেই।",
+ "actionsUnavailable": "অ্যাকশনগুলো সাময়িকভাবে পাওয়া যাচ্ছে না।",
+ "routeUnavailableGeneric": "এই model route এখন ব্যবহার করা যাবে না।"
},
"providers": {
"catalog": "OpenCode উপলব্ধকারী ক্যাটালগ",
@@ -108,7 +117,8 @@
"needsTest": "একটি পরীক্ষা প্রয়োজন",
"failed": "বিফল",
"unknown": "অজানা",
- "default": "ডিফল্ট"
+ "default": "ডিফল্ট",
+ "knownRoute": "পরিচিত route"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API কি ইম্পোর্ট করা হয়নি কিন্তু যাচাই করা হয়নি",
"apiKeyModeMissingCredential": "API চাবি নির্বাচন করা হয়েছে, কিন্তু কিছুই নির্বাচিত নয় API কি কনফিগার করা হয়েছে",
"connectedVia": "পরিচিতির সাথে সংযোগ করা হয়েছে {{method}}",
- "unableToVerify": "যাচাই করতে ব্যর্থ"
+ "unableToVerify": "যাচাই করতে ব্যর্থ",
+ "modelsAvailable": "মডেল উপলব্ধ"
},
"mode": {
"selectedAuth": "নির্বাচিত অনুমোদন {{authMode}}",
diff --git a/src/features/localization/renderer/locales/bn/team.json b/src/features/localization/renderer/locales/bn/team.json
index 0e559446..6473fac7 100644
--- a/src/features/localization/renderer/locales/bn/team.json
+++ b/src/features/localization/renderer/locales/bn/team.json
@@ -28,7 +28,9 @@
"session": "সেশান",
"stallNudge": "স্থগিত রাখো",
"start": "আরম্ভ",
- "workSync": "সুসংগতি কর্ম"
+ "workSync": "সুসংগতি কর্ম",
+ "agentError": "Agent Error",
+ "apiError": "API Error"
},
"bootstrap": {
"acknowledged": "বুটস্ট্র্যাপ স্বীকার করেছে",
@@ -77,7 +79,11 @@
"action": "প্রত্যুত্তর"
},
"activeTasks": {
- "inProgress": "চলছে"
+ "inProgress": "চলছে",
+ "expandInProgress": "In progress খুলুন",
+ "collapseInProgress": "In progress বন্ধ করুন",
+ "reviewing": "review করছে",
+ "workingOn": "কাজ করছে"
},
"expandDialog": {
"description": "তালিকা"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "দলের তথ্য একযোগে উপলব্ধ করা হবে",
"context": {
- "title": "কনটেক্সট"
+ "title": "কনটেক্সট",
+ "loading": "লোড হচ্ছে...",
+ "noSessionLoaded": "Session loaded নয়",
+ "closePanel": "{{team}} context panel বন্ধ করুন",
+ "loadingContext": "Context লোড হচ্ছে...",
+ "openLeadSession": "Context দেখতে team lead session খুলুন."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "কোনো লগ পাওয়া যায়নি।",
"ariaLabel": "উৎসের উৎস",
"leadLabel": "লিড",
- "selectSourceEmpty": "একটি লগ উৎস নির্বাচন করুন।"
+ "selectSourceEmpty": "একটি লগ উৎস নির্বাচন করুন।",
+ "leadDescription": "Team Lead",
+ "removedLabel": "সরানো হয়েছে",
+ "removedDescription": "সরানো হয়েছে"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} আরও",
"more_other": "+{{count}} আরও",
"more_few": "+{{count}} আরও",
- "more_many": "+{{count}} আরও"
+ "more_many": "+{{count}} আরও",
+ "unsupportedProvider": "Provider সমর্থিত নয়",
+ "openCodeLogsDelayed": "OpenCode logs বিলম্বিত",
+ "logsUnavailable": "Logs উপলভ্য নয়",
+ "noRecentLogs": "সাম্প্রতিক logs নেই",
+ "toolError": "Tool error",
+ "toolResult": "Tool result",
+ "toolUse": "Tool use",
+ "thinking": "Thinking",
+ "error": "Error",
+ "logEvent": "Log event",
+ "noErrorOutput": "কোনো error output নেই",
+ "noOutput": "কোনো output নেই",
+ "noInput": "কোনো input নেই"
},
"blockingEdge": {
"title": "নির্ভরতা ব্লক করা হচ্ছে",
"blocks": "ব্লক",
"close": "বন্ধ",
"blockingHiddenTasks": "আড়াল করা কাজ বন্ধ করা হচ্ছে",
- "blockedHiddenTasks": "আড়াল করা কাজ আড়াল করা হয়েছে"
+ "blockedHiddenTasks": "আড়াল করা কাজ আড়াল করা হয়েছে",
+ "links_one": "{{count}} লিংক",
+ "links_other": "{{count}} লিংক",
+ "hiddenBlockingLinks_one": "{{count}} লুকানো blocking link",
+ "hiddenBlockingLinks_other": "{{count}} লুকানো blocking links",
+ "hiddenTaskStack": "লুকানো কাজের stack",
+ "hiddenTasks_one": "{{count}} লুকানো কাজ",
+ "hiddenTasks_other": "{{count}} লুকানো কাজ",
+ "task": "কাজ",
+ "openBlockerStack": "Blocker stack খুলুন",
+ "openBlockedStack": "Blocked stack খুলুন",
+ "openBlockerTask": "Blocker task খুলুন",
+ "openBlockedTask": "Blocked task খুলুন"
},
"activityHud": {
"activity": "কর্ম",
@@ -1778,7 +1817,11 @@
"autoRefresh": "নতুন করেত প্রদর্শন ( r)",
"wrapLines": "লাইন গুটানো",
"loadingTail": "প্রসেসটি লগ- ইন করা হচ্ছে...",
- "empty": "এই সদস্য জন্য কোনো প্রসেস লগ ফাইল পাওয়া যায়নি।"
+ "empty": "এই সদস্য জন্য কোনো প্রসেস লগ ফাইল পাওয়া যায়নি।",
+ "copy": "Copy",
+ "fileEmpty": "Process log file খালি.",
+ "showingLast": "শেষ {{bytes}} দেখানো হচ্ছে.",
+ "showing": "{{bytes}} দেখানো হচ্ছে."
},
"tasks": {
"empty": "এই সদস্যে কোনো কাজ নির্ধারিত হয়নি"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "পরিসেবা উপলব্ধকারীর অবস্থা থেকে আরম্ভ করে এই ডায়লগ পুনরায় আরম্ভ করুন।",
"openCodeAppMcpUnreachable": "OpenChod অ্যাপ্লিকেশন পুনরায় চালু করতে পুনরায় চেষ্টা করুন MCP ব্রিজ. যদি এটা আবার হয়, তাহলে অ্যাপ্লিকেশন পুনরায় চালু করুন এবং ওপেনোডে ধারণ করুন।",
"cliBinaryMissing": "স্থানীয় Klalou নিশ্চিত করুন CLI বাইনারি উপস্থিত রয়েছে এবং এটি পুনরায় আরম্ভ করা যাবে।",
- "default": "উপরে ব্যাপারটা সমাধান করো, তারপর এই সংলাপ খুলে দাও।"
+ "default": "উপরে ব্যাপারটা সমাধান করো, তারপর এই সংলাপ খুলে দাও।",
+ "openCodeNodeModulesSymlinkPermission": "Agent Teams AI অ্যাডমিনিস্ট্রেটর হিসেবে চালান, তারপর launch আবার চেষ্টা করুন।"
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "চলছে"
+ "title": "চলছে",
+ "status": {
+ "active": "সক্রিয়",
+ "provisioning": "শুরু হচ্ছে",
+ "idle": "চলছে"
+ },
+ "noProject": "কোনো project নেই"
},
"layout": {
"maxPanesReached": "সর্বোচ্চ মান {{count}} পার্শ্ববর্তী পেইন"
},
"codexReconnect": {
"description": "আপনার কোডেক্স সেশনটা খুব পুরনো মনে হচ্ছে. পুনরায় চালু করা।",
- "useCode": "কোড ব্যবহার করো"
+ "useCode": "কোড ব্যবহার করো",
+ "generating": "তৈরি হচ্ছে...",
+ "openLogin": "Login খুলুন",
+ "generateLink": "Link তৈরি করুন"
},
"effortLevel": {
"label": "প্রচেষ্টা",
@@ -2428,6 +2481,7 @@
"customRole": "স্বনির্ধারিত ভূমিকা...",
"searchPlaceholder": "ভূমিকা অনুসন্ধান করুন...",
"empty": "কোনো ভূমিকা পাওয়া যায়নি।",
- "reservedRole": "এই ভূমিকা সংরক্ষিত রয়েছে"
+ "reservedRole": "এই ভূমিকা সংরক্ষিত রয়েছে",
+ "emptyCustomRole": "Role খালি হতে পারে না"
}
}
diff --git a/src/features/localization/renderer/locales/de/extensions.json b/src/features/localization/renderer/locales/de/extensions.json
index 21aef2b7..ced2e786 100644
--- a/src/features/localization/renderer/locales/de/extensions.json
+++ b/src/features/localization/renderer/locales/de/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "Hinzufügen API Schlüssel",
"addFirst": "Fügen Sie Ihren ersten Schlüssel hinzu",
- "edit": "Bearbeiten"
+ "edit": "Bearbeiten",
+ "copied": "Kopiert!",
+ "copyEnvVarName": "Env-Variablennamen kopieren",
+ "confirmDelete": "Zum Bestätigen erneut klicken",
+ "delete": "Löschen"
},
"empty": {
"title": "Nein API Schlüssel gespeichert",
diff --git a/src/features/localization/renderer/locales/de/settings.json b/src/features/localization/renderer/locales/de/settings.json
index 809a27a4..1e073d23 100644
--- a/src/features/localization/renderer/locales/de/settings.json
+++ b/src/features/localization/renderer/locales/de/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "gekreppt",
"copy": "Kopieren von Diagnosen",
"hints": "Hinweise",
- "likelyCause": "Ursache:"
+ "likelyCause": "Ursache:",
+ "windowsSymlinkAdminHint": "Windows: Agent Teams AI als Administrator ausführen"
},
"models": {
"alreadyDefault": "Dies ist bereits der ausgewählte OpenCode Standard.",
@@ -64,7 +65,15 @@
"searchPlaceholder": "Suchmodelle",
"selectProjectBeforeTesting": "Wählen Sie vor dem Testen einen Projektkontext aus.",
"selectProjectBeforeTestingDefaults": "Wählen Sie vor dem Testen oder Speichern von OpenCode-Standards einen Projektkontext aus.",
- "useInTeamPicker": "Einsatz im Team Picker"
+ "useInTeamPicker": "Einsatz im Team Picker",
+ "testInProgress": "Der Modelltest läuft bereits.",
+ "validationContextRequired": "Wählen Sie oben einen validation context aus, um Test und Set default zu aktivieren. Speichern für team picker speichert nur die route für neue Teams.",
+ "defaultSaveInProgress": "OpenCode default wird gespeichert.",
+ "routeUnavailableAuth": "Dieser provider benötigt eine Authentifizierung, bevor dieses Modell verwendet werden kann.",
+ "routeUnavailableFailed": "Diese model route ist beim letzten execution test fehlgeschlagen.",
+ "routeUnavailableUnknown": "Dieses Modell ist der aktuelle OpenCode default, aber noch nicht im live catalog verfügbar.",
+ "actionsUnavailable": "Aktionen sind vorübergehend nicht verfügbar.",
+ "routeUnavailableGeneric": "Diese model route kann derzeit nicht verwendet werden."
},
"providers": {
"catalog": "OpenCode Anbieter Katalog",
@@ -108,7 +117,8 @@
"needsTest": "Bedarfsprüfung",
"failed": "gescheitert",
"unknown": "unbekannt",
- "default": "Standard"
+ "default": "Standard",
+ "knownRoute": "bekannte route"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API Schlüssel konfiguriert, aber noch nicht überprüft",
"apiKeyModeMissingCredential": "API Schlüsselmodus ausgewählt, aber nein API Schlüssel konfiguriert",
"connectedVia": "Vernetzt über {{method}}",
- "unableToVerify": "Unfähig zu überprüfen"
+ "unableToVerify": "Unfähig zu überprüfen",
+ "modelsAvailable": "Modelle verfügbar"
},
"mode": {
"selectedAuth": "Ausgewählte Auth: {{authMode}}",
diff --git a/src/features/localization/renderer/locales/de/team.json b/src/features/localization/renderer/locales/de/team.json
index 25f61945..1700d050 100644
--- a/src/features/localization/renderer/locales/de/team.json
+++ b/src/features/localization/renderer/locales/de/team.json
@@ -28,7 +28,9 @@
"session": "Sitzung",
"stallNudge": "stall nudge",
"start": "Start",
- "workSync": "Arbeit synchronisiert"
+ "workSync": "Arbeit synchronisiert",
+ "agentError": "Agent-Fehler",
+ "apiError": "API-Fehler"
},
"bootstrap": {
"acknowledged": "Bootstrap anerkannt",
@@ -77,7 +79,11 @@
"action": "Antwort"
},
"activeTasks": {
- "inProgress": "Fortschritte"
+ "inProgress": "Fortschritte",
+ "expandInProgress": "In Arbeit erweitern",
+ "collapseInProgress": "In Arbeit einklappen",
+ "reviewing": "prüft",
+ "workingOn": "arbeitet an"
},
"expandDialog": {
"description": "Erweiterte Nachrichtenansicht"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "Teamdaten erscheinen, sobald die Bereitstellung abgeschlossen ist",
"context": {
- "title": "Kontext"
+ "title": "Kontext",
+ "loading": "Lädt...",
+ "noSessionLoaded": "Keine Sitzung geladen",
+ "closePanel": "Kontextpanel {{team}} schließen",
+ "loadingContext": "Kontext wird geladen...",
+ "openLeadSession": "Öffnen Sie die Team-Lead-Sitzung, um den Kontext anzuzeigen."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "Keine Protokollquellen gefunden.",
"ariaLabel": "Datenquelle",
"leadLabel": "Blei",
- "selectSourceEmpty": "Wählen Sie eine Protokollquelle aus."
+ "selectSourceEmpty": "Wählen Sie eine Protokollquelle aus.",
+ "leadDescription": "Team Lead",
+ "removedLabel": "entfernt",
+ "removedDescription": "Entfernt"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} mehr",
"more_other": "+{{count}} mehr",
"more_few": "+{{count}} mehr",
- "more_many": "+{{count}} mehr"
+ "more_many": "+{{count}} mehr",
+ "unsupportedProvider": "Anbieter nicht unterstützt",
+ "openCodeLogsDelayed": "OpenCode-Logs verzögert",
+ "logsUnavailable": "Logs nicht verfügbar",
+ "noRecentLogs": "Keine aktuellen Logs",
+ "toolError": "Tool-Fehler",
+ "toolResult": "Tool-Ergebnis",
+ "toolUse": "Tool-Nutzung",
+ "thinking": "Denken",
+ "error": "Fehler",
+ "logEvent": "Log-Ereignis",
+ "noErrorOutput": "Keine Fehlerausgabe",
+ "noOutput": "Keine Ausgabe",
+ "noInput": "Keine Eingabe"
},
"blockingEdge": {
"title": "Blockierung der Abhängigkeit",
"blocks": "Blöcke",
"close": "Schließen",
"blockingHiddenTasks": "Blockierung versteckter Aufgaben",
- "blockedHiddenTasks": "Gesperrte versteckte Aufgaben"
+ "blockedHiddenTasks": "Gesperrte versteckte Aufgaben",
+ "links_one": "{{count}} Link",
+ "links_other": "{{count}} Links",
+ "hiddenBlockingLinks_one": "{{count}} versteckter blockierender Link",
+ "hiddenBlockingLinks_other": "{{count}} versteckte blockierende Links",
+ "hiddenTaskStack": "Stapel versteckter Aufgaben",
+ "hiddenTasks_one": "{{count}} versteckte Aufgabe",
+ "hiddenTasks_other": "{{count}} versteckte Aufgaben",
+ "task": "Aufgabe",
+ "openBlockerStack": "Blockierenden Stapel öffnen",
+ "openBlockedStack": "Blockierten Stapel öffnen",
+ "openBlockerTask": "Blockierende Aufgabe öffnen",
+ "openBlockedTask": "Blockierte Aufgabe öffnen"
},
"activityHud": {
"activity": "Tätigkeit",
@@ -1778,7 +1817,11 @@
"autoRefresh": "Auto-refresh",
"wrapLines": "Wrap-Linien",
"loadingTail": "Ladevorgang log tail...",
- "empty": "Noch keine Prozess-Log-Datei für dieses Mitglied erfasst."
+ "empty": "Noch keine Prozess-Log-Datei für dieses Mitglied erfasst.",
+ "copy": "Kopieren",
+ "fileEmpty": "Die Prozess-Logdatei ist leer.",
+ "showingLast": "Zeige letzte {{bytes}}.",
+ "showing": "Zeige {{bytes}}."
},
"tasks": {
"empty": "Keine Aufgaben, die diesem Mitglied zugewiesen werden"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "Installieren oder Wiederherstellen OpenCode Laufzeit von der Provider-Statuskarte, dann wieder öffnen Sie diesen Dialog.",
"openCodeAppMcpUnreachable": "Wiederholen Sie den Start der OpenCode App MCP Brücke. Wenn es wiederholt, starten Sie die App und OpenCode Laufzeit.",
"cliBinaryMissing": "Stellen Sie sicher, dass die lokale Claude CLI binär existiert und kann gestartet werden, dann wieder öffnet dieser Dialog.",
- "default": "Lösen Sie das Problem oben, dann wieder öffnen Sie diesen Dialog."
+ "default": "Lösen Sie das Problem oben, dann wieder öffnen Sie diesen Dialog.",
+ "openCodeNodeModulesSymlinkPermission": "Agent Teams AI als Administrator ausführen und launch erneut versuchen."
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "Laufende Teams"
+ "title": "Laufende Teams",
+ "status": {
+ "active": "Aktiv",
+ "provisioning": "Startet",
+ "idle": "Läuft"
+ },
+ "noProject": "Kein Projekt"
},
"layout": {
"maxPanesReached": "Höchstgehalt {{count}} erreichte Scheiben"
},
"codexReconnect": {
"description": "Ihre Codex-Session erscheint stabil. Weiterleiten.",
- "useCode": "Bezeichnung"
+ "useCode": "Bezeichnung",
+ "generating": "Wird generiert...",
+ "openLogin": "Login öffnen",
+ "generateLink": "Link generieren"
},
"effortLevel": {
"label": "Schwierigkeitsgrad (optional)",
@@ -2428,6 +2481,7 @@
"customRole": "Individuelle Rolle...",
"searchPlaceholder": "Suchrollen...",
"empty": "Keine Rollen gefunden.",
- "reservedRole": "Diese Rolle ist reserviert"
+ "reservedRole": "Diese Rolle ist reserviert",
+ "emptyCustomRole": "Rolle darf nicht leer sein"
}
}
diff --git a/src/features/localization/renderer/locales/en/extensions.json b/src/features/localization/renderer/locales/en/extensions.json
index acfcea20..52e98782 100644
--- a/src/features/localization/renderer/locales/en/extensions.json
+++ b/src/features/localization/renderer/locales/en/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "Add API Key",
"addFirst": "Add your first key",
- "edit": "Edit"
+ "edit": "Edit",
+ "copied": "Copied!",
+ "copyEnvVarName": "Copy env var name",
+ "confirmDelete": "Click again to confirm",
+ "delete": "Delete"
},
"empty": {
"title": "No API keys saved",
diff --git a/src/features/localization/renderer/locales/en/settings.json b/src/features/localization/renderer/locales/en/settings.json
index d41f7f8c..c58dc3ef 100644
--- a/src/features/localization/renderer/locales/en/settings.json
+++ b/src/features/localization/renderer/locales/en/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "Copied",
"copy": "Copy diagnostics",
"hints": "Hints",
- "likelyCause": "Likely cause:"
+ "likelyCause": "Likely cause:",
+ "windowsSymlinkAdminHint": "Windows: run Agent Teams AI as Administrator"
},
"models": {
"alreadyDefault": "This is already the selected OpenCode default.",
diff --git a/src/features/localization/renderer/locales/en/team.json b/src/features/localization/renderer/locales/en/team.json
index 56d965f6..e0185740 100644
--- a/src/features/localization/renderer/locales/en/team.json
+++ b/src/features/localization/renderer/locales/en/team.json
@@ -28,7 +28,9 @@
"session": "session",
"stallNudge": "stall nudge",
"start": "start",
- "workSync": "work sync"
+ "workSync": "work sync",
+ "agentError": "Agent Error",
+ "apiError": "API Error"
},
"bootstrap": {
"acknowledged": "Bootstrap acknowledged",
@@ -77,7 +79,11 @@
"action": "Reply"
},
"activeTasks": {
- "inProgress": "In progress"
+ "inProgress": "In progress",
+ "expandInProgress": "Expand in progress",
+ "collapseInProgress": "Collapse in progress",
+ "reviewing": "reviewing",
+ "workingOn": "working on"
},
"expandDialog": {
"description": "Expanded message view"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "Team data will appear once provisioning completes",
"context": {
- "title": "Context"
+ "title": "Context",
+ "loading": "Loading...",
+ "noSessionLoaded": "No session loaded",
+ "closePanel": "Close {{team}} context panel",
+ "loadingContext": "Loading context...",
+ "openLeadSession": "Open the team lead session to view context."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "No log sources found.",
"ariaLabel": "Log source",
"leadLabel": "Lead",
- "selectSourceEmpty": "Select a log source."
+ "selectSourceEmpty": "Select a log source.",
+ "leadDescription": "Team Lead",
+ "removedLabel": "removed",
+ "removedDescription": "Removed"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} more",
"more_other": "+{{count}} more",
"more_few": "+{{count}} more",
- "more_many": "+{{count}} more"
+ "more_many": "+{{count}} more",
+ "unsupportedProvider": "Unsupported provider",
+ "openCodeLogsDelayed": "OpenCode logs delayed",
+ "logsUnavailable": "Logs unavailable",
+ "noRecentLogs": "No recent logs",
+ "toolError": "Tool error",
+ "toolResult": "Tool result",
+ "toolUse": "Tool use",
+ "thinking": "Thinking",
+ "error": "Error",
+ "logEvent": "Log event",
+ "noErrorOutput": "No error output",
+ "noOutput": "No output",
+ "noInput": "No input"
},
"blockingEdge": {
"title": "Blocking Dependency",
"blocks": "blocks",
"close": "Close",
"blockingHiddenTasks": "Blocking hidden tasks",
- "blockedHiddenTasks": "Blocked hidden tasks"
+ "blockedHiddenTasks": "Blocked hidden tasks",
+ "links_one": "{{count}} link",
+ "links_other": "{{count}} links",
+ "hiddenBlockingLinks_one": "{{count}} hidden blocking link",
+ "hiddenBlockingLinks_other": "{{count}} hidden blocking links",
+ "hiddenTaskStack": "Hidden task stack",
+ "hiddenTasks_one": "{{count}} hidden task",
+ "hiddenTasks_other": "{{count}} hidden tasks",
+ "task": "Task",
+ "openBlockerStack": "Open blocker stack",
+ "openBlockedStack": "Open blocked stack",
+ "openBlockerTask": "Open blocker task",
+ "openBlockedTask": "Open blocked task"
},
"activityHud": {
"activity": "Activity",
@@ -1778,7 +1817,11 @@
"autoRefresh": "Auto-refresh",
"wrapLines": "Wrap lines",
"loadingTail": "Loading process log tail...",
- "empty": "No process log file captured for this member yet."
+ "empty": "No process log file captured for this member yet.",
+ "copy": "Copy",
+ "fileEmpty": "Process log file is empty.",
+ "showingLast": "Showing last {{bytes}}.",
+ "showing": "Showing {{bytes}}."
},
"tasks": {
"empty": "No tasks assigned to this member"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "Install or retry OpenCode runtime from the provider status card, then reopen this dialog.",
"openCodeAppMcpUnreachable": "Retry launch to refresh the OpenCode app MCP bridge. If it repeats, restart the app and OpenCode runtime.",
"cliBinaryMissing": "Make sure the local Claude CLI binary exists and can be started, then reopen this dialog.",
- "default": "Resolve the issue above, then reopen this dialog."
+ "default": "Resolve the issue above, then reopen this dialog.",
+ "openCodeNodeModulesSymlinkPermission": "Run Agent Teams AI as Administrator, then retry launch."
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "Running Teams"
+ "title": "Running Teams",
+ "status": {
+ "active": "Active",
+ "provisioning": "Launching",
+ "idle": "Running"
+ },
+ "noProject": "No project"
},
"layout": {
"maxPanesReached": "Maximum of {{count}} panes reached"
},
"codexReconnect": {
"description": "Your Codex session appears stale. Reconnect to continue.",
- "useCode": "Use code"
+ "useCode": "Use code",
+ "generating": "Generating...",
+ "openLogin": "Open login",
+ "generateLink": "Generate link"
},
"effortLevel": {
"label": "Effort level (optional)",
@@ -2428,6 +2481,7 @@
"customRole": "Custom role...",
"searchPlaceholder": "Search roles...",
"empty": "No roles found.",
- "reservedRole": "This role is reserved"
+ "reservedRole": "This role is reserved",
+ "emptyCustomRole": "Role cannot be empty"
}
}
diff --git a/src/features/localization/renderer/locales/es/extensions.json b/src/features/localization/renderer/locales/es/extensions.json
index 22171f1a..a47623f5 100644
--- a/src/features/localization/renderer/locales/es/extensions.json
+++ b/src/features/localization/renderer/locales/es/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "Añadir API Key",
"addFirst": "Añade tu primera llave",
- "edit": "Editar"
+ "edit": "Editar",
+ "copied": "Copiado!",
+ "copyEnvVarName": "Copiar nombre de variable env",
+ "confirmDelete": "Haga clic otra vez para confirmar",
+ "delete": "Eliminar"
},
"empty": {
"title": "No se guardan las teclas ZXCV",
diff --git a/src/features/localization/renderer/locales/es/settings.json b/src/features/localization/renderer/locales/es/settings.json
index 7598e6b3..ad63d677 100644
--- a/src/features/localization/renderer/locales/es/settings.json
+++ b/src/features/localization/renderer/locales/es/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "Copiado",
"copy": "Copia diagnóstico",
"hints": "Hintes",
- "likelyCause": "Causa probable:"
+ "likelyCause": "Causa probable:",
+ "windowsSymlinkAdminHint": "Windows: ejecuta Agent Teams AI como administrador"
},
"models": {
"alreadyDefault": "Este ya es el predeterminado OpenCode seleccionado.",
@@ -64,7 +65,15 @@
"searchPlaceholder": "Modelos de búsqueda",
"selectProjectBeforeTesting": "Seleccione un contexto de proyecto antes de probar modelos.",
"selectProjectBeforeTestingDefaults": "Seleccione un contexto de proyecto antes de probar o guardar los defectos de OpenCode.",
- "useInTeamPicker": "Uso en el equipo picker"
+ "useInTeamPicker": "Uso en el equipo picker",
+ "testInProgress": "La prueba del modelo ya está en curso.",
+ "validationContextRequired": "Selecciona un contexto de validación arriba para habilitar Test y Set default. Guardar para team picker solo almacena la route para equipos nuevos.",
+ "defaultSaveInProgress": "Se está guardando el OpenCode default.",
+ "routeUnavailableAuth": "Este provider requiere autenticación antes de usar este modelo.",
+ "routeUnavailableFailed": "Esta model route falló su último execution test.",
+ "routeUnavailableUnknown": "Este modelo es el OpenCode default actual, pero aún no está en el live catalog.",
+ "actionsUnavailable": "Las acciones no están disponibles temporalmente.",
+ "routeUnavailableGeneric": "Esta model route no se puede usar ahora."
},
"providers": {
"catalog": "Catálogo de proveedores de OpenCode",
@@ -108,7 +117,8 @@
"needsTest": "examen de necesidades",
"failed": "fracasado",
"unknown": "desconocida",
- "default": "por defecto"
+ "default": "por defecto",
+ "knownRoute": "route conocida"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API llave configurada, pero no verificada",
"apiKeyModeMissingCredential": "Modo de tecla API seleccionado, pero no se configura la tecla API",
"connectedVia": "Conectado vía {{method}}",
- "unableToVerify": "Incapaz de verificar"
+ "unableToVerify": "Incapaz de verificar",
+ "modelsAvailable": "Modelos disponibles"
},
"mode": {
"selectedAuth": "Ajuste seleccionado: {{authMode}}",
diff --git a/src/features/localization/renderer/locales/es/team.json b/src/features/localization/renderer/locales/es/team.json
index ba98cf81..50d3577b 100644
--- a/src/features/localization/renderer/locales/es/team.json
+++ b/src/features/localization/renderer/locales/es/team.json
@@ -28,7 +28,9 @@
"session": "período de sesiones",
"stallNudge": "¡No!",
"start": "Empieza",
- "workSync": "sincronización de trabajo"
+ "workSync": "sincronización de trabajo",
+ "agentError": "Error del agente",
+ "apiError": "Error de API"
},
"bootstrap": {
"acknowledged": "Bootstrap acknowledged",
@@ -77,7 +79,11 @@
"action": "Respuesta"
},
"activeTasks": {
- "inProgress": "En curso"
+ "inProgress": "En curso",
+ "expandInProgress": "Expandir en progreso",
+ "collapseInProgress": "Contraer en progreso",
+ "reviewing": "revisando",
+ "workingOn": "trabajando en"
},
"expandDialog": {
"description": "Ampliación de la vista del mensaje"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "Los datos del equipo aparecerán una vez que se complete el suministro",
"context": {
- "title": "Contexto"
+ "title": "Contexto",
+ "loading": "Cargando...",
+ "noSessionLoaded": "Sesión no cargada",
+ "closePanel": "Cerrar panel de contexto de {{team}}",
+ "loadingContext": "Cargando contexto...",
+ "openLeadSession": "Abra la sesión del líder del equipo para ver el contexto."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "No hay fuentes de registro encontradas.",
"ariaLabel": "Fuente de registro",
"leadLabel": "Lead",
- "selectSourceEmpty": "Seleccione una fuente de registro."
+ "selectSourceEmpty": "Seleccione una fuente de registro.",
+ "leadDescription": "Líder del equipo",
+ "removedLabel": "eliminado",
+ "removedDescription": "Eliminado"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} más",
"more_other": "+{{count}} más",
"more_few": "+{{count}} más",
- "more_many": "+{{count}} más"
+ "more_many": "+{{count}} más",
+ "unsupportedProvider": "Proveedor no compatible",
+ "openCodeLogsDelayed": "Logs de OpenCode retrasados",
+ "logsUnavailable": "Logs no disponibles",
+ "noRecentLogs": "No hay logs recientes",
+ "toolError": "Error de herramienta",
+ "toolResult": "Resultado de herramienta",
+ "toolUse": "Uso de herramienta",
+ "thinking": "Pensando",
+ "error": "Error",
+ "logEvent": "Evento de log",
+ "noErrorOutput": "Sin salida de error",
+ "noOutput": "Sin salida",
+ "noInput": "Sin entrada"
},
"blockingEdge": {
"title": "Bloqueo de la dependencia",
"blocks": "bloques",
"close": "Cerca",
"blockingHiddenTasks": "Bloqueo de tareas ocultas",
- "blockedHiddenTasks": "Tareas ocultas bloqueadas"
+ "blockedHiddenTasks": "Tareas ocultas bloqueadas",
+ "links_one": "{{count}} enlace",
+ "links_other": "{{count}} enlaces",
+ "hiddenBlockingLinks_one": "{{count}} enlace bloqueante oculto",
+ "hiddenBlockingLinks_other": "{{count}} enlaces bloqueantes ocultos",
+ "hiddenTaskStack": "Pila de tareas ocultas",
+ "hiddenTasks_one": "{{count}} tarea oculta",
+ "hiddenTasks_other": "{{count}} tareas ocultas",
+ "task": "Tarea",
+ "openBlockerStack": "Abrir pila bloqueadora",
+ "openBlockedStack": "Abrir pila bloqueada",
+ "openBlockerTask": "Abrir tarea bloqueadora",
+ "openBlockedTask": "Abrir tarea bloqueada"
},
"activityHud": {
"activity": "Actividad",
@@ -1778,7 +1817,11 @@
"autoRefresh": "Auto-refresh",
"wrapLines": "Líneas de trampa",
"loadingTail": "Carga de proceso log tail...",
- "empty": "Aún no se ha capturado ningún archivo de registro de procesos para este miembro."
+ "empty": "Aún no se ha capturado ningún archivo de registro de procesos para este miembro.",
+ "copy": "Copiar",
+ "fileEmpty": "El archivo de log del proceso está vacío.",
+ "showingLast": "Mostrando los últimos {{bytes}}.",
+ "showing": "Mostrando {{bytes}}."
},
"tasks": {
"empty": "No se han asignado tareas a este miembro"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "Instala o vuelve a iniciar OpenCode tiempo de ejecución de la tarjeta de estado del proveedor, y luego vuelve a abrir este diálogo.",
"openCodeAppMcpUnreachable": "Lanzamiento de entrada para refrescar el puente de OpenCode MCP. Si se repite, reinicie la aplicación y el tiempo de ejecución OpenCode.",
"cliBinaryMissing": "Asegúrese de que el binario local Claude CLI exista y pueda comenzar, y luego vuelva a abrir este diálogo.",
- "default": "Resolver el tema anterior, luego reabrir este diálogo."
+ "default": "Resolver el tema anterior, luego reabrir este diálogo.",
+ "openCodeNodeModulesSymlinkPermission": "Ejecuta Agent Teams AI como administrador y vuelve a intentar el launch."
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "Equipos de ejecución"
+ "title": "Equipos de ejecución",
+ "status": {
+ "active": "Activo",
+ "provisioning": "Iniciando",
+ "idle": "En ejecución"
+ },
+ "noProject": "Sin proyecto"
},
"layout": {
"maxPanesReached": "Máximo de los paneles {{count}} alcanzado"
},
"codexReconnect": {
"description": "Su sesión de Codex parece ser firme. Reconéctate para continuar.",
- "useCode": "Código de uso"
+ "useCode": "Código de uso",
+ "generating": "Generando...",
+ "openLogin": "Abrir inicio de sesión",
+ "generateLink": "Generar enlace"
},
"effortLevel": {
"label": "Nivel de esfuerzo (opcional)",
@@ -2428,6 +2481,7 @@
"customRole": "Función personalizada...",
"searchPlaceholder": "Funciones de búsqueda...",
"empty": "No hay papeles encontrados.",
- "reservedRole": "Esta función está reservada"
+ "reservedRole": "Esta función está reservada",
+ "emptyCustomRole": "El rol no puede estar vacío"
}
}
diff --git a/src/features/localization/renderer/locales/fr/extensions.json b/src/features/localization/renderer/locales/fr/extensions.json
index 1a49fe57..1b910d03 100644
--- a/src/features/localization/renderer/locales/fr/extensions.json
+++ b/src/features/localization/renderer/locales/fr/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "Ajouter API Clé",
"addFirst": "Ajouter votre première clé",
- "edit": "Modifier"
+ "edit": "Modifier",
+ "copied": "Copié!",
+ "copyEnvVarName": "Copier le nom de variable env",
+ "confirmDelete": "Cliquez encore pour confirmer",
+ "delete": "Supprimer"
},
"empty": {
"title": "Numéro API clés enregistrées",
diff --git a/src/features/localization/renderer/locales/fr/settings.json b/src/features/localization/renderer/locales/fr/settings.json
index 675a88dd..3f9e94dd 100644
--- a/src/features/localization/renderer/locales/fr/settings.json
+++ b/src/features/localization/renderer/locales/fr/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "Copié",
"copy": "Copier les diagnostics",
"hints": "Conseils",
- "likelyCause": "Cause probable:"
+ "likelyCause": "Cause probable:",
+ "windowsSymlinkAdminHint": "Windows: lancez Agent Teams AI en tant qu'administrateur"
},
"models": {
"alreadyDefault": "C'est déjà la valeur par défaut d'OpenCode sélectionnée.",
@@ -64,7 +65,15 @@
"searchPlaceholder": "Modèles de recherche",
"selectProjectBeforeTesting": "Sélectionnez un contexte de projet avant de tester des modèles.",
"selectProjectBeforeTestingDefaults": "Sélectionnez un contexte de projet avant de tester ou d'enregistrer les valeurs par défaut OpenCode.",
- "useInTeamPicker": "Utilisation dans le sélectionneur d'équipe"
+ "useInTeamPicker": "Utilisation dans le sélectionneur d'équipe",
+ "testInProgress": "Le test du modèle est déjà en cours.",
+ "validationContextRequired": "Sélectionnez un contexte de validation ci-dessus pour activer Test et Set default. L'enregistrement pour team picker ne conserve que la route pour les nouvelles équipes.",
+ "defaultSaveInProgress": "L'OpenCode default est en cours d'enregistrement.",
+ "routeUnavailableAuth": "Ce provider nécessite une authentification avant d'utiliser ce modèle.",
+ "routeUnavailableFailed": "Cette model route a échoué au dernier execution test.",
+ "routeUnavailableUnknown": "Ce modèle est l'OpenCode default actuel, mais il n'est pas encore disponible dans le live catalog.",
+ "actionsUnavailable": "Les actions sont temporairement indisponibles.",
+ "routeUnavailableGeneric": "Cette model route ne peut pas être utilisée maintenant."
},
"providers": {
"catalog": "Catalogue des fournisseurs OpenCode",
@@ -108,7 +117,8 @@
"needsTest": "test des besoins",
"failed": "échoué",
"unknown": "inconnu",
- "default": "par défaut"
+ "default": "par défaut",
+ "knownRoute": "route connue"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API clé configurée, mais non encore vérifiée",
"apiKeyModeMissingCredential": "API mode clé sélectionné, mais non API la clé est configurée",
"connectedVia": "Connecté via {{method}}",
- "unableToVerify": "Impossible de vérifier"
+ "unableToVerify": "Impossible de vérifier",
+ "modelsAvailable": "Modèles disponibles"
},
"mode": {
"selectedAuth": "Auth sélectionnée: {{authMode}}",
diff --git a/src/features/localization/renderer/locales/fr/team.json b/src/features/localization/renderer/locales/fr/team.json
index 5cdaa1e6..4ce92b1a 100644
--- a/src/features/localization/renderer/locales/fr/team.json
+++ b/src/features/localization/renderer/locales/fr/team.json
@@ -28,7 +28,9 @@
"session": "session",
"stallNudge": "Décrochage",
"start": "début",
- "workSync": "synchronisation de travail"
+ "workSync": "synchronisation de travail",
+ "agentError": "Erreur d'agent",
+ "apiError": "Erreur d'API"
},
"bootstrap": {
"acknowledged": "Bootstrap reconnu",
@@ -77,7 +79,11 @@
"action": "Réponse"
},
"activeTasks": {
- "inProgress": "En cours"
+ "inProgress": "En cours",
+ "expandInProgress": "Développer en cours",
+ "collapseInProgress": "Réduire en cours",
+ "reviewing": "relit",
+ "workingOn": "travaille sur"
},
"expandDialog": {
"description": "Affichage du message élargi"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "Les données de l'équipe apparaîtront une fois la fourniture terminée",
"context": {
- "title": "Contexte"
+ "title": "Contexte",
+ "loading": "Chargement...",
+ "noSessionLoaded": "Aucune session chargée",
+ "closePanel": "Fermer le panneau de contexte {{team}}",
+ "loadingContext": "Chargement du contexte...",
+ "openLeadSession": "Ouvrez la session du lead d'équipe pour voir le contexte."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "Aucune source de log n'a été trouvée.",
"ariaLabel": "Source du journal",
"leadLabel": "Plomb",
- "selectSourceEmpty": "Sélectionnez une source de journal."
+ "selectSourceEmpty": "Sélectionnez une source de journal.",
+ "leadDescription": "Lead d'équipe",
+ "removedLabel": "supprimé",
+ "removedDescription": "Supprimé"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} plus",
"more_other": "+{{count}} plus",
"more_few": "+{{count}} plus",
- "more_many": "+{{count}} plus"
+ "more_many": "+{{count}} plus",
+ "unsupportedProvider": "Fournisseur non pris en charge",
+ "openCodeLogsDelayed": "Logs OpenCode retardés",
+ "logsUnavailable": "Logs indisponibles",
+ "noRecentLogs": "Aucun log récent",
+ "toolError": "Erreur d'outil",
+ "toolResult": "Résultat d'outil",
+ "toolUse": "Utilisation d'outil",
+ "thinking": "Réflexion",
+ "error": "Erreur",
+ "logEvent": "Événement de log",
+ "noErrorOutput": "Aucune sortie d'erreur",
+ "noOutput": "Aucune sortie",
+ "noInput": "Aucune entrée"
},
"blockingEdge": {
"title": "Bloquer la dépendance",
"blocks": "blocs",
"close": "Fermer",
"blockingHiddenTasks": "Blocage des tâches cachées",
- "blockedHiddenTasks": "Tâches cachées bloquées"
+ "blockedHiddenTasks": "Tâches cachées bloquées",
+ "links_one": "{{count}} lien",
+ "links_other": "{{count}} liens",
+ "hiddenBlockingLinks_one": "{{count}} lien bloquant masqué",
+ "hiddenBlockingLinks_other": "{{count}} liens bloquants masqués",
+ "hiddenTaskStack": "Pile de tâches cachées",
+ "hiddenTasks_one": "{{count}} tâche cachée",
+ "hiddenTasks_other": "{{count}} tâches cachées",
+ "task": "Tâche",
+ "openBlockerStack": "Ouvrir la pile bloquante",
+ "openBlockedStack": "Ouvrir la pile bloquée",
+ "openBlockerTask": "Ouvrir la tâche bloquante",
+ "openBlockedTask": "Ouvrir la tâche bloquée"
},
"activityHud": {
"activity": "Activité",
@@ -1778,7 +1817,11 @@
"autoRefresh": "Rénovation automatique",
"wrapLines": "Lignes d'enroulement",
"loadingTail": "Chargement de la queue de log...",
- "empty": "Aucun fichier de processus n'a encore été capturé pour ce membre."
+ "empty": "Aucun fichier de processus n'a encore été capturé pour ce membre.",
+ "copy": "Copier",
+ "fileEmpty": "Le fichier de log du processus est vide.",
+ "showingLast": "Affichage des derniers {{bytes}}.",
+ "showing": "Affichage de {{bytes}}."
},
"tasks": {
"empty": "Aucune tâche assignée à ce membre"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "Installer ou réessayer OpenCode runtime à partir de la carte de statut du fournisseur, puis rouvrir cette boîte de dialogue.",
"openCodeAppMcpUnreachable": "Reessayer le lancement pour actualiser l'application OpenCode MCP pont. Si elle se répète, redémarrez l'application et l'exécution OpenCode.",
"cliBinaryMissing": "Assurez-vous que le Claude local CLI binaire existe et peut être démarré, puis rouvrir cette boîte de dialogue.",
- "default": "Résolvez le problème ci-dessus, puis rouvrez ce dialogue."
+ "default": "Résolvez le problème ci-dessus, puis rouvrez ce dialogue.",
+ "openCodeNodeModulesSymlinkPermission": "Lancez Agent Teams AI en tant qu'administrateur, puis réessayez le launch."
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "Équipes de course"
+ "title": "Équipes de course",
+ "status": {
+ "active": "Active",
+ "provisioning": "Lancement",
+ "idle": "En cours"
+ },
+ "noProject": "Aucun projet"
},
"layout": {
"maxPanesReached": "Maximum de {{count}} vitres atteintes"
},
"codexReconnect": {
"description": "Votre session Codex semble inexistante. Reconnecter pour continuer.",
- "useCode": "Utiliser le code"
+ "useCode": "Utiliser le code",
+ "generating": "Génération...",
+ "openLogin": "Ouvrir la connexion",
+ "generateLink": "Générer le lien"
},
"effortLevel": {
"label": "Niveau d'effort (facultatif)",
@@ -2428,6 +2481,7 @@
"customRole": "Rôle personnalisé...",
"searchPlaceholder": "Rechercher les rôles...",
"empty": "Aucun rôle trouvé.",
- "reservedRole": "Ce rôle est réservé"
+ "reservedRole": "Ce rôle est réservé",
+ "emptyCustomRole": "Le rôle ne peut pas être vide"
}
}
diff --git a/src/features/localization/renderer/locales/hi/extensions.json b/src/features/localization/renderer/locales/hi/extensions.json
index 3d0828e3..97d90a80 100644
--- a/src/features/localization/renderer/locales/hi/extensions.json
+++ b/src/features/localization/renderer/locales/hi/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "API कुंजी जोड़ें",
"addFirst": "अपनी पहली कुंजी जोड़ें",
- "edit": "संपादित करें"
+ "edit": "संपादित करें",
+ "copied": "कॉपी हो गया!",
+ "copyEnvVarName": "Env var name copy करें",
+ "confirmDelete": "Confirm करने के लिए फिर क्लिक करें",
+ "delete": "Delete"
},
"empty": {
"title": "No API कुंजी बचाया",
diff --git a/src/features/localization/renderer/locales/hi/settings.json b/src/features/localization/renderer/locales/hi/settings.json
index 2f00a6a7..4c39346e 100644
--- a/src/features/localization/renderer/locales/hi/settings.json
+++ b/src/features/localization/renderer/locales/hi/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "Copied",
"copy": "निदान की प्रतिलिपि",
"hints": "हिंट",
- "likelyCause": "समान कारण:"
+ "likelyCause": "समान कारण:",
+ "windowsSymlinkAdminHint": "Windows: Agent Teams AI को Administrator के रूप में चलाएं"
},
"models": {
"alreadyDefault": "यह पहले से ही चयनित OpenCode डिफ़ॉल्ट है।",
@@ -64,7 +65,15 @@
"searchPlaceholder": "खोज मॉडल",
"selectProjectBeforeTesting": "परीक्षण मॉडल से पहले परियोजना संदर्भ का चयन करें।",
"selectProjectBeforeTestingDefaults": "OpenCode डिफ़ॉल्ट परीक्षण या सहेजने से पहले एक परियोजना संदर्भ का चयन करें।",
- "useInTeamPicker": "टीम पिकर में उपयोग करें"
+ "useInTeamPicker": "टीम पिकर में उपयोग करें",
+ "testInProgress": "मॉडल टेस्ट पहले से चल रहा है।",
+ "validationContextRequired": "Test और Set default सक्षम करने के लिए ऊपर validation context चुनें। team picker के लिए सेव करने से सिर्फ नई टीमों की route सेव होती है।",
+ "defaultSaveInProgress": "OpenCode default सेव हो रहा है।",
+ "routeUnavailableAuth": "इस model का उपयोग करने से पहले इस provider को authentication चाहिए।",
+ "routeUnavailableFailed": "यह model route पिछले execution test में विफल रहा।",
+ "routeUnavailableUnknown": "यह model वर्तमान OpenCode default है, लेकिन अभी live catalog में उपलब्ध नहीं है।",
+ "actionsUnavailable": "Actions अस्थायी रूप से उपलब्ध नहीं हैं।",
+ "routeUnavailableGeneric": "यह model route अभी उपयोग नहीं किया जा सकता।"
},
"providers": {
"catalog": "ओपनकोड प्रदाता सूची",
@@ -108,7 +117,8 @@
"needsTest": "परीक्षण",
"failed": "असफल",
"unknown": "अज्ञात",
- "default": "डिफ़ॉल्ट"
+ "default": "डिफ़ॉल्ट",
+ "knownRoute": "ज्ञात route"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API कुंजी विन्यास, लेकिन अभी तक सत्यापित नहीं",
"apiKeyModeMissingCredential": "API कुंजी मोड चुना गया है, लेकिन कोई API कुंजी कॉन्फ़िगर किया गया है",
"connectedVia": "कनेक्टेड by {{method}}",
- "unableToVerify": "सत्यापित करने में असमर्थ"
+ "unableToVerify": "सत्यापित करने में असमर्थ",
+ "modelsAvailable": "मॉडल उपलब्ध हैं"
},
"mode": {
"selectedAuth": "चयनित auth: {{authMode}}",
diff --git a/src/features/localization/renderer/locales/hi/team.json b/src/features/localization/renderer/locales/hi/team.json
index 0dc47019..e3f846c7 100644
--- a/src/features/localization/renderer/locales/hi/team.json
+++ b/src/features/localization/renderer/locales/hi/team.json
@@ -28,7 +28,9 @@
"session": "सत्र",
"stallNudge": "स्टाल",
"start": "प्रारंभ",
- "workSync": "कार्य सिंक"
+ "workSync": "कार्य सिंक",
+ "agentError": "Agent Error",
+ "apiError": "API Error"
},
"bootstrap": {
"acknowledged": "बूटस्ट्रैप स्वीकार किया",
@@ -77,7 +79,11 @@
"action": "जवाब दें"
},
"activeTasks": {
- "inProgress": "प्रगति में"
+ "inProgress": "प्रगति में",
+ "expandInProgress": "In progress फैलाएं",
+ "collapseInProgress": "In progress समेटें",
+ "reviewing": "review कर रहा है",
+ "workingOn": "काम कर रहा है"
},
"expandDialog": {
"description": "विस्तारित संदेश दृश्य"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "टीम डेटा एक बार पूरा करने का प्रावधान करेगा",
"context": {
- "title": "संदर्भ"
+ "title": "संदर्भ",
+ "loading": "लोड हो रहा है...",
+ "noSessionLoaded": "Session loaded नहीं",
+ "closePanel": "{{team}} context panel बंद करें",
+ "loadingContext": "Context लोड हो रहा है...",
+ "openLeadSession": "Context देखने के लिए team lead session खोलें."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "कोई लॉग सूत्र नहीं मिला।",
"ariaLabel": "लॉग स्रोत",
"leadLabel": "लीड",
- "selectSourceEmpty": "लॉग स्रोत चुनें।"
+ "selectSourceEmpty": "लॉग स्रोत चुनें।",
+ "leadDescription": "Team Lead",
+ "removedLabel": "हटाया गया",
+ "removedDescription": "हटाया गया"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "{{count}} अधिक",
"more_other": "{{count}} अधिक",
"more_few": "{{count}} अधिक",
- "more_many": "{{count}} अधिक"
+ "more_many": "{{count}} अधिक",
+ "unsupportedProvider": "Provider समर्थित नहीं",
+ "openCodeLogsDelayed": "OpenCode logs में देरी है",
+ "logsUnavailable": "Logs उपलब्ध नहीं",
+ "noRecentLogs": "कोई हालिया logs नहीं",
+ "toolError": "Tool error",
+ "toolResult": "Tool result",
+ "toolUse": "Tool use",
+ "thinking": "Thinking",
+ "error": "Error",
+ "logEvent": "Log event",
+ "noErrorOutput": "कोई error output नहीं",
+ "noOutput": "कोई output नहीं",
+ "noInput": "कोई input नहीं"
},
"blockingEdge": {
"title": "अवरोधन निर्भरता",
"blocks": "ब्लॉक",
"close": "बंद",
"blockingHiddenTasks": "छिपे हुए कार्यों को अवरुद्ध करना",
- "blockedHiddenTasks": "छुपा कार्य अवरुद्ध"
+ "blockedHiddenTasks": "छुपा कार्य अवरुद्ध",
+ "links_one": "{{count}} लिंक",
+ "links_other": "{{count}} लिंक",
+ "hiddenBlockingLinks_one": "{{count}} छिपा blocking link",
+ "hiddenBlockingLinks_other": "{{count}} छिपे blocking links",
+ "hiddenTaskStack": "छिपे कार्यों का stack",
+ "hiddenTasks_one": "{{count}} छिपा कार्य",
+ "hiddenTasks_other": "{{count}} छिपे कार्य",
+ "task": "कार्य",
+ "openBlockerStack": "Blocker stack खोलें",
+ "openBlockedStack": "Blocked stack खोलें",
+ "openBlockerTask": "Blocker task खोलें",
+ "openBlockedTask": "Blocked task खोलें"
},
"activityHud": {
"activity": "गतिविधि",
@@ -1778,7 +1817,11 @@
"autoRefresh": "ऑटो रिफ्रेश",
"wrapLines": "लपेटें",
"loadingTail": "प्रक्रिया लॉग पूंछ लोड हो रहा है...",
- "empty": "इस सदस्य के लिए अभी तक कोई प्रक्रिया लॉग फाइल नहीं है।"
+ "empty": "इस सदस्य के लिए अभी तक कोई प्रक्रिया लॉग फाइल नहीं है।",
+ "copy": "Copy",
+ "fileEmpty": "Process log file खाली है.",
+ "showingLast": "अंतिम {{bytes}} दिखा रहे हैं.",
+ "showing": "{{bytes}} दिखा रहे हैं."
},
"tasks": {
"empty": "इस सदस्य को कोई कार्य सौंपा नहीं गया"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "प्रदाता स्टेटस कार्ड से OpenCode रनटाइम को इंस्टॉल या रीट्री करें, फिर इस संवाद को फिर से खोलें।",
"openCodeAppMcpUnreachable": "ओपनकोड ऐप MCP पुल को रीफ्रेश करने के लिए रिट्री लॉन्च। यदि यह दोहराता है, तो ऐप और ओपनकोड रनटाइम को पुनः आरंभ करें।",
"cliBinaryMissing": "सुनिश्चित करें कि स्थानीय क्लाउड CLI द्विआधारी मौजूद है और इसे शुरू किया जा सकता है, फिर इस संवाद को फिर से खोलना।",
- "default": "ऊपर इस मुद्दे को हल करें, फिर इस संवाद को फिर से खोलें।"
+ "default": "ऊपर इस मुद्दे को हल करें, फिर इस संवाद को फिर से खोलें।",
+ "openCodeNodeModulesSymlinkPermission": "Agent Teams AI को Administrator के रूप में चलाएं, फिर launch दोबारा करें."
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "रनिंग टीम"
+ "title": "रनिंग टीम",
+ "status": {
+ "active": "सक्रिय",
+ "provisioning": "शुरू हो रही है",
+ "idle": "चल रही है"
+ },
+ "noProject": "कोई project नहीं"
},
"layout": {
"maxPanesReached": "{{count}} पैन का अधिकतम प्रवेश"
},
"codexReconnect": {
"description": "आपका कोडेक्स सत्र कहानी दिखाई देती है। जारी रखने के लिए कनेक्ट करें।",
- "useCode": "कोड"
+ "useCode": "कोड",
+ "generating": "बन रहा है...",
+ "openLogin": "Login खोलें",
+ "generateLink": "Link बनाएं"
},
"effortLevel": {
"label": "प्रयास स्तर (वैकल्पिक)",
@@ -2428,6 +2481,7 @@
"customRole": "कस्टम भूमिका...",
"searchPlaceholder": "खोज भूमिकाओं...",
"empty": "कोई भूमिका नहीं मिली।",
- "reservedRole": "यह भूमिका आरक्षित है"
+ "reservedRole": "यह भूमिका आरक्षित है",
+ "emptyCustomRole": "Role खाली नहीं हो सकती"
}
}
diff --git a/src/features/localization/renderer/locales/id/extensions.json b/src/features/localization/renderer/locales/id/extensions.json
index 1dfd7f1c..3aff4cd5 100644
--- a/src/features/localization/renderer/locales/id/extensions.json
+++ b/src/features/localization/renderer/locales/id/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "Tambah API Kunci",
"addFirst": "Tambah kunci pertama Anda",
- "edit": "Sunting"
+ "edit": "Sunting",
+ "copied": "Disalin!",
+ "copyEnvVarName": "Salin nama variabel env",
+ "confirmDelete": "Klik lagi untuk mengonfirmasi",
+ "delete": "Hapus"
},
"empty": {
"title": "Tidak API kunci disimpan",
diff --git a/src/features/localization/renderer/locales/id/settings.json b/src/features/localization/renderer/locales/id/settings.json
index 5a6aae2c..5f20f85c 100644
--- a/src/features/localization/renderer/locales/id/settings.json
+++ b/src/features/localization/renderer/locales/id/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "Disalin",
"copy": "Salin diagnosa",
"hints": "Petunjuk",
- "likelyCause": "Kemungkinan menyebabkan:"
+ "likelyCause": "Kemungkinan menyebabkan:",
+ "windowsSymlinkAdminHint": "Windows: jalankan Agent Teams AI sebagai Administrator"
},
"models": {
"alreadyDefault": "Ini sudah menjadi standar OpenCode yang dipilih.",
@@ -64,7 +65,15 @@
"searchPlaceholder": "Cari model",
"selectProjectBeforeTesting": "Pilih konteks projek sebelum pengujian model.",
"selectProjectBeforeTestingDefaults": "Pilih konteks projek sebelum pengujian atau menyimpan baku OpenCode.",
- "useInTeamPicker": "Gunakan dalam tim picker"
+ "useInTeamPicker": "Gunakan dalam tim picker",
+ "testInProgress": "Pengujian model sudah berjalan.",
+ "validationContextRequired": "Pilih validation context di atas untuk mengaktifkan Test dan Set default. Menyimpan untuk team picker hanya menyimpan route untuk tim baru.",
+ "defaultSaveInProgress": "OpenCode default sedang disimpan.",
+ "routeUnavailableAuth": "Provider ini memerlukan autentikasi sebelum model ini dapat digunakan.",
+ "routeUnavailableFailed": "Model route ini gagal pada execution test terakhir.",
+ "routeUnavailableUnknown": "Model ini adalah OpenCode default saat ini, tetapi belum tersedia di live catalog.",
+ "actionsUnavailable": "Aksi sementara tidak tersedia.",
+ "routeUnavailableGeneric": "Model route ini tidak dapat digunakan sekarang."
},
"providers": {
"catalog": "Katalog penyedia OpenCode",
@@ -108,7 +117,8 @@
"needsTest": "membutuhkan tes",
"failed": "gagal",
"unknown": "tidak diketahui",
- "default": "baku"
+ "default": "baku",
+ "knownRoute": "route dikenal"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API kunci dikonfigurasi, tapi belum diverifikasi",
"apiKeyModeMissingCredential": "API mode kunci dipilih, tapi tidak ada API kunci dikonfigurasi",
"connectedVia": "Terhubung via {{method}}",
- "unableToVerify": "Tidak dapat memverifikasi"
+ "unableToVerify": "Tidak dapat memverifikasi",
+ "modelsAvailable": "Model tersedia"
},
"mode": {
"selectedAuth": "Auth yang dipilih: {{authMode}}",
diff --git a/src/features/localization/renderer/locales/id/team.json b/src/features/localization/renderer/locales/id/team.json
index cdbcdf5e..2d3fa801 100644
--- a/src/features/localization/renderer/locales/id/team.json
+++ b/src/features/localization/renderer/locales/id/team.json
@@ -28,7 +28,9 @@
"session": "sesi",
"stallNudge": "nudge kios",
"start": "awal",
- "workSync": "sinkronisasi kerja"
+ "workSync": "sinkronisasi kerja",
+ "agentError": "Kesalahan agen",
+ "apiError": "Kesalahan API"
},
"bootstrap": {
"acknowledged": "Bootstrap diakui",
@@ -77,7 +79,11 @@
"action": "Balas"
},
"activeTasks": {
- "inProgress": "Dalam proses"
+ "inProgress": "Dalam proses",
+ "expandInProgress": "Buka yang berlangsung",
+ "collapseInProgress": "Tutup yang berlangsung",
+ "reviewing": "meninjau",
+ "workingOn": "mengerjakan"
},
"expandDialog": {
"description": "Tampilan pesan yang diperluas"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "Data tim akan muncul setelah pemberian selesai",
"context": {
- "title": "Konteks"
+ "title": "Konteks",
+ "loading": "Memuat...",
+ "noSessionLoaded": "Sesi belum dimuat",
+ "closePanel": "Tutup panel konteks {{team}}",
+ "loadingContext": "Memuat konteks...",
+ "openLeadSession": "Buka sesi lead tim untuk melihat konteks."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "Tidak ditemukan sumber log.",
"ariaLabel": "Sumber log",
"leadLabel": "Lead",
- "selectSourceEmpty": "Pilih sumber log."
+ "selectSourceEmpty": "Pilih sumber log.",
+ "leadDescription": "Lead tim",
+ "removedLabel": "dihapus",
+ "removedDescription": "Dihapus"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} lagi",
"more_other": "+{{count}} lagi",
"more_few": "+{{count}} lagi",
- "more_many": "+{{count}} lagi"
+ "more_many": "+{{count}} lagi",
+ "unsupportedProvider": "Penyedia tidak didukung",
+ "openCodeLogsDelayed": "Log OpenCode tertunda",
+ "logsUnavailable": "Log tidak tersedia",
+ "noRecentLogs": "Tidak ada log terbaru",
+ "toolError": "Kesalahan alat",
+ "toolResult": "Hasil alat",
+ "toolUse": "Penggunaan alat",
+ "thinking": "Berpikir",
+ "error": "Kesalahan",
+ "logEvent": "Peristiwa log",
+ "noErrorOutput": "Tidak ada output error",
+ "noOutput": "Tidak ada output",
+ "noInput": "Tidak ada input"
},
"blockingEdge": {
"title": "Blocking Dependensi",
"blocks": "blok",
"close": "Tutup",
"blockingHiddenTasks": "Memblokir tugas tersembunyi",
- "blockedHiddenTasks": "Diblokir tugas tersembunyi"
+ "blockedHiddenTasks": "Diblokir tugas tersembunyi",
+ "links_one": "{{count}} tautan",
+ "links_other": "{{count}} tautan",
+ "hiddenBlockingLinks_one": "{{count}} tautan pemblokir tersembunyi",
+ "hiddenBlockingLinks_other": "{{count}} tautan pemblokir tersembunyi",
+ "hiddenTaskStack": "Tumpukan tugas tersembunyi",
+ "hiddenTasks_one": "{{count}} tugas tersembunyi",
+ "hiddenTasks_other": "{{count}} tugas tersembunyi",
+ "task": "Tugas",
+ "openBlockerStack": "Buka tumpukan pemblokir",
+ "openBlockedStack": "Buka tumpukan terblokir",
+ "openBlockerTask": "Buka tugas pemblokir",
+ "openBlockedTask": "Buka tugas terblokir"
},
"activityHud": {
"activity": "Aktivitas",
@@ -1778,7 +1817,11 @@
"autoRefresh": "Segarkan otomatis",
"wrapLines": "Lipat baris",
"loadingTail": "Memuat proses log tail...",
- "empty": "Belum ada berkas log proses yang ditangkap untuk anggota ini."
+ "empty": "Belum ada berkas log proses yang ditangkap untuk anggota ini.",
+ "copy": "Salin",
+ "fileEmpty": "File log proses kosong.",
+ "showingLast": "Menampilkan {{bytes}} terakhir.",
+ "showing": "Menampilkan {{bytes}}."
},
"tasks": {
"empty": "Tidak ada tugas yang ditugaskan ke anggota ini"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "Pasang atau coba ulang waktu berjalan OpenCode dari kartu status penyedia, kemudian buka kembali dialog ini.",
"openCodeAppMcpUnreachable": "Coba lagi meluncurkan untuk menyegarkan aplikasi OpenCode MCP bridge. Jika berulang, restart aplikasi dan waktu berjalan OpenCode.",
"cliBinaryMissing": "Pastikan Claude lokal CLI biner ada dan dapat dimulai, kemudian membuka kembali dialog ini.",
- "default": "Selesaikan masalah di atas, lalu buka kembali dialog ini."
+ "default": "Selesaikan masalah di atas, lalu buka kembali dialog ini.",
+ "openCodeNodeModulesSymlinkPermission": "Jalankan Agent Teams AI sebagai Administrator, lalu coba launch lagi."
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "Menjalankan Tim"
+ "title": "Menjalankan Tim",
+ "status": {
+ "active": "Aktif",
+ "provisioning": "Meluncurkan",
+ "idle": "Berjalan"
+ },
+ "noProject": "Tanpa proyek"
},
"layout": {
"maxPanesReached": "Maksimum {{count}} panel dicapai"
},
"codexReconnect": {
"description": "Sesi Codex Anda tampak basi. Reconnect untuk melanjutkan.",
- "useCode": "Gunakan kode"
+ "useCode": "Gunakan kode",
+ "generating": "Membuat...",
+ "openLogin": "Buka login",
+ "generateLink": "Buat tautan"
},
"effortLevel": {
"label": "Tingkat benteng (opsional)",
@@ -2428,6 +2481,7 @@
"customRole": "Peran kustom...",
"searchPlaceholder": "Cari peran...",
"empty": "Tidak ditemukan peran.",
- "reservedRole": "Peran ini dipesan"
+ "reservedRole": "Peran ini dipesan",
+ "emptyCustomRole": "Peran tidak boleh kosong"
}
}
diff --git a/src/features/localization/renderer/locales/ja/extensions.json b/src/features/localization/renderer/locales/ja/extensions.json
index f960a348..3ac14f47 100644
--- a/src/features/localization/renderer/locales/ja/extensions.json
+++ b/src/features/localization/renderer/locales/ja/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "APIキーを追加",
"addFirst": "最初のキーを追加",
- "edit": "編集"
+ "edit": "編集",
+ "copied": "コピーしました!",
+ "copyEnvVarName": "環境変数名をコピー",
+ "confirmDelete": "もう一度クリックして確認",
+ "delete": "削除"
},
"empty": {
"title": "保存されるAPIキー無し",
diff --git a/src/features/localization/renderer/locales/ja/settings.json b/src/features/localization/renderer/locales/ja/settings.json
index 3f42091b..3a03bee1 100644
--- a/src/features/localization/renderer/locales/ja/settings.json
+++ b/src/features/localization/renderer/locales/ja/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "コピッド",
"copy": "コピー診断",
"hints": "ヒント",
- "likelyCause": "同様に原因:"
+ "likelyCause": "同様に原因:",
+ "windowsSymlinkAdminHint": "Windows: Agent Teams AI を管理者として実行してください"
},
"models": {
"alreadyDefault": "これは既に選択したOpenCodeのデフォルトです。",
@@ -64,7 +65,15 @@
"searchPlaceholder": "モデルを検索",
"selectProjectBeforeTesting": "モデルをテストする前にプロジェクトコンテキストを選択します。",
"selectProjectBeforeTestingDefaults": "OpenCode のデフォルトをテストまたは保存する前に、プロジェクトコンテキストを選択します。",
- "useInTeamPicker": "チームピッカーでの使用"
+ "useInTeamPicker": "チームピッカーでの使用",
+ "testInProgress": "モデルテストはすでに実行中です。",
+ "validationContextRequired": "Test と Set default を有効にするには、上で validation context を選択してください。team picker への保存は新しいチーム用の route だけを保存します。",
+ "defaultSaveInProgress": "OpenCode default を保存しています。",
+ "routeUnavailableAuth": "この provider は、このモデルを使用する前に認証が必要です。",
+ "routeUnavailableFailed": "この model route は前回の execution test に失敗しました。",
+ "routeUnavailableUnknown": "このモデルは現在の OpenCode default ですが、まだ live catalog では利用できません。",
+ "actionsUnavailable": "操作は一時的に利用できません。",
+ "routeUnavailableGeneric": "この model route は現在使用できません。"
},
"providers": {
"catalog": "OpenCode プロバイダーカタログ",
@@ -108,7 +117,8 @@
"needsTest": "ニーズテスト",
"failed": "失敗",
"unknown": "インフォメーション",
- "default": "デフォルト"
+ "default": "デフォルト",
+ "knownRoute": "既知の route"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API のキーは構成しましたが、まだ確認されません",
"apiKeyModeMissingCredential": "API キーモードが選択されますが、API キーは構成されません",
"connectedVia": "{{method}}で接続",
- "unableToVerify": "確認できない"
+ "unableToVerify": "確認できない",
+ "modelsAvailable": "利用可能なモデル"
},
"mode": {
"selectedAuth": "選択されたauth: {{authMode}}",
diff --git a/src/features/localization/renderer/locales/ja/team.json b/src/features/localization/renderer/locales/ja/team.json
index 2f393406..00f6151a 100644
--- a/src/features/localization/renderer/locales/ja/team.json
+++ b/src/features/localization/renderer/locales/ja/team.json
@@ -28,7 +28,9 @@
"session": "セッション",
"stallNudge": "ステルナッジ",
"start": "スタート",
- "workSync": "作業同期"
+ "workSync": "作業同期",
+ "agentError": "エージェントエラー",
+ "apiError": "API エラー"
},
"bootstrap": {
"acknowledged": "ブーツストラップが認めた",
@@ -77,7 +79,11 @@
"action": "スタッフ"
},
"activeTasks": {
- "inProgress": "進行状況"
+ "inProgress": "進行状況",
+ "expandInProgress": "進行中を展開",
+ "collapseInProgress": "進行中を折りたたむ",
+ "reviewing": "レビュー中",
+ "workingOn": "作業中"
},
"expandDialog": {
"description": "メッセージビューを拡大"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "チームデータが完成したら表示されます。",
"context": {
- "title": "コンテンツ"
+ "title": "コンテンツ",
+ "loading": "読み込み中...",
+ "noSessionLoaded": "セッションが読み込まれていません",
+ "closePanel": "{{team}} のコンテキストパネルを閉じる",
+ "loadingContext": "コンテキストを読み込み中...",
+ "openLeadSession": "コンテキストを表示するにはチームリードのセッションを開いてください。"
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "ログソースが見つかりません。",
"ariaLabel": "ログソース",
"leadLabel": "リード",
- "selectSourceEmpty": "ログソースを選択します。"
+ "selectSourceEmpty": "ログソースを選択します。",
+ "leadDescription": "チームリード",
+ "removedLabel": "削除済み",
+ "removedDescription": "削除済み"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} より",
"more_other": "+{{count}} より",
"more_few": "+{{count}} より",
- "more_many": "+{{count}} より"
+ "more_many": "+{{count}} より",
+ "unsupportedProvider": "未対応のプロバイダー",
+ "openCodeLogsDelayed": "OpenCode ログが遅延しています",
+ "logsUnavailable": "ログを利用できません",
+ "noRecentLogs": "最近のログはありません",
+ "toolError": "ツールエラー",
+ "toolResult": "ツール結果",
+ "toolUse": "ツール使用",
+ "thinking": "思考中",
+ "error": "エラー",
+ "logEvent": "ログイベント",
+ "noErrorOutput": "エラー出力なし",
+ "noOutput": "出力なし",
+ "noInput": "入力なし"
},
"blockingEdge": {
"title": "依存症のブロック",
"blocks": "ブロック",
"close": "ふりがな",
"blockingHiddenTasks": "隠しタスクのブロック",
- "blockedHiddenTasks": "隠しタスクをブロック"
+ "blockedHiddenTasks": "隠しタスクをブロック",
+ "links_one": "{{count}} 件のリンク",
+ "links_other": "{{count}} 件のリンク",
+ "hiddenBlockingLinks_one": "{{count}} 件の非表示ブロックリンク",
+ "hiddenBlockingLinks_other": "{{count}} 件の非表示ブロックリンク",
+ "hiddenTaskStack": "非表示タスクスタック",
+ "hiddenTasks_one": "{{count}} 件の非表示タスク",
+ "hiddenTasks_other": "{{count}} 件の非表示タスク",
+ "task": "タスク",
+ "openBlockerStack": "ブロッカースタックを開く",
+ "openBlockedStack": "ブロック済みスタックを開く",
+ "openBlockerTask": "ブロッカータスクを開く",
+ "openBlockedTask": "ブロック済みタスクを開く"
},
"activityHud": {
"activity": "活動内容",
@@ -1778,7 +1817,11 @@
"autoRefresh": "オートリフレッシュ",
"wrapLines": "ラップライン",
"loadingTail": "ローディングプロセスログテール...",
- "empty": "まだこのメンバーの処理ログファイルはありません。"
+ "empty": "まだこのメンバーの処理ログファイルはありません。",
+ "copy": "コピー",
+ "fileEmpty": "プロセスログファイルは空です。",
+ "showingLast": "最後の {{bytes}} を表示しています。",
+ "showing": "{{bytes}} を表示しています。"
},
"tasks": {
"empty": "このメンバーに割り当てられたタスクはありません"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "プロバイダーのステータスカードからOpenCodeのランタイムをインストールまたは再試行し、このダイアログを再起動します。",
"openCodeAppMcpUnreachable": "OpenCodeアプリのMCPブリッジをリフレッシュするためのリトリー起動。 繰り返すと、アプリとOpenCodeのランタイムを再起動します。",
"cliBinaryMissing": "ローカルClaude CLIバイナリが存在し、起動できることを確認してください。その後、このダイアログが開きます。",
- "default": "上記の問題を解決し、このダイアログを再オープンします。"
+ "default": "上記の問題を解決し、このダイアログを再オープンします。",
+ "openCodeNodeModulesSymlinkPermission": "Agent Teams AI を管理者として実行してから、launch を再試行してください。"
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "ランニングチーム"
+ "title": "ランニングチーム",
+ "status": {
+ "active": "アクティブ",
+ "provisioning": "起動中",
+ "idle": "実行中"
+ },
+ "noProject": "プロジェクトなし"
},
"layout": {
"maxPanesReached": "{{count}}のパンが到達する最大"
},
"codexReconnect": {
"description": "Codex のセッションはストール表示されます。 続行する再接続。",
- "useCode": "コードを使用する"
+ "useCode": "コードを使用する",
+ "generating": "生成中...",
+ "openLogin": "ログインを開く",
+ "generateLink": "リンクを生成"
},
"effortLevel": {
"label": "努力レベル(任意)",
@@ -2428,6 +2481,7 @@
"customRole": "カスタムロール...",
"searchPlaceholder": "役割を検索...",
"empty": "役割が見つかりません。",
- "reservedRole": "この役割は、"
+ "reservedRole": "この役割は、",
+ "emptyCustomRole": "ロールを空にすることはできません"
}
}
diff --git a/src/features/localization/renderer/locales/ko/extensions.json b/src/features/localization/renderer/locales/ko/extensions.json
index 770be18a..aaa27e55 100644
--- a/src/features/localization/renderer/locales/ko/extensions.json
+++ b/src/features/localization/renderer/locales/ko/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "API 키 추가",
"addFirst": "첫 키 추가",
- "edit": "제품정보"
+ "edit": "제품정보",
+ "copied": "복사됨!",
+ "copyEnvVarName": "환경 변수 이름 복사",
+ "confirmDelete": "다시 클릭하여 확인",
+ "delete": "삭제"
},
"empty": {
"title": "저장되는 API 열쇠 없음",
diff --git a/src/features/localization/renderer/locales/ko/settings.json b/src/features/localization/renderer/locales/ko/settings.json
index ba18492b..3d5ccb05 100644
--- a/src/features/localization/renderer/locales/ko/settings.json
+++ b/src/features/localization/renderer/locales/ko/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "뚱 베어",
"copy": "복사 진단",
"hints": "뚱 베어",
- "likelyCause": "같은 원인:"
+ "likelyCause": "같은 원인:",
+ "windowsSymlinkAdminHint": "Windows: Agent Teams AI를 관리자 권한으로 실행하세요"
},
"models": {
"alreadyDefault": "이미 선택한 OpenCode 기본값입니다.",
@@ -64,7 +65,15 @@
"searchPlaceholder": "검색 모델",
"selectProjectBeforeTesting": "모델을 테스트하기 전에 프로젝트 컨텍스트를 선택하십시오.",
"selectProjectBeforeTestingDefaults": "OpenCode 기본값을 테스트하거나 저장하기 전에 프로젝트 컨텍스트를 선택하십시오.",
- "useInTeamPicker": "팀 피커에서 사용"
+ "useInTeamPicker": "팀 피커에서 사용",
+ "testInProgress": "모델 테스트가 이미 실행 중입니다.",
+ "validationContextRequired": "Test와 Set default를 활성화하려면 위에서 validation context를 선택하세요. team picker 저장은 새 팀용 route만 저장합니다.",
+ "defaultSaveInProgress": "OpenCode default를 저장하는 중입니다.",
+ "routeUnavailableAuth": "이 provider는 이 모델을 사용하기 전에 인증이 필요합니다.",
+ "routeUnavailableFailed": "이 model route는 마지막 execution test에 실패했습니다.",
+ "routeUnavailableUnknown": "이 모델은 현재 OpenCode default이지만 아직 live catalog에서 사용할 수 없습니다.",
+ "actionsUnavailable": "작업을 일시적으로 사용할 수 없습니다.",
+ "routeUnavailableGeneric": "이 model route는 지금 사용할 수 없습니다."
},
"providers": {
"catalog": "OpenCode 공급자 카탈로그",
@@ -108,7 +117,8 @@
"needsTest": "자주 묻는 질문",
"failed": "실패한",
"unknown": "이름 *",
- "default": "기본 정보"
+ "default": "기본 정보",
+ "knownRoute": "알려진 route"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API 키 구성, 하지만 아직 확인 되지",
"apiKeyModeMissingCredential": "API 키 모드 선택, 하지만 API 키 구성",
"connectedVia": "{{method}}를 통해 연결",
- "unableToVerify": "자주 묻는 질문"
+ "unableToVerify": "자주 묻는 질문",
+ "modelsAvailable": "사용 가능한 모델"
},
"mode": {
"selectedAuth": "선택된 오: {{authMode}}",
diff --git a/src/features/localization/renderer/locales/ko/team.json b/src/features/localization/renderer/locales/ko/team.json
index b3f41d7e..513c8568 100644
--- a/src/features/localization/renderer/locales/ko/team.json
+++ b/src/features/localization/renderer/locales/ko/team.json
@@ -28,7 +28,9 @@
"session": "이름 *",
"stallNudge": "연락처",
"start": "시작하기",
- "workSync": "작업 동기화"
+ "workSync": "작업 동기화",
+ "agentError": "에이전트 오류",
+ "apiError": "API 오류"
},
"bootstrap": {
"acknowledged": "부트 스트랩 승인",
@@ -77,7 +79,11 @@
"action": "이름 *"
},
"activeTasks": {
- "inProgress": "진행 중"
+ "inProgress": "진행 중",
+ "expandInProgress": "진행 중 펼치기",
+ "collapseInProgress": "진행 중 접기",
+ "reviewing": "검토 중",
+ "workingOn": "작업 중"
},
"expandDialog": {
"description": "확장된 메시지 보기"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "팀 데이터는 일단 완료되면 나타납니다",
"context": {
- "title": "설정하기"
+ "title": "설정하기",
+ "loading": "로딩 중...",
+ "noSessionLoaded": "세션이 로드되지 않음",
+ "closePanel": "{{team}} 컨텍스트 패널 닫기",
+ "loadingContext": "컨텍스트 로딩 중...",
+ "openLeadSession": "컨텍스트를 보려면 팀 리드 세션을 여세요."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "로그 소스가 없습니다.",
"ariaLabel": "로그 소스",
"leadLabel": "제품정보",
- "selectSourceEmpty": "로그 소스를 선택합니다."
+ "selectSourceEmpty": "로그 소스를 선택합니다.",
+ "leadDescription": "팀 리드",
+ "removedLabel": "제거됨",
+ "removedDescription": "제거됨"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} 더보기",
"more_other": "+{{count}} 더보기",
"more_few": "+{{count}} 더보기",
- "more_many": "+{{count}} 더보기"
+ "more_many": "+{{count}} 더보기",
+ "unsupportedProvider": "지원되지 않는 제공자",
+ "openCodeLogsDelayed": "OpenCode 로그 지연됨",
+ "logsUnavailable": "로그를 사용할 수 없음",
+ "noRecentLogs": "최근 로그 없음",
+ "toolError": "도구 오류",
+ "toolResult": "도구 결과",
+ "toolUse": "도구 사용",
+ "thinking": "생각 중",
+ "error": "오류",
+ "logEvent": "로그 이벤트",
+ "noErrorOutput": "오류 출력 없음",
+ "noOutput": "출력 없음",
+ "noInput": "입력 없음"
},
"blockingEdge": {
"title": "블록 의존성",
"blocks": "제품정보",
"close": "이름 *",
"blockingHiddenTasks": "숨겨진 작업을 차단",
- "blockedHiddenTasks": "숨겨진 작업을 차단"
+ "blockedHiddenTasks": "숨겨진 작업을 차단",
+ "links_one": "{{count}}개 링크",
+ "links_other": "{{count}}개 링크",
+ "hiddenBlockingLinks_one": "{{count}}개의 숨겨진 차단 링크",
+ "hiddenBlockingLinks_other": "{{count}}개의 숨겨진 차단 링크",
+ "hiddenTaskStack": "숨겨진 작업 스택",
+ "hiddenTasks_one": "{{count}}개 숨겨진 작업",
+ "hiddenTasks_other": "{{count}}개 숨겨진 작업",
+ "task": "작업",
+ "openBlockerStack": "차단 작업 스택 열기",
+ "openBlockedStack": "차단된 작업 스택 열기",
+ "openBlockerTask": "차단 작업 열기",
+ "openBlockedTask": "차단된 작업 열기"
},
"activityHud": {
"activity": "- 연혁",
@@ -1778,7 +1817,11 @@
"autoRefresh": "자동차 수리",
"wrapLines": "포장 라인",
"loadingTail": "적재 공정 로그 꼬리...",
- "empty": "아직이 회원을 위해 캡처 된 프로세스 로그 파일 없음."
+ "empty": "아직이 회원을 위해 캡처 된 프로세스 로그 파일 없음.",
+ "copy": "복사",
+ "fileEmpty": "프로세스 로그 파일이 비어 있습니다.",
+ "showingLast": "마지막 {{bytes}} 표시 중.",
+ "showing": "{{bytes}} 표시 중."
},
"tasks": {
"empty": "이 회원에게 할당된 작업 없음"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "공급자 상태 카드에서 OpenCode 런타임을 설치하거나 재시작하면 이 대화 상자를 다시 엽니다.",
"openCodeAppMcpUnreachable": "OpenCode 앱 MCP 브리지를 새로 고침합니다. 반복하면 앱과 OpenCode runtime을 다시 시작합니다.",
"cliBinaryMissing": "로컬 클로드 CLI 바이너리가 존재하고 시작할 수 있는지 확인하고, 이 대화 상자를 다시 엽니다.",
- "default": "위의 문제를 해결 한 다음이 대화 상자를 다시 엽니다."
+ "default": "위의 문제를 해결 한 다음이 대화 상자를 다시 엽니다.",
+ "openCodeNodeModulesSymlinkPermission": "Agent Teams AI를 관리자 권한으로 실행한 다음 launch를 다시 시도하세요."
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "팀 실행"
+ "title": "팀 실행",
+ "status": {
+ "active": "활성",
+ "provisioning": "시작 중",
+ "idle": "실행 중"
+ },
+ "noProject": "프로젝트 없음"
},
"layout": {
"maxPanesReached": "{{count}} 팬의 최대 도달"
},
"codexReconnect": {
"description": "Codex 세션은 stale이 나타납니다. 계속 연결.",
- "useCode": "사용 코드"
+ "useCode": "사용 코드",
+ "generating": "생성 중...",
+ "openLogin": "로그인 열기",
+ "generateLink": "링크 생성"
},
"effortLevel": {
"label": "(선택) Effort 수준",
@@ -2428,6 +2481,7 @@
"customRole": "사용자 정의 역할...",
"searchPlaceholder": "검색 역할...",
"empty": "찾을 수 없음.",
- "reservedRole": "이 역할은"
+ "reservedRole": "이 역할은",
+ "emptyCustomRole": "역할은 비워 둘 수 없습니다"
}
}
diff --git a/src/features/localization/renderer/locales/pt/extensions.json b/src/features/localization/renderer/locales/pt/extensions.json
index b6d9923e..d25cb7ec 100644
--- a/src/features/localization/renderer/locales/pt/extensions.json
+++ b/src/features/localization/renderer/locales/pt/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "Adicionar chave API",
"addFirst": "Adicionar sua primeira chave",
- "edit": "Editar"
+ "edit": "Editar",
+ "copied": "Copiado!",
+ "copyEnvVarName": "Copiar nome da variável env",
+ "confirmDelete": "Clique novamente para confirmar",
+ "delete": "Excluir"
},
"empty": {
"title": "Nenhuma chave API salva",
diff --git a/src/features/localization/renderer/locales/pt/settings.json b/src/features/localization/renderer/locales/pt/settings.json
index 66a3e975..5a4ef2bb 100644
--- a/src/features/localization/renderer/locales/pt/settings.json
+++ b/src/features/localization/renderer/locales/pt/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "Copiado",
"copy": "Copiar diagnósticos",
"hints": "Dica",
- "likelyCause": "Provável causa:"
+ "likelyCause": "Provável causa:",
+ "windowsSymlinkAdminHint": "Windows: execute o Agent Teams AI como administrador"
},
"models": {
"alreadyDefault": "Este já é o padrão OpenCode selecionado.",
@@ -64,7 +65,15 @@
"searchPlaceholder": "Pesquisar modelos",
"selectProjectBeforeTesting": "Selecione um contexto de projeto antes de testar modelos.",
"selectProjectBeforeTestingDefaults": "Selecione um contexto de projeto antes de testar ou salvar padrões do OpenCode.",
- "useInTeamPicker": "Uso no selecionador de equipe"
+ "useInTeamPicker": "Uso no selecionador de equipe",
+ "testInProgress": "O teste do modelo já está em execução.",
+ "validationContextRequired": "Selecione um contexto de validação acima para habilitar Test e Set default. Salvar para team picker apenas guarda a route para novas equipes.",
+ "defaultSaveInProgress": "O OpenCode default está sendo salvo.",
+ "routeUnavailableAuth": "Este provider exige autenticação antes que este modelo possa ser usado.",
+ "routeUnavailableFailed": "Esta model route falhou no último execution test.",
+ "routeUnavailableUnknown": "Este modelo é o OpenCode default atual, mas ainda não está disponível no live catalog.",
+ "actionsUnavailable": "As ações estão temporariamente indisponíveis.",
+ "routeUnavailableGeneric": "Esta model route não pode ser usada agora."
},
"providers": {
"catalog": "Catálogo de fornecedores OpenCode",
@@ -108,7 +117,8 @@
"needsTest": "teste das necessidades",
"failed": "falhou",
"unknown": "desconhecido",
- "default": "padrão"
+ "default": "padrão",
+ "knownRoute": "route conhecida"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "Chave API configurada, mas ainda não verificada",
"apiKeyModeMissingCredential": "Modo chave API selecionado, mas nenhuma chave API está configurada",
"connectedVia": "Ligado via {{method}}",
- "unableToVerify": "Não foi possível verificar"
+ "unableToVerify": "Não foi possível verificar",
+ "modelsAvailable": "Modelos disponíveis"
},
"mode": {
"selectedAuth": "Autorização seleccionada: {{authMode}}",
diff --git a/src/features/localization/renderer/locales/pt/team.json b/src/features/localization/renderer/locales/pt/team.json
index 365ff9b3..15d4017d 100644
--- a/src/features/localization/renderer/locales/pt/team.json
+++ b/src/features/localization/renderer/locales/pt/team.json
@@ -28,7 +28,9 @@
"session": "sessão",
"stallNudge": "empatar o empurrão",
"start": "início",
- "workSync": "sincronização de trabalho"
+ "workSync": "sincronização de trabalho",
+ "agentError": "Erro do agente",
+ "apiError": "Erro de API"
},
"bootstrap": {
"acknowledged": "Bootstrap reconhecido",
@@ -77,7 +79,11 @@
"action": "Responder"
},
"activeTasks": {
- "inProgress": "Em curso"
+ "inProgress": "Em curso",
+ "expandInProgress": "Expandir em andamento",
+ "collapseInProgress": "Recolher em andamento",
+ "reviewing": "revisando",
+ "workingOn": "trabalhando em"
},
"expandDialog": {
"description": "Visualização de mensagens expandida"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "Os dados da equipe aparecerão assim que o provimento terminar",
"context": {
- "title": "Contexto"
+ "title": "Contexto",
+ "loading": "Carregando...",
+ "noSessionLoaded": "Sessão não carregada",
+ "closePanel": "Fechar painel de contexto de {{team}}",
+ "loadingContext": "Carregando contexto...",
+ "openLeadSession": "Abra a sessão do líder da equipe para ver o contexto."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "Nenhuma fonte de registro encontrada.",
"ariaLabel": "Origem do registo",
"leadLabel": "Chumbo",
- "selectSourceEmpty": "Selecione uma fonte de registro."
+ "selectSourceEmpty": "Selecione uma fonte de registro.",
+ "leadDescription": "Líder da equipe",
+ "removedLabel": "removido",
+ "removedDescription": "Removido"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} mais",
"more_other": "+{{count}} mais",
"more_few": "+{{count}} mais",
- "more_many": "+{{count}} mais"
+ "more_many": "+{{count}} mais",
+ "unsupportedProvider": "Provedor não compatível",
+ "openCodeLogsDelayed": "Logs do OpenCode atrasados",
+ "logsUnavailable": "Logs indisponíveis",
+ "noRecentLogs": "Nenhum log recente",
+ "toolError": "Erro da ferramenta",
+ "toolResult": "Resultado da ferramenta",
+ "toolUse": "Uso da ferramenta",
+ "thinking": "Pensando",
+ "error": "Erro",
+ "logEvent": "Evento de log",
+ "noErrorOutput": "Sem saída de erro",
+ "noOutput": "Sem saída",
+ "noInput": "Sem entrada"
},
"blockingEdge": {
"title": "Dependência de Bloqueamento",
"blocks": "blocos",
"close": "Fechar",
"blockingHiddenTasks": "Bloqueando tarefas ocultas",
- "blockedHiddenTasks": "Tarefas ocultas bloqueadas"
+ "blockedHiddenTasks": "Tarefas ocultas bloqueadas",
+ "links_one": "{{count}} link",
+ "links_other": "{{count}} links",
+ "hiddenBlockingLinks_one": "{{count}} link bloqueante oculto",
+ "hiddenBlockingLinks_other": "{{count}} links bloqueantes ocultos",
+ "hiddenTaskStack": "Pilha de tarefas ocultas",
+ "hiddenTasks_one": "{{count}} tarefa oculta",
+ "hiddenTasks_other": "{{count}} tarefas ocultas",
+ "task": "Tarefa",
+ "openBlockerStack": "Abrir pilha bloqueadora",
+ "openBlockedStack": "Abrir pilha bloqueada",
+ "openBlockerTask": "Abrir tarefa bloqueadora",
+ "openBlockedTask": "Abrir tarefa bloqueada"
},
"activityHud": {
"activity": "Actividade",
@@ -1778,7 +1817,11 @@
"autoRefresh": "Actualizar automaticamente",
"wrapLines": "Quebrar linhas",
"loadingTail": "A carregar a cauda do registo do processo...",
- "empty": "Nenhum arquivo de registro de processo capturado para este membro ainda."
+ "empty": "Nenhum arquivo de registro de processo capturado para este membro ainda.",
+ "copy": "Copiar",
+ "fileEmpty": "O arquivo de log do processo está vazio.",
+ "showingLast": "Mostrando os últimos {{bytes}}.",
+ "showing": "Mostrando {{bytes}}."
},
"tasks": {
"empty": "Nenhuma tarefa atribuída a este membro"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "Instale ou tente novamente o tempo de execução do OpenCode a partir do cartão de status do provedor e então reabra esta janela.",
"openCodeAppMcpUnreachable": "Repetir o lançamento para atualizar o aplicativo OpenCode MCP ponte. Se repetir, reinicie o aplicativo e o tempo de execução do OpenCode.",
"cliBinaryMissing": "Certifique-se de que o binário local Claude CLI exista e possa ser iniciado, e então reabra esta janela.",
- "default": "Resolver o problema acima e depois reabrir esta janela."
+ "default": "Resolver o problema acima e depois reabrir esta janela.",
+ "openCodeNodeModulesSymlinkPermission": "Execute o Agent Teams AI como administrador e tente o launch novamente."
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "Equipas em Execução"
+ "title": "Equipas em Execução",
+ "status": {
+ "active": "Ativa",
+ "provisioning": "Iniciando",
+ "idle": "Em execução"
+ },
+ "noProject": "Sem projeto"
},
"layout": {
"maxPanesReached": "Máximo de painéis {{count}} alcançados"
},
"codexReconnect": {
"description": "A tua sessão do Códice parece estar estagnada. Reconectar para continuar.",
- "useCode": "Usar código"
+ "useCode": "Usar código",
+ "generating": "Gerando...",
+ "openLogin": "Abrir login",
+ "generateLink": "Gerar link"
},
"effortLevel": {
"label": "Nível de esforço (opcional)",
@@ -2428,6 +2481,7 @@
"customRole": "Papel personalizado...",
"searchPlaceholder": "Procurar papéis...",
"empty": "Nenhum papel encontrado.",
- "reservedRole": "Este papel é reservado"
+ "reservedRole": "Este papel é reservado",
+ "emptyCustomRole": "A função não pode estar vazia"
}
}
diff --git a/src/features/localization/renderer/locales/ru/extensions.json b/src/features/localization/renderer/locales/ru/extensions.json
index a3f437d8..c7c0ae51 100644
--- a/src/features/localization/renderer/locales/ru/extensions.json
+++ b/src/features/localization/renderer/locales/ru/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "Добавить API key",
"addFirst": "Добавить первый key",
- "edit": "Редактировать"
+ "edit": "Редактировать",
+ "copied": "Скопировано!",
+ "copyEnvVarName": "Копировать имя env-переменной",
+ "confirmDelete": "Нажмите еще раз для подтверждения",
+ "delete": "Удалить"
},
"empty": {
"title": "API keys не сохранены",
diff --git a/src/features/localization/renderer/locales/ru/settings.json b/src/features/localization/renderer/locales/ru/settings.json
index f9a89a76..290afb2a 100644
--- a/src/features/localization/renderer/locales/ru/settings.json
+++ b/src/features/localization/renderer/locales/ru/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "Скопировано",
"copy": "Скопировать diagnostics",
"hints": "Подсказки",
- "likelyCause": "Вероятная причина:"
+ "likelyCause": "Вероятная причина:",
+ "windowsSymlinkAdminHint": "Windows: запустите Agent Teams AI от имени администратора"
},
"models": {
"alreadyDefault": "Это уже выбранный OpenCode default.",
diff --git a/src/features/localization/renderer/locales/ru/team.json b/src/features/localization/renderer/locales/ru/team.json
index ad176aef..8c978993 100644
--- a/src/features/localization/renderer/locales/ru/team.json
+++ b/src/features/localization/renderer/locales/ru/team.json
@@ -28,7 +28,9 @@
"session": "session",
"stallNudge": "stall nudge",
"start": "start",
- "workSync": "work sync"
+ "workSync": "work sync",
+ "agentError": "Ошибка агента",
+ "apiError": "Ошибка API"
},
"bootstrap": {
"acknowledged": "Bootstrap подтверждён",
@@ -77,7 +79,11 @@
"action": "Ответить"
},
"activeTasks": {
- "inProgress": "В работе"
+ "inProgress": "В работе",
+ "expandInProgress": "Развернуть задачи в работе",
+ "collapseInProgress": "Свернуть задачи в работе",
+ "reviewing": "ревьюит",
+ "workingOn": "работает над"
},
"expandDialog": {
"description": "Развёрнутый просмотр сообщения"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "Данные команды появятся после завершения provisioning",
"context": {
- "title": "Контекст"
+ "title": "Контекст",
+ "loading": "Загрузка...",
+ "noSessionLoaded": "Сессия не загружена",
+ "closePanel": "Закрыть панель контекста {{team}}",
+ "loadingContext": "Загрузка контекста...",
+ "openLeadSession": "Откройте сессию лида команды, чтобы посмотреть контекст."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "Источники логов не найдены.",
"ariaLabel": "Источник логов",
"leadLabel": "Лид",
- "selectSourceEmpty": "Выберите источник логов."
+ "selectSourceEmpty": "Выберите источник логов.",
+ "leadDescription": "Лид команды",
+ "removedLabel": "удален",
+ "removedDescription": "Удален"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} ещё",
"more_few": "+{{count}} ещё",
"more_many": "+{{count}} ещё",
- "more_other": "+{{count}} ещё"
+ "more_other": "+{{count}} ещё",
+ "unsupportedProvider": "Провайдер не поддерживается",
+ "openCodeLogsDelayed": "Логи OpenCode задерживаются",
+ "logsUnavailable": "Логи недоступны",
+ "noRecentLogs": "Нет недавних логов",
+ "toolError": "Ошибка инструмента",
+ "toolResult": "Результат инструмента",
+ "toolUse": "Вызов инструмента",
+ "thinking": "Размышление",
+ "error": "Ошибка",
+ "logEvent": "Событие лога",
+ "noErrorOutput": "Нет вывода ошибки",
+ "noOutput": "Нет вывода",
+ "noInput": "Нет входных данных"
},
"blockingEdge": {
"title": "Блокирующая зависимость",
"blocks": "блокирует",
"close": "Закрыть",
"blockingHiddenTasks": "Скрытые блокирующие задачи",
- "blockedHiddenTasks": "Скрытые заблокированные задачи"
+ "blockedHiddenTasks": "Скрытые заблокированные задачи",
+ "links_one": "{{count}} связь",
+ "links_other": "{{count}} связи",
+ "hiddenBlockingLinks_one": "{{count}} скрытая блокирующая связь",
+ "hiddenBlockingLinks_other": "{{count}} скрытые блокирующие связи",
+ "hiddenTaskStack": "Стек скрытых задач",
+ "hiddenTasks_one": "{{count}} скрытая задача",
+ "hiddenTasks_other": "{{count}} скрытые задачи",
+ "task": "Задача",
+ "openBlockerStack": "Открыть стек блокирующих задач",
+ "openBlockedStack": "Открыть стек заблокированных задач",
+ "openBlockerTask": "Открыть блокирующую задачу",
+ "openBlockedTask": "Открыть заблокированную задачу"
},
"activityHud": {
"activity": "Активность",
@@ -1778,7 +1817,11 @@
"autoRefresh": "Автообновление",
"wrapLines": "Перенос строк",
"loadingTail": "Загрузка хвоста лога процесса...",
- "empty": "Лог процесса для этого участника пока не сохранен."
+ "empty": "Лог процесса для этого участника пока не сохранен.",
+ "copy": "Копировать",
+ "fileEmpty": "Файл лога процесса пуст.",
+ "showingLast": "Показаны последние {{bytes}}.",
+ "showing": "Показано {{bytes}}."
},
"tasks": {
"empty": "У этого участника нет назначенных задач"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "Установите или повторите запуск runtime OpenCode из карточки статуса провайдера, затем откройте этот диалог заново.",
"openCodeAppMcpUnreachable": "Повторите launch, чтобы обновить OpenCode app MCP bridge. Если повторится, перезапустите приложение и runtime OpenCode.",
"cliBinaryMissing": "Убедитесь, что локальный бинарь Claude CLI существует и может запускаться, затем откройте этот диалог заново.",
- "default": "Исправьте проблему выше, затем откройте этот диалог заново."
+ "default": "Исправьте проблему выше, затем откройте этот диалог заново.",
+ "openCodeNodeModulesSymlinkPermission": "Запустите Agent Teams AI от имени администратора, затем повторите launch."
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "Активные команды"
+ "title": "Активные команды",
+ "status": {
+ "active": "Активна",
+ "provisioning": "Запускается",
+ "idle": "Работает"
+ },
+ "noProject": "Без проекта"
},
"layout": {
"maxPanesReached": "Достигнут максимум панелей: {{count}}"
},
"codexReconnect": {
"description": "Сессия Codex выглядит устаревшей. Переподключитесь, чтобы продолжить.",
- "useCode": "Использовать код"
+ "useCode": "Использовать код",
+ "generating": "Генерируется...",
+ "openLogin": "Открыть вход",
+ "generateLink": "Создать ссылку"
},
"effortLevel": {
"label": "Уровень усилий (опционально)",
@@ -2428,6 +2481,7 @@
"customRole": "Своя роль...",
"searchPlaceholder": "Поиск ролей...",
"empty": "Роли не найдены.",
- "reservedRole": "Эта роль зарезервирована"
+ "reservedRole": "Эта роль зарезервирована",
+ "emptyCustomRole": "Роль не может быть пустой"
}
}
diff --git a/src/features/localization/renderer/locales/ur/extensions.json b/src/features/localization/renderer/locales/ur/extensions.json
index a43efe0c..08bfcb32 100644
--- a/src/features/localization/renderer/locales/ur/extensions.json
+++ b/src/features/localization/renderer/locales/ur/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "شامل کریں API کلید",
"addFirst": "اپنی پہلی کلید کو شامل کریں",
- "edit": "مرتب"
+ "edit": "مرتب",
+ "copied": "Copy ہو گیا!",
+ "copyEnvVarName": "Env var name copy کریں",
+ "confirmDelete": "Confirm کے لیے دوبارہ کلک کریں",
+ "delete": "Delete"
},
"empty": {
"title": "نہیں API کلید محفوظ کریں",
diff --git a/src/features/localization/renderer/locales/ur/settings.json b/src/features/localization/renderer/locales/ur/settings.json
index 9c380234..f58cf7f1 100644
--- a/src/features/localization/renderer/locales/ur/settings.json
+++ b/src/features/localization/renderer/locales/ur/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "کوس",
"copy": "نقل و حمل",
"hints": "حساب",
- "likelyCause": "غالباً وجہ:"
+ "likelyCause": "غالباً وجہ:",
+ "windowsSymlinkAdminHint": "Windows: Agent Teams AI کو Administrator کے طور پر چلائیں"
},
"models": {
"alreadyDefault": "یہ پہلے سے ہی منتخب اوپن سی ڈی کوڈ ہے.",
@@ -64,7 +65,15 @@
"searchPlaceholder": "تلاش کے ماڈل",
"selectProjectBeforeTesting": "ماڈلوں کا ٹیسٹ کرنے سے پہلے منصوبہ بندی انتخاب کریں۔",
"selectProjectBeforeTestingDefaults": "OpenCode دیس کو ٹیسٹ کرنے یا محفوظ کرنے سے پہلے منصوبہ بندی منتخب کریں۔",
- "useInTeamPicker": "ٹیم چیسٹر میں استعمال ہوتی ہے۔"
+ "useInTeamPicker": "ٹیم چیسٹر میں استعمال ہوتی ہے۔",
+ "testInProgress": "ماڈل ٹیسٹ پہلے ہی چل رہا ہے۔",
+ "validationContextRequired": "Test اور Set default فعال کرنے کے لیے اوپر validation context منتخب کریں۔ team picker کے لیے محفوظ کرنا صرف نئی ٹیموں کے لیے route محفوظ کرتا ہے۔",
+ "defaultSaveInProgress": "OpenCode default محفوظ ہو رہا ہے۔",
+ "routeUnavailableAuth": "اس model کو استعمال کرنے سے پہلے اس provider کو authentication چاہیے۔",
+ "routeUnavailableFailed": "یہ model route آخری execution test میں ناکام ہوا۔",
+ "routeUnavailableUnknown": "یہ model موجودہ OpenCode default ہے، مگر ابھی live catalog میں دستیاب نہیں۔",
+ "actionsUnavailable": "کارروائیاں عارضی طور پر دستیاب نہیں ہیں۔",
+ "routeUnavailableGeneric": "یہ model route اس وقت استعمال نہیں ہو سکتا۔"
},
"providers": {
"catalog": "کھولیں",
@@ -108,7 +117,8 @@
"needsTest": "ضرورت",
"failed": "ناکام ہوا",
"unknown": "نامعلوم",
- "default": "طے شدہ"
+ "default": "طے شدہ",
+ "knownRoute": "معروف route"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API کلیدی ربط ، لیکن ابھی تصدیق نہیں ہوئی",
"apiKeyModeMissingCredential": "API کلیدی طریقہ انتخاب کرتا ہے لیکن کوئی نہیں API کلیدی کلید",
"connectedVia": "جواب {{method}}",
- "unableToVerify": "درستگی حاصل کرنے کے قابل"
+ "unableToVerify": "درستگی حاصل کرنے کے قابل",
+ "modelsAvailable": "ماڈلز دستیاب ہیں"
},
"mode": {
"selectedAuth": "منتخب شدہ Auth: {{authMode}}",
diff --git a/src/features/localization/renderer/locales/ur/team.json b/src/features/localization/renderer/locales/ur/team.json
index 19f05cca..ffb640c5 100644
--- a/src/features/localization/renderer/locales/ur/team.json
+++ b/src/features/localization/renderer/locales/ur/team.json
@@ -28,7 +28,9 @@
"session": "سیشن",
"stallNudge": "غیر متصل",
"start": "شروع کریں",
- "workSync": "کامک"
+ "workSync": "کامک",
+ "agentError": "Agent Error",
+ "apiError": "API Error"
},
"bootstrap": {
"acknowledged": "بوٹسٹرپ نے اعتراف کیا",
@@ -77,7 +79,11 @@
"action": "انکار کرو"
},
"activeTasks": {
- "inProgress": "ترقی"
+ "inProgress": "ترقی",
+ "expandInProgress": "In progress پھیلائیں",
+ "collapseInProgress": "In progress سمیٹیں",
+ "reviewing": "review کر رہا ہے",
+ "workingOn": "کام کر رہا ہے"
},
"expandDialog": {
"description": "پیغام کا نقطۂنظر"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "ٹیم کے اعداد و شمار ایک مرتبہ مکمل ہونے والی فراہمی نظر آئیں گے۔",
"context": {
- "title": "پرنٹ"
+ "title": "پرنٹ",
+ "loading": "لوڈ ہو رہا ہے...",
+ "noSessionLoaded": "Session loaded نہیں",
+ "closePanel": "{{team}} context panel بند کریں",
+ "loadingContext": "Context لوڈ ہو رہا ہے...",
+ "openLeadSession": "Context دیکھنے کے لیے team lead session کھولیں."
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "کوئی لاگ چشمہ دریافت نہیں کیا گیا.",
"ariaLabel": "لاگ سرسید",
"leadLabel": "پیشوائی",
- "selectSourceEmpty": "لاگ ماخوذ منتخب کريں"
+ "selectSourceEmpty": "لاگ ماخوذ منتخب کريں",
+ "leadDescription": "Team Lead",
+ "removedLabel": "ہٹا دیا گیا",
+ "removedDescription": "ہٹا دیا گیا"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+{{count}} مزید",
"more_other": "+{{count}} مزید",
"more_few": "+{{count}} مزید",
- "more_many": "+{{count}} مزید"
+ "more_many": "+{{count}} مزید",
+ "unsupportedProvider": "Provider supported نہیں",
+ "openCodeLogsDelayed": "OpenCode logs delayed ہیں",
+ "logsUnavailable": "Logs available نہیں",
+ "noRecentLogs": "کوئی حالیہ logs نہیں",
+ "toolError": "Tool error",
+ "toolResult": "Tool result",
+ "toolUse": "Tool use",
+ "thinking": "Thinking",
+ "error": "Error",
+ "logEvent": "Log event",
+ "noErrorOutput": "کوئی error output نہیں",
+ "noOutput": "کوئی output نہیں",
+ "noInput": "کوئی input نہیں"
},
"blockingEdge": {
"title": "حد بندی",
"blocks": "بلاک",
"close": "بندکرو",
"blockingHiddenTasks": "خفیہ کام بند کرنا",
- "blockedHiddenTasks": "خفیہ کام بند کیا گیا"
+ "blockedHiddenTasks": "خفیہ کام بند کیا گیا",
+ "links_one": "{{count}} لنک",
+ "links_other": "{{count}} لنکس",
+ "hiddenBlockingLinks_one": "{{count}} پوشیدہ blocking link",
+ "hiddenBlockingLinks_other": "{{count}} پوشیدہ blocking links",
+ "hiddenTaskStack": "پوشیدہ کاموں کا stack",
+ "hiddenTasks_one": "{{count}} پوشیدہ کام",
+ "hiddenTasks_other": "{{count}} پوشیدہ کام",
+ "task": "کام",
+ "openBlockerStack": "Blocker stack کھولیں",
+ "openBlockedStack": "Blocked stack کھولیں",
+ "openBlockerTask": "Blocker task کھولیں",
+ "openBlockedTask": "Blocked task کھولیں"
},
"activityHud": {
"activity": "غیر متصل",
@@ -1778,7 +1817,11 @@
"autoRefresh": "خود کار محفوظ",
"wrapLines": "لائنیں",
"loadingTail": "عمل log ob...",
- "empty": "اس ممبر کے لیے ابھی تک کوئی عمل دخل log فائل نہیں لی گئی۔"
+ "empty": "اس ممبر کے لیے ابھی تک کوئی عمل دخل log فائل نہیں لی گئی۔",
+ "copy": "Copy",
+ "fileEmpty": "Process log file خالی ہے.",
+ "showingLast": "آخری {{bytes}} دکھا رہے ہیں.",
+ "showing": "{{bytes}} دکھا رہے ہیں."
},
"tasks": {
"empty": "اس ممبر کو کوئی کام نہیں سونپا گیا"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "فراہم کُنندہ اسٹیٹ کارڈ سے وقتاً فوقتاً انسٹال کریں یا پھر اس پلگ ان انسٹال کریں۔",
"openCodeAppMcpUnreachable": "اوپن کووڈ ایپ کو تازگی بخشنے کے لئے دوبارہ آغاز MCP بریگیڈ. اگر اسے دوبارہ بحال کیا جائے تو ایپ اور اوپنCode وقت کو دوبارہ شروع کریں۔",
"cliBinaryMissing": "مقامی پلگ ان کو یقینی بنائیں CLI binary موجود ہے اور شروع کیا جا سکتا ہے، پھر اسے دوبارہ کھول.",
- "default": "اوپر کے شمارے پر غور کریں، پھر اس کو دوبارہ کھول دیں۔"
+ "default": "اوپر کے شمارے پر غور کریں، پھر اس کو دوبارہ کھول دیں۔",
+ "openCodeNodeModulesSymlinkPermission": "Agent Teams AI کو Administrator کے طور پر چلائیں، پھر launch دوبارہ آزمائیں."
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "ٹیمیں"
+ "title": "ٹیمیں",
+ "status": {
+ "active": "فعال",
+ "provisioning": "شروع ہو رہی ہے",
+ "idle": "چل رہی ہے"
+ },
+ "noProject": "کوئی project نہیں"
},
"layout": {
"maxPanesReached": "جواب {{count}} جلدیں پہنچ گئیں"
},
"codexReconnect": {
"description": "آپ کا تقرر سیشن غیر متصل ہوتا ہے. جاری رہنے کے لئے دوبارہ کوشش کریں.",
- "useCode": "کوڈ استعمال کریں"
+ "useCode": "کوڈ استعمال کریں",
+ "generating": "بن رہا ہے...",
+ "openLogin": "Login کھولیں",
+ "generateLink": "Link بنائیں"
},
"effortLevel": {
"label": "فعال سطح (اختیاری)",
@@ -2428,6 +2481,7 @@
"customRole": "دوبارہ کردار",
"searchPlaceholder": "تلاش کردار...",
"empty": "کوئی کردار نہیں ملا.",
- "reservedRole": "یہ کردار محفوظ ہے۔"
+ "reservedRole": "یہ کردار محفوظ ہے۔",
+ "emptyCustomRole": "Role خالی نہیں ہو سکتی"
}
}
diff --git a/src/features/localization/renderer/locales/zh/extensions.json b/src/features/localization/renderer/locales/zh/extensions.json
index 709f0f16..f0f490e1 100644
--- a/src/features/localization/renderer/locales/zh/extensions.json
+++ b/src/features/localization/renderer/locales/zh/extensions.json
@@ -589,7 +589,11 @@
"actions": {
"add": "添加 API 密钥",
"addFirst": "添加您的第一个密钥",
- "edit": "编辑"
+ "edit": "编辑",
+ "copied": "已复制!",
+ "copyEnvVarName": "复制环境变量名",
+ "confirmDelete": "再次点击确认",
+ "delete": "删除"
},
"empty": {
"title": "没有保存 ZXCVKEN0ZXCV 密钥",
diff --git a/src/features/localization/renderer/locales/zh/settings.json b/src/features/localization/renderer/locales/zh/settings.json
index 0aef0674..045aa0ea 100644
--- a/src/features/localization/renderer/locales/zh/settings.json
+++ b/src/features/localization/renderer/locales/zh/settings.json
@@ -46,7 +46,8 @@
"copiedShort": "复制",
"copy": "复制诊断",
"hints": "提示",
- "likelyCause": "可能的原因是:"
+ "likelyCause": "可能的原因是:",
+ "windowsSymlinkAdminHint": "Windows: 以管理员身份运行 Agent Teams AI"
},
"models": {
"alreadyDefault": "这已经是所选的 OpenCode 默认值 。",
@@ -64,7 +65,15 @@
"searchPlaceholder": "搜索模式",
"selectProjectBeforeTesting": "在测试模型前选择项目上下文 。",
"selectProjectBeforeTestingDefaults": "在测试或保存 OpenCode 默认值之前选择工程上下文 。",
- "useInTeamPicker": "用于团队拾取器"
+ "useInTeamPicker": "用于团队拾取器",
+ "testInProgress": "模型测试已在运行。",
+ "validationContextRequired": "请先在上方选择验证上下文, 才能启用 Test 和 Set default。保存到 team picker 只会为新团队记录 route。",
+ "defaultSaveInProgress": "正在保存 OpenCode default。",
+ "routeUnavailableAuth": "此 provider 需要先完成身份验证, 才能使用此模型。",
+ "routeUnavailableFailed": "此 model route 未通过上次 execution test。",
+ "routeUnavailableUnknown": "此模型是当前 OpenCode default, 但尚未出现在 live catalog 中。",
+ "actionsUnavailable": "操作暂时不可用。",
+ "routeUnavailableGeneric": "此 model route 当前无法使用。"
},
"providers": {
"catalog": "OpenCode 提供者目录",
@@ -108,7 +117,8 @@
"needsTest": "需要测试",
"failed": "失败",
"unknown": "不详",
- "default": "默认"
+ "default": "默认",
+ "knownRoute": "已知 route"
},
"compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234 苏维埃社会主义共和国"
@@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "配置了 API 密钥,但尚未验证",
"apiKeyModeMissingCredential": "选择了 API 密钥模式,但没有配置 API 密钥",
"connectedVia": "通过{{method}}连接",
- "unableToVerify": "无法校验"
+ "unableToVerify": "无法校验",
+ "modelsAvailable": "模型可用"
},
"mode": {
"selectedAuth": "选中的认证: {{authMode}}",
diff --git a/src/features/localization/renderer/locales/zh/team.json b/src/features/localization/renderer/locales/zh/team.json
index 7cab2856..3ac9caac 100644
--- a/src/features/localization/renderer/locales/zh/team.json
+++ b/src/features/localization/renderer/locales/zh/team.json
@@ -28,7 +28,9 @@
"session": "届会",
"stallNudge": "缓冲",
"start": "开始",
- "workSync": "工作同步"
+ "workSync": "工作同步",
+ "agentError": "代理错误",
+ "apiError": "API 错误"
},
"bootstrap": {
"acknowledged": "靴子已经确认",
@@ -77,7 +79,11 @@
"action": "答复"
},
"activeTasks": {
- "inProgress": "进行中"
+ "inProgress": "进行中",
+ "expandInProgress": "展开进行中任务",
+ "collapseInProgress": "折叠进行中任务",
+ "reviewing": "正在审查",
+ "workingOn": "正在处理"
},
"expandDialog": {
"description": "扩展信件视图"
@@ -349,7 +355,12 @@
},
"waitingForProvisioning": "一旦提供完毕,小组数据就会出现",
"context": {
- "title": "背景情况"
+ "title": "背景情况",
+ "loading": "正在加载...",
+ "noSessionLoaded": "未加载会话",
+ "closePanel": "关闭 {{team}} 上下文面板",
+ "loadingContext": "正在加载上下文...",
+ "openLeadSession": "打开团队负责人会话以查看上下文。"
}
},
"review": {
@@ -1571,7 +1582,10 @@
"emptyMessage": "未找到日志来源 。",
"ariaLabel": "日志来源",
"leadLabel": "铅",
- "selectSourceEmpty": "选择日志源 。"
+ "selectSourceEmpty": "选择日志源 。",
+ "leadDescription": "团队负责人",
+ "removedLabel": "已移除",
+ "removedDescription": "已移除"
}
},
"agentGraph": {
@@ -1620,14 +1634,39 @@
"more_one": "+ 键{{count}}更多",
"more_other": "+ 键{{count}}更多",
"more_few": "+ 键{{count}}更多",
- "more_many": "+ 键{{count}}更多"
+ "more_many": "+ 键{{count}}更多",
+ "unsupportedProvider": "不支持的提供商",
+ "openCodeLogsDelayed": "OpenCode 日志延迟",
+ "logsUnavailable": "日志不可用",
+ "noRecentLogs": "没有最近日志",
+ "toolError": "工具错误",
+ "toolResult": "工具结果",
+ "toolUse": "工具使用",
+ "thinking": "思考中",
+ "error": "错误",
+ "logEvent": "日志事件",
+ "noErrorOutput": "没有错误输出",
+ "noOutput": "没有输出",
+ "noInput": "没有输入"
},
"blockingEdge": {
"title": "封锁依赖性",
"blocks": "块",
"close": "关闭",
"blockingHiddenTasks": "屏蔽隐藏任务",
- "blockedHiddenTasks": "已屏蔽隐藏任务"
+ "blockedHiddenTasks": "已屏蔽隐藏任务",
+ "links_one": "{{count}} 个链接",
+ "links_other": "{{count}} 个链接",
+ "hiddenBlockingLinks_one": "{{count}} 个隐藏阻塞链接",
+ "hiddenBlockingLinks_other": "{{count}} 个隐藏阻塞链接",
+ "hiddenTaskStack": "隐藏任务堆栈",
+ "hiddenTasks_one": "{{count}} 个隐藏任务",
+ "hiddenTasks_other": "{{count}} 个隐藏任务",
+ "task": "任务",
+ "openBlockerStack": "打开阻塞方堆栈",
+ "openBlockedStack": "打开被阻塞方堆栈",
+ "openBlockerTask": "打开阻塞任务",
+ "openBlockedTask": "打开被阻塞任务"
},
"activityHud": {
"activity": "活动",
@@ -1778,7 +1817,11 @@
"autoRefresh": "自动更新",
"wrapLines": "环行",
"loadingTail": "正在装入进程日志尾巴...",
- "empty": "尚未为这个成员捕获进程日志文件 。"
+ "empty": "尚未为这个成员捕获进程日志文件 。",
+ "copy": "复制",
+ "fileEmpty": "进程日志文件为空。",
+ "showingLast": "显示最后 {{bytes}}。",
+ "showing": "显示 {{bytes}}。"
},
"tasks": {
"empty": "没有指派给该成员的任务"
@@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "从提供者状态卡安装或重试 OpenCode 运行时间, 然后重新打开此对话框 。",
"openCodeAppMcpUnreachable": "重试发射刷新OpenCodeapp MCP桥. 如果重复,请重新启动应用程序和 OpenCode 运行时间 。",
"cliBinaryMissing": "确保本地的 Claude CLI 二进制存在并可以启动,然后重新打开此对话框 。",
- "default": "解决上面的问题, 然后重开这个对话框 。"
+ "default": "解决上面的问题, 然后重开这个对话框 。",
+ "openCodeNodeModulesSymlinkPermission": "以管理员身份运行 Agent Teams AI, 然后重试启动。"
}
},
"presentation": {
@@ -2404,14 +2448,23 @@
}
},
"runningTeams": {
- "title": "运行团队"
+ "title": "运行团队",
+ "status": {
+ "active": "活跃",
+ "provisioning": "启动中",
+ "idle": "运行中"
+ },
+ "noProject": "无项目"
},
"layout": {
"maxPanesReached": "达到的最大 {{count}} 面板"
},
"codexReconnect": {
"description": "您的编码会话似乎已停滞 。 重新连接继续 。",
- "useCode": "使用代码"
+ "useCode": "使用代码",
+ "generating": "正在生成...",
+ "openLogin": "打开登录",
+ "generateLink": "生成链接"
},
"effortLevel": {
"label": "努力级别( 可选)",
@@ -2428,6 +2481,7 @@
"customRole": "自定义角色...",
"searchPlaceholder": "搜索角色...",
"empty": "没有找到角色 。",
- "reservedRole": "这个角色是保留下来的"
+ "reservedRole": "这个角色是保留下来的",
+ "emptyCustomRole": "角色不能为空"
}
}
diff --git a/src/features/localization/renderer/resources.d.ts b/src/features/localization/renderer/resources.d.ts
index f70bbd5e..d106c2dc 100644
--- a/src/features/localization/renderer/resources.d.ts
+++ b/src/features/localization/renderer/resources.d.ts
@@ -1117,6 +1117,10 @@ export default interface Resources {
actions: {
add: 'Add API Key';
addFirst: 'Add your first key';
+ confirmDelete: 'Click again to confirm';
+ copied: 'Copied!';
+ copyEnvVarName: 'Copy env var name';
+ delete: 'Delete';
edit: 'Edit';
};
description: 'Securely store API keys for auto-filling when installing MCP servers.';
@@ -2886,6 +2890,7 @@ export default interface Resources {
copy: 'Copy diagnostics';
hints: 'Hints';
likelyCause: 'Likely cause:';
+ windowsSymlinkAdminHint: 'Windows: run Agent Teams AI as Administrator';
};
modelRoutes: {
searchPlaceholder: 'Search model routes';
@@ -3016,7 +3021,11 @@ export default interface Resources {
restartTeam: 'Restart team';
};
activeTasks: {
+ collapseInProgress: 'Collapse in progress';
+ expandInProgress: 'Expand in progress';
inProgress: 'In progress';
+ reviewing: 'reviewing';
+ workingOn: 'working on';
};
authError: {
description: 'Authentication failed. Restarting the team will refresh the session and may resolve this issue. If the problem persists, check your API credentials or try again later.';
@@ -3027,6 +3036,8 @@ export default interface Resources {
workSyncBody: 'Asked teammate to sync current work';
};
badges: {
+ agentError: 'Agent Error';
+ apiError: 'API Error';
automation: 'automation';
bootstrap: 'bootstrap';
command: 'command';
@@ -3123,16 +3134,41 @@ export default interface Resources {
blockingHiddenTasks: 'Blocking hidden tasks';
blocks: 'blocks';
close: 'Close';
+ hiddenBlockingLinks_one: '{{count}} hidden blocking link';
+ hiddenBlockingLinks_other: '{{count}} hidden blocking links';
+ hiddenTasks_one: '{{count}} hidden task';
+ hiddenTasks_other: '{{count}} hidden tasks';
+ hiddenTaskStack: 'Hidden task stack';
+ links_one: '{{count}} link';
+ links_other: '{{count}} links';
+ openBlockedStack: 'Open blocked stack';
+ openBlockedTask: 'Open blocked task';
+ openBlockerStack: 'Open blocker stack';
+ openBlockerTask: 'Open blocker task';
+ task: 'Task';
title: 'Blocking Dependency';
};
logPreview: {
+ error: 'Error';
+ logEvent: 'Log event';
loading: 'Loading logs';
logs: 'Logs';
+ logsUnavailable: 'Logs unavailable';
more: '+{{count}} more';
more_few: '+{{count}} more';
more_many: '+{{count}} more';
more_one: '+{{count}} more';
more_other: '+{{count}} more';
+ noErrorOutput: 'No error output';
+ noInput: 'No input';
+ noOutput: 'No output';
+ noRecentLogs: 'No recent logs';
+ openCodeLogsDelayed: 'OpenCode logs delayed';
+ thinking: 'Thinking';
+ toolError: 'Tool error';
+ toolResult: 'Tool result';
+ toolUse: 'Tool use';
+ unsupportedProvider: 'Unsupported provider';
};
popover: {
externalTeam: 'External team';
@@ -3220,8 +3256,11 @@ export default interface Resources {
sourceSelect: {
ariaLabel: 'Log source';
emptyMessage: 'No log sources found.';
+ leadDescription: 'Team Lead';
leadLabel: 'Lead';
placeholder: 'Select log source...';
+ removedDescription: 'Removed';
+ removedLabel: 'removed';
searchPlaceholder: 'Search log sources...';
selectSourceEmpty: 'Select a log source.';
};
@@ -3230,6 +3269,9 @@ export default interface Resources {
};
codexReconnect: {
description: 'Your Codex session appears stale. Reconnect to continue.';
+ generateLink: 'Generate link';
+ generating: 'Generating...';
+ openLogin: 'Open login';
useCode: 'Use code';
};
contextLimit: {
@@ -3330,6 +3372,11 @@ export default interface Resources {
visualize: 'Visualize';
};
context: {
+ closePanel: 'Close {{team}} context panel';
+ loading: 'Loading...';
+ loadingContext: 'Loading context...';
+ noSessionLoaded: 'No session loaded';
+ openLeadSession: 'Open the team lead session to view context.';
title: 'Context';
};
deleteTeam: {
@@ -4144,8 +4191,12 @@ export default interface Resources {
};
runtimeLogs: {
autoRefresh: 'Auto-refresh';
+ copy: 'Copy';
empty: 'No process log file captured for this member yet.';
+ fileEmpty: 'Process log file is empty.';
loadingTail: 'Loading process log tail...';
+ showing: 'Showing {{bytes}}.';
+ showingLast: 'Showing last {{bytes}}.';
wrapLines: 'Wrap lines';
};
runtimeTelemetry: {
@@ -4617,6 +4668,7 @@ export default interface Resources {
openCodeAccessDenied: 'Fix folder permissions or move the project to a user-writable folder. Running as administrator is only a temporary workaround.';
openCodeAppMcpUnreachable: 'Retry launch to refresh the OpenCode app MCP bridge. If it repeats, restart the app and OpenCode runtime.';
openCodeBridgeNoOutput: 'Restart the app and OpenCode runtime, then retry. If it repeats, copy diagnostics.';
+ openCodeNodeModulesSymlinkPermission: 'Run Agent Teams AI as Administrator, then retry launch.';
openCodeRuntimeMissing: 'Install or retry OpenCode runtime from the provider status card, then reopen this dialog.';
runtimeProviderNotConfigured: 'Configure the selected provider runtime, then reopen this dialog.';
workingDirectoryMissing: 'Choose an existing working directory, then reopen this dialog.';
@@ -4993,11 +5045,18 @@ export default interface Resources {
roleSelect: {
customRole: 'Custom role...';
empty: 'No roles found.';
+ emptyCustomRole: 'Role cannot be empty';
noRole: 'No role';
reservedRole: 'This role is reserved';
searchPlaceholder: 'Search roles...';
};
runningTeams: {
+ noProject: 'No project';
+ status: {
+ active: 'Active';
+ idle: 'Running';
+ provisioning: 'Launching';
+ };
title: 'Running Teams';
};
schedule: {
diff --git a/src/features/member-log-stream/renderer/ui/MemberRuntimeProcessLogsPanel.tsx b/src/features/member-log-stream/renderer/ui/MemberRuntimeProcessLogsPanel.tsx
index 7559057b..6f7ce81d 100644
--- a/src/features/member-log-stream/renderer/ui/MemberRuntimeProcessLogsPanel.tsx
+++ b/src/features/member-log-stream/renderer/ui/MemberRuntimeProcessLogsPanel.tsx
@@ -34,12 +34,20 @@ function formatBytes(bytes: number | undefined): string {
return `${mb.toFixed(mb >= 10 ? 0 : 1)} MB`;
}
-function buildStatusText(log: MemberRuntimeLogTailResponse | null): string | null {
+function buildStatusText(
+ log: MemberRuntimeLogTailResponse | null,
+ labels: {
+ empty: string;
+ fileEmpty: string;
+ showingLast: (bytes: string) => string;
+ showing: (bytes: string) => string;
+ }
+): string | null {
if (!log) return null;
- if (log.missing) return 'No process log file captured for this member yet.';
- if (!log.content) return 'Process log file is empty.';
- if (log.truncated) return `Showing last ${formatBytes(log.bytesRead)}.`;
- return `Showing ${formatBytes(log.bytesRead)}.`;
+ if (log.missing) return labels.empty;
+ if (!log.content) return labels.fileEmpty;
+ if (log.truncated) return labels.showingLast(formatBytes(log.bytesRead));
+ return labels.showing(formatBytes(log.bytesRead));
}
function ProcessLogKindTabs({
@@ -204,7 +212,12 @@ export function MemberRuntimeProcessLogsPanel({
}
}, [log?.content]);
- const statusText = buildStatusText(log);
+ const statusText = buildStatusText(log, {
+ empty: t('members.runtimeLogs.empty'),
+ fileEmpty: t('members.runtimeLogs.fileEmpty'),
+ showingLast: (bytes) => t('members.runtimeLogs.showingLast', { bytes }),
+ showing: (bytes) => t('members.runtimeLogs.showing', { bytes }),
+ });
const hasContent = Boolean(log?.content);
return (
@@ -252,7 +265,7 @@ export function MemberRuntimeProcessLogsPanel({
disabled={!hasContent}
>
{copied ? : }
- {copied ? 'Copied' : 'Copy'}
+ {copied ? tCommon('actions.copied') : t('members.runtimeLogs.copy')}
diff --git a/src/features/running-teams/renderer/adapters/RunningTeamsSectionAdapter.ts b/src/features/running-teams/renderer/adapters/RunningTeamsSectionAdapter.ts
index 504dc9f7..2e0dc79e 100644
--- a/src/features/running-teams/renderer/adapters/RunningTeamsSectionAdapter.ts
+++ b/src/features/running-teams/renderer/adapters/RunningTeamsSectionAdapter.ts
@@ -17,36 +17,54 @@ export interface RunningTeamRowModel {
taskCounts?: TaskStatusCounts;
}
-function getStatusLabel(status: RunningTeamDashboardEntry['status']): string {
+export interface RunningTeamsSectionText {
+ status: Record;
+ noProject: string;
+}
+
+const DEFAULT_TEXT: RunningTeamsSectionText = {
+ status: {
+ active: 'Active',
+ provisioning: 'Launching',
+ idle: 'Running',
+ },
+ noProject: 'No project',
+};
+
+function getStatusLabel(
+ status: RunningTeamDashboardEntry['status'],
+ text: RunningTeamsSectionText
+): string {
switch (status) {
case 'active':
- return 'Active';
+ return text.status.active;
case 'provisioning':
- return 'Launching';
+ return text.status.provisioning;
case 'idle':
- return 'Running';
+ return text.status.idle;
}
}
-function getProjectLabel(projectPath?: string): string {
+function getProjectLabel(projectPath: string | undefined, text: RunningTeamsSectionText): string {
if (!projectPath) {
- return 'No project';
+ return text.noProject;
}
return getBaseName(projectPath) || projectPath;
}
export function adaptRunningTeamsSection(
- teams: RunningTeamDashboardEntry[]
+ teams: RunningTeamDashboardEntry[],
+ text: RunningTeamsSectionText = DEFAULT_TEXT
): RunningTeamRowModel[] {
return teams.map((team) => ({
id: team.teamName,
teamName: team.teamName,
displayName: team.displayName,
projectPath: team.projectPath,
- projectLabel: getProjectLabel(team.projectPath),
+ projectLabel: getProjectLabel(team.projectPath, text),
status: team.status,
- statusLabel: getStatusLabel(team.status),
+ statusLabel: getStatusLabel(team.status, text),
iconColor: team.color
? getTeamColorSet(team.color).border
: nameColorSet(team.displayName).border,
diff --git a/src/features/running-teams/renderer/hooks/useRunningTeamsSection.ts b/src/features/running-teams/renderer/hooks/useRunningTeamsSection.ts
index 7f64e91f..c1023e17 100644
--- a/src/features/running-teams/renderer/hooks/useRunningTeamsSection.ts
+++ b/src/features/running-teams/renderer/hooks/useRunningTeamsSection.ts
@@ -1,5 +1,6 @@
import { useCallback, useEffect, useMemo, useState } from 'react';
+import { useAppTranslation } from '@features/localization/renderer';
import { api } from '@renderer/api';
import { useStore } from '@renderer/store';
import {
@@ -58,6 +59,7 @@ function toCandidate(input: {
}
export function useRunningTeamsSection(searchQuery: string): RunningTeamsSectionState {
+ const { t } = useAppTranslation('team');
const {
teams,
globalTasks,
@@ -172,7 +174,14 @@ export function useRunningTeamsSection(searchQuery: string): RunningTeamsSection
),
});
- return adaptRunningTeamsSection(runningTeams);
+ return adaptRunningTeamsSection(runningTeams, {
+ status: {
+ active: t('runningTeams.status.active'),
+ provisioning: t('runningTeams.status.provisioning'),
+ idle: t('runningTeams.status.idle'),
+ },
+ noProject: t('runningTeams.noProject'),
+ });
}, [
aliveTeams,
globalTasks,
@@ -182,6 +191,7 @@ export function useRunningTeamsSection(searchQuery: string): RunningTeamsSection
provisioningTeamNames,
searchActive,
teams,
+ t,
]);
const openRunningTeam = useCallback(
diff --git a/src/renderer/components/dashboard/CliStatusBanner.tsx b/src/renderer/components/dashboard/CliStatusBanner.tsx
index 38fc6aff..e8b83de7 100644
--- a/src/renderer/components/dashboard/CliStatusBanner.tsx
+++ b/src/renderer/components/dashboard/CliStatusBanner.tsx
@@ -42,7 +42,10 @@ import {
shouldShowProviderStatusSkeleton,
} from '@renderer/components/runtime/providerConnectionUi';
import { ProviderModelBadges } from '@renderer/components/runtime/ProviderModelBadges';
-import { getProviderRuntimeBackendSummary } from '@renderer/components/runtime/ProviderRuntimeBackendSelector';
+import {
+ buildProviderRuntimeBackendSummaryText,
+ getProviderRuntimeBackendSummary,
+} from '@renderer/components/runtime/ProviderRuntimeBackendSelector';
import {
getProviderTerminalCommand,
getProviderTerminalLogoutCommand,
@@ -839,6 +842,11 @@ const InstalledBanner = ({
}: InstalledBannerProps): React.JSX.Element => {
const { t } = useAppTranslation('dashboard');
const { t: settingsT } = useAppTranslation('settings');
+ const { t: commonT } = useAppTranslation('common');
+ const runtimeBackendSummaryText = useMemo(
+ () => buildProviderRuntimeBackendSummaryText(commonT),
+ [commonT]
+ );
const openExtensionsTab = useStore((s) => s.openExtensionsTab);
const styles = VARIANT_STYLES[variant];
const visibleProviders = useMemo(
@@ -966,7 +974,7 @@ const InstalledBanner = ({
const actionDisabled = isBusy || !cliStatus.binaryPath;
const runtimeSummary = isConnectionManagedRuntimeProvider(provider)
? getProviderCurrentRuntimeSummary(provider, settingsT)
- : getProviderRuntimeBackendSummary(provider);
+ : getProviderRuntimeBackendSummary(provider, runtimeBackendSummaryText);
const connectionModeSummary = getProviderConnectionModeSummary(provider, settingsT);
const credentialSummary = getProviderCredentialSummary(provider, settingsT);
const dashboardRateLimits = getDashboardRateLimitsForProvider(provider);
diff --git a/src/renderer/components/extensions/apikeys/ApiKeyCard.tsx b/src/renderer/components/extensions/apikeys/ApiKeyCard.tsx
index 80940929..445cba57 100644
--- a/src/renderer/components/extensions/apikeys/ApiKeyCard.tsx
+++ b/src/renderer/components/extensions/apikeys/ApiKeyCard.tsx
@@ -95,7 +95,9 @@ export const ApiKeyCard = ({ apiKey, onEdit }: ApiKeyCardProps): React.JSX.Eleme
)}
- {copied ? 'Copied!' : 'Copy env var name'}
+
+ {copied ? t('apiKeys.actions.copied') : t('apiKeys.actions.copyEnvVarName')}
+
@@ -135,7 +137,9 @@ export const ApiKeyCard = ({ apiKey, onEdit }: ApiKeyCardProps): React.JSX.Eleme
- {confirmDelete ? 'Click again to confirm' : 'Delete'}
+
+ {confirmDelete ? t('apiKeys.actions.confirmDelete') : t('apiKeys.actions.delete')}
+
diff --git a/src/renderer/components/runtime/ProviderRuntimeBackendSelector.tsx b/src/renderer/components/runtime/ProviderRuntimeBackendSelector.tsx
index 3da2b320..c6d152eb 100644
--- a/src/renderer/components/runtime/ProviderRuntimeBackendSelector.tsx
+++ b/src/renderer/components/runtime/ProviderRuntimeBackendSelector.tsx
@@ -16,6 +16,52 @@ interface Props {
onSelect: (providerId: CliProviderStatus['providerId'], backendId: string) => void;
}
+export interface ProviderRuntimeBackendSummaryText {
+ auto: string;
+ autoCurrently: (backend: string) => string;
+ audienceInternal: string;
+ states: {
+ locked: string;
+ disabled: string;
+ authRequired: string;
+ runtimeMissing: string;
+ degraded: string;
+ unavailable: string;
+ };
+}
+
+export function buildProviderRuntimeBackendSummaryText(
+ t: ReturnType['t']
+): ProviderRuntimeBackendSummaryText {
+ return {
+ auto: t('runtimeBackendSelector.auto'),
+ autoCurrently: (backend) => t('runtimeBackendSelector.autoCurrently', { backend }),
+ audienceInternal: t('runtimeBackendSelector.audience.internal'),
+ states: {
+ locked: t('runtimeBackendSelector.states.locked'),
+ disabled: t('runtimeBackendSelector.states.disabled'),
+ authRequired: t('runtimeBackendSelector.states.authRequired'),
+ runtimeMissing: t('runtimeBackendSelector.states.runtimeMissing'),
+ degraded: t('runtimeBackendSelector.states.degraded'),
+ unavailable: t('runtimeBackendSelector.states.unavailable'),
+ },
+ };
+}
+
+const DEFAULT_SUMMARY_TEXT: ProviderRuntimeBackendSummaryText = {
+ auto: 'Auto',
+ autoCurrently: (backend) => `Auto (currently: ${backend})`,
+ audienceInternal: 'Internal',
+ states: {
+ locked: 'Locked',
+ disabled: 'Disabled',
+ authRequired: 'Auth required',
+ runtimeMissing: 'Runtime missing',
+ degraded: 'Degraded',
+ unavailable: 'Unavailable',
+ },
+};
+
export function getProviderRuntimeBackendStateLabel(
option: NonNullable[number]
): string | null {
@@ -78,7 +124,47 @@ export function getOptionDisplayLabel(
return 'Auto';
}
-export function getProviderRuntimeBackendSummary(provider: CliProviderStatus): string | null {
+function getOptionSummaryDisplayLabel(
+ provider: CliProviderStatus,
+ option: NonNullable[number],
+ resolvedOption: NonNullable[number] | null,
+ text: ProviderRuntimeBackendSummaryText
+): string {
+ if (option.id !== 'auto') {
+ return getOptionDisplayLabel(provider, option, resolvedOption);
+ }
+ if (resolvedOption?.label) {
+ return text.autoCurrently(resolvedOption.label);
+ }
+ return text.auto;
+}
+
+function getProviderRuntimeBackendStateSummaryLabel(
+ option: NonNullable[number],
+ text: ProviderRuntimeBackendSummaryText
+): string | null {
+ switch (getProviderRuntimeBackendStateLabel(option)) {
+ case 'Locked':
+ return text.states.locked;
+ case 'Disabled':
+ return text.states.disabled;
+ case 'Auth required':
+ return text.states.authRequired;
+ case 'Runtime missing':
+ return text.states.runtimeMissing;
+ case 'Degraded':
+ return text.states.degraded;
+ case 'Unavailable':
+ return text.states.unavailable;
+ default:
+ return null;
+ }
+}
+
+export function getProviderRuntimeBackendSummary(
+ provider: CliProviderStatus,
+ text: ProviderRuntimeBackendSummaryText = DEFAULT_SUMMARY_TEXT
+): string | null {
const options = provider.availableBackends ?? [];
if (options.length === 0) {
return null;
@@ -87,9 +173,11 @@ export function getProviderRuntimeBackendSummary(provider: CliProviderStatus): s
const selectedBackendId = provider.selectedBackendId ?? options[0]?.id ?? '';
const selectedOption = options.find((option) => option.id === selectedBackendId) ?? options[0];
const resolvedOption = options.find((option) => option.id === provider.resolvedBackendId) ?? null;
- const parts = [getOptionDisplayLabel(provider, selectedOption, resolvedOption)];
- const audienceLabel = getProviderRuntimeBackendAudienceLabel(selectedOption);
- const stateLabel = getProviderRuntimeBackendStateLabel(selectedOption);
+ const parts = [getOptionSummaryDisplayLabel(provider, selectedOption, resolvedOption, text)];
+ const audienceLabel = getProviderRuntimeBackendAudienceLabel(selectedOption)
+ ? text.audienceInternal
+ : null;
+ const stateLabel = getProviderRuntimeBackendStateSummaryLabel(selectedOption, text);
if (audienceLabel) {
parts.push(audienceLabel.toLowerCase());
@@ -107,6 +195,7 @@ export const ProviderRuntimeBackendSelector = ({
onSelect,
}: Props): React.JSX.Element | null => {
const { t } = useAppTranslation('common');
+ const summaryText = buildProviderRuntimeBackendSummaryText(t);
const options = getVisibleProviderRuntimeBackendOptions(provider);
if (options.length === 0) {
return null;
@@ -150,9 +239,9 @@ export const ProviderRuntimeBackendSelector = ({
): string => {
if (option.id === 'auto') {
if (resolvedOption?.label) {
- return t('runtimeBackendSelector.autoCurrently', { backend: resolvedOption.label });
+ return summaryText.autoCurrently(resolvedOption.label);
}
- return t('runtimeBackendSelector.auto');
+ return summaryText.auto;
}
return getOptionDisplayLabel(provider, option, resolvedOption);
};
diff --git a/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx b/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx
index 9384abe4..f5b5abe6 100644
--- a/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx
+++ b/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx
@@ -60,6 +60,7 @@ import {
isConnectionManagedRuntimeProvider,
} from './providerConnectionUi';
import {
+ buildProviderRuntimeBackendSummaryText,
getProviderRuntimeBackendSummary,
getVisibleProviderRuntimeBackendOptions,
ProviderRuntimeBackendSelector,
@@ -792,6 +793,11 @@ export const ProviderRuntimeSettingsDialog = ({
onRequestLogin,
}: Props): React.JSX.Element => {
const { t } = useAppTranslation('settings');
+ const { t: commonT } = useAppTranslation('common');
+ const runtimeBackendSummaryText = useMemo(
+ () => buildProviderRuntimeBackendSummaryText(commonT),
+ [commonT]
+ );
const [selectedProviderId, setSelectedProviderId] = useState(initialProviderId);
const [activeApiKeyFormProviderId, setActiveApiKeyFormProviderId] =
useState(null);
@@ -987,7 +993,7 @@ export const ProviderRuntimeSettingsDialog = ({
? providerStatusLoading[selectedProvider.providerId] === true
: false;
const runtimeSummary = selectedProvider
- ? getProviderRuntimeBackendSummary(selectedProvider)
+ ? getProviderRuntimeBackendSummary(selectedProvider, runtimeBackendSummaryText)
: null;
const codexConnection =
selectedProvider?.providerId === 'codex' ? (selectedProvider.connection?.codex ?? null) : null;
diff --git a/src/renderer/components/settings/sections/CliStatusSection.tsx b/src/renderer/components/settings/sections/CliStatusSection.tsx
index 3e16b9fb..9c71db30 100644
--- a/src/renderer/components/settings/sections/CliStatusSection.tsx
+++ b/src/renderer/components/settings/sections/CliStatusSection.tsx
@@ -29,7 +29,10 @@ import {
shouldShowProviderStatusSkeleton,
} from '@renderer/components/runtime/providerConnectionUi';
import { ProviderModelBadges } from '@renderer/components/runtime/ProviderModelBadges';
-import { getProviderRuntimeBackendSummary } from '@renderer/components/runtime/ProviderRuntimeBackendSelector';
+import {
+ buildProviderRuntimeBackendSummaryText,
+ getProviderRuntimeBackendSummary,
+} from '@renderer/components/runtime/ProviderRuntimeBackendSelector';
import { ProviderRuntimeSettingsDialog } from '@renderer/components/runtime/ProviderRuntimeSettingsDialog';
import {
getProviderTerminalCommand,
@@ -129,6 +132,11 @@ function getProviderLabel(providerId: CliProviderId): string {
export const CliStatusSection = (): React.JSX.Element | null => {
const { t } = useAppTranslation('settings');
+ const { t: commonT } = useAppTranslation('common');
+ const runtimeBackendSummaryText = useMemo(
+ () => buildProviderRuntimeBackendSummaryText(commonT),
+ [commonT]
+ );
const isElectron = useMemo(() => isElectronMode(), []);
const appConfig = useStore((s) => s.appConfig);
const selectedProjectId = useStore((s) => s.selectedProjectId);
@@ -493,7 +501,7 @@ export const CliStatusSection = (): React.JSX.Element | null => {
isCodexSnapshotPending(provider, codexSnapshotPending);
const runtimeSummary = isConnectionManagedRuntimeProvider(provider)
? getProviderCurrentRuntimeSummary(provider, t)
- : getProviderRuntimeBackendSummary(provider);
+ : getProviderRuntimeBackendSummary(provider, runtimeBackendSummaryText);
const sourceProvider =
loadingCliProviderMap.get(provider.providerId) ?? null;
const maskNegativeBootstrapState = shouldMaskCodexNegativeBootstrapState(
diff --git a/src/renderer/components/team/ClaudeLogsSection.tsx b/src/renderer/components/team/ClaudeLogsSection.tsx
index 5a153122..5a9d18be 100644
--- a/src/renderer/components/team/ClaudeLogsSection.tsx
+++ b/src/renderer/components/team/ClaudeLogsSection.tsx
@@ -141,9 +141,14 @@ const TeamLogsSourceSelector = ({
getMemberLabel={(member) =>
isLeadMember(member)
? t('claudeLogs.sourceSelect.leadLabel')
- : formatMemberLogSourceLabel(member)
+ : formatMemberLogSourceLabel(member, t('claudeLogs.sourceSelect.removedLabel'))
+ }
+ getMemberDescription={(member) =>
+ formatMemberLogSourceDescription(member, {
+ lead: t('claudeLogs.sourceSelect.leadDescription'),
+ removed: t('claudeLogs.sourceSelect.removedDescription'),
+ })
}
- getMemberDescription={formatMemberLogSourceDescription}
/>
);
diff --git a/src/renderer/components/team/TeamDetailView.tsx b/src/renderer/components/team/TeamDetailView.tsx
index 76304b8b..0b7db033 100644
--- a/src/renderer/components/team/TeamDetailView.tsx
+++ b/src/renderer/components/team/TeamDetailView.tsx
@@ -1159,14 +1159,16 @@ const LeadLoadBridge = memo(function LeadLoadBridge({
{t('detail.context.title')}
- {leadSessionLoading ? 'Loading…' : 'No session loaded'}
+ {leadSessionLoading
+ ? t('detail.context.loading')
+ : t('detail.context.noSessionLoaded')}
@@ -1174,8 +1176,8 @@ const LeadLoadBridge = memo(function LeadLoadBridge({
{leadSessionLoading
- ? 'Loading context…'
- : 'Open the team lead session to view context.'}
+ ? t('detail.context.loadingContext')
+ : t('detail.context.openLeadSession')}
@@ -1208,7 +1210,7 @@ const LeadLoadBridge = memo(function LeadLoadBridge({
leadSessionLoaded
? `Session: ${leadSessionId}`
: leadSessionLoading
- ? 'Loading context…'
+ ? t('detail.context.loadingContext')
: leadSessionId
}
>
diff --git a/src/renderer/components/team/activity/ActiveTasksBlock.tsx b/src/renderer/components/team/activity/ActiveTasksBlock.tsx
index 0d724de9..aa3e55dc 100644
--- a/src/renderer/components/team/activity/ActiveTasksBlock.tsx
+++ b/src/renderer/components/team/activity/ActiveTasksBlock.tsx
@@ -83,7 +83,11 @@ export const ActiveTasksBlock = memo(function ActiveTasksBlock({
type="button"
className="flex min-w-0 items-center gap-1.5 text-[10px] font-medium uppercase tracking-wide text-[var(--color-text-muted)] transition-colors hover:text-[var(--color-text-secondary)]"
onClick={() => setCollapsed((v) => !v)}
- aria-label={collapsed ? 'Expand in progress' : 'Collapse in progress'}
+ aria-label={
+ collapsed
+ ? t('activity.activeTasks.expandInProgress')
+ : t('activity.activeTasks.collapseInProgress')
+ }
>
{t('activity.badges.rateLimited')}
- ) : isApiError ? (
-
-
- {message.messageKind === 'agent_error' ? 'Agent Error' : 'API Error'}
-
- ) : null;
+ ) : isApiError ? (
+
+
+ {message.messageKind === 'agent_error'
+ ? t('activity.badges.agentError')
+ : t('activity.badges.apiError')}
+
+ ) : null;
const recipientBadge =
commentTaskRef && commentTaskDisplayId ? (
diff --git a/src/renderer/components/team/dialogs/CodexReconnectPrompt.tsx b/src/renderer/components/team/dialogs/CodexReconnectPrompt.tsx
index e4d7e9e7..2418f713 100644
--- a/src/renderer/components/team/dialogs/CodexReconnectPrompt.tsx
+++ b/src/renderer/components/team/dialogs/CodexReconnectPrompt.tsx
@@ -128,7 +128,11 @@ export const CodexReconnectPrompt = ({
}}
>
- {reconnectBusy ? 'Generating...' : authUrl ? 'Open login' : 'Generate link'}
+ {reconnectBusy
+ ? t('codexReconnect.generating')
+ : authUrl
+ ? t('codexReconnect.openLogin')
+ : t('codexReconnect.generateLink')}
diff --git a/src/renderer/components/team/members/MemberLaunchDiagnosticsButton.tsx b/src/renderer/components/team/members/MemberLaunchDiagnosticsButton.tsx
index 105ba8db..e524e895 100644
--- a/src/renderer/components/team/members/MemberLaunchDiagnosticsButton.tsx
+++ b/src/renderer/components/team/members/MemberLaunchDiagnosticsButton.tsx
@@ -1,5 +1,6 @@
import { useState } from 'react';
+import { useAppTranslation } from '@features/localization/renderer';
import { Button } from '@renderer/components/ui/button';
import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip';
import { cn } from '@renderer/lib/utils';
@@ -24,6 +25,7 @@ export const MemberLaunchDiagnosticsButton = ({
size = label ? 'sm' : 'icon',
attention = false,
}: MemberLaunchDiagnosticsButtonProps): React.JSX.Element => {
+ const { t } = useAppTranslation('team');
const [copied, setCopied] = useState(false);
const copyDiagnostics = async (event: React.MouseEvent): Promise => {
@@ -39,7 +41,7 @@ export const MemberLaunchDiagnosticsButton = ({
};
const icon = copied ? : ;
- const tooltip = copied ? 'Diagnostics copied' : 'Copy diagnostics';
+ const tooltip = copied ? t('provisioning.diagnosticsCopied') : t('provisioning.copyDiagnostics');
return (
diff --git a/src/renderer/components/team/members/MemberRoleEditor.tsx b/src/renderer/components/team/members/MemberRoleEditor.tsx
index 2aff2f77..db541ebb 100644
--- a/src/renderer/components/team/members/MemberRoleEditor.tsx
+++ b/src/renderer/components/team/members/MemberRoleEditor.tsx
@@ -1,5 +1,6 @@
import { useState } from 'react';
+import { useAppTranslation } from '@features/localization/renderer';
import { RoleSelect } from '@renderer/components/team/RoleSelect';
import { Button } from '@renderer/components/ui/button';
import { CUSTOM_ROLE, FORBIDDEN_ROLES, NO_ROLE, PRESET_ROLES } from '@renderer/constants/teamRoles';
@@ -18,6 +19,7 @@ export const MemberRoleEditor = ({
onCancel,
saving,
}: MemberRoleEditorProps): React.JSX.Element => {
+ const { t } = useAppTranslation('team');
const isPreset = currentRole && (PRESET_ROLES as readonly string[]).includes(currentRole);
const [selectValue, setSelectValue] = useState(
!currentRole ? NO_ROLE : isPreset ? currentRole : CUSTOM_ROLE
@@ -44,11 +46,11 @@ export const MemberRoleEditor = ({
}
const trimmed = customInput.trim();
if (!trimmed) {
- setError('Role cannot be empty');
+ setError(t('roleSelect.emptyCustomRole'));
return;
}
if (FORBIDDEN_ROLES.has(trimmed.toLowerCase())) {
- setError('This role is reserved');
+ setError(t('roleSelect.reservedRole'));
return;
}
void onSave(trimmed);
@@ -68,7 +70,7 @@ export const MemberRoleEditor = ({
inputClassName="h-7 w-28 text-xs"
customRoleError={error}
onCustomRoleValidate={(val) => {
- if (FORBIDDEN_ROLES.has(val.trim().toLowerCase())) return 'This role is reserved';
+ if (FORBIDDEN_ROLES.has(val.trim().toLowerCase())) return t('roleSelect.reservedRole');
return null;
}}
/>
diff --git a/src/renderer/components/team/teamLogSources.ts b/src/renderer/components/team/teamLogSources.ts
index b5d04efc..71932609 100644
--- a/src/renderer/components/team/teamLogSources.ts
+++ b/src/renderer/components/team/teamLogSources.ts
@@ -26,13 +26,19 @@ export function getMemberNameFromLogSourceKey(sourceKey: TeamLogSourceKey): stri
return sourceKey.slice('member:'.length);
}
-export function formatMemberLogSourceLabel(member: ResolvedTeamMember): string {
- return member.removedAt ? `${member.name} (removed)` : member.name;
+export function formatMemberLogSourceLabel(member: ResolvedTeamMember, removedLabel = 'removed'): string {
+ return member.removedAt ? `${member.name} (${removedLabel})` : member.name;
}
-export function formatMemberLogSourceDescription(member: ResolvedTeamMember): string | null {
- if (isLeadMember(member)) return 'Team Lead';
- if (member.removedAt) return 'Removed';
+export function formatMemberLogSourceDescription(
+ member: ResolvedTeamMember,
+ labels?: {
+ lead?: string;
+ removed?: string;
+ }
+): string | null {
+ if (isLeadMember(member)) return labels?.lead ?? 'Team Lead';
+ if (member.removedAt) return labels?.removed ?? 'Removed';
return formatAgentRole(member.role) ?? formatAgentRole(member.agentType) ?? null;
}