@intlayer/docs 8.6.1 → 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 +14 -33
- 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 +14 -33
- 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 +14 -33
- 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 +14 -33
- 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 +14 -33
- 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 +14 -33
- 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 +14 -33
- 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 +14 -33
- 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 +14 -33
- 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 +14 -33
- 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 +14 -33
- 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
|
+
১. **ইউআরএল জেনারেশন** (`getLocalizedUrl`): যখন টার্গেট লোকেল বর্তমান পৃষ্ঠার তুলনায় _আলাদা_ ডোমেইনে থাকে, তখন একটি পরম (absolute) ইউআরএল ফেরত দেওয়া হয় (যেমন `https://intlayer.zh/about`)। যখন উভয় ডোমেইন মিলে যায়, তখন একটি আপেক্ষিক (relative) ইউআরএল ফেরত দেওয়া হয় (যেমন `/fr/about`)।
|
|
31
|
+
২. **সার্ভার প্রক্সি** (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 Generation)
|
|
72
|
+
|
|
73
|
+
`getLocalizedUrl` কলিং কনটেক্সটের উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে সঠিক ইউআরএল প্রকার তৈরি করে।
|
|
74
|
+
|
|
75
|
+
### এক-ডোমেইন লোকেল (আপেক্ষিক ইউআরএল)
|
|
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
|
+
### ক্রস-ডোমেইন লোকেল (পরম ইউআরএল)
|
|
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" (ইতিমধ্যেই সঠিক ডোমেইনে আছে — আপেক্ষিক ইউআরএল)
|
|
100
|
+
|
|
101
|
+
getLocalizedUrl("/about", "fr", { currentDomain: "intlayer.zh" });
|
|
102
|
+
// → "https://intlayer.org/fr/about" (intlayer.org-এ ফিরে ক্রস-ডোমেইন লিঙ্ক)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### বর্তমান ডোমেইন অটো-ডিটেকশন (Current domain auto-detection)
|
|
106
|
+
|
|
107
|
+
`currentDomain` ঐচ্ছিক। বাদ দিলে, `getLocalizedUrl` এটিকে এই ক্রমে সমাধান করে:
|
|
108
|
+
|
|
109
|
+
১. একটি পরম ইনপুট ইউআরএল-এর হোস্টনেম (যেমন `https://intlayer.org/about` → `intlayer.org`)।
|
|
110
|
+
২. ব্রাউজার পরিবেশে `window.location.hostname` ।
|
|
111
|
+
৩. যদি কোনোটিই উপলব্ধ না থাকে (সুস্পষ্ট বিকল্প ছাড়া এসএসআর), তবে একই-ডোমেইন লোকেলের জন্য একটি আপেক্ষিক ইউআরএল ফেরত দেওয়া হয় এবং কোনো পরম ইউআরএল তৈরি হয় না — এটি নিরাপদ ফলব্যাক।
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
// ব্রাউজার — window.location.hostname === 'intlayer.org'
|
|
115
|
+
getLocalizedUrl("/about", "zh");
|
|
116
|
+
// → "https://intlayer.zh/about" (উইন্ডো থেকে অটো-ডিটেক্টেড)
|
|
117
|
+
|
|
118
|
+
// থেকে একটি পরম ইউআরএল — ডোমেইন স্বয়ংক্রিয়ভাবে ডিটেক্ট হয়েছে
|
|
119
|
+
getLocalizedUrl("https://intlayer.org/about", "zh");
|
|
120
|
+
// → "https://intlayer.zh/about"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### ডোমেইন সহ `getMultilingualUrls`
|
|
124
|
+
|
|
125
|
+
`getMultilingualUrls` প্রতিটি লোকেলের জন্য `getLocalizedUrl` কল করে, তাই এটি কলকারীর ডোমেইনের উপর ভিত্তি করে আপেক্ষিক এবং পরম ইউআরএল-এর মিশ্রণ তৈরি করে:
|
|
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
|
+
এই পরম ইউআরএলগুলো এসইও-র জন্য `<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 রাউটিং, ইউআরএল পরিষ্কার থাকে)
|
|
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
|
+
## এসইও: `hreflang` বিকল্প লিঙ্ক (Alternate Links)
|
|
215
|
+
|
|
216
|
+
ডোমেইন-ভিত্তিক রাউটিং সাধারণত `hreflang`-এর সাথে সার্চ ইঞ্জিনকে প্রতিটি ভাষার জন্য কোন ইউআরএল ইনডেক্স করতে হবে তা বলতে ব্যবহার করা হয়। বিকল্প ইউআরএল-এর সম্পূর্ণ সেট তৈরি করতে `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 })` | আপেক্ষিক বা পরম ইউআরএল ফেরত দেয়, এটি টার্গেট লোকেল বর্তমান ডোমেইনে আছে কি না তার ওপর নির্ভর করে। |
|
|
249
|
+
| `getMultilingualUrls(url, { currentDomain })` | লোকেল-কীয়ড (locale-keyed) ম্যাপ ফেরত দেয়, যেখানে প্রয়োজন অনুযায়ী আপেক্ষিক এবং পরম ইউআরএল মিশ্রিত থাকে। |
|
|
250
|
+
| `getPrefix(locale, { domains })` | এক্সক্লুসিভ-ডোমেইন লোকেলের জন্য একটি খালি উপসর্গ ফেরত দেয়, অন্যথায় সাধারণ উপসর্গ। |
|