generated from dellevin/template
游戏战绩描述
This commit is contained in:
39
static/js/anypage.js
Normal file
39
static/js/anypage.js
Normal file
@@ -0,0 +1,39 @@
|
||||
// ==================== Umami Stats 请求 ====================
|
||||
(async () => {
|
||||
const webid = "ae6cd64c-5900-49c9-9c22-95cedc24a508";
|
||||
const statsEndpoint = "https://umami.iletter.top/api/websites/" + webid + "/stats";
|
||||
const startAt = 1768060800000;
|
||||
const endAt = Date.now(); // 当前时间的时间戳(毫秒)
|
||||
const headers = {
|
||||
Authorization:
|
||||
"Bearer 3VvA8ETw0ahPhzuNNY+Zxi3agtfOBT2vNRbm0GcPqIyUhm7rExuwj8F8IwiQWcn/rOD2G/TnONPCFIvUECQYp6GuZRTnfOojki533vP/skqf0D6puOZDQQk8Y7ssihXnfyRu5naGhIoj1BCAC7S0D0RiYvzpSYF9zvZqvgxETrCbFazZsqUBolyJd8H2iZiM4Xx3VC+GnkZHZFgQfaaYUvm33a7CLM74PyFpPby63UExMjIPiLQRAOR2hs5wl5JAs5CTYUaq+QHCCz+tWgDQ4FPtIgoZoG8Ugnywv/YEEn1Jv9p3t8ge7m8ttThnPiZWw62PYPWQ3LpFh7nxX9jQX/Y/vaaAyacCoIP5J4VpiClA40GMMptZrThzEQjheegCilb9",
|
||||
"Content-Type": "application/json",
|
||||
};
|
||||
const params = new URLSearchParams({
|
||||
startAt: startAt.toString(),
|
||||
endAt: endAt.toString(),
|
||||
});
|
||||
const requestUrl = `${statsEndpoint}?${params}`;
|
||||
|
||||
try {
|
||||
const response = await fetch(requestUrl, {
|
||||
method: "GET",
|
||||
headers: headers,
|
||||
});
|
||||
if (!response.ok) {
|
||||
// 如果响应不是 2xx,抛出错误
|
||||
const errorText = await response.text();
|
||||
throw new Error(
|
||||
`HTTP error! status: ${response.status}, details: ${errorText}`
|
||||
);
|
||||
}
|
||||
const data = await response.json();
|
||||
// 浏览量 data.pageviews.value
|
||||
// 访问次数 data.visits.value
|
||||
// 访客 data.visitors.value
|
||||
document.getElementById("site_uv").textContent = JSON.stringify(data.visitors.value);
|
||||
document.getElementById("site_pv").textContent = JSON.stringify(data.pageviews.value);
|
||||
} catch (error) {
|
||||
console.error("获取 Umami Stats 数据时发生错误:", error); // 控制台输出错误信息
|
||||
}
|
||||
})();
|
||||
@@ -1,46 +1,217 @@
|
||||
// static/js/game_my.js
|
||||
|
||||
// ========== 游戏配置数据 ==========
|
||||
const gamesData = [
|
||||
{ name: '《永劫无间》', desc: '我身无拘,武道无穷' },
|
||||
{ name: '《我的世界》', desc: '这个小盒才是我的永远的家' },
|
||||
{ name: '《鬼谷八荒》', desc: '当互动版的修仙小说看了,很好玩.' },
|
||||
{ name: '《江城创业记》', desc: '缝合怪,但是全缝了。很喜欢的一款游戏' },
|
||||
{ name: '《中国式家长》', desc: '我承认我做不好一个孩子,也做不好一个家长' },
|
||||
{ name: '《王者荣耀》', desc: '买了好多皮肤,和朋友玩才是真快乐(已退坑)' },
|
||||
{ name: '《QQ飞车手游》', desc: '氪了好多,有些后悔了(已退坑)' },
|
||||
{ name: '《龙族幻想》', desc: '因为龙族入坑的,小氪(已退坑)' },
|
||||
{ name: '《洛克王国》', desc: '还记得小时候拿压岁钱偷偷买点卡(已退坑)' },
|
||||
{ name: '《造梦西游》', desc: '造梦3从小学玩到大学,现在还时不时的回味一下(已退坑)' },
|
||||
];
|
||||
const gamesData = [
|
||||
{ id:0, name: "《永劫无间》", desc: "我身无拘,武道无穷" },
|
||||
{ id:1, name: "《我的世界》", desc: "这个小盒才是我的永远的家" },
|
||||
{ id:2, name: "《鬼谷八荒》", desc: "当互动版的修仙小说看了,很好玩." },
|
||||
{ id:3, name: "《江城创业记》", desc: "缝合怪,但是全缝了。很喜欢的一款游戏" },
|
||||
{ id:4, name: "《中国式家长》", desc: "我承认我做不好一个孩子,也做不好一个家长" },
|
||||
{ id:5, name: "《王者荣耀》", desc: "买了好多皮肤,和朋友玩才是真快乐(已退坑)" },
|
||||
{ id:6, name: "《QQ飞车手游》", desc: "氪了好多,有些后悔了,太耗注意力了(已退坑)" },
|
||||
{ id:7, name: "《龙族幻想》", desc: "因为龙族入坑的,江南老贼!(已退坑)" },
|
||||
{ id:8, name: "《洛克王国》", desc: "还记得小时候拿压岁钱偷偷买点卡(已退坑)" },
|
||||
{ id:9, name: "《造梦西游》", desc: "造梦3从小学玩到大学,现在还时不时的回味一下(已退坑)" },
|
||||
];
|
||||
|
||||
// ========== 渲染游戏列表的函数 ==========
|
||||
function renderGames(gamesArray) {
|
||||
const container = document.getElementById('games-container');
|
||||
if (!container) {
|
||||
console.error("未找到游戏容器 #games-container");
|
||||
return;
|
||||
}
|
||||
// ========== 游戏详情数据 ==========
|
||||
const gameDetailData = {
|
||||
0: {
|
||||
id: '游戏ID: 42956400140163',
|
||||
rank: '<strong>历史最高段位:</strong>无相龙王',
|
||||
detailDesc: '我希望能玩一辈子永劫无间!',
|
||||
images: [
|
||||
'./static/img/game/yjwj/yjwj_chuanyun.png',
|
||||
'./static/img/game/yjwj/yjwj_xiafeng.png',
|
||||
'./static/img/game/yjwj/yjwj_liebian.png',
|
||||
]
|
||||
},
|
||||
6: {
|
||||
id: '',
|
||||
rank: '<strong>历史最高段位:</strong>传奇车神',
|
||||
detailDesc: '巅峰竞速!可惜我的天行者被割韭菜了。。。',
|
||||
images: [
|
||||
'./static/img/game/qqspead/qqspead1.jpg',
|
||||
'./static/img/game/qqspead/qqspead2.jpg',
|
||||
]
|
||||
},
|
||||
};
|
||||
|
||||
if (!gamesArray || gamesArray.length === 0) {
|
||||
container.innerHTML = '<div class="memo-error" data-i18n="no_games_data">暂无游戏数据</div>';
|
||||
return;
|
||||
}
|
||||
let currentlyOpenTooltip = null; // 用于跟踪当前打开的tooltip
|
||||
|
||||
const currentLang = localStorage.getItem(LANG_KEY) || 'zh';
|
||||
// ========== 显示/隐藏游戏详情的函数 (Tooltip 版本) ==========
|
||||
function toggleGameDetailTooltip(gameElement, gameIndex) {
|
||||
// 如果点击的是同一个游戏,且tooltip是打开的,则关闭它
|
||||
if (currentlyOpenTooltip && currentlyOpenTooltip.index === gameIndex && currentlyOpenTooltip.element && currentlyOpenTooltip.element.style.display === 'block') {
|
||||
hideTooltip(currentlyOpenTooltip.element);
|
||||
currentlyOpenTooltip = null;
|
||||
return;
|
||||
}
|
||||
|
||||
let html = '';
|
||||
gamesArray.forEach((game,index) => {
|
||||
const nameKey = `game_name_${index}`;
|
||||
const descKey = `game_desc_${index}`;
|
||||
const nameTranslation = translations[currentLang][nameKey] || game.name;
|
||||
const descTranslation = translations[currentLang][descKey] || game.desc;
|
||||
// 如果点击的是另一个游戏,先关闭之前打开的tooltip
|
||||
if (currentlyOpenTooltip) {
|
||||
hideTooltip(currentlyOpenTooltip.element);
|
||||
}
|
||||
|
||||
html += `
|
||||
<div class="game-item">
|
||||
<div class="game-name">${nameTranslation}</div>
|
||||
<div class="game-desc">${descTranslation}</div>
|
||||
const detailId = `game-tooltip-${gameIndex}`;
|
||||
let tooltipDiv = document.getElementById(detailId);
|
||||
|
||||
// 如果tooltip不存在,则创建它
|
||||
if (!tooltipDiv) {
|
||||
const detail = gameDetailData[gameIndex];
|
||||
const currentLang = localStorage.getItem('preferred_language') || 'zh';
|
||||
|
||||
const nameKey = `game_name_${gameIndex}`;
|
||||
const descKey = `game_desc_${gameIndex}`;
|
||||
const gameName = typeof translations !== 'undefined' && translations[currentLang] ? translations[currentLang][nameKey] || gamesData[gameIndex].name : gamesData[gameIndex].name;
|
||||
// const gameDesc = typeof translations !== 'undefined' && translations[currentLang] ? translations[currentLang][descKey] || gamesData[gameIndex].desc : gamesData[gameIndex].desc;
|
||||
// console.log("游戏名称:", gameDesc);
|
||||
let tooltipContentHtml = '';
|
||||
if (detail) {
|
||||
tooltipContentHtml = `
|
||||
<div class="tooltip-content">
|
||||
<div class="tooltip-header">
|
||||
<h4>${gameName}</h4>
|
||||
<span class="tooltip-close">×</span>
|
||||
</div>
|
||||
`;
|
||||
});
|
||||
<div class="tooltip-body">
|
||||
<p><strong>${detail.id}</strong></p>
|
||||
<p> ${detail.rank}</p>
|
||||
<p><em>${detail.detailDesc}</em></p>
|
||||
${detail.images && detail.images.length > 0 ?
|
||||
`<div class="tooltip-images">
|
||||
${detail.images.map(imgSrc => `<img src="${imgSrc}" alt="游戏详情图片" class="tooltip-image-item">`).join('')}
|
||||
</div>`
|
||||
: ''}
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
} else {
|
||||
tooltipContentHtml = `
|
||||
<div class="tooltip-content">
|
||||
<div class="tooltip-header">
|
||||
<h4>${gameName}</h4>
|
||||
<span class="tooltip-close">×</span>
|
||||
</div>
|
||||
<div class="tooltip-body">
|
||||
<p style="color: #999; font-style: italic;">博主暂未书写信息~请耐心等待哦!</p>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
container.innerHTML = html;
|
||||
}
|
||||
tooltipDiv = document.createElement('div');
|
||||
tooltipDiv.id = detailId;
|
||||
tooltipDiv.className = 'game-detail-tooltip';
|
||||
tooltipDiv.innerHTML = tooltipContentHtml;
|
||||
|
||||
// 添加关闭按钮事件
|
||||
const closeBtn = tooltipDiv.querySelector('.tooltip-close');
|
||||
closeBtn.addEventListener('click', (e) => {
|
||||
e.stopPropagation(); // 防止触发外层的点击关闭
|
||||
hideTooltip(tooltipDiv);
|
||||
currentlyOpenTooltip = null;
|
||||
});
|
||||
|
||||
// 添加点击tooltip外部区域关闭的功能
|
||||
tooltipDiv.addEventListener('click', (e) => {
|
||||
// 只有点击tooltip自身(而非内部内容)才关闭
|
||||
if (e.target === tooltipDiv) {
|
||||
hideTooltip(tooltipDiv);
|
||||
currentlyOpenTooltip = null;
|
||||
}
|
||||
});
|
||||
|
||||
document.body.appendChild(tooltipDiv); // 将tooltip添加到body,实现悬浮效果
|
||||
}
|
||||
|
||||
// 定位tooltip,让它出现在游戏项附近
|
||||
const rect = gameElement.getBoundingClientRect();
|
||||
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
|
||||
const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;
|
||||
|
||||
// 计算tooltip的位置 (例如,出现在游戏项下方)
|
||||
const top = rect.bottom + scrollTop + 10; // 10px 间隙
|
||||
const left = rect.left + scrollLeft; // 与游戏项左侧对齐
|
||||
|
||||
tooltipDiv.style.top = `${top}px`;
|
||||
tooltipDiv.style.left = `${left}px`;
|
||||
tooltipDiv.style.display = 'block';
|
||||
|
||||
// 记录当前打开的tooltip
|
||||
currentlyOpenTooltip = { element: tooltipDiv, index: gameIndex };
|
||||
|
||||
// 阻止事件冒泡到document,避免立即被关闭
|
||||
tooltipDiv.onclick = function(e) {
|
||||
e.stopPropagation();
|
||||
};
|
||||
}
|
||||
|
||||
// ========== 隐藏Tooltip的辅助函数 ==========
|
||||
function hideTooltip(tooltipElement) {
|
||||
if (tooltipElement) {
|
||||
tooltipElement.style.display = 'none';
|
||||
// 如果想完全移除DOM,可以取消下面两行注释,但通常隐藏即可
|
||||
// if (tooltipElement.parentNode) {
|
||||
// tooltipElement.parentNode.removeChild(tooltipElement);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 点击文档其他地方关闭Tooltip ==========
|
||||
document.addEventListener('click', function(event) {
|
||||
if (currentlyOpenTooltip && !currentlyOpenTooltip.element.contains(event.target)) {
|
||||
hideTooltip(currentlyOpenTooltip.element);
|
||||
currentlyOpenTooltip = null;
|
||||
}
|
||||
});
|
||||
|
||||
// ========== 渲染游戏列表的函数 ==========
|
||||
function renderGames(gamesArray) {
|
||||
const container = document.getElementById("games-container");
|
||||
if (!container) {
|
||||
console.error("未找到游戏容器 #games-container");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!gamesArray || gamesArray.length === 0) {
|
||||
container.innerHTML =
|
||||
'<div class="memo-error" data-i18n="no_games_data">暂无游戏数据</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
const currentLang = localStorage.getItem('preferred_language') || 'zh';
|
||||
|
||||
let html = "";
|
||||
gamesArray.forEach((game, index) => {
|
||||
const nameKey = `game_name_${index}`;
|
||||
const descKey = `game_desc_${index}`;
|
||||
const nameTranslation = typeof translations !== 'undefined' && translations[currentLang] ? translations[currentLang][nameKey] || game.name : game.name;
|
||||
const descTranslation = typeof translations !== 'undefined' && translations[currentLang] ? translations[currentLang][descKey] || game.desc : game.desc;
|
||||
|
||||
// 为每个游戏项添加点击事件,并传递其索引
|
||||
html += `
|
||||
<div class="game-item" data-game-index="${index}">
|
||||
<div class="game-name">${nameTranslation}</div>
|
||||
<div class="game-desc">${descTranslation}</div>
|
||||
</div>
|
||||
`;
|
||||
});
|
||||
|
||||
container.innerHTML = html;
|
||||
|
||||
// 为每个生成的游戏项添加点击事件监听器
|
||||
const gameItems = container.querySelectorAll('.game-item');
|
||||
gameItems.forEach(item => {
|
||||
item.addEventListener('click', function(event) {
|
||||
event.stopPropagation(); // 阻止点击事件冒泡到document,避免立即关闭
|
||||
const gameIndex = parseInt(this.getAttribute('data-game-index'));
|
||||
toggleGameDetailTooltip(this, gameIndex);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ========== 初始化 ==========
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
renderGames(gamesData);
|
||||
});
|
||||
142
static/js/language/en.js
Normal file
142
static/js/language/en.js
Normal file
@@ -0,0 +1,142 @@
|
||||
const translationsEN = {
|
||||
'page_title': 'BaiTu - BAITU',
|
||||
'nav_about': 'About Me',
|
||||
'nav_website': 'My Websites',
|
||||
'nav_tools': 'Tools',
|
||||
'nav_games': 'Games',
|
||||
'nav_memos': 'Memos',
|
||||
'nav_contact': 'Contact Me',
|
||||
'hello': 'Hello',
|
||||
'greeting': '',
|
||||
'my_name': 'BaiTu',
|
||||
'about_me_p1': 'My name is <strong>BaiTu</strong>, from Hengshui, Hebei, a native northerner. I graduated from an obscure second-tier university with a major in Information Management and Information Systems. I self-studied development technologies like Java, Vue, Linux, MySQL, Python, and some software reverse engineering techniques. I also have basic skills in PS, PR, and AE. I have experience with systems, networking, PLCs, microcontrollers, server maintenance, and managing public accounts and websites. In short, I know a little bit about many things. Others might think I\'m an expert, but actually, I\'m just a rookie. However, I won\'t give up and will strive to become an expert. As Liu Lian from NARAKA said, "The most important skill in the world is perseverance."',
|
||||
'about_me_p2': 'My hobbies usually involve playing games, reading books, watching anime, and I prefer staying indoors. I hate repetitive and simple work, so I often write small tools to make life easier because laziness drives my productivity. I frequently lurk on various forums and blogs, shouting "666" or "Amazing" under tech bloggers. My own blog updates sporadically, mainly recording daily life notes and technical challenges encountered.',
|
||||
'about_me_p3': 'This site follows a minimalist style, using pure HTML. Umami tracks UV/PV at the bottom. The Memos section uses the Memos API. It also employs Baota Cloud WAF protection and nginx caching for static resources. If you are interested, you can directly download the source code from <a href="https://gitea.iletter.top/dellevin/BaiTu-homepage" target="_blank">https://gitea.iletter.top/dellevin/BaiTu-homepage </a> and use it.',
|
||||
'about_me_p4': 'As a 99er programmer, I am glad to still have great passion for technology after starting work! If you share the same interest in technology, I would love to meet you! Let\'s progress and grow together!',
|
||||
'my_website_h2': 'My Websites',
|
||||
'personal_blog_h3': 'Personal Blogs',
|
||||
'online_apps':'Online Apps',
|
||||
'personal_blog_link1': 'ittoolman.top - Hosted on Github',
|
||||
'personal_blog_link2': 'blog.iletter.top - Last Stand for Typecho Users',
|
||||
'online_apps_h3': 'Online Applications',
|
||||
'online_app_link1': 'EsayImage2 - Image Uploader Tool',
|
||||
'online_app_link2': 'Gitea - Private Git Repository',
|
||||
'online_app_link3': 'OpenList - Online Cloud Disk Collection',
|
||||
'online_app_link4': 'Umami - Website visit analysis',
|
||||
'online_app_link5': 'Beszel - Server Monitoring',
|
||||
'contact_me_h2': 'Contact Me',
|
||||
'contact_intro': 'Feel free to reach out via the following methods:',
|
||||
'email_label': 'Email:',
|
||||
'wechat_label': 'WeChat:',
|
||||
'qq_label': 'QQ:',
|
||||
'address_label': 'Address:',
|
||||
'address_value': 'Shizhong District, Jinan, Shandong Province',
|
||||
'social_media_h3': 'Social Media',
|
||||
'social_link1': 'GitHub',
|
||||
'social_link2': 'Weibo',
|
||||
'social_link3': 'Zhihu',
|
||||
'social_link4': 'Bilibili',
|
||||
'social_link5': '52pojie',
|
||||
'leave_message_h3': 'Leave a Message',
|
||||
'leave_message_p': 'If you have any questions or suggestions, feel free to <a href="https://blog.iletter.top/401.html" target="_blank">click here</a> to leave me a message on my blog!',
|
||||
'leave_message_link': 'click here',
|
||||
'my_tools_h2': 'My Tools',
|
||||
'loading_tools': 'Loading tools list...',
|
||||
'my_games_h2': 'Games I Often Play',
|
||||
'loading_games': 'Loading games list...',
|
||||
'memos_h2': 'Memos',
|
||||
'loading_memos': 'Loading...',
|
||||
'footer_text': 'I still choose to spend the rest of my life in my own way although I am a failure.',
|
||||
'visitor_count_label': 'Visitors:',
|
||||
'visit_count_label': 'Total Visits:',
|
||||
|
||||
// --- 新增: 游戏翻译 (en) ---
|
||||
'game_name_0': 'Naraka',
|
||||
'game_desc_0': 'I am unrestricted, martial arts are boundless',
|
||||
'game_name_1': 'Minecraft',
|
||||
'game_desc_1': 'This little box is my forever home',
|
||||
'game_name_2': 'Gates of Havoc',
|
||||
'game_desc_2': 'Played like an interactive Xianxia novel, quite fun.',
|
||||
'game_name_3': 'Jiangcheng Entrepreneurship Story',
|
||||
'game_desc_3': 'A mashup game, but fully mashed. But a favorite game of mine.',
|
||||
'game_name_4': 'Chinese Parents',
|
||||
'game_desc_4': 'I admit I\'m not good at being a child, nor a parent.',
|
||||
'game_name_5': 'Arena of Valor',
|
||||
'game_desc_5': 'Bought many skins, real joy comes from playing with friends (quit now).',
|
||||
'game_name_6': 'QQ Speed Mobile',
|
||||
'game_desc_6': 'Spent a lot, now a bit regretful (quit now).',
|
||||
'game_name_7': 'Dragon Raja',
|
||||
'game_desc_7': 'Got into it because of the Dragon Raja series, spent a little (quit now).',
|
||||
'game_name_8': 'Roco Kingdom',
|
||||
'game_desc_8': 'Remember secretly buying cards with New Year money as a kid (quit now).',
|
||||
'game_name_9': 'Dream Journey West',
|
||||
'game_desc_9': 'Playing Dream Journey 3 from elementary to college, still enjoy it occasionally (quit now).',
|
||||
|
||||
// --- 新增: 工具翻译 (en) ---
|
||||
'tool_name_0': 'Rolan',
|
||||
'tool_desc_0': 'App launcher, used since college',
|
||||
'tool_name_1': 'Chrome',
|
||||
'tool_desc_1': 'Truly useful, but heading towards poop.',
|
||||
'tool_name_2': 'VS Code',
|
||||
'tool_desc_2': 'Code editor, lightweight? Efficient!',
|
||||
'tool_name_3': 'IntelliJ IDEA',
|
||||
'tool_desc_3': 'JAVA Code Editor',
|
||||
'tool_name_4': 'PyCharm',
|
||||
'tool_desc_4': 'Python Code Editor',
|
||||
'tool_name_5': 'Android Studio',
|
||||
'tool_desc_5': 'Android app development, always learning (create new folder).',
|
||||
'tool_name_6': 'HbuilderX',
|
||||
'tool_desc_6': 'Great for writing mini-programs, Vue+JS is awesome! Reduces learning pressure.',
|
||||
'tool_name_7': 'Navicat',
|
||||
'tool_desc_7': 'A神器 for connecting MySQL, what\'s SQLyog? Never heard of it.',
|
||||
'tool_name_8': 'Xshell',
|
||||
'tool_desc_8': 'Easy to connect to servers, works well with Xftp.',
|
||||
'tool_name_9': 'Postman',
|
||||
'tool_desc_9': 'API testing and debugging tool',
|
||||
'tool_name_10': 'VMware',
|
||||
'tool_desc_10': 'Virtual machine management, tool toxic? Try this first.',
|
||||
'tool_name_11': 'Photoshop',
|
||||
'tool_desc_11': 'PS image dedicated, masks and lasso are very useful.',
|
||||
'tool_name_12': 'Obsidian',
|
||||
'tool_desc_12': 'Knowledge management, bidirectional linking notes. A blessing for local note lovers.',
|
||||
'tool_name_13': 'Typora',
|
||||
'tool_desc_13': 'Markdown editor, simple and beautiful.',
|
||||
'tool_name_14': 'Docker',
|
||||
'tool_desc_14': 'Containerized deployment, docker-compose rules them all.',
|
||||
'tool_name_15': 'Premiere Pro',
|
||||
'tool_desc_15': 'Video editing, audio adjustment, simple effects, easy to use.',
|
||||
'tool_name_16': 'After Effects',
|
||||
'tool_desc_16': 'Special effects creation神器, but not friendly to GPU and CPU.',
|
||||
'tool_name_17': 'Cheat Engine',
|
||||
'tool_desc_17': 'Used it before Feng Ling Yue Ying came out, also a great choice for memory hooks.',
|
||||
'tool_name_18': 'x64dbg',
|
||||
'tool_desc_18': 'Kid! Want to master reverse power? Start with x64dbg!',
|
||||
'tool_name_19': 'WireGuard',
|
||||
'tool_desc_19': 'Networking神器, screw Sunflower, screw Todesk.',
|
||||
'tool_name_20': 'Syncthing',
|
||||
'tool_desc_20': 'File sync, super handy, great choice for syncing notes.',
|
||||
'tool_name_21': 'NeatReader',
|
||||
'tool_desc_21': 'Reading software, a bit regret spending 188 for lifetime.',
|
||||
'tool_name_22': 'Corel VideoStudio',
|
||||
'tool_desc_22': 'Evil Suzhou CorelMark! Give me back Pinnacle Studio.',
|
||||
'tool_name_23': 'Netease Cloud Music',
|
||||
'tool_desc_23': 'Listen and use daily, premium annual VIP + copyright unlock Unblock Netease.',
|
||||
'tool_name_24': 'Ximalaya Audiobook',
|
||||
'tool_desc_24': 'Listen and use daily. Great books like Three Body, Poor Man\'s Past and Future etc.',
|
||||
'tool_name_25': 'A Diary',
|
||||
'tool_desc_25': 'Who writes a diary anyway?!',
|
||||
'tool_name_26': 'Ollama',
|
||||
'tool_desc_26': 'Local AI deployment, fine-tuning models, 32b is too much for 4070.',
|
||||
'tool_name_27': 'AnythingLLM',
|
||||
'tool_desc_27': 'An excellent choice for AI knowledge base, better than my own fine-tuning + vectorization.',
|
||||
'tool_name_28': 'UVR5',
|
||||
'tool_desc_28': 'Audio processing神器, what hardships were separating audio back then!',
|
||||
'tool_name_29': 'Remote Desktop Manager',
|
||||
'tool_desc_29': 'Super powerful remote control software.',
|
||||
'tool_name_30': 'SyncClipboard',
|
||||
'tool_desc_30': 'Clipboard sync, handy, love it. No more copying/pasting via WeChat messages.',
|
||||
'tool_name_31': 'QtScrcpy',
|
||||
'tool_desc_31': 'LAN phone control tool, remote adb is awesome.',
|
||||
'tool_name_32': 'RaiDrive',
|
||||
'tool_desc_32': 'Cloud storage mounting, super easy to use',
|
||||
}
|
||||
142
static/js/language/zh.js
Normal file
142
static/js/language/zh.js
Normal file
@@ -0,0 +1,142 @@
|
||||
const translationsZH = {
|
||||
'page_title': '白荼 - BAITU',
|
||||
'nav_about': '关于我',
|
||||
'nav_website': '我的网站',
|
||||
'nav_tools': '常用工具',
|
||||
'nav_games': '常玩游戏',
|
||||
'nav_memos': '闲言碎语',
|
||||
'nav_contact': '联系我',
|
||||
'hello': '你好',
|
||||
'greeting': '见字如面,展信舒颜。',
|
||||
'my_name': '白荼',
|
||||
'about_me_p1': '我叫<strong>白荼</strong>,河北衡水人,土生土长的北方汉子,毕业于一所不知名的二本院校。信息管理与信息系统专业。自学java、vue、linux、mysql、python等开发技术和一些软件逆向技术,同时还略懂些PS图片、PR视频、AE特效制作。做过系统,剪过网线,搞过plc,耍过单片机,维护修理过服务器,运营过公众号和网站等等。可谓是会,但只会一点点。别人都觉得我是个大佬,其实我就是个小菜鸡。但我不会气馁,努力成为一个大佬的。正如永劫无间刘炼的一句话“天下万般之绝学,莫过于恒心。”',
|
||||
'about_me_p2': '平时的爱好也就是玩玩游戏,看看书,刷刷动漫,不爱出门,肥宅一个。讨厌重复简单的工作,会想办法偷懒写写自己的顺手的小工具什么的,毕竟懒惰是我的生产力。我也经常混迹于各大网络论坛博客并在各个技术博主下面直呼"大佬666"、"大佬牛牛牛"。自己的博客也在断断续续中更新。主要是记录生活随笔和碰到的技术难题。',
|
||||
'about_me_p3': '本站秉承简约风格,采用纯HTML,Umami做网站底部的uv/pv ,闲言碎语模块使用memos接口。同时使用堡塔云WAF防护,nginx缓存加速网站静态资源。如果您有兴趣,可以直接下载本站的 <a href="https://gitea.iletter.top/dellevin/BaiTu-homepage" target="_blank">https://gitea.iletter.top/dellevin/BaiTu-homepage </a> 并使用。',
|
||||
'about_me_p4': '作为一个99年的码农,很庆幸我在工作之后还对技术有着极大的热情!如果你也对技术有着同样的兴趣,也很希望认识你!一同进步共同成长!',
|
||||
'my_website_h2': '我的网站',
|
||||
'personal_blog_h3': '个人博客',
|
||||
'online_apps':'在线应用',
|
||||
'personal_blog_link1': 'ittoolman.top - Github托管',
|
||||
'personal_blog_link2': 'blog.iletter.top - typecho用户的最后坚守',
|
||||
'online_apps_h3': '在线应用',
|
||||
'online_app_link1': '简单图床 - 私人图床工具',
|
||||
'online_app_link2': 'Gitea - 私人git托管仓库',
|
||||
'online_app_link3': 'OpenList - 在线云盘合集',
|
||||
'online_app_link4': 'Umami - 网站访问分析',
|
||||
'online_app_link5': 'Beszel - 服务器监控',
|
||||
'contact_me_h2': '联系我',
|
||||
'contact_intro': '欢迎通过以下方式与我联系:',
|
||||
'email_label': '邮箱:',
|
||||
'wechat_label': '微信:',
|
||||
'qq_label': '扣扣:',
|
||||
'address_label': '地址:',
|
||||
'address_value': '山东省·济南市·市中区',
|
||||
'social_media_h3': '社交媒体',
|
||||
'social_link1': 'GitHub',
|
||||
'social_link2': '微博',
|
||||
'social_link3': '知乎',
|
||||
'social_link4': 'B站',
|
||||
'social_link5': '52pojie',
|
||||
'leave_message_h3': '留言',
|
||||
'leave_message_p': '如果你有任何问题或建议,欢迎<a href="https://blog.iletter.top/401.html" target="_blank">点击此链接</a>去我的博客下面给我留言!',
|
||||
'leave_message_link': '点击此链接',
|
||||
'my_tools_h2': '我的工具',
|
||||
'loading_tools': '正在加载工具列表...',
|
||||
'my_games_h2': '我常玩的游戏',
|
||||
'loading_games': '正在加载游戏列表...',
|
||||
'memos_h2': '闲言碎语',
|
||||
'loading_memos': '正在加载...',
|
||||
'footer_text': '我虽然是个废物,但我仍然选择用自己喜欢的方式度过自己的余生',
|
||||
'visitor_count_label': '本站访客数 :',
|
||||
'visit_count_label': '本站总访问量 :',
|
||||
|
||||
// --- 新增: 游戏翻译 (zh) ---
|
||||
'game_name_0': '《永劫无间》',
|
||||
'game_desc_0': '我身无拘,武道无穷',
|
||||
'game_name_1': '《我的世界》',
|
||||
'game_desc_1': '这个小盒才是我的永远的家',
|
||||
'game_name_2': '《鬼谷八荒》',
|
||||
'game_desc_2': '当互动版的修仙小说看了,很好玩.',
|
||||
'game_name_3': '《江城创业记》',
|
||||
'game_desc_3': '缝合怪,但是全缝了。很喜欢的一款游戏',
|
||||
'game_name_4': '《中国式家长》',
|
||||
'game_desc_4': '我承认我做不好一个孩子,也做不好一个家长',
|
||||
'game_name_5': '《王者荣耀》',
|
||||
'game_desc_5': '买了好多皮肤,和朋友玩才是真快乐(已退坑)',
|
||||
'game_name_6': '《QQ飞车手游》',
|
||||
'game_desc_6': '氪了好多,有些后悔了(已退坑)',
|
||||
'game_name_7': '《龙族幻想》',
|
||||
'game_desc_7': '因为龙族入坑的,江南老贼!(已退坑)',
|
||||
'game_name_8': '《洛克王国》',
|
||||
'game_desc_8': '还记得小时候拿压岁钱偷偷买点卡(已退坑)',
|
||||
'game_name_9': '《造梦西游》',
|
||||
'game_desc_9': '造梦3从小学玩到大学,现在还时不时的回味一下(已退坑)',
|
||||
|
||||
// --- 新增: 工具翻译 (zh) ---
|
||||
'tool_name_0': 'Rolan',
|
||||
'tool_desc_0': '应用启动器,从大学用到现在',
|
||||
'tool_name_1': 'Chrome',
|
||||
'tool_desc_1': '确实好用,正在向着屎迈进',
|
||||
'tool_name_2': 'VS Code',
|
||||
'tool_desc_2': '代码编辑器,轻量?高效!',
|
||||
'tool_name_3': 'IntelliJ IDEA',
|
||||
'tool_desc_3': 'JAVA代码编辑器',
|
||||
'tool_name_4': 'PyCharm',
|
||||
'tool_desc_4': 'python代码编辑器',
|
||||
'tool_name_5': 'Android Studio',
|
||||
'tool_desc_5': '安卓软件开发,一直在学(新建文件夹)',
|
||||
'tool_name_6': 'HbuilderX',
|
||||
'tool_desc_6': '写小程序真心不错,vue+js很棒!减少了学习压力',
|
||||
'tool_name_7': 'Navicate',
|
||||
'tool_desc_7': '链接mysql的神器,sqlyog是谁?真不熟。',
|
||||
'tool_name_8': 'Xshell',
|
||||
'tool_desc_8': '链接服务器简单易用配合xftp很好用',
|
||||
'tool_name_9': 'Postman',
|
||||
'tool_desc_9': 'API测试与调试工具',
|
||||
'tool_name_10': 'VMware',
|
||||
'tool_desc_10': '虚拟机管理,工具有毒?先拿这个试试',
|
||||
'tool_name_11': 'PhotoShop',
|
||||
'tool_desc_11': 'ps图片专用蒙版套索十分好用',
|
||||
'tool_name_12': 'Obsidian',
|
||||
'tool_desc_12': '知识管理,双链接笔记。本地笔记爱好者的福音。',
|
||||
'tool_name_13': 'Typora',
|
||||
'tool_desc_13': 'Markdown编辑器,简洁美观。',
|
||||
'tool_name_14': 'Docker',
|
||||
'tool_desc_14': '容器化部署,一个docker-compose走天下',
|
||||
'tool_name_15': 'Premiere Pro',
|
||||
'tool_desc_15': '剪辑视频调音做简单的效果,简单易用',
|
||||
'tool_name_16': 'After Effects',
|
||||
'tool_desc_16': '特效制作神器,就是对显卡和cpu比较不友好',
|
||||
'tool_name_17': 'CheatEngine',
|
||||
'tool_desc_17': '风灵月影没出来就用它,亦是内存hook的极佳选择',
|
||||
'tool_name_18': 'x64dbg',
|
||||
'tool_desc_18': '孩子!你想掌握逆向之力嘛!先从x64dbg开始吧!',
|
||||
'tool_name_19': 'WireGuard',
|
||||
'tool_desc_19': '组网神器,去你妹的向日葵,去你妹的todesk',
|
||||
'tool_name_20': 'Syncthing',
|
||||
'tool_desc_20': '文件同步,超级好用,同步笔记的不错选择。',
|
||||
'tool_name_21': 'NeatReader',
|
||||
'tool_desc_21': '看书软件,有点后悔花了188买了永久',
|
||||
'tool_name_22': 'Corel VideoStudio',
|
||||
'tool_desc_22': '万恶的苏州思杰马克丁!还我会声会影',
|
||||
'tool_name_23': '网易云音乐',
|
||||
'tool_desc_23': '每天听,每天用,尊贵的年费vip+版权破解Unblock Netease',
|
||||
'tool_name_24': '喜马拉雅听书',
|
||||
'tool_desc_24': '每天听,每天用。三体,穷鬼的上下两千年等优秀书籍',
|
||||
'tool_name_25': '一本日记',
|
||||
'tool_desc_25': '正经人谁写日记啊!',
|
||||
'tool_name_26': 'Ollama',
|
||||
'tool_desc_26': '本地部署对话AI,微调模型,32b是4070遭不住',
|
||||
'tool_name_27': 'AnythingLLM',
|
||||
'tool_desc_27': 'AI知识库的极佳选择,比我自己微调+向量化好',
|
||||
'tool_name_28': 'UVR5',
|
||||
'tool_desc_28': '处理音频的神器,想当年苦逼的分离音频算什么!',
|
||||
'tool_name_29': 'Remote Desktop Manager',
|
||||
'tool_desc_29': '超级强大的远控软件',
|
||||
'tool_name_30': 'SyncClipboard',
|
||||
'tool_desc_30': '剪切板同步,好用,爱用。再也不用微信消息复制粘贴了',
|
||||
'tool_name_31': 'QtScrcpy',
|
||||
'tool_desc_31': '局域网控制手机神器,远程adb牛逼',
|
||||
'tool_name_32': 'RaiDrive',
|
||||
'tool_desc_32': '网盘挂载,超级好用',
|
||||
}
|
||||
99
static/js/my-websites.js
Normal file
99
static/js/my-websites.js
Normal file
@@ -0,0 +1,99 @@
|
||||
// 定义网站数据
|
||||
const websitesData = [
|
||||
{
|
||||
category: 'personal_blog_h3', // 分类标识符,对应国际化 key
|
||||
items: [
|
||||
{
|
||||
url: 'https://www.ittoolman.top/',
|
||||
linkTextKey: 'personal_blog_link1'
|
||||
},
|
||||
{
|
||||
url: 'https://blog.iletter.top/',
|
||||
linkTextKey: 'personal_blog_link2'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
category: 'online_apps',
|
||||
items: [
|
||||
{
|
||||
url: 'https://img.iletter.top/',
|
||||
linkTextKey: 'online_app_link1'
|
||||
},
|
||||
{
|
||||
url: 'https://gitea.iletter.top/',
|
||||
linkTextKey: 'online_app_link2'
|
||||
},
|
||||
{
|
||||
url: 'http://openlist.iletter.top/',
|
||||
linkTextKey: 'online_app_link3'
|
||||
},
|
||||
{
|
||||
url: 'http://umami.iletter.top/',
|
||||
linkTextKey: 'online_app_link4'
|
||||
},
|
||||
{
|
||||
url: 'http://beszel.iletter.top/',
|
||||
linkTextKey: 'online_app_link5'
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
|
||||
function renderWebsites(data, translations, lang = 'zh') {
|
||||
const container = document.getElementById('dynamic-website-links');
|
||||
if (!container) {
|
||||
console.error("Container '#dynamic-website-links' not found.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 清空容器
|
||||
container.innerHTML = '';
|
||||
|
||||
data.forEach(categoryObj => {
|
||||
const catKey = categoryObj.category;
|
||||
const items = categoryObj.items;
|
||||
|
||||
// 创建分类标题
|
||||
const heading = document.createElement('h3');
|
||||
// 使用传入的语言获取翻译文本
|
||||
const translatedHeadingText = translations[lang][catKey];
|
||||
if (translatedHeadingText !== undefined) {
|
||||
heading.textContent = translatedHeadingText;
|
||||
} else {
|
||||
// 如果找不到翻译,则显示 key 或一个默认值
|
||||
console.warn(`Translation key '${catKey}' not found for language '${lang}'`);
|
||||
heading.textContent = catKey; // 或者设置为 "Unknown Category"
|
||||
}
|
||||
container.appendChild(heading);
|
||||
|
||||
// 创建一个 div 来包裹该分类下的所有链接
|
||||
const linksDiv = document.createElement('div');
|
||||
linksDiv.className = 'category-links'; // 可选,方便 CSS 样式化
|
||||
|
||||
items.forEach(item => {
|
||||
const linkElement = document.createElement('a');
|
||||
linkElement.href = item.url;
|
||||
linkElement.target = '_blank';
|
||||
|
||||
// 获取链接的显示文本
|
||||
const linkTextKey = item.linkTextKey;
|
||||
const translatedLinkText = translations[lang][linkTextKey];
|
||||
if (translatedLinkText !== undefined) {
|
||||
linkElement.textContent = translatedLinkText;
|
||||
} else {
|
||||
// 如果找不到翻译,则显示 key 或一个默认值
|
||||
console.warn(`Translation key '${linkTextKey}' not found for language '${lang}'`);
|
||||
linkElement.textContent = item.url; // 或者设置为 "Link"
|
||||
}
|
||||
linksDiv.appendChild(linkElement);
|
||||
|
||||
// 添加一个间隔(例如空格或换行符,取决于你的 CSS 布局)
|
||||
const space = document.createTextNode(' ');
|
||||
linksDiv.appendChild(space);
|
||||
});
|
||||
|
||||
container.appendChild(linksDiv);
|
||||
});
|
||||
}
|
||||
60
static/js/tabchange.js
Normal file
60
static/js/tabchange.js
Normal file
@@ -0,0 +1,60 @@
|
||||
// ==================== 标签切换功能 ====================
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const tabs = document.querySelectorAll('.nav-tab');
|
||||
const contents = document.querySelectorAll('.tab-content');
|
||||
tabs.forEach(tab => {
|
||||
tab.addEventListener('click', function () {
|
||||
const tabId = this.getAttribute('data-tab');
|
||||
// 移除所有激活状态
|
||||
tabs.forEach(t => t.classList.remove('active'));
|
||||
contents.forEach(c => c.classList.remove('active'));
|
||||
// 添加当前激活状态
|
||||
this.classList.add('active');
|
||||
document.getElementById(`${tabId}-content`).classList.add('active');
|
||||
});
|
||||
});
|
||||
|
||||
const websiteTab = document.querySelector('.nav-tab[data-tab="website"]');
|
||||
const websiteContent = document.getElementById('website-content');
|
||||
if (websiteTab && websiteContent) {
|
||||
websiteTab.addEventListener('click', function () {
|
||||
const hasRendered = websiteContent.querySelector('.category-links') !== null;
|
||||
if (!hasRendered) {
|
||||
const savedLang = localStorage.getItem(LANG_KEY) || 'zh';
|
||||
renderWebsites(websitesData, translations, savedLang);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.warn("未找到“我的网站”标签或内容区域。");
|
||||
}
|
||||
|
||||
// 点击我的工具函数
|
||||
const toolsTab = document.querySelector('.nav-tab[data-tab="tools"]');
|
||||
const toolsContent = document.getElementById('tools-content');
|
||||
if (toolsTab && toolsContent) {
|
||||
toolsTab.addEventListener('click', function () {
|
||||
const hasRendered = toolsContent.querySelector('.tool-item') !== null;
|
||||
if (!hasRendered) {
|
||||
renderTools(toolsData);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.warn("未找到“我的工具”标签或内容区域,将在页面加载时尝试渲染。");
|
||||
renderTools(toolsData);
|
||||
}
|
||||
// 点击常玩游戏函数
|
||||
const gamesTab = document.querySelector('.nav-tab[data-tab="games"]');
|
||||
const gamesContent = document.getElementById('games-content');
|
||||
if (gamesTab && gamesContent) {
|
||||
gamesTab.addEventListener('click', function () {
|
||||
const hasRendered = gamesContent.querySelector('.game-item') !== null;
|
||||
if (!hasRendered) {
|
||||
renderGames(gamesData);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.warn("未找到“常玩游戏”标签或内容区域。");
|
||||
renderGames(gamesData);
|
||||
}
|
||||
|
||||
});
|
||||
@@ -1,68 +1,78 @@
|
||||
// ========== 工具配置数据 ==========
|
||||
// 将工具数据集中管理
|
||||
const toolsData = [
|
||||
{ name: 'Rolan', desc: '应用启动器,从大学用到现在' },
|
||||
{ name: 'Chrome', desc: '确实好用,正在向着屎迈进' },
|
||||
{ name: 'VS Code', desc: '代码编辑器,轻量?高效!' },
|
||||
{ name: 'IntelliJ IDEA', desc: 'JAVA代码编辑器' },
|
||||
{ name: 'PyCharm', desc: 'python代码编辑器' },
|
||||
{ name: 'Android Studio', desc: '安卓软件开发,一直在学(新建文件夹)' },
|
||||
{ name: 'HbuilderX', desc: '写小程序真心不错,vue+js很棒!减少了学习压力' },
|
||||
{ name: 'Navicate', desc: '链接mysql的神器,sqlyog是谁?真不熟。' },
|
||||
{ name: 'Xshell', desc: '链接服务器简单易用配合xftp很好用' },
|
||||
{ name: 'Postman', desc: 'API测试与调试工具' },
|
||||
{ name: 'VMware', desc: '虚拟机管理,工具有毒?先拿这个试试' },
|
||||
{ name: 'PhotoShop', desc: 'ps图片专用蒙版套索十分好用' },
|
||||
{ name: 'Obsidian', desc: '知识管理,双链接笔记。本地笔记爱好者的福音。' },
|
||||
{ name: 'Typora', desc: 'Markdown编辑器,简洁美观。' },
|
||||
{ name: 'Docker', desc: '容器化部署,一个docker-compose走天下' },
|
||||
{ name: 'Premiere Pro', desc: '剪辑视频调音做简单的效果,简单易用' },
|
||||
{ name: 'After Effects', desc: '特效制作神器,就是对显卡和cpu比较不友好' },
|
||||
{ name: 'CheatEngine', desc: '风灵月影没出来就用它,亦是内存hook的极佳选择' },
|
||||
{ name: 'x64dbg', desc: '孩子!你想掌握逆向之力嘛!先从x64dbg开始吧!' },
|
||||
{ name: 'WireGuard', desc: '组网神器,去你妹的向日葵,去你妹的todesk' },
|
||||
{ name: 'Syncthing', desc: '文件同步,超级好用,同步笔记的不错选择。' },
|
||||
{ name: 'NeatReader', desc: '看书软件,有点后悔花了188买了永久' },
|
||||
{ name: 'Corel VideoStudio', desc: '万恶的苏州思杰马克丁!还我会声会影' },
|
||||
{ name: '网易云音乐', desc: '每天听,每天用,尊贵的年费vip+版权破解Unblock Netease' },
|
||||
{ name: '喜马拉雅听书', desc: '每天听,每天用。三体,穷鬼的上下两千年等优秀书籍' },
|
||||
{ name: '一本日记', desc: '正经人谁写日记啊!' },
|
||||
{ name: 'Ollama', desc: '本地部署对话AI,微调模型,32b是4070遭不住' },
|
||||
{ name: 'AnythingLLM', desc: 'AI知识库的极佳选择,比我自己微调+向量化好' },
|
||||
{ name: 'UVR5', desc: '处理音频的神器,想当年苦逼的分离音频算什么!' },
|
||||
{ name: 'Remote Desktop Manager', desc: '超级强大的远控软件' },
|
||||
{ name: 'SyncClipboard', desc: '剪切板同步,好用,爱用。再也不用微信消息复制粘贴了' },
|
||||
{ name: 'QtScrcpy', desc: '局域网控制手机神器,远程adb牛逼' },
|
||||
];
|
||||
// ========== 工具配置数据 ==========
|
||||
// 将工具数据集中管理
|
||||
const toolsData = [
|
||||
{ name: "Rolan", desc: "应用启动器,从大学用到现在" },
|
||||
{ name: "Chrome", desc: "确实好用,正在向着屎迈进" },
|
||||
{ name: "VS Code", desc: "代码编辑器,轻量?高效!" },
|
||||
{ name: "IntelliJ IDEA", desc: "JAVA代码编辑器" },
|
||||
{ name: "PyCharm", desc: "python代码编辑器" },
|
||||
{ name: "Android Studio", desc: "安卓软件开发,一直在学(新建文件夹)" },
|
||||
{ name: "HbuilderX", desc: "写小程序真心不错,vue+js很棒!减少了学习压力" },
|
||||
{ name: "Navicate", desc: "链接mysql的神器,sqlyog是谁?真不熟。" },
|
||||
{ name: "Xshell", desc: "链接服务器简单易用配合xftp很好用" },
|
||||
{ name: "Postman", desc: "API测试与调试工具" },
|
||||
{ name: "VMware", desc: "虚拟机管理,工具有毒?先拿这个试试" },
|
||||
{ name: "PhotoShop", desc: "ps图片专用蒙版套索十分好用" },
|
||||
{ name: "Obsidian", desc: "知识管理,双链接笔记。本地笔记爱好者的福音。" },
|
||||
{ name: "Typora", desc: "Markdown编辑器,简洁美观。" },
|
||||
{ name: "Docker", desc: "容器化部署,一个docker-compose走天下" },
|
||||
{ name: "Premiere Pro", desc: "剪辑视频调音做简单的效果,简单易用" },
|
||||
{ name: "After Effects", desc: "特效制作神器,就是对显卡和cpu比较不友好" },
|
||||
{ name: "CheatEngine", desc: "风灵月影没出来就用它,亦是内存hook的极佳选择" },
|
||||
{ name: "x64dbg", desc: "孩子!你想掌握逆向之力嘛!先从x64dbg开始吧!" },
|
||||
{ name: "WireGuard", desc: "组网神器,去你妹的向日葵,去你妹的todesk" },
|
||||
{ name: "Syncthing", desc: "文件同步,超级好用,同步笔记的不错选择。" },
|
||||
{ name: "NeatReader", desc: "看书软件,有点后悔花了188买了永久" },
|
||||
{ name: "Corel VideoStudio", desc: "万恶的苏州思杰马克丁!还我会声会影" },
|
||||
{
|
||||
name: "网易云音乐",
|
||||
desc: "每天听,每天用,尊贵的年费vip+版权破解Unblock Netease",
|
||||
},
|
||||
{
|
||||
name: "喜马拉雅听书",
|
||||
desc: "每天听,每天用。三体,穷鬼的上下两千年等优秀书籍",
|
||||
},
|
||||
{ name: "一本日记", desc: "正经人谁写日记啊!" },
|
||||
{ name: "Ollama", desc: "本地部署对话AI,微调模型,32b是4070遭不住" },
|
||||
{ name: "AnythingLLM", desc: "AI知识库的极佳选择,比我自己微调+向量化好" },
|
||||
{ name: "UVR5", desc: "处理音频的神器,想当年苦逼的分离音频算什么!" },
|
||||
{ name: "Remote Desktop Manager", desc: "超级强大的远控软件" },
|
||||
{
|
||||
name: "SyncClipboard",
|
||||
desc: "剪切板同步,好用,爱用。再也不用微信消息复制粘贴了",
|
||||
},
|
||||
{ name: "QtScrcpy", desc: "局域网控制手机神器,远程adb牛逼" },
|
||||
];
|
||||
|
||||
// ========== 渲染工具列表的函数 ==========
|
||||
function renderTools(toolsArray) {
|
||||
const container = document.getElementById('tools-container');
|
||||
if (!container) {
|
||||
console.error("未找到工具容器 #tools-container");
|
||||
return;
|
||||
}
|
||||
// ========== 渲染工具列表的函数 ==========
|
||||
function renderTools(toolsArray) {
|
||||
const container = document.getElementById("tools-container");
|
||||
if (!container) {
|
||||
console.error("未找到工具容器 #tools-container");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!toolsArray || toolsArray.length === 0) {
|
||||
container.innerHTML = '<div class="memo-error" data-i18n="no_tools_data">暂无工具数据</div>'; // 可选:无数据提示
|
||||
return;
|
||||
}
|
||||
const currentLang = localStorage.getItem(LANG_KEY) || 'zh';
|
||||
if (!toolsArray || toolsArray.length === 0) {
|
||||
container.innerHTML =
|
||||
'<div class="memo-error" data-i18n="no_tools_data">暂无工具数据</div>'; // 可选:无数据提示
|
||||
return;
|
||||
}
|
||||
const currentLang = localStorage.getItem(LANG_KEY) || "zh";
|
||||
|
||||
let html = '';
|
||||
toolsArray.forEach((tool,index) => {
|
||||
const nameKey = `tool_name_${index}`;
|
||||
const descKey = `tool_desc_${index}`;
|
||||
const nameTranslation = translations[currentLang][nameKey] || tool.name; // 如果没有翻译,则回退到原始数据
|
||||
const descTranslation = translations[currentLang][descKey] || tool.desc;
|
||||
let html = "";
|
||||
toolsArray.forEach((tool, index) => {
|
||||
const nameKey = `tool_name_${index}`;
|
||||
const descKey = `tool_desc_${index}`;
|
||||
const nameTranslation = translations[currentLang][nameKey] || tool.name; // 如果没有翻译,则回退到原始数据
|
||||
const descTranslation = translations[currentLang][descKey] || tool.desc;
|
||||
|
||||
html += `
|
||||
html += `
|
||||
<div class="tool-item">
|
||||
<div class="tool-name">${nameTranslation}</div>
|
||||
<div class="tool-desc">${descTranslation}</div>
|
||||
</div>
|
||||
`;
|
||||
});
|
||||
});
|
||||
|
||||
container.innerHTML = html;
|
||||
}
|
||||
container.innerHTML = html;
|
||||
}
|
||||
|
||||
@@ -1,278 +0,0 @@
|
||||
const translations = {
|
||||
'zh': { // 中文
|
||||
'page_title': '白荼 - BAITU',
|
||||
'nav_about': '关于我',
|
||||
'nav_website': '我的网站',
|
||||
'nav_tools': '常用工具',
|
||||
'nav_games': '常玩游戏',
|
||||
'nav_memos': '闲言碎语',
|
||||
'nav_contact': '联系我',
|
||||
'hello': '你好',
|
||||
'greeting': '见字如面,展信舒颜。',
|
||||
'my_name': '白荼',
|
||||
'about_me_p1': '我叫<strong>白荼</strong>,河北衡水人,土生土长的北方汉子,毕业于一所不知名的二本院校。信息管理与信息系统专业。自学java、vue、linux、mysql、python等开发技术和一些软件逆向技术,同时还略懂些PS图片、PR视频、AE特效制作。做过系统,剪过网线,搞过plc耍过单片机,维护修理过服务器,运营过公众号和网站等等。可谓是会,但只会一点点。别人都觉得我是个大佬,其实我就是个小菜鸡。但我不会气馁,努力成为一个大佬的。正如永劫无间刘炼的一句话“天下万般之绝学,莫过于恒心。”',
|
||||
'about_me_p2': '平时的爱好也就是玩玩游戏,看看书,刷刷动漫,不爱出门,肥宅一个。讨厌重复简单的工作,会想办法偷懒写写自己的顺手的小工具什么的,毕竟懒惰是我的生产力。我也经常混迹于各大网络论坛博客并在各个技术博主下面直呼"大佬666"、"大佬牛牛牛"。自己的博客也在断断续续中更新。主要是记录生活随笔和碰到的技术难题。',
|
||||
'about_me_p3': '本站秉承简约风格,采用纯HTML,Umami做网站底部的uv/pv ,闲言碎语模块使用memos接口。同时使用堡塔云WAF防护,nginx缓存加速网站静态资源。如果您有兴趣,可以直接下载本站的 <a href="https://gitea.iletter.top/dellevin/BaiTu-homepage" target="_blank">https://gitea.iletter.top/dellevin/BaiTu-homepage </a> 并使用。',
|
||||
'about_me_p4': '作为一个99年的码农,很庆幸我在工作之后还对技术有着极大的热情!如果你也对技术有着同样的兴趣,也很希望认识你!一同进步共同成长!',
|
||||
'my_website_h2': '我的网站',
|
||||
'personal_blog_h3': '个人博客',
|
||||
'personal_blog_link1': 'ittoolman.top - Github托管',
|
||||
'personal_blog_link2': 'blog.iletter.top - typecho用户的最后坚守',
|
||||
'online_apps_h3': '在线应用',
|
||||
'online_app_link1': '简单图床 - 图床工具',
|
||||
'online_app_link2': 'Gitea - 私人git托管仓库',
|
||||
'online_app_link3': 'OpenList - 在线云盘合集',
|
||||
'online_app_link4': 'Beszel - 服务器监控',
|
||||
'contact_me_h2': '联系我',
|
||||
'contact_intro': '欢迎通过以下方式与我联系:',
|
||||
'email_label': '邮箱:',
|
||||
'wechat_label': '微信:',
|
||||
'qq_label': '扣扣:',
|
||||
'address_label': '地址:',
|
||||
'address_value': '山东省·济南市·市中区',
|
||||
'social_media_h3': '社交媒体',
|
||||
'social_link1': 'GitHub',
|
||||
'social_link2': '微博',
|
||||
'social_link3': '知乎',
|
||||
'social_link4': 'B站',
|
||||
'social_link5': '52pojie',
|
||||
'leave_message_h3': '留言',
|
||||
'leave_message_p': '如果你有任何问题或建议,欢迎<a href="https://blog.iletter.top/401.html" target="_blank">点击此链接</a>去我的博客下面给我留言!',
|
||||
'leave_message_link': '点击此链接',
|
||||
'my_tools_h2': '我的工具',
|
||||
'loading_tools': '正在加载工具列表...',
|
||||
'my_games_h2': '我常玩的游戏',
|
||||
'loading_games': '正在加载游戏列表...',
|
||||
'memos_h2': '闲言碎语',
|
||||
'loading_memos': '正在加载...',
|
||||
'footer_text': '我虽然是个废物,但我仍然选择用自己喜欢的方式度过自己的余生',
|
||||
'visitor_count_label': '本站访客数 :',
|
||||
'visit_count_label': '本站总访问量 :',
|
||||
|
||||
// --- 新增: 游戏翻译 (zh) ---
|
||||
'game_name_0': '《永劫无间》',
|
||||
'game_desc_0': '我身无拘,武道无穷',
|
||||
'game_name_1': '《我的世界》',
|
||||
'game_desc_1': '这个小盒才是我的永远的家',
|
||||
'game_name_2': '《鬼谷八荒》',
|
||||
'game_desc_2': '当互动版的修仙小说看了,很好玩.',
|
||||
'game_name_3': '《江城创业记》',
|
||||
'game_desc_3': '缝合怪,但是全缝了。很喜欢的一款游戏',
|
||||
'game_name_4': '《中国式家长》',
|
||||
'game_desc_4': '我承认我做不好一个孩子,也做不好一个家长',
|
||||
'game_name_5': '《王者荣耀》',
|
||||
'game_desc_5': '买了好多皮肤,和朋友玩才是真快乐(已退坑)',
|
||||
'game_name_6': '《QQ飞车手游》',
|
||||
'game_desc_6': '氪了好多,有些后悔了(已退坑)',
|
||||
'game_name_7': '《龙族幻想》',
|
||||
'game_desc_7': '因为龙族入坑的,小氪(已退坑)',
|
||||
'game_name_8': '《洛克王国》',
|
||||
'game_desc_8': '还记得小时候拿压岁钱偷偷买点卡(已退坑)',
|
||||
'game_name_9': '《造梦西游》',
|
||||
'game_desc_9': '造梦3从小学玩到大学,现在还时不时的回味一下(已退坑)',
|
||||
|
||||
// --- 新增: 工具翻译 (zh) ---
|
||||
'tool_name_0': 'Rolan',
|
||||
'tool_desc_0': '应用启动器,从大学用到现在',
|
||||
'tool_name_1': 'Chrome',
|
||||
'tool_desc_1': '确实好用,正在向着屎迈进',
|
||||
'tool_name_2': 'VS Code',
|
||||
'tool_desc_2': '代码编辑器,轻量?高效!',
|
||||
'tool_name_3': 'IntelliJ IDEA',
|
||||
'tool_desc_3': 'JAVA代码编辑器',
|
||||
'tool_name_4': 'PyCharm',
|
||||
'tool_desc_4': 'python代码编辑器',
|
||||
'tool_name_5': 'Android Studio',
|
||||
'tool_desc_5': '安卓软件开发,一直在学(新建文件夹)',
|
||||
'tool_name_6': 'HbuilderX',
|
||||
'tool_desc_6': '写小程序真心不错,vue+js很棒!减少了学习压力',
|
||||
'tool_name_7': 'Navicate',
|
||||
'tool_desc_7': '链接mysql的神器,sqlyog是谁?真不熟。',
|
||||
'tool_name_8': 'Xshell',
|
||||
'tool_desc_8': '链接服务器简单易用配合xftp很好用',
|
||||
'tool_name_9': 'Postman',
|
||||
'tool_desc_9': 'API测试与调试工具',
|
||||
'tool_name_10': 'VMware',
|
||||
'tool_desc_10': '虚拟机管理,工具有毒?先拿这个试试',
|
||||
'tool_name_11': 'PhotoShop',
|
||||
'tool_desc_11': 'ps图片专用蒙版套索十分好用',
|
||||
'tool_name_12': 'Obsidian',
|
||||
'tool_desc_12': '知识管理,双链接笔记。本地笔记爱好者的福音。',
|
||||
'tool_name_13': 'Typora',
|
||||
'tool_desc_13': 'Markdown编辑器,简洁美观。',
|
||||
'tool_name_14': 'Docker',
|
||||
'tool_desc_14': '容器化部署,一个docker-compose走天下',
|
||||
'tool_name_15': 'Premiere Pro',
|
||||
'tool_desc_15': '剪辑视频调音做简单的效果,简单易用',
|
||||
'tool_name_16': 'After Effects',
|
||||
'tool_desc_16': '特效制作神器,就是对显卡和cpu比较不友好',
|
||||
'tool_name_17': 'CheatEngine',
|
||||
'tool_desc_17': '风灵月影没出来就用它,亦是内存hook的极佳选择',
|
||||
'tool_name_18': 'x64dbg',
|
||||
'tool_desc_18': '孩子!你想掌握逆向之力嘛!先从x64dbg开始吧!',
|
||||
'tool_name_19': 'WireGuard',
|
||||
'tool_desc_19': '组网神器,去你妹的向日葵,去你妹的todesk',
|
||||
'tool_name_20': 'Syncthing',
|
||||
'tool_desc_20': '文件同步,超级好用,同步笔记的不错选择。',
|
||||
'tool_name_21': 'NeatReader',
|
||||
'tool_desc_21': '看书软件,有点后悔花了188买了永久',
|
||||
'tool_name_22': 'Corel VideoStudio',
|
||||
'tool_desc_22': '万恶的苏州思杰马克丁!还我会声会影',
|
||||
'tool_name_23': '网易云音乐',
|
||||
'tool_desc_23': '每天听,每天用,尊贵的年费vip+版权破解Unblock Netease',
|
||||
'tool_name_24': '喜马拉雅听书',
|
||||
'tool_desc_24': '每天听,每天用。三体,穷鬼的上下两千年等优秀书籍',
|
||||
'tool_name_25': '一本日记',
|
||||
'tool_desc_25': '正经人谁写日记啊!',
|
||||
'tool_name_26': 'Ollama',
|
||||
'tool_desc_26': '本地部署对话AI,微调模型,32b是4070遭不住',
|
||||
'tool_name_27': 'AnythingLLM',
|
||||
'tool_desc_27': 'AI知识库的极佳选择,比我自己微调+向量化好',
|
||||
'tool_name_28': 'UVR5',
|
||||
'tool_desc_28': '处理音频的神器,想当年苦逼的分离音频算什么!',
|
||||
'tool_name_29': 'Remote Desktop Manager',
|
||||
'tool_desc_29': '超级强大的远控软件',
|
||||
'tool_name_30': 'SyncClipboard',
|
||||
'tool_desc_30': '剪切板同步,好用,爱用。再也不用微信消息复制粘贴了',
|
||||
'tool_name_31': 'QtScrcpy',
|
||||
'tool_desc_31': '局域网控制手机神器,远程adb牛逼',
|
||||
},
|
||||
'en': { // 英文
|
||||
'page_title': 'BaiTu - BAITU',
|
||||
'nav_about': 'About Me',
|
||||
'nav_website': 'My Websites',
|
||||
'nav_tools': 'Tools',
|
||||
'nav_games': 'Games',
|
||||
'nav_memos': 'Memos',
|
||||
'nav_contact': 'Contact Me',
|
||||
'hello': 'Hello',
|
||||
'greeting': '',
|
||||
'my_name': 'BaiTu',
|
||||
'about_me_p1': 'My name is <strong>BaiTu</strong>, from Hengshui, Hebei, a native northerner. I graduated from an obscure second-tier university with a major in Information Management and Information Systems. I self-studied development technologies like Java, Vue, Linux, MySQL, Python, and some software reverse engineering techniques. I also have basic skills in PS, PR, and AE. I have experience with systems, networking, PLCs, microcontrollers, server maintenance, and managing public accounts and websites. In short, I know a little bit about many things. Others might think I\'m an expert, but actually, I\'m just a rookie. However, I won\'t give up and will strive to become an expert. As Liu Lian from Yu Jie Wu Jian said, "The most important skill in the world is perseverance."',
|
||||
'about_me_p2': 'My hobbies usually involve playing games, reading books, watching anime, and I prefer staying indoors. I hate repetitive and simple work, so I often write small tools to make life easier because laziness drives my productivity. I frequently lurk on various forums and blogs, shouting "Expert 666" or "Expert Amazing" under tech bloggers. My own blog updates sporadically, mainly recording daily life notes and technical challenges encountered.',
|
||||
'about_me_p3': 'This site follows a minimalist style, using pure HTML. Umami tracks UV/PV at the bottom. The Memos section uses the Memos API. It also employs Baota Cloud WAF protection and nginx caching for static resources. If you are interested, you can directly download the source code from <a href="https://gitea.iletter.top/dellevin/BaiTu-homepage" target="_blank">https://gitea.iletter.top/dellevin/BaiTu-homepage </a> and use it.',
|
||||
'about_me_p4': 'As a 99er programmer, I am glad to still have great passion for technology after starting work! If you share the same interest in technology, I would love to meet you! Let\'s progress and grow together!',
|
||||
'my_website_h2': 'My Websites',
|
||||
'personal_blog_h3': 'Personal Blogs',
|
||||
'personal_blog_link1': 'ittoolman.top - Hosted on Github',
|
||||
'personal_blog_link2': 'blog.iletter.top - Last Stand for Typecho Users',
|
||||
'online_apps_h3': 'Online Applications',
|
||||
'online_app_link1': 'Simple Image Hosting - Image Uploader Tool',
|
||||
'online_app_link2': 'Gitea - Private Git Repository',
|
||||
'online_app_link3': 'OpenList - Online Cloud Disk Collection',
|
||||
'online_app_link4': 'Beszel - Server Monitoring',
|
||||
'contact_me_h2': 'Contact Me',
|
||||
'contact_intro': 'Feel free to reach out via the following methods:',
|
||||
'email_label': 'Email:',
|
||||
'wechat_label': 'WeChat:',
|
||||
'qq_label': 'QQ:',
|
||||
'address_label': 'Address:',
|
||||
'address_value': 'Shizhong District, Jinan, Shandong Province',
|
||||
'social_media_h3': 'Social Media',
|
||||
'social_link1': 'GitHub',
|
||||
'social_link2': 'Weibo',
|
||||
'social_link3': 'Zhihu',
|
||||
'social_link4': 'Bilibili',
|
||||
'social_link5': '52pojie',
|
||||
'leave_message_h3': 'Leave a Message',
|
||||
'leave_message_p': 'If you have any questions or suggestions, feel free to <a href="https://blog.iletter.top/401.html" target="_blank">click here</a> to leave me a message on my blog!',
|
||||
'leave_message_link': 'click here',
|
||||
'my_tools_h2': 'My Tools',
|
||||
'loading_tools': 'Loading tools list...',
|
||||
'my_games_h2': 'Games I Often Play',
|
||||
'loading_games': 'Loading games list...',
|
||||
'memos_h2': 'Memos',
|
||||
'loading_memos': 'Loading...',
|
||||
'footer_text': 'I still choose to spend the rest of my life in my own way although I am a failure.',
|
||||
'visitor_count_label': 'Visitors:',
|
||||
'visit_count_label': 'Total Visits:',
|
||||
|
||||
// --- 新增: 游戏翻译 (en) ---
|
||||
'game_name_0': 'Naraka: Bladepoint',
|
||||
'game_desc_0': 'I am unrestricted, martial arts are boundless',
|
||||
'game_name_1': 'Minecraft',
|
||||
'game_desc_1': 'This little box is my forever home',
|
||||
'game_name_2': 'Gates of Havoc',
|
||||
'game_desc_2': 'Played like an interactive Xianxia novel, quite fun.',
|
||||
'game_name_3': 'Jiangcheng Entrepreneurship Story',
|
||||
'game_desc_3': 'A mashup game, but fully mashed. But a favorite game of mine.',
|
||||
'game_name_4': 'Chinese Parents',
|
||||
'game_desc_4': 'I admit I\'m not good at being a child, nor a parent.',
|
||||
'game_name_5': 'Arena of Valor',
|
||||
'game_desc_5': 'Bought many skins, real joy comes from playing with friends (quit now).',
|
||||
'game_name_6': 'QQ Speed Mobile',
|
||||
'game_desc_6': 'Spent a lot, now a bit regretful (quit now).',
|
||||
'game_name_7': 'Dragon Raja',
|
||||
'game_desc_7': 'Got into it because of the Dragon Raja series, spent a little (quit now).',
|
||||
'game_name_8': 'Roco Kingdom',
|
||||
'game_desc_8': 'Remember secretly buying cards with New Year money as a kid (quit now).',
|
||||
'game_name_9': 'Dream Journey West',
|
||||
'game_desc_9': 'Playing Dream Journey 3 from elementary to college, still enjoy it occasionally (quit now).',
|
||||
|
||||
// --- 新增: 工具翻译 (en) ---
|
||||
'tool_name_0': 'Rolan',
|
||||
'tool_desc_0': 'App launcher, used since college',
|
||||
'tool_name_1': 'Chrome',
|
||||
'tool_desc_1': 'Truly useful, but heading towards poop.',
|
||||
'tool_name_2': 'VS Code',
|
||||
'tool_desc_2': 'Code editor, lightweight? Efficient!',
|
||||
'tool_name_3': 'IntelliJ IDEA',
|
||||
'tool_desc_3': 'JAVA Code Editor',
|
||||
'tool_name_4': 'PyCharm',
|
||||
'tool_desc_4': 'Python Code Editor',
|
||||
'tool_name_5': 'Android Studio',
|
||||
'tool_desc_5': 'Android app development, always learning (create new folder).',
|
||||
'tool_name_6': 'HbuilderX',
|
||||
'tool_desc_6': 'Great for writing mini-programs, Vue+JS is awesome! Reduces learning pressure.',
|
||||
'tool_name_7': 'Navicat',
|
||||
'tool_desc_7': 'A神器 for connecting MySQL, what\'s SQLyog? Never heard of it.',
|
||||
'tool_name_8': 'Xshell',
|
||||
'tool_desc_8': 'Easy to connect to servers, works well with Xftp.',
|
||||
'tool_name_9': 'Postman',
|
||||
'tool_desc_9': 'API testing and debugging tool',
|
||||
'tool_name_10': 'VMware',
|
||||
'tool_desc_10': 'Virtual machine management, tool toxic? Try this first.',
|
||||
'tool_name_11': 'Photoshop',
|
||||
'tool_desc_11': 'PS image dedicated, masks and lasso are very useful.',
|
||||
'tool_name_12': 'Obsidian',
|
||||
'tool_desc_12': 'Knowledge management, bidirectional linking notes. A blessing for local note lovers.',
|
||||
'tool_name_13': 'Typora',
|
||||
'tool_desc_13': 'Markdown editor, simple and beautiful.',
|
||||
'tool_name_14': 'Docker',
|
||||
'tool_desc_14': 'Containerized deployment, docker-compose rules them all.',
|
||||
'tool_name_15': 'Premiere Pro',
|
||||
'tool_desc_15': 'Video editing, audio adjustment, simple effects, easy to use.',
|
||||
'tool_name_16': 'After Effects',
|
||||
'tool_desc_16': 'Special effects creation神器, but not friendly to GPU and CPU.',
|
||||
'tool_name_17': 'Cheat Engine',
|
||||
'tool_desc_17': 'Used it before Feng Ling Yue Ying came out, also a great choice for memory hooks.',
|
||||
'tool_name_18': 'x64dbg',
|
||||
'tool_desc_18': 'Kid! Want to master reverse power? Start with x64dbg!',
|
||||
'tool_name_19': 'WireGuard',
|
||||
'tool_desc_19': 'Networking神器, screw Sunflower, screw Todesk.',
|
||||
'tool_name_20': 'Syncthing',
|
||||
'tool_desc_20': 'File sync, super handy, great choice for syncing notes.',
|
||||
'tool_name_21': 'NeatReader',
|
||||
'tool_desc_21': 'Reading software, a bit regret spending 188 for lifetime.',
|
||||
'tool_name_22': 'Corel VideoStudio',
|
||||
'tool_desc_22': 'Evil Suzhou CorelMark! Give me back Pinnacle Studio.',
|
||||
'tool_name_23': 'Netease Cloud Music',
|
||||
'tool_desc_23': 'Listen and use daily, premium annual VIP + copyright unlock Unblock Netease.',
|
||||
'tool_name_24': 'Ximalaya Audiobook',
|
||||
'tool_desc_24': 'Listen and use daily. Great books like Three Body, Poor Man\'s Past and Future etc.',
|
||||
'tool_name_25': 'A Diary',
|
||||
'tool_desc_25': 'Who writes a diary anyway?!',
|
||||
'tool_name_26': 'Ollama',
|
||||
'tool_desc_26': 'Local AI deployment, fine-tuning models, 32b is too much for 4070.',
|
||||
'tool_name_27': 'AnythingLLM',
|
||||
'tool_desc_27': 'An excellent choice for AI knowledge base, better than my own fine-tuning + vectorization.',
|
||||
'tool_name_28': 'UVR5',
|
||||
'tool_desc_28': 'Audio processing神器, what hardships were separating audio back then!',
|
||||
'tool_name_29': 'Remote Desktop Manager',
|
||||
'tool_desc_29': 'Super powerful remote control software.',
|
||||
'tool_name_30': 'SyncClipboard',
|
||||
'tool_desc_30': 'Clipboard sync, handy, love it. No more copying/pasting via WeChat messages.',
|
||||
'tool_name_31': 'QtScrcpy',
|
||||
'tool_desc_31': 'LAN phone control tool, remote adb is awesome.',
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user