@sanvika/lang
v0.2.0
Published
Sanvika ecosystem i18n SDK — single source of truth for language management across 50+ Sanvika projects. Indian-12 + Global-28 presets, segment-based lazy loading, RTL, voice codes, server translations.
Maintainers
Readme
@sanvika/lang
Date: 23 April 2026 Centralized i18n SDK for the Sanvika ecosystem (50+ projects). Indian-12 / Global-28 presets, segment-based lazy loading, RTL, voice/TTS codes, server translations.
Table of Contents
- Kya hai
- Install
- Quick Start (Indian 12)
- Quick Start (Global 28)
- API
- Server Translations
- Migration from raw i18next setup
Kya hai
Har Sanvika project mein i18n ka same boilerplate (200-700 lines, 192-560+ JSON imports) repeat ho raha tha. Yeh SDK us boilerplate ko single config call mein collapse karta hai. JSON files project mein hi rehti hain (project-owned), engine yahan se aata hai.
Install
pnpm add @sanvika/lang i18next react-i18nextQuick Start (Indian 12)
// src/utils/language/i18n.js
import { createSanvikaI18n, LANGUAGE_PRESETS } from "@sanvika/lang";
import enNavigation from "./translations/segments/en/navigation.json";
import hiNavigation from "./translations/segments/hi/navigation.json";
// ... other core segment imports
import enDashboard from "./translations/segments/en/dashboard.json";
import hiDashboard from "./translations/segments/hi/dashboard.json";
// ... other lazy segment imports
const { i18n, ensureTranslationSegment } = createSanvikaI18n({
languages: LANGUAGE_PRESETS.INDIAN_12,
defaultLanguage: "en",
fallbackLanguage: "en",
storageKey: "language",
coreSegments: {
en: { ...enNavigation /* , ...enUiCommon, ... */ },
hi: { ...hiNavigation /* , ...hiUiCommon, ... */ },
},
lazySegments: {
dashboard: { en: enDashboard, hi: hiDashboard },
},
});
export default i18n;
export { ensureTranslationSegment };Quick Start (Global 28)
import { createSanvikaI18n, LANGUAGE_PRESETS } from "@sanvika/lang";
const { i18n, ensureTranslationSegment } = createSanvikaI18n({
languages: LANGUAGE_PRESETS.GLOBAL_28,
defaultLanguage: "hi",
fallbackLanguage: "en",
coreSegments: { /* ... */ },
lazySegments: { /* ... */ },
});API
createSanvikaI18n(options)
Returns { i18n, ensureTranslationSegment, getCurrentLanguage }.
| Option | Type | Required | Default |
|---|---|---|---|
| languages | Array | yes | — |
| coreSegments | Object | yes | — |
| lazySegments | Object | no | {} |
| defaultLanguage | string | no | "en" |
| fallbackLanguage | string | no | "en" |
| storageKey | string | no | "language" |
| i18nextOptions | Object | no | {} |
<LanguageProvider validLanguages={[...]}>
Wraps your app, exposes useLanguage() hook with { currentLanguage, changeLanguage }. Auto-applies dir="rtl" for Urdu/Arabic.
Voice / Flag helpers
import {
getVoiceLanguageCode, // "hi" → "hi-IN"
getFlagEmoji, // "hi" → "🇮🇳"
getNativeName, // "ta" → "தமிழ்"
isRTLLanguage, // "ur" → true
applyLanguageDirection,
getSupportedLanguages,
} from "@sanvika/lang";normalizeTranslationArray(value)
Coerces JSON list-like values (object → array, single → array, etc.) into proper arrays.
Server Translations
// src/utils/language/getTranslations.js
import { createServerTranslations } from "@sanvika/lang";
import enNavigation from "./translations/segments/en/navigation.json";
import hiNavigation from "./translations/segments/hi/navigation.json";
const { getTranslations, getServerLocale } = createServerTranslations({
segmentDataMap: {
navigation: { en: enNavigation, hi: hiNavigation },
},
validLocales: ["en", "hi", "ta", "te", "kn", "ml", "bn", "mr", "gu", "pa", "or", "ur"],
fallbackLocale: "en",
});
export { getTranslations, getServerLocale };Migration from raw i18next setup
| Before (per project) | After |
|---|---|
| 700-line i18n.js with 192/560+ static imports + manual resources, segmentLoaders, loadedSegments, ensureTranslationSegment | 1 createSanvikaI18n(...) call |
| Hand-written voiceCodeMapper.js per project | Built-in (getVoiceLanguageCode, getFlagEmoji, etc.) |
| Hand-written LanguageProvider/useLanguage per project | Built-in |
| Hand-written getTranslations SSR helper per project | createServerTranslations(...) |
