upload, string extensions, lgres
This commit is contained in:
167
lib/utility/lgres.js
Normal file
167
lib/utility/lgres.js
Normal file
@ -0,0 +1,167 @@
|
||||
import { getCookie } from "./cookie";
|
||||
import { get } from "./request";
|
||||
import { nullOrEmpty } from "./strings";
|
||||
|
||||
let cache;
|
||||
|
||||
function getCurrentLgId() {
|
||||
let lgid;
|
||||
if (typeof consts !== 'undefined') {
|
||||
lgid = consts.cookie != null && getCookie(consts.cookie.lang);
|
||||
if (nullOrEmpty(lgid)) {
|
||||
lgid = consts.user && consts.user.language;
|
||||
}
|
||||
}
|
||||
if (nullOrEmpty(lgid)) {
|
||||
lgid = getCookie('lgid');
|
||||
}
|
||||
if (nullOrEmpty(lgid)) {
|
||||
lgid = navigator.language || 'en-us';
|
||||
}
|
||||
lgid = lgid.toLowerCase().replace(/-/g, '_');
|
||||
if (nullOrEmpty(lgid)) {
|
||||
lgid = 'en';
|
||||
}
|
||||
switch (lgid) {
|
||||
case 'en':
|
||||
case 'en_au':
|
||||
case 'fr':
|
||||
case 'zh_cn':
|
||||
return lgid;
|
||||
}
|
||||
const lang = lgid.split('_')[0];
|
||||
switch (lang) {
|
||||
case 'en':
|
||||
case 'fr':
|
||||
return lang;
|
||||
}
|
||||
return 'en';
|
||||
}
|
||||
|
||||
function getStorageKey(lgid) {
|
||||
if (typeof consts !== 'undefined') {
|
||||
return (consts.prefix || '') + `res_${lgid}`;
|
||||
}
|
||||
return `res_${lgid}`;
|
||||
}
|
||||
|
||||
async function doRefreshLgres() {
|
||||
const lgid = getCurrentLgId();
|
||||
const r = await get(`language/${lgid}/res.json`);
|
||||
const dict = await r.json();
|
||||
localStorage.setItem(getStorageKey(lgid), JSON.stringify(dict));
|
||||
cache = dict;
|
||||
return dict;
|
||||
}
|
||||
|
||||
async function refreshLgres(lgres) {
|
||||
if (lgres == null || typeof consts === 'undefined') {
|
||||
return await doRefreshLgres();
|
||||
}
|
||||
const ver = Number(consts.resver);
|
||||
if (isNaN(lgres.ver) || isNaN(ver) || ver > lgres.ver) {
|
||||
console.log(`found new language res version: ${lgres.ver} => ${ver}`);
|
||||
return await doRefreshLgres();
|
||||
}
|
||||
cache = lgres;
|
||||
return lgres;
|
||||
}
|
||||
|
||||
function getLanguage(lgres, key, defaultValue) {
|
||||
let value = lgres[key];
|
||||
if (value == null) {
|
||||
value = defaultValue;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
function applyLanguage(dom, result) {
|
||||
if (dom == null) {
|
||||
dom = document.body;
|
||||
}
|
||||
for (let text of dom.querySelectorAll('[data-lgid]')) {
|
||||
const key = text.getAttribute('data-lgid');
|
||||
if (text.tagName === 'INPUT') {
|
||||
text.value = getLanguage(result, key, text.value);
|
||||
} else {
|
||||
text.innerText = getLanguage(result, key, text.innerText);
|
||||
}
|
||||
}
|
||||
for (let title of dom.querySelectorAll('[data-title-lgid]')) {
|
||||
const key = title.getAttribute('data-title-lgid');
|
||||
title.setAttribute('title', getLanguage(result, key, title.getAttribute('title')));
|
||||
}
|
||||
for (let holder of dom.querySelectorAll('[data-placeholder-lgid]')) {
|
||||
const key = holder.getAttribute('data-placeholder-lgid');
|
||||
holder.setAttribute('placeholder', getLanguage(result, key, holder.getAttribute('placeholder')));
|
||||
}
|
||||
}
|
||||
|
||||
async function init(dom, ahead) {
|
||||
const lgid = getCurrentLgId();
|
||||
let lgres = localStorage.getItem(getStorageKey(lgid));
|
||||
let result;
|
||||
if (lgres != null) {
|
||||
try {
|
||||
lgres = JSON.parse(lgres);
|
||||
result = await refreshLgres(lgres);
|
||||
} catch (e) {
|
||||
console.error('error while parsing lgres, try refresh ...', e);
|
||||
result = await refreshLgres();
|
||||
}
|
||||
} else {
|
||||
result = await refreshLgres();
|
||||
}
|
||||
|
||||
try {
|
||||
if (ahead != null) {
|
||||
// not in defer mode
|
||||
if (document.readyState === 'loading') {
|
||||
return await new Promise((resolve, reject) => {
|
||||
let tid = setTimeout(() => reject('timeout'), 30000);
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
clearTimeout(tid);
|
||||
tid = void 0;
|
||||
if (typeof ahead.callback === 'function') {
|
||||
ahead.callback(result);
|
||||
}
|
||||
applyLanguage(dom, result);
|
||||
resolve(result);
|
||||
});
|
||||
});
|
||||
}
|
||||
if (typeof ahead.callback === 'function') {
|
||||
ahead.callback(result);
|
||||
}
|
||||
}
|
||||
applyLanguage(dom, result);
|
||||
return result;
|
||||
} catch (err) {
|
||||
console.error('error while loading language res ...', err);
|
||||
}
|
||||
}
|
||||
|
||||
function r(key, defaultValue) {
|
||||
if (cache != null) {
|
||||
return getLanguage(cache, key, defaultValue);
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
const lang = {
|
||||
get current() {
|
||||
return getCurrentLgId();
|
||||
},
|
||||
get unknownError() {
|
||||
return r('unknownError', 'An unknown error occurred, please contact the administrator.');
|
||||
},
|
||||
get savedSuccessfully() {
|
||||
return r('savedSuccessfully', 'Saved successfully.');
|
||||
}
|
||||
}
|
||||
|
||||
export {
|
||||
init,
|
||||
r,
|
||||
lang
|
||||
}
|
Reference in New Issue
Block a user