This commit is contained in:
2026-01-15 14:33:59 +08:00
parent 46b94a3218
commit 76d69745b5
5 changed files with 117 additions and 42 deletions

1
app.js
View File

@@ -80,6 +80,7 @@ export function initApp() {
function getDocumentLang(language) { function getDocumentLang(language) {
if (language === "zh-Hant") return "zh-Hant" if (language === "zh-Hant") return "zh-Hant"
if (language === "zh-Hans") return "zh-Hans" if (language === "zh-Hans") return "zh-Hans"
if (language === "wenyan") return "zh-Hans"
if (language === "ja") return "ja" if (language === "ja") return "ja"
if (language === "ko") return "ko" if (language === "ko") return "ko"
return "en" return "en"

72
data.js
View File

@@ -10,20 +10,24 @@ export const sites = [
url: import.meta.env.VITE_OJ, url: import.meta.env.VITE_OJ,
title: { title: {
"zh-Hans": "判题狗", "zh-Hans": "判题狗",
wenyan: "判题犬",
garbled: "è½◽",
bin: "011",
"zh-Hant": "判題狗", "zh-Hant": "判題狗",
en: "Judge Dog", en: "Judge Dog",
ja: "判定犬", ja: "判定犬",
ko: "판정개", ko: "판정개",
es: "Perro juez",
meow: "喵喵喵", meow: "喵喵喵",
}, },
description: { description: {
"zh-Hans": "在线判题网站", "zh-Hans": "在线判题网站",
wenyan: "判题之所",
garbled: "烫锟ä¢烫糊",
bin: "010011",
"zh-Hant": "在線判題網站", "zh-Hant": "在線判題網站",
en: "Online judge platform", en: "Online judge platform",
ja: "オンライン判定サイト", ja: "オンライン判定サイト",
ko: "온라인 판정 사이트", ko: "온라인 판정 사이트",
es: "Plataforma de jueces en linea",
meow: "喵喵喵喵喵喵", meow: "喵喵喵喵喵喵",
}, },
icon: "noto--dog-face.svg", icon: "noto--dog-face.svg",
@@ -32,20 +36,24 @@ export const sites = [
url: import.meta.env.VITE_CODE, url: import.meta.env.VITE_CODE,
title: { title: {
"zh-Hans": "自测猫", "zh-Hans": "自测猫",
wenyan: "自试猫",
garbled: "ä¢å",
bin: "001",
"zh-Hant": "自測貓", "zh-Hant": "自測貓",
en: "Self Test Cat", en: "Self Test Cat",
ja: "自テスト猫", ja: "自テスト猫",
ko: "자가테스트猫", ko: "자가테스트猫",
es: "Gato de autoevaluacion",
meow: "喵喵喵", meow: "喵喵喵",
}, },
description: { description: {
"zh-Hans": "代码运行网站", "zh-Hans": "代码运行网站",
wenyan: "行码之所",
garbled: "¿屯屯糊¢◾",
bin: "100011",
"zh-Hant": "代碼運行網站", "zh-Hant": "代碼運行網站",
en: "Code runner", en: "Code runner",
ja: "コード実行サイト", ja: "コード実行サイト",
ko: "코드 실행 사이트", ko: "코드 실행 사이트",
es: "Sitio para ejecutar codigo",
meow: "喵喵喵喵喵喵", meow: "喵喵喵喵喵喵",
}, },
icon: "noto--cat-face.svg", icon: "noto--cat-face.svg",
@@ -54,20 +62,24 @@ export const sites = [
url: import.meta.env.VITE_WEB, url: import.meta.env.VITE_WEB,
title: { title: {
"zh-Hans": "哈基米", "zh-Hans": "哈基米",
wenyan: "哈基米",
garbled: "¿▣▦",
bin: "010",
"zh-Hant": "哈基米", "zh-Hant": "哈基米",
en: "Hakimi", en: "Hakimi",
ja: "ハキミ", ja: "ハキミ",
ko: "하키미", ko: "하키미",
es: "Hakimi",
meow: "喵喵喵", meow: "喵喵喵",
}, },
description: { description: {
"zh-Hans": "Web 前端开发", "zh-Hans": "Web 前端开发",
wenyan: "网页前端之作",
garbled: "ä▦▨斤¨è□¿",
bin: "01111110",
"zh-Hant": "Web 前端開發", "zh-Hant": "Web 前端開發",
en: "Web frontend development", en: "Web frontend development",
ja: "Webフロントエンド開発", ja: "Webフロントエンド開発",
ko: "웹 프론트엔드 개발", ko: "웹 프론트엔드 개발",
es: "Desarrollo frontend web",
meow: "喵喵喵喵喵喵喵喵", meow: "喵喵喵喵喵喵喵喵",
}, },
icon: "noto--honeybee.svg", icon: "noto--honeybee.svg",
@@ -76,20 +88,24 @@ export const sites = [
url: import.meta.env.VITE_SHUATI, url: import.meta.env.VITE_SHUATI,
title: { title: {
"zh-Hans": "刷题鸭", "zh-Hans": "刷题鸭",
wenyan: "习题鸭",
garbled: "¿æä",
bin: "110",
"zh-Hant": "刷題鴨", "zh-Hant": "刷題鴨",
en: "Practice Duck", en: "Practice Duck",
ja: "演習アヒル", ja: "演習アヒル",
ko: "문제풀이오리", ko: "문제풀이오리",
es: "Pato de practica",
meow: "喵喵喵", meow: "喵喵喵",
}, },
description: { description: {
"zh-Hans": "梁老师的刷题网站", "zh-Hans": "梁老师的刷题网站",
wenyan: "梁师习题之所",
garbled: "糊¿拷èç¿□¨",
bin: "00011101",
"zh-Hant": "梁老師的刷題網站", "zh-Hant": "梁老師的刷題網站",
en: "Practice problems by Mr. Liang", en: "Practice problems by Mr. Liang",
ja: "梁先生の演習サイト", ja: "梁先生の演習サイト",
ko: "량 선생님의 문제풀이 사이트", ko: "량 선생님의 문제풀이 사이트",
es: "Sitio de practicas del profe Liang",
meow: "喵喵喵喵喵喵喵喵", meow: "喵喵喵喵喵喵喵喵",
}, },
icon: "noto--paintbrush.svg", icon: "noto--paintbrush.svg",
@@ -98,20 +114,24 @@ export const sites = [
url: import.meta.env.VITE_BOOK, url: import.meta.env.VITE_BOOK,
title: { title: {
"zh-Hans": "编程书", "zh-Hans": "编程书",
wenyan: "程式书",
garbled: "¬拷拷",
bin: "000",
"zh-Hant": "編程書", "zh-Hant": "編程書",
en: "Coding Books", en: "Coding Books",
ja: "プログラミング書", ja: "プログラミング書",
ko: "프로그래밍 책", ko: "프로그래밍 책",
es: "Libros de programacion",
meow: "喵喵喵", meow: "喵喵喵",
}, },
description: { description: {
"zh-Hans": "编程和计算机相关知识汇总", "zh-Hans": "编程和计算机相关知识汇总",
wenyan: "程式及计算机知识总览",
garbled: "拷¨锟斤锟¬锟¬ä▧斤¨",
bin: "100101111000",
"zh-Hant": "編程和計算機相關知識匯總", "zh-Hant": "編程和計算機相關知識匯總",
en: "CS knowledge summary", en: "CS knowledge summary",
ja: "プログラミング/コンピュータ知識まとめ", ja: "プログラミング/コンピュータ知識まとめ",
ko: "프로그래밍/컴퓨터 지식 모음", ko: "프로그래밍/컴퓨터 지식 모음",
es: "Resumen de conocimiento de programacion y computacion",
meow: "喵喵喵喵喵喵喵喵喵喵喵喵", meow: "喵喵喵喵喵喵喵喵喵喵喵喵",
}, },
icon: "noto--bookmark-tabs.svg", icon: "noto--bookmark-tabs.svg",
@@ -120,20 +140,24 @@ export const sites = [
url: import.meta.env.VITE_BLOCKLY, url: import.meta.env.VITE_BLOCKLY,
title: { title: {
"zh-Hans": "小方块", "zh-Hans": "小方块",
wenyan: "小方块",
garbled: "¨糊”",
bin: "110",
"zh-Hant": "小方塊", "zh-Hant": "小方塊",
en: "Little Blocks", en: "Little Blocks",
ja: "小さなブロック", ja: "小さなブロック",
ko: "작은 블록", ko: "작은 블록",
es: "Bloques pequenos",
meow: "喵喵喵", meow: "喵喵喵",
}, },
description: { description: {
"zh-Hans": "搭积木,学编程", "zh-Hans": "搭积木,学编程",
wenyan: "以积木习程式",
garbled: "◽¬拷ç¿斤锟",
bin: "1101101",
"zh-Hant": "搭積木,學編程", "zh-Hant": "搭積木,學編程",
en: "Learn coding with blocks", en: "Learn coding with blocks",
ja: "ブロックでプログラミング", ja: "ブロックでプログラミング",
ko: "블록으로 프로그래밍 배우기", ko: "블록으로 프로그래밍 배우기",
es: "Aprende programacion con bloques",
meow: "喵喵喵喵喵喵喵", meow: "喵喵喵喵喵喵喵",
}, },
icon: "twemoji--brick.svg", icon: "twemoji--brick.svg",
@@ -142,20 +166,24 @@ export const sites = [
url: import.meta.env.VITE_HUABU, url: import.meta.env.VITE_HUABU,
title: { title: {
"zh-Hans": "白板", "zh-Hans": "白板",
wenyan: "白板",
garbled: "¿拷",
bin: "01",
"zh-Hant": "白板", "zh-Hant": "白板",
en: "Whiteboard", en: "Whiteboard",
ja: "ホワイトボード", ja: "ホワイトボード",
ko: "화이트보드", ko: "화이트보드",
es: "Pizarra",
meow: "喵喵", meow: "喵喵",
}, },
description: { description: {
"zh-Hans": "在线板书", "zh-Hans": "在线板书",
wenyan: "线上板书",
garbled: "¬¿■¿",
bin: "0001",
"zh-Hant": "在線板書", "zh-Hant": "在線板書",
en: "Online whiteboard", en: "Online whiteboard",
ja: "オンライン板書", ja: "オンライン板書",
ko: "온라인 판서", ko: "온라인 판서",
es: "Pizarra en linea",
meow: "喵喵喵喵", meow: "喵喵喵喵",
}, },
icon: "noto--artist-palette.svg", icon: "noto--artist-palette.svg",
@@ -164,20 +192,24 @@ export const sites = [
url: import.meta.env.VITE_PPT, url: import.meta.env.VITE_PPT,
title: { title: {
"zh-Hans": "Python PPT", "zh-Hans": "Python PPT",
wenyan: "蟒语课札",
garbled: "锟¢¥烫拷□锟▧▢è",
bin: "1001011111",
"zh-Hant": "Python PPT", "zh-Hant": "Python PPT",
en: "Python PPT", en: "Python PPT",
ja: "Python PPT", ja: "Python PPT",
ko: "Python PPT", ko: "Python PPT",
es: "Python PPT",
meow: "喵喵喵喵喵喵", meow: "喵喵喵喵喵喵",
}, },
description: { description: {
"zh-Hans": "Python 第一学期上课用", "zh-Hans": "Python 第一学期上课用",
wenyan: "蟒语首学期课用",
garbled: "糊”èå▢噪□¬▦◽烫拷ä¬",
bin: "00000010111011",
"zh-Hant": "Python 第一學期上課用", "zh-Hant": "Python 第一學期上課用",
en: "Python semester 1 materials", en: "Python semester 1 materials",
ja: "Python 1学期授業用", ja: "Python 1学期授業用",
ko: "Python 1학기 수업용", ko: "Python 1학기 수업용",
es: "Materiales de Python del primer semestre",
meow: "喵喵喵喵喵喵喵喵喵喵喵喵喵喵", meow: "喵喵喵喵喵喵喵喵喵喵喵喵喵喵",
}, },
icon: "material-icon-theme--python.svg", icon: "material-icon-theme--python.svg",
@@ -186,20 +218,24 @@ export const sites = [
url: import.meta.env.VITE_PY, url: import.meta.env.VITE_PY,
title: { title: {
"zh-Hans": "Python 项目", "zh-Hans": "Python 项目",
wenyan: "蟒语诸业",
garbled: "▧ç¬ä▧◾”斤糊",
bin: "101110111",
"zh-Hant": "Python 項目", "zh-Hant": "Python 項目",
en: "Python Projects", en: "Python Projects",
ja: "Python プロジェクト", ja: "Python プロジェクト",
ko: "Python 프로젝트", ko: "Python 프로젝트",
es: "Proyectos de Python",
meow: "喵喵喵喵喵喵喵喵", meow: "喵喵喵喵喵喵喵喵",
}, },
description: { description: {
"zh-Hans": "Python 第二学期上课用", "zh-Hans": "Python 第二学期上课用",
wenyan: "蟒语次学期课用",
garbled: "屯▤½¨ååç锟■噪屯屯◼¿",
bin: "11110110110010",
"zh-Hant": "Python 第二學期上課用", "zh-Hant": "Python 第二學期上課用",
en: "Python semester 2 materials", en: "Python semester 2 materials",
ja: "Python 2学期授業用", ja: "Python 2学期授業用",
ko: "Python 2학기 수업용", ko: "Python 2학기 수업용",
es: "Materiales de Python del segundo semestre",
meow: "喵喵喵喵喵喵喵", meow: "喵喵喵喵喵喵喵",
}, },
icon: "material-icon-theme--folder-python-open.svg", icon: "material-icon-theme--folder-python-open.svg",

77
i18n.js
View File

@@ -59,17 +59,41 @@ export const I18N = {
beianIcp: "저장 ICP 2023044109", beianIcp: "저장 ICP 2023044109",
beianMps: "저장 공안 33100402331786", beianMps: "저장 공안 33100402331786",
}, },
es: { wenyan: {
appTitle: "Plataforma de aprendizaje en linea de IoT", appTitle: "物联网专业线上学塾",
pinnedSubtitle: "Fijado", pinnedSubtitle: "置顶",
designThemeLabel: "Tema de diseno", designThemeLabel: "设计之式",
themeToggleLabel: "Cambiar tema", themeToggleLabel: "易其主题",
themeToggleTitle: "Cambiar modo oscuro/claro", themeToggleTitle: "更晦明",
moonAlt: "Luna", moonAlt: "",
sunAlt: "Sol", sunAlt: "",
languageLabel: "Idioma", languageLabel: "语言",
beianIcp: "ICP de Zhejiang 2023044109", beianIcp: "ICP2023044109",
beianMps: "Seguridad publica de Zhejiang 33100402331786", beianMps: "浙公安备33100402331786",
},
garbled: {
appTitle: "糊斤▥烫斤拷▦噪¿ä¢ç”èä",
pinnedSubtitle: "¨¢糊◾¬¿",
designThemeLabel: "¬æ◽ä◾▩",
themeToggleLabel: "ä斤¿è▣拷",
themeToggleTitle: "▥¬糊¬烫è拷ç¿",
moonAlt: "¥æ½",
sunAlt: "¥▤锟",
languageLabel: "¿锟屯",
beianIcp: "å锟æ¨å屯¥◾▨",
beianMps: "¿噪斤ä屯斤½æ”屯ç▩",
},
bin: {
appTitle: "0101010101010101",
pinnedSubtitle: "010101",
designThemeLabel: "0101010101",
themeToggleLabel: "01010101",
themeToggleTitle: "010101010101010101",
moonAlt: "0101",
sunAlt: "1010",
languageLabel: "010101",
beianIcp: "01010101010101010101",
beianMps: "0101010101010101010101",
}, },
meow: { meow: {
appTitle: "喵喵喵喵喵喵喵喵喵喵喵喵", appTitle: "喵喵喵喵喵喵喵喵喵喵喵喵",
@@ -116,11 +140,23 @@ export const DESIGN_THEME_LABELS = {
terminal: "터미널", terminal: "터미널",
cyberpunk: "사이버펑크", cyberpunk: "사이버펑크",
}, },
es: { wenyan: {
fluent: "Fluent", fluent: "流光",
"material-you": "Material You", "material-you": "物材",
terminal: "Terminal", terminal: "终端",
cyberpunk: "Cyberpunk", cyberpunk: "赛博",
},
garbled: {
fluent: "◼è▦",
"material-you": "拷▤屯ä锟◽",
terminal: "¥¬▤▨¿¿",
cyberpunk: "◼çæ¥烫¥",
},
bin: {
fluent: "0101",
"material-you": "010101",
terminal: "01010101",
cyberpunk: "0101010101",
}, },
meow: { meow: {
fluent: "喵喵", fluent: "喵喵",
@@ -136,7 +172,9 @@ export const LANGUAGE_NAMES = {
en: "English", en: "English",
ja: "日本語", ja: "日本語",
ko: "한국어", ko: "한국어",
es: "Espanol", wenyan: "文言文",
garbled: "GBK乱码",
bin: "计算机语",
meow: "喵喵喵", meow: "喵喵喵",
} }
@@ -146,9 +184,7 @@ export const SUPPORTED_LANGUAGES = Object.keys(LANGUAGE_NAMES)
export function getLocalizedText(value, language) { export function getLocalizedText(value, language) {
if (!value) return "" if (!value) return ""
if (typeof value === "object") { if (typeof value === "object") {
return ( return value[language] || value["zh-Hans"]
value[language] || value["zh-Hans"]
)
} }
return value return value
} }
@@ -164,7 +200,6 @@ export function getInitialLanguage() {
} }
if (normalized.startsWith("ja")) return "ja" if (normalized.startsWith("ja")) return "ja"
if (normalized.startsWith("ko")) return "ko" if (normalized.startsWith("ko")) return "ko"
if (normalized.startsWith("es")) return "es"
return "zh-Hans" return "zh-Hans"
} }

View File

@@ -72,8 +72,12 @@
</li> </li>
<li role="option" data-value="ja" aria-selected="false">日本語</li> <li role="option" data-value="ja" aria-selected="false">日本語</li>
<li role="option" data-value="ko" aria-selected="false">한국어</li> <li role="option" data-value="ko" aria-selected="false">한국어</li>
<li role="option" data-value="es" aria-selected="false">Espanol</li>
<li role="option" data-value="en" aria-selected="false">English</li> <li role="option" data-value="en" aria-selected="false">English</li>
<li role="option" data-value="wenyan" aria-selected="false">
文言文
</li>
<li role="option" data-value="garbled" aria-selected="false">GBK</li>
<li role="option" data-value="bin" aria-selected="false">计算机语</li>
<li role="option" data-value="meow" aria-selected="false">喵喵喵</li> <li role="option" data-value="meow" aria-selected="false">喵喵喵</li>
</ul> </ul>
</label> </label>

View File

@@ -3,8 +3,7 @@ import { getLocalizedText } from "./i18n.js"
const renderItem = (site, language) => { const renderItem = (site, language) => {
const title = getLocalizedText(site.title, language) const title = getLocalizedText(site.title, language)
const description = getLocalizedText(site.description, language) const description = getLocalizedText(site.description, language)
const iconName = const iconName = language === "meow" ? "noto--cat-face.svg" : site.icon
language === "meow" ? "noto--cat-face.svg" : site.icon
return ` return `
<a href="${site.url}" target="_blank" class="card"> <a href="${site.url}" target="_blank" class="card">
<div class="title-icon"> <div class="title-icon">