summaryrefslogtreecommitdiffhomepage
path: root/packages/console
diff options
context:
space:
mode:
authorDavid Hill <[email protected]>2026-03-04 15:58:58 +0000
committerDavid Hill <[email protected]>2026-03-04 15:58:58 +0000
commitca5a7378deb77ad35a70d7182f750a544a2b7426 (patch)
tree8506aa97642444359bbf7223243da1e75846af0d /packages/console
parentc6187ee40f345b55fc3cacf9ff071cc35352e6de (diff)
downloadopencode-ca5a7378deb77ad35a70d7182f750a544a2b7426.tar.gz
opencode-ca5a7378deb77ad35a70d7182f750a544a2b7426.zip
docs: localize Go graph and testimonial copy
Diffstat (limited to 'packages/console')
-rw-r--r--packages/console/app/src/i18n/en.ts26
-rw-r--r--packages/console/app/src/routes/go/index.tsx63
2 files changed, 59 insertions, 30 deletions
diff --git a/packages/console/app/src/i18n/en.ts b/packages/console/app/src/i18n/en.ts
index de0e4e652..065a02be3 100644
--- a/packages/console/app/src/i18n/en.ts
+++ b/packages/console/app/src/i18n/en.ts
@@ -254,6 +254,32 @@ export const dict = {
"go.pricing.body": "Use with any agent. Top up credit if needed. Cancel any time.",
"go.graph.free": "Free",
"go.graph.go": "Go",
+ "go.graph.label": "Requests/month",
+ "go.graph.usageLimits": "Usage limits",
+ "go.graph.tick": "{{n}}x",
+ "go.graph.aria": "Requests per month: {{free}} vs {{go}}",
+
+ "go.testimonials.brand.zen": "Zen",
+ "go.testimonials.brand.go": "Go",
+ "go.testimonials.handle": "@OpenCode",
+ "go.testimonials.dax.name": "Dax Raad",
+ "go.testimonials.dax.title": "ex-CEO, Terminal Products",
+ "go.testimonials.dax.quoteAfter": "has been life changing, it's truly a no-brainer.",
+ "go.testimonials.jay.name": "Jay V",
+ "go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint",
+ "go.testimonials.jay.quoteBefore": "4 out of 5 people on our team love using",
+ "go.testimonials.jay.quoteAfter": ".",
+ "go.testimonials.adam.name": "Adam Elmore",
+ "go.testimonials.adam.title": "ex-Hero, AWS",
+ "go.testimonials.adam.quoteBefore": "I can't recommend",
+ "go.testimonials.adam.quoteAfter": "enough. Seriously, it's really good.",
+ "go.testimonials.david.name": "David Hill",
+ "go.testimonials.david.title": "ex-Head of Design, Laravel",
+ "go.testimonials.david.quoteBefore": "With",
+ "go.testimonials.david.quoteAfter": "I know all the models are tested and perfect for coding agents.",
+ "go.testimonials.frank.name": "Frank Wang",
+ "go.testimonials.frank.title": "ex-Intern, Nvidia (4 times)",
+ "go.testimonials.frank.quote": "I wish I was still at Nvidia.",
"go.problem.title": "What problem is Go solving?",
"go.problem.body":
"We're focused on bringing the OpenCode experience to as many people as possible. OpenCode Go is a low cost ($10/month) subscription designed to bring agentic coding to programmers around the world. It provides generous limits and reliable access to the most capable open source models.",
diff --git a/packages/console/app/src/routes/go/index.tsx b/packages/console/app/src/routes/go/index.tsx
index ca445e04a..ac2f10a99 100644
--- a/packages/console/app/src/routes/go/index.tsx
+++ b/packages/console/app/src/routes/go/index.tsx
@@ -27,10 +27,12 @@ const checkLoggedIn = query(async () => {
if (workspaceID) throw redirect(`/workspace/${workspaceID}`)
}, "checkLoggedIn.get")
-function LimitsGraph(props: { href: string; labels: { free: string; go: string } }) {
+function LimitsGraph(props: { href: string }) {
let root!: HTMLElement
const [visible, setVisible] = createSignal(false)
+ const i18n = useI18n()
+
onMount(() => {
if (typeof IntersectionObserver === "undefined") return setVisible(true)
const observer = new IntersectionObserver(
@@ -73,7 +75,7 @@ function LimitsGraph(props: { href: string; labels: { free: string; go: string }
return (
<figure
data-component="limit-graph"
- aria-label="Requests per month: Free vs Go"
+ aria-label={i18n.t("go.graph.aria", { free: i18n.t("go.graph.free"), go: i18n.t("go.graph.go") })}
data-visible={visible() ? "" : undefined}
ref={root}
style={{ "--start": `${start}%` } as any}
@@ -86,7 +88,7 @@ function LimitsGraph(props: { href: string; labels: { free: string; go: string }
<g>
<line x1={x(t)} y1={top} x2={x(t)} y2={h - bottom} data-grid />
<text x={x(t)} y={h - 18} text-anchor="middle" data-tick>
- {t}x
+ {i18n.t("go.graph.tick", { n: t })}
</text>
</g>
)}
@@ -118,10 +120,10 @@ function LimitsGraph(props: { href: string; labels: { free: string; go: string }
<div data-slot="plot-labels">
<span data-row-label style={{ "--y": y(yFree) } as any}>
- {props.labels.free}
+ {i18n.t("go.graph.free")}
</span>
<span data-row-label style={{ "--y": y(yGo) } as any}>
- {props.labels.go}
+ {i18n.t("go.graph.go")}
</span>
</div>
</div>
@@ -130,15 +132,15 @@ function LimitsGraph(props: { href: string; labels: { free: string; go: string }
<div data-slot="caption-row">
<div data-slot="caption-left">
<div data-slot="caption-meta">
- <span data-slot="caption-label">Requests/month</span>
+ <span data-slot="caption-label">{i18n.t("go.graph.label")}</span>
<a data-slot="caption-link" href={props.href}>
- Usage limits
+ {i18n.t("go.graph.usageLimits")}
</a>
</div>
<div data-slot="legend">
<span data-item>
<i data-dot data-kind="free" />
- <span data-name>Free</span>
+ <span data-name>{i18n.t("go.graph.free")}</span>
<span data-value>{free.toLocaleString()}</span>
</span>
<For each={models}>
@@ -274,10 +276,7 @@ export default function Home() {
</section>
<section data-component="comparison">
- <LimitsGraph
- href={language.route("/docs/go/#usage-limits")}
- labels={{ free: i18n.t("go.graph.free"), go: i18n.t("go.graph.go") }}
- />
+ <LimitsGraph href={language.route("/docs/go/#usage-limits")} />
</section>
<section data-component="problem">
@@ -349,57 +348,61 @@ export default function Home() {
<div data-slot="testimonial">
<div data-slot="name">
<img src={avatarDax} alt="" />
- <strong>Dax Raad</strong>
- <span>ex-CEO, Terminal Products</span>
+ <strong>{i18n.t("go.testimonials.dax.name")}</strong>
+ <span>{i18n.t("go.testimonials.dax.title")}</span>
</div>
<div data-slot="quote">
- <span>@OpenCode</span> <s>Zen</s> Go has been life changing, it's truly a no-brainer.
+ <span>{i18n.t("go.testimonials.handle")}</span> <s>{i18n.t("go.testimonials.brand.zen")}</s>{" "}
+ {i18n.t("go.testimonials.brand.go")} {i18n.t("go.testimonials.dax.quoteAfter")}
</div>
</div>
{/*Jay*/}
<div data-slot="testimonial">
<div data-slot="name">
<img src={avatarJay} alt="" />
- <strong>Jay V</strong>
- <span>ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint</span>
+ <strong>{i18n.t("go.testimonials.jay.name")}</strong>
+ <span>{i18n.t("go.testimonials.jay.title")}</span>
</div>
<div data-slot="quote">
- {"4 out of 5 people on our team love using "}
- <span>@OpenCode</span> <s>Zen</s> Go.
+ {i18n.t("go.testimonials.jay.quoteBefore")} <span>{i18n.t("go.testimonials.handle")}</span>{" "}
+ <s>{i18n.t("go.testimonials.brand.zen")}</s> {i18n.t("go.testimonials.brand.go")}
+ {i18n.t("go.testimonials.jay.quoteAfter")}
</div>
</div>
{/*Adam*/}
<div data-slot="testimonial">
<div data-slot="name">
<img src={avatarAdam} alt="" />
- <strong>Adam Elmore</strong>
- <span>ex-Hero, AWS</span>
+ <strong>{i18n.t("go.testimonials.adam.name")}</strong>
+ <span>{i18n.t("go.testimonials.adam.title")}</span>
</div>
<div data-slot="quote">
- {"I can't recommend "}
- <span>@OpenCode</span> <s>Zen</s> Go enough. Seriously, it's really good.
+ {i18n.t("go.testimonials.adam.quoteBefore")} <span>{i18n.t("go.testimonials.handle")}</span>{" "}
+ <s>{i18n.t("go.testimonials.brand.zen")}</s> {i18n.t("go.testimonials.brand.go")}{" "}
+ {i18n.t("go.testimonials.adam.quoteAfter")}
</div>
</div>
{/*David*/}
<div data-slot="testimonial">
<div data-slot="name">
<img src={avatarDavid} alt="" />
- <strong>David Hill</strong>
- <span>ex-Head of Design, Laravel</span>
+ <strong>{i18n.t("go.testimonials.david.name")}</strong>
+ <span>{i18n.t("go.testimonials.david.title")}</span>
</div>
<div data-slot="quote">
- {"With "}
- <span>@OpenCode</span> <s>Zen</s> Go I know all the models are tested and perfect for coding agents.
+ {i18n.t("go.testimonials.david.quoteBefore")} <span>{i18n.t("go.testimonials.handle")}</span>{" "}
+ <s>{i18n.t("go.testimonials.brand.zen")}</s> {i18n.t("go.testimonials.brand.go")}{" "}
+ {i18n.t("go.testimonials.david.quoteAfter")}
</div>
</div>
{/*Frank*/}
<div data-slot="testimonial">
<div data-slot="name">
<img src={avatarFrank} alt="" />
- <strong>Frank Wang</strong>
- <span>ex-Intern, Nvidia (4 times)</span>
+ <strong>{i18n.t("go.testimonials.frank.name")}</strong>
+ <span>{i18n.t("go.testimonials.frank.title")}</span>
</div>
- <div data-slot="quote">I wish I was still at Nvidia.</div>
+ <div data-slot="quote">{i18n.t("go.testimonials.frank.quote")}</div>
</div>
</section>