diff --git a/app/apps/common/widgets/datepicker.py b/app/apps/common/widgets/datepicker.py index 2075adc..9928ba1 100644 --- a/app/apps/common/widgets/datepicker.py +++ b/app/apps/common/widgets/datepicker.py @@ -37,7 +37,9 @@ class AirDatePickerInput(widgets.DateInput): def _get_current_language(): """Get current language code in format compatible with AirDatepicker""" lang_code = translation.get_language() - # AirDatepicker uses simple language codes + # AirDatepicker uses simple language codes, except for pt-br + if lang_code.lower() == "pt-br": + return "pt-BR" return lang_code.split("-")[0] def _get_format(self): diff --git a/frontend/src/application/datepicker.js b/frontend/src/application/datepicker.js index 933be58..4224386 100644 --- a/frontend/src/application/datepicker.js +++ b/frontend/src/application/datepicker.js @@ -1,15 +1,21 @@ import AirDatepicker from 'air-datepicker'; -import en from 'air-datepicker/locale/en'; -import ptBr from 'air-datepicker/locale/pt-BR'; -import nl from 'air-datepicker/locale/nl'; -import de from 'air-datepicker/locale/de'; import {createPopper} from '@popperjs/core'; -const locales = { - 'pt': ptBr, - 'en': en, - 'nl': nl, - 'de': de +/** + * Dynamically imports a language file from the locale folder. + * + * @param {string} langCode - The two-letter language code (e.g., 'en', 'es'). + * @returns {Promise} A promise that resolves with the default export of the language file. + */ +export const getLocale = async (langCode) => { + try { + const localeModule = await import(`air-datepicker/locale/${langCode}.js`); + return localeModule.default; + } catch (error) { + console.warn(`Could not find locale for '${langCode}'. Defaulting to English.`); + const englishModule = await import('air-datepicker/locale/en.js'); + return englishModule.default; + } }; function isMobileDevice() { @@ -25,7 +31,7 @@ function isMobile() { return isMobileDevice() || isTouchDevice(); } -window.DatePicker = function createDynamicDatePicker(element) { +window.DatePicker = async function createDynamicDatePicker(element) { let todayButton = { content: element.dataset.nowButtonTxt, onClick: (dp) => { @@ -45,7 +51,7 @@ window.DatePicker = function createDynamicDatePicker(element) { toggleSelected: element.dataset.toggleSelected === 'true', autoClose: element.dataset.autoClose === 'true', buttons: element.dataset.clearButton === 'true' ? ['clear', todayButton] : [todayButton], - locale: locales[element.dataset.language] || locales['en'], + locale: await getLocale(element.dataset.language), onSelect: ({date, formattedDate, datepicker}) => { const _event = new CustomEvent("change", { bubbles: true, @@ -99,7 +105,7 @@ window.DatePicker = function createDynamicDatePicker(element) { return new AirDatepicker(element, opts); }; -window.MonthYearPicker = function createDynamicDatePicker(element) { +window.MonthYearPicker = async function createDynamicDatePicker(element) { let todayButton = { content: element.dataset.nowButtonTxt, onClick: (dp) => { @@ -119,7 +125,7 @@ window.MonthYearPicker = function createDynamicDatePicker(element) { toggleSelected: element.dataset.toggleSelected === 'true', autoClose: element.dataset.autoClose === 'true', buttons: element.dataset.clearButton === 'true' ? ['clear', todayButton] : [todayButton], - locale: locales[element.dataset.language] || locales['en'], + locale: await getLocale(element.dataset.language), onSelect: ({date, formattedDate, datepicker}) => { const _event = new CustomEvent("change", { bubbles: true, @@ -172,7 +178,7 @@ window.MonthYearPicker = function createDynamicDatePicker(element) { return new AirDatepicker(element, opts); }; -window.YearPicker = function createDynamicDatePicker(element) { +window.YearPicker = async function createDynamicDatePicker(element) { let todayButton = { content: element.dataset.nowButtonTxt, onClick: (dp) => { @@ -192,7 +198,7 @@ window.YearPicker = function createDynamicDatePicker(element) { toggleSelected: element.dataset.toggleSelected === 'true', autoClose: element.dataset.autoClose === 'true', buttons: element.dataset.clearButton === 'true' ? ['clear', todayButton] : [todayButton], - locale: locales[element.dataset.language] || locales['en'], + locale: await getLocale(element.dataset.language), onSelect: ({date, formattedDate, datepicker}) => { const _event = new CustomEvent("change", { bubbles: true,