support setting the last 1 to 3 days of the month to scheduled transaction frequency

This commit is contained in:
MaysWind 2026-04-13 00:06:45 +08:00
parent 0222f61da6
commit d7151bc7ab
26 changed files with 148 additions and 32 deletions

View file

@ -727,6 +727,16 @@ func (s *TransactionService) CreateScheduledTransactions(c core.Context, current
continue
}
if template.ScheduledFrequencyType == models.TRANSACTION_SCHEDULE_FREQUENCY_TYPE_MONTHLY {
maxDayInMonth := utils.GetMaxDayOfMonth(currentTime.Year(), currentTime.Month())
for i := 0; i < len(frequencyValues); i++ {
if frequencyValues[i] < 0 {
frequencyValues[i] = int64(maxDayInMonth) + frequencyValues[i] + 1
}
}
}
frequencyValueSet := utils.ToSet(frequencyValues)
templateTimeZone := time.FixedZone("Template Timezone", int(template.ScheduledTimezoneUtcOffset)*60)
transactionUnixTime := todayFirstUnixTimeInUTC + int64(template.ScheduledAt)*60

View file

@ -286,6 +286,12 @@ func IsUnixTimeEqualsYearAndMonth(unixTime int64, timezone *time.Location, year
return date.Year() == int(year) && int(date.Month()) == int(month)
}
// GetMaxDayOfMonth returns the maximum day of the month for the specified year and month
func GetMaxDayOfMonth(year int, month time.Month) int {
t := time.Date(year, month+1, 0, 0, 0, 0, 0, time.UTC)
return t.Day()
}
// GetTimezoneOffsetMinutes returns offset minutes according specified timezone
func GetTimezoneOffsetMinutes(unixTime int64, timezone *time.Location) int16 {
_, tzOffset := parseFromUnixTime(unixTime).In(timezone).Zone()

View file

@ -333,6 +333,32 @@ func TestIsUnixTimeEqualsYearAndMonth(t *testing.T) {
assert.Equal(t, false, actualValue)
}
func TestGetMaxDayOfMonth(t *testing.T) {
expectedValue := 31
actualValue := GetMaxDayOfMonth(2023, 1)
assert.Equal(t, expectedValue, actualValue)
expectedValue = 28
actualValue = GetMaxDayOfMonth(2023, 2)
assert.Equal(t, expectedValue, actualValue)
expectedValue = 29
actualValue = GetMaxDayOfMonth(2024, 2)
assert.Equal(t, expectedValue, actualValue)
expectedValue = 30
actualValue = GetMaxDayOfMonth(2023, 4)
assert.Equal(t, expectedValue, actualValue)
expectedValue = 31
actualValue = GetMaxDayOfMonth(2023, 12)
assert.Equal(t, expectedValue, actualValue)
expectedValue = 28
actualValue = GetMaxDayOfMonth(2100, 2)
assert.Equal(t, expectedValue, actualValue)
}
func TestGetTimezoneOffsetMinutes_FixedTimezone(t *testing.T) {
timezone := time.FixedZone("Test Timezone", 120*60)
expectedValue := int16(120)

View file

@ -15,30 +15,18 @@ export interface CommonScheduleFrequencySelectionProps {
label?: string;
}
export interface AvailableMonthDay {
day: number;
displayName: string;
}
export function useScheduleFrequencySelectionBase() {
const { getAllWeekDays, getAllTransactionScheduledFrequencyTypes, getMonthdayShortName } = useI18n();
const {
getAllWeekDays,
getAvailableMonthDays,
getAllTransactionScheduledFrequencyTypes
} = useI18n();
const userStore = useUserStore();
const allTransactionScheduledFrequencyTypes = computed<TypeAndDisplayName[]>(() => getAllTransactionScheduledFrequencyTypes());
const allWeekDays = computed<TypeAndDisplayName[]>(() => getAllWeekDays(userStore.currentUserFirstDayOfWeek));
const allAvailableMonthDays = computed<AvailableMonthDay[]>(() => {
const allAvailableDays = [];
for (let i = 1; i <= 28; i++) {
allAvailableDays.push({
day: i,
displayName: getMonthdayShortName(i),
});
}
return allAvailableDays;
});
const allAvailableMonthDays = computed<TypeAndDisplayName[]>(() => getAvailableMonthDays(28, 3));
function getFrequencyValues(value: string): number[] {
const values = value.split(',');

View file

@ -41,12 +41,12 @@
</v-list>
<v-list select-strategy="classic" v-model:selected="frequencyValue"
v-else-if="frequencyType === ScheduledTemplateFrequencyType.Monthly.type">
<v-list-item :key="monthDay.day" :value="monthDay.day" :title="monthDay.displayName"
:class="{ 'frequency-value-selected v-list-item--active text-primary': isFrequencyValueSelected(monthDay.day) }"
<v-list-item :key="monthDay.type" :value="monthDay.type" :title="monthDay.displayName"
:class="{ 'frequency-value-selected v-list-item--active text-primary': isFrequencyValueSelected(monthDay.type) }"
v-for="monthDay in allAvailableMonthDays">
<template #prepend="{ isActive }">
<v-checkbox density="compact" class="me-1" :model-value="isActive"
@update:model-value="updateFrequencyValue(monthDay.day, $event)"></v-checkbox>
@update:model-value="updateFrequencyValue(monthDay.type, $event)"></v-checkbox>
</template>
</v-list-item>
</v-list>

View file

@ -48,10 +48,10 @@
<f7-list dividers class="schedule-frequency-value-list no-margin-vertical"
v-if="currentFrequencyType === ScheduledTemplateFrequencyType.Monthly.type">
<f7-list-item checkbox
:class="isChecked(monthDay.day) ? 'list-item-selected' : ''"
:key="monthDay.day"
:value="monthDay.day"
:checked="isChecked(monthDay.day)"
:class="isChecked(monthDay.type) ? 'list-item-selected' : ''"
:key="monthDay.type"
:value="monthDay.type"
:checked="isChecked(monthDay.type)"
:title="monthDay.displayName"
v-for="monthDay in allAvailableMonthDays"
@change="changeFrequencyValue">

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "{hours} Stunde(n) und {minutes} Minute(n) vor der Standardzeitzone",
"monthDay": "{ordinal} Tag",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} Tage",
"everyMultiDaysOfWeek": "Jeden {days}",
"everyMultiDaysOfMonth": "Jeden {days} des Monats",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Vorheriger Abrechnungszeitraum",
"Current Billing Cycle": "Aktueller Abrechnungszeitraum",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Benutzerdefiniertes Datum",
"Start Date": "Startdatum",
"End Date": "Enddatum",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "{hours} hour(s) and {minutes} minutes ahead of default timezone",
"monthDay": "{ordinal} day",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} days",
"everyMultiDaysOfWeek": "Every {days}",
"everyMultiDaysOfMonth": "Every {days} of month",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Previous Billing Cycle",
"Current Billing Cycle": "Current Billing Cycle",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Custom Date",
"Start Date": "Start Date",
"End Date": "End Date",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "{hours} hora(s) y {minutes} minutos antes de la zona horaria predeterminada",
"monthDay": "día {ordinal}",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} días",
"everyMultiDaysOfWeek": "Cada {days}",
"everyMultiDaysOfMonth": "Cada {days} del mes",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Ciclo de facturación anterior",
"Current Billing Cycle": "Ciclo de facturación actual",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Fecha personalizada",
"Start Date": "Fecha de Inicio",
"End Date": "Fecha de Finalización",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "{hours} heure(s) et {minutes} minutes d'avance sur le fuseau horaire par défaut",
"monthDay": "{ordinal}e jour",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} jours",
"everyMultiDaysOfWeek": "Tous les {days}",
"everyMultiDaysOfMonth": "Tous les {days} du mois",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Cycle de facturation précédent",
"Current Billing Cycle": "Cycle de facturation actuel",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Date personnalisée",
"Start Date": "Date de début",
"End Date": "Date de fin",

View file

@ -1693,16 +1693,45 @@ export function useI18n() {
return '';
}
monthDays.sort(function (d1, d2) {
if (d1 >= 0 && d2 >= 0) {
return d1 - d2;
} else if (d1 < 0 && d2 < 0) {
return d1 - d2;
} else if (d1 >= 0 && d2 < 0) {
return -1; // make positive month day come first
} else { // if (d1 < 0 && d2 >= 0)
return 1; // make positive month day come first
}
});
if (monthDays.length === 1) {
return t('format.misc.monthDay', {
ordinal: getMonthdayOrdinal(monthDays[0] as number)
});
const monthDay = monthDays[0] as number;
if (monthDay >= 0) {
return t('format.misc.monthDay', {
ordinal: getMonthdayOrdinal(monthDay)
});
} else if (monthDay === -1) {
return t('last day');
} else {
return t('format.misc.lastMonthDayInLowercase', {
ordinal: getMonthdayOrdinal(-monthDay)
});
}
} else {
return t('format.misc.monthDays', {
multiMonthDays: joinMultiText(monthDays.map(monthDay =>
t('format.misc.eachMonthDayInMonthDays', {
ordinal: getMonthdayOrdinal(monthDay)
})))
multiMonthDays: joinMultiText(monthDays.map(monthDay => {
if (monthDay >= 0) {
return t('format.misc.eachMonthDayInMonthDays', {
ordinal: getMonthdayOrdinal(monthDay)
});
} else {
return t('format.misc.eachLastMonthDayInMonthDays', {
ordinal: getMonthdayOrdinal(-monthDay)
});
}
}))
});
}
}

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "Avanti di {hours} ore e {minutes} minuti rispetto al fuso orario standard",
"monthDay": "{ordinal} giorno",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} giorni",
"everyMultiDaysOfWeek": "Ogni {days}",
"everyMultiDaysOfMonth": "Ogni {days} del mese",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Ciclo di fatturazione precedente",
"Current Billing Cycle": "Ciclo di fatturazione corrente",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Data personalizzata",
"Start Date": "Data di inizio",
"End Date": "Data di fine",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "デフォルトのタイムゾーンから{hours}時間{minutes}分進んでいます",
"monthDay": "{ordinal}日",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays}日間",
"everyMultiDaysOfWeek": "毎{days}",
"everyMultiDaysOfMonth": "毎月{days}日",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "以前の請求サイクル",
"Current Billing Cycle": "現在の請求サイクル",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "カスタム日付",
"Start Date": "開始日",
"End Date": "終了日",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "ಡೀಫಾಲ್ಟ್ ಸಮಯ ವಲಯಕ್ಕಿಂತ {hours} ಗಂಟೆ ಹಾಗೂ {minutes} ನಿಮಿಷಗಳು ಮುಂದೆ",
"monthDay": "{ordinal} ದಿನ",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} ದಿನಗಳು",
"everyMultiDaysOfWeek": "ಪ್ರತಿ {days}",
"everyMultiDaysOfMonth": "ಪ್ರತಿ {days} ತಿಂಗಳಲ್ಲಿ",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "ಹಿಂದಿನ ಬಿಲ್ಲಿಂಗ್ ಚಕ್ರ",
"Current Billing Cycle": "ಪ್ರಸ್ತುತ ಬಿಲ್ಲಿಂಗ್ ಚಕ್ರ",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "ಕಸ್ಟಮ್ ದಿನಾಂಕ",
"Start Date": "ಪ್ರಾರಂಭ ದಿನಾಂಕ",
"End Date": "ಅಂತ್ಯ ದಿನಾಂಕ",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "기본 시간대보다 {hours}시간 {minutes}분 빠릅니다",
"monthDay": "{ordinal}일",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays}일",
"everyMultiDaysOfWeek": "매주 {days}",
"everyMultiDaysOfMonth": "매월 {days}일",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "이전 청구 주기",
"Current Billing Cycle": "현재 청구 주기",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "사용자 지정 날짜",
"Start Date": "시작 날짜",
"End Date": "종료 날짜",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "{hours} uur en {minutes} minuten voor op standaardtijdzone",
"monthDay": "{ordinal} dag",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} dagen",
"everyMultiDaysOfWeek": "Elke {days}",
"everyMultiDaysOfMonth": "Elke {days} van de maand",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Vorige factureringsperiode",
"Current Billing Cycle": "Huidige factureringsperiode",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Aangepaste datum",
"Start Date": "Begindatum",
"End Date": "Einddatum",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "{hours} hora(s) e {minutes} minutos à frente do fuso horário padrão",
"monthDay": "{ordinal} dia",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} dias",
"everyMultiDaysOfWeek": "A cada {days}",
"everyMultiDaysOfMonth": "Todo dia {days}",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Ciclo de Cobrança Anterior",
"Current Billing Cycle": "Ciclo de Cobrança Atual",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Data Personalizada",
"Start Date": "Data de Início",
"End Date": "Data de Término",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "{hours} час(ов) и {minutes} минут впереди часового пояса по умолчанию",
"monthDay": "{ordinal} день",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} дней",
"everyMultiDaysOfWeek": "Каждые {days}",
"everyMultiDaysOfMonth": "Каждое {days} число месяца",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Предыдущий расчетный период",
"Current Billing Cycle": "Текущий расчетный период",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Выбрать дату",
"Start Date": "Дата начала",
"End Date": "Дата конца",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "{hours} ura(ur) in {minutes} minut po privzetem časovnem pasu",
"monthDay": "{ordinal} dan",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} dni",
"everyMultiDaysOfWeek": "Vsak {days}",
"everyMultiDaysOfMonth": "Vsak {days} v mesecu",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Prejšnje obračunsko obdobje",
"Current Billing Cycle": "Trenutno obračunsko obdobje",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Datum po meri",
"Start Date": "Datum začetka",
"End Date": "Datum konca",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "இயல்பு நேர மண்டலத்தை விட {hours} மணி நேரம் {minutes} நிமிடங்கள் முன்னால்",
"monthDay": "{ordinal} நாள்",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} நாட்கள்",
"everyMultiDaysOfWeek": "ஒவ்வொரு {days}",
"everyMultiDaysOfMonth": "மாதத்தில் ஒவ்வொரு {days}",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "முந்தைய பில்லிங் சுழற்சி",
"Current Billing Cycle": "தற்போதைய பில்லிங் சுழற்சி",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "தனிப்பயன் தேதி",
"Start Date": "தொடக்கம் தேதி",
"End Date": "முடிவு தேதி",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "เร็วกว่าเขตเวลาเริ่มต้น {hours} ชั่วโมง {minutes} นาที",
"monthDay": "วันที่ {ordinal}",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} วัน",
"everyMultiDaysOfWeek": "ทุกๆ {days}",
"everyMultiDaysOfMonth": "ทุกๆ {days} ของเดือน",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "รอบบิลก่อนหน้า",
"Current Billing Cycle": "รอบบิลปัจจุบัน",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "วันที่กำหนดเอง",
"Start Date": "วันที่เริ่มต้น",
"End Date": "วันที่สิ้นสุด",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "Varsayılan saat diliminin {hours} saat {minutes} dakika ilerisinde",
"monthDay": "{ordinal} gün",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} gün",
"everyMultiDaysOfWeek": "Her {days}",
"everyMultiDaysOfMonth": "Ayın her {days} günü",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Önceki Fatura Dönemi",
"Current Billing Cycle": "Mevcut Fatura Dönemi",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Özel Tarih",
"Start Date": "Başlangıç Tarihi",
"End Date": "Bitiş Tarihi",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "{hours} год і {minutes} хв попереду часового поясу за замовчуванням",
"monthDay": "{ordinal} день",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} днів",
"everyMultiDaysOfWeek": "Кожні {days}",
"everyMultiDaysOfMonth": "Кожного {days} числа місяця",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Попередній розрахунковий період",
"Current Billing Cycle": "Поточний розрахунковий період",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Обрати дату",
"Start Date": "Дата початку",
"End Date": "Дата завершення",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "{hours} giờ và {minutes} phút trước múi giờ mặc định",
"monthDay": "Ngày {ordinal}",
"lastMonthDay": "Last {ordinal} day",
"lastMonthDayInLowercase": "last {ordinal} day",
"eachMonthDayInMonthDays": "{ordinal}",
"eachLastMonthDayInMonthDays": "last {ordinal}",
"monthDays": "{multiMonthDays} ngày",
"everyMultiDaysOfWeek": "Mỗi {days}",
"everyMultiDaysOfMonth": "Mỗi ngày {days} trong tháng",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "Previous Billing Cycle",
"Current Billing Cycle": "Current Billing Cycle",
"Last day": "Last day",
"last day": "last day",
"Custom Date": "Ngày tùy chỉnh",
"Start Date": "Start Date",
"End Date": "End Date",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "比默认时区早{hours}小时{minutes}分",
"monthDay": "{ordinal}日",
"lastMonthDay": "倒数第{ordinal}日",
"lastMonthDayInLowercase": "倒数第{ordinal}日",
"eachMonthDayInMonthDays": "{ordinal}日",
"eachLastMonthDayInMonthDays": "倒数第{ordinal}日",
"monthDays": "{multiMonthDays}",
"everyMultiDaysOfWeek": "每{days}",
"everyMultiDaysOfMonth": "每月{days}",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "上个账单周期",
"Current Billing Cycle": "当前账单周期",
"Last day": "倒数第1日",
"last day": "倒数第1日",
"Custom Date": "自定义日期",
"Start Date": "开始日期",
"End Date": "结束日期",

View file

@ -120,7 +120,9 @@
"hoursMinutesAheadOfDefaultTimezone": "比預設時區早{hours}小時{minutes}分",
"monthDay": "{ordinal}日",
"lastMonthDay": "倒數第{ordinal}日",
"lastMonthDayInLowercase": "倒數第{ordinal}日",
"eachMonthDayInMonthDays": "{ordinal}日",
"eachLastMonthDayInMonthDays": "倒數第{ordinal}日",
"monthDays": "{multiMonthDays}",
"everyMultiDaysOfWeek": "每{days}",
"everyMultiDaysOfMonth": "每月{days}",
@ -1542,6 +1544,7 @@
"Previous Billing Cycle": "上個帳單週期",
"Current Billing Cycle": "當前帳單週期",
"Last day": "倒數第1日",
"last day": "倒數第1日",
"Custom Date": "自訂日期",
"Start Date": "開始日期",
"End Date": "結束日期",