@intlayer/docs 9.0.0-canary.10 → 9.0.0-canary.11

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 (63) hide show
  1. package/dist/cjs/generated/docs.entry.cjs +20 -0
  2. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  3. package/dist/esm/generated/docs.entry.mjs +20 -0
  4. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  5. package/dist/types/generated/docs.entry.d.ts +1 -0
  6. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  7. package/docs/ar/intlayer_CMS.md +16 -1
  8. package/docs/ar/releases/v9.md +58 -1
  9. package/docs/ar/self_hosting.md +349 -0
  10. package/docs/bn/intlayer_CMS.md +570 -0
  11. package/docs/bn/releases/v9.md +358 -0
  12. package/docs/cs/releases/v9.md +358 -0
  13. package/docs/de/intlayer_CMS.md +117 -1
  14. package/docs/de/releases/v9.md +61 -1
  15. package/docs/de/self_hosting.md +349 -0
  16. package/docs/en/intlayer_CMS.md +171 -1
  17. package/docs/en/releases/v9.md +45 -2
  18. package/docs/en/self_hosting.md +349 -0
  19. package/docs/en-GB/intlayer_CMS.md +16 -1
  20. package/docs/en-GB/releases/v9.md +47 -2
  21. package/docs/en-GB/self_hosting.md +349 -0
  22. package/docs/es/intlayer_CMS.md +117 -1
  23. package/docs/es/releases/v9.md +61 -1
  24. package/docs/es/self_hosting.md +349 -0
  25. package/docs/fr/intlayer_CMS.md +117 -1
  26. package/docs/fr/releases/v9.md +61 -1
  27. package/docs/fr/self_hosting.md +349 -0
  28. package/docs/hi/intlayer_CMS.md +16 -1
  29. package/docs/hi/releases/v9.md +59 -1
  30. package/docs/hi/self_hosting.md +349 -0
  31. package/docs/id/releases/v9.md +31 -1
  32. package/docs/id/self_hosting.md +349 -0
  33. package/docs/it/intlayer_CMS.md +117 -1
  34. package/docs/it/releases/v9.md +61 -1
  35. package/docs/it/self_hosting.md +349 -0
  36. package/docs/ja/intlayer_CMS.md +191 -10
  37. package/docs/ja/releases/v9.md +31 -1
  38. package/docs/ja/self_hosting.md +349 -0
  39. package/docs/ko/intlayer_CMS.md +189 -6
  40. package/docs/ko/releases/v9.md +30 -1
  41. package/docs/ko/self_hosting.md +349 -0
  42. package/docs/nl/releases/v9.md +358 -0
  43. package/docs/pl/intlayer_CMS.md +16 -1
  44. package/docs/pl/releases/v9.md +58 -1
  45. package/docs/pl/self_hosting.md +349 -0
  46. package/docs/pt/intlayer_CMS.md +117 -1
  47. package/docs/pt/releases/v9.md +61 -1
  48. package/docs/pt/self_hosting.md +349 -0
  49. package/docs/ru/intlayer_CMS.md +196 -15
  50. package/docs/ru/releases/v9.md +59 -1
  51. package/docs/ru/self_hosting.md +349 -0
  52. package/docs/tr/intlayer_CMS.md +16 -1
  53. package/docs/tr/releases/v9.md +46 -1
  54. package/docs/tr/self_hosting.md +349 -0
  55. package/docs/uk/intlayer_CMS.md +16 -1
  56. package/docs/uk/releases/v9.md +58 -1
  57. package/docs/uk/self_hosting.md +349 -0
  58. package/docs/vi/releases/v9.md +31 -1
  59. package/docs/vi/self_hosting.md +349 -0
  60. package/docs/zh/releases/v9.md +31 -1
  61. package/docs/zh/self_hosting.md +349 -0
  62. package/package.json +6 -6
  63. package/src/generated/docs.entry.ts +20 -0
@@ -0,0 +1,349 @@
1
+ ---
2
+ createdAt: 2026-06-30
3
+ updatedAt: 2026-06-30
4
+ title: Tự host Intlayer
5
+ description: Chạy một phiên bản Intlayer hoàn chỉnh trên hạ tầng của riêng bạn chỉ với một lệnh duy nhất. Không yêu cầu tài khoản Intlayer Cloud.
6
+ keywords:
7
+ - Self-Hosting
8
+ - Docker
9
+ - Docker Compose
10
+ - Intlayer
11
+ - CMS
12
+ - Installation
13
+ - Infrastructure
14
+ slugs:
15
+ - doc
16
+ - self-hosting
17
+ author: aymericzip
18
+ ---
19
+
20
+ # Tự host Intlayer
21
+
22
+ Intlayer có thể chạy hoàn toàn trên hạ tầng của riêng bạn — không yêu cầu tài khoản Intlayer Cloud. Chỉ một lệnh duy nhất sẽ khởi động một stack sẵn sàng cho production:
23
+
24
+ ```sh
25
+ curl -fsSL https://intlayer.org/install.sh | sh
26
+ ```
27
+
28
+ Trình cài đặt sẽ tải xuống `docker-compose.yml` và `.env`, tự động tạo các secret cần thiết, và khởi động tất cả các container với `docker compose up -d`.
29
+
30
+ ## Mục lục
31
+
32
+ <TOC/>
33
+
34
+ ---
35
+
36
+ ## Kiến trúc
37
+
38
+ ```
39
+ ┌─────────────────────────────┐
40
+ browser ──────▶ │ app (TanStack Start) :3000│ ──┐
41
+ └─────────────────────────────┘ │ VITE_BACKEND_URL
42
+ ┌─────────────────────────────┐ │
43
+ │ backend (Fastify/Bun) :3100│ ◀─┘
44
+ └──────────────┬──────────────┘
45
+ ┌──────────┬─────────┼──────────┬───────────┐
46
+ ▼ ▼ ▼ ▼ ▼
47
+ mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium
48
+ (1-node RS) (S3 API) (SMTP) (in-image)
49
+ minio:9001 mailpit:8025
50
+ (console) (web UI)
51
+ ```
52
+
53
+ Chromium (được sử dụng để tạo ảnh chụp màn hình Puppeteer) được đóng gói bên trong image backend — không cần container riêng.
54
+
55
+ ---
56
+
57
+ ## Điều kiện tiên quyết
58
+
59
+ - **Docker** ≥ 24 và **Docker Compose** ≥ v2. Nếu thiếu một trong hai, trình cài đặt sẽ in liên kết cài đặt và thoát.
60
+ - Các cổng `3000`, `3100`, `8025`, `9000`, và `9001` phải khả dụng trên host.
61
+ - Host chạy Linux hoặc macOS (hoặc WSL2 trên Windows).
62
+
63
+ ---
64
+
65
+ ## Bắt đầu nhanh
66
+
67
+ ```sh
68
+ curl -fsSL https://intlayer.org/install.sh | sh
69
+ ```
70
+
71
+ Những gì trình cài đặt thực hiện:
72
+
73
+ 1. Kiểm tra xem `docker` và `docker compose` có tồn tại không.
74
+ 2. Tải xuống `docker-compose.yml` và `.env.example` vào `./intlayer/`.
75
+ 3. Nếu không có `.env` tồn tại, sao chép file ví dụ và tạo các secret ngẫu nhiên cho `BETTER_AUTH_SECRET`, `S3_ACCESS_KEY_ID`, và `S3_SECRET_ACCESS_KEY` thông qua `openssl rand`.
76
+ 4. Chạy `docker compose pull` + `docker compose up -d`.
77
+ 5. In các URL: dashboard `:3000`, API `:3100`, UI email `:8025`, console MinIO `:9001`.
78
+
79
+ Sau khi stack hoạt động, mở **http://localhost:3000** và tạo tài khoản đầu tiên của bạn.
80
+
81
+ ---
82
+
83
+ ## Các dịch vụ
84
+
85
+ | Dịch vụ | Image | Cổng Host | Mục đích |
86
+ | ----------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------- |
87
+ | **app** | được xây dựng từ `apps/app/Dockerfile` | `3000` | Dashboard TanStack Start (UI của CMS) |
88
+ | **backend** | được xây dựng từ `apps/backend/Dockerfile` | `3100` | API REST Fastify (endpoint `/health`) |
89
+ | **mongo** | `mongo:7` | nội bộ | Bộ nhân bản một node (`rs0`) |
90
+ | **redis** | `redis:7-alpine` | nội bộ | Hàng đợi công việc (BullMQ) và caching (ioredis) |
91
+ | **minio** | `minio/minio` | `9000` (S3), `9001` (console) | Lưu trữ đối tượng tương thích S3 cho avatar và ảnh chụp màn hình |
92
+ | **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (web UI) | Nơi nhận email giao dịch cục bộ |
93
+
94
+ Các cổng nội bộ (mongo, redis) không được phơi bày ra host theo mặc định.
95
+
96
+ > Cổng MinIO `9000` phải có thể truy cập được bởi trình duyệt vì các tài sản được tải lên (avatars, ảnh chụp màn hình) được tải trực tiếp từ `S3_PUBLIC_URL=http://localhost:9000/intlayer`.
97
+
98
+ ---
99
+
100
+ ## Các biến môi trường
101
+
102
+ Trình cài đặt tạo ra một file `.env` sẵn sàng để sử dụng. Bảng dưới đây mô tả từng biến.
103
+
104
+ ### Bắt buộc (tự động tạo hoặc được nhắc nhở)
105
+
106
+ | Biến | Ví dụ | Mô tả |
107
+ | ---------------------- | ----------------------------------------------- | ------------------------------------------------- |
108
+ | `NODE_ENV` | `production` | Môi trường runtime |
109
+ | `PORT` | `3100` | Cổng lắng nghe của Backend |
110
+ | `BACKEND_URL` | `http://localhost:3100` | URL công khai của API backend |
111
+ | `APP_URL` | `http://localhost:3000` | URL công khai của dashboard |
112
+ | `DOMAIN` | `localhost` | Miền cookie |
113
+ | `MONGODB_URI` | `mongodb://mongo:27017/intlayer?replicaSet=rs0` | URI kết nối MongoDB đầy đủ |
114
+ | `REDIS_URL` | `redis://redis:6379` | URL kết nối Redis |
115
+ | `BETTER_AUTH_SECRET` | _(được tạo)_ | Secret 32-byte để ký session |
116
+ | `MAIL_PROVIDER` | `smtp` | Phương thức gửi mail: `smtp` hoặc `resend` |
117
+ | `MAIL_SMTP_HOST` | `mailpit` | Tên host SMTP (tên container Mailpit) |
118
+ | `MAIL_SMTP_PORT` | `1025` | Cổng SMTP |
119
+ | `MAIL_FROM` | `Intlayer <no-reply@localhost>` | Địa chỉ người gửi |
120
+ | `S3_ENDPOINT` | `http://minio:9000` | Endpoint tương thích S3 |
121
+ | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | URL công khai để trình duyệt tải tài sản |
122
+ | `S3_BUCKET_NAME` | `intlayer` | Tên bucket |
123
+ | `S3_ACCESS_KEY_ID` | _(được tạo)_ | Khóa truy cập MinIO |
124
+ | `S3_SECRET_ACCESS_KEY` | _(được tạo)_ | Khóa bí mật MinIO |
125
+ | `VITE_BACKEND_URL` | `http://localhost:3100` | URL backend được tích hợp vào dashboard khi build |
126
+ | `VITE_DOMAIN` | `localhost` | Miền được tích hợp vào dashboard khi build |
127
+
128
+ ### Tùy chọn (tính năng sẽ suy giảm khi không có)
129
+
130
+ | Biến | Tính năng |
131
+ | -------------------------------------------------------- | -------------------------------------------------------------- |
132
+ | `OPENAI_API_KEY` | Dịch thuật và kiểm tra nội dung có sự hỗ trợ của AI |
133
+ | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_*` | Quản lý thanh toán và đăng ký |
134
+ | `RESEND_API_KEY` | Email giao dịch qua Resend (ghi đè Mailpit khi được thiết lập) |
135
+ | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | Đăng nhập GitHub OAuth |
136
+ | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Đăng nhập Google OAuth |
137
+ | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | Đăng nhập GitLab OAuth |
138
+ | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Đăng nhập Microsoft OAuth |
139
+ | `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` | Đăng nhập LinkedIn OAuth |
140
+ | `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET` | Đăng nhập Atlassian OAuth |
141
+
142
+ ---
143
+
144
+ ## Kết nối dự án Intlayer của bạn
145
+
146
+ Khi stack đang chạy, hãy trỏ dự án của bạn đến backend và dashboard được tự host thay vì `intlayer.org`.
147
+
148
+ ### Cấu hình dự án
149
+
150
+ ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
151
+ import type { IntlayerConfig } from "intlayer";
152
+
153
+ const config: IntlayerConfig = {
154
+ editor: {
155
+ clientId: process.env.INTLAYER_CLIENT_ID,
156
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
157
+
158
+ /**
159
+ * URL của dashboard CMS được tự host.
160
+ * Mặc định: https://app.intlayer.org
161
+ */
162
+ cmsURL: process.env.INTLAYER_CMS_URL, // ví dụ: http://localhost:3000
163
+
164
+ /**
165
+ * URL của API backend được tự host.
166
+ * Mặc định: https://back.intlayer.org
167
+ */
168
+ backendURL: process.env.INTLAYER_BACKEND_URL, // ví dụ: http://localhost:3100
169
+ },
170
+ };
171
+
172
+ export default config;
173
+ ```
174
+
175
+ Thiết lập các biến môi trường trong file `.env` của dự án bạn:
176
+
177
+ ```sh
178
+ INTLAYER_CMS_URL=http://localhost:3000
179
+ INTLAYER_BACKEND_URL=http://localhost:3100
180
+ INTLAYER_CLIENT_ID=<your-client-id>
181
+ INTLAYER_CLIENT_SECRET=<your-client-secret>
182
+ ```
183
+
184
+ Tạo thông tin truy cập trong dashboard được tự host của bạn dưới mục **Projects → Access keys** tại `http://localhost:3000/projects`.
185
+
186
+ ### SDK `@intlayer/api`
187
+
188
+ Khi sử dụng SDK `@intlayer/api` theo cách lập trình, hãy truyền `backendURL` một cách rõ ràng:
189
+
190
+ ```typescript fileName="cms.ts" codeFormat="typescript"
191
+ import { createIntlayerCMS } from "@intlayer/api";
192
+ import { dictionaryEndpoint } from "@intlayer/api/dictionary";
193
+
194
+ const cms = createIntlayerCMS({
195
+ editor: {
196
+ clientId: process.env.INTLAYER_CLIENT_ID,
197
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
198
+ backendURL: process.env.INTLAYER_BACKEND_URL, // http://localhost:3100
199
+ },
200
+ });
201
+
202
+ const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
203
+ ```
204
+
205
+ ---
206
+
207
+ ## Nâng cấp
208
+
209
+ Chạy lại trình cài đặt trên một triển khai hiện có sẽ thực hiện nâng cấp cuốn chiếu (rolling upgrade):
210
+
211
+ ```sh
212
+ curl -fsSL https://intlayer.org/install.sh | sh
213
+ ```
214
+
215
+ Thao tác này sẽ kéo các image mới nhất và khởi động lại các container với `docker compose pull && docker compose up -d`. Các volume hiện có (`mongo-data`, `redis-data`, `minio-data`) được bảo toàn — không mất dữ liệu.
216
+
217
+ Để nâng cấp thủ công từ bên trong thư mục `./intlayer/`:
218
+
219
+ ```sh
220
+ docker compose pull
221
+ docker compose up -d
222
+ ```
223
+
224
+ ---
225
+
226
+ ## Sao lưu và phục hồi
227
+
228
+ Tất cả dữ liệu bền vững nằm trong ba Docker volume được đặt tên.
229
+
230
+ ### Sao lưu
231
+
232
+ ```sh
233
+ docker run --rm \
234
+ -v intlayer_mongo-data:/data \
235
+ -v "$(pwd)":/backup \
236
+ busybox tar czf /backup/mongo-data.tar.gz /data
237
+
238
+ docker run --rm \
239
+ -v intlayer_redis-data:/data \
240
+ -v "$(pwd)":/backup \
241
+ busybox tar czf /backup/redis-data.tar.gz /data
242
+
243
+ docker run --rm \
244
+ -v intlayer_minio-data:/data \
245
+ -v "$(pwd)":/backup \
246
+ busybox tar czf /backup/minio-data.tar.gz /data
247
+ ```
248
+
249
+ ### Phục hồi
250
+
251
+ ```sh
252
+ docker run --rm \
253
+ -v intlayer_mongo-data:/data \
254
+ -v "$(pwd)":/backup \
255
+ busybox tar xzf /backup/mongo-data.tar.gz -C /
256
+
257
+ # Lặp lại cho redis-data và minio-data
258
+ ```
259
+
260
+ ---
261
+
262
+ ## Sử dụng reverse proxy (Nginx / Caddy)
263
+
264
+ Đối với các triển khai production, hãy đặt một reverse proxy phía trước các container app và backend thay vì phơi bày chúng trực tiếp.
265
+
266
+ ### Ví dụ Nginx
267
+
268
+ ```nginx
269
+ server {
270
+ listen 80;
271
+ server_name cms.example.com;
272
+
273
+ location / {
274
+ proxy_pass http://localhost:3000;
275
+ proxy_set_header Host $host;
276
+ proxy_set_header X-Real-IP $remote_addr;
277
+ }
278
+ }
279
+
280
+ server {
281
+ listen 80;
282
+ server_name api.example.com;
283
+
284
+ location / {
285
+ proxy_pass http://localhost:3100;
286
+ proxy_set_header Host $host;
287
+ proxy_set_header X-Real-IP $remote_addr;
288
+ }
289
+ }
290
+ ```
291
+
292
+ Cập nhật các biến `.env` sau để khớp với các miền công khai của bạn:
293
+
294
+ ```sh
295
+ BACKEND_URL=https://api.example.com
296
+ APP_URL=https://cms.example.com
297
+ DOMAIN=example.com
298
+ VITE_BACKEND_URL=https://api.example.com
299
+ VITE_DOMAIN=example.com
300
+ ```
301
+
302
+ > Các biến `VITE_*` được tích hợp vào image dashboard tại thời điểm build. Nếu bạn thay đổi chúng sau khi image được build, bạn cần build lại image `app` (`docker compose build app`) hoặc sử dụng cấu hình runtime injection.
303
+
304
+ ---
305
+
306
+ ## Khắc phục sự cố
307
+
308
+ ### Backend bị crash-loop khi khởi động lần đầu
309
+
310
+ MongoDB và Redis phải hoạt động tốt trước khi backend khởi động. File compose sử dụng `depends_on` với `condition: service_healthy`. Nếu bạn thấy backend khởi động lại liên tục, hãy kiểm tra xem healthcheck của `mongo` và `redis` có vượt qua không:
311
+
312
+ ```sh
313
+ docker compose ps
314
+ docker compose logs mongo
315
+ docker compose logs redis
316
+ ```
317
+
318
+ ### Dashboard không thể kết nối tới API
319
+
320
+ Xác minh rằng `VITE_BACKEND_URL` khớp với URL mà backend có thể truy cập được từ **trình duyệt** (không phải mạng Docker). Nếu bạn đã thay đổi cổng backend hoặc thêm reverse proxy, hãy build lại image dashboard:
321
+
322
+ ```sh
323
+ docker compose build app
324
+ docker compose up -d app
325
+ ```
326
+
327
+ ### Email không gửi được
328
+
329
+ Theo mặc định, tất cả email gửi đi được Mailpit thu nhận. Mở `http://localhost:8025` để xem các tin nhắn đã gửi. Để gửi email thật, hãy đặt `MAIL_PROVIDER=resend` và `RESEND_API_KEY=<your-key>` trong `.env`, sau đó khởi động lại backend:
330
+
331
+ ```sh
332
+ docker compose restart backend
333
+ ```
334
+
335
+ ### Thiếu MinIO bucket
336
+
337
+ Nếu dịch vụ một lần chạy `minio-init` không chạy (hoặc chạy trước khi MinIO sẵn sàng), hãy tạo bucket thủ công:
338
+
339
+ ```sh
340
+ docker compose run --rm minio-init
341
+ ```
342
+
343
+ ---
344
+
345
+ ## Các liên kết hữu ích
346
+
347
+ - [Tài liệu Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_CMS.md)
348
+ - [Tham chiếu cấu hình](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/configuration.md)
349
+ - [CMS SDK — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2026-06-14
3
- updatedAt: 2026-06-26
3
+ updatedAt: 2026-06-29
4
4
  title: New Intlayer v9 - What's new?
5
5
  description: Discover what's new in Intlayer v9. Introducing drop-in compatibility packages for popular i18n libraries and support for Collections and Variants.
6
6
  keywords:
@@ -9,6 +9,7 @@ keywords:
9
9
  - Migration
10
10
  - Collections
11
11
  - Variants
12
+ - CMS SDK
12
13
  - i18next
13
14
  - next-intl
14
15
  - vue-i18n
@@ -295,6 +296,34 @@ npm install intlayer react-native-intlayer
295
296
 
296
297
  ---
297
298
 
299
+ ## CMS SDK:将 Intlayer 用作无头内容数据库
300
+
301
+ Intlayer v9 在 `@intlayer/api` 中提供了一个简洁、自动鉴权的 SDK,用于以编程方式与 CMS 交互——获取项目、获取字典,以及从你自己的服务器、脚本或 CI 推送或更新它们。鉴权(OAuth2 `client_credentials`)会自动处理并刷新。
302
+
303
+ SDK 拆分为**两个独立的导入**,因此你的打包产物只包含你实际使用的领域:
304
+
305
+ 1. `createIntlayerCMS` —— 一个轻量的**鉴权器**,持有凭据和受管理的令牌(不打包任何领域客户端)。
306
+ 2. `dictionaryEndpoint`、`projectEndpoint`、… —— 按领域划分的**端点绑定器**,各自从其独立子路径导入。
307
+
308
+ ```ts fileName="cms.ts"
309
+ import { createIntlayerCMS } from "@intlayer/api";
310
+ import { dictionaryEndpoint } from "@intlayer/api/dictionary";
311
+
312
+ // 配置是可选的:凭据会回退到 INTLAYER_CLIENT_ID /
313
+ // INTLAYER_CLIENT_SECRET(由 `@intlayer/config/built` 解析)。
314
+ const cms = createIntlayerCMS();
315
+
316
+ // 读取
317
+ const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
318
+
319
+ // 写入 —— 像数据库一样使用 CMS
320
+ await dictionaryEndpoint(cms).pushDictionaries([myDictionary]);
321
+ ```
322
+
323
+ > 安全:CMS 凭据授予对内容的写入权限。务必只在**服务端**创建鉴权器——切勿将 `clientId` / `clientSecret` 发送到浏览器。
324
+
325
+ ---
326
+
298
327
  ## Migration notes from v8
299
328
 
300
329
  If you are upgrading from v8, note that the v9 does not include breaking changes. But here are the key changes:
@@ -310,3 +339,4 @@ If you are upgrading from v8, note that the v9 does not include breaking changes
310
339
  - [Compat Adapter Packages Guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/index.md)
311
340
  - [Dynamic Dictionaries - Collections & Variants](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dynamic_dictionaries/index.md)
312
341
  - [Configuration Reference](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md)
342
+ - [CMS SDK - 通过 @intlayer/api 进行编程访问](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_CMS.md)