+
{t('tools.batchPv.selectedFolder')}
+
+ {folderPath.value}
+
+
+
{t('tools.batchPv.direction')}
+
+
+ {t('tools.batchPv.directionUsmToMp4')}
+ {t('tools.batchPv.directionUsmToMp4Hint')}
+
+
+
+
+ {t('tools.batchPv.directionMp4ToUsm')}
+ {t('tools.batchPv.directionMp4ToUsmHint')}
+
+
+
+
+
+
+
+ );
+
+ const renderProgress = () => (
+
+
+
+ {t('tools.batchPv.overall')}
+ {state.completed}/{state.total}{state.failed > 0 ? ` (${state.failed} ✗)` : ''}
+
+
+
+
+
+ {t('tools.batchPv.currentFile')}
+ {state.fileName}
+
+
+
+ {fileErrors.value.length > 0 && (
+
+ {t('tools.batchPv.fileErrors')} ({fileErrors.value.length})
+
+ {fileErrors.value.map((err, i) => - {err}
)}
+
+
+ )}
+
+ {t('tools.batchPv.cancelHint')}
+
+
+
+ );
+
+ const renderDone = () => {
+ const summary = (() => {
+ if (finishKind.value === FinishKind.Cancelled) {
+ const [doneStr, totalStr] = finishSummary.value.split('/');
+ return t('tools.batchPv.cancelledSummary', {
+ completed: parseInt(doneStr ?? '0', 10),
+ total: parseInt(totalStr ?? '0', 10),
+ });
+ }
+ const [doneStr, failedStr] = finishSummary.value.split('|');
+ const [doneVal, totalVal] = doneStr.split('/').map(v => parseInt(v, 10));
+ const failedVal = parseInt(failedStr ?? '0', 10);
+ return t('tools.batchPv.completedSummary', {
+ success: doneVal - failedVal,
+ total: totalVal,
+ failed: failedVal,
+ });
+ })();
+
+ return (
+