Files
2026-09-24 16:25:22 +08:00

258 lines
8.2 KiB
Plaintext

/**
* xDate国际化支持
* 支持中文、英文、日文、韩文、繁体中文、法语和俄语
*/
export type xDateLanguage = 'zh-Hans' | 'en' | 'ja' | 'ko' | 'zh-Hant' | 'fr' | 'ru';
export type xDateI18nTypeRelativeTime = {
future: string,
past: string,
s: string,
m: string,
mm: string,
h: string,
hh: string,
d: string,
dd: string,
M: string,
MM: string,
y: string,
yy: string
}
export type xDateI18nType = {
weekdays: string[],
weekdaysShort: string[],
months: string[],
monthsShort: string[],
meridiem: (hour: number, minute: number, isLowercase: boolean) => string,
relativeTime: xDateI18nTypeRelativeTime
}
// 中文简体
const zhHans: xDateI18nType = {
weekdays: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
weekdaysShort: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
monthsShort: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
meridiem: (hour: number, minute: number, isLowercase: boolean): string => {
return hour < 12 ? '上午' : '下午';
},
relativeTime: {
future: '%s内',
past: '%s前',
s: '几秒',
m: '1分钟',
mm: '%d分钟',
h: '1小时',
hh: '%d小时',
d: '1天',
dd: '%d天',
M: '1个月',
MM: '%d个月',
y: '1年',
yy: '%d年'
}
};
// 英文
const en: xDateI18nType = {
weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
meridiem: (hour: number, minute: number, isLowercase: boolean): string => {
return hour < 12 ? (isLowercase ? 'am' : 'AM') : (isLowercase ? 'pm' : 'PM');
},
relativeTime: {
future: 'in %s',
past: '%s ago',
s: 'a few seconds',
m: 'a minute',
mm: '%d minutes',
h: 'an hour',
hh: '%d hours',
d: 'a day',
dd: '%d days',
M: 'a month',
MM: '%d months',
y: 'a year',
yy: '%d years'
}
};
// 日文
const ja: xDateI18nType = {
weekdays: ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'],
weekdaysShort: ['日', '月', '火', '水', '木', '金', '土'],
months: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
monthsShort: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
meridiem: (hour: number, minute: number, isLowercase: boolean): string => {
return hour < 12 ? '午前' : '午後';
},
relativeTime: {
future: '%s後',
past: '%s前',
s: '数秒',
m: '1分',
mm: '%d分',
h: '1時間',
hh: '%d時間',
d: '1日',
dd: '%d日',
M: '1ヶ月',
MM: '%dヶ月',
y: '1年',
yy: '%d年'
}
};
// 韩文
const ko: xDateI18nType = {
weekdays: ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'],
weekdaysShort: ['일', '월', '화', '수', '목', '금', '토'],
months: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
monthsShort: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
meridiem: (hour: number, minute: number, isLowercase: boolean): string => {
return hour < 12 ? '오전' : '오후';
},
relativeTime: {
future: '%s 후',
past: '%s 전',
s: '몇 초',
m: '1분',
mm: '%d분',
h: '1시간',
hh: '%d시간',
d: '1일',
dd: '%d일',
M: '1개월',
MM: '%d개월',
y: '1년',
yy: '%d년'
}
};
// 繁体中文
const zhHant: xDateI18nType = {
weekdays: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
weekdaysShort: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],
months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
monthsShort: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
meridiem: (hour: number, minute: number, isLowercase: boolean): string => {
return hour < 12 ? '上午' : '下午';
},
relativeTime: {
future: '%s內',
past: '%s前',
s: '幾秒',
m: '1分鐘',
mm: '%d分鐘',
h: '1小時',
hh: '%d小時',
d: '1天',
dd: '%d天',
M: '1個月',
MM: '%d個月',
y: '1年',
yy: '%d年'
}
};
// 法语
const fr: xDateI18nType = {
weekdays: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
weekdaysShort: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
months: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
monthsShort: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
meridiem: (hour: number, minute: number, isLowercase: boolean): string => {
return '';
},
relativeTime: {
future: 'dans %s',
past: 'il y a %s',
s: 'quelques secondes',
m: 'une minute',
mm: '%d minutes',
h: 'une heure',
hh: '%d heures',
d: 'un jour',
dd: '%d jours',
M: 'un mois',
MM: '%d mois',
y: 'un an',
yy: '%d ans'
}
};
// 俄语
const ru: xDateI18nType = {
weekdays: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],
weekdaysShort: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
months: ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],
monthsShort: ['янв.', 'февр.', 'март', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],
meridiem: (hour: number, minute: number, isLowercase: boolean): string => {
return '';
},
relativeTime: {
future: 'через %s',
past: '%s назад',
s: 'несколько секунд',
m: 'минута',
mm: '%d минут',
h: 'час',
hh: '%d часов',
d: 'день',
dd: '%d дней',
M: 'месяц',
MM: '%d месяцев',
y: 'год',
yy: '%d лет'
}
};
// 语言映射表
export const locales: Map<xDateLanguage, xDateI18nType> = new Map([
['zh-Hans', zhHans],
['en', en],
['ja', ja],
['ko', ko],
['zh-Hant', zhHant],
['fr', fr],
['ru', ru]
]);
// 默认语言
let currentLocale: xDateLanguage = 'zh-Hans';
/**
* 获取当前语言设置
*/
export function getCurrentLocale(): xDateLanguage {
return currentLocale;
}
/**
* 设置当前语言
* @param locale 语言代码
*/
export function setLocale(locale: xDateLanguage): void {
if (locales.has(locale)) {
currentLocale = locale;
}
}
/**
* 获取当前语言的本地化数据
*/
export function getLocaleData(): xDateI18nType {
return locales.get(currentLocale)!;
}
/**
* 获取指定语言的本地化数据
* @param locale 语言代码
*/
export function getLocaleDataByCode(locale: xDateLanguage): xDateI18nType | null {
return locales.has(locale) ? locales.get(locale)! : null;
}