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:
iliya 2026-03-23 20:18:02 +02:00
parent eda6218e67
commit 0876f192fa
27 changed files with 942 additions and 65 deletions

View file

@ -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>

View file

@ -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;
};

View file

@ -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>

View file

@ -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;

View file

@ -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 }}

View file

@ -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(() => {

View file

@ -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: () => "" });

View file

@ -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
View 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
View 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
View 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": "macOSApple 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
}
]
}

View file

@ -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 => {

View file

@ -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;

View 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 },
];

View file

@ -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
View 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"
}
}

View file

@ -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",

View file

@ -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
View 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"
}
}

View file

@ -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
View 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": "ホームに戻る"
}
}

View file

@ -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",

View file

@ -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": "Всё для оркестрации ИИ-агентов",

View file

@ -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 智能体编排所需的一切",

View file

@ -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"
]
}
},

View 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
`;
});

View file

@ -0,0 +1,32 @@
import { generateSitemapRoutes } from "~/data/i18n";
const escapeXml = (value: string) =>
value
.replaceAll("&", "&amp;")
.replaceAll("<", "&lt;")
.replaceAll(">", "&gt;")
.replaceAll('"', "&quot;")
.replaceAll("'", "&apos;");
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;
});