Shipeasy
Translations

Quickstart

Onboard a project to Shipeasy Translations in 10 minutes — scan, codemod, translate, publish.

TutorialOn this page · 10 min readUpdated · May 3, 2026Works with · Next, Vite, Remix, Astro

This walks through the full onboarding for a fresh frontend project. We'll discover translatable strings, push them to a source profile, generate French translations with AI, and publish.

If you'd rather have an AI agent do this for you, see the LLM Guide — it's the same flow, written for Claude Code / Cursor / Windsurf.

The 10-minute path

install · scan · translate · publish
01 · LOADER

Install the loader

$shipeasy i18n install-loader --profile en
02 · SCAN

Codemod & push keys

$shipeasy i18n scan ./src --rewrite
03 · PUBLISH

AI draft, review, ship

$shipeasy i18n publish --profile fr

Prerequisites

  • A frontend project with English copy you want to translate. Next.js, Vite, Remix, etc.
  • The CLI installed and logged in:
$npm install -g @shipeasy/cli
shipeasy login

Install the loader script

The loader is a tiny <script> that fetches your published label bundle at runtime. It has zero JS dependencies and benefits from infinite CDN caching.

shipeasy i18n install-loader --profile en

The CLI auto-detects your framework and patches the right file:

FrameworkPatches
Next.js App Routersrc/app/layout.tsx (inside <head>)
Next.js Pagespages/_document.tsx
Vite + Reactindex.html
Remixapp/root.tsx
Astrosrc/layouts/*.astro
Anything elsePrints the tag, you paste it

The command also creates a client SDK key scoped to the project, hard-coded into the script tag. The key only allows reads of published label bundles, nothing else.

Create the source profile

A profile is a locale pair. Create the one matching the language already in your code:

shipeasy i18n profiles create --name en --locale en

For non-English source, use the right BCP-47 code (fr, de, ja, …).

Scan & codemod

Discover strings in your source files. For JSX/TSX we can rewrite them automatically — codemod:

shipeasy i18n scan ./src --rewrite --profile en

The codemod replaces:

<h1>Welcome back</h1>

with:

<h1>{t("welcome_back", "Welcome back")}</h1>

and adds the import. For non-JSX languages (Vue, Svelte, plain HTML, server templates), the scan reports candidates and you wrap them by hand.

A i18n-codemod-review.json report is written at the project root listing strings the codemod skipped (dynamic interpolations, rich HTML, etc.).

Push keys

shipeasy i18n push --profile en --source codemod

Pushes every discovered key to the dashboard. Verify in Shipeasy Translations → Label keys.

Add target locales

Say you want French and German:

shipeasy i18n profiles create --name fr --locale fr
shipeasy i18n profiles create --name de --locale de

Generate AI translations

shipeasy i18n translate --profile fr --ai
shipeasy i18n translate --profile de --ai

Each command creates a draft in the dashboard with proposed translations for every key missing from the target profile. The AI uses the source value, the project tone, the glossary, and any descriptions you've added on each key.

Review

Open Shipeasy Translations → Drafts → fr. You see every key, the source value, and the proposed translation, side by side. Edit any value inline. When you're satisfied, click Merge draft.

Merging promotes the values to the profile. It does not publish — that's a separate, deliberate step.

Publish

shipeasy i18n publish --profile fr
shipeasy i18n publish --profile de

Each publish writes the chunked label bundle to KV and purges the relevant CDN URLs. New copy is live worldwide in seconds.

Switch locale at runtime

The loader reads the active locale from your URL or a cookie. Most frameworks already provide this; the SDK exposes a helper:

import { i18n } from "@shipeasy/sdk/client";
i18n.setLocale("fr");

The loader fetches the new bundle, swaps the strings, and re-renders.

Validate before deploy

In CI, fail the build if any code reference is missing from the source profile:

shipeasy i18n validate --profile en ./src

Add this to your pre-merge checks and you'll never ship an "untranslated string" bug.

Don't translate user-generated content this way

The keys flow above is for static UI strings extracted at build time. For UGC (chat messages, reviews, support tickets), use the runtime /translate endpoint with the streaming SDK.

What you just got

NEXT

Hand it to an AI agent.

The same flow, but driven by Claude Code or Cursor through the MCP server. You answer one auth prompt, the agent does the rest.

Install the MCP
$shipeasy mcp install
Then point your agent at
$https://docs.shipeasy.ai/llms/i18n-strings
Was this page helpful?✎ Edit on GitHub

On this page