khmer_intl
Khmer (km) internationalization helpers for Dart and Flutter.
khmer_intl gives you Khmer-friendly formatting utilities for digits, numbers, currency, dates, relative time, plural selection, and Khmer lunar support via khmer_lunar_chhankitek: ^1.0.0.
Preview
Features
- Latin digit -> Khmer digit conversion (
123->១២៣) - Khmer digit -> Latin digit conversion
- Number formatting and KHR currency formatting (
៛) - Compact number formatting (e.g.
1.3លាន) - Compact currency formatting (e.g.
៛ 1.2M,៛ ១.២លាន) - Percent formatting
- Khmer date formatting with month/weekday names
- Buddhist Era year option (
AD + 543) - Date preset constructors (
shortDate,mediumDate,fullDate,fullDateTime,dateTime,time) - Khmer relative time (e.g.
២ ម៉ោងមុន) - Simple plural helper
- Structured plural helper with templates (
KhmerPlural.of) - Chhankitek lunar integration via
khmer_lunar_chhankitek - Number-to-Khmer words conversion (
1250->មួយពាន់ពីររយហាសិប) - Extension methods for
int,num,String, andDateTime
Installation
dependencies:
khmer_intl: ^0.1.1
khmer_lunar_chhankitek is already integrated as a dependency of khmer_intl, so users can install only khmer_intl and use lunar APIs through KhmerChhankitek.
Then run:
dart pub get
or (Flutter):
flutter pub get
Quick Start
import 'package:khmer_intl/khmer_intl.dart';
Digits
toKhmerDigits('1234567890');
// ១២៣៤៥៦៧៨៩០
'123'.toKhmerDigits();
// ១២៣
'១២៣'.toLatinDigits();
// 123
Number and Currency
2500.toKhmerCurrency(useKhmerDigits: true);
// ៛២,៥០០
1250000.toKhmerCompact(useKhmerDigits: true);
// ១.៣លាន
0.275.toKhmerPercent(useKhmerDigits: true, fractionDigits: 1);
// ២៧.៥%
KhmerNumberFormat.compactCurrency().format(1200000);
// ៛ 1.2M
KhmerNumberFormat.compactCurrency(
khmerStyle: true,
useKhmerDigits: true,
).format(1200000);
// ៛ ១.២លាន
Date Formatting
final date = DateTime(2026, 4, 14);
KhmerDateFormat('EEE dd MMMM yyyy', buddhistEra: true, useKhmerDigits: true)
.format(date);
// អង្គារ ១៤ ខែមេសា ២៥៦៩
KhmerDateFormat.fullDate(buddhistEra: true, useKhmerDigits: true).format(date);
KhmerDateFormat.fullDateTime(useKhmerDigits: true).format(DateTime.now());
KhmerDateFormat.dateTime(useKhmerDigits: true).format(DateTime.now());
KhmerDateFormat.time(useKhmerDigits: true).format(DateTime.now());
Khmer date (Chhankitek):
final date = DateTime(2026, 4, 16);
final khmerDate = KhmerChhankitek.formatKhmerGregorianDate(date);
final lunarDate = KhmerChhankitek.toKhmerLunarDate(date);
print(khmerDate); // ថ្ងៃទី១៦ ខែមេសា ឆ្នាំ២០២៦
print(lunarDate.toString());
Relative Time
final now = DateTime.now();
final past = now.subtract(const Duration(hours: 2));
past.toKhmerRelativeTime(reference: now, useKhmerDigits: true);
// ២ ម៉ោងមុន
KhmerRelativeTime.format(now, reference: now);
// ឥឡូវនេះ
KhmerRelativeTime.format(now.subtract(const Duration(days: 1)), reference: now);
// ម្សិលមិញ
KhmerRelativeTime.format(now.subtract(const Duration(days: 5)), reference: now);
// មុន 5 ថ្ងៃ
Plural Helper
khmerPlural(
2,
one: 'មានទំនិញ 1 មុខ',
other: 'មានទំនិញ 2 មុខ',
);
KhmerPlural.of(
count: 2,
one: '{count} ឯកតា',
other: '{count} ឯកតា',
);
// 2 ឯកតា
Number to Khmer Words
numberToKhmerWords(1250);
// មួយពាន់ពីររយហាសិប
1250.toKhmerWords();
// មួយពាន់ពីររយហាសិប
Chhankitek Lunar Date (Integrated)
final date = DateTime(2026, 4, 16);
final lunarDate = KhmerChhankitek.toKhmerLunarDate(date);
final lunarDay = KhmerChhankitek.day(date);
final monthDays = KhmerChhankitek.month(date.year, date.month);
print(lunarDate.toString());
print(KhmerChhankitek.formatKhmerGregorianDate(date));
print('Uposatha: ${lunarDay.isUposatha}');
print('Days this month: ${monthDays.length}');
final isSil = KhmerChhankitek.isSilDay(date);
final isKor = KhmerChhankitek.isKorDay(date);
print('ថ្ងៃសីល: $isSil');
print('ថ្ងៃកោរ: $isKor');
print(
'${KhmerChhankitek.formatKhmerGregorianDate(date)} ជា'
'${isSil ? 'ថ្ងៃសីល' : (isKor ? 'ថ្ងៃកោរ' : 'ថ្ងៃធម្មតា')}',
);
Demo output:
ថ្ងៃព្រហស្បតិ៍ ១៤រោច ខែចេត្រ ឆ្នាំមមីរ អដ្ឋស័ក ព.ស.២៥៦៩
ថ្ងៃទី១៦ ខែមេសា ឆ្នាំ២០២៦
Uposatha: false
Days this month: 30
ថ្ងៃសីល: true
ថ្ងៃកោរ: false
ថ្ងៃទី១៦ ខែមេសា ឆ្នាំ២០២៦ ជាថ្ងៃសីល
Full source example:
import 'package:khmer_intl/khmer_intl.dart';
void main() {
// Part 1: Today
final now = DateTime.now();
final today = KhmerChhankitek.day(now);
final todayMonthDays = KhmerChhankitek.month(
today.date.year,
today.date.month,
);
final todayKhmerDate = KhmerChhankitek.toKhmerLunarDate(now);
print('=== Today ===');
print(todayKhmerDate.toString());
print(KhmerChhankitek.formatKhmerGregorianDate(now));
print('Uposatha: ${today.isUposatha}');
print('Days this month: ${todayMonthDays.length}');
final todayIsSil = KhmerChhankitek.isSilDay(now);
final todayIsKor = KhmerChhankitek.isKorDay(now);
print('ថ្ងៃសីល: $todayIsSil');
print('ថ្ងៃកោរ: $todayIsKor');
print(
'${KhmerChhankitek.formatKhmerGregorianDate(now)} ជា'
'${todayIsSil ? 'ថ្ងៃសីល' : (todayIsKor ? 'ថ្ងៃកោរ' : 'ថ្ងៃធម្មតា')}',
);
// Part 2: Specific day
final specificDate = DateTime(2026, 5, 31);
final specificDay = KhmerChhankitek.day(specificDate);
final specificMonthDays = KhmerChhankitek.month(
specificDay.date.year,
specificDay.date.month,
);
final specificKhmerDate = KhmerChhankitek.toKhmerLunarDate(specificDate);
print('=== Specific Day (2026-05-31) ===');
print(specificKhmerDate.toString());
print(KhmerChhankitek.formatKhmerGregorianDate(specificDate));
print('Uposatha: ${specificDay.isUposatha}');
print('Days this month: ${specificMonthDays.length}');
final specificIsSil = KhmerChhankitek.isSilDay(specificDate);
final specificIsKor = KhmerChhankitek.isKorDay(specificDate);
print('ថ្ងៃសីល: $specificIsSil');
print('ថ្ងៃកោរ: $specificIsKor');
print(
'${KhmerChhankitek.formatKhmerGregorianDate(specificDate)} ជា'
'${specificIsSil ? 'ថ្ងៃសីល' : (specificIsKor ? 'ថ្ងៃកោរ' : 'ថ្ងៃធម្មតា')}',
);
}
Khmer New Year helper:
final ny = KhmerChhankitek.khmerNewYearByGregorianYear(2026);
print('hour: ${ny.timeOfNewYear.hour}');
print('minute: ${ny.timeOfNewYear.minute}');
print('dayLerngSak: ${ny.dayLerngSak}');
Demo output:
hour: 10
minute: 48
dayLerngSak: 3
Formatting helpers:
KhmerChhankitek.toKhmerDigits(123); // ១២៣
KhmerChhankitek.formatKhmerGregorianDate(date);
KhmerChhankitek.formatIsoDate(date); // 2026-04-16
KhmerChhankitek.formatIsoDateTime(date); // 2026-04-16 00:00:00
Lunar API Comparison
Use KhmerChhankitek when you need Khmer lunar engine features:
- Source:
khmer_lunar_chhankitekintegration - Best for:
day/month/year,isSilDay/isKorDay, Khmer New Year, Khmer date formatting helpers - Range:
1900..2100for day/year APIs - Accuracy: engine-backed (recommended for production lunar calculations)
final date = DateTime(2026, 4, 16);
final day = KhmerChhankitek.day(date);
final isSil = KhmerChhankitek.isSilDay(date);
final ny = KhmerChhankitek.khmerNewYearByGregorianYear(2026);
Core APIs
Top-level functions
toKhmerDigits(String input)toLatinDigits(String input)khmerPlural(num count, {required String one, required String other})
Formatters
KhmerNumberFormat.decimal(...)KhmerNumberFormat.currencyKHR(...)KhmerNumberFormat.compact(...)KhmerNumberFormat.percent(...)KhmerCompactNumberFormat(...)KhmerPercentFormat(...)KhmerDateFormat(pattern, ...)KhmerDateFormat.shortDate(...)KhmerDateFormat.mediumDate(...)KhmerDateFormat.fullDate(...)KhmerDateFormat.fullDateTime(...)KhmerDateFormat.dateTime(...)KhmerDateFormat.time(...)KhmerRelativeTime.format(...)
Extensions
int.toKhmerDigits()String.toKhmerDigits()String.toLatinDigits()num.toKhmerCurrency(...)num.toKhmerCompact(...)num.toKhmerPercent(...)DateTime.toKhmerDate(...)DateTime.toKhmerRelativeTime(...)DateTime.toKhmerChhankitekLunarDate()DateTime.toKhmerChhankitekLunarDay(...)DateTime.isKhmerChhankitekSilDay(...)DateTime.isKhmerChhankitekKorDay(...)DateTime.toKhmerChhankitekGregorianDate()DateTime.toKhmerChhankitekIsoDate()DateTime.toKhmerChhankitekIsoDateTime()
Flutter LocalizationsDelegate
A working Khmer LocalizationsDelegate example is included in:
example/lib/khmer_localizations.dartexample/lib/main.dart
localizationsDelegates: const [
KhmerLocalizations.delegate,
]
Notes
- Chhankitek lunar support range is
1900..2100for day/year APIs. - Compact/percent styles are designed to be practical and lightweight.
Testing
dart test
License
MIT
Sponsor Me
If you find my projects helpful and want to support my work, you can sponsor me! 💖