Incremental Translation

You don't have to translate your entire site before going live with a new locale. This guide covers strategies for rolling out translations progressively — starting with key pages and expanding over time.

Note: This is more of a Rosey + CloudCannon workflow guide than a connector-specific feature. Since the connector bridges the two, it's useful context for planning your translation approach.

#Strategy 1: Translate with fallback content

The simplest approach. Start translating and let Rosey handle the rest.

How it works

Rosey generates a locale version of every page on the site as long as a locale file exists — even if the file only has translations for a handful of keys. For any data-rosey element without a translation, Rosey falls back to the original language HTML. The translated page is complete and functional; untranslated elements just show the default-language text.

The write-locales CLI reinforces this: when it adds a new key to a locale file, it seeds value with the original text automatically. This means translated pages display the original content for every element right out of the box — nothing looks empty or broken. Editors then replace these values with actual translations at their own pace.

Even if you're managing locale files manually, setting value equal to original in any entry achieves the same result:

{
  "hero:title": {
    "original": "Welcome to my site",
    "value": "Welcome to my site",
    "_base_original": "Welcome to my site"
  }
}

Until an editor changes value to the translated text, this element displays the English original on the French page.

SEO considerations

Rosey automatically adds <html lang>, <meta http-equiv="content-language">, and <link rel="alternate" hreflang> tags to every translated page. These hreflang tags tell search engines that the locale pages are language variants of the same content, not duplicates. Your SEO scores are safe even when locale pages contain mostly default-language text.

Connector features that help

When to use this

Strategy 2: CloudCannon branching workflow

For teams that don't want any partially-translated content visible on the live site.

How it works

CloudCannon supports staging workflows where editors work on a branch and merge to production when ready. Applied to translation:

  1. Create a staging branch (e.g. translate-fr) from your production branch
  2. Set up a branch site in CloudCannon pointing at the staging branch
  3. Editors translate on the staging site — the postbuild runs Rosey as usual, so the Visual Editor locale switcher works and editors can preview translations in context
  4. When a batch of translations is complete, merge to production — CloudCannon supports direct merge or pull-request-based merge with optional review/approval
  5. The production build runs, Rosey generates the translated pages, and the fully-translated content goes live

This keeps the live site clean while giving editors a full preview environment for translation work.

Tip: CloudCannon's staging workflow guide shows how to gate the postbuild behind an environment variable so expensive steps only run on production. What the connector actually needs on the editing branch is the locale files and the /_rcc/locales.json manifest — i.e. the write-locales step and its --dest output. The final rosey build step (which generates the translated per-locale pages) is not required for the Visual Editor switcher, so it's safe to gate that heavier step behind an env var and keep only rosey generate + write-locales running on the staging branch.

Connector behaviour

The connector works identically on staging and production branches. No configuration changes are needed — it reads the same data_config, fetches the same /_rcc/locales.json manifest, and creates the same inline editors.

When to use this

Strategy 3: Subdirectory builds

A question that comes up: "Can I run Rosey on just /blog/ or /products/ and translate one section at a time?"

Why it doesn't work well

Rosey's --source flag technically accepts any directory path, but it treats that directory as the entire site root. Pointing it at a subdirectory like dist/blog/ means:

There is no built-in Rosey flag for "only translate pages under this path." Rosey processes the entire source directory or nothing.

Alternatives

Combining strategies

These approaches aren't mutually exclusive: