@intlayer/docs 5.5.11 → 5.6.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/intlayer_with_next-intl.md +0 -1
- package/blog/ar/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ar/what_is_internationalization.md +2 -2
- package/blog/de/intlayer_with_next-intl.md +0 -1
- package/blog/de/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/de/what_is_internationalization.md +2 -2
- package/blog/en/intlayer_with_next-intl.md +0 -1
- package/blog/en/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/en/what_is_internationalization.md +2 -2
- package/blog/en-GB/intlayer_with_next-intl.md +0 -1
- package/blog/en-GB/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/en-GB/what_is_internationalization.md +2 -2
- package/blog/es/intlayer_with_next-intl.md +0 -1
- package/blog/es/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/es/what_is_internationalization.md +2 -2
- package/blog/fr/intlayer_with_next-intl.md +0 -1
- package/blog/fr/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/fr/what_is_internationalization.md +2 -2
- package/blog/hi/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/hi/what_is_internationalization.md +2 -2
- package/blog/it/intlayer_with_next-intl.md +0 -1
- package/blog/it/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/it/what_is_internationalization.md +2 -2
- package/blog/ja/intlayer_with_next-intl.md +0 -1
- package/blog/ja/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ja/what_is_internationalization.md +2 -2
- package/blog/ko/intlayer_with_next-intl.md +0 -1
- package/blog/ko/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/pt/intlayer_with_next-intl.md +0 -1
- package/blog/pt/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/pt/what_is_internationalization.md +2 -2
- package/blog/ru/intlayer_with_next-intl.md +0 -1
- package/blog/ru/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ru/what_is_internationalization.md +2 -2
- package/blog/zh/intlayer_with_next-intl.md +0 -1
- package/blog/zh/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/zh/what_is_internationalization.md +2 -2
- package/dist/cjs/blog.cjs +2 -2
- package/dist/cjs/blog.cjs.map +1 -1
- package/dist/cjs/common.cjs +17 -6
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/doc.cjs +2 -2
- package/dist/cjs/doc.cjs.map +1 -1
- package/dist/cjs/frequentQuestions.cjs +2 -2
- package/dist/cjs/frequentQuestions.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +1152 -252
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +3778 -1124
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +794 -161
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +32 -31
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/cjs/legal.cjs +2 -2
- package/dist/cjs/legal.cjs.map +1 -1
- package/dist/esm/blog.mjs +2 -2
- package/dist/esm/blog.mjs.map +1 -1
- package/dist/esm/common.mjs +17 -6
- package/dist/esm/common.mjs.map +1 -1
- package/dist/esm/doc.mjs +2 -2
- package/dist/esm/doc.mjs.map +1 -1
- package/dist/esm/frequentQuestions.mjs +2 -2
- package/dist/esm/frequentQuestions.mjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +1151 -252
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +3777 -1124
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +793 -161
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +31 -31
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/esm/legal.mjs +2 -2
- package/dist/esm/legal.mjs.map +1 -1
- package/dist/types/blog.d.ts +2 -2
- package/dist/types/blog.d.ts.map +1 -1
- package/dist/types/common.d.ts +5 -2
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/doc.d.ts +2 -2
- package/dist/types/doc.d.ts.map +1 -1
- package/dist/types/frequentQuestions.d.ts +2 -2
- package/dist/types/frequentQuestions.d.ts.map +1 -1
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/dist/types/legal.d.ts +2 -2
- package/dist/types/legal.d.ts.map +1 -1
- package/docs/ar/intlayer_CMS.md +1 -0
- package/docs/ar/intlayer_cli.md +292 -177
- package/docs/ar/intlayer_visual_editor.md +1 -0
- package/docs/ar/intlayer_with_angular.md +1 -0
- package/docs/ar/intlayer_with_create_react_app.md +1 -0
- package/docs/ar/intlayer_with_lynx+react.md +1 -0
- package/docs/ar/intlayer_with_nextjs_14.md +1 -0
- package/docs/ar/intlayer_with_nextjs_15.md +3 -1
- package/docs/ar/intlayer_with_nuxt.md +1 -0
- package/docs/ar/intlayer_with_react_native+expo.md +1 -0
- package/docs/ar/intlayer_with_vite+preact.md +4 -3
- package/docs/ar/intlayer_with_vite+react.md +108 -112
- package/docs/ar/intlayer_with_vite+solid.md +4 -3
- package/docs/ar/intlayer_with_vite+svelte.md +4 -3
- package/docs/ar/intlayer_with_vite+vue.md +5 -4
- package/docs/ar/mcp_server.md +126 -92
- package/docs/de/intlayer_CMS.md +1 -0
- package/docs/de/intlayer_cli.md +291 -171
- package/docs/de/intlayer_visual_editor.md +1 -0
- package/docs/de/intlayer_with_angular.md +1 -0
- package/docs/de/intlayer_with_create_react_app.md +1 -0
- package/docs/de/intlayer_with_lynx+react.md +1 -0
- package/docs/de/intlayer_with_nextjs_14.md +1 -0
- package/docs/de/intlayer_with_nextjs_15.md +3 -1
- package/docs/de/intlayer_with_nuxt.md +1 -0
- package/docs/de/intlayer_with_react_native+expo.md +1 -0
- package/docs/de/intlayer_with_vite+preact.md +4 -3
- package/docs/de/intlayer_with_vite+react.md +128 -146
- package/docs/de/intlayer_with_vite+solid.md +4 -3
- package/docs/de/intlayer_with_vite+svelte.md +4 -3
- package/docs/de/intlayer_with_vite+vue.md +5 -4
- package/docs/de/mcp_server.md +116 -112
- package/docs/en/CI_CD.md +3 -1
- package/docs/en/autoFill.md +3 -1
- package/docs/en/configuration.md +7 -3
- package/docs/en/dictionary/condition.md +3 -1
- package/docs/en/dictionary/content_extention_customization.md +3 -1
- package/docs/en/dictionary/enumeration.md +3 -1
- package/docs/en/dictionary/file.md +3 -1
- package/docs/en/dictionary/function_fetching.md +3 -1
- package/docs/en/dictionary/get_started.md +3 -1
- package/docs/en/dictionary/insertion.md +3 -1
- package/docs/en/dictionary/markdown.md +3 -1
- package/docs/en/dictionary/nesting.md +3 -1
- package/docs/en/dictionary/translation.md +3 -1
- package/docs/en/how_works_intlayer.md +3 -1
- package/docs/en/index.md +3 -1
- package/docs/en/interest_of_intlayer.md +3 -1
- package/docs/en/intlayer_CMS.md +4 -1
- package/docs/en/intlayer_cli.md +246 -136
- package/docs/en/intlayer_visual_editor.md +4 -1
- package/docs/en/intlayer_with_angular.md +4 -1
- package/docs/en/intlayer_with_create_react_app.md +4 -1
- package/docs/en/intlayer_with_express.md +3 -1
- package/docs/en/intlayer_with_lynx+react.md +4 -1
- package/docs/en/intlayer_with_nextjs_14.md +7 -1
- package/docs/en/intlayer_with_nextjs_15.md +8 -2
- package/docs/en/intlayer_with_nextjs_page_router.md +5 -1
- package/docs/en/intlayer_with_nuxt.md +4 -1
- package/docs/en/intlayer_with_react_native+expo.md +4 -1
- package/docs/en/intlayer_with_vite+preact.md +9 -4
- package/docs/en/intlayer_with_vite+react.md +18 -10
- package/docs/en/intlayer_with_vite+solid.md +7 -4
- package/docs/en/intlayer_with_vite+svelte.md +7 -4
- package/docs/en/intlayer_with_vite+vue.md +10 -5
- package/docs/en/introduction.md +3 -1
- package/docs/en/mcp_server.md +114 -80
- package/docs/en/packages/@intlayer/api/index.md +3 -1
- package/docs/en/packages/@intlayer/chokidar/index.md +3 -1
- package/docs/en/packages/@intlayer/cli/index.md +3 -1
- package/docs/en/packages/@intlayer/config/index.md +3 -1
- package/docs/en/packages/@intlayer/core/index.md +3 -1
- package/docs/en/packages/@intlayer/design-system/index.md +3 -1
- package/docs/en/packages/@intlayer/dictionary-entry/index.md +3 -1
- package/docs/en/packages/@intlayer/editor/index.md +3 -1
- package/docs/en/packages/@intlayer/editor-react/index.md +3 -1
- package/docs/en/packages/@intlayer/webpack/index.md +3 -1
- package/docs/en/packages/angular-intlayer/index.md +3 -1
- package/docs/en/packages/express-intlayer/index.md +3 -1
- package/docs/en/packages/express-intlayer/t.md +3 -1
- package/docs/en/packages/intlayer/getConfiguration.md +3 -1
- package/docs/en/packages/intlayer/getEnumeration.md +3 -1
- package/docs/en/packages/intlayer/getHTMLTextDir.md +3 -1
- package/docs/en/packages/intlayer/getLocaleLang.md +3 -1
- package/docs/en/packages/intlayer/getLocaleName.md +3 -1
- package/docs/en/packages/intlayer/getLocalizedUrl.md +3 -1
- package/docs/en/packages/intlayer/getMultilingualUrls.md +3 -1
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +3 -1
- package/docs/en/packages/intlayer/getTranslation.md +3 -1
- package/docs/en/packages/intlayer/getTranslationContent.md +3 -1
- package/docs/en/packages/intlayer/index.md +3 -1
- package/docs/en/packages/intlayer-cli/index.md +3 -1
- package/docs/en/packages/intlayer-editor/index.md +3 -1
- package/docs/en/packages/lynx-intlayer/index.md +3 -1
- package/docs/en/packages/next-intlayer/index.md +3 -1
- package/docs/en/packages/next-intlayer/t.md +3 -1
- package/docs/en/packages/next-intlayer/useDictionary.md +3 -1
- package/docs/en/packages/next-intlayer/useIntlayer.md +3 -1
- package/docs/en/packages/next-intlayer/useIntlayerAsync.md +3 -1
- package/docs/en/packages/next-intlayer/useLocale.md +3 -1
- package/docs/en/packages/nuxt-intlayer/index.md +3 -1
- package/docs/en/packages/preact-intlayer/index.md +3 -1
- package/docs/en/packages/react-intlayer/index.md +3 -1
- package/docs/en/packages/react-intlayer/t.md +3 -1
- package/docs/en/packages/react-intlayer/useDictionary.md +3 -1
- package/docs/en/packages/react-intlayer/useIntlayer.md +3 -1
- package/docs/en/packages/react-intlayer/useIntlayerAsync.md +3 -1
- package/docs/en/packages/react-intlayer/useLocale.md +3 -1
- package/docs/en/packages/react-native-intlayer/index.md +3 -1
- package/docs/en/packages/react-scripts-intlayer/index.md +3 -1
- package/docs/en/packages/solid-intlayer/index.md +3 -1
- package/docs/en/packages/svelte-intlayer/index.md +3 -1
- package/docs/en/packages/vite-intlayer/index.md +3 -1
- package/docs/en/packages/vue-intlayer/index.md +3 -1
- package/docs/en/per_locale_file.md +3 -1
- package/docs/en/roadmap.md +5 -2
- package/docs/en/vs_code_extension.md +3 -1
- package/docs/en-GB/intlayer_CMS.md +1 -0
- package/docs/en-GB/intlayer_cli.md +257 -138
- package/docs/en-GB/intlayer_visual_editor.md +1 -0
- package/docs/en-GB/intlayer_with_angular.md +1 -0
- package/docs/en-GB/intlayer_with_create_react_app.md +1 -0
- package/docs/en-GB/intlayer_with_lynx+react.md +1 -0
- package/docs/en-GB/intlayer_with_nextjs_14.md +1 -0
- package/docs/en-GB/intlayer_with_nextjs_15.md +3 -1
- package/docs/en-GB/intlayer_with_nuxt.md +1 -0
- package/docs/en-GB/intlayer_with_react_native+expo.md +1 -0
- package/docs/en-GB/intlayer_with_vite+preact.md +4 -3
- package/docs/en-GB/intlayer_with_vite+react.md +71 -87
- package/docs/en-GB/intlayer_with_vite+solid.md +4 -3
- package/docs/en-GB/intlayer_with_vite+svelte.md +4 -3
- package/docs/en-GB/intlayer_with_vite+vue.md +5 -4
- package/docs/en-GB/mcp_server.md +116 -82
- package/docs/es/intlayer_CMS.md +1 -0
- package/docs/es/intlayer_cli.md +283 -164
- package/docs/es/intlayer_visual_editor.md +1 -0
- package/docs/es/intlayer_with_angular.md +1 -0
- package/docs/es/intlayer_with_create_react_app.md +1 -0
- package/docs/es/intlayer_with_lynx+react.md +1 -0
- package/docs/es/intlayer_with_nextjs_14.md +1 -0
- package/docs/es/intlayer_with_nextjs_15.md +3 -1
- package/docs/es/intlayer_with_nuxt.md +1 -0
- package/docs/es/intlayer_with_react_native+expo.md +1 -0
- package/docs/es/intlayer_with_vite+preact.md +4 -3
- package/docs/es/intlayer_with_vite+react.md +98 -98
- package/docs/es/intlayer_with_vite+solid.md +4 -3
- package/docs/es/intlayer_with_vite+svelte.md +4 -3
- package/docs/es/intlayer_with_vite+vue.md +5 -4
- package/docs/es/mcp_server.md +120 -86
- package/docs/es/vs_code_extension.md +1 -0
- package/docs/fr/intlayer_CMS.md +1 -0
- package/docs/fr/intlayer_cli.md +280 -184
- package/docs/fr/intlayer_visual_editor.md +1 -0
- package/docs/fr/intlayer_with_angular.md +1 -0
- package/docs/fr/intlayer_with_create_react_app.md +1 -0
- package/docs/fr/intlayer_with_lynx+react.md +1 -0
- package/docs/fr/intlayer_with_nextjs_14.md +1 -0
- package/docs/fr/intlayer_with_nextjs_15.md +3 -1
- package/docs/fr/intlayer_with_nuxt.md +1 -0
- package/docs/fr/intlayer_with_react_native+expo.md +1 -0
- package/docs/fr/intlayer_with_vite+preact.md +5 -4
- package/docs/fr/intlayer_with_vite+react.md +80 -69
- package/docs/fr/intlayer_with_vite+solid.md +4 -3
- package/docs/fr/intlayer_with_vite+svelte.md +4 -3
- package/docs/fr/intlayer_with_vite+vue.md +5 -4
- package/docs/fr/mcp_server.md +121 -87
- package/docs/hi/intlayer_CMS.md +1 -0
- package/docs/hi/intlayer_cli.md +295 -174
- package/docs/hi/intlayer_visual_editor.md +1 -0
- package/docs/hi/intlayer_with_angular.md +1 -0
- package/docs/hi/intlayer_with_create_react_app.md +1 -0
- package/docs/hi/intlayer_with_lynx+react.md +1 -0
- package/docs/hi/intlayer_with_nextjs_14.md +1 -0
- package/docs/hi/intlayer_with_nextjs_15.md +3 -1
- package/docs/hi/intlayer_with_nuxt.md +1 -0
- package/docs/hi/intlayer_with_react_native+expo.md +1 -0
- package/docs/hi/intlayer_with_vite+preact.md +4 -3
- package/docs/hi/intlayer_with_vite+react.md +114 -111
- package/docs/hi/intlayer_with_vite+solid.md +4 -3
- package/docs/hi/intlayer_with_vite+svelte.md +4 -3
- package/docs/hi/intlayer_with_vite+vue.md +5 -4
- package/docs/hi/mcp_server.md +118 -84
- package/docs/it/intlayer_CMS.md +1 -0
- package/docs/it/intlayer_cli.md +282 -167
- package/docs/it/intlayer_visual_editor.md +1 -0
- package/docs/it/intlayer_with_angular.md +1 -0
- package/docs/it/intlayer_with_create_react_app.md +1 -0
- package/docs/it/intlayer_with_lynx+react.md +1 -0
- package/docs/it/intlayer_with_nextjs_14.md +1 -0
- package/docs/it/intlayer_with_nextjs_15.md +3 -1
- package/docs/it/intlayer_with_nuxt.md +1 -0
- package/docs/it/intlayer_with_react_native+expo.md +1 -0
- package/docs/it/intlayer_with_vite+preact.md +4 -3
- package/docs/it/intlayer_with_vite+react.md +163 -116
- package/docs/it/intlayer_with_vite+solid.md +4 -3
- package/docs/it/intlayer_with_vite+svelte.md +4 -3
- package/docs/it/intlayer_with_vite+vue.md +4 -4
- package/docs/it/mcp_server.md +120 -86
- package/docs/ja/intlayer_CMS.md +1 -0
- package/docs/ja/intlayer_cli.md +285 -168
- package/docs/ja/intlayer_visual_editor.md +1 -0
- package/docs/ja/intlayer_with_angular.md +1 -0
- package/docs/ja/intlayer_with_create_react_app.md +1 -0
- package/docs/ja/intlayer_with_lynx+react.md +1 -0
- package/docs/ja/intlayer_with_nextjs_14.md +1 -0
- package/docs/ja/intlayer_with_nextjs_15.md +3 -1
- package/docs/ja/intlayer_with_nuxt.md +1 -0
- package/docs/ja/intlayer_with_react_native+expo.md +1 -0
- package/docs/ja/intlayer_with_vite+preact.md +4 -3
- package/docs/ja/intlayer_with_vite+react.md +160 -222
- package/docs/ja/intlayer_with_vite+solid.md +4 -3
- package/docs/ja/intlayer_with_vite+svelte.md +4 -3
- package/docs/ja/intlayer_with_vite+vue.md +5 -4
- package/docs/ja/mcp_server.md +121 -85
- package/docs/ko/intlayer_CMS.md +1 -0
- package/docs/ko/intlayer_cli.md +291 -175
- package/docs/ko/intlayer_visual_editor.md +1 -0
- package/docs/ko/intlayer_with_angular.md +1 -0
- package/docs/ko/intlayer_with_create_react_app.md +1 -0
- package/docs/ko/intlayer_with_lynx+react.md +1 -0
- package/docs/ko/intlayer_with_nextjs_14.md +1 -0
- package/docs/ko/intlayer_with_nextjs_15.md +3 -1
- package/docs/ko/intlayer_with_nuxt.md +1 -0
- package/docs/ko/intlayer_with_react_native+expo.md +1 -0
- package/docs/ko/intlayer_with_vite+preact.md +4 -3
- package/docs/ko/intlayer_with_vite+react.md +123 -152
- package/docs/ko/intlayer_with_vite+solid.md +4 -3
- package/docs/ko/intlayer_with_vite+svelte.md +4 -3
- package/docs/ko/intlayer_with_vite+vue.md +5 -4
- package/docs/ko/mcp_server.md +117 -83
- package/docs/ko/packages/intlayer/getLocalizedUrl.md +1 -23
- package/docs/pt/intlayer_CMS.md +1 -0
- package/docs/pt/intlayer_cli.md +274 -154
- package/docs/pt/intlayer_visual_editor.md +1 -0
- package/docs/pt/intlayer_with_angular.md +1 -0
- package/docs/pt/intlayer_with_create_react_app.md +1 -0
- package/docs/pt/intlayer_with_lynx+react.md +1 -0
- package/docs/pt/intlayer_with_nextjs_14.md +1 -0
- package/docs/pt/intlayer_with_nextjs_15.md +3 -1
- package/docs/pt/intlayer_with_nuxt.md +1 -0
- package/docs/pt/intlayer_with_react_native+expo.md +1 -0
- package/docs/pt/intlayer_with_vite+preact.md +4 -3
- package/docs/pt/intlayer_with_vite+react.md +117 -136
- package/docs/pt/intlayer_with_vite+solid.md +4 -3
- package/docs/pt/intlayer_with_vite+svelte.md +4 -3
- package/docs/pt/intlayer_with_vite+vue.md +4 -4
- package/docs/pt/mcp_server.md +121 -87
- package/docs/ru/intlayer_CMS.md +1 -0
- package/docs/ru/intlayer_cli.md +287 -170
- package/docs/ru/intlayer_visual_editor.md +1 -0
- package/docs/ru/intlayer_with_angular.md +1 -0
- package/docs/ru/intlayer_with_create_react_app.md +1 -0
- package/docs/ru/intlayer_with_lynx+react.md +1 -0
- package/docs/ru/intlayer_with_nextjs_14.md +1 -0
- package/docs/ru/intlayer_with_nextjs_15.md +3 -1
- package/docs/ru/intlayer_with_nuxt.md +1 -0
- package/docs/ru/intlayer_with_react_native+expo.md +1 -0
- package/docs/ru/intlayer_with_vite+preact.md +4 -3
- package/docs/ru/intlayer_with_vite+react.md +105 -87
- package/docs/ru/intlayer_with_vite+solid.md +4 -3
- package/docs/ru/intlayer_with_vite+svelte.md +4 -3
- package/docs/ru/intlayer_with_vite+vue.md +5 -4
- package/docs/ru/mcp_server.md +119 -85
- package/docs/zh/intlayer_CMS.md +1 -0
- package/docs/zh/intlayer_cli.md +275 -155
- package/docs/zh/intlayer_visual_editor.md +1 -0
- package/docs/zh/intlayer_with_angular.md +1 -0
- package/docs/zh/intlayer_with_create_react_app.md +1 -0
- package/docs/zh/intlayer_with_lynx+react.md +1 -0
- package/docs/zh/intlayer_with_nextjs_14.md +1 -0
- package/docs/zh/intlayer_with_nextjs_15.md +3 -1
- package/docs/zh/intlayer_with_nuxt.md +1 -0
- package/docs/zh/intlayer_with_react_native+expo.md +1 -0
- package/docs/zh/intlayer_with_vite+preact.md +4 -3
- package/docs/zh/intlayer_with_vite+react.md +154 -188
- package/docs/zh/intlayer_with_vite+solid.md +4 -3
- package/docs/zh/intlayer_with_vite+svelte.md +4 -3
- package/docs/zh/intlayer_with_vite+vue.md +5 -4
- package/docs/zh/mcp_server.md +119 -86
- package/docs/zh/packages/intlayer/getLocalizedUrl.md +1 -23
- package/frequent_questions/ar/build_error_CI_CD.md +75 -0
- package/frequent_questions/de/build_error_CI_CD.md +75 -0
- package/frequent_questions/en/build_error_CI_CD.md +75 -0
- package/frequent_questions/en-GB/build_error_CI_CD.md +75 -0
- package/frequent_questions/es/build_error_CI_CD.md +75 -0
- package/frequent_questions/fr/build_error_CI_CD.md +75 -0
- package/frequent_questions/hi/build_error_CI_CD.md +75 -0
- package/frequent_questions/it/build_error_CI_CD.md +75 -0
- package/frequent_questions/ja/build_error_CI_CD.md +75 -0
- package/frequent_questions/ja/intlayer_command_undefined.md +3 -3
- package/frequent_questions/ko/build_error_CI_CD.md +75 -0
- package/frequent_questions/ko/intlayer_command_undefined.md +3 -3
- package/frequent_questions/pt/build_error_CI_CD.md +75 -0
- package/frequent_questions/ru/build_error_CI_CD.md +75 -0
- package/frequent_questions/zh/build_error_CI_CD.md +75 -0
- package/frequent_questions/zh/intlayer_command_undefined.md +3 -3
- package/legal/ar/privacy_notice.md +83 -0
- package/legal/ar/terms_of_service.md +55 -0
- package/legal/de/privacy_notice.md +83 -0
- package/legal/de/terms_of_service.md +55 -0
- package/legal/en/privacy_notice.md +83 -0
- package/legal/en/terms_of_service.md +55 -0
- package/legal/en-GB/privacy_notice.md +83 -0
- package/legal/en-GB/terms_of_service.md +55 -0
- package/legal/es/privacy_notice.md +83 -0
- package/legal/es/terms_of_service.md +55 -0
- package/legal/fr/privacy_notice.md +83 -0
- package/legal/fr/terms_of_service.md +55 -0
- package/legal/hi/privacy_notice.md +83 -0
- package/legal/hi/terms_of_service.md +55 -0
- package/legal/it/privacy_notice.md +83 -0
- package/legal/it/terms_of_service.md +55 -0
- package/legal/ja/privacy_notice.md +83 -0
- package/legal/ja/terms_of_service.md +55 -0
- package/legal/ko/privacy_notice.md +83 -0
- package/legal/ko/terms_of_service.md +55 -0
- package/legal/pt/privacy_notice.md +83 -0
- package/legal/pt/terms_of_service.md +55 -0
- package/legal/ru/privacy_notice.md +83 -0
- package/legal/ru/terms_of_service.md +55 -0
- package/legal/zh/privacy_notice.md +83 -0
- package/legal/zh/terms_of_service.md +55 -0
- package/package.json +12 -11
- package/src/blog.ts +6 -4
- package/src/common.ts +25 -7
- package/src/doc.ts +6 -4
- package/src/frequentQuestions.ts +6 -4
- package/src/generated/blog.entry.ts +1177 -280
- package/src/generated/docs.entry.ts +3868 -1217
- package/src/generated/frequentQuestions.entry.ts +808 -178
- package/src/generated/legal.entry.ts +34 -36
- package/src/legal.ts +6 -4
|
@@ -1,40 +1,43 @@
|
|
|
1
1
|
---
|
|
2
|
-
createdAt:
|
|
3
|
-
updatedAt:
|
|
4
|
-
title:
|
|
5
|
-
description:
|
|
2
|
+
createdAt: 2024-03-07
|
|
3
|
+
updatedAt: 2024-03-07
|
|
4
|
+
title: Vite + React에서 Intlayer 시작하기
|
|
5
|
+
description: Intlayer를 사용하여 Vite 및 React 애플리케이션에 국제화(i18n)를 추가하는 방법을 배우세요. 이 가이드를 따라 앱을 다국어로 만드세요.
|
|
6
6
|
keywords:
|
|
7
7
|
- 국제화
|
|
8
8
|
- 문서
|
|
9
9
|
- Intlayer
|
|
10
10
|
- Vite
|
|
11
11
|
- React
|
|
12
|
-
-
|
|
13
|
-
-
|
|
12
|
+
- i18n
|
|
13
|
+
- 자바스크립트
|
|
14
14
|
slugs:
|
|
15
15
|
- doc
|
|
16
16
|
- environment
|
|
17
|
-
-
|
|
18
|
-
|
|
17
|
+
- vite-and-react
|
|
18
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-vite-react-template
|
|
19
|
+
youtubeVideo: https://www.youtube.com/watch?v=dS9L7uJeak4---
|
|
20
|
+
|
|
21
|
+
# Intlayer와 Vite 및 React로 국제화(i18n) 시작하기
|
|
19
22
|
|
|
20
|
-
|
|
23
|
+
<iframe title="The best i18n solution for Vite and React? Discover Intlayer" class="m-auto aspect-[16/9] w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/dS9L7uJeak4?si=VaKmrYMmXjo3xpk2"/>
|
|
21
24
|
|
|
22
|
-
GitHub에서 [애플리케이션 템플릿](https://github.com/aymericzip/intlayer-vite-react-template)을
|
|
25
|
+
GitHub에서 [애플리케이션 템플릿](https://github.com/aymericzip/intlayer-vite-react-template)을 참조하세요.
|
|
23
26
|
|
|
24
|
-
## Intlayer
|
|
27
|
+
## Intlayer란?
|
|
25
28
|
|
|
26
|
-
**Intlayer**는
|
|
29
|
+
**Intlayer**는 최신 웹 애플리케이션에서 다국어 지원을 간소화하기 위해 설계된 혁신적이고 오픈 소스인 국제화(i18n) 라이브러리입니다.
|
|
27
30
|
|
|
28
31
|
Intlayer를 사용하면 다음을 할 수 있습니다:
|
|
29
32
|
|
|
30
|
-
- **컴포넌트 수준에서 선언적 사전을
|
|
33
|
+
- **컴포넌트 수준에서 선언적 사전을 사용하여** 번역을 쉽게 관리할 수 있습니다.
|
|
31
34
|
- **메타데이터, 라우트 및 콘텐츠를 동적으로 현지화**할 수 있습니다.
|
|
32
35
|
- **자동 생성된 타입으로 TypeScript 지원을 보장**하여 자동 완성 및 오류 감지를 향상시킵니다.
|
|
33
36
|
- **동적 로케일 감지 및 전환과 같은 고급 기능**을 활용할 수 있습니다.
|
|
34
37
|
|
|
35
38
|
---
|
|
36
39
|
|
|
37
|
-
## Vite
|
|
40
|
+
## Vite 및 React 애플리케이션에서 Intlayer 설정 단계별 가이드
|
|
38
41
|
|
|
39
42
|
### 1단계: 의존성 설치
|
|
40
43
|
|
|
@@ -42,17 +45,17 @@ npm을 사용하여 필요한 패키지를 설치하세요:
|
|
|
42
45
|
|
|
43
46
|
```bash packageManager="npm"
|
|
44
47
|
npm install intlayer react-intlayer
|
|
45
|
-
npm install --save-dev
|
|
48
|
+
npm install vite-intlayer --save-dev
|
|
46
49
|
```
|
|
47
50
|
|
|
48
51
|
```bash packageManager="pnpm"
|
|
49
52
|
pnpm add intlayer react-intlayer
|
|
50
|
-
pnpm add --save-dev
|
|
53
|
+
pnpm add vite-intlayer --save-dev
|
|
51
54
|
```
|
|
52
55
|
|
|
53
56
|
```bash packageManager="yarn"
|
|
54
57
|
yarn add intlayer react-intlayer
|
|
55
|
-
yarn add --save-dev
|
|
58
|
+
yarn add vite-intlayer --save-dev
|
|
56
59
|
```
|
|
57
60
|
|
|
58
61
|
- **intlayer**
|
|
@@ -60,14 +63,14 @@ yarn add --save-dev vite-intlayer
|
|
|
60
63
|
구성 관리, 번역, [콘텐츠 선언](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/dictionary/get_started.md), 트랜스파일링 및 [CLI 명령어](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/intlayer_cli.md)를 위한 국제화 도구를 제공하는 핵심 패키지입니다.
|
|
61
64
|
|
|
62
65
|
- **react-intlayer**
|
|
63
|
-
Intlayer를 React 애플리케이션과 통합하는 패키지로, React 국제화를 위한 컨텍스트
|
|
66
|
+
Intlayer를 React 애플리케이션과 통합하는 패키지로, React 국제화를 위한 컨텍스트 프로바이더와 훅을 제공합니다.
|
|
64
67
|
|
|
65
68
|
- **vite-intlayer**
|
|
66
|
-
|
|
69
|
+
Intlayer를 [Vite 번들러](https://vite.dev/guide/why.html#why-bundle-for-production)와 통합하기 위한 Vite 플러그인과, 사용자의 선호 로케일 감지, 쿠키 관리, URL 리디렉션 처리를 위한 미들웨어를 포함합니다.
|
|
67
70
|
|
|
68
71
|
### 2단계: 프로젝트 구성
|
|
69
72
|
|
|
70
|
-
애플리케이션의 언어를 구성하기
|
|
73
|
+
애플리케이션의 언어를 구성하기 위해 설정 파일을 만드세요:
|
|
71
74
|
|
|
72
75
|
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
73
76
|
import { Locales, type IntlayerConfig } from "intlayer";
|
|
@@ -164,7 +167,7 @@ module.exports = defineConfig({
|
|
|
164
167
|
});
|
|
165
168
|
```
|
|
166
169
|
|
|
167
|
-
> `intlayerPlugin()` Vite 플러그인은 Intlayer를 Vite와 통합하는 데 사용됩니다. 이 플러그인은 콘텐츠 선언 파일의 빌드를 보장하고 개발 모드에서 이를 모니터링합니다. 또한 Vite 애플리케이션 내에서 Intlayer 환경 변수를 정의합니다. 추가로, 성능 최적화를 위한 별칭(alias)
|
|
170
|
+
> `intlayerPlugin()` Vite 플러그인은 Intlayer를 Vite와 통합하는 데 사용됩니다. 이 플러그인은 콘텐츠 선언 파일의 빌드를 보장하고 개발 모드에서 이를 모니터링합니다. 또한 Vite 애플리케이션 내에서 Intlayer 환경 변수를 정의합니다. 추가로, 성능 최적화를 위한 별칭(alias)도 제공합니다.
|
|
168
171
|
|
|
169
172
|
### 4단계: 콘텐츠 선언하기
|
|
170
173
|
|
|
@@ -204,12 +207,12 @@ const appContent = {
|
|
|
204
207
|
),
|
|
205
208
|
fr: (
|
|
206
209
|
<>
|
|
207
|
-
<code>src/App.tsx</code>를 편집하고
|
|
210
|
+
HMR을 테스트하려면 <code>src/App.tsx</code>를 편집하고 저장하세요
|
|
208
211
|
</>
|
|
209
212
|
),
|
|
210
213
|
es: (
|
|
211
214
|
<>
|
|
212
|
-
<code>src/App.tsx</code>를 편집하고
|
|
215
|
+
HMR을 테스트하려면 <code>src/App.tsx</code>를 편집하고 저장하세요
|
|
213
216
|
</>
|
|
214
217
|
),
|
|
215
218
|
}),
|
|
@@ -235,13 +238,11 @@ const appContent = {
|
|
|
235
238
|
viteLogo: t({
|
|
236
239
|
en: "Vite logo",
|
|
237
240
|
fr: "Logo Vite",
|
|
238
|
-
ko: "Vite 로고",
|
|
239
241
|
es: "Logo Vite",
|
|
240
242
|
}),
|
|
241
243
|
reactLogo: t({
|
|
242
244
|
en: "React logo",
|
|
243
245
|
fr: "Logo React",
|
|
244
|
-
ko: "React 로고",
|
|
245
246
|
es: "Logo React",
|
|
246
247
|
}),
|
|
247
248
|
|
|
@@ -250,7 +251,6 @@ const appContent = {
|
|
|
250
251
|
count: t({
|
|
251
252
|
en: "count is ",
|
|
252
253
|
fr: "le compte est ",
|
|
253
|
-
ko: "카운트는 ",
|
|
254
254
|
es: "el recuento es ",
|
|
255
255
|
}),
|
|
256
256
|
|
|
@@ -258,10 +258,11 @@ const appContent = {
|
|
|
258
258
|
t <
|
|
259
259
|
ReactNode >
|
|
260
260
|
{
|
|
261
|
-
// 콘텐츠에 React 노드를 사용하는 경우 React를 반드시 import
|
|
261
|
+
// 콘텐츠에 React 노드를 사용하는 경우 React를 반드시 import하세요
|
|
262
262
|
en: (
|
|
263
263
|
<>
|
|
264
|
-
Edit <code>src/App.tsx</code>
|
|
264
|
+
Edit <code>src/App.tsx</code> 파일을 수정하고 저장하여 HMR을
|
|
265
|
+
테스트하세요
|
|
265
266
|
</>
|
|
266
267
|
),
|
|
267
268
|
fr: (
|
|
@@ -277,7 +278,6 @@ const appContent = {
|
|
|
277
278
|
},
|
|
278
279
|
|
|
279
280
|
readTheDocs: t({
|
|
280
|
-
ko: "더 알아보려면 Vite 및 React 로고를 클릭하세요",
|
|
281
281
|
en: "Click on the Vite and React logos to learn more",
|
|
282
282
|
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
283
283
|
es: "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
@@ -318,7 +318,7 @@ const appContent = {
|
|
|
318
318
|
t <
|
|
319
319
|
ReactNode >
|
|
320
320
|
{
|
|
321
|
-
// 콘텐츠에 React 노드를 사용하는 경우 React를
|
|
321
|
+
// 콘텐츠에 React 노드를 사용하는 경우 React를 임포트하는 것을 잊지 마세요
|
|
322
322
|
en: (
|
|
323
323
|
<>
|
|
324
324
|
Edit <code>src/App.tsx</code> and save to test HMR
|
|
@@ -331,7 +331,7 @@ const appContent = {
|
|
|
331
331
|
),
|
|
332
332
|
es: (
|
|
333
333
|
<>
|
|
334
|
-
Edita <code>src/App.tsx</code>
|
|
334
|
+
Edita <code>src/App.tsx</code> y guarda para probar HMR
|
|
335
335
|
</>
|
|
336
336
|
),
|
|
337
337
|
},
|
|
@@ -340,7 +340,7 @@ const appContent = {
|
|
|
340
340
|
en: "Click on the Vite and React logos to learn more",
|
|
341
341
|
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
342
342
|
es: "Haga clic en los logotipos de Vite y React para obtener más información",
|
|
343
|
-
ko: "
|
|
343
|
+
ko: "Vite 및 React 로고를 클릭하여 자세히 알아보세요",
|
|
344
344
|
}),
|
|
345
345
|
},
|
|
346
346
|
};
|
|
@@ -365,37 +365,37 @@ module.exports = appContent;
|
|
|
365
365
|
"reactLogo": {
|
|
366
366
|
"nodeType": "translation",
|
|
367
367
|
"translation": {
|
|
368
|
-
"ko": "React 로고",
|
|
369
368
|
"en": "React logo",
|
|
370
369
|
"fr": "Logo React",
|
|
371
|
-
"es": "Logo React"
|
|
370
|
+
"es": "Logo React",
|
|
371
|
+
"ko": "리액트 로고"
|
|
372
372
|
}
|
|
373
373
|
},
|
|
374
374
|
"title": {
|
|
375
375
|
"nodeType": "translation",
|
|
376
376
|
"translation": {
|
|
377
|
-
"ko": "Vite + React",
|
|
378
377
|
"en": "Vite + React",
|
|
379
378
|
"fr": "Vite + React",
|
|
380
|
-
"es": "Vite + React"
|
|
379
|
+
"es": "Vite + React",
|
|
380
|
+
"ko": "Vite + React"
|
|
381
381
|
}
|
|
382
382
|
},
|
|
383
383
|
"count": {
|
|
384
384
|
"nodeType": "translation",
|
|
385
385
|
"translation": {
|
|
386
|
-
"ko": "카운트는 ",
|
|
387
386
|
"en": "count is ",
|
|
388
387
|
"fr": "le compte est ",
|
|
389
|
-
"es": "el recuento es "
|
|
388
|
+
"es": "el recuento es ",
|
|
389
|
+
"ko": "카운트는 "
|
|
390
390
|
}
|
|
391
391
|
},
|
|
392
392
|
"edit": {
|
|
393
393
|
"nodeType": "translation",
|
|
394
394
|
"translation": {
|
|
395
|
-
"ko": "src/App.tsx를 편집하고 저장하여 HMR을 테스트하세요",
|
|
396
395
|
"en": "Edit src/App.tsx and save to test HMR",
|
|
397
396
|
"fr": "Éditez src/App.tsx et enregistrez pour tester HMR",
|
|
398
|
-
"es": "Edita src/App.tsx y guarda para probar HMR"
|
|
397
|
+
"es": "Edita src/App.tsx y guarda para probar HMR",
|
|
398
|
+
"ko": "src/App.tsx를 편집하고 저장하여 HMR을 테스트하세요"
|
|
399
399
|
}
|
|
400
400
|
},
|
|
401
401
|
"readTheDocs": {
|
|
@@ -411,11 +411,11 @@ module.exports = appContent;
|
|
|
411
411
|
}
|
|
412
412
|
```
|
|
413
413
|
|
|
414
|
-
> 애플리케이션 내
|
|
414
|
+
> 애플리케이션 내 어디에서든 `contentDir` 디렉토리(기본값: `./src`)에 포함되면 콘텐츠 선언을 정의할 수 있습니다. 그리고 콘텐츠 선언 파일 확장자(기본값: `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)와 일치해야 합니다.
|
|
415
415
|
|
|
416
416
|
> 자세한 내용은 [콘텐츠 선언 문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/dictionary/get_started.md)를 참조하세요.
|
|
417
417
|
|
|
418
|
-
> 콘텐츠 파일에 TSX 코드가 포함된 경우, 콘텐츠
|
|
418
|
+
> 콘텐츠 파일에 TSX 코드가 포함된 경우, 콘텐츠 파일에 `import React from "react";`를 가져오는 것을 고려해야 합니다.
|
|
419
419
|
|
|
420
420
|
### 5단계: 코드에서 Intlayer 사용하기
|
|
421
421
|
|
|
@@ -568,7 +568,7 @@ module.exports = App;
|
|
|
568
568
|
> <img src={content.image.src.value} alt={content.image.value} />
|
|
569
569
|
> ```
|
|
570
570
|
|
|
571
|
-
> `useIntlayer` 훅에 대해 더
|
|
571
|
+
> `useIntlayer` 훅에 대해 더 알아보려면 [문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useIntlayer.md)를 참조하세요.
|
|
572
572
|
|
|
573
573
|
### (선택 사항) 6단계: 콘텐츠의 언어 변경하기
|
|
574
574
|
|
|
@@ -627,14 +627,14 @@ const LocaleSwitcher = () => {
|
|
|
627
627
|
- https://example.com/fr/about
|
|
628
628
|
```
|
|
629
629
|
|
|
630
|
-
>
|
|
630
|
+
> 기본적으로, 기본 로케일에 대해서는 경로에 접두사가 붙지 않습니다. 기본 로케일에 접두사를 붙이고 싶다면, 구성 설정에서 `middleware.prefixDefault` 옵션을 `true`로 설정할 수 있습니다. 자세한 내용은 [구성 문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)를 참조하세요.
|
|
631
631
|
|
|
632
632
|
애플리케이션에 지역화된 라우팅을 추가하려면, 애플리케이션의 라우트를 감싸고 로케일 기반 라우팅을 처리하는 `LocaleRouter` 컴포넌트를 생성할 수 있습니다. 다음은 [React Router](https://reactrouter.com/home)를 사용한 예제입니다:
|
|
633
633
|
|
|
634
634
|
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
635
635
|
// 필요한 의존성과 함수들을 임포트합니다
|
|
636
|
-
import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'에서 제공하는 유틸리티
|
|
637
|
-
import type { FC, PropsWithChildren } from "react"; // 함수형
|
|
636
|
+
import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'에서 제공하는 유틸리티 함수 및 타입
|
|
637
|
+
import type { FC, PropsWithChildren } from "react"; // 함수형 컴포넌트 및 props 타입
|
|
638
638
|
import { IntlayerProvider } from "react-intlayer"; // 국제화 컨텍스트를 위한 프로바이더
|
|
639
639
|
import {
|
|
640
640
|
BrowserRouter,
|
|
@@ -644,7 +644,7 @@ import {
|
|
|
644
644
|
useLocation,
|
|
645
645
|
} from "react-router-dom"; // 네비게이션 관리를 위한 라우터 컴포넌트
|
|
646
646
|
|
|
647
|
-
// Intlayer에서
|
|
647
|
+
// Intlayer에서 설정값 구조 분해 할당
|
|
648
648
|
const { internationalization, middleware } = configuration;
|
|
649
649
|
const { locales, defaultLocale } = internationalization;
|
|
650
650
|
|
|
@@ -667,7 +667,7 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
667
667
|
);
|
|
668
668
|
|
|
669
669
|
/**
|
|
670
|
-
* middleware.prefixDefault가 true인 경우, 기본 로케일은 항상
|
|
670
|
+
* middleware.prefixDefault가 true인 경우, 기본 로케일은 항상 접두사로 붙어야 합니다.
|
|
671
671
|
*/
|
|
672
672
|
if (middleware.prefixDefault) {
|
|
673
673
|
// 로케일 유효성 검사
|
|
@@ -676,19 +676,19 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
676
676
|
return (
|
|
677
677
|
<Navigate
|
|
678
678
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
679
|
-
replace // 현재 기록 항목을 새 항목으로
|
|
679
|
+
replace // 현재 기록 항목을 새 항목으로 교체합니다
|
|
680
680
|
/>
|
|
681
681
|
);
|
|
682
682
|
}
|
|
683
683
|
|
|
684
|
-
// 자식 컴포넌트를 IntlayerProvider로 감싸고 현재 로케일을
|
|
684
|
+
// 자식 컴포넌트를 IntlayerProvider로 감싸고 현재 로케일을 설정합니다
|
|
685
685
|
return (
|
|
686
686
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
687
687
|
);
|
|
688
688
|
} else {
|
|
689
689
|
/**
|
|
690
690
|
* middleware.prefixDefault가 false일 때, 기본 로케일은 접두사가 붙지 않습니다.
|
|
691
|
-
* 현재 로케일이
|
|
691
|
+
* 현재 로케일이 유효하며 기본 로케일이 아님을 확인합니다.
|
|
692
692
|
*/
|
|
693
693
|
if (
|
|
694
694
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -698,11 +698,11 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
698
698
|
)
|
|
699
699
|
.includes(currentLocale) // 현재 로케일이 유효한 로케일 목록에 있는지 확인
|
|
700
700
|
) {
|
|
701
|
-
// 로케일
|
|
701
|
+
// 로케일 접두어가 없는 경로로 리디렉션
|
|
702
702
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
703
703
|
}
|
|
704
704
|
|
|
705
|
-
// 자식 컴포넌트를
|
|
705
|
+
// IntlayerProvider로 자식 컴포넌트를 감싸고 현재 로케일 설정
|
|
706
706
|
return (
|
|
707
707
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
708
708
|
);
|
|
@@ -722,10 +722,10 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
722
722
|
)
|
|
723
723
|
.map((locale) => (
|
|
724
724
|
<Route
|
|
725
|
-
// 로케일을 캡처하는
|
|
725
|
+
// 로케일을 캡처하는 경로 패턴 (예: /en/, /fr/) 및 이후 모든 경로와 매칭
|
|
726
726
|
path={`/${locale}/*`}
|
|
727
727
|
key={locale}
|
|
728
|
-
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // 로케일 관리를 위해 children을
|
|
728
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // 로케일 관리를 위해 children을 래핑
|
|
729
729
|
/>
|
|
730
730
|
))}
|
|
731
731
|
|
|
@@ -736,7 +736,7 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
736
736
|
path="*"
|
|
737
737
|
element={
|
|
738
738
|
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
739
|
-
} // 로케일 관리를 위해 children을
|
|
739
|
+
} // 로케일 관리를 위해 children을 래핑
|
|
740
740
|
/>
|
|
741
741
|
)
|
|
742
742
|
}
|
|
@@ -746,9 +746,9 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
746
746
|
```
|
|
747
747
|
|
|
748
748
|
```jsx fileName="src/components/LocaleRouter.mjx" codeFormat="esm"
|
|
749
|
-
// 필요한
|
|
750
|
-
import { configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'에서 제공하는 유틸리티 함수와
|
|
751
|
-
// 'intlayer'에서 제공하는 유틸리티 함수와
|
|
749
|
+
// 필요한 의존성과 함수들을 임포트합니다.
|
|
750
|
+
import { configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'에서 제공하는 유틸리티 함수와 타입
|
|
751
|
+
// 'intlayer'에서 제공하는 유틸리티 함수와 타입
|
|
752
752
|
import { IntlayerProvider } from "react-intlayer"; // 국제화 컨텍스트를 위한 프로바이더
|
|
753
753
|
import {
|
|
754
754
|
BrowserRouter,
|
|
@@ -763,9 +763,9 @@ const { internationalization, middleware } = configuration;
|
|
|
763
763
|
const { locales, defaultLocale } = internationalization;
|
|
764
764
|
|
|
765
765
|
/**
|
|
766
|
-
*
|
|
766
|
+
* 로컬라이제이션을 처리하고 자식 컴포넌트를 적절한 로케일 컨텍스트로 감싸는 컴포넌트입니다.
|
|
767
767
|
/**
|
|
768
|
-
* URL 기반 로케일 감지 및 검증을
|
|
768
|
+
* URL 기반 로케일 감지 및 검증을 관리합니다.
|
|
769
769
|
*/
|
|
770
770
|
const AppLocalized = ({ children, locale }) => {
|
|
771
771
|
const { pathname, search } = useLocation(); // 현재 URL 경로를 가져옵니다.
|
|
@@ -779,7 +779,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
779
779
|
);
|
|
780
780
|
|
|
781
781
|
/**
|
|
782
|
-
* middleware.prefixDefault가 true인
|
|
782
|
+
* middleware.prefixDefault가 true인 경우, 기본 로케일은 항상 접두사로 붙어야 합니다.
|
|
783
783
|
*/
|
|
784
784
|
if (middleware.prefixDefault) {
|
|
785
785
|
// 로케일을 검증합니다.
|
|
@@ -800,7 +800,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
800
800
|
} else {
|
|
801
801
|
/**
|
|
802
802
|
* middleware.prefixDefault가 false일 때, 기본 로케일은 접두사가 붙지 않습니다.
|
|
803
|
-
* 현재 로케일이
|
|
803
|
+
* 현재 로케일이 유효하며 기본 로케일이 아님을 확인합니다.
|
|
804
804
|
*/
|
|
805
805
|
if (
|
|
806
806
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -808,13 +808,13 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
808
808
|
.filter(
|
|
809
809
|
(locale) => locale.toString() !== defaultLocale.toString() // 기본 로케일 제외
|
|
810
810
|
)
|
|
811
|
-
.includes(currentLocale) // 현재 로케일이 유효한 로케일 목록에
|
|
811
|
+
.includes(currentLocale) // 현재 로케일이 유효한 로케일 목록에 있는지 확인
|
|
812
812
|
) {
|
|
813
813
|
// 로케일 접두사가 없는 경로로 리디렉션
|
|
814
814
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
815
815
|
}
|
|
816
816
|
|
|
817
|
-
// 자식 컴포넌트를
|
|
817
|
+
// IntlayerProvider로 자식 컴포넌트를 감싸고 현재 로케일 설정
|
|
818
818
|
return (
|
|
819
819
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
820
820
|
);
|
|
@@ -842,7 +842,7 @@ export const LocaleRouter = ({ children }) => (
|
|
|
842
842
|
))}
|
|
843
843
|
|
|
844
844
|
{
|
|
845
|
-
// 기본 로케일 접두어 사용이 비활성화된 경우, 루트 경로에서
|
|
845
|
+
// 기본 로케일 접두어 사용이 비활성화된 경우, 루트 경로에서 자식 컴포넌트를 직접 렌더링
|
|
846
846
|
!middleware.prefixDefault && (
|
|
847
847
|
<Route
|
|
848
848
|
path="*"
|
|
@@ -858,8 +858,8 @@ export const LocaleRouter = ({ children }) => (
|
|
|
858
858
|
```
|
|
859
859
|
|
|
860
860
|
```jsx fileName="src/components/LocaleRouter.cjx" codeFormat="commonjs"
|
|
861
|
-
// 필요한
|
|
862
|
-
const { configuration, getPathWithoutLocale } = require("intlayer"); // 'intlayer'에서 제공하는 유틸리티
|
|
861
|
+
// 필요한 종속성과 함수들을 가져옵니다.
|
|
862
|
+
const { configuration, getPathWithoutLocale } = require("intlayer"); // 'intlayer'에서 제공하는 유틸리티 함수 및 타입
|
|
863
863
|
const { IntlayerProvider, useLocale } = require("react-intlayer"); // 국제화 컨텍스트를 위한 프로바이더
|
|
864
864
|
const {
|
|
865
865
|
BrowserRouter,
|
|
@@ -867,7 +867,7 @@ const {
|
|
|
867
867
|
Route,
|
|
868
868
|
Navigate,
|
|
869
869
|
useLocation,
|
|
870
|
-
} = require("react-router-dom"); //
|
|
870
|
+
} = require("react-router-dom"); // 내비게이션 관리를 위한 라우터 컴포넌트
|
|
871
871
|
|
|
872
872
|
// Intlayer에서 설정을 구조 분해 할당합니다.
|
|
873
873
|
const { internationalization, middleware } = configuration;
|
|
@@ -883,33 +883,33 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
883
883
|
// 현재 로케일을 결정하며, 제공되지 않은 경우 기본 로케일로 대체합니다.
|
|
884
884
|
const currentLocale = locale ?? defaultLocale;
|
|
885
885
|
|
|
886
|
-
// 경로에서 로케일
|
|
886
|
+
// 경로에서 로케일 접두사를 제거하여 기본 경로를 만듭니다.
|
|
887
887
|
const pathWithoutLocale = getPathWithoutLocale(
|
|
888
888
|
pathname // 현재 URL 경로
|
|
889
889
|
);
|
|
890
890
|
|
|
891
891
|
/**
|
|
892
|
-
* middleware.prefixDefault가 true인 경우, 기본 로케일은 항상
|
|
892
|
+
* middleware.prefixDefault가 true인 경우, 기본 로케일은 항상 접두사로 붙어야 합니다.
|
|
893
893
|
*/
|
|
894
894
|
if (middleware.prefixDefault) {
|
|
895
|
-
//
|
|
895
|
+
// 로케일을 검증합니다.
|
|
896
896
|
if (!locale || !locales.includes(locale)) {
|
|
897
|
-
//
|
|
897
|
+
// 업데이트된 경로와 함께 기본 로케일로 리다이렉트합니다.
|
|
898
898
|
return (
|
|
899
899
|
<Navigate
|
|
900
900
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
901
|
-
replace // 현재 기록 항목을 새 항목으로
|
|
901
|
+
replace // 현재 기록 항목을 새 항목으로 교체
|
|
902
902
|
/>
|
|
903
903
|
);
|
|
904
904
|
}
|
|
905
905
|
|
|
906
|
-
// 자식 컴포넌트를 IntlayerProvider로 감싸고 현재 로케일을
|
|
906
|
+
// 자식 컴포넌트를 IntlayerProvider로 감싸고 현재 로케일을 설정
|
|
907
907
|
return (
|
|
908
908
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
909
909
|
);
|
|
910
910
|
} else {
|
|
911
911
|
/**
|
|
912
|
-
* middleware.prefixDefault가 false일 때, 기본 로케일은
|
|
912
|
+
* middleware.prefixDefault가 false일 때, 기본 로케일은 접두사가 붙지 않습니다.
|
|
913
913
|
* 현재 로케일이 유효하며 기본 로케일이 아님을 확인합니다.
|
|
914
914
|
*/
|
|
915
915
|
if (
|
|
@@ -920,7 +920,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
920
920
|
)
|
|
921
921
|
.includes(currentLocale) // 현재 로케일이 유효한 로케일 목록에 포함되어 있는지 확인
|
|
922
922
|
) {
|
|
923
|
-
// 로케일
|
|
923
|
+
// 로케일 접두사가 없는 경로로 리디렉션합니다.
|
|
924
924
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
925
925
|
}
|
|
926
926
|
|
|
@@ -933,7 +933,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
933
933
|
|
|
934
934
|
/**
|
|
935
935
|
* 로케일별 경로를 설정하는 라우터 컴포넌트입니다.
|
|
936
|
-
* React Router를 사용하여
|
|
936
|
+
* React Router를 사용하여 내비게이션을 관리하고 로컬라이즈된 컴포넌트를 렌더링합니다.
|
|
937
937
|
*/
|
|
938
938
|
const LocaleRouter = ({ children }) => (
|
|
939
939
|
<BrowserRouter>
|
|
@@ -944,21 +944,21 @@ const LocaleRouter = ({ children }) => (
|
|
|
944
944
|
)
|
|
945
945
|
.map((locale) => (
|
|
946
946
|
<Route
|
|
947
|
-
// 로케일을 캡처하는 경로 패턴 (예: /en/, /fr/) 및 이후 모든
|
|
947
|
+
// 로케일을 캡처하는 경로 패턴 (예: /en/, /fr/) 및 이후 모든 경로와 매칭합니다.
|
|
948
948
|
path={`/${locale}/*`}
|
|
949
949
|
key={locale}
|
|
950
|
-
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // 자식 컴포넌트를 로케일 관리로
|
|
950
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // 자식 컴포넌트를 로케일 관리로 감쌈
|
|
951
951
|
/>
|
|
952
952
|
))}
|
|
953
953
|
|
|
954
954
|
{
|
|
955
|
-
// 기본 로케일 접두어 사용이 비활성화된 경우, 루트 경로에서 자식 컴포넌트를 직접
|
|
955
|
+
// 기본 로케일 접두어 사용이 비활성화된 경우, 루트 경로에서 자식 컴포넌트를 직접 렌더링
|
|
956
956
|
!middleware.prefixDefault && (
|
|
957
957
|
<Route
|
|
958
958
|
path="*"
|
|
959
959
|
element={
|
|
960
960
|
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
961
|
-
} // 자식 컴포넌트를 로케일 관리로
|
|
961
|
+
} // 자식 컴포넌트를 로케일 관리로 감쌈
|
|
962
962
|
/>
|
|
963
963
|
)
|
|
964
964
|
}
|
|
@@ -973,7 +973,7 @@ const LocaleRouter = ({ children }) => (
|
|
|
973
973
|
import { LocaleRouter } from "./components/LocaleRouter";
|
|
974
974
|
import type { FC } from "react";
|
|
975
975
|
|
|
976
|
-
// ...
|
|
976
|
+
// ... 여러분의 AppContent 컴포넌트
|
|
977
977
|
|
|
978
978
|
const App: FC = () => (
|
|
979
979
|
<LocaleRouter>
|
|
@@ -985,7 +985,7 @@ const App: FC = () => (
|
|
|
985
985
|
```jsx fileName="src/App.mjx" codeFormat="esm"
|
|
986
986
|
import { LocaleRouter } from "./components/LocaleRouter";
|
|
987
987
|
|
|
988
|
-
// ...
|
|
988
|
+
// ... 여러분의 AppContent 컴포넌트
|
|
989
989
|
|
|
990
990
|
const App = () => (
|
|
991
991
|
<LocaleRouter>
|
|
@@ -997,7 +997,7 @@ const App = () => (
|
|
|
997
997
|
```jsx fileName="src/App.cjx" codeFormat="commonjs"
|
|
998
998
|
const { LocaleRouter } = require("./components/LocaleRouter");
|
|
999
999
|
|
|
1000
|
-
// ...
|
|
1000
|
+
// ... 여러분의 AppContent 컴포넌트
|
|
1001
1001
|
|
|
1002
1002
|
const App = () => (
|
|
1003
1003
|
<LocaleRouter>
|
|
@@ -1043,7 +1043,7 @@ module.exports = defineConfig({
|
|
|
1043
1043
|
|
|
1044
1044
|
### (선택 사항) 8단계: 로케일이 변경될 때 URL 변경하기
|
|
1045
1045
|
|
|
1046
|
-
로케일이 변경될 때 URL을 변경하려면, `useLocale` 훅에서 제공하는 `onLocaleChange`
|
|
1046
|
+
로케일이 변경될 때 URL을 변경하려면, `useLocale` 훅에서 제공하는 `onLocaleChange` 속성을 사용할 수 있습니다. 동시에, `react-router-dom`의 `useLocation`과 `useNavigate` 훅을 사용하여 URL 경로를 업데이트할 수 있습니다.
|
|
1047
1047
|
|
|
1048
1048
|
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
1049
1049
|
import { useLocation, useNavigate } from "react-router-dom";
|
|
@@ -1063,7 +1063,7 @@ const LocaleSwitcher: FC = () => {
|
|
|
1063
1063
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1064
1064
|
onLocaleChange: (locale) => {
|
|
1065
1065
|
// 업데이트된 로케일로 URL을 구성합니다
|
|
1066
|
-
//
|
|
1066
|
+
// 예: /es/about?foo=bar
|
|
1067
1067
|
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1068
1068
|
|
|
1069
1069
|
// URL 경로를 업데이트합니다
|
|
@@ -1091,11 +1091,11 @@ const LocaleSwitcher: FC = () => {
|
|
|
1091
1091
|
{localeItem}
|
|
1092
1092
|
</span>
|
|
1093
1093
|
<span>
|
|
1094
|
-
{/* 해당
|
|
1094
|
+
{/* 해당 로케일에서의 언어명 - 예: Français */}
|
|
1095
1095
|
{getLocaleName(localeItem, locale)}
|
|
1096
1096
|
</span>
|
|
1097
1097
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1098
|
-
{/* 현재 로케일에서의 언어명 - 예: Francés (현재 로케일이 Locales.SPANISH
|
|
1098
|
+
{/* 현재 로케일에서의 언어명 - 예: Francés (현재 로케일이 Locales.SPANISH일 때) */}
|
|
1099
1099
|
{getLocaleName(localeItem)}
|
|
1100
1100
|
</span>
|
|
1101
1101
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
@@ -1159,11 +1159,11 @@ const LocaleSwitcher = () => {
|
|
|
1159
1159
|
{getLocaleName(localeItem, locale)}
|
|
1160
1160
|
</span>
|
|
1161
1161
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1162
|
-
{/* 현재 로케일에서의 언어 - 예:
|
|
1162
|
+
{/* 현재 로케일에서의 언어 - 예: Locales.SPANISH로 설정된 현재 로케일에서 Francés */}
|
|
1163
1163
|
{getLocaleName(localeItem)}
|
|
1164
1164
|
</span>
|
|
1165
1165
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1166
|
-
{/* 영어로 된
|
|
1166
|
+
{/* 영어로 된 언어 - 예: French */}
|
|
1167
1167
|
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1168
1168
|
</span>
|
|
1169
1169
|
</a>
|
|
@@ -1227,7 +1227,7 @@ const LocaleSwitcher = () => {
|
|
|
1227
1227
|
{getLocaleName(localeItem)}
|
|
1228
1228
|
</span>
|
|
1229
1229
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1230
|
-
{/* 영어로 된
|
|
1230
|
+
{/* 영어로 된 언어명 - 예: French */}
|
|
1231
1231
|
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1232
1232
|
</span>
|
|
1233
1233
|
</a>
|
|
@@ -1253,19 +1253,19 @@ const LocaleSwitcher = () => {
|
|
|
1253
1253
|
|
|
1254
1254
|
---
|
|
1255
1255
|
|
|
1256
|
-
### (선택 사항) 9단계: HTML의 언어 및 방향 속성
|
|
1256
|
+
### (선택 사항) 9단계: HTML의 언어 및 방향 속성 변경
|
|
1257
1257
|
|
|
1258
1258
|
애플리케이션이 다국어를 지원할 때, 현재 로케일에 맞게 `<html>` 태그의 `lang` 및 `dir` 속성을 업데이트하는 것이 매우 중요합니다. 이렇게 하면 다음을 보장할 수 있습니다:
|
|
1259
1259
|
|
|
1260
1260
|
- **접근성**: 화면 낭독기 및 보조 기술은 올바른 `lang` 속성에 의존하여 콘텐츠를 정확하게 발음하고 해석합니다.
|
|
1261
|
-
- **텍스트 렌더링**: `dir`(방향) 속성은 텍스트가 올바른 순서로 렌더링되도록 보장합니다(예: 영어는 왼쪽에서
|
|
1262
|
-
- **SEO**: 검색 엔진은 `lang` 속성을 사용하여 페이지의 언어를 판단하고,
|
|
1261
|
+
- **텍스트 렌더링**: `dir`(방향) 속성은 텍스트가 올바른 순서로 렌더링되도록 보장합니다(예: 영어는 왼쪽에서 오른쪽으로, 아랍어나 히브리어는 오른쪽에서 왼쪽으로), 이는 가독성에 필수적입니다.
|
|
1262
|
+
- **SEO**: 검색 엔진은 `lang` 속성을 사용하여 페이지의 언어를 판단하고, 검색 결과에서 적절한 현지화된 콘텐츠를 제공하는 데 도움을 줍니다.
|
|
1263
1263
|
|
|
1264
1264
|
로케일이 변경될 때 이러한 속성을 동적으로 업데이트하면, 지원되는 모든 언어에서 사용자에게 일관되고 접근 가능한 경험을 보장할 수 있습니다.
|
|
1265
1265
|
|
|
1266
1266
|
#### 훅 구현하기
|
|
1267
1267
|
|
|
1268
|
-
HTML 속성을 관리하는 커스텀 훅을
|
|
1268
|
+
HTML 속성을 관리하는 커스텀 훅을 만듭니다. 이 훅은 로케일 변경을 감지하여 속성을 적절히 업데이트합니다:
|
|
1269
1269
|
|
|
1270
1270
|
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
1271
1271
|
import { useEffect } from "react";
|
|
@@ -1283,7 +1283,7 @@ export const useI18nHTMLAttributes = () => {
|
|
|
1283
1283
|
const { locale } = useLocale();
|
|
1284
1284
|
|
|
1285
1285
|
useEffect(() => {
|
|
1286
|
-
// 현재
|
|
1286
|
+
// 현재 로케일로 언어 속성을 업데이트합니다.
|
|
1287
1287
|
document.documentElement.lang = locale;
|
|
1288
1288
|
|
|
1289
1289
|
// 현재 로케일에 따라 텍스트 방향을 설정합니다.
|
|
@@ -1323,7 +1323,7 @@ const { useLocale } = require("react-intlayer");
|
|
|
1323
1323
|
const { getHTMLTextDir } = require("intlayer");
|
|
1324
1324
|
|
|
1325
1325
|
/**
|
|
1326
|
-
* 현재
|
|
1326
|
+
* 현재 로케일에 따라 HTML <html> 요소의 `lang` 및 `dir` 속성을 업데이트합니다.
|
|
1327
1327
|
* - `lang`: 브라우저와 검색 엔진에 페이지의 언어를 알립니다.
|
|
1328
1328
|
* - `dir`: 올바른 읽기 순서 보장을 위해 설정합니다 (예: 영어는 'ltr', 아랍어는 'rtl').
|
|
1329
1329
|
*
|
|
@@ -1355,7 +1355,7 @@ import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
|
1355
1355
|
import "./App.css";
|
|
1356
1356
|
|
|
1357
1357
|
const AppContent: FC = () => {
|
|
1358
|
-
// 로케일에 따라 <html> 태그의 lang
|
|
1358
|
+
// 로케일에 따라 <html> 태그의 lang과 dir 속성을 업데이트하기 위해 훅을 적용합니다.
|
|
1359
1359
|
useI18nHTMLAttributes();
|
|
1360
1360
|
|
|
1361
1361
|
// ... 컴포넌트의 나머지 부분
|
|
@@ -1379,7 +1379,7 @@ const AppContent = () => {
|
|
|
1379
1379
|
// 로케일에 따라 <html> 태그의 lang 및 dir 속성을 업데이트하기 위해 훅을 적용합니다.
|
|
1380
1380
|
useI18nHTMLAttributes();
|
|
1381
1381
|
|
|
1382
|
-
// ...
|
|
1382
|
+
// ... 나머지 컴포넌트 내용
|
|
1383
1383
|
};
|
|
1384
1384
|
|
|
1385
1385
|
const App = () => (
|
|
@@ -1403,11 +1403,6 @@ const AppContent = () => {
|
|
|
1403
1403
|
|
|
1404
1404
|
// ... 컴포넌트의 나머지 부분
|
|
1405
1405
|
};
|
|
1406
|
-
// 로케일에 따라 <html> 태그의 lang 및 dir 속성을 업데이트하기 위해 훅을 적용합니다.
|
|
1407
|
-
useI18nHTMLAttributes();
|
|
1408
|
-
|
|
1409
|
-
// ... 나머지 컴포넌트 내용
|
|
1410
|
-
};
|
|
1411
1406
|
|
|
1412
1407
|
const App = () => (
|
|
1413
1408
|
<IntlayerProvider>
|
|
@@ -1418,11 +1413,11 @@ const App = () => (
|
|
|
1418
1413
|
module.exports = App;
|
|
1419
1414
|
```
|
|
1420
1415
|
|
|
1421
|
-
이 변경 사항을 적용하면 애플리케이션은 다음을
|
|
1416
|
+
이 변경 사항을 적용하면 애플리케이션은 다음을 보장합니다:
|
|
1422
1417
|
|
|
1423
|
-
- 현재 로케일을 올바르게 반영하는 **언어**(`lang`)
|
|
1418
|
+
- 현재 로케일을 올바르게 반영하는 **언어**(`lang`) 속성으로 SEO 및 브라우저 동작에 중요합니다.
|
|
1424
1419
|
- 로케일에 따라 **텍스트 방향**(`dir`)을 조정하여, 서로 다른 읽기 순서를 가진 언어에 대해 가독성과 사용성을 향상시킵니다.
|
|
1425
|
-
- 보조 기술이
|
|
1420
|
+
- 보조 기술이 이러한 속성에 의존하므로 더 **접근성 높은** 경험을 제공합니다.
|
|
1426
1421
|
|
|
1427
1422
|
### (선택 사항) 10단계: 지역화된 링크 컴포넌트 만들기
|
|
1428
1423
|
|
|
@@ -1430,9 +1425,9 @@ module.exports = App;
|
|
|
1430
1425
|
|
|
1431
1426
|
이 동작은 여러 가지 이유로 유용합니다:
|
|
1432
1427
|
|
|
1433
|
-
- **SEO 및 사용자 경험**: 지역화된 URL은 검색 엔진이 언어별 페이지를 올바르게
|
|
1434
|
-
- **일관성**: 애플리케이션 전반에 걸쳐 지역화된 링크를 사용함으로써 내비게이션이 현재 로케일 내에서 유지되어
|
|
1435
|
-
|
|
1428
|
+
- **SEO 및 사용자 경험**: 지역화된 URL은 검색 엔진이 언어별 페이지를 올바르게 색인화하도록 돕고, 사용자가 선호하는 언어로 된 콘텐츠를 제공합니다.
|
|
1429
|
+
- **일관성**: 애플리케이션 전반에 걸쳐 지역화된 링크를 사용함으로써 내비게이션이 현재 로케일 내에서 유지되어 예기치 않은 언어 전환을 방지합니다.
|
|
1430
|
+
- **유지보수성**: 로컬라이제이션 로직을 단일 컴포넌트에 중앙 집중화하면 URL 관리를 단순화하여 애플리케이션이 성장함에 따라 코드베이스를 더 쉽게 유지보수하고 확장할 수 있습니다.
|
|
1436
1431
|
|
|
1437
1432
|
아래는 TypeScript로 구현한 로컬라이즈된 `Link` 컴포넌트입니다:
|
|
1438
1433
|
|
|
@@ -1461,7 +1456,7 @@ export const checkIsExternalLink = (href?: string): boolean =>
|
|
|
1461
1456
|
/**
|
|
1462
1457
|
* 현재 로케일에 따라 href 속성을 조정하는 커스텀 Link 컴포넌트입니다.
|
|
1463
1458
|
* 내부 링크의 경우 `getLocalizedUrl`을 사용하여 URL 앞에 로케일을 붙입니다 (예: /fr/about).
|
|
1464
|
-
* 이를 통해 내비게이션이 동일한 로케일 컨텍스트 내에서
|
|
1459
|
+
* 이를 통해 내비게이션이 동일한 로케일 컨텍스트 내에서 이루어지도록 보장합니다.
|
|
1465
1460
|
*/
|
|
1466
1461
|
export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
1467
1462
|
({ href, children, ...props }, ref) => {
|
|
@@ -1497,8 +1492,8 @@ export const checkIsExternalLink = (href?: string): boolean =>
|
|
|
1497
1492
|
|
|
1498
1493
|
/**
|
|
1499
1494
|
* 현재 로케일에 따라 href 속성을 조정하는 커스텀 Link 컴포넌트입니다.
|
|
1500
|
-
* 내부 링크의 경우 `getLocalizedUrl`을 사용하여 URL 앞에
|
|
1501
|
-
* 이를 통해 내비게이션이 동일한 로케일 컨텍스트 내에서
|
|
1495
|
+
* 내부 링크의 경우 `getLocalizedUrl`을 사용하여 URL 앞에 로케일 접두사를 붙입니다 (예: /fr/about).
|
|
1496
|
+
* 이를 통해 내비게이션이 동일한 로케일 컨텍스트 내에서 이루어지도록 보장합니다.
|
|
1502
1497
|
*/
|
|
1503
1498
|
export const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1504
1499
|
const { locale } = useLocale();
|
|
@@ -1532,13 +1527,13 @@ const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
|
1532
1527
|
/**
|
|
1533
1528
|
* 현재 로케일에 따라 href 속성을 조정하는 커스텀 Link 컴포넌트입니다.
|
|
1534
1529
|
* 내부 링크의 경우 `getLocalizedUrl`을 사용하여 URL 앞에 로케일을 붙입니다 (예: /fr/about).
|
|
1535
|
-
* 이를 통해 내비게이션이 동일한 로케일 컨텍스트 내에서
|
|
1530
|
+
* 이를 통해 내비게이션이 동일한 로케일 컨텍스트 내에서 이루어지도록 보장합니다.
|
|
1536
1531
|
*/
|
|
1537
1532
|
const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1538
1533
|
const { locale } = useLocale();
|
|
1539
1534
|
const isExternalLink = checkIsExternalLink(href);
|
|
1540
1535
|
|
|
1541
|
-
// 링크가 내부 링크이고 유효한 href가 제공된 경우,
|
|
1536
|
+
// 링크가 내부 링크이고 유효한 href가 제공된 경우, 로컬라이즈된 URL을 가져옵니다.
|
|
1542
1537
|
const localizedHref = isExternalLink ? href : getLocalizedUrl(href, locale);
|
|
1543
1538
|
|
|
1544
1539
|
return (
|
|
@@ -1556,7 +1551,7 @@ const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
|
1556
1551
|
Link.displayName = "Link";
|
|
1557
1552
|
```
|
|
1558
1553
|
|
|
1559
|
-
#### 작동
|
|
1554
|
+
#### 작동 원리
|
|
1560
1555
|
|
|
1561
1556
|
- **외부 링크 감지**:
|
|
1562
1557
|
헬퍼 함수 `checkIsExternalLink`는 URL이 외부 링크인지 여부를 판단합니다. 외부 링크는 현지화가 필요 없으므로 변경하지 않습니다.
|
|
@@ -1565,12 +1560,12 @@ Link.displayName = "Link";
|
|
|
1565
1560
|
`useLocale` 훅은 현재 로케일(예: 프랑스어의 경우 `fr`)을 제공합니다.
|
|
1566
1561
|
|
|
1567
1562
|
- **URL 현지화**:
|
|
1568
|
-
내부 링크(즉, 외부 링크가 아닌 경우)에
|
|
1563
|
+
내부 링크(즉, 외부 링크가 아닌 경우)에 대해 `getLocalizedUrl`을 사용하여 URL 앞에 현재 로케일을 자동으로 붙입니다. 예를 들어 사용자가 프랑스어 로케일에 있다면, `href`에 `/about`을 전달하면 `/fr/about`로 변환됩니다.
|
|
1569
1564
|
|
|
1570
1565
|
- **링크 반환**:
|
|
1571
1566
|
컴포넌트는 지역화된 URL을 가진 `<a>` 요소를 반환하여, 내비게이션이 현재 로케일과 일치하도록 보장합니다.
|
|
1572
1567
|
|
|
1573
|
-
이 `Link` 컴포넌트를 애플리케이션 전반에
|
|
1568
|
+
이 `Link` 컴포넌트를 애플리케이션 전반에 통합함으로써, 일관되고 언어 인식이 가능한 사용자 경험을 유지할 수 있으며, SEO 및 사용성 향상에도 도움이 됩니다.
|
|
1574
1569
|
|
|
1575
1570
|
### TypeScript 구성
|
|
1576
1571
|
|
|
@@ -1586,39 +1581,15 @@ TypeScript 구성에 자동 생성된 타입이 포함되어 있는지 확인하
|
|
|
1586
1581
|
{
|
|
1587
1582
|
// ... 기존 TypeScript 구성
|
|
1588
1583
|
"include": [
|
|
1589
|
-
// ... 기존 TypeScript
|
|
1590
|
-
".intlayer/**/*.ts", // 자동 생성된 타입 포함
|
|
1591
|
-
],
|
|
1592
|
-
}
|
|
1593
|
-
```
|
|
1594
|
-
|
|
1595
|
-
컴포넌트는 지역화된 URL을 가진 `<a>` 요소를 반환하여, 로케일에 맞는 일관된 내비게이션을 보장합니다.
|
|
1596
|
-
|
|
1597
|
-
이 `Link` 컴포넌트를 애플리케이션 전반에 통합하면, 일관되고 언어를 인식하는 사용자 경험을 유지하는 동시에 SEO와 사용성 향상의 이점을 누릴 수 있습니다.
|
|
1598
|
-
|
|
1599
|
-
### TypeScript 구성
|
|
1600
|
-
|
|
1601
|
-
Intlayer는 모듈 증강(module augmentation)을 사용하여 TypeScript의 이점을 활용하고 코드베이스를 더욱 견고하게 만듭니다.
|
|
1602
|
-
|
|
1603
|
-

|
|
1604
|
-
|
|
1605
|
-

|
|
1606
|
-
|
|
1607
|
-
TypeScript 구성에 자동 생성된 타입이 포함되어 있는지 확인하세요.
|
|
1608
|
-
|
|
1609
|
-
```json5 fileName="tsconfig.json"
|
|
1610
|
-
{
|
|
1611
|
-
// ... 기존 TypeScript 구성
|
|
1612
|
-
"include": [
|
|
1613
|
-
// ... 기존 TypeScript 구성
|
|
1584
|
+
// ... 기존 TypeScript 설정
|
|
1614
1585
|
".intlayer/**/*.ts", // 자동 생성된 타입 포함
|
|
1615
1586
|
],
|
|
1616
1587
|
}
|
|
1617
1588
|
```
|
|
1618
1589
|
|
|
1619
|
-
### Git
|
|
1590
|
+
### Git 설정
|
|
1620
1591
|
|
|
1621
|
-
Intlayer가 생성한
|
|
1592
|
+
Intlayer가 생성한 파일들은 Git 저장소에 커밋하지 않도록 무시하는 것이 권장됩니다.
|
|
1622
1593
|
|
|
1623
1594
|
이를 위해 `.gitignore` 파일에 다음 지침을 추가할 수 있습니다:
|
|
1624
1595
|
|
|
@@ -1627,18 +1598,18 @@ Intlayer가 생성한 파일은 Git 저장소에 커밋하지 않도록 무시
|
|
|
1627
1598
|
.intlayer
|
|
1628
1599
|
```
|
|
1629
1600
|
|
|
1630
|
-
### VS Code 확장
|
|
1601
|
+
### VS Code 확장 프로그램
|
|
1631
1602
|
|
|
1632
|
-
Intlayer와 함께 개발 경험을 향상시키기 위해 공식 **Intlayer VS Code
|
|
1603
|
+
Intlayer와 함께 개발 경험을 향상시키기 위해 공식 **Intlayer VS Code 확장 프로그램**을 설치할 수 있습니다.
|
|
1633
1604
|
|
|
1634
1605
|
[VS Code 마켓플레이스에서 설치하기](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
1635
1606
|
|
|
1636
|
-
이
|
|
1607
|
+
이 확장 프로그램은 다음 기능을 제공합니다:
|
|
1637
1608
|
|
|
1638
1609
|
- 번역 키에 대한 **자동 완성**.
|
|
1639
|
-
-
|
|
1640
|
-
-
|
|
1641
|
-
-
|
|
1610
|
+
- **실시간 오류 감지**로 누락된 번역을 확인할 수 있습니다.
|
|
1611
|
+
- **인라인 미리보기**를 통해 번역된 내용을 바로 확인할 수 있습니다.
|
|
1612
|
+
- **빠른 작업**으로 번역을 쉽게 생성하고 업데이트할 수 있습니다.
|
|
1642
1613
|
|
|
1643
1614
|
확장 기능 사용 방법에 대한 자세한 내용은 [Intlayer VS Code 확장 문서](https://intlayer.org/doc/vs-code-extension)를 참조하세요.
|
|
1644
1615
|
|