diff options
| author | David Hill <[email protected]> | 2026-03-04 15:58:58 +0000 |
|---|---|---|
| committer | David Hill <[email protected]> | 2026-03-04 15:58:58 +0000 |
| commit | ca5a7378deb77ad35a70d7182f750a544a2b7426 (patch) | |
| tree | 8506aa97642444359bbf7223243da1e75846af0d /packages/console | |
| parent | c6187ee40f345b55fc3cacf9ff071cc35352e6de (diff) | |
| download | opencode-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.ts | 26 | ||||
| -rw-r--r-- | packages/console/app/src/routes/go/index.tsx | 63 |
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> |
