feat(landing): enhance localization and improve UI components
- Added support for German (de), French (fr), and Japanese (ja) languages, expanding the localization capabilities of the application. - Updated the LanguageSwitcher component to include new language options and a search feature for better user experience. - Enhanced the HeroSection with dynamic download URLs and a release version badge for improved visibility of updates. - Refactored the ScreenshotsSection to utilize a new data structure for screenshots, improving maintainability and performance. - Improved the styling of various components, including the addition of search functionality in the LanguageSwitcher and adjustments to the layout of the HeroSection. - Fixed type handling in several components to ensure better TypeScript compatibility and reduce potential runtime errors.
This commit is contained in:
parent
eda6218e67
commit
0876f192fa
27 changed files with 942 additions and 65 deletions
|
|
@ -23,6 +23,9 @@ const flagIconMap: Record<string, string> = {
|
|||
hi: "circle-flags:in",
|
||||
ar: "circle-flags:sa",
|
||||
pt: "circle-flags:br",
|
||||
fr: "circle-flags:fr",
|
||||
ja: "circle-flags:jp",
|
||||
de: "circle-flags:de",
|
||||
ru: "circle-flags:ru"
|
||||
};
|
||||
|
||||
|
|
@ -43,6 +46,25 @@ const currentFlagIcon = computed(() => {
|
|||
});
|
||||
|
||||
const iconMenuOpen = ref(false);
|
||||
const searchQuery = ref("");
|
||||
const searchInputRef = ref<HTMLInputElement | null>(null);
|
||||
|
||||
const filteredDropdownItems = computed(() => {
|
||||
const q = searchQuery.value.toLowerCase().trim();
|
||||
if (!q) return dropdownItems.value;
|
||||
return dropdownItems.value.filter(
|
||||
(item) =>
|
||||
item.title.toLowerCase().includes(q) ||
|
||||
item.value.toLowerCase().includes(q)
|
||||
);
|
||||
});
|
||||
|
||||
watch(iconMenuOpen, (open) => {
|
||||
if (open) {
|
||||
searchQuery.value = "";
|
||||
nextTick(() => searchInputRef.value?.focus());
|
||||
}
|
||||
});
|
||||
|
||||
const { trackLanguageSwitch } = useAnalytics();
|
||||
|
||||
|
|
@ -51,8 +73,8 @@ const onChange = async (value: string | LocaleCode) => {
|
|||
iconMenuOpen.value = false;
|
||||
trackLanguageSwitch(locale.value as string, nextLocale);
|
||||
localeStore.setLocale(nextLocale, true);
|
||||
if (nuxtApp.$i18n?.setLocale) {
|
||||
await nuxtApp.$i18n.setLocale(nextLocale);
|
||||
if ((nuxtApp.$i18n as any)?.setLocale) {
|
||||
await (nuxtApp.$i18n as any).setLocale(nextLocale);
|
||||
} else {
|
||||
locale.value = nextLocale;
|
||||
}
|
||||
|
|
@ -64,27 +86,44 @@ const onChange = async (value: string | LocaleCode) => {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<!-- Icon-only mode -->
|
||||
<v-menu v-if="props.iconOnly" v-model="iconMenuOpen" location="bottom end">
|
||||
<!-- Icon-only mode with search dropdown -->
|
||||
<v-menu v-if="props.iconOnly" v-model="iconMenuOpen" location="bottom end" :close-on-content-click="false">
|
||||
<template #activator="{ props: menuProps }">
|
||||
<v-btn variant="text" v-bind="menuProps" :aria-label="t('language.label')">
|
||||
<Icon :name="currentFlagIcon" class="language-switcher__flag-icon" />
|
||||
</v-btn>
|
||||
</template>
|
||||
<v-list density="compact" class="language-switcher__menu-list">
|
||||
<v-list-item
|
||||
v-for="item in dropdownItems"
|
||||
:key="item.value"
|
||||
@click="onChange(item.value)"
|
||||
>
|
||||
<template #title>
|
||||
<span class="language-switcher__item">
|
||||
<Icon :name="item.flagIcon" class="language-switcher__flag-icon" />
|
||||
<span>{{ item.title }}</span>
|
||||
</span>
|
||||
</template>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
<div class="language-switcher__dropdown-panel">
|
||||
<div class="language-switcher__search-wrap">
|
||||
<input
|
||||
ref="searchInputRef"
|
||||
v-model="searchQuery"
|
||||
type="text"
|
||||
class="language-switcher__search-input"
|
||||
:placeholder="t('language.search')"
|
||||
@keydown.esc="iconMenuOpen = false"
|
||||
/>
|
||||
</div>
|
||||
<v-list density="compact" class="language-switcher__menu-list">
|
||||
<v-list-item
|
||||
v-for="item in filteredDropdownItems"
|
||||
:key="item.value"
|
||||
@click="onChange(item.value)"
|
||||
>
|
||||
<template #title>
|
||||
<span class="language-switcher__item">
|
||||
<Icon :name="item.flagIcon" class="language-switcher__flag-icon" />
|
||||
<span>{{ item.title }}</span>
|
||||
</span>
|
||||
</template>
|
||||
</v-list-item>
|
||||
<v-list-item v-if="filteredDropdownItems.length === 0" disabled>
|
||||
<template #title>
|
||||
<span class="language-switcher__no-results">—</span>
|
||||
</template>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</div>
|
||||
</v-menu>
|
||||
|
||||
<!-- Standard mode with search -->
|
||||
|
|
@ -164,5 +203,64 @@ const onChange = async (value: string | LocaleCode) => {
|
|||
|
||||
.language-switcher__menu-list {
|
||||
min-width: 180px;
|
||||
max-height: 280px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.language-switcher__dropdown-panel {
|
||||
background: rgb(var(--v-theme-surface));
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
min-width: 200px;
|
||||
}
|
||||
|
||||
.language-switcher__search-wrap {
|
||||
padding: 8px 10px 4px;
|
||||
}
|
||||
|
||||
.language-switcher__search-input {
|
||||
width: 100%;
|
||||
padding: 6px 10px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.12);
|
||||
border-radius: 6px;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
color: inherit;
|
||||
font-size: 0.85rem;
|
||||
outline: none;
|
||||
transition: border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.language-switcher__search-input:focus {
|
||||
border-color: rgba(0, 240, 255, 0.4);
|
||||
}
|
||||
|
||||
.language-switcher__search-input::placeholder {
|
||||
color: rgba(255, 255, 255, 0.35);
|
||||
font-size: 0.82rem;
|
||||
}
|
||||
|
||||
.language-switcher__no-results {
|
||||
color: rgba(255, 255, 255, 0.35);
|
||||
font-size: 0.82rem;
|
||||
text-align: center;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Light theme */
|
||||
.v-theme--light .language-switcher__search-input {
|
||||
border-color: rgba(0, 0, 0, 0.12);
|
||||
background: rgba(0, 0, 0, 0.03);
|
||||
}
|
||||
|
||||
.v-theme--light .language-switcher__search-input:focus {
|
||||
border-color: rgba(0, 140, 180, 0.4);
|
||||
}
|
||||
|
||||
.v-theme--light .language-switcher__search-input::placeholder {
|
||||
color: rgba(0, 0, 0, 0.35);
|
||||
}
|
||||
|
||||
.v-theme--light .language-switcher__no-results {
|
||||
color: rgba(0, 0, 0, 0.35);
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
<script setup lang="ts">
|
||||
import { mdiApple, mdiMicrosoftWindows, mdiPenguin, mdiDownload, mdiCheckCircle } from '@mdi/js';
|
||||
import { downloadAssets } from "~/data/downloads";
|
||||
import type { DownloadOs, DownloadArch } from "~/data/downloads";
|
||||
|
||||
const { content } = useLandingContent();
|
||||
const { t, locale } = useI18n();
|
||||
|
|
@ -22,23 +23,32 @@ const platformColors: Record<string, string> = {
|
|||
linux: "#ffd700",
|
||||
};
|
||||
|
||||
const visibleAssets = computed(() =>
|
||||
downloadAssets.map((asset) => {
|
||||
const visibleAssets = computed(() => {
|
||||
const enriched = downloadAssets.map((asset) => {
|
||||
if (asset.os !== "macos") return { ...asset };
|
||||
if (!downloadStore.isMacOs) return { ...asset };
|
||||
return {
|
||||
...asset,
|
||||
archLabel: downloadStore.macArch === "arm64" ? "Apple Silicon" : "Intel",
|
||||
};
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
const getDownloadUrl = (asset: (typeof downloadAssets)[number]) => {
|
||||
const arch = asset.os === "macos" ? downloadStore.macArch : asset.arch;
|
||||
return resolve(asset.os, arch)?.url || asset.url;
|
||||
// Reorder so detected OS is always in the center (index 1)
|
||||
const detectedIdx = enriched.findIndex((a) => a.id === downloadStore.selectedId);
|
||||
if (detectedIdx === -1 || detectedIdx === 1) return enriched;
|
||||
|
||||
const result = [...enriched];
|
||||
const [detected] = result.splice(detectedIdx, 1);
|
||||
const [first, ...rest] = result;
|
||||
return [first, detected, ...rest];
|
||||
});
|
||||
|
||||
const getDownloadUrl = (asset: { os: string; arch: string; url: string }) => {
|
||||
const arch = (asset.os === "macos" ? downloadStore.macArch : asset.arch) as DownloadArch;
|
||||
return resolve(asset.os as DownloadOs, arch)?.url || asset.url;
|
||||
};
|
||||
|
||||
const getDownloadArch = (asset: (typeof downloadAssets)[number]) => {
|
||||
const getDownloadArch = (asset: { os: string; arch: string }) => {
|
||||
return asset.os === "macos" ? downloadStore.macArch : asset.arch;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ const items = computed(() =>
|
|||
if (!contentItem) return null;
|
||||
return { ...contentItem, icon: feature.icon, accent: feature.accent };
|
||||
})
|
||||
.filter(Boolean)
|
||||
.filter((item): item is NonNullable<typeof item> => item !== null)
|
||||
);
|
||||
</script>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,25 @@ import { mdiRobotOutline, mdiViewDashboardOutline, mdiOpenSourceInitiative } fro
|
|||
const { content } = useLandingContent();
|
||||
const { t } = useI18n();
|
||||
const { baseURL } = useRuntimeConfig().app;
|
||||
|
||||
const downloadStore = useDownloadStore();
|
||||
const { resolve, data: releaseData } = useReleaseDownloads();
|
||||
|
||||
const releaseVersion = computed(() => releaseData.value?.version || null);
|
||||
const releaseDate = computed(() => {
|
||||
const raw = releaseData.value?.pubDate;
|
||||
if (!raw) return null;
|
||||
return new Date(raw).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });
|
||||
});
|
||||
|
||||
onMounted(() => downloadStore.init());
|
||||
|
||||
const heroDownloadUrl = computed(() => {
|
||||
const asset = downloadStore.selectedAsset;
|
||||
if (!asset) return 'https://github.com/777genius/claude_agent_teams_ui/releases/latest';
|
||||
const arch = asset.os === 'macos' ? downloadStore.macArch : asset.arch;
|
||||
return resolve(asset.os, arch)?.url || asset.url;
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
@ -31,7 +50,7 @@ const { baseURL } = useRuntimeConfig().app;
|
|||
<v-btn
|
||||
variant="flat"
|
||||
size="large"
|
||||
href="https://github.com/777genius/claude_agent_teams_ui/releases/latest"
|
||||
:href="heroDownloadUrl"
|
||||
target="_blank"
|
||||
class="hero-section__btn-primary"
|
||||
>
|
||||
|
|
@ -40,13 +59,18 @@ const { baseURL } = useRuntimeConfig().app;
|
|||
<v-btn
|
||||
variant="outlined"
|
||||
size="large"
|
||||
href="#features"
|
||||
href="#comparison"
|
||||
class="hero-section__btn-secondary"
|
||||
>
|
||||
{{ t('hero.ctaSecondary') }}
|
||||
</v-btn>
|
||||
</div>
|
||||
|
||||
<!-- Release version badge -->
|
||||
<div v-if="releaseVersion" class="hero-section__release-badge">
|
||||
v{{ releaseVersion }}<template v-if="releaseDate"> · {{ releaseDate }}</template>
|
||||
</div>
|
||||
|
||||
<!-- Trust indicators -->
|
||||
<div class="hero-section__trust">
|
||||
<div class="hero-section__trust-item">
|
||||
|
|
@ -71,7 +95,12 @@ const { baseURL } = useRuntimeConfig().app;
|
|||
<div class="hero-section__preview">
|
||||
<div class="hero-section__preview-glow" />
|
||||
<ClientOnly>
|
||||
<HeroDemoVideo />
|
||||
<Suspense>
|
||||
<LazyHeroDemoVideo />
|
||||
<template #fallback>
|
||||
<div class="hero-demo-fallback" />
|
||||
</template>
|
||||
</Suspense>
|
||||
<template #fallback>
|
||||
<div class="hero-demo-fallback" />
|
||||
</template>
|
||||
|
|
@ -149,11 +178,23 @@ const { baseURL } = useRuntimeConfig().app;
|
|||
display: flex;
|
||||
gap: 14px;
|
||||
flex-wrap: wrap;
|
||||
margin-bottom: 40px;
|
||||
margin-bottom: 16px;
|
||||
animation: heroFadeIn 0.8s ease both;
|
||||
animation-delay: 0.4s;
|
||||
}
|
||||
|
||||
/* ─── Release badge ─── */
|
||||
.hero-section__release-badge {
|
||||
font-size: 0.78rem;
|
||||
font-weight: 500;
|
||||
color: #8892b0;
|
||||
opacity: 0.7;
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
margin-bottom: 24px;
|
||||
animation: heroFadeIn 0.8s ease both;
|
||||
animation-delay: 0.45s;
|
||||
}
|
||||
|
||||
.hero-section__btn-primary {
|
||||
background: linear-gradient(135deg, #00f0ff, #ff00ff) !important;
|
||||
color: #0a0a0f !important;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
import { ref, onMounted, onUnmounted, watch } from 'vue';
|
||||
import { register } from 'swiper/element/bundle';
|
||||
import { mdiChevronLeft, mdiChevronRight, mdiClose, mdiArrowExpand } from '@mdi/js';
|
||||
import { screenshots as screenshotData } from '~/data/screenshots';
|
||||
|
||||
const { t } = useI18n();
|
||||
const { baseURL } = useRuntimeConfig().app;
|
||||
|
|
@ -10,17 +11,12 @@ register();
|
|||
|
||||
const publicPath = (path: string) => `${baseURL}${path.replace(/^\//, '')}`;
|
||||
|
||||
const screenshots = [
|
||||
{ src: publicPath('/screenshots/1.jpg'), alt: 'Kanban board with agent tasks' },
|
||||
{ src: publicPath('/screenshots/2.jpg'), alt: 'Agent team communication' },
|
||||
{ src: publicPath('/screenshots/3.png'), alt: 'Code review diff view' },
|
||||
{ src: publicPath('/screenshots/4.png'), alt: 'Team management dashboard' },
|
||||
{ src: publicPath('/screenshots/5.png'), alt: 'Live process monitoring' },
|
||||
{ src: publicPath('/screenshots/6.png'), alt: 'Session context analysis' },
|
||||
{ src: publicPath('/screenshots/7.png'), alt: 'Cross-team messaging' },
|
||||
{ src: publicPath('/screenshots/8.png'), alt: 'Task details and comments' },
|
||||
{ src: publicPath('/screenshots/9.png'), alt: 'Built-in code editor' },
|
||||
];
|
||||
const screenshots = screenshotData.map((s) => ({
|
||||
src: publicPath(s.path),
|
||||
alt: s.alt,
|
||||
width: s.width,
|
||||
height: s.height,
|
||||
}));
|
||||
|
||||
const swiperRef = ref<HTMLElement | null>(null);
|
||||
const swiperReady = ref(false);
|
||||
|
|
@ -160,8 +156,11 @@ function slideNext() {
|
|||
<img
|
||||
:src="shot.src"
|
||||
:alt="shot.alt"
|
||||
:width="shot.width"
|
||||
:height="shot.height"
|
||||
class="screenshots-section__img"
|
||||
loading="lazy"
|
||||
decoding="async"
|
||||
/>
|
||||
<div class="screenshots-section__card-overlay">
|
||||
<v-icon :icon="mdiArrowExpand" size="24" />
|
||||
|
|
@ -208,6 +207,7 @@ function slideNext() {
|
|||
:src="screenshots[lightboxIndex].src"
|
||||
:alt="screenshots[lightboxIndex].alt"
|
||||
class="screenshots-lightbox__img"
|
||||
decoding="async"
|
||||
/>
|
||||
<div class="screenshots-lightbox__counter">
|
||||
{{ lightboxIndex + 1 }} / {{ screenshots.length }}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ const items = computed(() =>
|
|||
if (!contentItem) return null;
|
||||
return { ...contentItem, avatar: entry.avatar };
|
||||
})
|
||||
.filter(Boolean)
|
||||
.filter((item): item is NonNullable<typeof item> => item !== null)
|
||||
);
|
||||
|
||||
const visibleItems = computed(() => {
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import { useLocaleStore } from "~/stores/locale";
|
|||
|
||||
export const useLocation = () => {
|
||||
const nuxtApp = useNuxtApp();
|
||||
const i18n = nuxtApp.$i18n;
|
||||
const i18n = nuxtApp.$i18n as { locale?: { value: string }; setLocale?: (code: string) => void } | undefined;
|
||||
const localeStore = useLocaleStore();
|
||||
const cookie = useCookie("i18n_redirected", { default: () => "" });
|
||||
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ export const usePageSeo = (titleKey: string, descriptionKey: string, options: Pa
|
|||
ogSiteName: siteName,
|
||||
ogUrl: canonicalUrl,
|
||||
ogImage: resolvedImageUrl,
|
||||
ogImageType: computed(() => resolvedImage.value.type),
|
||||
ogImageType: computed(() => resolvedImage.value.type) as any,
|
||||
ogImageWidth: computed(() => (resolvedImage.value.width ? String(resolvedImage.value.width) : undefined)),
|
||||
ogImageHeight: computed(() => (resolvedImage.value.height ? String(resolvedImage.value.height) : undefined)),
|
||||
ogImageAlt: computed(() => resolvedImage.value.alt),
|
||||
|
|
@ -72,7 +72,7 @@ export const usePageSeo = (titleKey: string, descriptionKey: string, options: Pa
|
|||
});
|
||||
|
||||
useHead(() => {
|
||||
const links = supportedLocales.map((locale) => {
|
||||
const links: { rel: string; hreflang?: string; href: string }[] = supportedLocales.map((locale) => {
|
||||
const path = switchLocale(locale.code) || canonicalPath.value;
|
||||
return {
|
||||
rel: "alternate",
|
||||
|
|
|
|||
102
landing/content/de.json
Normal file
102
landing/content/de.json
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
{
|
||||
"hero": {
|
||||
"title": "Claude Agent Teams",
|
||||
"subtitle": "Sie sind der CTO, Agenten sind Ihr Team. Sie erledigen Aufgaben, kommunizieren untereinander, reviewen Code. Sie schauen aufs Kanban-Board und trinken Kaffee."
|
||||
},
|
||||
"features": [
|
||||
{
|
||||
"id": "agentTeams",
|
||||
"title": "Agenten-Teams",
|
||||
"description": "Erstellen Sie Teams mit verschiedenen Rollen. Agenten arbeiten parallel und autonom, kommunizieren untereinander und kollaborieren teamübergreifend."
|
||||
},
|
||||
{
|
||||
"id": "kanban",
|
||||
"title": "Kanban-Board",
|
||||
"description": "Aufgabenstatus ändern sich in Echtzeit. Ziehen, zuweisen, reviewen — alles auf einem visuellen Board."
|
||||
},
|
||||
{
|
||||
"id": "codeReview",
|
||||
"title": "Code-Review",
|
||||
"description": "Diff-Ansicht pro Aufgabe mit Annehmen, Ablehnen und Kommentieren. Integrierter Code-Editor mit Git-Unterstützung."
|
||||
},
|
||||
{
|
||||
"id": "crossTeam",
|
||||
"title": "Teamübergreifende Kommunikation",
|
||||
"description": "Agenten kommunizieren inner- und teamübergreifend. Direktnachrichten, Aufgabenkommentare und Schnellaktionen."
|
||||
},
|
||||
{
|
||||
"id": "soloMode",
|
||||
"title": "Solo-Modus",
|
||||
"description": "Starten Sie mit einem einzelnen Agenten, der seine Aufgaben selbst verwaltet. Erweitern Sie jederzeit zum vollständigen Team."
|
||||
},
|
||||
{
|
||||
"id": "liveProcesses",
|
||||
"title": "Live-Prozesse",
|
||||
"description": "Sehen Sie laufende Agenten, öffnen Sie URLs im Browser, überwachen Sie Token-Nutzung und Sitzungskontext in Echtzeit."
|
||||
}
|
||||
],
|
||||
"faq": [
|
||||
{
|
||||
"id": "whatIsIt",
|
||||
"question": "Was ist Claude Agent Teams?",
|
||||
"answer": "Eine Desktop-App, mit der Sie KI-Agenten-Teams mit Claude Code zusammenstellen können. Jeder Agent hat eine Rolle, arbeitet autonom und kollaboriert mit Teammitgliedern — alles über ein Kanban-Board verwaltet."
|
||||
},
|
||||
{
|
||||
"id": "isFree",
|
||||
"question": "Ist es wirklich kostenlos?",
|
||||
"answer": "Ja. Die App ist 100% kostenlos und Open Source. Sie brauchen nur ein Claude-Abo (Max oder Pro) — das war's. Claude Code wird automatisch installiert und eingerichtet."
|
||||
},
|
||||
{
|
||||
"id": "platforms",
|
||||
"question": "Welche Plattformen werden unterstützt?",
|
||||
"answer": "macOS (Apple Silicon und Intel), Windows und Linux."
|
||||
},
|
||||
{
|
||||
"id": "howItWorks",
|
||||
"question": "Wie funktioniert es?",
|
||||
"answer": "App installieren, Team erstellen, Rollen zuweisen — Agenten beginnen parallel zu arbeiten. Sie verfolgen den Fortschritt am Kanban-Board, reviewen Code-Diffs und kommunizieren direkt mit Agenten."
|
||||
},
|
||||
{
|
||||
"id": "privacy",
|
||||
"question": "Ist mein Code sicher?",
|
||||
"answer": "Alles läuft lokal auf Ihrem Rechner. Keine Daten werden an externe Server gesendet. Ihr Code, Gespräche und Agentenaktivität bleiben vollständig privat."
|
||||
},
|
||||
{
|
||||
"id": "requirements",
|
||||
"question": "Was brauche ich zum Start?",
|
||||
"answer": "Einfach die App installieren — Claude Code Installation und Authentifizierung sind integriert. Zero-Setup-Onboarding bringt Sie in Minuten zum Laufen."
|
||||
}
|
||||
],
|
||||
"download": {
|
||||
"title": "Herunterladen",
|
||||
"note": "Wählen Sie Ihre Plattform und starten Sie mit KI-Agenten-Teams."
|
||||
},
|
||||
"testimonials": [
|
||||
{ "id": "user1", "name": "Alex K.", "role": "Tech Lead", "text": "Endlich ein Tool, das KI-Agenten wie ein Engineering-Team verwaltet. Das Kanban-Board ist ein Game-Changer für parallele Arbeit." },
|
||||
{ "id": "user2", "name": "Sarah M.", "role": "Full-Stack-Entwicklerin", "text": "Solo-Modus ist perfekt für schnelle Aufgaben. Bei Bedarf starte ich in Sekunden ein vollständiges Team. Teamübergreifende Kommunikation funktioniert einfach." },
|
||||
{ "id": "user3", "name": "David R.", "role": "Senior Engineer", "text": "Der Code-Review-Workflow ist brillant — Diff-Ansicht pro Aufgabe, Annehmen/Ablehnen, Kommentare. Wie ein Team, das tatsächlich Anweisungen befolgt." },
|
||||
{ "id": "user4", "name": "Yuki T.", "role": "DevOps Engineer", "text": "Live-Prozessüberwachung und Kontext-Tracking sind unglaublich nützlich. Ich sehe genau, was jeder Agent tut." },
|
||||
{ "id": "user5", "name": "Maria S.", "role": "Indie-Entwicklerin", "text": "Zero-Setup-Onboarding ist echt — App installiert, einmal authentifiziert, und in 5 Minuten arbeiteten Agenten an meinem Code." },
|
||||
{ "id": "user6", "name": "Chris L.", "role": "Startup-CTO", "text": "Hat mein Prototyping komplett verändert. Teams für verschiedene Stack-Teile aufsetzen und parallel arbeiten lassen. 10x Produktivitätssteigerung." }
|
||||
],
|
||||
"pricing": [
|
||||
{
|
||||
"id": "free",
|
||||
"name": "Für immer kostenlos",
|
||||
"price": "0€",
|
||||
"period": "für immer",
|
||||
"description": "Alles inklusive. Keine Limits, keine API-Schlüssel, keine Kreditkarte.",
|
||||
"features": [
|
||||
"Unbegrenzte Agenten-Teams",
|
||||
"Kanban-Board mit Echtzeit-Updates",
|
||||
"Code-Review mit Diff-Ansicht",
|
||||
"Teamübergreifende Kommunikation",
|
||||
"Solo- und Team-Modi",
|
||||
"Live-Prozessüberwachung",
|
||||
"Integrierter Code-Editor",
|
||||
"MCP-Integration"
|
||||
],
|
||||
"highlighted": true
|
||||
}
|
||||
]
|
||||
}
|
||||
102
landing/content/fr.json
Normal file
102
landing/content/fr.json
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
{
|
||||
"hero": {
|
||||
"title": "Claude Agent Teams",
|
||||
"subtitle": "Vous êtes le CTO, les agents sont votre équipe. Ils gèrent les tâches, communiquent entre eux, révisent le code. Vous regardez le kanban et buvez votre café."
|
||||
},
|
||||
"features": [
|
||||
{
|
||||
"id": "agentTeams",
|
||||
"title": "Équipes d'agents",
|
||||
"description": "Créez des équipes avec différents rôles. Les agents travaillent en parallèle de manière autonome, communiquent entre eux et collaborent entre équipes."
|
||||
},
|
||||
{
|
||||
"id": "kanban",
|
||||
"title": "Tableau Kanban",
|
||||
"description": "Les tâches changent de statut en temps réel. Glissez, assignez, révisez — tout sur un tableau visuel."
|
||||
},
|
||||
{
|
||||
"id": "codeReview",
|
||||
"title": "Revue de code",
|
||||
"description": "Vue diff par tâche avec acceptation, rejet et commentaires. Éditeur de code intégré avec support Git."
|
||||
},
|
||||
{
|
||||
"id": "crossTeam",
|
||||
"title": "Communication inter-équipes",
|
||||
"description": "Les agents communiquent entre eux au sein et entre les équipes. Messages directs, commentaires sur les tâches et actions rapides."
|
||||
},
|
||||
{
|
||||
"id": "soloMode",
|
||||
"title": "Mode solo",
|
||||
"description": "Commencez avec un seul agent qui gère ses tâches. Passez à une équipe complète quand vous avez besoin de plus de puissance."
|
||||
},
|
||||
{
|
||||
"id": "liveProcesses",
|
||||
"title": "Processus en direct",
|
||||
"description": "Visualisez les agents en cours, ouvrez les URL dans le navigateur, surveillez l'utilisation des tokens et le contexte en temps réel."
|
||||
}
|
||||
],
|
||||
"faq": [
|
||||
{
|
||||
"id": "whatIsIt",
|
||||
"question": "Qu'est-ce que Claude Agent Teams ?",
|
||||
"answer": "Une application de bureau qui vous permet d'assembler des équipes d'agents IA propulsés par Claude Code. Chaque agent a un rôle, travaille de manière autonome et collabore avec ses coéquipiers — le tout géré via un tableau kanban."
|
||||
},
|
||||
{
|
||||
"id": "isFree",
|
||||
"question": "C'est vraiment gratuit ?",
|
||||
"answer": "Oui. L'application est 100% gratuite et open source. Vous avez juste besoin d'un abonnement Claude (Max ou Pro) — c'est tout. Claude Code est installé et configuré automatiquement, sans terminal."
|
||||
},
|
||||
{
|
||||
"id": "platforms",
|
||||
"question": "Quelles plateformes sont supportées ?",
|
||||
"answer": "macOS (Apple Silicon et Intel), Windows et Linux."
|
||||
},
|
||||
{
|
||||
"id": "howItWorks",
|
||||
"question": "Comment ça marche ?",
|
||||
"answer": "Installez l'application, créez une équipe, assignez des rôles — les agents commencent à travailler en parallèle. Vous suivez la progression sur le kanban, révisez le code et communiquez directement avec les agents."
|
||||
},
|
||||
{
|
||||
"id": "privacy",
|
||||
"question": "Mon code est-il privé ?",
|
||||
"answer": "Tout fonctionne localement sur votre machine. Aucune donnée n'est envoyée à des serveurs externes. Votre code, vos conversations et l'activité des agents restent entièrement privés."
|
||||
},
|
||||
{
|
||||
"id": "requirements",
|
||||
"question": "De quoi ai-je besoin pour commencer ?",
|
||||
"answer": "Installez simplement l'application — elle inclut l'installation et l'authentification intégrées de Claude Code. L'onboarding zéro-configuration vous fait démarrer en quelques minutes."
|
||||
}
|
||||
],
|
||||
"download": {
|
||||
"title": "Télécharger",
|
||||
"note": "Choisissez votre plateforme et commencez à travailler avec des équipes d'agents IA."
|
||||
},
|
||||
"testimonials": [
|
||||
{ "id": "user1", "name": "Alex K.", "role": "Tech Lead", "text": "Enfin un outil qui me permet de gérer les agents IA comme mon équipe d'ingénieurs. Le kanban est un game-changer pour suivre le travail parallèle." },
|
||||
{ "id": "user2", "name": "Sarah M.", "role": "Développeuse full-stack", "text": "Le mode solo est parfait pour les tâches rapides. Quand j'ai besoin de plus, je lance une équipe complète en quelques secondes." },
|
||||
{ "id": "user3", "name": "David R.", "role": "Ingénieur senior", "text": "Le workflow de revue de code est brillant — vue diff par tâche, accepter/rejeter, commentaires. Comme avoir une équipe qui suit vraiment les instructions." },
|
||||
{ "id": "user4", "name": "Yuki T.", "role": "Ingénieur DevOps", "text": "La surveillance des processus et le suivi du contexte sont incroyablement utiles. Je vois exactement ce que chaque agent fait." },
|
||||
{ "id": "user5", "name": "Maria S.", "role": "Développeuse indépendante", "text": "L'onboarding zéro-configuration est réel — installé, authentifié une fois, et les agents travaillaient sur mon code en 5 minutes." },
|
||||
{ "id": "user6", "name": "Chris L.", "role": "CTO de startup", "text": "Ça a complètement changé ma façon de prototyper. Je configure des équipes pour différentes parties du stack et les laisse travailler en parallèle." }
|
||||
],
|
||||
"pricing": [
|
||||
{
|
||||
"id": "free",
|
||||
"name": "Gratuit pour toujours",
|
||||
"price": "0€",
|
||||
"period": "pour toujours",
|
||||
"description": "Tout inclus. Sans limites, sans clés API, sans carte bancaire.",
|
||||
"features": [
|
||||
"Équipes d'agents illimitées",
|
||||
"Kanban avec mises à jour en temps réel",
|
||||
"Revue de code avec vue diff",
|
||||
"Communication inter-équipes",
|
||||
"Modes solo et équipe",
|
||||
"Surveillance des processus en direct",
|
||||
"Éditeur de code intégré",
|
||||
"Intégration MCP"
|
||||
],
|
||||
"highlighted": true
|
||||
}
|
||||
]
|
||||
}
|
||||
102
landing/content/ja.json
Normal file
102
landing/content/ja.json
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
{
|
||||
"hero": {
|
||||
"title": "Claude Agent Teams",
|
||||
"subtitle": "あなたはCTO、エージェントはあなたのチーム。タスクを自分で処理し、互いにメッセージを送り、コードをレビューする。あなたはカンバンボードを見ながらコーヒーを飲むだけ。"
|
||||
},
|
||||
"features": [
|
||||
{
|
||||
"id": "agentTeams",
|
||||
"title": "エージェントチーム",
|
||||
"description": "異なる役割のチームを作成。エージェントは並行して自律的に作業し、互いにコミュニケーションし、チーム間で連携します。"
|
||||
},
|
||||
{
|
||||
"id": "kanban",
|
||||
"title": "カンバンボード",
|
||||
"description": "エージェントの作業に合わせてタスクのステータスがリアルタイムで変化。ドラッグ、割り当て、レビュー — すべてビジュアルボード上で。"
|
||||
},
|
||||
{
|
||||
"id": "codeReview",
|
||||
"title": "コードレビュー",
|
||||
"description": "タスクごとのDiffビューで承認、却下、コメント。Git対応の組み込みコードエディタ。"
|
||||
},
|
||||
{
|
||||
"id": "crossTeam",
|
||||
"title": "チーム間コミュニケーション",
|
||||
"description": "エージェントはチーム内・チーム間でメッセージを送り合います。ダイレクトメッセージ、タスクコメント、クイックアクション。"
|
||||
},
|
||||
{
|
||||
"id": "soloMode",
|
||||
"title": "ソロモード",
|
||||
"description": "タスクを自己管理する単一エージェントから開始。より多くのパワーが必要な時にフルチームに拡張。"
|
||||
},
|
||||
{
|
||||
"id": "liveProcesses",
|
||||
"title": "ライブプロセス",
|
||||
"description": "実行中のエージェントを確認、ブラウザでURLを開き、トークン使用量とセッションコンテキストをリアルタイムで監視。"
|
||||
}
|
||||
],
|
||||
"faq": [
|
||||
{
|
||||
"id": "whatIsIt",
|
||||
"question": "Claude Agent Teamsとは?",
|
||||
"answer": "Claude Codeを活用したAIエージェントチームを編成できるデスクトップアプリです。各エージェントは役割を持ち、自律的に作業し、チームメイトと連携します — すべてカンバンボードで管理。"
|
||||
},
|
||||
{
|
||||
"id": "isFree",
|
||||
"question": "本当に無料ですか?",
|
||||
"answer": "はい。アプリは100%無料でオープンソースです。Claudeサブスクリプション(MaxまたはProプラン)があればOK。Claude Codeは自動でインストール・セットアップされます。"
|
||||
},
|
||||
{
|
||||
"id": "platforms",
|
||||
"question": "対応プラットフォームは?",
|
||||
"answer": "macOS(Apple SiliconおよびIntel)、Windows、Linux。"
|
||||
},
|
||||
{
|
||||
"id": "howItWorks",
|
||||
"question": "どのように動作しますか?",
|
||||
"answer": "アプリをインストールし、チームを作成、役割を割り当て — エージェントが並行して作業を開始します。カンバンボードで進捗を監視し、コードDiffをレビューし、エージェントと直接コミュニケーション。"
|
||||
},
|
||||
{
|
||||
"id": "privacy",
|
||||
"question": "コードは安全ですか?",
|
||||
"answer": "すべてローカルマシン上で動作します。外部サーバーにデータは送信されません。コード、会話、エージェントの活動は完全にプライベートです。"
|
||||
},
|
||||
{
|
||||
"id": "requirements",
|
||||
"question": "始めるには何が必要ですか?",
|
||||
"answer": "アプリをインストールするだけ — Claude Codeのインストールと認証が組み込まれています。ゼロ設定のオンボーディングで数分で開始できます。"
|
||||
}
|
||||
],
|
||||
"download": {
|
||||
"title": "ダウンロード",
|
||||
"note": "プラットフォームを選んで、AIエージェントチームで開発を始めましょう。"
|
||||
},
|
||||
"testimonials": [
|
||||
{ "id": "user1", "name": "Alex K.", "role": "テックリード", "text": "ついにAIエージェントをエンジニアリングチームのように管理できるツールが登場。カンバンボードは並行作業の追跡に革命的。" },
|
||||
{ "id": "user2", "name": "Sarah M.", "role": "フルスタック開発者", "text": "ソロモードは素早いタスクに最適。パワーが必要な時は数秒でフルチームを起動。チーム間通信もスムーズ。" },
|
||||
{ "id": "user3", "name": "David R.", "role": "シニアエンジニア", "text": "コードレビューのワークフローが素晴らしい — タスクごとのDiffビュー、承認/却下、コメント。指示に従うジュニアチームのよう。" },
|
||||
{ "id": "user4", "name": "Yuki T.", "role": "DevOpsエンジニア", "text": "ライブプロセス監視とコンテキスト追跡が非常に便利。各エージェントの動作とコンテキスト使用量が一目瞭然。" },
|
||||
{ "id": "user5", "name": "Maria S.", "role": "個人開発者", "text": "ゼロセットアップは本物 — インストールして認証して5分でエージェントが動いていた。APIキーも設定ファイルも不要。" },
|
||||
{ "id": "user6", "name": "Chris L.", "role": "スタートアップCTO", "text": "プロトタイピングが完全に変わった。スタックの各部分にチームを配置して並行作業。本当に10倍の生産性向上。" }
|
||||
],
|
||||
"pricing": [
|
||||
{
|
||||
"id": "free",
|
||||
"name": "永久無料",
|
||||
"price": "¥0",
|
||||
"period": "永久",
|
||||
"description": "すべて含まれています。制限なし、APIキー不要、クレジットカード不要。",
|
||||
"features": [
|
||||
"無制限のエージェントチーム",
|
||||
"リアルタイム更新のカンバンボード",
|
||||
"Diffビュー付きコードレビュー",
|
||||
"チーム間コミュニケーション",
|
||||
"ソロ&チームモード",
|
||||
"ライブプロセス監視",
|
||||
"組み込みコードエディタ",
|
||||
"MCP統合"
|
||||
],
|
||||
"highlighted": true
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -5,6 +5,9 @@ import es from "~/content/es.json";
|
|||
import hi from "~/content/hi.json";
|
||||
import ar from "~/content/ar.json";
|
||||
import pt from "~/content/pt.json";
|
||||
import fr from "~/content/fr.json";
|
||||
import ja from "~/content/ja.json";
|
||||
import de from "~/content/de.json";
|
||||
import type { LandingContent, LocalizedContent } from "~/types/content";
|
||||
import type { LocaleCode } from "~/data/i18n";
|
||||
|
||||
|
|
@ -15,7 +18,10 @@ export const contentByLocale: LocalizedContent = {
|
|||
es,
|
||||
hi,
|
||||
ar,
|
||||
pt
|
||||
pt,
|
||||
fr,
|
||||
ja,
|
||||
de
|
||||
};
|
||||
|
||||
export const getContent = (locale: LocaleCode): LandingContent => {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
export type LocaleCode = "en" | "ru" | "zh" | "es" | "hi" | "ar" | "pt";
|
||||
export type LocaleCode = "en" | "ru" | "zh" | "es" | "hi" | "ar" | "pt" | "fr" | "ja" | "de";
|
||||
|
||||
export const supportedLocales = [
|
||||
{ code: "en", iso: "en-US", name: "English", flag: "\u{1F1FA}\u{1F1F8}", file: "en.json" },
|
||||
|
|
@ -7,6 +7,9 @@ export const supportedLocales = [
|
|||
{ code: "hi", iso: "hi-IN", name: "हिन्दी", flag: "\u{1F1EE}\u{1F1F3}", file: "hi.json" },
|
||||
{ code: "ar", iso: "ar-SA", name: "العربية", flag: "\u{1F1F8}\u{1F1E6}", file: "ar.json", dir: "rtl" },
|
||||
{ code: "pt", iso: "pt-BR", name: "Português", flag: "\u{1F1E7}\u{1F1F7}", file: "pt.json" },
|
||||
{ code: "fr", iso: "fr-FR", name: "Français", flag: "\u{1F1EB}\u{1F1F7}", file: "fr.json" },
|
||||
{ code: "ja", iso: "ja-JP", name: "日本語", flag: "\u{1F1EF}\u{1F1F5}", file: "ja.json" },
|
||||
{ code: "de", iso: "de-DE", name: "Deutsch", flag: "\u{1F1E9}\u{1F1EA}", file: "de.json" },
|
||||
{ code: "ru", iso: "ru-RU", name: "Русский", flag: "\u{1F1F7}\u{1F1FA}", file: "ru.json" }
|
||||
] as const;
|
||||
|
||||
|
|
|
|||
22
landing/data/screenshots.ts
Normal file
22
landing/data/screenshots.ts
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
export type Screenshot = {
|
||||
src: string;
|
||||
alt: string;
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
|
||||
/**
|
||||
* Screenshot definitions for the carousel.
|
||||
* `src` is relative to public/ — prepend baseURL at runtime.
|
||||
*/
|
||||
export const screenshots: (Omit<Screenshot, "src"> & { path: string })[] = [
|
||||
{ path: "screenshots/1.jpg", alt: "Kanban board with agent tasks", width: 1920, height: 1080 },
|
||||
{ path: "screenshots/2.jpg", alt: "Agent team communication", width: 1920, height: 1080 },
|
||||
{ path: "screenshots/3.png", alt: "Code review diff view", width: 1920, height: 1080 },
|
||||
{ path: "screenshots/4.png", alt: "Team management dashboard", width: 1920, height: 1080 },
|
||||
{ path: "screenshots/5.png", alt: "Live process monitoring", width: 1920, height: 1080 },
|
||||
{ path: "screenshots/6.png", alt: "Session context analysis", width: 1920, height: 1080 },
|
||||
{ path: "screenshots/7.png", alt: "Cross-team messaging", width: 1920, height: 1080 },
|
||||
{ path: "screenshots/8.png", alt: "Task details and comments", width: 1920, height: 1080 },
|
||||
{ path: "screenshots/9.png", alt: "Built-in code editor", width: 1920, height: 1080 },
|
||||
];
|
||||
|
|
@ -12,7 +12,7 @@
|
|||
"badge": "Claude Agent Teams",
|
||||
"downloadNow": "حمّل الآن",
|
||||
"ctaPrimary": "تحميل لـ {platform}",
|
||||
"ctaSecondary": "عرض المميزات",
|
||||
"ctaSecondary": "مقارنة",
|
||||
"preview": "معاينة المنتج",
|
||||
"trust": {
|
||||
"agentTeams": "فرق الوكلاء",
|
||||
|
|
@ -33,7 +33,8 @@
|
|||
"light": "فاتح"
|
||||
},
|
||||
"language": {
|
||||
"label": "اللغة"
|
||||
"label": "اللغة",
|
||||
"search": "ابحث عن لغة…"
|
||||
},
|
||||
"features": {
|
||||
"sectionTitle": "كل ما تحتاجه لتنسيق وكلاء الذكاء الاصطناعي",
|
||||
|
|
|
|||
113
landing/locales/de.json
Normal file
113
landing/locales/de.json
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
{
|
||||
"nav": {
|
||||
"features": "Funktionen",
|
||||
"screenshots": "Screenshots",
|
||||
"comparison": "Vergleich",
|
||||
"download": "Download",
|
||||
"pricing": "Kostenlos",
|
||||
"faq": "FAQ",
|
||||
"viewOnGithub": "View on GitHub"
|
||||
},
|
||||
"hero": {
|
||||
"badge": "Claude Agent Teams",
|
||||
"downloadNow": "Herunterladen",
|
||||
"ctaPrimary": "Für {platform} herunterladen",
|
||||
"ctaSecondary": "Vergleichen",
|
||||
"preview": "Produktvorschau",
|
||||
"trust": {
|
||||
"agentTeams": "Agenten-Teams",
|
||||
"kanban": "Kanban-Board",
|
||||
"openSource": "Open Source"
|
||||
},
|
||||
"watchDemo": "Demo ansehen",
|
||||
"videoUnavailable": "Video nicht verfügbar"
|
||||
},
|
||||
"download": {
|
||||
"title": "Herunterladen",
|
||||
"detected": "Erkannt",
|
||||
"systemRequirements": "Systemanforderungen",
|
||||
"version": "Version {version}"
|
||||
},
|
||||
"theme": {
|
||||
"dark": "Dunkel",
|
||||
"light": "Hell"
|
||||
},
|
||||
"language": {
|
||||
"label": "Sprache",
|
||||
"search": "Sprache suchen…"
|
||||
},
|
||||
"features": {
|
||||
"sectionTitle": "Alles für die KI-Agenten-Orchestrierung",
|
||||
"sectionSubtitle": "Leistungsstarke Tools für effektive Multi-Agenten-Zusammenarbeit."
|
||||
},
|
||||
"pricing": {
|
||||
"sectionTitle": "100% Kostenlos. Ohne Haken.",
|
||||
"sectionSubtitle": "Open Source, keine API-Schlüssel, keine Konfiguration. Einfach installieren und loslegen.",
|
||||
"getStarted": "Herunterladen",
|
||||
"popular": "Für immer kostenlos",
|
||||
"note": "100% Open Source. Keine API-Schlüssel. Keine Konfiguration. Läuft vollständig lokal."
|
||||
},
|
||||
"testimonials": {
|
||||
"sectionTitle": "Was Entwickler sagen",
|
||||
"sectionSubtitle": "Echtes Feedback von echten Entwicklern",
|
||||
"showMore": "Mehr anzeigen",
|
||||
"showLess": "Weniger anzeigen",
|
||||
"feedbackCta": "Möchten Sie Ihre Erfahrung teilen? Erstellen Sie ein Issue auf"
|
||||
},
|
||||
"faq": {
|
||||
"sectionTitle": "Fragen? Wir haben Antworten",
|
||||
"subtitle": "Alles, was Sie über Claude Agent Teams wissen müssen"
|
||||
},
|
||||
"comparison": {
|
||||
"sectionTitle": "Wie wir im Vergleich abschneiden",
|
||||
"sectionSubtitle": "Funktionsvergleich mit anderen KI-Coding-Tools.",
|
||||
"feature": "Funktion",
|
||||
"features": {
|
||||
"crossTeam": "Teamübergreifende Kommunikation",
|
||||
"agentMessaging": "Agent-zu-Agent-Messaging",
|
||||
"linkedTasks": "Verknüpfte Aufgaben",
|
||||
"sessionAnalysis": "Sitzungsanalyse",
|
||||
"taskAttachments": "Aufgabenanhänge",
|
||||
"hunkReview": "Hunk-Level-Review",
|
||||
"codeEditor": "Integrierter Code-Editor",
|
||||
"fullAutonomy": "Volle Autonomie",
|
||||
"taskDeps": "Aufgabenabhängigkeiten",
|
||||
"reviewWorkflow": "Review-Workflow",
|
||||
"zeroSetup": "Keine Einrichtung",
|
||||
"kanban": "Kanban-Board",
|
||||
"execLog": "Ausführungsprotokoll",
|
||||
"liveProcesses": "Live-Prozesse",
|
||||
"perTaskReview": "Code-Review pro Aufgabe",
|
||||
"flexAutonomy": "Flexible Autonomie",
|
||||
"worktree": "Git-Worktree-Isolation",
|
||||
"multiAgent": "Multi-Agenten-Backend",
|
||||
"price": "Preis"
|
||||
}
|
||||
},
|
||||
"screenshots": {
|
||||
"sectionTitle": "In Aktion sehen",
|
||||
"sectionSubtitle": "Echte Screenshots der App — Kanban-Board, Code-Review, Agenten-Teams und mehr."
|
||||
},
|
||||
"common": {
|
||||
"learnMore": "Mehr erfahren"
|
||||
},
|
||||
"footer": {
|
||||
"copyright": "© {year} Claude Agent Teams",
|
||||
"tagline": "KI-Agenten-Orchestrierung für Entwickler",
|
||||
"links": {
|
||||
"github": "GitHub",
|
||||
"docs": "Dokumentation"
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"homeTitle": "Claude Agent Teams — KI-Agenten-Orchestrierung für Entwickler",
|
||||
"homeDescription": "Kostenlose Open-Source-Desktop-App für KI-Agenten-Teams. Kanban-Board, Code-Review, teamübergreifende Kommunikation. Läuft vollständig lokal."
|
||||
},
|
||||
"error": {
|
||||
"notFoundTitle": "Seite nicht gefunden",
|
||||
"notFoundDescription": "Die gesuchte Seite existiert nicht oder wurde verschoben.",
|
||||
"genericTitle": "Etwas ist schiefgelaufen",
|
||||
"genericDescription": "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es später erneut.",
|
||||
"goHome": "Zur Startseite"
|
||||
}
|
||||
}
|
||||
|
|
@ -12,7 +12,7 @@
|
|||
"badge": "Claude Agent Teams",
|
||||
"downloadNow": "Download Now",
|
||||
"ctaPrimary": "Download for {platform}",
|
||||
"ctaSecondary": "View Features",
|
||||
"ctaSecondary": "Compare",
|
||||
"preview": "Product preview",
|
||||
"trust": {
|
||||
"agentTeams": "Agent Teams",
|
||||
|
|
@ -33,7 +33,8 @@
|
|||
"light": "Light"
|
||||
},
|
||||
"language": {
|
||||
"label": "Language"
|
||||
"label": "Language",
|
||||
"search": "Search language…"
|
||||
},
|
||||
"features": {
|
||||
"sectionTitle": "Everything you need for AI agent orchestration",
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
"badge": "Claude Agent Teams",
|
||||
"downloadNow": "Descargar ahora",
|
||||
"ctaPrimary": "Descargar para {platform}",
|
||||
"ctaSecondary": "Ver funciones",
|
||||
"ctaSecondary": "Comparar",
|
||||
"preview": "Vista previa del producto",
|
||||
"trust": {
|
||||
"agentTeams": "Equipos de agentes",
|
||||
|
|
@ -33,7 +33,8 @@
|
|||
"light": "Claro"
|
||||
},
|
||||
"language": {
|
||||
"label": "Idioma"
|
||||
"label": "Idioma",
|
||||
"search": "Buscar idioma…"
|
||||
},
|
||||
"features": {
|
||||
"sectionTitle": "Todo lo que necesitas para orquestar agentes IA",
|
||||
|
|
|
|||
113
landing/locales/fr.json
Normal file
113
landing/locales/fr.json
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
{
|
||||
"nav": {
|
||||
"features": "Fonctionnalités",
|
||||
"screenshots": "Captures d'écran",
|
||||
"comparison": "Comparer",
|
||||
"download": "Télécharger",
|
||||
"pricing": "Gratuit",
|
||||
"faq": "FAQ",
|
||||
"viewOnGithub": "View on GitHub"
|
||||
},
|
||||
"hero": {
|
||||
"badge": "Claude Agent Teams",
|
||||
"downloadNow": "Télécharger",
|
||||
"ctaPrimary": "Télécharger pour {platform}",
|
||||
"ctaSecondary": "Comparer",
|
||||
"preview": "Aperçu du produit",
|
||||
"trust": {
|
||||
"agentTeams": "Équipes d'agents",
|
||||
"kanban": "Tableau Kanban",
|
||||
"openSource": "Open Source"
|
||||
},
|
||||
"watchDemo": "Voir la démo",
|
||||
"videoUnavailable": "Vidéo indisponible"
|
||||
},
|
||||
"download": {
|
||||
"title": "Télécharger",
|
||||
"detected": "Détecté",
|
||||
"systemRequirements": "Configuration requise",
|
||||
"version": "Version {version}"
|
||||
},
|
||||
"theme": {
|
||||
"dark": "Sombre",
|
||||
"light": "Clair"
|
||||
},
|
||||
"language": {
|
||||
"label": "Langue",
|
||||
"search": "Rechercher une langue…"
|
||||
},
|
||||
"features": {
|
||||
"sectionTitle": "Tout pour l'orchestration d'agents IA",
|
||||
"sectionSubtitle": "Des outils puissants pour une collaboration multi-agents efficace."
|
||||
},
|
||||
"pricing": {
|
||||
"sectionTitle": "100% Gratuit. Sans conditions.",
|
||||
"sectionSubtitle": "Open source, sans clé API, sans configuration. Installez et c'est parti.",
|
||||
"getStarted": "Télécharger",
|
||||
"popular": "Gratuit pour toujours",
|
||||
"note": "100% open source. Sans clé API. Sans configuration. Fonctionne entièrement en local."
|
||||
},
|
||||
"testimonials": {
|
||||
"sectionTitle": "Ce que disent les développeurs",
|
||||
"sectionSubtitle": "De vrais retours de vrais développeurs",
|
||||
"showMore": "Voir plus",
|
||||
"showLess": "Réduire",
|
||||
"feedbackCta": "Vous souhaitez partager votre expérience ? Ouvrez une issue sur"
|
||||
},
|
||||
"faq": {
|
||||
"sectionTitle": "Des questions ? Nous avons les réponses",
|
||||
"subtitle": "Tout ce qu'il faut savoir sur Claude Agent Teams"
|
||||
},
|
||||
"comparison": {
|
||||
"sectionTitle": "Comment nous nous comparons",
|
||||
"sectionSubtitle": "Comparaison fonctionnalité par fonctionnalité avec d'autres outils IA.",
|
||||
"feature": "Fonctionnalité",
|
||||
"features": {
|
||||
"crossTeam": "Communication inter-équipes",
|
||||
"agentMessaging": "Messagerie entre agents",
|
||||
"linkedTasks": "Tâches liées",
|
||||
"sessionAnalysis": "Analyse de session",
|
||||
"taskAttachments": "Pièces jointes aux tâches",
|
||||
"hunkReview": "Revue par hunk",
|
||||
"codeEditor": "Éditeur de code intégré",
|
||||
"fullAutonomy": "Autonomie complète",
|
||||
"taskDeps": "Dépendances de tâches",
|
||||
"reviewWorkflow": "Flux de revue",
|
||||
"zeroSetup": "Zéro configuration",
|
||||
"kanban": "Tableau Kanban",
|
||||
"execLog": "Journal d'exécution",
|
||||
"liveProcesses": "Processus en direct",
|
||||
"perTaskReview": "Revue de code par tâche",
|
||||
"flexAutonomy": "Autonomie flexible",
|
||||
"worktree": "Isolation Git worktree",
|
||||
"multiAgent": "Backend multi-agents",
|
||||
"price": "Prix"
|
||||
}
|
||||
},
|
||||
"screenshots": {
|
||||
"sectionTitle": "Voyez-le en action",
|
||||
"sectionSubtitle": "Captures d'écran réelles — tableau kanban, revue de code, équipes d'agents et plus."
|
||||
},
|
||||
"common": {
|
||||
"learnMore": "En savoir plus"
|
||||
},
|
||||
"footer": {
|
||||
"copyright": "© {year} Claude Agent Teams",
|
||||
"tagline": "Orchestration d'agents IA pour développeurs",
|
||||
"links": {
|
||||
"github": "GitHub",
|
||||
"docs": "Documentation"
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"homeTitle": "Claude Agent Teams — Orchestration d'agents IA pour développeurs",
|
||||
"homeDescription": "Application desktop gratuite et open source pour gérer des équipes d'agents IA. Tableau kanban, revue de code, communication inter-équipes. Fonctionne entièrement en local."
|
||||
},
|
||||
"error": {
|
||||
"notFoundTitle": "Page introuvable",
|
||||
"notFoundDescription": "La page que vous recherchez n'existe pas ou a été déplacée.",
|
||||
"genericTitle": "Une erreur est survenue",
|
||||
"genericDescription": "Une erreur inattendue s'est produite. Veuillez réessayer plus tard.",
|
||||
"goHome": "Retour à l'accueil"
|
||||
}
|
||||
}
|
||||
|
|
@ -12,7 +12,7 @@
|
|||
"badge": "Claude Agent Teams",
|
||||
"downloadNow": "अभी डाउनलोड करें",
|
||||
"ctaPrimary": "{platform} के लिए डाउनलोड करें",
|
||||
"ctaSecondary": "सुविधाएँ देखें",
|
||||
"ctaSecondary": "तुलना करें",
|
||||
"preview": "प्रोडक्ट प्रीव्यू",
|
||||
"trust": {
|
||||
"agentTeams": "एजेंट टीमें",
|
||||
|
|
@ -33,7 +33,8 @@
|
|||
"light": "लाइट"
|
||||
},
|
||||
"language": {
|
||||
"label": "भाषा"
|
||||
"label": "भाषा",
|
||||
"search": "भाषा खोजें…"
|
||||
},
|
||||
"features": {
|
||||
"sectionTitle": "AI एजेंट ऑर्केस्ट्रेशन के लिए सब कुछ",
|
||||
|
|
|
|||
113
landing/locales/ja.json
Normal file
113
landing/locales/ja.json
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
{
|
||||
"nav": {
|
||||
"features": "機能",
|
||||
"screenshots": "スクリーンショット",
|
||||
"comparison": "比較",
|
||||
"download": "ダウンロード",
|
||||
"pricing": "無料",
|
||||
"faq": "FAQ",
|
||||
"viewOnGithub": "View on GitHub"
|
||||
},
|
||||
"hero": {
|
||||
"badge": "Claude Agent Teams",
|
||||
"downloadNow": "ダウンロード",
|
||||
"ctaPrimary": "{platform}版をダウンロード",
|
||||
"ctaSecondary": "比較する",
|
||||
"preview": "製品プレビュー",
|
||||
"trust": {
|
||||
"agentTeams": "エージェントチーム",
|
||||
"kanban": "カンバンボード",
|
||||
"openSource": "オープンソース"
|
||||
},
|
||||
"watchDemo": "デモを見る",
|
||||
"videoUnavailable": "動画は利用できません"
|
||||
},
|
||||
"download": {
|
||||
"title": "ダウンロード",
|
||||
"detected": "検出済み",
|
||||
"systemRequirements": "動作環境",
|
||||
"version": "バージョン {version}"
|
||||
},
|
||||
"theme": {
|
||||
"dark": "ダーク",
|
||||
"light": "ライト"
|
||||
},
|
||||
"language": {
|
||||
"label": "言語",
|
||||
"search": "言語を検索…"
|
||||
},
|
||||
"features": {
|
||||
"sectionTitle": "AIエージェントオーケストレーションに必要なすべて",
|
||||
"sectionSubtitle": "マルチエージェント連携を実現する強力なツール。"
|
||||
},
|
||||
"pricing": {
|
||||
"sectionTitle": "100%無料。制約なし。",
|
||||
"sectionSubtitle": "オープンソース、APIキー不要、設定不要。インストールするだけ。",
|
||||
"getStarted": "ダウンロード",
|
||||
"popular": "永久無料",
|
||||
"note": "100%オープンソース。APIキー不要。設定不要。完全にローカルで動作。"
|
||||
},
|
||||
"testimonials": {
|
||||
"sectionTitle": "開発者の声",
|
||||
"sectionSubtitle": "実際の開発者からのリアルなフィードバック",
|
||||
"showMore": "もっと見る",
|
||||
"showLess": "折りたたむ",
|
||||
"feedbackCta": "体験を共有しませんか?issueを作成してください:"
|
||||
},
|
||||
"faq": {
|
||||
"sectionTitle": "よくある質問",
|
||||
"subtitle": "Claude Agent Teamsについて知っておくべきこと"
|
||||
},
|
||||
"comparison": {
|
||||
"sectionTitle": "他ツールとの比較",
|
||||
"sectionSubtitle": "他のAIコーディングツールとの機能比較。",
|
||||
"feature": "機能",
|
||||
"features": {
|
||||
"crossTeam": "チーム間コミュニケーション",
|
||||
"agentMessaging": "エージェント間メッセージング",
|
||||
"linkedTasks": "タスクリンク",
|
||||
"sessionAnalysis": "セッション分析",
|
||||
"taskAttachments": "タスク添付ファイル",
|
||||
"hunkReview": "ハンクレベルレビュー",
|
||||
"codeEditor": "組み込みコードエディタ",
|
||||
"fullAutonomy": "完全自律",
|
||||
"taskDeps": "タスク依存関係",
|
||||
"reviewWorkflow": "レビューワークフロー",
|
||||
"zeroSetup": "ゼロ設定",
|
||||
"kanban": "カンバンボード",
|
||||
"execLog": "実行ログビューア",
|
||||
"liveProcesses": "ライブプロセス",
|
||||
"perTaskReview": "タスク別コードレビュー",
|
||||
"flexAutonomy": "柔軟な自律性",
|
||||
"worktree": "Git worktree分離",
|
||||
"multiAgent": "マルチエージェントバックエンド",
|
||||
"price": "価格"
|
||||
}
|
||||
},
|
||||
"screenshots": {
|
||||
"sectionTitle": "実際の画面",
|
||||
"sectionSubtitle": "アプリの実際のスクリーンショット — カンバンボード、コードレビュー、エージェントチームなど。"
|
||||
},
|
||||
"common": {
|
||||
"learnMore": "詳細"
|
||||
},
|
||||
"footer": {
|
||||
"copyright": "© {year} Claude Agent Teams",
|
||||
"tagline": "開発者向けAIエージェントオーケストレーション",
|
||||
"links": {
|
||||
"github": "GitHub",
|
||||
"docs": "ドキュメント"
|
||||
}
|
||||
},
|
||||
"meta": {
|
||||
"homeTitle": "Claude Agent Teams — 開発者向けAIエージェントオーケストレーション",
|
||||
"homeDescription": "AIエージェントチームを管理する無料のオープンソースデスクトップアプリ。カンバンボード、コードレビュー、チーム間通信。完全にローカルで動作。"
|
||||
},
|
||||
"error": {
|
||||
"notFoundTitle": "ページが見つかりません",
|
||||
"notFoundDescription": "お探しのページは存在しないか、移動された可能性があります。",
|
||||
"genericTitle": "エラーが発生しました",
|
||||
"genericDescription": "予期しないエラーが発生しました。後でもう一度お試しください。",
|
||||
"goHome": "ホームに戻る"
|
||||
}
|
||||
}
|
||||
|
|
@ -12,7 +12,7 @@
|
|||
"badge": "Claude Agent Teams",
|
||||
"downloadNow": "Baixar agora",
|
||||
"ctaPrimary": "Baixar para {platform}",
|
||||
"ctaSecondary": "Ver recursos",
|
||||
"ctaSecondary": "Comparar",
|
||||
"preview": "Prévia do produto",
|
||||
"trust": {
|
||||
"agentTeams": "Equipes de agentes",
|
||||
|
|
@ -33,7 +33,8 @@
|
|||
"light": "Claro"
|
||||
},
|
||||
"language": {
|
||||
"label": "Idioma"
|
||||
"label": "Idioma",
|
||||
"search": "Pesquisar idioma…"
|
||||
},
|
||||
"features": {
|
||||
"sectionTitle": "Tudo para orquestração de agentes IA",
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
"badge": "Claude Agent Teams",
|
||||
"downloadNow": "Скачать",
|
||||
"ctaPrimary": "Скачать для {platform}",
|
||||
"ctaSecondary": "Посмотреть возможности",
|
||||
"ctaSecondary": "Сравнить",
|
||||
"preview": "Превью продукта",
|
||||
"trust": {
|
||||
"agentTeams": "Команды агентов",
|
||||
|
|
@ -33,7 +33,8 @@
|
|||
"light": "Светлая"
|
||||
},
|
||||
"language": {
|
||||
"label": "Язык"
|
||||
"label": "Язык",
|
||||
"search": "Найти язык…"
|
||||
},
|
||||
"features": {
|
||||
"sectionTitle": "Всё для оркестрации ИИ-агентов",
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
"badge": "Claude Agent Teams",
|
||||
"downloadNow": "立即下载",
|
||||
"ctaPrimary": "下载 {platform} 版",
|
||||
"ctaSecondary": "查看功能",
|
||||
"ctaSecondary": "对比",
|
||||
"preview": "产品预览",
|
||||
"trust": {
|
||||
"agentTeams": "智能体团队",
|
||||
|
|
@ -33,7 +33,8 @@
|
|||
"light": "浅色"
|
||||
},
|
||||
"language": {
|
||||
"label": "语言"
|
||||
"label": "语言",
|
||||
"search": "搜索语言…"
|
||||
},
|
||||
"features": {
|
||||
"sectionTitle": "AI 智能体编排所需的一切",
|
||||
|
|
|
|||
|
|
@ -12,14 +12,14 @@ const baseURL = process.env.NUXT_APP_BASE_URL || "/";
|
|||
export default defineNuxtConfig({
|
||||
compatibilityDate: "2026-01-19",
|
||||
ssr: true,
|
||||
experimental: {
|
||||
inlineSSRStyles: false
|
||||
},
|
||||
app: {
|
||||
baseURL,
|
||||
head: {
|
||||
link: [
|
||||
{ rel: "icon", type: "image/x-icon", href: `${baseURL}favicon.ico` },
|
||||
{ rel: "icon", type: "image/png", sizes: "32x32", href: `${baseURL}favicon-32.png` },
|
||||
{ rel: "apple-touch-icon", sizes: "192x192", href: `${baseURL}logo-192.png` },
|
||||
{ rel: "dns-prefetch", href: "https://api.github.com" },
|
||||
{ rel: "preconnect", href: "https://fonts.googleapis.com" },
|
||||
{ rel: "preconnect", href: "https://fonts.gstatic.com", crossorigin: "" },
|
||||
{ rel: "preload", href: "https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&family=JetBrains+Mono:wght@400;600&display=swap", as: "style" },
|
||||
|
|
@ -57,6 +57,8 @@ export default defineNuxtConfig({
|
|||
prerender: {
|
||||
routes: [
|
||||
...generateI18nRoutes(),
|
||||
"/sitemap.xml",
|
||||
"/robots.txt"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
|
|
|||
11
landing/server/routes/robots.txt.ts
Normal file
11
landing/server/routes/robots.txt.ts
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
export default defineEventHandler((event) => {
|
||||
const config = useRuntimeConfig();
|
||||
const siteUrl = (config.public.siteUrl as string) || "https://claude-agent-teams.dev";
|
||||
|
||||
setHeader(event, "content-type", "text/plain; charset=utf-8");
|
||||
|
||||
return `User-agent: *
|
||||
Allow: /
|
||||
Sitemap: ${siteUrl}/sitemap.xml
|
||||
`;
|
||||
});
|
||||
32
landing/server/routes/sitemap.xml.ts
Normal file
32
landing/server/routes/sitemap.xml.ts
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
import { generateSitemapRoutes } from "~/data/i18n";
|
||||
|
||||
const escapeXml = (value: string) =>
|
||||
value
|
||||
.replaceAll("&", "&")
|
||||
.replaceAll("<", "<")
|
||||
.replaceAll(">", ">")
|
||||
.replaceAll('"', """)
|
||||
.replaceAll("'", "'");
|
||||
|
||||
const buildDate = new Date().toISOString().split("T")[0];
|
||||
|
||||
export default defineEventHandler((event) => {
|
||||
const config = useRuntimeConfig();
|
||||
const siteUrl = (config.public.siteUrl as string) || "https://claude-agent-teams.dev";
|
||||
|
||||
setHeader(event, "content-type", "application/xml; charset=utf-8");
|
||||
|
||||
const routes = generateSitemapRoutes();
|
||||
const body = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
${routes
|
||||
.map(
|
||||
(path) =>
|
||||
` <url>\n <loc>${escapeXml(`${siteUrl}${path}`)}</loc>\n <lastmod>${buildDate}</lastmod>\n </url>`
|
||||
)
|
||||
.join("\n")}
|
||||
</urlset>
|
||||
`;
|
||||
|
||||
return body;
|
||||
});
|
||||
Loading…
Reference in a new issue