@intlayer/docs 5.5.11 → 5.6.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/intlayer_with_next-intl.md +0 -1
- package/blog/ar/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ar/what_is_internationalization.md +2 -2
- package/blog/de/intlayer_with_next-intl.md +0 -1
- package/blog/de/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/de/what_is_internationalization.md +2 -2
- package/blog/en/intlayer_with_next-intl.md +0 -1
- package/blog/en/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/en/what_is_internationalization.md +2 -2
- package/blog/en-GB/intlayer_with_next-intl.md +0 -1
- package/blog/en-GB/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/en-GB/what_is_internationalization.md +2 -2
- package/blog/es/intlayer_with_next-intl.md +0 -1
- package/blog/es/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/es/what_is_internationalization.md +2 -2
- package/blog/fr/intlayer_with_next-intl.md +0 -1
- package/blog/fr/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/fr/what_is_internationalization.md +2 -2
- package/blog/hi/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/hi/what_is_internationalization.md +2 -2
- package/blog/it/intlayer_with_next-intl.md +0 -1
- package/blog/it/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/it/what_is_internationalization.md +2 -2
- package/blog/ja/intlayer_with_next-intl.md +0 -1
- package/blog/ja/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ja/what_is_internationalization.md +2 -2
- package/blog/ko/intlayer_with_next-intl.md +0 -1
- package/blog/ko/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/pt/intlayer_with_next-intl.md +0 -1
- package/blog/pt/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/pt/what_is_internationalization.md +2 -2
- package/blog/ru/intlayer_with_next-intl.md +0 -1
- package/blog/ru/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ru/what_is_internationalization.md +2 -2
- package/blog/zh/intlayer_with_next-intl.md +0 -1
- package/blog/zh/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/zh/what_is_internationalization.md +2 -2
- package/dist/cjs/blog.cjs +2 -2
- package/dist/cjs/blog.cjs.map +1 -1
- package/dist/cjs/common.cjs +17 -6
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/doc.cjs +2 -2
- package/dist/cjs/doc.cjs.map +1 -1
- package/dist/cjs/frequentQuestions.cjs +2 -2
- package/dist/cjs/frequentQuestions.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +1152 -252
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +3778 -1124
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +794 -161
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +32 -31
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/cjs/legal.cjs +2 -2
- package/dist/cjs/legal.cjs.map +1 -1
- package/dist/esm/blog.mjs +2 -2
- package/dist/esm/blog.mjs.map +1 -1
- package/dist/esm/common.mjs +17 -6
- package/dist/esm/common.mjs.map +1 -1
- package/dist/esm/doc.mjs +2 -2
- package/dist/esm/doc.mjs.map +1 -1
- package/dist/esm/frequentQuestions.mjs +2 -2
- package/dist/esm/frequentQuestions.mjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +1151 -252
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +3777 -1124
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +793 -161
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +31 -31
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/esm/legal.mjs +2 -2
- package/dist/esm/legal.mjs.map +1 -1
- package/dist/types/blog.d.ts +2 -2
- package/dist/types/blog.d.ts.map +1 -1
- package/dist/types/common.d.ts +5 -2
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/doc.d.ts +2 -2
- package/dist/types/doc.d.ts.map +1 -1
- package/dist/types/frequentQuestions.d.ts +2 -2
- package/dist/types/frequentQuestions.d.ts.map +1 -1
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/dist/types/legal.d.ts +2 -2
- package/dist/types/legal.d.ts.map +1 -1
- package/docs/ar/intlayer_CMS.md +1 -0
- package/docs/ar/intlayer_cli.md +292 -177
- package/docs/ar/intlayer_visual_editor.md +1 -0
- package/docs/ar/intlayer_with_angular.md +1 -0
- package/docs/ar/intlayer_with_create_react_app.md +1 -0
- package/docs/ar/intlayer_with_lynx+react.md +1 -0
- package/docs/ar/intlayer_with_nextjs_14.md +1 -0
- package/docs/ar/intlayer_with_nextjs_15.md +3 -1
- package/docs/ar/intlayer_with_nuxt.md +1 -0
- package/docs/ar/intlayer_with_react_native+expo.md +1 -0
- package/docs/ar/intlayer_with_vite+preact.md +4 -3
- package/docs/ar/intlayer_with_vite+react.md +108 -112
- package/docs/ar/intlayer_with_vite+solid.md +4 -3
- package/docs/ar/intlayer_with_vite+svelte.md +4 -3
- package/docs/ar/intlayer_with_vite+vue.md +5 -4
- package/docs/ar/mcp_server.md +126 -92
- package/docs/de/intlayer_CMS.md +1 -0
- package/docs/de/intlayer_cli.md +291 -171
- package/docs/de/intlayer_visual_editor.md +1 -0
- package/docs/de/intlayer_with_angular.md +1 -0
- package/docs/de/intlayer_with_create_react_app.md +1 -0
- package/docs/de/intlayer_with_lynx+react.md +1 -0
- package/docs/de/intlayer_with_nextjs_14.md +1 -0
- package/docs/de/intlayer_with_nextjs_15.md +3 -1
- package/docs/de/intlayer_with_nuxt.md +1 -0
- package/docs/de/intlayer_with_react_native+expo.md +1 -0
- package/docs/de/intlayer_with_vite+preact.md +4 -3
- package/docs/de/intlayer_with_vite+react.md +128 -146
- package/docs/de/intlayer_with_vite+solid.md +4 -3
- package/docs/de/intlayer_with_vite+svelte.md +4 -3
- package/docs/de/intlayer_with_vite+vue.md +5 -4
- package/docs/de/mcp_server.md +116 -112
- package/docs/en/CI_CD.md +3 -1
- package/docs/en/autoFill.md +3 -1
- package/docs/en/configuration.md +7 -3
- package/docs/en/dictionary/condition.md +3 -1
- package/docs/en/dictionary/content_extention_customization.md +3 -1
- package/docs/en/dictionary/enumeration.md +3 -1
- package/docs/en/dictionary/file.md +3 -1
- package/docs/en/dictionary/function_fetching.md +3 -1
- package/docs/en/dictionary/get_started.md +3 -1
- package/docs/en/dictionary/insertion.md +3 -1
- package/docs/en/dictionary/markdown.md +3 -1
- package/docs/en/dictionary/nesting.md +3 -1
- package/docs/en/dictionary/translation.md +3 -1
- package/docs/en/how_works_intlayer.md +3 -1
- package/docs/en/index.md +3 -1
- package/docs/en/interest_of_intlayer.md +3 -1
- package/docs/en/intlayer_CMS.md +4 -1
- package/docs/en/intlayer_cli.md +246 -136
- package/docs/en/intlayer_visual_editor.md +4 -1
- package/docs/en/intlayer_with_angular.md +4 -1
- package/docs/en/intlayer_with_create_react_app.md +4 -1
- package/docs/en/intlayer_with_express.md +3 -1
- package/docs/en/intlayer_with_lynx+react.md +4 -1
- package/docs/en/intlayer_with_nextjs_14.md +7 -1
- package/docs/en/intlayer_with_nextjs_15.md +8 -2
- package/docs/en/intlayer_with_nextjs_page_router.md +5 -1
- package/docs/en/intlayer_with_nuxt.md +4 -1
- package/docs/en/intlayer_with_react_native+expo.md +4 -1
- package/docs/en/intlayer_with_vite+preact.md +9 -4
- package/docs/en/intlayer_with_vite+react.md +18 -10
- package/docs/en/intlayer_with_vite+solid.md +7 -4
- package/docs/en/intlayer_with_vite+svelte.md +7 -4
- package/docs/en/intlayer_with_vite+vue.md +10 -5
- package/docs/en/introduction.md +3 -1
- package/docs/en/mcp_server.md +114 -80
- package/docs/en/packages/@intlayer/api/index.md +3 -1
- package/docs/en/packages/@intlayer/chokidar/index.md +3 -1
- package/docs/en/packages/@intlayer/cli/index.md +3 -1
- package/docs/en/packages/@intlayer/config/index.md +3 -1
- package/docs/en/packages/@intlayer/core/index.md +3 -1
- package/docs/en/packages/@intlayer/design-system/index.md +3 -1
- package/docs/en/packages/@intlayer/dictionary-entry/index.md +3 -1
- package/docs/en/packages/@intlayer/editor/index.md +3 -1
- package/docs/en/packages/@intlayer/editor-react/index.md +3 -1
- package/docs/en/packages/@intlayer/webpack/index.md +3 -1
- package/docs/en/packages/angular-intlayer/index.md +3 -1
- package/docs/en/packages/express-intlayer/index.md +3 -1
- package/docs/en/packages/express-intlayer/t.md +3 -1
- package/docs/en/packages/intlayer/getConfiguration.md +3 -1
- package/docs/en/packages/intlayer/getEnumeration.md +3 -1
- package/docs/en/packages/intlayer/getHTMLTextDir.md +3 -1
- package/docs/en/packages/intlayer/getLocaleLang.md +3 -1
- package/docs/en/packages/intlayer/getLocaleName.md +3 -1
- package/docs/en/packages/intlayer/getLocalizedUrl.md +3 -1
- package/docs/en/packages/intlayer/getMultilingualUrls.md +3 -1
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +3 -1
- package/docs/en/packages/intlayer/getTranslation.md +3 -1
- package/docs/en/packages/intlayer/getTranslationContent.md +3 -1
- package/docs/en/packages/intlayer/index.md +3 -1
- package/docs/en/packages/intlayer-cli/index.md +3 -1
- package/docs/en/packages/intlayer-editor/index.md +3 -1
- package/docs/en/packages/lynx-intlayer/index.md +3 -1
- package/docs/en/packages/next-intlayer/index.md +3 -1
- package/docs/en/packages/next-intlayer/t.md +3 -1
- package/docs/en/packages/next-intlayer/useDictionary.md +3 -1
- package/docs/en/packages/next-intlayer/useIntlayer.md +3 -1
- package/docs/en/packages/next-intlayer/useIntlayerAsync.md +3 -1
- package/docs/en/packages/next-intlayer/useLocale.md +3 -1
- package/docs/en/packages/nuxt-intlayer/index.md +3 -1
- package/docs/en/packages/preact-intlayer/index.md +3 -1
- package/docs/en/packages/react-intlayer/index.md +3 -1
- package/docs/en/packages/react-intlayer/t.md +3 -1
- package/docs/en/packages/react-intlayer/useDictionary.md +3 -1
- package/docs/en/packages/react-intlayer/useIntlayer.md +3 -1
- package/docs/en/packages/react-intlayer/useIntlayerAsync.md +3 -1
- package/docs/en/packages/react-intlayer/useLocale.md +3 -1
- package/docs/en/packages/react-native-intlayer/index.md +3 -1
- package/docs/en/packages/react-scripts-intlayer/index.md +3 -1
- package/docs/en/packages/solid-intlayer/index.md +3 -1
- package/docs/en/packages/svelte-intlayer/index.md +3 -1
- package/docs/en/packages/vite-intlayer/index.md +3 -1
- package/docs/en/packages/vue-intlayer/index.md +3 -1
- package/docs/en/per_locale_file.md +3 -1
- package/docs/en/roadmap.md +5 -2
- package/docs/en/vs_code_extension.md +3 -1
- package/docs/en-GB/intlayer_CMS.md +1 -0
- package/docs/en-GB/intlayer_cli.md +257 -138
- package/docs/en-GB/intlayer_visual_editor.md +1 -0
- package/docs/en-GB/intlayer_with_angular.md +1 -0
- package/docs/en-GB/intlayer_with_create_react_app.md +1 -0
- package/docs/en-GB/intlayer_with_lynx+react.md +1 -0
- package/docs/en-GB/intlayer_with_nextjs_14.md +1 -0
- package/docs/en-GB/intlayer_with_nextjs_15.md +3 -1
- package/docs/en-GB/intlayer_with_nuxt.md +1 -0
- package/docs/en-GB/intlayer_with_react_native+expo.md +1 -0
- package/docs/en-GB/intlayer_with_vite+preact.md +4 -3
- package/docs/en-GB/intlayer_with_vite+react.md +71 -87
- package/docs/en-GB/intlayer_with_vite+solid.md +4 -3
- package/docs/en-GB/intlayer_with_vite+svelte.md +4 -3
- package/docs/en-GB/intlayer_with_vite+vue.md +5 -4
- package/docs/en-GB/mcp_server.md +116 -82
- package/docs/es/intlayer_CMS.md +1 -0
- package/docs/es/intlayer_cli.md +283 -164
- package/docs/es/intlayer_visual_editor.md +1 -0
- package/docs/es/intlayer_with_angular.md +1 -0
- package/docs/es/intlayer_with_create_react_app.md +1 -0
- package/docs/es/intlayer_with_lynx+react.md +1 -0
- package/docs/es/intlayer_with_nextjs_14.md +1 -0
- package/docs/es/intlayer_with_nextjs_15.md +3 -1
- package/docs/es/intlayer_with_nuxt.md +1 -0
- package/docs/es/intlayer_with_react_native+expo.md +1 -0
- package/docs/es/intlayer_with_vite+preact.md +4 -3
- package/docs/es/intlayer_with_vite+react.md +98 -98
- package/docs/es/intlayer_with_vite+solid.md +4 -3
- package/docs/es/intlayer_with_vite+svelte.md +4 -3
- package/docs/es/intlayer_with_vite+vue.md +5 -4
- package/docs/es/mcp_server.md +120 -86
- package/docs/es/vs_code_extension.md +1 -0
- package/docs/fr/intlayer_CMS.md +1 -0
- package/docs/fr/intlayer_cli.md +280 -184
- package/docs/fr/intlayer_visual_editor.md +1 -0
- package/docs/fr/intlayer_with_angular.md +1 -0
- package/docs/fr/intlayer_with_create_react_app.md +1 -0
- package/docs/fr/intlayer_with_lynx+react.md +1 -0
- package/docs/fr/intlayer_with_nextjs_14.md +1 -0
- package/docs/fr/intlayer_with_nextjs_15.md +3 -1
- package/docs/fr/intlayer_with_nuxt.md +1 -0
- package/docs/fr/intlayer_with_react_native+expo.md +1 -0
- package/docs/fr/intlayer_with_vite+preact.md +5 -4
- package/docs/fr/intlayer_with_vite+react.md +80 -69
- package/docs/fr/intlayer_with_vite+solid.md +4 -3
- package/docs/fr/intlayer_with_vite+svelte.md +4 -3
- package/docs/fr/intlayer_with_vite+vue.md +5 -4
- package/docs/fr/mcp_server.md +121 -87
- package/docs/hi/intlayer_CMS.md +1 -0
- package/docs/hi/intlayer_cli.md +295 -174
- package/docs/hi/intlayer_visual_editor.md +1 -0
- package/docs/hi/intlayer_with_angular.md +1 -0
- package/docs/hi/intlayer_with_create_react_app.md +1 -0
- package/docs/hi/intlayer_with_lynx+react.md +1 -0
- package/docs/hi/intlayer_with_nextjs_14.md +1 -0
- package/docs/hi/intlayer_with_nextjs_15.md +3 -1
- package/docs/hi/intlayer_with_nuxt.md +1 -0
- package/docs/hi/intlayer_with_react_native+expo.md +1 -0
- package/docs/hi/intlayer_with_vite+preact.md +4 -3
- package/docs/hi/intlayer_with_vite+react.md +114 -111
- package/docs/hi/intlayer_with_vite+solid.md +4 -3
- package/docs/hi/intlayer_with_vite+svelte.md +4 -3
- package/docs/hi/intlayer_with_vite+vue.md +5 -4
- package/docs/hi/mcp_server.md +118 -84
- package/docs/it/intlayer_CMS.md +1 -0
- package/docs/it/intlayer_cli.md +282 -167
- package/docs/it/intlayer_visual_editor.md +1 -0
- package/docs/it/intlayer_with_angular.md +1 -0
- package/docs/it/intlayer_with_create_react_app.md +1 -0
- package/docs/it/intlayer_with_lynx+react.md +1 -0
- package/docs/it/intlayer_with_nextjs_14.md +1 -0
- package/docs/it/intlayer_with_nextjs_15.md +3 -1
- package/docs/it/intlayer_with_nuxt.md +1 -0
- package/docs/it/intlayer_with_react_native+expo.md +1 -0
- package/docs/it/intlayer_with_vite+preact.md +4 -3
- package/docs/it/intlayer_with_vite+react.md +163 -116
- package/docs/it/intlayer_with_vite+solid.md +4 -3
- package/docs/it/intlayer_with_vite+svelte.md +4 -3
- package/docs/it/intlayer_with_vite+vue.md +4 -4
- package/docs/it/mcp_server.md +120 -86
- package/docs/ja/intlayer_CMS.md +1 -0
- package/docs/ja/intlayer_cli.md +285 -168
- package/docs/ja/intlayer_visual_editor.md +1 -0
- package/docs/ja/intlayer_with_angular.md +1 -0
- package/docs/ja/intlayer_with_create_react_app.md +1 -0
- package/docs/ja/intlayer_with_lynx+react.md +1 -0
- package/docs/ja/intlayer_with_nextjs_14.md +1 -0
- package/docs/ja/intlayer_with_nextjs_15.md +3 -1
- package/docs/ja/intlayer_with_nuxt.md +1 -0
- package/docs/ja/intlayer_with_react_native+expo.md +1 -0
- package/docs/ja/intlayer_with_vite+preact.md +4 -3
- package/docs/ja/intlayer_with_vite+react.md +160 -222
- package/docs/ja/intlayer_with_vite+solid.md +4 -3
- package/docs/ja/intlayer_with_vite+svelte.md +4 -3
- package/docs/ja/intlayer_with_vite+vue.md +5 -4
- package/docs/ja/mcp_server.md +121 -85
- package/docs/ko/intlayer_CMS.md +1 -0
- package/docs/ko/intlayer_cli.md +291 -175
- package/docs/ko/intlayer_visual_editor.md +1 -0
- package/docs/ko/intlayer_with_angular.md +1 -0
- package/docs/ko/intlayer_with_create_react_app.md +1 -0
- package/docs/ko/intlayer_with_lynx+react.md +1 -0
- package/docs/ko/intlayer_with_nextjs_14.md +1 -0
- package/docs/ko/intlayer_with_nextjs_15.md +3 -1
- package/docs/ko/intlayer_with_nuxt.md +1 -0
- package/docs/ko/intlayer_with_react_native+expo.md +1 -0
- package/docs/ko/intlayer_with_vite+preact.md +4 -3
- package/docs/ko/intlayer_with_vite+react.md +123 -152
- package/docs/ko/intlayer_with_vite+solid.md +4 -3
- package/docs/ko/intlayer_with_vite+svelte.md +4 -3
- package/docs/ko/intlayer_with_vite+vue.md +5 -4
- package/docs/ko/mcp_server.md +117 -83
- package/docs/ko/packages/intlayer/getLocalizedUrl.md +1 -23
- package/docs/pt/intlayer_CMS.md +1 -0
- package/docs/pt/intlayer_cli.md +274 -154
- package/docs/pt/intlayer_visual_editor.md +1 -0
- package/docs/pt/intlayer_with_angular.md +1 -0
- package/docs/pt/intlayer_with_create_react_app.md +1 -0
- package/docs/pt/intlayer_with_lynx+react.md +1 -0
- package/docs/pt/intlayer_with_nextjs_14.md +1 -0
- package/docs/pt/intlayer_with_nextjs_15.md +3 -1
- package/docs/pt/intlayer_with_nuxt.md +1 -0
- package/docs/pt/intlayer_with_react_native+expo.md +1 -0
- package/docs/pt/intlayer_with_vite+preact.md +4 -3
- package/docs/pt/intlayer_with_vite+react.md +117 -136
- package/docs/pt/intlayer_with_vite+solid.md +4 -3
- package/docs/pt/intlayer_with_vite+svelte.md +4 -3
- package/docs/pt/intlayer_with_vite+vue.md +4 -4
- package/docs/pt/mcp_server.md +121 -87
- package/docs/ru/intlayer_CMS.md +1 -0
- package/docs/ru/intlayer_cli.md +287 -170
- package/docs/ru/intlayer_visual_editor.md +1 -0
- package/docs/ru/intlayer_with_angular.md +1 -0
- package/docs/ru/intlayer_with_create_react_app.md +1 -0
- package/docs/ru/intlayer_with_lynx+react.md +1 -0
- package/docs/ru/intlayer_with_nextjs_14.md +1 -0
- package/docs/ru/intlayer_with_nextjs_15.md +3 -1
- package/docs/ru/intlayer_with_nuxt.md +1 -0
- package/docs/ru/intlayer_with_react_native+expo.md +1 -0
- package/docs/ru/intlayer_with_vite+preact.md +4 -3
- package/docs/ru/intlayer_with_vite+react.md +105 -87
- package/docs/ru/intlayer_with_vite+solid.md +4 -3
- package/docs/ru/intlayer_with_vite+svelte.md +4 -3
- package/docs/ru/intlayer_with_vite+vue.md +5 -4
- package/docs/ru/mcp_server.md +119 -85
- package/docs/zh/intlayer_CMS.md +1 -0
- package/docs/zh/intlayer_cli.md +275 -155
- package/docs/zh/intlayer_visual_editor.md +1 -0
- package/docs/zh/intlayer_with_angular.md +1 -0
- package/docs/zh/intlayer_with_create_react_app.md +1 -0
- package/docs/zh/intlayer_with_lynx+react.md +1 -0
- package/docs/zh/intlayer_with_nextjs_14.md +1 -0
- package/docs/zh/intlayer_with_nextjs_15.md +3 -1
- package/docs/zh/intlayer_with_nuxt.md +1 -0
- package/docs/zh/intlayer_with_react_native+expo.md +1 -0
- package/docs/zh/intlayer_with_vite+preact.md +4 -3
- package/docs/zh/intlayer_with_vite+react.md +154 -188
- package/docs/zh/intlayer_with_vite+solid.md +4 -3
- package/docs/zh/intlayer_with_vite+svelte.md +4 -3
- package/docs/zh/intlayer_with_vite+vue.md +5 -4
- package/docs/zh/mcp_server.md +119 -86
- package/docs/zh/packages/intlayer/getLocalizedUrl.md +1 -23
- package/frequent_questions/ar/build_error_CI_CD.md +75 -0
- package/frequent_questions/de/build_error_CI_CD.md +75 -0
- package/frequent_questions/en/build_error_CI_CD.md +75 -0
- package/frequent_questions/en-GB/build_error_CI_CD.md +75 -0
- package/frequent_questions/es/build_error_CI_CD.md +75 -0
- package/frequent_questions/fr/build_error_CI_CD.md +75 -0
- package/frequent_questions/hi/build_error_CI_CD.md +75 -0
- package/frequent_questions/it/build_error_CI_CD.md +75 -0
- package/frequent_questions/ja/build_error_CI_CD.md +75 -0
- package/frequent_questions/ja/intlayer_command_undefined.md +3 -3
- package/frequent_questions/ko/build_error_CI_CD.md +75 -0
- package/frequent_questions/ko/intlayer_command_undefined.md +3 -3
- package/frequent_questions/pt/build_error_CI_CD.md +75 -0
- package/frequent_questions/ru/build_error_CI_CD.md +75 -0
- package/frequent_questions/zh/build_error_CI_CD.md +75 -0
- package/frequent_questions/zh/intlayer_command_undefined.md +3 -3
- package/legal/ar/privacy_notice.md +83 -0
- package/legal/ar/terms_of_service.md +55 -0
- package/legal/de/privacy_notice.md +83 -0
- package/legal/de/terms_of_service.md +55 -0
- package/legal/en/privacy_notice.md +83 -0
- package/legal/en/terms_of_service.md +55 -0
- package/legal/en-GB/privacy_notice.md +83 -0
- package/legal/en-GB/terms_of_service.md +55 -0
- package/legal/es/privacy_notice.md +83 -0
- package/legal/es/terms_of_service.md +55 -0
- package/legal/fr/privacy_notice.md +83 -0
- package/legal/fr/terms_of_service.md +55 -0
- package/legal/hi/privacy_notice.md +83 -0
- package/legal/hi/terms_of_service.md +55 -0
- package/legal/it/privacy_notice.md +83 -0
- package/legal/it/terms_of_service.md +55 -0
- package/legal/ja/privacy_notice.md +83 -0
- package/legal/ja/terms_of_service.md +55 -0
- package/legal/ko/privacy_notice.md +83 -0
- package/legal/ko/terms_of_service.md +55 -0
- package/legal/pt/privacy_notice.md +83 -0
- package/legal/pt/terms_of_service.md +55 -0
- package/legal/ru/privacy_notice.md +83 -0
- package/legal/ru/terms_of_service.md +55 -0
- package/legal/zh/privacy_notice.md +83 -0
- package/legal/zh/terms_of_service.md +55 -0
- package/package.json +12 -11
- package/src/blog.ts +6 -4
- package/src/common.ts +25 -7
- package/src/doc.ts +6 -4
- package/src/frequentQuestions.ts +6 -4
- package/src/generated/blog.entry.ts +1177 -280
- package/src/generated/docs.entry.ts +3868 -1217
- package/src/generated/frequentQuestions.entry.ts +808 -178
- package/src/generated/legal.entry.ts +34 -36
- package/src/legal.ts +6 -4
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt:
|
|
3
|
-
updatedAt:
|
|
4
|
-
title:
|
|
5
|
-
description: Узнайте, как
|
|
2
|
+
createdAt: 2024-03-07
|
|
3
|
+
updatedAt: 2024-03-07
|
|
4
|
+
title: Начало работы с Intlayer в Vite + React
|
|
5
|
+
description: Узнайте, как добавить интернационализацию (i18n) в ваше приложение на Vite и React с помощью Intlayer. Следуйте этому руководству, чтобы сделать ваше приложение многоязычным.
|
|
6
6
|
keywords:
|
|
7
7
|
- Интернационализация
|
|
8
8
|
- Документация
|
|
9
9
|
- Intlayer
|
|
10
10
|
- Vite
|
|
11
11
|
- React
|
|
12
|
-
-
|
|
12
|
+
- i18n
|
|
13
13
|
- JavaScript
|
|
14
14
|
slugs:
|
|
15
15
|
- doc
|
|
16
16
|
- environment
|
|
17
|
-
-
|
|
18
|
-
|
|
17
|
+
- vite-and-react
|
|
18
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-vite-react-template
|
|
19
|
+
youtubeVideo: https://www.youtube.com/watch?v=dS9L7uJeak4---
|
|
19
20
|
|
|
20
21
|
# Начало работы с интернационализацией (i18n) с Intlayer, Vite и React
|
|
21
22
|
|
|
23
|
+
<iframe title="The best i18n solution for Vite and React? Discover Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/dS9L7uJeak4?si=VaKmrYMmXjo3xpk2"/>
|
|
24
|
+
|
|
22
25
|
Смотрите [шаблон приложения](https://github.com/aymericzip/intlayer-vite-react-template) на GitHub.
|
|
23
26
|
|
|
24
27
|
## Что такое Intlayer?
|
|
@@ -27,10 +30,10 @@ slugs:
|
|
|
27
30
|
|
|
28
31
|
С помощью Intlayer вы можете:
|
|
29
32
|
|
|
30
|
-
- **Легко
|
|
31
|
-
- **Динамически
|
|
32
|
-
-
|
|
33
|
-
-
|
|
33
|
+
- **Легко управляйте переводами** с помощью декларативных словарей на уровне компонентов.
|
|
34
|
+
- **Динамически локализуйте метаданные**, маршруты и контент.
|
|
35
|
+
- **Обеспечьте поддержку TypeScript** с автогенерируемыми типами, улучшая автозаполнение и обнаружение ошибок.
|
|
36
|
+
- **Воспользуйтесь расширенными возможностями**, такими как динамическое определение и переключение локали.
|
|
34
37
|
|
|
35
38
|
---
|
|
36
39
|
|
|
@@ -42,28 +45,28 @@ slugs:
|
|
|
42
45
|
|
|
43
46
|
```bash packageManager="npm"
|
|
44
47
|
npm install intlayer react-intlayer
|
|
45
|
-
npm install --save-dev
|
|
48
|
+
npm install vite-intlayer --save-dev
|
|
46
49
|
```
|
|
47
50
|
|
|
48
51
|
```bash packageManager="pnpm"
|
|
49
52
|
pnpm add intlayer react-intlayer
|
|
50
|
-
pnpm add --save-dev
|
|
53
|
+
pnpm add vite-intlayer --save-dev
|
|
51
54
|
```
|
|
52
55
|
|
|
53
56
|
```bash packageManager="yarn"
|
|
54
57
|
yarn add intlayer react-intlayer
|
|
55
|
-
yarn add --save-dev
|
|
58
|
+
yarn add vite-intlayer --save-dev
|
|
56
59
|
```
|
|
57
60
|
|
|
58
61
|
- **intlayer**
|
|
59
62
|
|
|
60
|
-
Основной пакет,
|
|
63
|
+
Основной пакет, предоставляющий инструменты интернационализации для управления конфигурацией, перевода, [объявления контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md), транспиляции и [CLI-команд](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/intlayer_cli.md).
|
|
61
64
|
|
|
62
65
|
- **react-intlayer**
|
|
63
66
|
Пакет, который интегрирует Intlayer с приложением на React. Он предоставляет провайдеры контекста и хуки для интернационализации в React.
|
|
64
67
|
|
|
65
68
|
- **vite-intlayer**
|
|
66
|
-
Включает плагин Vite для интеграции Intlayer с [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также промежуточное ПО для определения предпочтительной локали пользователя, управления
|
|
69
|
+
Включает плагин Vite для интеграции Intlayer с [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также промежуточное ПО для определения предпочтительной локали пользователя, управления куки и обработки перенаправления URL.
|
|
67
70
|
|
|
68
71
|
### Шаг 2: Конфигурация вашего проекта
|
|
69
72
|
|
|
@@ -91,7 +94,6 @@ export default config;
|
|
|
91
94
|
import { Locales } from "intlayer";
|
|
92
95
|
|
|
93
96
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
94
|
-
// Конфигурация для интернационализации приложения
|
|
95
97
|
const config = {
|
|
96
98
|
internationalization: {
|
|
97
99
|
locales: [
|
|
@@ -111,7 +113,6 @@ export default config;
|
|
|
111
113
|
const { Locales } = require("intlayer");
|
|
112
114
|
|
|
113
115
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
114
|
-
// Конфигурация для интернационализации приложения
|
|
115
116
|
const config = {
|
|
116
117
|
internationalization: {
|
|
117
118
|
locales: [
|
|
@@ -127,7 +128,7 @@ const config = {
|
|
|
127
128
|
module.exports = config;
|
|
128
129
|
```
|
|
129
130
|
|
|
130
|
-
> Через этот файл конфигурации вы можете настроить локализованные URL-адреса, перенаправление в
|
|
131
|
+
> Через этот файл конфигурации вы можете настроить локализованные URL-адреса, перенаправление в промежуточном ПО, имена cookie, расположение и расширение ваших деклараций контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md).
|
|
131
132
|
|
|
132
133
|
### Шаг 3: Интеграция Intlayer в вашу конфигурацию Vite
|
|
133
134
|
|
|
@@ -166,7 +167,7 @@ module.exports = defineConfig({
|
|
|
166
167
|
});
|
|
167
168
|
```
|
|
168
169
|
|
|
169
|
-
> Плагин Vite `intlayerPlugin()` используется для интеграции Intlayer с Vite. Он обеспечивает
|
|
170
|
+
> Плагин Vite `intlayerPlugin()` используется для интеграции Intlayer с Vite. Он обеспечивает создание файлов деклараций контента и отслеживает их в режиме разработки. Он определяет переменные окружения Intlayer внутри приложения Vite. Кроме того, он предоставляет алиасы для оптимизации производительности.
|
|
170
171
|
|
|
171
172
|
### Шаг 4: Объявите Ваш Контент
|
|
172
173
|
|
|
@@ -235,12 +236,12 @@ const appContent = {
|
|
|
235
236
|
key: "app",
|
|
236
237
|
content: {
|
|
237
238
|
viteLogo: t({
|
|
238
|
-
en: "Vite
|
|
239
|
+
en: "Логотип Vite",
|
|
239
240
|
fr: "Logo Vite",
|
|
240
241
|
es: "Logo Vite",
|
|
241
242
|
}),
|
|
242
243
|
reactLogo: t({
|
|
243
|
-
en: "React
|
|
244
|
+
en: "Логотип React",
|
|
244
245
|
fr: "Logo React",
|
|
245
246
|
es: "Logo React",
|
|
246
247
|
}),
|
|
@@ -248,7 +249,7 @@ const appContent = {
|
|
|
248
249
|
title: "Vite + React",
|
|
249
250
|
|
|
250
251
|
count: t({
|
|
251
|
-
en: "
|
|
252
|
+
en: "счет: ",
|
|
252
253
|
fr: "le compte est ",
|
|
253
254
|
es: "el recuento es ",
|
|
254
255
|
}),
|
|
@@ -316,10 +317,10 @@ const appContent = {
|
|
|
316
317
|
t <
|
|
317
318
|
ReactNode >
|
|
318
319
|
{
|
|
319
|
-
// Не забудьте импортировать React, если используете React node в вашем контенте
|
|
320
|
+
// Не забудьте импортировать React, если вы используете React node в вашем контенте
|
|
320
321
|
en: (
|
|
321
322
|
<>
|
|
322
|
-
Edit <code>src/App.tsx</code>
|
|
323
|
+
Edit <code>src/App.tsx</code> and save to test HMR
|
|
323
324
|
</>
|
|
324
325
|
),
|
|
325
326
|
fr: (
|
|
@@ -329,8 +330,7 @@ const appContent = {
|
|
|
329
330
|
),
|
|
330
331
|
es: (
|
|
331
332
|
<>
|
|
332
|
-
|
|
333
|
-
протестировать HMR
|
|
333
|
+
Edita <code>src/App.tsx</code> y guarda para probar HMR
|
|
334
334
|
</>
|
|
335
335
|
),
|
|
336
336
|
},
|
|
@@ -394,7 +394,7 @@ module.exports = appContent;
|
|
|
394
394
|
"en": "Edit src/App.tsx and save to test HMR",
|
|
395
395
|
"fr": "Éditez src/App.tsx et enregistrez pour tester HMR",
|
|
396
396
|
"es": "Edita src/App.tsx y guarda para probar HMR",
|
|
397
|
-
"ru": "
|
|
397
|
+
"ru": "Отредактируйте src/App.tsx и сохраните, чтобы проверить HMR"
|
|
398
398
|
}
|
|
399
399
|
},
|
|
400
400
|
"readTheDocs": {
|
|
@@ -411,7 +411,7 @@ module.exports = appContent;
|
|
|
411
411
|
|
|
412
412
|
> Для получения дополнительной информации обратитесь к [документации по объявлениям контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md).
|
|
413
413
|
|
|
414
|
-
> Если ваш файл контента включает код TSX,
|
|
414
|
+
> Если ваш файл контента включает код TSX, рекомендуется импортировать `import React from "react";` в вашем файле контента.
|
|
415
415
|
|
|
416
416
|
### Шаг 5: Использование Intlayer в вашем коде
|
|
417
417
|
|
|
@@ -532,6 +532,7 @@ const AppContent = () => {
|
|
|
532
532
|
<img
|
|
533
533
|
src={reactLogo}
|
|
534
534
|
className="logo react"
|
|
535
|
+
alt={content.reactLogo.value} // альтернативный текст для логотипа React
|
|
535
536
|
alt={content.reactLogo.value}
|
|
536
537
|
/>
|
|
537
538
|
</a>
|
|
@@ -568,7 +569,7 @@ module.exports = App;
|
|
|
568
569
|
|
|
569
570
|
### (Необязательно) Шаг 6: Изменение языка вашего контента
|
|
570
571
|
|
|
571
|
-
|
|
572
|
+
Чтобы изменить язык вашего контента, вы можете использовать функцию `setLocale`, предоставляемую хуком `useLocale`. Эта функция позволяет установить локаль приложения и обновить контент соответственно.
|
|
572
573
|
|
|
573
574
|
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
574
575
|
import type { FC } from "react";
|
|
@@ -580,7 +581,7 @@ const LocaleSwitcher: FC = () => {
|
|
|
580
581
|
|
|
581
582
|
return (
|
|
582
583
|
<button onClick={() => setLocale(Locales.English)}>
|
|
583
|
-
|
|
584
|
+
Change Language to English
|
|
584
585
|
</button>
|
|
585
586
|
);
|
|
586
587
|
};
|
|
@@ -620,7 +621,7 @@ const LocaleSwitcher = () => {
|
|
|
620
621
|
|
|
621
622
|
### (Необязательно) Шаг 7: Добавьте локализованную маршрутизацию в ваше приложение
|
|
622
623
|
|
|
623
|
-
Цель этого шага — создать уникальные маршруты для каждого языка. Это полезно для SEO и
|
|
624
|
+
Цель этого шага — создать уникальные маршруты для каждого языка. Это полезно для SEO и URL, дружественных к SEO.
|
|
624
625
|
Пример:
|
|
625
626
|
|
|
626
627
|
```plaintext
|
|
@@ -631,7 +632,7 @@ const LocaleSwitcher = () => {
|
|
|
631
632
|
|
|
632
633
|
> По умолчанию маршруты не имеют префикса для локали по умолчанию. Если вы хотите добавить префикс для локали по умолчанию, вы можете установить опцию `middleware.prefixDefault` в значение `true` в вашей конфигурации. Подробнее смотрите в [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md).
|
|
633
634
|
|
|
634
|
-
Чтобы добавить локализованную маршрутизацию в ваше приложение, вы можете создать компонент `LocaleRouter`, который
|
|
635
|
+
Чтобы добавить локализованную маршрутизацию в ваше приложение, вы можете создать компонент `LocaleRouter`, который оборачивает маршруты вашего приложения и обрабатывает маршрутизацию на основе локали. Вот пример с использованием [React Router](https://reactrouter.com/home):
|
|
635
636
|
|
|
636
637
|
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
637
638
|
// Импорт необходимых зависимостей и функций
|
|
@@ -658,39 +659,39 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
658
659
|
children,
|
|
659
660
|
locale,
|
|
660
661
|
}) => {
|
|
661
|
-
const { pathname, search } = useLocation(); //
|
|
662
|
+
const { pathname, search } = useLocation(); // Получить текущий путь URL
|
|
662
663
|
|
|
663
|
-
//
|
|
664
|
+
// Определить текущую локаль, используя локаль по умолчанию, если не указана
|
|
664
665
|
const currentLocale = locale ?? defaultLocale;
|
|
665
666
|
|
|
666
|
-
//
|
|
667
|
+
// Удалить префикс локали из пути для формирования базового пути
|
|
667
668
|
const pathWithoutLocale = getPathWithoutLocale(
|
|
668
669
|
pathname // Текущий путь URL
|
|
669
670
|
);
|
|
670
671
|
|
|
671
672
|
/**
|
|
672
|
-
* Если middleware.prefixDefault равно true, префикс локали по умолчанию всегда
|
|
673
|
+
* Если middleware.prefixDefault равно true, префикс локали по умолчанию должен всегда присутствовать.
|
|
673
674
|
*/
|
|
674
675
|
if (middleware.prefixDefault) {
|
|
675
|
-
//
|
|
676
|
+
// Проверить валидность локали
|
|
676
677
|
if (!locale || !locales.includes(locale)) {
|
|
677
|
-
//
|
|
678
|
+
// Перенаправить на локаль по умолчанию с обновлённым путем
|
|
678
679
|
return (
|
|
679
680
|
<Navigate
|
|
680
681
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
681
|
-
replace // Заменить текущую запись
|
|
682
|
+
replace // Заменить текущую запись истории новой
|
|
682
683
|
/>
|
|
683
684
|
);
|
|
684
685
|
}
|
|
685
686
|
|
|
686
|
-
//
|
|
687
|
+
// Обернуть дочерние элементы в IntlayerProvider и установить текущую локаль
|
|
687
688
|
return (
|
|
688
689
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
689
690
|
);
|
|
690
691
|
} else {
|
|
691
692
|
/**
|
|
692
|
-
* Когда middleware.prefixDefault равно false,
|
|
693
|
-
*
|
|
693
|
+
* Когда middleware.prefixDefault равно false, локаль по умолчанию не префиксируется.
|
|
694
|
+
* Убедиться, что текущая локаль действительна и не является локалью по умолчанию.
|
|
694
695
|
*/
|
|
695
696
|
if (
|
|
696
697
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -698,13 +699,13 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
698
699
|
.filter(
|
|
699
700
|
(locale) => locale.toString() !== defaultLocale.toString() // Исключить локаль по умолчанию
|
|
700
701
|
)
|
|
701
|
-
.includes(currentLocale) //
|
|
702
|
+
.includes(currentLocale) // Проверить, находится ли текущая локаль в списке допустимых локалей
|
|
702
703
|
) {
|
|
703
|
-
//
|
|
704
|
+
// Перенаправить на путь без префикса локали
|
|
704
705
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
705
706
|
}
|
|
706
707
|
|
|
707
|
-
//
|
|
708
|
+
// Обернуть дочерние элементы в IntlayerProvider и установить текущую локаль
|
|
708
709
|
return (
|
|
709
710
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
710
711
|
);
|
|
@@ -712,7 +713,7 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
712
713
|
};
|
|
713
714
|
|
|
714
715
|
/**
|
|
715
|
-
* Компонент
|
|
716
|
+
* Компонент маршрутизатора, который настраивает маршруты для конкретных локалей.
|
|
716
717
|
* Использует React Router для управления навигацией и рендеринга локализованных компонентов.
|
|
717
718
|
*/
|
|
718
719
|
export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
@@ -732,7 +733,7 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
732
733
|
))}
|
|
733
734
|
|
|
734
735
|
{
|
|
735
|
-
// Если префикс для локали по умолчанию отключен,
|
|
736
|
+
// Если префикс для локали по умолчанию отключен, рендерить дочерние элементы напрямую по корневому пути
|
|
736
737
|
!middleware.prefixDefault && (
|
|
737
738
|
<Route
|
|
738
739
|
path="*"
|
|
@@ -780,16 +781,16 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
780
781
|
);
|
|
781
782
|
|
|
782
783
|
/**
|
|
783
|
-
* Если middleware.prefixDefault равно true,
|
|
784
|
+
* Если middleware.prefixDefault равно true, префикс локали по умолчанию должен всегда присутствовать.
|
|
784
785
|
*/
|
|
785
786
|
if (middleware.prefixDefault) {
|
|
786
787
|
// Проверить локаль
|
|
787
788
|
if (!locale || !locales.includes(locale)) {
|
|
788
|
-
// Перенаправить на локаль по умолчанию с обновлённым
|
|
789
|
+
// Перенаправить на локаль по умолчанию с обновлённым путем
|
|
789
790
|
return (
|
|
790
791
|
<Navigate
|
|
791
792
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
792
|
-
replace // Заменить текущую запись истории на новую
|
|
793
|
+
replace // Заменить текущую запись в истории на новую
|
|
793
794
|
/>
|
|
794
795
|
);
|
|
795
796
|
}
|
|
@@ -801,7 +802,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
801
802
|
} else {
|
|
802
803
|
/**
|
|
803
804
|
* Когда middleware.prefixDefault равно false, префикс для локали по умолчанию не используется.
|
|
804
|
-
*
|
|
805
|
+
* Убедиться, что текущая локаль действительна и не является локалью по умолчанию.
|
|
805
806
|
*/
|
|
806
807
|
if (
|
|
807
808
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -809,13 +810,13 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
809
810
|
.filter(
|
|
810
811
|
(locale) => locale.toString() !== defaultLocale.toString() // Исключить локаль по умолчанию
|
|
811
812
|
)
|
|
812
|
-
.includes(currentLocale) //
|
|
813
|
+
.includes(currentLocale) // Проверить, находится ли текущая локаль в списке допустимых локалей
|
|
813
814
|
) {
|
|
814
|
-
//
|
|
815
|
+
// Перенаправить на путь без префикса локали
|
|
815
816
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
816
817
|
}
|
|
817
818
|
|
|
818
|
-
//
|
|
819
|
+
// Обернуть дочерние элементы в IntlayerProvider и установить текущую локаль
|
|
819
820
|
return (
|
|
820
821
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
821
822
|
);
|
|
@@ -824,7 +825,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
824
825
|
|
|
825
826
|
/**
|
|
826
827
|
* Компонент маршрутизатора, который настраивает маршруты для конкретных локалей.
|
|
827
|
-
* Использует React Router для управления навигацией и
|
|
828
|
+
* Использует React Router для управления навигацией и рендеринга локализованных компонентов.
|
|
828
829
|
*/
|
|
829
830
|
export const LocaleRouter = ({ children }) => (
|
|
830
831
|
<BrowserRouter>
|
|
@@ -835,7 +836,7 @@ export const LocaleRouter = ({ children }) => (
|
|
|
835
836
|
)
|
|
836
837
|
.map((locale) => (
|
|
837
838
|
<Route
|
|
838
|
-
// Шаблон маршрута для захвата локали (например, /en/, /fr/) и
|
|
839
|
+
// Шаблон маршрута для захвата локали (например, /en/, /fr/) и сопоставления всех последующих путей
|
|
839
840
|
path={`/${locale}/*`}
|
|
840
841
|
key={locale}
|
|
841
842
|
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Оборачивает дочерние элементы с управлением локалью
|
|
@@ -843,7 +844,7 @@ export const LocaleRouter = ({ children }) => (
|
|
|
843
844
|
))}
|
|
844
845
|
|
|
845
846
|
{
|
|
846
|
-
// Если префикс локали по умолчанию отключен,
|
|
847
|
+
// Если префикс для локали по умолчанию отключен, рендерить дочерние элементы напрямую по корневому пути
|
|
847
848
|
!middleware.prefixDefault && (
|
|
848
849
|
<Route
|
|
849
850
|
path="*"
|
|
@@ -881,7 +882,7 @@ const { locales, defaultLocale } = internationalization;
|
|
|
881
882
|
const AppLocalized = ({ children, locale }) => {
|
|
882
883
|
const { pathname, search } = useLocation(); // Получить текущий путь URL
|
|
883
884
|
|
|
884
|
-
// Определить текущую локаль,
|
|
885
|
+
// Определить текущую локаль, используя локаль по умолчанию, если не указана
|
|
885
886
|
const currentLocale = locale ?? defaultLocale;
|
|
886
887
|
|
|
887
888
|
// Удалить префикс локали из пути для построения базового пути
|
|
@@ -899,7 +900,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
899
900
|
return (
|
|
900
901
|
<Navigate
|
|
901
902
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
902
|
-
replace // Заменить текущую запись
|
|
903
|
+
replace // Заменить текущую запись истории на новую
|
|
903
904
|
/>
|
|
904
905
|
);
|
|
905
906
|
}
|
|
@@ -911,7 +912,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
911
912
|
} else {
|
|
912
913
|
/**
|
|
913
914
|
* Когда middleware.prefixDefault равно false, префикс для локали по умолчанию не добавляется.
|
|
914
|
-
* Убедиться, что текущая локаль
|
|
915
|
+
* Убедиться, что текущая локаль валидна и не является локалью по умолчанию.
|
|
915
916
|
*/
|
|
916
917
|
if (
|
|
917
918
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -919,7 +920,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
919
920
|
.filter(
|
|
920
921
|
(locale) => locale.toString() !== defaultLocale.toString() // Исключить локаль по умолчанию
|
|
921
922
|
)
|
|
922
|
-
.includes(currentLocale) // Проверить,
|
|
923
|
+
.includes(currentLocale) // Проверить, что текущая локаль есть в списке валидных локалей
|
|
923
924
|
) {
|
|
924
925
|
// Перенаправить на путь без префикса локали
|
|
925
926
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
@@ -1096,7 +1097,7 @@ const LocaleSwitcher: FC = () => {
|
|
|
1096
1097
|
{getLocaleName(localeItem, locale)}
|
|
1097
1098
|
</span>
|
|
1098
1099
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1099
|
-
{/* Язык на текущей локали - например, Francés при
|
|
1100
|
+
{/* Язык на текущей локали - например, Francés при текущей локали Locales.SPANISH */}
|
|
1100
1101
|
{getLocaleName(localeItem)}
|
|
1101
1102
|
</span>
|
|
1102
1103
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
@@ -1127,7 +1128,7 @@ const LocaleSwitcher = () => {
|
|
|
1127
1128
|
|
|
1128
1129
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1129
1130
|
onLocaleChange: (locale) => {
|
|
1130
|
-
//
|
|
1131
|
+
// Сформировать URL с обновленной локалью
|
|
1131
1132
|
// Пример: /es/about?foo=bar
|
|
1132
1133
|
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1133
1134
|
|
|
@@ -1156,7 +1157,7 @@ const LocaleSwitcher = () => {
|
|
|
1156
1157
|
{localeItem}
|
|
1157
1158
|
</span>
|
|
1158
1159
|
<span>
|
|
1159
|
-
{/* Язык на
|
|
1160
|
+
{/* Язык на его собственной локали - например, Français */}
|
|
1160
1161
|
{getLocaleName(localeItem, locale)}
|
|
1161
1162
|
</span>
|
|
1162
1163
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
@@ -1191,7 +1192,7 @@ const LocaleSwitcher = () => {
|
|
|
1191
1192
|
|
|
1192
1193
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1193
1194
|
onLocaleChange: (locale) => {
|
|
1194
|
-
// Сформировать URL с
|
|
1195
|
+
// Сформировать URL с обновленной локалью
|
|
1195
1196
|
// Пример: /es/about?foo=bar
|
|
1196
1197
|
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1197
1198
|
|
|
@@ -1220,7 +1221,7 @@ const LocaleSwitcher = () => {
|
|
|
1220
1221
|
{localeItem}
|
|
1221
1222
|
</span>
|
|
1222
1223
|
<span>
|
|
1223
|
-
{/* Язык на
|
|
1224
|
+
{/* Язык на его собственной локали - например, Français */}
|
|
1224
1225
|
{getLocaleName(localeItem, locale)}
|
|
1225
1226
|
</span>
|
|
1226
1227
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
@@ -1241,16 +1242,16 @@ const LocaleSwitcher = () => {
|
|
|
1241
1242
|
|
|
1242
1243
|
> Ссылки на документацию:
|
|
1243
1244
|
>
|
|
1244
|
-
> - [`useLocale`
|
|
1245
|
-
> - [`getLocaleName`
|
|
1246
|
-
> - [`getLocalizedUrl`
|
|
1245
|
+
> - [`useLocale` хук](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useLocale.md)
|
|
1246
|
+
> - [`getLocaleName` хук](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/intlayer/getLocaleName.md)
|
|
1247
|
+
> - [`getLocalizedUrl` хук](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/intlayer/getLocalizedUrl.md)
|
|
1247
1248
|
> - [`getHTMLTextDir` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/intlayer/getHTMLTextDir.md)
|
|
1248
1249
|
> - [`hrefLang` attribute](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr)
|
|
1249
1250
|
> - [`lang` attribute](https://developer.mozilla.org/ru/docs/Web/HTML/Global_attributes/lang)
|
|
1250
1251
|
> - [`dir` attribute`](https://developer.mozilla.org/ru/docs/Web/HTML/Global_attributes/dir)
|
|
1251
1252
|
> - [`aria-current` attribute`](https://developer.mozilla.org/ru/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
1252
1253
|
|
|
1253
|
-
Ниже приведён обновлённый **Шаг 9** с дополнительными
|
|
1254
|
+
Ниже приведён обновлённый **Шаг 9** с дополнительными объяснениями и уточнёнными примерами кода:
|
|
1254
1255
|
|
|
1255
1256
|
---
|
|
1256
1257
|
|
|
@@ -1258,7 +1259,7 @@ const LocaleSwitcher = () => {
|
|
|
1258
1259
|
|
|
1259
1260
|
Когда ваше приложение поддерживает несколько языков, крайне важно обновлять атрибуты `lang` и `dir` тега `<html>`, чтобы они соответствовали текущей локали. Это обеспечивает:
|
|
1260
1261
|
|
|
1261
|
-
- **Доступность**: программы чтения с экрана и вспомогательные технологии полагаются на правильный атрибут `lang` для точного произношения и интерпретации
|
|
1262
|
+
- **Доступность**: программы чтения с экрана и вспомогательные технологии полагаются на правильный атрибут `lang` для точного произношения и интерпретации контента.
|
|
1262
1263
|
- **Отображение текста**: атрибут `dir` (направление) гарантирует, что текст отображается в правильном порядке (например, слева направо для английского, справа налево для арабского или иврита), что важно для удобочитаемости.
|
|
1263
1264
|
- **SEO**: поисковые системы используют атрибут `lang` для определения языка вашей страницы, помогая показывать правильный локализованный контент в результатах поиска.
|
|
1264
1265
|
|
|
@@ -1275,7 +1276,7 @@ import { getHTMLTextDir } from "intlayer";
|
|
|
1275
1276
|
|
|
1276
1277
|
/**
|
|
1277
1278
|
* Обновляет атрибуты `lang` и `dir` элемента <html> в зависимости от текущей локали.
|
|
1278
|
-
* - `lang`:
|
|
1279
|
+
* - `lang`: сообщает браузерам и поисковым системам язык страницы.
|
|
1279
1280
|
* - `dir`: обеспечивает правильный порядок чтения (например, 'ltr' для английского, 'rtl' для арабского).
|
|
1280
1281
|
*
|
|
1281
1282
|
* Это динамическое обновление необходимо для правильного отображения текста, доступности и SEO.
|
|
@@ -1309,7 +1310,7 @@ export const useI18nHTMLAttributes = () => {
|
|
|
1309
1310
|
const { locale } = useLocale();
|
|
1310
1311
|
|
|
1311
1312
|
useEffect(() => {
|
|
1312
|
-
// Обновить атрибут языка
|
|
1313
|
+
// Обновить атрибут языка на текущую локаль.
|
|
1313
1314
|
document.documentElement.lang = locale;
|
|
1314
1315
|
|
|
1315
1316
|
// Установить направление текста в зависимости от текущей локали.
|
|
@@ -1328,7 +1329,7 @@ const { getHTMLTextDir } = require("intlayer");
|
|
|
1328
1329
|
* - `lang`: Информирует браузеры и поисковые системы о языке страницы.
|
|
1329
1330
|
* - `dir`: Обеспечивает правильный порядок чтения (например, 'ltr' для английского, 'rtl' для арабского).
|
|
1330
1331
|
*
|
|
1331
|
-
* Это динамическое обновление необходимо для
|
|
1332
|
+
* Это динамическое обновление необходимо для корректного отображения текста, доступности и SEO.
|
|
1332
1333
|
*/
|
|
1333
1334
|
const useI18nHTMLAttributes = () => {
|
|
1334
1335
|
const { locale } = useLocale();
|
|
@@ -1412,6 +1413,23 @@ const App = () => (
|
|
|
1412
1413
|
);
|
|
1413
1414
|
|
|
1414
1415
|
module.exports = App;
|
|
1416
|
+
```
|
|
1417
|
+
|
|
1418
|
+
Применяя эти изменения, ваше приложение будет:
|
|
1419
|
+
|
|
1420
|
+
- Обеспечивать корректное отражение текущей локали в атрибуте **language** (`lang`), что важно для SEO и поведения браузера.
|
|
1421
|
+
- Регулировать **направление текста** (`dir`) в соответствии с локалью, улучшая читаемость и удобство для языков с разным порядком чтения.
|
|
1422
|
+
- Обеспечивать более **доступный** опыт, так как вспомогательные технологии зависят от этих атрибутов для оптимальной работы.
|
|
1423
|
+
|
|
1424
|
+
### (Необязательно) Шаг 10: Создание локализованного компонента ссылки
|
|
1425
|
+
|
|
1426
|
+
```tsx fileName="src/App.tsx" codeFormat="typescript"
|
|
1427
|
+
import type { FC } from "react";
|
|
1428
|
+
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
1429
|
+
import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
1430
|
+
import "./App.css";
|
|
1431
|
+
|
|
1432
|
+
const AppContent: FC = () => {
|
|
1415
1433
|
// Примените хук для обновления атрибутов lang и dir тега <html> в зависимости от локали.
|
|
1416
1434
|
useI18nHTMLAttributes();
|
|
1417
1435
|
|
|
@@ -1431,16 +1449,16 @@ module.exports = App;
|
|
|
1431
1449
|
|
|
1432
1450
|
- Обеспечивать корректное отражение текущей локали в атрибуте **языка** (`lang`), что важно для SEO и поведения браузера.
|
|
1433
1451
|
- Настраивать **направление текста** (`dir`) в соответствии с локалью, улучшая читаемость и удобство использования для языков с разным порядком чтения.
|
|
1434
|
-
-
|
|
1452
|
+
- Обеспечивать более **доступный** опыт, так как вспомогательные технологии зависят от этих атрибутов для оптимальной работы.
|
|
1435
1453
|
|
|
1436
1454
|
### (Необязательно) Шаг 10: Создание локализованного компонента Link
|
|
1437
1455
|
|
|
1438
|
-
Чтобы обеспечить навигацию вашего приложения с учётом текущей локали, вы можете создать
|
|
1456
|
+
Чтобы обеспечить навигацию вашего приложения с учётом текущей локали, вы можете создать пользовательский компонент `Link`. Этот компонент автоматически добавляет префикс текущего языка к внутренним URL, например, когда франкоязычный пользователь нажимает на ссылку на страницу "О нас", его перенаправляет на `/fr/about` вместо `/about`.
|
|
1439
1457
|
|
|
1440
1458
|
Такое поведение полезно по нескольким причинам:
|
|
1441
1459
|
|
|
1442
|
-
- **SEO и
|
|
1443
|
-
- **Последовательность**: Используя
|
|
1460
|
+
- **SEO и удобство для пользователя**: Локализованные URL помогают поисковым системам правильно индексировать страницы на разных языках и предоставлять пользователям контент на предпочитаемом языке.
|
|
1461
|
+
- **Последовательность**: Используя локализованную ссылку по всему приложению, вы гарантируете, что навигация остаётся в рамках текущей локали, предотвращая неожиданные переключения языка.
|
|
1444
1462
|
- **Поддерживаемость**: Централизация логики локализации в одном компоненте упрощает управление URL-адресами, делая ваш код более удобным для поддержки и расширения по мере роста приложения.
|
|
1445
1463
|
|
|
1446
1464
|
Ниже приведена реализация локализованного компонента `Link` на TypeScript:
|
|
@@ -1506,8 +1524,8 @@ export const checkIsExternalLink = (href?: string): boolean =>
|
|
|
1506
1524
|
|
|
1507
1525
|
/**
|
|
1508
1526
|
* Кастомный компонент Link, который адаптирует атрибут href в зависимости от текущей локали.
|
|
1509
|
-
* Для внутренних ссылок используется `getLocalizedUrl
|
|
1510
|
-
* Это гарантирует, что навигация остается в контексте
|
|
1527
|
+
* Для внутренних ссылок используется `getLocalizedUrl`, чтобы добавить префикс локали к URL (например, /fr/about).
|
|
1528
|
+
* Это гарантирует, что навигация остается в контексте одной локали.
|
|
1511
1529
|
*/
|
|
1512
1530
|
export const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1513
1531
|
const { locale } = useLocale();
|
|
@@ -1533,7 +1551,7 @@ const { useLocale } = require("react-intlayer");
|
|
|
1533
1551
|
const { forwardRef } = require("react");
|
|
1534
1552
|
|
|
1535
1553
|
/**
|
|
1536
|
-
*
|
|
1554
|
+
* Вспомогательная функция для проверки, является ли данный URL внешним.
|
|
1537
1555
|
* Если URL начинается с http:// или https://, он считается внешним.
|
|
1538
1556
|
*/
|
|
1539
1557
|
const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
@@ -1541,13 +1559,13 @@ const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
|
1541
1559
|
/**
|
|
1542
1560
|
* Пользовательский компонент Link, который адаптирует атрибут href в зависимости от текущей локали.
|
|
1543
1561
|
* Для внутренних ссылок используется `getLocalizedUrl`, чтобы добавить префикс локали к URL (например, /fr/about).
|
|
1544
|
-
* Это гарантирует, что навигация
|
|
1562
|
+
* Это гарантирует, что навигация останется в контексте той же локали.
|
|
1545
1563
|
*/
|
|
1546
1564
|
const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1547
1565
|
const { locale } = useLocale();
|
|
1548
1566
|
const isExternalLink = checkIsExternalLink(href);
|
|
1549
1567
|
|
|
1550
|
-
// Если ссылка внутренняя и href
|
|
1568
|
+
// Если ссылка внутренняя и задан корректный href, получить локализованный URL.
|
|
1551
1569
|
const localizedHref = isExternalLink ? href : getLocalizedUrl(href, locale);
|
|
1552
1570
|
|
|
1553
1571
|
return (
|
|
@@ -1616,14 +1634,14 @@ Intlayer использует расширение модулей (module augmen
|
|
|
1616
1634
|
|
|
1617
1635
|
Для улучшения вашего опыта разработки с Intlayer вы можете установить официальное **расширение Intlayer для VS Code**.
|
|
1618
1636
|
|
|
1619
|
-
[Установить из VS Code
|
|
1637
|
+
[Установить из магазина расширений VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
1620
1638
|
|
|
1621
1639
|
Это расширение предоставляет:
|
|
1622
1640
|
|
|
1623
1641
|
- **Автодополнение** для ключей переводов.
|
|
1624
1642
|
- **Обнаружение ошибок в реальном времени** для отсутствующих переводов.
|
|
1625
|
-
- **Встроенный
|
|
1626
|
-
- **Быстрые действия** для
|
|
1643
|
+
- **Встроенный просмотр** переведенного контента.
|
|
1644
|
+
- **Быстрые действия** для удобного создания и обновления переводов.
|
|
1627
1645
|
|
|
1628
1646
|
Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации расширения Intlayer для VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
1629
1647
|
|