Setting up website localization for Kazakh language
Kazakh language (kk / kk-KZ) uses Cyrillic in Kazakhstan. The language is agglutinative: case endings, number and possession are expressed through suffixes, which significantly impacts localization approach — template strings with substitution often need to be redone into complete phrases.
Basic setup
// config/app.php
'locale' => 'kk',
'fallback_locale' => 'ru',
// resources/lang/kk/messages.php
return [
'welcome' => 'Сайтымызға қош келдіңіз',
'catalog' => 'Каталог',
'cart' => 'Себет',
'checkout' => 'Тапсырысты рәсімдеу',
'search' => 'Іздеу',
'add_to_cart' => 'Себетке қосу',
'price' => 'Баға',
'in_stock' => 'Қоймада бар',
'out_of_stock' => 'Қоймада жоқ',
'order_placed' => 'Тапсырыс берілді',
'items_in_cart' => 'Себетте :count тауар',
];
Specifics of Kazakh grammar for developers
Kazakh has no grammatical gender. Noun number: singular (explicit or without ending) and plural (suffix -лар/-лер/-дар/-дер/-тар/-тер — choice depends on the last sound of the stem by vowel harmony law).
// Numerals in Kazakh — simpler than in Russian
// Only two forms are used: singular and plural
function pluralKk(int $n, string $singular, string $plural): string
{
return $n === 1 ? "$n $singular" : "$n $plural";
}
echo pluralKk(1, 'тауар', 'тауар'); // 1 тауар
echo pluralKk(5, 'тауар', 'тауар'); // 5 тауар
// In Kazakh, after numeral, noun stays singular!
// "5 тауар" — correct, not "5 тауарлар"
Intl.PluralRules for Kazakh:
const rules = new Intl.PluralRules('kk')
// kk returns 'one' for 1 and 'other' for others
// BUT: in Kazakh, after numeral — always singular
// So for "N goods" just use one form
const pluralize = (n: number) => `${n} тауар`
Date and currency formatting
// Date
const df = new Intl.DateTimeFormat('kk-KZ', {
day: 'numeric',
month: 'long',
year: 'numeric',
})
df.format(new Date()) // "28 наурыз 2026 ж."
// Kazakhstan currency — tenge (KZT)
new Intl.NumberFormat('kk-KZ', {
style: 'currency',
currency: 'KZT',
maximumFractionDigits: 0,
}).format(14990) // "14 990 ₸"
// Numbers
new Intl.NumberFormat('kk-KZ').format(1234567.89)
// "1 234 567,89"
// Relative time
const rtf = new Intl.RelativeTimeFormat('kk', { numeric: 'auto' })
rtf.format(-1, 'day') // "кеше"
rtf.format(-3, 'day') // "3 күн бұрын"
rtf.format(1, 'hour') // "1 сағаттан кейін"
Fonts
Kazakh Cyrillic contains unique letters: Ә ә, Ғ ғ, Қ қ, Ң ң, Ө ө, Ұ ұ, Ү ү, Һ һ, І і. Check glyph presence:
body {
/* Noto Sans supports all Cyrillic languages including Kazakh */
font-family: 'Noto Sans', 'PT Sans', Roboto, Arial, sans-serif;
}
Google Fonts: filter by Kazakh or Cyrillic Extended — finds compatible fonts.
Kazakh in Next.js i18n
// next.config.js
module.exports = {
i18n: {
locales: ['ru', 'kk', 'en'],
defaultLocale: 'ru',
localeDetection: true,
},
}
pages/
index.tsx → /
[locale]/
index.tsx → /kk/, /en/
SEO
<html lang="kk">
<head>
<meta charset="UTF-8">
<meta property="og:locale" content="kk_KZ">
<link rel="alternate" hreflang="kk" href="https://example.kz/kk/" />
<link rel="alternate" hreflang="ru" href="https://example.kz/" />
<link rel="alternate" hreflang="x-default" href="https://example.kz/" />
</head>
Yandex indexes Kazakh content. Google does as well. Share of Kazakh-language searches is growing: according to Yandex, about 30% of search queries from Kazakhstan are in Kazakh.
Timeframe
Connecting locale, configuring formatting, basic UI translations — 1 working day.







