Setup with Vite
The Lingui Vite integration:
- Supports both @vitejs/plugin-react and @vitejs/plugin-react-swc
- Compiles
.pocatalogs 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,babel-plugin-macrosas development dependencies and@lingui/macro,@lingui/reactas 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/macroSetup Lingui in
vite.config.ts:info@vitejs/plugin-reactdoes 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.tsvite.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-pluginas development dependencies and@lingui/macro,@lingui/reactas 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/macroSetup 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.tsfile with LinguiJS configuration in the root of your project (next topackage.json). Replacesrcwith the directory name where you have source files:
import type { LinguiConfig } from "@lingui/conf";
const config: LinguiConfig = {
locales: ["en", "cs", "fr"],
catalogs: [
{
path: "<rootDir>/src/locales/{locale}",
include: ["src"],
},
],
};
export default config;
PO format is recommended for message catalogs, and could be compiled on the fly thanks to @lingui/vite-plugin.
See format documentation for other available formats.
- Add the following scripts to your
package.json:
{
"scripts": {
"messages:extract": "lingui extract"
}
}
Check the installation by running:
- npm
- Yarn
- pnpm
npm run messages:extractyarn messages:extractpnpm run messages:extractThere 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
.pocatalogs in thesrc/locales/folder:src
└── locales
├── cs.po
├── en.po
└── fr.poImport
.pothose 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);
}
Don't miss the Lingui ESLint Plugin which can help you find and prevent common l10n mistakes in your code.
See the guide about dynamic loading catalogs for more info.
See Vite's official documentation for more info about Vite dynamic imports.
Congratulations! You've successfully set up a Vite project with LinguiJS. Now it's a good time to follow React tutorial or read about ICU Message Format which is used in messages.