@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,1601 @@
|
|
|
1
|
+
# IntlayerとViteおよびPreactを使用した国際化(i18n)の開始
|
|
2
|
+
|
|
3
|
+
> このパッケージは開発中です。詳細については[この問題](https://github.com/aymericzip/intlayer/issues/118)をご覧ください。Preact向けのIntlayerに興味がある場合は、この問題に「いいね」をしてください。
|
|
4
|
+
|
|
5
|
+
GitHub上の[アプリケーションテンプレート](https://github.com/aymericzip/intlayer-vite-preact-template)をご覧ください。
|
|
6
|
+
|
|
7
|
+
## Intlayerとは?
|
|
8
|
+
|
|
9
|
+
**Intlayer**は、モダンなウェブアプリケーションで多言語サポートを簡素化するために設計された革新的なオープンソースの国際化(i18n)ライブラリです。
|
|
10
|
+
|
|
11
|
+
Intlayerを使用すると、以下が可能です:
|
|
12
|
+
|
|
13
|
+
- **コンポーネントレベルで宣言的な辞書を使用して翻訳を簡単に管理**。
|
|
14
|
+
- **メタデータ、ルート、およびコンテンツを動的にローカライズ**。
|
|
15
|
+
- **自動生成された型でTypeScriptサポートを確保**し、オートコンプリートとエラー検出を向上。
|
|
16
|
+
- **動的なロケール検出と切り替え**などの高度な機能を活用。
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## ViteとPreactアプリケーションでのIntlayerセットアップのステップバイステップガイド
|
|
21
|
+
|
|
22
|
+
### ステップ1: 依存関係のインストール
|
|
23
|
+
|
|
24
|
+
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
|
+
設定管理、翻訳、[コンテンツ宣言](https://github.com/aymericzip/intlayer/blob/main/docs/ja/dictionary/get_started.md)、トランスパイル、および[CLIコマンド](https://github.com/aymericzip/intlayer/blob/main/docs/ja/intlayer_cli.md)を提供するコアパッケージ。
|
|
41
|
+
|
|
42
|
+
- **preact-intlayer**
|
|
43
|
+
IntlayerをPreactアプリケーションに統合するパッケージ。Preactの国際化のためのコンテキストプロバイダーとフックを提供します。
|
|
44
|
+
|
|
45
|
+
- **vite-intlayer**
|
|
46
|
+
[Viteバンドラー](https://vite.dev/guide/why.html#why-bundle-for-production)とIntlayerを統合するためのViteプラグインを含み、ユーザーの優先ロケールを検出し、クッキーを管理し、URLリダイレクトを処理するミドルウェアを提供します。
|
|
47
|
+
|
|
48
|
+
### ステップ2: プロジェクトの設定
|
|
49
|
+
|
|
50
|
+
アプリケーションの言語を設定するための設定ファイルを作成します:
|
|
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
|
+
// 他のロケール
|
|
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
|
+
// 他のロケール
|
|
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
|
+
// 他のロケール
|
|
100
|
+
],
|
|
101
|
+
defaultLocale: Locales.ENGLISH,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
module.exports = config;
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
> この設定ファイルを通じて、ローカライズされたURL、ミドルウェアリダイレクト、クッキー名、コンテンツ宣言の場所と拡張子、コンソールでのIntlayerログの無効化などを設定できます。利用可能なパラメータの完全なリストについては、[設定ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/ja/configuration.md)を参照してください。
|
|
109
|
+
|
|
110
|
+
### ステップ3: Vite設定へのIntlayerの統合
|
|
111
|
+
|
|
112
|
+
設定にintlayerプラグインを追加します。
|
|
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
|
+
> `intlayerPlugin()` Viteプラグインは、IntlayerをViteと統合するために使用されます。これにより、コンテンツ宣言ファイルのビルドが確保され、開発モードで監視されます。また、Viteアプリケーション内でIntlayer環境変数を定義し、パフォーマンスを最適化するエイリアスを提供します。
|
|
148
|
+
|
|
149
|
+
### ステップ4: コンテンツの宣言
|
|
150
|
+
|
|
151
|
+
翻訳を保存するためのコンテンツ宣言を作成および管理します:
|
|
152
|
+
|
|
153
|
+
```tsx fileName="src/app.content.tsx" contentDeclarationFormat="typescript"
|
|
154
|
+
import { t, type Dictionary } from "intlayer";
|
|
155
|
+
|
|
156
|
+
const appContent = {
|
|
157
|
+
key: "app",
|
|
158
|
+
content: {
|
|
159
|
+
viteLogo: t({
|
|
160
|
+
ja: "Viteロゴ",
|
|
161
|
+
en: "Vite logo",
|
|
162
|
+
fr: "Logo Vite",
|
|
163
|
+
es: "Logo Vite",
|
|
164
|
+
}),
|
|
165
|
+
preactLogo: t({
|
|
166
|
+
ja: "Preactロゴ",
|
|
167
|
+
en: "Preact logo",
|
|
168
|
+
fr: "Logo Preact",
|
|
169
|
+
es: "Logo Preact",
|
|
170
|
+
}),
|
|
171
|
+
|
|
172
|
+
title: "Vite + Preact",
|
|
173
|
+
|
|
174
|
+
count: t({
|
|
175
|
+
ja: "カウントは ",
|
|
176
|
+
en: "count is ",
|
|
177
|
+
fr: "le compte est ",
|
|
178
|
+
es: "el recuento es ",
|
|
179
|
+
}),
|
|
180
|
+
|
|
181
|
+
edit: t({
|
|
182
|
+
ja: "<code>src/app.tsx</code>を編集して保存し、HMRをテストしてください",
|
|
183
|
+
en: "Edit src/app.tsx and save to test HMR",
|
|
184
|
+
fr: "Éditez src/app.tsx et enregistrez pour tester HMR",
|
|
185
|
+
es: "Edita src/app.tsx y guarda para probar HMR",
|
|
186
|
+
}),
|
|
187
|
+
|
|
188
|
+
readTheDocs: t({
|
|
189
|
+
ja: "ViteとPreactのロゴをクリックして詳細を確認してください",
|
|
190
|
+
en: "Click on the Vite and Preact logos to learn more",
|
|
191
|
+
fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
|
|
192
|
+
es: "Haga clic en los logotipos de Vite y Preact para obtener más información",
|
|
193
|
+
}),
|
|
194
|
+
},
|
|
195
|
+
} satisfies Dictionary;
|
|
196
|
+
|
|
197
|
+
export default appContent;
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
```javascript fileName="src/app.content.mjs" contentDeclarationFormat="esm"
|
|
201
|
+
import { t } from "intlayer";
|
|
202
|
+
// import { h } from 'preact'; // JSXを.mjsで直接使用する場合に必要
|
|
203
|
+
|
|
204
|
+
/** @type {import('intlayer').Dictionary} */
|
|
205
|
+
const appContent = {
|
|
206
|
+
key: "app",
|
|
207
|
+
content: {
|
|
208
|
+
viteLogo: t({
|
|
209
|
+
ja: "Viteロゴ",
|
|
210
|
+
en: "Vite logo",
|
|
211
|
+
fr: "Logo Vite",
|
|
212
|
+
es: "Logo Vite",
|
|
213
|
+
}),
|
|
214
|
+
preactLogo: t({
|
|
215
|
+
ja: "Preactロゴ",
|
|
216
|
+
en: "Preact logo",
|
|
217
|
+
fr: "Logo Preact",
|
|
218
|
+
es: "Logo Preact",
|
|
219
|
+
}),
|
|
220
|
+
|
|
221
|
+
title: "Vite + Preact",
|
|
222
|
+
|
|
223
|
+
count: t({
|
|
224
|
+
ja: "カウントは ",
|
|
225
|
+
en: "count is ",
|
|
226
|
+
fr: "le compte est ",
|
|
227
|
+
es: "el recuento es ",
|
|
228
|
+
}),
|
|
229
|
+
|
|
230
|
+
edit: t({
|
|
231
|
+
ja: "src/app.jsxを編集して保存し、HMRをテストしてください",
|
|
232
|
+
en: "Edit src/app.jsx and save to test HMR",
|
|
233
|
+
fr: "Éditez src/app.jsx et enregistrez pour tester HMR",
|
|
234
|
+
es: "Edita src/app.jsx y guarda para probar HMR",
|
|
235
|
+
}),
|
|
236
|
+
|
|
237
|
+
readTheDocs: t({
|
|
238
|
+
ja: "ViteとPreactのロゴをクリックして詳細を確認してください",
|
|
239
|
+
en: "Click on the Vite and Preact logos to learn more",
|
|
240
|
+
fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
|
|
241
|
+
es: "Haga clic en los logotipos de Vite y Preact para obtener más información",
|
|
242
|
+
}),
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
export default appContent;
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
```javascript fileName="src/app.content.cjs" contentDeclarationFormat="commonjs"
|
|
250
|
+
const { t } = require("intlayer");
|
|
251
|
+
// const { h } = require('preact'); // JSXを.cjsで直接使用する場合に必要
|
|
252
|
+
|
|
253
|
+
/** @type {import('intlayer').Dictionary} */
|
|
254
|
+
const appContent = {
|
|
255
|
+
key: "app",
|
|
256
|
+
content: {
|
|
257
|
+
viteLogo: t({
|
|
258
|
+
ja: "Viteロゴ",
|
|
259
|
+
en: "Vite logo",
|
|
260
|
+
fr: "Logo Vite",
|
|
261
|
+
es: "Logo Vite",
|
|
262
|
+
}),
|
|
263
|
+
preactLogo: t({
|
|
264
|
+
ja: "Preactロゴ",
|
|
265
|
+
en: "Preact logo",
|
|
266
|
+
fr: "Logo Preact",
|
|
267
|
+
es: "Logo Preact",
|
|
268
|
+
}),
|
|
269
|
+
|
|
270
|
+
title: "Vite + Preact",
|
|
271
|
+
|
|
272
|
+
count: t({
|
|
273
|
+
en: "count is ",
|
|
274
|
+
fr: "le compte est ",
|
|
275
|
+
es: "el recuento es ",
|
|
276
|
+
ja: "カウントは ",
|
|
277
|
+
}),
|
|
278
|
+
|
|
279
|
+
edit: t({
|
|
280
|
+
ja: "<code>src/app.tsx</code>を編集して保存し、HMRをテストしてください",
|
|
281
|
+
en: "Edit src/app.tsx and save to test HMR",
|
|
282
|
+
fr: "Éditez src/app.tsx et enregistrez pour tester HMR",
|
|
283
|
+
es: "Edita src/app.tsx y guarda para probar HMR",
|
|
284
|
+
}),
|
|
285
|
+
|
|
286
|
+
readTheDocs: t({
|
|
287
|
+
en: "Click on the Vite and Preact logos to learn more",
|
|
288
|
+
fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
|
|
289
|
+
es: "Haga clic en los logotipos de Vite y Preact para obtener más información",
|
|
290
|
+
ja: "ViteとPreactのロゴをクリックして詳細を確認してください",
|
|
291
|
+
}),
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
module.exports = appContent;
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
```json fileName="src/app.content.json" contentDeclarationFormat="json"
|
|
299
|
+
{
|
|
300
|
+
"$schema": "https://intlayer.org/schema.json",
|
|
301
|
+
"key": "app",
|
|
302
|
+
"content": {
|
|
303
|
+
"viteLogo": {
|
|
304
|
+
"nodeType": "translation",
|
|
305
|
+
"translation": {
|
|
306
|
+
"en": "Vite logo",
|
|
307
|
+
"fr": "Logo Vite",
|
|
308
|
+
"es": "Logo Vite",
|
|
309
|
+
"ja": "Viteロゴ"
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
"preactLogo": {
|
|
313
|
+
"nodeType": "translation",
|
|
314
|
+
"translation": {
|
|
315
|
+
"en": "Preact logo",
|
|
316
|
+
"fr": "Logo Preact",
|
|
317
|
+
"es": "Logo Preact",
|
|
318
|
+
"ja": "Preactロゴ"
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
"title": {
|
|
322
|
+
"nodeType": "translation",
|
|
323
|
+
"translation": {
|
|
324
|
+
"en": "Vite + Preact",
|
|
325
|
+
"fr": "Vite + Preact",
|
|
326
|
+
"es": "Vite + Preact",
|
|
327
|
+
"ja": "Vite + Preact"
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"count": {
|
|
331
|
+
"nodeType": "translation",
|
|
332
|
+
"translation": {
|
|
333
|
+
"en": "count is ",
|
|
334
|
+
"fr": "le compte est ",
|
|
335
|
+
"es": "el recuento es ",
|
|
336
|
+
"ja": "カウントは "
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
"edit": {
|
|
340
|
+
"nodeType": "translation",
|
|
341
|
+
"translation": {
|
|
342
|
+
"en": "Edit src/app.tsx and save to test HMR",
|
|
343
|
+
"fr": "Éditez src/app.tsx et enregistrez pour tester HMR",
|
|
344
|
+
"es": "Edita src/app.tsx y guarda para probar HMR",
|
|
345
|
+
"ja": "src/app.tsxを編集して保存し、HMRをテストしてください"
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
"readTheDocs": {
|
|
349
|
+
"nodeType": "translation",
|
|
350
|
+
"translation": {
|
|
351
|
+
"en": "Click on the Vite and Preact logos to learn more",
|
|
352
|
+
"fr": "Cliquez sur les logos Vite et Preact pour en savoir plus",
|
|
353
|
+
"es": "Haga clic en los logotipos de Vite y Preact para obtener más información",
|
|
354
|
+
"ja": "ViteとPreactのロゴをクリックして詳細を確認してください"
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
> コンテンツ宣言は、`contentDir`ディレクトリ(デフォルトでは`./src`)に含まれている限り、アプリケーション内のどこにでも定義できます。また、コンテンツ宣言ファイルの拡張子(デフォルトでは`.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)と一致する必要があります。
|
|
362
|
+
|
|
363
|
+
> 詳細については、[コンテンツ宣言ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/ja/dictionary/get_started.md)を参照してください。
|
|
364
|
+
|
|
365
|
+
> コンテンツファイルにTSXコードが含まれている場合、`import { h } from "preact";`をインポートするか、JSXプラグマがPreact用に正しく設定されていることを確認する必要があります。
|
|
366
|
+
|
|
367
|
+
### ステップ5: コード内でIntlayerを利用する
|
|
368
|
+
|
|
369
|
+
アプリケーション全体でコンテンツ辞書にアクセスします:
|
|
370
|
+
|
|
371
|
+
```tsx {6,10} fileName="src/app.tsx" codeFormat="typescript"
|
|
372
|
+
import { useState } from "preact/hooks";
|
|
373
|
+
import type { FunctionalComponent } from "preact";
|
|
374
|
+
import preactLogo from "./assets/preact.svg"; // preact.svgを使用していると仮定
|
|
375
|
+
import viteLogo from "/vite.svg";
|
|
376
|
+
import "./app.css"; // CSSファイル名がapp.cssであると仮定
|
|
377
|
+
import { IntlayerProvider, useIntlayer } from "preact-intlayer";
|
|
378
|
+
|
|
379
|
+
const AppContent: FunctionalComponent = () => {
|
|
380
|
+
const [count, setCount] = useState(0);
|
|
381
|
+
const content = useIntlayer("app");
|
|
382
|
+
|
|
383
|
+
return (
|
|
384
|
+
<>
|
|
385
|
+
<div>
|
|
386
|
+
<a href="https://vitejs.dev" target="_blank">
|
|
387
|
+
<img src={viteLogo} class="logo" alt={content.viteLogo.value} />
|
|
388
|
+
</a>
|
|
389
|
+
<a href="https://preactjs.com" target="_blank">
|
|
390
|
+
<img
|
|
391
|
+
src={preactLogo}
|
|
392
|
+
class="logo preact"
|
|
393
|
+
alt={content.preactLogo.value}
|
|
394
|
+
/>
|
|
395
|
+
</a>
|
|
396
|
+
</div>
|
|
397
|
+
<h1>{content.title}</h1>
|
|
398
|
+
<div class="card">
|
|
399
|
+
<button onClick={() => setCount((count) => count + 1)}>
|
|
400
|
+
{content.count}
|
|
401
|
+
{count}
|
|
402
|
+
</button>
|
|
403
|
+
<p>{content.edit}</p>
|
|
404
|
+
</div>
|
|
405
|
+
<p class="read-the-docs">{content.readTheDocs}</p>
|
|
406
|
+
</>
|
|
407
|
+
);
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
const App: FunctionalComponent = () => (
|
|
411
|
+
<IntlayerProvider>
|
|
412
|
+
<AppContent />
|
|
413
|
+
</IntlayerProvider>
|
|
414
|
+
);
|
|
415
|
+
|
|
416
|
+
export default App;
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
```jsx {5,9} fileName="src/app.jsx" codeFormat="esm"
|
|
420
|
+
import { useState } from "preact/hooks";
|
|
421
|
+
import preactLogo from "./assets/preact.svg";
|
|
422
|
+
import viteLogo from "/vite.svg";
|
|
423
|
+
import "./app.css";
|
|
424
|
+
import { IntlayerProvider, useIntlayer } from "preact-intlayer";
|
|
425
|
+
|
|
426
|
+
const AppContent = () => {
|
|
427
|
+
const [count, setCount] = useState(0);
|
|
428
|
+
const content = useIntlayer("app");
|
|
429
|
+
|
|
430
|
+
return (
|
|
431
|
+
<>
|
|
432
|
+
<div>
|
|
433
|
+
<a href="https://vitejs.dev" target="_blank">
|
|
434
|
+
<img src={viteLogo} class="logo" alt={content.viteLogo.value} />
|
|
435
|
+
</a>
|
|
436
|
+
<a href="https://preactjs.com" target="_blank">
|
|
437
|
+
<img
|
|
438
|
+
src={preactLogo}
|
|
439
|
+
class="logo preact"
|
|
440
|
+
alt={content.preactLogo.value}
|
|
441
|
+
/>
|
|
442
|
+
</a>
|
|
443
|
+
</div>
|
|
444
|
+
<h1>{content.title}</h1>
|
|
445
|
+
<div class="card">
|
|
446
|
+
<button onClick={() => setCount((count) => count + 1)}>
|
|
447
|
+
{content.count}
|
|
448
|
+
{count}
|
|
449
|
+
</button>
|
|
450
|
+
<p>{content.edit}</p>
|
|
451
|
+
</div>
|
|
452
|
+
<p class="read-the-docs">{content.readTheDocs}</p>
|
|
453
|
+
</>
|
|
454
|
+
);
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
const App = () => (
|
|
458
|
+
<IntlayerProvider>
|
|
459
|
+
<AppContent />
|
|
460
|
+
</IntlayerProvider>
|
|
461
|
+
);
|
|
462
|
+
|
|
463
|
+
export default App;
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
```jsx {5,9} fileName="src/app.cjsx" codeFormat="commonjs"
|
|
467
|
+
const { useState } = require("preact/hooks");
|
|
468
|
+
const preactLogo = require("./assets/preact.svg");
|
|
469
|
+
const viteLogo = require("/vite.svg");
|
|
470
|
+
require("./app.css");
|
|
471
|
+
const { IntlayerProvider, useIntlayer } = require("preact-intlayer");
|
|
472
|
+
|
|
473
|
+
const AppContent = () => {
|
|
474
|
+
const [count, setCount] = useState(0);
|
|
475
|
+
const content = useIntlayer("app");
|
|
476
|
+
|
|
477
|
+
return (
|
|
478
|
+
<>
|
|
479
|
+
<div>
|
|
480
|
+
<a href="https://vitejs.dev" target="_blank">
|
|
481
|
+
<img src={viteLogo} class="logo" alt={content.viteLogo.value} />
|
|
482
|
+
</a>
|
|
483
|
+
<a href="https://preactjs.com" target="_blank">
|
|
484
|
+
<img
|
|
485
|
+
src={preactLogo}
|
|
486
|
+
class="logo preact"
|
|
487
|
+
alt={content.preactLogo.value}
|
|
488
|
+
/>
|
|
489
|
+
</a>
|
|
490
|
+
</div>
|
|
491
|
+
<h1>{content.title}</h1>
|
|
492
|
+
<div class="card">
|
|
493
|
+
<button onClick={() => setCount((count) => count + 1)}>
|
|
494
|
+
{content.count}
|
|
495
|
+
{count}
|
|
496
|
+
</button>
|
|
497
|
+
<p>{content.edit}</p>
|
|
498
|
+
</div>
|
|
499
|
+
<p class="read-the-docs">{content.readTheDocs}</p>
|
|
500
|
+
</>
|
|
501
|
+
);
|
|
502
|
+
};
|
|
503
|
+
|
|
504
|
+
const App = () => (
|
|
505
|
+
<IntlayerProvider>
|
|
506
|
+
<AppContent />
|
|
507
|
+
</IntlayerProvider>
|
|
508
|
+
);
|
|
509
|
+
|
|
510
|
+
module.exports = App;
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
> `alt`、`title`、`href`、`aria-label`などの`string`属性でコンテンツを使用する場合、関数の値を呼び出す必要があります:
|
|
514
|
+
|
|
515
|
+
> ```jsx
|
|
516
|
+
>
|
|
517
|
+
> ```
|
|
518
|
+
|
|
519
|
+
> <img src={content.image.src.value} alt={content.image.value} />
|
|
520
|
+
|
|
521
|
+
> ```
|
|
522
|
+
>
|
|
523
|
+
> ```
|
|
524
|
+
|
|
525
|
+
> 注: Preactでは、`className`は通常`class`として記述されます。
|
|
526
|
+
|
|
527
|
+
> `useIntlayer`フックの詳細については、[ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/ja/packages/react-intlayer/useIntlayer.md)を参照してください(`preact-intlayer`のAPIも同様です)。
|
|
528
|
+
|
|
529
|
+
### (オプション)ステップ6: コンテンツの言語を変更する
|
|
530
|
+
|
|
531
|
+
コンテンツの言語を変更するには、`useLocale`フックが提供する`setLocale`関数を使用します。この関数を使用して、アプリケーションのロケールを設定し、コンテンツを更新できます。
|
|
532
|
+
|
|
533
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
534
|
+
import type { FunctionalComponent } from "preact";
|
|
535
|
+
import { Locales } from "intlayer";
|
|
536
|
+
import { useLocale } from "preact-intlayer";
|
|
537
|
+
|
|
538
|
+
const LocaleSwitcher: FunctionalComponent = () => {
|
|
539
|
+
const { setLocale } = useLocale();
|
|
540
|
+
|
|
541
|
+
return (
|
|
542
|
+
<button onClick={() => setLocale(Locales.ENGLISH)}>
|
|
543
|
+
言語を英語に変更
|
|
544
|
+
|
|
545
|
+
import { Locales } from "intlayer";
|
|
546
|
+
import { useLocale } from "preact-intlayer";
|
|
547
|
+
|
|
548
|
+
const LocaleSwitcher = () => {
|
|
549
|
+
const { setLocale } = useLocale();
|
|
550
|
+
|
|
551
|
+
return (
|
|
552
|
+
<button onClick={() => setLocale(Locales.ENGLISH)}>
|
|
553
|
+
言語を英語に変更
|
|
554
|
+
</button>
|
|
555
|
+
);
|
|
556
|
+
};
|
|
557
|
+
|
|
558
|
+
export default LocaleSwitcher;
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
```jsx fileName="src/components/LocaleSwitcher.cjsx" codeFormat="commonjs"
|
|
562
|
+
const { Locales } = require("intlayer");
|
|
563
|
+
const { useLocale } = require("preact-intlayer");
|
|
564
|
+
|
|
565
|
+
const LocaleSwitcher = () => {
|
|
566
|
+
const { setLocale } = useLocale();
|
|
567
|
+
|
|
568
|
+
return (
|
|
569
|
+
<button onClick={() => setLocale(Locales.ENGLISH)}>言語を英語に変更</button>
|
|
570
|
+
);
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
module.exports = LocaleSwitcher;
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
> `useLocale` フックの詳細については、[ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/ja/packages/react-intlayer/useLocale.md) を参照してください(`preact-intlayer` の API は同様です)。
|
|
577
|
+
|
|
578
|
+
### (オプション)ステップ7: アプリケーションにローカライズされたルーティングを追加する
|
|
579
|
+
|
|
580
|
+
このステップの目的は、各言語に固有のルートを作成することです。これはSEOやSEOフレンドリーなURLに役立ちます。
|
|
581
|
+
例:
|
|
582
|
+
|
|
583
|
+
```plaintext
|
|
584
|
+
- https://example.com/about
|
|
585
|
+
- https://example.com/es/about
|
|
586
|
+
- https://example.com/fr/about
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
> デフォルトでは、デフォルトロケールのルートにはプレフィックスが付きません。デフォルトロケールにプレフィックスを付けたい場合は、設定で `middleware.prefixDefault` オプションを `true` に設定できます。詳細は[設定ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/ja/configuration.md)を参照してください。
|
|
590
|
+
|
|
591
|
+
アプリケーションにローカライズされたルーティングを追加するには、アプリケーションのルートをラップし、ロケールベースのルーティングを処理する `LocaleRouter` コンポーネントを作成できます。以下は [preact-iso](https://github.com/preactjs/preact-iso) を使用した例です。
|
|
592
|
+
|
|
593
|
+
まず、`preact-iso` をインストールします:
|
|
594
|
+
|
|
595
|
+
```bash packageManager="npm"
|
|
596
|
+
npm install preact-iso
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
```bash packageManager="pnpm"
|
|
600
|
+
pnpm add preact-iso
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
```bash packageManager="yarn"
|
|
604
|
+
yarn add preact-iso
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
608
|
+
import { type Locales, configuration, getPathWithoutLocale } from "intlayer";
|
|
609
|
+
import { ComponentChildren, FunctionalComponent } from "preact";
|
|
610
|
+
import { IntlayerProvider } from "preact-intlayer";
|
|
611
|
+
import { LocationProvider, useLocation } from "preact-iso";
|
|
612
|
+
import { useEffect } from "preact/hooks";
|
|
613
|
+
|
|
614
|
+
const { internationalization, middleware } = configuration;
|
|
615
|
+
const { locales, defaultLocale } = internationalization;
|
|
616
|
+
|
|
617
|
+
const Navigate: FunctionalComponent<{ to: string; replace?: boolean }> = ({
|
|
618
|
+
to,
|
|
619
|
+
replace,
|
|
620
|
+
}) => {
|
|
621
|
+
const { route } = useLocation();
|
|
622
|
+
useEffect(() => {
|
|
623
|
+
route(to, replace);
|
|
624
|
+
}, [to, replace, route]);
|
|
625
|
+
return null;
|
|
626
|
+
};
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* ローカリゼーションを処理し、適切なロケールコンテキストで子要素をラップするコンポーネント。
|
|
630
|
+
* URLベースのロケール検出と検証を管理します。
|
|
631
|
+
*/
|
|
632
|
+
const AppLocalized: FunctionalComponent<{
|
|
633
|
+
children: ComponentChildren;
|
|
634
|
+
locale?: Locales;
|
|
635
|
+
}> = ({ children, locale }) => {
|
|
636
|
+
const { path: pathname, url } = useLocation();
|
|
637
|
+
|
|
638
|
+
if (!url) {
|
|
639
|
+
return null;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
const search = url.substring(pathname.length);
|
|
643
|
+
|
|
644
|
+
// 現在のロケールを決定し、指定されていない場合はデフォルトにフォールバック
|
|
645
|
+
const currentLocale = locale ?? defaultLocale;
|
|
646
|
+
|
|
647
|
+
// ロケールプレフィックスを削除してベースパスを構築
|
|
648
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
649
|
+
pathname // 現在のURLパス
|
|
650
|
+
);
|
|
651
|
+
|
|
652
|
+
/**
|
|
653
|
+
* middleware.prefixDefault が true の場合、デフォルトロケールには常にプレフィックスが付く必要があります。
|
|
654
|
+
*/
|
|
655
|
+
if (middleware.prefixDefault) {
|
|
656
|
+
// ロケールを検証
|
|
657
|
+
if (!locale || !locales.includes(locale)) {
|
|
658
|
+
// 更新されたパスでデフォルトロケールにリダイレクト
|
|
659
|
+
return (
|
|
660
|
+
<Navigate
|
|
661
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
662
|
+
replace // 現在の履歴エントリを新しいものに置き換え
|
|
663
|
+
/>
|
|
664
|
+
);
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
// 子要素を IntlayerProvider でラップし、現在のロケールを設定
|
|
668
|
+
return (
|
|
669
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
670
|
+
);
|
|
671
|
+
} else {
|
|
672
|
+
/**
|
|
673
|
+
* middleware.prefixDefault が false の場合、デフォルトロケールにはプレフィックスが付きません。
|
|
674
|
+
* 現在のロケールが有効であり、デフォルトロケールではないことを確認します。
|
|
675
|
+
*/
|
|
676
|
+
if (
|
|
677
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
678
|
+
!locales
|
|
679
|
+
.filter(
|
|
680
|
+
(loc) => loc.toString() !== defaultLocale.toString() // デフォルトロケールを除外
|
|
681
|
+
)
|
|
682
|
+
.includes(currentLocale) // 現在のロケールが有効なロケールリストに含まれているか確認
|
|
683
|
+
) {
|
|
684
|
+
// ロケールプレフィックスなしのパスにリダイレクト
|
|
685
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
// 子要素を IntlayerProvider でラップし、現在のロケールを設定
|
|
689
|
+
return (
|
|
690
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
691
|
+
);
|
|
692
|
+
}
|
|
693
|
+
};
|
|
694
|
+
|
|
695
|
+
const RouterContent: FunctionalComponent<{
|
|
696
|
+
children: ComponentChildren;
|
|
697
|
+
}> = ({ children }) => {
|
|
698
|
+
const { path } = useLocation();
|
|
699
|
+
|
|
700
|
+
if (!path) {
|
|
701
|
+
return null;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
const pathLocale = path.split("/")[1] as Locales;
|
|
705
|
+
|
|
706
|
+
const isLocaleRoute = locales
|
|
707
|
+
.filter((locale) => middleware.prefixDefault || locale !== defaultLocale)
|
|
708
|
+
.some((locale) => locale.toString() === pathLocale);
|
|
709
|
+
|
|
710
|
+
if (isLocaleRoute) {
|
|
711
|
+
return <AppLocalized locale={pathLocale}>{children}</AppLocalized>;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
return (
|
|
715
|
+
<AppLocalized
|
|
716
|
+
locale={!middleware.prefixDefault ? defaultLocale : undefined}
|
|
717
|
+
>
|
|
718
|
+
{children}
|
|
719
|
+
</AppLocalized>
|
|
720
|
+
);
|
|
721
|
+
};
|
|
722
|
+
|
|
723
|
+
/**
|
|
724
|
+
* ロケール固有のルートを設定するルーターコンポーネント。
|
|
725
|
+
* preact-iso を使用してナビゲーションを管理し、ローカライズされたコンポーネントをレンダリングします。
|
|
726
|
+
*/
|
|
727
|
+
export const LocaleRouter: FunctionalComponent<{
|
|
728
|
+
children: ComponentChildren;
|
|
729
|
+
}> = ({ children }) => (
|
|
730
|
+
<LocationProvider>
|
|
731
|
+
<RouterContent>{children}</RouterContent>
|
|
732
|
+
</LocationProvider>
|
|
733
|
+
);
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
```jsx fileName="src/components/LocaleRouter.jsx" codeFormat="esm"
|
|
737
|
+
// 必要な依存関係と関数をインポート
|
|
738
|
+
import { configuration, getPathWithoutLocale } from "intlayer";
|
|
739
|
+
import { IntlayerProvider } from "preact-intlayer";
|
|
740
|
+
import { LocationProvider, useLocation } from "preact-iso";
|
|
741
|
+
import { useEffect } from "preact/hooks";
|
|
742
|
+
import { h } from "preact"; // JSX に必要
|
|
743
|
+
|
|
744
|
+
// Intlayer から設定をデストラクチャリング
|
|
745
|
+
const { internationalization, middleware } = configuration;
|
|
746
|
+
const { locales, defaultLocale } = internationalization;
|
|
747
|
+
|
|
748
|
+
const Navigate = ({ to, replace }) => {
|
|
749
|
+
const { route } = useLocation();
|
|
750
|
+
useEffect(() => {
|
|
751
|
+
route(to, replace);
|
|
752
|
+
}, [to, replace, route]);
|
|
753
|
+
return null;
|
|
754
|
+
};
|
|
755
|
+
|
|
756
|
+
/**
|
|
757
|
+
* ローカリゼーションを処理し、適切なロケールコンテキストで子要素をラップするコンポーネント。
|
|
758
|
+
* URLベースのロケール検出と検証を管理します。
|
|
759
|
+
*/
|
|
760
|
+
const AppLocalized = ({ children, locale }) => {
|
|
761
|
+
const { path: pathname, url } = useLocation();
|
|
762
|
+
|
|
763
|
+
if (!url) {
|
|
764
|
+
return null;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
const search = url.substring(pathname.length);
|
|
768
|
+
|
|
769
|
+
// 現在のロケールを決定し、指定されていない場合はデフォルトにフォールバック
|
|
770
|
+
const currentLocale = locale ?? defaultLocale;
|
|
771
|
+
|
|
772
|
+
// ロケールプレフィックスを削除してベースパスを構築
|
|
773
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
774
|
+
pathname // 現在のURLパス
|
|
775
|
+
);
|
|
776
|
+
|
|
777
|
+
/**
|
|
778
|
+
* middleware.prefixDefault が true の場合、デフォルトロケールには常にプレフィックスが付く必要があります。
|
|
779
|
+
*/
|
|
780
|
+
if (middleware.prefixDefault) {
|
|
781
|
+
// ロケールを検証
|
|
782
|
+
if (!locale || !locales.includes(locale)) {
|
|
783
|
+
// 更新されたパスでデフォルトロケールにリダイレクト
|
|
784
|
+
return (
|
|
785
|
+
<Navigate
|
|
786
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
787
|
+
replace // 現在の履歴エントリを新しいものに置き換え
|
|
788
|
+
/>
|
|
789
|
+
);
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// 子要素を IntlayerProvider でラップし、現在のロケールを設定
|
|
793
|
+
return (
|
|
794
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
795
|
+
);
|
|
796
|
+
} else {
|
|
797
|
+
/**
|
|
798
|
+
---
|
|
799
|
+
|
|
800
|
+
// 必要な依存関係と関数をインポート
|
|
801
|
+
const { configuration, getPathWithoutLocale } = require("intlayer");
|
|
802
|
+
const { IntlayerProvider } = require("preact-intlayer");
|
|
803
|
+
const { LocationProvider, useLocation } = require("preact-iso");
|
|
804
|
+
const { useEffect } = require("preact/hooks");
|
|
805
|
+
const { h } = require("preact"); // JSXのために必要
|
|
806
|
+
|
|
807
|
+
// Intlayerから設定を分解
|
|
808
|
+
const { internationalization, middleware } = configuration;
|
|
809
|
+
const { locales, defaultLocale } = internationalization;
|
|
810
|
+
|
|
811
|
+
const Navigate = ({ to, replace }) => {
|
|
812
|
+
const { route } = useLocation();
|
|
813
|
+
useEffect(() => {
|
|
814
|
+
route(to, replace);
|
|
815
|
+
}, [to, replace, route]);
|
|
816
|
+
return null;
|
|
817
|
+
};
|
|
818
|
+
|
|
819
|
+
/**
|
|
820
|
+
* ローカリゼーションを処理し、適切なロケールコンテキストで子要素をラップするコンポーネント。
|
|
821
|
+
* URLベースのロケール検出と検証を管理します。
|
|
822
|
+
*/
|
|
823
|
+
const AppLocalized = ({ children, locale }) => {
|
|
824
|
+
const { path: pathname, url } = useLocation();
|
|
825
|
+
|
|
826
|
+
if (!url) {
|
|
827
|
+
return null;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
const search = url.substring(pathname.length);
|
|
831
|
+
|
|
832
|
+
// 現在のロケールを決定し、指定されていない場合はデフォルトにフォールバック
|
|
833
|
+
const currentLocale = locale ?? defaultLocale;
|
|
834
|
+
|
|
835
|
+
// ロケールプレフィックスをパスから削除して基本パスを構築
|
|
836
|
+
const pathWithoutLocale = getPathWithoutLocale(
|
|
837
|
+
pathname // 現在のURLパス
|
|
838
|
+
);
|
|
839
|
+
|
|
840
|
+
/**
|
|
841
|
+
* middleware.prefixDefaultがtrueの場合、デフォルトロケールは常にプレフィックスされるべきです。
|
|
842
|
+
*/
|
|
843
|
+
if (middleware.prefixDefault) {
|
|
844
|
+
// ロケールを検証
|
|
845
|
+
if (!locale || !locales.includes(locale)) {
|
|
846
|
+
// 更新されたパスでデフォルトロケールにリダイレクト
|
|
847
|
+
return (
|
|
848
|
+
<Navigate
|
|
849
|
+
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
850
|
+
replace // 現在の履歴エントリを新しいものに置き換える
|
|
851
|
+
/>
|
|
852
|
+
);
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
// 子要素をIntlayerProviderでラップし、現在のロケールを設定
|
|
856
|
+
return (
|
|
857
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
858
|
+
);
|
|
859
|
+
} else {
|
|
860
|
+
/**
|
|
861
|
+
* middleware.prefixDefaultがfalseの場合、デフォルトロケールはプレフィックスされません。
|
|
862
|
+
* 現在のロケールが有効であり、デフォルトロケールでないことを確認。
|
|
863
|
+
*/
|
|
864
|
+
if (
|
|
865
|
+
currentLocale.toString() !== defaultLocale.toString() &&
|
|
866
|
+
!locales
|
|
867
|
+
.filter(
|
|
868
|
+
(loc) => loc.toString() !== defaultLocale.toString() // デフォルトロケールを除外
|
|
869
|
+
)
|
|
870
|
+
.includes(currentLocale) // 現在のロケールが有効なロケールリストに含まれているか確認
|
|
871
|
+
) {
|
|
872
|
+
// ロケールプレフィックスなしのパスにリダイレクト
|
|
873
|
+
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
// 子要素をIntlayerProviderでラップし、現在のロケールを設定
|
|
877
|
+
return (
|
|
878
|
+
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
879
|
+
);
|
|
880
|
+
}
|
|
881
|
+
};
|
|
882
|
+
|
|
883
|
+
const RouterContent = ({ children }) => {
|
|
884
|
+
const { path } = useLocation();
|
|
885
|
+
|
|
886
|
+
if (!path) {
|
|
887
|
+
return null;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
const pathLocale = path.split("/")[1];
|
|
891
|
+
|
|
892
|
+
const isLocaleRoute = locales
|
|
893
|
+
.filter((locale) => middleware.prefixDefault || locale !== defaultLocale)
|
|
894
|
+
.some((locale) => locale.toString() === pathLocale);
|
|
895
|
+
|
|
896
|
+
if (isLocaleRoute) {
|
|
897
|
+
return <AppLocalized locale={pathLocale}>{children}</AppLocalized>;
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
return (
|
|
901
|
+
<AppLocalized
|
|
902
|
+
locale={!middleware.prefixDefault ? defaultLocale : undefined}
|
|
903
|
+
>
|
|
904
|
+
{children}
|
|
905
|
+
</AppLocalized>
|
|
906
|
+
);
|
|
907
|
+
};
|
|
908
|
+
|
|
909
|
+
/**
|
|
910
|
+
* ロケール固有のルートを設定するルーターコンポーネント。
|
|
911
|
+
* preact-isoを使用してナビゲーションを管理し、ローカライズされたコンポーネントをレンダリングします。
|
|
912
|
+
*/
|
|
913
|
+
const LocaleRouter = ({ children }) => (
|
|
914
|
+
<LocationProvider>
|
|
915
|
+
<RouterContent>{children}</RouterContent>
|
|
916
|
+
</LocationProvider>
|
|
917
|
+
);
|
|
918
|
+
|
|
919
|
+
module.exports = { LocaleRouter };
|
|
920
|
+
```
|
|
921
|
+
|
|
922
|
+
次に、アプリケーションで`LocaleRouter`コンポーネントを使用します。
|
|
923
|
+
|
|
924
|
+
```tsx fileName="src/app.tsx" codeFormat="typescript"
|
|
925
|
+
import { LocaleRouter } from "./components/LocaleRouter";
|
|
926
|
+
import type { FunctionalComponent } from "preact";
|
|
927
|
+
// ... AppContentコンポーネント (ステップ5で定義)
|
|
928
|
+
|
|
929
|
+
const App: FunctionalComponent = () => (
|
|
930
|
+
<LocaleRouter>
|
|
931
|
+
<AppContent />
|
|
932
|
+
</LocaleRouter>
|
|
933
|
+
);
|
|
934
|
+
|
|
935
|
+
export default App;
|
|
936
|
+
```
|
|
937
|
+
|
|
938
|
+
```jsx fileName="src/app.jsx" codeFormat="esm"
|
|
939
|
+
import { LocaleRouter } from "./components/LocaleRouter";
|
|
940
|
+
// ... AppContentコンポーネント (ステップ5で定義)
|
|
941
|
+
|
|
942
|
+
const App = () => (
|
|
943
|
+
<LocaleRouter>
|
|
944
|
+
<AppContent />
|
|
945
|
+
</LocaleRouter>
|
|
946
|
+
);
|
|
947
|
+
|
|
948
|
+
export default App;
|
|
949
|
+
```
|
|
950
|
+
|
|
951
|
+
```jsx fileName="src/app.cjsx" codeFormat="commonjs"
|
|
952
|
+
const { LocaleRouter } = require("./components/LocaleRouter");
|
|
953
|
+
// ... AppContentコンポーネント (ステップ5で定義)
|
|
954
|
+
|
|
955
|
+
const App = () => (
|
|
956
|
+
<LocaleRouter>
|
|
957
|
+
<AppContent />
|
|
958
|
+
</LocaleRouter>
|
|
959
|
+
);
|
|
960
|
+
|
|
961
|
+
module.exports = App;
|
|
962
|
+
```
|
|
963
|
+
|
|
964
|
+
並行して、`intLayerMiddlewarePlugin`を使用して、アプリケーションにサーバーサイドルーティングを追加することもできます。このプラグインは、URLに基づいて現在のロケールを自動的に検出し、適切なロケールクッキーを設定します。ロケールが指定されていない場合、プラグインはユーザーのブラウザ言語設定に基づいて最適なロケールを決定します。ロケールが検出されない場合、デフォルトロケールにリダイレクトします。
|
|
965
|
+
|
|
966
|
+
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
967
|
+
import { defineConfig } from "vite";
|
|
968
|
+
import preact from "@preact/preset-vite";
|
|
969
|
+
import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";
|
|
970
|
+
|
|
971
|
+
// https://vitejs.dev/config/
|
|
972
|
+
export default defineConfig({
|
|
973
|
+
plugins: [preact(), intlayerPlugin(), intLayerMiddlewarePlugin()],
|
|
974
|
+
});
|
|
975
|
+
```
|
|
976
|
+
|
|
977
|
+
```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
|
|
978
|
+
import { defineConfig } from "vite";
|
|
979
|
+
import preact from "@preact/preset-vite";
|
|
980
|
+
import { intlayerPlugin, intLayerMiddlewarePlugin } from "vite-intlayer";
|
|
981
|
+
|
|
982
|
+
// https://vitejs.dev/config/
|
|
983
|
+
export default defineConfig({
|
|
984
|
+
plugins: [preact(), intlayerPlugin(), intLayerMiddlewarePlugin()],
|
|
985
|
+
});
|
|
986
|
+
```
|
|
987
|
+
|
|
988
|
+
```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
|
|
989
|
+
const { defineConfig } = require("vite");
|
|
990
|
+
const preact = require("@preact/preset-vite");
|
|
991
|
+
const { intlayerPlugin, intLayerMiddlewarePlugin } = require("vite-intlayer");
|
|
992
|
+
|
|
993
|
+
// https://vitejs.dev/config/
|
|
994
|
+
module.exports = defineConfig({
|
|
995
|
+
plugins: [preact(), intlayerPlugin(), intLayerMiddlewarePlugin()],
|
|
996
|
+
});
|
|
997
|
+
```
|
|
998
|
+
|
|
999
|
+
### (オプション) ステップ8: ロケール変更時にURLを変更
|
|
1000
|
+
|
|
1001
|
+
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
1002
|
+
import { useLocation, route } from "preact-iso";
|
|
1003
|
+
import {
|
|
1004
|
+
Locales,
|
|
1005
|
+
getHTMLTextDir,
|
|
1006
|
+
getLocaleName,
|
|
1007
|
+
getLocalizedUrl,
|
|
1008
|
+
} from "intlayer";
|
|
1009
|
+
import { useLocale } from "preact-intlayer";
|
|
1010
|
+
import type { FunctionalComponent } from "preact";
|
|
1011
|
+
|
|
1012
|
+
const LocaleSwitcher: FunctionalComponent = () => {
|
|
1013
|
+
const location = useLocation();
|
|
1014
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
1015
|
+
onLocaleChange: (newLocale) => {
|
|
1016
|
+
const currentFullPath = location.url; // preact-isoは完全なURLを提供します
|
|
1017
|
+
// 更新されたロケールでURLを構築します
|
|
1018
|
+
// 例: /es/about?foo=bar
|
|
1019
|
+
const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale);
|
|
1020
|
+
|
|
1021
|
+
// URLパスを更新します
|
|
1022
|
+
route(pathWithLocale, true); // trueはreplaceを意味します
|
|
1023
|
+
},
|
|
1024
|
+
});
|
|
1025
|
+
|
|
1026
|
+
return (
|
|
1027
|
+
<div>
|
|
1028
|
+
<button popovertarget="localePopover">{getLocaleName(locale)}</button>
|
|
1029
|
+
<div id="localePopover" popover="auto">
|
|
1030
|
+
{availableLocales.map((localeItem) => (
|
|
1031
|
+
<a
|
|
1032
|
+
href={getLocalizedUrl(location.url, localeItem)}
|
|
1033
|
+
hreflang={localeItem}
|
|
1034
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1035
|
+
onClick={(e) => {
|
|
1036
|
+
e.preventDefault();
|
|
1037
|
+
setLocale(localeItem);
|
|
1038
|
+
// ロケール設定後のプログラム的なナビゲーションはonLocaleChangeで処理されます
|
|
1039
|
+
}}
|
|
1040
|
+
key={localeItem}
|
|
1041
|
+
>
|
|
1042
|
+
<span>
|
|
1043
|
+
{/* ロケール - 例: FR */}
|
|
1044
|
+
{localeItem}
|
|
1045
|
+
</span>
|
|
1046
|
+
<span>
|
|
1047
|
+
{/* 自身のロケールでの言語 - 例: Français */}
|
|
1048
|
+
{getLocaleName(localeItem, localeItem)}
|
|
1049
|
+
</span>
|
|
1050
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1051
|
+
{/* 現在のロケールでの言語 - 例: Francés (現在のロケールがLocales.SPANISHの場合) */}
|
|
1052
|
+
{getLocaleName(localeItem, locale)}
|
|
1053
|
+
</span>
|
|
1054
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1055
|
+
{/* 英語での言語 - 例: French */}
|
|
1056
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1057
|
+
</span>
|
|
1058
|
+
</a>
|
|
1059
|
+
))}
|
|
1060
|
+
</div>
|
|
1061
|
+
</div>
|
|
1062
|
+
);
|
|
1063
|
+
};
|
|
1064
|
+
|
|
1065
|
+
export default LocaleSwitcher;
|
|
1066
|
+
```
|
|
1067
|
+
|
|
1068
|
+
```jsx fileName="src/components/LocaleSwitcher.jsx" codeFormat="esm"
|
|
1069
|
+
import { useLocation, route } from "preact-iso";
|
|
1070
|
+
import {
|
|
1071
|
+
Locales,
|
|
1072
|
+
getHTMLTextDir,
|
|
1073
|
+
getLocaleName,
|
|
1074
|
+
getLocalizedUrl,
|
|
1075
|
+
} from "intlayer";
|
|
1076
|
+
import { useLocale } from "preact-intlayer";
|
|
1077
|
+
import { h } from "preact"; // JSX用
|
|
1078
|
+
|
|
1079
|
+
const LocaleSwitcher = () => {
|
|
1080
|
+
const location = useLocation();
|
|
1081
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
1082
|
+
onLocaleChange: (newLocale) => {
|
|
1083
|
+
const currentFullPath = location.url;
|
|
1084
|
+
const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale);
|
|
1085
|
+
route(pathWithLocale, true);
|
|
1086
|
+
},
|
|
1087
|
+
});
|
|
1088
|
+
|
|
1089
|
+
return (
|
|
1090
|
+
<div>
|
|
1091
|
+
<button popovertarget="localePopover">{getLocaleName(locale)}</button>
|
|
1092
|
+
<div id="localePopover" popover="auto">
|
|
1093
|
+
{availableLocales.map((localeItem) => (
|
|
1094
|
+
<a
|
|
1095
|
+
href={getLocalizedUrl(location.url, localeItem)}
|
|
1096
|
+
hreflang={localeItem}
|
|
1097
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1098
|
+
onClick={(e) => {
|
|
1099
|
+
e.preventDefault();
|
|
1100
|
+
setLocale(localeItem);
|
|
1101
|
+
}}
|
|
1102
|
+
key={localeItem}
|
|
1103
|
+
>
|
|
1104
|
+
<span>{localeItem}</span>
|
|
1105
|
+
<span>{getLocaleName(localeItem, localeItem)}</span>
|
|
1106
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1107
|
+
{getLocaleName(localeItem, locale)}
|
|
1108
|
+
</span>
|
|
1109
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1110
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1111
|
+
</span>
|
|
1112
|
+
</a>
|
|
1113
|
+
))}
|
|
1114
|
+
</div>
|
|
1115
|
+
</div>
|
|
1116
|
+
);
|
|
1117
|
+
};
|
|
1118
|
+
|
|
1119
|
+
export default LocaleSwitcher;
|
|
1120
|
+
```
|
|
1121
|
+
|
|
1122
|
+
```jsx fileName="src/components/LocaleSwitcher.cjsx" codeFormat="commonjs"
|
|
1123
|
+
const { useLocation, route } = require("preact-iso");
|
|
1124
|
+
const {
|
|
1125
|
+
Locales,
|
|
1126
|
+
getHTMLTextDir,
|
|
1127
|
+
getLocaleName,
|
|
1128
|
+
getLocalizedUrl,
|
|
1129
|
+
} = require("intlayer");
|
|
1130
|
+
const { useLocale } = require("preact-intlayer");
|
|
1131
|
+
const { h } = require("preact"); // JSX用
|
|
1132
|
+
|
|
1133
|
+
const LocaleSwitcher = () => {
|
|
1134
|
+
const location = useLocation();
|
|
1135
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
1136
|
+
onLocaleChange: (newLocale) => {
|
|
1137
|
+
const currentFullPath = location.url;
|
|
1138
|
+
const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale);
|
|
1139
|
+
route(pathWithLocale, true);
|
|
1140
|
+
},
|
|
1141
|
+
});
|
|
1142
|
+
|
|
1143
|
+
return (
|
|
1144
|
+
<div>
|
|
1145
|
+
<button popovertarget="localePopover">{getLocaleName(locale)}</button>
|
|
1146
|
+
<div id="localePopover" popover="auto">
|
|
1147
|
+
{availableLocales.map((localeItem) => (
|
|
1148
|
+
<a
|
|
1149
|
+
href={getLocalizedUrl(location.url, localeItem)}
|
|
1150
|
+
hreflang={localeItem}
|
|
1151
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
1152
|
+
onClick={(e) => {
|
|
1153
|
+
e.preventDefault();
|
|
1154
|
+
setLocale(localeItem);
|
|
1155
|
+
}}
|
|
1156
|
+
key={localeItem}
|
|
1157
|
+
>
|
|
1158
|
+
<span>{localeItem}</span>
|
|
1159
|
+
<span>{getLocaleName(localeItem, localeItem)}</span>
|
|
1160
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1161
|
+
{getLocaleName(localeItem, locale)}
|
|
1162
|
+
</span>
|
|
1163
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1164
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1165
|
+
</span>
|
|
1166
|
+
</a>
|
|
1167
|
+
))}
|
|
1168
|
+
</div>
|
|
1169
|
+
</div>
|
|
1170
|
+
);
|
|
1171
|
+
};
|
|
1172
|
+
|
|
1173
|
+
module.exports = LocaleSwitcher;
|
|
1174
|
+
```
|
|
1175
|
+
|
|
1176
|
+
> ドキュメント参照:
|
|
1177
|
+
|
|
1178
|
+
> - [`useLocale`フック](https://github.com/aymericzip/intlayer/blob/main/docs/ja/packages/react-intlayer/useLocale.md) (`preact-intlayer`のAPIも類似)
|
|
1179
|
+
|
|
1180
|
+
> - [`getLocaleName`フック](https://github.com/aymericzip/intlayer/blob/main/docs/ja/packages/intlayer/getLocaleName.md)
|
|
1181
|
+
|
|
1182
|
+
> - [`getLocalizedUrl`フック](https://github.com/aymericzip/intlayer/blob/main/docs/ja/packages/intlayer/getLocalizedUrl.md)
|
|
1183
|
+
|
|
1184
|
+
> - [`getHTMLTextDir`フック](https://github.com/aymericzip/intlayer/blob/main/docs/ja/packages/intlayer/getHTMLTextDir.md)
|
|
1185
|
+
|
|
1186
|
+
> - [`hreflang`属性](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=ja)
|
|
1187
|
+
|
|
1188
|
+
> - [`lang`属性](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/lang)
|
|
1189
|
+
|
|
1190
|
+
> - [`dir`属性](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/dir)
|
|
1191
|
+
|
|
1192
|
+
> - [`aria-current`属性](https://developer.mozilla.org/ja/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
1193
|
+
|
|
1194
|
+
> - [Popover API](https://developer.mozilla.org/ja/docs/Web/API/Popover_API)
|
|
1195
|
+
|
|
1196
|
+
以下は、説明を追加し、コード例を改良した**ステップ9**です:
|
|
1197
|
+
|
|
1198
|
+
---
|
|
1199
|
+
|
|
1200
|
+
### (オプション) ステップ9: HTMLの言語と方向属性を切り替える
|
|
1201
|
+
|
|
1202
|
+
アプリケーションが複数の言語をサポートする場合、現在のロケールに合わせて`<html>`タグの`lang`および`dir`属性を更新することが重要です。これにより、以下が保証されます:
|
|
1203
|
+
|
|
1204
|
+
- **アクセシビリティ**: スクリーンリーダーや支援技術は、正しい`lang`属性を使用してコンテンツを正確に発音および解釈します。
|
|
1205
|
+
- **テキストレンダリング**: `dir`(方向)属性は、テキストが適切な順序でレンダリングされることを保証します(例: 英語は左から右、アラビア語やヘブライ語は右から左)。
|
|
1206
|
+
- **SEO**: 検索エンジンは`lang`属性を使用してページの言語を判断し、検索結果で適切なローカライズされたコンテンツを提供します。
|
|
1207
|
+
|
|
1208
|
+
ロケール変更時にこれらの属性を動的に更新することで、すべてのサポート言語で一貫性があり、アクセシブルな体験をユーザーに提供できます。
|
|
1209
|
+
|
|
1210
|
+
#### フックの実装
|
|
1211
|
+
|
|
1212
|
+
カスタムフックを作成してHTML属性を管理します。このフックはロケールの変更を監視し、属性を適切に更新します:
|
|
1213
|
+
|
|
1214
|
+
import { useEffect } from "preact/hooks";
|
|
1215
|
+
import { useLocale } from "preact-intlayer";
|
|
1216
|
+
import { getHTMLTextDir } from "intlayer";
|
|
1217
|
+
|
|
1218
|
+
/\*\*
|
|
1219
|
+
|
|
1220
|
+
- 現在のロケールに基づいてHTML <html> 要素の `lang` と `dir` 属性を更新します。
|
|
1221
|
+
- - `lang`: ブラウザや検索エンジンにページの言語を通知します。
|
|
1222
|
+
- - `dir`: 正しい読み順を保証します(例: 英語の場合は 'ltr'、アラビア語の場合は 'rtl')。
|
|
1223
|
+
-
|
|
1224
|
+
- この動的な更新は、適切なテキストレンダリング、アクセシビリティ、SEOにとって重要です。
|
|
1225
|
+
\*/
|
|
1226
|
+
export const useI18nHTMLAttributes = () => {
|
|
1227
|
+
const { locale } = useLocale();
|
|
1228
|
+
|
|
1229
|
+
useEffect(() => {
|
|
1230
|
+
// 現在のロケールに言語属性を更新します。
|
|
1231
|
+
document.documentElement.lang = locale;
|
|
1232
|
+
|
|
1233
|
+
// 現在のロケールに基づいてテキスト方向を設定します。
|
|
1234
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1235
|
+
|
|
1236
|
+
}, [locale]);
|
|
1237
|
+
};
|
|
1238
|
+
|
|
1239
|
+
````
|
|
1240
|
+
|
|
1241
|
+
```jsx fileName="src/hooks/useI18nHTMLAttributes.jsx" codeFormat="esm"
|
|
1242
|
+
import { useEffect } from "preact/hooks";
|
|
1243
|
+
import { useLocale } from "preact-intlayer";
|
|
1244
|
+
import { getHTMLTextDir } from "intlayer";
|
|
1245
|
+
|
|
1246
|
+
/**
|
|
1247
|
+
* 現在のロケールに基づいてHTML <html> 要素の `lang` と `dir` 属性を更新します。
|
|
1248
|
+
*/
|
|
1249
|
+
export const useI18nHTMLAttributes = () => {
|
|
1250
|
+
const { locale } = useLocale();
|
|
1251
|
+
|
|
1252
|
+
useEffect(() => {
|
|
1253
|
+
document.documentElement.lang = locale;
|
|
1254
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1255
|
+
}, [locale]);
|
|
1256
|
+
};
|
|
1257
|
+
````
|
|
1258
|
+
|
|
1259
|
+
```jsx fileName="src/hooks/useI18nHTMLAttributes.cjsx" codeFormat="commonjs"
|
|
1260
|
+
const { useEffect } = require("preact/hooks");
|
|
1261
|
+
const { useLocale } = require("preact-intlayer");
|
|
1262
|
+
const { getHTMLTextDir } = require("intlayer");
|
|
1263
|
+
|
|
1264
|
+
/**
|
|
1265
|
+
* 現在のロケールに基づいてHTML <html> 要素の `lang` と `dir` 属性を更新します。
|
|
1266
|
+
*/
|
|
1267
|
+
const useI18nHTMLAttributes = () => {
|
|
1268
|
+
const { locale } = useLocale();
|
|
1269
|
+
|
|
1270
|
+
useEffect(() => {
|
|
1271
|
+
document.documentElement.lang = locale;
|
|
1272
|
+
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1273
|
+
}, [locale]);
|
|
1274
|
+
};
|
|
1275
|
+
|
|
1276
|
+
module.exports = { useI18nHTMLAttributes };
|
|
1277
|
+
```
|
|
1278
|
+
|
|
1279
|
+
#### アプリケーションでフックを使用する
|
|
1280
|
+
|
|
1281
|
+
ロケールが変更されるたびにHTML属性が更新されるように、フックをメインコンポーネントに統合します:
|
|
1282
|
+
|
|
1283
|
+
```tsx fileName="src/app.tsx" codeFormat="typescript"
|
|
1284
|
+
import type { FunctionalComponent } from "preact";
|
|
1285
|
+
import { IntlayerProvider } from "preact-intlayer"; // AppContentが必要な場合、useIntlayerはすでにインポートされています
|
|
1286
|
+
import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
1287
|
+
import "./app.css";
|
|
1288
|
+
// ステップ5のAppContent定義
|
|
1289
|
+
|
|
1290
|
+
const AppWithHooks: FunctionalComponent = () => {
|
|
1291
|
+
// ロケールに基づいて<html>タグのlangとdir属性を更新するフックを適用します。
|
|
1292
|
+
useI18nHTMLAttributes();
|
|
1293
|
+
|
|
1294
|
+
// AppContentはステップ5からのメインコンテンツ表示コンポーネントと仮定します
|
|
1295
|
+
return <AppContent />;
|
|
1296
|
+
};
|
|
1297
|
+
|
|
1298
|
+
const App: FunctionalComponent = () => (
|
|
1299
|
+
<IntlayerProvider>
|
|
1300
|
+
<AppWithHooks />
|
|
1301
|
+
</IntlayerProvider>
|
|
1302
|
+
);
|
|
1303
|
+
|
|
1304
|
+
export default App;
|
|
1305
|
+
```
|
|
1306
|
+
|
|
1307
|
+
```jsx fileName="src/app.jsx" codeFormat="esm"
|
|
1308
|
+
import { IntlayerProvider } from "preact-intlayer";
|
|
1309
|
+
import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
1310
|
+
import "./app.css";
|
|
1311
|
+
// ステップ5のAppContent定義
|
|
1312
|
+
|
|
1313
|
+
const AppWithHooks = () => {
|
|
1314
|
+
useI18nHTMLAttributes();
|
|
1315
|
+
return <AppContent />;
|
|
1316
|
+
};
|
|
1317
|
+
|
|
1318
|
+
const App = () => (
|
|
1319
|
+
<IntlayerProvider>
|
|
1320
|
+
<AppWithHooks />
|
|
1321
|
+
</IntlayerProvider>
|
|
1322
|
+
);
|
|
1323
|
+
|
|
1324
|
+
export default App;
|
|
1325
|
+
```
|
|
1326
|
+
|
|
1327
|
+
```jsx fileName="src/app.cjsx" codeFormat="commonjs"
|
|
1328
|
+
const { IntlayerProvider } = require("preact-intlayer");
|
|
1329
|
+
const { useI18nHTMLAttributes } = require("./hooks/useI18nHTMLAttributes");
|
|
1330
|
+
require("./app.css");
|
|
1331
|
+
// ステップ5のAppContent定義
|
|
1332
|
+
|
|
1333
|
+
const AppWithHooks = () => {
|
|
1334
|
+
useI18nHTMLAttributes();
|
|
1335
|
+
return <AppContent />;
|
|
1336
|
+
};
|
|
1337
|
+
|
|
1338
|
+
const App = () => (
|
|
1339
|
+
<IntlayerProvider>
|
|
1340
|
+
<AppWithHooks />
|
|
1341
|
+
</IntlayerProvider>
|
|
1342
|
+
);
|
|
1343
|
+
|
|
1344
|
+
module.exports = App;
|
|
1345
|
+
```
|
|
1346
|
+
|
|
1347
|
+
これらの変更を適用することで、アプリケーションは以下を実現します:
|
|
1348
|
+
|
|
1349
|
+
- **言語** (`lang`) 属性が現在のロケールを正しく反映し、SEOやブラウザの動作に重要な役割を果たします。
|
|
1350
|
+
- **テキスト方向** (`dir`) がロケールに応じて調整され、異なる読み順の言語に対して可読性と使いやすさを向上させます。
|
|
1351
|
+
- **アクセシビリティ** を向上させ、支援技術がこれらの属性に依存して最適に機能するようにします。
|
|
1352
|
+
|
|
1353
|
+
### (オプション) ステップ10: ローカライズされたリンクコンポーネントの作成
|
|
1354
|
+
|
|
1355
|
+
アプリケーションのナビゲーションが現在のロケールを尊重するようにするために、カスタム `Link` コンポーネントを作成できます。このコンポーネントは内部URLに現在の言語を自動的にプレフィックスします。
|
|
1356
|
+
|
|
1357
|
+
この動作は以下の理由で有用です:
|
|
1358
|
+
|
|
1359
|
+
- **SEOとユーザーエクスペリエンス**: ローカライズされたURLは、検索エンジンが言語固有のページを正しくインデックス化し、ユーザーに好みの言語でコンテンツを提供するのに役立ちます。
|
|
1360
|
+
- **一貫性**: アプリケーション全体でローカライズされたリンクを使用することで、ナビゲーションが現在のロケール内に留まり、予期しない言語切り替えを防ぎます。
|
|
1361
|
+
- **保守性**: ローカリゼーションロジックを単一のコンポーネントに集中させることで、URLの管理が簡素化されます。
|
|
1362
|
+
|
|
1363
|
+
Preactで`preact-iso`を使用する場合、標準の`<a>`タグが通常ナビゲーションに使用され、`preact-iso`がルーティングを処理します。クリック時にプログラム的なナビゲーションが必要な場合(例: ナビゲーション前にアクションを実行する場合)、`useLocation`からの`route`関数を使用できます。以下は、URLをローカライズするカスタムアンカーコンポーネントの作成方法です:
|
|
1364
|
+
|
|
1365
|
+
```tsx fileName="src/components/LocalizedLink.tsx" codeFormat="typescript"
|
|
1366
|
+
import { getLocalizedUrl } from "intlayer";
|
|
1367
|
+
import { useLocale, useLocation, route } from "preact-intlayer"; // useLocationとrouteはpreact-intlayer経由で再エクスポートされるか、直接インポート
|
|
1368
|
+
// 再エクスポートされない場合: import { useLocation, route } from "preact-iso";
|
|
1369
|
+
import type { JSX } from "preact"; // HTMLAttributes用
|
|
1370
|
+
import { forwardRef } from "preact/compat"; // refを転送するため
|
|
1371
|
+
|
|
1372
|
+
export interface LocalizedLinkProps
|
|
1373
|
+
extends JSX.HTMLAttributes<HTMLAnchorElement> {
|
|
1374
|
+
href: string;
|
|
1375
|
+
replace?: boolean; // オプション: 履歴状態を置き換える
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
/**
|
|
1379
|
+
* 指定されたURLが外部リンクかどうかを確認するユーティリティ関数。
|
|
1380
|
+
* URLがhttp://またはhttps://で始まる場合、外部リンクと見なされます。
|
|
1381
|
+
*/
|
|
1382
|
+
export const checkIsExternalLink = (href?: string): boolean =>
|
|
1383
|
+
/^https?:\/\//.test(href ?? "");
|
|
1384
|
+
|
|
1385
|
+
/**
|
|
1386
|
+
* 現在のロケールに基づいてhref属性を適応させるカスタムリンクコンポーネント。
|
|
1387
|
+
* 内部リンクの場合、`getLocalizedUrl`を使用してURLにロケールをプレフィックスします(例: /ja/about)。
|
|
1388
|
+
* これにより、ナビゲーションが同じロケールコンテキスト内に留まることを保証します。
|
|
1389
|
+
* 標準の<a>タグを使用しますが、preact-isoの`route`を使用してクライアントサイドナビゲーションをトリガーできます。
|
|
1390
|
+
*/
|
|
1391
|
+
export const LocalizedLink = forwardRef<HTMLAnchorElement, LocalizedLinkProps>(
|
|
1392
|
+
({ href, children, onClick, replace = false, ...props }, ref) => {
|
|
1393
|
+
const { locale } = useLocale();
|
|
1394
|
+
const location = useLocation(); // preact-isoから
|
|
1395
|
+
const isExternalLink = checkIsExternalLink(href);
|
|
1396
|
+
|
|
1397
|
+
const hrefI18n =
|
|
1398
|
+
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1399
|
+
|
|
1400
|
+
const handleClick = (event: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {
|
|
1401
|
+
if (onClick) {
|
|
1402
|
+
onClick(event);
|
|
1403
|
+
}
|
|
1404
|
+
if (
|
|
1405
|
+
!isExternalLink &&
|
|
1406
|
+
href && // hrefが定義されていることを確認
|
|
1407
|
+
event.button === 0 && // 左クリック
|
|
1408
|
+
!event.metaKey &&
|
|
1409
|
+
!event.ctrlKey &&
|
|
1410
|
+
!event.shiftKey &&
|
|
1411
|
+
!event.altKey && // 標準の修飾キーのチェック
|
|
1412
|
+
!props.target // 新しいタブ/ウィンドウをターゲットにしていない
|
|
1413
|
+
) {
|
|
1414
|
+
event.preventDefault();
|
|
1415
|
+
if (location.url !== hrefI18n) {
|
|
1416
|
+
// URLが異なる場合のみナビゲート
|
|
1417
|
+
route(hrefI18n, replace); // preact-isoのrouteを使用
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1420
|
+
};
|
|
1421
|
+
|
|
1422
|
+
return (
|
|
1423
|
+
<a href={hrefI18n} ref={ref} onClick={handleClick} {...props}>
|
|
1424
|
+
{children}
|
|
1425
|
+
</a>
|
|
1426
|
+
);
|
|
1427
|
+
}
|
|
1428
|
+
);
|
|
1429
|
+
```
|
|
1430
|
+
|
|
1431
|
+
```jsx fileName="src/components/LocalizedLink.jsx" codeFormat="esm"
|
|
1432
|
+
import { getLocalizedUrl } from "intlayer";
|
|
1433
|
+
import { useLocale } from "preact-intlayer";
|
|
1434
|
+
|
|
1435
|
+
import { useLocation, route } from "preact-iso"; // preact-isoからインポート
|
|
1436
|
+
import { forwardRef } from "preact/compat";
|
|
1437
|
+
import { h } from "preact"; // JSX用
|
|
1438
|
+
|
|
1439
|
+
export const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1440
|
+
|
|
1441
|
+
export const LocalizedLink = forwardRef(
|
|
1442
|
+
({ href, children, onClick, replace = false, ...props }, ref) => {
|
|
1443
|
+
const { locale } = useLocale();
|
|
1444
|
+
const location = useLocation();
|
|
1445
|
+
const isExternalLink = checkIsExternalLink(href);
|
|
1446
|
+
|
|
1447
|
+
const hrefI18n =
|
|
1448
|
+
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1449
|
+
|
|
1450
|
+
const handleClick = (event) => {
|
|
1451
|
+
if (onClick) {
|
|
1452
|
+
onClick(event);
|
|
1453
|
+
}
|
|
1454
|
+
if (
|
|
1455
|
+
!isExternalLink &&
|
|
1456
|
+
href &&
|
|
1457
|
+
event.button === 0 &&
|
|
1458
|
+
!event.metaKey &&
|
|
1459
|
+
!event.ctrlKey &&
|
|
1460
|
+
!event.shiftKey &&
|
|
1461
|
+
!event.altKey &&
|
|
1462
|
+
!props.target
|
|
1463
|
+
) {
|
|
1464
|
+
event.preventDefault();
|
|
1465
|
+
if (location.url !== hrefI18n) {
|
|
1466
|
+
route(hrefI18n, replace);
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1469
|
+
};
|
|
1470
|
+
|
|
1471
|
+
return (
|
|
1472
|
+
<a href={hrefI18n} ref={ref} onClick={handleClick} {...props}>
|
|
1473
|
+
{children}
|
|
1474
|
+
</a>
|
|
1475
|
+
);
|
|
1476
|
+
}
|
|
1477
|
+
);
|
|
1478
|
+
```
|
|
1479
|
+
|
|
1480
|
+
```jsx fileName="src/components/LocalizedLink.cjsx" codeFormat="commonjs"
|
|
1481
|
+
const { getLocalizedUrl } = require("intlayer");
|
|
1482
|
+
const { useLocale } = require("preact-intlayer");
|
|
1483
|
+
const { useLocation, route } = require("preact-iso"); // preact-isoからインポート
|
|
1484
|
+
const { forwardRef } = require("preact/compat");
|
|
1485
|
+
const { h } = require("preact"); // JSX用
|
|
1486
|
+
|
|
1487
|
+
const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1488
|
+
|
|
1489
|
+
const LocalizedLink = forwardRef(
|
|
1490
|
+
({ href, children, onClick, replace = false, ...props }, ref) => {
|
|
1491
|
+
const { locale } = useLocale();
|
|
1492
|
+
const location = useLocation();
|
|
1493
|
+
const isExternalLink = checkIsExternalLink(href);
|
|
1494
|
+
|
|
1495
|
+
const hrefI18n =
|
|
1496
|
+
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1497
|
+
|
|
1498
|
+
const handleClick = (event) => {
|
|
1499
|
+
if (onClick) {
|
|
1500
|
+
onClick(event);
|
|
1501
|
+
}
|
|
1502
|
+
if (
|
|
1503
|
+
!isExternalLink &&
|
|
1504
|
+
href &&
|
|
1505
|
+
event.button === 0 &&
|
|
1506
|
+
!event.metaKey &&
|
|
1507
|
+
!event.ctrlKey &&
|
|
1508
|
+
!event.shiftKey &&
|
|
1509
|
+
!event.altKey &&
|
|
1510
|
+
!props.target
|
|
1511
|
+
) {
|
|
1512
|
+
event.preventDefault();
|
|
1513
|
+
if (location.url !== hrefI18n) {
|
|
1514
|
+
route(hrefI18n, replace);
|
|
1515
|
+
}
|
|
1516
|
+
}
|
|
1517
|
+
};
|
|
1518
|
+
|
|
1519
|
+
return (
|
|
1520
|
+
<a href={hrefI18n} ref={ref} onClick={handleClick} {...props}>
|
|
1521
|
+
{children}
|
|
1522
|
+
</a>
|
|
1523
|
+
);
|
|
1524
|
+
}
|
|
1525
|
+
);
|
|
1526
|
+
|
|
1527
|
+
module.exports = { LocalizedLink, checkIsExternalLink };
|
|
1528
|
+
```
|
|
1529
|
+
|
|
1530
|
+
#### 動作の仕組み
|
|
1531
|
+
|
|
1532
|
+
- **外部リンクの検出**:
|
|
1533
|
+
ヘルパー関数 `checkIsExternalLink` は、URLが外部リンクかどうかを判定します。外部リンクは変更されません。
|
|
1534
|
+
- **現在のロケールの取得**:
|
|
1535
|
+
`useLocale` フックは現在のロケールを提供します。
|
|
1536
|
+
- **URLのローカライズ**:
|
|
1537
|
+
内部リンクの場合、`getLocalizedUrl` がURLに現在のロケールを付加します。
|
|
1538
|
+
- **クライアントサイドナビゲーション**:
|
|
1539
|
+
`handleClick` 関数は、内部リンクで標準のナビゲーションを防ぐべきかどうかを確認します。必要であれば、`preact-iso` の `route` 関数(`useLocation` または直接インポートで取得)を使用してクライアントサイドナビゲーションを実行します。これにより、ページ全体のリロードなしでSPAのような動作が可能になります。
|
|
1540
|
+
- **リンクの返却**:
|
|
1541
|
+
コンポーネントはローカライズされたURLとカスタムクリックハンドラを持つ `<a>` 要素を返します。
|
|
1542
|
+
|
|
1543
|
+
### TypeScriptの設定
|
|
1544
|
+
|
|
1545
|
+
Intlayerはモジュール拡張を使用して、TypeScriptの利点を活用し、コードベースを強化します。
|
|
1546
|
+
|
|
1547
|
+

|
|
1548
|
+
|
|
1549
|
+

|
|
1550
|
+
|
|
1551
|
+
自動生成された型を含めるようにTypeScriptの設定を確認してください。
|
|
1552
|
+
|
|
1553
|
+
```json5 fileName="tsconfig.json"
|
|
1554
|
+
{
|
|
1555
|
+
// ... 既存のTypeScript設定
|
|
1556
|
+
"compilerOptions": {
|
|
1557
|
+
// ...
|
|
1558
|
+
"jsx": "react-jsx",
|
|
1559
|
+
"jsxImportSource": "preact", // Preact 10+推奨
|
|
1560
|
+
// ...
|
|
1561
|
+
},
|
|
1562
|
+
"include": [
|
|
1563
|
+
// ... 既存のTypeScript設定
|
|
1564
|
+
".intlayer/**/*.ts", // 自動生成された型を含める
|
|
1565
|
+
],
|
|
1566
|
+
}
|
|
1567
|
+
```
|
|
1568
|
+
|
|
1569
|
+
> 特に`jsx`と`jsxImportSource`、または古いPreactバージョンを使用している場合は`jsxFactory`/`jsxFragmentFactory`が`preset-vite`のデフォルトで設定されていることを確認してください。
|
|
1570
|
+
|
|
1571
|
+
### Gitの設定
|
|
1572
|
+
|
|
1573
|
+
Intlayerによって生成されたファイルを無視することをお勧めします。これにより、それらをGitリポジトリにコミットすることを避けられます。
|
|
1574
|
+
|
|
1575
|
+
これを行うには、以下の指示を `.gitignore` ファイルに追加します:
|
|
1576
|
+
|
|
1577
|
+
```plaintext
|
|
1578
|
+
# Intlayerによって生成されたファイルを無視
|
|
1579
|
+
.intlayer
|
|
1580
|
+
```
|
|
1581
|
+
|
|
1582
|
+
### VS Code拡張機能
|
|
1583
|
+
|
|
1584
|
+
Intlayerでの開発体験を向上させるために、公式の **Intlayer VS Code拡張機能** をインストールできます。
|
|
1585
|
+
|
|
1586
|
+
[VS Code Marketplaceからインストール](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
1587
|
+
|
|
1588
|
+
この拡張機能は以下を提供します:
|
|
1589
|
+
|
|
1590
|
+
- 翻訳キーの**オートコンプリート**。
|
|
1591
|
+
- 翻訳漏れの**リアルタイムエラー検出**。
|
|
1592
|
+
- 翻訳コンテンツの**インラインプレビュー**。
|
|
1593
|
+
- 翻訳を簡単に作成および更新するための**クイックアクション**。
|
|
1594
|
+
|
|
1595
|
+
拡張機能の使用方法の詳細については、[Intlayer VS Code Extensionドキュメント](https://intlayer.org/doc/vs-code-extension)を参照してください。
|
|
1596
|
+
|
|
1597
|
+
---
|
|
1598
|
+
|
|
1599
|
+
### さらに進む
|
|
1600
|
+
|
|
1601
|
+
## さらに進めるには、[ビジュアルエディター](https://github.com/aymericzip/intlayer/blob/main/docs/ja/intlayer_visual_editor.md)を実装するか、[CMS](https://github.com/aymericzip/intlayer/blob/main/docs/ja/intlayer_CMS.md)を使用してコンテンツを外部化することができます。
|