Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# Changelog

## 2026-04-30

- Add internationalization (i18n) infrastructure with English (default) and Korean (ν•œκ΅­μ–΄) bundled
- Add language picker (🌐) in the header β€” choice persists via URL `?lang=` and `localStorage`; first-visit auto-detection from `navigator.languages`
- Add hover tooltips with plain-language explanations for every stat card, chart title, and column header (what each metric means, including the cache-read discount and cache-creation premium)
- Add tests that fail the build if any locale drifts from the English key set or the LOCALES picker registry

## 2026-04-09

- Fix token counts inflated ~2x by deduplicating streaming events that share the same message ID
Expand Down
23 changes: 23 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,29 @@ Claude Code writes one JSONL file per session to `~/.claude/projects/`. Each lin

---

## Internationalization

The dashboard ships English by default and can be switched to other languages from the 🌐 picker in the header. The chosen language is remembered in `localStorage` and reflected in the URL (`?lang=ko`); on first visit the app reads `navigator.languages` and uses the first match.

Currently bundled locales:

- `en` β€” English
- `ko` β€” ν•œκ΅­μ–΄ (Korean)

Hover any metric, chart title, or column header to see an in-context explanation of what it represents (e.g. *Cache Read* explains the 90% discount over fresh input tokens).

### Adding a new language

All translations live in a single `MESSAGES` object inside `dashboard.py`. To add a locale:

1. Copy the `en: { ... }` block, rename the key (e.g. `de: { ... }`), and translate each value. Keep the keys identical to English.
2. Add a display name to the `LOCALES` registry: `de: 'Deutsch',`.
3. Run `python -m unittest tests.test_dashboard.TestI18n` β€” it verifies key parity, registry/catalog consistency, and that no value is empty.

CSV exports stay in English on purpose so spreadsheets and downstream pipelines see stable column names.

---

## Cost estimates

Costs are calculated using **Anthropic API pricing as of April 2026** ([claude.com/pricing#api](https://claude.com/pricing#api)).
Expand Down
Loading