@intlayer/docs 6.1.6-canary.0 → 6.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +71 -80
- package/dist/cjs/generated/docs.entry.cjs +16 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +16 -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_angular.md +2 -2
- package/docs/ar/intlayer_with_astro.md +246 -0
- package/docs/ar/intlayer_with_create_react_app.md +3 -2
- package/docs/ar/intlayer_with_express.md +2 -2
- package/docs/ar/intlayer_with_nestjs.md +2 -2
- package/docs/ar/intlayer_with_nextjs_14.md +2 -2
- package/docs/ar/intlayer_with_nextjs_15.md +2 -2
- package/docs/ar/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ar/intlayer_with_nuxt.md +2 -2
- package/docs/ar/intlayer_with_react_native+expo.md +11 -20
- package/docs/ar/intlayer_with_react_router_v7.md +195 -241
- package/docs/ar/intlayer_with_tanstack.md +198 -272
- package/docs/ar/intlayer_with_vite+preact.md +9 -9
- 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_angular.md +2 -2
- package/docs/de/intlayer_with_astro.md +246 -0
- package/docs/de/intlayer_with_create_react_app.md +2 -2
- package/docs/de/intlayer_with_express.md +2 -2
- package/docs/de/intlayer_with_nestjs.md +2 -2
- package/docs/de/intlayer_with_nextjs_14.md +2 -2
- package/docs/de/intlayer_with_nextjs_15.md +2 -2
- package/docs/de/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/de/intlayer_with_nuxt.md +2 -2
- package/docs/de/intlayer_with_react_native+expo.md +11 -20
- package/docs/de/intlayer_with_react_router_v7.md +193 -242
- package/docs/de/intlayer_with_tanstack.md +194 -266
- package/docs/de/intlayer_with_vite+preact.md +9 -9
- package/docs/de/intlayer_with_vite+react.md +9 -9
- package/docs/de/intlayer_with_vite+vue.md +11 -11
- package/docs/de/packages/vite-intlayer/index.md +3 -3
- package/docs/en/how_works_intlayer.md +1 -1
- package/docs/en/index.md +1 -1
- package/docs/en/intlayer_cli.md +1 -1
- package/docs/en/intlayer_with_angular.md +4 -4
- package/docs/en/intlayer_with_astro.md +246 -0
- package/docs/en/intlayer_with_create_react_app.md +4 -4
- package/docs/en/intlayer_with_express.md +3 -3
- package/docs/en/intlayer_with_lynx+react.md +1 -1
- package/docs/en/intlayer_with_nestjs.md +2 -2
- package/docs/en/intlayer_with_nextjs_14.md +13 -4
- package/docs/en/intlayer_with_nextjs_15.md +13 -4
- package/docs/en/intlayer_with_nextjs_page_router.md +5 -5
- package/docs/en/intlayer_with_nuxt.md +4 -4
- package/docs/en/intlayer_with_react_native+expo.md +46 -24
- package/docs/en/intlayer_with_react_router_v7.md +164 -211
- package/docs/en/intlayer_with_tanstack.md +166 -241
- package/docs/en/intlayer_with_vite+preact.md +12 -12
- package/docs/en/intlayer_with_vite+react.md +12 -12
- package/docs/en/intlayer_with_vite+solid.md +2 -2
- package/docs/en/intlayer_with_vite+svelte.md +2 -2
- package/docs/en/intlayer_with_vite+vue.md +12 -12
- package/docs/en/introduction.md +1 -1
- package/docs/en/packages/next-intlayer/useDictionary.md +1 -1
- package/docs/en/packages/next-intlayer/useIntlayer.md +1 -1
- package/docs/en/packages/react-intlayer/useDictionary.md +1 -1
- package/docs/en/packages/react-intlayer/useI18n.md +1 -1
- package/docs/en/packages/react-intlayer/useIntlayer.md +1 -1
- package/docs/en/releases/v6.md +1 -0
- package/docs/en/roadmap.md +1 -1
- package/docs/en-GB/intlayer_with_angular.md +3 -3
- package/docs/en-GB/intlayer_with_astro.md +246 -0
- package/docs/en-GB/intlayer_with_create_react_app.md +5 -4
- package/docs/en-GB/intlayer_with_express.md +2 -2
- package/docs/en-GB/intlayer_with_nestjs.md +2 -2
- package/docs/en-GB/intlayer_with_nextjs_14.md +4 -4
- package/docs/en-GB/intlayer_with_nextjs_15.md +2 -2
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/en-GB/intlayer_with_nuxt.md +2 -2
- package/docs/en-GB/intlayer_with_react_native+expo.md +11 -20
- package/docs/en-GB/intlayer_with_react_router_v7.md +171 -220
- package/docs/en-GB/intlayer_with_tanstack.md +174 -248
- package/docs/en-GB/intlayer_with_vite+preact.md +9 -9
- package/docs/en-GB/intlayer_with_vite+react.md +9 -9
- package/docs/en-GB/intlayer_with_vite+vue.md +11 -11
- package/docs/en-GB/packages/next-intlayer/useIntlayer.md +1 -1
- package/docs/en-GB/packages/react-intlayer/useIntlayer.md +1 -1
- package/docs/es/intlayer_with_angular.md +2 -2
- package/docs/es/intlayer_with_astro.md +246 -0
- package/docs/es/intlayer_with_create_react_app.md +3 -2
- package/docs/es/intlayer_with_express.md +2 -2
- package/docs/es/intlayer_with_nextjs_14.md +2 -2
- package/docs/es/intlayer_with_nextjs_15.md +2 -2
- package/docs/es/intlayer_with_react_native+expo.md +11 -20
- package/docs/es/intlayer_with_react_router_v7.md +188 -232
- package/docs/es/intlayer_with_tanstack.md +203 -273
- 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_angular.md +2 -2
- package/docs/fr/intlayer_with_astro.md +246 -0
- package/docs/fr/intlayer_with_create_react_app.md +3 -2
- package/docs/fr/intlayer_with_express.md +2 -2
- package/docs/fr/intlayer_with_nestjs.md +2 -2
- package/docs/fr/intlayer_with_nextjs_14.md +2 -2
- package/docs/fr/intlayer_with_react_native+expo.md +11 -20
- package/docs/fr/intlayer_with_react_router_v7.md +188 -248
- package/docs/fr/intlayer_with_tanstack.md +192 -265
- 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_cli.md +1 -4
- package/docs/hi/intlayer_with_angular.md +2 -2
- package/docs/hi/intlayer_with_astro.md +246 -0
- package/docs/hi/intlayer_with_create_react_app.md +2 -2
- package/docs/hi/intlayer_with_express.md +2 -2
- package/docs/hi/intlayer_with_nestjs.md +2 -2
- package/docs/hi/intlayer_with_nextjs_14.md +2 -2
- package/docs/hi/intlayer_with_nextjs_15.md +2 -2
- package/docs/hi/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/hi/intlayer_with_nuxt.md +2 -2
- package/docs/hi/intlayer_with_react_native+expo.md +11 -20
- package/docs/hi/intlayer_with_react_router_v7.md +199 -243
- package/docs/hi/intlayer_with_tanstack.md +210 -285
- package/docs/hi/intlayer_with_vite+preact.md +9 -9
- package/docs/hi/intlayer_with_vite+react.md +9 -9
- package/docs/hi/intlayer_with_vite+solid.md +1 -1
- package/docs/hi/intlayer_with_vite+vue.md +11 -11
- package/docs/it/intlayer_with_angular.md +2 -2
- package/docs/it/intlayer_with_astro.md +246 -0
- package/docs/it/intlayer_with_create_react_app.md +3 -2
- package/docs/it/intlayer_with_express.md +2 -2
- package/docs/it/intlayer_with_nestjs.md +2 -2
- package/docs/it/intlayer_with_nextjs_14.md +2 -2
- package/docs/it/intlayer_with_nextjs_15.md +2 -2
- package/docs/it/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/it/intlayer_with_nuxt.md +2 -2
- package/docs/it/intlayer_with_react_native+expo.md +11 -21
- package/docs/it/intlayer_with_react_router_v7.md +195 -242
- package/docs/it/intlayer_with_tanstack.md +203 -267
- package/docs/it/intlayer_with_vite+preact.md +9 -9
- package/docs/it/intlayer_with_vite+react.md +13 -11
- package/docs/it/intlayer_with_vite+vue.md +11 -11
- package/docs/ja/intlayer_with_angular.md +2 -2
- package/docs/ja/intlayer_with_astro.md +246 -0
- package/docs/ja/intlayer_with_create_react_app.md +3 -2
- package/docs/ja/intlayer_with_express.md +2 -2
- package/docs/ja/intlayer_with_nestjs.md +2 -2
- package/docs/ja/intlayer_with_nextjs_14.md +2 -2
- package/docs/ja/intlayer_with_nextjs_15.md +2 -2
- package/docs/ja/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ja/intlayer_with_nuxt.md +2 -2
- package/docs/ja/intlayer_with_react_native+expo.md +18 -29
- package/docs/ja/intlayer_with_react_router_v7.md +204 -250
- package/docs/ja/intlayer_with_tanstack.md +218 -286
- package/docs/ja/intlayer_with_vite+preact.md +9 -9
- package/docs/ja/intlayer_with_vite+react.md +11 -11
- package/docs/ja/intlayer_with_vite+vue.md +11 -11
- package/docs/ko/intlayer_with_angular.md +2 -2
- package/docs/ko/intlayer_with_astro.md +246 -0
- package/docs/ko/intlayer_with_create_react_app.md +3 -2
- package/docs/ko/intlayer_with_express.md +2 -2
- package/docs/ko/intlayer_with_nestjs.md +2 -2
- package/docs/ko/intlayer_with_nextjs_14.md +2 -2
- package/docs/ko/intlayer_with_nextjs_15.md +2 -2
- package/docs/ko/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ko/intlayer_with_nuxt.md +2 -2
- package/docs/ko/intlayer_with_react_native+expo.md +19 -28
- package/docs/ko/intlayer_with_react_router_v7.md +190 -244
- package/docs/ko/intlayer_with_tanstack.md +200 -270
- package/docs/ko/intlayer_with_vite+preact.md +9 -9
- package/docs/ko/intlayer_with_vite+react.md +9 -9
- package/docs/ko/intlayer_with_vite+vue.md +11 -11
- package/docs/pt/intlayer_with_angular.md +2 -2
- package/docs/pt/intlayer_with_astro.md +246 -0
- package/docs/pt/intlayer_with_create_react_app.md +3 -2
- package/docs/pt/intlayer_with_express.md +2 -2
- package/docs/pt/intlayer_with_nestjs.md +2 -2
- package/docs/pt/intlayer_with_nextjs_14.md +2 -2
- package/docs/pt/intlayer_with_nextjs_15.md +2 -2
- package/docs/pt/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/pt/intlayer_with_nuxt.md +2 -2
- package/docs/pt/intlayer_with_react_native+expo.md +11 -20
- package/docs/pt/intlayer_with_react_router_v7.md +7 -13
- package/docs/pt/intlayer_with_tanstack.md +183 -258
- package/docs/pt/intlayer_with_vite+preact.md +9 -9
- package/docs/pt/intlayer_with_vite+react.md +9 -9
- package/docs/pt/intlayer_with_vite+vue.md +9 -9
- package/docs/ru/intlayer_with_angular.md +2 -2
- package/docs/ru/intlayer_with_astro.md +246 -0
- package/docs/ru/intlayer_with_create_react_app.md +3 -2
- package/docs/ru/intlayer_with_express.md +2 -2
- package/docs/ru/intlayer_with_nestjs.md +2 -2
- package/docs/ru/intlayer_with_nextjs_14.md +2 -2
- package/docs/ru/intlayer_with_nextjs_15.md +2 -2
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +2 -2
- package/docs/ru/intlayer_with_react_native+expo.md +11 -20
- package/docs/ru/intlayer_with_react_router_v7.md +192 -238
- package/docs/ru/intlayer_with_tanstack.md +197 -269
- package/docs/ru/intlayer_with_vite+preact.md +9 -9
- package/docs/ru/intlayer_with_vite+react.md +9 -9
- package/docs/ru/intlayer_with_vite+vue.md +11 -11
- package/docs/tr/how_works_intlayer.md +1 -1
- package/docs/tr/index.md +1 -1
- package/docs/tr/intlayer_cli.md +1 -1
- package/docs/tr/intlayer_with_angular.md +4 -4
- package/docs/tr/intlayer_with_astro.md +246 -0
- package/docs/tr/intlayer_with_create_react_app.md +4 -4
- package/docs/tr/intlayer_with_express.md +3 -3
- package/docs/tr/intlayer_with_lynx+react.md +1 -1
- package/docs/tr/intlayer_with_nestjs.md +2 -2
- package/docs/tr/intlayer_with_nextjs_14.md +2 -2
- package/docs/tr/intlayer_with_nextjs_15.md +4 -4
- package/docs/tr/intlayer_with_nextjs_page_router.md +5 -5
- package/docs/tr/intlayer_with_nuxt.md +4 -4
- package/docs/tr/intlayer_with_react_native+expo.md +12 -21
- package/docs/tr/intlayer_with_react_router_v7.md +222 -267
- package/docs/tr/intlayer_with_tanstack.md +400 -303
- package/docs/tr/intlayer_with_vite+preact.md +12 -12
- package/docs/tr/intlayer_with_vite+react.md +12 -12
- package/docs/tr/intlayer_with_vite+solid.md +2 -2
- package/docs/tr/intlayer_with_vite+svelte.md +2 -2
- package/docs/tr/intlayer_with_vite+vue.md +12 -12
- package/docs/tr/introduction.md +1 -1
- package/docs/tr/packages/react-intlayer/useDictionary.md +1 -1
- package/docs/tr/packages/react-intlayer/useI18n.md +1 -1
- package/docs/tr/roadmap.md +1 -1
- package/docs/zh/intlayer_with_angular.md +2 -2
- package/docs/zh/intlayer_with_astro.md +246 -0
- package/docs/zh/intlayer_with_create_react_app.md +3 -2
- package/docs/zh/intlayer_with_express.md +2 -2
- package/docs/zh/intlayer_with_nestjs.md +2 -2
- package/docs/zh/intlayer_with_nextjs_14.md +2 -2
- package/docs/zh/intlayer_with_nextjs_15.md +2 -2
- package/docs/zh/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/zh/intlayer_with_nuxt.md +2 -2
- package/docs/zh/intlayer_with_react_native+expo.md +19 -28
- package/docs/zh/intlayer_with_react_router_v7.md +200 -248
- package/docs/zh/intlayer_with_tanstack.md +208 -283
- package/docs/zh/intlayer_with_vite+preact.md +9 -9
- package/docs/zh/intlayer_with_vite+react.md +9 -9
- package/docs/zh/intlayer_with_vite+vue.md +9 -9
- package/package.json +11 -11
- package/src/generated/docs.entry.ts +16 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
createdAt: 2025-09-09
|
|
3
3
|
updatedAt: 2025-09-09
|
|
4
4
|
title: 在 Tanstack Start 中使用 Intlayer 入门
|
|
5
|
-
description: 学习如何使用 Intlayer 为您的 Tanstack Start 应用添加国际化 (i18n)
|
|
5
|
+
description: 学习如何使用 Intlayer 为您的 Tanstack Start 应用添加国际化 (i18n)。按照本综合指南,使您的应用支持多语言并具备基于区域设置的路由功能。
|
|
6
6
|
keywords:
|
|
7
7
|
- 国际化
|
|
8
8
|
- 文档
|
|
@@ -15,19 +15,17 @@ keywords:
|
|
|
15
15
|
slugs:
|
|
16
16
|
- doc
|
|
17
17
|
- environment
|
|
18
|
-
- vite-and-react
|
|
19
18
|
- tanstack-start
|
|
20
|
-
applicationTemplate: https://github.com/
|
|
21
|
-
author: AydinTheFirst
|
|
19
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
|
|
22
20
|
---
|
|
23
21
|
|
|
24
22
|
# 使用 Intlayer 和 Tanstack Start 开始国际化 (i18n)
|
|
25
23
|
|
|
26
|
-
|
|
24
|
+
本指南演示如何在 Tanstack Start 项目中集成 **Intlayer**,实现无缝国际化,支持基于区域设置的路由、TypeScript 支持以及现代开发实践。
|
|
27
25
|
|
|
28
26
|
## 什么是 Intlayer?
|
|
29
27
|
|
|
30
|
-
**Intlayer**
|
|
28
|
+
**Intlayer** 是一个创新的开源国际化(i18n)库,旨在简化现代 Web 应用中的多语言支持。
|
|
31
29
|
|
|
32
30
|
使用 Intlayer,您可以:
|
|
33
31
|
|
|
@@ -43,7 +41,7 @@ author: AydinTheFirst
|
|
|
43
41
|
|
|
44
42
|
### 第一步:创建项目
|
|
45
43
|
|
|
46
|
-
首先,按照 TanStack Start 网站上的[
|
|
44
|
+
首先,按照 TanStack Start 网站上的[新建项目](https://tanstack.com/start/latest/docs/framework/react/quick-start)指南创建一个新的 TanStack Start 项目。
|
|
47
45
|
|
|
48
46
|
### 第二步:安装 Intlayer 包
|
|
49
47
|
|
|
@@ -61,114 +59,61 @@ pnpm add vite-intlayer --save-dev
|
|
|
61
59
|
|
|
62
60
|
- **intlayer**
|
|
63
61
|
|
|
64
|
-
- **intlayer**
|
|
65
|
-
|
|
66
|
-
核心包,提供用于配置管理、翻译、[内容声明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)、转译和[CLI命令](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_cli.md)的国际化工具。
|
|
67
|
-
|
|
68
|
-
- **react-intlayer**
|
|
62
|
+
- **intlayer**
|
|
63
|
+
核心包,提供用于配置管理、翻译、[内容声明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)、转译以及[命令行工具](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_cli.md)的国际化工具。
|
|
69
64
|
|
|
65
|
+
- **react-intlayer**
|
|
70
66
|
将 Intlayer 集成到 React 应用中的包。它为 React 国际化提供上下文提供者和钩子。
|
|
71
67
|
|
|
72
|
-
- **vite-intlayer**
|
|
73
|
-
|
|
74
|
-
包含用于将 Intlayer 集成到[Vite 打包器](https://vite.dev/guide/why.html#why-bundle-for-production)的 Vite 插件,以及用于检测用户首选语言环境、管理 Cookie 和处理 URL 重定向的中间件。
|
|
68
|
+
- **vite-intlayer**
|
|
69
|
+
包含用于将 Intlayer 集成到[Vite 打包器](https://vite.dev/guide/why.html#why-bundle-for-production)的 Vite 插件,以及用于检测用户首选语言、管理 Cookie 和处理 URL 重定向的中间件。
|
|
75
70
|
|
|
76
71
|
### 第三步:项目配置
|
|
77
72
|
|
|
78
73
|
创建一个配置文件来配置您的应用程序语言:
|
|
79
74
|
|
|
80
|
-
```typescript fileName="intlayer.config.ts"
|
|
75
|
+
```typescript fileName="intlayer.config.ts"
|
|
81
76
|
import type { IntlayerConfig } from "intlayer";
|
|
82
77
|
|
|
83
78
|
import { Locales } from "intlayer";
|
|
84
79
|
|
|
85
80
|
const config: IntlayerConfig = {
|
|
86
|
-
internationalization: {
|
|
87
|
-
defaultLocale: Locales.ENGLISH, // 默认语言
|
|
88
|
-
locales: [
|
|
89
|
-
Locales.ENGLISH, // 英语
|
|
90
|
-
Locales.FRENCH, // 法语
|
|
91
|
-
Locales.SPANISH, // 西班牙语
|
|
92
|
-
// 您的其他语言
|
|
93
|
-
],
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
export default config;
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
101
|
-
import { Locales } from "intlayer";
|
|
102
|
-
|
|
103
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
104
|
-
const config = {
|
|
105
|
-
internationalization: {
|
|
106
|
-
defaultLocale: Locales.ENGLISH, // 默认语言
|
|
107
|
-
locales: [
|
|
108
|
-
Locales.ENGLISH, // 英语
|
|
109
|
-
Locales.FRENCH, // 法语
|
|
110
|
-
Locales.SPANISH, // 西班牙语
|
|
111
|
-
// 你的其他语言
|
|
112
|
-
],
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
export default config;
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
120
|
-
const { Locales } = require("intlayer");
|
|
121
|
-
|
|
122
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
123
|
-
const config = {
|
|
124
81
|
internationalization: {
|
|
125
82
|
defaultLocale: Locales.ENGLISH,
|
|
126
|
-
locales: [
|
|
127
|
-
Locales.ENGLISH,
|
|
128
|
-
Locales.FRENCH,
|
|
129
|
-
Locales.SPANISH,
|
|
130
|
-
// 你的其他语言
|
|
131
|
-
],
|
|
83
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
132
84
|
},
|
|
133
85
|
};
|
|
134
86
|
|
|
135
|
-
|
|
87
|
+
export default config;
|
|
136
88
|
```
|
|
137
89
|
|
|
138
|
-
>
|
|
90
|
+
> 通过此配置文件,您可以设置本地化 URL、中间件重定向、cookie 名称、内容声明的位置和扩展名、禁用控制台中的 Intlayer 日志等。有关可用参数的完整列表,请参阅[配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)。
|
|
139
91
|
|
|
140
92
|
### 第4步:在您的 Vite 配置中集成 Intlayer
|
|
141
93
|
|
|
142
94
|
将 intlayer 插件添加到您的配置中:
|
|
143
95
|
|
|
144
|
-
```typescript fileName="vite.config.ts"
|
|
96
|
+
```typescript fileName="vite.config.ts"
|
|
145
97
|
import { reactRouter } from "@react-router/dev/vite";
|
|
146
98
|
import { defineConfig } from "vite";
|
|
147
|
-
import {
|
|
99
|
+
import { intlayer } from "vite-intlayer";
|
|
148
100
|
import tsconfigPaths from "vite-tsconfig-paths";
|
|
149
101
|
|
|
150
102
|
export default defineConfig({
|
|
151
|
-
plugins: [
|
|
152
|
-
reactRouter(),
|
|
153
|
-
tsconfigPaths(),
|
|
154
|
-
intlayer(),
|
|
155
|
-
intlayerMiddlewarePlugin(),
|
|
156
|
-
],
|
|
103
|
+
plugins: [reactRouter(), tsconfigPaths(), intlayer()],
|
|
157
104
|
});
|
|
158
105
|
```
|
|
159
106
|
|
|
160
|
-
> `intlayer()`
|
|
107
|
+
> `intlayer()` Vite 插件用于将 Intlayer 集成到 Vite 中。它确保构建内容声明文件并在开发模式下监视它们。它在 Vite 应用中定义了 Intlayer 环境变量。此外,它还提供别名以优化性能。
|
|
161
108
|
|
|
162
|
-
###
|
|
109
|
+
### 第5步:创建布局组件
|
|
163
110
|
|
|
164
|
-
|
|
111
|
+
设置您的根布局和特定语言环境的布局:
|
|
165
112
|
|
|
166
113
|
#### 根布局
|
|
167
114
|
|
|
168
|
-
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
169
|
-
// src/routes/{-$locale}/route.tsx
|
|
115
|
+
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
170
116
|
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
171
|
-
import { configuration } from "intlayer";
|
|
172
117
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
173
118
|
|
|
174
119
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
@@ -178,10 +123,11 @@ export const Route = createFileRoute("/{-$locale}")({
|
|
|
178
123
|
});
|
|
179
124
|
|
|
180
125
|
function LayoutComponent() {
|
|
126
|
+
const { defaultLocale } = useLocale();
|
|
181
127
|
const { locale } = Route.useParams();
|
|
182
128
|
|
|
183
129
|
return (
|
|
184
|
-
<IntlayerProvider locale={
|
|
130
|
+
<IntlayerProvider locale={defaultLocale}>
|
|
185
131
|
<Outlet />
|
|
186
132
|
</IntlayerProvider>
|
|
187
133
|
);
|
|
@@ -192,7 +138,7 @@ function LayoutComponent() {
|
|
|
192
138
|
|
|
193
139
|
创建并管理您的内容声明以存储翻译:
|
|
194
140
|
|
|
195
|
-
```tsx fileName="src/contents/page.content.ts"
|
|
141
|
+
```tsx fileName="src/contents/page.content.ts"
|
|
196
142
|
import type { Dictionary } from "intlayer";
|
|
197
143
|
|
|
198
144
|
import { t } from "intlayer";
|
|
@@ -201,25 +147,29 @@ const appContent = {
|
|
|
201
147
|
content: {
|
|
202
148
|
links: {
|
|
203
149
|
about: t({
|
|
150
|
+
zh: "关于",
|
|
204
151
|
en: "About",
|
|
205
152
|
es: "Acerca de",
|
|
206
153
|
fr: "À propos",
|
|
207
154
|
}),
|
|
208
155
|
home: t({
|
|
209
|
-
|
|
156
|
+
zh: "首页",
|
|
157
|
+
en: "Home",
|
|
210
158
|
es: "Inicio",
|
|
211
159
|
fr: "Accueil",
|
|
212
160
|
}),
|
|
213
161
|
},
|
|
214
162
|
meta: {
|
|
215
163
|
description: t({
|
|
216
|
-
|
|
164
|
+
zh: "这是一个使用 Intlayer 和 TanStack Router 的示例",
|
|
165
|
+
en: "This is an example of using Intlayer with TanStack Router",
|
|
217
166
|
es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
|
|
218
167
|
fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
|
|
219
168
|
}),
|
|
220
169
|
},
|
|
221
170
|
title: t({
|
|
222
|
-
|
|
171
|
+
zh: "欢迎使用 Intlayer + TanStack Router",
|
|
172
|
+
en: "Welcome to Intlayer + TanStack Router",
|
|
223
173
|
es: "Bienvenido a Intlayer + TanStack Router",
|
|
224
174
|
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
225
175
|
}),
|
|
@@ -230,67 +180,107 @@ const appContent = {
|
|
|
230
180
|
export default appContent;
|
|
231
181
|
```
|
|
232
182
|
|
|
233
|
-
> 您的内容声明可以在应用程序中的任何位置定义,只要它们被包含在 `contentDir` 目录中(默认是 `./app
|
|
183
|
+
> 您的内容声明可以在应用程序中的任何位置定义,只要它们被包含在 `contentDir` 目录中(默认是 `./app`)。并且文件扩展名需匹配内容声明文件扩展名(默认是 `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)。
|
|
234
184
|
|
|
235
185
|
> 更多详情,请参阅[内容声明文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)。
|
|
236
186
|
|
|
237
|
-
### 第7
|
|
187
|
+
### 第7步:创建支持多语言的组件和钩子
|
|
238
188
|
|
|
239
|
-
|
|
189
|
+
创建一个用于多语言导航的 `LocalizedLink` 组件:
|
|
240
190
|
|
|
241
|
-
```tsx fileName="src/components/localized-link.tsx"
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
import { Link, type
|
|
245
|
-
import {
|
|
246
|
-
|
|
191
|
+
```tsx fileName="src/components/localized-link.tsx"
|
|
192
|
+
import type { FC } from "react";
|
|
193
|
+
|
|
194
|
+
import { Link, type LinkComponentProps } from "@tanstack/react-router";
|
|
195
|
+
import { useLocale } from "intlayer";
|
|
196
|
+
|
|
197
|
+
export const LOCALE_ROUTE = "{-$locale}" as const;
|
|
198
|
+
|
|
199
|
+
// 主要工具类型
|
|
200
|
+
export type RemoveLocaleParam<T> = T extends string
|
|
201
|
+
? RemoveLocaleFromString<T>
|
|
202
|
+
: T;
|
|
203
|
+
|
|
204
|
+
export type To = RemoveLocaleParam<LinkComponentProps["to"]>;
|
|
205
|
+
|
|
206
|
+
type CollapseDoubleSlashes<S extends string> =
|
|
207
|
+
S extends `${infer H}//${infer T}` ? CollapseDoubleSlashes<`${H}/${T}`> : S;
|
|
247
208
|
|
|
248
209
|
type LocalizedLinkProps = {
|
|
249
|
-
to
|
|
250
|
-
} & Omit<
|
|
210
|
+
to?: To;
|
|
211
|
+
} & Omit<LinkComponentProps, "to">;
|
|
251
212
|
|
|
252
|
-
|
|
253
|
-
|
|
213
|
+
// 辅助类型
|
|
214
|
+
type RemoveAll<
|
|
215
|
+
S extends string,
|
|
216
|
+
Sub extends string,
|
|
217
|
+
> = S extends `${infer H}${Sub}${infer T}` ? RemoveAll<`${H}${T}`, Sub> : S;
|
|
254
218
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
219
|
+
type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
|
|
220
|
+
RemoveAll<S, typeof LOCALE_ROUTE>
|
|
221
|
+
>;
|
|
258
222
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
: getLocalizedUrl(props.to, locale);
|
|
223
|
+
export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
|
|
224
|
+
const { locale } = useLocale();
|
|
262
225
|
|
|
263
|
-
return
|
|
264
|
-
|
|
226
|
+
return (
|
|
227
|
+
<Link
|
|
228
|
+
{...props}
|
|
229
|
+
params={{
|
|
230
|
+
locale,
|
|
231
|
+
...(typeof props?.params === "object" ? props?.params : {}),
|
|
232
|
+
}}
|
|
233
|
+
to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
|
|
234
|
+
/>
|
|
235
|
+
);
|
|
236
|
+
};
|
|
265
237
|
```
|
|
266
238
|
|
|
267
|
-
|
|
239
|
+
该组件有两个目标:
|
|
268
240
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
// eslint-disable-next-line no-restricted-imports
|
|
272
|
-
import { NavigateOptions, useNavigate } from "@tanstack/react-router";
|
|
273
|
-
import { getLocalizedUrl } from "intlayer";
|
|
274
|
-
import { useLocale } from "react-intlayer";
|
|
241
|
+
- 移除 URL 中不必要的 `{-$locale}` 前缀。
|
|
242
|
+
- 将 locale 参数注入 URL,确保用户被直接重定向到本地化路由。
|
|
275
243
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
244
|
+
接下来我们可以创建一个用于编程导航的 `useLocalizedNavigate` 钩子:
|
|
245
|
+
|
|
246
|
+
```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
|
|
247
|
+
import { useLocale } from "react-intlayer";
|
|
248
|
+
import { useNavigate } from "@tanstack/react-router";
|
|
249
|
+
import { LOCALE_ROUTE } from "@/components/localized-link";
|
|
250
|
+
import type { FileRouteTypes } from "@/routeTree.gen";
|
|
279
251
|
|
|
280
252
|
export const useLocalizedNavigate = () => {
|
|
281
253
|
const navigate = useNavigate();
|
|
254
|
+
|
|
282
255
|
const { locale } = useLocale();
|
|
283
256
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
257
|
+
type StripLocalePrefix<T extends string> = T extends
|
|
258
|
+
| `/${typeof LOCALE_ROUTE}`
|
|
259
|
+
| `/${typeof LOCALE_ROUTE}/`
|
|
260
|
+
? "/" // 去除本地化前缀后返回根路径
|
|
261
|
+
: T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
|
|
262
|
+
? `/${Rest}` // 去除本地化前缀后返回剩余路径
|
|
263
|
+
: never;
|
|
264
|
+
|
|
265
|
+
type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
|
|
266
|
+
|
|
267
|
+
interface LocalizedNavigate {
|
|
268
|
+
(to: LocalizedTo): ReturnType<typeof navigate>;
|
|
269
|
+
(
|
|
270
|
+
opts: { to: LocalizedTo } & Record<string, unknown>
|
|
271
|
+
): ReturnType<typeof navigate>;
|
|
272
|
+
}
|
|
287
273
|
|
|
288
|
-
const localizedNavigate = (
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
274
|
+
const localizedNavigate: LocalizedNavigate = (args: any) => {
|
|
275
|
+
if (typeof args === "string") {
|
|
276
|
+
return navigate({ to: `/${LOCALE_ROUTE}${args}`, params: { locale } });
|
|
277
|
+
}
|
|
292
278
|
|
|
293
|
-
|
|
279
|
+
const { to, ...rest } = args;
|
|
280
|
+
|
|
281
|
+
const localedTo = `/${LOCALE_ROUTE}${to}` as any;
|
|
282
|
+
|
|
283
|
+
return navigate({ to: localedTo, params: { locale, ...rest } as any });
|
|
294
284
|
};
|
|
295
285
|
|
|
296
286
|
return localizedNavigate;
|
|
@@ -301,23 +291,9 @@ export const useLocalizedNavigate = () => {
|
|
|
301
291
|
|
|
302
292
|
在整个应用程序中访问您的内容字典:
|
|
303
293
|
|
|
304
|
-
#### 根重定向页面
|
|
305
|
-
|
|
306
|
-
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
307
|
-
// src/routes/page.tsx
|
|
308
|
-
import { useLocale } from "react-intlayer";
|
|
309
|
-
import { Navigate } from "react-router";
|
|
310
|
-
|
|
311
|
-
export default function Page() {
|
|
312
|
-
const { locale } = useLocale();
|
|
313
|
-
|
|
314
|
-
return <Navigate replace to={locale} />;
|
|
315
|
-
}
|
|
316
|
-
```
|
|
317
|
-
|
|
318
294
|
#### 本地化首页
|
|
319
295
|
|
|
320
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
296
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
321
297
|
import { createFileRoute } from "@tanstack/react-router";
|
|
322
298
|
import { getIntlayer } from "intlayer";
|
|
323
299
|
import { useIntlayer } from "react-intlayer";
|
|
@@ -346,16 +322,15 @@ function RouteComponent() {
|
|
|
346
322
|
const navigate = useLocalizedNavigate();
|
|
347
323
|
|
|
348
324
|
return (
|
|
349
|
-
<div
|
|
350
|
-
<div
|
|
325
|
+
<div>
|
|
326
|
+
<div>
|
|
351
327
|
{content.title}
|
|
352
328
|
<LocaleSwitcher />
|
|
353
|
-
<div
|
|
354
|
-
<a href="/">索引</a>
|
|
329
|
+
<div>
|
|
355
330
|
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
356
331
|
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
357
332
|
</div>
|
|
358
|
-
<div
|
|
333
|
+
<div>
|
|
359
334
|
<button onClick={() => navigate({ to: "/" })}>
|
|
360
335
|
{content.links.home}
|
|
361
336
|
</button>
|
|
@@ -369,63 +344,71 @@ function RouteComponent() {
|
|
|
369
344
|
}
|
|
370
345
|
```
|
|
371
346
|
|
|
372
|
-
>
|
|
347
|
+
> 要了解更多关于 `useIntlayer` 钩子的内容,请参阅[文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useIntlayer.md)。
|
|
373
348
|
|
|
374
349
|
### 第9步:创建语言切换组件
|
|
375
350
|
|
|
376
351
|
创建一个组件,允许用户切换语言:
|
|
377
352
|
|
|
378
|
-
```tsx fileName="src/components/locale-switcher.tsx"
|
|
353
|
+
```tsx fileName="src/components/locale-switcher.tsx"
|
|
354
|
+
import type { FC } from "react";
|
|
355
|
+
|
|
379
356
|
import { useLocation } from "@tanstack/react-router";
|
|
380
|
-
import {
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
const {
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
const { availableLocales, locale, setLocale } = useLocale({
|
|
393
|
-
onLocaleChange: (newLocale) => {
|
|
394
|
-
const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
|
|
395
|
-
location.replace(pathWithLocale);
|
|
396
|
-
},
|
|
397
|
-
});
|
|
357
|
+
import { getHTMLTextDir, getLocaleName, getPathWithoutLocale } from "intlayer";
|
|
358
|
+
import { setLocaleCookie, useIntlayer, useLocale } from "react-intlayer";
|
|
359
|
+
|
|
360
|
+
import { LocalizedLink, To } from "./localized-link";
|
|
361
|
+
|
|
362
|
+
export const LocaleSwitcher: FC = () => {
|
|
363
|
+
const { localeSwitcherLabel } = useIntlayer("locale-switcher"); // 使用 useIntlayer 钩子获取语言切换器标签
|
|
364
|
+
const { pathname } = useLocation(); // 获取当前路径名
|
|
365
|
+
|
|
366
|
+
const { availableLocales, locale } = useLocale(); // 获取可用语言列表和当前语言
|
|
367
|
+
|
|
368
|
+
const pathWithoutLocale = getPathWithoutLocale(pathname); // 获取不带语言前缀的路径
|
|
398
369
|
|
|
399
370
|
return (
|
|
400
|
-
<
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
371
|
+
<ol>
|
|
372
|
+
{availableLocales.map((localeEl) => (
|
|
373
|
+
<li key={localeEl}>
|
|
374
|
+
<LocalizedLink
|
|
375
|
+
aria-current={localeEl === locale ? "page" : undefined} // 当前语言时设置 aria-current 为 page
|
|
376
|
+
aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeEl)}`} // 设置无障碍标签,显示语言切换器标签和语言名称
|
|
377
|
+
onClick={() => setLocaleCookie(localeEl)} // 点击时设置语言 cookie
|
|
378
|
+
params={{ locale: localeEl }} // 传递语言参数
|
|
379
|
+
to={pathWithoutLocale as To} // 跳转到不带语言前缀的路径
|
|
380
|
+
>
|
|
381
|
+
<span>
|
|
382
|
+
{/* 语言环境 - 例如 FR */}
|
|
383
|
+
{localeItem}
|
|
384
|
+
</span>
|
|
385
|
+
<span>
|
|
386
|
+
{/* 语言在其自身语言环境中的名称 - 例如 Français */}
|
|
387
|
+
{getLocaleName(localeItem, locale)}
|
|
388
|
+
</span>
|
|
389
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
390
|
+
{/* 语言在当前语言环境中的名称 - 例如当前语言环境为 Locales.SPANISH 时显示 Francés */}
|
|
391
|
+
{getLocaleName(localeItem)}
|
|
392
|
+
</span>
|
|
393
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
394
|
+
{/* 语言的英文名称 - 例如 French */}
|
|
395
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
396
|
+
</span>
|
|
397
|
+
</LocalizedLink>
|
|
398
|
+
</li>
|
|
416
399
|
))}
|
|
417
|
-
</
|
|
400
|
+
</ol>
|
|
418
401
|
);
|
|
419
|
-
}
|
|
402
|
+
};
|
|
420
403
|
```
|
|
421
404
|
|
|
422
|
-
>
|
|
405
|
+
> 要了解有关 `useLocale` 钩子的更多信息,请参阅[文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useLocale.md)。
|
|
423
406
|
|
|
424
|
-
### 第10步:添加HTML属性管理(可选)
|
|
407
|
+
### 第10步:添加 HTML 属性管理(可选)
|
|
425
408
|
|
|
426
|
-
创建一个钩子来管理HTML的lang和dir属性:
|
|
409
|
+
创建一个钩子来管理 HTML 的 lang 和 dir 属性:
|
|
427
410
|
|
|
428
|
-
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
411
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
429
412
|
// src/hooks/useI18nHTMLAttributes.tsx
|
|
430
413
|
import { getHTMLTextDir } from "intlayer";
|
|
431
414
|
import { useEffect } from "react";
|
|
@@ -436,19 +419,18 @@ export const useI18nHTMLAttributes = () => {
|
|
|
436
419
|
|
|
437
420
|
useEffect(() => {
|
|
438
421
|
document.documentElement.lang = locale;
|
|
439
|
-
document.documentElement.dir = getHTMLTextDir(locale);
|
|
422
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
440
423
|
}, [locale]);
|
|
441
424
|
};
|
|
442
425
|
```
|
|
443
426
|
|
|
444
427
|
然后在你的根组件中使用它:
|
|
445
428
|
|
|
446
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
429
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
447
430
|
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
448
|
-
import { configuration } from "intlayer";
|
|
449
431
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
450
432
|
|
|
451
|
-
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; //
|
|
433
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // 导入钩子
|
|
452
434
|
|
|
453
435
|
export const Route = createFileRoute("/{-$locale}")({
|
|
454
436
|
component: LayoutComponent,
|
|
@@ -457,55 +439,54 @@ export const Route = createFileRoute("/{-$locale}")({
|
|
|
457
439
|
function LayoutComponent() {
|
|
458
440
|
useI18nHTMLAttributes(); // 添加此行
|
|
459
441
|
|
|
442
|
+
const { defaultLocale } = useLocale();
|
|
460
443
|
const { locale } = Route.useParams();
|
|
461
444
|
|
|
462
445
|
return (
|
|
463
|
-
<IntlayerProvider locale={locale}>
|
|
446
|
+
<IntlayerProvider locale={locale ?? defaultLocale}>
|
|
464
447
|
<Outlet />
|
|
465
448
|
</IntlayerProvider>
|
|
466
449
|
);
|
|
467
450
|
}
|
|
468
451
|
```
|
|
469
452
|
|
|
470
|
-
|
|
453
|
+
---
|
|
471
454
|
|
|
472
|
-
|
|
455
|
+
### 第11步:添加中间件(可选)
|
|
473
456
|
|
|
474
|
-
|
|
475
|
-
# 构建 Intlayer 字典
|
|
476
|
-
npm run intlayer:build
|
|
457
|
+
您还可以使用 `intlayerMiddleware` 为您的应用程序添加服务器端路由。该插件将根据 URL 自动检测当前语言环境,并设置相应的语言环境 Cookie。如果未指定语言环境,插件将根据用户浏览器的语言偏好确定最合适的语言环境。如果未检测到语言环境,它将重定向到默认语言环境。
|
|
477
458
|
|
|
478
|
-
|
|
479
|
-
npm run dev
|
|
480
|
-
```
|
|
459
|
+
> 注意,要在生产环境中使用 `intlayerMiddleware`,您需要将 `vite-intlayer` 包从 `devDependencies` 切换到 `dependencies`。
|
|
481
460
|
|
|
482
|
-
```
|
|
483
|
-
|
|
484
|
-
|
|
461
|
+
```typescript {3,7} fileName="vite.config.ts"
|
|
462
|
+
import { reactRouter } from "@react-router/dev/vite";
|
|
463
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
464
|
+
import { defineConfig } from "vite";
|
|
465
|
+
import { intlayer, intlayerMiddleware } from "vite-intlayer";
|
|
466
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
485
467
|
|
|
486
|
-
|
|
487
|
-
|
|
468
|
+
export default defineConfig({
|
|
469
|
+
plugins: [
|
|
470
|
+
tailwindcss(),
|
|
471
|
+
reactRouter(),
|
|
472
|
+
tsconfigPaths(),
|
|
473
|
+
intlayer(),
|
|
474
|
+
intlayerMiddleware(),
|
|
475
|
+
],
|
|
476
|
+
});
|
|
488
477
|
```
|
|
489
478
|
|
|
490
|
-
|
|
491
|
-
# 构建 Intlayer 字典
|
|
492
|
-
yarn intlayer:build
|
|
493
|
-
|
|
494
|
-
# 启动开发服务器
|
|
495
|
-
yarn dev
|
|
496
|
-
```
|
|
479
|
+
---
|
|
497
480
|
|
|
498
481
|
### 第12步:配置 TypeScript(可选)
|
|
499
482
|
|
|
500
|
-
Intlayer 使用模块增强来利用 TypeScript
|
|
483
|
+
Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库更健壮。
|
|
501
484
|
|
|
502
485
|
确保您的 TypeScript 配置包含自动生成的类型:
|
|
503
486
|
|
|
504
487
|
```json5 fileName="tsconfig.json"
|
|
505
488
|
{
|
|
506
|
-
|
|
507
|
-
// ... 您现有的 TypeScript 配置
|
|
508
|
-
},
|
|
489
|
+
// ... 您现有的配置
|
|
509
490
|
include: [
|
|
510
491
|
// ... 您现有的包含项
|
|
511
492
|
".intlayer/**/*.ts", // 包含自动生成的类型
|
|
@@ -513,11 +494,13 @@ Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库
|
|
|
513
494
|
}
|
|
514
495
|
```
|
|
515
496
|
|
|
497
|
+
---
|
|
498
|
+
|
|
516
499
|
### Git 配置
|
|
517
500
|
|
|
518
|
-
建议忽略 Intlayer 生成的文件。这样可以避免将它们提交到您的 Git
|
|
501
|
+
建议忽略 Intlayer 生成的文件。这样可以避免将它们提交到您的 Git 仓库中。
|
|
519
502
|
|
|
520
|
-
|
|
503
|
+
要做到这一点,您可以将以下指令添加到您的 `.gitignore` 文件中:
|
|
521
504
|
|
|
522
505
|
```plaintext fileName=".gitignore"
|
|
523
506
|
# 忽略 Intlayer 生成的文件
|
|
@@ -526,64 +509,6 @@ Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库
|
|
|
526
509
|
|
|
527
510
|
---
|
|
528
511
|
|
|
529
|
-
### 第 13 步:创建重定向(可选)
|
|
530
|
-
|
|
531
|
-
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
532
|
-
function LayoutComponent() {
|
|
533
|
-
useI18nHTMLAttributes();
|
|
534
|
-
|
|
535
|
-
const { locale } = Route.useParams();
|
|
536
|
-
const { locale: selectedLocale } = useLocale();
|
|
537
|
-
const { defaultLocale } = configuration.internationalization;
|
|
538
|
-
const { prefixDefault } = configuration.middleware;
|
|
539
|
-
|
|
540
|
-
// 如果 prefixDefault 为 true 且 URL 中没有 locale,则重定向到默认语言
|
|
541
|
-
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
542
|
-
return <Navigate replace to={defaultLocale} />;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
// 如果 URL 中的 locale 与选定的 locale 不匹配,则重定向到选定的 locale
|
|
546
|
-
if (selectedLocale !== defaultLocale && !locale) {
|
|
547
|
-
return <Navigate replace to={selectedLocale} />;
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
return (
|
|
551
|
-
<IntlayerProvider locale={locale}>
|
|
552
|
-
<Outlet />
|
|
553
|
-
</IntlayerProvider>
|
|
554
|
-
);
|
|
555
|
-
}
|
|
556
|
-
```
|
|
557
|
-
|
|
558
|
-
## 生产部署
|
|
559
|
-
|
|
560
|
-
部署您的应用程序时:
|
|
561
|
-
|
|
562
|
-
1. **构建您的应用程序:**
|
|
563
|
-
|
|
564
|
-
```bash
|
|
565
|
-
npm run build
|
|
566
|
-
```
|
|
567
|
-
|
|
568
|
-
2. **构建 Intlayer 词典:**
|
|
569
|
-
|
|
570
|
-
```bash
|
|
571
|
-
npm run intlayer:build
|
|
572
|
-
```
|
|
573
|
-
|
|
574
|
-
3. **如果在生产环境中使用中间件,请将 `vite-intlayer` 移动到依赖项:**
|
|
575
|
-
```bash
|
|
576
|
-
npm install vite-intlayer --save
|
|
577
|
-
```
|
|
578
|
-
|
|
579
|
-
您的应用程序现在将支持:
|
|
580
|
-
|
|
581
|
-
- **URL 结构**:`/en`、`/en/about`、`/tr`、`/tr/about`
|
|
582
|
-
- **基于浏览器偏好的自动语言环境检测**
|
|
583
|
-
- **基于 Tanstack Start 的语言环境感知路由**
|
|
584
|
-
- **带有自动生成类型的 TypeScript 支持**
|
|
585
|
-
- **具有正确语言环境处理的服务器端渲染**
|
|
586
|
-
|
|
587
512
|
## VS Code 扩展
|
|
588
513
|
|
|
589
514
|
为了提升您使用 Intlayer 的开发体验,您可以安装官方的 **Intlayer VS Code 扩展**。
|
|
@@ -592,18 +517,18 @@ function LayoutComponent() {
|
|
|
592
517
|
|
|
593
518
|
该扩展提供:
|
|
594
519
|
|
|
595
|
-
-
|
|
596
|
-
-
|
|
597
|
-
-
|
|
598
|
-
-
|
|
520
|
+
- 翻译键的**自动补全**。
|
|
521
|
+
- 缺失翻译的**实时错误检测**。
|
|
522
|
+
- 翻译内容的**内联预览**。
|
|
523
|
+
- 轻松创建和更新翻译的**快速操作**。
|
|
599
524
|
|
|
600
|
-
有关如何使用该扩展的更多详细信息,请参阅
|
|
525
|
+
有关如何使用该扩展的更多详细信息,请参阅[Intlayer VS Code 扩展文档](https://intlayer.org/doc/vs-code-extension)。
|
|
601
526
|
|
|
602
527
|
---
|
|
603
528
|
|
|
604
|
-
##
|
|
529
|
+
## 深入探索
|
|
605
530
|
|
|
606
|
-
|
|
531
|
+
要进一步使用,您可以实现[可视化编辑器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_visual_editor.md)或使用[内容管理系统(CMS)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_CMS.md)将内容外部化。
|
|
607
532
|
|
|
608
533
|
---
|
|
609
534
|
|
|
@@ -612,14 +537,14 @@ function LayoutComponent() {
|
|
|
612
537
|
- [Intlayer 文档](https://intlayer.org)
|
|
613
538
|
- [Tanstack Start 文档](https://reactrouter.com/)
|
|
614
539
|
- [useIntlayer 钩子](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useIntlayer.md)
|
|
615
|
-
- [useLocale
|
|
540
|
+
- [useLocale hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/react-intlayer/useLocale.md)
|
|
616
541
|
- [内容声明](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)
|
|
617
542
|
- [配置](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)
|
|
618
543
|
|
|
619
|
-
本综合指南提供了将 Intlayer 与 Tanstack Start
|
|
544
|
+
本综合指南提供了将 Intlayer 与 Tanstack Start 集成所需的一切,支持完全国际化的应用程序,具备基于区域设置的路由和 TypeScript 支持。
|
|
620
545
|
|
|
621
546
|
## 文档历史
|
|
622
547
|
|
|
623
|
-
| 版本 | 日期 | 变更内容
|
|
624
|
-
| ----- | ---------- |
|
|
625
|
-
| 5.8.1 | 2025-09-09 | 为 Tanstack Start
|
|
548
|
+
| 版本 | 日期 | 变更内容 |
|
|
549
|
+
| ----- | ---------- | -------------------------- |
|
|
550
|
+
| 5.8.1 | 2025-09-09 | 为 Tanstack Start 添加支持 |
|