@intlayer/docs 7.0.7 → 7.0.8
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,362 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-09-28
|
|
3
|
+
updatedAt: 2025-09-28
|
|
4
|
+
title: SEO i i18n w Next.js
|
|
5
|
+
description: Dowiedz się, jak skonfigurować wielojęzyczne SEO w swojej aplikacji Next.js, używając next-intl, next-i18next i Intlayer.
|
|
6
|
+
keywords:
|
|
7
|
+
- Intlayer
|
|
8
|
+
- SEO
|
|
9
|
+
- Internacjonalizacja
|
|
10
|
+
- Next.js
|
|
11
|
+
- i18n
|
|
12
|
+
- JavaScript
|
|
13
|
+
- React
|
|
14
|
+
- next-intl
|
|
15
|
+
- next-i18next
|
|
16
|
+
slugs:
|
|
17
|
+
- blog
|
|
18
|
+
- blog-seo-i18n-nextjs
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# SEO i i18n w Next.js: Tłumaczenie to za mało
|
|
22
|
+
|
|
23
|
+
Kiedy deweloperzy myślą o internacjonalizacji (i18n), ich pierwszym odruchem jest często: _przetłumacz zawartość_. Jednak ludzie zazwyczaj zapominają, że głównym celem internacjonalizacji jest uczynienie Twojej strony bardziej widoczną dla świata.
|
|
24
|
+
Jeśli Twoja wielojęzyczna aplikacja Next.js nie informuje wyszukiwarek, jak indeksować i rozumieć różne wersje językowe, większość Twoich wysiłków może pozostać niezauważona.
|
|
25
|
+
|
|
26
|
+
W tym wpisie na blogu omówimy, **dlaczego i18n to supermoc SEO** oraz jak poprawnie zaimplementować ją w Next.js za pomocą `next-intl`, `next-i18next` i `Intlayer`.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Dlaczego SEO i i18n
|
|
31
|
+
|
|
32
|
+
Dodanie języków to nie tylko kwestia UX. To także potężny dźwignia dla **organicznej widoczności**. Oto dlaczego:
|
|
33
|
+
|
|
34
|
+
1. **Lepsza wykrywalność:** Wyszukiwarki indeksują zlokalizowane wersje i pozycjonują je dla użytkowników szukających w ich rodzimym języku.
|
|
35
|
+
2. **Unikanie duplikatów treści:** Poprawne tagi kanoniczne i alternatywne informują roboty, która strona należy do którego języka.
|
|
36
|
+
3. **Lepsze UX:** Odwiedzający trafiają od razu na właściwą wersję Twojej strony.
|
|
37
|
+
4. **Przewaga konkurencyjna:** Niewiele stron dobrze wdraża wielojęzyczne SEO, co oznacza, że możesz się wyróżnić.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Najlepsze praktyki dla wielojęzycznego SEO w Next.js
|
|
42
|
+
|
|
43
|
+
Oto lista kontrolna, którą powinna wdrożyć każda wielojęzyczna aplikacja:
|
|
44
|
+
|
|
45
|
+
- **Ustaw meta tagi `hreflang` w `<head>`**
|
|
46
|
+
Pomaga Google zrozumieć, które wersje istnieją dla każdego języka.
|
|
47
|
+
|
|
48
|
+
- **Wymień wszystkie przetłumaczone strony w `sitemap.xml`**
|
|
49
|
+
Użyj schematu `xhtml`, aby roboty mogły łatwo znaleźć alternatywy.
|
|
50
|
+
|
|
51
|
+
- **Wyklucz prywatne/zlokalizowane ścieżki w `robots.txt`**
|
|
52
|
+
np. nie pozwól na indeksowanie `/dashboard`, `/fr/dashboard`, `/es/dashboard`.
|
|
53
|
+
|
|
54
|
+
- **Używaj zlokalizowanych linków**
|
|
55
|
+
Przykład: `<a href="/fr/about">À propos</a>` zamiast linkować do domyślnego `/about`.
|
|
56
|
+
|
|
57
|
+
To proste kroki — ale ich pominięcie może kosztować Cię widoczność.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Przykłady implementacji
|
|
62
|
+
|
|
63
|
+
Programiści często zapominają o prawidłowym odwoływaniu się do swoich stron w różnych lokalizacjach, więc przyjrzyjmy się, jak to działa w praktyce z różnymi bibliotekami.
|
|
64
|
+
|
|
65
|
+
### **next-intl**
|
|
66
|
+
|
|
67
|
+
<Tabs>
|
|
68
|
+
<TabItem label="next-intl">
|
|
69
|
+
|
|
70
|
+
```tsx fileName="src/app/[locale]/about/layout.tsx
|
|
71
|
+
import type { Metadata } from "next";
|
|
72
|
+
import { locales, defaultLocale } from "@/i18n";
|
|
73
|
+
import { getTranslations, unstable_setRequestLocale } from "next-intl/server";
|
|
74
|
+
|
|
75
|
+
function localizedPath(locale: string, path: string) {
|
|
76
|
+
return locale === defaultLocale ? path : `/${locale}${path}`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function generateMetadata({
|
|
80
|
+
params,
|
|
81
|
+
}: {
|
|
82
|
+
params: { locale: string };
|
|
83
|
+
}): Promise<Metadata> {
|
|
84
|
+
const { locale } = params;
|
|
85
|
+
const t = await getTranslations({ locale, namespace: "about" });
|
|
86
|
+
|
|
87
|
+
const url = "/about";
|
|
88
|
+
const languages = Object.fromEntries(
|
|
89
|
+
locales.map((l) => [l, localizedPath(l, url)])
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
title: t("title"),
|
|
94
|
+
description: t("description"),
|
|
95
|
+
alternates: {
|
|
96
|
+
canonical: localizedPath(locale, url),
|
|
97
|
+
languages: { ...languages, "x-default": url },
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ... Reszta kodu strony
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
```tsx fileName="src/app/sitemap.ts"
|
|
106
|
+
import type { MetadataRoute } from "next";
|
|
107
|
+
import { locales, defaultLocale } from "@/i18n";
|
|
108
|
+
|
|
109
|
+
const origin = "https://example.com";
|
|
110
|
+
|
|
111
|
+
const formatterLocalizedPath = (locale: string, path: string) =>
|
|
112
|
+
locale === defaultLocale ? `${origin}${path}` : `${origin}/${locale}${path}`;
|
|
113
|
+
|
|
114
|
+
export default function sitemap(): MetadataRoute.Sitemap {
|
|
115
|
+
const aboutLanguages = Object.fromEntries(
|
|
116
|
+
locales.map((l) => [l, formatterLocalizedPath(l, "/about")])
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
return [
|
|
120
|
+
{
|
|
121
|
+
url: formatterLocalizedPath(defaultLocale, "/about"),
|
|
122
|
+
lastModified: new Date(),
|
|
123
|
+
changeFrequency: "monthly",
|
|
124
|
+
priority: 0.7,
|
|
125
|
+
alternates: { languages: aboutLanguages },
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
```tsx fileName="src/app/robots.ts"
|
|
132
|
+
import type { MetadataRoute } from "next";
|
|
133
|
+
import { locales, defaultLocale } from "@/i18n";
|
|
134
|
+
|
|
135
|
+
const origin = "https://example.com";
|
|
136
|
+
const withAllLocales = (path: string) => [
|
|
137
|
+
path,
|
|
138
|
+
...locales.filter((l) => l !== defaultLocale).map((l) => `/${l}${path}`),
|
|
139
|
+
];
|
|
140
|
+
|
|
141
|
+
export default function robots(): MetadataRoute.Robots {
|
|
142
|
+
const disallow = [
|
|
143
|
+
...withAllLocales("/dashboard"),
|
|
144
|
+
...withAllLocales("/admin"),
|
|
145
|
+
];
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
rules: { userAgent: "*", allow: ["/"], disallow },
|
|
149
|
+
host: origin,
|
|
150
|
+
sitemap: `${origin}/sitemap.xml`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### **next-i18next**
|
|
156
|
+
|
|
157
|
+
</TabItem>
|
|
158
|
+
<TabItem label="next-i18next">
|
|
159
|
+
|
|
160
|
+
```ts fileName="i18n.config.ts"
|
|
161
|
+
export const locales = ["en", "fr"] as const;
|
|
162
|
+
export type Locale = (typeof locales)[number];
|
|
163
|
+
export const defaultLocale: Locale = "en";
|
|
164
|
+
|
|
165
|
+
/** Prefiks ścieżki z lokalizacją, chyba że jest to domyślna lokalizacja */
|
|
166
|
+
export function localizedPath(locale: string, path: string) {
|
|
167
|
+
return locale === defaultLocale ? path : `/${locale}${path}`;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** Pomocnik do tworzenia absolutnego URL */
|
|
171
|
+
const ORIGIN = "https://example.com";
|
|
172
|
+
export function abs(locale: string, path: string) {
|
|
173
|
+
return `${ORIGIN}${localizedPath(locale, path)}`;
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
```tsx fileName="src/app/[locale]/about/layout.tsx"
|
|
178
|
+
import type { Metadata } from "next";
|
|
179
|
+
import { locales, defaultLocale, localizedPath } from "@/i18n.config";
|
|
180
|
+
|
|
181
|
+
export async function generateMetadata({
|
|
182
|
+
params,
|
|
183
|
+
}: {
|
|
184
|
+
params: { locale: string };
|
|
185
|
+
}): Promise<Metadata> {
|
|
186
|
+
const { locale } = params;
|
|
187
|
+
|
|
188
|
+
// Dynamicznie importuj odpowiedni plik JSON
|
|
189
|
+
const messages = (await import(`@/../public/locales/${locale}/about.json`))
|
|
190
|
+
.default;
|
|
191
|
+
|
|
192
|
+
const languages = Object.fromEntries(
|
|
193
|
+
locales.map((l) => [l, localizedPath(l, "/about")])
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
return {
|
|
197
|
+
title: messages.title,
|
|
198
|
+
description: messages.description,
|
|
199
|
+
alternates: {
|
|
200
|
+
canonical: localizedPath(locale, "/about"),
|
|
201
|
+
languages: { ...languages, "x-default": "/about" },
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export default async function AboutPage() {
|
|
207
|
+
return <h1>O nas</h1>;
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
```ts fileName="src/app/sitemap.ts"
|
|
212
|
+
import type { MetadataRoute } from "next";
|
|
213
|
+
import { locales, defaultLocale, abs } from "@/i18n.config";
|
|
214
|
+
|
|
215
|
+
export default function sitemap(): MetadataRoute.Sitemap {
|
|
216
|
+
const languages = Object.fromEntries(
|
|
217
|
+
locales.map((l) => [l, abs(l, "/about")])
|
|
218
|
+
);
|
|
219
|
+
return [
|
|
220
|
+
{
|
|
221
|
+
url: abs(defaultLocale, "/about"),
|
|
222
|
+
lastModified: new Date(),
|
|
223
|
+
changeFrequency: "monthly",
|
|
224
|
+
priority: 0.7,
|
|
225
|
+
alternates: { languages },
|
|
226
|
+
},
|
|
227
|
+
];
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
```ts fileName="src/app/robots.ts"
|
|
232
|
+
import type { MetadataRoute } from "next";
|
|
233
|
+
import { locales, defaultLocale, localizedPath } from "@/i18n.config";
|
|
234
|
+
|
|
235
|
+
const ORIGIN = "https://example.com";
|
|
236
|
+
|
|
237
|
+
const expandAllLocales = (path: string) => [
|
|
238
|
+
localizedPath(defaultLocale, path),
|
|
239
|
+
...locales
|
|
240
|
+
.filter((l) => l !== defaultLocale)
|
|
241
|
+
.map((l) => localizedPath(l, path)),
|
|
242
|
+
];
|
|
243
|
+
|
|
244
|
+
export default function robots(): MetadataRoute.Robots {
|
|
245
|
+
const disallow = [
|
|
246
|
+
...expandAllLocales("/dashboard"),
|
|
247
|
+
...expandAllLocales("/admin"),
|
|
248
|
+
];
|
|
249
|
+
|
|
250
|
+
return {
|
|
251
|
+
rules: { userAgent: "*", allow: ["/"], disallow },
|
|
252
|
+
host: ORIGIN,
|
|
253
|
+
sitemap: `${ORIGIN}/sitemap.xml`,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### **Intlayer**
|
|
259
|
+
|
|
260
|
+
</TabItem>
|
|
261
|
+
<TabItem label="intlayer">
|
|
262
|
+
|
|
263
|
+
````typescript fileName="src/app/[locale]/about/layout.tsx"
|
|
264
|
+
import { getIntlayer, getMultilingualUrls } from "intlayer";
|
|
265
|
+
import type { Metadata } from "next";
|
|
266
|
+
import type { LocalPromiseParams } from "next-intlayer";
|
|
267
|
+
|
|
268
|
+
export const generateMetadata = async ({
|
|
269
|
+
params,
|
|
270
|
+
}: LocalPromiseParams): Promise<Metadata> => {
|
|
271
|
+
const { locale } = await params;
|
|
272
|
+
|
|
273
|
+
const metadata = getIntlayer("page-metadata", locale);
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Generuje obiekt zawierający wszystkie adresy URL dla każdej lokalizacji.
|
|
277
|
+
*
|
|
278
|
+
* Przykład:
|
|
279
|
+
* ```ts
|
|
280
|
+
* getMultilingualUrls('/about');
|
|
281
|
+
*
|
|
282
|
+
* // Zwraca
|
|
283
|
+
* // {
|
|
284
|
+
* // en: '/about',
|
|
285
|
+
* // fr: '/fr/about',
|
|
286
|
+
* // es: '/es/about',
|
|
287
|
+
* // }
|
|
288
|
+
* ```
|
|
289
|
+
*/
|
|
290
|
+
const multilingualUrls = getMultilingualUrls("/about");
|
|
291
|
+
|
|
292
|
+
return {
|
|
293
|
+
...metadata,
|
|
294
|
+
alternates: {
|
|
295
|
+
canonical: multilingualUrls[locale as keyof typeof multilingualUrls],
|
|
296
|
+
languages: { ...multilingualUrls, "x-default": "/about" },
|
|
297
|
+
},
|
|
298
|
+
};
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
// ... Reszta kodu strony
|
|
302
|
+
````
|
|
303
|
+
|
|
304
|
+
```tsx fileName="src/app/sitemap.ts"
|
|
305
|
+
import { getMultilingualUrls } from "intlayer";
|
|
306
|
+
import type { MetadataRoute } from "next";
|
|
307
|
+
|
|
308
|
+
const sitemap = (): MetadataRoute.Sitemap => [
|
|
309
|
+
{
|
|
310
|
+
url: "https://example.com/about",
|
|
311
|
+
alternates: {
|
|
312
|
+
languages: { ...getMultilingualUrls("https://example.com/about") },
|
|
313
|
+
},
|
|
314
|
+
},
|
|
315
|
+
];
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
```tsx fileName="src/app/robots.ts"
|
|
319
|
+
import { getMultilingualUrls } from "intlayer";
|
|
320
|
+
import type { MetadataRoute } from "next";
|
|
321
|
+
|
|
322
|
+
// Funkcja zwracająca wszystkie wielojęzyczne adresy URL z podanej listy
|
|
323
|
+
const getAllMultilingualUrls = (urls: string[]) =>
|
|
324
|
+
urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);
|
|
325
|
+
|
|
326
|
+
// Konfiguracja pliku robots.txt z regułami dostępu i sitemapą
|
|
327
|
+
const robots = (): MetadataRoute.Robots => ({
|
|
328
|
+
rules: {
|
|
329
|
+
userAgent: "*",
|
|
330
|
+
allow: ["/"],
|
|
331
|
+
disallow: getAllMultilingualUrls(["/dashboard"]), // Blokowanie dostępu do /dashboard we wszystkich lokalizacjach
|
|
332
|
+
},
|
|
333
|
+
host: "https://example.com",
|
|
334
|
+
sitemap: `https://example.com/sitemap.xml`,
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
export default robots;
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
> Intlayer zapewnia funkcję `getMultilingualUrls`, która generuje wielojęzyczne adresy URL dla Twojej mapy witryny.
|
|
341
|
+
|
|
342
|
+
</TabItem>
|
|
343
|
+
</Tabs>
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Podsumowanie
|
|
348
|
+
|
|
349
|
+
Poprawne wdrożenie i18n w Next.js to nie tylko tłumaczenie tekstu, ale także upewnienie się, że wyszukiwarki i użytkownicy dokładnie wiedzą, którą wersję Twoich treści wyświetlić.
|
|
350
|
+
Konfiguracja hreflang, map witryn i reguł robots to klucz do przekształcenia tłumaczeń w realną wartość SEO.
|
|
351
|
+
|
|
352
|
+
Chociaż next-intl i next-i18next oferują solidne metody integracji, zazwyczaj wymagają one dużo ręcznej konfiguracji, aby zachować spójność między lokalizacjami.
|
|
353
|
+
|
|
354
|
+
To właśnie tutaj Intlayer naprawdę błyszczy:
|
|
355
|
+
|
|
356
|
+
Dostarcza wbudowane narzędzia, takie jak getMultilingualUrls, które sprawiają, że integracja hreflang, map witryn i robots jest niemal bezwysiłkowa.
|
|
357
|
+
|
|
358
|
+
Metadane pozostają scentralizowane, zamiast być rozproszone w plikach JSON lub niestandardowych narzędziach.
|
|
359
|
+
|
|
360
|
+
Jest zaprojektowany od podstaw dla Next.js, dzięki czemu spędzasz mniej czasu na debugowaniu konfiguracji, a więcej na wdrażaniu.
|
|
361
|
+
|
|
362
|
+
Jeśli Twoim celem nie jest tylko tłumaczenie, ale skalowanie wielojęzycznego SEO bez przeszkód, Intlayer zapewnia najczystsze i najbardziej przyszłościowe rozwiązanie.
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-09-10
|
|
3
|
+
updatedAt: 2025-09-10
|
|
4
|
+
title: Budowanie asystenta dokumentacji opartego na RAG (dzielenie na fragmenty, osadzenia i wyszukiwanie)
|
|
5
|
+
description: Budowanie asystenta dokumentacji opartego na RAG (dzielenie na fragmenty, osadzenia i wyszukiwanie)
|
|
6
|
+
keywords:
|
|
7
|
+
- RAG
|
|
8
|
+
- Dokumentacja
|
|
9
|
+
- Asystent
|
|
10
|
+
- Dzielenie na fragmenty
|
|
11
|
+
- Osadzenia
|
|
12
|
+
- Wyszukiwanie
|
|
13
|
+
slugs:
|
|
14
|
+
- blog
|
|
15
|
+
- rag-powered-documentation-assistant
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Budowanie asystenta dokumentacji opartego na RAG (dzielenie na fragmenty, osadzenia i wyszukiwanie)
|
|
19
|
+
|
|
20
|
+
## Co otrzymujesz
|
|
21
|
+
|
|
22
|
+
Zbudowałem asystenta dokumentacji opartego na RAG i zapakowałem go w boilerplate, którego możesz od razu użyć.
|
|
23
|
+
|
|
24
|
+
- Zawiera gotową do użycia aplikację (Next.js + OpenAI API)
|
|
25
|
+
- Zawiera działający pipeline RAG (dzielenie na fragmenty, osadzenia, podobieństwo cosinusowe)
|
|
26
|
+
- Zapewnia kompletny interfejs chatbota zbudowany w React
|
|
27
|
+
- Wszystkie komponenty UI są w pełni edytowalne za pomocą Tailwind CSS
|
|
28
|
+
- Rejestruje każde zapytanie użytkownika, aby pomóc zidentyfikować brakujące dokumenty, problemy użytkowników i możliwości produktowe
|
|
29
|
+
|
|
30
|
+
👉 [Demo na żywo](https://intlayer.org/doc/why) 👉 [Boilerplate kodu](https://github.com/aymericzip/smart_doc_RAG)
|
|
31
|
+
|
|
32
|
+
## Wprowadzenie
|
|
33
|
+
|
|
34
|
+
Jeśli kiedykolwiek zgubiłeś się w dokumentacji, przewijając bez końca w poszukiwaniu jednej odpowiedzi, wiesz, jak to może być frustrujące. Dokumentacja jest przydatna, ale jest statyczna, a jej przeszukiwanie często wydaje się nieporęczne.
|
|
35
|
+
|
|
36
|
+
Właśnie tutaj pojawia się **RAG (Retrieval-Augmented Generation)**. Zamiast zmuszać użytkowników do przeszukiwania tekstu, możemy połączyć **retrieval** (znalezienie odpowiednich fragmentów dokumentacji) z **generation** (pozwolenie LLM na naturalne wyjaśnienie).
|
|
37
|
+
|
|
38
|
+
W tym wpisie przeprowadzę Cię przez proces tworzenia chatbota dokumentacyjnego opartego na RAG i pokażę, jak nie tylko pomaga on użytkownikom szybciej znajdować odpowiedzi, ale także daje zespołom produktowym nowy sposób na zrozumienie problemów użytkowników.
|
|
39
|
+
|
|
40
|
+
## Dlaczego warto używać RAG do dokumentacji?
|
|
41
|
+
|
|
42
|
+
RAG stał się popularnym podejściem nie bez powodu: jest to jeden z najbardziej praktycznych sposobów, aby duże modele językowe stały się naprawdę użyteczne.
|
|
43
|
+
|
|
44
|
+
Dla dokumentacji korzyści są jasne:
|
|
45
|
+
|
|
46
|
+
- Natychmiastowe odpowiedzi: użytkownicy pytają w naturalnym języku i otrzymują odpowiednie odpowiedzi.
|
|
47
|
+
- Lepszy kontekst: model widzi tylko najbardziej istotne fragmenty dokumentacji, co redukuje halucynacje.
|
|
48
|
+
- Wyszukiwanie, które wydaje się ludzkie: coś na kształt połączenia Algolii + FAQ + chatbota w jednym.
|
|
49
|
+
- Pętla informacji zwrotnej: przechowując zapytania, odkrywasz, z czym użytkownicy naprawdę mają problemy.
|
|
50
|
+
|
|
51
|
+
Ten ostatni punkt jest kluczowy. System RAG nie tylko odpowiada na pytania, ale także pokazuje, o co ludzie pytają. Oznacza to:
|
|
52
|
+
|
|
53
|
+
- Odkrywasz brakujące informacje w swojej dokumentacji.
|
|
54
|
+
- Widujesz pojawiające się prośby o nowe funkcje.
|
|
55
|
+
- Dostrzegasz wzorce, które mogą nawet kierować strategią produktu.
|
|
56
|
+
|
|
57
|
+
Tak więc RAG to nie tylko narzędzie wsparcia. To także **silnik odkrywania produktu**.
|
|
58
|
+
|
|
59
|
+
## Jak działa pipeline RAG
|
|
60
|
+
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
Na wysokim poziomie, oto przepis, którego użyłem:
|
|
64
|
+
|
|
65
|
+
1. **Dzielenie dokumentacji na fragmenty** Duże pliki Markdown są dzielone na fragmenty. Dzielenie pozwala dostarczyć jako kontekst tylko odpowiednie części dokumentacji.
|
|
66
|
+
2. **Generowanie embeddingów** Każdy fragment jest przekształcany w wektor za pomocą API embeddingów OpenAI (text-embedding-3-large) lub bazy danych wektorów (Chroma, Qdrant, Pinecone).
|
|
67
|
+
3. **Indeksowanie i przechowywanie** Embeddingi są przechowywane w prostym pliku JSON (w moim demo), ale w produkcji prawdopodobnie użyjesz bazy danych wektorów.
|
|
68
|
+
4. **Wyszukiwanie (R w RAG)** Zapytanie użytkownika jest zamieniane na embedding, obliczana jest podobieństwo kosinusowe, a następnie pobierane są najlepiej dopasowane fragmenty.
|
|
69
|
+
5. **Augmentacja + Generacja (AG w RAG)** Te fragmenty są wstrzykiwane do promptu dla ChatGPT, dzięki czemu model odpowiada z wykorzystaniem rzeczywistego kontekstu dokumentacji.
|
|
70
|
+
6. **Logowanie zapytań dla informacji zwrotnej** Każde zapytanie użytkownika jest zapisywane. To złoto dla zrozumienia problemów, brakujących dokumentów lub nowych możliwości.
|
|
71
|
+
|
|
72
|
+
## Krok 1: Odczytywanie dokumentacji
|
|
73
|
+
|
|
74
|
+
Pierwszy krok był prosty: potrzebowałem sposobu na zeskanowanie folderu docs/ pod kątem wszystkich plików .md. Używając Node.js i glob, pobrałem zawartość każdego pliku Markdown do pamięci.
|
|
75
|
+
|
|
76
|
+
To utrzymuje elastyczność pipeline’u: zamiast Markdown, możesz pobierać dokumentację z bazy danych, CMS-a lub nawet API.
|
|
77
|
+
|
|
78
|
+
## Krok 2: Dzielenie dokumentacji na fragmenty
|
|
79
|
+
|
|
80
|
+
Dlaczego dzielić? Ponieważ modele językowe mają **ograniczenia kontekstu**. Podanie im całej książki dokumentacji nie zadziała.
|
|
81
|
+
|
|
82
|
+
Dlatego pomysł polega na podzieleniu tekstu na zarządzalne fragmenty (np. po 500 tokenów każdy) z nakładką (np. 100 tokenów). Nakładka zapewnia ciągłość, dzięki czemu nie tracisz znaczenia na granicach fragmentów.
|
|
83
|
+
|
|
84
|
+
<p align="center">
|
|
85
|
+
<img width="480" alt="Niezawodne źródło danych" src="https://github.com/user-attachments/assets/ee548851-7206-4cc6-821e-de8a4366c6a3" />
|
|
86
|
+
</p>
|
|
87
|
+
|
|
88
|
+
**Przykład:**
|
|
89
|
+
|
|
90
|
+
- Fragment 1 → „…stara biblioteka, o której wielu zapomniało. Jej wysokie półki były wypełnione książkami…”
|
|
91
|
+
- Fragment 2 → „…półki były wypełnione książkami z każdego wyobrażalnego gatunku, z których każdy szeptał historie…”
|
|
92
|
+
|
|
93
|
+
Nakładanie się fragmentów zapewnia, że oba zawierają wspólny kontekst, dzięki czemu wyszukiwanie pozostaje spójne.
|
|
94
|
+
|
|
95
|
+
Ten kompromis (rozmiar fragmentu vs nakładanie) jest kluczowy dla efektywności RAG:
|
|
96
|
+
|
|
97
|
+
- Zbyt mały → pojawia się szum.
|
|
98
|
+
- Zbyt duży → rozrasta się rozmiar kontekstu.
|
|
99
|
+
|
|
100
|
+
## Krok 3: Generowanie embeddingów
|
|
101
|
+
|
|
102
|
+
Gdy dokumenty są podzielone na fragmenty, generujemy **embeddingi** — wektory o wysokim wymiarze reprezentujące każdy fragment.
|
|
103
|
+
|
|
104
|
+
Użyłem modelu OpenAI text-embedding-3-large, ale można użyć dowolnego nowoczesnego modelu embeddingowego.
|
|
105
|
+
|
|
106
|
+
**Przykładowy embedding:**
|
|
107
|
+
|
|
108
|
+
```js
|
|
109
|
+
[
|
|
110
|
+
-0.0002630692, -0.029749284, 0.010225477, -0.009224428, -0.0065269712,
|
|
111
|
+
-0.002665544, 0.003214777, 0.04235309, -0.033162255, -0.00080789323,
|
|
112
|
+
//...+1533 elementów
|
|
113
|
+
];
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Każdy wektor jest matematycznym odciskiem tekstu, umożliwiającym wyszukiwanie podobieństw.
|
|
117
|
+
|
|
118
|
+
## Krok 4: Indeksowanie i przechowywanie embeddingów
|
|
119
|
+
|
|
120
|
+
Aby uniknąć wielokrotnego generowania embeddingów, zapisałem je w pliku embeddings.json.
|
|
121
|
+
|
|
122
|
+
W środowisku produkcyjnym prawdopodobnie będziesz chciał użyć bazy danych wektorów, takiej jak:
|
|
123
|
+
|
|
124
|
+
- Chroma
|
|
125
|
+
- Qdrant
|
|
126
|
+
- Pinecone
|
|
127
|
+
- FAISS, Weaviate, Milvus itp.
|
|
128
|
+
|
|
129
|
+
Bazy danych wektorów zajmują się indeksowaniem, skalowalnością i szybkim wyszukiwaniem. Jednak w moim prototypie lokalny plik JSON sprawdził się dobrze.
|
|
130
|
+
|
|
131
|
+
## Krok 5: Wyszukiwanie z użyciem podobieństwa kosinusowego
|
|
132
|
+
|
|
133
|
+
Gdy użytkownik zada pytanie:
|
|
134
|
+
|
|
135
|
+
1. Wygeneruj embedding dla zapytania.
|
|
136
|
+
2. Porównaj go ze wszystkimi embeddingami dokumentów, używając **podobieństwa kosinusowego**.
|
|
137
|
+
3. Zachowaj tylko N najbardziej podobnych fragmentów.
|
|
138
|
+
|
|
139
|
+
Podobieństwo cosinusowe mierzy kąt między dwoma wektorami. Idealne dopasowanie uzyskuje wynik **1.0**.
|
|
140
|
+
|
|
141
|
+
W ten sposób system znajduje najbliższe fragmenty dokumentacji do zapytania.
|
|
142
|
+
|
|
143
|
+
## Krok 6: Rozszerzanie + Generowanie
|
|
144
|
+
|
|
145
|
+
Teraz zaczyna się magia. Bierzemy najlepsze fragmenty i wstrzykujemy je do **systemowego promptu** dla ChatGPT.
|
|
146
|
+
|
|
147
|
+
Oznacza to, że model odpowiada, jakby te fragmenty były częścią rozmowy.
|
|
148
|
+
|
|
149
|
+
Efekt: dokładne, **odpowiedzi oparte na dokumentacji**.
|
|
150
|
+
|
|
151
|
+
## Krok 7: Rejestrowanie zapytań użytkowników
|
|
152
|
+
|
|
153
|
+
To jest ukryta supermoc.
|
|
154
|
+
|
|
155
|
+
Każde zadane pytanie jest zapisywane. Z czasem budujesz zbiór danych zawierający:
|
|
156
|
+
|
|
157
|
+
- Najczęściej zadawane pytania (świetne do FAQ)
|
|
158
|
+
- Niezadane pytania (brak dokumentacji lub niejasności)
|
|
159
|
+
- Prośby o funkcje ukryte w pytaniach („Czy integruje się z X?”)
|
|
160
|
+
- Pojawiające się przypadki użycia, których nie planowałeś
|
|
161
|
+
|
|
162
|
+
To zamienia Twojego asystenta RAG w **narzędzie do ciągłych badań użytkowników**.
|
|
163
|
+
|
|
164
|
+
## Ile to kosztuje?
|
|
165
|
+
|
|
166
|
+
Jednym z częstych zarzutów wobec RAG jest koszt. W praktyce jest zaskakująco tani:
|
|
167
|
+
|
|
168
|
+
- Generowanie embeddingów dla około 200 dokumentów zajmuje około **5 minut** i kosztuje **1–2 euro**.
|
|
169
|
+
- Funkcja wyszukiwania w dokumentacji jest całkowicie darmowa.
|
|
170
|
+
- Do zapytań używamy gpt-4o-latest bez trybu „myślenia”. Na Intlayer obserwujemy około **300 zapytań na czacie miesięcznie**, a rachunek za API OpenAI rzadko przekracza **10 dolarów**.
|
|
171
|
+
|
|
172
|
+
Do tego dochodzi koszt hostingu.
|
|
173
|
+
|
|
174
|
+
## Szczegóły implementacji
|
|
175
|
+
|
|
176
|
+
Stack:
|
|
177
|
+
|
|
178
|
+
- Monorepo: pnpm workspace
|
|
179
|
+
- Pakiet dokumentacji: Node.js / TypeScript / OpenAI API
|
|
180
|
+
- Frontend: Next.js / React / Tailwind CSS
|
|
181
|
+
- Backend: Node.js API route / OpenAI API
|
|
182
|
+
|
|
183
|
+
Pakiet `@smart-doc/docs` to pakiet TypeScript, który zajmuje się przetwarzaniem dokumentacji. Gdy plik markdown zostanie dodany lub zmodyfikowany, pakiet zawiera skrypt `build`, który przebudowuje listę dokumentacji w każdym języku, generuje embeddingi i zapisuje je w pliku `embeddings.json`.
|
|
184
|
+
|
|
185
|
+
Dla frontend-u używamy aplikacji Next.js, która oferuje:
|
|
186
|
+
|
|
187
|
+
- Renderowanie Markdown do HTML
|
|
188
|
+
- Pasek wyszukiwania do znajdowania odpowiedniej dokumentacji
|
|
189
|
+
- Interfejs chatbota do zadawania pytań dotyczących dokumentacji
|
|
190
|
+
|
|
191
|
+
Aby przeprowadzić wyszukiwanie w dokumentacji, aplikacja Next.js zawiera trasę API, która wywołuje funkcję z pakietu `@smart-doc/docs`, aby pobrać fragmenty dokumentów pasujące do zapytania. Korzystając z tych fragmentów, możemy zwrócić listę stron dokumentacji istotnych dla wyszukiwania użytkownika.
|
|
192
|
+
|
|
193
|
+
Dla funkcjonalności chatbota stosujemy ten sam proces wyszukiwania, ale dodatkowo wstrzykujemy pobrane fragmenty dokumentacji do promptu wysyłanego do ChatGPT.
|
|
194
|
+
|
|
195
|
+
Oto przykład promptu wysyłanego do ChatGPT:
|
|
196
|
+
|
|
197
|
+
System prompt:
|
|
198
|
+
|
|
199
|
+
```txt
|
|
200
|
+
Jesteś pomocnym asystentem, który potrafi odpowiadać na pytania dotyczące dokumentacji Intlayer.
|
|
201
|
+
|
|
202
|
+
Powiązane fragmenty:
|
|
203
|
+
|
|
204
|
+
-----
|
|
205
|
+
docName: "getting-started"
|
|
206
|
+
docChunk: "1/3"
|
|
207
|
+
docUrl: "https://example.com/docs/en/getting-started"
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
# Jak zacząć
|
|
211
|
+
|
|
212
|
+
...
|
|
213
|
+
|
|
214
|
+
-----
|
|
215
|
+
docName: "another-doc"
|
|
216
|
+
docChunk: "1/5"
|
|
217
|
+
docUrl: "https://example.com/docs/en/another-doc"
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
# Inny dokument
|
|
221
|
+
|
|
222
|
+
...
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Zapytanie użytkownika:
|
|
226
|
+
|
|
227
|
+
```txt
|
|
228
|
+
Jak zacząć?
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Używamy SSE do strumieniowania odpowiedzi z trasy API.
|
|
232
|
+
|
|
233
|
+
Jak wspomniano, używamy gpt-4-turbo bez trybu "myślenia". Odpowiedzi są trafne, a opóźnienia niskie.
|
|
234
|
+
Eksperymentowaliśmy z gpt-5, ale opóźnienia były zbyt duże (czasami do 15 sekund na odpowiedź). Jednak wrócimy do tego w przyszłości.
|
|
235
|
+
|
|
236
|
+
👉 [Wypróbuj demo tutaj](https://intlayer.org/doc/pl/why) 👉 [Sprawdź szablon kodu na GitHub](https://github.com/aymericzip/smart_doc_RAG)
|
|
237
|
+
|
|
238
|
+
## Idąc dalej
|
|
239
|
+
|
|
240
|
+
Ten projekt to minimalna implementacja. Możesz ją jednak rozbudować na wiele sposobów:
|
|
241
|
+
|
|
242
|
+
- Serwer MCP → funkcja wyszukiwania w dokumentacji jako serwer MCP, aby połączyć dokumentację z dowolnym asystentem AI
|
|
243
|
+
|
|
244
|
+
- Bazy danych wektorowych → skalowanie do milionów fragmentów dokumentów
|
|
245
|
+
- LangChain / LlamaIndex → gotowe frameworki do pipeline’ów RAG
|
|
246
|
+
- Panele analityczne → wizualizacja zapytań użytkowników i problemów
|
|
247
|
+
- Wieloźródłowe pobieranie → pobieranie nie tylko dokumentów, ale też wpisów z baz danych, postów na blogach, zgłoszeń itp.
|
|
248
|
+
- Ulepszone promptowanie → ponowne rankowanie, filtrowanie i wyszukiwanie hybrydowe (słowo kluczowe + semantyczne)
|
|
249
|
+
|
|
250
|
+
## Ograniczenia, na które natrafiliśmy
|
|
251
|
+
|
|
252
|
+
- Dzielenie na fragmenty i nakładanie się jest empiryczne. Odpowiednia równowaga (rozmiar fragmentu, procent nakładania, liczba pobieranych fragmentów) wymaga iteracji i testowania.
|
|
253
|
+
- Embeddingi nie są automatycznie regenerowane, gdy dokumentacja się zmienia. Nasz system resetuje embeddingi dla pliku tylko wtedy, gdy liczba fragmentów różni się od zapisanej.
|
|
254
|
+
- W tym prototypie embeddingi są przechowywane w formacie JSON. Działa to w demo, ale zaśmieca repozytorium Git. W produkcji lepsza jest baza danych lub dedykowany magazyn wektorów.
|
|
255
|
+
|
|
256
|
+
## Dlaczego to ma znaczenie poza dokumentacją
|
|
257
|
+
|
|
258
|
+
Interesująca jest nie tylko sama chatbot. To jest **pętla informacji zwrotnej**.
|
|
259
|
+
|
|
260
|
+
Dzięki RAG nie tylko odpowiadasz:
|
|
261
|
+
|
|
262
|
+
- Dowiadujesz się, co myli użytkowników.
|
|
263
|
+
- Odkrywasz, jakich funkcji oczekują.
|
|
264
|
+
- Dostosowujesz swoją strategię produktową na podstawie rzeczywistych zapytań.
|
|
265
|
+
|
|
266
|
+
**Przykład:**
|
|
267
|
+
|
|
268
|
+
Wyobraź sobie, że wprowadzasz nową funkcję i natychmiast widzisz:
|
|
269
|
+
|
|
270
|
+
- 50% pytań dotyczy tego samego niejasnego kroku konfiguracji
|
|
271
|
+
- Użytkownicy wielokrotnie proszą o integrację, której jeszcze nie obsługujesz
|
|
272
|
+
- Ludzie wyszukują terminy, które ujawniają nowe zastosowanie
|
|
273
|
+
|
|
274
|
+
To jest **inteligencja produktowa** prosto od Twoich użytkowników.
|
|
275
|
+
|
|
276
|
+
## Podsumowanie
|
|
277
|
+
|
|
278
|
+
RAG to jeden z najprostszych i najpotężniejszych sposobów na praktyczne wykorzystanie LLM. Łącząc **wyszukiwanie + generowanie**, możesz przekształcić statyczną dokumentację w **inteligentnego asystenta** i jednocześnie uzyskać ciągły strumień informacji o produkcie.
|
|
279
|
+
|
|
280
|
+
Dla mnie ten projekt pokazał, że RAG to nie tylko techniczny trik. To sposób na przekształcenie dokumentacji w:
|
|
281
|
+
|
|
282
|
+
- interaktywny system wsparcia
|
|
283
|
+
- kanał informacji zwrotnej
|
|
284
|
+
- narzędzie do strategii produktowej
|
|
285
|
+
|
|
286
|
+
👉 [Wypróbuj demo tutaj](https://intlayer.org/doc/why) 👉 [Sprawdź szablon kodu na GitHub](https://github.com/aymericzip/smart_doc_RAG)
|
|
287
|
+
|
|
288
|
+
A jeśli również eksperymentujesz z RAG, chętnie usłyszę, jak go używasz.
|