@intlayer/docs 7.0.4 → 7.0.6

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 (145) hide show
  1. package/blog/ar/intlayer_with_i18next.md +72 -19
  2. package/blog/ar/intlayer_with_next-i18next.md +61 -36
  3. package/blog/ar/intlayer_with_next-intl.md +61 -13
  4. package/blog/ar/intlayer_with_react-i18next.md +67 -18
  5. package/blog/ar/intlayer_with_react-intl.md +66 -13
  6. package/blog/ar/intlayer_with_vue-i18n.md +180 -0
  7. package/blog/de/intlayer_with_i18next.md +61 -26
  8. package/blog/de/intlayer_with_next-i18next.md +66 -17
  9. package/blog/de/intlayer_with_next-intl.md +62 -13
  10. package/blog/de/intlayer_with_react-i18next.md +66 -17
  11. package/blog/de/intlayer_with_react-intl.md +66 -14
  12. package/blog/de/intlayer_with_vue-i18n.md +178 -0
  13. package/blog/en/intlayer_with_i18next.md +53 -2
  14. package/blog/en/intlayer_with_next-i18next.md +52 -16
  15. package/blog/en/intlayer_with_next-intl.md +49 -0
  16. package/blog/en/intlayer_with_react-i18next.md +50 -1
  17. package/blog/en/intlayer_with_react-intl.md +53 -0
  18. package/blog/en/intlayer_with_vue-i18n.md +178 -0
  19. package/blog/en-GB/intlayer_with_i18next.md +58 -7
  20. package/blog/en-GB/intlayer_with_next-i18next.md +55 -9
  21. package/blog/en-GB/intlayer_with_next-intl.md +55 -6
  22. package/blog/en-GB/intlayer_with_react-i18next.md +55 -6
  23. package/blog/en-GB/intlayer_with_react-intl.md +56 -3
  24. package/blog/en-GB/intlayer_with_vue-i18n.md +180 -0
  25. package/blog/es/intlayer_with_i18next.md +69 -18
  26. package/blog/es/intlayer_with_next-i18next.md +70 -24
  27. package/blog/es/intlayer_with_next-intl.md +64 -13
  28. package/blog/es/intlayer_with_react-i18next.md +61 -12
  29. package/blog/es/intlayer_with_react-intl.md +65 -12
  30. package/blog/es/intlayer_with_vue-i18n.md +178 -0
  31. package/blog/fr/intlayer_with_i18next.md +77 -16
  32. package/blog/fr/intlayer_with_next-i18next.md +55 -31
  33. package/blog/fr/intlayer_with_next-intl.md +57 -7
  34. package/blog/fr/intlayer_with_react-i18next.md +64 -7
  35. package/blog/fr/intlayer_with_react-intl.md +63 -10
  36. package/blog/fr/intlayer_with_vue-i18n.md +178 -0
  37. package/blog/hi/intlayer_with_i18next.md +67 -16
  38. package/blog/hi/intlayer_with_next-i18next.md +69 -23
  39. package/blog/hi/intlayer_with_next-intl.md +61 -8
  40. package/blog/hi/intlayer_with_react-i18next.md +63 -14
  41. package/blog/hi/intlayer_with_react-intl.md +66 -13
  42. package/blog/hi/intlayer_with_vue-i18n.md +180 -0
  43. package/blog/id/intlayer_with_i18next.md +65 -14
  44. package/blog/id/intlayer_with_next-i18next.md +58 -12
  45. package/blog/id/intlayer_with_next-intl.md +60 -11
  46. package/blog/id/intlayer_with_react-i18next.md +59 -10
  47. package/blog/id/intlayer_with_react-intl.md +66 -13
  48. package/blog/id/intlayer_with_vue-i18n.md +178 -0
  49. package/blog/it/intlayer_with_i18next.md +70 -19
  50. package/blog/it/intlayer_with_next-i18next.md +68 -22
  51. package/blog/it/intlayer_with_next-intl.md +62 -12
  52. package/blog/it/intlayer_with_react-i18next.md +65 -16
  53. package/blog/it/intlayer_with_react-intl.md +67 -14
  54. package/blog/it/intlayer_with_vue-i18n.md +178 -0
  55. package/blog/ja/intlayer_with_i18next.md +74 -24
  56. package/blog/ja/intlayer_with_next-i18next.md +60 -37
  57. package/blog/ja/intlayer_with_next-intl.md +63 -15
  58. package/blog/ja/intlayer_with_react-i18next.md +70 -21
  59. package/blog/ja/intlayer_with_react-intl.md +73 -21
  60. package/blog/ja/intlayer_with_vue-i18n.md +180 -0
  61. package/blog/ko/intlayer_with_i18next.md +60 -29
  62. package/blog/ko/intlayer_with_next-i18next.md +59 -32
  63. package/blog/ko/intlayer_with_next-intl.md +52 -23
  64. package/blog/ko/intlayer_with_react-i18next.md +65 -16
  65. package/blog/ko/intlayer_with_react-intl.md +74 -22
  66. package/blog/ko/intlayer_with_vue-i18n.md +180 -0
  67. package/blog/pl/intlayer_with_i18next.md +63 -12
  68. package/blog/pl/intlayer_with_next-i18next.md +74 -17
  69. package/blog/pl/intlayer_with_next-intl.md +59 -8
  70. package/blog/pl/intlayer_with_react-i18next.md +59 -10
  71. package/blog/pl/intlayer_with_react-intl.md +65 -12
  72. package/blog/pl/intlayer_with_vue-i18n.md +180 -0
  73. package/blog/pt/intlayer_with_i18next.md +67 -16
  74. package/blog/pt/intlayer_with_next-i18next.md +65 -19
  75. package/blog/pt/intlayer_with_next-intl.md +62 -12
  76. package/blog/pt/intlayer_with_react-i18next.md +67 -18
  77. package/blog/pt/intlayer_with_react-intl.md +62 -10
  78. package/blog/pt/intlayer_with_vue-i18n.md +178 -0
  79. package/blog/ru/intlayer_with_i18next.md +68 -15
  80. package/blog/ru/intlayer_with_next-i18next.md +71 -25
  81. package/blog/ru/intlayer_with_next-intl.md +56 -7
  82. package/blog/ru/intlayer_with_react-i18next.md +65 -16
  83. package/blog/ru/intlayer_with_react-intl.md +69 -16
  84. package/blog/ru/intlayer_with_vue-i18n.md +180 -0
  85. package/blog/tr/intlayer_with_i18next.md +67 -16
  86. package/blog/tr/intlayer_with_next-i18next.md +78 -21
  87. package/blog/tr/intlayer_with_next-intl.md +69 -18
  88. package/blog/tr/intlayer_with_react-i18next.md +65 -16
  89. package/blog/tr/intlayer_with_react-intl.md +71 -19
  90. package/blog/tr/intlayer_with_vue-i18n.md +180 -0
  91. package/blog/vi/intlayer_with_i18next.md +64 -13
  92. package/blog/vi/intlayer_with_next-i18next.md +72 -26
  93. package/blog/vi/intlayer_with_next-intl.md +62 -11
  94. package/blog/vi/intlayer_with_react-i18next.md +66 -17
  95. package/blog/vi/intlayer_with_react-intl.md +70 -17
  96. package/blog/vi/intlayer_with_vue-i18n.md +180 -0
  97. package/blog/zh/intlayer_with_i18next.md +67 -17
  98. package/blog/zh/intlayer_with_next-i18next.md +67 -22
  99. package/blog/zh/intlayer_with_next-intl.md +61 -13
  100. package/blog/zh/intlayer_with_react-i18next.md +67 -18
  101. package/blog/zh/intlayer_with_react-intl.md +69 -17
  102. package/blog/zh/intlayer_with_vue-i18n.md +180 -0
  103. package/dist/cjs/generated/blog.entry.cjs +19 -0
  104. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  105. package/dist/esm/generated/blog.entry.mjs +19 -0
  106. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  107. package/dist/types/generated/blog.entry.d.ts +1 -0
  108. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  109. package/docs/ar/intlayer_with_nextjs_15.md +36 -9
  110. package/docs/ar/intlayer_with_nextjs_16.md +36 -9
  111. package/docs/de/intlayer_with_nextjs_15.md +36 -9
  112. package/docs/de/intlayer_with_nextjs_16.md +24 -6
  113. package/docs/en/intlayer_with_nextjs_14.md +37 -9
  114. package/docs/en/intlayer_with_nextjs_15.md +40 -10
  115. package/docs/en/intlayer_with_nextjs_16.md +40 -10
  116. package/docs/en/plugins/sync-json.md +152 -55
  117. package/docs/en/releases/v7.md +1 -1
  118. package/docs/en-GB/intlayer_with_nextjs_15.md +36 -9
  119. package/docs/en-GB/intlayer_with_nextjs_16.md +36 -9
  120. package/docs/en-GB/releases/v7.md +1 -1
  121. package/docs/es/intlayer_with_nextjs_15.md +36 -9
  122. package/docs/es/intlayer_with_nextjs_16.md +36 -9
  123. package/docs/fr/intlayer_with_nextjs_15.md +36 -9
  124. package/docs/fr/intlayer_with_nextjs_16.md +37 -24
  125. package/docs/hi/intlayer_with_nextjs_15.md +36 -9
  126. package/docs/hi/intlayer_with_nextjs_16.md +36 -9
  127. package/docs/id/intlayer_with_nextjs_16.md +36 -9
  128. package/docs/it/intlayer_with_nextjs_15.md +36 -9
  129. package/docs/it/intlayer_with_nextjs_16.md +36 -9
  130. package/docs/ja/intlayer_with_nextjs_15.md +36 -9
  131. package/docs/ja/intlayer_with_nextjs_16.md +36 -9
  132. package/docs/ko/intlayer_with_nextjs_15.md +36 -9
  133. package/docs/ko/intlayer_with_nextjs_16.md +36 -9
  134. package/docs/pl/intlayer_with_nextjs_16.md +36 -9
  135. package/docs/pt/intlayer_with_nextjs_15.md +36 -9
  136. package/docs/pt/intlayer_with_nextjs_16.md +36 -9
  137. package/docs/ru/intlayer_with_nextjs_15.md +36 -9
  138. package/docs/ru/intlayer_with_nextjs_16.md +36 -9
  139. package/docs/tr/intlayer_with_nextjs_15.md +36 -9
  140. package/docs/tr/intlayer_with_nextjs_16.md +39 -21
  141. package/docs/vi/intlayer_with_nextjs_16.md +36 -9
  142. package/docs/zh/intlayer_with_nextjs_15.md +36 -9
  143. package/docs/zh/intlayer_with_nextjs_16.md +36 -9
  144. package/package.json +14 -14
  145. package/src/generated/blog.entry.ts +19 -0
@@ -16,9 +16,12 @@ slugs:
16
16
  - blog
17
17
  - intlayer-with-next-i18next
18
18
  history:
19
+ - version: 7.0.6
20
+ date: 2025-11-01
21
+ changes: Thêm plugin loadJSON
19
22
  - version: 7.0.0
20
23
  date: 2025-10-29
21
- changes: Thay đổi sang plugin syncJSON và viết lại toàn diện
24
+ changes: Chuyển sang plugin syncJSON và viết lại toàn diện
22
25
  ---
23
26
 
24
27
  # Quốc tế hóa Next.js (i18n) với next-i18next và Intlayer
@@ -33,26 +36,26 @@ history:
33
36
 
34
37
  Tuy nhiên, next-i18next cũng gặp phải một số thách thức:
35
38
 
36
- - **Cấu hình phức tạp**: Việc thiết lập next-i18next đòi hỏi nhiều tệp cấu hình và phải cẩn thận trong việc thiết lập các phiên bản i18n phía máy chủ và phía khách.
37
- - **Bản dịch phân tán**: Các tệp bản dịch thường được lưu trữ trong các thư mục riêng biệt so với các thành phần, khiến việc duy trì sự nhất quán trở nên khó khăn hơn.
39
+ - **Cấu hình phức tạp**: Việc thiết lập next-i18next yêu cầu nhiều tệp cấu hình và phải cẩn thận trong việc thiết lập các phiên bản i18n phía server và phía client.
40
+ - **Bản dịch phân tán**: Các tệp bản dịch thường được lưu trữ trong các thư mục riêng biệt so với các thành phần, khiến việc duy trì tính nhất quán trở nên khó khăn hơn.
38
41
  - **Quản lý namespace thủ công**: Các nhà phát triển cần phải quản lý namespace một cách thủ công và đảm bảo tải đúng các tài nguyên bản dịch.
39
42
  - **An toàn kiểu hạn chế**: Hỗ trợ TypeScript yêu cầu cấu hình bổ sung và không cung cấp tự động tạo kiểu cho các bản dịch.
40
43
 
41
44
  ## Intlayer là gì?
42
45
 
43
- **Intlayer** là một thư viện quốc tế hóa mã nguồn mở sáng tạo, được thiết kế để khắc phục những hạn chế của các giải pháp i18n truyền thống. Nó cung cấp một cách tiếp cận hiện đại cho quản lý nội dung trong các ứng dụng Next.js.
46
+ **Intlayer** là một thư viện quốc tế hóa (i18n) mã nguồn mở sáng tạo, được thiết kế để khắc phục những hạn chế của các giải pháp i18n truyền thống. Nó cung cấp một cách tiếp cận hiện đại cho quản lý nội dung trong các ứng dụng Next.js.
44
47
 
45
- Xem so sánh cụ thể với next-intl trong bài viết blog của chúng tôi [next-i18next vs. next-intl vs. Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md).
48
+ Xem so sánh cụ thể với next-intl trong bài viết blog của chúng tôi [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).
46
49
 
47
50
  ## Tại sao kết hợp Intlayer với next-i18next?
48
51
 
49
52
  Trong khi Intlayer cung cấp một giải pháp i18n độc lập xuất sắc (xem hướng dẫn tích hợp Next.js của chúng tôi [Next.js integration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_with_nextjs_16.md)), bạn có thể muốn kết hợp nó với next-i18next vì một số lý do sau:
50
53
 
51
54
  1. **Mã nguồn hiện có**: Bạn đã có một triển khai next-i18next ổn định và muốn dần dần chuyển sang trải nghiệm phát triển được cải thiện của Intlayer.
52
- 2. **Yêu cầu kế thừa**: Dự án của bạn yêu cầu tương thích với các plugin hoặc quy trình làm việc i18next hiện có.
53
- 3. **Đội ngũ quen thuộc**: Đội ngũ của bạn quen thuộc với next-i18next nhưng muốn quản lý nội dung tốt hơn.
55
+ 2. **Yêu cầu kế thừa**: Dự án của bạn cần tương thích với các plugin hoặc quy trình làm việc i18next hiện có.
56
+ 3. **Sự quen thuộc của đội ngũ**: Đội ngũ của bạn quen thuộc với next-i18next nhưng muốn quản lý nội dung tốt hơn.
54
57
 
55
- **Vì vậy, Intlayer có thể được triển khai như một bộ chuyển đổi cho next-i18next để giúp tự động hóa việc dịch JSON của bạn trong CLI hoặc các pipeline CI/CD, kiểm thử các bản dịch của bạn, và nhiều hơn thế nữa.**
58
+ **Vì vậy, Intlayer có thể được triển khai như một bộ chuyển đổi cho next-i18next để giúp tự động hóa việc dịch JSON của bạn trong CLI hoặc các pipeline CI/CD, kiểm thử các bản dịch của bạn, và nhiều hơn nữa.**
56
59
 
57
60
  Hướng dẫn này sẽ chỉ cho bạn cách tận dụng hệ thống khai báo nội dung vượt trội của Intlayer trong khi vẫn duy trì khả năng tương thích với next-i18next.
58
61
 
@@ -76,18 +79,18 @@ pnpm add intlayer @intlayer/sync-json-plugin
76
79
  yarn add intlayer @intlayer/sync-json-plugin
77
80
  ```
78
81
 
82
+ ```bash packageManager="bun"
83
+ bun add intlayer @intlayer/sync-json-plugin
84
+ ```
85
+
79
86
  **Giải thích các gói:**
80
87
 
81
- - **intlayer**: Thư viện lõi cho khai báo và quản lý nội dung
82
- - **next-intlayer**: Lớp tích hợp Next.js với các plugin xây dựng
83
- - **i18next**: Khung i18n lõi
84
- - **next-i18next**: Lớp bọc Next.js cho i18next
85
- - **i18next-resources-to-backend**: Tải tài nguyên động cho i18next
86
- - **@intlayer/sync-json-plugin**: Plugin để đồng bộ khai báo nội dung Intlayer sang định dạng JSON của i18next
88
+ - **intlayer**: Thư viện cốt lõi cho khai báo và quản lý nội dung
89
+ - **@intlayer/sync-json-plugin**: Plugin để đồng bộ các khai báo nội dung Intlayer sang định dạng JSON của i18next
87
90
 
88
91
  ### Bước 2: Triển khai plugin Intlayer để bao bọc JSON
89
92
 
90
- Tạo một tệp cấu hình Intlayer để định nghĩa các locale được hỗ trợ của bạn:
93
+ Tạo một file cấu hình Intlayer để định nghĩa các ngôn ngữ bạn hỗ trợ:
91
94
 
92
95
  **Nếu bạn cũng muốn xuất các từ điển JSON cho i18next**, hãy thêm plugin `syncJSON`:
93
96
 
@@ -98,11 +101,11 @@ import { syncJSON } from "@intlayer/sync-json-plugin";
98
101
  const config: IntlayerConfig = {
99
102
  internationalization: {
100
103
  locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
101
- defaultLocale: Locals.ENGLISH,
104
+ defaultLocale: Locales.ENGLISH,
102
105
  },
103
106
  plugins: [
104
107
  syncJSON({
105
- source: ({ key, locale }) => `./messages/${locale}/${key}.json`,
108
+ source: ({ key, locale }) => `./public/locales/${locale}/${key}.json`,
106
109
  }),
107
110
  ],
108
111
  };
@@ -110,33 +113,76 @@ const config: IntlayerConfig = {
110
113
  export default config;
111
114
  ```
112
115
 
113
- Plugin `syncJSON` sẽ tự động bao bọc JSON. Nó sẽ đọc và ghi các tệp JSON mà không thay đổi cấu trúc nội dung.
116
+ Plugin `syncJSON` sẽ tự động bao bọc JSON. Nó sẽ đọc và ghi các file JSON mà không thay đổi kiến trúc nội dung.
114
117
 
115
- Nếu bạn muốn cho phép JSON đó tồn tại cùng với các tệp khai báo nội dung intlayer (`.content` files), Intlayer sẽ tiến hành theo cách sau:
118
+ Nếu bạn muốn cho phép JSON tồn tại cùng với các file khai báo nội dung intlayer (`.content` files), Intlayer sẽ tiến hành theo cách sau:
116
119
 
117
- 1. tải cả tệp JSON và tệp khai báo nội dung chuyển đổi chúng thành một từ điển intlayer.
118
- 2. nếu có xung đột giữa JSON và các tệp khai báo nội dung, Intlayer sẽ tiến hành hợp nhất tất cả các từ điển đó. Tùy thuộc vào ưu tiên của các plugin, và ưu tiên của tệp khai báo nội dung (tất cả đều có thể cấu hình).
120
+ 1. tải cả file JSON và file khai báo nội dung rồi chuyển đổi chúng thành một từ điển intlayer.
121
+ 2. nếu có xung đột giữa JSON và các file khai báo nội dung, Intlayer sẽ tiến hành hợp nhất tất cả các từ điển đó. Tùy thuộc vào ưu tiên của các plugin và ưu tiên của file khai báo nội dung (tất cả đều có thể cấu hình).
119
122
 
120
- Nếu có thay đổi được thực hiện bằng cách sử dụng CLI để dịch JSON, hoặc sử dụng CMS, Intlayer sẽ cập nhật tệp JSON với các bản dịch mới.
123
+ Nếu có thay đổi được thực hiện bằng cách sử dụng CLI để dịch JSON, hoặc sử dụng CMS, Intlayer sẽ cập nhật file JSON với các bản dịch mới.
121
124
 
122
125
  Để xem thêm chi tiết về plugin `syncJSON`, vui lòng tham khảo [tài liệu plugin syncJSON](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/plugins/sync-json.md).
123
126
 
124
127
  ---
125
128
 
129
+ ### (Tùy chọn) Bước 3: Triển khai dịch JSON theo từng thành phần
130
+
131
+ Theo mặc định, Intlayer sẽ tải, hợp nhất và đồng bộ cả file JSON và file khai báo nội dung. Xem [tài liệu khai báo nội dung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md) để biết thêm chi tiết. Nhưng nếu bạn muốn, sử dụng một plugin của Intlayer, bạn cũng có thể triển khai quản lý JSON theo từng thành phần được bản địa hóa ở bất kỳ đâu trong mã nguồn của bạn.
132
+
133
+ Để làm điều đó, bạn có thể sử dụng plugin `loadJSON`.
134
+
135
+ ```ts fileName="intlayer.config.ts"
136
+ import { Locales, type IntlayerConfig } from "intlayer";
137
+ import { loadJSON, syncJSON } from "@intlayer/sync-json-plugin";
138
+
139
+ const config: IntlayerConfig = {
140
+ internationalization: {
141
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
142
+ defaultLocale: Locales.ENGLISH,
143
+ },
144
+
145
+ // Giữ cho các file JSON hiện tại của bạn đồng bộ với từ điển Intlayer
146
+ plugins: [
147
+ /**
148
+ * Sẽ tải tất cả các file JSON trong thư mục src khớp với mẫu {key}.i18n.json
149
+ */
150
+ loadJSON({
151
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
152
+ locale: Locales.ENGLISH,
153
+ priority: 1, // Đảm bảo các file JSON này ưu tiên hơn các file tại `./public/locales/en/${key}.json`
154
+ }),
155
+ /**
156
+ * Sẽ tải và ghi lại đầu ra cùng các bản dịch trở lại các file JSON trong thư mục locales
157
+ */
158
+ syncJSON({
159
+ source: ({ key, locale }) => `./public/locales/${locale}/${key}.json`,
160
+ priority: 0,
161
+ }),
162
+ ],
163
+ };
164
+
165
+ export default config;
166
+ ```
167
+
168
+ Điều này sẽ tải tất cả các file JSON trong thư mục `src` khớp với mẫu `{key}.i18n.json` và tải chúng như các từ điển Intlayer.
169
+
170
+ ---
171
+
126
172
  ## Cấu hình Git
127
173
 
128
- Loại trừ các tệp được tạo ra khỏi kiểm soát phiên bản:
174
+ Loại trừ các file được tạo tự động khỏi việc kiểm soát phiên bản:
129
175
 
130
176
  ```plaintext fileName=".gitignore"
131
- # Bỏ qua các tệp được tạo bởi Intlayer
177
+ # Bỏ qua các file được tạo bởi Intlayer
132
178
  .intlayer
133
179
  intl
134
180
  ```
135
181
 
136
- Những tệp này được tự động tạo lại trong quá trình xây dựng và không cần phải cam kết vào kho lưu trữ của bạn.
182
+ Các file này được tự động tạo lại trong quá trình build và không cần phải commit vào kho của bạn.
137
183
 
138
184
  ### Tiện ích mở rộng VS Code
139
185
 
140
- Để cải thiện trải nghiệm phát triển, hãy cài đặt **Tiện ích mở rộng Intlayer cho VS Code** chính thức:
186
+ Để cải thiện trải nghiệm cho nhà phát triển, hãy cài đặt **Tiện ích mở rộng Intlayer chính thức cho VS Code**:
141
187
 
142
188
  [Cài đặt từ VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
@@ -7,9 +7,12 @@ slugs:
7
7
  - blog
8
8
  - intlayer-with-next-intl
9
9
  history:
10
+ - version: 7.0.6
11
+ date: 2025-11-01
12
+ changes: Thêm plugin loadJSON
10
13
  - version: 7.0.0
11
14
  date: 2025-10-29
12
- changes: Thay đổi sang plugin syncJSON
15
+ changes: Chuyển sang plugin syncJSON
13
16
  ---
14
17
 
15
18
  # Cách tự động hóa bản dịch JSON next-intl của bạn bằng Intlayer
@@ -25,12 +28,13 @@ Xem một so sánh cụ thể với next-intl trong bài viết blog của chún
25
28
  Trong khi Intlayer cung cấp một giải pháp i18n độc lập xuất sắc (xem hướng dẫn tích hợp Next.js của chúng tôi [Next.js integration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_with_nextjs_16.md)), bạn có thể muốn kết hợp nó với next-intl vì một số lý do sau:
26
29
 
27
30
  1. **Mã nguồn hiện có**: Bạn đã có một triển khai next-intl ổn định và muốn dần dần chuyển sang trải nghiệm phát triển được cải thiện của Intlayer.
28
- 2. **Yêu cầu kế thừa**: Dự án của bạn yêu cầu tương thích với các plugin hoặc quy trình làm việc next-intl hiện có.
29
- 3. **Sự quen thuộc của nhóm**: Nhóm của bạn quen thuộc với next-intl nhưng muốn quản lý nội dung tốt hơn.
31
+ 2. **Yêu cầu kế thừa**: Dự án của bạn cần tương thích với các plugin hoặc quy trình làm việc next-intl hiện có.
32
+ 3. **Sự quen thuộc của nhóm**: Nhóm của bạn đã quen với next-intl nhưng muốn quản lý nội dung tốt hơn.
33
+ 4. **Sử dụng các tính năng của Intlayer**: Bạn muốn sử dụng các tính năng của Intlayer như khai báo nội dung, tự động hóa dịch thuật, kiểm thử bản dịch, và nhiều hơn nữa.
30
34
 
31
- **Vì vậy, Intlayer có thể được triển khai như một bộ chuyển đổi cho next-intl để giúp tự động hóa việc dịch JSON của bạn trong CLI hoặc các pipeline CI/CD, kiểm thử các bản dịch của bạn, và nhiều hơn nữa.**
35
+ **Vì vậy, Intlayer có thể được triển khai như một bộ chuyển đổi (adapter) cho next-intl để giúp tự động hóa các bản dịch JSON của bạn trong CLI hoặc các pipeline CI/CD, kiểm thử bản dịch, và nhiều hơn nữa.**
32
36
 
33
- Hướng dẫn này sẽ chỉ cho bạn cách tận dụng hệ thống khai báo nội dung vượt trội của Intlayer trong khi vẫn duy trì khả năng tương thích với next-intl.
37
+ Hướng dẫn này sẽ chỉ cho bạn cách tận dụng hệ thống khai báo nội dung vượt trội của Intlayer trong khi vẫn giữ được khả năng tương thích với next-intl.
34
38
 
35
39
  ## Mục lục
36
40
 
@@ -54,14 +58,18 @@ pnpm add intlayer @intlayer/sync-json-plugin
54
58
  yarn add intlayer @intlayer/sync-json-plugin
55
59
  ```
56
60
 
61
+ ```bash packageManager="bun"
62
+ bun add intlayer @intlayer/sync-json-plugin
63
+ ```
64
+
57
65
  **Mô tả các gói:**
58
66
 
59
67
  - **intlayer**: Thư viện lõi để quản lý quốc tế hóa, khai báo nội dung và xây dựng
60
- - **@intlayer/sync-json-plugin**: Plugin để xuất các khai báo nội dung Intlayer sang định dạng JSON tương thích với next-intl
68
+ - **@intlayer/sync-json-plugin**: Plugin để xuất các khai báo nội dung của Intlayer sang định dạng JSON tương thích với next-intl
61
69
 
62
70
  ### Bước 2: Triển khai plugin Intlayer để bao bọc JSON
63
71
 
64
- Tạo một tệp cấu hình Intlayer để định nghĩa các locale được hỗ trợ của bạn:
72
+ Tạo một tệp cấu hình Intlayer để định nghĩa các ngôn ngữ bạn hỗ trợ:
65
73
 
66
74
  **Nếu bạn cũng muốn xuất các từ điển JSON cho next-intl**, hãy thêm plugin `syncJSON`:
67
75
 
@@ -84,15 +92,58 @@ const config: IntlayerConfig = {
84
92
  export default config;
85
93
  ```
86
94
 
87
- Plugin `syncJSON` sẽ tự động bao bọc JSON. Nó sẽ đọc và ghi các tệp JSON mà không thay đổi kiến trúc nội dung.
95
+ Plugin `syncJSON` sẽ tự động bao bọc JSON. Nó sẽ đọc và ghi các tệp JSON mà không thay đổi cấu trúc nội dung.
88
96
 
89
- Nếu bạn muốn cho phép JSON đó tồn tại cùng với các tệp khai báo nội dung intlayer (`.content` files), Intlayer sẽ tiến hành theo cách sau:
97
+ Nếu bạn muốn cho phép JSON tồn tại cùng với các tệp khai báo nội dung intlayer (`.content` files), Intlayer sẽ tiến hành theo cách sau:
90
98
 
91
99
  1. tải cả tệp JSON và tệp khai báo nội dung và chuyển đổi chúng thành một từ điển intlayer.
92
- 2. nếu có xung đột giữa JSON và các tệp khai báo nội dung, Intlayer sẽ tiến hành hợp nhất tất cả các từ điển đó. Tùy thuộc vào độ ưu tiên của các plugin và của tệp khai báo nội dung (tất cả đều có thể cấu hình).
100
+ 2. nếu có xung đột giữa JSON và các tệp khai báo nội dung, Intlayer sẽ tiến hành hợp nhất tất cả các từ điển đó. Tùy thuộc vào ưu tiên của các plugin,ưu tiên của tệp khai báo nội dung (tất cả đều có thể cấu hình).
93
101
 
94
102
  Nếu có thay đổi được thực hiện bằng cách sử dụng CLI để dịch JSON, hoặc sử dụng CMS, Intlayer sẽ cập nhật tệp JSON với các bản dịch mới.
95
103
 
104
+ Để xem thêm chi tiết về plugin `syncJSON`, vui lòng tham khảo [tài liệu plugin syncJSON](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/plugins/sync-json.md).
105
+
106
+ ### (Tùy chọn) Bước 3: Triển khai dịch JSON theo từng thành phần
107
+
108
+ Theo mặc định, Intlayer sẽ tải, hợp nhất và đồng bộ cả tệp JSON và tệp khai báo nội dung. Xem [tài liệu khai báo nội dung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md) để biết thêm chi tiết. Nhưng nếu bạn muốn, sử dụng một plugin của Intlayer, bạn cũng có thể triển khai quản lý JSON theo từng thành phần được bản địa hóa ở bất kỳ đâu trong mã nguồn của bạn.
109
+
110
+ Để làm điều đó, bạn có thể sử dụng plugin `loadJSON`.
111
+
112
+ ```ts fileName="intlayer.config.ts"
113
+ import { Locales, type IntlayerConfig } from "intlayer";
114
+ import { loadJSON, syncJSON } from "@intlayer/sync-json-plugin";
115
+
116
+ const config: IntlayerConfig = {
117
+ internationalization: {
118
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
119
+ defaultLocale: Locales.ENGLISH,
120
+ },
121
+
122
+ // Giữ cho các tệp JSON hiện tại của bạn đồng bộ với từ điển Intlayer
123
+ plugins: [
124
+ /**
125
+ * Sẽ tải tất cả các tệp JSON trong thư mục src khớp với mẫu {key}.i18n.json
126
+ */
127
+ loadJSON({
128
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
129
+ locale: Locales.ENGLISH,
130
+ priority: 1, // Đảm bảo các tệp JSON này ưu tiên hơn các tệp tại `./locales/en/${key}.json`
131
+ }),
132
+ /**
133
+ * Sẽ tải và ghi đầu ra cùng các bản dịch trở lại các tệp JSON trong thư mục locales
134
+ */
135
+ syncJSON({
136
+ source: ({ key, locale }) => `./messages/${locale}/${key}.json`,
137
+ priority: 0,
138
+ }),
139
+ ],
140
+ };
141
+
142
+ export default config;
143
+ ```
144
+
145
+ Điều này sẽ tải tất cả các tệp JSON trong thư mục `src` khớp với mẫu `{key}.i18n.json` và tải chúng như các từ điển Intlayer.
146
+
96
147
  ## Cấu hình Git
97
148
 
98
149
  Khuyến nghị bỏ qua các tệp Intlayer được tạo tự động:
@@ -102,7 +153,7 @@ Khuyến nghị bỏ qua các tệp Intlayer được tạo tự động:
102
153
  .intlayer
103
154
  ```
104
155
 
105
- Các tệp này có thể được tạo lại trong quá trình xây dựng của bạn và không cần phải cam kết vào hệ thống quản lý phiên bản.
156
+ Các tệp này có thể được tạo lại trong quá trình xây dựng và không cần phải cam kết vào hệ thống quản lý phiên bản.
106
157
 
107
158
  ### Tiện ích mở rộng VS Code
108
159
 
@@ -2,7 +2,7 @@
2
2
  createdAt: 2025-01-02
3
3
  updatedAt: 2025-10-29
4
4
  title: Cách tự động hóa bản dịch JSON react-i18next của bạn bằng Intlayer
5
- description: Tự động hóa bản dịch JSON của bạn với Intlayer và react-i18next để nâng cao khả năng quốc tế hóa trong các ứng dụng React.
5
+ description: Tự động hóa bản dịch JSON của bạn với Intlayer và react-i18next để nâng cao quốc tế hóa trong các ứng dụng React.
6
6
  keywords:
7
7
  - react-i18next
8
8
  - i18next
@@ -18,6 +18,9 @@ slugs:
18
18
  - blog
19
19
  - intlayer-with-react-i18next
20
20
  history:
21
+ - version: 7.0.6
22
+ date: 2025-11-01
23
+ changes: Thêm plugin loadJSON
21
24
  - version: 7.0.0
22
25
  date: 2025-10-29
23
26
  changes: Thay đổi sang plugin syncJSON
@@ -27,21 +30,22 @@ history:
27
30
 
28
31
  ## Intlayer là gì?
29
32
 
30
- **Intlayer** là một thư viện quốc tế hóa mã nguồn mở sáng tạo, được thiết kế để khắc phục những hạn chế của các giải pháp i18n truyền thống. Nó cung cấp một cách tiếp cận hiện đại cho quản lý nội dung trong các ứng dụng React.
33
+ **Intlayer** là một thư viện quốc tế hóa mã nguồn mở sáng tạo, được thiết kế để khắc phục những hạn chế của các giải pháp i18n truyền thống. Nó cung cấp một phương pháp hiện đại để quản lý nội dung trong các ứng dụng React.
31
34
 
32
35
  Xem so sánh cụ thể với react-i18next trong bài viết blog của chúng tôi [react-i18next vs. react-intl vs. Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md).
33
36
 
34
37
  ## Tại sao kết hợp Intlayer với react-i18next?
35
38
 
36
- Trong khi Intlayer cung cấp một giải pháp i18n độc lập xuất sắc (xem hướng dẫn tích hợp React của chúng tôi [React integration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_with_vite+react.md)), bạn có thể muốn kết hợp nó với react-i18next vì một số lý do:
39
+ Trong khi Intlayer cung cấp một giải pháp i18n độc lập xuất sắc (xem hướng dẫn tích hợp React của chúng tôi [React integration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_with_vite+react.md)), bạn có thể muốn kết hợp nó với react-i18next vì một số lý do sau:
37
40
 
38
41
  1. **Mã nguồn hiện có**: Bạn đã có một triển khai react-i18next ổn định và muốn dần dần chuyển sang trải nghiệm phát triển được cải thiện của Intlayer.
39
- 2. **Yêu cầu kế thừa**: Dự án của bạn yêu cầu tương thích với các plugin hoặc quy trình làm việc react-i18next hiện có.
40
- 3. **Sự quen thuộc của đội ngũ**: Đội ngũ của bạn quen thuộc với react-i18next nhưng muốn quản lý nội dung tốt hơn.
42
+ 2. **Yêu cầu kế thừa**: Dự án của bạn cần tương thích với các plugin hoặc quy trình làm việc react-i18next hiện có.
43
+ 3. **Đội ngũ quen thuộc**: Đội ngũ của bạn quen thuộc với react-i18next nhưng muốn quản lý nội dung tốt hơn.
44
+ 4. **Sử dụng các tính năng của Intlayer**: Bạn muốn sử dụng các tính năng của Intlayer như khai báo nội dung, tự động hóa dịch thuật, kiểm thử bản dịch, và nhiều hơn nữa.
41
45
 
42
- **Vì vậy, Intlayer có thể được triển khai như một bộ chuyển đổi cho react-i18next để giúp tự động hóa việc dịch JSON của bạn trong CLI hoặc các pipeline CI/CD, kiểm thử các bản dịch, và nhiều hơn nữa.**
46
+ **Vì vậy, Intlayer có thể được triển khai như một bộ chuyển đổi cho react-i18next để giúp tự động hóa các bản dịch JSON của bạn trong CLI hoặc các pipeline CI/CD, kiểm thử bản dịch, và nhiều hơn nữa.**
43
47
 
44
- Hướng dẫn này sẽ chỉ cho bạn cách tận dụng hệ thống khai báo nội dung vượt trội của Intlayer đồng thời duy trì khả năng tương thích với react-i18next.
48
+ Hướng dẫn này sẽ chỉ cho bạn cách tận dụng hệ thống khai báo nội dung vượt trội của Intlayer trong khi vẫn duy trì khả năng tương thích với react-i18next.
45
49
 
46
50
  ## Mục lục
47
51
 
@@ -65,14 +69,18 @@ pnpm add intlayer @intlayer/sync-json-plugin
65
69
  yarn add intlayer @intlayer/sync-json-plugin
66
70
  ```
67
71
 
72
+ ```bash packageManager="bun"
73
+ bun add intlayer @intlayer/sync-json-plugin
74
+ ```
75
+
68
76
  **Mô tả các gói:**
69
77
 
70
78
  - **intlayer**: Thư viện lõi để quản lý quốc tế hóa, khai báo nội dung và xây dựng
71
- - **@intlayer/sync-json-plugin**: Plugin để xuất các khai báo nội dung Intlayer sang định dạng JSON tương thích với react-i18next
79
+ - **@intlayer/sync-json-plugin**: Plugin để xuất các khai báo nội dung của Intlayer sang định dạng JSON tương thích với react-i18next
72
80
 
73
81
  ### Bước 2: Triển khai plugin Intlayer để bao bọc JSON
74
82
 
75
- Tạo một tệp cấu hình Intlayer để định nghĩa các ngôn ngữ bạn hỗ trợ:
83
+ Tạo một tệp cấu hình Intlayer để định nghĩa các ngôn ngữ được hỗ trợ:
76
84
 
77
85
  **Nếu bạn cũng muốn xuất các từ điển JSON cho react-i18next**, hãy thêm plugin `syncJSON`:
78
86
 
@@ -87,7 +95,7 @@ const config: IntlayerConfig = {
87
95
  },
88
96
  plugins: [
89
97
  syncJSON({
90
- source: ({ key, locale }) => `./messages/${locale}/${key}.json`,
98
+ source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
91
99
  }),
92
100
  ],
93
101
  };
@@ -97,28 +105,69 @@ export default config;
97
105
 
98
106
  Plugin `syncJSON` sẽ tự động bao bọc JSON. Nó sẽ đọc và ghi các tệp JSON mà không thay đổi kiến trúc nội dung.
99
107
 
100
- Nếu bạn muốn cho phép JSON đó tồn tại cùng với các tệp khai báo nội dung intlayer (`.content` files), Intlayer sẽ tiến hành theo cách sau:
108
+ Nếu bạn muốn cho phép JSON tồn tại cùng với các tệp khai báo nội dung intlayer (`.content` files), Intlayer sẽ tiến hành theo cách sau:
101
109
 
102
- 1. tải cả tệp JSON và tệp khai báo nội dung rồi chuyển đổi chúng thành một từ điển intlayer.
103
- 2. nếu có xung đột giữa JSON và các tệp khai báo nội dung, Intlayer sẽ tiến hành hợp nhất tất cả các từ điển đó. Tùy thuộc vào ưu tiên của các plugin và tệp khai báo nội dung (tất cả đều có thể cấu hình).
110
+ 1. tải cả tệp JSON và tệp khai báo nội dung chuyển đổi chúng thành một từ điển intlayer.
111
+ 2. nếu có xung đột giữa JSON và các tệp khai báo nội dung, Intlayer sẽ tiến hành hợp nhất tất cả các từ điển đó. Tùy thuộc vào ưu tiên của các plugin,ưu tiên của tệp khai báo nội dung (tất cả đều có thể cấu hình).
104
112
 
105
- Nếu có thay đổi được thực hiện bằng cách sử dụng CLI để dịch JSON, hoặc sử dụng CMS, Intlayer sẽ cập nhật tệp JSON với các bản dịch mới.
113
+ Nếu có thay đổi được thực hiện bằng CLI để dịch JSON, hoặc sử dụng CMS, Intlayer sẽ cập nhật tệp JSON với các bản dịch mới.
106
114
 
107
115
  Để xem thêm chi tiết về plugin `syncJSON`, vui lòng tham khảo [tài liệu plugin syncJSON](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/plugins/sync-json.md).
108
116
 
117
+ ### (Tùy chọn) Bước 3: Triển khai dịch JSON theo từng thành phần
118
+
119
+ Theo mặc định, Intlayer sẽ tải, hợp nhất và đồng bộ cả tệp JSON và tệp khai báo nội dung. Xem [tài liệu khai báo nội dung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md) để biết thêm chi tiết. Nhưng nếu bạn muốn, sử dụng một plugin Intlayer, bạn cũng có thể triển khai quản lý JSON theo từng thành phần được bản địa hóa ở bất kỳ đâu trong mã nguồn của bạn.
120
+
121
+ Để làm điều đó, bạn có thể sử dụng plugin `loadJSON`.
122
+
123
+ ```ts fileName="intlayer.config.ts"
124
+ import { Locales, type IntlayerConfig } from "intlayer";
125
+ import { loadJSON, syncJSON } from "@intlayer/sync-json-plugin";
126
+
127
+ const config: IntlayerConfig = {
128
+ internationalization: {
129
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
130
+ defaultLocale: Locales.ENGLISH,
131
+ },
132
+
133
+ // Giữ cho các tệp JSON hiện tại của bạn đồng bộ với từ điển Intlayer
134
+ plugins: [
135
+ /**
136
+ * Sẽ tải tất cả các tệp JSON trong thư mục src khớp với mẫu {key}.i18n.json
137
+ */
138
+ loadJSON({
139
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
140
+ locale: Locales.ENGLISH,
141
+ priority: 1, // Đảm bảo các tệp JSON này ưu tiên hơn các tệp tại `./locales/en/${key}.json`
142
+ }),
143
+ /**
144
+ * Sẽ tải và ghi đầu ra cùng các bản dịch trở lại các tệp JSON trong thư mục locales
145
+ */
146
+ syncJSON({
147
+ source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
148
+ priority: 0,
149
+ }),
150
+ ],
151
+ };
152
+
153
+ export default config;
154
+ ```
155
+
156
+ Điều này sẽ tải tất cả các tệp JSON trong thư mục `src` khớp với mẫu `{key}.i18n.json` và tải chúng như các từ điển Intlayer.
157
+
109
158
  ## Cấu hình Git
110
159
 
111
160
  Khuyến nghị bỏ qua các tệp Intlayer được tạo tự động:
112
161
 
113
162
  ```plaintext fileName=".gitignore"
114
- # Bỏ qua các tệp được tạo bởi Intlayer
163
+ # Bỏ qua các tệp do Intlayer tạo ra
115
164
  .intlayer
116
165
  ```
117
166
 
118
- Các tệp này có thể được tạo lại trong quá trình xây dựng của bạn và không cần phải cam kết vào hệ thống kiểm soát phiên bản.
167
+ Các tệp này có thể được tạo lại trong quá trình xây dựng và không cần phải cam kết vào hệ thống quản phiên bản.
119
168
 
120
169
  ### Tiện ích mở rộng VS Code
121
170
 
122
- Để cải thiện trải nghiệm phát triển, hãy cài đặt **Tiện ích mở rộng Intlayer chính thức cho VS Code**:
171
+ Để cải thiện trải nghiệm phát triển, hãy cài đặt **Tiện ích mở rộng Intlayer cho VS Code** chính thức:
123
172
 
124
173
  [Cài đặt từ VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  createdAt: 2025-01-02
3
3
  updatedAt: 2025-10-29
4
- title: Cách tự động hóa bản dịch JSON react-intl của bạn bằng Intlayer
5
- description: Tự động hóa bản dịch JSON của bạn với Intlayer và react-intl để nâng cao khả năng quốc tế hóa trong các ứng dụng React.
4
+ title: Cách tự động hóa dịch JSON react-intl của bạn bằng Intlayer
5
+ description: Tự động hóa dịch JSON của bạn với Intlayer và react-intl để nâng cao quốc tế hóa trong các ứng dụng React.
6
6
  keywords:
7
7
  - react-intl
8
8
  - Intlayer
@@ -16,28 +16,36 @@ slugs:
16
16
  - blog
17
17
  - intlayer-with-react-intl
18
18
  history:
19
+ - version: 7.0.6
20
+ date: 2025-11-01
21
+ changes: Thêm plugin loadJSON
19
22
  - version: 7.0.0
20
23
  date: 2025-10-29
21
- changes: Thay đổi sang plugin syncJSON
24
+ changes: Chuyển sang plugin syncJSON
22
25
  ---
23
26
 
24
- # Cách tự động hóa bản dịch JSON react-intl của bạn bằng Intlayer
27
+ # Cách tự động hóa dịch JSON react-intl của bạn bằng Intlayer
28
+
29
+ ## Mục lục
30
+
31
+ <TOC/>
25
32
 
26
33
  ## Intlayer là gì?
27
34
 
28
- **Intlayer** là một thư viện quốc tế hóa mã nguồn mở sáng tạo, được thiết kế để khắc phục những hạn chế của các giải pháp i18n truyền thống. Nó cung cấp một cách tiếp cận hiện đại cho quản lý nội dung trong các ứng dụng React.
35
+ **Intlayer** là một thư viện quốc tế hóa mã nguồn mở sáng tạo, được thiết kế để khắc phục những hạn chế của các giải pháp i18n truyền thống. Nó cung cấp một phương pháp hiện đại để quản lý nội dung trong các ứng dụng React.
29
36
 
30
- Xem so sánh cụ thể với react-intl trong bài viết blog của chúng tôi [react-i18next vs. react-intl vs. Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/react-i18next_vs_react-intl_vs_intlayer.md).
37
+ Xem so sánh cụ thể với react-intl trong bài viết blog của chúng tôi [react-i18next vs. react-intl vs. Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md).
31
38
 
32
39
  ## Tại sao kết hợp Intlayer với react-intl?
33
40
 
34
- Trong khi Intlayer cung cấp một giải pháp i18n độc lập xuất sắc (xem hướng dẫn tích hợp React của chúng tôi [React integration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_with_vite+react.md)), bạn có thể muốn kết hợp nó với react-intl vì một số lý do sau:
41
+ Trong khi Intlayer cung cấp một giải pháp i18n độc lập xuất sắc (xem hướng dẫn tích hợp React của chúng tôi [React integration guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_with_vite+react.md)), bạn có thể muốn kết hợp nó với react-intl vì một số lý do:
35
42
 
36
43
  1. **Mã nguồn hiện có**: Bạn đã có một triển khai react-intl ổn định và muốn dần dần chuyển sang trải nghiệm phát triển được cải thiện của Intlayer.
37
44
  2. **Yêu cầu kế thừa**: Dự án của bạn cần tương thích với các plugin hoặc quy trình làm việc react-intl hiện có.
38
45
  3. **Đội ngũ quen thuộc**: Đội ngũ của bạn quen thuộc với react-intl nhưng muốn quản lý nội dung tốt hơn.
46
+ 4. **Sử dụng các tính năng của Intlayer**: Bạn muốn sử dụng các tính năng của Intlayer như khai báo nội dung, tự động hóa dịch thuật, kiểm thử bản dịch, và nhiều hơn nữa.
39
47
 
40
- **Vì vậy, Intlayer có thể được triển khai như một bộ điều hợp cho react-intl để giúp tự động hóa việc dịch JSON của bạn trong CLI hoặc các pipeline CI/CD, kiểm thử bản dịch, và nhiều hơn nữa.**
48
+ **Vì vậy, Intlayer có thể được triển khai như một bộ chuyển đổi cho react-intl để giúp tự động hóa các bản dịch JSON của bạn trong CLI hoặc các pipeline CI/CD, kiểm thử bản dịch, và nhiều hơn nữa.**
41
49
 
42
50
  Hướng dẫn này sẽ chỉ cho bạn cách tận dụng hệ thống khai báo nội dung vượt trội của Intlayer trong khi vẫn duy trì khả năng tương thích với react-intl.
43
51
 
@@ -63,14 +71,18 @@ pnpm add intlayer @intlayer/sync-json-plugin
63
71
  yarn add intlayer @intlayer/sync-json-plugin
64
72
  ```
65
73
 
74
+ ```bash packageManager="bun"
75
+ bun add intlayer @intlayer/sync-json-plugin
76
+ ```
77
+
66
78
  **Mô tả các gói:**
67
79
 
68
80
  - **intlayer**: Thư viện lõi để quản lý quốc tế hóa, khai báo nội dung và xây dựng
69
- - **@intlayer/sync-json-plugin**: Plugin để xuất các khai báo nội dung Intlayer sang định dạng JSON tương thích với react-intl
81
+ - **@intlayer/sync-json-plugin**: Plugin để xuất các khai báo nội dung của Intlayer sang định dạng JSON tương thích với react-intl
70
82
 
71
83
  ### Bước 2: Triển khai plugin Intlayer để bao bọc JSON
72
84
 
73
- Tạo một tệp cấu hình Intlayer để định nghĩa các ngôn ngữ bạn hỗ trợ:
85
+ Tạo một tệp cấu hình Intlayer để định nghĩa các ngôn ngữ được hỗ trợ của bạn:
74
86
 
75
87
  **Nếu bạn cũng muốn xuất các từ điển JSON cho react-intl**, hãy thêm plugin `syncJSON`:
76
88
 
@@ -93,30 +105,71 @@ const config: IntlayerConfig = {
93
105
  export default config;
94
106
  ```
95
107
 
96
- Plugin `syncJSON` sẽ tự động bao bọc JSON. Nó sẽ đọc và ghi các tệp JSON mà không thay đổi cấu trúc nội dung.
108
+ Plugin `syncJSON` sẽ tự động bao bọc JSON. Nó sẽ đọc và ghi các tệp JSON mà không thay đổi kiến trúc nội dung.
97
109
 
98
110
  Nếu bạn muốn cho phép JSON đó tồn tại cùng với các tệp khai báo nội dung intlayer (`.content` files), Intlayer sẽ tiến hành theo cách sau:
99
111
 
100
112
  1. tải cả tệp JSON và tệp khai báo nội dung và chuyển đổi chúng thành một từ điển intlayer.
101
- 2. nếu có xung đột giữa JSON và các tệp khai báo nội dung, Intlayer sẽ tiến hành hợp nhất tất cả các từ điển đó. Tùy thuộc vào ưu tiên của các plugin và tệp khai báo nội dung (tất cả đều có thể cấu hình).
113
+ 2. nếu có xung đột giữa JSON và các tệp khai báo nội dung, Intlayer sẽ tiến hành hợp nhất tất cả các từ điển đó. Tùy thuộc vào ưu tiên của các plugin,của tệp khai báo nội dung (tất cả đều có thể cấu hình).
114
+
115
+ Nếu có thay đổi được thực hiện bằng CLI để dịch JSON, hoặc sử dụng CMS, Intlayer sẽ cập nhật tệp JSON với các bản dịch mới.
116
+
117
+ Để xem thêm chi tiết về plugin `syncJSON`, vui lòng tham khảo [tài liệu plugin syncJSON](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/plugins/sync-json.md).
118
+
119
+ ### (Tùy chọn) Bước 3: Triển khai dịch JSON theo từng thành phần
120
+
121
+ Theo mặc định, Intlayer sẽ tải, hợp nhất và đồng bộ cả tệp JSON và tệp khai báo nội dung. Xem [tài liệu khai báo nội dung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md) để biết thêm chi tiết. Nhưng nếu bạn muốn, sử dụng một plugin của Intlayer, bạn cũng có thể triển khai quản lý JSON theo từng thành phần được bản địa hóa ở bất kỳ đâu trong mã nguồn của bạn.
122
+
123
+ Để làm điều đó, bạn có thể sử dụng plugin `loadJSON`.
124
+
125
+ ```ts fileName="intlayer.config.ts"
126
+ import { Locales, type IntlayerConfig } from "intlayer";
127
+ import { loadJSON, syncJSON } from "@intlayer/sync-json-plugin";
128
+
129
+ const config: IntlayerConfig = {
130
+ internationalization: {
131
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
132
+ defaultLocale: Locales.ENGLISH,
133
+ },
134
+
135
+ // Giữ các tệp JSON hiện tại của bạn đồng bộ với từ điển Intlayer
136
+ plugins: [
137
+ /**
138
+ * Sẽ tải tất cả các tệp JSON trong thư mục src khớp với mẫu {key}.i18n.json
139
+ */
140
+ loadJSON({
141
+ source: ({ key }) => `./src/**/${key}.i18n.json`,
142
+ locale: Locales.ENGLISH,
143
+ priority: 1, // Đảm bảo các tệp JSON này ưu tiên hơn các tệp tại `./locales/en/${key}.json`
144
+ }),
145
+ /**
146
+ * Sẽ tải và ghi đầu ra cùng các bản dịch trở lại các tệp JSON trong thư mục locales
147
+ */
148
+ syncJSON({
149
+ source: ({ key, locale }) => `./messages/${locale}/${key}.json`,
150
+ priority: 0,
151
+ }),
152
+ ],
153
+ };
102
154
 
103
- Nếu thay đổi được thực hiện bằng cách sử dụng CLI để dịch JSON, hoặc sử dụng CMS, Intlayer sẽ cập nhật tệp JSON với các bản dịch mới.
155
+ export default config;
156
+ ```
104
157
 
105
- Để xem chi tiết hơn về plugin `syncJSON`, vui lòng tham khảo [tài liệu plugin syncJSON](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/plugins/sync-json.md).
158
+ Điều này sẽ tải tất cả các tệp JSON trong thư mục `src` khớp với mẫu `{key}.i18n.json` và tải chúng như các từ điển Intlayer.
106
159
 
107
160
  ## Cấu hình Git
108
161
 
109
162
  Khuyến nghị bỏ qua các tệp Intlayer được tạo tự động:
110
163
 
111
164
  ```plaintext fileName=".gitignore"
112
- # Bỏ qua các tệp do Intlayer tạo ra
165
+ # Bỏ qua các tệp được tạo bởi Intlayer
113
166
  .intlayer
114
167
  ```
115
168
 
116
- Những tệp này có thể được tạo lại trong quá trình xây dựng của bạn và không cần phải cam kết vào hệ thống quản lý phiên bản.
169
+ Các tệp này có thể được tạo lại trong quá trình xây dựng của bạn và không cần phải cam kết vào hệ thống quản lý phiên bản.
117
170
 
118
171
  ### Tiện ích mở rộng VS Code
119
172
 
120
- Để cải thiện trải nghiệm phát triển, hãy cài đặt **Tiện ích mở rộng Intlayer cho VS Code** chính thức:
173
+ Để cải thiện trải nghiệm phát triển, hãy cài đặt **Tiện ích mở rộng Intlayer chính thức cho VS Code**:
121
174
 
122
175
  [Cài đặt từ VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)