Skip to content

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 }));
});

یادداشت‌ها

  1. href هرچند بار هم صدا بزنید نتیجه یکی است. پیش از افزودن پیشوند تازه، پیشوند موجود را برمی‌دارد، پس دادنِ مسیری که از پیش زبان‌دار است چیزی را دوبرابر نمی‌کند — و hrefForLocale هم چیزی جز href نیست.
  2. بلندترین پیشوند برنده است، پس zh مسیر /zh-hant/... را نمی‌بلعد.
  3. base تنها از آغاز برداشته می‌شود. replace(base, '') نخستین رخداد را هر جا که باشد برمی‌دارد و همین وقتی همان رشته در میانهٔ مسیر بیاید کار را خراب می‌کند.
  4. پرس‌وجو و قطعه دست‌نخورده می‌مانند: حساب‌وکتاب تنها به بخش مسیر دست می‌زند.
  5. «زبان کنونیِ» سراسری در کار نیست. کد را صریح بدهید یا به پیش‌فرض بسپارید. اینکه کدام زبان فعال است کار زمان‌اجرای i18n است، نه این پیمانه.

منتشرشده تحت مجوز MIT.