@intlayer/docs 7.1.9 → 7.2.2
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.
- package/README.md +1 -0
- package/dist/cjs/generated/docs.entry.cjs +19 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +19 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/intlayer_with_svelte_kit.md +738 -0
- package/docs/ar/intlayer_with_vite+svelte.md +288 -104
- package/docs/de/intlayer_with_svelte_kit.md +738 -0
- package/docs/de/intlayer_with_vite+svelte.md +302 -101
- package/docs/en/intlayer_with_nextjs_16.md +10 -2
- package/docs/en/intlayer_with_svelte_kit.md +570 -0
- package/docs/en/intlayer_with_vite+svelte.md +22 -6
- package/docs/en/introduction.md +2 -0
- package/docs/en-GB/intlayer_with_svelte_kit.md +738 -0
- package/docs/en-GB/intlayer_with_vite+svelte.md +262 -84
- package/docs/es/intlayer_with_svelte_kit.md +738 -0
- package/docs/es/intlayer_with_vite+svelte.md +300 -107
- package/docs/fr/intlayer_with_svelte_kit.md +770 -0
- package/docs/fr/intlayer_with_vite+svelte.md +297 -101
- package/docs/hi/intlayer_with_svelte_kit.md +738 -0
- package/docs/hi/intlayer_with_vite+svelte.md +298 -108
- package/docs/id/intlayer_with_svelte_kit.md +738 -0
- package/docs/id/intlayer_with_vite+svelte.md +277 -99
- package/docs/it/intlayer_with_svelte_kit.md +770 -0
- package/docs/it/intlayer_with_vite+svelte.md +275 -99
- package/docs/ja/intlayer_with_svelte_kit.md +738 -0
- package/docs/ja/intlayer_with_vite+svelte.md +295 -110
- package/docs/ko/intlayer_with_svelte_kit.md +738 -0
- package/docs/ko/intlayer_with_vite+svelte.md +286 -199
- package/docs/pl/intlayer_with_svelte_kit.md +740 -0
- package/docs/pl/intlayer_with_vite+svelte.md +273 -101
- package/docs/pt/intlayer_with_svelte_kit.md +772 -0
- package/docs/pt/intlayer_with_vite+svelte.md +290 -96
- package/docs/ru/intlayer_with_svelte_kit.md +738 -0
- package/docs/ru/intlayer_with_vite+svelte.md +275 -99
- package/docs/tr/intlayer_with_svelte_kit.md +738 -0
- package/docs/tr/intlayer_with_vite+svelte.md +297 -119
- package/docs/vi/intlayer_with_svelte_kit.md +738 -0
- package/docs/vi/intlayer_with_vite+svelte.md +275 -102
- package/docs/zh/intlayer_with_svelte_kit.md +738 -0
- package/docs/zh/intlayer_with_vite+svelte.md +309 -107
- package/package.json +9 -9
- package/src/generated/docs.entry.ts +19 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-04-18
|
|
3
|
-
updatedAt: 2025-
|
|
3
|
+
updatedAt: 2025-11-19
|
|
4
4
|
title: Cách dịch ứng dụng Vite và Svelte của bạn – Hướng dẫn i18n 2025
|
|
5
5
|
description: Khám phá cách làm cho trang web Vite và Svelte của bạn đa ngôn ngữ. Theo dõi tài liệu để quốc tế hóa (i18n) và dịch nó.
|
|
6
6
|
keywords:
|
|
@@ -14,8 +14,11 @@ slugs:
|
|
|
14
14
|
- doc
|
|
15
15
|
- environment
|
|
16
16
|
- vite-and-svelte
|
|
17
|
-
|
|
17
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-vite-svelte-template
|
|
18
18
|
history:
|
|
19
|
+
- version: 5.5.11
|
|
20
|
+
date: 2025-11-19
|
|
21
|
+
changes: Cập nhật tài liệu
|
|
19
22
|
- version: 5.5.10
|
|
20
23
|
date: 2025-06-29
|
|
21
24
|
changes: Khởi tạo lịch sử
|
|
@@ -23,10 +26,6 @@ history:
|
|
|
23
26
|
|
|
24
27
|
# Dịch trang web Vite và Svelte của bạn bằng Intlayer | Quốc tế hóa (i18n)
|
|
25
28
|
|
|
26
|
-
> Gói này đang trong quá trình phát triển. Xem [vấn đề](https://github.com/aymericzip/intlayer/issues/114) để biết thêm thông tin. Thể hiện sự quan tâm của bạn đến Intlayer cho Svelte bằng cách thích vấn đề này
|
|
27
|
-
|
|
28
|
-
<!-- Xem [Mẫu Ứng dụng](https://github.com/aymericzip/intlayer-solid-template) trên GitHub. -->
|
|
29
|
-
|
|
30
29
|
## Mục lục
|
|
31
30
|
|
|
32
31
|
<TOC/>
|
|
@@ -37,16 +36,26 @@ history:
|
|
|
37
36
|
|
|
38
37
|
Với Intlayer, bạn có thể:
|
|
39
38
|
|
|
40
|
-
- **Dễ dàng quản lý bản dịch** bằng cách sử dụng từ điển khai báo ở cấp độ component.
|
|
39
|
+
- **Dễ dàng quản lý bản dịch** bằng cách sử dụng các từ điển khai báo ở cấp độ component.
|
|
41
40
|
- **Địa phương hóa động metadata**, các tuyến đường và nội dung.
|
|
42
|
-
- **Đảm bảo hỗ trợ TypeScript** với các kiểu được tạo tự động, cải thiện
|
|
43
|
-
- **
|
|
41
|
+
- **Đảm bảo hỗ trợ TypeScript** với các kiểu được tạo tự động, cải thiện tự động hoàn thành và phát hiện lỗi.
|
|
42
|
+
- **Tận hưởng các tính năng nâng cao**, như phát hiện và chuyển đổi ngôn ngữ động.
|
|
44
43
|
|
|
45
44
|
---
|
|
46
45
|
|
|
47
|
-
## Hướng
|
|
46
|
+
## Hướng Dẫn Từng Bước Để Cài Đặt Intlayer Trong Ứng Dụng Vite và Svelte
|
|
47
|
+
|
|
48
|
+
<iframe
|
|
49
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-vite-react-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
50
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
51
|
+
title="Demo CodeSandbox - Cách quốc tế hóa ứng dụng của bạn bằng Intlayer"
|
|
52
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
53
|
+
loading="lazy"
|
|
54
|
+
/>
|
|
48
55
|
|
|
49
|
-
|
|
56
|
+
Xem [Mẫu Ứng Dụng](https://github.com/aymericzip/intlayer-vite-svelte-template) trên GitHub.
|
|
57
|
+
|
|
58
|
+
### Bước 1: Cài Đặt Các Phụ Thuộc
|
|
50
59
|
|
|
51
60
|
Cài đặt các gói cần thiết bằng npm:
|
|
52
61
|
|
|
@@ -65,23 +74,26 @@ yarn add intlayer svelte-intlayer
|
|
|
65
74
|
yarn add vite-intlayer --save-dev
|
|
66
75
|
```
|
|
67
76
|
|
|
68
|
-
|
|
77
|
+
```bash packageManager="bun"
|
|
78
|
+
bun add intlayer svelte-intlayer
|
|
79
|
+
bun add vite-intlayer --save-dev
|
|
80
|
+
```
|
|
69
81
|
|
|
70
82
|
- **intlayer**
|
|
71
83
|
|
|
72
|
-
Gói cốt lõi cung cấp các công cụ quốc tế hóa cho quản lý cấu hình, dịch thuật, [khai báo nội dung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md), biên dịch lại, và các
|
|
84
|
+
Gói cốt lõi cung cấp các công cụ quốc tế hóa cho quản lý cấu hình, dịch thuật, [khai báo nội dung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md), biên dịch lại, và [các lệnh CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_cli.md).
|
|
73
85
|
|
|
74
86
|
- **svelte-intlayer**
|
|
75
|
-
Gói tích hợp Intlayer với ứng dụng Svelte. Nó cung cấp các context
|
|
87
|
+
Gói tích hợp Intlayer với ứng dụng Svelte. Nó cung cấp các context providers và hooks cho việc quốc tế hóa trong Svelte.
|
|
76
88
|
|
|
77
89
|
- **vite-intlayer**
|
|
78
|
-
Bao gồm plugin Vite để tích hợp Intlayer với [
|
|
90
|
+
Bao gồm plugin Vite để tích hợp Intlayer với [Vite bundler](https://vite.dev/guide/why.html#why-bundle-for-production), cũng như middleware để phát hiện ngôn ngữ ưu tiên của người dùng, quản lý cookie và xử lý chuyển hướng URL.
|
|
79
91
|
|
|
80
92
|
### Bước 2: Cấu hình dự án của bạn
|
|
81
93
|
|
|
82
|
-
Tạo một file cấu hình để
|
|
94
|
+
Tạo một file cấu hình để thiết lập các ngôn ngữ cho ứng dụng của bạn:
|
|
83
95
|
|
|
84
|
-
```typescript fileName="intlayer.config.ts"
|
|
96
|
+
```typescript fileName="intlayer.config.ts"
|
|
85
97
|
import { Locales, type IntlayerConfig } from "intlayer";
|
|
86
98
|
|
|
87
99
|
const config: IntlayerConfig = {
|
|
@@ -99,51 +111,13 @@ const config: IntlayerConfig = {
|
|
|
99
111
|
export default config;
|
|
100
112
|
```
|
|
101
113
|
|
|
102
|
-
|
|
103
|
-
import { Locales } from "intlayer";
|
|
104
|
-
|
|
105
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
106
|
-
const config = {
|
|
107
|
-
internationalization: {
|
|
108
|
-
locales: [
|
|
109
|
-
Locales.ENGLISH,
|
|
110
|
-
Locales.FRENCH,
|
|
111
|
-
Locales.SPANISH,
|
|
112
|
-
// Các ngôn ngữ khác của bạn
|
|
113
|
-
],
|
|
114
|
-
defaultLocale: Locales.ENGLISH,
|
|
115
|
-
},
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
export default config;
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
122
|
-
const { Locales } = require("intlayer");
|
|
123
|
-
|
|
124
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
125
|
-
const config = {
|
|
126
|
-
internationalization: {
|
|
127
|
-
locales: [
|
|
128
|
-
Locales.ENGLISH,
|
|
129
|
-
Locales.FRENCH,
|
|
130
|
-
Locales.SPANISH,
|
|
131
|
-
// Các ngôn ngữ khác của bạn
|
|
132
|
-
],
|
|
133
|
-
defaultLocale: Locales.ENGLISH,
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
module.exports = config;
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
> Thông qua tệp cấu hình này, bạn có thể thiết lập các URL địa phương hóa, chuyển hướng middleware, tên cookie, vị trí và phần mở rộng của các khai báo nội dung của bạn, tắt các log Intlayer trên console, và nhiều hơn nữa. Để xem danh sách đầy đủ các tham số có sẵn, hãy tham khảo [tài liệu cấu hình](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/configuration.md).
|
|
114
|
+
> Thông qua file cấu hình này, bạn có thể thiết lập các URL có địa phương hóa, chuyển hướng middleware, tên cookie, vị trí và phần mở rộng của các khai báo nội dung, tắt các log của Intlayer trên console, và nhiều hơn nữa. Để xem danh sách đầy đủ các tham số có sẵn, hãy tham khảo [tài liệu cấu hình](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/configuration.md).
|
|
141
115
|
|
|
142
116
|
### Bước 3: Tích hợp Intlayer vào cấu hình Vite của bạn
|
|
143
117
|
|
|
144
118
|
Thêm plugin intlayer vào cấu hình của bạn.
|
|
145
119
|
|
|
146
|
-
```typescript fileName="vite.config.ts"
|
|
120
|
+
```typescript fileName="vite.config.ts"
|
|
147
121
|
import { defineConfig } from "vite";
|
|
148
122
|
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
149
123
|
import { intlayer } from "vite-intlayer";
|
|
@@ -154,33 +128,11 @@ export default defineConfig({
|
|
|
154
128
|
});
|
|
155
129
|
```
|
|
156
130
|
|
|
157
|
-
|
|
158
|
-
import { defineConfig } from "vite";
|
|
159
|
-
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
160
|
-
import { intlayer } from "vite-intlayer";
|
|
161
|
-
|
|
162
|
-
// https://vitejs.dev/config/
|
|
163
|
-
export default defineConfig({
|
|
164
|
-
plugins: [svelte(), intlayer()],
|
|
165
|
-
});
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
```javascript fileName="vite.config.cjs" codeFormat="commonjs"
|
|
169
|
-
const { defineConfig } = require("vite");
|
|
170
|
-
const react = require("@vitejs/plugin-react-swc");
|
|
171
|
-
const { intlayer } = require("vite-intlayer");
|
|
172
|
-
|
|
173
|
-
// https://vitejs.dev/config/
|
|
174
|
-
module.exports = defineConfig({
|
|
175
|
-
plugins: [react(), intlayer()],
|
|
176
|
-
});
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
> Plugin Vite `intlayer()` được sử dụng để tích hợp Intlayer với Vite. Nó đảm bảo việc xây dựng các tệp khai báo nội dung và giám sát chúng trong chế độ phát triển. Nó định nghĩa các biến môi trường Intlayer trong ứng dụng Vite. Ngoài ra, nó cung cấp các bí danh để tối ưu hiệu suất.
|
|
131
|
+
> Plugin `intlayer()` của Vite được sử dụng để tích hợp Intlayer với Vite. Nó đảm bảo việc xây dựng các file khai báo nội dung và giám sát chúng trong chế độ phát triển. Nó định nghĩa các biến môi trường Intlayer trong ứng dụng Vite. Ngoài ra, nó cung cấp các alias để tối ưu hiệu năng.
|
|
180
132
|
|
|
181
|
-
### Bước 4: Khai báo Nội dung của
|
|
133
|
+
### Bước 4: Khai báo Nội dung của bạn
|
|
182
134
|
|
|
183
|
-
Tạo và quản lý các khai báo nội dung để lưu trữ bản dịch:
|
|
135
|
+
Tạo và quản lý các khai báo nội dung để lưu trữ các bản dịch:
|
|
184
136
|
|
|
185
137
|
```tsx fileName="src/app.content.tsx" contentDeclarationFormat="typescript"
|
|
186
138
|
import { t, type Dictionary } from "intlayer";
|
|
@@ -203,6 +155,7 @@ export default appContent;
|
|
|
203
155
|
import { t } from "intlayer";
|
|
204
156
|
|
|
205
157
|
/** @type {import('intlayer').Dictionary} */
|
|
158
|
+
// Khai báo nội dung ứng dụng với các bản dịch cho tiêu đề
|
|
206
159
|
const appContent = {
|
|
207
160
|
key: "app",
|
|
208
161
|
content: {
|
|
@@ -221,7 +174,7 @@ export default appContent;
|
|
|
221
174
|
const { t } = require("intlayer");
|
|
222
175
|
|
|
223
176
|
/** @type {import('intlayer').Dictionary} */
|
|
224
|
-
|
|
177
|
+
// Khai báo nội dung ứng dụng với các bản dịch cho tiêu đề
|
|
225
178
|
const appContent = {
|
|
226
179
|
key: "app",
|
|
227
180
|
content: {
|
|
@@ -253,42 +206,262 @@ module.exports = appContent;
|
|
|
253
206
|
}
|
|
254
207
|
```
|
|
255
208
|
|
|
256
|
-
> Các khai báo nội dung của bạn có thể được định nghĩa ở bất kỳ đâu trong ứng dụng của bạn miễn là chúng được
|
|
209
|
+
> Các khai báo nội dung của bạn có thể được định nghĩa ở bất kỳ đâu trong ứng dụng của bạn miễn là chúng được đưa vào thư mục `contentDir` (mặc định là `./src`). Và phù hợp với phần mở rộng tệp khai báo nội dung (mặc định là `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
210
|
+
|
|
211
|
+
> Để biết thêm chi tiết, tham khảo [tài liệu khai báo nội dung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/dictionary/content_file.md).
|
|
212
|
+
|
|
213
|
+
### Bước 5: Sử dụng Intlayer trong mã của bạn
|
|
214
|
+
|
|
215
|
+
```svelte fileName="src/App.svelte"
|
|
216
|
+
<script>
|
|
217
|
+
import { useIntlayer } from "svelte-intlayer";
|
|
257
218
|
|
|
258
|
-
|
|
219
|
+
const content = useIntlayer("app");
|
|
220
|
+
</script>
|
|
259
221
|
|
|
260
|
-
|
|
222
|
+
<div>
|
|
261
223
|
|
|
262
|
-
|
|
224
|
+
|
|
225
|
+
<!-- Hiển thị nội dung như nội dung đơn giản -->
|
|
226
|
+
<h1>{$content.title}</h1>
|
|
227
|
+
<!-- Để hiển thị nội dung có thể chỉnh sửa bằng trình soạn thảo -->
|
|
228
|
+
<h1><svelte:component this={$content.title} /></h1>
|
|
229
|
+
<!-- Để hiển thị nội dung dưới dạng chuỗi -->
|
|
230
|
+
<div aria-label={$content.title.value}></div>
|
|
231
|
+
```
|
|
263
232
|
|
|
264
233
|
### (Tùy chọn) Bước 6: Thay đổi ngôn ngữ của nội dung
|
|
265
234
|
|
|
266
|
-
|
|
235
|
+
```svelte fileName="src/App.svelte"
|
|
236
|
+
<script lang="ts">
|
|
237
|
+
import { getLocaleName } from 'intlayer';
|
|
238
|
+
import { useLocale } from 'svelte-intlayer';
|
|
267
239
|
|
|
268
|
-
|
|
240
|
+
// Lấy thông tin locale và hàm setLocale
|
|
241
|
+
const { locale, availableLocales, setLocale } = useLocale();
|
|
269
242
|
|
|
270
|
-
|
|
243
|
+
// Xử lý thay đổi locale
|
|
244
|
+
const changeLocale = (event: Event) => {
|
|
245
|
+
const target = event.target as HTMLSelectElement;
|
|
246
|
+
const newLocale = target.value;
|
|
247
|
+
setLocale(newLocale);
|
|
248
|
+
};
|
|
249
|
+
</script>
|
|
250
|
+
|
|
251
|
+
<div>
|
|
252
|
+
<select value={$locale} on:change={changeLocale}>
|
|
253
|
+
{#each availableLocales ?? [] as loc}
|
|
254
|
+
<option value={loc}>
|
|
255
|
+
{getLocaleName(loc)}
|
|
256
|
+
</option>
|
|
257
|
+
{/each}
|
|
258
|
+
</select>
|
|
259
|
+
</div>
|
|
260
|
+
```
|
|
271
261
|
|
|
272
|
-
### (Tùy chọn) Bước
|
|
262
|
+
### (Tùy chọn) Bước 7: Hiển thị Markdown
|
|
273
263
|
|
|
274
|
-
|
|
264
|
+
Intlayer hỗ trợ hiển thị nội dung Markdown trực tiếp trong ứng dụng Svelte của bạn. Theo mặc định, Markdown được xử lý như văn bản thuần túy. Để chuyển đổi Markdown thành HTML phong phú, bạn có thể tích hợp `@humanspeak/svelte-markdown` hoặc một trình phân tích markdown khác.
|
|
275
265
|
|
|
276
|
-
|
|
266
|
+
> Để xem cách khai báo nội dung markdown sử dụng gói `intlayer`, xem tài liệu [markdown doc](https://github.com/aymericzip/intlayer/tree/main/docs/vi/dictionary/markdown.md).
|
|
277
267
|
|
|
278
|
-
|
|
268
|
+
```svelte fileName="src/App.svelte"
|
|
269
|
+
<script>
|
|
270
|
+
import { setIntlayerMarkdown } from "svelte-intlayer";
|
|
279
271
|
|
|
280
|
-
|
|
272
|
+
setIntlayerMarkdown((markdown) =>
|
|
273
|
+
// hiển thị nội dung markdown dưới dạng chuỗi
|
|
274
|
+
return markdown;
|
|
275
|
+
);
|
|
276
|
+
</script>
|
|
281
277
|
|
|
282
|
-
|
|
278
|
+
<h1>{$content.markdownContent}</h1>
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
> Bạn cũng có thể truy cập dữ liệu front-matter của markdown bằng cách sử dụng thuộc tính `content.markdownContent.metadata.xxx`.
|
|
282
|
+
|
|
283
|
+
### (Tùy chọn) Bước 8: Thiết lập trình chỉnh sửa intlayer / CMS
|
|
284
|
+
|
|
285
|
+
Để thiết lập trình chỉnh sửa intlayer, bạn phải làm theo [tài liệu trình chỉnh sửa intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_visual_editor.md).
|
|
286
|
+
|
|
287
|
+
Để thiết lập CMS intlayer, bạn phải làm theo [tài liệu CMS intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_CMS.md).
|
|
288
|
+
|
|
289
|
+
Song song đó, trong ứng dụng Svelte của bạn, bạn phải thêm dòng sau vào một layout, hoặc tại gốc của ứng dụng:
|
|
290
|
+
|
|
291
|
+
```svelte fileName="src/layout.svelte"
|
|
292
|
+
import { useIntlayerEditor } from "svelte-intlayer";
|
|
293
|
+
|
|
294
|
+
useIntlayerEditor();
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### (Tùy chọn) Bước 7: Thêm định tuyến có bản địa hóa vào ứng dụng của bạn
|
|
298
|
+
|
|
299
|
+
Để xử lý định tuyến có bản địa hóa trong ứng dụng Svelte của bạn, bạn có thể sử dụng `svelte-spa-router` cùng với `localeFlatMap` của Intlayer để tạo các tuyến đường cho từng ngôn ngữ.
|
|
300
|
+
|
|
301
|
+
Trước tiên, cài đặt `svelte-spa-router`:
|
|
302
|
+
|
|
303
|
+
```bash packageManager="npm"
|
|
304
|
+
npm install svelte-spa-router
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
```bash packageManager="pnpm"
|
|
308
|
+
pnpm add svelte-spa-router
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
```bash packageManager="yarn"
|
|
312
|
+
yarn add svelte-spa-router
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
```bash packageManager="bun"
|
|
316
|
+
bun add svelte-spa-router
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
Sau đó, tạo một file `Router.svelte` để định nghĩa các tuyến đường của bạn:
|
|
320
|
+
|
|
321
|
+
```svelte fileName="src/Router.svelte"
|
|
322
|
+
<script lang="ts">
|
|
323
|
+
import { localeFlatMap } from "intlayer";
|
|
324
|
+
import Router from "svelte-spa-router";
|
|
325
|
+
import { wrap } from "svelte-spa-router/wrap";
|
|
326
|
+
import App from "./App.svelte";
|
|
327
|
+
|
|
328
|
+
const routes = Object.fromEntries(
|
|
329
|
+
localeFlatMap(({locale, urlPrefix}) => [
|
|
330
|
+
[
|
|
331
|
+
urlPrefix || '/',
|
|
332
|
+
wrap({
|
|
333
|
+
component: App as any,
|
|
334
|
+
props: {
|
|
335
|
+
locale,
|
|
336
|
+
},
|
|
337
|
+
}),
|
|
338
|
+
],
|
|
339
|
+
])
|
|
340
|
+
);
|
|
341
|
+
</script>
|
|
342
|
+
|
|
343
|
+
<Router {routes} />
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
Cập nhật file `main.ts` của bạn để mount component `Router` thay vì `App`:
|
|
347
|
+
|
|
348
|
+
```typescript fileName="src/main.ts"
|
|
349
|
+
import { mount } from "svelte";
|
|
350
|
+
import Router from "./Router.svelte";
|
|
351
|
+
|
|
352
|
+
const app = mount(Router, {
|
|
353
|
+
target: document.getElementById("app")!,
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
export default app;
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
Cuối cùng, cập nhật `App.svelte` của bạn để nhận prop `locale` và sử dụng nó với `useIntlayer`:
|
|
360
|
+
|
|
361
|
+
```svelte fileName="src/App.svelte"
|
|
362
|
+
<script lang="ts">
|
|
363
|
+
import type { Locale } from 'intlayer';
|
|
364
|
+
import { useIntlayer } from 'svelte-intlayer';
|
|
365
|
+
import Counter from './lib/Counter.svelte';
|
|
366
|
+
import LocaleSwitcher từ './lib/LocaleSwitcher.svelte';
|
|
367
|
+
|
|
368
|
+
export let locale: Locale;
|
|
369
|
+
|
|
370
|
+
$: content = useIntlayer('app', locale);
|
|
371
|
+
</script>
|
|
372
|
+
|
|
373
|
+
<main>
|
|
374
|
+
<div class="locale-switcher-container">
|
|
375
|
+
<LocaleSwitcher currentLocale={locale} />
|
|
376
|
+
</div>
|
|
377
|
+
|
|
378
|
+
<!-- ... phần còn lại của ứng dụng của bạn ... -->
|
|
379
|
+
</main>
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
#### Cấu hình Routing phía Server (Tùy chọn)
|
|
383
|
+
|
|
384
|
+
Song song với đó, bạn cũng có thể sử dụng `intlayerProxy` để thêm routing phía server cho ứng dụng của bạn. Plugin này sẽ tự động phát hiện locale hiện tại dựa trên URL và thiết lập cookie locale phù hợp. Nếu không có locale nào được chỉ định, plugin sẽ xác định locale phù hợp nhất dựa trên sở thích ngôn ngữ trình duyệt của người dùng. Nếu không phát hiện được locale nào, nó sẽ chuyển hướng đến locale mặc định.
|
|
385
|
+
|
|
386
|
+
> Lưu ý rằng để sử dụng `intlayerProxy` trong môi trường production, bạn cần chuyển gói `vite-intlayer` từ `devDependencies` sang `dependencies`.
|
|
387
|
+
|
|
388
|
+
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
389
|
+
import { defineConfig } from "vite";
|
|
390
|
+
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
391
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
392
|
+
|
|
393
|
+
// https://vitejs.dev/config/
|
|
394
|
+
export default defineConfig({
|
|
395
|
+
plugins: [svelte(), intlayer(), intlayerProxy()],
|
|
396
|
+
});
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
|
|
400
|
+
import { defineConfig } from "vite";
|
|
401
|
+
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
402
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
403
|
+
|
|
404
|
+
// https://vitejs.dev/config/
|
|
405
|
+
export default defineConfig({
|
|
406
|
+
plugins: [svelte(), intlayer(), intlayerProxy()],
|
|
407
|
+
});
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
|
|
411
|
+
const { defineConfig } = require("vite");
|
|
412
|
+
const { svelte } = require("@sveltejs/vite-plugin-svelte");
|
|
413
|
+
const { intlayer, intlayerProxy } = require("vite-intlayer");
|
|
414
|
+
|
|
415
|
+
// https://vitejs.dev/config/
|
|
416
|
+
module.exports = defineConfig({
|
|
417
|
+
plugins: [svelte(), intlayer(), intlayerProxy()],
|
|
418
|
+
});
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### (Tùy chọn) Bước 8: Thay đổi URL khi thay đổi ngôn ngữ
|
|
422
|
+
|
|
423
|
+
Để cho phép người dùng chuyển đổi ngôn ngữ và cập nhật URL tương ứng, bạn có thể tạo một component `LocaleSwitcher`. Component này sẽ sử dụng `getLocalizedUrl` từ `intlayer` và `push` từ `svelte-spa-router`.
|
|
424
|
+
|
|
425
|
+
```svelte fileName="src/lib/LocaleSwitcher.svelte"
|
|
426
|
+
<script lang="ts">
|
|
427
|
+
import { getLocaleName, getLocalizedUrl } from "intlayer";
|
|
428
|
+
import { useLocale } from "svelte-intlayer";
|
|
429
|
+
import { push } from "svelte-spa-router";
|
|
430
|
+
|
|
431
|
+
export let currentLocale: string | undefined = undefined;
|
|
432
|
+
|
|
433
|
+
// Lấy thông tin ngôn ngữ
|
|
434
|
+
const { locale, availableLocales } = useLocale();
|
|
435
|
+
|
|
436
|
+
// Xử lý thay đổi ngôn ngữ
|
|
437
|
+
const changeLocale = (event: Event) => {
|
|
438
|
+
const target = event.target as HTMLSelectElement;
|
|
439
|
+
const newLocale = target.value;
|
|
440
|
+
const currentUrl = window.location.pathname;
|
|
441
|
+
const url = getLocalizedUrl( currentUrl, newLocale);
|
|
442
|
+
push(url);
|
|
443
|
+
};
|
|
444
|
+
</script>
|
|
445
|
+
|
|
446
|
+
<div class="locale-switcher">
|
|
447
|
+
<select value={currentLocale ?? $locale} onchange={changeLocale}>
|
|
448
|
+
{#each availableLocales ?? [] as loc}
|
|
449
|
+
<option value={loc}>
|
|
450
|
+
{getLocaleName(loc)}
|
|
451
|
+
</option>
|
|
452
|
+
{/each}
|
|
453
|
+
</select>
|
|
454
|
+
</div>
|
|
455
|
+
```
|
|
283
456
|
|
|
284
457
|
### Cấu hình Git
|
|
285
458
|
|
|
286
|
-
Khuyến nghị bỏ qua các
|
|
459
|
+
Khuyến nghị nên bỏ qua các file được tạo ra bởi Intlayer. Điều này giúp bạn tránh việc commit chúng vào kho Git của mình.
|
|
287
460
|
|
|
288
|
-
Để làm điều này, bạn có thể thêm các
|
|
461
|
+
Để làm điều này, bạn có thể thêm các chỉ dẫn sau vào file `.gitignore` của bạn:
|
|
289
462
|
|
|
290
463
|
```plaintext
|
|
291
|
-
# Bỏ qua các
|
|
464
|
+
# Bỏ qua các file được tạo ra bởi Intlayer
|
|
292
465
|
.intlayer
|
|
293
466
|
```
|
|
294
467
|
|
|
@@ -303,7 +476,7 @@ Tiện ích mở rộng này cung cấp:
|
|
|
303
476
|
- **Tự động hoàn thành** cho các khóa dịch.
|
|
304
477
|
- **Phát hiện lỗi thời gian thực** cho các bản dịch bị thiếu.
|
|
305
478
|
- **Xem trước nội dung dịch ngay trong dòng**.
|
|
306
|
-
- **
|
|
479
|
+
- **Hành động nhanh** để dễ dàng tạo và cập nhật các bản dịch.
|
|
307
480
|
|
|
308
481
|
Để biết thêm chi tiết về cách sử dụng tiện ích mở rộng, hãy tham khảo [tài liệu Tiện ích mở rộng Intlayer cho VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
309
482
|
|
|
@@ -311,6 +484,6 @@ Tiện ích mở rộng này cung cấp:
|
|
|
311
484
|
|
|
312
485
|
### Đi xa hơn
|
|
313
486
|
|
|
314
|
-
|
|
487
|
+
### Tiến xa hơn
|
|
315
488
|
|
|
316
|
-
|
|
489
|
+
Để tiến xa hơn, bạn có thể triển khai [trình chỉnh sửa trực quan](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_visual_editor.md) hoặc tách nội dung của bạn ra bên ngoài bằng cách sử dụng [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/vi/intlayer_CMS.md).
|