@intlayer/docs 8.10.0-canary.0 → 8.10.0-canary.1

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.
@@ -2,7 +2,7 @@
2
2
  createdAt: 2025-02-07
3
3
  updatedAt: 2026-05-19
4
4
  title: Markdown
5
- description: Tìm hiểu cách khai báo và sử dụng nội dung Markdown trên trang web đa ngôn ngữ của bạn với Intlayer. Làm theo các bước trong tài liệu trực tuyến này để tích hợp Markdown một cách liền mạch vào dự án của bạn.
5
+ description: Tìm hiểu cách khai báo và sử dụng nội dung Markdown trong trang web đa ngôn ngữ của bạn với Intlayer. Làm theo các bước trong tài liệu trực tuyến này để tích hợp Markdown một cách liền mạch vào dự án của bạn.
6
6
  keywords:
7
7
  - Markdown
8
8
  - Quốc tế hóa
@@ -22,38 +22,38 @@ history:
22
22
  changes: "Thêm hỗ trợ cho các tệp `.content.md`"
23
23
  - version: 8.5.0
24
24
  date: 2026-03-24
25
- changes: "Add `intlayerMarkdown` plugin object; use `app.use(intlayerMarkdown)` instead of `app.use(installIntlayerMarkdown)`"
25
+ changes: "Thêm đối tượng plugin `intlayerMarkdown`; sử dụng `app.use(intlayerMarkdown)` thay `app.use(installIntlayerMarkdown)`"
26
26
  - version: 8.5.0
27
27
  date: 2026-03-24
28
- changes: "move import from `{{framework}}-intlayer` to `{{framework}}-intlayer/markdown`"
28
+ changes: "Di chuyển import từ `{{framework}}-intlayer` sang `{{framework}}-intlayer/markdown`"
29
29
  - version: 8.0.0
30
30
  date: 2026-01-22
31
- changes: "Thêm MarkdownRenderer / useMarkdownRenderer / tiện ích renderMarkdown và tùy chọn forceInline"
31
+ changes: "Thêm tiện ích MarkdownRenderer / useMarkdownRenderer / renderMarkdown và tùy chọn forceInline"
32
32
  - version: 8.0.0
33
33
  date: 2026-01-18
34
- changes: "Tự động trang trí nội dung markdown, hỗ trợ MDX và SSR"
34
+ changes: "Trang trí tự động nội dung markdown, hỗ trợ MDX và SSR"
35
35
  - version: 5.5.10
36
36
  date: 2025-06-29
37
37
  changes: "Khởi tạo lịch sử"
38
38
  ---
39
39
 
40
- # Markdown / Nội dung văn bản đa dạng
40
+ # Markdown / Nội dung Rich Text
41
41
 
42
- Intlayer hỗ trợ nội dung văn bản đa dạng được định nghĩa bằng cú pháp Markdown. Điều này cho phép bạn dễ dàng viết và duy trì nội dung với định dạng phong phú, chẳng hạn như blog, bài viết, và nhiều hơn nữa.
42
+ Intlayer hỗ trợ nội dung rich text được định nghĩa bằng cú pháp Markdown. Điều này cho phép bạn dễ dàng viết và duy trì nội dung được định dạng phong phú như blog, bài viết, và hơn thế nữa.
43
43
 
44
- ## Khai báo nội dung Markdown
44
+ ## Khai báo Nội dung Markdown
45
45
 
46
- Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn giản là một chuỗi (nếu nó chứa cú pháp Markdown).
46
+ Bạn có thể khai báo nội dung Markdown bằng cách sử dụng hàm `md` hoặc đơn giản là một chuỗi (nếu nó chứa cú pháp Markdown).
47
47
 
48
48
  <Tabs>
49
49
  <Tab label=".content.md" value=".content.md">
50
- Kể từ phiên bản `8.10.0`, bạn có thể khai báo nội dung Markdown trực tiếp trong các tệp `.content.md`. Intlayer sẽ tự động phát hiện và phân tích cú pháp nội dung Markdown.
50
+ Bắt đầu từ phiên bản `8.10.0`, bạn có thể khai báo nội dung Markdown trực tiếp trong các tệp `.content.md`. Intlayer sẽ tự động phát hiện và phân tích nội dung Markdown.
51
51
 
52
- ```md fileName="markdown-file.vi.content.md"
52
+ ```md fileName="markdown-file.en.content.md"
53
53
  ---
54
54
  key: my-markdown-content
55
55
  description: Nội dung của tôi
56
- locale: vi
56
+ locale: en
57
57
  ---
58
58
 
59
59
  # Nội dung của tôi
@@ -61,7 +61,7 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
61
61
  Dưới đây là một ví dụ về nội dung markdown
62
62
  ```
63
63
 
64
- Trường frontmatter `locale` xác định ngôn ngữ (locale) của nội dung. Trường này là tùy chọn. Nếu không được cung cấp, Intlayer sẽ sử dụng ngôn ngữ mặc định, ngôn ngữ này cũng được sử dụng làm ngôn ngữ dự phòng (fallback) nếu không có bản dịch nào cho một ngôn ngữ cụ thể.
64
+ Trường front-matter `locale` là trường xác định ngôn ngữ của nội dung. là tùy chọn. Nếu không được cung cấp, Intlayer sẽ sử dụng ngôn ngữ mặc định, ngôn ngữ này cũng được sử dụng làm ngôn ngữ dự phòng nếu không có bản dịch cho một ngôn ngữ cụ thể.
65
65
 
66
66
  Ví dụ về cấu trúc tệp:
67
67
 
@@ -75,11 +75,11 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
75
75
  └── markdown-file.es.content.md
76
76
  ```
77
77
 
78
- Bạn có thể thêm vào front-matter bất kỳ thuộc tính nào được định nghĩa trong [Định nghĩa từ điển (Dictionary definition)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md)
78
+ Bạn có thể thêm vào front-matter bất kỳ thuộc tính nào được định nghĩa trong [Định nghĩa Từ điển](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md)
79
79
 
80
80
  </Tab>
81
- <Tab label="Bọc thủ công">
82
- Sử dụng hàm `md` để khai báo rõ ràng nội dung Markdown. Điều này hữu ích nếu bạn muốn đảm bảo một chuỗi được coi Markdown ngay cả khi nó không chứa cú pháp rõ ràng.
81
+ <Tab label="Bao bọc Thủ công" value="manual-wrapping">
82
+ Sử dụng hàm `md` để khai báo rõ ràng nội dung Markdown. Điều này rất hữu ích nếu bạn muốn đảm bảo một chuỗi được xử như Markdown ngay cả khi nó không chứa cú pháp rõ ràng.
83
83
 
84
84
  ```typescript fileName="markdownDictionary.content.ts"
85
85
  import { md, type Dictionary } from "intlayer";
@@ -87,7 +87,7 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
87
87
  const markdownDictionary = {
88
88
  key: "app",
89
89
  content: {
90
- myMarkdownContent: md("## My title \n\nLorem Ipsum"),
90
+ myMarkdownContent: md("## Tiêu đề của tôi \n\nLorem Ipsum"),
91
91
  },
92
92
  } satisfies Dictionary;
93
93
 
@@ -95,22 +95,23 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
95
95
  ```
96
96
 
97
97
  </Tab>
98
- <Tab label="Phát hiện tự động" value="automatic-detection">
99
- Nếu chuỗi chứa các dấu hiệu Markdown phổ biến (như tiêu đề, danh sách, liên kết, v.v.), Intlayer sẽ tự động chuyển đổi nó.
98
+ <Tab label="Phát hiện Tự động" value="automatic-detection">
99
+ Nếu chuỗi chứa các chỉ báo Markdown phổ biến (như tiêu đề, danh sách, liên kết, v.v.), Intlayer sẽ tự động chuyển đổi nó.
100
100
 
101
101
  ```typescript fileName="markdownDictionary.content.ts"
102
102
  export default {
103
103
  key: "app",
104
- contentAutoTransformation: true, // Bật tính năng tự động phát hiện nội dung Markdown - Có thể thiết lập toàn cục trong intlayer.config.ts
104
+ contentAutoTransformation: true, // Bật phát hiện tự động nội dung Markdown - Có thể được đặt toàn cục trong intlayer.config.ts
105
105
  content: {
106
- myMarkdownContent: "## My title \n\nLorem Ipsum",
106
+ myMarkdownContent: "## Tiêu đề của tôi \n\nLorem Ipsum",
107
107
  },
108
108
  };
109
109
  ```
110
110
 
111
111
  </Tab>
112
- <Tab label="Tệp bên ngoài">
113
- Nhập trực tiếp các tệp `.md` bằng hàm `file`.
112
+
113
+ <Tab label="Tệp Bên ngoài" value="external-files">
114
+ Nhập trực tiếp các tệp `.md` bằng cách sử dụng hàm `file`.
114
115
 
115
116
  ```typescript fileName="markdownDictionary.content.ts"
116
117
  import { md, file, t } from "intlayer";
@@ -120,7 +121,7 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
120
121
  content: {
121
122
  content: t({
122
123
  en: md(file("./myMarkdown.en.md")),
123
- fr: md(file("./myMarkdown.fr.md")),
124
+ vi: md(file("./myMarkdown.vi.md")),
124
125
  }),
125
126
  },
126
127
  };
@@ -133,36 +134,72 @@ Bạn có thể khai báo nội dung Markdown bằng hàm `md` hoặc đơn gi
133
134
 
134
135
  ## Render Markdown
135
136
 
136
- Việc kết xuất có thể được xử lý tự động bởi hệ thống nội dung của Intlayer hoặc thực hiện thủ công bằng các công cụ chuyên dụng.
137
+ Intlayer cung cấp hai cách độc lập để render Markdown:
138
+
139
+ 1. **Thông qua `useIntlayer`**
140
+ — Intlayer tự động chuyển đổi node `md` thành đầu ra nguyên bản của framework (JSX, VNode, chuỗi HTML).
141
+ - Frontmatter được phân tích cú pháp và hiển thị dưới dạng `.metadata`. Bạn có thể ghi đè quá trình render ở hai cấp độ — toàn cục với `MarkdownProvider` (hoặc tương đương trong framework) và cục bộ trên mỗi node bằng `.use()`. Cả hai đều có thể được kết hợp; `.use()` được ưu tiên hơn `MarkdownProvider`, và `MarkdownProvider` được ưu tiên hơn mặc định.
137
142
 
138
- ### 1. Kết xuất tự động (sử dụng `useIntlayer`)
143
+ 2. **Các tiện ích hỗ trợ** — `<MarkdownRenderer />`, `useMarkdownRenderer()`, `renderMarkdown()` là các công cụ độc lập chấp nhận **chỉ các chuỗi Markdown thô**. Chúng độc lập với `useIntlayer` và không hoạt động với các node được trang trí mà nó trả về.
139
144
 
140
- Khi bạn truy cập nội dung qua `useIntlayer`, các node Markdown đã sẵn sàng để kết xuất.
145
+ Render Markdown hỗ trợ **MDX** sử dụng bất kỳ component JSX/framework nào bằng tên trực tiếp bên trong Markdown của bạn.
146
+
147
+ ### 1. Render Tự động (thông qua `useIntlayer`)
141
148
 
142
149
  <Tabs group="framework">
143
150
  <Tab label="React / Next.js" value="react">
144
- Các node Markdown có thể được kết xuất trực tiếp dưới dạng JSX.
151
+ Các node Markdown có thể được render trực tiếp dưới dạng JSX.
145
152
 
146
153
  ```tsx fileName="App.tsx"
147
154
  import { useIntlayer } from "react-intlayer";
155
+ import { MarkdownProvider } from "react-intlayer/markdown";
148
156
 
149
157
  const AppContent = () => {
150
158
  const { myMarkdownContent } = useIntlayer("app");
159
+
151
160
  return <div>{myMarkdownContent}</div>;
152
161
  };
162
+
163
+ const App = () => (
164
+ <MarkdownProvider
165
+ components={{
166
+ h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
167
+ MyButton: (props) => <button {...props} />, // Component MDX
168
+ }}
169
+ >
170
+ <AppContent />
171
+ </MarkdownProvider>
172
+ );
153
173
  ```
154
174
 
155
- Bạn cũngthể cung cấp các ghi đè (overrides) cục bộ cho các node cụ thể bằng phương thức `.use()`:
175
+ > Nếu không `MarkdownProvider`, Intlayer sẽ render markdown bằng cách sử dụng trình phân tích pháp Markdown sang JSX mặc định.
176
+
177
+ Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
156
178
 
157
179
  ```tsx
158
180
  {myMarkdownContent.use({
159
- h1: ({ children }) => <h1 className="text-3xl font-bold">{children}</h1>,
181
+ h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
160
182
  })}
161
183
  ```
162
184
 
185
+ Bạn có thể lấy Markdown dưới dạng chuỗi:
186
+
187
+ ```tsx
188
+ {myMarkdownContent.value}
189
+ {String(myMarkdownContent)}
190
+ {myMarkdownContent.toString()}
191
+ ```
192
+
193
+ Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
194
+
195
+ ```tsx
196
+ {myMarkdownContent.metadata}
197
+ {myMarkdownContent.metadata.title}
198
+ ```
199
+
163
200
  </Tab>
164
201
  <Tab label="Vue" value="vue">
165
- Trong Vue, nội dung Markdown có thể được render bằng thành phần built-in `component` hoặc trực tiếp dưới dạng một node.
202
+ Trong Vue, nội dung Markdown có thể được render bằng thẻ `component` tích hợp sẵn hoặc trực tiếp như một node.
166
203
 
167
204
  ```vue fileName="App.vue"
168
205
  <script setup>
@@ -175,17 +212,83 @@ Khi bạn truy cập nội dung qua `useIntlayer`, các node Markdown đã sẵn
175
212
  </template>
176
213
  ```
177
214
 
215
+ Cấu hình toàn cục thông qua plugin `intlayerMarkdown` (hỗ trợ các component tùy chỉnh MDX):
216
+
217
+ ```ts fileName="main.ts"
218
+ import { intlayerMarkdown } from "vue-intlayer/markdown";
219
+
220
+ app.use(intlayerMarkdown, {
221
+ components: {
222
+ h1: (props) => h('h1', { style: { color: 'green' } }, props.children),
223
+ MyButton: (props) => h('button', props), // Component MDX
224
+ },
225
+ });
226
+ ```
227
+
228
+ > Nếu plugin `intlayerMarkdown` không được cài đặt, Intlayer sẽ render bằng trình biên dịch mặc định.
229
+
230
+ Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
231
+
232
+ ```vue
233
+ <component :is="myMarkdownContent.use({
234
+ h1: (props) => h('h1', { style: { color: 'red' } }, props.children),
235
+ })" />
236
+ ```
237
+
238
+ Bạn có thể lấy Markdown dưới dạng chuỗi:
239
+
240
+ ```vue
241
+ {{ myMarkdownContent.value }}
242
+ {{ String(myMarkdownContent) }}
243
+ {{ myMarkdownContent.toString() }}
244
+ ```
245
+
246
+ Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
247
+
248
+ ```vue
249
+ <component :is="myMarkdownContent.metadata" />
250
+ <component :is="myMarkdownContent.metadata.title" />
251
+ ```
252
+
178
253
  </Tab>
179
254
  <Tab label="Svelte" value="svelte">
180
- Svelte render Markdown dưới dạng chuỗi HTML theo mặc định. Sử dụng `{@html}` để render.
255
+ Svelte render Markdown thành một chuỗi HTML theo mặc định. Sử dụng `{@html}` để render nó.
181
256
 
182
- ```svelte
257
+ ```svelte fileName="App.svelte"
183
258
  <script lang="ts">
184
259
  import { useIntlayer } from "svelte-intlayer";
260
+ import { MarkdownProvider } from "svelte-intlayer/markdown";
261
+ import MyHeading from "./MyHeading.svelte";
262
+
185
263
  const content = useIntlayer("app");
186
264
  </script>
187
265
 
188
- {@html $content.myMarkdownContent}
266
+ <MarkdownProvider components={{ h1: MyHeading }}>
267
+ {@html $content.myMarkdownContent}
268
+ </MarkdownProvider>
269
+ ```
270
+
271
+ > Nếu không có `MarkdownProvider`, Intlayer sẽ render markdown bằng trình biên dịch mặc định.
272
+
273
+ Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
274
+
275
+ ```svelte
276
+ {@html $content.myMarkdownContent.use({ ... })}
277
+ ```
278
+
279
+ Bạn có thể lấy Markdown dưới dạng chuỗi:
280
+
281
+ ```svelte
282
+ {$content.myMarkdownContent.value}
283
+ {String($content.myMarkdownContent)}
284
+ {$content.myMarkdownContent.toString()}
285
+ ```
286
+
287
+ Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
288
+
289
+ ```svelte
290
+ {$content.myMarkdownContent.metadata}
291
+ {$content.myMarkdownContent.metadata.title}
189
292
  ```
190
293
 
191
294
  </Tab>
@@ -194,11 +297,48 @@ Khi bạn truy cập nội dung qua `useIntlayer`, các node Markdown đã sẵn
194
297
 
195
298
  ```tsx fileName="App.tsx"
196
299
  import { useIntlayer } from "preact-intlayer";
300
+ import { MarkdownProvider } from "preact-intlayer/markdown";
197
301
 
198
302
  const AppContent = () => {
199
303
  const { myMarkdownContent } = useIntlayer("app");
200
304
  return <div>{myMarkdownContent}</div>;
201
305
  };
306
+
307
+ const App = () => (
308
+ <MarkdownProvider
309
+ components={{
310
+ h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
311
+ MyButton: (props) => <button {...props} />, // Component MDX
312
+ }}
313
+ >
314
+ <AppContent />
315
+ </MarkdownProvider>
316
+ );
317
+ ```
318
+
319
+ > Nếu không có `MarkdownProvider`, Intlayer sẽ render markdown bằng trình phân tích cú pháp Markdown sang JSX mặc định.
320
+
321
+ Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
322
+
323
+ ```tsx
324
+ {myMarkdownContent.use({
325
+ h1: ({ children }) => <h1 style={{ color: "red" }}>{children}</h1>,
326
+ })}
327
+ ```
328
+
329
+ Bạn có thể lấy Markdown dưới dạng chuỗi:
330
+
331
+ ```tsx
332
+ {myMarkdownContent.value}
333
+ {String(myMarkdownContent)}
334
+ {myMarkdownContent.toString()}
335
+ ```
336
+
337
+ Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
338
+
339
+ ```tsx
340
+ {myMarkdownContent.metadata}
341
+ {myMarkdownContent.metadata.title}
202
342
  ```
203
343
 
204
344
  </Tab>
@@ -207,16 +347,53 @@ Khi bạn truy cập nội dung qua `useIntlayer`, các node Markdown đã sẵn
207
347
 
208
348
  ```tsx fileName="App.tsx"
209
349
  import { useIntlayer } from "solid-intlayer";
350
+ import { MarkdownProvider } from "solid-intlayer/markdown";
210
351
 
211
352
  const AppContent = () => {
212
353
  const { myMarkdownContent } = useIntlayer("app");
213
354
  return <div>{myMarkdownContent}</div>;
214
355
  };
356
+
357
+ const App = () => (
358
+ <MarkdownProvider
359
+ components={{
360
+ h1: (props) => <h1 style={{ color: "red" }}>{props.children}</h1>,
361
+ MyButton: (props) => <button {...props} />, // Component MDX
362
+ }}
363
+ >
364
+ <AppContent />
365
+ </MarkdownProvider>
366
+ );
367
+ ```
368
+
369
+ > Nếu không có `MarkdownProvider`, Intlayer sẽ render markdown bằng trình phân tích cú pháp Markdown sang JSX mặc định.
370
+
371
+ Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
372
+
373
+ ```tsx
374
+ {myMarkdownContent.use({
375
+ h1: (props) => <h1 style={{ color: "red" }}>{props.children}</h1>,
376
+ })}
377
+ ```
378
+
379
+ Bạn có thể lấy Markdown dưới dạng chuỗi:
380
+
381
+ ```tsx
382
+ {myMarkdownContent.value}
383
+ {String(myMarkdownContent)}
384
+ {myMarkdownContent.toString()}
385
+ ```
386
+
387
+ Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
388
+
389
+ ```tsx
390
+ {myMarkdownContent.metadata}
391
+ {myMarkdownContent.metadata.title}
215
392
  ```
216
393
 
217
394
  </Tab>
218
395
  <Tab label="Angular" value="angular">
219
- Angular sử dụng chỉ thị `[innerHTML]` để hiển thị nội dung Markdown.
396
+ Angular sử dụng chỉ thị `[innerHTML]` để render nội dung Markdown.
220
397
 
221
398
  ```typescript fileName="app.component.ts"
222
399
  import { Component } from "@angular/core";
@@ -231,7 +408,9 @@ Khi bạn truy cập nội dung qua `useIntlayer`, các node Markdown đã sẵn
231
408
  }
232
409
  ```
233
410
 
234
- Bạn cũng thể cung cấp các ghi đè (overrides) cục bộ cho các node cụ thể bằng phương thức `.use()`:
411
+ > Nếu provider IntlayerMarkdown không được cấu hình, Intlayer sẽ render bằng trình biên dịch mặc định.
412
+
413
+ Bạn cũng có thể cung cấp các ghi đè cục bộ cho các node cụ thể bằng phương thức `.use()`:
235
414
 
236
415
  ```typescript
237
416
  content().myMarkdownContent.use({
@@ -239,31 +418,46 @@ Khi bạn truy cập nội dung qua `useIntlayer`, các node Markdown đã sẵn
239
418
  })
240
419
  ```
241
420
 
421
+ Bạn có thể lấy Markdown dưới dạng chuỗi:
422
+
423
+ ```typescript
424
+ content().myMarkdownContent.value
425
+ String(content().myMarkdownContent)
426
+ content().myMarkdownContent.toString()
427
+ ```
428
+
429
+ Và bạn có thể truy cập siêu dữ liệu markdown của mình như sau:
430
+
431
+ ```typescript
432
+ content().myMarkdownContent.metadata
433
+ content().myMarkdownContent.metadata.title
434
+ ```
435
+
242
436
  </Tab>
243
437
  </Tabs>
244
438
 
245
- ### 2. Kết xuất Thủ công & Công cụ Nâng cao
439
+ ### 2. Các tiện ích hỗ trợ (Chỉ Chuỗi Markdown)
246
440
 
247
- Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiều hơn quá trình render, hãy sử dụng các công cụ sau.
441
+ Các tiện ích này **chỉ render các chuỗi Markdown thô** độc lập với `useIntlayer`. Hãy sử dụng chúng khi bạn cần render Markdown từ các nguồn khác ngoài từ điển của bạn.
248
442
 
249
443
  <Tabs group="framework">
250
444
  <Tab label="React / Next.js" value="react">
251
445
 
252
- #### Thành phần `<MarkdownRenderer />`
446
+ #### Component `<MarkdownRenderer />`
253
447
 
254
- Kết xuất một chuỗi Markdown với các tùy chọn cụ thể.
448
+ Render một chuỗi Markdown với các tùy chọn cụ thể.
255
449
 
256
450
  ```tsx
257
451
  import { MarkdownRenderer } from "react-intlayer/markdown";
258
452
 
259
453
  <MarkdownRenderer forceBlock={true} tagfilter={true}>
260
- {"# My Title"}
454
+ {"# Tiêu đề của tôi"}
261
455
  </MarkdownRenderer>
262
456
  ```
263
457
 
264
458
  #### Hook `useMarkdownRenderer()`
265
459
 
266
- Lấy một hàm renderer đã được cấu hình sẵn.
460
+ Nhận một hàm render đã được cấu hình trước.
267
461
 
268
462
  ```tsx
269
463
  import { useMarkdownRenderer } from "react-intlayer/markdown";
@@ -273,7 +467,7 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
273
467
  components: { h1: (props) => <h1 {...props} className="custom" /> }
274
468
  });
275
469
 
276
- return renderMarkdown("# My Title");
470
+ return renderMarkdown("# Tiêu đề của tôi");
277
471
  ```
278
472
 
279
473
  #### Tiện ích `renderMarkdown()`
@@ -282,13 +476,13 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
282
476
  ```tsx
283
477
  import { renderMarkdown } from "react-intlayer/markdown";
284
478
 
285
- const jsx = renderMarkdown("# My Title", { forceBlock: true });
479
+ const jsx = renderMarkdown("# Tiêu đề của tôi", { forceBlock: true });
286
480
  ```
287
481
 
288
482
  </Tab>
289
483
  <Tab label="Vue" value="vue">
290
484
 
291
- #### Thành phần `<MarkdownRenderer />`
485
+ #### Component `<MarkdownRenderer />`
292
486
 
293
487
  ```vue
294
488
  <script setup>
@@ -296,21 +490,21 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
296
490
  </script>
297
491
 
298
492
  <template>
299
- <MarkdownRenderer :forceBlock="true" content="# My Title" />
493
+ <MarkdownRenderer :forceBlock="true" content="# Tiêu đề của tôi" />
300
494
  </template>
301
495
  ```
302
496
 
303
497
  </Tab>
304
498
  <Tab label="Svelte" value="svelte">
305
499
 
306
- #### Thành phần `<MarkdownRenderer />`
500
+ #### Component `<MarkdownRenderer />`
307
501
 
308
502
  ```svelte
309
503
  <script lang="ts">
310
504
  import { MarkdownRenderer } from "svelte-intlayer/markdown";
311
505
  </script>
312
506
 
313
- <MarkdownRenderer forceBlock={true} value="# My Title" />
507
+ <MarkdownRenderer forceBlock={true} value="# Tiêu đề của tôi" />
314
508
  ```
315
509
 
316
510
  #### Hook `useMarkdownRenderer()`
@@ -321,7 +515,7 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
321
515
  const render = useMarkdownRenderer();
322
516
  </script>
323
517
 
324
- {@html render("# My Title")}
518
+ {@html render("# Tiêu đề của tôi")}
325
519
  ```
326
520
 
327
521
  #### Tiện ích `renderMarkdown()`
@@ -331,18 +525,18 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
331
525
  import { renderMarkdown } from "svelte-intlayer/markdown";
332
526
  </script>
333
527
 
334
- {@html renderMarkdown("# My Title")}
528
+ {@html renderMarkdown("# Tiêu đề của tôi")}
335
529
  ```
336
530
 
337
531
  </Tab>
338
532
  <Tab label="Preact" value="preact">
339
- #### Thành phần `<MarkdownRenderer />`
533
+ #### Component `<MarkdownRenderer />`
340
534
 
341
535
  ```tsx
342
536
  import { MarkdownRenderer } from "preact-intlayer/markdown";
343
537
 
344
538
  <MarkdownRenderer forceBlock={true}>
345
- {"# My Title"}
539
+ {"# Tiêu đề của tôi"}
346
540
  </MarkdownRenderer>
347
541
  ```
348
542
 
@@ -353,7 +547,7 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
353
547
 
354
548
  const render = useMarkdownRenderer();
355
549
 
356
- return <div>{render("# My Title")}</div>;
550
+ return <div>{render("# Tiêu đề của tôi")}</div>;
357
551
  ```
358
552
 
359
553
  #### Tiện ích `renderMarkdown()`
@@ -361,18 +555,18 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
361
555
  ```tsx
362
556
  import { renderMarkdown } from "preact-intlayer/markdown";
363
557
 
364
- return <div>{renderMarkdown("# My Title")}</div>;
558
+ return <div>{renderMarkdown("# Tiêu đề của tôi")}</div>;
365
559
  ```
366
560
 
367
561
  </Tab>
368
562
  <Tab label="Solid" value="solid">
369
- #### Thành phần `<MarkdownRenderer />`
563
+ #### Component `<MarkdownRenderer />`
370
564
 
371
565
  ```tsx
372
566
  import { MarkdownRenderer } from "solid-intlayer/markdown";
373
567
 
374
568
  <MarkdownRenderer forceBlock={true}>
375
- {"# My Title"}
569
+ {"# Tiêu đề của tôi"}
376
570
  </MarkdownRenderer>
377
571
  ```
378
572
 
@@ -383,7 +577,7 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
383
577
 
384
578
  const render = useMarkdownRenderer();
385
579
 
386
- return <div>{render("# My Title")}</div>;
580
+ return <div>{render("# Tiêu đề của tôi")}</div>;
387
581
  ```
388
582
 
389
583
  #### Tiện ích `renderMarkdown()`
@@ -391,16 +585,16 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
391
585
  ```tsx
392
586
  import { renderMarkdown } from "solid-intlayer/markdown";
393
587
 
394
- return <div>{renderMarkdown("# My Title")}</div>;
588
+ return <div>{renderMarkdown("# Tiêu đề của tôi")}</div>;
395
589
  ```
396
590
 
397
591
  </Tab>
398
592
  <Tab label="Angular" value="angular">
399
- #### Dịch vụ `IntlayerMarkdownService`
400
- Render một chuỗi Markdown bằng cách sử dụng dịch vụ.
593
+ #### Service `IntlayerMarkdownService`
594
+ Render một chuỗi Markdown sử dụng service.
401
595
 
402
596
  ```typescript
403
- import { IntlayerMarkdownService } from "angular-intlayer";
597
+ import { IntlayerMarkdownService } from "angular-intlayer/markdown";
404
598
 
405
599
  export class MyComponent {
406
600
  constructor(private markdownService: IntlayerMarkdownService) {}
@@ -416,9 +610,9 @@ Nếu bạn cần render chuỗi Markdown thô hoặc muốn kiểm soát nhiề
416
610
 
417
611
  ---
418
612
 
419
- ## Cấu hình toàn cục với `MarkdownProvider`
613
+ ## Cấu hình Toàn cục với `MarkdownProvider`
420
614
 
421
- Bạn thể cấu hình cách render Markdown ở mức toàn cục cho toàn bộ ứng dụng của mình. Điều này giúp tránh việc truyền các prop giống nhau cho mọi renderer.
615
+ `MarkdownProvider` (hoặc tương đương trong framework) cấu hình pipeline render Markdown cho toàn bộ ứng dụng của bạn. Điều này áp dụng cho cả render `useIntlayer` tự động và các tiện ích hỗ trợ. Các tùy chọn được đặt ở đây là mặc định — `.use()` sẽ ghi đè chúng ở cấp độ node.
422
616
 
423
617
  <Tabs group="framework">
424
618
  <Tab label="React / Next.js" value="react">
@@ -429,8 +623,28 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
429
623
  export const AppProvider = ({ children }) => (
430
624
  <MarkdownProvider
431
625
  components={{
432
- h1: ({ children }) => <h1 className="text-2xl font-bold">{children}</h1>,
433
- a: ({ href, children }) => <Link to={href}>{children}</Link>,
626
+ h1: (props) => <h1 style={{color: 'green'}} {...props} />,
627
+ a: ({ href, ...props }) => <a style={{color: 'red'}} {...props} />,
628
+ MyCustomJSXComponent: (props) => <span style={{color: 'red'}} {...props} />,
629
+ }}
630
+ >
631
+ {children}
632
+ </MarkdownProvider>
633
+ );
634
+ ```
635
+
636
+ > Hỗ trợ MDX — bất kỳ tên component nào được sử dụng bên trong Markdown của bạn (ví dụ: `<MyCustomJSXComponent />`) đều được phân giải dựa trên bản đồ `components`.
637
+
638
+ Bạn cũng có thể sử dụng trình render markdown của riêng mình:
639
+
640
+ ```tsx fileName="AppProvider.tsx"
641
+ import { MarkdownProvider } from "react-intlayer/markdown";
642
+
643
+ export const AppProvider = ({ children }) => (
644
+ <MarkdownProvider
645
+ renderMarkdown={async (md) => {
646
+ const { renderMarkdown } = await import('react-intlayer/markdown');
647
+ return renderMarkdown(md);
434
648
  }}
435
649
  >
436
650
  {children}
@@ -438,6 +652,8 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
438
652
  );
439
653
  ```
440
654
 
655
+ > Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
656
+
441
657
  </Tab>
442
658
  <Tab label="Vue" value="vue">
443
659
 
@@ -463,6 +679,29 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
463
679
  app.mount("#app");
464
680
  ```
465
681
 
682
+ Bạn cũng có thể sử dụng trình render markdown của riêng mình:
683
+
684
+ ```typescript fileName="main.ts"
685
+ import { createApp } from "vue";
686
+ import { intlayer } from "vue-intlayer";
687
+ import { intlayerMarkdown } from "vue-intlayer/markdown";
688
+ import App from "./App.vue";
689
+
690
+ const app = createApp(App);
691
+
692
+ app.use(intlayer);
693
+ app.use(intlayerMarkdown, {
694
+ renderMarkdown: async (md) => {
695
+ const { renderMarkdown } = await import('vue-intlayer/markdown');
696
+ return renderMarkdown(md);
697
+ },
698
+ });
699
+
700
+ app.mount("#app");
701
+ ```
702
+
703
+ > Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
704
+
466
705
  </Tab>
467
706
  <Tab label="Svelte" value="svelte">
468
707
 
@@ -481,6 +720,25 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
481
720
  </MarkdownProvider>
482
721
  ```
483
722
 
723
+ Bạn cũng có thể sử dụng trình render markdown của riêng mình:
724
+
725
+ ```svelte fileName="App.svelte"
726
+ <script lang="ts">
727
+ import { MarkdownProvider } from "svelte-intlayer/markdown";
728
+ </script>
729
+
730
+ <MarkdownProvider
731
+ renderMarkdown={async (md) => {
732
+ const { renderMarkdown } = await import('svelte-intlayer/markdown');
733
+ return renderMarkdown(md);
734
+ }}
735
+ >
736
+ <slot />
737
+ </MarkdownProvider>
738
+ ```
739
+
740
+ > Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
741
+
484
742
  </Tab>
485
743
  <Tab label="Preact" value="preact">
486
744
 
@@ -498,6 +756,25 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
498
756
  );
499
757
  ```
500
758
 
759
+ Bạn cũng có thể sử dụng trình render markdown của riêng mình:
760
+
761
+ ```tsx fileName="AppProvider.tsx"
762
+ import { MarkdownProvider } from "preact-intlayer/markdown";
763
+
764
+ export const AppProvider = ({ children }) => (
765
+ <MarkdownProvider
766
+ renderMarkdown={async (md) => {
767
+ const { renderMarkdown } = await import('preact-intlayer/markdown');
768
+ return renderMarkdown(md);
769
+ }}
770
+ >
771
+ {children}
772
+ </MarkdownProvider>
773
+ );
774
+ ```
775
+
776
+ > Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
777
+
501
778
  </Tab>
502
779
  <Tab label="Solid" value="solid">
503
780
 
@@ -515,38 +792,46 @@ Bạn có thể cấu hình cách render Markdown ở mức toàn cục cho toà
515
792
  );
516
793
  ```
517
794
 
518
- </Tab>
519
- <Tab label="Angular" value="angular">
795
+ Bạn cũng có thể sử dụng trình render markdown của riêng mình:
520
796
 
521
- ```typescript fileName="app.config.ts"
522
- import { createIntlayerMarkdownProvider } from "angular-intlayer/markdown";
797
+ ```tsx fileName="AppProvider.tsx"
798
+ import { MarkdownProvider } from "solid-intlayer/markdown";
523
799
 
524
- export const appConfig: ApplicationConfig = {
525
- providers: [
526
- createIntlayerMarkdownProvider({
527
- components: {
528
- h1: { class: "text-2xl font-bold" },
529
- },
530
- }),
531
- ],
532
- };
800
+ export const AppProvider = (props) => (
801
+ <MarkdownProvider
802
+ renderMarkdown={async (md) => {
803
+ const { renderMarkdown } = await import('solid-intlayer/markdown');
804
+ return renderMarkdown(md);
805
+ }}
806
+ >
807
+ {props.children}
808
+ </MarkdownProvider>
809
+ );
533
810
  ```
534
811
 
535
- </Tab>
536
- </Tabs>
812
+ > Việc nhập trình render Markdown của bạn một cách động là một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
537
813
 
538
- ---
814
+ </Tab>
815
+ <Tab label="Angular" value="angular">
539
816
 
540
- ## Tham chiếu Tùy chọn
817
+ ```typescript fileName="app.module.ts"
818
+ import { NgModule } from '@angular/core';
819
+ import { IntlayerMarkdownModule } from 'angular-intlayer/markdown';
820
+
821
+ @NgModule({
822
+ imports: [
823
+ IntlayerMarkdownModule.forRoot({
824
+ renderMarkdown: async (md) => {
825
+ const { renderMarkdown } = await import('angular-intlayer/markdown');
826
+ return renderMarkdown(md);
827
+ }
828
+ })
829
+ ]
830
+ })
831
+ export class AppModule {}
832
+ ```
541
833
 
542
- Các tùy chọn này thể được truyền cho `MarkdownProvider`, `MarkdownRenderer`, `useMarkdownRenderer`, `renderMarkdown`.
834
+ > Việc nhập trình render Markdown của bạn một cách động một cách tuyệt vời để giảm dung lượng bundle của ứng dụng.
543
835
 
544
- | Tùy chọn | Kiểu | Mặc định | Mô tả |
545
- | :-------------------- | :---------- | :------- | :----------------------------------------------------------------------------------- |
546
- | `forceBlock` | `boolean` | `false` | Buộc đầu ra được bao bọc trong một phần tử cấp khối (ví dụ: `<div>`). |
547
- | `forceInline` | `boolean` | `false` | Buộc đầu ra được bao bọc trong một phần tử nội dòng (ví dụ: `<span>`). |
548
- | `tagfilter` | `boolean` | `true` | Bật Bộ lọc thẻ GitHub để cải thiện bảo mật bằng cách loại bỏ các thẻ HTML nguy hiểm. |
549
- | `preserveFrontmatter` | `boolean` | `false` | Nếu `true`, frontmatter ở đầu chuỗi Markdown sẽ không bị loại bỏ. |
550
- | `components` | `Overrides` | `{}` | Một bản đồ các thẻ HTML tới các component tùy chỉnh (ví dụ: `{ h1: MyHeading }`). |
551
- | `wrapper` | `Component` | `null` | Một component tùy chỉnh để bao bọc Markdown đã render. |
552
- | `renderMarkdown` | `Function` | `null` | Một hàm render tùy chỉnh để thay thế hoàn toàn bộ biên dịch Markdown mặc định. |
836
+ </Tab>
837
+ </Tabs>