* Add i18n framework with next-intl for 19 languages
Set up complete internationalization infrastructure:
- Install next-intl v4 with App Router support
- Create i18n config (routing, request, navigation)
- Add middleware for automatic locale detection from Accept-Language
- Restructure all routes under app/[locale]/
- Extract UI strings to messages/en.json
- Update all components to use useTranslations()
- Add language switcher dropdown in footer
- Support RTL for Arabic and Khmer
- Update sitemap with locale alternates
- Add generateStaticParams for all 19 locales
Languages: en, ja, zh-CN, zh-TW, ko, de, es, fr, it, da, pl, ru, bs, ar, no, pt-BR, th, tr, km
Locale detection: auto-detect from browser Accept-Language header,
with cookie persistence and locale prefix only for non-default (en).
* Add translations for de, fr, it, ja, zh-CN, zh-TW
* Add translations for ar, bs, da, es, km, no, pl, pt-BR, ru, th, tr
* Convert docs and legal pages to use useTranslations()
* Add i18n to keyboard shortcuts component
* Add i18n to wall-of-love, add missing blog posts to sitemap
* Add keyboard shortcuts and wallOfLove translations to all locales
* Update bun lockfile for next-intl dependency
* Fix t.rich() configPath: pass ReactNode not function for {var} interpolation
* Fix configPath: use rich text tag instead of plain interpolation for ReactNode
* Fix t.rich() interpolation: use rich text tags for all ReactNode placeholders
Changed {legacy}, {openShortcut}, {jumpShortcut} from plain variable
interpolation to <tag>content</tag> format so t.rich() gets proper
functions instead of values.
* Escape ICU curly braces in socketCallout rich text across all locales
* Fix i18n issues: Khmer RTL, zh-CN quality, locale-aware testimonials, hardcoded strings
- Fix Khmer (km) incorrectly marked as RTL (it's LTR, only Arabic is RTL)
- Fix zh-CN/zh-TW taglinePrefix to mention terminals and open source
- Add locale-aware testimonial translations: show original text, translate
for non-matching locales, skip translation when locale matches original
- Translate hardcoded English table content in notifications page
- Add testimonial translations to all 19 locale files
- Remove unused setRequestLocale import and params from home page
* Address PR review comments: metadata localization, blog fixes, legal pages, accessibility
- Convert hardcoded metadata to generateMetadata with getTranslations on all docs, blog, community, and wall-of-love pages
- Fix blog canonical/OG URLs to be locale-aware
- Fix introducing-cmux .split(": ") by using separate label/desc translation keys
- Revert legal page titles to English (legal content stays English-only)
- Add focus-visible ring to language switcher for keyboard accessibility
- Preserve query string and hash when switching locale
- Convert site-footer to server component (remove unnecessary "use client")
- Remove .toLowerCase() on translated text in community page
- Add /docs/browser-automation and /wall-of-love to sitemap
- Fix keyboard-shortcuts jump link visibility with trimmed query
- Deduplicate blogSlugs by importing from blog-posts.ts
- Add typingCodingAgents/typingMultitasking translation keys to all locales
- Fix Spanish accent/tilde issues in es.json testimonials
- Fix nested <a> tag in homepage keyboard shortcuts feature
- Remove unused setRequestLocale import from homepage
* Convert remaining layout/index metadata to generateMetadata
- Root layout: locale-aware title, description, OG, and Twitter card metadata
- Docs layout: translated title template
- Blog layout: translated title template
- Blog index: locale-aware metadata
* Add translated metadata keys to all locales, fix docs redirect
- Add meta.title/description/ogDescription to all 18 non-English locales
- Add docs.layoutTitle, blog.layoutTitle/metaTitle/metaDescription to all locales
- Add blog post metadata (zenOfCmux, cmdShiftU, showHnLaunch, introducingCmux) to all locales
- Add community.metaTitle/metaDescription to all locales
- Fix docs index redirect to preserve locale prefix
* Add translated docs page metaTitle keys to all locales
137 lines
5.7 KiB
TypeScript
137 lines
5.7 KiB
TypeScript
/**
|
||
* Supplementary media and narrative for changelog versions.
|
||
*
|
||
* CHANGELOG.md remains the source of truth for the raw list of changes.
|
||
* This file adds titles, feature highlights, and narrative descriptions
|
||
* for major releases. Versions not listed here render as plain bullet lists.
|
||
*
|
||
* Images live in public/changelog/ and should be 2x (e.g. 1600×900 for a
|
||
* 800px display width). Use PNG for UI screenshots, WebP for photos.
|
||
*/
|
||
|
||
export interface FeatureHighlight {
|
||
title: string;
|
||
description: string;
|
||
/** Path relative to /public, e.g. "/changelog/0.61.0-command-palette.png" */
|
||
image?: string;
|
||
}
|
||
|
||
export interface VersionMedia {
|
||
/** Big title shown as a heading, summarizing the main features. */
|
||
title: string;
|
||
/** Hero image shown at the top of the version entry. */
|
||
hero?: string;
|
||
/** Feature highlights shown inline below the title. */
|
||
features?: FeatureHighlight[];
|
||
}
|
||
|
||
export const changelogMedia: Record<string, VersionMedia> = {
|
||
"0.62.0": {
|
||
title: "Markdown Viewer, Browser Find, Vi Copy Mode, and Localization",
|
||
features: [
|
||
{
|
||
title: "Markdown Viewer",
|
||
description:
|
||
"Open Markdown files in their own panel and keep them live with file watching. Notes, READMEs, and docs refresh automatically as the file changes on disk.",
|
||
},
|
||
{
|
||
title: "Find in Browser",
|
||
description:
|
||
"Browser panels now support Cmd+F with inline find controls, so you can search long docs, dashboards, and issue threads without leaving cmux.",
|
||
},
|
||
{
|
||
title: "Vi Copy Mode",
|
||
description:
|
||
"Terminal scrollback now has a keyboard copy mode with vi-style navigation, making it much easier to inspect and copy from large output buffers.",
|
||
},
|
||
{
|
||
title: "Custom Notification Sounds",
|
||
description:
|
||
"Choose from bundled sounds or pick your own audio file so background task notifications are easier to notice and easier to personalize.",
|
||
},
|
||
{
|
||
title: "Expanded Localization",
|
||
description:
|
||
"cmux now includes Japanese plus 16 additional languages, and a per-app language override lets you change the UI language without changing macOS system settings.",
|
||
},
|
||
],
|
||
},
|
||
"0.61.0": {
|
||
title: "Tab Colors, Command Palette, Pin Workspaces",
|
||
features: [
|
||
{
|
||
title: "Tab Colors",
|
||
description:
|
||
"Right-click any workspace in the sidebar to assign it a color. There are 17 presets to choose from, or pick a custom color. Colors show on the tab itself and on the workspace indicator rail.",
|
||
image: "/changelog/0.61.0-tab-colors.png",
|
||
},
|
||
{
|
||
title: "Command Palette",
|
||
description:
|
||
"Hit Cmd+Shift+P to open a searchable command palette. Every action in cmux is here: creating workspaces, toggling the sidebar, checking for updates, switching windows. Keyboard shortcuts are shown inline so you can learn them as you go.",
|
||
image: "/changelog/0.61.0-command-palette.png",
|
||
},
|
||
{
|
||
title: "Open With",
|
||
description:
|
||
"You can now open your current directory in VS Code, Cursor, Zed, Xcode, Finder, or any other editor directly from the command palette. Type \"open\" and pick your editor.",
|
||
image: "/changelog/0.61.0-open-with.png",
|
||
},
|
||
{
|
||
title: "Pin Workspaces",
|
||
description:
|
||
"Pin a workspace to keep it at the top of the sidebar. Pinned workspaces stay put when other workspaces reorder from notifications or activity.",
|
||
image: "/changelog/0.61.0-pin-workspace.png",
|
||
},
|
||
{
|
||
title: "Workspace Metadata",
|
||
description:
|
||
"The sidebar now shows richer context for each workspace: PR links that open in the browser, listening ports, git branches, and working directories across all panes.",
|
||
image: "/changelog/0.61.0-workspace-metadata.png",
|
||
},
|
||
],
|
||
},
|
||
"0.60.0": {
|
||
title: "Tab Context Menu, DevTools, Notification Rings, CJK Input",
|
||
features: [
|
||
{
|
||
title: "Tab Context Menu",
|
||
description:
|
||
"Right-click any tab in a pane to rename it, close tabs to the left or right, move it to another pane, or create a new terminal or browser tab next to it. You can also zoom a pane to full size and mark tabs as unread.",
|
||
image: "/changelog/0.60.0-tab-context-menu.png",
|
||
},
|
||
{
|
||
title: "Browser DevTools",
|
||
description:
|
||
"The embedded browser now has full WebKit DevTools. Open them with the standard shortcut and they persist across tab switches. Inspect elements, debug JavaScript, and monitor network requests without leaving cmux.",
|
||
image: "/changelog/0.60.0-devtools.png",
|
||
},
|
||
{
|
||
title: "Notification Rings",
|
||
description:
|
||
"When a background process sends a notification (like a long build finishing), the terminal pane shows an animated ring so you can spot it at a glance without switching workspaces.",
|
||
},
|
||
{
|
||
title: "CJK Input",
|
||
description:
|
||
"Full IME support for Korean, Chinese, and Japanese. Preedit text renders inline with proper anchoring and sizing, so composing characters works the way you'd expect.",
|
||
image: "/changelog/0.60.0-cjk-input.png",
|
||
},
|
||
{
|
||
title: "Claude Code",
|
||
description:
|
||
"Claude Code integration is now enabled by default. Each workspace gets its own routing context, and agents can read terminal screen contents via the API.",
|
||
},
|
||
],
|
||
},
|
||
"0.32.0": {
|
||
title: "Sidebar Metadata",
|
||
features: [
|
||
{
|
||
title: "Sidebar Metadata",
|
||
description:
|
||
"The sidebar now displays git branch, listening ports, log entries, progress bars, and status pills for each workspace.",
|
||
},
|
||
],
|
||
},
|
||
};
|