From 78dc6333f98dcaf4d07701b6f183e896bee697af Mon Sep 17 00:00:00 2001 From: abdullahalam123 Date: Thu, 11 Dec 2025 19:34:14 +0530 Subject: [PATCH] setup i18n and ported all tools to standalone pages --- Dockerfile | 40 +- README.md | 51 +- TRANSLATION.md | 478 ++++++ about.html | 93 +- contact.html | 55 +- faq.html | 2 +- index.html | 205 +-- licensing.html | 56 +- package-lock.json | 67 +- package.json | 3 + privacy.html | 2 +- public/locales/de/common.json | 275 ++++ public/locales/de/tools.json | 279 ++++ public/locales/en/common.json | 275 ++++ public/locales/en/tools.json | 279 ++++ scripts/check-translations.js | 236 +++ src/js/config/tools.ts | 169 +- src/js/faq.ts | 2 +- src/js/handlers/fileHandler.ts | 16 +- src/js/handlers/toolSelectionHandler.ts | 41 - src/js/i18n/i18n.ts | 154 ++ src/js/i18n/index.ts | 3 + src/js/i18n/language-switcher.ts | 142 ++ src/js/logic/add-attachments-page.ts | 356 +++++ src/js/logic/add-attachments.ts | 212 --- src/js/logic/add-blank-page-page.ts | 234 +++ src/js/logic/add-blank-page.ts | 76 - src/js/logic/add-header-footer.ts | 157 -- src/js/logic/add-page-numbers.ts | 137 -- src/js/logic/add-stamps.ts | 126 +- src/js/logic/add-watermark-page.ts | 220 +++ src/js/logic/add-watermark.ts | 189 --- src/js/logic/alternate-merge-page.ts | 252 +++ src/js/logic/alternate-merge.ts | 150 -- src/js/logic/background-color-page.ts | 104 ++ src/js/logic/bmp-to-pdf-page.ts | 204 +++ src/js/logic/bmp-to-pdf.ts | 68 - src/js/logic/change-background-color.ts | 55 - src/js/logic/change-permissions-page.ts | 286 ++++ src/js/logic/change-permissions.ts | 169 -- src/js/logic/change-text-color.ts | 172 -- src/js/logic/combine-single-page-page.ts | 313 ++++ src/js/logic/combine-single-page.ts | 219 --- src/js/logic/compare-pdfs-page.ts | 306 ++++ src/js/logic/compare-pdfs.ts | 248 --- src/js/logic/compress-pdf-page.ts | 31 +- src/js/logic/crop-pdf-page.ts | 381 +++++ src/js/logic/decrypt-pdf-page.ts | 239 +++ src/js/logic/decrypt.ts | 105 -- src/js/logic/delete-pages-page.ts | 274 ++++ src/js/logic/delete-pages.ts | 111 -- src/js/logic/divide-pages-page.ts | 212 +++ src/js/logic/edit-attachments-page.ts | 365 +++++ src/js/logic/edit-attachments.ts | 218 --- src/js/logic/edit-metadata-page.ts | 373 +++++ src/js/logic/edit-metadata.ts | 93 -- src/js/logic/edit-pdf-page.ts | 51 +- src/js/logic/encrypt-pdf-page.ts | 246 +++ src/js/logic/encrypt.ts | 113 -- src/js/logic/extract-attachments-page.ts | 260 +++ src/js/logic/extract-attachments.ts | 185 --- src/js/logic/extract-pages-page.ts | 209 +++ src/js/logic/extract-pages.ts | 70 - src/js/logic/fix-dimensions.ts | 114 -- src/js/logic/fix-page-size-page.ts | 233 +++ src/js/logic/flatten-pdf-page.ts | 234 +++ src/js/logic/flatten.ts | 86 - src/js/logic/form-filler-page.ts | 255 +++ src/js/logic/form-filler.ts | 106 -- src/js/logic/header-footer-page.ts | 132 ++ src/js/logic/heic-to-pdf-page.ts | 179 +++ src/js/logic/heic-to-pdf.ts | 48 - src/js/logic/image-to-pdf-page.ts | 321 ++++ src/js/logic/image-to-pdf.ts | 168 -- src/js/logic/index.ts | 207 +-- src/js/logic/invert-colors-page.ts | 131 ++ src/js/logic/invert-colors.ts | 68 - src/js/logic/jpg-to-pdf-page.ts | 6 +- src/js/logic/jpg-to-pdf.ts | 107 -- src/js/logic/linearize-pdf-page.ts | 240 +++ src/js/logic/linearize.ts | 123 -- src/js/logic/merge-pdf-page.ts | 29 +- src/js/logic/n-up-pdf-page.ts | 266 ++++ src/js/logic/n-up.ts | 128 -- src/js/logic/ocr-pdf-page.ts | 567 +++++++ src/js/logic/ocr-pdf.ts | 421 ----- src/js/logic/organize-pdf-page.ts | 294 ++++ src/js/logic/organize.ts | 30 - src/js/logic/page-dimensions-page.ts | 359 +++++ src/js/logic/page-dimensions.ts | 258 --- src/js/logic/page-numbers-page.ts | 230 +++ src/js/logic/pdf-to-bmp-page.ts | 179 +++ src/js/logic/pdf-to-bmp.ts | 98 -- src/js/logic/pdf-to-greyscale-page.ts | 206 +++ src/js/logic/pdf-to-greyscale.ts | 69 - src/js/logic/pdf-to-jpg-page.ts | 193 +++ src/js/logic/pdf-to-jpg.ts | 48 - src/js/logic/pdf-to-png-page.ts | 193 +++ src/js/logic/pdf-to-png.ts | 42 - src/js/logic/pdf-to-tiff-page.ts | 190 +++ src/js/logic/pdf-to-tiff.ts | 53 - src/js/logic/pdf-to-webp-page.ts | 193 +++ src/js/logic/pdf-to-webp.ts | 41 - src/js/logic/pdf-to-zip-page.ts | 160 ++ src/js/logic/pdf-to-zip.ts | 26 - src/js/logic/png-to-pdf-page.ts | 248 +++ src/js/logic/png-to-pdf.ts | 40 - src/js/logic/posterize-page.ts | 400 +++++ src/js/logic/posterize.ts | 289 ---- src/js/logic/remove-annotations-page.ts | 176 +++ src/js/logic/remove-annotations.ts | 141 -- src/js/logic/remove-blank-pages-page.ts | 328 ++++ src/js/logic/remove-blank-pages.ts | 176 --- src/js/logic/remove-metadata-page.ts | 203 +++ src/js/logic/remove-metadata.ts | 64 - src/js/logic/remove-restrictions-page.ts | 233 +++ src/js/logic/remove-restrictions.ts | 99 -- src/js/logic/repair-pdf-page.ts | 8 +- src/js/logic/reverse-pages-page.ts | 207 +++ src/js/logic/reverse-pages.ts | 46 - src/js/logic/rotate-pdf-page.ts | 403 +++++ src/js/logic/rotate.ts | 68 - src/js/logic/sanitize-pdf-page.ts | 747 +++++++++ src/js/logic/sanitize-pdf.ts | 587 ------- src/js/logic/scan-to-pdf.ts | 7 +- src/js/logic/shortcuts.ts | 8 +- src/js/logic/sign-pdf-page.ts | 312 ++++ src/js/logic/sign-pdf.ts | 156 -- src/js/logic/split-in-half.ts | 55 - src/js/logic/split-pdf-page.ts | 29 +- src/js/logic/svg-to-pdf-page.ts | 246 +++ src/js/logic/svg-to-pdf.ts | 68 - src/js/logic/text-color-page.ts | 135 ++ src/js/logic/tiff-to-pdf-page.ts | 200 +++ src/js/logic/tiff-to-pdf.ts | 95 -- src/js/logic/txt-to-pdf-page.ts | 465 ++++++ src/js/logic/txt-to-pdf.ts | 436 ----- src/js/logic/view-metadata-page.ts | 364 +++++ src/js/logic/view-metadata.ts | 4 - src/js/logic/webp-to-pdf-page.ts | 248 +++ src/js/logic/webp-to-pdf.ts | 56 - src/js/main.ts | 379 +++-- src/js/ui.ts | 1848 +--------------------- src/js/utils/full-width.ts | 4 +- src/js/utils/helpers.ts | 9 +- src/js/utils/rotation-state.ts | 23 + src/pages/add-attachments.html | 234 +++ src/pages/add-blank-page.html | 229 +++ src/pages/add-stamps.html | 81 +- src/pages/add-watermark.html | 274 ++++ src/pages/alternate-merge.html | 200 +++ src/pages/background-color.html | 204 +++ src/pages/bmp-to-pdf.html | 212 +++ src/pages/bookmark.html | 67 +- src/pages/change-permissions.html | 256 +++ src/pages/combine-single-page.html | 243 +++ src/pages/compare-pdfs.html | 291 ++++ src/pages/compress-pdf.html | 79 +- src/pages/crop-pdf.html | 247 +++ src/pages/decrypt-pdf.html | 200 +++ src/pages/delete-pages.html | 88 ++ src/pages/divide-pages.html | 211 +++ src/pages/edit-attachments.html | 194 +++ src/pages/edit-metadata.html | 254 +++ src/pages/edit-pdf.html | 78 +- src/pages/encrypt-pdf.html | 220 +++ src/pages/extract-attachments.html | 195 +++ src/pages/extract-pages.html | 215 +++ src/pages/fix-page-size.html | 282 ++++ src/pages/flatten-pdf.html | 214 +++ src/pages/form-creator.html | 68 +- src/pages/form-filler.html | 212 +++ src/pages/header-footer.html | 264 ++++ src/pages/heic-to-pdf.html | 212 +++ src/pages/image-to-pdf.html | 212 +++ src/pages/invert-colors.html | 198 +++ src/pages/jpg-to-pdf.html | 82 +- src/pages/json-to-pdf.html | 65 +- src/pages/linearize-pdf.html | 214 +++ src/pages/merge-pdf.html | 81 +- src/pages/n-up-pdf.html | 261 +++ src/pages/ocr-pdf.html | 315 ++++ src/pages/organize-pdf.html | 94 ++ src/pages/page-dimensions.html | 219 +++ src/pages/page-numbers.html | 235 +++ src/pages/pdf-multi-tool.html | 12 +- src/pages/pdf-to-bmp.html | 205 +++ src/pages/pdf-to-greyscale.html | 205 +++ src/pages/pdf-to-jpg.html | 214 +++ src/pages/pdf-to-json.html | 65 +- src/pages/pdf-to-png.html | 214 +++ src/pages/pdf-to-tiff.html | 174 ++ src/pages/pdf-to-webp.html | 215 +++ src/pages/pdf-to-zip.html | 200 +++ src/pages/png-to-pdf.html | 246 +++ src/pages/posterize-pdf.html | 319 ++++ src/pages/remove-annotations.html | 199 +++ src/pages/remove-blank-pages.html | 216 +++ src/pages/remove-metadata.html | 203 +++ src/pages/remove-restrictions.html | 213 +++ src/pages/repair-pdf.html | 84 +- src/pages/reverse-pages.html | 234 +++ src/pages/rotate-pdf.html | 242 +++ src/pages/sanitize-pdf.html | 257 +++ src/pages/sign-pdf.html | 225 +++ src/pages/split-pdf.html | 78 +- src/pages/svg-to-pdf.html | 246 +++ src/pages/table-of-contents.html | 62 +- src/pages/text-color.html | 203 +++ src/pages/tiff-to-pdf.html | 212 +++ src/pages/txt-to-pdf.html | 291 ++++ src/pages/view-metadata.html | 199 +++ src/pages/webp-to-pdf.html | 246 +++ src/tests/add-blank-page.test.ts | 371 ----- src/tests/alternate-merge.test.ts | 170 -- src/tests/remove-blank-pages.test.ts | 204 --- src/tests/reversePages.multi.test.ts | 140 -- src/tests/tools.test.ts | 9 +- src/tests/txt-to-pdf.test.ts | 120 -- terms.html | 2 +- vite.config.ts | 134 +- 221 files changed, 30351 insertions(+), 11131 deletions(-) create mode 100644 TRANSLATION.md create mode 100644 public/locales/de/common.json create mode 100644 public/locales/de/tools.json create mode 100644 public/locales/en/common.json create mode 100644 public/locales/en/tools.json create mode 100755 scripts/check-translations.js delete mode 100644 src/js/handlers/toolSelectionHandler.ts create mode 100644 src/js/i18n/i18n.ts create mode 100644 src/js/i18n/index.ts create mode 100644 src/js/i18n/language-switcher.ts create mode 100644 src/js/logic/add-attachments-page.ts delete mode 100644 src/js/logic/add-attachments.ts create mode 100644 src/js/logic/add-blank-page-page.ts delete mode 100644 src/js/logic/add-blank-page.ts delete mode 100644 src/js/logic/add-header-footer.ts delete mode 100644 src/js/logic/add-page-numbers.ts create mode 100644 src/js/logic/add-watermark-page.ts delete mode 100644 src/js/logic/add-watermark.ts create mode 100644 src/js/logic/alternate-merge-page.ts delete mode 100644 src/js/logic/alternate-merge.ts create mode 100644 src/js/logic/background-color-page.ts create mode 100644 src/js/logic/bmp-to-pdf-page.ts delete mode 100644 src/js/logic/bmp-to-pdf.ts delete mode 100644 src/js/logic/change-background-color.ts create mode 100644 src/js/logic/change-permissions-page.ts delete mode 100644 src/js/logic/change-permissions.ts delete mode 100644 src/js/logic/change-text-color.ts create mode 100644 src/js/logic/combine-single-page-page.ts delete mode 100644 src/js/logic/combine-single-page.ts create mode 100644 src/js/logic/compare-pdfs-page.ts delete mode 100644 src/js/logic/compare-pdfs.ts create mode 100644 src/js/logic/crop-pdf-page.ts create mode 100644 src/js/logic/decrypt-pdf-page.ts delete mode 100644 src/js/logic/decrypt.ts create mode 100644 src/js/logic/delete-pages-page.ts delete mode 100644 src/js/logic/delete-pages.ts create mode 100644 src/js/logic/divide-pages-page.ts create mode 100644 src/js/logic/edit-attachments-page.ts delete mode 100644 src/js/logic/edit-attachments.ts create mode 100644 src/js/logic/edit-metadata-page.ts delete mode 100644 src/js/logic/edit-metadata.ts create mode 100644 src/js/logic/encrypt-pdf-page.ts delete mode 100644 src/js/logic/encrypt.ts create mode 100644 src/js/logic/extract-attachments-page.ts delete mode 100644 src/js/logic/extract-attachments.ts create mode 100644 src/js/logic/extract-pages-page.ts delete mode 100644 src/js/logic/extract-pages.ts delete mode 100644 src/js/logic/fix-dimensions.ts create mode 100644 src/js/logic/fix-page-size-page.ts create mode 100644 src/js/logic/flatten-pdf-page.ts delete mode 100644 src/js/logic/flatten.ts create mode 100644 src/js/logic/form-filler-page.ts delete mode 100644 src/js/logic/form-filler.ts create mode 100644 src/js/logic/header-footer-page.ts create mode 100644 src/js/logic/heic-to-pdf-page.ts delete mode 100644 src/js/logic/heic-to-pdf.ts create mode 100644 src/js/logic/image-to-pdf-page.ts delete mode 100644 src/js/logic/image-to-pdf.ts create mode 100644 src/js/logic/invert-colors-page.ts delete mode 100644 src/js/logic/invert-colors.ts delete mode 100644 src/js/logic/jpg-to-pdf.ts create mode 100644 src/js/logic/linearize-pdf-page.ts delete mode 100644 src/js/logic/linearize.ts create mode 100644 src/js/logic/n-up-pdf-page.ts delete mode 100644 src/js/logic/n-up.ts create mode 100644 src/js/logic/ocr-pdf-page.ts delete mode 100644 src/js/logic/ocr-pdf.ts create mode 100644 src/js/logic/organize-pdf-page.ts delete mode 100644 src/js/logic/organize.ts create mode 100644 src/js/logic/page-dimensions-page.ts delete mode 100644 src/js/logic/page-dimensions.ts create mode 100644 src/js/logic/page-numbers-page.ts create mode 100644 src/js/logic/pdf-to-bmp-page.ts delete mode 100644 src/js/logic/pdf-to-bmp.ts create mode 100644 src/js/logic/pdf-to-greyscale-page.ts delete mode 100644 src/js/logic/pdf-to-greyscale.ts create mode 100644 src/js/logic/pdf-to-jpg-page.ts delete mode 100644 src/js/logic/pdf-to-jpg.ts create mode 100644 src/js/logic/pdf-to-png-page.ts delete mode 100644 src/js/logic/pdf-to-png.ts create mode 100644 src/js/logic/pdf-to-tiff-page.ts delete mode 100644 src/js/logic/pdf-to-tiff.ts create mode 100644 src/js/logic/pdf-to-webp-page.ts delete mode 100644 src/js/logic/pdf-to-webp.ts create mode 100644 src/js/logic/pdf-to-zip-page.ts delete mode 100644 src/js/logic/pdf-to-zip.ts create mode 100644 src/js/logic/png-to-pdf-page.ts delete mode 100644 src/js/logic/png-to-pdf.ts create mode 100644 src/js/logic/posterize-page.ts delete mode 100644 src/js/logic/posterize.ts create mode 100644 src/js/logic/remove-annotations-page.ts delete mode 100644 src/js/logic/remove-annotations.ts create mode 100644 src/js/logic/remove-blank-pages-page.ts delete mode 100644 src/js/logic/remove-blank-pages.ts create mode 100644 src/js/logic/remove-metadata-page.ts delete mode 100644 src/js/logic/remove-metadata.ts create mode 100644 src/js/logic/remove-restrictions-page.ts delete mode 100644 src/js/logic/remove-restrictions.ts create mode 100644 src/js/logic/reverse-pages-page.ts delete mode 100644 src/js/logic/reverse-pages.ts create mode 100644 src/js/logic/rotate-pdf-page.ts delete mode 100644 src/js/logic/rotate.ts create mode 100644 src/js/logic/sanitize-pdf-page.ts delete mode 100644 src/js/logic/sanitize-pdf.ts create mode 100644 src/js/logic/sign-pdf-page.ts delete mode 100644 src/js/logic/sign-pdf.ts delete mode 100644 src/js/logic/split-in-half.ts create mode 100644 src/js/logic/svg-to-pdf-page.ts delete mode 100644 src/js/logic/svg-to-pdf.ts create mode 100644 src/js/logic/text-color-page.ts create mode 100644 src/js/logic/tiff-to-pdf-page.ts delete mode 100644 src/js/logic/tiff-to-pdf.ts create mode 100644 src/js/logic/txt-to-pdf-page.ts delete mode 100644 src/js/logic/txt-to-pdf.ts create mode 100644 src/js/logic/view-metadata-page.ts delete mode 100644 src/js/logic/view-metadata.ts create mode 100644 src/js/logic/webp-to-pdf-page.ts delete mode 100644 src/js/logic/webp-to-pdf.ts create mode 100644 src/js/utils/rotation-state.ts create mode 100644 src/pages/add-attachments.html create mode 100644 src/pages/add-blank-page.html create mode 100644 src/pages/add-watermark.html create mode 100644 src/pages/alternate-merge.html create mode 100644 src/pages/background-color.html create mode 100644 src/pages/bmp-to-pdf.html create mode 100644 src/pages/change-permissions.html create mode 100644 src/pages/combine-single-page.html create mode 100644 src/pages/compare-pdfs.html create mode 100644 src/pages/crop-pdf.html create mode 100644 src/pages/decrypt-pdf.html create mode 100644 src/pages/delete-pages.html create mode 100644 src/pages/divide-pages.html create mode 100644 src/pages/edit-attachments.html create mode 100644 src/pages/edit-metadata.html create mode 100644 src/pages/encrypt-pdf.html create mode 100644 src/pages/extract-attachments.html create mode 100644 src/pages/extract-pages.html create mode 100644 src/pages/fix-page-size.html create mode 100644 src/pages/flatten-pdf.html create mode 100644 src/pages/form-filler.html create mode 100644 src/pages/header-footer.html create mode 100644 src/pages/heic-to-pdf.html create mode 100644 src/pages/image-to-pdf.html create mode 100644 src/pages/invert-colors.html create mode 100644 src/pages/linearize-pdf.html create mode 100644 src/pages/n-up-pdf.html create mode 100644 src/pages/ocr-pdf.html create mode 100644 src/pages/organize-pdf.html create mode 100644 src/pages/page-dimensions.html create mode 100644 src/pages/page-numbers.html create mode 100644 src/pages/pdf-to-bmp.html create mode 100644 src/pages/pdf-to-greyscale.html create mode 100644 src/pages/pdf-to-jpg.html create mode 100644 src/pages/pdf-to-png.html create mode 100644 src/pages/pdf-to-tiff.html create mode 100644 src/pages/pdf-to-webp.html create mode 100644 src/pages/pdf-to-zip.html create mode 100644 src/pages/png-to-pdf.html create mode 100644 src/pages/posterize-pdf.html create mode 100644 src/pages/remove-annotations.html create mode 100644 src/pages/remove-blank-pages.html create mode 100644 src/pages/remove-metadata.html create mode 100644 src/pages/remove-restrictions.html create mode 100644 src/pages/reverse-pages.html create mode 100644 src/pages/rotate-pdf.html create mode 100644 src/pages/sanitize-pdf.html create mode 100644 src/pages/sign-pdf.html create mode 100644 src/pages/svg-to-pdf.html create mode 100644 src/pages/text-color.html create mode 100644 src/pages/tiff-to-pdf.html create mode 100644 src/pages/txt-to-pdf.html create mode 100644 src/pages/view-metadata.html create mode 100644 src/pages/webp-to-pdf.html delete mode 100644 src/tests/add-blank-page.test.ts delete mode 100644 src/tests/alternate-merge.test.ts delete mode 100644 src/tests/remove-blank-pages.test.ts delete mode 100644 src/tests/reversePages.multi.test.ts delete mode 100644 src/tests/txt-to-pdf.test.ts diff --git a/Dockerfile b/Dockerfile index 1e2290f..5aa995b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,9 +6,11 @@ RUN npm ci COPY . . # Build without type checking (vite build only) -# Pass SIMPLE_MODE environment variable if provided +# Pass SIMPLE_MODE and BASE_URL environment variables if provided ARG SIMPLE_MODE=false +ARG BASE_URL=/ ENV SIMPLE_MODE=$SIMPLE_MODE +ENV BASE_URL=$BASE_URL RUN npm run build -- --mode production # Production stage @@ -16,10 +18,44 @@ FROM nginxinc/nginx-unprivileged:stable-alpine-slim LABEL org.opencontainers.image.source="https://github.com/alam00000/bentopdf" -COPY --chown=nginx:nginx --from=builder /app/dist /usr/share/nginx/html +ARG BASE_URL=/ +ENV BASE_URL=$BASE_URL + +# Switch to root to create directories and copy files (dont worry guys, its not a security issue as we switch it only for the duration of the build and its needed to create the destination directory based on BASE_URL) +USER root + COPY --chown=nginx:nginx nginx.conf /etc/nginx/nginx.conf + +RUN set -e; \ + SUBDIR=$(echo "${BASE_URL}" | sed 's:^/::; s:/$::'); \ + if [ -z "${SUBDIR}" ] || [ "${SUBDIR}" = "/" ]; then \ + DEST_DIR="/usr/share/nginx/html"; \ + else \ + DEST_DIR="/usr/share/nginx/html/${SUBDIR}"; \ + mkdir -p "${DEST_DIR}"; \ + fi; \ + chown -R nginx:nginx /usr/share/nginx/html; \ + echo "Destination directory: ${DEST_DIR}" + +COPY --chown=nginx:nginx --from=builder /app/dist /tmp/dist + +RUN set -e; \ + SUBDIR=$(echo "${BASE_URL}" | sed 's:^/::; s:/$::'); \ + if [ -z "${SUBDIR}" ] || [ "${SUBDIR}" = "/" ]; then \ + DEST_DIR="/usr/share/nginx/html"; \ + else \ + DEST_DIR="/usr/share/nginx/html/${SUBDIR}"; \ + fi; \ + cp -r /tmp/dist/* "${DEST_DIR}/"; \ + rm -rf /tmp/dist; \ + chown -R nginx:nginx /usr/share/nginx/html; \ + echo "Files copied to: ${DEST_DIR}"; \ + ls -la "${DEST_DIR}" | head -20 + RUN mkdir -p /etc/nginx/tmp && chown -R nginx:nginx /etc/nginx/tmp +USER nginx + EXPOSE 8080 CMD ["nginx", "-g", "daemon off;"] diff --git a/README.md b/README.md index 77d8ba4..e41422b 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,14 @@ --- +## 📢 Join Us on Discord + +[![Discord](https://img.shields.io/badge/Discord-Join%20Server-7289da?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/Bgq3Ay3f2w) + +Have questions, feature requests, or want to chat with the community? Join our Discord server! + +--- + ## 📜 Licensing BentoPDF is dual-licensed: @@ -139,6 +147,19 @@ BentoPDF offers a comprehensive suite of tools to handle all your PDF needs. --- +## 🌍 Translations + +BentoPDF is available in multiple languages: + +| Language | Status | +|----------|--------| +| English | [![English](https://img.shields.io/badge/Complete-green?style=flat-square)](public/locales/en/common.json) | +| German | [![German](https://img.shields.io/badge/In_Progress-yellow?style=flat-square)](public/locales/de/common.json) | + +Want to help translate BentoPDF into your language? Check out our [Translation Guide](TRANSLATION.md)! + +--- + ## 🚀 Getting Started You can run BentoPDF locally for development or personal use. @@ -279,6 +300,34 @@ The website can be accessible at: ```http://localhost:3000/tools/bentopdf/``` The `npm run package` command creates a `dist-{version}.zip` file that you can use for self-hosting. +**Docker Subdirectory Deployment:** + +BentoPDF's Docker image also supports the `BASE_URL` build argument for subdirectory deployments: + +```bash +# Build for subdirectory deployment +docker build --build-arg BASE_URL=/bentopdf/ -t bentopdf . + +# Run the container +docker run -p 3000:8080 bentopdf + +# The app will be accessible at http://localhost:3000/bentopdf/ +``` + +**Combined with Simple Mode:** + +```bash +# Build with both BASE_URL and SIMPLE_MODE +docker build \ + --build-arg BASE_URL=/tools/pdf/ \ + --build-arg SIMPLE_MODE=true \ + -t bentopdf-simple . + +docker run -p 3000:8080 bentopdf-simple +``` + +> **Important**: Always include trailing slashes in `BASE_URL` (e.g., `/bentopdf/` not `/bentopdf`). The default value is `/` for root deployment. + ### 🚀 Run with Docker Compose (Recommended) For a more robust setup with auto-restart capabilities: @@ -437,7 +486,7 @@ BentoPDF was originally built using **HTML**, **CSS**, and **vanilla JavaScript* - **PDF to Office**: Converts PDF files into editable Word, Excel, and PowerPoint formats. - **Office to PDF**: Converts Word, Excel, and PowerPoint documents into optimized PDFs. -Contributions and discussions on the roadmap are welcome! Join the conversation via [Discord](https://discord.gg/AP2Y97juZT). +Contributions and discussions on the roadmap are welcome! Join the conversation via [Discord](https://discord.gg/Bgq3Ay3f2w). --- diff --git a/TRANSLATION.md b/TRANSLATION.md new file mode 100644 index 0000000..f3f3d3b --- /dev/null +++ b/TRANSLATION.md @@ -0,0 +1,478 @@ +# 🌍 Translation Guide for BentoPDF + +This guide will help you add new languages or improve existing translations for BentoPDF. + +## Table of Contents + +- [Overview](#overview) +- [Quick Start](#quick-start) +- [Adding a New Language](#adding-a-new-language) +- [Translation File Structure](#translation-file-structure) +- [Where Translations Are Used](#where-translations-are-used) +- [Testing Your Translations](#testing-your-translations) +- [Translation Guidelines](#translation-guidelines) +- [Common Issues](#common-issues) + +--- + +## Overview + +BentoPDF uses **i18next** for internationalization (i18n). Currently supported languages: + +- **English** (`en`) - Default +- **German** (`de`) + +The app automatically detects the language from the URL path: +- `/en/` → English +- `/de/` → German + +--- + +## Quick Start + +**To improve existing translations:** + +1. Navigate to `public/locales/{language}/common.json` +2. Find the key you want to update +3. Change the translation value +4. Save and test + +**To add a new language (e.g., Spanish):** + +1. Copy `public/locales/en/common.json` to `public/locales/es/common.json` +2. Translate all values in `es/common.json` +3. Add Spanish to `supportedLanguages` in `src/js/i18n/i18n.ts` +4. Add Spanish name to `languageNames` in `src/js/i18n/i18n.ts` +5. Test thoroughly + +--- + +## Adding a New Language + +Let's add **French** as an example: + +### Step 1: Create Translation File + +```bash +# Create the directory +mkdir -p public/locales/fr + +# Copy the English template +cp public/locales/en/common.json public/locales/fr/common.json +``` + +### Step 2: Translate the JSON File + +Open `public/locales/fr/common.json` and translate all the values: + +```json +{ + "nav": { + "home": "Accueil", + "about": "À propos", + "contact": "Contact", + "allTools": "Tous les outils" + }, + "hero": { + "title": "Votre boîte à outils PDF gratuite et sécurisée", + "subtitle": "Fusionnez, divisez, compressez et modifiez des PDF directement dans votre navigateur." + } + // ... continue translating all keys +} +``` + +⚠️ **Important**: Only translate the **values**, NOT the keys! + +✅ **Correct:** +```json +"home": "Accueil" +``` + +❌ **Wrong:** +```json +"accueil": "Accueil" +``` + +### Step 3: Register the Language + +Edit `src/js/i18n/i18n.ts`: + +```typescript +// Add 'fr' to supported languages +export const supportedLanguages = ['en', 'de', 'fr'] as const; +export type SupportedLanguage = (typeof supportedLanguages)[number]; + +// Add French display name +export const languageNames: Record = { + en: 'English', + de: 'Deutsch', + fr: 'Français', // ← Add this +}; +``` + +### Step 4: Test Your Translation + +```bash +# Start the dev server +npm run dev + +# Visit the French version +# http://localhost:5173/fr/ +``` + +--- + +## Translation File Structure + +The `common.json` file is organized into logical sections: + +```json +{ + "nav": { + // Navigation menu items + }, + "hero": { + // Homepage hero section + }, + "features": { + // Features section + }, + "tools": { + // Tool names and descriptions + }, + "upload": { + // File upload UI + }, + "settings": { + // Settings modal and keyboard shortcuts + }, + "faq": { + // FAQ section + }, + "footer": { + // Footer links and text + }, + "compliance": { + // Security compliance information + }, + "testimonials": { + // User testimonials + }, + "support": { + // Support section + }, + "alert": { + // Alert and error messages + } +} +``` + +### Key Naming Convention + +- Use **camelCase** for keys: `"deletePage"` not `"delete_page"` +- Use **nested objects** for organization: `"nav.home"` is represented as: + ```json + { + "nav": { + "home": "Home" + } + } + ``` +- Be descriptive: `"shortcutsWarning"` is better than `"warning1"` + +--- + +## Where Translations Are Used + +### 1. HTML Templates (`data-i18n` attribute) + +```html + +Home +``` + +The `data-i18n` attribute tells i18next which translation to use. + +### 2. Tool Definitions + +Tool names and descriptions are defined in `src/js/config/tools.ts` and use a special namespace: + +```typescript +{ + name: 'Merge PDF', // Used for shortcuts only + subtitle: 'Combine multiple PDFs into one file.', +} +``` + +In translations: +```json +{ + "tools": { + "mergePdf": { + "name": "PDF zusammenführen", + "subtitle": "Mehrere PDFs in eine Datei kombinieren." + } + } +} +``` + +### 3. Dynamic JavaScript (`t()` function) + +For translations that need to be applied dynamically: + +```typescript +import { t } from './i18n/i18n'; + +const message = t('alert.error'); +console.log(message); // "Error" or "Fehler" depending on language +``` + +### 4. Placeholders + +For input placeholders: + +```html + +``` + +In `common.json`: +```json +{ + "tools": { + "searchPlaceholder": "Nach einem Tool suchen..." + } +} +``` + +--- + +## Testing Your Translations + +### Manual Testing + +1. **Start development server:** + ```bash + npm run dev + ``` + +2. **Visit each language:** + - English: `http://localhost:5173/en/` + - German: `http://localhost:5173/de/` + - Your new language: `http://localhost:5173/fr/` + +3. **Check these pages:** + - Homepage (`/`) + - About page (`/about.html`) + - Contact page (`/contact.html`) + - FAQ page (`/faq.html`) + - Tool pages (e.g., `/merge-pdf.html`) + +4. **Test these interactions:** + - Click the language switcher in the footer + - Navigate between pages + - Open the settings modal (click gear icon next to search) + - Try a tool to see upload messages + +### Automated Checks + +Check for missing translations: + +```bash +# This will show any missing keys +node scripts/check-translations.js +``` + +*(If this script doesn't exist, you may need to create it or manually compare JSON files)* + +### Browser Testing + +Test in different browsers: +- Chrome/Edge +- Firefox +- Safari + +--- + +## Translation Guidelines + +### 1. Keep the Tone Consistent + +BentoPDF is **friendly, clear, and professional**. Match this tone in your translations. + +✅ **Good:** +```json +"hero.title": "Ihr kostenloses und sicheres PDF-Toolkit" +``` + +❌ **Too formal:** +```json +"hero.title": "Ihr gebührenfreies und gesichertes Werkzeug für PDF-Dokumente" +``` + +### 2. Preserve Formatting + +Some strings contain HTML or special characters: + +```json +{ + "faq.analytics.answer": "We care about your privacy. BentoPDF does not track personal information. We use Simple Analytics solely to see anonymous visit counts." +} +``` + +When translating, **keep the HTML tags intact**: + +```json +{ + "faq.analytics.answer": "Wir schätzen Ihre Privatsphäre. BentoPDF verfolgt keine persönlichen Informationen. Wir verwenden Simple Analytics ausschließlich, um anonyme Besucherzahlen zu sehen." +} +``` + +### 3. Handle Plurals and Gender + +If your language has complex plural rules or gender distinctions, consult the [i18next pluralization guide](https://www.i18next.com/translation-function/plurals). + +Example: +```json +{ + "pages": "page", + "pages_plural": "pages" +} +``` + +### 4. Don't Translate Brand Names or Legal Terms + +Keep these as-is: +- BentoPDF +- PDF +- GitHub +- Discord +- Chrome, Firefox, Safari, etc. +- Terms and Conditions +- Privacy Policy +- Licensing + +### 5. Technical Terms + +For technical terms, use commonly accepted translations in your language: +- "Merge" → "Fusionner" (French), "Zusammenführen" (German) +- "Split" → "Diviser" (French), "Teilen" (German) +- "Compress" → "Compresser" (French), "Komprimieren" (German) + +If unsure, check how other PDF tools translate these terms in your language. + +### 6. String Length + +Some UI elements have limited space. Try to keep translations **similar in length** to the English version. + +If a translation is much longer, test it visually to ensure it doesn't break the layout. + +--- + +## Common Issues + +### Issue: Translations Not Showing Up + +**Solution:** +1. Clear your browser cache +2. Hard refresh (Ctrl+F5 or Cmd+Shift+R) +3. Check browser console for errors +4. Verify the JSON file is valid (no syntax errors) + +### Issue: Some Text Still in English + +**Possible causes:** +1. Missing translation key in your language file +2. Missing `data-i18n` attribute in HTML +3. Hardcoded text in JavaScript + +**Solution:** +- Compare your language file with `en/common.json` to find missing keys +- Search the codebase for hardcoded strings + +### Issue: JSON Syntax Error + +**Symptoms:** +``` +SyntaxError: Unexpected token } in JSON at position 1234 +``` + +**Solution:** +- Use a JSON validator: https://jsonlint.com/ +- Common mistakes: + - Trailing comma after last item + - Missing or extra quotes + - Unescaped quotes inside strings (use `\"`) + +### Issue: Language Switcher Not Showing New Language + +**Solution:** +Make sure you added the language to both arrays in `i18n.ts`: +```typescript +export const supportedLanguages = ['en', 'de', 'fr']; // ← Add here +export const languageNames = { + en: 'English', + de: 'Deutsch', + fr: 'Français', // ← And here +}; +``` + +--- + +## File Checklist + +When adding a new language, make sure these files are updated: + +- [ ] `public/locales/{lang}/common.json` - Main translation file +- [ ] `src/js/i18n/i18n.ts` - Add to `supportedLanguages` and `languageNames` +- [ ] Test all pages: homepage, about, contact, FAQ, tool pages +- [ ] Test settings modal and shortcuts +- [ ] Test language switcher in footer +- [ ] Verify URL routing works (`/{lang}/`) + +--- + +## Getting Help + +If you have questions or need help: + +1. Check existing translations in `public/locales/de/common.json` for reference +2. Open an issue on [GitHub](https://github.com/alam00000/bentopdf/issues) +3. Join our [Discord server](https://discord.gg/Bgq3Ay3f2w) + +--- + +## Contributing Your Translation + +Once you've completed a translation: + +1. **Test thoroughly** (see [Testing Your Translations](#testing-your-translations)) +2. **Fork the repository** on GitHub +3. **Create a new branch**: `git checkout -b add-french-translation` +4. **Commit your changes**: `git commit -m "Add French translation"` +5. **Push to your fork**: `git push origin add-french-translation` +6. **Open a Pull Request** with: + - Description of the language added + - Screenshots showing the translation in action + - Confirmation that you've tested all pages + +Thank you for contributing to BentoPDF! 🎉 + +--- + +## Translation Progress + +Current translation coverage: + +| Language | Code | Status | Maintainer | +|----------|------|--------|------------| +| English | `en` | ✅ Complete | Core team | +| German | `de` | 🚧 In Progress | Core team | +| Your Language | `??` | 🚧 In Progress | You? | + +--- + +**Last Updated**: December 2025 diff --git a/about.html b/about.html index 3aca48d..58c60c2 100644 --- a/about.html +++ b/about.html @@ -5,6 +5,9 @@ About Bentopdf - Fast, Private, and Free PDF Tools + + + @@ -24,11 +27,11 @@ @@ -55,11 +58,11 @@ @@ -67,10 +70,10 @@

- We believe PDF tools should be - fast, private, and free. + We believe PDF tools should be + fast, private, and free.

-

No compromises.

+

No compromises.

@@ -78,10 +81,10 @@
-

+

Our Mission

-

+

To provide the most comprehensive PDF toolbox that respects your privacy and never asks for payment. We believe essential document tools should be accessible to everyone, everywhere, without @@ -93,11 +96,12 @@

- Our Core Philosophy -

+ Our Core + Philosophy +

Privacy First. Always.

-

+

In an era where data is a commodity, we take a different approach. All processing for Bentopdf tools happens locally in your browser. This means your files never touch our servers, we never see your @@ -118,14 +122,14 @@

- Why Bentopdf? + Why Bentopdf?

-

Built for Speed

-

+

Built for Speed

+

No waiting for uploads or downloads to a server. By processing files directly in your browser using modern web technologies like WebAssembly, we offer unparalleled speed for all our tools. @@ -135,8 +139,8 @@

-

Completely Free

-

+

Completely Free

+

No trials, no subscriptions, no hidden fees, and no "premium" features held hostage. We believe powerful PDF tools should be a public utility, not a profit center. @@ -146,8 +150,9 @@

-

No Account Required

-

+

No Account Required +

+

Start using any tool immediately. We don't need your email, a password, or any personal information. Your workflow should be frictionless and anonymous. @@ -157,8 +162,9 @@

-

Open Source Spirit

-

+

Open Source Spirit +

+

Built with transparency in mind. We leverage incredible open-source libraries like PDF-lib and PDF.js, and believe in the community-driven effort to make powerful tools accessible to @@ -172,16 +178,17 @@

-

+

Ready to get started?

-

+

Join thousands of users who trust Bentopdf for their daily document needs. Experience the difference that privacy and performance can make.

+ class="inline-block px-8 py-3 rounded-full bg-gradient-to-b from-indigo-500 to-indigo-600 text-white font-semibold focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-900 focus:ring-indigo-400 hover:shadow-xl hover:shadow-indigo-500/30 transition-all duration-200 transform hover:-translate-y-1" + data-i18n="about.cta.button"> Explore All Tools
@@ -195,46 +202,47 @@ Bento PDF Logo BentoPDF
-

+

© 2025 BentoPDF. All rights reserved.

- Version + Version

-

Company

+

Company

-

Follow Us

+

Follow Us

@@ -244,7 +252,7 @@ clip-rule="evenodd" /> - Contact Us - BentoPDF + + + @@ -24,11 +27,11 @@ @@ -55,21 +58,21 @@
-

+

Get in Touch

-

+

We'd love to hear from you. Whether you have a question, feedback, or a feature request, please don't hesitate to reach out.

@@ -77,7 +80,7 @@

- You can reach us directly by email at: + You can reach us directly by email at: contact@bentopdf.com

@@ -92,46 +95,47 @@ Bento PDF Logo BentoPDF
-

+

© 2025 BentoPDF. All rights reserved.

- Version + Version

-

Company

+

Company

-

Follow Us

+

Follow Us

@@ -141,7 +145,7 @@ clip-rule="evenodd" /> - - BentoPDF - The Privacy First PDF Toolkit + + + + - @@ -25,11 +28,11 @@
- Start Using Now + Start Using Now @@ -141,7 +146,8 @@
-

Used by companies and people working at

+

Used by companies and + people working at

@@ -200,58 +206,61 @@

- Why BentoPDF? + Why BentoPDF?

-

No Signup

+

No Signup

-

+

Start instantly, no accounts or emails.

-

No Uploads

+

No Uploads

-

+

100% client-side, your files never leave your device.

-

Forever Free

+

Forever Free

-

+

All tools, no trials, no paywalls.

-

No Limits

+

No Limits

-

+

Use as much as you want, no hidden caps.

-

Batch Processing

+

Batch Processing

-

Handle unlimited PDFs in one go.

+

Handle unlimited PDFs in one + go. +

-

Lightning Fast

+

Lightning Fast

-

+

Process PDFs instantly, without waiting or delays.

@@ -262,9 +271,10 @@

- Get Started with Tools + Get Started with Tools

-

Click a tool to open the file uploader

+

Click a tool to open the file uploader

@@ -275,7 +285,8 @@ + placeholder="Search for a tool (e.g., 'split', 'organize'...)" + data-i18n-placeholder="tools.searchPlaceholder" /> @@ -296,7 +307,7 @@
@@ -304,7 +315,7 @@ @@ -399,15 +410,17 @@