@intlayer/docs 8.6.0 → 8.6.10
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/dist/cjs/doc.cjs.map +1 -1
- package/dist/cjs/generated/docs.entry.cjs +60 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/doc.mjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +60 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/doc.d.ts.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +3 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/cli/index.md +54 -42
- package/docs/ar/cli/init.md +32 -20
- package/docs/ar/cli/standalone.md +91 -0
- package/docs/ar/configuration.md +39 -7
- package/docs/ar/custom_domains.md +250 -0
- package/docs/ar/intlayer_with_tanstack+solid.md +14 -33
- package/docs/ar/intlayer_with_tanstack.md +25 -16
- package/docs/ar/intlayer_with_vanilla.md +506 -0
- package/docs/bn/cli/index.md +195 -0
- package/docs/bn/cli/init.md +96 -0
- package/docs/bn/cli/standalone.md +91 -0
- package/docs/bn/configuration.md +46 -14
- package/docs/bn/custom_domains.md +250 -0
- package/docs/bn/intlayer_with_vanilla.md +506 -0
- package/docs/cs/cli/index.md +195 -0
- package/docs/cs/cli/init.md +96 -0
- package/docs/cs/cli/standalone.md +91 -0
- package/docs/cs/configuration.md +46 -7
- package/docs/cs/custom_domains.md +250 -0
- package/docs/cs/intlayer_with_vanilla.md +506 -0
- package/docs/de/cli/index.md +53 -41
- package/docs/de/cli/standalone.md +91 -0
- package/docs/de/configuration.md +46 -7
- package/docs/de/custom_domains.md +250 -0
- package/docs/de/intlayer_with_tanstack+solid.md +15 -36
- package/docs/de/intlayer_with_tanstack.md +25 -16
- package/docs/de/intlayer_with_vanilla.md +506 -0
- package/docs/en/bundle_optimization.md +288 -23
- package/docs/en/cli/index.md +6 -1
- package/docs/en/cli/init.md +13 -1
- package/docs/en/cli/standalone.md +91 -0
- package/docs/en/configuration.md +46 -7
- package/docs/en/custom_domains.md +245 -0
- package/docs/en/intlayer_with_tanstack+solid.md +15 -36
- package/docs/en/intlayer_with_tanstack.md +25 -16
- package/docs/en/intlayer_with_vanilla.md +506 -0
- package/docs/en-GB/cli/index.md +56 -44
- package/docs/en-GB/cli/init.md +28 -21
- package/docs/en-GB/cli/standalone.md +91 -0
- package/docs/en-GB/configuration.md +53 -14
- package/docs/en-GB/custom_domains.md +250 -0
- package/docs/en-GB/intlayer_with_tanstack+solid.md +15 -36
- package/docs/en-GB/intlayer_with_tanstack.md +25 -16
- package/docs/en-GB/intlayer_with_vanilla.md +506 -0
- package/docs/es/cli/index.md +65 -53
- package/docs/es/cli/init.md +33 -21
- package/docs/es/cli/standalone.md +91 -0
- package/docs/es/configuration.md +39 -1
- package/docs/es/custom_domains.md +250 -0
- package/docs/es/intlayer_with_tanstack+solid.md +15 -36
- package/docs/es/intlayer_with_tanstack.md +25 -16
- package/docs/es/intlayer_with_vanilla.md +506 -0
- package/docs/fr/cli/index.md +43 -31
- package/docs/fr/cli/init.md +37 -25
- package/docs/fr/cli/standalone.md +91 -0
- package/docs/fr/configuration.md +46 -7
- package/docs/fr/custom_domains.md +250 -0
- package/docs/fr/intlayer_with_tanstack+solid.md +15 -36
- package/docs/fr/intlayer_with_tanstack.md +25 -16
- package/docs/fr/intlayer_with_vanilla.md +506 -0
- package/docs/hi/cli/index.md +71 -59
- package/docs/hi/cli/init.md +37 -33
- package/docs/hi/cli/standalone.md +91 -0
- package/docs/hi/configuration.md +39 -7
- package/docs/hi/custom_domains.md +250 -0
- package/docs/hi/intlayer_with_tanstack+solid.md +14 -33
- package/docs/hi/intlayer_with_tanstack.md +25 -16
- package/docs/hi/intlayer_with_vanilla.md +506 -0
- package/docs/id/cli/index.md +59 -47
- package/docs/id/cli/init.md +32 -25
- package/docs/id/cli/standalone.md +91 -0
- package/docs/id/configuration.md +46 -7
- package/docs/id/custom_domains.md +250 -0
- package/docs/id/intlayer_with_tanstack+solid.md +14 -33
- package/docs/id/intlayer_with_tanstack.md +25 -16
- package/docs/id/intlayer_with_vanilla.md +506 -0
- package/docs/it/cli/index.md +58 -41
- package/docs/it/cli/init.md +37 -38
- package/docs/it/cli/standalone.md +91 -0
- package/docs/it/configuration.md +46 -7
- package/docs/it/custom_domains.md +250 -0
- package/docs/it/intlayer_with_tanstack+solid.md +15 -36
- package/docs/it/intlayer_with_tanstack.md +25 -16
- package/docs/it/intlayer_with_vanilla.md +506 -0
- package/docs/ja/cli/index.md +59 -47
- package/docs/ja/cli/init.md +36 -24
- package/docs/ja/cli/standalone.md +91 -0
- package/docs/ja/configuration.md +46 -7
- package/docs/ja/custom_domains.md +250 -0
- package/docs/ja/intlayer_with_tanstack+solid.md +15 -36
- package/docs/ja/intlayer_with_tanstack.md +25 -16
- package/docs/ja/intlayer_with_vanilla.md +506 -0
- package/docs/ko/cli/index.md +58 -46
- package/docs/ko/cli/init.md +39 -35
- package/docs/ko/cli/standalone.md +91 -0
- package/docs/ko/configuration.md +47 -8
- package/docs/ko/custom_domains.md +250 -0
- package/docs/ko/intlayer_with_tanstack+solid.md +15 -36
- package/docs/ko/intlayer_with_tanstack.md +25 -16
- package/docs/ko/intlayer_with_vanilla.md +506 -0
- package/docs/nl/cli/index.md +195 -0
- package/docs/nl/cli/init.md +96 -0
- package/docs/nl/cli/standalone.md +91 -0
- package/docs/nl/configuration.md +46 -7
- package/docs/nl/custom_domains.md +250 -0
- package/docs/nl/intlayer_with_vanilla.md +506 -0
- package/docs/pl/cli/index.md +56 -44
- package/docs/pl/cli/init.md +36 -32
- package/docs/pl/cli/standalone.md +91 -0
- package/docs/pl/configuration.md +46 -7
- package/docs/pl/custom_domains.md +250 -0
- package/docs/pl/intlayer_with_tanstack+solid.md +14 -33
- package/docs/pl/intlayer_with_tanstack.md +25 -16
- package/docs/pl/intlayer_with_vanilla.md +506 -0
- package/docs/pt/cli/index.md +64 -52
- package/docs/pt/cli/init.md +35 -31
- package/docs/pt/cli/standalone.md +91 -0
- package/docs/pt/configuration.md +46 -7
- package/docs/pt/custom_domains.md +250 -0
- package/docs/pt/intlayer_with_tanstack+solid.md +15 -36
- package/docs/pt/intlayer_with_tanstack.md +25 -16
- package/docs/pt/intlayer_with_vanilla.md +506 -0
- package/docs/ru/cli/index.md +54 -42
- package/docs/ru/cli/init.md +31 -27
- package/docs/ru/cli/standalone.md +91 -0
- package/docs/ru/configuration.md +46 -7
- package/docs/ru/custom_domains.md +250 -0
- package/docs/ru/intlayer_with_tanstack+solid.md +15 -36
- package/docs/ru/intlayer_with_tanstack.md +25 -16
- package/docs/ru/intlayer_with_vanilla.md +506 -0
- package/docs/tr/cli/index.md +64 -52
- package/docs/tr/cli/init.md +37 -30
- package/docs/tr/cli/standalone.md +91 -0
- package/docs/tr/configuration.md +46 -7
- package/docs/tr/custom_domains.md +250 -0
- package/docs/tr/intlayer_with_tanstack+solid.md +14 -33
- package/docs/tr/intlayer_with_tanstack.md +25 -16
- package/docs/tr/intlayer_with_vanilla.md +506 -0
- package/docs/uk/cli/index.md +60 -55
- package/docs/uk/cli/init.md +32 -20
- package/docs/uk/cli/standalone.md +91 -0
- package/docs/uk/configuration.md +46 -7
- package/docs/uk/custom_domains.md +250 -0
- package/docs/uk/intlayer_with_tanstack+solid.md +14 -33
- package/docs/uk/intlayer_with_tanstack.md +25 -16
- package/docs/uk/intlayer_with_vanilla.md +506 -0
- package/docs/ur/cli/index.md +195 -0
- package/docs/ur/cli/init.md +96 -0
- package/docs/ur/cli/standalone.md +91 -0
- package/docs/ur/configuration.md +46 -7
- package/docs/ur/custom_domains.md +250 -0
- package/docs/ur/intlayer_with_vanilla.md +506 -0
- package/docs/vi/cli/index.md +72 -61
- package/docs/vi/cli/init.md +33 -21
- package/docs/vi/cli/standalone.md +91 -0
- package/docs/vi/configuration.md +46 -7
- package/docs/vi/custom_domains.md +250 -0
- package/docs/vi/intlayer_with_tanstack+solid.md +14 -33
- package/docs/vi/intlayer_with_tanstack.md +25 -16
- package/docs/vi/intlayer_with_vanilla.md +506 -0
- package/docs/zh/cli/index.md +56 -49
- package/docs/zh/cli/init.md +30 -18
- package/docs/zh/cli/standalone.md +91 -0
- package/docs/zh/configuration.md +46 -7
- package/docs/zh/custom_domains.md +250 -0
- package/docs/zh/intlayer_with_tanstack+solid.md +15 -36
- package/docs/zh/intlayer_with_tanstack.md +25 -16
- package/docs/zh/intlayer_with_vanilla.md +506 -0
- package/package.json +8 -8
- package/src/doc.ts +4 -1
- package/src/generated/docs.entry.ts +60 -0
- package/docs/ar/bundle_optimization.md +0 -185
- package/docs/de/bundle_optimization.md +0 -195
- package/docs/en-GB/bundle_optimization.md +0 -184
- package/docs/es/bundle_optimization.md +0 -194
- package/docs/fr/bundle_optimization.md +0 -184
- package/docs/hi/bundle_optimization.md +0 -185
- package/docs/id/bundle_optimization.md +0 -185
- package/docs/it/bundle_optimization.md +0 -185
- package/docs/ja/bundle_optimization.md +0 -185
- package/docs/ko/bundle_optimization.md +0 -185
- package/docs/pl/bundle_optimization.md +0 -185
- package/docs/pt/bundle_optimization.md +0 -184
- package/docs/ru/bundle_optimization.md +0 -185
- package/docs/tr/bundle_optimization.md +0 -184
- package/docs/uk/bundle_optimization.md +0 -186
- package/docs/vi/bundle_optimization.md +0 -185
- package/docs/zh/bundle_optimization.md +0 -185
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-04-02
|
|
3
|
+
updatedAt: 2026-04-02
|
|
4
|
+
title: कस्टम डोमेन (Custom Domains)
|
|
5
|
+
description: समर्पित होस्टनेम से विभिन्न लोकेल (locales) की सेवा के लिए Intlayer में डोमेन-आधारित लोकेल रूटिंग कॉन्फ़िगर करना सीखें।
|
|
6
|
+
keywords:
|
|
7
|
+
- Custom Domains
|
|
8
|
+
- Domain Routing
|
|
9
|
+
- Routing
|
|
10
|
+
- Internationalization
|
|
11
|
+
- i18n
|
|
12
|
+
slugs:
|
|
13
|
+
- doc
|
|
14
|
+
- concept
|
|
15
|
+
- custom_domains
|
|
16
|
+
history:
|
|
17
|
+
- version: 8.5.0
|
|
18
|
+
date: 2026-04-02
|
|
19
|
+
changes: "routing.domains कॉन्फ़िगरेशन के माध्यम से डोमेन-आधारित लोकेल रूटिंग जोड़ी गई।"
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
# कस्टम डोमेन (Custom Domains)
|
|
23
|
+
|
|
24
|
+
Intlayer डोमेन-आधारित लोकेल रूटिंग का समर्थन करता है, जिससे आप समर्पित होस्टनेम से विशिष्ट लोकेल की सेवा कर सकते हैं। उदाहरण के लिए, चीनी आगंतुकों को `intlayer.org/zh` के बजाय `intlayer.zh` पर निर्देशित किया जा सकता है।
|
|
25
|
+
|
|
26
|
+
## यह कैसे काम करता है
|
|
27
|
+
|
|
28
|
+
`routing` में `domains` मैप प्रत्येक लोकेल को एक होस्टनेम के साथ जोड़ता है। Intlayer इस मैप का उपयोग दो स्थानों पर करता है:
|
|
29
|
+
|
|
30
|
+
1. **URL जनरेशन** (`getLocalizedUrl`): जब लक्ष्य लोकेल वर्तमान पेज की तुलना में _अलग_ डोमेन पर होता है, तो एक पूर्ण (absolute) URL लौटाया जाता है (जैसे `https://intlayer.zh/about`)। जब दोनों डोमेन मैच करते हैं, तो एक सापेक्ष (relative) URL लौटाया जाता है (जैसे `/fr/about`)।
|
|
31
|
+
2. **सर्वर प्रॉक्सी** (Next.js और Vite): आने वाले अनुरोधों को उस डोमेन के आधार पर रीडायरेक्ट या रीराइट किया जाता है जिस पर वे आते हैं।
|
|
32
|
+
|
|
33
|
+
### विशेष बनाम साझा डोमेन (Exclusive vs. shared domains)
|
|
34
|
+
|
|
35
|
+
मुख्य अंतर **विशेषता (exclusivity)** है:
|
|
36
|
+
|
|
37
|
+
- **विशेष डोमेन (Exclusive domain)** — केवल एक लोकेल उस होस्टनेम पर मैप होता है (जैसे `zh → intlayer.zh`)। डोमेन स्वयं लोकेल की पहचान करता है, इसलिए पथ (path) में कोई लोकेल उपसर्ग (prefix) नहीं जोड़ा जाता है। `https://intlayer.zh/about` चीनी सामग्री परोसता है।
|
|
38
|
+
- **साझा डोमेन (Shared domain)** — एक ही होस्टनेम पर कई लोकेल मैप होते हैं (जैसे `en` और `fr` दोनों `intlayer.org` पर मैप होते हैं)। सामान्य उपसर्ग-आधारित रूटिंग लागू होती है। `intlayer.org/fr/about` फ्रांसीसी सामग्री परोसता है।
|
|
39
|
+
|
|
40
|
+
## कॉन्फ़िगरेशन
|
|
41
|
+
|
|
42
|
+
```typescript fileName="intlayer.config.ts"
|
|
43
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
44
|
+
|
|
45
|
+
const config: IntlayerConfig = {
|
|
46
|
+
internationalization: {
|
|
47
|
+
locales: [
|
|
48
|
+
Locales.ENGLISH,
|
|
49
|
+
Locales.FRENCH,
|
|
50
|
+
Locales.SPANISH,
|
|
51
|
+
Locales.CHINESE,
|
|
52
|
+
],
|
|
53
|
+
defaultLocale: Locales.ENGLISH,
|
|
54
|
+
},
|
|
55
|
+
routing: {
|
|
56
|
+
mode: "prefix-no-default",
|
|
57
|
+
domains: {
|
|
58
|
+
// साझा डोमेन — en और fr intlayer.org पर उपसर्ग रूटिंग का उपयोग करते हैं
|
|
59
|
+
en: "intlayer.org",
|
|
60
|
+
// विशेष डोमेन — zh का अपना होस्टनेम है, किसी /zh/ उपसर्ग की आवश्यकता नहीं है
|
|
61
|
+
zh: "intlayer.zh",
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export default config;
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
जो लोकेल `domains` में सूचीबद्ध नहीं हैं, वे बिना किसी डोमेन ओवरराइड के मानक उपसर्ग रूटिंग का उपयोग करना जारी रखते हैं।
|
|
70
|
+
|
|
71
|
+
## URL जनरेशन
|
|
72
|
+
|
|
73
|
+
`getLocalizedUrl` कॉल के संदर्भ के आधार पर स्वचालित रूप से सही URL प्रकार उत्पन्न करता है।
|
|
74
|
+
|
|
75
|
+
### समान-डोमेन लोकेल (relative URL)
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
// वर्तमान पेज: intlayer.org/about
|
|
79
|
+
getLocalizedUrl("/about", "fr", { currentDomain: "intlayer.org" });
|
|
80
|
+
// → "/fr/about"
|
|
81
|
+
|
|
82
|
+
getLocalizedUrl("/about", "en", { currentDomain: "intlayer.org" });
|
|
83
|
+
// → "/about" (डिफ़ॉल्ट लोकेल, कोई उपसर्ग नहीं)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### क्रॉस-डोमेन लोकेल (absolute URL)
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
// वर्तमान पेज: intlayer.org/about
|
|
90
|
+
getLocalizedUrl("/about", "zh", { currentDomain: "intlayer.org" });
|
|
91
|
+
// → "https://intlayer.zh/about" (विशेष डोमेन, कोई /zh/ उपसर्ग नहीं)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### लोकेल के अपने डोमेन से सेवा करना
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
// वर्तमान पेज: intlayer.zh/about
|
|
98
|
+
getLocalizedUrl("/about", "zh", { currentDomain: "intlayer.zh" });
|
|
99
|
+
// → "/about" (पहले से ही सही डोमेन पर है — सापेक्ष URL)
|
|
100
|
+
|
|
101
|
+
getLocalizedUrl("/about", "fr", { currentDomain: "intlayer.zh" });
|
|
102
|
+
// → "https://intlayer.org/fr/about" (intlayer.org पर वापस क्रॉस-डोमेन लिंक)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### वर्तमान डोमेन ऑटो-डिटेक्शन
|
|
106
|
+
|
|
107
|
+
`currentDomain` वैकल्पिक है। छोड़े जाने पर, `getLocalizedUrl` इसे इस क्रम में हल करता है:
|
|
108
|
+
|
|
109
|
+
1. पूर्ण इनपुट URL का होस्टनेम (जैसे `https://intlayer.org/about` → `intlayer.org`)।
|
|
110
|
+
2. ब्राउज़र वातावरण में `window.location.hostname` ।
|
|
111
|
+
3. यदि कोई भी उपलब्ध नहीं है (बिना स्पष्ट विकल्प के SSR), तो समान-डोमेन लोकेल के लिए एक सापेक्ष URL लौटाया जाता है और कोई पूर्ण URL उत्पन्न नहीं होता है — यह सुरक्षित फॉलबैक है।
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
// ब्राउज़र — window.location.hostname === 'intlayer.org'
|
|
115
|
+
getLocalizedUrl("/about", "zh");
|
|
116
|
+
// → "https://intlayer.zh/about" (विंडो से ऑटो-डिटेक्टेड)
|
|
117
|
+
|
|
118
|
+
// पूर्ण URL से — डोमेन स्वचालित रूप से डिटेक्ट हो गया
|
|
119
|
+
getLocalizedUrl("https://intlayer.org/about", "zh");
|
|
120
|
+
// → "https://intlayer.zh/about"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### डोमेन के साथ `getMultilingualUrls`
|
|
124
|
+
|
|
125
|
+
`getMultilingualUrls` प्रत्येक लोकेल के लिए `getLocalizedUrl` कॉल करता है, इसलिए यह कॉलर के डोमेन के आधार पर सापेक्ष और पूर्ण URL का मिश्रण उत्पन्न करता है:
|
|
126
|
+
|
|
127
|
+
```ts
|
|
128
|
+
// currentDomain: 'intlayer.org'
|
|
129
|
+
getMultilingualUrls("/about", { currentDomain: "intlayer.org" });
|
|
130
|
+
// {
|
|
131
|
+
// en: "/about",
|
|
132
|
+
// fr: "/fr/about",
|
|
133
|
+
// es: "/es/about",
|
|
134
|
+
// zh: "https://intlayer.zh/about",
|
|
135
|
+
// }
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
ये पूर्ण URL SEO के लिए `<link rel="alternate" hreflang="...">` टैग में उपयोग करने के लिए तैयार हैं।
|
|
139
|
+
|
|
140
|
+
## प्रॉक्सी व्यवहार (Proxy Behaviour)
|
|
141
|
+
|
|
142
|
+
### Next.js
|
|
143
|
+
|
|
144
|
+
`intlayerProxy` मिडलवेयर डोमेन रूटिंग को स्वचालित रूप से संभालता है। इसे अपने `middleware.ts` में जोड़ें:
|
|
145
|
+
|
|
146
|
+
```typescript fileName="middleware.ts"
|
|
147
|
+
export { intlayerProxy as default } from "next-intlayer/proxy";
|
|
148
|
+
|
|
149
|
+
export const config = {
|
|
150
|
+
matcher: "/((?!api|static|assets|robots|sitemap|.*\\..*|_next).*)",
|
|
151
|
+
};
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**रीडायरेक्ट (Redirect)** — अनुरोध किसी दिए गए लोकेल उपसर्ग के लिए गलत डोमेन पर आता है:
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
GET intlayer.org/zh/about
|
|
158
|
+
→ 301 https://intlayer.zh/about
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**रीराइट (Rewrite)** — अनुरोध बिना उपसर्ग के लोकेल के विशेष डोमेन पर आता है:
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
GET intlayer.zh/about
|
|
165
|
+
→ /zh/about पर रीराइट (केवल आंतरिक Next.js रूटिंग, URL साफ रहता है)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Vite
|
|
169
|
+
|
|
170
|
+
`intlayerProxy` Vite प्लगइन विकास के दौरान समान तर्क लागू करता है:
|
|
171
|
+
|
|
172
|
+
```typescript fileName="vite.config.ts"
|
|
173
|
+
import { defineConfig } from "vite";
|
|
174
|
+
import { intlayerProxy } from "vite-intlayer";
|
|
175
|
+
|
|
176
|
+
export default defineConfig({
|
|
177
|
+
plugins: [intlayerProxy()],
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
> **नोट**: स्थानीय विकास में आप आमतौर पर `localhost` पर होते हैं, इसलिए क्रॉस-डोमेन रीडायरेक्ट किसी अन्य स्थानीय पोर्ट के बजाय लाइव डोमेन की ओर इशारा करेंगे। यदि आपको स्थानीय रूप से मल्टी-डोमेन रूटिंग का परीक्षण करने की आवश्यकता है, तो hosts-फ़ाइल ओवरराइड (जैसे `127.0.0.1 intlayer.zh`) या रिवर्स प्रॉक्सी का उपयोग करें।
|
|
182
|
+
|
|
183
|
+
## लोकेल स्विचर (Locale Switcher)
|
|
184
|
+
|
|
185
|
+
`next-intlayer` का `useLocale` हुक डोमेन-जागरूक नेविगेशन को स्वचालित रूप से संभालता है। जब कोई उपयोगकर्ता किसी दूसरे डोमेन पर लोकेल पर स्विच करता है, तो हुक क्लाइंट-साइड राउटर पुश के बजाय पूर्ण-पेज नेविगेशन (`window.location.href`) करता है, क्योंकि Next.js राउटर ओरिजिन (origins) को पार नहीं कर सकता है।
|
|
186
|
+
|
|
187
|
+
```tsx fileName="components/LocaleSwitcher.tsx"
|
|
188
|
+
"use client";
|
|
189
|
+
|
|
190
|
+
import { useLocale } from "next-intlayer";
|
|
191
|
+
|
|
192
|
+
export const LocaleSwitcher = () => {
|
|
193
|
+
const { availableLocales, locale, setLocale } = useLocale();
|
|
194
|
+
|
|
195
|
+
return (
|
|
196
|
+
<ul>
|
|
197
|
+
{availableLocales.map((localeEl) => (
|
|
198
|
+
<li key={localeEl}>
|
|
199
|
+
<button
|
|
200
|
+
onClick={() => setLocale(localeEl)}
|
|
201
|
+
aria-current={localeEl === locale ? "true" : undefined}
|
|
202
|
+
>
|
|
203
|
+
{l.toUpperCase()}
|
|
204
|
+
</button>
|
|
205
|
+
</li>
|
|
206
|
+
))}
|
|
207
|
+
</ul>
|
|
208
|
+
);
|
|
209
|
+
};
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
किसी अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं है — `useLocale` आंतरिक रूप से `window.location.hostname` का पता लगाता है और `router.replace` (समान डोमेन) और `window.location.href` (क्रॉस-डोमेन) के बीच निर्णय लेता है।
|
|
213
|
+
|
|
214
|
+
## SEO: `hreflang` वैकल्पिक लिंक
|
|
215
|
+
|
|
216
|
+
डोमेन-आधारित रूटिंग का उपयोग आमतौर पर `hreflang` के साथ खोज इंजन को यह बताने के लिए किया जाता है कि प्रत्येक भाषा के लिए किस URL को इंडेक्स करना है। वैकल्पिक URL का पूरा सेट उत्पन्न करने के लिए `getMultilingualUrls` का उपयोग करें:
|
|
217
|
+
|
|
218
|
+
```tsx fileName="app/[locale]/layout.tsx"
|
|
219
|
+
import { getMultilingualUrls } from "intlayer";
|
|
220
|
+
import type { Metadata } from "next";
|
|
221
|
+
|
|
222
|
+
export const generateMetadata = (): Metadata => {
|
|
223
|
+
const alternates = getMultilingualUrls("/", {
|
|
224
|
+
currentDomain: process.env.NEXT_PUBLIC_DOMAIN, // जैसे "intlayer.org"
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
alternates: {
|
|
229
|
+
languages: alternates,
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
};
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
यह उत्पन्न करता है:
|
|
236
|
+
|
|
237
|
+
```html
|
|
238
|
+
<link rel="alternate" hreflang="en" href="https://intlayer.org/" />
|
|
239
|
+
<link rel="alternate" hreflang="fr" href="https://intlayer.org/fr/" />
|
|
240
|
+
<link rel="alternate" hreflang="es" href="https://intlayer.org/es/" />
|
|
241
|
+
<link rel="alternate" hreflang="zh" href="https://intlayer.zh/" />
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## मुख्य उपयोगिताएँ (Core Utilities)
|
|
245
|
+
|
|
246
|
+
| उपयोगिता (Utility) | विवरण |
|
|
247
|
+
| ------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
|
|
248
|
+
| `getLocalizedUrl(url, locale, { currentDomain })` | सापेक्ष या पूर्ण URL लौटाता है, यह इस पर निर्भर करता है कि लक्ष्य लोकेल वर्तमान डोमेन पर है या नहीं। |
|
|
249
|
+
| `getMultilingualUrls(url, { currentDomain })` | लोकेल-कीड (locale-keyed) मैप लौटाता है, जिसमें आवश्यकतानुसार सापेक्ष और पूर्ण URL मिश्रित होते हैं। |
|
|
250
|
+
| `getPrefix(locale, { domains })` | विशेष-डोमेन लोकेल के लिए एक खाली उपसर्ग लौटाता है, अन्यथा सामान्य उपसर्ग। |
|
|
@@ -16,6 +16,7 @@ slugs:
|
|
|
16
16
|
- doc
|
|
17
17
|
- environment
|
|
18
18
|
- tanstack-start
|
|
19
|
+
- solid
|
|
19
20
|
applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-solid-template
|
|
20
21
|
youtubeVideo: https://www.youtube.com/watch?v=_XTdKVWaeqg
|
|
21
22
|
history:
|
|
@@ -162,59 +163,45 @@ export default defineConfig({
|
|
|
162
163
|
|
|
163
164
|
### स्टेप 5: रूट लेआउट बनाएं
|
|
164
165
|
|
|
165
|
-
वर्तमान लोकेल का पता लगाने के लिए `
|
|
166
|
+
वर्तमान लोकेल का पता लगाने के लिए `useParams` का उपयोग करके और `html` टैग पर `lang` और `dir` विशेषताओं को सेट करके अंतर्राष्ट्रीयकरण का समर्थन करने के लिए अपना रूट लेआउट कॉन्फ़िगर करें।
|
|
166
167
|
|
|
167
168
|
```tsx fileName="src/routes/__root.tsx"
|
|
168
169
|
import {
|
|
169
170
|
HeadContent,
|
|
170
|
-
Outlet,
|
|
171
171
|
Scripts,
|
|
172
172
|
createRootRouteWithContext,
|
|
173
|
-
useMatches,
|
|
174
173
|
} from "@tanstack/solid-router";
|
|
175
|
-
import { TanStackRouterDevtools } from "@tanstack/solid-router-devtools";
|
|
176
174
|
import { HydrationScript } from "solid-js/web";
|
|
177
|
-
import { Suspense } from "solid-js";
|
|
175
|
+
import { Suspense, type ParentComponent } from "solid-js";
|
|
178
176
|
import { IntlayerProvider } from "solid-intlayer";
|
|
179
|
-
import { defaultLocale, getHTMLTextDir
|
|
177
|
+
import { defaultLocale, getHTMLTextDir } from "intlayer";
|
|
178
|
+
import { Route as LocaleRoute } from "./{-$locale}/route";
|
|
180
179
|
|
|
181
180
|
export const Route = createRootRouteWithContext()({
|
|
182
181
|
shellComponent: RootComponent,
|
|
183
182
|
});
|
|
184
183
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
function RootComponent() {
|
|
190
|
-
const matches = useMatches();
|
|
191
|
-
|
|
192
|
-
// किसी भी सक्रिय मिलान के मापदंडों में लोकेल खोजने का प्रयास करें
|
|
193
|
-
// यह मानता है कि आप अपने रूट ट्री में गतिशील खंड "/{-$locale}" का उपयोग करते हैं
|
|
194
|
-
const locale =
|
|
195
|
-
(
|
|
196
|
-
matches().find((match) => match.routeId === "/{-$locale}/")
|
|
197
|
-
?.params as Params
|
|
198
|
-
)?.locale ?? defaultLocale;
|
|
184
|
+
const RootComponent: ParentComponent = (props) => {
|
|
185
|
+
const params = LocaleRoute.useParams();
|
|
186
|
+
const locale = params()?.locale ?? defaultLocale;
|
|
199
187
|
|
|
200
188
|
return (
|
|
201
189
|
<html dir={getHTMLTextDir(locale)} lang={locale}>
|
|
202
190
|
<head>
|
|
203
191
|
<HydrationScript />
|
|
192
|
+
<HeadContent />
|
|
204
193
|
</head>
|
|
205
194
|
<body>
|
|
206
|
-
<HeadContent />
|
|
207
195
|
<IntlayerProvider locale={locale}>
|
|
208
196
|
<Suspense>
|
|
209
|
-
|
|
210
|
-
<TanStackRouterDevtools />
|
|
197
|
+
{props.children}
|
|
211
198
|
</Suspense>
|
|
212
199
|
</IntlayerProvider>
|
|
213
200
|
<Scripts />
|
|
214
201
|
</body>
|
|
215
202
|
</html>
|
|
216
203
|
);
|
|
217
|
-
}
|
|
204
|
+
};
|
|
218
205
|
```
|
|
219
206
|
|
|
220
207
|
### स्टेप 6: लोकेल लेआउट बनाएं (वैकल्पिक)
|
|
@@ -458,18 +445,12 @@ export default LocaleSwitcher;
|
|
|
458
445
|
|
|
459
446
|
### स्टेप 11: HTML विशेषताओं का प्रबंधन
|
|
460
447
|
|
|
461
|
-
जैसा कि स्टेप 5 में देखा गया है, आप अपने रूट घटक में `
|
|
448
|
+
जैसा कि स्टेप 5 में देखा गया है, आप अपने रूट घटक में `useParams` का उपयोग करके `html` टैग की `lang` और `dir` विशेषताओं को प्रबंधित कर सकते हैं। यह सुनिश्चित करता है कि सर्वर और क्लाइंट दोनों पर सही विशेषताएँ सेट हैं।
|
|
462
449
|
|
|
463
450
|
```tsx fileName="src/routes/__root.tsx"
|
|
464
451
|
const RootComponent: ParentComponent = (props) => {
|
|
465
|
-
const
|
|
466
|
-
|
|
467
|
-
// किसी भी सक्रिय मिलान के मापदंडों में लोकेल खोजने का प्रयास करें
|
|
468
|
-
const locale =
|
|
469
|
-
(
|
|
470
|
-
matches().find((match) => match.routeId === "/{-$locale}/")
|
|
471
|
-
?.params as Params
|
|
472
|
-
)?.locale ?? defaultLocale;
|
|
452
|
+
const params = LocaleRoute.useParams();
|
|
453
|
+
const locale = params()?.locale ?? defaultLocale;
|
|
473
454
|
|
|
474
455
|
return (
|
|
475
456
|
<html dir={getHTMLTextDir(locale)} lang={locale}>
|
|
@@ -182,31 +182,41 @@ export default config;
|
|
|
182
182
|
|
|
183
183
|
### चरण 5: रूट लेआउट बनाएं
|
|
184
184
|
|
|
185
|
-
वर्तमान लोकेल का पता लगाने के लिए `
|
|
185
|
+
वर्तमान लोकेल का पता लगाने के लिए `useParams` का उपयोग करके और `html` टैग पर `lang` और `dir` विशेषताओं को सेट करके अंतर्राष्ट्रीयकरण का समर्थन करने के लिए अपने रूट लेआउट को कॉन्फ़िगर करें।
|
|
186
186
|
|
|
187
187
|
```tsx fileName="src/routes/__root.tsx"
|
|
188
188
|
import {
|
|
189
189
|
createRootRouteWithContext,
|
|
190
190
|
HeadContent,
|
|
191
|
-
Outlet,
|
|
192
191
|
Scripts,
|
|
193
|
-
useMatches,
|
|
194
192
|
} from "@tanstack/react-router";
|
|
195
193
|
import { defaultLocale, getHTMLTextDir } from "intlayer";
|
|
196
194
|
import { type ReactNode } from "react";
|
|
197
195
|
import { IntlayerProvider } from "react-intlayer";
|
|
196
|
+
import { Route as LocaleRoute } from "./{-$locale}/route";
|
|
198
197
|
|
|
199
198
|
export const Route = createRootRouteWithContext<{}>()({
|
|
199
|
+
head: () => ({
|
|
200
|
+
meta: [
|
|
201
|
+
{
|
|
202
|
+
charSet: "utf-8",
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
content: "width=device-width, initial-scale=1",
|
|
206
|
+
name: "viewport",
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
title: "TanStack Start Starter",
|
|
210
|
+
},
|
|
211
|
+
],
|
|
212
|
+
}),
|
|
213
|
+
|
|
200
214
|
shellComponent: RootDocument,
|
|
201
215
|
});
|
|
202
216
|
|
|
203
217
|
function RootDocument({ children }: { children: ReactNode }) {
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
// किसी भी सक्रिय मैच के मापदंडों में लोकेल खोजने का प्रयास करें
|
|
207
|
-
// यह मानता है कि आप अपनी रूट ट्री में गतिशील खंड "/{-$locale}" का उपयोग करते हैं
|
|
208
|
-
const localeRoute = matches.find((match) => match.routeId === "/{-$locale}");
|
|
209
|
-
const locale = localeRoute?.params?.locale ?? defaultLocale;
|
|
218
|
+
const params = LocaleRoute.useParams();
|
|
219
|
+
const locale = params?.locale ?? defaultLocale;
|
|
210
220
|
|
|
211
221
|
return (
|
|
212
222
|
<html dir={getHTMLTextDir(locale)} lang={locale}>
|
|
@@ -214,7 +224,9 @@ function RootDocument({ children }: { children: ReactNode }) {
|
|
|
214
224
|
<HeadContent />
|
|
215
225
|
</head>
|
|
216
226
|
<body>
|
|
217
|
-
<IntlayerProvider locale={locale}>
|
|
227
|
+
<IntlayerProvider locale={locale}>
|
|
228
|
+
{children}
|
|
229
|
+
</IntlayerProvider>
|
|
218
230
|
<Scripts />
|
|
219
231
|
</body>
|
|
220
232
|
</html>
|
|
@@ -557,15 +569,12 @@ export const LocaleSwitcher: FC = () => {
|
|
|
557
569
|
|
|
558
570
|
### चरण 11: HTML विशेषताओं का प्रबंधन
|
|
559
571
|
|
|
560
|
-
जैसा कि चरण 5 में देखा गया है, आप अपने रूट घटक में `
|
|
572
|
+
जैसा कि चरण 5 में देखा गया है, आप अपने रूट घटक में `useParams` का उपयोग करके `html` टैग की `lang` और `dir` विशेषताओं को प्रबंधित कर सकते हैं। यह सुनिश्चित करता है कि सर्वर और क्लाइंट पर सही विशेषताएं सेट की गई हैं।
|
|
561
573
|
|
|
562
574
|
```tsx fileName="src/routes/__root.tsx"
|
|
563
575
|
function RootDocument({ children }: { children: ReactNode }) {
|
|
564
|
-
const
|
|
565
|
-
|
|
566
|
-
// किसी भी सक्रिय मैच के मापदंडों में लोकेल खोजने का प्रयास करें
|
|
567
|
-
const localeRoute = matches.find((match) => match.routeId === "/{-$locale}");
|
|
568
|
-
const locale = localeRoute?.params?.locale ?? defaultLocale;
|
|
576
|
+
const params = LocaleRoute.useParams();
|
|
577
|
+
const locale = params?.locale ?? defaultLocale;
|
|
569
578
|
|
|
570
579
|
return (
|
|
571
580
|
<html dir={getHTMLTextDir(locale)} lang={locale}>
|