@herongxhr/sayhi
Version:
A framework-agnostic greeting generator based on time, date, and weekday with multi-language support
131 lines (128 loc) • 4.37 kB
JavaScript
function getLanguages() {
return {
"zh-CN": {
timeslots: {
morning: "早上好",
afternoon: "下午好",
evening: "晚上好",
night: "晚安",
},
dates: {
"03-11": "今天是3月11日",
},
weekdays: {
"0": "星期日愉快",
"1": "星期一愉快",
"2": "星期二愉快",
"3": "星期三愉快",
"4": "星期四愉快",
"5": "星期五愉快",
"6": "星期六愉快",
},
},
"en-US": {
timeslots: {
morning: "Good morning",
afternoon: "Good afternoon",
evening: "Good evening",
night: "Good night",
},
dates: {
"03-11": "Today is March 11",
},
weekdays: {
"0": "Happy Sunday",
"1": "Happy Monday",
"2": "Happy Tuesday",
"3": "Happy Wednesday",
"4": "Happy Thursday",
"5": "Happy Friday",
"6": "Happy Saturday",
},
},
};
}
class GreetingGenerator {
locale;
languages;
language;
timeSlots;
constructor(options) {
this.locale = options?.locale ?? "zh-CN";
this.timeSlots = options?.timeSlots ?? {
morning: { start: 6, end: 12 },
afternoon: { start: 12, end: 18 },
evening: { start: 18, end: 22 },
night: { start: 22, end: 6 },
};
const defaultLanguages = getLanguages();
if (options?.languages) {
const newLanguages = Object.fromEntries(Object.entries(options.languages).map(([locale, language]) => {
const defaultLanguage = defaultLanguages[locale];
return [
locale,
{
timeslots: {
...defaultLanguage.timeslots,
...(language?.timeslots ?? {}),
},
dates: {
...defaultLanguage.dates,
...(language?.dates ?? {}),
},
weekdays: {
...defaultLanguage.weekdays,
...(language?.weekdays ?? {}),
},
},
];
}));
this.languages = { ...defaultLanguages, ...newLanguages };
}
else {
this.languages = defaultLanguages;
}
this.language = this.languages[this.locale];
if (!this.language)
throw new Error(`Language '${this.locale}' not found.`);
}
getCurrentDate(date) {
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
return `${month}-${day}`;
}
getDayOfWeek(date) {
return date.getDay();
}
getCurrentTimeSlot(date) {
const hour = date.getHours();
for (const [slot, { start, end }] of Object.entries(this.timeSlots)) {
const isNight = slot === "night";
if ((isNight && (hour >= start || hour < end)) ||
(!isNight && hour >= start && hour < end)) {
return slot;
}
}
return "night";
}
generateGreeting() {
const currentDate = new Date();
const date = this.getCurrentDate(currentDate);
const day = this.getDayOfWeek(currentDate);
const timeSlot = this.getCurrentTimeSlot(currentDate);
const datePart = this.language.dates?.[date] || "";
const dayPart = this.language.weekdays?.[day] || "";
const timePart = this.language.timeslots?.[timeSlot];
return [datePart, dayPart, timePart].filter(Boolean).join(" ");
}
setLocale(locale) {
const language = this.languages[locale];
if (language) {
this.language = language;
}
else {
throw new Error(`Language '${locale}' not found.`);
}
}
}
export { GreetingGenerator, getLanguages };