@intlayer/docs 8.5.2 → 8.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/ar/intlayer_with_react_router_v7.md +2 -4
- package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/ar/intlayer_with_svelte_kit.md +2 -2
- package/docs/ar/intlayer_with_tanstack+solid.md +0 -17
- package/docs/ar/intlayer_with_tanstack.md +0 -8
- package/docs/ar/intlayer_with_vite+lit.md +0 -1
- package/docs/ar/intlayer_with_vite+solid.md +0 -1
- package/docs/ar/intlayer_with_vite+svelte.md +1 -1
- package/docs/bn/intlayer_with_vite+lit.md +0 -1
- package/docs/cs/intlayer_with_vite+lit.md +0 -1
- package/docs/de/intlayer_with_react_router_v7.md +2 -4
- package/docs/de/intlayer_with_react_router_v7_fs_routes.md +1 -2
- package/docs/de/intlayer_with_svelte_kit.md +2 -2
- package/docs/de/intlayer_with_tanstack+solid.md +78 -21
- package/docs/de/intlayer_with_tanstack.md +96 -28
- package/docs/de/intlayer_with_vite+lit.md +0 -1
- package/docs/de/intlayer_with_vite+solid.md +0 -1
- package/docs/de/intlayer_with_vite+svelte.md +1 -1
- package/docs/en/intlayer_with_react_router_v7.md +1 -2
- package/docs/en/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/en/intlayer_with_svelte_kit.md +2 -2
- package/docs/en/intlayer_with_tanstack+solid.md +79 -19
- package/docs/en/intlayer_with_tanstack.md +81 -10
- package/docs/en/intlayer_with_vite+lit.md +0 -1
- package/docs/en/intlayer_with_vite+solid.md +0 -1
- package/docs/en/intlayer_with_vite+svelte.md +5 -6
- package/docs/en-GB/intlayer_with_react_router_v7.md +2 -4
- package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/en-GB/intlayer_with_svelte_kit.md +2 -2
- package/docs/en-GB/intlayer_with_tanstack+solid.md +71 -17
- package/docs/en-GB/intlayer_with_tanstack.md +74 -9
- package/docs/en-GB/intlayer_with_vite+lit.md +0 -1
- package/docs/en-GB/intlayer_with_vite+solid.md +0 -1
- package/docs/en-GB/intlayer_with_vite+svelte.md +1 -1
- package/docs/es/intlayer_with_react_router_v7.md +2 -4
- package/docs/es/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/es/intlayer_with_svelte_kit.md +2 -2
- package/docs/es/intlayer_with_tanstack+solid.md +78 -21
- package/docs/es/intlayer_with_tanstack.md +96 -28
- package/docs/es/intlayer_with_vite+lit.md +0 -1
- package/docs/es/intlayer_with_vite+solid.md +0 -1
- package/docs/es/intlayer_with_vite+svelte.md +1 -1
- package/docs/fr/intlayer_with_react_router_v7.md +2 -4
- package/docs/fr/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/fr/intlayer_with_svelte_kit.md +3 -3
- package/docs/fr/intlayer_with_tanstack+solid.md +78 -21
- package/docs/fr/intlayer_with_tanstack.md +96 -28
- package/docs/fr/intlayer_with_vite+lit.md +0 -1
- package/docs/fr/intlayer_with_vite+solid.md +0 -1
- package/docs/fr/intlayer_with_vite+svelte.md +1 -1
- package/docs/hi/intlayer_with_react_router_v7.md +2 -4
- package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/hi/intlayer_with_svelte_kit.md +2 -2
- package/docs/hi/intlayer_with_tanstack+solid.md +0 -17
- package/docs/hi/intlayer_with_tanstack.md +0 -8
- package/docs/hi/intlayer_with_vite+lit.md +0 -1
- package/docs/hi/intlayer_with_vite+solid.md +0 -1
- package/docs/hi/intlayer_with_vite+svelte.md +1 -1
- package/docs/id/intlayer_with_react_router_v7.md +2 -4
- package/docs/id/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/id/intlayer_with_svelte_kit.md +2 -2
- package/docs/id/intlayer_with_tanstack+solid.md +0 -17
- package/docs/id/intlayer_with_tanstack.md +0 -8
- package/docs/id/intlayer_with_vite+lit.md +0 -1
- package/docs/id/intlayer_with_vite+solid.md +0 -1
- package/docs/id/intlayer_with_vite+svelte.md +1 -1
- package/docs/it/intlayer_with_react_router_v7.md +2 -4
- package/docs/it/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/it/intlayer_with_svelte_kit.md +3 -3
- package/docs/it/intlayer_with_tanstack+solid.md +76 -19
- package/docs/it/intlayer_with_tanstack.md +96 -30
- package/docs/it/intlayer_with_vite+lit.md +0 -1
- package/docs/it/intlayer_with_vite+solid.md +0 -1
- package/docs/it/intlayer_with_vite+svelte.md +1 -1
- package/docs/ja/intlayer_with_react_router_v7.md +1 -2
- package/docs/ja/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/ja/intlayer_with_tanstack+solid.md +81 -22
- package/docs/ja/intlayer_with_tanstack.md +779 -93
- package/docs/ja/intlayer_with_vite+lit.md +0 -1
- package/docs/ja/intlayer_with_vite+solid.md +0 -1
- package/docs/ja/intlayer_with_vite+svelte.md +1 -1
- package/docs/ko/intlayer_with_react_router_v7.md +2 -4
- package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/ko/intlayer_with_svelte_kit.md +2 -2
- package/docs/ko/intlayer_with_tanstack+solid.md +79 -22
- package/docs/ko/intlayer_with_tanstack.md +95 -101
- package/docs/ko/intlayer_with_vite+lit.md +0 -1
- package/docs/ko/intlayer_with_vite+solid.md +0 -1
- package/docs/ko/intlayer_with_vite+svelte.md +1 -1
- package/docs/nl/intlayer_with_vite+lit.md +0 -1
- package/docs/pl/intlayer_with_react_router_v7.md +2 -4
- package/docs/pl/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/pl/intlayer_with_svelte_kit.md +2 -2
- package/docs/pl/intlayer_with_tanstack+solid.md +0 -17
- package/docs/pl/intlayer_with_tanstack.md +0 -8
- package/docs/pl/intlayer_with_vite+lit.md +0 -1
- package/docs/pl/intlayer_with_vite+solid.md +0 -1
- package/docs/pl/intlayer_with_vite+svelte.md +1 -1
- package/docs/pt/intlayer_with_react_router_v7.md +1 -2
- package/docs/pt/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/pt/intlayer_with_svelte_kit.md +3 -3
- package/docs/pt/intlayer_with_tanstack+solid.md +76 -19
- package/docs/pt/intlayer_with_tanstack.md +96 -30
- package/docs/pt/intlayer_with_vite+lit.md +0 -1
- package/docs/pt/intlayer_with_vite+solid.md +0 -1
- package/docs/pt/intlayer_with_vite+svelte.md +1 -1
- package/docs/ru/intlayer_with_react_router_v7.md +2 -4
- package/docs/ru/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/ru/intlayer_with_svelte_kit.md +2 -2
- package/docs/ru/intlayer_with_tanstack+solid.md +78 -21
- package/docs/ru/intlayer_with_tanstack.md +99 -33
- package/docs/ru/intlayer_with_vite+lit.md +0 -1
- package/docs/ru/intlayer_with_vite+solid.md +0 -1
- package/docs/ru/intlayer_with_vite+svelte.md +1 -1
- package/docs/tr/intlayer_with_react_router_v7.md +2 -4
- package/docs/tr/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/tr/intlayer_with_svelte_kit.md +2 -2
- package/docs/tr/intlayer_with_tanstack+solid.md +0 -17
- package/docs/tr/intlayer_with_tanstack.md +0 -8
- package/docs/tr/intlayer_with_vite+lit.md +0 -1
- package/docs/tr/intlayer_with_vite+solid.md +0 -1
- package/docs/tr/intlayer_with_vite+svelte.md +1 -1
- package/docs/uk/intlayer_with_react_router_v7.md +1 -2
- package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/uk/intlayer_with_svelte_kit.md +2 -2
- package/docs/uk/intlayer_with_tanstack+solid.md +0 -17
- package/docs/uk/intlayer_with_tanstack.md +0 -8
- package/docs/uk/intlayer_with_vite+lit.md +0 -1
- package/docs/uk/intlayer_with_vite+solid.md +0 -1
- package/docs/uk/intlayer_with_vite+svelte.md +1 -1
- package/docs/ur/intlayer_with_vite+lit.md +0 -1
- package/docs/vi/intlayer_with_react_router_v7.md +2 -4
- package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/vi/intlayer_with_svelte_kit.md +2 -2
- package/docs/vi/intlayer_with_tanstack+solid.md +0 -17
- package/docs/vi/intlayer_with_tanstack.md +0 -8
- package/docs/vi/intlayer_with_vite+lit.md +0 -1
- package/docs/vi/intlayer_with_vite+solid.md +0 -1
- package/docs/vi/intlayer_with_vite+svelte.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +2 -4
- package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/zh/intlayer_with_svelte_kit.md +2 -2
- package/docs/zh/intlayer_with_tanstack+solid.md +80 -23
- package/docs/zh/intlayer_with_tanstack.md +96 -104
- package/docs/zh/intlayer_with_vite+lit.md +0 -1
- package/docs/zh/intlayer_with_vite+solid.md +0 -1
- package/docs/zh/intlayer_with_vite+svelte.md +1 -1
- package/package.json +8 -8
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-03-25
|
|
3
|
-
updatedAt: 2026-03-
|
|
3
|
+
updatedAt: 2026-03-29
|
|
4
4
|
title: Tanstack Start i18n - 如何在 2026 年使用 Solid.js 翻译 Tanstack Start 应用
|
|
5
|
-
description: 了解如何使用 Intlayer 和 Solid.js 为您的 Tanstack Start
|
|
5
|
+
description: 了解如何使用 Intlayer 和 Solid.js 为您的 Tanstack Start 应用程序添加 internationalization (i18n)。按照此综合指南创建具有本地化感知路由的多语言应用。
|
|
6
6
|
keywords:
|
|
7
7
|
- 国际化
|
|
8
8
|
- 文档
|
|
@@ -12,6 +12,7 @@ keywords:
|
|
|
12
12
|
- i18n
|
|
13
13
|
- TypeScript
|
|
14
14
|
- 语言路由
|
|
15
|
+
- Sitemap
|
|
15
16
|
slugs:
|
|
16
17
|
- doc
|
|
17
18
|
- environment
|
|
@@ -140,16 +141,12 @@ export default config;
|
|
|
140
141
|
import { intlayer } from "vite-intlayer";
|
|
141
142
|
import { defineConfig } from "vite";
|
|
142
143
|
import { devtools } from "@tanstack/devtools-vite";
|
|
143
|
-
import viteTsConfigPaths from "vite-tsconfig-paths";
|
|
144
144
|
import { tanstackStart } from "@tanstack/solid-start/plugin/vite";
|
|
145
145
|
import solidPlugin from "vite-plugin-solid";
|
|
146
146
|
|
|
147
147
|
export default defineConfig({
|
|
148
148
|
plugins: [
|
|
149
149
|
devtools(),
|
|
150
|
-
viteTsConfigPaths({
|
|
151
|
-
projects: ["./tsconfig.json"],
|
|
152
|
-
}),
|
|
153
150
|
tanstackStart({
|
|
154
151
|
router: {
|
|
155
152
|
routeFileIgnorePattern:
|
|
@@ -221,9 +218,6 @@ function RootComponent() {
|
|
|
221
218
|
}
|
|
222
219
|
```
|
|
223
220
|
|
|
224
|
-
> [!NOTE]
|
|
225
|
-
> 在 Solid 中,`useMatches` 返回一个 **signal** (响应式访问器)。请使用 `matches()` (带括号) 来响应式地访问当前值。
|
|
226
|
-
|
|
227
221
|
### 第 6 步:创建语言布局 (可选)
|
|
228
222
|
|
|
229
223
|
创建一个处理语言前缀并执行验证的布局。此布局将确保仅处理有效的语言。
|
|
@@ -415,7 +409,6 @@ function RouteComponent() {
|
|
|
415
409
|
}
|
|
416
410
|
```
|
|
417
411
|
|
|
418
|
-
> [!NOTE]
|
|
419
412
|
> 在 Solid 中,`useIntlayer` 返回一个 **accessor** 函数 (例如:`content()`)。您必须调用该函数以访问响应式内容。
|
|
420
413
|
>
|
|
421
414
|
> 欲了解更多关于 `useIntlayer` 钩子的信息,请参考[文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/solid-intlayer/useIntlayer.md)。
|
|
@@ -460,7 +453,6 @@ export const LocaleSwitcher = () => {
|
|
|
460
453
|
export default LocaleSwitcher;
|
|
461
454
|
```
|
|
462
455
|
|
|
463
|
-
> [!NOTE]
|
|
464
456
|
> 在 Solid 中,来自 `useLocale` 的 `locale` 是一个 **signal accessor**。请使用 `locale()` (带括号) 来响应式地读取其当前值。
|
|
465
457
|
>
|
|
466
458
|
> 欲了解更多关于 `useLocale` 钩子的信息,请参考[文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/packages/solid-intlayer/useLocale.md)。
|
|
@@ -502,15 +494,11 @@ import solid from "vite-plugin-solid";
|
|
|
502
494
|
import { nitro } from "nitro/vite";
|
|
503
495
|
import { defineConfig } from "vite";
|
|
504
496
|
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
505
|
-
import viteTsConfigPaths from "vite-tsconfig-paths";
|
|
506
497
|
|
|
507
498
|
export default defineConfig({
|
|
508
499
|
plugins: [
|
|
509
500
|
intlayerProxy(), // 如果您使用 Nitro,Proxy 应放置在服务器之前
|
|
510
501
|
nitro(),
|
|
511
|
-
viteTsConfigPaths({
|
|
512
|
-
projects: ["./tsconfig.json"],
|
|
513
|
-
}),
|
|
514
502
|
intlayer(),
|
|
515
503
|
tanstackStart({
|
|
516
504
|
router: {
|
|
@@ -525,7 +513,7 @@ export default defineConfig({
|
|
|
525
513
|
|
|
526
514
|
---
|
|
527
515
|
|
|
528
|
-
### 第
|
|
516
|
+
### 第 12 步:国际化您的元数据 (可选)
|
|
529
517
|
|
|
530
518
|
您还可以在 `head` 加载器中使用 `getIntlayer` 函数访问您的内容字典,以实现语言感知的元数据:
|
|
531
519
|
|
|
@@ -551,7 +539,7 @@ export const Route = createFileRoute("/{-$locale}/")({
|
|
|
551
539
|
|
|
552
540
|
---
|
|
553
541
|
|
|
554
|
-
### 第
|
|
542
|
+
### 第 13 步:在服务器操作中获取语言 (可选)
|
|
555
543
|
|
|
556
544
|
您可能希望从服务器操作 (server actions) 或 API 端点中访问当前语言。
|
|
557
545
|
您可以使用 `intlayer` 提供的 `getLocale` 助手函数来实现这一点。
|
|
@@ -588,7 +576,7 @@ export const getLocaleServer = createServerFn().handler(async () => {
|
|
|
588
576
|
|
|
589
577
|
---
|
|
590
578
|
|
|
591
|
-
### 第
|
|
579
|
+
### 第 14 步:管理“未找到”页面 (可选)
|
|
592
580
|
|
|
593
581
|
当用户访问不存在的页面时,您可以显示自定义的 404 页面,而语言前缀可能会影响 404 页面的触发方式。
|
|
594
582
|
|
|
@@ -662,7 +650,7 @@ export const Route = createFileRoute("/{-$locale}/$")({
|
|
|
662
650
|
});
|
|
663
651
|
```
|
|
664
652
|
|
|
665
|
-
###
|
|
653
|
+
### 第 15 步:提取组件中的内容 (可选)
|
|
666
654
|
|
|
667
655
|
如果您拥有现有的代码库,转换数千个文件可能会非常耗时。
|
|
668
656
|
|
|
@@ -803,16 +791,12 @@ bun x intlayer extract
|
|
|
803
791
|
import { intlayer, intlayerCompiler } from "vite-intlayer";
|
|
804
792
|
import { defineConfig } from "vite";
|
|
805
793
|
import { devtools } from "@tanstack/devtools-vite";
|
|
806
|
-
import viteTsConfigPaths from "vite-tsconfig-paths";
|
|
807
794
|
import { tanstackStart } from "@tanstack/solid-start/plugin/vite";
|
|
808
795
|
import solidPlugin from "vite-plugin-solid";
|
|
809
796
|
|
|
810
797
|
export default defineConfig({
|
|
811
798
|
plugins: [
|
|
812
799
|
devtools(),
|
|
813
|
-
viteTsConfigPaths({
|
|
814
|
-
projects: ["./tsconfig.json"],
|
|
815
|
-
}),
|
|
816
800
|
tanstackStart({
|
|
817
801
|
router: {
|
|
818
802
|
routeFileIgnorePattern:
|
|
@@ -847,6 +831,79 @@ bun run build # 或 bun run dev
|
|
|
847
831
|
|
|
848
832
|
---
|
|
849
833
|
|
|
834
|
+
### 第 16 步:生成站点地图 (可选)
|
|
835
|
+
|
|
836
|
+
Intlayer 带有内置的站点地图生成器,可帮助您轻松为应用程序创建站点地图。它处理本地化路由并为搜索引擎添加必要的元数据。
|
|
837
|
+
|
|
838
|
+
> Intlayer 生成的站点地图支持 `xhtml:link` 命名空间(Hreflang XML 扩展)。与仅列出原始 URL 的默认站点地图生成器不同,Intlayer 会自动在页面的所有语言版本(例如 `/about`、`/about?lang=fr` 和 `/about?lang=es`)之间创建所需的双向链接。这确保了搜索引擎能够正确索引并向合适的受众提供正确的语言版本。
|
|
839
|
+
|
|
840
|
+
要使用它,您首先需要配置 `vite.config.ts` 以启用本地化路由的预渲染,并禁用 TanStack Start 的默认站点地图生成。
|
|
841
|
+
|
|
842
|
+
```typescript fileName="vite.config.ts"
|
|
843
|
+
import { localeMap, localeFlatMap } from "intlayer";
|
|
844
|
+
// ... 其他导入
|
|
845
|
+
|
|
846
|
+
export const pathList = ["", "/about", "/404"];
|
|
847
|
+
|
|
848
|
+
const localizedPages = localeFlatMap(({ urlPrefix }) =>
|
|
849
|
+
pathList.map((path) => ({
|
|
850
|
+
path: `${urlPrefix}${path}`,
|
|
851
|
+
prerender: {
|
|
852
|
+
enabled: true,
|
|
853
|
+
},
|
|
854
|
+
}))
|
|
855
|
+
);
|
|
856
|
+
|
|
857
|
+
export default defineConfig({
|
|
858
|
+
plugins: [
|
|
859
|
+
// ... 其他插件
|
|
860
|
+
tanstackStart({
|
|
861
|
+
// ... 其他配置
|
|
862
|
+
sitemap: {
|
|
863
|
+
enabled: false,
|
|
864
|
+
},
|
|
865
|
+
prerender: {
|
|
866
|
+
enabled: true,
|
|
867
|
+
crawlLinks: false,
|
|
868
|
+
concurrency: 10,
|
|
869
|
+
},
|
|
870
|
+
pages: localizedPages,
|
|
871
|
+
}),
|
|
872
|
+
],
|
|
873
|
+
});
|
|
874
|
+
```
|
|
875
|
+
|
|
876
|
+
然后,创建一个使用 `generateSitemap` 函数的 `src/routes/sitemap[.]xml.ts` 路由:
|
|
877
|
+
|
|
878
|
+
```typescript fileName="src/routes/sitemap[.]xml.ts"
|
|
879
|
+
import { createFileRoute } from "@tanstack/solid-router";
|
|
880
|
+
import { generateSitemap } from "intlayer";
|
|
881
|
+
|
|
882
|
+
const SITE_URL = "http://localhost:3000";
|
|
883
|
+
|
|
884
|
+
export const Route = createFileRoute("/sitemap.xml")({
|
|
885
|
+
server: {
|
|
886
|
+
handlers: {
|
|
887
|
+
GET: async () => {
|
|
888
|
+
const sitemap = generateSitemap(
|
|
889
|
+
[
|
|
890
|
+
{ path: "/", changefreq: "daily", priority: 1.0 },
|
|
891
|
+
{ path: "/about", changefreq: "monthly", priority: 0.8 },
|
|
892
|
+
],
|
|
893
|
+
{ siteUrl: SITE_URL }
|
|
894
|
+
);
|
|
895
|
+
|
|
896
|
+
return new Response(sitemap, {
|
|
897
|
+
headers: { "Content-Type": "application/xml" },
|
|
898
|
+
});
|
|
899
|
+
},
|
|
900
|
+
},
|
|
901
|
+
},
|
|
902
|
+
});
|
|
903
|
+
```
|
|
904
|
+
|
|
905
|
+
---
|
|
906
|
+
|
|
850
907
|
### 第 17 步:配置 TypeScript (可选)
|
|
851
908
|
|
|
852
909
|
Intlayer 使用模块扩充 (module augmentation) 来利用 TypeScript 的优势,并使您的代码库更加健壮。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-09-09
|
|
3
|
-
updatedAt: 2026-03-
|
|
3
|
+
updatedAt: 2026-03-29
|
|
4
4
|
title: Tanstack Start i18n - 如何翻译Tanstack Start 应用 2026
|
|
5
5
|
description: 学习如何使用 Intlayer 为您的 Tanstack Start 应用添加国际化 (i18n)。按照本综合指南,使您的应用支持多语言并具备基于区域设置的路由功能。
|
|
6
6
|
keywords:
|
|
@@ -12,6 +12,7 @@ keywords:
|
|
|
12
12
|
- i18n
|
|
13
13
|
- TypeScript
|
|
14
14
|
- 区域路由
|
|
15
|
+
- Sitemap
|
|
15
16
|
slugs:
|
|
16
17
|
- doc
|
|
17
18
|
- environment
|
|
@@ -160,14 +161,10 @@ import viteReact from "@vitejs/plugin-react";
|
|
|
160
161
|
import { nitro } from "nitro/vite";
|
|
161
162
|
import { defineConfig } from "vite";
|
|
162
163
|
import { intlayer } from "vite-intlayer";
|
|
163
|
-
import viteTsConfigPaths from "vite-tsconfig-paths";
|
|
164
164
|
|
|
165
165
|
const config = defineConfig({
|
|
166
166
|
plugins: [
|
|
167
167
|
nitro(),
|
|
168
|
-
viteTsConfigPaths({
|
|
169
|
-
projects: ["./tsconfig.json"],
|
|
170
|
-
}),
|
|
171
168
|
intlayer(),
|
|
172
169
|
tanstackStart({
|
|
173
170
|
router: {
|
|
@@ -597,15 +594,11 @@ import viteReact from "@vitejs/plugin-react";
|
|
|
597
594
|
import { nitro } from "nitro/vite";
|
|
598
595
|
import { defineConfig } from "vite";
|
|
599
596
|
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
600
|
-
import viteTsConfigPaths from "vite-tsconfig-paths";
|
|
601
597
|
|
|
602
598
|
export default defineConfig({
|
|
603
599
|
plugins: [
|
|
604
600
|
intlayerProxy(), // 如果使用 Nitro,代理应放在服务器之前
|
|
605
601
|
nitro(),
|
|
606
|
-
viteTsConfigPaths({
|
|
607
|
-
projects: ["./tsconfig.json"],
|
|
608
|
-
}),
|
|
609
602
|
intlayer(),
|
|
610
603
|
tanstackStart({
|
|
611
604
|
router: {
|
|
@@ -620,7 +613,7 @@ export default defineConfig({
|
|
|
620
613
|
|
|
621
614
|
---
|
|
622
615
|
|
|
623
|
-
###
|
|
616
|
+
### 第十二步:国际化您的元数据(可选)
|
|
624
617
|
|
|
625
618
|
您还可以使用 `getIntlayer` 钩子在整个应用程序中访问您的内容字典:
|
|
626
619
|
|
|
@@ -646,7 +639,7 @@ export const Route = createFileRoute("/{-$locale}/")({
|
|
|
646
639
|
|
|
647
640
|
---
|
|
648
641
|
|
|
649
|
-
###
|
|
642
|
+
### 第十三步:在您的 server actions 中获取 locale(可选)
|
|
650
643
|
|
|
651
644
|
您可能希望从 server actions 或 API 端点内部访问当前 locale。
|
|
652
645
|
您可以使用 `intlayer` 中的 `getLocale` 辅助函数来实现这一点。
|
|
@@ -683,7 +676,7 @@ export const getLocaleServer = createServerFn().handler(async () => {
|
|
|
683
676
|
|
|
684
677
|
---
|
|
685
678
|
|
|
686
|
-
###
|
|
679
|
+
### 第十四步:管理未找到的页面(可选)
|
|
687
680
|
|
|
688
681
|
当用户访问不存在的页面时,您可以显示自定义的未找到页面,并且区域设置前缀可能会影响未找到页面的触发方式。
|
|
689
682
|
|
|
@@ -759,29 +752,11 @@ export const Route = createFileRoute("/{-$locale}/$")({
|
|
|
759
752
|
|
|
760
753
|
---
|
|
761
754
|
|
|
762
|
-
###
|
|
763
|
-
|
|
764
|
-
Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库更健壮。
|
|
765
|
-
|
|
766
|
-
确保您的 TypeScript 配置包含自动生成的类型:
|
|
767
|
-
|
|
768
|
-
```json5 fileName="tsconfig.json"
|
|
769
|
-
{
|
|
770
|
-
// ... 您现有的配置
|
|
771
|
-
include: [
|
|
772
|
-
// ... 您现有的包含项
|
|
773
|
-
".intlayer/**/*.ts", // 包含自动生成的类型
|
|
774
|
-
],
|
|
775
|
-
}
|
|
776
|
-
```
|
|
777
|
-
|
|
778
|
-
---
|
|
779
|
-
|
|
780
|
-
### (可选) 步骤 1 : 提取组件内容
|
|
755
|
+
### 第十五步:提取组件中的内容(可选)
|
|
781
756
|
|
|
782
757
|
如果您有现有的代码库,转换数千个文件可能会非常耗时。
|
|
783
758
|
|
|
784
|
-
为了简化此过程,Intlayer
|
|
759
|
+
为了简化此过程,Intlayer 提供了 [编译器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/compiler.md) / [提取器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/cli/extract.md) 来转换您的组件并提取内容。
|
|
785
760
|
|
|
786
761
|
要进行设置,您可以在 `intlayer.config.ts` 文件中添加 `compiler` 部分:
|
|
787
762
|
|
|
@@ -816,66 +791,6 @@ const config: IntlayerConfig = {
|
|
|
816
791
|
export default config;
|
|
817
792
|
```
|
|
818
793
|
|
|
819
|
-
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
820
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
821
|
-
const config = {
|
|
822
|
-
// ... 您的其他配置
|
|
823
|
-
compiler: {
|
|
824
|
-
/**
|
|
825
|
-
* 指示是否应启用编译器。
|
|
826
|
-
*/
|
|
827
|
-
enabled: true,
|
|
828
|
-
|
|
829
|
-
/**
|
|
830
|
-
* 定义输出文件路径
|
|
831
|
-
*/
|
|
832
|
-
output: ({ fileName, extension }) => `./${fileName}${extension}`,
|
|
833
|
-
|
|
834
|
-
/**
|
|
835
|
-
* 指示在转换后是否应保存组件。这样,编译器只需运行一次即可转换应用程序,然后即可将其删除。
|
|
836
|
-
*/
|
|
837
|
-
saveComponents: false,
|
|
838
|
-
|
|
839
|
-
/**
|
|
840
|
-
* 字典键前缀
|
|
841
|
-
*/
|
|
842
|
-
dictionaryKeyPrefix: "",
|
|
843
|
-
},
|
|
844
|
-
};
|
|
845
|
-
|
|
846
|
-
export default config;
|
|
847
|
-
```
|
|
848
|
-
|
|
849
|
-
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
850
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
851
|
-
const config = {
|
|
852
|
-
// ... 您的其他配置
|
|
853
|
-
compiler: {
|
|
854
|
-
/**
|
|
855
|
-
* 指示是否应启用编译器。
|
|
856
|
-
*/
|
|
857
|
-
enabled: true,
|
|
858
|
-
|
|
859
|
-
/**
|
|
860
|
-
* 定义输出文件路径
|
|
861
|
-
*/
|
|
862
|
-
output: ({ fileName, extension }) => `./${fileName}${extension}`,
|
|
863
|
-
|
|
864
|
-
/**
|
|
865
|
-
* 指示在转换后是否应保存组件。这样,编译器只需运行一次即可转换应用程序,然后即可将其删除。
|
|
866
|
-
*/
|
|
867
|
-
saveComponents: false,
|
|
868
|
-
|
|
869
|
-
/**
|
|
870
|
-
* 字典键前缀
|
|
871
|
-
*/
|
|
872
|
-
dictionaryKeyPrefix: "",
|
|
873
|
-
},
|
|
874
|
-
};
|
|
875
|
-
|
|
876
|
-
module.exports = config;
|
|
877
|
-
```
|
|
878
|
-
|
|
879
794
|
<Tabs>
|
|
880
795
|
<Tab value='提取命令'>
|
|
881
796
|
|
|
@@ -914,24 +829,101 @@ export default defineConfig({
|
|
|
914
829
|
});
|
|
915
830
|
```
|
|
916
831
|
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
```
|
|
832
|
+
</Tab>
|
|
833
|
+
</Tabs>
|
|
920
834
|
|
|
921
|
-
|
|
922
|
-
pnpm run build # 或 pnpm run dev
|
|
923
|
-
```
|
|
835
|
+
---
|
|
924
836
|
|
|
925
|
-
|
|
926
|
-
|
|
837
|
+
### 第十六步:生成站点地图 (Sitemap)(可选)
|
|
838
|
+
|
|
839
|
+
Intlayer 附带一个内置的站点地图生成器,可帮助您轻松为应用程序创建站点地图。它能够处理本地化路由,并为搜索引擎添加必要的元数据。
|
|
840
|
+
|
|
841
|
+
> Intlayer 生成的站点地图支持 `xhtml:link` 命名空间(Hreflang XML 扩展)。与仅列出原始 URL 的默认站点地图生成器不同,Intlayer 会自动在页面的所有语言版本(例如 `/about`、`/about?lang=fr` 和 `/about?lang=es`)之间创建所需的双向链接。这确保了搜索引擎能够正确索引并向合适的受众提供正确的语言版本。
|
|
842
|
+
|
|
843
|
+
要使用它,您首先需要配置 `vite.config.ts` 文件,以启用本地化路由的预渲染,并禁用默认的 TanStack Start 站点地图生成。
|
|
844
|
+
|
|
845
|
+
```typescript fileName="vite.config.ts"
|
|
846
|
+
import { localeFlatMap } from "intlayer";
|
|
847
|
+
// ... 其他导入
|
|
848
|
+
|
|
849
|
+
export const pathList = ["", "/about", "/404"];
|
|
850
|
+
|
|
851
|
+
const localizedPages = localeFlatMap(({ urlPrefix }) =>
|
|
852
|
+
pathList.map((path) => ({
|
|
853
|
+
path: `${urlPrefix}${path}`,
|
|
854
|
+
prerender: {
|
|
855
|
+
enabled: true,
|
|
856
|
+
},
|
|
857
|
+
}))
|
|
858
|
+
);
|
|
859
|
+
|
|
860
|
+
export default defineConfig({
|
|
861
|
+
plugins: [
|
|
862
|
+
// ... 其他插件
|
|
863
|
+
tanstackStart({
|
|
864
|
+
// ... 其他配置
|
|
865
|
+
sitemap: {
|
|
866
|
+
enabled: false,
|
|
867
|
+
},
|
|
868
|
+
prerender: {
|
|
869
|
+
enabled: true,
|
|
870
|
+
crawlLinks: false,
|
|
871
|
+
concurrency: 10,
|
|
872
|
+
},
|
|
873
|
+
pages: localizedPages,
|
|
874
|
+
}),
|
|
875
|
+
],
|
|
876
|
+
});
|
|
927
877
|
```
|
|
928
878
|
|
|
929
|
-
|
|
930
|
-
|
|
879
|
+
然后,创建一个使用 `generateSitemap` 函数的路由 `src/routes/sitemap[.]xml.ts`:
|
|
880
|
+
|
|
881
|
+
```typescript fileName="src/routes/sitemap[.]xml.ts"
|
|
882
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
883
|
+
import { generateSitemap } from "intlayer";
|
|
884
|
+
|
|
885
|
+
const SITE_URL = (
|
|
886
|
+
import.meta.env.VITE_SITE_URL ?? "http://localhost:3000"
|
|
887
|
+
).replace(/\/$/, "");
|
|
888
|
+
|
|
889
|
+
export const Route = createFileRoute("/sitemap.xml")({
|
|
890
|
+
server: {
|
|
891
|
+
handlers: {
|
|
892
|
+
GET: async () => {
|
|
893
|
+
const sitemap = generateSitemap(
|
|
894
|
+
[
|
|
895
|
+
{ path: "/", changefreq: "daily", priority: 1.0 },
|
|
896
|
+
{ path: "/about", changefreq: "monthly", priority: 0.8 },
|
|
897
|
+
],
|
|
898
|
+
{ siteUrl: SITE_URL }
|
|
899
|
+
);
|
|
900
|
+
|
|
901
|
+
return new Response(sitemap, {
|
|
902
|
+
headers: { "Content-Type": "application/xml" },
|
|
903
|
+
});
|
|
904
|
+
},
|
|
905
|
+
},
|
|
906
|
+
},
|
|
907
|
+
});
|
|
931
908
|
```
|
|
932
909
|
|
|
933
|
-
|
|
934
|
-
|
|
910
|
+
---
|
|
911
|
+
|
|
912
|
+
### 第十七步:TypeScript 配置 (可选)
|
|
913
|
+
|
|
914
|
+
Intlayer 通过模块扩充来利用 TypeScript 的优势,增强您的代码库。
|
|
915
|
+
|
|
916
|
+
确保自动生成的类型已包含在您的 TypeScript 配置中。
|
|
917
|
+
|
|
918
|
+
```json5 fileName="tsconfig.json"
|
|
919
|
+
{
|
|
920
|
+
// ... 现有配置
|
|
921
|
+
include: [
|
|
922
|
+
// ... 现有包含
|
|
923
|
+
".intlayer/**/*.ts", // 包含自动生成的类型
|
|
924
|
+
],
|
|
925
|
+
}
|
|
926
|
+
```
|
|
935
927
|
|
|
936
928
|
---
|
|
937
929
|
|
|
@@ -232,7 +232,7 @@ module.exports = appContent;
|
|
|
232
232
|
<!-- 以简单内容渲染内容 -->
|
|
233
233
|
<h1>{$content.title}</h1>
|
|
234
234
|
<!-- 使用编辑器渲染可编辑内容 -->
|
|
235
|
-
<h1
|
|
235
|
+
<h1>{@const Title = $content.title}<Title /></h1>
|
|
236
236
|
<!-- 以字符串形式渲染内容 -->
|
|
237
237
|
<div aria-label={$content.title.value}></div>
|
|
238
238
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intlayer/docs",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.6.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Intlayer documentation",
|
|
6
6
|
"keywords": [
|
|
@@ -72,22 +72,22 @@
|
|
|
72
72
|
"watch": "webpack --config ./webpack.config.ts --watch"
|
|
73
73
|
},
|
|
74
74
|
"dependencies": {
|
|
75
|
-
"@intlayer/config": "8.
|
|
76
|
-
"@intlayer/core": "8.
|
|
77
|
-
"@intlayer/types": "8.
|
|
75
|
+
"@intlayer/config": "8.6.1",
|
|
76
|
+
"@intlayer/core": "8.6.1",
|
|
77
|
+
"@intlayer/types": "8.6.1"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
|
-
"@intlayer/api": "8.
|
|
81
|
-
"@intlayer/cli": "8.
|
|
80
|
+
"@intlayer/api": "8.6.1",
|
|
81
|
+
"@intlayer/cli": "8.6.1",
|
|
82
82
|
"@types/node": "25.5.0",
|
|
83
83
|
"@utils/ts-config": "1.0.4",
|
|
84
84
|
"@utils/ts-config-types": "1.0.4",
|
|
85
85
|
"@utils/tsdown-config": "1.0.4",
|
|
86
86
|
"fast-glob": "3.3.3",
|
|
87
87
|
"rimraf": "6.1.3",
|
|
88
|
-
"tsdown": "0.21.
|
|
88
|
+
"tsdown": "0.21.7",
|
|
89
89
|
"typescript": "6.0.2",
|
|
90
|
-
"vitest": "4.1.
|
|
90
|
+
"vitest": "4.1.2"
|
|
91
91
|
},
|
|
92
92
|
"engines": {
|
|
93
93
|
"node": ">=14.18"
|