@intlayer/docs 5.5.8
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/LICENSE +202 -0
- package/ar/CI_CD.md +149 -0
- package/ar/autoFill.md +157 -0
- package/ar/concept/content/file.md +1 -0
- package/ar/configuration.md +492 -0
- package/ar/dictionary/condition.md +213 -0
- package/ar/dictionary/content_extention_customization.md +81 -0
- package/ar/dictionary/enumeration.md +221 -0
- package/ar/dictionary/file.md +209 -0
- package/ar/dictionary/function_fetching.md +190 -0
- package/ar/dictionary/get_started.md +490 -0
- package/ar/dictionary/insertion.md +161 -0
- package/ar/dictionary/markdown.md +343 -0
- package/ar/dictionary/nesting.md +249 -0
- package/ar/dictionary/translation.md +307 -0
- package/ar/header.md +7 -0
- package/ar/how_works_intlayer.md +219 -0
- package/ar/index.md +125 -0
- package/ar/interest_of_intlayer.md +132 -0
- package/ar/intlayer_CMS.md +328 -0
- package/ar/intlayer_cli.md +258 -0
- package/ar/intlayer_visual_editor.md +210 -0
- package/ar/intlayer_with_angular.md +3 -0
- package/ar/intlayer_with_create_react_app.md +1196 -0
- package/ar/intlayer_with_express.md +270 -0
- package/ar/intlayer_with_lynx+react.md +482 -0
- package/ar/intlayer_with_nextjs_14.md +1260 -0
- package/ar/intlayer_with_nextjs_15.md +1311 -0
- package/ar/intlayer_with_nextjs_page_router.md +1099 -0
- package/ar/intlayer_with_react_native+expo.md +539 -0
- package/ar/intlayer_with_vite+preact.md +1679 -0
- package/ar/intlayer_with_vite+react.md +1582 -0
- package/ar/intlayer_with_vite+solid.md +3 -0
- package/ar/intlayer_with_vite+svelte.md +3 -0
- package/ar/intlayer_with_vite+vue.md +989 -0
- package/ar/introduction.md +190 -0
- package/ar/mcp_server.md +150 -0
- package/ar/packages/@intlayer/api/index.md +31 -0
- package/ar/packages/@intlayer/chokidar/index.md +31 -0
- package/ar/packages/@intlayer/cli/index.md +1 -0
- package/ar/packages/@intlayer/config/index.md +116 -0
- package/ar/packages/@intlayer/core/index.md +25 -0
- package/ar/packages/@intlayer/design-system/index.md +21 -0
- package/ar/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/ar/packages/@intlayer/editor/index.md +21 -0
- package/ar/packages/@intlayer/editor-react/index.md +21 -0
- package/ar/packages/@intlayer/webpack/index.md +35 -0
- package/ar/packages/angular-intlayer/index.md +3 -0
- package/ar/packages/express-intlayer/index.md +232 -0
- package/ar/packages/express-intlayer/t.md +448 -0
- package/ar/packages/intlayer/getConfiguration.md +120 -0
- package/ar/packages/intlayer/getEnumeration.md +138 -0
- package/ar/packages/intlayer/getHTMLTextDir.md +97 -0
- package/ar/packages/intlayer/getLocaleLang.md +61 -0
- package/ar/packages/intlayer/getLocaleName.md +93 -0
- package/ar/packages/intlayer/getLocalizedUrl.md +221 -0
- package/ar/packages/intlayer/getMultilingualUrls.md +198 -0
- package/ar/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/ar/packages/intlayer/getTranslation.md +175 -0
- package/ar/packages/intlayer/getTranslationContent.md +175 -0
- package/ar/packages/intlayer/index.md +254 -0
- package/ar/packages/intlayer-cli/index.md +41 -0
- package/ar/packages/intlayer-editor/index.md +113 -0
- package/ar/packages/lynx-intlayer/index.md +58 -0
- package/ar/packages/next-intlayer/index.md +267 -0
- package/ar/packages/next-intlayer/t.md +341 -0
- package/ar/packages/next-intlayer/useDictionary.md +248 -0
- package/ar/packages/next-intlayer/useIntlayer.md +237 -0
- package/ar/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/ar/packages/next-intlayer/useLocale.md +105 -0
- package/ar/packages/preact-intlayer/index.md +3 -0
- package/ar/packages/react-intlayer/index.md +261 -0
- package/ar/packages/react-intlayer/t.md +283 -0
- package/ar/packages/react-intlayer/useDictionary.md +268 -0
- package/ar/packages/react-intlayer/useIntlayer.md +225 -0
- package/ar/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/ar/packages/react-intlayer/useLocale.md +184 -0
- package/ar/packages/react-native-intlayer/index.md +57 -0
- package/ar/packages/react-scripts-intlayer/index.md +57 -0
- package/ar/packages/solid-intlayer/index.md +3 -0
- package/ar/packages/svelte-intlayer/index.md +3 -0
- package/ar/packages/vite-intlayer/index.md +53 -0
- package/ar/packages/vue-intlayer/index.md +3 -0
- package/ar/per_locale_file.md +298 -0
- package/ar/privacy_notice.md +61 -0
- package/ar/roadmap.md +208 -0
- package/ar/terms_of_service.md +33 -0
- package/ar/vs_code_extension.md +139 -0
- package/de/CI_CD.md +149 -0
- package/de/angular-intlayer/index.md +3 -0
- package/de/autoFill.md +157 -0
- package/de/configuration.md +501 -0
- package/de/dictionary/condition.md +213 -0
- package/de/dictionary/content_extention_customization.md +81 -0
- package/de/dictionary/enumeration.md +221 -0
- package/de/dictionary/file.md +207 -0
- package/de/dictionary/function_fetching.md +190 -0
- package/de/dictionary/get_started.md +466 -0
- package/de/dictionary/insertion.md +167 -0
- package/de/dictionary/markdown.md +345 -0
- package/de/dictionary/nesting.md +252 -0
- package/de/dictionary/translation.md +287 -0
- package/de/header.md +5 -0
- package/de/how_works_intlayer.md +216 -0
- package/de/index.md +125 -0
- package/de/insertion.md +0 -0
- package/de/interest_of_intlayer.md +132 -0
- package/de/intlayer_CMS.md +334 -0
- package/de/intlayer_cli.md +274 -0
- package/de/intlayer_visual_editor.md +210 -0
- package/de/intlayer_with_angular.md +3 -0
- package/de/intlayer_with_create_react_app.md +1200 -0
- package/de/intlayer_with_express.md +268 -0
- package/de/intlayer_with_lynx+react.md +482 -0
- package/de/intlayer_with_nextjs_14.md +1258 -0
- package/de/intlayer_with_nextjs_15.md +1306 -0
- package/de/intlayer_with_nextjs_page_router.md +1087 -0
- package/de/intlayer_with_react_native+expo.md +539 -0
- package/de/intlayer_with_vite+preact.md +1701 -0
- package/de/intlayer_with_vite+react.md +1584 -0
- package/de/intlayer_with_vite+solid.md +3 -0
- package/de/intlayer_with_vite+svelte.md +3 -0
- package/de/intlayer_with_vite+vue.md +989 -0
- package/de/introduction.md +186 -0
- package/de/mcp_server.md +150 -0
- package/de/packages/@intlayer/api/index.md +31 -0
- package/de/packages/@intlayer/chokidar/index.md +31 -0
- package/de/packages/@intlayer/cli/index.md +21 -0
- package/de/packages/@intlayer/config/index.md +116 -0
- package/de/packages/@intlayer/core/index.md +25 -0
- package/de/packages/@intlayer/design-system/index.md +21 -0
- package/de/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/de/packages/@intlayer/editor/index.md +21 -0
- package/de/packages/@intlayer/editor-react/index.md +21 -0
- package/de/packages/@intlayer/webpack/index.md +35 -0
- package/de/packages/angular-intlayer/index.md +31 -0
- package/de/packages/express-intlayer/index.md +229 -0
- package/de/packages/express-intlayer/t.md +432 -0
- package/de/packages/intlayer/getConfiguration.md +120 -0
- package/de/packages/intlayer/getEnumeration.md +140 -0
- package/de/packages/intlayer/getHTMLTextDir.md +97 -0
- package/de/packages/intlayer/getLocaleLang.md +57 -0
- package/de/packages/intlayer/getLocaleName.md +93 -0
- package/de/packages/intlayer/getLocalizedUrl.md +221 -0
- package/de/packages/intlayer/getMultilingualUrls.md +198 -0
- package/de/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/de/packages/intlayer/getTranslation.md +166 -0
- package/de/packages/intlayer/getTranslationContent.md +166 -0
- package/de/packages/intlayer/index.md +478 -0
- package/de/packages/intlayer-cli/index.md +41 -0
- package/de/packages/intlayer-editor/index.md +113 -0
- package/de/packages/lynx-intlayer/index.md +58 -0
- package/de/packages/next-intlayer/index.md +263 -0
- package/de/packages/next-intlayer/t.md +325 -0
- package/de/packages/next-intlayer/useDictionary.md +242 -0
- package/de/packages/next-intlayer/useIntlayer.md +237 -0
- package/de/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/de/packages/next-intlayer/useLocale.md +105 -0
- package/de/packages/preact-intlayer/index.md +3 -0
- package/de/packages/react-intlayer/index.md +260 -0
- package/de/packages/react-intlayer/t.md +277 -0
- package/de/packages/react-intlayer/useDictionary.md +260 -0
- package/de/packages/react-intlayer/useIntlayer.md +225 -0
- package/de/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/de/packages/react-intlayer/useLocale.md +184 -0
- package/de/packages/react-native-intlayer/index.md +57 -0
- package/de/packages/react-scripts-intlayer/index.md +57 -0
- package/de/packages/solid-intlayer/index.md +3 -0
- package/de/packages/svelte-intlayer/index.md +3 -0
- package/de/packages/vite-intlayer/index.md +53 -0
- package/de/packages/vue-intlayer/index.md +3 -0
- package/de/per_locale_file.md +298 -0
- package/de/privacy_notice.md +61 -0
- package/de/roadmap.md +206 -0
- package/de/terms_of_service.md +33 -0
- package/de/vs_code_extension.md +139 -0
- package/en/CI_CD.md +149 -0
- package/en/autoFill.md +157 -0
- package/en/configuration.md +506 -0
- package/en/dictionary/condition.md +213 -0
- package/en/dictionary/content_extention_customization.md +81 -0
- package/en/dictionary/enumeration.md +221 -0
- package/en/dictionary/file.md +198 -0
- package/en/dictionary/function_fetching.md +190 -0
- package/en/dictionary/get_started.md +504 -0
- package/en/dictionary/insertion.md +167 -0
- package/en/dictionary/markdown.md +355 -0
- package/en/dictionary/nesting.md +249 -0
- package/en/dictionary/translation.md +285 -0
- package/en/frequent_questions/build_dictionaries.md +37 -0
- package/en/frequent_questions/domain_routing.md +92 -0
- package/en/frequent_questions/esbuild_error.md +9 -0
- package/en/frequent_questions/get_locale_cookie.md +121 -0
- package/en/frequent_questions/intlayer_command_undefined.md +135 -0
- package/en/frequent_questions/locale_incorect_in_url.md +52 -0
- package/en/frequent_questions/static_rendering.md +24 -0
- package/en/frequent_questions/unknown_command.md +76 -0
- package/en/header.md +5 -0
- package/en/how_works_intlayer.md +219 -0
- package/en/index.md +139 -0
- package/en/interest_of_intlayer.md +133 -0
- package/en/intlayer_CMS.md +334 -0
- package/en/intlayer_cli.md +309 -0
- package/en/intlayer_visual_editor.md +244 -0
- package/en/intlayer_with_angular.md +139 -0
- package/en/intlayer_with_create_react_app.md +1209 -0
- package/en/intlayer_with_express.md +391 -0
- package/en/intlayer_with_lynx+react.md +483 -0
- package/en/intlayer_with_nextjs_14.md +1298 -0
- package/en/intlayer_with_nextjs_15.md +1347 -0
- package/en/intlayer_with_nextjs_page_router.md +1126 -0
- package/en/intlayer_with_react_native+expo.md +630 -0
- package/en/intlayer_with_vite+preact.md +1659 -0
- package/en/intlayer_with_vite+react.md +1605 -0
- package/en/intlayer_with_vite+solid.md +254 -0
- package/en/intlayer_with_vite+svelte.md +254 -0
- package/en/intlayer_with_vite+vue.md +1000 -0
- package/en/introduction.md +185 -0
- package/en/mcp_server.md +150 -0
- package/en/packages/@intlayer/api/index.md +31 -0
- package/en/packages/@intlayer/chokidar/index.md +31 -0
- package/en/packages/@intlayer/cli/index.md +21 -0
- package/en/packages/@intlayer/config/index.md +116 -0
- package/en/packages/@intlayer/core/index.md +25 -0
- package/en/packages/@intlayer/design-system/index.md +21 -0
- package/en/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/en/packages/@intlayer/editor/index.md +21 -0
- package/en/packages/@intlayer/editor-react/index.md +21 -0
- package/en/packages/@intlayer/webpack/index.md +35 -0
- package/en/packages/angular-intlayer/index.md +31 -0
- package/en/packages/express-intlayer/index.md +229 -0
- package/en/packages/express-intlayer/t.md +432 -0
- package/en/packages/intlayer/getConfiguration.md +120 -0
- package/en/packages/intlayer/getEnumeration.md +138 -0
- package/en/packages/intlayer/getHTMLTextDir.md +97 -0
- package/en/packages/intlayer/getLocaleLang.md +57 -0
- package/en/packages/intlayer/getLocaleName.md +93 -0
- package/en/packages/intlayer/getLocalizedUrl.md +221 -0
- package/en/packages/intlayer/getMultilingualUrls.md +198 -0
- package/en/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/en/packages/intlayer/getTranslation.md +166 -0
- package/en/packages/intlayer/getTranslationContent.md +166 -0
- package/en/packages/intlayer/index.md +476 -0
- package/en/packages/intlayer-cli/index.md +41 -0
- package/en/packages/intlayer-editor/index.md +113 -0
- package/en/packages/lynx-intlayer/index.md +60 -0
- package/en/packages/next-intlayer/index.md +263 -0
- package/en/packages/next-intlayer/t.md +326 -0
- package/en/packages/next-intlayer/useDictionary.md +242 -0
- package/en/packages/next-intlayer/useIntlayer.md +237 -0
- package/en/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/en/packages/next-intlayer/useLocale.md +105 -0
- package/en/packages/preact-intlayer/index.md +31 -0
- package/en/packages/react-intlayer/index.md +257 -0
- package/en/packages/react-intlayer/t.md +277 -0
- package/en/packages/react-intlayer/useDictionary.md +260 -0
- package/en/packages/react-intlayer/useIntlayer.md +225 -0
- package/en/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/en/packages/react-intlayer/useLocale.md +184 -0
- package/en/packages/react-native-intlayer/index.md +59 -0
- package/en/packages/react-scripts-intlayer/index.md +57 -0
- package/en/packages/solid-intlayer/index.md +31 -0
- package/en/packages/svelte-intlayer/index.md +31 -0
- package/en/packages/vite-intlayer/index.md +53 -0
- package/en/packages/vue-intlayer/index.md +31 -0
- package/en/per_locale_file.md +297 -0
- package/en/privacy_notice.md +61 -0
- package/en/roadmap.md +270 -0
- package/en/t.md +163 -0
- package/en/terms_of_service.md +33 -0
- package/en/vs_code_extension.md +129 -0
- package/en-GB/CI_CD.md +149 -0
- package/en-GB/autoFill.md +0 -0
- package/en-GB/configuration.md +490 -0
- package/en-GB/dictionary/condition.md +213 -0
- package/en-GB/dictionary/content_extention_customization.md +83 -0
- package/en-GB/dictionary/enumeration.md +221 -0
- package/en-GB/dictionary/file.md +201 -0
- package/en-GB/dictionary/function_fetching.md +190 -0
- package/en-GB/dictionary/get_started.md +466 -0
- package/en-GB/dictionary/insertion.md +167 -0
- package/en-GB/dictionary/markdown.md +343 -0
- package/en-GB/dictionary/nesting.md +249 -0
- package/en-GB/dictionary/translation.md +285 -0
- package/en-GB/header.md +1 -0
- package/en-GB/how_works_intlayer.md +217 -0
- package/en-GB/index.md +142 -0
- package/en-GB/interest_of_intlayer.md +123 -0
- package/en-GB/intlayer_CMS.md +334 -0
- package/en-GB/intlayer_cli.md +239 -0
- package/en-GB/intlayer_visual_editor.md +210 -0
- package/en-GB/intlayer_with_angular.md +3 -0
- package/en-GB/intlayer_with_create_react_app.md +1192 -0
- package/en-GB/intlayer_with_express.md +267 -0
- package/en-GB/intlayer_with_lynx+react.md +484 -0
- package/en-GB/intlayer_with_nextjs_14.md +1267 -0
- package/en-GB/intlayer_with_nextjs_15.md +1308 -0
- package/en-GB/intlayer_with_nextjs_page_router.md +1087 -0
- package/en-GB/intlayer_with_react_native+expo.md +539 -0
- package/en-GB/intlayer_with_vite+preact.md +1648 -0
- package/en-GB/intlayer_with_vite+react.md +1430 -0
- package/en-GB/intlayer_with_vite+solid.md +3 -0
- package/en-GB/intlayer_with_vite+svelte.md +3 -0
- package/en-GB/intlayer_with_vite+vue.md +993 -0
- package/en-GB/introduction.md +201 -0
- package/en-GB/mcp_server.md +150 -0
- package/en-GB/packages/@intlayer/api/index.md +31 -0
- package/en-GB/packages/@intlayer/chokidar/index.md +31 -0
- package/en-GB/packages/@intlayer/cli/index.md +21 -0
- package/en-GB/packages/@intlayer/config/index.md +116 -0
- package/en-GB/packages/@intlayer/core/index.md +25 -0
- package/en-GB/packages/@intlayer/design-system/index.md +21 -0
- package/en-GB/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/en-GB/packages/@intlayer/editor/index.md +21 -0
- package/en-GB/packages/@intlayer/editor-react/index.md +21 -0
- package/en-GB/packages/@intlayer/webpack/index.md +35 -0
- package/en-GB/packages/angular-intlayer/index.md +3 -0
- package/en-GB/packages/express-intlayer/index.md +229 -0
- package/en-GB/packages/express-intlayer/t.md +432 -0
- package/en-GB/packages/intlayer/getConfiguration.md +120 -0
- package/en-GB/packages/intlayer/getEnumeration.md +140 -0
- package/en-GB/packages/intlayer/getHTMLTextDir.md +97 -0
- package/en-GB/packages/intlayer/getLocaleLang.md +57 -0
- package/en-GB/packages/intlayer/getLocaleName.md +93 -0
- package/en-GB/packages/intlayer/getLocalizedUrl.md +221 -0
- package/en-GB/packages/intlayer/getMultilingualUrls.md +198 -0
- package/en-GB/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/en-GB/packages/intlayer/getTranslation.md +166 -0
- package/en-GB/packages/intlayer/getTranslationContent.md +166 -0
- package/en-GB/packages/intlayer/index.md +476 -0
- package/en-GB/packages/intlayer-cli/index.md +41 -0
- package/en-GB/packages/intlayer-editor/index.md +113 -0
- package/en-GB/packages/lynx-intlayer/index.md +58 -0
- package/en-GB/packages/next-intlayer/index.md +263 -0
- package/en-GB/packages/next-intlayer/t.md +326 -0
- package/en-GB/packages/next-intlayer/useDictionary.md +242 -0
- package/en-GB/packages/next-intlayer/useIntlayer.md +237 -0
- package/en-GB/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/en-GB/packages/next-intlayer/useLocale.md +105 -0
- package/en-GB/packages/preact-intlayer/index.md +3 -0
- package/en-GB/packages/react-intlayer/index.md +257 -0
- package/en-GB/packages/react-intlayer/t.md +277 -0
- package/en-GB/packages/react-intlayer/useDictionary.md +260 -0
- package/en-GB/packages/react-intlayer/useIntlayer.md +225 -0
- package/en-GB/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/en-GB/packages/react-intlayer/useLocale.md +184 -0
- package/en-GB/packages/react-native-intlayer/index.md +57 -0
- package/en-GB/packages/react-scripts-intlayer/index.md +57 -0
- package/en-GB/packages/solid-intlayer/index.md +3 -0
- package/en-GB/packages/svelte-intlayer/index.md +3 -0
- package/en-GB/packages/vite-intlayer/index.md +53 -0
- package/en-GB/packages/vue-intlayer/index.md +3 -0
- package/en-GB/per_locale_file.md +298 -0
- package/en-GB/privacy_notice.md +57 -0
- package/en-GB/roadmap.md +206 -0
- package/en-GB/terms_of_service.md +33 -0
- package/en-GB/vs_code_extension.md +139 -0
- package/es/CI_CD.md +149 -0
- package/es/autoFill.md +157 -0
- package/es/configuration.md +503 -0
- package/es/dictionary/condition.md +213 -0
- package/es/dictionary/content_extention_customization.md +81 -0
- package/es/dictionary/enumeration.md +221 -0
- package/es/dictionary/file.md +206 -0
- package/es/dictionary/function_fetching.md +190 -0
- package/es/dictionary/get_started.md +466 -0
- package/es/dictionary/insertion.md +161 -0
- package/es/dictionary/markdown.md +338 -0
- package/es/dictionary/nesting.md +249 -0
- package/es/dictionary/translation.md +287 -0
- package/es/header.md +5 -0
- package/es/how_works_intlayer.md +217 -0
- package/es/index.md +122 -0
- package/es/interest_of_intlayer.md +132 -0
- package/es/intlayer_CMS.md +334 -0
- package/es/intlayer_cli.md +274 -0
- package/es/intlayer_visual_editor.md +210 -0
- package/es/intlayer_with_angular.md +3 -0
- package/es/intlayer_with_create_react_app.md +1192 -0
- package/es/intlayer_with_express.md +276 -0
- package/es/intlayer_with_lynx+react.md +475 -0
- package/es/intlayer_with_nextjs_14.md +1258 -0
- package/es/intlayer_with_nextjs_15.md +1308 -0
- package/es/intlayer_with_nextjs_page_router.md +1088 -0
- package/es/intlayer_with_react_native+expo.md +180 -0
- package/es/intlayer_with_vite+preact.md +1637 -0
- package/es/intlayer_with_vite+react.md +1592 -0
- package/es/intlayer_with_vite+solid.md +3 -0
- package/es/intlayer_with_vite+svelte.md +3 -0
- package/es/intlayer_with_vite+vue.md +947 -0
- package/es/introduction.md +184 -0
- package/es/mcp_server.md +150 -0
- package/es/packages/@intlayer/api/index.md +31 -0
- package/es/packages/@intlayer/chokidar/index.md +31 -0
- package/es/packages/@intlayer/cli/index.md +21 -0
- package/es/packages/@intlayer/config/index.md +116 -0
- package/es/packages/@intlayer/core/index.md +25 -0
- package/es/packages/@intlayer/design-system/index.md +21 -0
- package/es/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/es/packages/@intlayer/editor/index.md +21 -0
- package/es/packages/@intlayer/editor-react/index.md +21 -0
- package/es/packages/@intlayer/webpack/index.md +35 -0
- package/es/packages/angular-intlayer/index.md +3 -0
- package/es/packages/express-intlayer/index.md +229 -0
- package/es/packages/express-intlayer/t.md +432 -0
- package/es/packages/intlayer/getConfiguration.md +120 -0
- package/es/packages/intlayer/getEnumeration.md +138 -0
- package/es/packages/intlayer/getHTMLTextDir.md +97 -0
- package/es/packages/intlayer/getLocaleLang.md +57 -0
- package/es/packages/intlayer/getLocaleName.md +93 -0
- package/es/packages/intlayer/getLocalizedUrl.md +221 -0
- package/es/packages/intlayer/getMultilingualUrls.md +198 -0
- package/es/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/es/packages/intlayer/getTranslation.md +166 -0
- package/es/packages/intlayer/getTranslationContent.md +166 -0
- package/es/packages/intlayer/index.md +478 -0
- package/es/packages/intlayer-cli/index.md +41 -0
- package/es/packages/intlayer-editor/index.md +115 -0
- package/es/packages/lynx-intlayer/index.md +58 -0
- package/es/packages/next-intlayer/index.md +263 -0
- package/es/packages/next-intlayer/t.md +325 -0
- package/es/packages/next-intlayer/useDictionary.md +242 -0
- package/es/packages/next-intlayer/useIntlayer.md +237 -0
- package/es/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/es/packages/next-intlayer/useLocale.md +105 -0
- package/es/packages/preact-intlayer/index.md +3 -0
- package/es/packages/react-intlayer/index.md +263 -0
- package/es/packages/react-intlayer/t.md +277 -0
- package/es/packages/react-intlayer/useDictionary.md +270 -0
- package/es/packages/react-intlayer/useIntlayer.md +225 -0
- package/es/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/es/packages/react-intlayer/useLocale.md +184 -0
- package/es/packages/react-native-intlayer/index.md +57 -0
- package/es/packages/react-scripts-intlayer/index.md +57 -0
- package/es/packages/solid-intlayer/index.md +3 -0
- package/es/packages/svelte-intlayer/index.md +5 -0
- package/es/packages/vite-intlayer/index.md +53 -0
- package/es/packages/vue-intlayer/index.md +3 -0
- package/es/per_locale_file.md +293 -0
- package/es/privacy_notice.md +61 -0
- package/es/roadmap.md +157 -0
- package/es/terms_of_service.md +33 -0
- package/es/vs_code_extension.md +139 -0
- package/fr/CI_CD.md +149 -0
- package/fr/autoFill.md +157 -0
- package/fr/configuration.md +481 -0
- package/fr/dictionary/condition.md +213 -0
- package/fr/dictionary/content_extention_customization.md +81 -0
- package/fr/dictionary/enumeration.md +221 -0
- package/fr/dictionary/file.md +206 -0
- package/fr/dictionary/function_fetching.md +190 -0
- package/fr/dictionary/get_started.md +466 -0
- package/fr/dictionary/insertion.md +161 -0
- package/fr/dictionary/markdown.md +335 -0
- package/fr/dictionary/nesting.md +249 -0
- package/fr/dictionary/translation.md +287 -0
- package/fr/header.md +5 -0
- package/fr/how_works_intlayer.md +217 -0
- package/fr/index.md +122 -0
- package/fr/interest_of_intlayer.md +132 -0
- package/fr/intlayer_CMS.md +334 -0
- package/fr/intlayer_cli.md +274 -0
- package/fr/intlayer_visual_editor.md +210 -0
- package/fr/intlayer_with_angular.md +3 -0
- package/fr/intlayer_with_create_react_app.md +1192 -0
- package/fr/intlayer_with_express.md +270 -0
- package/fr/intlayer_with_lynx+react.md +466 -0
- package/fr/intlayer_with_nextjs_14.md +1258 -0
- package/fr/intlayer_with_nextjs_15.md +1308 -0
- package/fr/intlayer_with_nextjs_page_router.md +1085 -0
- package/fr/intlayer_with_react_native+expo.md +535 -0
- package/fr/intlayer_with_vite+preact.md +1621 -0
- package/fr/intlayer_with_vite+react.md +1589 -0
- package/fr/intlayer_with_vite+solid.md +3 -0
- package/fr/intlayer_with_vite+svelte.md +3 -0
- package/fr/intlayer_with_vite+vue.md +947 -0
- package/fr/introduction.md +190 -0
- package/fr/mcp_server.md +152 -0
- package/fr/packages/@intlayer/api/index.md +31 -0
- package/fr/packages/@intlayer/chokidar/index.md +31 -0
- package/fr/packages/@intlayer/cli/index.md +21 -0
- package/fr/packages/@intlayer/config/index.md +116 -0
- package/fr/packages/@intlayer/core/index.md +25 -0
- package/fr/packages/@intlayer/design-system/index.md +21 -0
- package/fr/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/fr/packages/@intlayer/editor/index.md +21 -0
- package/fr/packages/@intlayer/editor-react/index.md +21 -0
- package/fr/packages/@intlayer/webpack/index.md +35 -0
- package/fr/packages/angular-intlayer/index.md +3 -0
- package/fr/packages/express-intlayer/index.md +238 -0
- package/fr/packages/express-intlayer/t.md +432 -0
- package/fr/packages/intlayer/getConfiguration.md +120 -0
- package/fr/packages/intlayer/getEnumeration.md +138 -0
- package/fr/packages/intlayer/getHTMLTextDir.md +97 -0
- package/fr/packages/intlayer/getLocaleLang.md +57 -0
- package/fr/packages/intlayer/getLocaleName.md +93 -0
- package/fr/packages/intlayer/getLocalizedUrl.md +221 -0
- package/fr/packages/intlayer/getMultilingualUrls.md +198 -0
- package/fr/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/fr/packages/intlayer/getTranslation.md +166 -0
- package/fr/packages/intlayer/getTranslationContent.md +166 -0
- package/fr/packages/intlayer/index.md +476 -0
- package/fr/packages/intlayer-cli/index.md +41 -0
- package/fr/packages/intlayer-editor/index.md +115 -0
- package/fr/packages/lynx-intlayer/index.md +58 -0
- package/fr/packages/next-intlayer/index.md +266 -0
- package/fr/packages/next-intlayer/t.md +325 -0
- package/fr/packages/next-intlayer/useDictionary.md +242 -0
- package/fr/packages/next-intlayer/useIntlayer.md +237 -0
- package/fr/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/fr/packages/next-intlayer/useLocale.md +105 -0
- package/fr/packages/preact-intlayer/index.md +3 -0
- package/fr/packages/react-intlayer/index.md +257 -0
- package/fr/packages/react-intlayer/t.md +277 -0
- package/fr/packages/react-intlayer/useDictionary.md +269 -0
- package/fr/packages/react-intlayer/useIntlayer.md +234 -0
- package/fr/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/fr/packages/react-intlayer/useLocale.md +184 -0
- package/fr/packages/react-native-intlayer/index.md +57 -0
- package/fr/packages/react-scripts-intlayer/index.md +57 -0
- package/fr/packages/solid-intlayer/index.md +3 -0
- package/fr/packages/svelte-intlayer/index.md +3 -0
- package/fr/packages/vite-intlayer/index.md +53 -0
- package/fr/packages/vue-intlayer/index.md +3 -0
- package/fr/per_locale_file.md +297 -0
- package/fr/privacy_notice.md +57 -0
- package/fr/roadmap.md +206 -0
- package/fr/terms_of_service.md +33 -0
- package/fr/vs_code_extension.md +139 -0
- package/hi/CI_CD.md +149 -0
- package/hi/autoFill.md +157 -0
- package/hi/configuration.md +509 -0
- package/hi/dictionary/condition.md +213 -0
- package/hi/dictionary/content_extention_customization.md +81 -0
- package/hi/dictionary/enumeration.md +221 -0
- package/hi/dictionary/file.md +209 -0
- package/hi/dictionary/function_fetching.md +188 -0
- package/hi/dictionary/get_started.md +490 -0
- package/hi/dictionary/insertion.md +167 -0
- package/hi/dictionary/markdown.md +344 -0
- package/hi/dictionary/nesting.md +249 -0
- package/hi/dictionary/translation.md +307 -0
- package/hi/header.md +7 -0
- package/hi/how_works_intlayer.md +217 -0
- package/hi/index.md +125 -0
- package/hi/interest_of_intlayer.md +132 -0
- package/hi/intlayer_CMS.md +334 -0
- package/hi/intlayer_cli.md +274 -0
- package/hi/intlayer_visual_editor.md +210 -0
- package/hi/intlayer_with_angular.md +3 -0
- package/hi/intlayer_with_create_react_app.md +1395 -0
- package/hi/intlayer_with_express.md +273 -0
- package/hi/intlayer_with_lynx+react.md +456 -0
- package/hi/intlayer_with_nextjs_14.md +1283 -0
- package/hi/intlayer_with_nextjs_15.md +1319 -0
- package/hi/intlayer_with_nextjs_page_router.md +1097 -0
- package/hi/intlayer_with_react_native+expo.md +554 -0
- package/hi/intlayer_with_vite+preact.md +1538 -0
- package/hi/intlayer_with_vite+react.md +1540 -0
- package/hi/intlayer_with_vite+solid.md +3 -0
- package/hi/intlayer_with_vite+svelte.md +3 -0
- package/hi/intlayer_with_vite+vue.md +840 -0
- package/hi/introduction.md +190 -0
- package/hi/mcp_server.md +150 -0
- package/hi/packages/@intlayer/api/index.md +31 -0
- package/hi/packages/@intlayer/chokidar/index.md +31 -0
- package/hi/packages/@intlayer/cli/index.md +21 -0
- package/hi/packages/@intlayer/config/index.md +116 -0
- package/hi/packages/@intlayer/core/index.md +25 -0
- package/hi/packages/@intlayer/design-system/index.md +21 -0
- package/hi/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/hi/packages/@intlayer/editor/index.md +21 -0
- package/hi/packages/@intlayer/editor-react/index.md +21 -0
- package/hi/packages/@intlayer/webpack/index.md +35 -0
- package/hi/packages/angular-intlayer/index.md +3 -0
- package/hi/packages/express-intlayer/index.md +232 -0
- package/hi/packages/express-intlayer/t.md +445 -0
- package/hi/packages/intlayer/getConfiguration.md +120 -0
- package/hi/packages/intlayer/getEnumeration.md +138 -0
- package/hi/packages/intlayer/getHTMLTextDir.md +97 -0
- package/hi/packages/intlayer/getLocaleLang.md +57 -0
- package/hi/packages/intlayer/getLocaleName.md +93 -0
- package/hi/packages/intlayer/getLocalizedUrl.md +221 -0
- package/hi/packages/intlayer/getMultilingualUrls.md +198 -0
- package/hi/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/hi/packages/intlayer/getTranslation.md +175 -0
- package/hi/packages/intlayer/getTranslationContent.md +175 -0
- package/hi/packages/intlayer/index.md +314 -0
- package/hi/packages/intlayer-cli/index.md +41 -0
- package/hi/packages/intlayer-editor/index.md +113 -0
- package/hi/packages/lynx-intlayer/index.md +58 -0
- package/hi/packages/next-intlayer/index.md +270 -0
- package/hi/packages/next-intlayer/t.md +337 -0
- package/hi/packages/next-intlayer/useDictionary.md +248 -0
- package/hi/packages/next-intlayer/useIntlayer.md +237 -0
- package/hi/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/hi/packages/next-intlayer/useLocale.md +105 -0
- package/hi/packages/preact-intlayer/index.md +3 -0
- package/hi/packages/react-intlayer/index.md +261 -0
- package/hi/packages/react-intlayer/t.md +283 -0
- package/hi/packages/react-intlayer/useDictionary.md +268 -0
- package/hi/packages/react-intlayer/useIntlayer.md +225 -0
- package/hi/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/hi/packages/react-intlayer/useLocale.md +184 -0
- package/hi/packages/react-native-intlayer/index.md +57 -0
- package/hi/packages/react-scripts-intlayer/index.md +57 -0
- package/hi/packages/solid-intlayer/index.md +3 -0
- package/hi/packages/svelte-intlayer/index.md +3 -0
- package/hi/packages/vite-intlayer/index.md +53 -0
- package/hi/packages/vue-intlayer/index.md +3 -0
- package/hi/per_locale_file.md +298 -0
- package/hi/privacy_notice.md +61 -0
- package/hi/roadmap.md +206 -0
- package/hi/terms_of_service.md +33 -0
- package/hi/vs_code_extension.md +139 -0
- package/index.cjs +1265 -0
- package/index.d.ts +100 -0
- package/it/CI_CD.md +149 -0
- package/it/autoFill.md +157 -0
- package/it/configuration.md +503 -0
- package/it/dictionary/condition.md +213 -0
- package/it/dictionary/content_extention_customization.md +81 -0
- package/it/dictionary/enumeration.md +221 -0
- package/it/dictionary/file.md +207 -0
- package/it/dictionary/function_fetching.md +190 -0
- package/it/dictionary/get_started.md +466 -0
- package/it/dictionary/insertion.md +161 -0
- package/it/dictionary/markdown.md +343 -0
- package/it/dictionary/nesting.md +249 -0
- package/it/dictionary/translation.md +287 -0
- package/it/header.md +7 -0
- package/it/how_works_intlayer.md +217 -0
- package/it/index.md +125 -0
- package/it/interest_of_intlayer.md +132 -0
- package/it/intlayer_CMS.md +334 -0
- package/it/intlayer_cli.md +274 -0
- package/it/intlayer_visual_editor.md +210 -0
- package/it/intlayer_with_angular.md +3 -0
- package/it/intlayer_with_create_react_app.md +413 -0
- package/it/intlayer_with_express.md +267 -0
- package/it/intlayer_with_lynx+react.md +482 -0
- package/it/intlayer_with_nextjs_14.md +1269 -0
- package/it/intlayer_with_nextjs_15.md +1319 -0
- package/it/intlayer_with_nextjs_page_router.md +1095 -0
- package/it/intlayer_with_react_native+expo.md +261 -0
- package/it/intlayer_with_vite+preact.md +1681 -0
- package/it/intlayer_with_vite+react.md +1580 -0
- package/it/intlayer_with_vite+solid.md +3 -0
- package/it/intlayer_with_vite+svelte.md +3 -0
- package/it/intlayer_with_vite+vue.md +989 -0
- package/it/introduction.md +192 -0
- package/it/mcp_server.md +152 -0
- package/it/packages/@intlayer/api/index.md +31 -0
- package/it/packages/@intlayer/chokidar/index.md +31 -0
- package/it/packages/@intlayer/cli/index.md +21 -0
- package/it/packages/@intlayer/config/index.md +116 -0
- package/it/packages/@intlayer/core/index.md +25 -0
- package/it/packages/@intlayer/design-system/index.md +21 -0
- package/it/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/it/packages/@intlayer/editor/index.md +21 -0
- package/it/packages/@intlayer/editor-react/index.md +21 -0
- package/it/packages/@intlayer/webpack/index.md +35 -0
- package/it/packages/angular-intlayer/index.md +3 -0
- package/it/packages/express-intlayer/index.md +229 -0
- package/it/packages/express-intlayer/t.md +432 -0
- package/it/packages/intlayer/getConfiguration.md +120 -0
- package/it/packages/intlayer/getEnumeration.md +138 -0
- package/it/packages/intlayer/getHTMLTextDir.md +97 -0
- package/it/packages/intlayer/getLocaleLang.md +57 -0
- package/it/packages/intlayer/getLocaleName.md +93 -0
- package/it/packages/intlayer/getLocalizedUrl.md +221 -0
- package/it/packages/intlayer/getMultilingualUrls.md +200 -0
- package/it/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/it/packages/intlayer/getTranslation.md +166 -0
- package/it/packages/intlayer/getTranslationContent.md +166 -0
- package/it/packages/intlayer/index.md +479 -0
- package/it/packages/intlayer-cli/index.md +41 -0
- package/it/packages/intlayer-editor/index.md +113 -0
- package/it/packages/lynx-intlayer/index.md +58 -0
- package/it/packages/next-intlayer/index.md +267 -0
- package/it/packages/next-intlayer/t.md +326 -0
- package/it/packages/next-intlayer/useDictionary.md +242 -0
- package/it/packages/next-intlayer/useIntlayer.md +237 -0
- package/it/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/it/packages/next-intlayer/useLocale.md +105 -0
- package/it/packages/preact-intlayer/index.md +3 -0
- package/it/packages/react-intlayer/index.md +260 -0
- package/it/packages/react-intlayer/t.md +277 -0
- package/it/packages/react-intlayer/useDictionary.md +260 -0
- package/it/packages/react-intlayer/useIntlayer.md +225 -0
- package/it/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/it/packages/react-intlayer/useLocale.md +184 -0
- package/it/packages/react-native-intlayer/index.md +57 -0
- package/it/packages/react-scripts-intlayer/index.md +57 -0
- package/it/packages/solid-intlayer/index.md +5 -0
- package/it/packages/svelte-intlayer/index.md +3 -0
- package/it/packages/vite-intlayer/index.md +53 -0
- package/it/packages/vue-intlayer/index.md +5 -0
- package/it/per_locale_file.md +298 -0
- package/it/privacy_notice.md +61 -0
- package/it/roadmap.md +206 -0
- package/it/terms_of_service.md +33 -0
- package/it/vs_code_extension.md +139 -0
- package/ja/CI_CD.md +149 -0
- package/ja/autoFill.md +157 -0
- package/ja/configuration.md +507 -0
- package/ja/dictionary/condition.md +213 -0
- package/ja/dictionary/content_extention_customization.md +81 -0
- package/ja/dictionary/enumeration.md +221 -0
- package/ja/dictionary/file.md +209 -0
- package/ja/dictionary/function_fetching.md +190 -0
- package/ja/dictionary/get_started.md +466 -0
- package/ja/dictionary/insertion.md +161 -0
- package/ja/dictionary/markdown.md +343 -0
- package/ja/dictionary/nesting.md +249 -0
- package/ja/dictionary/translation.md +287 -0
- package/ja/header.md +7 -0
- package/ja/how_works_intlayer.md +217 -0
- package/ja/index.md +125 -0
- package/ja/interest_of_intlayer.md +132 -0
- package/ja/intlayer_CMS.md +334 -0
- package/ja/intlayer_cli.md +274 -0
- package/ja/intlayer_visual_editor.md +213 -0
- package/ja/intlayer_with_angular.md +3 -0
- package/ja/intlayer_with_create_react_app.md +1186 -0
- package/ja/intlayer_with_express.md +267 -0
- package/ja/intlayer_with_lynx+react.md +482 -0
- package/ja/intlayer_with_nextjs_14.md +1256 -0
- package/ja/intlayer_with_nextjs_15.md +1308 -0
- package/ja/intlayer_with_nextjs_page_router.md +1085 -0
- package/ja/intlayer_with_react_native+expo.md +537 -0
- package/ja/intlayer_with_vite+preact.md +1601 -0
- package/ja/intlayer_with_vite+react.md +1555 -0
- package/ja/intlayer_with_vite+solid.md +3 -0
- package/ja/intlayer_with_vite+svelte.md +3 -0
- package/ja/intlayer_with_vite+vue.md +990 -0
- package/ja/introduction.md +186 -0
- package/ja/mcp_server.md +150 -0
- package/ja/packages/@intlayer/api/index.md +31 -0
- package/ja/packages/@intlayer/chokidar/index.md +31 -0
- package/ja/packages/@intlayer/cli/index.md +21 -0
- package/ja/packages/@intlayer/config/index.md +116 -0
- package/ja/packages/@intlayer/core/index.md +25 -0
- package/ja/packages/@intlayer/design-system/index.md +21 -0
- package/ja/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/ja/packages/@intlayer/editor/index.md +21 -0
- package/ja/packages/@intlayer/editor-react/index.md +21 -0
- package/ja/packages/@intlayer/webpack/index.md +35 -0
- package/ja/packages/angular-intlayer/index.md +3 -0
- package/ja/packages/express-intlayer/index.md +229 -0
- package/ja/packages/express-intlayer/t.md +432 -0
- package/ja/packages/intlayer/getConfiguration.md +120 -0
- package/ja/packages/intlayer/getEnumeration.md +140 -0
- package/ja/packages/intlayer/getHTMLTextDir.md +97 -0
- package/ja/packages/intlayer/getLocaleLang.md +59 -0
- package/ja/packages/intlayer/getLocaleName.md +93 -0
- package/ja/packages/intlayer/getLocalizedUrl.md +221 -0
- package/ja/packages/intlayer/getMultilingualUrls.md +198 -0
- package/ja/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/ja/packages/intlayer/getTranslation.md +166 -0
- package/ja/packages/intlayer/getTranslationContent.md +166 -0
- package/ja/packages/intlayer/index.md +479 -0
- package/ja/packages/intlayer-cli/index.md +41 -0
- package/ja/packages/intlayer-editor/index.md +115 -0
- package/ja/packages/lynx-intlayer/index.md +58 -0
- package/ja/packages/next-intlayer/index.md +263 -0
- package/ja/packages/next-intlayer/t.md +326 -0
- package/ja/packages/next-intlayer/useDictionary.md +242 -0
- package/ja/packages/next-intlayer/useIntlayer.md +237 -0
- package/ja/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/ja/packages/next-intlayer/useLocale.md +105 -0
- package/ja/packages/preact-intlayer/index.md +3 -0
- package/ja/packages/react-intlayer/index.md +257 -0
- package/ja/packages/react-intlayer/t.md +277 -0
- package/ja/packages/react-intlayer/useDictionary.md +260 -0
- package/ja/packages/react-intlayer/useIntlayer.md +225 -0
- package/ja/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/ja/packages/react-intlayer/useLocale.md +184 -0
- package/ja/packages/react-native-intlayer/index.md +57 -0
- package/ja/packages/react-scripts-intlayer/index.md +57 -0
- package/ja/packages/solid-intlayer/index.md +3 -0
- package/ja/packages/svelte-intlayer/index.md +3 -0
- package/ja/packages/vite-intlayer/index.md +53 -0
- package/ja/packages/vue-intlayer/index.md +3 -0
- package/ja/per_locale_file.md +298 -0
- package/ja/privacy_notice.md +57 -0
- package/ja/roadmap.md +206 -0
- package/ja/terms_of_service.md +33 -0
- package/ja/vs_code_extension.md +139 -0
- package/ko/CI_CD.md +149 -0
- package/ko/autoFill.md +157 -0
- package/ko/configuration.md +507 -0
- package/ko/dictionary/condition.md +213 -0
- package/ko/dictionary/content_extention_customization.md +81 -0
- package/ko/dictionary/enumeration.md +221 -0
- package/ko/dictionary/file.md +207 -0
- package/ko/dictionary/function_fetching.md +190 -0
- package/ko/dictionary/get_started.md +466 -0
- package/ko/dictionary/insertion.md +167 -0
- package/ko/dictionary/markdown.md +343 -0
- package/ko/dictionary/nesting.md +249 -0
- package/ko/dictionary/translation.md +287 -0
- package/ko/header.md +7 -0
- package/ko/how_works_intlayer.md +216 -0
- package/ko/index.md +125 -0
- package/ko/interest_of_intlayer.md +132 -0
- package/ko/intlayer_CMS.md +334 -0
- package/ko/intlayer_cli.md +274 -0
- package/ko/intlayer_visual_editor.md +210 -0
- package/ko/intlayer_with_angular.md +3 -0
- package/ko/intlayer_with_create_react_app.md +1186 -0
- package/ko/intlayer_with_express.md +267 -0
- package/ko/intlayer_with_lynx+react.md +482 -0
- package/ko/intlayer_with_nextjs_14.md +1267 -0
- package/ko/intlayer_with_nextjs_15.md +1319 -0
- package/ko/intlayer_with_nextjs_page_router.md +1097 -0
- package/ko/intlayer_with_react_native+expo.md +537 -0
- package/ko/intlayer_with_vite+preact.md +1682 -0
- package/ko/intlayer_with_vite+react.md +1582 -0
- package/ko/intlayer_with_vite+solid.md +3 -0
- package/ko/intlayer_with_vite+svelte.md +3 -0
- package/ko/intlayer_with_vite+vue.md +988 -0
- package/ko/introduction.md +186 -0
- package/ko/mcp_server.md +150 -0
- package/ko/packages/@intlayer/api/index.md +31 -0
- package/ko/packages/@intlayer/chokidar/index.md +31 -0
- package/ko/packages/@intlayer/cli/index.md +21 -0
- package/ko/packages/@intlayer/config/index.md +116 -0
- package/ko/packages/@intlayer/core/index.md +25 -0
- package/ko/packages/@intlayer/design-system/index.md +21 -0
- package/ko/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/ko/packages/@intlayer/editor/index.md +21 -0
- package/ko/packages/@intlayer/editor-react/index.md +21 -0
- package/ko/packages/@intlayer/webpack/index.md +35 -0
- package/ko/packages/angular-intlayer/index.md +5 -0
- package/ko/packages/express-intlayer/index.md +229 -0
- package/ko/packages/express-intlayer/t.md +432 -0
- package/ko/packages/intlayer/getConfiguration.md +120 -0
- package/ko/packages/intlayer/getEnumeration.md +138 -0
- package/ko/packages/intlayer/getHTMLTextDir.md +97 -0
- package/ko/packages/intlayer/getLocaleLang.md +57 -0
- package/ko/packages/intlayer/getLocaleName.md +93 -0
- package/ko/packages/intlayer/getLocalizedUrl.md +221 -0
- package/ko/packages/intlayer/getMultilingualUrls.md +198 -0
- package/ko/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/ko/packages/intlayer/getTranslation.md +166 -0
- package/ko/packages/intlayer/getTranslationContent.md +166 -0
- package/ko/packages/intlayer/index.md +480 -0
- package/ko/packages/intlayer-cli/index.md +41 -0
- package/ko/packages/intlayer-editor/index.md +113 -0
- package/ko/packages/lynx-intlayer/index.md +58 -0
- package/ko/packages/next-intlayer/index.md +267 -0
- package/ko/packages/next-intlayer/t.md +337 -0
- package/ko/packages/next-intlayer/useDictionary.md +242 -0
- package/ko/packages/next-intlayer/useIntlayer.md +237 -0
- package/ko/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/ko/packages/next-intlayer/useLocale.md +105 -0
- package/ko/packages/preact-intlayer/index.md +3 -0
- package/ko/packages/react-intlayer/index.md +260 -0
- package/ko/packages/react-intlayer/t.md +277 -0
- package/ko/packages/react-intlayer/useDictionary.md +268 -0
- package/ko/packages/react-intlayer/useIntlayer.md +225 -0
- package/ko/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/ko/packages/react-intlayer/useLocale.md +184 -0
- package/ko/packages/react-native-intlayer/index.md +57 -0
- package/ko/packages/react-scripts-intlayer/index.md +57 -0
- package/ko/packages/solid-intlayer/index.md +3 -0
- package/ko/packages/svelte-intlayer/index.md +3 -0
- package/ko/packages/vite-intlayer/index.md +53 -0
- package/ko/packages/vue-intlayer/index.md +3 -0
- package/ko/per_locale_file.md +300 -0
- package/ko/privacy_notice.md +61 -0
- package/ko/roadmap.md +206 -0
- package/ko/terms_of_service.md +33 -0
- package/ko/vs_code_extension.md +139 -0
- package/package.json +96 -0
- package/pt/CI_CD.md +149 -0
- package/pt/autoFill.md +157 -0
- package/pt/configuration.md +503 -0
- package/pt/dictionary/condition.md +213 -0
- package/pt/dictionary/content_extention_customization.md +81 -0
- package/pt/dictionary/enumeration.md +221 -0
- package/pt/dictionary/file.md +210 -0
- package/pt/dictionary/function_fetching.md +190 -0
- package/pt/dictionary/get_started.md +490 -0
- package/pt/dictionary/insertion.md +161 -0
- package/pt/dictionary/markdown.md +339 -0
- package/pt/dictionary/nesting.md +249 -0
- package/pt/dictionary/translation.md +322 -0
- package/pt/header.md +7 -0
- package/pt/how_works_intlayer.md +216 -0
- package/pt/index.md +125 -0
- package/pt/interest_of_intlayer.md +132 -0
- package/pt/intlayer_CMS.md +334 -0
- package/pt/intlayer_cli.md +274 -0
- package/pt/intlayer_visual_editor.md +210 -0
- package/pt/intlayer_with_angular.md +3 -0
- package/pt/intlayer_with_create_react_app.md +1204 -0
- package/pt/intlayer_with_express.md +270 -0
- package/pt/intlayer_with_lynx+react.md +467 -0
- package/pt/intlayer_with_nextjs_14.md +1269 -0
- package/pt/intlayer_with_nextjs_15.md +1319 -0
- package/pt/intlayer_with_nextjs_page_router.md +1109 -0
- package/pt/intlayer_with_react_native+expo.md +259 -0
- package/pt/intlayer_with_vite+preact.md +1663 -0
- package/pt/intlayer_with_vite+react.md +1621 -0
- package/pt/intlayer_with_vite+solid.md +3 -0
- package/pt/intlayer_with_vite+svelte.md +3 -0
- package/pt/intlayer_with_vite+vue.md +989 -0
- package/pt/introduction.md +193 -0
- package/pt/mcp_server.md +150 -0
- package/pt/packages/@intlayer/api/index.md +31 -0
- package/pt/packages/@intlayer/chokidar/index.md +31 -0
- package/pt/packages/@intlayer/cli/index.md +21 -0
- package/pt/packages/@intlayer/config/index.md +116 -0
- package/pt/packages/@intlayer/core/index.md +25 -0
- package/pt/packages/@intlayer/design-system/index.md +21 -0
- package/pt/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/pt/packages/@intlayer/editor/index.md +21 -0
- package/pt/packages/@intlayer/editor-react/index.md +21 -0
- package/pt/packages/@intlayer/webpack/index.md +35 -0
- package/pt/packages/angular-intlayer/index.md +3 -0
- package/pt/packages/express-intlayer/index.md +232 -0
- package/pt/packages/express-intlayer/t.md +267 -0
- package/pt/packages/intlayer/getConfiguration.md +120 -0
- package/pt/packages/intlayer/getEnumeration.md +138 -0
- package/pt/packages/intlayer/getHTMLTextDir.md +97 -0
- package/pt/packages/intlayer/getLocaleLang.md +57 -0
- package/pt/packages/intlayer/getLocaleName.md +93 -0
- package/pt/packages/intlayer/getLocalizedUrl.md +221 -0
- package/pt/packages/intlayer/getMultilingualUrls.md +198 -0
- package/pt/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/pt/packages/intlayer/getTranslation.md +175 -0
- package/pt/packages/intlayer/getTranslationContent.md +177 -0
- package/pt/packages/intlayer/index.md +484 -0
- package/pt/packages/intlayer-cli/index.md +41 -0
- package/pt/packages/intlayer-editor/index.md +113 -0
- package/pt/packages/lynx-intlayer/index.md +58 -0
- package/pt/packages/next-intlayer/index.md +270 -0
- package/pt/packages/next-intlayer/t.md +341 -0
- package/pt/packages/next-intlayer/useDictionary.md +248 -0
- package/pt/packages/next-intlayer/useIntlayer.md +237 -0
- package/pt/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/pt/packages/next-intlayer/useLocale.md +105 -0
- package/pt/packages/preact-intlayer/index.md +3 -0
- package/pt/packages/react-intlayer/index.md +261 -0
- package/pt/packages/react-intlayer/t.md +289 -0
- package/pt/packages/react-intlayer/useDictionary.md +268 -0
- package/pt/packages/react-intlayer/useIntlayer.md +225 -0
- package/pt/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/pt/packages/react-intlayer/useLocale.md +184 -0
- package/pt/packages/react-native-intlayer/index.md +57 -0
- package/pt/packages/react-scripts-intlayer/index.md +57 -0
- package/pt/packages/solid-intlayer/index.md +3 -0
- package/pt/packages/svelte-intlayer/index.md +3 -0
- package/pt/packages/vite-intlayer/index.md +53 -0
- package/pt/packages/vue-intlayer/index.md +3 -0
- package/pt/per_locale_file.md +298 -0
- package/pt/privacy_notice.md +61 -0
- package/pt/roadmap.md +206 -0
- package/pt/terms_of_service.md +33 -0
- package/pt/vs_code_extension.md +139 -0
- package/ru/CI_CD.md +149 -0
- package/ru/autoFill.md +157 -0
- package/ru/configuration.md +507 -0
- package/ru/dictionary/condition.md +213 -0
- package/ru/dictionary/content_extention_customization.md +81 -0
- package/ru/dictionary/enumeration.md +221 -0
- package/ru/dictionary/file.md +209 -0
- package/ru/dictionary/function_fetching.md +188 -0
- package/ru/dictionary/get_started.md +311 -0
- package/ru/dictionary/insertion.md +161 -0
- package/ru/dictionary/markdown.md +339 -0
- package/ru/dictionary/nesting.md +249 -0
- package/ru/dictionary/translation.md +322 -0
- package/ru/environment/angular.md +3 -0
- package/ru/header.md +7 -0
- package/ru/how_works_intlayer.md +217 -0
- package/ru/index.md +125 -0
- package/ru/interest_of_intlayer.md +132 -0
- package/ru/intlayer_CMS.md +334 -0
- package/ru/intlayer_cli.md +274 -0
- package/ru/intlayer_visual_editor.md +210 -0
- package/ru/intlayer_with_angular.md +3 -0
- package/ru/intlayer_with_create_react_app.md +1196 -0
- package/ru/intlayer_with_express.md +273 -0
- package/ru/intlayer_with_lynx+react.md +482 -0
- package/ru/intlayer_with_nextjs_14.md +1274 -0
- package/ru/intlayer_with_nextjs_15.md +1318 -0
- package/ru/intlayer_with_nextjs_page_router.md +1100 -0
- package/ru/intlayer_with_react_native+expo.md +537 -0
- package/ru/intlayer_with_vite+preact.md +1663 -0
- package/ru/intlayer_with_vite+react.md +1546 -0
- package/ru/intlayer_with_vite+solid.md +3 -0
- package/ru/intlayer_with_vite+svelte.md +3 -0
- package/ru/intlayer_with_vite+vue.md +987 -0
- package/ru/introduction.md +190 -0
- package/ru/mcp_server.md +152 -0
- package/ru/packages/@intlayer/api/index.md +31 -0
- package/ru/packages/@intlayer/chokidar/index.md +31 -0
- package/ru/packages/@intlayer/cli/index.md +23 -0
- package/ru/packages/@intlayer/config/index.md +116 -0
- package/ru/packages/@intlayer/core/index.md +25 -0
- package/ru/packages/@intlayer/design-system/index.md +21 -0
- package/ru/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/ru/packages/@intlayer/editor/index.md +21 -0
- package/ru/packages/@intlayer/editor-react/index.md +21 -0
- package/ru/packages/@intlayer/webpack/index.md +35 -0
- package/ru/packages/angular-intlayer/index.md +3 -0
- package/ru/packages/express-intlayer/index.md +235 -0
- package/ru/packages/express-intlayer/t.md +445 -0
- package/ru/packages/intlayer/getConfiguration.md +120 -0
- package/ru/packages/intlayer/getEnumeration.md +140 -0
- package/ru/packages/intlayer/getHTMLTextDir.md +97 -0
- package/ru/packages/intlayer/getLocaleLang.md +59 -0
- package/ru/packages/intlayer/getLocaleName.md +93 -0
- package/ru/packages/intlayer/getLocalizedUrl.md +221 -0
- package/ru/packages/intlayer/getMultilingualUrls.md +198 -0
- package/ru/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/ru/packages/intlayer/getTranslation.md +177 -0
- package/ru/packages/intlayer/getTranslationContent.md +175 -0
- package/ru/packages/intlayer/index.md +275 -0
- package/ru/packages/intlayer-cli/index.md +41 -0
- package/ru/packages/intlayer-editor/index.md +115 -0
- package/ru/packages/lynx-intlayer/index.md +58 -0
- package/ru/packages/next-intlayer/index.md +267 -0
- package/ru/packages/next-intlayer/t.md +340 -0
- package/ru/packages/next-intlayer/useDictionary.md +248 -0
- package/ru/packages/next-intlayer/useIntlayer.md +237 -0
- package/ru/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/ru/packages/next-intlayer/useLocale.md +105 -0
- package/ru/packages/preact-intlayer/index.md +3 -0
- package/ru/packages/react-intlayer/index.md +261 -0
- package/ru/packages/react-intlayer/t.md +289 -0
- package/ru/packages/react-intlayer/useDictionary.md +268 -0
- package/ru/packages/react-intlayer/useIntlayer.md +225 -0
- package/ru/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/ru/packages/react-intlayer/useLocale.md +184 -0
- package/ru/packages/react-native-intlayer/index.md +57 -0
- package/ru/packages/react-scripts-intlayer/index.md +57 -0
- package/ru/packages/solid-intlayer/index.md +3 -0
- package/ru/packages/svelte-intlayer/index.md +3 -0
- package/ru/packages/vite-intlayer/index.md +53 -0
- package/ru/packages/vue-intlayer/index.md +3 -0
- package/ru/per_locale_file.md +298 -0
- package/ru/privacy_notice.md +61 -0
- package/ru/roadmap.md +206 -0
- package/ru/terms_of_service.md +33 -0
- package/ru/vs_code_extension.md +139 -0
- package/zh/CI_CD.md +149 -0
- package/zh/autoFill.md +157 -0
- package/zh/configuration.md +484 -0
- package/zh/dictionary/condition.md +213 -0
- package/zh/dictionary/content_extention_customization.md +81 -0
- package/zh/dictionary/enumeration.md +221 -0
- package/zh/dictionary/file.md +209 -0
- package/zh/dictionary/function_fetching.md +188 -0
- package/zh/dictionary/get_started.md +490 -0
- package/zh/dictionary/insertion.md +161 -0
- package/zh/dictionary/markdown.md +342 -0
- package/zh/dictionary/nesting.md +249 -0
- package/zh/dictionary/translation.md +287 -0
- package/zh/header.md +7 -0
- package/zh/how_works_intlayer.md +217 -0
- package/zh/index.md +125 -0
- package/zh/interest_of_intlayer.md +132 -0
- package/zh/intlayer_CMS.md +334 -0
- package/zh/intlayer_cli.md +274 -0
- package/zh/intlayer_visual_editor.md +210 -0
- package/zh/intlayer_with_angular.md +3 -0
- package/zh/intlayer_with_create_react_app.md +1196 -0
- package/zh/intlayer_with_express.md +267 -0
- package/zh/intlayer_with_lynx+react.md +484 -0
- package/zh/intlayer_with_nextjs_14.md +1286 -0
- package/zh/intlayer_with_nextjs_15.md +1322 -0
- package/zh/intlayer_with_nextjs_page_router.md +1097 -0
- package/zh/intlayer_with_react_native+expo.md +539 -0
- package/zh/intlayer_with_vite+preact.md +1681 -0
- package/zh/intlayer_with_vite+react.md +1577 -0
- package/zh/intlayer_with_vite+solid.md +3 -0
- package/zh/intlayer_with_vite+svelte.md +3 -0
- package/zh/intlayer_with_vite+vue.md +988 -0
- package/zh/introduction.md +186 -0
- package/zh/mcp_server.md +152 -0
- package/zh/packages/@intlayer/api/index.md +31 -0
- package/zh/packages/@intlayer/chokidar/index.md +31 -0
- package/zh/packages/@intlayer/cli/index.md +21 -0
- package/zh/packages/@intlayer/config/index.md +116 -0
- package/zh/packages/@intlayer/core/index.md +25 -0
- package/zh/packages/@intlayer/design-system/index.md +21 -0
- package/zh/packages/@intlayer/dictionary-entry/index.md +21 -0
- package/zh/packages/@intlayer/editor/index.md +21 -0
- package/zh/packages/@intlayer/editor-react/index.md +21 -0
- package/zh/packages/@intlayer/webpack/index.md +35 -0
- package/zh/packages/angular-intlayer/index.md +3 -0
- package/zh/packages/express-intlayer/index.md +229 -0
- package/zh/packages/express-intlayer/t.md +432 -0
- package/zh/packages/intlayer/getConfiguration.md +120 -0
- package/zh/packages/intlayer/getEnumeration.md +140 -0
- package/zh/packages/intlayer/getHTMLTextDir.md +97 -0
- package/zh/packages/intlayer/getLocaleLang.md +57 -0
- package/zh/packages/intlayer/getLocaleName.md +93 -0
- package/zh/packages/intlayer/getLocalizedUrl.md +221 -0
- package/zh/packages/intlayer/getMultilingualUrls.md +198 -0
- package/zh/packages/intlayer/getPathWithoutLocale.md +50 -0
- package/zh/packages/intlayer/getTranslation.md +166 -0
- package/zh/packages/intlayer/getTranslationContent.md +166 -0
- package/zh/packages/intlayer/index.md +360 -0
- package/zh/packages/intlayer-cli/index.md +41 -0
- package/zh/packages/intlayer-editor/index.md +113 -0
- package/zh/packages/lynx-intlayer/index.md +60 -0
- package/zh/packages/next-intlayer/index.md +267 -0
- package/zh/packages/next-intlayer/t.md +338 -0
- package/zh/packages/next-intlayer/useDictionary.md +242 -0
- package/zh/packages/next-intlayer/useIntlayer.md +237 -0
- package/zh/packages/next-intlayer/useIntlayerAsync.md +211 -0
- package/zh/packages/next-intlayer/useLocale.md +105 -0
- package/zh/packages/preact-intlayer/index.md +3 -0
- package/zh/packages/react-intlayer/index.md +257 -0
- package/zh/packages/react-intlayer/t.md +271 -0
- package/zh/packages/react-intlayer/useDictionary.md +260 -0
- package/zh/packages/react-intlayer/useIntlayer.md +225 -0
- package/zh/packages/react-intlayer/useIntlayerAsync.md +226 -0
- package/zh/packages/react-intlayer/useLocale.md +184 -0
- package/zh/packages/react-native-intlayer/index.md +57 -0
- package/zh/packages/react-scripts-intlayer/index.md +57 -0
- package/zh/packages/solid-intlayer/index.md +3 -0
- package/zh/packages/svelte-intlayer/index.md +3 -0
- package/zh/packages/vite-intlayer/index.md +53 -0
- package/zh/packages/vue-intlayer/index.md +3 -0
- package/zh/per_locale_file.md +298 -0
- package/zh/privacy_notice.md +61 -0
- package/zh/roadmap.md +206 -0
- package/zh/terms_of_service.md +33 -0
- package/zh/vs_code_extension.md +139 -0
|
@@ -0,0 +1,1701 @@
|
|
|
1
|
+
# Erste Schritte mit der Internationalisierung (i18n) mit Intlayer, Vite und Preact
|
|
2
|
+
|
|
3
|
+
> Dieses Paket befindet sich in der Entwicklung. Siehe das [Issue](https://github.com/aymericzip/intlayer/issues/118) für weitere Informationen. Zeigen Sie Ihr Interesse an Intlayer für Preact, indem Sie das Issue liken.
|
|
4
|
+
|
|
5
|
+
Siehe [Anwendungsvorlage](https://github.com/aymericzip/intlayer-vite-preact-template) auf GitHub.
|
|
6
|
+
|
|
7
|
+
## Was ist Intlayer?
|
|
8
|
+
|
|
9
|
+
**Intlayer** ist eine innovative, Open-Source-Internationalisierungsbibliothek (i18n), die entwickelt wurde, um die Unterstützung mehrerer Sprachen in modernen Webanwendungen zu vereinfachen.
|
|
10
|
+
|
|
11
|
+
Mit Intlayer können Sie:
|
|
12
|
+
|
|
13
|
+
- **Übersetzungen einfach verwalten** mit deklarativen Wörterbüchern auf Komponentenebene.
|
|
14
|
+
- **Metadaten, Routen und Inhalte dynamisch lokalisieren**.
|
|
15
|
+
- **TypeScript-Unterstützung sicherstellen** mit automatisch generierten Typen, die die Autovervollständigung und Fehlererkennung verbessern.
|
|
16
|
+
- **Von erweiterten Funktionen profitieren**, wie dynamische Spracherkennung und -umschaltung.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Schritt-für-Schritt-Anleitung zur Einrichtung von Intlayer in einer Vite- und Preact-Anwendung
|
|
21
|
+
|
|
22
|
+
### Schritt 1: Abhängigkeiten installieren
|
|
23
|
+
|
|
24
|
+
Installieren Sie die erforderlichen Pakete mit npm:
|
|
25
|
+
|
|
26
|
+
```bash packageManager="npm"
|
|
27
|
+
npm install intlayer preact-intlayer vite-intlayer
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```bash packageManager="pnpm"
|
|
31
|
+
pnpm add intlayer preact-intlayer vite-intlayer
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
```bash packageManager="yarn"
|
|
35
|
+
yarn add intlayer preact-intlayer vite-intlayer
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
- **intlayer**
|
|
39
|
+
|
|
40
|
+
Das Kernpaket, das Internationalisierungswerkzeuge für Konfigurationsmanagement, Übersetzung, [Inhaltsdeklaration](https://github.com/aymericzip/intlayer/blob/main/docs/de/dictionary/get_started.md), Transpilation und [CLI-Befehle](https://github.com/aymericzip/intlayer/blob/main/docs/de/intlayer_cli.md) bereitstellt.
|
|
41
|
+
|
|
42
|
+
- **preact-intlayer**
|
|
43
|
+
Das Paket, das Intlayer mit Preact-Anwendungen integriert. Es bietet Kontextanbieter und Hooks für die Internationalisierung in Preact.
|
|
44
|
+
|
|
45
|
+
- **vite-intlayer**
|
|
46
|
+
Beinhaltet 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 URL-Weiterleitung.
|
|
47
|
+
|
|
48
|
+
### Schritt 2: Konfiguration Ihres Projekts
|
|
49
|
+
|
|
50
|
+
Erstellen Sie eine Konfigurationsdatei, um die Sprachen Ihrer Anwendung zu konfigurieren:
|
|
51
|
+
|
|
52
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
53
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
54
|
+
|
|
55
|
+
const config: IntlayerConfig = {
|
|
56
|
+
internationalization: {
|
|
57
|
+
locales: [
|
|
58
|
+
Locales.ENGLISH,
|
|
59
|
+
Locales.FRENCH,
|
|
60
|
+
Locales.SPANISH,
|
|
61
|
+
// Ihre weiteren Sprachen
|
|
62
|
+
],
|
|
63
|
+
defaultLocale: Locales.ENGLISH,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export default config;
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
71
|
+
import { Locales } from "intlayer";
|
|
72
|
+
|
|
73
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
74
|
+
const config = {
|
|
75
|
+
internationalization: {
|
|
76
|
+
locales: [
|
|
77
|
+
Locales.ENGLISH,
|
|
78
|
+
Locales.FRENCH,
|
|
79
|
+
Locales.SPANISH,
|
|
80
|
+
// Ihre weiteren Sprachen
|
|
81
|
+
],
|
|
82
|
+
defaultLocale: Locales.ENGLISH,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export default config;
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
90
|
+
const { Locales } = require("intlayer");
|
|
91
|
+
|
|
92
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
93
|
+
const config = {
|
|
94
|
+
internationalization: {
|
|
95
|
+
locales: [
|
|
96
|
+
Locales.ENGLISH,
|
|
97
|
+
Locales.FRENCH,
|
|
98
|
+
Locales.SPANISH,
|
|
99
|
+
// Ihre weiteren Sprachen
|
|
100
|
+
],
|
|
101
|
+
defaultLocale: Locales.ENGLISH,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
module.exports = config;
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
> Über diese Konfigurationsdatei können Sie lokalisierte URLs, Middleware-Weiterleitungen, Cookienamen, den Speicherort und die Erweiterung Ihrer Inhaltsdeklarationen einrichten, Intlayer-Logs in der Konsole deaktivieren und mehr. Für eine vollständige Liste der verfügbaren Parameter lesen Sie die [Konfigurationsdokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/de/configuration.md).
|
|
109
|
+
|
|
110
|
+
### Schritt 3: Intlayer in Ihre Vite-Konfiguration integrieren
|
|
111
|
+
|
|
112
|
+
Fügen Sie das Intlayer-Plugin in Ihre Konfiguration ein.
|
|
113
|
+
|
|
114
|
+
```typescript fileName="vite.config.ts" codeFormat="typescript"
|
|
115
|
+
import { defineConfig } from "vite";
|
|
116
|
+
import preact from "@preact/preset-vite";
|
|
117
|
+
import { intlayerPlugin } from "vite-intlayer";
|
|
118
|
+
|
|
119
|
+
// https://vitejs.dev/config/
|
|
120
|
+
export default defineConfig({
|
|
121
|
+
plugins: [preact(), intlayerPlugin()],
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
```javascript fileName="vite.config.mjs" codeFormat="esm"
|
|
126
|
+
import { defineConfig } from "vite";
|
|
127
|
+
import preact from "@preact/preset-vite";
|
|
128
|
+
import { intlayerPlugin } from "vite-intlayer";
|
|
129
|
+
|
|
130
|
+
// https://vitejs.dev/config/
|
|
131
|
+
export default defineConfig({
|
|
132
|
+
plugins: [preact(), intlayerPlugin()],
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```javascript fileName="vite.config.cjs" codeFormat="commonjs"
|
|
137
|
+
const { defineConfig } = require("vite");
|
|
138
|
+
const preact = require("@preact/preset-vite");
|
|
139
|
+
const { intlayerPlugin } = require("vite-intlayer");
|
|
140
|
+
|
|
141
|
+
// https://vitejs.dev/config/
|
|
142
|
+
module.exports = defineConfig({
|
|
143
|
+
plugins: [preact(), intlayerPlugin()],
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
> 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.
|
|
148
|
+
|
|
149
|
+
### Schritt 4: Ihren Inhalt deklarieren
|
|
150
|
+
|
|
151
|
+
Erstellen und verwalten Sie Ihre Inhaltsdeklarationen, um Übersetzungen zu speichern:
|
|
152
|
+
|
|
153
|
+
```tsx fileName="src/app.content.tsx" contentDeclarationFormat="typescript"
|
|
154
|
+
import { t, type Dictionary } from "intlayer";
|
|
155
|
+
import type { ComponentChildren } from "preact";
|
|
156
|
+
|
|
157
|
+
const appContent = {
|
|
158
|
+
key: "app",
|
|
159
|
+
content: {
|
|
160
|
+
viteLogo: t({
|
|
161
|
+
de: "Vite-Logo",
|
|
162
|
+
en: "Vite logo",
|
|
163
|
+
fr: "Logo Vite",
|
|
164
|
+
es: "Logo Vite",
|
|
165
|
+
}),
|
|
166
|
+
preactLogo: t({
|
|
167
|
+
de: "Preact-Logo",
|
|
168
|
+
en: "Preact logo",
|
|
169
|
+
fr: "Logo Preact",
|
|
170
|
+
es: "Logo Preact",
|
|
171
|
+
}),
|
|
172
|
+
|
|
173
|
+
title: "Vite + Preact",
|
|
174
|
+
|
|
175
|
+
count: t({
|
|
176
|
+
de: "Anzahl ist ",
|
|
177
|
+
en: "count is ",
|
|
178
|
+
fr: "le compte est ",
|
|
179
|
+
es: "el recuento es ",
|
|
180
|
+
}),
|
|
181
|
+
|
|
182
|
+
edit: t<ComponentChildren>({
|
|
183
|
+
de: (
|
|
184
|
+
<>
|
|
185
|
+
Bearbeiten Sie <code>src/app.tsx</code> und speichern Sie, um HMR zu
|
|
186
|
+
testen
|
|
187
|
+
</>
|
|
188
|
+
),
|
|
189
|
+
en: (
|
|
190
|
+
<>
|
|
191
|
+
Edit <code>src/app.tsx</code> and save to test HMR
|
|
192
|
+
</>
|
|
193
|
+
),
|
|
194
|
+
fr: (
|
|
195
|
+
<>
|
|
196
|
+
Éditez <code>src/app.tsx</code> et enregistrez pour tester HMR
|
|
197
|
+
</>
|
|
198
|
+
),
|
|
199
|
+
es: (
|
|
200
|
+
<>
|
|
201
|
+
Edita <code>src/app.tsx</code> y guarda para probar HMR
|
|
202
|
+
</>
|
|
203
|
+
),
|
|
204
|
+
}),
|
|
205
|
+
|
|
206
|
+
readTheDocs: t({
|
|
207
|
+
de: "Klicken Sie auf die Vite- und Preact-Logos, um mehr zu erfahren",
|
|
208
|
+
en: "Click on the Vite and Preact logos to learn more",
|
|
209
|
+
fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
|
|
210
|
+
es: "Haga clic en los logotipos de Vite y Preact para obtener más información",
|
|
211
|
+
}),
|
|
212
|
+
},
|
|
213
|
+
} satisfies Dictionary;
|
|
214
|
+
|
|
215
|
+
export default appContent;
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
```javascript fileName="src/app.content.mjs" contentDeclarationFormat="esm"
|
|
219
|
+
import { t } from "intlayer";
|
|
220
|
+
// import { h } from 'preact'; // Erforderlich, wenn Sie JSX direkt in .mjs verwenden
|
|
221
|
+
|
|
222
|
+
/** @type {import('intlayer').Dictionary} */
|
|
223
|
+
const appContent = {
|
|
224
|
+
key: "app",
|
|
225
|
+
content: {
|
|
226
|
+
viteLogo: t({
|
|
227
|
+
de: "Vite-Logo",
|
|
228
|
+
en: "Vite logo",
|
|
229
|
+
fr: "Logo Vite",
|
|
230
|
+
es: "Logo Vite",
|
|
231
|
+
}),
|
|
232
|
+
preactLogo: t({
|
|
233
|
+
de: "Preact-Logo",
|
|
234
|
+
en: "Preact logo",
|
|
235
|
+
fr: "Logo Preact",
|
|
236
|
+
es: "Logo Preact",
|
|
237
|
+
}),
|
|
238
|
+
|
|
239
|
+
title: "Vite + Preact",
|
|
240
|
+
|
|
241
|
+
count: t({
|
|
242
|
+
de: "Anzahl ist ",
|
|
243
|
+
en: "count is ",
|
|
244
|
+
fr: "le compte est ",
|
|
245
|
+
es: "el recuento es ",
|
|
246
|
+
}),
|
|
247
|
+
|
|
248
|
+
edit: t({
|
|
249
|
+
de: "Bearbeiten Sie src/app.jsx und speichern Sie, um HMR zu testen",
|
|
250
|
+
en: "Edit src/app.jsx and save to test HMR",
|
|
251
|
+
fr: "Éditez src/app.jsx et enregistrez pour tester HMR",
|
|
252
|
+
es: "Edita src/app.jsx y guarda para probar HMR",
|
|
253
|
+
}),
|
|
254
|
+
|
|
255
|
+
readTheDocs: t({
|
|
256
|
+
de: "Klicken Sie auf die Vite- und Preact-Logos, um mehr zu erfahren",
|
|
257
|
+
en: "Click on the Vite and Preact logos to learn more",
|
|
258
|
+
fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
|
|
259
|
+
es: "Haga clic en los logotipos de Vite y Preact para obtener más información",
|
|
260
|
+
}),
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
export default appContent;
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
```javascript fileName="src/app.content.cjs" contentDeclarationFormat="commonjs"
|
|
268
|
+
const { t } = require("intlayer");
|
|
269
|
+
// const { h } = require('preact'); // Erforderlich, wenn Sie JSX direkt in .cjs verwenden
|
|
270
|
+
|
|
271
|
+
/** @type {import('intlayer').Dictionary} */
|
|
272
|
+
const appContent = {
|
|
273
|
+
key: "app",
|
|
274
|
+
content: {
|
|
275
|
+
viteLogo: t({
|
|
276
|
+
de: "Vite-Logo",
|
|
277
|
+
en: "Vite logo",
|
|
278
|
+
fr: "Logo Vite",
|
|
279
|
+
es: "Logo Vite",
|
|
280
|
+
}),
|
|
281
|
+
preactLogo: t({
|
|
282
|
+
de: "Preact-Logo",
|
|
283
|
+
en: "Preact logo",
|
|
284
|
+
fr: "Logo Preact",
|
|
285
|
+
es: "Logo Preact",
|
|
286
|
+
}),
|
|
287
|
+
|
|
288
|
+
title: "Vite + Preact",
|
|
289
|
+
|
|
290
|
+
count: t({
|
|
291
|
+
de: "Anzahl ist ",
|
|
292
|
+
en: "count is ",
|
|
293
|
+
fr: "le compte est ",
|
|
294
|
+
es: "el recuento es ",
|
|
295
|
+
}),
|
|
296
|
+
|
|
297
|
+
edit: t({
|
|
298
|
+
de: "Bearbeiten Sie src/app.tsx und speichern Sie, um HMR zu testen",
|
|
299
|
+
en: "Edit src/app.tsx and save to test HMR",
|
|
300
|
+
fr: "Éditez src/app.tsx et enregistrez pour tester HMR",
|
|
301
|
+
es: "Edita src/app.tsx y guarda para probar HMR",
|
|
302
|
+
}),
|
|
303
|
+
|
|
304
|
+
readTheDocs: t({
|
|
305
|
+
de: "Klicken Sie auf die Logos von Vite und Preact, um mehr zu erfahren",
|
|
306
|
+
en: "Click on the Vite and Preact logos to learn more",
|
|
307
|
+
fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
|
|
308
|
+
es: "Haga clic en los logotipos de Vite y Preact para obtener más información",
|
|
309
|
+
}),
|
|
310
|
+
},
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
module.exports = appContent;
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
```json fileName="src/app.content.json" contentDeclarationFormat="json"
|
|
317
|
+
{
|
|
318
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
319
|
+
"key": "app",
|
|
320
|
+
"content": {
|
|
321
|
+
"viteLogo": {
|
|
322
|
+
"nodeType": "translation",
|
|
323
|
+
"translation": {
|
|
324
|
+
"de": "Vite-Logo",
|
|
325
|
+
"en": "Vite logo",
|
|
326
|
+
"fr": "Logo Vite",
|
|
327
|
+
"es": "Logo Vite"
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"preactLogo": {
|
|
331
|
+
"nodeType": "translation",
|
|
332
|
+
"translation": {
|
|
333
|
+
"de": "Preact-Logo",
|
|
334
|
+
"en": "Preact logo",
|
|
335
|
+
"fr": "Logo Preact",
|
|
336
|
+
"es": "Logo Preact"
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
"title": {
|
|
340
|
+
"nodeType": "translation",
|
|
341
|
+
"translation": {
|
|
342
|
+
"de": "Vite + Preact",
|
|
343
|
+
"en": "Vite + Preact",
|
|
344
|
+
"fr": "Vite + Preact",
|
|
345
|
+
"es": "Vite + Preact"
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
"count": {
|
|
349
|
+
"nodeType": "translation",
|
|
350
|
+
"translation": {
|
|
351
|
+
"de": "Anzahl ist ",
|
|
352
|
+
"en": "count is ",
|
|
353
|
+
"fr": "le compte est ",
|
|
354
|
+
"es": "el recuento es "
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
"edit": {
|
|
358
|
+
"nodeType": "translation",
|
|
359
|
+
"translation": {
|
|
360
|
+
"de": "Bearbeiten Sie src/app.tsx und speichern Sie, um HMR zu testen",
|
|
361
|
+
"en": "Edit src/app.tsx and save to test HMR",
|
|
362
|
+
"fr": "Éditez src/app.tsx et enregistrez pour tester HMR",
|
|
363
|
+
"es": "Edita src/app.tsx y guarda para probar HMR"
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
"readTheDocs": {
|
|
367
|
+
"nodeType": "translation",
|
|
368
|
+
"translation": {
|
|
369
|
+
"de": "Klicken Sie auf die Logos von Vite und Preact, um mehr zu erfahren",
|
|
370
|
+
"en": "Click on the Vite and Preact logos to learn more",
|
|
371
|
+
"fr": "Cliquez sur les logos Vite et Preact pour en savoir plus",
|
|
372
|
+
"es": "Haga clic en los logotipos de Vite y Preact para obtener más información"
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
> Ihre Inhaltsdeklarationen können überall in Ihrer Anwendung definiert werden, solange sie im `contentDir`-Verzeichnis (standardmäßig `./src`) enthalten sind. Und die Dateierweiterung der Inhaltsdeklaration übereinstimmt (standardmäßig `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
|
|
380
|
+
|
|
381
|
+
> Weitere Details finden Sie in der [Dokumentation zur Inhaltsdeklaration](https://github.com/aymericzip/intlayer/blob/main/docs/de/dictionary/get_started.md).
|
|
382
|
+
|
|
383
|
+
> Wenn Ihre Inhaltsdatei TSX-Code enthält, müssen Sie möglicherweise `import { h } from "preact";` importieren oder sicherstellen, dass Ihr JSX-Pragma korrekt für Preact eingestellt ist.
|
|
384
|
+
|
|
385
|
+
### Schritt 5: Verwenden Sie Intlayer in Ihrem Code
|
|
386
|
+
|
|
387
|
+
Greifen Sie in Ihrer gesamten Anwendung auf Ihre Inhaltswörterbücher zu:
|
|
388
|
+
|
|
389
|
+
```tsx {6,10} fileName="src/app.tsx" codeFormat="typescript"
|
|
390
|
+
import { useState } from "preact/hooks";
|
|
391
|
+
import type { FunctionalComponent } from "preact";
|
|
392
|
+
import preactLogo from "./assets/preact.svg"; // Angenommen, Sie haben eine preact.svg
|
|
393
|
+
import viteLogo from "/vite.svg";
|
|
394
|
+
import "./app.css"; // Angenommen, Ihre CSS-Datei heißt app.css
|
|
395
|
+
import { IntlayerProvider, useIntlayer } from "preact-intlayer";
|
|
396
|
+
|
|
397
|
+
const AppContent: FunctionalComponent = () => {
|
|
398
|
+
const [count, setCount] = useState(0);
|
|
399
|
+
const content = useIntlayer("app");
|
|
400
|
+
|
|
401
|
+
return (
|
|
402
|
+
<>
|
|
403
|
+
<div>
|
|
404
|
+
<a href="https://vitejs.dev" target="_blank">
|
|
405
|
+
<img src={viteLogo} class="logo" alt={content.viteLogo.value} />
|
|
406
|
+
</a>
|
|
407
|
+
<a href="https://preactjs.com" target="_blank">
|
|
408
|
+
<img
|
|
409
|
+
src={preactLogo}
|
|
410
|
+
class="logo preact"
|
|
411
|
+
alt={content.preactLogo.value}
|
|
412
|
+
/>
|
|
413
|
+
</a>
|
|
414
|
+
</div>
|
|
415
|
+
<h1>{content.title}</h1>
|
|
416
|
+
<div class="card">
|
|
417
|
+
<button onClick={() => setCount((count) => count + 1)}>
|
|
418
|
+
{content.count}
|
|
419
|
+
{count}
|
|
420
|
+
</button>
|
|
421
|
+
<p>{content.edit}</p>
|
|
422
|
+
</div>
|
|
423
|
+
<p class="read-the-docs">{content.readTheDocs}</p>
|
|
424
|
+
</>
|
|
425
|
+
);
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
const App: FunctionalComponent = () => (
|
|
429
|
+
<IntlayerProvider>
|
|
430
|
+
<AppContent />
|
|
431
|
+
</IntlayerProvider>
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
export default App;
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
```jsx {5,9} fileName="src/app.jsx" codeFormat="esm"
|
|
438
|
+
import { useState } from "preact/hooks";
|
|
439
|
+
import preactLogo from "./assets/preact.svg";
|
|
440
|
+
import viteLogo from "/vite.svg";
|
|
441
|
+
import "./app.css";
|
|
442
|
+
import { IntlayerProvider, useIntlayer } from "preact-intlayer";
|
|
443
|
+
|
|
444
|
+
const AppContent = () => {
|
|
445
|
+
const [count, setCount] = useState(0);
|
|
446
|
+
const content = useIntlayer("app");
|
|
447
|
+
|
|
448
|
+
return (
|
|
449
|
+
<>
|
|
450
|
+
<div>
|
|
451
|
+
<a href="https://vitejs.dev" target="_blank">
|
|
452
|
+
<img src={viteLogo} class="logo" alt={content.viteLogo.value} />
|
|
453
|
+
</a>
|
|
454
|
+
<a href="https://preactjs.com" target="_blank">
|
|
455
|
+
<img
|
|
456
|
+
src={preactLogo}
|
|
457
|
+
class="logo preact"
|
|
458
|
+
alt={content.preactLogo.value}
|
|
459
|
+
/>
|
|
460
|
+
</a>
|
|
461
|
+
</div>
|
|
462
|
+
<h1>{content.title}</h1>
|
|
463
|
+
<div class="card">
|
|
464
|
+
<button onClick={() => setCount((count) => count + 1)}>
|
|
465
|
+
{content.count}
|
|
466
|
+
{count}
|
|
467
|
+
</button>
|
|
468
|
+
<p>{content.edit}</p>
|
|
469
|
+
</div>
|
|
470
|
+
<p class="read-the-docs">{content.readTheDocs}</p>
|
|
471
|
+
</>
|
|
472
|
+
);
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
const App = () => (
|
|
476
|
+
<IntlayerProvider>
|
|
477
|
+
<AppContent />
|
|
478
|
+
</IntlayerProvider>
|
|
479
|
+
);
|
|
480
|
+
|
|
481
|
+
export default App;
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
```jsx {5,9} fileName="src/app.cjsx" codeFormat="commonjs"
|
|
485
|
+
const { useState } = require("preact/hooks");
|
|
486
|
+
const preactLogo = require("./assets/preact.svg");
|
|
487
|
+
const viteLogo = require("/vite.svg");
|
|
488
|
+
require("./app.css");
|
|
489
|
+
const { IntlayerProvider, useIntlayer } = require("preact-intlayer");
|
|
490
|
+
|
|
491
|
+
const AppContent = () => {
|
|
492
|
+
const [count, setCount] = useState(0);
|
|
493
|
+
const content = useIntlayer("app");
|
|
494
|
+
|
|
495
|
+
return (
|
|
496
|
+
<>
|
|
497
|
+
<div>
|
|
498
|
+
<a href="https://vitejs.dev" target="_blank">
|
|
499
|
+
<img src={viteLogo} class="logo" alt={content.viteLogo.value} />
|
|
500
|
+
</a>
|
|
501
|
+
<a href="https://preactjs.com" target="_blank">
|
|
502
|
+
<img
|
|
503
|
+
src={preactLogo}
|
|
504
|
+
class="logo preact"
|
|
505
|
+
alt={content.preactLogo.value}
|
|
506
|
+
/>
|
|
507
|
+
</a>
|
|
508
|
+
</div>
|
|
509
|
+
<h1>{content.title}</h1>
|
|
510
|
+
<div class="card">
|
|
511
|
+
<button onClick={() => setCount((count) => count + 1)}>
|
|
512
|
+
{content.count}
|
|
513
|
+
{count}
|
|
514
|
+
</button>
|
|
515
|
+
<p>{content.edit}</p>
|
|
516
|
+
</div>
|
|
517
|
+
<p class="read-the-docs">{content.readTheDocs}</p>
|
|
518
|
+
</>
|
|
519
|
+
);
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
const App = () => (
|
|
523
|
+
<IntlayerProvider>
|
|
524
|
+
<AppContent />
|
|
525
|
+
</IntlayerProvider>
|
|
526
|
+
);
|
|
527
|
+
|
|
528
|
+
module.exports = App;
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
> Wenn Sie Ihren Inhalt in einem `string`-Attribut wie `alt`, `title`, `href`, `aria-label` usw. verwenden möchten, müssen Sie den Wert der Funktion aufrufen, wie:
|
|
532
|
+
|
|
533
|
+
> ```jsx
|
|
534
|
+
>
|
|
535
|
+
> ```
|
|
536
|
+
|
|
537
|
+
> <img src={content.image.src.value} alt={content.image.value} />
|
|
538
|
+
|
|
539
|
+
> ```
|
|
540
|
+
>
|
|
541
|
+
> ```
|
|
542
|
+
|
|
543
|
+
> Hinweis: In Preact wird `className` typischerweise als `class` geschrieben.
|
|
544
|
+
|
|
545
|
+
> Um mehr über den `useIntlayer`-Hook zu erfahren, lesen Sie die [Dokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/de/packages/react-intlayer/useIntlayer.md) (Die API ist ähnlich für `preact-intlayer`).
|
|
546
|
+
|
|
547
|
+
### (Optional) Schritt 6: Ändern Sie die Sprache Ihres Inhalts
|
|
548
|
+
|
|
549
|
+
Um die Sprache Ihres Inhalts zu ändern, können Sie die Funktion `setLocale` verwenden, die vom `useLocale`-Hook bereitgestellt wird. Mit dieser Funktion können Sie die Locale der Anwendung festlegen und den Inhalt entsprechend aktualisieren.
|
|
550
|
+
|
|
551
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
552
|
+
import type { FunctionalComponent } from "preact";
|
|
553
|
+
import { Locales } from "intlayer";
|
|
554
|
+
import { useLocale } from "preact-intlayer";
|
|
555
|
+
|
|
556
|
+
const LocaleSwitcher: FunctionalComponent = () => {
|
|
557
|
+
const { setLocale } = useLocale();
|
|
558
|
+
|
|
559
|
+
return (
|
|
560
|
+
<button onClick={() => setLocale(Locales.ENGLISH)}>
|
|
561
|
+
Sprache auf Englisch ändern
|
|
562
|
+
|
|
563
|
+
import { Locales } from "intlayer";
|
|
564
|
+
import { useLocale } from "preact-intlayer";
|
|
565
|
+
|
|
566
|
+
const LocaleSwitcher = () => {
|
|
567
|
+
const { setLocale } = useLocale();
|
|
568
|
+
|
|
569
|
+
return (
|
|
570
|
+
<button onClick={() => setLocale(Locales.ENGLISH)}>
|
|
571
|
+
Sprache zu Englisch ändern
|
|
572
|
+
</button>
|
|
573
|
+
);
|
|
574
|
+
};
|
|
575
|
+
|
|
576
|
+
export default LocaleSwitcher;
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
```jsx fileName="src/components/LocaleSwitcher.cjsx" codeFormat="commonjs"
|
|
580
|
+
const { Locales } = require("intlayer");
|
|
581
|
+
const { useLocale } = require("preact-intlayer");
|
|
582
|
+
|
|
583
|
+
const LocaleSwitcher = () => {
|
|
584
|
+
const { setLocale } = useLocale();
|
|
585
|
+
|
|
586
|
+
return (
|
|
587
|
+
<button onClick={() => setLocale(Locales.ENGLISH)}>
|
|
588
|
+
Sprache zu Englisch ändern
|
|
589
|
+
</button>
|
|
590
|
+
);
|
|
591
|
+
};
|
|
592
|
+
|
|
593
|
+
module.exports = LocaleSwitcher;
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
> Um mehr über den `useLocale` Hook zu erfahren, lesen Sie die [Dokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/de/packages/react-intlayer/useLocale.md) (Die API ist ähnlich für `preact-intlayer`).
|
|
597
|
+
|
|
598
|
+
### (Optional) Schritt 7: Lokalisierte Routen zu Ihrer Anwendung hinzufügen
|
|
599
|
+
|
|
600
|
+
Das Ziel dieses Schritts ist es, eindeutige Routen für jede Sprache zu erstellen. Dies ist nützlich für SEO und SEO-freundliche URLs.
|
|
601
|
+
Beispiel:
|
|
602
|
+
|
|
603
|
+
```plaintext
|
|
604
|
+
- https://example.com/about
|
|
605
|
+
- https://example.com/es/about
|
|
606
|
+
- https://example.com/fr/about
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
> Standardmäßig werden die Routen für die Standardsprache nicht vorangestellt. Wenn Sie die Standardsprache voranstellen möchten, können Sie die Option `middleware.prefixDefault` in Ihrer Konfiguration auf `true` setzen. Weitere Informationen finden Sie in der [Konfigurationsdokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/de/configuration.md).
|
|
610
|
+
|
|
611
|
+
Um lokalisierte Routen zu Ihrer Anwendung hinzuzufügen, können Sie eine `LocaleRouter`-Komponente erstellen, die die Routen Ihrer Anwendung umschließt und die sprachbasierte Routenverwaltung übernimmt. Hier ist ein Beispiel mit [preact-iso](https://github.com/preactjs/preact-iso):
|
|
612
|
+
|
|
613
|
+
Zuerst `preact-iso` installieren:
|
|
614
|
+
|
|
615
|
+
```bash packageManager="npm"
|
|
616
|
+
npm install preact-iso
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
```bash packageManager="pnpm"
|
|
620
|
+
pnpm add preact-iso
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
```bash packageManager="yarn"
|
|
624
|
+
yarn add preact-iso
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
628
|
+
import { type Locales, configuration, getPathWithoutLocale } from "intlayer";
|
|
629
|
+
import { ComponentChildren, FunctionalComponent } from "preact";
|
|
630
|
+
import { IntlayerProvider } from "preact-intlayer";
|
|
631
|
+
import { LocationProvider, useLocation } from "preact-iso";
|
|
632
|
+
import { useEffect } from "preact/hooks";
|
|
633
|
+
|
|
634
|
+
const { internationalization, middleware } = configuration;
|
|
635
|
+
const { locales, defaultLocale } = internationalization;
|
|
636
|
+
|
|
637
|
+
const Navigate: FunctionalComponent<{ to: string; replace?: boolean }> = ({
|
|
638
|
+
to,
|
|
639
|
+
replace,
|
|
640
|
+
}) => {
|
|
641
|
+
const { route } = useLocation();
|
|
642
|
+
useEffect(() => {
|
|
643
|
+
route(to, replace);
|
|
644
|
+
}, [to, replace, route]);
|
|
645
|
+
return null;
|
|
646
|
+
};
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* Eine Komponente, die die Lokalisierung verwaltet und Kinder mit dem entsprechenden Sprachkontext umschließt.
|
|
650
|
+
* Sie verwaltet die URL-basierte Spracherkennung und -validierung.
|
|
651
|
+
*/
|
|
652
|
+
const AppLocalized: FunctionalComponent<{
|
|
653
|
+
children: ComponentChildren;
|
|
654
|
+
locale?: Locales;
|
|
655
|
+
}> = ({ children, locale }) => {
|
|
656
|
+
const { path: pathname, url } = useLocation();
|
|
657
|
+
|
|
658
|
+
if (!url) {
|
|
659
|
+
return null;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
const search = url.substring(pathname.length);
|
|
663
|
+
|
|
664
|
+
// Bestimmen der aktuellen Sprache, falls nicht angegeben, wird die Standardsprache verwendet
|
|
665
|
+
const currentLocale = locale ?? defaultLocale;
|
|
666
|
+
|
|
667
|
+
// Entfernen des Sprachpräfixes aus dem Pfad, um einen Basis-Pfad zu erstellen
|
|
668
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
669
|
+
pathname // Aktueller URL-Pfad
|
|
670
|
+
);
|
|
671
|
+
|
|
672
|
+
/**
|
|
673
|
+
* Wenn middleware.prefixDefault wahr ist, sollte die Standardsprache immer vorangestellt werden.
|
|
674
|
+
*/
|
|
675
|
+
if (middleware.prefixDefault) {
|
|
676
|
+
// Sprache validieren
|
|
677
|
+
if (!locale || !locales.includes(locale)) {
|
|
678
|
+
// Umleiten zur Standardsprache mit dem aktualisierten Pfad
|
|
679
|
+
return (
|
|
680
|
+
<Navigate
|
|
681
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
682
|
+
replace // Ersetzen des aktuellen Verlaufs-Eintrags durch den neuen
|
|
683
|
+
/>
|
|
684
|
+
);
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
// Kinder mit dem IntlayerProvider umschließen und die aktuelle Sprache setzen
|
|
688
|
+
return (
|
|
689
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
690
|
+
);
|
|
691
|
+
} else {
|
|
692
|
+
/**
|
|
693
|
+
* Wenn middleware.prefixDefault falsch ist, wird die Standardsprache nicht vorangestellt.
|
|
694
|
+
* Sicherstellen, dass die aktuelle Sprache gültig ist und nicht die Standardsprache ist.
|
|
695
|
+
*/
|
|
696
|
+
if (
|
|
697
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
698
|
+
!locales
|
|
699
|
+
.filter(
|
|
700
|
+
(loc) => loc.toString() !== defaultLocale.toString() // Standardsprache ausschließen
|
|
701
|
+
)
|
|
702
|
+
.includes(currentLocale) // Überprüfen, ob die aktuelle Sprache in der Liste der gültigen Sprachen enthalten ist
|
|
703
|
+
) {
|
|
704
|
+
// Umleiten zum Pfad ohne Sprachpräfix
|
|
705
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
// Kinder mit dem IntlayerProvider umschließen und die aktuelle Sprache setzen
|
|
709
|
+
return (
|
|
710
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
711
|
+
);
|
|
712
|
+
}
|
|
713
|
+
};
|
|
714
|
+
|
|
715
|
+
const RouterContent: FunctionalComponent<{
|
|
716
|
+
children: ComponentChildren;
|
|
717
|
+
}> = ({ children }) => {
|
|
718
|
+
const { path } = useLocation();
|
|
719
|
+
|
|
720
|
+
if (!path) {
|
|
721
|
+
return null;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
const pathLocale = path.split("/")[1] as Locales;
|
|
725
|
+
|
|
726
|
+
const isLocaleRoute = locales
|
|
727
|
+
.filter((locale) => middleware.prefixDefault || locale !== defaultLocale)
|
|
728
|
+
.some((locale) => locale.toString() === pathLocale);
|
|
729
|
+
|
|
730
|
+
if (isLocaleRoute) {
|
|
731
|
+
return <AppLocalized locale={pathLocale}>{children}</AppLocalized>;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
return (
|
|
735
|
+
<AppLocalized
|
|
736
|
+
locale={!middleware.prefixDefault ? defaultLocale : undefined}
|
|
737
|
+
>
|
|
738
|
+
{children}
|
|
739
|
+
</AppLocalized>
|
|
740
|
+
);
|
|
741
|
+
};
|
|
742
|
+
|
|
743
|
+
/**
|
|
744
|
+
* Eine Router-Komponente, die sprachspezifische Routen einrichtet.
|
|
745
|
+
* Sie verwendet preact-iso, um die Navigation zu verwalten und lokalisierte Komponenten zu rendern.
|
|
746
|
+
*/
|
|
747
|
+
export const LocaleRouter: FunctionalComponent<{
|
|
748
|
+
children: ComponentChildren;
|
|
749
|
+
}> = ({ children }) => (
|
|
750
|
+
<LocationProvider>
|
|
751
|
+
<RouterContent>{children}</RouterContent>
|
|
752
|
+
</LocationProvider>
|
|
753
|
+
);
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
```jsx fileName="src/components/LocaleRouter.jsx" codeFormat="esm"
|
|
757
|
+
// Importieren der notwendigen Abhängigkeiten und Funktionen
|
|
758
|
+
import { configuration, getPathWithoutLocale } from "intlayer";
|
|
759
|
+
import { IntlayerProvider } from "preact-intlayer";
|
|
760
|
+
import { LocationProvider, useLocation } from "preact-iso";
|
|
761
|
+
import { useEffect } from "preact/hooks";
|
|
762
|
+
import { h } from "preact"; // Erforderlich für JSX
|
|
763
|
+
|
|
764
|
+
// Destrukturierung der Konfiguration aus Intlayer
|
|
765
|
+
const { internationalization, middleware } = configuration;
|
|
766
|
+
const { locales, defaultLocale } = internationalization;
|
|
767
|
+
|
|
768
|
+
const Navigate = ({ to, replace }) => {
|
|
769
|
+
const { route } = useLocation();
|
|
770
|
+
useEffect(() => {
|
|
771
|
+
route(to, replace);
|
|
772
|
+
}, [to, replace, route]);
|
|
773
|
+
return null;
|
|
774
|
+
};
|
|
775
|
+
|
|
776
|
+
/**
|
|
777
|
+
* Eine Komponente, die die Lokalisierung verwaltet und Kinder mit dem entsprechenden Sprachkontext umschließt.
|
|
778
|
+
* Sie verwaltet die URL-basierte Spracherkennung und -validierung.
|
|
779
|
+
*/
|
|
780
|
+
const AppLocalized = ({ children, locale }) => {
|
|
781
|
+
const { path: pathname, url } = useLocation();
|
|
782
|
+
|
|
783
|
+
if (!url) {
|
|
784
|
+
return null;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
const search = url.substring(pathname.length);
|
|
788
|
+
|
|
789
|
+
// Bestimmen der aktuellen Sprache, falls nicht angegeben, wird die Standardsprache verwendet
|
|
790
|
+
const currentLocale = locale ?? defaultLocale;
|
|
791
|
+
|
|
792
|
+
// Entfernen des Sprachpräfixes aus dem Pfad, um einen Basis-Pfad zu erstellen
|
|
793
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
794
|
+
pathname // Aktueller URL-Pfad
|
|
795
|
+
);
|
|
796
|
+
|
|
797
|
+
/**
|
|
798
|
+
* Wenn middleware.prefixDefault wahr ist, sollte die Standardsprache immer vorangestellt werden.
|
|
799
|
+
*/
|
|
800
|
+
if (middleware.prefixDefault) {
|
|
801
|
+
// Sprache validieren
|
|
802
|
+
if (!locale || !locales.includes(locale)) {
|
|
803
|
+
// Umleiten zur Standardsprache mit dem aktualisierten Pfad
|
|
804
|
+
return (
|
|
805
|
+
<Navigate
|
|
806
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
807
|
+
replace // Ersetzen des aktuellen Verlaufs-Eintrags durch den neuen
|
|
808
|
+
/>
|
|
809
|
+
);
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
// Kinder mit dem IntlayerProvider umschließen und die aktuelle Sprache setzen
|
|
813
|
+
return (
|
|
814
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
815
|
+
);
|
|
816
|
+
} else {
|
|
817
|
+
/**
|
|
818
|
+
* Wenn middleware.prefixDefault falsch ist, wird die Standardsprache nicht vorangestellt.
|
|
819
|
+
* Sicherstellen, dass die aktuelle Sprache gültig ist und nicht die Standardsprache ist.
|
|
820
|
+
*/
|
|
821
|
+
if (
|
|
822
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
823
|
+
!locales
|
|
824
|
+
.filter(
|
|
825
|
+
(loc) => loc.toString() !== defaultLocale.toString() // Standardsprache ausschließen
|
|
826
|
+
)
|
|
827
|
+
.includes(currentLocale) // Überprüfen, ob die aktuelle Sprache in der Liste der gültigen Sprachen enthalten ist
|
|
828
|
+
) {
|
|
829
|
+
// Umleiten zum Pfad ohne Sprachpräfix
|
|
830
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
// Kinder mit dem IntlayerProvider umschließen und die aktuelle Sprache setzen
|
|
834
|
+
return (
|
|
835
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
836
|
+
);
|
|
837
|
+
}
|
|
838
|
+
};
|
|
839
|
+
|
|
840
|
+
* Wenn middleware.prefixDefault false ist, wird die Standardsprache nicht vorangestellt.
|
|
841
|
+
* Stellen Sie sicher, dass die aktuelle Sprache gültig ist und nicht die Standardsprache ist.
|
|
842
|
+
*/
|
|
843
|
+
if (
|
|
844
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
845
|
+
!locales
|
|
846
|
+
.filter(
|
|
847
|
+
(loc) => loc.toString() !== defaultLocale.toString() // Standardsprache ausschließen
|
|
848
|
+
)
|
|
849
|
+
.includes(currentLocale) // Überprüfen, ob die aktuelle Sprache in der Liste der gültigen Sprachen enthalten ist
|
|
850
|
+
) {
|
|
851
|
+
// Weiterleitung zum Pfad ohne Sprachpräfix
|
|
852
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
// Umhüllen der Kinder mit dem IntlayerProvider und Festlegen der aktuellen Sprache
|
|
856
|
+
return (
|
|
857
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
858
|
+
);
|
|
859
|
+
}
|
|
860
|
+
};
|
|
861
|
+
|
|
862
|
+
const RouterContent = ({ children }) => {
|
|
863
|
+
const { path } = useLocation();
|
|
864
|
+
|
|
865
|
+
if (!path) {
|
|
866
|
+
return null;
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
const pathLocale = path.split("/")[1];
|
|
870
|
+
|
|
871
|
+
const isLocaleRoute = locales
|
|
872
|
+
.filter((locale) => middleware.prefixDefault || locale !== defaultLocale)
|
|
873
|
+
.some((locale) => locale.toString() === pathLocale);
|
|
874
|
+
|
|
875
|
+
if (isLocaleRoute) {
|
|
876
|
+
return <AppLocalized locale={pathLocale}>{children}</AppLocalized>;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
return (
|
|
880
|
+
<AppLocalized
|
|
881
|
+
locale={!middleware.prefixDefault ? defaultLocale : undefined}
|
|
882
|
+
>
|
|
883
|
+
{children}
|
|
884
|
+
</AppLocalized>
|
|
885
|
+
);
|
|
886
|
+
};
|
|
887
|
+
|
|
888
|
+
/**
|
|
889
|
+
* Eine Router-Komponente, die sprachspezifische Routen einrichtet.
|
|
890
|
+
* Sie verwendet preact-iso, um die Navigation zu verwalten und lokalisierte Komponenten zu rendern.
|
|
891
|
+
*/
|
|
892
|
+
export const LocaleRouter = ({ children }) => (
|
|
893
|
+
<LocationProvider>
|
|
894
|
+
<RouterContent>{children}</RouterContent>
|
|
895
|
+
</LocationProvider>
|
|
896
|
+
);
|
|
897
|
+
```
|
|
898
|
+
|
|
899
|
+
```jsx fileName="src/components/LocaleRouter.cjsx" codeFormat="commonjs"
|
|
900
|
+
// Importieren der notwendigen Abhängigkeiten und Funktionen
|
|
901
|
+
const { configuration, getPathWithoutLocale } = require("intlayer");
|
|
902
|
+
const { IntlayerProvider } = require("preact-intlayer");
|
|
903
|
+
const { LocationProvider, useLocation } = require("preact-iso");
|
|
904
|
+
const { useEffect } = require("preact/hooks");
|
|
905
|
+
const { h } = require("preact"); // Erforderlich für JSX
|
|
906
|
+
|
|
907
|
+
// Destrukturierung der Konfiguration von Intlayer
|
|
908
|
+
const { internationalization, middleware } = configuration;
|
|
909
|
+
const { locales, defaultLocale } = internationalization;
|
|
910
|
+
|
|
911
|
+
const Navigate = ({ to, replace }) => {
|
|
912
|
+
const { route } = useLocation();
|
|
913
|
+
useEffect(() => {
|
|
914
|
+
route(to, replace);
|
|
915
|
+
}, [to, replace, route]);
|
|
916
|
+
return null;
|
|
917
|
+
};
|
|
918
|
+
|
|
919
|
+
/**
|
|
920
|
+
* Eine Komponente, die Lokalisierung behandelt und Kinder mit dem entsprechenden Sprachkontext umhüllt.
|
|
921
|
+
* Sie verwaltet die URL-basierte Spracherkennung und -validierung.
|
|
922
|
+
*/
|
|
923
|
+
const AppLocalized = ({ children, locale }) => {
|
|
924
|
+
const { path: pathname, url } = useLocation();
|
|
925
|
+
|
|
926
|
+
if (!url) {
|
|
927
|
+
return null;
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
const search = url.substring(pathname.length);
|
|
931
|
+
|
|
932
|
+
// Bestimmen der aktuellen Sprache, falls nicht angegeben, wird die Standardsprache verwendet
|
|
933
|
+
const currentLocale = locale ?? defaultLocale;
|
|
934
|
+
|
|
935
|
+
// Entfernen des Sprachpräfixes aus dem Pfad, um einen Basis-Pfad zu erstellen
|
|
936
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
937
|
+
pathname // Aktueller URL-Pfad
|
|
938
|
+
);
|
|
939
|
+
|
|
940
|
+
/**
|
|
941
|
+
* Wenn middleware.prefixDefault true ist, sollte die Standardsprache immer vorangestellt werden.
|
|
942
|
+
*/
|
|
943
|
+
if (middleware.prefixDefault) {
|
|
944
|
+
// Validieren der Sprache
|
|
945
|
+
if (!locale || !locales.includes(locale)) {
|
|
946
|
+
// Weiterleitung zur Standardsprache mit dem aktualisierten Pfad
|
|
947
|
+
return (
|
|
948
|
+
<Navigate
|
|
949
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
950
|
+
replace // Ersetzen des aktuellen Verlaufs-Eintrags durch den neuen
|
|
951
|
+
/>
|
|
952
|
+
);
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
// Umhüllen der Kinder mit dem IntlayerProvider und Festlegen der aktuellen Sprache
|
|
956
|
+
return (
|
|
957
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
958
|
+
);
|
|
959
|
+
} else {
|
|
960
|
+
/**
|
|
961
|
+
* Wenn middleware.prefixDefault false ist, wird die Standardsprache nicht vorangestellt.
|
|
962
|
+
* Stellen Sie sicher, dass die aktuelle Sprache gültig ist und nicht die Standardsprache ist.
|
|
963
|
+
*/
|
|
964
|
+
if (
|
|
965
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
966
|
+
!locales
|
|
967
|
+
.filter(
|
|
968
|
+
(loc) => loc.toString() !== defaultLocale.toString() // Standardsprache ausschließen
|
|
969
|
+
)
|
|
970
|
+
.includes(currentLocale) // Überprüfen, ob die aktuelle Sprache in der Liste der gültigen Sprachen enthalten ist
|
|
971
|
+
) {
|
|
972
|
+
// Weiterleitung zum Pfad ohne Sprachpräfix
|
|
973
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
// Umhüllen der Kinder mit dem IntlayerProvider und Festlegen der aktuellen Sprache
|
|
977
|
+
return (
|
|
978
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
979
|
+
);
|
|
980
|
+
}
|
|
981
|
+
};
|
|
982
|
+
|
|
983
|
+
const RouterContent = ({ children }) => {
|
|
984
|
+
const { path } = useLocation();
|
|
985
|
+
|
|
986
|
+
if (!path) {
|
|
987
|
+
return null;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
const pathLocale = path.split("/")[1];
|
|
991
|
+
|
|
992
|
+
const isLocaleRoute = locales
|
|
993
|
+
.filter((locale) => middleware.prefixDefault || locale !== defaultLocale)
|
|
994
|
+
.some((locale) => locale.toString() === pathLocale);
|
|
995
|
+
|
|
996
|
+
if (isLocaleRoute) {
|
|
997
|
+
return <AppLocalized locale={pathLocale}>{children}</AppLocalized>;
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
return (
|
|
1001
|
+
<AppLocalized
|
|
1002
|
+
locale={!middleware.prefixDefault ? defaultLocale : undefined}
|
|
1003
|
+
>
|
|
1004
|
+
{children}
|
|
1005
|
+
</AppLocalized>
|
|
1006
|
+
);
|
|
1007
|
+
};
|
|
1008
|
+
|
|
1009
|
+
/**
|
|
1010
|
+
* Eine Router-Komponente, die sprachspezifische Routen einrichtet.
|
|
1011
|
+
* Sie verwendet preact-iso, um die Navigation zu verwalten und lokalisierte Komponenten zu rendern.
|
|
1012
|
+
*/
|
|
1013
|
+
const LocaleRouter = ({ children }) => (
|
|
1014
|
+
<LocationProvider>
|
|
1015
|
+
<RouterContent>{children}</RouterContent>
|
|
1016
|
+
</LocationProvider>
|
|
1017
|
+
);
|
|
1018
|
+
|
|
1019
|
+
module.exports = { LocaleRouter };
|
|
1020
|
+
```
|
|
1021
|
+
|
|
1022
|
+
Dann können Sie die `LocaleRouter`-Komponente in Ihrer Anwendung verwenden:
|
|
1023
|
+
|
|
1024
|
+
```tsx fileName="src/app.tsx" codeFormat="typescript"
|
|
1025
|
+
import { LocaleRouter } from "./components/LocaleRouter";
|
|
1026
|
+
import type { FunctionalComponent } from "preact";
|
|
1027
|
+
// ... Ihre AppContent-Komponente (definiert in Schritt 5)
|
|
1028
|
+
|
|
1029
|
+
const App: FunctionalComponent = () => (
|
|
1030
|
+
<LocaleRouter>
|
|
1031
|
+
<AppContent />
|
|
1032
|
+
</LocaleRouter>
|
|
1033
|
+
);
|
|
1034
|
+
|
|
1035
|
+
export default App;
|
|
1036
|
+
```
|
|
1037
|
+
|
|
1038
|
+
```jsx fileName="src/app.jsx" codeFormat="esm"
|
|
1039
|
+
import { LocaleRouter } from "./components/LocaleRouter";
|
|
1040
|
+
// ... Ihre AppContent-Komponente (definiert in Schritt 5)
|
|
1041
|
+
|
|
1042
|
+
const App = () => (
|
|
1043
|
+
<LocaleRouter>
|
|
1044
|
+
<AppContent />
|
|
1045
|
+
</LocaleRouter>
|
|
1046
|
+
);
|
|
1047
|
+
|
|
1048
|
+
export default App;
|
|
1049
|
+
```
|
|
1050
|
+
|
|
1051
|
+
```jsx fileName="src/app.cjsx" codeFormat="commonjs"
|
|
1052
|
+
const { LocaleRouter } = require("./components/LocaleRouter");
|
|
1053
|
+
// ... Ihre AppContent-Komponente (definiert in Schritt 5)
|
|
1054
|
+
|
|
1055
|
+
const App = () => (
|
|
1056
|
+
<LocaleRouter>
|
|
1057
|
+
<AppContent />
|
|
1058
|
+
</LocaleRouter>
|
|
1059
|
+
);
|
|
1060
|
+
|
|
1061
|
+
module.exports = App;
|
|
1062
|
+
```
|
|
1063
|
+
|
|
1064
|
+
Parallel dazu können Sie auch das `intLayerMiddlewarePlugin` verwenden, um serverseitiges Routing zu Ihrer Anwendung hinzuzufügen. Dieses Plugin erkennt automatisch die aktuelle Sprache basierend auf der URL und setzt das entsprechende Sprach-Cookie. Wenn keine Sprache angegeben ist, bestimmt das Plugin die am besten geeignete Sprache basierend auf den Spracheinstellungen des Browsers des Benutzers. Wenn keine Sprache erkannt wird, wird zur Standardsprache umgeleitet.
|
|
1065
|
+
|
|
1066
|
+
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
1067
|
+
import { defineConfig } from "vite";
|
|
1068
|
+
import preact from "@preact/preset-vite";
|
|
1069
|
+
import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";
|
|
1070
|
+
|
|
1071
|
+
// https://vitejs.dev/config/
|
|
1072
|
+
export default defineConfig({
|
|
1073
|
+
plugins: [preact(), intlayerPlugin(), intLayerMiddlewarePlugin()],
|
|
1074
|
+
});
|
|
1075
|
+
```
|
|
1076
|
+
|
|
1077
|
+
```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
|
|
1078
|
+
import { defineConfig } from "vite";
|
|
1079
|
+
import preact from "@preact/preset-vite";
|
|
1080
|
+
import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";
|
|
1081
|
+
|
|
1082
|
+
// https://vitejs.dev/config/
|
|
1083
|
+
export default defineConfig({
|
|
1084
|
+
plugins: [preact(), intlayerPlugin(), intLayerMiddlewarePlugin()],
|
|
1085
|
+
});
|
|
1086
|
+
```
|
|
1087
|
+
|
|
1088
|
+
```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
|
|
1089
|
+
const { defineConfig } = require("vite");
|
|
1090
|
+
const preact = require("@preact/preset-vite");
|
|
1091
|
+
const { intlayerPlugin, intLayerMiddlewarePlugin } = require("vite-intlayer");
|
|
1092
|
+
|
|
1093
|
+
// https://vitejs.dev/config/
|
|
1094
|
+
module.exports = defineConfig({
|
|
1095
|
+
plugins: [preact(), intlayerPlugin(), intLayerMiddlewarePlugin()],
|
|
1096
|
+
});
|
|
1097
|
+
```
|
|
1098
|
+
|
|
1099
|
+
### (Optional) Schritt 8: Ändern der URL, wenn sich die Sprache ändert
|
|
1100
|
+
|
|
1101
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
1102
|
+
import { useLocation, route } from "preact-iso";
|
|
1103
|
+
import {
|
|
1104
|
+
Locales,
|
|
1105
|
+
getHTMLTextDir,
|
|
1106
|
+
getLocaleName,
|
|
1107
|
+
getLocalizedUrl,
|
|
1108
|
+
} from "intlayer";
|
|
1109
|
+
import { useLocale } from "preact-intlayer";
|
|
1110
|
+
import type { FunctionalComponent } from "preact";
|
|
1111
|
+
|
|
1112
|
+
const LocaleSwitcher: FunctionalComponent = () => {
|
|
1113
|
+
const location = useLocation();
|
|
1114
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
1115
|
+
onLocaleChange: (newLocale) => {
|
|
1116
|
+
const currentFullPath = location.url; // preact-iso stellt die vollständige URL bereit
|
|
1117
|
+
// Konstruktion der URL mit der aktualisierten Sprache
|
|
1118
|
+
// Beispiel: /es/about?foo=bar
|
|
1119
|
+
const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale);
|
|
1120
|
+
|
|
1121
|
+
// Aktualisierung des URL-Pfads
|
|
1122
|
+
route(pathWithLocale, true); // true für Ersetzen
|
|
1123
|
+
},
|
|
1124
|
+
});
|
|
1125
|
+
|
|
1126
|
+
return (
|
|
1127
|
+
<div>
|
|
1128
|
+
<button popovertarget="localePopover">{getLocaleName(locale)}</button>
|
|
1129
|
+
<div id="localePopover" popover="auto">
|
|
1130
|
+
{availableLocales.map((localeItem) => (
|
|
1131
|
+
<a
|
|
1132
|
+
href={getLocalizedUrl(location.url, localeItem)}
|
|
1133
|
+
hreflang={localeItem}
|
|
1134
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1135
|
+
onClick={(e) => {
|
|
1136
|
+
e.preventDefault();
|
|
1137
|
+
setLocale(localeItem);
|
|
1138
|
+
// Programmatische Navigation nach dem Setzen der Sprache wird von onLocaleChange behandelt
|
|
1139
|
+
}}
|
|
1140
|
+
key={localeItem}
|
|
1141
|
+
>
|
|
1142
|
+
<span>
|
|
1143
|
+
{/* Sprache - z. B. FR */}
|
|
1144
|
+
{localeItem}
|
|
1145
|
+
</span>
|
|
1146
|
+
<span>
|
|
1147
|
+
{/* Sprache in ihrer eigenen Lokalisierung - z. B. Français */}
|
|
1148
|
+
{getLocaleName(localeItem, localeItem)}
|
|
1149
|
+
</span>
|
|
1150
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1151
|
+
{/* Sprache in der aktuellen Lokalisierung - z. B. Francés mit aktueller Sprache auf Locales.SPANISH gesetzt */}
|
|
1152
|
+
{getLocaleName(localeItem, locale)}
|
|
1153
|
+
</span>
|
|
1154
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1155
|
+
{/* Sprache auf Englisch - z. B. French */}
|
|
1156
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1157
|
+
</span>
|
|
1158
|
+
</a>
|
|
1159
|
+
))}
|
|
1160
|
+
</div>
|
|
1161
|
+
</div>
|
|
1162
|
+
);
|
|
1163
|
+
};
|
|
1164
|
+
|
|
1165
|
+
export default LocaleSwitcher;
|
|
1166
|
+
```
|
|
1167
|
+
|
|
1168
|
+
```jsx fileName="src/components/LocaleSwitcher.jsx" codeFormat="esm"
|
|
1169
|
+
import { useLocation, route } from "preact-iso";
|
|
1170
|
+
import {
|
|
1171
|
+
Locales,
|
|
1172
|
+
getHTMLTextDir,
|
|
1173
|
+
getLocaleName,
|
|
1174
|
+
getLocalizedUrl,
|
|
1175
|
+
} from "intlayer";
|
|
1176
|
+
import { useLocale } from "preact-intlayer";
|
|
1177
|
+
import { h } from "preact"; // Für JSX
|
|
1178
|
+
|
|
1179
|
+
const LocaleSwitcher = () => {
|
|
1180
|
+
const location = useLocation();
|
|
1181
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
1182
|
+
onLocaleChange: (newLocale) => {
|
|
1183
|
+
const currentFullPath = location.url;
|
|
1184
|
+
const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale);
|
|
1185
|
+
route(pathWithLocale, true);
|
|
1186
|
+
},
|
|
1187
|
+
});
|
|
1188
|
+
|
|
1189
|
+
return (
|
|
1190
|
+
<div>
|
|
1191
|
+
<button popovertarget="localePopover">{getLocaleName(locale)}</button>
|
|
1192
|
+
<div id="localePopover" popover="auto">
|
|
1193
|
+
{availableLocales.map((localeItem) => (
|
|
1194
|
+
<a
|
|
1195
|
+
href={getLocalizedUrl(location.url, localeItem)}
|
|
1196
|
+
hreflang={localeItem}
|
|
1197
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1198
|
+
onClick={(e) => {
|
|
1199
|
+
e.preventDefault();
|
|
1200
|
+
setLocale(localeItem);
|
|
1201
|
+
}}
|
|
1202
|
+
key={localeItem}
|
|
1203
|
+
>
|
|
1204
|
+
<span>{localeItem}</span>
|
|
1205
|
+
<span>{getLocaleName(localeItem, localeItem)}</span>
|
|
1206
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1207
|
+
{getLocaleName(localeItem, locale)}
|
|
1208
|
+
</span>
|
|
1209
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1210
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1211
|
+
</span>
|
|
1212
|
+
</a>
|
|
1213
|
+
))}
|
|
1214
|
+
</div>
|
|
1215
|
+
</div>
|
|
1216
|
+
);
|
|
1217
|
+
};
|
|
1218
|
+
|
|
1219
|
+
export default LocaleSwitcher;
|
|
1220
|
+
```
|
|
1221
|
+
|
|
1222
|
+
```jsx fileName="src/components/LocaleSwitcher.cjsx" codeFormat="commonjs"
|
|
1223
|
+
const { useLocation, route } = require("preact-iso");
|
|
1224
|
+
const {
|
|
1225
|
+
Locales,
|
|
1226
|
+
getHTMLTextDir,
|
|
1227
|
+
getLocaleName,
|
|
1228
|
+
getLocalizedUrl,
|
|
1229
|
+
} = require("intlayer");
|
|
1230
|
+
const { useLocale } = require("preact-intlayer");
|
|
1231
|
+
const { h } = require("preact"); // Für JSX
|
|
1232
|
+
|
|
1233
|
+
const LocaleSwitcher = () => {
|
|
1234
|
+
const location = useLocation();
|
|
1235
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
1236
|
+
onLocaleChange: (newLocale) => {
|
|
1237
|
+
const currentFullPath = location.url;
|
|
1238
|
+
const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale);
|
|
1239
|
+
route(pathWithLocale, true);
|
|
1240
|
+
},
|
|
1241
|
+
});
|
|
1242
|
+
|
|
1243
|
+
return (
|
|
1244
|
+
<div>
|
|
1245
|
+
<button popovertarget="localePopover">{getLocaleName(locale)}</button>
|
|
1246
|
+
<div id="localePopover" popover="auto">
|
|
1247
|
+
{availableLocales.map((localeItem) => (
|
|
1248
|
+
<a
|
|
1249
|
+
href={getLocalizedUrl(location.url, localeItem)}
|
|
1250
|
+
hreflang={localeItem}
|
|
1251
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1252
|
+
onClick={(e) => {
|
|
1253
|
+
e.preventDefault();
|
|
1254
|
+
setLocale(localeItem);
|
|
1255
|
+
}}
|
|
1256
|
+
key={localeItem}
|
|
1257
|
+
>
|
|
1258
|
+
<span>{localeItem}</span>
|
|
1259
|
+
<span>{getLocaleName(localeItem, localeItem)}</span>
|
|
1260
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1261
|
+
{getLocaleName(localeItem, locale)}
|
|
1262
|
+
</span>
|
|
1263
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1264
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1265
|
+
</span>
|
|
1266
|
+
</a>
|
|
1267
|
+
))}
|
|
1268
|
+
</div>
|
|
1269
|
+
</div>
|
|
1270
|
+
);
|
|
1271
|
+
};
|
|
1272
|
+
|
|
1273
|
+
module.exports = LocaleSwitcher;
|
|
1274
|
+
```
|
|
1275
|
+
|
|
1276
|
+
> Dokumentationsreferenzen:
|
|
1277
|
+
|
|
1278
|
+
> - [`useLocale` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/de/packages/react-intlayer/useLocale.md) (API ist ähnlich für `preact-intlayer`)
|
|
1279
|
+
|
|
1280
|
+
> - [`getLocaleName` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/de/packages/intlayer/getLocaleName.md)
|
|
1281
|
+
|
|
1282
|
+
> - [`getLocalizedUrl` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/de/packages/intlayer/getLocalizedUrl.md)
|
|
1283
|
+
|
|
1284
|
+
> - [`getHTMLTextDir` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/de/packages/intlayer/getHTMLTextDir.md)
|
|
1285
|
+
|
|
1286
|
+
> - [`hreflang` Attribut](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr)
|
|
1287
|
+
|
|
1288
|
+
> - [`lang` Attribut](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)
|
|
1289
|
+
|
|
1290
|
+
> - [`dir` Attribut](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir)
|
|
1291
|
+
|
|
1292
|
+
> - [`aria-current` Attribut](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
1293
|
+
|
|
1294
|
+
> - [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API)
|
|
1295
|
+
|
|
1296
|
+
Unten ist der aktualisierte **Schritt 9** mit zusätzlichen Erklärungen und verfeinerten Codebeispielen:
|
|
1297
|
+
|
|
1298
|
+
---
|
|
1299
|
+
|
|
1300
|
+
### (Optional) Schritt 9: Ändern der HTML-Sprach- und Richtungsattribute
|
|
1301
|
+
|
|
1302
|
+
Wenn Ihre Anwendung mehrere Sprachen unterstützt, ist es wichtig, die `lang`- und `dir`-Attribute des `<html>`-Tags an die aktuelle Sprache anzupassen. Dies stellt sicher:
|
|
1303
|
+
|
|
1304
|
+
- **Barrierefreiheit**: Screenreader und unterstützende Technologien verlassen sich auf das korrekte `lang`-Attribut, um Inhalte genau auszusprechen und zu interpretieren.
|
|
1305
|
+
- **Textdarstellung**: Das `dir`-Attribut (Richtung) stellt sicher, dass der Text in der richtigen Reihenfolge gerendert 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 entscheidend ist.
|
|
1306
|
+
- **SEO**: Suchmaschinen verwenden das `lang`-Attribut, um die Sprache Ihrer Seite zu bestimmen und die richtigen lokalisierten Inhalte in den Suchergebnissen bereitzustellen.
|
|
1307
|
+
|
|
1308
|
+
Durch die dynamische Aktualisierung dieser Attribute bei Sprachänderungen gewährleisten Sie eine konsistente und zugängliche Benutzererfahrung für alle unterstützten Sprachen.
|
|
1309
|
+
|
|
1310
|
+
#### Implementierung des Hooks
|
|
1311
|
+
|
|
1312
|
+
Erstellen Sie einen benutzerdefinierten Hook, um die HTML-Attribute zu verwalten. Der Hook hört auf Sprachänderungen und aktualisiert die Attribute entsprechend:
|
|
1313
|
+
|
|
1314
|
+
import { useEffect } from "preact/hooks";
|
|
1315
|
+
import { useLocale } from "preact-intlayer";
|
|
1316
|
+
import { getHTMLTextDir } from "intlayer";
|
|
1317
|
+
|
|
1318
|
+
/\*\*
|
|
1319
|
+
|
|
1320
|
+
- Aktualisiert die `lang`- und `dir`-Attribute des HTML-<html>-Elements basierend auf der aktuellen Spracheinstellung.
|
|
1321
|
+
- - `lang`: Informiert Browser und Suchmaschinen über die Sprache der Seite.
|
|
1322
|
+
- - `dir`: Stellt die korrekte Leserichtung sicher (z. B. 'ltr' für Englisch, 'rtl' für Arabisch).
|
|
1323
|
+
-
|
|
1324
|
+
- Diese dynamische Aktualisierung ist essenziell für eine korrekte Textdarstellung, Barrierefreiheit und SEO.
|
|
1325
|
+
\*/
|
|
1326
|
+
export const useI18nHTMLAttributes = () => {
|
|
1327
|
+
const { locale } = useLocale();
|
|
1328
|
+
|
|
1329
|
+
useEffect(() => {
|
|
1330
|
+
// Aktualisiert das Sprachattribut auf die aktuelle Spracheinstellung.
|
|
1331
|
+
document.documentElement.lang = locale;
|
|
1332
|
+
|
|
1333
|
+
// Setzt die Leserichtung basierend auf der aktuellen Spracheinstellung.
|
|
1334
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1335
|
+
|
|
1336
|
+
}, [locale]);
|
|
1337
|
+
};
|
|
1338
|
+
|
|
1339
|
+
````
|
|
1340
|
+
|
|
1341
|
+
```jsx fileName="src/hooks/useI18nHTMLAttributes.jsx" codeFormat="esm"
|
|
1342
|
+
import { useEffect } from "preact/hooks";
|
|
1343
|
+
import { useLocale } from "preact-intlayer";
|
|
1344
|
+
import { getHTMLTextDir } from "intlayer";
|
|
1345
|
+
|
|
1346
|
+
/**
|
|
1347
|
+
* Aktualisiert die `lang`- und `dir`-Attribute des HTML-<html>-Elements basierend auf der aktuellen Spracheinstellung.
|
|
1348
|
+
*/
|
|
1349
|
+
export const useI18nHTMLAttributes = () => {
|
|
1350
|
+
const { locale } = useLocale();
|
|
1351
|
+
|
|
1352
|
+
useEffect(() => {
|
|
1353
|
+
document.documentElement.lang = locale;
|
|
1354
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1355
|
+
}, [locale]);
|
|
1356
|
+
};
|
|
1357
|
+
````
|
|
1358
|
+
|
|
1359
|
+
```jsx fileName="src/hooks/useI18nHTMLAttributes.cjsx" codeFormat="commonjs"
|
|
1360
|
+
const { useEffect } = require("preact/hooks");
|
|
1361
|
+
const { useLocale } = require("preact-intlayer");
|
|
1362
|
+
const { getHTMLTextDir } = require("intlayer");
|
|
1363
|
+
|
|
1364
|
+
/**
|
|
1365
|
+
* Aktualisiert die `lang`- und `dir`-Attribute des HTML-<html>-Elements basierend auf der aktuellen Spracheinstellung.
|
|
1366
|
+
*/
|
|
1367
|
+
const useI18nHTMLAttributes = () => {
|
|
1368
|
+
const { locale } = useLocale();
|
|
1369
|
+
|
|
1370
|
+
useEffect(() => {
|
|
1371
|
+
document.documentElement.lang = locale;
|
|
1372
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1373
|
+
}, [locale]);
|
|
1374
|
+
};
|
|
1375
|
+
|
|
1376
|
+
module.exports = { useI18nHTMLAttributes };
|
|
1377
|
+
```
|
|
1378
|
+
|
|
1379
|
+
#### Verwendung des Hooks in Ihrer Anwendung
|
|
1380
|
+
|
|
1381
|
+
Integrieren Sie den Hook in Ihre Hauptkomponente, damit die HTML-Attribute aktualisiert werden, sobald sich die Spracheinstellung ändert:
|
|
1382
|
+
|
|
1383
|
+
```tsx fileName="src/app.tsx" codeFormat="typescript"
|
|
1384
|
+
import type { FunctionalComponent } from "preact";
|
|
1385
|
+
import { IntlayerProvider } from "preact-intlayer"; // useIntlayer ist bereits importiert, falls AppContent es benötigt
|
|
1386
|
+
import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
1387
|
+
import "./app.css";
|
|
1388
|
+
// AppContent-Definition aus Schritt 5
|
|
1389
|
+
|
|
1390
|
+
const AppWithHooks: FunctionalComponent = () => {
|
|
1391
|
+
// Wendet den Hook an, um die `lang`- und `dir`-Attribute des <html>-Tags basierend auf der Spracheinstellung zu aktualisieren.
|
|
1392
|
+
useI18nHTMLAttributes();
|
|
1393
|
+
|
|
1394
|
+
// Angenommen, AppContent ist Ihre Hauptanzeigekomponente aus Schritt 5
|
|
1395
|
+
return <AppContent />;
|
|
1396
|
+
};
|
|
1397
|
+
|
|
1398
|
+
const App: FunctionalComponent = () => (
|
|
1399
|
+
<IntlayerProvider>
|
|
1400
|
+
<AppWithHooks />
|
|
1401
|
+
</IntlayerProvider>
|
|
1402
|
+
);
|
|
1403
|
+
|
|
1404
|
+
export default App;
|
|
1405
|
+
```
|
|
1406
|
+
|
|
1407
|
+
```jsx fileName="src/app.jsx" codeFormat="esm"
|
|
1408
|
+
import { IntlayerProvider } from "preact-intlayer";
|
|
1409
|
+
import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
1410
|
+
import "./app.css";
|
|
1411
|
+
// AppContent-Definition aus Schritt 5
|
|
1412
|
+
|
|
1413
|
+
const AppWithHooks = () => {
|
|
1414
|
+
useI18nHTMLAttributes();
|
|
1415
|
+
return <AppContent />;
|
|
1416
|
+
};
|
|
1417
|
+
|
|
1418
|
+
const App = () => (
|
|
1419
|
+
<IntlayerProvider>
|
|
1420
|
+
<AppWithHooks />
|
|
1421
|
+
</IntlayerProvider>
|
|
1422
|
+
);
|
|
1423
|
+
|
|
1424
|
+
export default App;
|
|
1425
|
+
```
|
|
1426
|
+
|
|
1427
|
+
```jsx fileName="src/app.cjsx" codeFormat="commonjs"
|
|
1428
|
+
const { IntlayerProvider } = require("preact-intlayer");
|
|
1429
|
+
const { useI18nHTMLAttributes } = require("./hooks/useI18nHTMLAttributes");
|
|
1430
|
+
require("./app.css");
|
|
1431
|
+
// AppContent-Definition aus Schritt 5
|
|
1432
|
+
|
|
1433
|
+
const AppWithHooks = () => {
|
|
1434
|
+
useI18nHTMLAttributes();
|
|
1435
|
+
return <AppContent />;
|
|
1436
|
+
};
|
|
1437
|
+
|
|
1438
|
+
const App = () => (
|
|
1439
|
+
<IntlayerProvider>
|
|
1440
|
+
<AppWithHooks />
|
|
1441
|
+
</IntlayerProvider>
|
|
1442
|
+
);
|
|
1443
|
+
|
|
1444
|
+
module.exports = App;
|
|
1445
|
+
```
|
|
1446
|
+
|
|
1447
|
+
Durch die Anwendung dieser Änderungen wird Ihre Anwendung:
|
|
1448
|
+
|
|
1449
|
+
- Sicherstellen, dass das **Sprachattribut** (`lang`) die aktuelle Spracheinstellung korrekt widerspiegelt, was für SEO und das Verhalten des Browsers wichtig ist.
|
|
1450
|
+
- Die **Leserichtung** (`dir`) entsprechend der Spracheinstellung anpassen, um die Lesbarkeit und Benutzerfreundlichkeit für Sprachen mit unterschiedlichen Leserichtungen zu verbessern.
|
|
1451
|
+
- Eine **barrierefreie** Erfahrung bieten, da unterstützende Technologien auf diese Attribute angewiesen sind, um optimal zu funktionieren.
|
|
1452
|
+
|
|
1453
|
+
### (Optional) Schritt 10: Erstellen einer lokalisierten Link-Komponente
|
|
1454
|
+
|
|
1455
|
+
Um sicherzustellen, dass die Navigation Ihrer Anwendung die aktuelle Spracheinstellung berücksichtigt, können Sie eine benutzerdefinierte `Link`-Komponente erstellen. Diese Komponente fügt automatisch die aktuelle Sprache als Präfix zu internen URLs hinzu.
|
|
1456
|
+
|
|
1457
|
+
Dieses Verhalten ist aus mehreren Gründen nützlich:
|
|
1458
|
+
|
|
1459
|
+
- **SEO und Benutzererfahrung**: Lokalisierte URLs helfen Suchmaschinen, sprachspezifische Seiten korrekt zu indexieren, und bieten Benutzern Inhalte in ihrer bevorzugten Sprache.
|
|
1460
|
+
- **Konsistenz**: Durch die Verwendung eines lokalisierten Links in Ihrer gesamten Anwendung stellen Sie sicher, dass die Navigation innerhalb der aktuellen Spracheinstellung bleibt und unerwartete Sprachwechsel vermieden werden.
|
|
1461
|
+
- **Wartbarkeit**: Die Zentralisierung der Lokalisierungslogik in einer einzigen Komponente vereinfacht die Verwaltung von URLs.
|
|
1462
|
+
|
|
1463
|
+
Für Preact mit `preact-iso` werden normalerweise Standard-`<a>`-Tags für die Navigation verwendet, und `preact-iso` übernimmt das Routing. Wenn Sie eine programmatische Navigation beim Klicken benötigen (z. B. um Aktionen vor der Navigation auszuführen), können Sie die `route`-Funktion von `useLocation` verwenden. So können Sie eine benutzerdefinierte Ankerkomponente erstellen, die URLs lokalisiert:
|
|
1464
|
+
|
|
1465
|
+
```tsx fileName="src/components/LocalizedLink.tsx" codeFormat="typescript"
|
|
1466
|
+
import { getLocalizedUrl } from "intlayer";
|
|
1467
|
+
import { useLocale, useLocation, route } from "preact-intlayer"; // Angenommen, useLocation und route können von preact-iso über preact-intlayer re-exportiert werden, oder direkt importieren
|
|
1468
|
+
// Falls nicht re-exportiert, direkt importieren: import { useLocation, route } from "preact-iso";
|
|
1469
|
+
import type { JSX } from "preact"; // Für HTMLAttributes
|
|
1470
|
+
import { forwardRef } from "preact/compat"; // Für das Weiterleiten von Refs
|
|
1471
|
+
|
|
1472
|
+
export interface LocalizedLinkProps
|
|
1473
|
+
extends JSX.HTMLAttributes<HTMLAnchorElement> {
|
|
1474
|
+
href: string;
|
|
1475
|
+
replace?: boolean; // Optional: um den Verlauf zu ersetzen
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
/**
|
|
1479
|
+
* Hilfsfunktion, um zu überprüfen, ob eine gegebene URL extern ist.
|
|
1480
|
+
* Wenn die URL mit http:// oder https:// beginnt, wird sie als extern betrachtet.
|
|
1481
|
+
*/
|
|
1482
|
+
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1483
|
+
/^https?:\/\//.test(href ?? "");
|
|
1484
|
+
|
|
1485
|
+
/**
|
|
1486
|
+
* Eine benutzerdefinierte Link-Komponente, die das href-Attribut basierend auf der aktuellen Spracheinstellung anpasst.
|
|
1487
|
+
* Für interne Links verwendet sie `getLocalizedUrl`, um die URL mit der Sprache zu präfixen (z. B. /de/about).
|
|
1488
|
+
* Dies stellt sicher, dass die Navigation im gleichen Sprachkontext bleibt.
|
|
1489
|
+
* Sie verwendet ein Standard-<a>-Tag, kann jedoch die clientseitige Navigation mit der `route`-Funktion von preact-iso auslösen.
|
|
1490
|
+
*/
|
|
1491
|
+
export const LocalizedLink = forwardRef<HTMLAnchorElement, LocalizedLinkProps>(
|
|
1492
|
+
({ href, children, onClick, replace = false, ...props }, ref) => {
|
|
1493
|
+
const { locale } = useLocale();
|
|
1494
|
+
const location = useLocation(); // von preact-iso
|
|
1495
|
+
const isExternalLink = checkIsExternalLink(href);
|
|
1496
|
+
|
|
1497
|
+
const hrefI18n =
|
|
1498
|
+
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1499
|
+
|
|
1500
|
+
const handleClick = (event: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {
|
|
1501
|
+
if (onClick) {
|
|
1502
|
+
onClick(event);
|
|
1503
|
+
}
|
|
1504
|
+
if (
|
|
1505
|
+
!isExternalLink &&
|
|
1506
|
+
href && // Sicherstellen, dass href definiert ist
|
|
1507
|
+
event.button === 0 && // Linksklick
|
|
1508
|
+
!event.metaKey &&
|
|
1509
|
+
!event.ctrlKey &&
|
|
1510
|
+
!event.shiftKey &&
|
|
1511
|
+
!event.altKey && // Standard-Modifikatoren prüfen
|
|
1512
|
+
!props.target // Kein Ziel für neuen Tab/Fenster
|
|
1513
|
+
) {
|
|
1514
|
+
event.preventDefault();
|
|
1515
|
+
if (location.url !== hrefI18n) {
|
|
1516
|
+
// Nur navigieren, wenn die URL unterschiedlich ist
|
|
1517
|
+
route(hrefI18n, replace); // Verwenden von preact-iso's route
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1520
|
+
};
|
|
1521
|
+
|
|
1522
|
+
return (
|
|
1523
|
+
<a href={hrefI18n} ref={ref} onClick={handleClick} {...props}>
|
|
1524
|
+
{children}
|
|
1525
|
+
</a>
|
|
1526
|
+
);
|
|
1527
|
+
}
|
|
1528
|
+
);
|
|
1529
|
+
```
|
|
1530
|
+
|
|
1531
|
+
```jsx fileName="src/components/LocalizedLink.jsx" codeFormat="esm"
|
|
1532
|
+
import { getLocalizedUrl } from "intlayer";
|
|
1533
|
+
import { useLocale } from "preact-intlayer";
|
|
1534
|
+
|
|
1535
|
+
import { useLocation, route } from "preact-iso"; // Import aus preact-iso
|
|
1536
|
+
import { forwardRef } from "preact/compat";
|
|
1537
|
+
import { h } from "preact"; // Für JSX
|
|
1538
|
+
|
|
1539
|
+
export const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1540
|
+
|
|
1541
|
+
export const LocalizedLink = forwardRef(
|
|
1542
|
+
({ href, children, onClick, replace = false, ...props }, ref) => {
|
|
1543
|
+
const { locale } = useLocale();
|
|
1544
|
+
const location = useLocation();
|
|
1545
|
+
const isExternalLink = checkIsExternalLink(href);
|
|
1546
|
+
|
|
1547
|
+
const hrefI18n =
|
|
1548
|
+
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1549
|
+
|
|
1550
|
+
const handleClick = (event) => {
|
|
1551
|
+
if (onClick) {
|
|
1552
|
+
onClick(event);
|
|
1553
|
+
}
|
|
1554
|
+
if (
|
|
1555
|
+
!isExternalLink &&
|
|
1556
|
+
href &&
|
|
1557
|
+
event.button === 0 &&
|
|
1558
|
+
!event.metaKey &&
|
|
1559
|
+
!event.ctrlKey &&
|
|
1560
|
+
!event.shiftKey &&
|
|
1561
|
+
!event.altKey &&
|
|
1562
|
+
!props.target
|
|
1563
|
+
) {
|
|
1564
|
+
event.preventDefault();
|
|
1565
|
+
if (location.url !== hrefI18n) {
|
|
1566
|
+
route(hrefI18n, replace);
|
|
1567
|
+
}
|
|
1568
|
+
}
|
|
1569
|
+
};
|
|
1570
|
+
|
|
1571
|
+
return (
|
|
1572
|
+
<a href={hrefI18n} ref={ref} onClick={handleClick} {...props}>
|
|
1573
|
+
{children}
|
|
1574
|
+
</a>
|
|
1575
|
+
);
|
|
1576
|
+
}
|
|
1577
|
+
);
|
|
1578
|
+
```
|
|
1579
|
+
|
|
1580
|
+
```jsx fileName="src/components/LocalizedLink.cjsx" codeFormat="commonjs"
|
|
1581
|
+
const { getLocalizedUrl } = require("intlayer");
|
|
1582
|
+
const { useLocale } = require("preact-intlayer");
|
|
1583
|
+
const { useLocation, route } = require("preact-iso"); // Import aus preact-iso
|
|
1584
|
+
const { forwardRef } = require("preact/compat");
|
|
1585
|
+
const { h } = require("preact"); // Für JSX
|
|
1586
|
+
|
|
1587
|
+
const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1588
|
+
|
|
1589
|
+
const LocalizedLink = forwardRef(
|
|
1590
|
+
({ href, children, onClick, replace = false, ...props }, ref) => {
|
|
1591
|
+
const { locale } = useLocale();
|
|
1592
|
+
const location = useLocation();
|
|
1593
|
+
const isExternalLink = checkIsExternalLink(href);
|
|
1594
|
+
|
|
1595
|
+
const hrefI18n =
|
|
1596
|
+
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1597
|
+
|
|
1598
|
+
const handleClick = (event) => {
|
|
1599
|
+
if (onClick) {
|
|
1600
|
+
onClick(event);
|
|
1601
|
+
}
|
|
1602
|
+
if (
|
|
1603
|
+
!isExternalLink &&
|
|
1604
|
+
href &&
|
|
1605
|
+
event.button === 0 &&
|
|
1606
|
+
!event.metaKey &&
|
|
1607
|
+
!event.ctrlKey &&
|
|
1608
|
+
!event.shiftKey &&
|
|
1609
|
+
!event.altKey &&
|
|
1610
|
+
!props.target
|
|
1611
|
+
) {
|
|
1612
|
+
event.preventDefault();
|
|
1613
|
+
if (location.url !== hrefI18n) {
|
|
1614
|
+
route(hrefI18n, replace);
|
|
1615
|
+
}
|
|
1616
|
+
}
|
|
1617
|
+
};
|
|
1618
|
+
|
|
1619
|
+
return (
|
|
1620
|
+
<a href={hrefI18n} ref={ref} onClick={handleClick} {...props}>
|
|
1621
|
+
{children}
|
|
1622
|
+
</a>
|
|
1623
|
+
);
|
|
1624
|
+
}
|
|
1625
|
+
);
|
|
1626
|
+
|
|
1627
|
+
module.exports = { LocalizedLink, checkIsExternalLink };
|
|
1628
|
+
```
|
|
1629
|
+
|
|
1630
|
+
#### Wie es funktioniert
|
|
1631
|
+
|
|
1632
|
+
- **Erkennung externer Links**:
|
|
1633
|
+
Die Hilfsfunktion `checkIsExternalLink` bestimmt, ob eine URL extern ist. Externe Links bleiben unverändert.
|
|
1634
|
+
- **Abrufen der aktuellen Spracheinstellung**:
|
|
1635
|
+
Der Hook `useLocale` liefert die aktuelle Spracheinstellung.
|
|
1636
|
+
- **Lokalisierung der URL**:
|
|
1637
|
+
Für interne Links fügt `getLocalizedUrl` die aktuelle Spracheinstellung als Präfix zur URL hinzu.
|
|
1638
|
+
- **Client-seitige Navigation**:
|
|
1639
|
+
Die Funktion `handleClick` prüft, ob es sich um einen internen Link handelt und ob die Standardnavigation verhindert werden soll. Falls ja, wird die `route`-Funktion von `preact-iso` (über `useLocation` oder direkt importiert) verwendet, um eine client-seitige Navigation durchzuführen. Dies ermöglicht ein SPA-ähnliches Verhalten ohne vollständige Seitenneuladen.
|
|
1640
|
+
- **Rückgabe des Links**:
|
|
1641
|
+
Die Komponente gibt ein `<a>`-Element mit der lokalisierten URL und dem benutzerdefinierten Klick-Handler zurück.
|
|
1642
|
+
|
|
1643
|
+
### TypeScript konfigurieren
|
|
1644
|
+
|
|
1645
|
+
Intlayer verwendet Modulerweiterung, um die Vorteile von TypeScript zu nutzen und Ihren Code robuster zu machen.
|
|
1646
|
+
|
|
1647
|
+

|
|
1648
|
+
|
|
1649
|
+

|
|
1650
|
+
|
|
1651
|
+
Stellen Sie sicher, dass Ihre TypeScript-Konfiguration die automatisch generierten Typen enthält.
|
|
1652
|
+
|
|
1653
|
+
```json5 fileName="tsconfig.json"
|
|
1654
|
+
{
|
|
1655
|
+
// ... Ihre bestehenden TypeScript-Konfigurationen
|
|
1656
|
+
"compilerOptions": {
|
|
1657
|
+
// ...
|
|
1658
|
+
"jsx": "react-jsx",
|
|
1659
|
+
"jsxImportSource": "preact", // Empfohlen für Preact 10+
|
|
1660
|
+
// ...
|
|
1661
|
+
},
|
|
1662
|
+
"include": [
|
|
1663
|
+
// ... Ihre bestehenden TypeScript-Konfigurationen
|
|
1664
|
+
".intlayer/**/*.ts", // Einbeziehen der automatisch generierten Typen
|
|
1665
|
+
],
|
|
1666
|
+
}
|
|
1667
|
+
```
|
|
1668
|
+
|
|
1669
|
+
> Stellen Sie sicher, dass Ihre `tsconfig.json` für Preact eingerichtet ist, insbesondere `jsx` und `jsxImportSource` oder `jsxFactory`/`jsxFragmentFactory` für ältere Preact-Versionen, falls Sie nicht die Standardwerte von `preset-vite` verwenden.
|
|
1670
|
+
|
|
1671
|
+
### Git-Konfiguration
|
|
1672
|
+
|
|
1673
|
+
Es wird empfohlen, die von Intlayer generierten Dateien zu ignorieren. Dadurch vermeiden Sie, diese in Ihr Git-Repository einzufügen.
|
|
1674
|
+
|
|
1675
|
+
Fügen Sie dazu die folgenden Anweisungen zu Ihrer `.gitignore`-Datei hinzu:
|
|
1676
|
+
|
|
1677
|
+
```plaintext
|
|
1678
|
+
# Ignorieren der von Intlayer generierten Dateien
|
|
1679
|
+
.intlayer
|
|
1680
|
+
```
|
|
1681
|
+
|
|
1682
|
+
### VS Code-Erweiterung
|
|
1683
|
+
|
|
1684
|
+
Um Ihre Entwicklungserfahrung mit Intlayer zu verbessern, können Sie die offizielle **Intlayer VS Code-Erweiterung** installieren.
|
|
1685
|
+
|
|
1686
|
+
[Installieren Sie sie aus dem VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
1687
|
+
|
|
1688
|
+
Diese Erweiterung bietet:
|
|
1689
|
+
|
|
1690
|
+
- **Autovervollständigung** für Übersetzungsschlüssel.
|
|
1691
|
+
- **Echtzeit-Fehlererkennung** für fehlende Übersetzungen.
|
|
1692
|
+
- **Inline-Vorschauen** von übersetzten Inhalten.
|
|
1693
|
+
- **Schnellaktionen**, um Übersetzungen einfach zu erstellen und zu aktualisieren.
|
|
1694
|
+
|
|
1695
|
+
Weitere Details zur Verwendung der Erweiterung finden Sie in der [Intlayer VS Code-Erweiterungsdokumentation](https://intlayer.org/doc/vs-code-extension).
|
|
1696
|
+
|
|
1697
|
+
---
|
|
1698
|
+
|
|
1699
|
+
### Weiterführende Schritte
|
|
1700
|
+
|
|
1701
|
+
Um weiterzugehen, können Sie den [visuellen Editor](https://github.com/aymericzip/intlayer/blob/main/docs/de/intlayer_visual_editor.md) implementieren oder Ihre Inhalte mit dem [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/de/intlayer_CMS.md) auslagern.
|