Skip to content

feat: add KeyNamePlugin for msgctxt separator chip#8

Merged
Anty0 merged 1 commit into
mainfrom
jirikuchynka/po-msgctxt-v2
May 27, 2026
Merged

feat: add KeyNamePlugin for msgctxt separator chip#8
Anty0 merged 1 commit into
mainfrom
jirikuchynka/po-msgctxt-v2

Conversation

@Anty0
Copy link
Copy Markdown
Member

@Anty0 Anty0 commented May 26, 2026

Summary

  • Adds KeyNamePlugin — a CodeMirror plugin that decorates the first U+0004 occurrence in a key name with an atomic widget rendering the preceding text as a styled chip.
  • Adds generateKeyNameStyle — emotion-styled wrapper mirroring generatePlaceholdersStyle so the same chip visual works inside the editor and in plain HTML.
  • Exports PO_MSGCTXT_KEY_SEPARATOR constant so consumers don't have to hardcode `\�`.
  • Used by the tolgee-platform webapp (new mode="keyName") and the read-only <KeyName> component.

Companion PRs

Adds a CodeMirror plugin and styled wrapper that render the
\u0004 separator used by Tolgee to encode gettext msgctxt
in front of msgid inside key names. Exports the plugin, the
separator constant, and a generateKeyNameStyle helper so the
same chip visual is reused by read-only key name displays
in tolgee-platform and tolgee-js.
@Anty0 Anty0 merged commit 06266ec into main May 27, 2026
2 checks passed
Anty0 added a commit to tolgee/tolgee-js that referenced this pull request May 27, 2026
## Summary
- The in-context **KeyDialog** and the **ScreenshotWithLabels** tooltip
now use a new `<KeyName>` component that splits the key name on the
U+0004 separator (set by tolgee-platform when importing gettext `.po`
files with a `msgctxt`) and renders the `msgctxt` portion as a styled
chip in front of the `msgid`.
- Standalone implementation — no runtime dependency on
`@tginternal/editor` to keep this package's bundle independent of
release coordination.
- The platform-side change introducing the separator and the matching
chip visual lives in the companion tolgee-platform PR.

## Companion PRs
- tolgee-platform: tolgee/tolgee-platform#3694
- editor: tolgee/editor#8
- documentation: tolgee/documentation#1111

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added improved key name rendering with enhanced formatting that
visually distinguishes embedded metadata using dedicated styling
* Updated the UI across dialogs and tooltips to consistently leverage
the new key name display, improving visual clarity and presentation when
viewing keys with associated metadata

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/tolgee/tolgee-js/pull/3523?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 -->
github-actions Bot pushed a commit that referenced this pull request May 27, 2026
# [1.17.0](v1.16.1...v1.17.0) (2026-05-27)

### Features

* add KeyNamePlugin for msgctxt separator chip ([#8](#8)) ([06266ec](06266ec))
JanCizmar pushed a commit to tolgee/tolgee-platform that referenced this pull request Jun 3, 2026
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 -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](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>
Anty0 added a commit to tolgee/documentation that referenced this pull request Jun 3, 2026
## 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants