Setup with Vite
The Lingui Vite integration:
- Supports both @vitejs/plugin-react and @vitejs/plugin-react-swc
- Compiles
.po
catalogs on the fly
Setup with @vitejs/plugin-react
@vitejs/plugin-react
uses Babel to transform your code. LinguiJS relies on babel-plugin-macros
to compile JSX to ICU Message Format and for automatic ID generation.
-
Install
@lingui/cli
,@lingui/vite-plugin
,babel-plugin-macros
as development dependencies and@lingui/macro
,@lingui/react
as a runtime dependency:- npm
- Yarn
- pnpm
npm install --save-dev @lingui/cli @lingui/vite-plugin babel-plugin-macros
npm install --save @lingui/react @lingui/macroyarn add --dev @lingui/cli @lingui/vite-plugin babel-plugin-macros
yarn add @lingui/react @lingui/macropnpm add --save-dev @lingui/cli @lingui/vite-plugin babel-plugin-macros
pnpm add @lingui/react @lingui/macro -
Setup Lingui in
vite.config.ts
:info@vitejs/plugin-react
does not use babel config (e.g.babel.rc
) from your project by default. You have to enable it manually or specify babel options directly invite.config.ts
vite.config.tsimport { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { lingui } from "@lingui/vite-plugin";
export default defineConfig({
plugins: [
react({
babel: {
plugins: ["macros"],
},
}),
lingui(),
],
});
Setup with @vitejs/plugin-react-swc
@vitejs/plugin-react-swc
uses SWC to transform your code, which is 20x faster than Babel. LinguiJS relies on @lingui/swc-plugin
to compile JSX to ICU Message Format and for automatic ID generation.
-
Install
@lingui/cli
,@lingui/swc-plugin
as development dependencies and@lingui/macro
,@lingui/react
as a runtime dependency:- npm
- Yarn
- pnpm
npm install --save-dev @lingui/cli @lingui/vite-plugin @lingui/swc-plugin
npm install --save @lingui/react @lingui/macroyarn add --dev @lingui/cli @lingui/vite-plugin @lingui/swc-plugin
yarn add @lingui/react @lingui/macropnpm add --save-dev @lingui/cli @lingui/vite-plugin @lingui/swc-plugin
pnpm add @lingui/react @lingui/macronoteSWC Plugin support is still experimental. Semver backwards compatibility between different
@swc/core
versions is not guaranteed.You need to select an appropriate version of the
@lingui/swc-plugin
to match compatible@swc/core
version.The version of
@swc/core
is specified within the@vitejs/plugin-react-swc
package.To ensure that the resolved version of
@swc/core
is one of the supported versions, you may utilize theresolutions
field in thepackage.json
file, which is supported by Yarn:"resolutions": {
"@swc/core": "1.3.56"
},or
overrides
for >npm@8.3"overrides": {
"@swc/core": "1.3.56"
},For more information about compatibility, see the plugins.swc.rs page.
-
Setup Lingui in
vite.config.ts
:vite.config.tsimport { defineConfig } from "vite";
import react from "@vitejs/plugin-react-swc";
import { lingui } from "@lingui/vite-plugin";
export default defineConfig({
plugins: [
react({
plugins: [["@lingui/swc-plugin", {}]],
}),
lingui(),
],
});
Further Setup
-
Create a
lingui.config.ts
file with LinguiJS configuration in the root of your project (next topackage.json
). Replacesrc
with the directory name where you have source files:lingui.config.tsimport type { LinguiConfig } from "@lingui/conf";
const config: LinguiConfig = {
locales: ["en", "cs", "fr"],
catalogs: [
{
path: "<rootDir>/src/locales/{locale}",
include: ["src"],
},
],
};
export default config;The PO format is recommended for message catalogs, and could be compiled on the fly thanks to
@lingui/vite-plugin
. See Catalog Formats for other available formats. -
Add the following scripts to your
package.json
:package.json{
"scripts": {
"messages:extract": "lingui extract"
}
} -
Check the installation by running:
- npm
- Yarn
- pnpm
npm run messages:extract
yarn messages:extract
pnpm run messages:extract
There should be no error and you should see output similar following:
- npm
- Yarn
- pnpm
> npm run messages:extract
Catalog statistics:
┌──────────┬─────────────┬─────────┐
│ Language │ Total count │ Missing │
├──────────┼─────────────┼─────────┤
│ cs │ 0 │ 0 │
│ en │ 0 │ 0 │
│ fr │ 0 │ 0 │
└──────────┴─────────────┴─────────┘
(use "lingui extract" to update catalogs with new messages)
(use "lingui compile" to compile catalogs for production)> yarn messages:extract
Catalog statistics:
┌──────────┬─────────────┬─────────┐
│ Language │ Total count │ Missing │
├──────────┼─────────────┼─────────┤
│ cs │ 0 │ 0 │
│ en │ 0 │ 0 │
│ fr │ 0 │ 0 │
└──────────┴─────────────┴─────────┘
(use "lingui extract" to update catalogs with new messages)
(use "lingui compile" to compile catalogs for production)> pnpm run messages:extract
Catalog statistics:
┌──────────┬─────────────┬─────────┐
│ Language │ Total count │ Missing │
├──────────┼─────────────┼─────────┤
│ cs │ 0 │ 0 │
│ en │ 0 │ 0 │
│ fr │ 0 │ 0 │
└──────────┴─────────────┴─────────┘
(use "lingui extract" to update catalogs with new messages)
(use "lingui compile" to compile catalogs for production)This command should create
.po
catalogs in thesrc/locales/
folder:src
└── locales
├── cs.po
├── en.po
└── fr.po -
Import
.po
those files directly in your Vite processed code:export async function dynamicActivate(locale: string) {
const { messages } = await import(`./locales/${locale}.po`);
i18n.load(locale, messages);
i18n.activate(locale);
}
See the Dynamic loading of message catalogs for more info.
Don't miss the Lingui ESLint Plugin which can help you find and prevent common l10n mistakes in your code.