Merge branch 'main' into main

This commit is contained in:
zhenyao xu
2025-12-12 19:14:25 +00:00
committed by GitHub
81 changed files with 658 additions and 17 deletions

View File

@@ -155,6 +155,7 @@ BentoPDF is available in multiple languages:
|----------|--------|
| 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) |
| Vietnamese | [![Vietnamese](https://img.shields.io/badge/Complete-green?style=flat-square)](public/locales/vi/common.json) |
Want to help translate BentoPDF into your language? Check out our [Translation Guide](TRANSLATION.md)!

View File

@@ -21,10 +21,12 @@ BentoPDF uses **i18next** for internationalization (i18n). Currently supported l
- **English** (`en`) - Default
- **German** (`de`)
- **Vietnamese** (`vi`)
The app automatically detects the language from the URL path:
- `/en/` → English
- `/de/` → German
- `/vi/` → Vietnamese
---
@@ -262,6 +264,7 @@ In `common.json`:
2. **Visit each language:**
- English: `http://localhost:5173/en/`
- German: `http://localhost:5173/de/`
- Vietnamese: `http://localhost:5173/vi/`
- Your new language: `http://localhost:5173/fr/`
3. **Check these pages:**
@@ -471,6 +474,7 @@ Current translation coverage:
|----------|------|--------|------------|
| English | `en` | ✅ Complete | Core team |
| German | `de` | 🚧 In Progress | Core team |
| Vietnamese | `vi` | ✅ Complete | Community |
| Your Language | `??` | 🚧 In Progress | You? |
---

View File

@@ -11,6 +11,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/about.html" />
<link rel="alternate" hreflang="de" href="/de/about.html" />
<link rel="alternate" hreflang="vi" href="/vi/about.html" />
<link rel="alternate" hreflang="x-default" href="/en/about.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -11,6 +11,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/contact.html" />
<link rel="alternate" hreflang="de" href="/de/contact.html" />
<link rel="alternate" hreflang="vi" href="/vi/contact.html" />
<link rel="alternate" hreflang="x-default" href="/en/contact.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -9,6 +9,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/" />
<link rel="alternate" hreflang="de" href="/de/" />
<link rel="alternate" hreflang="vi" href="/vi/" />
<link rel="alternate" hreflang="x-default" href="/en/" />
<link rel="icon" type="image/svg+xml" href="images/favicon.svg" />
<link rel="icon" type="image/png" href="images/favicon.png" />
@@ -207,7 +208,7 @@
<section id="features-section" class="py-20">
<h2 class="text-3xl md:text-4xl font-bold text-center text-white mb-12">
<span data-i18n="features.title"></span>Why</span> <span class="marker-slanted"
<span data-i18n="features.title"></span> <span class="marker-slanted"
data-i18n="features.bentoPdf">BentoPDF?</span>
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
@@ -494,7 +495,7 @@
<section id="security-compliance-section" class="py-20 hide-section">
<div class="mb-8 text-center">
<h2 class="text-3xl md:text-4xl lg:text-5xl font-bold text-white leading-tight mb-6 text-balance">
<span data-i18n="compliance.title"></span>Your data never leaves your device</span>
<span data-i18n="compliance.title"></span>
<span class="inline-flex items-center gap-2">
<i data-lucide="shield" class="w-8 h-8 md:w-10 md:h-10 text-indigo-400 bg-indigo-900 rounded-lg p-1.5"></i>
<span data-i18n="compliance.weKeep">We keep</span>

View File

@@ -11,6 +11,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/licensing.html" />
<link rel="alternate" hreflang="de" href="/de/licensing.html" />
<link rel="alternate" hreflang="vi" href="/vi/licensing.html" />
<link rel="alternate" hreflang="x-default" href="/en/licensing.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "bento-pdf",
"version": "1.10.5",
"version": "1.11.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "bento-pdf",
"version": "1.10.5",
"version": "1.11.1",
"license": "Apache-2.0",
"dependencies": {
"@fontsource/cedarville-cursive": "^5.2.7",

View File

@@ -22,7 +22,7 @@
},
"features": {
"title": "Warum",
"bentoPdf": "BentoPDF?",
"bentoPdf": "BentoPDF wählen?",
"noSignup": {
"title": "Keine Anmeldung",
"description": "Sofort starten, keine Konten oder E-Mails erforderlich."

View File

@@ -21,7 +21,7 @@
"title": "Used by companies and people working at"
},
"features": {
"title": "Why",
"title": "Why choose",
"bentoPdf": "BentoPDF?",
"noSignup": {
"title": "No Signup",

View File

@@ -0,0 +1,276 @@
{
"nav": {
"home": "Trang chủ",
"about": "Giới thiệu",
"contact": "Liên hệ",
"licensing": "Giấy phép",
"allTools": "Tất cả công cụ",
"openMainMenu": "Mở menu chính",
"language": "Ngôn ngữ"
},
"hero": {
"title": "Bộ công cụ",
"pdfToolkit": "PDF",
"builtForPrivacy": "an toàn và riêng tư",
"noSignups": "Không cần đăng ký",
"unlimitedUse": "Sử dụng không giới hạn",
"worksOffline": "Hoạt động offline",
"startUsing": "Bắt đầu sử dụng ngay"
},
"usedBy": {
"title": "Được sử dụng bởi các công ty và những người làm việc tại"
},
"features": {
"title": "Tại sao chọn",
"bentoPdf": "BentoPDF?",
"noSignup": {
"title": "Không cần đăng ký",
"description": "Bắt đầu ngay lập tức, không cần tài khoản hay email."
},
"noUploads": {
"title": "Không tải lên",
"description": "100% xử lý phía máy khách, tệp của bạn không bao giờ rời khỏi thiết bị."
},
"foreverFree": {
"title": "Miễn phí mãi mãi",
"description": "Tất cả công cụ, không dùng thử, không có tường phí."
},
"noLimits": {
"title": "Không giới hạn",
"description": "Sử dụng bao nhiêu tùy thích, không có giới hạn ẩn."
},
"batchProcessing": {
"title": "Xử lý hàng loạt",
"description": "Xử lý không giới hạn PDF trong một lần."
},
"lightningFast": {
"title": "Cực kỳ nhanh",
"description": "Xử lý PDF ngay lập tức, không cần chờ đợi hay trì hoãn."
}
},
"tools": {
"title": "Bắt đầu với",
"toolsLabel": "Công cụ",
"subtitle": "Nhấp vào một công cụ để mở trình tải tệp lên",
"searchPlaceholder": "Tìm kiếm công cụ (ví dụ: 'chia', 'sắp xếp'...)",
"backToTools": "Quay lại Công cụ"
},
"upload": {
"clickToSelect": "Nhấp để chọn tệp",
"orDragAndDrop": "hoặc kéo và thả",
"pdfOrImages": "PDF hoặc Hình ảnh",
"filesNeverLeave": "Tệp của bạn không bao giờ rời khỏi thiết bị.",
"addMore": "Thêm tệp",
"clearAll": "Xóa tất cả"
},
"loader": {
"processing": "Đang xử lý..."
},
"alert": {
"title": "Thông báo",
"ok": "OK"
},
"preview": {
"title": "Xem trước tài liệu",
"downloadAsPdf": "Tải xuống dưới dạng PDF",
"close": "Đóng"
},
"settings": {
"title": "Cài đặt",
"shortcuts": "Phím tắt",
"preferences": "Tùy chọn",
"displayPreferences": "Tùy chọn hiển thị",
"searchShortcuts": "Tìm kiếm phím tắt...",
"shortcutsInfo": "Nhấn và giữ phím để đặt phím tắt. Thay đổi được lưu tự động.",
"shortcutsWarning": "⚠️ Tránh các phím tắt trình duyệt phổ biến (Cmd/Ctrl+W, Cmd/Ctrl+T, Cmd/Ctrl+N, v.v.) vì chúng có thể không hoạt động đáng tin cậy.",
"import": "Nhập",
"export": "Xuất",
"resetToDefaults": "Đặt lại về mặc định",
"fullWidthMode": "Chế độ toàn chiều rộng",
"fullWidthDescription": "Sử dụng toàn bộ chiều rộng màn hình cho tất cả công cụ thay vì container căn giữa",
"settingsAutoSaved": "Cài đặt được lưu tự động",
"clickToSet": "Nhấp để đặt",
"pressKeys": "Nhấn phím...",
"warnings": {
"alreadyInUse": "Phím tắt đã được sử dụng",
"assignedTo": "đã được gán cho:",
"chooseDifferent": "Vui lòng chọn một phím tắt khác.",
"reserved": "Cảnh báo phím tắt dành riêng",
"commonlyUsed": "thường được sử dụng cho:",
"unreliable": "Phím tắt này có thể không hoạt động đáng tin cậy hoặc có thể xung đột với hành vi trình duyệt/hệ thống.",
"useAnyway": "Bạn có muốn sử dụng nó không?",
"resetTitle": "Đặt lại phím tắt",
"resetMessage": "Bạn có chắc chắn muốn đặt lại tất cả phím tắt về mặc định?<br><br>Hành động này không thể hoàn tác.",
"importSuccessTitle": "Nhập thành công",
"importSuccessMessage": "Đã nhập phím tắt thành công!",
"importFailTitle": "Nhập thất bại",
"importFailMessage": "Không thể nhập phím tắt. Định dạng tệp không hợp lệ."
}
},
"warning": {
"title": "Cảnh báo",
"cancel": "Hủy",
"proceed": "Tiếp tục"
},
"compliance": {
"title": "Dữ liệu của bạn không bao giờ rời khỏi thiết bị",
"weKeep": "Chúng tôi giữ",
"yourInfoSafe": "thông tin của bạn an toàn",
"byFollowingStandards": "bằng cách tuân theo các tiêu chuẩn bảo mật toàn cầu.",
"processingLocal": "Tất cả quá trình xử lý diễn ra cục bộ trên thiết bị của bạn.",
"gdpr": {
"title": "Tuân thủ GDPR",
"description": "Bảo vệ dữ liệu cá nhân và quyền riêng tư của các cá nhân trong Liên minh Châu Âu."
},
"ccpa": {
"title": "Tuân thủ CCPA",
"description": "Trao quyền cho cư dân California về cách thông tin cá nhân của họ được thu thập, sử dụng và chia sẻ."
},
"hipaa": {
"title": "Tuân thủ HIPAA",
"description": "Đặt ra các biện pháp bảo vệ để xử lý thông tin sức khỏe nhạy cảm trong hệ thống chăm sóc sức khỏe Hoa Kỳ."
}
},
"faq": {
"title": "Câu hỏi",
"questions": "Thường gặp",
"isFree": {
"question": "BentoPDF có thực sự miễn phí không?",
"answer": "Có, hoàn toàn miễn phí. Tất cả các công cụ trên BentoPDF đều 100% miễn phí sử dụng, không giới hạn tệp, không cần đăng ký và không có watermark. Chúng tôi tin rằng mọi người đều xứng đáng được tiếp cận với các công cụ PDF đơn giản, mạnh mẽ mà không có tường phí."
},
"areFilesSecure": {
"question": "Tệp của tôi có an toàn không? Chúng được xử lý ở đâu?",
"answer": "Tệp của bạn an toàn nhất có thể vì chúng không bao giờ rời khỏi máy tính của bạn. Tất cả quá trình xử lý diễn ra trực tiếp trong trình duyệt web của bạn (phía máy khách). Chúng tôi không bao giờ tải tệp của bạn lên máy chủ, vì vậy bạn duy trì quyền riêng tư và kiểm soát hoàn toàn đối với tài liệu của mình."
},
"platforms": {
"question": "Nó có hoạt động trên Mac, Windows và Mobile không?",
"answer": "Có! Vì BentoPDF chạy hoàn toàn trong trình duyệt của bạn, nó hoạt động trên bất kỳ hệ điều hành nào có trình duyệt web hiện đại, bao gồm Windows, macOS, Linux, iOS và Android."
},
"gdprCompliant": {
"question": "BentoPDF có tuân thủ GDPR không?",
"answer": "Có. BentoPDF hoàn toàn tuân thủ GDPR. Vì tất cả quá trình xử lý tệp diễn ra cục bộ trong trình duyệt của bạn và chúng tôi không bao giờ thu thập hoặc truyền tệp của bạn đến bất kỳ máy chủ nào, chúng tôi không có quyền truy cập vào dữ liệu của bạn. Điều này đảm bảo bạn luôn kiểm soát tài liệu của mình."
},
"dataStorage": {
"question": "Bạn có lưu trữ hoặc theo dõi bất kỳ tệp nào của tôi không?",
"answer": "Không. Chúng tôi không bao giờ lưu trữ, theo dõi hoặc ghi nhật ký tệp của bạn. Mọi thứ bạn làm trên BentoPDF diễn ra trong bộ nhớ trình duyệt của bạn và biến mất khi bạn đóng trang. Không có tải lên, không có nhật ký lịch sử và không có máy chủ liên quan."
},
"different": {
"question": "Điều gì làm cho BentoPDF khác biệt so với các công cụ PDF khác?",
"answer": "Hầu hết các công cụ PDF tải tệp của bạn lên máy chủ để xử lý. BentoPDF không bao giờ làm điều đó. Chúng tôi sử dụng công nghệ web hiện đại, an toàn để xử lý tệp của bạn trực tiếp trong trình duyệt. Điều này có nghĩa là hiệu suất nhanh hơn, quyền riêng tư mạnh mẽ hơn và hoàn toàn yên tâm."
},
"browserBased": {
"question": "Xử lý dựa trên trình duyệt giữ tôi an toàn như thế nào?",
"answer": "Bằng cách chạy hoàn toàn bên trong trình duyệt của bạn, BentoPDF đảm bảo rằng tệp của bạn không bao giờ rời khỏi thiết bị. Điều này loại bỏ các rủi ro về hack máy chủ, vi phạm dữ liệu hoặc truy cập trái phép. Tệp của bạn vẫn thuộc về bạn—luôn luôn."
},
"analytics": {
"question": "Bạn có sử dụng cookie hoặc phân tích để theo dõi tôi không?",
"answer": "Chúng tôi quan tâm đến quyền riêng tư của bạn. BentoPDF không theo dõi thông tin cá nhân. Chúng tôi chỉ sử dụng Simple Analytics để xem số lượt truy cập ẩn danh. Điều này có nghĩa là chúng tôi có thể biết có bao nhiêu người dùng truy cập trang web của chúng tôi, nhưng chúng tôi không bao giờ biết bạn là ai. Simple Analytics hoàn toàn tuân thủ GDPR và tôn trọng quyền riêng tư của bạn."
}
},
"testimonials": {
"title": "Người dùng",
"users": "của chúng tôi",
"say": "nói gì"
},
"support": {
"title": "Thích công việc của tôi?",
"description": "BentoPDF là một dự án đam mê, được xây dựng để cung cấp bộ công cụ PDF miễn phí, riêng tư và mạnh mẽ cho mọi người. Nếu bạn thấy nó hữu ích, hãy cân nhắc hỗ trợ phát triển của nó. Mỗi ly cà phê đều giúp ích!",
"buyMeCoffee": "Mua cho tôi một ly cà phê"
},
"footer": {
"copyright": "© 2025 BentoPDF. Bảo lưu mọi quyền.",
"version": "Phiên bản",
"company": "Công ty",
"aboutUs": "Về chúng tôi",
"faqLink": "FAQ",
"contactUs": "Liên hệ",
"legal": "Pháp lý",
"termsAndConditions": "Điều khoản và Điều kiện",
"privacyPolicy": "Chính sách Bảo mật",
"followUs": "Theo dõi chúng tôi"
},
"merge": {
"title": "Gộp PDF",
"description": "Kết hợp toàn bộ tệp hoặc chọn các trang cụ thể để gộp thành tài liệu mới.",
"fileMode": "Chế độ tệp",
"pageMode": "Chế độ trang",
"howItWorks": "Cách hoạt động:",
"fileModeInstructions": [
"Nhấp và kéo biểu tượng để thay đổi thứ tự các tệp.",
"Trong hộp \"Trang\" cho mỗi tệp, bạn có thể chỉ định phạm vi (ví dụ: \"1-3, 5\") để chỉ gộp những trang đó.",
"Để trống hộp \"Trang\" để bao gồm tất cả các trang từ tệp đó."
],
"pageModeInstructions": [
"Tất cả các trang từ PDF đã tải lên của bạn được hiển thị bên dưới.",
"Chỉ cần kéo và thả các hình thu nhỏ trang riêng lẻ để tạo thứ tự chính xác bạn muốn cho tệp mới của mình."
],
"mergePdfs": "Gộp PDF"
},
"common": {
"page": "Trang",
"pages": "Trang",
"of": "của",
"download": "Tải xuống",
"cancel": "Hủy",
"save": "Lưu",
"delete": "Xóa",
"edit": "Chỉnh sửa",
"add": "Thêm",
"remove": "Xóa",
"loading": "Đang tải...",
"error": "Lỗi",
"success": "Thành công",
"file": "Tệp",
"files": "Tệp"
},
"about": {
"hero": {
"title": "Chúng tôi tin rằng công cụ PDF nên",
"subtitle": "nhanh, riêng tư và miễn phí.",
"noCompromises": "Không thỏa hiệp."
},
"mission": {
"title": "Sứ mệnh của chúng tôi",
"description": "Cung cấp bộ công cụ PDF toàn diện nhất tôn trọng quyền riêng tư của bạn và không bao giờ yêu cầu thanh toán. Chúng tôi tin rằng các công cụ tài liệu thiết yếu nên có thể truy cập được cho mọi người, ở mọi nơi, không có rào cản."
},
"philosophy": {
"label": "Triết lý cốt lõi của chúng tôi",
"title": "Quyền riêng tư trước tiên. Luôn luôn.",
"description": "Trong thời đại mà dữ liệu là hàng hóa, chúng tôi có cách tiếp cận khác. Tất cả quá trình xử lý cho các công cụ Bentopdf diễn ra cục bộ trong trình duyệt của bạn. Điều này có nghĩa là tệp của bạn không bao giờ chạm vào máy chủ của chúng tôi, chúng tôi không bao giờ thấy tài liệu của bạn và chúng tôi không theo dõi những gì bạn làm. Tài liệu của bạn vẫn hoàn toàn và rõ ràng là riêng tư. Đó không chỉ là một tính năng; đó là nền tảng của chúng tôi."
},
"whyBentopdf": {
"title": "Tại sao chọn",
"speed": {
"title": "Được xây dựng cho tốc độ",
"description": "Không cần chờ tải lên hoặc tải xuống lên máy chủ. Bằng cách xử lý tệp trực tiếp trong trình duyệt của bạn bằng công nghệ web hiện đại như WebAssembly, chúng tôi cung cấp tốc độ vô song cho tất cả các công cụ của chúng tôi."
},
"free": {
"title": "Hoàn toàn miễn phí",
"description": "Không dùng thử, không đăng ký, không phí ẩn và không có tính năng \"premium\" bị giữ lại. Chúng tôi tin rằng các công cụ PDF mạnh mẽ nên là tiện ích công cộng, không phải trung tâm lợi nhuận."
},
"noAccount": {
"title": "Không cần tài khoản",
"description": "Bắt đầu sử dụng bất kỳ công cụ nào ngay lập tức. Chúng tôi không cần email, mật khẩu hoặc bất kỳ thông tin cá nhân nào của bạn. Quy trình làm việc của bạn nên không ma sát và ẩn danh."
},
"openSource": {
"title": "Tinh thần mã nguồn mở",
"description": "Được xây dựng với tinh thần minh bạch. Chúng tôi tận dụng các thư viện mã nguồn mở tuyệt vời như PDF-lib và PDF.js, và tin vào nỗ lực do cộng đồng thúc đẩy để làm cho các công cụ mạnh mẽ có thể truy cập được cho mọi người."
}
},
"cta": {
"title": "Sẵn sàng bắt đầu?",
"description": "Tham gia cùng hàng nghìn người dùng tin tưởng Bentopdf cho nhu cầu tài liệu hàng ngày của họ. Trải nghiệm sự khác biệt mà quyền riêng tư và hiệu suất có thể tạo ra.",
"button": "Khám phá tất cả công cụ"
}
},
"contact": {
"title": "Liên hệ",
"subtitle": "Chúng tôi rất muốn nghe từ bạn. Cho dù bạn có câu hỏi, phản hồi hay yêu cầu tính năng, vui lòng đừng ngần ngại liên hệ.",
"email": "Bạn có thể liên hệ trực tiếp với chúng tôi qua email tại:"
},
"licensing": {
"title": "Giấy phép cho",
"subtitle": "Chọn giấy phép phù hợp với nhu cầu của bạn."
}
}

View File

@@ -0,0 +1,280 @@
{
"categories": {
"popularTools": "Công cụ phổ biến",
"editAnnotate": "Chỉnh sửa & Ghi chú",
"convertToPdf": "Chuyển đổi sang PDF",
"convertFromPdf": "Chuyển đổi từ PDF",
"organizeManage": "Sắp xếp & Quản lý",
"optimizeRepair": "Tối ưu hóa & Sửa chữa",
"securePdf": "Bảo mật PDF"
},
"pdfMultiTool": {
"name": "Công cụ đa năng PDF",
"subtitle": "Gộp, Chia, Sắp xếp, Xóa, Xoay, Thêm trang trống, Trích xuất và Nhân đôi trong một giao diện thống nhất."
},
"mergePdf": {
"name": "Gộp PDF",
"subtitle": "Kết hợp nhiều PDF thành một tệp. Giữ nguyên Bookmark."
},
"splitPdf": {
"name": "Chia PDF",
"subtitle": "Trích xuất một phạm vi trang thành PDF mới."
},
"compressPdf": {
"name": "Nén PDF",
"subtitle": "Giảm kích thước tệp PDF của bạn."
},
"pdfEditor": {
"name": "Trình chỉnh sửa PDF",
"subtitle": "Ghi chú, tô sáng, chỉnh sửa, bình luận, thêm hình dạng/hình ảnh, tìm kiếm và xem PDF."
},
"jpgToPdf": {
"name": "JPG sang PDF",
"subtitle": "Tạo PDF từ một hoặc nhiều hình ảnh JPG."
},
"signPdf": {
"name": "Ký PDF",
"subtitle": "Vẽ, gõ hoặc tải lên chữ ký của bạn."
},
"cropPdf": {
"name": "Cắt PDF",
"subtitle": "Cắt lề của mọi trang trong PDF của bạn."
},
"extractPages": {
"name": "Trích xuất trang",
"subtitle": "Lưu một lựa chọn trang dưới dạng tệp mới."
},
"duplicateOrganize": {
"name": "Nhân đôi & Sắp xếp",
"subtitle": "Nhân đôi, sắp xếp lại và xóa trang."
},
"deletePages": {
"name": "Xóa trang",
"subtitle": "Xóa các trang cụ thể khỏi tài liệu của bạn."
},
"editBookmarks": {
"name": "Chỉnh sửa Bookmark",
"subtitle": "Thêm, chỉnh sửa, nhập, xóa và trích xuất bookmark PDF."
},
"tableOfContents": {
"name": "Mục lục",
"subtitle": "Tạo trang mục lục từ bookmark PDF."
},
"pageNumbers": {
"name": "Số trang",
"subtitle": "Chèn số trang vào tài liệu của bạn."
},
"addWatermark": {
"name": "Thêm Watermark",
"subtitle": "Đóng dấu văn bản hoặc hình ảnh lên các trang PDF của bạn."
},
"headerFooter": {
"name": "Đầu trang & Chân trang",
"subtitle": "Thêm văn bản vào đầu và cuối trang."
},
"invertColors": {
"name": "Đảo ngược màu",
"subtitle": "Tạo phiên bản \"chế độ tối\" cho PDF của bạn."
},
"backgroundColor": {
"name": "Màu nền",
"subtitle": "Thay đổi màu nền của PDF của bạn."
},
"changeTextColor": {
"name": "Thay đổi màu văn bản",
"subtitle": "Thay đổi màu văn bản trong PDF của bạn."
},
"addStamps": {
"name": "Thêm tem",
"subtitle": "Thêm tem hình ảnh vào PDF của bạn bằng thanh công cụ ghi chú."
},
"removeAnnotations": {
"name": "Xóa ghi chú",
"subtitle": "Loại bỏ bình luận, tô sáng và liên kết."
},
"pdfFormFiller": {
"name": "Điền form PDF",
"subtitle": "Điền form trực tiếp trong trình duyệt. Cũng hỗ trợ form XFA."
},
"createPdfForm": {
"name": "Tạo form PDF",
"subtitle": "Tạo form PDF có thể điền với các trường văn bản kéo và thả."
},
"removeBlankPages": {
"name": "Xóa trang trống",
"subtitle": "Tự động phát hiện và xóa trang trống."
},
"imageToPdf": {
"name": "Hình ảnh sang PDF",
"subtitle": "Chuyển đổi JPG, PNG, WebP, BMP, TIFF, SVG, HEIC sang PDF."
},
"pngToPdf": {
"name": "PNG sang PDF",
"subtitle": "Tạo PDF từ một hoặc nhiều hình ảnh PNG."
},
"webpToPdf": {
"name": "WebP sang PDF",
"subtitle": "Tạo PDF từ một hoặc nhiều hình ảnh WebP."
},
"svgToPdf": {
"name": "SVG sang PDF",
"subtitle": "Tạo PDF từ một hoặc nhiều hình ảnh SVG."
},
"bmpToPdf": {
"name": "BMP sang PDF",
"subtitle": "Tạo PDF từ một hoặc nhiều hình ảnh BMP."
},
"heicToPdf": {
"name": "HEIC sang PDF",
"subtitle": "Tạo PDF từ một hoặc nhiều hình ảnh HEIC."
},
"tiffToPdf": {
"name": "TIFF sang PDF",
"subtitle": "Tạo PDF từ một hoặc nhiều hình ảnh TIFF."
},
"textToPdf": {
"name": "Văn bản sang PDF",
"subtitle": "Chuyển đổi tệp văn bản thuần túy thành PDF."
},
"jsonToPdf": {
"name": "JSON sang PDF",
"subtitle": "Chuyển đổi tệp JSON sang định dạng PDF."
},
"pdfToJpg": {
"name": "PDF sang JPG",
"subtitle": "Chuyển đổi mỗi trang PDF thành hình ảnh JPG."
},
"pdfToPng": {
"name": "PDF sang PNG",
"subtitle": "Chuyển đổi mỗi trang PDF thành hình ảnh PNG."
},
"pdfToWebp": {
"name": "PDF sang WebP",
"subtitle": "Chuyển đổi mỗi trang PDF thành hình ảnh WebP."
},
"pdfToBmp": {
"name": "PDF sang BMP",
"subtitle": "Chuyển đổi mỗi trang PDF thành hình ảnh BMP."
},
"pdfToTiff": {
"name": "PDF sang TIFF",
"subtitle": "Chuyển đổi mỗi trang PDF thành hình ảnh TIFF."
},
"pdfToGreyscale": {
"name": "PDF sang thang xám",
"subtitle": "Chuyển đổi tất cả màu sắc sang đen trắng."
},
"pdfToJson": {
"name": "PDF sang JSON",
"subtitle": "Chuyển đổi tệp PDF sang định dạng JSON."
},
"ocrPdf": {
"name": "OCR PDF",
"subtitle": "Làm cho PDF có thể tìm kiếm và sao chép được."
},
"alternateMix": {
"name": "Xen kẽ & Trộn trang",
"subtitle": "Gộp PDF bằng cách xen kẽ trang từ mỗi PDF. Giữ nguyên Bookmark."
},
"addAttachments": {
"name": "Thêm tệp đính kèm",
"subtitle": "Nhúng một hoặc nhiều tệp vào PDF của bạn."
},
"extractAttachments": {
"name": "Trích xuất tệp đính kèm",
"subtitle": "Trích xuất tất cả tệp được nhúng từ PDF thành ZIP."
},
"editAttachments": {
"name": "Chỉnh sửa tệp đính kèm",
"subtitle": "Xem hoặc xóa tệp đính kèm trong PDF của bạn."
},
"dividePages": {
"name": "Chia trang",
"subtitle": "Chia trang theo chiều ngang hoặc chiều dọc."
},
"addBlankPage": {
"name": "Thêm trang trống",
"subtitle": "Chèn trang trống ở bất kỳ đâu trong PDF của bạn."
},
"reversePages": {
"name": "Đảo ngược trang",
"subtitle": "Lật ngược thứ tự tất cả các trang trong tài liệu của bạn."
},
"rotatePdf": {
"name": "Xoay PDF",
"subtitle": "Xoay trang theo bội số 90 độ."
},
"nUpPdf": {
"name": "N-Up PDF",
"subtitle": "Sắp xếp nhiều trang lên một tờ."
},
"combineToSinglePage": {
"name": "Kết hợp thành một trang",
"subtitle": "Ghép tất cả các trang thành một cuộn liên tục."
},
"viewMetadata": {
"name": "Xem Metadata",
"subtitle": "Kiểm tra các thuộc tính ẩn của PDF của bạn."
},
"editMetadata": {
"name": "Chỉnh sửa Metadata",
"subtitle": "Thay đổi tác giả, tiêu đề và các thuộc tính khác."
},
"pdfsToZip": {
"name": "PDF sang ZIP",
"subtitle": "Đóng gói nhiều tệp PDF thành kho lưu trữ ZIP."
},
"comparePdfs": {
"name": "So sánh PDF",
"subtitle": "So sánh hai PDF cạnh nhau."
},
"posterizePdf": {
"name": "Posterize PDF",
"subtitle": "Chia một trang lớn thành nhiều trang nhỏ hơn."
},
"fixPageSize": {
"name": "Sửa kích thước trang",
"subtitle": "Chuẩn hóa tất cả các trang về cùng một kích thước."
},
"linearizePdf": {
"name": "Tuyến tính hóa PDF",
"subtitle": "Tối ưu hóa PDF để xem web nhanh."
},
"pageDimensions": {
"name": "Kích thước trang",
"subtitle": "Phân tích kích thước trang, hướng và đơn vị."
},
"removeRestrictions": {
"name": "Xóa hạn chế",
"subtitle": "Xóa bảo vệ mật khẩu và hạn chế bảo mật liên quan đến tệp PDF được ký số."
},
"repairPdf": {
"name": "Sửa chữa PDF",
"subtitle": "Khôi phục dữ liệu từ tệp PDF bị hỏng hoặc hư hỏng."
},
"encryptPdf": {
"name": "Mã hóa PDF",
"subtitle": "Khóa PDF của bạn bằng cách thêm mật khẩu."
},
"sanitizePdf": {
"name": "Làm sạch PDF",
"subtitle": "Xóa metadata, ghi chú, script và nhiều hơn nữa."
},
"decryptPdf": {
"name": "Giải mã PDF",
"subtitle": "Mở khóa PDF bằng cách xóa bảo vệ mật khẩu."
},
"flattenPdf": {
"name": "Làm phẳng PDF",
"subtitle": "Làm cho trường form và ghi chú không thể chỉnh sửa."
},
"removeMetadata": {
"name": "Xóa Metadata",
"subtitle": "Loại bỏ dữ liệu ẩn khỏi PDF của bạn."
},
"changePermissions": {
"name": "Thay đổi quyền",
"subtitle": "Đặt hoặc thay đổi quyền người dùng trên PDF."
}
}

View File

@@ -55,6 +55,14 @@
"created_at": "2025-12-11T18:05:46Z",
"repoId": 1074785178,
"pullRequestNo": 252
},
{
"name": "Cxllxc",
"id": 113428130,
"comment_id": 3647797392,
"created_at": "2025-12-12T19:11:45Z",
"repoId": 1074785178,
"pullRequestNo": 256
}
]
}

View File

@@ -3,18 +3,19 @@ import LanguageDetector from 'i18next-browser-languagedetector';
import HttpBackend from 'i18next-http-backend';
// Supported languages
export const supportedLanguages = ['en', 'de', 'zh'] as const;
export const supportedLanguages = ['en', 'de', 'zh', 'vi'] as const;
export type SupportedLanguage = (typeof supportedLanguages)[number];
export const languageNames: Record<SupportedLanguage, string> = {
en: 'English',
de: 'Deutsch',
zh: '中文',
vi: 'Tiếng Việt',
};
export const getLanguageFromUrl = (): SupportedLanguage => {
const path = window.location.pathname;
const langMatch = path.match(/^\/(en|de|zh)(?:\/|$)/);
const langMatch = path.match(/^\/(en|de|zh|vi)(?:\/|$)/);
if (langMatch && supportedLanguages.includes(langMatch[1] as SupportedLanguage)) {
return langMatch[1] as SupportedLanguage;
}
@@ -70,9 +71,9 @@ export const changeLanguage = (lang: SupportedLanguage): void => {
const currentLang = getLanguageFromUrl();
let newPath: string;
if (currentPath.match(/^\/(en|de|zh)\//)) {
newPath = currentPath.replace(/^\/(en|de|zh)\//, `/${lang}/`);
} else if (currentPath.match(/^\/(en|de|zh)$/)) {
if (currentPath.match(/^\/(en|de|zh|vi)\//)) {
newPath = currentPath.replace(/^\/(en|de|zh|vi)\//, `/${lang}/`);
} else if (currentPath.match(/^\/(en|de|zh|vi)$/)) {
newPath = `/${lang}`;
} else {
newPath = `/${lang}${currentPath}`;
@@ -134,7 +135,7 @@ export const rewriteLinks = (): void => {
return;
}
if (href.match(/^\/(en|de|zh)\//)) {
if (href.match(/^\/(en|de|zh|vi)\//)) {
return;
}
let newHref: string;

View File

@@ -95,7 +95,7 @@ export const injectLanguageSwitcher = (): void => {
let followUsColumn: HTMLElement | null = null;
headings.forEach((h3) => {
if (h3.textContent?.trim() === 'Follow Us' || h3.textContent?.trim() === 'Folgen Sie uns') {
if (h3.textContent?.trim() === 'Follow Us' || h3.textContent?.trim() === 'Folgen Sie uns' || h3.textContent?.trim() === 'Theo dõi chúng tôi') {
followUsColumn = h3.parentElement;
}
});

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/add-attachments.html" />
<link rel="alternate" hreflang="de" href="/de/add-attachments.html" />
<link rel="alternate" hreflang="vi" href="/vi/add-attachments.html" />
<link rel="alternate" hreflang="x-default" href="/en/add-attachments.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -12,6 +12,7 @@
<link rel="apple-touch-icon" href="/images/favicon.png" />
<link rel="alternate" hreflang="en" href="/en/add-blank-page.html" />
<link rel="alternate" hreflang="de" href="/de/add-blank-page.html" />
<link rel="alternate" hreflang="vi" href="/vi/add-blank-page.html" />
<link rel="alternate" hreflang="x-default" href="/en/add-blank-page.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -11,6 +11,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/add-stamps.html" />
<link rel="alternate" hreflang="de" href="/de/add-stamps.html" />
<link rel="alternate" hreflang="vi" href="/vi/add-stamps.html" />
<link rel="alternate" hreflang="x-default" href="/en/add-stamps.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/add-watermark.html" />
<link rel="alternate" hreflang="de" href="/de/add-watermark.html" />
<link rel="alternate" hreflang="vi" href="/vi/add-watermark.html" />
<link rel="alternate" hreflang="x-default" href="/en/add-watermark.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/alternate-merge.html" />
<link rel="alternate" hreflang="de" href="/de/alternate-merge.html" />
<link rel="alternate" hreflang="vi" href="/vi/alternate-merge.html" />
<link rel="alternate" hreflang="x-default" href="/en/alternate-merge.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/background-color.html" />
<link rel="alternate" hreflang="de" href="/de/background-color.html" />
<link rel="alternate" hreflang="vi" href="/vi/background-color.html" />
<link rel="alternate" hreflang="x-default" href="/en/background-color.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -9,6 +9,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/bmp-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/bmp-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/bmp-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/bmp-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -11,6 +11,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/bookmark.html" />
<link rel="alternate" hreflang="de" href="/de/bookmark.html" />
<link rel="alternate" hreflang="vi" href="/vi/bookmark.html" />
<link rel="alternate" hreflang="x-default" href="/en/bookmark.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link href="../../src/css/bookmark.css" rel="stylesheet" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/change-permissions.html" />
<link rel="alternate" hreflang="de" href="/de/change-permissions.html" />
<link rel="alternate" hreflang="vi" href="/vi/change-permissions.html" />
<link rel="alternate" hreflang="x-default" href="/en/change-permissions.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/combine-single-page.html" />
<link rel="alternate" hreflang="de" href="/de/combine-single-page.html" />
<link rel="alternate" hreflang="vi" href="/vi/combine-single-page.html" />
<link rel="alternate" hreflang="x-default" href="/en/combine-single-page.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/compare-pdfs.html" />
<link rel="alternate" hreflang="de" href="/de/compare-pdfs.html" />
<link rel="alternate" hreflang="vi" href="/vi/compare-pdfs.html" />
<link rel="alternate" hreflang="x-default" href="/en/compare-pdfs.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<style>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/compress-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/compress-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/compress-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/compress-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/crop-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/crop-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/crop-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/crop-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/decrypt-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/decrypt-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/decrypt-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/decrypt-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -8,7 +8,8 @@
<meta name="description" content="Remove specific pages from your PDF file. Free and secure.">
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/delete-pages.html" />
<link rel="alternate" hreflang="de" href="/de/delete-pages.html" />
<link rel="alternate" hreflang="de" href="/de/delete-pages.html" />
<link rel="alternate" hreflang="vi" href="/vi/delete-pages.html" />
<link rel="alternate" hreflang="x-default" href="/en/delete-pages.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/divide-pages.html" />
<link rel="alternate" hreflang="de" href="/de/divide-pages.html" />
<link rel="alternate" hreflang="vi" href="/vi/divide-pages.html" />
<link rel="alternate" hreflang="x-default" href="/en/divide-pages.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/edit-attachments.html" />
<link rel="alternate" hreflang="de" href="/de/edit-attachments.html" />
<link rel="alternate" hreflang="vi" href="/vi/edit-attachments.html" />
<link rel="alternate" hreflang="x-default" href="/en/edit-attachments.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/edit-metadata.html" />
<link rel="alternate" hreflang="de" href="/de/edit-metadata.html" />
<link rel="alternate" hreflang="vi" href="/vi/edit-metadata.html" />
<link rel="alternate" hreflang="x-default" href="/en/edit-metadata.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/edit-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/edit-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/edit-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/edit-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/encrypt-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/encrypt-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/encrypt-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/encrypt-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/extract-attachments.html" />
<link rel="alternate" hreflang="de" href="/de/extract-attachments.html" />
<link rel="alternate" hreflang="vi" href="/vi/extract-attachments.html" />
<link rel="alternate" hreflang="x-default" href="/en/extract-attachments.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/extract-pages.html" />
<link rel="alternate" hreflang="de" href="/de/extract-pages.html" />
<link rel="alternate" hreflang="vi" href="/vi/extract-pages.html" />
<link rel="alternate" hreflang="x-default" href="/en/extract-pages.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/fix-page-size.html" />
<link rel="alternate" hreflang="de" href="/de/fix-page-size.html" />
<link rel="alternate" hreflang="vi" href="/vi/fix-page-size.html" />
<link rel="alternate" hreflang="x-default" href="/en/fix-page-size.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/flatten-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/flatten-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/flatten-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/flatten-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -11,6 +11,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/form-creator.html" />
<link rel="alternate" hreflang="de" href="/de/form-creator.html" />
<link rel="alternate" hreflang="vi" href="/vi/form-creator.html" />
<link rel="alternate" hreflang="x-default" href="/en/form-creator.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/form-filler.html" />
<link rel="alternate" hreflang="de" href="/de/form-filler.html" />
<link rel="alternate" hreflang="vi" href="/vi/form-filler.html" />
<link rel="alternate" hreflang="x-default" href="/en/form-filler.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/header-footer.html" />
<link rel="alternate" hreflang="de" href="/de/header-footer.html" />
<link rel="alternate" hreflang="vi" href="/vi/header-footer.html" />
<link rel="alternate" hreflang="x-default" href="/en/header-footer.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -9,6 +9,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/heic-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/heic-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/heic-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/heic-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/image-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/image-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/image-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/image-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/invert-colors.html" />
<link rel="alternate" hreflang="de" href="/de/invert-colors.html" />
<link rel="alternate" hreflang="vi" href="/vi/invert-colors.html" />
<link rel="alternate" hreflang="x-default" href="/en/invert-colors.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/jpg-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/jpg-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/jpg-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/jpg-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -11,6 +11,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/json-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/json-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/json-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/json-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/linearize-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/linearize-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/linearize-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/linearize-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/merge-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/merge-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/merge-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/merge-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/n-up-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/n-up-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/n-up-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/n-up-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/ocr-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/ocr-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/ocr-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/ocr-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -8,9 +8,10 @@
<meta name="description" content="Reorder, duplicate, and organize PDF pages. Free and secure.">
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/organize-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/organize-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/organize-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="alternate" hreflang="de" href="/de/organize-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/organize-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/organize-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/page-dimensions.html" />
<link rel="alternate" hreflang="de" href="/de/page-dimensions.html" />
<link rel="alternate" hreflang="vi" href="/vi/page-dimensions.html" />
<link rel="alternate" hreflang="x-default" href="/en/page-dimensions.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/page-numbers.html" />
<link rel="alternate" hreflang="de" href="/de/page-numbers.html" />
<link rel="alternate" hreflang="vi" href="/vi/page-numbers.html" />
<link rel="alternate" hreflang="x-default" href="/en/page-numbers.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -11,6 +11,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/pdf-multi-tool.html" />
<link rel="alternate" hreflang="de" href="/de/pdf-multi-tool.html" />
<link rel="alternate" hreflang="vi" href="/vi/pdf-multi-tool.html" />
<link rel="alternate" hreflang="x-default" href="/en/pdf-multi-tool.html" />
<link href="/src/css/styles.css" rel="stylesheet" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/pdf-to-bmp.html" />
<link rel="alternate" hreflang="de" href="/de/pdf-to-bmp.html" />
<link rel="alternate" hreflang="vi" href="/vi/pdf-to-bmp.html" />
<link rel="alternate" hreflang="x-default" href="/en/pdf-to-bmp.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/pdf-to-greyscale.html" />
<link rel="alternate" hreflang="de" href="/de/pdf-to-greyscale.html" />
<link rel="alternate" hreflang="vi" href="/vi/pdf-to-greyscale.html" />
<link rel="alternate" hreflang="x-default" href="/en/pdf-to-greyscale.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/pdf-to-jpg.html" />
<link rel="alternate" hreflang="de" href="/de/pdf-to-jpg.html" />
<link rel="alternate" hreflang="vi" href="/vi/pdf-to-jpg.html" />
<link rel="alternate" hreflang="x-default" href="/en/pdf-to-jpg.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -11,6 +11,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/pdf-to-json.html" />
<link rel="alternate" hreflang="de" href="/de/pdf-to-json.html" />
<link rel="alternate" hreflang="vi" href="/vi/pdf-to-json.html" />
<link rel="alternate" hreflang="x-default" href="/en/pdf-to-json.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/pdf-to-png.html" />
<link rel="alternate" hreflang="de" href="/de/pdf-to-png.html" />
<link rel="alternate" hreflang="vi" href="/vi/pdf-to-png.html" />
<link rel="alternate" hreflang="x-default" href="/en/pdf-to-png.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/pdf-to-tiff.html" />
<link rel="alternate" hreflang="de" href="/de/pdf-to-tiff.html" />
<link rel="alternate" hreflang="vi" href="/vi/pdf-to-tiff.html" />
<link rel="alternate" hreflang="x-default" href="/en/pdf-to-tiff.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/pdf-to-webp.html" />
<link rel="alternate" hreflang="de" href="/de/pdf-to-webp.html" />
<link rel="alternate" hreflang="vi" href="/vi/pdf-to-webp.html" />
<link rel="alternate" hreflang="x-default" href="/en/pdf-to-webp.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/pdf-to-zip.html" />
<link rel="alternate" hreflang="de" href="/de/pdf-to-zip.html" />
<link rel="alternate" hreflang="vi" href="/vi/pdf-to-zip.html" />
<link rel="alternate" hreflang="x-default" href="/en/pdf-to-zip.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/png-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/png-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/png-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/png-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/posterize-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/posterize-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/posterize-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/posterize-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/remove-annotations.html" />
<link rel="alternate" hreflang="de" href="/de/remove-annotations.html" />
<link rel="alternate" hreflang="vi" href="/vi/remove-annotations.html" />
<link rel="alternate" hreflang="x-default" href="/en/remove-annotations.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/remove-blank-pages.html" />
<link rel="alternate" hreflang="de" href="/de/remove-blank-pages.html" />
<link rel="alternate" hreflang="vi" href="/vi/remove-blank-pages.html" />
<link rel="alternate" hreflang="x-default" href="/en/remove-blank-pages.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/remove-metadata.html" />
<link rel="alternate" hreflang="de" href="/de/remove-metadata.html" />
<link rel="alternate" hreflang="vi" href="/vi/remove-metadata.html" />
<link rel="alternate" hreflang="x-default" href="/en/remove-metadata.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/remove-restrictions.html" />
<link rel="alternate" hreflang="de" href="/de/remove-restrictions.html" />
<link rel="alternate" hreflang="vi" href="/vi/remove-restrictions.html" />
<link rel="alternate" hreflang="x-default" href="/en/remove-restrictions.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -8,6 +8,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/repair-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/repair-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/repair-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/repair-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/reverse-pages.html" />
<link rel="alternate" hreflang="de" href="/de/reverse-pages.html" />
<link rel="alternate" hreflang="vi" href="/vi/reverse-pages.html" />
<link rel="alternate" hreflang="x-default" href="/en/reverse-pages.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/rotate-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/rotate-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/rotate-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/rotate-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/sanitize-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/sanitize-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/sanitize-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/sanitize-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/sign-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/sign-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/sign-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/sign-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/split-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/split-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/split-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/split-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/svg-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/svg-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/svg-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/svg-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -11,6 +11,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/table-of-contents.html" />
<link rel="alternate" hreflang="de" href="/de/table-of-contents.html" />
<link rel="alternate" hreflang="vi" href="/vi/table-of-contents.html" />
<link rel="alternate" hreflang="x-default" href="/en/table-of-contents.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/text-color.html" />
<link rel="alternate" hreflang="de" href="/de/text-color.html" />
<link rel="alternate" hreflang="vi" href="/vi/text-color.html" />
<link rel="alternate" hreflang="x-default" href="/en/text-color.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -9,6 +9,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/tiff-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/tiff-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/tiff-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/tiff-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/txt-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/txt-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/txt-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/txt-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />

View File

@@ -13,6 +13,7 @@
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="alternate" hreflang="en" href="/en/view-metadata.html" />
<link rel="alternate" hreflang="de" href="/de/view-metadata.html" />
<link rel="alternate" hreflang="vi" href="/vi/view-metadata.html" />
<link rel="alternate" hreflang="x-default" href="/en/view-metadata.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
</head>

View File

@@ -10,6 +10,7 @@
<link rel="icon" type="image/png" href="/images/favicon.svg" />
<link rel="alternate" hreflang="en" href="/en/webp-to-pdf.html" />
<link rel="alternate" hreflang="de" href="/de/webp-to-pdf.html" />
<link rel="alternate" hreflang="vi" href="/vi/webp-to-pdf.html" />
<link rel="alternate" hreflang="x-default" href="/en/webp-to-pdf.html" />
<link href="/src/css/styles.css" rel="stylesheet" />
<link rel="icon" href="/favicon.ico" sizes="any" />