@intlayer/docs 5.5.11 β 5.5.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/intlayer_with_next-intl.md +0 -1
- package/blog/ar/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ar/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ar/what_is_internationalization.md +2 -2
- package/blog/de/intlayer_with_next-intl.md +0 -1
- package/blog/de/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/de/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/de/what_is_internationalization.md +2 -2
- package/blog/en/intlayer_with_next-intl.md +0 -1
- package/blog/en/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/en/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/en/what_is_internationalization.md +2 -2
- package/blog/en-GB/intlayer_with_next-intl.md +0 -1
- package/blog/en-GB/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/en-GB/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/en-GB/what_is_internationalization.md +2 -2
- package/blog/es/intlayer_with_next-intl.md +0 -1
- package/blog/es/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/es/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/es/what_is_internationalization.md +2 -2
- package/blog/fr/intlayer_with_next-intl.md +0 -1
- package/blog/fr/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/fr/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/fr/what_is_internationalization.md +2 -2
- package/blog/hi/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/hi/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/hi/what_is_internationalization.md +2 -2
- package/blog/it/intlayer_with_next-intl.md +0 -1
- package/blog/it/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/it/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/it/what_is_internationalization.md +2 -2
- package/blog/ja/intlayer_with_next-intl.md +0 -1
- package/blog/ja/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ja/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ja/what_is_internationalization.md +2 -2
- package/blog/ko/intlayer_with_next-intl.md +0 -1
- package/blog/ko/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ko/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/pt/intlayer_with_next-intl.md +0 -1
- package/blog/pt/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/pt/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/pt/what_is_internationalization.md +2 -2
- package/blog/ru/intlayer_with_next-intl.md +0 -1
- package/blog/ru/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/ru/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/ru/what_is_internationalization.md +2 -2
- package/blog/zh/intlayer_with_next-intl.md +0 -1
- package/blog/zh/list_i18n_technologies/CMS/wordpress.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/angular.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/flutter.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/react-native.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/react.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/svelte.md +1 -1
- package/blog/zh/list_i18n_technologies/frameworks/vue.md +1 -1
- package/blog/zh/what_is_internationalization.md +2 -2
- package/dist/cjs/blog.cjs +2 -2
- package/dist/cjs/blog.cjs.map +1 -1
- package/dist/cjs/common.cjs +17 -6
- package/dist/cjs/common.cjs.map +1 -1
- package/dist/cjs/doc.cjs +2 -2
- package/dist/cjs/doc.cjs.map +1 -1
- package/dist/cjs/frequentQuestions.cjs +2 -2
- package/dist/cjs/frequentQuestions.cjs.map +1 -1
- package/dist/cjs/generated/blog.entry.cjs +1152 -252
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +3778 -1124
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/cjs/generated/frequentQuestions.entry.cjs +794 -161
- package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
- package/dist/cjs/generated/legal.entry.cjs +32 -31
- package/dist/cjs/generated/legal.entry.cjs.map +1 -1
- package/dist/cjs/legal.cjs +2 -2
- package/dist/cjs/legal.cjs.map +1 -1
- package/dist/esm/blog.mjs +2 -2
- package/dist/esm/blog.mjs.map +1 -1
- package/dist/esm/common.mjs +17 -6
- package/dist/esm/common.mjs.map +1 -1
- package/dist/esm/doc.mjs +2 -2
- package/dist/esm/doc.mjs.map +1 -1
- package/dist/esm/frequentQuestions.mjs +2 -2
- package/dist/esm/frequentQuestions.mjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +1151 -252
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +3777 -1124
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/esm/generated/frequentQuestions.entry.mjs +793 -161
- package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
- package/dist/esm/generated/legal.entry.mjs +31 -31
- package/dist/esm/generated/legal.entry.mjs.map +1 -1
- package/dist/esm/legal.mjs +2 -2
- package/dist/esm/legal.mjs.map +1 -1
- package/dist/types/blog.d.ts +2 -2
- package/dist/types/blog.d.ts.map +1 -1
- package/dist/types/common.d.ts +3 -2
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/doc.d.ts +2 -2
- package/dist/types/doc.d.ts.map +1 -1
- package/dist/types/frequentQuestions.d.ts +2 -2
- package/dist/types/frequentQuestions.d.ts.map +1 -1
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/dist/types/generated/frequentQuestions.entry.d.ts +1 -0
- package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
- package/dist/types/generated/legal.entry.d.ts.map +1 -1
- package/dist/types/legal.d.ts +2 -2
- package/dist/types/legal.d.ts.map +1 -1
- package/docs/ar/intlayer_with_vite+react.md +100 -108
- package/docs/de/intlayer_with_vite+react.md +121 -142
- package/docs/en/CI_CD.md +3 -1
- package/docs/en/autoFill.md +3 -1
- package/docs/en/configuration.md +4 -1
- package/docs/en/dictionary/condition.md +3 -1
- package/docs/en/dictionary/content_extention_customization.md +3 -1
- package/docs/en/dictionary/enumeration.md +3 -1
- package/docs/en/dictionary/file.md +3 -1
- package/docs/en/dictionary/function_fetching.md +3 -1
- package/docs/en/dictionary/get_started.md +3 -1
- package/docs/en/dictionary/insertion.md +3 -1
- package/docs/en/dictionary/markdown.md +3 -1
- package/docs/en/dictionary/nesting.md +3 -1
- package/docs/en/dictionary/translation.md +3 -1
- package/docs/en/how_works_intlayer.md +3 -1
- package/docs/en/index.md +3 -1
- package/docs/en/interest_of_intlayer.md +3 -1
- package/docs/en/intlayer_CMS.md +3 -1
- package/docs/en/intlayer_cli.md +3 -1
- package/docs/en/intlayer_visual_editor.md +3 -1
- package/docs/en/intlayer_with_angular.md +3 -1
- package/docs/en/intlayer_with_create_react_app.md +3 -1
- package/docs/en/intlayer_with_express.md +3 -1
- package/docs/en/intlayer_with_lynx+react.md +3 -1
- package/docs/en/intlayer_with_nextjs_14.md +6 -1
- package/docs/en/intlayer_with_nextjs_15.md +5 -1
- package/docs/en/intlayer_with_nextjs_page_router.md +5 -1
- package/docs/en/intlayer_with_nuxt.md +3 -1
- package/docs/en/intlayer_with_react_native+expo.md +3 -1
- package/docs/en/intlayer_with_vite+preact.md +3 -1
- package/docs/en/intlayer_with_vite+react.md +9 -7
- package/docs/en/intlayer_with_vite+solid.md +3 -1
- package/docs/en/intlayer_with_vite+svelte.md +3 -1
- package/docs/en/intlayer_with_vite+vue.md +3 -1
- package/docs/en/introduction.md +3 -1
- package/docs/en/mcp_server.md +42 -1
- package/docs/en/packages/@intlayer/api/index.md +3 -1
- package/docs/en/packages/@intlayer/chokidar/index.md +3 -1
- package/docs/en/packages/@intlayer/cli/index.md +3 -1
- package/docs/en/packages/@intlayer/config/index.md +3 -1
- package/docs/en/packages/@intlayer/core/index.md +3 -1
- package/docs/en/packages/@intlayer/design-system/index.md +3 -1
- package/docs/en/packages/@intlayer/dictionary-entry/index.md +3 -1
- package/docs/en/packages/@intlayer/editor/index.md +3 -1
- package/docs/en/packages/@intlayer/editor-react/index.md +3 -1
- package/docs/en/packages/@intlayer/webpack/index.md +3 -1
- package/docs/en/packages/angular-intlayer/index.md +3 -1
- package/docs/en/packages/express-intlayer/index.md +3 -1
- package/docs/en/packages/express-intlayer/t.md +3 -1
- package/docs/en/packages/intlayer/getConfiguration.md +3 -1
- package/docs/en/packages/intlayer/getEnumeration.md +3 -1
- package/docs/en/packages/intlayer/getHTMLTextDir.md +3 -1
- package/docs/en/packages/intlayer/getLocaleLang.md +3 -1
- package/docs/en/packages/intlayer/getLocaleName.md +3 -1
- package/docs/en/packages/intlayer/getLocalizedUrl.md +3 -1
- package/docs/en/packages/intlayer/getMultilingualUrls.md +3 -1
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +3 -1
- package/docs/en/packages/intlayer/getTranslation.md +3 -1
- package/docs/en/packages/intlayer/getTranslationContent.md +3 -1
- package/docs/en/packages/intlayer/index.md +3 -1
- package/docs/en/packages/intlayer-cli/index.md +3 -1
- package/docs/en/packages/intlayer-editor/index.md +3 -1
- package/docs/en/packages/lynx-intlayer/index.md +3 -1
- package/docs/en/packages/next-intlayer/index.md +3 -1
- package/docs/en/packages/next-intlayer/t.md +3 -1
- package/docs/en/packages/next-intlayer/useDictionary.md +3 -1
- package/docs/en/packages/next-intlayer/useIntlayer.md +3 -1
- package/docs/en/packages/next-intlayer/useIntlayerAsync.md +3 -1
- package/docs/en/packages/next-intlayer/useLocale.md +3 -1
- package/docs/en/packages/nuxt-intlayer/index.md +3 -1
- package/docs/en/packages/preact-intlayer/index.md +3 -1
- package/docs/en/packages/react-intlayer/index.md +3 -1
- package/docs/en/packages/react-intlayer/t.md +3 -1
- package/docs/en/packages/react-intlayer/useDictionary.md +3 -1
- package/docs/en/packages/react-intlayer/useIntlayer.md +3 -1
- package/docs/en/packages/react-intlayer/useIntlayerAsync.md +3 -1
- package/docs/en/packages/react-intlayer/useLocale.md +3 -1
- package/docs/en/packages/react-native-intlayer/index.md +3 -1
- package/docs/en/packages/react-scripts-intlayer/index.md +3 -1
- package/docs/en/packages/solid-intlayer/index.md +3 -1
- package/docs/en/packages/svelte-intlayer/index.md +3 -1
- package/docs/en/packages/vite-intlayer/index.md +3 -1
- package/docs/en/packages/vue-intlayer/index.md +3 -1
- package/docs/en/per_locale_file.md +3 -1
- package/docs/en/roadmap.md +5 -2
- package/docs/en/vs_code_extension.md +3 -1
- package/docs/en-GB/intlayer_with_vite+react.md +64 -83
- package/docs/es/intlayer_with_vite+react.md +91 -94
- package/docs/fr/intlayer_with_vite+react.md +73 -65
- package/docs/hi/intlayer_with_vite+react.md +107 -107
- package/docs/it/intlayer_with_vite+react.md +156 -112
- package/docs/ja/intlayer_with_vite+react.md +153 -218
- package/docs/ko/intlayer_with_vite+react.md +116 -148
- package/docs/ko/packages/intlayer/getLocalizedUrl.md +1 -23
- package/docs/pt/intlayer_with_vite+react.md +110 -132
- package/docs/ru/intlayer_with_vite+react.md +98 -83
- package/docs/zh/intlayer_with_vite+react.md +147 -184
- package/docs/zh/packages/intlayer/getLocalizedUrl.md +1 -23
- package/frequent_questions/ar/build_error_CI_CD.md +75 -0
- package/frequent_questions/de/build_error_CI_CD.md +75 -0
- package/frequent_questions/en/build_error_CI_CD.md +75 -0
- package/frequent_questions/en-GB/build_error_CI_CD.md +75 -0
- package/frequent_questions/es/build_error_CI_CD.md +75 -0
- package/frequent_questions/fr/build_error_CI_CD.md +75 -0
- package/frequent_questions/hi/build_error_CI_CD.md +75 -0
- package/frequent_questions/it/build_error_CI_CD.md +75 -0
- package/frequent_questions/ja/build_error_CI_CD.md +75 -0
- package/frequent_questions/ja/intlayer_command_undefined.md +3 -3
- package/frequent_questions/ko/build_error_CI_CD.md +75 -0
- package/frequent_questions/ko/intlayer_command_undefined.md +3 -3
- package/frequent_questions/pt/build_error_CI_CD.md +75 -0
- package/frequent_questions/ru/build_error_CI_CD.md +75 -0
- package/frequent_questions/zh/build_error_CI_CD.md +75 -0
- package/frequent_questions/zh/intlayer_command_undefined.md +3 -3
- package/legal/ar/privacy_notice.md +83 -0
- package/legal/ar/terms_of_service.md +55 -0
- package/legal/de/privacy_notice.md +83 -0
- package/legal/de/terms_of_service.md +55 -0
- package/legal/en/privacy_notice.md +83 -0
- package/legal/en/terms_of_service.md +55 -0
- package/legal/en-GB/privacy_notice.md +83 -0
- package/legal/en-GB/terms_of_service.md +55 -0
- package/legal/es/privacy_notice.md +83 -0
- package/legal/es/terms_of_service.md +55 -0
- package/legal/fr/privacy_notice.md +83 -0
- package/legal/fr/terms_of_service.md +55 -0
- package/legal/hi/privacy_notice.md +83 -0
- package/legal/hi/terms_of_service.md +55 -0
- package/legal/it/privacy_notice.md +83 -0
- package/legal/it/terms_of_service.md +55 -0
- package/legal/ja/privacy_notice.md +83 -0
- package/legal/ja/terms_of_service.md +55 -0
- package/legal/ko/privacy_notice.md +83 -0
- package/legal/ko/terms_of_service.md +55 -0
- package/legal/pt/privacy_notice.md +83 -0
- package/legal/pt/terms_of_service.md +55 -0
- package/legal/ru/privacy_notice.md +83 -0
- package/legal/ru/terms_of_service.md +55 -0
- package/legal/zh/privacy_notice.md +83 -0
- package/legal/zh/terms_of_service.md +55 -0
- package/package.json +7 -6
- package/src/blog.ts +6 -4
- package/src/common.ts +23 -7
- package/src/doc.ts +6 -4
- package/src/frequentQuestions.ts +6 -4
- package/src/generated/blog.entry.ts +1177 -280
- package/src/generated/docs.entry.ts +3868 -1217
- package/src/generated/frequentQuestions.entry.ts +808 -178
- package/src/generated/legal.entry.ts +34 -36
- package/src/legal.ts +6 -4
|
@@ -1,40 +1,40 @@
|
|
|
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
|
-
-
|
|
17
|
+
- vite-and-react
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
# Intlayerμ Vite
|
|
20
|
+
# Intlayerμ Vite λ° Reactλ‘ κ΅μ ν(i18n) μμνκΈ°
|
|
21
21
|
|
|
22
|
-
GitHubμμ [μ ν리μΌμ΄μ
ν
νλ¦Ώ](https://github.com/aymericzip/intlayer-vite-react-template)μ
|
|
22
|
+
GitHubμμ [μ ν리μΌμ΄μ
ν
νλ¦Ώ](https://github.com/aymericzip/intlayer-vite-react-template)μ μ°Έμ‘°νμΈμ.
|
|
23
23
|
|
|
24
|
-
## Intlayer
|
|
24
|
+
## Intlayerλ?
|
|
25
25
|
|
|
26
|
-
**Intlayer**λ
|
|
26
|
+
**Intlayer**λ μ΅μ μΉ μ ν리μΌμ΄μ
μμ λ€κ΅μ΄ μ§μμ κ°μννκΈ° μν΄ μ€κ³λ νμ μ μ΄κ³ μ€ν μμ€μΈ κ΅μ ν(i18n) λΌμ΄λΈλ¬λ¦¬μ
λλ€.
|
|
27
27
|
|
|
28
28
|
Intlayerλ₯Ό μ¬μ©νλ©΄ λ€μμ ν μ μμ΅λλ€:
|
|
29
29
|
|
|
30
|
-
- **μ»΄ν¬λνΈ μμ€μμ μ μΈμ μ¬μ μ
|
|
30
|
+
- **μ»΄ν¬λνΈ μμ€μμ μ μΈμ μ¬μ μ μ¬μ©νμ¬** λ²μμ μ½κ² κ΄λ¦¬ν μ μμ΅λλ€.
|
|
31
31
|
- **λ©νλ°μ΄ν°, λΌμ°νΈ λ° μ½ν
μΈ λ₯Ό λμ μΌλ‘ νμ§ν**ν μ μμ΅λλ€.
|
|
32
32
|
- **μλ μμ±λ νμ
μΌλ‘ TypeScript μ§μμ 보μ₯**νμ¬ μλ μμ± λ° μ€λ₯ κ°μ§λ₯Ό ν₯μμν΅λλ€.
|
|
33
33
|
- **λμ λ‘μΌμΌ κ°μ§ λ° μ νκ³Ό κ°μ κ³ κΈ κΈ°λ₯**μ νμ©ν μ μμ΅λλ€.
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
37
|
-
## Vite
|
|
37
|
+
## Vite λ° React μ ν리μΌμ΄μ
μμ Intlayer μ€μ λ¨κ³λ³ κ°μ΄λ
|
|
38
38
|
|
|
39
39
|
### 1λ¨κ³: μμ‘΄μ± μ€μΉ
|
|
40
40
|
|
|
@@ -60,14 +60,14 @@ yarn add --save-dev vite-intlayer
|
|
|
60
60
|
κ΅¬μ± κ΄λ¦¬, λ²μ, [μ½ν
μΈ μ μΈ](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
61
|
|
|
62
62
|
- **react-intlayer**
|
|
63
|
-
Intlayerλ₯Ό React μ ν리μΌμ΄μ
κ³Ό ν΅ν©νλ ν¨ν€μ§λ‘, React κ΅μ νλ₯Ό μν 컨ν
μ€νΈ
|
|
63
|
+
Intlayerλ₯Ό React μ ν리μΌμ΄μ
κ³Ό ν΅ν©νλ ν¨ν€μ§λ‘, React κ΅μ νλ₯Ό μν 컨ν
μ€νΈ νλ‘λ°μ΄λμ ν
μ μ 곡ν©λλ€.
|
|
64
64
|
|
|
65
65
|
- **vite-intlayer**
|
|
66
|
-
|
|
66
|
+
Intlayerλ₯Ό [Vite λ²λ€λ¬](https://vite.dev/guide/why.html#why-bundle-for-production)μ ν΅ν©νκΈ° μν Vite νλ¬κ·ΈμΈκ³Ό, μ¬μ©μμ μ νΈ λ‘μΌμΌ κ°μ§, μΏ ν€ κ΄λ¦¬, URL 리λλ μ
μ²λ¦¬λ₯Ό μν λ―Έλ€μ¨μ΄λ₯Ό ν¬ν¨ν©λλ€.
|
|
67
67
|
|
|
68
68
|
### 2λ¨κ³: νλ‘μ νΈ κ΅¬μ±
|
|
69
69
|
|
|
70
|
-
μ ν리μΌμ΄μ
μ μΈμ΄λ₯Ό ꡬμ±νκΈ°
|
|
70
|
+
μ ν리μΌμ΄μ
μ μΈμ΄λ₯Ό ꡬμ±νκΈ° μν΄ μ€μ νμΌμ λ§λμΈμ:
|
|
71
71
|
|
|
72
72
|
```typescript fileName="intlayer.config.ts" codeFormat="typescript"
|
|
73
73
|
import { Locales, type IntlayerConfig } from "intlayer";
|
|
@@ -164,7 +164,7 @@ module.exports = defineConfig({
|
|
|
164
164
|
});
|
|
165
165
|
```
|
|
166
166
|
|
|
167
|
-
> `intlayerPlugin()` Vite νλ¬κ·ΈμΈμ Intlayerλ₯Ό Viteμ ν΅ν©νλ λ° μ¬μ©λ©λλ€. μ΄ νλ¬κ·ΈμΈμ μ½ν
μΈ μ μΈ νμΌμ λΉλλ₯Ό 보μ₯νκ³ κ°λ° λͺ¨λμμ μ΄λ₯Ό λͺ¨λν°λ§ν©λλ€. λν Vite μ ν리μΌμ΄μ
λ΄μμ Intlayer νκ²½ λ³μλ₯Ό μ μν©λλ€. μΆκ°λ‘, μ±λ₯ μ΅μ νλ₯Ό μν λ³μΉ(alias)
|
|
167
|
+
> `intlayerPlugin()` Vite νλ¬κ·ΈμΈμ Intlayerλ₯Ό Viteμ ν΅ν©νλ λ° μ¬μ©λ©λλ€. μ΄ νλ¬κ·ΈμΈμ μ½ν
μΈ μ μΈ νμΌμ λΉλλ₯Ό 보μ₯νκ³ κ°λ° λͺ¨λμμ μ΄λ₯Ό λͺ¨λν°λ§ν©λλ€. λν Vite μ ν리μΌμ΄μ
λ΄μμ Intlayer νκ²½ λ³μλ₯Ό μ μν©λλ€. μΆκ°λ‘, μ±λ₯ μ΅μ νλ₯Ό μν λ³μΉ(alias)λ μ 곡ν©λλ€.
|
|
168
168
|
|
|
169
169
|
### 4λ¨κ³: μ½ν
μΈ μ μΈνκΈ°
|
|
170
170
|
|
|
@@ -204,12 +204,12 @@ const appContent = {
|
|
|
204
204
|
),
|
|
205
205
|
fr: (
|
|
206
206
|
<>
|
|
207
|
-
<code>src/App.tsx</code>λ₯Ό νΈμ§νκ³
|
|
207
|
+
HMRμ ν
μ€νΈνλ €λ©΄ <code>src/App.tsx</code>λ₯Ό νΈμ§νκ³ μ μ₯νμΈμ
|
|
208
208
|
</>
|
|
209
209
|
),
|
|
210
210
|
es: (
|
|
211
211
|
<>
|
|
212
|
-
<code>src/App.tsx</code>λ₯Ό νΈμ§νκ³
|
|
212
|
+
HMRμ ν
μ€νΈνλ €λ©΄ <code>src/App.tsx</code>λ₯Ό νΈμ§νκ³ μ μ₯νμΈμ
|
|
213
213
|
</>
|
|
214
214
|
),
|
|
215
215
|
}),
|
|
@@ -235,13 +235,11 @@ const appContent = {
|
|
|
235
235
|
viteLogo: t({
|
|
236
236
|
en: "Vite logo",
|
|
237
237
|
fr: "Logo Vite",
|
|
238
|
-
ko: "Vite λ‘κ³ ",
|
|
239
238
|
es: "Logo Vite",
|
|
240
239
|
}),
|
|
241
240
|
reactLogo: t({
|
|
242
241
|
en: "React logo",
|
|
243
242
|
fr: "Logo React",
|
|
244
|
-
ko: "React λ‘κ³ ",
|
|
245
243
|
es: "Logo React",
|
|
246
244
|
}),
|
|
247
245
|
|
|
@@ -250,7 +248,6 @@ const appContent = {
|
|
|
250
248
|
count: t({
|
|
251
249
|
en: "count is ",
|
|
252
250
|
fr: "le compte est ",
|
|
253
|
-
ko: "μΉ΄μ΄νΈλ ",
|
|
254
251
|
es: "el recuento es ",
|
|
255
252
|
}),
|
|
256
253
|
|
|
@@ -258,10 +255,11 @@ const appContent = {
|
|
|
258
255
|
t <
|
|
259
256
|
ReactNode >
|
|
260
257
|
{
|
|
261
|
-
// μ½ν
μΈ μ React λ
Έλλ₯Ό μ¬μ©νλ κ²½μ° Reactλ₯Ό λ°λμ import
|
|
258
|
+
// μ½ν
μΈ μ React λ
Έλλ₯Ό μ¬μ©νλ κ²½μ° Reactλ₯Ό λ°λμ importνμΈμ
|
|
262
259
|
en: (
|
|
263
260
|
<>
|
|
264
|
-
Edit <code>src/App.tsx</code>
|
|
261
|
+
Edit <code>src/App.tsx</code> νμΌμ μμ νκ³ μ μ₯νμ¬ HMRμ
|
|
262
|
+
ν
μ€νΈνμΈμ
|
|
265
263
|
</>
|
|
266
264
|
),
|
|
267
265
|
fr: (
|
|
@@ -277,7 +275,6 @@ const appContent = {
|
|
|
277
275
|
},
|
|
278
276
|
|
|
279
277
|
readTheDocs: t({
|
|
280
|
-
ko: "λ μμλ³΄λ €λ©΄ Vite λ° React λ‘κ³ λ₯Ό ν΄λ¦νμΈμ",
|
|
281
278
|
en: "Click on the Vite and React logos to learn more",
|
|
282
279
|
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
283
280
|
es: "Haga clic en los logotipos de Vite y React para obtener mΓ‘s informaciΓ³n",
|
|
@@ -318,7 +315,7 @@ const appContent = {
|
|
|
318
315
|
t <
|
|
319
316
|
ReactNode >
|
|
320
317
|
{
|
|
321
|
-
// μ½ν
μΈ μ React λ
Έλλ₯Ό μ¬μ©νλ κ²½μ° Reactλ₯Ό
|
|
318
|
+
// μ½ν
μΈ μ React λ
Έλλ₯Ό μ¬μ©νλ κ²½μ° Reactλ₯Ό μν¬νΈνλ κ²μ μμ§ λ§μΈμ
|
|
322
319
|
en: (
|
|
323
320
|
<>
|
|
324
321
|
Edit <code>src/App.tsx</code> and save to test HMR
|
|
@@ -331,7 +328,7 @@ const appContent = {
|
|
|
331
328
|
),
|
|
332
329
|
es: (
|
|
333
330
|
<>
|
|
334
|
-
Edita <code>src/App.tsx</code>
|
|
331
|
+
Edita <code>src/App.tsx</code> y guarda para probar HMR
|
|
335
332
|
</>
|
|
336
333
|
),
|
|
337
334
|
},
|
|
@@ -340,7 +337,7 @@ const appContent = {
|
|
|
340
337
|
en: "Click on the Vite and React logos to learn more",
|
|
341
338
|
fr: "Cliquez sur les logos Vite et React pour en savoir plus",
|
|
342
339
|
es: "Haga clic en los logotipos de Vite y React para obtener mΓ‘s informaciΓ³n",
|
|
343
|
-
ko: "
|
|
340
|
+
ko: "Vite λ° React λ‘κ³ λ₯Ό ν΄λ¦νμ¬ μμΈν μμ보μΈμ",
|
|
344
341
|
}),
|
|
345
342
|
},
|
|
346
343
|
};
|
|
@@ -365,37 +362,37 @@ module.exports = appContent;
|
|
|
365
362
|
"reactLogo": {
|
|
366
363
|
"nodeType": "translation",
|
|
367
364
|
"translation": {
|
|
368
|
-
"ko": "React λ‘κ³ ",
|
|
369
365
|
"en": "React logo",
|
|
370
366
|
"fr": "Logo React",
|
|
371
|
-
"es": "Logo React"
|
|
367
|
+
"es": "Logo React",
|
|
368
|
+
"ko": "리μ‘νΈ λ‘κ³ "
|
|
372
369
|
}
|
|
373
370
|
},
|
|
374
371
|
"title": {
|
|
375
372
|
"nodeType": "translation",
|
|
376
373
|
"translation": {
|
|
377
|
-
"ko": "Vite + React",
|
|
378
374
|
"en": "Vite + React",
|
|
379
375
|
"fr": "Vite + React",
|
|
380
|
-
"es": "Vite + React"
|
|
376
|
+
"es": "Vite + React",
|
|
377
|
+
"ko": "Vite + React"
|
|
381
378
|
}
|
|
382
379
|
},
|
|
383
380
|
"count": {
|
|
384
381
|
"nodeType": "translation",
|
|
385
382
|
"translation": {
|
|
386
|
-
"ko": "μΉ΄μ΄νΈλ ",
|
|
387
383
|
"en": "count is ",
|
|
388
384
|
"fr": "le compte est ",
|
|
389
|
-
"es": "el recuento es "
|
|
385
|
+
"es": "el recuento es ",
|
|
386
|
+
"ko": "μΉ΄μ΄νΈλ "
|
|
390
387
|
}
|
|
391
388
|
},
|
|
392
389
|
"edit": {
|
|
393
390
|
"nodeType": "translation",
|
|
394
391
|
"translation": {
|
|
395
|
-
"ko": "src/App.tsxλ₯Ό νΈμ§νκ³ μ μ₯νμ¬ HMRμ ν
μ€νΈνμΈμ",
|
|
396
392
|
"en": "Edit src/App.tsx and save to test HMR",
|
|
397
393
|
"fr": "Γditez src/App.tsx et enregistrez pour tester HMR",
|
|
398
|
-
"es": "Edita src/App.tsx y guarda para probar HMR"
|
|
394
|
+
"es": "Edita src/App.tsx y guarda para probar HMR",
|
|
395
|
+
"ko": "src/App.tsxλ₯Ό νΈμ§νκ³ μ μ₯νμ¬ HMRμ ν
μ€νΈνμΈμ"
|
|
399
396
|
}
|
|
400
397
|
},
|
|
401
398
|
"readTheDocs": {
|
|
@@ -411,11 +408,11 @@ module.exports = appContent;
|
|
|
411
408
|
}
|
|
412
409
|
```
|
|
413
410
|
|
|
414
|
-
> μ ν리μΌμ΄μ
λ΄
|
|
411
|
+
> μ ν리μΌμ΄μ
λ΄ μ΄λμμλ `contentDir` λλ ν 리(κΈ°λ³Έκ°: `./src`)μ ν¬ν¨λλ©΄ μ½ν
μΈ μ μΈμ μ μν μ μμ΅λλ€. κ·Έλ¦¬κ³ μ½ν
μΈ μ μΈ νμΌ νμ₯μ(κΈ°λ³Έκ°: `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)μ μΌμΉν΄μΌ ν©λλ€.
|
|
415
412
|
|
|
416
413
|
> μμΈν λ΄μ©μ [μ½ν
μΈ μ μΈ λ¬Έμ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/dictionary/get_started.md)λ₯Ό μ°Έμ‘°νμΈμ.
|
|
417
414
|
|
|
418
|
-
> μ½ν
μΈ νμΌμ TSX μ½λκ° ν¬ν¨λ κ²½μ°, μ½ν
μΈ
|
|
415
|
+
> μ½ν
μΈ νμΌμ TSX μ½λκ° ν¬ν¨λ κ²½μ°, μ½ν
μΈ νμΌμ `import React from "react";`λ₯Ό κ°μ Έμ€λ κ²μ κ³ λ €ν΄μΌ ν©λλ€.
|
|
419
416
|
|
|
420
417
|
### 5λ¨κ³: μ½λμμ Intlayer μ¬μ©νκΈ°
|
|
421
418
|
|
|
@@ -568,7 +565,7 @@ module.exports = App;
|
|
|
568
565
|
> <img src={content.image.src.value} alt={content.image.value} />
|
|
569
566
|
> ```
|
|
570
567
|
|
|
571
|
-
> `useIntlayer` ν
μ λν΄ λ
|
|
568
|
+
> `useIntlayer` ν
μ λν΄ λ μμλ³΄λ €λ©΄ [λ¬Έμ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useIntlayer.md)λ₯Ό μ°Έμ‘°νμΈμ.
|
|
572
569
|
|
|
573
570
|
### (μ ν μ¬ν) 6λ¨κ³: μ½ν
μΈ μ μΈμ΄ λ³κ²½νκΈ°
|
|
574
571
|
|
|
@@ -627,14 +624,14 @@ const LocaleSwitcher = () => {
|
|
|
627
624
|
- https://example.com/fr/about
|
|
628
625
|
```
|
|
629
626
|
|
|
630
|
-
>
|
|
627
|
+
> κΈ°λ³Έμ μΌλ‘, κΈ°λ³Έ λ‘μΌμΌμ λν΄μλ κ²½λ‘μ μ λμ¬κ° λΆμ§ μμ΅λλ€. κΈ°λ³Έ λ‘μΌμΌμ μ λμ¬λ₯Ό λΆμ΄κ³ μΆλ€λ©΄, κ΅¬μ± μ€μ μμ `middleware.prefixDefault` μ΅μ
μ `true`λ‘ μ€μ ν μ μμ΅λλ€. μμΈν λ΄μ©μ [κ΅¬μ± λ¬Έμ](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)λ₯Ό μ°Έμ‘°νμΈμ.
|
|
631
628
|
|
|
632
629
|
μ ν리μΌμ΄μ
μ μ§μνλ λΌμ°ν
μ μΆκ°νλ €λ©΄, μ ν리μΌμ΄μ
μ λΌμ°νΈλ₯Ό κ°μΈκ³ λ‘μΌμΌ κΈ°λ° λΌμ°ν
μ μ²λ¦¬νλ `LocaleRouter` μ»΄ν¬λνΈλ₯Ό μμ±ν μ μμ΅λλ€. λ€μμ [React Router](https://reactrouter.com/home)λ₯Ό μ¬μ©ν μμ μ
λλ€:
|
|
633
630
|
|
|
634
631
|
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
635
632
|
// νμν μμ‘΄μ±κ³Ό ν¨μλ€μ μν¬νΈν©λλ€
|
|
636
|
-
import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'μμ μ 곡νλ μ νΈλ¦¬ν°
|
|
637
|
-
import type { FC, PropsWithChildren } from "react"; // ν¨μν
|
|
633
|
+
import { type Locales, configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'μμ μ 곡νλ μ νΈλ¦¬ν° ν¨μ λ° νμ
|
|
634
|
+
import type { FC, PropsWithChildren } from "react"; // ν¨μν μ»΄ν¬λνΈ λ° props νμ
|
|
638
635
|
import { IntlayerProvider } from "react-intlayer"; // κ΅μ ν 컨ν
μ€νΈλ₯Ό μν νλ‘λ°μ΄λ
|
|
639
636
|
import {
|
|
640
637
|
BrowserRouter,
|
|
@@ -644,7 +641,7 @@ import {
|
|
|
644
641
|
useLocation,
|
|
645
642
|
} from "react-router-dom"; // λ€λΉκ²μ΄μ
κ΄λ¦¬λ₯Ό μν λΌμ°ν° μ»΄ν¬λνΈ
|
|
646
643
|
|
|
647
|
-
// Intlayerμμ
|
|
644
|
+
// Intlayerμμ μ€μ κ° κ΅¬μ‘° λΆν΄ ν λΉ
|
|
648
645
|
const { internationalization, middleware } = configuration;
|
|
649
646
|
const { locales, defaultLocale } = internationalization;
|
|
650
647
|
|
|
@@ -667,7 +664,7 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
667
664
|
);
|
|
668
665
|
|
|
669
666
|
/**
|
|
670
|
-
* middleware.prefixDefaultκ° trueμΈ κ²½μ°, κΈ°λ³Έ λ‘μΌμΌμ νμ
|
|
667
|
+
* middleware.prefixDefaultκ° trueμΈ κ²½μ°, κΈ°λ³Έ λ‘μΌμΌμ νμ μ λμ¬λ‘ λΆμ΄μΌ ν©λλ€.
|
|
671
668
|
*/
|
|
672
669
|
if (middleware.prefixDefault) {
|
|
673
670
|
// λ‘μΌμΌ μ ν¨μ± κ²μ¬
|
|
@@ -676,19 +673,19 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
676
673
|
return (
|
|
677
674
|
<Navigate
|
|
678
675
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
679
|
-
replace // νμ¬ κΈ°λ‘ νλͺ©μ μ νλͺ©μΌλ‘
|
|
676
|
+
replace // νμ¬ κΈ°λ‘ νλͺ©μ μ νλͺ©μΌλ‘ κ΅μ²΄ν©λλ€
|
|
680
677
|
/>
|
|
681
678
|
);
|
|
682
679
|
}
|
|
683
680
|
|
|
684
|
-
// μμ μ»΄ν¬λνΈλ₯Ό IntlayerProviderλ‘ κ°μΈκ³ νμ¬ λ‘μΌμΌμ
|
|
681
|
+
// μμ μ»΄ν¬λνΈλ₯Ό IntlayerProviderλ‘ κ°μΈκ³ νμ¬ λ‘μΌμΌμ μ€μ ν©λλ€
|
|
685
682
|
return (
|
|
686
683
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
687
684
|
);
|
|
688
685
|
} else {
|
|
689
686
|
/**
|
|
690
687
|
* middleware.prefixDefaultκ° falseμΌ λ, κΈ°λ³Έ λ‘μΌμΌμ μ λμ¬κ° λΆμ§ μμ΅λλ€.
|
|
691
|
-
* νμ¬ λ‘μΌμΌμ΄
|
|
688
|
+
* νμ¬ λ‘μΌμΌμ΄ μ ν¨νλ©° κΈ°λ³Έ λ‘μΌμΌμ΄ μλμ νμΈν©λλ€.
|
|
692
689
|
*/
|
|
693
690
|
if (
|
|
694
691
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -698,11 +695,11 @@ const AppLocalized: FC<PropsWithChildren<{ locale: Locales }>> = ({
|
|
|
698
695
|
)
|
|
699
696
|
.includes(currentLocale) // νμ¬ λ‘μΌμΌμ΄ μ ν¨ν λ‘μΌμΌ λͺ©λ‘μ μλμ§ νμΈ
|
|
700
697
|
) {
|
|
701
|
-
// λ‘μΌμΌ
|
|
698
|
+
// λ‘μΌμΌ μ λμ΄κ° μλ κ²½λ‘λ‘ λ¦¬λλ μ
|
|
702
699
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
703
700
|
}
|
|
704
701
|
|
|
705
|
-
// μμ μ»΄ν¬λνΈλ₯Ό
|
|
702
|
+
// IntlayerProviderλ‘ μμ μ»΄ν¬λνΈλ₯Ό κ°μΈκ³ νμ¬ λ‘μΌμΌ μ€μ
|
|
706
703
|
return (
|
|
707
704
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
708
705
|
);
|
|
@@ -722,10 +719,10 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
722
719
|
)
|
|
723
720
|
.map((locale) => (
|
|
724
721
|
<Route
|
|
725
|
-
// λ‘μΌμΌμ μΊ‘μ²νλ
|
|
722
|
+
// λ‘μΌμΌμ μΊ‘μ²νλ κ²½λ‘ ν¨ν΄ (μ: /en/, /fr/) λ° μ΄ν λͺ¨λ κ²½λ‘μ λ§€μΉ
|
|
726
723
|
path={`/${locale}/*`}
|
|
727
724
|
key={locale}
|
|
728
|
-
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // λ‘μΌμΌ κ΄λ¦¬λ₯Ό μν΄ childrenμ
|
|
725
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // λ‘μΌμΌ κ΄λ¦¬λ₯Ό μν΄ childrenμ λν
|
|
729
726
|
/>
|
|
730
727
|
))}
|
|
731
728
|
|
|
@@ -736,7 +733,7 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
736
733
|
path="*"
|
|
737
734
|
element={
|
|
738
735
|
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
739
|
-
} // λ‘μΌμΌ κ΄λ¦¬λ₯Ό μν΄ childrenμ
|
|
736
|
+
} // λ‘μΌμΌ κ΄λ¦¬λ₯Ό μν΄ childrenμ λν
|
|
740
737
|
/>
|
|
741
738
|
)
|
|
742
739
|
}
|
|
@@ -746,9 +743,9 @@ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => (
|
|
|
746
743
|
```
|
|
747
744
|
|
|
748
745
|
```jsx fileName="src/components/LocaleRouter.mjx" codeFormat="esm"
|
|
749
|
-
// νμν
|
|
750
|
-
import { configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'μμ μ 곡νλ μ νΈλ¦¬ν° ν¨μμ
|
|
751
|
-
// 'intlayer'μμ μ 곡νλ μ νΈλ¦¬ν° ν¨μμ
|
|
746
|
+
// νμν μμ‘΄μ±κ³Ό ν¨μλ€μ μν¬νΈν©λλ€.
|
|
747
|
+
import { configuration, getPathWithoutLocale } from "intlayer"; // 'intlayer'μμ μ 곡νλ μ νΈλ¦¬ν° ν¨μμ νμ
|
|
748
|
+
// 'intlayer'μμ μ 곡νλ μ νΈλ¦¬ν° ν¨μμ νμ
|
|
752
749
|
import { IntlayerProvider } from "react-intlayer"; // κ΅μ ν 컨ν
μ€νΈλ₯Ό μν νλ‘λ°μ΄λ
|
|
753
750
|
import {
|
|
754
751
|
BrowserRouter,
|
|
@@ -763,9 +760,9 @@ const { internationalization, middleware } = configuration;
|
|
|
763
760
|
const { locales, defaultLocale } = internationalization;
|
|
764
761
|
|
|
765
762
|
/**
|
|
766
|
-
*
|
|
763
|
+
* λ‘컬λΌμ΄μ μ΄μ
μ μ²λ¦¬νκ³ μμ μ»΄ν¬λνΈλ₯Ό μ μ ν λ‘μΌμΌ 컨ν
μ€νΈλ‘ κ°μΈλ μ»΄ν¬λνΈμ
λλ€.
|
|
767
764
|
/**
|
|
768
|
-
* URL κΈ°λ° λ‘μΌμΌ κ°μ§ λ° κ²μ¦μ
|
|
765
|
+
* URL κΈ°λ° λ‘μΌμΌ κ°μ§ λ° κ²μ¦μ κ΄λ¦¬ν©λλ€.
|
|
769
766
|
*/
|
|
770
767
|
const AppLocalized = ({ children, locale }) => {
|
|
771
768
|
const { pathname, search } = useLocation(); // νμ¬ URL κ²½λ‘λ₯Ό κ°μ Έμ΅λλ€.
|
|
@@ -779,7 +776,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
779
776
|
);
|
|
780
777
|
|
|
781
778
|
/**
|
|
782
|
-
* middleware.prefixDefaultκ° trueμΈ
|
|
779
|
+
* middleware.prefixDefaultκ° trueμΈ κ²½μ°, κΈ°λ³Έ λ‘μΌμΌμ νμ μ λμ¬λ‘ λΆμ΄μΌ ν©λλ€.
|
|
783
780
|
*/
|
|
784
781
|
if (middleware.prefixDefault) {
|
|
785
782
|
// λ‘μΌμΌμ κ²μ¦ν©λλ€.
|
|
@@ -800,7 +797,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
800
797
|
} else {
|
|
801
798
|
/**
|
|
802
799
|
* middleware.prefixDefaultκ° falseμΌ λ, κΈ°λ³Έ λ‘μΌμΌμ μ λμ¬κ° λΆμ§ μμ΅λλ€.
|
|
803
|
-
* νμ¬ λ‘μΌμΌμ΄
|
|
800
|
+
* νμ¬ λ‘μΌμΌμ΄ μ ν¨νλ©° κΈ°λ³Έ λ‘μΌμΌμ΄ μλμ νμΈν©λλ€.
|
|
804
801
|
*/
|
|
805
802
|
if (
|
|
806
803
|
currentLocale.toString() !== defaultLocale.toString() &&
|
|
@@ -808,13 +805,13 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
808
805
|
.filter(
|
|
809
806
|
(locale) => locale.toString() !== defaultLocale.toString() // κΈ°λ³Έ λ‘μΌμΌ μ μΈ
|
|
810
807
|
)
|
|
811
|
-
.includes(currentLocale) // νμ¬ λ‘μΌμΌμ΄ μ ν¨ν λ‘μΌμΌ λͺ©λ‘μ
|
|
808
|
+
.includes(currentLocale) // νμ¬ λ‘μΌμΌμ΄ μ ν¨ν λ‘μΌμΌ λͺ©λ‘μ μλμ§ νμΈ
|
|
812
809
|
) {
|
|
813
810
|
// λ‘μΌμΌ μ λμ¬κ° μλ κ²½λ‘λ‘ λ¦¬λλ μ
|
|
814
811
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
815
812
|
}
|
|
816
813
|
|
|
817
|
-
// μμ μ»΄ν¬λνΈλ₯Ό
|
|
814
|
+
// IntlayerProviderλ‘ μμ μ»΄ν¬λνΈλ₯Ό κ°μΈκ³ νμ¬ λ‘μΌμΌ μ€μ
|
|
818
815
|
return (
|
|
819
816
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
820
817
|
);
|
|
@@ -842,7 +839,7 @@ export const LocaleRouter = ({ children }) => (
|
|
|
842
839
|
))}
|
|
843
840
|
|
|
844
841
|
{
|
|
845
|
-
// κΈ°λ³Έ λ‘μΌμΌ μ λμ΄ μ¬μ©μ΄ λΉνμ±νλ κ²½μ°, λ£¨νΈ κ²½λ‘μμ
|
|
842
|
+
// κΈ°λ³Έ λ‘μΌμΌ μ λμ΄ μ¬μ©μ΄ λΉνμ±νλ κ²½μ°, λ£¨νΈ κ²½λ‘μμ μμ μ»΄ν¬λνΈλ₯Ό μ§μ λ λλ§
|
|
846
843
|
!middleware.prefixDefault && (
|
|
847
844
|
<Route
|
|
848
845
|
path="*"
|
|
@@ -858,8 +855,8 @@ export const LocaleRouter = ({ children }) => (
|
|
|
858
855
|
```
|
|
859
856
|
|
|
860
857
|
```jsx fileName="src/components/LocaleRouter.cjx" codeFormat="commonjs"
|
|
861
|
-
// νμν
|
|
862
|
-
const { configuration, getPathWithoutLocale } = require("intlayer"); // 'intlayer'μμ μ 곡νλ μ νΈλ¦¬ν°
|
|
858
|
+
// νμν μ’
μμ±κ³Ό ν¨μλ€μ κ°μ Έμ΅λλ€.
|
|
859
|
+
const { configuration, getPathWithoutLocale } = require("intlayer"); // 'intlayer'μμ μ 곡νλ μ νΈλ¦¬ν° ν¨μ λ° νμ
|
|
863
860
|
const { IntlayerProvider, useLocale } = require("react-intlayer"); // κ΅μ ν 컨ν
μ€νΈλ₯Ό μν νλ‘λ°μ΄λ
|
|
864
861
|
const {
|
|
865
862
|
BrowserRouter,
|
|
@@ -867,7 +864,7 @@ const {
|
|
|
867
864
|
Route,
|
|
868
865
|
Navigate,
|
|
869
866
|
useLocation,
|
|
870
|
-
} = require("react-router-dom"); //
|
|
867
|
+
} = require("react-router-dom"); // λ΄λΉκ²μ΄μ
κ΄λ¦¬λ₯Ό μν λΌμ°ν° μ»΄ν¬λνΈ
|
|
871
868
|
|
|
872
869
|
// Intlayerμμ μ€μ μ ꡬ쑰 λΆν΄ ν λΉν©λλ€.
|
|
873
870
|
const { internationalization, middleware } = configuration;
|
|
@@ -883,33 +880,33 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
883
880
|
// νμ¬ λ‘μΌμΌμ κ²°μ νλ©°, μ 곡λμ§ μμ κ²½μ° κΈ°λ³Έ λ‘μΌμΌλ‘ λ체ν©λλ€.
|
|
884
881
|
const currentLocale = locale ?? defaultLocale;
|
|
885
882
|
|
|
886
|
-
// κ²½λ‘μμ λ‘μΌμΌ
|
|
883
|
+
// κ²½λ‘μμ λ‘μΌμΌ μ λμ¬λ₯Ό μ κ±°νμ¬ κΈ°λ³Έ κ²½λ‘λ₯Ό λ§λλλ€.
|
|
887
884
|
const pathWithoutLocale = getPathWithoutLocale(
|
|
888
885
|
pathname // νμ¬ URL κ²½λ‘
|
|
889
886
|
);
|
|
890
887
|
|
|
891
888
|
/**
|
|
892
|
-
* middleware.prefixDefaultκ° trueμΈ κ²½μ°, κΈ°λ³Έ λ‘μΌμΌμ νμ
|
|
889
|
+
* middleware.prefixDefaultκ° trueμΈ κ²½μ°, κΈ°λ³Έ λ‘μΌμΌμ νμ μ λμ¬λ‘ λΆμ΄μΌ ν©λλ€.
|
|
893
890
|
*/
|
|
894
891
|
if (middleware.prefixDefault) {
|
|
895
|
-
//
|
|
892
|
+
// λ‘μΌμΌμ κ²μ¦ν©λλ€.
|
|
896
893
|
if (!locale || !locales.includes(locale)) {
|
|
897
|
-
//
|
|
894
|
+
// μ
λ°μ΄νΈλ κ²½λ‘μ ν¨κ» κΈ°λ³Έ λ‘μΌμΌλ‘ 리λ€μ΄λ νΈν©λλ€.
|
|
898
895
|
return (
|
|
899
896
|
<Navigate
|
|
900
897
|
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
901
|
-
replace // νμ¬ κΈ°λ‘ νλͺ©μ μ νλͺ©μΌλ‘
|
|
898
|
+
replace // νμ¬ κΈ°λ‘ νλͺ©μ μ νλͺ©μΌλ‘ κ΅μ²΄
|
|
902
899
|
/>
|
|
903
900
|
);
|
|
904
901
|
}
|
|
905
902
|
|
|
906
|
-
// μμ μ»΄ν¬λνΈλ₯Ό IntlayerProviderλ‘ κ°μΈκ³ νμ¬ λ‘μΌμΌμ
|
|
903
|
+
// μμ μ»΄ν¬λνΈλ₯Ό IntlayerProviderλ‘ κ°μΈκ³ νμ¬ λ‘μΌμΌμ μ€μ
|
|
907
904
|
return (
|
|
908
905
|
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
909
906
|
);
|
|
910
907
|
} else {
|
|
911
908
|
/**
|
|
912
|
-
* middleware.prefixDefaultκ° falseμΌ λ, κΈ°λ³Έ λ‘μΌμΌμ
|
|
909
|
+
* middleware.prefixDefaultκ° falseμΌ λ, κΈ°λ³Έ λ‘μΌμΌμ μ λμ¬κ° λΆμ§ μμ΅λλ€.
|
|
913
910
|
* νμ¬ λ‘μΌμΌμ΄ μ ν¨νλ©° κΈ°λ³Έ λ‘μΌμΌμ΄ μλμ νμΈν©λλ€.
|
|
914
911
|
*/
|
|
915
912
|
if (
|
|
@@ -920,7 +917,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
920
917
|
)
|
|
921
918
|
.includes(currentLocale) // νμ¬ λ‘μΌμΌμ΄ μ ν¨ν λ‘μΌμΌ λͺ©λ‘μ ν¬ν¨λμ΄ μλμ§ νμΈ
|
|
922
919
|
) {
|
|
923
|
-
// λ‘μΌμΌ
|
|
920
|
+
// λ‘μΌμΌ μ λμ¬κ° μλ κ²½λ‘λ‘ λ¦¬λλ μ
ν©λλ€.
|
|
924
921
|
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
925
922
|
}
|
|
926
923
|
|
|
@@ -933,7 +930,7 @@ const AppLocalized = ({ children, locale }) => {
|
|
|
933
930
|
|
|
934
931
|
/**
|
|
935
932
|
* λ‘μΌμΌλ³ κ²½λ‘λ₯Ό μ€μ νλ λΌμ°ν° μ»΄ν¬λνΈμ
λλ€.
|
|
936
|
-
* React Routerλ₯Ό μ¬μ©νμ¬
|
|
933
|
+
* React Routerλ₯Ό μ¬μ©νμ¬ λ΄λΉκ²μ΄μ
μ κ΄λ¦¬νκ³ λ‘컬λΌμ΄μ¦λ μ»΄ν¬λνΈλ₯Ό λ λλ§ν©λλ€.
|
|
937
934
|
*/
|
|
938
935
|
const LocaleRouter = ({ children }) => (
|
|
939
936
|
<BrowserRouter>
|
|
@@ -944,21 +941,21 @@ const LocaleRouter = ({ children }) => (
|
|
|
944
941
|
)
|
|
945
942
|
.map((locale) => (
|
|
946
943
|
<Route
|
|
947
|
-
// λ‘μΌμΌμ μΊ‘μ²νλ κ²½λ‘ ν¨ν΄ (μ: /en/, /fr/) λ° μ΄ν λͺ¨λ
|
|
944
|
+
// λ‘μΌμΌμ μΊ‘μ²νλ κ²½λ‘ ν¨ν΄ (μ: /en/, /fr/) λ° μ΄ν λͺ¨λ κ²½λ‘μ λ§€μΉν©λλ€.
|
|
948
945
|
path={`/${locale}/*`}
|
|
949
946
|
key={locale}
|
|
950
|
-
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // μμ μ»΄ν¬λνΈλ₯Ό λ‘μΌμΌ κ΄λ¦¬λ‘
|
|
947
|
+
element={<AppLocalized locale={locale}>{children}</AppLocalized>} // μμ μ»΄ν¬λνΈλ₯Ό λ‘μΌμΌ κ΄λ¦¬λ‘ κ°μ
|
|
951
948
|
/>
|
|
952
949
|
))}
|
|
953
950
|
|
|
954
951
|
{
|
|
955
|
-
// κΈ°λ³Έ λ‘μΌμΌ μ λμ΄ μ¬μ©μ΄ λΉνμ±νλ κ²½μ°, λ£¨νΈ κ²½λ‘μμ μμ μ»΄ν¬λνΈλ₯Ό μ§μ
|
|
952
|
+
// κΈ°λ³Έ λ‘μΌμΌ μ λμ΄ μ¬μ©μ΄ λΉνμ±νλ κ²½μ°, λ£¨νΈ κ²½λ‘μμ μμ μ»΄ν¬λνΈλ₯Ό μ§μ λ λλ§
|
|
956
953
|
!middleware.prefixDefault && (
|
|
957
954
|
<Route
|
|
958
955
|
path="*"
|
|
959
956
|
element={
|
|
960
957
|
<AppLocalized locale={defaultLocale}>{children}</AppLocalized>
|
|
961
|
-
} // μμ μ»΄ν¬λνΈλ₯Ό λ‘μΌμΌ κ΄λ¦¬λ‘
|
|
958
|
+
} // μμ μ»΄ν¬λνΈλ₯Ό λ‘μΌμΌ κ΄λ¦¬λ‘ κ°μ
|
|
962
959
|
/>
|
|
963
960
|
)
|
|
964
961
|
}
|
|
@@ -973,7 +970,7 @@ const LocaleRouter = ({ children }) => (
|
|
|
973
970
|
import { LocaleRouter } from "./components/LocaleRouter";
|
|
974
971
|
import type { FC } from "react";
|
|
975
972
|
|
|
976
|
-
// ...
|
|
973
|
+
// ... μ¬λ¬λΆμ AppContent μ»΄ν¬λνΈ
|
|
977
974
|
|
|
978
975
|
const App: FC = () => (
|
|
979
976
|
<LocaleRouter>
|
|
@@ -985,7 +982,7 @@ const App: FC = () => (
|
|
|
985
982
|
```jsx fileName="src/App.mjx" codeFormat="esm"
|
|
986
983
|
import { LocaleRouter } from "./components/LocaleRouter";
|
|
987
984
|
|
|
988
|
-
// ...
|
|
985
|
+
// ... μ¬λ¬λΆμ AppContent μ»΄ν¬λνΈ
|
|
989
986
|
|
|
990
987
|
const App = () => (
|
|
991
988
|
<LocaleRouter>
|
|
@@ -997,7 +994,7 @@ const App = () => (
|
|
|
997
994
|
```jsx fileName="src/App.cjx" codeFormat="commonjs"
|
|
998
995
|
const { LocaleRouter } = require("./components/LocaleRouter");
|
|
999
996
|
|
|
1000
|
-
// ...
|
|
997
|
+
// ... μ¬λ¬λΆμ AppContent μ»΄ν¬λνΈ
|
|
1001
998
|
|
|
1002
999
|
const App = () => (
|
|
1003
1000
|
<LocaleRouter>
|
|
@@ -1043,7 +1040,7 @@ module.exports = defineConfig({
|
|
|
1043
1040
|
|
|
1044
1041
|
### (μ ν μ¬ν) 8λ¨κ³: λ‘μΌμΌμ΄ λ³κ²½λ λ URL λ³κ²½νκΈ°
|
|
1045
1042
|
|
|
1046
|
-
λ‘μΌμΌμ΄ λ³κ²½λ λ URLμ λ³κ²½νλ €λ©΄, `useLocale` ν
μμ μ 곡νλ `onLocaleChange`
|
|
1043
|
+
λ‘μΌμΌμ΄ λ³κ²½λ λ URLμ λ³κ²½νλ €λ©΄, `useLocale` ν
μμ μ 곡νλ `onLocaleChange` μμ±μ μ¬μ©ν μ μμ΅λλ€. λμμ, `react-router-dom`μ `useLocation`κ³Ό `useNavigate` ν
μ μ¬μ©νμ¬ URL κ²½λ‘λ₯Ό μ
λ°μ΄νΈν μ μμ΅λλ€.
|
|
1047
1044
|
|
|
1048
1045
|
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
1049
1046
|
import { useLocation, useNavigate } from "react-router-dom";
|
|
@@ -1063,7 +1060,7 @@ const LocaleSwitcher: FC = () => {
|
|
|
1063
1060
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1064
1061
|
onLocaleChange: (locale) => {
|
|
1065
1062
|
// μ
λ°μ΄νΈλ λ‘μΌμΌλ‘ URLμ ꡬμ±ν©λλ€
|
|
1066
|
-
//
|
|
1063
|
+
// μ: /es/about?foo=bar
|
|
1067
1064
|
const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale);
|
|
1068
1065
|
|
|
1069
1066
|
// URL κ²½λ‘λ₯Ό μ
λ°μ΄νΈν©λλ€
|
|
@@ -1091,11 +1088,11 @@ const LocaleSwitcher: FC = () => {
|
|
|
1091
1088
|
{localeItem}
|
|
1092
1089
|
</span>
|
|
1093
1090
|
<span>
|
|
1094
|
-
{/* ν΄λΉ
|
|
1091
|
+
{/* ν΄λΉ λ‘μΌμΌμμμ μΈμ΄λͺ
- μ: FranΓ§ais */}
|
|
1095
1092
|
{getLocaleName(localeItem, locale)}
|
|
1096
1093
|
</span>
|
|
1097
1094
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1098
|
-
{/* νμ¬ λ‘μΌμΌμμμ μΈμ΄λͺ
- μ: FrancΓ©s (νμ¬ λ‘μΌμΌμ΄ Locales.SPANISH
|
|
1095
|
+
{/* νμ¬ λ‘μΌμΌμμμ μΈμ΄λͺ
- μ: FrancΓ©s (νμ¬ λ‘μΌμΌμ΄ Locales.SPANISHμΌ λ) */}
|
|
1099
1096
|
{getLocaleName(localeItem)}
|
|
1100
1097
|
</span>
|
|
1101
1098
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
@@ -1159,11 +1156,11 @@ const LocaleSwitcher = () => {
|
|
|
1159
1156
|
{getLocaleName(localeItem, locale)}
|
|
1160
1157
|
</span>
|
|
1161
1158
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1162
|
-
{/* νμ¬ λ‘μΌμΌμμμ μΈμ΄ - μ:
|
|
1159
|
+
{/* νμ¬ λ‘μΌμΌμμμ μΈμ΄ - μ: Locales.SPANISHλ‘ μ€μ λ νμ¬ λ‘μΌμΌμμ FrancΓ©s */}
|
|
1163
1160
|
{getLocaleName(localeItem)}
|
|
1164
1161
|
</span>
|
|
1165
1162
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1166
|
-
{/* μμ΄λ‘ λ
|
|
1163
|
+
{/* μμ΄λ‘ λ μΈμ΄ - μ: French */}
|
|
1167
1164
|
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1168
1165
|
</span>
|
|
1169
1166
|
</a>
|
|
@@ -1227,7 +1224,7 @@ const LocaleSwitcher = () => {
|
|
|
1227
1224
|
{getLocaleName(localeItem)}
|
|
1228
1225
|
</span>
|
|
1229
1226
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
1230
|
-
{/* μμ΄λ‘ λ
|
|
1227
|
+
{/* μμ΄λ‘ λ μΈμ΄λͺ
- μ: French */}
|
|
1231
1228
|
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
1232
1229
|
</span>
|
|
1233
1230
|
</a>
|
|
@@ -1253,19 +1250,19 @@ const LocaleSwitcher = () => {
|
|
|
1253
1250
|
|
|
1254
1251
|
---
|
|
1255
1252
|
|
|
1256
|
-
### (μ ν μ¬ν) 9λ¨κ³: HTMLμ μΈμ΄ λ° λ°©ν₯ μμ±
|
|
1253
|
+
### (μ ν μ¬ν) 9λ¨κ³: HTMLμ μΈμ΄ λ° λ°©ν₯ μμ± λ³κ²½
|
|
1257
1254
|
|
|
1258
1255
|
μ ν리μΌμ΄μ
μ΄ λ€κ΅μ΄λ₯Ό μ§μν λ, νμ¬ λ‘μΌμΌμ λ§κ² `<html>` νκ·Έμ `lang` λ° `dir` μμ±μ μ
λ°μ΄νΈνλ κ²μ΄ λ§€μ° μ€μν©λλ€. μ΄λ κ² νλ©΄ λ€μμ 보μ₯ν μ μμ΅λλ€:
|
|
1259
1256
|
|
|
1260
1257
|
- **μ κ·Όμ±**: νλ©΄ λλ
κΈ° λ° λ³΄μ‘° κΈ°μ μ μ¬λ°λ₯Έ `lang` μμ±μ μμ‘΄νμ¬ μ½ν
μΈ λ₯Ό μ ννκ² λ°μνκ³ ν΄μν©λλ€.
|
|
1261
|
-
- **ν
μ€νΈ λ λλ§**: `dir`(λ°©ν₯) μμ±μ ν
μ€νΈκ° μ¬λ°λ₯Έ μμλ‘ λ λλ§λλλ‘ λ³΄μ₯ν©λλ€(μ: μμ΄λ μΌμͺ½μμ
|
|
1262
|
-
- **SEO**: κ²μ μμ§μ `lang` μμ±μ μ¬μ©νμ¬ νμ΄μ§μ μΈμ΄λ₯Ό νλ¨νκ³ ,
|
|
1258
|
+
- **ν
μ€νΈ λ λλ§**: `dir`(λ°©ν₯) μμ±μ ν
μ€νΈκ° μ¬λ°λ₯Έ μμλ‘ λ λλ§λλλ‘ λ³΄μ₯ν©λλ€(μ: μμ΄λ μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘, μλμ΄λ νλΈλ¦¬μ΄λ μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘), μ΄λ κ°λ
μ±μ νμμ μ
λλ€.
|
|
1259
|
+
- **SEO**: κ²μ μμ§μ `lang` μμ±μ μ¬μ©νμ¬ νμ΄μ§μ μΈμ΄λ₯Ό νλ¨νκ³ , κ²μ κ²°κ³Όμμ μ μ ν νμ§νλ μ½ν
μΈ λ₯Ό μ 곡νλ λ° λμμ μ€λλ€.
|
|
1263
1260
|
|
|
1264
1261
|
λ‘μΌμΌμ΄ λ³κ²½λ λ μ΄λ¬ν μμ±μ λμ μΌλ‘ μ
λ°μ΄νΈνλ©΄, μ§μλλ λͺ¨λ μΈμ΄μμ μ¬μ©μμκ² μΌκ΄λκ³ μ κ·Ό κ°λ₯ν κ²½νμ 보μ₯ν μ μμ΅λλ€.
|
|
1265
1262
|
|
|
1266
1263
|
#### ν
ꡬννκΈ°
|
|
1267
1264
|
|
|
1268
|
-
HTML μμ±μ κ΄λ¦¬νλ 컀μ€ν
ν
μ
|
|
1265
|
+
HTML μμ±μ κ΄λ¦¬νλ 컀μ€ν
ν
μ λ§λλλ€. μ΄ ν
μ λ‘μΌμΌ λ³κ²½μ κ°μ§νμ¬ μμ±μ μ μ ν μ
λ°μ΄νΈν©λλ€:
|
|
1269
1266
|
|
|
1270
1267
|
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
1271
1268
|
import { useEffect } from "react";
|
|
@@ -1283,7 +1280,7 @@ export const useI18nHTMLAttributes = () => {
|
|
|
1283
1280
|
const { locale } = useLocale();
|
|
1284
1281
|
|
|
1285
1282
|
useEffect(() => {
|
|
1286
|
-
// νμ¬
|
|
1283
|
+
// νμ¬ λ‘μΌμΌλ‘ μΈμ΄ μμ±μ μ
λ°μ΄νΈν©λλ€.
|
|
1287
1284
|
document.documentElement.lang = locale;
|
|
1288
1285
|
|
|
1289
1286
|
// νμ¬ λ‘μΌμΌμ λ°λΌ ν
μ€νΈ λ°©ν₯μ μ€μ ν©λλ€.
|
|
@@ -1323,7 +1320,7 @@ const { useLocale } = require("react-intlayer");
|
|
|
1323
1320
|
const { getHTMLTextDir } = require("intlayer");
|
|
1324
1321
|
|
|
1325
1322
|
/**
|
|
1326
|
-
* νμ¬
|
|
1323
|
+
* νμ¬ λ‘μΌμΌμ λ°λΌ HTML <html> μμμ `lang` λ° `dir` μμ±μ μ
λ°μ΄νΈν©λλ€.
|
|
1327
1324
|
* - `lang`: λΈλΌμ°μ μ κ²μ μμ§μ νμ΄μ§μ μΈμ΄λ₯Ό μ립λλ€.
|
|
1328
1325
|
* - `dir`: μ¬λ°λ₯Έ μ½κΈ° μμ 보μ₯μ μν΄ μ€μ ν©λλ€ (μ: μμ΄λ 'ltr', μλμ΄λ 'rtl').
|
|
1329
1326
|
*
|
|
@@ -1355,7 +1352,7 @@ import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
|
1355
1352
|
import "./App.css";
|
|
1356
1353
|
|
|
1357
1354
|
const AppContent: FC = () => {
|
|
1358
|
-
// λ‘μΌμΌμ λ°λΌ <html> νκ·Έμ lang
|
|
1355
|
+
// λ‘μΌμΌμ λ°λΌ <html> νκ·Έμ langκ³Ό dir μμ±μ μ
λ°μ΄νΈνκΈ° μν΄ ν
μ μ μ©ν©λλ€.
|
|
1359
1356
|
useI18nHTMLAttributes();
|
|
1360
1357
|
|
|
1361
1358
|
// ... μ»΄ν¬λνΈμ λλ¨Έμ§ λΆλΆ
|
|
@@ -1379,7 +1376,7 @@ const AppContent = () => {
|
|
|
1379
1376
|
// λ‘μΌμΌμ λ°λΌ <html> νκ·Έμ lang λ° dir μμ±μ μ
λ°μ΄νΈνκΈ° μν΄ ν
μ μ μ©ν©λλ€.
|
|
1380
1377
|
useI18nHTMLAttributes();
|
|
1381
1378
|
|
|
1382
|
-
// ...
|
|
1379
|
+
// ... λλ¨Έμ§ μ»΄ν¬λνΈ λ΄μ©
|
|
1383
1380
|
};
|
|
1384
1381
|
|
|
1385
1382
|
const App = () => (
|
|
@@ -1403,11 +1400,6 @@ const AppContent = () => {
|
|
|
1403
1400
|
|
|
1404
1401
|
// ... μ»΄ν¬λνΈμ λλ¨Έμ§ λΆλΆ
|
|
1405
1402
|
};
|
|
1406
|
-
// λ‘μΌμΌμ λ°λΌ <html> νκ·Έμ lang λ° dir μμ±μ μ
λ°μ΄νΈνκΈ° μν΄ ν
μ μ μ©ν©λλ€.
|
|
1407
|
-
useI18nHTMLAttributes();
|
|
1408
|
-
|
|
1409
|
-
// ... λλ¨Έμ§ μ»΄ν¬λνΈ λ΄μ©
|
|
1410
|
-
};
|
|
1411
1403
|
|
|
1412
1404
|
const App = () => (
|
|
1413
1405
|
<IntlayerProvider>
|
|
@@ -1418,11 +1410,11 @@ const App = () => (
|
|
|
1418
1410
|
module.exports = App;
|
|
1419
1411
|
```
|
|
1420
1412
|
|
|
1421
|
-
μ΄ λ³κ²½ μ¬νμ μ μ©νλ©΄ μ ν리μΌμ΄μ
μ λ€μμ
|
|
1413
|
+
μ΄ λ³κ²½ μ¬νμ μ μ©νλ©΄ μ ν리μΌμ΄μ
μ λ€μμ 보μ₯ν©λλ€:
|
|
1422
1414
|
|
|
1423
|
-
- νμ¬ λ‘μΌμΌμ μ¬λ°λ₯΄κ² λ°μνλ **μΈμ΄**(`lang`)
|
|
1415
|
+
- νμ¬ λ‘μΌμΌμ μ¬λ°λ₯΄κ² λ°μνλ **μΈμ΄**(`lang`) μμ±μΌλ‘ SEO λ° λΈλΌμ°μ λμμ μ€μν©λλ€.
|
|
1424
1416
|
- λ‘μΌμΌμ λ°λΌ **ν
μ€νΈ λ°©ν₯**(`dir`)μ μ‘°μ νμ¬, μλ‘ λ€λ₯Έ μ½κΈ° μμλ₯Ό κ°μ§ μΈμ΄μ λν΄ κ°λ
μ±κ³Ό μ¬μ©μ±μ ν₯μμν΅λλ€.
|
|
1425
|
-
- 보쑰 κΈ°μ μ΄
|
|
1417
|
+
- 보쑰 κΈ°μ μ΄ μ΄λ¬ν μμ±μ μμ‘΄νλ―λ‘ λ **μ κ·Όμ± λμ** κ²½νμ μ 곡ν©λλ€.
|
|
1426
1418
|
|
|
1427
1419
|
### (μ ν μ¬ν) 10λ¨κ³: μ§μνλ λ§ν¬ μ»΄ν¬λνΈ λ§λ€κΈ°
|
|
1428
1420
|
|
|
@@ -1430,9 +1422,9 @@ module.exports = App;
|
|
|
1430
1422
|
|
|
1431
1423
|
μ΄ λμμ μ¬λ¬ κ°μ§ μ΄μ λ‘ μ μ©ν©λλ€:
|
|
1432
1424
|
|
|
1433
|
-
- **SEO λ° μ¬μ©μ κ²½ν**: μ§μνλ URLμ κ²μ μμ§μ΄ μΈμ΄λ³ νμ΄μ§λ₯Ό μ¬λ°λ₯΄κ²
|
|
1434
|
-
- **μΌκ΄μ±**: μ ν리μΌμ΄μ
μ λ°μ κ±Έμ³ μ§μνλ λ§ν¬λ₯Ό μ¬μ©ν¨μΌλ‘μ¨ λ΄λΉκ²μ΄μ
μ΄ νμ¬ λ‘μΌμΌ λ΄μμ μ μ§λμ΄
|
|
1435
|
-
|
|
1425
|
+
- **SEO λ° μ¬μ©μ κ²½ν**: μ§μνλ URLμ κ²μ μμ§μ΄ μΈμ΄λ³ νμ΄μ§λ₯Ό μ¬λ°λ₯΄κ² μμΈννλλ‘ λκ³ , μ¬μ©μκ° μ νΈνλ μΈμ΄λ‘ λ μ½ν
μΈ λ₯Ό μ 곡ν©λλ€.
|
|
1426
|
+
- **μΌκ΄μ±**: μ ν리μΌμ΄μ
μ λ°μ κ±Έμ³ μ§μνλ λ§ν¬λ₯Ό μ¬μ©ν¨μΌλ‘μ¨ λ΄λΉκ²μ΄μ
μ΄ νμ¬ λ‘μΌμΌ λ΄μμ μ μ§λμ΄ μκΈ°μΉ μμ μΈμ΄ μ νμ λ°©μ§ν©λλ€.
|
|
1427
|
+
- **μ μ§λ³΄μμ±**: λ‘컬λΌμ΄μ μ΄μ
λ‘μ§μ λ¨μΌ μ»΄ν¬λνΈμ μ€μ μ§μ€ννλ©΄ URL κ΄λ¦¬λ₯Ό λ¨μννμ¬ μ ν리μΌμ΄μ
μ΄ μ±μ₯ν¨μ λ°λΌ μ½λλ² μ΄μ€λ₯Ό λ μ½κ² μ μ§λ³΄μνκ³ νμ₯ν μ μμ΅λλ€.
|
|
1436
1428
|
|
|
1437
1429
|
μλλ TypeScriptλ‘ κ΅¬νν λ‘컬λΌμ΄μ¦λ `Link` μ»΄ν¬λνΈμ
λλ€:
|
|
1438
1430
|
|
|
@@ -1461,7 +1453,7 @@ export const checkIsExternalLink = (href?: string): boolean =>
|
|
|
1461
1453
|
/**
|
|
1462
1454
|
* νμ¬ λ‘μΌμΌμ λ°λΌ href μμ±μ μ‘°μ νλ 컀μ€ν
Link μ»΄ν¬λνΈμ
λλ€.
|
|
1463
1455
|
* λ΄λΆ λ§ν¬μ κ²½μ° `getLocalizedUrl`μ μ¬μ©νμ¬ URL μμ λ‘μΌμΌμ λΆμ
λλ€ (μ: /fr/about).
|
|
1464
|
-
* μ΄λ₯Ό ν΅ν΄ λ΄λΉκ²μ΄μ
μ΄ λμΌν λ‘μΌμΌ 컨ν
μ€νΈ λ΄μμ
|
|
1456
|
+
* μ΄λ₯Ό ν΅ν΄ λ΄λΉκ²μ΄μ
μ΄ λμΌν λ‘μΌμΌ 컨ν
μ€νΈ λ΄μμ μ΄λ£¨μ΄μ§λλ‘ λ³΄μ₯ν©λλ€.
|
|
1465
1457
|
*/
|
|
1466
1458
|
export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
1467
1459
|
({ href, children, ...props }, ref) => {
|
|
@@ -1497,8 +1489,8 @@ export const checkIsExternalLink = (href?: string): boolean =>
|
|
|
1497
1489
|
|
|
1498
1490
|
/**
|
|
1499
1491
|
* νμ¬ λ‘μΌμΌμ λ°λΌ href μμ±μ μ‘°μ νλ 컀μ€ν
Link μ»΄ν¬λνΈμ
λλ€.
|
|
1500
|
-
* λ΄λΆ λ§ν¬μ κ²½μ° `getLocalizedUrl`μ μ¬μ©νμ¬ URL μμ
|
|
1501
|
-
* μ΄λ₯Ό ν΅ν΄ λ΄λΉκ²μ΄μ
μ΄ λμΌν λ‘μΌμΌ 컨ν
μ€νΈ λ΄μμ
|
|
1492
|
+
* λ΄λΆ λ§ν¬μ κ²½μ° `getLocalizedUrl`μ μ¬μ©νμ¬ URL μμ λ‘μΌμΌ μ λμ¬λ₯Ό λΆμ
λλ€ (μ: /fr/about).
|
|
1493
|
+
* μ΄λ₯Ό ν΅ν΄ λ΄λΉκ²μ΄μ
μ΄ λμΌν λ‘μΌμΌ 컨ν
μ€νΈ λ΄μμ μ΄λ£¨μ΄μ§λλ‘ λ³΄μ₯ν©λλ€.
|
|
1502
1494
|
*/
|
|
1503
1495
|
export const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1504
1496
|
const { locale } = useLocale();
|
|
@@ -1532,13 +1524,13 @@ const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
|
1532
1524
|
/**
|
|
1533
1525
|
* νμ¬ λ‘μΌμΌμ λ°λΌ href μμ±μ μ‘°μ νλ 컀μ€ν
Link μ»΄ν¬λνΈμ
λλ€.
|
|
1534
1526
|
* λ΄λΆ λ§ν¬μ κ²½μ° `getLocalizedUrl`μ μ¬μ©νμ¬ URL μμ λ‘μΌμΌμ λΆμ
λλ€ (μ: /fr/about).
|
|
1535
|
-
* μ΄λ₯Ό ν΅ν΄ λ΄λΉκ²μ΄μ
μ΄ λμΌν λ‘μΌμΌ 컨ν
μ€νΈ λ΄μμ
|
|
1527
|
+
* μ΄λ₯Ό ν΅ν΄ λ΄λΉκ²μ΄μ
μ΄ λμΌν λ‘μΌμΌ 컨ν
μ€νΈ λ΄μμ μ΄λ£¨μ΄μ§λλ‘ λ³΄μ₯ν©λλ€.
|
|
1536
1528
|
*/
|
|
1537
1529
|
const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1538
1530
|
const { locale } = useLocale();
|
|
1539
1531
|
const isExternalLink = checkIsExternalLink(href);
|
|
1540
1532
|
|
|
1541
|
-
// λ§ν¬κ° λ΄λΆ λ§ν¬μ΄κ³ μ ν¨ν hrefκ° μ 곡λ κ²½μ°,
|
|
1533
|
+
// λ§ν¬κ° λ΄λΆ λ§ν¬μ΄κ³ μ ν¨ν hrefκ° μ 곡λ κ²½μ°, λ‘컬λΌμ΄μ¦λ URLμ κ°μ Έμ΅λλ€.
|
|
1542
1534
|
const localizedHref = isExternalLink ? href : getLocalizedUrl(href, locale);
|
|
1543
1535
|
|
|
1544
1536
|
return (
|
|
@@ -1556,7 +1548,7 @@ const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
|
1556
1548
|
Link.displayName = "Link";
|
|
1557
1549
|
```
|
|
1558
1550
|
|
|
1559
|
-
#### μλ
|
|
1551
|
+
#### μλ μ리
|
|
1560
1552
|
|
|
1561
1553
|
- **μΈλΆ λ§ν¬ κ°μ§**:
|
|
1562
1554
|
ν¬νΌ ν¨μ `checkIsExternalLink`λ URLμ΄ μΈλΆ λ§ν¬μΈμ§ μ¬λΆλ₯Ό νλ¨ν©λλ€. μΈλΆ λ§ν¬λ νμ§νκ° νμ μμΌλ―λ‘ λ³κ²½νμ§ μμ΅λλ€.
|
|
@@ -1565,12 +1557,12 @@ Link.displayName = "Link";
|
|
|
1565
1557
|
`useLocale` ν
μ νμ¬ λ‘μΌμΌ(μ: νλμ€μ΄μ κ²½μ° `fr`)μ μ 곡ν©λλ€.
|
|
1566
1558
|
|
|
1567
1559
|
- **URL νμ§ν**:
|
|
1568
|
-
λ΄λΆ λ§ν¬(μ¦, μΈλΆ λ§ν¬κ° μλ κ²½μ°)μ
|
|
1560
|
+
λ΄λΆ λ§ν¬(μ¦, μΈλΆ λ§ν¬κ° μλ κ²½μ°)μ λν΄ `getLocalizedUrl`μ μ¬μ©νμ¬ URL μμ νμ¬ λ‘μΌμΌμ μλμΌλ‘ λΆμ
λλ€. μλ₯Ό λ€μ΄ μ¬μ©μκ° νλμ€μ΄ λ‘μΌμΌμ μλ€λ©΄, `href`μ `/about`μ μ λ¬νλ©΄ `/fr/about`λ‘ λ³νλ©λλ€.
|
|
1569
1561
|
|
|
1570
1562
|
- **λ§ν¬ λ°ν**:
|
|
1571
1563
|
μ»΄ν¬λνΈλ μ§μνλ URLμ κ°μ§ `<a>` μμλ₯Ό λ°ννμ¬, λ΄λΉκ²μ΄μ
μ΄ νμ¬ λ‘μΌμΌκ³Ό μΌμΉνλλ‘ λ³΄μ₯ν©λλ€.
|
|
1572
1564
|
|
|
1573
|
-
μ΄ `Link` μ»΄ν¬λνΈλ₯Ό μ ν리μΌμ΄μ
μ λ°μ
|
|
1565
|
+
μ΄ `Link` μ»΄ν¬λνΈλ₯Ό μ ν리μΌμ΄μ
μ λ°μ ν΅ν©ν¨μΌλ‘μ¨, μΌκ΄λκ³ μΈμ΄ μΈμμ΄ κ°λ₯ν μ¬μ©μ κ²½νμ μ μ§ν μ μμΌλ©°, SEO λ° μ¬μ©μ± ν₯μμλ λμμ΄ λ©λλ€.
|
|
1574
1566
|
|
|
1575
1567
|
### TypeScript ꡬμ±
|
|
1576
1568
|
|
|
@@ -1586,39 +1578,15 @@ TypeScript ꡬμ±μ μλ μμ±λ νμ
μ΄ ν¬ν¨λμ΄ μλμ§ νμΈν
|
|
|
1586
1578
|
{
|
|
1587
1579
|
// ... κΈ°μ‘΄ TypeScript ꡬμ±
|
|
1588
1580
|
"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 ꡬμ±
|
|
1581
|
+
// ... κΈ°μ‘΄ TypeScript μ€μ
|
|
1614
1582
|
".intlayer/**/*.ts", // μλ μμ±λ νμ
ν¬ν¨
|
|
1615
1583
|
],
|
|
1616
1584
|
}
|
|
1617
1585
|
```
|
|
1618
1586
|
|
|
1619
|
-
### Git
|
|
1587
|
+
### Git μ€μ
|
|
1620
1588
|
|
|
1621
|
-
Intlayerκ° μμ±ν
|
|
1589
|
+
Intlayerκ° μμ±ν νμΌλ€μ Git μ μ₯μμ 컀λ°νμ§ μλλ‘ λ¬΄μνλ κ²μ΄ κΆμ₯λ©λλ€.
|
|
1622
1590
|
|
|
1623
1591
|
μ΄λ₯Ό μν΄ `.gitignore` νμΌμ λ€μ μ§μΉ¨μ μΆκ°ν μ μμ΅λλ€:
|
|
1624
1592
|
|
|
@@ -1627,18 +1595,18 @@ Intlayerκ° μμ±ν νμΌμ Git μ μ₯μμ 컀λ°νμ§ μλλ‘ λ¬΄μ
|
|
|
1627
1595
|
.intlayer
|
|
1628
1596
|
```
|
|
1629
1597
|
|
|
1630
|
-
### VS Code νμ₯
|
|
1598
|
+
### VS Code νμ₯ νλ‘κ·Έλ¨
|
|
1631
1599
|
|
|
1632
|
-
Intlayerμ ν¨κ» κ°λ° κ²½νμ ν₯μμν€κΈ° μν΄ κ³΅μ **Intlayer VS Code
|
|
1600
|
+
Intlayerμ ν¨κ» κ°λ° κ²½νμ ν₯μμν€κΈ° μν΄ κ³΅μ **Intlayer VS Code νμ₯ νλ‘κ·Έλ¨**μ μ€μΉν μ μμ΅λλ€.
|
|
1633
1601
|
|
|
1634
1602
|
[VS Code λ§μΌνλ μ΄μ€μμ μ€μΉνκΈ°](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
1635
1603
|
|
|
1636
|
-
μ΄
|
|
1604
|
+
μ΄ νμ₯ νλ‘κ·Έλ¨μ λ€μ κΈ°λ₯μ μ 곡ν©λλ€:
|
|
1637
1605
|
|
|
1638
1606
|
- λ²μ ν€μ λν **μλ μμ±**.
|
|
1639
|
-
-
|
|
1640
|
-
-
|
|
1641
|
-
-
|
|
1607
|
+
- **μ€μκ° μ€λ₯ κ°μ§**λ‘ λλ½λ λ²μμ νμΈν μ μμ΅λλ€.
|
|
1608
|
+
- **μΈλΌμΈ 미리보기**λ₯Ό ν΅ν΄ λ²μλ λ΄μ©μ λ°λ‘ νμΈν μ μμ΅λλ€.
|
|
1609
|
+
- **λΉ λ₯Έ μμ
**μΌλ‘ λ²μμ μ½κ² μμ±νκ³ μ
λ°μ΄νΈν μ μμ΅λλ€.
|
|
1642
1610
|
|
|
1643
1611
|
νμ₯ κΈ°λ₯ μ¬μ© λ°©λ²μ λν μμΈν λ΄μ©μ [Intlayer VS Code νμ₯ λ¬Έμ](https://intlayer.org/doc/vs-code-extension)λ₯Ό μ°Έμ‘°νμΈμ.
|
|
1644
1612
|
|