@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: Erste Schritte mit Intlayer in Vite + React
|
|
5
|
+
description: Erfahren Sie, wie Sie Internationalisierung (i18n) zu Ihrer Vite- und React-Anwendung mit Intlayer hinzufügen. Folgen Sie dieser Anleitung, um Ihre App mehrsprachig zu machen.
|
|
6
6
|
keywords:
|
|
7
7
|
- Internationalisierung
|
|
8
8
|
- Dokumentation
|
|
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
|
# Erste Schritte zur Internationalisierung (i18n) mit Intlayer, Vite und React
|
|
@@ -23,14 +23,14 @@ Siehe [Application Template](https://github.com/aymericzip/intlayer-vite-react-t
|
|
|
23
23
|
|
|
24
24
|
## Was ist Intlayer?
|
|
25
25
|
|
|
26
|
-
**Intlayer** ist eine innovative, Open-Source
|
|
26
|
+
**Intlayer** ist eine innovative, Open-Source Internationalisierungsbibliothek (i18n), die entwickelt wurde, um die mehrsprachige Unterstützung in modernen Webanwendungen zu vereinfachen.
|
|
27
27
|
|
|
28
28
|
Mit Intlayer können Sie:
|
|
29
29
|
|
|
30
|
-
- **Übersetzungen einfach verwalten**
|
|
30
|
+
- **Übersetzungen einfach verwalten** mit deklarativen Wörterbüchern auf Komponentenebene.
|
|
31
31
|
- **Metadaten, Routen und Inhalte dynamisch lokalisieren**.
|
|
32
|
-
- **TypeScript-Unterstützung sicherstellen** durch automatisch generierte Typen, die
|
|
33
|
-
- **Von erweiterten Funktionen profitieren**, wie dynamische
|
|
32
|
+
- **TypeScript-Unterstützung sicherstellen** durch automatisch generierte Typen, die Autovervollständigung und Fehlererkennung verbessern.
|
|
33
|
+
- **Von erweiterten Funktionen profitieren**, wie dynamische Lokalerkennung und -umschaltung.
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
@@ -57,13 +57,13 @@ yarn add --save-dev vite-intlayer
|
|
|
57
57
|
|
|
58
58
|
- **intlayer**
|
|
59
59
|
|
|
60
|
-
Das Kernpaket, das Internationalisierungswerkzeuge für Konfigurationsmanagement, Übersetzung, [
|
|
60
|
+
Das Kernpaket, das Internationalisierungswerkzeuge für Konfigurationsmanagement, Übersetzung, [Inhaltserklärung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/dictionary/get_started.md), Transpilierung und [CLI-Befehle](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_cli.md) bereitstellt.
|
|
61
61
|
|
|
62
62
|
- **react-intlayer**
|
|
63
63
|
Das Paket, das Intlayer in React-Anwendungen integriert. Es stellt Kontext-Provider und Hooks für die Internationalisierung in React bereit.
|
|
64
64
|
|
|
65
65
|
- **vite-intlayer**
|
|
66
|
-
|
|
66
|
+
Enthält das Vite-Plugin zur Integration von Intlayer mit dem [Vite-Bundler](https://vite.dev/guide/why.html#why-bundle-for-production) sowie Middleware zur Erkennung der bevorzugten Sprache des Benutzers, Verwaltung von Cookies und Handhabung von URL-Weiterleitungen.
|
|
67
67
|
|
|
68
68
|
### Schritt 2: Konfiguration Ihres Projekts
|
|
69
69
|
|
|
@@ -78,7 +78,7 @@ const config: IntlayerConfig = {
|
|
|
78
78
|
Locales.ENGLISH,
|
|
79
79
|
Locales.FRENCH,
|
|
80
80
|
Locales.SPANISH,
|
|
81
|
-
// Ihre weiteren
|
|
81
|
+
// Ihre weiteren Sprachversionen
|
|
82
82
|
],
|
|
83
83
|
defaultLocale: Locales.ENGLISH,
|
|
84
84
|
},
|
|
@@ -91,7 +91,6 @@ export default config;
|
|
|
91
91
|
import { Locales } from "intlayer";
|
|
92
92
|
|
|
93
93
|
/** @type {import('intlayer').IntlayerConfig} */
|
|
94
|
-
// Konfiguration der Internationalisierung
|
|
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
|
-
// Konfiguration der Internationalisierung
|
|
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
|
-
> Durch diese Konfigurationsdatei können Sie lokalisierte URLs, Middleware-Weiterleitungen, Cookie-Namen, den Speicherort und die Erweiterung Ihrer Inhaltsdeklarationen einrichten, Intlayer-
|
|
128
|
+
> Durch diese Konfigurationsdatei können Sie lokalisierte URLs, Middleware-Weiterleitungen, Cookie-Namen, den Speicherort und die Erweiterung Ihrer Inhaltsdeklarationen einrichten, Intlayer-Protokolle in der Konsole deaktivieren und vieles mehr. Für eine vollständige Liste der verfügbaren Parameter verweisen wir auf die [Konfigurationsdokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/configuration.md).
|
|
131
129
|
|
|
132
130
|
### Schritt 3: Integrieren Sie Intlayer in Ihre Vite-Konfiguration
|
|
133
131
|
|
|
@@ -166,9 +164,9 @@ module.exports = defineConfig({
|
|
|
166
164
|
});
|
|
167
165
|
```
|
|
168
166
|
|
|
169
|
-
> Das `intlayerPlugin()` Vite-Plugin wird verwendet, um Intlayer mit Vite zu integrieren. Es
|
|
167
|
+
> Das `intlayerPlugin()` Vite-Plugin wird verwendet, um Intlayer mit Vite zu integrieren. Es stellt sicher, dass Inhaltsdeklarationsdateien erstellt und im Entwicklungsmodus überwacht werden. Es definiert Intlayer-Umgebungsvariablen innerhalb der Vite-Anwendung. Zusätzlich bietet es Aliase zur Optimierung der Leistung.
|
|
170
168
|
|
|
171
|
-
### Schritt 4: Deklarieren Sie
|
|
169
|
+
### Schritt 4: Deklarieren Sie Ihre Inhalte
|
|
172
170
|
|
|
173
171
|
Erstellen und verwalten Sie Ihre Inhaltsdeklarationen, um Übersetzungen zu speichern:
|
|
174
172
|
|
|
@@ -277,7 +275,7 @@ const appContent = {
|
|
|
277
275
|
},
|
|
278
276
|
|
|
279
277
|
readTheDocs: t({
|
|
280
|
-
en: "Klicken Sie auf die
|
|
278
|
+
en: "Klicken Sie auf die Vite- und React-Logos, um mehr zu erfahren",
|
|
281
279
|
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
282
280
|
es: "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
283
281
|
}),
|
|
@@ -295,13 +293,11 @@ const appContent = {
|
|
|
295
293
|
key: "app",
|
|
296
294
|
content: {
|
|
297
295
|
viteLogo: t({
|
|
298
|
-
de: "Vite-Logo",
|
|
299
296
|
en: "Vite logo",
|
|
300
297
|
fr: "Logo Vite",
|
|
301
298
|
es: "Logo Vite",
|
|
302
299
|
}),
|
|
303
300
|
reactLogo: t({
|
|
304
|
-
de: "React-Logo",
|
|
305
301
|
en: "React logo",
|
|
306
302
|
fr: "Logo React",
|
|
307
303
|
es: "Logo React",
|
|
@@ -310,7 +306,6 @@ const appContent = {
|
|
|
310
306
|
title: "Vite + React",
|
|
311
307
|
|
|
312
308
|
count: t({
|
|
313
|
-
de: "Zähler ist ",
|
|
314
309
|
en: "count is ",
|
|
315
310
|
fr: "le compte est ",
|
|
316
311
|
es: "el recuento es ",
|
|
@@ -321,15 +316,9 @@ const appContent = {
|
|
|
321
316
|
ReactNode >
|
|
322
317
|
{
|
|
323
318
|
// Vergessen Sie nicht, React zu importieren, wenn Sie einen React-Knoten in Ihrem Inhalt verwenden
|
|
324
|
-
de: (
|
|
325
|
-
<>
|
|
326
|
-
Bearbeiten Sie <code>src/App.tsx</code> und speichern Sie, um HMR zu
|
|
327
|
-
testen
|
|
328
|
-
</>
|
|
329
|
-
),
|
|
330
319
|
en: (
|
|
331
320
|
<>
|
|
332
|
-
Edit <code>src/App.tsx</code>
|
|
321
|
+
Edit <code>src/App.tsx</code> und speichern, um HMR zu testen
|
|
333
322
|
</>
|
|
334
323
|
),
|
|
335
324
|
fr: (
|
|
@@ -339,14 +328,14 @@ const appContent = {
|
|
|
339
328
|
),
|
|
340
329
|
es: (
|
|
341
330
|
<>
|
|
342
|
-
|
|
331
|
+
Editieren Sie <code>src/App.tsx</code> und speichern Sie, um HMR zu
|
|
332
|
+
testen
|
|
343
333
|
</>
|
|
344
334
|
),
|
|
345
335
|
},
|
|
346
336
|
|
|
347
337
|
readTheDocs: t({
|
|
348
|
-
|
|
349
|
-
en: "Click on the Vite and React logos to learn more",
|
|
338
|
+
en: "Klicken Sie auf die Vite- und React-Logos, um mehr zu erfahren",
|
|
350
339
|
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
351
340
|
es: "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
352
341
|
}),
|
|
@@ -364,7 +353,6 @@ module.exports = appContent;
|
|
|
364
353
|
"viteLogo": {
|
|
365
354
|
"nodeType": "translation",
|
|
366
355
|
"translation": {
|
|
367
|
-
"de": "Vite-Logo",
|
|
368
356
|
"en": "Vite logo",
|
|
369
357
|
"fr": "Logo Vite",
|
|
370
358
|
"es": "Logo Vite"
|
|
@@ -381,6 +369,7 @@ module.exports = appContent;
|
|
|
381
369
|
"title": {
|
|
382
370
|
"nodeType": "translation",
|
|
383
371
|
"translation": {
|
|
372
|
+
"de": "Vite + React",
|
|
384
373
|
"en": "Vite + React",
|
|
385
374
|
"fr": "Vite + React",
|
|
386
375
|
"es": "Vite + React"
|
|
@@ -389,6 +378,7 @@ module.exports = appContent;
|
|
|
389
378
|
"count": {
|
|
390
379
|
"nodeType": "translation",
|
|
391
380
|
"translation": {
|
|
381
|
+
"de": "Zähler ist ",
|
|
392
382
|
"en": "count is ",
|
|
393
383
|
"fr": "le compte est ",
|
|
394
384
|
"es": "el recuento es "
|
|
@@ -397,16 +387,16 @@ module.exports = appContent;
|
|
|
397
387
|
"edit": {
|
|
398
388
|
"nodeType": "translation",
|
|
399
389
|
"translation": {
|
|
390
|
+
"de": "Bearbeiten Sie src/App.tsx und speichern Sie, um HMR zu testen",
|
|
400
391
|
"en": "Edit src/App.tsx and save to test HMR",
|
|
401
392
|
"fr": "Éditez src/App.tsx et enregistrez pour tester HMR",
|
|
402
|
-
"es": "Edita src/App.tsx y guarda para probar HMR"
|
|
403
|
-
"de": "Bearbeite src/App.tsx und speichere, um HMR zu testen"
|
|
393
|
+
"es": "Edita src/App.tsx y guarda para probar HMR"
|
|
404
394
|
}
|
|
405
395
|
},
|
|
406
396
|
"readTheDocs": {
|
|
407
397
|
"nodeType": "translation",
|
|
408
398
|
"translation": {
|
|
409
|
-
"de": "Klicken Sie auf die Vite
|
|
399
|
+
"de": "Klicken Sie auf die Logos von Vite und React, um mehr zu erfahren",
|
|
410
400
|
"en": "Click on the Vite and React logos to learn more",
|
|
411
401
|
"fr": "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
412
402
|
"es": "Haga clic en los logotipos de Vite y React para obtener más información"
|
|
@@ -416,9 +406,9 @@ module.exports = appContent;
|
|
|
416
406
|
}
|
|
417
407
|
```
|
|
418
408
|
|
|
419
|
-
> Ihre Inhaltsdeklarationen können überall in Ihrer Anwendung definiert werden, sobald sie in das `contentDir`-Verzeichnis (standardmäßig `./src`) aufgenommen werden
|
|
409
|
+
> Ihre Inhaltsdeklarationen können überall in Ihrer Anwendung definiert werden, sobald sie in das `contentDir`-Verzeichnis (standardmäßig `./src`) aufgenommen werden. Und die Dateiendung der Inhaltsdeklaration muss übereinstimmen (standardmäßig `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
420
410
|
|
|
421
|
-
> Für weitere Details
|
|
411
|
+
> Für weitere Details siehe die [Dokumentation zur Inhaltsdeklaration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/dictionary/get_started.md).
|
|
422
412
|
|
|
423
413
|
> Wenn Ihre Inhaltsdatei TSX-Code enthält, sollten Sie in Ihrer Inhaltsdatei `import React from "react";` importieren.
|
|
424
414
|
|
|
@@ -464,7 +454,7 @@ const AppContent: FC = () => {
|
|
|
464
454
|
);
|
|
465
455
|
};
|
|
466
456
|
|
|
467
|
-
const App
|
|
457
|
+
const App = () => (
|
|
468
458
|
<IntlayerProvider>
|
|
469
459
|
<AppContent />
|
|
470
460
|
</IntlayerProvider>
|
|
@@ -567,13 +557,19 @@ const App = () => (
|
|
|
567
557
|
module.exports = App;
|
|
568
558
|
```
|
|
569
559
|
|
|
560
|
+
> Wenn Sie Ihren Inhalt in einem `string`-Attribut verwenden möchten, wie z.B. `alt`, `title`, `href`, `aria-label` usw., müssen Sie den Wert der Funktion aufrufen, wie:
|
|
561
|
+
|
|
562
|
+
> ```jsx
|
|
563
|
+
> <img src={content.image.src.value} alt={content.image.value} />
|
|
564
|
+
> ```
|
|
565
|
+
|
|
570
566
|
> Wenn Sie Ihren Inhalt in einem `string`-Attribut verwenden möchten, wie z.B. `alt`, `title`, `href`, `aria-label` usw., müssen Sie den Wert der Funktion aufrufen, zum Beispiel:
|
|
571
567
|
|
|
572
568
|
> ```jsx
|
|
573
569
|
> <img src={content.image.src.value} alt={content.image.value} />
|
|
574
570
|
> ```
|
|
575
571
|
|
|
576
|
-
> Um mehr über den `useIntlayer` Hook zu erfahren,
|
|
572
|
+
> Um mehr über den `useIntlayer` Hook zu erfahren, lesen Sie die [Dokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/react-intlayer/useIntlayer.md).
|
|
577
573
|
|
|
578
574
|
### (Optional) Schritt 6: Ändern Sie die Sprache Ihres Inhalts
|
|
579
575
|
|
|
@@ -627,7 +623,7 @@ const LocaleSwitcher = () => {
|
|
|
627
623
|
|
|
628
624
|
> Um mehr über den `useLocale` Hook zu erfahren, lesen Sie die [Dokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/react-intlayer/useLocale.md).
|
|
629
625
|
|
|
630
|
-
### (Optional) Schritt 7:
|
|
626
|
+
### (Optional) Schritt 7: Lokalisierte Routen zu Ihrer Anwendung hinzufügen
|
|
631
627
|
|
|
632
628
|
Der Zweck dieses Schrittes ist es, für jede Sprache eindeutige Routen zu erstellen. Dies ist nützlich für SEO und SEO-freundliche URLs.
|
|
633
629
|
Beispiel:
|
|
@@ -640,7 +636,7 @@ Beispiel:
|
|
|
640
636
|
|
|
641
637
|
> Standardmäßig sind die Routen für die Standardsprache nicht mit einem Präfix versehen. Wenn Sie die Standardsprache mit einem Präfix versehen möchten, können Sie in Ihrer Konfiguration die Option `middleware.prefixDefault` auf `true` setzen. Weitere Informationen finden Sie in der [Konfigurationsdokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/configuration.md).
|
|
642
638
|
|
|
643
|
-
Um lokalisierte Routen
|
|
639
|
+
Um lokalisierte Routen in Ihre Anwendung hinzuzufügen, können Sie eine `LocaleRouter`-Komponente erstellen, die die Routen Ihrer Anwendung umschließt und die sprachabhängige Navigation verwaltet. Hier ist ein Beispiel unter Verwendung von [React Router](https://reactrouter.com/home):
|
|
644
640
|
|
|
645
641
|
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
646
642
|
// Importieren der notwendigen Abhängigkeiten und Funktionen
|
|
@@ -660,8 +656,8 @@ const { internationalization, middleware } = configuration;
|
|
|
660
656
|
const { locales, defaultLocale } = internationalization;
|
|
661
657
|
|
|
662
658
|
/**
|
|
663
|
-
* Eine Komponente, die die Lokalisierung verwaltet und Kinder mit dem entsprechenden
|
|
664
|
-
* Sie verwaltet die
|
|
659
|
+
* Eine Komponente, die die Lokalisierung verwaltet und Kinder mit dem entsprechenden Locale-Kontext umschließt.
|
|
660
|
+
* Sie verwaltet die URL-basierte Lokalerkennung und -validierung.
|
|
665
661
|
*/
|
|
666
662
|
const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
667
663
|
children,
|
|
@@ -669,21 +665,21 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
669
665
|
}) => {
|
|
670
666
|
const { pathname, search } = useLocation(); // Aktuellen URL-Pfad abrufen
|
|
671
667
|
|
|
672
|
-
//
|
|
668
|
+
// Bestimmen der aktuellen Locale, Standardwert verwenden, falls nicht angegeben
|
|
673
669
|
const currentLocale = locale ?? defaultLocale;
|
|
674
670
|
|
|
675
|
-
//
|
|
671
|
+
// Entfernen des Locale-Präfixes aus dem Pfad, um einen Basis-Pfad zu erstellen
|
|
676
672
|
const pathWithoutLocale = getPathWithoutLocale(
|
|
677
673
|
pathname // Aktueller URL-Pfad
|
|
678
674
|
);
|
|
679
675
|
|
|
680
676
|
/**
|
|
681
|
-
* Wenn middleware.prefixDefault true ist, sollte die
|
|
677
|
+
* Wenn middleware.prefixDefault true ist, sollte die Standard-Locale immer vorangestellt werden.
|
|
682
678
|
*/
|
|
683
679
|
if (middleware.prefixDefault) {
|
|
684
680
|
// Locale validieren
|
|
685
681
|
if (!locale || !locales.includes(locale)) {
|
|
686
|
-
// Weiterleitung zur
|
|
682
|
+
// Weiterleitung zur Standard-Locale mit aktualisiertem Pfad
|
|
687
683
|
return (
|
|
688
684
|
<Navigate
|
|
689
685
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
@@ -698,14 +694,14 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
698
694
|
);
|
|
699
695
|
} else {
|
|
700
696
|
/**
|
|
701
|
-
* Wenn middleware.prefixDefault false ist, wird die
|
|
702
|
-
*
|
|
697
|
+
* Wenn middleware.prefixDefault false ist, wird die Standardsprache nicht mit einem Präfix versehen.
|
|
698
|
+
* Stellen Sie sicher, dass die aktuelle Locale gültig ist und nicht die Standardsprache ist.
|
|
703
699
|
*/
|
|
704
700
|
if (
|
|
705
701
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
706
702
|
!locales
|
|
707
703
|
.filter(
|
|
708
|
-
(locale) => locale.toString() !== defaultLocale.toString() // Schließt die
|
|
704
|
+
(locale) => locale.toString() !== defaultLocale.toString() // Schließt die Standardsprache aus
|
|
709
705
|
)
|
|
710
706
|
.includes(currentLocale) // Überprüfen, ob die aktuelle Locale in der Liste der gültigen Locales enthalten ist
|
|
711
707
|
) {
|
|
@@ -721,8 +717,8 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
721
717
|
};
|
|
722
718
|
|
|
723
719
|
/**
|
|
724
|
-
*
|
|
725
|
-
*
|
|
720
|
+
* Eine Router-Komponente, die locale-spezifische Routen einrichtet.
|
|
721
|
+
* Sie verwendet React Router, um die Navigation zu verwalten und lokalisierte Komponenten zu rendern.
|
|
726
722
|
*/
|
|
727
723
|
export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
728
724
|
<BrowserRouter>
|
|
@@ -736,18 +732,18 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
736
732
|
// Routenmuster, um die Locale zu erfassen (z.B. /en/, /fr/) und alle nachfolgenden Pfade zu erfassen
|
|
737
733
|
path={`/${locale}/*`}
|
|
738
734
|
key={locale}
|
|
739
|
-
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Umschließt die Kinder mit der
|
|
735
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Umschließt die Kinder mit der Locale-Verwaltung
|
|
740
736
|
/>
|
|
741
737
|
))}
|
|
742
738
|
|
|
743
739
|
{
|
|
744
|
-
// Wenn das Präfix für die Standard-Locale deaktiviert ist,
|
|
740
|
+
// Wenn das Präfix für die Standard-Locale deaktiviert ist, werden die Kinder direkt im Stammverzeichnis gerendert
|
|
745
741
|
!middleware.prefixDefault && (
|
|
746
742
|
<Route
|
|
747
743
|
path="*"
|
|
748
744
|
element={
|
|
749
745
|
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
750
|
-
} // Umschließt die Kinder mit der
|
|
746
|
+
} // Umschließt die Kinder mit der Locale-Verwaltung
|
|
751
747
|
/>
|
|
752
748
|
)
|
|
753
749
|
}
|
|
@@ -774,14 +770,14 @@ const { internationalization, middleware } = configuration;
|
|
|
774
770
|
const { locales, defaultLocale } = internationalization;
|
|
775
771
|
|
|
776
772
|
/**
|
|
777
|
-
* Eine Komponente, die die Lokalisierung verwaltet und
|
|
773
|
+
* Eine Komponente, die die Lokalisierung verwaltet und Kinder mit dem entsprechenden Locale-Kontext umschließt.
|
|
778
774
|
/**
|
|
779
|
-
* Es verwaltet die
|
|
775
|
+
* Es verwaltet die auf der URL basierende Lokalisierungserkennung und -validierung.
|
|
780
776
|
*/
|
|
781
777
|
const AppLocalized = ({ children, locale }) => {
|
|
782
778
|
const { pathname, search } = useLocation(); // Holt den aktuellen URL-Pfad
|
|
783
779
|
|
|
784
|
-
// Bestimmt die aktuelle Locale, standardmäßig die
|
|
780
|
+
// Bestimmt die aktuelle Locale, standardmäßig die Standard-Locale, falls keine angegeben ist
|
|
785
781
|
const currentLocale = locale ?? defaultLocale;
|
|
786
782
|
|
|
787
783
|
// Entfernt das Locale-Präfix aus dem Pfad, um einen Basis-Pfad zu erstellen
|
|
@@ -790,7 +786,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
790
786
|
);
|
|
791
787
|
|
|
792
788
|
/**
|
|
793
|
-
* Wenn middleware.prefixDefault true ist, sollte die Standard-Locale immer
|
|
789
|
+
* Wenn middleware.prefixDefault true ist, sollte die Standard-Locale immer als Präfix verwendet werden.
|
|
794
790
|
*/
|
|
795
791
|
if (middleware.prefixDefault) {
|
|
796
792
|
// Validiert die Locale
|
|
@@ -845,21 +841,21 @@ export const LocaleRouter = ({ children }) => (
|
|
|
845
841
|
)
|
|
846
842
|
.map((locale) => (
|
|
847
843
|
<Route
|
|
848
|
-
// Routenmuster, um die Locale zu erfassen (z.B. /en/, /fr/) und alle nachfolgenden Pfade
|
|
844
|
+
// Routenmuster, um die Locale zu erfassen (z.B. /en/, /fr/) und alle nachfolgenden Pfade abzugleichen
|
|
849
845
|
path={`/${locale}/*`}
|
|
850
846
|
key={locale}
|
|
851
|
-
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Umschließt Kinder mit Locale-Verwaltung
|
|
847
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Umschließt die Kinder mit der Locale-Verwaltung
|
|
852
848
|
/>
|
|
853
849
|
))}
|
|
854
850
|
|
|
855
851
|
{
|
|
856
|
-
// Wenn das Präfix für die Standard-Locale deaktiviert ist,
|
|
852
|
+
// Wenn das Präfix für die Standard-Locale deaktiviert ist, werden die Kinder direkt im Stammverzeichnis gerendert
|
|
857
853
|
!middleware.prefixDefault && (
|
|
858
854
|
<Route
|
|
859
855
|
path="*"
|
|
860
856
|
element={
|
|
861
857
|
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
862
|
-
} // Umschließt Kinder mit Locale-Verwaltung
|
|
858
|
+
} // Umschließt die Kinder mit der Locale-Verwaltung
|
|
863
859
|
/>
|
|
864
860
|
)
|
|
865
861
|
}
|
|
@@ -886,15 +882,15 @@ const { locales, defaultLocale } = internationalization;
|
|
|
886
882
|
|
|
887
883
|
/**
|
|
888
884
|
* Eine Komponente, die die Lokalisierung verwaltet und die Kinder mit dem entsprechenden Lokalisierungskontext umschließt.
|
|
889
|
-
* Sie verwaltet die URL-basierte
|
|
885
|
+
* Sie verwaltet die URL-basierte Lokalerkennung und Validierung.
|
|
890
886
|
*/
|
|
891
887
|
const AppLocalized = ({ children, locale }) => {
|
|
892
888
|
const { pathname, search } = useLocation(); // Hole den aktuellen URL-Pfad
|
|
893
889
|
|
|
894
|
-
// Bestimme die aktuelle Locale, standardmäßig die Default-Locale
|
|
890
|
+
// Bestimme die aktuelle Locale, standardmäßig auf die Default-Locale zurückfallend, falls nicht angegeben
|
|
895
891
|
const currentLocale = locale ?? defaultLocale;
|
|
896
892
|
|
|
897
|
-
// Entferne das Locale-Präfix
|
|
893
|
+
// Entferne das Locale-Präfix aus dem Pfad, um einen Basis-Pfad zu erstellen
|
|
898
894
|
const pathWithoutLocale = getPathWithoutLocale(
|
|
899
895
|
pathname // Aktueller URL-Pfad
|
|
900
896
|
);
|
|
@@ -903,13 +899,13 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
903
899
|
* Wenn middleware.prefixDefault true ist, sollte die Default-Locale immer vorangestellt werden.
|
|
904
900
|
*/
|
|
905
901
|
if (middleware.prefixDefault) {
|
|
906
|
-
//
|
|
902
|
+
// Überprüfe die Locale
|
|
907
903
|
if (!locale || !locales.includes(locale)) {
|
|
908
|
-
// Weiterleitung zur Default-Locale mit
|
|
904
|
+
// Weiterleitung zur Default-Locale mit dem aktualisierten Pfad
|
|
909
905
|
return (
|
|
910
906
|
<Navigate
|
|
911
907
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
912
|
-
replace // Ersetzt den aktuellen Eintrag
|
|
908
|
+
replace // Ersetzt den aktuellen Eintrag in der Historie durch den neuen
|
|
913
909
|
/>
|
|
914
910
|
);
|
|
915
911
|
}
|
|
@@ -921,15 +917,15 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
921
917
|
} else {
|
|
922
918
|
/**
|
|
923
919
|
* Wenn middleware.prefixDefault false ist, wird die Standard-Locale nicht vorangestellt.
|
|
924
|
-
* Stelle sicher, dass die aktuelle Locale gültig ist und nicht die Standard-Locale.
|
|
920
|
+
* Stelle sicher, dass die aktuelle Locale gültig ist und nicht die Standard-Locale ist.
|
|
925
921
|
*/
|
|
926
922
|
if (
|
|
927
923
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
928
924
|
!locales
|
|
929
925
|
.filter(
|
|
930
|
-
(locale) => locale.toString() !== defaultLocale.toString() //
|
|
926
|
+
(locale) => locale.toString() !== defaultLocale.toString() // Schließt die Standard-Locale aus
|
|
931
927
|
)
|
|
932
|
-
.includes(currentLocale) //
|
|
928
|
+
.includes(currentLocale) // Prüft, ob die aktuelle Locale in der Liste der gültigen Locales ist
|
|
933
929
|
) {
|
|
934
930
|
// Weiterleitung zum Pfad ohne Sprachpräfix
|
|
935
931
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
@@ -955,10 +951,10 @@ const LocaleRouter = ({ children }) => (
|
|
|
955
951
|
)
|
|
956
952
|
.map((locale) => (
|
|
957
953
|
<Route
|
|
958
|
-
// Routenmuster, um die Sprache zu erfassen (z.B. /en/, /fr/) und alle nachfolgenden Pfade zu
|
|
954
|
+
// Routenmuster, um die Sprache zu erfassen (z.B. /en/, /fr/) und alle nachfolgenden Pfade zu erfassen
|
|
959
955
|
path={`/${locale}/*`}
|
|
960
956
|
key={locale}
|
|
961
|
-
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Umschließt Kinder mit der
|
|
957
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // Umschließt Kinder mit der Sprachverwaltung
|
|
962
958
|
/>
|
|
963
959
|
))}
|
|
964
960
|
|
|
@@ -969,7 +965,7 @@ const LocaleRouter = ({ children }) => (
|
|
|
969
965
|
path="*"
|
|
970
966
|
element={
|
|
971
967
|
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
972
|
-
} // Umschließt Kinder mit der
|
|
968
|
+
} // Umschließt Kinder mit der Sprachverwaltung
|
|
973
969
|
/>
|
|
974
970
|
)
|
|
975
971
|
}
|
|
@@ -1017,7 +1013,7 @@ const App = () => (
|
|
|
1017
1013
|
);
|
|
1018
1014
|
```
|
|
1019
1015
|
|
|
1020
|
-
Parallel dazu können Sie auch das `intLayerMiddlewarePlugin` verwenden, um serverseitiges Routing in Ihre Anwendung zu integrieren. Dieses Plugin erkennt automatisch die aktuelle Locale basierend auf der URL und setzt das entsprechende Locale-Cookie. Wenn keine Locale angegeben ist, bestimmt das Plugin die
|
|
1016
|
+
Parallel dazu können Sie auch das `intLayerMiddlewarePlugin` verwenden, um serverseitiges Routing in Ihre Anwendung zu integrieren. Dieses Plugin erkennt automatisch die aktuelle Locale basierend auf der URL und setzt das entsprechende Locale-Cookie. Wenn keine Locale angegeben ist, bestimmt das Plugin die passendste Locale basierend auf den Spracheinstellungen des Browsers des Benutzers. Wird keine Locale erkannt, erfolgt eine Weiterleitung zur Standard-Locale.
|
|
1021
1017
|
|
|
1022
1018
|
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
1023
1019
|
import { defineConfig } from "vite";
|
|
@@ -1068,16 +1064,16 @@ import { useLocale } from "react-intlayer";
|
|
|
1068
1064
|
import { type FC } from "react";
|
|
1069
1065
|
|
|
1070
1066
|
const LocaleSwitcher: FC = () => {
|
|
1071
|
-
const { pathname, search } = useLocation(); //
|
|
1067
|
+
const { pathname, search } = useLocation(); // Hole den aktuellen URL-Pfad. Beispiel: /fr/about?foo=bar
|
|
1072
1068
|
const navigate = useNavigate();
|
|
1073
1069
|
|
|
1074
1070
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1075
1071
|
onLocaleChange: (locale) => {
|
|
1076
|
-
//
|
|
1072
|
+
// Erstelle die URL mit der aktualisierten Locale
|
|
1077
1073
|
// Beispiel: /es/about?foo=bar
|
|
1078
1074
|
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1079
1075
|
|
|
1080
|
-
//
|
|
1076
|
+
// Aktualisiere den URL-Pfad
|
|
1081
1077
|
navigate(pathWithLocale);
|
|
1082
1078
|
},
|
|
1083
1079
|
});
|
|
@@ -1106,7 +1102,7 @@ const LocaleSwitcher: FC = () => {
|
|
|
1106
1102
|
{getLocaleName(localeItem, locale)}
|
|
1107
1103
|
</span>
|
|
1108
1104
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1109
|
-
{/* Sprache im aktuellen Gebietsschema - z.B. Francés
|
|
1105
|
+
{/* Sprache im aktuellen Gebietsschema - z.B. Francés, wenn das aktuelle Gebietsschema auf Locales.SPANISH gesetzt ist */}
|
|
1110
1106
|
{getLocaleName(localeItem)}
|
|
1111
1107
|
</span>
|
|
1112
1108
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
@@ -1166,7 +1162,7 @@ const LocaleSwitcher = () => {
|
|
|
1166
1162
|
{localeItem}
|
|
1167
1163
|
</span>
|
|
1168
1164
|
<span>
|
|
1169
|
-
{/* Sprache
|
|
1165
|
+
{/* Sprache in ihrem eigenen Gebietsschema - z.B. Français */}
|
|
1170
1166
|
{getLocaleName(localeItem, locale)}
|
|
1171
1167
|
</span>
|
|
1172
1168
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
@@ -1196,16 +1192,16 @@ const {
|
|
|
1196
1192
|
const { useLocale } = require("react-intlayer");
|
|
1197
1193
|
|
|
1198
1194
|
const LocaleSwitcher = () => {
|
|
1199
|
-
const { pathname, search } = useLocation(); //
|
|
1195
|
+
const { pathname, search } = useLocation(); // Hole den aktuellen URL-Pfad. Beispiel: /fr/about?foo=bar
|
|
1200
1196
|
const navigate = useNavigate();
|
|
1201
1197
|
|
|
1202
1198
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1203
1199
|
onLocaleChange: (locale) => {
|
|
1204
|
-
//
|
|
1200
|
+
// Erstelle die URL mit der aktualisierten Locale
|
|
1205
1201
|
// Beispiel: /es/about?foo=bar
|
|
1206
1202
|
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1207
1203
|
|
|
1208
|
-
//
|
|
1204
|
+
// Aktualisiere den URL-Pfad
|
|
1209
1205
|
navigate(pathWithLocale);
|
|
1210
1206
|
},
|
|
1211
1207
|
});
|
|
@@ -1234,11 +1230,11 @@ const LocaleSwitcher = () => {
|
|
|
1234
1230
|
{getLocaleName(localeItem, locale)}
|
|
1235
1231
|
</span>
|
|
1236
1232
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1237
|
-
{/* Sprache im aktuellen Gebietsschema - z.B. Francés
|
|
1233
|
+
{/* Sprache im aktuellen Gebietsschema - z.B. Francés, wenn das aktuelle Gebietsschema auf Locales.SPANISH gesetzt ist */}
|
|
1238
1234
|
{getLocaleName(localeItem)}
|
|
1239
1235
|
</span>
|
|
1240
1236
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1241
|
-
{/* Sprache auf Englisch
|
|
1237
|
+
{/* Sprache auf Englisch – z.B. Französisch */}
|
|
1242
1238
|
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1243
1239
|
</span>
|
|
1244
1240
|
</a>
|
|
@@ -1249,12 +1245,12 @@ const LocaleSwitcher = () => {
|
|
|
1249
1245
|
};
|
|
1250
1246
|
```
|
|
1251
1247
|
|
|
1252
|
-
>
|
|
1248
|
+
> Dokumentationsreferenzen:
|
|
1253
1249
|
>
|
|
1254
1250
|
> - [`useLocale` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/react-intlayer/useLocale.md)
|
|
1255
1251
|
> - [`getLocaleName` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/intlayer/getLocaleName.md)
|
|
1256
1252
|
> - [`getLocalizedUrl` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/intlayer/getLocalizedUrl.md)
|
|
1257
|
-
> - [`getHTMLTextDir`
|
|
1253
|
+
> - [`getHTMLTextDir` hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/intlayer/getHTMLTextDir.md)
|
|
1258
1254
|
> - [`hrefLang` Attribut](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr)
|
|
1259
1255
|
> - [`lang` Attribut](https://developer.mozilla.org/de/docs/Web/HTML/Global_attributes/lang)
|
|
1260
1256
|
> - [`dir` Attribut](https://developer.mozilla.org/de/docs/Web/HTML/Global_attributes/dir)
|
|
@@ -1270,7 +1266,7 @@ Wenn Ihre Anwendung mehrere Sprachen unterstützt, ist es entscheidend, die `lan
|
|
|
1270
1266
|
|
|
1271
1267
|
- **Barrierefreiheit**: Screenreader und unterstützende Technologien verlassen sich auf das korrekte `lang`-Attribut, um Inhalte richtig auszusprechen und zu interpretieren.
|
|
1272
1268
|
- **Textdarstellung**: Das `dir`-Attribut (Richtung) sorgt dafür, dass der Text in der richtigen Reihenfolge dargestellt wird (z. B. von links nach rechts für Englisch, von rechts nach links für Arabisch oder Hebräisch), was für die Lesbarkeit unerlässlich ist.
|
|
1273
|
-
- **SEO**: Suchmaschinen verwenden das `lang`-Attribut, um die Sprache Ihrer Seite zu bestimmen
|
|
1269
|
+
- **SEO**: Suchmaschinen verwenden das `lang`-Attribut, um die Sprache Ihrer Seite zu bestimmen und so die passende lokalisierte Version in den Suchergebnissen anzuzeigen.
|
|
1274
1270
|
|
|
1275
1271
|
Indem Sie diese Attribute dynamisch aktualisieren, wenn sich die Spracheinstellung ändert, gewährleisten Sie eine konsistente und barrierefreie Erfahrung für Benutzer in allen unterstützten Sprachen.
|
|
1276
1272
|
|
|
@@ -1313,7 +1309,7 @@ import { getHTMLTextDir } from "intlayer";
|
|
|
1313
1309
|
* - `lang`: Informiert Browser und Suchmaschinen über die Sprache der Seite.
|
|
1314
1310
|
* - `dir`: Stellt die korrekte Leserichtung sicher (z.B. 'ltr' für Englisch, 'rtl' für Arabisch).
|
|
1315
1311
|
*
|
|
1316
|
-
* Dieses dynamische Update ist
|
|
1312
|
+
* Dieses dynamische Update ist essentiell für die korrekte Textdarstellung, Barrierefreiheit und SEO.
|
|
1317
1313
|
*/
|
|
1318
1314
|
export const useI18nHTMLAttributes = () => {
|
|
1319
1315
|
const { locale } = useLocale();
|
|
@@ -1322,7 +1318,7 @@ export const useI18nHTMLAttributes = () => {
|
|
|
1322
1318
|
// Aktualisiert das Sprachattribut auf die aktuelle Locale.
|
|
1323
1319
|
document.documentElement.lang = locale;
|
|
1324
1320
|
|
|
1325
|
-
// Setzt die
|
|
1321
|
+
// Setzt die Leserichtung basierend auf der aktuellen Locale.
|
|
1326
1322
|
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1327
1323
|
}, [locale]);
|
|
1328
1324
|
};
|
|
@@ -1334,9 +1330,9 @@ const { useLocale } = require("react-intlayer");
|
|
|
1334
1330
|
const { getHTMLTextDir } = require("intlayer");
|
|
1335
1331
|
|
|
1336
1332
|
/**
|
|
1337
|
-
* Aktualisiert die `lang`- und `dir`-Attribute des HTML
|
|
1333
|
+
* Aktualisiert die `lang`- und `dir`-Attribute des HTML-Elements <html> basierend auf der aktuellen Locale.
|
|
1338
1334
|
* - `lang`: Informiert Browser und Suchmaschinen über die Sprache der Seite.
|
|
1339
|
-
* - `dir`: Stellt die korrekte Leserichtung sicher (z.B. 'ltr' für Englisch, 'rtl' für Arabisch).
|
|
1335
|
+
* - `dir`: Stellt die korrekte Leserichtung sicher (z. B. 'ltr' für Englisch, 'rtl' für Arabisch).
|
|
1340
1336
|
*
|
|
1341
1337
|
* Diese dynamische Aktualisierung ist essenziell für die korrekte Textdarstellung, Barrierefreiheit und SEO.
|
|
1342
1338
|
*/
|
|
@@ -1347,7 +1343,7 @@ const useI18nHTMLAttributes = () => {
|
|
|
1347
1343
|
// Aktualisiere das Sprachattribut auf die aktuelle Locale.
|
|
1348
1344
|
document.documentElement.lang = locale;
|
|
1349
1345
|
|
|
1350
|
-
// Setze die
|
|
1346
|
+
// Setze die Textrichtung basierend auf der aktuellen Locale.
|
|
1351
1347
|
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1352
1348
|
}, [locale]);
|
|
1353
1349
|
};
|
|
@@ -1381,10 +1377,9 @@ const App: FC = () => (
|
|
|
1381
1377
|
export default App;
|
|
1382
1378
|
```
|
|
1383
1379
|
|
|
1384
|
-
````jsx fileName="src/App.msx" codeFormat="esm"
|
|
1385
1380
|
#### Verwendung des Hooks in Ihrer Anwendung
|
|
1386
1381
|
|
|
1387
|
-
Integrieren Sie den Hook in Ihre Hauptkomponente, damit die HTML-Attribute
|
|
1382
|
+
Integrieren Sie den Hook in Ihre Hauptkomponente, damit die HTML-Attribute aktualisiert werden, sobald sich die Locale ändert:
|
|
1388
1383
|
|
|
1389
1384
|
```tsx fileName="src/App.tsx" codeFormat="typescript"
|
|
1390
1385
|
import type { FC } from "react";
|
|
@@ -1393,7 +1388,7 @@ import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
|
1393
1388
|
import "./App.css";
|
|
1394
1389
|
|
|
1395
1390
|
const AppContent: FC = () => {
|
|
1396
|
-
// Wenden Sie den Hook an, um die lang- und dir-Attribute des <html>-Tags basierend auf der
|
|
1391
|
+
// Wenden Sie den Hook an, um die lang- und dir-Attribute des <html>-Tags basierend auf der Locale zu aktualisieren.
|
|
1397
1392
|
useI18nHTMLAttributes();
|
|
1398
1393
|
|
|
1399
1394
|
// ... Rest Ihrer Komponente
|
|
@@ -1406,7 +1401,7 @@ const App: FC = () => (
|
|
|
1406
1401
|
);
|
|
1407
1402
|
|
|
1408
1403
|
export default App;
|
|
1409
|
-
|
|
1404
|
+
```
|
|
1410
1405
|
|
|
1411
1406
|
```jsx fileName="src/App.msx" codeFormat="esm"
|
|
1412
1407
|
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
@@ -1414,7 +1409,7 @@ import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
|
1414
1409
|
import "./App.css";
|
|
1415
1410
|
|
|
1416
1411
|
const AppContent = () => {
|
|
1417
|
-
// Wenden Sie den Hook an, um die lang- und dir-Attribute des <html>-Tags basierend auf der
|
|
1412
|
+
// Wenden Sie den Hook an, um die lang- und dir-Attribute des <html>-Tags basierend auf der Locale zu aktualisieren.
|
|
1418
1413
|
useI18nHTMLAttributes();
|
|
1419
1414
|
|
|
1420
1415
|
// ... Rest Ihrer Komponente
|
|
@@ -1436,7 +1431,7 @@ const { useI18nHTMLAttributes } = require("./hooks/useI18nHTMLAttributes");
|
|
|
1436
1431
|
require("./App.css");
|
|
1437
1432
|
|
|
1438
1433
|
const AppContent = () => {
|
|
1439
|
-
// Wenden Sie den Hook an, um die lang- und dir-Attribute des <html>-Tags basierend auf der
|
|
1434
|
+
// Wenden Sie den Hook an, um die lang- und dir-Attribute des <html>-Tags basierend auf der Locale zu aktualisieren.
|
|
1440
1435
|
useI18nHTMLAttributes();
|
|
1441
1436
|
|
|
1442
1437
|
// ... Rest Ihrer Komponente
|
|
@@ -1453,43 +1448,27 @@ module.exports = App;
|
|
|
1453
1448
|
|
|
1454
1449
|
Durch diese Änderungen wird Ihre Anwendung:
|
|
1455
1450
|
|
|
1456
|
-
- Sicherstellen, dass das **language** (`lang`) Attribut die aktuelle
|
|
1457
|
-
- Die **Schreibrichtung** (`dir`) entsprechend der
|
|
1458
|
-
- Eine
|
|
1451
|
+
- Sicherstellen, dass das **language** (`lang`) Attribut die aktuelle Locale korrekt widerspiegelt, was wichtig für SEO und das Verhalten des Browsers ist.
|
|
1452
|
+
- Die **Schreibrichtung** (`dir`) entsprechend der Locale anpassen, um die Lesbarkeit und Benutzerfreundlichkeit für Sprachen mit unterschiedlicher Leserichtung zu verbessern.
|
|
1453
|
+
- Eine bessere **Barrierefreiheit** bieten, da unterstützende Technologien auf diese Attribute angewiesen sind, um optimal zu funktionieren.
|
|
1459
1454
|
|
|
1460
1455
|
### (Optional) Schritt 10: Erstellen einer lokalisierten Link-Komponente
|
|
1461
1456
|
|
|
1462
|
-
// Wenden Sie den Hook an, um die Attribute lang und dir des <html>-Tags basierend auf der Locale zu aktualisieren.
|
|
1463
|
-
useI18nHTMLAttributes();
|
|
1464
|
-
|
|
1465
|
-
// ... Rest Ihres Components
|
|
1466
|
-
};
|
|
1467
|
-
|
|
1468
|
-
const App = () => (
|
|
1469
|
-
<IntlayerProvider>
|
|
1470
|
-
<AppContent />
|
|
1471
|
-
</IntlayerProvider>
|
|
1472
|
-
);
|
|
1473
|
-
|
|
1474
|
-
module.exports = App;
|
|
1475
|
-
|
|
1476
|
-
````
|
|
1477
|
-
|
|
1478
1457
|
Durch die Anwendung dieser Änderungen wird Ihre Anwendung:
|
|
1479
1458
|
|
|
1480
|
-
- Sicherstellen, dass das **Sprach
|
|
1481
|
-
- Die **Schreibrichtung** (`dir`) entsprechend der Locale anpassen, um die Lesbarkeit und Benutzerfreundlichkeit für Sprachen mit
|
|
1459
|
+
- Sicherstellen, dass das **Sprach**-Attribut (`lang`) die aktuelle Locale korrekt widerspiegelt, was wichtig für SEO und das Verhalten des Browsers ist.
|
|
1460
|
+
- Die **Schreibrichtung** (`dir`) entsprechend der Locale anpassen, um die Lesbarkeit und Benutzerfreundlichkeit für Sprachen mit unterschiedlichen Leserichtungen zu verbessern.
|
|
1482
1461
|
- Eine zugänglichere **Benutzererfahrung** bieten, da unterstützende Technologien auf diese Attribute angewiesen sind, um optimal zu funktionieren.
|
|
1483
1462
|
|
|
1484
1463
|
### (Optional) Schritt 10: Erstellen einer lokalisierten Link-Komponente
|
|
1485
1464
|
|
|
1486
|
-
Um sicherzustellen, dass die Navigation Ihrer Anwendung die aktuelle
|
|
1465
|
+
Um sicherzustellen, dass die Navigation Ihrer Anwendung die aktuelle Sprache berücksichtigt, können Sie eine benutzerdefinierte `Link`-Komponente erstellen. Diese Komponente fügt automatisch den aktuellen Sprachpräfix zu internen URLs hinzu. Zum Beispiel wird ein französischsprachiger Benutzer, der auf einen Link zur "Über uns"-Seite klickt, zu `/fr/about` statt zu `/about` weitergeleitet.
|
|
1487
1466
|
|
|
1488
1467
|
Dieses Verhalten ist aus mehreren Gründen nützlich:
|
|
1489
1468
|
|
|
1490
1469
|
- **SEO und Benutzererfahrung**: Lokalisierte URLs helfen Suchmaschinen, sprachspezifische Seiten korrekt zu indexieren, und bieten den Nutzern Inhalte in ihrer bevorzugten Sprache.
|
|
1491
|
-
- **Konsistenz**: Durch die Verwendung eines lokalisierten Links in Ihrer gesamten Anwendung stellen Sie sicher, dass die Navigation innerhalb der aktuellen
|
|
1492
|
-
- **Wartbarkeit**: Die Zentralisierung der Lokalisierungslogik in einer einzigen Komponente vereinfacht die Verwaltung
|
|
1470
|
+
- **Konsistenz**: Durch die Verwendung eines lokalisierten Links in Ihrer gesamten Anwendung stellen Sie sicher, dass die Navigation innerhalb der aktuellen Sprache bleibt und unerwartete Sprachwechsel vermieden werden.
|
|
1471
|
+
- **Wartbarkeit**: Die Zentralisierung der Lokalisierungslogik in einer einzigen Komponente vereinfacht die Verwaltung der URLs und macht Ihren Code leichter wartbar und erweiterbar, wenn Ihre Anwendung wächst.
|
|
1493
1472
|
|
|
1494
1473
|
Nachfolgend finden Sie die Implementierung einer lokalisierten `Link`-Komponente in TypeScript:
|
|
1495
1474
|
|
|
@@ -1510,14 +1489,14 @@ export interface LinkProps
|
|
|
1510
1489
|
|
|
1511
1490
|
/**
|
|
1512
1491
|
* Hilfsfunktion, um zu prüfen, ob eine gegebene URL extern ist.
|
|
1513
|
-
* Wenn die URL mit http:// oder https:// beginnt,
|
|
1492
|
+
* Wenn die URL mit http:// oder https:// beginnt, wird sie als extern betrachtet.
|
|
1514
1493
|
*/
|
|
1515
1494
|
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1516
1495
|
/^https?:\/\//.test(href ?? "");
|
|
1517
1496
|
|
|
1518
1497
|
/**
|
|
1519
1498
|
* Eine benutzerdefinierte Link-Komponente, die das href-Attribut basierend auf der aktuellen Locale anpasst.
|
|
1520
|
-
* Für interne Links
|
|
1499
|
+
* Für interne Links verwendet sie `getLocalizedUrl`, um die URL mit der Locale zu versehen (z.B. /fr/about).
|
|
1521
1500
|
* Dies stellt sicher, dass die Navigation im gleichen Locale-Kontext bleibt.
|
|
1522
1501
|
*/
|
|
1523
1502
|
export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
@@ -1525,7 +1504,7 @@ export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
|
1525
1504
|
const { locale } = useLocale();
|
|
1526
1505
|
const isExternalLink = checkIsExternalLink(href);
|
|
1527
1506
|
|
|
1528
|
-
// Wenn der Link intern ist und
|
|
1507
|
+
// Wenn der Link intern ist und ein gültiges href vorhanden ist, wird die lokalisierte URL verwendet.
|
|
1529
1508
|
const hrefI18n =
|
|
1530
1509
|
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1531
1510
|
|
|
@@ -1538,7 +1517,7 @@ export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
|
1538
1517
|
);
|
|
1539
1518
|
|
|
1540
1519
|
Link.displayName = "Link";
|
|
1541
|
-
|
|
1520
|
+
```
|
|
1542
1521
|
|
|
1543
1522
|
```jsx fileName="src/components/Link.mjx" codeFormat="esm"
|
|
1544
1523
|
import { getLocalizedUrl } from "intlayer";
|
|
@@ -1554,14 +1533,14 @@ export const checkIsExternalLink = (href?: string): boolean =>
|
|
|
1554
1533
|
|
|
1555
1534
|
/**
|
|
1556
1535
|
* Eine benutzerdefinierte Link-Komponente, die das href-Attribut basierend auf der aktuellen Locale anpasst.
|
|
1557
|
-
* Für interne Links
|
|
1536
|
+
* Für interne Links wird `getLocalizedUrl` verwendet, um die URL mit der Locale zu versehen (z.B. /fr/about).
|
|
1558
1537
|
* Dies stellt sicher, dass die Navigation im gleichen Locale-Kontext bleibt.
|
|
1559
1538
|
*/
|
|
1560
1539
|
export const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1561
1540
|
const { locale } = useLocale();
|
|
1562
1541
|
const isExternalLink = checkIsExternalLink(href);
|
|
1563
1542
|
|
|
1564
|
-
// Wenn der Link intern ist und eine gültige href
|
|
1543
|
+
// Wenn der Link intern ist und eine gültige href vorhanden ist, wird die lokalisierte URL abgerufen.
|
|
1565
1544
|
const hrefI18n =
|
|
1566
1545
|
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1567
1546
|
|
|
@@ -1595,7 +1574,7 @@ const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
|
1595
1574
|
const { locale } = useLocale();
|
|
1596
1575
|
const isExternalLink = checkIsExternalLink(href);
|
|
1597
1576
|
|
|
1598
|
-
// Wenn der Link intern ist und eine gültige href
|
|
1577
|
+
// Wenn der Link intern ist und eine gültige href angegeben ist, wird die lokalisierte URL ermittelt.
|
|
1599
1578
|
const localizedHref = isExternalLink ? href : getLocalizedUrl(href, locale);
|
|
1600
1579
|
|
|
1601
1580
|
return (
|
|
@@ -1613,25 +1592,25 @@ const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
|
1613
1592
|
Link.displayName = "Link";
|
|
1614
1593
|
```
|
|
1615
1594
|
|
|
1616
|
-
####
|
|
1595
|
+
#### Funktionsweise
|
|
1617
1596
|
|
|
1618
1597
|
- **Erkennung externer Links**:
|
|
1619
|
-
Die Hilfsfunktion `checkIsExternalLink` bestimmt, ob eine URL extern ist. Externe Links bleiben unverändert, da sie
|
|
1598
|
+
Die Hilfsfunktion `checkIsExternalLink` bestimmt, ob eine URL extern ist. Externe Links bleiben unverändert, da sie nicht lokalisiert werden müssen.
|
|
1620
1599
|
|
|
1621
1600
|
- **Abrufen der aktuellen Locale**:
|
|
1622
|
-
Der Hook `useLocale` liefert die aktuelle Locale (z.B. `fr` für Französisch).
|
|
1601
|
+
Der Hook `useLocale` liefert die aktuelle Locale (z. B. `fr` für Französisch).
|
|
1623
1602
|
|
|
1624
1603
|
- **Lokalisierung der URL**:
|
|
1625
|
-
Für interne Links (d.h. nicht extern) wird `getLocalizedUrl` verwendet, um die URL automatisch mit der aktuellen Locale zu versehen. Das bedeutet, wenn Ihr Benutzer Französisch eingestellt hat, wird aus `/about` als `href` automatisch `/fr/about`.
|
|
1604
|
+
Für interne Links (d. h. nicht extern) wird `getLocalizedUrl` verwendet, um die URL automatisch mit der aktuellen Locale zu versehen. Das bedeutet, wenn Ihr Benutzer Französisch eingestellt hat, wird aus `/about` als `href` automatisch `/fr/about`.
|
|
1626
1605
|
|
|
1627
1606
|
- **Rückgabe des Links**:
|
|
1628
1607
|
Die Komponente gibt ein `<a>`-Element mit der lokalisierten URL zurück, wodurch sichergestellt wird, dass die Navigation konsistent mit der Spracheinstellung erfolgt.
|
|
1629
1608
|
|
|
1630
|
-
|
|
1609
|
+
Indem Sie diese `Link`-Komponente in Ihrer gesamten Anwendung integrieren, gewährleisten Sie eine kohärente und sprachbewusste Benutzererfahrung und profitieren gleichzeitig von verbesserter SEO und Benutzerfreundlichkeit.
|
|
1631
1610
|
|
|
1632
1611
|
### TypeScript konfigurieren
|
|
1633
1612
|
|
|
1634
|
-
Intlayer verwendet Module Augmentation, um die Vorteile von TypeScript zu nutzen und Ihren
|
|
1613
|
+
Intlayer verwendet Module Augmentation, um die Vorteile von TypeScript zu nutzen und Ihren Codebasis robuster zu machen.
|
|
1635
1614
|
|
|
1636
1615
|

|
|
1637
1616
|
|
|
@@ -1651,9 +1630,9 @@ Stellen Sie sicher, dass Ihre TypeScript-Konfiguration die automatisch generiert
|
|
|
1651
1630
|
|
|
1652
1631
|
### Git-Konfiguration
|
|
1653
1632
|
|
|
1654
|
-
Es wird empfohlen, die von Intlayer generierten Dateien zu ignorieren.
|
|
1633
|
+
Es wird empfohlen, die von Intlayer generierten Dateien zu ignorieren. Dadurch vermeiden Sie, diese versehentlich in Ihr Git-Repository zu committen.
|
|
1655
1634
|
|
|
1656
|
-
|
|
1635
|
+
Fügen Sie dazu folgende Anweisungen in Ihre `.gitignore`-Datei ein:
|
|
1657
1636
|
|
|
1658
1637
|
```plaintext
|
|
1659
1638
|
# Ignoriere die von Intlayer generierten Dateien
|
|
@@ -1673,7 +1652,7 @@ Diese Erweiterung bietet:
|
|
|
1673
1652
|
- **Inline-Vorschauen** des übersetzten Inhalts.
|
|
1674
1653
|
- **Schnellaktionen**, um Übersetzungen einfach zu erstellen und zu aktualisieren.
|
|
1675
1654
|
|
|
1676
|
-
Für weitere Details zur
|
|
1655
|
+
Für weitere Details zur Nutzung der Erweiterung siehe die [Intlayer VS Code Extension Dokumentation](https://intlayer.org/doc/vs-code-extension).
|
|
1677
1656
|
|
|
1678
1657
|
---
|
|
1679
1658
|
|
|
@@ -1685,4 +1664,4 @@ Um weiterzugehen, können Sie den [visuellen Editor](https://github.com/aymericz
|
|
|
1685
1664
|
|
|
1686
1665
|
## Dokumentationshistorie
|
|
1687
1666
|
|
|
1688
|
-
- 5.5.10 - 2025-06-29:
|
|
1667
|
+
- 5.5.10 - 2025-06-29: Historie initialisiert
|