@intlayer/docs 7.0.6 → 7.0.8-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/i18n_using_next-i18next.md +1068 -0
- package/blog/ar/i18n_using_next-intl.md +768 -0
- package/blog/ar/intlayer_with_react-intl.md +0 -4
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +5 -4
- package/blog/de/i18n_using_next-i18next.md +1107 -0
- package/blog/de/i18n_using_next-intl.md +760 -0
- package/blog/de/intlayer_with_react-intl.md +0 -4
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/en/i18n_using_next-i18next.md +1073 -0
- package/blog/en/i18n_using_next-intl.md +757 -0
- package/blog/en/intlayer_with_i18next.md +71 -8
- package/blog/en/intlayer_with_next-i18next.md +71 -8
- package/blog/en/intlayer_with_next-intl.md +71 -8
- package/blog/en/intlayer_with_react-i18next.md +69 -8
- package/blog/en/intlayer_with_react-intl.md +68 -9
- package/blog/en/intlayer_with_vue-i18n.md +68 -7
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/en/vue-i18n_vs_intlayer.md +2 -0
- package/blog/en-GB/i18n_using_next-i18next.md +1074 -0
- package/blog/en-GB/i18n_using_next-intl.md +757 -0
- package/blog/en-GB/intlayer_with_i18next.md +15 -6
- package/blog/en-GB/intlayer_with_next-i18next.md +16 -6
- package/blog/en-GB/intlayer_with_next-intl.md +16 -6
- package/blog/en-GB/intlayer_with_react-i18next.md +16 -7
- package/blog/en-GB/intlayer_with_react-intl.md +14 -9
- package/blog/en-GB/intlayer_with_vue-i18n.md +16 -7
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/en-GB/vue-i18n_vs_intlayer.md +2 -0
- package/blog/es/i18n_using_next-i18next.md +1066 -0
- package/blog/es/i18n_using_next-intl.md +757 -0
- package/blog/es/intlayer_with_react-intl.md +0 -4
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/fr/i18n_using_next-i18next.md +1078 -0
- package/blog/fr/i18n_using_next-intl.md +759 -0
- package/blog/fr/intlayer_with_react-intl.md +0 -4
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/hi/i18n_using_next-i18next.md +1068 -0
- package/blog/hi/i18n_using_next-intl.md +758 -0
- package/blog/hi/intlayer_with_react-intl.md +0 -4
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/id/i18n_using_next-i18next.md +1078 -0
- package/blog/id/i18n_using_next-intl.md +757 -0
- package/blog/id/index.md +69 -0
- package/blog/id/internationalization_and_SEO.md +364 -0
- package/blog/id/intlayer_with_react-intl.md +0 -4
- package/blog/id/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/id/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/id/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/id/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/id/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/id/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/id/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/id/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/id/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +1500 -0
- package/blog/id/nextjs-multilingual-seo-comparison.md +361 -0
- package/blog/id/rag_powered_documentation_assistant.md +288 -0
- package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/id/vue-i18n_vs_intlayer.md +278 -0
- package/blog/id/what_is_internationalization.md +166 -0
- package/blog/it/i18n_using_next-i18next.md +1078 -0
- package/blog/it/i18n_using_next-intl.md +758 -0
- package/blog/it/intlayer_with_react-intl.md +0 -4
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +4 -0
- package/blog/it/vue-i18n_vs_intlayer.md +2 -0
- package/blog/ja/i18n_using_next-i18next.md +1078 -0
- package/blog/ja/i18n_using_next-intl.md +758 -0
- package/blog/ja/intlayer_with_react-intl.md +0 -4
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/ko/i18n_using_next-i18next.md +1075 -0
- package/blog/ko/i18n_using_next-intl.md +759 -0
- package/blog/ko/intlayer_with_react-intl.md +0 -4
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/pl/i18n_using_next-i18next.md +1078 -0
- package/blog/pl/i18n_using_next-intl.md +758 -0
- package/blog/pl/index.md +69 -0
- package/blog/pl/internationalization_and_SEO.md +363 -0
- package/blog/pl/intlayer_with_react-intl.md +0 -4
- package/blog/pl/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/pl/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/pl/list_i18n_technologies/CMS/wordpress.md +196 -0
- package/blog/pl/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/pl/list_i18n_technologies/frameworks/flutter.md +151 -0
- package/blog/pl/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/pl/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/pl/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/pl/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +1501 -0
- package/blog/pl/nextjs-multilingual-seo-comparison.md +362 -0
- package/blog/pl/rag_powered_documentation_assistant.md +288 -0
- package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/pl/vue-i18n_vs_intlayer.md +278 -0
- package/blog/pl/what_is_internationalization.md +167 -0
- package/blog/pt/i18n_using_next-i18next.md +1067 -0
- package/blog/pt/i18n_using_next-intl.md +760 -0
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/ru/i18n_using_next-i18next.md +1106 -0
- package/blog/ru/i18n_using_next-intl.md +759 -0
- package/blog/ru/intlayer_with_react-intl.md +0 -4
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/tr/i18n_using_next-i18next.md +1078 -0
- package/blog/tr/i18n_using_next-intl.md +760 -0
- package/blog/tr/intlayer_with_react-intl.md +0 -4
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +2 -0
- package/blog/vi/i18n_using_next-i18next.md +1080 -0
- package/blog/vi/i18n_using_next-intl.md +758 -0
- package/blog/vi/index.md +69 -0
- package/blog/vi/internationalization_and_SEO.md +363 -0
- package/blog/vi/intlayer_with_react-intl.md +0 -4
- package/blog/vi/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/vi/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/vi/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/vi/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/vi/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/vi/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/vi/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/vi/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/vi/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +1520 -0
- package/blog/vi/nextjs-multilingual-seo-comparison.md +362 -0
- package/blog/vi/rag_powered_documentation_assistant.md +288 -0
- package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/vi/vue-i18n_vs_intlayer.md +278 -0
- package/blog/vi/what_is_internationalization.md +168 -0
- package/blog/zh/i18n_using_next-i18next.md +1105 -0
- package/blog/zh/i18n_using_next-intl.md +758 -0
- package/blog/zh/intlayer_with_react-intl.md +0 -4
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/dist/cjs/common.cjs +0 -4
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +38 -6
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +0 -6
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +0 -6
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +0 -6
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +38 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +2 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/docs/ar/component_i18n.md +1 -1
- package/docs/ar/configuration.md +6 -0
- package/docs/ar/intlayer_cli.md +8 -3
- package/docs/ar/intlayer_with_next-i18next.md +619 -0
- package/docs/ar/intlayer_with_next-intl.md +446 -0
- package/docs/ar/intlayer_with_nextjs_16.md +21 -0
- package/docs/ar/intlayer_with_tanstack.md +4 -0
- package/docs/ar/intlayer_with_vite+react.md +4 -0
- package/docs/de/component_i18n.md +1 -1
- package/docs/de/configuration.md +6 -0
- package/docs/de/intlayer_cli.md +8 -3
- package/docs/de/intlayer_with_next-i18next.md +627 -0
- package/docs/de/intlayer_with_next-intl.md +451 -0
- package/docs/de/intlayer_with_nextjs_16.md +21 -0
- package/docs/de/intlayer_with_tanstack.md +4 -0
- package/docs/de/intlayer_with_vite+react.md +4 -0
- package/docs/en/component_i18n.md +1 -1
- package/docs/en/intlayer_cli.md +8 -1
- package/docs/en/intlayer_with_astro.md +10 -2
- package/docs/en/intlayer_with_create_react_app.md +8 -0
- package/docs/en/intlayer_with_lynx+react.md +8 -0
- package/docs/en/intlayer_with_nestjs.md +10 -0
- package/docs/en/intlayer_with_nextjs_14.md +10 -2
- package/docs/en/intlayer_with_nextjs_15.md +21 -4
- package/docs/en/intlayer_with_nextjs_16.md +17 -0
- package/docs/en/intlayer_with_nuxt.md +8 -0
- package/docs/en/intlayer_with_react_native+expo.md +10 -2
- package/docs/en/intlayer_with_react_router_v7.md +8 -0
- package/docs/en/intlayer_with_tanstack.md +10 -0
- package/docs/en/intlayer_with_vite+preact.md +10 -2
- package/docs/en/intlayer_with_vite+react.md +21 -4
- package/docs/en/intlayer_with_vite+vue.md +10 -2
- package/docs/en-GB/component_i18n.md +1 -1
- package/docs/en-GB/configuration.md +6 -0
- package/docs/en-GB/intlayer_cli.md +8 -3
- package/docs/en-GB/intlayer_with_angular.md +4 -4
- package/docs/en-GB/intlayer_with_express.md +4 -4
- package/docs/en-GB/intlayer_with_lynx+react.md +12 -12
- package/{blog/en/_intlayer_with_next-i18next.md → docs/en-GB/intlayer_with_next-i18next.md} +241 -42
- package/{blog/en/_intlayer_with_next-intl.md → docs/en-GB/intlayer_with_next-intl.md} +144 -29
- package/docs/en-GB/intlayer_with_nextjs_16.md +21 -0
- package/docs/en-GB/intlayer_with_tanstack.md +5 -1
- package/docs/en-GB/intlayer_with_vite+react.md +4 -0
- package/docs/en-GB/packages/next-intlayer/t.md +2 -2
- package/docs/es/component_i18n.md +1 -1
- package/docs/es/configuration.md +6 -0
- package/docs/es/intlayer_cli.md +8 -3
- package/docs/es/intlayer_with_next-i18next.md +628 -0
- package/docs/es/intlayer_with_next-intl.md +446 -0
- package/docs/es/intlayer_with_nextjs_16.md +21 -0
- package/docs/es/intlayer_with_tanstack.md +4 -0
- package/docs/es/intlayer_with_vite+react.md +4 -0
- package/docs/fr/configuration.md +6 -0
- package/docs/fr/intlayer_cli.md +8 -3
- package/docs/fr/intlayer_with_next-i18next.md +628 -0
- package/docs/fr/intlayer_with_next-intl.md +446 -0
- package/docs/fr/intlayer_with_nextjs_16.md +23 -2
- package/docs/fr/intlayer_with_tanstack.md +4 -0
- package/docs/fr/intlayer_with_vite+react.md +4 -0
- package/docs/hi/component_i18n.md +1 -1
- package/docs/hi/configuration.md +6 -0
- package/docs/hi/intlayer_cli.md +8 -0
- package/docs/hi/intlayer_with_next-i18next.md +628 -0
- package/docs/hi/intlayer_with_next-intl.md +446 -0
- package/docs/hi/intlayer_with_nextjs_16.md +21 -0
- package/docs/hi/intlayer_with_tanstack.md +4 -0
- package/docs/hi/intlayer_with_vite+react.md +4 -0
- package/docs/id/CI_CD.md +198 -0
- package/docs/id/autoFill.md +284 -0
- package/docs/id/component_i18n.md +186 -0
- package/docs/id/configuration.md +710 -0
- package/docs/id/dictionary/condition.md +231 -0
- package/docs/id/dictionary/content_file.md +1092 -0
- package/docs/id/dictionary/enumeration.md +245 -0
- package/docs/id/dictionary/file.md +237 -0
- package/docs/id/dictionary/function_fetching.md +214 -0
- package/docs/id/dictionary/gender.md +273 -0
- package/docs/id/dictionary/insertion.md +192 -0
- package/docs/id/dictionary/markdown.md +381 -0
- package/docs/id/dictionary/nesting.md +273 -0
- package/docs/id/dictionary/translation.md +310 -0
- package/docs/id/formatters.md +596 -0
- package/docs/id/how_works_intlayer.md +256 -0
- package/docs/id/index.md +176 -0
- package/docs/id/interest_of_intlayer.md +293 -0
- package/docs/id/intlayer_CMS.md +549 -0
- package/docs/id/intlayer_cli.md +850 -0
- package/docs/id/intlayer_visual_editor.md +288 -0
- package/docs/id/intlayer_with_angular.md +694 -0
- package/docs/id/intlayer_with_astro.md +252 -0
- package/docs/id/intlayer_with_create_react_app.md +1233 -0
- package/docs/id/intlayer_with_express.md +411 -0
- package/docs/id/intlayer_with_lynx+react.md +518 -0
- package/docs/id/intlayer_with_nestjs.md +272 -0
- package/docs/id/intlayer_with_next-i18next.md +628 -0
- package/docs/id/intlayer_with_next-intl.md +446 -0
- package/docs/id/intlayer_with_nextjs_14.md +1617 -0
- package/docs/id/intlayer_with_nextjs_15.md +1698 -0
- package/docs/id/intlayer_with_nextjs_16.md +21 -0
- package/docs/id/intlayer_with_nextjs_page_router.md +1478 -0
- package/docs/id/intlayer_with_nuxt.md +808 -0
- package/docs/id/intlayer_with_react_native+expo.md +699 -0
- package/docs/id/intlayer_with_react_router_v7.md +496 -0
- package/docs/id/intlayer_with_tanstack.md +564 -0
- package/docs/id/intlayer_with_vite+preact.md +1737 -0
- package/docs/id/intlayer_with_vite+react.md +1413 -0
- package/docs/id/intlayer_with_vite+solid.md +289 -0
- package/docs/id/intlayer_with_vite+svelte.md +289 -0
- package/docs/id/intlayer_with_vite+vue.md +1088 -0
- package/docs/id/introduction.md +218 -0
- package/docs/id/locale_mapper.md +242 -0
- package/docs/id/mcp_server.md +211 -0
- package/docs/id/packages/express-intlayer/t.md +458 -0
- package/docs/id/packages/intlayer/getConfiguration.md +145 -0
- package/docs/id/packages/intlayer/getEnumeration.md +159 -0
- package/docs/id/packages/intlayer/getHTMLTextDir.md +122 -0
- package/docs/id/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/id/packages/intlayer/getLocaleName.md +119 -0
- package/docs/id/packages/intlayer/getLocalizedUrl.md +309 -0
- package/docs/id/packages/intlayer/getMultilingualUrls.md +223 -0
- package/docs/id/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/id/packages/intlayer/getTranslation.md +190 -0
- package/docs/id/packages/intlayer/getTranslationContent.md +188 -0
- package/docs/id/packages/next-intlayer/t.md +352 -0
- package/docs/id/packages/next-intlayer/useDictionary.md +271 -0
- package/docs/id/packages/next-intlayer/useIntlayer.md +264 -0
- package/docs/id/packages/next-intlayer/useLocale.md +166 -0
- package/docs/id/packages/react-intlayer/t.md +303 -0
- package/docs/id/packages/react-intlayer/useDictionary.md +287 -0
- package/docs/id/packages/react-intlayer/useI18n.md +267 -0
- package/docs/id/packages/react-intlayer/useIntlayer.md +254 -0
- package/docs/id/packages/react-intlayer/useLocale.md +210 -0
- package/docs/id/per_locale_file.md +323 -0
- package/docs/id/readme.md +261 -0
- package/docs/id/releases/v6.md +305 -0
- package/docs/id/roadmap.md +362 -0
- package/docs/id/testing.md +202 -0
- package/docs/id/vs_code_extension.md +126 -0
- package/docs/it/component_i18n.md +1 -1
- package/docs/it/configuration.md +6 -0
- package/docs/it/intlayer_cli.md +8 -3
- package/docs/it/intlayer_with_next-i18next.md +628 -0
- package/docs/it/intlayer_with_next-intl.md +446 -0
- package/docs/it/intlayer_with_nextjs_16.md +21 -0
- package/docs/it/intlayer_with_tanstack.md +4 -0
- package/docs/it/intlayer_with_vite+react.md +4 -0
- package/docs/ja/component_i18n.md +1 -1
- package/docs/ja/configuration.md +6 -0
- package/docs/ja/intlayer_cli.md +8 -3
- package/docs/ja/intlayer_with_next-i18next.md +627 -0
- package/docs/ja/intlayer_with_next-intl.md +446 -0
- package/docs/ja/intlayer_with_nextjs_16.md +21 -0
- package/docs/ja/intlayer_with_tanstack.md +4 -0
- package/docs/ja/intlayer_with_vite+react.md +4 -0
- package/docs/ko/configuration.md +6 -0
- package/docs/ko/intlayer_cli.md +8 -3
- package/docs/ko/intlayer_with_next-i18next.md +627 -0
- package/docs/ko/intlayer_with_next-intl.md +446 -0
- package/docs/ko/intlayer_with_nextjs_16.md +21 -0
- package/docs/ko/intlayer_with_tanstack.md +4 -0
- package/docs/ko/intlayer_with_vite+react.md +4 -0
- package/docs/pl/CI_CD.md +198 -0
- package/docs/pl/autoFill.md +284 -0
- package/docs/pl/component_i18n.md +186 -0
- package/docs/pl/configuration.md +710 -0
- package/docs/pl/dictionary/condition.md +232 -0
- package/docs/pl/dictionary/content_file.md +1130 -0
- package/docs/pl/dictionary/enumeration.md +245 -0
- package/docs/pl/dictionary/file.md +234 -0
- package/docs/pl/dictionary/function_fetching.md +214 -0
- package/docs/pl/dictionary/gender.md +276 -0
- package/docs/pl/dictionary/insertion.md +188 -0
- package/docs/pl/dictionary/markdown.md +408 -0
- package/docs/pl/dictionary/nesting.md +273 -0
- package/docs/pl/dictionary/translation.md +310 -0
- package/docs/pl/formatters.md +596 -0
- package/docs/pl/how_works_intlayer.md +256 -0
- package/docs/pl/index.md +176 -0
- package/docs/pl/interest_of_intlayer.md +291 -0
- package/docs/pl/intlayer_CMS.md +549 -0
- package/docs/pl/intlayer_cli.md +857 -0
- package/docs/pl/intlayer_visual_editor.md +288 -0
- package/docs/pl/intlayer_with_angular.md +690 -0
- package/docs/pl/intlayer_with_astro.md +280 -0
- package/docs/pl/intlayer_with_create_react_app.md +1235 -0
- package/docs/pl/intlayer_with_express.md +411 -0
- package/docs/pl/intlayer_with_lynx+react.md +518 -0
- package/docs/pl/intlayer_with_nestjs.md +272 -0
- package/docs/pl/intlayer_with_next-i18next.md +628 -0
- package/docs/pl/intlayer_with_next-intl.md +446 -0
- package/docs/pl/intlayer_with_nextjs_14.md +1594 -0
- package/docs/pl/intlayer_with_nextjs_15.md +1701 -0
- package/docs/pl/intlayer_with_nextjs_16.md +21 -0
- package/docs/pl/intlayer_with_nextjs_page_router.md +1513 -0
- package/docs/pl/intlayer_with_nuxt.md +885 -0
- package/docs/pl/intlayer_with_react_native+expo.md +698 -0
- package/docs/pl/intlayer_with_react_router_v7.md +503 -0
- package/docs/pl/intlayer_with_tanstack.md +562 -0
- package/docs/pl/intlayer_with_vite+preact.md +1736 -0
- package/docs/pl/intlayer_with_vite+react.md +1438 -0
- package/docs/pl/intlayer_with_vite+solid.md +290 -0
- package/docs/pl/intlayer_with_vite+svelte.md +289 -0
- package/docs/pl/intlayer_with_vite+vue.md +1116 -0
- package/docs/pl/introduction.md +209 -0
- package/docs/pl/locale_mapper.md +242 -0
- package/docs/pl/mcp_server.md +211 -0
- package/docs/pl/packages/express-intlayer/t.md +458 -0
- package/docs/pl/packages/intlayer/getConfiguration.md +146 -0
- package/docs/pl/packages/intlayer/getEnumeration.md +160 -0
- package/docs/pl/packages/intlayer/getHTMLTextDir.md +121 -0
- package/docs/pl/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/pl/packages/intlayer/getLocaleName.md +118 -0
- package/docs/pl/packages/intlayer/getLocalizedUrl.md +300 -0
- package/docs/pl/packages/intlayer/getMultilingualUrls.md +221 -0
- package/docs/pl/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/pl/packages/intlayer/getTranslation.md +190 -0
- package/docs/pl/packages/intlayer/getTranslationContent.md +189 -0
- package/docs/pl/packages/next-intlayer/t.md +353 -0
- package/docs/pl/packages/next-intlayer/useDictionary.md +270 -0
- package/docs/pl/packages/next-intlayer/useIntlayer.md +263 -0
- package/docs/pl/packages/next-intlayer/useLocale.md +166 -0
- package/docs/pl/packages/react-intlayer/t.md +303 -0
- package/docs/pl/packages/react-intlayer/useDictionary.md +289 -0
- package/docs/pl/packages/react-intlayer/useI18n.md +249 -0
- package/docs/pl/packages/react-intlayer/useIntlayer.md +256 -0
- package/docs/pl/packages/react-intlayer/useLocale.md +210 -0
- package/docs/pl/per_locale_file.md +321 -0
- package/docs/pl/readme.md +261 -0
- package/docs/pl/releases/v6.md +305 -0
- package/docs/pl/roadmap.md +362 -0
- package/docs/pl/testing.md +202 -0
- package/docs/pl/vs_code_extension.md +126 -0
- package/docs/pt/component_i18n.md +1 -1
- package/docs/pt/configuration.md +6 -0
- package/docs/pt/intlayer_cli.md +8 -3
- package/docs/pt/intlayer_with_next-i18next.md +627 -0
- package/docs/pt/intlayer_with_next-intl.md +446 -0
- package/docs/pt/intlayer_with_nextjs_16.md +21 -0
- package/docs/pt/intlayer_with_tanstack.md +4 -0
- package/docs/pt/intlayer_with_vite+react.md +4 -0
- package/docs/ru/component_i18n.md +1 -1
- package/docs/ru/configuration.md +6 -0
- package/docs/ru/intlayer_cli.md +301 -22
- package/docs/ru/intlayer_with_next-i18next.md +629 -0
- package/docs/ru/intlayer_with_next-intl.md +448 -0
- package/docs/ru/intlayer_with_nextjs_16.md +21 -0
- package/docs/ru/intlayer_with_tanstack.md +4 -0
- package/docs/ru/intlayer_with_vite+react.md +4 -0
- package/docs/tr/component_i18n.md +1 -1
- package/docs/tr/configuration.md +6 -0
- package/docs/tr/intlayer_cli.md +8 -0
- package/docs/tr/intlayer_with_next-i18next.md +627 -0
- package/docs/tr/intlayer_with_next-intl.md +446 -0
- package/docs/tr/intlayer_with_nextjs_16.md +21 -0
- package/docs/tr/intlayer_with_tanstack.md +4 -0
- package/docs/tr/intlayer_with_vite+react.md +4 -0
- package/docs/vi/CI_CD.md +198 -0
- package/docs/vi/autoFill.md +284 -0
- package/docs/vi/component_i18n.md +186 -0
- package/docs/vi/configuration.md +710 -0
- package/docs/vi/dictionary/condition.md +237 -0
- package/docs/vi/dictionary/content_file.md +1115 -0
- package/docs/vi/dictionary/enumeration.md +255 -0
- package/docs/vi/dictionary/file.md +234 -0
- package/docs/vi/dictionary/function_fetching.md +212 -0
- package/docs/vi/dictionary/gender.md +275 -0
- package/docs/vi/dictionary/insertion.md +191 -0
- package/docs/vi/dictionary/markdown.md +381 -0
- package/docs/vi/dictionary/nesting.md +273 -0
- package/docs/vi/dictionary/translation.md +309 -0
- package/docs/vi/formatters.md +595 -0
- package/docs/vi/how_works_intlayer.md +256 -0
- package/docs/vi/index.md +174 -0
- package/docs/vi/interest_of_intlayer.md +292 -0
- package/docs/vi/intlayer_CMS.md +549 -0
- package/docs/vi/intlayer_cli.md +850 -0
- package/docs/vi/intlayer_visual_editor.md +288 -0
- package/docs/vi/intlayer_with_angular.md +692 -0
- package/docs/vi/intlayer_with_astro.md +252 -0
- package/docs/vi/intlayer_with_create_react_app.md +1230 -0
- package/docs/vi/intlayer_with_express.md +409 -0
- package/docs/vi/intlayer_with_lynx+react.md +520 -0
- package/docs/vi/intlayer_with_nestjs.md +272 -0
- package/docs/vi/intlayer_with_next-i18next.md +628 -0
- package/docs/vi/intlayer_with_next-intl.md +446 -0
- package/docs/vi/intlayer_with_nextjs_14.md +1584 -0
- package/docs/vi/intlayer_with_nextjs_15.md +1738 -0
- package/docs/vi/intlayer_with_nextjs_16.md +21 -0
- package/docs/vi/intlayer_with_nextjs_page_router.md +1504 -0
- package/docs/vi/intlayer_with_nuxt.md +821 -0
- package/docs/vi/intlayer_with_react_native+expo.md +700 -0
- package/docs/vi/intlayer_with_react_router_v7.md +498 -0
- package/docs/vi/intlayer_with_tanstack.md +562 -0
- package/docs/vi/intlayer_with_vite+preact.md +1722 -0
- package/docs/vi/intlayer_with_vite+react.md +1407 -0
- package/docs/vi/intlayer_with_vite+solid.md +287 -0
- package/docs/vi/intlayer_with_vite+svelte.md +289 -0
- package/docs/vi/intlayer_with_vite+vue.md +1071 -0
- package/docs/vi/introduction.md +215 -0
- package/docs/vi/locale_mapper.md +242 -0
- package/docs/vi/mcp_server.md +211 -0
- package/docs/vi/packages/express-intlayer/t.md +457 -0
- package/docs/vi/packages/intlayer/getConfiguration.md +145 -0
- package/docs/vi/packages/intlayer/getEnumeration.md +162 -0
- package/docs/vi/packages/intlayer/getHTMLTextDir.md +121 -0
- package/docs/vi/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/vi/packages/intlayer/getLocaleName.md +129 -0
- package/docs/vi/packages/intlayer/getLocalizedUrl.md +309 -0
- package/docs/vi/packages/intlayer/getMultilingualUrls.md +221 -0
- package/docs/vi/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/vi/packages/intlayer/getTranslation.md +201 -0
- package/docs/vi/packages/intlayer/getTranslationContent.md +188 -0
- package/docs/vi/packages/next-intlayer/t.md +352 -0
- package/docs/vi/packages/next-intlayer/useDictionary.md +273 -0
- package/docs/vi/packages/next-intlayer/useIntlayer.md +264 -0
- package/docs/vi/packages/next-intlayer/useLocale.md +166 -0
- package/docs/vi/packages/react-intlayer/t.md +304 -0
- package/docs/vi/packages/react-intlayer/useDictionary.md +288 -0
- package/docs/vi/packages/react-intlayer/useI18n.md +295 -0
- package/docs/vi/packages/react-intlayer/useIntlayer.md +256 -0
- package/docs/vi/packages/react-intlayer/useLocale.md +210 -0
- package/docs/vi/per_locale_file.md +326 -0
- package/docs/vi/readme.md +261 -0
- package/docs/vi/releases/v6.md +305 -0
- package/docs/vi/roadmap.md +346 -0
- package/docs/vi/testing.md +202 -0
- package/docs/vi/vs_code_extension.md +126 -0
- package/docs/zh/configuration.md +6 -0
- package/docs/zh/intlayer_cli.md +8 -3
- package/docs/zh/intlayer_with_next-i18next.md +628 -0
- package/docs/zh/intlayer_with_next-intl.md +448 -0
- package/docs/zh/intlayer_with_nextjs_16.md +21 -0
- package/docs/zh/intlayer_with_tanstack.md +4 -0
- package/docs/zh/intlayer_with_vite+react.md +4 -0
- package/frequent_questions/ar/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ar/array_as_content_declaration.md +1 -2
- package/frequent_questions/ar/build_dictionaries.md +1 -2
- package/frequent_questions/ar/build_error_CI_CD.md +1 -2
- package/frequent_questions/ar/bun_set_up.md +1 -2
- package/frequent_questions/ar/customized_locale_list.md +1 -2
- package/frequent_questions/ar/domain_routing.md +1 -2
- package/frequent_questions/ar/esbuild_error.md +1 -2
- package/frequent_questions/ar/get_locale_cookie.md +1 -2
- package/frequent_questions/ar/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ar/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ar/static_rendering.md +1 -3
- package/frequent_questions/ar/translated_path_url.md +1 -2
- package/frequent_questions/ar/unknown_command.md +1 -2
- package/frequent_questions/de/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/de/array_as_content_declaration.md +1 -2
- package/frequent_questions/de/build_dictionaries.md +1 -2
- package/frequent_questions/de/build_error_CI_CD.md +1 -2
- package/frequent_questions/de/bun_set_up.md +1 -2
- package/frequent_questions/de/customized_locale_list.md +1 -2
- package/frequent_questions/de/domain_routing.md +1 -2
- package/frequent_questions/de/esbuild_error.md +1 -2
- package/frequent_questions/de/get_locale_cookie.md +1 -2
- package/frequent_questions/de/intlayer_command_undefined.md +1 -2
- package/frequent_questions/de/locale_incorect_in_url.md +1 -2
- package/frequent_questions/de/static_rendering.md +1 -3
- package/frequent_questions/de/translated_path_url.md +1 -2
- package/frequent_questions/de/unknown_command.md +1 -2
- package/frequent_questions/en/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/en/array_as_content_declaration.md +1 -2
- package/frequent_questions/en/build_dictionaries.md +1 -2
- package/frequent_questions/en/build_error_CI_CD.md +1 -2
- package/frequent_questions/en/bun_set_up.md +1 -2
- package/frequent_questions/en/customized_locale_list.md +1 -2
- package/frequent_questions/en/domain_routing.md +1 -2
- package/frequent_questions/en/esbuild_error.md +1 -2
- package/frequent_questions/en/get_locale_cookie.md +1 -2
- package/frequent_questions/en/intlayer_command_undefined.md +1 -2
- package/frequent_questions/en/locale_incorect_in_url.md +1 -2
- package/frequent_questions/en/static_rendering.md +1 -3
- package/frequent_questions/en/translated_path_url.md +1 -2
- package/frequent_questions/en/unknown_command.md +1 -2
- package/frequent_questions/en-GB/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/en-GB/array_as_content_declaration.md +1 -2
- package/frequent_questions/en-GB/build_dictionaries.md +1 -2
- package/frequent_questions/en-GB/build_error_CI_CD.md +1 -2
- package/frequent_questions/en-GB/bun_set_up.md +1 -2
- package/frequent_questions/en-GB/customized_locale_list.md +1 -2
- package/frequent_questions/en-GB/domain_routing.md +1 -2
- package/frequent_questions/en-GB/esbuild_error.md +1 -2
- package/frequent_questions/en-GB/get_locale_cookie.md +1 -2
- package/frequent_questions/en-GB/intlayer_command_undefined.md +1 -2
- package/frequent_questions/en-GB/locale_incorect_in_url.md +1 -2
- package/frequent_questions/en-GB/static_rendering.md +1 -3
- package/frequent_questions/en-GB/translated_path_url.md +1 -2
- package/frequent_questions/en-GB/unknown_command.md +1 -2
- package/frequent_questions/es/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/es/array_as_content_declaration.md +1 -2
- package/frequent_questions/es/build_dictionaries.md +1 -2
- package/frequent_questions/es/build_error_CI_CD.md +1 -2
- package/frequent_questions/es/bun_set_up.md +1 -2
- package/frequent_questions/es/customized_locale_list.md +1 -2
- package/frequent_questions/es/domain_routing.md +1 -2
- package/frequent_questions/es/esbuild_error.md +1 -2
- package/frequent_questions/es/get_locale_cookie.md +1 -2
- package/frequent_questions/es/intlayer_command_undefined.md +1 -2
- package/frequent_questions/es/locale_incorect_in_url.md +1 -2
- package/frequent_questions/es/static_rendering.md +1 -3
- package/frequent_questions/es/translated_path_url.md +1 -2
- package/frequent_questions/es/unknown_command.md +1 -2
- package/frequent_questions/fr/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/fr/array_as_content_declaration.md +1 -2
- package/frequent_questions/fr/build_dictionaries.md +1 -2
- package/frequent_questions/fr/build_error_CI_CD.md +1 -2
- package/frequent_questions/fr/bun_set_up.md +1 -2
- package/frequent_questions/fr/customized_locale_list.md +1 -2
- package/frequent_questions/fr/domain_routing.md +1 -2
- package/frequent_questions/fr/esbuild_error.md +1 -2
- package/frequent_questions/fr/get_locale_cookie.md +1 -2
- package/frequent_questions/fr/intlayer_command_undefined.md +1 -2
- package/frequent_questions/fr/locale_incorect_in_url.md +1 -2
- package/frequent_questions/fr/static_rendering.md +1 -3
- package/frequent_questions/fr/translated_path_url.md +1 -2
- package/frequent_questions/fr/unknown_command.md +1 -2
- package/frequent_questions/hi/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/hi/array_as_content_declaration.md +1 -2
- package/frequent_questions/hi/build_dictionaries.md +1 -2
- package/frequent_questions/hi/build_error_CI_CD.md +1 -2
- package/frequent_questions/hi/bun_set_up.md +1 -2
- package/frequent_questions/hi/customized_locale_list.md +1 -2
- package/frequent_questions/hi/domain_routing.md +1 -2
- package/frequent_questions/hi/esbuild_error.md +1 -2
- package/frequent_questions/hi/get_locale_cookie.md +1 -2
- package/frequent_questions/hi/intlayer_command_undefined.md +1 -2
- package/frequent_questions/hi/locale_incorect_in_url.md +1 -2
- package/frequent_questions/hi/static_rendering.md +1 -3
- package/frequent_questions/hi/translated_path_url.md +1 -2
- package/frequent_questions/hi/unknown_command.md +1 -2
- package/frequent_questions/id/SSR_Next_no_[locale].md +104 -0
- package/frequent_questions/id/array_as_content_declaration.md +71 -0
- package/frequent_questions/id/build_dictionaries.md +58 -0
- package/frequent_questions/id/build_error_CI_CD.md +74 -0
- package/frequent_questions/id/bun_set_up.md +53 -0
- package/frequent_questions/id/customized_locale_list.md +64 -0
- package/frequent_questions/id/domain_routing.md +113 -0
- package/frequent_questions/id/esbuild_error.md +29 -0
- package/frequent_questions/id/get_locale_cookie.md +142 -0
- package/frequent_questions/id/intlayer_command_undefined.md +155 -0
- package/frequent_questions/id/locale_incorect_in_url.md +73 -0
- package/frequent_questions/id/static_rendering.md +44 -0
- package/frequent_questions/id/translated_path_url.md +55 -0
- package/frequent_questions/id/unknown_command.md +97 -0
- package/frequent_questions/it/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/it/array_as_content_declaration.md +1 -2
- package/frequent_questions/it/build_dictionaries.md +1 -2
- package/frequent_questions/it/build_error_CI_CD.md +1 -2
- package/frequent_questions/it/bun_set_up.md +1 -2
- package/frequent_questions/it/customized_locale_list.md +1 -2
- package/frequent_questions/it/domain_routing.md +1 -2
- package/frequent_questions/it/esbuild_error.md +1 -2
- package/frequent_questions/it/get_locale_cookie.md +1 -2
- package/frequent_questions/it/intlayer_command_undefined.md +1 -2
- package/frequent_questions/it/locale_incorect_in_url.md +1 -2
- package/frequent_questions/it/static_rendering.md +1 -3
- package/frequent_questions/it/translated_path_url.md +1 -2
- package/frequent_questions/it/unknown_command.md +1 -2
- package/frequent_questions/ja/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ja/array_as_content_declaration.md +1 -2
- package/frequent_questions/ja/build_dictionaries.md +1 -2
- package/frequent_questions/ja/build_error_CI_CD.md +1 -2
- package/frequent_questions/ja/bun_set_up.md +1 -2
- package/frequent_questions/ja/customized_locale_list.md +1 -2
- package/frequent_questions/ja/domain_routing.md +1 -2
- package/frequent_questions/ja/esbuild_error.md +1 -2
- package/frequent_questions/ja/get_locale_cookie.md +1 -2
- package/frequent_questions/ja/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ja/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ja/static_rendering.md +1 -3
- package/frequent_questions/ja/translated_path_url.md +1 -2
- package/frequent_questions/ja/unknown_command.md +1 -2
- package/frequent_questions/ko/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ko/array_as_content_declaration.md +1 -2
- package/frequent_questions/ko/build_dictionaries.md +1 -2
- package/frequent_questions/ko/build_error_CI_CD.md +1 -2
- package/frequent_questions/ko/bun_set_up.md +1 -2
- package/frequent_questions/ko/customized_locale_list.md +1 -2
- package/frequent_questions/ko/domain_routing.md +1 -2
- package/frequent_questions/ko/esbuild_error.md +1 -2
- package/frequent_questions/ko/get_locale_cookie.md +1 -2
- package/frequent_questions/ko/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ko/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ko/static_rendering.md +1 -3
- package/frequent_questions/ko/translated_path_url.md +1 -2
- package/frequent_questions/ko/unknown_command.md +1 -2
- package/frequent_questions/pl/SSR_Next_no_[locale].md +104 -0
- package/frequent_questions/pl/array_as_content_declaration.md +71 -0
- package/frequent_questions/pl/build_dictionaries.md +58 -0
- package/frequent_questions/pl/build_error_CI_CD.md +74 -0
- package/frequent_questions/pl/bun_set_up.md +54 -0
- package/frequent_questions/pl/customized_locale_list.md +64 -0
- package/frequent_questions/pl/domain_routing.md +113 -0
- package/frequent_questions/pl/esbuild_error.md +29 -0
- package/frequent_questions/pl/get_locale_cookie.md +142 -0
- package/frequent_questions/pl/intlayer_command_undefined.md +155 -0
- package/frequent_questions/pl/locale_incorect_in_url.md +73 -0
- package/frequent_questions/pl/static_rendering.md +44 -0
- package/frequent_questions/pl/translated_path_url.md +55 -0
- package/frequent_questions/pl/unknown_command.md +97 -0
- package/frequent_questions/pt/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/pt/array_as_content_declaration.md +1 -2
- package/frequent_questions/pt/build_dictionaries.md +1 -2
- package/frequent_questions/pt/build_error_CI_CD.md +1 -2
- package/frequent_questions/pt/bun_set_up.md +1 -2
- package/frequent_questions/pt/customized_locale_list.md +1 -2
- package/frequent_questions/pt/domain_routing.md +1 -2
- package/frequent_questions/pt/esbuild_error.md +1 -2
- package/frequent_questions/pt/get_locale_cookie.md +1 -2
- package/frequent_questions/pt/intlayer_command_undefined.md +1 -2
- package/frequent_questions/pt/locale_incorect_in_url.md +1 -2
- package/frequent_questions/pt/static_rendering.md +1 -3
- package/frequent_questions/pt/translated_path_url.md +1 -2
- package/frequent_questions/pt/unknown_command.md +1 -2
- package/frequent_questions/ru/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ru/array_as_content_declaration.md +1 -2
- package/frequent_questions/ru/build_dictionaries.md +1 -2
- package/frequent_questions/ru/build_error_CI_CD.md +1 -2
- package/frequent_questions/ru/bun_set_up.md +1 -2
- package/frequent_questions/ru/customized_locale_list.md +1 -2
- package/frequent_questions/ru/domain_routing.md +1 -2
- package/frequent_questions/ru/esbuild_error.md +1 -2
- package/frequent_questions/ru/get_locale_cookie.md +1 -2
- package/frequent_questions/ru/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ru/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/ru/translated_path_url.md +1 -2
- package/frequent_questions/ru/unknown_command.md +1 -2
- package/frequent_questions/tr/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/tr/array_as_content_declaration.md +1 -2
- package/frequent_questions/tr/build_dictionaries.md +1 -2
- package/frequent_questions/tr/build_error_CI_CD.md +1 -2
- package/frequent_questions/tr/bun_set_up.md +1 -2
- package/frequent_questions/tr/customized_locale_list.md +1 -2
- package/frequent_questions/tr/domain_routing.md +1 -2
- package/frequent_questions/tr/esbuild_error.md +1 -2
- package/frequent_questions/tr/get_locale_cookie.md +1 -2
- package/frequent_questions/tr/intlayer_command_undefined.md +1 -2
- package/frequent_questions/tr/locale_incorect_in_url.md +1 -2
- package/frequent_questions/tr/static_rendering.md +1 -2
- package/frequent_questions/tr/translated_path_url.md +1 -2
- package/frequent_questions/tr/unknown_command.md +1 -2
- package/frequent_questions/vi/SSR_Next_no_[locale].md +106 -0
- package/frequent_questions/vi/array_as_content_declaration.md +71 -0
- package/frequent_questions/vi/build_dictionaries.md +58 -0
- package/frequent_questions/vi/build_error_CI_CD.md +74 -0
- package/frequent_questions/vi/bun_set_up.md +53 -0
- package/frequent_questions/vi/customized_locale_list.md +64 -0
- package/frequent_questions/vi/domain_routing.md +113 -0
- package/frequent_questions/vi/esbuild_error.md +29 -0
- package/frequent_questions/vi/get_locale_cookie.md +142 -0
- package/frequent_questions/vi/intlayer_command_undefined.md +155 -0
- package/frequent_questions/vi/locale_incorect_in_url.md +73 -0
- package/frequent_questions/vi/static_rendering.md +44 -0
- package/frequent_questions/vi/translated_path_url.md +55 -0
- package/frequent_questions/vi/unknown_command.md +97 -0
- package/frequent_questions/zh/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/zh/array_as_content_declaration.md +1 -2
- package/frequent_questions/zh/build_dictionaries.md +1 -2
- package/frequent_questions/zh/build_error_CI_CD.md +1 -2
- package/frequent_questions/zh/bun_set_up.md +1 -2
- package/frequent_questions/zh/customized_locale_list.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -2
- package/frequent_questions/zh/esbuild_error.md +1 -2
- package/frequent_questions/zh/get_locale_cookie.md +1 -2
- package/frequent_questions/zh/intlayer_command_undefined.md +1 -2
- package/frequent_questions/zh/locale_incorect_in_url.md +1 -2
- package/frequent_questions/zh/static_rendering.md +1 -3
- package/frequent_questions/zh/translated_path_url.md +1 -2
- package/frequent_questions/zh/unknown_command.md +1 -2
- package/legal/id/privacy_notice.md +83 -0
- package/legal/id/terms_of_service.md +55 -0
- package/legal/pl/privacy_notice.md +83 -0
- package/legal/pl/terms_of_service.md +55 -0
- package/legal/vi/privacy_notice.md +83 -0
- package/legal/vi/terms_of_service.md +55 -0
- package/package.json +19 -18
- package/src/generated/blog.entry.ts +38 -0
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-10-05
|
|
3
|
+
updatedAt: 2025-10-05
|
|
4
|
+
title: Cara menerjemahkan Next.js 15 Anda menggunakan next-i18next – panduan i18n 2025
|
|
5
|
+
description: Panduan praktis dan siap produksi untuk menginternasionalisasi aplikasi Next.js 15 App Router dengan i18next/next-i18next dan meningkatkan dengan Intlayer.
|
|
6
|
+
keywords:
|
|
7
|
+
- Internasionalisasi
|
|
8
|
+
- Dokumentasi
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Next.js 15
|
|
11
|
+
- next-i18next
|
|
12
|
+
- i18next
|
|
13
|
+
- JavaScript
|
|
14
|
+
- React
|
|
15
|
+
slugs:
|
|
16
|
+
- doc
|
|
17
|
+
- next-i18next
|
|
18
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-next-i18next-template
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Menerjemahkan website Next.js 15 Anda menggunakan next-i18next dengan Intlayer | Internasionalisasi (i18n)
|
|
22
|
+
|
|
23
|
+
### Untuk siapa panduan ini
|
|
24
|
+
|
|
25
|
+
- **Junior**: Ikuti langkah-langkah persis dan salin blok kode. Anda akan mendapatkan aplikasi multibahasa yang berfungsi.
|
|
26
|
+
- **Mid-level**: Gunakan daftar periksa dan catatan praktik terbaik untuk menghindari kesalahan umum.
|
|
27
|
+
- **Senior**: Baca sekilas struktur tingkat tinggi, SEO, dan bagian otomatisasi; Anda akan menemukan pengaturan default yang masuk akal dan titik ekstensi.
|
|
28
|
+
|
|
29
|
+
### Apa yang akan Anda bangun
|
|
30
|
+
|
|
31
|
+
- Proyek App Router dengan rute yang dilokalkan (misalnya, `/`, `/fr/...`)
|
|
32
|
+
- Konfigurasi i18n dengan locale, locale default, dukungan RTL
|
|
33
|
+
- Inisialisasi i18n sisi server dan penyedia klien
|
|
34
|
+
- Terjemahan dengan namespace yang dimuat sesuai permintaan
|
|
35
|
+
- SEO dengan `hreflang`, `sitemap` yang dilokalkan, `robots`
|
|
36
|
+
- Middleware untuk routing locale
|
|
37
|
+
- Integrasi Intlayer untuk mengotomatisasi alur kerja terjemahan (tes, pengisian AI, sinkronisasi JSON)
|
|
38
|
+
|
|
39
|
+
> Catatan: next-i18next dibangun di atas i18next. Panduan ini menggunakan primitif i18next yang kompatibel dengan next-i18next dalam App Router, sambil menjaga arsitektur tetap sederhana dan siap produksi.
|
|
40
|
+
> Untuk perbandingan yang lebih luas, lihat [next-i18next vs next-i18next vs Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/blog/id/next-i18next_vs_next-i18next_vs_intlayer.md).
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 1) Struktur proyek
|
|
45
|
+
|
|
46
|
+
Pasang dependensi next-i18next -
|
|
47
|
+
|
|
48
|
+
```bash packageManager="npm"
|
|
49
|
+
npm install next-i18next i18next react-i18next i18next-resources-to-backend
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```bash packageManager="pnpm"
|
|
53
|
+
pnpm add next-i18next i18next react-i18next i18next-resources-to-backend
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```bash packageManager="yarn"
|
|
57
|
+
yarn add next-i18next i18next react-i18next i18next-resources-to-backend
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Mulailah dengan struktur yang jelas. Simpan pesan yang dipisahkan berdasarkan locale dan namespace.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
.
|
|
64
|
+
├── i18n.config.ts
|
|
65
|
+
└── src
|
|
66
|
+
├── locales
|
|
67
|
+
│ ├── en
|
|
68
|
+
│ │ ├── common.json
|
|
69
|
+
│ │ └── about.json
|
|
70
|
+
│ └── fr
|
|
71
|
+
│ ├── common.json
|
|
72
|
+
│ └── about.json
|
|
73
|
+
├── app
|
|
74
|
+
│ ├── i18n
|
|
75
|
+
│ │ └── server.ts
|
|
76
|
+
│ └── [locale]
|
|
77
|
+
│ ├── layout.tsx
|
|
78
|
+
│ └── about.tsx
|
|
79
|
+
└── components
|
|
80
|
+
├── I18nProvider.tsx
|
|
81
|
+
├── ClientComponent.tsx
|
|
82
|
+
└── ServerComponent.tsx
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Daftar periksa (mid/senior):
|
|
86
|
+
|
|
87
|
+
- Simpan satu JSON per namespace per locale
|
|
88
|
+
- Jangan terlalu memusatkan pesan; gunakan namespace kecil yang terfokus pada halaman/fitur
|
|
89
|
+
- Hindari mengimpor semua locale sekaligus; muat hanya yang Anda butuhkan
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 2) Pasang dependensi
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
bash
|
|
97
|
+
pnpm add i18next react-i18next i18next-resources-to-backend
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Jika Anda berencana menggunakan API atau interoperabilitas konfigurasi next-i18next, juga jalankan:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
pnpm add next-i18next
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 3) Konfigurasi inti i18n
|
|
109
|
+
|
|
110
|
+
Tentukan locales, locale default, RTL, dan helper untuk path/URL yang dilokalkan.
|
|
111
|
+
|
|
112
|
+
```ts fileName="i18n.config.ts"
|
|
113
|
+
export const locales = ["en", "fr"] as const;
|
|
114
|
+
export type Locale = (typeof locales)[number];
|
|
115
|
+
|
|
116
|
+
export const defaultLocale: Locale = "en";
|
|
117
|
+
|
|
118
|
+
export const rtlLocales = ["ar", "he", "fa", "ur"] as const;
|
|
119
|
+
export const isRtl = (locale: string) =>
|
|
120
|
+
(rtlLocales as readonly string[]).includes(locale);
|
|
121
|
+
|
|
122
|
+
export function localizedPath(locale: string, path: string) {
|
|
123
|
+
return locale === defaultLocale ? path : "/" + locale + path;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const ORIGIN = "https://example.com";
|
|
127
|
+
export function abs(locale: string, path: string) {
|
|
128
|
+
return ORIGIN + localizedPath(locale, path);
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Catatan senior: Jika Anda menggunakan `next-i18next.config.js`, pastikan untuk menyelaraskannya dengan `i18n.config.ts` agar tidak terjadi perbedaan.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 4) Inisialisasi i18n sisi server
|
|
137
|
+
|
|
138
|
+
Inisialisasi i18next di server dengan backend dinamis yang hanya mengimpor JSON locale/namespace yang diperlukan.
|
|
139
|
+
|
|
140
|
+
```ts fileName="src/app/i18n/server.ts"
|
|
141
|
+
import { createInstance } from "i18next";
|
|
142
|
+
import { initReactI18next } from "react-i18next/initReactI18next";
|
|
143
|
+
import resourcesToBackend from "i18next-resources-to-backend";
|
|
144
|
+
import { defaultLocale } from "@/i18n.config";
|
|
145
|
+
|
|
146
|
+
// Memuat sumber daya JSON dari src/locales/<locale>/<namespace>.json
|
|
147
|
+
const backend = resourcesToBackend(
|
|
148
|
+
(locale: string, namespace: string) =>
|
|
149
|
+
import(`../../locales/${locale}/${namespace}.json`)
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
export async function initI18next(
|
|
153
|
+
locale: string,
|
|
154
|
+
namespaces: string[] = ["common"]
|
|
155
|
+
) {
|
|
156
|
+
const i18n = createInstance();
|
|
157
|
+
await i18n
|
|
158
|
+
.use(initReactI18next)
|
|
159
|
+
.use(backend)
|
|
160
|
+
.init({
|
|
161
|
+
lng: locale,
|
|
162
|
+
fallbackLng: defaultLocale,
|
|
163
|
+
ns: namespaces,
|
|
164
|
+
defaultNS: "common",
|
|
165
|
+
interpolation: { escapeValue: false },
|
|
166
|
+
react: { useSuspense: false },
|
|
167
|
+
});
|
|
168
|
+
return i18n;
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Catatan tengah: Jaga daftar namespace agar tetap singkat per halaman untuk membatasi payload. Hindari bundle global “catch-all”.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 5) Provider klien untuk komponen React
|
|
177
|
+
|
|
178
|
+
Bungkus komponen klien dengan provider yang mencerminkan konfigurasi server dan hanya memuat namespace yang diminta.
|
|
179
|
+
|
|
180
|
+
```tsx fileName="src/components/I18nProvider.tsx"
|
|
181
|
+
"use client";
|
|
182
|
+
|
|
183
|
+
import * as React from "react";
|
|
184
|
+
import { I18nextProvider } from "react-i18next";
|
|
185
|
+
import { createInstance } from "i18next";
|
|
186
|
+
import { initReactI18next } from "react-i18next/initReactI18next";
|
|
187
|
+
import resourcesToBackend from "i18next-resources-to-backend";
|
|
188
|
+
import { defaultLocale } from "@/i18n.config";
|
|
189
|
+
|
|
190
|
+
const backend = resourcesToBackend(
|
|
191
|
+
(locale: string, namespace: string) =>
|
|
192
|
+
import(`../../locales/${locale}/${namespace}.json`)
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
type Props = {
|
|
196
|
+
locale: string;
|
|
197
|
+
namespaces?: string[];
|
|
198
|
+
resources?: Record<string, any>; // { ns: bundle }
|
|
199
|
+
children: React.ReactNode;
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
export default function I18nProvider({
|
|
203
|
+
locale,
|
|
204
|
+
namespaces = ["common"],
|
|
205
|
+
resources,
|
|
206
|
+
children,
|
|
207
|
+
}: Props) {
|
|
208
|
+
const [i18n] = React.useState(() => {
|
|
209
|
+
const i = createInstance();
|
|
210
|
+
|
|
211
|
+
i.use(initReactI18next)
|
|
212
|
+
.use(backend)
|
|
213
|
+
.init({
|
|
214
|
+
lng: locale,
|
|
215
|
+
fallbackLng: defaultLocale,
|
|
216
|
+
ns: namespaces,
|
|
217
|
+
resources: resources ? { [locale]: resources } : undefined,
|
|
218
|
+
defaultNS: "common",
|
|
219
|
+
interpolation: { escapeValue: false },
|
|
220
|
+
react: { useSuspense: false },
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
return i;
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
return <I18nextProvider i18n={i18n}>{children}</I18nextProvider>;
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Tips junior: Anda tidak perlu mengirim semua pesan ke klien. Mulailah hanya dengan namespace halaman saja.
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 6) Tata letak dan rute yang dilokalkan
|
|
235
|
+
|
|
236
|
+
Atur bahasa dan arah, serta pra-generate rute per locale untuk mendukung rendering statis.
|
|
237
|
+
|
|
238
|
+
```tsx fileName="src/app/[locale]/layout.tsx"
|
|
239
|
+
import type { ReactNode } from "react";
|
|
240
|
+
import { locales, defaultLocale, isRtl, type Locale } from "@/i18n.config";
|
|
241
|
+
|
|
242
|
+
export const dynamicParams = false;
|
|
243
|
+
|
|
244
|
+
export function generateStaticParams() {
|
|
245
|
+
return locales.map((locale) => ({ locale }));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export default function LocaleLayout({
|
|
249
|
+
children,
|
|
250
|
+
params,
|
|
251
|
+
}: {
|
|
252
|
+
children: ReactNode;
|
|
253
|
+
params: { locale: string };
|
|
254
|
+
}) {
|
|
255
|
+
const locale: Locale = (locales as readonly string[]).includes(params.locale)
|
|
256
|
+
? (params.locale as any)
|
|
257
|
+
: defaultLocale;
|
|
258
|
+
|
|
259
|
+
const dir = isRtl(locale) ? "rtl" : "ltr";
|
|
260
|
+
|
|
261
|
+
return (
|
|
262
|
+
<html lang={locale} dir={dir}>
|
|
263
|
+
<body>{children}</body>
|
|
264
|
+
</html>
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## 7) Contoh halaman dengan penggunaan server + client
|
|
272
|
+
|
|
273
|
+
```tsx fileName="src/app/[locale]/about.tsx"
|
|
274
|
+
import I18nProvider from "@/components/I18nProvider";
|
|
275
|
+
import { initI18next } from "@/app/i18n/server";
|
|
276
|
+
import type { Locale } from "@/i18n.config";
|
|
277
|
+
import ClientComponent from "@/components/ClientComponent";
|
|
278
|
+
import ServerComponent from "@/components/ServerComponent";
|
|
279
|
+
|
|
280
|
+
// Memaksa rendering statis untuk halaman ini
|
|
281
|
+
export const dynamic = "force-static";
|
|
282
|
+
|
|
283
|
+
export default async function AboutPage({
|
|
284
|
+
params: { locale },
|
|
285
|
+
}: {
|
|
286
|
+
params: { locale: Locale };
|
|
287
|
+
}) {
|
|
288
|
+
const namespaces = ["common", "about"] as const;
|
|
289
|
+
|
|
290
|
+
const i18n = await initI18next(locale, [...namespaces]);
|
|
291
|
+
const tAbout = i18n.getFixedT(locale, "about");
|
|
292
|
+
|
|
293
|
+
return (
|
|
294
|
+
<I18nProvider locale={locale} namespaces={[...namespaces]}>
|
|
295
|
+
<main>
|
|
296
|
+
<h1>{tAbout("title")}</h1>
|
|
297
|
+
|
|
298
|
+
<ClientComponent />
|
|
299
|
+
<ServerComponent t={tAbout} locale={locale} count={0} />
|
|
300
|
+
</main>
|
|
301
|
+
</I18nProvider>
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
Terjemahan (satu JSON per namespace di bawah `src/locales/...`):
|
|
307
|
+
|
|
308
|
+
```json fileName="src/locales/id/about.json"
|
|
309
|
+
{
|
|
310
|
+
"title": "Tentang",
|
|
311
|
+
"description": "Deskripsi halaman tentang",
|
|
312
|
+
"counter": {
|
|
313
|
+
"label": "Penghitung",
|
|
314
|
+
"increment": "Tambah"
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
```json fileName="src/locales/fr/about.json"
|
|
320
|
+
{
|
|
321
|
+
"title": "À propos",
|
|
322
|
+
"description": "Description de la page À propos",
|
|
323
|
+
"counter": {
|
|
324
|
+
"label": "Compteur",
|
|
325
|
+
"increment": "Incrémenter"
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
Komponen client (memuat hanya namespace yang diperlukan):
|
|
331
|
+
|
|
332
|
+
```tsx fileName="src/components/ClientComponent.tsx"
|
|
333
|
+
"use client";
|
|
334
|
+
|
|
335
|
+
import React, { useState } from "react";
|
|
336
|
+
import { useTranslation } from "react-i18next";
|
|
337
|
+
|
|
338
|
+
const ClientComponent = () => {
|
|
339
|
+
const { t, i18n } = useTranslation("about");
|
|
340
|
+
const [count, setCount] = useState(0);
|
|
341
|
+
|
|
342
|
+
const numberFormat = new Intl.NumberFormat(i18n.language);
|
|
343
|
+
|
|
344
|
+
return (
|
|
345
|
+
<div>
|
|
346
|
+
<p>{numberFormat.format(count)}</p>
|
|
347
|
+
<button
|
|
348
|
+
aria-label={t("counter.label")}
|
|
349
|
+
onClick={() => setCount((c) => c + 1)}
|
|
350
|
+
>
|
|
351
|
+
{t("counter.increment")}
|
|
352
|
+
</button>
|
|
353
|
+
</div>
|
|
354
|
+
);
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
export default ClientComponent;
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
> Pastikan halaman/provider hanya menyertakan namespace yang Anda butuhkan (misalnya, `about`).
|
|
361
|
+
> Jika Anda menggunakan React < 19, gunakan memo untuk formatter berat seperti `Intl.NumberFormat`.
|
|
362
|
+
|
|
363
|
+
Komponen server sinkron yang disematkan di bawah batas klien:
|
|
364
|
+
|
|
365
|
+
```tsx fileName="src/components/ServerComponent.tsx"
|
|
366
|
+
type ServerComponentProps = {
|
|
367
|
+
t: (key: string) => string;
|
|
368
|
+
locale: string;
|
|
369
|
+
count: number;
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
const ServerComponent = ({ t, locale, count }: ServerComponentProps) => {
|
|
373
|
+
const formatted = new Intl.NumberFormat(locale).format(count);
|
|
374
|
+
|
|
375
|
+
return (
|
|
376
|
+
<div>
|
|
377
|
+
<p>{formatted}</p>
|
|
378
|
+
<button aria-label={t("counter.label")}>{t("counter.increment")}</button>
|
|
379
|
+
</div>
|
|
380
|
+
);
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
export default ServerComponent;
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## 8) SEO: Metadata, Hreflang, Sitemap, Robots
|
|
389
|
+
|
|
390
|
+
Menerjemahkan konten adalah cara untuk meningkatkan jangkauan. Sambungkan SEO multibahasa secara menyeluruh.
|
|
391
|
+
|
|
392
|
+
Praktik terbaik:
|
|
393
|
+
|
|
394
|
+
- Atur `lang` dan `dir` di root
|
|
395
|
+
- Tambahkan `alternates.languages` untuk setiap locale (+ `x-default`)
|
|
396
|
+
- Daftarkan URL yang diterjemahkan di `sitemap.xml` dan gunakan `hreflang`
|
|
397
|
+
- Kecualikan area privat yang dilokalkan (misalnya, `/fr/admin`) di `robots.txt`
|
|
398
|
+
|
|
399
|
+
```tsx fileName="src/app/[locale]/about/layout.tsx"
|
|
400
|
+
import type { Metadata } from "next";
|
|
401
|
+
import { locales, defaultLocale, localizedPath } from "@/i18n.config";
|
|
402
|
+
|
|
403
|
+
export async function generateMetadata({
|
|
404
|
+
params,
|
|
405
|
+
}: {
|
|
406
|
+
params: { locale: string };
|
|
407
|
+
}): Promise<Metadata> {
|
|
408
|
+
const { locale } = params;
|
|
409
|
+
|
|
410
|
+
// Impor bundel JSON yang benar dari src/locales
|
|
411
|
+
const messages = (await import("@/locales/" + locale + "/about.json"))
|
|
412
|
+
.default;
|
|
413
|
+
|
|
414
|
+
const languages = Object.fromEntries(
|
|
415
|
+
locales.map((locale) => [locale, localizedPath(locale, "/about")])
|
|
416
|
+
);
|
|
417
|
+
|
|
418
|
+
return {
|
|
419
|
+
title: messages.title,
|
|
420
|
+
description: messages.description,
|
|
421
|
+
alternates: {
|
|
422
|
+
canonical: localizedPath(locale, "/about"),
|
|
423
|
+
languages: { ...languages, "x-default": "/about" },
|
|
424
|
+
},
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
export default async function AboutPage() {
|
|
429
|
+
return <h1>Tentang</h1>;
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
```ts fileName="src/app/sitemap.ts"
|
|
434
|
+
import type { MetadataRoute } from "next";
|
|
435
|
+
import { locales, defaultLocale, abs } from "@/i18n.config";
|
|
436
|
+
|
|
437
|
+
export default function sitemap(): MetadataRoute.Sitemap {
|
|
438
|
+
const languages = Object.fromEntries(
|
|
439
|
+
locales.map((locale) => [locale, abs(locale, "/about")])
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
return [
|
|
443
|
+
{
|
|
444
|
+
url: abs(defaultLocale, "/about"),
|
|
445
|
+
lastModified: new Date(),
|
|
446
|
+
changeFrequency: "monthly",
|
|
447
|
+
priority: 0.7,
|
|
448
|
+
alternates: { languages },
|
|
449
|
+
},
|
|
450
|
+
];
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
```ts fileName="src/app/robots.ts"
|
|
455
|
+
import type { MetadataRoute } from "next";
|
|
456
|
+
import { locales, defaultLocale, localizedPath } from "@/i18n.config";
|
|
457
|
+
|
|
458
|
+
const ORIGIN = "https://example.com";
|
|
459
|
+
|
|
460
|
+
const expandAllLocales = (path: string) => [
|
|
461
|
+
localizedPath(defaultLocale, path),
|
|
462
|
+
...locales
|
|
463
|
+
.filter((locale) => locale !== defaultLocale)
|
|
464
|
+
.map((locale) => localizedPath(locale, path)),
|
|
465
|
+
];
|
|
466
|
+
|
|
467
|
+
export default function robots(): MetadataRoute.Robots {
|
|
468
|
+
const disallow = [
|
|
469
|
+
...expandAllLocales("/dashboard"),
|
|
470
|
+
...expandAllLocales("/admin"),
|
|
471
|
+
];
|
|
472
|
+
|
|
473
|
+
return {
|
|
474
|
+
rules: { userAgent: "*", allow: ["/"], disallow },
|
|
475
|
+
host: ORIGIN,
|
|
476
|
+
sitemap: ORIGIN + "/sitemap.xml",
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
## 9) Middleware untuk routing locale
|
|
484
|
+
|
|
485
|
+
Mendeteksi locale dan mengarahkan ulang ke rute yang dilokalkan jika tidak ada.
|
|
486
|
+
|
|
487
|
+
```ts fileName="src/middleware.ts"
|
|
488
|
+
import { NextResponse, type NextRequest } from "next/server";
|
|
489
|
+
import { defaultLocale, locales } from "@/i18n.config";
|
|
490
|
+
|
|
491
|
+
const PUBLIC_FILE = /\.[^/]+$/; // mengecualikan file dengan ekstensi
|
|
492
|
+
|
|
493
|
+
export function middleware(request: NextRequest) {
|
|
494
|
+
const { pathname } = request.nextUrl;
|
|
495
|
+
|
|
496
|
+
if (
|
|
497
|
+
pathname.startsWith("/_next") ||
|
|
498
|
+
pathname.startsWith("/api") ||
|
|
499
|
+
pathname.startsWith("/static") ||
|
|
500
|
+
PUBLIC_FILE.test(pathname)
|
|
501
|
+
) {
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
const hasLocale = locales.some(
|
|
506
|
+
(locale) =>
|
|
507
|
+
pathname === "/" + locale || pathname.startsWith("/" + locale + "/")
|
|
508
|
+
);
|
|
509
|
+
if (!hasLocale) {
|
|
510
|
+
const locale = defaultLocale;
|
|
511
|
+
const url = request.nextUrl.clone();
|
|
512
|
+
url.pathname = "/" + locale + (pathname === "/" ? "" : pathname);
|
|
513
|
+
return NextResponse.redirect(url);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
export const config = {
|
|
518
|
+
matcher: [
|
|
519
|
+
// Cocokkan semua path kecuali yang diawali dengan ini dan file dengan ekstensi
|
|
520
|
+
"/((?!api|_next|static|.*\\..*).*)",
|
|
521
|
+
],
|
|
522
|
+
};
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
## 10) Praktik terbaik Performa dan DX
|
|
528
|
+
|
|
529
|
+
- **Set html `lang` dan `dir`**: Dilakukan di `src/app/[locale]/layout.tsx`.
|
|
530
|
+
- **Pisahkan pesan berdasarkan namespace**: Jaga bundle tetap kecil (`common.json`, `about.json`, dll.).
|
|
531
|
+
- **Minimalkan payload klien**: Pada halaman, kirim hanya namespace yang diperlukan ke provider.
|
|
532
|
+
- **Utamakan halaman statis**: Gunakan `export const dynamic = 'force-static'` dan `generateStaticParams` per locale.
|
|
533
|
+
- **Sinkronkan komponen server**: Kirim string/format yang sudah dihitung sebelumnya daripada panggilan async saat render.
|
|
534
|
+
- **Memoisasi operasi berat**: Terutama di kode klien untuk versi React yang lebih lama.
|
|
535
|
+
- **Cache dan header**: Utamakan statis atau `revalidate` daripada rendering dinamis jika memungkinkan.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
## 11) Pengujian dan CI
|
|
540
|
+
|
|
541
|
+
- Tambahkan unit test untuk komponen yang menggunakan `t` untuk memastikan kunci ada.
|
|
542
|
+
- Validasi bahwa setiap namespace memiliki kunci yang sama di semua locale.
|
|
543
|
+
- Tampilkan kunci yang hilang selama CI sebelum deploy.
|
|
544
|
+
|
|
545
|
+
Intlayer akan mengotomatisasi banyak hal ini (lihat bagian berikutnya).
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
## 12) Tambahkan Intlayer di atas (otomatisasi)
|
|
550
|
+
|
|
551
|
+
Intlayer membantu Anda menjaga sinkronisasi terjemahan JSON, menguji kunci yang hilang, dan mengisi dengan AI jika diinginkan.
|
|
552
|
+
|
|
553
|
+
Pasang dependensi intlayer:
|
|
554
|
+
|
|
555
|
+
```bash packageManager="npm"
|
|
556
|
+
npm install intlayer @intlayer/sync-json-plugin -D
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
```bash packageManager="pnpm"
|
|
560
|
+
pnpm add intlayer @intlayer/sync-json-plugin -D
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
```bash packageManager="yarn"
|
|
564
|
+
yarn add intlayer @intlayer/sync-json-plugin -D
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
```ts fileName="intlayer.config.ts"
|
|
568
|
+
import { type IntlayerConfig, Locales } from "intlayer";
|
|
569
|
+
import { locales, defaultLocale } from "@/i18n";
|
|
570
|
+
import { syncJSON } from "@intlayer/sync-json";
|
|
571
|
+
|
|
572
|
+
export const locales = [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH];
|
|
573
|
+
|
|
574
|
+
const config: IntlayerConfig = {
|
|
575
|
+
internationalization: {
|
|
576
|
+
locales,
|
|
577
|
+
defaultLocale,
|
|
578
|
+
},
|
|
579
|
+
ai: {
|
|
580
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
581
|
+
},
|
|
582
|
+
plugins: [
|
|
583
|
+
syncJSON({
|
|
584
|
+
source: ({ locale }) => `./locales/${locale}.json`,
|
|
585
|
+
}),
|
|
586
|
+
],
|
|
587
|
+
};
|
|
588
|
+
|
|
589
|
+
export default config;
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
Tambahkan skrip package:
|
|
593
|
+
|
|
594
|
+
```json fileName="package.json"
|
|
595
|
+
{
|
|
596
|
+
"scripts": {
|
|
597
|
+
"i18n:fill": "intlayer fill",
|
|
598
|
+
"i18n:test": "intlayer test"
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
Alur umum:
|
|
604
|
+
|
|
605
|
+
- `pnpm i18n:test` di CI untuk gagal membangun jika ada kunci yang hilang
|
|
606
|
+
- `pnpm i18n:fill` secara lokal untuk mengusulkan terjemahan AI untuk kunci yang baru ditambahkan
|
|
607
|
+
|
|
608
|
+
> Anda dapat memberikan argumen CLI; lihat [dokumentasi Intlayer CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_cli.md).
|
|
609
|
+
|
|
610
|
+
---
|
|
611
|
+
|
|
612
|
+
## 13) Pemecahan Masalah
|
|
613
|
+
|
|
614
|
+
- **Kunci tidak ditemukan**: Pastikan halaman/provider mencantumkan namespace yang benar dan file JSON ada di bawah `src/locales/<locale>/<namespace>.json`.
|
|
615
|
+
- **Bahasa salah/kedipan bahasa Inggris**: Periksa kembali deteksi locale di `middleware.ts` dan provider `lng`.
|
|
616
|
+
- **Masalah tata letak RTL**: Verifikasi bahwa `dir` berasal dari `isRtl(locale)` dan CSS Anda menghormati `[dir="rtl"]`.
|
|
617
|
+
- **Alternatif SEO hilang**: Pastikan `alternates.languages` mencakup semua locale dan `x-default`.
|
|
618
|
+
- **Bundle terlalu besar**: Pisahkan namespace lebih lanjut dan hindari mengimpor seluruh pohon `locales` di sisi klien.
|
|
619
|
+
|
|
620
|
+
---
|
|
621
|
+
|
|
622
|
+
## 14) Apa Selanjutnya
|
|
623
|
+
|
|
624
|
+
- Tambahkan lebih banyak locale dan namespace seiring berkembangnya fitur
|
|
625
|
+
- Lokalisasi halaman error, email, dan konten yang digerakkan oleh API
|
|
626
|
+
- Perluas workflow Intlayer untuk membuka PR secara otomatis guna pembaruan terjemahan
|
|
627
|
+
|
|
628
|
+
Jika Anda lebih suka menggunakan starter, coba template ini: `https://github.com/aymericzip/intlayer-next-i18next-template`.
|