@intlayer/docs 7.0.7 → 7.0.8-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/i18n_using_next-i18next.md +1068 -0
- package/blog/ar/i18n_using_next-intl.md +768 -0
- package/blog/ar/intlayer_with_react-intl.md +0 -4
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +5 -4
- package/blog/de/i18n_using_next-i18next.md +1107 -0
- package/blog/de/i18n_using_next-intl.md +760 -0
- package/blog/de/intlayer_with_react-intl.md +0 -4
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/en/i18n_using_next-i18next.md +1073 -0
- package/blog/en/i18n_using_next-intl.md +757 -0
- package/blog/en/intlayer_with_i18next.md +71 -8
- package/blog/en/intlayer_with_next-i18next.md +71 -8
- package/blog/en/intlayer_with_next-intl.md +71 -8
- package/blog/en/intlayer_with_react-i18next.md +69 -8
- package/blog/en/intlayer_with_react-intl.md +68 -9
- package/blog/en/intlayer_with_vue-i18n.md +68 -7
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/en/vue-i18n_vs_intlayer.md +2 -0
- package/blog/en-GB/i18n_using_next-i18next.md +1074 -0
- package/blog/en-GB/i18n_using_next-intl.md +757 -0
- package/blog/en-GB/intlayer_with_i18next.md +15 -6
- package/blog/en-GB/intlayer_with_next-i18next.md +16 -6
- package/blog/en-GB/intlayer_with_next-intl.md +16 -6
- package/blog/en-GB/intlayer_with_react-i18next.md +16 -7
- package/blog/en-GB/intlayer_with_react-intl.md +14 -9
- package/blog/en-GB/intlayer_with_vue-i18n.md +16 -7
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/en-GB/vue-i18n_vs_intlayer.md +2 -0
- package/blog/es/i18n_using_next-i18next.md +1066 -0
- package/blog/es/i18n_using_next-intl.md +757 -0
- package/blog/es/intlayer_with_react-intl.md +0 -4
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/fr/i18n_using_next-i18next.md +1078 -0
- package/blog/fr/i18n_using_next-intl.md +759 -0
- package/blog/fr/intlayer_with_react-intl.md +0 -4
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/hi/i18n_using_next-i18next.md +1068 -0
- package/blog/hi/i18n_using_next-intl.md +758 -0
- package/blog/hi/intlayer_with_react-intl.md +0 -4
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/id/i18n_using_next-i18next.md +1078 -0
- package/blog/id/i18n_using_next-intl.md +757 -0
- package/blog/id/index.md +69 -0
- package/blog/id/internationalization_and_SEO.md +364 -0
- package/blog/id/intlayer_with_react-intl.md +0 -4
- package/blog/id/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/id/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/id/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/id/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/id/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/id/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/id/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/id/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/id/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +1500 -0
- package/blog/id/nextjs-multilingual-seo-comparison.md +361 -0
- package/blog/id/rag_powered_documentation_assistant.md +288 -0
- package/blog/id/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/id/vue-i18n_vs_intlayer.md +278 -0
- package/blog/id/what_is_internationalization.md +166 -0
- package/blog/it/i18n_using_next-i18next.md +1078 -0
- package/blog/it/i18n_using_next-intl.md +758 -0
- package/blog/it/intlayer_with_react-intl.md +0 -4
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +4 -0
- package/blog/it/vue-i18n_vs_intlayer.md +2 -0
- package/blog/ja/i18n_using_next-i18next.md +1078 -0
- package/blog/ja/i18n_using_next-intl.md +758 -0
- package/blog/ja/intlayer_with_react-intl.md +0 -4
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/ko/i18n_using_next-i18next.md +1075 -0
- package/blog/ko/i18n_using_next-intl.md +759 -0
- package/blog/ko/intlayer_with_react-intl.md +0 -4
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/pl/i18n_using_next-i18next.md +1078 -0
- package/blog/pl/i18n_using_next-intl.md +758 -0
- package/blog/pl/index.md +69 -0
- package/blog/pl/internationalization_and_SEO.md +363 -0
- package/blog/pl/intlayer_with_react-intl.md +0 -4
- package/blog/pl/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/pl/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/pl/list_i18n_technologies/CMS/wordpress.md +196 -0
- package/blog/pl/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/pl/list_i18n_technologies/frameworks/flutter.md +151 -0
- package/blog/pl/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/pl/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/pl/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/pl/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +1501 -0
- package/blog/pl/nextjs-multilingual-seo-comparison.md +362 -0
- package/blog/pl/rag_powered_documentation_assistant.md +288 -0
- package/blog/pl/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/pl/vue-i18n_vs_intlayer.md +278 -0
- package/blog/pl/what_is_internationalization.md +167 -0
- package/blog/pt/i18n_using_next-i18next.md +1067 -0
- package/blog/pt/i18n_using_next-intl.md +760 -0
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/ru/i18n_using_next-i18next.md +1106 -0
- package/blog/ru/i18n_using_next-intl.md +759 -0
- package/blog/ru/intlayer_with_react-intl.md +0 -4
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/tr/i18n_using_next-i18next.md +1078 -0
- package/blog/tr/i18n_using_next-intl.md +760 -0
- package/blog/tr/intlayer_with_react-intl.md +0 -4
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +2 -0
- package/blog/vi/i18n_using_next-i18next.md +1080 -0
- package/blog/vi/i18n_using_next-intl.md +758 -0
- package/blog/vi/index.md +69 -0
- package/blog/vi/internationalization_and_SEO.md +363 -0
- package/blog/vi/intlayer_with_react-intl.md +0 -4
- package/blog/vi/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/vi/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/vi/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/vi/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/vi/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/vi/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/vi/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/vi/list_i18n_technologies/frameworks/svelte.md +131 -0
- package/blog/vi/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +1520 -0
- package/blog/vi/nextjs-multilingual-seo-comparison.md +362 -0
- package/blog/vi/rag_powered_documentation_assistant.md +288 -0
- package/blog/vi/react-i18next_vs_react-intl_vs_intlayer.md +164 -0
- package/blog/vi/vue-i18n_vs_intlayer.md +278 -0
- package/blog/vi/what_is_internationalization.md +168 -0
- package/blog/zh/i18n_using_next-i18next.md +1105 -0
- package/blog/zh/i18n_using_next-intl.md +758 -0
- package/blog/zh/intlayer_with_react-intl.md +0 -4
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +2 -0
- package/dist/cjs/common.cjs +0 -4
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +38 -6
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +0 -6
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +0 -6
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +0 -6
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +38 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +2 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/docs/ar/component_i18n.md +1 -1
- package/docs/ar/configuration.md +6 -0
- package/docs/ar/intlayer_cli.md +8 -3
- package/docs/ar/intlayer_with_next-i18next.md +619 -0
- package/docs/ar/intlayer_with_next-intl.md +446 -0
- package/docs/ar/intlayer_with_nextjs_16.md +21 -0
- package/docs/ar/intlayer_with_tanstack.md +4 -0
- package/docs/ar/intlayer_with_vite+react.md +4 -0
- package/docs/de/component_i18n.md +1 -1
- package/docs/de/configuration.md +6 -0
- package/docs/de/intlayer_cli.md +8 -3
- package/docs/de/intlayer_with_next-i18next.md +627 -0
- package/docs/de/intlayer_with_next-intl.md +451 -0
- package/docs/de/intlayer_with_nextjs_16.md +21 -0
- package/docs/de/intlayer_with_tanstack.md +4 -0
- package/docs/de/intlayer_with_vite+react.md +4 -0
- package/docs/en/component_i18n.md +1 -1
- package/docs/en/intlayer_cli.md +8 -1
- package/docs/en/intlayer_with_astro.md +10 -2
- package/docs/en/intlayer_with_create_react_app.md +8 -0
- package/docs/en/intlayer_with_lynx+react.md +8 -0
- package/docs/en/intlayer_with_nestjs.md +10 -0
- package/docs/en/intlayer_with_nextjs_14.md +10 -2
- package/docs/en/intlayer_with_nextjs_15.md +21 -4
- package/docs/en/intlayer_with_nextjs_16.md +17 -0
- package/docs/en/intlayer_with_nuxt.md +8 -0
- package/docs/en/intlayer_with_react_native+expo.md +10 -2
- package/docs/en/intlayer_with_react_router_v7.md +8 -0
- package/docs/en/intlayer_with_tanstack.md +10 -0
- package/docs/en/intlayer_with_vite+preact.md +10 -2
- package/docs/en/intlayer_with_vite+react.md +21 -4
- package/docs/en/intlayer_with_vite+vue.md +10 -2
- package/docs/en-GB/component_i18n.md +1 -1
- package/docs/en-GB/configuration.md +6 -0
- package/docs/en-GB/intlayer_cli.md +8 -3
- package/docs/en-GB/intlayer_with_angular.md +4 -4
- package/docs/en-GB/intlayer_with_express.md +4 -4
- package/docs/en-GB/intlayer_with_lynx+react.md +12 -12
- package/{blog/en/_intlayer_with_next-i18next.md → docs/en-GB/intlayer_with_next-i18next.md} +241 -42
- package/{blog/en/_intlayer_with_next-intl.md → docs/en-GB/intlayer_with_next-intl.md} +144 -29
- package/docs/en-GB/intlayer_with_nextjs_16.md +21 -0
- package/docs/en-GB/intlayer_with_tanstack.md +5 -1
- package/docs/en-GB/intlayer_with_vite+react.md +4 -0
- package/docs/en-GB/packages/next-intlayer/t.md +2 -2
- package/docs/es/component_i18n.md +1 -1
- package/docs/es/configuration.md +6 -0
- package/docs/es/intlayer_cli.md +8 -3
- package/docs/es/intlayer_with_next-i18next.md +628 -0
- package/docs/es/intlayer_with_next-intl.md +446 -0
- package/docs/es/intlayer_with_nextjs_16.md +21 -0
- package/docs/es/intlayer_with_tanstack.md +4 -0
- package/docs/es/intlayer_with_vite+react.md +4 -0
- package/docs/fr/configuration.md +6 -0
- package/docs/fr/intlayer_cli.md +8 -3
- package/docs/fr/intlayer_with_next-i18next.md +628 -0
- package/docs/fr/intlayer_with_next-intl.md +446 -0
- package/docs/fr/intlayer_with_nextjs_16.md +23 -2
- package/docs/fr/intlayer_with_tanstack.md +4 -0
- package/docs/fr/intlayer_with_vite+react.md +4 -0
- package/docs/hi/component_i18n.md +1 -1
- package/docs/hi/configuration.md +6 -0
- package/docs/hi/intlayer_cli.md +8 -0
- package/docs/hi/intlayer_with_next-i18next.md +628 -0
- package/docs/hi/intlayer_with_next-intl.md +446 -0
- package/docs/hi/intlayer_with_nextjs_16.md +21 -0
- package/docs/hi/intlayer_with_tanstack.md +4 -0
- package/docs/hi/intlayer_with_vite+react.md +4 -0
- package/docs/id/CI_CD.md +198 -0
- package/docs/id/autoFill.md +284 -0
- package/docs/id/component_i18n.md +186 -0
- package/docs/id/configuration.md +710 -0
- package/docs/id/dictionary/condition.md +231 -0
- package/docs/id/dictionary/content_file.md +1092 -0
- package/docs/id/dictionary/enumeration.md +245 -0
- package/docs/id/dictionary/file.md +237 -0
- package/docs/id/dictionary/function_fetching.md +214 -0
- package/docs/id/dictionary/gender.md +273 -0
- package/docs/id/dictionary/insertion.md +192 -0
- package/docs/id/dictionary/markdown.md +381 -0
- package/docs/id/dictionary/nesting.md +273 -0
- package/docs/id/dictionary/translation.md +310 -0
- package/docs/id/formatters.md +596 -0
- package/docs/id/how_works_intlayer.md +256 -0
- package/docs/id/index.md +176 -0
- package/docs/id/interest_of_intlayer.md +293 -0
- package/docs/id/intlayer_CMS.md +549 -0
- package/docs/id/intlayer_cli.md +850 -0
- package/docs/id/intlayer_visual_editor.md +288 -0
- package/docs/id/intlayer_with_angular.md +694 -0
- package/docs/id/intlayer_with_astro.md +252 -0
- package/docs/id/intlayer_with_create_react_app.md +1233 -0
- package/docs/id/intlayer_with_express.md +411 -0
- package/docs/id/intlayer_with_lynx+react.md +518 -0
- package/docs/id/intlayer_with_nestjs.md +272 -0
- package/docs/id/intlayer_with_next-i18next.md +628 -0
- package/docs/id/intlayer_with_next-intl.md +446 -0
- package/docs/id/intlayer_with_nextjs_14.md +1617 -0
- package/docs/id/intlayer_with_nextjs_15.md +1698 -0
- package/docs/id/intlayer_with_nextjs_16.md +21 -0
- package/docs/id/intlayer_with_nextjs_page_router.md +1478 -0
- package/docs/id/intlayer_with_nuxt.md +808 -0
- package/docs/id/intlayer_with_react_native+expo.md +699 -0
- package/docs/id/intlayer_with_react_router_v7.md +496 -0
- package/docs/id/intlayer_with_tanstack.md +564 -0
- package/docs/id/intlayer_with_vite+preact.md +1737 -0
- package/docs/id/intlayer_with_vite+react.md +1413 -0
- package/docs/id/intlayer_with_vite+solid.md +289 -0
- package/docs/id/intlayer_with_vite+svelte.md +289 -0
- package/docs/id/intlayer_with_vite+vue.md +1088 -0
- package/docs/id/introduction.md +218 -0
- package/docs/id/locale_mapper.md +242 -0
- package/docs/id/mcp_server.md +211 -0
- package/docs/id/packages/express-intlayer/t.md +458 -0
- package/docs/id/packages/intlayer/getConfiguration.md +145 -0
- package/docs/id/packages/intlayer/getEnumeration.md +159 -0
- package/docs/id/packages/intlayer/getHTMLTextDir.md +122 -0
- package/docs/id/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/id/packages/intlayer/getLocaleName.md +119 -0
- package/docs/id/packages/intlayer/getLocalizedUrl.md +309 -0
- package/docs/id/packages/intlayer/getMultilingualUrls.md +223 -0
- package/docs/id/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/id/packages/intlayer/getTranslation.md +190 -0
- package/docs/id/packages/intlayer/getTranslationContent.md +188 -0
- package/docs/id/packages/next-intlayer/t.md +352 -0
- package/docs/id/packages/next-intlayer/useDictionary.md +271 -0
- package/docs/id/packages/next-intlayer/useIntlayer.md +264 -0
- package/docs/id/packages/next-intlayer/useLocale.md +166 -0
- package/docs/id/packages/react-intlayer/t.md +303 -0
- package/docs/id/packages/react-intlayer/useDictionary.md +287 -0
- package/docs/id/packages/react-intlayer/useI18n.md +267 -0
- package/docs/id/packages/react-intlayer/useIntlayer.md +254 -0
- package/docs/id/packages/react-intlayer/useLocale.md +210 -0
- package/docs/id/per_locale_file.md +323 -0
- package/docs/id/readme.md +261 -0
- package/docs/id/releases/v6.md +305 -0
- package/docs/id/roadmap.md +362 -0
- package/docs/id/testing.md +202 -0
- package/docs/id/vs_code_extension.md +126 -0
- package/docs/it/component_i18n.md +1 -1
- package/docs/it/configuration.md +6 -0
- package/docs/it/intlayer_cli.md +8 -3
- package/docs/it/intlayer_with_next-i18next.md +628 -0
- package/docs/it/intlayer_with_next-intl.md +446 -0
- package/docs/it/intlayer_with_nextjs_16.md +21 -0
- package/docs/it/intlayer_with_tanstack.md +4 -0
- package/docs/it/intlayer_with_vite+react.md +4 -0
- package/docs/ja/component_i18n.md +1 -1
- package/docs/ja/configuration.md +6 -0
- package/docs/ja/intlayer_cli.md +8 -3
- package/docs/ja/intlayer_with_next-i18next.md +627 -0
- package/docs/ja/intlayer_with_next-intl.md +446 -0
- package/docs/ja/intlayer_with_nextjs_16.md +21 -0
- package/docs/ja/intlayer_with_tanstack.md +4 -0
- package/docs/ja/intlayer_with_vite+react.md +4 -0
- package/docs/ko/configuration.md +6 -0
- package/docs/ko/intlayer_cli.md +8 -3
- package/docs/ko/intlayer_with_next-i18next.md +627 -0
- package/docs/ko/intlayer_with_next-intl.md +446 -0
- package/docs/ko/intlayer_with_nextjs_16.md +21 -0
- package/docs/ko/intlayer_with_tanstack.md +4 -0
- package/docs/ko/intlayer_with_vite+react.md +4 -0
- package/docs/pl/CI_CD.md +198 -0
- package/docs/pl/autoFill.md +284 -0
- package/docs/pl/component_i18n.md +186 -0
- package/docs/pl/configuration.md +710 -0
- package/docs/pl/dictionary/condition.md +232 -0
- package/docs/pl/dictionary/content_file.md +1130 -0
- package/docs/pl/dictionary/enumeration.md +245 -0
- package/docs/pl/dictionary/file.md +234 -0
- package/docs/pl/dictionary/function_fetching.md +214 -0
- package/docs/pl/dictionary/gender.md +276 -0
- package/docs/pl/dictionary/insertion.md +188 -0
- package/docs/pl/dictionary/markdown.md +408 -0
- package/docs/pl/dictionary/nesting.md +273 -0
- package/docs/pl/dictionary/translation.md +310 -0
- package/docs/pl/formatters.md +596 -0
- package/docs/pl/how_works_intlayer.md +256 -0
- package/docs/pl/index.md +176 -0
- package/docs/pl/interest_of_intlayer.md +291 -0
- package/docs/pl/intlayer_CMS.md +549 -0
- package/docs/pl/intlayer_cli.md +857 -0
- package/docs/pl/intlayer_visual_editor.md +288 -0
- package/docs/pl/intlayer_with_angular.md +690 -0
- package/docs/pl/intlayer_with_astro.md +280 -0
- package/docs/pl/intlayer_with_create_react_app.md +1235 -0
- package/docs/pl/intlayer_with_express.md +411 -0
- package/docs/pl/intlayer_with_lynx+react.md +518 -0
- package/docs/pl/intlayer_with_nestjs.md +272 -0
- package/docs/pl/intlayer_with_next-i18next.md +628 -0
- package/docs/pl/intlayer_with_next-intl.md +446 -0
- package/docs/pl/intlayer_with_nextjs_14.md +1594 -0
- package/docs/pl/intlayer_with_nextjs_15.md +1701 -0
- package/docs/pl/intlayer_with_nextjs_16.md +21 -0
- package/docs/pl/intlayer_with_nextjs_page_router.md +1513 -0
- package/docs/pl/intlayer_with_nuxt.md +885 -0
- package/docs/pl/intlayer_with_react_native+expo.md +698 -0
- package/docs/pl/intlayer_with_react_router_v7.md +503 -0
- package/docs/pl/intlayer_with_tanstack.md +562 -0
- package/docs/pl/intlayer_with_vite+preact.md +1736 -0
- package/docs/pl/intlayer_with_vite+react.md +1438 -0
- package/docs/pl/intlayer_with_vite+solid.md +290 -0
- package/docs/pl/intlayer_with_vite+svelte.md +289 -0
- package/docs/pl/intlayer_with_vite+vue.md +1116 -0
- package/docs/pl/introduction.md +209 -0
- package/docs/pl/locale_mapper.md +242 -0
- package/docs/pl/mcp_server.md +211 -0
- package/docs/pl/packages/express-intlayer/t.md +458 -0
- package/docs/pl/packages/intlayer/getConfiguration.md +146 -0
- package/docs/pl/packages/intlayer/getEnumeration.md +160 -0
- package/docs/pl/packages/intlayer/getHTMLTextDir.md +121 -0
- package/docs/pl/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/pl/packages/intlayer/getLocaleName.md +118 -0
- package/docs/pl/packages/intlayer/getLocalizedUrl.md +300 -0
- package/docs/pl/packages/intlayer/getMultilingualUrls.md +221 -0
- package/docs/pl/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/pl/packages/intlayer/getTranslation.md +190 -0
- package/docs/pl/packages/intlayer/getTranslationContent.md +189 -0
- package/docs/pl/packages/next-intlayer/t.md +353 -0
- package/docs/pl/packages/next-intlayer/useDictionary.md +270 -0
- package/docs/pl/packages/next-intlayer/useIntlayer.md +263 -0
- package/docs/pl/packages/next-intlayer/useLocale.md +166 -0
- package/docs/pl/packages/react-intlayer/t.md +303 -0
- package/docs/pl/packages/react-intlayer/useDictionary.md +289 -0
- package/docs/pl/packages/react-intlayer/useI18n.md +249 -0
- package/docs/pl/packages/react-intlayer/useIntlayer.md +256 -0
- package/docs/pl/packages/react-intlayer/useLocale.md +210 -0
- package/docs/pl/per_locale_file.md +321 -0
- package/docs/pl/readme.md +261 -0
- package/docs/pl/releases/v6.md +305 -0
- package/docs/pl/roadmap.md +362 -0
- package/docs/pl/testing.md +202 -0
- package/docs/pl/vs_code_extension.md +126 -0
- package/docs/pt/component_i18n.md +1 -1
- package/docs/pt/configuration.md +6 -0
- package/docs/pt/intlayer_cli.md +8 -3
- package/docs/pt/intlayer_with_next-i18next.md +627 -0
- package/docs/pt/intlayer_with_next-intl.md +446 -0
- package/docs/pt/intlayer_with_nextjs_16.md +21 -0
- package/docs/pt/intlayer_with_tanstack.md +4 -0
- package/docs/pt/intlayer_with_vite+react.md +4 -0
- package/docs/ru/component_i18n.md +1 -1
- package/docs/ru/configuration.md +6 -0
- package/docs/ru/intlayer_cli.md +301 -22
- package/docs/ru/intlayer_with_next-i18next.md +629 -0
- package/docs/ru/intlayer_with_next-intl.md +448 -0
- package/docs/ru/intlayer_with_nextjs_16.md +21 -0
- package/docs/ru/intlayer_with_tanstack.md +4 -0
- package/docs/ru/intlayer_with_vite+react.md +4 -0
- package/docs/tr/component_i18n.md +1 -1
- package/docs/tr/configuration.md +6 -0
- package/docs/tr/intlayer_cli.md +8 -0
- package/docs/tr/intlayer_with_next-i18next.md +627 -0
- package/docs/tr/intlayer_with_next-intl.md +446 -0
- package/docs/tr/intlayer_with_nextjs_16.md +21 -0
- package/docs/tr/intlayer_with_tanstack.md +4 -0
- package/docs/tr/intlayer_with_vite+react.md +4 -0
- package/docs/vi/CI_CD.md +198 -0
- package/docs/vi/autoFill.md +284 -0
- package/docs/vi/component_i18n.md +186 -0
- package/docs/vi/configuration.md +710 -0
- package/docs/vi/dictionary/condition.md +237 -0
- package/docs/vi/dictionary/content_file.md +1115 -0
- package/docs/vi/dictionary/enumeration.md +255 -0
- package/docs/vi/dictionary/file.md +234 -0
- package/docs/vi/dictionary/function_fetching.md +212 -0
- package/docs/vi/dictionary/gender.md +275 -0
- package/docs/vi/dictionary/insertion.md +191 -0
- package/docs/vi/dictionary/markdown.md +381 -0
- package/docs/vi/dictionary/nesting.md +273 -0
- package/docs/vi/dictionary/translation.md +309 -0
- package/docs/vi/formatters.md +595 -0
- package/docs/vi/how_works_intlayer.md +256 -0
- package/docs/vi/index.md +174 -0
- package/docs/vi/interest_of_intlayer.md +292 -0
- package/docs/vi/intlayer_CMS.md +549 -0
- package/docs/vi/intlayer_cli.md +850 -0
- package/docs/vi/intlayer_visual_editor.md +288 -0
- package/docs/vi/intlayer_with_angular.md +692 -0
- package/docs/vi/intlayer_with_astro.md +252 -0
- package/docs/vi/intlayer_with_create_react_app.md +1230 -0
- package/docs/vi/intlayer_with_express.md +409 -0
- package/docs/vi/intlayer_with_lynx+react.md +520 -0
- package/docs/vi/intlayer_with_nestjs.md +272 -0
- package/docs/vi/intlayer_with_next-i18next.md +628 -0
- package/docs/vi/intlayer_with_next-intl.md +446 -0
- package/docs/vi/intlayer_with_nextjs_14.md +1584 -0
- package/docs/vi/intlayer_with_nextjs_15.md +1738 -0
- package/docs/vi/intlayer_with_nextjs_16.md +21 -0
- package/docs/vi/intlayer_with_nextjs_page_router.md +1504 -0
- package/docs/vi/intlayer_with_nuxt.md +821 -0
- package/docs/vi/intlayer_with_react_native+expo.md +700 -0
- package/docs/vi/intlayer_with_react_router_v7.md +498 -0
- package/docs/vi/intlayer_with_tanstack.md +562 -0
- package/docs/vi/intlayer_with_vite+preact.md +1722 -0
- package/docs/vi/intlayer_with_vite+react.md +1407 -0
- package/docs/vi/intlayer_with_vite+solid.md +287 -0
- package/docs/vi/intlayer_with_vite+svelte.md +289 -0
- package/docs/vi/intlayer_with_vite+vue.md +1071 -0
- package/docs/vi/introduction.md +215 -0
- package/docs/vi/locale_mapper.md +242 -0
- package/docs/vi/mcp_server.md +211 -0
- package/docs/vi/packages/express-intlayer/t.md +457 -0
- package/docs/vi/packages/intlayer/getConfiguration.md +145 -0
- package/docs/vi/packages/intlayer/getEnumeration.md +162 -0
- package/docs/vi/packages/intlayer/getHTMLTextDir.md +121 -0
- package/docs/vi/packages/intlayer/getLocaleLang.md +81 -0
- package/docs/vi/packages/intlayer/getLocaleName.md +129 -0
- package/docs/vi/packages/intlayer/getLocalizedUrl.md +309 -0
- package/docs/vi/packages/intlayer/getMultilingualUrls.md +221 -0
- package/docs/vi/packages/intlayer/getPathWithoutLocale.md +75 -0
- package/docs/vi/packages/intlayer/getTranslation.md +201 -0
- package/docs/vi/packages/intlayer/getTranslationContent.md +188 -0
- package/docs/vi/packages/next-intlayer/t.md +352 -0
- package/docs/vi/packages/next-intlayer/useDictionary.md +273 -0
- package/docs/vi/packages/next-intlayer/useIntlayer.md +264 -0
- package/docs/vi/packages/next-intlayer/useLocale.md +166 -0
- package/docs/vi/packages/react-intlayer/t.md +304 -0
- package/docs/vi/packages/react-intlayer/useDictionary.md +288 -0
- package/docs/vi/packages/react-intlayer/useI18n.md +295 -0
- package/docs/vi/packages/react-intlayer/useIntlayer.md +256 -0
- package/docs/vi/packages/react-intlayer/useLocale.md +210 -0
- package/docs/vi/per_locale_file.md +326 -0
- package/docs/vi/readme.md +261 -0
- package/docs/vi/releases/v6.md +305 -0
- package/docs/vi/roadmap.md +346 -0
- package/docs/vi/testing.md +202 -0
- package/docs/vi/vs_code_extension.md +126 -0
- package/docs/zh/configuration.md +6 -0
- package/docs/zh/intlayer_cli.md +8 -3
- package/docs/zh/intlayer_with_next-i18next.md +628 -0
- package/docs/zh/intlayer_with_next-intl.md +448 -0
- package/docs/zh/intlayer_with_nextjs_16.md +21 -0
- package/docs/zh/intlayer_with_tanstack.md +4 -0
- package/docs/zh/intlayer_with_vite+react.md +4 -0
- package/frequent_questions/ar/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ar/array_as_content_declaration.md +1 -2
- package/frequent_questions/ar/build_dictionaries.md +1 -2
- package/frequent_questions/ar/build_error_CI_CD.md +1 -2
- package/frequent_questions/ar/bun_set_up.md +1 -2
- package/frequent_questions/ar/customized_locale_list.md +1 -2
- package/frequent_questions/ar/domain_routing.md +1 -2
- package/frequent_questions/ar/esbuild_error.md +1 -2
- package/frequent_questions/ar/get_locale_cookie.md +1 -2
- package/frequent_questions/ar/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ar/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ar/static_rendering.md +1 -3
- package/frequent_questions/ar/translated_path_url.md +1 -2
- package/frequent_questions/ar/unknown_command.md +1 -2
- package/frequent_questions/de/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/de/array_as_content_declaration.md +1 -2
- package/frequent_questions/de/build_dictionaries.md +1 -2
- package/frequent_questions/de/build_error_CI_CD.md +1 -2
- package/frequent_questions/de/bun_set_up.md +1 -2
- package/frequent_questions/de/customized_locale_list.md +1 -2
- package/frequent_questions/de/domain_routing.md +1 -2
- package/frequent_questions/de/esbuild_error.md +1 -2
- package/frequent_questions/de/get_locale_cookie.md +1 -2
- package/frequent_questions/de/intlayer_command_undefined.md +1 -2
- package/frequent_questions/de/locale_incorect_in_url.md +1 -2
- package/frequent_questions/de/static_rendering.md +1 -3
- package/frequent_questions/de/translated_path_url.md +1 -2
- package/frequent_questions/de/unknown_command.md +1 -2
- package/frequent_questions/en/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/en/array_as_content_declaration.md +1 -2
- package/frequent_questions/en/build_dictionaries.md +1 -2
- package/frequent_questions/en/build_error_CI_CD.md +1 -2
- package/frequent_questions/en/bun_set_up.md +1 -2
- package/frequent_questions/en/customized_locale_list.md +1 -2
- package/frequent_questions/en/domain_routing.md +1 -2
- package/frequent_questions/en/esbuild_error.md +1 -2
- package/frequent_questions/en/get_locale_cookie.md +1 -2
- package/frequent_questions/en/intlayer_command_undefined.md +1 -2
- package/frequent_questions/en/locale_incorect_in_url.md +1 -2
- package/frequent_questions/en/static_rendering.md +1 -3
- package/frequent_questions/en/translated_path_url.md +1 -2
- package/frequent_questions/en/unknown_command.md +1 -2
- package/frequent_questions/en-GB/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/en-GB/array_as_content_declaration.md +1 -2
- package/frequent_questions/en-GB/build_dictionaries.md +1 -2
- package/frequent_questions/en-GB/build_error_CI_CD.md +1 -2
- package/frequent_questions/en-GB/bun_set_up.md +1 -2
- package/frequent_questions/en-GB/customized_locale_list.md +1 -2
- package/frequent_questions/en-GB/domain_routing.md +1 -2
- package/frequent_questions/en-GB/esbuild_error.md +1 -2
- package/frequent_questions/en-GB/get_locale_cookie.md +1 -2
- package/frequent_questions/en-GB/intlayer_command_undefined.md +1 -2
- package/frequent_questions/en-GB/locale_incorect_in_url.md +1 -2
- package/frequent_questions/en-GB/static_rendering.md +1 -3
- package/frequent_questions/en-GB/translated_path_url.md +1 -2
- package/frequent_questions/en-GB/unknown_command.md +1 -2
- package/frequent_questions/es/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/es/array_as_content_declaration.md +1 -2
- package/frequent_questions/es/build_dictionaries.md +1 -2
- package/frequent_questions/es/build_error_CI_CD.md +1 -2
- package/frequent_questions/es/bun_set_up.md +1 -2
- package/frequent_questions/es/customized_locale_list.md +1 -2
- package/frequent_questions/es/domain_routing.md +1 -2
- package/frequent_questions/es/esbuild_error.md +1 -2
- package/frequent_questions/es/get_locale_cookie.md +1 -2
- package/frequent_questions/es/intlayer_command_undefined.md +1 -2
- package/frequent_questions/es/locale_incorect_in_url.md +1 -2
- package/frequent_questions/es/static_rendering.md +1 -3
- package/frequent_questions/es/translated_path_url.md +1 -2
- package/frequent_questions/es/unknown_command.md +1 -2
- package/frequent_questions/fr/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/fr/array_as_content_declaration.md +1 -2
- package/frequent_questions/fr/build_dictionaries.md +1 -2
- package/frequent_questions/fr/build_error_CI_CD.md +1 -2
- package/frequent_questions/fr/bun_set_up.md +1 -2
- package/frequent_questions/fr/customized_locale_list.md +1 -2
- package/frequent_questions/fr/domain_routing.md +1 -2
- package/frequent_questions/fr/esbuild_error.md +1 -2
- package/frequent_questions/fr/get_locale_cookie.md +1 -2
- package/frequent_questions/fr/intlayer_command_undefined.md +1 -2
- package/frequent_questions/fr/locale_incorect_in_url.md +1 -2
- package/frequent_questions/fr/static_rendering.md +1 -3
- package/frequent_questions/fr/translated_path_url.md +1 -2
- package/frequent_questions/fr/unknown_command.md +1 -2
- package/frequent_questions/hi/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/hi/array_as_content_declaration.md +1 -2
- package/frequent_questions/hi/build_dictionaries.md +1 -2
- package/frequent_questions/hi/build_error_CI_CD.md +1 -2
- package/frequent_questions/hi/bun_set_up.md +1 -2
- package/frequent_questions/hi/customized_locale_list.md +1 -2
- package/frequent_questions/hi/domain_routing.md +1 -2
- package/frequent_questions/hi/esbuild_error.md +1 -2
- package/frequent_questions/hi/get_locale_cookie.md +1 -2
- package/frequent_questions/hi/intlayer_command_undefined.md +1 -2
- package/frequent_questions/hi/locale_incorect_in_url.md +1 -2
- package/frequent_questions/hi/static_rendering.md +1 -3
- package/frequent_questions/hi/translated_path_url.md +1 -2
- package/frequent_questions/hi/unknown_command.md +1 -2
- package/frequent_questions/id/SSR_Next_no_[locale].md +104 -0
- package/frequent_questions/id/array_as_content_declaration.md +71 -0
- package/frequent_questions/id/build_dictionaries.md +58 -0
- package/frequent_questions/id/build_error_CI_CD.md +74 -0
- package/frequent_questions/id/bun_set_up.md +53 -0
- package/frequent_questions/id/customized_locale_list.md +64 -0
- package/frequent_questions/id/domain_routing.md +113 -0
- package/frequent_questions/id/esbuild_error.md +29 -0
- package/frequent_questions/id/get_locale_cookie.md +142 -0
- package/frequent_questions/id/intlayer_command_undefined.md +155 -0
- package/frequent_questions/id/locale_incorect_in_url.md +73 -0
- package/frequent_questions/id/static_rendering.md +44 -0
- package/frequent_questions/id/translated_path_url.md +55 -0
- package/frequent_questions/id/unknown_command.md +97 -0
- package/frequent_questions/it/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/it/array_as_content_declaration.md +1 -2
- package/frequent_questions/it/build_dictionaries.md +1 -2
- package/frequent_questions/it/build_error_CI_CD.md +1 -2
- package/frequent_questions/it/bun_set_up.md +1 -2
- package/frequent_questions/it/customized_locale_list.md +1 -2
- package/frequent_questions/it/domain_routing.md +1 -2
- package/frequent_questions/it/esbuild_error.md +1 -2
- package/frequent_questions/it/get_locale_cookie.md +1 -2
- package/frequent_questions/it/intlayer_command_undefined.md +1 -2
- package/frequent_questions/it/locale_incorect_in_url.md +1 -2
- package/frequent_questions/it/static_rendering.md +1 -3
- package/frequent_questions/it/translated_path_url.md +1 -2
- package/frequent_questions/it/unknown_command.md +1 -2
- package/frequent_questions/ja/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ja/array_as_content_declaration.md +1 -2
- package/frequent_questions/ja/build_dictionaries.md +1 -2
- package/frequent_questions/ja/build_error_CI_CD.md +1 -2
- package/frequent_questions/ja/bun_set_up.md +1 -2
- package/frequent_questions/ja/customized_locale_list.md +1 -2
- package/frequent_questions/ja/domain_routing.md +1 -2
- package/frequent_questions/ja/esbuild_error.md +1 -2
- package/frequent_questions/ja/get_locale_cookie.md +1 -2
- package/frequent_questions/ja/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ja/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ja/static_rendering.md +1 -3
- package/frequent_questions/ja/translated_path_url.md +1 -2
- package/frequent_questions/ja/unknown_command.md +1 -2
- package/frequent_questions/ko/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ko/array_as_content_declaration.md +1 -2
- package/frequent_questions/ko/build_dictionaries.md +1 -2
- package/frequent_questions/ko/build_error_CI_CD.md +1 -2
- package/frequent_questions/ko/bun_set_up.md +1 -2
- package/frequent_questions/ko/customized_locale_list.md +1 -2
- package/frequent_questions/ko/domain_routing.md +1 -2
- package/frequent_questions/ko/esbuild_error.md +1 -2
- package/frequent_questions/ko/get_locale_cookie.md +1 -2
- package/frequent_questions/ko/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ko/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ko/static_rendering.md +1 -3
- package/frequent_questions/ko/translated_path_url.md +1 -2
- package/frequent_questions/ko/unknown_command.md +1 -2
- package/frequent_questions/pl/SSR_Next_no_[locale].md +104 -0
- package/frequent_questions/pl/array_as_content_declaration.md +71 -0
- package/frequent_questions/pl/build_dictionaries.md +58 -0
- package/frequent_questions/pl/build_error_CI_CD.md +74 -0
- package/frequent_questions/pl/bun_set_up.md +54 -0
- package/frequent_questions/pl/customized_locale_list.md +64 -0
- package/frequent_questions/pl/domain_routing.md +113 -0
- package/frequent_questions/pl/esbuild_error.md +29 -0
- package/frequent_questions/pl/get_locale_cookie.md +142 -0
- package/frequent_questions/pl/intlayer_command_undefined.md +155 -0
- package/frequent_questions/pl/locale_incorect_in_url.md +73 -0
- package/frequent_questions/pl/static_rendering.md +44 -0
- package/frequent_questions/pl/translated_path_url.md +55 -0
- package/frequent_questions/pl/unknown_command.md +97 -0
- package/frequent_questions/pt/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/pt/array_as_content_declaration.md +1 -2
- package/frequent_questions/pt/build_dictionaries.md +1 -2
- package/frequent_questions/pt/build_error_CI_CD.md +1 -2
- package/frequent_questions/pt/bun_set_up.md +1 -2
- package/frequent_questions/pt/customized_locale_list.md +1 -2
- package/frequent_questions/pt/domain_routing.md +1 -2
- package/frequent_questions/pt/esbuild_error.md +1 -2
- package/frequent_questions/pt/get_locale_cookie.md +1 -2
- package/frequent_questions/pt/intlayer_command_undefined.md +1 -2
- package/frequent_questions/pt/locale_incorect_in_url.md +1 -2
- package/frequent_questions/pt/static_rendering.md +1 -3
- package/frequent_questions/pt/translated_path_url.md +1 -2
- package/frequent_questions/pt/unknown_command.md +1 -2
- package/frequent_questions/ru/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/ru/array_as_content_declaration.md +1 -2
- package/frequent_questions/ru/build_dictionaries.md +1 -2
- package/frequent_questions/ru/build_error_CI_CD.md +1 -2
- package/frequent_questions/ru/bun_set_up.md +1 -2
- package/frequent_questions/ru/customized_locale_list.md +1 -2
- package/frequent_questions/ru/domain_routing.md +1 -2
- package/frequent_questions/ru/esbuild_error.md +1 -2
- package/frequent_questions/ru/get_locale_cookie.md +1 -2
- package/frequent_questions/ru/intlayer_command_undefined.md +1 -2
- package/frequent_questions/ru/locale_incorect_in_url.md +1 -2
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/ru/translated_path_url.md +1 -2
- package/frequent_questions/ru/unknown_command.md +1 -2
- package/frequent_questions/tr/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/tr/array_as_content_declaration.md +1 -2
- package/frequent_questions/tr/build_dictionaries.md +1 -2
- package/frequent_questions/tr/build_error_CI_CD.md +1 -2
- package/frequent_questions/tr/bun_set_up.md +1 -2
- package/frequent_questions/tr/customized_locale_list.md +1 -2
- package/frequent_questions/tr/domain_routing.md +1 -2
- package/frequent_questions/tr/esbuild_error.md +1 -2
- package/frequent_questions/tr/get_locale_cookie.md +1 -2
- package/frequent_questions/tr/intlayer_command_undefined.md +1 -2
- package/frequent_questions/tr/locale_incorect_in_url.md +1 -2
- package/frequent_questions/tr/static_rendering.md +1 -2
- package/frequent_questions/tr/translated_path_url.md +1 -2
- package/frequent_questions/tr/unknown_command.md +1 -2
- package/frequent_questions/vi/SSR_Next_no_[locale].md +106 -0
- package/frequent_questions/vi/array_as_content_declaration.md +71 -0
- package/frequent_questions/vi/build_dictionaries.md +58 -0
- package/frequent_questions/vi/build_error_CI_CD.md +74 -0
- package/frequent_questions/vi/bun_set_up.md +53 -0
- package/frequent_questions/vi/customized_locale_list.md +64 -0
- package/frequent_questions/vi/domain_routing.md +113 -0
- package/frequent_questions/vi/esbuild_error.md +29 -0
- package/frequent_questions/vi/get_locale_cookie.md +142 -0
- package/frequent_questions/vi/intlayer_command_undefined.md +155 -0
- package/frequent_questions/vi/locale_incorect_in_url.md +73 -0
- package/frequent_questions/vi/static_rendering.md +44 -0
- package/frequent_questions/vi/translated_path_url.md +55 -0
- package/frequent_questions/vi/unknown_command.md +97 -0
- package/frequent_questions/zh/SSR_Next_no_[locale].md +1 -2
- package/frequent_questions/zh/array_as_content_declaration.md +1 -2
- package/frequent_questions/zh/build_dictionaries.md +1 -2
- package/frequent_questions/zh/build_error_CI_CD.md +1 -2
- package/frequent_questions/zh/bun_set_up.md +1 -2
- package/frequent_questions/zh/customized_locale_list.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -2
- package/frequent_questions/zh/esbuild_error.md +1 -2
- package/frequent_questions/zh/get_locale_cookie.md +1 -2
- package/frequent_questions/zh/intlayer_command_undefined.md +1 -2
- package/frequent_questions/zh/locale_incorect_in_url.md +1 -2
- package/frequent_questions/zh/static_rendering.md +1 -3
- package/frequent_questions/zh/translated_path_url.md +1 -2
- package/frequent_questions/zh/unknown_command.md +1 -2
- package/legal/id/privacy_notice.md +83 -0
- package/legal/id/terms_of_service.md +55 -0
- package/legal/pl/privacy_notice.md +83 -0
- package/legal/pl/terms_of_service.md +55 -0
- package/legal/vi/privacy_notice.md +83 -0
- package/legal/vi/terms_of_service.md +55 -0
- package/package.json +19 -18
- package/src/generated/blog.entry.ts +38 -0
package/blog/vi/index.md
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-24-12
|
|
3
|
+
updatedAt: 2025-06-29
|
|
4
|
+
title: Blog
|
|
5
|
+
description: Khám phá tất cả các chủ đề liên quan đến Intlayer, quốc tế hóa và các chủ đề khác
|
|
6
|
+
keywords:
|
|
7
|
+
- Intlayer
|
|
8
|
+
- Quốc tế hóa
|
|
9
|
+
- Blog
|
|
10
|
+
- Next.js
|
|
11
|
+
- JavaScript
|
|
12
|
+
- React
|
|
13
|
+
slugs:
|
|
14
|
+
- blog
|
|
15
|
+
- search
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Áp dụng Quốc tế hóa trong JavaScript: Nâng cao Phạm vi Toàn cầu và SEO
|
|
19
|
+
|
|
20
|
+
Chào mừng bạn đến với blog của chúng tôi, nơi dành riêng cho tất cả các vấn đề về **quốc tế hóa** cho các ứng dụng JavaScript! Tại đây, chúng tôi khám phá các thực tiễn tốt nhất, chiến lược và công cụ giúp các nhà phát triển mở rộng sản phẩm kỹ thuật số của họ trên toàn cầu.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Tại sao Quốc tế hóa (i18n) lại Quan trọng
|
|
25
|
+
|
|
26
|
+
Trong thế giới kết nối ngày nay, người dùng mong đợi trải nghiệm liền mạch và được địa phương hóa. Quốc tế hóa (i18n) đảm bảo rằng ứng dụng web của bạn có thể thích ứng với các ngôn ngữ và sắc thái văn hóa khác nhau. Bằng cách áp dụng các thực tiễn i18n ngay từ đầu, bạn sẽ mở khóa nhiều lợi ích, chẳng hạn như:
|
|
27
|
+
|
|
28
|
+
1. **Cải thiện trải nghiệm người dùng:** Người dùng cảm thấy thoải mái hơn khi tương tác với nội dung bằng ngôn ngữ mẹ đẻ của họ.
|
|
29
|
+
2. **Mở rộng phạm vi thị trường:** Cung cấp nhiều ngôn ngữ giúp bạn tiếp cận các khu vực mới và phát triển cơ sở người dùng.
|
|
30
|
+
3. **Cải thiện khả năng tiếp cận:** i18n được cấu trúc tốt thường phù hợp với các tiêu chuẩn về khả năng tiếp cận, làm cho ứng dụng của bạn trở nên bao quát hơn.
|
|
31
|
+
4. **Tăng hiệu quả SEO:** Nội dung được địa phương hóa có thể nâng cao khả năng hiển thị của bạn trong kết quả tìm kiếm theo vùng.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Giải pháp Quốc tế hóa Mã nguồn mở
|
|
36
|
+
|
|
37
|
+
Việc xây dựng một ứng dụng quốc tế hóa không nhất thiết phải phức tạp. Cộng đồng mã nguồn mở cung cấp nhiều công cụ và thư viện mạnh mẽ, được hỗ trợ tốt giúp việc địa phương hóa trở nên đơn giản hơn. Các giải pháp phổ biến như **react-intl**, **i18next**, và **FormatJS** cung cấp API linh hoạt và dễ dàng tích hợp với các framework JavaScript hiện đại như React, Vue và Angular.
|
|
38
|
+
|
|
39
|
+
### Lợi ích chính của các giải pháp mã nguồn mở
|
|
40
|
+
|
|
41
|
+
- **Tính linh hoạt:** Các thư viện do cộng đồng phát triển tiến hóa nhanh chóng, cung cấp các bản cập nhật và tính năng mới khi cần thiết.
|
|
42
|
+
- **Tiết kiệm chi phí:** Không có phí bản quyền, giúp việc thử nghiệm hoặc mở rộng ứng dụng trở nên đơn giản hơn.
|
|
43
|
+
- **Hỗ trợ cộng đồng:** Cộng đồng lớn thường đồng nghĩa với nhiều hướng dẫn, tài liệu và plugin có sẵn.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Thông báo và những điều sắp tới
|
|
48
|
+
|
|
49
|
+
Chúng tôi rất vui mừng thông báo về các hướng dẫn sắp tới, các thực hành tốt nhất và **các nghiên cứu điển hình** về cách tối ưu hóa ứng dụng JavaScript của bạn cho đối tượng toàn cầu. Dưới đây là một cái nhìn sơ lược:
|
|
50
|
+
|
|
51
|
+
- **Mẹo Địa phương hóa Nâng cao:** Thành thạo cách chia số nhiều, định dạng ngày/giờ và nội dung động.
|
|
52
|
+
- **Tối ưu Hiệu suất:** Giảm thiểu kích thước gói trong khi vẫn hỗ trợ nhiều ngôn ngữ.
|
|
53
|
+
- **Nghiên cứu điển hình từ Cộng đồng:** Trình bày các ví dụ thực tế về việc triển khai i18n thành công.
|
|
54
|
+
|
|
55
|
+
Hãy theo dõi các cập nhật này và nhiều hơn nữa!
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Đóng góp cho Blog của Chúng Tôi!
|
|
60
|
+
|
|
61
|
+
Chúng tôi tin tưởng vào việc chia sẻ kiến thức do cộng đồng dẫn dắt. Nếu bạn có một ý tưởng tuyệt vời cho bài viết blog liên quan đến quốc tế hóa, **SEO**, hoặc bất kỳ chủ đề liên quan nào khác, chúng tôi rất mong được nghe từ bạn. Bạn có thể gửi Pull Request bằng cách thêm bài viết blog đề xuất của mình vào kho GitHub của chúng tôi:
|
|
62
|
+
|
|
63
|
+
[**Gửi bài viết của bạn tại đây**](https://github.com/aymericzip/intlayer/blob/main/docs/blog)
|
|
64
|
+
|
|
65
|
+
Những đóng góp của bạn giúp chúng tôi làm phong phú nền tảng này và trao quyền cho các nhà phát triển trên toàn thế giới.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
**Cảm ơn bạn đã đọc và chào mừng bạn đến với cộng đồng i18n của chúng tôi!** Hãy đón chờ thêm nhiều thông tin chi tiết, mẹo và các thực hành tốt nhất về cách đưa ứng dụng JavaScript của bạn đến thành công quốc tế.
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-12-24
|
|
3
|
+
updatedAt: 2025-06-29
|
|
4
|
+
title: SEO và Quốc tế hóa
|
|
5
|
+
description: Khám phá cách tối ưu hóa website đa ngôn ngữ của bạn cho các công cụ tìm kiếm và cải thiện SEO.
|
|
6
|
+
keywords:
|
|
7
|
+
- SEO
|
|
8
|
+
- Intlayer
|
|
9
|
+
- Quốc tế hóa
|
|
10
|
+
- Blog
|
|
11
|
+
- Next.js
|
|
12
|
+
- JavaScript
|
|
13
|
+
- React
|
|
14
|
+
slugs:
|
|
15
|
+
- blog
|
|
16
|
+
- SEO-and-i18n
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# SEO & I18n: Hướng Dẫn Tối Ưu Để Biến Website Của Bạn Thành Đa Ngôn Ngữ
|
|
20
|
+
|
|
21
|
+
Muốn tiếp cận nhiều người dùng hơn trên toàn cầu? Việc làm cho website của bạn đa ngôn ngữ là một trong những cách tốt nhất để mở rộng đối tượng người dùng và cải thiện SEO (Tối ưu hóa công cụ tìm kiếm). Trong bài blog này, chúng tôi sẽ phân tích những kiến thức cơ bản về SEO quốc tế, thường được gọi là **i18n** (viết tắt của “internationalization” - quốc tế hóa), bằng những thuật ngữ rõ ràng và dễ hiểu. Bạn sẽ học được về những quyết định quan trọng cần đưa ra, cách sử dụng các yếu tố kỹ thuật như `hreflang`, và lý do tại sao các công cụ như **Intlayer** có thể giúp đơn giản hóa các dự án Next.js đa ngôn ngữ của bạn.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 1. Làm Thế Nào Để Biết Website Của Bạn Đa Ngôn Ngữ?
|
|
26
|
+
|
|
27
|
+
Một trang web đa ngôn ngữ cung cấp nội dung của nó bằng nhiều hơn một ngôn ngữ. Ví dụ, bạn có thể có phiên bản tiếng Anh (`example.com/en/`), phiên bản tiếng Pháp (`example.com/fr/`), và phiên bản tiếng Tây Ban Nha (`example.com/es/`). Cách tiếp cận này cho phép các công cụ tìm kiếm hiển thị phiên bản ngôn ngữ phù hợp cho người dùng dựa trên sở thích hoặc vị trí địa lý của họ.
|
|
28
|
+
|
|
29
|
+
Khi bạn làm đúng, bạn sẽ tạo ra trải nghiệm thân thiện hơn nhiều cho những người không nói tiếng Anh, dẫn đến sự tương tác tốt hơn, tỷ lệ chuyển đổi cao hơn và cải thiện SEO ở các khu vực khác nhau.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. Lựa Chọn Cấu Trúc URL Phù Hợp
|
|
34
|
+
|
|
35
|
+
Nếu bạn quyết định có nhiều phiên bản ngôn ngữ, bạn sẽ cần một cách rõ ràng và nhất quán để tổ chức các URL của trang web. Mỗi ngôn ngữ (hoặc khu vực) nên có “địa chỉ” riêng biệt trên internet. Dưới đây là ba cách phổ biến để cấu trúc các trang web đa ngôn ngữ:
|
|
36
|
+
|
|
37
|
+
1. Tên miền cấp cao theo mã quốc gia (ccTLDs)
|
|
38
|
+
- Ví dụ: `example.fr`, `example.de`
|
|
39
|
+
- **Ưu điểm:** Gửi tín hiệu mạnh mẽ đến các công cụ tìm kiếm về quốc gia mà nội dung hướng đến (ví dụ, `.fr` = Pháp).
|
|
40
|
+
- **Nhược điểm:** Quản lý nhiều tên miền có thể tốn kém và phức tạp hơn.
|
|
41
|
+
|
|
42
|
+
2. **Subdomains**
|
|
43
|
+
- **Ví dụ:** `fr.example.com`, `de.example.com`
|
|
44
|
+
- **Ưu điểm:** Mỗi ngôn ngữ “sống” trên một subdomain riêng, giúp việc thêm hoặc bớt ngôn ngữ trở nên tương đối dễ dàng.
|
|
45
|
+
- **Nhược điểm:** Các công cụ tìm kiếm đôi khi coi các subdomain như các trang web riêng biệt, vì vậy nó có thể làm giảm uy tín của tên miền chính của bạn.
|
|
46
|
+
|
|
47
|
+
3. **Thư mục con (Subdirectories)**
|
|
48
|
+
- **Ví dụ:** `example.com/fr/`, `example.com/de/`
|
|
49
|
+
- **Ưu điểm:** Dễ quản lý, và tất cả lưu lượng truy cập đều hướng đến một tên miền chính.
|
|
50
|
+
- **Nhược điểm:** Tín hiệu SEO địa phương không mạnh bằng ccTLDs (mặc dù vẫn rất hiệu quả nếu thực hiện đúng cách).
|
|
51
|
+
|
|
52
|
+
> **Mẹo:** Nếu bạn có một thương hiệu toàn cầu và muốn giữ mọi thứ đơn giản hơn, thư mục con thường là lựa chọn tốt nhất. Nếu bạn chỉ nhắm đến một hoặc hai quốc gia chính và muốn nhấn mạnh từng quốc gia, ccTLDs có thể là cách nên chọn.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 3. Làm Chủ Việc Nhắm Mục Tiêu Ngôn Ngữ với Hreflang
|
|
57
|
+
|
|
58
|
+
### 3.1. Hreflang là gì?
|
|
59
|
+
|
|
60
|
+
Khi bạn có nội dung giống hệt hoặc rất giống nhau bằng nhiều ngôn ngữ, các công cụ tìm kiếm như Google có thể bị nhầm lẫn về phiên bản nào nên hiển thị cho người dùng. **Hreflang** là một thuộc tính HTML cho biết với các công cụ tìm kiếm ngôn ngữ (và khu vực) mà một trang cụ thể hướng đến, cũng như các trang ngôn ngữ/khu vực thay thế.
|
|
61
|
+
|
|
62
|
+
### 3.2. Tại sao điều này quan trọng?
|
|
63
|
+
|
|
64
|
+
1. Ngăn ngừa các vấn đề về **nội dung trùng lặp** (khi các công cụ tìm kiếm nghĩ rằng bạn đang xuất bản cùng một nội dung nhiều lần).
|
|
65
|
+
2. Đảm bảo **người dùng Pháp thấy phiên bản tiếng Pháp**, **người dùng Tây Ban Nha thấy phiên bản tiếng Tây Ban Nha**, và tương tự.
|
|
66
|
+
3. Cải thiện trải nghiệm người dùng tổng thể, nghĩa là tăng tương tác và xếp hạng SEO cao hơn.
|
|
67
|
+
|
|
68
|
+
### 3.3. Cách sử dụng Hreflang trong thẻ `<head>`
|
|
69
|
+
|
|
70
|
+
Trong HTML của bạn, bạn sẽ thêm như sau:
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<link rel="alternate" hreflang="en" href="https://example.com/en" />
|
|
74
|
+
<link rel="alternate" hreflang="fr" href="https://example.com/fr" />
|
|
75
|
+
<link rel="alternate" hreflang="es" href="https://example.com/es" />
|
|
76
|
+
<link rel="alternate" hreflang="x-default" href="https://example.com/en" />
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
- **`hreflang="en"`**: Chỉ phiên bản tiếng Anh của trang.
|
|
80
|
+
- **`hreflang="fr"`**: Chỉ phiên bản tiếng Pháp của trang.
|
|
81
|
+
- **`hreflang="es"`**: Chỉ phiên bản tiếng Tây Ban Nha của trang.
|
|
82
|
+
- **`hreflang="x-default"`**: Ngôn ngữ “dự phòng” hoặc URL mặc định khi không có ngôn ngữ nào khác phù hợp với sở thích của người dùng.
|
|
83
|
+
|
|
84
|
+
> **Lưu ý nhanh:** Đảm bảo các URL trong các thẻ này trỏ trực tiếp đến trang cuối cùng, **không** có chuyển hướng bổ sung nào.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 4. Làm cho Nội dung Thực sự “Địa phương” (Không chỉ Dịch)
|
|
89
|
+
|
|
90
|
+
### 4.1. Định vị hóa so với Dịch thuật
|
|
91
|
+
|
|
92
|
+
- **Dịch thuật** có nghĩa là chuyển đổi văn bản từ một ngôn ngữ sang ngôn ngữ khác từng từ một.
|
|
93
|
+
- **Định vị hóa** có nghĩa là điều chỉnh định dạng nội dung, tiền tệ, đơn vị đo lường và các tham chiếu văn hóa cho phù hợp với đối tượng địa phương. Ví dụ, nếu bạn nhắm đến thị trường Pháp, bạn sẽ dùng `€` thay vì `---
|
|
94
|
+
createdAt: 2024-12-24
|
|
95
|
+
updatedAt: 2025-06-29
|
|
96
|
+
title: SEO và Quốc tế hóa
|
|
97
|
+
description: Khám phá cách tối ưu hóa website đa ngôn ngữ của bạn cho các công cụ tìm kiếm và cải thiện SEO.
|
|
98
|
+
keywords:
|
|
99
|
+
- SEO
|
|
100
|
+
- Intlayer
|
|
101
|
+
- Quốc tế hóa
|
|
102
|
+
- Blog
|
|
103
|
+
- Next.js
|
|
104
|
+
- JavaScript
|
|
105
|
+
- React
|
|
106
|
+
slugs:
|
|
107
|
+
- blog
|
|
108
|
+
- SEO-and-i18n
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
# SEO & I18n: Hướng Dẫn Tối Ưu Để Biến Website Của Bạn Thành Đa Ngôn Ngữ
|
|
113
|
+
|
|
114
|
+
Muốn tiếp cận nhiều người dùng hơn trên toàn cầu? Việc làm cho website của bạn đa ngôn ngữ là một trong những cách tốt nhất để mở rộng đối tượng người dùng và cải thiện SEO (Tối ưu hóa công cụ tìm kiếm). Trong bài blog này, chúng tôi sẽ phân tích những kiến thức cơ bản về SEO quốc tế, thường được gọi là **i18n** (viết tắt của “internationalization” - quốc tế hóa), bằng những thuật ngữ rõ ràng và dễ hiểu. Bạn sẽ học được về những quyết định quan trọng cần đưa ra, cách sử dụng các yếu tố kỹ thuật như `hreflang`, và lý do tại sao các công cụ như **Intlayer** có thể giúp đơn giản hóa các dự án Next.js đa ngôn ngữ của bạn.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 1. Làm Thế Nào Để Biết Website Của Bạn Đa Ngôn Ngữ?
|
|
119
|
+
|
|
120
|
+
Một trang web đa ngôn ngữ cung cấp nội dung của nó bằng nhiều hơn một ngôn ngữ. Ví dụ, bạn có thể có phiên bản tiếng Anh (`example.com/en/`), phiên bản tiếng Pháp (`example.com/fr/`), và phiên bản tiếng Tây Ban Nha (`example.com/es/`). Cách tiếp cận này cho phép các công cụ tìm kiếm hiển thị phiên bản ngôn ngữ phù hợp cho người dùng dựa trên sở thích hoặc vị trí địa lý của họ.
|
|
121
|
+
|
|
122
|
+
Khi bạn làm đúng, bạn sẽ tạo ra trải nghiệm thân thiện hơn nhiều cho những người không nói tiếng Anh, dẫn đến sự tương tác tốt hơn, tỷ lệ chuyển đổi cao hơn và cải thiện SEO ở các khu vực khác nhau.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 2. Lựa Chọn Cấu Trúc URL Phù Hợp
|
|
127
|
+
|
|
128
|
+
Nếu bạn quyết định có nhiều phiên bản ngôn ngữ, bạn sẽ cần một cách rõ ràng và nhất quán để tổ chức các URL của trang web. Mỗi ngôn ngữ (hoặc khu vực) nên có “địa chỉ” riêng biệt trên internet. Dưới đây là ba cách phổ biến để cấu trúc các trang web đa ngôn ngữ:
|
|
129
|
+
|
|
130
|
+
1. Tên miền cấp cao theo mã quốc gia (ccTLDs)
|
|
131
|
+
- Ví dụ: `example.fr`, `example.de`
|
|
132
|
+
- **Ưu điểm:** Gửi tín hiệu mạnh mẽ đến các công cụ tìm kiếm về quốc gia mà nội dung hướng đến (ví dụ, `.fr` = Pháp).
|
|
133
|
+
- **Nhược điểm:** Quản lý nhiều tên miền có thể tốn kém và phức tạp hơn.
|
|
134
|
+
|
|
135
|
+
2. **Subdomains**
|
|
136
|
+
- **Ví dụ:** `fr.example.com`, `de.example.com`
|
|
137
|
+
- **Ưu điểm:** Mỗi ngôn ngữ “sống” trên một subdomain riêng, giúp việc thêm hoặc bớt ngôn ngữ trở nên tương đối dễ dàng.
|
|
138
|
+
- **Nhược điểm:** Các công cụ tìm kiếm đôi khi coi các subdomain như các trang web riêng biệt, vì vậy nó có thể làm giảm uy tín của tên miền chính của bạn.
|
|
139
|
+
|
|
140
|
+
3. **Thư mục con (Subdirectories)**
|
|
141
|
+
- **Ví dụ:** `example.com/fr/`, `example.com/de/`
|
|
142
|
+
- **Ưu điểm:** Dễ quản lý, và tất cả lưu lượng truy cập đều hướng đến một tên miền chính.
|
|
143
|
+
- **Nhược điểm:** Tín hiệu SEO địa phương không mạnh bằng ccTLDs (mặc dù vẫn rất hiệu quả nếu thực hiện đúng cách).
|
|
144
|
+
|
|
145
|
+
> **Mẹo:** Nếu bạn có một thương hiệu toàn cầu và muốn giữ mọi thứ đơn giản hơn, thư mục con thường là lựa chọn tốt nhất. Nếu bạn chỉ nhắm đến một hoặc hai quốc gia chính và muốn nhấn mạnh từng quốc gia, ccTLDs có thể là cách nên chọn.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 3. Làm Chủ Việc Nhắm Mục Tiêu Ngôn Ngữ với Hreflang
|
|
150
|
+
|
|
151
|
+
### 3.1. Hreflang là gì?
|
|
152
|
+
|
|
153
|
+
Khi bạn có nội dung giống hệt hoặc rất giống nhau bằng nhiều ngôn ngữ, các công cụ tìm kiếm như Google có thể bị nhầm lẫn về phiên bản nào nên hiển thị cho người dùng. **Hreflang** là một thuộc tính HTML cho biết với các công cụ tìm kiếm ngôn ngữ (và khu vực) mà một trang cụ thể hướng đến, cũng như các trang ngôn ngữ/khu vực thay thế.
|
|
154
|
+
|
|
155
|
+
### 3.2. Tại sao điều này quan trọng?
|
|
156
|
+
|
|
157
|
+
1. Ngăn ngừa các vấn đề về **nội dung trùng lặp** (khi các công cụ tìm kiếm nghĩ rằng bạn đang xuất bản cùng một nội dung nhiều lần).
|
|
158
|
+
2. Đảm bảo **người dùng Pháp thấy phiên bản tiếng Pháp**, **người dùng Tây Ban Nha thấy phiên bản tiếng Tây Ban Nha**, và tương tự.
|
|
159
|
+
3. Cải thiện trải nghiệm người dùng tổng thể, nghĩa là tăng tương tác và xếp hạng SEO cao hơn.
|
|
160
|
+
|
|
161
|
+
### 3.3. Cách sử dụng Hreflang trong thẻ `<head>`
|
|
162
|
+
|
|
163
|
+
Trong HTML của bạn, bạn sẽ thêm như sau:
|
|
164
|
+
|
|
165
|
+
```html
|
|
166
|
+
<link rel="alternate" hreflang="en" href="https://example.com/en" />
|
|
167
|
+
<link rel="alternate" hreflang="fr" href="https://example.com/fr" />
|
|
168
|
+
<link rel="alternate" hreflang="es" href="https://example.com/es" />
|
|
169
|
+
<link rel="alternate" hreflang="x-default" href="https://example.com/en" />
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
- **`hreflang="en"`**: Chỉ phiên bản tiếng Anh của trang.
|
|
173
|
+
- **`hreflang="fr"`**: Chỉ phiên bản tiếng Pháp của trang.
|
|
174
|
+
- **`hreflang="es"`**: Chỉ phiên bản tiếng Tây Ban Nha của trang.
|
|
175
|
+
- **`hreflang="x-default"`**: Ngôn ngữ “dự phòng” hoặc URL mặc định khi không có ngôn ngữ nào khác phù hợp với sở thích của người dùng.
|
|
176
|
+
|
|
177
|
+
> **Lưu ý nhanh:** Đảm bảo các URL trong các thẻ này trỏ trực tiếp đến trang cuối cùng, **không** có chuyển hướng bổ sung nào.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 4. Làm cho Nội dung Thực sự “Địa phương” (Không chỉ Dịch)
|
|
182
|
+
|
|
183
|
+
, và có thể đề cập đến các ngày lễ địa phương hoặc các chi tiết đặc thù vùng miền.
|
|
184
|
+
|
|
185
|
+
### 4.2. Tránh Nội dung Trùng lặp
|
|
186
|
+
|
|
187
|
+
Ngay cả với các bản dịch tốt, các công cụ tìm kiếm vẫn có thể đánh dấu trang web của bạn là nội dung trùng lặp nếu cấu trúc quá giống nhau. Hreflang giúp làm rõ rằng các trang này không phải là bản sao mà là các biến thể ngôn ngữ.
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 5. Các Yếu tố Kỹ thuật SEO Cần Thiết
|
|
192
|
+
|
|
193
|
+
### 5.1. Khai báo Ngôn ngữ (`lang` và `dir`)
|
|
194
|
+
|
|
195
|
+
Trong thẻ HTML của bạn, bạn có thể khai báo ngôn ngữ như sau:
|
|
196
|
+
|
|
197
|
+
```html
|
|
198
|
+
<html lang="en"></html>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
- **`lang="en"`** giúp trình duyệt và các công nghệ hỗ trợ hiểu được ngôn ngữ.
|
|
202
|
+
|
|
203
|
+
Đối với các ngôn ngữ viết từ phải sang trái (như tiếng Ả Rập hoặc tiếng Do Thái), thêm:
|
|
204
|
+
|
|
205
|
+
```html
|
|
206
|
+
<html dir="rtl" lang="ar"></html>
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
- **`dir="rtl"`** đảm bảo hướng văn bản là từ phải sang trái.
|
|
210
|
+
|
|
211
|
+
### 5.2. Thẻ Canonical
|
|
212
|
+
|
|
213
|
+
Thẻ canonical cho các công cụ tìm kiếm biết trang nào là phiên bản “gốc” hoặc chính nếu bạn có các trang gần như trùng lặp. Thông thường, bạn sẽ có một canonical **tham chiếu chính nó** cho các trang đa ngôn ngữ.
|
|
214
|
+
|
|
215
|
+
```html
|
|
216
|
+
<link rel="canonical" href="https://example.com/fr/produits" />
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## 6. SEO Trên Trang Đa Ngôn Ngữ
|
|
222
|
+
|
|
223
|
+
### 6.1. Tiêu đề & Mô tả Meta
|
|
224
|
+
|
|
225
|
+
- **Được dịch và tối ưu hóa** cho từng ngôn ngữ.
|
|
226
|
+
- Thực hiện **nghiên cứu từ khóa** cho từng thị trường vì những gì mọi người tìm kiếm bằng tiếng Anh có thể khác với tiếng Pháp hoặc tiếng Tây Ban Nha.
|
|
227
|
+
|
|
228
|
+
### 6.2. Tiêu đề (H1, H2, H3)
|
|
229
|
+
|
|
230
|
+
Các tiêu đề của bạn nên phản ánh **cụm từ địa phương** hoặc **từ khóa** của từng khu vực. Đừng chỉ đơn giản là dịch tiêu đề tiếng Anh gốc qua Google Translate rồi xong.
|
|
231
|
+
|
|
232
|
+
### 6.3. Hình ảnh & Media
|
|
233
|
+
|
|
234
|
+
- Địa phương hóa văn bản thay thế (alt text), chú thích và tên tệp nếu cần.
|
|
235
|
+
- Sử dụng hình ảnh phù hợp với văn hóa mục tiêu.
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 7. Chuyển đổi Ngôn ngữ & Trải nghiệm Người dùng
|
|
240
|
+
|
|
241
|
+
### 7.1. Tự động chuyển hướng hay Bộ chọn ngôn ngữ?
|
|
242
|
+
|
|
243
|
+
- **Tự động chuyển hướng** (dựa trên IP hoặc cài đặt trình duyệt) có thể tiện lợi nhưng có thể gửi khách du lịch hoặc người dùng VPN đến phiên bản sai.
|
|
244
|
+
- **Bộ chọn ngôn ngữ** thường minh bạch hơn vì người dùng có thể chọn ngôn ngữ của riêng họ nếu ngôn ngữ được tự động phát hiện không chính xác.
|
|
245
|
+
|
|
246
|
+
Dưới đây là ví dụ đơn giản về Next.js + Intlayer:
|
|
247
|
+
|
|
248
|
+
```tsx
|
|
249
|
+
import { useLocation, useNavigate } from "react-router-dom";
|
|
250
|
+
import {
|
|
251
|
+
Locales,
|
|
252
|
+
getHTMLTextDir,
|
|
253
|
+
getLocaleName,
|
|
254
|
+
getLocalizedUrl,
|
|
255
|
+
} from "intlayer";
|
|
256
|
+
import { useLocale } from "react-intlayer";
|
|
257
|
+
import { type FC } from "react";
|
|
258
|
+
|
|
259
|
+
const LocaleSwitcher: FC = () => {
|
|
260
|
+
const { pathname, search } = useLocation(); // Lấy đường dẫn URL hiện tại. Ví dụ: /fr/about?foo=bar
|
|
261
|
+
const navigate = useNavigate();
|
|
262
|
+
|
|
263
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
264
|
+
onLocaleChange: (locale) => {
|
|
265
|
+
// Tạo URL với locale được cập nhật
|
|
266
|
+
// Ví dụ: /es/about?foo=bar
|
|
267
|
+
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
268
|
+
|
|
269
|
+
// Cập nhật đường dẫn URL
|
|
270
|
+
navigate(pathWithLocale);
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
return (
|
|
275
|
+
<ol>
|
|
276
|
+
{availableLocales.map((localeItem) => (
|
|
277
|
+
<li key={localeItem}>
|
|
278
|
+
<a
|
|
279
|
+
href={getLocalizedUrl(location.pathname, localeItem)}
|
|
280
|
+
hrefLang={locale === localeItem ? "x-default" : localeItem}
|
|
281
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
282
|
+
onClick={(e) => {
|
|
283
|
+
e.preventDefault();
|
|
284
|
+
setLocale(localeItem);
|
|
285
|
+
}}
|
|
286
|
+
>
|
|
287
|
+
<span>
|
|
288
|
+
{/* Ngôn ngữ - ví dụ: FR */}
|
|
289
|
+
{localeItem}
|
|
290
|
+
</span>
|
|
291
|
+
<span>
|
|
292
|
+
{/* Ngôn ngữ trong chính ngôn ngữ đó - ví dụ: Français */}
|
|
293
|
+
{getLocaleName(localeItem, locale)}
|
|
294
|
+
</span>
|
|
295
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
296
|
+
{/* Ngôn ngữ trong Locale hiện tại - ví dụ Francés với locale hiện tại đặt là Locales.SPANISH */}
|
|
297
|
+
{getLocaleName(localeItem)}
|
|
298
|
+
</span>
|
|
299
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
300
|
+
{/* Ngôn ngữ bằng tiếng Anh - ví dụ French */}
|
|
301
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
302
|
+
</span>
|
|
303
|
+
</a>
|
|
304
|
+
</li>
|
|
305
|
+
))}
|
|
306
|
+
</ol>
|
|
307
|
+
);
|
|
308
|
+
};
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### 7.2. Lưu trữ sở thích
|
|
312
|
+
|
|
313
|
+
- Lưu lựa chọn ngôn ngữ của người dùng trong **cookie** hoặc **session**.
|
|
314
|
+
- Lần sau khi họ truy cập trang web của bạn, bạn có thể tự động tải ngôn ngữ ưu tiên của họ.
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## 8. Xây dựng liên kết ngược địa phương
|
|
319
|
+
|
|
320
|
+
**Backlinks** (liên kết từ các trang web bên ngoài đến trang của bạn) vẫn là một yếu tố quan trọng trong SEO. Khi bạn vận hành một trang web đa ngôn ngữ, hãy cân nhắc:
|
|
321
|
+
|
|
322
|
+
- Tiếp cận các trang tin tức địa phương, blog hoặc diễn đàn. Ví dụ, một tên miền `.fr` trỏ đến thư mục con tiếng Pháp của bạn có thể tăng cường SEO địa phương cho tiếng Pháp.
|
|
323
|
+
- Theo dõi các backlink theo từng ngôn ngữ để xem khu vực nào cần nhiều nỗ lực PR/marketing hơn.
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## 9. Giám sát & Duy trì Trang Web Đa Ngôn Ngữ của Bạn
|
|
328
|
+
|
|
329
|
+
### 9.1. Google Analytics & Search Console
|
|
330
|
+
|
|
331
|
+
- Phân đoạn dữ liệu của bạn cho từng thư mục ngôn ngữ (`/en/`, `/fr/`, `/es/`).
|
|
332
|
+
- Chú ý đến các **lỗi thu thập dữ liệu**, **cảnh báo nội dung trùng lặp**, và **vấn đề lập chỉ mục** theo từng ngôn ngữ.
|
|
333
|
+
|
|
334
|
+
### 9.2. Cập nhật Nội dung Định kỳ
|
|
335
|
+
|
|
336
|
+
- Giữ cho bản dịch luôn mới. Nếu bạn thay đổi mô tả sản phẩm bằng tiếng Anh, hãy cập nhật nó bằng tiếng Pháp, Tây Ban Nha, v.v.
|
|
337
|
+
- Các bản dịch lỗi thời có thể gây nhầm lẫn cho khách hàng và làm giảm sự tin tưởng của người dùng.
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 10. Những Sai Lầm Thường Gặp Cần Tránh
|
|
342
|
+
|
|
343
|
+
1. **Nội Dung Dịch Máy**
|
|
344
|
+
Các bản dịch tự động mà không có sự kiểm duyệt của con người có thể chứa nhiều lỗi.
|
|
345
|
+
|
|
346
|
+
2. **Thẻ `hreflang` Sai hoặc Thiếu**
|
|
347
|
+
Công cụ tìm kiếm không thể xác định các phiên bản ngôn ngữ nếu thẻ của bạn không đầy đủ hoặc mã sai.
|
|
348
|
+
|
|
349
|
+
3. **Chuyển Đổi Ngôn Ngữ Chỉ Qua JavaScript**
|
|
350
|
+
Nếu Google không thể thu thập dữ liệu các URL riêng biệt cho từng ngôn ngữ, trang của bạn có thể không xuất hiện trong kết quả tìm kiếm địa phương chính xác.
|
|
351
|
+
|
|
352
|
+
4. **Bỏ Qua Các Khía Cạnh Văn Hóa**
|
|
353
|
+
Một câu đùa hoặc cụm từ có thể phù hợp ở một quốc gia nhưng lại gây phản cảm hoặc vô nghĩa ở quốc gia khác.
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## Kết Luận
|
|
358
|
+
|
|
359
|
+
Việc làm cho trang web của bạn đa ngôn ngữ không chỉ đơn thuần là dịch văn bản. Nó còn liên quan đến việc cấu trúc URL một cách hiệu quả, sử dụng thẻ `hreflang` để giúp các công cụ tìm kiếm phục vụ phiên bản đúng, và cung cấp trải nghiệm người dùng xuất sắc với hình ảnh địa phương hóa, bộ chọn ngôn ngữ, và điều hướng nhất quán. Tuân theo những thực hành tốt nhất này sẽ giúp bạn thành công trên thị trường toàn cầu, tăng sự hài lòng của người dùng, và cuối cùng là mang lại kết quả SEO tốt hơn trên các khu vực khác nhau.
|
|
360
|
+
|
|
361
|
+
Nếu bạn đang sử dụng Next.js (đặc biệt là App Router trong Next.js 13+), một công cụ như **Intlayer** có thể giúp đơn giản hóa toàn bộ quy trình này. Nó hỗ trợ mọi thứ từ việc tạo sitemap địa phương hóa đến tự động xử lý các liên kết `hreflang`, phát hiện ngôn ngữ, và nhiều hơn nữa để bạn có thể tập trung vào việc tạo nội dung đa ngôn ngữ chất lượng.
|
|
362
|
+
|
|
363
|
+
**Sẵn sàng vươn ra toàn cầu?** Hãy bắt đầu triển khai các chiến lược SEO và i18n ngay bây giờ, và chứng kiến những khách truy cập mới từ khắp nơi trên thế giới khám phá và tương tác với trang web của bạn!
|
|
@@ -49,10 +49,6 @@ Trong khi Intlayer cung cấp một giải pháp i18n độc lập xuất sắc
|
|
|
49
49
|
|
|
50
50
|
Hướng dẫn này sẽ chỉ cho bạn cách tận dụng hệ thống khai báo nội dung vượt trội của Intlayer trong khi vẫn duy trì khả năng tương thích với react-intl.
|
|
51
51
|
|
|
52
|
-
## Mục lục
|
|
53
|
-
|
|
54
|
-
<TOC/>
|
|
55
|
-
|
|
56
52
|
## Hướng dẫn từng bước để thiết lập Intlayer với react-intl
|
|
57
53
|
|
|
58
54
|
### Bước 1: Cài đặt các phụ thuộc
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-01-16
|
|
3
|
+
updatedAt: 2025-06-29
|
|
4
|
+
title: Công Cụ Quốc Tế Hóa (i18n) Tốt Nhất cho Drupal
|
|
5
|
+
description: Khám phá các giải pháp i18n hàng đầu cho Drupal để giải quyết các thách thức dịch thuật, tăng cường SEO và mang đến trải nghiệm web toàn cầu liền mạch.
|
|
6
|
+
keywords:
|
|
7
|
+
- Drupal
|
|
8
|
+
- i18n
|
|
9
|
+
- đa ngôn ngữ
|
|
10
|
+
- SEO
|
|
11
|
+
- Quốc tế hóa
|
|
12
|
+
- Blog
|
|
13
|
+
- JavaScript
|
|
14
|
+
slugs:
|
|
15
|
+
- blog
|
|
16
|
+
- i18n-technologies
|
|
17
|
+
- CMS
|
|
18
|
+
- drupal
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Khám Phá Các Giải Pháp i18n Để Dịch Trang Drupal Của Bạn
|
|
22
|
+
|
|
23
|
+
Trong bối cảnh kỹ thuật số ngày nay, việc mở rộng phạm vi tiếp cận trang web của bạn để phục vụ đối tượng toàn cầu là điều thiết yếu. Đối với các chủ sở hữu trang Drupal, việc triển khai các giải pháp quốc tế hóa (i18n) là chìa khóa để quản lý dịch thuật một cách hiệu quả đồng thời bảo toàn kiến trúc trang, giá trị SEO và trải nghiệm người dùng. Trong bài viết này, chúng tôi sẽ khám phá các phương pháp khác nhau từ việc tận dụng khả năng đa ngôn ngữ tích hợp sẵn của Drupal Core đến việc tích hợp các module đóng góp và các giải pháp tùy chỉnh, giúp bạn quyết định phương án nào phù hợp nhất với nhu cầu dự án của mình.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Quốc tế hóa (i18n) là gì?
|
|
28
|
+
|
|
29
|
+
Quốc tế hóa (i18n) là quá trình thiết kế trang web của bạn sao cho có thể dễ dàng thích ứng với nhiều ngôn ngữ và bối cảnh văn hóa khác nhau mà không cần phải thiết kế lại cấu trúc của nó. Trong Drupal, điều này bao gồm việc xây dựng một nền tảng nơi nội dung bao gồm các trang, bài viết, menu và các thiết lập cấu hình có thể được dịch và bản địa hóa một cách hiệu quả cho các đối tượng đa dạng.
|
|
30
|
+
|
|
31
|
+
Tìm hiểu thêm về i18n bằng cách đọc hướng dẫn toàn diện của chúng tôi: [Quốc tế hóa (i18n) là gì? Định nghĩa và những thách thức](https://github.com/aymericzip/intlayer/blob/main/docs/blog/vi/what_is_internationalization.md).
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Thách thức dịch thuật cho các trang web Drupal
|
|
36
|
+
|
|
37
|
+
Việc dịch một trang Drupal bao gồm những thách thức riêng:
|
|
38
|
+
|
|
39
|
+
- **Độ phức tạp của nội dung:** Các trang Drupal thường bao gồm nhiều loại nội dung khác nhau (node, thuật ngữ phân loại, block và thực thể tùy chỉnh) đòi hỏi quy trình dịch nhất quán.
|
|
40
|
+
- **Cân nhắc về SEO:** Việc triển khai dịch thuật đúng cách giúp cải thiện thứ hạng tìm kiếm bằng cách tận dụng URL bản địa hóa, thẻ hreflang và sơ đồ trang web theo ngôn ngữ.
|
|
41
|
+
- **Trải nghiệm người dùng:** Cung cấp bộ chuyển đổi ngôn ngữ trực quan và đảm bảo thiết kế cùng chức năng nhất quán qua các bản dịch giúp tăng tương tác của khách truy cập.
|
|
42
|
+
- **Bảo trì theo thời gian:** Khi trang web phát triển, việc giữ cho các bản dịch đồng bộ với cập nhật nội dung có thể là thách thức nếu không có công cụ và quy trình phù hợp.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Các giải pháp i18n hàng đầu cho Drupal
|
|
47
|
+
|
|
48
|
+
Dưới đây là một số phương pháp phổ biến để quản lý nội dung đa ngôn ngữ trong Drupal:
|
|
49
|
+
|
|
50
|
+
### 1. Các Module Đa ngôn ngữ Cốt lõi của Drupal
|
|
51
|
+
|
|
52
|
+
**Tổng quan:**
|
|
53
|
+
Kể từ Drupal 8, hỗ trợ đa ngôn ngữ đã trở thành một tính năng tích hợp sẵn thay vì một phần bổ sung sau này. Bằng cách kích hoạt một bộ các module cốt lõi, bạn có thể biến trang Drupal của mình thành một nền tảng đa ngôn ngữ mạnh mẽ. Bốn module thiết yếu bao gồm:
|
|
54
|
+
|
|
55
|
+
- **Module Ngôn ngữ:** Cho phép bạn thêm và quản lý các ngôn ngữ.
|
|
56
|
+
- **Module Dịch Nội dung:** Cho phép dịch các node và các loại nội dung khác.
|
|
57
|
+
- **Module Dịch Cấu hình:** Hỗ trợ dịch các cấu hình của trang web, như views và menu.
|
|
58
|
+
- **Module Dịch Giao diện:** Cung cấp bản dịch cho giao diện Drupal và các văn bản của module đóng góp.
|
|
59
|
+
|
|
60
|
+
**Các tính năng chính:**
|
|
61
|
+
|
|
62
|
+
- **Tích hợp liền mạch:** Được xây dựng trực tiếp trong lõi, các module này hoạt động hài hòa với kiến trúc của trang web bạn.
|
|
63
|
+
- **Kiểm soát chi tiết:** Quyết định loại nội dung và các phần cấu hình nào nên được dịch.
|
|
64
|
+
- **Thân thiện với SEO:** Cung cấp đường dẫn riêng theo ngôn ngữ, hỗ trợ hreflang và sơ đồ trang web địa phương hóa ngay khi cài đặt.
|
|
65
|
+
|
|
66
|
+
**Ưu điểm:**
|
|
67
|
+
|
|
68
|
+
- Không tốn thêm chi phí, vì các tính năng này đã được bao gồm trong Drupal Core.
|
|
69
|
+
- Được cộng đồng Drupal hỗ trợ và duy trì.
|
|
70
|
+
- Cung cấp cách tiếp cận đồng nhất trong quản lý bản dịch.
|
|
71
|
+
|
|
72
|
+
**Lưu ý:**
|
|
73
|
+
|
|
74
|
+
- Mặc dù mạnh mẽ, việc thiết lập ban đầu có thể phức tạp do nhiều module và cài đặt cấu hình.
|
|
75
|
+
- Các nhu cầu quy trình làm việc nâng cao có thể cần thêm công cụ bổ sung.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### 2. Công cụ Quản lý Dịch thuật (TMGMT)
|
|
80
|
+
|
|
81
|
+
**Tổng quan:**
|
|
82
|
+
Đối với các trang web cần quy trình dịch thuật được tối ưu hóa hoặc tích hợp với các dịch vụ dịch thuật chuyên nghiệp, module Translation Management Tool (TMGMT) là một bổ sung tuyệt vời cho hệ thống đa ngôn ngữ của Drupal Core.
|
|
83
|
+
|
|
84
|
+
**Các tính năng chính:**
|
|
85
|
+
|
|
86
|
+
- **Quản lý quy trình làm việc:** Cung cấp giao diện thân thiện để quản lý quy trình dịch thuật.
|
|
87
|
+
- **Tích hợp dịch vụ:** Kết nối với các dịch vụ dịch thuật chuyên nghiệp cho việc dịch tự động hoặc quản lý.
|
|
88
|
+
- **Hợp tác:** Hỗ trợ phối hợp giữa các nhóm nội bộ và các dịch giả bên ngoài.
|
|
89
|
+
|
|
90
|
+
**Ưu điểm:**
|
|
91
|
+
|
|
92
|
+
- Lý tưởng cho các trang web có cập nhật nội dung thường xuyên hoặc quy mô lớn.
|
|
93
|
+
- Nâng cao trải nghiệm đa ngôn ngữ mặc định với kiểm soát dịch thuật tốt hơn.
|
|
94
|
+
- Hỗ trợ nhiều ngôn ngữ và các quy trình dịch thuật phức tạp.
|
|
95
|
+
|
|
96
|
+
**Lưu ý:**
|
|
97
|
+
|
|
98
|
+
- Là một module đóng góp, nó yêu cầu kiểm tra tính tương thích với phiên bản Drupal của bạn.
|
|
99
|
+
- Các tính năng nâng cao có thể cần cấu hình và có thể cần một đội ngũ dịch thuật chuyên trách.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### 3. Giải pháp i18n tùy chỉnh thông qua mã nguồn
|
|
104
|
+
|
|
105
|
+
**Tổng quan:**
|
|
106
|
+
Đối với các nhà phát triển có yêu cầu đặc thù hoặc cần kiểm soát hoàn toàn, việc triển khai i18n tùy chỉnh có thể là con đường tốt nhất. Drupal cung cấp nhiều API và hook cho phép bạn tùy chỉnh chiến lược đa ngôn ngữ của mình.
|
|
107
|
+
|
|
108
|
+
**Các kỹ thuật chính:**
|
|
109
|
+
|
|
110
|
+
- **Sử dụng API của Drupal:** Tận dụng các hàm như `t()` để dịch các chuỗi trong toàn bộ theme và module.
|
|
111
|
+
- **Tích hợp REST API:** Xây dựng các endpoint tùy chỉnh để xử lý dịch động hoặc tích hợp các dịch vụ dịch thuật bên ngoài.
|
|
112
|
+
- **Quy trình làm việc tùy chỉnh:** Tạo các giải pháp riêng biệt phù hợp với kiến trúc trang web của bạn và các nhu cầu đa ngôn ngữ cụ thể.
|
|
113
|
+
|
|
114
|
+
**Ưu điểm:**
|
|
115
|
+
|
|
116
|
+
- Linh hoạt hoàn toàn để phát triển một giải pháp phù hợp chính xác với yêu cầu của bạn.
|
|
117
|
+
- Giảm sự phụ thuộc vào các module bên thứ ba, có thể cải thiện hiệu suất.
|
|
118
|
+
- Có thể tích hợp sâu với các tính năng tùy chỉnh của trang web bạn.
|
|
119
|
+
|
|
120
|
+
**Lưu ý:**
|
|
121
|
+
|
|
122
|
+
- Yêu cầu kỹ năng phát triển vững chắc và bảo trì liên tục.
|
|
123
|
+
- Giải pháp tùy chỉnh có thể làm tăng thời gian thiết lập ban đầu và độ phức tạp.
|
|
124
|
+
- Không phù hợp lý tưởng cho các dự án có nguồn lực kỹ thuật hạn chế hoặc thời hạn triển khai gấp.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Lựa chọn giải pháp i18n phù hợp cho trang Drupal của bạn
|
|
129
|
+
|
|
130
|
+
Khi quyết định phương pháp i18n cho trang Drupal của bạn, hãy xem xét các yếu tố sau:
|
|
131
|
+
|
|
132
|
+
- **Ngân sách:** Các module đa ngôn ngữ của Drupal Core được cung cấp miễn phí từ Drupal 8 trở lên, trong khi các module bổ sung như TMGMT có thể phát sinh chi phí (cho dịch vụ dịch thuật hoặc các tính năng nâng cao).
|
|
133
|
+
- **Chuyên môn kỹ thuật:** Người không phải là nhà phát triển có thể đánh giá cao các tính năng mạnh mẽ, sẵn có của Drupal Core, trong khi các nhà phát triển có thể ưu tiên sự chính xác mà các giải pháp tùy chỉnh mang lại.
|
|
134
|
+
- **Độ phức tạp và quy mô trang web:** Đối với các trang web phức tạp với nhiều loại nội dung và yêu cầu SEO nâng cao, việc tận dụng các module cốt lõi của Drupal cùng với TMGMT có thể là lựa chọn lý tưởng. Đối với các trang web nhỏ hơn hoặc đơn giản hơn, chỉ các module cốt lõi có thể là đủ.
|
|
135
|
+
- **Bảo trì và phát triển tương lai:** Đảm bảo rằng giải pháp bạn chọn có khả năng mở rộng và có thể thích ứng với các thay đổi trong nội dung hoặc thiết kế trong tương lai mà không gây tốn kém đáng kể.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Kết luận
|
|
140
|
+
|
|
141
|
+
Việc dịch trang Drupal của bạn không chỉ đơn thuần là chuyển đổi văn bản mà còn là kết nối với khán giả toàn cầu, nâng cao trải nghiệm người dùng và tối ưu hóa hiệu suất tìm kiếm quốc tế. Dù bạn tận dụng các tính năng đa ngôn ngữ mạnh mẽ được tích hợp trong Drupal Core, bổ sung chúng với Công cụ Quản lý Dịch thuật (Translation Management Tool), hay đầu tư vào một giải pháp mã hóa tùy chỉnh, điều quan trọng là chọn một phương pháp phù hợp với mục tiêu dự án và nguồn lực của bạn.
|
|
142
|
+
|
|
143
|
+
Bằng cách đánh giá kỹ lưỡng các lựa chọn và lên kế hoạch bảo trì lâu dài, bạn có thể tạo ra một trang Drupal đa ngôn ngữ có khả năng mở rộng, hiệu quả trong việc kết nối với người dùng trên toàn thế giới. Chúc bạn dịch thuật thành công và chúc trang web của bạn thành công trên thị trường quốc tế!
|