diff --git a/messages/en.json b/messages/en.json
deleted file mode 100644
index b292413..0000000
--- a/messages/en.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
- "HomePage": {
- "title": "Image Web Exporter",
- "subtitle": "Upload a picture, then export it in a different resolution and format."
- },
- "ImageUploadArea": {
- "title": "Upload Images",
- "prompt": "Click or drag and drop to upload",
- "supportedFormats": "PNG, JPG, WEBP supported"
- },
- "ImageList": {
- "title": "Uploaded Images",
- "clearAll": "Clear All",
- "clearAllTooltip": "Remove all uploaded images.",
- "downloadAll": "Download All ({count})",
- "downloadAllDefault": "Download All",
- "converting": "Converting...",
- "downloadAllTooltip": "Convert and download all images with the current settings."
- },
- "ImageListItem": {
- "baseName": "Base Name",
- "finalName": "Final name: {finalFilename}.{format}",
- "downloadTooltip": "Download this image",
- "removeTooltip": "Remove this image"
- },
- "SettingsPanel": {
- "imageSettingsTitle": "Image Settings",
- "imageSettingsSubtitle": "Adjust resolution and scaling for all images.",
- "filenameSettingsTitle": "Filename Settings",
- "filenameSettingsSubtitle": "Customize the output filenames.",
- "qualitySettingsTitle": "Quality Settings",
- "qualitySettingsSubtitle": "Choose format and compression level."
- },
- "ImageSettings": {
- "aspectRatio": "Aspect Ratio",
- "aspectRatioTooltip": "Choose a preset aspect ratio or select 'Custom' to enter dimensions manually.",
- "custom": "Custom",
- "square": "1:1 (Square)",
- "standard": "4:3 (Standard)",
- "photography": "3:2 (Photography)",
- "widescreen": "16:9 (Widescreen)",
- "width": "Width (px)",
- "widthTooltip": "Set the output width in pixels. Leave blank to use the original width.",
- "swapTooltip": "Swap the entered width and height values.",
- "height": "Height (px)",
- "heightTooltip": "Set the output height in pixels. Leave blank to use the original height.",
- "keepOrientation": "Keep original orientation",
- "keepOrientationTooltip": "Automatically swaps width and height to match the original image's orientation.",
- "scaling": "Scaling",
- "scalingTooltip": "Determines how the image fits into the new dimensions.",
- "fill": "Fill (stretch to fit)",
- "cover": "Cover (crop to fit)",
- "contain": "Contain (letterbox)",
- "position": "Position",
- "positionTooltip": "Sets the anchor point for 'Cover' or 'Contain' scaling."
- },
- "FilenameSettings": {
- "useDefaultBaseName": "Use default base name",
- "useDefaultBaseNameTooltip": "When enabled, all newly uploaded images will use the specified default base name.",
- "defaultBaseName": "Default base name",
- "applyToAll": "Apply to all",
- "applyToAllTooltip": "Apply this base name to all currently uploaded images.",
- "prefix": "Prefix",
- "prefixTooltip": "Add text to the beginning of every filename.",
- "suffix": "Suffix",
- "suffixTooltip": "Add text to the end of every filename (before the number).",
- "addSequentialNumber": "Add sequential number",
- "addSequentialNumberTooltip": "Append a numbered sequence to each filename.",
- "startNumber": "Start number",
- "startNumberTooltip": "The first number to use in the sequence.",
- "paddingDigits": "Padding digits",
- "paddingDigitsTooltip": "Total number of digits for the counter, padded with leading zeros (e.g., 3 for 001)."
- },
- "QualitySettings": {
- "format": "Format",
- "formatTooltip": "Choose the output file format for the images.",
- "quality": "Quality",
- "qualityTooltip": "Set compression quality for JPEG/WEBP. Higher is better quality but larger file size.",
- "pngWarning": "Quality slider is disabled for PNG (lossless format)."
- },
- "ActionButtons": {
- "reset": "Reset",
- "resetTooltip": "Reset all settings to their default values.",
- "apply": "Apply",
- "applyTooltip": "Confirm and apply all the settings above. This does not download the images."
- },
- "Footer": {
- "imprint": "Imprint",
- "privacy": "Privacy"
- },
- "ChangelogPage": {
- "back": "Back to Converter"
- },
- "ImprintPage": {
- "back": "Back to Converter"
- },
- "PrivacyPage": {
- "back": "Back to Converter"
- }
-}
\ No newline at end of file
diff --git a/package.json b/package.json
index 530c500..e6537d8 100644
--- a/package.json
+++ b/package.json
@@ -44,7 +44,6 @@
"input-otp": "^1.4.2",
"lucide-react": "^0.511.0",
"next": "15.3.8",
- "next-intl": "^4.7.0",
"next-themes": "^0.4.6",
"react": "^19.2.1",
"react-day-picker": "^8.10.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b2c681b..f1383c3 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -113,9 +113,6 @@ importers:
next:
specifier: 15.3.8
version: 15.3.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- next-intl:
- specifier: ^4.7.0
- version: 4.7.0(next@15.3.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3)
next-themes:
specifier: ^0.4.6
version: 0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
@@ -225,24 +222,6 @@ packages:
'@floating-ui/utils@0.2.9':
resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
- '@formatjs/ecma402-abstract@2.3.6':
- resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==}
-
- '@formatjs/fast-memoize@2.2.7':
- resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==}
-
- '@formatjs/icu-messageformat-parser@2.11.4':
- resolution: {integrity: sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==}
-
- '@formatjs/icu-skeleton-parser@1.8.16':
- resolution: {integrity: sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==}
-
- '@formatjs/intl-localematcher@0.5.10':
- resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==}
-
- '@formatjs/intl-localematcher@0.6.2':
- resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==}
-
'@hookform/resolvers@5.0.1':
resolution: {integrity: sha512-u/+Jp83luQNx9AdyW2fIPGY6Y7NG68eN2ZW8FOJYL+M0i4s49+refdJdOp/A9n9HFQtQs3HIDHQvX3ZET2o7YA==}
peerDependencies:
@@ -452,88 +431,6 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- '@parcel/watcher-android-arm64@2.5.4':
- resolution: {integrity: sha512-hoh0vx4v+b3BNI7Cjoy2/B0ARqcwVNrzN/n7DLq9ZB4I3lrsvhrkCViJyfTj/Qi5xM9YFiH4AmHGK6pgH1ss7g==}
- engines: {node: '>= 10.0.0'}
- cpu: [arm64]
- os: [android]
-
- '@parcel/watcher-darwin-arm64@2.5.4':
- resolution: {integrity: sha512-kphKy377pZiWpAOyTgQYPE5/XEKVMaj6VUjKT5VkNyUJlr2qZAn8gIc7CPzx+kbhvqHDT9d7EqdOqRXT6vk0zw==}
- engines: {node: '>= 10.0.0'}
- cpu: [arm64]
- os: [darwin]
-
- '@parcel/watcher-darwin-x64@2.5.4':
- resolution: {integrity: sha512-UKaQFhCtNJW1A9YyVz3Ju7ydf6QgrpNQfRZ35wNKUhTQ3dxJ/3MULXN5JN/0Z80V/KUBDGa3RZaKq1EQT2a2gg==}
- engines: {node: '>= 10.0.0'}
- cpu: [x64]
- os: [darwin]
-
- '@parcel/watcher-freebsd-x64@2.5.4':
- resolution: {integrity: sha512-Dib0Wv3Ow/m2/ttvLdeI2DBXloO7t3Z0oCp4bAb2aqyqOjKPPGrg10pMJJAQ7tt8P4V2rwYwywkDhUia/FgS+Q==}
- engines: {node: '>= 10.0.0'}
- cpu: [x64]
- os: [freebsd]
-
- '@parcel/watcher-linux-arm-glibc@2.5.4':
- resolution: {integrity: sha512-I5Vb769pdf7Q7Sf4KNy8Pogl/URRCKu9ImMmnVKYayhynuyGYMzuI4UOWnegQNa2sGpsPSbzDsqbHNMyeyPCgw==}
- engines: {node: '>= 10.0.0'}
- cpu: [arm]
- os: [linux]
-
- '@parcel/watcher-linux-arm-musl@2.5.4':
- resolution: {integrity: sha512-kGO8RPvVrcAotV4QcWh8kZuHr9bXi9a3bSZw7kFarYR0+fGliU7hd/zevhjw8fnvIKG3J9EO5G6sXNGCSNMYPQ==}
- engines: {node: '>= 10.0.0'}
- cpu: [arm]
- os: [linux]
-
- '@parcel/watcher-linux-arm64-glibc@2.5.4':
- resolution: {integrity: sha512-KU75aooXhqGFY2W5/p8DYYHt4hrjHZod8AhcGAmhzPn/etTa+lYCDB2b1sJy3sWJ8ahFVTdy+EbqSBvMx3iFlw==}
- engines: {node: '>= 10.0.0'}
- cpu: [arm64]
- os: [linux]
-
- '@parcel/watcher-linux-arm64-musl@2.5.4':
- resolution: {integrity: sha512-Qx8uNiIekVutnzbVdrgSanM+cbpDD3boB1f8vMtnuG5Zau4/bdDbXyKwIn0ToqFhIuob73bcxV9NwRm04/hzHQ==}
- engines: {node: '>= 10.0.0'}
- cpu: [arm64]
- os: [linux]
-
- '@parcel/watcher-linux-x64-glibc@2.5.4':
- resolution: {integrity: sha512-UYBQvhYmgAv61LNUn24qGQdjtycFBKSK3EXr72DbJqX9aaLbtCOO8+1SkKhD/GNiJ97ExgcHBrukcYhVjrnogA==}
- engines: {node: '>= 10.0.0'}
- cpu: [x64]
- os: [linux]
-
- '@parcel/watcher-linux-x64-musl@2.5.4':
- resolution: {integrity: sha512-YoRWCVgxv8akZrMhdyVi6/TyoeeMkQ0PGGOf2E4omODrvd1wxniXP+DBynKoHryStks7l+fDAMUBRzqNHrVOpg==}
- engines: {node: '>= 10.0.0'}
- cpu: [x64]
- os: [linux]
-
- '@parcel/watcher-win32-arm64@2.5.4':
- resolution: {integrity: sha512-iby+D/YNXWkiQNYcIhg8P5hSjzXEHaQrk2SLrWOUD7VeC4Ohu0WQvmV+HDJokZVJ2UjJ4AGXW3bx7Lls9Ln4TQ==}
- engines: {node: '>= 10.0.0'}
- cpu: [arm64]
- os: [win32]
-
- '@parcel/watcher-win32-ia32@2.5.4':
- resolution: {integrity: sha512-vQN+KIReG0a2ZDpVv8cgddlf67J8hk1WfZMMP7sMeZmJRSmEax5xNDNWKdgqSe2brOKTQQAs3aCCUal2qBHAyg==}
- engines: {node: '>= 10.0.0'}
- cpu: [ia32]
- os: [win32]
-
- '@parcel/watcher-win32-x64@2.5.4':
- resolution: {integrity: sha512-3A6efb6BOKwyw7yk9ro2vus2YTt2nvcd56AuzxdMiVOxL9umDyN5PKkKfZ/gZ9row41SjVmTVQNWQhaRRGpOKw==}
- engines: {node: '>= 10.0.0'}
- cpu: [x64]
- os: [win32]
-
- '@parcel/watcher@2.5.4':
- resolution: {integrity: sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ==}
- engines: {node: '>= 10.0.0'}
-
'@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
@@ -1150,90 +1047,15 @@ packages:
'@radix-ui/rect@1.1.1':
resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==}
- '@schummar/icu-type-parser@1.21.5':
- resolution: {integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==}
-
'@standard-schema/utils@0.3.0':
resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
- '@swc/core-darwin-arm64@1.15.8':
- resolution: {integrity: sha512-M9cK5GwyWWRkRGwwCbREuj6r8jKdES/haCZ3Xckgkl8MUQJZA3XB7IXXK1IXRNeLjg6m7cnoMICpXv1v1hlJOg==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [darwin]
-
- '@swc/core-darwin-x64@1.15.8':
- resolution: {integrity: sha512-j47DasuOvXl80sKJHSi2X25l44CMc3VDhlJwA7oewC1nV1VsSzwX+KOwE5tLnfORvVJJyeiXgJORNYg4jeIjYQ==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [darwin]
-
- '@swc/core-linux-arm-gnueabihf@1.15.8':
- resolution: {integrity: sha512-siAzDENu2rUbwr9+fayWa26r5A9fol1iORG53HWxQL1J8ym4k7xt9eME0dMPXlYZDytK5r9sW8zEA10F2U3Xwg==}
- engines: {node: '>=10'}
- cpu: [arm]
- os: [linux]
-
- '@swc/core-linux-arm64-gnu@1.15.8':
- resolution: {integrity: sha512-o+1y5u6k2FfPYbTRUPvurwzNt5qd0NTumCTFscCNuBksycloXY16J8L+SMW5QRX59n4Hp9EmFa3vpvNHRVv1+Q==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [linux]
-
- '@swc/core-linux-arm64-musl@1.15.8':
- resolution: {integrity: sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [linux]
-
- '@swc/core-linux-x64-gnu@1.15.8':
- resolution: {integrity: sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [linux]
-
- '@swc/core-linux-x64-musl@1.15.8':
- resolution: {integrity: sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [linux]
-
- '@swc/core-win32-arm64-msvc@1.15.8':
- resolution: {integrity: sha512-djQPJ9Rh9vP8GTS/Df3hcc6XP6xnG5c8qsngWId/BLA9oX6C7UzCPAn74BG/wGb9a6j4w3RINuoaieJB3t+7iQ==}
- engines: {node: '>=10'}
- cpu: [arm64]
- os: [win32]
-
- '@swc/core-win32-ia32-msvc@1.15.8':
- resolution: {integrity: sha512-/wfAgxORg2VBaUoFdytcVBVCgf1isWZIEXB9MZEUty4wwK93M/PxAkjifOho9RN3WrM3inPLabICRCEgdHpKKQ==}
- engines: {node: '>=10'}
- cpu: [ia32]
- os: [win32]
-
- '@swc/core-win32-x64-msvc@1.15.8':
- resolution: {integrity: sha512-GpMePrh9Sl4d61o4KAHOOv5is5+zt6BEXCOCgs/H0FLGeii7j9bWDE8ExvKFy2GRRZVNR1ugsnzaGWHKM6kuzA==}
- engines: {node: '>=10'}
- cpu: [x64]
- os: [win32]
-
- '@swc/core@1.15.8':
- resolution: {integrity: sha512-T8keoJjXaSUoVBCIjgL6wAnhADIb09GOELzKg10CjNg+vLX48P93SME6jTfte9MZIm5m+Il57H3rTSk/0kzDUw==}
- engines: {node: '>=10'}
- peerDependencies:
- '@swc/helpers': '>=0.5.17'
- peerDependenciesMeta:
- '@swc/helpers':
- optional: true
-
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
- '@swc/types@0.1.25':
- resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==}
-
'@types/d3-array@3.2.1':
resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
@@ -1526,9 +1348,6 @@ packages:
decimal.js-light@2.5.1:
resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
- decimal.js@10.6.0:
- resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
-
detect-libc@2.0.4:
resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==}
engines: {node: '>=8'}
@@ -1680,9 +1499,6 @@ packages:
resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
engines: {node: '>=12'}
- intl-messageformat@10.7.18:
- resolution: {integrity: sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==}
-
is-arrayish@0.3.2:
resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
@@ -1797,26 +1613,9 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- negotiator@1.0.0:
- resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
- engines: {node: '>= 0.6'}
-
neo-async@2.6.2:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
- next-intl-swc-plugin-extractor@4.7.0:
- resolution: {integrity: sha512-iAqflu2FWdQMWhwB0B2z52X7LmEpvnMNJXqVERZQ7bK5p9iqQLu70ur6Ka6NfiXLxfb+AeAkUX5qIciQOg+87A==}
-
- next-intl@4.7.0:
- resolution: {integrity: sha512-gvROzcNr/HM0jTzQlKWQxUNk8jrZ0bREz+bht3wNbv+uzlZ5Kn3J+m+viosub18QJ72S08UJnVK50PXWcUvwpQ==}
- peerDependencies:
- next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0
- typescript: ^5.0.0
- peerDependenciesMeta:
- typescript:
- optional: true
-
next-themes@0.4.6:
resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
peerDependencies:
@@ -1844,9 +1643,6 @@ packages:
sass:
optional: true
- node-addon-api@7.1.1:
- resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
-
node-releases@2.0.19:
resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
@@ -1883,10 +1679,6 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
- picomatch@4.0.3:
- resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
- engines: {node: '>=12'}
-
pify@2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'}
@@ -1895,9 +1687,6 @@ packages:
resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
engines: {node: '>= 6'}
- po-parser@2.1.1:
- resolution: {integrity: sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==}
-
postcss-import@15.1.0:
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'}
@@ -2242,11 +2031,6 @@ packages:
'@types/react':
optional: true
- use-intl@4.7.0:
- resolution: {integrity: sha512-jyd8nSErVRRsSlUa+SDobKHo9IiWs5fjcPl9VBUnzUyEQpVM5mwJCgw8eUiylhvBpLQzUGox1KN0XlRivSID9A==}
- peerDependencies:
- react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0
-
use-sidecar@1.1.3:
resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
engines: {node: '>=10'}
@@ -2361,36 +2145,6 @@ snapshots:
'@floating-ui/utils@0.2.9': {}
- '@formatjs/ecma402-abstract@2.3.6':
- dependencies:
- '@formatjs/fast-memoize': 2.2.7
- '@formatjs/intl-localematcher': 0.6.2
- decimal.js: 10.6.0
- tslib: 2.8.1
-
- '@formatjs/fast-memoize@2.2.7':
- dependencies:
- tslib: 2.8.1
-
- '@formatjs/icu-messageformat-parser@2.11.4':
- dependencies:
- '@formatjs/ecma402-abstract': 2.3.6
- '@formatjs/icu-skeleton-parser': 1.8.16
- tslib: 2.8.1
-
- '@formatjs/icu-skeleton-parser@1.8.16':
- dependencies:
- '@formatjs/ecma402-abstract': 2.3.6
- tslib: 2.8.1
-
- '@formatjs/intl-localematcher@0.5.10':
- dependencies:
- tslib: 2.8.1
-
- '@formatjs/intl-localematcher@0.6.2':
- dependencies:
- tslib: 2.8.1
-
'@hookform/resolvers@5.0.1(react-hook-form@7.56.4(react@19.2.1))':
dependencies:
'@standard-schema/utils': 0.3.0
@@ -2546,66 +2300,6 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.19.1
- '@parcel/watcher-android-arm64@2.5.4':
- optional: true
-
- '@parcel/watcher-darwin-arm64@2.5.4':
- optional: true
-
- '@parcel/watcher-darwin-x64@2.5.4':
- optional: true
-
- '@parcel/watcher-freebsd-x64@2.5.4':
- optional: true
-
- '@parcel/watcher-linux-arm-glibc@2.5.4':
- optional: true
-
- '@parcel/watcher-linux-arm-musl@2.5.4':
- optional: true
-
- '@parcel/watcher-linux-arm64-glibc@2.5.4':
- optional: true
-
- '@parcel/watcher-linux-arm64-musl@2.5.4':
- optional: true
-
- '@parcel/watcher-linux-x64-glibc@2.5.4':
- optional: true
-
- '@parcel/watcher-linux-x64-musl@2.5.4':
- optional: true
-
- '@parcel/watcher-win32-arm64@2.5.4':
- optional: true
-
- '@parcel/watcher-win32-ia32@2.5.4':
- optional: true
-
- '@parcel/watcher-win32-x64@2.5.4':
- optional: true
-
- '@parcel/watcher@2.5.4':
- dependencies:
- detect-libc: 2.0.4
- is-glob: 4.0.3
- node-addon-api: 7.1.1
- picomatch: 4.0.3
- optionalDependencies:
- '@parcel/watcher-android-arm64': 2.5.4
- '@parcel/watcher-darwin-arm64': 2.5.4
- '@parcel/watcher-darwin-x64': 2.5.4
- '@parcel/watcher-freebsd-x64': 2.5.4
- '@parcel/watcher-linux-arm-glibc': 2.5.4
- '@parcel/watcher-linux-arm-musl': 2.5.4
- '@parcel/watcher-linux-arm64-glibc': 2.5.4
- '@parcel/watcher-linux-arm64-musl': 2.5.4
- '@parcel/watcher-linux-x64-glibc': 2.5.4
- '@parcel/watcher-linux-x64-musl': 2.5.4
- '@parcel/watcher-win32-arm64': 2.5.4
- '@parcel/watcher-win32-ia32': 2.5.4
- '@parcel/watcher-win32-x64': 2.5.4
-
'@pkgjs/parseargs@0.11.0':
optional: true
@@ -3262,66 +2956,14 @@ snapshots:
'@radix-ui/rect@1.1.1': {}
- '@schummar/icu-type-parser@1.21.5': {}
-
'@standard-schema/utils@0.3.0': {}
- '@swc/core-darwin-arm64@1.15.8':
- optional: true
-
- '@swc/core-darwin-x64@1.15.8':
- optional: true
-
- '@swc/core-linux-arm-gnueabihf@1.15.8':
- optional: true
-
- '@swc/core-linux-arm64-gnu@1.15.8':
- optional: true
-
- '@swc/core-linux-arm64-musl@1.15.8':
- optional: true
-
- '@swc/core-linux-x64-gnu@1.15.8':
- optional: true
-
- '@swc/core-linux-x64-musl@1.15.8':
- optional: true
-
- '@swc/core-win32-arm64-msvc@1.15.8':
- optional: true
-
- '@swc/core-win32-ia32-msvc@1.15.8':
- optional: true
-
- '@swc/core-win32-x64-msvc@1.15.8':
- optional: true
-
- '@swc/core@1.15.8':
- dependencies:
- '@swc/counter': 0.1.3
- '@swc/types': 0.1.25
- optionalDependencies:
- '@swc/core-darwin-arm64': 1.15.8
- '@swc/core-darwin-x64': 1.15.8
- '@swc/core-linux-arm-gnueabihf': 1.15.8
- '@swc/core-linux-arm64-gnu': 1.15.8
- '@swc/core-linux-arm64-musl': 1.15.8
- '@swc/core-linux-x64-gnu': 1.15.8
- '@swc/core-linux-x64-musl': 1.15.8
- '@swc/core-win32-arm64-msvc': 1.15.8
- '@swc/core-win32-ia32-msvc': 1.15.8
- '@swc/core-win32-x64-msvc': 1.15.8
-
'@swc/counter@0.1.3': {}
'@swc/helpers@0.5.15':
dependencies:
tslib: 2.8.1
- '@swc/types@0.1.25':
- dependencies:
- '@swc/counter': 0.1.3
-
'@types/d3-array@3.2.1': {}
'@types/d3-color@3.1.3': {}
@@ -3630,9 +3272,8 @@ snapshots:
decimal.js-light@2.5.1: {}
- decimal.js@10.6.0: {}
-
- detect-libc@2.0.4: {}
+ detect-libc@2.0.4:
+ optional: true
detect-node-es@1.1.0: {}
@@ -3761,13 +3402,6 @@ snapshots:
internmap@2.0.3: {}
- intl-messageformat@10.7.18:
- dependencies:
- '@formatjs/ecma402-abstract': 2.3.6
- '@formatjs/fast-memoize': 2.2.7
- '@formatjs/icu-messageformat-parser': 2.11.4
- tslib: 2.8.1
-
is-arrayish@0.3.2:
optional: true
@@ -3862,28 +3496,8 @@ snapshots:
nanoid@3.3.11: {}
- negotiator@1.0.0: {}
-
neo-async@2.6.2: {}
- next-intl-swc-plugin-extractor@4.7.0: {}
-
- next-intl@4.7.0(next@15.3.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(react@19.2.1)(typescript@5.8.3):
- dependencies:
- '@formatjs/intl-localematcher': 0.5.10
- '@parcel/watcher': 2.5.4
- '@swc/core': 1.15.8
- negotiator: 1.0.0
- next: 15.3.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
- next-intl-swc-plugin-extractor: 4.7.0
- po-parser: 2.1.1
- react: 19.2.1
- use-intl: 4.7.0(react@19.2.1)
- optionalDependencies:
- typescript: 5.8.3
- transitivePeerDependencies:
- - '@swc/helpers'
-
next-themes@0.4.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1):
dependencies:
react: 19.2.1
@@ -3914,8 +3528,6 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
- node-addon-api@7.1.1: {}
-
node-releases@2.0.19: {}
normalize-path@3.0.0: {}
@@ -3939,14 +3551,10 @@ snapshots:
picomatch@2.3.1: {}
- picomatch@4.0.3: {}
-
pify@2.3.0: {}
pirates@4.0.7: {}
- po-parser@2.1.1: {}
-
postcss-import@15.1.0(postcss@8.5.3):
dependencies:
postcss: 8.5.3
@@ -4313,13 +3921,6 @@ snapshots:
optionalDependencies:
'@types/react': 19.1.5
- use-intl@4.7.0(react@19.2.1):
- dependencies:
- '@formatjs/fast-memoize': 2.2.7
- '@schummar/icu-type-parser': 1.21.5
- intl-messageformat: 10.7.18
- react: 19.2.1
-
use-sidecar@1.1.3(@types/react@19.1.5)(react@19.2.1):
dependencies:
detect-node-es: 1.1.0
diff --git a/src/app/[locale]/changelog/page.tsx b/src/app/changelog/page.tsx
similarity index 81%
rename from src/app/[locale]/changelog/page.tsx
rename to src/app/changelog/page.tsx
index 14a0343..ba7c4dd 100644
--- a/src/app/[locale]/changelog/page.tsx
+++ b/src/app/changelog/page.tsx
@@ -1,18 +1,16 @@
import { Changelog } from "@/components/changelog";
-import Link from "next-intl/link";
+import Link from "next/link";
import { Button } from "@/components/ui/button";
import { ArrowLeft } from "lucide-react";
-import { useTranslations } from "next-intl";
export default function ChangelogPage() {
- const t = useTranslations("ChangelogPage");
return (
diff --git a/src/app/[locale]/imprint/page.tsx b/src/app/imprint/page.tsx
similarity index 93%
rename from src/app/[locale]/imprint/page.tsx
rename to src/app/imprint/page.tsx
index 723394f..4b252f5 100644
--- a/src/app/[locale]/imprint/page.tsx
+++ b/src/app/imprint/page.tsx
@@ -1,18 +1,16 @@
-import Link from "next-intl/link";
+import Link from "next/link";
import { Button } from "@/components/ui/button";
import { ArrowLeft } from "lucide-react";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
-import { useTranslations } from "next-intl";
export default function ImprintPage() {
- const t = useTranslations("ImprintPage");
return (
diff --git a/src/app/[locale]/layout.tsx b/src/app/layout.tsx
similarity index 54%
rename from src/app/[locale]/layout.tsx
rename to src/app/layout.tsx
index 1e88573..0aaa019 100644
--- a/src/app/[locale]/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,11 +1,9 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
-import "../globals.css";
+import "./globals.css";
import { ThemeProvider } from "@/components/theme-provider";
import { Toaster } from "@/components/ui/sonner";
import { Footer } from "@/components/footer";
-import { NextIntlClientProvider } from 'next-intl';
-import { getMessages } from 'next-intl/server';
const geistSans = Geist({
variable: "--font-geist-sans",
@@ -22,32 +20,26 @@ export const metadata: Metadata = {
description: "Upload a picture, then export it in a different resolution and format.",
};
-export default async function RootLayout({
+export default function RootLayout({
children,
- params: { locale }
}: Readonly<{
children: React.ReactNode;
- params: { locale: string };
}>) {
- const messages = await getMessages();
-
return (
-
+
-
-
- {children}
-
-
-
-
+
+ {children}
+
+
+
);
diff --git a/src/app/[locale]/page.tsx b/src/app/page.tsx
similarity index 82%
rename from src/app/[locale]/page.tsx
rename to src/app/page.tsx
index 9e6ea19..42403e1 100644
--- a/src/app/[locale]/page.tsx
+++ b/src/app/page.tsx
@@ -1,17 +1,15 @@
import { ImageConverter } from "@/components/image-converter";
-import { useTranslations } from 'next-intl';
export default function Home() {
- const t = useTranslations('HomePage');
return (
- {t('title')}
+ Image Web Exporter
- {t('subtitle')}
+ Upload a picture, then export it in a different resolution and format.
diff --git a/src/app/[locale]/privacy/page.tsx b/src/app/privacy/page.tsx
similarity index 94%
rename from src/app/[locale]/privacy/page.tsx
rename to src/app/privacy/page.tsx
index c3286e6..8469cdd 100644
--- a/src/app/[locale]/privacy/page.tsx
+++ b/src/app/privacy/page.tsx
@@ -1,18 +1,16 @@
-import Link from "next-intl/link";
+import Link from "next/link";
import { Button } from "@/components/ui/button";
import { ArrowLeft } from "lucide-react";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
-import { useTranslations } from "next-intl";
export default function PrivacyPage() {
- const t = useTranslations("PrivacyPage");
return (
diff --git a/src/components/action-buttons.tsx b/src/components/action-buttons.tsx
index 39ce27d..d314be4 100644
--- a/src/components/action-buttons.tsx
+++ b/src/components/action-buttons.tsx
@@ -4,14 +4,12 @@ import { Button } from "@/components/ui/button";
import { Check, RotateCcw } from "lucide-react";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
import { toast } from "sonner";
-import { useTranslations } from "next-intl";
interface ActionButtonsProps {
onReset: () => void;
}
export function ActionButtons({ onReset }: ActionButtonsProps) {
- const t = useTranslations("ActionButtons");
const handleApply = () => {
toast.info("Settings updated and will be used for all downloads.");
};
@@ -22,18 +20,18 @@ export function ActionButtons({ onReset }: ActionButtonsProps) {
- {t('resetTooltip')}
+ Reset all settings to their default values.
- {t('applyTooltip')}
+ Confirm and apply all the settings above. This does not download the images.
diff --git a/src/components/footer.tsx b/src/components/footer.tsx
index ca163b9..e63ab3a 100644
--- a/src/components/footer.tsx
+++ b/src/components/footer.tsx
@@ -1,13 +1,9 @@
-"use client";
-
-import Link from "next-intl/link";
+import Link from "next/link";
import { Github, Twitter } from "lucide-react";
import { Button } from "@/components/ui/button";
import { changelogData } from "@/lib/changelog-data";
-import { useTranslations } from "next-intl";
export function Footer() {
- const t = useTranslations("Footer");
const latestVersion = changelogData[0]?.version;
return (
@@ -31,8 +27,8 @@ export function Footer() {
-
{t('imprint')}
-
{t('privacy')}
+
Imprint
+
Privacy
{latestVersion && (
-
+
onFilenameChange(index, e.target.value)}
className="text-sm font-medium h-8 mt-1"
/>
-
- {finalNameText}
+
+ Final name: {finalFilename}.{settings.format}
@@ -61,7 +58,7 @@ export function ImageListItem({
-
{t('downloadTooltip')}
+
Download this image
@@ -75,7 +72,7 @@ export function ImageListItem({
- {t('removeTooltip')}
+ Remove this image
diff --git a/src/components/image-list.tsx b/src/components/image-list.tsx
index 7f2864a..4775dc6 100644
--- a/src/components/image-list.tsx
+++ b/src/components/image-list.tsx
@@ -6,7 +6,6 @@ import { Button } from "@/components/ui/button";
import { Download, Trash2 } from "lucide-react";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
import { ImageListItem } from "./image-list-item";
-import { useTranslations } from "next-intl";
interface ImageListProps {
images: ImageFile[];
@@ -31,8 +30,6 @@ export function ImageList({
isConverting,
convertingIndex,
}: ImageListProps) {
- const t = useTranslations("ImageList");
-
if (images.length === 0) {
return null;
}
@@ -44,24 +41,24 @@ export function ImageList({
-
{t('title')}
+
Uploaded Images
- {t('clearAllTooltip')}
+ Remove all uploaded images.
- {t('downloadAllTooltip')}
+ Convert and download all images with the current settings.
diff --git a/src/components/image-upload-area.tsx b/src/components/image-upload-area.tsx
index 474db5a..e140751 100644
--- a/src/components/image-upload-area.tsx
+++ b/src/components/image-upload-area.tsx
@@ -5,14 +5,12 @@ import { Input } from "@/components/ui/input";
import { Upload } from "lucide-react";
import { cn } from "@/lib/utils";
import { Card, CardContent } from "./ui/card";
-import { useTranslations } from "next-intl";
interface ImageUploadAreaProps {
onFilesSelected: (files: FileList | null) => void;
}
export function ImageUploadArea({ onFilesSelected }: ImageUploadAreaProps) {
- const t = useTranslations("ImageUploadArea");
const [isDraggingOver, setIsDraggingOver] = useState(false);
const fileInputRef = useRef(null);
@@ -41,7 +39,7 @@ export function ImageUploadArea({ onFilesSelected }: ImageUploadAreaProps) {
-
{t('title')}
+
Upload Images
-
{t('prompt')}
-
{t('supportedFormats')}
+
Click or drag and drop to upload
+
PNG, JPG, WEBP supported
diff --git a/src/components/settings-panel.tsx b/src/components/settings-panel.tsx
index f6cef9f..0839932 100644
--- a/src/components/settings-panel.tsx
+++ b/src/components/settings-panel.tsx
@@ -5,7 +5,6 @@ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/
import { ImageSettings } from "./settings/image-settings";
import { FilenameSettings } from "./settings/filename-settings";
import { QualitySettings } from "./settings/quality-settings";
-import { useTranslations } from "next-intl";
interface SettingsPanelProps {
settings: ConversionSettings;
@@ -24,14 +23,13 @@ export function SettingsPanel({
onApplyDefaultBaseNameToAll,
hasImages,
}: SettingsPanelProps) {
- const t = useTranslations("SettingsPanel");
return (
-
{t('imageSettingsTitle')}
-
{t('imageSettingsSubtitle')}
+
Image Settings
+
Adjust resolution and scaling for all images.
@@ -47,8 +45,8 @@ export function SettingsPanel({
-
{t('filenameSettingsTitle')}
-
{t('filenameSettingsSubtitle')}
+
Filename Settings
+
Customize the output filenames.
@@ -64,8 +62,8 @@ export function SettingsPanel({
-
{t('qualitySettingsTitle')}
-
{t('qualitySettingsSubtitle')}
+
Quality Settings
+
Choose format and compression level.
diff --git a/src/components/settings/filename-settings.tsx b/src/components/settings/filename-settings.tsx
index a9d9894..5c7e62f 100644
--- a/src/components/settings/filename-settings.tsx
+++ b/src/components/settings/filename-settings.tsx
@@ -7,7 +7,6 @@ import { Button } from "@/components/ui/button";
import { Switch } from "@/components/ui/switch";
import { HelpCircle } from "lucide-react";
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
-import { useTranslations } from "next-intl";
interface FilenameSettingsProps {
settings: ConversionSettings;
@@ -22,22 +21,21 @@ export function FilenameSettings({
onApplyDefaultBaseNameToAll,
hasImages,
}: FilenameSettingsProps) {
- const t = useTranslations("FilenameSettings");
return (
onSettingsChange({ useDefaultBaseName: checked })} />
{settings.useDefaultBaseName && (
-
+
-
{t('applyToAllTooltip')}
+
Apply this base name to all currently uploaded images.
)}
-
+
- {t('prefixTooltip')}
+ Add text to the beginning of every filename.
onSettingsChange({ prefix: e.target.value })} />
-
+
- {t('suffixTooltip')}
+ Add text to the end of every filename (before the number).
onSettingsChange({ suffix: e.target.value })} />
@@ -79,10 +77,10 @@ export function FilenameSettings({
onSettingsChange({ useCounter: checked })} />
@@ -90,10 +88,10 @@ export function FilenameSettings({
-
+
- {t('startNumberTooltip')}
+ The first number to use in the sequence.
-
+
- {t('paddingDigitsTooltip')}
+ Total number of digits for the counter, padded with leading zeros (e.g., 3 for 001).
-
+
- {t('aspectRatioTooltip')}
+ Choose a preset aspect ratio or select 'Custom' to enter dimensions manually.