### Environment- Zotero version: 9.0.6 (ARM64) - Operating system: macOS 26.5.2 - Profile: default- This bug is reproducible without any extensions enabled (in safe mode) ### Description Two built-in context menu items in `zotero-itemmenu` are rendered as **empty entries** (blank rows) in the right-click context menu. Both items have empty `` elements with no visible text content. Affected menu items (defined in `chrome/content/zotero/zoteroPane.xhtml`): 1. **`zotero-menuitem-create-note-from-annotations`** — should appear when right-clicking attachments with annotations, but renders as a blank row. 2. **`zotero-menuitem-duplicate-and-convert`** — should appear when right-clicking a `book` or `bookSection` item; the corresponding `oncommand` handler `duplicateAndConvertSelectedItem` throws an error when invoked on other item types. Both `` elements have empty ` ` children (no `label` attribute and no `data-l10n-id` attribute pointing to localization strings). ### Steps to Reproduce**Step 1: Diagnose the empty entries** Open `Tools → Developer → Run JavaScript`, paste the following, and run: ```javascript const pane = Zotero.getActiveZoteroPane(); let items = pane.getSelectedItems(); if (!items.length) { const all = Zotero.Items.getAll(); const nonBook = all.find( (i) => i.itemType !== 'book' && i.itemType !== 'bookSection' ); if (nonBook) pane.selectItem(nonBook.id); } const popup = document.getElementById('zotero-itemmenu'); if (!popup) return { error: 'popup not found' }; popup.dispatchEvent( new Event('popupshowing', { bubbles: false, cancelable: true }) ); const dump = []; for (let i = 0; i < popup.children.length; i++) { const el = popup.children[i]; dump.push({ idx: i, tag: el.tagName, id: el.id || '', label: el.getAttribute('label') || '', cls: (el.getAttribute('class') || '').slice(0, 60), hidden: el.hidden, }); } const empties = dump.filter( (s) => s.tag === 'menuitem' && !s.label.trim() ); return { selectedItemTypes: items.map((i) => i.itemType), popupChildrenCount: dump.length, emptyItemsCount: empties.length, empties: empties, emptyOuterHTML: empties.map((e) => popup.children[e.idx].outerHTML), }; Observed output (when an attachment is selected): { "selectedItemTypes": ["attachment"], "popupChildrenCount": 48, "emptyItemsCount": 2, "empties": [ { "idx": 8, "tag": "menuitem", "id": "", "label": "", "cls": "menuitem-iconic zotero-menuitem-create-note-from-annotations", "hidden": false }, { "idx": 17, "tag": "menuitem", "id": "", "label": "", "cls": "menuitem-iconic zotero-menuitem-duplicate-and-convert", "hidden": true } ], "emptyOuterHTML": [ " ", " " ] } Step 2: Visual confirmation 1. Right-click any item in your library that is an attachment (or contains attachments). 2. Observe a blank row appearing in the context menu. 3. Click the blank row — depending on the item type, you may see the following error in the Browser Console (Tools → Developer → JavaScript Console): Uncaught (in promise) Error: duplicateAndConvertSelectedItem requires a single book or bookSection to be selected duplicateAndConvertSelectedItem chrome://zotero/content/zoteroPane.js:2153 oncommand chrome://zotero/content/zoteroPane.xhtml:1 Expected BehaviorThe two menu items should display their proper labels (e.g., "Create Note from Annotations", "Duplicate and Convert Item"), or be hidden (hidden="true") when not applicable to the selected item type. Actual Behavior Both menu items appear as empty rows. Their elements contain no text content and have no label attribute or data-l10n-id attribute to provide one. Likely Cause The two elements in zoteroPane.xhtml are missing either: - A label attribute, or - A data-l10n-id attribute referencing the appropriate localization key in chrome/locale/en-US/zotero/zotero.ftl. This appears to be a regression introduced in Zotero 9.0.6 when the two new context-menu features were added (related to PR #2799 for duplicateAndConvertSelectedItem). Suggested Fix Add the missing data-l10n-id (or label) attributes to both elements in chrome/content/zotero/zoteroPane.xhtml, e.g.: …and add the corresponding localization keys in chrome/locale/en-US/zotero/zotero.ftl. Workaround Until the bug is fixed, the empty entries can be hidden by running the following code once per Zotero session via Tools → Developer → Run JavaScript: const ids = [ 'zotero-menuitem-create-note-from-annotations', 'zotero-menuitem-duplicate-and-convert', ]; ids.forEach((id) => { const el = document.getElementById(id); if (el) el.hidden = true; }); return 'Empty menu items hidden'; Related - PR #2799 (duplicateAndConvertSelectedItem: Don't copy abstracts) — introduced the duplicateAndConvertSelectedItem feature. - Browser Console error stack: chrome://zotero/content/zoteroPane.js:2153 and chrome://zotero/content/zoteroPane.xhtml:1.