@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,361 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-09-28
|
|
3
|
+
updatedAt: 2025-09-28
|
|
4
|
+
title: SEO dan i18n di Next.js
|
|
5
|
+
description: Pelajari cara mengatur SEO multibahasa di aplikasi Next.js Anda menggunakan next-intl, next-i18next, dan Intlayer.
|
|
6
|
+
keywords:
|
|
7
|
+
- Intlayer
|
|
8
|
+
- SEO
|
|
9
|
+
- Internasionalisasi
|
|
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 dan i18n di Next.js: Menerjemahkan saja tidak cukup
|
|
22
|
+
|
|
23
|
+
Ketika pengembang memikirkan internasionalisasi (i18n), refleks pertama sering kali adalah: _menerjemahkan konten_. Namun orang biasanya lupa bahwa tujuan utama internasionalisasi adalah membuat situs web Anda lebih terlihat oleh dunia.
|
|
24
|
+
Jika aplikasi Next.js multibahasa Anda tidak memberi tahu mesin pencari bagaimana cara merayapi dan memahami versi bahasa yang berbeda, sebagian besar upaya Anda mungkin tidak terlihat.
|
|
25
|
+
|
|
26
|
+
Dalam blog ini, kita akan mengeksplorasi **mengapa i18n adalah kekuatan super SEO** dan bagaimana mengimplementasikannya dengan benar di Next.js menggunakan `next-intl`, `next-i18next`, dan `Intlayer`.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Mengapa SEO dan i18n
|
|
31
|
+
|
|
32
|
+
Menambahkan bahasa bukan hanya tentang UX. Ini juga merupakan tuas yang kuat untuk **visibilitas organik**. Berikut alasannya:
|
|
33
|
+
|
|
34
|
+
1. **Penemuan yang lebih baik:** Mesin pencari mengindeks versi lokal dan memberi peringkat untuk pengguna yang mencari dalam bahasa asli mereka.
|
|
35
|
+
2. **Menghindari konten duplikat:** Tag kanonik dan alternatif yang tepat memberi tahu crawler halaman mana yang milik locale mana.
|
|
36
|
+
3. **UX yang lebih baik:** Pengunjung langsung mendarat di versi situs Anda yang tepat.
|
|
37
|
+
4. **Keunggulan kompetitif:** Sedikit situs yang mengimplementasikan SEO multibahasa dengan baik yang berarti Anda bisa menonjol.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Praktik Terbaik untuk SEO Multibahasa di Next.js
|
|
42
|
+
|
|
43
|
+
Berikut adalah daftar periksa yang harus diimplementasikan setiap aplikasi multibahasa:
|
|
44
|
+
|
|
45
|
+
- **Atur tag meta `hreflang` di `<head>`**
|
|
46
|
+
Membantu Google memahami versi mana yang ada untuk setiap bahasa.
|
|
47
|
+
|
|
48
|
+
- **Daftarkan semua halaman terjemahan di `sitemap.xml`**
|
|
49
|
+
Gunakan skema `xhtml` agar perayap dapat dengan mudah menemukan alternatif.
|
|
50
|
+
|
|
51
|
+
- **Kecualikan rute privat/lokal di `robots.txt`**
|
|
52
|
+
Contoh: jangan biarkan `/dashboard`, `/fr/dashboard`, `/es/dashboard` diindeks.
|
|
53
|
+
|
|
54
|
+
- **Gunakan tautan yang dilokalkan**
|
|
55
|
+
Contoh: `<a href="/fr/about">À propos</a>` daripada menautkan ke `/about` default.
|
|
56
|
+
|
|
57
|
+
Ini adalah langkah sederhana — tetapi melewatkannya dapat mengurangi visibilitas Anda.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Contoh Implementasi
|
|
62
|
+
|
|
63
|
+
Pengembang sering lupa untuk merujuk halaman mereka dengan benar di berbagai locale, jadi mari kita lihat bagaimana ini bekerja dalam praktik dengan berbagai pustaka.
|
|
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
|
+
// ... Sisa kode halaman
|
|
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
|
+
/** Prefix path dengan locale kecuali jika itu adalah locale default */
|
|
166
|
+
export function localizedPath(locale: string, path: string) {
|
|
167
|
+
return locale === defaultLocale ? path : `/${locale}${path}`;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** Helper URL absolut */
|
|
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
|
+
// Mengimpor file JSON yang sesuai secara dinamis
|
|
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>Tentang</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", // Frekuensi perubahan halaman
|
|
224
|
+
priority: 0.7, // Prioritas halaman dalam sitemap
|
|
225
|
+
alternates: { languages }, // Alternatif bahasa untuk halaman ini
|
|
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
|
+
* Menghasilkan objek yang berisi semua url untuk setiap locale.
|
|
277
|
+
*
|
|
278
|
+
* Contoh:
|
|
279
|
+
* ```ts
|
|
280
|
+
* getMultilingualUrls('/about');
|
|
281
|
+
*
|
|
282
|
+
* // Mengembalikan
|
|
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
|
+
// ... Sisa kode halaman
|
|
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
|
+
const getAllMultilingualUrls = (urls: string[]) =>
|
|
323
|
+
urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);
|
|
324
|
+
|
|
325
|
+
// Mendapatkan semua URL multibahasa dari daftar URL yang diberikan
|
|
326
|
+
const robots = (): MetadataRoute.Robots => ({
|
|
327
|
+
rules: {
|
|
328
|
+
userAgent: "*",
|
|
329
|
+
allow: ["/"],
|
|
330
|
+
disallow: getAllMultilingualUrls(["/dashboard"]), // Melarang akses ke semua versi multibahasa dari /dashboard
|
|
331
|
+
},
|
|
332
|
+
host: "https://example.com",
|
|
333
|
+
sitemap: `https://example.com/sitemap.xml`,
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
export default robots;
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
> Intlayer menyediakan fungsi `getMultilingualUrls` untuk menghasilkan URL multibahasa untuk sitemap Anda.
|
|
340
|
+
|
|
341
|
+
</TabItem>
|
|
342
|
+
</Tabs>
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Kesimpulan
|
|
347
|
+
|
|
348
|
+
Mengelola i18n dengan benar di Next.js bukan hanya soal menerjemahkan teks, tetapi juga memastikan mesin pencari dan pengguna tahu versi konten mana yang harus disajikan.
|
|
349
|
+
Mengatur hreflang, sitemap, dan aturan robots adalah yang mengubah terjemahan menjadi nilai SEO yang nyata.
|
|
350
|
+
|
|
351
|
+
Meskipun next-intl dan next-i18next memberikan cara yang solid untuk menghubungkan ini, biasanya mereka memerlukan banyak pengaturan manual agar tetap konsisten di seluruh locale.
|
|
352
|
+
|
|
353
|
+
Di sinilah Intlayer benar-benar bersinar:
|
|
354
|
+
|
|
355
|
+
Ini dilengkapi dengan helper bawaan seperti getMultilingualUrls, membuat integrasi hreflang, sitemap, dan robots hampir tanpa usaha.
|
|
356
|
+
|
|
357
|
+
Metadata tetap terpusat alih-alih tersebar di berbagai file JSON atau utilitas kustom.
|
|
358
|
+
|
|
359
|
+
Ini dirancang khusus untuk Next.js sejak awal, sehingga Anda menghabiskan lebih sedikit waktu untuk debugging konfigurasi dan lebih banyak waktu untuk pengiriman.
|
|
360
|
+
|
|
361
|
+
Jika tujuan Anda bukan hanya menerjemahkan tetapi juga mengembangkan SEO multibahasa tanpa hambatan, Intlayer memberikan pengaturan yang paling bersih dan paling tahan masa depan.
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-09-10
|
|
3
|
+
updatedAt: 2025-09-10
|
|
4
|
+
title: Membangun Asisten Dokumentasi Bertenaga RAG (Chunking, Embeddings, dan Pencarian)
|
|
5
|
+
description: Membangun Asisten Dokumentasi Bertenaga RAG (Chunking, Embeddings, dan Pencarian)
|
|
6
|
+
keywords:
|
|
7
|
+
- RAG
|
|
8
|
+
- Dokumentasi
|
|
9
|
+
- Asisten
|
|
10
|
+
- Chunking
|
|
11
|
+
- Embeddings
|
|
12
|
+
- Pencarian
|
|
13
|
+
slugs:
|
|
14
|
+
- blog
|
|
15
|
+
- rag-powered-documentation-assistant
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Membangun Asisten Dokumentasi Bertenaga RAG (Chunking, Embeddings, dan Pencarian)
|
|
19
|
+
|
|
20
|
+
## Apa yang Anda dapatkan
|
|
21
|
+
|
|
22
|
+
Saya membangun asisten dokumentasi bertenaga RAG dan mengemasnya menjadi boilerplate yang dapat Anda gunakan segera.
|
|
23
|
+
|
|
24
|
+
- Dilengkapi dengan aplikasi siap pakai (Next.js + OpenAI API)
|
|
25
|
+
- Termasuk pipeline RAG yang berfungsi (chunking, embeddings, cosine similarity)
|
|
26
|
+
- Menyediakan UI chatbot lengkap yang dibangun dengan React
|
|
27
|
+
- Semua komponen UI sepenuhnya dapat diedit dengan Tailwind CSS
|
|
28
|
+
- Mencatat setiap kueri pengguna untuk membantu mengidentifikasi dokumen yang hilang, titik sakit pengguna, dan peluang produk
|
|
29
|
+
|
|
30
|
+
👉 [Demo langsung](https://intlayer.org/doc/why) 👉 [Boilerplate kode](https://github.com/aymericzip/smart_doc_RAG)
|
|
31
|
+
|
|
32
|
+
## Pendahuluan
|
|
33
|
+
|
|
34
|
+
Jika Anda pernah tersesat dalam dokumentasi, menggulir tanpa henti mencari satu jawaban, Anda tahu betapa menyakitkannya hal itu. Dokumentasi berguna, tetapi bersifat statis dan pencariannya sering terasa canggung.
|
|
35
|
+
|
|
36
|
+
Di sinilah **RAG (Retrieval-Augmented Generation)** berperan. Alih-alih memaksa pengguna menggali teks, kita dapat menggabungkan **retrieval** (menemukan bagian dokumen yang tepat) dengan **generation** (membiarkan LLM menjelaskannya secara alami).
|
|
37
|
+
|
|
38
|
+
Dalam postingan ini, saya akan memandu Anda bagaimana saya membangun chatbot dokumentasi yang didukung oleh RAG dan bagaimana ini tidak hanya membantu pengguna menemukan jawaban lebih cepat, tetapi juga memberikan tim produk cara baru untuk memahami titik sakit pengguna.
|
|
39
|
+
|
|
40
|
+
## Mengapa Menggunakan RAG untuk Dokumentasi?
|
|
41
|
+
|
|
42
|
+
RAG telah menjadi pendekatan populer karena suatu alasan: ini adalah salah satu cara paling praktis untuk membuat model bahasa besar benar-benar berguna.
|
|
43
|
+
|
|
44
|
+
Untuk dokumentasi, manfaatnya jelas:
|
|
45
|
+
|
|
46
|
+
- Jawaban instan: pengguna bertanya dalam bahasa alami, dan mendapatkan balasan yang relevan.
|
|
47
|
+
- Konteks yang lebih baik: model hanya melihat bagian dokumen yang paling relevan, mengurangi halusinasi.
|
|
48
|
+
- Pencarian yang terasa manusiawi: lebih seperti gabungan Algolia + FAQ + chatbot dalam satu.
|
|
49
|
+
- Siklus umpan balik: dengan menyimpan kueri, Anda mengungkap apa yang benar-benar menjadi kesulitan pengguna.
|
|
50
|
+
|
|
51
|
+
Poin terakhir ini sangat penting. Sistem RAG tidak hanya menjawab pertanyaan, tetapi juga memberi tahu Anda apa yang orang tanyakan. Itu berarti:
|
|
52
|
+
|
|
53
|
+
- Anda menemukan informasi yang hilang dalam dokumentasi Anda.
|
|
54
|
+
- Anda melihat permintaan fitur yang mulai muncul.
|
|
55
|
+
- Anda menemukan pola yang bahkan dapat memandu strategi produk.
|
|
56
|
+
|
|
57
|
+
Jadi, RAG bukan hanya alat dukungan. Ini juga merupakan **mesin penemuan produk**.
|
|
58
|
+
|
|
59
|
+
## Cara Kerja Pipeline RAG
|
|
60
|
+
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
Secara garis besar, berikut resep yang saya gunakan:
|
|
64
|
+
|
|
65
|
+
1. **Memecah dokumentasi** File Markdown besar dibagi menjadi beberapa bagian. Pemecahan ini memungkinkan hanya bagian dokumentasi yang relevan yang digunakan sebagai konteks.
|
|
66
|
+
2. **Menghasilkan embeddings** Setiap potongan diubah menjadi vektor menggunakan API embedding OpenAI (text-embedding-3-large) atau basis data vektor (Chroma, Qdrant, Pinecone).
|
|
67
|
+
3. **Pengindeksan & penyimpanan** Embeddings disimpan dalam file JSON sederhana (untuk demo saya), tetapi dalam produksi, Anda kemungkinan akan menggunakan basis data vektor.
|
|
68
|
+
4. **Pengambilan (R dalam RAG)** Query pengguna diubah menjadi embedding, kemiripan kosinus dihitung, dan potongan yang paling cocok diambil.
|
|
69
|
+
5. **Augmentasi + Generasi (AG dalam RAG)** Potongan-potongan tersebut disuntikkan ke dalam prompt untuk ChatGPT, sehingga model menjawab dengan konteks dokumen yang sebenarnya.
|
|
70
|
+
6. **Mencatat query untuk umpan balik** Setiap query pengguna disimpan. Ini sangat berharga untuk memahami titik masalah, dokumen yang hilang, atau peluang baru.
|
|
71
|
+
|
|
72
|
+
## Langkah 1: Membaca Dokumen
|
|
73
|
+
|
|
74
|
+
Langkah pertama sangat sederhana: saya membutuhkan cara untuk memindai folder docs/ untuk semua file .md. Menggunakan Node.js dan glob, saya mengambil konten dari setiap file Markdown ke dalam memori.
|
|
75
|
+
|
|
76
|
+
Ini menjaga pipeline tetap fleksibel: alih-alih Markdown, Anda bisa mengambil dokumen dari database, CMS, atau bahkan API.
|
|
77
|
+
|
|
78
|
+
## Langkah 2: Memecah Dokumentasi menjadi Potongan
|
|
79
|
+
|
|
80
|
+
Mengapa memecah? Karena model bahasa memiliki **batas konteks**. Memberi mereka seluruh buku dokumen tidak akan berhasil.
|
|
81
|
+
|
|
82
|
+
Jadi idenya adalah memecah teks menjadi potongan yang dapat dikelola (misalnya 500 token setiap potongan) dengan tumpang tindih (misalnya 100 token). Tumpang tindih memastikan kontinuitas sehingga Anda tidak kehilangan makna di batas potongan.
|
|
83
|
+
|
|
84
|
+
<p align="center">
|
|
85
|
+
<img width="480" alt="Sumber data yang dapat diandalkan" src="https://github.com/user-attachments/assets/ee548851-7206-4cc6-821e-de8a4366c6a3" />
|
|
86
|
+
</p>
|
|
87
|
+
|
|
88
|
+
**Contoh:**
|
|
89
|
+
|
|
90
|
+
- Chunk 1 → “…perpustakaan tua yang banyak orang lupa. Rak-raknya yang menjulang penuh dengan buku…”
|
|
91
|
+
- Chunk 2 → “…rak-rak penuh dengan buku dari setiap genre yang bisa dibayangkan, masing-masing membisikkan cerita…”
|
|
92
|
+
|
|
93
|
+
Tumpang tindih ini memastikan kedua chunk mengandung konteks bersama, sehingga pengambilan tetap koheren.
|
|
94
|
+
|
|
95
|
+
Pertukaran ini (ukuran chunk vs tumpang tindih) adalah kunci untuk efisiensi RAG:
|
|
96
|
+
|
|
97
|
+
- Terlalu kecil → Anda mendapatkan noise.
|
|
98
|
+
- Terlalu besar → Anda membengkakkan ukuran konteks.
|
|
99
|
+
|
|
100
|
+
## Langkah 3: Menghasilkan Embeddings
|
|
101
|
+
|
|
102
|
+
Setelah dokumen dipecah menjadi chunk, kita menghasilkan **embeddings** — vektor berdimensi tinggi yang mewakili setiap chunk.
|
|
103
|
+
|
|
104
|
+
Saya menggunakan model OpenAI text-embedding-3-large, tetapi Anda bisa menggunakan model embedding modern lainnya.
|
|
105
|
+
|
|
106
|
+
**Contoh 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 elemen
|
|
113
|
+
];
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Setiap vektor adalah sidik jari matematis dari teks, memungkinkan pencarian kemiripan.
|
|
117
|
+
|
|
118
|
+
## Langkah 4: Pengindeksan & Penyimpanan Embedding
|
|
119
|
+
|
|
120
|
+
Untuk menghindari pembuatan ulang embedding berkali-kali, saya menyimpannya di embeddings.json.
|
|
121
|
+
|
|
122
|
+
Dalam produksi, Anda kemungkinan ingin menggunakan basis data vektor seperti:
|
|
123
|
+
|
|
124
|
+
- Chroma
|
|
125
|
+
- Qdrant
|
|
126
|
+
- Pinecone
|
|
127
|
+
- FAISS, Weaviate, Milvus, dll.
|
|
128
|
+
|
|
129
|
+
Basis data vektor menangani pengindeksan, skalabilitas, dan pencarian cepat. Namun untuk prototipe saya, JSON lokal sudah cukup.
|
|
130
|
+
|
|
131
|
+
## Langkah 5: Pengambilan dengan Cosine Similarity
|
|
132
|
+
|
|
133
|
+
Ketika pengguna mengajukan pertanyaan:
|
|
134
|
+
|
|
135
|
+
1. Buat embedding untuk query.
|
|
136
|
+
2. Bandingkan dengan semua embedding dokumen menggunakan **cosine similarity**.
|
|
137
|
+
3. Simpan hanya N chunk teratas yang paling mirip.
|
|
138
|
+
|
|
139
|
+
Cosine similarity mengukur sudut antara dua vektor. Kecocokan sempurna mendapatkan skor **1.0**.
|
|
140
|
+
|
|
141
|
+
Dengan cara ini, sistem menemukan bagian dokumen yang paling dekat dengan kueri.
|
|
142
|
+
|
|
143
|
+
## Langkah 6: Augmentasi + Generasi
|
|
144
|
+
|
|
145
|
+
Sekarang saatnya keajaiban. Kita mengambil potongan-potongan teratas dan menyuntikkannya ke dalam **system prompt** untuk ChatGPT.
|
|
146
|
+
|
|
147
|
+
Itu berarti model menjawab seolah-olah potongan-potongan tersebut adalah bagian dari percakapan.
|
|
148
|
+
|
|
149
|
+
Hasilnya: jawaban yang akurat dan **berdasarkan dokumen**.
|
|
150
|
+
|
|
151
|
+
## Langkah 7: Mencatat Kueri Pengguna
|
|
152
|
+
|
|
153
|
+
Ini adalah kekuatan tersembunyi.
|
|
154
|
+
|
|
155
|
+
Setiap pertanyaan yang diajukan disimpan. Seiring waktu, Anda membangun dataset dari:
|
|
156
|
+
|
|
157
|
+
- Pertanyaan yang paling sering diajukan (bagus untuk FAQ)
|
|
158
|
+
- Pertanyaan yang belum terjawab (dokumen hilang atau tidak jelas)
|
|
159
|
+
- Permintaan fitur yang disamarkan sebagai pertanyaan (“Apakah ini terintegrasi dengan X?”)
|
|
160
|
+
- Kasus penggunaan baru yang belum Anda rencanakan
|
|
161
|
+
|
|
162
|
+
Ini mengubah asisten RAG Anda menjadi **alat riset pengguna berkelanjutan**.
|
|
163
|
+
|
|
164
|
+
## Berapa Biayanya?
|
|
165
|
+
|
|
166
|
+
Salah satu keberatan umum terhadap RAG adalah biaya. Dalam praktiknya, biayanya cukup murah:
|
|
167
|
+
|
|
168
|
+
- Menghasilkan embeddings untuk sekitar ~200 dokumen memakan waktu sekitar **5 menit** dan biaya **1–2 euro**.
|
|
169
|
+
- Fitur pencarian dokumen 100% gratis.
|
|
170
|
+
- Untuk kueri, kami menggunakan gpt-4o-latest tanpa mode “thinking”. Di Intlayer, kami melihat sekitar **300 kueri chat per bulan**, dan tagihan API OpenAI jarang melebihi **$10**.
|
|
171
|
+
|
|
172
|
+
Di atas itu, Anda dapat memasukkan biaya hosting.
|
|
173
|
+
|
|
174
|
+
## Detail Implementasi
|
|
175
|
+
|
|
176
|
+
Stack:
|
|
177
|
+
|
|
178
|
+
- Monorepo: workspace pnpm
|
|
179
|
+
- Paket dokumen: Node.js / TypeScript / OpenAI API
|
|
180
|
+
- Frontend: Next.js / React / Tailwind CSS
|
|
181
|
+
- Backend: Node.js API route / OpenAI API
|
|
182
|
+
|
|
183
|
+
Paket `@smart-doc/docs` adalah paket TypeScript yang menangani pemrosesan dokumentasi. Ketika sebuah file markdown ditambahkan atau dimodifikasi, paket ini menyertakan skrip `build` yang membangun ulang daftar dokumentasi dalam setiap bahasa, menghasilkan embeddings, dan menyimpannya dalam file `embeddings.json`.
|
|
184
|
+
|
|
185
|
+
Untuk frontend, kami menggunakan aplikasi Next.js yang menyediakan:
|
|
186
|
+
|
|
187
|
+
- Rendering Markdown ke HTML
|
|
188
|
+
- Bar pencarian untuk menemukan dokumentasi yang relevan
|
|
189
|
+
- Antarmuka chatbot untuk mengajukan pertanyaan tentang dokumen
|
|
190
|
+
|
|
191
|
+
Untuk melakukan pencarian dokumentasi, aplikasi Next.js menyertakan rute API yang memanggil fungsi dalam paket `@smart-doc/docs` untuk mengambil potongan dokumen yang sesuai dengan kueri. Dengan menggunakan potongan-potongan ini, kami dapat mengembalikan daftar halaman dokumentasi yang relevan dengan pencarian pengguna.
|
|
192
|
+
|
|
193
|
+
Untuk fungsi chatbot, kami mengikuti proses pencarian yang sama tetapi juga menyisipkan potongan dokumen yang diambil ke dalam prompt yang dikirim ke ChatGPT.
|
|
194
|
+
|
|
195
|
+
Berikut adalah contoh prompt yang dikirim ke ChatGPT:
|
|
196
|
+
|
|
197
|
+
Prompt sistem:
|
|
198
|
+
|
|
199
|
+
```txt
|
|
200
|
+
Anda adalah asisten yang membantu yang dapat menjawab pertanyaan tentang dokumentasi Intlayer.
|
|
201
|
+
|
|
202
|
+
Potongan terkait:
|
|
203
|
+
|
|
204
|
+
-----
|
|
205
|
+
docName: "getting-started"
|
|
206
|
+
docChunk: "1/3"
|
|
207
|
+
docUrl: "https://example.com/docs/id/getting-started"
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
# Cara memulai
|
|
211
|
+
|
|
212
|
+
...
|
|
213
|
+
|
|
214
|
+
-----
|
|
215
|
+
docName: "another-doc"
|
|
216
|
+
docChunk: "1/5"
|
|
217
|
+
docUrl: "https://example.com/docs/id/another-doc"
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
# Dokumen lain
|
|
221
|
+
|
|
222
|
+
...
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Query pengguna:
|
|
226
|
+
|
|
227
|
+
```txt
|
|
228
|
+
Bagaimana cara memulai?
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Kami menggunakan SSE untuk melakukan streaming respons dari rute API.
|
|
232
|
+
|
|
233
|
+
Seperti yang disebutkan, kami menggunakan gpt-4-turbo tanpa mode "thinking". Responsnya relevan, dan latensinya rendah.
|
|
234
|
+
Kami bereksperimen dengan gpt-5, tetapi latensinya terlalu tinggi (kadang hingga 15 detik untuk sebuah balasan). Namun, kami akan meninjau kembali hal itu di masa depan.
|
|
235
|
+
|
|
236
|
+
👉 [Coba demo di sini](https://intlayer.org/doc/why) 👉 [Periksa template kode di GitHub](https://github.com/aymericzip/smart_doc_RAG)
|
|
237
|
+
|
|
238
|
+
## Melangkah Lebih Jauh
|
|
239
|
+
|
|
240
|
+
Proyek ini adalah implementasi minimal. Namun, Anda dapat memperluasnya dengan berbagai cara:
|
|
241
|
+
|
|
242
|
+
- Server MCP → fungsi pencarian dokumen ke server MCP untuk menghubungkan dokumentasi ke asisten AI mana pun
|
|
243
|
+
|
|
244
|
+
- Vector DBs → skala hingga jutaan potongan dokumen
|
|
245
|
+
- LangChain / LlamaIndex → kerangka kerja siap pakai untuk pipeline RAG
|
|
246
|
+
- Dashboard analitik → memvisualisasikan kueri pengguna dan titik masalah
|
|
247
|
+
- Pengambilan multi-sumber → menarik tidak hanya dokumen, tetapi juga entri database, posting blog, tiket, dll.
|
|
248
|
+
- Peningkatan prompting → peringkat ulang, penyaringan, dan pencarian hibrida (kata kunci + semantik)
|
|
249
|
+
|
|
250
|
+
## Batasan yang Kami Temui
|
|
251
|
+
|
|
252
|
+
- Pemecahan chunk dan tumpang tindih bersifat empiris. Keseimbangan yang tepat (ukuran chunk, persentase tumpang tindih, jumlah chunk yang diambil) memerlukan iterasi dan pengujian.
|
|
253
|
+
- Embedding tidak dihasilkan ulang secara otomatis saat dokumen berubah. Sistem kami mereset embedding untuk sebuah file hanya jika jumlah chunk berbeda dari yang tersimpan.
|
|
254
|
+
- Dalam prototipe ini, embedding disimpan dalam format JSON. Ini bekerja untuk demo tetapi mencemari Git. Dalam produksi, database atau penyimpanan vektor khusus lebih baik.
|
|
255
|
+
|
|
256
|
+
## Mengapa Ini Penting Selain Dokumen
|
|
257
|
+
|
|
258
|
+
Bagian menariknya bukan hanya chatbot. Ini adalah **loop umpan balik**.
|
|
259
|
+
|
|
260
|
+
Dengan RAG, Anda tidak hanya menjawab:
|
|
261
|
+
|
|
262
|
+
- Anda mempelajari apa yang membingungkan pengguna.
|
|
263
|
+
- Anda menemukan fitur apa yang mereka harapkan.
|
|
264
|
+
- Anda menyesuaikan strategi produk Anda berdasarkan pertanyaan nyata.
|
|
265
|
+
|
|
266
|
+
**Contoh:**
|
|
267
|
+
|
|
268
|
+
Bayangkan meluncurkan fitur baru dan langsung melihat:
|
|
269
|
+
|
|
270
|
+
- 50% pertanyaan tentang langkah pengaturan yang sama yang tidak jelas
|
|
271
|
+
- Pengguna berulang kali meminta integrasi yang belum Anda dukung
|
|
272
|
+
- Orang mencari istilah yang mengungkapkan kasus penggunaan baru
|
|
273
|
+
|
|
274
|
+
Itu adalah **intelijen produk** langsung dari pengguna Anda.
|
|
275
|
+
|
|
276
|
+
## Kesimpulan
|
|
277
|
+
|
|
278
|
+
RAG adalah salah satu cara paling sederhana dan paling kuat untuk membuat LLM menjadi praktis. Dengan menggabungkan **retrieval + generation**, Anda dapat mengubah dokumen statis menjadi **asisten pintar** dan, pada saat yang sama, mendapatkan aliran wawasan produk yang berkelanjutan.
|
|
279
|
+
|
|
280
|
+
Bagi saya, proyek ini menunjukkan bahwa RAG bukan hanya trik teknis. Ini adalah cara untuk mengubah dokumentasi menjadi:
|
|
281
|
+
|
|
282
|
+
- sistem dukungan interaktif
|
|
283
|
+
- saluran umpan balik
|
|
284
|
+
- sebuah alat strategi produk
|
|
285
|
+
|
|
286
|
+
👉 [Coba demo di sini](https://intlayer.org/doc/why) 👉 [Periksa template kode di GitHub](https://github.com/aymericzip/smart_doc_RAG)
|
|
287
|
+
|
|
288
|
+
Dan jika Anda juga bereksperimen dengan RAG, saya ingin sekali mendengar bagaimana Anda menggunakannya.
|