From d35434b6d6b5f7f846568bbfade13316ee8aa125 Mon Sep 17 00:00:00 2001 From: Phantom Date: Mon, 8 Dec 2025 11:38:19 +0800 Subject: [PATCH] feat: improve ImageViewer context menu UX (#11547) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reorder menu items to prioritize "Copy as Image" as the first action - Rename "Copy" to "Copy Image Source" for better clarity - Remove unused ImageIcon import - Add i18n support for "preview.copy.src" across all locales This change improves the user experience by making the most common action (copy image) the first option in the context menu, while also clarifying what each copy action does. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude --- src/renderer/src/components/ImageViewer.tsx | 16 ++++++++-------- src/renderer/src/i18n/locales/en-us.json | 3 ++- src/renderer/src/i18n/locales/zh-cn.json | 3 ++- src/renderer/src/i18n/locales/zh-tw.json | 3 ++- src/renderer/src/i18n/translate/de-de.json | 3 ++- src/renderer/src/i18n/translate/el-gr.json | 3 ++- src/renderer/src/i18n/translate/es-es.json | 3 ++- src/renderer/src/i18n/translate/fr-fr.json | 3 ++- src/renderer/src/i18n/translate/ja-jp.json | 3 ++- src/renderer/src/i18n/translate/pt-pt.json | 3 ++- src/renderer/src/i18n/translate/ru-ru.json | 3 ++- 11 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/renderer/src/components/ImageViewer.tsx b/src/renderer/src/components/ImageViewer.tsx index 51df8c95c3..21bcee025f 100644 --- a/src/renderer/src/components/ImageViewer.tsx +++ b/src/renderer/src/components/ImageViewer.tsx @@ -14,7 +14,7 @@ import { convertImageToPng } from '@renderer/utils/image' import type { ImageProps as AntImageProps } from 'antd' import { Dropdown, Image as AntImage, Space } from 'antd' import { Base64 } from 'js-base64' -import { DownloadIcon, ImageIcon } from 'lucide-react' +import { DownloadIcon } from 'lucide-react' import mime from 'mime' import React from 'react' import { useTranslation } from 'react-i18next' @@ -73,9 +73,15 @@ const ImageViewer: React.FC = ({ src, style, ...props }) => { const getContextMenuItems = (src: string, size: number = 14) => { return [ { - key: 'copy-url', + key: 'copy-image', label: t('common.copy'), icon: , + onClick: () => handleCopyImage(src) + }, + { + key: 'copy-url', + label: t('preview.copy.src'), + icon: , onClick: () => { navigator.clipboard.writeText(src) window.toast.success(t('message.copy.success')) @@ -86,12 +92,6 @@ const ImageViewer: React.FC = ({ src, style, ...props }) => { label: t('common.download'), icon: , onClick: () => download(src) - }, - { - key: 'copy-image', - label: t('preview.copy.image'), - icon: , - onClick: () => handleCopyImage(src) } ] } diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index dd1d5cb728..4ebc57cb9b 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -2517,7 +2517,8 @@ }, "preview": { "copy": { - "image": "Copy as image" + "image": "Copy as image", + "src": "Copy Image Source" }, "dialog": "Open Dialog", "label": "Preview", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 05f39d0919..8829bfe08e 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -2517,7 +2517,8 @@ }, "preview": { "copy": { - "image": "复制为图片" + "image": "复制为图片", + "src": "复制图片源" }, "dialog": "打开预览窗口", "label": "预览", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 0d4481e6be..1a036a29e1 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -2517,7 +2517,8 @@ }, "preview": { "copy": { - "image": "複製為圖片" + "image": "複製為圖片", + "src": "複製圖片來源" }, "dialog": "開啟預覽窗口", "label": "預覽", diff --git a/src/renderer/src/i18n/translate/de-de.json b/src/renderer/src/i18n/translate/de-de.json index 49f3535b77..1300fbf6c7 100644 --- a/src/renderer/src/i18n/translate/de-de.json +++ b/src/renderer/src/i18n/translate/de-de.json @@ -2517,7 +2517,8 @@ }, "preview": { "copy": { - "image": "Als Bild kopieren" + "image": "Als Bild kopieren", + "src": "Bildquelle kopieren" }, "dialog": "Vorschaufenster öffnen", "label": "Vorschau", diff --git a/src/renderer/src/i18n/translate/el-gr.json b/src/renderer/src/i18n/translate/el-gr.json index 160fa31f95..535a36489e 100644 --- a/src/renderer/src/i18n/translate/el-gr.json +++ b/src/renderer/src/i18n/translate/el-gr.json @@ -2517,7 +2517,8 @@ }, "preview": { "copy": { - "image": "Αντιγραφή ως εικόνα" + "image": "Αντιγραφή ως εικόνα", + "src": "Αντιγραφή πηγής εικόνας" }, "dialog": "Άνοιγμα παραθύρου προεπισκόπησης", "label": "Προεπισκόπηση", diff --git a/src/renderer/src/i18n/translate/es-es.json b/src/renderer/src/i18n/translate/es-es.json index 43ea778b6d..43d5919f00 100644 --- a/src/renderer/src/i18n/translate/es-es.json +++ b/src/renderer/src/i18n/translate/es-es.json @@ -2517,7 +2517,8 @@ }, "preview": { "copy": { - "image": "Copiar como imagen" + "image": "Copiar como imagen", + "src": "Copia la fuente de la imagen" }, "dialog": "Abrir la ventana de vista previa", "label": "Vista previa", diff --git a/src/renderer/src/i18n/translate/fr-fr.json b/src/renderer/src/i18n/translate/fr-fr.json index bd5f471e2a..ef7db8b3b3 100644 --- a/src/renderer/src/i18n/translate/fr-fr.json +++ b/src/renderer/src/i18n/translate/fr-fr.json @@ -2517,7 +2517,8 @@ }, "preview": { "copy": { - "image": "Copier en tant qu'image" + "image": "Copier en tant qu'image", + "src": "Copier la source de l'image" }, "dialog": "Ouvrir la fenêtre d'aperçu", "label": "Aperçu", diff --git a/src/renderer/src/i18n/translate/ja-jp.json b/src/renderer/src/i18n/translate/ja-jp.json index 48dee61b8b..42c50c8827 100644 --- a/src/renderer/src/i18n/translate/ja-jp.json +++ b/src/renderer/src/i18n/translate/ja-jp.json @@ -2517,7 +2517,8 @@ }, "preview": { "copy": { - "image": "画像としてコピー" + "image": "画像としてコピー", + "src": "画像ソースをコピー" }, "dialog": "ダイアログを開く", "label": "プレビュー", diff --git a/src/renderer/src/i18n/translate/pt-pt.json b/src/renderer/src/i18n/translate/pt-pt.json index ffb665b7a5..bc84fc99b1 100644 --- a/src/renderer/src/i18n/translate/pt-pt.json +++ b/src/renderer/src/i18n/translate/pt-pt.json @@ -2517,7 +2517,8 @@ }, "preview": { "copy": { - "image": "Copiar como imagem" + "image": "Copiar como imagem", + "src": "Copiar Origem da Imagem" }, "dialog": "Abrir janela de pré-visualização", "label": "Pré-visualização", diff --git a/src/renderer/src/i18n/translate/ru-ru.json b/src/renderer/src/i18n/translate/ru-ru.json index 318162134c..109bffb9b2 100644 --- a/src/renderer/src/i18n/translate/ru-ru.json +++ b/src/renderer/src/i18n/translate/ru-ru.json @@ -2517,7 +2517,8 @@ }, "preview": { "copy": { - "image": "Скопировать как изображение" + "image": "Скопировать как изображение", + "src": "Копировать источник изображения" }, "dialog": "Открыть диалог", "label": "Предварительный просмотр",