Files
InvoiceShelf/resources/scripts/InvoiceShelf.js
2025-08-28 15:19:51 +02:00

77 lines
1.7 KiB
JavaScript
Vendored

import { createApp } from 'vue'
import App from '@/scripts/App.vue'
import { createI18n } from 'vue-i18n'
import messages from '/lang/locales'
import router from '@/scripts/router/index'
import { defineGlobalComponents } from './global-components'
import utils from '@/scripts/helpers/utilities.js'
import _ from 'lodash'
import { VTooltip } from 'v-tooltip'
import { setI18nLanguage } from '@/scripts/helpers/language-loader.js'
const app = createApp(App)
export default class InvoiceShelf {
constructor() {
this.bootingCallbacks = []
this.messages = messages
this.i18n = null
}
booting(callback) {
this.bootingCallbacks.push(callback)
}
executeCallbacks() {
this.bootingCallbacks.forEach((callback) => {
callback(app, router)
})
}
addMessages(moduleMessages = []) {
_.merge(this.messages, moduleMessages)
}
/**
* Dynamically load and set a language
* @param {string} locale - Language code to load
* @returns {Promise<void>}
*/
async loadLanguage(locale) {
if (this.i18n) {
await setI18nLanguage(this.i18n, locale)
}
}
start() {
this.executeCallbacks()
defineGlobalComponents(app)
app.provide('$utils', utils)
this.i18n = createI18n({
legacy: false,
locale: 'en',
fallbackLocale: 'en',
globalInjection: true,
messages: this.messages,
})
window.i18n = this.i18n
// Expose language loader globally
window.loadLanguage = this.loadLanguage.bind(this)
const { createPinia } = window.pinia
app.use(router)
app.use(this.i18n)
app.use(createPinia())
app.provide('utils', utils)
app.directive('tooltip', VTooltip)
app.mount('body')
}
}