@intlayer/docs 6.1.5 → 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/ar/next-i18next_vs_next-intl_vs_intlayer.md +404 -173
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +262 -113
- package/blog/en/intlayer_with_next-i18next.mdx +431 -0
- package/blog/en/intlayer_with_next-intl.mdx +335 -0
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +463 -209
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +185 -71
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +36 -28
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/dist/cjs/generated/docs.entry.cjs +32 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +32 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +2 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/component_i18n.md +186 -0
- 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/ar/vs_code_extension.md +48 -109
- package/docs/de/component_i18n.md +186 -0
- 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/de/vs_code_extension.md +46 -107
- package/docs/en/component_i18n.md +186 -0
- 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 +31 -5
- package/docs/en/intlayer_with_nextjs_15.md +31 -5
- 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/vs_code_extension.md +24 -114
- package/docs/en-GB/component_i18n.md +186 -0
- 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/en-GB/vs_code_extension.md +42 -103
- package/docs/es/component_i18n.md +182 -0
- 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/es/vs_code_extension.md +53 -114
- package/docs/fr/component_i18n.md +186 -0
- 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/fr/vs_code_extension.md +50 -111
- package/docs/hi/component_i18n.md +186 -0
- 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/hi/vs_code_extension.md +49 -110
- package/docs/it/component_i18n.md +186 -0
- 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/it/vs_code_extension.md +50 -111
- package/docs/ja/component_i18n.md +186 -0
- 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/ja/vs_code_extension.md +50 -111
- package/docs/ko/component_i18n.md +186 -0
- 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/ko/vs_code_extension.md +48 -109
- package/docs/pt/component_i18n.md +186 -0
- 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/pt/vs_code_extension.md +46 -107
- package/docs/ru/component_i18n.md +186 -0
- 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/ru/vs_code_extension.md +48 -109
- package/docs/tr/component_i18n.md +186 -0
- 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/tr/vs_code_extension.md +54 -115
- package/docs/zh/component_i18n.md +186 -0
- 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/docs/zh/vs_code_extension.md +51 -105
- package/package.json +10 -10
- package/src/generated/docs.entry.ts +32 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-03-07
|
|
3
|
+
updatedAt: 2025-09-30
|
|
4
|
+
title: 在 React 和 Next.js 中制作多语言(i18n)组件
|
|
5
|
+
description: 学习如何声明和获取本地化内容,以使用 Intlayer 构建多语言 React 或 Next.js 组件。
|
|
6
|
+
keywords:
|
|
7
|
+
- i18n
|
|
8
|
+
- 组件
|
|
9
|
+
- react
|
|
10
|
+
- 多语言
|
|
11
|
+
- next.js
|
|
12
|
+
- intlayer
|
|
13
|
+
slugs:
|
|
14
|
+
- doc
|
|
15
|
+
- component
|
|
16
|
+
- i18n
|
|
17
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-vite-react-template
|
|
18
|
+
youtubeVideo: https://www.youtube.com/watch?v=dS9L7uJeak4
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# 如何使用 Intlayer 制作多语言(i18n)组件
|
|
22
|
+
|
|
23
|
+
本指南展示了在两种常见环境中制作多语言 UI 组件的最简步骤:
|
|
24
|
+
|
|
25
|
+
- React(Vite/单页应用)
|
|
26
|
+
- Next.js(应用路由)
|
|
27
|
+
|
|
28
|
+
您将首先声明内容,然后在组件中获取内容。
|
|
29
|
+
|
|
30
|
+
## 1) 声明您的内容(适用于 React 和 Next.js)
|
|
31
|
+
|
|
32
|
+
在组件附近创建一个内容声明文件。这可以让翻译内容靠近使用位置,并且支持类型安全。
|
|
33
|
+
|
|
34
|
+
```ts fileName="component.content.ts"
|
|
35
|
+
import { t, type Dictionary } from "intlayer";
|
|
36
|
+
|
|
37
|
+
const componentContent = {
|
|
38
|
+
key: "component-example",
|
|
39
|
+
content: {
|
|
40
|
+
title: t({
|
|
41
|
+
en: "Hello",
|
|
42
|
+
fr: "Bonjour",
|
|
43
|
+
es: "Hola",
|
|
44
|
+
}),
|
|
45
|
+
description: t({
|
|
46
|
+
en: "A multilingual React component",
|
|
47
|
+
fr: "Un composant React multilingue",
|
|
48
|
+
es: "Un componente React multilingüe",
|
|
49
|
+
}),
|
|
50
|
+
},
|
|
51
|
+
} satisfies Dictionary;
|
|
52
|
+
|
|
53
|
+
export default componentContent;
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
如果您更喜欢配置文件,也支持 JSON 格式。
|
|
57
|
+
|
|
58
|
+
```json fileName="component.content.json"
|
|
59
|
+
{
|
|
60
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
61
|
+
"key": "component-example",
|
|
62
|
+
"content": {
|
|
63
|
+
"title": {
|
|
64
|
+
"nodeType": "translation",
|
|
65
|
+
"translation": { "en": "Hello", "fr": "Bonjour", "es": "Hola" }
|
|
66
|
+
},
|
|
67
|
+
"description": {
|
|
68
|
+
"nodeType": "translation",
|
|
69
|
+
"translation": {
|
|
70
|
+
"en": "一个多语言的 React 组件",
|
|
71
|
+
"fr": "Un composant React multilingue",
|
|
72
|
+
"es": "Un componente React multilingüe"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 2) 获取您的内容
|
|
80
|
+
|
|
81
|
+
### 情况 A — React 应用 (Vite/SPA)
|
|
82
|
+
|
|
83
|
+
默认方法:使用 `useIntlayer` 通过键来获取内容。这使组件保持简洁且类型安全。
|
|
84
|
+
|
|
85
|
+
```tsx fileName="ComponentExample.tsx"
|
|
86
|
+
import { useIntlayer } from "react-intlayer";
|
|
87
|
+
|
|
88
|
+
export function ComponentExample() {
|
|
89
|
+
const content = useIntlayer("component-example");
|
|
90
|
+
return (
|
|
91
|
+
<div>
|
|
92
|
+
<h1>{content.title}</h1>
|
|
93
|
+
<p>{content.description}</p>
|
|
94
|
+
</div>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
服务器端渲染或在提供者外部使用时:使用 `react-intlayer/server`,并在需要时传入明确的 `locale`。
|
|
100
|
+
|
|
101
|
+
```tsx fileName="ServerRenderedExample.tsx"
|
|
102
|
+
import { useIntlayer } from "react-intlayer/server";
|
|
103
|
+
|
|
104
|
+
export function ServerRenderedExample({ locale }: { locale: string }) {
|
|
105
|
+
const content = useIntlayer("component-example", locale);
|
|
106
|
+
return (
|
|
107
|
+
<>
|
|
108
|
+
<h1>{content.title}</h1>
|
|
109
|
+
<p>{content.description}</p>
|
|
110
|
+
</>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
另一种方式:如果你更喜欢在调用处组织结构,可以使用 `useDictionary` 读取整个声明的对象。
|
|
116
|
+
|
|
117
|
+
```tsx fileName="ComponentWithDictionary.tsx"
|
|
118
|
+
import { useDictionary } from "react-intlayer";
|
|
119
|
+
import componentContent from "./component.content";
|
|
120
|
+
|
|
121
|
+
export function ComponentWithDictionary() {
|
|
122
|
+
const { title, description } = useDictionary(componentContent);
|
|
123
|
+
return (
|
|
124
|
+
<div>
|
|
125
|
+
<h1>{title}</h1>
|
|
126
|
+
<p>{description}</p>
|
|
127
|
+
</div>
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 方案 B — Next.js(App 路由)
|
|
133
|
+
|
|
134
|
+
优先使用服务器组件以确保数据安全和性能。在服务器文件中使用来自 `next-intlayer/server` 的 `useIntlayer`,在客户端组件中使用来自 `next-intlayer` 的 `useIntlayer`。
|
|
135
|
+
|
|
136
|
+
```tsx fileName="app/[locale]/example/ServerComponent.tsx"
|
|
137
|
+
import { useIntlayer } from "next-intlayer/server";
|
|
138
|
+
|
|
139
|
+
export default function ServerComponent() {
|
|
140
|
+
const content = useIntlayer("component-example");
|
|
141
|
+
return (
|
|
142
|
+
<>
|
|
143
|
+
<h1>{content.title}</h1>
|
|
144
|
+
<p>{content.description}</p>
|
|
145
|
+
</>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
```tsx fileName="app/[locale]/example/ClientComponent.tsx"
|
|
151
|
+
"use client";
|
|
152
|
+
|
|
153
|
+
import { useIntlayer } from "next-intlayer";
|
|
154
|
+
|
|
155
|
+
export function ClientComponent() {
|
|
156
|
+
const content = useIntlayer("component-example");
|
|
157
|
+
return (
|
|
158
|
+
<div>
|
|
159
|
+
<h1>{content.title}</h1>
|
|
160
|
+
<p>{content.description}</p>
|
|
161
|
+
</div>
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
提示:对于页面元数据和 SEO,您还可以使用 `getIntlayer` 获取内容,并通过 `getMultilingualUrls` 生成多语言 URL。
|
|
167
|
+
|
|
168
|
+
## 为什么 Intlayer 的组件方法是最佳选择
|
|
169
|
+
|
|
170
|
+
- **内容共置**:内容声明与组件紧密相邻,减少偏差并提升设计系统中的复用性。
|
|
171
|
+
- **类型安全**:键和值结构均为强类型;缺失的翻译会在构建时而非运行时暴露。
|
|
172
|
+
- **服务器优先**:原生支持服务器组件,提升安全性和性能;客户端钩子依然保持良好的使用体验。
|
|
173
|
+
- **摇树优化**:仅打包组件实际使用的内容,保持大型应用的负载体积小。
|
|
174
|
+
- **开发体验与工具**:内置中间件、SEO助手,以及可选的可视化编辑器/AI翻译,简化日常工作流程。
|
|
175
|
+
|
|
176
|
+
请参阅针对 Next.js 的对比和模式总结:https://intlayer.org/blog/next-i18next-vs-next-intl-vs-intlayer
|
|
177
|
+
|
|
178
|
+
## 相关指南和参考资料
|
|
179
|
+
|
|
180
|
+
- React 设置(Vite):https://intlayer.org/doc/environment/vite-and-react
|
|
181
|
+
- React Router v7:https://intlayer.org/doc/environment/vite-and-react/react-router-v7
|
|
182
|
+
- TanStack 入门:https://intlayer.org/doc/environment/vite-and-react/tanstack-start
|
|
183
|
+
- Next.js 设置:https://intlayer.org/doc/environment/nextjs
|
|
184
|
+
- 为什么选择 Intlayer 而不是 next-intl 或 next-i18next:https://intlayer.org/blog/next-i18next-vs-next-intl-vs-intlayer
|
|
185
|
+
|
|
186
|
+
这些页面包含端到端的设置、提供者、路由和 SEO 辅助工具。
|
|
@@ -664,9 +664,9 @@ export const appConfig: ApplicationConfig = {
|
|
|
664
664
|
|
|
665
665
|
Intlayer 使用模块增强来利用 TypeScript 的优势,使你的代码库更健壮。
|
|
666
666
|
|
|
667
|
-

|
|
668
668
|
|
|
669
|
-

|
|
670
670
|
|
|
671
671
|
确保你的 TypeScript 配置包含自动生成的类型。
|
|
672
672
|
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-03-07
|
|
3
|
+
updatedAt: 2025-10-03
|
|
4
|
+
title: 在 Astro 中使用 Intlayer 入门
|
|
5
|
+
description: 学习如何使用 Intlayer 为您的 Vite 和 React 应用添加国际化(i18n)。按照本指南使您的应用支持多语言。
|
|
6
|
+
keywords:
|
|
7
|
+
- 国际化
|
|
8
|
+
- 文档
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Vite
|
|
11
|
+
- React
|
|
12
|
+
- i18n
|
|
13
|
+
- JavaScript
|
|
14
|
+
slugs:
|
|
15
|
+
- doc
|
|
16
|
+
- environment
|
|
17
|
+
- astro
|
|
18
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-astro-template
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# 使用 Intlayer 和 Astro 开始国际化(i18n)
|
|
22
|
+
|
|
23
|
+
请参阅 GitHub 上的[应用模板](https://github.com/aymericzip/intlayer-astro-template)。
|
|
24
|
+
|
|
25
|
+
## 什么是 Intlayer?
|
|
26
|
+
|
|
27
|
+
**Intlayer** 是一个创新的开源国际化(i18n)库,旨在简化现代 Web 应用中的多语言支持。
|
|
28
|
+
|
|
29
|
+
使用 Intlayer,您可以:
|
|
30
|
+
|
|
31
|
+
- **通过组件级声明式字典轻松管理翻译**。
|
|
32
|
+
- **动态本地化元数据、路由和内容**。
|
|
33
|
+
- **确保 TypeScript 支持**,通过自动生成类型,提升自动补全和错误检测能力。
|
|
34
|
+
- **享受高级功能**,如动态语言环境检测和切换。
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 在 Astro 中设置 Intlayer 的分步指南
|
|
39
|
+
|
|
40
|
+
### 第一步:安装依赖
|
|
41
|
+
|
|
42
|
+
使用您的包管理器安装必要的包:
|
|
43
|
+
|
|
44
|
+
```bash packageManager="npm"
|
|
45
|
+
npm install intlayer astro-intlayer
|
|
46
|
+
# 可选:添加 React 岛屿支持
|
|
47
|
+
npm install react react-dom react-intlayer @astrojs/react
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```bash packageManager="pnpm"
|
|
51
|
+
pnpm add intlayer astro-intlayer
|
|
52
|
+
# 可选:添加 React 岛屿支持
|
|
53
|
+
pnpm add react react-dom react-intlayer @astrojs/react
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```bash packageManager="yarn"
|
|
57
|
+
yarn add intlayer astro-intlayer
|
|
58
|
+
# 可选:添加 React 岛屿支持
|
|
59
|
+
yarn add react react-dom react-intlayer @astrojs/react
|
|
60
|
+
```
|
|
61
|
+
|
|
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)。
|
|
64
|
+
|
|
65
|
+
- **astro-intlayer**
|
|
66
|
+
包括用于将 Intlayer 与 [Vite 打包工具](https://vite.dev/guide/why.html#why-bundle-for-production) 集成的 Astro 集成插件,以及用于检测用户首选语言环境、管理 Cookie 和处理 URL 重定向的中间件。
|
|
67
|
+
|
|
68
|
+
### 第 2 步:配置您的项目
|
|
69
|
+
|
|
70
|
+
创建一个配置文件来配置您的应用程序语言:
|
|
71
|
+
|
|
72
|
+
```typescript fileName="intlayer.config.ts"
|
|
73
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
74
|
+
|
|
75
|
+
const config: IntlayerConfig = {
|
|
76
|
+
internationalization: {
|
|
77
|
+
locales: [
|
|
78
|
+
Locales.ENGLISH,
|
|
79
|
+
Locales.FRENCH,
|
|
80
|
+
Locales.SPANISH,
|
|
81
|
+
// 您的其他语言环境
|
|
82
|
+
],
|
|
83
|
+
defaultLocale: Locales.ENGLISH,
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export default config;
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
> 通过此配置文件,您可以设置本地化 URL、中间件重定向、cookie 名称、内容声明的位置和扩展名、禁用控制台中的 Intlayer 日志等。有关可用参数的完整列表,请参阅[配置文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/configuration.md)。
|
|
91
|
+
|
|
92
|
+
### 第三步:在您的 Astro 配置中集成 Intlayer
|
|
93
|
+
|
|
94
|
+
将 intlayer 插件添加到您的配置中。
|
|
95
|
+
|
|
96
|
+
```typescript fileName="astro.config.ts"
|
|
97
|
+
// @ts-check
|
|
98
|
+
|
|
99
|
+
import { intlayer } from "astro-intlayer";
|
|
100
|
+
import { defineConfig } from "astro/config";
|
|
101
|
+
|
|
102
|
+
// https://astro.build/config
|
|
103
|
+
export default defineConfig({
|
|
104
|
+
integrations: [intlayer()],
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
> `intlayer()` Astro 集成插件用于将 Intlayer 与 Astro 集成。它确保内容声明文件的构建,并在开发模式下监控这些文件。在 Astro 应用中定义了 Intlayer 环境变量。此外,它还提供别名以优化性能。
|
|
109
|
+
|
|
110
|
+
### 第4步:声明您的内容
|
|
111
|
+
|
|
112
|
+
创建并管理您的内容声明以存储翻译:
|
|
113
|
+
|
|
114
|
+
```tsx fileName="src/app.content.tsx"
|
|
115
|
+
import { t, type Dictionary } from "intlayer";
|
|
116
|
+
import type { ReactNode } from "react";
|
|
117
|
+
|
|
118
|
+
const appContent = {
|
|
119
|
+
key: "app",
|
|
120
|
+
content: {
|
|
121
|
+
title: t({
|
|
122
|
+
en: "Hello World",
|
|
123
|
+
fr: "Bonjour le monde",
|
|
124
|
+
es: "Hola mundo",
|
|
125
|
+
}),
|
|
126
|
+
},
|
|
127
|
+
} satisfies Dictionary;
|
|
128
|
+
|
|
129
|
+
export default appContent;
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
> 您的内容声明可以定义在应用程序中的任何位置,只要它们被包含在 `contentDir` 目录中(默认是 `./src`)。并且文件扩展名需匹配内容声明文件扩展名(默认是 `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)。
|
|
133
|
+
|
|
134
|
+
> 更多详情,请参阅[内容声明文档](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/dictionary/get_started.md)。
|
|
135
|
+
|
|
136
|
+
### 第5步:在 Astro 中使用您的内容
|
|
137
|
+
|
|
138
|
+
您可以直接在 `.astro` 文件中使用 `intlayer` 导出的核心辅助函数来消费字典。
|
|
139
|
+
|
|
140
|
+
```astro fileName="src/pages/index.astro"
|
|
141
|
+
<!-- astro -->
|
|
142
|
+
---
|
|
143
|
+
import { getIntlayer } from "intlayer";
|
|
144
|
+
import appContent from "../app.content";
|
|
145
|
+
|
|
146
|
+
const { title } = getIntlayer('app');
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
<html lang="en">
|
|
150
|
+
<head>
|
|
151
|
+
<meta charset="utf-8" />
|
|
152
|
+
<meta name="viewport" content="width=device-width" />
|
|
153
|
+
<title>{title}</title>
|
|
154
|
+
</head>
|
|
155
|
+
<body>
|
|
156
|
+
<h1>{title}</h1>
|
|
157
|
+
</body>
|
|
158
|
+
</html>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### 第6步:本地化路由
|
|
162
|
+
|
|
163
|
+
创建一个动态路由段来服务本地化页面,例如 `src/pages/[locale]/index.astro`:
|
|
164
|
+
|
|
165
|
+
```astro fileName="src/pages/[locale]/index.astro"
|
|
166
|
+
<!-- astro -->
|
|
167
|
+
---
|
|
168
|
+
import { getIntlayer } from "intlayer";
|
|
169
|
+
|
|
170
|
+
const { title } = getIntlayer('app');
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
<h1>{title}</h1>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Astro 集成在开发期间添加了一个 Vite 中间件,帮助处理基于语言环境的路由和环境定义。你仍然可以使用自己的逻辑或 `intlayer` 提供的工具函数如 `getLocalizedUrl` 来实现语言环境间的链接。
|
|
177
|
+
|
|
178
|
+
### 第7步:继续使用你喜欢的框架
|
|
179
|
+
|
|
180
|
+
继续使用您喜欢的框架来构建您的应用程序。
|
|
181
|
+
|
|
182
|
+
- Intlayer + React: [Intlayer 与 React](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_vite+react.md)
|
|
183
|
+
- Intlayer + Vue: [Intlayer 与 Vue](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_vite+vue.md)
|
|
184
|
+
- Intlayer + Svelte: [Intlayer 与 Svelte](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_vite+svelte.md)
|
|
185
|
+
- Intlayer + Solid: [Intlayer 与 Solid](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_vite+solid.md)
|
|
186
|
+
- Intlayer + Preact: [Intlayer 与 Preact](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_vite+preact.md)
|
|
187
|
+
|
|
188
|
+
### 配置 TypeScript
|
|
189
|
+
|
|
190
|
+
Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库更强大。
|
|
191
|
+
|
|
192
|
+

|
|
193
|
+
|
|
194
|
+

|
|
195
|
+
|
|
196
|
+
确保您的 TypeScript 配置包含自动生成的类型。
|
|
197
|
+
|
|
198
|
+
```json5 fileName="tsconfig.json"
|
|
199
|
+
{
|
|
200
|
+
// ... 您现有的 TypeScript 配置
|
|
201
|
+
"include": [
|
|
202
|
+
// ... 您现有的 TypeScript 配置
|
|
203
|
+
".intlayer/**/*.ts", // 包含自动生成的类型
|
|
204
|
+
],
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Git 配置
|
|
209
|
+
|
|
210
|
+
建议忽略 Intlayer 生成的文件。这样可以避免将它们提交到您的 Git 仓库中。
|
|
211
|
+
|
|
212
|
+
要做到这一点,您可以将以下指令添加到您的 `.gitignore` 文件中:
|
|
213
|
+
|
|
214
|
+
```plaintext
|
|
215
|
+
# 忽略 Intlayer 生成的文件
|
|
216
|
+
.intlayer
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### VS Code 扩展
|
|
220
|
+
|
|
221
|
+
为了提升您使用 Intlayer 的开发体验,您可以安装官方的 **Intlayer VS Code 扩展**。
|
|
222
|
+
|
|
223
|
+
[从 VS Code 市场安装](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
224
|
+
|
|
225
|
+
该扩展提供:
|
|
226
|
+
|
|
227
|
+
- 翻译键的 **自动补全**。
|
|
228
|
+
- 缺失翻译的 **实时错误检测**。
|
|
229
|
+
- 翻译内容的 **内联预览**。
|
|
230
|
+
- 轻松创建和更新翻译的 **快速操作**。
|
|
231
|
+
|
|
232
|
+
有关如何使用该扩展的更多详细信息,请参阅 [Intlayer VS Code 扩展文档](https://intlayer.org/doc/vs-code-extension)。
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
### 深入探索
|
|
237
|
+
|
|
238
|
+
要进一步使用,您可以实现[可视化编辑器](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)将内容外部化。
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 文档历史
|
|
243
|
+
|
|
244
|
+
| 版本 | 日期 | 变更内容 |
|
|
245
|
+
| ----- | ---------- | ------------------------------------- |
|
|
246
|
+
| 6.2.0 | 2025-10-03 | 针对 Astro 集成、配置和使用进行了更新 |
|
|
@@ -1195,9 +1195,10 @@ module.exports = App;
|
|
|
1195
1195
|
|
|
1196
1196
|
Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库更强大。
|
|
1197
1197
|
|
|
1198
|
-

|
|
1199
|
+
|
|
1200
|
+

|
|
1199
1201
|
|
|
1200
|
-

|
|
1201
1202
|
确保您的 TypeScript 配置包含自动生成的类型。
|
|
1202
1203
|
|
|
1203
1204
|
```json5 fileName="tsconfig.json"
|
|
@@ -367,9 +367,9 @@ module.exports = config;
|
|
|
367
367
|
|
|
368
368
|
`express-intlayer` 利用 TypeScript 强大的功能来增强国际化过程。TypeScript 的静态类型确保每个翻译键都被考虑到,减少遗漏翻译的风险并提升可维护性。
|
|
369
369
|
|
|
370
|
-

|
|
371
371
|
|
|
372
|
-

|
|
373
373
|
|
|
374
374
|
确保自动生成的类型(默认位于 ./types/intlayer.d.ts)已包含在你的 tsconfig.json 文件中。
|
|
375
375
|
|
|
@@ -219,9 +219,9 @@ export default config;
|
|
|
219
219
|
|
|
220
220
|
`express-intlayer` 利用 TypeScript 强大的功能来增强国际化过程。TypeScript 的静态类型确保每个翻译键都被考虑到,减少了缺失翻译的风险,并提升了可维护性。
|
|
221
221
|
|
|
222
|
-

|
|
223
223
|
|
|
224
|
-

|
|
225
225
|
|
|
226
226
|
确保自动生成的类型(默认位于 ./types/intlayer.d.ts)已包含在你的 tsconfig.json 文件中。
|
|
227
227
|
|
|
@@ -1427,9 +1427,9 @@ yarn add @intlayer/swc --save-dev
|
|
|
1427
1427
|
|
|
1428
1428
|
Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库更健壮。
|
|
1429
1429
|
|
|
1430
|
-

|
|
1431
1431
|
|
|
1432
|
-

|
|
1433
1433
|
|
|
1434
1434
|
确保您的 TypeScript 配置包含自动生成的类型。
|
|
1435
1435
|
|
|
@@ -1483,9 +1483,9 @@ yarn add @intlayer/swc --save-dev
|
|
|
1483
1483
|
|
|
1484
1484
|
Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库更健壮。
|
|
1485
1485
|
|
|
1486
|
-

|
|
1487
1487
|
|
|
1488
|
-

|
|
1489
1489
|
|
|
1490
1490
|
确保您的 TypeScript 配置包含自动生成的类型。
|
|
1491
1491
|
|
|
@@ -1425,9 +1425,9 @@ yarn add @intlayer/swc --save-dev
|
|
|
1425
1425
|
|
|
1426
1426
|
Intlayer 使用模块增强(module augmentation)来利用 TypeScript 的优势,使您的代码库更健壮。
|
|
1427
1427
|
|
|
1428
|
-

|
|
1429
1429
|
|
|
1430
|
-

|
|
1431
1431
|
|
|
1432
1432
|
确保您的 TypeScript 配置包含自动生成的类型。
|
|
1433
1433
|
|
|
@@ -785,9 +785,9 @@ module.exports = aboutMetaContent;
|
|
|
785
785
|
|
|
786
786
|
Intlayer 使用模块增强来利用 TypeScript 的优势,使您的代码库更加强大。
|
|
787
787
|
|
|
788
|
-

|
|
789
789
|
|
|
790
|
-

|
|
791
791
|
|
|
792
792
|
确保您的 TypeScript 配置包含自动生成的类型。
|
|
793
793
|
|
|
@@ -148,24 +148,23 @@ module.exports = (async () => {
|
|
|
148
148
|
|
|
149
149
|
## 第4步:添加 Intlayer 提供者
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
为了在您的应用程序中保持用户语言的同步,您需要使用来自 `react-intlayer-native` 的 `IntlayerProvider` 组件包裹您的根组件。
|
|
152
152
|
|
|
153
|
-
|
|
153
|
+
> 请确保使用来自 `react-native-intlayer` 而不是 `react-intlayer` 的提供者。来自 `react-native-intlayer` 的导出包含了 web API 的 polyfills。
|
|
154
154
|
|
|
155
155
|
````tsx fileName="app/_layout.tsx" codeFormat="typescript"
|
|
156
156
|
import { Stack } from "expo-router";
|
|
157
157
|
import { getLocales } from "expo-localization";
|
|
158
|
-
import {
|
|
159
|
-
import { intlayerPolyfill } from "react-native-intlayer";
|
|
158
|
+
import { IntlayerProvider } from "react-native-intlayer";
|
|
160
159
|
import { type FC } from "react";
|
|
161
160
|
|
|
162
|
-
|
|
161
|
+
|
|
163
162
|
|
|
164
163
|
const getDeviceLocale = () => getLocales()[0]?.languageTag;
|
|
165
164
|
|
|
166
165
|
const RootLayout: FC = () => {
|
|
167
166
|
return (
|
|
168
|
-
<
|
|
167
|
+
<IntlayerProvider defaultLocale={getDeviceLocale()}>
|
|
169
168
|
<Stack>
|
|
170
169
|
为了在您的应用程序中保持用户语言的同步,您需要使用来自 `react-intlayer` 的 `IntlayerProvider` 组件包裹您的根组件。
|
|
171
170
|
|
|
@@ -174,21 +173,20 @@ const RootLayout: FC = () => {
|
|
|
174
173
|
```tsx fileName="app/_layout.tsx" codeFormat="typescript"
|
|
175
174
|
import { Stack } from "expo-router";
|
|
176
175
|
import { getLocales } from "expo-localization";
|
|
177
|
-
import {
|
|
178
|
-
import { intlayerPolyfill } from "react-native-intlayer";
|
|
176
|
+
import { IntlayerProvider } from "react-native-intlayer";
|
|
179
177
|
import { type FC } from "react";
|
|
180
178
|
|
|
181
|
-
|
|
179
|
+
|
|
182
180
|
|
|
183
181
|
const getDeviceLocale = () => getLocales()[0]?.languageTag;
|
|
184
182
|
|
|
185
183
|
const RootLayout: FC = () => {
|
|
186
184
|
return (
|
|
187
|
-
<
|
|
185
|
+
<IntlayerProvider defaultLocale={getDeviceLocale()}>
|
|
188
186
|
<Stack>
|
|
189
187
|
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
|
|
190
188
|
</Stack>
|
|
191
|
-
</
|
|
189
|
+
</IntlayerProvider>
|
|
192
190
|
);
|
|
193
191
|
};
|
|
194
192
|
|
|
@@ -198,20 +196,17 @@ export default RootLayout;
|
|
|
198
196
|
```jsx fileName="app/_layout.mjx" codeFormat="esm"
|
|
199
197
|
import { Stack } from "expo-router";
|
|
200
198
|
import { getLocales } from "expo-localization";
|
|
201
|
-
import {
|
|
202
|
-
import { intlayerPolyfill } from "react-native-intlayer";
|
|
203
|
-
|
|
204
|
-
intlayerPolyfill();
|
|
199
|
+
import { IntlayerProvider } from "react-native-intlayer";
|
|
205
200
|
|
|
206
201
|
const getDeviceLocale = () => getLocales()[0]?.languageTag;
|
|
207
202
|
|
|
208
203
|
const RootLayout = () => {
|
|
209
204
|
return (
|
|
210
|
-
<
|
|
205
|
+
<IntlayerProvider defaultLocale={getDeviceLocale()}>
|
|
211
206
|
<Stack>
|
|
212
207
|
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
|
|
213
208
|
</Stack>
|
|
214
|
-
</
|
|
209
|
+
</IntlayerProvider>
|
|
215
210
|
);
|
|
216
211
|
};
|
|
217
212
|
|
|
@@ -221,20 +216,17 @@ export default RootLayout;
|
|
|
221
216
|
```jsx fileName="app/_layout.cjx" codeFormat="commonjs"
|
|
222
217
|
const { Stack } = require("expo-router");
|
|
223
218
|
const { getLocales } = require("expo-localization");
|
|
224
|
-
const {
|
|
225
|
-
const { intlayerPolyfill } = require("react-native-intlayer");
|
|
226
|
-
|
|
227
|
-
intlayerPolyfill();
|
|
219
|
+
const { IntlayerProvider } = require("react-native-intlayer");
|
|
228
220
|
|
|
229
221
|
const getDeviceLocale = () => getLocales()[0]?.languageTag;
|
|
230
222
|
|
|
231
223
|
const RootLayout = () => {
|
|
232
224
|
return (
|
|
233
|
-
<
|
|
225
|
+
<IntlayerProvider defaultLocale={getDeviceLocale()}>
|
|
234
226
|
<Stack>
|
|
235
227
|
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
|
|
236
228
|
</Stack>
|
|
237
|
-
</
|
|
229
|
+
</IntlayerProvider>
|
|
238
230
|
);
|
|
239
231
|
};
|
|
240
232
|
|
|
@@ -248,21 +240,20 @@ module.exports = RootLayout;
|
|
|
248
240
|
```jsx fileName="app/_layout.cjx" codeFormat="commonjs"
|
|
249
241
|
const { Stack } = require("expo-router");
|
|
250
242
|
const { getLocales } = require("expo-localization");
|
|
251
|
-
const {
|
|
252
|
-
|
|
243
|
+
const { IntlayerProvider } = require("react-native-intlayer");
|
|
244
|
+
|
|
253
245
|
|
|
254
|
-
intlayerPolyfill();
|
|
255
246
|
|
|
256
247
|
// 获取设备的语言环境
|
|
257
248
|
const getDeviceLocale = () => getLocales()[0]?.languageTag;
|
|
258
249
|
|
|
259
250
|
const RootLayout = () => {
|
|
260
251
|
return (
|
|
261
|
-
<
|
|
252
|
+
<IntlayerProvider defaultLocale={getDeviceLocale()}>
|
|
262
253
|
<Stack>
|
|
263
254
|
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
|
|
264
255
|
</Stack>
|
|
265
|
-
</
|
|
256
|
+
</IntlayerProvider>
|
|
266
257
|
);
|
|
267
258
|
};
|
|
268
259
|
|