@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.
Files changed (197) hide show
  1. package/dist/cjs/doc.cjs.map +1 -1
  2. package/dist/cjs/generated/docs.entry.cjs +60 -0
  3. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  4. package/dist/esm/doc.mjs.map +1 -1
  5. package/dist/esm/generated/docs.entry.mjs +60 -0
  6. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  7. package/dist/types/doc.d.ts.map +1 -1
  8. package/dist/types/generated/docs.entry.d.ts +3 -0
  9. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  10. package/docs/ar/cli/index.md +54 -42
  11. package/docs/ar/cli/init.md +32 -20
  12. package/docs/ar/cli/standalone.md +91 -0
  13. package/docs/ar/configuration.md +39 -7
  14. package/docs/ar/custom_domains.md +250 -0
  15. package/docs/ar/intlayer_with_tanstack+solid.md +14 -33
  16. package/docs/ar/intlayer_with_tanstack.md +25 -16
  17. package/docs/ar/intlayer_with_vanilla.md +506 -0
  18. package/docs/bn/cli/index.md +195 -0
  19. package/docs/bn/cli/init.md +96 -0
  20. package/docs/bn/cli/standalone.md +91 -0
  21. package/docs/bn/configuration.md +46 -14
  22. package/docs/bn/custom_domains.md +250 -0
  23. package/docs/bn/intlayer_with_vanilla.md +506 -0
  24. package/docs/cs/cli/index.md +195 -0
  25. package/docs/cs/cli/init.md +96 -0
  26. package/docs/cs/cli/standalone.md +91 -0
  27. package/docs/cs/configuration.md +46 -7
  28. package/docs/cs/custom_domains.md +250 -0
  29. package/docs/cs/intlayer_with_vanilla.md +506 -0
  30. package/docs/de/cli/index.md +53 -41
  31. package/docs/de/cli/standalone.md +91 -0
  32. package/docs/de/configuration.md +46 -7
  33. package/docs/de/custom_domains.md +250 -0
  34. package/docs/de/intlayer_with_tanstack+solid.md +15 -36
  35. package/docs/de/intlayer_with_tanstack.md +25 -16
  36. package/docs/de/intlayer_with_vanilla.md +506 -0
  37. package/docs/en/bundle_optimization.md +288 -23
  38. package/docs/en/cli/index.md +6 -1
  39. package/docs/en/cli/init.md +13 -1
  40. package/docs/en/cli/standalone.md +91 -0
  41. package/docs/en/configuration.md +46 -7
  42. package/docs/en/custom_domains.md +245 -0
  43. package/docs/en/intlayer_with_tanstack+solid.md +15 -36
  44. package/docs/en/intlayer_with_tanstack.md +25 -16
  45. package/docs/en/intlayer_with_vanilla.md +506 -0
  46. package/docs/en-GB/cli/index.md +56 -44
  47. package/docs/en-GB/cli/init.md +28 -21
  48. package/docs/en-GB/cli/standalone.md +91 -0
  49. package/docs/en-GB/configuration.md +53 -14
  50. package/docs/en-GB/custom_domains.md +250 -0
  51. package/docs/en-GB/intlayer_with_tanstack+solid.md +15 -36
  52. package/docs/en-GB/intlayer_with_tanstack.md +25 -16
  53. package/docs/en-GB/intlayer_with_vanilla.md +506 -0
  54. package/docs/es/cli/index.md +65 -53
  55. package/docs/es/cli/init.md +33 -21
  56. package/docs/es/cli/standalone.md +91 -0
  57. package/docs/es/configuration.md +39 -1
  58. package/docs/es/custom_domains.md +250 -0
  59. package/docs/es/intlayer_with_tanstack+solid.md +15 -36
  60. package/docs/es/intlayer_with_tanstack.md +25 -16
  61. package/docs/es/intlayer_with_vanilla.md +506 -0
  62. package/docs/fr/cli/index.md +43 -31
  63. package/docs/fr/cli/init.md +37 -25
  64. package/docs/fr/cli/standalone.md +91 -0
  65. package/docs/fr/configuration.md +46 -7
  66. package/docs/fr/custom_domains.md +250 -0
  67. package/docs/fr/intlayer_with_tanstack+solid.md +15 -36
  68. package/docs/fr/intlayer_with_tanstack.md +25 -16
  69. package/docs/fr/intlayer_with_vanilla.md +506 -0
  70. package/docs/hi/cli/index.md +71 -59
  71. package/docs/hi/cli/init.md +37 -33
  72. package/docs/hi/cli/standalone.md +91 -0
  73. package/docs/hi/configuration.md +39 -7
  74. package/docs/hi/custom_domains.md +250 -0
  75. package/docs/hi/intlayer_with_tanstack+solid.md +14 -33
  76. package/docs/hi/intlayer_with_tanstack.md +25 -16
  77. package/docs/hi/intlayer_with_vanilla.md +506 -0
  78. package/docs/id/cli/index.md +59 -47
  79. package/docs/id/cli/init.md +32 -25
  80. package/docs/id/cli/standalone.md +91 -0
  81. package/docs/id/configuration.md +46 -7
  82. package/docs/id/custom_domains.md +250 -0
  83. package/docs/id/intlayer_with_tanstack+solid.md +14 -33
  84. package/docs/id/intlayer_with_tanstack.md +25 -16
  85. package/docs/id/intlayer_with_vanilla.md +506 -0
  86. package/docs/it/cli/index.md +58 -41
  87. package/docs/it/cli/init.md +37 -38
  88. package/docs/it/cli/standalone.md +91 -0
  89. package/docs/it/configuration.md +46 -7
  90. package/docs/it/custom_domains.md +250 -0
  91. package/docs/it/intlayer_with_tanstack+solid.md +15 -36
  92. package/docs/it/intlayer_with_tanstack.md +25 -16
  93. package/docs/it/intlayer_with_vanilla.md +506 -0
  94. package/docs/ja/cli/index.md +59 -47
  95. package/docs/ja/cli/init.md +36 -24
  96. package/docs/ja/cli/standalone.md +91 -0
  97. package/docs/ja/configuration.md +46 -7
  98. package/docs/ja/custom_domains.md +250 -0
  99. package/docs/ja/intlayer_with_tanstack+solid.md +15 -36
  100. package/docs/ja/intlayer_with_tanstack.md +25 -16
  101. package/docs/ja/intlayer_with_vanilla.md +506 -0
  102. package/docs/ko/cli/index.md +58 -46
  103. package/docs/ko/cli/init.md +39 -35
  104. package/docs/ko/cli/standalone.md +91 -0
  105. package/docs/ko/configuration.md +47 -8
  106. package/docs/ko/custom_domains.md +250 -0
  107. package/docs/ko/intlayer_with_tanstack+solid.md +15 -36
  108. package/docs/ko/intlayer_with_tanstack.md +25 -16
  109. package/docs/ko/intlayer_with_vanilla.md +506 -0
  110. package/docs/nl/cli/index.md +195 -0
  111. package/docs/nl/cli/init.md +96 -0
  112. package/docs/nl/cli/standalone.md +91 -0
  113. package/docs/nl/configuration.md +46 -7
  114. package/docs/nl/custom_domains.md +250 -0
  115. package/docs/nl/intlayer_with_vanilla.md +506 -0
  116. package/docs/pl/cli/index.md +56 -44
  117. package/docs/pl/cli/init.md +36 -32
  118. package/docs/pl/cli/standalone.md +91 -0
  119. package/docs/pl/configuration.md +46 -7
  120. package/docs/pl/custom_domains.md +250 -0
  121. package/docs/pl/intlayer_with_tanstack+solid.md +14 -33
  122. package/docs/pl/intlayer_with_tanstack.md +25 -16
  123. package/docs/pl/intlayer_with_vanilla.md +506 -0
  124. package/docs/pt/cli/index.md +64 -52
  125. package/docs/pt/cli/init.md +35 -31
  126. package/docs/pt/cli/standalone.md +91 -0
  127. package/docs/pt/configuration.md +46 -7
  128. package/docs/pt/custom_domains.md +250 -0
  129. package/docs/pt/intlayer_with_tanstack+solid.md +15 -36
  130. package/docs/pt/intlayer_with_tanstack.md +25 -16
  131. package/docs/pt/intlayer_with_vanilla.md +506 -0
  132. package/docs/ru/cli/index.md +54 -42
  133. package/docs/ru/cli/init.md +31 -27
  134. package/docs/ru/cli/standalone.md +91 -0
  135. package/docs/ru/configuration.md +46 -7
  136. package/docs/ru/custom_domains.md +250 -0
  137. package/docs/ru/intlayer_with_tanstack+solid.md +15 -36
  138. package/docs/ru/intlayer_with_tanstack.md +25 -16
  139. package/docs/ru/intlayer_with_vanilla.md +506 -0
  140. package/docs/tr/cli/index.md +64 -52
  141. package/docs/tr/cli/init.md +37 -30
  142. package/docs/tr/cli/standalone.md +91 -0
  143. package/docs/tr/configuration.md +46 -7
  144. package/docs/tr/custom_domains.md +250 -0
  145. package/docs/tr/intlayer_with_tanstack+solid.md +14 -33
  146. package/docs/tr/intlayer_with_tanstack.md +25 -16
  147. package/docs/tr/intlayer_with_vanilla.md +506 -0
  148. package/docs/uk/cli/index.md +60 -55
  149. package/docs/uk/cli/init.md +32 -20
  150. package/docs/uk/cli/standalone.md +91 -0
  151. package/docs/uk/configuration.md +46 -7
  152. package/docs/uk/custom_domains.md +250 -0
  153. package/docs/uk/intlayer_with_tanstack+solid.md +14 -33
  154. package/docs/uk/intlayer_with_tanstack.md +25 -16
  155. package/docs/uk/intlayer_with_vanilla.md +506 -0
  156. package/docs/ur/cli/index.md +195 -0
  157. package/docs/ur/cli/init.md +96 -0
  158. package/docs/ur/cli/standalone.md +91 -0
  159. package/docs/ur/configuration.md +46 -7
  160. package/docs/ur/custom_domains.md +250 -0
  161. package/docs/ur/intlayer_with_vanilla.md +506 -0
  162. package/docs/vi/cli/index.md +72 -61
  163. package/docs/vi/cli/init.md +33 -21
  164. package/docs/vi/cli/standalone.md +91 -0
  165. package/docs/vi/configuration.md +46 -7
  166. package/docs/vi/custom_domains.md +250 -0
  167. package/docs/vi/intlayer_with_tanstack+solid.md +14 -33
  168. package/docs/vi/intlayer_with_tanstack.md +25 -16
  169. package/docs/vi/intlayer_with_vanilla.md +506 -0
  170. package/docs/zh/cli/index.md +56 -49
  171. package/docs/zh/cli/init.md +30 -18
  172. package/docs/zh/cli/standalone.md +91 -0
  173. package/docs/zh/configuration.md +46 -7
  174. package/docs/zh/custom_domains.md +250 -0
  175. package/docs/zh/intlayer_with_tanstack+solid.md +15 -36
  176. package/docs/zh/intlayer_with_tanstack.md +25 -16
  177. package/docs/zh/intlayer_with_vanilla.md +506 -0
  178. package/package.json +8 -8
  179. package/src/doc.ts +4 -1
  180. package/src/generated/docs.entry.ts +60 -0
  181. package/docs/ar/bundle_optimization.md +0 -185
  182. package/docs/de/bundle_optimization.md +0 -195
  183. package/docs/en-GB/bundle_optimization.md +0 -184
  184. package/docs/es/bundle_optimization.md +0 -194
  185. package/docs/fr/bundle_optimization.md +0 -184
  186. package/docs/hi/bundle_optimization.md +0 -185
  187. package/docs/id/bundle_optimization.md +0 -185
  188. package/docs/it/bundle_optimization.md +0 -185
  189. package/docs/ja/bundle_optimization.md +0 -185
  190. package/docs/ko/bundle_optimization.md +0 -185
  191. package/docs/pl/bundle_optimization.md +0 -185
  192. package/docs/pt/bundle_optimization.md +0 -184
  193. package/docs/ru/bundle_optimization.md +0 -185
  194. package/docs/tr/bundle_optimization.md +0 -184
  195. package/docs/uk/bundle_optimization.md +0 -186
  196. package/docs/vi/bundle_optimization.md +0 -185
  197. 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
+ - کسٹم ڈومینز
8
+ - ڈومین راؤٹنگ
9
+ - راؤٹنگ
10
+ - بین الاقوامی کاری
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
+ # کسٹم ڈومینز
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`)۔ ڈومین خود ہی لوکل کی شناخت کرتا ہے، اس لیے پاتھ میں کوئی لوکل سابقہ (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
+ ### ایک ہی ڈومین کا لوکل (نسبتاً 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
+ ### کراس ڈومین لوکل (مطلق 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 تیار نہیں کیا جاتا — یہ ایک محفوظ فال بیک (fallback) ہے۔
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` کو کال کرتا ہے، لہذا یہ کالر کے ڈومین کی بنیاد پر نسبتاً اور مطلق URLs کا مرکب تیار کرتا ہے:
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
+ یہ مطلق URLs 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
+ Vite پلگ ان `intlayerProxy` ڈیولپمنٹ کے دوران اسی منطق کا اطلاق کرتا ہے:
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-file) اوور رائیڈ (مثلاً `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((l) => (
198
+ <li key={l}>
199
+ <button
200
+ onClick={() => setLocale(l)}
201
+ aria-current={l === 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 انڈیکس کرنا ہے۔ متبادل URLs کا مکمل سیٹ تیار کرنے کے لیے `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
+ ## بنیادی یوٹیلٹیز
245
+
246
+ | یوٹیلٹی | تفصیل |
247
+ | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
248
+ | `getLocalizedUrl(url, locale, { currentDomain })` | نسبتاً یا مطلق URL واپس کرتا ہے اس پر منحصر کہ آیا ٹارگٹ لوکل موجودہ ڈومین پر ہے یا نہیں۔ |
249
+ | `getMultilingualUrls(url, { currentDomain })` | لوکلائزڈ URLs کا ایک لوکل کیڈ (locale-keyed) میپ واپس کرتا ہے، ضرورت کے مطابق نسبتاً اور مطلق کو ملا کر۔ |
250
+ | `getPrefix(locale, { domains })` | خصوصی ڈومین لوکلز کے لیے خالی سابقہ واپس کرتا ہے، ورنہ عام سابقہ۔ |