feat: render msgctxt chip in key dialog - #3523
Conversation
When tolgee-platform encodes a gettext msgctxt in a key name using the U+0004 separator, render the msgctxt portion as a styled chip in front of the msgid inside the in-context KeyDialog and screenshot label tooltips, matching the visual used on the Tolgee platform side.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
WalkthroughA new ChangesKeyName component and integration
Estimated code review effort🎯 2 (Simple) | ⏱️ ~8 minutes Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Supersedes #3459 Fixes #3053 ## Summary - **Import:** the PO parser now captures the optional `msgctxt` field. On import, Tolgee stores the pair `(msgctxt, msgid)` as a single key name using the U+0004 EOT separator — the same convention GNU Gettext uses internally in MO files — so two entries with the same `msgid` but different `msgctxt` remain distinct keys. - **Export:** the PO exporter splits the key name on U+0004 and writes the `msgctxt` line back before `msgid`. Plural fallback now uses the split `msgid` instead of the raw key name. - **Parser cleanup:** header detection now requires both `msgid` and `msgctxt` to be empty, so a malformed msgctxt-only entry can't be misread as the header block. The legacy `PO_MSGCTXT_NOT_SUPPORTED` file issue is no longer emitted (the enum value stays in place for back-compat with previously stored issues). - **UI display:** a new `<KeyName>` component renders the `msgctxt` portion as a styled chip in front of the `msgid` across all key-name display sites (translations grid, simple/list view, single-key page breadcrumb, activity log, import dialogs, translation-memory rows and tooltips, branching/merge header, screenshot label tooltips). The window title intentionally still shows the raw key — the chip cannot render in a `document.title` string. - **UI edit:** the `<Editor>` component gains a `keyName` mode that wires a new CodeMirror plugin (`KeyNamePlugin` from `@tginternal/editor`) decorating the U+0004 with an atomic widget. Display and edit are now visually identical — the previous substitution-based workaround (`keyNameForEditing`/`keyNameFromEdited` + `␄` visible-char) is removed. - **Vite config:** added `@codemirror/state`, `@codemirror/view`, `@codemirror/lint` to `resolve.dedupe` to avoid the "multiple instances of @codemirror/state" runtime error introduced when `preserveSymlinks: true` is combined with the linked `@tginternal/editor` worktree. ## Notes - Re-importing a `.po` file that was imported before this change (when msgctxt was silently dropped) will create new keys for the `(msgctxt, msgid)` pairs instead of updating the existing `msgid`-only keys. Accepted breakage — most users import once. - An empty `msgctxt ""` collapses to a plain key without a chip, matching gettext semantics. ## Companion PRs - editor: tolgee/editor#8 - tolgee-js: tolgee/tolgee-js#3523 - documentation: tolgee/documentation#1111 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Full PO msgctxt support: import/export preserves and uses context to disambiguate identical strings. * Key display shows visual context indicators with a tooltip linking to docs via a new KeyName component. * Key editor gains a new "keyName" mode for viewing/editing keys with context. * Import ignores stray context-only entries to avoid header mis-parsing. * **Tests** * Added unit and end-to-end tests for msgctxt parsing, escaping, import/export, fixtures and UI behavior. * **Chores** * Editor package updated. <!-- review_stack_entry_start --> [](https://app.coderabbit.ai/change-stack/tolgee/tolgee-platform/pull/3694?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
## Summary - Adds a new **msgctxt and key names** section to `platform/formats/po.mdx` explaining how Tolgee encodes the gettext `msgctxt` field into key names using the U+0004 separator. - Includes an example, a description of the UI chip rendering, and a link to the GNU Gettext documentation on contexts. - Mentions `msgctxt` in the existing Feature support paragraph. ## Companion PRs - tolgee-platform: tolgee/tolgee-platform#3694 - tolgee-js: tolgee/tolgee-js#3523 - editor: tolgee/editor#8
Summary
<KeyName>component that splits the key name on the U+0004 separator (set by tolgee-platform when importing gettext.pofiles with amsgctxt) and renders themsgctxtportion as a styled chip in front of themsgid.@tginternal/editorto keep this package's bundle independent of release coordination.Companion PRs
Summary by CodeRabbit