Thinkmill / Thinkmill/keystatic

`locale` only covers 27 strings, so a translated UI comes out half-English

Open
#1,578 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
TypeScript
Stars
2.4k
Forks
159
Avg merge
21h 41m
Merged PRs (30d)
2

Description

Setting locale translates part of the Admin UI, but most of the visible text is hardcoded English in components. The result is an interface that looks broken rather than untranslated — a Brazilian client of mine reads "Salvar" and "Adicionar" next to "Paragraph", "Bold" and "4 entries" on the same screen.

I ran into this shipping two Keystatic Cloud panels to non-technical clients in Brazil, and I'm currently patching the strings locally with pnpm patch (~750 lines against 0.6.4), which obviously doesn't survive upgrades.

What's covered today

src/app/l10n/* has 27 keys, mostly shell chrome: add, cancel, create, save, search, delete, edit, loading, dashboard, collection(s), singleton(s), plus the git/branch vocabulary.

What isn't

An inventory from 0.6.4, grouped by where it lives. Not exhaustive, but it's everything a content editor hits in a normal session:

Editor toolbarsrc/form/fields/markdoc/editor/Toolbar.tsx (and the equivalent in document/DocumentEditor/)
Bold, Italic, Underline, Strikethrough, Code, Superscript, Subscript, Clear formatting, Blockquote, Code block, Image, Table, Divider, Layout, Numbered list, Bullet list, Alt text, Text, Link, Align Start / Align Center / Align End, and the table row/column operations.

Block type menu — same files plus insert-menu.tsx
Paragraph, and `Heading ${level}` built as a template literal, which needs an ICU message rather than a plain key.

Collection and item pagessrc/app/CollectionPage.tsx, src/app/ItemPage.tsx
Empty collection, Create the first entry, No results, Loading Entries, Loading Item, Creating entry, Entry not found., Reset changes, Copy entry, Paste entry, Delete entry, Save and duplicate entry, Saving changes, Unsaved, Changed, Preview, View on GitHub.

Dashboardsrc/app/dashboard/DashboardCards.tsx, src/app/dashboard/DashboardPage.tsx
pluralize(count, { singular: 'entry', plural: 'entries' }) on the collection cards, Hello, {name}!, Manage Account. The pluralize call needs a plural-rule message, not a string swap.

Auth / CloudLog in with Keystatic Cloud, Authenticating, Not found.

Question before any PR

Is this something you want? I'm happy to do the work, but it's a large mechanical change: each string becomes a key plus a JSON file across 34 locales, and I'd rather agree on the shape first than send an unsolicited PR touching hundreds of files.

Specifically:

  1. Scope. Would you take it in slices (toolbar first, then collection/item pages), or not at all?
  2. Untranslated locales. When a new key is added, should the other 33 locales get the English string, or be left absent so the formatter falls back?
  3. Code language names. Bash, CSS, Python etc. in the code block picker should stay as-is — proper nouns. Assuming that's uncontroversial.
  4. Setup screens. The GitHub App setup flow is developer-facing and arguably not worth translating. Skip?

Happy to start with the toolbar as a proof of the approach if that's useful.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reading the existing keys in src/app/l10n/* and the translation usage in src/form/fields/markdoc/editor/Toolbar.tsx and DocumentEditor/. Review the listed CollectionPage.tsx, ItemPage.tsx, and dashboard files to define a first slice and its fallback behavior. Done requires an agreed scope and message shape before adding keys across the locale files.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
localization
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.