mirror of
https://github.com/codewhale-hq/Codewhale.git
synced 2026-11-11 01:51:34 -10:00
fix(web): integrate the whale-road site and docs, drop orphans
Integration pass over the site rebuild (abb648579,50d9d492c) and the docs rewrite (9c3dcee1d) on feat/website-gpui-renovation. - Regenerate the GT catalog (npm run i18n:gt -- export) so gt-site passes. - Docs sidebar: the current-page tick pushed the label to the far edge (flex space-between); the label now grows and the tick sits beside it. - Docs hub: drop the raw route/source-path column from task and topic rows. - Docs band: the old single-ink traced mark becomes the v2 "read" pose; "Release truth" / "版本事实" become "Release" / "版本". - Guide steps: rows span the card so dividers meet both edges (the prose 66ch cap no longer applies inside the step panel). - Copy button: sits flush on the command block's right edge with a fade, so a long command no longer shows a sliver past the button at 375px. - Remove orphans nothing rendered: components/ticker.tsx, code-spans.tsx, whale.tsx, the docs-constitution dictionary (en/zh), 27 dictionary keys across 19 locales (ticker verbs, seal/wordmark, masthead issue, trace, home chapters, providerRoutes, 404 poster alt, computer-use install block, docs sourceDocsCta), splitTokens, and unused CSS (community credit/welcome, docs-empty, home-release, btn-outline, group-title, hero-install-switch, skeleton-bar, product-container, .hairline, sr-only-focusable). Tests that only pinned those files are removed. Verification (node 22.20.0): - npm test: npm/codewhale 67/67 pass, runtime-sdk 14/14 pass, web vitest 55 files, 498/498 pass, 0 failed. - npm run check:web: pass (facts, latest-release, derive, check-docs, tokens, eslint, tsc --noEmit, next build: 839/839 static pages). - next start on :4871, Playwright (system Chrome) screenshots of home, install, docs hub, docs guide/mcp/review, faq, changelog, models, legal, 404 at 375/1024/1440 in light and dark: 66 shots, no horizontal overflow, no console errors except the 404 document's own status. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01R9rJEoMuUSRWznU6QjkE7h
This commit is contained in:
1 parent
50d9d492c6
commit
396cead3b4
79 files changed
+3339
-2276
No files matched your search
@@ -2,7 +2,7 @@ import { DocsBreadcrumb } from "@/components/docs-breadcrumb";
|
||||
import { DocsHelp } from "@/components/docs-help";
|
||||
import { DocsSidebar } from "@/components/docs-sidebar";
|
||||
import { ReleaseTruth } from "@/components/release-truth";
|
||||
import { Whale } from "@/components/whale";
|
||||
import { WhalePose } from "@/components/whale-pose";
|
||||
import { BUILD_FACTS, getFactsWithProvenance } from "@/lib/facts";
|
||||
import { getDocsShell } from "@/lib/i18n/dictionaries";
|
||||
|
||||
@@ -40,7 +40,7 @@ export default async function DocsLayout({
|
||||
<section className="hero">
|
||||
<div className="portal-container docs-portal-band">
|
||||
<div className="portal-mark">
|
||||
<Whale size={28} />
|
||||
<WhalePose pose="read" className="portal-mark-pose" priority />
|
||||
<span>{t.portalMark}</span>
|
||||
</div>
|
||||
<ReleaseTruth locale={locale} facts={facts} />
|
||||
|
||||
+3
-15
@@ -31,8 +31,6 @@ body {
|
||||
main { flex: 1 0 auto; }
|
||||
main, header, footer, nav { position: relative; z-index: 1; }
|
||||
|
||||
.codewhale-mark-primary { fill: var(--mark-ink); }
|
||||
|
||||
/* ---------- type ---------- */
|
||||
/* One face: Shannon Sans for headings, body and labels, a little negative
|
||||
tracking on the big headings. Code uses the system monospace stack. No
|
||||
@@ -84,8 +82,7 @@ html[lang="ko"] :is(h1, h2, h3) {
|
||||
|
||||
/* ---------- containers ---------- */
|
||||
.site-container,
|
||||
.portal-container,
|
||||
.product-container {
|
||||
.portal-container {
|
||||
width: var(--container);
|
||||
margin-inline: auto;
|
||||
}
|
||||
@@ -104,7 +101,6 @@ html[lang="ko"] :is(h1, h2, h3) {
|
||||
}
|
||||
|
||||
/* ---------- legacy structures still used by the docs ---------- */
|
||||
.hairline { border-color: var(--line); }
|
||||
.hairline-t { border-top: 1px solid var(--line); }
|
||||
.hairline-b { border-bottom: 1px solid var(--line); }
|
||||
.hairline-l { border-inline-start: 1px solid var(--line); }
|
||||
@@ -227,16 +223,8 @@ mark.search-highlight {
|
||||
}
|
||||
.skip-link:focus-visible { top: 0.5rem; }
|
||||
|
||||
.sr-only-focusable:not(:focus-visible) {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
overflow: hidden;
|
||||
clip-path: inset(50%);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* The docs band's mark and label (docs/layout.tsx). */
|
||||
/* The docs band's mark and label (docs/layout.tsx): the reading whale. */
|
||||
.portal-mark-pose { --pose-size: 2.25rem; flex: none; }
|
||||
.portal-mark {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
@@ -50,10 +50,6 @@
|
||||
border-top: 1px solid var(--stage-line);
|
||||
}
|
||||
|
||||
.docs-task-row .docs-topic-source {
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
|
||||
.docs-help {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1.3fr) minmax(12rem, 0.7fr);
|
||||
|
||||
+2
-127
@@ -6,28 +6,6 @@
|
||||
background: var(--paper);
|
||||
}
|
||||
|
||||
.community-welcome-inner {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.community-welcome-inner h1 {
|
||||
max-width: 50rem;
|
||||
font-size: clamp(2rem, 4.2vw, 3.6rem);
|
||||
line-height: 1.03;
|
||||
}
|
||||
|
||||
.community-welcome-inner h1 {
|
||||
margin-top: 0.85rem;
|
||||
}
|
||||
|
||||
.community-welcome-inner p {
|
||||
max-width: 47rem;
|
||||
margin-top: 1rem;
|
||||
color: var(--ink-soft);
|
||||
font-size: 1rem;
|
||||
line-height: 1.7;
|
||||
}
|
||||
|
||||
.docs-portal .hero {
|
||||
padding-block: 0.75rem;
|
||||
}
|
||||
@@ -233,7 +211,7 @@
|
||||
|
||||
.docs-topic-row {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1fr) minmax(8rem, 0.34fr) auto;
|
||||
grid-template-columns: minmax(0, 1fr) auto;
|
||||
gap: 1.25rem;
|
||||
align-items: center;
|
||||
padding-block: 1rem;
|
||||
@@ -269,42 +247,11 @@
|
||||
line-height: 1.55;
|
||||
}
|
||||
|
||||
.docs-topic-source {
|
||||
overflow: hidden;
|
||||
color: var(--ink-mute);
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.75rem;
|
||||
line-height: 1.5;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.docs-topic-source span {
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
.docs-topic-arrow {
|
||||
color: var(--ink-mute);
|
||||
font-size: 0.78rem;
|
||||
}
|
||||
|
||||
.docs-empty {
|
||||
padding-block: 3.5rem;
|
||||
border-block: 1px solid var(--hairline);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.docs-empty > p:first-child {
|
||||
color: var(--ink);
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.docs-empty > p:nth-child(2) {
|
||||
margin: 0.5rem auto 1.25rem;
|
||||
color: var(--ink-mute);
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.docs-source-note {
|
||||
margin-top: 2.5rem;
|
||||
padding-top: 1.25rem;
|
||||
@@ -338,79 +285,7 @@
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.docs-topic-row {
|
||||
grid-template-columns: minmax(0, 1fr) auto;
|
||||
gap: 0.6rem 1rem;
|
||||
}
|
||||
|
||||
.docs-topic-source {
|
||||
grid-column: 1 / -1;
|
||||
grid-row: 2;
|
||||
}
|
||||
|
||||
.docs-topic-arrow {
|
||||
grid-column: 2;
|
||||
grid-row: 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------- community release record ---------- */
|
||||
.community-credit-section {
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
.community-record-links {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.65rem 1.25rem;
|
||||
margin-top: 1.25rem;
|
||||
}
|
||||
|
||||
.community-record-links a {
|
||||
color: var(--indigo-deep);
|
||||
font-size: 0.75rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.community-record-links a:hover {
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 0.22rem;
|
||||
}
|
||||
|
||||
.community-credit-groups {
|
||||
display: grid;
|
||||
gap: 2rem;
|
||||
}
|
||||
|
||||
.community-credit-groups section {
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--hairline);
|
||||
}
|
||||
|
||||
.community-credit-groups h3 {
|
||||
margin-bottom: 0.9rem;
|
||||
color: var(--ink-mute);
|
||||
font-size: 0.75rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.community-credit-list {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.45rem;
|
||||
}
|
||||
|
||||
.community-credit-list a {
|
||||
padding: 0.3rem 0.45rem;
|
||||
border: 1px solid var(--hairline);
|
||||
color: var(--ink-soft);
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
|
||||
.community-credit-list a:hover {
|
||||
border-color: var(--indigo);
|
||||
color: var(--indigo-deep);
|
||||
.docs-topic-row { gap: 0.6rem 1rem; }
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
@@ -47,11 +47,6 @@
|
||||
|
||||
.home-hero-copy .hero-install { max-width: 34rem; }
|
||||
|
||||
.home-release {
|
||||
color: var(--muted);
|
||||
font-size: var(--text-caption);
|
||||
}
|
||||
|
||||
/* The whale rests on the horizon: its lowest point sits on the line. */
|
||||
.home-whale {
|
||||
position: relative;
|
||||
|
||||
@@ -36,6 +36,10 @@
|
||||
line-height: var(--leading-prose);
|
||||
}
|
||||
|
||||
/* A step card is a panel, not a line of prose: its rows span the card so
|
||||
the dividers meet both edges. */
|
||||
.docs-content .gs-steps li { max-width: none; }
|
||||
|
||||
.docs-content > section + section {
|
||||
padding-top: 0.5rem;
|
||||
}
|
||||
@@ -81,17 +85,20 @@
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* The link is a flex row (label, then an optional external arrow); the
|
||||
current-page tick is its first item, and the label grows so the tick stays
|
||||
beside it instead of being pushed to the far edge. */
|
||||
.docs-sidebar-link-current::before {
|
||||
content: "";
|
||||
display: inline-block;
|
||||
flex: none;
|
||||
width: 0.4rem;
|
||||
height: 1px;
|
||||
margin-right: 0.45rem;
|
||||
vertical-align: middle;
|
||||
margin-inline-end: -0.35rem;
|
||||
background: var(--indigo);
|
||||
}
|
||||
.docs-sidebar-link > span:first-child { flex: 1 1 auto; min-width: 0; }
|
||||
|
||||
/* Topic rows on the hub: a title with room to breathe, the source path quiet. */
|
||||
/* Topic rows on the hub: a title with room to breathe. */
|
||||
.docs-topic-title {
|
||||
font-size: 0.98rem;
|
||||
}
|
||||
|
||||
@@ -72,9 +72,6 @@
|
||||
.btn-secondary:hover,
|
||||
.portal-button-secondary:hover { background: var(--hover); }
|
||||
|
||||
.btn-outline { border-color: var(--line-strong); }
|
||||
.btn-outline:hover { background: var(--hover); }
|
||||
|
||||
.btn-ghost { color: var(--text); }
|
||||
.btn-ghost:hover { background: var(--hover); }
|
||||
|
||||
@@ -226,7 +223,6 @@
|
||||
background: color-mix(in srgb, var(--panel) 72%, transparent);
|
||||
overflow: hidden;
|
||||
}
|
||||
.group-title { margin-bottom: var(--space-2); color: var(--muted); font-size: var(--text-caption); font-weight: 500; }
|
||||
.group-row { padding: var(--space-3) var(--space-4); }
|
||||
.group-row + .group-row { border-top: 1px solid var(--line); }
|
||||
|
||||
@@ -377,8 +373,7 @@ a.dir-row:hover .dir-action { color: var(--text); }
|
||||
.status-badge-unavailable .status-badge-dot { background: var(--muted); }
|
||||
|
||||
/* ---------- segmented choice ---------- */
|
||||
.segmented,
|
||||
.hero-install-switch {
|
||||
.segmented {
|
||||
display: inline-flex;
|
||||
gap: 2px;
|
||||
padding: 2px;
|
||||
@@ -386,8 +381,7 @@ a.dir-row:hover .dir-action { color: var(--text); }
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius-control);
|
||||
}
|
||||
.segmented button,
|
||||
.hero-install-switch button {
|
||||
.segmented button {
|
||||
min-height: 1.75rem;
|
||||
padding-inline: 0.625rem;
|
||||
color: var(--muted);
|
||||
@@ -397,13 +391,10 @@ a.dir-row:hover .dir-action { color: var(--text); }
|
||||
cursor: pointer;
|
||||
transition: background-color var(--dur-state) var(--ease-out), color var(--dur-state) var(--ease-out);
|
||||
}
|
||||
.segmented button:hover,
|
||||
.hero-install-switch button:hover { background: var(--hover); color: var(--text); }
|
||||
.segmented button[aria-pressed="true"],
|
||||
.hero-install-switch button[aria-pressed="true"] { background: var(--selected); color: var(--text); }
|
||||
.segmented button:hover { background: var(--hover); color: var(--text); }
|
||||
.segmented button[aria-pressed="true"] { background: var(--selected); color: var(--text); }
|
||||
@media (pointer: coarse) {
|
||||
.segmented button,
|
||||
.hero-install-switch button { min-height: 2.5rem; }
|
||||
.segmented button { min-height: 2.5rem; }
|
||||
}
|
||||
|
||||
/* ---------- nav tabs ---------- */
|
||||
@@ -435,13 +426,19 @@ a.dir-row:hover .dir-action { color: var(--text); }
|
||||
|
||||
/* ---------- code with copy ---------- */
|
||||
.code { position: relative; min-width: 0; }
|
||||
.code pre.code-block { padding-inline-end: 3rem; }
|
||||
.code pre.code-block { padding-right: 3rem; }
|
||||
/* A long command scrolls under the button, so the button sits flush with the
|
||||
block's edge and a short fade on its leading side hides the text beneath
|
||||
it instead of letting a sliver show on either side. Commands are always
|
||||
left to right (see base.css), so the button is on the physical right. */
|
||||
.code .code-copy {
|
||||
position: absolute;
|
||||
background: var(--surface);
|
||||
top: 0.375rem;
|
||||
inset-inline-end: 0.375rem;
|
||||
top: 0.25rem;
|
||||
right: 1px;
|
||||
box-shadow: -0.75rem 0 0.5rem -0.25rem var(--surface);
|
||||
}
|
||||
.code .code-copy:focus-visible { box-shadow: var(--glow-focus); }
|
||||
.code .code-copy:hover { background: var(--hover); }
|
||||
.code-copy[data-copied="true"] { color: var(--live); }
|
||||
|
||||
@@ -556,8 +553,7 @@ h1.state-title { font-size: var(--text-display); }
|
||||
|
||||
.state-skeleton,
|
||||
.skeleton { display: grid; gap: var(--space-2); width: min(100%, 24rem); }
|
||||
.state-skeleton span,
|
||||
.skeleton-bar {
|
||||
.state-skeleton span {
|
||||
display: block;
|
||||
height: 0.75rem;
|
||||
background: var(--surface);
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
import { Fragment, type ReactNode } from "react";
|
||||
import { splitTokens } from "@/lib/i18n/dictionaries";
|
||||
|
||||
/**
|
||||
* Typeset a dictionary template whose `{token}` placeholders stand for
|
||||
* code-owned literals (commands, env names, config keys, job states). The
|
||||
* literals stay in the page; the sentence stays one translated unit and a
|
||||
* locale may reorder the tokens freely. An unknown token renders as
|
||||
* `{token}` so template/literal drift is visible in review, never silent.
|
||||
*/
|
||||
export function withCodeSpans(template: string, spans: Record<string, string>): ReactNode {
|
||||
return splitTokens(template).map((part, i) =>
|
||||
"token" in part ? (
|
||||
<code key={`${i}-${part.token}`} className="inline">
|
||||
{spans[part.token] ?? `{${part.token}}`}
|
||||
</code>
|
||||
) : (
|
||||
<Fragment key={`${i}-text`}>{part.text}</Fragment>
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/** A `[term, detail]` reference list, the docs pages' one table shape. */
|
||||
export function RefRows({
|
||||
rows,
|
||||
spans = {},
|
||||
termSpans = false,
|
||||
}: {
|
||||
rows: readonly (readonly [string, string])[];
|
||||
spans?: Record<string, string>;
|
||||
/** Typeset the term column as code (command tables). */
|
||||
termSpans?: boolean;
|
||||
}) {
|
||||
return (
|
||||
<dl className="docs-ref-rows">
|
||||
{rows.map(([term, detail]) => (
|
||||
<div key={term}>
|
||||
<dt>{termSpans ? <code className="inline">{term}</code> : term}</dt>
|
||||
<dd>{withCodeSpans(detail, spans)}</dd>
|
||||
</div>
|
||||
))}
|
||||
</dl>
|
||||
);
|
||||
}
|
||||
@@ -18,10 +18,6 @@ import { EmptyState } from "./surface-state";
|
||||
/* Helpers */
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
||||
function topicSources(topic: DocTopic): string[] {
|
||||
return Array.isArray(topic.repoSource) ? topic.repoSource : [topic.repoSource];
|
||||
}
|
||||
|
||||
function highlight(text: string, query: string): React.ReactNode {
|
||||
// Index arithmetic lives in search-utils: lowercasing can change a
|
||||
// string's length, so `text` cannot be sliced with indices taken from
|
||||
@@ -48,7 +44,6 @@ function TaskRow({ task, locale, query }: { task: DocTask; locale: string; query
|
||||
<div className="docs-topic-title">{highlight(pickText(task.label, locale), query)}</div>
|
||||
<p>{highlight(pickText(task.description, locale), query)}</p>
|
||||
</div>
|
||||
<div className="docs-topic-source">{task.href}</div>
|
||||
<span className="docs-topic-arrow" aria-hidden="true">→</span>
|
||||
</Link>
|
||||
);
|
||||
@@ -68,7 +63,6 @@ function TopicRow({
|
||||
sourceDocTag: string;
|
||||
}) {
|
||||
const href = docTopicHref(topic, locale);
|
||||
const sources = topicSources(topic);
|
||||
const isExternal = docTopicIsExternal(topic);
|
||||
|
||||
return (
|
||||
@@ -85,14 +79,6 @@ function TopicRow({
|
||||
</div>
|
||||
<p>{highlight(pickText(topic.description, locale), query)}</p>
|
||||
</div>
|
||||
<div className="docs-topic-source">
|
||||
{sources.map((s, i) => (
|
||||
<span key={s}>
|
||||
{i > 0 && ", "}
|
||||
{highlight(s, query)}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
<span className="docs-topic-arrow" aria-hidden="true">{isExternal ? "↗" : "→"}</span>
|
||||
</Link>
|
||||
);
|
||||
|
||||
@@ -1,180 +0,0 @@
|
||||
import type { FeedItem } from "@/lib/types";
|
||||
import { relativeAge, relativeTime } from "@/lib/github";
|
||||
import { splitToken } from "@/lib/i18n/dictionaries";
|
||||
import { truncateChars } from "@/lib/truncate";
|
||||
|
||||
/**
|
||||
* The wire strip under the masthead: what actually happened in the
|
||||
* repository, in the reader's language, with the person who did it named.
|
||||
*
|
||||
* Everything here is GitHub's own record — merge state, handles, and
|
||||
* GitHub's `author_association` first-timer verdict, all from the list
|
||||
* payloads `fetchFeed` already pulls. Nothing is summarized, ranked, or
|
||||
* generated; an empty feed renders nothing at all rather than a skeleton.
|
||||
*
|
||||
* Titles and handles are content and stay verbatim. The chrome around them —
|
||||
* the event verb, the by-line, the first-contribution mark — comes from the
|
||||
* caller's dictionary, and the age comes from CLDR via the locale's own
|
||||
* `dateLocale`.
|
||||
*/
|
||||
export interface TickerLabels {
|
||||
/** Han-seal live label and its mono tag. */
|
||||
liveLabel: string;
|
||||
liveTag: string;
|
||||
/** aria-label for the strip's landmark. */
|
||||
ariaLabel: string;
|
||||
/** Event verbs. Drafts never reach the strip — see `EVENT_STATES`. */
|
||||
merged: string;
|
||||
opened: string;
|
||||
closed: string;
|
||||
released: string;
|
||||
/** Mark on a newcomer's contribution, e.g. "first contribution". */
|
||||
firstContribution: string;
|
||||
/** By-line template carrying a `{handle}` token, e.g. "by {handle}". */
|
||||
by: string;
|
||||
/** BCP 47 tag driving `Intl.RelativeTimeFormat` (chrome.dateLocale). */
|
||||
dateLocale: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* States the strip reports. A draft pull request is the one thing here that
|
||||
* is not an event — it is work its own author has marked not-ready — and on a
|
||||
* repository where agents open them in batches it crowds out the merges and
|
||||
* the people behind them. It reappears the moment it is opened or merged.
|
||||
*/
|
||||
const EVENT_STATES: readonly FeedItem["state"][] = ["merged", "open", "closed", "published"];
|
||||
|
||||
/** The state a feed item is in → the verb the strip prints for it. */
|
||||
function verbFor(state: FeedItem["state"], labels: TickerLabels): string {
|
||||
switch (state) {
|
||||
case "merged":
|
||||
return labels.merged;
|
||||
case "closed":
|
||||
return labels.closed;
|
||||
case "published":
|
||||
return labels.released;
|
||||
default:
|
||||
return labels.opened;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Locale age formatter. `Intl.RelativeTimeFormat` is unavailable or missing
|
||||
* locale data on some runtimes; falling back to the compact English form is
|
||||
* an honest degradation, an empty timestamp is not.
|
||||
*/
|
||||
function ageFormatter(dateLocale: string): (iso: string) => string {
|
||||
let rtf: Intl.RelativeTimeFormat | undefined;
|
||||
try {
|
||||
rtf = new Intl.RelativeTimeFormat(dateLocale, { numeric: "auto", style: "narrow" });
|
||||
} catch {
|
||||
rtf = undefined;
|
||||
}
|
||||
return (iso: string) => {
|
||||
if (!rtf) return relativeTime(iso);
|
||||
const { value, unit } = relativeAge(iso);
|
||||
return rtf.format(value, unit);
|
||||
};
|
||||
}
|
||||
|
||||
function TickerEntry({
|
||||
item,
|
||||
labels,
|
||||
age,
|
||||
hidden,
|
||||
}: {
|
||||
item: FeedItem;
|
||||
labels: TickerLabels;
|
||||
age: string;
|
||||
hidden: boolean;
|
||||
}) {
|
||||
const isRelease = item.kind === "release";
|
||||
// A release named after its own tag would print the tag twice.
|
||||
const title = isRelease && item.title === item.tag ? "" : item.title;
|
||||
const [beforeHandle, afterHandle] = splitToken(labels.by, "handle");
|
||||
|
||||
return (
|
||||
<span className="ticker-item" aria-hidden={hidden || undefined}>
|
||||
<span className="ticker-verb" data-event={item.state}>
|
||||
{verbFor(item.state, labels)}
|
||||
</span>
|
||||
{isRelease ? (
|
||||
<span className="ticker-tag tabular">{item.tag}</span>
|
||||
) : (
|
||||
<span className="ticker-num tabular">#{item.number}</span>
|
||||
)}
|
||||
{title ? (
|
||||
<span className="ticker-title">{truncateChars(title, 70)}</span>
|
||||
) : null}
|
||||
{item.author ? (
|
||||
<span className="ticker-by">
|
||||
{beforeHandle}
|
||||
<span className="ticker-handle">@{item.author}</span>
|
||||
{afterHandle}
|
||||
</span>
|
||||
) : null}
|
||||
{item.firstTimeContributor ? (
|
||||
<span className="ticker-first">{labels.firstContribution}</span>
|
||||
) : null}
|
||||
<span className="ticker-age tabular">{age}</span>
|
||||
<span className="ticker-sep" aria-hidden>
|
||||
◆
|
||||
</span>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
export function Ticker({ items, labels }: { items: FeedItem[]; labels: TickerLabels }) {
|
||||
// Newest event first — the verb and the age describe the same moment, so
|
||||
// the strip reads as a wire and never dates a merge by a later comment.
|
||||
const ordered = items
|
||||
.filter((item) => EVENT_STATES.includes(item.state))
|
||||
.sort((a, b) => +new Date(b.eventAt ?? b.updatedAt) - +new Date(a.eventAt ?? a.updatedAt));
|
||||
|
||||
// Nothing to report is reported as nothing.
|
||||
if (!ordered.length) return null;
|
||||
|
||||
const formatAge = ageFormatter(labels.dateLocale);
|
||||
// Seamless loop: the track translates -50%, so both halves must be the same
|
||||
// flat run of children. The second half is hidden from assistive tech.
|
||||
const doubled = [...ordered, ...ordered];
|
||||
|
||||
// Loop duration: never faster than the original 80s baseline; longer feeds
|
||||
// (CJK titles run 2-4x wider than English) get proportionally more time so
|
||||
// every locale scrolls at a readable pace.
|
||||
const glyphCount = ordered.reduce(
|
||||
(sum, item) => sum + (item.title?.length ?? 0) + 24,
|
||||
0,
|
||||
);
|
||||
const durationSeconds = Math.max(80, Math.round(glyphCount / 22));
|
||||
|
||||
return (
|
||||
<div className="hairline-t hairline-b bg-paper-deep overflow-hidden">
|
||||
<div className="site-container flex items-stretch">
|
||||
<div className="border-r border-paper-edge text-ink px-4 py-2 flex items-center shrink-0 gap-2">
|
||||
<span className="w-1.5 h-1.5 bg-indigo rounded-full inline-block animate-pulse" />
|
||||
<span className="font-cjk text-sm font-semibold">{labels.liveLabel}</span>
|
||||
<span className="text-xs text-ink-mute ml-1 self-end mb-0.5">
|
||||
{labels.liveTag}
|
||||
</span>
|
||||
</div>
|
||||
<div className="ticker-viewport" role="group" aria-label={labels.ariaLabel}>
|
||||
<div
|
||||
className="ticker-track py-2 font-mono text-[0.78rem]"
|
||||
style={{ animationDuration: `${durationSeconds}s` }}
|
||||
>
|
||||
{doubled.map((item, i) => (
|
||||
<TickerEntry
|
||||
key={`${item.url}-${i}`}
|
||||
item={item}
|
||||
labels={labels}
|
||||
age={formatAge(item.eventAt ?? item.updatedAt)}
|
||||
hidden={i >= ordered.length}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
/**
|
||||
* The Codewhale brand mark traced from the supplied final artwork.
|
||||
*/
|
||||
const WHALE_MARK =
|
||||
"M 211.759 469.126 C 191.280 466.358 166.740 459.281 148.669 450.933 C 137.944 445.978 137.708 444.492 147.386 442.873 C 162.950 440.270 182.911 431.903 197.412 421.903 C 208.107 414.528 222.871 398.950 227.904 389.729 C 228.497 388.643 225.903 390.576 222.139 394.025 C 213.396 402.036 204.357 408.028 192.691 413.545 C 158.373 429.776 122.240 428.876 89.841 410.983 C 78.798 404.885 71.269 398.348 62.125 386.920 C 31.951 349.206 16.901 305.466 16.901 255.482 C 16.901 206.943 33.640 159.838 64.440 121.703 C 111.469 63.475 186.486 34.176 256.497 46.692 C 268.056 48.759 286.008 54.101 288.636 56.257 L 290.796 58.029 L 288.311 62.801 C 284.863 69.421 274.479 80.154 266.190 85.664 C 262.368 88.205 255.644 91.529 251.248 93.052 C 244.132 95.516 243.554 95.895 245.984 96.505 C 248.804 97.213 254.206 96.862 270.355 94.924 C 283.318 93.368 293.079 94.872 310.680 101.138 C 330.307 108.125 345.213 112.582 353.764 114.018 C 358.334 114.786 361.319 115.794 361.661 116.685 C 363.320 121.008 349.053 137.395 337.939 143.932 C 334.429 145.997 327.978 148.880 323.604 150.340 C 316.545 152.696 314.140 152.994 302.229 152.985 C 287.046 152.974 281.417 151.727 269.918 145.829 C 264.842 143.226 260.404 139.692 253.515 132.769 C 243.257 122.461 237.445 118.925 226.498 116.332 C 196.283 109.177 160.483 119.340 131.001 143.443 C 114.090 157.269 101.527 174.990 93.047 196.983 C 87.965 210.163 86.204 219.746 86.224 234.128 C 86.265 263.885 97.393 281.372 122.165 290.608 C 127.662 292.658 131.037 293.137 142.664 293.517 C 165.823 294.275 182.337 290.007 231.146 270.650 C 299.879 243.390 348.689 228.976 395.530 222.106 C 412.810 219.572 452.655 218.388 462.814 220.107 C 480.607 223.118 489.106 228.538 492.618 239.112 C 494.120 243.634 494.290 246.619 493.776 259.403 C 492.987 279.032 490.534 289.883 481.997 311.499 C 447.936 397.744 367.611 458.036 271.849 469.238 C 255.937 471.099 225.945 471.044 211.759 469.126 Z M 268.570 453.799 C 324.066 448.214 375.534 424.502 414.738 386.457 C 437.939 363.942 455.183 338.976 467.076 310.680 C 473.360 295.729 479.593 272.970 477.873 271.251 C 474.893 268.270 451.236 270.950 436.056 275.988 C 410.958 284.317 379.331 305.900 352.435 333.051 C 337.949 347.675 329.137 358.512 309.500 385.857 C 293.525 408.102 285.758 417.452 273.242 429.510 C 262.916 439.457 254.375 445.852 244.220 451.239 L 237.443 454.835 L 247.859 454.835 C 253.588 454.835 262.908 454.369 268.570 453.799 Z M 291.877 436.086 C 291.586 435.616 294.356 434.419 298.032 433.425 C 339.084 422.327 383.749 392.629 411.885 357.724 C 424.930 341.540 439.445 316.946 444.490 302.478 C 445.205 300.427 446.123 298.750 446.531 298.750 C 448.652 298.750 438.704 323.522 431.035 337.337 C 424.713 348.725 422.249 352.547 414.573 362.874 C 387.281 399.591 349.152 424.467 304.976 434.375 C 291.935 437.300 292.575 437.216 291.877 436.086 Z M 314.242 403.739 C 314.470 403.523 318.540 401.320 323.286 398.845 C 354.190 382.728 385.388 353.647 402.926 324.610 C 404.997 321.181 406.930 318.614 407.221 318.905 C 408.529 320.213 394.836 342.688 385.885 353.926 C 373.881 368.998 359.917 381.742 345.696 390.606 C 337.012 396.018 319.186 404.132 315.978 404.132 C 314.796 404.132 314.014 403.955 314.242 403.739 Z M 300.106 344.750 C 304.411 341.565 305.548 338.263 303.789 334.053 C 300.211 325.490 284.753 325.447 280.680 333.988 C 279.096 337.310 279.096 337.735 280.679 341.054 C 281.688 343.169 283.655 345.168 285.585 346.040 C 289.707 347.900 296.685 347.281 300.106 344.750 Z";
|
||||
|
||||
const VIEW_BOX = "0 0 512 512";
|
||||
|
||||
/**
|
||||
* The still pose. Like the GPUI whale under reduced motion, the web mark
|
||||
* never animates: it is one filled path in the current ink.
|
||||
*/
|
||||
export function Whale({
|
||||
size = 36,
|
||||
className = "",
|
||||
}: {
|
||||
size?: number;
|
||||
className?: string;
|
||||
}) {
|
||||
return (
|
||||
<svg
|
||||
viewBox={VIEW_BOX}
|
||||
width={size}
|
||||
height={size}
|
||||
className={`codewhale-mark ${className}`}
|
||||
aria-hidden="true"
|
||||
fill="none"
|
||||
>
|
||||
<path
|
||||
className="codewhale-mark-primary"
|
||||
d={WHALE_MARK}
|
||||
fill="currentColor"
|
||||
fillRule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
+1650
-530
File diff suppressed because it is too large.
Load diff
+1653
-533
File diff suppressed because it is too large.
Load diff
@@ -8,7 +8,6 @@ import { siteCss } from "./site-css";
|
||||
// still pose under reduced motion.
|
||||
const CSS = siteCss();
|
||||
const TAILWIND = readFileSync(new URL("../tailwind.config.ts", import.meta.url), "utf8");
|
||||
const WHALE = readFileSync(new URL("../components/whale.tsx", import.meta.url), "utf8");
|
||||
|
||||
describe("design grammar contract", () => {
|
||||
it("draws every radius from the 6/10/14/pill grammar", () => {
|
||||
@@ -75,7 +74,6 @@ describe("design grammar contract", () => {
|
||||
expect(TAILWIND).toMatch(/transitionDuration: \{ DEFAULT: "var\(--dur-state\)" \}/);
|
||||
expect(TAILWIND).toMatch(/transitionTimingFunction: \{ DEFAULT: "var\(--ease-spring\)" \}/);
|
||||
expect(CSS).not.toMatch(/caustic/);
|
||||
expect(WHALE).not.toMatch(/caustic|<animate|clipPath/);
|
||||
});
|
||||
|
||||
it("keeps no unused presence shapes", () => {
|
||||
|
||||
@@ -4,7 +4,6 @@ import {
|
||||
DICTIONARY_LOCALES,
|
||||
EN_CHROME,
|
||||
EN_DOCS_GUIDE,
|
||||
EN_DOCS_CONSTITUTION,
|
||||
EN_DOCS_HOOKS,
|
||||
EN_DOCS_MCP,
|
||||
EN_DOCS_RUNTIME_API,
|
||||
@@ -27,7 +26,6 @@ import {
|
||||
fill,
|
||||
getChrome,
|
||||
getDocsGuide,
|
||||
getDocsConstitution,
|
||||
getDocsHooks,
|
||||
getDocsMcp,
|
||||
getDocsRuntimeApi,
|
||||
@@ -53,7 +51,6 @@ import {
|
||||
pickText,
|
||||
pickTextLocale,
|
||||
splitToken,
|
||||
splitTokens,
|
||||
} from "./dictionaries";
|
||||
import { locales, partialLocales } from "./config";
|
||||
import type { ChromeDict, HomeDict } from "./dictionaries/types";
|
||||
@@ -64,9 +61,7 @@ import type { ChromeDict, HomeDict } from "./dictionaries/types";
|
||||
* missing translation.
|
||||
*/
|
||||
const NON_PROSE_KEYS = new Set([
|
||||
"wordmarkSeal",
|
||||
"dateLocale",
|
||||
"tickerLiveTag",
|
||||
]);
|
||||
|
||||
/** Chrome keys that are real sentences/labels and must be translated. */
|
||||
@@ -77,9 +72,6 @@ const CHROME_PROSE_KEYS = [
|
||||
"navCommunity",
|
||||
"navPrimaryAria",
|
||||
"navHomeAria",
|
||||
"wordmarkTag",
|
||||
"traceLabel",
|
||||
"traceTabsAria",
|
||||
"menuOpen",
|
||||
"menuClose",
|
||||
"themeAria",
|
||||
@@ -93,15 +85,6 @@ const CHROME_PROSE_KEYS = [
|
||||
"switcherLabel",
|
||||
"switcherSwitchTo",
|
||||
"partialBadge",
|
||||
// Ticker chrome. The repository's own record (titles, handles, tags) stays
|
||||
// verbatim, but the verbs the strip prints around it are copy.
|
||||
"tickerMerged",
|
||||
"tickerOpened",
|
||||
"tickerClosed",
|
||||
"tickerReleased",
|
||||
"tickerFirstContribution",
|
||||
"tickerBy",
|
||||
"tickerAria",
|
||||
] as const satisfies readonly (keyof ChromeDict)[];
|
||||
|
||||
/**
|
||||
@@ -126,11 +109,8 @@ const HOME_PROSE_KEYS = [
|
||||
"shotPreview",
|
||||
"shotBuild",
|
||||
"screenshotAlt",
|
||||
"chapterTerminal",
|
||||
"chapterTerminalTitle",
|
||||
"gainHeading",
|
||||
"gainLede",
|
||||
"chapterModels",
|
||||
"modelsHeading",
|
||||
"modelsBody",
|
||||
"modelsLink",
|
||||
@@ -138,7 +118,6 @@ const HOME_PROSE_KEYS = [
|
||||
"startLede",
|
||||
"startGuideLink",
|
||||
"startVocabularyLink",
|
||||
"chapterAccount",
|
||||
"availabilityHeading",
|
||||
"availabilityLede",
|
||||
"availabilityNote",
|
||||
@@ -271,7 +250,6 @@ describe("website dictionaries", () => {
|
||||
for (const [label, get, reference] of [
|
||||
["docs-hooks", getDocsHooks, EN_DOCS_HOOKS],
|
||||
["docs-troubleshooting", getDocsTroubleshooting, EN_DOCS_TROUBLESHOOTING],
|
||||
["docs-constitution", getDocsConstitution, EN_DOCS_CONSTITUTION],
|
||||
["docs-runtime-api", getDocsRuntimeApi, EN_DOCS_RUNTIME_API],
|
||||
["docs-sandbox", getDocsSandbox, EN_DOCS_SANDBOX],
|
||||
["docs-subagents", getDocsSubagents, EN_DOCS_SUBAGENTS],
|
||||
@@ -382,37 +360,6 @@ describe("website dictionaries", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it("carries every code-span token through the constitution copy", () => {
|
||||
const tokensOf = (template: string) =>
|
||||
splitTokens(template).flatMap((part) => ("token" in part ? [part.token] : []));
|
||||
for (const locale of [...DICTIONARY_LOCALES, "und"]) {
|
||||
const constitution = getDocsConstitution(locale);
|
||||
expect(tokensOf(constitution.overviewLead), `${locale} overviewLead`).toEqual([
|
||||
"constitutionCommand",
|
||||
"homeConfig",
|
||||
"repoConfig",
|
||||
]);
|
||||
// Exactly one link slot, so the translated label is never concatenated
|
||||
// onto a fragment the call site owns.
|
||||
expect(tokensOf(constitution.authorityNote), `${locale} authorityNote`).toEqual([
|
||||
"configDocs",
|
||||
]);
|
||||
}
|
||||
});
|
||||
|
||||
it("splitTokens interleaves literal text and token names in template order", () => {
|
||||
expect(splitTokens("a {one} b {two}")).toEqual([
|
||||
{ text: "a " },
|
||||
{ token: "one" },
|
||||
{ text: " b " },
|
||||
{ token: "two" },
|
||||
]);
|
||||
// A template with no token is one literal run, and an empty run between
|
||||
// adjacent tokens is dropped rather than rendered as an empty node.
|
||||
expect(splitTokens("plain")).toEqual([{ text: "plain" }]);
|
||||
expect(splitTokens("{one}{two}")).toEqual([{ token: "one" }, { token: "two" }]);
|
||||
});
|
||||
|
||||
it("pickText selects the locale side of legacy { en, zh } pairs", () => {
|
||||
const pair = { en: "English", zh: "中文" };
|
||||
expect(pickText(pair, "zh")).toBe("中文");
|
||||
@@ -541,18 +488,6 @@ describe("website dictionaries", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it("carries the {handle} token through every ticker by-line", () => {
|
||||
// components/ticker.tsx splits on the token so the handle is typeset in
|
||||
// its own element. A locale that drops it would print a by-line with no
|
||||
// contributor in it — the opposite of the point.
|
||||
for (const locale of ["en", ...DICTIONARY_LOCALES]) {
|
||||
const byLine = getChrome(locale).tickerBy;
|
||||
expect(byLine, `${locale} tickerBy`).toContain("{handle}");
|
||||
const parts = splitToken(byLine, "handle");
|
||||
expect(parts.length, `${locale} tickerBy split`).toBe(2);
|
||||
}
|
||||
});
|
||||
|
||||
it("carries {date} through both legal pages' effective-date line", () => {
|
||||
// The date used to sit in the JSX between two translated fragments. Now
|
||||
// it is a fill() token, so a translation that drops it would ship a legal
|
||||
|
||||
@@ -33,25 +33,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "تسجيل الدخول",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "أي نموذج، على جهازك",
|
||||
|
||||
issueLabel: "عدد {date}",
|
||||
dateLocale: "ar",
|
||||
|
||||
tickerLiveLabel: "مباشر",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "دُمج",
|
||||
tickerOpened: "فُتح",
|
||||
tickerClosed: "أُغلق",
|
||||
tickerReleased: "أُصدر",
|
||||
tickerFirstContribution: "أول مساهمة",
|
||||
tickerBy: "بواسطة {handle}",
|
||||
tickerAria: "آخر نشاط في المستودع",
|
||||
|
||||
traceLabel: "أثر الاستدلال",
|
||||
traceTabsAria: "مقتطفات الجلسات",
|
||||
|
||||
menuOpen: "افتح القائمة",
|
||||
menuClose: "أغلق القائمة",
|
||||
|
||||
|
||||
@@ -38,7 +38,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "شاهد فحص الخلفية",
|
||||
source: "المصدر والمنصات الأخرى",
|
||||
platforms: "هذا التنزيل مخصص لنظام Mac. يعتمد Windows وLinux حاليًا على إضافة المصدر والإعداد من جهة المضيف.",
|
||||
installTitle: "Computer Use لنظام Mac",
|
||||
installLead: "أضف التحكم في التطبيقات في الخلفية عبر مساعد Computer Use. جهّز أذونات Mac، وشغّل فحص الخلفية، وأوقف إدخال المساعد مؤقتًا أو أنهِه من شريط القوائم.",
|
||||
installLink: "تنزيل Computer Use وإعداده",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "حالة الإصدار غير متاحة",
|
||||
currentSource: "المصدر",
|
||||
sourceCandidate: "غير منشور",
|
||||
providerRoutes: "{count} مزوّد",
|
||||
publishedRelease: "منشور",
|
||||
figcaptionSourceCandidate: "غير منشور",
|
||||
chapterTerminal: "طرفيتك",
|
||||
chapterTerminalTitle: "ابدأ بشيء تريد صنعه",
|
||||
gainHeading:
|
||||
"ما يمكنك فعله باستخدام Codewhale",
|
||||
gainLede:
|
||||
@@ -49,7 +46,6 @@ export const home: HomeDict = {
|
||||
"استخدم نماذج مستضافة أو محلية لوكلائك، بحيث تتولى النماذج والأدوار المختلفة أجزاء العمل المناسبة لها."
|
||||
]
|
||||
],
|
||||
chapterModels: "نماذجك",
|
||||
modelsHeading: "خيارات من النماذج لكل مهمة",
|
||||
modelsBody:
|
||||
"اتصل مباشرة بمزوّد نماذج مستضافة، أو استخدم بوابة للوصول إلى عدة مزوّدين، أو شغّل نموذجًا محليًا، ثم اختر النموذج الذي تستخدمه كل جلسة أثناء عملك.",
|
||||
@@ -64,7 +60,6 @@ export const home: HomeDict = {
|
||||
"بعد تثبيت Codewhale وربط نموذج، يمكنك وصف مهمتك الأولى في الطرفية وإضافة Fleet عندما تريد أن يتشارك عدة وكلاء العمل.",
|
||||
startGuideLink: "اقرأ دليل البداية ←",
|
||||
startVocabularyLink: "اطّلع على مفردات المنتج ←",
|
||||
chapterAccount: "احصل على Codewhale",
|
||||
availabilityHeading: "أين يمكنك استخدام Codewhale",
|
||||
availabilityLede:
|
||||
"يمكنك استخدام Codewhale في طرفيتك اليوم، بينما نعمل على تطوير تطبيق الويب وتطبيق سطح المكتب وأجهزة الكمبيوتر السحابية.",
|
||||
|
||||
@@ -38,25 +38,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Inicia la sessió",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "qualsevol model, a la teva màquina",
|
||||
|
||||
issueLabel: "Edició del {date}",
|
||||
dateLocale: "ca-ES",
|
||||
|
||||
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ú",
|
||||
|
||||
|
||||
@@ -39,7 +39,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Mira la comprovació en segon pla",
|
||||
source: "Codi font i altres plataformes",
|
||||
platforms: "Aquesta baixada és per a Mac. Windows i Linux fan servir de moment el connector des del codi font i la configuració a l’equip amfitrió.",
|
||||
installTitle: "Computer Use per a Mac",
|
||||
installLead: "Afegeix el control d’aplicacions en segon pla amb l’ajudant Computer Use. Configura els permisos del Mac, executa una comprovació en segon pla i pausa o atura l’entrada de l’ajudant des de la barra de menús.",
|
||||
installLink: "Baixada i configuració de Computer Use",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Estat de la versió no disponible",
|
||||
currentSource: "Font",
|
||||
sourceCandidate: "Sense publicar",
|
||||
providerRoutes: "{count} proveïdors",
|
||||
publishedRelease: "publicada",
|
||||
figcaptionSourceCandidate: "sense publicar",
|
||||
chapterTerminal: "El teu terminal",
|
||||
chapterTerminalTitle: "Comença amb alguna cosa que vulguis crear",
|
||||
gainHeading:
|
||||
"Què pots fer amb Codewhale",
|
||||
gainLede:
|
||||
@@ -49,7 +46,6 @@ export const home: HomeDict = {
|
||||
"Fes servir models allotjats o locals per als teus agents, amb models i rols diferents que s’encarreguin de les parts de la feina per a les quals són adequats."
|
||||
]
|
||||
],
|
||||
chapterModels: "Els teus models",
|
||||
modelsHeading: "Opcions de models per a cada tasca",
|
||||
modelsBody:
|
||||
"Connecta’t directament a un proveïdor de models allotjats, fes servir una passarel·la per accedir a diversos proveïdors o executa un model en local, i tria quin model fa servir cada sessió mentre treballes.",
|
||||
@@ -64,7 +60,6 @@ export const home: HomeDict = {
|
||||
"Un cop hagis instal·lat Codewhale i connectat un model, pots descriure la teva primera tasca al terminal i afegir un Fleet quan vulguis repartir la feina entre diversos agents.",
|
||||
startGuideLink: "Llegeix la guia d’inici",
|
||||
startVocabularyLink: "Consulta el vocabulari del producte",
|
||||
chapterAccount: "Obtenir Codewhale",
|
||||
availabilityHeading: "On pots fer servir Codewhale",
|
||||
availabilityLede:
|
||||
"Ja pots fer servir Codewhale al teu terminal mentre desenvolupem l’aplicació web, l’aplicació d’escriptori i els ordinadors al núvol.",
|
||||
|
||||
@@ -38,25 +38,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Anmelden",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "jedes Modell, auf deiner Maschine",
|
||||
|
||||
issueLabel: "Ausgabe vom {date}",
|
||||
dateLocale: "de-DE",
|
||||
|
||||
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",
|
||||
|
||||
|
||||
@@ -39,7 +39,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Hintergrundprüfung ansehen",
|
||||
source: "Quellcode und weitere Plattformen",
|
||||
platforms: "Dieser Download ist für den Mac. Windows und Linux nutzen derzeit das Quellcode-Plugin und die Einrichtung auf dem Host.",
|
||||
installTitle: "Computer Use für den Mac",
|
||||
installLead: "Füge App-Steuerung im Hintergrund mit dem Computer-Use-Helfer hinzu. Richte Mac-Berechtigungen ein, führe eine Hintergrundprüfung aus und pausiere oder stoppe die Eingaben des Helfers aus deiner Menüleiste.",
|
||||
installLink: "Computer Use herunterladen und einrichten",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Release-Status nicht verfügbar",
|
||||
currentSource: "Quelle",
|
||||
sourceCandidate: "Unveröffentlicht",
|
||||
providerRoutes: "{count} Provider",
|
||||
publishedRelease: "veröffentlicht",
|
||||
figcaptionSourceCandidate: "unveröffentlicht",
|
||||
chapterTerminal: "Dein Terminal",
|
||||
chapterTerminalTitle: "Beginne mit etwas, das du erstellen möchtest",
|
||||
gainHeading:
|
||||
"Was du mit Codewhale machen kannst",
|
||||
gainLede:
|
||||
@@ -49,7 +46,6 @@ export const home: HomeDict = {
|
||||
"Nutze gehostete oder lokale Modelle für deine Agenten und setze unterschiedliche Modelle und Rollen für die Teile einer Aufgabe ein, zu denen sie passen."
|
||||
]
|
||||
],
|
||||
chapterModels: "Deine Modelle",
|
||||
modelsHeading: "Eine Auswahl an Modellen für jede Aufgabe",
|
||||
modelsBody:
|
||||
"Verbinde dich direkt mit einem Anbieter gehosteter Modelle, greife über ein Gateway auf mehrere Anbieter zu oder führe ein Modell lokal aus, und wähle während der Arbeit das Modell für jede Sitzung.",
|
||||
@@ -64,7 +60,6 @@ export const home: HomeDict = {
|
||||
"Sobald du Codewhale installiert und ein Modell verbunden hast, kannst du deine erste Aufgabe im Terminal beschreiben und Fleet hinzunehmen, wenn mehrere Agenten die Arbeit unter sich aufteilen sollen.",
|
||||
startGuideLink: "Leitfaden für die ersten Schritte lesen",
|
||||
startVocabularyLink: "Produktvokabular ansehen",
|
||||
chapterAccount: "Codewhale holen",
|
||||
availabilityHeading: "Wo du Codewhale nutzen kannst",
|
||||
availabilityLede:
|
||||
"Du kannst Codewhale heute schon im Terminal nutzen, während wir an der Web-App, der Desktop-App und den Cloud-Computern arbeiten.",
|
||||
|
||||
@@ -25,25 +25,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Sign in",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "any model, on your machine",
|
||||
|
||||
issueLabel: "Issue {date}",
|
||||
dateLocale: "en-US",
|
||||
|
||||
tickerLiveLabel: "实 时",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "merged",
|
||||
tickerOpened: "opened",
|
||||
tickerClosed: "closed",
|
||||
tickerReleased: "released",
|
||||
tickerFirstContribution: "first contribution",
|
||||
tickerBy: "by {handle}",
|
||||
tickerAria: "Recent repository activity",
|
||||
|
||||
traceLabel: "reasoning trace",
|
||||
traceTabsAria: "Session excerpts",
|
||||
|
||||
menuOpen: "Open menu",
|
||||
menuClose: "Close menu",
|
||||
|
||||
|
||||
@@ -38,7 +38,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "See the background check",
|
||||
source: "Source and other platforms",
|
||||
platforms: "This download is for Mac. Windows and Linux currently use the source plugin and host-side setup.",
|
||||
installTitle: "Computer Use for Mac",
|
||||
installLead: "Add background app control with the Computer Use helper. Set up Mac permissions, run a background check, and pause or stop helper input from your menu bar.",
|
||||
installLink: "Computer Use download and setup",
|
||||
};
|
||||
@@ -1,35 +0,0 @@
|
||||
import type { DocsConstitutionDict } from "../types";
|
||||
|
||||
/**
|
||||
* English reference dictionary for `app/[locale]/docs/constitution/page.tsx`.
|
||||
* Copy moved verbatim from the page's `isZh` ternaries — any wording change
|
||||
* belongs in its own commit, never mixed into a structural move.
|
||||
*/
|
||||
export const docsConstitution: DocsConstitutionDict = {
|
||||
metaTitle: "Constitution and /constitution · Codewhale Docs",
|
||||
metaDescription:
|
||||
"User-global constitution, repo-local law, project instructions, and runtime boundaries.",
|
||||
bodyClassName: "text-ink-soft leading-relaxed",
|
||||
overviewTitle: "Constitution and /constitution",
|
||||
overviewTitleAside: "宪章与 /constitution",
|
||||
overviewLead:
|
||||
"Codewhale gives the agent an accountable address, then a legal system for context conflicts. {constitutionCommand} is the primary personal constitution surface: guided setup stores structured user-global data in {homeConfig} and renders it as model-facing prose. Repos can still add local law via {repoConfig}; runtime policy separately encodes modes, approval, sandbox, cost, and tool boundaries.",
|
||||
principles: [
|
||||
[
|
||||
"userGlobal",
|
||||
"Use /constitution for standing personal law across projects. It is structured data rendered to prose, not a raw prompt editor.",
|
||||
],
|
||||
[
|
||||
"repoLocal",
|
||||
".codewhale/constitution.json is optional project policy for protected invariants, branch rules, verification, and escalation.",
|
||||
],
|
||||
[
|
||||
"runtime",
|
||||
"Constitution text may express preferences, but approval, sandbox, shell, network, trust, and MCP permissions remain enforced config.",
|
||||
],
|
||||
],
|
||||
authorityNote:
|
||||
"Standard project instructions still live in AGENTS.md; memory and handoffs rank below constitutions and project instructions; the full base-prompt Markdown override is an expert escape hatch, not the normal setup path. See {configDocs}.",
|
||||
configDocsLabel: "configuration docs",
|
||||
sourceNote: "Source document: docs/ARCHITECTURE.md · Update docs-map.ts when changing.",
|
||||
};
|
||||
@@ -15,9 +15,8 @@ export const docsShell: DocsShellDict = {
|
||||
heroLead:
|
||||
"Start from what you want to do. Each page says what you need, shows commands you can run today, and points to the next step.",
|
||||
installCta: "Install Codewhale",
|
||||
sourceDocsCta: "Browse source docs ↗",
|
||||
|
||||
releaseLabel: "Release truth",
|
||||
releaseLabel: "Release",
|
||||
releasePublished: "Latest release {tag} · {date}",
|
||||
releaseCandidate:
|
||||
"These pages describe the {version} source candidate, which is not published yet.",
|
||||
|
||||
@@ -31,13 +31,9 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Release status unavailable",
|
||||
currentSource: "Source",
|
||||
sourceCandidate: "Unreleased",
|
||||
providerRoutes: "{count} providers",
|
||||
publishedRelease: "released",
|
||||
figcaptionSourceCandidate: "unreleased",
|
||||
|
||||
chapterTerminal: "Your terminal",
|
||||
chapterTerminalTitle: "Start with something you want to make",
|
||||
|
||||
gainHeading: "What you can do with Codewhale",
|
||||
gainLede:
|
||||
"Ask for a concrete result: fix a bug, understand a project, or turn a repeated task into a workflow. Start with one agent and split larger jobs when useful.",
|
||||
@@ -56,7 +52,6 @@ export const home: HomeDict = {
|
||||
]
|
||||
],
|
||||
|
||||
chapterModels: "Your models",
|
||||
modelsHeading: "A choice of models for every task",
|
||||
modelsBody:
|
||||
"Choose the provider and model for each session: connect with an API key, use a supported provider sign-in, or run a local model. Your Codewhale account and your model connection serve different purposes.",
|
||||
@@ -73,7 +68,6 @@ export const home: HomeDict = {
|
||||
startGuideLink: "Read the getting-started guide",
|
||||
startVocabularyLink: "Look up a term",
|
||||
|
||||
chapterAccount: "Get Codewhale",
|
||||
availabilityHeading: "Where you can use Codewhale",
|
||||
availabilityLede:
|
||||
"The terminal and local browser client are available now. Desktop and hosted web apps are being developed around the same session model; their availability is listed separately below.",
|
||||
|
||||
@@ -21,8 +21,6 @@ export const states: StatesDict = {
|
||||
notFoundBody:
|
||||
"The link may be out of date, or the address has a typo. Start again from the home page or the documentation.",
|
||||
notFoundHomeLink: "Go to the home page",
|
||||
notFoundPosterAlt:
|
||||
"A blue whale in tactical gear on the fictional Codwhale: Modern Whalefare game poster.",
|
||||
unavailableTitle: "The live record has not loaded",
|
||||
unavailableBody:
|
||||
"The source did not answer the last refresh, or this page has not refreshed since it was built. Nothing is shown in its place.",
|
||||
|
||||
@@ -34,25 +34,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Iniciar sesión",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "cualquier modelo, en tu máquina",
|
||||
|
||||
issueLabel: "Edición {date}",
|
||||
dateLocale: "es-419",
|
||||
|
||||
tickerLiveLabel: "En vivo",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "fusionado",
|
||||
tickerOpened: "abierto",
|
||||
tickerClosed: "cerrado",
|
||||
tickerReleased: "publicado",
|
||||
tickerFirstContribution: "primera contribución",
|
||||
tickerBy: "por {handle}",
|
||||
tickerAria: "Actividad reciente del repositorio",
|
||||
|
||||
traceLabel: "traza de razonamiento",
|
||||
traceTabsAria: "Extractos de sesión",
|
||||
|
||||
menuOpen: "Abrir menú",
|
||||
menuClose: "Cerrar menú",
|
||||
|
||||
|
||||
@@ -40,7 +40,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Ver la comprobación en segundo plano",
|
||||
source: "Código fuente y otras plataformas",
|
||||
platforms: "Esta descarga es para Mac. En Windows y Linux, por ahora, se usa el plugin desde el código fuente y la configuración del lado del host.",
|
||||
installTitle: "Computer Use para Mac",
|
||||
installLead: "Añade el control de aplicaciones en segundo plano con el asistente de Computer Use. Configura los permisos de tu Mac, ejecuta una comprobación en segundo plano y pausa o detén la entrada del asistente desde la barra de menús.",
|
||||
installLink: "Descarga y configuración de Computer Use",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Estado del lanzamiento no disponible",
|
||||
currentSource: "Fuente",
|
||||
sourceCandidate: "Sin publicar",
|
||||
providerRoutes: "{count} proveedores",
|
||||
publishedRelease: "publicado",
|
||||
figcaptionSourceCandidate: "sin publicar",
|
||||
chapterTerminal: "Tu terminal",
|
||||
chapterTerminalTitle: "Empieza con algo que quieras crear",
|
||||
gainHeading:
|
||||
"Qué puedes hacer con Codewhale",
|
||||
gainLede:
|
||||
@@ -49,7 +46,6 @@ export const home: HomeDict = {
|
||||
"Usa modelos alojados o locales para tus agentes, con distintos modelos y roles que se encarguen de las partes del trabajo para las que son adecuados."
|
||||
]
|
||||
],
|
||||
chapterModels: "Tus modelos",
|
||||
modelsHeading: "Opciones de modelos para cada tarea",
|
||||
modelsBody:
|
||||
"Conéctate directamente a un proveedor de modelos alojados, usa una pasarela para acceder a varios proveedores o ejecuta un modelo en local, y elige qué modelo usa cada sesión mientras trabajas.",
|
||||
@@ -64,7 +60,6 @@ export const home: HomeDict = {
|
||||
"Una vez que hayas instalado Codewhale y conectado un modelo, puedes describir tu primera tarea en la terminal y añadir un Fleet cuando quieras repartir el trabajo entre varios agentes.",
|
||||
startGuideLink: "Leer la guía de primeros pasos",
|
||||
startVocabularyLink: "Ver el vocabulario del producto",
|
||||
chapterAccount: "Obtener Codewhale",
|
||||
availabilityHeading: "Dónde puedes usar Codewhale",
|
||||
availabilityLede:
|
||||
"Ya puedes usar Codewhale en tu terminal mientras desarrollamos la aplicación web, la aplicación de escritorio y las computadoras en la nube.",
|
||||
|
||||
@@ -38,25 +38,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Se connecter",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "n’importe quel modèle, sur votre machine",
|
||||
|
||||
issueLabel: "Édition du {date}",
|
||||
dateLocale: "fr-FR",
|
||||
|
||||
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",
|
||||
|
||||
|
||||
@@ -39,7 +39,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Voir la vérification en arrière-plan",
|
||||
source: "Code source et autres plateformes",
|
||||
platforms: "Ce téléchargement est destiné au Mac. Sous Windows et Linux, on utilise pour l’instant le plugin depuis les sources et la configuration côté hôte.",
|
||||
installTitle: "Computer Use pour Mac",
|
||||
installLead: "Ajoutez le contrôle des apps en arrière-plan avec l’assistant Computer Use. Configurez les autorisations du Mac, lancez une vérification en arrière-plan, puis mettez en pause ou arrêtez la saisie de l’assistant depuis votre barre des menus.",
|
||||
installLink: "Téléchargement et configuration de Computer Use",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "État des versions indisponible",
|
||||
currentSource: "Source",
|
||||
sourceCandidate: "Non publiée",
|
||||
providerRoutes: "{count} fournisseurs",
|
||||
publishedRelease: "publiée",
|
||||
figcaptionSourceCandidate: "non publiée",
|
||||
chapterTerminal: "Votre terminal",
|
||||
chapterTerminalTitle: "Commencez par ce que vous voulez créer",
|
||||
gainHeading:
|
||||
"Ce que vous pouvez faire avec Codewhale",
|
||||
gainLede:
|
||||
@@ -49,7 +46,6 @@ export const home: HomeDict = {
|
||||
"Utilisez des modèles hébergés ou locaux pour vos agents, avec différents modèles et rôles pour les parties du travail auxquelles ils sont adaptés."
|
||||
]
|
||||
],
|
||||
chapterModels: "Vos modèles",
|
||||
modelsHeading: "Un choix de modèles pour chaque tâche",
|
||||
modelsBody:
|
||||
"Connectez-vous directement à un fournisseur de modèles hébergés, passez par une passerelle pour accéder à plusieurs fournisseurs ou exécutez un modèle en local, puis choisissez le modèle utilisé par chaque session au fil de votre travail.",
|
||||
@@ -64,7 +60,6 @@ export const home: HomeDict = {
|
||||
"Une fois Codewhale installé et un modèle connecté, vous pouvez décrire votre première tâche dans le terminal et ajouter un Fleet lorsque vous souhaitez répartir le travail entre plusieurs agents.",
|
||||
startGuideLink: "Lire le guide de démarrage",
|
||||
startVocabularyLink: "Voir le vocabulaire du produit",
|
||||
chapterAccount: "Obtenir Codewhale",
|
||||
availabilityHeading: "Où vous pouvez utiliser Codewhale",
|
||||
availabilityLede:
|
||||
"Vous pouvez utiliser Codewhale dans votre terminal dès aujourd’hui, pendant que nous développons l’application web, l’application de bureau et les ordinateurs cloud.",
|
||||
|
||||
@@ -36,25 +36,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "साइन इन करें",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "कोई भी मॉडल, आपकी मशीन पर",
|
||||
|
||||
issueLabel: "{date} का अंक",
|
||||
dateLocale: "hi-IN",
|
||||
|
||||
tickerLiveLabel: "लाइव",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "मर्ज",
|
||||
tickerOpened: "खोला गया",
|
||||
tickerClosed: "बंद किया गया",
|
||||
tickerReleased: "रिलीज़ हुआ",
|
||||
tickerFirstContribution: "पहला योगदान",
|
||||
tickerBy: "{handle} द्वारा",
|
||||
tickerAria: "रिपॉज़िटरी की हालिया गतिविधि",
|
||||
|
||||
traceLabel: "रीज़निंग ट्रेस",
|
||||
traceTabsAria: "सेशन के अंश",
|
||||
|
||||
menuOpen: "मेनू खोलें",
|
||||
menuClose: "मेनू बंद करें",
|
||||
|
||||
|
||||
@@ -38,7 +38,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "बैकग्राउंड जाँच देखें",
|
||||
source: "सोर्स और अन्य प्लेटफ़ॉर्म",
|
||||
platforms: "यह डाउनलोड Mac के लिए है। Windows और Linux पर फ़िलहाल सोर्स प्लगइन और होस्ट-साइड सेटअप का उपयोग होता है।",
|
||||
installTitle: "Mac के लिए Computer Use",
|
||||
installLead: "Computer Use हेल्पर से बैकग्राउंड में ऐप नियंत्रण जोड़ें। Mac की अनुमतियाँ सेट करें, बैकग्राउंड जाँच चलाएँ और मेनू बार से हेल्पर का इनपुट रोकें या बंद करें।",
|
||||
installLink: "Computer Use डाउनलोड और सेटअप",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "रिलीज़ स्थिति उपलब्ध नहीं",
|
||||
currentSource: "सोर्स",
|
||||
sourceCandidate: "अप्रकाशित",
|
||||
providerRoutes: "{count} प्रोवाइडर",
|
||||
publishedRelease: "प्रकाशित",
|
||||
figcaptionSourceCandidate: "अप्रकाशित",
|
||||
chapterTerminal: "आपका टर्मिनल",
|
||||
chapterTerminalTitle: "किसी ऐसी चीज़ से शुरू करें जिसे आप बनाना चाहते हैं",
|
||||
gainHeading:
|
||||
"Codewhale से आप क्या कर सकते हैं",
|
||||
gainLede:
|
||||
@@ -49,7 +46,6 @@ export const home: HomeDict = {
|
||||
"अपने एजेंटों के लिए होस्टेड या लोकल मॉडल इस्तेमाल करें और काम के हिस्से उनके लिए उपयुक्त मॉडल और भूमिकाओं को सौंपें।"
|
||||
]
|
||||
],
|
||||
chapterModels: "आपके मॉडल",
|
||||
modelsHeading: "हर काम के लिए मॉडल का चुनाव",
|
||||
modelsBody:
|
||||
"होस्टेड मॉडल देने वाले किसी प्रदाता से सीधे जुड़ें, कई प्रदाताओं से जुड़ने के लिए गेटवे इस्तेमाल करें या मॉडल लोकल चलाएँ, फिर काम करते हुए चुनें कि हर सेशन में कौन-सा मॉडल इस्तेमाल हो।",
|
||||
@@ -64,7 +60,6 @@ export const home: HomeDict = {
|
||||
"Codewhale इंस्टॉल करके मॉडल कनेक्ट करने के बाद आप टर्मिनल में अपना पहला काम बता सकते हैं और जब कई एजेंटों के बीच काम बाँटना चाहें, तब Fleet जोड़ सकते हैं।",
|
||||
startGuideLink: "शुरुआती गाइड पढ़ें",
|
||||
startVocabularyLink: "उत्पाद शब्दावली देखें",
|
||||
chapterAccount: "Codewhale लें",
|
||||
availabilityHeading: "आप Codewhale कहाँ इस्तेमाल कर सकते हैं",
|
||||
availabilityLede:
|
||||
"आप आज ही Codewhale को अपने टर्मिनल में इस्तेमाल कर सकते हैं, जबकि हम वेब ऐप, डेस्कटॉप ऐप और क्लाउड कंप्यूटर बनाने पर काम कर रहे हैं।",
|
||||
|
||||
@@ -32,25 +32,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Masuk",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "model apa pun, di mesin Anda",
|
||||
|
||||
issueLabel: "Edisi {date}",
|
||||
dateLocale: "id-ID",
|
||||
|
||||
tickerLiveLabel: "Langsung",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "digabungkan",
|
||||
tickerOpened: "dibuka",
|
||||
tickerClosed: "ditutup",
|
||||
tickerReleased: "dirilis",
|
||||
tickerFirstContribution: "kontribusi pertama",
|
||||
tickerBy: "oleh {handle}",
|
||||
tickerAria: "Aktivitas terbaru repositori",
|
||||
|
||||
traceLabel: "jejak penalaran",
|
||||
traceTabsAria: "Cuplikan sesi",
|
||||
|
||||
menuOpen: "Buka menu",
|
||||
menuClose: "Tutup menu",
|
||||
|
||||
|
||||
@@ -38,7 +38,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Lihat pemeriksaan latar belakang",
|
||||
source: "Kode sumber dan platform lain",
|
||||
platforms: "Unduhan ini untuk Mac. Windows dan Linux saat ini menggunakan plugin dari kode sumber dan penyiapan di sisi host.",
|
||||
installTitle: "Computer Use untuk Mac",
|
||||
installLead: "Tambahkan kendali aplikasi di latar belakang dengan pembantu Computer Use. Siapkan izin Mac, jalankan pemeriksaan latar belakang, dan jeda atau hentikan input pembantu dari bar menu Anda.",
|
||||
installLink: "Unduh dan siapkan Computer Use",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Status rilis tidak tersedia",
|
||||
currentSource: "Sumber",
|
||||
sourceCandidate: "Belum dirilis",
|
||||
providerRoutes: "{count} penyedia",
|
||||
publishedRelease: "dirilis",
|
||||
figcaptionSourceCandidate: "belum dirilis",
|
||||
chapterTerminal: "Terminal Anda",
|
||||
chapterTerminalTitle: "Mulai dengan sesuatu yang ingin Anda buat",
|
||||
gainHeading:
|
||||
"Yang dapat Anda lakukan dengan Codewhale",
|
||||
gainLede:
|
||||
@@ -49,7 +46,6 @@ export const home: HomeDict = {
|
||||
"Gunakan model yang dihosting atau dijalankan secara lokal untuk agen Anda, dengan model dan peran yang berbeda menangani bagian pekerjaan yang sesuai."
|
||||
]
|
||||
],
|
||||
chapterModels: "Model Anda",
|
||||
modelsHeading: "Pilihan model untuk setiap tugas",
|
||||
modelsBody:
|
||||
"Hubungkan langsung ke penyedia model yang dihosting, gunakan gateway untuk mengakses beberapa penyedia, atau jalankan model secara lokal, lalu pilih model yang digunakan setiap sesi selama Anda bekerja.",
|
||||
@@ -64,7 +60,6 @@ export const home: HomeDict = {
|
||||
"Setelah menginstal Codewhale dan menghubungkan model, Anda dapat menjelaskan tugas pertama di terminal dan menambahkan Fleet saat ingin beberapa agen berbagi pekerjaan.",
|
||||
startGuideLink: "Baca panduan memulai",
|
||||
startVocabularyLink: "Lihat kosakata produk",
|
||||
chapterAccount: "Dapatkan Codewhale",
|
||||
availabilityHeading:
|
||||
"Tempat Anda dapat menggunakan Codewhale",
|
||||
availabilityLede:
|
||||
|
||||
@@ -19,7 +19,6 @@ import type {
|
||||
DocsAuthDict,
|
||||
DocsComputersDict,
|
||||
DocsConfigurationDict,
|
||||
DocsConstitutionDict,
|
||||
DocsFleetDict,
|
||||
DocsGuideDict,
|
||||
DocsHooksDict,
|
||||
@@ -52,8 +51,6 @@ import { docsTroubleshooting as enDocsTroubleshooting } from "./en/docs-troubles
|
||||
import { docsTroubleshooting as zhDocsTroubleshooting } from "./zh/docs-troubleshooting";
|
||||
import { docsConfiguration as enDocsConfiguration } from "./en/docs-configuration";
|
||||
import { docsConfiguration as zhDocsConfiguration } from "./zh/docs-configuration";
|
||||
import { docsConstitution as enDocsConstitution } from "./en/docs-constitution";
|
||||
import { docsConstitution as zhDocsConstitution } from "./zh/docs-constitution";
|
||||
import { docsFleet as enDocsFleet } from "./en/docs-fleet";
|
||||
import { docsFleet as zhDocsFleet } from "./zh/docs-fleet";
|
||||
import { docsMcp as enDocsMcp } from "./en/docs-mcp";
|
||||
@@ -227,10 +224,6 @@ const DOCS_CONFIGURATION: Record<string, DocsConfigurationDict> = {
|
||||
zh: zhDocsConfiguration,
|
||||
};
|
||||
|
||||
const DOCS_CONSTITUTION: Record<string, DocsConstitutionDict> = {
|
||||
zh: zhDocsConstitution,
|
||||
};
|
||||
|
||||
const DOCS_FLEET: Record<string, DocsFleetDict> = {
|
||||
zh: zhDocsFleet,
|
||||
};
|
||||
@@ -353,10 +346,6 @@ export function getDocsConfiguration(locale: string): DocsConfigurationDict {
|
||||
return DOCS_CONFIGURATION[locale] ?? enDocsConfiguration;
|
||||
}
|
||||
|
||||
export function getDocsConstitution(locale: string): DocsConstitutionDict {
|
||||
return DOCS_CONSTITUTION[locale] ?? enDocsConstitution;
|
||||
}
|
||||
|
||||
export function getDocsFleet(locale: string): DocsFleetDict {
|
||||
return DOCS_FLEET[locale] ?? enDocsFleet;
|
||||
}
|
||||
@@ -453,7 +442,6 @@ export const EN_DOCS_SHELL = enDocsShell;
|
||||
export const EN_DOCS_HOOKS = enDocsHooks;
|
||||
export const EN_DOCS_TROUBLESHOOTING = enDocsTroubleshooting;
|
||||
export const EN_DOCS_CONFIGURATION = enDocsConfiguration;
|
||||
export const EN_DOCS_CONSTITUTION = enDocsConstitution;
|
||||
export const EN_DOCS_FLEET = enDocsFleet;
|
||||
export const EN_DOCS_MCP = enDocsMcp;
|
||||
export const EN_DOCS_MODES = enDocsModes;
|
||||
@@ -492,16 +480,3 @@ export function splitToken(template: string, token: string): string[] {
|
||||
return template.split(`{${token}}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Split a template on every `{token}` it carries, for a sentence with more
|
||||
* than one substituted node. Returns literal text and token names
|
||||
* interleaved in template order, so a locale that reorders the tokens still
|
||||
* renders correctly and no translated fragment is concatenated by the
|
||||
* call site.
|
||||
*/
|
||||
export function splitTokens(template: string): Array<{ text: string } | { token: string }> {
|
||||
return template
|
||||
.split(/\{(\w+)\}/g)
|
||||
.map((part, i) => (i % 2 === 1 ? { token: part } : { text: part }))
|
||||
.filter((part) => "token" in part || part.text !== "");
|
||||
}
|
||||
@@ -36,25 +36,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Accedi",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "qualsiasi modello, sulla tua macchina",
|
||||
|
||||
issueLabel: "Edizione del {date}",
|
||||
dateLocale: "it-IT",
|
||||
|
||||
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",
|
||||
|
||||
|
||||
@@ -38,7 +38,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Guarda il test in background",
|
||||
source: "Codice sorgente e altre piattaforme",
|
||||
platforms: "Questo download è per Mac. Windows e Linux usano al momento il plugin da sorgente e la configurazione lato host.",
|
||||
installTitle: "Computer Use per Mac",
|
||||
installLead: "Aggiungi il controllo delle app in background con l’helper Computer Use. Configura i permessi del Mac, esegui un test in background e metti in pausa o ferma l’input dell’helper dalla barra dei menu.",
|
||||
installLink: "Download e configurazione di Computer Use",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Stato delle release non disponibile",
|
||||
currentSource: "Sorgente",
|
||||
sourceCandidate: "Non rilasciata",
|
||||
providerRoutes: "{count} provider",
|
||||
publishedRelease: "rilasciata",
|
||||
figcaptionSourceCandidate: "non rilasciata",
|
||||
chapterTerminal: "Il tuo terminale",
|
||||
chapterTerminalTitle: "Inizia da qualcosa che vuoi creare",
|
||||
gainHeading: "Cosa puoi fare con Codewhale",
|
||||
gainLede:
|
||||
"Inizia con un progetto, una domanda o un’attività che vuoi automatizzare, poi lavora con un agente o assegna parti di un lavoro più grande a più agenti.",
|
||||
@@ -48,7 +45,6 @@ export const home: HomeDict = {
|
||||
"Usa modelli ospitati o locali per i tuoi agenti, con modelli e ruoli diversi che gestiscano le parti del lavoro a cui sono adatti."
|
||||
]
|
||||
],
|
||||
chapterModels: "I tuoi modelli",
|
||||
modelsHeading: "Una scelta di modelli per ogni attività",
|
||||
modelsBody:
|
||||
"Collegati direttamente a un provider di modelli ospitati, usa un gateway per accedere a più provider o esegui un modello in locale, poi scegli quale modello usa ogni sessione mentre lavori.",
|
||||
@@ -63,7 +59,6 @@ export const home: HomeDict = {
|
||||
"Dopo aver installato Codewhale e collegato un modello, puoi descrivere la tua prima attività nel terminale e aggiungere un Fleet quando vuoi distribuire il lavoro tra più agenti.",
|
||||
startGuideLink: "Leggi la guida introduttiva",
|
||||
startVocabularyLink: "Vedi il vocabolario del prodotto",
|
||||
chapterAccount: "Ottieni Codewhale",
|
||||
availabilityHeading: "Dove puoi usare Codewhale",
|
||||
availabilityLede:
|
||||
"Puoi già usare Codewhale nel tuo terminale mentre sviluppiamo l’app web, l’app desktop e i computer cloud.",
|
||||
|
||||
@@ -33,25 +33,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "ログイン",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "どんなモデルでも、あなたのマシンで",
|
||||
|
||||
issueLabel: "{date} 号",
|
||||
dateLocale: "ja-JP",
|
||||
|
||||
tickerLiveLabel: "速 報",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "マージ",
|
||||
tickerOpened: "オープン",
|
||||
tickerClosed: "クローズ",
|
||||
tickerReleased: "リリース",
|
||||
tickerFirstContribution: "初コントリビュート",
|
||||
tickerBy: "{handle} さん",
|
||||
tickerAria: "リポジトリの最近の動き",
|
||||
|
||||
traceLabel: "推論トレース",
|
||||
traceTabsAria: "セッションの抜粋",
|
||||
|
||||
menuOpen: "メニューを開く",
|
||||
menuClose: "メニューを閉じる",
|
||||
|
||||
|
||||
@@ -39,7 +39,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "バックグラウンドチェックを見る",
|
||||
source: "ソースコードとその他のプラットフォーム",
|
||||
platforms: "このダウンロードは Mac 用です。Windows と Linux では現在、ソースプラグインとホスト側のセットアップを使用します。",
|
||||
installTitle: "Mac 版 Computer Use",
|
||||
installLead: "Computer Use ヘルパーでアプリのバックグラウンド操作を追加します。Mac の権限を設定し、バックグラウンドチェックを実行して、メニューバーからヘルパーの入力を一時停止または停止できます。",
|
||||
installLink: "Computer Use のダウンロードと設定",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "リリース情報を取得できません",
|
||||
currentSource: "ソース",
|
||||
sourceCandidate: "未リリース",
|
||||
providerRoutes: "{count} プロバイダー",
|
||||
publishedRelease: "リリース済み",
|
||||
figcaptionSourceCandidate: "未リリース",
|
||||
chapterTerminal: "あなたのターミナル",
|
||||
chapterTerminalTitle: "作りたいものから始める",
|
||||
gainHeading: "Codewhale でできること",
|
||||
gainLede: "プロジェクトや質問、自動化したい作業から始めて、ひとつのエージェントと一緒に進めることも、大きな仕事を複数のエージェントに分担させることもできます。",
|
||||
gain: [
|
||||
@@ -47,7 +44,6 @@ export const home: HomeDict = {
|
||||
"エージェントにホスト型またはローカルのモデルを使い、モデルや役割に合った仕事をそれぞれに任せられます。"
|
||||
]
|
||||
],
|
||||
chapterModels: "あなたのモデル",
|
||||
modelsHeading: "作業に合わせて選べるモデル",
|
||||
modelsBody:
|
||||
"ホスト型のプロバイダーに直接接続することも、ゲートウェイを通じて複数のプロバイダーを利用することも、モデルをローカルで実行することもでき、作業中にセッションごとに使うモデルを選べます。",
|
||||
@@ -61,7 +57,6 @@ export const home: HomeDict = {
|
||||
startLede: "Codewhale をインストールしてモデルを接続したら、ターミナルで最初の作業を伝え、複数のエージェントに分担してほしくなったときに Fleet を追加できます。",
|
||||
startGuideLink: "はじめかたガイドを読む",
|
||||
startVocabularyLink: "製品用語を見る",
|
||||
chapterAccount: "Codewhale を入手",
|
||||
availabilityHeading: "Codewhale を使える場所",
|
||||
availabilityLede: "Codewhale は今すぐターミナルで使え、Web アプリ、デスクトップアプリ、クラウドコンピューターも現在開発しています。",
|
||||
availability: [
|
||||
|
||||
@@ -36,27 +36,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "로그인",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "어떤 모델이든, 당신의 머신에서",
|
||||
|
||||
// Newspaper dating: Korean papers write the issue date with the 자 suffix
|
||||
// (8월 3일자), so the label is the date itself rather than "제N호".
|
||||
issueLabel: "{date}자",
|
||||
dateLocale: "ko-KR",
|
||||
|
||||
tickerLiveLabel: "실시간",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "병합됨",
|
||||
tickerOpened: "열림",
|
||||
tickerClosed: "닫힘",
|
||||
tickerReleased: "릴리스",
|
||||
tickerFirstContribution: "첫 기여",
|
||||
tickerBy: "{handle} 님",
|
||||
tickerAria: "저장소 최근 활동",
|
||||
|
||||
traceLabel: "추론 기록",
|
||||
traceTabsAria: "세션 발췌",
|
||||
|
||||
menuOpen: "메뉴 열기",
|
||||
menuClose: "메뉴 닫기",
|
||||
|
||||
|
||||
@@ -39,7 +39,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "백그라운드 검사 보기",
|
||||
source: "소스 및 다른 플랫폼",
|
||||
platforms: "이 다운로드는 Mac용입니다. Windows와 Linux는 현재 소스 플러그인과 호스트 측 설정을 사용합니다.",
|
||||
installTitle: "Mac용 Computer Use",
|
||||
installLead: "Computer Use 도우미로 백그라운드 앱 제어를 추가하세요. Mac 권한을 설정하고 백그라운드 검사를 실행한 뒤, 메뉴 막대에서 도우미 입력을 일시 정지하거나 중지할 수 있습니다.",
|
||||
installLink: "Computer Use 다운로드 및 설정",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "릴리스 상태를 확인할 수 없음",
|
||||
currentSource: "소스",
|
||||
sourceCandidate: "미공개",
|
||||
providerRoutes: "프로바이더 {count}개",
|
||||
publishedRelease: "공개됨",
|
||||
figcaptionSourceCandidate: "미공개",
|
||||
chapterTerminal: "당신의 터미널",
|
||||
chapterTerminalTitle: "만들고 싶은 것부터 시작하세요",
|
||||
gainHeading: "Codewhale로 할 수 있는 일",
|
||||
gainLede: "프로젝트나 질문, 자동화하고 싶은 작업에서 시작해 에이전트 하나와 함께 진행하거나 큰 작업의 여러 부분을 여러 에이전트에게 나누어 맡길 수 있습니다.",
|
||||
gain: [
|
||||
@@ -47,7 +44,6 @@ export const home: HomeDict = {
|
||||
"에이전트에 호스팅형 또는 로컬 모델을 사용하고 서로 다른 모델과 역할이 각각 적합한 작업을 맡도록 할 수 있습니다."
|
||||
]
|
||||
],
|
||||
chapterModels: "당신의 모델",
|
||||
modelsHeading: "작업마다 선택할 수 있는 다양한 모델",
|
||||
modelsBody:
|
||||
"호스팅형 모델 제공업체에 직접 연결하거나 게이트웨이로 여러 제공업체를 이용하거나 모델을 로컬에서 실행한 뒤, 작업하면서 세션별로 사용할 모델을 선택할 수 있습니다.",
|
||||
@@ -61,7 +57,6 @@ export const home: HomeDict = {
|
||||
startLede: "Codewhale을 설치하고 모델을 연결하면 터미널에서 첫 작업을 설명할 수 있으며, 여러 에이전트가 작업을 나누어 맡도록 하고 싶을 때 Fleet을 추가할 수 있습니다.",
|
||||
startGuideLink: "시작 가이드 읽기",
|
||||
startVocabularyLink: "제품 용어 보기",
|
||||
chapterAccount: "Codewhale 받기",
|
||||
availabilityHeading: "Codewhale을 사용할 수 있는 곳",
|
||||
availabilityLede: "Codewhale은 지금 터미널에서 사용할 수 있으며, 웹 앱과 데스크톱 앱, 클라우드 컴퓨터는 개발 중입니다.",
|
||||
availability: [
|
||||
|
||||
@@ -35,25 +35,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Zaloguj się",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "dowolny model, na twojej maszynie",
|
||||
|
||||
issueLabel: "Wydanie z {date}",
|
||||
dateLocale: "pl-PL",
|
||||
|
||||
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",
|
||||
|
||||
|
||||
@@ -38,7 +38,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Zobacz test w tle",
|
||||
source: "Kod źródłowy i inne platformy",
|
||||
platforms: "Ten plik jest przeznaczony na Maca. Windows i Linux korzystają obecnie z wtyczki źródłowej i konfiguracji po stronie hosta.",
|
||||
installTitle: "Computer Use na Maca",
|
||||
installLead: "Dodaj sterowanie aplikacjami w tle dzięki pomocnikowi Computer Use. Skonfiguruj uprawnienia na Macu, uruchom test w tle i wstrzymuj lub zatrzymuj wprowadzanie danych przez pomocnika z paska menu.",
|
||||
installLink: "Pobieranie i konfiguracja Computer Use",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Status wydania niedostępny",
|
||||
currentSource: "Źródło",
|
||||
sourceCandidate: "Niewydane",
|
||||
providerRoutes: "{count} providerów",
|
||||
publishedRelease: "wydane",
|
||||
figcaptionSourceCandidate: "niewydane",
|
||||
chapterTerminal: "Twój terminal",
|
||||
chapterTerminalTitle: "Zacznij od tego, co chcesz stworzyć",
|
||||
gainHeading:
|
||||
"Co możesz zrobić z Codewhale",
|
||||
gainLede:
|
||||
@@ -49,7 +46,6 @@ export const home: HomeDict = {
|
||||
"Korzystaj z hostowanych lub lokalnych modeli dla swoich agentów i dobieraj różne modele oraz role do odpowiednich części zadania."
|
||||
]
|
||||
],
|
||||
chapterModels: "Twoje modele",
|
||||
modelsHeading: "Wybór modeli do każdego zadania",
|
||||
modelsBody:
|
||||
"Połącz się bezpośrednio z dostawcą modeli hostowanych, użyj bramki, by korzystać z kilku dostawców, lub uruchom model lokalnie, a następnie wybieraj w trakcie pracy model dla każdej sesji.",
|
||||
@@ -64,7 +60,6 @@ export const home: HomeDict = {
|
||||
"Po zainstalowaniu Codewhale i podłączeniu modelu możesz opisać pierwsze zadanie w terminalu, a gdy zechcesz rozdzielić pracę między kilku agentów, dodać Fleet.",
|
||||
startGuideLink: "Przeczytaj przewodnik na start",
|
||||
startVocabularyLink: "Zobacz słownik produktu",
|
||||
chapterAccount: "Pobierz Codewhale",
|
||||
availabilityHeading: "Gdzie możesz korzystać z Codewhale",
|
||||
availabilityLede:
|
||||
"Możesz już dziś korzystać z Codewhale w terminalu, a my pracujemy nad aplikacją webową, aplikacją desktopową i komputerami w chmurze.",
|
||||
|
||||
@@ -27,25 +27,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Entrar",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "qualquer modelo, na sua máquina",
|
||||
|
||||
issueLabel: "Edição {date}",
|
||||
dateLocale: "pt-BR",
|
||||
|
||||
tickerLiveLabel: "Ao vivo",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "mesclado",
|
||||
tickerOpened: "aberto",
|
||||
tickerClosed: "fechado",
|
||||
tickerReleased: "lançado",
|
||||
tickerFirstContribution: "primeira contribuição",
|
||||
tickerBy: "por {handle}",
|
||||
tickerAria: "Atividade recente do repositório",
|
||||
|
||||
traceLabel: "rastro de raciocínio",
|
||||
traceTabsAria: "Trechos da sessão",
|
||||
|
||||
menuOpen: "Abrir menu",
|
||||
menuClose: "Fechar menu",
|
||||
|
||||
|
||||
@@ -38,7 +38,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Veja a verificação em segundo plano",
|
||||
source: "Código-fonte e outras plataformas",
|
||||
platforms: "Este download é para Mac. No Windows e no Linux, por enquanto, usa-se o plugin a partir do código-fonte com configuração no lado do host.",
|
||||
installTitle: "Computer Use para Mac",
|
||||
installLead: "Adicione controle de apps em segundo plano com o assistente Computer Use. Configure as permissões do Mac, execute uma verificação em segundo plano e pause ou interrompa a entrada do assistente pela barra de menus.",
|
||||
installLink: "Download e configuração do Computer Use",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Status do lançamento indisponível",
|
||||
currentSource: "Código-fonte",
|
||||
sourceCandidate: "Não publicado",
|
||||
providerRoutes: "{count} provedores",
|
||||
publishedRelease: "publicado",
|
||||
figcaptionSourceCandidate: "não publicado",
|
||||
chapterTerminal: "Seu terminal",
|
||||
chapterTerminalTitle: "Comece com algo que você queira criar",
|
||||
gainHeading:
|
||||
"O que você pode fazer com o Codewhale",
|
||||
gainLede:
|
||||
@@ -49,7 +46,6 @@ export const home: HomeDict = {
|
||||
"Use modelos hospedados ou locais para seus agentes, com modelos e papéis diferentes cuidando das partes do trabalho às quais são adequados."
|
||||
]
|
||||
],
|
||||
chapterModels: "Seus modelos",
|
||||
modelsHeading: "Opções de modelos para cada tarefa",
|
||||
modelsBody:
|
||||
"Conecte-se diretamente a um provedor de modelos hospedados, use um gateway para acessar vários provedores ou execute um modelo localmente, depois escolha qual modelo cada sessão usa enquanto trabalha.",
|
||||
@@ -64,7 +60,6 @@ export const home: HomeDict = {
|
||||
"Depois de instalar o Codewhale e conectar um modelo, você pode descrever sua primeira tarefa no terminal e adicionar um Fleet quando quiser dividir o trabalho entre vários agentes.",
|
||||
startGuideLink: "Ler o guia de primeiros passos",
|
||||
startVocabularyLink: "Ver o vocabulário do produto",
|
||||
chapterAccount: "Obter o Codewhale",
|
||||
availabilityHeading: "Onde você pode usar o Codewhale",
|
||||
availabilityLede:
|
||||
"Você já pode usar o Codewhale no seu terminal enquanto desenvolvemos o aplicativo web, o aplicativo desktop e os computadores na nuvem.",
|
||||
|
||||
@@ -32,25 +32,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Войти",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "любая модель, на вашей машине",
|
||||
|
||||
issueLabel: "Выпуск {date}",
|
||||
dateLocale: "ru-RU",
|
||||
|
||||
tickerLiveLabel: "Эфир",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "влит",
|
||||
tickerOpened: "открыт",
|
||||
tickerClosed: "закрыт",
|
||||
tickerReleased: "выпуск",
|
||||
tickerFirstContribution: "первый вклад",
|
||||
tickerBy: "автор {handle}",
|
||||
tickerAria: "Недавняя активность репозитория",
|
||||
|
||||
traceLabel: "ход рассуждений",
|
||||
traceTabsAria: "Фрагменты сеанса",
|
||||
|
||||
menuOpen: "Открыть меню",
|
||||
menuClose: "Закрыть меню",
|
||||
|
||||
|
||||
@@ -39,7 +39,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Посмотреть фоновую проверку",
|
||||
source: "Исходный код и другие платформы",
|
||||
platforms: "Эта загрузка предназначена для Mac. На Windows и Linux пока используются плагин из исходного кода и настройка на стороне хоста.",
|
||||
installTitle: "Computer Use для Mac",
|
||||
installLead: "Добавьте фоновое управление приложениями с помощником Computer Use. Настройте разрешения Mac, запустите фоновую проверку и приостанавливайте или останавливайте ввод помощника из строки меню.",
|
||||
installLink: "Загрузка и настройка Computer Use",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Статус релиза недоступен",
|
||||
currentSource: "Исходники",
|
||||
sourceCandidate: "Не выпущено",
|
||||
providerRoutes: "провайдеров — {count}",
|
||||
publishedRelease: "выпущено",
|
||||
figcaptionSourceCandidate: "не выпущено",
|
||||
chapterTerminal: "Ваш терминал",
|
||||
chapterTerminalTitle: "Начните с того, что хотите создать",
|
||||
gainHeading: "Что можно делать с Codewhale",
|
||||
gainLede:
|
||||
"Начните с проекта, вопроса или задачи, которую хотите автоматизировать, а затем работайте с одним агентом или поручите части большой работы нескольким агентам.",
|
||||
@@ -48,7 +45,6 @@ export const home: HomeDict = {
|
||||
"Используйте для своих агентов облачные или локальные модели и подбирайте разные модели и роли под соответствующие части задачи."
|
||||
]
|
||||
],
|
||||
chapterModels: "Ваши модели",
|
||||
modelsHeading: "Выбор моделей для каждой задачи",
|
||||
modelsBody:
|
||||
"Подключитесь напрямую к облачному провайдеру, используйте шлюз для доступа к нескольким провайдерам или запустите модель локально, а затем по ходу работы выбирайте модель для каждой сессии.",
|
||||
@@ -63,7 +59,6 @@ export const home: HomeDict = {
|
||||
"После установки Codewhale и подключения модели вы можете описать первую задачу в терминале и добавить Fleet, когда захотите распределить работу между несколькими агентами.",
|
||||
startGuideLink: "Читать руководство «С чего начать»",
|
||||
startVocabularyLink: "Посмотреть словарь продукта",
|
||||
chapterAccount: "Получить Codewhale",
|
||||
availabilityHeading: "Где можно пользоваться Codewhale",
|
||||
availabilityLede:
|
||||
"Вы уже можете пользоваться Codewhale в терминале, пока мы разрабатываем веб-приложение, настольное приложение и облачные компьютеры.",
|
||||
|
||||
@@ -35,25 +35,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Giriş yap",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "istediğin model, senin makinen",
|
||||
|
||||
issueLabel: "{date} sayısı",
|
||||
dateLocale: "tr-TR",
|
||||
|
||||
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",
|
||||
|
||||
|
||||
@@ -38,7 +38,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Arka plan kontrolünü izle",
|
||||
source: "Kaynak kodu ve diğer platformlar",
|
||||
platforms: "Bu indirme Mac içindir. Windows ve Linux şu anda kaynak eklentisini ve ana makine tarafındaki kurulumu kullanır.",
|
||||
installTitle: "Mac için Computer Use",
|
||||
installLead: "Computer Use yardımcısıyla arka planda uygulama denetimi ekle. Mac izinlerini ayarla, bir arka plan kontrolü çalıştır ve yardımcının girişini menü çubuğundan duraklat ya da durdur.",
|
||||
installLink: "Computer Use indirme ve kurulum",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Sürüm durumu kullanılamıyor",
|
||||
currentSource: "Kaynak",
|
||||
sourceCandidate: "Yayımlanmadı",
|
||||
providerRoutes: "{count} sağlayıcı",
|
||||
publishedRelease: "yayımlandı",
|
||||
figcaptionSourceCandidate: "yayımlanmadı",
|
||||
chapterTerminal: "Senin terminalin",
|
||||
chapterTerminalTitle: "Yapmak istediğin bir şeyle başla",
|
||||
gainHeading:
|
||||
"Codewhale ile neler yapabilirsin",
|
||||
gainLede:
|
||||
@@ -49,7 +46,6 @@ export const home: HomeDict = {
|
||||
"Ajanların için barındırılan veya yerel modeller kullan; farklı modeller ve roller, işin kendilerine uygun kısımlarını üstlensin."
|
||||
]
|
||||
],
|
||||
chapterModels: "Senin modellerin",
|
||||
modelsHeading: "Her görev için model seçenekleri",
|
||||
modelsBody:
|
||||
"Doğrudan model barındıran bir sağlayıcıya bağlan, birden fazla sağlayıcıya erişmek için bir ağ geçidi kullan veya bir modeli yerel olarak çalıştır; ardından çalışırken her oturumun hangi modeli kullanacağını seç.",
|
||||
@@ -64,7 +60,6 @@ export const home: HomeDict = {
|
||||
"Codewhale'i kurup bir model bağladıktan sonra ilk görevini terminalde anlatabilir, birkaç ajanın işi paylaşmasını istediğinde bir Fleet ekleyebilirsin.",
|
||||
startGuideLink: "Başlangıç kılavuzunu oku",
|
||||
startVocabularyLink: "Ürün sözlüğünü gör",
|
||||
chapterAccount: "Codewhale'i edin",
|
||||
availabilityHeading: "Codewhale'i nerelerde kullanabilirsin",
|
||||
availabilityLede:
|
||||
"Biz web uygulamasını, masaüstü uygulamasını ve bulut bilgisayarlarını geliştirirken sen Codewhale'i bugün terminalinde kullanabilirsin.",
|
||||
|
||||
@@ -60,13 +60,6 @@ export interface ChromeDict {
|
||||
*/
|
||||
authSignIn: string;
|
||||
|
||||
/** Wordmark seal glyph beside the masthead brand (components/seal.tsx). */
|
||||
wordmarkSeal: string;
|
||||
/** Wordmark strapline under the brand, e.g. "any model, on your machine". */
|
||||
wordmarkTag: string;
|
||||
|
||||
/** Masthead issue line, e.g. "Issue {date}". */
|
||||
issueLabel: string;
|
||||
/**
|
||||
* BCP 47 tag used for the masthead weekday via `toLocaleDateString` — not
|
||||
* rendered copy, but per-locale, so it belongs beside it. Without this the
|
||||
@@ -74,46 +67,6 @@ export interface ChromeDict {
|
||||
*/
|
||||
dateLocale: string;
|
||||
|
||||
/** Live-ticker seal label (components/ticker.tsx). */
|
||||
tickerLiveLabel: string;
|
||||
/** Live-ticker mono tag beside the seal label, e.g. "LIVE". */
|
||||
tickerLiveTag: string;
|
||||
|
||||
/**
|
||||
* Ticker event verbs — the chrome around the repository's own record.
|
||||
* Pull-request titles, issue titles, release tags, and contributor handles
|
||||
* are CONTENT and stay verbatim in every locale; these verbs are copy and
|
||||
* must be translated.
|
||||
*
|
||||
* `tickerReleased` covers `state: "published"`, and `tickerOpened` covers
|
||||
* both a newly filed issue and an open pull request. There is deliberately
|
||||
* no draft verb: the strip reports events, and a draft pull request is one
|
||||
* its author has marked not-ready (components/ticker.tsx `EVENT_STATES`).
|
||||
*/
|
||||
tickerMerged: string;
|
||||
tickerOpened: string;
|
||||
tickerClosed: string;
|
||||
tickerReleased: string;
|
||||
/**
|
||||
* Mark shown when GitHub itself reports the author as a
|
||||
* FIRST_TIME_CONTRIBUTOR — the warmest item on the strip, and never our
|
||||
* inference. Keep it short; it sits inline in a scrolling mono line.
|
||||
*/
|
||||
tickerFirstContribution: string;
|
||||
/**
|
||||
* By-line template carrying a `{handle}` token, e.g. "by {handle}". The
|
||||
* handle is typeset in its own element, so a locale may place it anywhere
|
||||
* (or make it the whole value, as ja/ko do with an honorific suffix).
|
||||
*/
|
||||
tickerBy: string;
|
||||
/** aria-label for the ticker's group landmark. */
|
||||
tickerAria: string;
|
||||
|
||||
/** Reasoning trace title-bar label, e.g. "reasoning trace". */
|
||||
traceLabel: string;
|
||||
/** aria-label for the reasoning trace scene tablist. */
|
||||
traceTabsAria: string;
|
||||
|
||||
/** Mobile-menu toggle labels. */
|
||||
menuOpen: string;
|
||||
menuClose: string;
|
||||
@@ -203,23 +156,15 @@ export interface HomeDict {
|
||||
/** "Source" / "Unreleased" — prepended to `v{version}`. */
|
||||
currentSource: string;
|
||||
sourceCandidate: string;
|
||||
/** "{count} providers" */
|
||||
providerRoutes: string;
|
||||
/** "released" / "unreleased" — the machine-readable source-state label. */
|
||||
publishedRelease: string;
|
||||
figcaptionSourceCandidate: string;
|
||||
|
||||
/** The running head on the water beside the capture. */
|
||||
chapterTerminal: string;
|
||||
chapterTerminalTitle: string;
|
||||
|
||||
/** What a person gains: heading, lede, and three [title, body] columns. */
|
||||
gainHeading: string;
|
||||
gainLede: string;
|
||||
gain: [string, string][];
|
||||
|
||||
/** Models chapter. */
|
||||
chapterModels: string;
|
||||
modelsHeading: string;
|
||||
modelsBody: string;
|
||||
/** Three [route kind, description] rows. */
|
||||
@@ -231,11 +176,6 @@ export interface HomeDict {
|
||||
startGuideLink: string;
|
||||
startVocabularyLink: string;
|
||||
|
||||
/**
|
||||
* Availability chapter: four [surface, status, detail] rows stating what
|
||||
* is released, what is a development build, and what is not available.
|
||||
*/
|
||||
chapterAccount: string;
|
||||
availabilityHeading: string;
|
||||
availabilityLede: string;
|
||||
availability: [string, string, string][];
|
||||
@@ -298,10 +238,9 @@ export interface DocsShellDict {
|
||||
heroTitle: string;
|
||||
heroLead: string;
|
||||
installCta: string;
|
||||
sourceDocsCta: string;
|
||||
|
||||
// --- release truth band (docs layout; facts + CHANGELOG.md) ---
|
||||
/** Eyebrow over the band, e.g. "Release truth". */
|
||||
/** Eyebrow over the band, e.g. "Release". */
|
||||
releaseLabel: string;
|
||||
/** "Latest release {tag} · {date}" — date already formatted per locale. */
|
||||
releasePublished: string;
|
||||
@@ -378,7 +317,6 @@ export interface StatesDict {
|
||||
notFoundTitle: string;
|
||||
notFoundBody: string;
|
||||
notFoundHomeLink: string;
|
||||
notFoundPosterAlt: string;
|
||||
/**
|
||||
* A data-bearing page whose source was not asked (build-time prerender)
|
||||
* or refused (rate limit, outage). Distinct from `empty`, which asserts
|
||||
@@ -526,32 +464,6 @@ export type DocsTroubleshootingDict = DocsPageDict;
|
||||
|
||||
export type DocsConfigurationDict = DocsPageDict;
|
||||
|
||||
/**
|
||||
* `app/[locale]/docs/constitution/page.tsx`.
|
||||
*
|
||||
* `overviewLead` carries three `{token}` placeholders and `authorityNote` one
|
||||
* more. Per `docs/VOICE.md` — keep commands, key names and paths as code-owned
|
||||
* placeholders — the literals themselves live in the page, along with the
|
||||
* en/zh badge pair on each principle row, which is a fixed bilingual glyph
|
||||
* rather than copy.
|
||||
*/
|
||||
export interface DocsConstitutionDict {
|
||||
metaTitle: string;
|
||||
metaDescription: string;
|
||||
/** Body-copy typography for this locale (CJK needs looser leading). */
|
||||
bodyClassName: string;
|
||||
overviewTitle: string;
|
||||
/** Opposite-language echo the heading prints beside the title. */
|
||||
overviewTitleAside: string;
|
||||
overviewLead: string;
|
||||
/** Three `[key, detail]` rows; the key selects the page's badge pair. */
|
||||
principles: [string, string][];
|
||||
authorityNote: string;
|
||||
/** Link text inside `authorityNote`'s `{configDocs}` slot. */
|
||||
configDocsLabel: string;
|
||||
sourceNote: string;
|
||||
}
|
||||
|
||||
export type DocsFleetDict = DocsPageDict;
|
||||
|
||||
export type DocsMcpDict = DocsPageDict;
|
||||
@@ -599,7 +511,4 @@ export interface ComputerUseDict {
|
||||
demo: string;
|
||||
source: string;
|
||||
platforms: string;
|
||||
installTitle: string;
|
||||
installLead: string;
|
||||
installLink: string;
|
||||
}
|
||||
@@ -29,25 +29,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Увійти",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "будь-яка модель, на вашій машині",
|
||||
|
||||
issueLabel: "Випуск {date}",
|
||||
dateLocale: "uk-UA",
|
||||
|
||||
tickerLiveLabel: "Наживо",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "влито",
|
||||
tickerOpened: "відкрито",
|
||||
tickerClosed: "закрито",
|
||||
tickerReleased: "реліз",
|
||||
tickerFirstContribution: "перший внесок",
|
||||
tickerBy: "автор {handle}",
|
||||
tickerAria: "Нещодавня активність репозиторію",
|
||||
|
||||
traceLabel: "хід міркувань",
|
||||
traceTabsAria: "Фрагменти сеансу",
|
||||
|
||||
menuOpen: "Відкрити меню",
|
||||
menuClose: "Закрити меню",
|
||||
|
||||
|
||||
@@ -39,7 +39,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Подивитися фонову перевірку",
|
||||
source: "Вихідний код та інші платформи",
|
||||
platforms: "Це завантаження для Mac. На Windows і Linux наразі використовуються плагін із вихідного коду та налаштування на боці хоста.",
|
||||
installTitle: "Computer Use для Mac",
|
||||
installLead: "Додайте фонове керування застосунками за допомогою помічника Computer Use. Налаштуйте дозволи на Mac, запустіть фонову перевірку та призупиняйте або зупиняйте введення помічника зі смуги меню.",
|
||||
installLink: "Завантаження й налаштування Computer Use",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Статус релізу недоступний",
|
||||
currentSource: "Джерело",
|
||||
sourceCandidate: "Не випущено",
|
||||
providerRoutes: "Провайдерів: {count}",
|
||||
publishedRelease: "випущено",
|
||||
figcaptionSourceCandidate: "не випущено",
|
||||
chapterTerminal: "Ваш термінал",
|
||||
chapterTerminalTitle: "Почніть із того, що хочете створити",
|
||||
gainHeading: "Що можна робити з Codewhale",
|
||||
gainLede:
|
||||
"Почніть із проєкту, питання або завдання, яке хочете автоматизувати, а потім працюйте з одним агентом або доручіть частини більшої роботи кільком агентам.",
|
||||
@@ -48,7 +45,6 @@ export const home: HomeDict = {
|
||||
"Використовуйте для своїх агентів хмарні або локальні моделі й добирайте різні моделі та ролі для відповідних частин завдання."
|
||||
]
|
||||
],
|
||||
chapterModels: "Ваші моделі",
|
||||
modelsHeading: "Вибір моделей для кожного завдання",
|
||||
modelsBody:
|
||||
"Підключіться безпосередньо до хмарного провайдера, скористайтеся шлюзом для доступу до кількох провайдерів або запустіть модель локально, а потім під час роботи обирайте модель для кожної сесії.",
|
||||
@@ -63,7 +59,6 @@ export const home: HomeDict = {
|
||||
"Після встановлення Codewhale й підключення моделі ви можете описати перше завдання в терміналі та додати Fleet, коли захочете розподілити роботу між кількома агентами.",
|
||||
startGuideLink: "Читати посібник для початківців",
|
||||
startVocabularyLink: "Переглянути словник продукту",
|
||||
chapterAccount: "Отримати Codewhale",
|
||||
availabilityHeading: "Де можна користуватися Codewhale",
|
||||
availabilityLede:
|
||||
"Ви вже можете користуватися Codewhale в терміналі, поки ми розробляємо вебзастосунок, настільний застосунок і хмарні комп’ютери.",
|
||||
|
||||
@@ -33,25 +33,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "Đăng nhập",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "mọi mô hình, trên máy của bạn",
|
||||
|
||||
issueLabel: "Số ra {date}",
|
||||
dateLocale: "vi-VN",
|
||||
|
||||
tickerLiveLabel: "Trực tiếp",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "đã hợp nhất",
|
||||
tickerOpened: "đã mở",
|
||||
tickerClosed: "đã đóng",
|
||||
tickerReleased: "đã phát hành",
|
||||
tickerFirstContribution: "đóng góp đầu tiên",
|
||||
tickerBy: "bởi {handle}",
|
||||
tickerAria: "Hoạt động gần đây của kho mã",
|
||||
|
||||
traceLabel: "mạch suy luận",
|
||||
traceTabsAria: "Trích đoạn phiên làm việc",
|
||||
|
||||
menuOpen: "Mở menu",
|
||||
menuClose: "Đóng menu",
|
||||
|
||||
|
||||
@@ -39,7 +39,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "Xem kiểm tra nền",
|
||||
source: "Mã nguồn và các nền tảng khác",
|
||||
platforms: "Bản tải này dành cho Mac. Windows và Linux hiện dùng plugin từ mã nguồn cùng thiết lập phía máy chủ.",
|
||||
installTitle: "Computer Use cho Mac",
|
||||
installLead: "Thêm khả năng điều khiển ứng dụng trong nền với trợ lý Computer Use. Thiết lập quyền trên Mac, chạy kiểm tra nền, rồi tạm dừng hoặc dừng thao tác nhập của trợ lý từ thanh menu.",
|
||||
installLink: "Tải và thiết lập Computer Use",
|
||||
};
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "Không có trạng thái phát hành",
|
||||
currentSource: "Mã nguồn",
|
||||
sourceCandidate: "Chưa phát hành",
|
||||
providerRoutes: "{count} nhà cung cấp",
|
||||
publishedRelease: "đã phát hành",
|
||||
figcaptionSourceCandidate: "chưa phát hành",
|
||||
chapterTerminal: "Terminal của bạn",
|
||||
chapterTerminalTitle: "Bắt đầu với điều bạn muốn tạo ra",
|
||||
gainHeading:
|
||||
"Những việc bạn có thể làm với Codewhale",
|
||||
gainLede:
|
||||
@@ -49,7 +46,6 @@ export const home: HomeDict = {
|
||||
"Sử dụng mô hình chạy trên máy chủ hoặc cục bộ cho các tác tử, với những mô hình và vai trò khác nhau đảm nhận các phần công việc phù hợp."
|
||||
]
|
||||
],
|
||||
chapterModels: "Mô hình của bạn",
|
||||
modelsHeading: "Lựa chọn mô hình cho từng tác vụ",
|
||||
modelsBody:
|
||||
"Bạn có thể kết nối trực tiếp với một nhà cung cấp mô hình, dùng cổng kết nối để truy cập nhiều nhà cung cấp hoặc chạy mô hình cục bộ, rồi chọn mô hình cho từng phiên khi làm việc.",
|
||||
@@ -64,7 +60,6 @@ export const home: HomeDict = {
|
||||
"Sau khi cài đặt Codewhale và kết nối một mô hình, bạn có thể mô tả tác vụ đầu tiên trong terminal và thêm Fleet khi muốn nhiều tác tử cùng chia sẻ công việc.",
|
||||
startGuideLink: "Đọc hướng dẫn bắt đầu",
|
||||
startVocabularyLink: "Xem thuật ngữ sản phẩm",
|
||||
chapterAccount: "Tải Codewhale",
|
||||
availabilityHeading: "Nơi bạn có thể sử dụng Codewhale",
|
||||
availabilityLede:
|
||||
"Bạn có thể sử dụng Codewhale trong terminal ngay hôm nay, trong khi chúng tôi đang phát triển ứng dụng web, ứng dụng máy tính và máy tính đám mây.",
|
||||
|
||||
@@ -26,25 +26,8 @@ export const chrome: ChromeDict = {
|
||||
|
||||
authSignIn: "登录",
|
||||
|
||||
wordmarkSeal: "深",
|
||||
wordmarkTag: "任意模型,本机运行",
|
||||
|
||||
issueLabel: "第 {date} 期",
|
||||
dateLocale: "zh-CN",
|
||||
|
||||
tickerLiveLabel: "实 时",
|
||||
tickerLiveTag: "LIVE",
|
||||
tickerMerged: "已合并",
|
||||
tickerOpened: "已开启",
|
||||
tickerClosed: "已关闭",
|
||||
tickerReleased: "已发布",
|
||||
tickerFirstContribution: "首次贡献",
|
||||
tickerBy: "作者 {handle}",
|
||||
tickerAria: "仓库近期动态",
|
||||
|
||||
traceLabel: "推理痕迹",
|
||||
traceTabsAria: "会话片段",
|
||||
|
||||
menuOpen: "打开菜单",
|
||||
menuClose: "关闭菜单",
|
||||
|
||||
|
||||
@@ -38,7 +38,4 @@ export const computerUse: ComputerUseDict = {
|
||||
demo: "查看后台检查演示",
|
||||
source: "源码与其他平台",
|
||||
platforms: "此下载适用于 Mac。Windows 和 Linux 目前通过源码插件及宿主端设置使用。",
|
||||
installTitle: "Mac 版 Computer Use",
|
||||
installLead: "通过 Computer Use 助手添加应用后台操作能力。设置 Mac 权限、运行后台检查,并从菜单栏暂停或停止助手输入。",
|
||||
installLink: "Computer Use 下载与设置",
|
||||
};
|
||||
@@ -1,36 +0,0 @@
|
||||
import type { DocsConstitutionDict } from "../types";
|
||||
|
||||
/**
|
||||
* 中文对照见 `en/docs-constitution.ts`,文案自页面的 `isZh` 三元逐字迁入。
|
||||
*
|
||||
* `overviewLead` 在「主入口:」和「constitution.json,」之后各有一个空格。
|
||||
* 那是旧 JSX 在这两处换行、被 JSX 合成空格的结果,不是笔误 —— 保留它是为了
|
||||
* 让这次迁移在渲染上是纯粹的 no-op。
|
||||
*/
|
||||
export const docsConstitution: DocsConstitutionDict = {
|
||||
metaTitle: "宪章与 /constitution · Codewhale 文档",
|
||||
metaDescription: "用户全局宪章、仓库本地法、项目说明和运行时边界。",
|
||||
bodyClassName: "text-ink-soft leading-[1.9] tracking-wide",
|
||||
overviewTitle: "宪章与 /constitution",
|
||||
overviewTitleAside: "Constitution",
|
||||
overviewLead:
|
||||
"Codewhale 先给 Agent 一个可追责的地址,再给上下文冲突一套法律。{constitutionCommand} 是管理个人常驻宪章的主入口: 它把结构化的用户全局设置保存在 {homeConfig}, 再渲染成模型可读的 prose block。仓库仍可通过 {repoConfig} 增加本地 law;runtime policy 独立负责模式、审批、沙箱、成本和工具边界。",
|
||||
principles: [
|
||||
[
|
||||
"userGlobal",
|
||||
"用 /constitution 管理跨项目个人常驻法。它是结构化数据渲染成 prose,不是裸 prompt 编辑器。",
|
||||
],
|
||||
[
|
||||
"repoLocal",
|
||||
".codewhale/constitution.json 是可选项目 law,用于不变量、分支规则、验证和升级条件。",
|
||||
],
|
||||
[
|
||||
"runtime",
|
||||
"宪章文本可以表达偏好;审批、沙箱、Shell、网络、信任和 MCP 权限仍由运行时配置强制执行。",
|
||||
],
|
||||
],
|
||||
authorityNote:
|
||||
"普通项目说明仍放在 AGENTS.md;记忆和交接低于宪章与项目说明;完整 base prompt Markdown 覆盖只是专家逃生口,不是普通设置路径。详见 {configDocs}。",
|
||||
configDocsLabel: "配置文档",
|
||||
sourceNote: "来源文档:docs/ARCHITECTURE.md · 更新时请同步修改 docs-map.ts。",
|
||||
};
|
||||
@@ -14,9 +14,8 @@ export const docsShell: DocsShellDict = {
|
||||
heroTitle: "用 Codewhale 把事情做完。",
|
||||
heroLead: "从你想做的事开始。每一页都会说明你需要准备什么,给出今天就能运行的命令,并指向下一步。",
|
||||
installCta: "安装 Codewhale",
|
||||
sourceDocsCta: "浏览源文档 ↗",
|
||||
|
||||
releaseLabel: "版本事实",
|
||||
releaseLabel: "版本",
|
||||
releasePublished: "最新发布 {tag} · {date}",
|
||||
releaseCandidate: "本站文档描述的是尚未发布的 {version} 源码候选版。",
|
||||
releaseMatches: "本站文档描述的是已发布的 {tag}。",
|
||||
|
||||
@@ -26,11 +26,8 @@ export const home: HomeDict = {
|
||||
releaseUnavailable: "发布状态暂不可用",
|
||||
currentSource: "源码",
|
||||
sourceCandidate: "未发布",
|
||||
providerRoutes: "{count} 个提供商",
|
||||
publishedRelease: "已发布",
|
||||
figcaptionSourceCandidate: "未发布",
|
||||
chapterTerminal: "你的终端",
|
||||
chapterTerminalTitle: "从你想做的项目开始",
|
||||
gainHeading: "你可以用 Codewhale 做什么",
|
||||
gainLede: "从具体目标开始:修复错误、理解项目,或把重复任务变成工作流程。先用一个智能体,需要时再拆分大型任务。",
|
||||
gain: [
|
||||
@@ -47,7 +44,6 @@ export const home: HomeDict = {
|
||||
"开始前设定权限,处理审批请求,随时中断正在运行的任务。查看对话与工具结果,再决定如何继续。"
|
||||
]
|
||||
],
|
||||
chapterModels: "你的模型",
|
||||
modelsHeading: "为每项任务选择合适的模型",
|
||||
modelsBody:
|
||||
"为每个会话选择提供商和模型:使用 API 密钥、受支持的提供商登录方式,或本地模型。Codewhale 账户与模型连接各有用途。",
|
||||
@@ -61,7 +57,6 @@ export const home: HomeDict = {
|
||||
startLede: "安装已发布版本,连接模型,然后在项目文件夹中尝试一项任务。智能体团队是可选的;先用一个智能体,等任务适合拆分时再增加。",
|
||||
startGuideLink: "阅读新手指引",
|
||||
startVocabularyLink: "查名词",
|
||||
chapterAccount: "获取 Codewhale",
|
||||
availabilityHeading: "你可以在哪里使用 Codewhale",
|
||||
availabilityLede: "终端与本地浏览器客户端现已可用。桌面和托管网页应用正基于同一会话模型开发;各端的开放状态分别列在下方。",
|
||||
availability: [
|
||||
|
||||
@@ -17,7 +17,6 @@ export const states: StatesDict = {
|
||||
notFoundTitle: "这个页面不在这里",
|
||||
notFoundBody: "链接可能已经过期,或者地址有拼写错误。请从首页或文档重新开始。",
|
||||
notFoundHomeLink: "返回首页",
|
||||
notFoundPosterAlt: "虚构游戏《Codwhale: Modern Whalefare》的海报,一只身穿战术装备的蓝鲸。",
|
||||
unavailableTitle: "实时记录尚未加载",
|
||||
unavailableBody: "数据源没有响应上一次刷新,或者此页面自构建以来尚未刷新。这里不会用编造的内容填充。",
|
||||
|
||||
|
||||
@@ -600,50 +600,6 @@ done
|
||||
}
|
||||
});
|
||||
|
||||
it("keeps the standalone wire strip a record of GitHub, not a summary of it", () => {
|
||||
const ticker = text("web/components/ticker.tsx");
|
||||
const github = text("web/lib/github.ts");
|
||||
|
||||
// An empty or unreachable feed removes the strip. No skeleton, no
|
||||
// placeholder row, no invented item.
|
||||
expect(ticker).toContain("if (!ordered.length) return null;");
|
||||
|
||||
// Drafts are the author's own not-ready marker, not an event.
|
||||
expect(ticker).toContain("EVENT_STATES.includes(item.state)");
|
||||
expect(ticker).not.toContain('"draft"');
|
||||
|
||||
// Every verb resolves through the caller's dictionary — the strip never
|
||||
// hardcodes an English event word next to a translated page.
|
||||
for (const key of [
|
||||
"tickerMerged",
|
||||
"tickerOpened",
|
||||
"tickerClosed",
|
||||
"tickerReleased",
|
||||
"tickerFirstContribution",
|
||||
"tickerBy",
|
||||
"tickerAria",
|
||||
] as const) {
|
||||
for (const locale of ["en", "zh", "ja", "vi", "ko", "ru", "uk", "es", "pt-BR", "id"]) {
|
||||
expect(getChrome(locale)[key].trim().length, `${locale} ${key}`).toBeGreaterThan(0);
|
||||
}
|
||||
}
|
||||
expect(getChrome("en").tickerBy).toContain("{handle}");
|
||||
|
||||
// The first-contribution mark is GitHub's verdict, copied, never ours.
|
||||
expect(github).toContain('association === "FIRST_TIME_CONTRIBUTOR"');
|
||||
expect(ticker).toContain("item.firstTimeContributor");
|
||||
|
||||
// A verb is dated by its own event, so a merge is never dated by a later
|
||||
// comment on the thread.
|
||||
expect(github).toContain("eventAt");
|
||||
expect(ticker).toContain("item.eventAt ?? item.updatedAt");
|
||||
|
||||
// Merged pull requests, issues, and releases — the whole life of the repo,
|
||||
// within the existing three-call budget.
|
||||
expect(github).toContain("/releases?per_page=");
|
||||
expect(github).toContain('kind: "release"');
|
||||
});
|
||||
|
||||
it("keeps the homepage free of fabricated demo panels", () => {
|
||||
const homepage = text("web/app/[locale]/page.tsx");
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ import { describe, expect, it } from "vitest";
|
||||
import { truncateChars } from "./truncate";
|
||||
|
||||
const webRoot = new URL("../", import.meta.url);
|
||||
const ticker = readFileSync(new URL("components/ticker.tsx", webRoot), "utf8");
|
||||
const roadmap = readFileSync(new URL("lib/roadmap-feed.ts", webRoot), "utf8");
|
||||
|
||||
describe("truncateChars", () => {
|
||||
@@ -38,8 +37,6 @@ describe("truncateChars", () => {
|
||||
});
|
||||
|
||||
it("is the one truncation rule the GitHub-fed surfaces use", () => {
|
||||
expect(ticker).toContain("truncateChars(title, 70)");
|
||||
expect(ticker).not.toContain("title.slice(");
|
||||
expect(roadmap).toContain("truncateChars(stripped, 140, 137)");
|
||||
expect(roadmap).not.toContain("stripped.slice(");
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user