2-Sprachen (DE,EN)
This commit is contained in:
248
js/i18n.js
Normal file
248
js/i18n.js
Normal file
@@ -0,0 +1,248 @@
|
||||
// Internationalization (i18n) system
|
||||
let currentLanguage = 'de';
|
||||
|
||||
// Translations
|
||||
const translations = {
|
||||
de: {
|
||||
master: {
|
||||
title: '📄 Master Station',
|
||||
subtitle: 'PDF hochladen und Unterschrift empfangen',
|
||||
waitingForStation: 'Warte auf Signatur-Station...',
|
||||
connectedToStation: '✓ Verbunden mit Signatur-Station',
|
||||
selectPdf: 'PDF Dokument auswählen',
|
||||
selectPdfDesc: 'Wähle eine PDF-Datei aus, die unterschrieben werden soll',
|
||||
selectPdfButton: 'PDF auswählen',
|
||||
waitForConnection: '⚠️ Bitte warten Sie, bis die Signatur-Station verbunden ist.',
|
||||
waitingForSignature: 'Warte auf Unterschrift von der Signatur-Station...',
|
||||
signatureReceived: '✅ Unterschrift erhalten! Unterschrift oben sichtbar. Ziehe sie auf das PDF.',
|
||||
textOverlayLabel: '📝 Text für Unterschrifts-Overlay (wird oben links angezeigt):',
|
||||
prevPage: '◀ Zurück',
|
||||
nextPage: 'Weiter ▶',
|
||||
pageInfo: 'Seite 1 von 1',
|
||||
pagePlaceholder: 'Seite',
|
||||
jumpToPage: 'Springe zu Seite',
|
||||
signaturePlaceholder: 'Empfangene Unterschrift wird hier angezeigt',
|
||||
positionSignature: '📝 Unterschrift positionieren:',
|
||||
positionSignatureDesc: 'Ziehe die Unterschrift an die gewünschte Position im PDF. Nutze den Griff rechts unten zum Skalieren.',
|
||||
whichPages: 'Auf welchen Seiten platzieren?',
|
||||
currentPageOnly: 'Nur aktuelle Seite',
|
||||
allPages: 'Alle Seiten',
|
||||
removeSignature: '🗑️ Unterschrift entfernen',
|
||||
placeSignature: '✓ Unterschrift & Text platzieren & PDF erstellen',
|
||||
downloadPdf: '⬇ Unterschriebene PDF herunterladen',
|
||||
discard: '🗑️ Verwerfen',
|
||||
downloadReady: 'PDF wurde erstellt und ist bereit zum Download',
|
||||
pdfCreated: '✅ PDF wurde erstellt! Bereit zum Download.',
|
||||
discardConfirm: 'Möchten Sie wirklich verwerfen? Alle Änderungen gehen verloren.'
|
||||
},
|
||||
signature: {
|
||||
title: '✍️ Unterschriften-Station',
|
||||
subtitle: 'Bereit für Unterschriften',
|
||||
connecting: 'Verbinde mit Server...',
|
||||
waitingForPdf: 'Warte auf PDF...',
|
||||
waitingDesc: 'Bereit zum Unterschreiben. Lade ein PDF auf der Master-Station hoch.',
|
||||
warning: 'Hinweis:',
|
||||
warningText: 'Bereits eine andere Signatur-Station ist mit dem Master verbunden. Diese Station kann nicht verwendet werden, solange die andere Station aktiv ist.',
|
||||
documentToSign: '📄 Zu unterschreibendes Dokument',
|
||||
pageInfo: 'Seite 1 von 1',
|
||||
scrollHint: 'Scrolle nach unten um alle Seiten zu sehen',
|
||||
instruction: '📝 Anleitung:',
|
||||
instructionText: 'Zeichnen Sie Ihre Unterschrift mit dem Finger oder der Maus im Feld unten. Drücken Sie dann auf "Unterschrift senden".',
|
||||
signatureField: 'Unterschriftsfeld:',
|
||||
clear: '🗑️ Löschen',
|
||||
send: '✓ Unterschrift senden',
|
||||
successTitle: '✅ Erfolgreich!',
|
||||
successText: 'Ihre Unterschrift wurde erfolgreich übertragen.',
|
||||
error: '❌ Fehler beim Senden der Unterschrift. Bitte versuchen Sie es erneut.'
|
||||
}
|
||||
},
|
||||
en: {
|
||||
master: {
|
||||
title: '📄 Master Station',
|
||||
subtitle: 'Upload PDF and receive signature',
|
||||
waitingForStation: 'Waiting for signature station...',
|
||||
connectedToStation: '✓ Connected to signature station',
|
||||
selectPdf: 'Select PDF Document',
|
||||
selectPdfDesc: 'Choose a PDF file to be signed',
|
||||
selectPdfButton: 'Select PDF',
|
||||
waitForConnection: '⚠️ Please wait until the signature station is connected.',
|
||||
waitingForSignature: 'Waiting for signature from signature station...',
|
||||
signatureReceived: '✅ Signature received! Signature visible above. Drag it onto the PDF.',
|
||||
textOverlayLabel: '📝 Text for signature overlay (displayed top left):',
|
||||
prevPage: '◀ Back',
|
||||
nextPage: 'Next ▶',
|
||||
pageInfo: 'Page 1 of 1',
|
||||
pagePlaceholder: 'Page',
|
||||
jumpToPage: 'Jump to page',
|
||||
signaturePlaceholder: 'Received signature will be displayed here',
|
||||
positionSignature: '📝 Position signature:',
|
||||
positionSignatureDesc: 'Drag the signature to the desired position in the PDF. Use the handle at the bottom right to scale.',
|
||||
whichPages: 'On which pages to place?',
|
||||
currentPageOnly: 'Current page only',
|
||||
allPages: 'All pages',
|
||||
removeSignature: '🗑️ Remove signature',
|
||||
placeSignature: '✓ Place signature & text & create PDF',
|
||||
downloadPdf: '⬇ Download signed PDF',
|
||||
discard: '🗑️ Discard',
|
||||
downloadReady: 'PDF has been created and is ready for download',
|
||||
pdfCreated: '✅ PDF has been created! Ready for download.',
|
||||
discardConfirm: 'Do you really want to discard? All changes will be lost.'
|
||||
},
|
||||
signature: {
|
||||
title: '✍️ Signature Station',
|
||||
subtitle: 'Ready for signatures',
|
||||
connecting: 'Connecting to server...',
|
||||
waitingForPdf: 'Waiting for PDF...',
|
||||
waitingDesc: 'Ready to sign. Upload a PDF on the Master station.',
|
||||
warning: 'Note:',
|
||||
warningText: 'Another signature station is already connected to the master. This station cannot be used as long as the other station is active.',
|
||||
documentToSign: '📄 Document to sign',
|
||||
pageInfo: 'Page 1 of 1',
|
||||
scrollHint: 'Scroll down to see all pages',
|
||||
instruction: '📝 Instructions:',
|
||||
instructionText: 'Draw your signature with your finger or mouse in the field below. Then press "Send signature".',
|
||||
signatureField: 'Signature field:',
|
||||
clear: '🗑️ Clear',
|
||||
send: '✓ Send signature',
|
||||
successTitle: '✅ Success!',
|
||||
successText: 'Your signature has been successfully transmitted.',
|
||||
error: '❌ Error sending signature. Please try again.'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Detect system language (default to German)
|
||||
function detectLanguage() {
|
||||
// Always default to German
|
||||
return 'de';
|
||||
}
|
||||
|
||||
// Initialize language
|
||||
function initLanguage() {
|
||||
// Check if language is stored in localStorage
|
||||
const storedLang = localStorage.getItem('language');
|
||||
if (storedLang && (storedLang === 'de' || storedLang === 'en')) {
|
||||
currentLanguage = storedLang;
|
||||
} else {
|
||||
// Detect from browser
|
||||
currentLanguage = detectLanguage();
|
||||
localStorage.setItem('language', currentLanguage);
|
||||
}
|
||||
updateLanguageDisplay();
|
||||
translatePage();
|
||||
}
|
||||
|
||||
// Update language display button
|
||||
function updateLanguageDisplay() {
|
||||
const langDisplay = document.getElementById('langDisplay');
|
||||
if (langDisplay) {
|
||||
langDisplay.textContent = currentLanguage.toUpperCase();
|
||||
}
|
||||
}
|
||||
|
||||
// Toggle language
|
||||
function toggleLanguage() {
|
||||
currentLanguage = currentLanguage === 'de' ? 'en' : 'de';
|
||||
localStorage.setItem('language', currentLanguage);
|
||||
updateLanguageDisplay();
|
||||
translatePage();
|
||||
updateDynamicTranslations();
|
||||
|
||||
// Update HTML lang attribute
|
||||
document.documentElement.lang = currentLanguage;
|
||||
|
||||
// Update text in overlay if it exists
|
||||
if (typeof updateTextInOverlay === 'function') {
|
||||
updateTextInOverlay();
|
||||
}
|
||||
|
||||
// Update text input with date
|
||||
if (typeof updateTextInputWithDate === 'function') {
|
||||
updateTextInputWithDate();
|
||||
}
|
||||
}
|
||||
|
||||
// Translate a single element
|
||||
function translateElement(element) {
|
||||
const key = element.getAttribute('data-i18n');
|
||||
if (!key) return;
|
||||
|
||||
const keys = key.split('.');
|
||||
let translation = translations[currentLanguage];
|
||||
|
||||
for (const k of keys) {
|
||||
if (translation && translation[k]) {
|
||||
translation = translation[k];
|
||||
} else {
|
||||
return; // Translation not found
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof translation === 'string') {
|
||||
element.textContent = translation;
|
||||
}
|
||||
}
|
||||
|
||||
// Translate placeholder
|
||||
function translatePlaceholder(element) {
|
||||
const key = element.getAttribute('data-i18n-placeholder');
|
||||
if (!key) return;
|
||||
|
||||
const keys = key.split('.');
|
||||
let translation = translations[currentLanguage];
|
||||
|
||||
for (const k of keys) {
|
||||
if (translation && translation[k]) {
|
||||
translation = translation[k];
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof translation === 'string') {
|
||||
element.placeholder = translation;
|
||||
}
|
||||
}
|
||||
|
||||
// Translate entire page
|
||||
function translatePage() {
|
||||
// Translate all elements with data-i18n
|
||||
document.querySelectorAll('[data-i18n]').forEach(translateElement);
|
||||
|
||||
// Translate placeholders
|
||||
document.querySelectorAll('[data-i18n-placeholder]').forEach(translatePlaceholder);
|
||||
|
||||
// Update dynamic content
|
||||
updateDynamicTranslations();
|
||||
}
|
||||
|
||||
// Update dynamic translations (for content that changes)
|
||||
function updateDynamicTranslations() {
|
||||
// This will be called from master.js and signature.js for dynamic content
|
||||
if (typeof window.updateDynamicTranslationsCustom === 'function') {
|
||||
window.updateDynamicTranslationsCustom();
|
||||
}
|
||||
}
|
||||
|
||||
// Get translation by key
|
||||
function t(key) {
|
||||
const keys = key.split('.');
|
||||
let translation = translations[currentLanguage];
|
||||
|
||||
for (const k of keys) {
|
||||
if (translation && translation[k]) {
|
||||
translation = translation[k];
|
||||
} else {
|
||||
return key; // Return key if translation not found
|
||||
}
|
||||
}
|
||||
|
||||
return typeof translation === 'string' ? translation : key;
|
||||
}
|
||||
|
||||
// Initialize on page load
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', initLanguage);
|
||||
} else {
|
||||
initLanguage();
|
||||
}
|
||||
Reference in New Issue
Block a user