دو مسیر، نه یک صفحهی وارونه
فارسی و انگلیسی این سایت دو آدرس جدا دارند؛ جهت، وزیرمتن، و تقویم خورشیدی از همان ساخت میآیند و ترجمهی نداشته ادعا نمیشود.
صفحهای که اول انگلیسی کشیده شده و بعد آینه شده، هنوز آینه است. فاصلهای که «چپ» بوده حدس میشود، آیکون جهت عوض میکند، و منو به لبهای میچسبد که برایش طرح نشده. این سایت آن کار را نمیکند. فارسی و انگلیسی از اول دو مسیرند: /fa/ و /en/.
دو درخت، یک سایت
src/pages/[lang]/ هر صفحهی عمومی را دو بار میسازد. خانه، وبلاگ، پروژهها و درباره هر کدام lang را fa یا en میگیرند. متن موقع ساخت صفحهی استاتیک انتخاب میشود، از src/i18n/ui.ts و از پوشههای src/content/blog/fa و src/content/blog/en. دیکشنریای نیست که مرورگر بعد از بار شدن عوضش کند.
فایده همین است. یک جمله در انگلیسی کوتاه است و در فارسی بلند. عنوان روی کلمهی دیگری میشکند. اگر هر دو زبان یک فایل HTML بودند و فقط dir عوض میشد، طول سطرها با هم دعوا میکردند. اینجا فایل را شریک نمیشوند.
آدرس / چیز دیگری است. noindex است، نشانی متعارفش /fa/ است، و اسکریپت کوچک با navigator.language مرورگر را به /fa/ یا /en/ میفرستد. نسخهی سوم خانه نیست. به موتور جستوجو گفته شده خانهی فارسی پیشفرض بماند.
lang و dir با هم میآیند
سند lang="fa-IR" است یا lang="en-US"، و dir از همان دیکشنری است: rtl یا ltr. صفحهای که میگوید فارسی است و چپبهراست مانده، مثل انگلیسی خط میشکند. صفحهای که جهت را برمیگرداند و زبان را انگلیسی میگذارد، فونت و صدای تاریخ را اشتباه برمیدارد.
hreflang همان برچسبها را دارد، بهاضافهی x-default روی آدرس فارسی. لینک مقابل فقط وقتی در میآید که صفحهی زبان دیگر واقعاً باشد. برای نوشته یعنی فایلی با همان نام در پوشهی دیگر. مسیر وبلاگ نامها را جمع میکند و alternate را فقط وقتی روشن میکند که آن نام در جمع باشد. اگر جفت نباشد، صفحه ادعا نمیکند ترجمه دارد. دکمهی زبان به فهرست وبلاگ زبان دیگر میرود.
بایگانی برچسب سختگیرتر است. برچسب فارسی و انگلیسی فقط وقتی جفت میشوند که هر دو نام ترجمه باشند و هر دو بایگانی ارزش ایندکس داشته باشند. وقتی دو نوشتهی اول هر دو برچسب را داشتند، آن بایگانیها همان فهرست وبلاگ بودند با آدرسی دیگر. تا معرفی جدا و فهرست کوتاهتر نباشد، بیرون از ایندکس میمانند.
فونت دنبال زبان است
صفحهی فارسی اول وزیرمتن را میخواهد و انگلیسی اول Inter را. تعویض با :lang(fa) است که fa-IR را هم میگیرد. انتخابگر html[lang='fa'] با fa-IR جور نمیشد، پس وزیرمتن نمیبرد و Inter جلوی متن فارسی مینشست.
Inter فونت متغیر است، فقط لاتین و لاتین گسترده. یونانی و سیریلیک و ویتنامی در متن نیستند و در استایل سراسری هم نیستند. وزیرمتن بلوک عربی را برای فارسی نگه میدارد و بلوک لاتین را برای اسمهایی مثل Astro و Three.js وسط جمله.
وزن و فاصله و حرکت در حروف، فاصله، و حرکت صفحه است.
تقویم خورشیدی کجا هست
برچسب ماه از formatMonth میگذرد و YYYY-MM را با fa-IR-u-ca-persian قالب میکند. شلوغترین روز پروژهها به Intl تقویم persian میدهد. تاریخ نوشته با fa-IR است که خودش هجری خورشیدی است.
ساعت دربارهی من زمان را در Asia/Tehran نشان میدهد. این برچسب ساعت است، «ساعت من در تهران»، نه نشانی خیابان. چیدمان آن منطقهٔ زمانی را آدرس پستی نمیکند.
کارت خصوصی چه را نشان میدهد
scrub ریپازیتوری خصوصی را به نام، زبان، آدرس خالی و بدون توضیح کوچک میکند. کارت میتواند بازهی فعالیت و شمار کامیت سال گذشته را نشان بدهد، چون شماره است نه پیام کامیت. موضوع و لینک و متن کامیت به قالب نمیرسند.
صفحهی همکاری میگوید چه کاری خوشامد است و تنها تماس عمومی تلگرام است، @MH759. ایمیل عمومی نیست و صفحه یکی نمیسازد. نسخهی شخصی همین حد در درباره است.
دکمهٔ زبان چه را حق ندارد بکند
دکمه پیشوند /fa/ یا /en/ را عوض میکند. نوشتهی جفتدار به ترجمه میرسد. نوشتهی بیجفت altPath به فهرست وبلاگ دیگر میگیرد و alternate خاموش است تا سرصفحه hreflang ادعا نکند. نقشهٔ سایت همین است: یک زبان لینک جایگزین نمیگیرد و x-default فقط با دو آدرس واقعی میآید.
نام جفت یعنی فایل انگلیسی که ترجمه است، نه مارکداون فارسی با اسم پوشهی عوضشده. نوشتهی بعدی، دربارهی هزینهی صحنهی WebGL، اینجاست: صفحهی استاتیک، و وقتی صحنه هزینهاش را درمیآورد.
اگر فقط یک چیز از این صفحه بماند این است: فارسی وصلهی آخر کار نیست. مسیر، جهت، فونت و تقویم از همان ساخت میآیند و ترجمهای که فایل ندارد ادعا نمیشود.