fix: 🐛 fix ordinal locale

This commit is contained in:
Jin 2025-04-03 19:51:01 +02:00
parent dc16b2cb26
commit 79a7513325

View File

@ -8,6 +8,7 @@ import hoistedNoteService from "./hoisted_note.js";
import type BNote from "../becca/entities/bnote.js"; import type BNote from "../becca/entities/bnote.js";
import optionService from "./options.js"; import optionService from "./options.js";
import { t } from "i18next"; import { t } from "i18next";
import i18next from "i18next";
import dayjs from "dayjs"; import dayjs from "dayjs";
import type { Dayjs } from "dayjs"; import type { Dayjs } from "dayjs";
import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js";
@ -59,7 +60,24 @@ function getTimeUnitReplacements(timeUnit: TimeUnit): string[] {
return units.slice(0, index + 1).flatMap(unit => baseReplacements[unit]); return units.slice(0, index + 1).flatMap(unit => baseReplacements[unit]);
} }
function getJournalNoteTitle(rootNote: BNote, timeUnit: TimeUnit, dateObj: Dayjs, number: number) { async function ordinal(date: Dayjs, lng: string) {
const localeMap: Record<string, string> = {
'cn': 'zh-cn',
'tw': 'zh-tw'
};
const dayjsLocale = localeMap[lng] || lng;
try {
await import(`dayjs/locale/${dayjsLocale}.js`);
} catch (err) {
console.warn(`Could not load locale ${dayjsLocale}`, err);
}
return dayjs(date).locale(dayjsLocale).format('Do');
}
async function getJournalNoteTitle(rootNote: BNote, timeUnit: TimeUnit, dateObj: Dayjs, number: number) {
const patterns = { const patterns = {
year: rootNote.getOwnedLabelValue("yearPattern") || "{year}", year: rootNote.getOwnedLabelValue("yearPattern") || "{year}",
quarter: rootNote.getOwnedLabelValue("quarterPattern") || t('quarterNumber'), quarter: rootNote.getOwnedLabelValue("quarterPattern") || t('quarterNumber'),
@ -72,6 +90,7 @@ function getJournalNoteTitle(rootNote: BNote, timeUnit: TimeUnit, dateObj: Dayjs
const monthName = t(MONTH_TRANSLATION_IDS[dateObj.month()]); const monthName = t(MONTH_TRANSLATION_IDS[dateObj.month()]);
const weekDay = t(WEEKDAY_TRANSLATION_IDS[dateObj.day()]); const weekDay = t(WEEKDAY_TRANSLATION_IDS[dateObj.day()]);
const numberStr = number.toString(); const numberStr = number.toString();
const ordinalStr = await ordinal(dateObj, i18next.language);
const allReplacements: Record<string, string> = { const allReplacements: Record<string, string> = {
// Common date formats // Common date formats
@ -99,7 +118,7 @@ function getJournalNoteTitle(rootNote: BNote, timeUnit: TimeUnit, dateObj: Dayjs
'{isoDate}': dateObj.format('YYYY-MM-DD'), '{isoDate}': dateObj.format('YYYY-MM-DD'),
'{dateNumber}': numberStr, '{dateNumber}': numberStr,
'{dateNumberPadded}': numberStr.padStart(2, '0'), '{dateNumberPadded}': numberStr.padStart(2, '0'),
'{ordinal}': dateObj.format('Do'), '{ordinal}': ordinalStr,
'{weekDay}': weekDay, '{weekDay}': weekDay,
'{weekDay3}': weekDay.substring(0, 3), '{weekDay3}': weekDay.substring(0, 3),
'{weekDay2}': weekDay.substring(0, 2) '{weekDay2}': weekDay.substring(0, 2)
@ -192,7 +211,7 @@ function getQuarterNumberStr(date: Dayjs) {
return `${date.year()}-Q${date.quarter()}`; return `${date.year()}-Q${date.quarter()}`;
} }
function getQuarterNote(quarterStr: string, _rootNote: BNote | null = null): BNote { async function getQuarterNote(quarterStr: string, _rootNote: BNote | null = null): Promise<BNote> {
const rootNote = _rootNote || getRootCalendarNote(); const rootNote = _rootNote || getRootCalendarNote();
quarterStr = quarterStr.trim().substring(0, 7); quarterStr = quarterStr.trim().substring(0, 7);
@ -209,7 +228,7 @@ function getQuarterNote(quarterStr: string, _rootNote: BNote | null = null): BNo
const quarterStartDate = dayjs().year(parseInt(yearStr)).month(firstMonth).date(1); const quarterStartDate = dayjs().year(parseInt(yearStr)).month(firstMonth).date(1);
const yearNote = getYearNote(yearStr, rootNote); const yearNote = getYearNote(yearStr, rootNote);
const noteTitle = getJournalNoteTitle(rootNote, 'quarter', quarterStartDate, quarterNumber); const noteTitle = await getJournalNoteTitle(rootNote, 'quarter', quarterStartDate, quarterNumber);
sql.transactional(() => { sql.transactional(() => {
quarterNote = createNote(yearNote, noteTitle); quarterNote = createNote(yearNote, noteTitle);
@ -227,7 +246,7 @@ function getQuarterNote(quarterStr: string, _rootNote: BNote | null = null): BNo
return quarterNote as unknown as BNote; return quarterNote as unknown as BNote;
} }
function getMonthNote(dateStr: string, _rootNote: BNote | null = null): BNote { async function getMonthNote(dateStr: string, _rootNote: BNote | null = null): Promise<BNote> {
const rootNote = _rootNote || getRootCalendarNote(); const rootNote = _rootNote || getRootCalendarNote();
const monthStr = dateStr.substring(0, 7); const monthStr = dateStr.substring(0, 7);
@ -242,12 +261,12 @@ function getMonthNote(dateStr: string, _rootNote: BNote | null = null): BNote {
let monthParentNote; let monthParentNote;
if (rootNote.hasLabel('enableQuarterNote')) { if (rootNote.hasLabel('enableQuarterNote')) {
monthParentNote = getQuarterNote(getQuarterNumberStr(dayjs(dateStr)), rootNote); monthParentNote = await getQuarterNote(getQuarterNumberStr(dayjs(dateStr)), rootNote);
} else { } else {
monthParentNote = getYearNote(dateStr, rootNote); monthParentNote = getYearNote(dateStr, rootNote);
} }
const noteTitle = getJournalNoteTitle(rootNote, 'month', dayjs(dateStr), parseInt(monthNumber)); const noteTitle = await getJournalNoteTitle(rootNote, 'month', dayjs(dateStr), parseInt(monthNumber));
sql.transactional(() => { sql.transactional(() => {
monthNote = createNote(monthParentNote, noteTitle); monthNote = createNote(monthParentNote, noteTitle);
@ -354,7 +373,7 @@ function getWeekFirstDayNote(dateStr: string, rootNote: BNote | null = null) {
return getDayNote(weekStartDate.format('YYYY-MM-DD'), rootNote); return getDayNote(weekStartDate.format('YYYY-MM-DD'), rootNote);
} }
function getWeekNote(weekStr: string, _rootNote: BNote | null = null): BNote | null { async function getWeekNote(weekStr: string, _rootNote: BNote | null = null): Promise<BNote | null> {
const rootNote = _rootNote || getRootCalendarNote(); const rootNote = _rootNote || getRootCalendarNote();
if (!rootNote.hasLabel('enableWeekNote')) { if (!rootNote.hasLabel('enableWeekNote')) {
return null; return null;
@ -379,10 +398,10 @@ function getWeekNote(weekStr: string, _rootNote: BNote | null = null): BNote | n
const startMonth = startDate.month(); const startMonth = startDate.month();
const endMonth = endDate.month(); const endMonth = endDate.month();
const monthNote = getMonthNote(startDate.format('YYYY-MM-DD'), rootNote); const monthNote = await getMonthNote(startDate.format('YYYY-MM-DD'), rootNote);
const noteTitle = getJournalNoteTitle(rootNote, 'week', startDate, weekNumber); const noteTitle = await getJournalNoteTitle(rootNote, 'week', startDate, weekNumber);
sql.transactional(() => { sql.transactional(async () => {
weekNote = createNote(monthNote, noteTitle); weekNote = createNote(monthNote, noteTitle);
attributeService.createLabel(weekNote.noteId, WEEK_LABEL, weekStr); attributeService.createLabel(weekNote.noteId, WEEK_LABEL, weekStr);
@ -396,7 +415,7 @@ function getWeekNote(weekStr: string, _rootNote: BNote | null = null): BNote | n
// If the week spans different months, clone the week note in the other month as well // If the week spans different months, clone the week note in the other month as well
if (startMonth !== endMonth) { if (startMonth !== endMonth) {
const secondMonthNote = getMonthNote(endDate.format('YYYY-MM-DD'), rootNote); const secondMonthNote = await getMonthNote(endDate.format('YYYY-MM-DD'), rootNote);
cloningService.cloneNoteToParentNote(weekNote.noteId, secondMonthNote.noteId); cloningService.cloneNoteToParentNote(weekNote.noteId, secondMonthNote.noteId);
} }
}); });
@ -404,7 +423,7 @@ function getWeekNote(weekStr: string, _rootNote: BNote | null = null): BNote | n
return weekNote as unknown as BNote; return weekNote as unknown as BNote;
} }
function getDayNote(dateStr: string, _rootNote: BNote | null = null): BNote { async function getDayNote(dateStr: string, _rootNote: BNote | null = null): Promise<BNote> {
const rootNote = _rootNote || getRootCalendarNote(); const rootNote = _rootNote || getRootCalendarNote();
dateStr = dateStr.trim().substring(0, 10); dateStr = dateStr.trim().substring(0, 10);
@ -418,13 +437,13 @@ function getDayNote(dateStr: string, _rootNote: BNote | null = null): BNote {
let dateParentNote; let dateParentNote;
if (rootNote.hasLabel('enableWeekNote')) { if (rootNote.hasLabel('enableWeekNote')) {
dateParentNote = getWeekNote(getWeekNumberStr(dayjs(dateStr)), rootNote); dateParentNote = await getWeekNote(getWeekNumberStr(dayjs(dateStr)), rootNote);
} else { } else {
dateParentNote = getMonthNote(dateStr, rootNote); dateParentNote = await getMonthNote(dateStr, rootNote);
} }
const dayNumber = dateStr.substring(8, 10); const dayNumber = dateStr.substring(8, 10);
const noteTitle = getJournalNoteTitle(rootNote, 'day', dayjs(dateStr), parseInt(dayNumber)); const noteTitle = await getJournalNoteTitle(rootNote, 'day', dayjs(dateStr), parseInt(dayNumber));
sql.transactional(() => { sql.transactional(() => {
dateNote = createNote(dateParentNote as BNote, noteTitle); dateNote = createNote(dateParentNote as BNote, noteTitle);
@ -454,7 +473,5 @@ export default {
getWeekFirstDayNote, getWeekFirstDayNote,
getDayNote, getDayNote,
getTodayNote, getTodayNote,
getJournalNoteTitle, getJournalNoteTitle
getWeekStartDate,
getWeekNumberStr
}; };