@intlayer/docs 5.7.8 → 5.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/intlayer_with_next-i18next.md +5 -6
- package/blog/ar/intlayer_with_next-intl.md +3 -4
- package/blog/ar/intlayer_with_react-i18next.md +1 -1
- package/blog/ar/intlayer_with_react-intl.md +1 -1
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +96 -219
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +88 -129
- package/blog/ar/vue-i18n_vs_intlayer.md +268 -0
- package/blog/de/intlayer_with_next-i18next.md +5 -6
- package/blog/de/intlayer_with_react-intl.md +1 -1
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/de/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/de/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en/intlayer_with_next-i18next.md +5 -6
- package/blog/en/intlayer_with_next-intl.md +3 -4
- package/blog/en/intlayer_with_react-i18next.md +1 -1
- package/blog/en/intlayer_with_react-intl.md +1 -1
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +89 -220
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +85 -123
- package/blog/en/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en-GB/intlayer_with_next-i18next.md +5 -6
- package/blog/en-GB/intlayer_with_next-intl.md +3 -4
- package/blog/en-GB/intlayer_with_react-i18next.md +1 -1
- package/blog/en-GB/intlayer_with_react-intl.md +1 -1
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +85 -218
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +80 -130
- package/blog/en-GB/vue-i18n_vs_intlayer.md +258 -0
- package/blog/es/intlayer_with_next-i18next.md +5 -6
- package/blog/es/intlayer_with_next-intl.md +3 -4
- package/blog/es/intlayer_with_react-i18next.md +1 -1
- package/blog/es/intlayer_with_react-intl.md +1 -1
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/es/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/es/vue-i18n_vs_intlayer.md +268 -0
- package/blog/fr/intlayer_with_next-i18next.md +5 -6
- package/blog/fr/intlayer_with_next-intl.md +3 -4
- package/blog/fr/intlayer_with_react-i18next.md +1 -1
- package/blog/fr/intlayer_with_react-intl.md +1 -1
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/fr/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/fr/vue-i18n_vs_intlayer.md +269 -0
- package/blog/hi/intlayer_with_next-i18next.md +5 -6
- package/blog/hi/intlayer_with_next-intl.md +3 -4
- package/blog/hi/intlayer_with_react-i18next.md +1 -1
- package/blog/hi/intlayer_with_react-intl.md +1 -1
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +97 -220
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/hi/vue-i18n_vs_intlayer.md +268 -0
- package/blog/it/intlayer_with_next-i18next.md +5 -6
- package/blog/it/intlayer_with_next-intl.md +3 -4
- package/blog/it/intlayer_with_react-i18next.md +1 -1
- package/blog/it/intlayer_with_react-intl.md +1 -1
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/it/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ja/intlayer_with_next-i18next.md +5 -6
- package/blog/ja/intlayer_with_next-intl.md +3 -4
- package/blog/ja/intlayer_with_react-intl.md +1 -1
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ja/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ko/intlayer_with_next-i18next.md +5 -6
- package/blog/ko/intlayer_with_next-intl.md +3 -4
- package/blog/ko/intlayer_with_react-intl.md +1 -1
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +95 -217
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/ko/vue-i18n_vs_intlayer.md +268 -0
- package/blog/pt/intlayer_with_next-i18next.md +5 -6
- package/blog/pt/intlayer_with_next-intl.md +3 -4
- package/blog/pt/intlayer_with_react-intl.md +1 -1
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/pt/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ru/intlayer_with_next-i18next.md +5 -6
- package/blog/ru/intlayer_with_next-intl.md +3 -4
- package/blog/ru/intlayer_with_react-i18next.md +1 -1
- package/blog/ru/intlayer_with_react-intl.md +1 -1
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +94 -217
- package/blog/ru/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ru/vue-i18n_vs_intlayer.md +268 -0
- package/blog/zh/intlayer_with_next-i18next.md +5 -6
- package/blog/zh/intlayer_with_next-intl.md +3 -4
- package/blog/zh/intlayer_with_react-i18next.md +1 -1
- package/blog/zh/intlayer_with_react-intl.md +1 -1
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/zh/vue-i18n_vs_intlayer.md +269 -0
- package/dist/cjs/generated/blog.entry.cjs +41 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +41 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +41 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +41 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.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/formatters.md +625 -0
- package/docs/ar/how_works_intlayer.md +2 -4
- package/docs/ar/interest_of_intlayer.md +159 -49
- package/docs/ar/intlayer_CMS.md +2 -3
- package/docs/ar/intlayer_visual_editor.md +2 -3
- package/docs/ar/intlayer_with_tanstack.md +1 -1
- package/docs/ar/introduction.md +7 -7
- package/docs/ar/packages/intlayer/index.md +3 -3
- package/docs/ar/packages/next-intlayer/index.md +3 -3
- package/docs/de/formatters.md +649 -0
- package/docs/de/interest_of_intlayer.md +161 -47
- package/docs/de/introduction.md +5 -5
- package/docs/de/packages/intlayer/index.md +3 -3
- package/docs/de/packages/next-intlayer/index.md +3 -3
- package/docs/de/packages/react-intlayer/index.md +3 -3
- package/docs/en/dictionary/enumeration.md +2 -2
- package/docs/en/dictionary/function_fetching.md +2 -2
- package/docs/en/dictionary/get_started.md +2 -2
- package/docs/en/dictionary/translation.md +2 -2
- package/docs/en/formatters.md +618 -0
- package/docs/en/how_works_intlayer.md +2 -4
- package/docs/en/interest_of_intlayer.md +170 -46
- package/docs/en/intlayer_CMS.md +2 -3
- package/docs/en/intlayer_visual_editor.md +2 -3
- package/docs/en/intlayer_with_create_react_app.md +2 -2
- package/docs/en/intlayer_with_express.md +2 -2
- package/docs/en/intlayer_with_tanstack.md +1 -1
- package/docs/en/introduction.md +7 -7
- package/docs/en/packages/express-intlayer/index.md +2 -2
- package/docs/en/packages/intlayer/getConfiguration.md +2 -3
- package/docs/en/packages/intlayer/getEnumeration.md +2 -7
- package/docs/en/packages/intlayer/getHTMLTextDir.md +2 -4
- package/docs/en/packages/intlayer/getLocaleLang.md +2 -4
- package/docs/en/packages/intlayer/getLocaleName.md +2 -3
- package/docs/en/packages/intlayer/getLocalizedUrl.md +2 -8
- package/docs/en/packages/intlayer/getMultilingualUrls.md +2 -7
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +2 -3
- package/docs/en/packages/intlayer/getTranslation.md +2 -4
- package/docs/en/packages/intlayer/index.md +5 -5
- package/docs/en/packages/next-intlayer/index.md +5 -5
- package/docs/en/packages/next-intlayer/t.md +2 -2
- package/docs/en/packages/next-intlayer/useDictionary.md +2 -2
- package/docs/en/packages/next-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/next-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-intlayer/index.md +5 -5
- package/docs/en/packages/react-intlayer/t.md +2 -2
- package/docs/en/packages/react-intlayer/useI18n.md +2 -2
- package/docs/en/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/react-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-scripts-intlayer/index.md +2 -2
- package/docs/en/packages/solid-intlayer/index.md +2 -2
- package/docs/en/packages/vite-intlayer/index.md +2 -2
- package/docs/en-GB/formatters.md +625 -0
- package/docs/en-GB/how_works_intlayer.md +2 -4
- package/docs/en-GB/interest_of_intlayer.md +157 -53
- package/docs/en-GB/intlayer_with_tanstack.md +1 -1
- package/docs/en-GB/introduction.md +2 -2
- package/docs/en-GB/packages/intlayer/index.md +3 -3
- package/docs/en-GB/packages/next-intlayer/index.md +3 -3
- package/docs/en-GB/packages/react-intlayer/index.md +3 -3
- package/docs/es/formatters.md +649 -0
- package/docs/es/how_works_intlayer.md +2 -4
- package/docs/es/interest_of_intlayer.md +156 -47
- package/docs/es/intlayer_with_tanstack.md +1 -1
- package/docs/es/introduction.md +5 -5
- package/docs/es/packages/intlayer/index.md +3 -3
- package/docs/es/packages/next-intlayer/index.md +3 -3
- package/docs/fr/formatters.md +649 -0
- package/docs/fr/how_works_intlayer.md +2 -4
- package/docs/fr/interest_of_intlayer.md +157 -46
- package/docs/fr/intlayer_with_tanstack.md +1 -1
- package/docs/fr/introduction.md +5 -5
- package/docs/fr/packages/intlayer/index.md +3 -3
- package/docs/fr/packages/next-intlayer/index.md +3 -3
- package/docs/fr/packages/react-intlayer/index.md +3 -3
- package/docs/hi/formatters.md +630 -0
- package/docs/hi/how_works_intlayer.md +2 -4
- package/docs/hi/interest_of_intlayer.md +155 -42
- package/docs/hi/intlayer_with_tanstack.md +1 -1
- package/docs/hi/introduction.md +5 -5
- package/docs/hi/packages/intlayer/index.md +3 -3
- package/docs/hi/packages/next-intlayer/index.md +3 -3
- package/docs/hi/packages/react-intlayer/index.md +3 -3
- package/docs/it/formatters.md +647 -0
- package/docs/it/how_works_intlayer.md +2 -4
- package/docs/it/interest_of_intlayer.md +157 -46
- package/docs/it/intlayer_with_tanstack.md +1 -1
- package/docs/it/introduction.md +5 -5
- package/docs/it/packages/intlayer/index.md +3 -3
- package/docs/it/packages/next-intlayer/index.md +3 -3
- package/docs/it/packages/react-intlayer/index.md +3 -3
- package/docs/ja/formatters.md +649 -0
- package/docs/ja/how_works_intlayer.md +2 -4
- package/docs/ja/interest_of_intlayer.md +154 -48
- package/docs/ja/intlayer_with_tanstack.md +1 -1
- package/docs/ja/introduction.md +5 -5
- package/docs/ja/packages/intlayer/index.md +3 -3
- package/docs/ja/packages/next-intlayer/index.md +3 -3
- package/docs/ja/packages/react-intlayer/index.md +3 -3
- package/docs/ko/formatters.md +649 -0
- package/docs/ko/how_works_intlayer.md +2 -4
- package/docs/ko/interest_of_intlayer.md +157 -48
- package/docs/ko/intlayer_with_tanstack.md +1 -1
- package/docs/ko/introduction.md +5 -5
- package/docs/ko/packages/intlayer/index.md +3 -3
- package/docs/ko/packages/next-intlayer/index.md +3 -3
- package/docs/ko/packages/react-intlayer/index.md +3 -3
- package/docs/pt/formatters.md +625 -0
- package/docs/pt/how_works_intlayer.md +2 -4
- package/docs/pt/interest_of_intlayer.md +162 -47
- package/docs/pt/intlayer_with_tanstack.md +1 -1
- package/docs/pt/introduction.md +5 -5
- package/docs/pt/packages/intlayer/index.md +3 -3
- package/docs/pt/packages/next-intlayer/index.md +3 -3
- package/docs/pt/packages/react-intlayer/index.md +3 -3
- package/docs/ru/autoFill.md +2 -2
- package/docs/ru/configuration.md +1 -40
- package/docs/ru/formatters.md +649 -0
- package/docs/ru/how_works_intlayer.md +5 -7
- package/docs/ru/index.md +1 -1
- package/docs/ru/interest_of_intlayer.md +165 -50
- package/docs/ru/intlayer_CMS.md +7 -8
- package/docs/ru/intlayer_cli.md +4 -7
- package/docs/ru/intlayer_visual_editor.md +5 -6
- package/docs/ru/intlayer_with_angular.md +1 -1
- package/docs/ru/intlayer_with_create_react_app.md +5 -5
- package/docs/ru/intlayer_with_lynx+react.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +3 -3
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +1 -1
- package/docs/ru/intlayer_with_react_native+expo.md +2 -2
- package/docs/ru/intlayer_with_tanstack.md +3 -3
- package/docs/ru/intlayer_with_vite+preact.md +3 -3
- package/docs/ru/intlayer_with_vite+react.md +3 -3
- package/docs/ru/intlayer_with_vite+solid.md +1 -1
- package/docs/ru/intlayer_with_vite+svelte.md +1 -1
- package/docs/ru/intlayer_with_vite+vue.md +2 -2
- package/docs/ru/introduction.md +8 -8
- package/docs/ru/locale_mapper.md +1 -1
- package/docs/ru/packages/@intlayer/api/index.md +2 -2
- package/docs/ru/packages/@intlayer/chokidar/index.md +1 -1
- package/docs/ru/packages/@intlayer/cli/index.md +2 -2
- package/docs/ru/packages/@intlayer/config/index.md +2 -2
- package/docs/ru/packages/@intlayer/core/index.md +2 -2
- package/docs/ru/packages/@intlayer/design-system/index.md +2 -2
- package/docs/ru/packages/@intlayer/dictionary-entry/index.md +2 -2
- package/docs/ru/packages/@intlayer/editor/index.md +1 -1
- package/docs/ru/packages/@intlayer/editor-react/index.md +1 -1
- package/docs/ru/packages/@intlayer/webpack/index.md +1 -1
- package/docs/ru/packages/angular-intlayer/index.md +1 -1
- package/docs/ru/packages/express-intlayer/index.md +3 -3
- package/docs/ru/packages/express-intlayer/t.md +1 -1
- package/docs/ru/packages/intlayer/getEnumeration.md +3 -8
- package/docs/ru/packages/intlayer/getTranslation.md +3 -5
- package/docs/ru/packages/intlayer/getTranslationContent.md +1 -3
- package/docs/ru/packages/intlayer/index.md +6 -6
- package/docs/ru/packages/intlayer-cli/index.md +1 -1
- package/docs/ru/packages/intlayer-editor/index.md +2 -2
- package/docs/ru/packages/lynx-intlayer/index.md +1 -1
- package/docs/ru/packages/next-intlayer/index.md +7 -7
- package/docs/ru/packages/next-intlayer/t.md +4 -4
- package/docs/ru/packages/next-intlayer/useLocale.md +3 -3
- package/docs/ru/packages/nuxt-intlayer/index.md +1 -1
- package/docs/ru/packages/preact-intlayer/index.md +1 -1
- package/docs/ru/packages/react-intlayer/index.md +7 -7
- package/docs/ru/packages/react-intlayer/t.md +4 -4
- package/docs/ru/packages/react-native-intlayer/index.md +1 -1
- package/docs/ru/packages/react-scripts-intlayer/index.md +3 -3
- package/docs/ru/packages/solid-intlayer/index.md +3 -3
- package/docs/ru/packages/svelte-intlayer/index.md +1 -1
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/packages/vue-intlayer/index.md +1 -1
- package/docs/ru/per_locale_file.md +1 -1
- package/docs/ru/roadmap.md +3 -5
- package/docs/ru/vs_code_extension.md +1 -1
- package/docs/zh/formatters.md +647 -0
- package/docs/zh/how_works_intlayer.md +2 -4
- package/docs/zh/interest_of_intlayer.md +155 -48
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/introduction.md +5 -5
- package/docs/zh/packages/intlayer/index.md +3 -3
- package/docs/zh/packages/next-intlayer/index.md +3 -3
- package/docs/zh/packages/react-intlayer/index.md +3 -3
- package/frequent_questions/ar/domain_routing.md +1 -1
- package/frequent_questions/en/domain_routing.md +1 -1
- package/frequent_questions/en-GB/domain_routing.md +1 -1
- package/frequent_questions/es/domain_routing.md +1 -1
- package/frequent_questions/fr/domain_routing.md +1 -1
- package/frequent_questions/hi/domain_routing.md +1 -1
- package/frequent_questions/it/domain_routing.md +1 -1
- package/frequent_questions/ko/domain_routing.md +1 -1
- package/frequent_questions/pt/domain_routing.md +1 -1
- package/frequent_questions/ru/domain_routing.md +1 -1
- package/frequent_questions/ru/get_locale_cookie.md +4 -4
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -1
- package/package.json +11 -11
- package/src/generated/blog.entry.ts +41 -0
- package/src/generated/docs.entry.ts +41 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2024-08-14
|
|
3
|
-
updatedAt: 2025-
|
|
3
|
+
updatedAt: 2025-08-20
|
|
4
4
|
title: Intlayer 的优势
|
|
5
|
-
description:
|
|
5
|
+
description: 了解在项目中使用 Intlayer 的好处和优势。理解为什么 Intlayer 在众多框架中脱颖而出。
|
|
6
6
|
keywords:
|
|
7
7
|
- 好处
|
|
8
8
|
- 优势
|
|
@@ -11,41 +11,104 @@ keywords:
|
|
|
11
11
|
- 比较
|
|
12
12
|
slugs:
|
|
13
13
|
- doc
|
|
14
|
-
-
|
|
15
|
-
- interest
|
|
14
|
+
- why
|
|
16
15
|
---
|
|
17
16
|
|
|
18
|
-
# Intlayer
|
|
17
|
+
# 为什么你应该考虑使用 Intlayer?
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
## 什么是 Intlayer?
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
**Intlayer** 是一个专为 JavaScript 开发者设计的国际化库。它允许你在代码的任何地方声明内容。它将多语言内容的声明转换为结构化的字典,方便集成到你的代码中。通过使用 TypeScript,**Intlayer** 使你的开发更加稳健和高效。
|
|
22
|
+
|
|
23
|
+
## 为什么创建 Intlayer?
|
|
24
|
+
|
|
25
|
+
Intlayer 的创建是为了解决所有常见国际化库(如 `next-intl`、`react-i18next`、`react-intl`、`next-i18next`、`react-intl` 和 `vue-i18n`)普遍存在的一个问题。
|
|
26
|
+
|
|
27
|
+
所有这些解决方案都采用集中式的方法来列出和管理你的内容。例如:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
.
|
|
31
|
+
├── locales
|
|
32
|
+
│ ├── en.json
|
|
33
|
+
│ ├── fr.json
|
|
34
|
+
│ └── es.json
|
|
35
|
+
├── i18n.ts
|
|
36
|
+
└── src
|
|
37
|
+
└── components
|
|
38
|
+
└── MyComponent
|
|
39
|
+
└── index.tsx
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
或者这里使用命名空间:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
.
|
|
46
|
+
├── locales
|
|
47
|
+
│ ├── en
|
|
48
|
+
│ │ ├── footer.json
|
|
49
|
+
│ │ └── navbar.json
|
|
50
|
+
│ ├── fr
|
|
51
|
+
│ │ ├── footer.json
|
|
52
|
+
│ │ └── navbar.json
|
|
53
|
+
│ └── es
|
|
54
|
+
│ ├── footer.json
|
|
55
|
+
│ └── navbar.json
|
|
56
|
+
├── i18n.ts
|
|
57
|
+
└── src
|
|
58
|
+
└── components
|
|
59
|
+
└── MyComponent
|
|
60
|
+
└── index.tsx
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
这种架构会减慢开发进度,并使代码库更难维护,原因有以下几点:
|
|
64
|
+
|
|
65
|
+
1. **对于创建的任何新组件,您需要:**
|
|
66
|
+
- 在 `locales` 文件夹中创建新的资源/命名空间
|
|
67
|
+
- 记得在页面中导入新的命名空间
|
|
68
|
+
- 翻译您的内容(通常通过从 AI 提供者手动复制/粘贴完成)
|
|
69
|
+
|
|
70
|
+
2. **对于组件的任何更改,您需要:**
|
|
71
|
+
- 查找相关的资源/命名空间(通常远离组件)
|
|
72
|
+
- 翻译您的内容
|
|
73
|
+
- 确保您的内容在所有语言环境中都是最新的
|
|
74
|
+
- 验证您的命名空间中不包含未使用的键/值
|
|
75
|
+
- 确保所有语言环境的 JSON 文件结构一致
|
|
76
|
+
|
|
77
|
+
在专业项目中使用这些解决方案时,通常会使用本地化平台来帮助管理内容的翻译。然而,对于大型项目来说,这可能很快变得昂贵。
|
|
78
|
+
|
|
79
|
+
为了解决这个问题,Intlayer 采用了一种按组件范围划分内容的方法,并将内容保持在组件附近,就像我们经常对 CSS(`styled-components`)、类型、文档(`storybook`)或单元测试(`jest`)所做的那样。
|
|
23
80
|
|
|
24
81
|
```bash codeFormat="typescript"
|
|
25
82
|
.
|
|
26
|
-
└──
|
|
83
|
+
└── components
|
|
27
84
|
└── MyComponent
|
|
28
85
|
├── index.content.ts
|
|
86
|
+
├── index.test.tsx
|
|
87
|
+
├── index.stories.tsx
|
|
29
88
|
└── index.tsx
|
|
30
89
|
```
|
|
31
90
|
|
|
32
91
|
```bash codeFormat="commonjs"
|
|
33
92
|
.
|
|
34
|
-
└──
|
|
93
|
+
└── components
|
|
35
94
|
└── MyComponent
|
|
36
95
|
├── index.content.cjs
|
|
37
|
-
|
|
96
|
+
├── index.test.mjs
|
|
97
|
+
├── index.stories.mjs
|
|
98
|
+
└── index.tsx
|
|
38
99
|
```
|
|
39
100
|
|
|
40
101
|
```bash codeFormat="esm"
|
|
41
102
|
.
|
|
42
|
-
└──
|
|
103
|
+
└── components
|
|
43
104
|
└── MyComponent
|
|
44
105
|
├── index.content.mjs
|
|
45
|
-
|
|
106
|
+
├── index.test.mjs
|
|
107
|
+
├── index.stories.mjs
|
|
108
|
+
└── index.tsx
|
|
46
109
|
```
|
|
47
110
|
|
|
48
|
-
```tsx fileName="./
|
|
111
|
+
```tsx fileName="./components/MyComponent/index.content.ts" codeFormat="typescript"
|
|
49
112
|
import { t, type Dictionary } from "intlayer";
|
|
50
113
|
|
|
51
114
|
const componentExampleContent = {
|
|
@@ -53,8 +116,8 @@ const componentExampleContent = {
|
|
|
53
116
|
content: {
|
|
54
117
|
myTranslatedContent: t({
|
|
55
118
|
en: "Hello World",
|
|
56
|
-
fr: "Bonjour le monde",
|
|
57
119
|
es: "Hola Mundo",
|
|
120
|
+
fr: "Bonjour le monde",
|
|
58
121
|
}),
|
|
59
122
|
},
|
|
60
123
|
} satisfies Dictionary;
|
|
@@ -62,18 +125,17 @@ const componentExampleContent = {
|
|
|
62
125
|
export default componentExampleContent;
|
|
63
126
|
```
|
|
64
127
|
|
|
65
|
-
```jsx fileName="./
|
|
128
|
+
```jsx fileName="./components/MyComponent/index.mjx" codeFormat="esm"
|
|
66
129
|
import { t } from "intlayer";
|
|
67
130
|
|
|
68
131
|
/** @type {import('intlayer').Dictionary} */
|
|
69
|
-
// 组件示例内容
|
|
70
132
|
const componentExampleContent = {
|
|
71
133
|
key: "component-example",
|
|
72
134
|
content: {
|
|
73
135
|
myTranslatedContent: t({
|
|
74
136
|
en: "Hello World",
|
|
75
|
-
fr: "Bonjour le monde",
|
|
76
137
|
es: "Hola Mundo",
|
|
138
|
+
fr: "Bonjour le monde",
|
|
77
139
|
}),
|
|
78
140
|
},
|
|
79
141
|
};
|
|
@@ -81,18 +143,18 @@ const componentExampleContent = {
|
|
|
81
143
|
export default componentExampleContent;
|
|
82
144
|
```
|
|
83
145
|
|
|
84
|
-
```jsx fileName="./
|
|
146
|
+
```jsx fileName="./components/MyComponent/index.csx" codeFormat="commonjs"
|
|
85
147
|
const { t } = require("intlayer");
|
|
86
148
|
|
|
87
149
|
/** @type {import('intlayer').Dictionary} */
|
|
88
|
-
//
|
|
150
|
+
// 组件示例内容的字典定义
|
|
89
151
|
const componentExampleContent = {
|
|
90
152
|
key: "component-example",
|
|
91
153
|
content: {
|
|
92
154
|
myTranslatedContent: t({
|
|
93
155
|
en: "Hello World",
|
|
94
|
-
fr: "Bonjour le monde",
|
|
95
156
|
es: "Hola Mundo",
|
|
157
|
+
fr: "Bonjour le monde",
|
|
96
158
|
}),
|
|
97
159
|
},
|
|
98
160
|
};
|
|
@@ -100,10 +162,9 @@ const componentExampleContent = {
|
|
|
100
162
|
module.exports = componentExampleContent;
|
|
101
163
|
```
|
|
102
164
|
|
|
103
|
-
```tsx fileName="./
|
|
165
|
+
```tsx fileName="./components/MyComponent/index.tsx" codeFormat="typescript"
|
|
104
166
|
import { useIntlayer } from "react-intlayer";
|
|
105
167
|
|
|
106
|
-
// 组件示例
|
|
107
168
|
export const ComponentExample = () => {
|
|
108
169
|
const { myTranslatedContent } = useIntlayer("component-example");
|
|
109
170
|
|
|
@@ -111,10 +172,9 @@ export const ComponentExample = () => {
|
|
|
111
172
|
};
|
|
112
173
|
```
|
|
113
174
|
|
|
114
|
-
```jsx fileName="./
|
|
175
|
+
```jsx fileName="./components/MyComponent/index.mjx" codeFormat="esm"
|
|
115
176
|
import { useIntlayer } from "react-intlayer";
|
|
116
177
|
|
|
117
|
-
// 组件示例
|
|
118
178
|
const ComponentExample = () => {
|
|
119
179
|
const { myTranslatedContent } = useIntlayer("component-example");
|
|
120
180
|
|
|
@@ -122,10 +182,9 @@ const ComponentExample = () => {
|
|
|
122
182
|
};
|
|
123
183
|
```
|
|
124
184
|
|
|
125
|
-
```jsx fileName="./
|
|
185
|
+
```jsx fileName="./components/MyComponent/index.csx" codeFormat="commonjs"
|
|
126
186
|
const { useIntlayer } = require("react-intlayer");
|
|
127
187
|
|
|
128
|
-
// 组件示例
|
|
129
188
|
const ComponentExample = () => {
|
|
130
189
|
const { myTranslatedContent } = useIntlayer("component-example");
|
|
131
190
|
|
|
@@ -133,28 +192,76 @@ const ComponentExample = () => {
|
|
|
133
192
|
};
|
|
134
193
|
```
|
|
135
194
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
195
|
+
这种方法允许您:
|
|
196
|
+
|
|
197
|
+
1. **提高开发速度**
|
|
198
|
+
- 可以使用 VSCode 扩展创建 `.content.{{ts|mjs|cjs|json}}` 文件
|
|
199
|
+
- IDE 中的自动补全 AI 工具(如 GitHub Copilot)可以帮助你声明内容,减少复制/粘贴
|
|
200
|
+
|
|
201
|
+
2. **清理代码库**
|
|
202
|
+
- 降低复杂性
|
|
203
|
+
- 提高可维护性
|
|
204
|
+
|
|
205
|
+
3. **更轻松地复制组件及其相关内容(例如:登录/注册组件等)**
|
|
206
|
+
- 限制影响其他组件内容的风险
|
|
207
|
+
- 通过复制/粘贴内容从一个应用到另一个应用,无需外部依赖
|
|
208
|
+
|
|
209
|
+
4. **避免因未使用的组件而污染代码库,产生未使用的键/值**
|
|
210
|
+
- 如果你不使用一个组件,Intlayer 不会导入它的相关内容
|
|
211
|
+
- 如果你删除一个组件,你会更容易记得删除其相关内容,因为它们会存在于同一个文件夹中
|
|
212
|
+
|
|
213
|
+
5. **降低 AI 代理声明多语言内容的推理成本**
|
|
214
|
+
- AI 代理无需扫描整个代码库来确定内容的实现位置
|
|
215
|
+
- 翻译可以通过 IDE 中的自动补全 AI 工具(如 GitHub Copilot)轻松完成
|
|
216
|
+
|
|
217
|
+
## Intlayer 的附加功能
|
|
218
|
+
|
|
219
|
+
| 功能 | 描述 |
|
|
220
|
+
| ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
221
|
+
|  | **跨框架支持**<br><br>Intlayer 兼容所有主流框架和库,包括 Next.js、React、Vite、Vue.js、Nuxt、Preact、Express 等。 |
|
|
222
|
+
|  | **基于JavaScript的内容管理**<br><br>利用JavaScript的灵活性,高效地定义和管理您的内容。<br><br> - [内容声明](https://intlayer.org/doc/concept/content) |
|
|
223
|
+
|  | **每语言内容声明文件**<br><br>通过在自动生成之前只声明一次内容,加快您的开发速度。<br><br> - [每语言内容声明文件](https://intlayer.org/doc/concept/per-locale-file) |
|
|
224
|
+
|  | **类型安全环境**<br><br>利用 TypeScript 确保您的内容定义和代码无错误,同时享受 IDE 自动补全的便利。<br><br> - [TypeScript 配置](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
|
|
225
|
+
|  | **简化设置**<br><br>通过最少的配置快速启动运行。轻松调整国际化、路由、AI、构建和内容处理的设置。<br><br> - [探索 Next.js 集成](https://intlayer.org/doc/environment/nextjs) |
|
|
226
|
+
|  | **简化的内容获取**<br><br>无需为每一条内容调用你的 `t` 函数。使用单个钩子直接获取所有内容。<br><br> - [React 集成](https://intlayer.org/doc/environment/create-react-app) |
|
|
227
|
+
|  | **一致的服务器组件实现**<br><br>完美适用于 Next.js 服务器组件,客户端和服务器组件使用相同的实现,无需在每个服务器组件之间传递你的 `t` 函数。<br><br> - [服务器组件](https://intlayer.org/doc/environment/nextjs#step-7-utilize-content-in-your-code) |
|
|
228
|
+
|  | **有序的代码库**<br><br>保持代码库更有条理:1 个组件 = 同一文件夹中的 1 个字典。将翻译内容放置在各自组件附近,有助于提升可维护性和清晰度。<br><br> - [Intlayer 的工作原理](https://intlayer.org/doc/concept/how-works-intlayer) |
|
|
229
|
+
|  | **增强路由**<br><br>全面支持应用路由,能够无缝适应复杂的应用结构,适用于 Next.js、React、Vite、Vue.js 等框架。<br><br> - [探索 Next.js 集成](https://intlayer.org/doc/environment/nextjs) |
|
|
230
|
+
|  | **Markdown 支持**<br><br>导入并解析本地化文件和远程 Markdown,用于多语言内容,如隐私政策、文档等。解析并使 Markdown 元数据在代码中可访问。<br><br> - [内容文件](https://intlayer.org/doc/concept/content/file) |
|
|
231
|
+
|  | **免费可视化编辑器和CMS**<br><br>为内容创作者提供免费的可视化编辑器和CMS,无需使用本地化平台。通过Git保持内容同步,或使用CMS将内容完全或部分外部化。<br><br> - [Intlayer 编辑器](https://intlayer.org/doc/concept/editor) <br> - [Intlayer CMS](https://intlayer.org/doc/concept/cms) |
|
|
232
|
+
|  | **可摇树内容**<br><br>可摇树内容,减少最终包的大小。按组件加载内容,排除任何未使用的内容。支持懒加载以提升应用加载效率。<br><br> - [应用构建优化](https://intlayer.org/doc/concept/how-works-intlayer#app-build-optimization) |
|
|
233
|
+
|  | **静态渲染**<br><br>不会阻塞静态渲染。<br><br> - [Next.js 集成](https://intlayer.org/doc/environment/nextjs) |
|
|
234
|
+
|  | **AI 驱动的翻译**<br><br>使用 Intlayer 的先进 AI 驱动翻译工具,结合您自己的 AI 提供商/API 密钥,只需一键即可将您的网站转换为 231 种语言。<br><br> - [CI/CD 集成](https://intlayer.org/doc/concept/ci-cd) <br> - [Intlayer CLI](https://intlayer.org/doc/concept/cli) <br> - [自动填充](https://intlayer.org/doc/concept/auto-fill) |
|
|
235
|
+
|  | **MCP 服务器集成**<br><br>提供一个 MCP(模型上下文协议)服务器,用于 IDE 自动化,实现内容管理和国际化工作流在您的开发环境中无缝进行。<br><br> - [MCP 服务器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/mcp_server.md) |
|
|
236
|
+
|  | **VSCode 扩展**<br><br>Intlayer 提供了一个 VSCode 扩展,帮助您管理内容和翻译,构建词典,翻译内容等。<br><br> - [VSCode 扩展](https://intlayer.org/doc/zh/vs-code-extension) |
|
|
237
|
+
|  | **互操作性**<br><br>支持与 react-i18next、next-i18next、next-intl 和 react-intl 的互操作。 <br><br> - [Intlayer 与 react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer 与 next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer 与 next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next) |
|
|
238
|
+
|
|
239
|
+
## Intlayer 与其他解决方案的比较
|
|
240
|
+
|
|
241
|
+
| 功能 | Intlayer | React-i18next / i18next | React-Intl (FormatJS) | LinguiJS | next-intl | next-i18next | vue-i18n |
|
|
242
|
+
| -------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------- | ----------------------------- | ----------------------------- | ----------------------------- | ----------------------------- | ----------------------------------------------- |
|
|
243
|
+
| **组件附近的翻译** | 是,内容与每个组件共置 | 否 | 否 | 否 | 否 | 否 | 是 - 使用 `单文件组件`(SFCs) |
|
|
244
|
+
| **TypeScript 集成** | 高级,自动生成严格类型 | 基础;额外配置以确保安全 | 良好,但不够严格 | 类型定义,需要配置 | 良好 | 基础 | 良好(提供类型;键安全需要设置) |
|
|
245
|
+
| **缺失翻译检测** | 构建时错误/警告 | 运行时大多回退字符串 | 回退字符串 | 需要额外配置 | 运行时回退 | 运行时回退 | 运行时回退/警告(可配置) |
|
|
246
|
+
| **丰富内容(JSX/Markdown/组件)** | 直接支持,甚至包括 React 节点 | 有限 / 仅插值 | ICU 语法,不是真正的 JSX | 有限 | 不支持丰富节点 | 有限 | 有限(通过 `<i18n-t>` 组件,Markdown 通过插件) |
|
|
247
|
+
| **AI驱动的翻译** | 是,支持多个AI提供商。可使用您自己的API密钥。考虑您的应用程序和内容范围的上下文 | 否 | 否 | 否 | 否 | 否 | 否 |
|
|
248
|
+
| **可视化编辑器** | 是,本地可视化编辑器 + 可选 CMS;可外部化代码库内容;可嵌入 | 否 / 可通过外部本地化平台获得 | 否 / 可通过外部本地化平台获得 | 否 / 可通过外部本地化平台获得 | 否 / 可通过外部本地化平台获得 | 否 / 可通过外部本地化平台获得 | 否 / 可通过外部本地化平台获得 |
|
|
249
|
+
| **本地化路由** | 内置,支持中间件 | 插件或手动配置 | 非内置 | 插件/手动配置 | 内置 | 内置 | 通过 Vue Router 手动配置(由 Nuxt i18n 处理) |
|
|
250
|
+
| **动态路由生成** | 是 | 插件/生态系统或手动设置 | 未提供 | 插件/手动 | 是 | 是 | 未提供(Nuxt i18n 提供) |
|
|
251
|
+
| **复数形式** | 基于枚举的模式;详见文档 | 可配置(如 i18next-icu 插件) | 高级(ICU) | 高级(ICU/messageformat) | 良好 | 良好 | 高级(内置复数规则) |
|
|
252
|
+
| **格式化(日期、数字、货币)** | 优化的格式化器(底层使用 Intl) | 通过插件或自定义 Intl 使用 | 高级 ICU 格式化器 | ICU/CLI 辅助工具 | 良好(Intl 辅助工具) | 良好(Intl 辅助工具) | 内置日期/数字格式化器(Intl) |
|
|
253
|
+
| **内容格式** | .tsx, .ts, .js, .json, .md, .txt | .json | .json, .js | .po, .json | .json, .js, .ts | .json | .json, .js |
|
|
254
|
+
| **ICU 支持** | 进行中(原生 ICU) | 通过插件(i18next-icu) | 是 | 是 | 是 | 通过插件(i18next-icu) | 通过自定义格式化器/编译器 |
|
|
255
|
+
| **SEO 辅助工具(hreflang,网站地图)** | 内置工具:网站地图、**robots.txt**、元数据的辅助工具 | 社区插件/手动配置 | 非核心功能 | 非核心功能 | 良好 | 良好 | 非核心功能(Nuxt i18n 提供辅助工具) |
|
|
256
|
+
| **生态系统 / 社区** | 较小但增长迅速且反应灵敏 | 最大且最成熟 | 大型,企业级 | 发展中,规模较小 | 中型,专注于 Next.js | 中型,专注于 Next.js | Vue 生态系统中规模较大 |
|
|
257
|
+
| **服务器端渲染与服务器组件** | 是,针对 SSR / React 服务器组件进行了优化 | 支持,但需要一些配置 | 在 Next.js 中支持 | 支持 | 完全支持 | 完全支持 | 通过 Nuxt/Vue SSR 支持 SSR(无 RSC) |
|
|
258
|
+
| **Tree-shaking(仅加载使用的内容)** | 是的,通过 Babel/SWC 插件在构建时按组件进行 | 通常加载全部(可以通过命名空间/代码拆分进行改进) | 通常加载全部 | 非默认 | 部分支持 | 部分支持 | 部分支持(通过代码拆分/手动设置) |
|
|
259
|
+
| **懒加载** | 是的,按语言环境/按组件加载 | 是的(例如,按需加载后端/命名空间) | 是的(拆分语言环境包) | 是的(动态目录导入) | 是的(按路由/按语言环境) | 是的(按路由/按语言环境) | 是的(异步语言环境消息) |
|
|
260
|
+
| **大型项目管理** | 鼓励模块化,适合设计系统 | 需要良好的文件管理 | 中央目录可能变得庞大 | 可能变得复杂 | 通过配置实现模块化 | 通过配置实现模块化 | 通过 Vue Router/Nuxt i18n 配置实现模块化 |
|
|
157
261
|
|
|
158
262
|
## 文档历史
|
|
159
263
|
|
|
160
|
-
|
|
264
|
+
| 版本 | 日期 | 变更内容 |
|
|
265
|
+
| ------ | ---------- | -------------- |
|
|
266
|
+
| 5.8.0 | 2025-08-19 | 更新对比表 |
|
|
267
|
+
| 5.5.10 | 2025-06-29 | 初始化历史记录 |
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
createdAt: 2025-08-11
|
|
3
3
|
updatedAt: 2025-08-11
|
|
4
4
|
title: 在 TanStack Start (React) 中使用 Intlayer 入门
|
|
5
|
-
description: 使用 Intlayer 为您的 TanStack Start
|
|
5
|
+
description: 使用 Intlayer 为您的 TanStack Start 应用添加国际化--组件级字典、本地化 URL 以及 SEO 友好的元数据。
|
|
6
6
|
keywords:
|
|
7
7
|
- 国际化
|
|
8
8
|
- 文档
|
package/docs/zh/introduction.md
CHANGED
|
@@ -32,8 +32,8 @@ Intlayer 还提供了一个可选的可视化编辑器,允许您轻松编辑
|
|
|
32
32
|
.
|
|
33
33
|
└── Components
|
|
34
34
|
└── MyComponent
|
|
35
|
-
├── index.content.
|
|
36
|
-
└── index.
|
|
35
|
+
├── index.content.ts
|
|
36
|
+
└── index.tsx
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
```tsx fileName="src/components/MyComponent/index.content.ts" contentDeclarationFormat="typescript"
|
|
@@ -44,8 +44,8 @@ const componentContent = {
|
|
|
44
44
|
content: {
|
|
45
45
|
myTranslatedContent: t({
|
|
46
46
|
en: "Hello World",
|
|
47
|
-
fr: "Bonjour le monde",
|
|
48
47
|
es: "Hola Mundo",
|
|
48
|
+
fr: "Bonjour le monde",
|
|
49
49
|
}),
|
|
50
50
|
},
|
|
51
51
|
} satisfies Dictionary; // 满足 Dictionary 类型
|
|
@@ -62,8 +62,8 @@ const componentContent = {
|
|
|
62
62
|
content: {
|
|
63
63
|
myTranslatedContent: t({
|
|
64
64
|
en: "Hello World",
|
|
65
|
-
fr: "Bonjour le monde",
|
|
66
65
|
es: "Hola Mundo",
|
|
66
|
+
fr: "Bonjour le monde",
|
|
67
67
|
}),
|
|
68
68
|
},
|
|
69
69
|
};
|
|
@@ -81,8 +81,8 @@ const componentContent = {
|
|
|
81
81
|
content: {
|
|
82
82
|
myTranslatedContent: t({
|
|
83
83
|
en: "Hello World",
|
|
84
|
-
fr: "Bonjour le monde",
|
|
85
84
|
es: "Hola Mundo",
|
|
85
|
+
fr: "Bonjour le monde",
|
|
86
86
|
}),
|
|
87
87
|
},
|
|
88
88
|
};
|
|
@@ -148,8 +148,8 @@ const clientComponentContent = {
|
|
|
148
148
|
content: {
|
|
149
149
|
myTranslatedContent: t({
|
|
150
150
|
en: "Hello World",
|
|
151
|
-
fr: "Bonjour le monde",
|
|
152
151
|
es: "Hola Mundo",
|
|
152
|
+
fr: "Bonjour le monde",
|
|
153
153
|
}),
|
|
154
154
|
numberOfCar: enu({
|
|
155
155
|
"<-1": "Less than minus one car",
|
|
@@ -174,8 +174,8 @@ const clientComponentContent = {
|
|
|
174
174
|
content: {
|
|
175
175
|
myTranslatedContent: t({
|
|
176
176
|
en: "Hello World",
|
|
177
|
-
fr: "Bonjour le monde",
|
|
178
177
|
es: "Hola Mundo",
|
|
178
|
+
fr: "Bonjour le monde",
|
|
179
179
|
}),
|
|
180
180
|
numberOfCar: enu({
|
|
181
181
|
"<-1": "少于负一辆车",
|
|
@@ -200,8 +200,8 @@ const clientComponentContent = {
|
|
|
200
200
|
content: {
|
|
201
201
|
myTranslatedContent: t({
|
|
202
202
|
en: "Hello World",
|
|
203
|
-
fr: "Bonjour le monde",
|
|
204
203
|
es: "Hola Mundo",
|
|
204
|
+
fr: "Bonjour le monde",
|
|
205
205
|
}),
|
|
206
206
|
numberOfCar: enu({
|
|
207
207
|
"<-1": "少于负一辆车",
|
|
@@ -110,8 +110,8 @@ const clientComponentContent = {
|
|
|
110
110
|
content: {
|
|
111
111
|
myTranslatedContent: t({
|
|
112
112
|
en: "Hello World",
|
|
113
|
-
fr: "Bonjour le monde",
|
|
114
113
|
es: "Hola Mundo",
|
|
114
|
+
fr: "Bonjour le monde",
|
|
115
115
|
}),
|
|
116
116
|
numberOfCar: enu({
|
|
117
117
|
"<-1": "Less than minus one car",
|
|
@@ -136,8 +136,8 @@ const clientComponentContent = {
|
|
|
136
136
|
content: {
|
|
137
137
|
myTranslatedContent: t({
|
|
138
138
|
en: "Hello World",
|
|
139
|
-
fr: "Bonjour le monde",
|
|
140
139
|
es: "Hola Mundo",
|
|
140
|
+
fr: "Bonjour le monde",
|
|
141
141
|
}),
|
|
142
142
|
numberOfCar: enu({
|
|
143
143
|
"<-1": "少于负一辆车",
|
|
@@ -162,8 +162,8 @@ const clientComponentContent = {
|
|
|
162
162
|
content: {
|
|
163
163
|
myTranslatedContent: t({
|
|
164
164
|
en: "Hello World",
|
|
165
|
-
fr: "Bonjour le monde",
|
|
166
165
|
es: "Hola Mundo",
|
|
166
|
+
fr: "Bonjour le monde",
|
|
167
167
|
}),
|
|
168
168
|
numberOfCar: enu({
|
|
169
169
|
"<-1": "少于负一辆车",
|
|
@@ -110,8 +110,8 @@ const component1Content = {
|
|
|
110
110
|
content: {
|
|
111
111
|
myTranslatedContent: t({
|
|
112
112
|
en: "Hello World",
|
|
113
|
-
fr: "Bonjour le monde",
|
|
114
113
|
es: "Hola Mundo",
|
|
114
|
+
fr: "Bonjour le monde",
|
|
115
115
|
}),
|
|
116
116
|
numberOfCar: enu({
|
|
117
117
|
"<-1": "少于负一辆车",
|
|
@@ -136,8 +136,8 @@ const component1Content = {
|
|
|
136
136
|
content: {
|
|
137
137
|
myTranslatedContent: t({
|
|
138
138
|
en: "Hello World",
|
|
139
|
-
fr: "Bonjour le monde",
|
|
140
139
|
es: "Hola Mundo",
|
|
140
|
+
fr: "Bonjour le monde",
|
|
141
141
|
}),
|
|
142
142
|
numberOfCar: enu({
|
|
143
143
|
"<-1": "少于负一辆车",
|
|
@@ -162,8 +162,8 @@ const component1Content = {
|
|
|
162
162
|
content: {
|
|
163
163
|
myTranslatedContent: t({
|
|
164
164
|
en: "Hello World",
|
|
165
|
-
fr: "Bonjour le monde",
|
|
166
165
|
es: "Hola Mundo",
|
|
166
|
+
fr: "Bonjour le monde",
|
|
167
167
|
}),
|
|
168
168
|
numberOfCar: enu({
|
|
169
169
|
"<-1": "少于负一辆汽车",
|
|
@@ -46,7 +46,7 @@ const config: IntlayerConfig = {
|
|
|
46
46
|
export default config;
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
هذا كل شيء
|
|
49
|
+
هذا كل شيء - يعمل بنفس الطريقة مع **Next.js**، **Vite + React**، **Vite + Vue**، إلخ.
|
|
50
50
|
|
|
51
51
|
## ماذا لو كان كل النطاقات تشير إلى نفس النشر؟
|
|
52
52
|
|
|
@@ -46,7 +46,7 @@ const config: IntlayerConfig = {
|
|
|
46
46
|
export default config;
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
That's all
|
|
49
|
+
That's all-works the same for **Next.js**, **Vite + React**, **Vite + Vue**, etc.
|
|
50
50
|
|
|
51
51
|
## What if every domain hits the **same** deployment?
|
|
52
52
|
|
|
@@ -46,7 +46,7 @@ const config: IntlayerConfig = {
|
|
|
46
46
|
export default config;
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
That's all
|
|
49
|
+
That's all-works the same for **Next.js**, **Vite + React**, **Vite + Vue**, etc.
|
|
50
50
|
|
|
51
51
|
## What if every domain hits the **same** deployment?
|
|
52
52
|
|
|
@@ -46,7 +46,7 @@ const config: IntlayerConfig = {
|
|
|
46
46
|
export default config;
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
Eso es todo
|
|
49
|
+
Eso es todo-funciona igual para **Next.js**, **Vite + React**, **Vite + Vue**, etc.
|
|
50
50
|
|
|
51
51
|
## ¿Qué pasa si todos los dominios apuntan al **mismo** despliegue?
|
|
52
52
|
|
|
@@ -46,7 +46,7 @@ const config: IntlayerConfig = {
|
|
|
46
46
|
export default config;
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
C’est tout
|
|
49
|
+
C’est tout - cela fonctionne de la même manière pour **Next.js**, **Vite + React**, **Vite + Vue**, etc.
|
|
50
50
|
|
|
51
51
|
## Que faire si tous les domaines pointent vers le **même** déploiement ?
|
|
52
52
|
|
|
@@ -46,7 +46,7 @@ const config: IntlayerConfig = {
|
|
|
46
46
|
export default config;
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
बस इतना
|
|
49
|
+
बस इतना ही-यह **Next.js**, **Vite + React**, **Vite + Vue**, आदि के लिए समान रूप से काम करता है।
|
|
50
50
|
|
|
51
51
|
## अगर हर डोमेन एक ही तैनाती को हिट करता है तो क्या होगा?
|
|
52
52
|
|
|
@@ -46,7 +46,7 @@ const config: IntlayerConfig = {
|
|
|
46
46
|
export default config;
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
Questo è tutto
|
|
49
|
+
Questo è tutto-funziona allo stesso modo per **Next.js**, **Vite + React**, **Vite + Vue**, ecc.
|
|
50
50
|
|
|
51
51
|
## Cosa succede se tutti i domini puntano alla **stessa** distribuzione?
|
|
52
52
|
|
|
@@ -46,7 +46,7 @@ const config: IntlayerConfig = {
|
|
|
46
46
|
export default config;
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
이게
|
|
49
|
+
이게 전부입니다-**Next.js**, **Vite + React**, **Vite + Vue** 등에서도 동일하게 작동합니다.
|
|
50
50
|
|
|
51
51
|
## 모든 도메인이 **같은** 배포본을 가리킨다면 어떻게 하나요?
|
|
52
52
|
|
|
@@ -46,7 +46,7 @@ const config: IntlayerConfig = {
|
|
|
46
46
|
export default config;
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
É só isso
|
|
49
|
+
É só isso - funciona da mesma forma para **Next.js**, **Vite + React**, **Vite + Vue**, etc.
|
|
50
50
|
|
|
51
51
|
## E se todos os domínios acessarem a **mesma** implantação?
|
|
52
52
|
|
|
@@ -46,7 +46,7 @@ const config: IntlayerConfig = {
|
|
|
46
46
|
export default config;
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
Вот и всё
|
|
49
|
+
Вот и всё - работает одинаково для **Next.js**, **Vite + React**, **Vite + Vue** и т.д.
|
|
50
50
|
|
|
51
51
|
## Что если все домены указывают на **одно и то же** развертывание?
|
|
52
52
|
|
|
@@ -119,10 +119,10 @@ const locale = cookies().get("myCustomLocaleCookie")?.value;
|
|
|
119
119
|
* предпочтительные языки пользователя в порядке предпочтения.
|
|
120
120
|
*
|
|
121
121
|
* Пример: "en-US,en;q=0.9,fr;q=0.8,es;q=0.7"
|
|
122
|
-
* - en-US
|
|
123
|
-
* - en
|
|
124
|
-
* - fr
|
|
125
|
-
* - es
|
|
122
|
+
* - en-US - основной язык (q=1.0 подразумевается)
|
|
123
|
+
* - en - второй выбор (q=0.9)
|
|
124
|
+
* - fr - третий выбор (q=0.8)
|
|
125
|
+
* - es - четвёртый выбор (q=0.7)
|
|
126
126
|
*/
|
|
127
127
|
import { localeDetector } from "@intlayer/core";
|
|
128
128
|
|
|
@@ -28,10 +28,9 @@ slugs:
|
|
|
28
28
|
Когда вы используете `useTranslations`, `getTranslations` или любой помощник next-intl _внутри серверного компонента_ в приложении с i18n-маршрутизацией (`/en/…`, `/fr/…`), Next.js помечает весь маршрут как **динамический**. ([Next Intl][1])
|
|
29
29
|
|
|
30
30
|
- **Почему?**
|
|
31
|
-
next-intl получает текущую локаль из заголовка, доступного только в запросе (`x-next-intl-locale`) через `headers()`. Поскольку `headers()`
|
|
31
|
+
next-intl получает текущую локаль из заголовка, доступного только в запросе (`x-next-intl-locale`) через `headers()`. Поскольку `headers()` - это **динамический API**, любой компонент, который его использует, теряет статическую оптимизацию. ([Next Intl][1], [Next.js][2])
|
|
32
32
|
|
|
33
33
|
- **Официальное решение (шаблон)**
|
|
34
|
-
|
|
35
34
|
1. Экспортируйте `generateStaticParams` для каждой поддерживаемой локали.
|
|
36
35
|
2. Вызывайте `setRequestLocale(locale)` в **каждом** layout/странице _до_ вызова `useTranslations`. ([Next Intl][1])
|
|
37
36
|
Это устраняет зависимость от заголовка, но теперь у вас появляется дополнительный код для поддержки и нестабильный API в продакшене.
|