@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.
- package/docs/ar/intlayer_with_react_router_v7.md +2 -4
- package/docs/ar/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/ar/intlayer_with_svelte_kit.md +2 -2
- package/docs/ar/intlayer_with_tanstack+solid.md +0 -17
- package/docs/ar/intlayer_with_tanstack.md +0 -8
- package/docs/ar/intlayer_with_vite+lit.md +0 -1
- package/docs/ar/intlayer_with_vite+solid.md +0 -1
- package/docs/ar/intlayer_with_vite+svelte.md +1 -1
- package/docs/bn/intlayer_with_vite+lit.md +0 -1
- package/docs/cs/intlayer_with_vite+lit.md +0 -1
- package/docs/de/intlayer_with_react_router_v7.md +2 -4
- package/docs/de/intlayer_with_react_router_v7_fs_routes.md +1 -2
- package/docs/de/intlayer_with_svelte_kit.md +2 -2
- package/docs/de/intlayer_with_tanstack+solid.md +78 -21
- package/docs/de/intlayer_with_tanstack.md +96 -28
- package/docs/de/intlayer_with_vite+lit.md +0 -1
- package/docs/de/intlayer_with_vite+solid.md +0 -1
- package/docs/de/intlayer_with_vite+svelte.md +1 -1
- package/docs/en/intlayer_with_react_router_v7.md +1 -2
- package/docs/en/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/en/intlayer_with_svelte_kit.md +2 -2
- package/docs/en/intlayer_with_tanstack+solid.md +79 -19
- package/docs/en/intlayer_with_tanstack.md +81 -10
- package/docs/en/intlayer_with_vite+lit.md +0 -1
- package/docs/en/intlayer_with_vite+solid.md +0 -1
- package/docs/en/intlayer_with_vite+svelte.md +5 -6
- package/docs/en-GB/intlayer_with_react_router_v7.md +2 -4
- package/docs/en-GB/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/en-GB/intlayer_with_svelte_kit.md +2 -2
- package/docs/en-GB/intlayer_with_tanstack+solid.md +71 -17
- package/docs/en-GB/intlayer_with_tanstack.md +74 -9
- package/docs/en-GB/intlayer_with_vite+lit.md +0 -1
- package/docs/en-GB/intlayer_with_vite+solid.md +0 -1
- package/docs/en-GB/intlayer_with_vite+svelte.md +1 -1
- package/docs/es/intlayer_with_react_router_v7.md +2 -4
- package/docs/es/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/es/intlayer_with_svelte_kit.md +2 -2
- package/docs/es/intlayer_with_tanstack+solid.md +78 -21
- package/docs/es/intlayer_with_tanstack.md +96 -28
- package/docs/es/intlayer_with_vite+lit.md +0 -1
- package/docs/es/intlayer_with_vite+solid.md +0 -1
- package/docs/es/intlayer_with_vite+svelte.md +1 -1
- package/docs/fr/intlayer_with_react_router_v7.md +2 -4
- package/docs/fr/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/fr/intlayer_with_svelte_kit.md +3 -3
- package/docs/fr/intlayer_with_tanstack+solid.md +78 -21
- package/docs/fr/intlayer_with_tanstack.md +96 -28
- package/docs/fr/intlayer_with_vite+lit.md +0 -1
- package/docs/fr/intlayer_with_vite+solid.md +0 -1
- package/docs/fr/intlayer_with_vite+svelte.md +1 -1
- package/docs/hi/intlayer_with_react_router_v7.md +2 -4
- package/docs/hi/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/hi/intlayer_with_svelte_kit.md +2 -2
- package/docs/hi/intlayer_with_tanstack+solid.md +0 -17
- package/docs/hi/intlayer_with_tanstack.md +0 -8
- package/docs/hi/intlayer_with_vite+lit.md +0 -1
- package/docs/hi/intlayer_with_vite+solid.md +0 -1
- package/docs/hi/intlayer_with_vite+svelte.md +1 -1
- package/docs/id/intlayer_with_react_router_v7.md +2 -4
- package/docs/id/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/id/intlayer_with_svelte_kit.md +2 -2
- package/docs/id/intlayer_with_tanstack+solid.md +0 -17
- package/docs/id/intlayer_with_tanstack.md +0 -8
- package/docs/id/intlayer_with_vite+lit.md +0 -1
- package/docs/id/intlayer_with_vite+solid.md +0 -1
- package/docs/id/intlayer_with_vite+svelte.md +1 -1
- package/docs/it/intlayer_with_react_router_v7.md +2 -4
- package/docs/it/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/it/intlayer_with_svelte_kit.md +3 -3
- package/docs/it/intlayer_with_tanstack+solid.md +76 -19
- package/docs/it/intlayer_with_tanstack.md +96 -30
- package/docs/it/intlayer_with_vite+lit.md +0 -1
- package/docs/it/intlayer_with_vite+solid.md +0 -1
- package/docs/it/intlayer_with_vite+svelte.md +1 -1
- package/docs/ja/intlayer_with_react_router_v7.md +1 -2
- package/docs/ja/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/ja/intlayer_with_tanstack+solid.md +81 -22
- package/docs/ja/intlayer_with_tanstack.md +779 -93
- package/docs/ja/intlayer_with_vite+lit.md +0 -1
- package/docs/ja/intlayer_with_vite+solid.md +0 -1
- package/docs/ja/intlayer_with_vite+svelte.md +1 -1
- package/docs/ko/intlayer_with_react_router_v7.md +2 -4
- package/docs/ko/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/ko/intlayer_with_svelte_kit.md +2 -2
- package/docs/ko/intlayer_with_tanstack+solid.md +79 -22
- package/docs/ko/intlayer_with_tanstack.md +95 -101
- package/docs/ko/intlayer_with_vite+lit.md +0 -1
- package/docs/ko/intlayer_with_vite+solid.md +0 -1
- package/docs/ko/intlayer_with_vite+svelte.md +1 -1
- package/docs/nl/intlayer_with_vite+lit.md +0 -1
- package/docs/pl/intlayer_with_react_router_v7.md +2 -4
- package/docs/pl/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/pl/intlayer_with_svelte_kit.md +2 -2
- package/docs/pl/intlayer_with_tanstack+solid.md +0 -17
- package/docs/pl/intlayer_with_tanstack.md +0 -8
- package/docs/pl/intlayer_with_vite+lit.md +0 -1
- package/docs/pl/intlayer_with_vite+solid.md +0 -1
- package/docs/pl/intlayer_with_vite+svelte.md +1 -1
- package/docs/pt/intlayer_with_react_router_v7.md +1 -2
- package/docs/pt/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/pt/intlayer_with_svelte_kit.md +3 -3
- package/docs/pt/intlayer_with_tanstack+solid.md +76 -19
- package/docs/pt/intlayer_with_tanstack.md +96 -30
- package/docs/pt/intlayer_with_vite+lit.md +0 -1
- package/docs/pt/intlayer_with_vite+solid.md +0 -1
- package/docs/pt/intlayer_with_vite+svelte.md +1 -1
- package/docs/ru/intlayer_with_react_router_v7.md +2 -4
- package/docs/ru/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/ru/intlayer_with_svelte_kit.md +2 -2
- package/docs/ru/intlayer_with_tanstack+solid.md +78 -21
- package/docs/ru/intlayer_with_tanstack.md +99 -33
- package/docs/ru/intlayer_with_vite+lit.md +0 -1
- package/docs/ru/intlayer_with_vite+solid.md +0 -1
- package/docs/ru/intlayer_with_vite+svelte.md +1 -1
- package/docs/tr/intlayer_with_react_router_v7.md +2 -4
- package/docs/tr/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/tr/intlayer_with_svelte_kit.md +2 -2
- package/docs/tr/intlayer_with_tanstack+solid.md +0 -17
- package/docs/tr/intlayer_with_tanstack.md +0 -8
- package/docs/tr/intlayer_with_vite+lit.md +0 -1
- package/docs/tr/intlayer_with_vite+solid.md +0 -1
- package/docs/tr/intlayer_with_vite+svelte.md +1 -1
- package/docs/uk/intlayer_with_react_router_v7.md +1 -2
- package/docs/uk/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/uk/intlayer_with_svelte_kit.md +2 -2
- package/docs/uk/intlayer_with_tanstack+solid.md +0 -17
- package/docs/uk/intlayer_with_tanstack.md +0 -8
- package/docs/uk/intlayer_with_vite+lit.md +0 -1
- package/docs/uk/intlayer_with_vite+solid.md +0 -1
- package/docs/uk/intlayer_with_vite+svelte.md +1 -1
- package/docs/ur/intlayer_with_vite+lit.md +0 -1
- package/docs/vi/intlayer_with_react_router_v7.md +2 -4
- package/docs/vi/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/vi/intlayer_with_svelte_kit.md +2 -2
- package/docs/vi/intlayer_with_tanstack+solid.md +0 -17
- package/docs/vi/intlayer_with_tanstack.md +0 -8
- package/docs/vi/intlayer_with_vite+lit.md +0 -1
- package/docs/vi/intlayer_with_vite+solid.md +0 -1
- package/docs/vi/intlayer_with_vite+svelte.md +1 -1
- package/docs/zh/intlayer_with_react_router_v7.md +2 -4
- package/docs/zh/intlayer_with_react_router_v7_fs_routes.md +2 -4
- package/docs/zh/intlayer_with_svelte_kit.md +2 -2
- package/docs/zh/intlayer_with_tanstack+solid.md +80 -23
- package/docs/zh/intlayer_with_tanstack.md +96 -104
- package/docs/zh/intlayer_with_vite+lit.md +0 -1
- package/docs/zh/intlayer_with_vite+solid.md +0 -1
- package/docs/zh/intlayer_with_vite+svelte.md +1 -1
- package/package.json +8 -8
|
@@ -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
|
|
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(),
|
|
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
|
-
|
|
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(),
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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-
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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-
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
### (선택 사항)
|
|
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
|
-
|
|
914
|
-
|
|
915
|
-
```
|
|
830
|
+
</Tab>
|
|
831
|
+
</Tabs>
|
|
916
832
|
|
|
917
|
-
|
|
918
|
-
pnpm run build # 또는 pnpm run dev
|
|
919
|
-
```
|
|
833
|
+
---
|
|
920
834
|
|
|
921
|
-
|
|
922
|
-
|
|
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
|
-
|
|
926
|
-
|
|
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
|
-
|
|
930
|
-
|
|
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
|
|
|
@@ -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
|
|
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(),
|
|
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
|
-
|
|
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(),
|
|
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
|
-
|
|
859
|
+
|
|
862
860
|
intlayer(),
|
|
863
861
|
],
|
|
864
862
|
});
|