Initial commit
This commit is contained in:
Executable
+117
@@ -0,0 +1,117 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user