@intlayer/docs 5.8.1 → 6.0.0-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/rag_powered_documentation_assistant.md +282 -0
- package/blog/de/rag_powered_documentation_assistant.md +282 -0
- package/blog/en/rag_powered_documentation_assistant.md +289 -0
- package/blog/en-GB/rag_powered_documentation_assistant.md +284 -0
- package/blog/es/rag_powered_documentation_assistant.md +308 -0
- package/blog/fr/rag_powered_documentation_assistant.md +308 -0
- package/blog/hi/rag_powered_documentation_assistant.md +284 -0
- package/blog/it/rag_powered_documentation_assistant.md +284 -0
- package/blog/ja/rag_powered_documentation_assistant.md +284 -0
- package/blog/ko/rag_powered_documentation_assistant.md +283 -0
- package/blog/pt/rag_powered_documentation_assistant.md +284 -0
- package/blog/ru/rag_powered_documentation_assistant.md +284 -0
- package/blog/tr/index.md +69 -0
- package/blog/tr/internationalization_and_SEO.md +273 -0
- package/blog/tr/intlayer_with_i18next.md +162 -0
- package/blog/tr/intlayer_with_next-i18next.md +367 -0
- package/blog/tr/intlayer_with_next-intl.md +392 -0
- package/blog/tr/intlayer_with_react-i18next.md +346 -0
- package/blog/tr/intlayer_with_react-intl.md +345 -0
- package/blog/tr/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/tr/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/tr/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/tr/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/tr/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/tr/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/tr/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/tr/list_i18n_technologies/frameworks/svelte.md +129 -0
- package/blog/tr/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +170 -0
- package/blog/tr/rag_powered_documentation_assistant.md +284 -0
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +162 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +276 -0
- package/blog/tr/what_is_internationalization.md +166 -0
- package/blog/zh/rag_powered_documentation_assistant.md +284 -0
- package/dist/cjs/generated/blog.entry.cjs +212 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +660 -132
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +84 -0
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +6 -0
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +212 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +660 -132
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +84 -0
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +6 -0
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +5 -2
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/docs/ar/autoFill.md +41 -40
- package/docs/ar/configuration.md +202 -199
- package/docs/ar/dictionary/content_file.md +1059 -0
- package/docs/ar/intlayer_CMS.md +4 -4
- package/docs/ar/intlayer_with_nestjs.md +271 -0
- package/docs/ar/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ar/intlayer_with_react_router_v7.md +533 -0
- package/docs/ar/intlayer_with_tanstack.md +465 -299
- package/docs/ar/intlayer_with_vite+preact.md +7 -7
- package/docs/ar/intlayer_with_vite+react.md +7 -7
- package/docs/ar/intlayer_with_vite+vue.md +9 -9
- package/docs/ar/packages/vite-intlayer/index.md +3 -3
- package/docs/ar/readme.md +261 -0
- package/docs/ar/testing.md +199 -0
- package/docs/de/autoFill.md +42 -19
- package/docs/de/configuration.md +155 -147
- package/docs/de/dictionary/content_file.md +1059 -0
- package/docs/de/intlayer_CMS.md +4 -5
- package/docs/de/intlayer_with_nestjs.md +270 -0
- package/docs/de/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/de/intlayer_with_react_router_v7.md +537 -0
- package/docs/de/intlayer_with_tanstack.md +469 -302
- package/docs/de/intlayer_with_vite+preact.md +7 -7
- package/docs/de/intlayer_with_vite+react.md +7 -7
- package/docs/de/intlayer_with_vite+vue.md +9 -9
- package/docs/de/packages/vite-intlayer/index.md +3 -3
- package/docs/de/readme.md +261 -0
- package/docs/de/testing.md +200 -0
- package/docs/en/CI_CD.md +4 -6
- package/docs/en/autoFill.md +25 -5
- package/docs/en/configuration.md +45 -54
- package/docs/en/dictionary/content_file.md +1054 -0
- package/docs/en/intlayer_CMS.md +8 -7
- package/docs/en/intlayer_cli.md +112 -5
- package/docs/en/intlayer_with_nestjs.md +268 -0
- package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en/intlayer_with_react_router_v7.md +531 -0
- package/docs/en/intlayer_with_tanstack.md +463 -294
- package/docs/en/intlayer_with_vite+preact.md +8 -8
- package/docs/en/intlayer_with_vite+react.md +8 -8
- package/docs/en/intlayer_with_vite+vue.md +8 -8
- package/docs/en/packages/intlayer/getLocalizedUrl.md +102 -25
- package/docs/en/packages/vite-intlayer/index.md +3 -3
- package/docs/en/readme.md +261 -0
- package/docs/en/testing.md +200 -0
- package/docs/en-GB/autoFill.md +29 -6
- package/docs/en-GB/configuration.md +79 -71
- package/docs/en-GB/dictionary/content_file.md +1084 -0
- package/docs/en-GB/intlayer_CMS.md +4 -5
- package/docs/en-GB/intlayer_with_nestjs.md +268 -0
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en-GB/intlayer_with_react_router_v7.md +533 -0
- package/docs/en-GB/intlayer_with_tanstack.md +466 -299
- package/docs/en-GB/intlayer_with_vite+preact.md +7 -7
- package/docs/en-GB/intlayer_with_vite+react.md +7 -7
- package/docs/en-GB/intlayer_with_vite+vue.md +9 -9
- package/docs/en-GB/packages/vite-intlayer/index.md +3 -3
- package/docs/en-GB/readme.md +261 -0
- package/docs/en-GB/testing.md +200 -0
- package/docs/es/autoFill.md +45 -23
- package/docs/es/configuration.md +171 -167
- package/docs/es/dictionary/content_file.md +1088 -0
- package/docs/es/intlayer_CMS.md +4 -5
- package/docs/es/intlayer_with_nestjs.md +268 -0
- package/docs/es/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/es/intlayer_with_react_router_v7.md +533 -0
- package/docs/es/intlayer_with_tanstack.md +469 -280
- package/docs/es/intlayer_with_vite+preact.md +7 -7
- package/docs/es/intlayer_with_vite+react.md +7 -7
- package/docs/es/intlayer_with_vite+vue.md +9 -9
- package/docs/es/packages/vite-intlayer/index.md +3 -3
- package/docs/es/readme.md +261 -0
- package/docs/es/testing.md +200 -0
- package/docs/fr/autoFill.md +47 -24
- package/docs/fr/configuration.md +213 -198
- package/docs/fr/dictionary/content_file.md +1054 -0
- package/docs/fr/intlayer_CMS.md +4 -5
- package/docs/fr/intlayer_with_nestjs.md +268 -0
- package/docs/fr/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/fr/intlayer_with_react_router_v7.md +549 -0
- package/docs/fr/intlayer_with_tanstack.md +465 -279
- package/docs/fr/intlayer_with_vite+preact.md +7 -7
- package/docs/fr/intlayer_with_vite+react.md +7 -7
- package/docs/fr/intlayer_with_vite+vue.md +9 -9
- package/docs/fr/packages/vite-intlayer/index.md +3 -3
- package/docs/fr/readme.md +261 -0
- package/docs/fr/testing.md +200 -0
- package/docs/hi/autoFill.md +47 -25
- package/docs/hi/configuration.md +194 -189
- package/docs/hi/dictionary/content_file.md +1056 -0
- package/docs/hi/intlayer_CMS.md +4 -5
- package/docs/hi/intlayer_with_nestjs.md +269 -0
- package/docs/hi/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/hi/intlayer_with_react_router_v7.md +533 -0
- package/docs/hi/intlayer_with_tanstack.md +467 -282
- package/docs/hi/intlayer_with_vite+preact.md +7 -7
- package/docs/hi/intlayer_with_vite+react.md +7 -7
- package/docs/hi/intlayer_with_vite+vue.md +9 -9
- package/docs/hi/packages/vite-intlayer/index.md +3 -3
- package/docs/hi/readme.md +261 -0
- package/docs/hi/testing.md +200 -0
- package/docs/it/autoFill.md +46 -24
- package/docs/it/configuration.md +169 -161
- package/docs/it/dictionary/content_file.md +1061 -0
- package/docs/it/intlayer_CMS.md +4 -5
- package/docs/it/intlayer_with_nestjs.md +268 -0
- package/docs/it/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/it/intlayer_with_react_router_v7.md +535 -0
- package/docs/it/intlayer_with_tanstack.md +467 -301
- package/docs/it/intlayer_with_vite+preact.md +7 -7
- package/docs/it/intlayer_with_vite+react.md +7 -7
- package/docs/it/intlayer_with_vite+vue.md +9 -9
- package/docs/it/packages/vite-intlayer/index.md +3 -3
- package/docs/it/readme.md +261 -0
- package/docs/it/testing.md +200 -0
- package/docs/ja/autoFill.md +45 -23
- package/docs/ja/configuration.md +243 -204
- package/docs/ja/dictionary/content_file.md +1064 -0
- package/docs/ja/intlayer_CMS.md +4 -5
- package/docs/ja/intlayer_with_nestjs.md +268 -0
- package/docs/ja/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ja/intlayer_with_react_router_v7.md +534 -0
- package/docs/ja/intlayer_with_tanstack.md +467 -303
- package/docs/ja/intlayer_with_vite+preact.md +7 -7
- package/docs/ja/intlayer_with_vite+react.md +7 -7
- package/docs/ja/intlayer_with_vite+vue.md +9 -9
- package/docs/ja/packages/vite-intlayer/index.md +3 -3
- package/docs/ja/readme.md +263 -0
- package/docs/ja/testing.md +200 -0
- package/docs/ko/autoFill.md +39 -16
- package/docs/ko/configuration.md +217 -197
- package/docs/ko/dictionary/content_file.md +1060 -0
- package/docs/ko/intlayer_CMS.md +4 -5
- package/docs/ko/intlayer_with_nestjs.md +268 -0
- package/docs/ko/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ko/intlayer_with_react_router_v7.md +540 -0
- package/docs/ko/intlayer_with_tanstack.md +466 -302
- package/docs/ko/intlayer_with_vite+preact.md +7 -7
- package/docs/ko/intlayer_with_vite+react.md +7 -7
- package/docs/ko/intlayer_with_vite+vue.md +9 -9
- package/docs/ko/packages/vite-intlayer/index.md +3 -3
- package/docs/ko/readme.md +261 -0
- package/docs/ko/testing.md +200 -0
- package/docs/pt/autoFill.md +39 -15
- package/docs/pt/configuration.md +165 -147
- package/docs/pt/dictionary/content_file.md +1062 -0
- package/docs/pt/intlayer_CMS.md +4 -5
- package/docs/pt/intlayer_with_nestjs.md +271 -0
- package/docs/pt/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/pt/intlayer_with_react_router_v7.md +535 -0
- package/docs/pt/intlayer_with_tanstack.md +469 -300
- package/docs/pt/intlayer_with_vite+preact.md +7 -7
- package/docs/pt/intlayer_with_vite+react.md +7 -7
- package/docs/pt/intlayer_with_vite+vue.md +9 -9
- package/docs/pt/packages/vite-intlayer/index.md +3 -3
- package/docs/pt/readme.md +261 -0
- package/docs/pt/testing.md +200 -0
- package/docs/ru/autoFill.md +52 -30
- package/docs/ru/configuration.md +164 -117
- package/docs/ru/dictionary/content_file.md +1064 -0
- package/docs/ru/intlayer_CMS.md +4 -4
- package/docs/ru/intlayer_with_nestjs.md +270 -0
- package/docs/ru/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ru/intlayer_with_react_router_v7.md +534 -0
- package/docs/ru/intlayer_with_tanstack.md +470 -305
- package/docs/ru/intlayer_with_vite+preact.md +7 -7
- package/docs/ru/intlayer_with_vite+react.md +7 -7
- package/docs/ru/intlayer_with_vite+vue.md +9 -9
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/readme.md +261 -0
- package/docs/ru/testing.md +202 -0
- package/docs/tr/CI_CD.md +198 -0
- package/docs/tr/autoFill.md +201 -0
- package/docs/tr/configuration.md +585 -0
- package/docs/tr/dictionary/condition.md +243 -0
- package/docs/tr/dictionary/content_file.md +1055 -0
- package/docs/tr/dictionary/enumeration.md +251 -0
- package/docs/tr/dictionary/file.md +228 -0
- package/docs/tr/dictionary/function_fetching.md +218 -0
- package/docs/tr/dictionary/gender.md +279 -0
- package/docs/tr/dictionary/insertion.md +191 -0
- package/docs/tr/dictionary/markdown.md +385 -0
- package/docs/tr/dictionary/nesting.md +279 -0
- package/docs/tr/dictionary/translation.md +315 -0
- package/docs/tr/formatters.md +618 -0
- package/docs/tr/how_works_intlayer.md +254 -0
- package/docs/tr/index.md +168 -0
- package/docs/tr/interest_of_intlayer.md +288 -0
- package/docs/tr/intlayer_CMS.md +347 -0
- package/docs/tr/intlayer_cli.md +570 -0
- package/docs/tr/intlayer_visual_editor.md +269 -0
- package/docs/tr/intlayer_with_angular.md +694 -0
- package/docs/tr/intlayer_with_create_react_app.md +1218 -0
- package/docs/tr/intlayer_with_express.md +415 -0
- package/docs/tr/intlayer_with_lynx+react.md +511 -0
- package/docs/tr/intlayer_with_nestjs.md +268 -0
- package/docs/tr/intlayer_with_nextjs_14.md +1029 -0
- package/docs/tr/intlayer_with_nextjs_15.md +1506 -0
- package/docs/tr/intlayer_with_nextjs_page_router.md +1484 -0
- package/docs/tr/intlayer_with_nuxt.md +773 -0
- package/docs/tr/intlayer_with_react_native+expo.md +660 -0
- package/docs/tr/intlayer_with_react_router_v7.md +531 -0
- package/docs/tr/intlayer_with_tanstack.md +452 -0
- package/docs/tr/intlayer_with_vite+preact.md +1673 -0
- package/docs/tr/intlayer_with_vite+react.md +1632 -0
- package/docs/tr/intlayer_with_vite+solid.md +288 -0
- package/docs/tr/intlayer_with_vite+svelte.md +288 -0
- package/docs/tr/intlayer_with_vite+vue.md +1042 -0
- package/docs/tr/introduction.md +209 -0
- package/docs/tr/locale_mapper.md +244 -0
- package/docs/tr/mcp_server.md +207 -0
- package/docs/tr/packages/@intlayer/api/index.md +58 -0
- package/docs/tr/packages/@intlayer/chokidar/index.md +57 -0
- package/docs/tr/packages/@intlayer/cli/index.md +47 -0
- package/docs/tr/packages/@intlayer/config/index.md +142 -0
- package/docs/tr/packages/@intlayer/core/index.md +51 -0
- package/docs/tr/packages/@intlayer/design-system/index.md +47 -0
- package/docs/tr/packages/@intlayer/dictionary-entry/index.md +53 -0
- package/docs/tr/packages/@intlayer/editor/index.md +47 -0
- package/docs/tr/packages/@intlayer/editor-react/index.md +47 -0
- package/docs/tr/packages/@intlayer/webpack/index.md +61 -0
- package/docs/tr/packages/angular-intlayer/index.md +59 -0
- package/docs/tr/packages/express-intlayer/index.md +258 -0
- package/docs/tr/packages/express-intlayer/t.md +459 -0
- package/docs/tr/packages/intlayer/getConfiguration.md +151 -0
- package/docs/tr/packages/intlayer/getEnumeration.md +165 -0
- package/docs/tr/packages/intlayer/getHTMLTextDir.md +127 -0
- package/docs/tr/packages/intlayer/getLocaleLang.md +87 -0
- package/docs/tr/packages/intlayer/getLocaleName.md +124 -0
- package/docs/tr/packages/intlayer/getLocalizedUrl.md +324 -0
- package/docs/tr/packages/intlayer/getMultilingualUrls.md +225 -0
- package/docs/tr/packages/intlayer/getPathWithoutLocale.md +81 -0
- package/docs/tr/packages/intlayer/getTranslation.md +196 -0
- package/docs/tr/packages/intlayer/getTranslationContent.md +195 -0
- package/docs/tr/packages/intlayer/index.md +505 -0
- package/docs/tr/packages/intlayer-cli/index.md +71 -0
- package/docs/tr/packages/intlayer-editor/index.md +139 -0
- package/docs/tr/packages/lynx-intlayer/index.md +85 -0
- package/docs/tr/packages/next-intlayer/index.md +154 -0
- package/docs/tr/packages/next-intlayer/t.md +354 -0
- package/docs/tr/packages/next-intlayer/useDictionary.md +270 -0
- package/docs/tr/packages/next-intlayer/useIntlayer.md +265 -0
- package/docs/tr/packages/next-intlayer/useLocale.md +133 -0
- package/docs/tr/packages/nuxt-intlayer/index.md +59 -0
- package/docs/tr/packages/preact-intlayer/index.md +55 -0
- package/docs/tr/packages/react-intlayer/index.md +148 -0
- package/docs/tr/packages/react-intlayer/t.md +304 -0
- package/docs/tr/packages/react-intlayer/useDictionary.md +554 -0
- package/docs/tr/packages/react-intlayer/useI18n.md +478 -0
- package/docs/tr/packages/react-intlayer/useIntlayer.md +253 -0
- package/docs/tr/packages/react-intlayer/useLocale.md +212 -0
- package/docs/tr/packages/react-native-intlayer/index.md +85 -0
- package/docs/tr/packages/react-scripts-intlayer/index.md +82 -0
- package/docs/tr/packages/solid-intlayer/index.md +56 -0
- package/docs/tr/packages/svelte-intlayer/index.md +55 -0
- package/docs/tr/packages/vite-intlayer/index.md +82 -0
- package/docs/tr/packages/vue-intlayer/index.md +59 -0
- package/docs/tr/per_locale_file.md +321 -0
- package/docs/tr/readme.md +261 -0
- package/docs/tr/roadmap.md +338 -0
- package/docs/tr/testing.md +200 -0
- package/docs/tr/vs_code_extension.md +154 -0
- package/docs/zh/autoFill.md +40 -18
- package/docs/zh/configuration.md +245 -226
- package/docs/zh/dictionary/content_file.md +1064 -0
- package/docs/zh/intlayer_CMS.md +4 -5
- package/docs/zh/intlayer_with_nestjs.md +268 -0
- package/docs/zh/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +535 -0
- package/docs/zh/intlayer_with_tanstack.md +468 -278
- package/docs/zh/intlayer_with_vite+preact.md +7 -7
- package/docs/zh/intlayer_with_vite+react.md +7 -7
- package/docs/zh/intlayer_with_vite+vue.md +7 -7
- package/docs/zh/packages/vite-intlayer/index.md +3 -3
- package/docs/zh/readme.md +261 -0
- package/docs/zh/testing.md +198 -0
- package/frequent_questions/tr/SSR_Next_no_[locale].md +105 -0
- package/frequent_questions/tr/array_as_content_declaration.md +72 -0
- package/frequent_questions/tr/build_dictionaries.md +59 -0
- package/frequent_questions/tr/build_error_CI_CD.md +75 -0
- package/frequent_questions/tr/customized_locale_list.md +65 -0
- package/frequent_questions/tr/domain_routing.md +114 -0
- package/frequent_questions/tr/esbuild_error.md +30 -0
- package/frequent_questions/tr/get_locale_cookie.md +142 -0
- package/frequent_questions/tr/intlayer_command_undefined.md +156 -0
- package/frequent_questions/tr/locale_incorect_in_url.md +74 -0
- package/frequent_questions/tr/static_rendering.md +45 -0
- package/frequent_questions/tr/translated_path_url.md +56 -0
- package/frequent_questions/tr/unknown_command.md +98 -0
- package/legal/tr/privacy_notice.md +83 -0
- package/legal/tr/terms_of_service.md +55 -0
- package/package.json +12 -12
- package/src/generated/blog.entry.ts +212 -0
- package/src/generated/docs.entry.ts +663 -135
- package/src/generated/frequentQuestions.entry.ts +85 -1
- package/src/generated/legal.entry.ts +7 -1
- package/docs/ar/dictionary/content_extention_customization.md +0 -100
- package/docs/ar/dictionary/get_started.md +0 -527
- package/docs/de/dictionary/content_extention_customization.md +0 -100
- package/docs/de/dictionary/get_started.md +0 -531
- package/docs/en/dictionary/content_extention_customization.md +0 -102
- package/docs/en/dictionary/get_started.md +0 -529
- package/docs/en-GB/dictionary/content_extention_customization.md +0 -100
- package/docs/en-GB/dictionary/get_started.md +0 -591
- package/docs/es/dictionary/content_extention_customization.md +0 -100
- package/docs/es/dictionary/get_started.md +0 -527
- package/docs/fr/dictionary/content_extention_customization.md +0 -100
- package/docs/fr/dictionary/get_started.md +0 -527
- package/docs/hi/dictionary/content_extention_customization.md +0 -100
- package/docs/hi/dictionary/get_started.md +0 -527
- package/docs/it/dictionary/content_extention_customization.md +0 -113
- package/docs/it/dictionary/get_started.md +0 -573
- package/docs/ja/dictionary/content_extention_customization.md +0 -113
- package/docs/ja/dictionary/get_started.md +0 -576
- package/docs/ko/dictionary/content_extention_customization.md +0 -100
- package/docs/ko/dictionary/get_started.md +0 -530
- package/docs/pt/dictionary/content_extention_customization.md +0 -100
- package/docs/pt/dictionary/get_started.md +0 -532
- package/docs/ru/dictionary/content_extention_customization.md +0 -100
- package/docs/ru/dictionary/get_started.md +0 -575
- package/docs/zh/dictionary/content_extention_customization.md +0 -117
- package/docs/zh/dictionary/get_started.md +0 -533
|
@@ -1,370 +1,439 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt: 2025-
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title: Erste Schritte mit Intlayer in
|
|
5
|
-
description:
|
|
2
|
+
createdAt: 2025-09-09
|
|
3
|
+
updatedAt: 2025-09-09
|
|
4
|
+
title: Erste Schritte mit Intlayer in Tanstack Start
|
|
5
|
+
description: Erfahren Sie, wie Sie Internationalisierung (i18n) zu Ihrer Tanstack Start-Anwendung mit Intlayer hinzufügen. Folgen Sie diesem umfassenden Leitfaden, um Ihre App mehrsprachig mit lokalisierungsbewusstem Routing zu machen.
|
|
6
6
|
keywords:
|
|
7
7
|
- Internationalisierung
|
|
8
8
|
- Dokumentation
|
|
9
9
|
- Intlayer
|
|
10
|
-
-
|
|
11
|
-
- TanStack Router
|
|
10
|
+
- Tanstack Start
|
|
12
11
|
- React
|
|
13
12
|
- i18n
|
|
14
|
-
-
|
|
13
|
+
- TypeScript
|
|
14
|
+
- Lokalisierungsrouting
|
|
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
|
-
# Erste Schritte mit der Internationalisierung (i18n) mit Intlayer und
|
|
24
|
+
# Erste Schritte mit der Internationalisierung (i18n) mit Intlayer und Tanstack Start
|
|
25
|
+
|
|
26
|
+
Diese Anleitung zeigt, wie Sie **Intlayer** für nahtlose Internationalisierung in Tanstack Start-Projekten mit lokalisierungsbewusstem Routing, TypeScript-Unterstützung und modernen Entwicklungspraktiken integrieren.
|
|
22
27
|
|
|
23
28
|
## Was ist Intlayer?
|
|
24
29
|
|
|
25
|
-
**Intlayer** ist
|
|
30
|
+
**Intlayer** ist eine innovative, Open-Source-Internationalisierungsbibliothek (i18n), die entwickelt wurde, um die mehrsprachige Unterstützung in modernen Webanwendungen zu vereinfachen.
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
- **Dynamische Metadaten & Routen** (SEO-bereit).
|
|
29
|
-
- **Laufzeit-Sprachumschaltung** (und Hilfsmittel zum Erkennen/Speichern von Sprachen).
|
|
30
|
-
- **Vite-Plugin** für Build-Zeit-Transformationen + Entwicklererlebnis (DX).
|
|
32
|
+
Mit Intlayer können Sie:
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
- **Übersetzungen einfach verwalten** durch deklarative Wörterbücher auf Komponentenebene.
|
|
35
|
+
- **Metadaten, Routen und Inhalte dynamisch lokalisieren**.
|
|
36
|
+
- **TypeScript-Unterstützung sicherstellen** mit automatisch generierten Typen, die die Autovervollständigung und Fehlererkennung verbessern.
|
|
37
|
+
- **Von fortschrittlichen Funktionen profitieren**, wie dynamischer Spracherkennung und -umschaltung.
|
|
38
|
+
- **Lokalisierungsbewusstes Routing aktivieren** mit dem dateibasierten Routing-System von Tanstack Start.
|
|
33
39
|
|
|
34
40
|
---
|
|
35
41
|
|
|
36
|
-
## Schritt
|
|
42
|
+
## Schritt-für-Schritt-Anleitung zur Einrichtung von Intlayer in einer Tanstack Start-Anwendung
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
# npm
|
|
40
|
-
npm i intlayer react-intlayer
|
|
41
|
-
npm i -D vite-intlayer
|
|
44
|
+
### Schritt 1: Projekt erstellen
|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
Beginnen Sie mit der Erstellung eines neuen TanStack Start-Projekts, indem Sie der Anleitung [Neues Projekt starten](https://tanstack.com/start/latest/docs/framework/react/quick-start) auf der TanStack Start-Website folgen.
|
|
47
|
+
|
|
48
|
+
### Schritt 2: Intlayer-Pakete installieren
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
Installieren Sie die erforderlichen Pakete mit Ihrem bevorzugten Paketmanager:
|
|
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
|
+
Das Kernpaket, das Internationalisierungswerkzeuge für Konfigurationsmanagement, Übersetzung, [Inhaltsdeklaration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/dictionary/get_started.md), Transpilierung und [CLI-Befehle](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_cli.md) bereitstellt.
|
|
67
|
+
|
|
68
|
+
- **react-intlayer**
|
|
69
|
+
|
|
70
|
+
Das Paket, das Intlayer in React-Anwendungen integriert. Es stellt Kontext-Provider und Hooks für die Internationalisierung in React bereit.
|
|
57
71
|
|
|
58
|
-
|
|
72
|
+
- **vite-intlayer**
|
|
59
73
|
|
|
60
|
-
|
|
74
|
+
Beinhaltet das Vite-Plugin zur Integration von Intlayer mit dem [Vite-Bundler](https://vite.dev/guide/why.html#why-bundle-for-production) sowie Middleware zur Erkennung der bevorzugten Sprache des Nutzers, Verwaltung von Cookies und Handhabung von URL-Weiterleitungen.
|
|
61
75
|
|
|
62
|
-
|
|
63
|
-
|
|
76
|
+
### Schritt 3: Konfiguration Ihres Projekts
|
|
77
|
+
|
|
78
|
+
Erstellen Sie eine Konfigurationsdatei, um die Sprachen Ihrer Anwendung zu konfigurieren:
|
|
79
|
+
|
|
80
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
81
|
+
import type { IntlayerConfig } from "intlayer";
|
|
82
|
+
|
|
83
|
+
import { Locales } from "intlayer";
|
|
64
84
|
|
|
65
85
|
const config: IntlayerConfig = {
|
|
66
86
|
internationalization: {
|
|
67
|
-
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
68
87
|
defaultLocale: Locales.ENGLISH,
|
|
88
|
+
locales: [
|
|
89
|
+
Locales.ENGLISH,
|
|
90
|
+
Locales.FRENCH,
|
|
91
|
+
Locales.SPANISH,
|
|
92
|
+
// Ihre weiteren Sprachversionen
|
|
93
|
+
],
|
|
69
94
|
},
|
|
70
|
-
// Sie können auch anpassen: contentDir, contentFileExtensions, Middleware-Optionen usw.
|
|
71
95
|
};
|
|
72
96
|
|
|
73
97
|
export default config;
|
|
74
98
|
```
|
|
75
99
|
|
|
76
|
-
|
|
100
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
101
|
+
import { Locales } from "intlayer";
|
|
77
102
|
|
|
78
|
-
|
|
103
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
104
|
+
const config = {
|
|
105
|
+
internationalization: {
|
|
106
|
+
defaultLocale: Locales.ENGLISH,
|
|
107
|
+
locales: [
|
|
108
|
+
Locales.ENGLISH,
|
|
109
|
+
Locales.FRENCH,
|
|
110
|
+
Locales.SPANISH,
|
|
111
|
+
// Ihre weiteren Sprachen
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
};
|
|
79
115
|
|
|
80
|
-
|
|
116
|
+
export default config;
|
|
117
|
+
```
|
|
81
118
|
|
|
82
|
-
|
|
119
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
120
|
+
const { Locales } = require("intlayer");
|
|
83
121
|
|
|
84
|
-
|
|
122
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
123
|
+
const config = {
|
|
124
|
+
internationalization: {
|
|
125
|
+
defaultLocale: Locales.ENGLISH,
|
|
126
|
+
locales: [
|
|
127
|
+
Locales.ENGLISH,
|
|
128
|
+
Locales.FRENCH,
|
|
129
|
+
Locales.SPANISH,
|
|
130
|
+
// Ihre weiteren Sprachen
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
};
|
|
85
134
|
|
|
86
|
-
|
|
135
|
+
module.exports = config;
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
> Durch diese Konfigurationsdatei können Sie lokalisierte URLs, Middleware-Weiterleitungen, Cookie-Namen, den Speicherort und die Erweiterung Ihrer Inhaltsdeklarationen einrichten, Intlayer-Protokolle in der Konsole deaktivieren und vieles mehr. Für eine vollständige Liste der verfügbaren Parameter konsultieren Sie bitte die [Konfigurationsdokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/configuration.md).
|
|
139
|
+
|
|
140
|
+
### Schritt 4: Integrieren Sie Intlayer in Ihre Vite-Konfiguration
|
|
141
|
+
|
|
142
|
+
Fügen Sie das Intlayer-Plugin in Ihre Konfiguration ein:
|
|
143
|
+
|
|
144
|
+
```typescript fileName="vite.config.ts" codeFormat="typescript"
|
|
145
|
+
import { reactRouter } from "@react-router/dev/vite";
|
|
87
146
|
import { defineConfig } from "vite";
|
|
88
|
-
import
|
|
89
|
-
import
|
|
147
|
+
import { intlayerMiddlewarePlugin, intlayerPlugin } from "vite-intlayer";
|
|
148
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
90
149
|
|
|
91
150
|
export default defineConfig({
|
|
92
151
|
plugins: [
|
|
93
|
-
|
|
152
|
+
reactRouter(),
|
|
153
|
+
tsconfigPaths(),
|
|
94
154
|
intlayerPlugin(),
|
|
95
|
-
|
|
96
|
-
intLayerMiddlewarePlugin(),
|
|
155
|
+
intlayerMiddlewarePlugin(),
|
|
97
156
|
],
|
|
98
157
|
});
|
|
99
158
|
```
|
|
100
159
|
|
|
101
|
-
>
|
|
160
|
+
> Das `intlayerPlugin()` Vite-Plugin wird verwendet, um Intlayer in Vite zu integrieren. Es sorgt für den Aufbau der Inhaltsdeklarationsdateien und überwacht diese im Entwicklungsmodus. Es definiert Intlayer-Umgebungsvariablen innerhalb der Vite-Anwendung. Zusätzlich stellt es Aliase bereit, um die Leistung zu optimieren.
|
|
102
161
|
|
|
103
|
-
|
|
162
|
+
### Schritt 5: Erstellen Sie Layout-Komponenten
|
|
104
163
|
|
|
105
|
-
|
|
164
|
+
Richten Sie Ihr Root-Layout und lokalisierte Layouts ein:
|
|
106
165
|
|
|
107
|
-
|
|
166
|
+
#### Root-Layout
|
|
108
167
|
|
|
109
|
-
```tsx fileName="src/
|
|
110
|
-
|
|
111
|
-
import
|
|
168
|
+
```tsx fileName="src/routes/{-$locale}/route.tsx" codeFormat="typescript"
|
|
169
|
+
// src/routes/{-$locale}/route.tsx
|
|
170
|
+
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
171
|
+
import { configuration } from "intlayer";
|
|
172
|
+
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
173
|
+
|
|
174
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
175
|
+
|
|
176
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
177
|
+
component: LayoutComponent,
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
function LayoutComponent() {
|
|
181
|
+
const { locale } = Route.useParams();
|
|
182
|
+
|
|
183
|
+
return (
|
|
184
|
+
<IntlayerProvider locale={locale}>
|
|
185
|
+
<Outlet />
|
|
186
|
+
</IntlayerProvider>
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Schritt 6: Deklarieren Sie Ihre Inhalte
|
|
192
|
+
|
|
193
|
+
Erstellen und verwalten Sie Ihre Inhaltsdeklarationen, um Übersetzungen zu speichern:
|
|
194
|
+
|
|
195
|
+
```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
|
|
196
|
+
import type { Dictionary } from "intlayer";
|
|
197
|
+
|
|
198
|
+
import { t } from "intlayer";
|
|
112
199
|
|
|
113
200
|
const appContent = {
|
|
114
|
-
key: "app",
|
|
115
201
|
content: {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
202
|
+
links: {
|
|
203
|
+
about: t({
|
|
204
|
+
en: "About",
|
|
205
|
+
es: "Acerca de",
|
|
206
|
+
fr: "À propos",
|
|
207
|
+
}),
|
|
208
|
+
home: t({
|
|
209
|
+
en: "Startseite",
|
|
210
|
+
es: "Inicio",
|
|
211
|
+
fr: "Accueil",
|
|
212
|
+
}),
|
|
213
|
+
},
|
|
214
|
+
meta: {
|
|
215
|
+
description: t({
|
|
216
|
+
en: "Dies ist ein Beispiel für die Verwendung von Intlayer mit TanStack Router",
|
|
217
|
+
es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
|
|
218
|
+
fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
|
|
219
|
+
}),
|
|
220
|
+
},
|
|
128
221
|
title: t({
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
fr: "
|
|
132
|
-
es: "TanStack Start + React",
|
|
133
|
-
}),
|
|
134
|
-
count: t({
|
|
135
|
-
de: "Zähler ist ",
|
|
136
|
-
en: "count is ",
|
|
137
|
-
fr: "le compte est ",
|
|
138
|
-
es: "el recuento es ",
|
|
139
|
-
}),
|
|
140
|
-
edit: t<ReactNode>({
|
|
141
|
-
de: (
|
|
142
|
-
<>
|
|
143
|
-
Bearbeite <code>src/routes/index.tsx</code> und speichere, um HMR zu
|
|
144
|
-
testen
|
|
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
|
-
de: "Klicken Sie auf die Logos, um mehr zu erfahren",
|
|
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",
|
|
222
|
+
en: "Willkommen bei Intlayer + TanStack Router",
|
|
223
|
+
es: "Bienvenido a Intlayer + TanStack Router",
|
|
224
|
+
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
169
225
|
}),
|
|
170
226
|
},
|
|
227
|
+
key: "app",
|
|
171
228
|
} satisfies Dictionary;
|
|
172
229
|
|
|
173
230
|
export default appContent;
|
|
174
231
|
```
|
|
175
232
|
|
|
176
|
-
|
|
233
|
+
> Ihre Inhaltsdeklarationen können überall in Ihrer Anwendung definiert werden, sobald sie in das Verzeichnis `contentDir` aufgenommen werden (standardmäßig `./app`). Und sie müssen der Dateierweiterung für Inhaltsdeklarationen entsprechen (standardmäßig `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
177
234
|
|
|
178
|
-
>
|
|
235
|
+
> Für weitere Details siehe die [Dokumentation zur Inhaltsdeklaration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/dictionary/get_started.md).
|
|
179
236
|
|
|
180
|
-
|
|
237
|
+
### Schritt 7: Erstellen Sie lokalisierungsbewusste Komponenten und Hooks
|
|
181
238
|
|
|
182
|
-
|
|
239
|
+
Erstellen Sie eine `LocalizedLink`-Komponente für lokalisierungsbewusste Navigation:
|
|
183
240
|
|
|
184
|
-
|
|
241
|
+
```tsx fileName="src/components/localized-link.tsx" codeFormat="typescript"
|
|
242
|
+
// src/components/localized-link.tsx
|
|
243
|
+
// eslint-disable-next-line no-restricted-imports
|
|
244
|
+
import { Link, type LinkProps } from "@tanstack/react-router";
|
|
245
|
+
import { getLocalizedUrl } from "intlayer";
|
|
246
|
+
import { useLocale } from "reactintlayer";
|
|
185
247
|
|
|
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
|
-
// Beispiel für die Verwendung eines Wörterbuchs auf oberster Ebene:
|
|
196
|
-
const content = useIntlayer("app");
|
|
248
|
+
type LocalizedLinkProps = {
|
|
249
|
+
to: string;
|
|
250
|
+
} & Omit<LinkProps, "to">;
|
|
197
251
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
<nav className="flex gap-3 p-3">
|
|
201
|
-
<RouterLink to="/">Startseite</RouterLink>
|
|
202
|
-
<RouterLink to="/about">Über</RouterLink>
|
|
203
|
-
</nav>
|
|
204
|
-
<main className="p-6">
|
|
205
|
-
<h1>{content.title}</h1>
|
|
206
|
-
<Outlet />
|
|
207
|
-
</main>
|
|
208
|
-
</div>
|
|
209
|
-
);
|
|
210
|
-
}
|
|
252
|
+
export function LocalizedLink(props: LocalizedLinkProps) {
|
|
253
|
+
const { locale } = useLocale();
|
|
211
254
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
<AppShell />
|
|
216
|
-
</IntlayerProvider>
|
|
217
|
-
),
|
|
218
|
-
});
|
|
219
|
-
```
|
|
255
|
+
const isExternal = (to: string) => {
|
|
256
|
+
return /^(https?:)?\/\//.test(to);
|
|
257
|
+
};
|
|
220
258
|
|
|
221
|
-
|
|
259
|
+
const to = isExternal(props.to)
|
|
260
|
+
? props.to
|
|
261
|
+
: getLocalizedUrl(props.to, locale);
|
|
222
262
|
|
|
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
|
-
});
|
|
263
|
+
return <Link {...props} to={to as LinkProps["to"]} />;
|
|
264
|
+
}
|
|
246
265
|
```
|
|
247
266
|
|
|
248
|
-
|
|
249
|
-
>
|
|
250
|
-
> ```jsx
|
|
251
|
-
> <img alt={c.reactLogo.value} />
|
|
252
|
-
> ```
|
|
267
|
+
Erstellen Sie einen `useLocalizedNavigate` Hook für die programmatische Navigation:
|
|
253
268
|
|
|
254
|
-
|
|
269
|
+
```tsx fileName="src/hooks/useLocalizedNavigate.tsx" codeFormat="typescript"
|
|
270
|
+
// src/hooks/useLocalizedNavigate.tsx
|
|
271
|
+
// eslint-disable-next-line no-restricted-imports
|
|
272
|
+
import { NavigateOptions, useNavigate } from "@tanstack/react-router";
|
|
273
|
+
import { getLocalizedUrl } from "intlayer";
|
|
274
|
+
import { useLocale } from "react-intlayer";
|
|
255
275
|
|
|
256
|
-
|
|
276
|
+
type LocalizedNavigateOptions = {
|
|
277
|
+
to: string;
|
|
278
|
+
} & Omit<NavigateOptions, "to">;
|
|
257
279
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
280
|
+
export const useLocalizedNavigate = () => {
|
|
281
|
+
const navigate = useNavigate();
|
|
282
|
+
const { locale } = useLocale();
|
|
261
283
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
284
|
+
const isExternal = (to: string) => {
|
|
285
|
+
return /^(https?:)?\/\//.test(to);
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
const localizedNavigate = (options: LocalizedNavigateOptions) => {
|
|
289
|
+
const to = isExternal(options.to)
|
|
290
|
+
? options.to
|
|
291
|
+
: getLocalizedUrl(options.to, locale);
|
|
292
|
+
|
|
293
|
+
navigate({ ...options, to: to as NavigateOptions["to"] });
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
return localizedNavigate;
|
|
297
|
+
};
|
|
272
298
|
```
|
|
273
299
|
|
|
274
|
-
|
|
300
|
+
### Schritt 8: Intlayer in Ihren Seiten verwenden
|
|
275
301
|
|
|
276
|
-
|
|
302
|
+
Greifen Sie in Ihrer gesamten Anwendung auf Ihre Inhaltswörterbücher zu:
|
|
277
303
|
|
|
278
|
-
|
|
304
|
+
#### Root-Weiterleitungsseite
|
|
279
305
|
|
|
280
|
-
|
|
306
|
+
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
307
|
+
// src/routes/page.tsx
|
|
308
|
+
import { useLocale } from "react-intlayer";
|
|
309
|
+
import { Navigate } from "react-router";
|
|
281
310
|
|
|
282
|
-
|
|
311
|
+
export default function Page() {
|
|
312
|
+
const { locale } = useLocale();
|
|
283
313
|
|
|
284
|
-
|
|
314
|
+
return <Navigate replace to={locale} />;
|
|
315
|
+
}
|
|
316
|
+
```
|
|
285
317
|
|
|
286
|
-
|
|
318
|
+
#### Lokalisierte Startseite
|
|
287
319
|
|
|
288
|
-
```tsx fileName="src/
|
|
289
|
-
import {
|
|
290
|
-
import {
|
|
291
|
-
import {
|
|
320
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
321
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
322
|
+
import { getIntlayer } from "intlayer";
|
|
323
|
+
import { useIntlayer } from "react-intlayer";
|
|
292
324
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
325
|
+
import LocaleSwitcher from "@/components/locale-switcher";
|
|
326
|
+
import { LocalizedLink } from "@/components/localized-link";
|
|
327
|
+
import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
|
|
328
|
+
|
|
329
|
+
export const Route = createFileRoute("/{-$locale}/")({
|
|
330
|
+
component: RouteComponent,
|
|
331
|
+
head: ({ params }) => {
|
|
332
|
+
const { locale } = params;
|
|
333
|
+
const metaContent = getIntlayer("app", locale);
|
|
334
|
+
|
|
335
|
+
return {
|
|
336
|
+
meta: [
|
|
337
|
+
{ title: metaContent.title },
|
|
338
|
+
{ content: metaContent.meta.description, name: "description" },
|
|
339
|
+
],
|
|
340
|
+
};
|
|
341
|
+
},
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
function RouteComponent() {
|
|
345
|
+
const content = useIntlayer("app");
|
|
346
|
+
const navigate = useLocalizedNavigate();
|
|
306
347
|
|
|
307
348
|
return (
|
|
308
|
-
<div className="
|
|
309
|
-
<
|
|
310
|
-
|
|
311
|
-
|
|
349
|
+
<div className="grid place-items-center h-screen">
|
|
350
|
+
<div className="flex flex-col gap-4 items-center text-center">
|
|
351
|
+
{content.title}
|
|
352
|
+
<LocaleSwitcher />
|
|
353
|
+
<div className="flex gap-4">
|
|
354
|
+
<a href="/">Index</a>
|
|
355
|
+
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
356
|
+
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
357
|
+
</div>
|
|
358
|
+
<div className="flex gap-4">
|
|
359
|
+
<button onClick={() => navigate({ to: "/" })}>
|
|
360
|
+
{content.links.home}
|
|
361
|
+
</button>
|
|
362
|
+
<button onClick={() => navigate({ to: "/about" })}>
|
|
363
|
+
{content.links.about}
|
|
364
|
+
</button>
|
|
365
|
+
</div>
|
|
366
|
+
</div>
|
|
312
367
|
</div>
|
|
313
368
|
);
|
|
314
369
|
}
|
|
315
370
|
```
|
|
316
371
|
|
|
317
|
-
|
|
372
|
+
> Um mehr über den `useIntlayer` Hook zu erfahren, siehe die [Dokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/react-intlayer/useIntlayer.md).
|
|
318
373
|
|
|
319
|
-
|
|
374
|
+
### Schritt 9: Erstellen einer Sprachumschalter-Komponente
|
|
320
375
|
|
|
321
|
-
|
|
376
|
+
Erstellen Sie eine Komponente, die es Benutzern ermöglicht, die Sprache zu wechseln:
|
|
322
377
|
|
|
323
|
-
```tsx fileName="src/
|
|
324
|
-
import {
|
|
325
|
-
import {
|
|
326
|
-
|
|
378
|
+
```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
|
|
379
|
+
import { useLocation } from "@tanstack/react-router";
|
|
380
|
+
import {
|
|
381
|
+
getHTMLTextDir,
|
|
382
|
+
getLocaleName,
|
|
383
|
+
getLocalizedUrl,
|
|
384
|
+
Locales,
|
|
385
|
+
} from "intlayer";
|
|
386
|
+
import { useIntlayer, useLocale } from "react-intlayer";
|
|
387
|
+
|
|
388
|
+
export default function LocaleSwitcher() {
|
|
389
|
+
const { pathname, searchStr } = useLocation();
|
|
390
|
+
const content = useIntlayer("locale-switcher");
|
|
391
|
+
|
|
392
|
+
const { availableLocales, locale, setLocale } = useLocale({
|
|
393
|
+
onLocaleChange: (newLocale) => {
|
|
394
|
+
const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
|
|
395
|
+
location.replace(pathWithLocale);
|
|
396
|
+
},
|
|
397
|
+
});
|
|
327
398
|
|
|
328
|
-
function Document({
|
|
329
|
-
locale,
|
|
330
|
-
children,
|
|
331
|
-
}: {
|
|
332
|
-
locale: string;
|
|
333
|
-
children: React.ReactNode;
|
|
334
|
-
}) {
|
|
335
399
|
return (
|
|
336
|
-
<
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
400
|
+
<select
|
|
401
|
+
aria-label={content.label.toString()}
|
|
402
|
+
onChange={(e) => setLocale(e.target.value)}
|
|
403
|
+
value={locale}
|
|
404
|
+
>
|
|
405
|
+
{availableLocales.map((localeItem) => (
|
|
406
|
+
<option
|
|
407
|
+
dir={getHTMLTextDir(localeItem)}
|
|
408
|
+
key={localeItem}
|
|
409
|
+
lang={localeItem}
|
|
410
|
+
value={localeItem}
|
|
411
|
+
>
|
|
412
|
+
{/* Beispiel: Français (Französisch) */}
|
|
413
|
+
{getLocaleName(localeItem, locale)} (
|
|
414
|
+
{getLocaleName(localeItem, Locales.ENGLISH)})
|
|
415
|
+
</option>
|
|
416
|
+
))}
|
|
417
|
+
</select>
|
|
344
418
|
);
|
|
345
419
|
}
|
|
346
|
-
|
|
347
|
-
export const Route = createRootRoute({
|
|
348
|
-
component: () => (
|
|
349
|
-
<IntlayerProvider>
|
|
350
|
-
{/* Wenn Sie die Locale auf dem Server berechnen, übergeben Sie sie an Document; andernfalls korrigiert der Client dies nach der Hydrierung */}
|
|
351
|
-
<Document locale={document?.documentElement?.lang || "en"}>
|
|
352
|
-
<Outlet />
|
|
353
|
-
</Document>
|
|
354
|
-
</IntlayerProvider>
|
|
355
|
-
),
|
|
356
|
-
});
|
|
357
420
|
```
|
|
358
421
|
|
|
359
|
-
|
|
422
|
+
> Um mehr über den `useLocale` Hook zu erfahren, siehe die [Dokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/react-intlayer/useLocale.md).
|
|
360
423
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
424
|
+
### Schritt 10: HTML-Attribute-Verwaltung hinzufügen (Optional)
|
|
425
|
+
|
|
426
|
+
Erstellen Sie einen Hook zur Verwaltung der HTML-Attribute lang und dir:
|
|
427
|
+
|
|
428
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
429
|
+
// src/hooks/useI18nHTMLAttributes.tsx
|
|
364
430
|
import { getHTMLTextDir } from "intlayer";
|
|
431
|
+
import { useEffect } from "react";
|
|
432
|
+
import { useLocale } from "intlayer";
|
|
365
433
|
|
|
366
434
|
export const useI18nHTMLAttributes = () => {
|
|
367
435
|
const { locale } = useLocale();
|
|
436
|
+
|
|
368
437
|
useEffect(() => {
|
|
369
438
|
document.documentElement.lang = locale;
|
|
370
439
|
document.documentElement.dir = getHTMLTextDir(locale);
|
|
@@ -372,87 +441,185 @@ export const useI18nHTMLAttributes = () => {
|
|
|
372
441
|
};
|
|
373
442
|
```
|
|
374
443
|
|
|
375
|
-
|
|
444
|
+
Dann verwenden Sie es in Ihrer Root-Komponente:
|
|
376
445
|
|
|
377
|
-
|
|
446
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
447
|
+
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
448
|
+
import { configuration } from "intlayer";
|
|
449
|
+
import { IntlayerProvider, useLocale } from "intlayer";
|
|
378
450
|
|
|
379
|
-
|
|
451
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // importiere den Hook
|
|
380
452
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
forwardRef,
|
|
385
|
-
type AnchorHTMLAttributes,
|
|
386
|
-
type DetailedHTMLProps,
|
|
387
|
-
} from "react";
|
|
388
|
-
import { useLocale } from "react-intlayer";
|
|
453
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
454
|
+
component: LayoutComponent,
|
|
455
|
+
});
|
|
389
456
|
|
|
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";
|
|
457
|
+
function LayoutComponent() {
|
|
458
|
+
useI18nHTMLAttributes(); // diese Zeile hinzufügen
|
|
459
|
+
|
|
460
|
+
const { locale } = Route.useParams();
|
|
461
|
+
|
|
462
|
+
return (
|
|
463
|
+
<IntlayerProvider locale={locale}>
|
|
464
|
+
<Outlet />
|
|
465
|
+
</IntlayerProvider>
|
|
466
|
+
);
|
|
467
|
+
}
|
|
411
468
|
```
|
|
412
469
|
|
|
413
|
-
|
|
470
|
+
### Schritt 11: Erstellen und Ausführen Ihrer Anwendung
|
|
414
471
|
|
|
415
|
-
|
|
472
|
+
Erstellen Sie die Inhaltswörterbücher und starten Sie Ihre Anwendung:
|
|
416
473
|
|
|
417
|
-
|
|
474
|
+
```bash packageManager="npm"
|
|
475
|
+
# Intlayer-Wörterbücher erstellen
|
|
476
|
+
npm run intlayer:build
|
|
418
477
|
|
|
419
|
-
|
|
478
|
+
# Entwicklungsserver starten
|
|
479
|
+
npm run dev
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
```bash packageManager="pnpm"
|
|
483
|
+
# Intlayer-Wörterbücher erstellen
|
|
484
|
+
pnpm intlayer:build
|
|
485
|
+
|
|
486
|
+
# Entwicklungsserver starten
|
|
487
|
+
pnpm dev
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
```bash packageManager="yarn"
|
|
491
|
+
# Intlayer-Wörterbücher erstellen
|
|
492
|
+
yarn intlayer:build
|
|
493
|
+
|
|
494
|
+
# Entwicklungsserver starten
|
|
495
|
+
yarn dev
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### Schritt 12: TypeScript konfigurieren (optional)
|
|
499
|
+
|
|
500
|
+
Intlayer verwendet Modulaugmentation, um die Vorteile von TypeScript zu nutzen und Ihren Code stabiler zu machen.
|
|
501
|
+
|
|
502
|
+
Stellen Sie sicher, dass Ihre TypeScript-Konfiguration die automatisch generierten Typen einschließt:
|
|
420
503
|
|
|
421
504
|
```json5 fileName="tsconfig.json"
|
|
422
505
|
{
|
|
423
|
-
|
|
506
|
+
compilerOptions: {
|
|
507
|
+
// ... Ihre bestehenden TypeScript-Konfigurationen
|
|
508
|
+
},
|
|
509
|
+
include: [
|
|
510
|
+
// ... Ihre bestehenden Includes
|
|
511
|
+
".intlayer/**/*.ts", // Einschluss der automatisch generierten Typen
|
|
512
|
+
],
|
|
424
513
|
}
|
|
425
514
|
```
|
|
426
515
|
|
|
427
|
-
|
|
516
|
+
### Git-Konfiguration
|
|
428
517
|
|
|
429
|
-
|
|
518
|
+
Es wird empfohlen, die von Intlayer generierten Dateien zu ignorieren. So vermeiden Sie, dass diese Dateien in Ihr Git-Repository committet werden.
|
|
430
519
|
|
|
431
|
-
|
|
520
|
+
Fügen Sie dazu folgende Anweisungen in Ihre `.gitignore`-Datei ein:
|
|
432
521
|
|
|
433
|
-
```gitignore
|
|
522
|
+
```plaintext fileName=".gitignore"
|
|
523
|
+
# Ignoriere die von Intlayer generierten Dateien
|
|
434
524
|
.intlayer
|
|
435
525
|
```
|
|
436
526
|
|
|
437
527
|
---
|
|
438
528
|
|
|
529
|
+
### Schritt 13: Weiterleitung erstellen (Optional)
|
|
530
|
+
|
|
531
|
+
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
532
|
+
function LayoutComponent() {
|
|
533
|
+
useI18nHTMLAttributes();
|
|
534
|
+
|
|
535
|
+
const { locale } = Route.useParams();
|
|
536
|
+
const { locale: selectedLocale } = useLocale();
|
|
537
|
+
const { defaultLocale } = configuration.internationalization;
|
|
538
|
+
const { prefixDefault } = configuration.middleware;
|
|
539
|
+
|
|
540
|
+
// Weiterleitung zur Standardsprache, wenn keine Sprache in der URL vorhanden ist und prefixDefault wahr ist
|
|
541
|
+
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
542
|
+
return <Navigate replace to={defaultLocale} />;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
// Weiterleitung zur ausgewählten Sprache, wenn die Sprache in der URL nicht mit der ausgewählten Sprache übereinstimmt
|
|
546
|
+
if (selectedLocale !== defaultLocale && !locale) {
|
|
547
|
+
return <Navigate replace to={selectedLocale} />;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
return (
|
|
551
|
+
<IntlayerProvider locale={locale}>
|
|
552
|
+
<Outlet />
|
|
553
|
+
</IntlayerProvider>
|
|
554
|
+
);
|
|
555
|
+
}
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
## Produktionsbereitstellung
|
|
559
|
+
|
|
560
|
+
Beim Bereitstellen Ihrer Anwendung:
|
|
561
|
+
|
|
562
|
+
1. **Bauen Sie Ihre Anwendung:**
|
|
563
|
+
|
|
564
|
+
```bash
|
|
565
|
+
npm run build
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
2. **Bauen Sie die Intlayer-Wörterbücher:**
|
|
569
|
+
|
|
570
|
+
```bash
|
|
571
|
+
npm run intlayer:build
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
3. **Verschieben Sie `vite-intlayer` in die Abhängigkeiten**, wenn Sie Middleware in der Produktion verwenden:
|
|
575
|
+
```bash
|
|
576
|
+
npm install vite-intlayer --save
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
Ihre Anwendung unterstützt nun:
|
|
580
|
+
|
|
581
|
+
- **URL-Struktur**: `/en`, `/en/about`, `/tr`, `/tr/about`
|
|
582
|
+
- **Automatische Spracherkennung** basierend auf den Browsereinstellungen
|
|
583
|
+
- **Sprachbewusstes Routing** mit Tanstack Start
|
|
584
|
+
- **TypeScript-Unterstützung** mit automatisch generierten Typen
|
|
585
|
+
- **Server-seitiges Rendering** mit korrekter Sprachbehandlung
|
|
586
|
+
|
|
439
587
|
## VS Code Erweiterung
|
|
440
588
|
|
|
441
|
-
|
|
442
|
-
|
|
589
|
+
Um Ihre Entwicklungserfahrung mit Intlayer zu verbessern, können Sie die offizielle **Intlayer VS Code Erweiterung** installieren.
|
|
590
|
+
|
|
591
|
+
[Installation aus dem VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
592
|
+
|
|
593
|
+
Diese Erweiterung bietet:
|
|
594
|
+
|
|
595
|
+
- **Autovervollständigung** für Übersetzungsschlüssel.
|
|
596
|
+
- **Echtzeit-Fehlererkennung** für fehlende Übersetzungen.
|
|
597
|
+
- **Inline-Vorschauen** des übersetzten Inhalts.
|
|
598
|
+
- **Schnellaktionen**, um Übersetzungen einfach zu erstellen und zu aktualisieren.
|
|
599
|
+
|
|
600
|
+
Für weitere Details zur Verwendung der Erweiterung lesen Sie bitte die [Intlayer VS Code Erweiterungsdokumentation](https://intlayer.org/doc/vs-code-extension).
|
|
443
601
|
|
|
444
602
|
---
|
|
445
603
|
|
|
446
|
-
## Weiterführende
|
|
604
|
+
## Weiterführende Schritte
|
|
447
605
|
|
|
448
|
-
|
|
449
|
-
- CMS-Modus
|
|
450
|
-
- Lokalerkennung am Edge / Adapter
|
|
606
|
+
Um weiterzugehen, können Sie den [visuellen Editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_visual_editor.md) implementieren oder Ihre Inhalte mit dem [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_CMS.md) auslagern.
|
|
451
607
|
|
|
452
608
|
---
|
|
453
609
|
|
|
610
|
+
## Dokumentationsverweise
|
|
611
|
+
|
|
612
|
+
- [Intlayer Dokumentation](https://intlayer.org)
|
|
613
|
+
- [Tanstack Start Dokumentation](https://reactrouter.com/)
|
|
614
|
+
- [useIntlayer Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/react-intlayer/useIntlayer.md)
|
|
615
|
+
- [useLocale Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/react-intlayer/useLocale.md)
|
|
616
|
+
- [Inhaltsdeklaration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/dictionary/get_started.md)
|
|
617
|
+
- [Konfiguration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/configuration.md)
|
|
618
|
+
|
|
619
|
+
Dieser umfassende Leitfaden bietet alles, was Sie benötigen, um Intlayer mit Tanstack Start für eine vollständig internationalisierte Anwendung mit lokalisierungsbewusstem Routing und TypeScript-Unterstützung zu integrieren.
|
|
620
|
+
|
|
454
621
|
## Dokumentationshistorie
|
|
455
622
|
|
|
456
|
-
| Version | Datum | Änderungen
|
|
457
|
-
| ------- | ---------- |
|
|
458
|
-
|
|
|
623
|
+
| Version | Datum | Änderungen |
|
|
624
|
+
| ------- | ---------- | ------------------------------ |
|
|
625
|
+
| 5.8.1 | 2025-09-09 | Für Tanstack Start hinzugefügt |
|