@intlayer/docs 5.8.1 → 6.0.0-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/rag_powered_documentation_assistant.md +282 -0
- package/blog/de/rag_powered_documentation_assistant.md +282 -0
- package/blog/en/rag_powered_documentation_assistant.md +289 -0
- package/blog/en-GB/rag_powered_documentation_assistant.md +284 -0
- package/blog/es/rag_powered_documentation_assistant.md +308 -0
- package/blog/fr/rag_powered_documentation_assistant.md +308 -0
- package/blog/hi/rag_powered_documentation_assistant.md +284 -0
- package/blog/it/rag_powered_documentation_assistant.md +284 -0
- package/blog/ja/rag_powered_documentation_assistant.md +284 -0
- package/blog/ko/rag_powered_documentation_assistant.md +283 -0
- package/blog/pt/rag_powered_documentation_assistant.md +284 -0
- package/blog/ru/rag_powered_documentation_assistant.md +284 -0
- package/blog/tr/index.md +69 -0
- package/blog/tr/internationalization_and_SEO.md +273 -0
- package/blog/tr/intlayer_with_i18next.md +162 -0
- package/blog/tr/intlayer_with_next-i18next.md +367 -0
- package/blog/tr/intlayer_with_next-intl.md +392 -0
- package/blog/tr/intlayer_with_react-i18next.md +346 -0
- package/blog/tr/intlayer_with_react-intl.md +345 -0
- package/blog/tr/list_i18n_technologies/CMS/drupal.md +143 -0
- package/blog/tr/list_i18n_technologies/CMS/wix.md +167 -0
- package/blog/tr/list_i18n_technologies/CMS/wordpress.md +188 -0
- package/blog/tr/list_i18n_technologies/frameworks/angular.md +125 -0
- package/blog/tr/list_i18n_technologies/frameworks/flutter.md +150 -0
- package/blog/tr/list_i18n_technologies/frameworks/react-native.md +217 -0
- package/blog/tr/list_i18n_technologies/frameworks/react.md +155 -0
- package/blog/tr/list_i18n_technologies/frameworks/svelte.md +129 -0
- package/blog/tr/list_i18n_technologies/frameworks/vue.md +130 -0
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +170 -0
- package/blog/tr/rag_powered_documentation_assistant.md +284 -0
- package/blog/tr/react-i18next_vs_react-intl_vs_intlayer.md +162 -0
- package/blog/tr/vue-i18n_vs_intlayer.md +276 -0
- package/blog/tr/what_is_internationalization.md +166 -0
- package/blog/zh/rag_powered_documentation_assistant.md +284 -0
- package/dist/cjs/generated/blog.entry.cjs +212 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +660 -132
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +84 -0
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +6 -0
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +212 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +660 -132
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +84 -0
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +6 -0
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +5 -2
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/docs/ar/autoFill.md +41 -40
- package/docs/ar/configuration.md +202 -199
- package/docs/ar/dictionary/content_file.md +1059 -0
- package/docs/ar/intlayer_CMS.md +4 -4
- package/docs/ar/intlayer_with_nestjs.md +271 -0
- package/docs/ar/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ar/intlayer_with_react_router_v7.md +533 -0
- package/docs/ar/intlayer_with_tanstack.md +465 -299
- package/docs/ar/intlayer_with_vite+preact.md +7 -7
- package/docs/ar/intlayer_with_vite+react.md +7 -7
- package/docs/ar/intlayer_with_vite+vue.md +9 -9
- package/docs/ar/packages/vite-intlayer/index.md +3 -3
- package/docs/ar/readme.md +261 -0
- package/docs/ar/testing.md +199 -0
- package/docs/de/autoFill.md +42 -19
- package/docs/de/configuration.md +155 -147
- package/docs/de/dictionary/content_file.md +1059 -0
- package/docs/de/intlayer_CMS.md +4 -5
- package/docs/de/intlayer_with_nestjs.md +270 -0
- package/docs/de/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/de/intlayer_with_react_router_v7.md +537 -0
- package/docs/de/intlayer_with_tanstack.md +469 -302
- package/docs/de/intlayer_with_vite+preact.md +7 -7
- package/docs/de/intlayer_with_vite+react.md +7 -7
- package/docs/de/intlayer_with_vite+vue.md +9 -9
- package/docs/de/packages/vite-intlayer/index.md +3 -3
- package/docs/de/readme.md +261 -0
- package/docs/de/testing.md +200 -0
- package/docs/en/CI_CD.md +4 -6
- package/docs/en/autoFill.md +25 -5
- package/docs/en/configuration.md +45 -54
- package/docs/en/dictionary/content_file.md +1054 -0
- package/docs/en/intlayer_CMS.md +8 -7
- package/docs/en/intlayer_cli.md +112 -5
- package/docs/en/intlayer_with_nestjs.md +268 -0
- package/docs/en/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en/intlayer_with_react_router_v7.md +531 -0
- package/docs/en/intlayer_with_tanstack.md +463 -294
- package/docs/en/intlayer_with_vite+preact.md +8 -8
- package/docs/en/intlayer_with_vite+react.md +8 -8
- package/docs/en/intlayer_with_vite+vue.md +8 -8
- package/docs/en/packages/intlayer/getLocalizedUrl.md +102 -25
- package/docs/en/packages/vite-intlayer/index.md +3 -3
- package/docs/en/readme.md +261 -0
- package/docs/en/testing.md +200 -0
- package/docs/en-GB/autoFill.md +29 -6
- package/docs/en-GB/configuration.md +79 -71
- package/docs/en-GB/dictionary/content_file.md +1084 -0
- package/docs/en-GB/intlayer_CMS.md +4 -5
- package/docs/en-GB/intlayer_with_nestjs.md +268 -0
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/en-GB/intlayer_with_react_router_v7.md +533 -0
- package/docs/en-GB/intlayer_with_tanstack.md +466 -299
- package/docs/en-GB/intlayer_with_vite+preact.md +7 -7
- package/docs/en-GB/intlayer_with_vite+react.md +7 -7
- package/docs/en-GB/intlayer_with_vite+vue.md +9 -9
- package/docs/en-GB/packages/vite-intlayer/index.md +3 -3
- package/docs/en-GB/readme.md +261 -0
- package/docs/en-GB/testing.md +200 -0
- package/docs/es/autoFill.md +45 -23
- package/docs/es/configuration.md +171 -167
- package/docs/es/dictionary/content_file.md +1088 -0
- package/docs/es/intlayer_CMS.md +4 -5
- package/docs/es/intlayer_with_nestjs.md +268 -0
- package/docs/es/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/es/intlayer_with_react_router_v7.md +533 -0
- package/docs/es/intlayer_with_tanstack.md +469 -280
- package/docs/es/intlayer_with_vite+preact.md +7 -7
- package/docs/es/intlayer_with_vite+react.md +7 -7
- package/docs/es/intlayer_with_vite+vue.md +9 -9
- package/docs/es/packages/vite-intlayer/index.md +3 -3
- package/docs/es/readme.md +261 -0
- package/docs/es/testing.md +200 -0
- package/docs/fr/autoFill.md +47 -24
- package/docs/fr/configuration.md +213 -198
- package/docs/fr/dictionary/content_file.md +1054 -0
- package/docs/fr/intlayer_CMS.md +4 -5
- package/docs/fr/intlayer_with_nestjs.md +268 -0
- package/docs/fr/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/fr/intlayer_with_react_router_v7.md +549 -0
- package/docs/fr/intlayer_with_tanstack.md +465 -279
- package/docs/fr/intlayer_with_vite+preact.md +7 -7
- package/docs/fr/intlayer_with_vite+react.md +7 -7
- package/docs/fr/intlayer_with_vite+vue.md +9 -9
- package/docs/fr/packages/vite-intlayer/index.md +3 -3
- package/docs/fr/readme.md +261 -0
- package/docs/fr/testing.md +200 -0
- package/docs/hi/autoFill.md +47 -25
- package/docs/hi/configuration.md +194 -189
- package/docs/hi/dictionary/content_file.md +1056 -0
- package/docs/hi/intlayer_CMS.md +4 -5
- package/docs/hi/intlayer_with_nestjs.md +269 -0
- package/docs/hi/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/hi/intlayer_with_react_router_v7.md +533 -0
- package/docs/hi/intlayer_with_tanstack.md +467 -282
- package/docs/hi/intlayer_with_vite+preact.md +7 -7
- package/docs/hi/intlayer_with_vite+react.md +7 -7
- package/docs/hi/intlayer_with_vite+vue.md +9 -9
- package/docs/hi/packages/vite-intlayer/index.md +3 -3
- package/docs/hi/readme.md +261 -0
- package/docs/hi/testing.md +200 -0
- package/docs/it/autoFill.md +46 -24
- package/docs/it/configuration.md +169 -161
- package/docs/it/dictionary/content_file.md +1061 -0
- package/docs/it/intlayer_CMS.md +4 -5
- package/docs/it/intlayer_with_nestjs.md +268 -0
- package/docs/it/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/it/intlayer_with_react_router_v7.md +535 -0
- package/docs/it/intlayer_with_tanstack.md +467 -301
- package/docs/it/intlayer_with_vite+preact.md +7 -7
- package/docs/it/intlayer_with_vite+react.md +7 -7
- package/docs/it/intlayer_with_vite+vue.md +9 -9
- package/docs/it/packages/vite-intlayer/index.md +3 -3
- package/docs/it/readme.md +261 -0
- package/docs/it/testing.md +200 -0
- package/docs/ja/autoFill.md +45 -23
- package/docs/ja/configuration.md +243 -204
- package/docs/ja/dictionary/content_file.md +1064 -0
- package/docs/ja/intlayer_CMS.md +4 -5
- package/docs/ja/intlayer_with_nestjs.md +268 -0
- package/docs/ja/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ja/intlayer_with_react_router_v7.md +534 -0
- package/docs/ja/intlayer_with_tanstack.md +467 -303
- package/docs/ja/intlayer_with_vite+preact.md +7 -7
- package/docs/ja/intlayer_with_vite+react.md +7 -7
- package/docs/ja/intlayer_with_vite+vue.md +9 -9
- package/docs/ja/packages/vite-intlayer/index.md +3 -3
- package/docs/ja/readme.md +263 -0
- package/docs/ja/testing.md +200 -0
- package/docs/ko/autoFill.md +39 -16
- package/docs/ko/configuration.md +217 -197
- package/docs/ko/dictionary/content_file.md +1060 -0
- package/docs/ko/intlayer_CMS.md +4 -5
- package/docs/ko/intlayer_with_nestjs.md +268 -0
- package/docs/ko/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ko/intlayer_with_react_router_v7.md +540 -0
- package/docs/ko/intlayer_with_tanstack.md +466 -302
- package/docs/ko/intlayer_with_vite+preact.md +7 -7
- package/docs/ko/intlayer_with_vite+react.md +7 -7
- package/docs/ko/intlayer_with_vite+vue.md +9 -9
- package/docs/ko/packages/vite-intlayer/index.md +3 -3
- package/docs/ko/readme.md +261 -0
- package/docs/ko/testing.md +200 -0
- package/docs/pt/autoFill.md +39 -15
- package/docs/pt/configuration.md +165 -147
- package/docs/pt/dictionary/content_file.md +1062 -0
- package/docs/pt/intlayer_CMS.md +4 -5
- package/docs/pt/intlayer_with_nestjs.md +271 -0
- package/docs/pt/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/pt/intlayer_with_react_router_v7.md +535 -0
- package/docs/pt/intlayer_with_tanstack.md +469 -300
- package/docs/pt/intlayer_with_vite+preact.md +7 -7
- package/docs/pt/intlayer_with_vite+react.md +7 -7
- package/docs/pt/intlayer_with_vite+vue.md +9 -9
- package/docs/pt/packages/vite-intlayer/index.md +3 -3
- package/docs/pt/readme.md +261 -0
- package/docs/pt/testing.md +200 -0
- package/docs/ru/autoFill.md +52 -30
- package/docs/ru/configuration.md +164 -117
- package/docs/ru/dictionary/content_file.md +1064 -0
- package/docs/ru/intlayer_CMS.md +4 -4
- package/docs/ru/intlayer_with_nestjs.md +270 -0
- package/docs/ru/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/ru/intlayer_with_react_router_v7.md +534 -0
- package/docs/ru/intlayer_with_tanstack.md +470 -305
- package/docs/ru/intlayer_with_vite+preact.md +7 -7
- package/docs/ru/intlayer_with_vite+react.md +7 -7
- package/docs/ru/intlayer_with_vite+vue.md +9 -9
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/readme.md +261 -0
- package/docs/ru/testing.md +202 -0
- package/docs/tr/CI_CD.md +198 -0
- package/docs/tr/autoFill.md +201 -0
- package/docs/tr/configuration.md +585 -0
- package/docs/tr/dictionary/condition.md +243 -0
- package/docs/tr/dictionary/content_file.md +1055 -0
- package/docs/tr/dictionary/enumeration.md +251 -0
- package/docs/tr/dictionary/file.md +228 -0
- package/docs/tr/dictionary/function_fetching.md +218 -0
- package/docs/tr/dictionary/gender.md +279 -0
- package/docs/tr/dictionary/insertion.md +191 -0
- package/docs/tr/dictionary/markdown.md +385 -0
- package/docs/tr/dictionary/nesting.md +279 -0
- package/docs/tr/dictionary/translation.md +315 -0
- package/docs/tr/formatters.md +618 -0
- package/docs/tr/how_works_intlayer.md +254 -0
- package/docs/tr/index.md +168 -0
- package/docs/tr/interest_of_intlayer.md +288 -0
- package/docs/tr/intlayer_CMS.md +347 -0
- package/docs/tr/intlayer_cli.md +570 -0
- package/docs/tr/intlayer_visual_editor.md +269 -0
- package/docs/tr/intlayer_with_angular.md +694 -0
- package/docs/tr/intlayer_with_create_react_app.md +1218 -0
- package/docs/tr/intlayer_with_express.md +415 -0
- package/docs/tr/intlayer_with_lynx+react.md +511 -0
- package/docs/tr/intlayer_with_nestjs.md +268 -0
- package/docs/tr/intlayer_with_nextjs_14.md +1029 -0
- package/docs/tr/intlayer_with_nextjs_15.md +1506 -0
- package/docs/tr/intlayer_with_nextjs_page_router.md +1484 -0
- package/docs/tr/intlayer_with_nuxt.md +773 -0
- package/docs/tr/intlayer_with_react_native+expo.md +660 -0
- package/docs/tr/intlayer_with_react_router_v7.md +531 -0
- package/docs/tr/intlayer_with_tanstack.md +452 -0
- package/docs/tr/intlayer_with_vite+preact.md +1673 -0
- package/docs/tr/intlayer_with_vite+react.md +1632 -0
- package/docs/tr/intlayer_with_vite+solid.md +288 -0
- package/docs/tr/intlayer_with_vite+svelte.md +288 -0
- package/docs/tr/intlayer_with_vite+vue.md +1042 -0
- package/docs/tr/introduction.md +209 -0
- package/docs/tr/locale_mapper.md +244 -0
- package/docs/tr/mcp_server.md +207 -0
- package/docs/tr/packages/@intlayer/api/index.md +58 -0
- package/docs/tr/packages/@intlayer/chokidar/index.md +57 -0
- package/docs/tr/packages/@intlayer/cli/index.md +47 -0
- package/docs/tr/packages/@intlayer/config/index.md +142 -0
- package/docs/tr/packages/@intlayer/core/index.md +51 -0
- package/docs/tr/packages/@intlayer/design-system/index.md +47 -0
- package/docs/tr/packages/@intlayer/dictionary-entry/index.md +53 -0
- package/docs/tr/packages/@intlayer/editor/index.md +47 -0
- package/docs/tr/packages/@intlayer/editor-react/index.md +47 -0
- package/docs/tr/packages/@intlayer/webpack/index.md +61 -0
- package/docs/tr/packages/angular-intlayer/index.md +59 -0
- package/docs/tr/packages/express-intlayer/index.md +258 -0
- package/docs/tr/packages/express-intlayer/t.md +459 -0
- package/docs/tr/packages/intlayer/getConfiguration.md +151 -0
- package/docs/tr/packages/intlayer/getEnumeration.md +165 -0
- package/docs/tr/packages/intlayer/getHTMLTextDir.md +127 -0
- package/docs/tr/packages/intlayer/getLocaleLang.md +87 -0
- package/docs/tr/packages/intlayer/getLocaleName.md +124 -0
- package/docs/tr/packages/intlayer/getLocalizedUrl.md +324 -0
- package/docs/tr/packages/intlayer/getMultilingualUrls.md +225 -0
- package/docs/tr/packages/intlayer/getPathWithoutLocale.md +81 -0
- package/docs/tr/packages/intlayer/getTranslation.md +196 -0
- package/docs/tr/packages/intlayer/getTranslationContent.md +195 -0
- package/docs/tr/packages/intlayer/index.md +505 -0
- package/docs/tr/packages/intlayer-cli/index.md +71 -0
- package/docs/tr/packages/intlayer-editor/index.md +139 -0
- package/docs/tr/packages/lynx-intlayer/index.md +85 -0
- package/docs/tr/packages/next-intlayer/index.md +154 -0
- package/docs/tr/packages/next-intlayer/t.md +354 -0
- package/docs/tr/packages/next-intlayer/useDictionary.md +270 -0
- package/docs/tr/packages/next-intlayer/useIntlayer.md +265 -0
- package/docs/tr/packages/next-intlayer/useLocale.md +133 -0
- package/docs/tr/packages/nuxt-intlayer/index.md +59 -0
- package/docs/tr/packages/preact-intlayer/index.md +55 -0
- package/docs/tr/packages/react-intlayer/index.md +148 -0
- package/docs/tr/packages/react-intlayer/t.md +304 -0
- package/docs/tr/packages/react-intlayer/useDictionary.md +554 -0
- package/docs/tr/packages/react-intlayer/useI18n.md +478 -0
- package/docs/tr/packages/react-intlayer/useIntlayer.md +253 -0
- package/docs/tr/packages/react-intlayer/useLocale.md +212 -0
- package/docs/tr/packages/react-native-intlayer/index.md +85 -0
- package/docs/tr/packages/react-scripts-intlayer/index.md +82 -0
- package/docs/tr/packages/solid-intlayer/index.md +56 -0
- package/docs/tr/packages/svelte-intlayer/index.md +55 -0
- package/docs/tr/packages/vite-intlayer/index.md +82 -0
- package/docs/tr/packages/vue-intlayer/index.md +59 -0
- package/docs/tr/per_locale_file.md +321 -0
- package/docs/tr/readme.md +261 -0
- package/docs/tr/roadmap.md +338 -0
- package/docs/tr/testing.md +200 -0
- package/docs/tr/vs_code_extension.md +154 -0
- package/docs/zh/autoFill.md +40 -18
- package/docs/zh/configuration.md +245 -226
- package/docs/zh/dictionary/content_file.md +1064 -0
- package/docs/zh/intlayer_CMS.md +4 -5
- package/docs/zh/intlayer_with_nestjs.md +268 -0
- package/docs/zh/intlayer_with_nextjs_page_router.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +535 -0
- package/docs/zh/intlayer_with_tanstack.md +468 -278
- package/docs/zh/intlayer_with_vite+preact.md +7 -7
- package/docs/zh/intlayer_with_vite+react.md +7 -7
- package/docs/zh/intlayer_with_vite+vue.md +7 -7
- package/docs/zh/packages/vite-intlayer/index.md +3 -3
- package/docs/zh/readme.md +261 -0
- package/docs/zh/testing.md +198 -0
- package/frequent_questions/tr/SSR_Next_no_[locale].md +105 -0
- package/frequent_questions/tr/array_as_content_declaration.md +72 -0
- package/frequent_questions/tr/build_dictionaries.md +59 -0
- package/frequent_questions/tr/build_error_CI_CD.md +75 -0
- package/frequent_questions/tr/customized_locale_list.md +65 -0
- package/frequent_questions/tr/domain_routing.md +114 -0
- package/frequent_questions/tr/esbuild_error.md +30 -0
- package/frequent_questions/tr/get_locale_cookie.md +142 -0
- package/frequent_questions/tr/intlayer_command_undefined.md +156 -0
- package/frequent_questions/tr/locale_incorect_in_url.md +74 -0
- package/frequent_questions/tr/static_rendering.md +45 -0
- package/frequent_questions/tr/translated_path_url.md +56 -0
- package/frequent_questions/tr/unknown_command.md +98 -0
- package/legal/tr/privacy_notice.md +83 -0
- package/legal/tr/terms_of_service.md +55 -0
- package/package.json +12 -12
- package/src/generated/blog.entry.ts +212 -0
- package/src/generated/docs.entry.ts +663 -135
- package/src/generated/frequentQuestions.entry.ts +85 -1
- package/src/generated/legal.entry.ts +7 -1
- package/docs/ar/dictionary/content_extention_customization.md +0 -100
- package/docs/ar/dictionary/get_started.md +0 -527
- package/docs/de/dictionary/content_extention_customization.md +0 -100
- package/docs/de/dictionary/get_started.md +0 -531
- package/docs/en/dictionary/content_extention_customization.md +0 -102
- package/docs/en/dictionary/get_started.md +0 -529
- package/docs/en-GB/dictionary/content_extention_customization.md +0 -100
- package/docs/en-GB/dictionary/get_started.md +0 -591
- package/docs/es/dictionary/content_extention_customization.md +0 -100
- package/docs/es/dictionary/get_started.md +0 -527
- package/docs/fr/dictionary/content_extention_customization.md +0 -100
- package/docs/fr/dictionary/get_started.md +0 -527
- package/docs/hi/dictionary/content_extention_customization.md +0 -100
- package/docs/hi/dictionary/get_started.md +0 -527
- package/docs/it/dictionary/content_extention_customization.md +0 -113
- package/docs/it/dictionary/get_started.md +0 -573
- package/docs/ja/dictionary/content_extention_customization.md +0 -113
- package/docs/ja/dictionary/get_started.md +0 -576
- package/docs/ko/dictionary/content_extention_customization.md +0 -100
- package/docs/ko/dictionary/get_started.md +0 -530
- package/docs/pt/dictionary/content_extention_customization.md +0 -100
- package/docs/pt/dictionary/get_started.md +0 -532
- package/docs/ru/dictionary/content_extention_customization.md +0 -100
- package/docs/ru/dictionary/get_started.md +0 -575
- package/docs/zh/dictionary/content_extention_customization.md +0 -117
- package/docs/zh/dictionary/get_started.md +0 -533
|
@@ -1,457 +1,621 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt: 2025-
|
|
3
|
-
updatedAt: 2025-
|
|
4
|
-
title:
|
|
5
|
-
description: Intlayer
|
|
2
|
+
createdAt: 2025-09-09
|
|
3
|
+
updatedAt: 2025-09-09
|
|
4
|
+
title: Tanstack StartでのIntlayerによる国際化(i18n)入門
|
|
5
|
+
description: Intlayerを使用してTanstack Startアプリケーションに国際化(i18n)を追加する方法を学びます。ロケール対応ルーティングで多言語対応アプリを作成するための包括的なガイドです。
|
|
6
6
|
keywords:
|
|
7
7
|
- 国際化
|
|
8
8
|
- ドキュメント
|
|
9
9
|
- Intlayer
|
|
10
|
-
-
|
|
11
|
-
- TanStack Router
|
|
10
|
+
- Tanstack Start
|
|
12
11
|
- React
|
|
13
12
|
- i18n
|
|
14
|
-
-
|
|
13
|
+
- TypeScript
|
|
14
|
+
- ロケールルーティング
|
|
15
15
|
slugs:
|
|
16
16
|
- doc
|
|
17
17
|
- environment
|
|
18
|
+
- vite-and-react
|
|
18
19
|
- tanstack-start
|
|
20
|
+
applicationTemplate: https://github.com/AydinTheFirst/tanstack-start-intlayer
|
|
21
|
+
author: AydinTheFirst
|
|
19
22
|
---
|
|
20
23
|
|
|
21
|
-
# Intlayerと
|
|
24
|
+
# IntlayerとTanstack Startによる国際化(i18n)入門
|
|
25
|
+
|
|
26
|
+
このガイドでは、Tanstack Startプロジェクトにおいて、ロケール対応ルーティング、TypeScriptサポート、最新の開発手法を活用しながら、**Intlayer**を統合してシームレスな国際化を実現する方法を示します。
|
|
22
27
|
|
|
23
28
|
## Intlayerとは?
|
|
24
29
|
|
|
25
|
-
**Intlayer
|
|
30
|
+
**Intlayer**は、最新のウェブアプリケーションにおける多言語対応を簡素化するために設計された革新的なオープンソースの国際化(i18n)ライブラリです。
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
- **動的なメタデータとルート**(SEO対応)。
|
|
29
|
-
- **ランタイムでのロケール切り替え**(ロケール検出・保持のためのヘルパー付き)。
|
|
30
|
-
- **Viteプラグイン**(ビルド時の変換と開発者体験向上のため)。
|
|
32
|
+
Intlayerを使うことで、以下が可能になります:
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
- **コンポーネントレベルで宣言的な辞書を使い、翻訳を簡単に管理**できます。
|
|
35
|
+
- **メタデータ、ルート、コンテンツを動的にローカライズ**できます。
|
|
36
|
+
- **自動生成される型によりTypeScriptサポートを確保し、オートコンプリートやエラー検出を向上**させます。
|
|
37
|
+
- **動的なロケール検出や切り替えなどの高度な機能**を活用できます。
|
|
38
|
+
- **Tanstack Startのファイルベースのルーティングシステムを使ってロケール対応ルーティングを有効化**します。
|
|
33
39
|
|
|
34
40
|
---
|
|
35
41
|
|
|
36
|
-
##
|
|
42
|
+
## Tanstack StartアプリケーションでIntlayerをセットアップするステップバイステップガイド
|
|
37
43
|
|
|
38
|
-
|
|
39
|
-
# npm
|
|
40
|
-
npm i intlayer react-intlayer
|
|
41
|
-
npm i -D vite-intlayer
|
|
44
|
+
### ステップ1:プロジェクトの作成
|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
TanStack Startの公式サイトにある[新しいプロジェクトの開始](https://tanstack.com/start/latest/docs/framework/react/quick-start)ガイドに従って、新しいTanStack Startプロジェクトを作成します。
|
|
47
|
+
|
|
48
|
+
### ステップ2:Intlayerパッケージのインストール
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
お好みのパッケージマネージャーを使って必要なパッケージをインストールします:
|
|
51
|
+
|
|
52
|
+
```bash packageManager="npm"
|
|
53
|
+
npm install intlayer react-intlayer
|
|
54
|
+
npm install vite-intlayer --save-dev
|
|
50
55
|
```
|
|
51
56
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
```bash packageManager="pnpm"
|
|
58
|
+
pnpm add intlayer react-intlayer
|
|
59
|
+
pnpm add vite-intlayer --save-dev
|
|
60
|
+
```
|
|
55
61
|
|
|
56
|
-
|
|
62
|
+
- **intlayer**
|
|
63
|
+
|
|
64
|
+
コアパッケージであり、設定管理、翻訳、[コンテンツ宣言](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/dictionary/get_started.md)、トランスパイル、および[CLIコマンド](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_cli.md)のための国際化ツールを提供します。
|
|
65
|
+
|
|
66
|
+
- **react-intlayer**
|
|
67
|
+
IntlayerをReactアプリケーションと統合するパッケージです。Reactの国際化のためのコンテキストプロバイダーやフックを提供します。
|
|
57
68
|
|
|
58
|
-
|
|
69
|
+
- **vite-intlayer**
|
|
70
|
+
Intlayerを[Viteバンドラー](https://vite.dev/guide/why.html#why-bundle-for-production)と統合するためのViteプラグインを含み、ユーザーの優先ロケール検出、クッキー管理、URLリダイレクト処理のためのミドルウェアも提供します。
|
|
59
71
|
|
|
60
|
-
|
|
72
|
+
### ステップ3: プロジェクトの設定
|
|
61
73
|
|
|
62
|
-
|
|
63
|
-
|
|
74
|
+
アプリケーションの言語を設定するための設定ファイルを作成します:
|
|
75
|
+
|
|
76
|
+
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
77
|
+
import type { IntlayerConfig } from "intlayer";
|
|
78
|
+
|
|
79
|
+
import { Locales } from "intlayer";
|
|
64
80
|
|
|
65
81
|
const config: IntlayerConfig = {
|
|
66
82
|
internationalization: {
|
|
67
|
-
|
|
68
|
-
|
|
83
|
+
defaultLocale: Locales.ENGLISH, // デフォルトのロケール
|
|
84
|
+
locales: [
|
|
85
|
+
Locales.ENGLISH, // 英語
|
|
86
|
+
Locales.FRENCH, // フランス語
|
|
87
|
+
Locales.SPANISH, // スペイン語
|
|
88
|
+
// 他のロケールを追加
|
|
89
|
+
],
|
|
69
90
|
},
|
|
70
|
-
// contentDir、contentFileExtensions、middlewareオプションなども調整可能です。
|
|
71
91
|
};
|
|
72
92
|
|
|
73
93
|
export default config;
|
|
74
94
|
```
|
|
75
95
|
|
|
76
|
-
|
|
96
|
+
```javascript fileName="intlayer.config.mjs" codeFormat="esm"
|
|
97
|
+
import { Locales } from "intlayer";
|
|
98
|
+
|
|
99
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
100
|
+
const config = {
|
|
101
|
+
internationalization: {
|
|
102
|
+
defaultLocale: Locales.ENGLISH, // デフォルトのロケール
|
|
103
|
+
locales: [
|
|
104
|
+
Locales.ENGLISH, // 英語
|
|
105
|
+
Locales.FRENCH, // フランス語
|
|
106
|
+
Locales.SPANISH, // スペイン語
|
|
107
|
+
// 他のロケール
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
};
|
|
77
111
|
|
|
78
|
-
|
|
112
|
+
export default config;
|
|
113
|
+
```
|
|
79
114
|
|
|
80
|
-
|
|
115
|
+
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
116
|
+
const { Locales } = require("intlayer");
|
|
81
117
|
|
|
82
|
-
|
|
118
|
+
/** @type {import('intlayer').IntlayerConfig} */
|
|
119
|
+
const config = {
|
|
120
|
+
internationalization: {
|
|
121
|
+
defaultLocale: Locales.ENGLISH,
|
|
122
|
+
locales: [
|
|
123
|
+
Locales.ENGLISH,
|
|
124
|
+
Locales.FRENCH,
|
|
125
|
+
Locales.SPANISH,
|
|
126
|
+
// 他のロケール
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
module.exports = config;
|
|
132
|
+
```
|
|
83
133
|
|
|
84
|
-
|
|
134
|
+
> この設定ファイルを通じて、ローカライズされたURL、ミドルウェアのリダイレクション、クッキー名、コンテンツ宣言の場所と拡張子、コンソールでのIntlayerログの無効化などを設定できます。利用可能なパラメータの完全なリストについては、[設定ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/configuration.md)を参照してください。
|
|
85
135
|
|
|
86
|
-
|
|
136
|
+
### ステップ4: Vite設定にIntlayerを統合する
|
|
137
|
+
|
|
138
|
+
設定にintlayerプラグインを追加します:
|
|
139
|
+
|
|
140
|
+
```typescript fileName="vite.config.ts" codeFormat="typescript"
|
|
141
|
+
import { reactRouter } from "@react-router/dev/vite";
|
|
87
142
|
import { defineConfig } from "vite";
|
|
88
|
-
import
|
|
89
|
-
import
|
|
143
|
+
import { intlayerMiddlewarePlugin, intlayerPlugin } from "vite-intlayer";
|
|
144
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
90
145
|
|
|
91
146
|
export default defineConfig({
|
|
92
147
|
plugins: [
|
|
93
|
-
|
|
148
|
+
reactRouter(),
|
|
149
|
+
tsconfigPaths(),
|
|
94
150
|
intlayerPlugin(),
|
|
95
|
-
|
|
96
|
-
intLayerMiddlewarePlugin(),
|
|
151
|
+
intlayerMiddlewarePlugin(),
|
|
97
152
|
],
|
|
98
153
|
});
|
|
99
154
|
```
|
|
100
155
|
|
|
101
|
-
>
|
|
156
|
+
> `intlayerPlugin()` Viteプラグインは、IntlayerをViteに統合するために使用されます。これにより、コンテンツ宣言ファイルのビルドが保証され、開発モードでの監視が行われます。また、Viteアプリケーション内でIntlayerの環境変数を定義します。さらに、パフォーマンス最適化のためのエイリアスも提供します。
|
|
102
157
|
|
|
103
|
-
|
|
158
|
+
### ステップ5: レイアウトコンポーネントの作成
|
|
159
|
+
|
|
160
|
+
ルートレイアウトとロケール固有のレイアウトを設定します。
|
|
161
|
+
|
|
162
|
+
#### ルートレイアウト
|
|
104
163
|
|
|
105
|
-
|
|
164
|
+
```tsx fileName="src/routes/{-$locale}/route.tsx" codeFormat="typescript"
|
|
165
|
+
// src/routes/{-$locale}/route.tsx
|
|
166
|
+
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
167
|
+
import { configuration } from "intlayer";
|
|
168
|
+
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
169
|
+
|
|
170
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
171
|
+
|
|
172
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
173
|
+
component: LayoutComponent,
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
function LayoutComponent() {
|
|
177
|
+
const { locale } = Route.useParams();
|
|
178
|
+
|
|
179
|
+
return (
|
|
180
|
+
<IntlayerProvider locale={locale}>
|
|
181
|
+
<Outlet />
|
|
182
|
+
</IntlayerProvider>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
```
|
|
106
186
|
|
|
107
|
-
|
|
187
|
+
### ステップ6: コンテンツを宣言する
|
|
108
188
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
189
|
+
翻訳を保存するためのコンテンツ宣言を作成および管理します:
|
|
190
|
+
|
|
191
|
+
```tsx fileName="src/contents/page.content.ts" contentDeclarationFormat="typescript"
|
|
192
|
+
import type { Dictionary } from "intlayer";
|
|
193
|
+
|
|
194
|
+
import { t } from "intlayer";
|
|
112
195
|
|
|
113
196
|
const appContent = {
|
|
114
|
-
key: "app",
|
|
115
197
|
content: {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
198
|
+
links: {
|
|
199
|
+
about: t({
|
|
200
|
+
en: "About",
|
|
201
|
+
es: "Acerca de",
|
|
202
|
+
fr: "À propos",
|
|
203
|
+
}),
|
|
204
|
+
home: t({
|
|
205
|
+
en: "ホーム",
|
|
206
|
+
es: "Inicio",
|
|
207
|
+
fr: "Accueil",
|
|
208
|
+
}),
|
|
209
|
+
},
|
|
210
|
+
meta: {
|
|
211
|
+
description: t({
|
|
212
|
+
en: "これは Intlayer と TanStack Router を使用した例です",
|
|
213
|
+
es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
|
|
214
|
+
fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
|
|
215
|
+
}),
|
|
216
|
+
},
|
|
128
217
|
title: t({
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
fr: "
|
|
132
|
-
es: "TanStack Start + React",
|
|
133
|
-
}),
|
|
134
|
-
count: t({
|
|
135
|
-
ja: "カウントは ",
|
|
136
|
-
en: "count is ",
|
|
137
|
-
fr: "le compte est ",
|
|
138
|
-
es: "el recuento es ",
|
|
139
|
-
}),
|
|
140
|
-
edit: t<ReactNode>({
|
|
141
|
-
ja: (
|
|
142
|
-
<>
|
|
143
|
-
<code>src/routes/index.tsx</code> を編集して保存し、HMRをテストします
|
|
144
|
-
</>
|
|
145
|
-
),
|
|
146
|
-
en: (
|
|
147
|
-
<>
|
|
148
|
-
Edit <code>src/routes/index.tsx</code> and save to test HMR
|
|
149
|
-
</>
|
|
150
|
-
),
|
|
151
|
-
fr: (
|
|
152
|
-
<>
|
|
153
|
-
Éditez <code>src/routes/index.tsx</code> et enregistrez pour tester
|
|
154
|
-
HMR
|
|
155
|
-
</>
|
|
156
|
-
),
|
|
157
|
-
es: (
|
|
158
|
-
<>
|
|
159
|
-
Edita <code>src/routes/index.tsx</code> y guarda para probar HMR
|
|
160
|
-
</>
|
|
161
|
-
),
|
|
162
|
-
}),
|
|
163
|
-
readTheDocs: t({
|
|
164
|
-
en: "Click the logos to learn more",
|
|
165
|
-
fr: "Cliquez sur les logos pour en savoir plus",
|
|
166
|
-
es: "Haz clic en los logotipos para saber más",
|
|
167
|
-
ja: "ロゴをクリックして詳細を学ぶ",
|
|
218
|
+
en: "Intlayer + TanStack Router へようこそ",
|
|
219
|
+
es: "Bienvenido a Intlayer + TanStack Router",
|
|
220
|
+
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
168
221
|
}),
|
|
169
222
|
},
|
|
223
|
+
key: "app",
|
|
170
224
|
} satisfies Dictionary;
|
|
171
225
|
|
|
172
226
|
export default appContent;
|
|
173
227
|
```
|
|
174
228
|
|
|
175
|
-
|
|
229
|
+
> コンテンツ宣言は、アプリケーション内のどこにでも定義できますが、`contentDir` ディレクトリ(デフォルトは `./app`)に含まれている必要があります。また、コンテンツ宣言ファイルの拡張子(デフォルトは `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)に一致している必要があります。
|
|
176
230
|
|
|
177
|
-
>
|
|
231
|
+
> 詳細については、[コンテンツ宣言のドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/dictionary/get_started.md)を参照してください。
|
|
178
232
|
|
|
179
|
-
|
|
233
|
+
### ステップ7: ロケール対応コンポーネントとフックを作成する
|
|
180
234
|
|
|
181
|
-
|
|
235
|
+
ロケール対応のナビゲーション用に `LocalizedLink` コンポーネントを作成します:
|
|
182
236
|
|
|
183
|
-
|
|
237
|
+
```tsx fileName="src/components/localized-link.tsx" codeFormat="typescript"
|
|
238
|
+
// src/components/localized-link.tsx
|
|
239
|
+
// eslint-disable-next-line no-restricted-imports
|
|
240
|
+
import { Link, type LinkProps } from "@tanstack/react-router";
|
|
241
|
+
import { getLocalizedUrl } from "intlayer";
|
|
242
|
+
import { useLocale } from "react-intlayer";
|
|
184
243
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
createRootRoute,
|
|
189
|
-
Link as RouterLink,
|
|
190
|
-
} from "@tanstack/react-router";
|
|
191
|
-
import { IntlayerProvider, useIntlayer } from "react-intlayer";
|
|
192
|
-
|
|
193
|
-
function AppShell() {
|
|
194
|
-
// トップレベルで辞書を使用する例:
|
|
195
|
-
const content = useIntlayer("app");
|
|
244
|
+
type LocalizedLinkProps = {
|
|
245
|
+
to: string;
|
|
246
|
+
} & Omit<LinkProps, "to">;
|
|
196
247
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
<nav className="flex gap-3 p-3">
|
|
200
|
-
<RouterLink to="/">ホーム</RouterLink>
|
|
201
|
-
<RouterLink to="/about">アバウト</RouterLink>
|
|
202
|
-
</nav>
|
|
203
|
-
<main className="p-6">
|
|
204
|
-
<h1>{content.title}</h1>
|
|
205
|
-
<Outlet />
|
|
206
|
-
</main>
|
|
207
|
-
</div>
|
|
208
|
-
);
|
|
209
|
-
}
|
|
248
|
+
export function LocalizedLink(props: LocalizedLinkProps) {
|
|
249
|
+
const { locale } = useLocale();
|
|
210
250
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
<AppShell />
|
|
215
|
-
</IntlayerProvider>
|
|
216
|
-
),
|
|
217
|
-
});
|
|
218
|
-
```
|
|
251
|
+
const isExternal = (to: string) => {
|
|
252
|
+
return /^(https?:)?\/\//.test(to);
|
|
253
|
+
};
|
|
219
254
|
|
|
220
|
-
|
|
255
|
+
const to = isExternal(props.to)
|
|
256
|
+
? props.to
|
|
257
|
+
: getLocalizedUrl(props.to, locale);
|
|
221
258
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
import { useIntlayer } from "react-intlayer";
|
|
225
|
-
import reactLogo from "../assets/react.svg";
|
|
226
|
-
|
|
227
|
-
export const Route = createFileRoute("/")({
|
|
228
|
-
component: () => {
|
|
229
|
-
const content = useIntlayer("app");
|
|
230
|
-
return (
|
|
231
|
-
<>
|
|
232
|
-
<button>{content.count}0</button>
|
|
233
|
-
<p>{content.edit}</p>
|
|
234
|
-
<img
|
|
235
|
-
src={reactLogo}
|
|
236
|
-
alt={content.reactLogo.value}
|
|
237
|
-
width={48}
|
|
238
|
-
height={48}
|
|
239
|
-
/>
|
|
240
|
-
<p className="opacity-70">{content.readTheDocs}</p>
|
|
241
|
-
</>
|
|
242
|
-
);
|
|
243
|
-
},
|
|
244
|
-
});
|
|
259
|
+
return <Link {...props} to={to as LinkProps["to"]} />;
|
|
260
|
+
}
|
|
245
261
|
```
|
|
246
262
|
|
|
247
|
-
|
|
248
|
-
>
|
|
249
|
-
> ```jsx
|
|
250
|
-
> <img alt={c.reactLogo.value} />
|
|
251
|
-
> ```
|
|
263
|
+
プログラム的なナビゲーションのために `useLocalizedNavigate` フックを作成します:
|
|
252
264
|
|
|
253
|
-
|
|
265
|
+
```tsx fileName="src/hooks/useLocalizedNavigate.tsx" codeFormat="typescript"
|
|
266
|
+
// src/hooks/useLocalizedNavigate.tsx
|
|
267
|
+
// eslint-disable-next-line no-restricted-imports
|
|
268
|
+
import { NavigateOptions, useNavigate } from "@tanstack/react-router";
|
|
269
|
+
import { getLocalizedUrl } from "intlayer";
|
|
270
|
+
import { useLocale } from "react-intlayer";
|
|
254
271
|
|
|
255
|
-
|
|
272
|
+
type LocalizedNavigateOptions = {
|
|
273
|
+
to: string;
|
|
274
|
+
} & Omit<NavigateOptions, "to">;
|
|
256
275
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
276
|
+
export const useLocalizedNavigate = () => {
|
|
277
|
+
const navigate = useNavigate();
|
|
278
|
+
const { locale } = useLocale();
|
|
260
279
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}
|
|
280
|
+
const isExternal = (to: string) => {
|
|
281
|
+
return /^(https?:)?\/\//.test(to);
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
const localizedNavigate = (options: LocalizedNavigateOptions) => {
|
|
285
|
+
const to = isExternal(options.to)
|
|
286
|
+
? options.to
|
|
287
|
+
: getLocalizedUrl(options.to, locale);
|
|
288
|
+
|
|
289
|
+
navigate({ ...options, to: to as NavigateOptions["to"] });
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
return localizedNavigate;
|
|
293
|
+
};
|
|
271
294
|
```
|
|
272
295
|
|
|
273
|
-
|
|
296
|
+
### ステップ8: ページでIntlayerを活用する
|
|
274
297
|
|
|
275
|
-
|
|
298
|
+
アプリケーション全体でコンテンツ辞書にアクセスします:
|
|
276
299
|
|
|
277
|
-
|
|
300
|
+
#### ルートリダイレクトページ
|
|
278
301
|
|
|
279
|
-
|
|
302
|
+
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
303
|
+
// src/routes/page.tsx
|
|
304
|
+
import { useLocale } from "react-intlayer";
|
|
305
|
+
import { Navigate } from "react-router";
|
|
280
306
|
|
|
281
|
-
|
|
307
|
+
export default function Page() {
|
|
308
|
+
const { locale } = useLocale();
|
|
282
309
|
|
|
283
|
-
|
|
310
|
+
return <Navigate replace to={locale} />;
|
|
311
|
+
}
|
|
312
|
+
```
|
|
284
313
|
|
|
285
|
-
|
|
314
|
+
#### ローカライズされたホームページ
|
|
286
315
|
|
|
287
|
-
```tsx fileName="src/
|
|
288
|
-
import {
|
|
289
|
-
import {
|
|
290
|
-
import {
|
|
316
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
317
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
318
|
+
import { getIntlayer } from "intlayer";
|
|
319
|
+
import { useIntlayer } from "react-intlayer";
|
|
291
320
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
321
|
+
import LocaleSwitcher from "@/components/locale-switcher";
|
|
322
|
+
import { LocalizedLink } from "@/components/localized-link";
|
|
323
|
+
import { useLocalizedNavigate } from "@/hooks/useLocalizedNavigate";
|
|
324
|
+
|
|
325
|
+
export const Route = createFileRoute("/{-$locale}/")({
|
|
326
|
+
component: RouteComponent,
|
|
327
|
+
head: ({ params }) => {
|
|
328
|
+
const { locale } = params;
|
|
329
|
+
const metaContent = getIntlayer("app", locale);
|
|
330
|
+
|
|
331
|
+
return {
|
|
332
|
+
meta: [
|
|
333
|
+
{ title: metaContent.title },
|
|
334
|
+
{ content: metaContent.meta.description, name: "description" },
|
|
335
|
+
],
|
|
336
|
+
};
|
|
337
|
+
},
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
function RouteComponent() {
|
|
341
|
+
const content = useIntlayer("app");
|
|
342
|
+
const navigate = useLocalizedNavigate();
|
|
305
343
|
|
|
306
344
|
return (
|
|
307
|
-
<div className="
|
|
308
|
-
<
|
|
309
|
-
|
|
310
|
-
|
|
345
|
+
<div className="grid place-items-center h-screen">
|
|
346
|
+
<div className="flex flex-col gap-4 items-center text-center">
|
|
347
|
+
{content.title}
|
|
348
|
+
<LocaleSwitcher />
|
|
349
|
+
<div className="flex gap-4">
|
|
350
|
+
<a href="/">インデックス</a>
|
|
351
|
+
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
352
|
+
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
353
|
+
</div>
|
|
354
|
+
<div className="flex gap-4">
|
|
355
|
+
<button onClick={() => navigate({ to: "/" })}>
|
|
356
|
+
{content.links.home}
|
|
357
|
+
</button>
|
|
358
|
+
<button onClick={() => navigate({ to: "/about" })}>
|
|
359
|
+
{content.links.about}
|
|
360
|
+
</button>
|
|
361
|
+
</div>
|
|
362
|
+
</div>
|
|
311
363
|
</div>
|
|
312
364
|
);
|
|
313
365
|
}
|
|
314
366
|
```
|
|
315
367
|
|
|
316
|
-
|
|
368
|
+
> `useIntlayer` フックの詳細については、[ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/packages/react-intlayer/useIntlayer.md)を参照してください。
|
|
317
369
|
|
|
318
|
-
|
|
370
|
+
### ステップ9: ロケールスイッチャーコンポーネントの作成
|
|
319
371
|
|
|
320
|
-
|
|
372
|
+
ユーザーが言語を切り替えられるコンポーネントを作成します:
|
|
321
373
|
|
|
322
|
-
```tsx fileName="src/
|
|
323
|
-
import {
|
|
324
|
-
import {
|
|
325
|
-
|
|
374
|
+
```tsx fileName="src/components/locale-switcher.tsx" codeFormat="typescript"
|
|
375
|
+
import { useLocation } from "@tanstack/react-router";
|
|
376
|
+
import {
|
|
377
|
+
getHTMLTextDir,
|
|
378
|
+
getLocaleName,
|
|
379
|
+
getLocalizedUrl,
|
|
380
|
+
Locales,
|
|
381
|
+
} from "intlayer";
|
|
382
|
+
import { useIntlayer, useLocale } from "react-intlayer";
|
|
383
|
+
|
|
384
|
+
export default function LocaleSwitcher() {
|
|
385
|
+
const { pathname, searchStr } = useLocation();
|
|
386
|
+
const content = useIntlayer("locale-switcher");
|
|
387
|
+
|
|
388
|
+
const { availableLocales, locale, setLocale } = useLocale({
|
|
389
|
+
onLocaleChange: (newLocale) => {
|
|
390
|
+
const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
|
|
391
|
+
location.replace(pathWithLocale);
|
|
392
|
+
},
|
|
393
|
+
});
|
|
326
394
|
|
|
327
|
-
function Document({
|
|
328
|
-
locale,
|
|
329
|
-
children,
|
|
330
|
-
}: {
|
|
331
|
-
locale: string;
|
|
332
|
-
children: React.ReactNode;
|
|
333
|
-
}) {
|
|
334
395
|
return (
|
|
335
|
-
<
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
396
|
+
<select
|
|
397
|
+
aria-label={content.label.toString()}
|
|
398
|
+
onChange={(e) => setLocale(e.target.value)}
|
|
399
|
+
value={locale}
|
|
400
|
+
>
|
|
401
|
+
{availableLocales.map((localeItem) => (
|
|
402
|
+
<option
|
|
403
|
+
dir={getHTMLTextDir(localeItem)}
|
|
404
|
+
key={localeItem}
|
|
405
|
+
lang={localeItem}
|
|
406
|
+
value={localeItem}
|
|
407
|
+
>
|
|
408
|
+
{/* 例: Français (フランス語) */}
|
|
409
|
+
{getLocaleName(localeItem, locale)} (
|
|
410
|
+
{getLocaleName(localeItem, Locales.ENGLISH)})
|
|
411
|
+
</option>
|
|
412
|
+
))}
|
|
413
|
+
</select>
|
|
343
414
|
);
|
|
344
415
|
}
|
|
345
|
-
|
|
346
|
-
export const Route = createRootRoute({
|
|
347
|
-
component: () => (
|
|
348
|
-
<IntlayerProvider>
|
|
349
|
-
{/* サーバーでロケールを計算する場合はDocumentに渡してください。そうでなければクライアント側でハイドレーション後に修正されます */}
|
|
350
|
-
<Document locale={document?.documentElement?.lang || "en"}>
|
|
351
|
-
<Outlet />
|
|
352
|
-
</Document>
|
|
353
|
-
</IntlayerProvider>
|
|
354
|
-
),
|
|
355
|
-
});
|
|
356
416
|
```
|
|
357
417
|
|
|
358
|
-
|
|
418
|
+
> `useLocale` フックの詳細については、[ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/packages/react-intlayer/useLocale.md)を参照してください。
|
|
419
|
+
|
|
420
|
+
### ステップ10: HTML属性の管理を追加(オプション)
|
|
359
421
|
|
|
360
|
-
|
|
422
|
+
HTMLのlangおよびdir属性を管理するフックを作成します:
|
|
423
|
+
|
|
424
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
425
|
+
// src/hooks/useI18nHTMLAttributes.tsx
|
|
426
|
+
import { getHTMLTextDir } from "intlayer";
|
|
361
427
|
import { useEffect } from "react";
|
|
362
428
|
import { useLocale } from "react-intlayer";
|
|
363
|
-
import { getHTMLTextDir } from "intlayer";
|
|
364
429
|
|
|
365
430
|
export const useI18nHTMLAttributes = () => {
|
|
366
431
|
const { locale } = useLocale();
|
|
432
|
+
|
|
367
433
|
useEffect(() => {
|
|
368
|
-
document.documentElement.lang = locale;
|
|
369
|
-
document.documentElement.dir = getHTMLTextDir(locale);
|
|
434
|
+
document.documentElement.lang = locale; // HTMLのlang属性を設定
|
|
435
|
+
document.documentElement.dir = getHTMLTextDir(locale); // HTMLのdir属性を設定
|
|
370
436
|
}, [locale]);
|
|
371
437
|
};
|
|
372
438
|
```
|
|
373
439
|
|
|
374
|
-
|
|
440
|
+
次に、ルートコンポーネントでこれを使用します:
|
|
375
441
|
|
|
376
|
-
|
|
442
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
443
|
+
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
444
|
+
import { configuration } from "intlayer";
|
|
445
|
+
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
377
446
|
|
|
378
|
-
|
|
447
|
+
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // フックをインポート
|
|
379
448
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
forwardRef,
|
|
384
|
-
type AnchorHTMLAttributes,
|
|
385
|
-
type DetailedHTMLProps,
|
|
386
|
-
} from "react";
|
|
387
|
-
import { useLocale } from "react-intlayer";
|
|
449
|
+
export const Route = createFileRoute("/{-$locale}")({
|
|
450
|
+
component: LayoutComponent,
|
|
451
|
+
});
|
|
388
452
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
const hrefI18n =
|
|
401
|
-
href && !isExternal(href) ? getLocalizedUrl(href, locale) : href;
|
|
402
|
-
return (
|
|
403
|
-
<a href={hrefI18n} ref={ref} {...props}>
|
|
404
|
-
{children}
|
|
405
|
-
</a>
|
|
406
|
-
);
|
|
407
|
-
}
|
|
408
|
-
);
|
|
409
|
-
Link.displayName = "Link";
|
|
453
|
+
function LayoutComponent() {
|
|
454
|
+
useI18nHTMLAttributes(); // この行を追加
|
|
455
|
+
|
|
456
|
+
const { locale } = Route.useParams();
|
|
457
|
+
|
|
458
|
+
return (
|
|
459
|
+
<IntlayerProvider locale={locale}>
|
|
460
|
+
<Outlet />
|
|
461
|
+
</IntlayerProvider>
|
|
462
|
+
);
|
|
463
|
+
}
|
|
410
464
|
```
|
|
411
465
|
|
|
412
|
-
|
|
466
|
+
### ステップ11: アプリケーションのビルドと実行
|
|
413
467
|
|
|
414
|
-
|
|
468
|
+
コンテンツ辞書をビルドし、アプリケーションを実行します:
|
|
415
469
|
|
|
416
|
-
|
|
470
|
+
```bash packageManager="npm"
|
|
471
|
+
# Intlayerの辞書をビルド
|
|
472
|
+
npm run intlayer:build
|
|
417
473
|
|
|
418
|
-
|
|
474
|
+
# 開発サーバーを起動
|
|
475
|
+
npm run dev
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
```bash packageManager="pnpm"
|
|
479
|
+
# Intlayerの辞書をビルド
|
|
480
|
+
pnpm intlayer:build
|
|
481
|
+
|
|
482
|
+
# 開発サーバーを起動
|
|
483
|
+
pnpm dev
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
```bash packageManager="yarn"
|
|
487
|
+
# Intlayerの辞書をビルド
|
|
488
|
+
yarn intlayer:build
|
|
489
|
+
|
|
490
|
+
# 開発サーバーを起動
|
|
491
|
+
yarn dev
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
### ステップ12: TypeScriptの設定(任意)
|
|
495
|
+
|
|
496
|
+
Intlayerはモジュール拡張を使用してTypeScriptの利点を活かし、コードベースをより強固にします。
|
|
497
|
+
|
|
498
|
+
TypeScriptの設定に自動生成された型が含まれていることを確認してください:
|
|
419
499
|
|
|
420
500
|
```json5 fileName="tsconfig.json"
|
|
421
501
|
{
|
|
422
|
-
|
|
502
|
+
compilerOptions: {
|
|
503
|
+
// ... 既存のTypeScript設定
|
|
504
|
+
},
|
|
505
|
+
include: [
|
|
506
|
+
// ... 既存のインクルード
|
|
507
|
+
".intlayer/**/*.ts", // 自動生成された型を含める
|
|
508
|
+
],
|
|
423
509
|
}
|
|
424
510
|
```
|
|
425
511
|
|
|
426
|
-
|
|
512
|
+
### Git設定
|
|
427
513
|
|
|
428
|
-
|
|
514
|
+
Intlayerによって生成されたファイルは無視することを推奨します。これにより、Gitリポジトリへのコミットを避けることができます。
|
|
429
515
|
|
|
430
|
-
|
|
516
|
+
これを行うには、`.gitignore`ファイルに以下の指示を追加してください:
|
|
431
517
|
|
|
432
|
-
```gitignore
|
|
518
|
+
```plaintext fileName=".gitignore"
|
|
519
|
+
# Intlayerによって生成されたファイルを無視する
|
|
433
520
|
.intlayer
|
|
434
521
|
```
|
|
435
522
|
|
|
436
523
|
---
|
|
437
524
|
|
|
438
|
-
|
|
525
|
+
### ステップ13: リダイレクトの作成(オプション)
|
|
526
|
+
|
|
527
|
+
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
528
|
+
function LayoutComponent() {
|
|
529
|
+
useI18nHTMLAttributes();
|
|
530
|
+
|
|
531
|
+
const { locale } = Route.useParams();
|
|
532
|
+
const { locale: selectedLocale } = useLocale();
|
|
533
|
+
const { defaultLocale } = configuration.internationalization;
|
|
534
|
+
const { prefixDefault } = configuration.middleware;
|
|
535
|
+
|
|
536
|
+
// prefixDefault が true の場合、URL にロケールが存在しないときはデフォルトロケールへリダイレクトする
|
|
537
|
+
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
538
|
+
return <Navigate replace to={defaultLocale} />;
|
|
539
|
+
}
|
|
439
540
|
|
|
440
|
-
|
|
441
|
-
|
|
541
|
+
// URL のロケールが選択されたロケールと一致しない場合は選択されたロケールへリダイレクトする
|
|
542
|
+
if (selectedLocale !== defaultLocale && !locale) {
|
|
543
|
+
return <Navigate replace to={selectedLocale} />;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
return (
|
|
547
|
+
<IntlayerProvider locale={locale}>
|
|
548
|
+
<Outlet />
|
|
549
|
+
</IntlayerProvider>
|
|
550
|
+
);
|
|
551
|
+
}
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
## 本番環境へのデプロイ
|
|
555
|
+
|
|
556
|
+
アプリケーションをデプロイする際は、以下の手順を行ってください:
|
|
557
|
+
|
|
558
|
+
1. **アプリケーションをビルドする:**
|
|
559
|
+
|
|
560
|
+
```bash
|
|
561
|
+
npm run build
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
2. **Intlayerの辞書をビルドする:**
|
|
565
|
+
|
|
566
|
+
```bash
|
|
567
|
+
npm run intlayer:build
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
3. **本番環境でミドルウェアを使用する場合は、`vite-intlayer`を依存関係に移動する:**
|
|
571
|
+
```bash
|
|
572
|
+
npm install vite-intlayer --save
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
これでアプリケーションは以下をサポートします:
|
|
576
|
+
|
|
577
|
+
- **URL構造**: `/en`, `/en/about`, `/tr`, `/tr/about`
|
|
578
|
+
- **ブラウザの設定に基づく自動ロケール検出**
|
|
579
|
+
- **Tanstack Startによるロケール対応ルーティング**
|
|
580
|
+
- **自動生成された型定義によるTypeScriptサポート**
|
|
581
|
+
- **適切なロケール処理を行うサーバーサイドレンダリング**
|
|
582
|
+
|
|
583
|
+
## VS Code拡張機能
|
|
584
|
+
|
|
585
|
+
Intlayerでの開発体験を向上させるために、公式の**Intlayer VS Code拡張機能**をインストールできます。
|
|
586
|
+
|
|
587
|
+
[VS Codeマーケットプレイスからインストール](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
588
|
+
|
|
589
|
+
この拡張機能は以下を提供します:
|
|
590
|
+
|
|
591
|
+
- 翻訳キーの**オートコンプリート**。
|
|
592
|
+
- 翻訳が不足している場合の**リアルタイムエラー検出**。
|
|
593
|
+
- 翻訳されたコンテンツの**インラインプレビュー**。
|
|
594
|
+
- 翻訳の作成や更新を簡単に行うための**クイックアクション**。
|
|
595
|
+
|
|
596
|
+
拡張機能の使い方の詳細については、[Intlayer VS Code拡張機能のドキュメント](https://intlayer.org/doc/vs-code-extension)を参照してください。
|
|
442
597
|
|
|
443
598
|
---
|
|
444
599
|
|
|
445
600
|
## さらに進む
|
|
446
601
|
|
|
447
|
-
|
|
448
|
-
- CMSモード
|
|
449
|
-
- エッジでのロケール検出 / アダプター
|
|
602
|
+
さらに進めるには、[ビジュアルエディター](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_visual_editor.md)を実装するか、[CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_CMS.md)を使用してコンテンツを外部化することができます。
|
|
450
603
|
|
|
451
604
|
---
|
|
452
605
|
|
|
606
|
+
## ドキュメント参照
|
|
607
|
+
|
|
608
|
+
- [Intlayer ドキュメント](https://intlayer.org)
|
|
609
|
+
- [Tanstack Start ドキュメント](https://reactrouter.com/)
|
|
610
|
+
- [useIntlayer フック](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/packages/react-intlayer/useIntlayer.md)
|
|
611
|
+
- [useLocale フック](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/packages/react-intlayer/useLocale.md)
|
|
612
|
+
- [コンテンツ宣言](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/dictionary/get_started.md)
|
|
613
|
+
- [設定](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/configuration.md)
|
|
614
|
+
|
|
615
|
+
この包括的なガイドは、IntlayerをTanstack Startと統合し、ロケール対応のルーティングとTypeScriptサポートを備えた完全な国際化アプリケーションを構築するために必要なすべてを提供します。
|
|
616
|
+
|
|
453
617
|
## ドキュメント履歴
|
|
454
618
|
|
|
455
|
-
| バージョン | 日付 | 変更内容
|
|
456
|
-
| ---------- | ---------- |
|
|
457
|
-
|
|
|
619
|
+
| バージョン | 日付 | 変更内容 |
|
|
620
|
+
| ---------- | ---------- | ------------------------ |
|
|
621
|
+
| 5.8.1 | 2025-09-09 | Tanstack Start向けに追加 |
|