Compare commits
14 Commits
50d3830fec
...
4f80dcf33c
Author | SHA1 | Date |
---|---|---|
Marvin Sextro | 4f80dcf33c | |
Marvin Sextro | 8746d3c400 | |
Marvin Sextro | c12e0f5d2e | |
Marvin Sextro | be72026d54 | |
Marvin Sextro | 240f73ab5f | |
Marvin Sextro | d07c6ae232 | |
Marvin Sextro | 0c0ddf2a47 | |
Marvin Sextro | 22c00b4052 | |
Marvin Sextro | 790bdf4494 | |
Marvin Sextro | 1aee8b8d86 | |
nilaallj | 9b0a0a4b81 | |
Hauke Tönjes | ecaa891a40 | |
iBobo | 1949060709 | |
Hauke Tönjes | 03a00ea5cb |
|
@ -1,24 +1,22 @@
|
|||
import {useTranslation} from 'next-i18next';
|
||||
|
||||
interface AlertProps {
|
||||
onClose: () => void;
|
||||
errorMessage: string;
|
||||
message: string;
|
||||
isWarning: boolean;
|
||||
}
|
||||
|
||||
function Alert(props: AlertProps): JSX.Element {
|
||||
const { t } = useTranslation(['index', 'errors']);
|
||||
|
||||
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 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">
|
||||
<title>{t('index:errorClose')}</title>
|
||||
<path
|
||||
d="M14.348 14.849a1.2 1.2 0 0 1-1.697 0L10 11.819l-2.651 3.029a1.2 1.2 0 1 1-1.697-1.697l2.758-3.15-2.759-3.152a1.2 1.2 0 1 1 1.697-1.697L10 8.183l2.651-3.031a1.2 1.2 0 1 1 1.697 1.697l-2.758 3.152 2.758 3.15a1.2 1.2 0 0 1 0 1.698z"/>
|
||||
</svg>
|
||||
</span>
|
||||
<div className={`${props.isWarning ? "bg-yellow-100 border border-yellow-400 text-yellow-700" : "bg-red-100 border border-red-400 text-red-700"} px-4 py-3 mt-5 rounded-md relative flex justify-between items-center`} role="alert">
|
||||
<span className={`${props.isWarning ? "" : "pr-7"} block sm:inline text-lg`} id="message">{props.message}</span>
|
||||
{
|
||||
!props.isWarning &&
|
||||
<span className="absolute top-0 right-0 p-1 m-2" onClick={props.onClose}>
|
||||
<svg className="text-red-500 fill-current h-6 w-6" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="currentColor"
|
||||
d="M6.2253 4.81108C5.83477 4.42056 5.20161 4.42056 4.81108 4.81108C4.42056 5.20161 4.42056 5.83477 4.81108 6.2253L10.5858 12L4.81114 17.7747C4.42062 18.1652 4.42062 18.7984 4.81114 19.1889C5.20167 19.5794 5.83483 19.5794 6.22535 19.1889L12 13.4142L17.7747 19.1889C18.1652 19.5794 18.7984 19.5794 19.1889 19.1889C19.5794 18.7984 19.5794 18.1652 19.1889 17.7747L13.4142 12L19.189 6.2253C19.5795 5.83477 19.5795 5.20161 19.189 4.81108C18.7985 4.42056 18.1653 4.42056 17.7748 4.81108L12 10.5858L6.2253 4.81108Z" />
|
||||
</svg>
|
||||
</span>
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
interface ButtonProps {
|
||||
text?: string,
|
||||
icon?: string,
|
||||
onClick: () => void,
|
||||
}
|
||||
|
||||
function Button(props: ButtonProps): JSX.Element {
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
onClick={props.onClick}
|
||||
className="focus:outline-none h-20 bg-gray-400 dark:bg-gray-600 hover:bg-gray-500 text-white font-semibold rounded-md items-center flex justify-center">
|
||||
{
|
||||
props.icon && <img src={props.icon} className="w-12 h-12 mr-2 -ml-4" />
|
||||
}
|
||||
{props.text}
|
||||
</button>
|
||||
)
|
||||
}
|
||||
|
||||
export default Button;
|
|
@ -1,20 +1,16 @@
|
|||
import {useTranslation} from 'next-i18next';
|
||||
|
||||
interface CheckProps {
|
||||
text: string;
|
||||
}
|
||||
|
||||
function Check(props: CheckProps): JSX.Element {
|
||||
const { t } = useTranslation(["index"]);
|
||||
|
||||
return (
|
||||
<li className="flex flex-row space-x-4 items-center">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5 mx-2 fill-current text-green-500" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fillRule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clipRule="evenodd" />
|
||||
</svg>
|
||||
{props.text}
|
||||
</li>
|
||||
)
|
||||
return (
|
||||
<li className="flex flex-row space-x-4 items-center">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" className="h-5 w-5 mx-2 fill-current text-green-500" viewBox="0 0 20 20" fill="currentColor">
|
||||
<path fillRule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clipRule="evenodd" />
|
||||
</svg>
|
||||
{props.text}
|
||||
</li>
|
||||
)
|
||||
}
|
||||
|
||||
export default Check;
|
|
@ -13,6 +13,7 @@ import {getPayloadBodyFromFile, getPayloadBodyFromQR} from "../src/process";
|
|||
import {PassData} from "../src/pass";
|
||||
import {COLORS} from "../src/colors";
|
||||
import Colors from './Colors';
|
||||
import Button from './Button';
|
||||
|
||||
function Form(): JSX.Element {
|
||||
const {t} = useTranslation(['index', 'errors', 'common']);
|
||||
|
@ -60,6 +61,44 @@ function Form(): JSX.Element {
|
|||
}
|
||||
}, [inputFile])
|
||||
|
||||
// Whether Safari is used or not
|
||||
let [isSafari, setIsSafari] = useState<boolean>(true);
|
||||
|
||||
// Check if Safari is used
|
||||
useEffect(() => {
|
||||
const navigator = window.navigator;
|
||||
setIsSafari(
|
||||
navigator.vendor &&
|
||||
navigator.vendor.indexOf('Apple') > -1 &&
|
||||
navigator.userAgent &&
|
||||
navigator.userAgent.indexOf('CriOS') == -1 &&
|
||||
navigator.userAgent.indexOf('FxiOS') == -1
|
||||
)
|
||||
}, []);
|
||||
|
||||
// Whether Safari is used or not
|
||||
let [isShareDialogAvailable, setIsShareDialogAvailable] = useState<boolean>(false);
|
||||
|
||||
// Check if share dialog is available
|
||||
useEffect(() => {
|
||||
setIsShareDialogAvailable(window.navigator && window.navigator.share !== undefined);
|
||||
}, []);
|
||||
|
||||
// Open share dialog
|
||||
async function showShareDialog() {
|
||||
const shareData = {
|
||||
title: document.title,
|
||||
text: t('common:title') + ' – ' + t('common:subtitle'),
|
||||
url: window.location.protocol + "//" + window.location.host,
|
||||
};
|
||||
|
||||
try {
|
||||
await window.navigator.share(shareData);
|
||||
} catch(error) {
|
||||
console.log(error);
|
||||
}
|
||||
}
|
||||
|
||||
// Show file Dialog
|
||||
async function showFileDialog() {
|
||||
inputFile.current.click();
|
||||
|
@ -102,7 +141,7 @@ function Form(): JSX.Element {
|
|||
// Start decoding from video device
|
||||
await codeReader.decodeFromVideoDevice(undefined,
|
||||
previewElem,
|
||||
(result, error, controls) => {
|
||||
(result, _error, controls) => {
|
||||
if (result !== undefined) {
|
||||
setQrCode(result);
|
||||
setFile(undefined);
|
||||
|
@ -113,9 +152,6 @@ function Form(): JSX.Element {
|
|||
setGlobalControls(undefined);
|
||||
setIsCameraOpen(false);
|
||||
}
|
||||
if (error !== undefined) {
|
||||
setErrorMessage(error.message);
|
||||
}
|
||||
}
|
||||
)
|
||||
);
|
||||
|
@ -164,22 +200,15 @@ function Form(): JSX.Element {
|
|||
return (
|
||||
<div>
|
||||
<form className="space-y-5" id="form" onSubmit={addToWallet}>
|
||||
{
|
||||
!isSafari && <Alert isWarning={true} message={t('iosHint')} onClose={() => {}}/>
|
||||
}
|
||||
<Card step="1" heading={t('index:selectCertificate')} content={
|
||||
<div className="space-y-5">
|
||||
<p>{t('index:selectCertificateDescription')}</p>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-5">
|
||||
<button
|
||||
type="button"
|
||||
onClick={isCameraOpen ? hideCameraView : showCameraView}
|
||||
className="focus:outline-none h-20 bg-gray-500 hover:bg-gray-700 text-white font-semibold rounded-md">
|
||||
{isCameraOpen ? t('index:stopCamera') : t('index:startCamera')}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={showFileDialog}
|
||||
className="focus:outline-none h-20 bg-gray-500 hover:bg-gray-700 text-white font-semibold rounded-md">
|
||||
{t('index:openFile')}
|
||||
</button>
|
||||
<Button text={isCameraOpen ? t('index:stopCamera') : t('index:startCamera')} onClick={isCameraOpen ? hideCameraView : showCameraView} />
|
||||
<Button text={t('index:openFile')} onClick={showFileDialog} />
|
||||
</div>
|
||||
|
||||
<video id="cameraPreview"
|
||||
|
@ -195,7 +224,7 @@ function Form(): JSX.Element {
|
|||
<div className="flex items-center space-x-1">
|
||||
<svg className="h-4 w-4 text-green-600" fill="none" viewBox="0 0 24 24"
|
||||
stroke="currentColor">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M9 5l7 7-7 7"/>
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="3" d="M9 5l7 7-7 7"/>
|
||||
</svg>
|
||||
<span className="w-full truncate">
|
||||
{
|
||||
|
@ -261,11 +290,21 @@ function Form(): JSX.Element {
|
|||
</div>
|
||||
</div>
|
||||
}/>
|
||||
{
|
||||
errorMessage && <Alert isWarning={false} message={errorMessage} onClose={() => setErrorMessage(undefined)}/>
|
||||
}
|
||||
<Card content={
|
||||
<div className={`${isShareDialogAvailable ? "md:grid-cols-2": ""} grid-cols-1 grid gap-5`}>
|
||||
{
|
||||
isShareDialogAvailable && <Button text={t('index:share')} onClick={showShareDialog} />
|
||||
}
|
||||
<Button icon="kofi.png" text={t('common:donate')} onClick={() => {
|
||||
window.open('https://ko-fi.com/marvinsxtr', '_blank');
|
||||
}} />
|
||||
</div>
|
||||
}/>
|
||||
</form>
|
||||
<canvas id="canvas" style={{display: "none"}}/>
|
||||
{
|
||||
errorMessage && <Alert errorMessage={errorMessage} onClose={() => setErrorMessage(undefined)}/>
|
||||
}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
|
|
@ -24,8 +24,7 @@ function Page(props: PageProps): JSX.Element {
|
|||
{props.content}
|
||||
|
||||
<footer>
|
||||
<nav className="nav flex pt-4 flex-row space-x-4 justify-center text-md font-bold flex-wrap">
|
||||
<a href="https://ko-fi.com/marvinsxtr" className="hover:underline">{t('common:donate')}</a>
|
||||
<nav className="nav flex flex-row space-x-4 justify-center text-md font-bold flex-wrap">
|
||||
<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="/imprint"><a className="hover:underline">{t('common:imprint')}</a></Link>
|
||||
|
|
|
@ -1,6 +1,3 @@
|
|||
/// <reference types="next" />
|
||||
/// <reference types="next/types/global" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||
|
|
|
@ -11,7 +11,8 @@ module.exports = {
|
|||
'it', 'it-IT', 'it-CH',
|
||||
'es', 'es-ES',
|
||||
'no', 'no-NO',
|
||||
'nb', 'nb-NO'
|
||||
'nb', 'nb-NO',
|
||||
'sv', 'sv-SE', 'sv-FI'
|
||||
],
|
||||
localeExtension: 'yml',
|
||||
},
|
||||
|
|
|
@ -12,14 +12,10 @@ function Imprint(): JSX.Element {
|
|||
<Card step="§" heading={t('common:imprint')} content={
|
||||
<div className="space-y-3">
|
||||
<p className="font-bold">{t('imprint:heading')}</p>
|
||||
<p>
|
||||
Marvin Sextro<br />
|
||||
Wilhelm-Busch-Str. 8A<br />
|
||||
30167 Hannover<br />
|
||||
</p>
|
||||
<p>Marvin Sextro</p>
|
||||
<p className="font-bold">{t('imprint:contact')}</p>
|
||||
<p>
|
||||
<a href="mailto:marvin.sextro@gmail.com" className="underline">marvin.sextro@gmail.com</a>
|
||||
<a href="mailto:covidpass@marvinsextro.de" className="underline">covidpass@marvinsextro.de</a>
|
||||
</p>
|
||||
<p className="font-bold">{t('imprint:euDisputeResolution')}</p>
|
||||
<p>{t('imprint:euDisputeResolutionParagraph')}</p>
|
||||
|
|
|
@ -40,9 +40,8 @@ function Index(): JSX.Element {
|
|||
<Page content={
|
||||
<div className="space-y-5">
|
||||
<Card content={
|
||||
<p>{t('common:subtitle')} {t('index:iosHint')}</p>
|
||||
<p>{t('common:subtitle')}</p>
|
||||
}/>
|
||||
|
||||
<Form/>
|
||||
</div>
|
||||
}/>
|
||||
|
|
|
@ -49,12 +49,11 @@ function Privacy(): JSX.Element {
|
|||
</div>
|
||||
<p className="font-bold">{t('privacy:contact')}</p>
|
||||
<p>
|
||||
Marvin Sextro<br/>
|
||||
Wilhelm-Busch-Str. 8A<br/>
|
||||
30167 Hannover<br/>
|
||||
Marvin Sextro
|
||||
<br/>
|
||||
{t('privacy:email')}:
|
||||
|
||||
<a href="mailto:marvin.sextro@gmail.com">marvin.sextro@gmail.com</a>
|
||||
<a href="mailto:covidpass@marvinsextro.de" className="underline">covidpass@marvinsextro.de</a>
|
||||
<br/>
|
||||
{t('privacy:website')}:
|
||||
|
||||
|
@ -137,9 +136,9 @@ function Privacy(): JSX.Element {
|
|||
</a>
|
||||
</li>
|
||||
<li>
|
||||
PayPal:
|
||||
Ko-fi:
|
||||
|
||||
<a href="https://www.paypal.com/de/webapps/mpp/ua/privacy-full?locale.x=en_EN" className="underline">
|
||||
<a href="https://more.ko-fi.com/privacy" className="underline">
|
||||
{t('common:privacyPolicy')}
|
||||
</a>
|
||||
</li>
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
|
@ -1,9 +1,7 @@
|
|||
iosHint: Bitte verwende unter iOS den Safari Browser.
|
||||
errorClose: Schließen
|
||||
selectCertificate: Zertifikat auswählen
|
||||
selectCertificateDescription: |
|
||||
Scanne den QR-Code auf Deinem Zertifikat oder wähle einen Screenshot oder eine PDF-Datei mit dem QR-Code.
|
||||
Bitte beachte, dass die Auswahl einer Datei direkt von der Kamera nicht unterstützt wird.
|
||||
selectCertificateDescription: Scanne den QR-Code auf Deinem Zertifikat oder wähle einen Screenshot oder eine PDF-Datei mit dem QR-Code.
|
||||
stopCamera: Kamera stoppen
|
||||
startCamera: Kamera starten
|
||||
openFile: Datei auswählen
|
||||
|
@ -27,3 +25,4 @@ privacyPolicy: Datenschutzerklärung
|
|||
createdOnDevice: Auf Deinem Gerät erstellt
|
||||
openSourceTransparent: Open Source und transparent
|
||||
hostedInEU: In der EU gehostet
|
||||
share: Weiterempfehlen
|
|
@ -1,9 +1,7 @@
|
|||
iosHint: Στο iOS, παρακαλώ χρησιμοποιήστε τον περιηγητή Safari.
|
||||
errorClose: Κλείσιμο
|
||||
selectCertificate: Επιλογή Πιστοποιητικού
|
||||
selectCertificateDescription: |
|
||||
Παρακαλώ σαρώστε τον κωδικό QR του πιστοποιητικού σας ή επιλέξτε ένα στιγμιότυπο οθόνης ή την σελίδα PDF με τον κωδικό QR.
|
||||
Λάβετε υπόψη πως η απευθείας επιλογή κάποιου αρχείου μέσω της κάμερας, δεν υποστηρίζεται.
|
||||
selectCertificateDescription: Παρακαλώ σαρώστε τον κωδικό QR του πιστοποιητικού σας ή επιλέξτε ένα στιγμιότυπο οθόνης ή την σελίδα PDF με τον κωδικό QR.
|
||||
stopCamera: Τερματισμός Κάμερας
|
||||
startCamera: Εκκίνηση Κάμερας
|
||||
openFile: Επιλογή Αρχείου
|
||||
|
@ -27,3 +25,4 @@ privacyPolicy: Πολιτική Απορρήτου
|
|||
createdOnDevice: Δημιουργείται στη συσκευή σας
|
||||
openSourceTransparent: Ανοιχτού κώδικα και διαφανής
|
||||
hostedInEU: Φιλοξενείται στην ΕΕ
|
||||
share: Συστήσει
|
|
@ -1,9 +1,7 @@
|
|||
iosHint: On iOS, please use the Safari Browser.
|
||||
errorClose: Close
|
||||
selectCertificate: Select Certificate
|
||||
selectCertificateDescription: |
|
||||
Please scan the QR code on your certificate or select a screenshot or PDF page with the QR code.
|
||||
Note that selecting a file directly from camera is not supported.
|
||||
selectCertificateDescription: Please scan the QR code on your certificate or select a screenshot or PDF page with the QR code.
|
||||
stopCamera: Stop Camera
|
||||
startCamera: Start Camera
|
||||
openFile: Select File
|
||||
|
@ -27,3 +25,4 @@ privacyPolicy: Privacy Policy
|
|||
createdOnDevice: Created on your device
|
||||
openSourceTransparent: Open source and transparent
|
||||
hostedInEU: Hosted in the EU
|
||||
share: Share
|
|
@ -1,9 +1,7 @@
|
|||
iosHint: En iOS, Por favor use el navegador Safari.
|
||||
errorClose: Cerrar
|
||||
selectCertificate: Seleccione Certificado
|
||||
selectCertificateDescription: |
|
||||
Escanee el código QR de su certificado, o seleccione una captura de pantalla o un PDF que contenga el código QR.
|
||||
Tenga en cuenta que no se admite la selección de un archivo directamente desde la cámara.
|
||||
selectCertificateDescription: Escanee el código QR de su certificado, o seleccione una captura de pantalla o un PDF que contenga el código QR.
|
||||
stopCamera: Detener Cámara
|
||||
startCamera: Iniciar Cámara
|
||||
openFile: Seleccione archivo
|
||||
|
@ -27,3 +25,4 @@ privacyPolicy: Política de Privacidad
|
|||
createdOnDevice: Creado en su dispositivo
|
||||
openSourceTransparent: Open source y transparente
|
||||
hostedInEU: Alojado en la UE
|
||||
share: Recomendar
|
|
@ -1,9 +1,7 @@
|
|||
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.
|
||||
selectCertificateDescription: Skannaa todistuksessa oleva QR-koodi tai valitse kuvakaappaus tai PDF-sivu, jossa on QR-koodi.
|
||||
stopCamera: Lopeta Kamera
|
||||
startCamera: Käynnistä Kamera
|
||||
openFile: Valitse Tiedosto
|
||||
|
@ -27,3 +25,4 @@ privacyPolicy: Tietosuojaselosteen
|
|||
createdOnDevice: Luotu laitteellasi
|
||||
openSourceTransparent: Avoin lähdekoodi ja läpinäkyvä
|
||||
hostedInEU: Isännöidään EU:ssa.
|
||||
share: Suosittele
|
|
@ -1,9 +1,7 @@
|
|||
iosHint: Sur iOS, veuillez utiliser le navigateur Safari.
|
||||
errorClose: Fermez
|
||||
selectCertificate: Sélectionner le certificat
|
||||
selectCertificateDescription: |
|
||||
Veuillez scanner le QR Code de votre certificat ou sélectionner une capture d'écran ou une page PDF avec le QR Code.
|
||||
Notez que la sélection d'un fichier directement à partir de l'appareil photo n'est pas prise en charge.
|
||||
selectCertificateDescription: Veuillez scanner le QR Code de votre certificat ou sélectionner une capture d'écran ou une page PDF avec le QR Code.
|
||||
stopCamera: Arrêter l'appareil photo
|
||||
startCamera: Démarrer l'appareil photo
|
||||
openFile: Sélectionner un fichier
|
||||
|
@ -27,3 +25,4 @@ privacyPolicy: Politique de confidentialité
|
|||
createdOnDevice : Créé sur votre appareil
|
||||
openSourceTransparent : Open source et transparent
|
||||
hostedInEU : Hébergé dans l'UE
|
||||
share: Recommander
|
|
@ -1,9 +1,7 @@
|
|||
iosHint: Su iOS, si prega di utilizzare il browser Safari.
|
||||
errorClose: Chiudi
|
||||
selectCertificate: Seleziona il certificato
|
||||
selectCertificateDescription: |
|
||||
Scannerizza il codice QR sul tuo certificato o seleziona uno screenshot o una pagina PDF con il codice QR.
|
||||
Nota che la selezione di un file direttamente dalla fotocamera non è supportata.
|
||||
selectCertificateDescription: Scannerizza il codice QR sul tuo certificato o seleziona uno screenshot o una pagina PDF con il codice QR.
|
||||
stopCamera: Blocca Fotocamera
|
||||
startCamera: Avvia Fotocamera
|
||||
openFile: Seleziona un File
|
||||
|
@ -27,3 +25,4 @@ privacyPolicy: Privacy Policy
|
|||
createdOnDevice: Creato sul tuo dispositivo
|
||||
openSourceTransparent: Open source e trasparente
|
||||
hostedInEU: Server nell'UE
|
||||
share: Raccomandare
|
|
@ -1,9 +1,7 @@
|
|||
iosHint: På iOS, vennligst bruk Safari nettleseren.
|
||||
errorClose: Lukk
|
||||
selectCertificate: Velg Sertifikat
|
||||
selectCertificateDescription: |
|
||||
Skann QR-koden på sertifikatet ditt, eller velg et skjermbilde eller en PDF med QR-koden.
|
||||
Vær oppmerksom på at det ikke støttes å velge en fil direkte fra kameraet.
|
||||
selectCertificateDescription: Skann QR-koden på sertifikatet ditt, eller velg et skjermbilde eller en PDF med QR-koden.
|
||||
stopCamera: Stopp Kamera
|
||||
startCamera: Start Kamera
|
||||
openFile: Velg Fil
|
||||
|
@ -27,3 +25,4 @@ privacyPolicy: Personvernerklæring
|
|||
createdOnDevice: Laget på enheten din
|
||||
openSourceTransparent: Åpen kildekode og gjennomsiktig
|
||||
hostedInEU: Driftet i EU
|
||||
share: Anbefale
|
|
@ -1,9 +1,7 @@
|
|||
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.
|
||||
selectCertificateDescription: Scan de QR-code op uw certificaat of selecteer een screenshot of pdf-pagina met de QR-code.
|
||||
stopCamera: Stop Camera
|
||||
startCamera: Start Camera
|
||||
openFile: Selecteer Bestand
|
||||
|
@ -27,3 +25,4 @@ privacyPolicy: Privacybeleid
|
|||
createdOnDevice: Aangemaakt op uw apparaat
|
||||
openSourceTransparent: Open source en transparant
|
||||
hostedInEU: Gehost in de EU
|
||||
share: Aanbevelen
|
|
@ -0,0 +1 @@
|
|||
sv
|
|
@ -0,0 +1 @@
|
|||
sv
|
|
@ -0,0 +1,6 @@
|
|||
title: CovidPass
|
||||
subtitle: Lägg till digitala Covid-certifikat från EU i din favoritplånboksapp.
|
||||
privacyPolicy: Integritetspolicy
|
||||
donate: Sponsra
|
||||
gitHub: GitHub
|
||||
imprint: Juridisk info
|
|
@ -0,0 +1,20 @@
|
|||
noFileOrQrCode: Vänligen skanna en QR-kod eller välj en fil
|
||||
signatureFailed: Fel vid pass-signering på server
|
||||
decodingFailed: Misslyckades att avkoda QR-kodens nyttolast
|
||||
invalidColor: Ogiltig färg
|
||||
certificateData: Misslyckades att läsa in certifikatdata
|
||||
nameMissing: Inläsning av namn misslyckades
|
||||
dobMissing: Inläsning av födelsedatum misslyckades
|
||||
invalidMedicalProduct: Ogiltig medicinsk produkt
|
||||
invalidCountryCode: Ogiltig landskod
|
||||
invalidManufacturer: Ogiltig tillverkare
|
||||
invalidFileType: Ogiltig filtyp
|
||||
couldNotDecode: Kunde inte avkoda QR-kod från fil
|
||||
couldNotFindQrCode: Kunde inte hitta QR-kod i försedd fil
|
||||
invalidQrCode: Ogiltig QR-kod
|
||||
certificateType: Ingen giltig certifikatstyp hittades
|
||||
invalidTestResult: Ogiltigt testreultat
|
||||
invalidTestType: Ogiltig testtyp
|
||||
noCameraAccess: Nekades tillgång till kamera. Kontrollera behörigheter under Inställningar > Safari > Kamera.
|
||||
noCameraFound: Kunde inte hitta kamera.
|
||||
safariSupportOnly: På iOS, vänligen använd Safari som webbläsare.
|
|
@ -0,0 +1,26 @@
|
|||
heading: Information i enlighet med § 5 Tyska telemedielagen (TMG)
|
||||
contact: Kontakt
|
||||
euDisputeResolution: Tvistlösning inom EU
|
||||
euDisputeResolutionParagraph: |
|
||||
Europeiska kommissionen tillhandahåller en plattform för tvistlösning online via https://ec.europa.eu/consumers/odr.
|
||||
Du hittar vår e-postadress i stycket ovan.
|
||||
consumerDisputeResolution: Konsumenttvistlösning / Allmän sklijenämnd
|
||||
consumerDisputeResolutionParagraph: Vi är inte villiga eller ålagda att delta i tvistlösningsärenden inför en konsumentskiljenämnd.
|
||||
liabilityForContents: Ansvar för innehåll
|
||||
liabilityForContentsParagraph: |
|
||||
Som tjänsteleverantör är vi ansvariga för vårt eget innehåll på dessa sidor i enlighet med § 7 paragraf 1 TMG under de almänna lagarna.
|
||||
Enligt §§ 8 till 10 TMG är vi inte skyldiga att övervaka överförd eller lagrad information eller undersöka omständligheter som påvisar olaglig verksamhet.
|
||||
Skyldigheter att radera eller blockera användande av information under de allmänna lagarna förblir opåverkade.
|
||||
Dock är ansvar i detta avseende endast möjligt från den tidpunkt en konkret överträdelse av lagen blir känd. Om vi blir medvetna om en sådan överträdelse kommer vi obedelbart ta bort den information som är relevant i sammanhanget.
|
||||
liabilityForLinks: Ansvar för länkar
|
||||
liabilityForLinksParagraph: |
|
||||
Vårt erbjudande innehåller länkar till tredjeparters externa webbplatser, vars innehåll vi inte har inflytande över.
|
||||
Vi kan därför inte åta oss något ansvar för dessa externa innehåll.
|
||||
Leverantören eller operatören för respektive länkad webbplats är alltid ansvariga för dess respektive innehåll.
|
||||
De länkade sidorna kontrollerades för eventuella lagliga överträdelser vid den tidpunkt de länkades.
|
||||
Inget olagligt innehåll kunde påvisas vid tidpunkten för länkning.
|
||||
Permanenta kontroller av de länkade webbplatsernas innehåll är dock inte rimliga utan konkreta bevis för lagbrott.
|
||||
Om vi blir medvetna om några överträdelser kommer vi omedelbart radera länkarna ifråga.
|
||||
credits: Erkännanden
|
||||
creditsSource: Med utdrag från https://www.e-recht24.de/impressum-generator.html
|
||||
creditsTranslation: Översatt med https://www.DeepL.com/Translator (gratis version)
|
|
@ -0,0 +1,28 @@
|
|||
iosHint: På iOS, vänligen använd Safari som webbläsare.
|
||||
errorClose: Stäng
|
||||
selectCertificate: Välj certifikat
|
||||
selectCertificateDescription: Vänligen skanna QR-koden på ditt certifikat eller välj en skärmdump eller PDF-fil som innehåller QR-koden.
|
||||
stopCamera: Stäng kamera
|
||||
startCamera: Öppna kamera
|
||||
openFile: Välj fil
|
||||
foundQrCode: QR-kod hittad!
|
||||
pickColor: Välj en färg
|
||||
pickColorDescription: Välj en bakgrundsfärg till ditt pass.
|
||||
colorWhite: vit
|
||||
colorBlack: svart
|
||||
colorGrey: grå
|
||||
colorGreen: grön
|
||||
colorIndigo: indigo
|
||||
colorBlue: blå
|
||||
colorPurple: lila
|
||||
colorTeal: turkos
|
||||
addToWallet: Lägg till i Plånbok
|
||||
dataPrivacyDescription: |
|
||||
Datasekretess är av särskild vikt vid bearbetning av hälsorelaterad data.
|
||||
För att du ska kunna fatta ett välgrundat beslut, vänligen läs
|
||||
iAcceptThe: Jag godtar
|
||||
privacyPolicy: integritetspolicyn
|
||||
createdOnDevice: Skapad på din enhet
|
||||
openSourceTransparent: Öppen källkod och transparent
|
||||
hostedInEU: Drivs från EU
|
||||
share: Rekommendera
|
|
@ -0,0 +1,56 @@
|
|||
gdprNotice: |
|
||||
Vår integritetspolicy är baserad på de villkår som används av den europeiska lagstiftaren för verkställandet av den allmänna dataskyddsförordningen (GDPR).
|
||||
generalInfo: Allmän information
|
||||
generalInfoProcess: |
|
||||
Hela den process som genererar passfilen sker lokalt i din webbläsare.
|
||||
Under signeringen skickas endast en kondenserad motsvarighet av din data till servern.
|
||||
generalInfoStoring: Din data sparas inte utanför den aktiva webbläsarsessionen och sidan använder sig inte av cookies.
|
||||
generalInfoThirdParties: Ingen data skickas till tredjeparter.
|
||||
generalInfoHttps: Vi överför din data säkert över HTTPS.
|
||||
generalInfoLocation: Vår server är baserad i Nürnberg, Tyskland.
|
||||
generalInfoGitHub: Källkoden till denna sida finns tillgänglig på
|
||||
generalInfoLockScreen: Som standrad är kuponger i Apple Plånbok tillgängliga från låsskärmen. Detta kan ändras i
|
||||
settings: Inställningar
|
||||
generalInfoProvider: |
|
||||
Tjänsteleverantören processerar data som sedan används av sidan.
|
||||
För att bättre förstå vilka åtgärder de vidtar för att skydda din data, vänligen läs deras
|
||||
privacyPolicy: integritetspolicy
|
||||
andThe: samt deras
|
||||
dataPrivacyFaq: FAQ om datasekretess
|
||||
contact: Kontakt
|
||||
email: E-post
|
||||
website: Hemsida
|
||||
process: Förenklad förklaring av processen
|
||||
processFirst: Först genomförs följande steg lokalt i din webbläsare
|
||||
processSecond: Sedan genomförs följande steg på vår server
|
||||
processThird: Slutligen genomförs följande steg lokalt i din webbläsare
|
||||
processRecognizing: Datan från QR-koden i ditt valda certifikat identifieras och extraheras
|
||||
processDecoding: Din personliga hälsorelaterade data från QR-kodens nyttolast avkodas
|
||||
processAssembling: En ofullständig passfil sätts ihop genom din data
|
||||
processGenerating: En fil med kondenseringar av den data som finns lagrad i passfilen genereras
|
||||
processSending: Endast den fil som innehåller kondenseringarna skickas till vår server
|
||||
processReceiving: De kondenseringar som genererades lokalt tas emot och kontrolleras
|
||||
processSigning: Filen som innehåller kondenseringarna signeras
|
||||
processSendingBack: Signaturen skickas tillbaka
|
||||
processCompleting: En signerad passfil sätts ihop genom signaturen samt den ofullständiga, lokalt genererade filen
|
||||
processSaving: Filen sparas på din enhet
|
||||
locallyProcessedData: Lokalt behandlad data
|
||||
the:
|
||||
schema: Digital Covid Certificate Schema
|
||||
specification: innehåller en detaljerad specifikation av den data som finns i QR-koden och som kommer att bearbetas i din webbläsare.
|
||||
serverProvider: Serverleverantör
|
||||
serverProviderIs: Vår serverleverantör är
|
||||
logFiles: Följande data kan komma att samlas in och sparas i serverns loggfiler.
|
||||
logFilesBrowser: Webbläsartyper och versioner
|
||||
logFilesOs: Operativsystemet som används av den klient som begär tillgång
|
||||
logFilesReferrer: Den webbsida från vilken den klient som begärt tillgång har nått vår webbsida (så kallade hänvisare)
|
||||
logFilesTime: Datum och tid för tillgång
|
||||
logFilesIpAddress: Den pseudonymiserade IP-adressen
|
||||
rights: Dina rättigheter
|
||||
rightsGranted: I enlighet med GDPR har du följande rättigheter
|
||||
rightsAccess: Rätt till åtkomst av din data; Du har rätt att få veta vilken data som som har samlats in om dig samt hur den har bearbetats.
|
||||
rightsErasure: Rätten att bli bortglömd; Du har rätt till att få din personliga data raderad.
|
||||
rightsRectification: Rätt att göra invändningar; Du har rätt till att korrigera felaktiga data.
|
||||
rightsPortability: Rätt till dataportabilitet; Du har rätt till överförning av din data från ett bearbetningssystem till ett annat.
|
||||
thirdParties: Länkar till tredjeparter
|
||||
appleSync: Apple kan komma att synkronisera dina pass via iCloud
|
Loading…
Reference in New Issue