@intlayer/docs 5.8.1-canary.0 → 6.0.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.
- package/blog/ar/rag_powered_documentation_assistant.md +282 -0
- package/blog/de/rag_powered_documentation_assistant.md +282 -0
- package/blog/en/rag_powered_documentation_assistant.md +289 -0
- package/blog/en-GB/rag_powered_documentation_assistant.md +284 -0
- package/blog/es/rag_powered_documentation_assistant.md +308 -0
- package/blog/fr/rag_powered_documentation_assistant.md +308 -0
- package/blog/hi/rag_powered_documentation_assistant.md +284 -0
- package/blog/it/rag_powered_documentation_assistant.md +284 -0
- package/blog/ja/rag_powered_documentation_assistant.md +284 -0
- package/blog/ko/rag_powered_documentation_assistant.md +283 -0
- package/blog/pt/rag_powered_documentation_assistant.md +284 -0
- package/blog/ru/rag_powered_documentation_assistant.md +284 -0
- package/blog/tr/index.md +69 -0
- package/blog/tr/internationalization_and_SEO.md +273 -0
- package/blog/tr/intlayer_with_i18next.md +162 -0
- package/blog/tr/intlayer_with_next-i18next.md +367 -0
- package/blog/tr/intlayer_with_next-intl.md +392 -0
- package/blog/tr/intlayer_with_react-i18next.md +346 -0
- package/blog/tr/intlayer_with_react-intl.md +345 -0
- package/blog/tr/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/tr/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/tr/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/tr/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/tr/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/tr/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/tr/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/tr/list_i18n_technologies/frameworks/svelte.md +129 -0
- package/blog/tr/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +170 -0
- package/blog/tr/rag_powered_documentation_assistant.md +284 -0
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +162 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +276 -0
- package/blog/tr/what_is_internationalization.md +166 -0
- package/blog/zh/rag_powered_documentation_assistant.md +284 -0
- package/dist/cjs/generated/blog.entry.cjs +212 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +660 -132
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +84 -0
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +6 -0
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +212 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +660 -132
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +84 -0
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +6 -0
- package/dist/esm/generated/legal.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 +5 -2
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/docs/ar/autoFill.md +41 -40
- package/docs/ar/configuration.md +202 -199
- package/docs/ar/dictionary/content_file.md +1059 -0
- package/docs/ar/intlayer_CMS.md +4 -4
- package/docs/ar/intlayer_with_nestjs.md +271 -0
- package/docs/ar/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ar/intlayer_with_react_router_v7.md +533 -0
- package/docs/ar/intlayer_with_tanstack.md +465 -299
- package/docs/ar/intlayer_with_vite+preact.md +7 -7
- package/docs/ar/intlayer_with_vite+react.md +7 -7
- package/docs/ar/intlayer_with_vite+vue.md +9 -9
- package/docs/ar/packages/vite-intlayer/index.md +3 -3
- package/docs/ar/readme.md +261 -0
- package/docs/ar/testing.md +199 -0
- package/docs/de/autoFill.md +42 -19
- package/docs/de/configuration.md +155 -147
- package/docs/de/dictionary/content_file.md +1059 -0
- package/docs/de/intlayer_CMS.md +4 -5
- package/docs/de/intlayer_with_nestjs.md +270 -0
- package/docs/de/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/de/intlayer_with_react_router_v7.md +537 -0
- package/docs/de/intlayer_with_tanstack.md +469 -302
- package/docs/de/intlayer_with_vite+preact.md +7 -7
- package/docs/de/intlayer_with_vite+react.md +7 -7
- package/docs/de/intlayer_with_vite+vue.md +9 -9
- package/docs/de/packages/vite-intlayer/index.md +3 -3
- package/docs/de/readme.md +261 -0
- package/docs/de/testing.md +200 -0
- package/docs/en/CI_CD.md +4 -6
- package/docs/en/autoFill.md +25 -5
- package/docs/en/configuration.md +45 -54
- package/docs/en/dictionary/content_file.md +1054 -0
- package/docs/en/intlayer_CMS.md +8 -7
- package/docs/en/intlayer_cli.md +112 -5
- package/docs/en/intlayer_with_nestjs.md +268 -0
- package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en/intlayer_with_react_router_v7.md +531 -0
- package/docs/en/intlayer_with_tanstack.md +463 -294
- package/docs/en/intlayer_with_vite+preact.md +8 -8
- package/docs/en/intlayer_with_vite+react.md +8 -8
- package/docs/en/intlayer_with_vite+vue.md +8 -8
- package/docs/en/packages/intlayer/getLocalizedUrl.md +102 -25
- package/docs/en/packages/vite-intlayer/index.md +3 -3
- package/docs/en/readme.md +261 -0
- package/docs/en/testing.md +200 -0
- package/docs/en-GB/autoFill.md +29 -6
- package/docs/en-GB/configuration.md +79 -71
- package/docs/en-GB/dictionary/content_file.md +1084 -0
- package/docs/en-GB/intlayer_CMS.md +4 -5
- package/docs/en-GB/intlayer_with_nestjs.md +268 -0
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en-GB/intlayer_with_react_router_v7.md +533 -0
- package/docs/en-GB/intlayer_with_tanstack.md +466 -299
- package/docs/en-GB/intlayer_with_vite+preact.md +7 -7
- package/docs/en-GB/intlayer_with_vite+react.md +7 -7
- package/docs/en-GB/intlayer_with_vite+vue.md +9 -9
- package/docs/en-GB/packages/vite-intlayer/index.md +3 -3
- package/docs/en-GB/readme.md +261 -0
- package/docs/en-GB/testing.md +200 -0
- package/docs/es/autoFill.md +45 -23
- package/docs/es/configuration.md +171 -167
- package/docs/es/dictionary/content_file.md +1088 -0
- package/docs/es/intlayer_CMS.md +4 -5
- package/docs/es/intlayer_with_nestjs.md +268 -0
- package/docs/es/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/es/intlayer_with_react_router_v7.md +533 -0
- package/docs/es/intlayer_with_tanstack.md +469 -280
- package/docs/es/intlayer_with_vite+preact.md +7 -7
- package/docs/es/intlayer_with_vite+react.md +7 -7
- package/docs/es/intlayer_with_vite+vue.md +9 -9
- package/docs/es/packages/vite-intlayer/index.md +3 -3
- package/docs/es/readme.md +261 -0
- package/docs/es/testing.md +200 -0
- package/docs/fr/autoFill.md +47 -24
- package/docs/fr/configuration.md +213 -198
- package/docs/fr/dictionary/content_file.md +1054 -0
- package/docs/fr/intlayer_CMS.md +4 -5
- package/docs/fr/intlayer_with_nestjs.md +268 -0
- package/docs/fr/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/fr/intlayer_with_react_router_v7.md +549 -0
- package/docs/fr/intlayer_with_tanstack.md +465 -279
- package/docs/fr/intlayer_with_vite+preact.md +7 -7
- package/docs/fr/intlayer_with_vite+react.md +7 -7
- package/docs/fr/intlayer_with_vite+vue.md +9 -9
- package/docs/fr/packages/vite-intlayer/index.md +3 -3
- package/docs/fr/readme.md +261 -0
- package/docs/fr/testing.md +200 -0
- package/docs/hi/autoFill.md +47 -25
- package/docs/hi/configuration.md +194 -189
- package/docs/hi/dictionary/content_file.md +1056 -0
- package/docs/hi/intlayer_CMS.md +4 -5
- package/docs/hi/intlayer_with_nestjs.md +269 -0
- package/docs/hi/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/hi/intlayer_with_react_router_v7.md +533 -0
- package/docs/hi/intlayer_with_tanstack.md +467 -282
- package/docs/hi/intlayer_with_vite+preact.md +7 -7
- package/docs/hi/intlayer_with_vite+react.md +7 -7
- package/docs/hi/intlayer_with_vite+vue.md +9 -9
- package/docs/hi/packages/vite-intlayer/index.md +3 -3
- package/docs/hi/readme.md +261 -0
- package/docs/hi/testing.md +200 -0
- package/docs/it/autoFill.md +46 -24
- package/docs/it/configuration.md +169 -161
- package/docs/it/dictionary/content_file.md +1061 -0
- package/docs/it/intlayer_CMS.md +4 -5
- package/docs/it/intlayer_with_nestjs.md +268 -0
- package/docs/it/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/it/intlayer_with_react_router_v7.md +535 -0
- package/docs/it/intlayer_with_tanstack.md +467 -301
- package/docs/it/intlayer_with_vite+preact.md +7 -7
- package/docs/it/intlayer_with_vite+react.md +7 -7
- package/docs/it/intlayer_with_vite+vue.md +9 -9
- package/docs/it/packages/vite-intlayer/index.md +3 -3
- package/docs/it/readme.md +261 -0
- package/docs/it/testing.md +200 -0
- package/docs/ja/autoFill.md +45 -23
- package/docs/ja/configuration.md +243 -204
- package/docs/ja/dictionary/content_file.md +1064 -0
- package/docs/ja/intlayer_CMS.md +4 -5
- package/docs/ja/intlayer_with_nestjs.md +268 -0
- package/docs/ja/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ja/intlayer_with_react_router_v7.md +534 -0
- package/docs/ja/intlayer_with_tanstack.md +467 -303
- package/docs/ja/intlayer_with_vite+preact.md +7 -7
- package/docs/ja/intlayer_with_vite+react.md +7 -7
- package/docs/ja/intlayer_with_vite+vue.md +9 -9
- package/docs/ja/packages/vite-intlayer/index.md +3 -3
- package/docs/ja/readme.md +263 -0
- package/docs/ja/testing.md +200 -0
- package/docs/ko/autoFill.md +39 -16
- package/docs/ko/configuration.md +217 -197
- package/docs/ko/dictionary/content_file.md +1060 -0
- package/docs/ko/intlayer_CMS.md +4 -5
- package/docs/ko/intlayer_with_nestjs.md +268 -0
- package/docs/ko/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ko/intlayer_with_react_router_v7.md +540 -0
- package/docs/ko/intlayer_with_tanstack.md +466 -302
- package/docs/ko/intlayer_with_vite+preact.md +7 -7
- package/docs/ko/intlayer_with_vite+react.md +7 -7
- package/docs/ko/intlayer_with_vite+vue.md +9 -9
- package/docs/ko/packages/vite-intlayer/index.md +3 -3
- package/docs/ko/readme.md +261 -0
- package/docs/ko/testing.md +200 -0
- package/docs/pt/autoFill.md +39 -15
- package/docs/pt/configuration.md +165 -147
- package/docs/pt/dictionary/content_file.md +1062 -0
- package/docs/pt/intlayer_CMS.md +4 -5
- package/docs/pt/intlayer_with_nestjs.md +271 -0
- package/docs/pt/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/pt/intlayer_with_react_router_v7.md +535 -0
- package/docs/pt/intlayer_with_tanstack.md +469 -300
- package/docs/pt/intlayer_with_vite+preact.md +7 -7
- package/docs/pt/intlayer_with_vite+react.md +7 -7
- package/docs/pt/intlayer_with_vite+vue.md +9 -9
- package/docs/pt/packages/vite-intlayer/index.md +3 -3
- package/docs/pt/readme.md +261 -0
- package/docs/pt/testing.md +200 -0
- package/docs/ru/autoFill.md +52 -30
- package/docs/ru/configuration.md +164 -117
- package/docs/ru/dictionary/content_file.md +1064 -0
- package/docs/ru/intlayer_CMS.md +4 -4
- package/docs/ru/intlayer_with_nestjs.md +270 -0
- package/docs/ru/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ru/intlayer_with_react_router_v7.md +534 -0
- package/docs/ru/intlayer_with_tanstack.md +470 -305
- package/docs/ru/intlayer_with_vite+preact.md +7 -7
- package/docs/ru/intlayer_with_vite+react.md +7 -7
- package/docs/ru/intlayer_with_vite+vue.md +9 -9
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/readme.md +261 -0
- package/docs/ru/testing.md +202 -0
- package/docs/tr/CI_CD.md +198 -0
- package/docs/tr/autoFill.md +201 -0
- package/docs/tr/configuration.md +585 -0
- package/docs/tr/dictionary/condition.md +243 -0
- package/docs/tr/dictionary/content_file.md +1055 -0
- package/docs/tr/dictionary/enumeration.md +251 -0
- package/docs/tr/dictionary/file.md +228 -0
- package/docs/tr/dictionary/function_fetching.md +218 -0
- package/docs/tr/dictionary/gender.md +279 -0
- package/docs/tr/dictionary/insertion.md +191 -0
- package/docs/tr/dictionary/markdown.md +385 -0
- package/docs/tr/dictionary/nesting.md +279 -0
- package/docs/tr/dictionary/translation.md +315 -0
- package/docs/tr/formatters.md +618 -0
- package/docs/tr/how_works_intlayer.md +254 -0
- package/docs/tr/index.md +168 -0
- package/docs/tr/interest_of_intlayer.md +288 -0
- package/docs/tr/intlayer_CMS.md +347 -0
- package/docs/tr/intlayer_cli.md +570 -0
- package/docs/tr/intlayer_visual_editor.md +269 -0
- package/docs/tr/intlayer_with_angular.md +694 -0
- package/docs/tr/intlayer_with_create_react_app.md +1218 -0
- package/docs/tr/intlayer_with_express.md +415 -0
- package/docs/tr/intlayer_with_lynx+react.md +511 -0
- package/docs/tr/intlayer_with_nestjs.md +268 -0
- package/docs/tr/intlayer_with_nextjs_14.md +1029 -0
- package/docs/tr/intlayer_with_nextjs_15.md +1506 -0
- package/docs/tr/intlayer_with_nextjs_page_router.md +1484 -0
- package/docs/tr/intlayer_with_nuxt.md +773 -0
- package/docs/tr/intlayer_with_react_native+expo.md +660 -0
- package/docs/tr/intlayer_with_react_router_v7.md +531 -0
- package/docs/tr/intlayer_with_tanstack.md +452 -0
- package/docs/tr/intlayer_with_vite+preact.md +1673 -0
- package/docs/tr/intlayer_with_vite+react.md +1632 -0
- package/docs/tr/intlayer_with_vite+solid.md +288 -0
- package/docs/tr/intlayer_with_vite+svelte.md +288 -0
- package/docs/tr/intlayer_with_vite+vue.md +1042 -0
- package/docs/tr/introduction.md +209 -0
- package/docs/tr/locale_mapper.md +244 -0
- package/docs/tr/mcp_server.md +207 -0
- package/docs/tr/packages/@intlayer/api/index.md +58 -0
- package/docs/tr/packages/@intlayer/chokidar/index.md +57 -0
- package/docs/tr/packages/@intlayer/cli/index.md +47 -0
- package/docs/tr/packages/@intlayer/config/index.md +142 -0
- package/docs/tr/packages/@intlayer/core/index.md +51 -0
- package/docs/tr/packages/@intlayer/design-system/index.md +47 -0
- package/docs/tr/packages/@intlayer/dictionary-entry/index.md +53 -0
- package/docs/tr/packages/@intlayer/editor/index.md +47 -0
- package/docs/tr/packages/@intlayer/editor-react/index.md +47 -0
- package/docs/tr/packages/@intlayer/webpack/index.md +61 -0
- package/docs/tr/packages/angular-intlayer/index.md +59 -0
- package/docs/tr/packages/express-intlayer/index.md +258 -0
- package/docs/tr/packages/express-intlayer/t.md +459 -0
- package/docs/tr/packages/intlayer/getConfiguration.md +151 -0
- package/docs/tr/packages/intlayer/getEnumeration.md +165 -0
- package/docs/tr/packages/intlayer/getHTMLTextDir.md +127 -0
- package/docs/tr/packages/intlayer/getLocaleLang.md +87 -0
- package/docs/tr/packages/intlayer/getLocaleName.md +124 -0
- package/docs/tr/packages/intlayer/getLocalizedUrl.md +324 -0
- package/docs/tr/packages/intlayer/getMultilingualUrls.md +225 -0
- package/docs/tr/packages/intlayer/getPathWithoutLocale.md +81 -0
- package/docs/tr/packages/intlayer/getTranslation.md +196 -0
- package/docs/tr/packages/intlayer/getTranslationContent.md +195 -0
- package/docs/tr/packages/intlayer/index.md +505 -0
- package/docs/tr/packages/intlayer-cli/index.md +71 -0
- package/docs/tr/packages/intlayer-editor/index.md +139 -0
- package/docs/tr/packages/lynx-intlayer/index.md +85 -0
- package/docs/tr/packages/next-intlayer/index.md +154 -0
- package/docs/tr/packages/next-intlayer/t.md +354 -0
- package/docs/tr/packages/next-intlayer/useDictionary.md +270 -0
- package/docs/tr/packages/next-intlayer/useIntlayer.md +265 -0
- package/docs/tr/packages/next-intlayer/useLocale.md +133 -0
- package/docs/tr/packages/nuxt-intlayer/index.md +59 -0
- package/docs/tr/packages/preact-intlayer/index.md +55 -0
- package/docs/tr/packages/react-intlayer/index.md +148 -0
- package/docs/tr/packages/react-intlayer/t.md +304 -0
- package/docs/tr/packages/react-intlayer/useDictionary.md +554 -0
- package/docs/tr/packages/react-intlayer/useI18n.md +478 -0
- package/docs/tr/packages/react-intlayer/useIntlayer.md +253 -0
- package/docs/tr/packages/react-intlayer/useLocale.md +212 -0
- package/docs/tr/packages/react-native-intlayer/index.md +85 -0
- package/docs/tr/packages/react-scripts-intlayer/index.md +82 -0
- package/docs/tr/packages/solid-intlayer/index.md +56 -0
- package/docs/tr/packages/svelte-intlayer/index.md +55 -0
- package/docs/tr/packages/vite-intlayer/index.md +82 -0
- package/docs/tr/packages/vue-intlayer/index.md +59 -0
- package/docs/tr/per_locale_file.md +321 -0
- package/docs/tr/readme.md +261 -0
- package/docs/tr/roadmap.md +338 -0
- package/docs/tr/testing.md +200 -0
- package/docs/tr/vs_code_extension.md +154 -0
- package/docs/zh/autoFill.md +40 -18
- package/docs/zh/configuration.md +245 -226
- package/docs/zh/dictionary/content_file.md +1064 -0
- package/docs/zh/intlayer_CMS.md +4 -5
- package/docs/zh/intlayer_with_nestjs.md +268 -0
- package/docs/zh/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +535 -0
- package/docs/zh/intlayer_with_tanstack.md +468 -278
- package/docs/zh/intlayer_with_vite+preact.md +7 -7
- package/docs/zh/intlayer_with_vite+react.md +7 -7
- package/docs/zh/intlayer_with_vite+vue.md +7 -7
- package/docs/zh/packages/vite-intlayer/index.md +3 -3
- package/docs/zh/readme.md +261 -0
- package/docs/zh/testing.md +198 -0
- package/frequent_questions/tr/SSR_Next_no_[locale].md +105 -0
- package/frequent_questions/tr/array_as_content_declaration.md +72 -0
- package/frequent_questions/tr/build_dictionaries.md +59 -0
- package/frequent_questions/tr/build_error_CI_CD.md +75 -0
- package/frequent_questions/tr/customized_locale_list.md +65 -0
- package/frequent_questions/tr/domain_routing.md +114 -0
- package/frequent_questions/tr/esbuild_error.md +30 -0
- package/frequent_questions/tr/get_locale_cookie.md +142 -0
- package/frequent_questions/tr/intlayer_command_undefined.md +156 -0
- package/frequent_questions/tr/locale_incorect_in_url.md +74 -0
- package/frequent_questions/tr/static_rendering.md +45 -0
- package/frequent_questions/tr/translated_path_url.md +56 -0
- package/frequent_questions/tr/unknown_command.md +98 -0
- package/legal/tr/privacy_notice.md +83 -0
- package/legal/tr/terms_of_service.md +55 -0
- package/package.json +13 -13
- package/src/generated/blog.entry.ts +212 -0
- package/src/generated/docs.entry.ts +663 -135
- package/src/generated/frequentQuestions.entry.ts +85 -1
- package/src/generated/legal.entry.ts +7 -1
- package/docs/ar/dictionary/content_extention_customization.md +0 -100
- package/docs/ar/dictionary/get_started.md +0 -527
- package/docs/de/dictionary/content_extention_customization.md +0 -100
- package/docs/de/dictionary/get_started.md +0 -531
- package/docs/en/dictionary/content_extention_customization.md +0 -102
- package/docs/en/dictionary/get_started.md +0 -529
- package/docs/en-GB/dictionary/content_extention_customization.md +0 -100
- package/docs/en-GB/dictionary/get_started.md +0 -591
- package/docs/es/dictionary/content_extention_customization.md +0 -100
- package/docs/es/dictionary/get_started.md +0 -527
- package/docs/fr/dictionary/content_extention_customization.md +0 -100
- package/docs/fr/dictionary/get_started.md +0 -527
- package/docs/hi/dictionary/content_extention_customization.md +0 -100
- package/docs/hi/dictionary/get_started.md +0 -527
- package/docs/it/dictionary/content_extention_customization.md +0 -113
- package/docs/it/dictionary/get_started.md +0 -573
- package/docs/ja/dictionary/content_extention_customization.md +0 -113
- package/docs/ja/dictionary/get_started.md +0 -576
- package/docs/ko/dictionary/content_extention_customization.md +0 -100
- package/docs/ko/dictionary/get_started.md +0 -530
- package/docs/pt/dictionary/content_extention_customization.md +0 -100
- package/docs/pt/dictionary/get_started.md +0 -532
- package/docs/ru/dictionary/content_extention_customization.md +0 -100
- package/docs/ru/dictionary/get_started.md +0 -575
- package/docs/zh/dictionary/content_extention_customization.md +0 -117
- package/docs/zh/dictionary/get_started.md +0 -533
|
@@ -1,369 +1,437 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt: 2025-
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title: البدء مع Intlayer في
|
|
5
|
-
description:
|
|
2
|
+
createdAt: 2025-09-09
|
|
3
|
+
updatedAt: 2025-09-09
|
|
4
|
+
title: البدء مع Intlayer في Tanstack Start
|
|
5
|
+
description: تعلّم كيفية إضافة التدويل (i18n) إلى تطبيق Tanstack Start الخاص بك باستخدام Intlayer. اتبع هذا الدليل الشامل لجعل تطبيقك متعدد اللغات مع توجيه واعٍ للغة.
|
|
6
6
|
keywords:
|
|
7
7
|
- التدويل
|
|
8
8
|
- التوثيق
|
|
9
9
|
- Intlayer
|
|
10
|
-
-
|
|
11
|
-
- TanStack Router
|
|
10
|
+
- Tanstack Start
|
|
12
11
|
- React
|
|
13
12
|
- i18n
|
|
14
|
-
-
|
|
13
|
+
- TypeScript
|
|
14
|
+
- توجيه اللغة
|
|
15
15
|
slugs:
|
|
16
16
|
- doc
|
|
17
17
|
- environment
|
|
18
|
+
- vite-and-react
|
|
18
19
|
- tanstack-start
|
|
20
|
+
applicationTemplate: https://github.com/AydinTheFirst/tanstack-start-intlayer
|
|
21
|
+
author: AydinTheFirst
|
|
19
22
|
---
|
|
20
23
|
|
|
21
|
-
# البدء
|
|
24
|
+
# البدء في التدويل (i18n) باستخدام Intlayer و Tanstack Start
|
|
25
|
+
|
|
26
|
+
يوضح هذا الدليل كيفية دمج **Intlayer** لتحقيق تدويل سلس في مشاريع Tanstack Start مع توجيه واعٍ للغة، ودعم TypeScript، وممارسات تطوير حديثة.
|
|
22
27
|
|
|
23
28
|
## ما هو Intlayer؟
|
|
24
29
|
|
|
25
|
-
**Intlayer** هو
|
|
30
|
+
**Intlayer** هو مكتبة تدويل (i18n) مبتكرة ومفتوحة المصدر مصممة لتبسيط دعم اللغات المتعددة في تطبيقات الويب الحديثة.
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
- **بيانات وصفية ومسارات ديناميكية** (جاهزة لتحسين محركات البحث).
|
|
29
|
-
- **تبديل اللغة أثناء التشغيل** (ومساعدات لاكتشاف/حفظ اللغة).
|
|
30
|
-
- **مكون إضافي لـ Vite** لتحويلات وقت البناء + تجربة تطوير محسنة.
|
|
32
|
+
مع Intlayer، يمكنك:
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
- **إدارة الترجمات بسهولة** باستخدام قواميس إعلانية على مستوى المكونات.
|
|
35
|
+
- **توطين البيانات الوصفية، والمسارات، والمحتوى بشكل ديناميكي**.
|
|
36
|
+
- **ضمان دعم TypeScript** من خلال أنواع مولدة تلقائيًا، مما يحسن الإكمال التلقائي واكتشاف الأخطاء.
|
|
37
|
+
- **الاستفادة من الميزات المتقدمة**، مثل الكشف الديناميكي عن اللغة والتبديل بينها.
|
|
38
|
+
- **تمكين التوجيه الواعي للغة** باستخدام نظام التوجيه المعتمد على الملفات في Tanstack Start.
|
|
33
39
|
|
|
34
40
|
---
|
|
35
41
|
|
|
36
|
-
##
|
|
42
|
+
## دليل خطوة بخطوة لإعداد Intlayer في تطبيق Tanstack Start
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
# npm
|
|
40
|
-
npm i intlayer react-intlayer
|
|
41
|
-
npm i -D vite-intlayer
|
|
44
|
+
### الخطوة 1: إنشاء المشروع
|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
ابدأ بإنشاء مشروع TanStack Start جديد باتباع دليل [بدء مشروع جديد](https://tanstack.com/start/latest/docs/framework/react/quick-start) على موقع TanStack Start.
|
|
47
|
+
|
|
48
|
+
### الخطوة 2: تثبيت حزم Intlayer
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
قم بتثبيت الحزم اللازمة باستخدام مدير الحزم المفضل لديك:
|
|
51
|
+
|
|
52
|
+
```bash packageManager="npm"
|
|
53
|
+
npm install intlayer react-intlayer
|
|
54
|
+
npm install vite-intlayer --save-dev
|
|
50
55
|
```
|
|
51
56
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
```bash packageManager="pnpm"
|
|
58
|
+
pnpm add intlayer react-intlayer
|
|
59
|
+
pnpm add vite-intlayer --save-dev
|
|
60
|
+
```
|
|
55
61
|
|
|
56
|
-
|
|
62
|
+
- **intlayer**
|
|
63
|
+
|
|
64
|
+
الحزمة الأساسية التي توفر أدوات التدويل لإدارة التكوين، والترجمة، و[إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/get_started.md)، والتحويل البرمجي، و[أوامر CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_cli.md).
|
|
65
|
+
|
|
66
|
+
- **react-intlayer**
|
|
67
|
+
الحزمة التي تدمج Intlayer مع تطبيق React. توفر موفري السياق (context providers) وخطافات (hooks) لتدويل React.
|
|
57
68
|
|
|
58
|
-
|
|
69
|
+
- **vite-intlayer**
|
|
70
|
+
تتضمن إضافة Vite لدمج Intlayer مع [مجمّع Vite](https://vite.dev/guide/why.html#why-bundle-for-production)، بالإضافة إلى وسيط (middleware) لاكتشاف اللغة المفضلة للمستخدم، وإدارة ملفات تعريف الارتباط (cookies)، والتعامل مع إعادة توجيه URL.
|
|
59
71
|
|
|
60
|
-
|
|
72
|
+
### الخطوة 3: تكوين مشروعك
|
|
61
73
|
|
|
62
|
-
|
|
63
|
-
|
|
74
|
+
قم بإنشاء ملف تكوين لتكوين لغات تطبيقك:
|
|
75
|
+
|
|
76
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
77
|
+
import type { IntlayerConfig } from "intlayer";
|
|
78
|
+
|
|
79
|
+
import { Locales } from "intlayer";
|
|
64
80
|
|
|
65
81
|
const config: IntlayerConfig = {
|
|
66
82
|
internationalization: {
|
|
67
|
-
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
68
83
|
defaultLocale: Locales.ENGLISH,
|
|
84
|
+
locales: [
|
|
85
|
+
Locales.ENGLISH,
|
|
86
|
+
Locales.FRENCH,
|
|
87
|
+
Locales.SPANISH,
|
|
88
|
+
// لغاتك الأخرى
|
|
89
|
+
],
|
|
69
90
|
},
|
|
70
|
-
// يمكنك أيضًا تعديل: contentDir، contentFileExtensions، خيارات الوسيط، إلخ.
|
|
71
91
|
};
|
|
72
92
|
|
|
73
93
|
export default config;
|
|
74
94
|
```
|
|
75
95
|
|
|
76
|
-
|
|
96
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
97
|
+
import { Locales } from "intlayer";
|
|
98
|
+
|
|
99
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
100
|
+
const config = {
|
|
101
|
+
internationalization: {
|
|
102
|
+
defaultLocale: Locales.ENGLISH,
|
|
103
|
+
locales: [
|
|
104
|
+
Locales.ENGLISH,
|
|
105
|
+
Locales.FRENCH,
|
|
106
|
+
Locales.SPANISH,
|
|
107
|
+
// لغاتك الأخرى
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
};
|
|
77
111
|
|
|
78
|
-
|
|
112
|
+
export default config;
|
|
113
|
+
```
|
|
79
114
|
|
|
80
|
-
|
|
115
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
116
|
+
const { Locales } = require("intlayer");
|
|
81
117
|
|
|
82
|
-
|
|
118
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
119
|
+
const config = {
|
|
120
|
+
internationalization: {
|
|
121
|
+
defaultLocale: Locales.ENGLISH,
|
|
122
|
+
locales: [
|
|
123
|
+
Locales.ENGLISH,
|
|
124
|
+
Locales.FRENCH,
|
|
125
|
+
Locales.SPANISH,
|
|
126
|
+
// لغاتك الأخرى
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
module.exports = config;
|
|
132
|
+
```
|
|
83
133
|
|
|
84
|
-
|
|
134
|
+
> من خلال ملف التكوين هذا، يمكنك إعداد عناوين URL محلية، إعادة توجيه الوسيط، أسماء ملفات تعريف الارتباط، موقع وامتداد إعلانات المحتوى الخاصة بك، تعطيل سجلات Intlayer في وحدة التحكم، والمزيد. للحصول على قائمة كاملة بالمعلمات المتاحة، راجع [توثيق التكوين](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md).
|
|
85
135
|
|
|
86
|
-
|
|
136
|
+
### الخطوة 4: دمج Intlayer في تكوين Vite الخاص بك
|
|
137
|
+
|
|
138
|
+
أضف مكون intlayer الإضافي إلى تكوينك:
|
|
139
|
+
|
|
140
|
+
```typescript fileName="vite.config.ts" codeFormat="typescript"
|
|
141
|
+
import { reactRouter } from "@react-router/dev/vite";
|
|
87
142
|
import { defineConfig } from "vite";
|
|
88
|
-
import
|
|
89
|
-
import
|
|
143
|
+
import { intlayerMiddlewarePlugin, intlayerPlugin } from "vite-intlayer";
|
|
144
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
90
145
|
|
|
91
146
|
export default defineConfig({
|
|
92
147
|
plugins: [
|
|
93
|
-
|
|
148
|
+
reactRouter(),
|
|
149
|
+
tsconfigPaths(),
|
|
94
150
|
intlayerPlugin(),
|
|
95
|
-
|
|
96
|
-
intLayerMiddlewarePlugin(),
|
|
151
|
+
intlayerMiddlewarePlugin(),
|
|
97
152
|
],
|
|
98
153
|
});
|
|
99
154
|
```
|
|
100
155
|
|
|
101
|
-
>
|
|
156
|
+
> يتم استخدام مكون Vite الإضافي `intlayerPlugin()` لدمج Intlayer مع Vite. يضمن بناء ملفات إعلان المحتوى ومراقبتها في وضع التطوير. كما يعرّف متغيرات بيئة Intlayer داخل تطبيق Vite. بالإضافة إلى ذلك، يوفر ألقابًا لتحسين الأداء.
|
|
102
157
|
|
|
103
|
-
|
|
158
|
+
### الخطوة 5: إنشاء مكونات التخطيط
|
|
159
|
+
|
|
160
|
+
قم بإعداد تخطيط الجذر والتخطيطات الخاصة بكل لغة:
|
|
161
|
+
|
|
162
|
+
#### تخطيط الجذر
|
|
104
163
|
|
|
105
|
-
|
|
164
|
+
```tsx fileName="src/routes/{-$locale}/route.tsx" codeFormat="typescript"
|
|
165
|
+
// src/routes/{-$locale}/route.tsx
|
|
166
|
+
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
167
|
+
import { configuration } from "intlayer";
|
|
168
|
+
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
169
|
+
|
|
170
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
171
|
+
|
|
172
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
173
|
+
component: LayoutComponent,
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
function LayoutComponent() {
|
|
177
|
+
const { locale } = Route.useParams();
|
|
178
|
+
|
|
179
|
+
return (
|
|
180
|
+
<IntlayerProvider locale={locale}>
|
|
181
|
+
<Outlet />
|
|
182
|
+
</IntlayerProvider>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
```
|
|
106
186
|
|
|
107
|
-
|
|
187
|
+
### الخطوة 6: إعلان المحتوى الخاص بك
|
|
108
188
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
189
|
+
قم بإنشاء وإدارة إعلانات المحتوى الخاصة بك لتخزين الترجمات:
|
|
190
|
+
|
|
191
|
+
```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
|
|
192
|
+
import type { Dictionary } from "intlayer";
|
|
193
|
+
|
|
194
|
+
import { t } from "intlayer";
|
|
112
195
|
|
|
113
196
|
const appContent = {
|
|
114
|
-
key: "app",
|
|
115
197
|
content: {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
198
|
+
links: {
|
|
199
|
+
about: t({
|
|
200
|
+
en: "About",
|
|
201
|
+
es: "Acerca de",
|
|
202
|
+
fr: "À propos",
|
|
203
|
+
}),
|
|
204
|
+
home: t({
|
|
205
|
+
en: "الرئيسية",
|
|
206
|
+
es: "Inicio",
|
|
207
|
+
fr: "Accueil",
|
|
208
|
+
}),
|
|
209
|
+
},
|
|
210
|
+
meta: {
|
|
211
|
+
description: t({
|
|
212
|
+
en: "هذا مثال على استخدام Intlayer مع TanStack Router",
|
|
213
|
+
es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
|
|
214
|
+
fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
|
|
215
|
+
}),
|
|
216
|
+
},
|
|
128
217
|
title: t({
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
fr: "
|
|
132
|
-
es: "TanStack Start + React",
|
|
133
|
-
}),
|
|
134
|
-
count: t({
|
|
135
|
-
ar: "العدد هو ",
|
|
136
|
-
en: "count is ",
|
|
137
|
-
fr: "le compte est ",
|
|
138
|
-
es: "el recuento es ",
|
|
139
|
-
}),
|
|
140
|
-
edit: t<ReactNode>({
|
|
141
|
-
ar: (
|
|
142
|
-
<>
|
|
143
|
-
حرر <code>src/routes/index.tsx</code> واحفظ لاختبار HMR
|
|
144
|
-
</>
|
|
145
|
-
),
|
|
146
|
-
en: (
|
|
147
|
-
<>
|
|
148
|
-
Edit <code>src/routes/index.tsx</code> and save to test HMR
|
|
149
|
-
</>
|
|
150
|
-
),
|
|
151
|
-
fr: (
|
|
152
|
-
<>
|
|
153
|
-
Éditez <code>src/routes/index.tsx</code> et enregistrez pour tester
|
|
154
|
-
HMR
|
|
155
|
-
</>
|
|
156
|
-
),
|
|
157
|
-
es: (
|
|
158
|
-
<>
|
|
159
|
-
Edita <code>src/routes/index.tsx</code> y guarda para probar HMR
|
|
160
|
-
</>
|
|
161
|
-
),
|
|
162
|
-
}),
|
|
163
|
-
readTheDocs: t({
|
|
164
|
-
ar: "انقر على الشعارات لمعرفة المزيد",
|
|
165
|
-
en: "Click the logos to learn more",
|
|
166
|
-
fr: "Cliquez sur les logos pour en savoir plus",
|
|
167
|
-
es: "Haz clic en los logotipos para saber más",
|
|
218
|
+
en: "مرحبًا بك في Intlayer + TanStack Router",
|
|
219
|
+
es: "Bienvenido a Intlayer + TanStack Router",
|
|
220
|
+
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
168
221
|
}),
|
|
169
222
|
},
|
|
223
|
+
key: "app",
|
|
170
224
|
} satisfies Dictionary;
|
|
171
225
|
|
|
172
226
|
export default appContent;
|
|
173
227
|
```
|
|
174
228
|
|
|
175
|
-
|
|
229
|
+
> يمكن تعريف إعلانات المحتوى الخاصة بك في أي مكان في تطبيقك بمجرد تضمينها في دليل `contentDir` (افتراضيًا، `./app`). ويجب أن تتطابق مع امتداد ملف إعلان المحتوى (افتراضيًا، `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
176
230
|
|
|
177
|
-
>
|
|
231
|
+
> لمزيد من التفاصيل، راجع [توثيق إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/get_started.md).
|
|
178
232
|
|
|
179
|
-
|
|
233
|
+
### الخطوة 7: إنشاء مكونات وخطافات تدرك اللغة
|
|
180
234
|
|
|
181
|
-
|
|
235
|
+
قم بإنشاء مكون `LocalizedLink` للملاحة المدركة للغة:
|
|
182
236
|
|
|
183
|
-
|
|
237
|
+
```tsx fileName="src/components/localized-link.tsx" codeFormat="typescript"
|
|
238
|
+
// src/components/localized-link.tsx
|
|
239
|
+
// eslint-disable-next-line no-restricted-imports
|
|
240
|
+
import { Link, type LinkProps } from "@tanstack/react-router";
|
|
241
|
+
import { getLocalizedUrl } from "intlayer";
|
|
242
|
+
import { useLocale } from "react-intlayer";
|
|
184
243
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
createRootRoute,
|
|
189
|
-
Link as RouterLink,
|
|
190
|
-
} from "@tanstack/react-router";
|
|
191
|
-
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
192
|
-
|
|
193
|
-
function AppShell() {
|
|
194
|
-
// مثال على استخدام قاموس على المستوى الأعلى:
|
|
195
|
-
const content = useIntlayer("app");
|
|
244
|
+
type LocalizedLinkProps = {
|
|
245
|
+
to: string;
|
|
246
|
+
} & Omit<LinkProps, "to">;
|
|
196
247
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
<nav className="flex gap-3 p-3">
|
|
200
|
-
<RouterLink to="/">الرئيسية</RouterLink>
|
|
201
|
-
<RouterLink to="/about">حول</RouterLink>
|
|
202
|
-
</nav>
|
|
203
|
-
<main className="p-6">
|
|
204
|
-
<h1>{content.title}</h1>
|
|
205
|
-
<Outlet />
|
|
206
|
-
</main>
|
|
207
|
-
</div>
|
|
208
|
-
);
|
|
209
|
-
}
|
|
248
|
+
export function LocalizedLink(props: LocalizedLinkProps) {
|
|
249
|
+
const { locale } = useLocale();
|
|
210
250
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
</IntlayerProvider>
|
|
216
|
-
),
|
|
217
|
-
});
|
|
218
|
-
```
|
|
251
|
+
// دالة للتحقق مما إذا كان الرابط خارجيًا
|
|
252
|
+
const isExternal = (to: string) => {
|
|
253
|
+
return /^(https?:)?\/\//.test(to);
|
|
254
|
+
};
|
|
219
255
|
|
|
220
|
-
|
|
256
|
+
// تحديد الرابط بناءً على ما إذا كان خارجيًا أو داخليًا مع تعريب الرابط
|
|
257
|
+
const to = isExternal(props.to)
|
|
258
|
+
? props.to
|
|
259
|
+
: getLocalizedUrl(props.to, locale);
|
|
221
260
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
import { useIntlayer } from "react-intlayer";
|
|
225
|
-
import reactLogo from "../assets/react.svg";
|
|
226
|
-
|
|
227
|
-
export const Route = createFileRoute("/")({
|
|
228
|
-
component: () => {
|
|
229
|
-
const content = useIntlayer("app");
|
|
230
|
-
return (
|
|
231
|
-
<>
|
|
232
|
-
<button>{content.count}0</button>
|
|
233
|
-
<p>{content.edit}</p>
|
|
234
|
-
<img
|
|
235
|
-
src={reactLogo}
|
|
236
|
-
alt={content.reactLogo.value}
|
|
237
|
-
width={48}
|
|
238
|
-
height={48}
|
|
239
|
-
/>
|
|
240
|
-
<p className="opacity-70">{content.readTheDocs}</p>
|
|
241
|
-
</>
|
|
242
|
-
);
|
|
243
|
-
},
|
|
244
|
-
});
|
|
261
|
+
return <Link {...props} to={to as LinkProps["to"]} />;
|
|
262
|
+
}
|
|
245
263
|
```
|
|
246
264
|
|
|
247
|
-
|
|
248
|
-
>
|
|
249
|
-
> ```jsx
|
|
250
|
-
> <img alt={c.reactLogo.value} />
|
|
251
|
-
> ```
|
|
265
|
+
إنشاء هوك `useLocalizedNavigate` للملاحة البرمجية:
|
|
252
266
|
|
|
253
|
-
|
|
267
|
+
```tsx fileName="src/hooks/useLocalizedNavigate.tsx" codeFormat="typescript"
|
|
268
|
+
// src/hooks/useLocalizedNavigate.tsx
|
|
269
|
+
// eslint-disable-next-line no-restricted-imports
|
|
270
|
+
import { NavigateOptions, useNavigate } from "@tanstack/react-router";
|
|
271
|
+
import { getLocalizedUrl } from "intlayer";
|
|
272
|
+
import { useLocale } from "react-intlayer";
|
|
254
273
|
|
|
255
|
-
|
|
274
|
+
type LocalizedNavigateOptions = {
|
|
275
|
+
to: string;
|
|
276
|
+
} & Omit<NavigateOptions, "to">;
|
|
256
277
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
278
|
+
export const useLocalizedNavigate = () => {
|
|
279
|
+
const navigate = useNavigate();
|
|
280
|
+
const { locale } = useLocale();
|
|
260
281
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}
|
|
282
|
+
const isExternal = (to: string) => {
|
|
283
|
+
return /^(https?:)?\/\//.test(to);
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
const localizedNavigate = (options: LocalizedNavigateOptions) => {
|
|
287
|
+
const to = isExternal(options.to)
|
|
288
|
+
? options.to
|
|
289
|
+
: getLocalizedUrl(options.to, locale);
|
|
290
|
+
|
|
291
|
+
navigate({ ...options, to: to as NavigateOptions["to"] });
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
return localizedNavigate;
|
|
295
|
+
};
|
|
271
296
|
```
|
|
272
297
|
|
|
273
|
-
|
|
298
|
+
### الخطوة 8: استخدام Intlayer في صفحاتك
|
|
274
299
|
|
|
275
|
-
|
|
300
|
+
الوصول إلى قواميس المحتوى الخاصة بك في جميع أنحاء تطبيقك:
|
|
276
301
|
|
|
277
|
-
|
|
302
|
+
#### صفحة إعادة التوجيه الجذرية
|
|
278
303
|
|
|
279
|
-
|
|
304
|
+
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
305
|
+
// src/routes/page.tsx
|
|
306
|
+
import { useLocale } from "intlayer";
|
|
307
|
+
import { Navigate } from "react-router";
|
|
280
308
|
|
|
281
|
-
|
|
309
|
+
export default function Page() {
|
|
310
|
+
const { locale } = useLocale();
|
|
282
311
|
|
|
283
|
-
|
|
312
|
+
return <Navigate replace to={locale} />;
|
|
313
|
+
}
|
|
314
|
+
```
|
|
284
315
|
|
|
285
|
-
|
|
316
|
+
#### الصفحة الرئيسية المحلية
|
|
286
317
|
|
|
287
|
-
```tsx fileName="src/
|
|
288
|
-
import {
|
|
289
|
-
import {
|
|
290
|
-
import {
|
|
318
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
319
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
320
|
+
import { getIntlayer } from "intlayer";
|
|
321
|
+
import { useIntlayer } from "react-intlayer";
|
|
291
322
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
323
|
+
import LocaleSwitcher from "@/components/locale-switcher";
|
|
324
|
+
import { LocalizedLink } from "@/components/localized-link";
|
|
325
|
+
import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
|
|
326
|
+
|
|
327
|
+
export const Route = createFileRoute("/{-$locale}/")({
|
|
328
|
+
component: RouteComponent,
|
|
329
|
+
head: ({ params }) => {
|
|
330
|
+
const { locale } = params;
|
|
331
|
+
const metaContent = getIntlayer("app", locale);
|
|
332
|
+
|
|
333
|
+
return {
|
|
334
|
+
meta: [
|
|
335
|
+
{ title: metaContent.title },
|
|
336
|
+
{ content: metaContent.meta.description, name: "description" },
|
|
337
|
+
],
|
|
338
|
+
};
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
function RouteComponent() {
|
|
343
|
+
const content = useIntlayer("app");
|
|
344
|
+
const navigate = useLocalizedNavigate();
|
|
305
345
|
|
|
306
346
|
return (
|
|
307
|
-
<div className="
|
|
308
|
-
<
|
|
309
|
-
|
|
310
|
-
|
|
347
|
+
<div className="grid place-items-center h-screen">
|
|
348
|
+
<div className="flex flex-col gap-4 items-center text-center">
|
|
349
|
+
{content.title}
|
|
350
|
+
<LocaleSwitcher />
|
|
351
|
+
<div className="flex gap-4">
|
|
352
|
+
<a href="/">الفهرس</a>
|
|
353
|
+
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
354
|
+
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
355
|
+
</div>
|
|
356
|
+
<div className="flex gap-4">
|
|
357
|
+
<button onClick={() => navigate({ to: "/" })}>
|
|
358
|
+
{content.links.home}
|
|
359
|
+
</button>
|
|
360
|
+
<button onClick={() => navigate({ to: "/about" })}>
|
|
361
|
+
{content.links.about}
|
|
362
|
+
</button>
|
|
363
|
+
</div>
|
|
364
|
+
</div>
|
|
311
365
|
</div>
|
|
312
366
|
);
|
|
313
367
|
}
|
|
314
368
|
```
|
|
315
369
|
|
|
316
|
-
|
|
370
|
+
> لمعرفة المزيد عن الخطاف `useIntlayer`، راجع [التوثيق](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/react-intlayer/useIntlayer.md).
|
|
317
371
|
|
|
318
|
-
|
|
372
|
+
### الخطوة 9: إنشاء مكون لتبديل اللغة
|
|
319
373
|
|
|
320
|
-
|
|
374
|
+
أنشئ مكونًا يسمح للمستخدمين بتغيير اللغة:
|
|
321
375
|
|
|
322
|
-
```tsx fileName="src/
|
|
323
|
-
import {
|
|
324
|
-
import {
|
|
325
|
-
|
|
376
|
+
```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
|
|
377
|
+
import { useLocation } from "@tanstack/react-router";
|
|
378
|
+
import {
|
|
379
|
+
getHTMLTextDir,
|
|
380
|
+
getLocaleName,
|
|
381
|
+
getLocalizedUrl,
|
|
382
|
+
Locales,
|
|
383
|
+
} from "intlayer";
|
|
384
|
+
import { useIntlayer, useLocale } from "react-intlayer";
|
|
385
|
+
|
|
386
|
+
export default function LocaleSwitcher() {
|
|
387
|
+
const { pathname, searchStr } = useLocation();
|
|
388
|
+
const content = useIntlayer("locale-switcher");
|
|
389
|
+
|
|
390
|
+
const { availableLocales, locale, setLocale } = useLocale({
|
|
391
|
+
onLocaleChange: (newLocale) => {
|
|
392
|
+
const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
|
|
393
|
+
location.replace(pathWithLocale);
|
|
394
|
+
},
|
|
395
|
+
});
|
|
326
396
|
|
|
327
|
-
function Document({
|
|
328
|
-
locale,
|
|
329
|
-
children,
|
|
330
|
-
}: {
|
|
331
|
-
locale: string;
|
|
332
|
-
children: React.ReactNode;
|
|
333
|
-
}) {
|
|
334
397
|
return (
|
|
335
|
-
<
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
398
|
+
<select
|
|
399
|
+
aria-label={content.label.toString()}
|
|
400
|
+
onChange={(e) => setLocale(e.target.value)}
|
|
401
|
+
value={locale}
|
|
402
|
+
>
|
|
403
|
+
{availableLocales.map((localeItem) => (
|
|
404
|
+
<option
|
|
405
|
+
dir={getHTMLTextDir(localeItem)}
|
|
406
|
+
key={localeItem}
|
|
407
|
+
lang={localeItem}
|
|
408
|
+
value={localeItem}
|
|
409
|
+
>
|
|
410
|
+
{/* مثال: Français (الفرنسية) */}
|
|
411
|
+
{getLocaleName(localeItem, locale)} (
|
|
412
|
+
{getLocaleName(localeItem, Locales.ENGLISH)})
|
|
413
|
+
</option>
|
|
414
|
+
))}
|
|
415
|
+
</select>
|
|
343
416
|
);
|
|
344
417
|
}
|
|
345
|
-
|
|
346
|
-
export const Route = createRootRoute({
|
|
347
|
-
component: () => (
|
|
348
|
-
<IntlayerProvider>
|
|
349
|
-
{/* إذا كنت تحسب اللغة على الخادم، قم بتمريرها إلى المستند؛ وإلا سيصححها العميل بعد التحميل */}
|
|
350
|
-
<Document locale={document?.documentElement?.lang || "en"}>
|
|
351
|
-
<Outlet />
|
|
352
|
-
</Document>
|
|
353
|
-
</IntlayerProvider>
|
|
354
|
-
),
|
|
355
|
-
});
|
|
356
418
|
```
|
|
357
419
|
|
|
358
|
-
|
|
420
|
+
> لمعرفة المزيد عن الخطاف `useLocale`، يرجى الرجوع إلى [التوثيق](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/react-intlayer/useLocale.md).
|
|
421
|
+
|
|
422
|
+
### الخطوة 10: إضافة إدارة خصائص HTML (اختياري)
|
|
423
|
+
|
|
424
|
+
إنشاء خطاف لإدارة خصائص lang و dir في HTML:
|
|
359
425
|
|
|
360
|
-
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
426
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
427
|
+
// src/hooks/useI18nHTMLAttributes.tsx
|
|
428
|
+
import { getHTMLTextDir } from "intlayer";
|
|
361
429
|
import { useEffect } from "react";
|
|
362
430
|
import { useLocale } from "react-intlayer";
|
|
363
|
-
import { getHTMLTextDir } from "intlayer";
|
|
364
431
|
|
|
365
432
|
export const useI18nHTMLAttributes = () => {
|
|
366
433
|
const { locale } = useLocale();
|
|
434
|
+
|
|
367
435
|
useEffect(() => {
|
|
368
436
|
document.documentElement.lang = locale;
|
|
369
437
|
document.documentElement.dir = getHTMLTextDir(locale);
|
|
@@ -371,87 +439,185 @@ export const useI18nHTMLAttributes = () => {
|
|
|
371
439
|
};
|
|
372
440
|
```
|
|
373
441
|
|
|
374
|
-
|
|
442
|
+
ثم استخدمه في مكون الجذر الخاص بك:
|
|
375
443
|
|
|
376
|
-
|
|
444
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
445
|
+
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
446
|
+
import { configuration } from "intlayer";
|
|
447
|
+
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
377
448
|
|
|
378
|
-
|
|
449
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // استيراد الخطاف
|
|
379
450
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
forwardRef,
|
|
384
|
-
type AnchorHTMLAttributes,
|
|
385
|
-
type DetailedHTMLProps,
|
|
386
|
-
} from "react";
|
|
387
|
-
import { useLocale } from "react-intlayer";
|
|
451
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
452
|
+
component: LayoutComponent,
|
|
453
|
+
});
|
|
388
454
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
const hrefI18n =
|
|
401
|
-
href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
|
|
402
|
-
return (
|
|
403
|
-
<a href={hrefI18n} ref={ref} {...props}>
|
|
404
|
-
{children}
|
|
405
|
-
</a>
|
|
406
|
-
);
|
|
407
|
-
}
|
|
408
|
-
);
|
|
409
|
-
Link.displayName = "Link";
|
|
455
|
+
function LayoutComponent() {
|
|
456
|
+
useI18nHTMLAttributes(); // أضف هذا السطر
|
|
457
|
+
|
|
458
|
+
const { locale } = Route.useParams();
|
|
459
|
+
|
|
460
|
+
return (
|
|
461
|
+
<IntlayerProvider locale={locale}>
|
|
462
|
+
<Outlet />
|
|
463
|
+
</IntlayerProvider>
|
|
464
|
+
);
|
|
465
|
+
}
|
|
410
466
|
```
|
|
411
467
|
|
|
412
|
-
|
|
468
|
+
### الخطوة 11: بناء وتشغيل تطبيقك
|
|
413
469
|
|
|
414
|
-
|
|
470
|
+
قم ببناء قواميس المحتوى وتشغيل تطبيقك:
|
|
471
|
+
|
|
472
|
+
```bash packageManager="npm"
|
|
473
|
+
# بناء قواميس Intlayer
|
|
474
|
+
npm run intlayer:build
|
|
415
475
|
|
|
416
|
-
|
|
476
|
+
# بدء خادم التطوير
|
|
477
|
+
npm run dev
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
```bash packageManager="pnpm"
|
|
481
|
+
# بناء قواميس Intlayer
|
|
482
|
+
pnpm intlayer:build
|
|
483
|
+
|
|
484
|
+
# بدء خادم التطوير
|
|
485
|
+
pnpm dev
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
```bash packageManager="yarn"
|
|
489
|
+
# بناء قواميس Intlayer
|
|
490
|
+
yarn intlayer:build
|
|
417
491
|
|
|
418
|
-
|
|
492
|
+
# بدء خادم التطوير
|
|
493
|
+
yarn dev
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
### الخطوة 12: تكوين TypeScript (اختياري)
|
|
497
|
+
|
|
498
|
+
يستخدم Intlayer تعزيز الوحدات للاستفادة من ميزات TypeScript وجعل قاعدة الشيفرة الخاصة بك أقوى.
|
|
499
|
+
|
|
500
|
+
تأكد من أن تكوين TypeScript الخاص بك يتضمن الأنواع التي تم إنشاؤها تلقائيًا:
|
|
419
501
|
|
|
420
502
|
```json5 fileName="tsconfig.json"
|
|
421
503
|
{
|
|
422
|
-
|
|
504
|
+
compilerOptions: {
|
|
505
|
+
// ... تكوينات TypeScript الحالية الخاصة بك
|
|
506
|
+
},
|
|
507
|
+
include: [
|
|
508
|
+
// ... الملفات التي تشملها حاليًا
|
|
509
|
+
".intlayer/**/*.ts", // تضمين الأنواع التي تم إنشاؤها تلقائيًا
|
|
510
|
+
],
|
|
423
511
|
}
|
|
424
512
|
```
|
|
425
513
|
|
|
426
|
-
|
|
514
|
+
### تكوين Git
|
|
427
515
|
|
|
428
|
-
|
|
516
|
+
يوصى بتجاهل الملفات التي تم إنشاؤها بواسطة Intlayer. هذا يسمح لك بتجنب إضافتها إلى مستودع Git الخاص بك.
|
|
429
517
|
|
|
430
|
-
|
|
518
|
+
للقيام بذلك، يمكنك إضافة التعليمات التالية إلى ملف `.gitignore` الخاص بك:
|
|
431
519
|
|
|
432
|
-
```gitignore
|
|
520
|
+
```plaintext fileName=".gitignore"
|
|
521
|
+
# تجاهل الملفات التي تم إنشاؤها بواسطة Intlayer
|
|
433
522
|
.intlayer
|
|
434
523
|
```
|
|
435
524
|
|
|
436
525
|
---
|
|
437
526
|
|
|
527
|
+
### الخطوة 13: إنشاء إعادة توجيه (اختياري)
|
|
528
|
+
|
|
529
|
+
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
530
|
+
function LayoutComponent() {
|
|
531
|
+
useI18nHTMLAttributes();
|
|
532
|
+
|
|
533
|
+
const { locale } = Route.useParams();
|
|
534
|
+
const { locale: selectedLocale } = useLocale();
|
|
535
|
+
const { defaultLocale } = configuration.internationalization;
|
|
536
|
+
const { prefixDefault } = configuration.middleware;
|
|
537
|
+
|
|
538
|
+
// إعادة التوجيه إلى اللغة الافتراضية إذا لم تكن هناك لغة في عنوان URL عندما تكون prefixDefault صحيحة
|
|
539
|
+
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
540
|
+
return <Navigate replace to={defaultLocale} />;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// إعادة التوجيه إلى اللغة المختارة إذا كانت اللغة في عنوان URL لا تطابق اللغة المختارة
|
|
544
|
+
if (selectedLocale !== defaultLocale && !locale) {
|
|
545
|
+
return <Navigate replace to={selectedLocale} />;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
return (
|
|
549
|
+
<IntlayerProvider locale={locale}>
|
|
550
|
+
<Outlet />
|
|
551
|
+
</IntlayerProvider>
|
|
552
|
+
);
|
|
553
|
+
}
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
## النشر في بيئة الإنتاج
|
|
557
|
+
|
|
558
|
+
عند نشر تطبيقك:
|
|
559
|
+
|
|
560
|
+
1. **قم ببناء تطبيقك:**
|
|
561
|
+
|
|
562
|
+
```bash
|
|
563
|
+
npm run build
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
2. **قم ببناء قواميس Intlayer:**
|
|
567
|
+
|
|
568
|
+
```bash
|
|
569
|
+
npm run intlayer:build
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
3. **انقل `vite-intlayer` إلى التبعيات** إذا كنت تستخدم الوسيط (middleware) في الإنتاج:
|
|
573
|
+
```bash
|
|
574
|
+
npm install vite-intlayer --save
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
سيصبح تطبيقك الآن يدعم:
|
|
578
|
+
|
|
579
|
+
- **هيكلية URL**: `/en`، `/en/about`، `/tr`، `/tr/about`
|
|
580
|
+
- **الكشف التلقائي عن اللغة** بناءً على تفضيلات المتصفح
|
|
581
|
+
- **التوجيه المدرك للغة** باستخدام Tanstack Start
|
|
582
|
+
- **دعم TypeScript** مع أنواع مولدة تلقائيًا
|
|
583
|
+
- **التصيير على جانب الخادم** مع التعامل الصحيح مع اللغة
|
|
584
|
+
|
|
438
585
|
## امتداد VS Code
|
|
439
586
|
|
|
440
|
-
|
|
441
|
-
|
|
587
|
+
لتحسين تجربة التطوير الخاصة بك مع Intlayer، يمكنك تثبيت **امتداد Intlayer الرسمي لـ VS Code**.
|
|
588
|
+
|
|
589
|
+
[التثبيت من سوق VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
590
|
+
|
|
591
|
+
يوفر هذا الامتداد:
|
|
592
|
+
|
|
593
|
+
- **الإكمال التلقائي** لمفاتيح الترجمة.
|
|
594
|
+
- **الكشف الفوري عن الأخطاء** للترجمات المفقودة.
|
|
595
|
+
- **معاينات داخلية** للمحتوى المترجم.
|
|
596
|
+
- **إجراءات سريعة** لإنشاء وتحديث الترجمات بسهولة.
|
|
597
|
+
|
|
598
|
+
لمزيد من التفاصيل حول كيفية استخدام الامتداد، راجع [توثيق امتداد Intlayer لـ VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
442
599
|
|
|
443
600
|
---
|
|
444
601
|
|
|
445
602
|
## التقدم أكثر
|
|
446
603
|
|
|
447
|
-
|
|
448
|
-
- وضع CMS
|
|
449
|
-
- اكتشاف اللغة على الحافة / المحولات
|
|
604
|
+
للمضي قدمًا، يمكنك تنفيذ [المحرر المرئي](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_visual_editor.md) أو إخراج محتواك باستخدام [نظام إدارة المحتوى (CMS)](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_CMS.md).
|
|
450
605
|
|
|
451
606
|
---
|
|
452
607
|
|
|
608
|
+
## مراجع التوثيق
|
|
609
|
+
|
|
610
|
+
- [توثيق Intlayer](https://intlayer.org)
|
|
611
|
+
- [توثيق Tanstack Start](https://reactrouter.com/)
|
|
612
|
+
- [هوك useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/react-intlayer/useIntlayer.md)
|
|
613
|
+
- [هوك useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/packages/react-intlayer/useLocale.md)
|
|
614
|
+
- [إعلان المحتوى](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/get_started.md)
|
|
615
|
+
- [التكوين](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/configuration.md)
|
|
616
|
+
|
|
617
|
+
يوفر هذا الدليل الشامل كل ما تحتاجه لدمج Intlayer مع Tanstack Start لتطبيق معرب بالكامل مع توجيه واعٍ للغة ودعم TypeScript.
|
|
618
|
+
|
|
453
619
|
## تاريخ الوثيقة
|
|
454
620
|
|
|
455
|
-
| الإصدار | التاريخ | التغييرات
|
|
456
|
-
| ------- | ---------- |
|
|
457
|
-
|
|
|
621
|
+
| الإصدار | التاريخ | التغييرات |
|
|
622
|
+
| ------- | ---------- | ---------------------- |
|
|
623
|
+
| 5.8.1 | 2025-09-09 | أضيف لـ Tanstack Start |
|