Building a Bengali news portal: fonts, numerals, dates, and URLs
Fonts that clip, dates in the wrong time zone, a calendar most libraries don't know, and URLs nobody can read. Notes from rebuilding Mukto Provat in Next.js.
On this page
I'm rebuilding Mukto Provat, a Bengali-language news portal, from scratch in Next.js. Bengali has its own needs on the web — small ones that add up, and most of them only show up once real headlines arrive.
Here's what I had to handle, with the code.
Fonts: load the right subset, and give it room
The site uses Noto Serif Bengali for headlines and Noto Sans Bengali for body text, loaded with next/font so they're self-hosted and subset:
const notoSerifBn = Noto_Serif_Bengali({
subsets: ["bengali"],
weight: ["400", "600", "700"],
variable: "--font-serif-bn",
display: "swap",
});
Two lessons:
- Ask only for the weights you use. Bengali fonts are much larger than Latin ones, because of the conjunct characters (juktakkhor). Every extra weight is a real cost on a phone.
- Give the text more line height than you think. Vowel signs sit above and below the letters, and at an English-style line height they clip or collide. Body text here uses
line-height: 1.75, headlines1.3.
Numerals: Bengali digits, everywhere
Readers expect ২০২৬, not 2026 — in dates, view counts, and "5 minutes ago". The conversion is simple, but it has to be used everywhere, so it lives in one helper:
export function toBanglaDigits(n: number | string): string {
const d = ["০", "১", "২", "৩", "৪", "৫", "৬", "৭", "৮", "৯"];
return String(n).replace(/[0-9]/g, (ch) => d[parseInt(ch)]);
}
Dates: always in Bangladesh time
A news story published at 11 pm in Dhaka must say 11 pm — whether the page was rendered on a server in Singapore, Frankfurt, or the reader's laptop. Relying on the server's local time zone produced wrong dates near midnight.
The fix is to shift every timestamp to Bangladesh Standard Time (UTC+6) once, then read it with the UTC getters, so the result is identical everywhere:
// getUTC* on the returned date gives Dhaka wall-clock values on any machine
function toBSTDate(ts: Date | string): Date {
const d = typeof ts === "string" ? new Date(ts) : ts;
return new Date(d.getTime() + 6 * 60 * 60 * 1000);
}
Bangladesh doesn't observe daylight saving time, which is what makes a fixed offset safe here.
Time-of-day reads naturally in Bengali, too: instead of "am/pm", the site says ভোর (dawn), সকাল (morning), দুপুর (noon), বিকেল (afternoon), সন্ধ্যা (evening), or রাত (night).
The Bengali calendar
Bangladeshi newspapers show the Bengali date alongside the Gregorian one — for example, ৩০ আশ্বিন, ১৪৩৩ বঙ্গাব্দ. Most date libraries don't support it.
Bangladesh uses the Bangla Academy's revised calendar (2019). Its months have fixed lengths: Baishakh to Ashwin have 31 days, Kartik to Chaitra have 30, and Falgun has 29 (30 in Gregorian leap years). That makes it possible to anchor each month to a fixed Gregorian date — 14 April is always ১ বৈশাখ, 16 December is always ১ পৌষ — and count days from the right anchor.
The full function is about forty lines. The tricky edge was the first two weeks of January: they still belong to Poush, which began on 16 December of the previous Gregorian year.
URLs: don't put Bengali headlines in them
English sites usually turn the headline into the URL. With Bengali that goes badly: shared links become long strings of percent-encoded characters, they break in some apps, and editors change headlines after publishing.
So article URLs use a short random ID under the category:
/lifestyle/demoiv1s
Categories and tags keep readable Bengali slugs, filtered to the Bengali Unicode block plus Latin letters and digits:
.replace(/[^ঀ- a-z0-9]/g, "")
What I'd tell anyone starting a Bengali site
- Test with real Bengali headlines from day one — placeholder English text hides every one of these problems.
- Put numerals, dates, and the calendar in one module and use it everywhere.
- Never trust the server's time zone.
- Decide your URL strategy before launch; changing it later means redirects for every article.
Building something in Bengali, or Bengali and English side by side? Let's talk.