@intlayer/docs 8.9.4-canary.0 → 8.9.5

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 (207) hide show
  1. package/dist/cjs/generated/docs.entry.cjs +20 -0
  2. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  3. package/dist/esm/generated/docs.entry.mjs +20 -0
  4. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  5. package/dist/types/generated/docs.entry.d.ts +1 -0
  6. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  7. package/docs/ar/benchmark/index.md +0 -3
  8. package/docs/ar/benchmark/nextjs.md +15 -6
  9. package/docs/ar/benchmark/solid.md +155 -0
  10. package/docs/ar/benchmark/svelte.md +148 -0
  11. package/docs/ar/benchmark/tanstack.md +12 -3
  12. package/docs/ar/benchmark/vue.md +160 -0
  13. package/docs/ar/configuration.md +16 -12
  14. package/docs/ar/dictionary/content_file.md +51 -1
  15. package/docs/ar/mcp_server.md +30 -17
  16. package/docs/ar/plugins/sync-po.md +333 -0
  17. package/docs/bn/configuration.md +16 -12
  18. package/docs/cs/configuration.md +16 -12
  19. package/docs/de/benchmark/index.md +0 -3
  20. package/docs/de/benchmark/nextjs.md +15 -6
  21. package/docs/de/benchmark/solid.md +155 -0
  22. package/docs/de/benchmark/svelte.md +148 -0
  23. package/docs/de/benchmark/tanstack.md +12 -3
  24. package/docs/de/benchmark/vue.md +160 -0
  25. package/docs/de/configuration.md +16 -12
  26. package/docs/de/dictionary/content_file.md +52 -2
  27. package/docs/de/mcp_server.md +29 -16
  28. package/docs/de/plugins/sync-po.md +332 -0
  29. package/docs/en/benchmark/nextjs.md +11 -2
  30. package/docs/en/benchmark/solid.md +22 -4
  31. package/docs/en/benchmark/svelte.md +17 -5
  32. package/docs/en/benchmark/tanstack.md +18 -3
  33. package/docs/en/benchmark/vue.md +17 -11
  34. package/docs/en/configuration.md +16 -13
  35. package/docs/en/dictionary/content_file.md +51 -1
  36. package/docs/en/mcp_server.md +31 -18
  37. package/docs/en/plugins/sync-po.md +333 -0
  38. package/docs/en-GB/benchmark/index.md +0 -3
  39. package/docs/en-GB/benchmark/nextjs.md +15 -6
  40. package/docs/en-GB/benchmark/solid.md +155 -0
  41. package/docs/en-GB/benchmark/svelte.md +148 -0
  42. package/docs/en-GB/benchmark/tanstack.md +12 -3
  43. package/docs/en-GB/benchmark/vue.md +160 -0
  44. package/docs/en-GB/configuration.md +15 -11
  45. package/docs/en-GB/dictionary/content_file.md +51 -1
  46. package/docs/en-GB/mcp_server.md +31 -18
  47. package/docs/en-GB/plugins/sync-po.md +333 -0
  48. package/docs/es/benchmark/index.md +0 -3
  49. package/docs/es/benchmark/nextjs.md +15 -6
  50. package/docs/es/benchmark/solid.md +155 -0
  51. package/docs/es/benchmark/svelte.md +148 -0
  52. package/docs/es/benchmark/tanstack.md +12 -3
  53. package/docs/es/benchmark/vue.md +160 -0
  54. package/docs/es/configuration.md +16 -12
  55. package/docs/es/dictionary/content_file.md +51 -1
  56. package/docs/es/mcp_server.md +30 -17
  57. package/docs/es/plugins/sync-po.md +333 -0
  58. package/docs/fr/benchmark/index.md +0 -3
  59. package/docs/fr/benchmark/nextjs.md +15 -6
  60. package/docs/fr/benchmark/solid.md +155 -0
  61. package/docs/fr/benchmark/svelte.md +148 -0
  62. package/docs/fr/benchmark/tanstack.md +12 -3
  63. package/docs/fr/benchmark/vue.md +160 -0
  64. package/docs/fr/configuration.md +16 -12
  65. package/docs/fr/dictionary/content_file.md +51 -1
  66. package/docs/fr/mcp_server.md +30 -17
  67. package/docs/fr/plugins/sync-po.md +333 -0
  68. package/docs/hi/benchmark/nextjs.md +15 -6
  69. package/docs/hi/benchmark/solid.md +155 -0
  70. package/docs/hi/benchmark/svelte.md +148 -0
  71. package/docs/hi/benchmark/tanstack.md +12 -3
  72. package/docs/hi/benchmark/vue.md +160 -0
  73. package/docs/hi/configuration.md +16 -12
  74. package/docs/hi/dictionary/content_file.md +51 -1
  75. package/docs/hi/mcp_server.md +31 -18
  76. package/docs/hi/plugins/sync-po.md +333 -0
  77. package/docs/id/benchmark/index.md +0 -3
  78. package/docs/id/benchmark/nextjs.md +15 -6
  79. package/docs/id/benchmark/solid.md +155 -0
  80. package/docs/id/benchmark/svelte.md +148 -0
  81. package/docs/id/benchmark/tanstack.md +12 -3
  82. package/docs/id/benchmark/vue.md +160 -0
  83. package/docs/id/configuration.md +16 -12
  84. package/docs/id/dictionary/content_file.md +51 -1
  85. package/docs/id/mcp_server.md +30 -17
  86. package/docs/id/plugins/sync-po.md +333 -0
  87. package/docs/it/benchmark/index.md +1 -4
  88. package/docs/it/benchmark/nextjs.md +15 -6
  89. package/docs/it/benchmark/solid.md +155 -0
  90. package/docs/it/benchmark/svelte.md +148 -0
  91. package/docs/it/benchmark/tanstack.md +12 -3
  92. package/docs/it/benchmark/vue.md +160 -0
  93. package/docs/it/configuration.md +16 -12
  94. package/docs/it/dictionary/content_file.md +51 -1
  95. package/docs/it/mcp_server.md +30 -17
  96. package/docs/it/plugins/sync-po.md +333 -0
  97. package/docs/ja/benchmark/index.md +5 -5
  98. package/docs/ja/benchmark/nextjs.md +15 -6
  99. package/docs/ja/benchmark/solid.md +155 -0
  100. package/docs/ja/benchmark/svelte.md +148 -0
  101. package/docs/ja/benchmark/tanstack.md +12 -3
  102. package/docs/ja/benchmark/vue.md +160 -0
  103. package/docs/ja/configuration.md +16 -12
  104. package/docs/ja/dictionary/content_file.md +50 -2
  105. package/docs/ja/intlayer_with_nextjs_no_locale_path.md +4 -3
  106. package/docs/ja/mcp_server.md +29 -16
  107. package/docs/ja/plugins/sync-po.md +333 -0
  108. package/docs/ko/benchmark/nextjs.md +15 -6
  109. package/docs/ko/benchmark/solid.md +155 -0
  110. package/docs/ko/benchmark/svelte.md +148 -0
  111. package/docs/ko/benchmark/tanstack.md +12 -3
  112. package/docs/ko/benchmark/vue.md +160 -0
  113. package/docs/ko/configuration.md +16 -12
  114. package/docs/ko/dictionary/content_file.md +51 -1
  115. package/docs/ko/intlayer_with_nextjs_no_locale_path.md +3 -2
  116. package/docs/ko/mcp_server.md +31 -18
  117. package/docs/ko/plugins/sync-po.md +333 -0
  118. package/docs/nl/configuration.md +16 -12
  119. package/docs/pl/benchmark/index.md +0 -3
  120. package/docs/pl/benchmark/nextjs.md +15 -6
  121. package/docs/pl/benchmark/solid.md +155 -0
  122. package/docs/pl/benchmark/svelte.md +148 -0
  123. package/docs/pl/benchmark/tanstack.md +12 -3
  124. package/docs/pl/benchmark/vue.md +160 -0
  125. package/docs/pl/configuration.md +16 -12
  126. package/docs/pl/dictionary/content_file.md +51 -1
  127. package/docs/pl/mcp_server.md +30 -17
  128. package/docs/pl/plugins/sync-po.md +333 -0
  129. package/docs/pt/benchmark/index.md +0 -3
  130. package/docs/pt/benchmark/nextjs.md +16 -7
  131. package/docs/pt/benchmark/solid.md +155 -0
  132. package/docs/pt/benchmark/svelte.md +148 -0
  133. package/docs/pt/benchmark/tanstack.md +13 -4
  134. package/docs/pt/benchmark/vue.md +160 -0
  135. package/docs/pt/configuration.md +16 -12
  136. package/docs/pt/dictionary/content_file.md +51 -1
  137. package/docs/pt/mcp_server.md +30 -17
  138. package/docs/pt/plugins/sync-po.md +333 -0
  139. package/docs/ru/benchmark/nextjs.md +15 -6
  140. package/docs/ru/benchmark/solid.md +155 -0
  141. package/docs/ru/benchmark/svelte.md +148 -0
  142. package/docs/ru/benchmark/tanstack.md +12 -3
  143. package/docs/ru/benchmark/vue.md +160 -0
  144. package/docs/ru/configuration.md +16 -12
  145. package/docs/ru/dictionary/content_file.md +52 -2
  146. package/docs/ru/mcp_server.md +30 -17
  147. package/docs/ru/plugins/sync-po.md +333 -0
  148. package/docs/tr/benchmark/index.md +0 -3
  149. package/docs/tr/benchmark/nextjs.md +15 -6
  150. package/docs/tr/benchmark/solid.md +155 -0
  151. package/docs/tr/benchmark/svelte.md +148 -0
  152. package/docs/tr/benchmark/tanstack.md +12 -3
  153. package/docs/tr/benchmark/vue.md +160 -0
  154. package/docs/tr/configuration.md +16 -12
  155. package/docs/tr/dictionary/content_file.md +51 -1
  156. package/docs/tr/mcp_server.md +31 -18
  157. package/docs/tr/plugins/sync-po.md +333 -0
  158. package/docs/uk/benchmark/nextjs.md +15 -6
  159. package/docs/uk/benchmark/solid.md +155 -0
  160. package/docs/uk/benchmark/svelte.md +148 -0
  161. package/docs/uk/benchmark/tanstack.md +12 -3
  162. package/docs/uk/benchmark/vue.md +160 -0
  163. package/docs/uk/configuration.md +16 -12
  164. package/docs/uk/dictionary/content_file.md +51 -1
  165. package/docs/uk/mcp_server.md +29 -16
  166. package/docs/uk/plugins/sync-po.md +333 -0
  167. package/docs/ur/configuration.md +16 -12
  168. package/docs/vi/benchmark/index.md +0 -3
  169. package/docs/vi/benchmark/nextjs.md +15 -6
  170. package/docs/vi/benchmark/solid.md +155 -0
  171. package/docs/vi/benchmark/svelte.md +148 -0
  172. package/docs/vi/benchmark/tanstack.md +12 -3
  173. package/docs/vi/benchmark/vue.md +160 -0
  174. package/docs/vi/configuration.md +16 -12
  175. package/docs/vi/dictionary/content_file.md +51 -1
  176. package/docs/vi/intlayer_with_nextjs_15.md +10 -57
  177. package/docs/vi/mcp_server.md +30 -17
  178. package/docs/vi/plugins/sync-po.md +333 -0
  179. package/docs/zh/benchmark/nextjs.md +15 -6
  180. package/docs/zh/benchmark/solid.md +155 -0
  181. package/docs/zh/benchmark/svelte.md +148 -0
  182. package/docs/zh/benchmark/tanstack.md +12 -3
  183. package/docs/zh/benchmark/vue.md +160 -0
  184. package/docs/zh/configuration.md +16 -12
  185. package/docs/zh/dictionary/content_file.md +51 -3
  186. package/docs/zh/mcp_server.md +31 -18
  187. package/docs/zh/plugins/sync-po.md +333 -0
  188. package/frequent_questions/ar/intlayerNode.md +3 -3
  189. package/frequent_questions/de/intlayerNode.md +3 -3
  190. package/frequent_questions/en/intlayerNode.md +3 -3
  191. package/frequent_questions/en-GB/intlayerNode.md +3 -3
  192. package/frequent_questions/es/intlayerNode.md +3 -3
  193. package/frequent_questions/fr/intlayerNode.md +3 -3
  194. package/frequent_questions/hi/intlayerNode.md +3 -3
  195. package/frequent_questions/id/intlayerNode.md +3 -3
  196. package/frequent_questions/it/intlayerNode.md +3 -3
  197. package/frequent_questions/ja/intlayerNode.md +3 -3
  198. package/frequent_questions/ko/intlayerNode.md +3 -3
  199. package/frequent_questions/pl/intlayerNode.md +3 -3
  200. package/frequent_questions/pt/intlayerNode.md +3 -3
  201. package/frequent_questions/ru/intlayerNode.md +3 -3
  202. package/frequent_questions/tr/intlayerNode.md +3 -3
  203. package/frequent_questions/uk/intlayerNode.md +3 -3
  204. package/frequent_questions/vi/intlayerNode.md +3 -3
  205. package/frequent_questions/zh/intlayerNode.md +3 -3
  206. package/package.json +8 -8
  207. package/src/generated/docs.entry.ts +20 -0
@@ -0,0 +1,333 @@
1
+ ---
2
+ createdAt: 2026-05-10
3
+ updatedAt: 2026-05-10
4
+ title: إضافة Sync PO
5
+ description: قم بمزامنة قواميس Intlayer مع ملفات Gettext PO. حافظ على نظام i18n الحالي الخاص بك مع استخدام Intlayer لإدارة رسائلك وترجمتها واختبارها.
6
+ keywords:
7
+ - Intlayer
8
+ - Sync PO
9
+ - Gettext
10
+ - i18n
11
+ - ترجمات
12
+ slugs:
13
+ - doc
14
+ - plugin
15
+ - sync-po
16
+ youtubeVideo: https://www.youtube.com/watch?v=MpGMxniDHNg
17
+ history:
18
+ - version: 8.9.4
19
+ date: 2026-05-10
20
+ changes: "التوثيق الأولي لإضافة Sync PO"
21
+ ---
22
+
23
+ # Sync PO (جسور i18n) - مزامنة PO مع دعم ICU / i18next
24
+
25
+ استخدم Intlayer كإضافة لمجموعة أدوات i18n الحالية لديك. تحافظ هذه الإضافة على رسائل Gettext PO الخاصة بك متزامنة مع قواميس Intlayer حتى تتمكن من:
26
+
27
+ - الحفاظ على سير عمل الترجمة الحالي المعتمد على PO.
28
+ - إدارة رسائلك وترجمتها باستخدام Intlayer (CLI، CI، المزودين، CMS)، دون إعادة صياغة تطبيقك.
29
+ - شحن الدروس ومحتوى SEO الذي يستهدف كل نظام بيئي، مع اقتراح Intlayer كطبقة إدارة PO.
30
+
31
+ ملاحظات والنطاق الحالي:
32
+
33
+ - يعمل التصدير الخارجي إلى CMS للترجمات والنصوص الكلاسيكية.
34
+ - لا يوجد دعم حتى الآن للإدراجات، أو الجموع/ICU، أو ميزات وقت التشغيل المتقدمة للمكتبات الأخرى داخل مدخلات PO نفسها.
35
+ - المحرر المرئي غير مدعوم بعد لمخرجات i18n التابعة لجهات خارجية.
36
+
37
+ ### متى تستخدم هذه الإضافة
38
+
39
+ - أنت تستخدم بالفعل ملفات Gettext PO لترجماتك.
40
+ - تريد التعبئة بمساعدة الذكاء الاصطناعي، والاختبار في CI، وعمليات المحتوى دون تغيير وقت تشغيل العرض الخاص بك.
41
+
42
+ ## التثبيت
43
+
44
+ ```bash
45
+ pnpm add -D @intlayer/sync-po-plugin
46
+ # أو
47
+ npm i -D @intlayer/sync-po-plugin
48
+ ```
49
+
50
+ ## الإضافات
51
+
52
+ توفر هذه الحزمة إضافتين:
53
+
54
+ - `loadPO`: تحميل ملفات PO في قواميس Intlayer.
55
+ - تُستخدم هذه الإضافة لتحميل ملفات PO من مصدر وسيتم تحميلها في قواميس Intlayer. يمكنها مسح كامل قاعدة الأكواد والبحث عن ملفات PO محددة.
56
+ يمكن استخدام هذه الإضافة:
57
+ - إذا كنت تستخدم مكتبة i18n تفرض موقعًا معينًا لتحميل ملفات PO الخاصة بك، ولكنك تريد وضع إعلان المحتوى الخاص بك في أي مكان تريده في قاعدة الأكواد الخاصة بك.
58
+ - يمكن استخدامها أيضًا إذا كنت تريد جلب رسائلك من مصدر بعيد (مثل: CMS، API، إلخ) وتخزين رسائلك في ملفات PO.
59
+
60
+ > تحت الغطاء، ستقوم هذه الإضافة بمسح كامل قاعدة الأكواد والبحث عن ملفات PO محددة وتحميلها في قواميس Intlayer.
61
+ > لاحظ أن هذه الإضافة لن تكتب المخرجات والترجمات مرة أخرى في ملفات PO.
62
+
63
+ - `syncPO`: مزامنة ملفات PO مع قواميس Intlayer.
64
+ - تُستخدم هذه الإضافة لمزامنة ملفات PO مع قواميس Intlayer. يمكنها مسح الموقع المحدد وتحميل ملفات PO التي تطابق النمط لملفات PO محددة. هذه الإضافة مفيدة إذا كنت تريد الحصول على فوائد Intlayer أثناء استخدام مكتبة i18n أخرى.
65
+
66
+ ## استخدام كلتا الإضافتين
67
+
68
+ ```ts fileName="intlayer.config.ts"
69
+ import { Locales, type IntlayerConfig } from "intlayer";
70
+ import { loadPO, syncPO } from "@intlayer/sync-po-plugin";
71
+
72
+ const config: IntlayerConfig = {
73
+ internationalization: {
74
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
75
+ defaultLocale: Locales.ENGLISH,
76
+ },
77
+
78
+ // حافظ على ملفات PO الحالية متزامنة مع قواميس Intlayer
79
+ plugins: [
80
+ /**
81
+ * سيقوم بتحميل جميع ملفات PO في src التي تطابق النمط {key}.i18n.po
82
+ */
83
+ loadPO({
84
+ source: ({ key }) => `./src/**/${key}.i18n.po`,
85
+ locale: Locales.ENGLISH,
86
+ priority: 1, // يضمن أن ملفات PO هذه لها الأولوية على الملفات في `./locales/en/${key}.po`
87
+ }),
88
+ /**
89
+ * سيقوم بتحميل وكتابة المخرجات والترجمات مرة أخرى في ملفات PO في دليل locales
90
+ */
91
+ syncPO({
92
+ source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
93
+ priority: 0,
94
+ }),
95
+ ],
96
+ };
97
+
98
+ export default config;
99
+ ```
100
+
101
+ ## إضافة `syncPO`
102
+
103
+ ### بداية سريعة
104
+
105
+ أضف الإضافة إلى `intlayer.config.ts` الخاص بك ووجهها إلى هيكل PO الحالي لديك.
106
+
107
+ ```ts fileName="intlayer.config.ts"
108
+ import { Locales, type IntlayerConfig } from "intlayer";
109
+ import { syncPO } from "@intlayer/sync-po-plugin";
110
+
111
+ const config: IntlayerConfig = {
112
+ internationalization: {
113
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
114
+ defaultLocale: Locales.ENGLISH,
115
+ },
116
+
117
+ // حافظ على ملفات PO الحالية متزامنة مع قواميس Intlayer
118
+ plugins: [
119
+ syncPO({
120
+ // تخطيط لكل لغة ولكل مساحة اسم
121
+ source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
122
+ }),
123
+ ],
124
+ };
125
+
126
+ export default config;
127
+ ```
128
+
129
+ بديل: ملف واحد لكل لغة:
130
+
131
+ ```ts fileName="intlayer.config.ts"
132
+ import { Locales, type IntlayerConfig } from "intlayer";
133
+ import { syncPO } from "@intlayer/sync-po-plugin";
134
+
135
+ const config: IntlayerConfig = {
136
+ internationalization: {
137
+ locales: [Locales.ENGLISH, Locales.FRENCH],
138
+ defaultLocale: Locales.ENGLISH,
139
+ },
140
+ plugins: [
141
+ syncPO({
142
+ source: ({ locale }) => `./locales/${locale}.po`,
143
+ }),
144
+ ],
145
+ };
146
+
147
+ export default config;
148
+ ```
149
+
150
+ #### كيف تعمل
151
+
152
+ - القراءة: تكتشف الإضافة ملفات PO من منشئ `source` الخاص بك وتحملها كقواميس Intlayer.
153
+ - الكتابة: بعد عمليات البناء والتعبئة، تقوم بكتابة ملفات PO المترجمة مرة أخرى إلى نفس المسارات (مع رؤوس Gettext المناسبة).
154
+ - التعبئة التلقائية: تعلن الإضافة عن مسار `autoFill` لكل قاموس. تشغيل `intlayer fill` يقوم بتحديث الترجمات المفقودة فقط في ملفات PO الخاصة بك بشكل افتراضي.
155
+
156
+ واجهة برمجة التطبيقات (API):
157
+
158
+ ```ts
159
+ syncPO({
160
+ source: ({ key, locale }) => string, // مطلوب
161
+ location?: string, // تسمية اختيارية، الافتراضي: "sync-po::path/to/source"
162
+ priority?: number, // أولوية اختيارية لحل النزاعات، الافتراضي: 0
163
+ });
164
+ ```
165
+
166
+ ### مصادر PO متعددة والأولوية
167
+
168
+ يمكنك إضافة إضافات `syncPO` متعددة لمزامنة مصادر PO مختلفة. هذا مفيد عندما يكون لديك مصادر ترجمة متعددة أو هياكل PO مختلفة في مشروعك.
169
+
170
+ #### نظام الأولوية
171
+
172
+ عندما تستهدف إضافات متعددة نفس مفتاح القاموس، تحدد معلمة `priority` أي إضافة لها الأسبقية:
173
+
174
+ - أرقام الأولوية الأعلى تفوز على الأرقام الأقل
175
+ - الأولوية الافتراضية لملفات `.content` هي `0`
176
+ - الأولوية الافتراضية للإضافات هي `0`
177
+ - تتم معالجة الإضافات التي لها نفس الأولوية بالترتيب الذي تظهر به في التكوين
178
+
179
+ ```ts fileName="intlayer.config.ts"
180
+ import { Locales, type IntlayerConfig } from "intlayer";
181
+ import { syncPO } from "@intlayer/sync-po-plugin";
182
+
183
+ const config: IntlayerConfig = {
184
+ internationalization: {
185
+ locales: [Locales.ENGLISH, Locales.FRENCH],
186
+ defaultLocale: Locales.ENGLISH,
187
+ },
188
+
189
+ plugins: [
190
+ // مصدر PO الأساسي (أعلى أولوية)
191
+ syncPO({
192
+ source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
193
+ location: "main-translations",
194
+ priority: 10,
195
+ }),
196
+
197
+ // مصدر PO احتياطي (أولوية أقل)
198
+ syncPO({
199
+ source: ({ locale }) => `./fallback-locales/${locale}.po`,
200
+ location: "fallback-translations",
201
+ priority: 5,
202
+ }),
203
+
204
+ // مصدر PO قديم (أقل أولوية)
205
+ syncPO({
206
+ source: ({ locale }) => `/my/other/app/legacy/${locale}/messages.po`,
207
+ location: "legacy-translations",
208
+ priority: 1,
209
+ }),
210
+ ],
211
+ };
212
+
213
+ export default config;
214
+ ```
215
+
216
+ ## إضافة Load PO
217
+
218
+ ### بداية سريعة
219
+
220
+ أضف الإضافة إلى `intlayer.config.ts` لاستيعاب ملفات PO الحالية كقواميس Intlayer. هذه الإضافة للقراءة فقط (لا توجد كتابة على القرص):
221
+
222
+ ```ts fileName="intlayer.config.ts"
223
+ import { Locales, type IntlayerConfig } from "intlayer";
224
+ import { loadPO } from "@intlayer/sync-po-plugin";
225
+
226
+ const config: IntlayerConfig = {
227
+ internationalization: {
228
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
229
+ defaultLocale: Locales.ENGLISH,
230
+ },
231
+
232
+ plugins: [
233
+ // استيعاب رسائل PO الموجودة في أي مكان في شجرة المصدر الخاصة بك
234
+ loadPO({
235
+ source: ({ key }) => `./src/**/${key}.i18n.po`,
236
+ // تحميل لغة واحدة لكل نسخة إضافة (يتم تعيينها افتراضيًا على defaultLocale للتكوين)
237
+ locale: Locales.ENGLISH,
238
+ priority: 0,
239
+ }),
240
+ ],
241
+ };
242
+
243
+ export default config;
244
+ ```
245
+
246
+ بديل: تخطيط لكل لغة، لا يزال للقراءة فقط (يتم تحميل اللغة المحددة فقط):
247
+
248
+ ```ts fileName="intlayer.config.ts"
249
+ import { Locales, type IntlayerConfig } from "intlayer";
250
+ import { loadPO } from "@intlayer/sync-po-plugin";
251
+
252
+ const config: IntlayerConfig = {
253
+ internationalization: {
254
+ locales: [Locales.ENGLISH, Locales.FRENCH],
255
+ defaultLocale: Locales.ENGLISH,
256
+ },
257
+ plugins: [
258
+ loadPO({
259
+ // سيتم تحميل الملفات لـ Locales.FRENCH فقط من هذا النمط
260
+ source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
261
+ locale: Locales.FRENCH,
262
+ }),
263
+ ],
264
+ };
265
+
266
+ export default config;
267
+ ```
268
+
269
+ ### كيف تعمل
270
+
271
+ - الاكتشاف: يبني glob من منشئ `source` الخاص بك ويجمع ملفات PO المطابقة.
272
+ - الاستيعاب: يحمل كل ملف PO كقاموس Intlayer مع `locale` المقدم.
273
+ - للقراءة فقط: لا يكتب أو ينسق ملفات المخرجات؛ استخدم `syncPO` إذا كنت بحاجة إلى مزامنة ذهاب وإياب.
274
+ - جاهز للتعبئة التلقائية: يحدد مسار `fill` حتى يتمكن `intlayer content fill` من تعبئة المفاتيح المفقودة.
275
+
276
+ ### واجهة برمجة التطبيقات (API)
277
+
278
+ ```ts
279
+ loadPO({
280
+ // بناء المسارات إلى ملفات PO الخاصة بك. `locale` اختياري إذا كان هيكلك لا يحتوي على جزء للغة
281
+ source: ({ key, locale }) => string,
282
+
283
+ // اللغة المستهدفة للقواميس التي يتم تحميلها بواسطة نسخة الإضافة هذه
284
+ // يتم تعيينها افتراضيًا على configuration.internationalization.defaultLocale
285
+ locale?: Locale,
286
+
287
+ // تسمية اختيارية لتحديد المصدر
288
+ location?: string, // الافتراضي: "plugin"
289
+
290
+ // الأولوية المستخدمة لحل النزاعات ضد المصادر الأخرى
291
+ priority?: number, // الافتراضي: 0
292
+ });
293
+ ```
294
+
295
+ ### السلوك والاتفاقيات
296
+
297
+ - إذا كان قناع `source` الخاص بك يتضمن نائب لغة، فسيتم استيعاب الملفات الخاصة بـ `locale` المحدد فقط.
298
+ - إذا لم يكن هناك جزء `{key}` في قناعك، فسيكون مفتاح القاموس "index".
299
+ - يتم اشتقاق المفاتيح من مسارات الملفات عن طريق استبدال النائب `{key}` في منشئ `source` الخاص بك.
300
+ - تستخدم الإضافة الملفات المكتشفة فقط ولا تصطنع لغات أو مفاتيح مفقودة.
301
+ - يتم استنتاج مسار `fill` من `source` الخاص بك ويستخدم لتحديث القيم المفقودة عبر CLI عند اختيارك.
302
+
303
+ ## حل النزاعات
304
+
305
+ عندما يوجد نفس مفتاح الترجمة في مصادر PO متعددة:
306
+
307
+ 1. تحدد الإضافة ذات الأولوية القصوى القيمة النهائية
308
+ 2. تُستخدم المصادر ذات الأولوية الأقل كبدائل للمفاتيح المفقودة
309
+ 3. يتيح لك هذا الحفاظ على الترجمات القديمة مع الانتقال تدريجيًا إلى الهياكل الجديدة
310
+
311
+ ## واجهة سطر الأوامر (CLI)
312
+
313
+ سيتم اعتبار ملفات PO المتزامنة كملفات `.content` أخرى. وهذا يعني أن جميع أوامر intlayer ستكون متاحة لملفات PO المتزامنة. بما في ذلك:
314
+
315
+ - `intlayer content test` لاختبار ما إذا كانت هناك ترجمات مفقودة
316
+ - `intlayer content list` لسرد ملفات PO المتزامنة
317
+ - `intlayer content fill` لتعبئة الترجمات المفقودة
318
+ - `intlayer content push` لدفع ملفات PO المتزامنة
319
+ - `intlayer content pull` لسحب ملفات PO المتزامنة
320
+
321
+ راجع [Intlayer CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md) لمزيد من التفاصيل.
322
+
323
+ ## القيود (الحالية)
324
+
325
+ - لا يوجد دعم للإدراجات أو الجموع/ICU عند استهداف مكتبات جهات خارجية.
326
+ - المحرر المرئي غير متاح لأوقات التشغيل غير التابعة لـ Intlayer بعد.
327
+ - مزامنة PO فقط؛ تنسيقات الفهرس غير التابعة لـ PO غير مدعومة.
328
+
329
+ ## لماذا هذا مهم
330
+
331
+ - يمكننا التوصية بحلول i18n الراسخة ووضع Intlayer كإضافة.
332
+ - نحن نستفيد من SEO/الكلمات الرئيسية الخاصة بهم مع دروس تنتهي باقتراح Intlayer لإدارة PO.
333
+ - يوسع الجمهور القابل للاستهداف من "المشاريع الجديدة" إلى "أي فريق يستخدم بالفعل i18n".
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2024-08-13
3
- updatedAt: 2026-04-08
3
+ updatedAt: 2026-05-12
4
4
  title: কনফিগারেশন (Configuration)
5
5
  description: আপনার অ্যাপ্লিকেশনের জন্য Intlayer কীভাবে কনফিগার করবেন তা শিখুন। আপনার প্রয়োজন অনুযায়ী Intlayer কাস্টমাইজ করতে উপলব্ধ বিভিন্ন সেটিংস এবং বিকল্পগুলি বুঝুন।
6
6
  keywords:
@@ -14,6 +14,9 @@ slugs:
14
14
  - concept
15
15
  - configuration
16
16
  history:
17
+ - version: 8.9.4
18
+ date: 2026-05-12
19
+ changes: "LM Studio প্রদানকারীর জন্য সমর্থন যোগ করুন"
17
20
  - version: 8.7.0
18
21
  date: 2026-04-08
19
22
  changes: "বিল্ড কনফিগারেশনে `prune` এবং `minify` বিকল্প যোগ করা হয়েছে"
@@ -350,7 +353,7 @@ const config: IntlayerConfig = {
350
353
  ai: {
351
354
  /**
352
355
  * ব্যবহৃত AI প্রোভাইডার।
353
- * বিকল্পসমূহ: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai'
356
+ * বিকল্পসমূহ: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio'
354
357
  * ডিফল্ট: 'openai'
355
358
  */
356
359
  provider: "openai",
@@ -909,16 +912,17 @@ Intlayer সর্বোচ্চ নমনীয়তার জন্য এ
909
912
  - **Groq**
910
913
  - **Amazon Bedrock**
911
914
  - **Together.ai**
912
-
913
- | ফিল্ড | বর্ণনা | টাইপ | ডিফল্ট | উদাহরণ | মন্তব্য |
914
- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
915
- | `provider` | Intlayer AI বৈশিষ্ট্যের জন্য ব্যবহৃত প্রোভাইডার। | `'openai'` &#124; <br/> `'anthropic'` &#124; <br/> `'mistral'` &#124; <br/> `'deepseek'` &#124; <br/> `'gemini'` &#124; <br/> `'ollama'` &#124; <br/> `'openrouter'` &#124; <br/> `'alibaba'` &#124; <br/> `'fireworks'` &#124; <br/> `'groq'` &#124; <br/> `'huggingface'` &#124; <br/> `'bedrock'` &#124; <br/> `'googleaistudio'` &#124; <br/> `'googlevertex'` &#124; <br/> `'togetherai'` | `undefined` | `'anthropic'` | বিভিন্ন প্রোভাইডারের জন্য আলাদা আলাদা API কী প্রয়োজন এবং তাদের দামও আলাদা। |
916
- | `model` | AI বৈশিষ্ট্যের জন্য ব্যবহৃত মডেল। | `string` | নেই | `'gpt-4o-2024-11-20'` | নির্দিষ্ট মডেল প্রোভাইডারের ওপর নির্ভর করে। |
917
- | `temperature` | AI রেসপন্সের র্যান্ডমনেস নিয়ন্ত্রণ করে। | `number` | নেই | `0.1` | উচ্চ টেম্পারেচার = আরও সৃজনশীল এবং কম নির্ভরযোগ্য। |
918
- | `apiKey` | নির্বাচিত প্রোভাইডারের জন্য আপনার API কী। | `string` | নেই | `process.env.OPENAI_API_KEY` | এটি গোপন রাখতে হবে; এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করুন। |
919
- | `applicationContext` | AI-কে আরও নির্ভুল অনুবাদ তৈরিতে সাহায্য করার জন্য আপনার অ্যাপ্লিকেশন সম্পর্কে অতিরিক্ত কনটেক্সট (ডোমেইন, টার্গেট অডিয়েন্স, টোন, পরিভাষা)। | `string` | নেই | `'আমার নিজস্ব অ্যাপ্লিকেশন কনটেক্সট'` | নিয়ম যোগ করার জন্য ব্যবহৃত হতে পারে (যেমন: `"আপনাদের URL গুলো রূপান্তর করা উচিত নয়"` )। |
920
- | `baseURL` | AI API-এর জন্য বেস URL | `string` | নেই | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | স্থানীয় বা কাস্টম AI API এন্ডপয়েন্টে পয়েন্ট করতে পারে। |
921
- | `dataSerialization` | AI বৈশিষ্ট্যের জন্য ডেটা সিরিয়ালাইজেশন ফরম্যাট। | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | `'json'`: ডিফল্ট, নির্ভরযোগ্য; বেশি টোকেন ব্যবহার করে।<br/>• `'toon'`: কম টোকেন, কম স্থিতিশীল।<br/>• অতিরিক্ত প্যারামিটার হিসেবে মডেলকে কনটেক্সট পাস করা হয় (রিজনিং এফোর্ট ইত্যাদি)। |
915
+ - **LM Studio**
916
+
917
+ | ফিল্ড | বর্ণনা | টাইপ | ডিফল্ট | উদাহরণ | মন্তব্য |
918
+ | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
919
+ | `provider` | Intlayer AI বৈশিষ্ট্যের জন্য ব্যবহৃত প্রোভাইডার। | `'openai'` &#124; <br/> `'anthropic'` &#124; <br/> `'mistral'` &#124; <br/> `'deepseek'` &#124; <br/> `'gemini'` &#124; <br/> `'ollama'` &#124; <br/> `'openrouter'` &#124; <br/> `'alibaba'` &#124; <br/> `'fireworks'` &#124; <br/> `'groq'` &#124; <br/> `'huggingface'` &#124; <br/> `'bedrock'` &#124; <br/> `'googleaistudio'` &#124; <br/> `'googlevertex'` &#124; <br/> `'togetherai'` &#124; <br/> `'lmstudio'` | `undefined` | `'anthropic'` | বিভিন্ন প্রোভাইডারের জন্য আলাদা আলাদা API কী প্রয়োজন এবং তাদের দামও আলাদা। |
920
+ | `model` | AI বৈশিষ্ট্যের জন্য ব্যবহৃত মডেল। | `string` | নেই | `'gpt-4o-2024-11-20'` | নির্দিষ্ট মডেল প্রোভাইডারের ওপর নির্ভর করে। |
921
+ | `temperature` | AI রেসপন্সের র্যান্ডমনেস নিয়ন্ত্রণ করে। | `number` | নেই | `0.1` | উচ্চ টেম্পারেচার = আরও সৃজনশীল এবং কম নির্ভরযোগ্য। |
922
+ | `apiKey` | নির্বাচিত প্রোভাইডারের জন্য আপনার API কী। | `string` | নেই | `process.env.OPENAI_API_KEY` | এটি গোপন রাখতে হবে; এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করুন। |
923
+ | `applicationContext` | AI-কে আরও নির্ভুল অনুবাদ তৈরিতে সাহায্য করার জন্য আপনার অ্যাপ্লিকেশন সম্পর্কে অতিরিক্ত কনটেক্সট (ডোমেইন, টার্গেট অডিয়েন্স, টোন, পরিভাষা) | `string` | নেই | `'আমার নিজস্ব অ্যাপ্লিকেশন কনটেক্সট'` | নিয়ম যোগ করার জন্য ব্যবহৃত হতে পারে (যেমন: `"আপনাদের URL গুলো রূপান্তর করা উচিত নয়"` )। |
924
+ | `baseURL` | AI API-এর জন্য বেস URL। | `string` | নেই | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | স্থানীয় বা কাস্টম AI API এন্ডপয়েন্টে পয়েন্ট করতে পারে। |
925
+ | `dataSerialization` | AI বৈশিষ্ট্যের জন্য ডেটা সিরিয়ালাইজেশন ফরম্যাট। | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | • `'json'`: ডিফল্ট, নির্ভরযোগ্য; বেশি টোকেন ব্যবহার করে।<br/>• `'toon'`: কম টোকেন, কম স্থিতিশীল।<br/>• অতিরিক্ত প্যারামিটার হিসেবে মডেলকে কনটেক্সট পাস করা হয় (রিজনিং এফোর্ট ইত্যাদি)। |
922
926
 
923
927
  ---
924
928
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2024-08-13
3
- updatedAt: 2026-04-08
3
+ updatedAt: 2026-05-12
4
4
  title: Konfigurace (Configuration)
5
5
  description: Naučte se, jak nakonfigurovat Intlayer pro vaši aplikaci. Porozumějte různým nastavením a možnostem dostupným pro přizpůsobení Intlayer vašim potřebám.
6
6
  keywords:
@@ -14,6 +14,9 @@ slugs:
14
14
  - concept
15
15
  - configuration
16
16
  history:
17
+ - version: 8.9.4
18
+ date: 2026-05-12
19
+ changes: "Přidána podpora pro poskytovatele LM Studio"
17
20
  - version: 8.7.0
18
21
  date: 2026-04-08
19
22
  changes: "Přidány volby `prune` a `minify` do konfigurace sestavení"
@@ -350,7 +353,7 @@ const config: IntlayerConfig = {
350
353
  ai: {
351
354
  /**
352
355
  * Použitý poskytovatel AI.
353
- * Možnosti: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai'
356
+ * Možnosti: 'openai', 'anthropic', 'mistral', 'deepseek', 'gemini', 'ollama', 'openrouter', 'alibaba', 'fireworks', 'groq', 'huggingface', 'bedrock', 'googlevertex', 'togetherai', 'lmstudio'
354
357
  * Výchozí: 'openai'
355
358
  */
356
359
  provider: "openai",
@@ -916,16 +919,17 @@ Intlayer podporuje několik AI poskytovatelů pro maximální flexibilitu. V sou
916
919
  - **Groq**
917
920
  - **Amazon Bedrock**
918
921
  - **Together.ai**
919
-
920
- | Pole | Popis | Typ | Výchozí | Příklad | Poznámka |
921
- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
922
- | `provider` | Poskytovatel použitý pro AI funkce Intlayer. | `'openai'` &#124; <br/> `'anthropic'` &#124; <br/> `'mistral'` &#124; <br/> `'deepseek'` &#124; <br/> `'gemini'` &#124; <br/> `'ollama'` &#124; <br/> `'openrouter'` &#124; <br/> `'alibaba'` &#124; <br/> `'fireworks'` &#124; <br/> `'groq'` &#124; <br/> `'huggingface'` &#124; <br/> `'bedrock'` &#124; <br/> `'googleaistudio'` &#124; <br/> `'googlevertex'` &#124; <br/> `'togetherai'` | `undefined` | `'anthropic'` | Různí poskytovatelé vyžadují různé API klíče a mají různé ceny. |
923
- | `model` | Model použitý pro AI funkce. | `string` | Žádný | `'gpt-4o-2024-11-20'` | Konkrétní model závisí na poskytovateli. |
924
- | `temperature` | Ovládá náhodnost odpovědí AI. | `number` | Žádný | `0.1` | Vyšší teplota = kreativnější a méně předvídatelné. |
925
- | `apiKey` | Váš API klíč pro zvoleného poskytovatele. | `string` | Žádný | `process.env.OPENAI_API_KEY` | Musí být uchováváno v tajnosti; použijte proměnné prostředí. |
926
- | `applicationContext` | Dodatečný kontext o vaší aplikaci, který pomůže AI generovat přesnější překlady (doména, cílová skupina, tón, terminologie). | `string` | Žádný | `'Můj vlastní kontext aplikace'` | Lze použít k přidání pravidel (např.: `"Neměli byste transformovat URL"`). |
927
- | `baseURL` | Základní URL pro AI API. | `string` | Žádný | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | Může ukazovat na lokální nebo vlastní endpoint AI API. |
928
- | `dataSerialization` | Formát serializace dat pro AI funkce. | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | `'json'`: výchozí, spolehlivé; spotřebovává více tokenů.<br/>• `'toon'`: méně tokenů, méně stabilní.<br/>• Další parametry se předávají modelu jako kontext (úsilí uvažování atd.). |
922
+ - **LM Studio**
923
+
924
+ | Pole | Popis | Typ | Výchozí | Příklad | Poznámka |
925
+ | -------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
926
+ | `provider` | Poskytovatel použitý pro AI funkce Intlayer. | `'openai'` &#124; <br/> `'anthropic'` &#124; <br/> `'mistral'` &#124; <br/> `'deepseek'` &#124; <br/> `'gemini'` &#124; <br/> `'ollama'` &#124; <br/> `'openrouter'` &#124; <br/> `'alibaba'` &#124; <br/> `'fireworks'` &#124; <br/> `'groq'` &#124; <br/> `'huggingface'` &#124; <br/> `'bedrock'` &#124; <br/> `'googleaistudio'` &#124; <br/> `'googlevertex'` &#124; <br/> `'togetherai'` &#124; <br/> `'lmstudio'` | `undefined` | `'anthropic'` | Různí poskytovatelé vyžadují různé API klíče a mají různé ceny. |
927
+ | `model` | Model použitý pro AI funkce. | `string` | Žádný | `'gpt-4o-2024-11-20'` | Konkrétní model závisí na poskytovateli. |
928
+ | `temperature` | Ovládá náhodnost odpovědí AI. | `number` | Žádný | `0.1` | Vyšší teplota = kreativnější a méně předvídatelné. |
929
+ | `apiKey` | Váš API klíč pro zvoleného poskytovatele. | `string` | Žádný | `process.env.OPENAI_API_KEY` | Musí být uchováváno v tajnosti; použijte proměnné prostředí. |
930
+ | `applicationContext` | Dodatečný kontext o vaší aplikaci, který pomůže AI generovat přesnější překlady (doména, cílová skupina, tón, terminologie). | `string` | Žádný | `'Můj vlastní kontext aplikace'` | Lze použít k přidání pravidel (např.: `"Neměli byste transformovat URL"`). |
931
+ | `baseURL` | Základní URL pro AI API. | `string` | Žádný | `'https://api.openai.com/v1'` <br/> `'http://localhost:5000'` | Může ukazovat na lokální nebo vlastní endpoint AI API. |
932
+ | `dataSerialization` | Formát serializace dat pro AI funkce. | `'json'` &#124; <br/> `'toon'` | `undefined` | `'toon'` | • `'json'`: výchozí, spolehlivé; spotřebovává více tokenů.<br/>• `'toon'`: méně tokenů, méně stabilní.<br/>• Další parametry se předávají modelu jako kontext (úsilí uvažování atd.). |
929
933
 
930
934
  ---
931
935
 
@@ -30,6 +30,3 @@ Detaillierte Berichte und technische Dokumentation für jedes Framework finden S
30
30
  - [**Vue Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/vue.md)
31
31
  - [**Solid Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/solid.md)
32
32
  - [**Svelte Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/svelte.md)
33
- - [**Vue Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/vue.md)
34
- - [**Solid Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/solid.md)
35
- - [**Svelte Benchmark Report**](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/svelte.md)
@@ -61,6 +61,13 @@ Da das Problem komplex ist, gibt es viele Lösungen – einige konzentrieren sic
61
61
 
62
62
  Intlayer versucht, über all diese Dimensionen hinweg zu optimieren.
63
63
 
64
+ ## TL;DR
65
+
66
+ - **Intlayer** & **next-translate**: Top-Empfehlungen für die Next.js-Performance, mit dem kleinsten Fußabdruck und der besten Unterstützung für statisches Rendering.
67
+ - **next-intl**: Die aktuell trendigste Option, aber schwerfällig und komplex für die Optimierung großer Anwendungen.
68
+ - **next-i18next**: Beliebt und reich an Plugins, bringt jedoch ein erhebliches Bundle-Gewicht mit sich (~3× Intlayer).
69
+ - **Vermeiden**: **gt-next** und **lingo.dev** aufgrund schwerwiegender Performance-Probleme, Vendor-Lock-in und Build-Fehlern.
70
+
64
71
  ## Testen Sie Ihre App
65
72
 
66
73
  Um diese Probleme aufzudecken, habe ich einen kostenlosen Scanner entwickelt, den Sie [hier](https://intlayer.org/i18n-seo-scanner) ausprobieren können.
@@ -99,14 +106,14 @@ Schließlich wendet `Intlayer` eine Build-Optimierung an, sodass `useIntlayer('m
99
106
  Für diesen Benchmark haben wir die folgenden Bibliotheken verglichen:
100
107
 
101
108
  - `Base App` (Ohne i18n-Bibliothek)
102
- - `next-intlayer` (v8.7.5)
109
+ - `next-intlayer` (v8.7.12)
103
110
  - `next-i18next` (v16.0.5)
104
111
  - `next-intl` (v4.9.1)
105
112
  - `@lingui/core` (v5.3.0)
106
113
  - `next-translate` (v3.1.2)
107
114
  - `next-international` (v1.3.1)
108
115
  - `@inlang/paraglide-js` (v2.15.1)
109
- - `tolgee` (v7.0.0)
116
+ - `@tolgee/react` (v7.0.0)
110
117
  - `@lingo.dev/compiler` (v0.4.0)
111
118
  - `wuchale` (v0.22.11)
112
119
  - `gt-next` (v6.16.5)
@@ -161,10 +168,10 @@ Aufgetretene Probleme:
161
168
 
162
169
  **(General Translation)** (`gt-next@6.16.5`):
163
170
 
164
- - Bei einer 110-KB-App fügt `gt-react` mehr als 440 KB hinzu.
171
+ - Bei einer 110-KB-App fügt `gt-next` mehr als 440 KB hinzu.
165
172
  - `Quota Exceeded, please upgrade your plan` bereits beim allerersten Build mit General Translation.
166
173
  - Übersetzungen werden nicht gerendert; ich erhalte den Fehler `Error: <T> used on the client-side outside of <GTProvider>`, was anscheinend ein Bug in der Bibliothek ist.
167
- - Bei der Implementierung von **gt-tanstack-start-react** stieß ich ebenfalls auf ein [Problem](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) mit der Bibliothek: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser`, was zum Absturz der Anwendung führte. Nach Meldung dieses Problems behob der Maintainer es innerhalb von 24 Stunden.
174
+ - Bei der Implementierung von **gt-next** stieß ich ebenfalls auf ein [Problem](https://github.com/generaltranslation/gt/issues/1210#event-24510646961) mit der Bibliothek: `does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser`, was zum Absturz der Anwendung führte. Nach Meldung dieses Problems behob der Maintainer es innerhalb von 24 Stunden.
168
175
  - Die Bibliothek blockiert das statische Rendering von Next.js-Seiten.
169
176
 
170
177
  **(Lingo.dev)** (`@lingo.dev/compiler@0.4.0`):
@@ -186,9 +193,11 @@ Die Idee hinter `Wuchale` ist interessant, aber noch nicht reif für den Einsatz
186
193
  Persönlich missfällt mir die Notwendigkeit, JS-Dateien vor jedem Push neu zu generieren, was ein ständiges Risiko für Merge-Konflikte in PRs darstellt. Das Tool scheint zudem stärker auf Vite als auf Next.js ausgerichtet zu sein.
187
194
  Schließlich nutzt Paraglide im Vergleich zu anderen Lösungen keinen Store (z. B. React Context), um die aktuelle Sprache für das Rendering abzurufen. Für jeden geparsten Node wird die Sprache aus dem localStorage / Cookie etc. angefragt. Dies führt zur Ausführung unnötiger Logik, die die Reaktivität der Komponenten beeinträchtigt.
188
195
 
196
+ > Hinweis zu Paraglide: Die Lösung injiziert Code in Ihre Codebasis für den Import, wodurch die Metrik 'Bibliotheksgröße' im Benchmark-Bericht fast 0 ist. Codegenerierung ist eine gute Sache, da die verwendete Funktion nur die notwendige Logik enthält (Präfix-Gesamtheit vs. kein Präfix, Cookie vs. Speicher usw.). Im Vergleich dazu führt Intlayer diese Filterung durch Injektionen von Umgebungsvariablen in den Build durch, um den Bundler zu zwingen, Inhalte je nach Logik per Tree-shaking zu entfernen. Dank dessen sind Paraglide und Intlayer am Ende 6- bis 10-mal leichtere Lösungen als i18next oder next-intl.
197
+
189
198
  ### 3 — Akzeptable Lösungen
190
199
 
191
- **(Tolgee)** (`tolgee@7.0.0`):
200
+ **(Tolgee)** (`@tolgee/react@7.0.0`):
192
201
 
193
202
  `Tolgee` adressiert viele der oben genannten Probleme. Ich fand es schwieriger zu adoptieren als ähnliche Tools. Es bietet keine Typsicherheit, was es zudem erschwert, fehlende Schlüssel zur Kompilierzeit zu finden. Ich musste die Tolgee-Funktionen mit eigenen Funktionen umhüllen, um eine Erkennung fehlender Schlüssel hinzuzufügen.
194
203
 
@@ -216,7 +225,7 @@ Die Nachrichtenformate unterscheiden sich ebenfalls: `next-intl` verwendet ICU M
216
225
 
217
226
  `next-translate` ist meine Hauptempfehlung, wenn Sie eine API im `t()`-Stil bevorzugen. Es ist durch das `next-translate-plugin` elegant gelöst und lädt Namespaces über `getStaticProps` mit einem Webpack / Turbopack Loader. Es ist zudem die leichteste Option hier (~2,5 KB). Für das Namespacing ist die Definition pro Seite oder Route in der Konfiguration gut durchdacht und einfacher zu warten als die Hauptalternativen wie **next-intl** oder **next-i18next**. In Version `3.1.2` stellte ich fest, dass das statische Rendering nicht funktionierte; Next.js fiel auf dynamisches Rendering zurück.
218
227
 
219
- **(Intlayer)** (`next-intlayer@8.7.5`):
228
+ **(Intlayer)** (`next-intlayer@8.7.12`):
220
229
 
221
230
  Ich werde `next-intlayer` der Objektivität halber nicht persönlich bewerten, da es meine eigene Lösung ist.
222
231