@intlayer/docs 8.5.2 → 8.6.1

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.
Files changed (148) hide show
  1. package/docs/ar/intlayer_with_react_router_v7.md +2 -4
  2. package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +2 -4
  3. package/docs/ar/intlayer_with_svelte_kit.md +2 -2
  4. package/docs/ar/intlayer_with_tanstack+solid.md +0 -17
  5. package/docs/ar/intlayer_with_tanstack.md +0 -8
  6. package/docs/ar/intlayer_with_vite+lit.md +0 -1
  7. package/docs/ar/intlayer_with_vite+solid.md +0 -1
  8. package/docs/ar/intlayer_with_vite+svelte.md +1 -1
  9. package/docs/bn/intlayer_with_vite+lit.md +0 -1
  10. package/docs/cs/intlayer_with_vite+lit.md +0 -1
  11. package/docs/de/intlayer_with_react_router_v7.md +2 -4
  12. package/docs/de/intlayer_with_react_router_v7_fs_routes.md +1 -2
  13. package/docs/de/intlayer_with_svelte_kit.md +2 -2
  14. package/docs/de/intlayer_with_tanstack+solid.md +78 -21
  15. package/docs/de/intlayer_with_tanstack.md +96 -28
  16. package/docs/de/intlayer_with_vite+lit.md +0 -1
  17. package/docs/de/intlayer_with_vite+solid.md +0 -1
  18. package/docs/de/intlayer_with_vite+svelte.md +1 -1
  19. package/docs/en/intlayer_with_react_router_v7.md +1 -2
  20. package/docs/en/intlayer_with_react_router_v7_fs_routes.md +2 -4
  21. package/docs/en/intlayer_with_svelte_kit.md +2 -2
  22. package/docs/en/intlayer_with_tanstack+solid.md +79 -19
  23. package/docs/en/intlayer_with_tanstack.md +81 -10
  24. package/docs/en/intlayer_with_vite+lit.md +0 -1
  25. package/docs/en/intlayer_with_vite+solid.md +0 -1
  26. package/docs/en/intlayer_with_vite+svelte.md +5 -6
  27. package/docs/en-GB/intlayer_with_react_router_v7.md +2 -4
  28. package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +2 -4
  29. package/docs/en-GB/intlayer_with_svelte_kit.md +2 -2
  30. package/docs/en-GB/intlayer_with_tanstack+solid.md +71 -17
  31. package/docs/en-GB/intlayer_with_tanstack.md +74 -9
  32. package/docs/en-GB/intlayer_with_vite+lit.md +0 -1
  33. package/docs/en-GB/intlayer_with_vite+solid.md +0 -1
  34. package/docs/en-GB/intlayer_with_vite+svelte.md +1 -1
  35. package/docs/es/intlayer_with_react_router_v7.md +2 -4
  36. package/docs/es/intlayer_with_react_router_v7_fs_routes.md +2 -4
  37. package/docs/es/intlayer_with_svelte_kit.md +2 -2
  38. package/docs/es/intlayer_with_tanstack+solid.md +78 -21
  39. package/docs/es/intlayer_with_tanstack.md +96 -28
  40. package/docs/es/intlayer_with_vite+lit.md +0 -1
  41. package/docs/es/intlayer_with_vite+solid.md +0 -1
  42. package/docs/es/intlayer_with_vite+svelte.md +1 -1
  43. package/docs/fr/intlayer_with_react_router_v7.md +2 -4
  44. package/docs/fr/intlayer_with_react_router_v7_fs_routes.md +2 -4
  45. package/docs/fr/intlayer_with_svelte_kit.md +3 -3
  46. package/docs/fr/intlayer_with_tanstack+solid.md +78 -21
  47. package/docs/fr/intlayer_with_tanstack.md +96 -28
  48. package/docs/fr/intlayer_with_vite+lit.md +0 -1
  49. package/docs/fr/intlayer_with_vite+solid.md +0 -1
  50. package/docs/fr/intlayer_with_vite+svelte.md +1 -1
  51. package/docs/hi/intlayer_with_react_router_v7.md +2 -4
  52. package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +2 -4
  53. package/docs/hi/intlayer_with_svelte_kit.md +2 -2
  54. package/docs/hi/intlayer_with_tanstack+solid.md +0 -17
  55. package/docs/hi/intlayer_with_tanstack.md +0 -8
  56. package/docs/hi/intlayer_with_vite+lit.md +0 -1
  57. package/docs/hi/intlayer_with_vite+solid.md +0 -1
  58. package/docs/hi/intlayer_with_vite+svelte.md +1 -1
  59. package/docs/id/intlayer_with_react_router_v7.md +2 -4
  60. package/docs/id/intlayer_with_react_router_v7_fs_routes.md +2 -4
  61. package/docs/id/intlayer_with_svelte_kit.md +2 -2
  62. package/docs/id/intlayer_with_tanstack+solid.md +0 -17
  63. package/docs/id/intlayer_with_tanstack.md +0 -8
  64. package/docs/id/intlayer_with_vite+lit.md +0 -1
  65. package/docs/id/intlayer_with_vite+solid.md +0 -1
  66. package/docs/id/intlayer_with_vite+svelte.md +1 -1
  67. package/docs/it/intlayer_with_react_router_v7.md +2 -4
  68. package/docs/it/intlayer_with_react_router_v7_fs_routes.md +2 -4
  69. package/docs/it/intlayer_with_svelte_kit.md +3 -3
  70. package/docs/it/intlayer_with_tanstack+solid.md +76 -19
  71. package/docs/it/intlayer_with_tanstack.md +96 -30
  72. package/docs/it/intlayer_with_vite+lit.md +0 -1
  73. package/docs/it/intlayer_with_vite+solid.md +0 -1
  74. package/docs/it/intlayer_with_vite+svelte.md +1 -1
  75. package/docs/ja/intlayer_with_react_router_v7.md +1 -2
  76. package/docs/ja/intlayer_with_react_router_v7_fs_routes.md +2 -4
  77. package/docs/ja/intlayer_with_tanstack+solid.md +81 -22
  78. package/docs/ja/intlayer_with_tanstack.md +779 -93
  79. package/docs/ja/intlayer_with_vite+lit.md +0 -1
  80. package/docs/ja/intlayer_with_vite+solid.md +0 -1
  81. package/docs/ja/intlayer_with_vite+svelte.md +1 -1
  82. package/docs/ko/intlayer_with_react_router_v7.md +2 -4
  83. package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +2 -4
  84. package/docs/ko/intlayer_with_svelte_kit.md +2 -2
  85. package/docs/ko/intlayer_with_tanstack+solid.md +79 -22
  86. package/docs/ko/intlayer_with_tanstack.md +95 -101
  87. package/docs/ko/intlayer_with_vite+lit.md +0 -1
  88. package/docs/ko/intlayer_with_vite+solid.md +0 -1
  89. package/docs/ko/intlayer_with_vite+svelte.md +1 -1
  90. package/docs/nl/intlayer_with_vite+lit.md +0 -1
  91. package/docs/pl/intlayer_with_react_router_v7.md +2 -4
  92. package/docs/pl/intlayer_with_react_router_v7_fs_routes.md +2 -4
  93. package/docs/pl/intlayer_with_svelte_kit.md +2 -2
  94. package/docs/pl/intlayer_with_tanstack+solid.md +0 -17
  95. package/docs/pl/intlayer_with_tanstack.md +0 -8
  96. package/docs/pl/intlayer_with_vite+lit.md +0 -1
  97. package/docs/pl/intlayer_with_vite+solid.md +0 -1
  98. package/docs/pl/intlayer_with_vite+svelte.md +1 -1
  99. package/docs/pt/intlayer_with_react_router_v7.md +1 -2
  100. package/docs/pt/intlayer_with_react_router_v7_fs_routes.md +2 -4
  101. package/docs/pt/intlayer_with_svelte_kit.md +3 -3
  102. package/docs/pt/intlayer_with_tanstack+solid.md +76 -19
  103. package/docs/pt/intlayer_with_tanstack.md +96 -30
  104. package/docs/pt/intlayer_with_vite+lit.md +0 -1
  105. package/docs/pt/intlayer_with_vite+solid.md +0 -1
  106. package/docs/pt/intlayer_with_vite+svelte.md +1 -1
  107. package/docs/ru/intlayer_with_react_router_v7.md +2 -4
  108. package/docs/ru/intlayer_with_react_router_v7_fs_routes.md +2 -4
  109. package/docs/ru/intlayer_with_svelte_kit.md +2 -2
  110. package/docs/ru/intlayer_with_tanstack+solid.md +78 -21
  111. package/docs/ru/intlayer_with_tanstack.md +99 -33
  112. package/docs/ru/intlayer_with_vite+lit.md +0 -1
  113. package/docs/ru/intlayer_with_vite+solid.md +0 -1
  114. package/docs/ru/intlayer_with_vite+svelte.md +1 -1
  115. package/docs/tr/intlayer_with_react_router_v7.md +2 -4
  116. package/docs/tr/intlayer_with_react_router_v7_fs_routes.md +2 -4
  117. package/docs/tr/intlayer_with_svelte_kit.md +2 -2
  118. package/docs/tr/intlayer_with_tanstack+solid.md +0 -17
  119. package/docs/tr/intlayer_with_tanstack.md +0 -8
  120. package/docs/tr/intlayer_with_vite+lit.md +0 -1
  121. package/docs/tr/intlayer_with_vite+solid.md +0 -1
  122. package/docs/tr/intlayer_with_vite+svelte.md +1 -1
  123. package/docs/uk/intlayer_with_react_router_v7.md +1 -2
  124. package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +2 -4
  125. package/docs/uk/intlayer_with_svelte_kit.md +2 -2
  126. package/docs/uk/intlayer_with_tanstack+solid.md +0 -17
  127. package/docs/uk/intlayer_with_tanstack.md +0 -8
  128. package/docs/uk/intlayer_with_vite+lit.md +0 -1
  129. package/docs/uk/intlayer_with_vite+solid.md +0 -1
  130. package/docs/uk/intlayer_with_vite+svelte.md +1 -1
  131. package/docs/ur/intlayer_with_vite+lit.md +0 -1
  132. package/docs/vi/intlayer_with_react_router_v7.md +2 -4
  133. package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +2 -4
  134. package/docs/vi/intlayer_with_svelte_kit.md +2 -2
  135. package/docs/vi/intlayer_with_tanstack+solid.md +0 -17
  136. package/docs/vi/intlayer_with_tanstack.md +0 -8
  137. package/docs/vi/intlayer_with_vite+lit.md +0 -1
  138. package/docs/vi/intlayer_with_vite+solid.md +0 -1
  139. package/docs/vi/intlayer_with_vite+svelte.md +1 -1
  140. package/docs/zh/intlayer_with_react_router_v7.md +2 -4
  141. package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +2 -4
  142. package/docs/zh/intlayer_with_svelte_kit.md +2 -2
  143. package/docs/zh/intlayer_with_tanstack+solid.md +80 -23
  144. package/docs/zh/intlayer_with_tanstack.md +96 -104
  145. package/docs/zh/intlayer_with_vite+lit.md +0 -1
  146. package/docs/zh/intlayer_with_vite+solid.md +0 -1
  147. package/docs/zh/intlayer_with_vite+svelte.md +1 -1
  148. package/package.json +8 -8
@@ -409,7 +409,6 @@ export class MyElement extends LitElement {
409
409
  }
410
410
  ```
411
411
 
412
- > [!NOTE]
413
412
  > ネイティブHTML属性(例:`alt`、`aria-label`、`title`)で翻訳された文字列が必要な場合は、リーフノードで `.value` を呼び出します:
414
413
  >
415
414
  > ```typescript
@@ -341,7 +341,6 @@ const App: Component = () => (
341
341
  export default App;
342
342
  ```
343
343
 
344
- > [!NOTE]
345
344
  > Solidでは、`useIntlayer`は**accessor**関数(例:`content()`)を返します。リアクティブコンテンツにアクセスするには、この関数を呼び出す必要があります。
346
345
 
347
346
  > `alt`、`title`、`href`、`aria-label`などの`string`属性でコンテンツを使用する場合は、関数の値を次のように呼び出す必要があります:
@@ -232,7 +232,7 @@ module.exports = appContent;
232
232
  <!-- コンテンツをシンプルにレンダリング -->
233
233
  <h1>{$content.title}</h1>
234
234
  <!-- エディターを使って編集可能なコンテンツとしてレンダリング -->
235
- <h1><svelte:component this={$content.title} /></h1>
235
+ <h1>{@const Title = $content.title}<Title /></h1>
236
236
  <!-- コンテンツを文字列としてレンダリング -->
237
237
  <div aria-label={$content.title.value}></div>
238
238
  ```
@@ -175,10 +175,9 @@ module.exports = config;
175
175
  import { reactRouter } from "@react-router/dev/vite";
176
176
  import { defineConfig } from "vite";
177
177
  import { intlayer } from "vite-intlayer";
178
- import tsconfigPaths from "vite-tsconfig-paths";
179
178
 
180
179
  export default defineConfig({
181
- plugins: [reactRouter(), tsconfigPaths(), intlayer()],
180
+ plugins: [reactRouter(), intlayer()],
182
181
  });
183
182
  ```
184
183
 
@@ -737,13 +736,12 @@ This comprehensive guide provides everything you need to integrate Intlayer with
737
736
  import { reactRouter } from "@react-router/dev/vite";
738
737
  import { defineConfig } from "vite";
739
738
  import { intlayer, intlayerProxy } from "vite-intlayer";
740
- import tsconfigPaths from "vite-tsconfig-paths";
741
739
 
742
740
  export default defineConfig({
743
741
  plugins: [
744
742
  intlayerProxy(), // should be placed first
745
743
  reactRouter(),
746
- tsconfigPaths(),
744
+
747
745
  intlayer(),
748
746
  ],
749
747
  });
@@ -174,10 +174,9 @@ module.exports = config;
174
174
  import { reactRouter } from "@react-router/dev/vite";
175
175
  import { defineConfig } from "vite";
176
176
  import { intlayer } from "vite-intlayer";
177
- import tsconfigPaths from "vite-tsconfig-paths";
178
177
 
179
178
  export default defineConfig({
180
- plugins: [reactRouter(), tsconfigPaths(), intlayer()],
179
+ plugins: [reactRouter(), intlayer()],
181
180
  });
182
181
  ```
183
182
 
@@ -683,13 +682,12 @@ This comprehensive guide provides everything you need to integrate Intlayer with
683
682
  import { reactRouter } from "@react-router/dev/vite";
684
683
  import { defineConfig } from "vite";
685
684
  import { intlayer, intlayerProxy } from "vite-intlayer";
686
- import tsconfigPaths from "vite-tsconfig-paths";
687
685
 
688
686
  export default defineConfig({
689
687
  plugins: [
690
688
  intlayerProxy(), // should be placed first
691
689
  reactRouter(),
692
- tsconfigPaths(),
690
+
693
691
  intlayer(),
694
692
  ],
695
693
  });
@@ -370,7 +370,7 @@ export default heroContent;
370
370
  <!-- 간단한 콘텐츠로 렌더링 -->
371
371
  <h1>{$content.title}</h1>
372
372
  <!-- 에디터를 사용하여 편집 가능한 콘텐츠로 렌더링 -->
373
- <h1><svelte:component this={$content.title} /></h1>
373
+ <h1>{@const Title = $content.title}<Title /></h1>
374
374
  <!-- 콘텐츠를 문자열로 렌더링하기 -->
375
375
  <div aria-label={$content.title.value}></div>
376
376
  ```
@@ -726,7 +726,7 @@ intlayer 에디터 선택기를 시각화하려면 intlayer 콘텐츠에서 컴
726
726
  <h1>{$content.title}</h1>
727
727
 
728
728
  <!-- 컴포넌트로 렌더링 (에디터에서 필요) -->
729
- <svelte:component this={$content.component} />
729
+ {@const Component = $content.component}<Component />
730
730
  </div>
731
731
  ```
732
732
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-03-25
3
- updatedAt: 2026-03-25
3
+ updatedAt: 2026-03-29
4
4
  title: Tanstack Start i18n - 2026년에 Solid.js를 사용하여 Tanstack Start 앱을 번역하는 방법
5
5
  description: Intlayer와 Solid.js를 사용하여 Tanstack Start 애플리케이션에 국제화(i18n)를 추가하는 방법을 알아보세요. 이 포괄적인 가이드를 따라 로케일 인식 라우팅을 갖춘 다국어 앱을 만드세요.
6
6
  keywords:
@@ -12,6 +12,7 @@ keywords:
12
12
  - i18n
13
13
  - TypeScript
14
14
  - 로케일 라우팅
15
+ - Sitemap
15
16
  slugs:
16
17
  - doc
17
18
  - environment
@@ -140,16 +141,12 @@ Vite 구성에 intlayer 플러그인을 추가합니다.
140
141
  import { intlayer } from "vite-intlayer";
141
142
  import { defineConfig } from "vite";
142
143
  import { devtools } from "@tanstack/devtools-vite";
143
- import viteTsConfigPaths from "vite-tsconfig-paths";
144
144
  import { tanstackStart } from "@tanstack/solid-start/plugin/vite";
145
145
  import solidPlugin from "vite-plugin-solid";
146
146
 
147
147
  export default defineConfig({
148
148
  plugins: [
149
149
  devtools(),
150
- viteTsConfigPaths({
151
- projects: ["./tsconfig.json"],
152
- }),
153
150
  tanstackStart({
154
151
  router: {
155
152
  routeFileIgnorePattern:
@@ -221,9 +218,6 @@ function RootComponent() {
221
218
  }
222
219
  ```
223
220
 
224
- > [!NOTE]
225
- > Solid에서 `useMatches`는 **시그널**(반응형 접근자)을 반환합니다. `matches()`(괄호 포함)를 사용하여 현재 값에 반응형으로 접근하세요.
226
-
227
221
  ### 6단계: 로케일 레이아웃 생성 (선택 사항)
228
222
 
229
223
  로케일 접두사를 처리하고 유효성 검사를 수행하는 레이아웃을 만듭니다. 이 레이아웃은 유효한 로케일만 처리되도록 보장합니다.
@@ -415,7 +409,6 @@ function RouteComponent() {
415
409
  }
416
410
  ```
417
411
 
418
- > [!NOTE]
419
412
  > Solid에서 `useIntlayer`는 **접근자** 함수(예: `content()`)를 반환합니다. 반응형 콘텐츠에 접근하려면 이 함수를 호출해야 합니다.
420
413
  >
421
414
  > `useIntlayer` 훅에 대해 자세히 알아보려면 [문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/solid-intlayer/useIntlayer.md)를 참조하세요.
@@ -460,7 +453,6 @@ export const LocaleSwitcher = () => {
460
453
  export default LocaleSwitcher;
461
454
  ```
462
455
 
463
- > [!NOTE]
464
456
  > Solid에서 `useLocale`의 `locale`은 **시그널 접근자**입니다. 현재 값을 반응형으로 읽으려면 `locale()`(괄호 포함)을 사용하세요.
465
457
  >
466
458
  > `useLocale` 훅에 대해 자세히 알아보려면 [문서](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/packages/solid-intlayer/useLocale.md)를 참조하세요.
@@ -502,15 +494,11 @@ import solid from "vite-plugin-solid";
502
494
  import { nitro } from "nitro/vite";
503
495
  import { defineConfig } from "vite";
504
496
  import { intlayer, intlayerProxy } from "vite-intlayer";
505
- import viteTsConfigPaths from "vite-tsconfig-paths";
506
497
 
507
498
  export default defineConfig({
508
499
  plugins: [
509
500
  intlayerProxy(), // Nitro를 사용하는 경우 프록시는 서버 앞에 배치되어야 합니다.
510
501
  nitro(),
511
- viteTsConfigPaths({
512
- projects: ["./tsconfig.json"],
513
- }),
514
502
  intlayer(),
515
503
  tanstackStart({
516
504
  router: {
@@ -525,7 +513,7 @@ export default defineConfig({
525
513
 
526
514
  ---
527
515
 
528
- ### 13단계: 메타데이터 국제화 (선택 사항)
516
+ ### 12단계: 메타데이터 국제화 (선택 사항)
529
517
 
530
518
  로케일 인식 메타데이터를 위해 `head` 로더 내에서 `getIntlayer` 함수를 사용하여 콘텐츠 딕셔너리에 접근할 수도 있습니다.
531
519
 
@@ -551,7 +539,7 @@ export const Route = createFileRoute("/{-$locale}/")({
551
539
 
552
540
  ---
553
541
 
554
- ### 14단계: 서버 액션에서 로케일 검색 (선택 사항)
542
+ ### 13단계: 서버 액션에서 로케일 검색 (선택 사항)
555
543
 
556
544
  서버 액션이나 API 엔드포인트 내에서 현재 로케일에 접근하고 싶을 수 있습니다.
557
545
  `intlayer`의 `getLocale` 헬퍼를 사용하여 이를 수행할 수 있습니다.
@@ -588,7 +576,7 @@ export const getLocaleServer = createServerFn().handler(async () => {
588
576
 
589
577
  ---
590
578
 
591
- ### 15단계: 찾을 수 없는 페이지 관리 (선택 사항)
579
+ ### 14단계: 찾을 수 없는 페이지 관리 (선택 사항)
592
580
 
593
581
  사용자가 존재하지 않는 페이지를 방문할 때 사용자 지정 404 페이지를 표시할 수 있으며, 로케일 접두사가 404 페이지가 트리거되는 방식에 영향을 줄 수 있습니다.
594
582
 
@@ -662,7 +650,7 @@ export const Route = createFileRoute("/{-$locale}/$")({
662
650
  });
663
651
  ```
664
652
 
665
- ### (선택 사항) 16단계: 컴포넌트의 콘텐츠 추출
653
+ ### 15단계: 컴포넌트의 콘텐츠 추출 (선택 사항)
666
654
 
667
655
  기존 코드베이스가 있는 경우 수천 개의 파일을 변환하는 것은 시간이 많이 걸릴 수 있습니다.
668
656
 
@@ -803,16 +791,12 @@ bun x intlayer extract
803
791
  import { intlayer, intlayerCompiler } from "vite-intlayer";
804
792
  import { defineConfig } from "vite";
805
793
  import { devtools } from "@tanstack/devtools-vite";
806
- import viteTsConfigPaths from "vite-tsconfig-paths";
807
794
  import { tanstackStart } from "@tanstack/solid-start/plugin/vite";
808
795
  import solidPlugin from "vite-plugin-solid";
809
796
 
810
797
  export default defineConfig({
811
798
  plugins: [
812
799
  devtools(),
813
- viteTsConfigPaths({
814
- projects: ["./tsconfig.json"],
815
- }),
816
800
  tanstackStart({
817
801
  router: {
818
802
  routeFileIgnorePattern:
@@ -847,6 +831,79 @@ bun run build # 또는 bun run dev
847
831
 
848
832
  ---
849
833
 
834
+ ### 16단계: 사이트맵 생성 (선택 사항)
835
+
836
+ Intlayer에는 애플리케이션의 사이트맵을 쉽게 만들 수 있는 내장 사이트맵 생성기가 포함되어 있습니다. 로컬라이즈된 경로를 처리하고 검색 엔진에 필요한 메타데이터를 추가합니다.
837
+
838
+ > Intlayer에서 생성한 사이트맵은 `xhtml:link` 네임스페이스(Hreflang XML 확장)를 지원합니다. 원시 URL만 나열하는 기본 사이트맵 생성기와 달리, Intlayer는 페이지의 모든 언어 버전(예: `/about`, `/about?lang=fr`, `/about?lang=es`) 간에 필요한 양방향 링크를 자동으로 생성합니다. 이를 통해 검색 엔진이 올바른 언어 버전을 올바른 사용자에게 색인화하고 제공할 수 있도록 보장합니다.
839
+
840
+ 이를 사용하려면 먼저 `vite.config.ts`를 구성하여 로컬라이즈된 경로에 대한 사전 렌더링(pre-rendering)을 활성화하고 TanStack Start의 기본 사이트맵 생성을 비활성화해야 합니다.
841
+
842
+ ```typescript fileName="vite.config.ts"
843
+ import { localeMap, localeFlatMap } from "intlayer";
844
+ // ... 기타 임포트
845
+
846
+ export const pathList = ["", "/about", "/404"];
847
+
848
+ const localizedPages = localeFlatMap(({ urlPrefix }) =>
849
+ pathList.map((path) => ({
850
+ path: `${urlPrefix}${path}`,
851
+ prerender: {
852
+ enabled: true,
853
+ },
854
+ }))
855
+ );
856
+
857
+ export default defineConfig({
858
+ plugins: [
859
+ // ... 기타 플러그인
860
+ tanstackStart({
861
+ // ... 기타 설정
862
+ sitemap: {
863
+ enabled: false,
864
+ },
865
+ prerender: {
866
+ enabled: true,
867
+ crawlLinks: false,
868
+ concurrency: 10,
869
+ },
870
+ pages: localizedPages,
871
+ }),
872
+ ],
873
+ });
874
+ ```
875
+
876
+ 그런 다음 `generateSitemap` 함수를 사용하는 `src/routes/sitemap[.]xml.ts` 경로를 만듭니다.
877
+
878
+ ```typescript fileName="src/routes/sitemap[.]xml.ts"
879
+ import { createFileRoute } from "@tanstack/solid-router";
880
+ import { generateSitemap } from "intlayer";
881
+
882
+ const SITE_URL = "http://localhost:3000";
883
+
884
+ export const Route = createFileRoute("/sitemap.xml")({
885
+ server: {
886
+ handlers: {
887
+ GET: async () => {
888
+ const sitemap = generateSitemap(
889
+ [
890
+ { path: "/", changefreq: "daily", priority: 1.0 },
891
+ { path: "/about", changefreq: "monthly", priority: 0.8 },
892
+ ],
893
+ { siteUrl: SITE_URL }
894
+ );
895
+
896
+ return new Response(sitemap, {
897
+ headers: { "Content-Type": "application/xml" },
898
+ });
899
+ },
900
+ },
901
+ },
902
+ });
903
+ ```
904
+
905
+ ---
906
+
850
907
  ### 17단계: TypeScript 구성 (선택 사항)
851
908
 
852
909
  Intlayer는 모듈 보강(module augmentation)을 사용하여 TypeScript의 이점을 얻고 코드베이스를 더 강력하게 만듭니다.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-09-09
3
- updatedAt: 2026-03-12
3
+ updatedAt: 2026-03-29
4
4
  title: Tanstack Start i18n - Tanstack Start 앱 번역 방법 2026
5
5
  description: Intlayer를 사용하여 TanStack Start 애플리케이션에 국제화(i18n)를 추가하는 방법을 알아보세요. 로케일 인식 라우팅으로 앱을 다국어화하기 위한 이 포괄적인 가이드를 따르세요.
6
6
  keywords:
@@ -12,6 +12,7 @@ keywords:
12
12
  - i18n
13
13
  - TypeScript
14
14
  - 로케일 라우팅
15
+ - Sitemap
15
16
  slugs:
16
17
  - doc
17
18
  - environment
@@ -160,14 +161,10 @@ import viteReact from "@vitejs/plugin-react";
160
161
  import { nitro } from "nitro/vite";
161
162
  import { defineConfig } from "vite";
162
163
  import { intlayer } from "vite-intlayer";
163
- import viteTsConfigPaths from "vite-tsconfig-paths";
164
164
 
165
165
  const config = defineConfig({
166
166
  plugins: [
167
167
  nitro(),
168
- viteTsConfigPaths({
169
- projects: ["./tsconfig.json"],
170
- }),
171
168
  intlayer(),
172
169
  tanstackStart({
173
170
  router: {
@@ -593,15 +590,11 @@ import viteReact from "@vitejs/plugin-react";
593
590
  import { nitro } from "nitro/vite";
594
591
  import { defineConfig } from "vite";
595
592
  import { intlayer, intlayerProxy } from "vite-intlayer";
596
- import viteTsConfigPaths from "vite-tsconfig-paths";
597
593
 
598
594
  export default defineConfig({
599
595
  plugins: [
600
596
  intlayerProxy(), // Nitro를 사용하는 경우 프록시를 서버 앞에 배치해야 합니다.
601
597
  nitro(),
602
- viteTsConfigPaths({
603
- projects: ["./tsconfig.json"],
604
- }),
605
598
  intlayer(),
606
599
  tanstackStart({
607
600
  router: {
@@ -616,7 +609,7 @@ export default defineConfig({
616
609
 
617
610
  ---
618
611
 
619
- ### 13단계: 메타데이터 국제화(선택 사항)
612
+ ### 12단계: 메타데이터 국제화(선택 사항)
620
613
 
621
614
  `getIntlayer` 훅을 사용하여 애플리케이션 전반에서 콘텐츠 사전에 액세스할 수도 있습니다:
622
615
 
@@ -642,7 +635,7 @@ export const Route = createFileRoute("/{-$locale}/")({
642
635
 
643
636
  ---
644
637
 
645
- ### 14단계: 서버 액션에서 로케일 가져오기(선택 사항)
638
+ ### 13단계: 서버 액션에서 로케일 가져오기(선택 사항)
646
639
 
647
640
  서버 액션 또는 API 엔드포인트 내부에서 현재 로케일에 액세스하고 싶을 수 있습니다.
648
641
  이는 `intlayer`의 `getLocale` 도우미를 사용하여 수행할 수 있습니다.
@@ -679,7 +672,7 @@ export const getLocaleServer = createServerFn().handler(async () => {
679
672
 
680
673
  ---
681
674
 
682
- ### 15단계: 찾을 수 없는 페이지 관리(선택 사항)
675
+ ### 14단계: 찾을 수 없는 페이지 관리(선택 사항)
683
676
 
684
677
  사용자가 존재하지 않는 페이지를 방문할 때 맞춤형 찾을 수 없음 페이지를 표시할 수 있으며, 로케일 접두사가 찾을 수 없음 페이지가 트리거되는 방식에 영향을 줄 수 있습니다.
685
678
 
@@ -755,25 +748,9 @@ export const Route = createFileRoute("/{-$locale}/$")({
755
748
 
756
749
  ---
757
750
 
758
- ### 16단계: TypeScript 구성(선택 사항)
759
-
760
- Intlayer는 모듈 확장을 사용하여 TypeScript의 이점을 얻고 코드베이스를 더욱 견고하게 만듭니다.
761
-
762
- TypeScript 구성에 자동 생성된 유형이 포함되어 있는지 확인하세요:
763
-
764
- ```json5 fileName="tsconfig.json"
765
- {
766
- // ... 기존 구성
767
- include: [
768
- // ... 기존 포함 항목
769
- ".intlayer/**/*.ts", // 자동 생성된 유형 포함
770
- ],
771
- }
772
- ```
773
-
774
751
  ---
775
752
 
776
- ### (선택 사항) 단계 1 : 컴포넌트 콘텐츠 추출
753
+ ### 15단계: 컴포넌트에서 콘텐츠 추출(선택 사항)
777
754
 
778
755
  기존 코드베이스가 있는 경우 수천 개의 파일을 변환하는 데 시간이 많이 걸릴 수 있습니다.
779
756
 
@@ -812,66 +789,6 @@ const config: IntlayerConfig = {
812
789
  export default config;
813
790
  ```
814
791
 
815
- ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
816
- /** @type {import('intlayer').IntlayerConfig} */
817
- const config = {
818
- // ... 나머지 구성
819
- compiler: {
820
- /**
821
- * 컴파일러 활성화 여부를 나타냅니다.
822
- */
823
- enabled: true,
824
-
825
- /**
826
- * 출력 파일 경로를 정의합니다.
827
- */
828
- output: ({ fileName, extension }) => `./${fileName}${extension}`,
829
-
830
- /**
831
- * 변환 후 컴포넌트를 저장할지 여부를 나타냅니다. 그렇게 하면 컴파일러를 한 번만 실행하여 앱을 변환한 다음 제거할 수 있습니다.
832
- */
833
- saveComponents: false,
834
-
835
- /**
836
- * 사전 키 접두사
837
- */
838
- dictionaryKeyPrefix: "",
839
- },
840
- };
841
-
842
- export default config;
843
- ```
844
-
845
- ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
846
- /** @type {import('intlayer').IntlayerConfig} */
847
- const config = {
848
- // ... 나머지 구성
849
- compiler: {
850
- /**
851
- * 컴파일러 활성화 여부를 나타냅니다.
852
- */
853
- enabled: true,
854
-
855
- /**
856
- * 출력 파일 경로를 정의합니다.
857
- */
858
- output: ({ fileName, extension }) => `./${fileName}${extension}`,
859
-
860
- /**
861
- * 변환 후 컴포넌트를 저장할지 여부를 나타냅니다. 그렇게 하면 컴파일러를 한 번만 실행하여 앱을 변환한 다음 제거할 수 있습니다.
862
- */
863
- saveComponents: false,
864
-
865
- /**
866
- * 사전 키 접두사
867
- */
868
- dictionaryKeyPrefix: "",
869
- },
870
- };
871
-
872
- module.exports = config;
873
- ```
874
-
875
792
  <Tabs>
876
793
  <Tab value='추출 명령'>
877
794
 
@@ -910,24 +827,101 @@ export default defineConfig({
910
827
  });
911
828
  ```
912
829
 
913
- ```bash packageManager="npm"
914
- npm run build # 또는 npm run dev
915
- ```
830
+ </Tab>
831
+ </Tabs>
916
832
 
917
- ```bash packageManager="pnpm"
918
- pnpm run build # 또는 pnpm run dev
919
- ```
833
+ ---
920
834
 
921
- ```bash packageManager="yarn"
922
- yarn build # 또는 yarn dev
835
+ ### 16단계: 사이트맵 생성(선택 사항)
836
+
837
+ Intlayer는 애플리케이션의 사이트맵을 쉽게 만들 수 있는 내장 사이트맵 생성기를 제공합니다. 로컬라이즈된 경로를 처리하고 검색 엔진에 필요한 메타데이터를 추가합니다.
838
+
839
+ > Intlayer에서 생성한 사이트맵은 `xhtml:link` 네임스페이스(Hreflang XML 확장)를 지원합니다. 원시 URL만 나열하는 기본 사이트맵 생성기와 달리, Intlayer는 페이지의 모든 언어 버전(예: `/about`, `/about?lang=fr`, `/about?lang=es`) 간에 필요한 양항향 링크를 자동으로 생성합니다. 이를 통해 검색 엔진이 올바른 언어 버전을 올바른 사용자에게 색인화하고 제공할 수 있도록 보장합니다.
840
+
841
+ 이를 사용하려면 먼저 로컬라이즈된 경로의 프리렌더링을 활성화하고 기본 TanStack Start 사이트맵 생성을 비활성화하도록 `vite.config.ts`를 구성해야 합니다.
842
+
843
+ ```typescript fileName="vite.config.ts"
844
+ import { localeFlatMap } from "intlayer";
845
+ // ... 기타 임포트
846
+
847
+ export const pathList = ["", "/about", "/404"];
848
+
849
+ const localizedPages = localeFlatMap(({ urlPrefix }) =>
850
+ pathList.map((path) => ({
851
+ path: `${urlPrefix}${path}`,
852
+ prerender: {
853
+ enabled: true,
854
+ },
855
+ }))
856
+ );
857
+
858
+ export default defineConfig({
859
+ plugins: [
860
+ // ... 기타 플러그인
861
+ tanstackStart({
862
+ // ... 기타 구성
863
+ sitemap: {
864
+ enabled: false,
865
+ },
866
+ prerender: {
867
+ enabled: true,
868
+ crawlLinks: false,
869
+ concurrency: 10,
870
+ },
871
+ pages: localizedPages,
872
+ }),
873
+ ],
874
+ });
923
875
  ```
924
876
 
925
- ```bash packageManager="bun"
926
- bun run build # Or bun run dev
877
+ 그런 다음, `generateSitemap` 함수를 사용하는 `src/routes/sitemap[.]xml.ts` 경로를 생성합니다.
878
+
879
+ ```typescript fileName="src/routes/sitemap[.]xml.ts"
880
+ import { createFileRoute } from "@tanstack/react-router";
881
+ import { generateSitemap } from "intlayer";
882
+
883
+ const SITE_URL = (
884
+ import.meta.env.VITE_SITE_URL ?? "http://localhost:3000"
885
+ ).replace(/\/$/, "");
886
+
887
+ export const Route = createFileRoute("/sitemap.xml")({
888
+ server: {
889
+ handlers: {
890
+ GET: async () => {
891
+ const sitemap = generateSitemap(
892
+ [
893
+ { path: "/", changefreq: "daily", priority: 1.0 },
894
+ { path: "/about", changefreq: "monthly", priority: 0.8 },
895
+ ],
896
+ { siteUrl: SITE_URL }
897
+ );
898
+
899
+ return new Response(sitemap, {
900
+ headers: { "Content-Type": "application/xml" },
901
+ });
902
+ },
903
+ },
904
+ },
905
+ });
927
906
  ```
928
907
 
929
- </Tab>
930
- </Tabs>
908
+ ---
909
+
910
+ ### 17단계: TypeScript 구성(선택 사항)
911
+
912
+ Intlayer는 모듈 확장을 사용하여 TypeScript의 이점을 얻고 코드베이스를 더욱 견고하게 만듭니다.
913
+
914
+ TypeScript 구성에 자동 생성된 유형이 포함되어 있는지 확인하세요:
915
+
916
+ ```json5 fileName="tsconfig.json"
917
+ {
918
+ // ... 기존 구성
919
+ include: [
920
+ // ... 기존 포함 항목
921
+ ".intlayer/**/*.ts", // 자동 생성된 유형 포함
922
+ ],
923
+ }
924
+ ```
931
925
 
932
926
  ---
933
927
 
@@ -409,7 +409,6 @@ export class MyElement extends LitElement {
409
409
  }
410
410
  ```
411
411
 
412
- > [!NOTE]
413
412
  > 네이티브 HTML 속성(예: `alt`, `aria-label`, `title`)에서 번역된 문자열이 필요한 경우 리프 노드에서 `.value`를 호출하세요:
414
413
  >
415
414
  > ```typescript
@@ -314,7 +314,6 @@ const App: Component = () => (
314
314
  export default App;
315
315
  ```
316
316
 
317
- > [!NOTE]
318
317
  > Solid에서 `useIntlayer`는 **accessor** 함수(예: `content()`)를 반환합니다. 반응형 콘텐츠에 액세스하려면 이 함수를 호출해야 합니다.
319
318
 
320
319
  > `alt`, `title`, `href`, `aria-label` 등의 `string` 속성에서 콘텐츠를 사용하려면 다음과 같이 함수의 값을 호출해야 합니다:
@@ -230,7 +230,7 @@ module.exports = appContent;
230
230
  <!-- 간단한 콘텐츠로 렌더링 -->
231
231
  <h1>{$content.title}</h1>
232
232
  <!-- 에디터를 사용하여 편집 가능한 콘텐츠로 렌더링 -->
233
- <h1><svelte:component this={$content.title} /></h1>
233
+ <h1>{@const Title = $content.title}<Title /></h1>
234
234
  <!-- 문자열로 콘텐츠 렌더링 -->
235
235
  <div aria-label={$content.title.value}></div>
236
236
  ```
@@ -409,7 +409,6 @@ export class MyElement extends LitElement {
409
409
  }
410
410
  ```
411
411
 
412
- > [!NOTE]
413
412
  > Wanneer je de vertaalde string nodig hebt in een systeemeigen HTML-attribuut (bijv. `alt`, `aria-label`, `title`), roep dan `.value` aan op het leaf-node:
414
413
  >
415
414
  > ```typescript
@@ -186,10 +186,9 @@ Dodaj wtyczkę intlayer do swojej konfiguracji:
186
186
  import { reactRouter } from "@react-router/dev/vite";
187
187
  import { defineConfig } from "vite";
188
188
  import { intlayer } from "vite-intlayer";
189
- import tsconfigPaths from "vite-tsconfig-paths";
190
189
 
191
190
  export default defineConfig({
192
- plugins: [reactRouter(), tsconfigPaths(), intlayer()],
191
+ plugins: [reactRouter(), intlayer()],
193
192
  });
194
193
  ```
195
194
 
@@ -729,13 +728,12 @@ Możesz również użyć `intlayerProxy`, aby dodać routing po stronie serwera
729
728
  import { reactRouter } from "@react-router/dev/vite";
730
729
  import { defineConfig } from "vite";
731
730
  import { intlayer, intlayerProxy } from "vite-intlayer";
732
- import tsconfigPaths from "vite-tsconfig-paths";
733
731
 
734
732
  export default defineConfig({
735
733
  plugins: [
736
734
  intlayerProxy(), // should be placed first
737
735
  reactRouter(),
738
- tsconfigPaths(),
736
+
739
737
  intlayer(),
740
738
  ],
741
739
  });
@@ -194,10 +194,9 @@ Dodaj wtyczkę intlayer do swojej konfiguracji:
194
194
  import { reactRouter } from "@react-router/dev/vite";
195
195
  import { defineConfig } from "vite";
196
196
  import { intlayer } from "vite-intlayer";
197
- import tsconfigPaths from "vite-tsconfig-paths";
198
197
 
199
198
  export default defineConfig({
200
- plugins: [reactRouter(), tsconfigPaths(), intlayer()],
199
+ plugins: [reactRouter(), intlayer()],
201
200
  });
202
201
  ```
203
202
 
@@ -852,13 +851,12 @@ Możesz również użyć `intlayerProxy`, aby dodać routing po stronie serwera
852
851
  import { reactRouter } from "@react-router/dev/vite";
853
852
  import { defineConfig } from "vite";
854
853
  import { intlayer, intlayerProxy } from "vite-intlayer";
855
- import tsconfigPaths from "vite-tsconfig-paths";
856
854
 
857
855
  export default defineConfig({
858
856
  plugins: [
859
857
  intlayerProxy(), // should be placed first
860
858
  reactRouter(),
861
- tsconfigPaths(),
859
+
862
860
  intlayer(),
863
861
  ],
864
862
  });