@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,458 +1,623 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt: 2025-
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title: Начало работы с Intlayer в
|
|
5
|
-
description:
|
|
2
|
+
createdAt: 2025-09-09
|
|
3
|
+
updatedAt: 2025-09-09
|
|
4
|
+
title: Начало работы с Intlayer в Tanstack Start
|
|
5
|
+
description: Узнайте, как добавить интернационализацию (i18n) в ваше приложение Tanstack Start с помощью Intlayer. Следуйте этому подробному руководству, чтобы сделать ваше приложение многоязычным с маршрутизацией, учитывающей локаль.
|
|
6
6
|
keywords:
|
|
7
7
|
- Интернационализация
|
|
8
8
|
- Документация
|
|
9
9
|
- Intlayer
|
|
10
|
-
-
|
|
11
|
-
- TanStack Router
|
|
10
|
+
- Tanstack Start
|
|
12
11
|
- React
|
|
13
12
|
- i18n
|
|
14
|
-
-
|
|
13
|
+
- TypeScript
|
|
14
|
+
- Маршрутизация по локали
|
|
15
15
|
slugs:
|
|
16
16
|
- doc
|
|
17
17
|
- environment
|
|
18
|
+
- vite-and-react
|
|
18
19
|
- tanstack-start
|
|
20
|
+
applicationTemplate: https://github.com/AydinTheFirst/tanstack-start-intlayer
|
|
21
|
+
author: AydinTheFirst
|
|
19
22
|
---
|
|
20
23
|
|
|
21
|
-
# Начало работы с интернационализацией (i18n) с Intlayer и
|
|
24
|
+
# Начало работы с интернационализацией (i18n) с Intlayer и Tanstack Start
|
|
25
|
+
|
|
26
|
+
Это руководство демонстрирует, как интегрировать **Intlayer** для бесшовной интернационализации в проектах Tanstack Start с маршрутизацией, учитывающей локаль, поддержкой TypeScript и современными практиками разработки.
|
|
22
27
|
|
|
23
28
|
## Что такое Intlayer?
|
|
24
29
|
|
|
25
|
-
**Intlayer**
|
|
30
|
+
**Intlayer** — это инновационная, открытая библиотека интернационализации (i18n), созданная для упрощения поддержки многоязычности в современных веб-приложениях.
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
- **Динамические метаданные и маршруты** (готовые для SEO).
|
|
29
|
-
- **Переключение локали во время выполнения** (и вспомогательные функции для обнаружения/сохранения локалей).
|
|
30
|
-
- **Плагин Vite** для преобразований во время сборки + улучшения для разработки (DX).
|
|
32
|
+
С помощью Intlayer вы можете:
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
- **Легко управлять переводами** с использованием декларативных словарей на уровне компонентов.
|
|
35
|
+
- **Динамически локализовать метаданные**, маршруты и контент.
|
|
36
|
+
- **Обеспечить поддержку TypeScript** с автогенерируемыми типами, улучшая автодополнение и обнаружение ошибок.
|
|
37
|
+
- **Воспользоваться расширенными возможностями**, такими как динамическое определение и переключение локали.
|
|
38
|
+
- **Включите маршрутизацию с учётом локали** с помощью файловой системы маршрутизации Tanstack Start.
|
|
33
39
|
|
|
34
40
|
---
|
|
35
41
|
|
|
36
|
-
##
|
|
42
|
+
## Пошаговое руководство по настройке Intlayer в приложении Tanstack Start
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
# npm
|
|
40
|
-
npm i intlayer react-intlayer
|
|
41
|
-
npm i -D vite-intlayer
|
|
44
|
+
### Шаг 1: Создайте проект
|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
Начните с создания нового проекта TanStack Start, следуя руководству [Start new project](https://tanstack.com/start/latest/docs/framework/react/quick-start) на сайте TanStack Start.
|
|
47
|
+
|
|
48
|
+
### Шаг 2: Установите пакеты Intlayer
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
Установите необходимые пакеты с помощью предпочитаемого менеджера пакетов:
|
|
51
|
+
|
|
52
|
+
```bash packageManager="npm"
|
|
53
|
+
npm install intlayer react-intlayer
|
|
54
|
+
npm install vite-intlayer --save-dev
|
|
50
55
|
```
|
|
51
56
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
```bash packageManager="pnpm"
|
|
58
|
+
pnpm add intlayer react-intlayer
|
|
59
|
+
pnpm add vite-intlayer --save-dev
|
|
60
|
+
```
|
|
55
61
|
|
|
56
|
-
|
|
62
|
+
- **intlayer**
|
|
63
|
+
|
|
64
|
+
- **intlayer**
|
|
65
|
+
|
|
66
|
+
Основной пакет, предоставляющий инструменты интернационализации для управления конфигурацией, перевода, [объявления контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md), транспиляции и [CLI-команд](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_cli.md).
|
|
67
|
+
|
|
68
|
+
- **react-intlayer**
|
|
69
|
+
Пакет, который интегрирует Intlayer с приложением React. Он предоставляет провайдеры контекста и хуки для интернационализации в React.
|
|
70
|
+
|
|
71
|
+
- **vite-intlayer**
|
|
72
|
+
Включает плагин Vite для интеграции Intlayer с [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также промежуточное ПО для определения предпочтительной локали пользователя, управления cookie и обработки перенаправления URL.
|
|
57
73
|
|
|
58
|
-
|
|
74
|
+
### Шаг 3: Конфигурация вашего проекта
|
|
59
75
|
|
|
60
|
-
Создайте файл
|
|
76
|
+
Создайте файл конфигурации для настройки языков вашего приложения:
|
|
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
|
-
|
|
68
|
-
|
|
85
|
+
defaultLocale: Locales.ENGLISH, // Язык по умолчанию
|
|
86
|
+
locales: [
|
|
87
|
+
Locales.ENGLISH, // Английский
|
|
88
|
+
Locales.FRENCH, // Французский
|
|
89
|
+
Locales.SPANISH, // Испанский
|
|
90
|
+
// Ваши другие языки
|
|
91
|
+
],
|
|
69
92
|
},
|
|
70
|
-
// Вы также можете настроить: contentDir, contentFileExtensions, параметры middleware и др.
|
|
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";
|
|
100
|
+
|
|
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
|
+
// Ваши другие языки
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
};
|
|
77
113
|
|
|
78
|
-
|
|
114
|
+
export default config;
|
|
115
|
+
```
|
|
79
116
|
|
|
80
|
-
|
|
117
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
118
|
+
const { Locales } = require("intlayer");
|
|
81
119
|
|
|
82
|
-
|
|
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
|
+
// Ваши другие языки
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
module.exports = config;
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
> Через этот конфигурационный файл вы можете настроить локализованные URL, перенаправления в middleware, имена cookie, расположение и расширение ваших деклараций контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md).
|
|
83
137
|
|
|
84
|
-
|
|
138
|
+
### Шаг 4: Интеграция Intlayer в вашу конфигурацию Vite
|
|
85
139
|
|
|
86
|
-
|
|
140
|
+
Добавьте плагин intlayer в вашу конфигурацию:
|
|
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
|
+
> Плагин Vite `intlayerPlugin()` используется для интеграции Intlayer с Vite. Он обеспечивает сборку файлов деклараций контента и их мониторинг в режиме разработки. Также он определяет переменные окружения Intlayer внутри приложения Vite. Кроме того, он предоставляет алиасы для оптимизации производительности.
|
|
102
159
|
|
|
103
|
-
|
|
160
|
+
### Шаг 5: Создайте компоненты макета
|
|
161
|
+
|
|
162
|
+
Настройте корневой макет и макеты для конкретных локалей:
|
|
163
|
+
|
|
164
|
+
#### Корневой макет
|
|
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
|
+
### Шаг 6: Объявите Ваш Контент
|
|
106
190
|
|
|
107
|
-
|
|
191
|
+
Создайте и управляйте декларациями контента для хранения переводов:
|
|
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
|
-
|
|
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: "Главная",
|
|
208
|
+
es: "Inicio",
|
|
209
|
+
fr: "Accueil",
|
|
210
|
+
}),
|
|
211
|
+
},
|
|
212
|
+
meta: {
|
|
213
|
+
description: t({
|
|
214
|
+
en: "Это пример использования Intlayer с 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
|
-
ru: "счёт: ",
|
|
136
|
-
en: "count is ",
|
|
137
|
-
fr: "le compte est ",
|
|
138
|
-
es: "el recuento es ",
|
|
139
|
-
}),
|
|
140
|
-
edit: t<ReactNode>({
|
|
141
|
-
ru: (
|
|
142
|
-
<>
|
|
143
|
-
Редактируйте <code>src/routes/index.tsx</code> и сохраните, чтобы
|
|
144
|
-
проверить HMR
|
|
145
|
-
</>
|
|
146
|
-
),
|
|
147
|
-
en: (
|
|
148
|
-
<>
|
|
149
|
-
Edit <code>src/routes/index.tsx</code> and save to test HMR
|
|
150
|
-
</>
|
|
151
|
-
),
|
|
152
|
-
fr: (
|
|
153
|
-
<>
|
|
154
|
-
Éditez <code>src/routes/index.tsx</code> et enregistrez pour tester
|
|
155
|
-
HMR
|
|
156
|
-
</>
|
|
157
|
-
),
|
|
158
|
-
es: (
|
|
159
|
-
<>
|
|
160
|
-
Edita <code>src/routes/index.tsx</code> y guarda para probar HMR
|
|
161
|
-
</>
|
|
162
|
-
),
|
|
163
|
-
}),
|
|
164
|
-
readTheDocs: t({
|
|
165
|
-
ru: "Нажмите на логотипы, чтобы узнать больше",
|
|
166
|
-
en: "Click the logos to learn more",
|
|
167
|
-
fr: "Cliquez sur les logos pour en savoir plus",
|
|
168
|
-
es: "Haz clic en los logotipos para saber más",
|
|
220
|
+
en: "Добро пожаловать в Intlayer + TanStack Router",
|
|
221
|
+
es: "Bienvenido a Intlayer + TanStack Router",
|
|
222
|
+
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
169
223
|
}),
|
|
170
224
|
},
|
|
225
|
+
key: "app",
|
|
171
226
|
} satisfies Dictionary;
|
|
172
227
|
|
|
173
228
|
export default appContent;
|
|
174
229
|
```
|
|
175
230
|
|
|
176
|
-
|
|
231
|
+
> Ваши объявления контента могут быть определены в любом месте вашего приложения, как только они будут включены в каталог `contentDir` (по умолчанию, `./app`). И соответствовать расширению файла объявления контента (по умолчанию, `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
177
232
|
|
|
178
|
-
>
|
|
233
|
+
> Для получения дополнительной информации обратитесь к [документации по объявлениям контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md).
|
|
179
234
|
|
|
180
|
-
|
|
235
|
+
### Шаг 7: Создайте компоненты и хуки с поддержкой локализации
|
|
181
236
|
|
|
182
|
-
|
|
237
|
+
Создайте компонент `LocalizedLink` для навигации с учетом локали:
|
|
183
238
|
|
|
184
|
-
|
|
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";
|
|
185
245
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
createRootRoute,
|
|
190
|
-
Link as RouterLink,
|
|
191
|
-
} from "@tanstack/react-router";
|
|
192
|
-
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
193
|
-
|
|
194
|
-
function AppShell() {
|
|
195
|
-
// Пример использования словаря на верхнем уровне:
|
|
196
|
-
const content = useIntlayer("app");
|
|
246
|
+
type LocalizedLinkProps = {
|
|
247
|
+
to: string;
|
|
248
|
+
} & Omit<LinkProps, "to">;
|
|
197
249
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
<nav className="flex gap-3 p-3">
|
|
201
|
-
<RouterLink to="/">Главная</RouterLink>
|
|
202
|
-
<RouterLink to="/about">О нас</RouterLink>
|
|
203
|
-
</nav>
|
|
204
|
-
<main className="p-6">
|
|
205
|
-
<h1>{content.title}</h1>
|
|
206
|
-
<Outlet />
|
|
207
|
-
</main>
|
|
208
|
-
</div>
|
|
209
|
-
);
|
|
210
|
-
}
|
|
250
|
+
export function LocalizedLink(props: LocalizedLinkProps) {
|
|
251
|
+
const { locale } = useLocale();
|
|
211
252
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
<AppShell />
|
|
216
|
-
</IntlayerProvider>
|
|
217
|
-
),
|
|
218
|
-
});
|
|
219
|
-
```
|
|
253
|
+
const isExternal = (to: string) => {
|
|
254
|
+
return /^(https?:)?\/\//.test(to);
|
|
255
|
+
};
|
|
220
256
|
|
|
221
|
-
|
|
257
|
+
const to = isExternal(props.to)
|
|
258
|
+
? props.to
|
|
259
|
+
: getLocalizedUrl(props.to, locale);
|
|
222
260
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
import { useIntlayer } from "react-intlayer";
|
|
226
|
-
import reactLogo from "../assets/react.svg";
|
|
227
|
-
|
|
228
|
-
export const Route = createFileRoute("/")({
|
|
229
|
-
component: () => {
|
|
230
|
-
const content = useIntlayer("app");
|
|
231
|
-
return (
|
|
232
|
-
<>
|
|
233
|
-
<button>{content.count}0</button>
|
|
234
|
-
<p>{content.edit}</p>
|
|
235
|
-
<img
|
|
236
|
-
src={reactLogo}
|
|
237
|
-
alt={content.reactLogo.value}
|
|
238
|
-
width={48}
|
|
239
|
-
height={48}
|
|
240
|
-
/>
|
|
241
|
-
<p className="opacity-70">{content.readTheDocs}</p>
|
|
242
|
-
</>
|
|
243
|
-
);
|
|
244
|
-
},
|
|
245
|
-
});
|
|
261
|
+
return <Link {...props} to={to as LinkProps["to"]} />;
|
|
262
|
+
}
|
|
246
263
|
```
|
|
247
264
|
|
|
248
|
-
|
|
249
|
-
>
|
|
250
|
-
> ```jsx
|
|
251
|
-
> <img alt={c.reactLogo.value} />
|
|
252
|
-
> ```
|
|
265
|
+
Создайте хук `useLocalizedNavigate` для программной навигации:
|
|
253
266
|
|
|
254
|
-
|
|
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";
|
|
255
273
|
|
|
256
|
-
|
|
274
|
+
type LocalizedNavigateOptions = {
|
|
275
|
+
to: string;
|
|
276
|
+
} & Omit<NavigateOptions, "to">;
|
|
257
277
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
278
|
+
export const useLocalizedNavigate = () => {
|
|
279
|
+
const navigate = useNavigate();
|
|
280
|
+
const { locale } = useLocale();
|
|
261
281
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
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
|
+
};
|
|
272
296
|
```
|
|
273
297
|
|
|
274
|
-
|
|
298
|
+
### Шаг 8: Использование Intlayer на ваших страницах
|
|
275
299
|
|
|
276
|
-
|
|
300
|
+
Получайте доступ к вашим словарям контента по всему приложению:
|
|
277
301
|
|
|
278
|
-
|
|
302
|
+
#### Страница перенаправления корня
|
|
279
303
|
|
|
280
|
-
|
|
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";
|
|
281
308
|
|
|
282
|
-
|
|
309
|
+
export default function Page() {
|
|
310
|
+
const { locale } = useLocale();
|
|
283
311
|
|
|
284
|
-
|
|
312
|
+
return <Navigate replace to={locale} />;
|
|
313
|
+
}
|
|
314
|
+
```
|
|
285
315
|
|
|
286
|
-
|
|
316
|
+
#### Локализованная главная страница
|
|
287
317
|
|
|
288
|
-
```tsx fileName="src/
|
|
289
|
-
import {
|
|
290
|
-
import {
|
|
291
|
-
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";
|
|
292
322
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
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();
|
|
306
345
|
|
|
307
346
|
return (
|
|
308
|
-
<div className="
|
|
309
|
-
<
|
|
310
|
-
|
|
311
|
-
|
|
347
|
+
<div className="grid place-items-center h-screen">
|
|
348
|
+
<div className="flex flex-col gap-4 items-center text-center">
|
|
349
|
+
{content.title}
|
|
350
|
+
<LocaleSwitcher />
|
|
351
|
+
<div className="flex gap-4">
|
|
352
|
+
<a href="/">Индекс</a>
|
|
353
|
+
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
354
|
+
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
355
|
+
</div>
|
|
356
|
+
<div className="flex gap-4">
|
|
357
|
+
<button onClick={() => navigate({ to: "/" })}>
|
|
358
|
+
{content.links.home}
|
|
359
|
+
</button>
|
|
360
|
+
<button onClick={() => navigate({ to: "/about" })}>
|
|
361
|
+
{content.links.about}
|
|
362
|
+
</button>
|
|
363
|
+
</div>
|
|
364
|
+
</div>
|
|
312
365
|
</div>
|
|
313
366
|
);
|
|
314
367
|
}
|
|
315
368
|
```
|
|
316
369
|
|
|
317
|
-
|
|
370
|
+
> Чтобы узнать больше о хуке `useIntlayer`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useIntlayer.md).
|
|
318
371
|
|
|
319
|
-
|
|
372
|
+
### Шаг 9: Создайте компонент переключения локали
|
|
320
373
|
|
|
321
|
-
|
|
374
|
+
Создайте компонент, который позволит пользователям менять язык:
|
|
322
375
|
|
|
323
|
-
```tsx fileName="src/
|
|
324
|
-
import {
|
|
325
|
-
import {
|
|
326
|
-
|
|
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
|
+
});
|
|
327
396
|
|
|
328
|
-
function Document({
|
|
329
|
-
locale,
|
|
330
|
-
children,
|
|
331
|
-
}: {
|
|
332
|
-
locale: string;
|
|
333
|
-
children: React.ReactNode;
|
|
334
|
-
}) {
|
|
335
397
|
return (
|
|
336
|
-
<
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
398
|
+
<select
|
|
399
|
+
aria-label={content.label.toString()}
|
|
400
|
+
onChange={(e) => setLocale(e.target.value)}
|
|
401
|
+
value={locale}
|
|
402
|
+
>
|
|
403
|
+
{availableLocales.map((localeItem) => (
|
|
404
|
+
<option
|
|
405
|
+
dir={getHTMLTextDir(localeItem)}
|
|
406
|
+
key={localeItem}
|
|
407
|
+
lang={localeItem}
|
|
408
|
+
value={localeItem}
|
|
409
|
+
>
|
|
410
|
+
{/* Пример: Français (Французский) */}
|
|
411
|
+
{getLocaleName(localeItem, locale)} (
|
|
412
|
+
{getLocaleName(localeItem, Locales.ENGLISH)})
|
|
413
|
+
</option>
|
|
414
|
+
))}
|
|
415
|
+
</select>
|
|
344
416
|
);
|
|
345
417
|
}
|
|
346
|
-
|
|
347
|
-
export const Route = createRootRoute({
|
|
348
|
-
component: () => (
|
|
349
|
-
<IntlayerProvider>
|
|
350
|
-
{/* Если вы вычисляете локаль на сервере, передайте её в Document; иначе клиент исправит после гидратации */}
|
|
351
|
-
<Document locale={document?.documentElement?.lang || "en"}>
|
|
352
|
-
<Outlet />
|
|
353
|
-
</Document>
|
|
354
|
-
</IntlayerProvider>
|
|
355
|
-
),
|
|
356
|
-
});
|
|
357
418
|
```
|
|
358
419
|
|
|
359
|
-
|
|
420
|
+
> Чтобы узнать больше о хуке `useLocale`, обратитесь к [документации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useLocale.md).
|
|
421
|
+
|
|
422
|
+
### Шаг 10: Добавление управления атрибутами HTML (необязательно)
|
|
423
|
+
|
|
424
|
+
Создайте хук для управления атрибутами lang и dir в HTML:
|
|
360
425
|
|
|
361
|
-
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
426
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
427
|
+
// src/hooks/useI18nHTMLAttributes.tsx
|
|
428
|
+
import { getHTMLTextDir } from "intlayer";
|
|
362
429
|
import { useEffect } from "react";
|
|
363
430
|
import { useLocale } from "react-intlayer";
|
|
364
|
-
import { getHTMLTextDir } from "intlayer";
|
|
365
431
|
|
|
366
432
|
export const useI18nHTMLAttributes = () => {
|
|
367
433
|
const { locale } = useLocale();
|
|
434
|
+
|
|
368
435
|
useEffect(() => {
|
|
369
|
-
document.documentElement.lang = locale;
|
|
370
|
-
document.documentElement.dir = getHTMLTextDir(locale); //
|
|
436
|
+
document.documentElement.lang = locale;
|
|
437
|
+
document.documentElement.dir = getHTMLTextDir(locale); // установка атрибута dir для документа
|
|
371
438
|
}, [locale]);
|
|
372
439
|
};
|
|
373
440
|
```
|
|
374
441
|
|
|
375
|
-
|
|
442
|
+
Затем используйте его в вашем корневом компоненте:
|
|
376
443
|
|
|
377
|
-
|
|
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";
|
|
378
448
|
|
|
379
|
-
|
|
449
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // импорт хука
|
|
380
450
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
forwardRef,
|
|
385
|
-
type AnchorHTMLAttributes,
|
|
386
|
-
type DetailedHTMLProps,
|
|
387
|
-
} from "react";
|
|
388
|
-
import { useLocale } from "react-intlayer";
|
|
451
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
452
|
+
component: LayoutComponent,
|
|
453
|
+
});
|
|
389
454
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
const hrefI18n =
|
|
402
|
-
href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
|
|
403
|
-
return (
|
|
404
|
-
<a href={hrefI18n} ref={ref} {...props}>
|
|
405
|
-
{children}
|
|
406
|
-
</a>
|
|
407
|
-
);
|
|
408
|
-
}
|
|
409
|
-
);
|
|
410
|
-
Link.displayName = "Link";
|
|
455
|
+
function LayoutComponent() {
|
|
456
|
+
useI18nHTMLAttributes(); // добавьте эту строку
|
|
457
|
+
|
|
458
|
+
const { locale } = Route.useParams();
|
|
459
|
+
|
|
460
|
+
return (
|
|
461
|
+
<IntlayerProvider locale={locale}>
|
|
462
|
+
<Outlet />
|
|
463
|
+
</IntlayerProvider>
|
|
464
|
+
);
|
|
465
|
+
}
|
|
411
466
|
```
|
|
412
467
|
|
|
413
|
-
|
|
468
|
+
### Шаг 11: Сборка и запуск вашего приложения
|
|
414
469
|
|
|
415
|
-
|
|
470
|
+
Соберите словари контента и запустите ваше приложение:
|
|
471
|
+
|
|
472
|
+
```bash packageManager="npm"
|
|
473
|
+
# Сборка словарей Intlayer
|
|
474
|
+
npm run intlayer:build
|
|
416
475
|
|
|
417
|
-
|
|
476
|
+
# Запуск сервера разработки
|
|
477
|
+
npm run dev
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
```bash packageManager="pnpm"
|
|
481
|
+
# Сборка словарей Intlayer
|
|
482
|
+
pnpm intlayer:build
|
|
483
|
+
|
|
484
|
+
# Запуск сервера разработки
|
|
485
|
+
pnpm dev
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
```bash packageManager="yarn"
|
|
489
|
+
# Сборка словарей Intlayer
|
|
490
|
+
yarn intlayer:build
|
|
418
491
|
|
|
419
|
-
|
|
492
|
+
# Запуск сервера разработки
|
|
493
|
+
yarn dev
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
### Шаг 12: Настройка TypeScript (необязательно)
|
|
497
|
+
|
|
498
|
+
Intlayer использует расширение модулей (module augmentation), чтобы использовать преимущества TypeScript и сделать ваш код более надежным.
|
|
499
|
+
|
|
500
|
+
Убедитесь, что ваша конфигурация TypeScript включает автоматически сгенерированные типы:
|
|
420
501
|
|
|
421
502
|
```json5 fileName="tsconfig.json"
|
|
422
503
|
{
|
|
423
|
-
|
|
504
|
+
compilerOptions: {
|
|
505
|
+
// ... ваши существующие настройки TypeScript
|
|
506
|
+
},
|
|
507
|
+
include: [
|
|
508
|
+
// ... ваши существующие включения
|
|
509
|
+
".intlayer/**/*.ts", // Включить автоматически сгенерированные типы
|
|
510
|
+
],
|
|
424
511
|
}
|
|
425
512
|
```
|
|
426
513
|
|
|
427
|
-
|
|
514
|
+
### Конфигурация Git
|
|
428
515
|
|
|
429
|
-
|
|
516
|
+
Рекомендуется игнорировать файлы, сгенерированные Intlayer. Это позволит избежать их коммита в ваш репозиторий Git.
|
|
430
517
|
|
|
431
|
-
|
|
518
|
+
Для этого вы можете добавить следующие инструкции в ваш файл `.gitignore`:
|
|
432
519
|
|
|
433
|
-
```gitignore
|
|
520
|
+
```plaintext fileName=".gitignore"
|
|
521
|
+
# Игнорировать файлы, сгенерированные Intlayer
|
|
434
522
|
.intlayer
|
|
435
523
|
```
|
|
436
524
|
|
|
437
525
|
---
|
|
438
526
|
|
|
439
|
-
|
|
527
|
+
### Шаг 13: Создание перенаправления (опционально)
|
|
528
|
+
|
|
529
|
+
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
530
|
+
function LayoutComponent() {
|
|
531
|
+
useI18nHTMLAttributes();
|
|
532
|
+
|
|
533
|
+
const { locale } = Route.useParams();
|
|
534
|
+
const { locale: selectedLocale } = useLocale();
|
|
535
|
+
const { defaultLocale } = configuration.internationalization;
|
|
536
|
+
const { prefixDefault } = configuration.middleware;
|
|
537
|
+
|
|
538
|
+
// Перенаправление на локаль по умолчанию, если в URL отсутствует локаль и prefixDefault установлен в true
|
|
539
|
+
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
540
|
+
return <Navigate replace to={defaultLocale} />;
|
|
541
|
+
}
|
|
440
542
|
|
|
441
|
-
|
|
442
|
-
|
|
543
|
+
// Перенаправление на выбранную локаль, если локаль в URL не совпадает с выбранной локалью
|
|
544
|
+
if (selectedLocale !== defaultLocale && !locale) {
|
|
545
|
+
return <Navigate replace to={selectedLocale} />;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
return (
|
|
549
|
+
<IntlayerProvider locale={locale}>
|
|
550
|
+
<Outlet />
|
|
551
|
+
</IntlayerProvider>
|
|
552
|
+
);
|
|
553
|
+
}
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
## Развертывание в продакшн
|
|
557
|
+
|
|
558
|
+
При развертывании вашего приложения:
|
|
559
|
+
|
|
560
|
+
1. **Соберите ваше приложение:**
|
|
561
|
+
|
|
562
|
+
```bash
|
|
563
|
+
npm run build
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
2. **Соберите словари Intlayer:**
|
|
567
|
+
|
|
568
|
+
```bash
|
|
569
|
+
npm run intlayer:build
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
3. **Переместите `vite-intlayer` в зависимости**, если используете middleware в продакшн:
|
|
573
|
+
```bash
|
|
574
|
+
npm install vite-intlayer --save
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
Теперь ваше приложение будет поддерживать:
|
|
578
|
+
|
|
579
|
+
- **Структуру URL**: `/en`, `/en/about`, `/tr`, `/tr/about`
|
|
580
|
+
- **Автоматическое определение локали** на основе настроек браузера
|
|
581
|
+
- **Маршрутизацию с учётом локали** с использованием Tanstack Start
|
|
582
|
+
- **Поддержку TypeScript** с автогенерируемыми типами
|
|
583
|
+
- **Серверный рендеринг** с правильной обработкой локали
|
|
584
|
+
|
|
585
|
+
## Расширение для VS Code
|
|
586
|
+
|
|
587
|
+
Чтобы улучшить ваш опыт разработки с Intlayer, вы можете установить официальное расширение **Intlayer для VS Code**.
|
|
588
|
+
|
|
589
|
+
[Установить из VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
590
|
+
|
|
591
|
+
Это расширение предоставляет:
|
|
592
|
+
|
|
593
|
+
- **Автозаполнение** ключей переводов.
|
|
594
|
+
- **Обнаружение ошибок в реальном времени** для отсутствующих переводов.
|
|
595
|
+
- **Встроенный просмотр** переведённого контента.
|
|
596
|
+
- **Быстрые действия** для удобного создания и обновления переводов.
|
|
597
|
+
|
|
598
|
+
Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации по расширению Intlayer для VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
443
599
|
|
|
444
600
|
---
|
|
445
601
|
|
|
446
|
-
##
|
|
602
|
+
## Продвинутые возможности
|
|
447
603
|
|
|
448
|
-
|
|
449
|
-
- Режим CMS
|
|
450
|
-
- Определение локали на краю / адаптеры
|
|
604
|
+
Чтобы продвинуться дальше, вы можете реализовать [визуальный редактор](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_visual_editor.md) или вынести ваш контент, используя [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_CMS.md).
|
|
451
605
|
|
|
452
606
|
---
|
|
453
607
|
|
|
608
|
+
## Ссылки на документацию
|
|
609
|
+
|
|
610
|
+
- [Документация Intlayer](https://intlayer.org)
|
|
611
|
+
- [Документация Tanstack Start](https://reactrouter.com/)
|
|
612
|
+
- [Хук useIntlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useIntlayer.md)
|
|
613
|
+
- [Хук useLocale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useLocale.md)
|
|
614
|
+
- [Объявление контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md)
|
|
615
|
+
- [Конфигурация](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md)
|
|
616
|
+
|
|
617
|
+
Это подробное руководство содержит все необходимое для интеграции Intlayer с Tanstack Start для полностью интернационализированного приложения с маршрутизацией, учитывающей локаль, и поддержкой TypeScript.
|
|
618
|
+
|
|
454
619
|
## История документации
|
|
455
620
|
|
|
456
|
-
| Версия | Дата | Изменения
|
|
457
|
-
| ------ | ---------- |
|
|
458
|
-
|
|
|
621
|
+
| Версия | Дата | Изменения |
|
|
622
|
+
| ------ | ---------- | ---------------------------- |
|
|
623
|
+
| 5.8.1 | 2025-09-09 | Добавлено для Tanstack Start |
|