@intlayer/docs 5.7.8 → 5.8.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/blog/ar/intlayer_with_next-i18next.md +3 -4
  2. package/blog/ar/intlayer_with_next-intl.md +3 -4
  3. package/blog/ar/intlayer_with_react-i18next.md +1 -1
  4. package/blog/ar/intlayer_with_react-intl.md +1 -1
  5. package/blog/de/intlayer_with_next-i18next.md +3 -4
  6. package/blog/de/intlayer_with_react-intl.md +1 -1
  7. package/blog/en/intlayer_with_next-i18next.md +3 -4
  8. package/blog/en/intlayer_with_next-intl.md +3 -4
  9. package/blog/en/intlayer_with_react-i18next.md +1 -1
  10. package/blog/en/intlayer_with_react-intl.md +1 -1
  11. package/blog/en-GB/intlayer_with_next-i18next.md +3 -4
  12. package/blog/en-GB/intlayer_with_next-intl.md +3 -4
  13. package/blog/en-GB/intlayer_with_react-i18next.md +1 -1
  14. package/blog/en-GB/intlayer_with_react-intl.md +1 -1
  15. package/blog/es/intlayer_with_next-i18next.md +3 -4
  16. package/blog/es/intlayer_with_next-intl.md +3 -4
  17. package/blog/es/intlayer_with_react-i18next.md +1 -1
  18. package/blog/es/intlayer_with_react-intl.md +1 -1
  19. package/blog/fr/intlayer_with_next-i18next.md +3 -4
  20. package/blog/fr/intlayer_with_next-intl.md +3 -4
  21. package/blog/fr/intlayer_with_react-i18next.md +1 -1
  22. package/blog/fr/intlayer_with_react-intl.md +1 -1
  23. package/blog/hi/intlayer_with_next-i18next.md +3 -4
  24. package/blog/hi/intlayer_with_next-intl.md +3 -4
  25. package/blog/hi/intlayer_with_react-i18next.md +1 -1
  26. package/blog/hi/intlayer_with_react-intl.md +1 -1
  27. package/blog/it/intlayer_with_next-i18next.md +3 -4
  28. package/blog/it/intlayer_with_next-intl.md +3 -4
  29. package/blog/it/intlayer_with_react-i18next.md +1 -1
  30. package/blog/it/intlayer_with_react-intl.md +1 -1
  31. package/blog/ja/intlayer_with_next-i18next.md +3 -4
  32. package/blog/ja/intlayer_with_next-intl.md +3 -4
  33. package/blog/ja/intlayer_with_react-intl.md +1 -1
  34. package/blog/ko/intlayer_with_next-i18next.md +3 -4
  35. package/blog/ko/intlayer_with_next-intl.md +3 -4
  36. package/blog/ko/intlayer_with_react-intl.md +1 -1
  37. package/blog/pt/intlayer_with_next-i18next.md +3 -4
  38. package/blog/pt/intlayer_with_next-intl.md +3 -4
  39. package/blog/pt/intlayer_with_react-intl.md +1 -1
  40. package/blog/ru/intlayer_with_next-i18next.md +3 -4
  41. package/blog/ru/intlayer_with_next-intl.md +3 -4
  42. package/blog/ru/intlayer_with_react-i18next.md +1 -1
  43. package/blog/ru/intlayer_with_react-intl.md +1 -1
  44. package/blog/zh/intlayer_with_next-i18next.md +3 -4
  45. package/blog/zh/intlayer_with_next-intl.md +3 -4
  46. package/blog/zh/intlayer_with_react-i18next.md +1 -1
  47. package/blog/zh/intlayer_with_react-intl.md +1 -1
  48. package/dist/cjs/generated/docs.entry.cjs +41 -0
  49. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  50. package/dist/esm/generated/docs.entry.mjs +41 -0
  51. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  52. package/dist/types/generated/docs.entry.d.ts +1 -0
  53. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  54. package/docs/ar/formatters.md +239 -0
  55. package/docs/ar/interest_of_intlayer.md +162 -49
  56. package/docs/ar/introduction.md +3 -3
  57. package/docs/ar/packages/intlayer/index.md +3 -3
  58. package/docs/ar/packages/next-intlayer/index.md +3 -3
  59. package/docs/de/formatters.md +239 -0
  60. package/docs/de/interest_of_intlayer.md +161 -47
  61. package/docs/de/introduction.md +3 -3
  62. package/docs/de/packages/intlayer/index.md +3 -3
  63. package/docs/de/packages/next-intlayer/index.md +3 -3
  64. package/docs/de/packages/react-intlayer/index.md +3 -3
  65. package/docs/en/formatters.md +250 -0
  66. package/docs/en/interest_of_intlayer.md +159 -46
  67. package/docs/en/introduction.md +3 -3
  68. package/docs/en/packages/intlayer/index.md +3 -3
  69. package/docs/en/packages/next-intlayer/index.md +3 -3
  70. package/docs/en/packages/react-intlayer/index.md +3 -3
  71. package/docs/en-GB/formatters.md +239 -0
  72. package/docs/en-GB/interest_of_intlayer.md +160 -53
  73. package/docs/en-GB/packages/intlayer/index.md +3 -3
  74. package/docs/en-GB/packages/next-intlayer/index.md +3 -3
  75. package/docs/en-GB/packages/react-intlayer/index.md +3 -3
  76. package/docs/es/formatters.md +239 -0
  77. package/docs/es/interest_of_intlayer.md +159 -47
  78. package/docs/es/introduction.md +3 -3
  79. package/docs/es/packages/intlayer/index.md +3 -3
  80. package/docs/es/packages/next-intlayer/index.md +3 -3
  81. package/docs/fr/formatters.md +239 -0
  82. package/docs/fr/interest_of_intlayer.md +160 -46
  83. package/docs/fr/introduction.md +3 -3
  84. package/docs/fr/packages/intlayer/index.md +3 -3
  85. package/docs/fr/packages/next-intlayer/index.md +3 -3
  86. package/docs/fr/packages/react-intlayer/index.md +3 -3
  87. package/docs/hi/formatters.md +239 -0
  88. package/docs/hi/interest_of_intlayer.md +158 -42
  89. package/docs/hi/introduction.md +3 -3
  90. package/docs/hi/packages/intlayer/index.md +3 -3
  91. package/docs/hi/packages/next-intlayer/index.md +3 -3
  92. package/docs/hi/packages/react-intlayer/index.md +3 -3
  93. package/docs/it/formatters.md +239 -0
  94. package/docs/it/interest_of_intlayer.md +160 -46
  95. package/docs/it/introduction.md +3 -3
  96. package/docs/it/packages/intlayer/index.md +3 -3
  97. package/docs/it/packages/next-intlayer/index.md +3 -3
  98. package/docs/it/packages/react-intlayer/index.md +3 -3
  99. package/docs/ja/formatters.md +261 -0
  100. package/docs/ja/interest_of_intlayer.md +157 -48
  101. package/docs/ja/introduction.md +3 -3
  102. package/docs/ja/packages/intlayer/index.md +3 -3
  103. package/docs/ja/packages/next-intlayer/index.md +3 -3
  104. package/docs/ja/packages/react-intlayer/index.md +3 -3
  105. package/docs/ko/formatters.md +258 -0
  106. package/docs/ko/interest_of_intlayer.md +160 -48
  107. package/docs/ko/introduction.md +3 -3
  108. package/docs/ko/packages/intlayer/index.md +3 -3
  109. package/docs/ko/packages/next-intlayer/index.md +3 -3
  110. package/docs/ko/packages/react-intlayer/index.md +3 -3
  111. package/docs/pt/formatters.md +239 -0
  112. package/docs/pt/interest_of_intlayer.md +162 -47
  113. package/docs/pt/introduction.md +3 -3
  114. package/docs/pt/packages/intlayer/index.md +3 -3
  115. package/docs/pt/packages/next-intlayer/index.md +3 -3
  116. package/docs/pt/packages/react-intlayer/index.md +3 -3
  117. package/docs/ru/formatters.md +239 -0
  118. package/docs/ru/interest_of_intlayer.md +168 -50
  119. package/docs/ru/introduction.md +3 -3
  120. package/docs/ru/packages/intlayer/index.md +3 -3
  121. package/docs/ru/packages/next-intlayer/index.md +3 -3
  122. package/docs/ru/packages/react-intlayer/index.md +3 -3
  123. package/docs/zh/formatters.md +239 -0
  124. package/docs/zh/interest_of_intlayer.md +158 -48
  125. package/docs/zh/introduction.md +3 -3
  126. package/docs/zh/packages/intlayer/index.md +3 -3
  127. package/docs/zh/packages/next-intlayer/index.md +3 -3
  128. package/docs/zh/packages/react-intlayer/index.md +3 -3
  129. package/package.json +12 -12
  130. package/src/generated/docs.entry.ts +41 -0
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  createdAt: 2024-08-14
3
- updatedAt: 2025-06-29
3
+ updatedAt: 2025-08-20
4
4
  title: Intlayer 的优势
5
- description: 发现使用 Intlayer 在您的项目中的好处和优势。了解为什么 Intlayer 在众多框架中脱颖而出。
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
- - concept
15
- - interest
14
+ - why
16
15
  ---
17
16
 
18
- # Intlayer:为您的网站量身定制的翻译方式
17
+ # 为什么你应该考虑使用 Intlayer
19
18
 
20
- **Intlayer** 是一个专为 JavaScript 开发者设计的国际化库。它允许您在代码中的任何地方声明内容。它将多语言内容的声明转换为结构化的字典,便于轻松集成到您的代码中。通过使用 TypeScript,**Intlayer** 使您的开发更加强大且高效。
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
- └── Components
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
- └── Components
93
+ └── components
35
94
  └── MyComponent
36
95
  ├── index.content.cjs
37
- └── index.mjs
96
+ ├── index.test.mjs
97
+ ├── index.stories.mjs
98
+ └── index.tsx
38
99
  ```
39
100
 
40
101
  ```bash codeFormat="esm"
41
102
  .
42
- └── Components
103
+ └── components
43
104
  └── MyComponent
44
105
  ├── index.content.mjs
45
- └── index.js
106
+ ├── index.test.mjs
107
+ ├── index.stories.mjs
108
+ └── index.tsx
46
109
  ```
47
110
 
48
- ```tsx fileName="./Components/MyComponent/index.content.ts" codeFormat="typescript"
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="./Components/MyComponent/index.mjx" codeFormat="esm"
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="./Components/MyComponent/index.csx" codeFormat="commonjs"
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="./Components/MyComponent/index.tsx" codeFormat="typescript"
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="./Components/MyComponent/index.mjx" codeFormat="esm"
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="./Components/MyComponent/index.csx" codeFormat="commonjs"
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,79 @@ const ComponentExample = () => {
133
192
  };
134
193
  ```
135
194
 
136
- ## 为什么选择 Intlayer?
137
-
138
- | 功能 | 描述 |
139
- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
140
- | **基于JavaScript的内容管理** | 利用JavaScript的灵活性,高效地定义和管理您的内容。 |
141
- | **类型安全环境** | 利用 TypeScript 确保所有内容定义准确无误且无错误。 |
142
- | **集成内容文件** | 将您的翻译内容与各自的组件紧密结合,提升可维护性和清晰度。 |
143
- | **简化设置** | 通过最少的配置快速启动,特别针对 Next.js 项目进行了优化。 |
144
- | **服务器组件支持** | 完美适配 Next.js 服务器组件,确保流畅的服务器端渲染。 |
145
- | **增强的路由功能** | 完全支持 Next.js 应用路由,能够无缝适应复杂的应用结构。 |
146
- | **有序的代码库** | 保持代码库更加有序:1 个组件 = 同一文件夹中的 1 个字典。 |
147
- | **CI 自动翻译** | 使用您自己的 OpenAI API 密钥在持续集成(CI)中自动填充您的翻译,消除对本地化平台的需求。 |
148
- | **MCP 服务器集成** | 提供 MCP(模型上下文协议)服务器以实现 IDE 自动化,使您能够在开发环境中直接无缝管理内容和国际化工作流程。[了解更多](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/mcp_server.md)。 |
149
- | **Markdown 支持** | 导入并解析多语言内容的 Markdown 文件,例如隐私政策。 |
150
- | **免费可视化编辑器和内容管理系统** | 如果您需要与内容撰写者合作进行翻译,我们提供免费的可视化编辑器和内容管理系统,这同样消除了对本地化平台的需求,并允许将内容从代码库中外部化。 |
151
- | **简化内容获取** | 无需为每一条内容调用 `t` 函数;可以使用单个钩子直接获取所有内容。 |
152
- | **一致的实现** | 客户端和服务器组件使用相同的实现,无需在每个服务器组件之间传递你的 `t` 函数。 |
153
- | **可进行 Tree-shaking 的内容** | 内容支持 Tree-shaking,这减轻了最终包的体积。 |
154
- | **非阻塞静态渲染** | Intlayer 不会像 `next-intl` 那样阻塞静态渲染。 |
155
- | **非阻塞静态渲染** | Intlayer 不会像 `next-intl` 那样阻塞静态渲染。 |
156
- | **互操作性** | 允许与 [react-i18next](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_react-i18next.md)、[next-i18next](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_next-i18next.md)、[next-intl](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_next-intl.md) [react-intl](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/intlayer_with_react-intl.md) 互操作。 |
195
+ 这种方法允许您:
196
+
197
+ 1. **提高开发速度**
198
+ - 可以使用 VSCode 扩展创建 `.content.{{ts|mjs|cjs|json}}` 文件
199
+ - IDE 中的自动补全 AI 工具(如 GitHub Copilot)可以帮助你声明内容,减少复制/粘贴
200
+
201
+ 2. **降低代码库的复杂性**
202
+
203
+ 3. **提高代码库的可维护性**
204
+
205
+ 4. **更轻松地复制组件及其相关内容(例如:登录/注册组件等)**
206
+ - 限制影响其他组件内容的风险
207
+ - 通过复制/粘贴内容从一个应用到另一个应用,无需外部依赖
208
+
209
+ 5. **避免因未使用的组件而污染代码库,产生未使用的键/值**
210
+ - 如果不使用某个组件,则无需导入其内容
211
+ - 如果你删除一个组件,你会更容易记得删除其相关内容,因为它们会存在于同一个文件夹中
212
+
213
+ 6. **降低 AI 代理声明多语言内容的推理成本**
214
+ - AI 代理无需扫描整个代码库来确定内容的实现位置
215
+ - 翻译可以通过 IDE 中的自动补全 AI 工具(如 GitHub Copilot)轻松完成
216
+
217
+ 7. **优化加载性能**
218
+ - 如果组件是懒加载的,其相关内容也会同时加载
219
+
220
+ ## Intlayer 的附加功能
221
+
222
+ | 功能 | 描述 |
223
+ | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
224
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/frameworks.png?raw=true) | **跨框架支持**<br><br>Intlayer 兼容所有主流框架和库,包括 Next.js、React、Vite、Vue.js、Nuxt、Preact、Express 等。 |
225
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.png?raw=true) | **基于JavaScript的内容管理**<br><br>利用JavaScript的灵活性,高效地定义和管理您的内容。<br><br> - [内容声明](https://intlayer.org/doc/concept/content) |
226
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/per_locale_content_declaration_file.png?raw=true) | **每语言内容声明文件**<br><br>通过在自动生成之前只声明一次内容,加快您的开发速度。<br><br> - [每语言内容声明文件](https://intlayer.org/doc/concept/per-locale-file) |
227
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true) | **类型安全环境**<br><br>利用 TypeScript 确保您的内容定义和代码无错误,同时享受 IDE 自动补全的便利。<br><br> - [TypeScript 配置](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
228
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/config_file.png?raw=true) | **简化设置**<br><br>通过最少的配置快速启动运行。轻松调整国际化、路由、AI、构建和内容处理的设置。<br><br> - [探索 Next.js 集成](https://intlayer.org/doc/environment/nextjs) |
229
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/content_retrieval.png?raw=true) | **简化的内容获取**<br><br>无需为每一条内容调用你的 `t` 函数。使用单个钩子直接获取所有内容。<br><br> - [React 集成](https://intlayer.org/doc/environment/create-react-app) |
230
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/server_component.png?raw=true) | **一致的服务器组件实现**<br><br>完美适用于 Next.js 服务器组件,客户端和服务器组件使用相同的实现,无需在每个服务器组件之间传递你的 `t` 函数。<br><br> - [服务器组件](https://intlayer.org/doc/environment/nextjs#step-7-utilize-content-in-your-code) |
231
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/file_tree.png?raw=true) | **有序的代码库**<br><br>保持代码库更有条理:1 个组件 = 同一文件夹中的 1 个字典。将翻译内容放置在各自组件附近,有助于提升可维护性和清晰度。<br><br> - [Intlayer 的工作原理](https://intlayer.org/doc/concept/how-works-intlayer) |
232
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/url_routing.png?raw=true) | **增强路由**<br><br>全面支持应用路由,能够无缝适应复杂的应用结构,适用于 Next.js、React、Vite、Vue.js 等框架。<br><br> - [探索 Next.js 集成](https://intlayer.org/doc/environment/nextjs) |
233
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/markdown.png?raw=true) | **Markdown 支持**<br><br>导入并解析本地化文件和远程 Markdown,用于多语言内容,如隐私政策、文档等。解析并使 Markdown 元数据在代码中可访问。<br><br> - [内容文件](https://intlayer.org/doc/concept/content/file) |
234
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/visual_editor.png?raw=true) | **免费可视化编辑器和CMS**<br><br>为内容创作者提供免费的可视化编辑器和CMS,无需使用本地化平台。通过Git保持内容同步,或使用CMS将内容完全或部分外部化。<br><br> - [Intlayer 编辑器](https://intlayer.org/doc/concept/editor) <br> - [Intlayer CMS](https://intlayer.org/doc/concept/cms) |
235
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/bundle.png?raw=true) | **可摇树内容**<br><br>可摇树内容,减少最终包的大小。按组件加载内容,排除任何未使用的内容。支持懒加载以提升应用加载效率。<br><br> - [应用构建优化](https://intlayer.org/doc/concept/how-works-intlayer#app-build-optimization) |
236
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/static_rendering.png?raw=true) | **静态渲染**<br><br>不会阻塞静态渲染。<br><br> - [Next.js 集成](https://intlayer.org/doc/environment/nextjs) |
237
+ | ![Feature](https://github.com/aymericzip/intlayer/blob/main/docs/assets/AI_translation.png?raw=true) | **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) |
238
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/mcp.png?raw=true) | **MCP 服务器集成**<br><br>提供一个 MCP(模型上下文协议)服务器,用于 IDE 自动化,实现内容管理和国际化工作流在您的开发环境中无缝进行。<br><br> - [MCP 服务器](https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/mcp_server.md) |
239
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/vscode_extension.png?raw=true) | **VSCode 扩展**<br><br>Intlayer 提供了一个 VSCode 扩展,帮助您管理内容和翻译,构建词典,翻译内容等。<br><br> - [VSCode 扩展](https://intlayer.org/doc/zh/vs-code-extension) |
240
+ | ![功能](https://github.com/aymericzip/intlayer/blob/main/docs/assets/interoperability.png?raw=true) | **互操作性**<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) |
241
+
242
+ ## Intlayer 与其他解决方案的比较
243
+
244
+ | 功能 | Intlayer | React-i18next / i18next | React-Intl (FormatJS) | LinguiJS | next-intl | next-i18next | vue-i18n |
245
+ | -------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------- | ----------------------------- | ----------------------------- | ----------------------------- | ----------------------------- | ----------------------------------------------- |
246
+ | **组件附近的翻译** | 是,内容与每个组件共置 | 否 | 否 | 否 | 否 | 否 | 是 - 使用 `单文件组件`(SFCs) |
247
+ | **TypeScript 集成** | 高级,自动生成严格类型 | 基础;额外配置以确保安全 | 良好,但不够严格 | 类型定义,需要配置 | 良好 | 基础 | 良好(提供类型;键安全需要设置) |
248
+ | **缺失翻译检测** | 构建时错误/警告 | 运行时大多回退字符串 | 回退字符串 | 需要额外配置 | 运行时回退 | 运行时回退 | 运行时回退/警告(可配置) |
249
+ | **丰富内容(JSX/Markdown/组件)** | 直接支持,甚至包括 React 节点 | 有限 / 仅插值 | ICU 语法,不是真正的 JSX | 有限 | 不支持丰富节点 | 有限 | 有限(通过 `<i18n-t>` 组件,Markdown 通过插件) |
250
+ | **AI驱动的翻译** | 是,支持多个AI提供商。可使用您自己的API密钥。考虑您的应用程序和内容范围的上下文 | 否 | 否 | 否 | 否 | 否 | 否 |
251
+ | **可视化编辑器** | 是,本地可视化编辑器 + 可选 CMS;可外部化代码库内容;可嵌入 | 否 / 可通过外部本地化平台获得 | 否 / 可通过外部本地化平台获得 | 否 / 可通过外部本地化平台获得 | 否 / 可通过外部本地化平台获得 | 否 / 可通过外部本地化平台获得 | 否 / 可通过外部本地化平台获得 |
252
+ | **本地化路由** | 内置,支持中间件 | 插件或手动配置 | 非内置 | 插件/手动配置 | 内置 | 内置 | 通过 Vue Router 手动配置(由 Nuxt i18n 处理) |
253
+ | **动态路由生成** | 是 | 插件/生态系统或手动设置 | 未提供 | 插件/手动 | 是 | 是 | 未提供(Nuxt i18n 提供) |
254
+ | **复数形式** | 基于枚举的模式;详见文档 | 可配置(如 i18next-icu 插件) | 高级(ICU) | 高级(ICU/messageformat) | 良好 | 良好 | 高级(内置复数规则) |
255
+ | **格式化(日期、数字、货币)** | 优化的格式化器(底层使用 Intl) | 通过插件或自定义 Intl 使用 | 高级 ICU 格式化器 | ICU/CLI 辅助工具 | 良好(Intl 辅助工具) | 良好(Intl 辅助工具) | 内置日期/数字格式化器(Intl) |
256
+ | **内容格式** | .tsx, .ts, .js, .json, .md, .txt | .json | .json, .js | .po, .json | .json, .js, .ts | .json | .json, .js |
257
+ | **ICU 支持** | 进行中(原生 ICU) | 通过插件(i18next-icu) | 是 | 是 | 是 | 通过插件(i18next-icu) | 通过自定义格式化器/编译器 |
258
+ | **SEO 辅助工具(hreflang,网站地图)** | 内置工具:网站地图、**robots.txt**、元数据的辅助工具 | 社区插件/手动配置 | 非核心功能 | 非核心功能 | 良好 | 良好 | 非核心功能(Nuxt i18n 提供辅助工具) |
259
+ | **生态系统 / 社区** | 较小但增长迅速且反应灵敏 | 最大且最成熟 | 大型,企业级 | 发展中,规模较小 | 中型,专注于 Next.js | 中型,专注于 Next.js | Vue 生态系统中规模较大 |
260
+ | **服务器端渲染与服务器组件** | 是,针对 SSR / React 服务器组件进行了优化 | 支持,但需要一些配置 | 在 Next.js 中支持 | 支持 | 完全支持 | 完全支持 | 通过 Nuxt/Vue SSR 支持 SSR(无 RSC) |
261
+ | **Tree-shaking(仅加载使用的内容)** | 是的,通过 Babel/SWC 插件在构建时按组件进行 | 通常加载全部(可以通过命名空间/代码拆分进行改进) | 通常加载全部 | 非默认 | 部分支持 | 部分支持 | 部分支持(通过代码拆分/手动设置) |
262
+ | **懒加载** | 是的,按语言环境/按组件加载 | 是的(例如,按需加载后端/命名空间) | 是的(拆分语言环境包) | 是的(动态目录导入) | 是的(按路由/按语言环境) | 是的(按路由/按语言环境) | 是的(异步语言环境消息) |
263
+ | **大型项目管理** | 鼓励模块化,适合设计系统 | 需要良好的文件管理 | 中央目录可能变得庞大 | 可能变得复杂 | 通过配置实现模块化 | 通过配置实现模块化 | 通过 Vue Router/Nuxt i18n 配置实现模块化 |
157
264
 
158
265
  ## 文档历史
159
266
 
160
- - 5.5.10 - 2025-06-29:初始化历史
267
+ | 版本 | 日期 | 变更内容 |
268
+ | ------ | ---------- | -------------- |
269
+ | 5.8.0 | 2025-08-19 | 更新对比表 |
270
+ | 5.5.10 | 2025-06-29 | 初始化历史记录 |
@@ -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": "少于负一辆汽车",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlayer/docs",
3
- "version": "5.7.8",
3
+ "version": "5.8.0-canary.0",
4
4
  "private": false,
5
5
  "description": "Intlayer documentation",
6
6
  "keywords": [
@@ -49,13 +49,13 @@
49
49
  "legal"
50
50
  ],
51
51
  "dependencies": {
52
- "@intlayer/config": "5.7.8",
53
- "intlayer": "5.7.8"
52
+ "@intlayer/config": "5.8.0-canary.0",
53
+ "intlayer": "5.8.0-canary.0"
54
54
  },
55
55
  "devDependencies": {
56
- "@types/node": "^22.15.30",
56
+ "@types/node": "^24.2.1",
57
57
  "concurrently": "^9.1.2",
58
- "eslint": "^9.28.0",
58
+ "eslint": "^9.33.0",
59
59
  "fast-glob": "^3.3.3",
60
60
  "openai": "^4.89.0",
61
61
  "prettier": "^3.5.3",
@@ -63,18 +63,18 @@
63
63
  "tsc-alias": "^1.8.16",
64
64
  "tsup": "^8.5.0",
65
65
  "tsx": "^4.19.4",
66
- "typescript": "^5.8.3",
66
+ "typescript": "^5.9.2",
67
67
  "vitest": "^3.2.2",
68
- "@intlayer/api": "5.7.8",
69
- "@intlayer/cli": "5.7.8",
68
+ "@intlayer/api": "5.8.0-canary.0",
70
69
  "@utils/ts-config": "1.0.4",
71
70
  "@utils/ts-config-types": "1.0.4",
72
- "@utils/tsup-config": "1.0.4"
71
+ "@utils/tsup-config": "1.0.4",
72
+ "@intlayer/cli": "5.8.0-canary.0"
73
73
  },
74
74
  "peerDependencies": {
75
- "@intlayer/api": "5.7.8",
76
- "@intlayer/cli": "5.7.8",
77
- "@intlayer/config": "5.7.8"
75
+ "@intlayer/api": "5.8.0-canary.0",
76
+ "@intlayer/cli": "5.8.0-canary.0",
77
+ "@intlayer/config": "5.8.0-canary.0"
78
78
  },
79
79
  "engines": {
80
80
  "node": ">=14.18"
@@ -709,6 +709,47 @@ export const docsEntry = {
709
709
  readFile(join(dir, '../../../docs/hi/dictionary/translation.md'), 'utf8')
710
710
  ),
711
711
  } as unknown as Record<LocalesValues, Promise<string>>,
712
+ './docs/en/formatters.md': {
713
+ en: Promise.resolve(
714
+ readFile(join(dir, '../../../docs/en/formatters.md'), 'utf8')
715
+ ),
716
+ fr: Promise.resolve(
717
+ readFile(join(dir, '../../../docs/fr/formatters.md'), 'utf8')
718
+ ),
719
+ ru: Promise.resolve(
720
+ readFile(join(dir, '../../../docs/ru/formatters.md'), 'utf8')
721
+ ),
722
+ ja: Promise.resolve(
723
+ readFile(join(dir, '../../../docs/ja/formatters.md'), 'utf8')
724
+ ),
725
+ ko: Promise.resolve(
726
+ readFile(join(dir, '../../../docs/ko/formatters.md'), 'utf8')
727
+ ),
728
+ zh: Promise.resolve(
729
+ readFile(join(dir, '../../../docs/zh/formatters.md'), 'utf8')
730
+ ),
731
+ es: Promise.resolve(
732
+ readFile(join(dir, '../../../docs/es/formatters.md'), 'utf8')
733
+ ),
734
+ de: Promise.resolve(
735
+ readFile(join(dir, '../../../docs/de/formatters.md'), 'utf8')
736
+ ),
737
+ ar: Promise.resolve(
738
+ readFile(join(dir, '../../../docs/ar/formatters.md'), 'utf8')
739
+ ),
740
+ pt: Promise.resolve(
741
+ readFile(join(dir, '../../../docs/pt/formatters.md'), 'utf8')
742
+ ),
743
+ 'en-GB': Promise.resolve(
744
+ readFile(join(dir, '../../../docs/en-GB/formatters.md'), 'utf8')
745
+ ),
746
+ it: Promise.resolve(
747
+ readFile(join(dir, '../../../docs/it/formatters.md'), 'utf8')
748
+ ),
749
+ hi: Promise.resolve(
750
+ readFile(join(dir, '../../../docs/hi/formatters.md'), 'utf8')
751
+ ),
752
+ } as unknown as Record<LocalesValues, Promise<string>>,
712
753
  './docs/en/how_works_intlayer.md': {
713
754
  en: Promise.resolve(
714
755
  readFile(join(dir, '../../../docs/en/how_works_intlayer.md'), 'utf8')