Compile-time i18n for modern TypeScript apps

Write messages in code. Ship translations with almost no runtime baggage.

SayKit is a framework-agnostic i18n toolkit built around compile-time extraction, typed configuration, and small runtime primitives. It keeps authoring ergonomic for developers and translation flows clean for everyone else.

ReactNext.jsTanStack StartReact NativeExpoCarbon
Code example
import { Say } from '@saykit/react';

export function Inbox({ count }: { count: number }) {
  return (
    <section>
      <h1><Say>Inbox</Say></h1>
      <p>
        <Say.Plural
          _={count}
          zero="You have no unread messages"
          one="You have 1 unread message"
          other="You have # unread messages"
        />
      </p>
    </section>
  );
}

Why it feels good

  • Compile-time extraction from JS, TS, JSX, and TSX
  • ICU MessageFormat support for plurals, ordinals, and select
  • Framework-agnostic core runtime with adapters where needed
  • Import translation files directly, no compile step, no build-time transform
  • Typed config and CLI with watch mode for instant feedback

Terminal

$ saykit extract

✓ 2 messages extracted

→ locales/en, fr, ja

End to end workflow

A simple translation pipeline that stays close to your codebase

SayKit is designed for the whole path from authoring to deployment, without pushing app teams into a heavyweight platform.

01

Define

Author messages inline with tagged templates or React components.

02

Extract

Scan source files and collect ICU-ready messages into translation files.

03

Translate

Hand translators clean, structured translation files with comments, context, and stable identifiers.

04

Deploy

Import translation files directly into your app, no compile step, no extra build-time transform. Ship small runtime helpers and keep extraction at dev time.

Ready to try it?

Start with the docs, then adapt the example closest to your stack.

The repo already includes examples for Next.js, TanStack Start, and Carbon, and the core package is intended to stay useful even outside framework-specific adapters.