@intlayer/docs 7.1.0-canary.2 → 7.1.1-canary.0
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/blog/ar/internationalization_and_SEO.md +0 -4
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +2 -2
- package/blog/de/internationalization_and_SEO.md +0 -2
- package/blog/en/internationalization_and_SEO.md +0 -2
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +2 -2
- package/blog/en-GB/internationalization_and_SEO.md +0 -2
- package/blog/es/internationalization_and_SEO.md +0 -4
- package/blog/fr/internationalization_and_SEO.md +0 -2
- package/blog/hi/internationalization_and_SEO.md +0 -2
- package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +2 -2
- package/blog/it/internationalization_and_SEO.md +0 -2
- package/blog/ja/internationalization_and_SEO.md +0 -2
- package/blog/ko/internationalization_and_SEO.md +0 -2
- package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +2 -2
- package/blog/pt/internationalization_and_SEO.md +0 -4
- package/blog/ru/internationalization_and_SEO.md +0 -4
- package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +2 -2
- package/blog/zh/internationalization_and_SEO.md +0 -4
- package/docs/ar/intlayer_with_nextjs_14.md +9 -9
- package/docs/ar/intlayer_with_nextjs_15.md +9 -8
- package/docs/ar/intlayer_with_nextjs_16.md +2 -56
- package/docs/ar/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/ar/intlayer_with_react_router_v7.md +6 -6
- package/docs/ar/intlayer_with_tanstack.md +46 -31
- package/docs/ar/intlayer_with_vite+preact.md +7 -7
- package/docs/ar/intlayer_with_vite+react.md +7 -7
- package/docs/ar/intlayer_with_vite+vue.md +9 -9
- package/docs/de/intlayer_with_nextjs_14.md +9 -9
- package/docs/de/intlayer_with_nextjs_15.md +9 -8
- package/docs/de/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/de/intlayer_with_react_router_v7.md +6 -6
- package/docs/de/intlayer_with_tanstack.md +46 -31
- package/docs/de/intlayer_with_vite+preact.md +7 -7
- package/docs/de/intlayer_with_vite+react.md +7 -7
- package/docs/de/intlayer_with_vite+vue.md +9 -9
- package/docs/en/interest_of_intlayer.md +1 -1
- package/docs/en/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/en/intlayer_with_react_router_v7.md +6 -6
- package/docs/en/intlayer_with_tanstack.md +57 -33
- package/docs/en/intlayer_with_vite+preact.md +8 -8
- package/docs/en/intlayer_with_vite+react.md +8 -8
- package/docs/en/intlayer_with_vite+vue.md +8 -8
- package/docs/en/releases/v6.md +1 -1
- package/docs/en-GB/intlayer_with_nextjs_14.md +9 -9
- package/docs/en-GB/intlayer_with_nextjs_15.md +9 -8
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/en-GB/intlayer_with_react_router_v7.md +6 -6
- package/docs/en-GB/intlayer_with_tanstack.md +46 -31
- package/docs/en-GB/intlayer_with_vite+preact.md +7 -7
- package/docs/en-GB/intlayer_with_vite+react.md +7 -7
- package/docs/en-GB/intlayer_with_vite+vue.md +9 -9
- package/docs/es/intlayer_with_nextjs_14.md +9 -9
- package/docs/es/intlayer_with_nextjs_15.md +9 -8
- package/docs/es/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/es/intlayer_with_react_router_v7.md +6 -6
- package/docs/es/intlayer_with_tanstack.md +15 -10
- package/docs/es/intlayer_with_vite+preact.md +7 -7
- package/docs/es/intlayer_with_vite+react.md +7 -7
- package/docs/es/intlayer_with_vite+vue.md +9 -9
- package/docs/fr/intlayer_with_nextjs_14.md +9 -9
- package/docs/fr/intlayer_with_nextjs_15.md +9 -8
- package/docs/fr/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/fr/intlayer_with_react_router_v7.md +6 -6
- package/docs/fr/intlayer_with_tanstack.md +46 -31
- package/docs/fr/intlayer_with_vite+preact.md +7 -7
- package/docs/fr/intlayer_with_vite+react.md +7 -7
- package/docs/fr/intlayer_with_vite+vue.md +9 -9
- package/docs/hi/intlayer_with_nextjs_14.md +9 -9
- package/docs/hi/intlayer_with_nextjs_15.md +9 -8
- package/docs/hi/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/hi/intlayer_with_react_router_v7.md +6 -6
- package/docs/hi/intlayer_with_tanstack.md +15 -10
- package/docs/hi/intlayer_with_vite+preact.md +7 -7
- package/docs/hi/intlayer_with_vite+react.md +7 -7
- package/docs/hi/intlayer_with_vite+vue.md +9 -9
- package/docs/id/interest_of_intlayer.md +1 -1
- package/docs/id/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/id/intlayer_with_react_router_v7.md +6 -6
- package/docs/id/intlayer_with_tanstack.md +15 -10
- package/docs/id/intlayer_with_vite+preact.md +9 -9
- package/docs/id/intlayer_with_vite+react.md +8 -8
- package/docs/id/intlayer_with_vite+vue.md +8 -8
- package/docs/id/releases/v6.md +1 -1
- package/docs/it/intlayer_with_nextjs_14.md +9 -9
- package/docs/it/intlayer_with_nextjs_15.md +9 -8
- package/docs/it/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/it/intlayer_with_react_router_v7.md +6 -6
- package/docs/it/intlayer_with_tanstack.md +46 -31
- package/docs/it/intlayer_with_vite+preact.md +7 -7
- package/docs/it/intlayer_with_vite+react.md +7 -7
- package/docs/it/intlayer_with_vite+vue.md +9 -9
- package/docs/ja/intlayer_with_nextjs_14.md +9 -9
- package/docs/ja/intlayer_with_nextjs_15.md +9 -8
- package/docs/ja/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/ja/intlayer_with_react_router_v7.md +6 -6
- package/docs/ja/intlayer_with_tanstack.md +16 -10
- package/docs/ja/intlayer_with_vite+preact.md +7 -7
- package/docs/ja/intlayer_with_vite+react.md +7 -7
- package/docs/ja/intlayer_with_vite+vue.md +9 -9
- package/docs/ko/intlayer_with_nextjs_14.md +9 -9
- package/docs/ko/intlayer_with_nextjs_15.md +9 -8
- package/docs/ko/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/ko/intlayer_with_react_router_v7.md +6 -6
- package/docs/ko/intlayer_with_tanstack.md +46 -31
- package/docs/ko/intlayer_with_vite+preact.md +7 -7
- package/docs/ko/intlayer_with_vite+react.md +7 -7
- package/docs/ko/intlayer_with_vite+vue.md +9 -9
- package/docs/pl/interest_of_intlayer.md +1 -1
- package/docs/pl/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/pl/intlayer_with_react_router_v7.md +6 -6
- package/docs/pl/intlayer_with_tanstack.md +15 -10
- package/docs/pl/intlayer_with_vite+preact.md +10 -10
- package/docs/pl/intlayer_with_vite+react.md +8 -8
- package/docs/pl/intlayer_with_vite+vue.md +8 -8
- package/docs/pl/releases/v6.md +1 -1
- package/docs/pt/intlayer_with_nextjs_14.md +9 -9
- package/docs/pt/intlayer_with_nextjs_15.md +9 -8
- package/docs/pt/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/pt/intlayer_with_react_router_v7.md +2 -2
- package/docs/pt/intlayer_with_tanstack.md +46 -31
- package/docs/pt/intlayer_with_vite+preact.md +7 -7
- package/docs/pt/intlayer_with_vite+react.md +7 -7
- package/docs/pt/intlayer_with_vite+vue.md +9 -9
- package/docs/ru/intlayer_with_nextjs_14.md +9 -9
- package/docs/ru/intlayer_with_nextjs_15.md +9 -8
- package/docs/ru/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/ru/intlayer_with_react_router_v7.md +6 -6
- package/docs/ru/intlayer_with_tanstack.md +15 -10
- package/docs/ru/intlayer_with_vite+preact.md +7 -7
- package/docs/ru/intlayer_with_vite+react.md +7 -7
- package/docs/ru/intlayer_with_vite+vue.md +9 -9
- package/docs/tr/interest_of_intlayer.md +1 -1
- package/docs/tr/intlayer_with_nextjs_15.md +9 -8
- package/docs/tr/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/tr/intlayer_with_react_router_v7.md +6 -6
- package/docs/tr/intlayer_with_tanstack.md +46 -31
- package/docs/tr/intlayer_with_vite+preact.md +8 -8
- package/docs/tr/intlayer_with_vite+react.md +8 -8
- package/docs/tr/intlayer_with_vite+vue.md +8 -8
- package/docs/vi/interest_of_intlayer.md +1 -1
- package/docs/vi/intlayer_with_nextjs_15.md +1 -0
- package/docs/vi/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/vi/intlayer_with_react_router_v7.md +6 -6
- package/docs/vi/intlayer_with_tanstack.md +46 -31
- package/docs/vi/intlayer_with_vite+preact.md +9 -9
- package/docs/vi/intlayer_with_vite+react.md +8 -8
- package/docs/vi/intlayer_with_vite+vue.md +8 -8
- package/docs/vi/releases/v6.md +1 -1
- package/docs/zh/intlayer_with_nextjs_14.md +9 -9
- package/docs/zh/intlayer_with_nextjs_15.md +9 -8
- package/docs/zh/intlayer_with_nextjs_page_router.md +7 -10
- package/docs/zh/intlayer_with_react_router_v7.md +6 -6
- package/docs/zh/intlayer_with_tanstack.md +14 -8
- package/docs/zh/intlayer_with_vite+preact.md +7 -7
- package/docs/zh/intlayer_with_vite+react.md +7 -7
- package/docs/zh/intlayer_with_vite+vue.md +7 -7
- package/frequent_questions/ar/domain_routing.md +1 -1
- package/frequent_questions/de/domain_routing.md +1 -1
- package/frequent_questions/en/domain_routing.md +1 -1
- package/frequent_questions/en/package_version_error.md +29 -1
- package/frequent_questions/en-GB/domain_routing.md +1 -1
- package/frequent_questions/es/domain_routing.md +1 -1
- package/frequent_questions/fr/domain_routing.md +1 -1
- package/frequent_questions/hi/domain_routing.md +1 -1
- package/frequent_questions/id/domain_routing.md +1 -1
- package/frequent_questions/it/domain_routing.md +1 -1
- package/frequent_questions/it/package_version_error.md +4 -4
- package/frequent_questions/ja/domain_routing.md +1 -1
- package/frequent_questions/ko/domain_routing.md +1 -1
- package/frequent_questions/pl/domain_routing.md +1 -1
- package/frequent_questions/pt/domain_routing.md +1 -1
- package/frequent_questions/ru/domain_routing.md +1 -1
- package/frequent_questions/tr/domain_routing.md +1 -1
- package/frequent_questions/vi/domain_routing.md +1 -1
- package/frequent_questions/zh/domain_routing.md +1 -1
- package/package.json +7 -14
|
@@ -211,6 +211,7 @@ import type { FC } from "react";
|
|
|
211
211
|
|
|
212
212
|
import { Link, type LinkComponentProps } from "@tanstack/react-router";
|
|
213
213
|
import { useLocale } from "react-intlayer";
|
|
214
|
+
import { getPrefix } from "intlayer";
|
|
214
215
|
|
|
215
216
|
export const LOCALE_ROUTE = "{-$locale}" as const;
|
|
216
217
|
|
|
@@ -240,12 +241,13 @@ type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
|
|
|
240
241
|
|
|
241
242
|
export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
|
|
242
243
|
const { locale } = useLocale();
|
|
244
|
+
const { localePrefix } = getPrefix(locale);
|
|
243
245
|
|
|
244
246
|
return (
|
|
245
247
|
<Link
|
|
246
248
|
{...props}
|
|
247
249
|
params={{
|
|
248
|
-
locale,
|
|
250
|
+
locale: localePrefix,
|
|
249
251
|
...(typeof props?.params === "object" ? props?.params : {}),
|
|
250
252
|
}}
|
|
251
253
|
to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
|
|
@@ -262,43 +264,52 @@ Component này có hai mục tiêu:
|
|
|
262
264
|
Sau đó, chúng ta có thể tạo một hook `useLocalizedNavigate` để điều hướng theo lập trình:
|
|
263
265
|
|
|
264
266
|
```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
|
|
265
|
-
import { useLocale } from "react-intlayer";
|
|
266
267
|
import { useNavigate } from "@tanstack/react-router";
|
|
268
|
+
import { getPrefix } from "intlayer";
|
|
269
|
+
import { useLocale } from "react-intlayer";
|
|
267
270
|
import { LOCALE_ROUTE } from "@/components/localized-link";
|
|
268
271
|
import type { FileRouteTypes } from "@/routeTree.gen";
|
|
269
272
|
|
|
273
|
+
type StripLocalePrefix<T extends string> = T extends
|
|
274
|
+
| `/${typeof LOCALE_ROUTE}`
|
|
275
|
+
| `/${typeof LOCALE_ROUTE}/`
|
|
276
|
+
? "/"
|
|
277
|
+
: T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
|
|
278
|
+
? `/${Rest}`
|
|
279
|
+
: never;
|
|
280
|
+
|
|
281
|
+
type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
|
|
282
|
+
|
|
283
|
+
type LocalizedNavigate = {
|
|
284
|
+
(to: LocalizedTo): ReturnType<ReturnType<typeof useNavigate>>;
|
|
285
|
+
(
|
|
286
|
+
opts: { to: LocalizedTo } & Record<string, unknown>
|
|
287
|
+
): ReturnType<ReturnType<typeof useNavigate>>;
|
|
288
|
+
};
|
|
289
|
+
|
|
270
290
|
export const useLocalizedNavigate = () => {
|
|
271
291
|
const navigate = useNavigate();
|
|
272
292
|
|
|
273
293
|
const { locale } = useLocale();
|
|
274
294
|
|
|
275
|
-
type StripLocalePrefix<T extends string> = T extends
|
|
276
|
-
| `/${typeof LOCALE_ROUTE}`
|
|
277
|
-
| `/${typeof LOCALE_ROUTE}/`
|
|
278
|
-
? "/"
|
|
279
|
-
: T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
|
|
280
|
-
? `/${Rest}`
|
|
281
|
-
: never;
|
|
282
|
-
|
|
283
|
-
type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
|
|
284
|
-
|
|
285
|
-
interface LocalizedNavigate {
|
|
286
|
-
(to: LocalizedTo): ReturnType<typeof navigate>;
|
|
287
|
-
(
|
|
288
|
-
opts: { to: LocalizedTo } & Record<string, unknown>
|
|
289
|
-
): ReturnType<typeof navigate>;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
295
|
const localizedNavigate: LocalizedNavigate = (args: any) => {
|
|
296
|
+
const { localePrefix } = getPrefix(locale);
|
|
297
|
+
|
|
293
298
|
if (typeof args === "string") {
|
|
294
|
-
return navigate({
|
|
299
|
+
return navigate({
|
|
300
|
+
to: `/${LOCALE_ROUTE}${args}`,
|
|
301
|
+
params: { locale: localePrefix },
|
|
302
|
+
});
|
|
295
303
|
}
|
|
296
304
|
|
|
297
305
|
const { to, ...rest } = args;
|
|
298
306
|
|
|
299
|
-
const
|
|
307
|
+
const localizedTo = `/${LOCALE_ROUTE}${to}` as any;
|
|
300
308
|
|
|
301
|
-
return navigate({
|
|
309
|
+
return navigate({
|
|
310
|
+
to: localizedTo,
|
|
311
|
+
params: { locale: localePrefix, ...rest } as any,
|
|
312
|
+
});
|
|
302
313
|
};
|
|
303
314
|
|
|
304
315
|
return localizedNavigate;
|
|
@@ -372,8 +383,13 @@ Tạo một thành phần để cho phép người dùng thay đổi ngôn ngữ
|
|
|
372
383
|
import type { FC } from "react";
|
|
373
384
|
|
|
374
385
|
import { useLocation } from "@tanstack/react-router";
|
|
375
|
-
import {
|
|
376
|
-
|
|
386
|
+
import {
|
|
387
|
+
getHTMLTextDir,
|
|
388
|
+
getLocaleName,
|
|
389
|
+
getPathWithoutLocale,
|
|
390
|
+
getPrefix,
|
|
391
|
+
} from "intlayer";
|
|
392
|
+
import { setLocaleInStorage, useIntlayer, useLocale } from "react-intlayer";
|
|
377
393
|
|
|
378
394
|
import { LocalizedLink, To } from "./localized-link";
|
|
379
395
|
|
|
@@ -392,9 +408,8 @@ export const LocaleSwitcher: FC = () => {
|
|
|
392
408
|
<LocalizedLink
|
|
393
409
|
aria-current={localeEl === locale ? "page" : undefined}
|
|
394
410
|
aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeEl)}`}
|
|
395
|
-
onClick={() =>
|
|
396
|
-
params={{ locale: localeEl }}
|
|
397
|
-
to={pathWithoutLocale as To}
|
|
411
|
+
onClick={() => setLocaleInStorage(localeEl)}
|
|
412
|
+
params={{ locale: getPrefix(localeEl).localePrefix }}
|
|
398
413
|
>
|
|
399
414
|
<span>
|
|
400
415
|
{/* Mã ngôn ngữ - ví dụ: FR */}
|
|
@@ -472,15 +487,15 @@ function LayoutComponent() {
|
|
|
472
487
|
|
|
473
488
|
### Bước 11: Thêm middleware (Tùy chọn)
|
|
474
489
|
|
|
475
|
-
Bạn cũng có thể sử dụng `
|
|
490
|
+
Bạn cũng có thể sử dụng `intlayerProxy` để thêm routing phía server vào ứ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 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.
|
|
476
491
|
|
|
477
|
-
> Lưu ý rằng để sử dụng `
|
|
492
|
+
> 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`.
|
|
478
493
|
|
|
479
494
|
```typescript {3,7} fileName="vite.config.ts"
|
|
480
495
|
import { reactRouter } from "@react-router/dev/vite";
|
|
481
496
|
import tailwindcss từ "@tailwindcss/vite";
|
|
482
497
|
import { defineConfig } từ "vite";
|
|
483
|
-
import { intlayer,
|
|
498
|
+
import { intlayer, intlayerProxy } từ "vite-intlayer";
|
|
484
499
|
import tsconfigPaths from "vite-tsconfig-paths";
|
|
485
500
|
|
|
486
501
|
export default defineConfig({
|
|
@@ -489,7 +504,7 @@ export default defineConfig({
|
|
|
489
504
|
reactRouter(),
|
|
490
505
|
tsconfigPaths(),
|
|
491
506
|
intlayer(),
|
|
492
|
-
|
|
507
|
+
intlayerProxy(),
|
|
493
508
|
],
|
|
494
509
|
});
|
|
495
510
|
```
|
|
@@ -1084,40 +1084,40 @@ const App = () => (
|
|
|
1084
1084
|
module.exports = App;
|
|
1085
1085
|
```
|
|
1086
1086
|
|
|
1087
|
-
Trong khi đó, bạn cũng có thể sử dụng `
|
|
1087
|
+
Trong khi đó, bạn cũng có thể sử dụng `intlayerProxy` để thêm routing phía server vào ứ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 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.
|
|
1088
1088
|
|
|
1089
|
-
> Lưu ý rằng để sử dụng `
|
|
1089
|
+
> 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`.
|
|
1090
1090
|
|
|
1091
1091
|
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
1092
1092
|
import { defineConfig } from "vite";
|
|
1093
1093
|
import preact from "@preact/preset-vite";
|
|
1094
|
-
import { intlayer,
|
|
1094
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
1095
1095
|
|
|
1096
1096
|
// https://vitejs.dev/config/
|
|
1097
1097
|
export default defineConfig({
|
|
1098
|
-
plugins: [preact(), intlayer(),
|
|
1098
|
+
plugins: [preact(), intlayer(), intlayerProxy()],
|
|
1099
1099
|
});
|
|
1100
1100
|
```
|
|
1101
1101
|
|
|
1102
1102
|
```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
|
|
1103
1103
|
import { defineConfig } from "vite";
|
|
1104
1104
|
import preact from "@preact/preset-vite";
|
|
1105
|
-
import { intlayer,
|
|
1105
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
1106
1106
|
|
|
1107
1107
|
// https://vitejs.dev/config/
|
|
1108
1108
|
export default defineConfig({
|
|
1109
|
-
plugins: [preact(), intlayer(),
|
|
1109
|
+
plugins: [preact(), intlayer(), intlayerProxy()],
|
|
1110
1110
|
});
|
|
1111
1111
|
```
|
|
1112
1112
|
|
|
1113
1113
|
```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
|
|
1114
1114
|
const { defineConfig } = require("vite");
|
|
1115
1115
|
const preact = require("@preact/preset-vite");
|
|
1116
|
-
const { intlayer,
|
|
1116
|
+
const { intlayer, intlayerProxy } = require("vite-intlayer");
|
|
1117
1117
|
|
|
1118
1118
|
// https://vitejs.dev/config/
|
|
1119
1119
|
module.exports = defineConfig({
|
|
1120
|
-
plugins: [preact(), intlayer(),
|
|
1120
|
+
plugins: [preact(), intlayer(), intlayerProxy()],
|
|
1121
1121
|
});
|
|
1122
1122
|
```
|
|
1123
1123
|
|
|
@@ -1138,7 +1138,7 @@ import type { FunctionalComponent } from "preact";
|
|
|
1138
1138
|
|
|
1139
1139
|
const LocaleSwitcher: FunctionalComponent = () => {
|
|
1140
1140
|
const location = useLocation();
|
|
1141
|
-
plugins: [preact(), intlayer(),
|
|
1141
|
+
plugins: [preact(), intlayer(), intlayerProxy()],
|
|
1142
1142
|
});
|
|
1143
1143
|
```
|
|
1144
1144
|
|
|
@@ -792,40 +792,40 @@ const App = () => (
|
|
|
792
792
|
);
|
|
793
793
|
```
|
|
794
794
|
|
|
795
|
-
Song song đó, bạn cũng có thể sử dụng `
|
|
795
|
+
Song song đó, 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 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.
|
|
796
796
|
|
|
797
|
-
> Lưu ý rằng để sử dụng `
|
|
797
|
+
> 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`.
|
|
798
798
|
|
|
799
799
|
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
800
800
|
import { defineConfig } from "vite";
|
|
801
801
|
import react from "@vitejs/plugin-react-swc";
|
|
802
|
-
import { intlayer,
|
|
802
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
803
803
|
|
|
804
804
|
// https://vitejs.dev/config/
|
|
805
805
|
export default defineConfig({
|
|
806
|
-
plugins: [react(), intlayer(),
|
|
806
|
+
plugins: [react(), intlayer(), intlayerProxy()],
|
|
807
807
|
});
|
|
808
808
|
```
|
|
809
809
|
|
|
810
810
|
```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
|
|
811
811
|
import { defineConfig } from "vite";
|
|
812
812
|
import react from "@vitejs/plugin-react-swc";
|
|
813
|
-
import { intlayer,
|
|
813
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
814
814
|
|
|
815
815
|
// https://vitejs.dev/config/
|
|
816
816
|
export default defineConfig({
|
|
817
|
-
plugins: [react(), intlayer(),
|
|
817
|
+
plugins: [react(), intlayer(), intlayerProxy()],
|
|
818
818
|
});
|
|
819
819
|
```
|
|
820
820
|
|
|
821
821
|
```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
|
|
822
822
|
const { defineConfig } = require("vite");
|
|
823
823
|
const react = require("@vitejs/plugin-react-swc");
|
|
824
|
-
const { intlayer,
|
|
824
|
+
const { intlayer, intlayerProxy } = require("vite-intlayer");
|
|
825
825
|
|
|
826
826
|
// https://vitejs.dev/config/
|
|
827
827
|
module.exports = defineConfig({
|
|
828
|
-
plugins: [react(), intlayer(),
|
|
828
|
+
plugins: [react(), intlayer(), intlayerProxy()],
|
|
829
829
|
});
|
|
830
830
|
```
|
|
831
831
|
|
|
@@ -682,40 +682,40 @@ import LocaleSwitcher from "@components/LocaleSwitcher.vue";
|
|
|
682
682
|
</template>
|
|
683
683
|
```
|
|
684
684
|
|
|
685
|
-
Song song đó, bạn cũng có thể sử dụng `
|
|
685
|
+
Song song đó, bạn cũng có thể sử dụng `intlayerProxy` để thêm routing phía server vào ứ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 về locale mặc định.
|
|
686
686
|
|
|
687
|
-
> Lưu ý rằng để sử dụng `
|
|
687
|
+
> 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`.
|
|
688
688
|
|
|
689
689
|
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
690
690
|
import { defineConfig } from "vite";
|
|
691
691
|
import vue from "@vitejs/plugin-vue";
|
|
692
|
-
import { intlayer,
|
|
692
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
693
693
|
|
|
694
694
|
// https://vitejs.dev/config/
|
|
695
695
|
export default defineConfig({
|
|
696
|
-
plugins: [vue(), intlayer(),
|
|
696
|
+
plugins: [vue(), intlayer(), intlayerProxy()],
|
|
697
697
|
});
|
|
698
698
|
```
|
|
699
699
|
|
|
700
700
|
```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
|
|
701
701
|
import { defineConfig } from "vite";
|
|
702
702
|
import vue from "@vitejs/plugin-vue";
|
|
703
|
-
import { intlayer,
|
|
703
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
704
704
|
|
|
705
705
|
// https://vitejs.dev/config/
|
|
706
706
|
export default defineConfig({
|
|
707
|
-
plugins: [vue(), intlayer(),
|
|
707
|
+
plugins: [vue(), intlayer(), intlayerProxy()],
|
|
708
708
|
});
|
|
709
709
|
```
|
|
710
710
|
|
|
711
711
|
```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
|
|
712
712
|
const { defineConfig } = require("vite");
|
|
713
713
|
const vue = require("@vitejs/plugin-vue");
|
|
714
|
-
const { intlayer,
|
|
714
|
+
const { intlayer, intlayerProxy } = require("vite-intlayer");
|
|
715
715
|
|
|
716
716
|
// https://vitejs.dev/config/
|
|
717
717
|
module.exports = defineConfig({
|
|
718
|
-
plugins: [vue(), intlayer(),
|
|
718
|
+
plugins: [vue(), intlayer(), intlayerProxy()],
|
|
719
719
|
});
|
|
720
720
|
```
|
|
721
721
|
|
package/docs/vi/releases/v6.md
CHANGED
|
@@ -277,7 +277,7 @@ Hạn chế này xảy ra vì Turbopack không thể chạy các plugin webpack
|
|
|
277
277
|
- Ưu tiên sử dụng tùy chọn toàn cục mới `content.autoFill` để tạo các bản dịch còn thiếu ở quy mô lớn.
|
|
278
278
|
- Sử dụng `npx intlayer content test` để kiểm tra các PR có bản dịch còn thiếu.
|
|
279
279
|
- Để có chẩn đoán chi tiết, đặt `log.mode = 'verbose'`.
|
|
280
|
-
- Sử dụng `intlayer` thay vì `intlayerPlugin` và `
|
|
280
|
+
- Sử dụng `intlayer` thay vì `intlayerPlugin` và `intlayerProxy` thay vì `intlayerProxyPlugin` trong cấu hình Vite của bạn.
|
|
281
281
|
|
|
282
282
|
---
|
|
283
283
|
|
|
@@ -1092,8 +1092,8 @@ import { type FC } from "react";
|
|
|
1092
1092
|
import Link from "next/link";
|
|
1093
1093
|
|
|
1094
1094
|
const LocaleSwitcher: FC = () => {
|
|
1095
|
-
const { locale, pathWithoutLocale, availableLocales } =
|
|
1096
|
-
|
|
1095
|
+
const { locale, pathWithoutLocale, availableLocales, setLocale } =
|
|
1096
|
+
useLocale();
|
|
1097
1097
|
|
|
1098
1098
|
return (
|
|
1099
1099
|
<div>
|
|
@@ -1105,7 +1105,7 @@ const LocaleSwitcher: FC = () => {
|
|
|
1105
1105
|
hrefLang={localeItem}
|
|
1106
1106
|
key={localeItem}
|
|
1107
1107
|
aria-current={locale === localeItem ? "page" : undefined}
|
|
1108
|
-
onClick={() =>
|
|
1108
|
+
onClick={() => setLocale(localeItem)}
|
|
1109
1109
|
>
|
|
1110
1110
|
<span>
|
|
1111
1111
|
{/* 语言区域 - 例如 FR */}
|
|
@@ -1144,8 +1144,8 @@ import { useLocale } from "next-intlayer";
|
|
|
1144
1144
|
import Link from "next/link";
|
|
1145
1145
|
|
|
1146
1146
|
const LocaleSwitcher = () => {
|
|
1147
|
-
const { locale, pathWithoutLocale, availableLocales } =
|
|
1148
|
-
|
|
1147
|
+
const { locale, pathWithoutLocale, availableLocales, setLocale } =
|
|
1148
|
+
useLocale();
|
|
1149
1149
|
|
|
1150
1150
|
return (
|
|
1151
1151
|
<div>
|
|
@@ -1157,7 +1157,7 @@ const LocaleSwitcher = () => {
|
|
|
1157
1157
|
hrefLang={localeItem}
|
|
1158
1158
|
key={localeItem}
|
|
1159
1159
|
aria-current={locale === localeItem ? "page" : undefined}
|
|
1160
|
-
onClick={() =>
|
|
1160
|
+
onClick={() => setLocale(localeItem)}
|
|
1161
1161
|
>
|
|
1162
1162
|
<span>
|
|
1163
1163
|
{/* 语言环境 - 例如 FR */}
|
|
@@ -1196,8 +1196,8 @@ const { useLocale } = require("next-intlayer");
|
|
|
1196
1196
|
const Link = require("next/link");
|
|
1197
1197
|
|
|
1198
1198
|
const LocaleSwitcher = () => {
|
|
1199
|
-
const { locale, pathWithoutLocale, availableLocales } =
|
|
1200
|
-
|
|
1199
|
+
const { locale, pathWithoutLocale, availableLocales, setLocale } =
|
|
1200
|
+
useLocale();
|
|
1201
1201
|
|
|
1202
1202
|
return (
|
|
1203
1203
|
<div>
|
|
@@ -1209,7 +1209,7 @@ const LocaleSwitcher = () => {
|
|
|
1209
1209
|
hrefLang={localeItem}
|
|
1210
1210
|
key={localeItem}
|
|
1211
1211
|
aria-current={locale === localeItem ? "page" : undefined}
|
|
1212
|
-
onClick={() =>
|
|
1212
|
+
onClick={() => setLocale(localeItem)}
|
|
1213
1213
|
>
|
|
1214
1214
|
<span>
|
|
1215
1215
|
{/* 语言环境 - 例如 FR */}
|
|
@@ -1179,8 +1179,8 @@ import { useLocale } from "next-intlayer";
|
|
|
1179
1179
|
import Link from "next/link";
|
|
1180
1180
|
|
|
1181
1181
|
export const LocaleSwitcher: FC = () => {
|
|
1182
|
-
const { locale, pathWithoutLocale, availableLocales } =
|
|
1183
|
-
|
|
1182
|
+
const { locale, pathWithoutLocale, availableLocales, setLocale } =
|
|
1183
|
+
useLocale();
|
|
1184
1184
|
|
|
1185
1185
|
return (
|
|
1186
1186
|
<div>
|
|
@@ -1192,7 +1192,7 @@ export const LocaleSwitcher: FC = () => {
|
|
|
1192
1192
|
hrefLang={localeItem}
|
|
1193
1193
|
key={localeItem}
|
|
1194
1194
|
aria-current={locale === localeItem ? "page" : undefined}
|
|
1195
|
-
onClick={() =>
|
|
1195
|
+
onClick={() => setLocale(localeItem)}
|
|
1196
1196
|
>
|
|
1197
1197
|
<span>
|
|
1198
1198
|
{/* 语言环境 - 例如 FR */}
|
|
@@ -1231,8 +1231,8 @@ import { useLocale } from "next-intlayer";
|
|
|
1231
1231
|
import Link from "next/link";
|
|
1232
1232
|
|
|
1233
1233
|
export const LocaleSwitcher = () => {
|
|
1234
|
-
const { locale, pathWithoutLocale, availableLocales } =
|
|
1235
|
-
|
|
1234
|
+
const { locale, pathWithoutLocale, availableLocales, setLocale } =
|
|
1235
|
+
useLocale();
|
|
1236
1236
|
|
|
1237
1237
|
return (
|
|
1238
1238
|
<div>
|
|
@@ -1244,7 +1244,7 @@ export const LocaleSwitcher = () => {
|
|
|
1244
1244
|
hrefLang={localeItem}
|
|
1245
1245
|
key={localeItem}
|
|
1246
1246
|
aria-current={locale === localeItem ? "page" : undefined}
|
|
1247
|
-
onClick={() =>
|
|
1247
|
+
onClick={() => setLocale(localeItem)}
|
|
1248
1248
|
>
|
|
1249
1249
|
<span>
|
|
1250
1250
|
{/* 语言区域 - 例如 FR */}
|
|
@@ -1283,7 +1283,8 @@ const { useLocale } = require("next-intlayer");
|
|
|
1283
1283
|
const Link = require("next/link");
|
|
1284
1284
|
|
|
1285
1285
|
export const LocaleSwitcher = () => {
|
|
1286
|
-
const { locale, pathWithoutLocale, availableLocales } =
|
|
1286
|
+
const { locale, pathWithoutLocale, availableLocales, setLocale } =
|
|
1287
|
+
useLocale();
|
|
1287
1288
|
|
|
1288
1289
|
return (
|
|
1289
1290
|
<div>
|
|
@@ -1295,7 +1296,7 @@ export const LocaleSwitcher = () => {
|
|
|
1295
1296
|
hrefLang={localeItem}
|
|
1296
1297
|
key={localeItem}
|
|
1297
1298
|
aria-current={locale === localeItem ? "page" : undefined}
|
|
1298
|
-
onClick={() =>
|
|
1299
|
+
onClick={() => setLocale(localeItem)}
|
|
1299
1300
|
>
|
|
1300
1301
|
<span>
|
|
1301
1302
|
{/* 语言环境 - 例如 FR */}
|
|
@@ -149,7 +149,7 @@ export default withIntlayer(nextConfig);
|
|
|
149
149
|
设置中间件以自动检测并处理用户的首选语言环境:
|
|
150
150
|
|
|
151
151
|
```typescript fileName="src/middleware.ts" codeFormat="typescript"
|
|
152
|
-
export {
|
|
152
|
+
export { intlayerProxy as middleware } from "next-intlayer/middleware";
|
|
153
153
|
|
|
154
154
|
export const config = {
|
|
155
155
|
matcher:
|
|
@@ -158,7 +158,7 @@ export const config = {
|
|
|
158
158
|
```
|
|
159
159
|
|
|
160
160
|
```javascript fileName="src/middleware.mjs" codeFormat="esm"
|
|
161
|
-
export {
|
|
161
|
+
export { intlayerProxy as middleware } from "next-intlayer/middleware";
|
|
162
162
|
|
|
163
163
|
export const config = {
|
|
164
164
|
matcher:
|
|
@@ -167,14 +167,14 @@ export const config = {
|
|
|
167
167
|
```
|
|
168
168
|
|
|
169
169
|
```javascript fileName="src/middleware.cjs" codeFormat="commonjs"
|
|
170
|
-
const {
|
|
170
|
+
const { intlayerProxy } = require("next-intlayer/middleware");
|
|
171
171
|
|
|
172
172
|
const config = {
|
|
173
173
|
matcher:
|
|
174
174
|
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
175
175
|
};
|
|
176
176
|
|
|
177
|
-
module.exports = { middleware:
|
|
177
|
+
module.exports = { middleware: intlayerProxy, config };
|
|
178
178
|
```
|
|
179
179
|
|
|
180
180
|
> 调整 `matcher` 参数以匹配您的应用程序路由。更多详情,请参阅 [Next.js 关于配置 matcher 的文档](https://nextjs.org/docs/app/building-your-application/routing/middleware)。
|
|
@@ -1091,7 +1091,6 @@ import Link from "next/link";
|
|
|
1091
1091
|
|
|
1092
1092
|
const LocaleSwitcher: FC = () => {
|
|
1093
1093
|
const { locale, pathWithoutLocale, availableLocales } = useLocalePageRouter();
|
|
1094
|
-
const { setLocaleCookie } = useLocaleCookie();
|
|
1095
1094
|
|
|
1096
1095
|
return (
|
|
1097
1096
|
<div>
|
|
@@ -1103,7 +1102,7 @@ const LocaleSwitcher: FC = () => {
|
|
|
1103
1102
|
hrefLang={localeItem}
|
|
1104
1103
|
key={localeItem}
|
|
1105
1104
|
aria-current={locale === localeItem ? "page" : undefined}
|
|
1106
|
-
onClick={() =>
|
|
1105
|
+
onClick={() => setLocale(localeItem)}
|
|
1107
1106
|
>
|
|
1108
1107
|
<span>
|
|
1109
1108
|
{/* 语言环境 - 例如 FR */}
|
|
@@ -1141,7 +1140,6 @@ import Link from "next/link";
|
|
|
1141
1140
|
|
|
1142
1141
|
const LocaleSwitcher = () => {
|
|
1143
1142
|
const { locale, pathWithoutLocale, availableLocales } = useLocalePageRouter();
|
|
1144
|
-
const { setLocaleCookie } = useLocaleCookie();
|
|
1145
1143
|
|
|
1146
1144
|
return (
|
|
1147
1145
|
<div>
|
|
@@ -1153,7 +1151,7 @@ const LocaleSwitcher = () => {
|
|
|
1153
1151
|
hrefLang={localeItem}
|
|
1154
1152
|
key={localeItem}
|
|
1155
1153
|
aria-current={locale === localeItem ? "page" : undefined}
|
|
1156
|
-
onClick={() =>
|
|
1154
|
+
onClick={() => setLocale(localeItem)}
|
|
1157
1155
|
>
|
|
1158
1156
|
<span>
|
|
1159
1157
|
{/* 语言环境 - 例如 FR */}
|
|
@@ -1191,7 +1189,6 @@ const Link = require("next/link");
|
|
|
1191
1189
|
|
|
1192
1190
|
const LocaleSwitcher = () => {
|
|
1193
1191
|
const { locale, pathWithoutLocale, availableLocales } = useLocalePageRouter();
|
|
1194
|
-
const { setLocaleCookie } = useLocaleCookie();
|
|
1195
1192
|
|
|
1196
1193
|
return (
|
|
1197
1194
|
<select>
|
|
@@ -1201,7 +1198,7 @@ const LocaleSwitcher = () => {
|
|
|
1201
1198
|
href={getLocalizedUrl(pathWithoutLocale, localeItem)}
|
|
1202
1199
|
hrefLang={localeItem}
|
|
1203
1200
|
aria-current={locale === localeItem ? "page" : undefined}
|
|
1204
|
-
onClick={() =>
|
|
1201
|
+
onClick={() => setLocale(localeItem)}
|
|
1205
1202
|
>
|
|
1206
1203
|
<span>
|
|
1207
1204
|
{/* 语言环境 - 例如 FR */}
|
|
@@ -317,7 +317,7 @@ import {
|
|
|
317
317
|
getLocalizedUrl,
|
|
318
318
|
getPathWithoutLocale,
|
|
319
319
|
} from "intlayer";
|
|
320
|
-
import {
|
|
320
|
+
import { setLocaleInStorage, useIntlayer, useLocale } from "react-intlayer";
|
|
321
321
|
import { Link, useLocation } from "react-router";
|
|
322
322
|
|
|
323
323
|
export const LocaleSwitcher: FC = () => {
|
|
@@ -335,7 +335,7 @@ export const LocaleSwitcher: FC = () => {
|
|
|
335
335
|
<Link
|
|
336
336
|
aria-current={localeItem === locale ? "page" : undefined}
|
|
337
337
|
aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeItem)}`}
|
|
338
|
-
onClick={() =>
|
|
338
|
+
onClick={() => setLocale(localeItem)}
|
|
339
339
|
to={getLocalizedUrl(pathWithoutLocale, localeItem)}
|
|
340
340
|
>
|
|
341
341
|
<span>
|
|
@@ -404,18 +404,18 @@ export default function RootLayout() {
|
|
|
404
404
|
|
|
405
405
|
### 第11步:添加中间件(可选)
|
|
406
406
|
|
|
407
|
-
你也可以使用 `
|
|
407
|
+
你也可以使用 `intlayerProxy` 为你的应用添加服务器端路由。该插件会根据 URL 自动检测当前的语言环境,并设置相应的语言环境 cookie。如果未指定语言环境,插件将根据用户浏览器的语言偏好确定最合适的语言环境。如果仍未检测到语言环境,则会重定向到默认语言环境。
|
|
408
408
|
|
|
409
|
-
> 注意,要在生产环境中使用 `
|
|
409
|
+
> 注意,要在生产环境中使用 `intlayerProxy`,你需要将 `vite-intlayer` 包从 `devDependencies` 切换到 `dependencies`。
|
|
410
410
|
|
|
411
411
|
```typescript {3,7} fileName="vite.config.ts"
|
|
412
412
|
import { defineConfig } from "vite";
|
|
413
413
|
import react from "@vitejs/plugin-react-swc";
|
|
414
|
-
import { intlayer,
|
|
414
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
415
415
|
|
|
416
416
|
// https://vitejs.dev/config/
|
|
417
417
|
export default defineConfig({
|
|
418
|
-
plugins: [react(), intlayer(),
|
|
418
|
+
plugins: [react(), intlayer(), intlayerProxy()],
|
|
419
419
|
});
|
|
420
420
|
```
|
|
421
421
|
|
|
@@ -230,12 +230,13 @@ type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
|
|
|
230
230
|
|
|
231
231
|
export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
|
|
232
232
|
const { locale } = useLocale();
|
|
233
|
+
const { localePrefix } = getPrefix(locale);
|
|
233
234
|
|
|
234
235
|
return (
|
|
235
236
|
<Link
|
|
236
237
|
{...props}
|
|
237
238
|
params={{
|
|
238
|
-
locale,
|
|
239
|
+
locale: localePrefix,
|
|
239
240
|
...(typeof props?.params === "object" ? props?.params : {}),
|
|
240
241
|
}}
|
|
241
242
|
to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
|
|
@@ -362,8 +363,13 @@ function RouteComponent() {
|
|
|
362
363
|
import type { FC } from "react";
|
|
363
364
|
|
|
364
365
|
import { useLocation } from "@tanstack/react-router";
|
|
365
|
-
import {
|
|
366
|
-
|
|
366
|
+
import {
|
|
367
|
+
getHTMLTextDir,
|
|
368
|
+
getLocaleName,
|
|
369
|
+
getPathWithoutLocale,
|
|
370
|
+
getPrefix,
|
|
371
|
+
} from "intlayer";
|
|
372
|
+
import { setLocaleInStorage, useIntlayer, useLocale } from "react-intlayer";
|
|
367
373
|
|
|
368
374
|
import { LocalizedLink, To } from "./localized-link";
|
|
369
375
|
|
|
@@ -382,7 +388,7 @@ export const LocaleSwitcher: FC = () => {
|
|
|
382
388
|
<LocalizedLink
|
|
383
389
|
aria-current={localeEl === locale ? "page" : undefined} // 当前语言时设置 aria-current 为 page
|
|
384
390
|
aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeEl)}`} // 设置无障碍标签,显示语言切换器标签和语言名称
|
|
385
|
-
onClick={() =>
|
|
391
|
+
onClick={() => setLocaleInStorage(localeEl)} // 点击时设置语言 cookie
|
|
386
392
|
params={{ locale: localeEl }} // 传递语言参数
|
|
387
393
|
to={pathWithoutLocale as To} // 跳转到不带语言前缀的路径
|
|
388
394
|
>
|
|
@@ -462,15 +468,15 @@ function LayoutComponent() {
|
|
|
462
468
|
|
|
463
469
|
### 第11步:添加中间件(可选)
|
|
464
470
|
|
|
465
|
-
您还可以使用 `
|
|
471
|
+
您还可以使用 `intlayerProxy` 为您的应用程序添加服务器端路由。该插件将根据 URL 自动检测当前语言环境,并设置相应的语言环境 Cookie。如果未指定语言环境,插件将根据用户浏览器的语言偏好确定最合适的语言环境。如果未检测到语言环境,它将重定向到默认语言环境。
|
|
466
472
|
|
|
467
|
-
> 注意,要在生产环境中使用 `
|
|
473
|
+
> 注意,要在生产环境中使用 `intlayerProxy`,您需要将 `vite-intlayer` 包从 `devDependencies` 切换到 `dependencies`。
|
|
468
474
|
|
|
469
475
|
```typescript {3,7} fileName="vite.config.ts"
|
|
470
476
|
import { reactRouter } from "@react-router/dev/vite";
|
|
471
477
|
import tailwindcss from "@tailwindcss/vite";
|
|
472
478
|
import { defineConfig } from "vite";
|
|
473
|
-
import { intlayer,
|
|
479
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
474
480
|
import tsconfigPaths from "vite-tsconfig-paths";
|
|
475
481
|
|
|
476
482
|
export default defineConfig({
|
|
@@ -479,7 +485,7 @@ export default defineConfig({
|
|
|
479
485
|
reactRouter(),
|
|
480
486
|
tsconfigPaths(),
|
|
481
487
|
intlayer(),
|
|
482
|
-
|
|
488
|
+
intlayerProxy(),
|
|
483
489
|
],
|
|
484
490
|
});
|
|
485
491
|
```
|