/** * 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 = 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; }