UNPKG

@herongxhr/sayhi

Version:

A framework-agnostic greeting generator based on time, date, and weekday with multi-language support

134 lines (130 loc) 4.42 kB
'use strict'; 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.`); } } } exports.GreetingGenerator = GreetingGenerator; exports.getLanguages = getLanguages;