Agent skill

Lingui Best Practices

by B0und in B0und/WikiSpeedrun

Implement internationalization with Lingui in React and JavaScript applications.

MITAuto-check passedFrontend & Design

Install Lingui Best Practices

skills CLI
$ npx skills add B0und/WikiSpeedrun --skill lingui-best-practices -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install B0und/WikiSpeedrun lingui-best-practices --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/B0und/WikiSpeedrun.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/lingui-best-practices .claude/skills/lingui-best-practices && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
lingui-best-practices
GitHub stars
133
Used in
2 other repos
Token cost
~4.2k tokens
SKILL.md length
1,266 words
Files
4 (incl. references)
Skills in repo
6
Repo updated
First seen
Licence
MIT

At a glance

Implement internationalization with Lingui in React and JavaScript applications.

  • Works in 6 steps: Wrap your app in I18nProvider → Mark messages for translation using… → Extract messages: lingui extract → …
  • Working with Trans/useLingui/Plural
  • SKILL.md covers Quick Start Workflow, Core Packages, Setup I18nProvider and Translating UI Text, plus 8 more sections
  • Calls npm and git

What it does

Lingui Best Practices is an agent skill from B0und/WikiSpeedrun. Implement internationalization with Lingui in React and JavaScript applications. Use when adding i18n, translating UI, working with Trans/useLingui/Plural, extracting messages, compiling catalogs, or when the user mentions Lingui, internationalization, i18n, translations, locales, message extraction, ICU MessageFormat, or working with .po files.

Its SKILL.md is about 4.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including reference files (for example `references/common-mistakes.md`, `references/configuration.md` and `references/integration-recipes.md`).

It sits in Frontend & Design, covering Translation and Internationalization. It works with React and JavaScript. The repository describes itself as: Wikipedia Speedrun Game. The licence is MIT.

When your agent uses it

  • Working with Trans/useLingui/Plural
  • Extracting messages
  • Compiling catalogs
  • The user mentions Lingui

Example prompts

  • “/lingui-best-practices”

Requirements

  • Node.js

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Wrap your app in I18nProvider
  2. Mark messages for translation using macros (Trans, t, etc.)
  3. Extract messages: lingui extract
  4. Translate the catalogs
  5. Compile catalogs: lingui compile
  6. Load and activate locale in your app

What it can do on your machine

Read from SKILL.md and the folder at commit a03d655. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npm
    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npm and git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Lingui Best Practices loads about 4.2k tokens when it runs, and up to ~10k if it reads all its reference files. Until then it costs about 92 tokens; SKILL.md has 1,266 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~92
When it runs · the whole SKILL.md, loaded when a task matches
~4.2k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~10k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from B0und/WikiSpeedrun at commit a03d655, republished under its MIT licence (© B0und). 1,266 words, ~4,188 tokens.

Download SKILL.mdSave it as .claude/skills/lingui-best-practices/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
lingui-best-practices
description
Implement internationalization with Lingui in React and JavaScript applications. Use when adding i18n, translating UI, working with Trans/useLingui/Plural, extracting messages, compiling catalogs, or when the user mentions Lingui, internationalization, i18n, translations, locales, message extraction, ICU MessageFormat, or working with .po files.

Lingui Best Practices

Lingui is a powerful internationalization (i18n) framework for JavaScript. This skill covers best practices for implementing i18n in React and vanilla JavaScript applications.

Quick Start Workflow

The standard Lingui workflow consists of these steps:

  1. Wrap your app in I18nProvider
  2. Mark messages for translation using macros (Trans, t, etc.)
  3. Extract messages: lingui extract
  4. Translate the catalogs
  5. Compile catalogs: lingui compile
  6. Load and activate locale in your app

Core Packages

Import from these packages:

jsx
// React macros (recommended)
import { Trans, Plural, Select, useLingui } from "@lingui/react/macro";

// Core macros for vanilla JS
import { t, msg, plural, select } from "@lingui/core/macro";

// Runtime (rarely used directly)
import { I18nProvider } from "@lingui/react";
import { i18n } from "@lingui/core";

Setup I18nProvider

Wrap your application with I18nProvider:

jsx
import { I18nProvider } from "@lingui/react";
import { i18n } from "@lingui/core";
import { messages } from "./locales/en/messages";

i18n.load("en", messages);
i18n.activate("en");

function App() {
  return (
    <I18nProvider i18n={i18n}>
      {/* Your app */}
    </I18nProvider>
  );
}

Translating UI Text

Choosing the Right Macro

Work through these questions in order:

  1. Does the message depend on a count? → Plural (JSX) or plural (strings). Never wrap a count-dependent string in plain Trans — that bakes English plural rules into the message.
  2. Is it JSX content? → Trans
  3. Is it a string inside a component (attribute, alert, function argument)? → useLingui() + t`...`
  4. Is it defined outside a component (module scope, constants, config)? → msg descriptor, resolved with t(descriptor) or _(descriptor) at render time
  5. Is it in non-React code? → t from @lingui/core/macro

If the string needs a translator comment, take the object form of whichever macro the tree picks — t`…` and msg`…` have nowhere to attach one. Deciding that while you wrap costs nothing; converting a whole codebase afterwards does not. See the enhanced-message-context skill.

Some destinations expect a plain string and will not take a macro at all — a Zod message, a count inside an aria-label, a server function's return value, an Intl formatter. Those have their own recipes: integration-recipes.md.

Use Trans for JSX Content

The Trans macro is the primary way to translate JSX:

jsx
import { Trans } from "@lingui/react/macro";

// Simple text
<Trans>Hello World</Trans>

// With variables
<Trans>Hello {userName}</Trans>

// With components (rich text)
<Trans>
  Read the <a href="/docs">documentation</a> for more info.
</Trans>

// Extracted as: "Read the <0>documentation</0> for more info."

When to use: For any translatable text in JSX elements.

Use useLingui for Non-JSX

For strings outside JSX (attributes, alerts, function calls):

jsx
import { useLingui } from "@lingui/react/macro";

function MyComponent() {
  const { t } = useLingui();

  const handleClick = () => {
    alert(t`Action completed!`);
  };

  return (
    <div>
      <img src="..." alt={t`Image description`} />
      <button onClick={handleClick}>{t`Click me`}</button>
    </div>
  );
}

When to use: Element attributes, alerts, function parameters, any non-JSX string.

The macro hook returns i18n as well as t, and both are bound to the React context — so one hook covers reading the active locale, formatting against it, and subscribing the component to locale changes. One import covers it — the runtime useLingui from @lingui/react is for code that has no macro transform:

jsx
import { useLingui } from "@lingui/react/macro";

const { t, i18n } = useLingui();
i18n.locale;                       // "de-DE" — the active locale
new Intl.NumberFormat(i18n.locale) // format against it
Use msg for Lazy Translations

When you need to define messages at module level or in arrays/objects:

jsx
import { msg } from "@lingui/core/macro";
import { useLingui } from "@lingui/react";

// Module-level constants
const STATUSES = {
  active: msg`Active`,
  inactive: msg`Inactive`,
  pending: msg`Pending`,
};

function StatusList() {
  const { _ } = useLingui();
  
  return Object.entries(STATUSES).map(([key, message]) => (
    <div key={key}>{_(message)}</div>
  ));
}

When to use: Module-level constants, arrays of messages, conditional message selection.

Descriptors change the field's type

msg turns a string field into a MessageDescriptor, so TypeScript points at every consuming site — which is what makes this conversion safe to apply in bulk. Two things get through it:

React keys keep compiling. key={item.label} becomes an object key, which React stringifies to [object Object] — identical for every row, so reconciliation degrades and the only signal is a console warning. Key on an identifier, never on the copy:

jsx
// ❌ compiles; every key is now identical
{NAV.map((item) => <li key={item.label}>{t(item.label)}</li>)}

// ✅
{NAV.map((item) => <li key={item.to}>{t(item.label)}</li>)}

String methods become type errors with a tempting wrong fix. LABELS[k].toLowerCase() fails to compile — correctly — but t(LABELS[k]).toLowerCase() is not the repair. Lower-casing a translation breaks languages that capitalise by rule (German nouns) and is a no-op in scripts without case. If a lower-case variant is really needed, it is a second message with its own comment.

Pluralization

Use the Plural macro for quantity-dependent messages:

jsx
import { Plural } from "@lingui/react/macro";

<Plural 
  value={messageCount}
  one="You have # message"
  other="You have # messages"
/>

The # placeholder is replaced with the actual value.

Exact Matches

Use _N syntax for exact number matches (takes precedence over plural forms):

jsx
<Plural
  value={count}
  _0="No messages"
  one="One message"
  other="# messages"
/>
With Variables and Components

Combine with Trans for complex messages:

jsx
<Plural
  value={count}
  one={`You have # message, ${userName}`}
  other={
    <Trans>
      You have <strong>#</strong> messages, {userName}
    </Trans>
  }
/>

Formatting Dates and Numbers

Use Intl directly:

jsx
import { useLingui } from '@lingui/react/macro';

function MyComponent() {
  const { i18n } = useLingui();
  const lastLogin = new Date();
  const dateFormatter = useMemo(() => new Intl.DateTimeFormat(i18n.locale), [i18n.locale]);
  return <Trans>Last login: {dateFormatter.format(lastLogin)}</Trans>;
}

Message IDs and Context

Explicit IDs

Provide a custom ID for stable message keys:

jsx
<Trans id="header.welcome">Welcome to our app</Trans>
Context for Disambiguation

When the same text has different meanings, use context:

jsx
<Trans context="direction">right</Trans>
<Trans context="correctness">right</Trans>

These create separate catalog entries.

Use context only when the same text genuinely needs different translations — not as a namespacing scheme (auth.login, settings.title). Identical strings with identical meaning should share one catalog entry so they are translated once.

Comments for Translators

Add context for translators:

jsx
<Trans comment="Greeting shown on homepage">Hello World</Trans>

Configuration

Basic lingui.config.js:

js
import { defineConfig } from "@lingui/cli";

export default defineConfig({
  sourceLocale: "en",
  locales: ["en", "es", "fr", "de"],
  catalogs: [
    {
      path: "<rootDir>/src/locales/{locale}/messages",
      include: ["src"],
      exclude: ["**/node_modules/**"],
    },
  ],
});

For detailed configuration patterns, see configuration.md.

Lingui 6 Notes

Lingui 6 (April 2026) is ESM-only and requires Node.js ≥ 22.19 (or ≥ 24). If the project can't meet that, pin all @lingui/* packages to ^5.

The deprecated string form format: "po" and the formatOptions option were removed in v6. Omit format entirely (PO remains the default), or pass a formatter instance to configure it:

js
import { defineConfig } from "@lingui/cli";
import { formatter } from "@lingui/format-po";

export default defineConfig({
  // ...
  format: formatter({ lineNumbers: false }),
});

lineNumbers: false keeps catalog diffs small — line-number comments change on almost every source edit.

Show full SKILL.md (552 more words)Show less

Catalog Hygiene

Wire extraction and compilation into the project so they can't be forgotten:

json
{
  "scripts": {
    "lingui:extract": "lingui extract",
    "lingui:compile": "lingui compile",
    "dev": "lingui compile && vite",
    "build": "lingui compile && vite build"
  }
}
  • Prepend lingui compile && to the existing dev/build scripts — never replace them, and don't rely on a prebuild hook: pnpm ≥ 7 and Yarn Berry don't run pre/post hooks by default.
  • Gitignore compiled catalogs by extension, never by directory. A directory rule like src/locales/ also swallows the .po files — the translation source of truth:
gitignore
# ✅ compiled artifacts only
src/locales/**/messages.ts
src/locales/**/messages.js

# ❌ never — silently untracks the .po sources too
# src/locales/

Verify with git check-ignore: the compiled file must match, its .po sibling must not. Ignoring compiled catalogs is only safe because lingui compile runs before every build — don't do one without the other.

  • Match compileNamespace to how the app imports the catalog. If the code imports ./locales/en/messages as a .ts file, set compileNamespace: "ts" in lingui.config so a plain lingui compile regenerates exactly that artifact — no --typescript flag anyone can forget.
  • Vite alternative: with @lingui/vite-plugin, the app can dynamically import .po catalogs directly (await import(\./locales/${locale}/messages.po`)`) — the plugin compiles on the fly, so there are no compiled catalog files to script around or gitignore.
  • Add a CI drift check so catalog state is part of the PR contract:
json
"i18n:check": "lingui compile && lingui extract --clean && git diff --exit-code -- src/locales"

This fails the build when someone adds or edits a message without re-running extraction.

Best Practices

Always Use Macros

Prefer macros over runtime components. Macros are compiled at build time, reducing bundle size:

jsx
// ✅ Good - uses macro
import { Trans } from "@lingui/react/macro";

// ❌ Avoid - runtime only
import { Trans } from "@lingui/react";
Keep Messages Simple

Avoid complex expressions in messages - they'll be replaced with placeholders:

jsx
// ❌ Bad - loses context
<Trans>Hello {user.name.toUpperCase()}</Trans>
// Extracted as: "Hello {0}"

// ✅ Good - clear variable name
const userName = user.name.toUpperCase();
<Trans>Hello {userName}</Trans>
// Extracted as: "Hello {userName}"

When extracting to a local variable isn't practical, name the placeholder inline with ph():

jsx
import { ph } from "@lingui/core/macro";

// Extracted as: "Hello {name}" instead of "Hello {0}"
t`Hello ${ph({ name: getUserName() })}`;

ph() also works inside Trans, Plural, and Select.

Use Trans for JSX, t for Strings

Choose the right tool:

jsx
// ✅ For JSX content
<h1><Trans>Welcome</Trans></h1>

// ✅ For string values
const { t } = useLingui();
<img alt={t`Profile picture`} />
Don't Use Macros at Module Level

Macros need component context - use msg instead:

jsx
// ❌ Bad - won't work
import { t } from "@lingui/core/macro";
const LABELS = [t`Red`, t`Green`, t`Blue`];

// ✅ Good - use msg for lazy translation
import { msg } from "@lingui/core/macro";
const LABELS = [msg`Red`, msg`Green`, msg`Blue`];
Don't Wrap Non-UI Strings

Not every string is a message. Leave these unwrapped:

  • CSS classes and className values
  • console.* / logger output and developer-facing error codes
  • Import paths, URLs, API routes, query keys
  • Object keys, enum values, ALL_CAPS constants, data-testid values
  • Values that are compared against or persisted (statuses, slugs)

Locale-prefixing URLs is a routing concern, not a translation concern — don't wrap paths in macros.

Use the ESLint Plugin

Install and configure eslint-plugin-lingui to catch common mistakes automatically:

bash
npm install --save-dev eslint-plugin-lingui
js
// eslint.config.js
import pluginLingui from "eslint-plugin-lingui";

export default [
  pluginLingui.configs["flat/recommended"],
];

Locale Metadata: Single-Source It

Define locale facts once in a shared module with no React or framework imports, so it's safe to use from config, middleware, tests, and components alike:

ts
// src/i18n/locales.ts
export const locales = ["en", "es", "fr", "ar"] as const;
export type Locale = (typeof locales)[number];
export const sourceLocale: Locale = "en";

const RTL_LOCALES = new Set(["ar", "he", "fa", "ur"]);
export const getDirection = (locale: string): "ltr" | "rtl" =>
  RTL_LOCALES.has(locale.split("-")[0]) ? "rtl" : "ltr";

// "Deutsch", not "German" — each language name rendered in its own language
export const localeDisplayName = (locale: string) =>
  new Intl.DisplayNames([locale], { type: "language" }).of(locale) ?? locale;

// `null` is in the signature on purpose: detect() and headers.get() both return it
export function resolveLocale(candidate: string | null | undefined): Locale {
  if (!candidate) return sourceLocale;
  if ((locales as readonly string[]).includes(candidate)) return candidate as Locale;
  const base = candidate.split("-")[0]; // es-MX → es
  return (locales as readonly string[]).includes(base) ? (base as Locale) : sourceLocale;
}

Signs this went wrong: getDirection or Intl.DisplayNames defined in more than one file, hardcoded dir="rtl" conditionals scattered around, hand-maintained language-name maps.

Layout caveat: don't keep both src/i18n.ts and src/i18n/ — the flat file shadows the directory's index.ts in module resolution, the build still passes, and the app is quietly wrong. Pick one layout.

Common Patterns

Dynamic Locale Switching
jsx
import { i18n } from "@lingui/core";

async function changeLocale(locale) {
  const { messages } = await import(`./locales/${locale}/messages`);
  i18n.load(locale, messages);
  i18n.activate(locale);
}
Loading Catalogs Dynamically
jsx
import { useEffect } from "react";
import { i18n } from "@lingui/core";

function loadCatalog(locale) {
  return import(`./locales/${locale}/messages`);
}

function App() {
  useEffect(() => {
    loadCatalog("en").then(catalog => {
      i18n.load("en", catalog.messages);
      i18n.activate("en");
    });
  }, []);
  
  return <I18nProvider i18n={i18n}>{/* ... */}</I18nProvider>;
}
Memoization with useLingui

When using memoization, use the t function from the macro version:

jsx
import { useLingui } from "@lingui/react/macro";
import { msg } from "@lingui/core/macro";
import { useMemo } from "react";

const welcomeMessage = msg`Welcome!`;

function MyComponent() {
  const { t } = useLingui(); // Macro version - reference changes with locale
  
  // ✅ Safe - t reference updates with locale
  const message = useMemo(() => t(welcomeMessage), [t]);
  
  return <div>{message}</div>;
}

Troubleshooting

If you encounter issues:

  1. Messages not extracted: Check include patterns in lingui.config.js
  2. Translations not applied: Ensure catalogs are compiled with lingui compile
  3. Runtime errors: Verify I18nProvider wraps your app
  4. Type errors: Run lingui compile --typescript for TypeScript projects

For detailed common mistakes and pitfalls, see common-mistakes.md.

For the seams where Lingui meets a library that wants a plain string — validation schemas, plurals inside attributes, i18n._() with values, server-composed messages, Intl formatters — see integration-recipes.md. Each of those has a version that compiles, ships, and is wrong; the recipes lead with the trap.

© B0und, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files (references) in .agents/skills/lingui-best-practices of B0und/WikiSpeedrun.

  • SKILL.md
  • references/common-mistakes.md
  • references/configuration.md
  • references/integration-recipes.md

Open the folder on GitHubat commit a03d655

Used in 2 other repositories

We found 2 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 2 other GitHub owners. This page covers the copy in B0und/WikiSpeedrun, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Lingui Best Practices next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Lingui Best Practices compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Lingui Best Practices this skillB0und/WikiSpeedrun1332 repos~4.2kAutomated safety check: PassMIT
I18next Localizationi18next/i18next-cli242—~1.6kAutomated safety check: PassMIT
Add LanguageZoneMinder/zmNinjaNg110—~1.1kAutomated safety check: PassApache-2.0
Experience UI Bundle Localizeforcedotcom/sf-skills1.1k—~5.8kAutomated safety check: PassApache-2.0
Translate CraftEliasOulkadi/shokunin114—~2.4kAutomated safety check: PassMIT
Frontend I18nlangflow-ai/langflow155k—~1kAutomated safety check: PassMIT

Similar skills

  • I18next Localization

    i18next/i18next-cli

    Takes an app from hardcoded strings to a localized, continuously translated one with i18next (Locize optional): stack detection, config, wrapping strings in t(), key extraction, Locize sync, and AI…

    242 GitHub stars~1.6k tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • Add Language

    ZoneMinder/zmNinjaNg

    A skill your agent uses when adding a new interface language (locale) to the app, or when asked to translate the UI into another language.

    110 GitHub stars~1.1k tokensUpdated 3 days ago
    Frontend & DesignAuto-check passed
  • Experience UI Bundle Localize

    forcedotcom/sf-skills

    MUST activate to localize / internationalize a uiBundles//src/ project (React or Angular): extract hardcoded user-facing strings into Custom Labels, wire a runtime i18n library over the Platform SDK…

    1.1k GitHub stars~5.8k tokensUpdated 2 days ago
    Frontend & DesignAuto-check passed
  • Translate Craft

    EliasOulkadi/shokunin

    Professional translation and localization for 8 languages (ES, JA, FR, DE, PT, ZH, KO, AR).

    114 GitHub stars~2.4k tokensUpdated 4 days ago
    Frontend & DesignAuto-check passed
  • Frontend I18n

    langflow-ai/langflow

    Add, change, or review user-facing text in the Langflow frontend using the i18n system (i18next / react-i18next).

    155k GitHub stars~1k tokensUpdated today
    Frontend & DesignAuto-check passed
  • A skill your agent uses when the user wants to translate a repository README, make a repo multilingual, localize docs, add a language switcher, internationalize the README, or update localized…

    344 GitHub starsUsed in 2 repos~1.9k tokens
    Frontend & DesignAuto-check passed

More from B0und/WikiSpeedrun

  • Find Unwrapped Strings

    B0und/WikiSpeedrun

    Audit a Lingui project for hardcoded user-facing strings that were never wrapped in macros.

    133 GitHub stars~2.1k tokensUpdated 20 days ago
    Auto-check passed
  • Lingui Framework Setup

    B0und/WikiSpeedrun

    Set up Lingui in a React framework. An agent skill from B0und/WikiSpeedrun.

    133 GitHub stars~1.9k tokensUpdated 20 days ago
    Auto-check passed
  • Migrate I18next To Lingui

    B0und/WikiSpeedrun

    Migrate i18next/react-i18next projects to Lingui. An agent skill from B0und/WikiSpeedrun.

    133 GitHub stars~3.1k tokensUpdated 20 days ago
    Auto-check passed
  • Enhanced Message Context

    B0und/WikiSpeedrun

    Add translator comments to Lingui messages so translations are accurate.

    133 GitHub stars~3.3k tokensUpdated 20 days ago
    Auto-check passed
  • Swc Plugin Compatibility

    B0und/WikiSpeedrun

    Diagnose and fix Lingui SWC plugin compatibility errors with Next.js, Vite, Rspack, or other SWC runtimes.

    133 GitHub stars~2.3k tokensUpdated 20 days ago
    Auto-check passed

Works with

Questions about Lingui Best Practices

What does Lingui Best Practices do?

Implement internationalization with Lingui in React and JavaScript applications. Lingui Best Practices is an agent skill from B0und/WikiSpeedrun. Implement internationalization with Lingui in React and JavaScript applications.

When should I use Lingui Best Practices?

Lingui Best Practices fits situations like: working with Trans/useLingui/Plural; extracting messages; compiling catalogs; the user mentions Lingui.

How do I install Lingui Best Practices in Claude Code?

Run `npx skills add B0und/WikiSpeedrun --skill lingui-best-practices -a claude-code`. Or copy the skill folder (.agents/skills/lingui-best-practices in B0und/WikiSpeedrun) into .claude/skills/lingui-best-practices in your project. Claude Code loads it when a task matches its description.

How do I install Lingui Best Practices in Codex?

Run `npx skills add B0und/WikiSpeedrun --skill lingui-best-practices -a codex`. Or copy the skill folder (.agents/skills/lingui-best-practices in B0und/WikiSpeedrun) into .agents/skills/lingui-best-practices in your project. Codex loads it when a task matches its description.

Can I use Lingui Best Practices in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add B0und/WikiSpeedrun --skill lingui-best-practices -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/lingui-best-practices, .gemini/skills/lingui-best-practices, .github/skills/lingui-best-practices and .opencode/skills/lingui-best-practices in your project.

What does Lingui Best Practices need to run?

Going by SKILL.md and its folder, Lingui Best Practices needs the command-line tools its instructions call (npm and git). Our summary lists: Node.js.

Does Lingui Best Practices access the network?

SKILL.md contains no URLs. Its commands use npm and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Lingui Best Practices safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Lingui Best Practices use?

Lingui Best Practices is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Lingui Best Practices use?

About 4.2k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 6k tokens, read only when the agent opens those files.

What are the alternatives to Lingui Best Practices?

Skills that share tags, products or a category with Lingui Best Practices: I18next Localization (i18next/i18next-cli, 242 stars), Add Language (ZoneMinder/zmNinjaNg, 110 stars), Experience UI Bundle Localize (forcedotcom/sf-skills, 1.1k stars) and Translate Craft (EliasOulkadi/shokunin, 114 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Lingui Best Practices?

B0und (a GitHub user) maintains it in B0und/WikiSpeedrun, which has 133 GitHub stars. The repository holds 6 skills in this directory. The repository was last updated on September 19, 2026.

Source: B0und/WikiSpeedrun on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.