Merge pull request #56 from covidpass-org/dev

Greek translation and pass improvements
This commit is contained in:
Marvin Sextro 2021-07-26 02:26:25 +02:00 committed by GitHub
commit 146706cbbb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 209 additions and 46 deletions

View File

@ -25,7 +25,7 @@ function Page(props: PageProps): JSX.Element {
<footer> <footer>
<nav className="nav flex pt-4 flex-row space-x-4 justify-center text-md font-bold flex-wrap"> <nav className="nav flex pt-4 flex-row space-x-4 justify-center text-md font-bold flex-wrap">
<a href="https://www.paypal.com/paypalme/msextro" className="hover:underline">{t('common:donate')}</a> <a href="https://ko-fi.com/marvinsxtr" className="hover:underline">{t('common:donate')}</a>
<a href="https://github.com/marvinsxtr/covidpass" className="hover:underline">{t('common:gitHub')}</a> <a href="https://github.com/marvinsxtr/covidpass" className="hover:underline">{t('common:gitHub')}</a>
<Link href="/privacy"><a className="hover:underline">{t('common:privacyPolicy')}</a></Link> <Link href="/privacy"><a className="hover:underline">{t('common:privacyPolicy')}</a></Link>
<Link href="/imprint"><a className="hover:underline">{t('common:imprint')}</a></Link> <Link href="/imprint"><a className="hover:underline">{t('common:imprint')}</a></Link>

View File

@ -6,7 +6,8 @@ module.exports = {
'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', 'nl', 'nl-NL', 'nl-BE',
'fi', 'fi-FI' 'fi', 'fi-FI',
'el', 'el-GR', 'el-CY'
], ],
localeExtension: 'yml', localeExtension: 'yml',
}, },

1
public/locales/el-CY Symbolic link
View File

@ -0,0 +1 @@
el

1
public/locales/el-GR Symbolic link
View File

@ -0,0 +1 @@
el

View File

@ -0,0 +1,6 @@
title: CovidPass
subtitle: Προσθέστε το Ευρωπαϊκό ψηφιακό πιστοποιητικό COVID-19 στην αγαπημένη σας Wallet εφαρμογή.
privacyPolicy: Πολιτική Απορρήτου
donate: Χορηγία
gitHub: GitHub
imprint: Όροι Χρήσης

View File

@ -0,0 +1,20 @@
noFileOrQrCode: Παρακαλώ σαρώστε έναν κωδικό QR ή επιλέξτε ένα αρχείο
signatureFailed: Σφάλμα κατά την ψηφιακή υπογραφή του πάσου στον διακομιστή
decodingFailed: Αποτυχία αποκωδικοποίησης του ωφέλιμου φορτίου του κωδικού QR
invalidColor: Μη έγκυρο χρώμα
certificateData: Αποτυχία ανάγνωσης δεδομένων πιστοποιητικού
nameMissing: Αποτυχία ανάγνωσης ονόματος
dobMissing: Αποτυχία ανάγνωσης ημερομηνίας γέννησης
invalidMedicalProduct: Μη έγκυρο ιατρικό προϊόν
invalidCountryCode: Μη έγκυρος κωδικός χώρας
invalidManufacturer: Μη έγκυρος κατασκευαστής
invalidFileType: Μη έγκυρος τύπος αρχείου
couldNotDecode: Δεν ήταν δυνατή η αποκωδικοποίηση του κωδικού QR από το αρχείο
couldNotFindQrCode: Δεν ήταν δυνατή η εύρεση ενός κωδικού QR στο παρεχόμενο αρχείο
invalidQrCode: Μη έγκυρος κωδικός QR
certificateType: Δεν βρέθηκε έγκυρος τύπος πιστοποιητικού
invalidTestResult: Μη έγκυρο αποτέλεσμα εξέτασης
invalidTestType: Μη έγκυρος τύπος εξέτασης
noCameraAccess: Δεν ήταν δυνατή η πρόσβαση στην κάμερα. Ελέγξτε τα δικαιώματα στις Ρυθμίσεις > Safari > Κάμερα.
noCameraFound: Δεν μπόρεσε να βρει τη φωτογραφική μηχανή.
safariSupportOnly: Στο iOS, χρησιμοποιήστε το πρόγραμμα περιήγησης Safari.

View File

@ -0,0 +1,27 @@
heading: Πληροφορίες σχετικά με την § 5 του Γερμανικού Telemediengesetz (TMG)
contact: Επικοινωνία
euDisputeResolution: Επίλυση Διαφορών στην ΕΕ
euDisputeResolutionParagraph: |
Η Ευρωπαϊκή Επιτροπή παρέχει μια πλατφόρμα για διαδικτυακή επίλυση διαφορών (OS): https://ec.europa.eu/consumers/odr
Μπορείτε να βρείτε την διεύθυνση e-mail μας στον παραπάνω σύνδεσμο.
consumerDisputeResolution: Επίλυση διαφορών καταναλωτών / Γενική επιτροπή διαιτησίας
consumerDisputeResolutionParagraph: Δεν είμαστε πρόθυμοι ή υποχρεωμένοι να συμμετάσχουμε σε διαδικασίες επίλυσης διαφορών ενώπιον κάποιας επιτροπής διαιτησίας για τον καταναλωτή.
liabilityForContents: Ευθύνη για το Περιεχόμενο
liabilityForContentsParagraph: |
Ως πάροχος μιας υπηρεσίας, είμαστε υπεύθυνοι για το δικό μας περιεχόμενο σε αυτές τις σελίδες, βάσει της § 7 παράγραφο 1 του TMG και σύμφωνα με τους γενικούς νόμους.
Σύμφωνα με τις §§ 8 έως 10 του TMG, δεν είμαστε υποχρεωμένοι να παρακολουθούμε μεταδιδόμενες ή αποθηκευμένες πληροφορίες ή να διερευνούμε περιπτώσεις που υποδηλώνουν παράνομη δραστηριότητα.
Οι υποχρεώσεις για κατάργηση ή αποκλεισμό της χρήσης πληροφοριών, σύμφωνα με τους γενικούς νόμους, παραμένουν ανεπηρέαστες.
Ωστόσο, η ευθύνη στο θέμα αυτό είναι δυνατή μόνο από τη στιγμή κατά την οποία γίνεται γνωστή κάποια παγειωμένη παράβαση του νόμου.
Αν αντιληφθούμε τέτοιες παραβάσεις, θα καταργήσουμε αμέσως το σχετικό περιεχόμενο.
liabilityForLinks: Ευθύνη για Συνδέσμους
liabilityForLinksParagraph: |
Η υπηρεσία που παρέχουμε περιέχει συνδέσμους προς εξωτερικούς ιστότοπους τρίτων, στα περιεχόμενα των οποίων δεν έχουμε καμία επιρροή.
Επομένως, δεν μπορούμε να αναλάβουμε καμία ευθύνη για αυτά τα περιεχόμενα τρίτων.
Ο αντίστοιχος πάροχος ή διαχειριστής των ιστότοπων είναι πάντα ο υπεύθυνος για το περιεχόμενο των συνδεδεμένων αυτών ιστότοπων.
Οι συνδεδεμένες σελίδες ελέγχθηκαν για πιθανές νομικές παραβιάσεις κατά την στιγμή της δημιουργίας συνδέσμου.
Τυχόν παράνομο περιεχόμενο δεν ήταν αναγνωρίσιμο κατά την στιγμή της δημιουργίας συνδέσμου.
Ωστόσο, ένας μόνιμος έλεγχος του περιεχομένου των συνδεδεμένων σελίδων δεν είναι εύλογος χωρίς συγκεκριμένες ενδείξεις παραβίασης του νόμου.
Αν αντιληφθούμε τυχόν παραβάσεις, θα καταργήσουμε αμέσως αυτούς τους συνδέσμους.
credits: Συντελεστές
creditsSource: Με αποσπάσματα από https://www.e-recht24.de/impressum-generator.html
creditsTranslation: Μεταφράστηκε με το https://www.DeepL.com/Translator (δωρεάν έκδοση)

View File

@ -0,0 +1,29 @@
iosHint: Στο iOS, παρακαλώ χρησιμοποιήστε τον περιηγητή Safari.
errorClose: Κλείσιμο
selectCertificate: Επιλογή Πιστοποιητικού
selectCertificateDescription: |
Παρακαλώ σαρώστε τον κωδικό QR του πιστοποιητικού σας ή επιλέξτε ένα στιγμιότυπο οθόνης ή την σελίδα PDF με τον κωδικό QR.
Λάβετε υπόψη πως η απευθείας επιλογή κάποιου αρχείου μέσω της κάμερας, δεν υποστηρίζεται.
stopCamera: Τερματισμός Κάμερας
startCamera: Εκκίνηση Κάμερας
openFile: Επιλογή Αρχείου
foundQrCode: Βρέθηκε κωδικός QR!
pickColor: Επιλέξτε Χρώμα
pickColorDescription: Επιλέξτε ένα χρώμα φόντου για το πάσο σας.
colorWhite: λευκό
colorBlack: μαύρο
colorGrey: γκρι
colorGreen: πράσινο
colorIndigo: σκούρο μωβ
colorBlue: μπλε
colorPurple: ανοικτό μωβ
colorTeal: τιρκουάζ
addToWallet: Προσθήκη στο Wallet
dataPrivacyDescription: |
Το απόρρητο των δεδομένων αποκτά ιδιαίτερη σημασία κατά την επεξεργασία εκείνων που σχετίζονται με την υγεία.
Για να μπορέσετε να λάβετε μια τεκμηριωμένη απόφαση, παρακαλώ διαβάστε πρώτα την
iAcceptThe: Αποδέχομαι την
privacyPolicy: Πολιτική Απορρήτου
noCameraAccess: Αποτυχία πρόσβασης στην κάμερα. Ελέγξτε τα δικαιώματα στις Ρυθμίσεις > Safari > Κάμερα.
noCameraFound: Δεν βρέθηκε κάποια κάμερα.
safariSupportOnly: Στο iOS, παρακαλώ χρησιμοποιήστε τον περιηγητή Safari.

View File

@ -0,0 +1,57 @@
gdprNotice: |
Η πολιτική απορρήτου μας βασίζεται στους όρους που χρησιμοποιεί ο Ευρωπαίος νομοθέτης
για την έγκριση του Γενικού Κανονισμού για την Προστασία των Δεδομένων (GDPR).
generalInfo: Γενικές πληροφορίες
generalInfoProcess: |
Η όλη διαδικασία της δημιουργίας του πάσου, συμβαίνει τοπικά στο πρόγραμμα περιήγησής σας.
Για την ψηφιακή υπογραφή του πάσου, μόνο μια κατατεμαχισμένη (hashed) αναπαράσταση των δεδομένων σας αποστέλλεται στον διακομιστή.
generalInfoStoring: Τα δεδομένα σας δεν αποθηκεύονται πέρα από την ενεργή περίοδο λειτουργίας (session) του περιηγητή και ο ιστότοπος δεν χρησιμοποιεί cookies.
generalInfoThirdParties: Δεν αποστέλλεται κανένα δεδομένο σε τρίτους.
generalInfoHttps: Τα δεδομένα σας μεταδίδονται με ασφάλεια μέσω https.
generalInfoLocation: Ο διακομιστής μας φιλοξενείται στη Νυρεμβέργη της Γερμανίας.
generalInfoGitHub: Ο πηγαίος κώδικας αυτού του ιστότοπου είναι διαθέσιμος στο
generalInfoLockScreen: Από προεπιλογή, το πάσο Apple Wallet είναι προσβάσιμο από την οθόνη κλειδώματος. Αυτό μπορεί να αλλάξει στις
settings: ρυθμίσεις
generalInfoProvider: |
Ο πάροχος του διακομιστή επεξεργάζεται δεδομένα για την λειτουργία αυτού του ιστότοπου.
Για να κατανοήσετε καλύτερα τα μέτρα που λαμβάνει ο πάροχος για την προστασία των δεδομένων σας, διαβάστε επίσης την δική τους
privacyPolicy: πολιτική απορρήτου
andThe: και τις
dataPrivacyFaq: συχνές ερωτήσεις (FAQ) για το απόρρητο δεδομένων
contact: Επικοινωνία
email: E-mail
website: Ιστότοπος
process: Απλοποιημένη εξήγηση της διαδικασίας
processFirst: Αρχικά, τα ακόλουθα βήματα λαμβάνουν χώρα τοπικά στο πρόγραμμα περιήγησής σας
processSecond: Δεύτερον, τα ακόλουθα βήματα λαμβάνουν χώρα στον διακομιστή μας
processThird: Τέλος, τα ακόλουθα βήματα λαμβάνουν χώρα τοπικά στο πρόγραμμα περιήγησής σας
processRecognizing: Αναγνώριση και εξαγωγή των δεδομένων του κωδικού QR από το πιστοποιητικό που εσείς επιλέγετε
processDecoding: Αποκωδικοποίηση των προσωπικών σας δεδομένων και των δεδομένων που σχετίζονται με την υγεία από το ωφέλιμο φορτίο του κωδικού QR
processAssembling: Συγκέντρωση των δεδομένων σας σε ένα ατελές αρχείο πάσου
processGenerating: Δημιουργία αρχείου που περιέχει κατατεμαχισμένα (hashed) τα δεδομένα που βρίσκονται στο πάσο
processSending: Αποστολή μόνο του αρχείου που περιέχει τα κατατεμαχισμένα (hashed) δεδομένα στον διακομιστή μας
processReceiving: Λήψη και έλεγχος των κατατεμαχισμένων (hashed) δεδομένων που δημιουργήθηκαν τοπικά
processSigning: Ψηφιακή υπογραφή του αρχείου που περιέχει τα κατατεμαχισμένα (hashed) δεδομένα
processSendingBack: Αποστολή της ψηφιακής υπογραφής πίσω στον διακομιστή
processCompleting: Συναρμολόγηση του ψηφιακά υπογεγραμμένου πάσου από το ελλιπές αρχείο που δημιουργήθηκε τοπικά καθώς και την ψηφιακή υπογραφή
processSaving: Αποθήκευση του αρχείου στη συσκευή σας
locallyProcessedData: Δεδομένα επεξεργασμένα τοπικά
the: Το
schema: Digital Covid Certificate Schema
specification: περιέχει λεπτομερείς προδιαγραφές των δεδομένων εκείνων που μπορούν να περιέχονται στον κωδικό QR και που δύναται να υποβληθούν σε επεξεργασία στον περιηγητή σας.
serverProvider: Πάροχος του διακομιστή
serverProviderIs: Ο πάροχος του διακομιστή μας είναι ο
logFiles: Τα ακόλουθα δεδομένα δύναται να συλλεχθούν και να αποθηκευτούν στα αρχεία καταγραφής του διακομιστή
logFilesBrowser: Οι τύποι και οι εκδόσεις των προγραμμάτων περιήγησης που χρησιμοποιήθηκαν
logFilesOs: Το λειτουργικό σύστημα που χρησιμοποιείται από το σύστημα πρόσβασης
logFilesReferrer: Ο ιστότοπος από τον οποίο ένα σύστημα πρόσβασης φτάνει στον ιστότοπό μας (οι λεγόμενες παραπομπές)
logFilesTime: Η ημερομηνία και η ώρα πρόσβασης
logFilesIpAddress: Οι καμουφλαρισμένες διευθύνσεις IP
rights: Τα δικαιώματά σας
rightsGranted: Σύμφωνα με τον κανονισμό GDPR έχετε τα ακόλουθα δικαιώματα
rightsAccess: Δικαίωμα πρόσβασης στα δεδομένα σας - έχετε το δικαίωμα να γνωρίζετε ποια δεδομένα έχουν συλλεχθεί σχετικά με εσάς και πώς αυτά υποβλήθηκαν σε επεξεργασία.
rightsErasure: Δικαίωμα διαγραφής - έχετε το δικαίωμα να διαγράψετε τα προσωπικά σας δεδομένα.
rightsRectification: Δικαίωμα διόρθωσης - έχετε το δικαίωμα να διορθώσετε ανακριβή δεδομένα.
rightsPortability: Δικαίωμα φορητότητας δεδομένων - έχετε το δικαίωμα να μεταφέρετε τα δεδομένα σας από ένα σύστημα επεξεργασίας σε άλλο.
thirdParties: Συνδεδεμένοι πάροχοι τρίτων
appleSync: Η Apple δύναται να συγχρονίσει το πάσο σας μέσω του iCloud

View File

@ -63,12 +63,16 @@ export class Payload {
throw new Error('certificateData'); throw new Error('certificateData');
} }
// Get name information // Get name and date of birth information
const nameInformation = covidCertificate['nam']; const nameInformation = covidCertificate['nam'];
const dateOfBirth = covidCertificate['dob'];
if (nameInformation == undefined) { if (nameInformation == undefined) {
throw new Error('nameMissing'); throw new Error('nameMissing');
} }
if (dateOfBirth == undefined) {
throw new Error('dobMissing');
}
const firstName = nameInformation['gn']; const firstName = nameInformation['gn'];
const lastName = nameInformation['fn']; const lastName = nameInformation['fn'];
@ -106,10 +110,17 @@ export class Payload {
throw new Error('certificateType') throw new Error('certificateType')
} }
// Get identifier and issuer // Get country, 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: [
{ {
@ -151,19 +162,10 @@ export class Payload {
this.img2x = dark ? Constants.img2xWhite : Constants.img2xBlack this.img2x = dark ? Constants.img2xWhite : Constants.img2xBlack
this.dark = dark; this.dark = dark;
this.generic = Payload.fillPassData(this.certificateType, generic, properties, valueSets); this.generic = Payload.fillPassData(this.certificateType, generic, properties, valueSets, country, dateOfBirth);
} }
static fillPassData(type: CertificateType, data: PassDictionary, properties: Object, valueSets: ValueSets): PassDictionary { static fillPassData(type: CertificateType, data: PassDictionary, properties: Object, valueSets: ValueSets, country: string, dateOfBirth: string): 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.Vaccine: case CertificateType.Vaccine:
const dose = `${properties['dn']}/${properties['sd']}`; const dose = `${properties['dn']}/${properties['sd']}`;
@ -201,13 +203,18 @@ export class Payload {
value: vaccineName value: vaccineName
}, },
{ {
key: "cov", key: "dob",
label: "Country of Vaccination", label: "Date of Birth",
value: country, value: dateOfBirth,
textAlignment: TextAlignment.right textAlignment: TextAlignment.right
} }
]); ]);
data.backFields.push(...[ data.backFields.push(...[
{
key: "cov",
label: "Country of Vaccination",
value: country
},
{ {
key: "manufacturer", key: "manufacturer",
label: "Manufacturer", label: "Manufacturer",
@ -216,7 +223,7 @@ export class Payload {
{ {
key: "disclaimer", key: "disclaimer",
label: "Disclaimer", label: "Disclaimer",
value: "This certificate is only valid in combination with the ID card of the certificate holder and expires one year + 14 days after the last dose. The validity of this certificate was not checked by CovidPass." value: "This certificate is not a travel document. It is only valid in combination with the ID card of the certificate holder and may expire one year + 14 days after the last dose. The validity of this certificate was not checked by CovidPass."
} }
]); ]);
break; break;
@ -253,15 +260,15 @@ export class Payload {
} }
]); ]);
data.auxiliaryFields.push(...[ data.auxiliaryFields.push(...[
{
key: "test",
label: "Test Type",
value: testType
},
{ {
key: "time", key: "time",
label: "Time of Test", label: "Time of Test",
value: testTime, value: testTime
},
{
key: "dob",
label: "Date of Birth",
value: dateOfBirth,
textAlignment: TextAlignment.right textAlignment: TextAlignment.right
}, },
]); ]);
@ -276,11 +283,18 @@ export class Payload {
label: "Testing Centre", label: "Testing Centre",
value: testingCentre value: testingCentre
}); });
data.backFields.push({ data.backFields.push(...[
{
key: "test",
label: "Test Type",
value: testType
},
{
key: "disclaimer", key: "disclaimer",
label: "Disclaimer", label: "Disclaimer",
value: "This certificate is only valid in combination with the ID card of the certificate holder and may expire 24h after the test. The validity of this certificate was not checked by CovidPass." value: "This certificate is not a travel document. It is only valid in combination with the ID card of the certificate holder and may expire 24h after the test. The validity of this certificate was not checked by CovidPass."
}); }
]);
break; break;
case CertificateType.Recovery: case CertificateType.Recovery:
const firstPositiveTestDate = properties['fr']; const firstPositiveTestDate = properties['fr'];
@ -289,12 +303,12 @@ export class Payload {
data.secondaryFields.push(...[ data.secondaryFields.push(...[
{ {
key: "from", key: "until",
label: "Valid From", label: "Valid Until",
value: validFrom, value: validUntil,
}, },
{ {
key: "dov", key: "dot",
label: "Date of positive Test", label: "Date of positive Test",
value: firstPositiveTestDate, value: firstPositiveTestDate,
textAlignment: TextAlignment.right textAlignment: TextAlignment.right
@ -302,22 +316,29 @@ export class Payload {
]); ]);
data.auxiliaryFields.push(...[ data.auxiliaryFields.push(...[
{ {
key: "until", key: "from",
label: "Valid Until", label: "Valid From",
value: validUntil, value: validFrom,
}, },
{ {
key: "cov", key: "dob",
label: "Country of Test", label: "Date of Birth",
value: country, value: dateOfBirth,
textAlignment: TextAlignment.right textAlignment: TextAlignment.right
}, }
]); ]);
data.backFields.push({ data.backFields.push(...[
{
key: "cot",
label: "Country of Test",
value: country
},
{
key: "disclaimer", key: "disclaimer",
label: "Disclaimer", label: "Disclaimer",
value: "This certificate is only valid in combination with the ID card of the certificate holder. The validity of this certificate was not checked by CovidPass." value: "This certificate is not a travel document. It is only valid in combination with the ID card of the certificate holder. The validity of this certificate was not checked by CovidPass."
}); }
]);
break; break;
default: default:
throw new Error('certificateType'); throw new Error('certificateType');