@intlayer/docs 5.8.1-canary.0 → 6.0.0-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/rag_powered_documentation_assistant.md +282 -0
- package/blog/de/rag_powered_documentation_assistant.md +282 -0
- package/blog/en/rag_powered_documentation_assistant.md +289 -0
- package/blog/en-GB/rag_powered_documentation_assistant.md +284 -0
- package/blog/es/rag_powered_documentation_assistant.md +308 -0
- package/blog/fr/rag_powered_documentation_assistant.md +308 -0
- package/blog/hi/rag_powered_documentation_assistant.md +284 -0
- package/blog/it/rag_powered_documentation_assistant.md +284 -0
- package/blog/ja/rag_powered_documentation_assistant.md +284 -0
- package/blog/ko/rag_powered_documentation_assistant.md +283 -0
- package/blog/pt/rag_powered_documentation_assistant.md +284 -0
- package/blog/ru/rag_powered_documentation_assistant.md +284 -0
- package/blog/tr/index.md +69 -0
- package/blog/tr/internationalization_and_SEO.md +273 -0
- package/blog/tr/intlayer_with_i18next.md +162 -0
- package/blog/tr/intlayer_with_next-i18next.md +367 -0
- package/blog/tr/intlayer_with_next-intl.md +392 -0
- package/blog/tr/intlayer_with_react-i18next.md +346 -0
- package/blog/tr/intlayer_with_react-intl.md +345 -0
- package/blog/tr/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/tr/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/tr/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/tr/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/tr/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/tr/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/tr/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/tr/list_i18n_technologies/frameworks/svelte.md +129 -0
- package/blog/tr/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +170 -0
- package/blog/tr/rag_powered_documentation_assistant.md +284 -0
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +162 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +276 -0
- package/blog/tr/what_is_internationalization.md +166 -0
- package/blog/zh/rag_powered_documentation_assistant.md +284 -0
- package/dist/cjs/generated/blog.entry.cjs +212 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +660 -132
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +84 -0
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +6 -0
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +212 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +660 -132
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +84 -0
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +6 -0
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +5 -2
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/docs/ar/autoFill.md +41 -40
- package/docs/ar/configuration.md +202 -199
- package/docs/ar/dictionary/content_file.md +1059 -0
- package/docs/ar/intlayer_CMS.md +4 -4
- package/docs/ar/intlayer_with_nestjs.md +271 -0
- package/docs/ar/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ar/intlayer_with_react_router_v7.md +533 -0
- package/docs/ar/intlayer_with_tanstack.md +465 -299
- package/docs/ar/intlayer_with_vite+preact.md +7 -7
- package/docs/ar/intlayer_with_vite+react.md +7 -7
- package/docs/ar/intlayer_with_vite+vue.md +9 -9
- package/docs/ar/packages/vite-intlayer/index.md +3 -3
- package/docs/ar/readme.md +261 -0
- package/docs/ar/testing.md +199 -0
- package/docs/de/autoFill.md +42 -19
- package/docs/de/configuration.md +155 -147
- package/docs/de/dictionary/content_file.md +1059 -0
- package/docs/de/intlayer_CMS.md +4 -5
- package/docs/de/intlayer_with_nestjs.md +270 -0
- package/docs/de/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/de/intlayer_with_react_router_v7.md +537 -0
- package/docs/de/intlayer_with_tanstack.md +469 -302
- package/docs/de/intlayer_with_vite+preact.md +7 -7
- package/docs/de/intlayer_with_vite+react.md +7 -7
- package/docs/de/intlayer_with_vite+vue.md +9 -9
- package/docs/de/packages/vite-intlayer/index.md +3 -3
- package/docs/de/readme.md +261 -0
- package/docs/de/testing.md +200 -0
- package/docs/en/CI_CD.md +4 -6
- package/docs/en/autoFill.md +25 -5
- package/docs/en/configuration.md +45 -54
- package/docs/en/dictionary/content_file.md +1054 -0
- package/docs/en/intlayer_CMS.md +8 -7
- package/docs/en/intlayer_cli.md +112 -5
- package/docs/en/intlayer_with_nestjs.md +268 -0
- package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en/intlayer_with_react_router_v7.md +531 -0
- package/docs/en/intlayer_with_tanstack.md +463 -294
- package/docs/en/intlayer_with_vite+preact.md +8 -8
- package/docs/en/intlayer_with_vite+react.md +8 -8
- package/docs/en/intlayer_with_vite+vue.md +8 -8
- package/docs/en/packages/intlayer/getLocalizedUrl.md +102 -25
- package/docs/en/packages/vite-intlayer/index.md +3 -3
- package/docs/en/readme.md +261 -0
- package/docs/en/testing.md +200 -0
- package/docs/en-GB/autoFill.md +29 -6
- package/docs/en-GB/configuration.md +79 -71
- package/docs/en-GB/dictionary/content_file.md +1084 -0
- package/docs/en-GB/intlayer_CMS.md +4 -5
- package/docs/en-GB/intlayer_with_nestjs.md +268 -0
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en-GB/intlayer_with_react_router_v7.md +533 -0
- package/docs/en-GB/intlayer_with_tanstack.md +466 -299
- package/docs/en-GB/intlayer_with_vite+preact.md +7 -7
- package/docs/en-GB/intlayer_with_vite+react.md +7 -7
- package/docs/en-GB/intlayer_with_vite+vue.md +9 -9
- package/docs/en-GB/packages/vite-intlayer/index.md +3 -3
- package/docs/en-GB/readme.md +261 -0
- package/docs/en-GB/testing.md +200 -0
- package/docs/es/autoFill.md +45 -23
- package/docs/es/configuration.md +171 -167
- package/docs/es/dictionary/content_file.md +1088 -0
- package/docs/es/intlayer_CMS.md +4 -5
- package/docs/es/intlayer_with_nestjs.md +268 -0
- package/docs/es/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/es/intlayer_with_react_router_v7.md +533 -0
- package/docs/es/intlayer_with_tanstack.md +469 -280
- package/docs/es/intlayer_with_vite+preact.md +7 -7
- package/docs/es/intlayer_with_vite+react.md +7 -7
- package/docs/es/intlayer_with_vite+vue.md +9 -9
- package/docs/es/packages/vite-intlayer/index.md +3 -3
- package/docs/es/readme.md +261 -0
- package/docs/es/testing.md +200 -0
- package/docs/fr/autoFill.md +47 -24
- package/docs/fr/configuration.md +213 -198
- package/docs/fr/dictionary/content_file.md +1054 -0
- package/docs/fr/intlayer_CMS.md +4 -5
- package/docs/fr/intlayer_with_nestjs.md +268 -0
- package/docs/fr/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/fr/intlayer_with_react_router_v7.md +549 -0
- package/docs/fr/intlayer_with_tanstack.md +465 -279
- package/docs/fr/intlayer_with_vite+preact.md +7 -7
- package/docs/fr/intlayer_with_vite+react.md +7 -7
- package/docs/fr/intlayer_with_vite+vue.md +9 -9
- package/docs/fr/packages/vite-intlayer/index.md +3 -3
- package/docs/fr/readme.md +261 -0
- package/docs/fr/testing.md +200 -0
- package/docs/hi/autoFill.md +47 -25
- package/docs/hi/configuration.md +194 -189
- package/docs/hi/dictionary/content_file.md +1056 -0
- package/docs/hi/intlayer_CMS.md +4 -5
- package/docs/hi/intlayer_with_nestjs.md +269 -0
- package/docs/hi/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/hi/intlayer_with_react_router_v7.md +533 -0
- package/docs/hi/intlayer_with_tanstack.md +467 -282
- package/docs/hi/intlayer_with_vite+preact.md +7 -7
- package/docs/hi/intlayer_with_vite+react.md +7 -7
- package/docs/hi/intlayer_with_vite+vue.md +9 -9
- package/docs/hi/packages/vite-intlayer/index.md +3 -3
- package/docs/hi/readme.md +261 -0
- package/docs/hi/testing.md +200 -0
- package/docs/it/autoFill.md +46 -24
- package/docs/it/configuration.md +169 -161
- package/docs/it/dictionary/content_file.md +1061 -0
- package/docs/it/intlayer_CMS.md +4 -5
- package/docs/it/intlayer_with_nestjs.md +268 -0
- package/docs/it/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/it/intlayer_with_react_router_v7.md +535 -0
- package/docs/it/intlayer_with_tanstack.md +467 -301
- package/docs/it/intlayer_with_vite+preact.md +7 -7
- package/docs/it/intlayer_with_vite+react.md +7 -7
- package/docs/it/intlayer_with_vite+vue.md +9 -9
- package/docs/it/packages/vite-intlayer/index.md +3 -3
- package/docs/it/readme.md +261 -0
- package/docs/it/testing.md +200 -0
- package/docs/ja/autoFill.md +45 -23
- package/docs/ja/configuration.md +243 -204
- package/docs/ja/dictionary/content_file.md +1064 -0
- package/docs/ja/intlayer_CMS.md +4 -5
- package/docs/ja/intlayer_with_nestjs.md +268 -0
- package/docs/ja/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ja/intlayer_with_react_router_v7.md +534 -0
- package/docs/ja/intlayer_with_tanstack.md +467 -303
- package/docs/ja/intlayer_with_vite+preact.md +7 -7
- package/docs/ja/intlayer_with_vite+react.md +7 -7
- package/docs/ja/intlayer_with_vite+vue.md +9 -9
- package/docs/ja/packages/vite-intlayer/index.md +3 -3
- package/docs/ja/readme.md +263 -0
- package/docs/ja/testing.md +200 -0
- package/docs/ko/autoFill.md +39 -16
- package/docs/ko/configuration.md +217 -197
- package/docs/ko/dictionary/content_file.md +1060 -0
- package/docs/ko/intlayer_CMS.md +4 -5
- package/docs/ko/intlayer_with_nestjs.md +268 -0
- package/docs/ko/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ko/intlayer_with_react_router_v7.md +540 -0
- package/docs/ko/intlayer_with_tanstack.md +466 -302
- package/docs/ko/intlayer_with_vite+preact.md +7 -7
- package/docs/ko/intlayer_with_vite+react.md +7 -7
- package/docs/ko/intlayer_with_vite+vue.md +9 -9
- package/docs/ko/packages/vite-intlayer/index.md +3 -3
- package/docs/ko/readme.md +261 -0
- package/docs/ko/testing.md +200 -0
- package/docs/pt/autoFill.md +39 -15
- package/docs/pt/configuration.md +165 -147
- package/docs/pt/dictionary/content_file.md +1062 -0
- package/docs/pt/intlayer_CMS.md +4 -5
- package/docs/pt/intlayer_with_nestjs.md +271 -0
- package/docs/pt/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/pt/intlayer_with_react_router_v7.md +535 -0
- package/docs/pt/intlayer_with_tanstack.md +469 -300
- package/docs/pt/intlayer_with_vite+preact.md +7 -7
- package/docs/pt/intlayer_with_vite+react.md +7 -7
- package/docs/pt/intlayer_with_vite+vue.md +9 -9
- package/docs/pt/packages/vite-intlayer/index.md +3 -3
- package/docs/pt/readme.md +261 -0
- package/docs/pt/testing.md +200 -0
- package/docs/ru/autoFill.md +52 -30
- package/docs/ru/configuration.md +164 -117
- package/docs/ru/dictionary/content_file.md +1064 -0
- package/docs/ru/intlayer_CMS.md +4 -4
- package/docs/ru/intlayer_with_nestjs.md +270 -0
- package/docs/ru/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ru/intlayer_with_react_router_v7.md +534 -0
- package/docs/ru/intlayer_with_tanstack.md +470 -305
- package/docs/ru/intlayer_with_vite+preact.md +7 -7
- package/docs/ru/intlayer_with_vite+react.md +7 -7
- package/docs/ru/intlayer_with_vite+vue.md +9 -9
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/readme.md +261 -0
- package/docs/ru/testing.md +202 -0
- package/docs/tr/CI_CD.md +198 -0
- package/docs/tr/autoFill.md +201 -0
- package/docs/tr/configuration.md +585 -0
- package/docs/tr/dictionary/condition.md +243 -0
- package/docs/tr/dictionary/content_file.md +1055 -0
- package/docs/tr/dictionary/enumeration.md +251 -0
- package/docs/tr/dictionary/file.md +228 -0
- package/docs/tr/dictionary/function_fetching.md +218 -0
- package/docs/tr/dictionary/gender.md +279 -0
- package/docs/tr/dictionary/insertion.md +191 -0
- package/docs/tr/dictionary/markdown.md +385 -0
- package/docs/tr/dictionary/nesting.md +279 -0
- package/docs/tr/dictionary/translation.md +315 -0
- package/docs/tr/formatters.md +618 -0
- package/docs/tr/how_works_intlayer.md +254 -0
- package/docs/tr/index.md +168 -0
- package/docs/tr/interest_of_intlayer.md +288 -0
- package/docs/tr/intlayer_CMS.md +347 -0
- package/docs/tr/intlayer_cli.md +570 -0
- package/docs/tr/intlayer_visual_editor.md +269 -0
- package/docs/tr/intlayer_with_angular.md +694 -0
- package/docs/tr/intlayer_with_create_react_app.md +1218 -0
- package/docs/tr/intlayer_with_express.md +415 -0
- package/docs/tr/intlayer_with_lynx+react.md +511 -0
- package/docs/tr/intlayer_with_nestjs.md +268 -0
- package/docs/tr/intlayer_with_nextjs_14.md +1029 -0
- package/docs/tr/intlayer_with_nextjs_15.md +1506 -0
- package/docs/tr/intlayer_with_nextjs_page_router.md +1484 -0
- package/docs/tr/intlayer_with_nuxt.md +773 -0
- package/docs/tr/intlayer_with_react_native+expo.md +660 -0
- package/docs/tr/intlayer_with_react_router_v7.md +531 -0
- package/docs/tr/intlayer_with_tanstack.md +452 -0
- package/docs/tr/intlayer_with_vite+preact.md +1673 -0
- package/docs/tr/intlayer_with_vite+react.md +1632 -0
- package/docs/tr/intlayer_with_vite+solid.md +288 -0
- package/docs/tr/intlayer_with_vite+svelte.md +288 -0
- package/docs/tr/intlayer_with_vite+vue.md +1042 -0
- package/docs/tr/introduction.md +209 -0
- package/docs/tr/locale_mapper.md +244 -0
- package/docs/tr/mcp_server.md +207 -0
- package/docs/tr/packages/@intlayer/api/index.md +58 -0
- package/docs/tr/packages/@intlayer/chokidar/index.md +57 -0
- package/docs/tr/packages/@intlayer/cli/index.md +47 -0
- package/docs/tr/packages/@intlayer/config/index.md +142 -0
- package/docs/tr/packages/@intlayer/core/index.md +51 -0
- package/docs/tr/packages/@intlayer/design-system/index.md +47 -0
- package/docs/tr/packages/@intlayer/dictionary-entry/index.md +53 -0
- package/docs/tr/packages/@intlayer/editor/index.md +47 -0
- package/docs/tr/packages/@intlayer/editor-react/index.md +47 -0
- package/docs/tr/packages/@intlayer/webpack/index.md +61 -0
- package/docs/tr/packages/angular-intlayer/index.md +59 -0
- package/docs/tr/packages/express-intlayer/index.md +258 -0
- package/docs/tr/packages/express-intlayer/t.md +459 -0
- package/docs/tr/packages/intlayer/getConfiguration.md +151 -0
- package/docs/tr/packages/intlayer/getEnumeration.md +165 -0
- package/docs/tr/packages/intlayer/getHTMLTextDir.md +127 -0
- package/docs/tr/packages/intlayer/getLocaleLang.md +87 -0
- package/docs/tr/packages/intlayer/getLocaleName.md +124 -0
- package/docs/tr/packages/intlayer/getLocalizedUrl.md +324 -0
- package/docs/tr/packages/intlayer/getMultilingualUrls.md +225 -0
- package/docs/tr/packages/intlayer/getPathWithoutLocale.md +81 -0
- package/docs/tr/packages/intlayer/getTranslation.md +196 -0
- package/docs/tr/packages/intlayer/getTranslationContent.md +195 -0
- package/docs/tr/packages/intlayer/index.md +505 -0
- package/docs/tr/packages/intlayer-cli/index.md +71 -0
- package/docs/tr/packages/intlayer-editor/index.md +139 -0
- package/docs/tr/packages/lynx-intlayer/index.md +85 -0
- package/docs/tr/packages/next-intlayer/index.md +154 -0
- package/docs/tr/packages/next-intlayer/t.md +354 -0
- package/docs/tr/packages/next-intlayer/useDictionary.md +270 -0
- package/docs/tr/packages/next-intlayer/useIntlayer.md +265 -0
- package/docs/tr/packages/next-intlayer/useLocale.md +133 -0
- package/docs/tr/packages/nuxt-intlayer/index.md +59 -0
- package/docs/tr/packages/preact-intlayer/index.md +55 -0
- package/docs/tr/packages/react-intlayer/index.md +148 -0
- package/docs/tr/packages/react-intlayer/t.md +304 -0
- package/docs/tr/packages/react-intlayer/useDictionary.md +554 -0
- package/docs/tr/packages/react-intlayer/useI18n.md +478 -0
- package/docs/tr/packages/react-intlayer/useIntlayer.md +253 -0
- package/docs/tr/packages/react-intlayer/useLocale.md +212 -0
- package/docs/tr/packages/react-native-intlayer/index.md +85 -0
- package/docs/tr/packages/react-scripts-intlayer/index.md +82 -0
- package/docs/tr/packages/solid-intlayer/index.md +56 -0
- package/docs/tr/packages/svelte-intlayer/index.md +55 -0
- package/docs/tr/packages/vite-intlayer/index.md +82 -0
- package/docs/tr/packages/vue-intlayer/index.md +59 -0
- package/docs/tr/per_locale_file.md +321 -0
- package/docs/tr/readme.md +261 -0
- package/docs/tr/roadmap.md +338 -0
- package/docs/tr/testing.md +200 -0
- package/docs/tr/vs_code_extension.md +154 -0
- package/docs/zh/autoFill.md +40 -18
- package/docs/zh/configuration.md +245 -226
- package/docs/zh/dictionary/content_file.md +1064 -0
- package/docs/zh/intlayer_CMS.md +4 -5
- package/docs/zh/intlayer_with_nestjs.md +268 -0
- package/docs/zh/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +535 -0
- package/docs/zh/intlayer_with_tanstack.md +468 -278
- package/docs/zh/intlayer_with_vite+preact.md +7 -7
- package/docs/zh/intlayer_with_vite+react.md +7 -7
- package/docs/zh/intlayer_with_vite+vue.md +7 -7
- package/docs/zh/packages/vite-intlayer/index.md +3 -3
- package/docs/zh/readme.md +261 -0
- package/docs/zh/testing.md +198 -0
- package/frequent_questions/tr/SSR_Next_no_[locale].md +105 -0
- package/frequent_questions/tr/array_as_content_declaration.md +72 -0
- package/frequent_questions/tr/build_dictionaries.md +59 -0
- package/frequent_questions/tr/build_error_CI_CD.md +75 -0
- package/frequent_questions/tr/customized_locale_list.md +65 -0
- package/frequent_questions/tr/domain_routing.md +114 -0
- package/frequent_questions/tr/esbuild_error.md +30 -0
- package/frequent_questions/tr/get_locale_cookie.md +142 -0
- package/frequent_questions/tr/intlayer_command_undefined.md +156 -0
- package/frequent_questions/tr/locale_incorect_in_url.md +74 -0
- package/frequent_questions/tr/static_rendering.md +45 -0
- package/frequent_questions/tr/translated_path_url.md +56 -0
- package/frequent_questions/tr/unknown_command.md +98 -0
- package/legal/tr/privacy_notice.md +83 -0
- package/legal/tr/terms_of_service.md +55 -0
- package/package.json +13 -13
- package/src/generated/blog.entry.ts +212 -0
- package/src/generated/docs.entry.ts +663 -135
- package/src/generated/frequentQuestions.entry.ts +85 -1
- package/src/generated/legal.entry.ts +7 -1
- package/docs/ar/dictionary/content_extention_customization.md +0 -100
- package/docs/ar/dictionary/get_started.md +0 -527
- package/docs/de/dictionary/content_extention_customization.md +0 -100
- package/docs/de/dictionary/get_started.md +0 -531
- package/docs/en/dictionary/content_extention_customization.md +0 -102
- package/docs/en/dictionary/get_started.md +0 -529
- package/docs/en-GB/dictionary/content_extention_customization.md +0 -100
- package/docs/en-GB/dictionary/get_started.md +0 -591
- package/docs/es/dictionary/content_extention_customization.md +0 -100
- package/docs/es/dictionary/get_started.md +0 -527
- package/docs/fr/dictionary/content_extention_customization.md +0 -100
- package/docs/fr/dictionary/get_started.md +0 -527
- package/docs/hi/dictionary/content_extention_customization.md +0 -100
- package/docs/hi/dictionary/get_started.md +0 -527
- package/docs/it/dictionary/content_extention_customization.md +0 -113
- package/docs/it/dictionary/get_started.md +0 -573
- package/docs/ja/dictionary/content_extention_customization.md +0 -113
- package/docs/ja/dictionary/get_started.md +0 -576
- package/docs/ko/dictionary/content_extention_customization.md +0 -100
- package/docs/ko/dictionary/get_started.md +0 -530
- package/docs/pt/dictionary/content_extention_customization.md +0 -100
- package/docs/pt/dictionary/get_started.md +0 -532
- package/docs/ru/dictionary/content_extention_customization.md +0 -100
- package/docs/ru/dictionary/get_started.md +0 -575
- package/docs/zh/dictionary/content_extention_customization.md +0 -117
- package/docs/zh/dictionary/get_started.md +0 -533
|
@@ -1,369 +1,437 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt: 2025-
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title: Iniziare con Intlayer in
|
|
5
|
-
description:
|
|
2
|
+
createdAt: 2025-09-09
|
|
3
|
+
updatedAt: 2025-09-09
|
|
4
|
+
title: Iniziare con Intlayer in Tanstack Start
|
|
5
|
+
description: Scopri come aggiungere l'internazionalizzazione (i18n) alla tua applicazione Tanstack Start utilizzando Intlayer. Segui questa guida completa per rendere la tua app multilingue con il routing consapevole della localizzazione.
|
|
6
6
|
keywords:
|
|
7
7
|
- Internazionalizzazione
|
|
8
8
|
- Documentazione
|
|
9
9
|
- Intlayer
|
|
10
|
-
-
|
|
11
|
-
- TanStack Router
|
|
10
|
+
- Tanstack Start
|
|
12
11
|
- React
|
|
13
12
|
- i18n
|
|
14
|
-
-
|
|
13
|
+
- TypeScript
|
|
14
|
+
- Routing 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
|
-
# Iniziare con l'internazionalizzazione (i18n) usando Intlayer e
|
|
24
|
+
# Iniziare con l'internazionalizzazione (i18n) usando Intlayer e Tanstack Start
|
|
25
|
+
|
|
26
|
+
Questa guida dimostra come integrare **Intlayer** per un'internazionalizzazione senza soluzione di continuità nei progetti Tanstack Start con routing consapevole della localizzazione, supporto TypeScript e pratiche di sviluppo moderne.
|
|
22
27
|
|
|
23
28
|
## Cos'è Intlayer?
|
|
24
29
|
|
|
25
|
-
**Intlayer** è
|
|
30
|
+
**Intlayer** è una libreria innovativa e open-source per l'internazionalizzazione (i18n) progettata per semplificare il supporto multilingue nelle moderne applicazioni web.
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
- **Metadati e rotte dinamiche** (pronte per SEO).
|
|
29
|
-
- **Cambio della lingua a runtime** (e helper per rilevare/persistere le lingue).
|
|
30
|
-
- **Plugin Vite** per trasformazioni in fase di build + esperienza di sviluppo (DX).
|
|
32
|
+
Con Intlayer, puoi:
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
- **Gestire facilmente le traduzioni** utilizzando dizionari dichiarativi a livello di componente.
|
|
35
|
+
- **Localizzare dinamicamente i metadata**, le rotte e i contenuti.
|
|
36
|
+
- **Garantire il supporto TypeScript** con tipi autogenerati, migliorando l'autocompletamento e il rilevamento degli errori.
|
|
37
|
+
- **Beneficiare di funzionalità avanzate**, come il rilevamento e il cambio dinamico della localizzazione.
|
|
38
|
+
- **Abilitare il routing consapevole della localizzazione** con il sistema di routing basato su file di Tanstack Start.
|
|
33
39
|
|
|
34
40
|
---
|
|
35
41
|
|
|
36
|
-
##
|
|
42
|
+
## Guida passo-passo per configurare Intlayer in un'applicazione Tanstack Start
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
# npm
|
|
40
|
-
npm i intlayer react-intlayer
|
|
41
|
-
npm i -D vite-intlayer
|
|
44
|
+
### Passo 1: Creare il progetto
|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
Inizia creando un nuovo progetto TanStack Start seguendo la guida [Start new project](https://tanstack.com/start/latest/docs/framework/react/quick-start) sul sito di TanStack Start.
|
|
47
|
+
|
|
48
|
+
### Passo 2: Installare i pacchetti Intlayer
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
Installa i pacchetti necessari utilizzando il tuo gestore di pacchetti preferito:
|
|
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
|
+
- **intlayer**
|
|
65
|
+
|
|
66
|
+
Il pacchetto principale che fornisce strumenti di internazionalizzazione per la gestione della configurazione, la traduzione, la [dichiarazione dei contenuti](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/dictionary/get_started.md), la traspilazione e i [comandi CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_cli.md).
|
|
67
|
+
|
|
68
|
+
- **react-intlayer**
|
|
69
|
+
Il pacchetto che integra Intlayer con le applicazioni React. Fornisce provider di contesto e hook per l'internazionalizzazione in React.
|
|
70
|
+
|
|
71
|
+
- **vite-intlayer**
|
|
72
|
+
Include il plugin Vite per integrare Intlayer con il [bundler Vite](https://vite.dev/guide/why.html#why-bundle-for-production), oltre a middleware per rilevare la localizzazione preferita dall'utente, gestire i cookie e gestire il reindirizzamento degli URL.
|
|
57
73
|
|
|
58
|
-
|
|
74
|
+
### Passo 3: Configurazione del tuo progetto
|
|
59
75
|
|
|
60
|
-
Crea
|
|
76
|
+
Crea un file di configurazione per configurare le lingue della tua applicazione:
|
|
61
77
|
|
|
62
|
-
```
|
|
63
|
-
import {
|
|
78
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
79
|
+
import type { IntlayerConfig } from "intlayer";
|
|
80
|
+
|
|
81
|
+
import { Locales } from "intlayer";
|
|
64
82
|
|
|
65
83
|
const config: IntlayerConfig = {
|
|
66
84
|
internationalization: {
|
|
67
|
-
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
68
85
|
defaultLocale: Locales.ENGLISH,
|
|
86
|
+
locales: [
|
|
87
|
+
Locales.ENGLISH,
|
|
88
|
+
Locales.FRENCH,
|
|
89
|
+
Locales.SPANISH,
|
|
90
|
+
// Le tue altre lingue
|
|
91
|
+
],
|
|
69
92
|
},
|
|
70
|
-
// Puoi anche modificare: contentDir, contentFileExtensions, opzioni del middleware, ecc.
|
|
71
93
|
};
|
|
72
94
|
|
|
73
95
|
export default config;
|
|
74
96
|
```
|
|
75
97
|
|
|
76
|
-
|
|
98
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
99
|
+
import { Locales } from "intlayer";
|
|
77
100
|
|
|
78
|
-
|
|
101
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
102
|
+
const config = {
|
|
103
|
+
internationalization: {
|
|
104
|
+
defaultLocale: Locales.ENGLISH,
|
|
105
|
+
locales: [
|
|
106
|
+
Locales.ENGLISH,
|
|
107
|
+
Locales.FRENCH,
|
|
108
|
+
Locales.SPANISH,
|
|
109
|
+
// Le tue altre lingue
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
};
|
|
79
113
|
|
|
80
|
-
|
|
114
|
+
export default config;
|
|
115
|
+
```
|
|
81
116
|
|
|
82
|
-
|
|
117
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
118
|
+
const { Locales } = require("intlayer");
|
|
83
119
|
|
|
84
|
-
|
|
120
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
121
|
+
const config = {
|
|
122
|
+
internationalization: {
|
|
123
|
+
defaultLocale: Locales.ENGLISH,
|
|
124
|
+
locales: [
|
|
125
|
+
Locales.ENGLISH,
|
|
126
|
+
Locales.FRENCH,
|
|
127
|
+
Locales.SPANISH,
|
|
128
|
+
// Le tue altre lingue
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
module.exports = config;
|
|
134
|
+
```
|
|
85
135
|
|
|
86
|
-
|
|
136
|
+
> Attraverso questo file di configurazione, puoi impostare URL localizzati, reindirizzamenti middleware, nomi dei cookie, la posizione e l'estensione delle tue dichiarazioni di contenuto, disabilitare i log di Intlayer nella console e altro ancora. Per un elenco completo dei parametri disponibili, consulta la [documentazione della configurazione](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/configuration.md).
|
|
137
|
+
|
|
138
|
+
### Passo 4: Integra Intlayer nella tua configurazione Vite
|
|
139
|
+
|
|
140
|
+
Aggiungi il plugin intlayer nella tua configurazione:
|
|
141
|
+
|
|
142
|
+
```typescript fileName="vite.config.ts" codeFormat="typescript"
|
|
143
|
+
import { reactRouter } from "@react-router/dev/vite";
|
|
87
144
|
import { defineConfig } from "vite";
|
|
88
|
-
import
|
|
89
|
-
import
|
|
145
|
+
import { intlayerMiddlewarePlugin, intlayerPlugin } from "vite-intlayer";
|
|
146
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
90
147
|
|
|
91
148
|
export default defineConfig({
|
|
92
149
|
plugins: [
|
|
93
|
-
|
|
150
|
+
reactRouter(),
|
|
151
|
+
tsconfigPaths(),
|
|
94
152
|
intlayerPlugin(),
|
|
95
|
-
|
|
96
|
-
intLayerMiddlewarePlugin(),
|
|
153
|
+
intlayerMiddlewarePlugin(),
|
|
97
154
|
],
|
|
98
155
|
});
|
|
99
156
|
```
|
|
100
157
|
|
|
101
|
-
>
|
|
158
|
+
> Il plugin Vite `intlayerPlugin()` viene utilizzato per integrare Intlayer con Vite. Garantisce la creazione dei file di dichiarazione dei contenuti e li monitora in modalità sviluppo. Definisce le variabili d'ambiente di Intlayer all'interno dell'applicazione Vite. Inoltre, fornisce alias per ottimizzare le prestazioni.
|
|
102
159
|
|
|
103
|
-
|
|
160
|
+
### Passo 5: Crea i Componenti di Layout
|
|
161
|
+
|
|
162
|
+
Configura il tuo layout principale e i layout specifici per locale:
|
|
163
|
+
|
|
164
|
+
#### Layout Principale
|
|
165
|
+
|
|
166
|
+
```tsx fileName="src/routes/{-$locale}/route.tsx" codeFormat="typescript"
|
|
167
|
+
// src/routes/{-$locale}/route.tsx
|
|
168
|
+
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
169
|
+
import { configuration } from "intlayer";
|
|
170
|
+
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
171
|
+
|
|
172
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
173
|
+
|
|
174
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
175
|
+
component: LayoutComponent,
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
function LayoutComponent() {
|
|
179
|
+
const { locale } = Route.useParams();
|
|
180
|
+
|
|
181
|
+
return (
|
|
182
|
+
<IntlayerProvider locale={locale}>
|
|
183
|
+
<Outlet />
|
|
184
|
+
</IntlayerProvider>
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Passo 6: Dichiarare il Tuo Contenuto
|
|
104
190
|
|
|
105
|
-
|
|
191
|
+
Crea e gestisci le tue dichiarazioni di contenuto per memorizzare le traduzioni:
|
|
106
192
|
|
|
107
|
-
|
|
193
|
+
```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
|
|
194
|
+
import type { Dictionary } from "intlayer";
|
|
108
195
|
|
|
109
|
-
|
|
110
|
-
import { t, type Dictionary } from "intlayer";
|
|
111
|
-
import type { ReactNode } from "react";
|
|
196
|
+
import { t } from "intlayer";
|
|
112
197
|
|
|
113
198
|
const appContent = {
|
|
114
|
-
key: "app",
|
|
115
199
|
content: {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
200
|
+
links: {
|
|
201
|
+
about: t({
|
|
202
|
+
en: "About",
|
|
203
|
+
es: "Acerca de",
|
|
204
|
+
fr: "À propos",
|
|
205
|
+
}),
|
|
206
|
+
home: t({
|
|
207
|
+
en: "Home",
|
|
208
|
+
es: "Inicio",
|
|
209
|
+
fr: "Accueil",
|
|
210
|
+
}),
|
|
211
|
+
},
|
|
212
|
+
meta: {
|
|
213
|
+
description: t({
|
|
214
|
+
en: "Questo è un esempio di utilizzo di Intlayer con TanStack Router",
|
|
215
|
+
es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
|
|
216
|
+
fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
|
|
217
|
+
}),
|
|
218
|
+
},
|
|
128
219
|
title: t({
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
fr: "
|
|
132
|
-
es: "TanStack Start + React",
|
|
133
|
-
}),
|
|
134
|
-
count: t({
|
|
135
|
-
it: "il conteggio è ",
|
|
136
|
-
en: "count is ",
|
|
137
|
-
fr: "le compte est ",
|
|
138
|
-
es: "el recuento es ",
|
|
139
|
-
}),
|
|
140
|
-
edit: t<ReactNode>({
|
|
141
|
-
it: (
|
|
142
|
-
<>
|
|
143
|
-
Modifica <code>src/routes/index.tsx</code> e salva per testare HMR
|
|
144
|
-
</>
|
|
145
|
-
),
|
|
146
|
-
en: (
|
|
147
|
-
<>
|
|
148
|
-
Edit <code>src/routes/index.tsx</code> and save to test HMR
|
|
149
|
-
</>
|
|
150
|
-
),
|
|
151
|
-
fr: (
|
|
152
|
-
<>
|
|
153
|
-
Éditez <code>src/routes/index.tsx</code> et enregistrez pour tester
|
|
154
|
-
HMR
|
|
155
|
-
</>
|
|
156
|
-
),
|
|
157
|
-
es: (
|
|
158
|
-
<>
|
|
159
|
-
Edita <code>src/routes/index.tsx</code> y guarda para probar HMR
|
|
160
|
-
</>
|
|
161
|
-
),
|
|
162
|
-
}),
|
|
163
|
-
readTheDocs: t({
|
|
164
|
-
it: "Clicca sui loghi per saperne di più",
|
|
165
|
-
en: "Click the logos to learn more",
|
|
166
|
-
fr: "Cliquez sur les logos pour en savoir plus",
|
|
167
|
-
es: "Haz clic en los logotipos para saber más",
|
|
220
|
+
en: "Benvenuto in Intlayer + TanStack Router",
|
|
221
|
+
es: "Bienvenido a Intlayer + TanStack Router",
|
|
222
|
+
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
168
223
|
}),
|
|
169
224
|
},
|
|
225
|
+
key: "app",
|
|
170
226
|
} satisfies Dictionary;
|
|
171
227
|
|
|
172
228
|
export default appContent;
|
|
173
229
|
```
|
|
174
230
|
|
|
175
|
-
Le
|
|
231
|
+
> Le dichiarazioni di contenuto possono essere definite ovunque nella tua applicazione non appena vengono incluse nella directory `contentDir` (per impostazione predefinita, `./app`). E devono corrispondere all'estensione del file di dichiarazione del contenuto (per impostazione predefinita, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
176
232
|
|
|
177
|
-
>
|
|
233
|
+
> Per maggiori dettagli, consulta la [documentazione sulla dichiarazione del contenuto](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/dictionary/get_started.md).
|
|
178
234
|
|
|
179
|
-
|
|
235
|
+
### Passo 7: Crea Componenti e Hook Sensibili alla Localizzazione
|
|
180
236
|
|
|
181
|
-
|
|
237
|
+
Crea un componente `LocalizedLink` per una navigazione sensibile alla localizzazione:
|
|
182
238
|
|
|
183
|
-
|
|
239
|
+
```tsx fileName="src/components/localized-link.tsx" codeFormat="typescript"
|
|
240
|
+
// src/components/localized-link.tsx
|
|
241
|
+
// eslint-disable-next-line no-restricted-imports
|
|
242
|
+
import { Link, type LinkProps } from "@tanstack/react-router";
|
|
243
|
+
import { getLocalizedUrl } from "intlayer";
|
|
244
|
+
import { useLocale } from "react-intlayer";
|
|
184
245
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
createRootRoute,
|
|
189
|
-
Link as RouterLink,
|
|
190
|
-
} from "@tanstack/react-router";
|
|
191
|
-
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
192
|
-
|
|
193
|
-
function AppShell() {
|
|
194
|
-
// Esempio di utilizzo di un dizionario a livello superiore:
|
|
195
|
-
const content = useIntlayer("app");
|
|
246
|
+
type LocalizedLinkProps = {
|
|
247
|
+
to: string;
|
|
248
|
+
} & Omit<LinkProps, "to">;
|
|
196
249
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
<nav className="flex gap-3 p-3">
|
|
200
|
-
<RouterLink to="/">Home</RouterLink>
|
|
201
|
-
<RouterLink to="/about">Informazioni</RouterLink>
|
|
202
|
-
</nav>
|
|
203
|
-
<main className="p-6">
|
|
204
|
-
<h1>{content.title}</h1>
|
|
205
|
-
<Outlet />
|
|
206
|
-
</main>
|
|
207
|
-
</div>
|
|
208
|
-
);
|
|
209
|
-
}
|
|
250
|
+
export function LocalizedLink(props: LocalizedLinkProps) {
|
|
251
|
+
const { locale } = useLocale();
|
|
210
252
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
<AppShell />
|
|
215
|
-
</IntlayerProvider>
|
|
216
|
-
),
|
|
217
|
-
});
|
|
218
|
-
```
|
|
253
|
+
const isExternal = (to: string) => {
|
|
254
|
+
return /^(https?:)?\/\//.test(to);
|
|
255
|
+
};
|
|
219
256
|
|
|
220
|
-
|
|
257
|
+
const to = isExternal(props.to)
|
|
258
|
+
? props.to
|
|
259
|
+
: getLocalizedUrl(props.to, locale);
|
|
221
260
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
import { useIntlayer } from "react-intlayer";
|
|
225
|
-
import reactLogo from "../assets/react.svg";
|
|
226
|
-
|
|
227
|
-
export const Route = createFileRoute("/")({
|
|
228
|
-
component: () => {
|
|
229
|
-
const content = useIntlayer("app");
|
|
230
|
-
return (
|
|
231
|
-
<>
|
|
232
|
-
<button>{content.count}0</button>
|
|
233
|
-
<p>{content.edit}</p>
|
|
234
|
-
<img
|
|
235
|
-
src={reactLogo}
|
|
236
|
-
alt={content.reactLogo.value}
|
|
237
|
-
width={48}
|
|
238
|
-
height={48}
|
|
239
|
-
/>
|
|
240
|
-
<p className="opacity-70">{content.readTheDocs}</p>
|
|
241
|
-
</>
|
|
242
|
-
);
|
|
243
|
-
},
|
|
244
|
-
});
|
|
261
|
+
return <Link {...props} to={to as LinkProps["to"]} />;
|
|
262
|
+
}
|
|
245
263
|
```
|
|
246
264
|
|
|
247
|
-
|
|
248
|
-
>
|
|
249
|
-
> ```jsx
|
|
250
|
-
> <img alt={c.reactLogo.value} />
|
|
251
|
-
> ```
|
|
265
|
+
Crea un hook `useLocalizedNavigate` per la navigazione programmata:
|
|
252
266
|
|
|
253
|
-
|
|
267
|
+
```tsx fileName="src/hooks/useLocalizedNavigate.tsx" codeFormat="typescript"
|
|
268
|
+
// src/hooks/useLocalizedNavigate.tsx
|
|
269
|
+
// eslint-disable-next-line no-restricted-imports
|
|
270
|
+
import { NavigateOptions, useNavigate } from "@tanstack/react-router";
|
|
271
|
+
import { getLocalizedUrl } from "intlayer";
|
|
272
|
+
import { useLocale } from "react-intlayer";
|
|
254
273
|
|
|
255
|
-
|
|
274
|
+
type LocalizedNavigateOptions = {
|
|
275
|
+
to: string;
|
|
276
|
+
} & Omit<NavigateOptions, "to">;
|
|
256
277
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
278
|
+
export const useLocalizedNavigate = () => {
|
|
279
|
+
const navigate = useNavigate();
|
|
280
|
+
const { locale } = useLocale();
|
|
260
281
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}
|
|
282
|
+
const isExternal = (to: string) => {
|
|
283
|
+
return /^(https?:)?\/\//.test(to);
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
const localizedNavigate = (options: LocalizedNavigateOptions) => {
|
|
287
|
+
const to = isExternal(options.to)
|
|
288
|
+
? options.to
|
|
289
|
+
: getLocalizedUrl(options.to, locale);
|
|
290
|
+
|
|
291
|
+
navigate({ ...options, to: to as NavigateOptions["to"] });
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
return localizedNavigate;
|
|
295
|
+
};
|
|
271
296
|
```
|
|
272
297
|
|
|
273
|
-
|
|
298
|
+
### Passo 8: Utilizzare Intlayer nelle tue Pagine
|
|
274
299
|
|
|
275
|
-
|
|
300
|
+
Accedi ai tuoi dizionari di contenuti in tutta l'applicazione:
|
|
276
301
|
|
|
277
|
-
|
|
302
|
+
#### Pagina di Reindirizzamento Radice
|
|
278
303
|
|
|
279
|
-
|
|
304
|
+
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
305
|
+
// src/routes/page.tsx
|
|
306
|
+
import { useLocale } from "react-intlayer";
|
|
307
|
+
import { Navigate } from "react-router";
|
|
280
308
|
|
|
281
|
-
|
|
309
|
+
export default function Page() {
|
|
310
|
+
const { locale } = useLocale();
|
|
282
311
|
|
|
283
|
-
|
|
312
|
+
return <Navigate replace to={locale} />;
|
|
313
|
+
}
|
|
314
|
+
```
|
|
284
315
|
|
|
285
|
-
|
|
316
|
+
#### Pagina Home Localizzata
|
|
286
317
|
|
|
287
|
-
```tsx fileName="src/
|
|
288
|
-
import {
|
|
289
|
-
import {
|
|
290
|
-
import {
|
|
318
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
319
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
320
|
+
import { getIntlayer } from "intlayer";
|
|
321
|
+
import { useIntlayer } from "react-intlayer";
|
|
291
322
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
323
|
+
import LocaleSwitcher from "@/components/locale-switcher";
|
|
324
|
+
import { LocalizedLink } from "@/components/localized-link";
|
|
325
|
+
import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
|
|
326
|
+
|
|
327
|
+
export const Route = createFileRoute("/{-$locale}/")({
|
|
328
|
+
component: RouteComponent,
|
|
329
|
+
head: ({ params }) => {
|
|
330
|
+
const { locale } = params;
|
|
331
|
+
const metaContent = getIntlayer("app", locale);
|
|
332
|
+
|
|
333
|
+
return {
|
|
334
|
+
meta: [
|
|
335
|
+
{ title: metaContent.title },
|
|
336
|
+
{ content: metaContent.meta.description, name: "description" },
|
|
337
|
+
],
|
|
338
|
+
};
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
function RouteComponent() {
|
|
343
|
+
const content = useIntlayer("app");
|
|
344
|
+
const navigate = useLocalizedNavigate();
|
|
305
345
|
|
|
306
346
|
return (
|
|
307
|
-
<div className="
|
|
308
|
-
<
|
|
309
|
-
|
|
310
|
-
|
|
347
|
+
<div className="grid place-items-center h-screen">
|
|
348
|
+
<div className="flex flex-col gap-4 items-center text-center">
|
|
349
|
+
{content.title}
|
|
350
|
+
<LocaleSwitcher />
|
|
351
|
+
<div className="flex gap-4">
|
|
352
|
+
<a href="/">Indice</a>
|
|
353
|
+
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
354
|
+
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
355
|
+
</div>
|
|
356
|
+
<div className="flex gap-4">
|
|
357
|
+
<button onClick={() => navigate({ to: "/" })}>
|
|
358
|
+
{content.links.home}
|
|
359
|
+
</button>
|
|
360
|
+
<button onClick={() => navigate({ to: "/about" })}>
|
|
361
|
+
{content.links.about}
|
|
362
|
+
</button>
|
|
363
|
+
</div>
|
|
364
|
+
</div>
|
|
311
365
|
</div>
|
|
312
366
|
);
|
|
313
367
|
}
|
|
314
368
|
```
|
|
315
369
|
|
|
316
|
-
|
|
370
|
+
> Per saperne di più sull'hook `useIntlayer`, consulta la [documentazione](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/packages/react-intlayer/useIntlayer.md).
|
|
317
371
|
|
|
318
|
-
|
|
372
|
+
### Passo 9: Crea un componente Locale Switcher
|
|
319
373
|
|
|
320
|
-
|
|
374
|
+
Crea un componente per permettere agli utenti di cambiare lingua:
|
|
321
375
|
|
|
322
|
-
```tsx fileName="src/
|
|
323
|
-
import {
|
|
324
|
-
import {
|
|
325
|
-
|
|
376
|
+
```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
|
|
377
|
+
import { useLocation } from "@tanstack/react-router";
|
|
378
|
+
import {
|
|
379
|
+
getHTMLTextDir,
|
|
380
|
+
getLocaleName,
|
|
381
|
+
getLocalizedUrl,
|
|
382
|
+
Locales,
|
|
383
|
+
} from "intlayer";
|
|
384
|
+
import { useIntlayer, useLocale } from "react-intlayer";
|
|
385
|
+
|
|
386
|
+
export default function LocaleSwitcher() {
|
|
387
|
+
const { pathname, searchStr } = useLocation();
|
|
388
|
+
const content = useIntlayer("locale-switcher");
|
|
389
|
+
|
|
390
|
+
const { availableLocales, locale, setLocale } = useLocale({
|
|
391
|
+
onLocaleChange: (newLocale) => {
|
|
392
|
+
const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
|
|
393
|
+
location.replace(pathWithLocale);
|
|
394
|
+
},
|
|
395
|
+
});
|
|
326
396
|
|
|
327
|
-
function Document({
|
|
328
|
-
locale,
|
|
329
|
-
children,
|
|
330
|
-
}: {
|
|
331
|
-
locale: string;
|
|
332
|
-
children: React.ReactNode;
|
|
333
|
-
}) {
|
|
334
397
|
return (
|
|
335
|
-
<
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
398
|
+
<select
|
|
399
|
+
aria-label={content.label.toString()}
|
|
400
|
+
onChange={(e) => setLocale(e.target.value)}
|
|
401
|
+
value={locale}
|
|
402
|
+
>
|
|
403
|
+
{availableLocales.map((localeItem) => (
|
|
404
|
+
<option
|
|
405
|
+
dir={getHTMLTextDir(localeItem)}
|
|
406
|
+
key={localeItem}
|
|
407
|
+
lang={localeItem}
|
|
408
|
+
value={localeItem}
|
|
409
|
+
>
|
|
410
|
+
{/* Esempio: Français (Francese) */}
|
|
411
|
+
{getLocaleName(localeItem, locale)} (
|
|
412
|
+
{getLocaleName(localeItem, Locales.ENGLISH)})
|
|
413
|
+
</option>
|
|
414
|
+
))}
|
|
415
|
+
</select>
|
|
343
416
|
);
|
|
344
417
|
}
|
|
345
|
-
|
|
346
|
-
export const Route = createRootRoute({
|
|
347
|
-
component: () => (
|
|
348
|
-
<IntlayerProvider>
|
|
349
|
-
{/* Se calcoli la locale sul server, passala a Document; altrimenti il client correggerà dopo l'idratazione */}
|
|
350
|
-
<Document locale={document?.documentElement?.lang || "en"}>
|
|
351
|
-
<Outlet />
|
|
352
|
-
</Document>
|
|
353
|
-
</IntlayerProvider>
|
|
354
|
-
),
|
|
355
|
-
});
|
|
356
418
|
```
|
|
357
419
|
|
|
358
|
-
Per
|
|
420
|
+
> Per saperne di più sull'hook `useLocale`, consulta la [documentazione](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/packages/react-intlayer/useLocale.md).
|
|
421
|
+
|
|
422
|
+
### Passo 10: Aggiungere la Gestione degli Attributi HTML (Opzionale)
|
|
359
423
|
|
|
360
|
-
|
|
424
|
+
Crea un hook per gestire gli attributi lang e dir dell'HTML:
|
|
425
|
+
|
|
426
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
427
|
+
// src/hooks/useI18nHTMLAttributes.tsx
|
|
428
|
+
import { getHTMLTextDir } from "intlayer";
|
|
361
429
|
import { useEffect } from "react";
|
|
362
430
|
import { useLocale } from "react-intlayer";
|
|
363
|
-
import { getHTMLTextDir } from "intlayer";
|
|
364
431
|
|
|
365
432
|
export const useI18nHTMLAttributes = () => {
|
|
366
433
|
const { locale } = useLocale();
|
|
434
|
+
|
|
367
435
|
useEffect(() => {
|
|
368
436
|
document.documentElement.lang = locale;
|
|
369
437
|
document.documentElement.dir = getHTMLTextDir(locale);
|
|
@@ -371,87 +439,185 @@ export const useI18nHTMLAttributes = () => {
|
|
|
371
439
|
};
|
|
372
440
|
```
|
|
373
441
|
|
|
374
|
-
|
|
442
|
+
Quindi usalo nel tuo componente root:
|
|
375
443
|
|
|
376
|
-
|
|
444
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
445
|
+
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
446
|
+
import { configuration } from "intlayer";
|
|
447
|
+
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
377
448
|
|
|
378
|
-
|
|
449
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // importa il hook
|
|
379
450
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
forwardRef,
|
|
384
|
-
type AnchorHTMLAttributes,
|
|
385
|
-
type DetailedHTMLProps,
|
|
386
|
-
} from "react";
|
|
387
|
-
import { useLocale } from "react-intlayer";
|
|
451
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
452
|
+
component: LayoutComponent,
|
|
453
|
+
});
|
|
388
454
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
const hrefI18n =
|
|
401
|
-
href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
|
|
402
|
-
return (
|
|
403
|
-
<a href={hrefI18n} ref={ref} {...props}>
|
|
404
|
-
{children}
|
|
405
|
-
</a>
|
|
406
|
-
);
|
|
407
|
-
}
|
|
408
|
-
);
|
|
409
|
-
Link.displayName = "Link";
|
|
455
|
+
function LayoutComponent() {
|
|
456
|
+
useI18nHTMLAttributes(); // aggiungi questa riga
|
|
457
|
+
|
|
458
|
+
const { locale } = Route.useParams();
|
|
459
|
+
|
|
460
|
+
return (
|
|
461
|
+
<IntlayerProvider locale={locale}>
|
|
462
|
+
<Outlet />
|
|
463
|
+
</IntlayerProvider>
|
|
464
|
+
);
|
|
465
|
+
}
|
|
410
466
|
```
|
|
411
467
|
|
|
412
|
-
|
|
468
|
+
### Passo 11: Compila ed Esegui la Tua Applicazione
|
|
413
469
|
|
|
414
|
-
|
|
470
|
+
Compila i dizionari di contenuto ed esegui la tua applicazione:
|
|
415
471
|
|
|
416
|
-
|
|
472
|
+
```bash packageManager="npm"
|
|
473
|
+
# Compila i dizionari di Intlayer
|
|
474
|
+
npm run intlayer:build
|
|
417
475
|
|
|
418
|
-
|
|
476
|
+
# Avvia il server di sviluppo
|
|
477
|
+
npm run dev
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
```bash packageManager="pnpm"
|
|
481
|
+
# Compila i dizionari di Intlayer
|
|
482
|
+
pnpm intlayer:build
|
|
483
|
+
|
|
484
|
+
# Avvia il server di sviluppo
|
|
485
|
+
pnpm dev
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
```bash packageManager="yarn"
|
|
489
|
+
# Compila i dizionari di Intlayer
|
|
490
|
+
yarn intlayer:build
|
|
491
|
+
|
|
492
|
+
# Avvia il server di sviluppo
|
|
493
|
+
yarn dev
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
### Passo 12: Configura TypeScript (Opzionale)
|
|
497
|
+
|
|
498
|
+
Intlayer utilizza l'augmentazione dei moduli per sfruttare i vantaggi di TypeScript e rendere il tuo codice più robusto.
|
|
499
|
+
|
|
500
|
+
Assicurati che la tua configurazione di TypeScript includa i tipi generati automaticamente:
|
|
419
501
|
|
|
420
502
|
```json5 fileName="tsconfig.json"
|
|
421
503
|
{
|
|
422
|
-
|
|
504
|
+
compilerOptions: {
|
|
505
|
+
// ... le tue configurazioni TypeScript esistenti
|
|
506
|
+
},
|
|
507
|
+
include: [
|
|
508
|
+
// ... i tuoi include esistenti
|
|
509
|
+
".intlayer/**/*.ts", // Includi i tipi generati automaticamente
|
|
510
|
+
],
|
|
423
511
|
}
|
|
424
512
|
```
|
|
425
513
|
|
|
426
|
-
|
|
514
|
+
### Configurazione Git
|
|
427
515
|
|
|
428
|
-
|
|
516
|
+
Si consiglia di ignorare i file generati da Intlayer. Questo ti permette di evitare di committarli nel tuo repository Git.
|
|
429
517
|
|
|
430
|
-
|
|
518
|
+
Per farlo, puoi aggiungere le seguenti istruzioni al tuo file `.gitignore`:
|
|
431
519
|
|
|
432
|
-
```gitignore
|
|
520
|
+
```plaintext fileName=".gitignore"
|
|
521
|
+
# Ignora i file generati da Intlayer
|
|
433
522
|
.intlayer
|
|
434
523
|
```
|
|
435
524
|
|
|
436
525
|
---
|
|
437
526
|
|
|
527
|
+
### Passo 13: Crea un Reindirizzamento (Opzionale)
|
|
528
|
+
|
|
529
|
+
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
530
|
+
function LayoutComponent() {
|
|
531
|
+
useI18nHTMLAttributes();
|
|
532
|
+
|
|
533
|
+
const { locale } = Route.useParams();
|
|
534
|
+
const { locale: selectedLocale } = useLocale();
|
|
535
|
+
const { defaultLocale } = configuration.internationalization;
|
|
536
|
+
const { prefixDefault } = configuration.middleware;
|
|
537
|
+
|
|
538
|
+
// Reindirizza alla lingua predefinita se non è presente alcuna lingua nell'URL quando prefixDefault è true
|
|
539
|
+
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
540
|
+
return <Navigate replace to={defaultLocale} />;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// Reindirizza alla lingua selezionata se la lingua nell'URL non corrisponde a quella selezionata
|
|
544
|
+
if (selectedLocale !== defaultLocale && !locale) {
|
|
545
|
+
return <Navigate replace to={selectedLocale} />;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
return (
|
|
549
|
+
<IntlayerProvider locale={locale}>
|
|
550
|
+
<Outlet />
|
|
551
|
+
</IntlayerProvider>
|
|
552
|
+
);
|
|
553
|
+
}
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
## Distribuzione in Produzione
|
|
557
|
+
|
|
558
|
+
Quando distribuisci la tua applicazione:
|
|
559
|
+
|
|
560
|
+
1. **Compila la tua applicazione:**
|
|
561
|
+
|
|
562
|
+
```bash
|
|
563
|
+
npm run build
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
2. **Compila i dizionari di Intlayer:**
|
|
567
|
+
|
|
568
|
+
```bash
|
|
569
|
+
npm run intlayer:build
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
3. **Sposta `vite-intlayer` nelle dipendenze** se usi il middleware in produzione:
|
|
573
|
+
```bash
|
|
574
|
+
npm install vite-intlayer --save
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
La tua applicazione supporterà ora:
|
|
578
|
+
|
|
579
|
+
- **Struttura URL**: `/en`, `/en/about`, `/tr`, `/tr/about`
|
|
580
|
+
- **Rilevamento automatico della lingua** basato sulle preferenze del browser
|
|
581
|
+
- **Routing consapevole della lingua** con Tanstack Start
|
|
582
|
+
- **Supporto TypeScript** con tipi generati automaticamente
|
|
583
|
+
- **Rendering lato server** con gestione corretta della lingua
|
|
584
|
+
|
|
438
585
|
## Estensione VS Code
|
|
439
586
|
|
|
440
|
-
|
|
441
|
-
|
|
587
|
+
Per migliorare la tua esperienza di sviluppo con Intlayer, puoi installare l'**Estensione Intlayer per VS Code** ufficiale.
|
|
588
|
+
|
|
589
|
+
[Installa dal Marketplace di VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
590
|
+
|
|
591
|
+
Questa estensione offre:
|
|
592
|
+
|
|
593
|
+
- **Completamento automatico** per le chiavi di traduzione.
|
|
594
|
+
- **Rilevamento errori in tempo reale** per traduzioni mancanti.
|
|
595
|
+
- **Anteprime inline** dei contenuti tradotti.
|
|
596
|
+
- **Azioni rapide** per creare e aggiornare facilmente le traduzioni.
|
|
597
|
+
|
|
598
|
+
Per maggiori dettagli su come utilizzare l'estensione, consulta la [documentazione dell'Estensione Intlayer per VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
442
599
|
|
|
443
600
|
---
|
|
444
601
|
|
|
445
|
-
##
|
|
602
|
+
## Vai oltre
|
|
446
603
|
|
|
447
|
-
|
|
448
|
-
- Modalità CMS
|
|
449
|
-
- Rilevamento della lingua al confine / adattatori
|
|
604
|
+
Per andare oltre, puoi implementare l'[editor visuale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_visual_editor.md) oppure esternalizzare i tuoi contenuti utilizzando il [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_CMS.md).
|
|
450
605
|
|
|
451
606
|
---
|
|
452
607
|
|
|
453
|
-
##
|
|
608
|
+
## Riferimenti alla Documentazione
|
|
609
|
+
|
|
610
|
+
- [Documentazione Intlayer](https://intlayer.org)
|
|
611
|
+
- [Documentazione Tanstack Start](https://reactrouter.com/)
|
|
612
|
+
- [Hook useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/packages/react-intlayer/useIntlayer.md)
|
|
613
|
+
- [Hook useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/packages/react-intlayer/useLocale.md)
|
|
614
|
+
- [Dichiarazione dei Contenuti](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/dictionary/get_started.md)
|
|
615
|
+
- [Configurazione](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/configuration.md)
|
|
616
|
+
|
|
617
|
+
Questa guida completa fornisce tutto il necessario per integrare Intlayer con Tanstack Start per un'applicazione completamente internazionalizzata con routing consapevole della localizzazione e supporto TypeScript.
|
|
618
|
+
|
|
619
|
+
## Cronologia della Documentazione
|
|
454
620
|
|
|
455
|
-
| Versione | Data | Modifiche
|
|
456
|
-
| -------- | ---------- |
|
|
457
|
-
|
|
|
621
|
+
| Versione | Data | Modifiche |
|
|
622
|
+
| -------- | ---------- | --------------------------- |
|
|
623
|
+
| 5.8.1 | 2025-09-09 | Aggiunto per Tanstack Start |
|