mirror of
https://github.com/covidpass-org/covidpass.git
synced 2025-02-18 04:30:53 +01:00
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 (
|
return (
|
||||||
<div className="bg-red-100 border border-red-400 text-red-700 px-4 py-3 mt-5 rounded relative" role="alert">
|
<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}>
|
<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"
|
<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">
|
viewBox="0 0 20 20">
|
||||||
|
@ -29,6 +29,11 @@ function Form(): JSX.Element {
|
|||||||
|
|
||||||
// Check if there is a translation and replace message accordingly
|
// Check if there is a translation and replace message accordingly
|
||||||
const setErrorMessage = (message: string) => {
|
const setErrorMessage = (message: string) => {
|
||||||
|
if (message == undefined) {
|
||||||
|
_setErrorMessage(undefined);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const translation = t('errors:'.concat(message));
|
const translation = t('errors:'.concat(message));
|
||||||
_setErrorMessage(translation !== message ? translation : message);
|
_setErrorMessage(translation !== message ? translation : message);
|
||||||
};
|
};
|
||||||
@ -68,7 +73,20 @@ function Form(): JSX.Element {
|
|||||||
const codeReader = new BrowserQRCodeReader();
|
const codeReader = new BrowserQRCodeReader();
|
||||||
|
|
||||||
// Needs to be called before any camera can be accessed
|
// 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
|
// Get preview Element to show camera stream
|
||||||
const previewElem: HTMLVideoElement = document.querySelector('#cameraPreview');
|
const previewElem: HTMLVideoElement = document.querySelector('#cameraPreview');
|
||||||
@ -89,6 +107,9 @@ function Form(): JSX.Element {
|
|||||||
setGlobalControls(undefined);
|
setGlobalControls(undefined);
|
||||||
setIsCameraOpen(false);
|
setIsCameraOpen(false);
|
||||||
}
|
}
|
||||||
|
if (error !== undefined) {
|
||||||
|
setErrorMessage(error.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@ -101,6 +122,12 @@ function Form(): JSX.Element {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
|
|
||||||
|
if(navigator.userAgent.match('CriOS')) {
|
||||||
|
setErrorMessage('safariSupportOnly');
|
||||||
|
setLoading(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!file && !qrCode) {
|
if (!file && !qrCode) {
|
||||||
setErrorMessage('noFileOrQrCode')
|
setErrorMessage('noFileOrQrCode')
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
@ -228,7 +255,7 @@ function Form(): JSX.Element {
|
|||||||
{t('index:addToWallet')}
|
{t('index:addToWallet')}
|
||||||
</button>
|
</button>
|
||||||
<div id="spin" className={loading ? undefined : "hidden"}>
|
<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"
|
<circle className="opacity-0" cx="12" cy="12" r="10" stroke="currentColor"
|
||||||
strokeWidth="4"/>
|
strokeWidth="4"/>
|
||||||
<path className="opacity-75" fill="currentColor"
|
<path className="opacity-75" fill="currentColor"
|
||||||
|
@ -4,7 +4,9 @@ module.exports = {
|
|||||||
locales: [
|
locales: [
|
||||||
'en',
|
'en',
|
||||||
'de', 'de-DE', 'de-AT', 'de-LI', 'de-LU', 'de-CH',
|
'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',
|
localeExtension: 'yml',
|
||||||
},
|
},
|
||||||
|
@ -35,11 +35,10 @@ function Privacy(): JSX.Element {
|
|||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
{t('privacy:generalInfoProvider')}
|
{t('privacy:generalInfoProvider')}
|
||||||
|
|
||||||
<a href="https://www.hetzner.com/de/rechtliches/datenschutz/" className="underline">
|
<a href="https://www.hetzner.com/de/rechtliches/datenschutz/" className="underline">
|
||||||
{t('privacy:privacyPolicy')}
|
{t('privacy:privacyPolicy')}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
{t('privacy:andThe')}
|
{t('privacy:andThe')}
|
||||||
|
|
||||||
<a href="https://docs.hetzner.com/general/general-terms-and-conditions/data-privacy-faq/privacy.tsx" className="underline">
|
<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
|
invalidQrCode: Ungültiger QR-Code
|
||||||
certificateType: Kein gültiger Zertifikatstyp gefunden
|
certificateType: Kein gültiger Zertifikatstyp gefunden
|
||||||
invalidTestResult: Ungültiges Testergebnis
|
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
|
invalidQrCode: Invalid QR code
|
||||||
certificateType: No valid certificate type found
|
certificateType: No valid certificate type found
|
||||||
invalidTestResult: Invalid test result
|
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
|
contact: Contact
|
||||||
email: Email
|
email: Email
|
||||||
website: Website
|
website: Website
|
||||||
process: Simplified of the process
|
process: Simplified explanation of the process
|
||||||
processFirst: First, the following steps happen locally in your browser
|
processFirst: First, the following steps happen locally in your browser
|
||||||
processSecond: Second, the following steps happen on our server
|
processSecond: Second, the following steps happen on our server
|
||||||
processThird: Finally, the following steps happen locally in your browser
|
processThird: Finally, the following steps happen locally in your browser
|
||||||
|
1
public/locales/fi-FI
Symbolic link
1
public/locales/fi-FI
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
fi
|
5
public/locales/fi/common.yml
Normal file
5
public/locales/fi/common.yml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
title: CovidPass
|
||||||
|
subtitle: Lisää EU:n koronatodistus suosikkilompakkosovellukseesi.
|
||||||
|
privacyPolicy: Tietosuojaseloste
|
||||||
|
gitHub: GitHub
|
||||||
|
imprint: Imprint
|
20
public/locales/fi/errors.yml
Normal file
20
public/locales/fi/errors.yml
Normal file
@ -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.
|
27
public/locales/fi/imprint.yml
Normal file
27
public/locales/fi/imprint.yml
Normal file
@ -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).
|
26
public/locales/fi/index.yml
Normal file
26
public/locales/fi/index.yml
Normal file
@ -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
|
56
public/locales/fi/privacy.yml
Normal file
56
public/locales/fi/privacy.yml
Normal file
@ -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
|
signatureFailed: Erreur lors de la signature du pass sur le serveur
|
||||||
decodingFailed: Échec du décodage du QR Code
|
decodingFailed: Échec du décodage du QR Code
|
||||||
invalidColor: Couleur non valide
|
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
|
nameMissing: Échec de la lecture du nom
|
||||||
dobMissing: Échec de la lecture de la date de naissance
|
dobMissing: Échec de la lecture de la date de naissance
|
||||||
invalidMedicalProduct: Produit vaccinal non valide
|
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
|
couldNotDecode: Impossible de décoder le QR Code du fichier
|
||||||
couldNotFindQrCode: Impossible de trouver le QR Code dans le fichier fourni
|
couldNotFindQrCode: Impossible de trouver le QR Code dans le fichier fourni
|
||||||
invalidQrCode: QR Code non valide
|
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
|
stopCamera: Arrêter l'appareil photo
|
||||||
startCamera: Démarrer l'appareil photo
|
startCamera: Démarrer l'appareil photo
|
||||||
openFile: Sélectionner un fichier
|
openFile: Sélectionner un fichier
|
||||||
foundQrCode: Code QR trouvé!
|
foundQrCode: Code QR trouvé !
|
||||||
pickColor: Choisissez une couleur
|
pickColor: Choisissez une couleur
|
||||||
pickColorDescription: Choisissez une couleur de fond pour votre passe.
|
pickColorDescription: Choisissez une couleur de fond pour votre passe.
|
||||||
colorWhite: blanc
|
colorWhite: blanc
|
||||||
|
@ -21,7 +21,7 @@ dataPrivacyFaq: FAQ sur la confidentialité des données
|
|||||||
contact: Contact
|
contact: Contact
|
||||||
email: Email
|
email: Email
|
||||||
website: Site web
|
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.
|
processFirst: Premièrement, les étapes suivantes se déroulent localement dans votre navigateur.
|
||||||
processSecond: Ensuite, les étapes suivantes se déroulent sur notre serveur
|
processSecond: Ensuite, les étapes suivantes se déroulent sur notre serveur
|
||||||
processThird: Enfin, les étapes suivantes se déroulent localement dans votre navigateur
|
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
|
logFilesIpAddress: Les adresses IP pseudonymisées
|
||||||
rights: Vos droits
|
rights: Vos droits
|
||||||
rightsGranted: Conformément au RGPD, vous disposez des droits suivants
|
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.
|
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.
|
rightsErasure: Droit à l'oubli ; Effacement de vos données personnelles.
|
||||||
rightsRectification: Droit de rectification; Vous avez le droit de corriger des données inexactes.
|
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.
|
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
|
thirdParties: Tiers liés
|
||||||
appleSync: Apple peut synchroniser vos passes via iCloud.
|
appleSync: Apple peut synchroniser vos passes via iCloud.
|
||||||
|
1
public/locales/nl-BE
Symbolic link
1
public/locales/nl-BE
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
nl
|
1
public/locales/nl-NL
Symbolic link
1
public/locales/nl-NL
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
nl
|
6
public/locales/nl/common.yml
Normal file
6
public/locales/nl/common.yml
Normal file
@ -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
|
20
public/locales/nl/errors.yml
Normal file
20
public/locales/nl/errors.yml
Normal file
@ -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.
|
27
public/locales/nl/imprint.yml
Normal file
27
public/locales/nl/imprint.yml
Normal file
@ -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)
|
26
public/locales/nl/index.yml
Normal file
26
public/locales/nl/index.yml
Normal file
@ -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
|
57
public/locales/nl/privacy.yml
Normal file
57
public/locales/nl/privacy.yml
Normal file
@ -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";
|
import {Constants} from "./constants";
|
||||||
|
|
||||||
enum CertificateType {
|
enum CertificateType {
|
||||||
Vaccination = 'Vaccination',
|
Vaccine = 'Vaccine',
|
||||||
Test = 'Test',
|
Test = 'Test',
|
||||||
Recovery = 'Recovery',
|
Recovery = 'Recovery',
|
||||||
}
|
}
|
||||||
@ -63,25 +63,35 @@ export class Payload {
|
|||||||
throw new Error('certificateData');
|
throw new Error('certificateData');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get name and date of birth information
|
// Get name information
|
||||||
const nameInformation = covidCertificate['nam'];
|
const nameInformation = covidCertificate['nam'];
|
||||||
const dateOfBirthInformation = covidCertificate['dob'];
|
|
||||||
|
|
||||||
if (nameInformation == undefined) {
|
if (nameInformation == undefined) {
|
||||||
throw new Error('nameMissing');
|
throw new Error('nameMissing');
|
||||||
}
|
}
|
||||||
if (dateOfBirthInformation == undefined) {
|
|
||||||
throw new Error('dobMissing');
|
|
||||||
}
|
|
||||||
|
|
||||||
const name = `${nameInformation['fn']}, ${nameInformation['gn']}`;
|
const firstName = nameInformation['gn'];
|
||||||
const dateOfBirth = dateOfBirthInformation;
|
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;
|
let properties: object;
|
||||||
|
|
||||||
// Set certificate type and properties
|
// Set certificate type and properties
|
||||||
if (covidCertificate['v'] !== undefined) {
|
if (covidCertificate['v'] !== undefined) {
|
||||||
this.certificateType = CertificateType.Vaccination;
|
this.certificateType = CertificateType.Vaccine;
|
||||||
properties = covidCertificate['v'][0];
|
properties = covidCertificate['v'][0];
|
||||||
}
|
}
|
||||||
if (covidCertificate['t'] !== undefined) {
|
if (covidCertificate['t'] !== undefined) {
|
||||||
@ -96,23 +106,16 @@ export class Payload {
|
|||||||
throw new Error('certificateType')
|
throw new Error('certificateType')
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get country code, identifier and issuer
|
// Get identifier and issuer
|
||||||
const countryCode = properties['co'];
|
|
||||||
const uvci = properties['ci'];
|
const uvci = properties['ci'];
|
||||||
const certificateIssuer = properties['is'];
|
const certificateIssuer = properties['is'];
|
||||||
|
|
||||||
if (!(countryCode in valueSets.countryCodes)) {
|
|
||||||
throw new Error('invalidCountryCode');
|
|
||||||
}
|
|
||||||
|
|
||||||
const country = valueSets.countryCodes[countryCode].display;
|
|
||||||
|
|
||||||
const generic: PassDictionary = {
|
const generic: PassDictionary = {
|
||||||
headerFields: [
|
headerFields: [
|
||||||
{
|
{
|
||||||
key: "type",
|
key: "type",
|
||||||
label: "Certificate Type",
|
label: "EU Digital COVID",
|
||||||
value: this.certificateType
|
value: this.certificateType + " Certificate"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
primaryFields: [
|
primaryFields: [
|
||||||
@ -123,14 +126,7 @@ export class Payload {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
secondaryFields: [],
|
secondaryFields: [],
|
||||||
auxiliaryFields: [
|
auxiliaryFields: [],
|
||||||
{
|
|
||||||
key: "dob",
|
|
||||||
label: "Date of Birth",
|
|
||||||
value: dateOfBirth,
|
|
||||||
textAlignment: TextAlignment.right
|
|
||||||
}
|
|
||||||
],
|
|
||||||
backFields: [
|
backFields: [
|
||||||
{
|
{
|
||||||
key: "uvci",
|
key: "uvci",
|
||||||
@ -141,11 +137,6 @@ export class Payload {
|
|||||||
key: "issuer",
|
key: "issuer",
|
||||||
label: "Certificate Issuer",
|
label: "Certificate Issuer",
|
||||||
value: certificateIssuer
|
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 {
|
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) {
|
switch (type) {
|
||||||
case CertificateType.Vaccination:
|
case CertificateType.Vaccine:
|
||||||
const dose = `${properties['dn']}/${properties['sd']}`;
|
const dose = `${properties['dn']}/${properties['sd']}`;
|
||||||
const dateOfVaccination = properties['dt'];
|
const dateOfVaccination = properties['dt'];
|
||||||
const medialProductKey = properties['mp'];
|
const medialProductKey = properties['mp'];
|
||||||
@ -178,7 +178,7 @@ export class Payload {
|
|||||||
throw new Error('invalidManufacturer')
|
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;
|
const manufacturer = valueSets.manufacturers[manufacturerKey].display;
|
||||||
|
|
||||||
data.secondaryFields.push(...[
|
data.secondaryFields.push(...[
|
||||||
@ -194,11 +194,19 @@ export class Payload {
|
|||||||
textAlignment: TextAlignment.right
|
textAlignment: TextAlignment.right
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
data.auxiliaryFields.splice(0, 0, {
|
data.auxiliaryFields.push(...[
|
||||||
key: "vaccine",
|
{
|
||||||
label: "Vaccine",
|
key: "vaccine",
|
||||||
value: vaccineName
|
label: "Vaccine",
|
||||||
});
|
value: vaccineName
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "cov",
|
||||||
|
label: "Country of Vaccination",
|
||||||
|
value: country,
|
||||||
|
textAlignment: TextAlignment.right
|
||||||
|
}
|
||||||
|
]);
|
||||||
data.backFields.push(...[
|
data.backFields.push(...[
|
||||||
{
|
{
|
||||||
key: "manufacturer",
|
key: "manufacturer",
|
||||||
@ -234,7 +242,7 @@ export class Payload {
|
|||||||
data.secondaryFields.push(...[
|
data.secondaryFields.push(...[
|
||||||
{
|
{
|
||||||
key: "result",
|
key: "result",
|
||||||
label: "Result",
|
label: "Test Result",
|
||||||
value: testResult
|
value: testResult
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -244,7 +252,6 @@ export class Payload {
|
|||||||
textAlignment: TextAlignment.right
|
textAlignment: TextAlignment.right
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
data.auxiliaryFields.pop();
|
|
||||||
data.auxiliaryFields.push(...[
|
data.auxiliaryFields.push(...[
|
||||||
{
|
{
|
||||||
key: "test",
|
key: "test",
|
||||||
@ -258,6 +265,11 @@ export class Payload {
|
|||||||
textAlignment: TextAlignment.right
|
textAlignment: TextAlignment.right
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
data.backFields.push({
|
||||||
|
key: "cot",
|
||||||
|
label: "Country of Test",
|
||||||
|
value: country
|
||||||
|
});
|
||||||
if (testingCentre !== undefined)
|
if (testingCentre !== undefined)
|
||||||
data.backFields.push({
|
data.backFields.push({
|
||||||
key: "centre",
|
key: "centre",
|
||||||
@ -276,29 +288,28 @@ export class Payload {
|
|||||||
const validUntil = properties['du'];
|
const validUntil = properties['du'];
|
||||||
|
|
||||||
data.secondaryFields.push(...[
|
data.secondaryFields.push(...[
|
||||||
{
|
|
||||||
key: "result",
|
|
||||||
label: "Test Result",
|
|
||||||
value: "Detected"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
key: "from",
|
key: "from",
|
||||||
label: "Valid From",
|
label: "Valid From",
|
||||||
value: validFrom,
|
value: validFrom,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "dov",
|
||||||
|
label: "Date of positive Test",
|
||||||
|
value: firstPositiveTestDate,
|
||||||
textAlignment: TextAlignment.right
|
textAlignment: TextAlignment.right
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
data.auxiliaryFields.pop();
|
|
||||||
data.auxiliaryFields.push(...[
|
data.auxiliaryFields.push(...[
|
||||||
{
|
|
||||||
key: "testdate",
|
|
||||||
label: "Test Date",
|
|
||||||
value: firstPositiveTestDate
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
key: "until",
|
key: "until",
|
||||||
label: "Valid Until",
|
label: "Valid Until",
|
||||||
value: validUntil,
|
value: validUntil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "cov",
|
||||||
|
label: "Country of Test",
|
||||||
|
value: country,
|
||||||
textAlignment: TextAlignment.right
|
textAlignment: TextAlignment.right
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user