@intlayer/docs 5.8.1 → 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 +12 -12
- package/src/generated/blog.entry.ts +212 -0
- package/src/generated/docs.entry.ts +663 -135
- package/src/generated/frequentQuestions.entry.ts +85 -1
- package/src/generated/legal.entry.ts +7 -1
- package/docs/ar/dictionary/content_extention_customization.md +0 -100
- package/docs/ar/dictionary/get_started.md +0 -527
- package/docs/de/dictionary/content_extention_customization.md +0 -100
- package/docs/de/dictionary/get_started.md +0 -531
- package/docs/en/dictionary/content_extention_customization.md +0 -102
- package/docs/en/dictionary/get_started.md +0 -529
- package/docs/en-GB/dictionary/content_extention_customization.md +0 -100
- package/docs/en-GB/dictionary/get_started.md +0 -591
- package/docs/es/dictionary/content_extention_customization.md +0 -100
- package/docs/es/dictionary/get_started.md +0 -527
- package/docs/fr/dictionary/content_extention_customization.md +0 -100
- package/docs/fr/dictionary/get_started.md +0 -527
- package/docs/hi/dictionary/content_extention_customization.md +0 -100
- package/docs/hi/dictionary/get_started.md +0 -527
- package/docs/it/dictionary/content_extention_customization.md +0 -113
- package/docs/it/dictionary/get_started.md +0 -573
- package/docs/ja/dictionary/content_extention_customization.md +0 -113
- package/docs/ja/dictionary/get_started.md +0 -576
- package/docs/ko/dictionary/content_extention_customization.md +0 -100
- package/docs/ko/dictionary/get_started.md +0 -530
- package/docs/pt/dictionary/content_extention_customization.md +0 -100
- package/docs/pt/dictionary/get_started.md +0 -532
- package/docs/ru/dictionary/content_extention_customization.md +0 -100
- package/docs/ru/dictionary/get_started.md +0 -575
- package/docs/zh/dictionary/content_extention_customization.md +0 -117
- package/docs/zh/dictionary/get_started.md +0 -533
|
@@ -1,347 +1,438 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt: 2025-
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title: Comenzando con Intlayer en
|
|
5
|
-
description:
|
|
2
|
+
createdAt: 2025-09-09
|
|
3
|
+
updatedAt: 2025-09-09
|
|
4
|
+
title: Comenzando con Intlayer en Tanstack Start
|
|
5
|
+
description: Aprende cómo agregar internacionalización (i18n) a tu aplicación Tanstack Start usando Intlayer. Sigue esta guía completa para hacer tu aplicación multilingüe con enrutamiento consciente del locale.
|
|
6
6
|
keywords:
|
|
7
7
|
- Internacionalización
|
|
8
8
|
- Documentación
|
|
9
9
|
- Intlayer
|
|
10
|
-
-
|
|
11
|
-
- TanStack Router
|
|
10
|
+
- Tanstack Start
|
|
12
11
|
- React
|
|
13
12
|
- i18n
|
|
14
|
-
-
|
|
13
|
+
- TypeScript
|
|
14
|
+
- Enrutamiento por 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
|
-
# Comenzando con la
|
|
24
|
+
# Comenzando con la Internacionalización (i18n) usando Intlayer y Tanstack Start
|
|
25
|
+
|
|
26
|
+
Esta guía demuestra cómo integrar **Intlayer** para una internacionalización fluida en proyectos Tanstack Start con enrutamiento consciente del locale, soporte para TypeScript y prácticas modernas de desarrollo.
|
|
22
27
|
|
|
23
28
|
## ¿Qué es Intlayer?
|
|
24
29
|
|
|
25
|
-
**Intlayer** es
|
|
30
|
+
**Intlayer** es una biblioteca innovadora y de código abierto para internacionalización (i18n) diseñada para simplificar el soporte multilingüe en aplicaciones web modernas.
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
- **Metadatos y rutas dinámicas** (preparadas para SEO).
|
|
29
|
-
- **Cambio de idioma en tiempo de ejecución** (y ayudas para detectar/persistir locales).
|
|
30
|
-
- **Plugin de Vite** para transformaciones en tiempo de compilación + experiencia de desarrollo (DX).
|
|
32
|
+
Con Intlayer, puedes:
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
- **Gestionar traducciones fácilmente** usando diccionarios declarativos a nivel de componente.
|
|
35
|
+
- **Localizar dinámicamente metadatos**, rutas y contenido.
|
|
36
|
+
- **Garantizar soporte para TypeScript** con tipos autogenerados, mejorando la autocompletación y la detección de errores.
|
|
37
|
+
- **Beneficiarte de características avanzadas**, como la detección y cambio dinámico de locale.
|
|
38
|
+
- **Habilitar enrutamiento consciente del locale** con el sistema de enrutamiento basado en archivos de Tanstack Start.
|
|
33
39
|
|
|
34
40
|
---
|
|
35
41
|
|
|
36
|
-
##
|
|
42
|
+
## Guía paso a paso para configurar Intlayer en una aplicación Tanstack Start
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
# npm
|
|
40
|
-
npm i intlayer react-intlayer
|
|
41
|
-
npm i -D vite-intlayer
|
|
44
|
+
### Paso 1: Crear el proyecto
|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
Comienza creando un nuevo proyecto TanStack Start siguiendo la guía [Start new project](https://tanstack.com/start/latest/docs/framework/react/quick-start) en el sitio web de TanStack Start.
|
|
47
|
+
|
|
48
|
+
### Paso 2: Instalar los paquetes de Intlayer
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
Instala los paquetes necesarios usando tu gestor de paquetes preferido:
|
|
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
|
+
El paquete principal que proporciona herramientas de internacionalización para la gestión de configuración, traducción, [declaración de contenido](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/get_started.md), transpilación y [comandos CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_cli.md).
|
|
67
|
+
|
|
68
|
+
- **react-intlayer**
|
|
69
|
+
El paquete que integra Intlayer con aplicaciones React. Proporciona proveedores de contexto y hooks para la internacionalización en React.
|
|
70
|
+
|
|
71
|
+
- **vite-intlayer**
|
|
72
|
+
Incluye el plugin de Vite para integrar Intlayer con el [empaquetador Vite](https://vite.dev/guide/why.html#why-bundle-for-production), así como middleware para detectar el locale preferido del usuario, gestionar cookies y manejar redirecciones de URL.
|
|
57
73
|
|
|
58
|
-
|
|
74
|
+
### Paso 3: Configuración de tu proyecto
|
|
59
75
|
|
|
60
|
-
Crea
|
|
76
|
+
Crea un archivo de configuración para configurar los idiomas de tu aplicación:
|
|
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
|
+
// Tus otros idiomas
|
|
91
|
+
],
|
|
69
92
|
},
|
|
70
|
-
// También puedes ajustar: contentDir, contentFileExtensions, opciones de middleware, etc.
|
|
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
|
+
// Tus otros idiomas
|
|
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
|
+
// Tus otros idiomas
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
module.exports = config;
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
> A través de este archivo de configuración, puedes configurar URLs localizadas, redirección de middleware, nombres de cookies, la ubicación y extensión de tus declaraciones de contenido, desactivar los registros de Intlayer en la consola y más. Para una lista completa de los parámetros disponibles, consulta la [documentación de configuración](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/configuration.md).
|
|
137
|
+
|
|
138
|
+
### Paso 4: Integra Intlayer en tu configuración de Vite
|
|
85
139
|
|
|
86
|
-
|
|
140
|
+
Agrega el plugin intlayer en tu configuración:
|
|
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
|
+
> El plugin `intlayerPlugin()` de Vite se utiliza para integrar Intlayer con Vite. Asegura la construcción de los archivos de declaración de contenido y los supervisa en modo desarrollo. Define las variables de entorno de Intlayer dentro de la aplicación Vite. Además, proporciona alias para optimizar el rendimiento.
|
|
102
159
|
|
|
103
|
-
|
|
160
|
+
### Paso 5: Crear Componentes de Layout
|
|
161
|
+
|
|
162
|
+
Configura tu layout raíz y los layouts específicos por locale:
|
|
163
|
+
|
|
164
|
+
#### Layout Raíz
|
|
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
|
+
```
|
|
104
188
|
|
|
105
|
-
|
|
189
|
+
### Paso 6: Declara Tu Contenido
|
|
106
190
|
|
|
107
|
-
|
|
191
|
+
Crea y gestiona tus declaraciones de contenido para almacenar traducciones:
|
|
108
192
|
|
|
109
|
-
```tsx fileName="src/
|
|
110
|
-
import {
|
|
111
|
-
|
|
193
|
+
```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
|
|
194
|
+
import type { Dictionary } from "intlayer";
|
|
195
|
+
|
|
196
|
+
import { t } from "intlayer";
|
|
112
197
|
|
|
113
198
|
const appContent = {
|
|
114
|
-
key: "app",
|
|
115
199
|
content: {
|
|
116
|
-
|
|
117
|
-
|
|
200
|
+
links: {
|
|
201
|
+
about: t({
|
|
202
|
+
en: "About",
|
|
203
|
+
es: "Acerca de",
|
|
204
|
+
fr: "À propos",
|
|
205
|
+
}),
|
|
206
|
+
home: t({
|
|
207
|
+
en: "Inicio",
|
|
208
|
+
es: "Inicio",
|
|
209
|
+
fr: "Accueil",
|
|
210
|
+
}),
|
|
211
|
+
},
|
|
212
|
+
meta: {
|
|
213
|
+
description: t({
|
|
214
|
+
en: "Este es un ejemplo de uso de 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
|
+
},
|
|
118
219
|
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
|
-
Edita <code>src/routes/index.tsx</code> y guarda para probar 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: "Haz clic en los logotipos para saber más",
|
|
144
|
-
fr: "Cliquez sur les logos pour en savoir plus",
|
|
145
|
-
es: "Haz clic en los logotipos para saber más",
|
|
220
|
+
en: "Bienvenido a Intlayer + TanStack Router",
|
|
221
|
+
es: "Bienvenido a Intlayer + TanStack Router",
|
|
222
|
+
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
146
223
|
}),
|
|
147
224
|
},
|
|
225
|
+
key: "app",
|
|
148
226
|
} satisfies Dictionary;
|
|
149
227
|
|
|
150
228
|
export default appContent;
|
|
151
229
|
```
|
|
152
230
|
|
|
153
|
-
|
|
231
|
+
> Tus declaraciones de contenido pueden definirse en cualquier parte de tu aplicación tan pronto como se incluyan en el directorio `contentDir` (por defecto, `./app`). Y deben coincidir con la extensión del archivo de declaración de contenido (por defecto, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
154
232
|
|
|
155
|
-
>
|
|
233
|
+
> Para más detalles, consulta la [documentación de declaración de contenido](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/get_started.md).
|
|
156
234
|
|
|
157
|
-
|
|
235
|
+
### Paso 7: Crear Componentes y Hooks Sensibles al Idioma
|
|
158
236
|
|
|
159
|
-
|
|
237
|
+
Crea un componente `LocalizedLink` para navegación sensible al idioma:
|
|
160
238
|
|
|
161
|
-
|
|
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";
|
|
162
245
|
|
|
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
|
-
// Ejemplo de uso de un diccionario en el nivel superior:
|
|
173
|
-
const content = useIntlayer("app");
|
|
246
|
+
type LocalizedLinkProps = {
|
|
247
|
+
to: string;
|
|
248
|
+
} & Omit<LinkProps, "to">;
|
|
174
249
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
<nav className="flex gap-3 p-3">
|
|
178
|
-
<RouterLink to="/">Inicio</RouterLink>
|
|
179
|
-
<RouterLink to="/about">Acerca de</RouterLink>
|
|
180
|
-
</nav>
|
|
181
|
-
<main className="p-6">
|
|
182
|
-
<h1>{content.title}</h1>
|
|
183
|
-
<Outlet />
|
|
184
|
-
</main>
|
|
185
|
-
</div>
|
|
186
|
-
);
|
|
187
|
-
}
|
|
250
|
+
export function LocalizedLink(props: LocalizedLinkProps) {
|
|
251
|
+
const { locale } = useLocale();
|
|
188
252
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
<AppShell />
|
|
193
|
-
</IntlayerProvider>
|
|
194
|
-
),
|
|
195
|
-
});
|
|
196
|
-
```
|
|
253
|
+
const isExternal = (to: string) => {
|
|
254
|
+
return /^(https?:)?\/\//.test(to);
|
|
255
|
+
};
|
|
197
256
|
|
|
198
|
-
|
|
257
|
+
const to = isExternal(props.to)
|
|
258
|
+
? props.to
|
|
259
|
+
: getLocalizedUrl(props.to, locale);
|
|
199
260
|
|
|
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
|
-
});
|
|
261
|
+
return <Link {...props} to={to as LinkProps["to"]} />;
|
|
262
|
+
}
|
|
223
263
|
```
|
|
224
264
|
|
|
225
|
-
|
|
226
|
-
>
|
|
227
|
-
> ```jsx
|
|
228
|
-
> <img alt={c.reactLogo.value} />
|
|
229
|
-
> ```
|
|
265
|
+
Crea un hook `useLocalizedNavigate` para la navegación programática:
|
|
230
266
|
|
|
231
|
-
|
|
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";
|
|
232
273
|
|
|
233
|
-
|
|
274
|
+
type LocalizedNavigateOptions = {
|
|
275
|
+
to: string;
|
|
276
|
+
} & Omit<NavigateOptions, "to">;
|
|
234
277
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
278
|
+
export const useLocalizedNavigate = () => {
|
|
279
|
+
const navigate = useNavigate();
|
|
280
|
+
const { locale } = useLocale();
|
|
238
281
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
282
|
+
const isExternal = (to: string) => {
|
|
283
|
+
// Comprueba si la URL es externa
|
|
284
|
+
return /^(https?:)?\/\//.test(to);
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
const localizedNavigate = (options: LocalizedNavigateOptions) => {
|
|
288
|
+
const to = isExternal(options.to)
|
|
289
|
+
? options.to
|
|
290
|
+
: getLocalizedUrl(options.to, locale);
|
|
291
|
+
|
|
292
|
+
navigate({ ...options, to: to as NavigateOptions["to"] });
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
return localizedNavigate;
|
|
296
|
+
};
|
|
249
297
|
```
|
|
250
298
|
|
|
251
|
-
|
|
299
|
+
### Paso 8: Utiliza Intlayer en tus Páginas
|
|
252
300
|
|
|
253
|
-
|
|
301
|
+
Accede a tus diccionarios de contenido en toda tu aplicación:
|
|
254
302
|
|
|
255
|
-
|
|
303
|
+
#### Página de Redirección Raíz
|
|
256
304
|
|
|
257
|
-
|
|
305
|
+
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
306
|
+
// src/routes/page.tsx
|
|
307
|
+
import { useLocale } from "react-intlayer";
|
|
308
|
+
import { Navigate } from "react-router";
|
|
258
309
|
|
|
259
|
-
|
|
310
|
+
export default function Page() {
|
|
311
|
+
const { locale } = useLocale();
|
|
260
312
|
|
|
261
|
-
|
|
313
|
+
return <Navigate replace to={locale} />;
|
|
314
|
+
}
|
|
315
|
+
```
|
|
262
316
|
|
|
263
|
-
|
|
317
|
+
#### Página de Inicio Localizada
|
|
264
318
|
|
|
265
|
-
```tsx fileName="src/
|
|
266
|
-
import {
|
|
267
|
-
import {
|
|
268
|
-
import {
|
|
319
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
320
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
321
|
+
import { getIntlayer } from "intlayer";
|
|
322
|
+
import { useIntlayer } from "react-intlayer";
|
|
269
323
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
324
|
+
import LocaleSwitcher from "@/components/locale-switcher";
|
|
325
|
+
import { LocalizedLink } from "@/components/localized-link";
|
|
326
|
+
import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
|
|
327
|
+
|
|
328
|
+
export const Route = createFileRoute("/{-$locale}/")({
|
|
329
|
+
component: RouteComponent,
|
|
330
|
+
head: ({ params }) => {
|
|
331
|
+
const { locale } = params;
|
|
332
|
+
const metaContent = getIntlayer("app", locale);
|
|
333
|
+
|
|
334
|
+
return {
|
|
335
|
+
meta: [
|
|
336
|
+
{ title: metaContent.title },
|
|
337
|
+
{ content: metaContent.meta.description, name: "description" },
|
|
338
|
+
],
|
|
339
|
+
};
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
function RouteComponent() {
|
|
344
|
+
const content = useIntlayer("app");
|
|
345
|
+
const navigate = useLocalizedNavigate();
|
|
283
346
|
|
|
284
347
|
return (
|
|
285
|
-
<div className="
|
|
286
|
-
<
|
|
287
|
-
|
|
288
|
-
|
|
348
|
+
<div className="grid place-items-center h-screen">
|
|
349
|
+
<div className="flex flex-col gap-4 items-center text-center">
|
|
350
|
+
{content.title}
|
|
351
|
+
<LocaleSwitcher />
|
|
352
|
+
<div className="flex gap-4">
|
|
353
|
+
<a href="/">Índice</a>
|
|
354
|
+
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
355
|
+
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
356
|
+
</div>
|
|
357
|
+
<div className="flex gap-4">
|
|
358
|
+
<button onClick={() => navigate({ to: "/" })}>
|
|
359
|
+
{content.links.home}
|
|
360
|
+
</button>
|
|
361
|
+
<button onClick={() => navigate({ to: "/about" })}>
|
|
362
|
+
{content.links.about}
|
|
363
|
+
</button>
|
|
364
|
+
</div>
|
|
365
|
+
</div>
|
|
289
366
|
</div>
|
|
290
367
|
);
|
|
291
368
|
}
|
|
292
369
|
```
|
|
293
370
|
|
|
294
|
-
|
|
371
|
+
> Para aprender más sobre el hook `useIntlayer`, consulta la [documentación](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/useIntlayer.md).
|
|
295
372
|
|
|
296
|
-
|
|
373
|
+
### Paso 9: Crear un Componente para Cambiar de Idioma
|
|
297
374
|
|
|
298
|
-
|
|
375
|
+
Crea un componente para permitir a los usuarios cambiar de idioma:
|
|
299
376
|
|
|
300
|
-
```tsx fileName="src/
|
|
301
|
-
import {
|
|
302
|
-
import {
|
|
303
|
-
|
|
377
|
+
```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
|
|
378
|
+
import { useLocation } from "@tanstack/react-router";
|
|
379
|
+
import {
|
|
380
|
+
getHTMLTextDir,
|
|
381
|
+
getLocaleName,
|
|
382
|
+
getLocalizedUrl,
|
|
383
|
+
Locales,
|
|
384
|
+
} from "intlayer";
|
|
385
|
+
import { useIntlayer, useLocale } from "react-intlayer";
|
|
386
|
+
|
|
387
|
+
export default function LocaleSwitcher() {
|
|
388
|
+
const { pathname, searchStr } = useLocation();
|
|
389
|
+
const content = useIntlayer("locale-switcher");
|
|
390
|
+
|
|
391
|
+
const { availableLocales, locale, setLocale } = useLocale({
|
|
392
|
+
onLocaleChange: (newLocale) => {
|
|
393
|
+
const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
|
|
394
|
+
location.replace(pathWithLocale);
|
|
395
|
+
},
|
|
396
|
+
});
|
|
304
397
|
|
|
305
|
-
function Document({
|
|
306
|
-
locale,
|
|
307
|
-
children,
|
|
308
|
-
}: {
|
|
309
|
-
locale: string;
|
|
310
|
-
children: React.ReactNode;
|
|
311
|
-
}) {
|
|
312
398
|
return (
|
|
313
|
-
<
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
399
|
+
<select
|
|
400
|
+
aria-label={content.label.toString()}
|
|
401
|
+
onChange={(e) => setLocale(e.target.value)}
|
|
402
|
+
value={locale}
|
|
403
|
+
>
|
|
404
|
+
{availableLocales.map((localeItem) => (
|
|
405
|
+
<option
|
|
406
|
+
dir={getHTMLTextDir(localeItem)}
|
|
407
|
+
key={localeItem}
|
|
408
|
+
lang={localeItem}
|
|
409
|
+
value={localeItem}
|
|
410
|
+
>
|
|
411
|
+
{/* Ejemplo: Français (Francés) */}
|
|
412
|
+
{getLocaleName(localeItem, locale)} (
|
|
413
|
+
{getLocaleName(localeItem, Locales.ENGLISH)})
|
|
414
|
+
</option>
|
|
415
|
+
))}
|
|
416
|
+
</select>
|
|
321
417
|
);
|
|
322
418
|
}
|
|
323
|
-
|
|
324
|
-
export const Route = createRootRoute({
|
|
325
|
-
component: () => (
|
|
326
|
-
<IntlayerProvider>
|
|
327
|
-
{/* Si calculas el locale en el servidor, pásalo al Document; de lo contrario, el cliente lo corregirá después de la hidratación */}
|
|
328
|
-
<Document locale={document?.documentElement?.lang || "en"}>
|
|
329
|
-
<Outlet />
|
|
330
|
-
</Document>
|
|
331
|
-
</IntlayerProvider>
|
|
332
|
-
),
|
|
333
|
-
});
|
|
334
419
|
```
|
|
335
420
|
|
|
336
|
-
Para
|
|
421
|
+
> Para aprender más sobre el hook `useLocale`, consulta la [documentación](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/useLocale.md).
|
|
422
|
+
|
|
423
|
+
### Paso 10: Añadir gestión de atributos HTML (Opcional)
|
|
424
|
+
|
|
425
|
+
Crea un hook para gestionar los atributos lang y dir en HTML:
|
|
337
426
|
|
|
338
|
-
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
427
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
428
|
+
// src/hooks/useI18nHTMLAttributes.tsx
|
|
429
|
+
import { getHTMLTextDir } from "intlayer";
|
|
339
430
|
import { useEffect } from "react";
|
|
340
431
|
import { useLocale } from "react-intlayer";
|
|
341
|
-
import { getHTMLTextDir } from "intlayer";
|
|
342
432
|
|
|
343
433
|
export const useI18nHTMLAttributes = () => {
|
|
344
434
|
const { locale } = useLocale();
|
|
435
|
+
|
|
345
436
|
useEffect(() => {
|
|
346
437
|
document.documentElement.lang = locale;
|
|
347
438
|
document.documentElement.dir = getHTMLTextDir(locale);
|
|
@@ -349,87 +440,185 @@ export const useI18nHTMLAttributes = () => {
|
|
|
349
440
|
};
|
|
350
441
|
```
|
|
351
442
|
|
|
352
|
-
|
|
443
|
+
Luego úsalo en tu componente raíz:
|
|
353
444
|
|
|
354
|
-
|
|
445
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
446
|
+
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
447
|
+
import { configuration } from "intlayer";
|
|
448
|
+
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
355
449
|
|
|
356
|
-
|
|
450
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // importar el hook
|
|
357
451
|
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
const isExternal = (href?: string) => /^https?:\/\//.test(href ?? "");
|
|
374
|
-
|
|
375
|
-
export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
376
|
-
({ href, children, ...props }, ref) => {
|
|
377
|
-
const { locale } = useLocale();
|
|
378
|
-
const hrefI18n =
|
|
379
|
-
href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
|
|
380
|
-
return (
|
|
381
|
-
<a href={hrefI18n} ref={ref} {...props}>
|
|
382
|
-
{children}
|
|
383
|
-
</a>
|
|
384
|
-
);
|
|
385
|
-
}
|
|
386
|
-
);
|
|
387
|
-
Link.displayName = "Link";
|
|
452
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
453
|
+
component: LayoutComponent,
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
function LayoutComponent() {
|
|
457
|
+
useI18nHTMLAttributes(); // agregar esta línea
|
|
458
|
+
|
|
459
|
+
const { locale } = Route.useParams();
|
|
460
|
+
|
|
461
|
+
return (
|
|
462
|
+
<IntlayerProvider locale={locale}>
|
|
463
|
+
<Outlet />
|
|
464
|
+
</IntlayerProvider>
|
|
465
|
+
);
|
|
466
|
+
}
|
|
388
467
|
```
|
|
389
468
|
|
|
390
|
-
|
|
469
|
+
### Paso 11: Construye y Ejecuta Tu Aplicación
|
|
391
470
|
|
|
392
|
-
|
|
471
|
+
Construye los diccionarios de contenido y ejecuta tu aplicación:
|
|
472
|
+
|
|
473
|
+
```bash packageManager="npm"
|
|
474
|
+
# Construir diccionarios de Intlayer
|
|
475
|
+
npm run intlayer:build
|
|
393
476
|
|
|
394
|
-
|
|
477
|
+
# Iniciar servidor de desarrollo
|
|
478
|
+
npm run dev
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
```bash packageManager="pnpm"
|
|
482
|
+
# Construir diccionarios de Intlayer
|
|
483
|
+
pnpm intlayer:build
|
|
484
|
+
|
|
485
|
+
# Iniciar servidor de desarrollo
|
|
486
|
+
pnpm dev
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
```bash packageManager="yarn"
|
|
490
|
+
# Construir diccionarios de Intlayer
|
|
491
|
+
yarn intlayer:build
|
|
395
492
|
|
|
396
|
-
|
|
493
|
+
# Iniciar servidor de desarrollo
|
|
494
|
+
yarn dev
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
### Paso 12: Configurar TypeScript (Opcional)
|
|
498
|
+
|
|
499
|
+
Intlayer utiliza la ampliación de módulos para aprovechar las ventajas de TypeScript y fortalecer tu base de código.
|
|
500
|
+
|
|
501
|
+
Asegúrate de que tu configuración de TypeScript incluya los tipos autogenerados:
|
|
397
502
|
|
|
398
503
|
```json5 fileName="tsconfig.json"
|
|
399
504
|
{
|
|
400
|
-
|
|
505
|
+
compilerOptions: {
|
|
506
|
+
// ... tus configuraciones existentes de TypeScript
|
|
507
|
+
},
|
|
508
|
+
include: [
|
|
509
|
+
// ... tus inclusiones existentes
|
|
510
|
+
".intlayer/**/*.ts", // Incluir los tipos autogenerados
|
|
511
|
+
],
|
|
401
512
|
}
|
|
402
513
|
```
|
|
403
514
|
|
|
404
|
-
|
|
515
|
+
### Configuración de Git
|
|
405
516
|
|
|
406
|
-
|
|
517
|
+
Se recomienda ignorar los archivos generados por Intlayer. Esto te permite evitar comprometerlos en tu repositorio Git.
|
|
407
518
|
|
|
408
|
-
|
|
519
|
+
Para hacerlo, puedes agregar las siguientes instrucciones a tu archivo `.gitignore`:
|
|
409
520
|
|
|
410
|
-
```gitignore
|
|
521
|
+
```plaintext fileName=".gitignore"
|
|
522
|
+
# Ignorar los archivos generados por Intlayer
|
|
411
523
|
.intlayer
|
|
412
524
|
```
|
|
413
525
|
|
|
414
526
|
---
|
|
415
527
|
|
|
416
|
-
|
|
528
|
+
### Paso 13: Crear Redirección (Opcional)
|
|
529
|
+
|
|
530
|
+
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
531
|
+
function LayoutComponent() {
|
|
532
|
+
useI18nHTMLAttributes();
|
|
533
|
+
|
|
534
|
+
const { locale } = Route.useParams();
|
|
535
|
+
const { locale: selectedLocale } = useLocale();
|
|
536
|
+
const { defaultLocale } = configuration.internationalization;
|
|
537
|
+
const { prefixDefault } = configuration.middleware;
|
|
538
|
+
|
|
539
|
+
// Redirigir a la configuración regional predeterminada si no hay configuración regional en la URL cuando prefixDefault es verdadero
|
|
540
|
+
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
541
|
+
return <Navigate replace to={defaultLocale} />;
|
|
542
|
+
}
|
|
417
543
|
|
|
418
|
-
|
|
419
|
-
|
|
544
|
+
// Redirigir a la configuración regional seleccionada si la configuración regional en la URL no coincide con la seleccionada
|
|
545
|
+
if (selectedLocale !== defaultLocale && !locale) {
|
|
546
|
+
return <Navigate replace to={selectedLocale} />;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
return (
|
|
550
|
+
<IntlayerProvider locale={locale}>
|
|
551
|
+
<Outlet />
|
|
552
|
+
</IntlayerProvider>
|
|
553
|
+
);
|
|
554
|
+
}
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
## Despliegue en Producción
|
|
558
|
+
|
|
559
|
+
Al desplegar tu aplicación:
|
|
560
|
+
|
|
561
|
+
1. **Construye tu aplicación:**
|
|
562
|
+
|
|
563
|
+
```bash
|
|
564
|
+
npm run build
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
2. **Construye los diccionarios de Intlayer:**
|
|
568
|
+
|
|
569
|
+
```bash
|
|
570
|
+
npm run intlayer:build
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
3. **Mueve `vite-intlayer` a las dependencias** si usas middleware en producción:
|
|
574
|
+
```bash
|
|
575
|
+
npm install vite-intlayer --save
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
Tu aplicación ahora soportará:
|
|
579
|
+
|
|
580
|
+
- **Estructura de URL**: `/en`, `/en/about`, `/tr`, `/tr/about`
|
|
581
|
+
- **Detección automática de locale** basada en las preferencias del navegador
|
|
582
|
+
- **Ruteo consciente del locale** con Tanstack Start
|
|
583
|
+
- **Soporte para TypeScript** con tipos generados automáticamente
|
|
584
|
+
- **Renderizado del lado servidor** con manejo adecuado del locale
|
|
585
|
+
|
|
586
|
+
## Extensión para VS Code
|
|
587
|
+
|
|
588
|
+
Para mejorar tu experiencia de desarrollo con Intlayer, puedes instalar la extensión oficial **Intlayer VS Code Extension**.
|
|
589
|
+
|
|
590
|
+
[Instalar desde el Marketplace de VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
591
|
+
|
|
592
|
+
Esta extensión ofrece:
|
|
593
|
+
|
|
594
|
+
- **Autocompletado** para las claves de traducción.
|
|
595
|
+
- **Detección de errores en tiempo real** para traducciones faltantes.
|
|
596
|
+
- **Vistas previas en línea** del contenido traducido.
|
|
597
|
+
- **Acciones rápidas** para crear y actualizar traducciones fácilmente.
|
|
598
|
+
|
|
599
|
+
Para más detalles sobre cómo usar la extensión, consulta la [documentación de la extensión Intlayer para VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
420
600
|
|
|
421
601
|
---
|
|
422
602
|
|
|
423
603
|
## Ir Más Allá
|
|
424
604
|
|
|
425
|
-
|
|
426
|
-
- Modo CMS
|
|
427
|
-
- Detección de locale en el edge / adaptadores
|
|
605
|
+
Para profundizar, puedes implementar el [editor visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_visual_editor.md) o externalizar tu contenido usando el [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/intlayer_CMS.md).
|
|
428
606
|
|
|
429
607
|
---
|
|
430
608
|
|
|
431
|
-
##
|
|
609
|
+
## Referencias de la Documentación
|
|
610
|
+
|
|
611
|
+
- [Documentación de Intlayer](https://intlayer.org)
|
|
612
|
+
- [Documentación de Tanstack Start](https://reactrouter.com/)
|
|
613
|
+
- [Hook useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/useIntlayer.md)
|
|
614
|
+
- [Hook useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/packages/react-intlayer/useLocale.md)
|
|
615
|
+
- [Declaración de Contenido](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/dictionary/get_started.md)
|
|
616
|
+
- [Configuración](https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/configuration.md)
|
|
617
|
+
|
|
618
|
+
Esta guía completa proporciona todo lo que necesitas para integrar Intlayer con Tanstack Start para una aplicación completamente internacionalizada con enrutamiento consciente del locale y soporte para TypeScript.
|
|
619
|
+
|
|
620
|
+
## Historial de la Documentación
|
|
432
621
|
|
|
433
|
-
| Versión | Fecha | Cambios
|
|
434
|
-
| ------- | ---------- |
|
|
435
|
-
|
|
|
622
|
+
| Versión | Fecha | Cambios |
|
|
623
|
+
| ------- | ---------- | --------------------------- |
|
|
624
|
+
| 5.8.1 | 2025-09-09 | Añadido para Tanstack Start |
|