Merge pull request #48 from covidpass-org/dev
Pass improvements and translations
This commit is contained in:
commit
d9d2115404
|
@ -10,7 +10,7 @@ function Alert(props: AlertProps): JSX.Element {
|
|||
|
||||
return (
|
||||
<div className="bg-red-100 border border-red-400 text-red-700 px-4 py-3 mt-5 rounded relative" role="alert">
|
||||
<span className="block sm:inline" id="message">{props.errorMessage}</span>
|
||||
<span className="block sm:inline pr-6" id="message">{props.errorMessage}</span>
|
||||
<span className="absolute top-0 bottom-0 right-0 px-4 py-3" onClick={props.onClose}>
|
||||
<svg className="fill-current h-6 w-6 text-red-500" role="button" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20">
|
||||
|
|
|
@ -29,6 +29,11 @@ function Form(): JSX.Element {
|
|||
|
||||
// Check if there is a translation and replace message accordingly
|
||||
const setErrorMessage = (message: string) => {
|
||||
if (message == undefined) {
|
||||
_setErrorMessage(undefined);
|
||||
return;
|
||||
}
|
||||
|
||||
const translation = t('errors:'.concat(message));
|
||||
_setErrorMessage(translation !== message ? translation : message);
|
||||
};
|
||||
|
@ -68,7 +73,20 @@ function Form(): JSX.Element {
|
|||
const codeReader = new BrowserQRCodeReader();
|
||||
|
||||
// Needs to be called before any camera can be accessed
|
||||
await BrowserQRCodeReader.listVideoInputDevices();
|
||||
let deviceList: MediaDeviceInfo[];
|
||||
|
||||
try {
|
||||
deviceList = await BrowserQRCodeReader.listVideoInputDevices();
|
||||
} catch (e) {
|
||||
setErrorMessage('noCameraAccess');
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if camera device is present
|
||||
if (deviceList.length == 0) {
|
||||
setErrorMessage("noCameraFound");
|
||||
return;
|
||||
}
|
||||
|
||||
// Get preview Element to show camera stream
|
||||
const previewElem: HTMLVideoElement = document.querySelector('#cameraPreview');
|
||||
|
@ -89,6 +107,9 @@ function Form(): JSX.Element {
|
|||
setGlobalControls(undefined);
|
||||
setIsCameraOpen(false);
|
||||
}
|
||||
if (error !== undefined) {
|
||||
setErrorMessage(error.message);
|
||||
}
|
||||
}
|
||||
)
|
||||
);
|
||||
|
@ -101,6 +122,12 @@ function Form(): JSX.Element {
|
|||
event.preventDefault();
|
||||
setLoading(true);
|
||||
|
||||
if(navigator.userAgent.match('CriOS')) {
|
||||
setErrorMessage('safariSupportOnly');
|
||||
setLoading(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!file && !qrCode) {
|
||||
setErrorMessage('noFileOrQrCode')
|
||||
setLoading(false);
|
||||
|
@ -228,7 +255,7 @@ function Form(): JSX.Element {
|
|||
{t('index:addToWallet')}
|
||||
</button>
|
||||
<div id="spin" className={loading ? undefined : "hidden"}>
|
||||
<svg className="animate-spin h-5 w-5 ml-2" viewBox="0 0 24 24">
|
||||
<svg className="animate-spin h-5 w-5 ml-3" viewBox="0 0 24 24">
|
||||
<circle className="opacity-0" cx="12" cy="12" r="10" stroke="currentColor"
|
||||
strokeWidth="4"/>
|
||||
<path className="opacity-75" fill="currentColor"
|
||||
|
|
|
@ -4,7 +4,9 @@ module.exports = {
|
|||
locales: [
|
||||
'en',
|
||||
'de', 'de-DE', 'de-AT', 'de-LI', 'de-LU', 'de-CH',
|
||||
'fr', 'fr-BE', 'fr-CH', 'fr-FR', 'fr-LU', 'fr-MC'
|
||||
'fr', 'fr-BE', 'fr-CH', 'fr-FR', 'fr-LU', 'fr-MC',
|
||||
'nl', 'nl-NL', 'nl-BE',
|
||||
'fi', 'fi-FI'
|
||||
],
|
||||
localeExtension: 'yml',
|
||||
},
|
||||
|
|
|
@ -35,11 +35,10 @@ function Privacy(): JSX.Element {
|
|||
</li>
|
||||
<li>
|
||||
{t('privacy:generalInfoProvider')}
|
||||
|
||||
<a href="https://www.hetzner.com/de/rechtliches/datenschutz/" className="underline">
|
||||
{t('privacy:privacyPolicy')}
|
||||
</a>
|
||||
|
||||
|
||||
{t('privacy:andThe')}
|
||||
|
||||
<a href="https://docs.hetzner.com/general/general-terms-and-conditions/data-privacy-faq/privacy.tsx" className="underline">
|
||||
|
|
|
@ -14,4 +14,7 @@ couldNotFindQrCode: QR-Code konnte in der ausgewählten Datei nicht gefunden wer
|
|||
invalidQrCode: Ungültiger QR-Code
|
||||
certificateType: Kein gültiger Zertifikatstyp gefunden
|
||||
invalidTestResult: Ungültiges Testergebnis
|
||||
invalidTestType: Ungültiger Testtyp
|
||||
invalidTestType: Ungültiger Testtyp
|
||||
noCameraAccess: Kein Zugriff auf die Kamera möglich. Überprüfe die Berechtigungen unter Einstellungen > Safari > Kamera.
|
||||
noCameraFound: Keine Kamera gefunden.
|
||||
safariSupportOnly: Bitte verwende unter iOS den Safari Browser.
|
|
@ -14,4 +14,7 @@ couldNotFindQrCode: Could not find QR Code in provided file
|
|||
invalidQrCode: Invalid QR code
|
||||
certificateType: No valid certificate type found
|
||||
invalidTestResult: Invalid test result
|
||||
invalidTestType: Invalid test type
|
||||
invalidTestType: Invalid test type
|
||||
noCameraAccess: Could not access camera. Check permissions under Settings > Safari > Camera.
|
||||
noCameraFound: Could not find camera.
|
||||
safariSupportOnly: On iOS, please use the Safari Browser.
|
|
@ -21,7 +21,7 @@ dataPrivacyFaq: data privacy FAQ
|
|||
contact: Contact
|
||||
email: Email
|
||||
website: Website
|
||||
process: Simplified of the process
|
||||
process: Simplified explanation of the process
|
||||
processFirst: First, the following steps happen locally in your browser
|
||||
processSecond: Second, the following steps happen on our server
|
||||
processThird: Finally, the following steps happen locally in your browser
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
fi
|
|
@ -0,0 +1,5 @@
|
|||
title: CovidPass
|
||||
subtitle: Lisää EU:n koronatodistus suosikkilompakkosovellukseesi.
|
||||
privacyPolicy: Tietosuojaseloste
|
||||
gitHub: GitHub
|
||||
imprint: Imprint
|
|
@ -0,0 +1,20 @@
|
|||
noFileOrQrCode: Skannaa QR koodi tai valitse tiedosto
|
||||
signatureFailed: Virhe allekirjoitettaessa passia palvelimella
|
||||
decodingFailed: QR-koodin hyötykuorman purkaminen epäonnistui
|
||||
invalidColor: Väärä väri
|
||||
certificateData: Varmenteen tietojen lukeminen epäonnistui
|
||||
nameMissing: Nimen lukeminen epäonnistui
|
||||
dobMissing: Syntymäaikaa ei onnistuttu lukemaan
|
||||
invalidMedicalProduct: Virheellinen lääkevalmiste
|
||||
invalidCountryCode: Virheellinen maakoodi
|
||||
invalidManufacturer: Virheellinen valmistaja
|
||||
invalidFileType: Virheellinen tiedostotyyppi
|
||||
couldNotDecode: QR-koodia ei voitu purkaa tiedostosta
|
||||
couldNotFindQrCode: QR-koodia ei löytynyt annetusta tiedostosta
|
||||
invalidQrCode: Virheellinen QR-koodi
|
||||
certificateType: Kelvollista varmennetyyppiä ei löytynyt
|
||||
invalidTestResult: Virheellinen testitulos
|
||||
invalidTestType: Virheellinen testityyppi
|
||||
noCameraAccess: Kameraan ei päässyt käsiksi. Tarkista käyttöoikeudet kohdasta Asetukset > Safari > Kamera.
|
||||
noCameraFound: En löytänyt kameraa.
|
||||
safariSupportOnly: Käytä iOS:ssä Safari-selainta.
|
|
@ -0,0 +1,27 @@
|
|||
heading: TMG 5 §:n mukaiset tiedot
|
||||
contact: Yhteystiedot
|
||||
euDisputeResolution: EU:n riidanratkaisu
|
||||
euDisputeResolutionParagraph: |
|
||||
Euroopan komissio tarjoaa foorumin verkkovälitteistä riidanratkaisua varten https://ec.europa.eu/consumers/odr.
|
||||
Sähköpostiosoitteemme löytyy yllä olevasta painatuksesta.
|
||||
consumerDisputeResolution: Kuluttajariitojen ratkaiseminen / yleinen välimieslautakunta
|
||||
consumerDisputeResolutionParagraph: Emme ole halukkaita tai velvollisia osallistumaan riidanratkaisumenettelyyn kuluttajasovittelulautakunnassa.
|
||||
liabilityForContents: Vastuu sisällöstä
|
||||
liabilityForContentsParagraph: |
|
||||
Palveluntarjoajana olemme yleisten lakien 7 §:n 1 momentin TMG:n mukaisesti vastuussa näiden sivujen sisällöstä.
|
||||
TMG:n 8-10 §:n mukaan emme ole velvollisia valvomaan siirrettyjä tai tallennettuja tietoja tai tutkimaan olosuhteita, jotka viittaavat laittomaan toimintaan.
|
||||
Yleisten lakien mukaiset velvollisuudet poistaa tai estää tietojen käyttö säilyvät ennallaan.
|
||||
Vastuu tässä suhteessa on kuitenkin mahdollista vasta siitä hetkestä alkaen, kun konkreettinen lain rikkominen tulee tietoon.
|
||||
Jos saamme tietää tällaisista rikkomuksista, poistamme asianomaisen sisällön välittömästi.
|
||||
liabilityForLinks: Vastuu linkeistä
|
||||
liabilityForLinksParagraph: |
|
||||
Tarjouksemme sisältää linkkejä kolmansien osapuolten ulkoisille verkkosivustoille, joiden sisältöön emme voi vaikuttaa.
|
||||
Siksi emme voi ottaa vastuuta näistä ulkoisista sisällöistä.
|
||||
Linkitettyjen sivustojen sisällöstä on aina vastuussa kyseisten sivustojen tarjoaja tai ylläpitäjä.
|
||||
Linkitetyt sivut on tarkistettu mahdollisten lainrikkomusten varalta linkittämishetkellä.
|
||||
Laitonta sisältöä ei ollut tunnistettavissa linkittämishetkellä.
|
||||
Linkitettyjen sivujen sisällön jatkuva valvonta ei kuitenkaan ole järkevää ilman konkreettisia todisteita lainrikkomuksesta.
|
||||
Jos saamme tietoiseksi rikkomuksista, poistamme tällaiset linkit välittömästi.
|
||||
credits: Kiitokset
|
||||
creditsSource: Otteita osoitteesta https://www.e-recht24.de/impressum-generator.html
|
||||
creditsTranslation: Käännetty osoitteella https://www.DeepL.com/Translator (ilmainen versio).
|
|
@ -0,0 +1,26 @@
|
|||
iosHint: Käytä iOS:ssä Safari-selainta.
|
||||
errorClose: Sulje
|
||||
selectCertificate: Valitse todistus
|
||||
selectCertificateDescription: |
|
||||
Skannaa todistuksessa oleva QR-koodi tai valitse kuvakaappaus tai PDF-sivu, jossa on QR-koodi.
|
||||
Huomaa, että tiedoston valitsemista suoraan kamerasta ei tueta.
|
||||
stopCamera: Lopeta Kamera
|
||||
startCamera: Käynnistä Kamera
|
||||
openFile: Valitse Tiedosto
|
||||
foundQrCode: QR koodi löytyi!
|
||||
pickColor: Valitse väri
|
||||
pickColorDescription: Valitse passisi taustaväri.
|
||||
colorWhite: Valkoinen
|
||||
colorBlack: Musta
|
||||
colorGrey: Harmaa
|
||||
colorGreen: Vihreä
|
||||
colorIndigo: Indigonsininen
|
||||
colorBlue: Sininen
|
||||
colorPurple: Purppura
|
||||
colorTeal: Sinivihreä
|
||||
addToWallet: Lisää lompakkoon.
|
||||
dataPrivacyDescription: |
|
||||
Tietosuoja on erityisen tärkeää, kun käsitellään terveyteen liittyviä tietoja.
|
||||
Jotta voisit tehdä tietoon perustuvan päätöksen, lue seuraavat tiedot
|
||||
iAcceptThe: Hyväksyn
|
||||
privacyPolicy: Tietosuojaselosteen
|
|
@ -0,0 +1,56 @@
|
|||
gdprNotice: |
|
||||
Tietosuojakäytäntömme perustuu Euroopan lainsäätäjän yleisen tietosuoja-asetuksen (GDPR) hyväksymisen yhteydessä käyttämiin termeihin.
|
||||
generalInfo: Yleistä tietoa
|
||||
generalInfoProcess: |
|
||||
Koko passitiedoston luomisprosessi tapahtuu paikallisesti selaimessasi.
|
||||
Allekirjoitusvaihetta varten palvelimelle lähetetään vain hashed versio tiedoistasi.
|
||||
generalInfoStoring: Tietojasi ei tallenneta aktiivisen selainistunnon jälkeen, eikä sivusto käytä evästeitä.
|
||||
generalInfoThirdParties: Tietoja ei lähetetä kolmansille osapuolille.
|
||||
generalInfoHttps: Lähetämme tietosi turvallisesti https:n kautta.
|
||||
generalInfoLocation: Palvelimemme sijaitsee Tuusulassa.
|
||||
generalInfoGitHub: The source code of this site is available on
|
||||
generalInfoLockScreen: Oletusarvoisesti Apple Wallet -passit ovat käytettävissä lukitusnäytöstä. Tämän voi muuttaa
|
||||
settings: asetukissa
|
||||
generalInfoProvider: |
|
||||
Palveluntarjoaja käsittelee tietoja tämän sivuston tarjoamiseksi.
|
||||
Jotta ymmärtäisit paremmin, mitä toimenpiteitä he toteuttavat tietojesi suojaamiseksi, lue myös heidän palveluntarjoajansa tiedot.
|
||||
privacyPolicy: tietosuojakäytäntö
|
||||
andThe: ja
|
||||
dataPrivacyFaq: tietosuoja FAQ
|
||||
contact: Yhteystiedot
|
||||
email: Email
|
||||
website: Verkkosivu
|
||||
process: Prosessin yksinkertaistaminen
|
||||
processFirst: Seuraavat vaiheet tapahtuvat ensin paikallisesti selaimessasi.
|
||||
processSecond: Toiseksi palvelimellamme suoritetaan seuraavat vaiheet
|
||||
processThird: Lopuksi seuraavat vaiheet tapahtuvat paikallisesti selaimessasi
|
||||
processRecognizing: QR-koodin tietojen tunnistaminen ja poimiminen valitusta varmenteesta.
|
||||
processDecoding: Henkilökohtaisten ja terveyteen liittyvien tietojen purkaminen QR-koodin hyötykuormasta.
|
||||
processAssembling: Epätäydellisen syötetiedoston kokoaminen omista tiedoistasi
|
||||
processGenerating: Luodaan tiedosto, joka sisältää passitiedostoon tallennettujen tietojen hashit.
|
||||
processSending: Lähetetään palvelimellemme vain hasheja sisältävä tiedosto.
|
||||
processReceiving: Paikallisesti luotujen hashien vastaanottaminen ja tarkistaminen.
|
||||
processSigning: Hashit sisältävän tiedoston allekirjoittaminen
|
||||
processSendingBack: Allekirjoituksen lähettäminen takaisin
|
||||
processCompleting: Allekirjoitetun passitiedoston kokoaminen paikallisesti luodusta epätäydellisestä tiedostosta ja allekirjoituksesta.
|
||||
processSaving: Tiedoston tallentaminen laitteeseen
|
||||
locallyProcessedData: Paikallisesti käsitellyt tiedot
|
||||
the: The
|
||||
schema: Digitaalisen Covid-varmenteen skeema
|
||||
specification: sisältää yksityiskohtaisen määrittelyn siitä, mitä tietoja QR-koodi voi sisältää ja mitä tietoja selaimesi käsittelee.
|
||||
serverProvider: Palveluntarjoaja
|
||||
serverProviderIs: Meidän palveluntarjoaja on
|
||||
logFiles: Palvelimen lokitiedostoihin voidaan kerätä ja tallentaa seuraavia tietoja
|
||||
logFilesBrowser: Käytetty selaintyyppi ja -versio
|
||||
logFilesOs: Käyttöjärjestelmä
|
||||
logFilesReferrer: Verkkosivusto, josta käyttäjä saapuu verkkosivustollemme (ns. viittaajat).
|
||||
logFilesTime: Päivämäärä ja kellonaika
|
||||
logFilesIpAddress: Pseudonymisoidut IP-osoitteet
|
||||
rights: Sinun oikeutesi
|
||||
rightsGranted: Yleisen tietosuoja-asetuksen mukaisesti sinulla on seuraavat oikeudet
|
||||
rightsAccess: Oikeus tutustua tietoihin; Sinulla on oikeus tietää, mitä tietoja sinusta on kerätty ja miten niitä on käsitelty.
|
||||
rightsErasure: Oikeus tulla unohdetuksi; henkilötietojesi poistaminen.
|
||||
rightsRectification: Oikaisuoikeus; Sinulla on oikeus korjata virheelliset tiedot.
|
||||
rightsPortability: Oikeus tietojen siirrettävyyteen; Sinulla on oikeus siirtää tietosi käsittelyjärjestelmästä toiseen.
|
||||
thirdParties: Kolmannet osapuolet
|
||||
appleSync: Apple saattaa synkronoida koronapassisi iCloudin kautta
|
|
@ -2,7 +2,7 @@ noFileOrQrCode: Veuillez scanner un QR Code ou sélectionner un fichier
|
|||
signatureFailed: Erreur lors de la signature du pass sur le serveur
|
||||
decodingFailed: Échec du décodage du QR Code
|
||||
invalidColor: Couleur non valide
|
||||
vaccinationInfo: Échec de la lecture des informations de vaccination
|
||||
certificateData: Échec de la lecture des données du certificat
|
||||
nameMissing: Échec de la lecture du nom
|
||||
dobMissing: Échec de la lecture de la date de naissance
|
||||
invalidMedicalProduct: Produit vaccinal non valide
|
||||
|
@ -12,3 +12,9 @@ invalidFileType: Type de fichier non valide
|
|||
couldNotDecode: Impossible de décoder le QR Code du fichier
|
||||
couldNotFindQrCode: Impossible de trouver le QR Code dans le fichier fourni
|
||||
invalidQrCode: QR Code non valide
|
||||
certificateType: Aucun type de certificat valide n'a été trouvé
|
||||
invalidTestResult: Résultat du test non valide
|
||||
invalidTestType: Type de test non valide
|
||||
noCameraAccess: Impossible d'accéder à la caméra. Vérifiez les autorisations sous Paramètres > Safari > Appareil photo.
|
||||
noCameraFound: Impossible de trouver la caméra.
|
||||
safariSupportOnly: Sur iOS, veuillez utiliser le navigateur Safari.
|
|
@ -7,7 +7,7 @@ selectCertificateDescription: |
|
|||
stopCamera: Arrêter l'appareil photo
|
||||
startCamera: Démarrer l'appareil photo
|
||||
openFile: Sélectionner un fichier
|
||||
foundQrCode: Code QR trouvé!
|
||||
foundQrCode: Code QR trouvé !
|
||||
pickColor: Choisissez une couleur
|
||||
pickColorDescription: Choisissez une couleur de fond pour votre passe.
|
||||
colorWhite: blanc
|
||||
|
|
|
@ -21,7 +21,7 @@ dataPrivacyFaq: FAQ sur la confidentialité des données
|
|||
contact: Contact
|
||||
email: Email
|
||||
website: Site web
|
||||
process: Simplification du processus
|
||||
process: Explication simplifiée du processus
|
||||
processFirst: Premièrement, les étapes suivantes se déroulent localement dans votre navigateur.
|
||||
processSecond: Ensuite, les étapes suivantes se déroulent sur notre serveur
|
||||
processThird: Enfin, les étapes suivantes se déroulent localement dans votre navigateur
|
||||
|
@ -49,9 +49,9 @@ logFilesTime: La date et l'heure de l'accès.
|
|||
logFilesIpAddress: Les adresses IP pseudonymisées
|
||||
rights: Vos droits
|
||||
rightsGranted: Conformément au RGPD, vous disposez des droits suivants
|
||||
rightsAccess: Droit d'accès à vos données; Vous avez le droit de savoir quelles données ont été collectées à votre sujet et comment elles ont été traitées.
|
||||
rightsErasure: Droit à l'oubli; Effacement de vos données personnelles.
|
||||
rightsRectification: Droit de rectification; Vous avez le droit de corriger des données inexactes.
|
||||
rightsPortability: Droit à la portabilité des données; Vous avez le droit de transférer vos données d'un système de traitement à un autre.
|
||||
rightsAccess: Droit d'accès à vos données ; Vous avez le droit de savoir quelles données ont été collectées à votre sujet et comment elles ont été traitées.
|
||||
rightsErasure: Droit à l'oubli ; Effacement de vos données personnelles.
|
||||
rightsRectification: Droit de rectification ; Vous avez le droit de corriger des données inexactes.
|
||||
rightsPortability: Droit à la portabilité des données ; Vous avez le droit de transférer vos données d'un système de traitement à un autre.
|
||||
thirdParties: Tiers liés
|
||||
appleSync: Apple peut synchroniser vos passes via iCloud.
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
nl
|
|
@ -0,0 +1 @@
|
|||
nl
|
|
@ -0,0 +1,6 @@
|
|||
title: CovidPass
|
||||
subtitle: Voeg uw EU Digitaal COVID-certificaten toe aan uw favoriete wallet-apps.
|
||||
privacyPolicy: Privacybeleid
|
||||
donate: Doneer
|
||||
gitHub: GitHub
|
||||
imprint: Over
|
|
@ -0,0 +1,20 @@
|
|||
noFileOrQrCode: Scan een QR-code of selecteer een bestand
|
||||
signatureFailed: Fout bij het ondertekenen van de pass op de server
|
||||
decodingFailed: Kan de payload van de QR-code niet decoderen
|
||||
invalidColor: Ongeldige kleur
|
||||
certificateData: Kan certificaatgegevens niet lezen
|
||||
nameMissing: Kan naam niet lezen
|
||||
dobMissing: Kan geboortedatum niet lezen
|
||||
invalidMedicalProduct: Ongeldig medisch product
|
||||
invalidCountryCode: Ongeldige landcode
|
||||
invalidManufacturer: Ongeldige fabrikant
|
||||
invalidFileType: Ongeldig bestandstype
|
||||
couldNotDecode: Kon QR-code niet uit bestand decoderen
|
||||
couldNotFindQrCode: Kon de QR-code niet vinden in het verstrekte bestand
|
||||
invalidQrCode: Ongeldige QR-code
|
||||
certificateType: Geen geldig certificaattype gevonden
|
||||
invalidTestResult: Ongeldig testresultaat
|
||||
invalidTestType: Ongeldig testtype
|
||||
noCameraAccess: Kon geen toegang krijgen tot de camera. Controleer de machtigingen onder Instellingen > Safari > Camera.
|
||||
noCameraFound: Ik kon de camera niet vinden.
|
||||
safariSupportOnly: Gebruik op iOS de Safari-browser.
|
|
@ -0,0 +1,27 @@
|
|||
heading: Informatie volgens § 5 TMG
|
||||
contact: Contact
|
||||
euDisputeResolution: EU-geschillenbeslechting
|
||||
euDisputeResolutionParagraph: |
|
||||
De Europese Commissie biedt een platform voor online geschillenbeslechting (OS) https://ec.europa.eu/consumers/odr.
|
||||
U vindt ons e-mailadres in de conrtactgegevens hierboven.
|
||||
consumerDisputeResolution: Beslechting van consumentengeschillen / universele arbitragecommissie
|
||||
consumerDisputeResolutionParagraph: We zijn niet bereid of verplicht om deel te nemen aan geschillenbeslechtingsprocedures voor een arbitragecommissie voor consumenten.
|
||||
liabilityForContents: Aansprakelijkheid voor inhoud
|
||||
liabilityForContentsParagraph: |
|
||||
Als dienstverlener zijn wij verantwoordelijk voor onze eigen inhoud op deze pagina's in overeenstemming met § 7 lid 1 TMG onder de algemene wetten.
|
||||
Volgens §§ 8 tot 10 TMG zijn wij niet verplicht om verzonden of opgeslagen informatie te controleren of omstandigheden te onderzoeken die wijzen op illegale activiteiten.
|
||||
Verplichtingen tot het verwijderen of blokkeren van het gebruik van informatie onder de algemene wetten blijven onaangetast.
|
||||
Aansprakelijkheid ter zake is echter pas mogelijk vanaf het moment dat een concrete wetsovertreding bekend wordt.
|
||||
Als we kennis krijgen van dergelijke inbreuken, zullen we de relevante inhoud onmiddellijk verwijderen.
|
||||
liabilityForLinks: Aansprakelijkheid voor links
|
||||
liabilityForLinksParagraph: |
|
||||
Ons aanbod bevat links naar externe websites van derden, op wiens inhoud wij geen invloed hebben.
|
||||
Daarom kunnen wij voor deze externe inhoud geen aansprakelijkheid aanvaarden.
|
||||
De respectievelijke aanbieder of exploitant van de sites is altijd verantwoordelijk voor de inhoud van de gelinkte sites.
|
||||
De gelinkte pagina's werden op het moment van linken gecontroleerd op mogelijke juridische overtredingen.
|
||||
Illegale inhoud was op het moment van linken niet herkenbaar.
|
||||
Een permanente controle van de inhoud van de gelinkte pagina's is echter niet redelijk zonder concreet bewijs van een overtreding van de wet.
|
||||
Als we inbreuken vaststellen, zullen we dergelijke links onmiddellijk verwijderen.
|
||||
credits: Credits
|
||||
creditsSource: Met fragmenten van https://www.e-recht24.de/impressum-generator.html
|
||||
creditsTranslation: Vertaald met https://www.DeepL.com/Translator (gratis versie)
|
|
@ -0,0 +1,26 @@
|
|||
iosHint: Gebruik op iOS de Safari-browser.
|
||||
errorClose: Sluiten
|
||||
selectCertificate: Selecteer Certificaat
|
||||
selectCertificateDescription: |
|
||||
Scan de QR-code op uw certificaat of selecteer een screenshot of pdf-pagina met de QR-code.
|
||||
Merk op dat het rechtstreeks vanaf de camera selecteren van een bestand niet wordt ondersteund.
|
||||
stopCamera: Stop Camera
|
||||
startCamera: Start Camera
|
||||
openFile: Selecteer Bestand
|
||||
foundQrCode: QR-code gevonden!
|
||||
pickColor: Kies een kleur
|
||||
pickColorDescription: Kies een achtergrondkleur voor je pas.
|
||||
colorWhite: wit
|
||||
colorBlack: zwart
|
||||
colorGrey: grijs
|
||||
colorGreen: groen
|
||||
colorIndigo: indigo
|
||||
colorBlue: blauw
|
||||
colorPurple: paars
|
||||
colorTeal: groenblauw
|
||||
addToWallet: Toevoegen aan Wallet
|
||||
dataPrivacyDescription: |
|
||||
Gegevensprivacy is van bijzonder belang bij de verwerking van gezondheidsgerelateerde gegevens.
|
||||
Om een weloverwogen beslissing te kunnen nemen, lees a.u.b. de
|
||||
iAcceptThe: Ik accepteer het
|
||||
privacyPolicy: Privacybeleid
|
|
@ -0,0 +1,57 @@
|
|||
gdprNotice: |
|
||||
Ons privacybeleid is gebaseerd op de voorwaarden die worden gebruikt door de Europese wetgever
|
||||
voor de vaststelling van de Algemene Verordening Gegevensbescherming (AVG).
|
||||
generalInfo: Algemene informatie
|
||||
generalInfoProcess: |
|
||||
Het hele proces van het genereren van het pass-bestand gebeurt lokaal in uw browser.
|
||||
Voor de ondertekeningsstap wordt alleen een gehashte weergave van uw gegevens naar de server gestuurd.
|
||||
generalInfoStoring: Uw gegevens worden niet opgeslagen buiten de actieve browsersessie en de site maakt geen gebruik van cookies.
|
||||
generalInfoThirdParties: Er worden geen gegevens naar derden verzonden.
|
||||
generalInfoHttps: Wij verzenden uw gegevens veilig via https.
|
||||
generalInfoLocation: Onze server wordt gehost in Neurenberg, Duitsland.
|
||||
generalInfoGitHub: De broncode van deze site is beschikbaar op
|
||||
generalInfoLockScreen: Standaard zijn Apple Wallet-passen toegankelijk vanaf het vergrendelingsscherm. Dit kan worden gewijzigd in de
|
||||
settings: settings
|
||||
generalInfoProvider: |
|
||||
De serverprovider verwerkt gegevens om deze site ter beschikking te stellen.
|
||||
Om beter te begrijpen welke maatregelen zij nemen om uw gegevens te beschermen, leest u ook hun
|
||||
privacyPolicy: privacybeleid
|
||||
andThe: en de
|
||||
dataPrivacyFaq: veelgestelde vragen over gegevensprivacy
|
||||
contact: Contact
|
||||
email: E-mail
|
||||
website: Website
|
||||
process: Vereenvoudigde uitleg van het proces
|
||||
processFirst: Ten eerste gebeuren de volgende stappen lokaal in uw browser
|
||||
processSecond: Ten tweede gebeuren de volgende stappen op onze server
|
||||
processThird: Ten slotte gebeuren de volgende stappen lokaal in uw browser
|
||||
processRecognizing: Herkennen en extraheren van de QR-codegegevens van uw geselecteerde certificaat
|
||||
processDecoding: Het decoderen van uw persoonlijke en gezondheidsgerelateerde gegevens uit de QR-code payload
|
||||
processAssembling: Een onvolledig pasbestand samenstellen uit uw gegevens
|
||||
processGenerating: Een bestand genereren dat hashes bevat van de gegevens die zijn opgeslagen in het pasbestand
|
||||
processSending: Alleen het bestand met de hashes naar onze server verzenden
|
||||
processReceiving: De hashes ontvangen en controleren die lokaal zijn gegenereerd
|
||||
processSigning: Het bestand met de hashes ondertekenen
|
||||
processSendingBack: De handtekening terugsturen
|
||||
processCompleting: Het getekende pass-bestand samenstellen uit het onvolledige bestand dat lokaal is gegenereerd en de handtekening
|
||||
processSaving: Het bestand op uw apparaat opslaan
|
||||
locallyProcessedData: Lokaal verwerkte gegevens
|
||||
the: Het
|
||||
schema: Digitaal Covid Certificate Schema
|
||||
specification: bevat een gedetailleerde specificatie van welke gegevens in de QR-code kunnen staan en in uw browser worden verwerkt.
|
||||
serverProvider: Serverprovider
|
||||
serverProviderIs: Onze serverprovider is
|
||||
logFiles: De volgende gegevens kunnen worden verzameld en opgeslagen in de serverlogbestanden
|
||||
logFilesBrowser: De gebruikte browsertypes en -versies
|
||||
logFilesOs: Het besturingssysteem dat wordt gebruikt door het toegangssysteem
|
||||
logFilesReferrer: De website van waaruit een toegangssysteem onze website bereikt (zogenaamde verwijzers)
|
||||
logFilesTime: De datum en tijd van bezoek
|
||||
logFilesIpAddress: De gepseudonimiseerde IP-adressen
|
||||
rights: Jou rechten
|
||||
rightsGranted: Conform de AVG heeft u de volgende rechten
|
||||
rightsAccess: Recht op toegang tot uw gegevens; U hebt het recht om te weten welke gegevens over u zijn verzameld en hoe deze zijn verwerkt.
|
||||
rightsErasure: Recht om vergeten te worden; Wissen van uw persoonsgegevens.
|
||||
rightsRectification: Recht op rectificatie; U heeft het recht om onjuiste gegevens te corrigeren.
|
||||
rightsPortability: Recht op gegevensoverdraagbaarheid; U heeft het recht om uw gegevens over te dragen van het ene verwerkingssysteem naar het andere.
|
||||
thirdParties: Derden gekoppeld
|
||||
appleSync: Apple kan uw passen synchroniseren via iCloud
|
115
src/payload.ts
115
src/payload.ts
|
@ -2,7 +2,7 @@ import {ValueSets} from "./value_sets";
|
|||
import {Constants} from "./constants";
|
||||
|
||||
enum CertificateType {
|
||||
Vaccination = 'Vaccination',
|
||||
Vaccine = 'Vaccine',
|
||||
Test = 'Test',
|
||||
Recovery = 'Recovery',
|
||||
}
|
||||
|
@ -63,25 +63,35 @@ export class Payload {
|
|||
throw new Error('certificateData');
|
||||
}
|
||||
|
||||
// Get name and date of birth information
|
||||
// Get name information
|
||||
const nameInformation = covidCertificate['nam'];
|
||||
const dateOfBirthInformation = covidCertificate['dob'];
|
||||
|
||||
if (nameInformation == undefined) {
|
||||
throw new Error('nameMissing');
|
||||
}
|
||||
if (dateOfBirthInformation == undefined) {
|
||||
throw new Error('dobMissing');
|
||||
}
|
||||
|
||||
const name = `${nameInformation['fn']}, ${nameInformation['gn']}`;
|
||||
const dateOfBirth = dateOfBirthInformation;
|
||||
const firstName = nameInformation['gn'];
|
||||
const lastName = nameInformation['fn'];
|
||||
|
||||
const transliteratedFirstName = nameInformation['gnt'];
|
||||
const transliteratedLastName = nameInformation['fnt'];
|
||||
|
||||
// Check if name contains non-latin characters
|
||||
const nameRegex = new RegExp('^(\\p{Script=Latin}|[ -\'`´])+$', 'u');
|
||||
|
||||
let name: string;
|
||||
|
||||
if (nameRegex.test(firstName) && nameRegex.test(lastName)) {
|
||||
name = `${firstName} ${lastName}`;
|
||||
} else {
|
||||
name = `${transliteratedFirstName} ${transliteratedLastName}`;
|
||||
}
|
||||
|
||||
let properties: object;
|
||||
|
||||
// Set certificate type and properties
|
||||
if (covidCertificate['v'] !== undefined) {
|
||||
this.certificateType = CertificateType.Vaccination;
|
||||
this.certificateType = CertificateType.Vaccine;
|
||||
properties = covidCertificate['v'][0];
|
||||
}
|
||||
if (covidCertificate['t'] !== undefined) {
|
||||
|
@ -96,23 +106,16 @@ export class Payload {
|
|||
throw new Error('certificateType')
|
||||
}
|
||||
|
||||
// Get country code, identifier and issuer
|
||||
const countryCode = properties['co'];
|
||||
// Get identifier and issuer
|
||||
const uvci = properties['ci'];
|
||||
const certificateIssuer = properties['is'];
|
||||
|
||||
if (!(countryCode in valueSets.countryCodes)) {
|
||||
throw new Error('invalidCountryCode');
|
||||
}
|
||||
|
||||
const country = valueSets.countryCodes[countryCode].display;
|
||||
|
||||
const generic: PassDictionary = {
|
||||
headerFields: [
|
||||
{
|
||||
key: "type",
|
||||
label: "Certificate Type",
|
||||
value: this.certificateType
|
||||
label: "EU Digital COVID",
|
||||
value: this.certificateType + " Certificate"
|
||||
}
|
||||
],
|
||||
primaryFields: [
|
||||
|
@ -123,14 +126,7 @@ export class Payload {
|
|||
}
|
||||
],
|
||||
secondaryFields: [],
|
||||
auxiliaryFields: [
|
||||
{
|
||||
key: "dob",
|
||||
label: "Date of Birth",
|
||||
value: dateOfBirth,
|
||||
textAlignment: TextAlignment.right
|
||||
}
|
||||
],
|
||||
auxiliaryFields: [],
|
||||
backFields: [
|
||||
{
|
||||
key: "uvci",
|
||||
|
@ -141,11 +137,6 @@ export class Payload {
|
|||
key: "issuer",
|
||||
label: "Certificate Issuer",
|
||||
value: certificateIssuer
|
||||
},
|
||||
{
|
||||
key: "country",
|
||||
label: "Country",
|
||||
value: country
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -164,8 +155,17 @@ export class Payload {
|
|||
}
|
||||
|
||||
static fillPassData(type: CertificateType, data: PassDictionary, properties: Object, valueSets: ValueSets): PassDictionary {
|
||||
// Get country name
|
||||
const countryCode = properties['co'];
|
||||
|
||||
if (!(countryCode in valueSets.countryCodes)) {
|
||||
throw new Error('invalidCountryCode');
|
||||
}
|
||||
|
||||
const country = valueSets.countryCodes[countryCode].display;
|
||||
|
||||
switch (type) {
|
||||
case CertificateType.Vaccination:
|
||||
case CertificateType.Vaccine:
|
||||
const dose = `${properties['dn']}/${properties['sd']}`;
|
||||
const dateOfVaccination = properties['dt'];
|
||||
const medialProductKey = properties['mp'];
|
||||
|
@ -178,7 +178,7 @@ export class Payload {
|
|||
throw new Error('invalidManufacturer')
|
||||
}
|
||||
|
||||
const vaccineName = valueSets.medicalProducts[medialProductKey].display;
|
||||
const vaccineName = valueSets.medicalProducts[medialProductKey].display.replace(/\s*\([^)]*\)\s*/g, "");
|
||||
const manufacturer = valueSets.manufacturers[manufacturerKey].display;
|
||||
|
||||
data.secondaryFields.push(...[
|
||||
|
@ -194,11 +194,19 @@ export class Payload {
|
|||
textAlignment: TextAlignment.right
|
||||
}
|
||||
]);
|
||||
data.auxiliaryFields.splice(0, 0, {
|
||||
key: "vaccine",
|
||||
label: "Vaccine",
|
||||
value: vaccineName
|
||||
});
|
||||
data.auxiliaryFields.push(...[
|
||||
{
|
||||
key: "vaccine",
|
||||
label: "Vaccine",
|
||||
value: vaccineName
|
||||
},
|
||||
{
|
||||
key: "cov",
|
||||
label: "Country of Vaccination",
|
||||
value: country,
|
||||
textAlignment: TextAlignment.right
|
||||
}
|
||||
]);
|
||||
data.backFields.push(...[
|
||||
{
|
||||
key: "manufacturer",
|
||||
|
@ -234,7 +242,7 @@ export class Payload {
|
|||
data.secondaryFields.push(...[
|
||||
{
|
||||
key: "result",
|
||||
label: "Result",
|
||||
label: "Test Result",
|
||||
value: testResult
|
||||
},
|
||||
{
|
||||
|
@ -244,7 +252,6 @@ export class Payload {
|
|||
textAlignment: TextAlignment.right
|
||||
}
|
||||
]);
|
||||
data.auxiliaryFields.pop();
|
||||
data.auxiliaryFields.push(...[
|
||||
{
|
||||
key: "test",
|
||||
|
@ -258,6 +265,11 @@ export class Payload {
|
|||
textAlignment: TextAlignment.right
|
||||
},
|
||||
]);
|
||||
data.backFields.push({
|
||||
key: "cot",
|
||||
label: "Country of Test",
|
||||
value: country
|
||||
});
|
||||
if (testingCentre !== undefined)
|
||||
data.backFields.push({
|
||||
key: "centre",
|
||||
|
@ -276,29 +288,28 @@ export class Payload {
|
|||
const validUntil = properties['du'];
|
||||
|
||||
data.secondaryFields.push(...[
|
||||
{
|
||||
key: "result",
|
||||
label: "Test Result",
|
||||
value: "Detected"
|
||||
},
|
||||
{
|
||||
key: "from",
|
||||
label: "Valid From",
|
||||
value: validFrom,
|
||||
},
|
||||
{
|
||||
key: "dov",
|
||||
label: "Date of positive Test",
|
||||
value: firstPositiveTestDate,
|
||||
textAlignment: TextAlignment.right
|
||||
}
|
||||
]);
|
||||
data.auxiliaryFields.pop();
|
||||
data.auxiliaryFields.push(...[
|
||||
{
|
||||
key: "testdate",
|
||||
label: "Test Date",
|
||||
value: firstPositiveTestDate
|
||||
},
|
||||
{
|
||||
key: "until",
|
||||
label: "Valid Until",
|
||||
value: validUntil,
|
||||
},
|
||||
{
|
||||
key: "cov",
|
||||
label: "Country of Test",
|
||||
value: country,
|
||||
textAlignment: TextAlignment.right
|
||||
},
|
||||
]);
|
||||
|
|
Loading…
Reference in New Issue