JWT decoder & Cron redesign + translation sweep
This update redesigns the JWT decoder and Cron tools, completes their missing translations, and closes out a batch of backlog cleanup items.
JWT decoder
The decoder previously fell back to Chinese on every non-Chinese page. Its translation keys were missing entirely, so we filled in all 24 tool.jwt.* keys across English, Japanese, and Vietnamese.
While in there we also refreshed the UI:
- A clearer three-part breakdown (header / payload / signature) with a security banner.
- Standard claims (issuer, audience, expiration, etc.) are now humanized instead of raw epoch timestamps.
- An explicit "expired" badge for past-due tokens.
- A responsive JSON card, a sample token button, and localized copy / error messages.
Cron tool
The Cron page got a visual refresh: the five expression fields are now clean grid cards, the syntax reference table is generated from a single source with theme-aware borders, and the hardcoded hex colors were replaced with Semi theme variables so both light and dark modes look right.
The English, Japanese, and Vietnamese docs were also missing the FAQ block, which has now been added.
More translations
- Emoji icon generator: the emoji picker now follows the active language (it was hardcoded to Chinese), and its translation keys were filled in.
- Vintage photo: the filter presets are now localized instead of being fixed at module level.
- Cron presets: added the missing Vietnamese preset labels.
Bug fixes & cleanup
- Fixed a duplicate
colorstyle in the XML formatter. - Removed the orphan
/tools/*pages (base64, basic-auth, json-formatter, timestamp) that duplicated the/docs/*tool pages. - Removed the legacy
copyToClipboardalias after migrating all callers tocopyText. - Tightened the tool-page detection so non-tool docs (like the intro page) no longer land in "recently used".
- Cleaned up
robots.txt, removed theconsole.errormonkey-patch, made the domain guard skip embedded iframes, and taught the tool generator to pick up.mdfiles.
As always, if you spot any remaining untranslated text, let us know in the comments below.
