258 lines
8.2 KiB
Plaintext
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;
|
|
} |