@intlayer/docs 7.0.7 → 7.0.8-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/i18n_using_next-i18next.md +1068 -0
- package/blog/ar/i18n_using_next-intl.md +768 -0
- package/blog/ar/intlayer_with_react-intl.md +0 -4
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +5 -4
- package/blog/de/i18n_using_next-i18next.md +1107 -0
- package/blog/de/i18n_using_next-intl.md +760 -0
- package/blog/de/intlayer_with_react-intl.md +0 -4
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/en/i18n_using_next-i18next.md +1073 -0
- package/blog/en/i18n_using_next-intl.md +757 -0
- package/blog/en/intlayer_with_i18next.md +71 -8
- package/blog/en/intlayer_with_next-i18next.md +71 -8
- package/blog/en/intlayer_with_next-intl.md +71 -8
- package/blog/en/intlayer_with_react-i18next.md +69 -8
- package/blog/en/intlayer_with_react-intl.md +68 -9
- package/blog/en/intlayer_with_vue-i18n.md +68 -7
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/en/vue-i18n_vs_intlayer.md +2 -0
- package/blog/en-GB/i18n_using_next-i18next.md +1074 -0
- package/blog/en-GB/i18n_using_next-intl.md +757 -0
- package/blog/en-GB/intlayer_with_i18next.md +15 -6
- package/blog/en-GB/intlayer_with_next-i18next.md +16 -6
- package/blog/en-GB/intlayer_with_next-intl.md +16 -6
- package/blog/en-GB/intlayer_with_react-i18next.md +16 -7
- package/blog/en-GB/intlayer_with_react-intl.md +14 -9
- package/blog/en-GB/intlayer_with_vue-i18n.md +16 -7
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/en-GB/vue-i18n_vs_intlayer.md +2 -0
- package/blog/es/i18n_using_next-i18next.md +1066 -0
- package/blog/es/i18n_using_next-intl.md +757 -0
- package/blog/es/intlayer_with_react-intl.md +0 -4
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/fr/i18n_using_next-i18next.md +1078 -0
- package/blog/fr/i18n_using_next-intl.md +759 -0
- package/blog/fr/intlayer_with_react-intl.md +0 -4
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/hi/i18n_using_next-i18next.md +1068 -0
- package/blog/hi/i18n_using_next-intl.md +758 -0
- package/blog/hi/intlayer_with_react-intl.md +0 -4
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/id/i18n_using_next-i18next.md +1078 -0
- package/blog/id/i18n_using_next-intl.md +757 -0
- package/blog/id/index.md +69 -0
- package/blog/id/internationalization_and_SEO.md +364 -0
- package/blog/id/intlayer_with_react-intl.md +0 -4
- package/blog/id/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/id/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/id/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/id/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/id/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/id/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/id/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/id/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/id/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +1500 -0
- package/blog/id/nextjs-multilingual-seo-comparison.md +361 -0
- package/blog/id/rag_powered_documentation_assistant.md +288 -0
- package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/id/vue-i18n_vs_intlayer.md +278 -0
- package/blog/id/what_is_internationalization.md +166 -0
- package/blog/it/i18n_using_next-i18next.md +1078 -0
- package/blog/it/i18n_using_next-intl.md +758 -0
- package/blog/it/intlayer_with_react-intl.md +0 -4
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +4 -0
- package/blog/it/vue-i18n_vs_intlayer.md +2 -0
- package/blog/ja/i18n_using_next-i18next.md +1078 -0
- package/blog/ja/i18n_using_next-intl.md +758 -0
- package/blog/ja/intlayer_with_react-intl.md +0 -4
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/ko/i18n_using_next-i18next.md +1075 -0
- package/blog/ko/i18n_using_next-intl.md +759 -0
- package/blog/ko/intlayer_with_react-intl.md +0 -4
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/pl/i18n_using_next-i18next.md +1078 -0
- package/blog/pl/i18n_using_next-intl.md +758 -0
- package/blog/pl/index.md +69 -0
- package/blog/pl/internationalization_and_SEO.md +363 -0
- package/blog/pl/intlayer_with_react-intl.md +0 -4
- package/blog/pl/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/pl/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/pl/list_i18n_technologies/CMS/wordpress.md +196 -0
- package/blog/pl/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/pl/list_i18n_technologies/frameworks/flutter.md +151 -0
- package/blog/pl/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/pl/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/pl/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/pl/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +1501 -0
- package/blog/pl/nextjs-multilingual-seo-comparison.md +362 -0
- package/blog/pl/rag_powered_documentation_assistant.md +288 -0
- package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/pl/vue-i18n_vs_intlayer.md +278 -0
- package/blog/pl/what_is_internationalization.md +167 -0
- package/blog/pt/i18n_using_next-i18next.md +1067 -0
- package/blog/pt/i18n_using_next-intl.md +760 -0
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/ru/i18n_using_next-i18next.md +1106 -0
- package/blog/ru/i18n_using_next-intl.md +759 -0
- package/blog/ru/intlayer_with_react-intl.md +0 -4
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/tr/i18n_using_next-i18next.md +1078 -0
- package/blog/tr/i18n_using_next-intl.md +760 -0
- package/blog/tr/intlayer_with_react-intl.md +0 -4
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +2 -0
- package/blog/vi/i18n_using_next-i18next.md +1080 -0
- package/blog/vi/i18n_using_next-intl.md +758 -0
- package/blog/vi/index.md +69 -0
- package/blog/vi/internationalization_and_SEO.md +363 -0
- package/blog/vi/intlayer_with_react-intl.md +0 -4
- package/blog/vi/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/vi/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/vi/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/vi/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/vi/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/vi/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/vi/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/vi/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/vi/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +1520 -0
- package/blog/vi/nextjs-multilingual-seo-comparison.md +362 -0
- package/blog/vi/rag_powered_documentation_assistant.md +288 -0
- package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/vi/vue-i18n_vs_intlayer.md +278 -0
- package/blog/vi/what_is_internationalization.md +168 -0
- package/blog/zh/i18n_using_next-i18next.md +1105 -0
- package/blog/zh/i18n_using_next-intl.md +758 -0
- package/blog/zh/intlayer_with_react-intl.md +0 -4
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/dist/cjs/common.cjs +0 -4
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +38 -6
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +0 -6
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +0 -6
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +0 -6
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +38 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +2 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/docs/ar/component_i18n.md +1 -1
- package/docs/ar/configuration.md +6 -0
- package/docs/ar/intlayer_cli.md +8 -3
- package/docs/ar/intlayer_with_next-i18next.md +619 -0
- package/docs/ar/intlayer_with_next-intl.md +446 -0
- package/docs/ar/intlayer_with_nextjs_16.md +21 -0
- package/docs/ar/intlayer_with_tanstack.md +4 -0
- package/docs/ar/intlayer_with_vite+react.md +4 -0
- package/docs/de/component_i18n.md +1 -1
- package/docs/de/configuration.md +6 -0
- package/docs/de/intlayer_cli.md +8 -3
- package/docs/de/intlayer_with_next-i18next.md +627 -0
- package/docs/de/intlayer_with_next-intl.md +451 -0
- package/docs/de/intlayer_with_nextjs_16.md +21 -0
- package/docs/de/intlayer_with_tanstack.md +4 -0
- package/docs/de/intlayer_with_vite+react.md +4 -0
- package/docs/en/component_i18n.md +1 -1
- package/docs/en/intlayer_cli.md +8 -1
- package/docs/en/intlayer_with_astro.md +10 -2
- package/docs/en/intlayer_with_create_react_app.md +8 -0
- package/docs/en/intlayer_with_lynx+react.md +8 -0
- package/docs/en/intlayer_with_nestjs.md +10 -0
- package/docs/en/intlayer_with_nextjs_14.md +10 -2
- package/docs/en/intlayer_with_nextjs_15.md +21 -4
- package/docs/en/intlayer_with_nextjs_16.md +17 -0
- package/docs/en/intlayer_with_nuxt.md +8 -0
- package/docs/en/intlayer_with_react_native+expo.md +10 -2
- package/docs/en/intlayer_with_react_router_v7.md +8 -0
- package/docs/en/intlayer_with_tanstack.md +10 -0
- package/docs/en/intlayer_with_vite+preact.md +10 -2
- package/docs/en/intlayer_with_vite+react.md +21 -4
- package/docs/en/intlayer_with_vite+vue.md +10 -2
- package/docs/en-GB/component_i18n.md +1 -1
- package/docs/en-GB/configuration.md +6 -0
- package/docs/en-GB/intlayer_cli.md +8 -3
- package/docs/en-GB/intlayer_with_angular.md +4 -4
- package/docs/en-GB/intlayer_with_express.md +4 -4
- package/docs/en-GB/intlayer_with_lynx+react.md +12 -12
- package/{blog/en/_intlayer_with_next-i18next.md → docs/en-GB/intlayer_with_next-i18next.md} +241 -42
- package/{blog/en/_intlayer_with_next-intl.md → docs/en-GB/intlayer_with_next-intl.md} +144 -29
- package/docs/en-GB/intlayer_with_nextjs_16.md +21 -0
- package/docs/en-GB/intlayer_with_tanstack.md +5 -1
- package/docs/en-GB/intlayer_with_vite+react.md +4 -0
- package/docs/en-GB/packages/next-intlayer/t.md +2 -2
- package/docs/es/component_i18n.md +1 -1
- package/docs/es/configuration.md +6 -0
- package/docs/es/intlayer_cli.md +8 -3
- package/docs/es/intlayer_with_next-i18next.md +628 -0
- package/docs/es/intlayer_with_next-intl.md +446 -0
- package/docs/es/intlayer_with_nextjs_16.md +21 -0
- package/docs/es/intlayer_with_tanstack.md +4 -0
- package/docs/es/intlayer_with_vite+react.md +4 -0
- package/docs/fr/configuration.md +6 -0
- package/docs/fr/intlayer_cli.md +8 -3
- package/docs/fr/intlayer_with_next-i18next.md +628 -0
- package/docs/fr/intlayer_with_next-intl.md +446 -0
- package/docs/fr/intlayer_with_nextjs_16.md +23 -2
- package/docs/fr/intlayer_with_tanstack.md +4 -0
- package/docs/fr/intlayer_with_vite+react.md +4 -0
- package/docs/hi/component_i18n.md +1 -1
- package/docs/hi/configuration.md +6 -0
- package/docs/hi/intlayer_cli.md +8 -0
- package/docs/hi/intlayer_with_next-i18next.md +628 -0
- package/docs/hi/intlayer_with_next-intl.md +446 -0
- package/docs/hi/intlayer_with_nextjs_16.md +21 -0
- package/docs/hi/intlayer_with_tanstack.md +4 -0
- package/docs/hi/intlayer_with_vite+react.md +4 -0
- package/docs/id/CI_CD.md +198 -0
- package/docs/id/autoFill.md +284 -0
- package/docs/id/component_i18n.md +186 -0
- package/docs/id/configuration.md +710 -0
- package/docs/id/dictionary/condition.md +231 -0
- package/docs/id/dictionary/content_file.md +1092 -0
- package/docs/id/dictionary/enumeration.md +245 -0
- package/docs/id/dictionary/file.md +237 -0
- package/docs/id/dictionary/function_fetching.md +214 -0
- package/docs/id/dictionary/gender.md +273 -0
- package/docs/id/dictionary/insertion.md +192 -0
- package/docs/id/dictionary/markdown.md +381 -0
- package/docs/id/dictionary/nesting.md +273 -0
- package/docs/id/dictionary/translation.md +310 -0
- package/docs/id/formatters.md +596 -0
- package/docs/id/how_works_intlayer.md +256 -0
- package/docs/id/index.md +176 -0
- package/docs/id/interest_of_intlayer.md +293 -0
- package/docs/id/intlayer_CMS.md +549 -0
- package/docs/id/intlayer_cli.md +850 -0
- package/docs/id/intlayer_visual_editor.md +288 -0
- package/docs/id/intlayer_with_angular.md +694 -0
- package/docs/id/intlayer_with_astro.md +252 -0
- package/docs/id/intlayer_with_create_react_app.md +1233 -0
- package/docs/id/intlayer_with_express.md +411 -0
- package/docs/id/intlayer_with_lynx+react.md +518 -0
- package/docs/id/intlayer_with_nestjs.md +272 -0
- package/docs/id/intlayer_with_next-i18next.md +628 -0
- package/docs/id/intlayer_with_next-intl.md +446 -0
- package/docs/id/intlayer_with_nextjs_14.md +1617 -0
- package/docs/id/intlayer_with_nextjs_15.md +1698 -0
- package/docs/id/intlayer_with_nextjs_16.md +21 -0
- package/docs/id/intlayer_with_nextjs_page_router.md +1478 -0
- package/docs/id/intlayer_with_nuxt.md +808 -0
- package/docs/id/intlayer_with_react_native+expo.md +699 -0
- package/docs/id/intlayer_with_react_router_v7.md +496 -0
- package/docs/id/intlayer_with_tanstack.md +564 -0
- package/docs/id/intlayer_with_vite+preact.md +1737 -0
- package/docs/id/intlayer_with_vite+react.md +1413 -0
- package/docs/id/intlayer_with_vite+solid.md +289 -0
- package/docs/id/intlayer_with_vite+svelte.md +289 -0
- package/docs/id/intlayer_with_vite+vue.md +1088 -0
- package/docs/id/introduction.md +218 -0
- package/docs/id/locale_mapper.md +242 -0
- package/docs/id/mcp_server.md +211 -0
- package/docs/id/packages/express-intlayer/t.md +458 -0
- package/docs/id/packages/intlayer/getConfiguration.md +145 -0
- package/docs/id/packages/intlayer/getEnumeration.md +159 -0
- package/docs/id/packages/intlayer/getHTMLTextDir.md +122 -0
- package/docs/id/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/id/packages/intlayer/getLocaleName.md +119 -0
- package/docs/id/packages/intlayer/getLocalizedUrl.md +309 -0
- package/docs/id/packages/intlayer/getMultilingualUrls.md +223 -0
- package/docs/id/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/id/packages/intlayer/getTranslation.md +190 -0
- package/docs/id/packages/intlayer/getTranslationContent.md +188 -0
- package/docs/id/packages/next-intlayer/t.md +352 -0
- package/docs/id/packages/next-intlayer/useDictionary.md +271 -0
- package/docs/id/packages/next-intlayer/useIntlayer.md +264 -0
- package/docs/id/packages/next-intlayer/useLocale.md +166 -0
- package/docs/id/packages/react-intlayer/t.md +303 -0
- package/docs/id/packages/react-intlayer/useDictionary.md +287 -0
- package/docs/id/packages/react-intlayer/useI18n.md +267 -0
- package/docs/id/packages/react-intlayer/useIntlayer.md +254 -0
- package/docs/id/packages/react-intlayer/useLocale.md +210 -0
- package/docs/id/per_locale_file.md +323 -0
- package/docs/id/readme.md +261 -0
- package/docs/id/releases/v6.md +305 -0
- package/docs/id/roadmap.md +362 -0
- package/docs/id/testing.md +202 -0
- package/docs/id/vs_code_extension.md +126 -0
- package/docs/it/component_i18n.md +1 -1
- package/docs/it/configuration.md +6 -0
- package/docs/it/intlayer_cli.md +8 -3
- package/docs/it/intlayer_with_next-i18next.md +628 -0
- package/docs/it/intlayer_with_next-intl.md +446 -0
- package/docs/it/intlayer_with_nextjs_16.md +21 -0
- package/docs/it/intlayer_with_tanstack.md +4 -0
- package/docs/it/intlayer_with_vite+react.md +4 -0
- package/docs/ja/component_i18n.md +1 -1
- package/docs/ja/configuration.md +6 -0
- package/docs/ja/intlayer_cli.md +8 -3
- package/docs/ja/intlayer_with_next-i18next.md +627 -0
- package/docs/ja/intlayer_with_next-intl.md +446 -0
- package/docs/ja/intlayer_with_nextjs_16.md +21 -0
- package/docs/ja/intlayer_with_tanstack.md +4 -0
- package/docs/ja/intlayer_with_vite+react.md +4 -0
- package/docs/ko/configuration.md +6 -0
- package/docs/ko/intlayer_cli.md +8 -3
- package/docs/ko/intlayer_with_next-i18next.md +627 -0
- package/docs/ko/intlayer_with_next-intl.md +446 -0
- package/docs/ko/intlayer_with_nextjs_16.md +21 -0
- package/docs/ko/intlayer_with_tanstack.md +4 -0
- package/docs/ko/intlayer_with_vite+react.md +4 -0
- package/docs/pl/CI_CD.md +198 -0
- package/docs/pl/autoFill.md +284 -0
- package/docs/pl/component_i18n.md +186 -0
- package/docs/pl/configuration.md +710 -0
- package/docs/pl/dictionary/condition.md +232 -0
- package/docs/pl/dictionary/content_file.md +1130 -0
- package/docs/pl/dictionary/enumeration.md +245 -0
- package/docs/pl/dictionary/file.md +234 -0
- package/docs/pl/dictionary/function_fetching.md +214 -0
- package/docs/pl/dictionary/gender.md +276 -0
- package/docs/pl/dictionary/insertion.md +188 -0
- package/docs/pl/dictionary/markdown.md +408 -0
- package/docs/pl/dictionary/nesting.md +273 -0
- package/docs/pl/dictionary/translation.md +310 -0
- package/docs/pl/formatters.md +596 -0
- package/docs/pl/how_works_intlayer.md +256 -0
- package/docs/pl/index.md +176 -0
- package/docs/pl/interest_of_intlayer.md +291 -0
- package/docs/pl/intlayer_CMS.md +549 -0
- package/docs/pl/intlayer_cli.md +857 -0
- package/docs/pl/intlayer_visual_editor.md +288 -0
- package/docs/pl/intlayer_with_angular.md +690 -0
- package/docs/pl/intlayer_with_astro.md +280 -0
- package/docs/pl/intlayer_with_create_react_app.md +1235 -0
- package/docs/pl/intlayer_with_express.md +411 -0
- package/docs/pl/intlayer_with_lynx+react.md +518 -0
- package/docs/pl/intlayer_with_nestjs.md +272 -0
- package/docs/pl/intlayer_with_next-i18next.md +628 -0
- package/docs/pl/intlayer_with_next-intl.md +446 -0
- package/docs/pl/intlayer_with_nextjs_14.md +1594 -0
- package/docs/pl/intlayer_with_nextjs_15.md +1701 -0
- package/docs/pl/intlayer_with_nextjs_16.md +21 -0
- package/docs/pl/intlayer_with_nextjs_page_router.md +1513 -0
- package/docs/pl/intlayer_with_nuxt.md +885 -0
- package/docs/pl/intlayer_with_react_native+expo.md +698 -0
- package/docs/pl/intlayer_with_react_router_v7.md +503 -0
- package/docs/pl/intlayer_with_tanstack.md +562 -0
- package/docs/pl/intlayer_with_vite+preact.md +1736 -0
- package/docs/pl/intlayer_with_vite+react.md +1438 -0
- package/docs/pl/intlayer_with_vite+solid.md +290 -0
- package/docs/pl/intlayer_with_vite+svelte.md +289 -0
- package/docs/pl/intlayer_with_vite+vue.md +1116 -0
- package/docs/pl/introduction.md +209 -0
- package/docs/pl/locale_mapper.md +242 -0
- package/docs/pl/mcp_server.md +211 -0
- package/docs/pl/packages/express-intlayer/t.md +458 -0
- package/docs/pl/packages/intlayer/getConfiguration.md +146 -0
- package/docs/pl/packages/intlayer/getEnumeration.md +160 -0
- package/docs/pl/packages/intlayer/getHTMLTextDir.md +121 -0
- package/docs/pl/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/pl/packages/intlayer/getLocaleName.md +118 -0
- package/docs/pl/packages/intlayer/getLocalizedUrl.md +300 -0
- package/docs/pl/packages/intlayer/getMultilingualUrls.md +221 -0
- package/docs/pl/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/pl/packages/intlayer/getTranslation.md +190 -0
- package/docs/pl/packages/intlayer/getTranslationContent.md +189 -0
- package/docs/pl/packages/next-intlayer/t.md +353 -0
- package/docs/pl/packages/next-intlayer/useDictionary.md +270 -0
- package/docs/pl/packages/next-intlayer/useIntlayer.md +263 -0
- package/docs/pl/packages/next-intlayer/useLocale.md +166 -0
- package/docs/pl/packages/react-intlayer/t.md +303 -0
- package/docs/pl/packages/react-intlayer/useDictionary.md +289 -0
- package/docs/pl/packages/react-intlayer/useI18n.md +249 -0
- package/docs/pl/packages/react-intlayer/useIntlayer.md +256 -0
- package/docs/pl/packages/react-intlayer/useLocale.md +210 -0
- package/docs/pl/per_locale_file.md +321 -0
- package/docs/pl/readme.md +261 -0
- package/docs/pl/releases/v6.md +305 -0
- package/docs/pl/roadmap.md +362 -0
- package/docs/pl/testing.md +202 -0
- package/docs/pl/vs_code_extension.md +126 -0
- package/docs/pt/component_i18n.md +1 -1
- package/docs/pt/configuration.md +6 -0
- package/docs/pt/intlayer_cli.md +8 -3
- package/docs/pt/intlayer_with_next-i18next.md +627 -0
- package/docs/pt/intlayer_with_next-intl.md +446 -0
- package/docs/pt/intlayer_with_nextjs_16.md +21 -0
- package/docs/pt/intlayer_with_tanstack.md +4 -0
- package/docs/pt/intlayer_with_vite+react.md +4 -0
- package/docs/ru/component_i18n.md +1 -1
- package/docs/ru/configuration.md +6 -0
- package/docs/ru/intlayer_cli.md +301 -22
- package/docs/ru/intlayer_with_next-i18next.md +629 -0
- package/docs/ru/intlayer_with_next-intl.md +448 -0
- package/docs/ru/intlayer_with_nextjs_16.md +21 -0
- package/docs/ru/intlayer_with_tanstack.md +4 -0
- package/docs/ru/intlayer_with_vite+react.md +4 -0
- package/docs/tr/component_i18n.md +1 -1
- package/docs/tr/configuration.md +6 -0
- package/docs/tr/intlayer_cli.md +8 -0
- package/docs/tr/intlayer_with_next-i18next.md +627 -0
- package/docs/tr/intlayer_with_next-intl.md +446 -0
- package/docs/tr/intlayer_with_nextjs_16.md +21 -0
- package/docs/tr/intlayer_with_tanstack.md +4 -0
- package/docs/tr/intlayer_with_vite+react.md +4 -0
- package/docs/vi/CI_CD.md +198 -0
- package/docs/vi/autoFill.md +284 -0
- package/docs/vi/component_i18n.md +186 -0
- package/docs/vi/configuration.md +710 -0
- package/docs/vi/dictionary/condition.md +237 -0
- package/docs/vi/dictionary/content_file.md +1115 -0
- package/docs/vi/dictionary/enumeration.md +255 -0
- package/docs/vi/dictionary/file.md +234 -0
- package/docs/vi/dictionary/function_fetching.md +212 -0
- package/docs/vi/dictionary/gender.md +275 -0
- package/docs/vi/dictionary/insertion.md +191 -0
- package/docs/vi/dictionary/markdown.md +381 -0
- package/docs/vi/dictionary/nesting.md +273 -0
- package/docs/vi/dictionary/translation.md +309 -0
- package/docs/vi/formatters.md +595 -0
- package/docs/vi/how_works_intlayer.md +256 -0
- package/docs/vi/index.md +174 -0
- package/docs/vi/interest_of_intlayer.md +292 -0
- package/docs/vi/intlayer_CMS.md +549 -0
- package/docs/vi/intlayer_cli.md +850 -0
- package/docs/vi/intlayer_visual_editor.md +288 -0
- package/docs/vi/intlayer_with_angular.md +692 -0
- package/docs/vi/intlayer_with_astro.md +252 -0
- package/docs/vi/intlayer_with_create_react_app.md +1230 -0
- package/docs/vi/intlayer_with_express.md +409 -0
- package/docs/vi/intlayer_with_lynx+react.md +520 -0
- package/docs/vi/intlayer_with_nestjs.md +272 -0
- package/docs/vi/intlayer_with_next-i18next.md +628 -0
- package/docs/vi/intlayer_with_next-intl.md +446 -0
- package/docs/vi/intlayer_with_nextjs_14.md +1584 -0
- package/docs/vi/intlayer_with_nextjs_15.md +1738 -0
- package/docs/vi/intlayer_with_nextjs_16.md +21 -0
- package/docs/vi/intlayer_with_nextjs_page_router.md +1504 -0
- package/docs/vi/intlayer_with_nuxt.md +821 -0
- package/docs/vi/intlayer_with_react_native+expo.md +700 -0
- package/docs/vi/intlayer_with_react_router_v7.md +498 -0
- package/docs/vi/intlayer_with_tanstack.md +562 -0
- package/docs/vi/intlayer_with_vite+preact.md +1722 -0
- package/docs/vi/intlayer_with_vite+react.md +1407 -0
- package/docs/vi/intlayer_with_vite+solid.md +287 -0
- package/docs/vi/intlayer_with_vite+svelte.md +289 -0
- package/docs/vi/intlayer_with_vite+vue.md +1071 -0
- package/docs/vi/introduction.md +215 -0
- package/docs/vi/locale_mapper.md +242 -0
- package/docs/vi/mcp_server.md +211 -0
- package/docs/vi/packages/express-intlayer/t.md +457 -0
- package/docs/vi/packages/intlayer/getConfiguration.md +145 -0
- package/docs/vi/packages/intlayer/getEnumeration.md +162 -0
- package/docs/vi/packages/intlayer/getHTMLTextDir.md +121 -0
- package/docs/vi/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/vi/packages/intlayer/getLocaleName.md +129 -0
- package/docs/vi/packages/intlayer/getLocalizedUrl.md +309 -0
- package/docs/vi/packages/intlayer/getMultilingualUrls.md +221 -0
- package/docs/vi/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/vi/packages/intlayer/getTranslation.md +201 -0
- package/docs/vi/packages/intlayer/getTranslationContent.md +188 -0
- package/docs/vi/packages/next-intlayer/t.md +352 -0
- package/docs/vi/packages/next-intlayer/useDictionary.md +273 -0
- package/docs/vi/packages/next-intlayer/useIntlayer.md +264 -0
- package/docs/vi/packages/next-intlayer/useLocale.md +166 -0
- package/docs/vi/packages/react-intlayer/t.md +304 -0
- package/docs/vi/packages/react-intlayer/useDictionary.md +288 -0
- package/docs/vi/packages/react-intlayer/useI18n.md +295 -0
- package/docs/vi/packages/react-intlayer/useIntlayer.md +256 -0
- package/docs/vi/packages/react-intlayer/useLocale.md +210 -0
- package/docs/vi/per_locale_file.md +326 -0
- package/docs/vi/readme.md +261 -0
- package/docs/vi/releases/v6.md +305 -0
- package/docs/vi/roadmap.md +346 -0
- package/docs/vi/testing.md +202 -0
- package/docs/vi/vs_code_extension.md +126 -0
- package/docs/zh/configuration.md +6 -0
- package/docs/zh/intlayer_cli.md +8 -3
- package/docs/zh/intlayer_with_next-i18next.md +628 -0
- package/docs/zh/intlayer_with_next-intl.md +448 -0
- package/docs/zh/intlayer_with_nextjs_16.md +21 -0
- package/docs/zh/intlayer_with_tanstack.md +4 -0
- package/docs/zh/intlayer_with_vite+react.md +4 -0
- package/frequent_questions/ar/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ar/array_as_content_declaration.md +1 -2
- package/frequent_questions/ar/build_dictionaries.md +1 -2
- package/frequent_questions/ar/build_error_CI_CD.md +1 -2
- package/frequent_questions/ar/bun_set_up.md +1 -2
- package/frequent_questions/ar/customized_locale_list.md +1 -2
- package/frequent_questions/ar/domain_routing.md +1 -2
- package/frequent_questions/ar/esbuild_error.md +1 -2
- package/frequent_questions/ar/get_locale_cookie.md +1 -2
- package/frequent_questions/ar/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ar/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ar/static_rendering.md +1 -3
- package/frequent_questions/ar/translated_path_url.md +1 -2
- package/frequent_questions/ar/unknown_command.md +1 -2
- package/frequent_questions/de/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/de/array_as_content_declaration.md +1 -2
- package/frequent_questions/de/build_dictionaries.md +1 -2
- package/frequent_questions/de/build_error_CI_CD.md +1 -2
- package/frequent_questions/de/bun_set_up.md +1 -2
- package/frequent_questions/de/customized_locale_list.md +1 -2
- package/frequent_questions/de/domain_routing.md +1 -2
- package/frequent_questions/de/esbuild_error.md +1 -2
- package/frequent_questions/de/get_locale_cookie.md +1 -2
- package/frequent_questions/de/intlayer_command_undefined.md +1 -2
- package/frequent_questions/de/locale_incorect_in_url.md +1 -2
- package/frequent_questions/de/static_rendering.md +1 -3
- package/frequent_questions/de/translated_path_url.md +1 -2
- package/frequent_questions/de/unknown_command.md +1 -2
- package/frequent_questions/en/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/en/array_as_content_declaration.md +1 -2
- package/frequent_questions/en/build_dictionaries.md +1 -2
- package/frequent_questions/en/build_error_CI_CD.md +1 -2
- package/frequent_questions/en/bun_set_up.md +1 -2
- package/frequent_questions/en/customized_locale_list.md +1 -2
- package/frequent_questions/en/domain_routing.md +1 -2
- package/frequent_questions/en/esbuild_error.md +1 -2
- package/frequent_questions/en/get_locale_cookie.md +1 -2
- package/frequent_questions/en/intlayer_command_undefined.md +1 -2
- package/frequent_questions/en/locale_incorect_in_url.md +1 -2
- package/frequent_questions/en/static_rendering.md +1 -3
- package/frequent_questions/en/translated_path_url.md +1 -2
- package/frequent_questions/en/unknown_command.md +1 -2
- package/frequent_questions/en-GB/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/en-GB/array_as_content_declaration.md +1 -2
- package/frequent_questions/en-GB/build_dictionaries.md +1 -2
- package/frequent_questions/en-GB/build_error_CI_CD.md +1 -2
- package/frequent_questions/en-GB/bun_set_up.md +1 -2
- package/frequent_questions/en-GB/customized_locale_list.md +1 -2
- package/frequent_questions/en-GB/domain_routing.md +1 -2
- package/frequent_questions/en-GB/esbuild_error.md +1 -2
- package/frequent_questions/en-GB/get_locale_cookie.md +1 -2
- package/frequent_questions/en-GB/intlayer_command_undefined.md +1 -2
- package/frequent_questions/en-GB/locale_incorect_in_url.md +1 -2
- package/frequent_questions/en-GB/static_rendering.md +1 -3
- package/frequent_questions/en-GB/translated_path_url.md +1 -2
- package/frequent_questions/en-GB/unknown_command.md +1 -2
- package/frequent_questions/es/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/es/array_as_content_declaration.md +1 -2
- package/frequent_questions/es/build_dictionaries.md +1 -2
- package/frequent_questions/es/build_error_CI_CD.md +1 -2
- package/frequent_questions/es/bun_set_up.md +1 -2
- package/frequent_questions/es/customized_locale_list.md +1 -2
- package/frequent_questions/es/domain_routing.md +1 -2
- package/frequent_questions/es/esbuild_error.md +1 -2
- package/frequent_questions/es/get_locale_cookie.md +1 -2
- package/frequent_questions/es/intlayer_command_undefined.md +1 -2
- package/frequent_questions/es/locale_incorect_in_url.md +1 -2
- package/frequent_questions/es/static_rendering.md +1 -3
- package/frequent_questions/es/translated_path_url.md +1 -2
- package/frequent_questions/es/unknown_command.md +1 -2
- package/frequent_questions/fr/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/fr/array_as_content_declaration.md +1 -2
- package/frequent_questions/fr/build_dictionaries.md +1 -2
- package/frequent_questions/fr/build_error_CI_CD.md +1 -2
- package/frequent_questions/fr/bun_set_up.md +1 -2
- package/frequent_questions/fr/customized_locale_list.md +1 -2
- package/frequent_questions/fr/domain_routing.md +1 -2
- package/frequent_questions/fr/esbuild_error.md +1 -2
- package/frequent_questions/fr/get_locale_cookie.md +1 -2
- package/frequent_questions/fr/intlayer_command_undefined.md +1 -2
- package/frequent_questions/fr/locale_incorect_in_url.md +1 -2
- package/frequent_questions/fr/static_rendering.md +1 -3
- package/frequent_questions/fr/translated_path_url.md +1 -2
- package/frequent_questions/fr/unknown_command.md +1 -2
- package/frequent_questions/hi/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/hi/array_as_content_declaration.md +1 -2
- package/frequent_questions/hi/build_dictionaries.md +1 -2
- package/frequent_questions/hi/build_error_CI_CD.md +1 -2
- package/frequent_questions/hi/bun_set_up.md +1 -2
- package/frequent_questions/hi/customized_locale_list.md +1 -2
- package/frequent_questions/hi/domain_routing.md +1 -2
- package/frequent_questions/hi/esbuild_error.md +1 -2
- package/frequent_questions/hi/get_locale_cookie.md +1 -2
- package/frequent_questions/hi/intlayer_command_undefined.md +1 -2
- package/frequent_questions/hi/locale_incorect_in_url.md +1 -2
- package/frequent_questions/hi/static_rendering.md +1 -3
- package/frequent_questions/hi/translated_path_url.md +1 -2
- package/frequent_questions/hi/unknown_command.md +1 -2
- package/frequent_questions/id/SSR_Next_no_[locale].md +104 -0
- package/frequent_questions/id/array_as_content_declaration.md +71 -0
- package/frequent_questions/id/build_dictionaries.md +58 -0
- package/frequent_questions/id/build_error_CI_CD.md +74 -0
- package/frequent_questions/id/bun_set_up.md +53 -0
- package/frequent_questions/id/customized_locale_list.md +64 -0
- package/frequent_questions/id/domain_routing.md +113 -0
- package/frequent_questions/id/esbuild_error.md +29 -0
- package/frequent_questions/id/get_locale_cookie.md +142 -0
- package/frequent_questions/id/intlayer_command_undefined.md +155 -0
- package/frequent_questions/id/locale_incorect_in_url.md +73 -0
- package/frequent_questions/id/static_rendering.md +44 -0
- package/frequent_questions/id/translated_path_url.md +55 -0
- package/frequent_questions/id/unknown_command.md +97 -0
- package/frequent_questions/it/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/it/array_as_content_declaration.md +1 -2
- package/frequent_questions/it/build_dictionaries.md +1 -2
- package/frequent_questions/it/build_error_CI_CD.md +1 -2
- package/frequent_questions/it/bun_set_up.md +1 -2
- package/frequent_questions/it/customized_locale_list.md +1 -2
- package/frequent_questions/it/domain_routing.md +1 -2
- package/frequent_questions/it/esbuild_error.md +1 -2
- package/frequent_questions/it/get_locale_cookie.md +1 -2
- package/frequent_questions/it/intlayer_command_undefined.md +1 -2
- package/frequent_questions/it/locale_incorect_in_url.md +1 -2
- package/frequent_questions/it/static_rendering.md +1 -3
- package/frequent_questions/it/translated_path_url.md +1 -2
- package/frequent_questions/it/unknown_command.md +1 -2
- package/frequent_questions/ja/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ja/array_as_content_declaration.md +1 -2
- package/frequent_questions/ja/build_dictionaries.md +1 -2
- package/frequent_questions/ja/build_error_CI_CD.md +1 -2
- package/frequent_questions/ja/bun_set_up.md +1 -2
- package/frequent_questions/ja/customized_locale_list.md +1 -2
- package/frequent_questions/ja/domain_routing.md +1 -2
- package/frequent_questions/ja/esbuild_error.md +1 -2
- package/frequent_questions/ja/get_locale_cookie.md +1 -2
- package/frequent_questions/ja/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ja/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ja/static_rendering.md +1 -3
- package/frequent_questions/ja/translated_path_url.md +1 -2
- package/frequent_questions/ja/unknown_command.md +1 -2
- package/frequent_questions/ko/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ko/array_as_content_declaration.md +1 -2
- package/frequent_questions/ko/build_dictionaries.md +1 -2
- package/frequent_questions/ko/build_error_CI_CD.md +1 -2
- package/frequent_questions/ko/bun_set_up.md +1 -2
- package/frequent_questions/ko/customized_locale_list.md +1 -2
- package/frequent_questions/ko/domain_routing.md +1 -2
- package/frequent_questions/ko/esbuild_error.md +1 -2
- package/frequent_questions/ko/get_locale_cookie.md +1 -2
- package/frequent_questions/ko/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ko/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ko/static_rendering.md +1 -3
- package/frequent_questions/ko/translated_path_url.md +1 -2
- package/frequent_questions/ko/unknown_command.md +1 -2
- package/frequent_questions/pl/SSR_Next_no_[locale].md +104 -0
- package/frequent_questions/pl/array_as_content_declaration.md +71 -0
- package/frequent_questions/pl/build_dictionaries.md +58 -0
- package/frequent_questions/pl/build_error_CI_CD.md +74 -0
- package/frequent_questions/pl/bun_set_up.md +54 -0
- package/frequent_questions/pl/customized_locale_list.md +64 -0
- package/frequent_questions/pl/domain_routing.md +113 -0
- package/frequent_questions/pl/esbuild_error.md +29 -0
- package/frequent_questions/pl/get_locale_cookie.md +142 -0
- package/frequent_questions/pl/intlayer_command_undefined.md +155 -0
- package/frequent_questions/pl/locale_incorect_in_url.md +73 -0
- package/frequent_questions/pl/static_rendering.md +44 -0
- package/frequent_questions/pl/translated_path_url.md +55 -0
- package/frequent_questions/pl/unknown_command.md +97 -0
- package/frequent_questions/pt/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/pt/array_as_content_declaration.md +1 -2
- package/frequent_questions/pt/build_dictionaries.md +1 -2
- package/frequent_questions/pt/build_error_CI_CD.md +1 -2
- package/frequent_questions/pt/bun_set_up.md +1 -2
- package/frequent_questions/pt/customized_locale_list.md +1 -2
- package/frequent_questions/pt/domain_routing.md +1 -2
- package/frequent_questions/pt/esbuild_error.md +1 -2
- package/frequent_questions/pt/get_locale_cookie.md +1 -2
- package/frequent_questions/pt/intlayer_command_undefined.md +1 -2
- package/frequent_questions/pt/locale_incorect_in_url.md +1 -2
- package/frequent_questions/pt/static_rendering.md +1 -3
- package/frequent_questions/pt/translated_path_url.md +1 -2
- package/frequent_questions/pt/unknown_command.md +1 -2
- package/frequent_questions/ru/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ru/array_as_content_declaration.md +1 -2
- package/frequent_questions/ru/build_dictionaries.md +1 -2
- package/frequent_questions/ru/build_error_CI_CD.md +1 -2
- package/frequent_questions/ru/bun_set_up.md +1 -2
- package/frequent_questions/ru/customized_locale_list.md +1 -2
- package/frequent_questions/ru/domain_routing.md +1 -2
- package/frequent_questions/ru/esbuild_error.md +1 -2
- package/frequent_questions/ru/get_locale_cookie.md +1 -2
- package/frequent_questions/ru/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ru/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/ru/translated_path_url.md +1 -2
- package/frequent_questions/ru/unknown_command.md +1 -2
- package/frequent_questions/tr/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/tr/array_as_content_declaration.md +1 -2
- package/frequent_questions/tr/build_dictionaries.md +1 -2
- package/frequent_questions/tr/build_error_CI_CD.md +1 -2
- package/frequent_questions/tr/bun_set_up.md +1 -2
- package/frequent_questions/tr/customized_locale_list.md +1 -2
- package/frequent_questions/tr/domain_routing.md +1 -2
- package/frequent_questions/tr/esbuild_error.md +1 -2
- package/frequent_questions/tr/get_locale_cookie.md +1 -2
- package/frequent_questions/tr/intlayer_command_undefined.md +1 -2
- package/frequent_questions/tr/locale_incorect_in_url.md +1 -2
- package/frequent_questions/tr/static_rendering.md +1 -2
- package/frequent_questions/tr/translated_path_url.md +1 -2
- package/frequent_questions/tr/unknown_command.md +1 -2
- package/frequent_questions/vi/SSR_Next_no_[locale].md +106 -0
- package/frequent_questions/vi/array_as_content_declaration.md +71 -0
- package/frequent_questions/vi/build_dictionaries.md +58 -0
- package/frequent_questions/vi/build_error_CI_CD.md +74 -0
- package/frequent_questions/vi/bun_set_up.md +53 -0
- package/frequent_questions/vi/customized_locale_list.md +64 -0
- package/frequent_questions/vi/domain_routing.md +113 -0
- package/frequent_questions/vi/esbuild_error.md +29 -0
- package/frequent_questions/vi/get_locale_cookie.md +142 -0
- package/frequent_questions/vi/intlayer_command_undefined.md +155 -0
- package/frequent_questions/vi/locale_incorect_in_url.md +73 -0
- package/frequent_questions/vi/static_rendering.md +44 -0
- package/frequent_questions/vi/translated_path_url.md +55 -0
- package/frequent_questions/vi/unknown_command.md +97 -0
- package/frequent_questions/zh/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/zh/array_as_content_declaration.md +1 -2
- package/frequent_questions/zh/build_dictionaries.md +1 -2
- package/frequent_questions/zh/build_error_CI_CD.md +1 -2
- package/frequent_questions/zh/bun_set_up.md +1 -2
- package/frequent_questions/zh/customized_locale_list.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -2
- package/frequent_questions/zh/esbuild_error.md +1 -2
- package/frequent_questions/zh/get_locale_cookie.md +1 -2
- package/frequent_questions/zh/intlayer_command_undefined.md +1 -2
- package/frequent_questions/zh/locale_incorect_in_url.md +1 -2
- package/frequent_questions/zh/static_rendering.md +1 -3
- package/frequent_questions/zh/translated_path_url.md +1 -2
- package/frequent_questions/zh/unknown_command.md +1 -2
- package/legal/id/privacy_notice.md +83 -0
- package/legal/id/terms_of_service.md +55 -0
- package/legal/pl/privacy_notice.md +83 -0
- package/legal/pl/terms_of_service.md +55 -0
- package/legal/vi/privacy_notice.md +83 -0
- package/legal/vi/terms_of_service.md +55 -0
- package/package.json +19 -18
- package/src/generated/blog.entry.ts +38 -0
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-10-05
|
|
3
|
+
updatedAt: 2025-10-05
|
|
4
|
+
title: Wie Sie Ihre Next.js 15 mit next-i18next übersetzen – i18n Anleitung 2025
|
|
5
|
+
description: Eine praxisorientierte, produktionsreife Anleitung zur Internationalisierung einer Next.js 15 App Router App mit i18next/next-i18next und zur Erweiterung mit Intlayer.
|
|
6
|
+
keywords:
|
|
7
|
+
- Internationalisierung
|
|
8
|
+
- Dokumentation
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Next.js 15
|
|
11
|
+
- next-i18next
|
|
12
|
+
- i18next
|
|
13
|
+
- JavaScript
|
|
14
|
+
- React
|
|
15
|
+
slugs:
|
|
16
|
+
- doc
|
|
17
|
+
- next-i18next
|
|
18
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-next-i18next-template
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Übersetzen Sie Ihre Next.js 15 Website mit next-i18next unter Verwendung von Intlayer | Internationalisierung (i18n)
|
|
22
|
+
|
|
23
|
+
### Für wen diese Anleitung ist
|
|
24
|
+
|
|
25
|
+
- **Junior**: Folgen Sie den genauen Schritten und kopieren Sie die Codeblöcke. Sie erhalten eine funktionierende mehrsprachige App.
|
|
26
|
+
- **Mid-level**: Verwenden Sie die Checklisten und Best-Practice-Hinweise, um häufige Fallstricke zu vermeiden.
|
|
27
|
+
- **Senior**: Überfliegen Sie die Abschnitte zur Gesamtstruktur, SEO und Automatisierung; Sie finden sinnvolle Voreinstellungen und Erweiterungspunkte.
|
|
28
|
+
|
|
29
|
+
### Was Sie bauen werden
|
|
30
|
+
|
|
31
|
+
- App Router Projekt mit lokalisierten Routen (z.B. `/`, `/fr/...`)
|
|
32
|
+
- i18n-Konfiguration mit Locales, Standard-Locale, RTL-Unterstützung
|
|
33
|
+
- Serverseitige i18n-Initialisierung und ein Client-Provider
|
|
34
|
+
- Namespaced Übersetzungen, die bei Bedarf geladen werden
|
|
35
|
+
- SEO mit `hreflang`, lokalisiertem `sitemap`, `robots`
|
|
36
|
+
- Middleware für Locale-Routing
|
|
37
|
+
- Intlayer-Integration zur Automatisierung von Übersetzungs-Workflows (Tests, KI-Ausfüllung, JSON-Synchronisation)
|
|
38
|
+
|
|
39
|
+
> Hinweis: next-i18next basiert auf i18next. Diese Anleitung verwendet die i18next-Primitiven, die mit next-i18next im App Router kompatibel sind, und hält dabei die Architektur einfach und produktionsbereit.
|
|
40
|
+
> Für einen umfassenderen Vergleich siehe [next-i18next vs next-i18next vs Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/de/next-i18next_vs_next-i18next_vs_intlayer.md).
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 1) Projektstruktur
|
|
45
|
+
|
|
46
|
+
Installieren Sie die next-i18next-Abhängigkeiten:
|
|
47
|
+
|
|
48
|
+
```bash packageManager="npm"
|
|
49
|
+
npm install next-i18next i18next react-i18next i18next-resources-to-backend
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```bash packageManager="pnpm"
|
|
53
|
+
pnpm add next-i18next i18next react-i18next i18next-resources-to-backend
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```bash packageManager="yarn"
|
|
57
|
+
yarn add next-i18next i18next react-i18next i18next-resources-to-backend
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Beginnen Sie mit einer klaren Struktur. Halten Sie die Nachrichten nach Locale und Namespace getrennt.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
.
|
|
64
|
+
├── i18n.config.ts
|
|
65
|
+
└── src
|
|
66
|
+
├── locales
|
|
67
|
+
│ ├── en
|
|
68
|
+
│ │ ├── common.json
|
|
69
|
+
│ │ └── about.json
|
|
70
|
+
│ └── fr
|
|
71
|
+
│ ├── common.json
|
|
72
|
+
│ └── about.json
|
|
73
|
+
├── app
|
|
74
|
+
│ ├── i18n
|
|
75
|
+
│ │ └── server.ts
|
|
76
|
+
│ └── [locale]
|
|
77
|
+
│ ├── layout.tsx
|
|
78
|
+
│ └── about.tsx
|
|
79
|
+
└── components
|
|
80
|
+
├── I18nProvider.tsx
|
|
81
|
+
├── ClientComponent.tsx
|
|
82
|
+
└── ServerComponent.tsx
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Checkliste (mittel/erfahren):
|
|
86
|
+
|
|
87
|
+
- Behalten Sie eine JSON-Datei pro Namespace und Locale bei
|
|
88
|
+
- Zentralisieren Sie Nachrichten nicht zu stark; verwenden Sie kleine, seiten-/feature-spezifische Namespaces
|
|
89
|
+
- Vermeiden Sie es, alle Locales auf einmal zu importieren; laden Sie nur, was Sie benötigen
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 2) Abhängigkeiten installieren
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
pnpm add i18next react-i18next i18next-resources-to-backend
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Wenn Sie vorhaben, next-i18next APIs oder Konfigurations-Interop zu verwenden, dann auch:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
pnpm add next-i18next
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 3) Kern-i18n-Konfiguration
|
|
108
|
+
|
|
109
|
+
Definieren Sie Locales, Standard-Locale, RTL und Hilfsfunktionen für lokalisierte Pfade/URLs.
|
|
110
|
+
|
|
111
|
+
```ts fileName="i18n.config.ts"
|
|
112
|
+
export const locales = ["en", "fr"] as const;
|
|
113
|
+
export type Locale = (typeof locales)[number];
|
|
114
|
+
|
|
115
|
+
export const defaultLocale: Locale = "en";
|
|
116
|
+
|
|
117
|
+
export const rtlLocales = ["ar", "he", "fa", "ur"] as const;
|
|
118
|
+
export const isRtl = (locale: string) =>
|
|
119
|
+
(rtlLocales as readonly string[]).includes(locale);
|
|
120
|
+
|
|
121
|
+
export function localizedPath(locale: string, path: string) {
|
|
122
|
+
return locale === defaultLocale ? path : "/" + locale + path;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const ORIGIN = "https://example.com";
|
|
126
|
+
export function abs(locale: string, path: string) {
|
|
127
|
+
return ORIGIN + localizedPath(locale, path);
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Senior-Hinweis: Wenn Sie `next-i18next.config.js` verwenden, halten Sie es synchron mit `i18n.config.ts`, um Abweichungen zu vermeiden.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 4) Serverseitige i18n-Initialisierung
|
|
136
|
+
|
|
137
|
+
Initialisieren Sie i18next auf dem Server mit einem dynamischen Backend, das nur die benötigten Locale-/Namespace-JSON-Dateien importiert.
|
|
138
|
+
|
|
139
|
+
```ts fileName="src/app/i18n/server.ts"
|
|
140
|
+
import { createInstance } from "i18next";
|
|
141
|
+
import { initReactI18next } from "react-i18next/initReactI18next";
|
|
142
|
+
import resourcesToBackend from "i18next-resources-to-backend";
|
|
143
|
+
import { defaultLocale } from "@/i18n.config";
|
|
144
|
+
|
|
145
|
+
// Lade JSON-Ressourcen aus src/locales/<locale>/<namespace>.json
|
|
146
|
+
const backend = resourcesToBackend(
|
|
147
|
+
(locale: string, namespace: string) =>
|
|
148
|
+
import(`../../locales/${locale}/${namespace}.json`)
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
export async function initI18next(
|
|
152
|
+
locale: string,
|
|
153
|
+
namespaces: string[] = ["common"]
|
|
154
|
+
) {
|
|
155
|
+
const i18n = createInstance();
|
|
156
|
+
await i18n
|
|
157
|
+
.use(initReactI18next)
|
|
158
|
+
.use(backend)
|
|
159
|
+
.init({
|
|
160
|
+
lng: locale,
|
|
161
|
+
fallbackLng: defaultLocale,
|
|
162
|
+
ns: namespaces,
|
|
163
|
+
defaultNS: "common",
|
|
164
|
+
interpolation: { escapeValue: false },
|
|
165
|
+
react: { useSuspense: false },
|
|
166
|
+
});
|
|
167
|
+
return i18n;
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Zwischenhinweis: Halten Sie die Namespace-Liste pro Seite kurz, um die Payload zu begrenzen. Vermeiden Sie globale „Catch-all“-Bundles.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 5) Client-Provider für React-Komponenten
|
|
176
|
+
|
|
177
|
+
Umhüllen Sie Client-Komponenten mit einem Provider, der die Server-Konfiguration spiegelt und nur die angeforderten Namespaces lädt.
|
|
178
|
+
|
|
179
|
+
```tsx fileName="src/components/I18nProvider.tsx"
|
|
180
|
+
"use client";
|
|
181
|
+
|
|
182
|
+
import * as React from "react";
|
|
183
|
+
import { I18nextProvider } from "react-i18next";
|
|
184
|
+
import { createInstance } from "i18next";
|
|
185
|
+
import { initReactI18next } from "react-i18next/initReactI18next";
|
|
186
|
+
import resourcesToBackend from "i18next-resources-to-backend";
|
|
187
|
+
import { defaultLocale } from "@/i18n.config";
|
|
188
|
+
|
|
189
|
+
const backend = resourcesToBackend(
|
|
190
|
+
(locale: string, namespace: string) =>
|
|
191
|
+
import(`../../locales/${locale}/${namespace}.json`)
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
type Props = {
|
|
195
|
+
locale: string;
|
|
196
|
+
namespaces?: string[];
|
|
197
|
+
resources?: Record<string, any>; // { ns: Bundle }
|
|
198
|
+
children: React.ReactNode;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
export default function I18nProvider({
|
|
202
|
+
locale,
|
|
203
|
+
namespaces = ["common"],
|
|
204
|
+
resources,
|
|
205
|
+
children,
|
|
206
|
+
}: Props) {
|
|
207
|
+
const [i18n] = React.useState(() => {
|
|
208
|
+
const i = createInstance();
|
|
209
|
+
|
|
210
|
+
i.use(initReactI18next)
|
|
211
|
+
.use(backend)
|
|
212
|
+
.init({
|
|
213
|
+
lng: locale,
|
|
214
|
+
fallbackLng: defaultLocale,
|
|
215
|
+
ns: namespaces,
|
|
216
|
+
resources: resources ? { [locale]: resources } : undefined,
|
|
217
|
+
defaultNS: "common",
|
|
218
|
+
interpolation: { escapeValue: false },
|
|
219
|
+
react: { useSuspense: false },
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
return i;
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
return <I18nextProvider i18n={i18n}>{children}</I18nextProvider>;
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Junior-Tipp: Sie müssen nicht alle Nachrichten an den Client übergeben. Beginnen Sie nur mit den Namespaces der jeweiligen Seite.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 6) Lokalisierte Layouts und Routen
|
|
234
|
+
|
|
235
|
+
Legen Sie Sprache und Schreibrichtung fest und generieren Sie Routen pro Locale vor, um statisches Rendering zu bevorzugen.
|
|
236
|
+
|
|
237
|
+
```tsx fileName="src/app/[locale]/layout.tsx"
|
|
238
|
+
import type { ReactNode } from "react";
|
|
239
|
+
import { locales, defaultLocale, isRtl, type Locale } from "@/i18n.config";
|
|
240
|
+
|
|
241
|
+
export const dynamicParams = false;
|
|
242
|
+
|
|
243
|
+
export function generateStaticParams() {
|
|
244
|
+
return locales.map((locale) => ({ locale }));
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export default function LocaleLayout({
|
|
248
|
+
children,
|
|
249
|
+
params,
|
|
250
|
+
}: {
|
|
251
|
+
children: ReactNode;
|
|
252
|
+
params: { locale: string };
|
|
253
|
+
}) {
|
|
254
|
+
const locale: Locale = (locales as readonly string[]).includes(params.locale)
|
|
255
|
+
? (params.locale as any)
|
|
256
|
+
: defaultLocale;
|
|
257
|
+
|
|
258
|
+
const dir = isRtl(locale) ? "rtl" : "ltr";
|
|
259
|
+
|
|
260
|
+
return (
|
|
261
|
+
<html lang={locale} dir={dir}>
|
|
262
|
+
<body>{children}</body>
|
|
263
|
+
</html>
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 7) Beispielseite mit Server- und Client-Nutzung
|
|
271
|
+
|
|
272
|
+
```tsx fileName="src/app/[locale]/about.tsx"
|
|
273
|
+
import I18nProvider from "@/components/I18nProvider";
|
|
274
|
+
import { initI18next } from "@/app/i18n/server";
|
|
275
|
+
import type { Locale } from "@/i18n.config";
|
|
276
|
+
import ClientComponent from "@/components/ClientComponent";
|
|
277
|
+
import ServerComponent from "@/components/ServerComponent";
|
|
278
|
+
|
|
279
|
+
// Erzwinge statisches Rendering für die Seite
|
|
280
|
+
export const dynamic = "force-static";
|
|
281
|
+
|
|
282
|
+
export default async function AboutPage({
|
|
283
|
+
params: { locale },
|
|
284
|
+
}: {
|
|
285
|
+
params: { locale: Locale };
|
|
286
|
+
}) {
|
|
287
|
+
const namespaces = ["common", "about"] as const;
|
|
288
|
+
|
|
289
|
+
const i18n = await initI18next(locale, [...namespaces]);
|
|
290
|
+
const tAbout = i18n.getFixedT(locale, "about");
|
|
291
|
+
|
|
292
|
+
return (
|
|
293
|
+
<I18nProvider locale={locale} namespaces={[...namespaces]}>
|
|
294
|
+
<main>
|
|
295
|
+
<h1>{tAbout("title")}</h1>
|
|
296
|
+
|
|
297
|
+
<ClientComponent />
|
|
298
|
+
<ServerComponent t={tAbout} locale={locale} count={0} />
|
|
299
|
+
</main>
|
|
300
|
+
</I18nProvider>
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
Übersetzungen (jeweils eine JSON-Datei pro Namespace unter `src/locales/...`):
|
|
306
|
+
|
|
307
|
+
```json fileName="src/locales/de/about.json"
|
|
308
|
+
{
|
|
309
|
+
"title": "Über",
|
|
310
|
+
"description": "Beschreibung der Über-Seite",
|
|
311
|
+
"counter": {
|
|
312
|
+
"label": "Zähler",
|
|
313
|
+
"increment": "Erhöhen"
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
```json fileName="src/locales/fr/about.json"
|
|
319
|
+
{
|
|
320
|
+
"title": "À propos",
|
|
321
|
+
"description": "Description de la page À propos",
|
|
322
|
+
"counter": {
|
|
323
|
+
"label": "Compteur",
|
|
324
|
+
"increment": "Incrémenter"
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
Client-Komponente (lädt nur den benötigten Namespace):
|
|
330
|
+
|
|
331
|
+
```tsx fileName="src/components/ClientComponent.tsx"
|
|
332
|
+
"use client";
|
|
333
|
+
|
|
334
|
+
import React, { useState } from "react";
|
|
335
|
+
import { useTranslation } from "react-i18next";
|
|
336
|
+
|
|
337
|
+
const ClientComponent = () => {
|
|
338
|
+
const { t, i18n } = useTranslation("about");
|
|
339
|
+
const [count, setCount] = useState(0);
|
|
340
|
+
|
|
341
|
+
const numberFormat = new Intl.NumberFormat(i18n.language);
|
|
342
|
+
|
|
343
|
+
return (
|
|
344
|
+
<div>
|
|
345
|
+
<p>{numberFormat.format(count)}</p>
|
|
346
|
+
<button
|
|
347
|
+
aria-label={t("counter.label")}
|
|
348
|
+
onClick={() => setCount((c) => c + 1)}
|
|
349
|
+
>
|
|
350
|
+
{t("counter.increment")}
|
|
351
|
+
</button>
|
|
352
|
+
</div>
|
|
353
|
+
);
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
export default ClientComponent;
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
> Stellen Sie sicher, dass die Seite/der Provider nur die benötigten Namespaces enthält (z. B. `about`).
|
|
360
|
+
> Wenn Sie React < 19 verwenden, sollten Sie schwere Formatter wie `Intl.NumberFormat` memoizen.
|
|
361
|
+
|
|
362
|
+
Synchroner Server-Komponent, eingebettet unter einer Client-Grenze:
|
|
363
|
+
|
|
364
|
+
```tsx fileName="src/components/ServerComponent.tsx"
|
|
365
|
+
type ServerComponentProps = {
|
|
366
|
+
t: (key: string) => string;
|
|
367
|
+
locale: string;
|
|
368
|
+
count: number;
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
const ServerComponent = ({ t, locale, count }: ServerComponentProps) => {
|
|
372
|
+
const formatted = new Intl.NumberFormat(locale).format(count);
|
|
373
|
+
|
|
374
|
+
return (
|
|
375
|
+
<div>
|
|
376
|
+
<p>{formatted}</p>
|
|
377
|
+
<button aria-label={t("counter.label")}>{t("counter.increment")}</button>
|
|
378
|
+
</div>
|
|
379
|
+
);
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
export default ServerComponent;
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
## 8) SEO: Metadaten, Hreflang, Sitemap, Robots
|
|
388
|
+
|
|
389
|
+
Die Übersetzung von Inhalten ist ein Mittel, um die Reichweite zu verbessern. Implementieren Sie mehrsprachiges SEO gründlich.
|
|
390
|
+
|
|
391
|
+
Best Practices:
|
|
392
|
+
|
|
393
|
+
- Setzen Sie `lang` und `dir` an der Wurzel
|
|
394
|
+
- Fügen Sie `alternates.languages` für jede Locale hinzu (+ `x-default`)
|
|
395
|
+
- Listen Sie übersetzte URLs in der `sitemap.xml` auf und verwenden Sie `hreflang`
|
|
396
|
+
- Schließen Sie lokalisierte private Bereiche (z.B. `/fr/admin`) in `robots.txt` aus
|
|
397
|
+
|
|
398
|
+
```tsx fileName="src/app/[locale]/about/layout.tsx"
|
|
399
|
+
import type { Metadata } from "next";
|
|
400
|
+
import { locales, defaultLocale, localizedPath } from "@/i18n.config";
|
|
401
|
+
|
|
402
|
+
export async function generateMetadata({
|
|
403
|
+
params,
|
|
404
|
+
}: {
|
|
405
|
+
params: { locale: string };
|
|
406
|
+
}): Promise<Metadata> {
|
|
407
|
+
const { locale } = params;
|
|
408
|
+
|
|
409
|
+
// Importiere das korrekte JSON-Bündel aus src/locales
|
|
410
|
+
const messages = (await import("@/locales/" + locale + "/about.json"))
|
|
411
|
+
.default;
|
|
412
|
+
|
|
413
|
+
const languages = Object.fromEntries(
|
|
414
|
+
locales.map((locale) => [locale, localizedPath(locale, "/about")])
|
|
415
|
+
);
|
|
416
|
+
|
|
417
|
+
return {
|
|
418
|
+
title: messages.title,
|
|
419
|
+
description: messages.description,
|
|
420
|
+
alternates: {
|
|
421
|
+
canonical: localizedPath(locale, "/about"),
|
|
422
|
+
languages: { ...languages, "x-default": "/about" },
|
|
423
|
+
},
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
export default async function AboutPage() {
|
|
428
|
+
return <h1>Über</h1>;
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
```ts fileName="src/app/sitemap.ts"
|
|
433
|
+
import type { MetadataRoute } from "next";
|
|
434
|
+
import { locales, defaultLocale, abs } from "@/i18n.config";
|
|
435
|
+
|
|
436
|
+
export default function sitemap(): MetadataRoute.Sitemap {
|
|
437
|
+
const languages = Object.fromEntries(
|
|
438
|
+
locales.map((locale) => [locale, abs(locale, "/about")])
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
return [
|
|
442
|
+
{
|
|
443
|
+
url: abs(defaultLocale, "/about"),
|
|
444
|
+
lastModified: new Date(),
|
|
445
|
+
changeFrequency: "monthly",
|
|
446
|
+
priority: 0.7,
|
|
447
|
+
alternates: { languages },
|
|
448
|
+
},
|
|
449
|
+
];
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
```ts fileName="src/app/robots.ts"
|
|
454
|
+
import type { MetadataRoute } from "next";
|
|
455
|
+
import { locales, defaultLocale, localizedPath } from "@/i18n.config";
|
|
456
|
+
|
|
457
|
+
const ORIGIN = "https://example.com";
|
|
458
|
+
|
|
459
|
+
const expandAllLocales = (path: string) => [
|
|
460
|
+
localizedPath(defaultLocale, path),
|
|
461
|
+
...locales
|
|
462
|
+
.filter((locale) => locale !== defaultLocale)
|
|
463
|
+
.map((locale) => localizedPath(locale, path)),
|
|
464
|
+
];
|
|
465
|
+
|
|
466
|
+
export default function robots(): MetadataRoute.Robots {
|
|
467
|
+
const disallow = [
|
|
468
|
+
...expandAllLocales("/dashboard"),
|
|
469
|
+
...expandAllLocales("/admin"),
|
|
470
|
+
];
|
|
471
|
+
|
|
472
|
+
return {
|
|
473
|
+
rules: { userAgent: "*", allow: ["/"], disallow },
|
|
474
|
+
host: ORIGIN,
|
|
475
|
+
sitemap: ORIGIN + "/sitemap.xml",
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
## 9) Middleware für Locale-Routing
|
|
483
|
+
|
|
484
|
+
Erkennt die Locale und leitet bei Fehlen auf eine lokalisierte Route weiter.
|
|
485
|
+
|
|
486
|
+
```ts fileName="src/middleware.ts"
|
|
487
|
+
import { NextResponse, type NextRequest } from "next/server";
|
|
488
|
+
import { defaultLocale, locales } from "@/i18n.config";
|
|
489
|
+
|
|
490
|
+
const PUBLIC_FILE = /\.[^/]+$/; // schließt Dateien mit Erweiterungen aus
|
|
491
|
+
|
|
492
|
+
export function middleware(request: NextRequest) {
|
|
493
|
+
const { pathname } = request.nextUrl;
|
|
494
|
+
|
|
495
|
+
if (
|
|
496
|
+
pathname.startsWith("/_next") ||
|
|
497
|
+
pathname.startsWith("/api") ||
|
|
498
|
+
pathname.startsWith("/static") ||
|
|
499
|
+
PUBLIC_FILE.test(pathname)
|
|
500
|
+
) {
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
const hasLocale = locales.some(
|
|
505
|
+
(locale) =>
|
|
506
|
+
pathname === "/" + locale || pathname.startsWith("/" + locale + "/")
|
|
507
|
+
);
|
|
508
|
+
if (!hasLocale) {
|
|
509
|
+
const locale = defaultLocale;
|
|
510
|
+
const url = request.nextUrl.clone();
|
|
511
|
+
url.pathname = "/" + locale + (pathname === "/" ? "" : pathname);
|
|
512
|
+
return NextResponse.redirect(url);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
export const config = {
|
|
517
|
+
matcher: [
|
|
518
|
+
// Alle Pfade abgleichen, außer denen, die mit diesen beginnen, und Dateien mit einer Erweiterung
|
|
519
|
+
"/((?!api|_next|static|.*\\..*).*)",
|
|
520
|
+
],
|
|
521
|
+
};
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
---
|
|
525
|
+
|
|
526
|
+
## 10) Performance- und DX-Best Practices
|
|
527
|
+
|
|
528
|
+
- **Setze html `lang` und `dir`**: Erledigt in `src/app/[locale]/layout.tsx`.
|
|
529
|
+
- **Teile Nachrichten nach Namespace auf**: Halte Bundles klein (`common.json`, `about.json` usw.).
|
|
530
|
+
- **Minimiere Client-Payload**: Übergebe auf Seiten nur die benötigten Namespaces an den Provider.
|
|
531
|
+
- **Bevorzuge statische Seiten**: Verwende `export const dynamic = 'force-static'` und `generateStaticParams` pro Locale.
|
|
532
|
+
- **Synchronisiere Server-Komponenten**: Übergebe vorab berechnete Strings/Formatierungen statt asynchroner Aufrufe zur Renderzeit.
|
|
533
|
+
- **Memoisiere aufwändige Operationen**: Besonders im Client-Code für ältere React-Versionen.
|
|
534
|
+
- **Cache und Header**: Bevorzuge statisches oder `revalidate` Rendering gegenüber dynamischem Rendering, wenn möglich.
|
|
535
|
+
|
|
536
|
+
---
|
|
537
|
+
|
|
538
|
+
## 11) Testing und CI
|
|
539
|
+
|
|
540
|
+
- Füge Unit-Tests für Komponenten hinzu, die `t` verwenden, um sicherzustellen, dass Schlüssel existieren.
|
|
541
|
+
- Validieren Sie, dass jeder Namespace in allen Sprachen die gleichen Schlüssel enthält.
|
|
542
|
+
- Fehlende Schlüssel während der CI vor der Bereitstellung anzeigen.
|
|
543
|
+
|
|
544
|
+
Intlayer automatisiert einen Großteil davon (siehe nächsten Abschnitt).
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
## 12) Intlayer oben drauf hinzufügen (Automatisierung)
|
|
549
|
+
|
|
550
|
+
Intlayer hilft Ihnen, JSON-Übersetzungen synchron zu halten, auf fehlende Schlüssel zu testen und bei Bedarf mit KI zu ergänzen.
|
|
551
|
+
|
|
552
|
+
Installieren Sie die Intlayer-Abhängigkeiten:
|
|
553
|
+
|
|
554
|
+
```bash packageManager="npm"
|
|
555
|
+
npm install intlayer @intlayer/sync-json-plugin -D
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
```bash packageManager="pnpm"
|
|
559
|
+
pnpm add intlayer @intlayer/sync-json-plugin -D
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
```bash packageManager="yarn"
|
|
563
|
+
yarn add intlayer @intlayer/sync-json-plugin -D
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
```ts fileName="intlayer.config.ts"
|
|
567
|
+
import { type IntlayerConfig, Locales } from "intlayer";
|
|
568
|
+
import { locales, defaultLocale } from "@/i18n";
|
|
569
|
+
import { syncJSON } from "@intlayer/sync-json";
|
|
570
|
+
|
|
571
|
+
export const locales = [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH];
|
|
572
|
+
|
|
573
|
+
const config: IntlayerConfig = {
|
|
574
|
+
internationalization: {
|
|
575
|
+
locales,
|
|
576
|
+
defaultLocale,
|
|
577
|
+
},
|
|
578
|
+
ai: {
|
|
579
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
580
|
+
},
|
|
581
|
+
plugins: [
|
|
582
|
+
syncJSON({
|
|
583
|
+
source: ({ locale }) => `./locales/${locale}.json`,
|
|
584
|
+
}),
|
|
585
|
+
],
|
|
586
|
+
};
|
|
587
|
+
|
|
588
|
+
export default config;
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
Fügen Sie Paketskripte hinzu:
|
|
592
|
+
|
|
593
|
+
```json fileName="package.json"
|
|
594
|
+
{
|
|
595
|
+
"scripts": {
|
|
596
|
+
"i18n:fill": "intlayer fill",
|
|
597
|
+
"i18n:test": "intlayer test"
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
```
|
|
601
|
+
|
|
602
|
+
Übliche Abläufe:
|
|
603
|
+
|
|
604
|
+
- `pnpm i18n:test` in CI, um Builds bei fehlenden Schlüsseln fehlschlagen zu lassen
|
|
605
|
+
- `pnpm i18n:fill` lokal, um KI-Übersetzungen für neu hinzugefügte Schlüssel vorzuschlagen
|
|
606
|
+
|
|
607
|
+
> Sie können CLI-Argumente angeben; siehe die [Intlayer CLI-Dokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_cli.md).
|
|
608
|
+
|
|
609
|
+
---
|
|
610
|
+
|
|
611
|
+
## 13) Fehlerbehebung
|
|
612
|
+
|
|
613
|
+
- **Schlüssel nicht gefunden**: Stellen Sie sicher, dass die Seite/der Provider die korrekten Namespaces auflistet und die JSON-Datei unter `src/locales/<locale>/<namespace>.json` existiert.
|
|
614
|
+
- **Falsche Sprache/kurzer englischer Blitz**: Überprüfen Sie die Lokalerkennung in `middleware.ts` und den Provider-Parameter `lng`.
|
|
615
|
+
- **Probleme mit RTL-Layout**: Vergewissern Sie sich, dass `dir` von `isRtl(locale)` abgeleitet wird und dass Ihr CSS `[dir="rtl"]` berücksichtigt.
|
|
616
|
+
- **SEO-Alternativen fehlen**: Bestätigen Sie, dass `alternates.languages` alle Locales und `x-default` enthält.
|
|
617
|
+
- **Bundles zu groß**: Teilen Sie Namespaces weiter auf und vermeiden Sie das Importieren ganzer `locales`-Bäume auf der Client-Seite.
|
|
618
|
+
|
|
619
|
+
---
|
|
620
|
+
|
|
621
|
+
## 14) Was kommt als Nächstes
|
|
622
|
+
|
|
623
|
+
- Fügen Sie weitere Sprachen und Namespaces hinzu, wenn die Funktionen wachsen
|
|
624
|
+
- Lokalisieren Sie Fehlerseiten, E-Mails und API-gesteuerte Inhalte
|
|
625
|
+
- Erweitern Sie die Intlayer-Workflows, um automatisch PRs für Übersetzungsupdates zu öffnen
|
|
626
|
+
|
|
627
|
+
Wenn Sie einen Starter bevorzugen, probieren Sie die Vorlage: `https://github.com/aymericzip/intlayer-next-i18next-template`.
|