@intlayer/docs 7.0.4-canary.0 → 7.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/blog/ar/intlayer_with_i18next.md +68 -106
  2. package/blog/ar/intlayer_with_next-i18next.md +84 -288
  3. package/blog/ar/intlayer_with_next-intl.md +58 -337
  4. package/blog/ar/intlayer_with_react-i18next.md +68 -290
  5. package/blog/ar/intlayer_with_react-intl.md +63 -266
  6. package/blog/de/intlayer_with_i18next.md +77 -97
  7. package/blog/de/intlayer_with_next-i18next.md +69 -296
  8. package/blog/de/intlayer_with_next-intl.md +59 -340
  9. package/blog/de/intlayer_with_react-i18next.md +68 -290
  10. package/blog/de/intlayer_with_react-intl.md +62 -264
  11. package/blog/en/intlayer_with_i18next.md +36 -1638
  12. package/blog/en/intlayer_with_next-i18next.md +22 -847
  13. package/blog/en/intlayer_with_next-intl.md +32 -1053
  14. package/blog/en/intlayer_with_react-i18next.md +38 -764
  15. package/blog/en/intlayer_with_react-intl.md +42 -1018
  16. package/blog/en-GB/intlayer_with_i18next.md +67 -103
  17. package/blog/en-GB/intlayer_with_next-i18next.md +71 -292
  18. package/blog/en-GB/intlayer_with_next-intl.md +58 -337
  19. package/blog/en-GB/intlayer_with_react-i18next.md +67 -289
  20. package/blog/en-GB/intlayer_with_react-intl.md +61 -264
  21. package/blog/es/intlayer_with_i18next.md +67 -103
  22. package/blog/es/intlayer_with_next-i18next.md +71 -296
  23. package/blog/es/intlayer_with_next-intl.md +57 -338
  24. package/blog/es/intlayer_with_react-i18next.md +68 -290
  25. package/blog/es/intlayer_with_react-intl.md +62 -265
  26. package/blog/fr/intlayer_with_i18next.md +66 -104
  27. package/blog/fr/intlayer_with_next-i18next.md +82 -285
  28. package/blog/fr/intlayer_with_next-intl.md +57 -338
  29. package/blog/fr/intlayer_with_react-i18next.md +67 -289
  30. package/blog/fr/intlayer_with_react-intl.md +61 -264
  31. package/blog/hi/intlayer_with_i18next.md +68 -104
  32. package/blog/hi/intlayer_with_next-i18next.md +74 -299
  33. package/blog/hi/intlayer_with_next-intl.md +57 -239
  34. package/blog/hi/intlayer_with_react-i18next.md +69 -291
  35. package/blog/hi/intlayer_with_react-intl.md +65 -268
  36. package/blog/id/intlayer_with_i18next.md +126 -0
  37. package/blog/id/intlayer_with_next-i18next.md +142 -0
  38. package/blog/id/intlayer_with_next-intl.md +113 -0
  39. package/blog/id/intlayer_with_react-i18next.md +124 -0
  40. package/blog/id/intlayer_with_react-intl.md +122 -0
  41. package/blog/it/intlayer_with_i18next.md +67 -103
  42. package/blog/it/intlayer_with_next-i18next.md +71 -296
  43. package/blog/it/intlayer_with_next-intl.md +57 -338
  44. package/blog/it/intlayer_with_react-i18next.md +68 -290
  45. package/blog/it/intlayer_with_react-intl.md +62 -265
  46. package/blog/ja/intlayer_with_i18next.md +68 -103
  47. package/blog/ja/intlayer_with_next-i18next.md +85 -283
  48. package/blog/ja/intlayer_with_next-intl.md +58 -336
  49. package/blog/ja/intlayer_with_react-i18next.md +68 -290
  50. package/blog/ja/intlayer_with_react-intl.md +62 -264
  51. package/blog/ko/intlayer_with_i18next.md +80 -96
  52. package/blog/ko/intlayer_with_next-i18next.md +85 -287
  53. package/blog/ko/intlayer_with_next-intl.md +68 -327
  54. package/blog/ko/intlayer_with_react-i18next.md +68 -290
  55. package/blog/ko/intlayer_with_react-intl.md +64 -266
  56. package/blog/pl/intlayer_with_i18next.md +126 -0
  57. package/blog/pl/intlayer_with_next-i18next.md +142 -0
  58. package/blog/pl/intlayer_with_next-intl.md +111 -0
  59. package/blog/pl/intlayer_with_react-i18next.md +124 -0
  60. package/blog/pl/intlayer_with_react-intl.md +122 -0
  61. package/blog/pt/intlayer_with_i18next.md +67 -103
  62. package/blog/pt/intlayer_with_next-i18next.md +72 -293
  63. package/blog/pt/intlayer_with_next-intl.md +57 -256
  64. package/blog/pt/intlayer_with_react-i18next.md +104 -78
  65. package/blog/pt/intlayer_with_react-intl.md +62 -266
  66. package/blog/ru/intlayer_with_i18next.md +66 -104
  67. package/blog/ru/intlayer_with_next-i18next.md +71 -296
  68. package/blog/ru/intlayer_with_next-intl.md +58 -337
  69. package/blog/ru/intlayer_with_react-i18next.md +68 -290
  70. package/blog/ru/intlayer_with_react-intl.md +62 -265
  71. package/blog/tr/intlayer_with_i18next.md +71 -107
  72. package/blog/tr/intlayer_with_next-i18next.md +72 -297
  73. package/blog/tr/intlayer_with_next-intl.md +58 -339
  74. package/blog/tr/intlayer_with_react-i18next.md +69 -291
  75. package/blog/tr/intlayer_with_react-intl.md +63 -285
  76. package/blog/vi/intlayer_with_i18next.md +126 -0
  77. package/blog/vi/intlayer_with_next-i18next.md +142 -0
  78. package/blog/vi/intlayer_with_next-intl.md +111 -0
  79. package/blog/vi/intlayer_with_react-i18next.md +124 -0
  80. package/blog/vi/intlayer_with_react-intl.md +122 -0
  81. package/blog/zh/intlayer_with_i18next.md +67 -102
  82. package/blog/zh/intlayer_with_next-i18next.md +72 -296
  83. package/blog/zh/intlayer_with_next-intl.md +58 -336
  84. package/blog/zh/intlayer_with_react-i18next.md +68 -290
  85. package/blog/zh/intlayer_with_react-intl.md +63 -106
  86. package/docs/ar/plugins/sync-json.md +244 -0
  87. package/docs/de/plugins/sync-json.md +244 -0
  88. package/docs/en/intlayer_cli.md +25 -0
  89. package/docs/en/intlayer_with_nextjs_14.md +2 -0
  90. package/docs/en/intlayer_with_nextjs_15.md +2 -0
  91. package/docs/en/intlayer_with_nextjs_16.md +2 -0
  92. package/docs/en/plugins/sync-json.md +1 -1
  93. package/docs/en-GB/plugins/sync-json.md +244 -0
  94. package/docs/es/plugins/sync-json.md +244 -0
  95. package/docs/fr/plugins/sync-json.md +244 -0
  96. package/docs/hi/plugins/sync-json.md +244 -0
  97. package/docs/id/plugins/sync-json.md +244 -0
  98. package/docs/it/plugins/sync-json.md +244 -0
  99. package/docs/ja/plugins/sync-json.md +244 -0
  100. package/docs/ko/plugins/sync-json.md +244 -0
  101. package/docs/pl/plugins/sync-json.md +244 -0
  102. package/docs/pt/plugins/sync-json.md +244 -0
  103. package/docs/ru/plugins/sync-json.md +244 -0
  104. package/docs/tr/plugins/sync-json.md +245 -0
  105. package/docs/vi/plugins/sync-json.md +244 -0
  106. package/docs/zh/plugins/sync-json.md +244 -0
  107. package/package.json +14 -14
@@ -1,392 +1,113 @@
1
1
  ---
2
2
  createdAt: 2025-01-02
3
- updatedAt: 2025-06-29
4
- title: Intlayer and next-intl
5
- description: Integrate Intlayer with next-intl for the internationalization (i18n) of a React app
6
- keywords:
7
- - next-intl
8
- - Intlayer
9
- - Internationalisation
10
- - Blog
11
- - Next.js
12
- - JavaScript
13
- - React
3
+ updatedAt: 2025-10-29
4
+ title: How to automate your next-intl JSON translations using Intlayer
5
+ description: Automate your JSON translations with Intlayer and next-intl for enhanced internationalisation in Next.js applications.
14
6
  slugs:
15
7
  - blog
16
8
  - intlayer-with-next-intl
9
+ history:
10
+ - version: 7.0.0
11
+ date: 2025-10-29
12
+ changes: Change to syncJSON plugin
17
13
  ---
18
14
 
19
- # Next.js Internationalization (i18n) with next-intl and Intlayer
15
+ # How to automate your next-intl JSON translations using Intlayer
20
16
 
21
- Both next-intl and Intlayer are open-source internationalization (i18n) frameworks designed for Next.js applications. They are widely used for managing translations, localization, and language switching in software projects.
17
+ ## What is Intlayer?
22
18
 
23
- They share three principal notions:
19
+ **Intlayer** is an innovative, open-source internationalisation library designed to address the shortcomings of traditional i18n solutions. It offers a modern approach to content management in Next.js applications.
24
20
 
25
- 1. **Dictionary**: The method for defining the translatable content of your application.
26
- - Named `content declaration file` in Intlayer, which can be a JSON, JS, or TS file exporting the structured data. See [Intlayer documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/concept/content) for more information.
27
- - Named `messages` or `locale messages` in next-intl, usually in JSON files. See [next-intl documentation](https://github.com/amannn/next-intl) for more information.
21
+ See a concrete comparison with next-intl in our [next-i18next vs. next-intl vs. Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/next-i18next_vs_next-intl_vs_intlayer.md) blog post.
28
22
 
29
- 2. **Utilities**: Tools to build and interpret content declarations in the application, such as `useIntlayer()` or `useLocale()` for Intlayer, and `useTranslations()` for next-intl.
23
+ ## Why Combine Intlayer with next-intl?
30
24
 
31
- 3. **Plugins and Middlewares**: Features for managing URL redirection, bundling optimization, and more, e.g., `intlayerMiddleware` for Intlayer or [`createMiddleware`](https://github.com/amannn/next-intl) for next-intl.
25
+ While Intlayer provides an excellent standalone i18n solution (see our [Next.js integration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_with_nextjs_16.md)), you might want to combine it with next-intl for several reasons:
32
26
 
33
- ## Intlayer vs. next-intl: Key Differences
27
+ 1. **Existing codebase**: You have an established next-intl implementation and want to gradually migrate to Intlayer's improved developer experience.
28
+ 2. **Legacy requirements**: Your project requires compatibility with existing next-intl plugins or workflows.
29
+ 3. **Team familiarity**: Your team is comfortable with next-intl but desires better content management.
34
30
 
35
- For a deeper analysis of how Intlayer compares to other i18n libraries for Next.js (such as next-intl), check out the [next-i18next vs. next-intl vs. Intlayer blog post](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en-GB/i18next_vs_next-intl_vs_intlayer.md).
31
+ **For this, Intlayer can be implemented as an adapter for next-intl to assist in automating your JSON translations in CLI or CI/CD pipelines, testing your translations, and more.**
36
32
 
37
- ## How to Generate next-intl Messages with Intlayer
33
+ This guide demonstrates how to leverage Intlayer's superior content declaration system while maintaining compatibility with next-intl.
38
34
 
39
- ### Why Use Intlayer with next-intl?
35
+ ## Table of Contents
40
36
 
41
- Intlayer content declaration files generally offer a better developer experience. They are more flexible and maintainable due to two main advantages:
37
+ <TOC/>
42
38
 
43
- 1. **Flexible Placement**: You can place an Intlayer content declaration file anywhere in your application’s file tree. This makes it easy to rename or delete components without leaving unused or dangling message files.
39
+ ## Step-by-Step Guide to Set Up Intlayer with next-intl
44
40
 
45
- Example file structures:
41
+ ### Step 1: Install Dependencies
46
42
 
47
- ```bash codeFormat="typescript"
48
- .
49
- └── src
50
- └── components
51
- └── MyComponent
52
- ├── index.content.ts # Content declaration file
53
- └── index.tsx
54
- ```
55
-
56
- ```bash codeFormat="esm"
57
- .
58
- └── src
59
- └── components
60
- └── MyComponent
61
- ├── index.content.mjs # Content declaration file
62
- └── index.mjx
63
- ```
64
-
65
- ```bash codeFormat="cjs"
66
- .
67
- └── src
68
- └── components
69
- └── MyComponent
70
- ├── index.content.cjs # Content declaration file
71
- └── index.cjx
72
- ```
73
-
74
- ```bash codeFormat="json"
75
- .
76
- └── src
77
- └── components
78
- └── MyComponent
79
- ├── index.content.json # Content declaration file
80
- └── index.jsx
81
- ```
82
-
83
- 2. **Centralized Translations**: Intlayer stores all translations in a single content declaration, ensuring no translation is missing. In TypeScript projects, missing translations are flagged automatically as type errors, providing immediate feedback to developers.
84
-
85
- ### Installation
86
-
87
- To use Intlayer and next-intl together, install both libraries:
43
+ Install the necessary packages:
88
44
 
89
45
  ```bash packageManager="npm"
90
- npm install intlayer next-intl
46
+ npm install intlayer @intlayer/sync-json-plugin
91
47
  ```
92
48
 
93
- ```bash packageManager="yarn"
94
- yarn add intlayer next-intl
49
+ ```bash packageManager="pnpm"
50
+ pnpm add intlayer @intlayer/sync-json-plugin
95
51
  ```
96
52
 
97
- ```bash packageManager="pnpm"
98
- pnpm add intlayer next-intl
53
+ ```bash packageManager="yarn"
54
+ yarn add intlayer @intlayer/sync-json-plugin
99
55
  ```
100
56
 
101
- ### Configuring Intlayer to Export next-intl Messages
57
+ **Package descriptions:**
102
58
 
103
- > **Note:** Exporting messages from Intlayer for next-intl can introduce slight differences in structure. If possible, keep an Intlayer-only or next-intl-only flow to simplify the integration. If you do need to generate next-intl messages from Intlayer, follow the steps below.
59
+ - **intlayer**: Core library for internationalisation management, content declaration, and building
60
+ - **@intlayer/sync-json-plugin**: Plugin to export Intlayer content declarations to next-intl compatible JSON format
104
61
 
105
- Create or update an `intlayer.config.ts` file (or `.mjs` / `.cjs`) in the root of your project:
62
+ ### Step 2: Implement the Intlayer plugin to wrap the JSON
106
63
 
107
- ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
108
- import { Locales, type IntlayerConfig } from "intlayer";
64
+ Create an Intlayer configuration file to define your supported locales:
109
65
 
110
- const config: IntlayerConfig = {
111
- internationalization: {
112
- locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
113
- defaultLocale: Locales.ENGLISH,
114
- },
115
- content: {
116
- dictionaryOutput: ["next-intl"], // Use the next-intl output
117
- nextIntlMessagesDir: "./intl/messages", // Where to save next-intl messages
118
- },
119
- };
120
-
121
- export default config;
122
- ```
123
-
124
- ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
125
- import { Locales } from "intlayer";
126
-
127
- /** @type {import('intlayer').IntlayerConfig} */
128
- const config = {
129
- internationalization: {
130
- locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
131
- defaultLocale: Locales.ENGLISH,
132
- },
133
- content: {
134
- dictionaryOutput: ["react-intl"],
135
- nextIntlMessagesDir: "./intl/messages",
136
- },
137
- };
66
+ **If you also want to export JSON dictionaries for next-intl**, add the `syncJSON` plugin:
138
67
 
139
- export default config;
140
- ```
141
-
142
- ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
143
- const { Locales } = require("intlayer");
68
+ ```typescript fileName="intlayer.config.ts"
69
+ import { Locales, type IntlayerConfig } from "intlayer";
70
+ import { syncJSON } from "@intlayer/sync-json-plugin";
144
71
 
145
- /** @type {import('intlayer').IntlayerConfig} */
146
- const config = {
72
+ const config: IntlayerConfig = {
147
73
  internationalization: {
148
74
  locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
149
75
  defaultLocale: Locales.ENGLISH,
150
76
  },
151
- content: {
152
- dictionaryOutput: ["next-intl"],
153
- nextIntlMessagesDir: "./intl/messages",
154
- },
155
- };
156
-
157
- module.exports = config;
158
- ```
159
-
160
- ### Dictionary
161
-
162
- Below are examples of content declaration files in multiple formats. Intlayer will compile these into message files that next-intl can consume.
163
-
164
- ```typescript fileName="**/*.content.ts" contentDeclarationFormat="typescript"
165
- import { t, type Dictionary } from "intlayer";
166
-
167
- const content = {
168
- key: "my-component",
169
- content: {
170
- helloWorld: t({
171
- en: "Hello World",
172
- es: "Hola Mundo",
173
- fr: "Bonjour le monde",
77
+ plugins: [
78
+ syncJSON({
79
+ source: ({ key, locale }) => `./messages/${locale}/${key}.json`,
174
80
  }),
175
- },
176
- } satisfies Dictionary;
177
-
178
- export default content;
179
- ```
180
-
181
- ```javascript fileName="**/*.content.mjs" contentDeclarationFormat="esm"
182
- import { t } from "intlayer";
183
-
184
- /** @type {import('intlayer').Dictionary} */
185
- const content = {
186
- key: "my-component",
187
- content: {
188
- helloWorld: t({
189
- en: "Hello World",
190
- es: "Hola Mundo",
191
- fr: "Bonjour le monde",
192
- }),
193
- },
81
+ ],
194
82
  };
195
83
 
196
- export default content;
197
- ```
198
-
199
- ```javascript fileName="**/*.content.cjs" contentDeclarationFormat="commonjs"
200
- const { t } = require("intlayer");
201
-
202
- module.exports = {
203
- key: "my-component",
204
- content: {
205
- helloWorld: t({
206
- en: "Hello World",
207
- es: "Hola Mundo",
208
- fr: "Bonjour le monde",
209
- }),
210
- },
211
- };
84
+ export default config;
212
85
  ```
213
86
 
214
- ```json fileName="**/*.content.json" contentDeclarationFormat="json"
215
- {
216
- "$schema": "https://intlayer.org/schema.json",
217
- "key": "my-component",
218
- "content": {
219
- "helloWorld": {
220
- "nodeType": "translation",
221
- "translation": {
222
- "en": "Hello World",
223
- "fr": "Bonjour le monde",
224
- "es": "Hola Mundo"
225
- }
226
- }
227
- }
228
- }
229
- ```
87
+ The `syncJSON` plugin will automatically wrap the JSON. It will read and write the JSON files without changing the content architecture.
230
88
 
231
- ### Build the next-intl Messages
89
+ If you want to make that JSON coexist with Intlayer content declaration files (`.content` files), Intlayer will proceed as follows:
232
90
 
233
- To build the message files for next-intl, run:
91
+ 1. load both JSON and content declaration files and transform them into an Intlayer dictionary.
92
+ 2. if there are conflicts between the JSON and the content declaration files, Intlayer will proceed to merge all those dictionaries. This depends on the priority of the plugins and that of the content declaration file (all are configurable).
234
93
 
235
- ```bash packageManager="npm"
236
- npx intlayer dictionaries build
237
- ```
94
+ If changes are made using the CLI to translate the JSON, or using the CMS, Intlayer will update the JSON file with the new translations.
238
95
 
239
- ```bash packageManager="yarn"
240
- yarn intlayer build
241
- ```
96
+ ## Git Configuration
242
97
 
243
- ```bash packageManager="pnpm"
244
- pnpm intlayer build
245
- ```
98
+ It is recommended to ignore auto-generated Intlayer files:
246
99
 
247
- This will generate resources in the `./intl/messages` directory (as configured in `intlayer.config.*`). The expected output:
248
-
249
- ```bash
250
- .
251
- └── intl
252
- └── messages
253
- └── en-GB
254
- └── my-content.json
255
- └── fr
256
- └── my-content.json
257
- └── es
258
- └── my-content.json
100
+ ```plaintext fileName=".gitignore"
101
+ # Ignore files generated by Intlayer
102
+ .intlayer
259
103
  ```
260
104
 
261
- Each file includes compiled messages from all Intlayer content declarations. The top-level keys typically match your `content.key` fields.
262
-
263
- ### Using next-intl in Your Next.js App
264
-
265
- > For more details, see the official [next-intl usage docs](https://github.com/amannn/next-intl#readme).
266
-
267
- 1. **Create a Middleware (optional):**
268
- If you want to manage automatic locale detection or redirection, use next-intl’s [createMiddleware](https://github.com/amannn/next-intl#createMiddleware).
269
-
270
- ```typescript fileName="middleware.ts"
271
- import createMiddleware from "next-intl/middleware";
272
- import { NextResponse } from "next/server";
273
-
274
- export default createMiddleware({
275
- locales: ["en", "fr", "es"],
276
- defaultLocale: "en",
277
- });
278
-
279
- export const config = {
280
- matcher: ["/((?!api|_next|.*\\..*).*)"],
281
- };
282
- ```
283
-
284
- 2. **Create a `layout.tsx` or `_app.tsx` to Load Messages:**
285
- If you’re using the App Router (Next.js 13+), create a layout:
286
-
287
- ```typescript fileName="app/[locale]/layout.tsx"
288
- import { NextIntlClientProvider } from 'next-intl';
289
- import { notFound } from 'next/navigation';
290
- import React, { ReactNode } from 'react';
291
-
292
-
293
- export default async function RootLayout({
294
- children,
295
- params
296
- }: {
297
- children: ReactNode;
298
- params: { locale: string };
299
- }) {
300
- let messages;
301
- try {
302
- messages = (await import(`../../intl/messages/${params.locale}.json`)).default;
303
- } catch (error) {
304
- notFound();
305
- }
306
-
307
- return (
308
- <html lang={params.locale}>
309
- <body>
310
- <NextIntlClientProvider locale={params.locale} messages={messages}>
311
- {children}
312
- </NextIntlClientProvider>
313
- </body>
314
- </html>
315
- );
316
- }
317
- ```
318
-
319
- If you’re using the Pages Router (Next.js 12 or below), load messages in `_app.tsx`:
320
-
321
- ```typescript fileName="pages/_app.tsx"
322
- import type { AppProps } from 'next/app';
323
- import { NextIntlProvider } from 'next-intl';
324
-
325
- function MyApp({ Component, pageProps }: AppProps) {
326
- return (
327
- <NextIntlProvider locale={pageProps.locale} messages={pageProps.messages}>
328
- <Component {...pageProps} />
329
- </NextIntlProvider>
330
- );
331
- }
332
-
333
- export default MyApp;
334
- ```
335
-
336
- 3. **Fetch Messages Server-Side (Pages Router example):**
337
-
338
- ```typescript fileName="pages/index.tsx"
339
- import { GetServerSideProps } from "next";
340
- import HomePage from "../components/HomePage";
341
-
342
- export default HomePage;
343
-
344
- export const getServerSideProps: GetServerSideProps = async ({ locale }) => {
345
- const messages = (await import(`../intl/messages/${locale}.json`)).default;
346
-
347
- return {
348
- props: {
349
- locale,
350
- messages,
351
- },
352
- };
353
- };
354
- ```
355
-
356
- ### Using Content in Next.js Components
357
-
358
- Once the messages are loaded into next-intl, you can use them in your components via the `useTranslations()` hook:
359
-
360
- ```typescript fileName="src/components/MyComponent/index.tsx" codeFormat="typescript"
361
- import type { FC } from "react";
362
- import { useTranslations } from 'next-intl';
363
-
364
- const MyComponent: FC = () => {
365
- const t = useTranslations('my-component');
366
- // 'my-component' corresponds to the content key in Intlayer
367
-
368
- return (
369
- <div>
370
- <h1>{t('helloWorld')}</h1>
371
- </div>
372
- );
373
- };
374
-
375
- export default MyComponent;
376
- ```
105
+ These files can be regenerated during your build process and do not need to be committed to version control.
377
106
 
378
- ```jsx fileName="src/components/MyComponent/index.jsx" codeFormat="esm"
379
- import { useTranslations } from "next-intl";
107
+ ### VS Code Extension
380
108
 
381
- export default function MyComponent() {
382
- const t = useTranslations("my-component");
109
+ For an improved developer experience, install the official **Intlayer VS Code Extension**:
383
110
 
384
- return (
385
- <div>
386
- <h1>{t("helloWorld")}</h1>
387
- </div>
388
- );
389
- }
390
- ```
111
+ [Install from the VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
391
112
 
392
- **That’s it!** Whenever you update or add new Intlayer content declaration files, re-run the `intlayer build` command to regenerate your next-intl JSON messages. next-intl will pick up the updated content automatically.
113
+ [Install from the VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)