docs: localize Go graph and testimonial copy

This commit is contained in:
David Hill 2026-03-04 15:58:58 +00:00
parent c6187ee40f
commit ca5a7378de
2 changed files with 59 additions and 30 deletions

View File

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

View File

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