Files
2025-03-26 09:20:58 +01:00

104 lines
3.1 KiB
JavaScript

console.warn('plugin/Phrasen.js is DEPRECATED! Use plugins/Phrasen.js instead.');
import FhcApi from './FhcApi.js';
import ApiPhrasen from '../api/factory/phrasen.js';
const categories = Vue.reactive({});
const loadingModules = {};
let user_language = Vue.ref(FHC_JS_DATA_STORAGE_OBJECT.user_language);
export let user_locale = Vue.computed(()=>{
if(!user_language.value) return null;
return FHC_JS_DATA_STORAGE_OBJECT.server_languages.find(language => language.sprache == user_language.value).LC_Time;
});
function extractCategory(obj, category) {
return obj.filter(e => e.category == category).reduce((res, elem) => {
if (!res[elem.phrase])
res[elem.phrase] = elem.text;
return res;
}, {});
}
function getValueForLoadedPhrase(category, phrase, params) {
let result = categories[category][phrase];
if (!result)
return '<< PHRASE ' + phrase + '>>';
if (params)
result = result.replace(/\{([^}]*)\}/g, (match, p1) => params[p1] === undefined ? match : params[p1]);
return result;
}
const phrasen = {
user_language,
user_locale,
setLanguage(language) {
const catArray = Object.keys(categories)
return this.config.globalProperties.$api
.call(ApiPhrasen.setLanguage(catArray, language))
.then(res => {
res.data.forEach(row => {
categories[row.category][row.phrase] = row.text
})
// update the reactive data that holds the current active user_language
user_language.value = language;
return res
})
},
loadCategory(category) {
if (Array.isArray(category))
return Promise.all(category.map(this.config.globalProperties
.$p.loadCategory));
const $fhcApi = this.config.globalProperties.$fhcApi;
const $fhcApiFactory = this.config.globalProperties.$fhcApiFactory;
if (!loadingModules[category])
loadingModules[category] = this.config.globalProperties.$api
.call(
ApiPhrasen.loadCategory(category)
)
.then(res => res?.data ? extractCategory(res.data, category) : {})
.then(res => {
categories[category] = res;
});
return loadingModules[category];
},
t_ref(category, phrase, params) {
console.warn('deprecated');
return Vue.computed(() => this.t(category, phrase, params));
},
t(category, phrase, params) {
if (params === undefined && (
(Array.isArray(category) && category.length == 2) ||
(category.split && category.split('/').length == 2))
) {
params = phrase;
[category, phrase] = category.split ? category.split('/') : category;
}
if (phrase === undefined) {
console.error('invalid input', category, phrase, params);
return '';
}
let val = Vue.computed(() => {
if (!categories[category])
return '';
return getValueForLoadedPhrase(category, phrase, params);
});
if (!categories[category])
this.loadCategory(category);
return val.value;
}
};
export default {
install(app, options) {
app.use(FhcApi, options?.fhcApi || undefined);
app.config.globalProperties.$p = {
t: phrasen.t,
loadCategory: cat => phrasen.loadCategory.call(app, cat),
setLanguage: lang => phrasen.setLanguage.call(app, lang),
user_language: user_language,
user_locale,
t_ref: phrasen.t_ref
};
app.provide('$p', app.config.globalProperties.$p);
}
}