Skip to content

Remix v3 i18n · Server-first

Remix v3 i18n for its new server-first stack.

The new Remix v3 is not React Router Framework Mode and it is not a React framework. Palamedes integrates with its Node TypeScript loader and Fetch API request model to translate server-loaded modules with request-local PO catalogs.

Integration
@palamedes/remix

A Node loader hook plus request-local server helpers.

Verified against
Remix 3 beta.5

The new full-stack Remix package, not React Router.

Current scope
Server modules

TypeScript macros and PO imports on the server path.

Locale models
4 smoke proofs

Cookie, route, subdomain, and top-level domain.

npm package@palamedes/remixv1.17.32.2K downloads / month

01 — The framework problem

Remix v3 moved the integration point from a bundler to the running server.

Remix v3 intentionally executes TypeScript through its Node loader instead of relying on a traditional application build. Translation macros therefore have to compose with that loader and establish request scope before controllers render a response.

02 — The Palamedes model

Join the loader Remix already uses, then stay request-local.

Palamedes does not add a separate Remix build. Its register hook receives the output from Remix's TypeScript loader, transforms message macros, and lets controllers resolve catalogs through a server helper.

A composable Node loader

Register remix/node-tsx first and @palamedes/remix/register second. Macro-containing server modules are transformed once when Node loads them.

Fetch-native locale resolution

createRemixI18nServer() reads a Request, applies the chosen strategy, loads the catalog, and scopes the active runtime to the handler.

No per-request transform work

After process startup, handlers execute ordinary runtime calls against compiled catalogs; the transform does not repeat for every response.

03 — In TypeScript

Loader order is explicit; locale policy stays in a typed server helper.

package.json + app/i18n.ts

// package.json
{
  "scripts": {
    "start": "node --import remix/node-tsx --import @palamedes/remix/register server.ts"
  }
}

// app/i18n.ts
import { createRemixI18nServer } from "@palamedes/remix/server"

export const remixI18n = createRemixI18nServer({
  locales,
  strategy: "route",
  loadMessages,
  routeParam: "locale",
})

export function resolveLocale(request: Request) {
  return remixI18n.resolveLocale(request)
}

The registration order is load-bearing: Remix lowers TypeScript first, then Palamedes transforms the resulting server module. The checked controller runs translated t and plural calls inside the resolved request scope.

04 — Locale strategy

Choose the URL model that fits your Remix v3 product.

The Remix server helper supports the same four locale decisions as the established UI adapters. These examples are local and CI smoke proofs today; the cells link source rather than implying a public interactive deployment.

Cookie

One URL for all locales. Best for apps behind login where SEO is irrelevant and switching should be instant.

◌ local / CIsource →

Route segment

/de/checkout-style paths. The SEO-friendly default for public content with indexable localized pages.

◌ local / CIsource →

Subdomain

de.example.com. Clean separation per market, works well with regional CDNs and analytics splits.

◌ local / CIsource →

Top-level domain

example.de vs example.com. Maximum market trust; Palamedes maps each domain to its locale.

◌ local / CIsource →

Compare the four locale strategies →

05 — Proof and boundaries

Four server proofs, with the maturity level stated plainly.

Remix v3 support is checked separately from React Router and separately from the browser-verified React/Solid matrix. The tests start each server and assert locale-specific responses and switching behavior.

Module loading
Hook checked

TypeScript macros are transformed after remix/node-tsx.

Catalog loading
PO checked

Server-loaded PO imports compile through the register hook.

Request state
Scoped

Locale and catalog resolve per Fetch API request.

Hosting
Local / CI

No public Remix v3 demo is claimed yet.

06 — Questions

Remix v3 i18n questions, answered

The short version of the decisions that usually block an implementation.

Is Remix v3 the same thing as React Router Framework Mode?
No. React Router Framework Mode remains a React framework with a Vite plugin, route modules, loaders, and actions. Remix v3 is a separate server-first full-stack project with its own packages, router, loaders, UI direction, and runtime model.
Does Palamedes support Remix v3 without React?
Yes for the current server-loaded module path. The integration transforms core t, plural, select, and selectOrdinal macros and loads PO catalogs without depending on @palamedes/react.
Can Remix v3 browser modules use Palamedes macros?
Not yet. Remix's current asset pipeline does not expose a script transform hook for the Palamedes adapter, so this page deliberately limits the support claim to server-loaded modules.
Is Remix v3 support production-ready?
Treat it as an early integration for an upstream beta. Four locale strategies are smoke-verified, but there is no public hosted demo, client-module transform, or rich JSX path yet.

07 — Keep exploring

See how the same model meets a different host.

Explore the new Remix on its own terms, including the sharp edges.