| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Document Translator - OpenRouter Integration</title> |
| <link rel="stylesheet" href="/static/style.css"> |
| </head> |
| <body> |
| <div class="container"> |
| <header> |
| <h1>π Document Translator</h1> |
| <p>Translate PDF and DOCX documents using AI models from OpenRouter</p> |
| </header> |
|
|
| <main> |
| <div class="upload-section"> |
| <div class="upload-area" id="uploadArea"> |
| <div class="upload-content"> |
| <div class="upload-icon">π</div> |
| <p>Drop your PDF or DOCX file here, or click to browse</p> |
| <input type="file" id="fileInput" accept=".pdf,.docx" hidden> |
| <button type="button" class="browse-btn" onclick="document.getElementById('fileInput').click()"> |
| Browse Files |
| </button> |
| </div> |
| </div> |
| |
| <div class="file-info" id="fileInfo" style="display: none;"> |
| <div class="file-details"> |
| <span class="file-name" id="fileName"></span> |
| <span class="file-size" id="fileSize"></span> |
| </div> |
| <button type="button" class="remove-btn" id="removeFile">β</button> |
| </div> |
| </div> |
|
|
| <div class="options-section"> |
| <div class="form-group" id="modelGroup"> |
| <label for="modelSelect">Translation Model:</label> |
| <select id="modelSelect" required> |
| <option value="">Loading model...</option> |
| </select> |
| </div> |
|
|
| <div class="model-info" id="modelInfo" style="display: none;"> |
| <div class="info-card"> |
| <span class="model-icon">π€</span> |
| <div class="model-details"> |
| <strong>Google Gemini 2.5 Pro</strong> |
| <p>Advanced AI model optimized for high-quality document translation</p> |
| </div> |
| </div> |
| </div> |
|
|
| <div class="form-row"> |
| <div class="form-group"> |
| <label for="sourceLanguage">Source Language:</label> |
| <select id="sourceLanguage"> |
| <option value="auto">Auto-detect</option> |
| <option value="en">English</option> |
| <option value="ar">Arabic</option> |
| <option value="es">Spanish</option> |
| <option value="fr">French</option> |
| <option value="de">German</option> |
| <option value="it">Italian</option> |
| <option value="pt">Portuguese</option> |
| <option value="ru">Russian</option> |
| <option value="ja">Japanese</option> |
| <option value="ko">Korean</option> |
| <option value="zh">Chinese</option> |
| <option value="hi">Hindi</option> |
| </select> |
| </div> |
|
|
| <div class="form-group"> |
| <label for="targetLanguage">Target Language:</label> |
| <select id="targetLanguage"> |
| <option value="en">English</option> |
| <option value="ar">Arabic</option> |
| <option value="es">Spanish</option> |
| <option value="fr">French</option> |
| <option value="de">German</option> |
| <option value="it">Italian</option> |
| <option value="pt">Portuguese</option> |
| <option value="ru">Russian</option> |
| <option value="ja">Japanese</option> |
| <option value="ko">Korean</option> |
| <option value="zh">Chinese</option> |
| <option value="hi">Hindi</option> |
| </select> |
| </div> |
| </div> |
|
|
| <button type="button" id="translateBtn" class="translate-btn" disabled> |
| <span class="btn-text">π Translate Document</span> |
| <span class="btn-spinner" style="display: none;">β³ Translating...</span> |
| </button> |
| </div> |
|
|
| <div class="progress-section" id="progressSection" style="display: none;"> |
| <div class="progress-bar"> |
| <div class="progress-fill" id="progressFill"></div> |
| </div> |
| <p class="progress-text" id="progressText">Preparing translation...</p> |
| </div> |
|
|
| <div class="results-section" id="resultsSection" style="display: none;"> |
| <h3>Translation Complete! β
</h3> |
| |
| <div class="report-card"> |
| <div class="report-header"> |
| <h4>Translation Report</h4> |
| </div> |
| <div class="report-content" id="reportContent"> |
| |
| </div> |
| </div> |
|
|
| <div class="download-section"> |
| <div class="download-item"> |
| <div class="download-info"> |
| <span class="download-label">π Original File</span> |
| <span class="download-name" id="originalFileName"></span> |
| </div> |
| <button class="download-btn" id="downloadOriginal">Download</button> |
| </div> |
|
|
| <div class="download-item"> |
| <div class="download-info"> |
| <span class="download-label">π Translated File</span> |
| <span class="download-name" id="translatedFileName"></span> |
| </div> |
| <button class="download-btn" id="downloadTranslated">Download</button> |
| </div> |
| </div> |
|
|
| <button type="button" class="new-translation-btn" id="newTranslationBtn"> |
| π Translate Another Document |
| </button> |
| </div> |
|
|
| <div class="error-section" id="errorSection" style="display: none;"> |
| <div class="error-card"> |
| <div class="error-header"> |
| <span class="error-icon">β</span> |
| <span class="error-title">Translation Failed</span> |
| </div> |
| <div class="error-message" id="errorMessage"></div> |
| <button type="button" class="retry-btn" id="retryBtn">Try Again</button> |
| </div> |
| </div> |
| </main> |
|
|
| <footer> |
| <p>Powered by <a href="https://openrouter.ai" target="_blank">OpenRouter</a> β’ |
| Built for <a href="https://huggingface.co" target="_blank">Hugging Face Spaces</a></p> |
| </footer> |
| </div> |
|
|
| <script src="/static/app.js"></script> |
| </body> |
| </html> |