Merge pull request #5454 from Hmbown/codex/v099-web-locales

feat(web/i18n): add fr/de/ca/hi/tr/it/pl dictionaries (+ar with RTL plumbing)
This commit is contained in:
Hunter Bown authored and GitHub committed 2026-08-16 21:47:22 -07:00
commit 5144dd0324
32 files changed
+1951 -29

No files matched your search

+5 -1
View File
@@ -2,7 +2,7 @@ import type { Metadata } from "next";
import { Fraunces, IBM_Plex_Sans, JetBrains_Mono, Noto_Serif_SC } from "next/font/google";
import { Nav } from "@/components/nav";
import { Footer } from "@/components/footer";
import { locales, type Locale } from "@/lib/i18n/config";
import { localeDirection, locales, type Locale } from "@/lib/i18n/config";
import { getChrome, getHome } from "@/lib/i18n/dictionaries";
import { buildPageMetadata } from "@/lib/page-meta";
import "../globals.css";
@@ -63,10 +63,14 @@ export default async function LocaleLayout({
}) {
const { locale } = await params;
const chrome = getChrome(locale);
// RTL locales (e.g. ar) set the document direction from the canonical
// registry so the browser handles bidirectional layout from the root.
const dir = localeDirection(locale);
return (
<html
lang={locale}
dir={dir}
className={`${display.variable} ${body.variable} ${mono.variable} ${cjk.variable}`}
suppressHydrationWarning
>
+22 -7
View File
@@ -5,6 +5,7 @@ import {
isPartialLocale,
isTrackedLocale,
isValidLocale,
localeDirection,
locales,
partialLocales,
} from "./config";
@@ -21,7 +22,10 @@ describe("locale registry (single canonical taxonomy)", () => {
const notRouted = ALL_LOCALES.filter(
(l) => l.status === "planned" || l.status === "deferred",
).map((l) => l.code);
expect(notRouted.length).toBeGreaterThan(0);
// Every tracked locale is routed as of the wave-2 localization, so the
// registry has no planned/deferred entries today — the invariant below
// still guards any future demotion.
expect(notRouted).toEqual([]);
for (const code of notRouted) {
expect(locales).not.toContain(code);
expect(isValidLocale(code)).toBe(false);
@@ -29,15 +33,26 @@ describe("locale registry (single canonical taxonomy)", () => {
}
});
it("ships the v0.9.2 website wave as partial with visible status", () => {
for (const code of ["ja", "vi", "ko", "ru", "uk", "es", "pt-BR", "id"]) {
expect(isValidLocale(code)).toBe(true);
expect(isPartialLocale(code)).toBe(true);
it("ships the v0.9.2 wave and the wave-2 majors as partial with visible status", () => {
for (const code of [
"ja", "vi", "ko", "ru", "uk", "es", "pt-BR", "id",
"fr", "de", "ca", "hi", "tr", "it", "pl", "ar",
]) {
expect(isValidLocale(code), code).toBe(true);
expect(isPartialLocale(code), code).toBe(true);
}
expect(partialLocales).not.toContain("en");
expect(partialLocales).not.toContain("zh");
expect(isPartialLocale("fr")).toBe(false);
expect(isValidLocale("fr")).toBe(false);
});
it("derives the document direction from the registry (RTL plumbing)", () => {
expect(localeDirection("ar")).toBe("rtl");
for (const l of ALL_LOCALES) {
if (l.code === "ar") continue;
expect(localeDirection(l.code), `${l.code} dir`).toBe("ltr");
}
expect(localeDirection("en")).toBe("ltr");
expect(localeDirection("xx")).toBe("ltr");
});
it("has unique codes and native-script labels", () => {
+39 -10
View File
@@ -29,6 +29,9 @@
/** Status of a locale relative to the website. */
export type LocaleStatus = "shipped" | "partial" | "planned" | "deferred";
/** Direction of the locale's script — used for the html `dir` attribute. */
export type LocaleDirection = "ltr" | "rtl";
export interface LocaleEntry {
/** ISO 639-1 or IETF BCP 47 language tag used in routes. */
code: string;
@@ -36,10 +39,17 @@ export interface LocaleEntry {
label: string;
/** Status relative to the website. */
status: LocaleStatus;
/** Text direction for the html `dir` attribute. Defaults to "ltr". */
dir?: LocaleDirection;
/** One-line scope note shown to maintainers (not rendered). */
note?: string;
}
/** Text direction of a tracked locale ("ltr" for untracked codes). */
export function localeDirection(locale: string): LocaleDirection {
return ALL_LOCALES.find((l) => l.code === locale)?.dir ?? "ltr";
}
/**
* All locales the project tracks, ordered by priority.
*
@@ -105,20 +115,20 @@ export const ALL_LOCALES: LocaleEntry[] = [
{
code: "fr",
label: "Français",
status: "planned",
note: "#4788 — TUI pack shipped in v0.9.2; website next wave",
status: "partial",
note: "#4788 — TUI pack shipped in v0.9.2; chrome + home + docs-guide localized; page bodies fall back to English",
},
{
code: "de",
label: "Deutsch",
status: "planned",
note: "#4788 — TUI pack shipped in v0.9.2; website next wave",
status: "partial",
note: "#4788 — TUI pack shipped in v0.9.2; chrome + home + docs-guide localized; page bodies fall back to English",
},
{
code: "ca",
label: "Català",
status: "planned",
note: "#4749/#4788 — TUI pack shipped in v0.9.2; website next wave",
status: "partial",
note: "#4749/#4788 — TUI pack shipped in v0.9.2; chrome + home + docs-guide localized; page bodies fall back to English",
},
{
code: "id",
@@ -129,14 +139,33 @@ export const ALL_LOCALES: LocaleEntry[] = [
{
code: "hi",
label: "हिन्दी",
status: "planned",
note: "#4790 — TUI pack shipped in v0.9.2; website next wave",
status: "partial",
note: "#4790 — TUI pack shipped in v0.9.2; chrome + home + docs-guide localized; page bodies fall back to English",
},
{
code: "tr",
label: "Türkçe",
status: "partial",
note: "major-language wave — chrome + home + docs-guide localized; page bodies fall back to English",
},
{
code: "it",
label: "Italiano",
status: "partial",
note: "major-language wave — chrome + home + docs-guide localized; page bodies fall back to English",
},
{
code: "pl",
label: "Polski",
status: "partial",
note: "major-language wave — chrome + home + docs-guide localized; page bodies fall back to English",
},
{
code: "ar",
label: "العربية",
status: "deferred",
note: "RTL candidate — needs bidirectional layout/typography QA first",
status: "partial",
dir: "rtl",
note: "RTL — html dir derived from this entry; chrome + home + docs-guide localized, page bodies fall back to English",
},
];
+22 -7
View File
@@ -27,10 +27,24 @@ describe("matchLocaleTag", () => {
expect(matchLocaleTag("pt-PT")).toBe("pt-BR");
});
it("matches the routed wave-2 locales through regional variants", () => {
expect(matchLocaleTag("fr-FR")).toBe("fr");
expect(matchLocaleTag("fr-CA")).toBe("fr");
expect(matchLocaleTag("de-DE")).toBe("de");
expect(matchLocaleTag("de-AT")).toBe("de");
expect(matchLocaleTag("ca-ES")).toBe("ca");
expect(matchLocaleTag("hi-IN")).toBe("hi");
expect(matchLocaleTag("tr-TR")).toBe("tr");
expect(matchLocaleTag("it-IT")).toBe("it");
expect(matchLocaleTag("pl-PL")).toBe("pl");
expect(matchLocaleTag("ar-EG")).toBe("ar");
expect(matchLocaleTag("ar")).toBe("ar");
});
it("rejects unrouted and empty tags deterministically", () => {
expect(matchLocaleTag("fr")).toBeNull();
expect(matchLocaleTag("de-DE")).toBeNull();
expect(matchLocaleTag("ar")).toBeNull();
expect(matchLocaleTag("fa")).toBeNull();
expect(matchLocaleTag("th-TH")).toBeNull();
expect(matchLocaleTag("nl")).toBeNull();
expect(matchLocaleTag("")).toBeNull();
expect(matchLocaleTag("*")).toBeNull();
});
@@ -42,17 +56,18 @@ describe("detectLocaleFromHeaders", () => {
});
it("ignores stale cookies for unrouted locales", () => {
expect(detectLocaleFromHeaders("fr", "uk,en;q=0.8")).toBe("uk");
expect(detectLocaleFromHeaders("th", "uk,en;q=0.8")).toBe("uk");
});
it("honors Accept-Language preference order", () => {
expect(detectLocaleFromHeaders(undefined, "fr,vi;q=0.9,ru;q=0.8")).toBe("vi");
expect(detectLocaleFromHeaders(undefined, "de,pt;q=0.7")).toBe("pt-BR");
expect(detectLocaleFromHeaders(undefined, "th,vi;q=0.9,ru;q=0.8")).toBe("vi");
expect(detectLocaleFromHeaders(undefined, "sv,pt;q=0.7")).toBe("pt-BR");
expect(detectLocaleFromHeaders(undefined, "fr,vi;q=0.9")).toBe("fr");
});
it("falls back to the default locale with no signal", () => {
expect(detectLocaleFromHeaders(undefined, null)).toBe("en");
expect(detectLocaleFromHeaders(undefined, "")).toBe("en");
expect(detectLocaleFromHeaders(undefined, "fr,de;q=0.8")).toBe("en");
expect(detectLocaleFromHeaders(undefined, "fa,th;q=0.8")).toBe("en");
});
});
+28 -3
View File
@@ -67,6 +67,16 @@ const CHROME_PROSE_KEYS = [
"tickerAria",
] as const satisfies readonly (keyof ChromeDict)[];
/**
* Locale/key pairs whose English-identical value is a native loanword in
* that locale, not a missing translation — asserted below so the equality
* is deliberate and visible. German "Community" matches the TUI pack
* (crates/tui/locales/de.json: "Community & Mitwirken").
*/
const CHROME_LOANWORDS: Record<string, readonly string[]> = {
de: ["navCommunity"],
};
/** Home keys that are real sentences and must be translated. */
const HOME_PROSE_KEYS = [
"metaTitle",
@@ -128,7 +138,10 @@ function flattenStrings(dict: object): Record<string, string> {
describe("website dictionaries", () => {
it("cover every routed locale except the English reference", () => {
expect([...DICTIONARY_LOCALES].sort()).toEqual(
["zh", "es", "id", "ja", "ko", "pt-BR", "ru", "uk", "vi"].sort(),
[
"zh", "es", "id", "ja", "ko", "pt-BR", "ru", "uk", "vi",
"fr", "de", "ca", "hi", "tr", "it", "pl", "ar",
].sort(),
);
// Chinese is dictionary-backed like every other locale — no inline
// en/zh special case survives in the page/component sources (#4934).
@@ -191,6 +204,12 @@ describe("website dictionaries", () => {
}
// zh ships a real translation, not an English pass-through.
expect(getDocsGuide("zh").overviewTitle).not.toBe(EN_DOCS_GUIDE.overviewTitle);
// The wave-2 locales ship docs-guide too, translated rather than passed through.
for (const locale of ["fr", "de", "ca", "hi", "tr", "it", "pl", "ar"]) {
expect(getDocsGuide(locale).overviewTitle, `${locale} docs-guide`).not.toBe(
EN_DOCS_GUIDE.overviewTitle,
);
}
// A locale without the file falls back to the English reference object.
expect(getDocsGuide("ja")).toBe(EN_DOCS_GUIDE);
});
@@ -216,11 +235,11 @@ describe("website dictionaries", () => {
it("falls back to the English dictionary for unrouted locales — no missing markers", () => {
for (const key of Object.keys(EN_CHROME) as (keyof ChromeDict)[]) {
expect(getChrome("fr")[key]).toBe(EN_CHROME[key]);
expect(getChrome("xx")[key]).toBe(EN_CHROME[key]);
expect(getChrome("en")[key]).toBe(EN_CHROME[key]);
}
for (const key of Object.keys(EN_HOME) as (keyof HomeDict)[]) {
expect(getHome("de")[key]).toEqual(EN_HOME[key]);
expect(getHome("xx")[key]).toEqual(EN_HOME[key]);
}
});
@@ -277,7 +296,13 @@ describe("website dictionaries", () => {
for (const locale of DICTIONARY_LOCALES) {
const chrome = getChrome(locale);
const home = getHome(locale);
const loanwords = new Set(CHROME_LOANWORDS[locale] ?? []);
for (const key of CHROME_PROSE_KEYS) {
if (loanwords.has(key)) {
// A documented loanword: the shared value IS the native word.
expect(chrome[key], `${locale} chrome ${key} loanword`).toBe(EN_CHROME[key]);
continue;
}
expect(chrome[key], `${locale} chrome ${key} is English pass-through`).not.toBe(
EN_CHROME[key],
);
+89
View File
@@ -0,0 +1,89 @@
import type { ChromeDict } from "../types";
/**
* Arabic chrome dictionary — فصحى معاصرة، بترجمة صيغة RTL.
*
* إعادة صياغة أصلية باتجاه الإنجليزية الحالي — «أي نموذج، على جهازك»،
* لا تموضع «local-first» المتقاعد.
*
* أسماء الأوامر والمنتجات تبقى كما هي: Codewhale و GitHub و Issues
* و `Runtime` و `Fleet` و TUI. الأسهم تشير إلى الأمام في سياق RTL (←).
*
* التسميات الثانوية للتنقل تقارن التسمية العربية بنظيرة إنجليزية
* قصيرة — ثنائية الهان هي أداة تحريرية خاصة بالنسخة الإنجليزية.
*/
export const chrome: ChromeDict = {
navDocs: "التوثيق",
navStart: "البداية",
navInstall: "التثبيت",
navFaq: "الأسئلة الشائعة",
navCommunity: "المجتمع",
navContribute: "المساهمة",
navDocsSecondary: "Docs",
navStartSecondary: "Start",
navInstallSecondary: "Install",
navFaqSecondary: "FAQ",
navCommunitySecondary: "Community",
navContributeSecondary: "Contribute",
skipToContent: "الانتقال إلى المحتوى الرئيسي",
navPrimaryAria: "التنقل الرئيسي",
navHomeAria: "الصفحة الرئيسية لـ Codewhale",
installCta: "ثبّت ←",
wordmarkSeal: "深",
wordmarkTag: "أي نموذج، على جهازك",
issueLabel: "عدد {date}",
dateLocale: "ar",
starsAria: "نجوم GitHub",
githubFallback: "GitHub",
tickerLiveLabel: "مباشر",
tickerLiveTag: "LIVE",
tickerMerged: "دُمج",
tickerOpened: "فُتح",
tickerClosed: "أُغلق",
tickerReleased: "أُصدر",
tickerFirstContribution: "أول مساهمة",
tickerBy: "بواسطة {handle}",
tickerAria: "آخر نشاط في المستودع",
traceLabel: "أثر الاستدلال",
traceTabsAria: "مقتطفات الجلسات",
menuOpen: "افتح القائمة",
menuClose: "أغلق القائمة",
themeAuto: "تلقائي",
themeLight: "فاتح",
themeDark: "داكن",
themeAria: "سمة التوثيق: {mode} (انقر للتبديل)",
themeTitle: "سمة التوثيق · تلقائي / فاتح / داكن",
footerTagline:
"Codewhale يغوص في الأعماق بدلًا منك — توثيق ومصدر ومجتمع لِ Runtime مفتوح المصدر.",
footerProduct: "المنتج",
footerProject: "المشروع",
footerDocs: "التوثيق",
footerGuide: "البداية",
footerInstall: "التثبيت",
footerModels: "النماذج",
footerRuntime: "Runtime",
footerFaq: "الأسئلة الشائعة",
footerIssues: "Issues",
footerContribute: "المساهمة",
footerLicense: "رخصة MIT",
footerCanonicalSource: "المصدر القانوني: ",
footerReleases: " · الإصدارات: ",
footerReleasesLink: "إصدارات GitHub",
footerSecurity: "الأمن",
switcherLabel: "اللغة",
switcherSwitchTo: "التبديل إلى {label}",
partialBadge: "(جزئي)",
};
@@ -0,0 +1,22 @@
import type { DocsGuideDict } from "../types";
/**
* Arabic dictionary for the docs "Getting started" page. Arabic script
* needs roomier leading than the Latin reference — loose, short of the
* CJK treatment.
*/
export const docsGuide: DocsGuideDict = {
metaTitle: "البداية · توثيق Codewhale",
metaDescription:
"المسار الكامل من التثبيت إلى أسطولك المثالي: التثبيت، وأول جلسة بلا مفاتيح، وربط مزوّد، وإعداد الأسطول.",
bodyClassName: "text-ink-soft leading-loose",
overviewTitle: "البداية",
overviewLead:
"أربع خطوات من أمر تثبيت واحد إلى أسطول جاهز لعملك. كل خطوة تذكر فقط ما يفعله المرشّح الحالي فعلًا؛ وكل ما هو غير منشور أو غير مسجّل موسوم بذلك.",
sessionTitle: "شاهد جلسة حقيقية",
sessionLead:
"أدناه موضع وسائط الجلسة الحقيقية. هو عمدًا في حالة الانتظار: إلى أن توجد تسجيلة dogfood لمرشّح v0.9.2، لا يعرض هذا الموقع أي بديل أو مشاهد مفبركة.",
nextTitle: "إلى أين بعد ذلك",
sourceNote:
"المستندات المصدر: docs/GUIDE.md، docs/KEYBINDINGS.md · نصوص الخطوات في web/lib/content/getting-started.ts؛ حدّث docs-map.ts عند أي تغيير.",
};
+108
View File
@@ -0,0 +1,108 @@
import type { HomeDict } from "../types";
/**
* Arabic home dictionary — صفحة الهبوط «جريدة-محيط».
*
* إعادة صياغة أصلية باتجاه الإنجليزية الحالي: أحضر نموذجك، وكل شيء
* يجري على جهاك. مفردات المنتج تبقى حرفية كما في حزمة TUI:
* Plan / Work / Operate، Ask / Auto-Review / Full Access، Codewhale،
* TUI، `codewhale exec`، Runtime API + MCP، Fleet، Node 18+، Rust، MIT.
*
* أختام الأقسام (法، 行، …) محارف مشتركة مع النسخة الإنجليزية —
* علامات لا نثرًا. الأسهم تشير إلى الأمام في سياق RTL (←).
*/
export const home: HomeDict = {
metaTitle: "Codewhale — يغوص في الأعماق بدلًا منك.",
metaDescription:
"Codewhale يغوص في الأعماق بدلًا منك — وكيل برمجة مفتوح المصدر للطرفية. أحضر نموذجك. يعمل على جهازك. بـ Rust، ورخصة MIT.",
kicker: "مفتوح المصدر · أحضر نموذجك · يعمل في طرفيتك",
heroTitleA: "Codewhale يغوص في الأعماق،",
heroTitleB: "حتى لا تضطر أنت إلى ذلك.",
heroIntro:
"{brand} وكيل برمجة مفتوح المصدر يعمل في طرفيتك. أعطه نموذجًا ومهمة — يقرأ شيفرتك، ويحرّر الملفات، ويشغّل فحوصه بنفسه، ويتوقف عندما تنتهي المهمة أو عندما يحتاج إليك. أحضر أي نموذج، أو امزجها: ثبّت نموذجًا مختلفًا لكل دور.",
install: "ثبّت",
docs: "التوثيق",
copy: "انسخ",
copied: "نُسخ ✓",
installEyebrow: "تثبيت بسطر واحد",
installRequirement: "يتطلب Node 18+ — لا حاجة إلى سلسلة أدوات Rust",
installOtherWays: "طرق أخرى ←",
latestRelease: "أحدث إصدار {tag}",
releaseUnavailable: "حالة الإصدار غير متاحة",
currentSource: "المصدر الحالي",
sourceCandidate: "مصدر مرشّح",
providerRoutes: "{count} مسار مزوّد",
publishedRelease: "إصدار منشور",
figcaptionSourceCandidate: "مصدر مرشّح",
shotSession: "الجلسة الحالية",
screenshotAlt:
"جلسة Codewhale الطرفية الحالية: وضع Operate، والحوت، والمحرّر، والتذييل",
figcaption: "جلسة Codewhale الحالية · وضع Operate · وضعية أذونات Ask",
proofHeading: "صدفة طرفية تحت الماء. أي نموذج. على جهازك.",
proofBody:
"أحضر النموذج الذي تستخدمه أصلًا — مستضاف، أو عبر بوابة، أو محلي. Plan / Work / Operate ووضعيات الأذونات الصريحة تُبقي الغوصة تحت سيطرتك.",
sealDecides: "法",
decidesEyebrow: "شاهد كيف يقرر",
decidesHeading: "قواعد تراها في الأثر",
decidesLede:
"مقتطفات من جلسات حقيقية — تسلسل قواعد المشروع يظهر في استدلال النموذج، لا مجرد وعد على صفحة هبوط.",
sealWorkflow: "行",
workflowHeading: "من المهمة إلى تغيير متحقَّق منه.",
workflow: [
["الفحص", "قراءة المستودع وتعليماته والمهمة."],
["التنفيذ", "تحرير الملفات ضمن حدود موافقة صريحة."],
["التحقق", "تشغيل الفحوص ومعاينة النتيجة."],
["التقرير", "ترك إيصال موجز وباقٍ."],
],
receiptAria: "مثال إيصال عمل",
receiptInspect: "المستودع والتعليمات",
receiptAct: "التحرير عبر وضعية الأذونات المختارة",
receiptReport: "الفحوص ناجحة · الإيصال محفوظ",
sealStart: "起",
startHeading: "جديد على Codewhale؟ أربع خطوات من البداية إلى النهاية.",
startLede:
"ثبّت ← أول جلسة بلا مفاتيح ← اربط مزوّدًا ← جهّز أسطولك. المصطلحات معرّفة في صفحة المفردات.",
startGuideLink: "اقرأ دليل البداية ←",
startVocabularyLink: "اطّلع على مفردات المنتج ←",
sealBoundaries: "界",
boundariesHeadingA: "نموذجك.",
boundariesHeadingB: "حدودك.",
boundariesBody:
"اختر النموذج ووضع العمل ووضعية الأذونات صراحةً. التكلفة المجهولة تبقى مصرّحًا بها كمجهولة، والواجهات التجريبية تبقى موسومة بذلك.",
hostedGatewayLocal: "نماذج مستضافة وعبر بوابات ومحلية",
planActOperateDesc: "من التخطيط للقراءة فقط إلى التشغيل الذاتي",
askAutoReviewDesc: "اختر وضعية الأذونات للعمل",
tuiExecWebDesc: "واجهات Runtime تفاعلية وبلا واجهة",
sealSurfaces: "面",
surfacesHeading: "استخدم الـ Runtime حيث يجري العمل.",
surfaces: [
["TUI", "عمل تفاعلي في الطرفية"],
["codewhale exec", "سكربتات وCI"],
["عميل الويب", "عميل متصفح محصور في loopback"],
["Runtime API + MCP", "تكاملات محلية"],
["Fleet", "عمل متعدد الوكلاء دائم"],
],
runtimeLink: "اطّلع على واجهات الـ Runtime وملاحظات الاستقرار ←",
installBandHeading: "ابدأ بأمر واحد.",
binaries: "الملفات الثنائية",
chinaMirrors: "مرايا في الصين",
installGuideLink: "اقرأ دليل التثبيت ←",
sealCommunity: "众",
communityHeading: "يُبنى علنًا",
communityBody:
"برخصة MIT، وبتشكيل من المساهمين عبر الـ Runtimeات والمزودين والمنصات والتوثيق والاختبارات.",
communityLinksAria: "روابط المجتمع",
contribute: "ساهم",
};
+94
View File
@@ -0,0 +1,94 @@
import type { ChromeDict } from "../types";
/**
* Catalan chrome dictionary.
*
* Reescriptura nativa en la direcció anglesa actual — «any model, on your
* machine», no el posicionament «local-first» retirat. Registre amb tu,
* com el pack TUI (crates/tui/locales/ca.json): «Executa `{command}` per
* confirmar».
*
* Terminologia alineada amb el pack TUI: els modes i les postures de
* permisos es mantenen literals (Plan / Work / Operate, Ask / Auto-Review /
* Full Access), «permisos» és permissions, «resguard» és receipt; `Runtime`,
* `Fleet` i `TUI` resten noms de producte.
*
* Les etiquetes secundàries de navegació aparien l’etiqueta catalana amb
* un equivalent anglès curt — la parella han és el recurs editorial propi
* de l’edició anglesa.
*/
export const chrome: ChromeDict = {
navDocs: "Documentació",
navStart: "Començar",
navInstall: "Instal·lar",
navFaq: "PMF",
navCommunity: "Comunitat",
navContribute: "Col·laborar",
navDocsSecondary: "Docs",
navStartSecondary: "Start",
navInstallSecondary: "Install",
navFaqSecondary: "FAQ",
navCommunitySecondary: "Community",
navContributeSecondary: "Contribute",
skipToContent: "Salta al contingut principal",
navPrimaryAria: "Navegació principal",
navHomeAria: "Inici de Codewhale",
installCta: "Instal·la →",
wordmarkSeal: "深",
wordmarkTag: "qualsevol model, a la teva màquina",
issueLabel: "Edició del {date}",
dateLocale: "ca-ES",
starsAria: "Estrelles a GitHub",
githubFallback: "GitHub",
tickerLiveLabel: "En directe",
tickerLiveTag: "LIVE",
tickerMerged: "fusionat",
tickerOpened: "obert",
tickerClosed: "tancat",
tickerReleased: "publicat",
tickerFirstContribution: "primera contribució",
tickerBy: "per {handle}",
tickerAria: "Activitat recent del repositori",
traceLabel: "traça de raonament",
traceTabsAria: "Extractes de sessió",
menuOpen: "Obre el menú",
menuClose: "Tanca el menú",
themeAuto: "auto",
themeLight: "clar",
themeDark: "fosc",
themeAria: "Tema de la documentació: {mode} (fes clic per canviar)",
themeTitle: "Tema de la documentació · auto / clar / fosc",
footerTagline:
"Codewhale s’immergeix a les profunditats per tu — documentació, codi font i comunitat del runtime de codi obert.",
footerProduct: "Producte",
footerProject: "Projecte",
footerDocs: "Documentació",
footerGuide: "Primers passos",
footerInstall: "Instal·lació",
footerModels: "Models",
footerRuntime: "Runtime",
footerFaq: "PMF",
footerIssues: "Issues",
footerContribute: "Col·laborar",
footerLicense: "Llicència MIT",
footerCanonicalSource: "Font canònica: ",
footerReleases: " · Versions: ",
footerReleasesLink: "Versions de GitHub",
footerSecurity: "Seguretat",
switcherLabel: "Llengua",
switcherSwitchTo: "Canvia a {label}",
partialBadge: "(parcial)",
};
@@ -0,0 +1,21 @@
import type { DocsGuideDict } from "../types";
/**
* Catalan dictionary for the docs "Getting started" page. Latin script —
* the reference body typography is kept.
*/
export const docsGuide: DocsGuideDict = {
metaTitle: "Primers passos · Documentació de Codewhale",
metaDescription:
"El camí complet de la instal·lació a la teva Fleet ideal: instal·lació, una primera sessió sense claus, connexió d’un proveïdor i configuració de la Fleet.",
bodyClassName: "text-ink-soft leading-relaxed",
overviewTitle: "Primers passos",
overviewLead:
"Quatre passos d’una ordre d’instal·lació a una Fleet a punt per a la teva feina. Cada pas només afirma el que el candidat actual fa realment; allò no publicat o no enregistrat es marca com a tal.",
sessionTitle: "Mira una sessió real",
sessionLead:
"A sota hi ha l’espai reservat al material de sessió real. És deliberadament en estat pendent: fins que existeixi l’enregistrament dogfood del candidat v0.9.2, aquest lloc no mostra cap peça de substitució ni cap escena muntada.",
nextTitle: "I ara què",
sourceNote:
"Documents font: docs/GUIDE.md, docs/KEYBINDINGS.md · El text dels passos viu a web/lib/content/getting-started.ts; actualitza docs-map.ts en fer canvis.",
};
+109
View File
@@ -0,0 +1,109 @@
import type { HomeDict } from "../types";
/**
* Catalan home dictionary — la pàgina d’inici «diari-oceà».
*
* Reescriptura nativa en la direcció anglesa actual: porta el teu model,
* tot passa a la teva màquina. El vocabulari de producte es manté literal
* i coincideix amb el pack TUI: Plan / Work / Operate, Ask / Auto-Review /
* Full Access, Codewhale, TUI, `codewhale exec`, Runtime API + MCP, Fleet,
* Node 18+, Rust, MIT.
*
* Els segells de secció (法, 行, …) són glifs compartits amb l’edició
* anglesa — marques, no prosa.
*/
export const home: HomeDict = {
metaTitle: "Codewhale — s’immergeix a les profunditats per tu.",
metaDescription:
"Codewhale s’immergeix a les profunditats per tu — un agent de programació de codi obert per al terminal. Porta el teu model. A la teva màquina. En Rust, amb llicència MIT.",
kicker: "Codi obert · Porta el teu model · Al teu terminal",
heroTitleA: "Codewhale s’immergeix a les profunditats",
heroTitleB: "perquè tu no ho hagis de fer.",
heroIntro:
"{brand} és un agent de programació de codi obert per al teu terminal. Dóna-li un model i una tasca: llegeix el teu codi, edita fitxers, executa les seves pròpies comprovacions i s’atura quan la feina és feta o quan et necessita. Porta el model que vulguis, o barreja’ls: fixa un model diferent per a cada rol.",
install: "Instal·la",
docs: "Documentació",
copy: "Copia",
copied: "Copiat ✓",
installEyebrow: "instal·lació en una línia",
installRequirement: "cal Node 18+ — sense cadena d’eines Rust",
installOtherWays: "altres mètodes →",
latestRelease: "Última versió {tag}",
releaseUnavailable: "Estat de la versió no disponible",
currentSource: "Font actual",
sourceCandidate: "Font candidata",
providerRoutes: "{count} rutes de proveïdors",
publishedRelease: "versió publicada",
figcaptionSourceCandidate: "font candidata",
shotSession: "Sessió actual",
screenshotAlt:
"Sessió de terminal actual de Codewhale amb el mode Operate, la balena, el compositor i el peu de pàgina",
figcaption: "Sessió actual de Codewhale · mode Operate · postura de permisos Ask",
proofHeading: "Un intèrpret d’ordres submarí. Qualsevol model. A la teva màquina.",
proofBody:
"Porta el model que ja utilitzes — allotjat, via gateway o local. Plan / Work / Operate i les postures de permisos explícites mantenen la immersió sota el teu control.",
sealDecides: "法",
decidesEyebrow: "Mira com decideix",
decidesHeading: "Regles que pots veure a la traça",
decidesLede:
"Extractes de sessions reals: la jerarquia de regles del projecte es veu al raonament del model, no és només una afirmació de la portada.",
sealWorkflow: "行",
workflowHeading: "De la tasca al canvi verificat.",
workflow: [
["Inspeccionar", "Llegir el repositori, les seves instruccions i la tasca."],
["Actuar", "Editar fitxers dins de límits d’aprovació explícits."],
["Verificar", "Executar les comprovacions i inspeccionar el resultat."],
["Reportar", "Deixar un resguard concís i durable."],
],
receiptAria: "Exemple de resguard de feina",
receiptInspect: "repositori i instruccions",
receiptAct: "edició segons la postura de permisos triada",
receiptReport: "comprovacions superades · resguard desat",
sealStart: "起",
startHeading: "Nou a Codewhale? Quatre passos de principi a fi.",
startLede:
"Instal·lar → primera sessió sense claus → connectar un proveïdor → configurar la teva Fleet. Els termes es defineixen a la pàgina de vocabulari.",
startGuideLink: "Llegeix la guia d’inici →",
startVocabularyLink: "Consulta el vocabulari del producte →",
sealBoundaries: "界",
boundariesHeadingA: "El teu model.",
boundariesHeadingB: "Els teus límits.",
boundariesBody:
"Tria explícitament el model, el mode de treball i la postura de permisos. El cost desconegut es declara desconegut, i les superfícies en previsualització es marquen com a tals.",
hostedGatewayLocal: "Models allotjats, de gateway i locals",
planActOperateDesc: "De la planificació de només lectura a l’operació autònoma",
askAutoReviewDesc: "Tria la postura de permisos per a la feina",
tuiExecWebDesc: "Superfícies de runtime interactives i sense interfície",
sealSurfaces: "面",
surfacesHeading: "Fes servir el runtime on passa la feina.",
surfaces: [
["TUI", "Treball interactiu al terminal"],
["codewhale exec", "Scripts i CI"],
["Client web", "Client de navegador, només loopback"],
["Runtime API + MCP", "Integracions locals"],
["Fleet", "Feina multiagent durable"],
],
runtimeLink: "Veure les superfícies del runtime i les notes d’estabilitat →",
installBandHeading: "Comença amb una sola ordre.",
binaries: "Binaris",
chinaMirrors: "Mirrors a la Xina",
installGuideLink: "Llegeix la guia d’instal·lació →",
sealCommunity: "众",
communityHeading: "Construït en públic",
communityBody:
"Amb llicència MIT i format per col·laboradors de runtimes, proveïdors, plataformes, documentació i tests.",
communityLinksAria: "Enllaços de la comunitat",
contribute: "Col·labora",
};
+94
View File
@@ -0,0 +1,94 @@
import type { ChromeDict } from "../types";
/**
* German chrome dictionary.
*
* Native Neufassung in der aktuellen englischen Richtung — „any model, on
* your machine", nicht die eingestellte „local-first"-Positionierung.
* Register wie der TUI-Pack (crates/tui/locales/de.json): knapp, nominal,
* Anrede per Du in der Community-Tradition deutscher Entwicklerwerkzeuge.
*
* Terminologie folgt dem TUI-Pack: Modi und Permission-Posturen bleiben
* literal (Plan / Work / Operate, Ask / Auto-Review / Full Access),
* „Berechtigungen" ist permissions, „Laufzeitbeleg" ist receipt; `Runtime`,
* `Fleet` und `TUI` bleiben Produktnamen.
*
* Die sekundären Nav-Labels paaren das deutsche Primary mit einem kurzen
* englischen Gegenstück — das Han-Paar ist das Editorial der englischen
* Ausgabe.
*/
export const chrome: ChromeDict = {
navDocs: "Dokumentation",
navStart: "Erste Schritte",
navInstall: "Installieren",
navFaq: "FAQ",
navCommunity: "Community",
navContribute: "Mitwirken",
navDocsSecondary: "Docs",
navStartSecondary: "Start",
navInstallSecondary: "Install",
navFaqSecondary: "FAQ",
navCommunitySecondary: "Community",
navContributeSecondary: "Contribute",
skipToContent: "Zum Hauptinhalt springen",
navPrimaryAria: "Hauptnavigation",
navHomeAria: "Codewhale-Startseite",
installCta: "Installieren →",
wordmarkSeal: "深",
wordmarkTag: "jedes Modell, auf deiner Maschine",
issueLabel: "Ausgabe vom {date}",
dateLocale: "de-DE",
starsAria: "GitHub-Sterne",
githubFallback: "GitHub",
tickerLiveLabel: "Echtzeit",
tickerLiveTag: "LIVE",
tickerMerged: "gemerged",
tickerOpened: "geöffnet",
tickerClosed: "geschlossen",
tickerReleased: "veröffentlicht",
tickerFirstContribution: "erster Beitrag",
tickerBy: "von {handle}",
tickerAria: "Letzte Aktivität im Repository",
traceLabel: "Reasoning-Trace",
traceTabsAria: "Sitzungsausschnitte",
menuOpen: "Menü öffnen",
menuClose: "Menü schließen",
themeAuto: "auto",
themeLight: "hell",
themeDark: "dunkel",
themeAria: "Dokumentations-Design: {mode} (Klick zum Wechseln)",
themeTitle: "Dokumentations-Design · auto / hell / dunkel",
footerTagline:
"Codewhale taucht in die Tiefe, damit du es nicht musst — Docs, Quellcode und Community für die Open-Source-Runtime.",
footerProduct: "Produkt",
footerProject: "Projekt",
footerDocs: "Dokumentation",
footerGuide: "Erste Schritte",
footerInstall: "Installation",
footerModels: "Modelle",
footerRuntime: "Runtime",
footerFaq: "FAQ",
footerIssues: "Issues",
footerContribute: "Mitwirken",
footerLicense: "MIT-Lizenz",
footerCanonicalSource: "Kanonische Quelle: ",
footerReleases: " · Releases: ",
footerReleasesLink: "GitHub-Releases",
footerSecurity: "Sicherheit",
switcherLabel: "Sprache",
switcherSwitchTo: "Zu {label} wechseln",
partialBadge: "(teilweise)",
};
@@ -0,0 +1,21 @@
import type { DocsGuideDict } from "../types";
/**
* German dictionary for the docs "Getting started" page. Latin script —
* the reference body typography is kept.
*/
export const docsGuide: DocsGuideDict = {
metaTitle: "Erste Schritte · Codewhale-Dokumentation",
metaDescription:
"Der komplette Weg von der Installation bis zu deiner idealen Fleet: Installation, eine erste schlüssellose Sitzung, Provider-Anbindung und Fleet-Setup.",
bodyClassName: "text-ink-soft leading-relaxed",
overviewTitle: "Erste Schritte",
overviewLead:
"Vier Schritte von einem Installationsbefehl bis zur einsatzbereiten Fleet. Jeder Schritt beschreibt nur, was der aktuelle Kandidat wirklich tut; alles Unveröffentlichte oder nicht Aufgezeichnete ist als solches gekennzeichnet.",
sessionTitle: "Eine echte Sitzung ansehen",
sessionLead:
"Unten ist der Slot für echtes Sitzungsmaterial. Er ist bewusst im Status „ausstehend“: Solange die Dogfood-Aufnahme des v0.9.2-Kandidaten nicht existiert, zeigt diese Seite kein Platzhalter- oder gestellt Material.",
nextTitle: "Wie geht es weiter",
sourceNote:
"Quelldokumente: docs/GUIDE.md, docs/KEYBINDINGS.md · Der Schritttext lebt in web/lib/content/getting-started.ts; bei Änderungen docs-map.ts mitpflegen.",
};
+109
View File
@@ -0,0 +1,109 @@
import type { HomeDict } from "../types";
/**
* German home dictionary — die „Zeitung-Ozean"-Landingpage.
*
* Native Neufassung in der aktuellen englischen Richtung: eigenes Modell
* mitbringen, alles läuft auf der eigenen Maschine. Produktvokabular bleibt
* literal wie im TUI-Pack: Plan / Work / Operate, Ask / Auto-Review /
* Full Access, Codewhale, TUI, `codewhale exec`, Runtime API + MCP, Fleet,
* Node 18+, Rust, MIT.
*
* Die Sektions-Siegel (法, 行, …) sind Glyphen, die mit der englischen
* Ausgabe geteilt werden — Marken, kein Fließtext.
*/
export const home: HomeDict = {
metaTitle: "Codewhale — taucht in die Tiefe, damit du es nicht musst.",
metaDescription:
"Codewhale taucht in die Tiefe, damit du es nicht musst — ein Open-Source-Coding-Agent für das Terminal. Eigenes Modell mitbringen. Läuft auf deiner Maschine. Rust, MIT.",
kicker: "Open Source · Eigenes Modell mitbringen · Läuft im Terminal",
heroTitleA: "Codewhale taucht in die Tiefe,",
heroTitleB: "damit du es nicht musst.",
heroIntro:
"{brand} ist ein Open-Source-Coding-Agent für dein Terminal. Gib ihm ein Modell und eine Aufgabe — er liest deinen Code, bearbeitet Dateien, prüft selbst und stoppt, wenn die Arbeit erledigt ist oder er dich braucht. Bring jedes Modell mit, oder mische sie: pinne pro Rolle ein eigenes Modell fest.",
install: "Installieren",
docs: "Dokumentation",
copy: "Kopieren",
copied: "Kopiert ✓",
installEyebrow: "Installation mit einer Zeile",
installRequirement: "braucht Node 18+ — keine Rust-Toolchain",
installOtherWays: "weitere Wege →",
latestRelease: "Aktuellstes Release {tag}",
releaseUnavailable: "Release-Status nicht verfügbar",
currentSource: "Aktuelle Quelle",
sourceCandidate: "Quell-Kandidat",
providerRoutes: "{count} Provider-Routen",
publishedRelease: "veröffentlichtes Release",
figcaptionSourceCandidate: "Quell-Kandidat",
shotSession: "Aktuelle Sitzung",
screenshotAlt:
"Aktuelle Codewhale-Terminalsitzung mit Operate-Modus, dem Wal, dem Composer und der Fußzeile",
figcaption: "Aktuelle Codewhale-Sitzung · Operate-Modus · Ask-Permission-Posture",
proofHeading: "Eine Unterwasser-Terminal-Shell. Jedes Modell. Auf deiner Maschine.",
proofBody:
"Bring das Modell mit, das du schon nutzt — gehostet, über Gateway oder lokal. Plan / Work / Operate und explizite Permission-Posturen halten den Tauchgang unter deiner Kontrolle.",
sealDecides: "法",
decidesEyebrow: "Sieh, wie es entscheidet",
decidesHeading: "Regeln, die du in der Trace sehen kannst",
decidesLede:
"Echte Sitzungsausschnitte — die gerankte Projekt-Law erscheint im Reasoning des Modells, nicht nur als Behauptung auf einer Landingpage.",
sealWorkflow: "行",
workflowHeading: "Von der Aufgabe zur verifizierten Änderung.",
workflow: [
["Inspizieren", "Repository, Anweisungen und Aufgabe lesen."],
["Handeln", "Dateien innerhalb expliziter Freigabegrenzen bearbeiten."],
["Verifizieren", "Checks ausführen und das Ergebnis prüfen."],
["Berichten", "Einen knappen, dauerhaften Laufzeitbeleg hinterlassen."],
],
receiptAria: "Beispiel-Laufzeitbeleg",
receiptInspect: "Repository und Anweisungen",
receiptAct: "Bearbeiten über die gewählte Permission-Posture",
receiptReport: "Checks bestanden · Beleg gespeichert",
sealStart: "起",
startHeading: "Neu bei Codewhale? Vier Schritte von Anfang bis Ende.",
startLede:
"Installieren → erste schlüssellose Sitzung → Provider verbinden → Fleet einrichten. Begriffe werden auf der Vokabularseite definiert.",
startGuideLink: "Leitfaden für die ersten Schritte lesen →",
startVocabularyLink: "Produktvokabular ansehen →",
sealBoundaries: "界",
boundariesHeadingA: "Dein Modell.",
boundariesHeadingB: "Deine Grenzen.",
boundariesBody:
"Wähle Modell, Arbeitsmodus und Permission-Posture explizit. Unbekannte Kosten bleiben als unbekannt deklariert, und Preview-Oberflächen bleiben als solche gekennzeichnet.",
hostedGatewayLocal: "Gehostete, Gateway- und lokale Modelle",
planActOperateDesc: "Von der Nur-Lese-Planung bis zum autonomen Operieren",
askAutoReviewDesc: "Permission-Posture für die Arbeit wählen",
tuiExecWebDesc: "Interaktive und Headless-Runtime-Oberflächen",
sealSurfaces: "面",
surfacesHeading: "Nutze die Runtime dort, wo die Arbeit passiert.",
surfaces: [
["TUI", "Interaktive Arbeit im Terminal"],
["codewhale exec", "Skripte und CI"],
["Web-Client", "Browser-Client, nur Loopback"],
["Runtime API + MCP", "Lokale Integrationen"],
["Fleet", "Dauerhafte Multi-Agenten-Arbeit"],
],
runtimeLink: "Runtime-Oberflächen und Stabilitätshinweise ansehen →",
installBandHeading: "Starte mit einem einzigen Befehl.",
binaries: "Binärdateien",
chinaMirrors: "China-Mirrors",
installGuideLink: "Installationsleitfaden lesen →",
sealCommunity: "众",
communityHeading: "Öffentlich gebaut",
communityBody:
"MIT-lizenziert und geprägt von Beitragenden aus Runtimes, Providern, Plattformen, Dokumentation und Tests.",
communityLinksAria: "Community-Links",
contribute: "Mitwirken",
};
+94
View File
@@ -0,0 +1,94 @@
import type { ChromeDict } from "../types";
/**
* French chrome dictionary.
*
* Native rewrite mirroring the current English direction — « any model, on
* your machine », pas l'ancien positionnement « local-first ». Registre en
* vouvoiement, aligné sur le pack TUI (crates/tui/locales/fr.json) :
* « Exécutez `{command}` pour confirmer ».
*
* Terminologie alignée sur le pack TUI : les modes et les postures de
* permissions restent littéraux (Plan / Work / Operate, Ask / Auto-Review /
* Full Access), « receipt » est « reçu », « runtime », `Fleet` et `TUI`
* restent des noms produits. L'apostrophe est typographique (’).
*
* Les libellés secondaires de navigation associent le libellé français à un
* court équivalent anglais — le couple han (文档 / 指引 / …) est le procédé
* éditorial propre à l'édition anglaise.
*/
export const chrome: ChromeDict = {
navDocs: "Documentation",
navStart: "Premiers pas",
navInstall: "Installer",
navFaq: "FAQ",
navCommunity: "Communauté",
navContribute: "Contribuer",
navDocsSecondary: "Docs",
navStartSecondary: "Start",
navInstallSecondary: "Install",
navFaqSecondary: "FAQ",
navCommunitySecondary: "Community",
navContributeSecondary: "Contribute",
skipToContent: "Aller au contenu principal",
navPrimaryAria: "Navigation principale",
navHomeAria: "Accueil de Codewhale",
installCta: "Installer →",
wordmarkSeal: "深",
wordmarkTag: "n’importe quel modèle, sur votre machine",
issueLabel: "Édition du {date}",
dateLocale: "fr-FR",
starsAria: "Étoiles GitHub",
githubFallback: "GitHub",
tickerLiveLabel: "En direct",
tickerLiveTag: "LIVE",
tickerMerged: "fusionné",
tickerOpened: "ouvert",
tickerClosed: "fermé",
tickerReleased: "publié",
tickerFirstContribution: "première contribution",
tickerBy: "par {handle}",
tickerAria: "Activité récente du dépôt",
traceLabel: "trace de raisonnement",
traceTabsAria: "Extraits de session",
menuOpen: "Ouvrir le menu",
menuClose: "Fermer le menu",
themeAuto: "auto",
themeLight: "clair",
themeDark: "sombre",
themeAria: "Thème de la documentation : {mode} (cliquer pour changer)",
themeTitle: "Thème de la documentation · auto / clair / sombre",
footerTagline:
"Codewhale plonge dans les profondeurs à votre place — documentation, code source et communauté du runtime open source.",
footerProduct: "Produit",
footerProject: "Projet",
footerDocs: "Documentation",
footerGuide: "Premiers pas",
footerInstall: "Installation",
footerModels: "Modèles",
footerRuntime: "Runtime",
footerFaq: "FAQ",
footerIssues: "Issues",
footerContribute: "Contribuer",
footerLicense: "Licence MIT",
footerCanonicalSource: "Source canonique : ",
footerReleases: " · Versions : ",
footerReleasesLink: "Versions GitHub",
footerSecurity: "Sécurité",
switcherLabel: "Langue",
switcherSwitchTo: "Passer en {label}",
partialBadge: "(partiel)",
};
@@ -0,0 +1,21 @@
import type { DocsGuideDict } from "../types";
/**
* French dictionary for the docs "Getting started" page. Nominal French
* typography for a Latin-script locale — the reference body class is kept.
*/
export const docsGuide: DocsGuideDict = {
metaTitle: "Premiers pas · Documentation Codewhale",
metaDescription:
"Le parcours complet de l’installation à votre Fleet idéale : installation, première session sans clé, connexion d’un fournisseur et configuration de la Fleet.",
bodyClassName: "text-ink-soft leading-relaxed",
overviewTitle: "Premiers pas",
overviewLead:
"Quatre étapes d’une commande d’installation à une Fleet prête pour votre travail. Chaque étape ne décrit que ce que le candidat actuel fait réellement ; tout ce qui n’est pas publié ou enregistré est étiqueté comme tel.",
sessionTitle: "Regarder une vraie session",
sessionLead:
"Ci-dessous, l’emplacement réservé au média de session réelle. Il est volontairement en attente : tant que l’enregistrement dogfood du candidat v0.9.2 n’existe pas, ce site n’affiche ni séquence fictive ni image de substitution.",
nextTitle: "Et ensuite",
sourceNote:
"Documents sources : docs/GUIDE.md, docs/KEYBINDINGS.md · Le texte des étapes vit dans web/lib/content/getting-started.ts ; mettez à jour docs-map.ts en cas de modification.",
};
+109
View File
@@ -0,0 +1,109 @@
import type { HomeDict } from "../types";
/**
* French home dictionary — la page d’accueil « journal-océan ».
*
* Réécriture native dans la direction actuelle de l’anglais : apportez
* votre modèle, tout se passe sur votre machine. Le vocabulaire produit
* reste littéral et aligné sur le pack TUI : Plan / Work / Operate,
* Ask / Auto-Review / Full Access, Codewhale, TUI, `codewhale exec`,
* Runtime API + MCP, Fleet, Node 18+, Rust, MIT.
*
* Les sceaux de section (法, 行, …) sont des glyphes partagés avec
* l’édition anglaise — des marques, pas de la prose.
*/
export const home: HomeDict = {
metaTitle: "Codewhale — plonge dans les profondeurs à votre place.",
metaDescription:
"Codewhale plonge dans les profondeurs à votre place — un agent de codage open source pour le terminal. Apportez votre modèle. Sur votre machine. En Rust, sous licence MIT.",
kicker: "Open source · Apportez votre modèle · Dans votre terminal",
heroTitleA: "Codewhale plonge dans les profondeurs",
heroTitleB: "pour que vous n’ayez pas à le faire.",
heroIntro:
"{brand} est un agent de codage open source pour votre terminal. Donnez-lui un modèle et une tâche : il lit votre code, modifie les fichiers, lance ses propres vérifications et s’arrête quand le travail est fini ou quand il a besoin de vous. Apportez n’importe quel modèle, ou mélangez-les : épinglez un modèle différent pour chaque rôle.",
install: "Installer",
docs: "Documentation",
copy: "Copier",
copied: "Copié ✓",
installEyebrow: "installation en une ligne",
installRequirement: "nécessite Node 18+ — aucune chaîne d’outils Rust",
installOtherWays: "autres méthodes →",
latestRelease: "Dernière version {tag}",
releaseUnavailable: "État des versions indisponible",
currentSource: "Source actuelle",
sourceCandidate: "Source candidate",
providerRoutes: "{count} routes de fournisseurs",
publishedRelease: "version publiée",
figcaptionSourceCandidate: "source candidate",
shotSession: "Session en cours",
screenshotAlt:
"Session Codewhale actuelle dans le terminal : mode Operate, la baleine, le composeur et le pied de page",
figcaption: "Session Codewhale actuelle · mode Operate · posture de permissions Ask",
proofHeading: "Un shell sous-marin. N’importe quel modèle. Sur votre machine.",
proofBody:
"Apportez le modèle que vous utilisez déjà — hébergé, passerelle ou local. Plan / Work / Operate et des postures de permissions explicites gardent la plongée sous votre contrôle.",
sealDecides: "法",
decidesEyebrow: "Voir comment il décide",
decidesHeading: "Des règles visibles dans la trace",
decidesLede:
"Des extraits de sessions réelles : la hiérarchie des règles du projet apparaît dans le raisonnement du modèle, ce n’est pas une simple promesse de page d’accueil.",
sealWorkflow: "行",
workflowHeading: "De la tâche au changement vérifié.",
workflow: [
["Inspecter", "Lire le dépôt, ses instructions et la tâche."],
["Agir", "Modifier les fichiers dans des limites d’approbation explicites."],
["Vérifier", "Lancer les vérifications et examiner le résultat."],
["Rendre compte", "Laisser un reçu concis et durable."],
],
receiptAria: "Exemple de reçu de travail",
receiptInspect: "dépôt et instructions",
receiptAct: "modification selon la posture de permissions choisie",
receiptReport: "vérifications passées · reçu enregistré",
sealStart: "起",
startHeading: "Nouveau sur Codewhale ? Quatre étapes de bout en bout.",
startLede:
"Installer → première session sans clé → connecter un fournisseur → configurer votre Fleet. Les termes sont définis sur la page de vocabulaire.",
startGuideLink: "Lire le guide de démarrage →",
startVocabularyLink: "Voir le vocabulaire du produit →",
sealBoundaries: "界",
boundariesHeadingA: "Votre modèle.",
boundariesHeadingB: "Vos limites.",
boundariesBody:
"Choisissez explicitement le modèle, le mode de travail et la posture de permissions. Un coût inconnu reste déclaré inconnu, et les surfaces en préversion restent étiquetées comme telles.",
hostedGatewayLocal: "Modèles hébergés, passerelle et locaux",
planActOperateDesc: "De la planification en lecture seule à l’opération autonome",
askAutoReviewDesc: "Choisir la posture de permissions pour le travail",
tuiExecWebDesc: "Surfaces de runtime interactives et sans interface",
sealSurfaces: "面",
surfacesHeading: "Utilisez le runtime là où se fait le travail.",
surfaces: [
["TUI", "Travail interactif dans le terminal"],
["codewhale exec", "Scripts et CI"],
["Client web", "Client navigateur en boucle locale uniquement"],
["Runtime API + MCP", "Intégrations locales"],
["Fleet", "Travail multi-agents durable"],
],
runtimeLink: "Voir les surfaces du runtime et les notes de stabilité →",
installBandHeading: "Commencez avec une seule commande.",
binaries: "Binaires",
chinaMirrors: "Miroirs en Chine",
installGuideLink: "Lire le guide d’installation →",
sealCommunity: "众",
communityHeading: "Construit en public",
communityBody:
"Sous licence MIT et façonné par des contributeurs sur les runtimes, les fournisseurs, les plateformes, la documentation et les tests.",
communityLinksAria: "Liens de la communauté",
contribute: "Contribuer",
};
+92
View File
@@ -0,0 +1,92 @@
import type { ChromeDict } from "../types";
/**
* Hindi chrome dictionary.
*
* मानक हिन्दी, तुरंत-बरती तकनीकी शब्दावली के साथ — TUI पैक
* (crates/tui/locales/hi.json) के रजिस्टर से मेल खाता हुआ: «समीक्षा करें»,
* «चलाएँ»। अंग्रेज़ी की वर्तमान दिशा दर्शाती मूल पुनर्लेखन — कोई भी मॉडल,
* आपकी मशीन पर।
*
* मोड और अनुमति-मुद्रा (posture) literal रहते हैं (Plan / Work / Operate,
* Ask / Auto-Review / Full Access); `Runtime`, `Fleet`, `TUI` उत्पाद-नाम
* हैं और ऐसे ही रहते हैं।
*
* सेकेंडरी नेविगेशन लेबल हिन्दी मुख्य लेबल के साथ छोटा अंग्रेज़ी साथी
* रखते हैं — हन जोड़ी अंग्रेज़ी संस्करण का अपना संपादकीय उपकरण है।
*/
export const chrome: ChromeDict = {
navDocs: "दस्तावेज़ीकरण",
navStart: "शुरुआत",
navInstall: "इंस्टॉल",
navFaq: "सामान्य प्रश्न",
navCommunity: "समुदाय",
navContribute: "योगदान",
navDocsSecondary: "Docs",
navStartSecondary: "Start",
navInstallSecondary: "Install",
navFaqSecondary: "FAQ",
navCommunitySecondary: "Community",
navContributeSecondary: "Contribute",
skipToContent: "मुख्य सामग्री पर जाएँ",
navPrimaryAria: "मुख्य नेविगेशन",
navHomeAria: "Codewhale होम",
installCta: "इंस्टॉल करें →",
wordmarkSeal: "深",
wordmarkTag: "कोई भी मॉडल, आपकी मशीन पर",
issueLabel: "{date} का अंक",
dateLocale: "hi-IN",
starsAria: "GitHub स्टार",
githubFallback: "GitHub",
tickerLiveLabel: "लाइव",
tickerLiveTag: "LIVE",
tickerMerged: "मर्ज",
tickerOpened: "खोला गया",
tickerClosed: "बंद किया गया",
tickerReleased: "रिलीज़ हुआ",
tickerFirstContribution: "पहला योगदान",
tickerBy: "{handle} द्वारा",
tickerAria: "रिपॉज़िटरी की हालिया गतिविधि",
traceLabel: "रीज़निंग ट्रेस",
traceTabsAria: "सेशन के अंश",
menuOpen: "मेनू खोलें",
menuClose: "मेनू बंद करें",
themeAuto: "ऑटो",
themeLight: "लाइट",
themeDark: "डार्क",
themeAria: "दस्तावेज़ीकरण थीम: {mode} (बदलने के लिए क्लिक करें)",
themeTitle: "दस्तावेज़ीकरण थीम · ऑटो / लाइट / डार्क",
footerTagline:
"गहराई में Codewhale उतरता है, आपको नहीं उतरना पड़ता — ओपन सोर्स रनटाइम के लिए दस्तावेज़, सोर्स और समुदाय।",
footerProduct: "उत्पाद",
footerProject: "प्रोजेक्ट",
footerDocs: "दस्तावेज़ीकरण",
footerGuide: "शुरुआत कैसे करें",
footerInstall: "इंस्टॉल",
footerModels: "मॉडल",
footerRuntime: "Runtime",
footerFaq: "सामान्य प्रश्न",
footerIssues: "Issues",
footerContribute: "योगदान दें",
footerLicense: "MIT लाइसेंस",
footerCanonicalSource: "कैननिकल सोर्स: ",
footerReleases: " · रिलीज़: ",
footerReleasesLink: "GitHub रिलीज़",
footerSecurity: "सुरक्षा",
switcherLabel: "भाषा",
switcherSwitchTo: "{label} पर स्विच करें",
partialBadge: "(आंशिक)",
};
@@ -0,0 +1,21 @@
import type { DocsGuideDict } from "../types";
/**
* Hindi dictionary for the docs "Getting started" page. Devanagari gets a
* touch more leading than the Latin reference, short of the CJK treatment.
*/
export const docsGuide: DocsGuideDict = {
metaTitle: "शुरुआत कैसे करें · Codewhale दस्तावेज़ीकरण",
metaDescription:
"इंस्टॉल से लेकर आपकी आदर्श Fleet तक का पूरा रास्ता: इंस्टॉल, बिना कुंजी पहला सेशन, प्रोवाइडर कनेक्शन और Fleet सेटअप।",
bodyClassName: "text-ink-soft leading-loose",
overviewTitle: "शुरुआत कैसे करें",
overviewLead:
"एक इंस्टॉल कमांड से लेकर आपके काम के लिए तैयार Fleet तक, चार कदम। हर कदम केवल वही बताता है जो वर्तमान कैंडिडेट वास्तव में करता है; जो अप्रकाशित या अभिलिखित-नहीं है, वह स्पष्ट रूप से चिह्नित है।",
sessionTitle: "एक असली सेशन देखें",
sessionLead:
"नीचे असली-सेशन मीडिया की जगह है। यह जानबूझकर प्रतीक्षारत स्थिति में है: जब तक v0.9.2 कैंडिडेट की dogfood रिकॉर्डिंग मौजूद नहीं है, यह साइट कोई प्लेसहोल्डर या नकली फ़ुटेज नहीं दिखाती।",
nextTitle: "आगे क्या",
sourceNote:
"स्रोत दस्तावेज़: docs/GUIDE.md, docs/KEYBINDINGS.md · कदमों का पाठ web/lib/content/getting-started.ts में है; बदलाव पर docs-map.ts भी अपडेट करें।",
};
+108
View File
@@ -0,0 +1,108 @@
import type { HomeDict } from "../types";
/**
* Hindi home dictionary — «अख़बार-महासागर» लैंडिंग पेज।
*
* अंग्रेज़ी की वर्तमान दिशा में मूल पुनर्लेखन: मॉडल अपना लाइए, सब कुछ आपकी
* मशीन पर। उत्पाद-शब्दावली TUI पैक की तरह literal रहती है: Plan / Work /
* Operate, Ask / Auto-Review / Full Access, Codewhale, TUI,
* `codewhale exec`, Runtime API + MCP, Fleet, Node 18+, Rust, MIT।
*
* सेक्शन-मुहरें (法, 行, …) अंग्रेज़ी संस्करण के साथ साझा ग्लिफ़ हैं —
* चिह्न, गद्य नहीं।
*/
export const home: HomeDict = {
metaTitle: "Codewhale — गहराई में यह उतरता है, आपको नहीं।",
metaDescription:
"गहराई में Codewhale उतरता है, आपको नहीं उतरना पड़ता — टर्मिनल के लिए ओपन सोर्स कोडिंग एजेंट। अपना मॉडल लाइए। आपकी मशीन पर चलता है। Rust, MIT।",
kicker: "ओपन सोर्स · अपना मॉडल लाइए · टर्मिनल में चलता है",
heroTitleA: "Codewhale गहराई में उतरता है",
heroTitleB: "ताकि आपको न उतरना पड़े।",
heroIntro:
"{brand} आपके टर्मिनल के लिए एक ओपन सोर्स कोडिंग एजेंट है। इसे एक मॉडल और एक काम दें — यह आपका कोड पढ़ता है, फ़ाइलें संपादित करता है, अपनी जाँचें खुद चलाता है, और काम पूरा होने पर या आपकी ज़रूरत पड़ने पर रुक जाता है। कोई भी मॉडल लाइए, या उन्हें मिलाइए: हर भूमिका के लिए अलग मॉडल तय करें।",
install: "इंस्टॉल करें",
docs: "दस्तावेज़ीकरण",
copy: "कॉपी करें",
copied: "कॉपी हो गया ✓",
installEyebrow: "एक पंक्ति में इंस्टॉल",
installRequirement: "Node 18+ चाहिए — Rust टूलचेन नहीं",
installOtherWays: "अन्य तरीके →",
latestRelease: "नवीनतम रिलीज़ {tag}",
releaseUnavailable: "रिलीज़ स्थिति उपलब्ध नहीं",
currentSource: "वर्तमान सोर्स",
sourceCandidate: "सोर्स कैंडिडेट",
providerRoutes: "{count} प्रोवाइडर रूट",
publishedRelease: "प्रकाशित रिलीज़",
figcaptionSourceCandidate: "सोर्स कैंडिडेट",
shotSession: "वर्तमान सेशन",
screenshotAlt:
"Codewhale का वर्तमान टर्मिनल सेशन — Operate मोड, व्हेल, कंपोज़र और फ़ुटर दिख रहे हैं",
figcaption: "Codewhale का वर्तमान सेशन · Operate मोड · Ask अनुमति-मुद्रा",
proofHeading: "एक जलमग्न टर्मिनल शेल। कोई भी मॉडल। आपकी मशीन पर।",
proofBody:
"जो मॉडल आप पहले से उपयोग करते हैं वही लाइए — होस्टेड, गेटवे या लोकल। Plan / Work / Operate और स्पष्ट अनुमति-मुद्राएँ डाइव को आपके नियंत्रण में रखती हैं।",
sealDecides: "法",
decidesEyebrow: "देखिए यह कैसे निर्णय लेता है",
decidesHeading: "नियम जो ट्रेस में दिखते हैं",
decidesLede:
"असली सेशन के अंश — प्रोजेक्ट के रैंक्ड नियम मॉडल की रीज़निंग में दिखाई देते हैं, यह सिर्फ़ लैंडिंग पेज का दावा नहीं है।",
sealWorkflow: "行",
workflowHeading: "काम से सत्यापित बदल तक।",
workflow: [
["अवलोकन", "रिपॉज़िटरी, उसके निर्देश और काम पढ़ें।"],
["कार्य", "स्पष्ट स्वीकृति-सीमाओं के भीतर फ़ाइलें संपादित करें।"],
["सत्यापन", "जाँचें चलाएँ और परिणाम देखें।"],
["रिपोर्ट", "एक संक्षिप्त, टिकाऊ रसीद छोड़ें।"],
],
receiptAria: "काम की रसीद का उदाहरण",
receiptInspect: "रिपॉज़िटरी और निर्देश",
receiptAct: "चुनी गई अनुमति-मुद्रा से संपादन",
receiptReport: "जाँचें पास · रसीद सहेजी गई",
sealStart: "起",
startHeading: "Codewhale पर नए हैं? शुरू से अंत तक चार कदम।",
startLede:
"इंस्टॉल → बिना कुंजी पहला सेशन → प्रोवाइडर जोड़ें → अपनी Fleet सेट करें। शब्दावली पेज पर परिभाषित हैं।",
startGuideLink: "शुरुआती गाइड पढ़ें →",
startVocabularyLink: "उत्पाद शब्दावली देखें →",
sealBoundaries: "界",
boundariesHeadingA: "आपका मॉडल।",
boundariesHeadingB: "आपकी सीमाएँ।",
boundariesBody:
"मॉडल, कार्य-मोड और अनुमति-मुद्रा स्पष्ट रूप से चुनें। अज्ञात लागत अज्ञात ही रहती है, और प्रीव्यू सतहें स्पष्ट रूप से चिह्नित रहती हैं।",
hostedGatewayLocal: "होस्टेड, गेटवे और लोकल मॉडल",
planActOperateDesc: "केवल-पढ़ने योजना से स्वायत्त संचालन तक",
askAutoReviewDesc: "काम के लिए अनुमति-मुद्रा चुनें",
tuiExecWebDesc: "इंटरैक्टिव और हेडलेस रनटाइम सतहें",
sealSurfaces: "面",
surfacesHeading: "रनटाइम को वहीं उपयोग करें जहाँ काम होता है।",
surfaces: [
["TUI", "टर्मिनल में इंटरैक्टिव काम"],
["codewhale exec", "स्क्रिप्ट और CI"],
["वेब क्लाइंट", "केवल-लूपबैक ब्राउज़र क्लाइंट"],
["Runtime API + MCP", "लोकल इंटीग्रेशन"],
["Fleet", "टिकाऊ मल्टी-एजेंट काम"],
],
runtimeLink: "रनटाइम सतहें और स्थिरता टिप्पणियाँ देखें →",
installBandHeading: "एक ही कमांड से शुरू करें।",
binaries: "बाइनरी",
chinaMirrors: "चीन मिरर",
installGuideLink: "इंस्टॉल गाइड पढ़ें →",
sealCommunity: "众",
communityHeading: "खुले में निर्मित",
communityBody:
"MIT-लाइसेंस प्राप्त और रनटाइम, प्रोवाइडर, प्लेटफ़ॉर्म, दस्तावेज़ीकरण और परीक्षणों के योगदानकर्ताओं द्वारा गढ़ा गया।",
communityLinksAria: "समुदाय लिंक",
contribute: "योगदान दें",
};
+48
View File
@@ -31,6 +31,30 @@ import { chrome as ukChrome } from "./uk/chrome";
import { home as ukHome } from "./uk/home";
import { chrome as esChrome } from "./es/chrome";
import { home as esHome } from "./es/home";
import { chrome as frChrome } from "./fr/chrome";
import { home as frHome } from "./fr/home";
import { docsGuide as frDocsGuide } from "./fr/docs-guide";
import { chrome as deChrome } from "./de/chrome";
import { home as deHome } from "./de/home";
import { docsGuide as deDocsGuide } from "./de/docs-guide";
import { chrome as caChrome } from "./ca/chrome";
import { home as caHome } from "./ca/home";
import { docsGuide as caDocsGuide } from "./ca/docs-guide";
import { chrome as hiChrome } from "./hi/chrome";
import { home as hiHome } from "./hi/home";
import { docsGuide as hiDocsGuide } from "./hi/docs-guide";
import { chrome as trChrome } from "./tr/chrome";
import { home as trHome } from "./tr/home";
import { docsGuide as trDocsGuide } from "./tr/docs-guide";
import { chrome as itChrome } from "./it/chrome";
import { home as itHome } from "./it/home";
import { docsGuide as itDocsGuide } from "./it/docs-guide";
import { chrome as plChrome } from "./pl/chrome";
import { home as plHome } from "./pl/home";
import { docsGuide as plDocsGuide } from "./pl/docs-guide";
import { chrome as arChrome } from "./ar/chrome";
import { home as arHome } from "./ar/home";
import { docsGuide as arDocsGuide } from "./ar/docs-guide";
import { chrome as ptBrChrome } from "./pt-BR/chrome";
import { home as ptBrHome } from "./pt-BR/home";
import { chrome as idChrome } from "./id/chrome";
@@ -44,6 +68,14 @@ const CHROME: Record<string, ChromeDict> = {
ru: ruChrome,
uk: ukChrome,
es: esChrome,
fr: frChrome,
de: deChrome,
ca: caChrome,
hi: hiChrome,
tr: trChrome,
it: itChrome,
pl: plChrome,
ar: arChrome,
"pt-BR": ptBrChrome,
id: idChrome,
};
@@ -56,6 +88,14 @@ const HOME: Record<string, HomeDict> = {
ru: ruHome,
uk: ukHome,
es: esHome,
fr: frHome,
de: deHome,
ca: caHome,
hi: hiHome,
tr: trHome,
it: itHome,
pl: plHome,
ar: arHome,
"pt-BR": ptBrHome,
id: idHome,
};
@@ -72,6 +112,14 @@ export const DICTIONARY_LOCALES = Object.keys(CHROME) as readonly string[];
*/
const DOCS_GUIDE: Record<string, DocsGuideDict> = {
zh: zhDocsGuide,
fr: frDocsGuide,
de: deDocsGuide,
ca: caDocsGuide,
hi: hiDocsGuide,
tr: trDocsGuide,
it: itDocsGuide,
pl: plDocsGuide,
ar: arDocsGuide,
};
export function getChrome(locale: string): ChromeDict {
+92
View File
@@ -0,0 +1,92 @@
import type { ChromeDict } from "../types";
/**
* Italian chrome dictionary.
*
* Riscrittura nativa nella direzione inglese attuale — «any model, on your
* machine», non il ritirato posizionamento «local-first». Registro con il
* tu, lo standard dei tool per sviluppatori in italiano.
*
* I modi e le posture di permesso restano letterali (Plan / Work / Operate,
* Ask / Auto-Review / Full Access); `Runtime`, `Fleet` e `TUI` restano nomi
* di prodotto; «ricevuta» è receipt.
*
* Le etichette secondarie di navigazione abbinano l'etichetta italiana a
* una breve controparte inglese — la coppia Han è il dispositivo editoriale
* dell'edizione inglese.
*/
export const chrome: ChromeDict = {
navDocs: "Documentazione",
navStart: "Inizia",
navInstall: "Installa",
navFaq: "FAQ",
navCommunity: "Comunità",
navContribute: "Contribuisci",
navDocsSecondary: "Docs",
navStartSecondary: "Start",
navInstallSecondary: "Install",
navFaqSecondary: "FAQ",
navCommunitySecondary: "Community",
navContributeSecondary: "Contribute",
skipToContent: "Vai al contenuto principale",
navPrimaryAria: "Navigazione principale",
navHomeAria: "Home di Codewhale",
installCta: "Installa →",
wordmarkSeal: "深",
wordmarkTag: "qualsiasi modello, sulla tua macchina",
issueLabel: "Edizione del {date}",
dateLocale: "it-IT",
starsAria: "Stelle GitHub",
githubFallback: "GitHub",
tickerLiveLabel: "In diretta",
tickerLiveTag: "LIVE",
tickerMerged: "unito",
tickerOpened: "aperto",
tickerClosed: "chiuso",
tickerReleased: "pubblicato",
tickerFirstContribution: "prima contribuzione",
tickerBy: "di {handle}",
tickerAria: "Attività recente del repository",
traceLabel: "traccia di ragionamento",
traceTabsAria: "Stralci di sessione",
menuOpen: "Apri il menu",
menuClose: "Chiudi il menu",
themeAuto: "auto",
themeLight: "chiaro",
themeDark: "scuro",
themeAria: "Tema della documentazione: {mode} (clic per cambiare)",
themeTitle: "Tema della documentazione · auto / chiaro / scuro",
footerTagline:
"Codewhale si tuffa negli abissi al posto tuo — documentazione, sorgente e community per il runtime open source.",
footerProduct: "Prodotto",
footerProject: "Progetto",
footerDocs: "Documentazione",
footerGuide: "Primi passi",
footerInstall: "Installazione",
footerModels: "Modelli",
footerRuntime: "Runtime",
footerFaq: "FAQ",
footerIssues: "Issues",
footerContribute: "Contribuisci",
footerLicense: "Licenza MIT",
footerCanonicalSource: "Sorgente canonico: ",
footerReleases: " · Release: ",
footerReleasesLink: "Release di GitHub",
footerSecurity: "Sicurezza",
switcherLabel: "Lingua",
switcherSwitchTo: "Passa a {label}",
partialBadge: "(parziale)",
};
@@ -0,0 +1,21 @@
import type { DocsGuideDict } from "../types";
/**
* Italian dictionary for the docs "Getting started" page. Latin script —
* the reference body typography is kept.
*/
export const docsGuide: DocsGuideDict = {
metaTitle: "Primi passi · Documentazione di Codewhale",
metaDescription:
"Il percorso completo dall'installazione alla Fleet ideale: installazione, una prima sessione senza chiavi, collegamento di un provider e configurazione della Fleet.",
bodyClassName: "text-ink-soft leading-relaxed",
overviewTitle: "Primi passi",
overviewLead:
"Quattro passi da un comando d'installazione a una Fleet pronta per il tuo lavoro. Ogni passo afferma solo ciò che il candidato attuale fa davvero; tutto ciò che non è rilasciato o registrato è etichettato come tale.",
sessionTitle: "Guarda una sessione reale",
sessionLead:
"Qui sotto c'è lo slot multimediale della sessione reale. È volutamente in stato pending: finché non esiste la registrazione dogfood del candidato v0.9.2, questo sito non mostra segnaposto o riprese preparate.",
nextTitle: "E adesso",
sourceNote:
"Documenti sorgente: docs/GUIDE.md, docs/KEYBINDINGS.md · Il testo dei passi vive in web/lib/content/getting-started.ts; aggiorna docs-map.ts quando lo cambi.",
};
+109
View File
@@ -0,0 +1,109 @@
import type { HomeDict } from "../types";
/**
* Italian home dictionary — la landing «giornale-oceano».
*
* Riscrittura nativa nella direzione inglese attuale: porta il tuo modello,
* tutto avviene sulla tua macchina. Il vocabolario di prodotto resta
* letterale come nel pack TUI: Plan / Work / Operate, Ask / Auto-Review /
* Full Access, Codewhale, TUI, `codewhale exec`, Runtime API + MCP, Fleet,
* Node 18+, Rust, MIT.
*
* I sigilli di sezione (法, 行, …) sono glifi condivisi con l'edizione
* inglese — marchi, non prosa.
*/
export const home: HomeDict = {
metaTitle: "Codewhale — si tuffa negli abissi al posto tuo.",
metaDescription:
"Codewhale si tuffa negli abissi al posto tuo — un agente di coding open source per il terminale. Porta il tuo modello. Gira sulla tua macchina. Rust, MIT.",
kicker: "Open source · Porta il tuo modello · Nel tuo terminale",
heroTitleA: "Codewhale si tuffa negli abissi",
heroTitleB: "così non devi farlo tu.",
heroIntro:
"{brand} è un agente di coding open source per il tuo terminale. Dagli un modello e un compito: legge il tuo codice, modifica i file, esegue i suoi controlli e si ferma quando il lavoro è finito o quando serve te. Porta qualsiasi modello, o mescolali: fissa un modello diverso per ciascun ruolo.",
install: "Installa",
docs: "Documentazione",
copy: "Copia",
copied: "Copiato ✓",
installEyebrow: "installazione in una riga",
installRequirement: "serve Node 18+ — nessuna toolchain Rust",
installOtherWays: "altri modi →",
latestRelease: "Ultima release {tag}",
releaseUnavailable: "Stato delle release non disponibile",
currentSource: "Sorgente attuale",
sourceCandidate: "Sorgente candidato",
providerRoutes: "{count} route di provider",
publishedRelease: "release pubblicata",
figcaptionSourceCandidate: "sorgente candidato",
shotSession: "Sessione corrente",
screenshotAlt:
"Sessione corrente di Codewhale nel terminale: modalità Operate, la balena, il compositore e il piè di pagina",
figcaption: "Sessione corrente di Codewhale · modalità Operate · postura di permessi Ask",
proofHeading: "Una shell sottomarina. Qualsiasi modello. Sulla tua macchina.",
proofBody:
"Porta il modello che già usi — hosted, via gateway o locale. Plan / Work / Operate e le posture di permessi esplicite tengono l'immersione sotto il tuo controllo.",
sealDecides: "法",
decidesEyebrow: "Guarda come decide",
decidesHeading: "Regole che vedi nella traccia",
decidesLede:
"Stralci di sessioni reali: la gerarchia di regole del progetto è visibile nel ragionamento del modello, non è solo la promessa di una landing.",
sealWorkflow: "行",
workflowHeading: "Dal compito alla modifica verificata.",
workflow: [
["Ispezionare", "Leggere il repository, le sue istruzioni e il compito."],
["Agire", "Modificare i file entro confini di approvazione espliciti."],
["Verificare", "Eseguire i controlli ed esaminare il risultato."],
["Riferire", "Lasciare una ricevuta concisa e durevole."],
],
receiptAria: "Esempio di ricevuta di lavoro",
receiptInspect: "repository e istruzioni",
receiptAct: "modifiche con la postura di permessi scelta",
receiptReport: "controlli superati · ricevuta salvata",
sealStart: "起",
startHeading: "Nuovo su Codewhale? Quattro passi dall'inizio alla fine.",
startLede:
"Installare → prima sessione senza chiavi → collegare un provider → configurare la tua Fleet. I termini sono definiti nella pagina del vocabolario.",
startGuideLink: "Leggi la guida introduttiva →",
startVocabularyLink: "Vedi il vocabolario del prodotto →",
sealBoundaries: "界",
boundariesHeadingA: "Il tuo modello.",
boundariesHeadingB: "I tuoi confini.",
boundariesBody:
"Scegli esplicitamente modello, modalità di lavoro e postura di permessi. Un costo sconosciuto resta dichiarato sconosciuto, e le superfici in anteprima restano etichettate come tali.",
hostedGatewayLocal: "Modelli hosted, via gateway e locali",
planActOperateDesc: "Dalla pianificazione in sola lettura all'operazione autonoma",
askAutoReviewDesc: "Scegli la postura di permessi per il lavoro",
tuiExecWebDesc: "Superfici di runtime interattive e headless",
sealSurfaces: "面",
surfacesHeading: "Usa il runtime dove avviene il lavoro.",
surfaces: [
["TUI", "Lavoro interattivo nel terminale"],
["codewhale exec", "Script e CI"],
["Client web", "Client browser, solo in loopback"],
["Runtime API + MCP", "Integrazioni locali"],
["Fleet", "Lavoro multi-agente durevole"],
],
runtimeLink: "Vedi le superfici del runtime e le note di stabilità →",
installBandHeading: "Inizia con un solo comando.",
binaries: "Binari",
chinaMirrors: "Mirror in Cina",
installGuideLink: "Leggi la guida d'installazione →",
sealCommunity: "众",
communityHeading: "Costruito in pubblico",
communityBody:
"Con licenza MIT e plasmato da contributor su runtime, provider, piattaforme, documentazione e test.",
communityLinksAria: "Link della community",
contribute: "Contribuisci",
};
+91
View File
@@ -0,0 +1,91 @@
import type { ChromeDict } from "../types";
/**
* Polish chrome dictionary.
*
* Natywny przekład w aktualnym kierunku angielskiego — „any model, on your
* machine", bez wycofanego pozycjonowania „local-first". Rejestr bezpośredni
* (ty), standard polskich narzędzi deweloperskich.
*
* Tryby i postawy uprawnień zostają dosłowne (Plan / Work / Operate, Ask /
* Auto-Review / Full Access); `Runtime`, `Fleet` i `TUI` to nazwy produktu;
* „receipt" to potwierdzenie.
*
* Drugie etykiety nawigacji parują polską etykietę z krótkim angielskim
* odpowiednikiem — para han to zabieg redakcyjny wydania angielskiego.
*/
export const chrome: ChromeDict = {
navDocs: "Dokumentacja",
navStart: "Pierwsze kroki",
navInstall: "Instalacja",
navFaq: "FAQ",
navCommunity: "Społeczność",
navContribute: "Współtwórz",
navDocsSecondary: "Docs",
navStartSecondary: "Start",
navInstallSecondary: "Install",
navFaqSecondary: "FAQ",
navCommunitySecondary: "Community",
navContributeSecondary: "Contribute",
skipToContent: "Przejdź do treści głównej",
navPrimaryAria: "Nawigacja główna",
navHomeAria: "Strona główna Codewhale",
installCta: "Instaluj →",
wordmarkSeal: "深",
wordmarkTag: "dowolny model, na twojej maszynie",
issueLabel: "Wydanie z {date}",
dateLocale: "pl-PL",
starsAria: "Gwiazdki na GitHubie",
githubFallback: "GitHub",
tickerLiveLabel: "Na żywo",
tickerLiveTag: "LIVE",
tickerMerged: "scalono",
tickerOpened: "otwarto",
tickerClosed: "zamknięto",
tickerReleased: "wydano",
tickerFirstContribution: "pierwszy wkład",
tickerBy: "autor: {handle}",
tickerAria: "Ostatnia aktywność w repozytorium",
traceLabel: "ślad rozumowania",
traceTabsAria: "Fragmenty sesji",
menuOpen: "Otwórz menu",
menuClose: "Zamknij menu",
themeAuto: "auto",
themeLight: "jasny",
themeDark: "ciemny",
themeAria: "Motyw dokumentacji: {mode} (kliknij, aby przełączyć)",
themeTitle: "Motyw dokumentacji · auto / jasny / ciemny",
footerTagline:
"Codewhale zanurza się w głębinach, żebyś ty nie musiał — dokumentacja, kod źródłowy i społeczność otwartoźródłowego runtime'u.",
footerProduct: "Produkt",
footerProject: "Projekt",
footerDocs: "Dokumentacja",
footerGuide: "Pierwsze kroki",
footerInstall: "Instalacja",
footerModels: "Modele",
footerRuntime: "Runtime",
footerFaq: "FAQ",
footerIssues: "Issues",
footerContribute: "Współtwórz",
footerLicense: "Licencja MIT",
footerCanonicalSource: "Repozytorium źródłowe: ",
footerReleases: " · Wydania: ",
footerReleasesLink: "Wydania na GitHubie",
footerSecurity: "Bezpieczeństwo",
switcherLabel: "Język",
switcherSwitchTo: "Przełącz na: {label}",
partialBadge: "(częściowo)",
};
@@ -0,0 +1,21 @@
import type { DocsGuideDict } from "../types";
/**
* Polish dictionary for the docs "Getting started" page. Latin script —
* the reference body typography is kept.
*/
export const docsGuide: DocsGuideDict = {
metaTitle: "Pierwsze kroki · Dokumentacja Codewhale",
metaDescription:
"Pełna droga od instalacji do idealnej Floty: instalacja, pierwsza sesja bez kluczy, podpięcie providera i konfiguracja Floty.",
bodyClassName: "text-ink-soft leading-relaxed",
overviewTitle: "Pierwsze kroki",
overviewLead:
"Cztery kroki od jednej komendy instalacji do Floty gotowej do twojej pracy. Każdy krok opisuje wyłącznie to, co obecny kandydat faktycznie robi; wszystko niepublikowane lub niezarejestrowane jest tak oznaczone.",
sessionTitle: "Zobacz prawdziwą sesję",
sessionLead:
"Poniżej jest miejsce na materiał z prawdziwej sesji. Świadomie pozostaje w stanie oczekiwania: dopóki nie powstanie nagranie dogfood z kandydata v0.9.2, ta strona nie pokazuje żadnego placeholdera ani inscenizacji.",
nextTitle: "Co dalej",
sourceNote:
"Dokumenty źródłowe: docs/GUIDE.md, docs/KEYBINDINGS.md · Treść kroków żyje w web/lib/content/getting-started.ts; przy zmianie zaktualizuj docs-map.ts.",
};
+109
View File
@@ -0,0 +1,109 @@
import type { HomeDict } from "../types";
/**
* Polish home dictionary — strona startowa „gazeta-ocean".
*
* Natywny przekład w aktualnym kierunku angielskiego: przynieś własny
* model, wszystko dzieje się na twojej maszynie. Słownictwo produktu
* pozostaje dosłowne jak w pakiecie TUI: Plan / Work / Operate,
* Ask / Auto-Review / Full Access, Codewhale, TUI, `codewhale exec`,
* Runtime API + MCP, Fleet, Node 18+, Rust, MIT.
*
* Pieczęcie sekcji (法, 行, …) to glify współdzielone z wydaniem
* angielskim — znaki, nie proza.
*/
export const home: HomeDict = {
metaTitle: "Codewhale — zanurza się w głębinach, żebyś ty nie musiał.",
metaDescription:
"Codewhale zanurza się w głębinach, żebyś ty nie musiał — otwartoźródłowy agent do kodowania w terminalu. Przynieś własny model. Działa na twojej maszynie. Rust, MIT.",
kicker: "Open source · Własny model · Działa w terminalu",
heroTitleA: "Codewhale zanurza się w głębinach,",
heroTitleB: "żebyś ty nie musiał.",
heroIntro:
"{brand} to otwartoźródłowy agent do kodowania w twoim terminalu. Daj mu model i zadanie — przeczyta twój kod, zedytuje pliki, uruchomi własne sprawdzenia i zatrzyma się, gdy praca jest skończona albo gdy potrzebuje ciebie. Przynieś dowolny model albo je mieszaj: przypnij inny model do każdej roli.",
install: "Instaluj",
docs: "Dokumentacja",
copy: "Kopiuj",
copied: "Skopiowano ✓",
installEyebrow: "instalacja jedną komendą",
installRequirement: "wymaga Node 18+ — bez toolchaina Rust",
installOtherWays: "inne sposoby →",
latestRelease: "Najnowsze wydanie {tag}",
releaseUnavailable: "Status wydania niedostępny",
currentSource: "Bieżące źródło",
sourceCandidate: "Kandydat źródłowy",
providerRoutes: "{count} tras providerów",
publishedRelease: "opublikowane wydanie",
figcaptionSourceCandidate: "kandydat źródłowy",
shotSession: "Bieżąca sesja",
screenshotAlt:
"Bieżąca sesja Codewhale w terminalu: tryb Operate, wieloryb, kompozytor i stopka",
figcaption: "Bieżąca sesja Codewhale · tryb Operate · postawa uprawnień Ask",
proofHeading: "Podwodna powłoka terminala. Dowolny model. Na twojej maszynie.",
proofBody:
"Przynieś model, którego już używasz — hostowany, przez gateway albo lokalny. Plan / Work / Operate i jawne postawy uprawnień trzymają nurkowanie pod twoją kontrolą.",
sealDecides: "法",
decidesEyebrow: "Zobacz, jak decyduje",
decidesHeading: "Prawo widoczne w śladzie",
decidesLede:
"Fragmenty prawdziwych sesji — rozstrzygnięta hierarchia reguł projektu widać w rozumowaniu modelu, to nie tylko deklaracja ze strony startowej.",
sealWorkflow: "行",
workflowHeading: "Od zadania do zweryfikowanej zmiany.",
workflow: [
["Zbadaj", "Przeczytaj repozytorium, jego instrukcje i zadanie."],
["Zadziałaj", "Edytuj pliki w jawnych granicach zatwierdzeń."],
["Zweryfikuj", "Uruchom sprawdzenia i obejrzyj wynik."],
["Zrelacjonuj", "Zostaw zwięzłe, trwałe potwierdzenie."],
],
receiptAria: "Przykładowe potwierdzenie pracy",
receiptInspect: "repozytorium i instrukcje",
receiptAct: "edycja przez wybraną postawę uprawnień",
receiptReport: "sprawdzenia zaliczone · potwierdzenie zapisane",
sealStart: "起",
startHeading: "Nowy w Codewhale? Cztery kroki od początku do końca.",
startLede:
"Instalacja → pierwsza sesja bez kluczy → podpięcie providera → konfiguracja Floty. Pojęcia są zdefiniowane na stronie słownika.",
startGuideLink: "Przeczytaj przewodnik na start →",
startVocabularyLink: "Zobacz słownik produktu →",
sealBoundaries: "界",
boundariesHeadingA: "Twój model.",
boundariesHeadingB: "Twoje granice.",
boundariesBody:
"Wybierz model, tryb pracy i postawę uprawnień jawnie. Nieznany koszt pozostaje zadeklarowany jako nieznany, a powierzchnie poglądowe są tak oznaczone.",
hostedGatewayLocal: "Modele hostowane, przez gateway i lokalne",
planActOperateDesc: "Od planowania tylko do odczytu po autonomiczną operację",
askAutoReviewDesc: "Wybierz postawę uprawnień do pracy",
tuiExecWebDesc: "Interaktywne i bezgłowowe powierzchnie runtime'u",
sealSurfaces: "面",
surfacesHeading: "Używaj runtime'u tam, gdzie odbywa się praca.",
surfaces: [
["TUI", "Interaktywna praca w terminalu"],
["codewhale exec", "Skrypty i CI"],
["Klient web", "Klient przeglądarkowy, tylko loopback"],
["Runtime API + MCP", "Lokalne integracje"],
["Fleet", "Trwała praca wielu agentów"],
],
runtimeLink: "Zobacz powierzchnie runtime'u i notatki o stabilności →",
installBandHeading: "Zacznij jedną komendą.",
binaries: "Binarki",
chinaMirrors: "Mirrory w Chinach",
installGuideLink: "Przeczytaj przewodnik instalacji →",
sealCommunity: "众",
communityHeading: "Budowane jawnie",
communityBody:
"Na licencji MIT, kształtowane przez współtwórców od runtime'ów, przez providerów, platformy, dokumentację po testy.",
communityLinksAria: "Linki społeczności",
contribute: "Współtwórz",
};
+91
View File
@@ -0,0 +1,91 @@
import type { ChromeDict } from "../types";
/**
* Turkish chrome dictionary.
*
* Güncel İngilizce yönü yansıtan özgün yeniden yazım — «istediğin model,
* senin makinen»; emekli «local-first» konumlandırması yok. Türkçe
* geliştirici topluluğunun alışıldığı samimi «sen» dili.
*
* Modlar ve izin duruşları (posture) literal kalır (Plan / Work / Operate,
* Ask / Auto-Review / Full Access); `Runtime`, `Fleet` ve `TUI` ürün adı
* olarak kalır, «makbuz» receipt karşılığıdır.
*
* İkincil gezinme etiketleri Türkçe birinciyi kısa bir İngilizce eşle
* eşler — Han çifti İngilizce baskının kendi editoryal aracıdır.
*/
export const chrome: ChromeDict = {
navDocs: "Belgeler",
navStart: "Başlangıç",
navInstall: "Kurulum",
navFaq: "SSS",
navCommunity: "Topluluk",
navContribute: "Katkı",
navDocsSecondary: "Docs",
navStartSecondary: "Start",
navInstallSecondary: "Install",
navFaqSecondary: "FAQ",
navCommunitySecondary: "Community",
navContributeSecondary: "Contribute",
skipToContent: "Ana içeriğe geç",
navPrimaryAria: "Ana gezinme",
navHomeAria: "Codewhale ana sayfası",
installCta: "Kur →",
wordmarkSeal: "深",
wordmarkTag: "istediğin model, senin makinen",
issueLabel: "{date} sayısı",
dateLocale: "tr-TR",
starsAria: "GitHub yıldızları",
githubFallback: "GitHub",
tickerLiveLabel: "Canlı",
tickerLiveTag: "LIVE",
tickerMerged: "birleştirildi",
tickerOpened: "açıldı",
tickerClosed: "kapatıldı",
tickerReleased: "yayımlandı",
tickerFirstContribution: "ilk katkı",
tickerBy: "{handle} tarafından",
tickerAria: "Depodaki son etkinlik",
traceLabel: "muhakeme izi",
traceTabsAria: "Oturum kesitleri",
menuOpen: "Menüyü aç",
menuClose: "Menüyü kapat",
themeAuto: "otomatik",
themeLight: "açık",
themeDark: "koyu",
themeAria: "Belge teması: {mode} (geçiş için tıkla)",
themeTitle: "Belge teması · otomatik / açık / koyu",
footerTagline:
"Derinlere Codewhale dalar — senin dalmana gerek yok: açık kaynak çalışma zamanı için belgeler, kaynak ve topluluk.",
footerProduct: "Ürün",
footerProject: "Proje",
footerDocs: "Belgeler",
footerGuide: "Başlangıç",
footerInstall: "Kurulum",
footerModels: "Modeller",
footerRuntime: "Runtime",
footerFaq: "SSS",
footerIssues: "Issues",
footerContribute: "Katkı",
footerLicense: "MIT lisansı",
footerCanonicalSource: "Yetkili kaynak: ",
footerReleases: " · Sürümler: ",
footerReleasesLink: "GitHub sürümleri",
footerSecurity: "Güvenlik",
switcherLabel: "Dil",
switcherSwitchTo: "{label} diline geç",
partialBadge: "(kısmi)",
};
@@ -0,0 +1,21 @@
import type { DocsGuideDict } from "../types";
/**
* Turkish dictionary for the docs "Getting started" page. Latin script —
* the reference body typography is kept.
*/
export const docsGuide: DocsGuideDict = {
metaTitle: "Başlangıç · Codewhale Belgeleri",
metaDescription:
"Kurulumdan ideal Fleet'ine kadar tam yol: kurulum, anahtarsız ilk oturum, sağlayıcı bağlantısı ve Fleet kurulumu.",
bodyClassName: "text-ink-soft leading-relaxed",
overviewTitle: "Başlangıç",
overviewLead:
"Tek bir kurulum komutundan işine hazır bir Fleet'e dört adım. Her adım yalnızca geçerli adayın gerçekten yaptığını söyler; yayımlanmamış ya da kaydedilmemiş her şey böyle etiketlenir.",
sessionTitle: "Gerçek bir oturum izle",
sessionLead:
"Aşağıda gerçek oturum medyası için ayrılmış yer var. Bilerek bekleme durumunda: v0.9.2 adayının dogfood kaydı var olana dek bu site yer tutucu ya da sahne görüntüsü göstermez.",
nextTitle: "Sıradaki adım",
sourceNote:
"Kaynak belgeler: docs/GUIDE.md, docs/KEYBINDINGS.md · Adım metinleri web/lib/content/getting-started.ts içinde; değişiklikte docs-map.ts'i güncelle.",
};
+108
View File
@@ -0,0 +1,108 @@
import type { HomeDict } from "../types";
/**
* Turkish home dictionary — «gazete-okyanus» açılış sayfası.
*
* Güncel İngilizce yönünde özgün yeniden yazım: modelini kendin getir,
* her şey senin makinende olur. Ürün sözlüğü TUI paketiyle aynı kalır:
* Plan / Work / Operate, Ask / Auto-Review / Full Access, Codewhale, TUI,
* `codewhale exec`, Runtime API + MCP, Fleet, Node 18+, Rust, MIT.
*
* Bölüm mühürleri (法, 行, …) İngilizce baskıyla paylaşılan gliflerdir —
* işaretlerdir, düzyazı değil.
*/
export const home: HomeDict = {
metaTitle: "Codewhale — derinlere dalar, sen dalmak zorunda kalmazsın.",
metaDescription:
"Codewhale derinlere dalar, sen dalmak zorunda kalmazsın — terminal için açık kaynak kodlama ajanı. Modelini kendin getir. Senin makineninde çalışır. Rust, MIT.",
kicker: "Açık kaynak · Modelini kendin getir · Terminalinde çalışır",
heroTitleA: "Codewhale derinlere dalar,",
heroTitleB: "sen dalmak zorunda kalmazsın.",
heroIntro:
"{brand}, terminalin için açık kaynaklı bir kodlama ajanıdır. Ona bir model ve bir görev ver — kodunu okur, dosyaları düzenler, kendi denetimlerini çalıştırır ve iş bitince ya da sana ihtiyaç duyduğunda durur. İstediğin modeli getir ya da modelleri karıştır: her role ayrı bir model sabitle.",
install: "Kur",
docs: "Belgeler",
copy: "Kopyala",
copied: "Kopyalandı ✓",
installEyebrow: "tek satır kurulum",
installRequirement: "Node 18+ gerekir — Rust araç zinciri gerekmez",
installOtherWays: "diğer yollar →",
latestRelease: "En yeni sürüm {tag}",
releaseUnavailable: "Sürüm durumu kullanılamıyor",
currentSource: "Geçerli kaynak",
sourceCandidate: "Kaynak adayı",
providerRoutes: "{count} sağlayıcı yolu",
publishedRelease: "yayımlanmış sürüm",
figcaptionSourceCandidate: "kaynak adayı",
shotSession: "Geçerli oturum",
screenshotAlt:
"Operate modu, balina, besteci ve alt bilgisi görünen geçerli Codewhale terminal oturumu",
figcaption: "Geçerli Codewhale oturumu · Operate modu · Ask izin duruşu",
proofHeading: "Bir su altı terminal kabuğu. İstediğin model. Senin makinen.",
proofBody:
"Zaten kullandığın modeli getir — barındırılan, ağ geçidi üzerinden ya da yerel. Plan / Work / Operate ve açık izin duruşları dalışı senin denetiminde tutar.",
sealDecides: "法",
decidesEyebrow: "Nasıl karar verdiğini gör",
decidesHeading: "İzinde izleyebildiğin kurallar",
decidesLede:
"Gerçek oturum kesitleri — sıralı proje kuralları modelin muakemesinde görünür; yalnızca açılış sayfası iddiası değil.",
sealWorkflow: "行",
workflowHeading: "Görevden doğrulanmış değişikliğe.",
workflow: [
["İncele", "Depoyu, talimatlarını ve görevi oku."],
["Eyle", "Dosyaları açık onay sınırları içinde düzenle."],
["Doğrula", "Denetimleri çalıştır, sonucu incele."],
["Raporla", "Öz ve kalıcı bir makbuz bırak."],
],
receiptAria: "Örnek iş makbuzu",
receiptInspect: "depo ve talimatlar",
receiptAct: "seçili izin duruşuyla düzenleme",
receiptReport: "denetimler geçti · makbuz kaydedildi",
sealStart: "起",
startHeading: "Codewhale’a yeni misin? Baştan sona dört adım.",
startLede:
"Kur → anahtarsız ilk oturum → bir sağlayıcı bağla → Fleet’ini kur. Terimler sözlük sayfasında tanımlı.",
startGuideLink: "Başlangıç kılavuzunu oku →",
startVocabularyLink: "Ürün sözlüğünü gör →",
sealBoundaries: "界",
boundariesHeadingA: "Senin modelin.",
boundariesHeadingB: "Senin sınırların.",
boundariesBody:
"Modeli, çalışma modunu ve izin duruşunu açıkça seç. Bilinmeyen maliyet bilinmiyor olarak kalır; önizleme yüzeyleri de böyle etiketlenir.",
hostedGatewayLocal: "Barındırılan, ağ geçidi ve yerel modeller",
planActOperateDesc: "Salt okunur planlamadan otonom işletmeye",
askAutoReviewDesc: "İş için izin duruşunu seç",
tuiExecWebDesc: "Etkileşimli ve arayüzsüz çalışma zamanı yüzeyleri",
sealSurfaces: "面",
surfacesHeading: "Çalışma zamanını işin olduğu yerde kullan.",
surfaces: [
["TUI", "Terminalde etkileşimli iş"],
["codewhale exec", "Betikler ve CI"],
["Web istemcisi", "Yalnızca geri döngülü tarayıcı istemcisi"],
["Runtime API + MCP", "Yerel entegrasyonlar"],
["Fleet", "Kalıcı çok ajanlı iş"],
],
runtimeLink: "Çalışma zamanı yüzeylerini ve kararlılık notlarını gör →",
installBandHeading: "Tek komutla başla.",
binaries: "İkililer",
chinaMirrors: "Çin yansıları",
installGuideLink: "Kurulum kılavuzunu oku →",
sealCommunity: "众",
communityHeading: "Açıkça, halk önünde inşa edildi",
communityBody:
"MIT lisanslı; çalışma zamanları, sağlayıcılar, platformlar, belgelendirme ve testler katkısıyla şekillendi.",
communityLinksAria: "Topluluk bağlantıları",
contribute: "Katkıda bulun",
};
+8
View File
@@ -30,6 +30,14 @@ const OG_LOCALE: Record<string, string> = {
ru: "ru_RU",
uk: "uk_UA",
es: "es_ES",
fr: "fr_FR",
de: "de_DE",
ca: "ca_ES",
hi: "hi_IN",
tr: "tr_TR",
it: "it_IT",
pl: "pl_PL",
ar: "ar_AR",
"pt-BR": "pt_BR",
id: "id_ID",
};
+4 -1
View File
@@ -39,7 +39,10 @@ describe("public website copy contracts", () => {
// Footer copy is dictionary-driven now, so the same ban has to hold
// wherever the strings actually live — in every locale, not just the TSX.
for (const locale of ["en", "zh", "ja", "vi", "ko", "ru", "uk", "es", "pt-BR", "id"]) {
for (const locale of [
"en", "zh", "ja", "vi", "ko", "ru", "uk", "es", "pt-BR", "id",
"fr", "de", "ca", "hi", "tr", "it", "pl", "ar",
]) {
const values = Object.values(getChrome(locale)).join("\n");
expect(values, `${locale} chrome`).not.toContain("app.codewhale.net");
expect(values, `${locale} chrome`).not.toMatch(/Create account|Sign up|App preview/);