@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,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt:
|
|
3
|
-
updatedAt: 2025-
|
|
2
|
+
createdAt: 2025-08-23
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
4
|
title: Intlayer وnext-i18next
|
|
5
5
|
description: قم بدمج Intlayer مع next-i18next لتطبيق Next.js
|
|
6
6
|
keywords:
|
|
@@ -24,7 +24,6 @@ slugs:
|
|
|
24
24
|
تتضمن كلا الحلقتين ثلاث مفاهيم رئيسية:
|
|
25
25
|
|
|
26
26
|
1. **إعلان المحتوى**: الطريقة لتعريف المحتوى القابل للترجمة في تطبيقك.
|
|
27
|
-
|
|
28
27
|
- يسمى `resource` في حالة `i18next`، إعلان المحتوى هو كائن JSON منظم يحتوي على أزواج مفتاح-قيمة للترجمات في لغة واحدة أو أكثر. راجع [وثائق i18next](https://www.i18next.com/translation-function/essentials) لمزيد من المعلومات.
|
|
29
28
|
- يسمى `content declaration file` في حالة `Intlayer`، يمكن أن يكون إعلان المحتوى ملف JSON أو JS أو TS يقوم بتصدير البيانات المنسقة. راجع [وثائق Intlayer](https://intlayer.org/fr/doc/concept/content) لمزيد من المعلومات.
|
|
30
29
|
|
|
@@ -213,8 +212,8 @@ const content = {
|
|
|
213
212
|
content: {
|
|
214
213
|
myTranslatedContent: t({
|
|
215
214
|
en: "Hello World",
|
|
216
|
-
fr: "Bonjour le monde",
|
|
217
215
|
es: "Hola Mundo",
|
|
216
|
+
fr: "Bonjour le monde",
|
|
218
217
|
}),
|
|
219
218
|
},
|
|
220
219
|
} satisfies Dictionary;
|
|
@@ -231,8 +230,8 @@ const content = {
|
|
|
231
230
|
content: {
|
|
232
231
|
myTranslatedContent: t({
|
|
233
232
|
en: "Hello World",
|
|
234
|
-
fr: "Bonjour le monde",
|
|
235
233
|
es: "Hola Mundo",
|
|
234
|
+
fr: "Bonjour le monde",
|
|
236
235
|
}),
|
|
237
236
|
},
|
|
238
237
|
};
|
|
@@ -246,8 +245,8 @@ module.exports = {
|
|
|
246
245
|
content: {
|
|
247
246
|
myTranslatedContent: t({
|
|
248
247
|
en: "Hello World",
|
|
249
|
-
fr: "Bonjour le monde",
|
|
250
248
|
es: "Hola Mundo",
|
|
249
|
+
fr: "Bonjour le monde",
|
|
251
250
|
}),
|
|
252
251
|
},
|
|
253
252
|
};
|
|
@@ -23,7 +23,6 @@ slugs:
|
|
|
23
23
|
يتشاركان ثلاث مفاهيم رئيسية:
|
|
24
24
|
|
|
25
25
|
1. **إعلان المحتوى**: الطريقة لتحديد المحتوى القابل للترجمة في تطبيقك.
|
|
26
|
-
|
|
27
26
|
- يُسمى `ملف إعلان المحتوى` في Intlayer، والذي يمكن أن يكون ملف JSON أو JS أو TS يقوم بتصدير البيانات المنظمة. راجع [وثائق Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/concept/content.md) لمزيد من المعلومات.
|
|
28
27
|
- يُسمى `الرسائل` أو `رسائل اللغة` في next-intl، عادةً في ملفات JSON. راجع [وثائق next-intl](https://github.com/amannn/next-intl) لمزيد من المعلومات.
|
|
29
28
|
|
|
@@ -170,8 +169,8 @@ const content = {
|
|
|
170
169
|
content: {
|
|
171
170
|
helloWorld: t({
|
|
172
171
|
en: "Hello World",
|
|
173
|
-
fr: "Bonjour le monde",
|
|
174
172
|
es: "Hola Mundo",
|
|
173
|
+
fr: "Bonjour le monde",
|
|
175
174
|
}),
|
|
176
175
|
},
|
|
177
176
|
} satisfies Dictionary;
|
|
@@ -188,8 +187,8 @@ const content = {
|
|
|
188
187
|
content: {
|
|
189
188
|
helloWorld: t({
|
|
190
189
|
en: "Hello World",
|
|
191
|
-
fr: "Bonjour le monde",
|
|
192
190
|
es: "Hola Mundo",
|
|
191
|
+
fr: "Bonjour le monde",
|
|
193
192
|
}),
|
|
194
193
|
},
|
|
195
194
|
};
|
|
@@ -205,8 +204,8 @@ module.exports = {
|
|
|
205
204
|
content: {
|
|
206
205
|
helloWorld: t({
|
|
207
206
|
en: "Hello World",
|
|
208
|
-
fr: "Bonjour le monde",
|
|
209
207
|
es: "Hola Mundo",
|
|
208
|
+
fr: "Bonjour le monde",
|
|
210
209
|
}),
|
|
211
210
|
},
|
|
212
211
|
};
|
|
@@ -118,8 +118,8 @@ const content = {
|
|
|
118
118
|
// كل استدعاء لـ t() يعلن عن حقل قابل للترجمة
|
|
119
119
|
helloWorld: t({
|
|
120
120
|
en: "Hello World",
|
|
121
|
-
fr: "Bonjour le monde",
|
|
122
121
|
es: "Hola Mundo",
|
|
122
|
+
fr: "Bonjour le monde",
|
|
123
123
|
}),
|
|
124
124
|
description: t({
|
|
125
125
|
en: "This is a description",
|
|
@@ -1,285 +1,162 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt:
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title: next-i18next
|
|
5
|
-
description:
|
|
2
|
+
createdAt: 2025-08-23
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
|
+
title: next-i18next مقابل next-intl مقابل Intlayer
|
|
5
|
+
description: مقارنة بين next-i18next و next-intl و Intlayer لتدويل (i18n) تطبيق Next.js
|
|
6
6
|
keywords:
|
|
7
7
|
- next-intl
|
|
8
8
|
- next-i18next
|
|
9
9
|
- Intlayer
|
|
10
10
|
- التدويل
|
|
11
|
-
-
|
|
11
|
+
- مدونة
|
|
12
12
|
- Next.js
|
|
13
|
-
-
|
|
13
|
+
- جافاسكريبت
|
|
14
14
|
- React
|
|
15
15
|
slugs:
|
|
16
16
|
- blog
|
|
17
17
|
- next-i18next-vs-next-intl-vs-intlayer
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
# next-i18next
|
|
20
|
+
# next-i18next مقابل next-intl مقابل intlayer | التدويل في Next.js (i18n)
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
تُقارن هذه الدليل بين ثلاث خيارات شائعة للتدويل (i18n) لـ **Next.js**: **next-intl**، **next-i18next**، و **Intlayer**.
|
|
23
|
+
نركز على **موجه التطبيقات في Next.js 13+** (مع **مكونات خادم React**) ونقيّم:
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
1. **البنية والتنظيم المحتوى**
|
|
26
|
+
2. **TypeScript والأمان**
|
|
27
|
+
3. **معالجة الترجمات المفقودة**
|
|
28
|
+
4. **التوجيه والوسيط**
|
|
29
|
+
5. **الأداء وسلوك التحميل**
|
|
30
|
+
6. **تجربة المطور (DX)، الأدوات والصيانة**
|
|
31
|
+
7. **تحسين محركات البحث (SEO) وقابلية التوسع في المشاريع الكبيرة**
|
|
25
32
|
|
|
26
|
-
|
|
27
|
-
2. **دعم TypeScript**
|
|
28
|
-
3. **إدارة الترجمات المفقودة**
|
|
29
|
-
4. **دعم مكونات الخادم**
|
|
30
|
-
5. **توجيه مُحسّن & middleware** لـ Next.js
|
|
31
|
-
6. **بساطة الإعداد**
|
|
32
|
-
|
|
33
|
-
يوفر الدليل أيضًا **نظرة عميقة على Intlayer**، مما يوضح لماذا يمكن أن يكون خيارًا قويًا - خاصة لـ Next.js 13+، بما في ذلك **موجه التطبيقات** و **مكونات الخادم**.
|
|
33
|
+
> **ملخص**: يمكن لجميع الثلاثة تعريب تطبيق Next.js. إذا كنت تريد **محتوى مخصص للمكونات**، **أنواع TypeScript صارمة**، **فحوصات مفاتيح مفقودة أثناء البناء**، **قواميس معزولة بالشجرة (tree-shaken)**، و**موجه تطبيقات من الدرجة الأولى + مساعدي SEO**، فإن **Intlayer** هو الخيار الأكثر اكتمالاً وحداثة.
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
37
|
-
##
|
|
38
|
-
|
|
39
|
-
### 1. next-intl
|
|
37
|
+
## التموقع على مستوى عالٍ
|
|
40
38
|
|
|
41
|
-
|
|
39
|
+
- **next-intl** - تنسيق رسائل خفيف الوزن وبسيط مع دعم قوي لـ Next.js. الكتالوجات المركزية شائعة؛ تجربة المطور بسيطة، لكن الأمان والصيانة على نطاق واسع تبقى في الغالب مسؤوليتك.
|
|
40
|
+
- **next-i18next** - i18next في قالب Next.js. نظام بيئي ناضج وميزات عبر الإضافات (مثل ICU)، لكن التكوين قد يكون مطولًا وتميل الكتالوجات إلى المركزية مع نمو المشاريع.
|
|
41
|
+
- **Intlayer** - نموذج محتوى يركز على المكونات لـ Next.js، **أنواع TypeScript صارمة**، **فحوصات أثناء وقت البناء**، **عزل القواميس بالشجرة (tree-shaking)**، **وسائط مدمجة ومساعدي SEO**، محرر/نظام إدارة محتوى بصري اختياري، وترجمات بمساعدة الذكاء الاصطناعي.
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
- **دعم TypeScript**: تكامل أساسي مع TypeScript. توجد بعض تعريفات النوع، لكنها ليست مركزة بكثافة على التوليد التلقائي لتعريفات TypeScript من ملفات الترجمة الخاصة بك.
|
|
45
|
-
- **الترجمات المفقودة**: آلية تراجع أساسية. بشكل افتراضي، تتراجع إلى مفتاح أو سلسلة محلية افتراضية. لا توجد أدوات قوية خارج الصندوق لعمليات فحص الترجمات المفقودة المتقدمة.
|
|
46
|
-
- **دعم مكونات الخادم**: تعمل مع Next.js 13+ بشكل عام، لكن النمط أقل تخصصًا للاستخدام العميق على جانب الخادم (مثل مكونات الخادم مع توجيه ديناميكي معقد).
|
|
47
|
-
- **التوجيه و middleware**: الدعم المتاح محدود. يعتمد عادة على `Middleware` في Next.js لاكتشاف المحلية، أو التكوين اليدوي لإعادة كتابة مسارات المحلية.
|
|
48
|
-
- **بساطة الإعداد**: بسيطة جدًا. الحد الأدنى من الكود المبدئي مطلوب.
|
|
43
|
+
---
|
|
49
44
|
|
|
50
|
-
|
|
45
|
+
## مقارنة الميزات جنبًا إلى جنب (مركز على Next.js)
|
|
46
|
+
|
|
47
|
+
| الميزة | `next-intlayer` (Intlayer) | `next-intl` | `next-i18next` |
|
|
48
|
+
| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
|
|
49
|
+
| **الترجمات بالقرب من المكونات** | ✅ نعم، المحتوى موضوع بجانب كل مكون | ❌ لا | ❌ لا |
|
|
50
|
+
| **تكامل TypeScript** | ✅ متقدم، أنواع صارمة مولدة تلقائيًا | ✅ جيد | ⚠️ أساسي |
|
|
51
|
+
| **كشف الترجمات المفقودة** | ✅ تمييز أخطاء TypeScript وتحذير/خطأ أثناء وقت البناء | ⚠️ استرجاع وقت التشغيل | ⚠️ استرجاع وقت التشغيل |
|
|
52
|
+
| **المحتوى الغني (JSX/Markdown/المكونات)** | ✅ دعم مباشر | ❌ غير مصمم للعقد الغنية | ⚠️ محدود |
|
|
53
|
+
| **الترجمة المدعومة بالذكاء الاصطناعي** | ✅ نعم، يدعم عدة مزودي ذكاء اصطناعي. يمكن استخدامه باستخدام مفاتيح API الخاصة بك. يأخذ في الاعتبار سياق تطبيقك ونطاق المحتوى | ❌ لا | ❌ لا |
|
|
54
|
+
| **المحرر المرئي** | ✅ نعم، محرر مرئي محلي + نظام إدارة محتوى اختياري؛ يمكنه إخراج محتوى قاعدة الشيفرة؛ قابل للتضمين | ❌ لا / متوفر عبر منصات التوطين الخارجية | ❌ لا / متوفر عبر منصات التوطين الخارجية |
|
|
55
|
+
| **التوجيه المحلي** | ✅ نعم، يدعم المسارات المحلية مباشرة (يعمل مع Next.js و Vite) | ✅ مدمج، يدعم App Router جزء `[locale]` | ✅ مدمج |
|
|
56
|
+
| **توليد المسارات الديناميكية** | ✅ نعم | ✅ نعم | ✅ نعم |
|
|
57
|
+
| **التصريف الجمعي** | ✅ أنماط قائمة على التعداد | ✅ جيد | ✅ جيد |
|
|
58
|
+
| **التنسيق (التواريخ، الأرقام، العملات)** | ✅ منسقات محسّنة (Intl في الخلفية) | ✅ جيد (مساعدات Intl) | ✅ جيد (مساعدات Intl) |
|
|
59
|
+
| **تنسيق المحتوى** | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml قيد العمل) | ✅ .json, .js, .ts | ⚠️ .json |
|
|
60
|
+
| **دعم ICU** | ⚠️ قيد العمل | ✅ نعم | ⚠️ عبر الإضافة (`i18next-icu`) |
|
|
61
|
+
| **مساعدو تحسين محركات البحث (hreflang، خريطة الموقع)** | ✅ أدوات مدمجة: مساعدات لخريطة الموقع، robots.txt، البيانات الوصفية | ✅ جيد | ✅ جيد |
|
|
62
|
+
| **النظام البيئي / المجتمع** | ⚠️ أصغر حجماً لكنه ينمو بسرعة ويتسم بالتفاعل | ✅ متوسط الحجم، يركز على Next.js | ✅ متوسط الحجم، يركز على Next.js |
|
|
63
|
+
| **التصيير على جانب الخادم ومكونات الخادم** | ✅ نعم، مُبسّط للتصيير على جانب الخادم / مكونات React Server | ⚠️ مدعوم على مستوى الصفحة ولكن يحتاج إلى تمرير دوال t على شجرة المكونات لمكونات الخادم الفرعية | ⚠️ مدعوم على مستوى الصفحة ولكن يحتاج إلى تمرير دوال t على شجرة المكونات لمكونات الخادم الفرعية |
|
|
64
|
+
| **Tree-shaking (تحميل المحتوى المستخدم فقط)** | ✅ نعم، لكل مكون أثناء وقت البناء عبر إضافات Babel/SWC | ⚠️ جزئي | ⚠️ جزئي |
|
|
65
|
+
| **التحميل الكسول** | ✅ نعم، لكل لغة / لكل قاموس | ✅ نعم (لكل مسار/لكل لغة)، يحتاج إلى إدارة مساحة الأسماء | ✅ نعم (لكل مسار/لكل لغة)، يحتاج إلى إدارة مساحة الأسماء |
|
|
66
|
+
| **تنظيف المحتوى غير المستخدم** | ✅ نعم، لكل قاموس أثناء وقت البناء | ❌ لا، يمكن إدارته يدويًا باستخدام إدارة مساحة الأسماء | ❌ لا، يمكن إدارته يدويًا باستخدام إدارة مساحة الأسماء |
|
|
67
|
+
| **إدارة المشاريع الكبيرة** | ✅ يشجع على التكوين المعياري، مناسب لأنظمة التصميم | ✅ معياري مع الإعداد | ✅ معياري مع الإعداد |
|
|
51
68
|
|
|
52
69
|
---
|
|
53
70
|
|
|
54
|
-
|
|
71
|
+
## مقارنة متعمقة
|
|
55
72
|
|
|
56
|
-
|
|
73
|
+
### 1) البنية القابلة للتوسع
|
|
57
74
|
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
- **الترجمات المفقودة**: يقدم i18next التداخل/التراجعات. ومع ذلك، فإن اكتشاف الترجمة المفقودة عادةً ما يحتاج إلى إعداد إضافي أو مكونات إضافية.
|
|
61
|
-
- **دعم مكونات الخادم**: تم توثيق الاستخدام الأساسي مع Next.js 13، ولكن قد يكون الاستخدام المتقدم (مثل التكامل العميق بمكونات الخادم، وإنشاء المسارات الديناميكية) مرهقًا.
|
|
62
|
-
- **التوجيه و middleware**: يعتمد بقوة على `Middleware` في Next.js وإعادة الكتابة لمسارات المحلية. قد تحتاج إلى الغوص في تكوين i18next المتقدم للإعدادات الأكثر تعقيدًا.
|
|
63
|
-
- **بساطة الإعداد**: نهج مألوف لأولئك المألوفين مع i18next. ومع ذلك، يمكن أن تصبح أكثر تعقيدًا عندما تكون الميزات المتقدمة مطلوبة (مثل الفضاءات، وموارد محلية افتراضية متعددة، إلخ).
|
|
75
|
+
- **next-intl / next-i18next**: الافتراضي هو **كتالوجات مركزية** لكل لغة (بالإضافة إلى **مساحات الأسماء** في i18next). يعمل بشكل جيد في البداية، لكنه غالبًا ما يصبح مساحة مشتركة كبيرة مع زيادة الترابط وتغير المفاتيح بشكل متكرر.
|
|
76
|
+
- **Intlayer**: يشجع على وجود **قواميس لكل مكون** (أو لكل ميزة) **متمركزة** مع الكود الذي تخدمه. هذا يقلل العبء الذهني، ويسهل تكرار/ترحيل أجزاء واجهة المستخدم، ويقلل من النزاعات بين الفرق المختلفة. المحتوى غير المستخدم يكون من السهل اكتشافه وحذفه بشكل طبيعي.
|
|
64
77
|
|
|
65
|
-
|
|
78
|
+
**لماذا هذا مهم:** في قواعد الشيفرة الكبيرة أو إعدادات أنظمة التصميم، **المحتوى المعياري** يتوسع بشكل أفضل من الكتالوجات الأحادية.
|
|
66
79
|
|
|
67
80
|
---
|
|
68
81
|
|
|
69
|
-
###
|
|
70
|
-
|
|
71
|
-
**التركيز الرئيسي**: مكتبة توطين حديثة ومفتوحة المصدر مصممة خصيصًا لـ Next.js **موجه التطبيقات** (12، 13، 14، و 15) مع دعم مدمج لـ **مكونات الخادم** و **Turbopack**.
|
|
82
|
+
### 2) TypeScript والأمان
|
|
72
83
|
|
|
73
|
-
|
|
84
|
+
- **next-intl**: دعم قوي لـ TypeScript، لكن **المفاتيح ليست مُعرفة بصرامة بشكل افتراضي**؛ ستحتاج للحفاظ على أنماط الأمان يدويًا.
|
|
85
|
+
- **next-i18next**: تعريفات أساسية للخطافات؛ **التعريف الصارم للمفاتيح يتطلب أدوات/إعدادات إضافية**.
|
|
86
|
+
- **Intlayer**: **ينشئ أنواعًا صارمة** من محتواك. **الإكمال التلقائي في بيئة التطوير** و**أخطاء وقت الترجمة** تكتشف الأخطاء المطبعية والمفاتيح المفقودة قبل النشر.
|
|
74
87
|
|
|
75
|
-
|
|
88
|
+
**لماذا هذا مهم:** التعريف الصارم يحول الفشل إلى الجانب **الأيسر** (CI/البناء) بدلاً من الجانب **الأيمن** (وقت التشغيل).
|
|
76
89
|
|
|
77
|
-
|
|
78
|
-
- يجعل ذلك الشيفرة الخاصة بك أكثر **وحدوية وقابلة للصيانة**، خاصة في قواعد الشيفرة الكبيرة.
|
|
79
|
-
|
|
80
|
-
2. **دعم TypeScript**
|
|
81
|
-
|
|
82
|
-
- **تعريفات نوع تم إنشاؤها تلقائيًا**: في اللحظة التي تعرف فيها محتواك، يقوم Intlayer بإنشاء أنواع تدعم الإكمال التلقائي والتقاط أخطاء الترجمة.
|
|
83
|
-
- يقلل من الأخطاء أثناء التشغيل مثل المفاتيح المفقودة ويقدم **الإكمال التلقائي المتقدم** مباشرة في IDE الخاص بك.
|
|
84
|
-
|
|
85
|
-
3. **إدارة الترجمات المفقودة**
|
|
90
|
+
---
|
|
86
91
|
|
|
87
|
-
|
|
88
|
-
- يضمن ذلك أنك لن تشحن أبدًا نصًا مفقودًا عبر لغاتك.
|
|
92
|
+
### 3) التعامل مع الترجمات المفقودة
|
|
89
93
|
|
|
90
|
-
|
|
94
|
+
- **next-intl / next-i18next**: تعتمد على **الاستعادات في وقت التشغيل** (مثل عرض المفتاح أو اللغة الافتراضية). البناء لا يفشل.
|
|
95
|
+
- **Intlayer**: **الكشف أثناء البناء** مع **تحذيرات/أخطاء** للمواقع أو المفاتيح المفقودة.
|
|
91
96
|
|
|
92
|
-
|
|
93
|
-
- يقدم موفري خدمات متخصصين (`IntlayerServerProvider`، `IntlayerClientProvider`) لـ **عزل سياق الخادم** (مهم عند التعامل مع Next.js 13+).
|
|
97
|
+
**لماذا هذا مهم:** اكتشاف الفجوات أثناء البناء يمنع ظهور "سلاسل غامضة" في الإنتاج ويتماشى مع بوابات الإصدار الصارمة.
|
|
94
98
|
|
|
95
|
-
|
|
99
|
+
---
|
|
96
100
|
|
|
97
|
-
|
|
98
|
-
- يتعامل ديناميكيًا مع المسارات المحلية (مثل `/en-US/about` مقابل `/fr/about`) مع تكوين بسيط.
|
|
99
|
-
- يقدم طرق مساعدة مثل `getMultilingualUrls` لتوليد روابط لغات بديلة (رائع لـ **SEO**).
|
|
101
|
+
### 4) التوجيه، الوسيط واستراتيجية عناوين URL
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
- مكون إضافي Wrapper `withIntlayer(nextConfig)` الذي **يحقن** جميع متغيرات البيئة والمراقبين لمحتواك.
|
|
104
|
-
- **لا تكوينات تراجع كبيرة** - يتم تصميم النظام ليعمل "فقط" مع الحد الأدنى من الاحتكاك.
|
|
103
|
+
- الثلاثة يعملون مع **التوجيه المحلي في Next.js** على App Router.
|
|
104
|
+
- **Intlayer** يذهب أبعد من ذلك مع **الوسيط الدولي (i18n middleware)** (كشف اللغة عبر الرؤوس/الكوكيز) و**المساعدين** لتوليد عناوين URL محلية ووسوم `<link rel="alternate" hreflang="…">`.
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
**لماذا هذا مهم:** تقليل طبقات الربط المخصصة؛ **تجربة مستخدم متسقة** و**تحسين محركات البحث نظيف** عبر اللغات.
|
|
107
107
|
|
|
108
108
|
---
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
| **الميزة** | **next-intl** | **next-i18next** | **Intlayer** |
|
|
113
|
-
| ------------------------------------------ | --------------------------------- | ----------------------------------------------- | --------------------------------------- |
|
|
114
|
-
| **الحفاظ على الترجمات بالقرب من المكونات** | جزئي - عادةً مجلد محلي واحد | ليس افتراضيًا - غالبًا ما يكون `public/locales` | **نعم - موصى به وسهل** |
|
|
115
|
-
| **توليد TypeScript تلقائي** | تعريفات TypeScript أساسية | دعم TypeScript أساسي | **نعم - متقدم خارج الصندوق** |
|
|
116
|
-
| **اكتشاف الترجمات المفقودة** | في الغالب سلاسل تراجع | في الغالب سلاسل تراجع | **نعم - فحوصات في وقت البناء** |
|
|
117
|
-
| **دعم مكونات الخادم** | تعمل لكن ليست متخصصة | مدعومة لكنها قد تكون مرهقة | **دعم كامل مع موفري خدمات متخصصين** |
|
|
118
|
-
| **التوجيه & middleware** | مدمج يدويًا مع middleware في Next | موفر عبر إعادة كتابة التكوين | **middleware i18n مخصص + روابط متقدمة** |
|
|
119
|
-
| **تعقيد الإعداد** | بسيطة، تكوينات الحد الأدنى | تقليدية، يمكن أن تكون مرهقة للاستخدام المتقدم | **ملف إعداد واحد وملحق** |
|
|
120
|
-
|
|
121
|
-
---
|
|
110
|
+
### 5) توافق مكونات الخادم (RSC)
|
|
122
111
|
|
|
123
|
-
|
|
112
|
+
- **الجميع** يدعم Next.js 13+.
|
|
113
|
+
- **Intlayer** يسهل **الحد الفاصل بين الخادم والعميل** بواجهة برمجة تطبيقات موحدة ومزودين مصممين لـ RSC، بحيث لا تحتاج إلى تمرير منسقات أو دوال الترجمة عبر شجرة المكونات.
|
|
124
114
|
|
|
125
|
-
|
|
115
|
+
**لماذا هذا مهم:** نموذج ذهني أنظف وحالات حافة أقل في الأشجار المختلطة.
|
|
126
116
|
|
|
127
|
-
|
|
117
|
+
---
|
|
128
118
|
|
|
129
|
-
|
|
119
|
+
### 6) الأداء وسلوك التحميل
|
|
130
120
|
|
|
131
|
-
|
|
121
|
+
- **next-intl / next-i18next**: تحكم جزئي عبر **مساحات الأسماء** و**تقسيمات على مستوى المسار**؛ خطر تجميع سلاسل غير مستخدمة إذا تم التراخي في الانضباط.
|
|
122
|
+
- **Intlayer**: يقوم بـ **تحليل الشجرة** أثناء البناء و**تحميل كسول لكل قاموس/لغة**. المحتوى غير المستخدم لا يتم شحنه.
|
|
132
123
|
|
|
133
|
-
|
|
124
|
+
**لماذا هذا مهم:** حزم أصغر وتشغيل أسرع، خاصة على المواقع متعددة اللغات.
|
|
134
125
|
|
|
135
|
-
|
|
126
|
+
---
|
|
136
127
|
|
|
137
|
-
|
|
128
|
+
### 7) تجربة المطور، الأدوات والصيانة
|
|
138
129
|
|
|
139
|
-
|
|
130
|
+
- **next-intl / next-i18next**: عادةً ما تقوم بربط منصات خارجية للترجمات وسير العمل التحريري.
|
|
131
|
+
- **Intlayer**: يأتي مع **محرر بصري مجاني** و**نظام إدارة محتوى اختياري** (متوافق مع Git أو خارجي). بالإضافة إلى **امتداد VSCode** لتأليف المحتوى و**ترجمات بمساعدة الذكاء الاصطناعي** باستخدام مفاتيح المزود الخاصة بك.
|
|
140
132
|
|
|
141
|
-
|
|
142
|
-
- لا يتطلب `intlayerMiddleware` القياسية إعادة كتابة مخصصة عميقة.
|
|
133
|
+
**لماذا هذا مهم:** يقلل من تكلفة العمليات ويقصر دورة التواصل بين المطورين ومؤلفي المحتوى.
|
|
143
134
|
|
|
144
|
-
|
|
135
|
+
---
|
|
145
136
|
|
|
146
|
-
|
|
147
|
-
- استخدام واضح ومباشر لكل من **مكونات الخادم** و **العميل** عبر `IntlayerServerProvider` و `IntlayerClientProvider`.
|
|
137
|
+
## متى تختار أي منها؟
|
|
148
138
|
|
|
149
|
-
|
|
150
|
-
|
|
139
|
+
- **اختر next-intl** إذا كنت تريد حلاً **بسيطًا**، وتشعر بالراحة مع الكتالوجات المركزية، وكان تطبيقك **صغير إلى متوسط الحجم**.
|
|
140
|
+
- **اختر next-i18next** إذا كنت تحتاج إلى **نظام الإضافات الخاص بـ i18next** (مثل قواعد ICU المتقدمة عبر الإضافات) وكان فريقك يعرف i18next بالفعل، مع قبول **المزيد من التهيئة** من أجل المرونة.
|
|
141
|
+
- **اختر Intlayer** إذا كنت تقدر **المحتوى المخصص للمكونات**، و**TypeScript الصارم**، و**ضمانات وقت البناء**، و**إزالة الشفرات غير المستخدمة (tree-shaking)**، وأدوات التوجيه/SEO/التحرير المدمجة - خاصةً لـ **Next.js App Router** وقواعد الشفرات الكبيرة والمودولية.
|
|
151
142
|
|
|
152
143
|
---
|
|
153
144
|
|
|
154
|
-
##
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
1. **التثبيت والتكوين**
|
|
162
|
-
|
|
163
|
-
```bash
|
|
164
|
-
npm install intlayer next-intlayer
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
```ts
|
|
168
|
-
// intlayer.config.ts
|
|
169
|
-
import { Locales, type IntlayerConfig } from "intlayer";
|
|
170
|
-
|
|
171
|
-
const config: IntlayerConfig = {
|
|
172
|
-
internationalization: {
|
|
173
|
-
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
174
|
-
defaultLocale: Locales.ENGLISH,
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
export default config;
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
2. **استخدم المكون الإضافي**
|
|
181
|
-
|
|
182
|
-
```ts
|
|
183
|
-
// next.config.mjs
|
|
184
|
-
import { withIntlayer } from "next-intlayer/server";
|
|
185
|
-
|
|
186
|
-
/** @type {import('next').NextConfig} */
|
|
187
|
-
const nextConfig = {};
|
|
188
|
-
|
|
189
|
-
export default withIntlayer(nextConfig);
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
3. **أضف Middleware**
|
|
193
|
-
|
|
194
|
-
```ts
|
|
195
|
-
// src/middleware.ts
|
|
196
|
-
export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
|
|
197
|
-
|
|
198
|
-
export const config = {
|
|
199
|
-
matcher:
|
|
200
|
-
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
201
|
-
};
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
4. **إنشاء تخطيط محلي**
|
|
205
|
-
|
|
206
|
-
```tsx
|
|
207
|
-
// src/app/[locale]/layout.tsx
|
|
208
|
-
import { getHTMLTextDir } from "intlayer";
|
|
209
|
-
import { NextLayoutIntlayer } from "next-intlayer";
|
|
210
|
-
|
|
211
|
-
const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
|
|
212
|
-
const { locale } = params;
|
|
213
|
-
return (
|
|
214
|
-
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
215
|
-
<body>{children}</body>
|
|
216
|
-
</html>
|
|
217
|
-
);
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
export { generateStaticParams } from "next-intlayer";
|
|
221
|
-
export default LocaleLayout;
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
5. **إعلان واستخدام المحتوى**
|
|
225
|
-
|
|
226
|
-
```tsx
|
|
227
|
-
// src/app/[locale]/page.content.ts
|
|
228
|
-
import { t } from "intlayer";
|
|
229
|
-
|
|
230
|
-
export default {
|
|
231
|
-
key: "page",
|
|
232
|
-
content: {
|
|
233
|
-
getStarted: {
|
|
234
|
-
main: t({
|
|
235
|
-
en: "Get started by editing",
|
|
236
|
-
fr: "Commencez par éditer",
|
|
237
|
-
es: "Comience por editar",
|
|
238
|
-
}),
|
|
239
|
-
pageLink: "src/app/page.tsx",
|
|
240
|
-
},
|
|
241
|
-
},
|
|
242
|
-
};
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
```tsx
|
|
246
|
-
// src/app/[locale]/page.tsx
|
|
247
|
-
import { IntlayerServerProvider } from "next-intlayer/server";
|
|
248
|
-
import { IntlayerClientProvider, useIntlayer } from "next-intlayer";
|
|
249
|
-
|
|
250
|
-
const PageContent = () => {
|
|
251
|
-
const { content } = useIntlayer("page");
|
|
252
|
-
return (
|
|
253
|
-
<>
|
|
254
|
-
<p>{content.getStarted.main}</p>
|
|
255
|
-
<code>{content.getStarted.pageLink}</code>
|
|
256
|
-
</>
|
|
257
|
-
);
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
export default function Page({ params }) {
|
|
261
|
-
return (
|
|
262
|
-
<IntlayerServerProvider locale={params.locale}>
|
|
263
|
-
<IntlayerClientProvider locale={params.locale}>
|
|
264
|
-
<PageContent />
|
|
265
|
-
</IntlayerClientProvider>
|
|
266
|
-
</IntlayerServerProvider>
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
</details>
|
|
145
|
+
## ملاحظات عملية للترحيل (من next-intl / next-i18next إلى Intlayer)
|
|
146
|
+
|
|
147
|
+
- **ابدأ بالميزات بشكل منفصل**: انقل مسارًا أو مكونًا واحدًا في كل مرة إلى **القواميس المحلية**.
|
|
148
|
+
- **احتفظ بالكتالوجات القديمة بالتوازي**: استخدم جسرًا أثناء الترحيل؛ تجنب التغيير الجذري المفاجئ.
|
|
149
|
+
- **فعّل الفحوصات الصارمة**: دع اكتشاف وقت البناء يكشف الفجوات مبكرًا.
|
|
150
|
+
- **اعتمد الوسائط الوسيطة والمساعدين**: قم بتوحيد اكتشاف اللغة وعلامات SEO على مستوى الموقع.
|
|
151
|
+
- **قِس حجم الحزم**: توقع **تقليل حجم الحزمة** مع حذف المحتوى غير المستخدم.
|
|
272
152
|
|
|
273
153
|
---
|
|
274
154
|
|
|
275
|
-
##
|
|
155
|
+
## الخلاصة
|
|
276
156
|
|
|
277
|
-
|
|
157
|
+
جميع المكتبات الثلاث تنجح في التوطين الأساسي. الفرق هو **كمية العمل التي يجب عليك القيام بها** لتحقيق إعداد قوي وقابل للتوسع في **Next.js الحديث**:
|
|
278
158
|
|
|
279
|
-
-
|
|
280
|
-
-
|
|
281
|
-
- تقديم **توليد TypeScript** قوي للشفرة الأكثر أماناً
|
|
282
|
-
- التعامل مع **الترجمات المفقودة** عند بناء الشيفرة
|
|
283
|
-
- توفير **نهج إعداد مبسط**، مع توجيه و middleware متقدمان
|
|
159
|
+
- مع **Intlayer**، فإن **المحتوى المعياري**، و**TypeScript الصارم**، و**السلامة أثناء وقت البناء**، و**حزم الشجرة المهشمة**، و**موجه التطبيقات من الدرجة الأولى + أدوات SEO** هي **الإعدادات الافتراضية**، وليست مهامًا شاقة.
|
|
160
|
+
- إذا كانت فرقك تقدر **قابلية الصيانة والسرعة** في تطبيق متعدد اللغات يعتمد على المكونات، فإن Intlayer تقدم **التجربة الأكثر اكتمالًا** اليوم.
|
|
284
161
|
|
|
285
|
-
|
|
162
|
+
راجع مستند ['لماذا Intlayer؟'](https://intlayer.org/doc/why) لمزيد من التفاصيل.
|