@intlayer/docs 5.5.11 → 5.5.12
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 +3 -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_with_vite+react.md +100 -108
- package/docs/de/intlayer_with_vite+react.md +121 -142
- package/docs/en/CI_CD.md +3 -1
- package/docs/en/autoFill.md +3 -1
- package/docs/en/configuration.md +4 -1
- 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 +3 -1
- package/docs/en/intlayer_cli.md +3 -1
- package/docs/en/intlayer_visual_editor.md +3 -1
- package/docs/en/intlayer_with_angular.md +3 -1
- package/docs/en/intlayer_with_create_react_app.md +3 -1
- package/docs/en/intlayer_with_express.md +3 -1
- package/docs/en/intlayer_with_lynx+react.md +3 -1
- package/docs/en/intlayer_with_nextjs_14.md +6 -1
- package/docs/en/intlayer_with_nextjs_15.md +5 -1
- package/docs/en/intlayer_with_nextjs_page_router.md +5 -1
- package/docs/en/intlayer_with_nuxt.md +3 -1
- package/docs/en/intlayer_with_react_native+expo.md +3 -1
- package/docs/en/intlayer_with_vite+preact.md +3 -1
- package/docs/en/intlayer_with_vite+react.md +9 -7
- package/docs/en/intlayer_with_vite+solid.md +3 -1
- package/docs/en/intlayer_with_vite+svelte.md +3 -1
- package/docs/en/intlayer_with_vite+vue.md +3 -1
- package/docs/en/introduction.md +3 -1
- package/docs/en/mcp_server.md +42 -1
- 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_with_vite+react.md +64 -83
- package/docs/es/intlayer_with_vite+react.md +91 -94
- package/docs/fr/intlayer_with_vite+react.md +73 -65
- package/docs/hi/intlayer_with_vite+react.md +107 -107
- package/docs/it/intlayer_with_vite+react.md +156 -112
- package/docs/ja/intlayer_with_vite+react.md +153 -218
- package/docs/ko/intlayer_with_vite+react.md +116 -148
- package/docs/ko/packages/intlayer/getLocalizedUrl.md +1 -23
- package/docs/pt/intlayer_with_vite+react.md +110 -132
- package/docs/ru/intlayer_with_vite+react.md +98 -83
- package/docs/zh/intlayer_with_vite+react.md +147 -184
- 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 +7 -6
- package/src/blog.ts +6 -4
- package/src/common.ts +23 -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,20 +1,20 @@
|
|
|
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
|
-
-
|
|
17
|
+
- vite-and-react
|
|
18
18
|
---
|
|
19
19
|
|
|
20
20
|
# Начало работы с интернационализацией (i18n) с Intlayer, Vite и React
|
|
@@ -27,10 +27,10 @@ slugs:
|
|
|
27
27
|
|
|
28
28
|
С помощью Intlayer вы можете:
|
|
29
29
|
|
|
30
|
-
- **Легко
|
|
31
|
-
- **Динамически
|
|
32
|
-
-
|
|
33
|
-
-
|
|
30
|
+
- **Легко управляйте переводами** с помощью декларативных словарей на уровне компонентов.
|
|
31
|
+
- **Динамически локализуйте метаданные**, маршруты и контент.
|
|
32
|
+
- **Обеспечьте поддержку TypeScript** с автогенерируемыми типами, улучшая автозаполнение и обнаружение ошибок.
|
|
33
|
+
- **Воспользуйтесь расширенными возможностями**, такими как динамическое определение и переключение локали.
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
@@ -57,13 +57,13 @@ yarn add --save-dev vite-intlayer
|
|
|
57
57
|
|
|
58
58
|
- **intlayer**
|
|
59
59
|
|
|
60
|
-
Основной пакет,
|
|
60
|
+
Основной пакет, предоставляющий инструменты интернационализации для управления конфигурацией, перевода, [объявления контента](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
61
|
|
|
62
62
|
- **react-intlayer**
|
|
63
63
|
Пакет, который интегрирует Intlayer с приложением на React. Он предоставляет провайдеры контекста и хуки для интернационализации в React.
|
|
64
64
|
|
|
65
65
|
- **vite-intlayer**
|
|
66
|
-
Включает плагин Vite для интеграции Intlayer с [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также промежуточное ПО для определения предпочтительной локали пользователя, управления
|
|
66
|
+
Включает плагин Vite для интеграции Intlayer с [сборщиком Vite](https://vite.dev/guide/why.html#why-bundle-for-production), а также промежуточное ПО для определения предпочтительной локали пользователя, управления куки и обработки перенаправления URL.
|
|
67
67
|
|
|
68
68
|
### Шаг 2: Конфигурация вашего проекта
|
|
69
69
|
|
|
@@ -91,7 +91,6 @@ export default config;
|
|
|
91
91
|
import { Locales } from "intlayer";
|
|
92
92
|
|
|
93
93
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
94
|
-
// Конфигурация для интернационализации приложения
|
|
95
94
|
const config = {
|
|
96
95
|
internationalization: {
|
|
97
96
|
locales: [
|
|
@@ -111,7 +110,6 @@ export default config;
|
|
|
111
110
|
const { Locales } = require("intlayer");
|
|
112
111
|
|
|
113
112
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
114
|
-
// Конфигурация для интернационализации приложения
|
|
115
113
|
const config = {
|
|
116
114
|
internationalization: {
|
|
117
115
|
locales: [
|
|
@@ -127,7 +125,7 @@ const config = {
|
|
|
127
125
|
module.exports = config;
|
|
128
126
|
```
|
|
129
127
|
|
|
130
|
-
> Через этот файл конфигурации вы можете настроить локализованные URL-адреса, перенаправление в
|
|
128
|
+
> Через этот файл конфигурации вы можете настроить локализованные URL-адреса, перенаправление в промежуточном ПО, имена cookie, расположение и расширение ваших деклараций контента, отключить логи Intlayer в консоли и многое другое. Для полного списка доступных параметров обратитесь к [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md).
|
|
131
129
|
|
|
132
130
|
### Шаг 3: Интеграция Intlayer в вашу конфигурацию Vite
|
|
133
131
|
|
|
@@ -166,7 +164,7 @@ module.exports = defineConfig({
|
|
|
166
164
|
});
|
|
167
165
|
```
|
|
168
166
|
|
|
169
|
-
> Плагин Vite `intlayerPlugin()` используется для интеграции Intlayer с Vite. Он обеспечивает
|
|
167
|
+
> Плагин Vite `intlayerPlugin()` используется для интеграции Intlayer с Vite. Он обеспечивает создание файлов деклараций контента и отслеживает их в режиме разработки. Он определяет переменные окружения Intlayer внутри приложения Vite. Кроме того, он предоставляет алиасы для оптимизации производительности.
|
|
170
168
|
|
|
171
169
|
### Шаг 4: Объявите Ваш Контент
|
|
172
170
|
|
|
@@ -235,12 +233,12 @@ const appContent = {
|
|
|
235
233
|
key: "app",
|
|
236
234
|
content: {
|
|
237
235
|
viteLogo: t({
|
|
238
|
-
en: "Vite
|
|
236
|
+
en: "Логотип Vite",
|
|
239
237
|
fr: "Logo Vite",
|
|
240
238
|
es: "Logo Vite",
|
|
241
239
|
}),
|
|
242
240
|
reactLogo: t({
|
|
243
|
-
en: "React
|
|
241
|
+
en: "Логотип React",
|
|
244
242
|
fr: "Logo React",
|
|
245
243
|
es: "Logo React",
|
|
246
244
|
}),
|
|
@@ -248,7 +246,7 @@ const appContent = {
|
|
|
248
246
|
title: "Vite + React",
|
|
249
247
|
|
|
250
248
|
count: t({
|
|
251
|
-
en: "
|
|
249
|
+
en: "счет: ",
|
|
252
250
|
fr: "le compte est ",
|
|
253
251
|
es: "el recuento es ",
|
|
254
252
|
}),
|
|
@@ -316,10 +314,10 @@ const appContent = {
|
|
|
316
314
|
t <
|
|
317
315
|
ReactNode >
|
|
318
316
|
{
|
|
319
|
-
// Не забудьте импортировать React, если используете React node в вашем контенте
|
|
317
|
+
// Не забудьте импортировать React, если вы используете React node в вашем контенте
|
|
320
318
|
en: (
|
|
321
319
|
<>
|
|
322
|
-
Edit <code>src/App.tsx</code>
|
|
320
|
+
Edit <code>src/App.tsx</code> and save to test HMR
|
|
323
321
|
</>
|
|
324
322
|
),
|
|
325
323
|
fr: (
|
|
@@ -329,8 +327,7 @@ const appContent = {
|
|
|
329
327
|
),
|
|
330
328
|
es: (
|
|
331
329
|
<>
|
|
332
|
-
|
|
333
|
-
протестировать HMR
|
|
330
|
+
Edita <code>src/App.tsx</code> y guarda para probar HMR
|
|
334
331
|
</>
|
|
335
332
|
),
|
|
336
333
|
},
|
|
@@ -394,7 +391,7 @@ module.exports = appContent;
|
|
|
394
391
|
"en": "Edit src/App.tsx and save to test HMR",
|
|
395
392
|
"fr": "Éditez src/App.tsx et enregistrez pour tester HMR",
|
|
396
393
|
"es": "Edita src/App.tsx y guarda para probar HMR",
|
|
397
|
-
"ru": "
|
|
394
|
+
"ru": "Отредактируйте src/App.tsx и сохраните, чтобы проверить HMR"
|
|
398
395
|
}
|
|
399
396
|
},
|
|
400
397
|
"readTheDocs": {
|
|
@@ -411,7 +408,7 @@ module.exports = appContent;
|
|
|
411
408
|
|
|
412
409
|
> Для получения дополнительной информации обратитесь к [документации по объявлениям контента](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/dictionary/get_started.md).
|
|
413
410
|
|
|
414
|
-
> Если ваш файл контента включает код TSX,
|
|
411
|
+
> Если ваш файл контента включает код TSX, рекомендуется импортировать `import React from "react";` в вашем файле контента.
|
|
415
412
|
|
|
416
413
|
### Шаг 5: Использование Intlayer в вашем коде
|
|
417
414
|
|
|
@@ -532,6 +529,7 @@ const AppContent = () => {
|
|
|
532
529
|
<img
|
|
533
530
|
src={reactLogo}
|
|
534
531
|
className="logo react"
|
|
532
|
+
alt={content.reactLogo.value} // альтернативный текст для логотипа React
|
|
535
533
|
alt={content.reactLogo.value}
|
|
536
534
|
/>
|
|
537
535
|
</a>
|
|
@@ -568,7 +566,7 @@ module.exports = App;
|
|
|
568
566
|
|
|
569
567
|
### (Необязательно) Шаг 6: Изменение языка вашего контента
|
|
570
568
|
|
|
571
|
-
|
|
569
|
+
Чтобы изменить язык вашего контента, вы можете использовать функцию `setLocale`, предоставляемую хуком `useLocale`. Эта функция позволяет установить локаль приложения и обновить контент соответственно.
|
|
572
570
|
|
|
573
571
|
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
574
572
|
import type { FC } from "react";
|
|
@@ -580,7 +578,7 @@ const LocaleSwitcher: FC = () => {
|
|
|
580
578
|
|
|
581
579
|
return (
|
|
582
580
|
<button onClick={() => setLocale(Locales.English)}>
|
|
583
|
-
|
|
581
|
+
Change Language to English
|
|
584
582
|
</button>
|
|
585
583
|
);
|
|
586
584
|
};
|
|
@@ -620,7 +618,7 @@ const LocaleSwitcher = () => {
|
|
|
620
618
|
|
|
621
619
|
### (Необязательно) Шаг 7: Добавьте локализованную маршрутизацию в ваше приложение
|
|
622
620
|
|
|
623
|
-
Цель этого шага — создать уникальные маршруты для каждого языка. Это полезно для SEO и
|
|
621
|
+
Цель этого шага — создать уникальные маршруты для каждого языка. Это полезно для SEO и URL, дружественных к SEO.
|
|
624
622
|
Пример:
|
|
625
623
|
|
|
626
624
|
```plaintext
|
|
@@ -631,7 +629,7 @@ const LocaleSwitcher = () => {
|
|
|
631
629
|
|
|
632
630
|
> По умолчанию маршруты не имеют префикса для локали по умолчанию. Если вы хотите добавить префикс для локали по умолчанию, вы можете установить опцию `middleware.prefixDefault` в значение `true` в вашей конфигурации. Подробнее смотрите в [документации по конфигурации](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/configuration.md).
|
|
633
631
|
|
|
634
|
-
Чтобы добавить локализованную маршрутизацию в ваше приложение, вы можете создать компонент `LocaleRouter`, который
|
|
632
|
+
Чтобы добавить локализованную маршрутизацию в ваше приложение, вы можете создать компонент `LocaleRouter`, который оборачивает маршруты вашего приложения и обрабатывает маршрутизацию на основе локали. Вот пример с использованием [React Router](https://reactrouter.com/home):
|
|
635
633
|
|
|
636
634
|
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
637
635
|
// Импорт необходимых зависимостей и функций
|
|
@@ -658,39 +656,39 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
658
656
|
children,
|
|
659
657
|
locale,
|
|
660
658
|
}) => {
|
|
661
|
-
const { pathname, search } = useLocation(); //
|
|
659
|
+
const { pathname, search } = useLocation(); // Получить текущий путь URL
|
|
662
660
|
|
|
663
|
-
//
|
|
661
|
+
// Определить текущую локаль, используя локаль по умолчанию, если не указана
|
|
664
662
|
const currentLocale = locale ?? defaultLocale;
|
|
665
663
|
|
|
666
|
-
//
|
|
664
|
+
// Удалить префикс локали из пути для формирования базового пути
|
|
667
665
|
const pathWithoutLocale = getPathWithoutLocale(
|
|
668
666
|
pathname // Текущий путь URL
|
|
669
667
|
);
|
|
670
668
|
|
|
671
669
|
/**
|
|
672
|
-
* Если middleware.prefixDefault равно true, префикс локали по умолчанию всегда
|
|
670
|
+
* Если middleware.prefixDefault равно true, префикс локали по умолчанию должен всегда присутствовать.
|
|
673
671
|
*/
|
|
674
672
|
if (middleware.prefixDefault) {
|
|
675
|
-
//
|
|
673
|
+
// Проверить валидность локали
|
|
676
674
|
if (!locale || !locales.includes(locale)) {
|
|
677
|
-
//
|
|
675
|
+
// Перенаправить на локаль по умолчанию с обновлённым путем
|
|
678
676
|
return (
|
|
679
677
|
<Navigate
|
|
680
678
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
681
|
-
replace // Заменить текущую запись
|
|
679
|
+
replace // Заменить текущую запись истории новой
|
|
682
680
|
/>
|
|
683
681
|
);
|
|
684
682
|
}
|
|
685
683
|
|
|
686
|
-
//
|
|
684
|
+
// Обернуть дочерние элементы в IntlayerProvider и установить текущую локаль
|
|
687
685
|
return (
|
|
688
686
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
689
687
|
);
|
|
690
688
|
} else {
|
|
691
689
|
/**
|
|
692
|
-
* Когда middleware.prefixDefault равно false,
|
|
693
|
-
*
|
|
690
|
+
* Когда middleware.prefixDefault равно false, локаль по умолчанию не префиксируется.
|
|
691
|
+
* Убедиться, что текущая локаль действительна и не является локалью по умолчанию.
|
|
694
692
|
*/
|
|
695
693
|
if (
|
|
696
694
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -698,13 +696,13 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
698
696
|
.filter(
|
|
699
697
|
(locale) => locale.toString() !== defaultLocale.toString() // Исключить локаль по умолчанию
|
|
700
698
|
)
|
|
701
|
-
.includes(currentLocale) //
|
|
699
|
+
.includes(currentLocale) // Проверить, находится ли текущая локаль в списке допустимых локалей
|
|
702
700
|
) {
|
|
703
|
-
//
|
|
701
|
+
// Перенаправить на путь без префикса локали
|
|
704
702
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
705
703
|
}
|
|
706
704
|
|
|
707
|
-
//
|
|
705
|
+
// Обернуть дочерние элементы в IntlayerProvider и установить текущую локаль
|
|
708
706
|
return (
|
|
709
707
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
710
708
|
);
|
|
@@ -712,7 +710,7 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
712
710
|
};
|
|
713
711
|
|
|
714
712
|
/**
|
|
715
|
-
* Компонент
|
|
713
|
+
* Компонент маршрутизатора, который настраивает маршруты для конкретных локалей.
|
|
716
714
|
* Использует React Router для управления навигацией и рендеринга локализованных компонентов.
|
|
717
715
|
*/
|
|
718
716
|
export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
@@ -732,7 +730,7 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
732
730
|
))}
|
|
733
731
|
|
|
734
732
|
{
|
|
735
|
-
// Если префикс для локали по умолчанию отключен,
|
|
733
|
+
// Если префикс для локали по умолчанию отключен, рендерить дочерние элементы напрямую по корневому пути
|
|
736
734
|
!middleware.prefixDefault && (
|
|
737
735
|
<Route
|
|
738
736
|
path="*"
|
|
@@ -780,16 +778,16 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
780
778
|
);
|
|
781
779
|
|
|
782
780
|
/**
|
|
783
|
-
* Если middleware.prefixDefault равно true,
|
|
781
|
+
* Если middleware.prefixDefault равно true, префикс локали по умолчанию должен всегда присутствовать.
|
|
784
782
|
*/
|
|
785
783
|
if (middleware.prefixDefault) {
|
|
786
784
|
// Проверить локаль
|
|
787
785
|
if (!locale || !locales.includes(locale)) {
|
|
788
|
-
// Перенаправить на локаль по умолчанию с обновлённым
|
|
786
|
+
// Перенаправить на локаль по умолчанию с обновлённым путем
|
|
789
787
|
return (
|
|
790
788
|
<Navigate
|
|
791
789
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
792
|
-
replace // Заменить текущую запись истории на новую
|
|
790
|
+
replace // Заменить текущую запись в истории на новую
|
|
793
791
|
/>
|
|
794
792
|
);
|
|
795
793
|
}
|
|
@@ -801,7 +799,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
801
799
|
} else {
|
|
802
800
|
/**
|
|
803
801
|
* Когда middleware.prefixDefault равно false, префикс для локали по умолчанию не используется.
|
|
804
|
-
*
|
|
802
|
+
* Убедиться, что текущая локаль действительна и не является локалью по умолчанию.
|
|
805
803
|
*/
|
|
806
804
|
if (
|
|
807
805
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -809,13 +807,13 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
809
807
|
.filter(
|
|
810
808
|
(locale) => locale.toString() !== defaultLocale.toString() // Исключить локаль по умолчанию
|
|
811
809
|
)
|
|
812
|
-
.includes(currentLocale) //
|
|
810
|
+
.includes(currentLocale) // Проверить, находится ли текущая локаль в списке допустимых локалей
|
|
813
811
|
) {
|
|
814
|
-
//
|
|
812
|
+
// Перенаправить на путь без префикса локали
|
|
815
813
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
816
814
|
}
|
|
817
815
|
|
|
818
|
-
//
|
|
816
|
+
// Обернуть дочерние элементы в IntlayerProvider и установить текущую локаль
|
|
819
817
|
return (
|
|
820
818
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
821
819
|
);
|
|
@@ -824,7 +822,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
824
822
|
|
|
825
823
|
/**
|
|
826
824
|
* Компонент маршрутизатора, который настраивает маршруты для конкретных локалей.
|
|
827
|
-
* Использует React Router для управления навигацией и
|
|
825
|
+
* Использует React Router для управления навигацией и рендеринга локализованных компонентов.
|
|
828
826
|
*/
|
|
829
827
|
export const LocaleRouter = ({ children }) => (
|
|
830
828
|
<BrowserRouter>
|
|
@@ -835,7 +833,7 @@ export const LocaleRouter = ({ children }) => (
|
|
|
835
833
|
)
|
|
836
834
|
.map((locale) => (
|
|
837
835
|
<Route
|
|
838
|
-
// Шаблон маршрута для захвата локали (например, /en/, /fr/) и
|
|
836
|
+
// Шаблон маршрута для захвата локали (например, /en/, /fr/) и сопоставления всех последующих путей
|
|
839
837
|
path={`/${locale}/*`}
|
|
840
838
|
key={locale}
|
|
841
839
|
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Оборачивает дочерние элементы с управлением локалью
|
|
@@ -843,7 +841,7 @@ export const LocaleRouter = ({ children }) => (
|
|
|
843
841
|
))}
|
|
844
842
|
|
|
845
843
|
{
|
|
846
|
-
// Если префикс локали по умолчанию отключен,
|
|
844
|
+
// Если префикс для локали по умолчанию отключен, рендерить дочерние элементы напрямую по корневому пути
|
|
847
845
|
!middleware.prefixDefault && (
|
|
848
846
|
<Route
|
|
849
847
|
path="*"
|
|
@@ -881,7 +879,7 @@ const { locales, defaultLocale } = internationalization;
|
|
|
881
879
|
const AppLocalized = ({ children, locale }) => {
|
|
882
880
|
const { pathname, search } = useLocation(); // Получить текущий путь URL
|
|
883
881
|
|
|
884
|
-
// Определить текущую локаль,
|
|
882
|
+
// Определить текущую локаль, используя локаль по умолчанию, если не указана
|
|
885
883
|
const currentLocale = locale ?? defaultLocale;
|
|
886
884
|
|
|
887
885
|
// Удалить префикс локали из пути для построения базового пути
|
|
@@ -899,7 +897,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
899
897
|
return (
|
|
900
898
|
<Navigate
|
|
901
899
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
902
|
-
replace // Заменить текущую запись
|
|
900
|
+
replace // Заменить текущую запись истории на новую
|
|
903
901
|
/>
|
|
904
902
|
);
|
|
905
903
|
}
|
|
@@ -911,7 +909,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
911
909
|
} else {
|
|
912
910
|
/**
|
|
913
911
|
* Когда middleware.prefixDefault равно false, префикс для локали по умолчанию не добавляется.
|
|
914
|
-
* Убедиться, что текущая локаль
|
|
912
|
+
* Убедиться, что текущая локаль валидна и не является локалью по умолчанию.
|
|
915
913
|
*/
|
|
916
914
|
if (
|
|
917
915
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -919,7 +917,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
919
917
|
.filter(
|
|
920
918
|
(locale) => locale.toString() !== defaultLocale.toString() // Исключить локаль по умолчанию
|
|
921
919
|
)
|
|
922
|
-
.includes(currentLocale) // Проверить,
|
|
920
|
+
.includes(currentLocale) // Проверить, что текущая локаль есть в списке валидных локалей
|
|
923
921
|
) {
|
|
924
922
|
// Перенаправить на путь без префикса локали
|
|
925
923
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
@@ -1096,7 +1094,7 @@ const LocaleSwitcher: FC = () => {
|
|
|
1096
1094
|
{getLocaleName(localeItem, locale)}
|
|
1097
1095
|
</span>
|
|
1098
1096
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1099
|
-
{/* Язык на текущей локали - например, Francés при
|
|
1097
|
+
{/* Язык на текущей локали - например, Francés при текущей локали Locales.SPANISH */}
|
|
1100
1098
|
{getLocaleName(localeItem)}
|
|
1101
1099
|
</span>
|
|
1102
1100
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
@@ -1127,7 +1125,7 @@ const LocaleSwitcher = () => {
|
|
|
1127
1125
|
|
|
1128
1126
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1129
1127
|
onLocaleChange: (locale) => {
|
|
1130
|
-
//
|
|
1128
|
+
// Сформировать URL с обновленной локалью
|
|
1131
1129
|
// Пример: /es/about?foo=bar
|
|
1132
1130
|
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1133
1131
|
|
|
@@ -1156,7 +1154,7 @@ const LocaleSwitcher = () => {
|
|
|
1156
1154
|
{localeItem}
|
|
1157
1155
|
</span>
|
|
1158
1156
|
<span>
|
|
1159
|
-
{/* Язык на
|
|
1157
|
+
{/* Язык на его собственной локали - например, Français */}
|
|
1160
1158
|
{getLocaleName(localeItem, locale)}
|
|
1161
1159
|
</span>
|
|
1162
1160
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
@@ -1191,7 +1189,7 @@ const LocaleSwitcher = () => {
|
|
|
1191
1189
|
|
|
1192
1190
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1193
1191
|
onLocaleChange: (locale) => {
|
|
1194
|
-
// Сформировать URL с
|
|
1192
|
+
// Сформировать URL с обновленной локалью
|
|
1195
1193
|
// Пример: /es/about?foo=bar
|
|
1196
1194
|
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1197
1195
|
|
|
@@ -1220,7 +1218,7 @@ const LocaleSwitcher = () => {
|
|
|
1220
1218
|
{localeItem}
|
|
1221
1219
|
</span>
|
|
1222
1220
|
<span>
|
|
1223
|
-
{/* Язык на
|
|
1221
|
+
{/* Язык на его собственной локали - например, Français */}
|
|
1224
1222
|
{getLocaleName(localeItem, locale)}
|
|
1225
1223
|
</span>
|
|
1226
1224
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
@@ -1241,16 +1239,16 @@ const LocaleSwitcher = () => {
|
|
|
1241
1239
|
|
|
1242
1240
|
> Ссылки на документацию:
|
|
1243
1241
|
>
|
|
1244
|
-
> - [`useLocale`
|
|
1245
|
-
> - [`getLocaleName`
|
|
1246
|
-
> - [`getLocalizedUrl`
|
|
1242
|
+
> - [`useLocale` хук](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/react-intlayer/useLocale.md)
|
|
1243
|
+
> - [`getLocaleName` хук](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/intlayer/getLocaleName.md)
|
|
1244
|
+
> - [`getLocalizedUrl` хук](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/intlayer/getLocalizedUrl.md)
|
|
1247
1245
|
> - [`getHTMLTextDir` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/packages/intlayer/getHTMLTextDir.md)
|
|
1248
1246
|
> - [`hrefLang` attribute](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr)
|
|
1249
1247
|
> - [`lang` attribute](https://developer.mozilla.org/ru/docs/Web/HTML/Global_attributes/lang)
|
|
1250
1248
|
> - [`dir` attribute`](https://developer.mozilla.org/ru/docs/Web/HTML/Global_attributes/dir)
|
|
1251
1249
|
> - [`aria-current` attribute`](https://developer.mozilla.org/ru/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
1252
1250
|
|
|
1253
|
-
Ниже приведён обновлённый **Шаг 9** с дополнительными
|
|
1251
|
+
Ниже приведён обновлённый **Шаг 9** с дополнительными объяснениями и уточнёнными примерами кода:
|
|
1254
1252
|
|
|
1255
1253
|
---
|
|
1256
1254
|
|
|
@@ -1258,7 +1256,7 @@ const LocaleSwitcher = () => {
|
|
|
1258
1256
|
|
|
1259
1257
|
Когда ваше приложение поддерживает несколько языков, крайне важно обновлять атрибуты `lang` и `dir` тега `<html>`, чтобы они соответствовали текущей локали. Это обеспечивает:
|
|
1260
1258
|
|
|
1261
|
-
- **Доступность**: программы чтения с экрана и вспомогательные технологии полагаются на правильный атрибут `lang` для точного произношения и интерпретации
|
|
1259
|
+
- **Доступность**: программы чтения с экрана и вспомогательные технологии полагаются на правильный атрибут `lang` для точного произношения и интерпретации контента.
|
|
1262
1260
|
- **Отображение текста**: атрибут `dir` (направление) гарантирует, что текст отображается в правильном порядке (например, слева направо для английского, справа налево для арабского или иврита), что важно для удобочитаемости.
|
|
1263
1261
|
- **SEO**: поисковые системы используют атрибут `lang` для определения языка вашей страницы, помогая показывать правильный локализованный контент в результатах поиска.
|
|
1264
1262
|
|
|
@@ -1275,7 +1273,7 @@ import { getHTMLTextDir } from "intlayer";
|
|
|
1275
1273
|
|
|
1276
1274
|
/**
|
|
1277
1275
|
* Обновляет атрибуты `lang` и `dir` элемента <html> в зависимости от текущей локали.
|
|
1278
|
-
* - `lang`:
|
|
1276
|
+
* - `lang`: сообщает браузерам и поисковым системам язык страницы.
|
|
1279
1277
|
* - `dir`: обеспечивает правильный порядок чтения (например, 'ltr' для английского, 'rtl' для арабского).
|
|
1280
1278
|
*
|
|
1281
1279
|
* Это динамическое обновление необходимо для правильного отображения текста, доступности и SEO.
|
|
@@ -1309,7 +1307,7 @@ export const useI18nHTMLAttributes = () => {
|
|
|
1309
1307
|
const { locale } = useLocale();
|
|
1310
1308
|
|
|
1311
1309
|
useEffect(() => {
|
|
1312
|
-
// Обновить атрибут языка
|
|
1310
|
+
// Обновить атрибут языка на текущую локаль.
|
|
1313
1311
|
document.documentElement.lang = locale;
|
|
1314
1312
|
|
|
1315
1313
|
// Установить направление текста в зависимости от текущей локали.
|
|
@@ -1328,7 +1326,7 @@ const { getHTMLTextDir } = require("intlayer");
|
|
|
1328
1326
|
* - `lang`: Информирует браузеры и поисковые системы о языке страницы.
|
|
1329
1327
|
* - `dir`: Обеспечивает правильный порядок чтения (например, 'ltr' для английского, 'rtl' для арабского).
|
|
1330
1328
|
*
|
|
1331
|
-
* Это динамическое обновление необходимо для
|
|
1329
|
+
* Это динамическое обновление необходимо для корректного отображения текста, доступности и SEO.
|
|
1332
1330
|
*/
|
|
1333
1331
|
const useI18nHTMLAttributes = () => {
|
|
1334
1332
|
const { locale } = useLocale();
|
|
@@ -1412,6 +1410,23 @@ const App = () => (
|
|
|
1412
1410
|
);
|
|
1413
1411
|
|
|
1414
1412
|
module.exports = App;
|
|
1413
|
+
```
|
|
1414
|
+
|
|
1415
|
+
Применяя эти изменения, ваше приложение будет:
|
|
1416
|
+
|
|
1417
|
+
- Обеспечивать корректное отражение текущей локали в атрибуте **language** (`lang`), что важно для SEO и поведения браузера.
|
|
1418
|
+
- Регулировать **направление текста** (`dir`) в соответствии с локалью, улучшая читаемость и удобство для языков с разным порядком чтения.
|
|
1419
|
+
- Обеспечивать более **доступный** опыт, так как вспомогательные технологии зависят от этих атрибутов для оптимальной работы.
|
|
1420
|
+
|
|
1421
|
+
### (Необязательно) Шаг 10: Создание локализованного компонента ссылки
|
|
1422
|
+
|
|
1423
|
+
```tsx fileName="src/App.tsx" codeFormat="typescript"
|
|
1424
|
+
import type { FC } from "react";
|
|
1425
|
+
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
1426
|
+
import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
1427
|
+
import "./App.css";
|
|
1428
|
+
|
|
1429
|
+
const AppContent: FC = () => {
|
|
1415
1430
|
// Примените хук для обновления атрибутов lang и dir тега <html> в зависимости от локали.
|
|
1416
1431
|
useI18nHTMLAttributes();
|
|
1417
1432
|
|
|
@@ -1431,16 +1446,16 @@ module.exports = App;
|
|
|
1431
1446
|
|
|
1432
1447
|
- Обеспечивать корректное отражение текущей локали в атрибуте **языка** (`lang`), что важно для SEO и поведения браузера.
|
|
1433
1448
|
- Настраивать **направление текста** (`dir`) в соответствии с локалью, улучшая читаемость и удобство использования для языков с разным порядком чтения.
|
|
1434
|
-
-
|
|
1449
|
+
- Обеспечивать более **доступный** опыт, так как вспомогательные технологии зависят от этих атрибутов для оптимальной работы.
|
|
1435
1450
|
|
|
1436
1451
|
### (Необязательно) Шаг 10: Создание локализованного компонента Link
|
|
1437
1452
|
|
|
1438
|
-
Чтобы обеспечить навигацию вашего приложения с учётом текущей локали, вы можете создать
|
|
1453
|
+
Чтобы обеспечить навигацию вашего приложения с учётом текущей локали, вы можете создать пользовательский компонент `Link`. Этот компонент автоматически добавляет префикс текущего языка к внутренним URL, например, когда франкоязычный пользователь нажимает на ссылку на страницу "О нас", его перенаправляет на `/fr/about` вместо `/about`.
|
|
1439
1454
|
|
|
1440
1455
|
Такое поведение полезно по нескольким причинам:
|
|
1441
1456
|
|
|
1442
|
-
- **SEO и
|
|
1443
|
-
- **Последовательность**: Используя
|
|
1457
|
+
- **SEO и удобство для пользователя**: Локализованные URL помогают поисковым системам правильно индексировать страницы на разных языках и предоставлять пользователям контент на предпочитаемом языке.
|
|
1458
|
+
- **Последовательность**: Используя локализованную ссылку по всему приложению, вы гарантируете, что навигация остаётся в рамках текущей локали, предотвращая неожиданные переключения языка.
|
|
1444
1459
|
- **Поддерживаемость**: Централизация логики локализации в одном компоненте упрощает управление URL-адресами, делая ваш код более удобным для поддержки и расширения по мере роста приложения.
|
|
1445
1460
|
|
|
1446
1461
|
Ниже приведена реализация локализованного компонента `Link` на TypeScript:
|
|
@@ -1506,8 +1521,8 @@ export const checkIsExternalLink = (href?: string): boolean =>
|
|
|
1506
1521
|
|
|
1507
1522
|
/**
|
|
1508
1523
|
* Кастомный компонент Link, который адаптирует атрибут href в зависимости от текущей локали.
|
|
1509
|
-
* Для внутренних ссылок используется `getLocalizedUrl
|
|
1510
|
-
* Это гарантирует, что навигация остается в контексте
|
|
1524
|
+
* Для внутренних ссылок используется `getLocalizedUrl`, чтобы добавить префикс локали к URL (например, /fr/about).
|
|
1525
|
+
* Это гарантирует, что навигация остается в контексте одной локали.
|
|
1511
1526
|
*/
|
|
1512
1527
|
export const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1513
1528
|
const { locale } = useLocale();
|
|
@@ -1533,7 +1548,7 @@ const { useLocale } = require("react-intlayer");
|
|
|
1533
1548
|
const { forwardRef } = require("react");
|
|
1534
1549
|
|
|
1535
1550
|
/**
|
|
1536
|
-
*
|
|
1551
|
+
* Вспомогательная функция для проверки, является ли данный URL внешним.
|
|
1537
1552
|
* Если URL начинается с http:// или https://, он считается внешним.
|
|
1538
1553
|
*/
|
|
1539
1554
|
const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
@@ -1541,13 +1556,13 @@ const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
|
1541
1556
|
/**
|
|
1542
1557
|
* Пользовательский компонент Link, который адаптирует атрибут href в зависимости от текущей локали.
|
|
1543
1558
|
* Для внутренних ссылок используется `getLocalizedUrl`, чтобы добавить префикс локали к URL (например, /fr/about).
|
|
1544
|
-
* Это гарантирует, что навигация
|
|
1559
|
+
* Это гарантирует, что навигация останется в контексте той же локали.
|
|
1545
1560
|
*/
|
|
1546
1561
|
const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1547
1562
|
const { locale } = useLocale();
|
|
1548
1563
|
const isExternalLink = checkIsExternalLink(href);
|
|
1549
1564
|
|
|
1550
|
-
// Если ссылка внутренняя и href
|
|
1565
|
+
// Если ссылка внутренняя и задан корректный href, получить локализованный URL.
|
|
1551
1566
|
const localizedHref = isExternalLink ? href : getLocalizedUrl(href, locale);
|
|
1552
1567
|
|
|
1553
1568
|
return (
|
|
@@ -1616,14 +1631,14 @@ Intlayer использует расширение модулей (module augmen
|
|
|
1616
1631
|
|
|
1617
1632
|
Для улучшения вашего опыта разработки с Intlayer вы можете установить официальное **расширение Intlayer для VS Code**.
|
|
1618
1633
|
|
|
1619
|
-
[Установить из VS Code
|
|
1634
|
+
[Установить из магазина расширений VS Code](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
1620
1635
|
|
|
1621
1636
|
Это расширение предоставляет:
|
|
1622
1637
|
|
|
1623
1638
|
- **Автодополнение** для ключей переводов.
|
|
1624
1639
|
- **Обнаружение ошибок в реальном времени** для отсутствующих переводов.
|
|
1625
|
-
- **Встроенный
|
|
1626
|
-
- **Быстрые действия** для
|
|
1640
|
+
- **Встроенный просмотр** переведенного контента.
|
|
1641
|
+
- **Быстрые действия** для удобного создания и обновления переводов.
|
|
1627
1642
|
|
|
1628
1643
|
Для получения дополнительной информации о том, как использовать расширение, обратитесь к [документации расширения Intlayer для VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
1629
1644
|
|