@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
package/docs/id/CI_CD.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-05-20
|
|
3
|
+
updatedAt: 2025-08-13
|
|
4
|
+
title: Integrasi CI/CD
|
|
5
|
+
description: Pelajari cara mengintegrasikan Intlayer ke dalam pipeline CI/CD Anda untuk manajemen konten dan deployment otomatis.
|
|
6
|
+
keywords:
|
|
7
|
+
- CI/CD
|
|
8
|
+
- Integrasi Berkelanjutan
|
|
9
|
+
- Deployment Berkelanjutan
|
|
10
|
+
- Otomatisasi
|
|
11
|
+
- Internasionalisasi
|
|
12
|
+
- Dokumentasi
|
|
13
|
+
- Intlayer
|
|
14
|
+
slugs:
|
|
15
|
+
- doc
|
|
16
|
+
- concept
|
|
17
|
+
- ci-cd
|
|
18
|
+
history:
|
|
19
|
+
- version: 5.5.10
|
|
20
|
+
date: 2025-06-29
|
|
21
|
+
changes: Inisialisasi riwayat
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Menghasilkan Terjemahan Otomatis dalam Pipeline CI/CD
|
|
25
|
+
|
|
26
|
+
Intlayer memungkinkan pembuatan terjemahan secara otomatis untuk file deklarasi konten Anda. Ada beberapa cara untuk mencapainya tergantung pada alur kerja Anda.
|
|
27
|
+
|
|
28
|
+
## Daftar Isi
|
|
29
|
+
|
|
30
|
+
<TOC/>
|
|
31
|
+
|
|
32
|
+
## Menggunakan CMS
|
|
33
|
+
|
|
34
|
+
Dengan Intlayer, Anda dapat mengadopsi alur kerja di mana hanya satu locale yang dideklarasikan secara lokal, sementara semua terjemahan dikelola secara remote melalui CMS. Ini memungkinkan konten dan terjemahan benar-benar terpisah dari codebase, memberikan fleksibilitas lebih bagi editor konten dan memungkinkan Live Sync (tidak perlu membangun ulang aplikasi untuk menerapkan perubahan).
|
|
35
|
+
|
|
36
|
+
### Contoh Konfigurasi
|
|
37
|
+
|
|
38
|
+
```ts fileName="intlayer.config.ts"
|
|
39
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
40
|
+
|
|
41
|
+
const config: IntlayerConfig = {
|
|
42
|
+
internationalization: {
|
|
43
|
+
locales: [Locales.ENGLISH, Locales.SPANISH, Locales.FRENCH],
|
|
44
|
+
requiredLocales: [Locales.ENGLISH], // Locale opsional akan dikelola secara remote
|
|
45
|
+
defaultLocale: Locales.ENGLISH,
|
|
46
|
+
},
|
|
47
|
+
editor: {
|
|
48
|
+
// Kredensial CMS jika Anda menggunakan CMS
|
|
49
|
+
clientId: process.env.INTLAYER_CLIENT_ID,
|
|
50
|
+
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
51
|
+
liveSync: true,
|
|
52
|
+
},
|
|
53
|
+
ai: {
|
|
54
|
+
applicationContext: "Ini adalah aplikasi uji", // Membantu memastikan konsistensi dalam pembuatan terjemahan
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export default config;
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Untuk mempelajari lebih lanjut tentang CMS, lihat [dokumentasi resmi](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_CMS.md).
|
|
62
|
+
|
|
63
|
+
## Menggunakan Husky
|
|
64
|
+
|
|
65
|
+
Anda dapat mengintegrasikan pembuatan terjemahan ke dalam alur kerja Git lokal Anda menggunakan [Husky](https://typicode.github.io/husky/).
|
|
66
|
+
|
|
67
|
+
### Contoh Konfigurasi
|
|
68
|
+
|
|
69
|
+
```ts fileName="intlayer.config.ts"
|
|
70
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
71
|
+
|
|
72
|
+
const config: IntlayerConfig = {
|
|
73
|
+
internationalization: {
|
|
74
|
+
locales: [Locales.ENGLISH, Locales.SPANISH, Locales.FRENCH],
|
|
75
|
+
requiredLocales: [Locales.ENGLISH], // Locale opsional ditangani secara remote
|
|
76
|
+
defaultLocale: Locales.ENGLISH,
|
|
77
|
+
},
|
|
78
|
+
editor: {
|
|
79
|
+
clientId: process.env.INTLAYER_CLIENT_ID,
|
|
80
|
+
clientSecret: process.env.INTLAYER_CLIENT_SECRET,
|
|
81
|
+
},
|
|
82
|
+
ai: {
|
|
83
|
+
provider: "openai",
|
|
84
|
+
apiKey: process.env.OPENAI_API_KEY, // Gunakan API key Anda sendiri
|
|
85
|
+
|
|
86
|
+
applicationContext: "Ini adalah aplikasi uji", // Membantu memastikan konsistensi dalam pembuatan terjemahan
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export default config;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
```bash fileName=".husky/pre-push"
|
|
94
|
+
npx intlayer build # Untuk memastikan kamus sudah diperbarui
|
|
95
|
+
npx intlayer fill --unpushed --mode fill # Hanya mengisi konten yang hilang, tidak memperbarui yang sudah ada
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
> Untuk informasi lebih lanjut tentang perintah Intlayer CLI dan penggunaannya, lihat [dokumentasi CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_cli.md).
|
|
99
|
+
|
|
100
|
+
> Jika Anda memiliki beberapa aplikasi dalam repo Anda yang menggunakan instance intlayer terpisah, Anda dapat menggunakan argumen `--base-dir` seperti ini:
|
|
101
|
+
|
|
102
|
+
```bash fileName=".husky/pre-push"
|
|
103
|
+
# Aplikasi 1
|
|
104
|
+
npx intlayer build --base-dir ./app1
|
|
105
|
+
npx intlayer fill --base-dir ./app1 --unpushed --mode fill
|
|
106
|
+
|
|
107
|
+
# Aplikasi 2
|
|
108
|
+
npx intlayer build --base-dir ./app2
|
|
109
|
+
npx intlayer fill --base-dir ./app2 --unpushed --mode fill
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Menggunakan GitHub Actions
|
|
113
|
+
|
|
114
|
+
Intlayer menyediakan perintah CLI untuk mengisi otomatis dan meninjau konten kamus. Ini dapat diintegrasikan ke dalam alur kerja CI/CD Anda menggunakan GitHub Actions.
|
|
115
|
+
|
|
116
|
+
```yaml fileName=".github/workflows/intlayer-translate.yml"
|
|
117
|
+
name: Intlayer Auto-Fill
|
|
118
|
+
# Kondisi pemicu untuk workflow ini
|
|
119
|
+
on:
|
|
120
|
+
pull_request:
|
|
121
|
+
branches:
|
|
122
|
+
- "main"
|
|
123
|
+
|
|
124
|
+
permissions:
|
|
125
|
+
contents: write
|
|
126
|
+
pull-requests: write
|
|
127
|
+
|
|
128
|
+
concurrency:
|
|
129
|
+
group: "autofill-${{ github.ref }}"
|
|
130
|
+
cancel-in-progress: true
|
|
131
|
+
|
|
132
|
+
jobs:
|
|
133
|
+
autofill:
|
|
134
|
+
runs-on: ubuntu-latest
|
|
135
|
+
env:
|
|
136
|
+
# OpenAI
|
|
137
|
+
AI_MODEL: openai
|
|
138
|
+
AI_PROVIDER: gpt-5-mini
|
|
139
|
+
AI_API_KEY: ${{ secrets.AI_API_KEY }}
|
|
140
|
+
|
|
141
|
+
steps:
|
|
142
|
+
# Langkah 1: Ambil kode terbaru dari repositori
|
|
143
|
+
- name: ⬇️ Checkout repository
|
|
144
|
+
uses: actions/checkout@v4
|
|
145
|
+
with:
|
|
146
|
+
persist-credentials: true # Simpan kredensial untuk membuat PR
|
|
147
|
+
fetch-depth: 0 # Ambil seluruh riwayat git untuk analisis diff
|
|
148
|
+
|
|
149
|
+
# Langkah 2: Siapkan lingkungan Node.js
|
|
150
|
+
- name: 🟢 Set up Node.js
|
|
151
|
+
uses: actions/setup-node@v4
|
|
152
|
+
with:
|
|
153
|
+
node-version: 20 # Gunakan Node.js 20 LTS untuk stabilitas
|
|
154
|
+
|
|
155
|
+
# Langkah 3: Instal dependensi proyek
|
|
156
|
+
- name: 📦 Instal dependensi
|
|
157
|
+
run: npm install
|
|
158
|
+
|
|
159
|
+
# Langkah 4: Instal Intlayer CLI secara global untuk manajemen terjemahan
|
|
160
|
+
- name: 📦 Instal Intlayer
|
|
161
|
+
run: npm install -g intlayer-cli
|
|
162
|
+
|
|
163
|
+
# Langkah 5: Bangun proyek Intlayer untuk menghasilkan file terjemahan
|
|
164
|
+
- name: ⚙️ Bangun proyek Intlayer
|
|
165
|
+
run: npx intlayer build
|
|
166
|
+
|
|
167
|
+
# Langkah 6: Gunakan AI untuk mengisi otomatis terjemahan yang hilang
|
|
168
|
+
- name: 🤖 Isi otomatis terjemahan yang hilang
|
|
169
|
+
run: npx intlayer fill --git-diff --mode fill --provider $AI_PROVIDER --model $AI_MODEL --api-key $AI_API_KEY
|
|
170
|
+
|
|
171
|
+
# Langkah 7: Periksa jika ada perubahan dan commit perubahan tersebut
|
|
172
|
+
- name: � Periksa perubahan
|
|
173
|
+
id: check-changes
|
|
174
|
+
run: |
|
|
175
|
+
if [ -n "$(git status --porcelain)" ]; then
|
|
176
|
+
echo "has-changes=true" >> $GITHUB_OUTPUT
|
|
177
|
+
else
|
|
178
|
+
echo "has-changes=false" >> $GITHUB_OUTPUT
|
|
179
|
+
fi
|
|
180
|
+
|
|
181
|
+
# Langkah 8: Commit dan push perubahan jika ada
|
|
182
|
+
- name: 📤 Commit dan push perubahan
|
|
183
|
+
if: steps.check-changes.outputs.has-changes == 'true'
|
|
184
|
+
run: |
|
|
185
|
+
git config --local user.email "action@github.com"
|
|
186
|
+
git config --local user.name "GitHub Action"
|
|
187
|
+
git add .
|
|
188
|
+
git commit -m "chore: auto-fill missing translations [skip ci]"
|
|
189
|
+
git push origin HEAD:${{ github.head_ref }}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Untuk mengatur variabel lingkungan, buka GitHub → Settings → Secrets and variables → Actions dan tambahkan secret tersebut.
|
|
193
|
+
|
|
194
|
+
> Sama seperti untuk Husky, dalam kasus monorepo, Anda dapat menggunakan argumen `--base-dir` untuk memproses setiap aplikasi secara berurutan.
|
|
195
|
+
|
|
196
|
+
> Secara default, argumen `--git-diff` memfilter kamus yang mencakup perubahan dari basis (default `origin/main`) ke cabang saat ini (default: `HEAD`).
|
|
197
|
+
|
|
198
|
+
> Untuk informasi lebih lanjut tentang perintah Intlayer CLI dan penggunaannya, lihat [dokumentasi CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/intlayer_cli.md).
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-03-13
|
|
3
|
+
updatedAt: 2025-09-20
|
|
4
|
+
title: Isi Otomatis
|
|
5
|
+
description: Pelajari cara menggunakan fungsi isi otomatis di Intlayer untuk mengisi konten secara otomatis berdasarkan pola yang telah ditentukan. Ikuti dokumentasi ini untuk mengimplementasikan fitur isi otomatis secara efisien dalam proyek Anda.
|
|
6
|
+
keywords:
|
|
7
|
+
- Isi Otomatis
|
|
8
|
+
- Otomatisasi Konten
|
|
9
|
+
- Konten Dinamis
|
|
10
|
+
- Intlayer
|
|
11
|
+
- Next.js
|
|
12
|
+
- JavaScript
|
|
13
|
+
- React
|
|
14
|
+
slugs:
|
|
15
|
+
- doc
|
|
16
|
+
- concept
|
|
17
|
+
- auto-fill
|
|
18
|
+
history:
|
|
19
|
+
- version: 7.0.0
|
|
20
|
+
date: 2025-10-23
|
|
21
|
+
changes: Mengganti nama `autoFill` menjadi `fill` dan memperbarui perilaku
|
|
22
|
+
- version: 6.0.0
|
|
23
|
+
date: 2025-09-20
|
|
24
|
+
changes: Menambahkan konfigurasi global
|
|
25
|
+
- version: 6.0.0
|
|
26
|
+
date: 2025-09-17
|
|
27
|
+
changes: Menambahkan variabel `{{fileName}}`
|
|
28
|
+
- version: 5.5.10
|
|
29
|
+
date: 2025-06-29
|
|
30
|
+
changes: Inisialisasi riwayat
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
# Terjemahan File Deklarasi Isi Konten
|
|
34
|
+
|
|
35
|
+
**File deklarasi isi otomatis** dalam CI Anda adalah cara untuk mempercepat alur kerja pengembangan Anda.
|
|
36
|
+
|
|
37
|
+
## Perilaku Default
|
|
38
|
+
|
|
39
|
+
Secara default, `fill` diatur ke `true` secara global, yang berarti Intlayer akan secara otomatis mengisi semua file konten dan mengedit file itu sendiri. Perilaku ini dapat disesuaikan dengan beberapa cara:
|
|
40
|
+
|
|
41
|
+
### Opsi Konfigurasi Global
|
|
42
|
+
|
|
43
|
+
1. **`fill: true` (default)** - Secara otomatis mengisi semua locale dan mengedit file saat ini
|
|
44
|
+
2. **`fill: false`** - Menonaktifkan isi otomatis untuk file konten ini
|
|
45
|
+
3. **`fill: "path/to/file"`** - Membuat/memperbarui file yang ditentukan tanpa mengedit file saat ini
|
|
46
|
+
4. **`fill: { [key in Locales]?: string }`** - Membuat/memperbarui file yang ditentukan untuk setiap locale
|
|
47
|
+
|
|
48
|
+
### Perubahan Perilaku di v7
|
|
49
|
+
|
|
50
|
+
Pada v7, perilaku perintah `fill` telah diperbarui:
|
|
51
|
+
|
|
52
|
+
- **`fill: true`** - Menulis ulang file saat ini dengan konten yang diisi untuk semua locale
|
|
53
|
+
- **`fill: "path/to/file"`** - Mengisi file yang ditentukan tanpa memodifikasi file saat ini
|
|
54
|
+
- **`fill: false`** - Menonaktifkan isi otomatis sepenuhnya
|
|
55
|
+
|
|
56
|
+
Saat menggunakan opsi path untuk menulis ke file lain, mekanisme isi bekerja melalui hubungan _master-slave_ antara file deklarasi konten. File utama (master) berfungsi sebagai sumber kebenaran, dan ketika diperbarui, Intlayer akan secara otomatis menerapkan perubahan tersebut ke file deklarasi turunan (yang diisi) yang ditentukan oleh path.
|
|
57
|
+
|
|
58
|
+
### Kustomisasi Per-Locale
|
|
59
|
+
|
|
60
|
+
Anda juga dapat menyesuaikan perilaku untuk setiap locale dengan menggunakan sebuah objek:
|
|
61
|
+
|
|
62
|
+
```ts fileName="intlayer.config.ts"
|
|
63
|
+
const config: IntlayerConfig = {
|
|
64
|
+
content: {
|
|
65
|
+
internationalization: {
|
|
66
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.POLISH],
|
|
67
|
+
defaultLocale: Locales.ENGLISH,
|
|
68
|
+
requiredLocales: [Locales.ENGLISH], // Disarankan untuk menghindari Property 'pl' hilang dalam tipe '{ en: string; xxx } pada fungsi t Anda jika
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
dictionary: {
|
|
72
|
+
fill: {
|
|
73
|
+
en: true, // Isi dan edit file saat ini untuk bahasa Inggris
|
|
74
|
+
fr: "./translations/fr.json", // Buat file terpisah untuk bahasa Prancis
|
|
75
|
+
es: false, // Nonaktifkan isi untuk bahasa Spanyol
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Ini memungkinkan Anda memiliki perilaku isi yang berbeda untuk berbagai locale dalam proyek yang sama.
|
|
82
|
+
|
|
83
|
+
```ts fileName="src/components/example/example.content.ts"
|
|
84
|
+
import { Locales, type Dictionary } from "intlayer";
|
|
85
|
+
|
|
86
|
+
const exampleContent = {
|
|
87
|
+
key: "example",
|
|
88
|
+
locale: Locales.ENGLISH,
|
|
89
|
+
fill: "./example.content.json",
|
|
90
|
+
content: {
|
|
91
|
+
contentExample: "Ini adalah contoh konten",
|
|
92
|
+
},
|
|
93
|
+
} satisfies Dictionary;
|
|
94
|
+
|
|
95
|
+
export default exampleContent;
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Berikut adalah [file deklarasi konten per-locale](https://github.com/aymericzip/intlayer/blob/main/docs/docs/id/per_locale_file.md) yang menggunakan instruksi `fill`.
|
|
99
|
+
|
|
100
|
+
Kemudian, ketika Anda menjalankan perintah berikut:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
npx intlayer fill --file 'src/components/example/example.content.ts'
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Intlayer akan secara otomatis menghasilkan file deklarasi turunan di `src/components/example/example.content.json`, mengisi semua locale yang belum dideklarasikan di file utama.
|
|
107
|
+
|
|
108
|
+
```json5 fileName="src/components/example/example.content.json"
|
|
109
|
+
{
|
|
110
|
+
"key": "example",
|
|
111
|
+
"content": {
|
|
112
|
+
"contentExample": {
|
|
113
|
+
"nodeType": "translation",
|
|
114
|
+
"translation": {
|
|
115
|
+
"fr": "Ceci est un exemple de contenu",
|
|
116
|
+
"es": "Este es un ejemplo de contenido",
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Setelah itu, kedua file deklarasi akan digabungkan menjadi satu kamus, yang dapat diakses menggunakan hook standar `useIntlayer("example")` (react) / composable (vue).
|
|
124
|
+
|
|
125
|
+
## Konfigurasi Global
|
|
126
|
+
|
|
127
|
+
Anda dapat mengonfigurasi konfigurasi auto fill global di file `intlayer.config.ts`.
|
|
128
|
+
|
|
129
|
+
```ts fileName="intlayer.config.ts"
|
|
130
|
+
import { type IntlayerConfig, Locales } from "intlayer";
|
|
131
|
+
|
|
132
|
+
const config: IntlayerConfig = {
|
|
133
|
+
internationalization: {
|
|
134
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
135
|
+
defaultLocale: Locales.ENGLISH,
|
|
136
|
+
requiredLocales: [Locales.ENGLISH, Locales.FRENCH],
|
|
137
|
+
},
|
|
138
|
+
dictionary: {
|
|
139
|
+
// Menghasilkan terjemahan yang hilang secara otomatis untuk semua kamus
|
|
140
|
+
fill: "./{{fileName}}Filled.content.ts",
|
|
141
|
+
//
|
|
142
|
+
// fill: "/messages/{{locale}}/{{key}}/{{fileName}}.content.json",
|
|
143
|
+
//
|
|
144
|
+
// fill: true, // menghasilkan terjemahan yang hilang secara otomatis untuk semua kamus seperti menggunakan "./{{fileName}}.content.json"
|
|
145
|
+
//
|
|
146
|
+
// fill: {
|
|
147
|
+
// en: "./{{fileName}}.en.content.json",
|
|
148
|
+
// fr: "./{{fileName}}.fr.content.json",
|
|
149
|
+
// es: "./{{fileName}}.es.content.json",
|
|
150
|
+
// },
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
export default config;
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Anda masih dapat menyempurnakan per kamus menggunakan field `fill` di file konten. Intlayer akan terlebih dahulu mempertimbangkan konfigurasi per kamus kemudian menggunakan konfigurasi global sebagai cadangan.
|
|
158
|
+
|
|
159
|
+
## Format File Autofilled
|
|
160
|
+
|
|
161
|
+
Format yang direkomendasikan untuk file deklarasi yang diisi otomatis adalah **JSON**, yang membantu menghindari kendala format. Namun, Intlayer juga mendukung format `.ts`, `.js`, `.mjs`, `.cjs`, dan format lainnya.
|
|
162
|
+
|
|
163
|
+
```ts fileName="src/components/example/example.content.ts"
|
|
164
|
+
const exampleContent = {
|
|
165
|
+
key: "example",
|
|
166
|
+
fill: "./example.filled.content.ts",
|
|
167
|
+
content: {
|
|
168
|
+
// Konten Anda
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Ini akan menghasilkan file di:
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
src/components/example/example.filled.content.ts
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
> Proses pembuatan file `.js`, `.ts`, dan file serupa bekerja sebagai berikut:
|
|
180
|
+
>
|
|
181
|
+
> - Jika file sudah ada, Intlayer akan memparsenya menggunakan AST (Abstract Syntax Tree) untuk menemukan setiap field dan menyisipkan terjemahan yang hilang.
|
|
182
|
+
> - Jika file tidak ada, Intlayer akan membuatnya menggunakan template file deklarasi konten default.
|
|
183
|
+
|
|
184
|
+
## Path Absolut
|
|
185
|
+
|
|
186
|
+
Field `fill` juga mendukung path absolut.
|
|
187
|
+
|
|
188
|
+
```ts fileName="src/components/example/example.content.ts"
|
|
189
|
+
const exampleContent = {
|
|
190
|
+
key: "example",
|
|
191
|
+
fill: "/messages/example.content.json",
|
|
192
|
+
content: {
|
|
193
|
+
// Konten Anda
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Ini akan menghasilkan file di:
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
/messages/example.content.json
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Autogenerate File Deklarasi Konten Per-Locale
|
|
205
|
+
|
|
206
|
+
Field `fill` juga mendukung pembuatan file deklarasi konten **per-locale**.
|
|
207
|
+
|
|
208
|
+
```ts fileName="src/components/example/example.content.ts"
|
|
209
|
+
const exampleContent = {
|
|
210
|
+
key: "example",
|
|
211
|
+
fill: {
|
|
212
|
+
fr: "./example.fr.content.json",
|
|
213
|
+
es: "./example.es.content.json",
|
|
214
|
+
},
|
|
215
|
+
content: {
|
|
216
|
+
// Konten Anda
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Ini akan menghasilkan dua file terpisah:
|
|
222
|
+
|
|
223
|
+
- `src/components/example/example.fr.content.json`
|
|
224
|
+
- `src/components/example/example.es.content.json`
|
|
225
|
+
|
|
226
|
+
> Dalam kasus ini, jika objek tidak berisi semua locale, Intlayer akan melewati pembuatan locale yang tersisa.
|
|
227
|
+
|
|
228
|
+
## Filter Autofill Locale Tertentu
|
|
229
|
+
|
|
230
|
+
Menggunakan objek untuk field `fill` memungkinkan Anda menerapkan filter dan hanya menghasilkan file locale tertentu.
|
|
231
|
+
|
|
232
|
+
```ts fileName="src/components/example/example.content.ts"
|
|
233
|
+
const exampleContent = {
|
|
234
|
+
key: "example",
|
|
235
|
+
fill: {
|
|
236
|
+
fr: "./example.fr.content.json",
|
|
237
|
+
},
|
|
238
|
+
content: {
|
|
239
|
+
// Konten Anda
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Ini hanya akan menghasilkan file terjemahan bahasa Prancis.
|
|
245
|
+
|
|
246
|
+
## Variabel Path
|
|
247
|
+
|
|
248
|
+
Anda dapat menggunakan variabel di dalam path `fill` untuk secara dinamis menentukan jalur target untuk file yang dihasilkan.
|
|
249
|
+
|
|
250
|
+
**Variabel yang tersedia:**
|
|
251
|
+
|
|
252
|
+
- `{{locale}}` – Kode locale (misalnya `fr`, `es`)
|
|
253
|
+
- `{{fileName}}` – Nama file (misalnya `index`)
|
|
254
|
+
- `{{key}}` – Kunci kamus (misalnya `example`)
|
|
255
|
+
|
|
256
|
+
```ts fileName="src/components/example/index.content.ts"
|
|
257
|
+
const exampleContent = {
|
|
258
|
+
key: "example",
|
|
259
|
+
fill: "/messages/{{locale}}/{{key}}.content.json",
|
|
260
|
+
content: {
|
|
261
|
+
// Konten Anda
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Ini akan menghasilkan:
|
|
267
|
+
|
|
268
|
+
- `/messages/fr/example.content.json`
|
|
269
|
+
- `/messages/es/example.content.json`
|
|
270
|
+
|
|
271
|
+
```ts fileName="src/components/example/index.content.ts"
|
|
272
|
+
const exampleContent = {
|
|
273
|
+
key: "example",
|
|
274
|
+
fill: "./{{fileName}}.content.json",
|
|
275
|
+
content: {
|
|
276
|
+
// Konten Anda
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Ini akan menghasilkan:
|
|
282
|
+
|
|
283
|
+
- `./index.content.json`
|
|
284
|
+
- `./index.content.json`
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-03-07
|
|
3
|
+
updatedAt: 2025-09-30
|
|
4
|
+
title: Membuat komponen multibahasa (perpustakaan i18n) di React dan Next.js
|
|
5
|
+
description: Pelajari cara mendeklarasikan dan mengambil konten yang dilokalkan untuk membangun komponen React atau Next.js multibahasa dengan Intlayer.
|
|
6
|
+
keywords:
|
|
7
|
+
- i18n
|
|
8
|
+
- komponen
|
|
9
|
+
- react
|
|
10
|
+
- multibahasa
|
|
11
|
+
- next.js
|
|
12
|
+
- intlayer
|
|
13
|
+
slugs:
|
|
14
|
+
- doc
|
|
15
|
+
- component
|
|
16
|
+
- i18n
|
|
17
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-vite-react-template
|
|
18
|
+
youtubeVideo: https://www.youtube.com/watch?v=dS9L7uJeak4
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Cara membuat komponen multibahasa (i18n) dengan Intlayer
|
|
22
|
+
|
|
23
|
+
Panduan ini menunjukkan langkah minimal untuk membuat komponen UI multibahasa dalam dua pengaturan umum:
|
|
24
|
+
|
|
25
|
+
- React (Vite/SPA)
|
|
26
|
+
- Next.js (App Router)
|
|
27
|
+
|
|
28
|
+
Anda akan terlebih dahulu mendeklarasikan konten Anda, kemudian mengambilnya di dalam komponen Anda.
|
|
29
|
+
|
|
30
|
+
## 1) Deklarasikan konten Anda (dibagikan untuk React dan Next.js)
|
|
31
|
+
|
|
32
|
+
Buat file deklarasi konten di dekat komponen Anda. Ini menjaga terjemahan tetap dekat dengan tempat mereka digunakan dan memungkinkan keamanan tipe.
|
|
33
|
+
|
|
34
|
+
```ts fileName="component.content.ts"
|
|
35
|
+
import { t, type Dictionary } from "intlayer";
|
|
36
|
+
|
|
37
|
+
const componentContent = {
|
|
38
|
+
key: "component-example",
|
|
39
|
+
content: {
|
|
40
|
+
title: t({
|
|
41
|
+
en: "Hello",
|
|
42
|
+
fr: "Bonjour",
|
|
43
|
+
es: "Hola",
|
|
44
|
+
}),
|
|
45
|
+
description: t({
|
|
46
|
+
en: "A multilingual React component",
|
|
47
|
+
fr: "Un composant React multilingue",
|
|
48
|
+
es: "Un componente React multilingüe",
|
|
49
|
+
}),
|
|
50
|
+
},
|
|
51
|
+
} satisfies Dictionary;
|
|
52
|
+
|
|
53
|
+
export default componentContent;
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
JSON juga didukung jika Anda lebih suka menggunakan file konfigurasi.
|
|
57
|
+
|
|
58
|
+
```json fileName="component.content.json"
|
|
59
|
+
{
|
|
60
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
61
|
+
"key": "component-example",
|
|
62
|
+
"content": {
|
|
63
|
+
"title": {
|
|
64
|
+
"nodeType": "translation",
|
|
65
|
+
"translation": { "en": "Hello", "fr": "Bonjour", "es": "Hola" }
|
|
66
|
+
},
|
|
67
|
+
"description": {
|
|
68
|
+
"nodeType": "translation",
|
|
69
|
+
"translation": {
|
|
70
|
+
"en": "A multilingual React component",
|
|
71
|
+
"fr": "Un composant React multilingue",
|
|
72
|
+
"es": "Un componente React multilingüe"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 2) Ambil konten Anda
|
|
80
|
+
|
|
81
|
+
### Kasus A — Aplikasi React (Vite/SPA)
|
|
82
|
+
|
|
83
|
+
Pendekatan default: gunakan `useIntlayer` untuk mengambil berdasarkan key. Ini menjaga komponen tetap ramping dan bertipe.
|
|
84
|
+
|
|
85
|
+
```tsx fileName="ComponentExample.tsx"
|
|
86
|
+
import { useIntlayer } from "react-intlayer";
|
|
87
|
+
|
|
88
|
+
export function ComponentExample() {
|
|
89
|
+
const content = useIntlayer("component-example");
|
|
90
|
+
return (
|
|
91
|
+
<div>
|
|
92
|
+
<h1>{content.title}</h1>
|
|
93
|
+
<p>{content.description}</p>
|
|
94
|
+
</div>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Rendering sisi server atau di luar provider: gunakan `react-intlayer/server` dan berikan `locale` secara eksplisit saat diperlukan.
|
|
100
|
+
|
|
101
|
+
```tsx fileName="ServerRenderedExample.tsx"
|
|
102
|
+
import { useIntlayer } from "react-intlayer/server";
|
|
103
|
+
|
|
104
|
+
export function ServerRenderedExample({ locale }: { locale: string }) {
|
|
105
|
+
const content = useIntlayer("component-example", locale);
|
|
106
|
+
return (
|
|
107
|
+
<>
|
|
108
|
+
<h1>{content.title}</h1>
|
|
109
|
+
<p>{content.description}</p>
|
|
110
|
+
</>
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Alternatif: `useDictionary` dapat membaca seluruh objek yang dideklarasikan jika Anda lebih suka menempatkan struktur di lokasi pemanggilan.
|
|
116
|
+
|
|
117
|
+
```tsx fileName="ComponentWithDictionary.tsx"
|
|
118
|
+
import { useDictionary } from "react-intlayer";
|
|
119
|
+
import componentContent from "./component.content";
|
|
120
|
+
|
|
121
|
+
export function ComponentWithDictionary() {
|
|
122
|
+
const { title, description } = useDictionary(componentContent);
|
|
123
|
+
return (
|
|
124
|
+
<div>
|
|
125
|
+
<h1>{title}</h1>
|
|
126
|
+
<p>{description}</p>
|
|
127
|
+
</div>
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Kasus B — Next.js (App Router)
|
|
133
|
+
|
|
134
|
+
Utamakan komponen server untuk keamanan data dan performa. Gunakan `useIntlayer` dari `next-intlayer/server` di file server, dan `useIntlayer` dari `next-intlayer` di komponen klien.
|
|
135
|
+
|
|
136
|
+
```tsx fileName="app/[locale]/example/ServerComponent.tsx"
|
|
137
|
+
import { useIntlayer } from "next-intlayer/server";
|
|
138
|
+
|
|
139
|
+
export default function ServerComponent() {
|
|
140
|
+
const content = useIntlayer("component-example");
|
|
141
|
+
return (
|
|
142
|
+
<>
|
|
143
|
+
<h1>{content.title}</h1>
|
|
144
|
+
<p>{content.description}</p>
|
|
145
|
+
</>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
```tsx fileName="app/[locale]/example/ClientComponent.tsx"
|
|
151
|
+
"use client";
|
|
152
|
+
|
|
153
|
+
import { useIntlayer } from "next-intlayer";
|
|
154
|
+
|
|
155
|
+
export function ClientComponent() {
|
|
156
|
+
const content = useIntlayer("component-example");
|
|
157
|
+
return (
|
|
158
|
+
<div>
|
|
159
|
+
<h1>{content.title}</h1>
|
|
160
|
+
<p>{content.description}</p>
|
|
161
|
+
</div>
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Tip: Untuk metadata halaman dan SEO, Anda juga dapat mengambil konten menggunakan `getIntlayer` dan menghasilkan URL multibahasa melalui `getMultilingualUrls`.
|
|
167
|
+
|
|
168
|
+
## Mengapa pendekatan komponen Intlayer adalah yang terbaik
|
|
169
|
+
|
|
170
|
+
- **Kolokasi**: Deklarasi konten berada dekat dengan komponen, mengurangi pergeseran dan meningkatkan penggunaan ulang di seluruh sistem desain.
|
|
171
|
+
- **Keamanan tipe**: Kunci dan struktur memiliki tipe yang kuat; terjemahan yang hilang muncul saat build-time, bukan saat runtime.
|
|
172
|
+
- **Server-first**: Bekerja secara native di komponen server untuk keamanan dan performa yang lebih baik; hooks klien tetap ergonomis.
|
|
173
|
+
- **Tree-shaking**: Hanya konten yang digunakan oleh komponen yang dibundel, menjaga ukuran payload tetap kecil pada aplikasi besar.
|
|
174
|
+
- **DX & tooling**: Middleware bawaan, helper SEO, dan terjemahan Visual Editor/AI opsional mempermudah pekerjaan sehari-hari.
|
|
175
|
+
|
|
176
|
+
Lihat perbandingan dan pola dalam rangkuman yang berfokus pada Next.js: https://intlayer.org/blog/next-i18next-vs-next-intl-vs-intlayer
|
|
177
|
+
|
|
178
|
+
## Panduan dan referensi terkait
|
|
179
|
+
|
|
180
|
+
- Setup React (Vite): https://intlayer.org/doc/environment/vite-and-react
|
|
181
|
+
- React Router v7: https://intlayer.org/doc/environment/vite-and-react/react-router-v7
|
|
182
|
+
- Mulai TanStack: https://intlayer.org/doc/environment/vite-and-react/tanstack-start
|
|
183
|
+
- Setup Next.js: https://intlayer.org/doc/environment/nextjs
|
|
184
|
+
- Mengapa Intlayer dibandingkan dengan next-intl dan next-i18next - https://intlayer.org/blog/next-i18next-vs-next-intl-vs-intlayer
|
|
185
|
+
|
|
186
|
+
Halaman-halaman ini mencakup setup menyeluruh, penyedia, routing, dan helper SEO.
|