@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: Começando com Intlayer em Vite + React
|
|
5
|
+
description: Aprenda como adicionar internacionalização (i18n) à sua aplicação Vite e React usando Intlayer. Siga este guia para tornar seu app multilíngue.
|
|
6
6
|
keywords:
|
|
7
7
|
- Internacionalização
|
|
8
8
|
- Documentação
|
|
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
|
# Começando a Internacionalizar (i18n) com Intlayer, Vite e React
|
|
@@ -27,10 +27,10 @@ Veja o [Modelo de Aplicação](https://github.com/aymericzip/intlayer-vite-react
|
|
|
27
27
|
|
|
28
28
|
Com o Intlayer, você pode:
|
|
29
29
|
|
|
30
|
-
- **
|
|
31
|
-
- **
|
|
32
|
-
- **
|
|
33
|
-
- **
|
|
30
|
+
- **Gerencie traduções facilmente** usando dicionários declarativos no nível do componente.
|
|
31
|
+
- **Localize dinamicamente metadados**, rotas e conteúdo.
|
|
32
|
+
- **Garanta suporte ao TypeScript** com tipos autogerados, melhorando o autocompletar e a detecção de erros.
|
|
33
|
+
- **Beneficie-se de recursos avançados**, como detecção e troca dinâmica de localidade.
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
@@ -63,7 +63,7 @@ yarn add --save-dev vite-intlayer
|
|
|
63
63
|
O pacote que integra o Intlayer com aplicações React. Ele fornece provedores de contexto e hooks para internacionalização em React.
|
|
64
64
|
|
|
65
65
|
- **vite-intlayer**
|
|
66
|
-
Inclui o plugin Vite para integrar o Intlayer com o [empacotador Vite](https://vite.dev/guide/why.html#why-bundle-for-production),
|
|
66
|
+
Inclui o plugin Vite para integrar o Intlayer com o [empacotador Vite](https://vite.dev/guide/why.html#why-bundle-for-production), além de middleware para detectar a localidade preferida do usuário, gerenciar cookies e lidar com redirecionamento de URL.
|
|
67
67
|
|
|
68
68
|
### Passo 2: Configuração do seu projeto
|
|
69
69
|
|
|
@@ -164,7 +164,7 @@ module.exports = defineConfig({
|
|
|
164
164
|
});
|
|
165
165
|
```
|
|
166
166
|
|
|
167
|
-
> O plugin Vite `intlayerPlugin()` é usado para integrar o Intlayer com o Vite. Ele garante a construção dos arquivos de declaração de conteúdo e os monitora no modo de desenvolvimento. Define
|
|
167
|
+
> O plugin Vite `intlayerPlugin()` é usado para integrar o Intlayer com o Vite. Ele garante a construção dos arquivos de declaração de conteúdo e os monitora no modo de desenvolvimento. Define variáveis de ambiente do Intlayer dentro da aplicação Vite. Além disso, fornece aliases para otimizar o desempenho.
|
|
168
168
|
|
|
169
169
|
### Passo 4: Declare Seu Conteúdo
|
|
170
170
|
|
|
@@ -215,7 +215,7 @@ const appContent = {
|
|
|
215
215
|
}),
|
|
216
216
|
|
|
217
217
|
readTheDocs: t({
|
|
218
|
-
en: "
|
|
218
|
+
en: "Clique nos logos do Vite e React para saber mais",
|
|
219
219
|
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
220
220
|
es: "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
221
221
|
}),
|
|
@@ -255,7 +255,7 @@ const appContent = {
|
|
|
255
255
|
t <
|
|
256
256
|
ReactNode >
|
|
257
257
|
{
|
|
258
|
-
// Não se esqueça de importar React se
|
|
258
|
+
// Não se esqueça de importar React se usar um nó React no seu conteúdo
|
|
259
259
|
en: (
|
|
260
260
|
<>
|
|
261
261
|
Edit <code>src/App.tsx</code> e salve para testar HMR
|
|
@@ -274,7 +274,7 @@ const appContent = {
|
|
|
274
274
|
},
|
|
275
275
|
|
|
276
276
|
readTheDocs: t({
|
|
277
|
-
en: "
|
|
277
|
+
en: "Click on the Vite and React logos to learn more",
|
|
278
278
|
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
279
279
|
es: "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
280
280
|
}),
|
|
@@ -292,13 +292,13 @@ const appContent = {
|
|
|
292
292
|
key: "app",
|
|
293
293
|
content: {
|
|
294
294
|
viteLogo: t({
|
|
295
|
-
pt: "Logo
|
|
295
|
+
pt: "Logo Vite",
|
|
296
296
|
en: "Vite logo",
|
|
297
297
|
fr: "Logo Vite",
|
|
298
298
|
es: "Logo Vite",
|
|
299
299
|
}),
|
|
300
300
|
reactLogo: t({
|
|
301
|
-
pt: "Logo
|
|
301
|
+
pt: "Logo React",
|
|
302
302
|
en: "React logo",
|
|
303
303
|
fr: "Logo React",
|
|
304
304
|
es: "Logo React",
|
|
@@ -360,7 +360,7 @@ module.exports = appContent;
|
|
|
360
360
|
"viteLogo": {
|
|
361
361
|
"nodeType": "translation",
|
|
362
362
|
"translation": {
|
|
363
|
-
"pt": "Logo
|
|
363
|
+
"pt": "Logo Vite",
|
|
364
364
|
"en": "Vite logo",
|
|
365
365
|
"fr": "Logo Vite",
|
|
366
366
|
"es": "Logo Vite"
|
|
@@ -369,43 +369,43 @@ module.exports = appContent;
|
|
|
369
369
|
"reactLogo": {
|
|
370
370
|
"nodeType": "translation",
|
|
371
371
|
"translation": {
|
|
372
|
-
"pt": "Logo React",
|
|
373
372
|
"en": "React logo",
|
|
374
373
|
"fr": "Logo React",
|
|
375
|
-
"es": "Logo React"
|
|
374
|
+
"es": "Logo React",
|
|
375
|
+
"pt": "Logo React"
|
|
376
376
|
}
|
|
377
377
|
},
|
|
378
378
|
"title": {
|
|
379
379
|
"nodeType": "translation",
|
|
380
380
|
"translation": {
|
|
381
|
-
"pt": "Vite + React",
|
|
382
381
|
"en": "Vite + React",
|
|
383
382
|
"fr": "Vite + React",
|
|
384
|
-
"es": "Vite + React"
|
|
383
|
+
"es": "Vite + React",
|
|
384
|
+
"pt": "Vite + React"
|
|
385
385
|
}
|
|
386
386
|
},
|
|
387
387
|
"count": {
|
|
388
388
|
"nodeType": "translation",
|
|
389
389
|
"translation": {
|
|
390
|
-
"pt": "a contagem é ",
|
|
391
390
|
"en": "count is ",
|
|
392
391
|
"fr": "le compte est ",
|
|
393
|
-
"es": "el recuento es "
|
|
392
|
+
"es": "el recuento es ",
|
|
393
|
+
"pt": "a contagem é "
|
|
394
394
|
}
|
|
395
395
|
},
|
|
396
396
|
"edit": {
|
|
397
397
|
"nodeType": "translation",
|
|
398
398
|
"translation": {
|
|
399
|
-
"pt": "Edite src/App.tsx e salve para testar HMR",
|
|
400
399
|
"en": "Edit src/App.tsx and save to test HMR",
|
|
401
400
|
"fr": "Éditez src/App.tsx et enregistrez pour tester HMR",
|
|
402
|
-
"es": "Edita src/App.tsx y guarda para probar HMR"
|
|
401
|
+
"es": "Edita src/App.tsx y guarda para probar HMR",
|
|
402
|
+
"pt": "Edite src/App.tsx e salve para testar HMR"
|
|
403
403
|
}
|
|
404
404
|
},
|
|
405
405
|
"readTheDocs": {
|
|
406
406
|
"nodeType": "translation",
|
|
407
407
|
"translation": {
|
|
408
|
-
"pt": "Clique nos logos do Vite e React para saber mais",
|
|
408
|
+
"pt": "Clique nos logos do Vite e do React para saber mais",
|
|
409
409
|
"en": "Click on the Vite and React logos to learn more",
|
|
410
410
|
"fr": "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
411
411
|
"es": "Haga clic en los logotipos de Vite y React para obtener más información"
|
|
@@ -566,7 +566,7 @@ const App = () => (
|
|
|
566
566
|
module.exports = App;
|
|
567
567
|
```
|
|
568
568
|
|
|
569
|
-
> Se quiser usar seu conteúdo em um atributo `string`, como `alt`, `title`, `href`, `aria-label`, etc., você deve chamar o valor da função, assim:
|
|
569
|
+
> Se você quiser usar seu conteúdo em um atributo do tipo `string`, como `alt`, `title`, `href`, `aria-label`, etc., você deve chamar o valor da função, assim:
|
|
570
570
|
|
|
571
571
|
> ```jsx
|
|
572
572
|
> <img src={content.image.src.value} alt={content.image.value} />
|
|
@@ -594,28 +594,6 @@ const LocaleSwitcher: FC = () => {
|
|
|
594
594
|
};
|
|
595
595
|
```
|
|
596
596
|
|
|
597
|
-
> Para saber mais sobre o hook `useIntlayer`, consulte a [documentação](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/packages/react-intlayer/useIntlayer.md).
|
|
598
|
-
|
|
599
|
-
### (Opcional) Passo 6: Alterar o idioma do seu conteúdo
|
|
600
|
-
|
|
601
|
-
Para alterar o idioma do seu conteúdo, você pode usar a função `setLocale` fornecida pelo hook `useLocale`. Esta função permite definir o locale da aplicação e atualizar o conteúdo de acordo.
|
|
602
|
-
|
|
603
|
-
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
604
|
-
import type { FC } from "react";
|
|
605
|
-
import { Locales } from "intlayer";
|
|
606
|
-
import { useLocale } from "react-intlayer";
|
|
607
|
-
|
|
608
|
-
const LocaleSwitcher: FC = () => {
|
|
609
|
-
const { setLocale } = useLocale();
|
|
610
|
-
|
|
611
|
-
return (
|
|
612
|
-
<button onClick={() => setLocale(Locales.English)}>
|
|
613
|
-
Alterar idioma para Inglês
|
|
614
|
-
</button>
|
|
615
|
-
);
|
|
616
|
-
};
|
|
617
|
-
```
|
|
618
|
-
|
|
619
597
|
```jsx fileName="src/components/LocaleSwitcher.msx" codeFormat="esm"
|
|
620
598
|
import { Locales } from "intlayer";
|
|
621
599
|
import { useLocale } from "react-intlayer";
|
|
@@ -648,7 +626,7 @@ const LocaleSwitcher = () => {
|
|
|
648
626
|
|
|
649
627
|
> Para saber mais sobre o hook `useLocale`, consulte a [documentação](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/packages/react-intlayer/useLocale.md).
|
|
650
628
|
|
|
651
|
-
### (Opcional) Passo 7: Adicionar
|
|
629
|
+
### (Opcional) Passo 7: Adicionar roteamento localizado à sua aplicação
|
|
652
630
|
|
|
653
631
|
O objetivo deste passo é criar rotas únicas para cada idioma. Isso é útil para SEO e URLs amigáveis para SEO.
|
|
654
632
|
Exemplo:
|
|
@@ -661,7 +639,7 @@ Exemplo:
|
|
|
661
639
|
|
|
662
640
|
> Por padrão, as rotas não são prefixadas para o idioma padrão. Se você quiser prefixar o idioma padrão, pode definir a opção `middleware.prefixDefault` como `true` na sua configuração. Veja a [documentação de configuração](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/configuration.md) para mais informações.
|
|
663
641
|
|
|
664
|
-
Para adicionar roteamento localizado à sua aplicação, você pode criar um componente `LocaleRouter` que envolve as rotas da sua aplicação e gerencia o roteamento baseado no idioma. Aqui está um exemplo usando
|
|
642
|
+
Para adicionar roteamento localizado à sua aplicação, você pode criar um componente `LocaleRouter` que envolve as rotas da sua aplicação e gerencia o roteamento baseado no idioma. Aqui está um exemplo usando [React Router](https://reactrouter.com/home):
|
|
665
643
|
|
|
666
644
|
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
667
645
|
// Importando dependências e funções necessárias
|
|
@@ -674,7 +652,7 @@ import {
|
|
|
674
652
|
Route,
|
|
675
653
|
Navigate,
|
|
676
654
|
useLocation,
|
|
677
|
-
} from "react-router-dom"; // Componentes do roteador para
|
|
655
|
+
} from "react-router-dom"; // Componentes do roteador para gerenciar navegação
|
|
678
656
|
|
|
679
657
|
// Desestruturando configuração do Intlayer
|
|
680
658
|
const { internationalization, middleware } = configuration;
|
|
@@ -682,29 +660,29 @@ const { locales, defaultLocale } = internationalization;
|
|
|
682
660
|
|
|
683
661
|
/**
|
|
684
662
|
* Um componente que gerencia a localização e envolve os filhos com o contexto de local apropriado.
|
|
685
|
-
* Ele gerencia a detecção e validação
|
|
663
|
+
* Ele gerencia a detecção e validação da localidade baseada na URL.
|
|
686
664
|
*/
|
|
687
665
|
const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
688
666
|
children,
|
|
689
667
|
locale,
|
|
690
668
|
}) => {
|
|
691
|
-
const { pathname, search } = useLocation(); //
|
|
669
|
+
const { pathname, search } = useLocation(); // Obtém o caminho atual da URL
|
|
692
670
|
|
|
693
|
-
//
|
|
671
|
+
// Determina o idioma atual, usando o padrão caso não seja fornecido
|
|
694
672
|
const currentLocale = locale ?? defaultLocale;
|
|
695
673
|
|
|
696
|
-
//
|
|
674
|
+
// Remove o prefixo do idioma do caminho para construir um caminho base
|
|
697
675
|
const pathWithoutLocale = getPathWithoutLocale(
|
|
698
676
|
pathname // Caminho atual da URL
|
|
699
677
|
);
|
|
700
678
|
|
|
701
679
|
/**
|
|
702
|
-
* Se middleware.prefixDefault for true, o
|
|
680
|
+
* Se middleware.prefixDefault for true, o idioma padrão deve sempre ser prefixado.
|
|
703
681
|
*/
|
|
704
682
|
if (middleware.prefixDefault) {
|
|
705
|
-
//
|
|
683
|
+
// Valida o idioma
|
|
706
684
|
if (!locale || !locales.includes(locale)) {
|
|
707
|
-
//
|
|
685
|
+
// Redireciona para o idioma padrão com o caminho atualizado
|
|
708
686
|
return (
|
|
709
687
|
<Navigate
|
|
710
688
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
@@ -713,28 +691,28 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
713
691
|
);
|
|
714
692
|
}
|
|
715
693
|
|
|
716
|
-
// Envolve os filhos com o IntlayerProvider e define
|
|
694
|
+
// Envolve os filhos com o IntlayerProvider e define a localidade atual
|
|
717
695
|
return (
|
|
718
696
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
719
697
|
);
|
|
720
698
|
} else {
|
|
721
699
|
/**
|
|
722
|
-
* Quando middleware.prefixDefault é falso,
|
|
723
|
-
*
|
|
700
|
+
* Quando middleware.prefixDefault é falso, a localidade padrão não é prefixada.
|
|
701
|
+
* Assegura que a localidade atual seja válida e não a localidade padrão.
|
|
724
702
|
*/
|
|
725
703
|
if (
|
|
726
704
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
727
705
|
!locales
|
|
728
706
|
.filter(
|
|
729
|
-
(locale) => locale.toString() !== defaultLocale.toString() // Exclui
|
|
707
|
+
(locale) => locale.toString() !== defaultLocale.toString() // Exclui a localidade padrão
|
|
730
708
|
)
|
|
731
|
-
.includes(currentLocale) // Verifica se o
|
|
709
|
+
.includes(currentLocale) // Verifica se o idioma atual está na lista de idiomas válidos
|
|
732
710
|
) {
|
|
733
|
-
// Redireciona para o caminho sem o prefixo
|
|
711
|
+
// Redireciona para o caminho sem o prefixo do idioma
|
|
734
712
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
735
713
|
}
|
|
736
714
|
|
|
737
|
-
// Envolve os filhos com o IntlayerProvider e define o
|
|
715
|
+
// Envolve os filhos com o IntlayerProvider e define o idioma atual
|
|
738
716
|
return (
|
|
739
717
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
740
718
|
);
|
|
@@ -742,7 +720,7 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
742
720
|
};
|
|
743
721
|
|
|
744
722
|
/**
|
|
745
|
-
* Um componente de roteador que configura rotas específicas por
|
|
723
|
+
* Um componente de roteador que configura rotas específicas por idioma.
|
|
746
724
|
* Ele usa o React Router para gerenciar a navegação e renderizar componentes localizados.
|
|
747
725
|
*/
|
|
748
726
|
export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
@@ -754,21 +732,21 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
754
732
|
)
|
|
755
733
|
.map((locale) => (
|
|
756
734
|
<Route
|
|
757
|
-
// Padrão de rota para capturar
|
|
735
|
+
// Padrão de rota para capturar a localidade (ex.: /en/, /fr/) e corresponder a todos os caminhos subsequentes
|
|
758
736
|
path={`/${locale}/*`}
|
|
759
737
|
key={locale}
|
|
760
|
-
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Envolve os filhos com o gerenciamento de
|
|
738
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Envolve os filhos com o gerenciamento de localidade
|
|
761
739
|
/>
|
|
762
740
|
))}
|
|
763
741
|
|
|
764
742
|
{
|
|
765
|
-
// Se o prefixo
|
|
743
|
+
// Se o prefixo da localidade padrão estiver desativado, renderiza os filhos diretamente na raiz
|
|
766
744
|
!middleware.prefixDefault && (
|
|
767
745
|
<Route
|
|
768
746
|
path="*"
|
|
769
747
|
element={
|
|
770
748
|
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
771
|
-
} // Envolve os filhos com o gerenciamento de
|
|
749
|
+
} // Envolve os filhos com o gerenciamento de localidade
|
|
772
750
|
/>
|
|
773
751
|
)
|
|
774
752
|
}
|
|
@@ -796,26 +774,26 @@ const { locales, defaultLocale } = internationalization;
|
|
|
796
774
|
|
|
797
775
|
/**
|
|
798
776
|
* Um componente que gerencia a localização e envolve os filhos com o contexto de local apropriado.
|
|
799
|
-
* Ele gerencia a detecção e validação
|
|
777
|
+
* Ele gerencia a detecção e validação da localidade baseada na URL.
|
|
800
778
|
*/
|
|
801
779
|
const AppLocalized = ({ children, locale }) => {
|
|
802
780
|
const { pathname, search } = useLocation(); // Obtém o caminho atual da URL
|
|
803
781
|
|
|
804
|
-
// Determina
|
|
782
|
+
// Determina a localidade atual, usando a localidade padrão caso não seja fornecida
|
|
805
783
|
const currentLocale = locale ?? defaultLocale;
|
|
806
784
|
|
|
807
|
-
// Remove o prefixo
|
|
785
|
+
// Remove o prefixo da localidade do caminho para construir um caminho base
|
|
808
786
|
const pathWithoutLocale = getPathWithoutLocale(
|
|
809
787
|
pathname // Caminho atual da URL
|
|
810
788
|
);
|
|
811
789
|
|
|
812
790
|
/**
|
|
813
|
-
* Se middleware.prefixDefault for verdadeiro,
|
|
791
|
+
* Se middleware.prefixDefault for verdadeiro, a localidade padrão deve sempre ser prefixada.
|
|
814
792
|
*/
|
|
815
793
|
if (middleware.prefixDefault) {
|
|
816
|
-
// Valida
|
|
794
|
+
// Valida a localidade
|
|
817
795
|
if (!locale || !locales.includes(locale)) {
|
|
818
|
-
// Redireciona para
|
|
796
|
+
// Redireciona para a localidade padrão com o caminho atualizado
|
|
819
797
|
return (
|
|
820
798
|
<Navigate
|
|
821
799
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
@@ -824,28 +802,28 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
824
802
|
);
|
|
825
803
|
}
|
|
826
804
|
|
|
827
|
-
// Envolve os filhos com o IntlayerProvider e define
|
|
805
|
+
// Envolve os filhos com o IntlayerProvider e define a localidade atual
|
|
828
806
|
return (
|
|
829
807
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
830
808
|
);
|
|
831
809
|
} else {
|
|
832
810
|
/**
|
|
833
|
-
* Quando middleware.prefixDefault é falso,
|
|
834
|
-
*
|
|
811
|
+
* Quando middleware.prefixDefault é falso, a localidade padrão não é prefixada.
|
|
812
|
+
* Garante que a localidade atual seja válida e não a localidade padrão.
|
|
835
813
|
*/
|
|
836
814
|
if (
|
|
837
815
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
838
816
|
!locales
|
|
839
817
|
.filter(
|
|
840
|
-
(locale) => locale.toString() !== defaultLocale.toString() // Exclui
|
|
818
|
+
(locale) => locale.toString() !== defaultLocale.toString() // Exclui a localidade padrão
|
|
841
819
|
)
|
|
842
|
-
.includes(currentLocale) // Verifica se
|
|
820
|
+
.includes(currentLocale) // Verifica se a localidade atual está na lista de localidades válidas
|
|
843
821
|
) {
|
|
844
|
-
// Redireciona para o caminho sem o prefixo
|
|
822
|
+
// Redireciona para o caminho sem o prefixo da localidade
|
|
845
823
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
846
824
|
}
|
|
847
825
|
|
|
848
|
-
// Envolve os filhos com o IntlayerProvider e define
|
|
826
|
+
// Envolve os filhos com o IntlayerProvider e define a localidade atual
|
|
849
827
|
return (
|
|
850
828
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
851
829
|
);
|
|
@@ -853,7 +831,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
853
831
|
};
|
|
854
832
|
|
|
855
833
|
/**
|
|
856
|
-
* Um componente de roteador que configura rotas específicas por
|
|
834
|
+
* Um componente de roteador que configura rotas específicas por localidade.
|
|
857
835
|
* Ele usa o React Router para gerenciar a navegação e renderizar componentes localizados.
|
|
858
836
|
*/
|
|
859
837
|
export const LocaleRouter = ({ children }) => (
|
|
@@ -865,21 +843,21 @@ export const LocaleRouter = ({ children }) => (
|
|
|
865
843
|
)
|
|
866
844
|
.map((locale) => (
|
|
867
845
|
<Route
|
|
868
|
-
// Padrão de rota para capturar
|
|
846
|
+
// Padrão de rota para capturar a localidade (ex.: /en/, /fr/) e corresponder a todos os caminhos subsequentes
|
|
869
847
|
path={`/${locale}/*`}
|
|
870
848
|
key={locale}
|
|
871
|
-
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Envolve os filhos com o gerenciamento de
|
|
849
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Envolve os filhos com o gerenciamento de localidade
|
|
872
850
|
/>
|
|
873
851
|
))}
|
|
874
852
|
|
|
875
853
|
{
|
|
876
|
-
// Se o prefixo
|
|
854
|
+
// Se o prefixo da localidade padrão estiver desativado, renderiza os filhos diretamente na raiz
|
|
877
855
|
!middleware.prefixDefault && (
|
|
878
856
|
<Route
|
|
879
857
|
path="*"
|
|
880
858
|
element={
|
|
881
859
|
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
882
|
-
} // Envolve os filhos com o gerenciamento de
|
|
860
|
+
} // Envolve os filhos com o gerenciamento de localidade
|
|
883
861
|
/>
|
|
884
862
|
)
|
|
885
863
|
}
|
|
@@ -905,27 +883,27 @@ const { internationalization, middleware } = configuration;
|
|
|
905
883
|
const { locales, defaultLocale } = internationalization;
|
|
906
884
|
|
|
907
885
|
/**
|
|
908
|
-
* Um componente que gerencia a localização e envolve os filhos com o contexto de
|
|
909
|
-
* Ele gerencia a detecção e validação
|
|
886
|
+
* Um componente que gerencia a localização e envolve os filhos com o contexto de localidade apropriado.
|
|
887
|
+
* Ele gerencia a detecção e validação da localidade baseada na URL.
|
|
910
888
|
*/
|
|
911
889
|
const AppLocalized = ({ children, locale }) => {
|
|
912
|
-
const { pathname, search } = useLocation(); //
|
|
890
|
+
const { pathname, search } = useLocation(); // Obtém o caminho atual da URL
|
|
913
891
|
|
|
914
|
-
//
|
|
892
|
+
// Determina o locale atual, usando o padrão caso não seja fornecido
|
|
915
893
|
const currentLocale = locale ?? defaultLocale;
|
|
916
894
|
|
|
917
|
-
//
|
|
895
|
+
// Remove o prefixo do locale do caminho para construir um caminho base
|
|
918
896
|
const pathWithoutLocale = getPathWithoutLocale(
|
|
919
897
|
pathname // Caminho atual da URL
|
|
920
898
|
);
|
|
921
899
|
|
|
922
900
|
/**
|
|
923
|
-
* Se middleware.prefixDefault for
|
|
901
|
+
* Se middleware.prefixDefault for true, o locale padrão deve sempre ser prefixado.
|
|
924
902
|
*/
|
|
925
903
|
if (middleware.prefixDefault) {
|
|
926
|
-
//
|
|
904
|
+
// Valida o locale
|
|
927
905
|
if (!locale || !locales.includes(locale)) {
|
|
928
|
-
//
|
|
906
|
+
// Redireciona para o locale padrão com o caminho atualizado
|
|
929
907
|
return (
|
|
930
908
|
<Navigate
|
|
931
909
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
@@ -941,7 +919,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
941
919
|
} else {
|
|
942
920
|
/**
|
|
943
921
|
* Quando middleware.prefixDefault é falso, o locale padrão não é prefixado.
|
|
944
|
-
*
|
|
922
|
+
* Garante que o locale atual seja válido e não o locale padrão.
|
|
945
923
|
*/
|
|
946
924
|
if (
|
|
947
925
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -951,7 +929,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
951
929
|
)
|
|
952
930
|
.includes(currentLocale) // Verifica se o locale atual está na lista de locales válidos
|
|
953
931
|
) {
|
|
954
|
-
// Redireciona para o caminho sem prefixo
|
|
932
|
+
// Redireciona para o caminho sem o prefixo do locale
|
|
955
933
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
956
934
|
}
|
|
957
935
|
|
|
@@ -983,7 +961,7 @@ const LocaleRouter = ({ children }) => (
|
|
|
983
961
|
))}
|
|
984
962
|
|
|
985
963
|
{
|
|
986
|
-
// Se o prefixo para o locale padrão estiver
|
|
964
|
+
// Se o prefixo para o locale padrão estiver desabilitado, renderiza os filhos diretamente na raiz
|
|
987
965
|
!middleware.prefixDefault && (
|
|
988
966
|
<Route
|
|
989
967
|
path="*"
|
|
@@ -1093,11 +1071,11 @@ const LocaleSwitcher: FC = () => {
|
|
|
1093
1071
|
|
|
1094
1072
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1095
1073
|
onLocaleChange: (locale) => {
|
|
1096
|
-
//
|
|
1074
|
+
// Construir a URL com o locale atualizado
|
|
1097
1075
|
// Exemplo: /es/about?foo=bar
|
|
1098
1076
|
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1099
1077
|
|
|
1100
|
-
//
|
|
1078
|
+
// Atualizar o caminho da URL
|
|
1101
1079
|
navigate(pathWithLocale);
|
|
1102
1080
|
},
|
|
1103
1081
|
});
|
|
@@ -1118,19 +1096,19 @@ const LocaleSwitcher: FC = () => {
|
|
|
1118
1096
|
key={localeItem}
|
|
1119
1097
|
>
|
|
1120
1098
|
<span>
|
|
1121
|
-
{/* Local - ex
|
|
1099
|
+
{/* Local - ex: FR */}
|
|
1122
1100
|
{localeItem}
|
|
1123
1101
|
</span>
|
|
1124
1102
|
<span>
|
|
1125
|
-
{/* Idioma na sua própria
|
|
1103
|
+
{/* Idioma na sua própria localidade - ex: Français */}
|
|
1126
1104
|
{getLocaleName(localeItem, locale)}
|
|
1127
1105
|
</span>
|
|
1128
1106
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1129
|
-
{/* Idioma na
|
|
1107
|
+
{/* Idioma na localidade atual - ex: Francés com localidade atual definida para Locales.SPANISH */}
|
|
1130
1108
|
{getLocaleName(localeItem)}
|
|
1131
1109
|
</span>
|
|
1132
1110
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1133
|
-
{/* Idioma em
|
|
1111
|
+
{/* Idioma em inglês - ex: French */}
|
|
1134
1112
|
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1135
1113
|
</span>
|
|
1136
1114
|
</a>
|
|
@@ -1182,19 +1160,19 @@ const LocaleSwitcher = () => {
|
|
|
1182
1160
|
key={localeItem}
|
|
1183
1161
|
>
|
|
1184
1162
|
<span>
|
|
1185
|
-
{/*
|
|
1163
|
+
{/* Localidade - ex: FR */}
|
|
1186
1164
|
{localeItem}
|
|
1187
1165
|
</span>
|
|
1188
1166
|
<span>
|
|
1189
|
-
{/* Idioma
|
|
1167
|
+
{/* Idioma na sua própria localidade - ex: Français */}
|
|
1190
1168
|
{getLocaleName(localeItem, locale)}
|
|
1191
1169
|
</span>
|
|
1192
1170
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1193
|
-
{/* Idioma
|
|
1171
|
+
{/* Idioma no Locale atual - ex. Francés com o locale atual definido para Locales.SPANISH */}
|
|
1194
1172
|
{getLocaleName(localeItem)}
|
|
1195
1173
|
</span>
|
|
1196
1174
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1197
|
-
{/* Idioma em
|
|
1175
|
+
{/* Idioma em inglês - ex. French */}
|
|
1198
1176
|
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1199
1177
|
</span>
|
|
1200
1178
|
</a>
|
|
@@ -1250,11 +1228,11 @@ const LocaleSwitcher = () => {
|
|
|
1250
1228
|
{localeItem}
|
|
1251
1229
|
</span>
|
|
1252
1230
|
<span>
|
|
1253
|
-
{/*
|
|
1231
|
+
{/* Língua no seu próprio local - ex: Français */}
|
|
1254
1232
|
{getLocaleName(localeItem, locale)}
|
|
1255
1233
|
</span>
|
|
1256
1234
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1257
|
-
{/*
|
|
1235
|
+
{/* Língua no local atual - ex: Francés com local atual definido para Locales.SPANISH */}
|
|
1258
1236
|
{getLocaleName(localeItem)}
|
|
1259
1237
|
</span>
|
|
1260
1238
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
@@ -1292,11 +1270,11 @@ Quando sua aplicação suporta múltiplos idiomas, é crucial atualizar os atrib
|
|
|
1292
1270
|
- **Renderização de Texto**: O atributo `dir` (direção) assegura que o texto seja exibido na ordem correta (por exemplo, da esquerda para a direita para inglês, da direita para a esquerda para árabe ou hebraico), o que é essencial para a legibilidade.
|
|
1293
1271
|
- **SEO**: Motores de busca usam o atributo `lang` para determinar o idioma da sua página, ajudando a exibir o conteúdo localizado correto nos resultados de busca.
|
|
1294
1272
|
|
|
1295
|
-
Ao atualizar esses atributos dinamicamente quando o
|
|
1273
|
+
Ao atualizar esses atributos dinamicamente quando o locale muda, você garante uma experiência consistente e acessível para os usuários em todos os idiomas suportados.
|
|
1296
1274
|
|
|
1297
1275
|
#### Implementando o Hook
|
|
1298
1276
|
|
|
1299
|
-
Crie um hook personalizado para gerenciar os atributos do HTML. O hook escuta as mudanças de
|
|
1277
|
+
Crie um hook personalizado para gerenciar os atributos do HTML. O hook escuta as mudanças de locale e atualiza os atributos conforme necessário:
|
|
1300
1278
|
|
|
1301
1279
|
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
1302
1280
|
import { useEffect } from "react";
|
|
@@ -1304,7 +1282,7 @@ import { useLocale } from "react-intlayer";
|
|
|
1304
1282
|
import { getHTMLTextDir } from "intlayer";
|
|
1305
1283
|
|
|
1306
1284
|
/**
|
|
1307
|
-
* Atualiza os atributos `lang` e `dir` do elemento <html> com base no
|
|
1285
|
+
* Atualiza os atributos `lang` e `dir` do elemento HTML <html> com base no locale atual.
|
|
1308
1286
|
* - `lang`: Informa aos navegadores e motores de busca o idioma da página.
|
|
1309
1287
|
* - `dir`: Garante a ordem correta de leitura (ex: 'ltr' para inglês, 'rtl' para árabe).
|
|
1310
1288
|
*
|
|
@@ -1331,7 +1309,7 @@ import { getHTMLTextDir } from "intlayer";
|
|
|
1331
1309
|
/**
|
|
1332
1310
|
* Atualiza os atributos `lang` e `dir` do elemento HTML <html> com base no locale atual.
|
|
1333
1311
|
* - `lang`: Informa aos navegadores e motores de busca o idioma da página.
|
|
1334
|
-
* - `dir`: Garante a ordem correta
|
|
1312
|
+
* - `dir`: Garante a ordem correta de leitura (ex.: 'ltr' para inglês, 'rtl' para árabe).
|
|
1335
1313
|
*
|
|
1336
1314
|
* Esta atualização dinâmica é essencial para a renderização correta do texto, acessibilidade e SEO.
|
|
1337
1315
|
*/
|
|
@@ -1458,7 +1436,7 @@ Esse comportamento é útil por várias razões:
|
|
|
1458
1436
|
|
|
1459
1437
|
- **SEO e Experiência do Usuário**: URLs localizadas ajudam os motores de busca a indexar corretamente páginas específicas por idioma e fornecem aos usuários conteúdo no idioma de sua preferência.
|
|
1460
1438
|
- **Consistência**: Ao usar um link localizado em toda a sua aplicação, você garante que a navegação permaneça dentro do idioma atual, evitando mudanças inesperadas de idioma.
|
|
1461
|
-
- **
|
|
1439
|
+
- **Manutenção**: Centralizar a lógica de localização em um único componente simplifica o gerenciamento das URLs, tornando seu código mais fácil de manter e expandir conforme sua aplicação cresce.
|
|
1462
1440
|
|
|
1463
1441
|
Abaixo está a implementação de um componente `Link` localizado em TypeScript:
|
|
1464
1442
|
|
|
@@ -1478,15 +1456,15 @@ export interface LinkProps
|
|
|
1478
1456
|
> {}
|
|
1479
1457
|
|
|
1480
1458
|
/**
|
|
1481
|
-
* Função utilitária para verificar se uma URL
|
|
1482
|
-
* Se a URL começar com http:// ou https://,
|
|
1459
|
+
* Função utilitária para verificar se uma URL é externa.
|
|
1460
|
+
* Se a URL começar com http:// ou https://, é considerada externa.
|
|
1483
1461
|
*/
|
|
1484
1462
|
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1485
1463
|
/^https?:\/\//.test(href ?? "");
|
|
1486
1464
|
|
|
1487
1465
|
/**
|
|
1488
1466
|
* Um componente Link personalizado que adapta o atributo href com base na localidade atual.
|
|
1489
|
-
* Para links internos,
|
|
1467
|
+
* Para links internos, ele usa `getLocalizedUrl` para prefixar a URL com a localidade (ex: /fr/about).
|
|
1490
1468
|
* Isso garante que a navegação permaneça dentro do mesmo contexto de localidade.
|
|
1491
1469
|
*/
|
|
1492
1470
|
export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
@@ -1494,7 +1472,7 @@ export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
|
1494
1472
|
const { locale } = useLocale();
|
|
1495
1473
|
const isExternalLink = checkIsExternalLink(href);
|
|
1496
1474
|
|
|
1497
|
-
// Se o link for interno e um href válido for fornecido,
|
|
1475
|
+
// Se o link for interno e um href válido for fornecido, obtenha a URL localizada.
|
|
1498
1476
|
const hrefI18n =
|
|
1499
1477
|
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1500
1478
|
|
|
@@ -1515,16 +1493,16 @@ import { useLocale } from "react-intlayer";
|
|
|
1515
1493
|
import { forwardRef } from "react";
|
|
1516
1494
|
|
|
1517
1495
|
/**
|
|
1518
|
-
* Função utilitária para verificar se uma URL é externa.
|
|
1496
|
+
* Função utilitária para verificar se uma URL fornecida é externa.
|
|
1519
1497
|
* Se a URL começar com http:// ou https://, é considerada externa.
|
|
1520
1498
|
*/
|
|
1521
1499
|
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1522
1500
|
/^https?:\/\//.test(href ?? "");
|
|
1523
1501
|
|
|
1524
1502
|
/**
|
|
1525
|
-
* Um componente Link personalizado que adapta o atributo href com base no
|
|
1526
|
-
* Para links internos, usa `getLocalizedUrl` para prefixar a URL com o
|
|
1527
|
-
* Isso garante que a navegação permaneça dentro do mesmo contexto de
|
|
1503
|
+
* Um componente Link personalizado que adapta o atributo href com base no locale atual.
|
|
1504
|
+
* Para links internos, ele usa `getLocalizedUrl` para prefixar a URL com o locale (ex: /fr/about).
|
|
1505
|
+
* Isso garante que a navegação permaneça dentro do mesmo contexto de locale.
|
|
1528
1506
|
*/
|
|
1529
1507
|
export const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1530
1508
|
const { locale } = useLocale();
|
|
@@ -1557,7 +1535,7 @@ const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
|
1557
1535
|
|
|
1558
1536
|
/**
|
|
1559
1537
|
* Um componente Link personalizado que adapta o atributo href com base na localidade atual.
|
|
1560
|
-
* Para links internos,
|
|
1538
|
+
* Para links internos, usa `getLocalizedUrl` para prefixar a URL com a localidade (ex.: /fr/about).
|
|
1561
1539
|
* Isso garante que a navegação permaneça dentro do mesmo contexto de localidade.
|
|
1562
1540
|
*/
|
|
1563
1541
|
const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
@@ -1585,7 +1563,7 @@ Link.displayName = "Link";
|
|
|
1585
1563
|
#### Como Funciona
|
|
1586
1564
|
|
|
1587
1565
|
- **Detectando Links Externos**:
|
|
1588
|
-
A função auxiliar `checkIsExternalLink` determina se uma URL é externa. Links externos
|
|
1566
|
+
A função auxiliar `checkIsExternalLink` determina se uma URL é externa. Links externos são mantidos inalterados porque não precisam de localização.
|
|
1589
1567
|
|
|
1590
1568
|
- **Recuperando a Localização Atual**:
|
|
1591
1569
|
O hook `useLocale` fornece a localidade atual (por exemplo, `fr` para francês).
|
|
@@ -1600,7 +1578,7 @@ Ao integrar este componente `Link` em toda a sua aplicação, você mantém uma
|
|
|
1600
1578
|
|
|
1601
1579
|
### Configurar TypeScript
|
|
1602
1580
|
|
|
1603
|
-
O Intlayer
|
|
1581
|
+
O Intlayer utiliza a ampliação de módulos para aproveitar os benefícios do TypeScript e tornar sua base de código mais robusta.
|
|
1604
1582
|
|
|
1605
1583
|

|
|
1606
1584
|
|
|
@@ -1629,7 +1607,7 @@ Para isso, você pode adicionar as seguintes instruções ao seu arquivo `.gitig
|
|
|
1629
1607
|
.intlayer
|
|
1630
1608
|
```
|
|
1631
1609
|
|
|
1632
|
-
### Extensão VS Code
|
|
1610
|
+
### Extensão do VS Code
|
|
1633
1611
|
|
|
1634
1612
|
Para melhorar sua experiência de desenvolvimento com o Intlayer, você pode instalar a extensão oficial **Intlayer VS Code Extension**.
|
|
1635
1613
|
|
|
@@ -1646,9 +1624,9 @@ Para mais detalhes sobre como usar a extensão, consulte a [documentação da Ex
|
|
|
1646
1624
|
|
|
1647
1625
|
---
|
|
1648
1626
|
|
|
1649
|
-
###
|
|
1627
|
+
### Avançar Mais
|
|
1650
1628
|
|
|
1651
|
-
Para
|
|
1629
|
+
Para avançar mais, você pode implementar o [editor visual](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_visual_editor.md) ou externalizar seu conteúdo usando o [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/intlayer_CMS.md).
|
|
1652
1630
|
|
|
1653
1631
|
---
|
|
1654
1632
|
|