@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,364 +1,435 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt: 2025-
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title: Getting Started with Intlayer in
|
|
5
|
-
description:
|
|
2
|
+
createdAt: 2025-09-09
|
|
3
|
+
updatedAt: 2025-09-09
|
|
4
|
+
title: Getting Started with Intlayer in Tanstack Start
|
|
5
|
+
description: Learn how to add internationalization (i18n) to your Tanstack Start application using Intlayer. Follow this comprehensive guide to make your app multilingual with locale-aware routing.
|
|
6
6
|
keywords:
|
|
7
7
|
- Internationalization
|
|
8
8
|
- Documentation
|
|
9
9
|
- Intlayer
|
|
10
|
-
-
|
|
11
|
-
- TanStack Router
|
|
10
|
+
- Tanstack Start
|
|
12
11
|
- React
|
|
13
12
|
- i18n
|
|
14
|
-
-
|
|
13
|
+
- TypeScript
|
|
14
|
+
- Locale Routing
|
|
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
|
-
# Getting Started Internationalizing (i18n) with Intlayer and
|
|
24
|
+
# Getting Started Internationalizing (i18n) with Intlayer and Tanstack Start
|
|
25
|
+
|
|
26
|
+
This guide demonstrates how to integrate **Intlayer** for seamless internationalization in Tanstack Start projects with locale-aware routing, TypeScript support, and modern development practices.
|
|
22
27
|
|
|
23
28
|
## What is Intlayer?
|
|
24
29
|
|
|
25
|
-
**Intlayer** is an open-source i18n
|
|
30
|
+
**Intlayer** is an innovative, open-source internationalization (i18n) library designed to simplify multilingual support in modern web applications.
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
- **Dynamic metadata & routes** (SEO-ready).
|
|
29
|
-
- **Runtime locale switching** (and helpers to detect/persist locales).
|
|
30
|
-
- **Vite plugin** for build-time transforms + dev DX.
|
|
32
|
+
With Intlayer, you can:
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
- **Easily manage translations** using declarative dictionaries at the component level.
|
|
35
|
+
- **Dynamically localize metadata**, routes, and content.
|
|
36
|
+
- **Ensure TypeScript support** with autogenerated types, improving autocompletion and error detection.
|
|
37
|
+
- **Benefit from advanced features**, like dynamic locale detection and switching.
|
|
38
|
+
- **Enable locale-aware routing** with Tanstack Start's file-based routing system.
|
|
33
39
|
|
|
34
40
|
---
|
|
35
41
|
|
|
36
|
-
## Step
|
|
42
|
+
## Step-by-Step Guide to Set Up Intlayer in a Tanstack Start Application
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
# npm
|
|
40
|
-
npm i intlayer react-intlayer
|
|
41
|
-
npm i -D vite-intlayer
|
|
44
|
+
### Step 1: Create Project
|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
Start by creating a new TanStack Start project by following the [Start new project](https://tanstack.com/start/latest/docs/framework/react/quick-start) guide on the TanStack Start website.
|
|
47
|
+
|
|
48
|
+
### Step 2: Install Intlayer Packages
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
Install the necessary packages using your preferred package manager:
|
|
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
|
+
The core package that provides internationalization tools for configuration management, translation, [content declaration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/get_started.md), transpilation, and [CLI commands](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_cli.md).
|
|
65
|
+
|
|
66
|
+
- **react-intlayer**
|
|
67
|
+
The package that integrates Intlayer with React application. It provides context providers and hooks for React internationalization.
|
|
68
|
+
|
|
69
|
+
- **vite-intlayer**
|
|
70
|
+
Includes the Vite plugin for integrating Intlayer with the [Vite bundler](https://vite.dev/guide/why.html#why-bundle-for-production), as well as middleware for detecting the user's preferred locale, managing cookies, and handling URL redirection.
|
|
71
|
+
|
|
72
|
+
### Step 3: Configuration of your project
|
|
57
73
|
|
|
58
|
-
|
|
74
|
+
Create a config file to configure the languages of your application:
|
|
59
75
|
|
|
60
|
-
|
|
76
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
77
|
+
import type { IntlayerConfig } from "intlayer";
|
|
61
78
|
|
|
62
|
-
|
|
63
|
-
import { Locales, type IntlayerConfig } from "intlayer";
|
|
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
|
+
// Your other locales
|
|
89
|
+
],
|
|
69
90
|
},
|
|
70
|
-
// You can also tweak: contentDir, contentFileExtensions, middleware options, 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
|
+
// Your other 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
|
+
// Your other locales
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
};
|
|
85
130
|
|
|
86
|
-
|
|
131
|
+
module.exports = config;
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
> Through this configuration file, you can set up localized URLs, middleware redirection, cookie names, the location and extension of your content declarations, disable Intlayer logs in the console, and more. For a complete list of available parameters, refer to the [configuration documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md).
|
|
135
|
+
|
|
136
|
+
### Step 4: Integrate Intlayer in Your Vite Configuration
|
|
137
|
+
|
|
138
|
+
Add the intlayer plugin into your 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
|
+
> The `intlayerPlugin()` Vite plugin is used to integrate Intlayer with Vite. It ensures the building of content declaration files and monitors them in development mode. It defines Intlayer environment variables within the Vite application. Additionally, it provides aliases to optimize performance.
|
|
102
157
|
|
|
103
|
-
|
|
158
|
+
### Step 5: Create Layout Components
|
|
104
159
|
|
|
105
|
-
|
|
160
|
+
Set up your root layout and locale-specific layouts:
|
|
106
161
|
|
|
107
|
-
|
|
162
|
+
#### Root Layout
|
|
108
163
|
|
|
109
|
-
```tsx fileName="src/
|
|
110
|
-
|
|
111
|
-
import
|
|
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
|
+
### Step 6: Declare Your Content
|
|
188
|
+
|
|
189
|
+
Create and manage your content declarations to store translations:
|
|
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
|
-
|
|
198
|
+
links: {
|
|
199
|
+
about: t({
|
|
200
|
+
en: "About",
|
|
201
|
+
es: "Acerca de",
|
|
202
|
+
fr: "À propos",
|
|
203
|
+
}),
|
|
204
|
+
home: t({
|
|
205
|
+
en: "Home",
|
|
206
|
+
es: "Inicio",
|
|
207
|
+
fr: "Accueil",
|
|
208
|
+
}),
|
|
209
|
+
},
|
|
210
|
+
meta: {
|
|
211
|
+
description: t({
|
|
212
|
+
en: "This is an example of using Intlayer with 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: "Click the logos to learn more",
|
|
144
|
-
fr: "Cliquez sur les logos pour en savoir plus",
|
|
145
|
-
es: "Haz clic en los logotipos para saber más",
|
|
218
|
+
en: "Welcome to 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
|
+
> Your content declarations can be defined anywhere in your application as soon they are included into the `contentDir` directory (by default, `./app`). And match the content declaration file extension (by default, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
154
230
|
|
|
155
|
-
>
|
|
231
|
+
> For more details, refer to the [content declaration documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/get_started.md).
|
|
156
232
|
|
|
157
|
-
|
|
233
|
+
### Step 7: Create Locale-Aware Components and Hooks
|
|
158
234
|
|
|
159
|
-
|
|
235
|
+
Create a `LocalizedLink` component for locale-aware navigation:
|
|
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
|
-
// Example of using a dictionary at the top level:
|
|
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="/">Home</RouterLink>
|
|
179
|
-
<RouterLink to="/about">About</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
|
+
Create a `useLocalizedNavigate` hook for programmatic navigation:
|
|
230
264
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
import { Locales } from "intlayer";
|
|
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";
|
|
237
270
|
import { useLocale } from "react-intlayer";
|
|
238
271
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
<div className="flex gap-2">
|
|
243
|
-
<button onClick={() => setLocale(Locales.ENGLISH)}>English</button>
|
|
244
|
-
<button onClick={() => setLocale(Locales.FRENCH)}>Français</button>
|
|
245
|
-
<button onClick={() => setLocale(Locales.SPANISH)}>Español</button>
|
|
246
|
-
</div>
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
```
|
|
272
|
+
type LocalizedNavigateOptions = {
|
|
273
|
+
to: string;
|
|
274
|
+
} & Omit<NavigateOptions, "to">;
|
|
250
275
|
|
|
251
|
-
|
|
276
|
+
export const useLocalizedNavigate = () => {
|
|
277
|
+
const navigate = useNavigate();
|
|
278
|
+
const { locale } = useLocale();
|
|
252
279
|
|
|
253
|
-
|
|
280
|
+
const isExternal = (to: string) => {
|
|
281
|
+
return /^(https?:)?\/\//.test(to);
|
|
282
|
+
};
|
|
254
283
|
|
|
255
|
-
|
|
284
|
+
const localizedNavigate = (options: LocalizedNavigateOptions) => {
|
|
285
|
+
const to = isExternal(options.to)
|
|
286
|
+
? options.to
|
|
287
|
+
: getLocalizedUrl(options.to, locale);
|
|
256
288
|
|
|
257
|
-
|
|
289
|
+
navigate({ ...options, to: to as NavigateOptions["to"] });
|
|
290
|
+
};
|
|
258
291
|
|
|
259
|
-
|
|
292
|
+
return localizedNavigate;
|
|
293
|
+
};
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Step 8: Utilize Intlayer in Your Pages
|
|
260
297
|
|
|
261
|
-
|
|
298
|
+
Access your content dictionaries throughout your application:
|
|
262
299
|
|
|
263
|
-
|
|
300
|
+
#### Root Redirect Page
|
|
264
301
|
|
|
265
|
-
```tsx fileName="src/
|
|
266
|
-
|
|
267
|
-
import { Locales, getLocalizedUrl } from "intlayer";
|
|
302
|
+
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
303
|
+
// src/routes/page.tsx
|
|
268
304
|
import { useLocale } from "react-intlayer";
|
|
305
|
+
import { Navigate } from "react-router";
|
|
269
306
|
|
|
270
|
-
export function
|
|
271
|
-
const
|
|
272
|
-
const { locale, setLocale } = useLocale();
|
|
273
|
-
|
|
274
|
-
const change = async (next: Locales) => {
|
|
275
|
-
if (next === locale) return;
|
|
276
|
-
const nextPath = getLocalizedUrl(
|
|
277
|
-
window.location.pathname + window.location.search,
|
|
278
|
-
next
|
|
279
|
-
);
|
|
280
|
-
await router.navigate({ to: nextPath }); // preserves history
|
|
281
|
-
setLocale(next);
|
|
282
|
-
};
|
|
307
|
+
export default function Page() {
|
|
308
|
+
const { locale } = useLocale();
|
|
283
309
|
|
|
284
|
-
return
|
|
285
|
-
<div className="flex gap-2">
|
|
286
|
-
<button onClick={() => change(Locales.ENGLISH)}>English</button>
|
|
287
|
-
<button onClick={() => change(Locales.FRENCH)}>Français</button>
|
|
288
|
-
<button onClick={() => change(Locales.SPANISH)}>Español</button>
|
|
289
|
-
</div>
|
|
290
|
-
);
|
|
310
|
+
return <Navigate replace to={locale} />;
|
|
291
311
|
}
|
|
292
312
|
```
|
|
293
313
|
|
|
294
|
-
|
|
314
|
+
#### Localized Home Page
|
|
295
315
|
|
|
296
|
-
|
|
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";
|
|
297
320
|
|
|
298
|
-
|
|
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
|
+
});
|
|
299
339
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
340
|
+
function RouteComponent() {
|
|
341
|
+
const content = useIntlayer("app");
|
|
342
|
+
const navigate = useLocalizedNavigate();
|
|
303
343
|
|
|
304
|
-
|
|
344
|
+
return (
|
|
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>
|
|
363
|
+
</div>
|
|
364
|
+
);
|
|
365
|
+
}
|
|
366
|
+
```
|
|
305
367
|
|
|
306
|
-
|
|
307
|
-
import appCss from "../styles.css?url";
|
|
368
|
+
> To Learn more about the `useIntlayer` hook, refer to the [documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/react-intlayer/useIntlayer.md).
|
|
308
369
|
|
|
309
|
-
|
|
310
|
-
head: () => ({
|
|
311
|
-
meta: [
|
|
312
|
-
{
|
|
313
|
-
charSet: "utf-8",
|
|
314
|
-
},
|
|
315
|
-
{
|
|
316
|
-
name: "viewport",
|
|
317
|
-
content: "width=device-width, initial-scale=1",
|
|
318
|
-
},
|
|
319
|
-
{
|
|
320
|
-
title: "TanStack Start Starter",
|
|
321
|
-
},
|
|
322
|
-
],
|
|
323
|
-
links: [
|
|
324
|
-
{
|
|
325
|
-
rel: "stylesheet",
|
|
326
|
-
href: appCss,
|
|
327
|
-
},
|
|
328
|
-
],
|
|
329
|
-
}),
|
|
370
|
+
### Step 9: Create a Locale Switcher Component
|
|
330
371
|
|
|
331
|
-
|
|
332
|
-
|
|
372
|
+
Create a component to allow users to change languages:
|
|
373
|
+
|
|
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
|
+
});
|
|
333
394
|
|
|
334
|
-
function RootDocument({ children }: { children: React.ReactNode }) {
|
|
335
395
|
return (
|
|
336
|
-
<
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
{
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
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
|
+
{/* Example: Français (French) */}
|
|
409
|
+
{getLocaleName(localeItem, locale)} (
|
|
410
|
+
{getLocaleName(localeItem, Locales.ENGLISH)})
|
|
411
|
+
</option>
|
|
412
|
+
))}
|
|
413
|
+
</select>
|
|
349
414
|
);
|
|
350
415
|
}
|
|
351
416
|
```
|
|
352
417
|
|
|
353
|
-
|
|
418
|
+
> To Learn more about the `useLocale` hook, refer to the [documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/react-intlayer/useLocale.md).
|
|
354
419
|
|
|
355
|
-
|
|
420
|
+
### Step 10: Add HTML Attributes Management (Optional)
|
|
421
|
+
|
|
422
|
+
Create a hook to manage HTML lang and dir attributes:
|
|
423
|
+
|
|
424
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
425
|
+
// src/hooks/useI18nHTMLAttributes.tsx
|
|
426
|
+
import { getHTMLTextDir } from "intlayer";
|
|
356
427
|
import { useEffect } from "react";
|
|
357
428
|
import { useLocale } from "react-intlayer";
|
|
358
|
-
import { getHTMLTextDir } from "intlayer";
|
|
359
429
|
|
|
360
430
|
export const useI18nHTMLAttributes = () => {
|
|
361
431
|
const { locale } = useLocale();
|
|
432
|
+
|
|
362
433
|
useEffect(() => {
|
|
363
434
|
document.documentElement.lang = locale;
|
|
364
435
|
document.documentElement.dir = getHTMLTextDir(locale);
|
|
@@ -366,87 +437,185 @@ export const useI18nHTMLAttributes = () => {
|
|
|
366
437
|
};
|
|
367
438
|
```
|
|
368
439
|
|
|
369
|
-
|
|
440
|
+
Then use it in your root component:
|
|
370
441
|
|
|
371
|
-
|
|
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";
|
|
372
446
|
|
|
373
|
-
|
|
447
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // import the hook
|
|
374
448
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
forwardRef,
|
|
379
|
-
type AnchorHTMLAttributes,
|
|
380
|
-
type DetailedHTMLProps,
|
|
381
|
-
} from "react";
|
|
382
|
-
import { useLocale } from "react-intlayer";
|
|
449
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
450
|
+
component: LayoutComponent,
|
|
451
|
+
});
|
|
383
452
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
const hrefI18n =
|
|
396
|
-
href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
|
|
397
|
-
return (
|
|
398
|
-
<a href={hrefI18n} ref={ref} {...props}>
|
|
399
|
-
{children}
|
|
400
|
-
</a>
|
|
401
|
-
);
|
|
402
|
-
}
|
|
403
|
-
);
|
|
404
|
-
Link.displayName = "Link";
|
|
453
|
+
function LayoutComponent() {
|
|
454
|
+
useI18nHTMLAttributes(); // add this line
|
|
455
|
+
|
|
456
|
+
const { locale } = Route.useParams();
|
|
457
|
+
|
|
458
|
+
return (
|
|
459
|
+
<IntlayerProvider locale={locale}>
|
|
460
|
+
<Outlet />
|
|
461
|
+
</IntlayerProvider>
|
|
462
|
+
);
|
|
463
|
+
}
|
|
405
464
|
```
|
|
406
465
|
|
|
407
|
-
|
|
466
|
+
### Step 11: Build and Run Your Application
|
|
408
467
|
|
|
409
|
-
|
|
468
|
+
Build the content dictionaries and run your application:
|
|
410
469
|
|
|
411
|
-
|
|
470
|
+
```bash packageManager="npm"
|
|
471
|
+
# Build Intlayer dictionaries
|
|
472
|
+
npm run intlayer:build
|
|
412
473
|
|
|
413
|
-
|
|
474
|
+
# Start development server
|
|
475
|
+
npm run dev
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
```bash packageManager="pnpm"
|
|
479
|
+
# Build Intlayer dictionaries
|
|
480
|
+
pnpm intlayer:build
|
|
481
|
+
|
|
482
|
+
# Start development server
|
|
483
|
+
pnpm dev
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
```bash packageManager="yarn"
|
|
487
|
+
# Build Intlayer dictionaries
|
|
488
|
+
yarn intlayer:build
|
|
489
|
+
|
|
490
|
+
# Start development server
|
|
491
|
+
yarn dev
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
### Step 12: Configure TypeScript (Optional)
|
|
495
|
+
|
|
496
|
+
Intlayer uses module augmentation to get benefits of TypeScript and make your codebase stronger.
|
|
497
|
+
|
|
498
|
+
Ensure your TypeScript configuration includes the autogenerated types:
|
|
414
499
|
|
|
415
500
|
```json5 fileName="tsconfig.json"
|
|
416
501
|
{
|
|
417
|
-
|
|
502
|
+
compilerOptions: {
|
|
503
|
+
// ... your existing TypeScript configurations
|
|
504
|
+
},
|
|
505
|
+
include: [
|
|
506
|
+
// ... your existing includes
|
|
507
|
+
".intlayer/**/*.ts", // Include the auto-generated types
|
|
508
|
+
],
|
|
418
509
|
}
|
|
419
510
|
```
|
|
420
511
|
|
|
421
|
-
|
|
512
|
+
### Git Configuration
|
|
422
513
|
|
|
423
|
-
|
|
514
|
+
It is recommended to ignore the files generated by Intlayer. This allows you to avoid committing them to your Git repository.
|
|
424
515
|
|
|
425
|
-
|
|
516
|
+
To do this, you can add the following instructions to your `.gitignore` file:
|
|
426
517
|
|
|
427
|
-
```gitignore
|
|
518
|
+
```plaintext fileName=".gitignore"
|
|
519
|
+
# Ignore the files generated by Intlayer
|
|
428
520
|
.intlayer
|
|
429
521
|
```
|
|
430
522
|
|
|
431
523
|
---
|
|
432
524
|
|
|
525
|
+
### Step 13: Create Redirection (Optional)
|
|
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
|
+
// Redirect to the default locale if no locale is present in the URL when prefixDefault is true
|
|
537
|
+
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
538
|
+
return <Navigate replace to={defaultLocale} />;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Redirect to the selected locale if the locale in the URL does not match the selected locale
|
|
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
|
+
## Production Deployment
|
|
555
|
+
|
|
556
|
+
When deploying your application:
|
|
557
|
+
|
|
558
|
+
1. **Build your application:**
|
|
559
|
+
|
|
560
|
+
```bash
|
|
561
|
+
npm run build
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
2. **Build Intlayer dictionaries:**
|
|
565
|
+
|
|
566
|
+
```bash
|
|
567
|
+
npm run intlayer:build
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
3. **Move `vite-intlayer` to dependencies** if using middleware in production:
|
|
571
|
+
```bash
|
|
572
|
+
npm install vite-intlayer --save
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
Your application will now support:
|
|
576
|
+
|
|
577
|
+
- **URL Structure**: `/en`, `/en/about`, `/tr`, `/tr/about`
|
|
578
|
+
- **Automatic locale detection** based on browser preferences
|
|
579
|
+
- **Locale-aware routing** with Tanstack Start
|
|
580
|
+
- **TypeScript support** with auto-generated types
|
|
581
|
+
- **Server-side rendering** with proper locale handling
|
|
582
|
+
|
|
433
583
|
## VS Code Extension
|
|
434
584
|
|
|
435
|
-
|
|
436
|
-
|
|
585
|
+
To improve your development experience with Intlayer, you can install the official **Intlayer VS Code Extension**.
|
|
586
|
+
|
|
587
|
+
[Install from the VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
588
|
+
|
|
589
|
+
This extension provides:
|
|
590
|
+
|
|
591
|
+
- **Autocompletion** for translation keys.
|
|
592
|
+
- **Real-time error detection** for missing translations.
|
|
593
|
+
- **Inline previews** of translated content.
|
|
594
|
+
- **Quick actions** to easily create and update translations.
|
|
595
|
+
|
|
596
|
+
For more details on how to use the extension, refer to the [Intlayer VS Code Extension documentation](https://intlayer.org/doc/vs-code-extension).
|
|
437
597
|
|
|
438
598
|
---
|
|
439
599
|
|
|
440
600
|
## Go Further
|
|
441
601
|
|
|
442
|
-
|
|
443
|
-
- CMS mode
|
|
444
|
-
- Locale detection on the edge / adapters
|
|
602
|
+
To go further, you can implement the [visual editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_visual_editor.md) or externalize your content using the [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_CMS.md).
|
|
445
603
|
|
|
446
604
|
---
|
|
447
605
|
|
|
606
|
+
## Documentation References
|
|
607
|
+
|
|
608
|
+
- [Intlayer Documentation](https://intlayer.org)
|
|
609
|
+
- [Tanstack Start Documentation](https://reactrouter.com/)
|
|
610
|
+
- [useIntlayer hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/react-intlayer/useIntlayer.md)
|
|
611
|
+
- [useLocale hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/packages/react-intlayer/useLocale.md)
|
|
612
|
+
- [Content Declaration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/get_started.md)
|
|
613
|
+
- [Configuration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md)
|
|
614
|
+
|
|
615
|
+
This comprehensive guide provides everything you need to integrate Intlayer with Tanstack Start for a fully internationalized application with locale-aware routing and TypeScript support.
|
|
616
|
+
|
|
448
617
|
## Doc History
|
|
449
618
|
|
|
450
|
-
| Version | Date | Changes
|
|
451
|
-
| ------- | ---------- |
|
|
452
|
-
|
|
|
619
|
+
| Version | Date | Changes |
|
|
620
|
+
| ------- | ---------- | ------------------------ |
|
|
621
|
+
| 5.8.1 | 2025-09-09 | Added for Tanstack Start |
|