diff --git a/src/renderer/src/hooks/useOcr.ts b/src/renderer/src/hooks/useOcr.ts index 4e5a915a3e..4513f31ad9 100644 --- a/src/renderer/src/hooks/useOcr.ts +++ b/src/renderer/src/hooks/useOcr.ts @@ -1,8 +1,11 @@ +import { loggerService } from '@logger' import { useAppSelector } from '@renderer/store' import { ImageFileMetadata, isImageFile, SupportedOcrFile } from '@renderer/types' +import { uuid } from '@renderer/utils' +import { formatErrorMessage } from '@renderer/utils/error' import { useTranslation } from 'react-i18next' -export const useImageOcr = () => {} +const logger = loggerService.withContext('useOcr') export const useOcr = () => { const { t } = useTranslation() @@ -18,14 +21,24 @@ export const useOcr = () => { } /** - * 对支持的文件进行OCR识别 + * 对支持的文件进行OCR识别. * @param file 支持OCR的文件 * @returns OCR识别结果的Promise - * @throws 当文件类型不支持时抛出错误 + * @throws 当文件类型不支持或OCR失败时抛出错误 */ const ocr = async (file: SupportedOcrFile) => { - if (isImageFile(file)) { - return ocrImage(file) + const key = uuid() + window.message.loading({ content: t('ocr.processing'), key, duration: 0 }) + try { + if (isImageFile(file)) { + return ocrImage(file) + } + } catch (e) { + logger.error('Failed to ocr.', e as Error) + window.message.error(t('ocr.error.unknown') + ': ' + formatErrorMessage(e)) + throw e + } finally { + window.message.destroy(key) } // @ts-expect-error all types should be covered throw new Error(t('ocr.file.not_supported', { type: file.type })) diff --git a/src/renderer/src/pages/translate/TranslatePage.tsx b/src/renderer/src/pages/translate/TranslatePage.tsx index a7a435ff92..40ae23d3ed 100644 --- a/src/renderer/src/pages/translate/TranslatePage.tsx +++ b/src/renderer/src/pages/translate/TranslatePage.tsx @@ -20,7 +20,6 @@ import { setTranslating as setTranslatingAction } from '@renderer/store/runtime' import { setTranslatedContent as setTranslatedContentAction } from '@renderer/store/translate' import { type AutoDetectionMethod, - isImageFile, isSupportedOcrFile, type Model, type TranslateHistory, @@ -446,21 +445,14 @@ const TranslatePage: FC = () => { } // extensible - const shouldOCR = isImageFile(file) + const shouldOCR = isSupportedOcrFile(file) if (shouldOCR) { - if (isSupportedOcrFile(file)) { - window.message.loading({ content: t('ocr.processing'), key: 'translate_ocr_processing', duration: 0 }) - try { - const ocrResult = await ocr(file) - setText(ocrResult.text) - } catch (e) { - logger.error('Failed to ocr.', e as Error) - window.message.error(t('ocr.error.unknown') + ': ' + formatErrorMessage(e)) - } - } else { - // @ts-expect-error all situations covered. just for robustness - window.message.error(t('ocr.file.not_supported', { type: file.type })) + try { + const ocrResult = await ocr(file) + setText(ocrResult.text) + } finally { + // do nothing when failed. } } else { // the threshold may be too large @@ -474,6 +466,8 @@ const TranslatePage: FC = () => { } catch (e) { logger.error('Failed to read text file.', e as Error) window.message.error(t('translate.files.error.unknown') + ': ' + formatErrorMessage(e)) + } finally { + window.message.destroy('translate_files_reading') } } } @@ -482,8 +476,6 @@ const TranslatePage: FC = () => { window.message.error(t('translate.files.error.unknown') + ': ' + formatErrorMessage(e)) } finally { setIsProcessing(false) - window.message.destroy('translate_ocr_processing') - window.message.destroy('translate_files_reading') } }, [ocr, onSelectFile, selecting, t])