117 lines
3.2 KiB
JavaScript
Executable File
117 lines
3.2 KiB
JavaScript
Executable File
function loadJSONSync(url) {
|
|
var xhr = new XMLHttpRequest();
|
|
xhr.open('GET', url, false); // false 表示同步请求
|
|
try {
|
|
xhr.send(null);
|
|
if (xhr.status === 200) {
|
|
return JSON.parse(xhr.responseText);
|
|
} else {
|
|
console.error('请求失败,状态码:', xhr.status);
|
|
return null;
|
|
}
|
|
} catch (e) {
|
|
console.error('请求过程中出错:', e);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
class I18n {
|
|
constructor() {
|
|
this.currentLang = localStorage.getItem('language') || 'zh';
|
|
this.translations = {};
|
|
this.loadLanguage(this.currentLang);
|
|
this.updateLanguageSelect();
|
|
}
|
|
|
|
async loadLanguage(lang) {
|
|
try {
|
|
var data = loadJSONSync(`./assets/js/lang/${lang}.json`);
|
|
// console.log(data);
|
|
this.translations = data;
|
|
this.updatePageContent();
|
|
this.updateLanguageSelect();
|
|
|
|
// 如果菜单已初始化,重新渲染菜单
|
|
if (window.menu) {
|
|
window.menu.render();
|
|
}
|
|
} catch (error) {
|
|
console.error('Error loading language file:', error);
|
|
}
|
|
}
|
|
|
|
setLanguage(lang) {
|
|
this.currentLang = lang;
|
|
localStorage.setItem('language', lang);
|
|
this.loadLanguage(lang);
|
|
}
|
|
setLanguagehome(lang) {
|
|
this.currentLang = lang;
|
|
localStorage.setItem('language', lang);
|
|
window.location.reload();
|
|
}
|
|
translate(key) {
|
|
const keys = key.split('.');
|
|
let value = this.translations;
|
|
|
|
for (const k of keys) {
|
|
if (value && value[k] !== undefined) {
|
|
value = value[k];
|
|
} else {
|
|
return key;
|
|
}
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
updatePageContent() {
|
|
var data = this.translations;
|
|
|
|
// 常规文本内容
|
|
$('[data-i18n]').each(function() {
|
|
const keys = $(this).data('i18n').split('.');
|
|
let value = data;
|
|
|
|
keys.forEach(key => {
|
|
value = value[key];
|
|
});
|
|
|
|
$(this).text(value || '');
|
|
});
|
|
|
|
// placeholder翻译
|
|
$('[data-i18n-placeholder]').each(function() {
|
|
const keys = $(this).data('i18n-placeholder').split('.');
|
|
let value = data;
|
|
keys.forEach(key => {
|
|
value = value[key];
|
|
});
|
|
$(this).attr('placeholder', value || '');
|
|
});
|
|
|
|
// option文本翻译
|
|
$('option[data-i18n]').each(function() {
|
|
const keys = $(this).data('i18n').split('.');
|
|
let value = data;
|
|
|
|
keys.forEach(key => {
|
|
value = value[key];
|
|
});
|
|
|
|
$(this).text(value || '');
|
|
});
|
|
}
|
|
|
|
updateLanguageSelect() {
|
|
// 更新语言选择下拉框的选中状态
|
|
const select = document.querySelector('.language-switch select');
|
|
if (select) {
|
|
select.value = this.currentLang;
|
|
}
|
|
}
|
|
}
|
|
|
|
// 创建全局实例
|
|
window.i18n = new I18n();
|