@intlayer/docs 6.1.5 → 6.1.6
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/next-i18next_vs_next-intl_vs_intlayer.md +404 -173
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +262 -113
- package/blog/en/intlayer_with_next-i18next.mdx +431 -0
- package/blog/en/intlayer_with_next-intl.mdx +335 -0
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +463 -209
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +185 -71
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +36 -28
- package/blog/tr/next-i18next_vs_next-intl_vs_intlayer.md +2 -0
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +38 -28
- package/dist/cjs/generated/docs.entry.cjs +32 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +32 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +2 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/component_i18n.md +186 -0
- package/docs/ar/intlayer_with_angular.md +2 -2
- package/docs/ar/intlayer_with_astro.md +246 -0
- package/docs/ar/intlayer_with_create_react_app.md +3 -2
- package/docs/ar/intlayer_with_express.md +2 -2
- package/docs/ar/intlayer_with_nestjs.md +2 -2
- package/docs/ar/intlayer_with_nextjs_14.md +2 -2
- package/docs/ar/intlayer_with_nextjs_15.md +2 -2
- package/docs/ar/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ar/intlayer_with_nuxt.md +2 -2
- package/docs/ar/intlayer_with_react_native+expo.md +11 -20
- package/docs/ar/intlayer_with_react_router_v7.md +195 -241
- package/docs/ar/intlayer_with_tanstack.md +198 -272
- package/docs/ar/intlayer_with_vite+preact.md +9 -9
- package/docs/ar/intlayer_with_vite+react.md +7 -7
- package/docs/ar/intlayer_with_vite+vue.md +9 -9
- package/docs/ar/vs_code_extension.md +48 -109
- package/docs/de/component_i18n.md +186 -0
- package/docs/de/intlayer_with_angular.md +2 -2
- package/docs/de/intlayer_with_astro.md +246 -0
- package/docs/de/intlayer_with_create_react_app.md +2 -2
- package/docs/de/intlayer_with_express.md +2 -2
- package/docs/de/intlayer_with_nestjs.md +2 -2
- package/docs/de/intlayer_with_nextjs_14.md +2 -2
- package/docs/de/intlayer_with_nextjs_15.md +2 -2
- package/docs/de/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/de/intlayer_with_nuxt.md +2 -2
- package/docs/de/intlayer_with_react_native+expo.md +11 -20
- package/docs/de/intlayer_with_react_router_v7.md +193 -242
- package/docs/de/intlayer_with_tanstack.md +194 -266
- package/docs/de/intlayer_with_vite+preact.md +9 -9
- package/docs/de/intlayer_with_vite+react.md +9 -9
- package/docs/de/intlayer_with_vite+vue.md +11 -11
- package/docs/de/packages/vite-intlayer/index.md +3 -3
- package/docs/de/vs_code_extension.md +46 -107
- package/docs/en/component_i18n.md +186 -0
- package/docs/en/how_works_intlayer.md +1 -1
- package/docs/en/index.md +1 -1
- package/docs/en/intlayer_cli.md +1 -1
- package/docs/en/intlayer_with_angular.md +4 -4
- package/docs/en/intlayer_with_astro.md +246 -0
- package/docs/en/intlayer_with_create_react_app.md +4 -4
- package/docs/en/intlayer_with_express.md +3 -3
- package/docs/en/intlayer_with_lynx+react.md +1 -1
- package/docs/en/intlayer_with_nestjs.md +2 -2
- package/docs/en/intlayer_with_nextjs_14.md +31 -5
- package/docs/en/intlayer_with_nextjs_15.md +31 -5
- package/docs/en/intlayer_with_nextjs_page_router.md +5 -5
- package/docs/en/intlayer_with_nuxt.md +4 -4
- package/docs/en/intlayer_with_react_native+expo.md +46 -24
- package/docs/en/intlayer_with_react_router_v7.md +164 -211
- package/docs/en/intlayer_with_tanstack.md +166 -241
- package/docs/en/intlayer_with_vite+preact.md +12 -12
- package/docs/en/intlayer_with_vite+react.md +12 -12
- package/docs/en/intlayer_with_vite+solid.md +2 -2
- package/docs/en/intlayer_with_vite+svelte.md +2 -2
- package/docs/en/intlayer_with_vite+vue.md +12 -12
- package/docs/en/introduction.md +1 -1
- package/docs/en/packages/next-intlayer/useDictionary.md +1 -1
- package/docs/en/packages/next-intlayer/useIntlayer.md +1 -1
- package/docs/en/packages/react-intlayer/useDictionary.md +1 -1
- package/docs/en/packages/react-intlayer/useI18n.md +1 -1
- package/docs/en/packages/react-intlayer/useIntlayer.md +1 -1
- package/docs/en/releases/v6.md +1 -0
- package/docs/en/roadmap.md +1 -1
- package/docs/en/vs_code_extension.md +24 -114
- package/docs/en-GB/component_i18n.md +186 -0
- package/docs/en-GB/intlayer_with_angular.md +3 -3
- package/docs/en-GB/intlayer_with_astro.md +246 -0
- package/docs/en-GB/intlayer_with_create_react_app.md +5 -4
- package/docs/en-GB/intlayer_with_express.md +2 -2
- package/docs/en-GB/intlayer_with_nestjs.md +2 -2
- package/docs/en-GB/intlayer_with_nextjs_14.md +4 -4
- package/docs/en-GB/intlayer_with_nextjs_15.md +2 -2
- package/docs/en-GB/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/en-GB/intlayer_with_nuxt.md +2 -2
- package/docs/en-GB/intlayer_with_react_native+expo.md +11 -20
- package/docs/en-GB/intlayer_with_react_router_v7.md +171 -220
- package/docs/en-GB/intlayer_with_tanstack.md +174 -248
- package/docs/en-GB/intlayer_with_vite+preact.md +9 -9
- package/docs/en-GB/intlayer_with_vite+react.md +9 -9
- package/docs/en-GB/intlayer_with_vite+vue.md +11 -11
- package/docs/en-GB/packages/next-intlayer/useIntlayer.md +1 -1
- package/docs/en-GB/packages/react-intlayer/useIntlayer.md +1 -1
- package/docs/en-GB/vs_code_extension.md +42 -103
- package/docs/es/component_i18n.md +182 -0
- package/docs/es/intlayer_with_angular.md +2 -2
- package/docs/es/intlayer_with_astro.md +246 -0
- package/docs/es/intlayer_with_create_react_app.md +3 -2
- package/docs/es/intlayer_with_express.md +2 -2
- package/docs/es/intlayer_with_nextjs_14.md +2 -2
- package/docs/es/intlayer_with_nextjs_15.md +2 -2
- package/docs/es/intlayer_with_react_native+expo.md +11 -20
- package/docs/es/intlayer_with_react_router_v7.md +188 -232
- package/docs/es/intlayer_with_tanstack.md +203 -273
- package/docs/es/intlayer_with_vite+preact.md +7 -7
- package/docs/es/intlayer_with_vite+react.md +7 -7
- package/docs/es/intlayer_with_vite+vue.md +9 -9
- package/docs/es/vs_code_extension.md +53 -114
- package/docs/fr/component_i18n.md +186 -0
- package/docs/fr/intlayer_with_angular.md +2 -2
- package/docs/fr/intlayer_with_astro.md +246 -0
- package/docs/fr/intlayer_with_create_react_app.md +3 -2
- package/docs/fr/intlayer_with_express.md +2 -2
- package/docs/fr/intlayer_with_nestjs.md +2 -2
- package/docs/fr/intlayer_with_nextjs_14.md +2 -2
- package/docs/fr/intlayer_with_react_native+expo.md +11 -20
- package/docs/fr/intlayer_with_react_router_v7.md +188 -248
- package/docs/fr/intlayer_with_tanstack.md +192 -265
- package/docs/fr/intlayer_with_vite+preact.md +7 -7
- package/docs/fr/intlayer_with_vite+react.md +7 -7
- package/docs/fr/intlayer_with_vite+vue.md +9 -9
- package/docs/fr/vs_code_extension.md +50 -111
- package/docs/hi/component_i18n.md +186 -0
- package/docs/hi/intlayer_cli.md +1 -4
- package/docs/hi/intlayer_with_angular.md +2 -2
- package/docs/hi/intlayer_with_astro.md +246 -0
- package/docs/hi/intlayer_with_create_react_app.md +2 -2
- package/docs/hi/intlayer_with_express.md +2 -2
- package/docs/hi/intlayer_with_nestjs.md +2 -2
- package/docs/hi/intlayer_with_nextjs_14.md +2 -2
- package/docs/hi/intlayer_with_nextjs_15.md +2 -2
- package/docs/hi/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/hi/intlayer_with_nuxt.md +2 -2
- package/docs/hi/intlayer_with_react_native+expo.md +11 -20
- package/docs/hi/intlayer_with_react_router_v7.md +199 -243
- package/docs/hi/intlayer_with_tanstack.md +210 -285
- package/docs/hi/intlayer_with_vite+preact.md +9 -9
- package/docs/hi/intlayer_with_vite+react.md +9 -9
- package/docs/hi/intlayer_with_vite+solid.md +1 -1
- package/docs/hi/intlayer_with_vite+vue.md +11 -11
- package/docs/hi/vs_code_extension.md +49 -110
- package/docs/it/component_i18n.md +186 -0
- package/docs/it/intlayer_with_angular.md +2 -2
- package/docs/it/intlayer_with_astro.md +246 -0
- package/docs/it/intlayer_with_create_react_app.md +3 -2
- package/docs/it/intlayer_with_express.md +2 -2
- package/docs/it/intlayer_with_nestjs.md +2 -2
- package/docs/it/intlayer_with_nextjs_14.md +2 -2
- package/docs/it/intlayer_with_nextjs_15.md +2 -2
- package/docs/it/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/it/intlayer_with_nuxt.md +2 -2
- package/docs/it/intlayer_with_react_native+expo.md +11 -21
- package/docs/it/intlayer_with_react_router_v7.md +195 -242
- package/docs/it/intlayer_with_tanstack.md +203 -267
- package/docs/it/intlayer_with_vite+preact.md +9 -9
- package/docs/it/intlayer_with_vite+react.md +13 -11
- package/docs/it/intlayer_with_vite+vue.md +11 -11
- package/docs/it/vs_code_extension.md +50 -111
- package/docs/ja/component_i18n.md +186 -0
- package/docs/ja/intlayer_with_angular.md +2 -2
- package/docs/ja/intlayer_with_astro.md +246 -0
- package/docs/ja/intlayer_with_create_react_app.md +3 -2
- package/docs/ja/intlayer_with_express.md +2 -2
- package/docs/ja/intlayer_with_nestjs.md +2 -2
- package/docs/ja/intlayer_with_nextjs_14.md +2 -2
- package/docs/ja/intlayer_with_nextjs_15.md +2 -2
- package/docs/ja/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ja/intlayer_with_nuxt.md +2 -2
- package/docs/ja/intlayer_with_react_native+expo.md +18 -29
- package/docs/ja/intlayer_with_react_router_v7.md +204 -250
- package/docs/ja/intlayer_with_tanstack.md +218 -286
- package/docs/ja/intlayer_with_vite+preact.md +9 -9
- package/docs/ja/intlayer_with_vite+react.md +11 -11
- package/docs/ja/intlayer_with_vite+vue.md +11 -11
- package/docs/ja/vs_code_extension.md +50 -111
- package/docs/ko/component_i18n.md +186 -0
- package/docs/ko/intlayer_with_angular.md +2 -2
- package/docs/ko/intlayer_with_astro.md +246 -0
- package/docs/ko/intlayer_with_create_react_app.md +3 -2
- package/docs/ko/intlayer_with_express.md +2 -2
- package/docs/ko/intlayer_with_nestjs.md +2 -2
- package/docs/ko/intlayer_with_nextjs_14.md +2 -2
- package/docs/ko/intlayer_with_nextjs_15.md +2 -2
- package/docs/ko/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ko/intlayer_with_nuxt.md +2 -2
- package/docs/ko/intlayer_with_react_native+expo.md +19 -28
- package/docs/ko/intlayer_with_react_router_v7.md +190 -244
- package/docs/ko/intlayer_with_tanstack.md +200 -270
- package/docs/ko/intlayer_with_vite+preact.md +9 -9
- package/docs/ko/intlayer_with_vite+react.md +9 -9
- package/docs/ko/intlayer_with_vite+vue.md +11 -11
- package/docs/ko/vs_code_extension.md +48 -109
- package/docs/pt/component_i18n.md +186 -0
- package/docs/pt/intlayer_with_angular.md +2 -2
- package/docs/pt/intlayer_with_astro.md +246 -0
- package/docs/pt/intlayer_with_create_react_app.md +3 -2
- package/docs/pt/intlayer_with_express.md +2 -2
- package/docs/pt/intlayer_with_nestjs.md +2 -2
- package/docs/pt/intlayer_with_nextjs_14.md +2 -2
- package/docs/pt/intlayer_with_nextjs_15.md +2 -2
- package/docs/pt/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/pt/intlayer_with_nuxt.md +2 -2
- package/docs/pt/intlayer_with_react_native+expo.md +11 -20
- package/docs/pt/intlayer_with_react_router_v7.md +7 -13
- package/docs/pt/intlayer_with_tanstack.md +183 -258
- package/docs/pt/intlayer_with_vite+preact.md +9 -9
- package/docs/pt/intlayer_with_vite+react.md +9 -9
- package/docs/pt/intlayer_with_vite+vue.md +9 -9
- package/docs/pt/vs_code_extension.md +46 -107
- package/docs/ru/component_i18n.md +186 -0
- package/docs/ru/intlayer_with_angular.md +2 -2
- package/docs/ru/intlayer_with_astro.md +246 -0
- package/docs/ru/intlayer_with_create_react_app.md +3 -2
- package/docs/ru/intlayer_with_express.md +2 -2
- package/docs/ru/intlayer_with_nestjs.md +2 -2
- package/docs/ru/intlayer_with_nextjs_14.md +2 -2
- package/docs/ru/intlayer_with_nextjs_15.md +2 -2
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +2 -2
- package/docs/ru/intlayer_with_react_native+expo.md +11 -20
- package/docs/ru/intlayer_with_react_router_v7.md +192 -238
- package/docs/ru/intlayer_with_tanstack.md +197 -269
- package/docs/ru/intlayer_with_vite+preact.md +9 -9
- package/docs/ru/intlayer_with_vite+react.md +9 -9
- package/docs/ru/intlayer_with_vite+vue.md +11 -11
- package/docs/ru/vs_code_extension.md +48 -109
- package/docs/tr/component_i18n.md +186 -0
- package/docs/tr/how_works_intlayer.md +1 -1
- package/docs/tr/index.md +1 -1
- package/docs/tr/intlayer_cli.md +1 -1
- package/docs/tr/intlayer_with_angular.md +4 -4
- package/docs/tr/intlayer_with_astro.md +246 -0
- package/docs/tr/intlayer_with_create_react_app.md +4 -4
- package/docs/tr/intlayer_with_express.md +3 -3
- package/docs/tr/intlayer_with_lynx+react.md +1 -1
- package/docs/tr/intlayer_with_nestjs.md +2 -2
- package/docs/tr/intlayer_with_nextjs_14.md +2 -2
- package/docs/tr/intlayer_with_nextjs_15.md +4 -4
- package/docs/tr/intlayer_with_nextjs_page_router.md +5 -5
- package/docs/tr/intlayer_with_nuxt.md +4 -4
- package/docs/tr/intlayer_with_react_native+expo.md +12 -21
- package/docs/tr/intlayer_with_react_router_v7.md +222 -267
- package/docs/tr/intlayer_with_tanstack.md +400 -303
- package/docs/tr/intlayer_with_vite+preact.md +12 -12
- package/docs/tr/intlayer_with_vite+react.md +12 -12
- package/docs/tr/intlayer_with_vite+solid.md +2 -2
- package/docs/tr/intlayer_with_vite+svelte.md +2 -2
- package/docs/tr/intlayer_with_vite+vue.md +12 -12
- package/docs/tr/introduction.md +1 -1
- package/docs/tr/packages/react-intlayer/useDictionary.md +1 -1
- package/docs/tr/packages/react-intlayer/useI18n.md +1 -1
- package/docs/tr/roadmap.md +1 -1
- package/docs/tr/vs_code_extension.md +54 -115
- package/docs/zh/component_i18n.md +186 -0
- package/docs/zh/intlayer_with_angular.md +2 -2
- package/docs/zh/intlayer_with_astro.md +246 -0
- package/docs/zh/intlayer_with_create_react_app.md +3 -2
- package/docs/zh/intlayer_with_express.md +2 -2
- package/docs/zh/intlayer_with_nestjs.md +2 -2
- package/docs/zh/intlayer_with_nextjs_14.md +2 -2
- package/docs/zh/intlayer_with_nextjs_15.md +2 -2
- package/docs/zh/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/zh/intlayer_with_nuxt.md +2 -2
- package/docs/zh/intlayer_with_react_native+expo.md +19 -28
- package/docs/zh/intlayer_with_react_router_v7.md +200 -248
- package/docs/zh/intlayer_with_tanstack.md +208 -283
- package/docs/zh/intlayer_with_vite+preact.md +9 -9
- package/docs/zh/intlayer_with_vite+react.md +9 -9
- package/docs/zh/intlayer_with_vite+vue.md +9 -9
- package/docs/zh/vs_code_extension.md +51 -105
- package/package.json +10 -10
- package/src/generated/docs.entry.ts +32 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
createdAt: 2025-09-09
|
|
3
3
|
updatedAt: 2025-09-09
|
|
4
|
-
title: Tanstack Start에서 Intlayer로 시작하는 국제화
|
|
5
|
-
description: Intlayer를 사용하여 Tanstack Start 애플리케이션에 국제화(i18n)를 추가하는 방법을
|
|
4
|
+
title: Tanstack Start에서 Intlayer로 시작하는 국제화(i18n)
|
|
5
|
+
description: Intlayer를 사용하여 Tanstack Start 애플리케이션에 국제화(i18n)를 추가하는 방법을 배우세요. 로케일 인식 라우팅으로 앱을 다국어 지원으로 만드는 종합 가이드를 따르세요.
|
|
6
6
|
keywords:
|
|
7
7
|
- 국제화
|
|
8
8
|
- 문서
|
|
@@ -15,15 +15,13 @@ keywords:
|
|
|
15
15
|
slugs:
|
|
16
16
|
- doc
|
|
17
17
|
- environment
|
|
18
|
-
- vite-and-react
|
|
19
18
|
- tanstack-start
|
|
20
|
-
applicationTemplate: https://github.com/
|
|
21
|
-
author: AydinTheFirst
|
|
19
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
|
|
22
20
|
---
|
|
23
21
|
|
|
24
22
|
# Intlayer와 Tanstack Start로 시작하는 국제화(i18n)
|
|
25
23
|
|
|
26
|
-
이 가이드는
|
|
24
|
+
이 가이드는 로케일 인식 라우팅, TypeScript 지원 및 최신 개발 방식을 갖춘 Tanstack Start 프로젝트에서 **Intlayer**를 통합하여 원활한 국제화(i18n)를 구현하는 방법을 보여줍니다.
|
|
27
25
|
|
|
28
26
|
## Intlayer란 무엇인가요?
|
|
29
27
|
|
|
@@ -33,8 +31,8 @@ Intlayer를 사용하면 다음을 할 수 있습니다:
|
|
|
33
31
|
|
|
34
32
|
- **컴포넌트 수준에서 선언적 사전을 사용하여 번역을 쉽게 관리**할 수 있습니다.
|
|
35
33
|
- **메타데이터, 라우트 및 콘텐츠를 동적으로 현지화**할 수 있습니다.
|
|
36
|
-
- **자동 생성된 타입으로 TypeScript 지원을 보장**하여 자동 완성 및 오류 감지를
|
|
37
|
-
- **동적 로케일 감지 및 전환과 같은 고급
|
|
34
|
+
- **자동 생성된 타입으로 TypeScript 지원을 보장**하여 자동 완성 및 오류 감지를 향상시킵니다.
|
|
35
|
+
- **동적 로케일 감지 및 전환과 같은 고급 기능을 활용**할 수 있습니다.
|
|
38
36
|
- **Tanstack Start의 파일 기반 라우팅 시스템을 사용하여 로케일 인식 라우팅 활성화**.
|
|
39
37
|
|
|
40
38
|
---
|
|
@@ -73,7 +71,7 @@ pnpm add vite-intlayer --save-dev
|
|
|
73
71
|
|
|
74
72
|
애플리케이션의 언어를 구성하기 위한 설정 파일을 만드세요:
|
|
75
73
|
|
|
76
|
-
```typescript fileName="intlayer.config.ts"
|
|
74
|
+
```typescript fileName="intlayer.config.ts"
|
|
77
75
|
import type { IntlayerConfig } from "intlayer";
|
|
78
76
|
|
|
79
77
|
import { Locales } from "intlayer";
|
|
@@ -81,79 +79,31 @@ import { Locales } from "intlayer";
|
|
|
81
79
|
const config: IntlayerConfig = {
|
|
82
80
|
internationalization: {
|
|
83
81
|
defaultLocale: Locales.ENGLISH,
|
|
84
|
-
locales: [
|
|
85
|
-
Locales.ENGLISH,
|
|
86
|
-
Locales.FRENCH,
|
|
87
|
-
Locales.SPANISH,
|
|
88
|
-
// 다른 로케일들
|
|
89
|
-
],
|
|
82
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
90
83
|
},
|
|
91
84
|
};
|
|
92
85
|
|
|
93
86
|
export default config;
|
|
94
87
|
```
|
|
95
88
|
|
|
96
|
-
|
|
97
|
-
import { Locales } from "intlayer";
|
|
98
|
-
|
|
99
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
100
|
-
const config = {
|
|
101
|
-
internationalization: {
|
|
102
|
-
defaultLocale: Locales.ENGLISH,
|
|
103
|
-
locales: [
|
|
104
|
-
Locales.ENGLISH,
|
|
105
|
-
Locales.FRENCH,
|
|
106
|
-
Locales.SPANISH,
|
|
107
|
-
// 다른 로케일들
|
|
108
|
-
],
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
export default config;
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
|
|
116
|
-
const { Locales } = require("intlayer");
|
|
117
|
-
|
|
118
|
-
/** @type {import('intlayer').IntlayerConfig} */
|
|
119
|
-
const config = {
|
|
120
|
-
internationalization: {
|
|
121
|
-
defaultLocale: Locales.ENGLISH,
|
|
122
|
-
locales: [
|
|
123
|
-
Locales.ENGLISH,
|
|
124
|
-
Locales.FRENCH,
|
|
125
|
-
Locales.SPANISH,
|
|
126
|
-
// 다른 로케일들
|
|
127
|
-
],
|
|
128
|
-
},
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
module.exports = config;
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
> 이 구성 파일을 통해 지역화된 URL, 미들웨어 리디렉션, 쿠키 이름, 콘텐츠 선언의 위치 및 확장자 설정, 콘솔에서 Intlayer 로그 비활성화 등 다양한 설정을 할 수 있습니다. 사용 가능한 모든 매개변수 목록은 [구성 문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)를 참조하세요.
|
|
89
|
+
> 이 설정 파일을 통해 지역화된 URL, 미들웨어 리디렉션, 쿠키 이름, 콘텐츠 선언의 위치 및 확장자, 콘솔에서 Intlayer 로그 비활성화 등 다양한 설정을 할 수 있습니다. 사용 가능한 모든 매개변수 목록은 [설정 문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)를 참조하세요.
|
|
135
90
|
|
|
136
91
|
### 4단계: Vite 구성에 Intlayer 통합하기
|
|
137
92
|
|
|
138
|
-
intlayer 플러그인을
|
|
93
|
+
구성에 intlayer 플러그인을 추가하세요:
|
|
139
94
|
|
|
140
|
-
```typescript fileName="vite.config.ts"
|
|
95
|
+
```typescript fileName="vite.config.ts"
|
|
141
96
|
import { reactRouter } from "@react-router/dev/vite";
|
|
142
97
|
import { defineConfig } from "vite";
|
|
143
|
-
import {
|
|
98
|
+
import { intlayer } from "vite-intlayer";
|
|
144
99
|
import tsconfigPaths from "vite-tsconfig-paths";
|
|
145
100
|
|
|
146
101
|
export default defineConfig({
|
|
147
|
-
plugins: [
|
|
148
|
-
reactRouter(),
|
|
149
|
-
tsconfigPaths(),
|
|
150
|
-
intlayer(),
|
|
151
|
-
intlayerMiddlewarePlugin(),
|
|
152
|
-
],
|
|
102
|
+
plugins: [reactRouter(), tsconfigPaths(), intlayer()],
|
|
153
103
|
});
|
|
154
104
|
```
|
|
155
105
|
|
|
156
|
-
> `intlayer()` Vite 플러그인은 Intlayer를 Vite와 통합하는 데 사용됩니다. 이 플러그인은 콘텐츠 선언 파일을 빌드하고 개발 모드에서 이를 모니터링합니다. 또한 Vite 애플리케이션 내에서 Intlayer 환경 변수를
|
|
106
|
+
> `intlayer()` Vite 플러그인은 Intlayer를 Vite와 통합하는 데 사용됩니다. 이 플러그인은 콘텐츠 선언 파일을 빌드하고 개발 모드에서 이를 모니터링합니다. 또한 Vite 애플리케이션 내에서 Intlayer 환경 변수를 정의합니다. 추가로, 성능 최적화를 위한 별칭(alias)도 제공합니다.
|
|
157
107
|
|
|
158
108
|
### 5단계: 레이아웃 컴포넌트 생성
|
|
159
109
|
|
|
@@ -161,10 +111,8 @@ export default defineConfig({
|
|
|
161
111
|
|
|
162
112
|
#### 루트 레이아웃
|
|
163
113
|
|
|
164
|
-
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
165
|
-
// src/routes/{-$locale}/route.tsx
|
|
114
|
+
```tsx fileName="src/routes/{-$locale}/route.tsx"
|
|
166
115
|
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
167
|
-
import { configuration } from "intlayer";
|
|
168
116
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
169
117
|
|
|
170
118
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes";
|
|
@@ -174,21 +122,22 @@ export const Route = createFileRoute("/{-$locale}")({
|
|
|
174
122
|
});
|
|
175
123
|
|
|
176
124
|
function LayoutComponent() {
|
|
125
|
+
const { defaultLocale } = useLocale();
|
|
177
126
|
const { locale } = Route.useParams();
|
|
178
127
|
|
|
179
128
|
return (
|
|
180
|
-
<IntlayerProvider locale={
|
|
129
|
+
<IntlayerProvider locale={defaultLocale}>
|
|
181
130
|
<Outlet />
|
|
182
131
|
</IntlayerProvider>
|
|
183
132
|
);
|
|
184
133
|
}
|
|
185
134
|
```
|
|
186
135
|
|
|
187
|
-
### 6단계: 콘텐츠
|
|
136
|
+
### 6단계: 콘텐츠 선언
|
|
188
137
|
|
|
189
138
|
번역을 저장하기 위해 콘텐츠 선언을 생성하고 관리하세요:
|
|
190
139
|
|
|
191
|
-
```tsx fileName="src/contents/page.content.ts"
|
|
140
|
+
```tsx fileName="src/contents/page.content.ts"
|
|
192
141
|
import type { Dictionary } from "intlayer";
|
|
193
142
|
|
|
194
143
|
import { t } from "intlayer";
|
|
@@ -197,25 +146,29 @@ const appContent = {
|
|
|
197
146
|
content: {
|
|
198
147
|
links: {
|
|
199
148
|
about: t({
|
|
149
|
+
ko: "소개",
|
|
200
150
|
en: "About",
|
|
201
151
|
es: "Acerca de",
|
|
202
152
|
fr: "À propos",
|
|
203
153
|
}),
|
|
204
154
|
home: t({
|
|
205
|
-
|
|
155
|
+
ko: "홈",
|
|
156
|
+
en: "Home",
|
|
206
157
|
es: "Inicio",
|
|
207
158
|
fr: "Accueil",
|
|
208
159
|
}),
|
|
209
160
|
},
|
|
210
161
|
meta: {
|
|
211
162
|
description: t({
|
|
212
|
-
|
|
163
|
+
ko: "이것은 TanStack Router와 함께 Intlayer를 사용하는 예제입니다",
|
|
164
|
+
en: "This is an example of using Intlayer with TanStack Router",
|
|
213
165
|
es: "Este es un ejemplo de uso de Intlayer con TanStack Router",
|
|
214
166
|
fr: "Ceci est un exemple d'utilisation d'Intlayer avec TanStack Router",
|
|
215
167
|
}),
|
|
216
168
|
},
|
|
217
169
|
title: t({
|
|
218
|
-
|
|
170
|
+
ko: "Intlayer + TanStack Router에 오신 것을 환영합니다",
|
|
171
|
+
en: "Welcome to Intlayer + TanStack Router",
|
|
219
172
|
es: "Bienvenido a Intlayer + TanStack Router",
|
|
220
173
|
fr: "Bienvenue à Intlayer + TanStack Router",
|
|
221
174
|
}),
|
|
@@ -226,7 +179,7 @@ const appContent = {
|
|
|
226
179
|
export default appContent;
|
|
227
180
|
```
|
|
228
181
|
|
|
229
|
-
> 콘텐츠 선언은 애플리케이션 내
|
|
182
|
+
> 콘텐츠 선언은 애플리케이션 내 어디에서나 정의할 수 있으며, `contentDir` 디렉토리(기본값: `./app`)에 포함되면 자동으로 인식됩니다. 또한 콘텐츠 선언 파일 확장자(기본값: `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`)와 일치해야 합니다.
|
|
230
183
|
|
|
231
184
|
> 자세한 내용은 [콘텐츠 선언 문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/dictionary/get_started.md)를 참조하세요.
|
|
232
185
|
|
|
@@ -234,59 +187,99 @@ export default appContent;
|
|
|
234
187
|
|
|
235
188
|
로케일 인식 내비게이션을 위한 `LocalizedLink` 컴포넌트를 생성합니다:
|
|
236
189
|
|
|
237
|
-
```tsx fileName="src/components/localized-link.tsx"
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
import { Link, type
|
|
241
|
-
import { getLocalizedUrl } from "intlayer";
|
|
190
|
+
```tsx fileName="src/components/localized-link.tsx"
|
|
191
|
+
import type { FC } from "react";
|
|
192
|
+
|
|
193
|
+
import { Link, type LinkComponentProps } from "@tanstack/react-router";
|
|
242
194
|
import { useLocale } from "react-intlayer";
|
|
243
195
|
|
|
196
|
+
export const LOCALE_ROUTE = "{-$locale}" as const;
|
|
197
|
+
|
|
198
|
+
// 주요 유틸리티
|
|
199
|
+
export type RemoveLocaleParam<T> = T extends string
|
|
200
|
+
? RemoveLocaleFromString<T>
|
|
201
|
+
: T;
|
|
202
|
+
|
|
203
|
+
export type To = RemoveLocaleParam<LinkComponentProps["to"]>;
|
|
204
|
+
|
|
205
|
+
type CollapseDoubleSlashes<S extends string> =
|
|
206
|
+
S extends `${infer H}//${infer T}` ? CollapseDoubleSlashes<`${H}/${T}`> : S;
|
|
207
|
+
|
|
244
208
|
type LocalizedLinkProps = {
|
|
245
|
-
to
|
|
246
|
-
} & Omit<
|
|
209
|
+
to?: To;
|
|
210
|
+
} & Omit<LinkComponentProps, "to">;
|
|
247
211
|
|
|
248
|
-
|
|
249
|
-
|
|
212
|
+
// 헬퍼 함수들
|
|
213
|
+
type RemoveAll<
|
|
214
|
+
S extends string,
|
|
215
|
+
Sub extends string,
|
|
216
|
+
> = S extends `${infer H}${Sub}${infer T}` ? RemoveAll<`${H}${T}`, Sub> : S;
|
|
250
217
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
218
|
+
type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
|
|
219
|
+
RemoveAll<S, typeof LOCALE_ROUTE>
|
|
220
|
+
>;
|
|
254
221
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
: getLocalizedUrl(props.to, locale);
|
|
222
|
+
export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
|
|
223
|
+
const { locale } = useLocale();
|
|
258
224
|
|
|
259
|
-
return
|
|
260
|
-
|
|
225
|
+
return (
|
|
226
|
+
<Link
|
|
227
|
+
{...props}
|
|
228
|
+
params={{
|
|
229
|
+
locale,
|
|
230
|
+
...(typeof props?.params === "object" ? props?.params : {}),
|
|
231
|
+
}}
|
|
232
|
+
to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
|
|
233
|
+
/>
|
|
234
|
+
);
|
|
235
|
+
};
|
|
261
236
|
```
|
|
262
237
|
|
|
263
|
-
|
|
238
|
+
이 컴포넌트는 두 가지 목적을 가지고 있습니다:
|
|
264
239
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
// eslint-disable-next-line no-restricted-imports
|
|
268
|
-
import { NavigateOptions, useNavigate } from "@tanstack/react-router";
|
|
269
|
-
import { getLocalizedUrl } from "intlayer";
|
|
270
|
-
import { useLocale } from "react-intlayer";
|
|
240
|
+
- URL에서 불필요한 `{-$locale}` 접두사를 제거합니다.
|
|
241
|
+
- URL에 locale 매개변수를 주입하여 사용자가 로컬라이즈된 경로로 직접 리디렉션되도록 보장합니다.
|
|
271
242
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
243
|
+
그 다음, 프로그래밍 방식의 내비게이션을 위해 `useLocalizedNavigate` 훅을 생성할 수 있습니다:
|
|
244
|
+
|
|
245
|
+
```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
|
|
246
|
+
import { useLocale } from "react-intlayer";
|
|
247
|
+
import { useNavigate } from "@tanstack/react-router";
|
|
248
|
+
import { LOCALE_ROUTE } from "@/components/localized-link";
|
|
249
|
+
import type { FileRouteTypes } from "@/routeTree.gen";
|
|
275
250
|
|
|
276
251
|
export const useLocalizedNavigate = () => {
|
|
277
252
|
const navigate = useNavigate();
|
|
253
|
+
|
|
278
254
|
const { locale } = useLocale();
|
|
279
255
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
256
|
+
type StripLocalePrefix<T extends string> = T extends
|
|
257
|
+
| `/${typeof LOCALE_ROUTE}`
|
|
258
|
+
| `/${typeof LOCALE_ROUTE}/`
|
|
259
|
+
? "/"
|
|
260
|
+
: T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
|
|
261
|
+
? `/${Rest}`
|
|
262
|
+
: never;
|
|
263
|
+
|
|
264
|
+
type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
|
|
265
|
+
|
|
266
|
+
interface LocalizedNavigate {
|
|
267
|
+
(to: LocalizedTo): ReturnType<typeof navigate>;
|
|
268
|
+
(
|
|
269
|
+
opts: { to: LocalizedTo } & Record<string, unknown>
|
|
270
|
+
): ReturnType<typeof navigate>;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const localizedNavigate: LocalizedNavigate = (args: any) => {
|
|
274
|
+
if (typeof args === "string") {
|
|
275
|
+
return navigate({ to: `/${LOCALE_ROUTE}${args}`, params: { locale } });
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
const { to, ...rest } = args;
|
|
283
279
|
|
|
284
|
-
|
|
285
|
-
const to = isExternal(options.to)
|
|
286
|
-
? options.to
|
|
287
|
-
: getLocalizedUrl(options.to, locale);
|
|
280
|
+
const localedTo = `/${LOCALE_ROUTE}${to}` as any;
|
|
288
281
|
|
|
289
|
-
navigate({
|
|
282
|
+
return navigate({ to: localedTo, params: { locale, ...rest } as any });
|
|
290
283
|
};
|
|
291
284
|
|
|
292
285
|
return localizedNavigate;
|
|
@@ -295,25 +288,11 @@ export const useLocalizedNavigate = () => {
|
|
|
295
288
|
|
|
296
289
|
### 8단계: 페이지에서 Intlayer 사용하기
|
|
297
290
|
|
|
298
|
-
애플리케이션 전반에서 콘텐츠 사전을
|
|
291
|
+
애플리케이션 전반에서 콘텐츠 사전을 액세스하세요:
|
|
299
292
|
|
|
300
|
-
####
|
|
301
|
-
|
|
302
|
-
```tsx fileName="src/routes/page.tsx" codeFormat="typescript"
|
|
303
|
-
// src/routes/page.tsx
|
|
304
|
-
import { useLocale } from "intlayer";
|
|
305
|
-
import { Navigate } from "react-router";
|
|
306
|
-
|
|
307
|
-
export default function Page() {
|
|
308
|
-
const { locale } = useLocale();
|
|
293
|
+
#### 현지화된 홈 페이지
|
|
309
294
|
|
|
310
|
-
|
|
311
|
-
}
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
#### 지역화된 홈 페이지
|
|
315
|
-
|
|
316
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx" codeFormat="typescript"
|
|
295
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
317
296
|
import { createFileRoute } from "@tanstack/react-router";
|
|
318
297
|
import { getIntlayer } from "intlayer";
|
|
319
298
|
import { useIntlayer } from "react-intlayer";
|
|
@@ -342,16 +321,15 @@ function RouteComponent() {
|
|
|
342
321
|
const navigate = useLocalizedNavigate();
|
|
343
322
|
|
|
344
323
|
return (
|
|
345
|
-
<div
|
|
346
|
-
<div
|
|
324
|
+
<div>
|
|
325
|
+
<div>
|
|
347
326
|
{content.title}
|
|
348
327
|
<LocaleSwitcher />
|
|
349
|
-
<div
|
|
350
|
-
<a href="/">인덱스</a>
|
|
328
|
+
<div>
|
|
351
329
|
<LocalizedLink to="/">{content.links.home}</LocalizedLink>
|
|
352
330
|
<LocalizedLink to="/about">{content.links.about}</LocalizedLink>
|
|
353
331
|
</div>
|
|
354
|
-
<div
|
|
332
|
+
<div>
|
|
355
333
|
<button onClick={() => navigate({ to: "/" })}>
|
|
356
334
|
{content.links.home}
|
|
357
335
|
</button>
|
|
@@ -365,63 +343,71 @@ function RouteComponent() {
|
|
|
365
343
|
}
|
|
366
344
|
```
|
|
367
345
|
|
|
368
|
-
> `useIntlayer` 훅에 대해 더 알아보려면 [문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useIntlayer.md)를
|
|
346
|
+
> `useIntlayer` 훅에 대해 더 알아보려면 [문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useIntlayer.md)를 참고하세요.
|
|
369
347
|
|
|
370
348
|
### 9단계: 로케일 스위처 컴포넌트 만들기
|
|
371
349
|
|
|
372
350
|
사용자가 언어를 변경할 수 있도록 컴포넌트를 만듭니다:
|
|
373
351
|
|
|
374
|
-
```tsx fileName="src/components/locale-switcher.tsx"
|
|
352
|
+
```tsx fileName="src/components/locale-switcher.tsx"
|
|
353
|
+
import type { FC } from "react";
|
|
354
|
+
|
|
375
355
|
import { useLocation } from "@tanstack/react-router";
|
|
376
|
-
import {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
const {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
const { availableLocales, locale, setLocale } = useLocale({
|
|
389
|
-
onLocaleChange: (newLocale) => {
|
|
390
|
-
const pathWithLocale = getLocalizedUrl(pathname + searchStr, newLocale);
|
|
391
|
-
location.replace(pathWithLocale); // 새로운 로케일 경로로 페이지를 대체합니다.
|
|
392
|
-
},
|
|
393
|
-
});
|
|
356
|
+
import { getHTMLTextDir, getLocaleName, getPathWithoutLocale } from "intlayer";
|
|
357
|
+
import { setLocaleCookie, useIntlayer, useLocale } from "react-intlayer";
|
|
358
|
+
|
|
359
|
+
import { LocalizedLink, To } from "./localized-link";
|
|
360
|
+
|
|
361
|
+
export const LocaleSwitcher: FC = () => {
|
|
362
|
+
const { localeSwitcherLabel } = useIntlayer("locale-switcher");
|
|
363
|
+
const { pathname } = useLocation();
|
|
364
|
+
|
|
365
|
+
const { availableLocales, locale } = useLocale();
|
|
366
|
+
|
|
367
|
+
const pathWithoutLocale = getPathWithoutLocale(pathname);
|
|
394
368
|
|
|
395
369
|
return (
|
|
396
|
-
<
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
370
|
+
<ol>
|
|
371
|
+
{availableLocales.map((localeEl) => (
|
|
372
|
+
<li key={localeEl}>
|
|
373
|
+
<LocalizedLink
|
|
374
|
+
aria-current={localeEl === locale ? "page" : undefined}
|
|
375
|
+
aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeEl)}`}
|
|
376
|
+
onClick={() => setLocaleCookie(localeEl)}
|
|
377
|
+
params={{ locale: localeEl }}
|
|
378
|
+
to={pathWithoutLocale as To}
|
|
379
|
+
>
|
|
380
|
+
<span>
|
|
381
|
+
{/* 로케일 - 예: FR */}
|
|
382
|
+
{localeItem}
|
|
383
|
+
</span>
|
|
384
|
+
<span>
|
|
385
|
+
{/* 해당 로케일 내 언어 - 예: Français */}
|
|
386
|
+
{getLocaleName(localeItem, locale)}
|
|
387
|
+
</span>
|
|
388
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
389
|
+
{/* 현재 로케일 내 언어 - 예: 현재 로케일이 Locales.SPANISH일 때 Francés */}
|
|
390
|
+
{getLocaleName(localeItem)}
|
|
391
|
+
</span>
|
|
392
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
393
|
+
{/* 영어로 된 언어 - 예: French */}
|
|
394
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
395
|
+
</span>
|
|
396
|
+
</LocalizedLink>
|
|
397
|
+
</li>
|
|
412
398
|
))}
|
|
413
|
-
</
|
|
399
|
+
</ol>
|
|
414
400
|
);
|
|
415
|
-
}
|
|
401
|
+
};
|
|
416
402
|
```
|
|
417
403
|
|
|
418
404
|
> `useLocale` 훅에 대해 더 알아보려면 [문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useLocale.md)를 참조하세요.
|
|
419
405
|
|
|
420
406
|
### 10단계: HTML 속성 관리 추가 (선택 사항)
|
|
421
407
|
|
|
422
|
-
HTML lang 및 dir 속성을 관리하는 훅을 만듭니다:
|
|
408
|
+
HTML의 lang 및 dir 속성을 관리하는 훅을 만듭니다:
|
|
423
409
|
|
|
424
|
-
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
410
|
+
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx"
|
|
425
411
|
// src/hooks/useI18nHTMLAttributes.tsx
|
|
426
412
|
import { getHTMLTextDir } from "intlayer";
|
|
427
413
|
import { useEffect } from "react";
|
|
@@ -439,9 +425,8 @@ export const useI18nHTMLAttributes = () => {
|
|
|
439
425
|
|
|
440
426
|
그런 다음 루트 컴포넌트에서 사용하세요:
|
|
441
427
|
|
|
442
|
-
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
428
|
+
```tsx fileName="src/routes/{-$locale}/index.tsx"
|
|
443
429
|
import { createFileRoute, Navigate, Outlet } from "@tanstack/react-router";
|
|
444
|
-
import { configuration } from "intlayer";
|
|
445
430
|
import { IntlayerProvider, useLocale } from "react-intlayer";
|
|
446
431
|
|
|
447
432
|
import { useI18nHTMLAttributes } from "@/hooks/useI18nHTMLAttributes"; // 훅을 임포트합니다.
|
|
@@ -451,57 +436,56 @@ export const Route = createFileRoute("/{-$locale}")({
|
|
|
451
436
|
});
|
|
452
437
|
|
|
453
438
|
function LayoutComponent() {
|
|
454
|
-
useI18nHTMLAttributes(); // 이 줄을
|
|
439
|
+
useI18nHTMLAttributes(); // 이 줄을 추가합니다.
|
|
455
440
|
|
|
441
|
+
const { defaultLocale } = useLocale();
|
|
456
442
|
const { locale } = Route.useParams();
|
|
457
443
|
|
|
458
444
|
return (
|
|
459
|
-
<IntlayerProvider locale={locale}>
|
|
445
|
+
<IntlayerProvider locale={locale ?? defaultLocale}>
|
|
460
446
|
<Outlet />
|
|
461
447
|
</IntlayerProvider>
|
|
462
448
|
);
|
|
463
449
|
}
|
|
464
450
|
```
|
|
465
451
|
|
|
466
|
-
|
|
452
|
+
---
|
|
467
453
|
|
|
468
|
-
|
|
454
|
+
### 11단계: 미들웨어 추가 (선택 사항)
|
|
469
455
|
|
|
470
|
-
|
|
471
|
-
# Intlayer 사전 빌드
|
|
472
|
-
npm run intlayer:build
|
|
456
|
+
`intlayerMiddleware`를 사용하여 애플리케이션에 서버 사이드 라우팅을 추가할 수도 있습니다. 이 플러그인은 URL을 기반으로 현재 로케일을 자동으로 감지하고 적절한 로케일 쿠키를 설정합니다. 로케일이 지정되지 않은 경우, 플러그인은 사용자의 브라우저 언어 설정을 기반으로 가장 적합한 로케일을 결정합니다. 로케일이 감지되지 않으면 기본 로케일로 리디렉션합니다.
|
|
473
457
|
|
|
474
|
-
|
|
475
|
-
npm run dev
|
|
476
|
-
```
|
|
458
|
+
> `intlayerMiddleware`를 프로덕션 환경에서 사용하려면 `vite-intlayer` 패키지를 `devDependencies`에서 `dependencies`로 변경해야 한다는 점에 유의하세요.
|
|
477
459
|
|
|
478
|
-
```
|
|
479
|
-
|
|
480
|
-
|
|
460
|
+
```typescript {3,7} fileName="vite.config.ts"
|
|
461
|
+
import { reactRouter } from "@react-router/dev/vite";
|
|
462
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
463
|
+
import { defineConfig } from "vite";
|
|
464
|
+
import { intlayer, intlayerMiddleware } from "vite-intlayer";
|
|
465
|
+
import tsconfigPaths from "vite-tsconfig-paths";
|
|
481
466
|
|
|
482
|
-
|
|
483
|
-
|
|
467
|
+
export default defineConfig({
|
|
468
|
+
plugins: [
|
|
469
|
+
tailwindcss(),
|
|
470
|
+
reactRouter(),
|
|
471
|
+
tsconfigPaths(),
|
|
472
|
+
intlayer(),
|
|
473
|
+
intlayerMiddleware(),
|
|
474
|
+
],
|
|
475
|
+
});
|
|
484
476
|
```
|
|
485
477
|
|
|
486
|
-
|
|
487
|
-
# Intlayer 사전 빌드
|
|
488
|
-
yarn intlayer:build
|
|
489
|
-
|
|
490
|
-
# 개발 서버 시작
|
|
491
|
-
yarn dev
|
|
492
|
-
```
|
|
478
|
+
---
|
|
493
479
|
|
|
494
480
|
### 12단계: TypeScript 구성 (선택 사항)
|
|
495
481
|
|
|
496
|
-
Intlayer는 TypeScript의 이점을 활용하고 코드베이스를 더욱 견고하게
|
|
482
|
+
Intlayer는 모듈 확장을 사용하여 TypeScript의 이점을 활용하고 코드베이스를 더욱 견고하게 만듭니다.
|
|
497
483
|
|
|
498
484
|
TypeScript 구성에 자동 생성된 타입이 포함되어 있는지 확인하세요:
|
|
499
485
|
|
|
500
486
|
```json5 fileName="tsconfig.json"
|
|
501
487
|
{
|
|
502
|
-
|
|
503
|
-
// ... 기존 TypeScript 구성
|
|
504
|
-
},
|
|
488
|
+
// ... 기존 구성
|
|
505
489
|
include: [
|
|
506
490
|
// ... 기존 포함 항목
|
|
507
491
|
".intlayer/**/*.ts", // 자동 생성된 타입 포함
|
|
@@ -509,91 +493,37 @@ TypeScript 구성에 자동 생성된 타입이 포함되어 있는지 확인하
|
|
|
509
493
|
}
|
|
510
494
|
```
|
|
511
495
|
|
|
496
|
+
---
|
|
497
|
+
|
|
512
498
|
### Git 구성
|
|
513
499
|
|
|
514
|
-
Intlayer가 생성한
|
|
500
|
+
Intlayer가 생성한 파일은 Git 저장소에 커밋하지 않도록 무시하는 것이 권장됩니다.
|
|
515
501
|
|
|
516
|
-
이를 위해 `.gitignore` 파일에 다음
|
|
502
|
+
이를 위해 `.gitignore` 파일에 다음 지침을 추가할 수 있습니다:
|
|
503
|
+
|
|
504
|
+
이를 위해 `.gitignore` 파일에 다음 지침을 추가할 수 있습니다:
|
|
517
505
|
|
|
518
506
|
```plaintext fileName=".gitignore"
|
|
519
|
-
# Intlayer
|
|
507
|
+
# Intlayer에서 생성된 파일 무시
|
|
520
508
|
.intlayer
|
|
521
509
|
```
|
|
522
510
|
|
|
523
511
|
---
|
|
524
512
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
```typescript fileName="src/routes/{-$locale}/rotue.tsx" codeFormat="typescript"
|
|
528
|
-
function LayoutComponent() {
|
|
529
|
-
useI18nHTMLAttributes();
|
|
530
|
-
|
|
531
|
-
const { locale } = Route.useParams();
|
|
532
|
-
const { locale: selectedLocale } = useLocale();
|
|
533
|
-
const { defaultLocale } = configuration.internationalization;
|
|
534
|
-
const { prefixDefault } = configuration.middleware;
|
|
535
|
-
|
|
536
|
-
// prefixDefault가 true일 때 URL에 로케일이 없으면 기본 로케일로 리디렉션
|
|
537
|
-
if (selectedLocale === defaultLocale && !locale && prefixDefault) {
|
|
538
|
-
return <Navigate replace to={defaultLocale} />;
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
// URL의 로케일이 선택된 로케일과 다르면 선택된 로케일로 리디렉션
|
|
542
|
-
if (selectedLocale !== defaultLocale && !locale) {
|
|
543
|
-
return <Navigate replace to={selectedLocale} />;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
return (
|
|
547
|
-
<IntlayerProvider locale={locale}>
|
|
548
|
-
<Outlet />
|
|
549
|
-
</IntlayerProvider>
|
|
550
|
-
);
|
|
551
|
-
}
|
|
552
|
-
```
|
|
553
|
-
|
|
554
|
-
## 프로덕션 배포
|
|
555
|
-
|
|
556
|
-
애플리케이션을 배포할 때:
|
|
557
|
-
|
|
558
|
-
1. **애플리케이션 빌드:**
|
|
559
|
-
|
|
560
|
-
```bash
|
|
561
|
-
npm run build
|
|
562
|
-
```
|
|
563
|
-
|
|
564
|
-
2. **Intlayer 사전 빌드:**
|
|
565
|
-
|
|
566
|
-
```bash
|
|
567
|
-
npm run intlayer:build
|
|
568
|
-
```
|
|
569
|
-
|
|
570
|
-
3. **프로덕션에서 미들웨어를 사용하는 경우 `vite-intlayer`를 dependencies로 이동:**
|
|
571
|
-
```bash
|
|
572
|
-
npm install vite-intlayer --save
|
|
573
|
-
```
|
|
574
|
-
|
|
575
|
-
이제 애플리케이션은 다음을 지원합니다:
|
|
576
|
-
|
|
577
|
-
- **URL 구조**: `/en`, `/en/about`, `/tr`, `/tr/about`
|
|
578
|
-
- **브라우저 환경설정을 기반으로 한 자동 로케일 감지**
|
|
579
|
-
- **Tanstack Start를 이용한 로케일 인식 라우팅**
|
|
580
|
-
- **자동 생성 타입을 포함한 TypeScript 지원**
|
|
581
|
-
- **적절한 로케일 처리를 포함한 서버 사이드 렌더링**
|
|
582
|
-
|
|
583
|
-
## VS 코드 확장 기능
|
|
513
|
+
## VS 코드 확장 프로그램
|
|
584
514
|
|
|
585
|
-
Intlayer 개발 경험을 향상시키기 위해 공식 **Intlayer VS
|
|
515
|
+
Intlayer와 함께 개발 경험을 향상시키기 위해 공식 **Intlayer VS 코드 확장 프로그램**을 설치할 수 있습니다.
|
|
586
516
|
|
|
587
|
-
[VS
|
|
517
|
+
[VS 코드 마켓플레이스에서 설치하기](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
588
518
|
|
|
589
519
|
이 확장 프로그램은 다음을 제공합니다:
|
|
590
520
|
|
|
591
|
-
- 번역 키에 대한 **자동
|
|
521
|
+
- 번역 키에 대한 **자동 완성**.
|
|
592
522
|
- 누락된 번역에 대한 **실시간 오류 감지**.
|
|
593
523
|
- 번역된 콘텐츠의 **인라인 미리보기**.
|
|
594
524
|
- 번역을 쉽게 생성하고 업데이트할 수 있는 **빠른 작업**.
|
|
595
525
|
|
|
596
|
-
확장
|
|
526
|
+
확장 기능 사용 방법에 대한 자세한 내용은 [Intlayer VS Code 확장 문서](https://intlayer.org/doc/vs-code-extension)를 참조하세요.
|
|
597
527
|
|
|
598
528
|
---
|
|
599
529
|
|
|
@@ -603,19 +533,19 @@ Intlayer 개발 경험을 향상시키기 위해 공식 **Intlayer VS Code 확
|
|
|
603
533
|
|
|
604
534
|
---
|
|
605
535
|
|
|
606
|
-
## 문서
|
|
536
|
+
## 문서 참고 자료
|
|
607
537
|
|
|
608
538
|
- [Intlayer 문서](https://intlayer.org)
|
|
609
539
|
- [Tanstack Start 문서](https://reactrouter.com/)
|
|
610
540
|
- [useIntlayer 훅](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useIntlayer.md)
|
|
611
541
|
- [useLocale 훅](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/react-intlayer/useLocale.md)
|
|
612
542
|
- [콘텐츠 선언](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/dictionary/get_started.md)
|
|
613
|
-
- [
|
|
543
|
+
- [설정](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/configuration.md)
|
|
614
544
|
|
|
615
545
|
이 종합 가이드는 지역 인식 라우팅과 TypeScript 지원을 갖춘 완전한 국제화 애플리케이션을 위해 Intlayer를 Tanstack Start와 통합하는 데 필요한 모든 것을 제공합니다.
|
|
616
546
|
|
|
617
547
|
## 문서 이력
|
|
618
548
|
|
|
619
|
-
| 버전 | 날짜 | 변경 사항
|
|
620
|
-
| ----- | ---------- |
|
|
621
|
-
| 5.8.1 | 2025-09-09 | Tanstack Start용
|
|
549
|
+
| 버전 | 날짜 | 변경 사항 |
|
|
550
|
+
| ----- | ---------- | --------------------- |
|
|
551
|
+
| 5.8.1 | 2025-09-09 | Tanstack Start용 추가 |
|