|
286 | 286 | const LABELS = { |
287 | 287 | 'ai-cli': 'AI CLI 工具', |
288 | 288 | 'ai-cli-en': 'AI CLI Tools', |
| 289 | + 'ai-cli-vi': 'Công cụ AI CLI', |
289 | 290 | 'ai-agents': 'AI Agents 生态', |
290 | 291 | 'ai-agents-en': 'AI Agents Ecosystem', |
| 292 | + 'ai-agents-vi': 'Hệ sinh thái AI Agents', |
291 | 293 | 'ai-web': 'OpenAI & Anthropic 官网动态', |
292 | 294 | 'ai-web-en': 'OpenAI & Anthropic Updates', |
| 295 | + 'ai-web-vi': 'Cập nhật OpenAI & Anthropic', |
293 | 296 | 'ai-trending': 'GitHub AI 趋势', |
294 | 297 | 'ai-trending-en': 'GitHub AI Trends', |
| 298 | + 'ai-trending-vi': 'Xu hướng AI GitHub', |
295 | 299 | 'ai-hn': 'HN 社区动态', |
296 | 300 | 'ai-hn-en': 'HN Community Digest', |
| 301 | + 'ai-hn-vi': 'Cộng đồng HN', |
297 | 302 | }; |
298 | 303 |
|
299 | 304 | // ── Theme ── |
|
458 | 463 | const list = document.createElement('div'); |
459 | 464 | list.className = 'rpt-list'; |
460 | 465 |
|
461 | | - // Filter out -en reports from base list, process as pairs |
462 | | - const baseReports = reports.filter(r => !r.endsWith('-en')); |
| 466 | + // Filter out -en and -vi reports from base list, process as groups |
| 467 | + const baseReports = reports.filter(r => !r.endsWith('-en') && !r.endsWith('-vi')); |
463 | 468 | baseReports.forEach(r => { |
464 | 469 | const enKey = r + '-en'; |
| 470 | + const viKey = r + '-vi'; |
465 | 471 | const hasEn = reports.includes(enKey); |
| 472 | + const hasVi = reports.includes(viKey); |
466 | 473 |
|
467 | | - if (hasEn) { |
468 | | - // Render as a row with label + [ZH][EN] buttons |
| 474 | + if (hasEn || hasVi) { |
| 475 | + // Render as a row with label + language buttons |
469 | 476 | const row = document.createElement('div'); |
470 | 477 | row.className = 'rpt-row'; |
471 | 478 |
|
|
483 | 490 | zhBtn.dataset.key = `${date}/${r}`; |
484 | 491 | zhBtn.textContent = 'ZH'; |
485 | 492 | zhBtn.onclick = () => loadReport(date, r); |
| 493 | + btns.append(zhBtn); |
| 494 | + |
| 495 | + if (hasEn) { |
| 496 | + const enBtn = document.createElement('button'); |
| 497 | + enBtn.className = 'lang-btn'; |
| 498 | + enBtn.dataset.key = `${date}/${enKey}`; |
| 499 | + enBtn.textContent = 'EN'; |
| 500 | + enBtn.onclick = () => loadReport(date, enKey); |
| 501 | + btns.append(enBtn); |
| 502 | + } |
| 503 | + |
| 504 | + if (hasVi) { |
| 505 | + const viBtn = document.createElement('button'); |
| 506 | + viBtn.className = 'lang-btn'; |
| 507 | + viBtn.dataset.key = `${date}/${viKey}`; |
| 508 | + viBtn.textContent = 'VI'; |
| 509 | + viBtn.onclick = () => loadReport(date, viKey); |
| 510 | + btns.append(viBtn); |
| 511 | + } |
486 | 512 |
|
487 | | - const enBtn = document.createElement('button'); |
488 | | - enBtn.className = 'lang-btn'; |
489 | | - enBtn.dataset.key = `${date}/${enKey}`; |
490 | | - enBtn.textContent = 'EN'; |
491 | | - enBtn.onclick = () => loadReport(date, enKey); |
492 | | - |
493 | | - btns.append(zhBtn, enBtn); |
494 | 513 | row.append(label, btns); |
495 | 514 | list.appendChild(row); |
496 | 515 | } else { |
497 | | - // No EN variant — render as current single button |
| 516 | + // No variants — render as single button |
498 | 517 | const btn = document.createElement('button'); |
499 | 518 | btn.className = 'rpt-btn'; |
500 | 519 | btn.dataset.key = `${date}/${r}`; |
|
0 commit comments