@intlayer/docs 5.8.1 → 6.0.0-canary.1
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 +12 -12
- 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,347 +1,435 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt: 2025-
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title: Prise en main
|
|
5
|
-
description:
|
|
2
|
+
createdAt: 2025-09-09
|
|
3
|
+
updatedAt: 2025-09-09
|
|
4
|
+
title: Prise en main de l'internationalisation avec Intlayer dans Tanstack Start
|
|
5
|
+
description: Apprenez comment ajouter l'internationalisation (i18n) à votre application Tanstack Start en utilisant Intlayer. Suivez ce guide complet pour rendre votre application multilingue avec un routage sensible à la locale.
|
|
6
6
|
keywords:
|
|
7
7
|
- Internationalisation
|
|
8
8
|
- Documentation
|
|
9
9
|
- Intlayer
|
|
10
|
-
-
|
|
11
|
-
- TanStack Router
|
|
10
|
+
- Tanstack Start
|
|
12
11
|
- React
|
|
13
12
|
- i18n
|
|
14
|
-
-
|
|
13
|
+
- TypeScript
|
|
14
|
+
- Routage par locale
|
|
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
|
-
# Prise en main de l'internationalisation (i18n) avec Intlayer et
|
|
24
|
+
# Prise en main de l'internationalisation (i18n) avec Intlayer et Tanstack Start
|
|
25
|
+
|
|
26
|
+
Ce guide montre comment intégrer **Intlayer** pour une internationalisation fluide dans les projets Tanstack Start avec un routage sensible à la locale, la prise en charge de TypeScript, et des pratiques de développement modernes.
|
|
22
27
|
|
|
23
28
|
## Qu'est-ce qu'Intlayer ?
|
|
24
29
|
|
|
25
|
-
**Intlayer** est une
|
|
30
|
+
**Intlayer** est une bibliothèque d'internationalisation (i18n) innovante et open-source, conçue pour simplifier la prise en charge multilingue dans les applications web modernes.
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
- **Métadonnées et routes dynamiques** (prêtes pour le SEO).
|
|
29
|
-
- **Changement de locale à l'exécution** (et helpers pour détecter/persister les locales).
|
|
30
|
-
- **Plugin Vite** pour les transformations au moment de la build + expérience développeur améliorée.
|
|
32
|
+
Avec Intlayer, vous pouvez :
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
- **Gérer facilement les traductions** en utilisant des dictionnaires déclaratifs au niveau des composants.
|
|
35
|
+
- **Localiser dynamiquement les métadonnées**, les routes et le contenu.
|
|
36
|
+
- **Assurer la prise en charge de TypeScript** avec des types générés automatiquement, améliorant l'autocomplétion et la détection des erreurs.
|
|
37
|
+
- **Bénéficier de fonctionnalités avancées**, comme la détection dynamique de la locale et son changement.
|
|
38
|
+
- **Activer le routage sensible à la locale** avec le système de routage basé sur les fichiers de Tanstack Start.
|
|
33
39
|
|
|
34
40
|
---
|
|
35
41
|
|
|
36
|
-
##
|
|
42
|
+
## Guide étape par étape pour configurer Intlayer dans une application Tanstack Start
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
# npm
|
|
40
|
-
npm i intlayer react-intlayer
|
|
41
|
-
npm i -D vite-intlayer
|
|
44
|
+
### Étape 1 : Créer le projet
|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
Commencez par créer un nouveau projet TanStack Start en suivant le guide [Démarrer un nouveau projet](https://tanstack.com/start/latest/docs/framework/react/quick-start) sur le site de TanStack Start.
|
|
47
|
+
|
|
48
|
+
### Étape 2 : Installer les packages Intlayer
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
Installez les packages nécessaires en utilisant votre gestionnaire de paquets préféré :
|
|
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
|
+
Le package principal qui fournit des outils d'internationalisation pour la gestion de la configuration, la traduction, la [déclaration de contenu](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/get_started.md), la transpilation, et les [commandes CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_cli.md).
|
|
65
|
+
|
|
66
|
+
- **react-intlayer**
|
|
67
|
+
Le package qui intègre Intlayer avec une application React. Il fournit des fournisseurs de contexte et des hooks pour l'internationalisation dans React.
|
|
57
68
|
|
|
58
|
-
|
|
69
|
+
- **vite-intlayer**
|
|
70
|
+
Inclut le plugin Vite pour intégrer Intlayer avec le [bundler Vite](https://vite.dev/guide/why.html#why-bundle-for-production), ainsi que des middlewares pour détecter la locale préférée de l'utilisateur, gérer les cookies, et gérer la redirection des URL.
|
|
59
71
|
|
|
60
|
-
|
|
72
|
+
### Étape 3 : Configuration de votre projet
|
|
61
73
|
|
|
62
|
-
|
|
63
|
-
|
|
74
|
+
Créez un fichier de configuration pour configurer les langues de votre application :
|
|
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
|
+
// Vos autres langues
|
|
89
|
+
],
|
|
69
90
|
},
|
|
70
|
-
// Vous pouvez aussi ajuster : contentDir, contentFileExtensions, options du middleware, etc.
|
|
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";
|
|
77
98
|
|
|
78
|
-
|
|
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
|
+
// Vos autres locales
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
};
|
|
79
111
|
|
|
80
|
-
|
|
112
|
+
export default config;
|
|
113
|
+
```
|
|
81
114
|
|
|
82
|
-
|
|
115
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
116
|
+
const { Locales } = require("intlayer");
|
|
83
117
|
|
|
84
|
-
|
|
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
|
+
// Vos autres locales
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
module.exports = config;
|
|
132
|
+
```
|
|
85
133
|
|
|
86
|
-
|
|
134
|
+
> Grâce à ce fichier de configuration, vous pouvez configurer des URLs localisées, la redirection via middleware, les noms des cookies, l'emplacement et l'extension de vos déclarations de contenu, désactiver les logs Intlayer dans la console, et bien plus encore. Pour une liste complète des paramètres disponibles, référez-vous à la [documentation de configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/configuration.md).
|
|
135
|
+
|
|
136
|
+
### Étape 4 : Intégrer Intlayer dans votre configuration Vite
|
|
137
|
+
|
|
138
|
+
Ajoutez le plugin intlayer dans votre configuration :
|
|
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
|
+
> Le plugin Vite `intlayerPlugin()` est utilisé pour intégrer Intlayer avec Vite. Il assure la construction des fichiers de déclaration de contenu et les surveille en mode développement. Il définit les variables d'environnement Intlayer au sein de l'application Vite. De plus, il fournit des alias pour optimiser les performances.
|
|
102
157
|
|
|
103
|
-
|
|
158
|
+
### Étape 5 : Créez les composants de mise en page
|
|
159
|
+
|
|
160
|
+
Configurez votre mise en page racine et les mises en page spécifiques à chaque locale :
|
|
161
|
+
|
|
162
|
+
#### Mise en page racine
|
|
163
|
+
|
|
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
|
+
```
|
|
186
|
+
|
|
187
|
+
### Étape 6 : Déclarez votre contenu
|
|
104
188
|
|
|
105
|
-
|
|
189
|
+
Créez et gérez vos déclarations de contenu pour stocker les traductions :
|
|
106
190
|
|
|
107
|
-
|
|
191
|
+
```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
|
|
192
|
+
import type { Dictionary } from "intlayer";
|
|
108
193
|
|
|
109
|
-
|
|
110
|
-
import { t, type Dictionary } from "intlayer";
|
|
111
|
-
import type { ReactNode } from "react";
|
|
194
|
+
import { t } from "intlayer";
|
|
112
195
|
|
|
113
196
|
const appContent = {
|
|
114
|
-
key: "app",
|
|
115
197
|
content: {
|
|
116
|
-
|
|
117
|
-
|
|
198
|
+
links: {
|
|
199
|
+
about: t({
|
|
200
|
+
en: "About",
|
|
201
|
+
es: "Acerca de",
|
|
202
|
+
fr: "À propos",
|
|
203
|
+
}),
|
|
204
|
+
home: t({
|
|
205
|
+
en: "Accueil",
|
|
206
|
+
es: "Inicio",
|
|
207
|
+
fr: "Accueil",
|
|
208
|
+
}),
|
|
209
|
+
},
|
|
210
|
+
meta: {
|
|
211
|
+
description: t({
|
|
212
|
+
en: "Ceci est un exemple d'utilisation d'Intlayer avec 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
|
+
},
|
|
118
217
|
title: t({
|
|
119
|
-
en: "
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}),
|
|
123
|
-
count: t({ en: "count is ", fr: "le compte est ", es: "el recuento es " }),
|
|
124
|
-
edit: t<ReactNode>({
|
|
125
|
-
en: (
|
|
126
|
-
<>
|
|
127
|
-
Edit <code>src/routes/index.tsx</code> and save to test HMR
|
|
128
|
-
</>
|
|
129
|
-
),
|
|
130
|
-
fr: (
|
|
131
|
-
<>
|
|
132
|
-
Éditez <code>src/routes/index.tsx</code> et enregistrez pour tester
|
|
133
|
-
HMR
|
|
134
|
-
</>
|
|
135
|
-
),
|
|
136
|
-
es: (
|
|
137
|
-
<>
|
|
138
|
-
Edita <code>src/routes/index.tsx</code> y guarda para probar HMR
|
|
139
|
-
</>
|
|
140
|
-
),
|
|
141
|
-
}),
|
|
142
|
-
readTheDocs: t({
|
|
143
|
-
en: "Cliquez sur les logos pour en savoir plus",
|
|
144
|
-
fr: "Cliquez sur les logos pour en savoir plus",
|
|
145
|
-
es: "Haz clic en los logotipos para saber más",
|
|
218
|
+
en: "Bienvenue à Intlayer + TanStack Router",
|
|
219
|
+
es: "Bienvenido a Intlayer + TanStack Router",
|
|
220
|
+
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
146
221
|
}),
|
|
147
222
|
},
|
|
223
|
+
key: "app",
|
|
148
224
|
} satisfies Dictionary;
|
|
149
225
|
|
|
150
226
|
export default appContent;
|
|
151
227
|
```
|
|
152
228
|
|
|
153
|
-
|
|
229
|
+
> Vos déclarations de contenu peuvent être définies n'importe où dans votre application dès qu'elles sont incluses dans le répertoire `contentDir` (par défaut, `./app`). Et correspondent à l'extension de fichier de déclaration de contenu (par défaut, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
154
230
|
|
|
155
|
-
>
|
|
231
|
+
> Pour plus de détails, consultez la [documentation sur la déclaration de contenu](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/get_started.md).
|
|
156
232
|
|
|
157
|
-
|
|
233
|
+
### Étape 7 : Créer des composants et hooks sensibles à la locale
|
|
158
234
|
|
|
159
|
-
|
|
235
|
+
Créez un composant `LocalizedLink` pour une navigation sensible à la locale :
|
|
160
236
|
|
|
161
|
-
|
|
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";
|
|
162
243
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
createRootRoute,
|
|
167
|
-
Link as RouterLink,
|
|
168
|
-
} from "@tanstack/react-router";
|
|
169
|
-
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
170
|
-
|
|
171
|
-
function AppShell() {
|
|
172
|
-
// Exemple d’utilisation d’un dictionnaire au niveau supérieur :
|
|
173
|
-
const content = useIntlayer("app");
|
|
244
|
+
type LocalizedLinkProps = {
|
|
245
|
+
to: string;
|
|
246
|
+
} & Omit<LinkProps, "to">;
|
|
174
247
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
<nav className="flex gap-3 p-3">
|
|
178
|
-
<RouterLink to="/">Accueil</RouterLink>
|
|
179
|
-
<RouterLink to="/about">À propos</RouterLink>
|
|
180
|
-
</nav>
|
|
181
|
-
<main className="p-6">
|
|
182
|
-
<h1>{content.title}</h1>
|
|
183
|
-
<Outlet />
|
|
184
|
-
</main>
|
|
185
|
-
</div>
|
|
186
|
-
);
|
|
187
|
-
}
|
|
248
|
+
export function LocalizedLink(props: LocalizedLinkProps) {
|
|
249
|
+
const { locale } = useLocale();
|
|
188
250
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
<AppShell />
|
|
193
|
-
</IntlayerProvider>
|
|
194
|
-
),
|
|
195
|
-
});
|
|
196
|
-
```
|
|
251
|
+
const isExternal = (to: string) => {
|
|
252
|
+
return /^(https?:)?\/\//.test(to);
|
|
253
|
+
};
|
|
197
254
|
|
|
198
|
-
|
|
255
|
+
const to = isExternal(props.to)
|
|
256
|
+
? props.to
|
|
257
|
+
: getLocalizedUrl(props.to, locale);
|
|
199
258
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
import { useIntlayer } from "react-intlayer";
|
|
203
|
-
import reactLogo from "../assets/react.svg";
|
|
204
|
-
|
|
205
|
-
export const Route = createFileRoute("/")({
|
|
206
|
-
component: () => {
|
|
207
|
-
const content = useIntlayer("app");
|
|
208
|
-
return (
|
|
209
|
-
<>
|
|
210
|
-
<button>{content.count}0</button>
|
|
211
|
-
<p>{content.edit}</p>
|
|
212
|
-
<img
|
|
213
|
-
src={reactLogo}
|
|
214
|
-
alt={content.reactLogo.value}
|
|
215
|
-
width={48}
|
|
216
|
-
height={48}
|
|
217
|
-
/>
|
|
218
|
-
<p className="opacity-70">{content.readTheDocs}</p>
|
|
219
|
-
</>
|
|
220
|
-
);
|
|
221
|
-
},
|
|
222
|
-
});
|
|
259
|
+
return <Link {...props} to={to as LinkProps["to"]} />;
|
|
260
|
+
}
|
|
223
261
|
```
|
|
224
262
|
|
|
225
|
-
|
|
226
|
-
>
|
|
227
|
-
> ```jsx
|
|
228
|
-
> <img alt={c.reactLogo.value} />
|
|
229
|
-
> ```
|
|
263
|
+
Créez un hook `useLocalizedNavigate` pour la navigation programmatique :
|
|
230
264
|
|
|
231
|
-
|
|
265
|
+
```tsx fileName="src/hooks/useLocalizedNavigate.tsx" codeFormat="typescript"
|
|
266
|
+
// src/hooks/useLocalizedNavigate.tsx
|
|
267
|
+
// eslint-disable-next-line no-restricted-imports
|
|
268
|
+
import { NavigateOptions, useNavigate } from "@tanstack/react-router";
|
|
269
|
+
import { getLocalizedUrl } from "intlayer";
|
|
270
|
+
import { useLocale } from "react-intlayer";
|
|
232
271
|
|
|
233
|
-
|
|
272
|
+
type LocalizedNavigateOptions = {
|
|
273
|
+
to: string;
|
|
274
|
+
} & Omit<NavigateOptions, "to">;
|
|
234
275
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
276
|
+
export const useLocalizedNavigate = () => {
|
|
277
|
+
const navigate = useNavigate();
|
|
278
|
+
const { locale } = useLocale();
|
|
238
279
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
280
|
+
const isExternal = (to: string) => {
|
|
281
|
+
return /^(https?:)?\/\//.test(to);
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
const localizedNavigate = (options: LocalizedNavigateOptions) => {
|
|
285
|
+
const to = isExternal(options.to)
|
|
286
|
+
? options.to
|
|
287
|
+
: getLocalizedUrl(options.to, locale);
|
|
288
|
+
|
|
289
|
+
navigate({ ...options, to: to as NavigateOptions["to"] });
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
return localizedNavigate;
|
|
293
|
+
};
|
|
249
294
|
```
|
|
250
295
|
|
|
251
|
-
|
|
296
|
+
### Étape 8 : Utilisez Intlayer dans vos pages
|
|
252
297
|
|
|
253
|
-
|
|
298
|
+
Accédez à vos dictionnaires de contenu dans toute votre application :
|
|
254
299
|
|
|
255
|
-
|
|
300
|
+
#### Page de redirection racine
|
|
256
301
|
|
|
257
|
-
|
|
302
|
+
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
303
|
+
// src/routes/page.tsx
|
|
304
|
+
import { useLocale } from "react-intlayer";
|
|
305
|
+
import { Navigate } from "react-router";
|
|
258
306
|
|
|
259
|
-
|
|
307
|
+
export default function Page() {
|
|
308
|
+
const { locale } = useLocale();
|
|
260
309
|
|
|
261
|
-
|
|
310
|
+
return <Navigate replace to={locale} />;
|
|
311
|
+
}
|
|
312
|
+
```
|
|
262
313
|
|
|
263
|
-
|
|
314
|
+
#### Page d'accueil localisée
|
|
264
315
|
|
|
265
|
-
```tsx fileName="src/
|
|
266
|
-
import {
|
|
267
|
-
import {
|
|
268
|
-
import {
|
|
316
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
317
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
318
|
+
import { getIntlayer } from "intlayer";
|
|
319
|
+
import { useIntlayer } from "react-intlayer";
|
|
269
320
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
321
|
+
import LocaleSwitcher from "@/components/locale-switcher";
|
|
322
|
+
import { LocalizedLink } from "@/components/localized-link";
|
|
323
|
+
import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
|
|
324
|
+
|
|
325
|
+
export const Route = createFileRoute("/{-$locale}/")({
|
|
326
|
+
component: RouteComponent,
|
|
327
|
+
head: ({ params }) => {
|
|
328
|
+
const { locale } = params;
|
|
329
|
+
const metaContent = getIntlayer("app", locale);
|
|
330
|
+
|
|
331
|
+
return {
|
|
332
|
+
meta: [
|
|
333
|
+
{ title: metaContent.title },
|
|
334
|
+
{ content: metaContent.meta.description, name: "description" },
|
|
335
|
+
],
|
|
336
|
+
};
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
function RouteComponent() {
|
|
341
|
+
const content = useIntlayer("app");
|
|
342
|
+
const navigate = useLocalizedNavigate();
|
|
283
343
|
|
|
284
344
|
return (
|
|
285
|
-
<div className="
|
|
286
|
-
<
|
|
287
|
-
|
|
288
|
-
|
|
345
|
+
<div className="grid place-items-center h-screen">
|
|
346
|
+
<div className="flex flex-col gap-4 items-center text-center">
|
|
347
|
+
{content.title}
|
|
348
|
+
<LocaleSwitcher />
|
|
349
|
+
<div className="flex gap-4">
|
|
350
|
+
<a href="/">Index</a>
|
|
351
|
+
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
352
|
+
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
353
|
+
</div>
|
|
354
|
+
<div className="flex gap-4">
|
|
355
|
+
<button onClick={() => navigate({ to: "/" })}>
|
|
356
|
+
{content.links.home}
|
|
357
|
+
</button>
|
|
358
|
+
<button onClick={() => navigate({ to: "/about" })}>
|
|
359
|
+
{content.links.about}
|
|
360
|
+
</button>
|
|
361
|
+
</div>
|
|
362
|
+
</div>
|
|
289
363
|
</div>
|
|
290
364
|
);
|
|
291
365
|
}
|
|
292
366
|
```
|
|
293
367
|
|
|
294
|
-
|
|
368
|
+
> Pour en savoir plus sur le hook `useIntlayer`, consultez la [documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/packages/react-intlayer/useIntlayer.md).
|
|
295
369
|
|
|
296
|
-
|
|
370
|
+
### Étape 9 : Créer un composant de changement de langue
|
|
297
371
|
|
|
298
|
-
|
|
372
|
+
Créez un composant pour permettre aux utilisateurs de changer de langue :
|
|
299
373
|
|
|
300
|
-
```tsx fileName="src/
|
|
301
|
-
import {
|
|
302
|
-
import {
|
|
303
|
-
|
|
374
|
+
```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
|
|
375
|
+
import { useLocation } from "@tanstack/react-router";
|
|
376
|
+
import {
|
|
377
|
+
getHTMLTextDir,
|
|
378
|
+
getLocaleName,
|
|
379
|
+
getLocalizedUrl,
|
|
380
|
+
Locales,
|
|
381
|
+
} from "intlayer";
|
|
382
|
+
import { useIntlayer, useLocale } from "react-intlayer";
|
|
383
|
+
|
|
384
|
+
export default function LocaleSwitcher() {
|
|
385
|
+
const { pathname, searchStr } = useLocation();
|
|
386
|
+
const content = useIntlayer("locale-switcher");
|
|
387
|
+
|
|
388
|
+
const { availableLocales, locale, setLocale } = useLocale({
|
|
389
|
+
onLocaleChange: (newLocale) => {
|
|
390
|
+
const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
|
|
391
|
+
location.replace(pathWithLocale);
|
|
392
|
+
},
|
|
393
|
+
});
|
|
304
394
|
|
|
305
|
-
function Document({
|
|
306
|
-
locale,
|
|
307
|
-
children,
|
|
308
|
-
}: {
|
|
309
|
-
locale: string;
|
|
310
|
-
children: React.ReactNode;
|
|
311
|
-
}) {
|
|
312
395
|
return (
|
|
313
|
-
<
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
396
|
+
<select
|
|
397
|
+
aria-label={content.label.toString()}
|
|
398
|
+
onChange={(e) => setLocale(e.target.value)}
|
|
399
|
+
value={locale}
|
|
400
|
+
>
|
|
401
|
+
{availableLocales.map((localeItem) => (
|
|
402
|
+
<option
|
|
403
|
+
dir={getHTMLTextDir(localeItem)}
|
|
404
|
+
key={localeItem}
|
|
405
|
+
lang={localeItem}
|
|
406
|
+
value={localeItem}
|
|
407
|
+
>
|
|
408
|
+
{/* Exemple : Français (French) */}
|
|
409
|
+
{getLocaleName(localeItem, locale)} (
|
|
410
|
+
{getLocaleName(localeItem, Locales.ENGLISH)})
|
|
411
|
+
</option>
|
|
412
|
+
))}
|
|
413
|
+
</select>
|
|
321
414
|
);
|
|
322
415
|
}
|
|
323
|
-
|
|
324
|
-
export const Route = createRootRoute({
|
|
325
|
-
component: () => (
|
|
326
|
-
<IntlayerProvider>
|
|
327
|
-
{/* Si vous calculez la locale côté serveur, transmettez-la dans Document ; sinon le client corrigera après l'hydratation */}
|
|
328
|
-
<Document locale={document?.documentElement?.lang || "en"}>
|
|
329
|
-
<Outlet />
|
|
330
|
-
</Document>
|
|
331
|
-
</IntlayerProvider>
|
|
332
|
-
),
|
|
333
|
-
});
|
|
334
416
|
```
|
|
335
417
|
|
|
336
|
-
Pour
|
|
418
|
+
> Pour en savoir plus sur le hook `useLocale`, consultez la [documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/packages/react-intlayer/useLocale.md).
|
|
337
419
|
|
|
338
|
-
|
|
420
|
+
### Étape 10 : Ajouter la gestion des attributs HTML (optionnel)
|
|
421
|
+
|
|
422
|
+
Créez un hook pour gérer les attributs lang et dir du HTML :
|
|
423
|
+
|
|
424
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
425
|
+
// src/hooks/useI18nHTMLAttributes.tsx
|
|
426
|
+
import { getHTMLTextDir } from "intlayer";
|
|
339
427
|
import { useEffect } from "react";
|
|
340
428
|
import { useLocale } from "react-intlayer";
|
|
341
|
-
import { getHTMLTextDir } from "intlayer";
|
|
342
429
|
|
|
343
430
|
export const useI18nHTMLAttributes = () => {
|
|
344
431
|
const { locale } = useLocale();
|
|
432
|
+
|
|
345
433
|
useEffect(() => {
|
|
346
434
|
document.documentElement.lang = locale;
|
|
347
435
|
document.documentElement.dir = getHTMLTextDir(locale);
|
|
@@ -349,87 +437,185 @@ export const useI18nHTMLAttributes = () => {
|
|
|
349
437
|
};
|
|
350
438
|
```
|
|
351
439
|
|
|
352
|
-
|
|
440
|
+
Ensuite, utilisez-le dans votre composant racine :
|
|
353
441
|
|
|
354
|
-
|
|
442
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
443
|
+
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
444
|
+
import { configuration } from "intlayer";
|
|
445
|
+
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
355
446
|
|
|
356
|
-
|
|
447
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // importer le hook
|
|
357
448
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
forwardRef,
|
|
362
|
-
type AnchorHTMLAttributes,
|
|
363
|
-
type DetailedHTMLProps,
|
|
364
|
-
} from "react";
|
|
365
|
-
import { useLocale } from "react-intlayer";
|
|
449
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
450
|
+
component: LayoutComponent,
|
|
451
|
+
});
|
|
366
452
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
const hrefI18n =
|
|
379
|
-
href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
|
|
380
|
-
return (
|
|
381
|
-
<a href={hrefI18n} ref={ref} {...props}>
|
|
382
|
-
{children}
|
|
383
|
-
</a>
|
|
384
|
-
);
|
|
385
|
-
}
|
|
386
|
-
);
|
|
387
|
-
Link.displayName = "Link";
|
|
453
|
+
function LayoutComponent() {
|
|
454
|
+
useI18nHTMLAttributes(); // ajouter cette ligne
|
|
455
|
+
|
|
456
|
+
const { locale } = Route.useParams();
|
|
457
|
+
|
|
458
|
+
return (
|
|
459
|
+
<IntlayerProvider locale={locale}>
|
|
460
|
+
<Outlet />
|
|
461
|
+
</IntlayerProvider>
|
|
462
|
+
);
|
|
463
|
+
}
|
|
388
464
|
```
|
|
389
465
|
|
|
390
|
-
|
|
466
|
+
### Étape 11 : Construisez et lancez votre application
|
|
391
467
|
|
|
392
|
-
|
|
468
|
+
Construisez les dictionnaires de contenu et lancez votre application :
|
|
393
469
|
|
|
394
|
-
|
|
470
|
+
```bash packageManager="npm"
|
|
471
|
+
# Construire les dictionnaires Intlayer
|
|
472
|
+
npm run intlayer:build
|
|
473
|
+
|
|
474
|
+
# Démarrer le serveur de développement
|
|
475
|
+
npm run dev
|
|
476
|
+
```
|
|
395
477
|
|
|
396
|
-
|
|
478
|
+
```bash packageManager="pnpm"
|
|
479
|
+
# Construire les dictionnaires Intlayer
|
|
480
|
+
pnpm intlayer:build
|
|
481
|
+
|
|
482
|
+
# Démarrer le serveur de développement
|
|
483
|
+
pnpm dev
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
```bash packageManager="yarn"
|
|
487
|
+
# Construire les dictionnaires Intlayer
|
|
488
|
+
yarn intlayer:build
|
|
489
|
+
|
|
490
|
+
# Démarrer le serveur de développement
|
|
491
|
+
yarn dev
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
### Étape 12 : Configurer TypeScript (Optionnel)
|
|
495
|
+
|
|
496
|
+
Intlayer utilise l'augmentation de module pour bénéficier de TypeScript et renforcer votre base de code.
|
|
497
|
+
|
|
498
|
+
Assurez-vous que votre configuration TypeScript inclut les types générés automatiquement :
|
|
397
499
|
|
|
398
500
|
```json5 fileName="tsconfig.json"
|
|
399
501
|
{
|
|
400
|
-
|
|
502
|
+
compilerOptions: {
|
|
503
|
+
// ... vos configurations TypeScript existantes
|
|
504
|
+
},
|
|
505
|
+
include: [
|
|
506
|
+
// ... vos inclusions existantes
|
|
507
|
+
".intlayer/**/*.ts", // Inclure les types générés automatiquement
|
|
508
|
+
],
|
|
401
509
|
}
|
|
402
510
|
```
|
|
403
511
|
|
|
404
|
-
|
|
512
|
+
### Configuration Git
|
|
405
513
|
|
|
406
|
-
|
|
514
|
+
Il est recommandé d'ignorer les fichiers générés par Intlayer. Cela vous permet d'éviter de les commettre dans votre dépôt Git.
|
|
407
515
|
|
|
408
|
-
|
|
516
|
+
Pour ce faire, vous pouvez ajouter les instructions suivantes dans votre fichier `.gitignore` :
|
|
409
517
|
|
|
410
|
-
```gitignore
|
|
518
|
+
```plaintext fileName=".gitignore"
|
|
519
|
+
# Ignorer les fichiers générés par Intlayer
|
|
411
520
|
.intlayer
|
|
412
521
|
```
|
|
413
522
|
|
|
414
523
|
---
|
|
415
524
|
|
|
525
|
+
### Étape 13 : Créer une redirection (Optionnel)
|
|
526
|
+
|
|
527
|
+
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
528
|
+
function LayoutComponent() {
|
|
529
|
+
useI18nHTMLAttributes();
|
|
530
|
+
|
|
531
|
+
const { locale } = Route.useParams();
|
|
532
|
+
const { locale: selectedLocale } = useLocale();
|
|
533
|
+
const { defaultLocale } = configuration.internationalization;
|
|
534
|
+
const { prefixDefault } = configuration.middleware;
|
|
535
|
+
|
|
536
|
+
// Rediriger vers la locale par défaut si aucune locale n'est présente dans l'URL lorsque prefixDefault est vrai
|
|
537
|
+
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
538
|
+
return <Navigate replace to={defaultLocale} />;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Rediriger vers la locale sélectionnée si la locale dans l'URL ne correspond pas à la locale sélectionnée
|
|
542
|
+
if (selectedLocale !== defaultLocale && !locale) {
|
|
543
|
+
return <Navigate replace to={selectedLocale} />;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
return (
|
|
547
|
+
<IntlayerProvider locale={locale}>
|
|
548
|
+
<Outlet />
|
|
549
|
+
</IntlayerProvider>
|
|
550
|
+
);
|
|
551
|
+
}
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
## Déploiement en Production
|
|
555
|
+
|
|
556
|
+
Lors du déploiement de votre application :
|
|
557
|
+
|
|
558
|
+
1. **Construisez votre application :**
|
|
559
|
+
|
|
560
|
+
```bash
|
|
561
|
+
npm run build
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
2. **Générez les dictionnaires Intlayer :**
|
|
565
|
+
|
|
566
|
+
```bash
|
|
567
|
+
npm run intlayer:build
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
3. **Déplacez `vite-intlayer` dans les dépendances** si vous utilisez le middleware en production :
|
|
571
|
+
```bash
|
|
572
|
+
npm install vite-intlayer --save
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
Votre application prendra désormais en charge :
|
|
576
|
+
|
|
577
|
+
- **Structure des URL** : `/en`, `/en/about`, `/tr`, `/tr/about`
|
|
578
|
+
- **Détection automatique de la langue** basée sur les préférences du navigateur
|
|
579
|
+
- **Routage sensible à la langue** avec Tanstack Start
|
|
580
|
+
- **Support TypeScript** avec des types générés automatiquement
|
|
581
|
+
- **Rendu côté serveur** avec une gestion correcte de la langue
|
|
582
|
+
|
|
416
583
|
## Extension VS Code
|
|
417
584
|
|
|
418
|
-
|
|
419
|
-
|
|
585
|
+
Pour améliorer votre expérience de développement avec Intlayer, vous pouvez installer l’extension officielle **Intlayer VS Code Extension**.
|
|
586
|
+
|
|
587
|
+
[Installer depuis le Marketplace VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
588
|
+
|
|
589
|
+
Cette extension offre :
|
|
590
|
+
|
|
591
|
+
- **Autocomplétion** pour les clés de traduction.
|
|
592
|
+
- **Détection d’erreurs en temps réel** pour les traductions manquantes.
|
|
593
|
+
- **Aperçus en ligne** du contenu traduit.
|
|
594
|
+
- **Actions rapides** pour créer et mettre à jour facilement les traductions.
|
|
595
|
+
|
|
596
|
+
Pour plus de détails sur l’utilisation de l’extension, consultez la [documentation de l’extension Intlayer VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
420
597
|
|
|
421
598
|
---
|
|
422
599
|
|
|
423
|
-
## Aller
|
|
600
|
+
## Aller plus loin
|
|
424
601
|
|
|
425
|
-
|
|
426
|
-
- Mode CMS
|
|
427
|
-
- Détection de la locale à la périphérie / adaptateurs
|
|
602
|
+
Pour aller plus loin, vous pouvez implémenter l’[éditeur visuel](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_visual_editor.md) ou externaliser votre contenu en utilisant le [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/intlayer_CMS.md).
|
|
428
603
|
|
|
429
604
|
---
|
|
430
605
|
|
|
431
|
-
##
|
|
606
|
+
## Références de la documentation
|
|
607
|
+
|
|
608
|
+
- [Documentation Intlayer](https://intlayer.org)
|
|
609
|
+
- [Documentation Tanstack Start](https://reactrouter.com/)
|
|
610
|
+
- [Hook useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/packages/react-intlayer/useIntlayer.md)
|
|
611
|
+
- [Hook useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/packages/react-intlayer/useLocale.md)
|
|
612
|
+
- [Déclaration de contenu](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/dictionary/get_started.md)
|
|
613
|
+
- [Configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/configuration.md)
|
|
614
|
+
|
|
615
|
+
Ce guide complet vous fournit tout ce dont vous avez besoin pour intégrer Intlayer avec Tanstack Start afin de créer une application entièrement internationalisée avec un routage sensible à la locale et une prise en charge de TypeScript.
|
|
616
|
+
|
|
617
|
+
## Historique de la documentation
|
|
432
618
|
|
|
433
|
-
| Version | Date | Modifications
|
|
434
|
-
| ------- | ---------- |
|
|
435
|
-
|
|
|
619
|
+
| Version | Date | Modifications |
|
|
620
|
+
| ------- | ---------- | ------------------------- |
|
|
621
|
+
| 5.8.1 | 2025-09-09 | Ajout pour Tanstack Start |
|