@intlayer/docs 7.5.9 → 7.5.10

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 (128) hide show
  1. package/README.md +9 -2
  2. package/dist/cjs/generated/docs.entry.cjs +19 -0
  3. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  4. package/dist/esm/generated/docs.entry.mjs +19 -0
  5. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  6. package/dist/types/generated/docs.entry.d.ts +1 -0
  7. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  8. package/docs/ar/cli/push.md +1 -1
  9. package/docs/ar/configuration.md +3 -3
  10. package/docs/ar/interest_of_intlayer.md +1 -1
  11. package/docs/ar/intlayer_CMS.md +5 -5
  12. package/docs/ar/intlayer_with_express.md +1 -0
  13. package/docs/ar/intlayer_with_fastify.md +516 -0
  14. package/docs/ar/readme.md +1 -1
  15. package/docs/de/cli/push.md +1 -1
  16. package/docs/de/configuration.md +3 -3
  17. package/docs/de/interest_of_intlayer.md +1 -1
  18. package/docs/de/intlayer_CMS.md +5 -5
  19. package/docs/de/intlayer_with_express.md +1 -0
  20. package/docs/de/intlayer_with_fastify.md +449 -0
  21. package/docs/de/readme.md +1 -1
  22. package/docs/en/cli/push.md +1 -1
  23. package/docs/en/configuration.md +3 -3
  24. package/docs/en/interest_of_intlayer.md +1 -1
  25. package/docs/en/intlayer_CMS.md +5 -5
  26. package/docs/en/intlayer_with_express.md +1 -0
  27. package/docs/en/intlayer_with_fastify.md +439 -0
  28. package/docs/en/readme.md +3 -1
  29. package/docs/en-GB/cli/push.md +1 -1
  30. package/docs/en-GB/configuration.md +3 -3
  31. package/docs/en-GB/interest_of_intlayer.md +1 -1
  32. package/docs/en-GB/intlayer_CMS.md +5 -5
  33. package/docs/en-GB/intlayer_with_express.md +1 -0
  34. package/docs/en-GB/intlayer_with_fastify.md +445 -0
  35. package/docs/en-GB/readme.md +3 -1
  36. package/docs/es/cli/push.md +1 -1
  37. package/docs/es/configuration.md +3 -3
  38. package/docs/es/interest_of_intlayer.md +1 -1
  39. package/docs/es/intlayer_CMS.md +5 -5
  40. package/docs/es/intlayer_with_express.md +1 -0
  41. package/docs/es/intlayer_with_fastify.md +480 -0
  42. package/docs/es/readme.md +1 -1
  43. package/docs/fr/cli/push.md +1 -1
  44. package/docs/fr/configuration.md +3 -3
  45. package/docs/fr/interest_of_intlayer.md +1 -1
  46. package/docs/fr/intlayer_CMS.md +5 -5
  47. package/docs/fr/intlayer_with_express.md +1 -0
  48. package/docs/fr/intlayer_with_fastify.md +439 -0
  49. package/docs/fr/readme.md +1 -1
  50. package/docs/hi/cli/push.md +1 -1
  51. package/docs/hi/configuration.md +3 -3
  52. package/docs/hi/interest_of_intlayer.md +1 -1
  53. package/docs/hi/intlayer_CMS.md +5 -5
  54. package/docs/hi/intlayer_with_express.md +1 -0
  55. package/docs/hi/intlayer_with_fastify.md +540 -0
  56. package/docs/hi/readme.md +1 -1
  57. package/docs/id/cli/push.md +1 -1
  58. package/docs/id/configuration.md +3 -3
  59. package/docs/id/interest_of_intlayer.md +1 -1
  60. package/docs/id/intlayer_CMS.md +5 -5
  61. package/docs/id/intlayer_with_express.md +1 -0
  62. package/docs/id/intlayer_with_fastify.md +470 -0
  63. package/docs/id/readme.md +1 -1
  64. package/docs/it/cli/push.md +1 -1
  65. package/docs/it/configuration.md +3 -3
  66. package/docs/it/interest_of_intlayer.md +1 -1
  67. package/docs/it/intlayer_CMS.md +5 -5
  68. package/docs/it/intlayer_with_express.md +1 -0
  69. package/docs/it/intlayer_with_fastify.md +445 -0
  70. package/docs/it/readme.md +1 -1
  71. package/docs/ja/cli/push.md +1 -1
  72. package/docs/ja/configuration.md +3 -3
  73. package/docs/ja/interest_of_intlayer.md +1 -1
  74. package/docs/ja/intlayer_CMS.md +5 -5
  75. package/docs/ja/intlayer_with_express.md +1 -0
  76. package/docs/ja/intlayer_with_fastify.md +516 -0
  77. package/docs/ja/readme.md +1 -1
  78. package/docs/ko/cli/push.md +1 -1
  79. package/docs/ko/configuration.md +3 -3
  80. package/docs/ko/interest_of_intlayer.md +1 -1
  81. package/docs/ko/intlayer_CMS.md +5 -5
  82. package/docs/ko/intlayer_with_express.md +1 -0
  83. package/docs/ko/intlayer_with_fastify.md +463 -0
  84. package/docs/ko/readme.md +1 -1
  85. package/docs/pl/cli/push.md +1 -1
  86. package/docs/pl/configuration.md +3 -3
  87. package/docs/pl/interest_of_intlayer.md +1 -1
  88. package/docs/pl/intlayer_CMS.md +5 -5
  89. package/docs/pl/intlayer_with_express.md +1 -0
  90. package/docs/pl/intlayer_with_fastify.md +457 -0
  91. package/docs/pl/readme.md +1 -1
  92. package/docs/pt/cli/push.md +1 -1
  93. package/docs/pt/configuration.md +3 -3
  94. package/docs/pt/interest_of_intlayer.md +1 -1
  95. package/docs/pt/intlayer_CMS.md +5 -5
  96. package/docs/pt/intlayer_with_express.md +1 -0
  97. package/docs/pt/intlayer_with_fastify.md +502 -0
  98. package/docs/pt/readme.md +1 -1
  99. package/docs/ru/cli/push.md +1 -1
  100. package/docs/ru/configuration.md +3 -3
  101. package/docs/ru/interest_of_intlayer.md +1 -1
  102. package/docs/ru/intlayer_CMS.md +5 -5
  103. package/docs/ru/intlayer_with_express.md +1 -0
  104. package/docs/ru/intlayer_with_fastify.md +468 -0
  105. package/docs/ru/readme.md +1 -1
  106. package/docs/tr/cli/push.md +1 -1
  107. package/docs/tr/configuration.md +3 -3
  108. package/docs/tr/interest_of_intlayer.md +1 -1
  109. package/docs/tr/intlayer_CMS.md +5 -5
  110. package/docs/tr/intlayer_with_express.md +1 -0
  111. package/docs/tr/intlayer_with_fastify.md +471 -0
  112. package/docs/tr/readme.md +1 -1
  113. package/docs/vi/cli/push.md +1 -1
  114. package/docs/vi/configuration.md +3 -3
  115. package/docs/vi/interest_of_intlayer.md +1 -1
  116. package/docs/vi/intlayer_CMS.md +5 -5
  117. package/docs/vi/intlayer_with_express.md +1 -0
  118. package/docs/vi/intlayer_with_fastify.md +490 -0
  119. package/docs/vi/readme.md +1 -1
  120. package/docs/zh/cli/push.md +1 -1
  121. package/docs/zh/configuration.md +3 -3
  122. package/docs/zh/interest_of_intlayer.md +1 -1
  123. package/docs/zh/intlayer_CMS.md +5 -5
  124. package/docs/zh/intlayer_with_express.md +1 -0
  125. package/docs/zh/intlayer_with_fastify.md +451 -0
  126. package/docs/zh/readme.md +1 -1
  127. package/package.json +6 -6
  128. package/src/generated/docs.entry.ts +19 -0
@@ -0,0 +1,490 @@
1
+ ---
2
+ createdAt: 2025-12-30
3
+ updatedAt: 2025-12-30
4
+ title: Cách dịch backend Fastify của bạn – Hướng dẫn i18n 2026
5
+ description: Tìm hiểu cách làm cho backend Fastify của bạn hỗ trợ đa ngôn ngữ. Thực hiện theo tài liệu để internationalize (i18n) và dịch nội dung.
6
+ keywords:
7
+ - Quốc tế hóa (i18n)
8
+ - Tài liệu
9
+ - Intlayer
10
+ - Fastify
11
+ - JavaScript
12
+ - Backend
13
+ slugs:
14
+ - doc
15
+ - environment
16
+ - fastify
17
+ applicationTemplate: https://github.com/aymericzip/intlayer-fastify-template
18
+ history:
19
+ - version: 7.6.0
20
+ date: 2025-12-31
21
+ changes: Thêm lệnh init
22
+ - version: 7.6.0
23
+ date: 2025-12-31
24
+ changes: Khởi tạo lịch sử
25
+ ---
26
+
27
+ # Dịch backend Fastify của bạn bằng Intlayer | Quốc tế hóa (i18n)
28
+
29
+ `fastify-intlayer` là một plugin quốc tế hóa (i18n) mạnh mẽ cho các ứng dụng Fastify, được thiết kế để làm cho dịch vụ backend của bạn có thể truy cập trên toàn cầu bằng cách cung cấp phản hồi được địa phương hóa dựa trên sở thích của client.
30
+
31
+ ### Các trường hợp sử dụng thực tế
32
+
33
+ - **Hiển thị lỗi Backend bằng ngôn ngữ của người dùng**: Khi xảy ra lỗi, hiển thị thông điệp bằng ngôn ngữ mẹ đẻ của người dùng sẽ cải thiện khả năng hiểu và giảm sự bực bội. Điều này đặc biệt hữu ích cho các thông báo lỗi động có thể được hiển thị trong các thành phần front-end như toast hoặc modal.
34
+
35
+ `fastify-intlayer` là một plugin quốc tế hóa (i18n) mạnh mẽ cho các ứng dụng Fastify, được thiết kế để giúp các dịch vụ backend của bạn có thể truy cập toàn cầu bằng cách cung cấp các phản hồi địa phương hóa dựa trên sở thích của khách hàng.
36
+
37
+ ### Trường hợp sử dụng thực tế
38
+
39
+ - **Hiển thị lỗi backend bằng ngôn ngữ của người dùng**: Khi xảy ra lỗi, hiển thị thông điệp bằng ngôn ngữ mẹ đẻ của người dùng giúp họ hiểu tốt hơn và giảm bực bội. Điều này đặc biệt hữu ích cho các thông báo lỗi động có thể được hiển thị trong các thành phần front-end như toasts hoặc modals.
40
+ - **Truy xuất nội dung đa ngôn ngữ**: Đối với các ứng dụng lấy nội dung từ cơ sở dữ liệu, quốc tế hóa đảm bảo rằng bạn có thể phục vụ nội dung này bằng nhiều ngôn ngữ. Điều này rất quan trọng cho các nền tảng như trang thương mại điện tử (e-commerce) hoặc hệ thống quản lý nội dung (CMS) cần hiển thị mô tả sản phẩm, bài viết và các nội dung khác theo ngôn ngữ mà người dùng ưu tiên.
41
+ - **Gửi email đa ngôn ngữ**: Dù là email giao dịch, chiến dịch marketing hay thông báo, gửi email bằng ngôn ngữ của người nhận có thể tăng đáng kể mức độ tương tác và hiệu quả.
42
+ - **Thông báo đẩy đa ngôn ngữ**: Đối với ứng dụng di động, gửi thông báo đẩy bằng ngôn ngữ ưa thích của người dùng có thể tăng tương tác và giữ chân người dùng. Sự chăm chút cá nhân này khiến thông báo trở nên phù hợp và dễ hành động hơn.
43
+ - **Các hình thức liên lạc khác**: Bất kỳ hình thức liên lạc nào từ backend, như tin nhắn SMS, cảnh báo hệ thống hoặc cập nhật giao diện người dùng, đều hưởng lợi khi được gửi bằng ngôn ngữ của người dùng, đảm bảo sự rõ ràng và nâng cao trải nghiệm tổng thể.
44
+
45
+ Bằng cách quốc tế hóa backend, ứng dụng của bạn không chỉ tôn trọng khác biệt văn hóa mà còn phù hợp hơn với nhu cầu thị trường toàn cầu, trở thành bước then chốt để mở rộng dịch vụ ra toàn thế giới.
46
+
47
+ ## Bắt đầu
48
+
49
+ ### Cài đặt
50
+
51
+ Để bắt đầu sử dụng `fastify-intlayer`, cài gói bằng npm:
52
+
53
+ ```bash packageManager="npm"
54
+ npm install intlayer fastify-intlayer
55
+ npx intlayer init
56
+
57
+ ```
58
+
59
+ ```bash packageManager="pnpm"
60
+ pnpm add intlayer fastify-intlayer
61
+ pnpm intlayer init
62
+
63
+ ```
64
+
65
+ ```bash packageManager="yarn"
66
+ yarn add intlayer fastify-intlayer
67
+ yarn intlayer init
68
+
69
+ ```
70
+
71
+ ```bash packageManager="bun"
72
+ bun add intlayer fastify-intlayer
73
+ bunx intlayer init
74
+
75
+ ```
76
+
77
+ ### Thiết lập
78
+
79
+ Cấu hình các thiết lập quốc tế hóa bằng cách tạo một tệp `intlayer.config.ts` ở thư mục gốc của dự án:
80
+
81
+ ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
82
+ import { Locales, type IntlayerConfig } from "intlayer";
83
+
84
+ const config: IntlayerConfig = {
85
+ internationalization: {
86
+ locales: [
87
+ Locales.ENGLISH,
88
+ Locales.FRENCH,
89
+ Locales.SPANISH_MEXICO,
90
+ Locales.SPANISH_SPAIN,
91
+ ],
92
+ defaultLocale: Locales.ENGLISH,
93
+ },
94
+ };
95
+
96
+ export default config;
97
+ ```
98
+
99
+ ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
100
+ import { Locales } from "intlayer";
101
+
102
+ /** @type {import('intlayer').IntlayerConfig} */
103
+ const config = {
104
+ internationalization: {
105
+ locales: [
106
+ Locales.ENGLISH,
107
+ Locales.FRENCH,
108
+ Locales.SPANISH_MEXICO,
109
+ Locales.SPANISH_SPAIN,
110
+ ],
111
+ defaultLocale: Locales.ENGLISH,
112
+ },
113
+ };
114
+
115
+ export default config;
116
+ ```
117
+
118
+ ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
119
+ const { Locales } = require("intlayer");
120
+
121
+ /** @type {import('intlayer').IntlayerConfig} */
122
+ const config = {
123
+ internationalization: {
124
+ locales: [
125
+ Locales.ENGLISH,
126
+ Locales.FRENCH,
127
+ Locales.SPANISH_MEXICO,
128
+ Locales.SPANISH_SPAIN,
129
+ ],
130
+ defaultLocale: Locales.ENGLISH,
131
+ },
132
+ };
133
+
134
+ module.exports = config;
135
+ ```
136
+
137
+ ### Khai báo Nội dung của bạn
138
+
139
+ Tạo và quản lý các khai báo nội dung của bạn để lưu trữ bản dịch:
140
+
141
+ ```typescript fileName="src/index.content.ts" contentDeclarationFormat="typescript"
142
+ import { t, type Dictionary } from "intlayer";
143
+
144
+ const indexContent = {
145
+ key: "index",
146
+ content: {
147
+ exampleOfContent: t({
148
+ vi: "Ví dụ về nội dung trả về bằng tiếng Việt",
149
+ en: "Example of returned content in English",
150
+ fr: "Exemple de contenu renvoyé en français",
151
+ "es-ES": "Ejemplo de contenido devuelto en español (España)",
152
+ "es-MX": "Ejemplo de contenido devuelto en español (México)",
153
+ }),
154
+ },
155
+ } satisfies Dictionary;
156
+
157
+ export default indexContent;
158
+ ```
159
+
160
+ ```javascript fileName="src/index.content.mjs" contentDeclarationFormat="esm"
161
+ import { t } from "intlayer";
162
+
163
+ /** Danh sách từ điển. @type {import('intlayer').Dictionary} */
164
+ const indexContent = {
165
+ key: "index",
166
+ content: {
167
+ exampleOfContent: t({
168
+ vi: "Ví dụ về nội dung trả về bằng tiếng Anh",
169
+ en: "Example of returned content in English",
170
+ fr: "Exemple de contenu renvoyé en français",
171
+ "es-ES": "Ejemplo de contenido devuelto en español (España)",
172
+ "es-MX": "Ejemplo de contenido devuelto en español (México)",
173
+ }),
174
+ },
175
+ };
176
+
177
+ export default indexContent;
178
+ ```
179
+
180
+ ```javascript fileName="src/index.content.cjs" contentDeclarationFormat="commonjs"
181
+ const { t } = require("intlayer");
182
+
183
+ /** Danh sách từ điển. @type {import('intlayer').Dictionary} */
184
+ const indexContent = {
185
+ key: "index",
186
+ content: {
187
+ exampleOfContent: t({
188
+ vi: "Ví dụ về nội dung trả về bằng tiếng Anh",
189
+ en: "Example of returned content in English",
190
+ fr: "Exemple de contenu renvoyé en français",
191
+ "es-ES": "Ejemplo de contenido devuelto en español (España)",
192
+ "es-MX": "Ejemplo de contenido devuelto en español (México)",
193
+ }),
194
+ },
195
+ };
196
+
197
+ module.exports = indexContent;
198
+ vi: "Ví dụ về nội dung được trả về bằng tiếng Việt",
199
+ en: "Example of returned content in English",
200
+ fr: "Exemple de contenu renvoyé en français",
201
+ "es-ES": "Ejemplo de contenido devuelto en español (España)",
202
+ "es-MX": "Ejemplo de contenido devuelto en español (México)",
203
+ }),
204
+ },
205
+ };
206
+
207
+ module.exports = indexContent;
208
+ ```
209
+
210
+ ```json fileName="src/index.content.json" contentDeclarationFormat="json"
211
+ {
212
+ "$schema": "https://intlayer.org/schema.json",
213
+ "key": "index",
214
+ "content": {
215
+ "exampleOfContent": {
216
+ "nodeType": "translation",
217
+ "translation": {
218
+ "vi": "Ví dụ về nội dung được trả về bằng tiếng Việt",
219
+ "en": "Example of returned content in English",
220
+ "fr": "Exemple de contenu renvoyé en français",
221
+ "es-ES": "Ejemplo de contenido devuelto en español (España)",
222
+ "es-MX": "Ejemplo de contenido devuelto en español (México)"
223
+ }
224
+ }
225
+ }
226
+ }
227
+ ```
228
+
229
+ > Các khai báo nội dung của bạn có thể được định nghĩa ở bất kỳ đâu trong ứng dụng miễn là chúng được đưa vào thư mục `contentDir` (mặc định là `./src`). Và khớp với phần mở rộng tệp khai báo nội dung (mặc định là `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
230
+
231
+ > Để biết thêm chi tiết, tham khảo [tài liệu khai báo nội dung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md).
232
+
233
+ ### Thiết lập Ứng dụng Fastify
234
+
235
+ Thiết lập ứng dụng Fastify của bạn để sử dụng `fastify-intlayer`:
236
+
237
+ ```typescript fileName="src/index.ts" codeFormat="typescript"
238
+ import Fastify from "fastify";
239
+ import { intlayer, t, getDictionary, getIntlayer } from "fastify-intlayer";
240
+ import dictionaryExample from "./index.content";
241
+
242
+ const fastify = Fastify({ logger: true });
243
+
244
+ // Tải plugin quốc tế hóa
245
+ await fastify.register(intlayer);
246
+
247
+ // Định tuyến
248
+ fastify.get("/t_example", async (_req, reply) => {
249
+ return t({
250
+ vi: "Ví dụ nội dung trả về bằng tiếng Việt",
251
+ en: "Example of returned content in English",
252
+ fr: "Exemple de contenu renvoyé en français",
253
+ "es-ES": "Ejemplo de contenido devuelto en español (España)",
254
+ "es-MX": "Ejemplo de contenido devuelto en español (México)",
255
+ });
256
+ });
257
+
258
+ fastify.get("/getIntlayer_example", async (_req, reply) => {
259
+ return getIntlayer("index").exampleOfContent;
260
+ });
261
+
262
+ fastify.get("/getDictionary_example", async (_req, reply) => {
263
+ return getDictionary(dictionaryExample).exampleOfContent;
264
+ });
265
+
266
+ // Khởi động server
267
+ const start = async () => {
268
+ try {
269
+ await fastify.listen({ port: 3000 });
270
+ } catch (err) {
271
+ fastify.log.error(err);
272
+ process.exit(1);
273
+ }
274
+ };
275
+
276
+ start();
277
+ ```
278
+
279
+ ```javascript fileName="src/index.mjs" codeFormat="esm"
280
+ import Fastify from "fastify";
281
+ import { intlayer, t, getDictionary, getIntlayer } from "fastify-intlayer";
282
+ import dictionaryExample from "./index.content";
283
+
284
+ const fastify = Fastify({ logger: true });
285
+
286
+ // Đăng ký plugin quốc tế hóa
287
+ await fastify.register(intlayer);
288
+
289
+ // Các route
290
+ fastify.get("/t_example", async (_req, reply) => {
291
+ return t({
292
+ vi: "Ví dụ nội dung trả về bằng tiếng Việt",
293
+ en: "Example of returned content in English",
294
+ fr: "Exemple de contenu renvoyé en français",
295
+ "es-ES": "Ejemplo de contenido devuelto en español (España)",
296
+ "es-MX": "Ejemplo de contenido devuelto en español (México)",
297
+ });
298
+ });
299
+
300
+ fastify.get("/getIntlayer_example", async (_req, reply) => {
301
+ return getIntlayer("index").exampleOfContent;
302
+ });
303
+
304
+ fastify.get("/getDictionary_example", async (_req, reply) => {
305
+ return getDictionary(dictionaryExample).exampleOfContent;
306
+ });
307
+
308
+ // Bắt đầu server
309
+ const start = async () => {
310
+ try {
311
+ await fastify.listen({ port: 3000 });
312
+ } catch (err) {
313
+ fastify.log.error(err);
314
+ process.exit(1);
315
+ }
316
+ };
317
+
318
+ start();
319
+ ```
320
+
321
+ ```javascript fileName="src/index.cjs" codeFormat="commonjs"
322
+ const Fastify = require("fastify");
323
+ const { intlayer, t, getDictionary, getIntlayer } = require("fastify-intlayer");
324
+ const dictionaryExample = require("./index.content");
325
+
326
+ const fastify = Fastify({ logger: true });
327
+
328
+ // Wrapper khởi động server để hỗ trợ async/await
329
+ const start = async () => {
330
+ try {
331
+ // Đăng ký plugin quốc tế hóa
332
+ await fastify.register(intlayer);
333
+
334
+ // Các routes
335
+ fastify.get("/t_example", async (_req, reply) => {
336
+ return t({
337
+ vi: "Ví dụ về nội dung trả về bằng tiếng Việt",
338
+ en: "Example of returned content in English",
339
+ fr: "Exemple de contenu renvoyé en français",
340
+ "es-ES": "Ejemplo de contenido devuelto en español (España)",
341
+ "es-MX": "Ejemplo de contenido devuelto en español (México)",
342
+ });
343
+ });
344
+
345
+ fastify.get("/getIntlayer_example", async (_req, reply) => {
346
+ return getIntlayer("index").exampleOfContent;
347
+ });
348
+
349
+ fastify.get("/getDictionary_example", async (_req, reply) => {
350
+ return getDictionary(dictionaryExample).exampleOfContent;
351
+ });
352
+
353
+ await fastify.listen({ port: 3000 });
354
+ } catch (err) {
355
+ fastify.log.error(err);
356
+ process.exit(1);
357
+ }
358
+ };
359
+
360
+ start();
361
+ fastify.get("/t_example", async (_req, reply) => {
362
+ return t({
363
+ vi: "Ví dụ về nội dung trả về bằng tiếng Việt",
364
+ en: "Example of returned content in English",
365
+ fr: "Exemple de contenu renvoyé en français",
366
+ "es-ES": "Ejemplo de contenido devuelto en español (España)",
367
+ "es-MX": "Ejemplo de contenido devuelto en español (México)",
368
+ });
369
+ });
370
+
371
+ fastify.get("/getIntlayer_example", async (_req, reply) => {
372
+ return getIntlayer("index").exampleOfContent;
373
+ });
374
+
375
+ fastify.get("/getDictionary_example", async (_req, reply) => {
376
+ return getDictionary(dictionaryExample).exampleOfContent;
377
+ });
378
+
379
+ await fastify.listen({ port: 3000 });
380
+ } catch (err) {
381
+ fastify.log.error(err);
382
+ process.exit(1);
383
+ }
384
+ };
385
+
386
+ start();
387
+ ```
388
+
389
+ ### Tương thích
390
+
391
+ `fastify-intlayer` tương thích hoàn toàn với:
392
+
393
+ - [`react-intlayer`](<https://www.google.com/search?q=%5Bhttps://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/react-intlayer/index.md%5D(https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/react-intlayer/index.md)>) cho các ứng dụng React
394
+ - [`next-intlayer`](<https://www.google.com/search?q=%5Bhttps://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/next-intlayer/index.md%5D(https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/next-intlayer/index.md)>) cho các ứng dụng Next.js
395
+
396
+ - [`react-intlayer`](<https://www.google.com/search?q=%5Bhttps://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/react-intlayer/index.md%5D(https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/react-intlayer/index.md)>) cho ứng dụng React
397
+ - [`next-intlayer`](<https://www.google.com/search?q=%5Bhttps://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/next-intlayer/index.md%5D(https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/next-intlayer/index.md)>) cho ứng dụng Next.js
398
+ - [`vite-intlayer`](<https://www.google.com/search?q=%5Bhttps://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/vite-intlayer/index.md%5D(https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/packages/vite-intlayer/index.md)>) cho ứng dụng Vite
399
+
400
+ Nó cũng hoạt động mượt mà với bất kỳ giải pháp quốc tế hóa nào trên nhiều môi trường khác nhau, bao gồm trình duyệt và các yêu cầu API. Bạn có thể tùy chỉnh middleware để phát hiện locale thông qua headers hoặc cookies:
401
+
402
+ ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
403
+ import { Locales, type IntlayerConfig } from "intlayer";
404
+
405
+ const config: IntlayerConfig = {
406
+ // ... Các tùy chọn cấu hình khác
407
+ middleware: {
408
+ headerName: "my-locale-header",
409
+ cookieName: "my-locale-cookie",
410
+ },
411
+ };
412
+
413
+ export default config;
414
+ ```
415
+
416
+ ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
417
+ import { Locales } from "intlayer";
418
+
419
+ /** @type {import('intlayer').IntlayerConfig} */
420
+ const config = {
421
+ // ... Các tuỳ chọn cấu hình khác
422
+ middleware: {
423
+ headerName: "my-locale-header",
424
+ cookieName: "my-locale-cookie",
425
+ },
426
+ };
427
+
428
+ export default config;
429
+ ```
430
+
431
+ ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
432
+ const { Locales } = require("intlayer");
433
+
434
+ /** @type {import('intlayer').IntlayerConfig} */
435
+ const config = {
436
+ // ... Các tuỳ chọn cấu hình khác
437
+ middleware: {
438
+ headerName: "my-locale-header",
439
+ cookieName: "my-locale-cookie",
440
+ },
441
+ };
442
+
443
+ module.exports = config;
444
+ ```
445
+
446
+ Mặc định, `fastify-intlayer` sẽ sử dụng header `Accept-Language` để xác định ngôn ngữ ưu tiên của client.
447
+
448
+ > Để biết thêm thông tin về cấu hình và các chủ đề nâng cao, hãy xem [tài liệu của chúng tôi](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/configuration.md).
449
+
450
+ ### Cấu hình TypeScript
451
+
452
+ `fastify-intlayer` tận dụng khả năng mạnh mẽ của TypeScript để cải thiện quá trình quốc tế hóa. Hệ thống kiểu tĩnh của TypeScript đảm bảo mọi translation key đều được kiểm kê, giảm nguy cơ thiếu bản dịch và cải thiện khả năng bảo trì.
453
+
454
+ Đảm bảo các kiểu được tự động sinh (mặc định tại ./types/intlayer.d.ts) được bao gồm trong file tsconfig.json của bạn.
455
+
456
+ ```json5 fileName="tsconfig.json"
457
+ {
458
+ // ... Cấu hình TypeScript hiện có của bạn
459
+ "include": [
460
+ // ... Cấu hình TypeScript hiện có của bạn
461
+ ".intlayer/**/*.ts", // Bao gồm các kiểu được tự động sinh
462
+ ],
463
+ }
464
+ ```
465
+
466
+ ### Tiện ích mở rộng VS Code
467
+
468
+ Để cải thiện trải nghiệm phát triển với Intlayer, bạn có thể cài đặt **Tiện ích mở rộng Intlayer cho VS Code** chính thức.
469
+
470
+ [Cài đặt từ VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
471
+
472
+ Tiện ích mở rộng này cung cấp:
473
+
474
+ - **Tự động hoàn thành** cho các khóa dịch.
475
+ - **Phát hiện lỗi thời gian thực** cho các bản dịch bị thiếu.
476
+ - **Xem trước trực tiếp** nội dung đã dịch ngay trong trình soạn thảo.
477
+ - **Hành động nhanh** để dễ dàng tạo và cập nhật bản dịch.
478
+
479
+ Để biết thêm chi tiết về cách sử dụng tiện ích mở rộng, tham khảo [tài liệu Tiện ích mở rộng Intlayer cho VS Code](https://intlayer.org/doc/vs-code-extension).
480
+
481
+ ### Cấu hình Git
482
+
483
+ Nên bỏ qua các tệp do Intlayer tạo ra. Điều này giúp bạn tránh commit chúng vào kho Git của mình.
484
+
485
+ Để làm điều này, bạn có thể thêm các hướng dẫn sau vào tệp `.gitignore` của mình:
486
+
487
+ ```plaintext fileName=".gitignore"
488
+ # Bỏ qua các tệp được Intlayer tạo ra
489
+ .intlayer
490
+ ```
package/docs/vi/readme.md CHANGED
@@ -50,7 +50,7 @@ Với **các tệp nội dung theo từng locale**, **tự động hoàn thành
50
50
  | Tính năng | Mô tả |
51
51
  | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
52
52
  | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/frameworks.png?raw=true" alt="Tính năng" width="700"> | **Hỗ trợ đa Framework**<br><br>Intlayer tương thích với tất cả các framework và thư viện lớn, bao gồm Next.js, React, Vite, Vue.js, Nuxt, Preact, Express và nhiều hơn nữa. |
53
- | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.png?raw=true" alt="Tính năng" width="700"> | **Quản lý Nội dung bằng JavaScript**<br><br>Khai thác sự linh hoạt của JavaScript để định nghĩa và quản lý nội dung của bạn một cách hiệu quả. <br><br> - [Khai báo nội dung](https://intlayer.org/doc/concept/content) |
53
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.jpg?raw=true" alt="Tính năng" width="700"> | **Quản lý Nội dung bằng JavaScript**<br><br>Khai thác sự linh hoạt của JavaScript để định nghĩa và quản lý nội dung của bạn một cách hiệu quả. <br><br> - [Khai báo nội dung](https://intlayer.org/doc/concept/content) |
54
54
  | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/per_locale_content_declaration_file.png?raw=true" alt="Tính năng" width="700"> | **Tệp Khai Báo Nội Dung Theo Mỗi Locale**<br><br>Tăng tốc phát triển của bạn bằng cách khai báo nội dung một lần, trước khi tự động sinh.<br><br> - [Tệp Khai Báo Nội Dung Theo Mỗi Locale](https://intlayer.org/doc/concept/per-locale-file) |
55
55
  | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true" alt="Tính năng" width="700"> | **Môi Trường An Toàn Kiểu**<br><br>Tận dụng TypeScript để đảm bảo định nghĩa nội dung và mã của bạn không có lỗi, đồng thời hưởng lợi từ tính năng tự động hoàn thành trong IDE.<br><br> - [Cấu hình TypeScript](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
56
56
  | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/config_file.png?raw=true" alt="Tính năng" width="700"> | **Cài Đặt Đơn Giản Hóa**<br><br>Bắt đầu nhanh chóng với cấu hình tối thiểu. Dễ dàng điều chỉnh các thiết lập cho quốc tế hóa, định tuyến, AI, build và xử lý nội dung.<br><br> - [Khám phá tích hợp Next.js](https://intlayer.org/doc/environment/nextjs) |
@@ -23,7 +23,7 @@ slugs:
23
23
  npx intlayer dictionary push
24
24
  ```
25
25
 
26
- 如果已安装 [intlayer 编辑器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_visual_editor.md),您也可以将词典推送到编辑器。此命令将使词典可用于[编辑器](https://intlayer.org/dashboard)。通过这种方式,您可以与团队共享词典,并在不修改应用代码的情况下编辑内容。
26
+ 如果已安装 [intlayer 编辑器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_visual_editor.md),您也可以将词典推送到编辑器。此命令将使词典可用于[编辑器](https://app.intlayer.org/)。通过这种方式,您可以与团队共享词典,并在不修改应用代码的情况下编辑内容。
27
27
 
28
28
  ## 别名:
29
29
 
@@ -246,14 +246,14 @@ module.exports = config;
246
246
  - **clientId**:
247
247
  - _类型_:`string` | `undefined`
248
248
  - _默认值_:`undefined`
249
- - _描述_: clientId 和 clientSecret 允许 intlayer 包使用 oAuth2 认证与后端进行身份验证。访问令牌用于验证与项目相关的用户。要获取访问令牌,请访问 https://intlayer.org/dashboard/project 并创建一个账户。
249
+ - _描述_: clientId 和 clientSecret 允许 intlayer 包使用 oAuth2 认证与后端进行身份验证。访问令牌用于验证与项目相关的用户。要获取访问令牌,请访问 https://app.intlayer.org/project 并创建一个账户。
250
250
  - _示例_: `true`
251
251
  - _注意_: 重要提示:clientId 和 clientSecret 应保持机密,不得公开共享。请确保将它们保存在安全的位置,例如环境变量中。
252
252
 
253
253
  - **clientSecret**:
254
254
  - _类型_: `string` | `undefined`
255
255
  - _默认值_: `undefined`
256
- - _描述_: clientId 和 clientSecret 允许 intlayer 包使用 oAuth2 认证与后端进行身份验证。访问令牌用于验证与项目相关的用户。要获取访问令牌,请访问 https://intlayer.org/dashboard/project 并创建一个账户。
256
+ - _描述_: clientId 和 clientSecret 允许 intlayer 包使用 oAuth2 认证与后端进行身份验证。访问令牌用于验证与项目相关的用户。要获取访问令牌,请访问 https://app.intlayer.org/project 并创建一个账户。
257
257
  - _示例_: `true`
258
258
  - _注意_: 重要提示:clientId 和 clientSecret 应保持机密,不得公开共享。请确保将它们保存在安全的位置,例如环境变量中。
259
259
 
@@ -469,7 +469,7 @@ module.exports = config;
469
469
 
470
470
  控制 Intlayer AI 功能的设置,包括提供商、模型和 API 密钥。
471
471
 
472
- 如果您已使用访问密钥在[Intlayer 控制面板](https://intlayer.org/dashboard/project)注册,则此配置是可选的。Intlayer 会自动管理最有效且具有成本效益的 AI 解决方案以满足您的需求。使用默认选项可确保更好的长期可维护性,因为 Intlayer 会持续更新以使用最相关的模型。
472
+ 如果您已使用访问密钥在[Intlayer 控制面板](https://app.intlayer.org/project)注册,则此配置是可选的。Intlayer 会自动管理最有效且具有成本效益的 AI 解决方案以满足您的需求。使用默认选项可确保更好的长期可维护性,因为 Intlayer 会持续更新以使用最相关的模型。
473
473
 
474
474
  如果您希望使用自己的 API 密钥或特定模型,可以定义自定义的 AI 配置。
475
475
  此 AI 配置将在整个 Intlayer 环境中全局使用。CLI 命令将使用这些设置作为命令的默认值(例如 `fill`),同时 SDK、可视化编辑器和 CMS 也会使用这些默认值。您可以通过命令参数覆盖这些默认值以满足特定用例。
@@ -226,7 +226,7 @@ const ComponentExample = () => {
226
226
  | 功能 | 描述 |
227
227
  | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
228
228
  | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/frameworks.png?raw=true) | **跨框架支持**<br><br>Intlayer 兼容所有主流框架和库,包括 Next.js、React、Vite、Vue.js、Nuxt、Preact、Express 等。 |
229
- | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.png?raw=true) | **基于JavaScript的内容管理**<br><br>利用JavaScript的灵活性,高效地定义和管理您的内容。<br><br> - [内容声明](https://intlayer.org/doc/concept/content) |
229
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.jpg?raw=true) | **基于JavaScript的内容管理**<br><br>利用JavaScript的灵活性,高效地定义和管理您的内容。<br><br> - [内容声明](https://intlayer.org/doc/concept/content) |
230
230
  | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/per_locale_content_declaration_file.png?raw=true) | **每语言内容声明文件**<br><br>通过在自动生成之前只声明一次内容,加快您的开发速度。<br><br> - [每语言内容声明文件](https://intlayer.org/doc/concept/per-locale-file) |
231
231
  | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true) | **类型安全环境**<br><br>利用 TypeScript 确保您的内容定义和代码无错误,同时享受 IDE 自动补全的便利。<br><br> - [TypeScript 配置](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
232
232
  | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/config_file.png?raw=true) | **简化设置**<br><br>通过最少的配置快速启动运行。轻松调整国际化、路由、AI、构建和内容处理的设置。<br><br> - [探索 Next.js 集成](https://intlayer.org/doc/environment/nextjs) |
@@ -92,7 +92,7 @@ const config: IntlayerConfig = {
92
92
  *
93
93
  * 启用编辑器需要客户端 ID 和客户端密钥。
94
94
  * 它们用于识别正在编辑内容的用户。
95
- * 可以通过在 Intlayer 控制面板 - 项目 (https://intlayer.org/dashboard/projects) 中创建新客户端来获取。
95
+ * 可以通过在 Intlayer 控制面板 - 项目 (https://app.intlayer.org/projects) 中创建新客户端来获取。
96
96
  * clientId: process.env.INTLAYER_CLIENT_ID,
97
97
  * clientSecret: process.env.INTLAYER_CLIENT_SECRET,
98
98
  */
@@ -142,7 +142,7 @@ const config = {
142
142
  *
143
143
  * 启用编辑器需要客户端 ID 和客户端密钥。
144
144
  * 它们用于识别正在编辑内容的用户。
145
- * 可以通过在 Intlayer 仪表板 - 项目 (https://intlayer.org/dashboard/projects) 中创建新客户端来获取。
145
+ * 可以通过在 Intlayer 仪表板 - 项目 (https://app.intlayer.org/projects) 中创建新客户端来获取。
146
146
  * clientId: process.env.INTLAYER_CLIENT_ID,
147
147
  * clientSecret: process.env.INTLAYER_CLIENT_SECRET,
148
148
  */
@@ -192,7 +192,7 @@ const config = {
192
192
  *
193
193
  * 启用编辑器需要客户端ID和客户端密钥。
194
194
  * 它们用于识别正在编辑内容的用户。
195
- * 可以通过在 Intlayer 控制面板 - 项目 (https://intlayer.org/dashboard/projects) 中创建新客户端来获取。
195
+ * 可以通过在 Intlayer 控制面板 - 项目 (https://app.intlayer.org/projects) 中创建新客户端来获取。
196
196
  * clientId: process.env.INTLAYER_CLIENT_ID,
197
197
  * clientSecret: process.env.INTLAYER_CLIENT_SECRET,
198
198
  */
@@ -224,7 +224,7 @@ const config = {
224
224
  module.exports = config;
225
225
  ```
226
226
 
227
- > 如果您没有客户端 ID 和客户端密钥,可以通过在[Intlayer 控制面板 - 项目](https://intlayer.org/dashboard/projects)中创建新客户端来获取。
227
+ > 如果您没有客户端 ID 和客户端密钥,可以通过在[Intlayer 控制面板 - 项目](https://app.intlayer.org/projects)中创建新客户端来获取。
228
228
 
229
229
  > 要查看所有可用参数,请参考[配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)。
230
230
 
@@ -264,7 +264,7 @@ npx intlayer dictionary push -d my-first-dictionary-key --env production
264
264
 
265
265
  ### 编辑字典
266
266
 
267
- 然后,您将能够在 [Intlayer CMS](https://intlayer.org/dashboard/content) 中查看和管理您的字典。
267
+ 然后,您将能够在 [Intlayer CMS](https://app.intlayer.org/content) 中查看和管理您的字典。
268
268
 
269
269
  ## 实时同步
270
270
 
@@ -14,6 +14,7 @@ slugs:
14
14
  - doc
15
15
  - environment
16
16
  - express
17
+ applicationTemplate: https://github.com/aymericzip/intlayer-express-template
17
18
  history:
18
19
  - version: 7.5.9
19
20
  date: 2025-12-30