From 0ba02a1278b7596957910afeb79a6392defd6802 Mon Sep 17 00:00:00 2001 From: peijunlei Date: Mon, 7 Sep 2026 15:00:06 +0800 Subject: [PATCH] feat(i18n): bilingual earth marker city names Co-authored-by: Cursor --- public/themes/dist_static/static/js/earth.js | 136 ++++++++++++++++++--------- 1 file changed, 91 insertions(+), 45 deletions(-) diff --git a/public/themes/dist_static/static/js/earth.js b/public/themes/dist_static/static/js/earth.js index db0067a..ceb86d6 100644 --- a/public/themes/dist_static/static/js/earth.js +++ b/public/themes/dist_static/static/js/earth.js @@ -6,6 +6,11 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 //#endregion //#region js/earth.js (function() { + const getUiLang = window.getUiLang || (() => (location.pathname.split("/")[1] === "en" ? "en" : "zh")); + const t = window.t || ((k) => k); + function markerName(data) { + return getUiLang() === "en" ? (data.nameEn || data.nameZh) : (data.nameZh || data.nameEn); + } const canvas = document.getElementById("earth-canvas"); if (!canvas || !window.THREE) return; const container = canvas.parentElement; @@ -56,207 +61,248 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 scene.add(earth); const markersData = [ { - name: "上海", + nameZh: "上海", + nameEn: "Shanghai", lat: 31.2304, lon: 121.4737 }, { - name: "东京", + nameZh: "东京", + nameEn: "Tokyo", lat: 35.6762, lon: 139.6503 }, { - name: "伊斯坦布尔", + nameZh: "伊斯坦布尔", + nameEn: "Istanbul", lat: 41.0082, lon: 28.9784 }, { - name: "伦敦", + nameZh: "伦敦", + nameEn: "London", lat: 51.5074, lon: -.1278 }, { - name: "加尔各答", + nameZh: "加尔各答", + nameEn: "Kolkata", lat: 22.5726, lon: 88.3639 }, { - name: "北京", + nameZh: "北京", + nameEn: "Beijing", lat: 39.9042, lon: 116.4074 }, { - name: "华沙", + nameZh: "华沙", + nameEn: "Warsaw", lat: 52.2297, lon: 21.0122 }, { - name: "南京", + nameZh: "南京", + nameEn: "Nanjing", lat: 32.0603, lon: 118.7969 }, { - name: "吉隆坡", + nameZh: "吉隆坡", + nameEn: "Kuala Lumpur", lat: 3.139, lon: 101.6869 }, { - name: "圣保罗", + nameZh: "圣保罗", + nameEn: "São Paulo", lat: -23.5505, lon: -46.6333 }, { - name: "圣安东尼奥", + nameZh: "圣安东尼奥", + nameEn: "San Antonio", lat: 29.4241, lon: -98.4936 }, { - name: "墨西哥城", + nameZh: "墨西哥城", + nameEn: "Mexico City", lat: 19.4326, lon: -99.1332 }, { - name: "多伦多", + nameZh: "多伦多", + nameEn: "Toronto", lat: 43.6532, lon: -79.3832 }, { - name: "奥克兰", + nameZh: "奥克兰", + nameEn: "Auckland", lat: -36.8485, lon: 174.7633 }, { - name: "孟买", + nameZh: "孟买", + nameEn: "Mumbai", lat: 19.076, lon: 72.8777 }, { - name: "安地比斯", + nameZh: "安地比斯", + nameEn: "Antibes", lat: 43.5804, lon: 7.1251 }, { - name: "山景城", + nameZh: "山景城", + nameEn: "Mountain View", lat: 37.3861, lon: -122.0839 }, { - name: "巴黎", + nameZh: "巴黎", + nameEn: "Paris", lat: 48.8566, lon: 2.3522 }, { - name: "布宜诺斯艾利斯", + nameZh: "布宜诺斯艾利斯", + nameEn: "Buenos Aires", lat: -34.6037, lon: -58.3816 }, { - name: "开普敦", + nameZh: "开普敦", + nameEn: "Cape Town", lat: -33.9249, lon: 18.4241 }, { - name: "悉尼", + nameZh: "悉尼", + nameEn: "Sydney", lat: -33.8688, lon: 151.2093 }, { - name: "新加坡", + nameZh: "新加坡", + nameEn: "Singapore", lat: 1.3521, lon: 103.8198 }, { - name: "新德里", + nameZh: "新德里", + nameEn: "New Delhi", lat: 28.6139, lon: 77.209 }, { - name: "曼谷", + nameZh: "曼谷", + nameEn: "Bangkok", lat: 13.7563, lon: 100.5018 }, { - name: "法兰克福", + nameZh: "法兰克福", + nameEn: "Frankfurt", lat: 50.1109, lon: 8.6821 }, { - name: "波哥大", + nameZh: "波哥大", + nameEn: "Bogotá", lat: 4.711, lon: -74.0721 }, { - name: "深圳", + nameZh: "深圳", + nameEn: "Shenzhen", lat: 22.5431, lon: 114.0579 }, { - name: "牛津", + nameZh: "牛津", + nameEn: "Oxford", lat: 51.752, lon: -1.2577 }, { - name: "特拉维夫", + nameZh: "特拉维夫", + nameEn: "Tel Aviv", lat: 32.0853, lon: 34.7818 }, { - name: "科伦坡", + nameZh: "科伦坡", + nameEn: "Colombo", lat: 6.9271, lon: 79.8612 }, { - name: "米兰", + nameZh: "米兰", + nameEn: "Milan", lat: 45.4642, lon: 9.19 }, { - name: "纽约", + nameZh: "纽约", + nameEn: "New York", lat: 40.7128, lon: -74.006 }, { - name: "莫斯科", + nameZh: "莫斯科", + nameEn: "Moscow", lat: 55.7558, lon: 37.6173 }, { - name: "达卡", + nameZh: "达卡", + nameEn: "Dhaka", lat: 23.8103, lon: 90.4125 }, { - name: "迪拜", + nameZh: "迪拜", + nameEn: "Dubai", lat: 25.2048, lon: 55.2708 }, { - name: "邦加罗尔", + nameZh: "邦加罗尔", + nameEn: "Bengaluru", lat: 12.9716, lon: 77.5946 }, { - name: "金奈", + nameZh: "金奈", + nameEn: "Chennai", lat: 13.0827, lon: 80.2707 }, { - name: "雅加达", + nameZh: "雅加达", + nameEn: "Jakarta", lat: -6.2088, lon: 106.8456 }, { - name: "首尔", + nameZh: "首尔", + nameEn: "Seoul", lat: 37.5665, lon: 126.978 }, { - name: "香港", + nameZh: "香港", + nameEn: "Hong Kong", lat: 22.3193, lon: 114.1694 }, { - name: "全球总部福州", + nameZh: "全球总部福州", + nameEn: "Global HQ Fuzhou", lat: 26.0745, lon: 119.2965 } @@ -295,7 +341,7 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 markersData.forEach((data) => { const position = latLonToVector3(data.lat, data.lon, .5); let marker; - if (data.name === "全球总部福州") { + if (data.nameZh === "全球总部福州") { marker = new THREE.Mesh(fuzhouMarkerGeometry, fuzhouMarkerMaterial); fuzhouMarkerMesh = marker; } else marker = new THREE.Mesh(defaultMarkerGeometry, defaultMarkerMaterial); @@ -303,7 +349,7 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 const normal = position.clone().normalize(); marker.position.add(normal.multiplyScalar(.01)); marker.renderOrder = 1; - marker.userData = { name: data.name }; + marker.userData = { name: markerName(data), nameZh: data.nameZh }; earth.add(marker); markerMeshes.push(marker); }); @@ -325,7 +371,7 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 tooltip.classList.add("tooltip-arrow"); container.appendChild(tooltip); const fuzhouTooltip = tooltip.cloneNode(true); - fuzhouTooltip.innerHTML = "全球总部
福州"; + fuzhouTooltip.innerHTML = t("earth.hq_fuzhou_html"); container.appendChild(fuzhouTooltip); const raycaster = new THREE.Raycaster(); const mouse = new THREE.Vector2(); @@ -338,7 +384,7 @@ var location_default = "data:image/svg+xml,%3csvg%20viewBox='0%200%2030%2041.184 if (intersects.length > 0) { const object = intersects[0].object; const name = object.userData.name; - if (name !== "全球总部福州") { + if (object.userData.nameZh !== "全球总部福州") { tooltip.textContent = name; tooltip.style.display = "block"; const vector = object.position.clone();