fix(i18n): cover missing ui translations

This commit is contained in:
777genius 2026-05-28 18:36:34 +03:00
parent d35f03b396
commit 371bf948c2
87 changed files with 2362 additions and 429 deletions

View file

@ -20,10 +20,10 @@ const props = defineProps<{
reducedMotion?: boolean; reducedMotion?: boolean;
}>(); }>();
const { locale } = useI18n(); const { t, locale } = useI18n();
const localizedHeroFeatureRail = computed(() => getLocalizedHeroFeatureRail(locale.value)); const localizedHeroFeatureRail = computed(() => getLocalizedHeroFeatureRail(locale.value));
const localizedHeroReviewerFeatureCard = computed(() => getLocalizedHeroReviewerFeatureCard(locale.value)); const localizedHeroReviewerFeatureCard = computed(() => getLocalizedHeroReviewerFeatureCard(locale.value));
const statusLabel = computed(() => locale.value === "ru" ? "Статус:" : "Status:"); const statusLabel = computed(() => t("common.statusLabel"));
const icons = [ const icons = [
mdiRobotOutline, mdiRobotOutline,

View file

@ -7,12 +7,12 @@ const props = defineProps<{
activeReceiver?: HeroAgentRole | "video" | null; activeReceiver?: HeroAgentRole | "video" | null;
}>(); }>();
const { locale } = useI18n(); const { t } = useI18n();
const isSender = computed(() => props.activeSender === props.agent.id); const isSender = computed(() => props.activeSender === props.agent.id);
const isReceiver = computed(() => props.activeReceiver === props.agent.id); const isReceiver = computed(() => props.activeReceiver === props.agent.id);
const imageLoading = computed(() => (props.agent.priority ? "eager" : "lazy")); const imageLoading = computed(() => (props.agent.priority ? "eager" : "lazy"));
const imageFetchPriority = computed(() => (props.agent.priority ? "high" : "auto")); const imageFetchPriority = computed(() => (props.agent.priority ? "high" : "auto"));
const statusLabel = computed(() => locale.value === "ru" ? "Статус:" : "Status:"); const statusLabel = computed(() => t("common.statusLabel"));
const rootStyle = computed(() => ({ const rootStyle = computed(() => ({
"--agent-x": String(props.agent.desktop.x), "--agent-x": String(props.agent.desktop.x),

View file

@ -1,6 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
const { locale } = useI18n(); const { t } = useI18n();
const isRu = computed(() => locale.value === "ru");
</script> </script>
<template> <template>
@ -8,12 +7,12 @@ const isRu = computed(() => locale.value === "ru");
id="hero-demo" id="hero-demo"
class="cyber-video-frame" class="cyber-video-frame"
role="region" role="region"
:aria-label="isRu ? 'Смотреть демо Agent Teams' : 'Watch Agent Teams demo'" :aria-label="t('hero.videoFrameLabel')"
> >
<div class="cyber-video-frame__bezel" aria-hidden="true" /> <div class="cyber-video-frame__bezel" aria-hidden="true" />
<div class="cyber-video-frame__status" aria-hidden="true"> <div class="cyber-video-frame__status" aria-hidden="true">
<span>{{ isRu ? 'Командная лента' : 'Team command feed' }}</span> <span>{{ t('hero.commandFeed') }}</span>
<span>{{ isRu ? 'Живое демо' : 'Live demo' }}</span> <span>{{ t('hero.liveDemo') }}</span>
</div> </div>
<div class="cyber-video-frame__content"> <div class="cyber-video-frame__content">
<HeroDemoVideo /> <HeroDemoVideo />

View file

@ -5,7 +5,7 @@ const { t, locale } = useI18n();
const { repoUrl } = useGithubRepo(); const { repoUrl } = useGithubRepo();
const { baseURL } = useRuntimeConfig().app; const { baseURL } = useRuntimeConfig().app;
const year = new Date().getFullYear(); const year = new Date().getFullYear();
const authorLabel = computed(() => locale.value === 'ru' ? 'Автор' : 'Author'); const authorLabel = computed(() => t('footer.links.author'));
const docsHref = computed(() => { const docsHref = computed(() => {
const base = baseURL.replace(/\/?$/, '/'); const base = baseURL.replace(/\/?$/, '/');
return `${base}${locale.value === 'ru' ? 'docs/ru/' : 'docs/'}`; return `${base}${locale.value === 'ru' ? 'docs/ru/' : 'docs/'}`;

View file

@ -8,16 +8,15 @@ const menuOpen = ref(false);
const withBase = (path: string) => `${baseURL.replace(/\/?$/, '/')}${path.replace(/^\/+/, '')}`; const withBase = (path: string) => `${baseURL.replace(/\/?$/, '/')}${path.replace(/^\/+/, '')}`;
const docsHref = computed(() => withBase(locale.value === 'ru' ? 'docs/ru/' : 'docs/')); const docsHref = computed(() => withBase(locale.value === 'ru' ? 'docs/ru/' : 'docs/'));
const isRu = computed(() => locale.value === 'ru'); const openMenuLabel = computed(() => t('nav.openMenu'));
const openMenuLabel = computed(() => (isRu.value ? 'Открыть меню' : 'Open menu')); const closeMenuLabel = computed(() => t('nav.closeMenu'));
const closeMenuLabel = computed(() => (isRu.value ? 'Закрыть меню' : 'Close menu'));
const navItems = computed(() => [ const navItems = computed(() => [
{ href: '#screenshots', label: t('nav.screenshots'), shortLabel: isRu.value ? 'Скрины' : 'Shots' }, { href: '#screenshots', label: t('nav.screenshots'), shortLabel: t('nav.short.screenshots') },
{ href: docsHref.value, label: t('nav.docs'), shortLabel: isRu.value ? 'Док' : 'Docs' }, { href: docsHref.value, label: t('nav.docs'), shortLabel: t('nav.short.docs') },
{ href: '#download', label: t('nav.download'), shortLabel: isRu.value ? 'Скачать' : 'Get' }, { href: '#download', label: t('nav.download'), shortLabel: t('nav.short.download') },
{ href: '#comparison', label: t('nav.comparison'), shortLabel: isRu.value ? 'Сравн.' : 'Compare' }, { href: '#comparison', label: t('nav.comparison'), shortLabel: t('nav.short.comparison') },
{ href: '#pricing', label: t('nav.pricing'), shortLabel: isRu.value ? 'Беспл.' : 'Free' }, { href: '#pricing', label: t('nav.pricing'), shortLabel: t('nav.short.pricing') },
{ href: '#faq', label: t('nav.faq'), shortLabel: 'FAQ' }, { href: '#faq', label: t('nav.faq'), shortLabel: 'FAQ' },
]); ]);
</script> </script>

View file

@ -251,7 +251,7 @@ const releaseDate = computed(() => {
day: 'numeric', day: 'numeric',
}); });
}); });
const linuxRobotBubble = computed(() => locale.value === 'ru' ? 'Готов начать!' : 'Ready to start!'); const linuxRobotBubble = computed(() => t('download.readyToStart'));
</script> </script>

View file

@ -54,14 +54,10 @@ const supportedProviders = [
}, },
] as const; ] as const;
const supportedProvidersLabel = computed(() => ( const supportedProvidersLabel = computed(() => (
locale.value === "ru" t("hero.supportedProviders")
? "Поддерживаем AI-провайдеры"
: "Supported AI providers"
)); ));
const heroSlogan = computed(() => ( const heroSlogan = computed(() => (
locale.value === "ru" t("hero.slogan")
? "Делайте много, почти ничего не делая"
: "Get a lot done by doing very little"
)); ));
const heroDownloadUrl = computed(() => { const heroDownloadUrl = computed(() => {
@ -74,17 +70,13 @@ const heroDownloadUrl = computed(() => {
const docsHref = computed(() => withBase(locale.value === "ru" ? "docs/ru/" : "docs/")); const docsHref = computed(() => withBase(locale.value === "ru" ? "docs/ru/" : "docs/"));
const downloadActionSubtitle = computed(() => { const downloadActionSubtitle = computed(() => {
if (!selectedDownloadAsset.value) { if (!selectedDownloadAsset.value) {
return locale.value === "ru" return t("hero.platformDefault");
? "Для вашей платформы"
: "For your platform";
} }
return selectedDownloadAsset.value.actionSubtitle; return selectedDownloadAsset.value.actionSubtitle;
}); });
const docsActionSubtitle = computed(() => ( const docsActionSubtitle = computed(() => (
locale.value === "ru" t("hero.guidesSetup")
? "Гайды и настройка"
: "Guides and setup"
)); ));
function clearHeroMessageTimers() { function clearHeroMessageTimers() {

View file

@ -27,8 +27,8 @@ const screenshots = computed(() => screenshotData.map((s) => ({
width: s.width, width: s.width,
height: s.height, height: s.height,
}))); })));
const prevLabel = computed(() => locale.value === 'ru' ? 'Предыдущий' : 'Previous'); const prevLabel = computed(() => t('common.previous'));
const nextLabel = computed(() => locale.value === 'ru' ? 'Следующий' : 'Next'); const nextLabel = computed(() => t('common.next'));
const swiperRef = ref<SwiperContainerElement | null>(null); const swiperRef = ref<SwiperContainerElement | null>(null);
const swiperReady = ref(false); const swiperReady = ref(false);

View file

@ -1,7 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted, onUnmounted, watch } from 'vue'; import { computed, ref, onMounted, onUnmounted, watch } from 'vue';
import { mdiRobotOutline, mdiCheckCircleOutline, mdiCodeBraces, mdiMessageTextOutline } from '@mdi/js'; import { mdiRobotOutline, mdiCheckCircleOutline, mdiCodeBraces, mdiMessageTextOutline } from '@mdi/js';
const { t } = useI18n();
// State machine for demo cycle // State machine for demo cycle
type DemoState = 'idle' | 'working' | 'reviewing' | 'done'; type DemoState = 'idle' | 'working' | 'reviewing' | 'done';
const state = ref<DemoState>('idle'); const state = ref<DemoState>('idle');
@ -9,13 +11,13 @@ const state = ref<DemoState>('idle');
// Animated task text // Animated task text
const currentTask = ref(''); const currentTask = ref('');
const taskFading = ref(false); const taskFading = ref(false);
const TASKS = [ const taskMessages = computed(() => [
'Implementing auth middleware...', t('hero.demo.activity.authMiddleware'),
'Writing unit tests for API...', t('hero.demo.activity.unitTests'),
'Reviewing PR #42 changes...', t('hero.demo.activity.reviewPr'),
'Setting up CI/CD pipeline...', t('hero.demo.activity.ciPipeline'),
'Refactoring database layer...', t('hero.demo.activity.refactorDatabase'),
]; ]);
let taskIndex = 0; let taskIndex = 0;
let charTimer: ReturnType<typeof setTimeout> | null = null; let charTimer: ReturnType<typeof setTimeout> | null = null;
@ -28,9 +30,9 @@ const agents = ref([
// Kanban mini-board // Kanban mini-board
const kanbanTasks = ref([ const kanbanTasks = ref([
{ id: 1, text: 'Auth API', col: 'todo' as string }, { id: 1, text: t('hero.demo.tasks.authApi'), col: 'todo' as string },
{ id: 2, text: 'Unit tests', col: 'todo' as string }, { id: 2, text: t('hero.demo.tasks.unitTests'), col: 'todo' as string },
{ id: 3, text: 'CI setup', col: 'todo' as string }, { id: 3, text: t('hero.demo.tasks.ciSetup'), col: 'todo' as string },
]); ]);
function typeNextChar(text: string, index: number) { function typeNextChar(text: string, index: number) {
@ -76,9 +78,9 @@ function runCycle() {
currentTask.value = ''; currentTask.value = '';
taskFading.value = false; taskFading.value = false;
kanbanTasks.value = [ kanbanTasks.value = [
{ id: 1, text: 'Auth API', col: 'todo' }, { id: 1, text: t('hero.demo.tasks.authApi'), col: 'todo' },
{ id: 2, text: 'Unit tests', col: 'todo' }, { id: 2, text: t('hero.demo.tasks.unitTests'), col: 'todo' },
{ id: 3, text: 'CI setup', col: 'todo' }, { id: 3, text: t('hero.demo.tasks.ciSetup'), col: 'todo' },
]; ];
agents.value.forEach(a => a.status = 'idle'); agents.value.forEach(a => a.status = 'idle');
@ -91,7 +93,8 @@ function runCycle() {
agents.value[1].status = 'active'; agents.value[1].status = 'active';
kanbanTasks.value[0].col = 'progress'; kanbanTasks.value[0].col = 'progress';
const task = TASKS[taskIndex % TASKS.length]; const messages = taskMessages.value;
const task = messages[taskIndex % messages.length];
taskIndex++; taskIndex++;
typeNextChar(task, 0); typeNextChar(task, 0);
@ -179,6 +182,16 @@ function colColor(col: string) {
} }
} }
function colLabel(col: string) {
switch (col) {
case 'todo': return t('hero.demo.columns.todo');
case 'progress': return t('hero.demo.columns.progress');
case 'review': return t('hero.demo.columns.review');
case 'done': return t('hero.demo.columns.done');
default: return col.toUpperCase();
}
}
function statusDotColor(status: string) { function statusDotColor(status: string) {
switch (status) { switch (status) {
case 'active': return '#00f0ff'; case 'active': return '#00f0ff';
@ -190,7 +203,7 @@ function statusDotColor(status: string) {
</script> </script>
<template> <template>
<div ref="containerRef" class="hero-demo" role="img" aria-label="Agent team demo"> <div ref="containerRef" class="hero-demo" role="img" :aria-label="t('hero.demo.ariaLabel')">
<div class="hero-demo__content"> <div class="hero-demo__content">
<!-- Header --> <!-- Header -->
<div class="hero-demo__header"> <div class="hero-demo__header">
@ -198,7 +211,7 @@ function statusDotColor(status: string) {
<span class="hero-demo__title">Agent Teams</span> <span class="hero-demo__title">Agent Teams</span>
<span class="hero-demo__badge-live"> <span class="hero-demo__badge-live">
<span class="hero-demo__live-dot" /> <span class="hero-demo__live-dot" />
LIVE {{ t('hero.demo.live') }}
</span> </span>
</div> </div>
</div> </div>
@ -225,7 +238,7 @@ function statusDotColor(status: string) {
<div class="hero-demo__kanban"> <div class="hero-demo__kanban">
<div v-for="col in ['todo', 'progress', 'review', 'done']" :key="col" class="hero-demo__kanban-col"> <div v-for="col in ['todo', 'progress', 'review', 'done']" :key="col" class="hero-demo__kanban-col">
<div class="hero-demo__kanban-label" :style="{ color: colColor(col) }"> <div class="hero-demo__kanban-label" :style="{ color: colColor(col) }">
{{ col === 'progress' ? 'IN PROGRESS' : col.toUpperCase() }} {{ colLabel(col) }}
</div> </div>
<div class="hero-demo__kanban-cards"> <div class="hero-demo__kanban-cards">
<TransitionGroup name="kanban-card"> <TransitionGroup name="kanban-card">
@ -249,7 +262,7 @@ function statusDotColor(status: string) {
<span <span
class="hero-demo__log-text" class="hero-demo__log-text"
:class="{ 'hero-demo__log-text--fading': taskFading }" :class="{ 'hero-demo__log-text--fading': taskFading }"
>{{ currentTask || 'Waiting for tasks...' }}</span> >{{ currentTask || t('hero.demo.waiting') }}</span>
</div> </div>
</div> </div>
</div> </div>

View file

@ -2,19 +2,15 @@
import { computed, onMounted, onUnmounted, ref } from "vue"; import { computed, onMounted, onUnmounted, ref } from "vue";
import { mdiPlay } from "@mdi/js"; import { mdiPlay } from "@mdi/js";
const { t, locale } = useI18n(); const { t } = useI18n();
const config = useRuntimeConfig(); const config = useRuntimeConfig();
const muxAccentColor = "#00f0ff"; const muxAccentColor = "#00f0ff";
const muxPrimaryColor = "#e6fbff"; const muxPrimaryColor = "#e6fbff";
const muxSecondaryColor = "#020617"; const muxSecondaryColor = "#020617";
const muxPlaybackId = computed(() => String(config.public.muxPlaybackId || "").trim()); const muxPlaybackId = computed(() => String(config.public.muxPlaybackId || "").trim());
const videoTitle = computed(() => ( const videoTitle = computed(() => t("hero.demoVideoTitle"));
locale.value === "ru" ? "Демо-видео Agent Teams" : "Agent Teams demo video" const muxVideoTitle = computed(() => t("hero.demoTitle"));
));
const muxVideoTitle = computed(() => (
locale.value === "ru" ? "Демо Agent Teams" : "Agent Teams demo"
));
const muxPlayerUrl = computed(() => { const muxPlayerUrl = computed(() => {
if (!muxPlaybackId.value) return ""; if (!muxPlaybackId.value) return "";

View file

@ -7,7 +7,16 @@
"download": "تحميل", "download": "تحميل",
"pricing": "مجاني", "pricing": "مجاني",
"faq": "الأسئلة الشائعة", "faq": "الأسئلة الشائعة",
"viewOnGithub": "View on GitHub" "viewOnGithub": "View on GitHub",
"openMenu": "فتح القائمة",
"closeMenu": "إغلاق القائمة",
"short": {
"screenshots": "صور",
"docs": "Docs",
"download": "تحميل",
"comparison": "مقارنة",
"pricing": "مجاني"
}
}, },
"hero": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "مفتوح المصدر" "openSource": "مفتوح المصدر"
}, },
"watchDemo": "شاهد العرض", "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": { "download": {
"title": "تحميل", "title": "تحميل",
"detected": "تم الكشف", "detected": "تم الكشف",
"systemRequirements": "متطلبات النظام", "systemRequirements": "متطلبات النظام",
"version": "الإصدار {version}" "version": "الإصدار {version}",
"readyToStart": "جاهز للبدء!"
}, },
"theme": { "theme": {
"dark": "داكن", "dark": "داكن",
@ -100,7 +142,10 @@
"sectionSubtitle": "لقطات شاشة حقيقية من التطبيق — لوحة كانبان، مراجعة الكود، فرق الوكلاء، والمزيد." "sectionSubtitle": "لقطات شاشة حقيقية من التطبيق — لوحة كانبان، مراجعة الكود، فرق الوكلاء، والمزيد."
}, },
"common": { "common": {
"learnMore": "اعرف المزيد" "learnMore": "اعرف المزيد",
"statusLabel": "الحالة:",
"previous": "السابق",
"next": "التالي"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "أنا أنتظر", "robotBubble": "أنا أنتظر",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "المؤلف",
"docs": "التوثيق" "docs": "التوثيق"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "ডাউনলোড করা হয়েছে", "download": "ডাউনলোড করা হয়েছে",
"pricing": "মুক্ত", "pricing": "মুক্ত",
"faq": "FAQ", "faq": "FAQ",
"viewOnGithub": "প্রদর্শন GitHub" "viewOnGithub": "প্রদর্শন GitHub",
"openMenu": "মেনু খুলুন",
"closeMenu": "মেনু বন্ধ করুন",
"short": {
"screenshots": "স্ক্রিন",
"docs": "Docs",
"download": "ডাউনলোড",
"comparison": "তুলনা",
"pricing": "ফ্রি"
}
}, },
"hero": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "উৎস খুলুন" "openSource": "উৎস খুলুন"
}, },
"watchDemo": "নমুনা", "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": { "download": {
"title": "ডাউনলোড করা হয়েছে", "title": "ডাউনলোড করা হয়েছে",
"detected": "সনাক্ত", "detected": "সনাক্ত",
"systemRequirements": "সিস্টেম প্রয়োজন", "systemRequirements": "সিস্টেম প্রয়োজন",
"version": "সংস্করণ {version}" "version": "সংস্করণ {version}",
"readyToStart": "শুরু করার জন্য প্রস্তুত!"
}, },
"theme": { "theme": {
"dark": "কালো", "dark": "কালো",
@ -100,7 +142,10 @@
"sectionSubtitle": "অ্যাপটির বাস্তব স্ক্রিনশট —কানবান বোর্ড, কোড পর্যালোচনা, এজেন্ট দল এবং আরও অনেক কিছু ।" "sectionSubtitle": "অ্যাপটির বাস্তব স্ক্রিনশট —কানবান বোর্ড, কোড পর্যালোচনা, এজেন্ট দল এবং আরও অনেক কিছু ।"
}, },
"common": { "common": {
"learnMore": "অারো জানুন" "learnMore": "অারো জানুন",
"statusLabel": "স্ট্যাটাস:",
"previous": "আগের",
"next": "পরের"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "আমি অপেক্ষা করছি", "robotBubble": "আমি অপেক্ষা করছি",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "লেখক",
"docs": "নথিপত্র" "docs": "নথিপত্র"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "Download", "download": "Download",
"pricing": "Kostenlos", "pricing": "Kostenlos",
"faq": "FAQ", "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": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "Open Source" "openSource": "Open Source"
}, },
"watchDemo": "Demo ansehen", "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": { "download": {
"title": "Herunterladen", "title": "Herunterladen",
"detected": "Erkannt", "detected": "Erkannt",
"systemRequirements": "Systemanforderungen", "systemRequirements": "Systemanforderungen",
"version": "Version {version}" "version": "Version {version}",
"readyToStart": "Bereit zum Start!"
}, },
"theme": { "theme": {
"dark": "Dunkel", "dark": "Dunkel",
@ -100,7 +142,10 @@
"sectionSubtitle": "Echte Screenshots der App — Kanban-Board, Code-Review, Agenten-Teams und mehr." "sectionSubtitle": "Echte Screenshots der App — Kanban-Board, Code-Review, Agenten-Teams und mehr."
}, },
"common": { "common": {
"learnMore": "Mehr erfahren" "learnMore": "Mehr erfahren",
"statusLabel": "Status:",
"previous": "Zurück",
"next": "Weiter"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "Ich warte", "robotBubble": "Ich warte",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "Autor",
"docs": "Dokumentation" "docs": "Dokumentation"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "Download", "download": "Download",
"pricing": "Free", "pricing": "Free",
"faq": "FAQ", "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": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "Open Source" "openSource": "Open Source"
}, },
"watchDemo": "Watch Demo", "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": { "download": {
"title": "Download", "title": "Download",
"detected": "Detected", "detected": "Detected",
"systemRequirements": "System requirements", "systemRequirements": "System requirements",
"version": "Version {version}" "version": "Version {version}",
"readyToStart": "Ready to start!"
}, },
"theme": { "theme": {
"dark": "Dark", "dark": "Dark",
@ -100,7 +142,10 @@
"sectionSubtitle": "Real screenshots from the app — kanban board, code review, agent teams, and more." "sectionSubtitle": "Real screenshots from the app — kanban board, code review, agent teams, and more."
}, },
"common": { "common": {
"learnMore": "Learn more" "learnMore": "Learn more",
"statusLabel": "Status:",
"previous": "Previous",
"next": "Next"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "I'm waiting", "robotBubble": "I'm waiting",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "Author",
"docs": "Documentation" "docs": "Documentation"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "Descargar", "download": "Descargar",
"pricing": "Gratis", "pricing": "Gratis",
"faq": "FAQ", "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": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "Open Source" "openSource": "Open Source"
}, },
"watchDemo": "Ver demo", "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": { "download": {
"title": "Descargar", "title": "Descargar",
"detected": "Detectado", "detected": "Detectado",
"systemRequirements": "Requisitos del sistema", "systemRequirements": "Requisitos del sistema",
"version": "Versión {version}" "version": "Versión {version}",
"readyToStart": "Listo para empezar!"
}, },
"theme": { "theme": {
"dark": "Oscuro", "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." "sectionSubtitle": "Capturas reales de la aplicación — tablero kanban, revisión de código, equipos de agentes y más."
}, },
"common": { "common": {
"learnMore": "Más información" "learnMore": "Más información",
"statusLabel": "Estado:",
"previous": "Anterior",
"next": "Siguiente"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "Estoy esperando", "robotBubble": "Estoy esperando",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "Autor",
"docs": "Documentación" "docs": "Documentación"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "Télécharger", "download": "Télécharger",
"pricing": "Gratuit", "pricing": "Gratuit",
"faq": "FAQ", "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": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "Open Source" "openSource": "Open Source"
}, },
"watchDemo": "Voir la démo", "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": { "download": {
"title": "Télécharger", "title": "Télécharger",
"detected": "Détecté", "detected": "Détecté",
"systemRequirements": "Configuration requise", "systemRequirements": "Configuration requise",
"version": "Version {version}" "version": "Version {version}",
"readyToStart": "Prêt à commencer!"
}, },
"theme": { "theme": {
"dark": "Sombre", "dark": "Sombre",
@ -100,7 +142,10 @@
"sectionSubtitle": "Captures d'écran réelles — tableau kanban, revue de code, équipes d'agents et plus." "sectionSubtitle": "Captures d'écran réelles — tableau kanban, revue de code, équipes d'agents et plus."
}, },
"common": { "common": {
"learnMore": "En savoir plus" "learnMore": "En savoir plus",
"statusLabel": "Statut:",
"previous": "Précédent",
"next": "Suivant"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "J'attends", "robotBubble": "J'attends",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "Auteur",
"docs": "Documentation" "docs": "Documentation"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "डाउनलोड", "download": "डाउनलोड",
"pricing": "मुफ़्त", "pricing": "मुफ़्त",
"faq": "FAQ", "faq": "FAQ",
"viewOnGithub": "View on GitHub" "viewOnGithub": "View on GitHub",
"openMenu": "मेनू खोलें",
"closeMenu": "मेनू बंद करें",
"short": {
"screenshots": "शॉट्स",
"docs": "Docs",
"download": "डाउनलोड",
"comparison": "तुलना",
"pricing": "मुफ्त"
}
}, },
"hero": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "ओपन सोर्स" "openSource": "ओपन सोर्स"
}, },
"watchDemo": "डेमो देखें", "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": { "download": {
"title": "डाउनलोड", "title": "डाउनलोड",
"detected": "पहचाना गया", "detected": "पहचाना गया",
"systemRequirements": "सिस्टम आवश्यकताएँ", "systemRequirements": "सिस्टम आवश्यकताएँ",
"version": "संस्करण {version}" "version": "संस्करण {version}",
"readyToStart": "शुरू करने के लिए तैयार!"
}, },
"theme": { "theme": {
"dark": "डार्क", "dark": "डार्क",
@ -100,7 +142,10 @@
"sectionSubtitle": "ऐप के असली स्क्रीनशॉट — कानबन बोर्ड, कोड रिव्यू, एजेंट टीमें, और बहुत कुछ।" "sectionSubtitle": "ऐप के असली स्क्रीनशॉट — कानबन बोर्ड, कोड रिव्यू, एजेंट टीमें, और बहुत कुछ।"
}, },
"common": { "common": {
"learnMore": "और जानें" "learnMore": "और जानें",
"statusLabel": "स्थिति:",
"previous": "पिछला",
"next": "अगला"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "मैं इंतज़ार कर रहा हूँ", "robotBubble": "मैं इंतज़ार कर रहा हूँ",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "लेखक",
"docs": "दस्तावेज़" "docs": "दस्तावेज़"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "Unduh", "download": "Unduh",
"pricing": "Bebas", "pricing": "Bebas",
"faq": "FAQ", "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": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "Buka Sumber" "openSource": "Buka Sumber"
}, },
"watchDemo": "Watch Demo", "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": { "download": {
"title": "Unduh", "title": "Unduh",
"detected": "Terdeteksi", "detected": "Terdeteksi",
"systemRequirements": "Kebutuhan sistem", "systemRequirements": "Kebutuhan sistem",
"version": "Versi {version}" "version": "Versi {version}",
"readyToStart": "Siap mulai!"
}, },
"theme": { "theme": {
"dark": "Gelap", "dark": "Gelap",
@ -100,7 +142,10 @@
"sectionSubtitle": "Gambar layar nyata dari aplikasi - papan kanban, ulasan kode, tim agen, dan banyak lagi." "sectionSubtitle": "Gambar layar nyata dari aplikasi - papan kanban, ulasan kode, tim agen, dan banyak lagi."
}, },
"common": { "common": {
"learnMore": "Pelajari lagi" "learnMore": "Pelajari lagi",
"statusLabel": "Status:",
"previous": "Sebelumnya",
"next": "Berikutnya"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "Aku menunggu", "robotBubble": "Aku menunggu",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "Penulis",
"docs": "Dokumentasi" "docs": "Dokumentasi"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "ダウンロード", "download": "ダウンロード",
"pricing": "無料", "pricing": "無料",
"faq": "FAQ", "faq": "FAQ",
"viewOnGithub": "View on GitHub" "viewOnGithub": "View on GitHub",
"openMenu": "メニューを開く",
"closeMenu": "メニューを閉じる",
"short": {
"screenshots": "画像",
"docs": "Docs",
"download": "入手",
"comparison": "比較",
"pricing": "無料"
}
}, },
"hero": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "オープンソース" "openSource": "オープンソース"
}, },
"watchDemo": "デモを見る", "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": { "download": {
"title": "ダウンロード", "title": "ダウンロード",
"detected": "検出済み", "detected": "検出済み",
"systemRequirements": "動作環境", "systemRequirements": "動作環境",
"version": "バージョン {version}" "version": "バージョン {version}",
"readyToStart": "開始できます!"
}, },
"theme": { "theme": {
"dark": "ダーク", "dark": "ダーク",
@ -100,7 +142,10 @@
"sectionSubtitle": "アプリの実際のスクリーンショット — カンバンボード、コードレビュー、エージェントチームなど。" "sectionSubtitle": "アプリの実際のスクリーンショット — カンバンボード、コードレビュー、エージェントチームなど。"
}, },
"common": { "common": {
"learnMore": "詳細" "learnMore": "詳細",
"statusLabel": "ステータス:",
"previous": "前へ",
"next": "次へ"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "待ってるよ", "robotBubble": "待ってるよ",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "作者",
"docs": "ドキュメント" "docs": "ドキュメント"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "다운로드", "download": "다운로드",
"pricing": "무료", "pricing": "무료",
"faq": "FAQ", "faq": "FAQ",
"viewOnGithub": "GitHub에서 보기" "viewOnGithub": "GitHub에서 보기",
"openMenu": "메뉴 열기",
"closeMenu": "메뉴 닫기",
"short": {
"screenshots": "샷",
"docs": "문서",
"download": "받기",
"comparison": "비교",
"pricing": "무료"
}
}, },
"hero": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "오픈 소스" "openSource": "오픈 소스"
}, },
"watchDemo": "데모 보기", "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": { "download": {
"title": "다운로드", "title": "다운로드",
"detected": "감지됨", "detected": "감지됨",
"systemRequirements": "시스템 요구 사항", "systemRequirements": "시스템 요구 사항",
"version": "버전 {version}" "version": "버전 {version}",
"readyToStart": "시작할 준비 완료!"
}, },
"theme": { "theme": {
"dark": "다크", "dark": "다크",
@ -100,7 +142,10 @@
"sectionSubtitle": "칸반 보드, 코드 리뷰, 에이전트 팀 등 앱의 실제 스크린샷입니다." "sectionSubtitle": "칸반 보드, 코드 리뷰, 에이전트 팀 등 앱의 실제 스크린샷입니다."
}, },
"common": { "common": {
"learnMore": "자세히 알아보기" "learnMore": "자세히 알아보기",
"statusLabel": "상태:",
"previous": "이전",
"next": "다음"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "기다리고 있어요", "robotBubble": "기다리고 있어요",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "작성자",
"docs": "문서" "docs": "문서"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "Baixar", "download": "Baixar",
"pricing": "Grátis", "pricing": "Grátis",
"faq": "FAQ", "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": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "Open Source" "openSource": "Open Source"
}, },
"watchDemo": "Ver demo", "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": { "download": {
"title": "Baixar", "title": "Baixar",
"detected": "Detectado", "detected": "Detectado",
"systemRequirements": "Requisitos do sistema", "systemRequirements": "Requisitos do sistema",
"version": "Versão {version}" "version": "Versão {version}",
"readyToStart": "Pronto para começar!"
}, },
"theme": { "theme": {
"dark": "Escuro", "dark": "Escuro",
@ -100,7 +142,10 @@
"sectionSubtitle": "Capturas reais do app — quadro kanban, revisão de código, equipes de agentes e mais." "sectionSubtitle": "Capturas reais do app — quadro kanban, revisão de código, equipes de agentes e mais."
}, },
"common": { "common": {
"learnMore": "Saiba mais" "learnMore": "Saiba mais",
"statusLabel": "Status:",
"previous": "Anterior",
"next": "Próximo"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "Estou esperando", "robotBubble": "Estou esperando",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "Autor",
"docs": "Documentação" "docs": "Documentação"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "Скачать", "download": "Скачать",
"pricing": "Бесплатно", "pricing": "Бесплатно",
"faq": "FAQ", "faq": "FAQ",
"viewOnGithub": "GitHub" "viewOnGithub": "GitHub",
"openMenu": "Открыть меню",
"closeMenu": "Закрыть меню",
"short": {
"screenshots": "Скрины",
"docs": "Док",
"download": "Скачать",
"comparison": "Сравн.",
"pricing": "Беспл."
}
}, },
"hero": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "Open Source" "openSource": "Open Source"
}, },
"watchDemo": "Смотреть демо", "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": { "download": {
"title": "Скачать", "title": "Скачать",
"detected": "Определено", "detected": "Определено",
"systemRequirements": "Системные требования", "systemRequirements": "Системные требования",
"version": "Версия {version}" "version": "Версия {version}",
"readyToStart": "Готов начать!"
}, },
"theme": { "theme": {
"dark": "Тёмная", "dark": "Тёмная",
@ -100,7 +142,10 @@
"sectionSubtitle": "Реальные скриншоты приложения — канбан-доска, код-ревью, команды агентов и многое другое." "sectionSubtitle": "Реальные скриншоты приложения — канбан-доска, код-ревью, команды агентов и многое другое."
}, },
"common": { "common": {
"learnMore": "Подробнее" "learnMore": "Подробнее",
"statusLabel": "Статус:",
"previous": "Предыдущий",
"next": "Следующий"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "Я жду", "robotBubble": "Я жду",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "Автор",
"docs": "Документация" "docs": "Документация"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "گر تے ہوئے", "download": "گر تے ہوئے",
"pricing": "مفت", "pricing": "مفت",
"faq": "FAQ", "faq": "FAQ",
"viewOnGithub": "دیکھیں GitHub" "viewOnGithub": "دیکھیں GitHub",
"openMenu": "مینو کھولیں",
"closeMenu": "مینو بند کریں",
"short": {
"screenshots": "تصاویر",
"docs": "Docs",
"download": "ڈاؤن لوڈ",
"comparison": "موازنہ",
"pricing": "مفت"
}
}, },
"hero": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "کھولیں" "openSource": "کھولیں"
}, },
"watchDemo": "دیمو", "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": { "download": {
"title": "گر تے ہوئے", "title": "گر تے ہوئے",
"detected": "غیر متصل", "detected": "غیر متصل",
"systemRequirements": "سسٹم تقاضوں", "systemRequirements": "سسٹم تقاضوں",
"version": "ورژن {version}" "version": "ورژن {version}",
"readyToStart": "شروع کرنے کے لیے تیار!"
}, },
"theme": { "theme": {
"dark": "اندھیرا", "dark": "اندھیرا",
@ -100,7 +142,10 @@
"sectionSubtitle": "ایپ کی طرف سے حقیقی اسکرین — کابینہ بورڈ ، کوڈ جائزہ ، ایجنٹ ٹیموں اور زیادہ سے زیادہ" "sectionSubtitle": "ایپ کی طرف سے حقیقی اسکرین — کابینہ بورڈ ، کوڈ جائزہ ، ایجنٹ ٹیموں اور زیادہ سے زیادہ"
}, },
"common": { "common": {
"learnMore": "مزید سیکھیں" "learnMore": "مزید سیکھیں",
"statusLabel": "اسٹیٹس:",
"previous": "پچھلا",
"next": "اگلا"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "میں انتظار کر رہا ہوں", "robotBubble": "میں انتظار کر رہا ہوں",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "مصنف",
"docs": "دستاویز" "docs": "دستاویز"
} }
}, },

View file

@ -7,7 +7,16 @@
"download": "下载", "download": "下载",
"pricing": "免费", "pricing": "免费",
"faq": "常见问题", "faq": "常见问题",
"viewOnGithub": "View on GitHub" "viewOnGithub": "View on GitHub",
"openMenu": "打开菜单",
"closeMenu": "关闭菜单",
"short": {
"screenshots": "截图",
"docs": "文档",
"download": "下载",
"comparison": "比较",
"pricing": "免费"
}
}, },
"hero": { "hero": {
"badge": "Agent Teams", "badge": "Agent Teams",
@ -22,13 +31,46 @@
"openSource": "开源" "openSource": "开源"
}, },
"watchDemo": "观看演示", "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": { "download": {
"title": "下载", "title": "下载",
"detected": "已检测", "detected": "已检测",
"systemRequirements": "系统要求", "systemRequirements": "系统要求",
"version": "版本 {version}" "version": "版本 {version}",
"readyToStart": "准备开始!"
}, },
"theme": { "theme": {
"dark": "深色", "dark": "深色",
@ -100,7 +142,10 @@
"sectionSubtitle": "应用的真实截图——看板、代码审查、智能体团队等等。" "sectionSubtitle": "应用的真实截图——看板、代码审查、智能体团队等等。"
}, },
"common": { "common": {
"learnMore": "了解更多" "learnMore": "了解更多",
"statusLabel": "状态:",
"previous": "上一个",
"next": "下一个"
}, },
"footer": { "footer": {
"copyright": "© {year} Agent Teams", "copyright": "© {year} Agent Teams",
@ -108,6 +153,7 @@
"robotBubble": "我在等你", "robotBubble": "我在等你",
"links": { "links": {
"github": "GitHub", "github": "GitHub",
"author": "作者",
"docs": "文档" "docs": "文档"
} }
}, },

View file

@ -85,6 +85,10 @@ export interface TeamGraphData extends TeamViewSnapshot {
runtimeEntriesByMember?: Record<string, TeamAgentRuntimeEntry>; runtimeEntriesByMember?: Record<string, TeamAgentRuntimeEntry>;
} }
export interface TeamGraphAdapterText {
hiddenBlockingLinks(count: number): string;
}
function toGraphLaunchVisualState( function toGraphLaunchVisualState(
visualState: ReturnType<typeof buildMemberLaunchPresentation>['launchVisualState'] | undefined visualState: ReturnType<typeof buildMemberLaunchPresentation>['launchVisualState'] | undefined
): GraphNode['launchVisualState'] { ): GraphNode['launchVisualState'] {
@ -141,7 +145,8 @@ export class TeamGraphAdapter {
slotAssignments?: Record<string, GraphOwnerSlotAssignment>, slotAssignments?: Record<string, GraphOwnerSlotAssignment>,
layoutMode: GraphLayoutMode = DEFAULT_TEAM_GRAPH_LAYOUT_MODE, layoutMode: GraphLayoutMode = DEFAULT_TEAM_GRAPH_LAYOUT_MODE,
gridOwnerOrder?: readonly string[], gridOwnerOrder?: readonly string[],
activeTaskLogActivity?: Record<string, true> activeTaskLogActivity?: Record<string, true>,
text?: TeamGraphAdapterText
): GraphDataPort { ): GraphDataPort {
if (teamData?.teamName !== teamName) { if (teamData?.teamName !== teamName) {
return TeamGraphAdapter.#emptyResult(teamName); return TeamGraphAdapter.#emptyResult(teamName);
@ -227,7 +232,8 @@ export class TeamGraphAdapter {
memberNodeIdByAlias, memberNodeIdByAlias,
leadId, leadId,
leadName, leadName,
activeTaskLogActivity activeTaskLogActivity,
text
); );
this.#buildProcessNodes(nodes, edges, teamData, teamName, memberNodeIdByAlias); this.#buildProcessNodes(nodes, edges, teamData, teamName, memberNodeIdByAlias);
this.#attachActivityFeeds(nodes, teamData, teamName, leadId, leadName); this.#attachActivityFeeds(nodes, teamData, teamName, leadId, leadName);
@ -673,7 +679,8 @@ export class TeamGraphAdapter {
memberNodeIdByAlias?: ReadonlyMap<string, string>, memberNodeIdByAlias?: ReadonlyMap<string, string>,
leadId?: string, leadId?: string,
leadName?: string, leadName?: string,
activeTaskLogActivity?: Record<string, true> activeTaskLogActivity?: Record<string, true>,
text?: TeamGraphAdapterText
): void { ): void {
const taskStateById = new Map< const taskStateById = new Map<
string, string,
@ -869,9 +876,10 @@ export class TeamGraphAdapter {
sourceTaskIds: Array.from(edge.sourceTaskIds), sourceTaskIds: Array.from(edge.sourceTaskIds),
targetTaskIds: Array.from(edge.targetTaskIds), targetTaskIds: Array.from(edge.targetTaskIds),
label: label:
edge.aggregateCount > 1 && edge.aggregateCount > 1 &&
(edge.source.includes(':overflow:') || edge.target.includes(':overflow:')) (edge.source.includes(':overflow:') || edge.target.includes(':overflow:'))
? `${edge.aggregateCount} hidden blocking links` ? (text?.hiddenBlockingLinks(edge.aggregateCount) ??
`${edge.aggregateCount} hidden blocking links`)
: undefined, : undefined,
})) }))
); );

View file

@ -5,6 +5,7 @@
import { useLayoutEffect, useMemo, useRef, useSyncExternalStore } from 'react'; import { useLayoutEffect, useMemo, useRef, useSyncExternalStore } from 'react';
import { useAppTranslation } from '@features/localization/renderer';
import { useTeamAgentRuntimeWatcher } from '@renderer/components/team/useTeamAgentRuntimeWatcher'; import { useTeamAgentRuntimeWatcher } from '@renderer/components/team/useTeamAgentRuntimeWatcher';
import { getSnapshot, subscribe } from '@renderer/services/commentReadStorage'; import { getSnapshot, subscribe } from '@renderer/services/commentReadStorage';
import { useStore } from '@renderer/store'; import { useStore } from '@renderer/store';
@ -65,9 +66,17 @@ export function useTeamGraphAdapter(
options?: UseTeamGraphAdapterOptions options?: UseTeamGraphAdapterOptions
): GraphDataPort { ): GraphDataPort {
const isActive = options?.active ?? true; const isActive = options?.active ?? true;
const { t } = useAppTranslation('team');
const adapterRef = useRef<TeamGraphAdapter>(TeamGraphAdapter.create()); const adapterRef = useRef<TeamGraphAdapter>(TeamGraphAdapter.create());
const inactiveGraphData = useMemo(() => emptyGraphData(teamName), [teamName]); const inactiveGraphData = useMemo(() => emptyGraphData(teamName), [teamName]);
const lastActiveGraphDataRef = useRef<GraphDataPort>(inactiveGraphData); const lastActiveGraphDataRef = useRef<GraphDataPort>(inactiveGraphData);
const adapterText = useMemo(
() => ({
hiddenBlockingLinks: (count: number) =>
t('agentGraph.blockingEdge.hiddenBlockingLinks', { count }),
}),
[t]
);
const { const {
teamSnapshot, teamSnapshot,
@ -216,7 +225,8 @@ export function useTeamGraphAdapter(
effectiveSlotAssignments, effectiveSlotAssignments,
graphLayoutMode ?? DEFAULT_TEAM_GRAPH_LAYOUT_MODE, graphLayoutMode ?? DEFAULT_TEAM_GRAPH_LAYOUT_MODE,
gridOwnerOrder, gridOwnerOrder,
activeTaskLogActivity activeTaskLogActivity,
adapterText
); );
}, [ }, [
isActive, isActive,
@ -236,6 +246,7 @@ export function useTeamGraphAdapter(
graphLayoutMode, graphLayoutMode,
gridOwnerOrder, gridOwnerOrder,
activeTaskLogActivity, activeTaskLogActivity,
adapterText,
]); ]);
useLayoutEffect(() => { useLayoutEffect(() => {

View file

@ -21,26 +21,47 @@ function isOverflowNode(
return Boolean(node?.kind === 'task' && node.isOverflowStack); 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<BlockingEdgeLabels, 'hiddenTaskStack' | 'hiddenTasks' | 'task'>
): string {
if (!node) return fallback; if (!node) return fallback;
if (isOverflowNode(node)) { if (isOverflowNode(node)) {
return node.overflowCount && node.overflowCount > 1 return node.overflowCount && node.overflowCount > 1
? `${node.overflowCount} hidden tasks` ? labels.hiddenTasks(node.overflowCount)
: 'Hidden task stack'; : labels.hiddenTaskStack;
} }
if (isTaskNode(node)) { if (isTaskNode(node)) {
return `${node.displayId ?? node.label} - ${node.sublabel ?? 'Task'}`; return `${node.displayId ?? node.label} - ${node.sublabel ?? labels.task}`;
} }
return node.label; 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 (!node) return null;
if (isOverflowNode(node)) { if (isOverflowNode(node)) {
return role === 'blocker' ? 'Open blocker stack' : 'Open blocked stack'; return role === 'blocker' ? labels.openBlockerStack : labels.openBlockedStack;
} }
if (isTaskNode(node)) { if (isTaskNode(node)) {
return role === 'blocker' ? 'Open blocker task' : 'Open blocked task'; return role === 'blocker' ? labels.openBlockerTask : labels.openBlockedTask;
} }
return null; return null;
} }
@ -71,10 +92,19 @@ export const GraphBlockingEdgePopover = ({
[teamData?.tasks] [teamData?.tasks]
); );
const relationCount = edge.aggregateCount ?? 1; const relationCount = edge.aggregateCount ?? 1;
const sourceLabel = describeNode(sourceNode, edge.source); const labels: BlockingEdgeLabels = {
const targetLabel = describeNode(targetNode, edge.target); hiddenTaskStack: t('agentGraph.blockingEdge.hiddenTaskStack'),
const sourceActionLabel = getActionLabel(sourceNode, 'blocker'); hiddenTasks: (count) => t('agentGraph.blockingEdge.hiddenTasks', { count }),
const targetActionLabel = getActionLabel(targetNode, 'blocked'); 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 sourceHiddenTasks = resolveEdgeTaskPreview(sourceNode, edge.sourceTaskIds, tasksById);
const targetHiddenTasks = resolveEdgeTaskPreview(targetNode, edge.targetTaskIds, tasksById); const targetHiddenTasks = resolveEdgeTaskPreview(targetNode, edge.targetTaskIds, tasksById);
@ -111,7 +141,7 @@ export const GraphBlockingEdgePopover = ({
variant="outline" variant="outline"
className="border-red-500/30 px-1.5 py-0 text-[10px] text-red-300" className="border-red-500/30 px-1.5 py-0 text-[10px] text-red-300"
> >
{relationCount} links {t('agentGraph.blockingEdge.links', { count: relationCount })}
</Badge> </Badge>
)} )}
</div> </div>

View file

@ -132,7 +132,14 @@ function hasOpenCodeEmptyStateWarning(preview: MemberLogPreviewMember | undefine
function resolveEmptyText( function resolveEmptyText(
preview: MemberLogPreviewMember | undefined, preview: MemberLogPreviewMember | undefined,
loading: boolean, loading: boolean,
error: string | null error: string | null,
labels: {
unsupportedProvider: string;
openCodeLogsDelayed: string;
logsUnavailable: string;
loadingLogs: string;
noRecentLogs: string;
}
): string { ): string {
const hasCodexUnsupportedWarning = preview?.warnings.some( const hasCodexUnsupportedWarning = preview?.warnings.some(
(warning) => warning.code === 'codex_member_wide_not_supported' (warning) => warning.code === 'codex_member_wide_not_supported'
@ -142,34 +149,47 @@ function resolveEmptyText(
(preview?.coverage.length ?? 0) > 0 && (preview?.coverage.length ?? 0) > 0 &&
preview?.coverage.every((coverage) => coverage.provider === 'codex_native_trace'); preview?.coverage.every((coverage) => coverage.provider === 'codex_native_trace');
if (hasOnlyCodexUnsupportedCoverage) { if (hasOnlyCodexUnsupportedCoverage) {
return 'Unsupported provider'; return labels.unsupportedProvider;
} }
if ((preview?.items.length ?? 0) === 0 && hasOpenCodeDeliveryDelayedWarning(preview)) { if ((preview?.items.length ?? 0) === 0 && hasOpenCodeDeliveryDelayedWarning(preview)) {
return 'OpenCode logs delayed'; return labels.openCodeLogsDelayed;
} }
if ((preview?.items.length ?? 0) === 0 && hasOpenCodeRuntimeWarning(preview)) { if ((preview?.items.length ?? 0) === 0 && hasOpenCodeRuntimeWarning(preview)) {
return 'Logs unavailable'; return labels.logsUnavailable;
} }
if (loading && !preview) return 'Loading logs'; if (loading && !preview) return labels.loadingLogs;
if (error && !preview) return 'Logs unavailable'; if (error && !preview) return labels.logsUnavailable;
return 'No recent logs'; 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') { 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') { if (item.kind === 'tool_use') {
return item.toolName?.trim() || 'Tool use'; return item.toolName?.trim() || labels.toolUse;
} }
if (item.kind === 'thinking') { 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 { function compactDisplayTitle(
const title = item.title.trim() || fallbackDisplayTitle(item); item: MemberLogPreviewItem,
labels: Parameters<typeof fallbackDisplayTitle>[1]
): string {
const title = item.title.trim() || fallbackDisplayTitle(item, labels);
if (title.toLowerCase() === 'tool result') { if (title.toLowerCase() === 'tool result') {
return title; return title;
} }
@ -205,7 +225,13 @@ function trimRepeatedTitlePrefix(preview: string, title: string): string {
function compactPreviewText( function compactPreviewText(
item: MemberLogPreviewItem, item: MemberLogPreviewItem,
displayTitle: string, displayTitle: string,
rawDisplayTitle = displayTitle rawDisplayTitle = displayTitle,
labels: {
noErrorOutput: string;
noOutput: string;
noInput: string;
logEvent: string;
}
): string { ): string {
const preview = item.preview?.trim(); const preview = item.preview?.trim();
if (preview) { if (preview) {
@ -217,12 +243,12 @@ function compactPreviewText(
return compact || preview; return compact || preview;
} }
if (item.kind === 'tool_result') { 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') { if (item.kind === 'tool_use') {
return 'No input'; return labels.noInput;
} }
return item.sourceLabel || 'Log event'; return item.sourceLabel || labels.logEvent;
} }
function truncateCompactRowPreview( function truncateCompactRowPreview(
@ -281,6 +307,25 @@ export const GraphMemberLogPreviewHud = ({
onOpenMemberProfile, onOpenMemberProfile,
}: GraphMemberLogPreviewHudProps): React.JSX.Element | null => { }: GraphMemberLogPreviewHudProps): React.JSX.Element | null => {
const { t } = useAppTranslation('team'); 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<HTMLDivElement | null>(null); const worldLayerRef = useRef<HTMLDivElement | null>(null);
const shellRefs = useRef(new Map<string, HTMLDivElement | null>()); const shellRefs = useRef(new Map<string, HTMLDivElement | null>());
const visibleKeyRef = useRef(''); const visibleKeyRef = useRef('');
@ -514,9 +559,14 @@ export const GraphMemberLogPreviewHud = ({
const renderItem = useCallback( const renderItem = useCallback(
(memberName: string, item: MemberLogPreviewItem) => { (memberName: string, item: MemberLogPreviewItem) => {
const relativeTime = formatRelativeTime(item.timestamp); const relativeTime = formatRelativeTime(item.timestamp);
const rawDisplayTitle = compactDisplayTitle(item); const rawDisplayTitle = compactDisplayTitle(item, logPreviewLabels);
const displayTitle = truncateCompactTitle(rawDisplayTitle); const displayTitle = truncateCompactTitle(rawDisplayTitle);
const fullPreviewText = compactPreviewText(item, displayTitle, rawDisplayTitle); const fullPreviewText = compactPreviewText(
item,
displayTitle,
rawDisplayTitle,
logPreviewLabels
);
const previewText = truncateCompactRowPreview(fullPreviewText, displayTitle, relativeTime); const previewText = truncateCompactRowPreview(fullPreviewText, displayTitle, relativeTime);
const titleText = compactRowLabel([rawDisplayTitle, relativeTime, fullPreviewText]); const titleText = compactRowLabel([rawDisplayTitle, relativeTime, fullPreviewText]);
const isHighlighted = highlightedItemIds.has(buildRenderedItemKey(memberName, item.id)); const isHighlighted = highlightedItemIds.has(buildRenderedItemKey(memberName, item.id));
@ -565,7 +615,7 @@ export const GraphMemberLogPreviewHud = ({
</button> </button>
); );
}, },
[highlightedItemIds, openLogs] [highlightedItemIds, logPreviewLabels, openLogs]
); );
if (!enabled || ownerNodes.length === 0) { 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`} 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)} onClick={() => openLogs(memberName)}
> >
{resolveEmptyText(preview, loading, error)} {resolveEmptyText(preview, loading, error, logPreviewLabels)}
</button> </button>
)} )}
{preview && preview.overflowCount > 0 ? ( {preview && preview.overflowCount > 0 ? (

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "مضافا إليها API المفتاح", "add": "مضافا إليها API المفتاح",
"addFirst": "أضف مفتاحك الأول", "addFirst": "أضف مفتاحك الأول",
"edit": "Edit" "edit": "Edit",
"copied": "تم النسخ!",
"copyEnvVarName": "نسخ اسم متغير env",
"confirmDelete": "انقر مرة أخرى للتأكيد",
"delete": "حذف"
}, },
"empty": { "empty": {
"title": "لا API المفاتيح الموفرة", "title": "لا API المفاتيح الموفرة",

View file

@ -46,7 +46,8 @@
"copiedShort": "Copied", "copiedShort": "Copied",
"copy": "تشخيص النسخ", "copy": "تشخيص النسخ",
"hints": "Hints", "hints": "Hints",
"likelyCause": "السبب الغالب:" "likelyCause": "السبب الغالب:",
"windowsSymlinkAdminHint": "Windows: شغّل Agent Teams AI كمسؤول"
}, },
"models": { "models": {
"alreadyDefault": "هذا هو التخلف المختار من قبل", "alreadyDefault": "هذا هو التخلف المختار من قبل",
@ -64,7 +65,15 @@
"searchPlaceholder": "نماذج البحث", "searchPlaceholder": "نماذج البحث",
"selectProjectBeforeTesting": "اختيار سياق المشروع قبل نماذج الاختبار.", "selectProjectBeforeTesting": "اختيار سياق المشروع قبل نماذج الاختبار.",
"selectProjectBeforeTestingDefaults": "Select a project context before testing orving OpenCode defaults.", "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": { "providers": {
"catalog": "مُقدِّم الخدمات المفتوحة", "catalog": "مُقدِّم الخدمات المفتوحة",
@ -108,7 +117,8 @@
"needsTest": "اختبار الاحتياجات", "needsTest": "اختبار الاحتياجات",
"failed": "فشل", "failed": "فشل",
"unknown": "مجهول", "unknown": "مجهول",
"default": "العجز" "default": "العجز",
"knownRoute": "route معروف"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234" "baseUrlPlaceholder": "http://localhost:1234"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API تم تشكيل المفتاح ولكن لم يتم التحقق منه بعد", "apiKeyConfiguredNotVerified": "API تم تشكيل المفتاح ولكن لم يتم التحقق منه بعد",
"apiKeyModeMissingCredential": "API الطريقة الرئيسية المختارة، ولكن لا API مفتاح تم تشكيله", "apiKeyModeMissingCredential": "API الطريقة الرئيسية المختارة، ولكن لا API مفتاح تم تشكيله",
"connectedVia": "Connected via {{method}}", "connectedVia": "Connected via {{method}}",
"unableToVerify": "غير قادر على التحقق" "unableToVerify": "غير قادر على التحقق",
"modelsAvailable": "النماذج متاحة"
}, },
"mode": { "mode": {
"selectedAuth": "Selected auth: {{authMode}}", "selectedAuth": "Selected auth: {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "الدورة", "session": "الدورة",
"stallNudge": "كشك", "stallNudge": "كشك",
"start": "البدء", "start": "البدء",
"workSync": "تزامن العمل" "workSync": "تزامن العمل",
"agentError": "خطأ الوكيل",
"apiError": "خطأ API"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "بوتستراب اعترف", "acknowledged": "بوتستراب اعترف",
@ -77,7 +79,11 @@
"action": "الرد" "action": "الرد"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "قيد التنفيذ" "inProgress": "قيد التنفيذ",
"expandInProgress": "توسيع قيد التنفيذ",
"collapseInProgress": "طي قيد التنفيذ",
"reviewing": "يراجع",
"workingOn": "يعمل على"
}, },
"expandDialog": { "expandDialog": {
"description": "رؤية موسعة للرسالة" "description": "رؤية موسعة للرسالة"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "ستظهر بيانات الفريق بمجرد الانتهاء من توفيرها", "waitingForProvisioning": "ستظهر بيانات الفريق بمجرد الانتهاء من توفيرها",
"context": { "context": {
"title": "السياق" "title": "السياق",
"loading": "جار التحميل...",
"noSessionLoaded": "لم يتم تحميل أي جلسة",
"closePanel": "إغلاق لوحة سياق {{team}}",
"loadingContext": "جار تحميل السياق...",
"openLeadSession": "افتح جلسة قائد الفريق لعرض السياق."
} }
}, },
"review": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "لا توجد مصادر للسجلات", "emptyMessage": "لا توجد مصادر للسجلات",
"ariaLabel": "المصدر", "ariaLabel": "المصدر",
"leadLabel": "الرصاص", "leadLabel": "الرصاص",
"selectSourceEmpty": "اختيار مصدر سجل." "selectSourceEmpty": "اختيار مصدر سجل.",
"leadDescription": "قائد الفريق",
"removedLabel": "تمت الإزالة",
"removedDescription": "تمت الإزالة"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} أكثر", "more_one": "+{{count}} أكثر",
"more_other": "+{{count}} أكثر", "more_other": "+{{count}} أكثر",
"more_few": "+{{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": { "blockingEdge": {
"title": "الإعالة", "title": "الإعالة",
"blocks": "اللبنات", "blocks": "اللبنات",
"close": "اقترب", "close": "اقترب",
"blockingHiddenTasks": "حجب المهام الخفية", "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": { "activityHud": {
"activity": "النشاط", "activity": "النشاط",
@ -1778,7 +1817,11 @@
"autoRefresh": "تطهير السيارات", "autoRefresh": "تطهير السيارات",
"wrapLines": "خطوط الغضب", "wrapLines": "خطوط الغضب",
"loadingTail": "عملية تحديد الموقع", "loadingTail": "عملية تحديد الموقع",
"empty": "لم يتم القبض على ملف سجل العمليات لهذا العضو بعد" "empty": "لم يتم القبض على ملف سجل العمليات لهذا العضو بعد",
"copy": "نسخ",
"fileEmpty": "ملف سجل العملية فارغ.",
"showingLast": "عرض آخر {{bytes}}.",
"showing": "عرض {{bytes}}."
}, },
"tasks": { "tasks": {
"empty": "No tasks assigned to this member" "empty": "No tasks assigned to this member"
@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "اثبت او اعيد تشغيل الكود المفتوح من بطاقة مركز المزود ثم اعيد فتح هذا الرقم", "openCodeRuntimeMissing": "اثبت او اعيد تشغيل الكود المفتوح من بطاقة مركز المزود ثم اعيد فتح هذا الرقم",
"openCodeAppMcpUnreachable": "البدء من جديد لتنشيط طلب الموافقة المفتوحة MCP الجسر إذا كرر، إعادة تشغيل التطبيق وفتح الوقت.", "openCodeAppMcpUnreachable": "البدء من جديد لتنشيط طلب الموافقة المفتوحة MCP الجسر إذا كرر، إعادة تشغيل التطبيق وفتح الوقت.",
"cliBinaryMissing": "تأكد من كلود المحلي CLI وجود ثنائي ويمكن البدء به، ثم إعادة فتح هذا الهاتف.", "cliBinaryMissing": "تأكد من كلود المحلي CLI وجود ثنائي ويمكن البدء به، ثم إعادة فتح هذا الهاتف.",
"default": "حل المسألة أعلاه، ثم إعادة فتح هذا الهاتف." "default": "حل المسألة أعلاه، ثم إعادة فتح هذا الهاتف.",
"openCodeNodeModulesSymlinkPermission": "شغّل Agent Teams AI كمسؤول، ثم أعد محاولة launch."
} }
}, },
"presentation": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "الأفرقة العاملة" "title": "الأفرقة العاملة",
"status": {
"active": "نشط",
"provisioning": "قيد التشغيل",
"idle": "يعمل"
},
"noProject": "بدون مشروع"
}, },
"layout": { "layout": {
"maxPanesReached": "الحد الأقصى {{count}} لقد وصلت" "maxPanesReached": "الحد الأقصى {{count}} لقد وصلت"
}, },
"codexReconnect": { "codexReconnect": {
"description": "جلسة كودوكس تبدو ثابتة أعيد الاتصال", "description": "جلسة كودوكس تبدو ثابتة أعيد الاتصال",
"useCode": "رمز الاستخدام" "useCode": "رمز الاستخدام",
"generating": "جار الإنشاء...",
"openLogin": "فتح تسجيل الدخول",
"generateLink": "إنشاء رابط"
}, },
"effortLevel": { "effortLevel": {
"label": "مستوى الإنفاق (اختياري)", "label": "مستوى الإنفاق (اختياري)",
@ -2428,6 +2481,7 @@
"customRole": "دور الجمارك...", "customRole": "دور الجمارك...",
"searchPlaceholder": "أدوار البحث...", "searchPlaceholder": "أدوار البحث...",
"empty": "لا توجد أدوار", "empty": "لا توجد أدوار",
"reservedRole": "هذا الدور محجوز" "reservedRole": "هذا الدور محجوز",
"emptyCustomRole": "لا يمكن أن يكون الدور فارغا"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "যোগ করুন API কি", "add": "যোগ করুন API কি",
"addFirst": "প্রথমে কি যোগ করুন", "addFirst": "প্রথমে কি যোগ করুন",
"edit": "সম্পাদনা" "edit": "সম্পাদনা",
"copied": "কপি হয়েছে!",
"copyEnvVarName": "Env var name copy করুন",
"confirmDelete": "Confirm করতে আবার ক্লিক করুন",
"delete": "Delete"
}, },
"empty": { "empty": {
"title": "না API সংরক্ষিত কি", "title": "না API সংরক্ষিত কি",

View file

@ -46,7 +46,8 @@
"copiedShort": "প্রতিলিপি", "copiedShort": "প্রতিলিপি",
"copy": "ডায়গনিস্টিক কপি করুন", "copy": "ডায়গনিস্টিক কপি করুন",
"hints": "ইঙ্গিত", "hints": "ইঙ্গিত",
"likelyCause": "হতে পারে:" "likelyCause": "হতে পারে:",
"windowsSymlinkAdminHint": "Windows: Agent Teams AI অ্যাডমিনিস্ট্রেটর হিসেবে চালান"
}, },
"models": { "models": {
"alreadyDefault": "বর্তমানে নির্বাচিত ডিফল্ট মান ।", "alreadyDefault": "বর্তমানে নির্বাচিত ডিফল্ট মান ।",
@ -64,7 +65,15 @@
"searchPlaceholder": "অনুসন্ধানের মডেল", "searchPlaceholder": "অনুসন্ধানের মডেল",
"selectProjectBeforeTesting": "মডেল পরীক্ষার পূর্বে একটি প্রজেক্ট প্রসঙ্গ নির্বাচন করুন।", "selectProjectBeforeTesting": "মডেল পরীক্ষার পূর্বে একটি প্রজেক্ট প্রসঙ্গ নির্বাচন করুন।",
"selectProjectBeforeTestingDefaults": "পরীক্ষা অথবা সংরক্ষণ করার পূর্বে একটি প্রজেক্ট প্রসঙ্গ নির্বাচন করুন ।", "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": { "providers": {
"catalog": "OpenCode উপলব্ধকারী ক্যাটালগ", "catalog": "OpenCode উপলব্ধকারী ক্যাটালগ",
@ -108,7 +117,8 @@
"needsTest": "একটি পরীক্ষা প্রয়োজন", "needsTest": "একটি পরীক্ষা প্রয়োজন",
"failed": "বিফল", "failed": "বিফল",
"unknown": "অজানা", "unknown": "অজানা",
"default": "ডিফল্ট" "default": "ডিফল্ট",
"knownRoute": "পরিচিত route"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234" "baseUrlPlaceholder": "http://localhost:1234"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API কি ইম্পোর্ট করা হয়নি কিন্তু যাচাই করা হয়নি", "apiKeyConfiguredNotVerified": "API কি ইম্পোর্ট করা হয়নি কিন্তু যাচাই করা হয়নি",
"apiKeyModeMissingCredential": "API চাবি নির্বাচন করা হয়েছে, কিন্তু কিছুই নির্বাচিত নয় API কি কনফিগার করা হয়েছে", "apiKeyModeMissingCredential": "API চাবি নির্বাচন করা হয়েছে, কিন্তু কিছুই নির্বাচিত নয় API কি কনফিগার করা হয়েছে",
"connectedVia": "পরিচিতির সাথে সংযোগ করা হয়েছে {{method}}", "connectedVia": "পরিচিতির সাথে সংযোগ করা হয়েছে {{method}}",
"unableToVerify": "যাচাই করতে ব্যর্থ" "unableToVerify": "যাচাই করতে ব্যর্থ",
"modelsAvailable": "মডেল উপলব্ধ"
}, },
"mode": { "mode": {
"selectedAuth": "নির্বাচিত অনুমোদন {{authMode}}", "selectedAuth": "নির্বাচিত অনুমোদন {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "সেশান", "session": "সেশান",
"stallNudge": "স্থগিত রাখো", "stallNudge": "স্থগিত রাখো",
"start": "আরম্ভ", "start": "আরম্ভ",
"workSync": "সুসংগতি কর্ম" "workSync": "সুসংগতি কর্ম",
"agentError": "Agent Error",
"apiError": "API Error"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "বুটস্ট্র্যাপ স্বীকার করেছে", "acknowledged": "বুটস্ট্র্যাপ স্বীকার করেছে",
@ -77,7 +79,11 @@
"action": "প্রত্যুত্তর" "action": "প্রত্যুত্তর"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "চলছে" "inProgress": "চলছে",
"expandInProgress": "In progress খুলুন",
"collapseInProgress": "In progress বন্ধ করুন",
"reviewing": "review করছে",
"workingOn": "কাজ করছে"
}, },
"expandDialog": { "expandDialog": {
"description": "তালিকা" "description": "তালিকা"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "দলের তথ্য একযোগে উপলব্ধ করা হবে", "waitingForProvisioning": "দলের তথ্য একযোগে উপলব্ধ করা হবে",
"context": { "context": {
"title": "কনটেক্সট" "title": "কনটেক্সট",
"loading": "লোড হচ্ছে...",
"noSessionLoaded": "Session loaded নয়",
"closePanel": "{{team}} context panel বন্ধ করুন",
"loadingContext": "Context লোড হচ্ছে...",
"openLeadSession": "Context দেখতে team lead session খুলুন."
} }
}, },
"review": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "কোনো লগ পাওয়া যায়নি।", "emptyMessage": "কোনো লগ পাওয়া যায়নি।",
"ariaLabel": "উৎসের উৎস", "ariaLabel": "উৎসের উৎস",
"leadLabel": "লিড", "leadLabel": "লিড",
"selectSourceEmpty": "একটি লগ উৎস নির্বাচন করুন।" "selectSourceEmpty": "একটি লগ উৎস নির্বাচন করুন।",
"leadDescription": "Team Lead",
"removedLabel": "সরানো হয়েছে",
"removedDescription": "সরানো হয়েছে"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} আরও", "more_one": "+{{count}} আরও",
"more_other": "+{{count}} আরও", "more_other": "+{{count}} আরও",
"more_few": "+{{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": { "blockingEdge": {
"title": "নির্ভরতা ব্লক করা হচ্ছে", "title": "নির্ভরতা ব্লক করা হচ্ছে",
"blocks": "ব্লক", "blocks": "ব্লক",
"close": "বন্ধ", "close": "বন্ধ",
"blockingHiddenTasks": "আড়াল করা কাজ বন্ধ করা হচ্ছে", "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": { "activityHud": {
"activity": "কর্ম", "activity": "কর্ম",
@ -1778,7 +1817,11 @@
"autoRefresh": "নতুন করেত প্রদর্শন ( r)", "autoRefresh": "নতুন করেত প্রদর্শন ( r)",
"wrapLines": "লাইন গুটানো", "wrapLines": "লাইন গুটানো",
"loadingTail": "প্রসেসটি লগ- ইন করা হচ্ছে...", "loadingTail": "প্রসেসটি লগ- ইন করা হচ্ছে...",
"empty": "এই সদস্য জন্য কোনো প্রসেস লগ ফাইল পাওয়া যায়নি।" "empty": "এই সদস্য জন্য কোনো প্রসেস লগ ফাইল পাওয়া যায়নি।",
"copy": "Copy",
"fileEmpty": "Process log file খালি.",
"showingLast": "শেষ {{bytes}} দেখানো হচ্ছে.",
"showing": "{{bytes}} দেখানো হচ্ছে."
}, },
"tasks": { "tasks": {
"empty": "এই সদস্যে কোনো কাজ নির্ধারিত হয়নি" "empty": "এই সদস্যে কোনো কাজ নির্ধারিত হয়নি"
@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "পরিসেবা উপলব্ধকারীর অবস্থা থেকে আরম্ভ করে এই ডায়লগ পুনরায় আরম্ভ করুন।", "openCodeRuntimeMissing": "পরিসেবা উপলব্ধকারীর অবস্থা থেকে আরম্ভ করে এই ডায়লগ পুনরায় আরম্ভ করুন।",
"openCodeAppMcpUnreachable": "OpenChod অ্যাপ্লিকেশন পুনরায় চালু করতে পুনরায় চেষ্টা করুন MCP ব্রিজ. যদি এটা আবার হয়, তাহলে অ্যাপ্লিকেশন পুনরায় চালু করুন এবং ওপেনোডে ধারণ করুন।", "openCodeAppMcpUnreachable": "OpenChod অ্যাপ্লিকেশন পুনরায় চালু করতে পুনরায় চেষ্টা করুন MCP ব্রিজ. যদি এটা আবার হয়, তাহলে অ্যাপ্লিকেশন পুনরায় চালু করুন এবং ওপেনোডে ধারণ করুন।",
"cliBinaryMissing": "স্থানীয় Klalou নিশ্চিত করুন CLI বাইনারি উপস্থিত রয়েছে এবং এটি পুনরায় আরম্ভ করা যাবে।", "cliBinaryMissing": "স্থানীয় Klalou নিশ্চিত করুন CLI বাইনারি উপস্থিত রয়েছে এবং এটি পুনরায় আরম্ভ করা যাবে।",
"default": "উপরে ব্যাপারটা সমাধান করো, তারপর এই সংলাপ খুলে দাও।" "default": "উপরে ব্যাপারটা সমাধান করো, তারপর এই সংলাপ খুলে দাও।",
"openCodeNodeModulesSymlinkPermission": "Agent Teams AI অ্যাডমিনিস্ট্রেটর হিসেবে চালান, তারপর launch আবার চেষ্টা করুন।"
} }
}, },
"presentation": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "চলছে" "title": "চলছে",
"status": {
"active": "সক্রিয়",
"provisioning": "শুরু হচ্ছে",
"idle": "চলছে"
},
"noProject": "কোনো project নেই"
}, },
"layout": { "layout": {
"maxPanesReached": "সর্বোচ্চ মান {{count}} পার্শ্ববর্তী পেইন" "maxPanesReached": "সর্বোচ্চ মান {{count}} পার্শ্ববর্তী পেইন"
}, },
"codexReconnect": { "codexReconnect": {
"description": "আপনার কোডেক্স সেশনটা খুব পুরনো মনে হচ্ছে. পুনরায় চালু করা।", "description": "আপনার কোডেক্স সেশনটা খুব পুরনো মনে হচ্ছে. পুনরায় চালু করা।",
"useCode": "কোড ব্যবহার করো" "useCode": "কোড ব্যবহার করো",
"generating": "তৈরি হচ্ছে...",
"openLogin": "Login খুলুন",
"generateLink": "Link তৈরি করুন"
}, },
"effortLevel": { "effortLevel": {
"label": "প্রচেষ্টা", "label": "প্রচেষ্টা",
@ -2428,6 +2481,7 @@
"customRole": "স্বনির্ধারিত ভূমিকা...", "customRole": "স্বনির্ধারিত ভূমিকা...",
"searchPlaceholder": "ভূমিকা অনুসন্ধান করুন...", "searchPlaceholder": "ভূমিকা অনুসন্ধান করুন...",
"empty": "কোনো ভূমিকা পাওয়া যায়নি।", "empty": "কোনো ভূমিকা পাওয়া যায়নি।",
"reservedRole": "এই ভূমিকা সংরক্ষিত রয়েছে" "reservedRole": "এই ভূমিকা সংরক্ষিত রয়েছে",
"emptyCustomRole": "Role খালি হতে পারে না"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "Hinzufügen API Schlüssel", "add": "Hinzufügen API Schlüssel",
"addFirst": "Fügen Sie Ihren ersten Schlüssel hinzu", "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": { "empty": {
"title": "Nein API Schlüssel gespeichert", "title": "Nein API Schlüssel gespeichert",

View file

@ -46,7 +46,8 @@
"copiedShort": "gekreppt", "copiedShort": "gekreppt",
"copy": "Kopieren von Diagnosen", "copy": "Kopieren von Diagnosen",
"hints": "Hinweise", "hints": "Hinweise",
"likelyCause": "Ursache:" "likelyCause": "Ursache:",
"windowsSymlinkAdminHint": "Windows: Agent Teams AI als Administrator ausführen"
}, },
"models": { "models": {
"alreadyDefault": "Dies ist bereits der ausgewählte OpenCode Standard.", "alreadyDefault": "Dies ist bereits der ausgewählte OpenCode Standard.",
@ -64,7 +65,15 @@
"searchPlaceholder": "Suchmodelle", "searchPlaceholder": "Suchmodelle",
"selectProjectBeforeTesting": "Wählen Sie vor dem Testen einen Projektkontext aus.", "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.", "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": { "providers": {
"catalog": "OpenCode Anbieter Katalog", "catalog": "OpenCode Anbieter Katalog",
@ -108,7 +117,8 @@
"needsTest": "Bedarfsprüfung", "needsTest": "Bedarfsprüfung",
"failed": "gescheitert", "failed": "gescheitert",
"unknown": "unbekannt", "unknown": "unbekannt",
"default": "Standard" "default": "Standard",
"knownRoute": "bekannte route"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234" "baseUrlPlaceholder": "http://localhost:1234"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API Schlüssel konfiguriert, aber noch nicht überprüft", "apiKeyConfiguredNotVerified": "API Schlüssel konfiguriert, aber noch nicht überprüft",
"apiKeyModeMissingCredential": "API Schlüsselmodus ausgewählt, aber nein API Schlüssel konfiguriert", "apiKeyModeMissingCredential": "API Schlüsselmodus ausgewählt, aber nein API Schlüssel konfiguriert",
"connectedVia": "Vernetzt über {{method}}", "connectedVia": "Vernetzt über {{method}}",
"unableToVerify": "Unfähig zu überprüfen" "unableToVerify": "Unfähig zu überprüfen",
"modelsAvailable": "Modelle verfügbar"
}, },
"mode": { "mode": {
"selectedAuth": "Ausgewählte Auth: {{authMode}}", "selectedAuth": "Ausgewählte Auth: {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "Sitzung", "session": "Sitzung",
"stallNudge": "stall nudge", "stallNudge": "stall nudge",
"start": "Start", "start": "Start",
"workSync": "Arbeit synchronisiert" "workSync": "Arbeit synchronisiert",
"agentError": "Agent-Fehler",
"apiError": "API-Fehler"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "Bootstrap anerkannt", "acknowledged": "Bootstrap anerkannt",
@ -77,7 +79,11 @@
"action": "Antwort" "action": "Antwort"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "Fortschritte" "inProgress": "Fortschritte",
"expandInProgress": "In Arbeit erweitern",
"collapseInProgress": "In Arbeit einklappen",
"reviewing": "prüft",
"workingOn": "arbeitet an"
}, },
"expandDialog": { "expandDialog": {
"description": "Erweiterte Nachrichtenansicht" "description": "Erweiterte Nachrichtenansicht"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "Teamdaten erscheinen, sobald die Bereitstellung abgeschlossen ist", "waitingForProvisioning": "Teamdaten erscheinen, sobald die Bereitstellung abgeschlossen ist",
"context": { "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": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "Keine Protokollquellen gefunden.", "emptyMessage": "Keine Protokollquellen gefunden.",
"ariaLabel": "Datenquelle", "ariaLabel": "Datenquelle",
"leadLabel": "Blei", "leadLabel": "Blei",
"selectSourceEmpty": "Wählen Sie eine Protokollquelle aus." "selectSourceEmpty": "Wählen Sie eine Protokollquelle aus.",
"leadDescription": "Team Lead",
"removedLabel": "entfernt",
"removedDescription": "Entfernt"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} mehr", "more_one": "+{{count}} mehr",
"more_other": "+{{count}} mehr", "more_other": "+{{count}} mehr",
"more_few": "+{{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": { "blockingEdge": {
"title": "Blockierung der Abhängigkeit", "title": "Blockierung der Abhängigkeit",
"blocks": "Blöcke", "blocks": "Blöcke",
"close": "Schließen", "close": "Schließen",
"blockingHiddenTasks": "Blockierung versteckter Aufgaben", "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": { "activityHud": {
"activity": "Tätigkeit", "activity": "Tätigkeit",
@ -1778,7 +1817,11 @@
"autoRefresh": "Auto-refresh", "autoRefresh": "Auto-refresh",
"wrapLines": "Wrap-Linien", "wrapLines": "Wrap-Linien",
"loadingTail": "Ladevorgang log tail...", "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": { "tasks": {
"empty": "Keine Aufgaben, die diesem Mitglied zugewiesen werden" "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.", "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.", "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.", "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": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "Laufende Teams" "title": "Laufende Teams",
"status": {
"active": "Aktiv",
"provisioning": "Startet",
"idle": "Läuft"
},
"noProject": "Kein Projekt"
}, },
"layout": { "layout": {
"maxPanesReached": "Höchstgehalt {{count}} erreichte Scheiben" "maxPanesReached": "Höchstgehalt {{count}} erreichte Scheiben"
}, },
"codexReconnect": { "codexReconnect": {
"description": "Ihre Codex-Session erscheint stabil. Weiterleiten.", "description": "Ihre Codex-Session erscheint stabil. Weiterleiten.",
"useCode": "Bezeichnung" "useCode": "Bezeichnung",
"generating": "Wird generiert...",
"openLogin": "Login öffnen",
"generateLink": "Link generieren"
}, },
"effortLevel": { "effortLevel": {
"label": "Schwierigkeitsgrad (optional)", "label": "Schwierigkeitsgrad (optional)",
@ -2428,6 +2481,7 @@
"customRole": "Individuelle Rolle...", "customRole": "Individuelle Rolle...",
"searchPlaceholder": "Suchrollen...", "searchPlaceholder": "Suchrollen...",
"empty": "Keine Rollen gefunden.", "empty": "Keine Rollen gefunden.",
"reservedRole": "Diese Rolle ist reserviert" "reservedRole": "Diese Rolle ist reserviert",
"emptyCustomRole": "Rolle darf nicht leer sein"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "Add API Key", "add": "Add API Key",
"addFirst": "Add your first 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": { "empty": {
"title": "No API keys saved", "title": "No API keys saved",

View file

@ -46,7 +46,8 @@
"copiedShort": "Copied", "copiedShort": "Copied",
"copy": "Copy diagnostics", "copy": "Copy diagnostics",
"hints": "Hints", "hints": "Hints",
"likelyCause": "Likely cause:" "likelyCause": "Likely cause:",
"windowsSymlinkAdminHint": "Windows: run Agent Teams AI as Administrator"
}, },
"models": { "models": {
"alreadyDefault": "This is already the selected OpenCode default.", "alreadyDefault": "This is already the selected OpenCode default.",

View file

@ -28,7 +28,9 @@
"session": "session", "session": "session",
"stallNudge": "stall nudge", "stallNudge": "stall nudge",
"start": "start", "start": "start",
"workSync": "work sync" "workSync": "work sync",
"agentError": "Agent Error",
"apiError": "API Error"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "Bootstrap acknowledged", "acknowledged": "Bootstrap acknowledged",
@ -77,7 +79,11 @@
"action": "Reply" "action": "Reply"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "In progress" "inProgress": "In progress",
"expandInProgress": "Expand in progress",
"collapseInProgress": "Collapse in progress",
"reviewing": "reviewing",
"workingOn": "working on"
}, },
"expandDialog": { "expandDialog": {
"description": "Expanded message view" "description": "Expanded message view"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "Team data will appear once provisioning completes", "waitingForProvisioning": "Team data will appear once provisioning completes",
"context": { "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": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "No log sources found.", "emptyMessage": "No log sources found.",
"ariaLabel": "Log source", "ariaLabel": "Log source",
"leadLabel": "Lead", "leadLabel": "Lead",
"selectSourceEmpty": "Select a log source." "selectSourceEmpty": "Select a log source.",
"leadDescription": "Team Lead",
"removedLabel": "removed",
"removedDescription": "Removed"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} more", "more_one": "+{{count}} more",
"more_other": "+{{count}} more", "more_other": "+{{count}} more",
"more_few": "+{{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": { "blockingEdge": {
"title": "Blocking Dependency", "title": "Blocking Dependency",
"blocks": "blocks", "blocks": "blocks",
"close": "Close", "close": "Close",
"blockingHiddenTasks": "Blocking hidden tasks", "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": { "activityHud": {
"activity": "Activity", "activity": "Activity",
@ -1778,7 +1817,11 @@
"autoRefresh": "Auto-refresh", "autoRefresh": "Auto-refresh",
"wrapLines": "Wrap lines", "wrapLines": "Wrap lines",
"loadingTail": "Loading process log tail...", "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": { "tasks": {
"empty": "No tasks assigned to this member" "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.", "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.", "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.", "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": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "Running Teams" "title": "Running Teams",
"status": {
"active": "Active",
"provisioning": "Launching",
"idle": "Running"
},
"noProject": "No project"
}, },
"layout": { "layout": {
"maxPanesReached": "Maximum of {{count}} panes reached" "maxPanesReached": "Maximum of {{count}} panes reached"
}, },
"codexReconnect": { "codexReconnect": {
"description": "Your Codex session appears stale. Reconnect to continue.", "description": "Your Codex session appears stale. Reconnect to continue.",
"useCode": "Use code" "useCode": "Use code",
"generating": "Generating...",
"openLogin": "Open login",
"generateLink": "Generate link"
}, },
"effortLevel": { "effortLevel": {
"label": "Effort level (optional)", "label": "Effort level (optional)",
@ -2428,6 +2481,7 @@
"customRole": "Custom role...", "customRole": "Custom role...",
"searchPlaceholder": "Search roles...", "searchPlaceholder": "Search roles...",
"empty": "No roles found.", "empty": "No roles found.",
"reservedRole": "This role is reserved" "reservedRole": "This role is reserved",
"emptyCustomRole": "Role cannot be empty"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "Añadir API Key", "add": "Añadir API Key",
"addFirst": "Añade tu primera llave", "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": { "empty": {
"title": "No se guardan las teclas ZXCV", "title": "No se guardan las teclas ZXCV",

View file

@ -46,7 +46,8 @@
"copiedShort": "Copiado", "copiedShort": "Copiado",
"copy": "Copia diagnóstico", "copy": "Copia diagnóstico",
"hints": "Hintes", "hints": "Hintes",
"likelyCause": "Causa probable:" "likelyCause": "Causa probable:",
"windowsSymlinkAdminHint": "Windows: ejecuta Agent Teams AI como administrador"
}, },
"models": { "models": {
"alreadyDefault": "Este ya es el predeterminado OpenCode seleccionado.", "alreadyDefault": "Este ya es el predeterminado OpenCode seleccionado.",
@ -64,7 +65,15 @@
"searchPlaceholder": "Modelos de búsqueda", "searchPlaceholder": "Modelos de búsqueda",
"selectProjectBeforeTesting": "Seleccione un contexto de proyecto antes de probar modelos.", "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.", "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": { "providers": {
"catalog": "Catálogo de proveedores de OpenCode", "catalog": "Catálogo de proveedores de OpenCode",
@ -108,7 +117,8 @@
"needsTest": "examen de necesidades", "needsTest": "examen de necesidades",
"failed": "fracasado", "failed": "fracasado",
"unknown": "desconocida", "unknown": "desconocida",
"default": "por defecto" "default": "por defecto",
"knownRoute": "route conocida"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234" "baseUrlPlaceholder": "http://localhost:1234"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API llave configurada, pero no verificada", "apiKeyConfiguredNotVerified": "API llave configurada, pero no verificada",
"apiKeyModeMissingCredential": "Modo de tecla API seleccionado, pero no se configura la tecla API", "apiKeyModeMissingCredential": "Modo de tecla API seleccionado, pero no se configura la tecla API",
"connectedVia": "Conectado vía {{method}}", "connectedVia": "Conectado vía {{method}}",
"unableToVerify": "Incapaz de verificar" "unableToVerify": "Incapaz de verificar",
"modelsAvailable": "Modelos disponibles"
}, },
"mode": { "mode": {
"selectedAuth": "Ajuste seleccionado: {{authMode}}", "selectedAuth": "Ajuste seleccionado: {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "período de sesiones", "session": "período de sesiones",
"stallNudge": "¡No!", "stallNudge": "¡No!",
"start": "Empieza", "start": "Empieza",
"workSync": "sincronización de trabajo" "workSync": "sincronización de trabajo",
"agentError": "Error del agente",
"apiError": "Error de API"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "Bootstrap acknowledged", "acknowledged": "Bootstrap acknowledged",
@ -77,7 +79,11 @@
"action": "Respuesta" "action": "Respuesta"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "En curso" "inProgress": "En curso",
"expandInProgress": "Expandir en progreso",
"collapseInProgress": "Contraer en progreso",
"reviewing": "revisando",
"workingOn": "trabajando en"
}, },
"expandDialog": { "expandDialog": {
"description": "Ampliación de la vista del mensaje" "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", "waitingForProvisioning": "Los datos del equipo aparecerán una vez que se complete el suministro",
"context": { "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": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "No hay fuentes de registro encontradas.", "emptyMessage": "No hay fuentes de registro encontradas.",
"ariaLabel": "Fuente de registro", "ariaLabel": "Fuente de registro",
"leadLabel": "Lead", "leadLabel": "Lead",
"selectSourceEmpty": "Seleccione una fuente de registro." "selectSourceEmpty": "Seleccione una fuente de registro.",
"leadDescription": "Líder del equipo",
"removedLabel": "eliminado",
"removedDescription": "Eliminado"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} más", "more_one": "+{{count}} más",
"more_other": "+{{count}} más", "more_other": "+{{count}} más",
"more_few": "+{{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": { "blockingEdge": {
"title": "Bloqueo de la dependencia", "title": "Bloqueo de la dependencia",
"blocks": "bloques", "blocks": "bloques",
"close": "Cerca", "close": "Cerca",
"blockingHiddenTasks": "Bloqueo de tareas ocultas", "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": { "activityHud": {
"activity": "Actividad", "activity": "Actividad",
@ -1778,7 +1817,11 @@
"autoRefresh": "Auto-refresh", "autoRefresh": "Auto-refresh",
"wrapLines": "Líneas de trampa", "wrapLines": "Líneas de trampa",
"loadingTail": "Carga de proceso log tail...", "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": { "tasks": {
"empty": "No se han asignado tareas a este miembro" "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.", "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.", "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.", "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": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "Equipos de ejecución" "title": "Equipos de ejecución",
"status": {
"active": "Activo",
"provisioning": "Iniciando",
"idle": "En ejecución"
},
"noProject": "Sin proyecto"
}, },
"layout": { "layout": {
"maxPanesReached": "Máximo de los paneles {{count}} alcanzado" "maxPanesReached": "Máximo de los paneles {{count}} alcanzado"
}, },
"codexReconnect": { "codexReconnect": {
"description": "Su sesión de Codex parece ser firme. Reconéctate para continuar.", "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": { "effortLevel": {
"label": "Nivel de esfuerzo (opcional)", "label": "Nivel de esfuerzo (opcional)",
@ -2428,6 +2481,7 @@
"customRole": "Función personalizada...", "customRole": "Función personalizada...",
"searchPlaceholder": "Funciones de búsqueda...", "searchPlaceholder": "Funciones de búsqueda...",
"empty": "No hay papeles encontrados.", "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"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "Ajouter API Clé", "add": "Ajouter API Clé",
"addFirst": "Ajouter votre première 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": { "empty": {
"title": "Numéro API clés enregistrées", "title": "Numéro API clés enregistrées",

View file

@ -46,7 +46,8 @@
"copiedShort": "Copié", "copiedShort": "Copié",
"copy": "Copier les diagnostics", "copy": "Copier les diagnostics",
"hints": "Conseils", "hints": "Conseils",
"likelyCause": "Cause probable:" "likelyCause": "Cause probable:",
"windowsSymlinkAdminHint": "Windows: lancez Agent Teams AI en tant qu'administrateur"
}, },
"models": { "models": {
"alreadyDefault": "C'est déjà la valeur par défaut d'OpenCode sélectionnée.", "alreadyDefault": "C'est déjà la valeur par défaut d'OpenCode sélectionnée.",
@ -64,7 +65,15 @@
"searchPlaceholder": "Modèles de recherche", "searchPlaceholder": "Modèles de recherche",
"selectProjectBeforeTesting": "Sélectionnez un contexte de projet avant de tester des modèles.", "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.", "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": { "providers": {
"catalog": "Catalogue des fournisseurs OpenCode", "catalog": "Catalogue des fournisseurs OpenCode",
@ -108,7 +117,8 @@
"needsTest": "test des besoins", "needsTest": "test des besoins",
"failed": "échoué", "failed": "échoué",
"unknown": "inconnu", "unknown": "inconnu",
"default": "par défaut" "default": "par défaut",
"knownRoute": "route connue"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234" "baseUrlPlaceholder": "http://localhost:1234"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API clé configurée, mais non encore vérifiée", "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", "apiKeyModeMissingCredential": "API mode clé sélectionné, mais non API la clé est configurée",
"connectedVia": "Connecté via {{method}}", "connectedVia": "Connecté via {{method}}",
"unableToVerify": "Impossible de vérifier" "unableToVerify": "Impossible de vérifier",
"modelsAvailable": "Modèles disponibles"
}, },
"mode": { "mode": {
"selectedAuth": "Auth sélectionnée: {{authMode}}", "selectedAuth": "Auth sélectionnée: {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "session", "session": "session",
"stallNudge": "Décrochage", "stallNudge": "Décrochage",
"start": "début", "start": "début",
"workSync": "synchronisation de travail" "workSync": "synchronisation de travail",
"agentError": "Erreur d'agent",
"apiError": "Erreur d'API"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "Bootstrap reconnu", "acknowledged": "Bootstrap reconnu",
@ -77,7 +79,11 @@
"action": "Réponse" "action": "Réponse"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "En cours" "inProgress": "En cours",
"expandInProgress": "Développer en cours",
"collapseInProgress": "Réduire en cours",
"reviewing": "relit",
"workingOn": "travaille sur"
}, },
"expandDialog": { "expandDialog": {
"description": "Affichage du message élargi" "description": "Affichage du message élargi"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "Les données de l'équipe apparaîtront une fois la fourniture terminée", "waitingForProvisioning": "Les données de l'équipe apparaîtront une fois la fourniture terminée",
"context": { "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": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "Aucune source de log n'a été trouvée.", "emptyMessage": "Aucune source de log n'a été trouvée.",
"ariaLabel": "Source du journal", "ariaLabel": "Source du journal",
"leadLabel": "Plomb", "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": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} plus", "more_one": "+{{count}} plus",
"more_other": "+{{count}} plus", "more_other": "+{{count}} plus",
"more_few": "+{{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": { "blockingEdge": {
"title": "Bloquer la dépendance", "title": "Bloquer la dépendance",
"blocks": "blocs", "blocks": "blocs",
"close": "Fermer", "close": "Fermer",
"blockingHiddenTasks": "Blocage des tâches cachées", "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": { "activityHud": {
"activity": "Activité", "activity": "Activité",
@ -1778,7 +1817,11 @@
"autoRefresh": "Rénovation automatique", "autoRefresh": "Rénovation automatique",
"wrapLines": "Lignes d'enroulement", "wrapLines": "Lignes d'enroulement",
"loadingTail": "Chargement de la queue de log...", "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": { "tasks": {
"empty": "Aucune tâche assignée à ce membre" "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.", "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.", "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.", "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": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "Équipes de course" "title": "Équipes de course",
"status": {
"active": "Active",
"provisioning": "Lancement",
"idle": "En cours"
},
"noProject": "Aucun projet"
}, },
"layout": { "layout": {
"maxPanesReached": "Maximum de {{count}} vitres atteintes" "maxPanesReached": "Maximum de {{count}} vitres atteintes"
}, },
"codexReconnect": { "codexReconnect": {
"description": "Votre session Codex semble inexistante. Reconnecter pour continuer.", "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": { "effortLevel": {
"label": "Niveau d'effort (facultatif)", "label": "Niveau d'effort (facultatif)",
@ -2428,6 +2481,7 @@
"customRole": "Rôle personnalisé...", "customRole": "Rôle personnalisé...",
"searchPlaceholder": "Rechercher les rôles...", "searchPlaceholder": "Rechercher les rôles...",
"empty": "Aucun rôle trouvé.", "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"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "API कुंजी जोड़ें", "add": "API कुंजी जोड़ें",
"addFirst": "अपनी पहली कुंजी जोड़ें", "addFirst": "अपनी पहली कुंजी जोड़ें",
"edit": "संपादित करें" "edit": "संपादित करें",
"copied": "कॉपी हो गया!",
"copyEnvVarName": "Env var name copy करें",
"confirmDelete": "Confirm करने के लिए फिर क्लिक करें",
"delete": "Delete"
}, },
"empty": { "empty": {
"title": "No API कुंजी बचाया", "title": "No API कुंजी बचाया",

View file

@ -46,7 +46,8 @@
"copiedShort": "Copied", "copiedShort": "Copied",
"copy": "निदान की प्रतिलिपि", "copy": "निदान की प्रतिलिपि",
"hints": "हिंट", "hints": "हिंट",
"likelyCause": "समान कारण:" "likelyCause": "समान कारण:",
"windowsSymlinkAdminHint": "Windows: Agent Teams AI को Administrator के रूप में चलाएं"
}, },
"models": { "models": {
"alreadyDefault": "यह पहले से ही चयनित OpenCode डिफ़ॉल्ट है।", "alreadyDefault": "यह पहले से ही चयनित OpenCode डिफ़ॉल्ट है।",
@ -64,7 +65,15 @@
"searchPlaceholder": "खोज मॉडल", "searchPlaceholder": "खोज मॉडल",
"selectProjectBeforeTesting": "परीक्षण मॉडल से पहले परियोजना संदर्भ का चयन करें।", "selectProjectBeforeTesting": "परीक्षण मॉडल से पहले परियोजना संदर्भ का चयन करें।",
"selectProjectBeforeTestingDefaults": "OpenCode डिफ़ॉल्ट परीक्षण या सहेजने से पहले एक परियोजना संदर्भ का चयन करें।", "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": { "providers": {
"catalog": "ओपनकोड प्रदाता सूची", "catalog": "ओपनकोड प्रदाता सूची",
@ -108,7 +117,8 @@
"needsTest": "परीक्षण", "needsTest": "परीक्षण",
"failed": "असफल", "failed": "असफल",
"unknown": "अज्ञात", "unknown": "अज्ञात",
"default": "डिफ़ॉल्ट" "default": "डिफ़ॉल्ट",
"knownRoute": "ज्ञात route"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234" "baseUrlPlaceholder": "http://localhost:1234"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API कुंजी विन्यास, लेकिन अभी तक सत्यापित नहीं", "apiKeyConfiguredNotVerified": "API कुंजी विन्यास, लेकिन अभी तक सत्यापित नहीं",
"apiKeyModeMissingCredential": "API कुंजी मोड चुना गया है, लेकिन कोई API कुंजी कॉन्फ़िगर किया गया है", "apiKeyModeMissingCredential": "API कुंजी मोड चुना गया है, लेकिन कोई API कुंजी कॉन्फ़िगर किया गया है",
"connectedVia": "कनेक्टेड by {{method}}", "connectedVia": "कनेक्टेड by {{method}}",
"unableToVerify": "सत्यापित करने में असमर्थ" "unableToVerify": "सत्यापित करने में असमर्थ",
"modelsAvailable": "मॉडल उपलब्ध हैं"
}, },
"mode": { "mode": {
"selectedAuth": "चयनित auth: {{authMode}}", "selectedAuth": "चयनित auth: {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "सत्र", "session": "सत्र",
"stallNudge": "स्टाल", "stallNudge": "स्टाल",
"start": "प्रारंभ", "start": "प्रारंभ",
"workSync": "कार्य सिंक" "workSync": "कार्य सिंक",
"agentError": "Agent Error",
"apiError": "API Error"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "बूटस्ट्रैप स्वीकार किया", "acknowledged": "बूटस्ट्रैप स्वीकार किया",
@ -77,7 +79,11 @@
"action": "जवाब दें" "action": "जवाब दें"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "प्रगति में" "inProgress": "प्रगति में",
"expandInProgress": "In progress फैलाएं",
"collapseInProgress": "In progress समेटें",
"reviewing": "review कर रहा है",
"workingOn": "काम कर रहा है"
}, },
"expandDialog": { "expandDialog": {
"description": "विस्तारित संदेश दृश्य" "description": "विस्तारित संदेश दृश्य"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "टीम डेटा एक बार पूरा करने का प्रावधान करेगा", "waitingForProvisioning": "टीम डेटा एक बार पूरा करने का प्रावधान करेगा",
"context": { "context": {
"title": "संदर्भ" "title": "संदर्भ",
"loading": "लोड हो रहा है...",
"noSessionLoaded": "Session loaded नहीं",
"closePanel": "{{team}} context panel बंद करें",
"loadingContext": "Context लोड हो रहा है...",
"openLeadSession": "Context देखने के लिए team lead session खोलें."
} }
}, },
"review": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "कोई लॉग सूत्र नहीं मिला।", "emptyMessage": "कोई लॉग सूत्र नहीं मिला।",
"ariaLabel": "लॉग स्रोत", "ariaLabel": "लॉग स्रोत",
"leadLabel": "लीड", "leadLabel": "लीड",
"selectSourceEmpty": "लॉग स्रोत चुनें।" "selectSourceEmpty": "लॉग स्रोत चुनें।",
"leadDescription": "Team Lead",
"removedLabel": "हटाया गया",
"removedDescription": "हटाया गया"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "{{count}} अधिक", "more_one": "{{count}} अधिक",
"more_other": "{{count}} अधिक", "more_other": "{{count}} अधिक",
"more_few": "{{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": { "blockingEdge": {
"title": "अवरोधन निर्भरता", "title": "अवरोधन निर्भरता",
"blocks": "ब्लॉक", "blocks": "ब्लॉक",
"close": "बंद", "close": "बंद",
"blockingHiddenTasks": "छिपे हुए कार्यों को अवरुद्ध करना", "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": { "activityHud": {
"activity": "गतिविधि", "activity": "गतिविधि",
@ -1778,7 +1817,11 @@
"autoRefresh": "ऑटो रिफ्रेश", "autoRefresh": "ऑटो रिफ्रेश",
"wrapLines": "लपेटें", "wrapLines": "लपेटें",
"loadingTail": "प्रक्रिया लॉग पूंछ लोड हो रहा है...", "loadingTail": "प्रक्रिया लॉग पूंछ लोड हो रहा है...",
"empty": "इस सदस्य के लिए अभी तक कोई प्रक्रिया लॉग फाइल नहीं है।" "empty": "इस सदस्य के लिए अभी तक कोई प्रक्रिया लॉग फाइल नहीं है।",
"copy": "Copy",
"fileEmpty": "Process log file खाली है.",
"showingLast": "अंतिम {{bytes}} दिखा रहे हैं.",
"showing": "{{bytes}} दिखा रहे हैं."
}, },
"tasks": { "tasks": {
"empty": "इस सदस्य को कोई कार्य सौंपा नहीं गया" "empty": "इस सदस्य को कोई कार्य सौंपा नहीं गया"
@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "प्रदाता स्टेटस कार्ड से OpenCode रनटाइम को इंस्टॉल या रीट्री करें, फिर इस संवाद को फिर से खोलें।", "openCodeRuntimeMissing": "प्रदाता स्टेटस कार्ड से OpenCode रनटाइम को इंस्टॉल या रीट्री करें, फिर इस संवाद को फिर से खोलें।",
"openCodeAppMcpUnreachable": "ओपनकोड ऐप MCP पुल को रीफ्रेश करने के लिए रिट्री लॉन्च। यदि यह दोहराता है, तो ऐप और ओपनकोड रनटाइम को पुनः आरंभ करें।", "openCodeAppMcpUnreachable": "ओपनकोड ऐप MCP पुल को रीफ्रेश करने के लिए रिट्री लॉन्च। यदि यह दोहराता है, तो ऐप और ओपनकोड रनटाइम को पुनः आरंभ करें।",
"cliBinaryMissing": "सुनिश्चित करें कि स्थानीय क्लाउड CLI द्विआधारी मौजूद है और इसे शुरू किया जा सकता है, फिर इस संवाद को फिर से खोलना।", "cliBinaryMissing": "सुनिश्चित करें कि स्थानीय क्लाउड CLI द्विआधारी मौजूद है और इसे शुरू किया जा सकता है, फिर इस संवाद को फिर से खोलना।",
"default": "ऊपर इस मुद्दे को हल करें, फिर इस संवाद को फिर से खोलें।" "default": "ऊपर इस मुद्दे को हल करें, फिर इस संवाद को फिर से खोलें।",
"openCodeNodeModulesSymlinkPermission": "Agent Teams AI को Administrator के रूप में चलाएं, फिर launch दोबारा करें."
} }
}, },
"presentation": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "रनिंग टीम" "title": "रनिंग टीम",
"status": {
"active": "सक्रिय",
"provisioning": "शुरू हो रही है",
"idle": "चल रही है"
},
"noProject": "कोई project नहीं"
}, },
"layout": { "layout": {
"maxPanesReached": "{{count}} पैन का अधिकतम प्रवेश" "maxPanesReached": "{{count}} पैन का अधिकतम प्रवेश"
}, },
"codexReconnect": { "codexReconnect": {
"description": "आपका कोडेक्स सत्र कहानी दिखाई देती है। जारी रखने के लिए कनेक्ट करें।", "description": "आपका कोडेक्स सत्र कहानी दिखाई देती है। जारी रखने के लिए कनेक्ट करें।",
"useCode": "कोड" "useCode": "कोड",
"generating": "बन रहा है...",
"openLogin": "Login खोलें",
"generateLink": "Link बनाएं"
}, },
"effortLevel": { "effortLevel": {
"label": "प्रयास स्तर (वैकल्पिक)", "label": "प्रयास स्तर (वैकल्पिक)",
@ -2428,6 +2481,7 @@
"customRole": "कस्टम भूमिका...", "customRole": "कस्टम भूमिका...",
"searchPlaceholder": "खोज भूमिकाओं...", "searchPlaceholder": "खोज भूमिकाओं...",
"empty": "कोई भूमिका नहीं मिली।", "empty": "कोई भूमिका नहीं मिली।",
"reservedRole": "यह भूमिका आरक्षित है" "reservedRole": "यह भूमिका आरक्षित है",
"emptyCustomRole": "Role खाली नहीं हो सकती"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "Tambah API Kunci", "add": "Tambah API Kunci",
"addFirst": "Tambah kunci pertama Anda", "addFirst": "Tambah kunci pertama Anda",
"edit": "Sunting" "edit": "Sunting",
"copied": "Disalin!",
"copyEnvVarName": "Salin nama variabel env",
"confirmDelete": "Klik lagi untuk mengonfirmasi",
"delete": "Hapus"
}, },
"empty": { "empty": {
"title": "Tidak API kunci disimpan", "title": "Tidak API kunci disimpan",

View file

@ -46,7 +46,8 @@
"copiedShort": "Disalin", "copiedShort": "Disalin",
"copy": "Salin diagnosa", "copy": "Salin diagnosa",
"hints": "Petunjuk", "hints": "Petunjuk",
"likelyCause": "Kemungkinan menyebabkan:" "likelyCause": "Kemungkinan menyebabkan:",
"windowsSymlinkAdminHint": "Windows: jalankan Agent Teams AI sebagai Administrator"
}, },
"models": { "models": {
"alreadyDefault": "Ini sudah menjadi standar OpenCode yang dipilih.", "alreadyDefault": "Ini sudah menjadi standar OpenCode yang dipilih.",
@ -64,7 +65,15 @@
"searchPlaceholder": "Cari model", "searchPlaceholder": "Cari model",
"selectProjectBeforeTesting": "Pilih konteks projek sebelum pengujian model.", "selectProjectBeforeTesting": "Pilih konteks projek sebelum pengujian model.",
"selectProjectBeforeTestingDefaults": "Pilih konteks projek sebelum pengujian atau menyimpan baku OpenCode.", "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": { "providers": {
"catalog": "Katalog penyedia OpenCode", "catalog": "Katalog penyedia OpenCode",
@ -108,7 +117,8 @@
"needsTest": "membutuhkan tes", "needsTest": "membutuhkan tes",
"failed": "gagal", "failed": "gagal",
"unknown": "tidak diketahui", "unknown": "tidak diketahui",
"default": "baku" "default": "baku",
"knownRoute": "route dikenal"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234" "baseUrlPlaceholder": "http://localhost:1234"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API kunci dikonfigurasi, tapi belum diverifikasi", "apiKeyConfiguredNotVerified": "API kunci dikonfigurasi, tapi belum diverifikasi",
"apiKeyModeMissingCredential": "API mode kunci dipilih, tapi tidak ada API kunci dikonfigurasi", "apiKeyModeMissingCredential": "API mode kunci dipilih, tapi tidak ada API kunci dikonfigurasi",
"connectedVia": "Terhubung via {{method}}", "connectedVia": "Terhubung via {{method}}",
"unableToVerify": "Tidak dapat memverifikasi" "unableToVerify": "Tidak dapat memverifikasi",
"modelsAvailable": "Model tersedia"
}, },
"mode": { "mode": {
"selectedAuth": "Auth yang dipilih: {{authMode}}", "selectedAuth": "Auth yang dipilih: {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "sesi", "session": "sesi",
"stallNudge": "nudge kios", "stallNudge": "nudge kios",
"start": "awal", "start": "awal",
"workSync": "sinkronisasi kerja" "workSync": "sinkronisasi kerja",
"agentError": "Kesalahan agen",
"apiError": "Kesalahan API"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "Bootstrap diakui", "acknowledged": "Bootstrap diakui",
@ -77,7 +79,11 @@
"action": "Balas" "action": "Balas"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "Dalam proses" "inProgress": "Dalam proses",
"expandInProgress": "Buka yang berlangsung",
"collapseInProgress": "Tutup yang berlangsung",
"reviewing": "meninjau",
"workingOn": "mengerjakan"
}, },
"expandDialog": { "expandDialog": {
"description": "Tampilan pesan yang diperluas" "description": "Tampilan pesan yang diperluas"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "Data tim akan muncul setelah pemberian selesai", "waitingForProvisioning": "Data tim akan muncul setelah pemberian selesai",
"context": { "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": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "Tidak ditemukan sumber log.", "emptyMessage": "Tidak ditemukan sumber log.",
"ariaLabel": "Sumber log", "ariaLabel": "Sumber log",
"leadLabel": "Lead", "leadLabel": "Lead",
"selectSourceEmpty": "Pilih sumber log." "selectSourceEmpty": "Pilih sumber log.",
"leadDescription": "Lead tim",
"removedLabel": "dihapus",
"removedDescription": "Dihapus"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} lagi", "more_one": "+{{count}} lagi",
"more_other": "+{{count}} lagi", "more_other": "+{{count}} lagi",
"more_few": "+{{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": { "blockingEdge": {
"title": "Blocking Dependensi", "title": "Blocking Dependensi",
"blocks": "blok", "blocks": "blok",
"close": "Tutup", "close": "Tutup",
"blockingHiddenTasks": "Memblokir tugas tersembunyi", "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": { "activityHud": {
"activity": "Aktivitas", "activity": "Aktivitas",
@ -1778,7 +1817,11 @@
"autoRefresh": "Segarkan otomatis", "autoRefresh": "Segarkan otomatis",
"wrapLines": "Lipat baris", "wrapLines": "Lipat baris",
"loadingTail": "Memuat proses log tail...", "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": { "tasks": {
"empty": "Tidak ada tugas yang ditugaskan ke anggota ini" "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.", "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.", "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.", "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": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "Menjalankan Tim" "title": "Menjalankan Tim",
"status": {
"active": "Aktif",
"provisioning": "Meluncurkan",
"idle": "Berjalan"
},
"noProject": "Tanpa proyek"
}, },
"layout": { "layout": {
"maxPanesReached": "Maksimum {{count}} panel dicapai" "maxPanesReached": "Maksimum {{count}} panel dicapai"
}, },
"codexReconnect": { "codexReconnect": {
"description": "Sesi Codex Anda tampak basi. Reconnect untuk melanjutkan.", "description": "Sesi Codex Anda tampak basi. Reconnect untuk melanjutkan.",
"useCode": "Gunakan kode" "useCode": "Gunakan kode",
"generating": "Membuat...",
"openLogin": "Buka login",
"generateLink": "Buat tautan"
}, },
"effortLevel": { "effortLevel": {
"label": "Tingkat benteng (opsional)", "label": "Tingkat benteng (opsional)",
@ -2428,6 +2481,7 @@
"customRole": "Peran kustom...", "customRole": "Peran kustom...",
"searchPlaceholder": "Cari peran...", "searchPlaceholder": "Cari peran...",
"empty": "Tidak ditemukan peran.", "empty": "Tidak ditemukan peran.",
"reservedRole": "Peran ini dipesan" "reservedRole": "Peran ini dipesan",
"emptyCustomRole": "Peran tidak boleh kosong"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "APIキーを追加", "add": "APIキーを追加",
"addFirst": "最初のキーを追加", "addFirst": "最初のキーを追加",
"edit": "編集" "edit": "編集",
"copied": "コピーしました!",
"copyEnvVarName": "環境変数名をコピー",
"confirmDelete": "もう一度クリックして確認",
"delete": "削除"
}, },
"empty": { "empty": {
"title": "保存されるAPIキー無し", "title": "保存されるAPIキー無し",

View file

@ -46,7 +46,8 @@
"copiedShort": "コピッド", "copiedShort": "コピッド",
"copy": "コピー診断", "copy": "コピー診断",
"hints": "ヒント", "hints": "ヒント",
"likelyCause": "同様に原因:" "likelyCause": "同様に原因:",
"windowsSymlinkAdminHint": "Windows: Agent Teams AI を管理者として実行してください"
}, },
"models": { "models": {
"alreadyDefault": "これは既に選択したOpenCodeのデフォルトです。", "alreadyDefault": "これは既に選択したOpenCodeのデフォルトです。",
@ -64,7 +65,15 @@
"searchPlaceholder": "モデルを検索", "searchPlaceholder": "モデルを検索",
"selectProjectBeforeTesting": "モデルをテストする前にプロジェクトコンテキストを選択します。", "selectProjectBeforeTesting": "モデルをテストする前にプロジェクトコンテキストを選択します。",
"selectProjectBeforeTestingDefaults": "OpenCode のデフォルトをテストまたは保存する前に、プロジェクトコンテキストを選択します。", "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": { "providers": {
"catalog": "OpenCode プロバイダーカタログ", "catalog": "OpenCode プロバイダーカタログ",
@ -108,7 +117,8 @@
"needsTest": "ニーズテスト", "needsTest": "ニーズテスト",
"failed": "失敗", "failed": "失敗",
"unknown": "インフォメーション", "unknown": "インフォメーション",
"default": "デフォルト" "default": "デフォルト",
"knownRoute": "既知の route"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234" "baseUrlPlaceholder": "http://localhost:1234"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API のキーは構成しましたが、まだ確認されません", "apiKeyConfiguredNotVerified": "API のキーは構成しましたが、まだ確認されません",
"apiKeyModeMissingCredential": "API キーモードが選択されますが、API キーは構成されません", "apiKeyModeMissingCredential": "API キーモードが選択されますが、API キーは構成されません",
"connectedVia": "{{method}}で接続", "connectedVia": "{{method}}で接続",
"unableToVerify": "確認できない" "unableToVerify": "確認できない",
"modelsAvailable": "利用可能なモデル"
}, },
"mode": { "mode": {
"selectedAuth": "選択されたauth: {{authMode}}", "selectedAuth": "選択されたauth: {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "セッション", "session": "セッション",
"stallNudge": "ステルナッジ", "stallNudge": "ステルナッジ",
"start": "スタート", "start": "スタート",
"workSync": "作業同期" "workSync": "作業同期",
"agentError": "エージェントエラー",
"apiError": "API エラー"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "ブーツストラップが認めた", "acknowledged": "ブーツストラップが認めた",
@ -77,7 +79,11 @@
"action": "スタッフ" "action": "スタッフ"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "進行状況" "inProgress": "進行状況",
"expandInProgress": "進行中を展開",
"collapseInProgress": "進行中を折りたたむ",
"reviewing": "レビュー中",
"workingOn": "作業中"
}, },
"expandDialog": { "expandDialog": {
"description": "メッセージビューを拡大" "description": "メッセージビューを拡大"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "チームデータが完成したら表示されます。", "waitingForProvisioning": "チームデータが完成したら表示されます。",
"context": { "context": {
"title": "コンテンツ" "title": "コンテンツ",
"loading": "読み込み中...",
"noSessionLoaded": "セッションが読み込まれていません",
"closePanel": "{{team}} のコンテキストパネルを閉じる",
"loadingContext": "コンテキストを読み込み中...",
"openLeadSession": "コンテキストを表示するにはチームリードのセッションを開いてください。"
} }
}, },
"review": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "ログソースが見つかりません。", "emptyMessage": "ログソースが見つかりません。",
"ariaLabel": "ログソース", "ariaLabel": "ログソース",
"leadLabel": "リード", "leadLabel": "リード",
"selectSourceEmpty": "ログソースを選択します。" "selectSourceEmpty": "ログソースを選択します。",
"leadDescription": "チームリード",
"removedLabel": "削除済み",
"removedDescription": "削除済み"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} より", "more_one": "+{{count}} より",
"more_other": "+{{count}} より", "more_other": "+{{count}} より",
"more_few": "+{{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": { "blockingEdge": {
"title": "依存症のブロック", "title": "依存症のブロック",
"blocks": "ブロック", "blocks": "ブロック",
"close": "ふりがな", "close": "ふりがな",
"blockingHiddenTasks": "隠しタスクのブロック", "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": { "activityHud": {
"activity": "活動内容", "activity": "活動内容",
@ -1778,7 +1817,11 @@
"autoRefresh": "オートリフレッシュ", "autoRefresh": "オートリフレッシュ",
"wrapLines": "ラップライン", "wrapLines": "ラップライン",
"loadingTail": "ローディングプロセスログテール...", "loadingTail": "ローディングプロセスログテール...",
"empty": "まだこのメンバーの処理ログファイルはありません。" "empty": "まだこのメンバーの処理ログファイルはありません。",
"copy": "コピー",
"fileEmpty": "プロセスログファイルは空です。",
"showingLast": "最後の {{bytes}} を表示しています。",
"showing": "{{bytes}} を表示しています。"
}, },
"tasks": { "tasks": {
"empty": "このメンバーに割り当てられたタスクはありません" "empty": "このメンバーに割り当てられたタスクはありません"
@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "プロバイダーのステータスカードからOpenCodeのランタイムをインストールまたは再試行し、このダイアログを再起動します。", "openCodeRuntimeMissing": "プロバイダーのステータスカードからOpenCodeのランタイムをインストールまたは再試行し、このダイアログを再起動します。",
"openCodeAppMcpUnreachable": "OpenCodeアプリのMCPブリッジをリフレッシュするためのリトリー起動。 繰り返すと、アプリとOpenCodeのランタイムを再起動します。", "openCodeAppMcpUnreachable": "OpenCodeアプリのMCPブリッジをリフレッシュするためのリトリー起動。 繰り返すと、アプリとOpenCodeのランタイムを再起動します。",
"cliBinaryMissing": "ローカルClaude CLIバイナリが存在し、起動できることを確認してください。その後、このダイアログが開きます。", "cliBinaryMissing": "ローカルClaude CLIバイナリが存在し、起動できることを確認してください。その後、このダイアログが開きます。",
"default": "上記の問題を解決し、このダイアログを再オープンします。" "default": "上記の問題を解決し、このダイアログを再オープンします。",
"openCodeNodeModulesSymlinkPermission": "Agent Teams AI を管理者として実行してから、launch を再試行してください。"
} }
}, },
"presentation": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "ランニングチーム" "title": "ランニングチーム",
"status": {
"active": "アクティブ",
"provisioning": "起動中",
"idle": "実行中"
},
"noProject": "プロジェクトなし"
}, },
"layout": { "layout": {
"maxPanesReached": "{{count}}のパンが到達する最大" "maxPanesReached": "{{count}}のパンが到達する最大"
}, },
"codexReconnect": { "codexReconnect": {
"description": "Codex のセッションはストール表示されます。 続行する再接続。", "description": "Codex のセッションはストール表示されます。 続行する再接続。",
"useCode": "コードを使用する" "useCode": "コードを使用する",
"generating": "生成中...",
"openLogin": "ログインを開く",
"generateLink": "リンクを生成"
}, },
"effortLevel": { "effortLevel": {
"label": "努力レベル(任意)", "label": "努力レベル(任意)",
@ -2428,6 +2481,7 @@
"customRole": "カスタムロール...", "customRole": "カスタムロール...",
"searchPlaceholder": "役割を検索...", "searchPlaceholder": "役割を検索...",
"empty": "役割が見つかりません。", "empty": "役割が見つかりません。",
"reservedRole": "この役割は、" "reservedRole": "この役割は、",
"emptyCustomRole": "ロールを空にすることはできません"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "API 키 추가", "add": "API 키 추가",
"addFirst": "첫 키 추가", "addFirst": "첫 키 추가",
"edit": "제품정보" "edit": "제품정보",
"copied": "복사됨!",
"copyEnvVarName": "환경 변수 이름 복사",
"confirmDelete": "다시 클릭하여 확인",
"delete": "삭제"
}, },
"empty": { "empty": {
"title": "저장되는 API 열쇠 없음", "title": "저장되는 API 열쇠 없음",

View file

@ -46,7 +46,8 @@
"copiedShort": "뚱 베어", "copiedShort": "뚱 베어",
"copy": "복사 진단", "copy": "복사 진단",
"hints": "뚱 베어", "hints": "뚱 베어",
"likelyCause": "같은 원인:" "likelyCause": "같은 원인:",
"windowsSymlinkAdminHint": "Windows: Agent Teams AI를 관리자 권한으로 실행하세요"
}, },
"models": { "models": {
"alreadyDefault": "이미 선택한 OpenCode 기본값입니다.", "alreadyDefault": "이미 선택한 OpenCode 기본값입니다.",
@ -64,7 +65,15 @@
"searchPlaceholder": "검색 모델", "searchPlaceholder": "검색 모델",
"selectProjectBeforeTesting": "모델을 테스트하기 전에 프로젝트 컨텍스트를 선택하십시오.", "selectProjectBeforeTesting": "모델을 테스트하기 전에 프로젝트 컨텍스트를 선택하십시오.",
"selectProjectBeforeTestingDefaults": "OpenCode 기본값을 테스트하거나 저장하기 전에 프로젝트 컨텍스트를 선택하십시오.", "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": { "providers": {
"catalog": "OpenCode 공급자 카탈로그", "catalog": "OpenCode 공급자 카탈로그",
@ -108,7 +117,8 @@
"needsTest": "자주 묻는 질문", "needsTest": "자주 묻는 질문",
"failed": "실패한", "failed": "실패한",
"unknown": "이름 *", "unknown": "이름 *",
"default": "기본 정보" "default": "기본 정보",
"knownRoute": "알려진 route"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234" "baseUrlPlaceholder": "http://localhost:1234"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API 키 구성, 하지만 아직 확인 되지", "apiKeyConfiguredNotVerified": "API 키 구성, 하지만 아직 확인 되지",
"apiKeyModeMissingCredential": "API 키 모드 선택, 하지만 API 키 구성", "apiKeyModeMissingCredential": "API 키 모드 선택, 하지만 API 키 구성",
"connectedVia": "{{method}}를 통해 연결", "connectedVia": "{{method}}를 통해 연결",
"unableToVerify": "자주 묻는 질문" "unableToVerify": "자주 묻는 질문",
"modelsAvailable": "사용 가능한 모델"
}, },
"mode": { "mode": {
"selectedAuth": "선택된 오: {{authMode}}", "selectedAuth": "선택된 오: {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "이름 *", "session": "이름 *",
"stallNudge": "연락처", "stallNudge": "연락처",
"start": "시작하기", "start": "시작하기",
"workSync": "작업 동기화" "workSync": "작업 동기화",
"agentError": "에이전트 오류",
"apiError": "API 오류"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "부트 스트랩 승인", "acknowledged": "부트 스트랩 승인",
@ -77,7 +79,11 @@
"action": "이름 *" "action": "이름 *"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "진행 중" "inProgress": "진행 중",
"expandInProgress": "진행 중 펼치기",
"collapseInProgress": "진행 중 접기",
"reviewing": "검토 중",
"workingOn": "작업 중"
}, },
"expandDialog": { "expandDialog": {
"description": "확장된 메시지 보기" "description": "확장된 메시지 보기"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "팀 데이터는 일단 완료되면 나타납니다", "waitingForProvisioning": "팀 데이터는 일단 완료되면 나타납니다",
"context": { "context": {
"title": "설정하기" "title": "설정하기",
"loading": "로딩 중...",
"noSessionLoaded": "세션이 로드되지 않음",
"closePanel": "{{team}} 컨텍스트 패널 닫기",
"loadingContext": "컨텍스트 로딩 중...",
"openLeadSession": "컨텍스트를 보려면 팀 리드 세션을 여세요."
} }
}, },
"review": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "로그 소스가 없습니다.", "emptyMessage": "로그 소스가 없습니다.",
"ariaLabel": "로그 소스", "ariaLabel": "로그 소스",
"leadLabel": "제품정보", "leadLabel": "제품정보",
"selectSourceEmpty": "로그 소스를 선택합니다." "selectSourceEmpty": "로그 소스를 선택합니다.",
"leadDescription": "팀 리드",
"removedLabel": "제거됨",
"removedDescription": "제거됨"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} 더보기", "more_one": "+{{count}} 더보기",
"more_other": "+{{count}} 더보기", "more_other": "+{{count}} 더보기",
"more_few": "+{{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": { "blockingEdge": {
"title": "블록 의존성", "title": "블록 의존성",
"blocks": "제품정보", "blocks": "제품정보",
"close": "이름 *", "close": "이름 *",
"blockingHiddenTasks": "숨겨진 작업을 차단", "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": { "activityHud": {
"activity": "- 연혁", "activity": "- 연혁",
@ -1778,7 +1817,11 @@
"autoRefresh": "자동차 수리", "autoRefresh": "자동차 수리",
"wrapLines": "포장 라인", "wrapLines": "포장 라인",
"loadingTail": "적재 공정 로그 꼬리...", "loadingTail": "적재 공정 로그 꼬리...",
"empty": "아직이 회원을 위해 캡처 된 프로세스 로그 파일 없음." "empty": "아직이 회원을 위해 캡처 된 프로세스 로그 파일 없음.",
"copy": "복사",
"fileEmpty": "프로세스 로그 파일이 비어 있습니다.",
"showingLast": "마지막 {{bytes}} 표시 중.",
"showing": "{{bytes}} 표시 중."
}, },
"tasks": { "tasks": {
"empty": "이 회원에게 할당된 작업 없음" "empty": "이 회원에게 할당된 작업 없음"
@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "공급자 상태 카드에서 OpenCode 런타임을 설치하거나 재시작하면 이 대화 상자를 다시 엽니다.", "openCodeRuntimeMissing": "공급자 상태 카드에서 OpenCode 런타임을 설치하거나 재시작하면 이 대화 상자를 다시 엽니다.",
"openCodeAppMcpUnreachable": "OpenCode 앱 MCP 브리지를 새로 고침합니다. 반복하면 앱과 OpenCode runtime을 다시 시작합니다.", "openCodeAppMcpUnreachable": "OpenCode 앱 MCP 브리지를 새로 고침합니다. 반복하면 앱과 OpenCode runtime을 다시 시작합니다.",
"cliBinaryMissing": "로컬 클로드 CLI 바이너리가 존재하고 시작할 수 있는지 확인하고, 이 대화 상자를 다시 엽니다.", "cliBinaryMissing": "로컬 클로드 CLI 바이너리가 존재하고 시작할 수 있는지 확인하고, 이 대화 상자를 다시 엽니다.",
"default": "위의 문제를 해결 한 다음이 대화 상자를 다시 엽니다." "default": "위의 문제를 해결 한 다음이 대화 상자를 다시 엽니다.",
"openCodeNodeModulesSymlinkPermission": "Agent Teams AI를 관리자 권한으로 실행한 다음 launch를 다시 시도하세요."
} }
}, },
"presentation": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "팀 실행" "title": "팀 실행",
"status": {
"active": "활성",
"provisioning": "시작 중",
"idle": "실행 중"
},
"noProject": "프로젝트 없음"
}, },
"layout": { "layout": {
"maxPanesReached": "{{count}} 팬의 최대 도달" "maxPanesReached": "{{count}} 팬의 최대 도달"
}, },
"codexReconnect": { "codexReconnect": {
"description": "Codex 세션은 stale이 나타납니다. 계속 연결.", "description": "Codex 세션은 stale이 나타납니다. 계속 연결.",
"useCode": "사용 코드" "useCode": "사용 코드",
"generating": "생성 중...",
"openLogin": "로그인 열기",
"generateLink": "링크 생성"
}, },
"effortLevel": { "effortLevel": {
"label": "(선택) Effort 수준", "label": "(선택) Effort 수준",
@ -2428,6 +2481,7 @@
"customRole": "사용자 정의 역할...", "customRole": "사용자 정의 역할...",
"searchPlaceholder": "검색 역할...", "searchPlaceholder": "검색 역할...",
"empty": "찾을 수 없음.", "empty": "찾을 수 없음.",
"reservedRole": "이 역할은" "reservedRole": "이 역할은",
"emptyCustomRole": "역할은 비워 둘 수 없습니다"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "Adicionar chave API", "add": "Adicionar chave API",
"addFirst": "Adicionar sua primeira chave", "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": { "empty": {
"title": "Nenhuma chave API salva", "title": "Nenhuma chave API salva",

View file

@ -46,7 +46,8 @@
"copiedShort": "Copiado", "copiedShort": "Copiado",
"copy": "Copiar diagnósticos", "copy": "Copiar diagnósticos",
"hints": "Dica", "hints": "Dica",
"likelyCause": "Provável causa:" "likelyCause": "Provável causa:",
"windowsSymlinkAdminHint": "Windows: execute o Agent Teams AI como administrador"
}, },
"models": { "models": {
"alreadyDefault": "Este já é o padrão OpenCode selecionado.", "alreadyDefault": "Este já é o padrão OpenCode selecionado.",
@ -64,7 +65,15 @@
"searchPlaceholder": "Pesquisar modelos", "searchPlaceholder": "Pesquisar modelos",
"selectProjectBeforeTesting": "Selecione um contexto de projeto antes de testar 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.", "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": { "providers": {
"catalog": "Catálogo de fornecedores OpenCode", "catalog": "Catálogo de fornecedores OpenCode",
@ -108,7 +117,8 @@
"needsTest": "teste das necessidades", "needsTest": "teste das necessidades",
"failed": "falhou", "failed": "falhou",
"unknown": "desconhecido", "unknown": "desconhecido",
"default": "padrão" "default": "padrão",
"knownRoute": "route conhecida"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234" "baseUrlPlaceholder": "http://localhost:1234"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "Chave API configurada, mas ainda não verificada", "apiKeyConfiguredNotVerified": "Chave API configurada, mas ainda não verificada",
"apiKeyModeMissingCredential": "Modo chave API selecionado, mas nenhuma chave API está configurada", "apiKeyModeMissingCredential": "Modo chave API selecionado, mas nenhuma chave API está configurada",
"connectedVia": "Ligado via {{method}}", "connectedVia": "Ligado via {{method}}",
"unableToVerify": "Não foi possível verificar" "unableToVerify": "Não foi possível verificar",
"modelsAvailable": "Modelos disponíveis"
}, },
"mode": { "mode": {
"selectedAuth": "Autorização seleccionada: {{authMode}}", "selectedAuth": "Autorização seleccionada: {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "sessão", "session": "sessão",
"stallNudge": "empatar o empurrão", "stallNudge": "empatar o empurrão",
"start": "início", "start": "início",
"workSync": "sincronização de trabalho" "workSync": "sincronização de trabalho",
"agentError": "Erro do agente",
"apiError": "Erro de API"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "Bootstrap reconhecido", "acknowledged": "Bootstrap reconhecido",
@ -77,7 +79,11 @@
"action": "Responder" "action": "Responder"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "Em curso" "inProgress": "Em curso",
"expandInProgress": "Expandir em andamento",
"collapseInProgress": "Recolher em andamento",
"reviewing": "revisando",
"workingOn": "trabalhando em"
}, },
"expandDialog": { "expandDialog": {
"description": "Visualização de mensagens expandida" "description": "Visualização de mensagens expandida"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "Os dados da equipe aparecerão assim que o provimento terminar", "waitingForProvisioning": "Os dados da equipe aparecerão assim que o provimento terminar",
"context": { "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": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "Nenhuma fonte de registro encontrada.", "emptyMessage": "Nenhuma fonte de registro encontrada.",
"ariaLabel": "Origem do registo", "ariaLabel": "Origem do registo",
"leadLabel": "Chumbo", "leadLabel": "Chumbo",
"selectSourceEmpty": "Selecione uma fonte de registro." "selectSourceEmpty": "Selecione uma fonte de registro.",
"leadDescription": "Líder da equipe",
"removedLabel": "removido",
"removedDescription": "Removido"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} mais", "more_one": "+{{count}} mais",
"more_other": "+{{count}} mais", "more_other": "+{{count}} mais",
"more_few": "+{{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": { "blockingEdge": {
"title": "Dependência de Bloqueamento", "title": "Dependência de Bloqueamento",
"blocks": "blocos", "blocks": "blocos",
"close": "Fechar", "close": "Fechar",
"blockingHiddenTasks": "Bloqueando tarefas ocultas", "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": { "activityHud": {
"activity": "Actividade", "activity": "Actividade",
@ -1778,7 +1817,11 @@
"autoRefresh": "Actualizar automaticamente", "autoRefresh": "Actualizar automaticamente",
"wrapLines": "Quebrar linhas", "wrapLines": "Quebrar linhas",
"loadingTail": "A carregar a cauda do registo do processo...", "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": { "tasks": {
"empty": "Nenhuma tarefa atribuída a este membro" "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.", "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.", "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.", "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": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "Equipas em Execução" "title": "Equipas em Execução",
"status": {
"active": "Ativa",
"provisioning": "Iniciando",
"idle": "Em execução"
},
"noProject": "Sem projeto"
}, },
"layout": { "layout": {
"maxPanesReached": "Máximo de painéis {{count}} alcançados" "maxPanesReached": "Máximo de painéis {{count}} alcançados"
}, },
"codexReconnect": { "codexReconnect": {
"description": "A tua sessão do Códice parece estar estagnada. Reconectar para continuar.", "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": { "effortLevel": {
"label": "Nível de esforço (opcional)", "label": "Nível de esforço (opcional)",
@ -2428,6 +2481,7 @@
"customRole": "Papel personalizado...", "customRole": "Papel personalizado...",
"searchPlaceholder": "Procurar papéis...", "searchPlaceholder": "Procurar papéis...",
"empty": "Nenhum papel encontrado.", "empty": "Nenhum papel encontrado.",
"reservedRole": "Este papel é reservado" "reservedRole": "Este papel é reservado",
"emptyCustomRole": "A função não pode estar vazia"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "Добавить API key", "add": "Добавить API key",
"addFirst": "Добавить первый key", "addFirst": "Добавить первый key",
"edit": "Редактировать" "edit": "Редактировать",
"copied": "Скопировано!",
"copyEnvVarName": "Копировать имя env-переменной",
"confirmDelete": "Нажмите еще раз для подтверждения",
"delete": "Удалить"
}, },
"empty": { "empty": {
"title": "API keys не сохранены", "title": "API keys не сохранены",

View file

@ -46,7 +46,8 @@
"copiedShort": "Скопировано", "copiedShort": "Скопировано",
"copy": "Скопировать diagnostics", "copy": "Скопировать diagnostics",
"hints": "Подсказки", "hints": "Подсказки",
"likelyCause": "Вероятная причина:" "likelyCause": "Вероятная причина:",
"windowsSymlinkAdminHint": "Windows: запустите Agent Teams AI от имени администратора"
}, },
"models": { "models": {
"alreadyDefault": "Это уже выбранный OpenCode default.", "alreadyDefault": "Это уже выбранный OpenCode default.",

View file

@ -28,7 +28,9 @@
"session": "session", "session": "session",
"stallNudge": "stall nudge", "stallNudge": "stall nudge",
"start": "start", "start": "start",
"workSync": "work sync" "workSync": "work sync",
"agentError": "Ошибка агента",
"apiError": "Ошибка API"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "Bootstrap подтверждён", "acknowledged": "Bootstrap подтверждён",
@ -77,7 +79,11 @@
"action": "Ответить" "action": "Ответить"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "В работе" "inProgress": "В работе",
"expandInProgress": "Развернуть задачи в работе",
"collapseInProgress": "Свернуть задачи в работе",
"reviewing": "ревьюит",
"workingOn": "работает над"
}, },
"expandDialog": { "expandDialog": {
"description": "Развёрнутый просмотр сообщения" "description": "Развёрнутый просмотр сообщения"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "Данные команды появятся после завершения provisioning", "waitingForProvisioning": "Данные команды появятся после завершения provisioning",
"context": { "context": {
"title": "Контекст" "title": "Контекст",
"loading": "Загрузка...",
"noSessionLoaded": "Сессия не загружена",
"closePanel": "Закрыть панель контекста {{team}}",
"loadingContext": "Загрузка контекста...",
"openLeadSession": "Откройте сессию лида команды, чтобы посмотреть контекст."
} }
}, },
"review": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "Источники логов не найдены.", "emptyMessage": "Источники логов не найдены.",
"ariaLabel": "Источник логов", "ariaLabel": "Источник логов",
"leadLabel": "Лид", "leadLabel": "Лид",
"selectSourceEmpty": "Выберите источник логов." "selectSourceEmpty": "Выберите источник логов.",
"leadDescription": "Лид команды",
"removedLabel": "удален",
"removedDescription": "Удален"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} ещё", "more_one": "+{{count}} ещё",
"more_few": "+{{count}} ещё", "more_few": "+{{count}} ещё",
"more_many": "+{{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": { "blockingEdge": {
"title": "Блокирующая зависимость", "title": "Блокирующая зависимость",
"blocks": "блокирует", "blocks": "блокирует",
"close": "Закрыть", "close": "Закрыть",
"blockingHiddenTasks": "Скрытые блокирующие задачи", "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": { "activityHud": {
"activity": "Активность", "activity": "Активность",
@ -1778,7 +1817,11 @@
"autoRefresh": "Автообновление", "autoRefresh": "Автообновление",
"wrapLines": "Перенос строк", "wrapLines": "Перенос строк",
"loadingTail": "Загрузка хвоста лога процесса...", "loadingTail": "Загрузка хвоста лога процесса...",
"empty": "Лог процесса для этого участника пока не сохранен." "empty": "Лог процесса для этого участника пока не сохранен.",
"copy": "Копировать",
"fileEmpty": "Файл лога процесса пуст.",
"showingLast": "Показаны последние {{bytes}}.",
"showing": "Показано {{bytes}}."
}, },
"tasks": { "tasks": {
"empty": "У этого участника нет назначенных задач" "empty": "У этого участника нет назначенных задач"
@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "Установите или повторите запуск runtime OpenCode из карточки статуса провайдера, затем откройте этот диалог заново.", "openCodeRuntimeMissing": "Установите или повторите запуск runtime OpenCode из карточки статуса провайдера, затем откройте этот диалог заново.",
"openCodeAppMcpUnreachable": "Повторите launch, чтобы обновить OpenCode app MCP bridge. Если повторится, перезапустите приложение и runtime OpenCode.", "openCodeAppMcpUnreachable": "Повторите launch, чтобы обновить OpenCode app MCP bridge. Если повторится, перезапустите приложение и runtime OpenCode.",
"cliBinaryMissing": "Убедитесь, что локальный бинарь Claude CLI существует и может запускаться, затем откройте этот диалог заново.", "cliBinaryMissing": "Убедитесь, что локальный бинарь Claude CLI существует и может запускаться, затем откройте этот диалог заново.",
"default": "Исправьте проблему выше, затем откройте этот диалог заново." "default": "Исправьте проблему выше, затем откройте этот диалог заново.",
"openCodeNodeModulesSymlinkPermission": "Запустите Agent Teams AI от имени администратора, затем повторите launch."
} }
}, },
"presentation": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "Активные команды" "title": "Активные команды",
"status": {
"active": "Активна",
"provisioning": "Запускается",
"idle": "Работает"
},
"noProject": "Без проекта"
}, },
"layout": { "layout": {
"maxPanesReached": "Достигнут максимум панелей: {{count}}" "maxPanesReached": "Достигнут максимум панелей: {{count}}"
}, },
"codexReconnect": { "codexReconnect": {
"description": "Сессия Codex выглядит устаревшей. Переподключитесь, чтобы продолжить.", "description": "Сессия Codex выглядит устаревшей. Переподключитесь, чтобы продолжить.",
"useCode": "Использовать код" "useCode": "Использовать код",
"generating": "Генерируется...",
"openLogin": "Открыть вход",
"generateLink": "Создать ссылку"
}, },
"effortLevel": { "effortLevel": {
"label": "Уровень усилий (опционально)", "label": "Уровень усилий (опционально)",
@ -2428,6 +2481,7 @@
"customRole": "Своя роль...", "customRole": "Своя роль...",
"searchPlaceholder": "Поиск ролей...", "searchPlaceholder": "Поиск ролей...",
"empty": "Роли не найдены.", "empty": "Роли не найдены.",
"reservedRole": "Эта роль зарезервирована" "reservedRole": "Эта роль зарезервирована",
"emptyCustomRole": "Роль не может быть пустой"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "شامل کریں API کلید", "add": "شامل کریں API کلید",
"addFirst": "اپنی پہلی کلید کو شامل کریں", "addFirst": "اپنی پہلی کلید کو شامل کریں",
"edit": "مرتب" "edit": "مرتب",
"copied": "Copy ہو گیا!",
"copyEnvVarName": "Env var name copy کریں",
"confirmDelete": "Confirm کے لیے دوبارہ کلک کریں",
"delete": "Delete"
}, },
"empty": { "empty": {
"title": "نہیں API کلید محفوظ کریں", "title": "نہیں API کلید محفوظ کریں",

View file

@ -46,7 +46,8 @@
"copiedShort": "کوس", "copiedShort": "کوس",
"copy": "نقل و حمل", "copy": "نقل و حمل",
"hints": "حساب", "hints": "حساب",
"likelyCause": "غالباً وجہ:" "likelyCause": "غالباً وجہ:",
"windowsSymlinkAdminHint": "Windows: Agent Teams AI کو Administrator کے طور پر چلائیں"
}, },
"models": { "models": {
"alreadyDefault": "یہ پہلے سے ہی منتخب اوپن سی ڈی کوڈ ہے.", "alreadyDefault": "یہ پہلے سے ہی منتخب اوپن سی ڈی کوڈ ہے.",
@ -64,7 +65,15 @@
"searchPlaceholder": "تلاش کے ماڈل", "searchPlaceholder": "تلاش کے ماڈل",
"selectProjectBeforeTesting": "ماڈلوں کا ٹیسٹ کرنے سے پہلے منصوبہ بندی انتخاب کریں۔", "selectProjectBeforeTesting": "ماڈلوں کا ٹیسٹ کرنے سے پہلے منصوبہ بندی انتخاب کریں۔",
"selectProjectBeforeTestingDefaults": "OpenCode دیس کو ٹیسٹ کرنے یا محفوظ کرنے سے پہلے منصوبہ بندی منتخب کریں۔", "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": { "providers": {
"catalog": "کھولیں", "catalog": "کھولیں",
@ -108,7 +117,8 @@
"needsTest": "ضرورت", "needsTest": "ضرورت",
"failed": "ناکام ہوا", "failed": "ناکام ہوا",
"unknown": "نامعلوم", "unknown": "نامعلوم",
"default": "طے شدہ" "default": "طے شدہ",
"knownRoute": "معروف route"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234" "baseUrlPlaceholder": "http://localhost:1234"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "API کلیدی ربط ، لیکن ابھی تصدیق نہیں ہوئی", "apiKeyConfiguredNotVerified": "API کلیدی ربط ، لیکن ابھی تصدیق نہیں ہوئی",
"apiKeyModeMissingCredential": "API کلیدی طریقہ انتخاب کرتا ہے لیکن کوئی نہیں API کلیدی کلید", "apiKeyModeMissingCredential": "API کلیدی طریقہ انتخاب کرتا ہے لیکن کوئی نہیں API کلیدی کلید",
"connectedVia": "جواب {{method}}", "connectedVia": "جواب {{method}}",
"unableToVerify": "درستگی حاصل کرنے کے قابل" "unableToVerify": "درستگی حاصل کرنے کے قابل",
"modelsAvailable": "ماڈلز دستیاب ہیں"
}, },
"mode": { "mode": {
"selectedAuth": "منتخب شدہ Auth: {{authMode}}", "selectedAuth": "منتخب شدہ Auth: {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "سیشن", "session": "سیشن",
"stallNudge": "غیر متصل", "stallNudge": "غیر متصل",
"start": "شروع کریں", "start": "شروع کریں",
"workSync": "کامک" "workSync": "کامک",
"agentError": "Agent Error",
"apiError": "API Error"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "بوٹسٹرپ نے اعتراف کیا", "acknowledged": "بوٹسٹرپ نے اعتراف کیا",
@ -77,7 +79,11 @@
"action": "انکار کرو" "action": "انکار کرو"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "ترقی" "inProgress": "ترقی",
"expandInProgress": "In progress پھیلائیں",
"collapseInProgress": "In progress سمیٹیں",
"reviewing": "review کر رہا ہے",
"workingOn": "کام کر رہا ہے"
}, },
"expandDialog": { "expandDialog": {
"description": "پیغام کا نقطۂ‌نظر" "description": "پیغام کا نقطۂ‌نظر"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "ٹیم کے اعداد و شمار ایک مرتبہ مکمل ہونے والی فراہمی نظر آئیں گے۔", "waitingForProvisioning": "ٹیم کے اعداد و شمار ایک مرتبہ مکمل ہونے والی فراہمی نظر آئیں گے۔",
"context": { "context": {
"title": "پرنٹ" "title": "پرنٹ",
"loading": "لوڈ ہو رہا ہے...",
"noSessionLoaded": "Session loaded نہیں",
"closePanel": "{{team}} context panel بند کریں",
"loadingContext": "Context لوڈ ہو رہا ہے...",
"openLeadSession": "Context دیکھنے کے لیے team lead session کھولیں."
} }
}, },
"review": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "کوئی لاگ چشمہ دریافت نہیں کیا گیا.", "emptyMessage": "کوئی لاگ چشمہ دریافت نہیں کیا گیا.",
"ariaLabel": "لاگ سرسید", "ariaLabel": "لاگ سرسید",
"leadLabel": "پیشوائی", "leadLabel": "پیشوائی",
"selectSourceEmpty": "لاگ ماخوذ منتخب کريں" "selectSourceEmpty": "لاگ ماخوذ منتخب کريں",
"leadDescription": "Team Lead",
"removedLabel": "ہٹا دیا گیا",
"removedDescription": "ہٹا دیا گیا"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+{{count}} مزید", "more_one": "+{{count}} مزید",
"more_other": "+{{count}} مزید", "more_other": "+{{count}} مزید",
"more_few": "+{{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": { "blockingEdge": {
"title": "حد بندی", "title": "حد بندی",
"blocks": "بلاک", "blocks": "بلاک",
"close": "بندکرو", "close": "بندکرو",
"blockingHiddenTasks": "خفیہ کام بند کرنا", "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": { "activityHud": {
"activity": "غیر متصل", "activity": "غیر متصل",
@ -1778,7 +1817,11 @@
"autoRefresh": "خود کار محفوظ", "autoRefresh": "خود کار محفوظ",
"wrapLines": "لائنیں", "wrapLines": "لائنیں",
"loadingTail": "عمل log ob...", "loadingTail": "عمل log ob...",
"empty": "اس ممبر کے لیے ابھی تک کوئی عمل دخل log فائل نہیں لی گئی۔" "empty": "اس ممبر کے لیے ابھی تک کوئی عمل دخل log فائل نہیں لی گئی۔",
"copy": "Copy",
"fileEmpty": "Process log file خالی ہے.",
"showingLast": "آخری {{bytes}} دکھا رہے ہیں.",
"showing": "{{bytes}} دکھا رہے ہیں."
}, },
"tasks": { "tasks": {
"empty": "اس ممبر کو کوئی کام نہیں سونپا گیا" "empty": "اس ممبر کو کوئی کام نہیں سونپا گیا"
@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "فراہم کُنندہ اسٹیٹ کارڈ سے وقتاً فوقتاً انسٹال کریں یا پھر اس پلگ ان انسٹال کریں۔", "openCodeRuntimeMissing": "فراہم کُنندہ اسٹیٹ کارڈ سے وقتاً فوقتاً انسٹال کریں یا پھر اس پلگ ان انسٹال کریں۔",
"openCodeAppMcpUnreachable": "اوپن کووڈ ایپ کو تازگی بخشنے کے لئے دوبارہ آغاز MCP بریگیڈ. اگر اسے دوبارہ بحال کیا جائے تو ایپ اور اوپنCode وقت کو دوبارہ شروع کریں۔", "openCodeAppMcpUnreachable": "اوپن کووڈ ایپ کو تازگی بخشنے کے لئے دوبارہ آغاز MCP بریگیڈ. اگر اسے دوبارہ بحال کیا جائے تو ایپ اور اوپنCode وقت کو دوبارہ شروع کریں۔",
"cliBinaryMissing": "مقامی پلگ ان کو یقینی بنائیں CLI binary موجود ہے اور شروع کیا جا سکتا ہے، پھر اسے دوبارہ کھول.", "cliBinaryMissing": "مقامی پلگ ان کو یقینی بنائیں CLI binary موجود ہے اور شروع کیا جا سکتا ہے، پھر اسے دوبارہ کھول.",
"default": "اوپر کے شمارے پر غور کریں، پھر اس کو دوبارہ کھول دیں۔" "default": "اوپر کے شمارے پر غور کریں، پھر اس کو دوبارہ کھول دیں۔",
"openCodeNodeModulesSymlinkPermission": "Agent Teams AI کو Administrator کے طور پر چلائیں، پھر launch دوبارہ آزمائیں."
} }
}, },
"presentation": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "ٹیمیں" "title": "ٹیمیں",
"status": {
"active": "فعال",
"provisioning": "شروع ہو رہی ہے",
"idle": "چل رہی ہے"
},
"noProject": "کوئی project نہیں"
}, },
"layout": { "layout": {
"maxPanesReached": "جواب {{count}} جلدیں پہنچ گئیں" "maxPanesReached": "جواب {{count}} جلدیں پہنچ گئیں"
}, },
"codexReconnect": { "codexReconnect": {
"description": "آپ کا تقرر سیشن غیر متصل ہوتا ہے. جاری رہنے کے لئے دوبارہ کوشش کریں.", "description": "آپ کا تقرر سیشن غیر متصل ہوتا ہے. جاری رہنے کے لئے دوبارہ کوشش کریں.",
"useCode": "کوڈ استعمال کریں" "useCode": "کوڈ استعمال کریں",
"generating": "بن رہا ہے...",
"openLogin": "Login کھولیں",
"generateLink": "Link بنائیں"
}, },
"effortLevel": { "effortLevel": {
"label": "فعال سطح (اختیاری)", "label": "فعال سطح (اختیاری)",
@ -2428,6 +2481,7 @@
"customRole": "دوبارہ کردار", "customRole": "دوبارہ کردار",
"searchPlaceholder": "تلاش کردار...", "searchPlaceholder": "تلاش کردار...",
"empty": "کوئی کردار نہیں ملا.", "empty": "کوئی کردار نہیں ملا.",
"reservedRole": "یہ کردار محفوظ ہے۔" "reservedRole": "یہ کردار محفوظ ہے۔",
"emptyCustomRole": "Role خالی نہیں ہو سکتی"
} }
} }

View file

@ -589,7 +589,11 @@
"actions": { "actions": {
"add": "添加 API 密钥", "add": "添加 API 密钥",
"addFirst": "添加您的第一个密钥", "addFirst": "添加您的第一个密钥",
"edit": "编辑" "edit": "编辑",
"copied": "已复制!",
"copyEnvVarName": "复制环境变量名",
"confirmDelete": "再次点击确认",
"delete": "删除"
}, },
"empty": { "empty": {
"title": "没有保存 ZXCVKEN0ZXCV 密钥", "title": "没有保存 ZXCVKEN0ZXCV 密钥",

View file

@ -46,7 +46,8 @@
"copiedShort": "复制", "copiedShort": "复制",
"copy": "复制诊断", "copy": "复制诊断",
"hints": "提示", "hints": "提示",
"likelyCause": "可能的原因是:" "likelyCause": "可能的原因是:",
"windowsSymlinkAdminHint": "Windows: 以管理员身份运行 Agent Teams AI"
}, },
"models": { "models": {
"alreadyDefault": "这已经是所选的 OpenCode 默认值 。", "alreadyDefault": "这已经是所选的 OpenCode 默认值 。",
@ -64,7 +65,15 @@
"searchPlaceholder": "搜索模式", "searchPlaceholder": "搜索模式",
"selectProjectBeforeTesting": "在测试模型前选择项目上下文 。", "selectProjectBeforeTesting": "在测试模型前选择项目上下文 。",
"selectProjectBeforeTestingDefaults": "在测试或保存 OpenCode 默认值之前选择工程上下文 。", "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": { "providers": {
"catalog": "OpenCode 提供者目录", "catalog": "OpenCode 提供者目录",
@ -108,7 +117,8 @@
"needsTest": "需要测试", "needsTest": "需要测试",
"failed": "失败", "failed": "失败",
"unknown": "不详", "unknown": "不详",
"default": "默认" "default": "默认",
"knownRoute": "已知 route"
}, },
"compatibleEndpoint": { "compatibleEndpoint": {
"baseUrlPlaceholder": "http://localhost:1234 苏维埃社会主义共和国" "baseUrlPlaceholder": "http://localhost:1234 苏维埃社会主义共和国"
@ -894,7 +904,8 @@
"apiKeyConfiguredNotVerified": "配置了 API 密钥,但尚未验证", "apiKeyConfiguredNotVerified": "配置了 API 密钥,但尚未验证",
"apiKeyModeMissingCredential": "选择了 API 密钥模式,但没有配置 API 密钥", "apiKeyModeMissingCredential": "选择了 API 密钥模式,但没有配置 API 密钥",
"connectedVia": "通过{{method}}连接", "connectedVia": "通过{{method}}连接",
"unableToVerify": "无法校验" "unableToVerify": "无法校验",
"modelsAvailable": "模型可用"
}, },
"mode": { "mode": {
"selectedAuth": "选中的认证: {{authMode}}", "selectedAuth": "选中的认证: {{authMode}}",

View file

@ -28,7 +28,9 @@
"session": "届会", "session": "届会",
"stallNudge": "缓冲", "stallNudge": "缓冲",
"start": "开始", "start": "开始",
"workSync": "工作同步" "workSync": "工作同步",
"agentError": "代理错误",
"apiError": "API 错误"
}, },
"bootstrap": { "bootstrap": {
"acknowledged": "靴子已经确认", "acknowledged": "靴子已经确认",
@ -77,7 +79,11 @@
"action": "答复" "action": "答复"
}, },
"activeTasks": { "activeTasks": {
"inProgress": "进行中" "inProgress": "进行中",
"expandInProgress": "展开进行中任务",
"collapseInProgress": "折叠进行中任务",
"reviewing": "正在审查",
"workingOn": "正在处理"
}, },
"expandDialog": { "expandDialog": {
"description": "扩展信件视图" "description": "扩展信件视图"
@ -349,7 +355,12 @@
}, },
"waitingForProvisioning": "一旦提供完毕,小组数据就会出现", "waitingForProvisioning": "一旦提供完毕,小组数据就会出现",
"context": { "context": {
"title": "背景情况" "title": "背景情况",
"loading": "正在加载...",
"noSessionLoaded": "未加载会话",
"closePanel": "关闭 {{team}} 上下文面板",
"loadingContext": "正在加载上下文...",
"openLeadSession": "打开团队负责人会话以查看上下文。"
} }
}, },
"review": { "review": {
@ -1571,7 +1582,10 @@
"emptyMessage": "未找到日志来源 。", "emptyMessage": "未找到日志来源 。",
"ariaLabel": "日志来源", "ariaLabel": "日志来源",
"leadLabel": "铅", "leadLabel": "铅",
"selectSourceEmpty": "选择日志源 。" "selectSourceEmpty": "选择日志源 。",
"leadDescription": "团队负责人",
"removedLabel": "已移除",
"removedDescription": "已移除"
} }
}, },
"agentGraph": { "agentGraph": {
@ -1620,14 +1634,39 @@
"more_one": "+ 键{{count}}更多", "more_one": "+ 键{{count}}更多",
"more_other": "+ 键{{count}}更多", "more_other": "+ 键{{count}}更多",
"more_few": "+ 键{{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": { "blockingEdge": {
"title": "封锁依赖性", "title": "封锁依赖性",
"blocks": "块", "blocks": "块",
"close": "关闭", "close": "关闭",
"blockingHiddenTasks": "屏蔽隐藏任务", "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": { "activityHud": {
"activity": "活动", "activity": "活动",
@ -1778,7 +1817,11 @@
"autoRefresh": "自动更新", "autoRefresh": "自动更新",
"wrapLines": "环行", "wrapLines": "环行",
"loadingTail": "正在装入进程日志尾巴...", "loadingTail": "正在装入进程日志尾巴...",
"empty": "尚未为这个成员捕获进程日志文件 。" "empty": "尚未为这个成员捕获进程日志文件 。",
"copy": "复制",
"fileEmpty": "进程日志文件为空。",
"showingLast": "显示最后 {{bytes}}。",
"showing": "显示 {{bytes}}。"
}, },
"tasks": { "tasks": {
"empty": "没有指派给该成员的任务" "empty": "没有指派给该成员的任务"
@ -2029,7 +2072,8 @@
"openCodeRuntimeMissing": "从提供者状态卡安装或重试 OpenCode 运行时间, 然后重新打开此对话框 。", "openCodeRuntimeMissing": "从提供者状态卡安装或重试 OpenCode 运行时间, 然后重新打开此对话框 。",
"openCodeAppMcpUnreachable": "重试发射刷新OpenCodeapp MCP桥. 如果重复,请重新启动应用程序和 OpenCode 运行时间 。", "openCodeAppMcpUnreachable": "重试发射刷新OpenCodeapp MCP桥. 如果重复,请重新启动应用程序和 OpenCode 运行时间 。",
"cliBinaryMissing": "确保本地的 Claude CLI 二进制存在并可以启动,然后重新打开此对话框 。", "cliBinaryMissing": "确保本地的 Claude CLI 二进制存在并可以启动,然后重新打开此对话框 。",
"default": "解决上面的问题, 然后重开这个对话框 。" "default": "解决上面的问题, 然后重开这个对话框 。",
"openCodeNodeModulesSymlinkPermission": "以管理员身份运行 Agent Teams AI, 然后重试启动。"
} }
}, },
"presentation": { "presentation": {
@ -2404,14 +2448,23 @@
} }
}, },
"runningTeams": { "runningTeams": {
"title": "运行团队" "title": "运行团队",
"status": {
"active": "活跃",
"provisioning": "启动中",
"idle": "运行中"
},
"noProject": "无项目"
}, },
"layout": { "layout": {
"maxPanesReached": "达到的最大 {{count}} 面板" "maxPanesReached": "达到的最大 {{count}} 面板"
}, },
"codexReconnect": { "codexReconnect": {
"description": "您的编码会话似乎已停滞 。 重新连接继续 。", "description": "您的编码会话似乎已停滞 。 重新连接继续 。",
"useCode": "使用代码" "useCode": "使用代码",
"generating": "正在生成...",
"openLogin": "打开登录",
"generateLink": "生成链接"
}, },
"effortLevel": { "effortLevel": {
"label": "努力级别( 可选)", "label": "努力级别( 可选)",
@ -2428,6 +2481,7 @@
"customRole": "自定义角色...", "customRole": "自定义角色...",
"searchPlaceholder": "搜索角色...", "searchPlaceholder": "搜索角色...",
"empty": "没有找到角色 。", "empty": "没有找到角色 。",
"reservedRole": "这个角色是保留下来的" "reservedRole": "这个角色是保留下来的",
"emptyCustomRole": "角色不能为空"
} }
} }

View file

@ -1117,6 +1117,10 @@ export default interface Resources {
actions: { actions: {
add: 'Add API Key'; add: 'Add API Key';
addFirst: 'Add your first key'; addFirst: 'Add your first key';
confirmDelete: 'Click again to confirm';
copied: 'Copied!';
copyEnvVarName: 'Copy env var name';
delete: 'Delete';
edit: 'Edit'; edit: 'Edit';
}; };
description: 'Securely store API keys for auto-filling when installing MCP servers.'; description: 'Securely store API keys for auto-filling when installing MCP servers.';
@ -2886,6 +2890,7 @@ export default interface Resources {
copy: 'Copy diagnostics'; copy: 'Copy diagnostics';
hints: 'Hints'; hints: 'Hints';
likelyCause: 'Likely cause:'; likelyCause: 'Likely cause:';
windowsSymlinkAdminHint: 'Windows: run Agent Teams AI as Administrator';
}; };
modelRoutes: { modelRoutes: {
searchPlaceholder: 'Search model routes'; searchPlaceholder: 'Search model routes';
@ -3016,7 +3021,11 @@ export default interface Resources {
restartTeam: 'Restart team'; restartTeam: 'Restart team';
}; };
activeTasks: { activeTasks: {
collapseInProgress: 'Collapse in progress';
expandInProgress: 'Expand in progress';
inProgress: 'In progress'; inProgress: 'In progress';
reviewing: 'reviewing';
workingOn: 'working on';
}; };
authError: { 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.'; 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'; workSyncBody: 'Asked teammate to sync current work';
}; };
badges: { badges: {
agentError: 'Agent Error';
apiError: 'API Error';
automation: 'automation'; automation: 'automation';
bootstrap: 'bootstrap'; bootstrap: 'bootstrap';
command: 'command'; command: 'command';
@ -3123,16 +3134,41 @@ export default interface Resources {
blockingHiddenTasks: 'Blocking hidden tasks'; blockingHiddenTasks: 'Blocking hidden tasks';
blocks: 'blocks'; blocks: 'blocks';
close: 'Close'; 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'; title: 'Blocking Dependency';
}; };
logPreview: { logPreview: {
error: 'Error';
logEvent: 'Log event';
loading: 'Loading logs'; loading: 'Loading logs';
logs: 'Logs'; logs: 'Logs';
logsUnavailable: 'Logs unavailable';
more: '+{{count}} more'; more: '+{{count}} more';
more_few: '+{{count}} more'; more_few: '+{{count}} more';
more_many: '+{{count}} more'; more_many: '+{{count}} more';
more_one: '+{{count}} more'; more_one: '+{{count}} more';
more_other: '+{{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: { popover: {
externalTeam: 'External team'; externalTeam: 'External team';
@ -3220,8 +3256,11 @@ export default interface Resources {
sourceSelect: { sourceSelect: {
ariaLabel: 'Log source'; ariaLabel: 'Log source';
emptyMessage: 'No log sources found.'; emptyMessage: 'No log sources found.';
leadDescription: 'Team Lead';
leadLabel: 'Lead'; leadLabel: 'Lead';
placeholder: 'Select log source...'; placeholder: 'Select log source...';
removedDescription: 'Removed';
removedLabel: 'removed';
searchPlaceholder: 'Search log sources...'; searchPlaceholder: 'Search log sources...';
selectSourceEmpty: 'Select a log source.'; selectSourceEmpty: 'Select a log source.';
}; };
@ -3230,6 +3269,9 @@ export default interface Resources {
}; };
codexReconnect: { codexReconnect: {
description: 'Your Codex session appears stale. Reconnect to continue.'; description: 'Your Codex session appears stale. Reconnect to continue.';
generateLink: 'Generate link';
generating: 'Generating...';
openLogin: 'Open login';
useCode: 'Use code'; useCode: 'Use code';
}; };
contextLimit: { contextLimit: {
@ -3330,6 +3372,11 @@ export default interface Resources {
visualize: 'Visualize'; visualize: 'Visualize';
}; };
context: { 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'; title: 'Context';
}; };
deleteTeam: { deleteTeam: {
@ -4144,8 +4191,12 @@ export default interface Resources {
}; };
runtimeLogs: { runtimeLogs: {
autoRefresh: 'Auto-refresh'; autoRefresh: 'Auto-refresh';
copy: 'Copy';
empty: 'No process log file captured for this member yet.'; empty: 'No process log file captured for this member yet.';
fileEmpty: 'Process log file is empty.';
loadingTail: 'Loading process log tail...'; loadingTail: 'Loading process log tail...';
showing: 'Showing {{bytes}}.';
showingLast: 'Showing last {{bytes}}.';
wrapLines: 'Wrap lines'; wrapLines: 'Wrap lines';
}; };
runtimeTelemetry: { 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.'; 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.'; 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.'; 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.'; 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.'; runtimeProviderNotConfigured: 'Configure the selected provider runtime, then reopen this dialog.';
workingDirectoryMissing: 'Choose an existing working directory, then reopen this dialog.'; workingDirectoryMissing: 'Choose an existing working directory, then reopen this dialog.';
@ -4993,11 +5045,18 @@ export default interface Resources {
roleSelect: { roleSelect: {
customRole: 'Custom role...'; customRole: 'Custom role...';
empty: 'No roles found.'; empty: 'No roles found.';
emptyCustomRole: 'Role cannot be empty';
noRole: 'No role'; noRole: 'No role';
reservedRole: 'This role is reserved'; reservedRole: 'This role is reserved';
searchPlaceholder: 'Search roles...'; searchPlaceholder: 'Search roles...';
}; };
runningTeams: { runningTeams: {
noProject: 'No project';
status: {
active: 'Active';
idle: 'Running';
provisioning: 'Launching';
};
title: 'Running Teams'; title: 'Running Teams';
}; };
schedule: { schedule: {

View file

@ -34,12 +34,20 @@ function formatBytes(bytes: number | undefined): string {
return `${mb.toFixed(mb >= 10 ? 0 : 1)} MB`; 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) return null;
if (log.missing) return 'No process log file captured for this member yet.'; if (log.missing) return labels.empty;
if (!log.content) return 'Process log file is empty.'; if (!log.content) return labels.fileEmpty;
if (log.truncated) return `Showing last ${formatBytes(log.bytesRead)}.`; if (log.truncated) return labels.showingLast(formatBytes(log.bytesRead));
return `Showing ${formatBytes(log.bytesRead)}.`; return labels.showing(formatBytes(log.bytesRead));
} }
function ProcessLogKindTabs({ function ProcessLogKindTabs({
@ -204,7 +212,12 @@ export function MemberRuntimeProcessLogsPanel({
} }
}, [log?.content]); }, [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); const hasContent = Boolean(log?.content);
return ( return (
@ -252,7 +265,7 @@ export function MemberRuntimeProcessLogsPanel({
disabled={!hasContent} disabled={!hasContent}
> >
{copied ? <Check size={13} /> : <Clipboard size={13} />} {copied ? <Check size={13} /> : <Clipboard size={13} />}
{copied ? 'Copied' : 'Copy'} {copied ? tCommon('actions.copied') : t('members.runtimeLogs.copy')}
</button> </button>
</div> </div>
</div> </div>

View file

@ -17,36 +17,54 @@ export interface RunningTeamRowModel {
taskCounts?: TaskStatusCounts; taskCounts?: TaskStatusCounts;
} }
function getStatusLabel(status: RunningTeamDashboardEntry['status']): string { export interface RunningTeamsSectionText {
status: Record<RunningTeamDashboardEntry['status'], string>;
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) { switch (status) {
case 'active': case 'active':
return 'Active'; return text.status.active;
case 'provisioning': case 'provisioning':
return 'Launching'; return text.status.provisioning;
case 'idle': case 'idle':
return 'Running'; return text.status.idle;
} }
} }
function getProjectLabel(projectPath?: string): string { function getProjectLabel(projectPath: string | undefined, text: RunningTeamsSectionText): string {
if (!projectPath) { if (!projectPath) {
return 'No project'; return text.noProject;
} }
return getBaseName(projectPath) || projectPath; return getBaseName(projectPath) || projectPath;
} }
export function adaptRunningTeamsSection( export function adaptRunningTeamsSection(
teams: RunningTeamDashboardEntry[] teams: RunningTeamDashboardEntry[],
text: RunningTeamsSectionText = DEFAULT_TEXT
): RunningTeamRowModel[] { ): RunningTeamRowModel[] {
return teams.map((team) => ({ return teams.map((team) => ({
id: team.teamName, id: team.teamName,
teamName: team.teamName, teamName: team.teamName,
displayName: team.displayName, displayName: team.displayName,
projectPath: team.projectPath, projectPath: team.projectPath,
projectLabel: getProjectLabel(team.projectPath), projectLabel: getProjectLabel(team.projectPath, text),
status: team.status, status: team.status,
statusLabel: getStatusLabel(team.status), statusLabel: getStatusLabel(team.status, text),
iconColor: team.color iconColor: team.color
? getTeamColorSet(team.color).border ? getTeamColorSet(team.color).border
: nameColorSet(team.displayName).border, : nameColorSet(team.displayName).border,

View file

@ -1,5 +1,6 @@
import { useCallback, useEffect, useMemo, useState } from 'react'; import { useCallback, useEffect, useMemo, useState } from 'react';
import { useAppTranslation } from '@features/localization/renderer';
import { api } from '@renderer/api'; import { api } from '@renderer/api';
import { useStore } from '@renderer/store'; import { useStore } from '@renderer/store';
import { import {
@ -58,6 +59,7 @@ function toCandidate(input: {
} }
export function useRunningTeamsSection(searchQuery: string): RunningTeamsSectionState { export function useRunningTeamsSection(searchQuery: string): RunningTeamsSectionState {
const { t } = useAppTranslation('team');
const { const {
teams, teams,
globalTasks, 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, aliveTeams,
globalTasks, globalTasks,
@ -182,6 +191,7 @@ export function useRunningTeamsSection(searchQuery: string): RunningTeamsSection
provisioningTeamNames, provisioningTeamNames,
searchActive, searchActive,
teams, teams,
t,
]); ]);
const openRunningTeam = useCallback( const openRunningTeam = useCallback(

View file

@ -42,7 +42,10 @@ import {
shouldShowProviderStatusSkeleton, shouldShowProviderStatusSkeleton,
} from '@renderer/components/runtime/providerConnectionUi'; } from '@renderer/components/runtime/providerConnectionUi';
import { ProviderModelBadges } from '@renderer/components/runtime/ProviderModelBadges'; import { ProviderModelBadges } from '@renderer/components/runtime/ProviderModelBadges';
import { getProviderRuntimeBackendSummary } from '@renderer/components/runtime/ProviderRuntimeBackendSelector'; import {
buildProviderRuntimeBackendSummaryText,
getProviderRuntimeBackendSummary,
} from '@renderer/components/runtime/ProviderRuntimeBackendSelector';
import { import {
getProviderTerminalCommand, getProviderTerminalCommand,
getProviderTerminalLogoutCommand, getProviderTerminalLogoutCommand,
@ -839,6 +842,11 @@ const InstalledBanner = ({
}: InstalledBannerProps): React.JSX.Element => { }: InstalledBannerProps): React.JSX.Element => {
const { t } = useAppTranslation('dashboard'); const { t } = useAppTranslation('dashboard');
const { t: settingsT } = useAppTranslation('settings'); const { t: settingsT } = useAppTranslation('settings');
const { t: commonT } = useAppTranslation('common');
const runtimeBackendSummaryText = useMemo(
() => buildProviderRuntimeBackendSummaryText(commonT),
[commonT]
);
const openExtensionsTab = useStore((s) => s.openExtensionsTab); const openExtensionsTab = useStore((s) => s.openExtensionsTab);
const styles = VARIANT_STYLES[variant]; const styles = VARIANT_STYLES[variant];
const visibleProviders = useMemo( const visibleProviders = useMemo(
@ -966,7 +974,7 @@ const InstalledBanner = ({
const actionDisabled = isBusy || !cliStatus.binaryPath; const actionDisabled = isBusy || !cliStatus.binaryPath;
const runtimeSummary = isConnectionManagedRuntimeProvider(provider) const runtimeSummary = isConnectionManagedRuntimeProvider(provider)
? getProviderCurrentRuntimeSummary(provider, settingsT) ? getProviderCurrentRuntimeSummary(provider, settingsT)
: getProviderRuntimeBackendSummary(provider); : getProviderRuntimeBackendSummary(provider, runtimeBackendSummaryText);
const connectionModeSummary = getProviderConnectionModeSummary(provider, settingsT); const connectionModeSummary = getProviderConnectionModeSummary(provider, settingsT);
const credentialSummary = getProviderCredentialSummary(provider, settingsT); const credentialSummary = getProviderCredentialSummary(provider, settingsT);
const dashboardRateLimits = getDashboardRateLimitsForProvider(provider); const dashboardRateLimits = getDashboardRateLimitsForProvider(provider);

View file

@ -95,7 +95,9 @@ export const ApiKeyCard = ({ apiKey, onEdit }: ApiKeyCardProps): React.JSX.Eleme
)} )}
</Button> </Button>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent>{copied ? 'Copied!' : 'Copy env var name'}</TooltipContent> <TooltipContent>
{copied ? t('apiKeys.actions.copied') : t('apiKeys.actions.copyEnvVarName')}
</TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider> </TooltipProvider>
</div> </div>
@ -135,7 +137,9 @@ export const ApiKeyCard = ({ apiKey, onEdit }: ApiKeyCardProps): React.JSX.Eleme
<Trash2 className="size-3.5" /> <Trash2 className="size-3.5" />
</Button> </Button>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent>{confirmDelete ? 'Click again to confirm' : 'Delete'}</TooltipContent> <TooltipContent>
{confirmDelete ? t('apiKeys.actions.confirmDelete') : t('apiKeys.actions.delete')}
</TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider> </TooltipProvider>
</div> </div>

View file

@ -16,6 +16,52 @@ interface Props {
onSelect: (providerId: CliProviderStatus['providerId'], backendId: string) => void; 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<typeof useAppTranslation>['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( export function getProviderRuntimeBackendStateLabel(
option: NonNullable<CliProviderStatus['availableBackends']>[number] option: NonNullable<CliProviderStatus['availableBackends']>[number]
): string | null { ): string | null {
@ -78,7 +124,47 @@ export function getOptionDisplayLabel(
return 'Auto'; return 'Auto';
} }
export function getProviderRuntimeBackendSummary(provider: CliProviderStatus): string | null { function getOptionSummaryDisplayLabel(
provider: CliProviderStatus,
option: NonNullable<CliProviderStatus['availableBackends']>[number],
resolvedOption: NonNullable<CliProviderStatus['availableBackends']>[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<CliProviderStatus['availableBackends']>[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 ?? []; const options = provider.availableBackends ?? [];
if (options.length === 0) { if (options.length === 0) {
return null; return null;
@ -87,9 +173,11 @@ export function getProviderRuntimeBackendSummary(provider: CliProviderStatus): s
const selectedBackendId = provider.selectedBackendId ?? options[0]?.id ?? ''; const selectedBackendId = provider.selectedBackendId ?? options[0]?.id ?? '';
const selectedOption = options.find((option) => option.id === selectedBackendId) ?? options[0]; const selectedOption = options.find((option) => option.id === selectedBackendId) ?? options[0];
const resolvedOption = options.find((option) => option.id === provider.resolvedBackendId) ?? null; const resolvedOption = options.find((option) => option.id === provider.resolvedBackendId) ?? null;
const parts = [getOptionDisplayLabel(provider, selectedOption, resolvedOption)]; const parts = [getOptionSummaryDisplayLabel(provider, selectedOption, resolvedOption, text)];
const audienceLabel = getProviderRuntimeBackendAudienceLabel(selectedOption); const audienceLabel = getProviderRuntimeBackendAudienceLabel(selectedOption)
const stateLabel = getProviderRuntimeBackendStateLabel(selectedOption); ? text.audienceInternal
: null;
const stateLabel = getProviderRuntimeBackendStateSummaryLabel(selectedOption, text);
if (audienceLabel) { if (audienceLabel) {
parts.push(audienceLabel.toLowerCase()); parts.push(audienceLabel.toLowerCase());
@ -107,6 +195,7 @@ export const ProviderRuntimeBackendSelector = ({
onSelect, onSelect,
}: Props): React.JSX.Element | null => { }: Props): React.JSX.Element | null => {
const { t } = useAppTranslation('common'); const { t } = useAppTranslation('common');
const summaryText = buildProviderRuntimeBackendSummaryText(t);
const options = getVisibleProviderRuntimeBackendOptions(provider); const options = getVisibleProviderRuntimeBackendOptions(provider);
if (options.length === 0) { if (options.length === 0) {
return null; return null;
@ -150,9 +239,9 @@ export const ProviderRuntimeBackendSelector = ({
): string => { ): string => {
if (option.id === 'auto') { if (option.id === 'auto') {
if (resolvedOption?.label) { 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); return getOptionDisplayLabel(provider, option, resolvedOption);
}; };

View file

@ -60,6 +60,7 @@ import {
isConnectionManagedRuntimeProvider, isConnectionManagedRuntimeProvider,
} from './providerConnectionUi'; } from './providerConnectionUi';
import { import {
buildProviderRuntimeBackendSummaryText,
getProviderRuntimeBackendSummary, getProviderRuntimeBackendSummary,
getVisibleProviderRuntimeBackendOptions, getVisibleProviderRuntimeBackendOptions,
ProviderRuntimeBackendSelector, ProviderRuntimeBackendSelector,
@ -792,6 +793,11 @@ export const ProviderRuntimeSettingsDialog = ({
onRequestLogin, onRequestLogin,
}: Props): React.JSX.Element => { }: Props): React.JSX.Element => {
const { t } = useAppTranslation('settings'); const { t } = useAppTranslation('settings');
const { t: commonT } = useAppTranslation('common');
const runtimeBackendSummaryText = useMemo(
() => buildProviderRuntimeBackendSummaryText(commonT),
[commonT]
);
const [selectedProviderId, setSelectedProviderId] = useState<CliProviderId>(initialProviderId); const [selectedProviderId, setSelectedProviderId] = useState<CliProviderId>(initialProviderId);
const [activeApiKeyFormProviderId, setActiveApiKeyFormProviderId] = const [activeApiKeyFormProviderId, setActiveApiKeyFormProviderId] =
useState<ApiKeyProviderId | null>(null); useState<ApiKeyProviderId | null>(null);
@ -987,7 +993,7 @@ export const ProviderRuntimeSettingsDialog = ({
? providerStatusLoading[selectedProvider.providerId] === true ? providerStatusLoading[selectedProvider.providerId] === true
: false; : false;
const runtimeSummary = selectedProvider const runtimeSummary = selectedProvider
? getProviderRuntimeBackendSummary(selectedProvider) ? getProviderRuntimeBackendSummary(selectedProvider, runtimeBackendSummaryText)
: null; : null;
const codexConnection = const codexConnection =
selectedProvider?.providerId === 'codex' ? (selectedProvider.connection?.codex ?? null) : null; selectedProvider?.providerId === 'codex' ? (selectedProvider.connection?.codex ?? null) : null;

View file

@ -29,7 +29,10 @@ import {
shouldShowProviderStatusSkeleton, shouldShowProviderStatusSkeleton,
} from '@renderer/components/runtime/providerConnectionUi'; } from '@renderer/components/runtime/providerConnectionUi';
import { ProviderModelBadges } from '@renderer/components/runtime/ProviderModelBadges'; 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 { ProviderRuntimeSettingsDialog } from '@renderer/components/runtime/ProviderRuntimeSettingsDialog';
import { import {
getProviderTerminalCommand, getProviderTerminalCommand,
@ -129,6 +132,11 @@ function getProviderLabel(providerId: CliProviderId): string {
export const CliStatusSection = (): React.JSX.Element | null => { export const CliStatusSection = (): React.JSX.Element | null => {
const { t } = useAppTranslation('settings'); const { t } = useAppTranslation('settings');
const { t: commonT } = useAppTranslation('common');
const runtimeBackendSummaryText = useMemo(
() => buildProviderRuntimeBackendSummaryText(commonT),
[commonT]
);
const isElectron = useMemo(() => isElectronMode(), []); const isElectron = useMemo(() => isElectronMode(), []);
const appConfig = useStore((s) => s.appConfig); const appConfig = useStore((s) => s.appConfig);
const selectedProjectId = useStore((s) => s.selectedProjectId); const selectedProjectId = useStore((s) => s.selectedProjectId);
@ -493,7 +501,7 @@ export const CliStatusSection = (): React.JSX.Element | null => {
isCodexSnapshotPending(provider, codexSnapshotPending); isCodexSnapshotPending(provider, codexSnapshotPending);
const runtimeSummary = isConnectionManagedRuntimeProvider(provider) const runtimeSummary = isConnectionManagedRuntimeProvider(provider)
? getProviderCurrentRuntimeSummary(provider, t) ? getProviderCurrentRuntimeSummary(provider, t)
: getProviderRuntimeBackendSummary(provider); : getProviderRuntimeBackendSummary(provider, runtimeBackendSummaryText);
const sourceProvider = const sourceProvider =
loadingCliProviderMap.get(provider.providerId) ?? null; loadingCliProviderMap.get(provider.providerId) ?? null;
const maskNegativeBootstrapState = shouldMaskCodexNegativeBootstrapState( const maskNegativeBootstrapState = shouldMaskCodexNegativeBootstrapState(

View file

@ -141,9 +141,14 @@ const TeamLogsSourceSelector = ({
getMemberLabel={(member) => getMemberLabel={(member) =>
isLeadMember(member) isLeadMember(member)
? t('claudeLogs.sourceSelect.leadLabel') ? 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}
/> />
</div> </div>
); );

View file

@ -1159,14 +1159,16 @@ const LeadLoadBridge = memo(function LeadLoadBridge({
{t('detail.context.title')} {t('detail.context.title')}
</p> </p>
<p className="text-[10px] text-[var(--color-text-muted)]"> <p className="text-[10px] text-[var(--color-text-muted)]">
{leadSessionLoading ? 'Loading…' : 'No session loaded'} {leadSessionLoading
? t('detail.context.loading')
: t('detail.context.noSessionLoaded')}
</p> </p>
</div> </div>
<button <button
type="button" type="button"
className="rounded p-1 text-[var(--color-text-muted)] transition-colors hover:bg-[var(--color-surface-raised)] hover:text-[var(--color-text)]" className="rounded p-1 text-[var(--color-text-muted)] transition-colors hover:bg-[var(--color-surface-raised)] hover:text-[var(--color-text)]"
onClick={() => setContextPanelVisible(false)} onClick={() => setContextPanelVisible(false)}
aria-label={`Close ${teamName} context panel`} aria-label={t('detail.context.closePanel', { team: teamName })}
> >
× ×
</button> </button>
@ -1174,8 +1176,8 @@ const LeadLoadBridge = memo(function LeadLoadBridge({
<div className="flex flex-1 items-center justify-center p-4"> <div className="flex flex-1 items-center justify-center p-4">
<p className="text-xs text-[var(--color-text-muted)]"> <p className="text-xs text-[var(--color-text-muted)]">
{leadSessionLoading {leadSessionLoading
? 'Loading context…' ? t('detail.context.loadingContext')
: 'Open the team lead session to view context.'} : t('detail.context.openLeadSession')}
</p> </p>
</div> </div>
</div> </div>
@ -1208,7 +1210,7 @@ const LeadLoadBridge = memo(function LeadLoadBridge({
leadSessionLoaded leadSessionLoaded
? `Session: ${leadSessionId}` ? `Session: ${leadSessionId}`
: leadSessionLoading : leadSessionLoading
? 'Loading context…' ? t('detail.context.loadingContext')
: leadSessionId : leadSessionId
} }
> >

View file

@ -83,7 +83,11 @@ export const ActiveTasksBlock = memo(function ActiveTasksBlock({
type="button" 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)]" 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)} onClick={() => setCollapsed((v) => !v)}
aria-label={collapsed ? 'Expand in progress' : 'Collapse in progress'} aria-label={
collapsed
? t('activity.activeTasks.expandInProgress')
: t('activity.activeTasks.collapseInProgress')
}
> >
<ChevronRight <ChevronRight
size={10} size={10}
@ -106,7 +110,10 @@ export const ActiveTasksBlock = memo(function ActiveTasksBlock({
); );
const dotPing = kind === 'reviewing' ? 'bg-amber-400' : 'bg-emerald-400'; const dotPing = kind === 'reviewing' ? 'bg-amber-400' : 'bg-emerald-400';
const dotSolid = kind === 'reviewing' ? 'bg-amber-500' : 'bg-emerald-500'; const dotSolid = kind === 'reviewing' ? 'bg-amber-500' : 'bg-emerald-500';
const activityLabel = kind === 'reviewing' ? 'reviewing' : 'working on'; const activityLabel =
kind === 'reviewing'
? t('activity.activeTasks.reviewing')
: t('activity.activeTasks.workingOn');
return ( return (
<article <article

View file

@ -1225,12 +1225,14 @@ export const ActivityItem = memo(
<AlertTriangle size={10} /> <AlertTriangle size={10} />
{t('activity.badges.rateLimited')} {t('activity.badges.rateLimited')}
</span> </span>
) : isApiError ? ( ) : isApiError ? (
<span className="inline-flex items-center gap-1 rounded-full bg-red-500/20 px-1.5 py-0.5 text-[10px] font-medium text-red-400"> <span className="inline-flex items-center gap-1 rounded-full bg-red-500/20 px-1.5 py-0.5 text-[10px] font-medium text-red-400">
<AlertTriangle size={10} /> <AlertTriangle size={10} />
{message.messageKind === 'agent_error' ? 'Agent Error' : 'API Error'} {message.messageKind === 'agent_error'
</span> ? t('activity.badges.agentError')
) : null; : t('activity.badges.apiError')}
</span>
) : null;
const recipientBadge = const recipientBadge =
commentTaskRef && commentTaskDisplayId ? ( commentTaskRef && commentTaskDisplayId ? (

View file

@ -128,7 +128,11 @@ export const CodexReconnectPrompt = ({
}} }}
> >
<LogIn className="size-3" /> <LogIn className="size-3" />
{reconnectBusy ? 'Generating...' : authUrl ? 'Open login' : 'Generate link'} {reconnectBusy
? t('codexReconnect.generating')
: authUrl
? t('codexReconnect.openLogin')
: t('codexReconnect.generateLink')}
</button> </button>
</div> </div>
</div> </div>

View file

@ -1,5 +1,6 @@
import { useState } from 'react'; import { useState } from 'react';
import { useAppTranslation } from '@features/localization/renderer';
import { Button } from '@renderer/components/ui/button'; import { Button } from '@renderer/components/ui/button';
import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip'; import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip';
import { cn } from '@renderer/lib/utils'; import { cn } from '@renderer/lib/utils';
@ -24,6 +25,7 @@ export const MemberLaunchDiagnosticsButton = ({
size = label ? 'sm' : 'icon', size = label ? 'sm' : 'icon',
attention = false, attention = false,
}: MemberLaunchDiagnosticsButtonProps): React.JSX.Element => { }: MemberLaunchDiagnosticsButtonProps): React.JSX.Element => {
const { t } = useAppTranslation('team');
const [copied, setCopied] = useState(false); const [copied, setCopied] = useState(false);
const copyDiagnostics = async (event: React.MouseEvent<HTMLButtonElement>): Promise<void> => { const copyDiagnostics = async (event: React.MouseEvent<HTMLButtonElement>): Promise<void> => {
@ -39,7 +41,7 @@ export const MemberLaunchDiagnosticsButton = ({
}; };
const icon = copied ? <Check size={13} /> : <ClipboardList size={13} />; const icon = copied ? <Check size={13} /> : <ClipboardList size={13} />;
const tooltip = copied ? 'Diagnostics copied' : 'Copy diagnostics'; const tooltip = copied ? t('provisioning.diagnosticsCopied') : t('provisioning.copyDiagnostics');
return ( return (
<Tooltip> <Tooltip>

View file

@ -1,5 +1,6 @@
import { useState } from 'react'; import { useState } from 'react';
import { useAppTranslation } from '@features/localization/renderer';
import { RoleSelect } from '@renderer/components/team/RoleSelect'; import { RoleSelect } from '@renderer/components/team/RoleSelect';
import { Button } from '@renderer/components/ui/button'; import { Button } from '@renderer/components/ui/button';
import { CUSTOM_ROLE, FORBIDDEN_ROLES, NO_ROLE, PRESET_ROLES } from '@renderer/constants/teamRoles'; import { CUSTOM_ROLE, FORBIDDEN_ROLES, NO_ROLE, PRESET_ROLES } from '@renderer/constants/teamRoles';
@ -18,6 +19,7 @@ export const MemberRoleEditor = ({
onCancel, onCancel,
saving, saving,
}: MemberRoleEditorProps): React.JSX.Element => { }: MemberRoleEditorProps): React.JSX.Element => {
const { t } = useAppTranslation('team');
const isPreset = currentRole && (PRESET_ROLES as readonly string[]).includes(currentRole); const isPreset = currentRole && (PRESET_ROLES as readonly string[]).includes(currentRole);
const [selectValue, setSelectValue] = useState<string>( const [selectValue, setSelectValue] = useState<string>(
!currentRole ? NO_ROLE : isPreset ? currentRole : CUSTOM_ROLE !currentRole ? NO_ROLE : isPreset ? currentRole : CUSTOM_ROLE
@ -44,11 +46,11 @@ export const MemberRoleEditor = ({
} }
const trimmed = customInput.trim(); const trimmed = customInput.trim();
if (!trimmed) { if (!trimmed) {
setError('Role cannot be empty'); setError(t('roleSelect.emptyCustomRole'));
return; return;
} }
if (FORBIDDEN_ROLES.has(trimmed.toLowerCase())) { if (FORBIDDEN_ROLES.has(trimmed.toLowerCase())) {
setError('This role is reserved'); setError(t('roleSelect.reservedRole'));
return; return;
} }
void onSave(trimmed); void onSave(trimmed);
@ -68,7 +70,7 @@ export const MemberRoleEditor = ({
inputClassName="h-7 w-28 text-xs" inputClassName="h-7 w-28 text-xs"
customRoleError={error} customRoleError={error}
onCustomRoleValidate={(val) => { 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; return null;
}} }}
/> />

View file

@ -26,13 +26,19 @@ export function getMemberNameFromLogSourceKey(sourceKey: TeamLogSourceKey): stri
return sourceKey.slice('member:'.length); return sourceKey.slice('member:'.length);
} }
export function formatMemberLogSourceLabel(member: ResolvedTeamMember): string { export function formatMemberLogSourceLabel(member: ResolvedTeamMember, removedLabel = 'removed'): string {
return member.removedAt ? `${member.name} (removed)` : member.name; return member.removedAt ? `${member.name} (${removedLabel})` : member.name;
} }
export function formatMemberLogSourceDescription(member: ResolvedTeamMember): string | null { export function formatMemberLogSourceDescription(
if (isLeadMember(member)) return 'Team Lead'; member: ResolvedTeamMember,
if (member.removedAt) return 'Removed'; 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; return formatAgentRole(member.role) ?? formatAgentRole(member.agentType) ?? null;
} }