createLocalePath
حساب نشانی برای یک سایت چندزبانه. توابع ناب، بی حالت سراسری و بی DOM — هم در اسکریپت زمان ساخت (نقشهٔ سایت، hreflang) به کار میآید و هم در مرورگر.
از زیرشاخه (/zh/book/) استفاده میکند، نه از زیردامنه (zh.example.com/book/): موتورهای جستوجو زیردامنه را سایتی جداگانه میشمارند که اعتبارش از صفر آغاز میشود، حال آنکه زیرشاخه اعتبار سایت اصلی را به ارث میبرد. زبانِ پیشفرض در ریشه مینشیند و هر زبان دیگری پیشوند دارد.
API
createLocalePath(config)
| پارامتر | توضیح | نوع | پیشفرض |
|---|---|---|---|
locales | { code, prefix? }[]؛ نبودِ پیشوند یعنی «زبان پیشفرض است و در ریشه مینشیند» | LocaleRoute[] | الزامی |
defaultLocale | کد زبان پیشفرض | string | نخستین موردِ بیپیشوند |
base | زیرمسیر استقرار، مثلاً /weread؛ اسلش پایانی نادیده گرفته میشود | string | '' |
آنچه برمیگردد:
| عضو | توضیح |
|---|---|
base / defaultLocale | پیکربندی یکدستشده، فقطخواندنی |
localeFromPath(pathname) | زبان را تشخیص میدهد؛ مسیرهای ناشناخته به زبان پیشفرض میافتند |
stripLocale(pathname) | پیشوند زبان را برمیدارد: مسیرِ بیزبان که مسیریابی با آن کار میکند |
href(path, code?) | برای یک زبان پیوند میسازد |
hrefForLocale(pathname, code) | مسیر کنونی را به زبانی دیگر میگرداند (کلید تعویض زبان) |
alternates(pathname) | نشانی همهٔ زبانها، برای <link rel="alternate" hreflang> |
نمونه
js
import { createLocalePath } from 'ranuts';
const paths = createLocalePath({
locales: [{ code: 'en' }, { code: 'zh-CN', prefix: 'zh' }, { code: 'zh-HK', prefix: 'zh-hant' }],
base: '/docs',
});
paths.href('/book/walden/'); // '/docs/book/walden/'
paths.href('/book/walden/', 'zh-CN'); // '/docs/zh/book/walden/'
paths.localeFromPath('/docs/zh/book/'); // 'zh-CN'
paths.stripLocale('/docs/zh/book/'); // '/docs/book/'
paths.hrefForLocale('/docs/zh/book/', 'zh-HK'); // '/docs/zh-hant/book/'
// تگهای hreflang
paths.alternates(location.pathname).forEach(({ code, href }) => {
head.append(link({ rel: 'alternate', hreflang: code, href }));
});یادداشتها
hrefهرچند بار هم صدا بزنید نتیجه یکی است. پیش از افزودن پیشوند تازه، پیشوند موجود را برمیدارد، پس دادنِ مسیری که از پیش زباندار است چیزی را دوبرابر نمیکند — وhrefForLocaleهم چیزی جزhrefنیست.- بلندترین پیشوند برنده است، پس
zhمسیر/zh-hant/...را نمیبلعد. baseتنها از آغاز برداشته میشود.replace(base, '')نخستین رخداد را هر جا که باشد برمیدارد و همین وقتی همان رشته در میانهٔ مسیر بیاید کار را خراب میکند.- پرسوجو و قطعه دستنخورده میمانند: حسابوکتاب تنها به بخش مسیر دست میزند.
- «زبان کنونیِ» سراسری در کار نیست. کد را صریح بدهید یا به پیشفرض بسپارید. اینکه کدام زبان فعال است کار زماناجرای i18n است، نه این پیمانه.