Merge pull request #565 from Skillkiller/translate-pdf-to-image

Implement missing i18n translations for PDF-to-Image modules
This commit is contained in:
Alam
2026-03-24 11:55:11 +05:30
committed by GitHub
27 changed files with 287 additions and 96 deletions

View File

@@ -10,6 +10,7 @@ import { PDFDocument } from 'pdf-lib';
import { applyColorAdjustments } from '../utils/image-effects.js';
import * as pdfjsLib from 'pdfjs-dist';
import type { AdjustColorsSettings } from '../types/adjust-colors-type.js';
import { t } from '../i18n/i18n';
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
'pdfjs-dist/build/pdf.worker.min.mjs',
@@ -123,7 +124,7 @@ const updateUI = () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`;
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`;
infoContainer.append(nameSpan, metaSpan);
@@ -146,7 +147,7 @@ const updateUI = () => {
return getPDFDocument(buffer).promise;
})
.then((pdf: pdfjsLib.PDFDocumentProxy) => {
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} page${pdf.numPages !== 1 ? 's' : ''}`;
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`;
})
.catch(() => {
metaSpan.textContent = formatBytes(file.size);

View File

@@ -1,6 +1,7 @@
import { createIcons, icons } from 'lucide';
import { showAlert, showLoader, hideLoader } from '../ui.js';
import { readFileAsArrayBuffer, formatBytes, downloadFile, getPDFDocument } from '../utils/helpers.js';
import { t } from '../i18n/i18n';
import {
signPdf,
parsePfxFile,
@@ -253,7 +254,7 @@ async function updatePdfDisplay(): Promise<void> {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(state.pdfFile.size)}Loading pages...`;
metaSpan.textContent = `${formatBytes(state.pdfFile.size)}${t('common.loadingPageCount')}`;
infoContainer.append(nameSpan, metaSpan);

View File

@@ -1,4 +1,5 @@
import { showLoader, hideLoader, showAlert } from '../ui.js';
import { t } from '../i18n/i18n';
import {
downloadFile,
readFileAsArrayBuffer,
@@ -66,7 +67,7 @@ document.addEventListener('DOMContentLoaded', () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`;
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`;
infoContainer.append(nameSpan, metaSpan);

View File

@@ -1,4 +1,5 @@
import { showLoader, hideLoader, showAlert } from '../ui.js';
import { t } from '../i18n/i18n';
import {
downloadFile,
readFileAsArrayBuffer,
@@ -60,7 +61,7 @@ document.addEventListener('DOMContentLoaded', () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(currentFile.size)}Loading pages...`;
metaSpan.textContent = `${formatBytes(currentFile.size)}${t('common.loadingPageCount')}`;
infoContainer.append(nameSpan, metaSpan);

View File

@@ -10,6 +10,7 @@ import { createIcons, icons } from 'lucide';
import JSZip from 'jszip';
import * as pdfjsLib from 'pdfjs-dist';
import { PDFPageProxy } from 'pdfjs-dist';
import { t } from '../i18n/i18n';
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
'pdfjs-dist/build/pdf.worker.min.mjs',
@@ -44,7 +45,7 @@ const updateUI = () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`; // Initial state
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`; // Initial state
infoContainer.append(nameSpan, metaSpan);
@@ -67,7 +68,7 @@ const updateUI = () => {
return getPDFDocument(buffer).promise;
})
.then((pdf) => {
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} page${pdf.numPages !== 1 ? 's' : ''}`;
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`;
})
.catch((e) => {
console.warn('Error loading PDF page count:', e);
@@ -91,10 +92,13 @@ const resetState = () => {
async function convert() {
if (files.length === 0) {
showAlert('No File', 'Please upload a PDF file first.');
showAlert(
t('tools:pdfToBmp.alert.noFile'),
t('tools:pdfToBmp.alert.noFileExplanation')
);
return;
}
showLoader('Converting to BMP...');
showLoader(t('tools:pdfToBmp.loader.converting'));
try {
const pdf = await getPDFDocument(await readFileAsArrayBuffer(files[0]))
.promise;
@@ -118,8 +122,8 @@ async function convert() {
}
showAlert(
'Success',
'PDF converted to BMPs successfully!',
t('common.success'),
t('tools:pdfToBmp.alert.conversionSuccess'),
'success',
() => {
resetState();
@@ -127,10 +131,7 @@ async function convert() {
);
} catch (e) {
console.error(e);
showAlert(
'Error',
'Failed to convert PDF to BMP. The file might be corrupted.'
);
showAlert(t('common.error'), t('tools:pdfToBmp.alert.conversionError'));
} finally {
hideLoader();
}
@@ -174,7 +175,10 @@ document.addEventListener('DOMContentLoaded', () => {
);
if (validFiles.length === 0) {
showAlert('Invalid File', 'Please upload a PDF file.');
showAlert(
t('tools:pdfToBmp.alert.invalidFile'),
t('tools:pdfToBmp.alert.invalidFileExplanation')
);
return;
}

View File

@@ -1,4 +1,5 @@
import { showLoader, hideLoader, showAlert } from '../ui.js';
import { t } from '../i18n/i18n';
import {
downloadFile,
readFileAsArrayBuffer,
@@ -50,7 +51,7 @@ document.addEventListener('DOMContentLoaded', () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`;
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`;
infoContainer.append(nameSpan, metaSpan);

View File

@@ -9,6 +9,7 @@ import { createIcons, icons } from 'lucide';
import { PDFDocument } from 'pdf-lib';
import { applyGreyscale } from '../utils/image-effects.js';
import * as pdfjsLib from 'pdfjs-dist';
import { t } from '../i18n/i18n';
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
'pdfjs-dist/build/pdf.worker.min.mjs',
@@ -44,7 +45,7 @@ const updateUI = () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`; // Initial state
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`; // Initial state
infoContainer.append(nameSpan, metaSpan);
@@ -66,7 +67,7 @@ const updateUI = () => {
return getPDFDocument(buffer).promise;
})
.then((pdf) => {
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} page${pdf.numPages !== 1 ? 's' : ''}`;
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`;
})
.catch((e) => {
console.warn('Error loading PDF page count:', e);

View File

@@ -10,6 +10,7 @@ import { createIcons, icons } from 'lucide';
import JSZip from 'jszip';
import * as pdfjsLib from 'pdfjs-dist';
import { PDFPageProxy } from 'pdfjs-dist';
import { t } from '../i18n/i18n';
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
'pdfjs-dist/build/pdf.worker.min.mjs',
@@ -44,7 +45,7 @@ const updateUI = () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`; // Initial state
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`; // Initial state
infoContainer.append(nameSpan, metaSpan);
@@ -66,7 +67,7 @@ const updateUI = () => {
return getPDFDocument(buffer).promise;
})
.then((pdf) => {
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} page${pdf.numPages !== 1 ? 's' : ''}`;
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`;
})
.catch((e) => {
console.warn('Error loading PDF page count:', e);
@@ -96,10 +97,13 @@ const resetState = () => {
async function convert() {
if (files.length === 0) {
showAlert('No File', 'Please upload a PDF file first.');
showAlert(
t('tools:pdfToJpg.alert.noFile'),
t('tools:pdfToJpg.alert.noFileExplanation')
);
return;
}
showLoader('Converting to JPG...');
showLoader(t('tools:pdfToJpg.loader.converting'));
try {
const pdf = await getPDFDocument(await readFileAsArrayBuffer(files[0]))
.promise;
@@ -128,8 +132,8 @@ async function convert() {
}
showAlert(
'Success',
'PDF converted to JPGs successfully!',
t('common.success'),
t('tools:pdfToJpg.alert.conversionSuccess'),
'success',
() => {
resetState();
@@ -137,10 +141,7 @@ async function convert() {
);
} catch (e) {
console.error(e);
showAlert(
'Error',
'Failed to convert PDF to JPG. The file might be corrupted.'
);
showAlert(t('common.error'), t('tools:pdfToJpg.alert.conversionError'));
} finally {
hideLoader();
}
@@ -197,7 +198,10 @@ document.addEventListener('DOMContentLoaded', () => {
);
if (validFiles.length === 0) {
showAlert('Invalid File', 'Please upload a PDF file.');
showAlert(
t('tools:pdfToJpg.alert.invalidFile'),
t('tools:pdfToJpg.alert.invalidFileExplanation')
);
return;
}

View File

@@ -1,4 +1,5 @@
import { showLoader, hideLoader, showAlert } from '../ui.js';
import { t } from '../i18n/i18n';
import {
downloadFile,
readFileAsArrayBuffer,
@@ -53,7 +54,7 @@ document.addEventListener('DOMContentLoaded', () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`;
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`;
infoContainer.append(nameSpan, metaSpan);

View File

@@ -1,4 +1,5 @@
import { showLoader, hideLoader, showAlert } from '../ui.js';
import { t } from '../i18n/i18n';
import {
downloadFile,
readFileAsArrayBuffer,
@@ -53,7 +54,7 @@ document.addEventListener('DOMContentLoaded', () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`;
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`;
infoContainer.append(nameSpan, metaSpan);

View File

@@ -10,6 +10,7 @@ import { createIcons, icons } from 'lucide';
import JSZip from 'jszip';
import * as pdfjsLib from 'pdfjs-dist';
import { PDFPageProxy } from 'pdfjs-dist';
import { t } from '../i18n/i18n';
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
'pdfjs-dist/build/pdf.worker.min.mjs',
@@ -44,7 +45,7 @@ const updateUI = () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`; // Initial state
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`; // Initial state
infoContainer.append(nameSpan, metaSpan);
@@ -66,7 +67,7 @@ const updateUI = () => {
return getPDFDocument(buffer).promise;
})
.then((pdf) => {
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} page${pdf.numPages !== 1 ? 's' : ''}`;
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`;
})
.catch((e) => {
console.warn('Error loading PDF page count:', e);
@@ -94,10 +95,13 @@ const resetState = () => {
async function convert() {
if (files.length === 0) {
showAlert('No File', 'Please upload a PDF file first.');
showAlert(
t('tools:pdfToPng.alert.noFile'),
t('tools:pdfToPng.alert.noFileExplanation')
);
return;
}
showLoader('Converting to PNG...');
showLoader(t('tools:pdfToPng.loader.converting'));
try {
const pdf = await getPDFDocument(await readFileAsArrayBuffer(files[0]))
.promise;
@@ -124,8 +128,8 @@ async function convert() {
}
showAlert(
'Success',
'PDF converted to PNGs successfully!',
t('common.success'),
t('tools:pdfToPng.alert.conversionSuccess'),
'success',
() => {
resetState();
@@ -133,10 +137,7 @@ async function convert() {
);
} catch (e) {
console.error(e);
showAlert(
'Error',
'Failed to convert PDF to PNG. The file might be corrupted.'
);
showAlert(t('common.error'), t('tools:pdfToPng.alert.conversionError'));
} finally {
hideLoader();
}
@@ -191,7 +192,10 @@ document.addEventListener('DOMContentLoaded', () => {
);
if (validFiles.length === 0) {
showAlert('Invalid File', 'Please upload a PDF file.');
showAlert(
t('tools:pdfToPng.alert.invalidFile'),
t('tools:pdfToPng.alert.invalidFileExplanation')
);
return;
}

View File

@@ -11,6 +11,7 @@ import JSZip from 'jszip';
import * as pdfjsLib from 'pdfjs-dist';
import UTIF from 'utif';
import { PDFPageProxy } from 'pdfjs-dist';
import { t } from '../i18n/i18n';
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
'pdfjs-dist/build/pdf.worker.min.mjs',
@@ -45,7 +46,7 @@ const updateUI = () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`; // Initial state
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`; // Initial state
infoContainer.append(nameSpan, metaSpan);
@@ -67,7 +68,7 @@ const updateUI = () => {
return getPDFDocument(buffer).promise;
})
.then((pdf) => {
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} page${pdf.numPages !== 1 ? 's' : ''}`;
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`;
})
.catch((e) => {
console.warn('Error loading PDF page count:', e);
@@ -91,10 +92,13 @@ const resetState = () => {
async function convert() {
if (files.length === 0) {
showAlert('No File', 'Please upload a PDF file first.');
showAlert(
t('tools:pdfToTiff.alert.noFile'),
t('tools:pdfToTiff.alert.noFileExplanation')
);
return;
}
showLoader('Converting to TIFF...');
showLoader(t('tools:pdfToTiff.loader.converting'));
try {
const pdf = await getPDFDocument(await readFileAsArrayBuffer(files[0]))
.promise;
@@ -121,8 +125,8 @@ async function convert() {
}
showAlert(
'Success',
'PDF converted to TIFFs successfully!',
t('common.success'),
t('tools:pdfToTiff.alert.conversionSuccess'),
'success',
() => {
resetState();
@@ -130,10 +134,7 @@ async function convert() {
);
} catch (e) {
console.error(e);
showAlert(
'Error',
'Failed to convert PDF to TIFF. The file might be corrupted.'
);
showAlert(t('common.error'), t('tools:pdfToTiff.alert.conversionError'));
} finally {
hideLoader();
}
@@ -211,7 +212,10 @@ document.addEventListener('DOMContentLoaded', () => {
);
if (validFiles.length === 0) {
showAlert('Invalid File', 'Please upload a PDF file.');
showAlert(
t('tools:pdfToTiff.alert.invalidFile'),
t('tools:pdfToTiff.alert.invalidFileExplanation')
);
return;
}

View File

@@ -10,6 +10,7 @@ import { createIcons, icons } from 'lucide';
import JSZip from 'jszip';
import * as pdfjsLib from 'pdfjs-dist';
import { PDFPageProxy } from 'pdfjs-dist';
import { t } from '../i18n/i18n';
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
'pdfjs-dist/build/pdf.worker.min.mjs',
@@ -44,7 +45,7 @@ const updateUI = () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`; // Initial state
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`; // Initial state
infoContainer.append(nameSpan, metaSpan);
@@ -66,7 +67,7 @@ const updateUI = () => {
return getPDFDocument(buffer).promise;
})
.then((pdf) => {
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} page${pdf.numPages !== 1 ? 's' : ''}`;
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`;
})
.catch((e) => {
console.warn('Error loading PDF page count:', e);
@@ -96,10 +97,13 @@ const resetState = () => {
async function convert() {
if (files.length === 0) {
showAlert('No File', 'Please upload a PDF file first.');
showAlert(
t('tools:pdfToWebp.alert.noFile'),
t('tools:pdfToWebp.alert.noFileExplanation')
);
return;
}
showLoader('Converting to WebP...');
showLoader(t('tools:pdfToWebp.loader.converting'));
try {
const pdf = await getPDFDocument(await readFileAsArrayBuffer(files[0]))
.promise;
@@ -128,8 +132,8 @@ async function convert() {
}
showAlert(
'Success',
'PDF converted to WebPs successfully!',
t('common.success'),
t('tools:pdfToWebp.alert.conversionSuccess'),
'success',
() => {
resetState();
@@ -137,10 +141,7 @@ async function convert() {
);
} catch (e) {
console.error(e);
showAlert(
'Error',
'Failed to convert PDF to WebP. The file might be corrupted.'
);
showAlert(t('common.error'), t('tools:pdfToWebp.alert.conversionError'));
} finally {
hideLoader();
}
@@ -197,7 +198,10 @@ document.addEventListener('DOMContentLoaded', () => {
);
if (validFiles.length === 0) {
showAlert('Invalid File', 'Please upload a PDF file.');
showAlert(
t('tools:pdfToWebp.alert.invalidFile'),
t('tools:pdfToWebp.alert.invalidFileExplanation')
);
return;
}

View File

@@ -1,4 +1,5 @@
import { showLoader, hideLoader, showAlert } from '../ui.js';
import { t } from '../i18n/i18n';
import {
downloadFile,
readFileAsArrayBuffer,
@@ -50,7 +51,7 @@ document.addEventListener('DOMContentLoaded', () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`;
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`;
infoContainer.append(nameSpan, metaSpan);

View File

@@ -1,4 +1,5 @@
import { showLoader, hideLoader, showAlert } from '../ui.js';
import { t } from '../i18n/i18n';
import {
downloadFile,
readFileAsArrayBuffer,
@@ -50,7 +51,7 @@ document.addEventListener('DOMContentLoaded', () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`;
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`;
infoContainer.append(nameSpan, metaSpan);

View File

@@ -10,6 +10,7 @@ import { PDFDocument } from 'pdf-lib';
import { applyScannerEffect } from '../utils/image-effects.js';
import * as pdfjsLib from 'pdfjs-dist';
import type { ScanSettings } from '../types/scanner-effect-type.js';
import { t } from '../i18n/i18n';
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
'pdfjs-dist/build/pdf.worker.min.mjs',
@@ -129,7 +130,7 @@ const updateUI = () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`;
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`;
infoContainer.append(nameSpan, metaSpan);
@@ -152,7 +153,7 @@ const updateUI = () => {
return getPDFDocument(buffer).promise;
})
.then((pdf: pdfjsLib.PDFDocumentProxy) => {
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} page${pdf.numPages !== 1 ? 's' : ''}`;
metaSpan.textContent = `${formatBytes(file.size)}${pdf.numPages} ${pdf.numPages !== 1 ? t('common.pages') : t('common.page')}`;
})
.catch(() => {
metaSpan.textContent = formatBytes(file.size);

View File

@@ -2,6 +2,7 @@ import { createIcons, icons } from 'lucide';
import { showAlert, showLoader, hideLoader } from '../ui.js';
import { readFileAsArrayBuffer, formatBytes, downloadFile, getPDFDocument } from '../utils/helpers.js';
import { PDFDocument } from 'pdf-lib';
import { t } from '../i18n/i18n';
interface SignState {
file: File | null;
@@ -108,7 +109,7 @@ async function updateFileDisplay() {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(signState.file.size)}Loading pages...`;
metaSpan.textContent = `${formatBytes(signState.file.size)}${t('common.loadingPageCount')}`;
infoContainer.append(nameSpan, metaSpan);

View File

@@ -1,4 +1,5 @@
import { showLoader, hideLoader, showAlert } from '../ui.js';
import { t } from '../i18n/i18n';
import { createIcons, icons } from 'lucide';
import * as pdfjsLib from 'pdfjs-dist';
import {
@@ -71,7 +72,7 @@ document.addEventListener('DOMContentLoaded', () => {
const metaSpan = document.createElement('div');
metaSpan.className = 'text-xs text-gray-400';
metaSpan.textContent = `${formatBytes(file.size)}Loading pages...`; // Placeholder
metaSpan.textContent = `${formatBytes(file.size)}${t('common.loadingPageCount')}`; // Placeholder
infoContainer.append(nameSpan, metaSpan);