sme v1 setup
|
|
@ -0,0 +1,29 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
.env
|
||||
.env.development
|
||||
.env.production
|
||||
private
|
||||
*.zip
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
# React + Vite
|
||||
|
||||
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
||||
|
||||
Currently, two official plugins are available:
|
||||
|
||||
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
|
||||
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
||||
|
||||
## Expanding the ESLint configuration
|
||||
|
||||
If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
import js from '@eslint/js'
|
||||
import globals from 'globals'
|
||||
import reactHooks from 'eslint-plugin-react-hooks'
|
||||
import reactRefresh from 'eslint-plugin-react-refresh'
|
||||
import { defineConfig, globalIgnores } from 'eslint/config'
|
||||
|
||||
export default defineConfig([
|
||||
globalIgnores(['dist']),
|
||||
{
|
||||
files: ['**/*.{js,jsx}'],
|
||||
extends: [
|
||||
js.configs.recommended,
|
||||
reactHooks.configs['recommended-latest'],
|
||||
reactRefresh.configs.vite,
|
||||
],
|
||||
languageOptions: {
|
||||
ecmaVersion: 2020,
|
||||
globals: globals.browser,
|
||||
parserOptions: {
|
||||
ecmaVersion: 'latest',
|
||||
ecmaFeatures: { jsx: true },
|
||||
sourceType: 'module',
|
||||
},
|
||||
},
|
||||
rules: {
|
||||
'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
|
||||
},
|
||||
},
|
||||
])
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>SME</title>
|
||||
<link rel="preload" href="/fonts/great-vibes/great-vibes-regular.woff2" as="font" type="font/woff2" crossorigin="anonymous" />
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.jsx"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
{
|
||||
"name": "sme-client",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite --host",
|
||||
"build": "vite build",
|
||||
"lint": "eslint .",
|
||||
"preview": "vite build && vite preview --host",
|
||||
"deploy": "npm run build -- --mode development && pscp -i private\\SME-Test.ppk -r dist root@52.24.109.130:/var/www/sme"
|
||||
},
|
||||
"dependencies": {
|
||||
"@tabler/icons-react": "^3.44.0",
|
||||
"@tailwindcss/vite": "^4.1.10",
|
||||
"axios": "^1.11.0",
|
||||
"canvas-confetti": "^1.9.3",
|
||||
"i18next": "^26.0.6",
|
||||
"i18next-browser-languagedetector": "^8.2.1",
|
||||
"i18next-http-backend": "^4.0.0",
|
||||
"immer": "^11.1.8",
|
||||
"lodash": "^4.17.21",
|
||||
"lucide-react": "^0.523.0",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
"react-i18next": "^17.0.4",
|
||||
"react-router-dom": "^7.9.4",
|
||||
"tailwindcss": "^4.1.10",
|
||||
"vite": "^6.3.5",
|
||||
"vite-plugin-svgr": "^4.5.0",
|
||||
"zustand": "^5.0.12"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.29.0",
|
||||
"@types/react": "^19.1.8",
|
||||
"@types/react-dom": "^19.1.6",
|
||||
"@vitejs/plugin-react": "^4.5.2",
|
||||
"daisyui": "^5.1.29",
|
||||
"eslint": "^9.29.0",
|
||||
"eslint-plugin-react-hooks": "^5.2.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.20",
|
||||
"globals": "^16.2.0"
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 4.2 KiB |
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "Ved at klikke på <0>Jeg accepterer</0> bekræfter du, at du har gennemgået <1>Elektronisk registrering og signaturdisclosure</1>, og giver samtykke til brugen af elektroniske registreringer og signaturer ved gennemgang og underskrivelse af dette dokument.",
|
||||
"note": "Bemærk:",
|
||||
"noteText": "At acceptere dette betyder ikke, at du underskriver dokumentet med det samme. Det giver dig kun mulighed for at gennemgå det elektronisk. Du får mulighed for at gennemgå dokumentet fuldt ud, før du underskriver."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "Jeg accepterer",
|
||||
"processing": "Behandler...",
|
||||
"close": "Luk",
|
||||
"downloadPdf": "Download PDF",
|
||||
"downloading": "Downloader..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "AI-resumé",
|
||||
"completeSign": "Fuldfør underskrift",
|
||||
"sign": "Underskriv",
|
||||
"processing": "Behandler...",
|
||||
"options": "Download"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "Download PDF",
|
||||
"auditTrail": "Revisionsspor",
|
||||
"reassignSigner": "Omfordel underskriver",
|
||||
"cancelTransaction": "Annuller transaktion",
|
||||
"viewTerms": "Se vilkår og betingelser",
|
||||
"helpSupport": "Hjælp og support",
|
||||
"about": "Om SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Dokumenter",
|
||||
"pages": "Sider: {{count}}",
|
||||
"noDocuments": "Ingen dokumenter tilgængelige."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "Klar til at afslutte?",
|
||||
"readyDesc": "Du har udfyldt de påkrævede felter. Gennemgå dit arbejde, og vælg derefter Fuldfør.",
|
||||
"finish": "Fuldfør",
|
||||
"submitting": "Sender...",
|
||||
"start": "Start",
|
||||
"next": "Næste",
|
||||
"agreementText": "Ved at underskrive accepterer jeg Sign Made Easy's <0>vilkår og betingelser.</0>"
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "Helt færdig!",
|
||||
"title": "Tak for din underskrift",
|
||||
"message": "Dit dokument er nu fuldført og sikkert opbevaret. Vi har sendt dig en kopi på e-mail."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "Handling annulleret!",
|
||||
"title": "Måske næste gang!",
|
||||
"message": "Din anmodning er blevet afvist."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "Handling annulleret!",
|
||||
"title": "Måske næste gang!",
|
||||
"message": "Din anmodning er blevet annulleret."
|
||||
},
|
||||
"download": "Download",
|
||||
"downloading": "Downloader...",
|
||||
"downloadSuccess": "Filen blev downloadet.",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDF-dokument",
|
||||
"audit": "Revisionsspor",
|
||||
"selectFormat": "Vælg format"
|
||||
},
|
||||
"downloadError": "Download mislykkedes. Prøv igen.",
|
||||
"appsTitle": "Øg effektiviteten med vores apps",
|
||||
"formsTitle": "Generer formularer nemt",
|
||||
"docsTitle": "Generer dokumenter (fakturaer, rapporter, tilbud)",
|
||||
"tryNow": "Prøv nu",
|
||||
"footerText": "Ophavsret 2026 Sign Made Easy. Alle rettigheder forbeholdes.<0>Privatlivspolitik</0> | <1>Politik for rimelig brug</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Omfordel underskriver",
|
||||
"successSubtitle": "Dokumentet er blevet omfordelt",
|
||||
"successTitle": "Tak!",
|
||||
"successMessage": "Dokumentet er blevet omfordelt til den nye underskriver.",
|
||||
"fields": {
|
||||
"firstName": "Fornavn",
|
||||
"lastName": "Efternavn",
|
||||
"email": "E-mail",
|
||||
"language": "Sprog",
|
||||
"message": "Valgfri besked"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Indtast dit fornavn",
|
||||
"lastName": "Indtast dit efternavn",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Skriv din besked her..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Indsend",
|
||||
"submitting": "Indsender...",
|
||||
"cancel": "Annuller"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "Fornavn er påkrævet",
|
||||
"firstNameMin": "Fornavn skal være mindst 2 tegn",
|
||||
"lastNameRequired": "Efternavn er påkrævet",
|
||||
"lastNameMin": "Efternavn skal være mindst 2 tegn",
|
||||
"emailRequired": "E-mail er påkrævet",
|
||||
"emailInvalid": "Ugyldig e-mailadresse"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Annuller transaktion",
|
||||
"description": "Er du sikker på, at du vil annullere denne transaktion? Angiv din grund til annullering nedenfor.",
|
||||
"placeholder": "Angiv venligst din grund til annullering...",
|
||||
"buttons": {
|
||||
"no": "Nej, annuller ikke",
|
||||
"yes": "Ja, annuller den"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "Annulleringsgrund er påkrævet"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Annuller transaktion",
|
||||
"message": "Transaktionen blev annulleret. Bekræftelsesemails blev sendt.",
|
||||
"passBackDevice": "Du kan nu give enheden tilbage til {{senderName}}.",
|
||||
"continueButton": "Fortsæt"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Transaktionsrevision",
|
||||
"meta.transaction_id": "Transaktions-id",
|
||||
"meta.transaction_status": "Transaktionsstatus",
|
||||
"meta.files": "Filer",
|
||||
"audit.title": "Fuldt revisionsspor",
|
||||
"audit.description": "Opdater venligst emne og besked nedenfor for en tilpasset besked.",
|
||||
"table.header.actions": "Handlinger",
|
||||
"table.header.language": "Sprog",
|
||||
"table.header.ip_address": "IP-adresse",
|
||||
"table.header.date": "Dato",
|
||||
"status.completed": "Fuldført",
|
||||
"status.pending": "Afventer",
|
||||
"status.failed": "Mislykkedes",
|
||||
"action.created": "Oprettet",
|
||||
"action.updated": "Opdateret",
|
||||
"action.deleted": "Slettet",
|
||||
"action.viewed": "Vist",
|
||||
"action.signed": "Underskrevet",
|
||||
"action.uploaded": "Uploadet",
|
||||
"action.downloaded": "Downloadet",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Transaktionsrevision",
|
||||
"meta": {
|
||||
"transactionId": "Transaktions-id",
|
||||
"transactionStatus": "Transaktionsstatus",
|
||||
"files": "Filer"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Fuldt revisionsspor",
|
||||
"description": "Opdater venligst emne og besked nedenfor for en tilpasset besked."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Handlinger",
|
||||
"language": "Sprog",
|
||||
"ipAddress": "IP-adresse",
|
||||
"date": "Dato"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Fuldført",
|
||||
"pending": "Afventer",
|
||||
"failed": "Mislykkedes"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Transaktion blev oprettet af {{userName}} <{{userEmail}}>",
|
||||
"sent": "Transaktion blev sendt af {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Transaktion blev annulleret af {{userName}} <{{userEmail}}>",
|
||||
"edited": "Transaktion blev redigeret af {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Transaktion blev set af {{userName}} <{{userEmail}}>",
|
||||
"signed": "Transaktion blev underskrevet af {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Transaktionssignatur blev afvist af {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Elektronisk registrering og signaturerklæring blev accepteret af {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> opdaterede deres sprog til {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "Invitationsmail sendt til {{userName}} <{{userEmail}}>",
|
||||
"view": "Invitation til at se dokumentet er sendt til {{userName}} <{{userEmail}}>",
|
||||
"resent": "Invitationsmail genSendt til {{recipientName}} <{{recipientEmail}}> af {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Underskriver blev omfordelt af {{fromName}} <{{fromEmail}}> til {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> blev omfordelt af {{fromName}} <{{fromEmail}}> til {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "Personlig transaktion blev startet af {{userName}} <{{userEmail}}>",
|
||||
"verification": "Personlig signaturverifikation blev accepteret af {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Facilitatorproces blev accepteret af {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Underskrift",
|
||||
"initial": "Initialer",
|
||||
"edit": "Rediger",
|
||||
"styleSelection": "Stilvalg"
|
||||
},
|
||||
"subtitle": "Opret dine digitale underskrifter",
|
||||
"tabs": {
|
||||
"select": "Vælg",
|
||||
"draw": "Tegn",
|
||||
"upload": "Upload"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Bekræft dit navn og vælg en underskriftsstil.",
|
||||
"requiredFields": "Påkrævede felter.",
|
||||
"fullName": {
|
||||
"label": "Fulde navn",
|
||||
"required": "*",
|
||||
"placeholder": "Indtast fulde navn"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Initialer",
|
||||
"required": "*",
|
||||
"placeholder": "Indtast initialer"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Tegn din underskrift.",
|
||||
"required": "*",
|
||||
"requiredFields": "Er påkrævede felter.",
|
||||
"signature": "Underskrift",
|
||||
"initials": "Initialer",
|
||||
"clearSignature": "Ryd underskrift",
|
||||
"fullNameBox": {
|
||||
"label": "Fuld underskrift",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Initialer",
|
||||
"required": "*",
|
||||
"placeholder": "Indtast initialer"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Både underskrift og initialer er påkrævet.",
|
||||
"requirements": "Brug billeder på 300×100px til underskrifter og 100×100px til initialer. Max 300KB. Understøttet: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Upload underskrift",
|
||||
"uploadHint": "JPG, PNG (300×100px, max 300KB)",
|
||||
"browseButton": "Gennemse",
|
||||
"uploadedLabel": "Underskrift ✓",
|
||||
"changeButton": "Skift underskrift",
|
||||
"altText": "Uploadet underskriftbillede"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Upload initialer",
|
||||
"uploadHint": "JPG, PNG (100×100px, max 300KB)",
|
||||
"browseButton": "Gennemse",
|
||||
"uploadedLabel": "Initialer ✓",
|
||||
"changeButton": "Skift initialer",
|
||||
"altText": "Uploadet initialbillede"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Jeg forstår, at jeg underskriver dette dokument.",
|
||||
"cancelButton": "Annuller",
|
||||
"adoptButton": "Adopter underskrift og underskriv"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Dette felt er påkrævet",
|
||||
"fileTooLarge": "Filstørrelsen skal være under 300KB",
|
||||
"invalidFileType": "Kun .png, .jpg og .jpeg filer understøttes",
|
||||
"signatureRequired": "Tilføj venligst en underskrift",
|
||||
"initialsRequired": "Tilføj venligst initialer"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Tilføj stempel",
|
||||
"edit": "Rediger stempel"
|
||||
},
|
||||
"closeButton": "Luk modal",
|
||||
"fileRequirements": "Maksimal størrelse = 400Kb | Understøttede filtyper = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Træk og slip et billede, eller klik for at uploade",
|
||||
"previewAltText": "Stempel forhåndsvisning",
|
||||
"changeImageButton": "Skift billede",
|
||||
"clearButton": "Luk",
|
||||
"saveButton": "Gem",
|
||||
"updateButton": "Opdater",
|
||||
"errors": {
|
||||
"fileTooLarge": "Filstørrelsen overstiger grænsen på 400KB",
|
||||
"invalidFileType": "Kun .png, .jpg og .jpeg filer understøttes",
|
||||
"uploadFailed": "Kunne ikke uploade billedet. Prøv igen."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Vedhæftning",
|
||||
"subtitle": {
|
||||
"hasFile": "Administrer din vedhæftning",
|
||||
"noFile": "Upload vedhæftning"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Uploader fil...",
|
||||
"shimmerText": "Uploader fil..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Slip din fil her",
|
||||
"default": "Upload eller træk og slip fil",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (max 10MB)",
|
||||
"browseButton": "Gennemse filer"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Uploadet succesfuldt",
|
||||
"deleteButton": "Slet fil"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Luk",
|
||||
"uploading": "Uploader...",
|
||||
"deleting": "Sletter...",
|
||||
"saved": "Fil gemt!",
|
||||
"done": "Udført",
|
||||
"uploadFile": "Upload fil"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "Filstørrelsen overstiger grænsen på 10MB",
|
||||
"invalidFileType": "Kun PDF, DOCX, JPG, PNG og TXT filer understøttes",
|
||||
"uploadFailed": "Kunne ikke uploade filen. Prøv igen.",
|
||||
"deleteFailed": "Kunne ikke slette filen. Prøv igen.",
|
||||
"noFileSelected": "Vælg venligst en fil før du fortsætter"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Filupload",
|
||||
"deleteFile": "Slet fil"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Kinesisk (Simplificeret)",
|
||||
"zh_TW": "Kinesisk (Traditionel)",
|
||||
"da": "Dansk",
|
||||
"nl_NL": "Hollandsk",
|
||||
"en": "Engelsk",
|
||||
"fi": "Finsk",
|
||||
"fr": "Fransk",
|
||||
"de": "Tysk",
|
||||
"it": "Italiensk",
|
||||
"ja": "Japansk",
|
||||
"ko": "Koreansk",
|
||||
"no": "Norsk",
|
||||
"pt_BR": "Portugisisk (Brasilien)",
|
||||
"ru": "Russisk",
|
||||
"es": "Spansk",
|
||||
"es_MX": "Spansk (Mexico)",
|
||||
"sv": "Svensk",
|
||||
"th": "Thai",
|
||||
"he": "Hebraisk"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Session udløbet",
|
||||
"description": "Dette dokumentunderskriftslink er udløbet på grund af inaktivitet eller sessionstimeout. Vend tilbage til din e-mail og klik på linket igen for at fortsætte med at underskrive."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 Underskrivning fuldført!",
|
||||
"subtitle": "Dokumentet er blevet underskrevet",
|
||||
"thankYou": "Tak for din underskrift!",
|
||||
"message": "Du vil modtage en bekræftelsesmail, når dokumentet er underskrevet af alle parter.",
|
||||
"passDevice": "Du kan nu give enheden tilbage til <strong>{{senderName}}</strong>",
|
||||
"continueButton": "Fortsæt"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "Mit Klick auf <0>Ich stimme zu</0> bestätigen Sie, dass Sie die <1>Offenlegung von elektronischen Aufzeichnungen und Signaturen</1> gelesen haben und der Verwendung von elektronischen Aufzeichnungen und Signaturen bei der Prüfung und Ausführung dieses Dokuments zustimmen.",
|
||||
"note": "Hinweis:",
|
||||
"noteText": "Die Zustimmung hierzu bedeutet nicht, dass Sie das Dokument sofort unterzeichnen. Es erlaubt Ihnen lediglich, es elektronisch zu prüfen. Sie haben die Möglichkeit, das Dokument vollständig zu prüfen, bevor Sie es unterzeichnen."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "Ich stimme zu",
|
||||
"processing": "Wird verarbeitet...",
|
||||
"close": "Schließen",
|
||||
"downloadPdf": "PDF herunterladen",
|
||||
"downloading": "Wird heruntergeladen..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "KI-Zusammenfassung",
|
||||
"completeSign": "Signatur abschließen",
|
||||
"sign": "Unterschreiben",
|
||||
"processing": "Wird verarbeitet...",
|
||||
"options": "Herunterladen"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "PDF herunterladen",
|
||||
"auditTrail": "Prüfpfad",
|
||||
"reassignSigner": "Unterzeichner neu zuweisen",
|
||||
"cancelTransaction": "Transaktion abbrechen",
|
||||
"viewTerms": "Allgemeine Geschäftsbedingungen anzeigen",
|
||||
"helpSupport": "Hilfe & Support",
|
||||
"about": "Über SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Dokumente",
|
||||
"pages": "Seiten: {{count}}",
|
||||
"noDocuments": "Keine Dokumente verfügbar."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "Bereit zum Abschluss?",
|
||||
"readyDesc": "Sie haben die erforderlichen Felder ausgefüllt. Überprüfen Sie Ihre Arbeit und wählen Sie dann Abschließen.",
|
||||
"finish": "Abschließen",
|
||||
"submitting": "Wird gesendet...",
|
||||
"start": "Start",
|
||||
"next": "Weiter",
|
||||
"agreementText": "Mit meiner Unterschrift stimme ich den <0>Allgemeinen Geschäftsbedingungen</0> von Sign Made Easy zu."
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "Alles erledigt!",
|
||||
"title": "Danke für Ihre Unterschrift",
|
||||
"message": "Ihr Dokument ist nun abgeschlossen und sicher gespeichert. Wir haben Ihnen eine Kopie per E-Mail gesendet."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "Aktion abgebrochen!",
|
||||
"title": "Vielleicht nächstes Mal!",
|
||||
"message": "Ihre Anfrage wurde abgelehnt."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "Aktion abgebrochen!",
|
||||
"title": "Vielleicht nächstes Mal!",
|
||||
"message": "Ihre Anfrage wurde abgebrochen."
|
||||
},
|
||||
"download": "Herunterladen",
|
||||
"downloading": "Wird heruntergeladen...",
|
||||
"downloadSuccess": "Datei erfolgreich heruntergeladen.",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDF-Dokument",
|
||||
"audit": "Prüfpfad",
|
||||
"selectFormat": "Format auswählen"
|
||||
},
|
||||
"downloadError": "Fehler beim Herunterladen der Datei. Bitte versuchen Sie es erneut.",
|
||||
"appsTitle": "Steigern Sie die Effizienz mit unseren Apps",
|
||||
"formsTitle": "Erstellen Sie mühelos Formulare",
|
||||
"docsTitle": "Erstellen Sie Dokumente (Rechnungen, Berichte, Angebote)",
|
||||
"tryNow": "Jetzt ausprobieren",
|
||||
"footerText": "Urheberrecht 2026 Sign Made Easy. Alle Rechte vorbehalten.<0>Datenschutzbestimmungen</0> | <1>Richtlinie für angemessene Nutzung</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Unterzeichner neu zuweisen",
|
||||
"successSubtitle": "Dokument wurde erfolgreich neu zugewiesen",
|
||||
"successTitle": "Danke!",
|
||||
"successMessage": "Das Dokument wurde erfolgreich dem neuen Unterzeichner zugewiesen.",
|
||||
"fields": {
|
||||
"firstName": "Vorname",
|
||||
"lastName": "Nachname",
|
||||
"email": "E-Mail",
|
||||
"language": "Sprache",
|
||||
"message": "Optionale Nachricht"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Geben Sie Ihren Vornamen ein",
|
||||
"lastName": "Geben Sie Ihren Nachnamen ein",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Schreiben Sie Ihre Nachricht hier..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Absenden",
|
||||
"submitting": "Wird gesendet...",
|
||||
"cancel": "Abbrechen"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "Vorname ist erforderlich",
|
||||
"firstNameMin": "Vorname muss mindestens 2 Zeichen lang sein",
|
||||
"lastNameRequired": "Nachname ist erforderlich",
|
||||
"lastNameMin": "Nachname muss mindestens 2 Zeichen lang sein",
|
||||
"emailRequired": "E-Mail ist erforderlich",
|
||||
"emailInvalid": "Ungültige E-Mail-Adresse"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Transaktion abbrechen",
|
||||
"description": "Sind Sie sicher, dass Sie diese Transaktion abbrechen möchten? Geben Sie unten Ihren Grund für den Abbruch an.",
|
||||
"placeholder": "Bitte geben Sie Ihren Grund für den Abbruch an...",
|
||||
"buttons": {
|
||||
"no": "Nein, nicht abbrechen",
|
||||
"yes": "Ja, abbrechen"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "Abbruchgrund ist erforderlich"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Transaktion abbrechen",
|
||||
"message": "Die Transaktion wurde erfolgreich abgebrochen. Bestätigungs-E-Mails wurden gesendet.",
|
||||
"passBackDevice": "Sie können das Gerät jetzt an {{senderName}} zurückgeben.",
|
||||
"continueButton": "Fortfahren"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Transaktionsprüfung",
|
||||
"meta.transaction_id": "Transaktions-ID",
|
||||
"meta.transaction_status": "Transaktionsstatus",
|
||||
"meta.files": "Dateien",
|
||||
"audit.title": "Vollständiger Prüfpfad",
|
||||
"audit.description": "Bitte aktualisieren Sie Betreff und Nachricht unten für eine benutzerdefinierte Nachricht.",
|
||||
"table.header.actions": "Aktionen",
|
||||
"table.header.language": "Sprache",
|
||||
"table.header.ip_address": "IP-Adresse",
|
||||
"table.header.date": "Datum",
|
||||
"status.completed": "Abgeschlossen",
|
||||
"status.pending": "Ausstehend",
|
||||
"status.failed": "Fehlgeschlagen",
|
||||
"action.created": "Erstellt",
|
||||
"action.updated": "Aktualisiert",
|
||||
"action.deleted": "Gelöscht",
|
||||
"action.viewed": "Angesehen",
|
||||
"action.signed": "Unterschrieben",
|
||||
"action.uploaded": "Hochgeladen",
|
||||
"action.downloaded": "Heruntergeladen",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Transaktionsprüfung",
|
||||
"meta": {
|
||||
"transactionId": "Transaktions-ID",
|
||||
"transactionStatus": "Transaktionsstatus",
|
||||
"files": "Dateien"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Vollständiger Prüfpfad",
|
||||
"description": "Bitte aktualisieren Sie Betreff und Nachricht unten für eine benutzerdefinierte Nachricht."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Aktionen",
|
||||
"language": "Sprache",
|
||||
"ipAddress": "IP-Adresse",
|
||||
"date": "Datum"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Abgeschlossen",
|
||||
"pending": "Ausstehend",
|
||||
"failed": "Fehlgeschlagen"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Transaktion wurde erstellt von {{userName}} <{{userEmail}}>",
|
||||
"sent": "Transaktion wurde gesendet von {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Transaktion wurde abgebrochen von {{userName}} <{{userEmail}}>",
|
||||
"edited": "Transaktion wurde bearbeitet von {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Transaktion wurde angesehen von {{userName}} <{{userEmail}}>",
|
||||
"signed": "Transaktion wurde unterschrieben von {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Transaktionssignatur wurde abgelehnt von {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Elektronische Aufzeichnungs- und Signaturoffenlegung wurde akzeptiert von {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> hat ihre Sprache aktualisiert auf {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "Einladungs-E-Mail gesendet an {{userName}} <{{userEmail}}>",
|
||||
"view": "Einladung zum Anzeigen des Dokuments wurde an {{userName}} <{{userEmail}}> gesendet",
|
||||
"resent": "Einladungs-E-Mail erneut gesendet an {{recipientName}} <{{recipientEmail}}> von {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Unterzeichner wurde neu zugewiesen von {{fromName}} <{{fromEmail}}> an {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> wurde neu zugewiesen von {{fromName}} <{{fromEmail}}> an {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "Persönliche Transaktion wurde gestartet von {{userName}} <{{userEmail}}>",
|
||||
"verification": "Persönliche Signaturverifizierung wurde akzeptiert von {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Facilitator-Prozess wurde akzeptiert von {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Unterschrift",
|
||||
"initial": "Initiale",
|
||||
"edit": "Bearbeiten",
|
||||
"styleSelection": "Stilauswahl"
|
||||
},
|
||||
"subtitle": "Erstellen Sie Ihre digitalen Unterschriften",
|
||||
"tabs": {
|
||||
"select": "Auswählen",
|
||||
"draw": "Zeichnen",
|
||||
"upload": "Hochladen"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Bestätigen Sie Ihren Namen und wählen Sie einen Unterschriftsstil.",
|
||||
"requiredFields": "Pflichtfelder.",
|
||||
"fullName": {
|
||||
"label": "Vollständiger Name",
|
||||
"required": "*",
|
||||
"placeholder": "Vollständigen Namen eingeben"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Initialen",
|
||||
"required": "*",
|
||||
"placeholder": "Initialen eingeben"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Zeichnen Sie Ihre Unterschrift.",
|
||||
"required": "*",
|
||||
"requiredFields": "Sind Pflichtfelder.",
|
||||
"signature": "Unterschrift",
|
||||
"initials": "Initialen",
|
||||
"clearSignature": "Unterschrift löschen",
|
||||
"fullNameBox": {
|
||||
"label": "Vollständige Unterschrift",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Initialen",
|
||||
"required": "*",
|
||||
"placeholder": "Initialen eingeben"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Sowohl Unterschrift als auch Initialen sind erforderlich.",
|
||||
"requirements": "Verwenden Sie Bilder von 300×100px für Unterschriften und 100×100px für Initialen. Max. 300KB. Unterstützt: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Unterschrift hochladen",
|
||||
"uploadHint": "JPG, PNG (300×100px, max. 300KB)",
|
||||
"browseButton": "Durchsuchen",
|
||||
"uploadedLabel": "Unterschrift ✓",
|
||||
"changeButton": "Unterschrift ändern",
|
||||
"altText": "Hochgeladenes Unterschriftsbild"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Initialen hochladen",
|
||||
"uploadHint": "JPG, PNG (100×100px, max. 300KB)",
|
||||
"browseButton": "Durchsuchen",
|
||||
"uploadedLabel": "Initialen ✓",
|
||||
"changeButton": "Initialen ändern",
|
||||
"altText": "Hochgeladenes Initialenbild"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Ich verstehe, dass ich dieses Dokument unterschreibe.",
|
||||
"cancelButton": "Abbrechen",
|
||||
"adoptButton": "Unterschrift übernehmen & unterschreiben"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Dieses Feld ist erforderlich",
|
||||
"fileTooLarge": "Die Dateigröße muss unter 300KB liegen",
|
||||
"invalidFileType": "Nur .png, .jpg und .jpeg Dateien werden unterstützt",
|
||||
"signatureRequired": "Bitte fügen Sie eine Unterschrift hinzu",
|
||||
"initialsRequired": "Bitte fügen Sie Initialen hinzu"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Stempel hinzufügen",
|
||||
"edit": "Stempel bearbeiten"
|
||||
},
|
||||
"closeButton": "Modal schließen",
|
||||
"fileRequirements": "Maximale Größe = 400Kb | Unterstützte Dateitypen = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Bild per Drag & Drop ablegen oder zum Hochladen klicken",
|
||||
"previewAltText": "Stempelvorschau",
|
||||
"changeImageButton": "Bild ändern",
|
||||
"clearButton": "Schließen",
|
||||
"saveButton": "Speichern",
|
||||
"updateButton": "Aktualisieren",
|
||||
"errors": {
|
||||
"fileTooLarge": "Die Dateigröße überschreitet das 400KB-Limit",
|
||||
"invalidFileType": "Nur .png, .jpg und .jpeg Dateien werden unterstützt",
|
||||
"uploadFailed": "Bild konnte nicht hochgeladen werden. Bitte versuchen Sie es erneut."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Anhang",
|
||||
"subtitle": {
|
||||
"hasFile": "Ihren Anhang verwalten",
|
||||
"noFile": "Anhang hochladen"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Datei wird hochgeladen...",
|
||||
"shimmerText": "Datei wird hochgeladen..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Datei hier ablegen",
|
||||
"default": "Datei hochladen oder per Drag & Drop ablegen",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (max. 10MB)",
|
||||
"browseButton": "Dateien durchsuchen"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Erfolgreich hochgeladen",
|
||||
"deleteButton": "Datei löschen"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Schließen",
|
||||
"uploading": "Wird hochgeladen...",
|
||||
"deleting": "Wird gelöscht...",
|
||||
"saved": "Datei gespeichert!",
|
||||
"done": "Fertig",
|
||||
"uploadFile": "Datei hochladen"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "Die Dateigröße überschreitet das 10MB-Limit",
|
||||
"invalidFileType": "Nur PDF, DOCX, JPG, PNG und TXT Dateien werden unterstützt",
|
||||
"uploadFailed": "Datei konnte nicht hochgeladen werden. Bitte versuchen Sie es erneut.",
|
||||
"deleteFailed": "Datei konnte nicht gelöscht werden. Bitte versuchen Sie es erneut.",
|
||||
"noFileSelected": "Bitte wählen Sie eine Datei aus, bevor Sie fortfahren"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Datei-Upload",
|
||||
"deleteFile": "Datei löschen"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Chinesisch (Vereinfacht)",
|
||||
"zh_TW": "Chinesisch (Traditionell)",
|
||||
"da": "Dänisch",
|
||||
"nl_NL": "Niederländisch",
|
||||
"en": "Englisch",
|
||||
"fi": "Finnisch",
|
||||
"fr": "Französisch",
|
||||
"de": "Deutsch",
|
||||
"it": "Italienisch",
|
||||
"ja": "Japanisch",
|
||||
"ko": "Koreanisch",
|
||||
"no": "Norwegisch",
|
||||
"pt_BR": "Portugiesisch (Brasilien)",
|
||||
"ru": "Russisch",
|
||||
"es": "Spanisch",
|
||||
"es_MX": "Spanisch (Mexiko)",
|
||||
"sv": "Schwedisch",
|
||||
"th": "Thailändisch",
|
||||
"he": "Hebräisch"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Sitzung abgelaufen",
|
||||
"description": "Dieser Link zum Unterzeichnen des Dokuments ist aufgrund von Inaktivität oder Sitzungszeitüberschreitung abgelaufen. Bitte kehren Sie zu Ihrer E-Mail zurück und klicken Sie erneut auf den Link, um mit der Unterzeichnung fortzufahren."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 Signatur abgeschlossen!",
|
||||
"subtitle": "Dokument wurde erfolgreich unterschrieben",
|
||||
"thankYou": "Vielen Dank für Ihre Unterschrift!",
|
||||
"message": "Sie erhalten eine Bestätigungs-E-Mail, sobald das Dokument von allen Parteien unterschrieben wurde.",
|
||||
"passDevice": "Sie können das Gerät jetzt an <strong>{{senderName}}</strong> zurückgeben",
|
||||
"continueButton": "Weiter"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "By clicking <0>I Agree</0>, you confirm that you have reviewed the <1>Electronic Record and Signature Disclosure</1>, and consent to the use of electronic records and signatures in reviewing and executing this document.",
|
||||
"note": "Note:",
|
||||
"noteText": "Agreeing to this does not mean you are signing the document immediately. It only allows you to review it electronically. You will have a chance to review the document in full before signing."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "I Agree",
|
||||
"processing": "Processing...",
|
||||
"close": "Close",
|
||||
"downloadPdf": "Download PDF",
|
||||
"downloading": "Downloading..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "AI Summary",
|
||||
"completeSign": "Complete Sign",
|
||||
"sign": "Sign",
|
||||
"processing": "Processing...",
|
||||
"options": "Download"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "Download PDF",
|
||||
"auditTrail": "Audit Trail",
|
||||
"reassignSigner": "Reassign Signer",
|
||||
"cancelTransaction": "Cancel Transaction",
|
||||
"viewTerms": "View Terms And Conditions",
|
||||
"helpSupport": "Help & Support",
|
||||
"about": "About SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Documents",
|
||||
"pages": "Pages: {{count}}",
|
||||
"noDocuments": "No documents available."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "All Set to Wrap This Up?",
|
||||
"readyDesc": "You've completed the required fields. Review your work, then select Finish.",
|
||||
"finish": "Finish",
|
||||
"submitting": "Submitting...",
|
||||
"start": "Start",
|
||||
"next": "Next",
|
||||
"agreementText": "By signing, I agree to the Sign Made Easy <0>Terms & Conditions.</0>"
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "All Done!",
|
||||
"title": "Thanks for signing",
|
||||
"message": "Your document is now complete and securely stored. We've emailed you a copy."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "Action Canceled!",
|
||||
"title": "Maybe Next Time!",
|
||||
"message": "Your request has been declined successfully."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "Action Canceled!",
|
||||
"title": "Maybe Next Time!",
|
||||
"message": "Your request has been declined successfully."
|
||||
},
|
||||
"download": "Download",
|
||||
"downloading": "Downloading...",
|
||||
"downloadSuccess": "File downloaded successfully.",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDF Document",
|
||||
"audit": "Audit Trails",
|
||||
"selectFormat": "Select format"
|
||||
},
|
||||
"downloadError": "File download failed. Please try again.",
|
||||
"appsTitle": "Boost Efficiency with Our Apps",
|
||||
"formsTitle": "Generate Forms with Ease",
|
||||
"docsTitle": "Generate Documents (Invoices, Reports, Quotes)",
|
||||
"tryNow": "Try Now",
|
||||
"footerText": "Copyright 2026 Sign Made Easy. All Rights Reserved. <0>Privacy Policy</0> | <1>Reasonable Use Policy</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Reassign Signer",
|
||||
"successSubtitle": "Document has been successfully reassigned",
|
||||
"successTitle": "Thank You!",
|
||||
"successMessage": "The document has been successfully reassigned to the new signer.",
|
||||
"fields": {
|
||||
"firstName": "First Name",
|
||||
"lastName": "Last Name",
|
||||
"email": "Email",
|
||||
"language": "Language",
|
||||
"message": "Optional Message"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Enter your first name",
|
||||
"lastName": "Enter your last name",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Write your message here..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Submit",
|
||||
"submitting": "Submitting...",
|
||||
"cancel": "Cancel"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "First name is required",
|
||||
"firstNameMin": "First name must be at least 2 characters",
|
||||
"lastNameRequired": "Last name is required",
|
||||
"lastNameMin": "Last name must be at least 2 characters",
|
||||
"emailRequired": "Email is required",
|
||||
"emailInvalid": "Invalid email address"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Cancel Transaction",
|
||||
"description": "Are you sure you want to cancel this transaction? Provide your reason for cancelling below.",
|
||||
"placeholder": "Please provide your reason for cancellation...",
|
||||
"buttons": {
|
||||
"no": "No, do not cancel",
|
||||
"yes": "Yes, cancel it"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "Cancellation reason is required"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Cancel Transaction",
|
||||
"message": "The transaction was successfully cancelled. Confirmation emails were sent.",
|
||||
"passBackDevice": "You can now pass the device back to {{senderName}}.",
|
||||
"continueButton": "Continue"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Transaction Audit",
|
||||
"meta.transaction_id": "Transaction ID",
|
||||
"meta.transaction_status": "Transaction Status",
|
||||
"meta.files": "Files",
|
||||
"audit.title": "Full Audit Trail",
|
||||
"audit.description": "Please update the Subject and Message below for a custom message.",
|
||||
"table.header.actions": "Actions",
|
||||
"table.header.language": "Language",
|
||||
"table.header.ip_address": "IP Address",
|
||||
"table.header.date": "Date",
|
||||
"status.completed": "Completed",
|
||||
"status.pending": "Pending",
|
||||
"status.failed": "Failed",
|
||||
"action.created": "Created",
|
||||
"action.updated": "Updated",
|
||||
"action.deleted": "Deleted",
|
||||
"action.viewed": "Viewed",
|
||||
"action.signed": "Signed",
|
||||
"action.uploaded": "Uploaded",
|
||||
"action.downloaded": "Downloaded",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Transaction Audit",
|
||||
"meta": {
|
||||
"transactionId": "Transaction ID",
|
||||
"transactionStatus": "Transaction Status",
|
||||
"files": "Files"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Full Audit Trail",
|
||||
"description": "Please update the Subject and Message below for a custom message."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Actions",
|
||||
"language": "Language",
|
||||
"ipAddress": "IP Address",
|
||||
"date": "Date"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Completed",
|
||||
"pending": "Pending",
|
||||
"failed": "Failed"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Transaction was created by {{userName}} <{{userEmail}}>",
|
||||
"sent": "Transaction was sent by {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Transaction was cancelled by {{userName}} <{{userEmail}}>",
|
||||
"edited": "Transaction was edited by {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Transaction was viewed by {{userName}} <{{userEmail}}>",
|
||||
"signed": "Transaction was Signed by {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Transaction signature was declined by {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Electronic Record and Signature Disclosure was accepted by {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> updated their language to {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "Invitation email sent to {{userName}} <{{userEmail}}>",
|
||||
"view": "Invitation to view document is sent to {{userName}} <{{userEmail}}>",
|
||||
"resent": "Invitation email re-sent to {{recipientName}} <{{recipientEmail}}> by {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Signer was reassigned by {{fromName}} <{{fromEmail}}> to {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> was reassigned by {{fromName}} <{{fromEmail}}> to {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "In Person transaction was started by {{userName}} <{{userEmail}}>",
|
||||
"verification": "In Person Signing Verification was accepted by {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Facilitator Process was accepted by {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Signature",
|
||||
"initial": "Initial",
|
||||
"edit": "Edit",
|
||||
"styleSelection": "Style Selection"
|
||||
},
|
||||
"subtitle": "Create your digital signatures",
|
||||
"tabs": {
|
||||
"select": "Select",
|
||||
"draw": "Draw",
|
||||
"upload": "Upload"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Confirm your name and choose a signature style.",
|
||||
"requiredFields": "Required fields.",
|
||||
"fullName": {
|
||||
"label": "Full Name",
|
||||
"required": "*",
|
||||
"placeholder": "Enter full name"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Initials",
|
||||
"required": "*",
|
||||
"placeholder": "Enter initials"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Draw your signature.",
|
||||
"required": "*",
|
||||
"requiredFields": "Are required fields.",
|
||||
"signature": "Signature",
|
||||
"initials": "Initials",
|
||||
"clearSignature": "Clear Signature",
|
||||
"fullNameBox": {
|
||||
"label": "Full Signature",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Initials",
|
||||
"required": "*",
|
||||
"placeholder": "Enter initials"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Both signature and initials are required.",
|
||||
"requirements": "Use images of 300×100px for signatures and 100×100px for initials. Max 300KB. Supported: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Upload Signature",
|
||||
"uploadHint": "JPG, PNG (300×100px, max 300KB)",
|
||||
"browseButton": "Browse",
|
||||
"uploadedLabel": "Signature ✓",
|
||||
"changeButton": "Change Signature",
|
||||
"altText": "Uploaded signature image"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Upload Initials",
|
||||
"uploadHint": "JPG, PNG (100×100px, max 300KB)",
|
||||
"browseButton": "Browse",
|
||||
"uploadedLabel": "Initials ✓",
|
||||
"changeButton": "Change Initials",
|
||||
"altText": "Uploaded initials image"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "I understand that, I am signing this document.",
|
||||
"cancelButton": "Cancel",
|
||||
"adoptButton": "Adopt Signature & Sign"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "This field is required",
|
||||
"fileTooLarge": "File size must be under 300KB",
|
||||
"invalidFileType": "Only .png, .jpg, and .jpeg files are supported",
|
||||
"signatureRequired": "Please add a signature",
|
||||
"initialsRequired": "Please add initials"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Add Stamp",
|
||||
"edit": "Edit Stamp"
|
||||
},
|
||||
"closeButton": "Close modal",
|
||||
"fileRequirements": "Maximum size = 400Kb | Supported file types = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Drag & drop an image, or click to upload",
|
||||
"previewAltText": "Stamp Preview",
|
||||
"changeImageButton": "Change image",
|
||||
"clearButton": "Close",
|
||||
"saveButton": "Save",
|
||||
"updateButton": "Update",
|
||||
"errors": {
|
||||
"fileTooLarge": "File size exceeds 400KB limit",
|
||||
"invalidFileType": "Only .png, .jpg, and .jpeg files are supported",
|
||||
"uploadFailed": "Failed to upload image. Please try again."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Attachment",
|
||||
"subtitle": {
|
||||
"hasFile": "Manage your attachment",
|
||||
"noFile": "Upload attachment"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Uploading file...",
|
||||
"shimmerText": "Uploading file..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Drop your file here",
|
||||
"default": "Upload or drag & drop file",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (max 10MB)",
|
||||
"browseButton": "Browse Files"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Uploaded successfully",
|
||||
"deleteButton": "Delete file"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Close",
|
||||
"uploading": "Uploading...",
|
||||
"deleting": "Deleting...",
|
||||
"saved": "File Saved!",
|
||||
"done": "Done",
|
||||
"uploadFile": "Upload File"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "File size exceeds 10MB limit",
|
||||
"invalidFileType": "Only PDF, DOCX, JPG, PNG, and TXT files are supported",
|
||||
"uploadFailed": "Failed to upload file. Please try again.",
|
||||
"deleteFailed": "Failed to delete file. Please try again.",
|
||||
"noFileSelected": "Please select a file before proceeding"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "File upload",
|
||||
"deleteFile": "Delete file"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Chinese (Simplified)",
|
||||
"zh_TW": "Chinese (Traditional)",
|
||||
"da": "Danish",
|
||||
"nl_NL": "Dutch",
|
||||
"en": "English",
|
||||
"fi": "Finnish",
|
||||
"fr": "French",
|
||||
"de": "German",
|
||||
"it": "Italian",
|
||||
"ja": "Japanese",
|
||||
"ko": "Korean",
|
||||
"no": "Norwegian",
|
||||
"pt_BR": "Portuguese (Brazil)",
|
||||
"ru": "Russian",
|
||||
"es": "Spanish",
|
||||
"es_MX": "Spanish (Mexico)",
|
||||
"sv": "Swedish",
|
||||
"th": "Thai",
|
||||
"he": "Hebrew"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Session Expired",
|
||||
"description": "This document signing link has expired due to inactivity or session timeout. Please return to your email and click the link again to continue signing."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 Signing Complete!",
|
||||
"subtitle": "Document has been successfully signed",
|
||||
"thankYou": "Thank You for Signing!",
|
||||
"message": "You will receive a confirmation email once the document has been signed by all parties.",
|
||||
"passDevice": "You can now pass the device back to <strong>{{senderName}}</strong>",
|
||||
"continueButton": "Continue"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "Al hacer clic en <0>Acepto</0>, confirma que ha revisado la <1>Divulgación de registros electrónicos y firmas</1> y consiente el uso de registros y firmas electrónicas en la revisión y ejecución de este documento.",
|
||||
"note": "Nota:",
|
||||
"noteText": "Aceptar esto no significa que esté firmando el documento inmediatamente. Solo le permite revisarlo electrónicamente. Tendrá la oportunidad de revisar el documento completo antes de firmar."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "Acepto",
|
||||
"processing": "Procesando...",
|
||||
"close": "Cerrar",
|
||||
"downloadPdf": "Descargar PDF",
|
||||
"downloading": "Descargando..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "Resumen de IA",
|
||||
"completeSign": "Completar firma",
|
||||
"sign": "Firmar",
|
||||
"processing": "Procesando...",
|
||||
"options": "Descargar"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "Descargar PDF",
|
||||
"auditTrail": "Pista de auditoría",
|
||||
"reassignSigner": "Reasignar firmante",
|
||||
"cancelTransaction": "Cancelar transacción",
|
||||
"viewTerms": "Ver términos y condiciones",
|
||||
"helpSupport": "Ayuda y soporte",
|
||||
"about": "Acerca de SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Documentos",
|
||||
"pages": "Páginas: {{count}}",
|
||||
"noDocuments": "No hay documentos disponibles."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "¿Listo para finalizar?",
|
||||
"readyDesc": "Ha completado los campos obligatorios. Revise su trabajo y luego seleccione Finalizar.",
|
||||
"finish": "Finalizar",
|
||||
"submitting": "Enviando...",
|
||||
"start": "Comenzar",
|
||||
"next": "Siguiente",
|
||||
"agreementText": "Al firmar, acepto los <0>Términos y condiciones</0> de Sign Made Easy."
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "¡Todo listo!",
|
||||
"title": "Gracias por firmar",
|
||||
"message": "Su documento ahora está completo y almacenado de forma segura. Le hemos enviado una copia por correo electrónico."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "¡Acción cancelada!",
|
||||
"title": "¡Tal vez la próxima vez!",
|
||||
"message": "Su solicitud ha sido rechazada."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "¡Acción cancelada!",
|
||||
"title": "¡Tal vez la próxima vez!",
|
||||
"message": "Su solicitud ha sido cancelada."
|
||||
},
|
||||
"download": "Descargar",
|
||||
"downloading": "Descargando...",
|
||||
"downloadSuccess": "Archivo descargado correctamente.",
|
||||
"downloadOptions": {
|
||||
"pdf": "Documento PDF",
|
||||
"audit": "Pistas de auditoría",
|
||||
"selectFormat": "Seleccionar formato"
|
||||
},
|
||||
"downloadError": "Error al descargar el archivo. Por favor, inténtelo de nuevo.",
|
||||
"appsTitle": "Aumente la eficiencia con nuestras aplicaciones",
|
||||
"formsTitle": "Genere formularios con facilidad",
|
||||
"docsTitle": "Genere documentos (facturas, informes, cotizaciones)",
|
||||
"tryNow": "Pruebe ahora",
|
||||
"footerText": "Derechos de autor 2026 Sign Made Easy. Todos los derechos reservados.<0>Política de privacidad</0> | <1>Política de uso razonable</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Reasignar firmante",
|
||||
"successSubtitle": "El documento ha sido reasignado correctamente",
|
||||
"successTitle": "¡Gracias!",
|
||||
"successMessage": "El documento ha sido reasignado correctamente al nuevo firmante.",
|
||||
"fields": {
|
||||
"firstName": "Nombre",
|
||||
"lastName": "Apellido",
|
||||
"email": "Correo electrónico",
|
||||
"language": "Idioma",
|
||||
"message": "Mensaje opcional"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Ingrese su nombre",
|
||||
"lastName": "Ingrese su apellido",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Escriba su mensaje aquí..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Enviar",
|
||||
"submitting": "Enviando...",
|
||||
"cancel": "Cancelar"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "El nombre es obligatorio",
|
||||
"firstNameMin": "El nombre debe tener al menos 2 caracteres",
|
||||
"lastNameRequired": "El apellido es obligatorio",
|
||||
"lastNameMin": "El apellido debe tener al menos 2 caracteres",
|
||||
"emailRequired": "El correo electrónico es obligatorio",
|
||||
"emailInvalid": "Dirección de correo electrónico inválida"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Cancelar transacción",
|
||||
"description": "¿Está seguro de que desea cancelar esta transacción? Proporcione el motivo de la cancelación a continuación.",
|
||||
"placeholder": "Por favor, proporcione el motivo de la cancelación...",
|
||||
"buttons": {
|
||||
"no": "No, no cancelar",
|
||||
"yes": "Sí, cancelarla"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "El motivo de cancelación es obligatorio"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Cancelar Transacción",
|
||||
"message": "La transacción se canceló correctamente. Se enviaron correos de confirmación.",
|
||||
"passBackDevice": "Ahora puede devolver el dispositivo a {{senderName}}.",
|
||||
"continueButton": "Continuar"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Auditoría de transacciones",
|
||||
"meta.transaction_id": "ID de transacción",
|
||||
"meta.transaction_status": "Estado de la transacción",
|
||||
"meta.files": "Archivos",
|
||||
"audit.title": "Pista de auditoría completa",
|
||||
"audit.description": "Actualice el Asunto y el Mensaje a continuación para un mensaje personalizado.",
|
||||
"table.header.actions": "Acciones",
|
||||
"table.header.language": "Idioma",
|
||||
"table.header.ip_address": "Dirección IP",
|
||||
"table.header.date": "Fecha",
|
||||
"status.completed": "Completado",
|
||||
"status.pending": "Pendiente",
|
||||
"status.failed": "Fallido",
|
||||
"action.created": "Creado",
|
||||
"action.updated": "Actualizado",
|
||||
"action.deleted": "Eliminado",
|
||||
"action.viewed": "Visto",
|
||||
"action.signed": "Firmado",
|
||||
"action.uploaded": "Cargado",
|
||||
"action.downloaded": "Descargado",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Auditoría de transacciones",
|
||||
"meta": {
|
||||
"transactionId": "ID de transacción",
|
||||
"transactionStatus": "Estado de la transacción",
|
||||
"files": "Archivos"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Pista de auditoría completa",
|
||||
"description": "Actualice el Asunto y el Mensaje a continuación para un mensaje personalizado."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Acciones",
|
||||
"language": "Idioma",
|
||||
"ipAddress": "Dirección IP",
|
||||
"date": "Fecha"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Completado",
|
||||
"pending": "Pendiente",
|
||||
"failed": "Fallido"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Transacción creada por {{userName}} <{{userEmail}}>",
|
||||
"sent": "Transacción enviada por {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Transacción cancelada por {{userName}} <{{userEmail}}>",
|
||||
"edited": "Transacción editada por {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Transacción vista por {{userName}} <{{userEmail}}>",
|
||||
"signed": "Transacción firmada por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Firma de transacción rechazada por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Divulgación de Registro Electrónico y Firma aceptada por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> actualizó su idioma a {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "Invitación por correo enviada a {{userName}} <{{userEmail}}>",
|
||||
"view": "La invitación para ver el documento se envió a {{userName}} <{{userEmail}}>",
|
||||
"resent": "Invitación reenviada a {{recipientName}} <{{recipientEmail}}> por {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Firmante reasignado por {{fromName}} <{{fromEmail}}> a {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> fue reasignado por {{fromName}} <{{fromEmail}}> a {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "Transacción en persona iniciada por {{userName}} <{{userEmail}}>",
|
||||
"verification": "Verificación de firma en persona aceptada por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Proceso de Facilitador aceptado por {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Firma",
|
||||
"initial": "Inicial",
|
||||
"edit": "Editar",
|
||||
"styleSelection": "Selección de Estilo"
|
||||
},
|
||||
"subtitle": "Crea tus firmas digitales",
|
||||
"tabs": {
|
||||
"select": "Seleccionar",
|
||||
"draw": "Dibujar",
|
||||
"upload": "Subir"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Confirma tu nombre y elige un estilo de firma.",
|
||||
"requiredFields": "Campos requeridos.",
|
||||
"fullName": {
|
||||
"label": "Nombre Completo",
|
||||
"required": "*",
|
||||
"placeholder": "Ingresa el nombre completo"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Iniciales",
|
||||
"required": "*",
|
||||
"placeholder": "Ingresa las iniciales"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Dibuje su firma.",
|
||||
"required": "*",
|
||||
"requiredFields": "Son campos obligatorios.",
|
||||
"signature": "Firma",
|
||||
"initials": "Iniciales",
|
||||
"clearSignature": "Borrar firma",
|
||||
"fullNameBox": {
|
||||
"label": "Firma completa",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Iniciales",
|
||||
"required": "*",
|
||||
"placeholder": "Ingrese las iniciales"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Tanto la firma como las iniciales son requeridas.",
|
||||
"requirements": "Usa imágenes de 300×100px para firmas y 100×100px para iniciales. Máx. 300KB. Compatible: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Subir Firma",
|
||||
"uploadHint": "JPG, PNG (300×100px, máx. 300KB)",
|
||||
"browseButton": "Examinar",
|
||||
"uploadedLabel": "Firma ✓",
|
||||
"changeButton": "Cambiar Firma",
|
||||
"altText": "Imagen de firma subida"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Subir Iniciales",
|
||||
"uploadHint": "JPG, PNG (100×100px, máx. 300KB)",
|
||||
"browseButton": "Examinar",
|
||||
"uploadedLabel": "Iniciales ✓",
|
||||
"changeButton": "Cambiar Iniciales",
|
||||
"altText": "Imagen de iniciales subida"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Entiendo que estoy firmando este documento.",
|
||||
"cancelButton": "Cancelar",
|
||||
"adoptButton": "Adoptar Firma y Firmar"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Este campo es requerido",
|
||||
"fileTooLarge": "El tamaño del archivo debe ser menor a 300KB",
|
||||
"invalidFileType": "Solo se admiten archivos .png, .jpg y .jpeg",
|
||||
"signatureRequired": "Por favor agrega una firma",
|
||||
"initialsRequired": "Por favor agrega iniciales"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Agregar Sello",
|
||||
"edit": "Editar Sello"
|
||||
},
|
||||
"closeButton": "Cerrar modal",
|
||||
"fileRequirements": "Tamaño máximo = 400Kb | Tipos de archivo admitidos = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Arrastra y suelta una imagen, o haz clic para subir",
|
||||
"previewAltText": "Vista Previa del Sello",
|
||||
"changeImageButton": "Cambiar imagen",
|
||||
"clearButton": "Cerrar",
|
||||
"saveButton": "Guardar",
|
||||
"updateButton": "Actualizar",
|
||||
"errors": {
|
||||
"fileTooLarge": "El tamaño del archivo excede el límite de 400KB",
|
||||
"invalidFileType": "Solo se admiten archivos .png, .jpg y .jpeg",
|
||||
"uploadFailed": "Error al subir la imagen. Por favor, inténtalo de nuevo."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Adjunto",
|
||||
"subtitle": {
|
||||
"hasFile": "Gestionar tu adjunto",
|
||||
"noFile": "Subir adjunto"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Subiendo archivo...",
|
||||
"shimmerText": "Subiendo archivo..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Suelta tu archivo aquí",
|
||||
"default": "Subir o arrastrar y soltar archivo",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (máx. 10MB)",
|
||||
"browseButton": "Examinar Archivos"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Subido exitosamente",
|
||||
"deleteButton": "Eliminar archivo"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Cerrar",
|
||||
"uploading": "Subiendo...",
|
||||
"deleting": "Eliminando...",
|
||||
"saved": "¡Archivo Guardado!",
|
||||
"done": "Hecho",
|
||||
"uploadFile": "Subir Archivo"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "El tamaño del archivo excede el límite de 10MB",
|
||||
"invalidFileType": "Solo se admiten archivos PDF, DOCX, JPG, PNG y TXT",
|
||||
"uploadFailed": "Error al subir el archivo. Por favor, inténtalo de nuevo.",
|
||||
"deleteFailed": "Error al eliminar el archivo. Por favor, inténtalo de nuevo.",
|
||||
"noFileSelected": "Por favor selecciona un archivo antes de continuar"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Subida de archivo",
|
||||
"deleteFile": "Eliminar archivo"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Chino (Simplificado)",
|
||||
"zh_TW": "Chino (Tradicional)",
|
||||
"da": "Danés",
|
||||
"nl_NL": "Neerlandés",
|
||||
"en": "Inglés",
|
||||
"fi": "Finlandés",
|
||||
"fr": "Francés",
|
||||
"de": "Alemán",
|
||||
"it": "Italiano",
|
||||
"ja": "Japonés",
|
||||
"ko": "Coreano",
|
||||
"no": "Noruego",
|
||||
"pt_BR": "Portugués (Brasil)",
|
||||
"ru": "Ruso",
|
||||
"es": "Español",
|
||||
"es_MX": "Español (México)",
|
||||
"sv": "Sueco",
|
||||
"th": "Tailandés",
|
||||
"he": "Hebreo"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Sesión expirada",
|
||||
"description": "Este enlace de firma de documento ha expirado debido a inactividad o tiempo de espera de la sesión. Vuelva a su correo electrónico y haga clic en el enlace nuevamente para continuar firmando."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 ¡Firma completada!",
|
||||
"subtitle": "El documento ha sido firmado exitosamente",
|
||||
"thankYou": "¡Gracias por firmar!",
|
||||
"message": "Recibirá un correo electrónico de confirmación una vez que el documento haya sido firmado por todas las partes.",
|
||||
"passDevice": "Ahora puede devolver el dispositivo a <strong>{{senderName}}</strong>",
|
||||
"continueButton": "Continuar"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "Al hacer clic en <0>Acepto</0>, confirma que ha revisado la <1>Divulgación de registros electrónicos y firmas</1> y da su consentimiento para el uso de registros y firmas electrónicas en la revisión y ejecución de este documento.",
|
||||
"note": "Nota:",
|
||||
"noteText": "Aceptar esto no significa que esté firmando el documento de inmediato. Solo le permite revisarlo electrónicamente. Tendrá la oportunidad de revisar el documento completo antes de firmar."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "Acepto",
|
||||
"processing": "Procesando...",
|
||||
"close": "Cerrar",
|
||||
"downloadPdf": "Descargar PDF",
|
||||
"downloading": "Descargando..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "Resumen de IA",
|
||||
"completeSign": "Completar firma",
|
||||
"sign": "Firmar",
|
||||
"processing": "Procesando...",
|
||||
"options": "Descargar"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "Descargar PDF",
|
||||
"auditTrail": "Pista de auditoría",
|
||||
"reassignSigner": "Reasignar firmante",
|
||||
"cancelTransaction": "Cancelar transacción",
|
||||
"viewTerms": "Ver términos y condiciones",
|
||||
"helpSupport": "Ayuda y soporte",
|
||||
"about": "Acerca de SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Documentos",
|
||||
"pages": "Páginas: {{count}}",
|
||||
"noDocuments": "No hay documentos disponibles."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "¿Listo para finalizar?",
|
||||
"readyDesc": "Ha completado los campos obligatorios. Revise su trabajo y luego seleccione Finalizar.",
|
||||
"finish": "Finalizar",
|
||||
"submitting": "Enviando...",
|
||||
"start": "Comenzar",
|
||||
"next": "Siguiente",
|
||||
"agreementText": "Al firmar, acepto los <0>Términos y condiciones</0> de Sign Made Easy."
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "¡Todo listo!",
|
||||
"title": "Gracias por firmar",
|
||||
"message": "Su documento ahora está completo y almacenado de forma segura. Le hemos enviado una copia por correo electrónico."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "¡Acción cancelada!",
|
||||
"title": "¡Quizás la próxima vez!",
|
||||
"message": "Su solicitud ha sido rechazada exitosamente."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "¡Acción cancelada!",
|
||||
"title": "¡Quizás la próxima vez!",
|
||||
"message": "Su solicitud ha sido cancelada exitosamente."
|
||||
},
|
||||
"download": "Descargar",
|
||||
"downloading": "Descargando...",
|
||||
"downloadSuccess": "Archivo descargado exitosamente.",
|
||||
"downloadOptions": {
|
||||
"pdf": "Documento PDF",
|
||||
"audit": "Pistas de auditoría",
|
||||
"selectFormat": "Seleccionar formato"
|
||||
},
|
||||
"downloadError": "Error al descargar el archivo. Por favor, inténtelo de nuevo.",
|
||||
"appsTitle": "Aumente la eficiencia con nuestras aplicaciones",
|
||||
"formsTitle": "Genere formularios con facilidad",
|
||||
"docsTitle": "Genere documentos (facturas, informes, cotizaciones)",
|
||||
"tryNow": "Probar ahora",
|
||||
"footerText": "Derechos de autor 2026 Sign Made Easy. Todos los derechos reservados.<0>Política de privacidad</0> | <1>Política de uso razonable</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Reasignar firmante",
|
||||
"successSubtitle": "El documento ha sido reasignado exitosamente",
|
||||
"successTitle": "¡Gracias!",
|
||||
"successMessage": "El documento ha sido reasignado exitosamente al nuevo firmante.",
|
||||
"fields": {
|
||||
"firstName": "Nombre",
|
||||
"lastName": "Apellido",
|
||||
"email": "Correo electrónico",
|
||||
"language": "Idioma",
|
||||
"message": "Mensaje opcional"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Ingrese su nombre",
|
||||
"lastName": "Ingrese su apellido",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Escriba su mensaje aquí..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Enviar",
|
||||
"submitting": "Enviando...",
|
||||
"cancel": "Cancelar"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "El nombre es obligatorio",
|
||||
"firstNameMin": "El nombre debe tener al menos 2 caracteres",
|
||||
"lastNameRequired": "El apellido es obligatorio",
|
||||
"lastNameMin": "El apellido debe tener al menos 2 caracteres",
|
||||
"emailRequired": "El correo electrónico es obligatorio",
|
||||
"emailInvalid": "Dirección de correo electrónico inválida"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Cancelar transacción",
|
||||
"description": "¿Está seguro de que desea cancelar esta transacción? Proporcione el motivo de cancelación a continuación.",
|
||||
"placeholder": "Por favor, proporcione el motivo de cancelación...",
|
||||
"buttons": {
|
||||
"no": "No, no cancelar",
|
||||
"yes": "Sí, cancelarla"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "El motivo de cancelación es obligatorio"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Cancelar Transacción",
|
||||
"message": "La transacción se canceló correctamente. Se enviaron correos de confirmación.",
|
||||
"passBackDevice": "Ahora puede devolver el dispositivo a {{senderName}}.",
|
||||
"continueButton": "Continuar"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Auditoría de transacciones",
|
||||
"meta.transaction_id": "ID de transacción",
|
||||
"meta.transaction_status": "Estado de la transacción",
|
||||
"meta.files": "Archivos",
|
||||
"audit.title": "Pista de auditoría completa",
|
||||
"audit.description": "Actualice el Asunto y el Mensaje a continuación para un mensaje personalizado.",
|
||||
"table.header.actions": "Acciones",
|
||||
"table.header.language": "Idioma",
|
||||
"table.header.ip_address": "Dirección IP",
|
||||
"table.header.date": "Fecha",
|
||||
"status.completed": "Completado",
|
||||
"status.pending": "Pendiente",
|
||||
"status.failed": "Fallido",
|
||||
"action.created": "Creado",
|
||||
"action.updated": "Actualizado",
|
||||
"action.deleted": "Eliminado",
|
||||
"action.viewed": "Visto",
|
||||
"action.signed": "Firmado",
|
||||
"action.uploaded": "Cargado",
|
||||
"action.downloaded": "Descargado",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Auditoría de transacciones",
|
||||
"meta": {
|
||||
"transactionId": "ID de transacción",
|
||||
"transactionStatus": "Estado de la transacción",
|
||||
"files": "Archivos"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Pista de auditoría completa",
|
||||
"description": "Actualice el Asunto y el Mensaje a continuación para un mensaje personalizado."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Acciones",
|
||||
"language": "Idioma",
|
||||
"ipAddress": "Dirección IP",
|
||||
"date": "Fecha"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Completado",
|
||||
"pending": "Pendiente",
|
||||
"failed": "Fallido"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Transacción creada por {{userName}} <{{userEmail}}>",
|
||||
"sent": "Transacción enviada por {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Transacción cancelada por {{userName}} <{{userEmail}}>",
|
||||
"edited": "Transacción editada por {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Transacción vista por {{userName}} <{{userEmail}}>",
|
||||
"signed": "Transacción firmada por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Firma de transacción rechazada por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Divulgación de Registro Electrónico y Firma aceptada por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> actualizó su idioma a {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "Invitación por correo enviada a {{userName}} <{{userEmail}}>",
|
||||
"view": "La invitación para ver el documento se envió a {{userName}} <{{userEmail}}>",
|
||||
"resent": "Invitación reenviada a {{recipientName}} <{{recipientEmail}}> por {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Firmante reasignado por {{fromName}} <{{fromEmail}}> a {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> fue reasignado por {{fromName}} <{{fromEmail}}> a {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "Transacción en persona iniciada por {{userName}} <{{userEmail}}>",
|
||||
"verification": "Verificación de firma en persona aceptada por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Proceso de Facilitador aceptado por {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Firma",
|
||||
"initial": "Inicial",
|
||||
"edit": "Editar",
|
||||
"styleSelection": "Selección de estilo"
|
||||
},
|
||||
"subtitle": "Cree sus firmas digitales",
|
||||
"tabs": {
|
||||
"select": "Seleccionar",
|
||||
"draw": "Dibujar",
|
||||
"upload": "Subir"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Confirme su nombre y elija un estilo de firma.",
|
||||
"requiredFields": "Campos obligatorios.",
|
||||
"fullName": {
|
||||
"label": "Nombre completo",
|
||||
"required": "*",
|
||||
"placeholder": "Ingrese el nombre completo"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Iniciales",
|
||||
"required": "*",
|
||||
"placeholder": "Ingrese las iniciales"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Dibuje su firma.",
|
||||
"required": "*",
|
||||
"requiredFields": "Son campos obligatorios.",
|
||||
"signature": "Firma",
|
||||
"initials": "Iniciales",
|
||||
"clearSignature": "Borrar firma",
|
||||
"fullNameBox": {
|
||||
"label": "Firma completa",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Iniciales",
|
||||
"required": "*",
|
||||
"placeholder": "Ingrese las iniciales"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Tanto la firma como las iniciales son obligatorias.",
|
||||
"requirements": "Use imágenes de 300×100px para firmas y de 100×100px para iniciales. Máx. 300KB. Compatibles: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Subir firma",
|
||||
"uploadHint": "JPG, PNG (300×100px, máx. 300KB)",
|
||||
"browseButton": "Examinar",
|
||||
"uploadedLabel": "Firma ✓",
|
||||
"changeButton": "Cambiar firma",
|
||||
"altText": "Imagen de firma subida"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Subir iniciales",
|
||||
"uploadHint": "JPG, PNG (100×100px, máx. 300KB)",
|
||||
"browseButton": "Examinar",
|
||||
"uploadedLabel": "Iniciales ✓",
|
||||
"changeButton": "Cambiar iniciales",
|
||||
"altText": "Imagen de iniciales subida"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Entiendo que estoy firmando este documento.",
|
||||
"cancelButton": "Cancelar",
|
||||
"adoptButton": "Adoptar firma y firmar"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Este campo es obligatorio",
|
||||
"fileTooLarge": "El tamaño del archivo debe ser menor a 300KB",
|
||||
"invalidFileType": "Solo se admiten archivos .png, .jpg y .jpeg",
|
||||
"signatureRequired": "Por favor agregue una firma",
|
||||
"initialsRequired": "Por favor agregue las iniciales"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Agregar sello",
|
||||
"edit": "Editar sello"
|
||||
},
|
||||
"closeButton": "Cerrar modal",
|
||||
"fileRequirements": "Tamaño máximo = 400KB | Tipos de archivo compatibles = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Arrastre y suelte una imagen, o haga clic para subir",
|
||||
"previewAltText": "Vista previa del sello",
|
||||
"changeImageButton": "Cambiar imagen",
|
||||
"clearButton": "Cerrar",
|
||||
"saveButton": "Guardar",
|
||||
"updateButton": "Actualizar",
|
||||
"errors": {
|
||||
"fileTooLarge": "El tamaño del archivo excede el límite de 400KB",
|
||||
"invalidFileType": "Solo se admiten archivos .png, .jpg y .jpeg",
|
||||
"uploadFailed": "Error al subir la imagen. Intente de nuevo."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Adjunto",
|
||||
"subtitle": {
|
||||
"hasFile": "Administre su adjunto",
|
||||
"noFile": "Subir adjunto"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Subiendo archivo...",
|
||||
"shimmerText": "Subiendo archivo..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Suelte su archivo aquí",
|
||||
"default": "Subir o arrastrar y soltar archivo",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (máx. 10MB)",
|
||||
"browseButton": "Examinar archivos"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Subido exitosamente",
|
||||
"deleteButton": "Eliminar archivo"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Cerrar",
|
||||
"uploading": "Subiendo...",
|
||||
"deleting": "Eliminando...",
|
||||
"saved": "¡Archivo guardado!",
|
||||
"done": "Listo",
|
||||
"uploadFile": "Subir archivo"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "El tamaño del archivo excede el límite de 10MB",
|
||||
"invalidFileType": "Solo se admiten archivos PDF, DOCX, JPG, PNG y TXT",
|
||||
"uploadFailed": "Error al subir el archivo. Intente de nuevo.",
|
||||
"deleteFailed": "Error al eliminar el archivo. Intente de nuevo.",
|
||||
"noFileSelected": "Por favor seleccione un archivo antes de continuar"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Subida de archivo",
|
||||
"deleteFile": "Eliminar archivo"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Chino (Simplificado)",
|
||||
"zh_TW": "Chino (Tradicional)",
|
||||
"da": "Danés",
|
||||
"nl_NL": "Neerlandés",
|
||||
"en": "Inglés",
|
||||
"fi": "Finlandés",
|
||||
"fr": "Francés",
|
||||
"de": "Alemán",
|
||||
"it": "Italiano",
|
||||
"ja": "Japonés",
|
||||
"ko": "Coreano",
|
||||
"no": "Noruego",
|
||||
"pt_BR": "Portugués (Brasil)",
|
||||
"ru": "Ruso",
|
||||
"es": "Español",
|
||||
"es_MX": "Español (México)",
|
||||
"sv": "Sueco",
|
||||
"th": "Tailandés",
|
||||
"he": "Hebreo"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Sesión expirada",
|
||||
"description": "Este enlace de firma de documento ha expirado debido a inactividad o tiempo de espera de la sesión. Regrese a su correo electrónico y haga clic en el enlace nuevamente para continuar firmando."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 ¡Firma completada!",
|
||||
"subtitle": "El documento ha sido firmado exitosamente",
|
||||
"thankYou": "¡Gracias por firmar!",
|
||||
"message": "Recibirá un correo electrónico de confirmación una vez que el documento haya sido firmado por todas las partes.",
|
||||
"passDevice": "Ahora puede devolver el dispositivo a <strong>{{senderName}}</strong>",
|
||||
"continueButton": "Continuar"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "Napsauttamalla <0>Hyväksyn</0> vahvistat, että olet tarkistanut <1>Sähköinen tallennus- ja allekirjoitusilmoitus</1> -asiakirjan ja annat suostumuksesi sähköisten tallenteiden ja allekirjoitusten käyttöön tämän asiakirjan tarkastelussa ja allekirjoittamisessa.",
|
||||
"note": "Huomautus:",
|
||||
"noteText": "Tämän hyväksyminen ei tarkoita, että allekirjoitat asiakirjan välittömästi. Se sallii sinun vain tarkastella sitä sähköisesti. Sinulla on mahdollisuus tarkastella asiakirjaa kokonaisuudessaan ennen allekirjoittamista."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "Hyväksyn",
|
||||
"processing": "Käsitellään...",
|
||||
"close": "Sulje",
|
||||
"downloadPdf": "Lataa PDF",
|
||||
"downloading": "Ladataan..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "AI-yhteenveto",
|
||||
"completeSign": "Suorita allekirjoitus",
|
||||
"sign": "Allekirjoita",
|
||||
"processing": "Käsitellään...",
|
||||
"options": "Lataa"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "Lataa PDF",
|
||||
"auditTrail": "Tarkastusjälki",
|
||||
"reassignSigner": "Määritä allekirjoittaja uudelleen",
|
||||
"cancelTransaction": "Peruuta tapahtuma",
|
||||
"viewTerms": "Näytä ehdot",
|
||||
"helpSupport": "Apua ja tuki",
|
||||
"about": "Tietoja SME:stä"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Asiakirjat",
|
||||
"pages": "Sivut: {{count}}",
|
||||
"noDocuments": "Ei asiakirjoja saatavilla."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "Valmis viimeistelemään?",
|
||||
"readyDesc": "Olet täyttänyt vaaditut kentät. Tarkista työsi ja valitse sitten Viimeistele.",
|
||||
"finish": "Viimeistele",
|
||||
"submitting": "Lähetetään...",
|
||||
"start": "Aloita",
|
||||
"next": "Seuraava",
|
||||
"agreementText": "Allekirjoittamalla hyväksyn Sign Made Easyn <0>käyttöehdot.</0>"
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "Kaikki valmista!",
|
||||
"title": "Kiitos allekirjoituksesta",
|
||||
"message": "Asiakirjasi on nyt valmis ja tallennettu turvallisesti. Olemme lähettäneet sinulle kopion sähköpostitse."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "Toiminto peruttu!",
|
||||
"title": "Ehkä ensi kerralla!",
|
||||
"message": "Pyyntösi on hylätty."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "Toiminto peruttu!",
|
||||
"title": "Ehkä ensi kerralla!",
|
||||
"message": "Pyyntösi on peruttu."
|
||||
},
|
||||
"download": "Lataa",
|
||||
"downloading": "Ladataan...",
|
||||
"downloadSuccess": "Tiedosto ladattu onnistuneesti.",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDF-asiakirja",
|
||||
"audit": "Tarkastusjälki",
|
||||
"selectFormat": "Valitse muoto"
|
||||
},
|
||||
"downloadError": "Tiedoston lataus epäonnistui. Yritä uudelleen.",
|
||||
"appsTitle": "Tehosta toimintaamme sovelluksillamme",
|
||||
"formsTitle": "Luo lomakkeita helposti",
|
||||
"docsTitle": "Luo asiakirjoja (laskut, raportit, tarjoukset)",
|
||||
"tryNow": "Kokeile nyt",
|
||||
"footerText": "Tekijänoikeus 2026 Sign Made Easy. Kaikki oikeudet pidätetään.<0>Tietosuojakäytäntö</0> | <1>Kohtuullisen käytön käytäntö</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Määritä allekirjoittaja uudelleen",
|
||||
"successSubtitle": "Asiakirja on määritetty uudelleen",
|
||||
"successTitle": "Kiitos!",
|
||||
"successMessage": "Asiakirja on määritetty uudelleen uudelle allekirjoittajalle.",
|
||||
"fields": {
|
||||
"firstName": "Etunimi",
|
||||
"lastName": "Sukunimi",
|
||||
"email": "Sähköposti",
|
||||
"language": "Kieli",
|
||||
"message": "Valinnainen viesti"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Syötä etunimesi",
|
||||
"lastName": "Syötä sukunimesi",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Kirjoita viestisi tähän..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Lähetä",
|
||||
"submitting": "Lähetetään...",
|
||||
"cancel": "Peruuta"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "Etunimi vaaditaan",
|
||||
"firstNameMin": "Etunimen on oltava vähintään 2 merkkiä",
|
||||
"lastNameRequired": "Sukunimi vaaditaan",
|
||||
"lastNameMin": "Sukunimen on oltava vähintään 2 merkkiä",
|
||||
"emailRequired": "Sähköposti vaaditaan",
|
||||
"emailInvalid": "Virheellinen sähköpostiosoite"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Peruuta tapahtuma",
|
||||
"description": "Oletko varma, että haluat peruuttaa tämän tapahtuman? Anna peruutuksen syy alla.",
|
||||
"placeholder": "Anna peruutuksen syy...",
|
||||
"buttons": {
|
||||
"no": "Ei, älä peruuta",
|
||||
"yes": "Kyllä, peruuta se"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "Peruutuksen syy vaaditaan"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Peruuta tapahtuma",
|
||||
"message": "Tapahtuma peruutettiin onnistuneesti. Vahvistussähköpostit on lähetetty.",
|
||||
"passBackDevice": "Voit nyt antaa laitteen takaisin {{senderName}}.",
|
||||
"continueButton": "Jatka"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Tapahtuman tarkastus",
|
||||
"meta.transaction_id": "Tapahtumatunnus",
|
||||
"meta.transaction_status": "Tapahtuman tila",
|
||||
"meta.files": "Tiedostot",
|
||||
"audit.title": "Täysi tarkastusjälki",
|
||||
"audit.description": "Päivitä alla oleva aihe ja viesti mukautettua viestiä varten.",
|
||||
"table.header.actions": "Toiminnot",
|
||||
"table.header.language": "Kieli",
|
||||
"table.header.ip_address": "IP-osoite",
|
||||
"table.header.date": "Päivämäärä",
|
||||
"status.completed": "Valmis",
|
||||
"status.pending": "Odottaa",
|
||||
"status.failed": "Epäonnistui",
|
||||
"action.created": "Luotu",
|
||||
"action.updated": "Päivitetty",
|
||||
"action.deleted": "Poistettu",
|
||||
"action.viewed": "Näytetty",
|
||||
"action.signed": "Allekirjoitettu",
|
||||
"action.uploaded": "Ladattu",
|
||||
"action.downloaded": "Ladattu",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Tapahtuman tarkastus",
|
||||
"meta": {
|
||||
"transactionId": "Tapahtumatunnus",
|
||||
"transactionStatus": "Tapahtuman tila",
|
||||
"files": "Tiedostot"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Täysi tarkastusjälki",
|
||||
"description": "Päivitä alla oleva aihe ja viesti mukautettua viestiä varten."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Toiminnot",
|
||||
"language": "Kieli",
|
||||
"ipAddress": "IP-osoite",
|
||||
"date": "Päivämäärä"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Valmis",
|
||||
"pending": "Odottaa",
|
||||
"failed": "Epäonnistui"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Tapahtuman loi {{userName}} <{{userEmail}}>",
|
||||
"sent": "Tapahtuman lähetti {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Tapahtuman peruutti {{userName}} <{{userEmail}}>",
|
||||
"edited": "Tapahtumaa muokkasi {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Tapahtuman katsoi {{userName}} <{{userEmail}}>",
|
||||
"signed": "Tapahtuman allekirjoitti {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Tapahtuman allekirjoitus hylättiin käyttäjällä {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Sähköinen tietue- ja allekirjoitusilmoitus hyväksyttiin käyttäjällä {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> päivitti kielensä muotoon {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "Kutsusähköposti lähetettiin käyttäjälle {{userName}} <{{userEmail}}>",
|
||||
"view": "Kutsu asiakirjan tarkasteluun on lähetetty käyttäjälle {{userName}} <{{userEmail}}>",
|
||||
"resent": "Kutsusähköposti lähetettiin uudelleen käyttäjälle {{recipientName}} <{{recipientEmail}}> käyttäjän {{senderName}} <{{senderEmail}}> toimesta"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Allekirjoittaja siirrettiin käyttäjältä {{fromName}} <{{fromEmail}}> käyttäjälle {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> siirrettiin käyttäjältä {{fromName}} <{{fromEmail}}> käyttäjälle {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "Henkilökohtainen tapahtuma aloitettiin käyttäjällä {{userName}} <{{userEmail}}>",
|
||||
"verification": "Henkilökohtainen allekirjoituksen vahvistus hyväksyttiin käyttäjällä {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Fasilitaattoriprosessi hyväksyttiin käyttäjällä {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Allekirjoitus",
|
||||
"initial": "Alkukirjaimet",
|
||||
"edit": "Muokkaa",
|
||||
"styleSelection": "Tyylin valinta"
|
||||
},
|
||||
"subtitle": "Luo digitaaliset allekirjoituksesi",
|
||||
"tabs": {
|
||||
"select": "Valitse",
|
||||
"draw": "Piirrä",
|
||||
"upload": "Lataa"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Vahvista nimesi ja valitse allekirjoitustyyli.",
|
||||
"requiredFields": "Pakolliset kentät.",
|
||||
"fullName": {
|
||||
"label": "Koko nimi",
|
||||
"required": "*",
|
||||
"placeholder": "Kirjoita koko nimi"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Alkukirjaimet",
|
||||
"required": "*",
|
||||
"placeholder": "Kirjoita alkukirjaimet"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Piirrä allekirjoituksesi.",
|
||||
"required": "*",
|
||||
"requiredFields": "Ovat pakollisia kenttiä.",
|
||||
"signature": "Allekirjoitus",
|
||||
"initials": "Alkukirjaimet",
|
||||
"clearSignature": "Tyhjennä allekirjoitus",
|
||||
"fullNameBox": {
|
||||
"label": "Koko allekirjoitus",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Alkukirjaimet",
|
||||
"required": "*",
|
||||
"placeholder": "Syötä alkukirjaimet"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Sekä allekirjoitus että alkukirjaimet vaaditaan.",
|
||||
"requirements": "Käytä 300×100px kuvia allekirjoituksiin ja 100×100px kuvia alkukirjaimiin. Max 300KB. Tuetut: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Lataa allekirjoitus",
|
||||
"uploadHint": "JPG, PNG (300×100px, max 300KB)",
|
||||
"browseButton": "Selaa",
|
||||
"uploadedLabel": "Allekirjoitus ✓",
|
||||
"changeButton": "Vaihda allekirjoitus",
|
||||
"altText": "Ladattu allekirjoituskuva"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Lataa alkukirjaimet",
|
||||
"uploadHint": "JPG, PNG (100×100px, max 300KB)",
|
||||
"browseButton": "Selaa",
|
||||
"uploadedLabel": "Alkukirjaimet ✓",
|
||||
"changeButton": "Vaihda alkukirjaimet",
|
||||
"altText": "Ladattu alkukirjainkuva"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Ymmärrän, että allekirjoitan tämän asiakirjan.",
|
||||
"cancelButton": "Peruuta",
|
||||
"adoptButton": "Käytä allekirjoitusta ja allekirjoita"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Tämä kenttä on pakollinen",
|
||||
"fileTooLarge": "Tiedostokoon on oltava alle 300KB",
|
||||
"invalidFileType": "Vain .png, .jpg ja .jpeg tiedostot tuetaan",
|
||||
"signatureRequired": "Lisää allekirjoitus",
|
||||
"initialsRequired": "Lisää alkukirjaimet"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Lisää leima",
|
||||
"edit": "Muokkaa leimaa"
|
||||
},
|
||||
"closeButton": "Sulje modaali",
|
||||
"fileRequirements": "Maksimikoko = 400Kb | Tuetut tiedostotyypit = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Vedä ja pudota kuva, tai klikkaa ladataksesi",
|
||||
"previewAltText": "Leiman esikatselu",
|
||||
"changeImageButton": "Vaihda kuva",
|
||||
"clearButton": "Sulje",
|
||||
"saveButton": "Tallenna",
|
||||
"updateButton": "Päivitä",
|
||||
"errors": {
|
||||
"fileTooLarge": "Tiedostokoko ylittää 400KB rajan",
|
||||
"invalidFileType": "Vain .png, .jpg ja .jpeg tiedostot tuetaan",
|
||||
"uploadFailed": "Kuvan lataus epäonnistui. Yritä uudelleen."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Liite",
|
||||
"subtitle": {
|
||||
"hasFile": "Hallitse liitettäsi",
|
||||
"noFile": "Lataa liite"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Ladataan tiedostoa...",
|
||||
"shimmerText": "Ladataan tiedostoa..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Pudota tiedosto tähän",
|
||||
"default": "Lataa tai vedä ja pudota tiedosto",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (max 10MB)",
|
||||
"browseButton": "Selaa tiedostoja"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Ladattu onnistuneesti",
|
||||
"deleteButton": "Poista tiedosto"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Sulje",
|
||||
"uploading": "Ladataan...",
|
||||
"deleting": "Poistetaan...",
|
||||
"saved": "Tiedosto tallennettu!",
|
||||
"done": "Valmis",
|
||||
"uploadFile": "Lataa tiedosto"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "Tiedostokoko ylittää 10MB rajan",
|
||||
"invalidFileType": "Vain PDF, DOCX, JPG, PNG ja TXT tiedostot tuetaan",
|
||||
"uploadFailed": "Tiedoston lataus epäonnistui. Yritä uudelleen.",
|
||||
"deleteFailed": "Tiedoston poisto epäonnistui. Yritä uudelleen.",
|
||||
"noFileSelected": "Valitse tiedosto ennen jatkamista"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Tiedoston lataus",
|
||||
"deleteFile": "Poista tiedosto"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Kiina (yksinkertaistettu)",
|
||||
"zh_TW": "Kiina (perinteinen)",
|
||||
"da": "Tanska",
|
||||
"nl_NL": "Hollanti",
|
||||
"en": "Englanti",
|
||||
"fi": "Suomi",
|
||||
"fr": "Ranska",
|
||||
"de": "Saksa",
|
||||
"it": "Italia",
|
||||
"ja": "Japani",
|
||||
"ko": "Korea",
|
||||
"no": "Norja",
|
||||
"pt_BR": "Portugali (Brasilia)",
|
||||
"ru": "Venäjä",
|
||||
"es": "Espanja",
|
||||
"es_MX": "Espanja (Meksiko)",
|
||||
"sv": "Ruotsi",
|
||||
"th": "Thai",
|
||||
"he": "Heprea"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Istunto vanhentunut",
|
||||
"description": "Tämä asiakirjan allekirjoituslinkki on vanhentunut käyttämättömyyden tai istunnon aikakatkaisun vuoksi. Palaa sähköpostiisi ja napsauta linkkiä uudelleen jatkaaksesi allekirjoittamista."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 Allekirjoitus valmis!",
|
||||
"subtitle": "Asiakirja on allekirjoitettu onnistuneesti",
|
||||
"thankYou": "Kiitos allekirjoituksesta!",
|
||||
"message": "Saat vahvistusviestin sähköpostiisi, kun kaikki osapuolet ovat allekirjoittaneet asiakirjan.",
|
||||
"passDevice": "Voit nyt palauttaa laitteen <strong>{{senderName}}</strong>:lle",
|
||||
"continueButton": "Jatka"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "En cliquant sur <0>J'accepte</0>, vous confirmez avoir examiné la <1>Divulgation des registres électroniques et des signatures</1> et consentez à l'utilisation de registres et signatures électroniques pour l'examen et l'exécution de ce document.",
|
||||
"note": "Remarque :",
|
||||
"noteText": "Accepter cela ne signifie pas que vous signez le document immédiatement. Cela vous permet uniquement de le consulter électroniquement. Vous aurez la possibilité d'examiner le document dans son intégralité avant de signer."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "J'accepte",
|
||||
"processing": "Traitement en cours...",
|
||||
"close": "Fermer",
|
||||
"downloadPdf": "Télécharger le PDF",
|
||||
"downloading": "Téléchargement..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "Résumé IA",
|
||||
"completeSign": "Signer complètement",
|
||||
"sign": "Signer",
|
||||
"processing": "Traitement en cours...",
|
||||
"options": "Télécharger"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "Télécharger le PDF",
|
||||
"auditTrail": "Piste d'audit",
|
||||
"reassignSigner": "Réattribuer le signataire",
|
||||
"cancelTransaction": "Annuler la transaction",
|
||||
"viewTerms": "Voir les conditions générales",
|
||||
"helpSupport": "Aide et assistance",
|
||||
"about": "À propos de SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Documents",
|
||||
"pages": "Pages : {{count}}",
|
||||
"noDocuments": "Aucun document disponible."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "Prêt à finaliser ?",
|
||||
"readyDesc": "Vous avez rempli les champs requis. Vérifiez votre travail, puis sélectionnez Terminer.",
|
||||
"finish": "Terminer",
|
||||
"submitting": "Soumission...",
|
||||
"start": "Commencer",
|
||||
"next": "Suivant",
|
||||
"agreementText": "En signant, j'accepte les <0>conditions générales</0> de Sign Made Easy."
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "Terminé !",
|
||||
"title": "Merci d'avoir signé",
|
||||
"message": "Votre document est maintenant complété et stocké en toute sécurité. Nous vous en avons envoyé une copie par e-mail."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "Action annulée !",
|
||||
"title": "La prochaine fois peut-être !",
|
||||
"message": "Votre demande a été refusée."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "Action annulée !",
|
||||
"title": "La prochaine fois peut-être !",
|
||||
"message": "Votre demande a été annulée."
|
||||
},
|
||||
"download": "Télécharger",
|
||||
"downloading": "Téléchargement...",
|
||||
"downloadSuccess": "Fichier téléchargé avec succès.",
|
||||
"downloadOptions": {
|
||||
"pdf": "Document PDF",
|
||||
"audit": "Piste d'audit",
|
||||
"selectFormat": "Sélectionner le format"
|
||||
},
|
||||
"downloadError": "Le téléchargement du fichier a échoué. Veuillez réessayer.",
|
||||
"appsTitle": "Améliorez votre efficacité avec nos applications",
|
||||
"formsTitle": "Générez facilement des formulaires",
|
||||
"docsTitle": "Générez des documents (factures, rapports, devis)",
|
||||
"tryNow": "Essayer maintenant",
|
||||
"footerText": "Droits d'auteur 2026 Sign Made Easy. Tous droits réservés.<0>Politique de confidentialité</0> | <1>Politique d'utilisation raisonnable</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Réattribuer le signataire",
|
||||
"successSubtitle": "Le document a été réattribué avec succès",
|
||||
"successTitle": "Merci !",
|
||||
"successMessage": "Le document a été réattribué avec succès au nouveau signataire.",
|
||||
"fields": {
|
||||
"firstName": "Prénom",
|
||||
"lastName": "Nom",
|
||||
"email": "E-mail",
|
||||
"language": "Langue",
|
||||
"message": "Message optionnel"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Entrez votre prénom",
|
||||
"lastName": "Entrez votre nom",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Écrivez votre message ici..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Soumettre",
|
||||
"submitting": "Soumission...",
|
||||
"cancel": "Annuler"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "Le prénom est requis",
|
||||
"firstNameMin": "Le prénom doit contenir au moins 2 caractères",
|
||||
"lastNameRequired": "Le nom est requis",
|
||||
"lastNameMin": "Le nom doit contenir au moins 2 caractères",
|
||||
"emailRequired": "L'e-mail est requis",
|
||||
"emailInvalid": "Adresse e-mail invalide"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Annuler la transaction",
|
||||
"description": "Êtes-vous sûr de vouloir annuler cette transaction ? Fournissez votre raison d'annulation ci-dessous.",
|
||||
"placeholder": "Veuillez indiquer votre raison d'annulation...",
|
||||
"buttons": {
|
||||
"no": "Non, ne pas annuler",
|
||||
"yes": "Oui, annuler"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "La raison de l'annulation est requise"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Annuler la transaction",
|
||||
"message": "La transaction a été annulée avec succès. Des e-mails de confirmation ont été envoyés.",
|
||||
"passBackDevice": "Vous pouvez maintenant remettre l'appareil à {{senderName}}.",
|
||||
"continueButton": "Continuer"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Audit de transaction",
|
||||
"meta.transaction_id": "ID de transaction",
|
||||
"meta.transaction_status": "Statut de la transaction",
|
||||
"meta.files": "Fichiers",
|
||||
"audit.title": "Piste d'audit complète",
|
||||
"audit.description": "Veuillez mettre à jour le sujet et le message ci-dessous pour un message personnalisé.",
|
||||
"table.header.actions": "Actions",
|
||||
"table.header.language": "Langue",
|
||||
"table.header.ip_address": "Adresse IP",
|
||||
"table.header.date": "Date",
|
||||
"status.completed": "Terminé",
|
||||
"status.pending": "En attente",
|
||||
"status.failed": "Échoué",
|
||||
"action.created": "Créé",
|
||||
"action.updated": "Mis à jour",
|
||||
"action.deleted": "Supprimé",
|
||||
"action.viewed": "Consulté",
|
||||
"action.signed": "Signé",
|
||||
"action.uploaded": "Téléchargé",
|
||||
"action.downloaded": "Téléchargé",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Audit de transaction",
|
||||
"meta": {
|
||||
"transactionId": "ID de transaction",
|
||||
"transactionStatus": "Statut de la transaction",
|
||||
"files": "Fichiers"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Piste d'audit complète",
|
||||
"description": "Veuillez mettre à jour le sujet et le message ci-dessous pour un message personnalisé."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Actions",
|
||||
"language": "Langue",
|
||||
"ipAddress": "Adresse IP",
|
||||
"date": "Date"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Terminé",
|
||||
"pending": "En attente",
|
||||
"failed": "Échoué"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "La transaction a été créée par {{userName}} <{{userEmail}}>",
|
||||
"sent": "La transaction a été envoyée par {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "La transaction a été annulée par {{userName}} <{{userEmail}}>",
|
||||
"edited": "La transaction a été modifiée par {{userName}} <{{userEmail}}>",
|
||||
"viewed": "La transaction a été consultée par {{userName}} <{{userEmail}}>",
|
||||
"signed": "La transaction a été signée par {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "La signature de la transaction a été refusée par {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "La divulgation de l'enregistrement électronique et de la signature a été acceptée par {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> a mis à jour sa langue vers {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "E-mail d'invitation envoyé à {{userName}} <{{userEmail}}>",
|
||||
"view": "L'invitation à consulter le document a été envoyée à {{userName}} <{{userEmail}}>",
|
||||
"resent": "E-mail d'invitation renvoyé à {{recipientName}} <{{recipientEmail}}> par {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Le signataire a été réaffecté par {{fromName}} <{{fromEmail}}> à {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> a été réaffecté par {{fromName}} <{{fromEmail}}> à {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "La transaction en personne a été démarrée par {{userName}} <{{userEmail}}>",
|
||||
"verification": "La vérification de signature en personne a été acceptée par {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Le processus de facilitateur a été accepté par {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Signature",
|
||||
"initial": "Initiale",
|
||||
"edit": "Modifier",
|
||||
"styleSelection": "Sélection du Style"
|
||||
},
|
||||
"subtitle": "Créez vos signatures numériques",
|
||||
"tabs": {
|
||||
"select": "Sélectionner",
|
||||
"draw": "Dessiner",
|
||||
"upload": "Télécharger"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Confirmez votre nom et choisissez un style de signature.",
|
||||
"requiredFields": "Champs obligatoires.",
|
||||
"fullName": {
|
||||
"label": "Nom Complet",
|
||||
"required": "*",
|
||||
"placeholder": "Entrez le nom complet"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Initiales",
|
||||
"required": "*",
|
||||
"placeholder": "Entrez les initiales"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Dessinez votre signature.",
|
||||
"required": "*",
|
||||
"requiredFields": "Sont des champs obligatoires.",
|
||||
"signature": "Signature",
|
||||
"initials": "Initiales",
|
||||
"clearSignature": "Effacer la signature",
|
||||
"fullNameBox": {
|
||||
"label": "Signature complète",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Initiales",
|
||||
"required": "*",
|
||||
"placeholder": "Entrez les initiales"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "La signature et les initiales sont obligatoires.",
|
||||
"requirements": "Utilisez des images de 300×100px pour les signatures et 100×100px pour les initiales. Max 300KB. Formats supportés : .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Télécharger la Signature",
|
||||
"uploadHint": "JPG, PNG (300×100px, max 300KB)",
|
||||
"browseButton": "Parcourir",
|
||||
"uploadedLabel": "Signature ✓",
|
||||
"changeButton": "Changer la Signature",
|
||||
"altText": "Image de signature téléchargée"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Télécharger les Initiales",
|
||||
"uploadHint": "JPG, PNG (100×100px, max 300KB)",
|
||||
"browseButton": "Parcourir",
|
||||
"uploadedLabel": "Initiales ✓",
|
||||
"changeButton": "Changer les Initiales",
|
||||
"altText": "Image des initiales téléchargée"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Je comprends que je signe ce document.",
|
||||
"cancelButton": "Annuler",
|
||||
"adoptButton": "Adopter la Signature et Signer"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Ce champ est obligatoire",
|
||||
"fileTooLarge": "La taille du fichier doit être inférieure à 300KB",
|
||||
"invalidFileType": "Seuls les fichiers .png, .jpg et .jpeg sont supportés",
|
||||
"signatureRequired": "Veuillez ajouter une signature",
|
||||
"initialsRequired": "Veuillez ajouter des initiales"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Ajouter un Tampon",
|
||||
"edit": "Modifier le Tampon"
|
||||
},
|
||||
"closeButton": "Fermer la modale",
|
||||
"fileRequirements": "Taille maximale = 400Kb | Types de fichiers supportés = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Glissez-déposez une image, ou cliquez pour télécharger",
|
||||
"previewAltText": "Aperçu du Tampon",
|
||||
"changeImageButton": "Changer l'image",
|
||||
"clearButton": "Fermer",
|
||||
"saveButton": "Enregistrer",
|
||||
"updateButton": "Mettre à jour",
|
||||
"errors": {
|
||||
"fileTooLarge": "La taille du fichier dépasse la limite de 400KB",
|
||||
"invalidFileType": "Seuls les fichiers .png, .jpg et .jpeg sont supportés",
|
||||
"uploadFailed": "Échec du téléchargement de l'image. Veuillez réessayer."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Pièce jointe",
|
||||
"subtitle": {
|
||||
"hasFile": "Gérer votre pièce jointe",
|
||||
"noFile": "Télécharger une pièce jointe"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Téléchargement du fichier...",
|
||||
"shimmerText": "Téléchargement du fichier..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Déposez votre fichier ici",
|
||||
"default": "Télécharger ou glisser-déposer un fichier",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (max 10MB)",
|
||||
"browseButton": "Parcourir les fichiers"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Téléchargé avec succès",
|
||||
"deleteButton": "Supprimer le fichier"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Fermer",
|
||||
"uploading": "Téléchargement...",
|
||||
"deleting": "Suppression...",
|
||||
"saved": "Fichier Enregistré !",
|
||||
"done": "Terminé",
|
||||
"uploadFile": "Télécharger le fichier"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "La taille du fichier dépasse la limite de 10MB",
|
||||
"invalidFileType": "Seuls les fichiers PDF, DOCX, JPG, PNG et TXT sont supportés",
|
||||
"uploadFailed": "Échec du téléchargement du fichier. Veuillez réessayer.",
|
||||
"deleteFailed": "Échec de la suppression du fichier. Veuillez réessayer.",
|
||||
"noFileSelected": "Veuillez sélectionner un fichier avant de continuer"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Téléchargement de fichier",
|
||||
"deleteFile": "Supprimer le fichier"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Chinois (Simplifié)",
|
||||
"zh_TW": "Chinois (Traditionnel)",
|
||||
"da": "Danois",
|
||||
"nl_NL": "Néerlandais",
|
||||
"en": "Anglais",
|
||||
"fi": "Finnois",
|
||||
"fr": "Français",
|
||||
"de": "Allemand",
|
||||
"it": "Italien",
|
||||
"ja": "Japonais",
|
||||
"ko": "Coréen",
|
||||
"no": "Norvégien",
|
||||
"pt_BR": "Portugais (Brésil)",
|
||||
"ru": "Russe",
|
||||
"es": "Espagnol",
|
||||
"es_MX": "Espagnol (Mexique)",
|
||||
"sv": "Suédois",
|
||||
"th": "Thaïlandais",
|
||||
"he": "Hébreu"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Session expirée",
|
||||
"description": "Ce lien de signature de document a expiré en raison d'une inactivité ou d'un délai d'attente de session. Veuillez retourner dans votre courrier électronique et cliquer à nouveau sur le lien pour continuer à signer."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 Signature terminée !",
|
||||
"subtitle": "Le document a été signé avec succès",
|
||||
"thankYou": "Merci d'avoir signé !",
|
||||
"message": "Vous recevrez un e-mail de confirmation une fois que le document aura été signé par toutes les parties.",
|
||||
"passDevice": "Vous pouvez maintenant rendre l'appareil à <strong>{{senderName}}</strong>",
|
||||
"continueButton": "Continuer"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "בלחיצה על <0>אני מסכים</0>, אתה מאשר כי עיינת ב-<1>הצהרת רשומה אלקטרונית וחתימה</1>, ונותן את הסכמתך לשימוש ברשומות ובחתימות אלקטרוניות בעת עיון וחתימה על מסמך זה.",
|
||||
"note": "הערה:",
|
||||
"noteText": "הסכמה לכך אינה משמעה שאתה חותם על המסמך באופן מיידי. זה רק מאפשר לך לעיין בו באופן אלקטרוני. תהיה לך הזדמנות לעיין במסמך במלואו לפני החתימה."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "אני מסכים",
|
||||
"processing": "מעבד...",
|
||||
"close": "סגור",
|
||||
"downloadPdf": "הורד PDF",
|
||||
"downloading": "מוריד..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "סיכום AI",
|
||||
"completeSign": "השלם חתימה",
|
||||
"sign": "חתום",
|
||||
"processing": "מעבד...",
|
||||
"options": "הורד"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "הורד PDF",
|
||||
"auditTrail": "מסלול ביקורת",
|
||||
"reassignSigner": "הקצה חותם מחדש",
|
||||
"cancelTransaction": "בטל עסקה",
|
||||
"viewTerms": "צפה בתנאים והגבלות",
|
||||
"helpSupport": "עזרה ותמיכה",
|
||||
"about": "אודות SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "מסמכים",
|
||||
"pages": "עמודים: {{count}}",
|
||||
"noDocuments": "אין מסמכים זמינים."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "הכל מוכן לסיום?",
|
||||
"readyDesc": "מילאת את כל השדות הנדרשים. עיין בעבודתך, ולאחר מכן בחר סיום.",
|
||||
"finish": "סיים",
|
||||
"submitting": "שולח...",
|
||||
"start": "התחל",
|
||||
"next": "הבא",
|
||||
"agreementText": "בחתימתי, אני מסכים ל-<0>תנאים והגבלות</0> של Sign Made Easy."
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "הכל הושלם!",
|
||||
"title": "תודה על החתימה",
|
||||
"message": "המסמך שלך הושלם ומאוחסן בצורה מאובטחת. שלחנו לך עותק במייל."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "הפעולה בוטלה!",
|
||||
"title": "אולי בפעם הבאה!",
|
||||
"message": "בקשתך נדחתה בהצלחה."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "הפעולה בוטלה!",
|
||||
"title": "אולי בפעם הבאה!",
|
||||
"message": "בקשתך בוטלה בהצלחה."
|
||||
},
|
||||
"download": "הורד",
|
||||
"downloading": "מוריד...",
|
||||
"downloadSuccess": "הקובץ הורד בהצלחה.",
|
||||
"downloadOptions": {
|
||||
"pdf": "מסמך PDF",
|
||||
"audit": "מסלולי ביקורת",
|
||||
"selectFormat": "בחר פורמט"
|
||||
},
|
||||
"downloadError": "הורדת הקובץ נכשלה. אנא נסה שוב.",
|
||||
"appsTitle": "הגבר יעילות עם האפליקציות שלנו",
|
||||
"formsTitle": "צור טפסים בקלות",
|
||||
"docsTitle": "צור מסמכים (חשבוניות, דוחות, הצעות מחיר)",
|
||||
"tryNow": "נסה עכשיו",
|
||||
"footerText": "כל הזכויות שמורות 2026 Sign Made Easy. <0>מדיניות פרטיות</0> | <1>מדיניות שימוש סביר</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "הקצאת חותם מחדש",
|
||||
"successSubtitle": "המסמך הוקצה מחדש בהצלחה",
|
||||
"successTitle": "תודה רבה!",
|
||||
"successMessage": "המסמך הוקצה מחדש לחתום החדש בהצלחה.",
|
||||
"fields": {
|
||||
"firstName": "שם פרטי",
|
||||
"lastName": "שם משפחה",
|
||||
"email": "דוא\"ל",
|
||||
"language": "שפה",
|
||||
"message": "הודעה אופציונלית"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "הכנס את שמך הפרטי",
|
||||
"lastName": "הכנס את שם משפחתך",
|
||||
"email": "your.email@example.com",
|
||||
"message": "כתוב את הודעתך כאן..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "שלח",
|
||||
"submitting": "שולח...",
|
||||
"cancel": "בטל"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "שם פרטי הוא שדה חובה",
|
||||
"firstNameMin": "שם פרטי חייב להכיל לפחות 2 תווים",
|
||||
"lastNameRequired": "שם משפחה הוא שדה חובה",
|
||||
"lastNameMin": "שם משפחה חייב להכיל לפחות 2 תווים",
|
||||
"emailRequired": "דוא\"ל הוא שדה חובה",
|
||||
"emailInvalid": "כתובת דוא\"ל לא תקינה"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "בטל עסקה",
|
||||
"description": "האם אתה בטוח שברצונך לבטל עסקה זו? ספק את סיבת הביטול להלן.",
|
||||
"placeholder": "אנא ספק את סיבת הביטול שלך...",
|
||||
"buttons": {
|
||||
"no": "לא, אל תבטל",
|
||||
"yes": "כן, בטל אותה"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "סיבת ביטול היא שדה חובה"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "בטל עסקה",
|
||||
"message": "העסקה בוטלה בהצלחה. מיילי אישור נשלחו.",
|
||||
"passBackDevice": "כעת תוכל להעביר את המכשיר בחזרה ל-{{senderName}}.",
|
||||
"continueButton": "המשך"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "ביקורת עסקה",
|
||||
"meta.transaction_id": "מזהה עסקה",
|
||||
"meta.transaction_status": "סטטוס עסקה",
|
||||
"meta.files": "קבצים",
|
||||
"audit.title": "מסלול ביקורת מלא",
|
||||
"audit.description": "אנא עדכן את הנושא וההודעה להלן להודעה מותאמת אישית.",
|
||||
"table.header.actions": "פעולות",
|
||||
"table.header.language": "שפה",
|
||||
"table.header.ip_address": "כתובת IP",
|
||||
"table.header.date": "תאריך",
|
||||
"status.completed": "הושלם",
|
||||
"status.pending": "ממתין",
|
||||
"status.failed": "נכשל",
|
||||
"action.created": "נוצר",
|
||||
"action.updated": "עודכן",
|
||||
"action.deleted": "נמחק",
|
||||
"action.viewed": "נצפה",
|
||||
"action.signed": "נחתם",
|
||||
"action.uploaded": "הועלה",
|
||||
"action.downloaded": "הורד",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "ביקורת עסקה",
|
||||
"meta": {
|
||||
"transactionId": "מזהה עסקה",
|
||||
"transactionStatus": "סטטוס עסקה",
|
||||
"files": "קבצים"
|
||||
},
|
||||
"audit": {
|
||||
"title": "מסלול ביקורת מלא",
|
||||
"description": "אנא עדכן את הנושא וההודעה להלן להודעה מותאמת אישית."
|
||||
},
|
||||
"table": {
|
||||
"actions": "פעולות",
|
||||
"language": "שפה",
|
||||
"ipAddress": "כתובת IP",
|
||||
"date": "תאריך"
|
||||
},
|
||||
"status": {
|
||||
"completed": "הושלם",
|
||||
"pending": "ממתין",
|
||||
"failed": "נכשל"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "העסקה נוצרה על ידי {{userName}} <{{userEmail}}>",
|
||||
"sent": "העסקה נשלחה על ידי {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "העסקה בוטלה על ידי {{userName}} <{{userEmail}}>",
|
||||
"edited": "העסקה נערכה על ידי {{userName}} <{{userEmail}}>",
|
||||
"viewed": "העסקה נצפתה על ידי {{userName}} <{{userEmail}}>",
|
||||
"signed": "העסקה נחתמה על ידי {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "חתימת העסקה נדחתה על ידי {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "הצהרת רשומה אלקטרונית וחתימה התקבלה על ידי {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> עדכן את השפה שלו ל-{{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "מייל הזמנה נשלח ל-{{userName}} <{{userEmail}}>",
|
||||
"view": "הזמנה לעיון במסמך נשלחה ל-{{userName}} <{{userEmail}}>",
|
||||
"resent": "מייל הזמנה נשלח שוב ל-{{recipientName}} <{{recipientEmail}}> על ידי {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "החותם הוקצה מחדש על ידי {{fromName}} <{{fromEmail}}> ל-{{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> הוקצה מחדש על ידי {{fromName}} <{{fromEmail}}> ל-{{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "עסקה אישית החלה על ידי {{userName}} <{{userEmail}}>",
|
||||
"verification": "אימות חתימה אישית התקבל על ידי {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "תהליך המנחה התקבל על ידי {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "חתימה",
|
||||
"initial": "ראשי תיבות",
|
||||
"edit": "עריכה",
|
||||
"styleSelection": "בחירת סגנון"
|
||||
},
|
||||
"subtitle": "צור את החתימות הדיגיטליות שלך",
|
||||
"tabs": {
|
||||
"select": "בחירה",
|
||||
"draw": "ציור",
|
||||
"upload": "העלאה"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "אשר את שמך ובחר סגנון חתימה.",
|
||||
"requiredFields": "שדות חובה.",
|
||||
"fullName": {
|
||||
"label": "שם מלא",
|
||||
"required": "*",
|
||||
"placeholder": "הזן שם מלא"
|
||||
},
|
||||
"initials": {
|
||||
"label": "ראשי תיבות",
|
||||
"required": "*",
|
||||
"placeholder": "הזן ראשי תיבות"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "צייר את החתימה שלך.",
|
||||
"required": "*",
|
||||
"requiredFields": "הם שדות חובה.",
|
||||
"signature": "חתימה",
|
||||
"initials": "ראשי תיבות",
|
||||
"clearSignature": "נקה חתימה",
|
||||
"fullNameBox": {
|
||||
"label": "חתימה מלאה",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "ראשי תיבות",
|
||||
"required": "*",
|
||||
"placeholder": "הזן ראשי תיבות"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "נדרשים גם חתימה וגם ראשי תיבות.",
|
||||
"requirements": "השתמש בתמונות בגודל 300×100px לחתימות ו-100×100px לראשי תיבות. מקסימום 300KB. נתמך: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "העלאת חתימה",
|
||||
"uploadHint": "JPG, PNG (300×100px, מקסימום 300KB)",
|
||||
"browseButton": "עיון",
|
||||
"uploadedLabel": "חתימה ✓",
|
||||
"changeButton": "שינוי חתימה",
|
||||
"altText": "תמונת חתימה שהועלתה"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "העלאת ראשי תיבות",
|
||||
"uploadHint": "JPG, PNG (100×100px, מקסימום 300KB)",
|
||||
"browseButton": "עיון",
|
||||
"uploadedLabel": "ראשי תיבות ✓",
|
||||
"changeButton": "שינוי ראשי תיבות",
|
||||
"altText": "תמונת ראשי תיבות שהועלתה"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "אני מבין שאני חותם על מסמך זה.",
|
||||
"cancelButton": "ביטול",
|
||||
"adoptButton": "אימוץ חתימה וחתימה"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "שדה זה הוא חובה",
|
||||
"fileTooLarge": "גודל הקובץ חייב להיות פחות מ-300KB",
|
||||
"invalidFileType": "נתמכים רק קבצי .png, .jpg ו-.jpeg",
|
||||
"signatureRequired": "נא להוסיף חתימה",
|
||||
"initialsRequired": "נא להוסיף ראשי תיבות"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "הוספת חותמת",
|
||||
"edit": "עריכת חותמת"
|
||||
},
|
||||
"closeButton": "סגירת חלון",
|
||||
"fileRequirements": "גודל מקסימלי = 400Kb | סוגי קבצים נתמכים = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "גרור ושחרר תמונה, או לחץ להעלאה",
|
||||
"previewAltText": "תצוגה מקדימה של החותמת",
|
||||
"changeImageButton": "שינוי תמונה",
|
||||
"clearButton": "סגור",
|
||||
"saveButton": "שמור",
|
||||
"updateButton": "עדכן",
|
||||
"errors": {
|
||||
"fileTooLarge": "גודל הקובץ חורג ממגבלת 400KB",
|
||||
"invalidFileType": "נתמכים רק קבצי .png, .jpg ו-.jpeg",
|
||||
"uploadFailed": "העלאת התמונה נכשלה. אנא נסה שוב."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "קובץ מצורף",
|
||||
"subtitle": {
|
||||
"hasFile": "ניהול הקובץ המצורף שלך",
|
||||
"noFile": "העלאת קובץ מצורף"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "מעלה קובץ...",
|
||||
"shimmerText": "מעלה קובץ..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "שחרר את הקובץ שלך כאן",
|
||||
"default": "העלה או גרור ושחרר קובץ",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (מקסימום 10MB)",
|
||||
"browseButton": "עיון בקבצים"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "הועלה בהצלחה",
|
||||
"deleteButton": "מחיקת קובץ"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "סגור",
|
||||
"uploading": "מעלה...",
|
||||
"deleting": "מוחק...",
|
||||
"saved": "הקובץ נשמר!",
|
||||
"done": "בוצע",
|
||||
"uploadFile": "העלאת קובץ"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "גודל הקובץ חורג ממגבלת 10MB",
|
||||
"invalidFileType": "נתמכים רק קבצי PDF, DOCX, JPG, PNG ו-TXT",
|
||||
"uploadFailed": "העלאת הקובץ נכשלה. אנא נסה שוב.",
|
||||
"deleteFailed": "מחיקת הקובץ נכשלה. אנא נסה שוב.",
|
||||
"noFileSelected": "אנא בחר קובץ לפני ההמשך"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "העלאת קובץ",
|
||||
"deleteFile": "מחיקת קובץ"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"he": "עברית",
|
||||
"zh_CN": "סינית (פשוטה)",
|
||||
"zh_TW": "סינית (מסורתית)",
|
||||
"da": "דנית",
|
||||
"nl_NL": "הולנדית",
|
||||
"en": "אנגלית",
|
||||
"fi": "פינית",
|
||||
"fr": "צרפתית",
|
||||
"de": "גרמנית",
|
||||
"it": "איטלקית",
|
||||
"ja": "יפנית",
|
||||
"ko": "קוריאנית",
|
||||
"no": "נורווגית",
|
||||
"pt_BR": "פורטוגזית (ברזיל)",
|
||||
"ru": "רוסית",
|
||||
"es": "ספרדית",
|
||||
"es_MX": "ספרדית (מקסיקו)",
|
||||
"sv": "שוודית",
|
||||
"th": "תאית"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "הפגישה פגה",
|
||||
"description": "קישור החתימה על מסמך זה פג עקב חוסר פעילות או פקיעת זמן פגישה. אנא חזור לדוא\"ל שלך ולחץ שוב על הקישור כדי להמשיך בחתימה."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 ההחתמה הושלמה!",
|
||||
"subtitle": "המסמך נחתם בהצלחה",
|
||||
"thankYou": "תודה על החתימה!",
|
||||
"message": "תקבל אישור בדוא\"ל לאחר שהמסמך ייחתם על ידי כל הצדדים.",
|
||||
"passDevice": "כעת תוכל להחזיר את המכשיר ל<strong>{{senderName}}</strong>",
|
||||
"continueButton": "המשך"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "<0>\"मैं सहमत हूँ\"</0> पर क्लिक करके, आप पुष्टि करते हैं कि आपने <1>इलेक्ट्रॉनिक रिकॉर्ड और हस्ताक्षर प्रकटीकरण</1> की समीक्षा कर ली है, और इस दस्तावेज़ की समीक्षा और निष्पादन के लिए इलेक्ट्रॉनिक रिकॉर्ड और हस्ताक्षरों के उपयोग के लिए अपनी सहमति देते हैं।",
|
||||
"note": "नोट:",
|
||||
"noteText": "इससे सहमत होने का मतलब यह नहीं है कि आप तुरंत दस्तावेज़ पर हस्ताक्षर कर रहे हैं। यह केवल आपको इसे इलेक्ट्रॉनिक रूप से देखने की अनुमति देता है। हस्ताक्षर करने से पहले आपको दस्तावेज़ को पूरी तरह से समीक्षा करने का अवसर मिलेगा।"
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "मैं सहमत हूँ",
|
||||
"processing": "प्रोसेस हो रहा है...",
|
||||
"close": "बंद करें",
|
||||
"downloadPdf": "PDF डाउनलोड करें",
|
||||
"downloading": "डाउनलोड हो रहा है..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "AI सारांश",
|
||||
"completeSign": "साइन पूरा करें",
|
||||
"sign": "साइन करें",
|
||||
"processing": "प्रोसेस हो रहा है..."
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "PDF डाउनलोड करें",
|
||||
"reassignSigner": "साइनर पुनः असाइन करें",
|
||||
"cancelTransaction": "लेनदेन रद्द करें",
|
||||
"viewTerms": "नियम और शर्तें देखें",
|
||||
"helpSupport": "सहायता और समर्थन",
|
||||
"about": "SME के बारे में"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "दस्तावेज़",
|
||||
"pages": "पेज: {{count}}",
|
||||
"noDocuments": "कोई दस्तावेज़ उपलब्ध नहीं है।"
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "क्या आप इसे पूरा करने के लिए तैयार हैं?",
|
||||
"readyDesc": "आपने आवश्यक फ़ील्ड भर लिए हैं। अपने काम की समीक्षा करें, फिर समाप्त करें चुनें।",
|
||||
"finish": "समाप्त करें",
|
||||
"submitting": "सबमिट हो रहा है...",
|
||||
"start": "शुरू करें",
|
||||
"next": "अगला",
|
||||
"agreementText": "हस्ताक्षर करके, मैं Sign Made Easy के <0>नियम और शर्तों</0> से सहमत हूँ।"
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "सब पूरा हो गया!",
|
||||
"title": "साइन करने के लिए धन्यवाद",
|
||||
"message": "आपका दस्तावेज़ अब पूरा हो चुका है और सुरक्षित रूप से संग्रहीत है। हमने आपको इसकी एक कॉपी ईमेल कर दी है।"
|
||||
},
|
||||
"declined": {
|
||||
"hit": "कार्रवाई रद्द की गई!",
|
||||
"title": "शायद अगली बार!",
|
||||
"message": "आपका अनुरोध सफलतापूर्वक अस्वीकार कर दिया गया है।"
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "कार्रवाई रद्द की गई!",
|
||||
"title": "शायद अगली बार!",
|
||||
"message": "आपका अनुरोध सफलतापूर्वक अस्वीकार कर दिया गया है।"
|
||||
},
|
||||
"download": "डाउनलोड करें",
|
||||
"downloading": "डाउनलोड हो रहा है...",
|
||||
"downloadSuccess": "फ़ाइल सफलतापूर्वक डाउनलोड हो गई।",
|
||||
"downloadError": "फ़ाइल डाउनलोड नहीं हो सकी। कृपया पुनः प्रयास करें।",
|
||||
"appsTitle": "हमारे ऐप्स के साथ अपनी कार्यक्षमता बढ़ाएँ",
|
||||
"formsTitle": "आसानी से फॉर्म बनाएं",
|
||||
"docsTitle": "दस्तावेज़ बनाएं (इनवॉइस, रिपोर्ट, कोट्स)",
|
||||
"tryNow": "अभी आज़माएं",
|
||||
"footerText": "कॉपीराइट 2026 Sign Made Easy। सर्वाधिकार सुरक्षित। <0>गोपनीयता नीति</0> | <1>उचित उपयोग नीति</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "हस्ताक्षरकर्ता पुनः असाइन करें",
|
||||
"fields": {
|
||||
"firstName": "पहला नाम",
|
||||
"lastName": "अंतिम नाम",
|
||||
"email": "ईमेल",
|
||||
"language": "भाषा",
|
||||
"message": "वैकल्पिक संदेश"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "अपना पहला नाम दर्ज करें",
|
||||
"lastName": "अपना अंतिम नाम दर्ज करें",
|
||||
"email": "your.email@example.com",
|
||||
"message": "अपना संदेश यहाँ लिखें..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "सबमिट करें",
|
||||
"submitting": "सबमिट किया जा रहा है...",
|
||||
"cancel": "रद्द करें"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "पहला नाम आवश्यक है",
|
||||
"firstNameMin": "पहला नाम कम से कम 2 अक्षरों का होना चाहिए",
|
||||
"lastNameRequired": "अंतिम नाम आवश्यक है",
|
||||
"lastNameMin": "अंतिम नाम कम से कम 2 अक्षरों का होना चाहिए",
|
||||
"emailRequired": "ईमेल आवश्यक है",
|
||||
"emailInvalid": "अमान्य ईमेल पता"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "लेनदेन रद्द करें",
|
||||
"description": "क्या आप वाकई इस लेनदेन को रद्द करना चाहते हैं? कृपया नीचे रद्द करने का कारण बताएं।",
|
||||
"placeholder": "कृपया रद्द करने का कारण लिखें...",
|
||||
"buttons": {
|
||||
"no": "नहीं, रद्द न करें",
|
||||
"yes": "हाँ, इसे रद्द करें"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "रद्द करने का कारण आवश्यक है"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "Facendo clic su <0>Accetto</0>, confermi di aver letto l'<1>Informativa sui registri elettronici e le firme</1> e acconsenti all'uso di registri e firme elettronici per la revisione e l'esecuzione di questo documento.",
|
||||
"note": "Nota:",
|
||||
"noteText": "Accettare questo non significa che firmi immediatamente il documento. Ti permette solo di visualizzarlo elettronicamente. Avrai la possibilità di rivedere il documento per intero prima di firmare."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "Accetto",
|
||||
"processing": "Elaborazione in corso...",
|
||||
"close": "Chiudi",
|
||||
"downloadPdf": "Scarica PDF",
|
||||
"downloading": "Download in corso..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "Riepilogo AI",
|
||||
"completeSign": "Completa firma",
|
||||
"sign": "Firma",
|
||||
"processing": "Elaborazione in corso...",
|
||||
"options": "Scarica"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "Scarica PDF",
|
||||
"auditTrail": "Traccia di audit",
|
||||
"reassignSigner": "Riassegna firmatario",
|
||||
"cancelTransaction": "Annulla transazione",
|
||||
"viewTerms": "Visualizza termini e condizioni",
|
||||
"helpSupport": "Aiuto e supporto",
|
||||
"about": "Informazioni su SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Documenti",
|
||||
"pages": "Pagine: {{count}}",
|
||||
"noDocuments": "Nessun documento disponibile."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "Pronto per concludere?",
|
||||
"readyDesc": "Hai compilato i campi richiesti. Rivedi il tuo lavoro, quindi seleziona Fine.",
|
||||
"finish": "Fine",
|
||||
"submitting": "Invio in corso...",
|
||||
"start": "Inizia",
|
||||
"next": "Avanti",
|
||||
"agreementText": "Firmando, accetto i <0>Termini e condizioni</0> di Sign Made Easy."
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "Tutto fatto!",
|
||||
"title": "Grazie per la firma",
|
||||
"message": "Il tuo documento è ora completo e archiviato in modo sicuro. Ti abbiamo inviato una copia via email."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "Azione annullata!",
|
||||
"title": "Forse la prossima volta!",
|
||||
"message": "La tua richiesta è stata rifiutata."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "Azione annullata!",
|
||||
"title": "Forse la prossima volta!",
|
||||
"message": "La tua richiesta è stata annullata."
|
||||
},
|
||||
"download": "Scarica",
|
||||
"downloading": "Download in corso...",
|
||||
"downloadSuccess": "File scaricato con successo.",
|
||||
"downloadOptions": {
|
||||
"pdf": "Documento PDF",
|
||||
"audit": "Traccia di audit",
|
||||
"selectFormat": "Seleziona formato"
|
||||
},
|
||||
"downloadError": "Download del file fallito. Riprova.",
|
||||
"appsTitle": "Aumenta l'efficienza con le nostre app",
|
||||
"formsTitle": "Genera moduli facilmente",
|
||||
"docsTitle": "Genera documenti (fatture, report, preventivi)",
|
||||
"tryNow": "Prova ora",
|
||||
"footerText": "Copyright 2026 Sign Made Easy. Tutti i diritti riservati.<0>Informativa sulla privacy</0> | <1>Politica di uso ragionevole</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Riassegna firmatario",
|
||||
"successSubtitle": "Il documento è stato riassegnato con successo",
|
||||
"successTitle": "Grazie!",
|
||||
"successMessage": "Il documento è stato riassegnato con successo al nuovo firmatario.",
|
||||
"fields": {
|
||||
"firstName": "Nome",
|
||||
"lastName": "Cognome",
|
||||
"email": "Email",
|
||||
"language": "Lingua",
|
||||
"message": "Messaggio opzionale"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Inserisci il tuo nome",
|
||||
"lastName": "Inserisci il tuo cognome",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Scrivi il tuo messaggio qui..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Invia",
|
||||
"submitting": "Invio in corso...",
|
||||
"cancel": "Annulla"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "Il nome è obbligatorio",
|
||||
"firstNameMin": "Il nome deve contenere almeno 2 caratteri",
|
||||
"lastNameRequired": "Il cognome è obbligatorio",
|
||||
"lastNameMin": "Il cognome deve contenere almeno 2 caratteri",
|
||||
"emailRequired": "L'email è obbligatoria",
|
||||
"emailInvalid": "Indirizzo email non valido"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Annulla transazione",
|
||||
"description": "Sei sicuro di voler annullare questa transazione? Fornisci il motivo dell'annullamento qui sotto.",
|
||||
"placeholder": "Fornisci il motivo dell'annullamento...",
|
||||
"buttons": {
|
||||
"no": "No, non annullare",
|
||||
"yes": "Sì, annulla"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "Il motivo dell'annullamento è obbligatorio"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Annulla transazione",
|
||||
"message": "Transazione annullata con successo. Email di conferma inviate.",
|
||||
"passBackDevice": "Ora puoi restituire il dispositivo a {{senderName}}.",
|
||||
"continueButton": "Continua"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Audit di transazione",
|
||||
"meta.transaction_id": "ID transazione",
|
||||
"meta.transaction_status": "Stato transazione",
|
||||
"meta.files": "File",
|
||||
"audit.title": "Traccia di audit completa",
|
||||
"audit.description": "Aggiorna l'oggetto e il messaggio qui sotto per un messaggio personalizzato.",
|
||||
"table.header.actions": "Azioni",
|
||||
"table.header.language": "Lingua",
|
||||
"table.header.ip_address": "Indirizzo IP",
|
||||
"table.header.date": "Data",
|
||||
"status.completed": "Completato",
|
||||
"status.pending": "In sospeso",
|
||||
"status.failed": "Fallito",
|
||||
"action.created": "Creato",
|
||||
"action.updated": "Aggiornato",
|
||||
"action.deleted": "Eliminato",
|
||||
"action.viewed": "Visualizzato",
|
||||
"action.signed": "Firmato",
|
||||
"action.uploaded": "Caricato",
|
||||
"action.downloaded": "Scaricato",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Audit di transazione",
|
||||
"meta": {
|
||||
"transactionId": "ID transazione",
|
||||
"transactionStatus": "Stato transazione",
|
||||
"files": "File"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Traccia di audit completa",
|
||||
"description": "Aggiorna l'oggetto e il messaggio qui sotto per un messaggio personalizzato."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Azioni",
|
||||
"language": "Lingua",
|
||||
"ipAddress": "Indirizzo IP",
|
||||
"date": "Data"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Completato",
|
||||
"pending": "In sospeso",
|
||||
"failed": "Fallito"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Transazione creata da {{userName}} <{{userEmail}}>",
|
||||
"sent": "Transazione inviata da {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Transazione annullata da {{userName}} <{{userEmail}}>",
|
||||
"edited": "Transazione modificata da {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Transazione visualizzata da {{userName}} <{{userEmail}}>",
|
||||
"signed": "Transazione firmata da {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Firma della transazione rifiutata da {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Divulgazione di registro elettronico e firma accettata da {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> ha aggiornato la lingua a {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "Email di invito inviata a {{userName}} <{{userEmail}}>",
|
||||
"view": "Invito a visualizzare il documento inviato a {{userName}} <{{userEmail}}>",
|
||||
"resent": "Email di invito reinviata a {{recipientName}} <{{recipientEmail}}> da {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Firmatario riassegnato da {{fromName}} <{{fromEmail}}> a {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> è stato riassegnato da {{fromName}} <{{fromEmail}}> a {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "Transazione di persona avviata da {{userName}} <{{userEmail}}>",
|
||||
"verification": "Verifica firma di persona accettata da {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Processo del facilitatore accettato da {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Firma",
|
||||
"initial": "Iniziale",
|
||||
"edit": "Modifica",
|
||||
"styleSelection": "Selezione Stile"
|
||||
},
|
||||
"subtitle": "Crea le tue firme digitali",
|
||||
"tabs": {
|
||||
"select": "Seleziona",
|
||||
"draw": "Disegna",
|
||||
"upload": "Carica"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Conferma il tuo nome e scegli uno stile di firma.",
|
||||
"requiredFields": "Campi obbligatori.",
|
||||
"fullName": {
|
||||
"label": "Nome Completo",
|
||||
"required": "*",
|
||||
"placeholder": "Inserisci il nome completo"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Iniziali",
|
||||
"required": "*",
|
||||
"placeholder": "Inserisci le iniziali"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Disegna la tua firma.",
|
||||
"required": "*",
|
||||
"requiredFields": "Sono campi obbligatori.",
|
||||
"signature": "Firma",
|
||||
"initials": "Iniziali",
|
||||
"clearSignature": "Cancella firma",
|
||||
"fullNameBox": {
|
||||
"label": "Firma completa",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Iniziali",
|
||||
"required": "*",
|
||||
"placeholder": "Inserisci le iniziali"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Sia la firma che le iniziali sono obbligatorie.",
|
||||
"requirements": "Utilizza immagini di 300×100px per le firme e 100×100px per le iniziali. Max 300KB. Supportati: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Carica Firma",
|
||||
"uploadHint": "JPG, PNG (300×100px, max 300KB)",
|
||||
"browseButton": "Sfoglia",
|
||||
"uploadedLabel": "Firma ✓",
|
||||
"changeButton": "Cambia Firma",
|
||||
"altText": "Immagine firma caricata"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Carica Iniziali",
|
||||
"uploadHint": "JPG, PNG (100×100px, max 300KB)",
|
||||
"browseButton": "Sfoglia",
|
||||
"uploadedLabel": "Iniziali ✓",
|
||||
"changeButton": "Cambia Iniziali",
|
||||
"altText": "Immagine iniziali caricata"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Comprendo che sto firmando questo documento.",
|
||||
"cancelButton": "Annulla",
|
||||
"adoptButton": "Adotta Firma e Firma"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Questo campo è obbligatorio",
|
||||
"fileTooLarge": "La dimensione del file deve essere inferiore a 300KB",
|
||||
"invalidFileType": "Sono supportati solo file .png, .jpg e .jpeg",
|
||||
"signatureRequired": "Si prega di aggiungere una firma",
|
||||
"initialsRequired": "Si prega di aggiungere le iniziali"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Aggiungi Timbro",
|
||||
"edit": "Modifica Timbro"
|
||||
},
|
||||
"closeButton": "Chiudi modale",
|
||||
"fileRequirements": "Dimensione massima = 400Kb | Tipi di file supportati = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Trascina e rilascia un'immagine, o clicca per caricare",
|
||||
"previewAltText": "Anteprima Timbro",
|
||||
"changeImageButton": "Cambia immagine",
|
||||
"clearButton": "Chiudi",
|
||||
"saveButton": "Salva",
|
||||
"updateButton": "Aggiorna",
|
||||
"errors": {
|
||||
"fileTooLarge": "La dimensione del file supera il limite di 400KB",
|
||||
"invalidFileType": "Sono supportati solo file .png, .jpg e .jpeg",
|
||||
"uploadFailed": "Caricamento dell'immagine fallito. Si prega di riprovare."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Allegato",
|
||||
"subtitle": {
|
||||
"hasFile": "Gestisci il tuo allegato",
|
||||
"noFile": "Carica allegato"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Caricamento file...",
|
||||
"shimmerText": "Caricamento file..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Rilascia il file qui",
|
||||
"default": "Carica o trascina e rilascia il file",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (max 10MB)",
|
||||
"browseButton": "Sfoglia File"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Caricato con successo",
|
||||
"deleteButton": "Elimina file"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Chiudi",
|
||||
"uploading": "Caricamento...",
|
||||
"deleting": "Eliminazione...",
|
||||
"saved": "File Salvato!",
|
||||
"done": "Fatto",
|
||||
"uploadFile": "Carica File"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "La dimensione del file supera il limite di 10MB",
|
||||
"invalidFileType": "Sono supportati solo file PDF, DOCX, JPG, PNG e TXT",
|
||||
"uploadFailed": "Caricamento del file fallito. Si prega di riprovare.",
|
||||
"deleteFailed": "Eliminazione del file fallita. Si prega di riprovare.",
|
||||
"noFileSelected": "Si prega di selezionare un file prima di procedere"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Caricamento file",
|
||||
"deleteFile": "Elimina file"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Cinese (Semplificato)",
|
||||
"zh_TW": "Cinese (Tradizionale)",
|
||||
"da": "Danese",
|
||||
"nl_NL": "Olandese",
|
||||
"en": "Inglese",
|
||||
"fi": "Finlandese",
|
||||
"fr": "Francese",
|
||||
"de": "Tedesco",
|
||||
"it": "Italiano",
|
||||
"ja": "Giapponese",
|
||||
"ko": "Coreano",
|
||||
"no": "Norvegese",
|
||||
"pt_BR": "Portoghese (Brasile)",
|
||||
"ru": "Russo",
|
||||
"es": "Spagnolo",
|
||||
"es_MX": "Spagnolo (Messico)",
|
||||
"sv": "Svedese",
|
||||
"th": "Tailandese",
|
||||
"he": "Ebraico"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Sessione scaduta",
|
||||
"description": "Questo link per la firma del documento è scaduto a causa di inattività o timeout della sessione. Torna alla tua email e fai di nuovo clic sul link per continuare a firmare."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 Firma completata!",
|
||||
"subtitle": "Il documento è stato firmato con successo",
|
||||
"thankYou": "Grazie per aver firmato!",
|
||||
"message": "Riceverai un'email di conferma una volta che il documento sarà stato firmato da tutte le parti.",
|
||||
"passDevice": "Ora puoi restituire il dispositivo a <strong>{{senderName}}</strong>",
|
||||
"continueButton": "Continua"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "<0>同意する</0>をクリックすると、<1>電子記録および署名の開示</1>を確認し、この文書の確認および実行における電子記録および署名の使用に同意することを確認します。",
|
||||
"note": "注:",
|
||||
"noteText": "これに同意しても、すぐに文書に署名するわけではありません。電子的に確認できるようになるだけです。署名する前に文書全体を確認する機会があります。"
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "同意する",
|
||||
"processing": "処理中...",
|
||||
"close": "閉じる",
|
||||
"downloadPdf": "PDFをダウンロード",
|
||||
"downloading": "ダウンロード中..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "AIサマリー",
|
||||
"completeSign": "署名完了",
|
||||
"sign": "署名",
|
||||
"processing": "処理中...",
|
||||
"options": "ダウンロード"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "PDFをダウンロード",
|
||||
"auditTrail": "監査証跡",
|
||||
"reassignSigner": "署名者の再割り当て",
|
||||
"cancelTransaction": "トランザクションをキャンセル",
|
||||
"viewTerms": "利用規約を表示",
|
||||
"helpSupport": "ヘルプとサポート",
|
||||
"about": "SMEについて"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "ドキュメント",
|
||||
"pages": "ページ:{{count}}",
|
||||
"noDocuments": "利用可能なドキュメントはありません。"
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "完了する準備はできましたか?",
|
||||
"readyDesc": "必須フィールドに入力しました。作業内容を確認し、「完了」を選択してください。",
|
||||
"finish": "完了",
|
||||
"submitting": "送信中...",
|
||||
"start": "開始",
|
||||
"next": "次へ",
|
||||
"agreementText": "署名することにより、Sign Made Easyの<0>利用規約</0>に同意します。"
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "すべて完了!",
|
||||
"title": "ご署名ありがとうございます",
|
||||
"message": "文書は完了し、安全に保管されました。コピーをメールで送信しました。"
|
||||
},
|
||||
"declined": {
|
||||
"hit": "アクションがキャンセルされました!",
|
||||
"title": "また次回!",
|
||||
"message": "リクエストは拒否されました。"
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "アクションがキャンセルされました!",
|
||||
"title": "また次回!",
|
||||
"message": "リクエストはキャンセルされました。"
|
||||
},
|
||||
"download": "ダウンロード",
|
||||
"downloading": "ダウンロード中...",
|
||||
"downloadSuccess": "ファイルのダウンロードに成功しました。",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDFドキュメント",
|
||||
"audit": "監査証跡",
|
||||
"selectFormat": "形式を選択"
|
||||
},
|
||||
"downloadError": "ファイルのダウンロードに失敗しました。再試行してください。",
|
||||
"appsTitle": "アプリで効率アップ",
|
||||
"formsTitle": "フォームを簡単に生成",
|
||||
"docsTitle": "ドキュメントを生成(請求書、レポート、見積書)",
|
||||
"tryNow": "今すぐ試す",
|
||||
"footerText": "Copyright 2026 Sign Made Easy. All Rights Reserved.<0>プライバシーポリシー</0> | <1>合理的利用ポリシー</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "署名者の再割り当て",
|
||||
"successSubtitle": "ドキュメントは正常に再割り当てされました",
|
||||
"successTitle": "ありがとうございます!",
|
||||
"successMessage": "ドキュメントは新しい署名者に正常に再割り当てされました。",
|
||||
"fields": {
|
||||
"firstName": "名",
|
||||
"lastName": "姓",
|
||||
"email": "メール",
|
||||
"language": "言語",
|
||||
"message": "オプションメッセージ"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "名を入力してください",
|
||||
"lastName": "姓を入力してください",
|
||||
"email": "your.email@example.com",
|
||||
"message": "ここにメッセージを書いてください..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "送信",
|
||||
"submitting": "送信中...",
|
||||
"cancel": "キャンセル"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "名は必須です",
|
||||
"firstNameMin": "名は2文字以上である必要があります",
|
||||
"lastNameRequired": "姓は必須です",
|
||||
"lastNameMin": "姓は2文字以上である必要があります",
|
||||
"emailRequired": "メールは必須です",
|
||||
"emailInvalid": "無効なメールアドレスです"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "トランザクションをキャンセル",
|
||||
"description": "このトランザクションをキャンセルしてもよろしいですか?以下にキャンセル理由を記入してください。",
|
||||
"placeholder": "キャンセル理由を記入してください...",
|
||||
"buttons": {
|
||||
"no": "いいえ、キャンセルしない",
|
||||
"yes": "はい、キャンセルする"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "キャンセル理由は必須です"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "取引をキャンセル",
|
||||
"message": "取引は正常にキャンセルされました。確認メールが送信されました。",
|
||||
"passBackDevice": "デバイスを{{senderName}}に戻すことができます。",
|
||||
"continueButton": "続行"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "トランザクション監査",
|
||||
"meta.transaction_id": "トランザクションID",
|
||||
"meta.transaction_status": "トランザクションステータス",
|
||||
"meta.files": "ファイル",
|
||||
"audit.title": "完全な監査証跡",
|
||||
"audit.description": "カスタムメッセージについては、以下の件名とメッセージを更新してください。",
|
||||
"table.header.actions": "アクション",
|
||||
"table.header.language": "言語",
|
||||
"table.header.ip_address": "IPアドレス",
|
||||
"table.header.date": "日付",
|
||||
"status.completed": "完了",
|
||||
"status.pending": "保留中",
|
||||
"status.failed": "失敗",
|
||||
"action.created": "作成済み",
|
||||
"action.updated": "更新済み",
|
||||
"action.deleted": "削除済み",
|
||||
"action.viewed": "表示済み",
|
||||
"action.signed": "署名済み",
|
||||
"action.uploaded": "アップロード済み",
|
||||
"action.downloaded": "ダウンロード済み",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "トランザクション監査",
|
||||
"meta": {
|
||||
"transactionId": "トランザクションID",
|
||||
"transactionStatus": "トランザクションステータス",
|
||||
"files": "ファイル"
|
||||
},
|
||||
"audit": {
|
||||
"title": "完全な監査証跡",
|
||||
"description": "カスタムメッセージについては、以下の件名とメッセージを更新してください。"
|
||||
},
|
||||
"table": {
|
||||
"actions": "アクション",
|
||||
"language": "言語",
|
||||
"ipAddress": "IPアドレス",
|
||||
"date": "日付"
|
||||
},
|
||||
"status": {
|
||||
"completed": "完了",
|
||||
"pending": "保留中",
|
||||
"failed": "失敗"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "トランザクションが {{userName}} <{{userEmail}}> によって作成されました",
|
||||
"sent": "トランザクションが {{userName}} <{{userEmail}}> によって送信されました",
|
||||
"cancelled": "トランザクションが {{userName}} <{{userEmail}}> によってキャンセルされました",
|
||||
"edited": "トランザクションが {{userName}} <{{userEmail}}> によって編集されました",
|
||||
"viewed": "トランザクションが {{userName}} <{{userEmail}}> によって閲覧されました",
|
||||
"signed": "トランザクションが {{userName}} <{{userEmail}}> によって署名されました"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "トランザクションの署名が {{userName}} <{{userEmail}}> によって拒否されました"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "電子記録および署名開示が {{userName}} <{{userEmail}}> によって受け入れられました"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> が言語を {{language}} に更新しました"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "招待メールが {{userName}} <{{userEmail}}> に送信されました",
|
||||
"view": "ドキュメントを表示するための招待が {{userName}} <{{userEmail}}> に送信されました",
|
||||
"resent": "招待メールが {{senderName}} <{{senderEmail}}> によって {{recipientName}} <{{recipientEmail}}> に再送信されました"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "署名者が {{fromName}} <{{fromEmail}}> から {{toName}} <{{toEmail}}> に再割り当てされました",
|
||||
"complex": "{{personName}} <{{personEmail}}> が {{fromName}} <{{fromEmail}}> から {{toName}} <{{toEmail}}> に再割り当てされました"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "対面トランザクションが {{userName}} <{{userEmail}}> によって開始されました",
|
||||
"verification": "対面署名検証が {{userName}} <{{userEmail}}> によって受け入れられました"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "ファシリテータープロセスが {{userName}} <{{userEmail}}> によって受け入れられました"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "署名",
|
||||
"initial": "イニシャル",
|
||||
"edit": "編集",
|
||||
"styleSelection": "スタイル選択"
|
||||
},
|
||||
"subtitle": "デジタル署名を作成",
|
||||
"tabs": {
|
||||
"select": "選択",
|
||||
"draw": "描画",
|
||||
"upload": "アップロード"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "名前を確認し、署名スタイルを選択してください。",
|
||||
"requiredFields": "必須項目。",
|
||||
"fullName": {
|
||||
"label": "フルネーム",
|
||||
"required": "*",
|
||||
"placeholder": "フルネームを入力"
|
||||
},
|
||||
"initials": {
|
||||
"label": "イニシャル",
|
||||
"required": "*",
|
||||
"placeholder": "イニシャルを入力"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "署名を描いてください。",
|
||||
"required": "*",
|
||||
"requiredFields": "必須フィールドです。",
|
||||
"signature": "署名",
|
||||
"initials": "イニシャル",
|
||||
"clearSignature": "署名をクリア",
|
||||
"fullNameBox": {
|
||||
"label": "完全な署名",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "イニシャル",
|
||||
"required": "*",
|
||||
"placeholder": "イニシャルを入力"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "署名とイニシャルの両方が必要です。",
|
||||
"requirements": "署名には300×100px、イニシャルには100×100pxの画像を使用してください。最大300KB。対応形式:.png、.jpg。",
|
||||
"signature": {
|
||||
"uploadLabel": "署名をアップロード",
|
||||
"uploadHint": "JPG、PNG(300×100px、最大300KB)",
|
||||
"browseButton": "参照",
|
||||
"uploadedLabel": "署名 ✓",
|
||||
"changeButton": "署名を変更",
|
||||
"altText": "アップロードされた署名画像"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "イニシャルをアップロード",
|
||||
"uploadHint": "JPG、PNG(100×100px、最大300KB)",
|
||||
"browseButton": "参照",
|
||||
"uploadedLabel": "イニシャル ✓",
|
||||
"changeButton": "イニシャルを変更",
|
||||
"altText": "アップロードされたイニシャル画像"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "この文書に署名することを理解しています。",
|
||||
"cancelButton": "キャンセル",
|
||||
"adoptButton": "署名を採用して署名"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "この項目は必須です",
|
||||
"fileTooLarge": "ファイルサイズは300KB未満である必要があります",
|
||||
"invalidFileType": ".png、.jpg、.jpegファイルのみ対応しています",
|
||||
"signatureRequired": "署名を追加してください",
|
||||
"initialsRequired": "イニシャルを追加してください"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "スタンプを追加",
|
||||
"edit": "スタンプを編集"
|
||||
},
|
||||
"closeButton": "モーダルを閉じる",
|
||||
"fileRequirements": "最大サイズ = 400Kb | 対応ファイル形式 = .png、.jpg、.jpeg",
|
||||
"dragDropLabel": "画像をドラッグ&ドロップするか、クリックしてアップロード",
|
||||
"previewAltText": "スタンププレビュー",
|
||||
"changeImageButton": "画像を変更",
|
||||
"clearButton": "閉じる",
|
||||
"saveButton": "保存",
|
||||
"updateButton": "更新",
|
||||
"errors": {
|
||||
"fileTooLarge": "ファイルサイズが400KBの制限を超えています",
|
||||
"invalidFileType": ".png、.jpg、.jpegファイルのみ対応しています",
|
||||
"uploadFailed": "画像のアップロードに失敗しました。もう一度お試しください。"
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "添付ファイル",
|
||||
"subtitle": {
|
||||
"hasFile": "添付ファイルを管理",
|
||||
"noFile": "添付ファイルをアップロード"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "ファイルをアップロード中...",
|
||||
"shimmerText": "ファイルをアップロード中..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "ファイルをここにドロップ",
|
||||
"default": "ファイルをアップロードまたはドラッグ&ドロップ",
|
||||
"fileTypes": "PDF、DOCX、JPG、PNG、TXT(最大10MB)",
|
||||
"browseButton": "ファイルを参照"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "アップロード成功",
|
||||
"deleteButton": "ファイルを削除"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "閉じる",
|
||||
"uploading": "アップロード中...",
|
||||
"deleting": "削除中...",
|
||||
"saved": "ファイル保存完了!",
|
||||
"done": "完了",
|
||||
"uploadFile": "ファイルをアップロード"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "ファイルサイズが10MBの制限を超えています",
|
||||
"invalidFileType": "PDF、DOCX、JPG、PNG、TXTファイルのみ対応しています",
|
||||
"uploadFailed": "ファイルのアップロードに失敗しました。もう一度お試しください。",
|
||||
"deleteFailed": "ファイルの削除に失敗しました。もう一度お試しください。",
|
||||
"noFileSelected": "続行する前にファイルを選択してください"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "ファイルアップロード",
|
||||
"deleteFile": "ファイルを削除"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "中国語(簡体字)",
|
||||
"zh_TW": "中国語(繁体字)",
|
||||
"da": "デンマーク語",
|
||||
"nl_NL": "オランダ語",
|
||||
"en": "英語",
|
||||
"fi": "フィンランド語",
|
||||
"fr": "フランス語",
|
||||
"de": "ドイツ語",
|
||||
"it": "イタリア語",
|
||||
"ja": "日本語",
|
||||
"ko": "韓国語",
|
||||
"no": "ノルウェー語",
|
||||
"pt_BR": "ポルトガル語(ブラジル)",
|
||||
"ru": "ロシア語",
|
||||
"es": "スペイン語",
|
||||
"es_MX": "スペイン語(メキシコ)",
|
||||
"sv": "スウェーデン語",
|
||||
"th": "タイ語",
|
||||
"he": "ヘブライ語"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "セッションの有効期限が切れました",
|
||||
"description": "この文書署名リンクは、操作がないかセッションタイムアウトにより期限切れになりました。メールに戻り、リンクをもう一度クリックして署名を続けてください。"
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 署名が完了しました!",
|
||||
"subtitle": "文書は正常に署名されました",
|
||||
"thankYou": "ご署名ありがとうございます!",
|
||||
"message": "すべての関係者が文書に署名すると、確認メールが届きます。",
|
||||
"passDevice": "デバイスを <strong>{{senderName}}</strong> に戻すことができます",
|
||||
"continueButton": "続行"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "<0>동의함</0>을 클릭하면 <1>전자 기록 및 서명 공개</1>를 검토했음을 확인하고 이 문서 검토 및 실행에 전자 기록 및 서명 사용에 동의합니다.",
|
||||
"note": "참고:",
|
||||
"noteText": "이에 동의한다고 해서 즉시 문서에 서명하는 것은 아닙니다. 전자적으로 검토할 수만 있습니다. 서명하기 전에 문서 전체를 검토할 기회가 있습니다."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "동의함",
|
||||
"processing": "처리 중...",
|
||||
"close": "닫기",
|
||||
"downloadPdf": "PDF 다운로드",
|
||||
"downloading": "다운로드 중..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "AI 요약",
|
||||
"completeSign": "서명 완료",
|
||||
"sign": "서명",
|
||||
"processing": "처리 중...",
|
||||
"options": "다운로드"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "PDF 다운로드",
|
||||
"auditTrail": "감사 추적",
|
||||
"reassignSigner": "서명자 재할당",
|
||||
"cancelTransaction": "거래 취소",
|
||||
"viewTerms": "이용약관 보기",
|
||||
"helpSupport": "도움말 및 지원",
|
||||
"about": "SME 정보"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "문서",
|
||||
"pages": "페이지: {{count}}",
|
||||
"noDocuments": "사용 가능한 문서가 없습니다."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "완료할 준비가 되셨나요?",
|
||||
"readyDesc": "필수 필드를 작성했습니다. 작업을 검토한 후 완료를 선택하세요.",
|
||||
"finish": "완료",
|
||||
"submitting": "제출 중...",
|
||||
"start": "시작",
|
||||
"next": "다음",
|
||||
"agreementText": "서명함으로써 Sign Made Easy의 <0>이용약관</0>에 동의합니다."
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "모두 완료!",
|
||||
"title": "서명해 주셔서 감사합니다",
|
||||
"message": "문서가 완료되어 안전하게 저장되었습니다. 사본을 이메일로 보내드렸습니다."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "작업이 취소되었습니다!",
|
||||
"title": "다음에 다시 만나요!",
|
||||
"message": "요청이 거부되었습니다."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "작업이 취소되었습니다!",
|
||||
"title": "다음에 다시 만나요!",
|
||||
"message": "요청이 취소되었습니다."
|
||||
},
|
||||
"download": "다운로드",
|
||||
"downloading": "다운로드 중...",
|
||||
"downloadSuccess": "파일이 성공적으로 다운로드되었습니다.",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDF 문서",
|
||||
"audit": "감사 추적",
|
||||
"selectFormat": "형식 선택"
|
||||
},
|
||||
"downloadError": "파일 다운로드에 실패했습니다. 다시 시도하세요.",
|
||||
"appsTitle": "앱으로 효율성 향상",
|
||||
"formsTitle": "양식을 쉽게 생성",
|
||||
"docsTitle": "문서 생성(송장, 보고서, 견적서)",
|
||||
"tryNow": "지금 사용해보기",
|
||||
"footerText": "Copyright 2026 Sign Made Easy. All Rights Reserved.<0>개인정보처리방침</0> | <1>합리적 이용 정책</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "서명자 재할당",
|
||||
"successSubtitle": "문서가 성공적으로 재할당되었습니다",
|
||||
"successTitle": "감사합니다!",
|
||||
"successMessage": "문서가 새 서명자에게 성공적으로 재할당되었습니다.",
|
||||
"fields": {
|
||||
"firstName": "이름",
|
||||
"lastName": "성",
|
||||
"email": "이메일",
|
||||
"language": "언어",
|
||||
"message": "선택 메시지"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "이름을 입력하세요",
|
||||
"lastName": "성을 입력하세요",
|
||||
"email": "your.email@example.com",
|
||||
"message": "여기에 메시지를 작성하세요..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "제출",
|
||||
"submitting": "제출 중...",
|
||||
"cancel": "취소"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "이름은 필수입니다",
|
||||
"firstNameMin": "이름은 최소 2자 이상이어야 합니다",
|
||||
"lastNameRequired": "성은 필수입니다",
|
||||
"lastNameMin": "성은 최소 2자 이상이어야 합니다",
|
||||
"emailRequired": "이메일은 필수입니다",
|
||||
"emailInvalid": "유효하지 않은 이메일 주소입니다"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "거래 취소",
|
||||
"description": "이 거래를 취소하시겠습니까? 아래에 취소 사유를 제공하세요.",
|
||||
"placeholder": "취소 사유를 제공하세요...",
|
||||
"buttons": {
|
||||
"no": "아니요, 취소하지 않음",
|
||||
"yes": "예, 취소함"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "취소 사유는 필수입니다"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "거래 취소",
|
||||
"message": "거래가 성공적으로 취소되었습니다. 확인 이메일이 발송되었습니다.",
|
||||
"passBackDevice": "이제 {{senderName}}에게 기기를 돌려줄 수 있습니다.",
|
||||
"continueButton": "계속"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "거래 감사",
|
||||
"meta.transaction_id": "거래 ID",
|
||||
"meta.transaction_status": "거래 상태",
|
||||
"meta.files": "파일",
|
||||
"audit.title": "전체 감사 추적",
|
||||
"audit.description": "사용자 정의 메시지를 위해 아래 제목과 메시지를 업데이트하세요.",
|
||||
"table.header.actions": "작업",
|
||||
"table.header.language": "언어",
|
||||
"table.header.ip_address": "IP 주소",
|
||||
"table.header.date": "날짜",
|
||||
"status.completed": "완료됨",
|
||||
"status.pending": "보류 중",
|
||||
"status.failed": "실패함",
|
||||
"action.created": "생성됨",
|
||||
"action.updated": "업데이트됨",
|
||||
"action.deleted": "삭제됨",
|
||||
"action.viewed": "조회됨",
|
||||
"action.signed": "서명됨",
|
||||
"action.uploaded": "업로드됨",
|
||||
"action.downloaded": "다운로드됨",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "거래 감사",
|
||||
"meta": {
|
||||
"transactionId": "거래 ID",
|
||||
"transactionStatus": "거래 상태",
|
||||
"files": "파일"
|
||||
},
|
||||
"audit": {
|
||||
"title": "전체 감사 추적",
|
||||
"description": "사용자 정의 메시지를 위해 아래 제목과 메시지를 업데이트하세요."
|
||||
},
|
||||
"table": {
|
||||
"actions": "작업",
|
||||
"language": "언어",
|
||||
"ipAddress": "IP 주소",
|
||||
"date": "날짜"
|
||||
},
|
||||
"status": {
|
||||
"completed": "완료됨",
|
||||
"pending": "보류 중",
|
||||
"failed": "실패함"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "트랜잭션이 {{userName}} <{{userEmail}}>에 의해 생성되었습니다",
|
||||
"sent": "트랜잭션이 {{userName}} <{{userEmail}}>에 의해 전송되었습니다",
|
||||
"cancelled": "트랜잭션이 {{userName}} <{{userEmail}}>에 의해 취소되었습니다",
|
||||
"edited": "트랜잭션이 {{userName}} <{{userEmail}}>에 의해 편집되었습니다",
|
||||
"viewed": "트랜잭션이 {{userName}} <{{userEmail}}>에 의해 조회되었습니다",
|
||||
"signed": "트랜잭션이 {{userName}} <{{userEmail}}>에 의해 서명되었습니다"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "트랜잭션 서명이 {{userName}} <{{userEmail}}>에 의해 거부되었습니다"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "전자 기록 및 서명 공개가 {{userName}} <{{userEmail}}>에 의해 수락되었습니다"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}>님이 언어를 {{language}}(으)로 업데이트했습니다"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "초대 이메일이 {{userName}} <{{userEmail}}>에게 전송되었습니다",
|
||||
"view": "문서 보기 초대장이 {{userName}} <{{userEmail}}>(으)로 발송되었습니다",
|
||||
"resent": "초대 이메일이 {{senderName}} <{{senderEmail}}>에 의해 {{recipientName}} <{{recipientEmail}}>에게 재전송되었습니다"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "서명자가 {{fromName}} <{{fromEmail}}>에서 {{toName}} <{{toEmail}}>(으)로 재할당되었습니다",
|
||||
"complex": "{{personName}} <{{personEmail}}>이(가) {{fromName}} <{{fromEmail}}>에서 {{toName}} <{{toEmail}}>(으)로 재할당되었습니다"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "대면 트랜잭션이 {{userName}} <{{userEmail}}>에 의해 시작되었습니다",
|
||||
"verification": "대면 서명 확인이 {{userName}} <{{userEmail}}>에 의해 수락되었습니다"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "조정자 프로세스가 {{userName}} <{{userEmail}}>에 의해 수락되었습니다"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "서명",
|
||||
"initial": "이니셜",
|
||||
"edit": "편집",
|
||||
"styleSelection": "스타일 선택"
|
||||
},
|
||||
"subtitle": "디지털 서명 만들기",
|
||||
"tabs": {
|
||||
"select": "선택",
|
||||
"draw": "그리기",
|
||||
"upload": "업로드"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "이름을 확인하고 서명 스타일을 선택하세요.",
|
||||
"requiredFields": "필수 항목.",
|
||||
"fullName": {
|
||||
"label": "전체 이름",
|
||||
"required": "*",
|
||||
"placeholder": "전체 이름 입력"
|
||||
},
|
||||
"initials": {
|
||||
"label": "이니셜",
|
||||
"required": "*",
|
||||
"placeholder": "이니셜 입력"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "서명을 그려주세요.",
|
||||
"required": "*",
|
||||
"requiredFields": "필수 입력 필드입니다.",
|
||||
"signature": "서명",
|
||||
"initials": "이니셜",
|
||||
"clearSignature": "서명 지우기",
|
||||
"fullNameBox": {
|
||||
"label": "전체 서명",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "이니셜",
|
||||
"required": "*",
|
||||
"placeholder": "이니셜 입력"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "서명과 이니셜이 모두 필요합니다.",
|
||||
"requirements": "서명은 300×100px, 이니셜은 100×100px 이미지를 사용하세요. 최대 300KB. 지원: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "서명 업로드",
|
||||
"uploadHint": "JPG, PNG (300×100px, 최대 300KB)",
|
||||
"browseButton": "찾아보기",
|
||||
"uploadedLabel": "서명 ✓",
|
||||
"changeButton": "서명 변경",
|
||||
"altText": "업로드된 서명 이미지"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "이니셜 업로드",
|
||||
"uploadHint": "JPG, PNG (100×100px, 최대 300KB)",
|
||||
"browseButton": "찾아보기",
|
||||
"uploadedLabel": "이니셜 ✓",
|
||||
"changeButton": "이니셜 변경",
|
||||
"altText": "업로드된 이니셜 이미지"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "이 문서에 서명하고 있음을 이해합니다.",
|
||||
"cancelButton": "취소",
|
||||
"adoptButton": "서명 채택 및 서명"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "이 필드는 필수입니다",
|
||||
"fileTooLarge": "파일 크기는 300KB 미만이어야 합니다",
|
||||
"invalidFileType": ".png, .jpg, .jpeg 파일만 지원됩니다",
|
||||
"signatureRequired": "서명을 추가해주세요",
|
||||
"initialsRequired": "이니셜을 추가해주세요"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "스탬프 추가",
|
||||
"edit": "스탬프 편집"
|
||||
},
|
||||
"closeButton": "모달 닫기",
|
||||
"fileRequirements": "최대 크기 = 400Kb | 지원 파일 형식 = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "이미지를 드래그 앤 드롭하거나 클릭하여 업로드",
|
||||
"previewAltText": "스탬프 미리보기",
|
||||
"changeImageButton": "이미지 변경",
|
||||
"clearButton": "닫기",
|
||||
"saveButton": "저장",
|
||||
"updateButton": "업데이트",
|
||||
"errors": {
|
||||
"fileTooLarge": "파일 크기가 400KB 제한을 초과했습니다",
|
||||
"invalidFileType": ".png, .jpg, .jpeg 파일만 지원됩니다",
|
||||
"uploadFailed": "이미지 업로드에 실패했습니다. 다시 시도해주세요."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "첨부파일",
|
||||
"subtitle": {
|
||||
"hasFile": "첨부파일 관리",
|
||||
"noFile": "첨부파일 업로드"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "파일 업로드 중...",
|
||||
"shimmerText": "파일 업로드 중..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "파일을 여기에 드롭하세요",
|
||||
"default": "파일 업로드 또는 드래그 앤 드롭",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (최대 10MB)",
|
||||
"browseButton": "파일 찾아보기"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "업로드 성공",
|
||||
"deleteButton": "파일 삭제"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "닫기",
|
||||
"uploading": "업로드 중...",
|
||||
"deleting": "삭제 중...",
|
||||
"saved": "파일 저장 완료!",
|
||||
"done": "완료",
|
||||
"uploadFile": "파일 업로드"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "파일 크기가 10MB 제한을 초과했습니다",
|
||||
"invalidFileType": "PDF, DOCX, JPG, PNG, TXT 파일만 지원됩니다",
|
||||
"uploadFailed": "파일 업로드에 실패했습니다. 다시 시도해주세요.",
|
||||
"deleteFailed": "파일 삭제에 실패했습니다. 다시 시도해주세요.",
|
||||
"noFileSelected": "진행하기 전에 파일을 선택해주세요"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "파일 업로드",
|
||||
"deleteFile": "파일 삭제"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "중국어(간체)",
|
||||
"zh_TW": "중국어(번체)",
|
||||
"da": "덴마크어",
|
||||
"nl_NL": "네덜란드어",
|
||||
"en": "영어",
|
||||
"fi": "핀란드어",
|
||||
"fr": "프랑스어",
|
||||
"de": "독일어",
|
||||
"it": "이탈리아어",
|
||||
"ja": "일본어",
|
||||
"ko": "한국어",
|
||||
"no": "노르웨이어",
|
||||
"pt_BR": "포르투갈어(브라질)",
|
||||
"ru": "러시아어",
|
||||
"es": "스페인어",
|
||||
"es_MX": "스페인어(멕시코)",
|
||||
"sv": "스웨덴어",
|
||||
"th": "태국어",
|
||||
"he": "히브리어"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "세션이 만료되었습니다",
|
||||
"description": "이 문서 서명 링크는 비활성 또는 세션 시간 초과로 인해 만료되었습니다. 이메일로 돌아가서 링크를 다시 클릭하여 서명을 계속하십시오."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 서명 완료!",
|
||||
"subtitle": "문서가 성공적으로 서명되었습니다",
|
||||
"thankYou": "서명해 주셔서 감사합니다!",
|
||||
"message": "모든 당사자가 문서에 서명하면 확인 이메일을 받게 됩니다.",
|
||||
"passDevice": "이제 기기를 <strong>{{senderName}}</strong>에게 다시 전달할 수 있습니다",
|
||||
"continueButton": "계속"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "Door op <0>Ik ga akkoord</0> te klikken, bevestigt u dat u de <1>Disclosure van elektronische registratie en handtekening</1> hebt bekeken en instemt met het gebruik van elektronische registraties en handtekeningen bij het bekijken en ondertekenen van dit document.",
|
||||
"note": "Opmerking:",
|
||||
"noteText": "Akkoord gaan hiermee betekent niet dat u het document onmiddellijk ondertekent. Het stelt u alleen in staat het elektronisch te bekijken. U krijgt de kans het document volledig te bekijken voordat u ondertekent."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "Ik ga akkoord",
|
||||
"processing": "Verwerken...",
|
||||
"close": "Sluiten",
|
||||
"downloadPdf": "PDF downloaden",
|
||||
"downloading": "Downloaden..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "AI-samenvatting",
|
||||
"completeSign": "Ondertekening voltooien",
|
||||
"sign": "Ondertekenen",
|
||||
"processing": "Verwerken...",
|
||||
"options": "Downloaden"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "PDF downloaden",
|
||||
"auditTrail": "Audit trail",
|
||||
"reassignSigner": "Ondertekenaar opnieuw toewijzen",
|
||||
"cancelTransaction": "Transactie annuleren",
|
||||
"viewTerms": "Algemene voorwaarden bekijken",
|
||||
"helpSupport": "Help & ondersteuning",
|
||||
"about": "Over SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Documenten",
|
||||
"pages": "Pagina's: {{count}}",
|
||||
"noDocuments": "Geen documenten beschikbaar."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "Klaar om af te ronden?",
|
||||
"readyDesc": "U hebt de vereiste velden ingevuld. Bekijk uw werk en selecteer vervolgens Voltooien.",
|
||||
"finish": "Voltooien",
|
||||
"submitting": "Verzenden...",
|
||||
"start": "Start",
|
||||
"next": "Volgende",
|
||||
"agreementText": "Door te ondertekenen ga ik akkoord met de <0>algemene voorwaarden</0> van Sign Made Easy."
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "Helemaal klaar!",
|
||||
"title": "Bedankt voor het ondertekenen",
|
||||
"message": "Uw document is nu voltooid en veilig opgeslagen. We hebben u een kopie gemaild."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "Actie geannuleerd!",
|
||||
"title": "Misschien volgende keer!",
|
||||
"message": "Uw verzoek is succesvol afgewezen."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "Actie geannuleerd!",
|
||||
"title": "Misschien volgende keer!",
|
||||
"message": "Uw verzoek is succesvol geannuleerd."
|
||||
},
|
||||
"download": "Downloaden",
|
||||
"downloading": "Downloaden...",
|
||||
"downloadSuccess": "Bestand succesvol gedownload.",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDF-document",
|
||||
"audit": "Audit trail",
|
||||
"selectFormat": "Selecteer formaat"
|
||||
},
|
||||
"downloadError": "Download mislukt. Probeer het opnieuw.",
|
||||
"appsTitle": "Verhoog de efficiëntie met onze apps",
|
||||
"formsTitle": "Genereer eenvoudig formulieren",
|
||||
"docsTitle": "Genereer documenten (facturen, rapporten, offertes)",
|
||||
"tryNow": "Probeer nu",
|
||||
"footerText": "Auteursrecht 2026 Sign Made Easy. Alle rechten voorbehouden.<0>Privacybeleid</0> | <1>Beleid voor redelijk gebruik</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Ondertekenaar opnieuw toewijzen",
|
||||
"successSubtitle": "Document is succesvol opnieuw toegewezen",
|
||||
"successTitle": "Dank u!",
|
||||
"successMessage": "Het document is succesvol opnieuw toegewezen aan de nieuwe ondertekenaar.",
|
||||
"fields": {
|
||||
"firstName": "Voornaam",
|
||||
"lastName": "Achternaam",
|
||||
"email": "E-mail",
|
||||
"language": "Taal",
|
||||
"message": "Optioneel bericht"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Voer uw voornaam in",
|
||||
"lastName": "Voer uw achternaam in",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Schrijf uw bericht hier..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Verzenden",
|
||||
"submitting": "Verzenden...",
|
||||
"cancel": "Annuleren"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "Voornaam is verplicht",
|
||||
"firstNameMin": "Voornaam moet minimaal 2 tekens bevatten",
|
||||
"lastNameRequired": "Achternaam is verplicht",
|
||||
"lastNameMin": "Achternaam moet minimaal 2 tekens bevatten",
|
||||
"emailRequired": "E-mail is verplicht",
|
||||
"emailInvalid": "Ongeldig e-mailadres"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Transactie annuleren",
|
||||
"description": "Weet u zeker dat u deze transactie wilt annuleren? Geef hieronder uw reden voor annulering op.",
|
||||
"placeholder": "Geef uw reden voor annulering...",
|
||||
"buttons": {
|
||||
"no": "Nee, niet annuleren",
|
||||
"yes": "Ja, annuleer het"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "Annuleringsreden is verplicht"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Annuleer transactie",
|
||||
"message": "De transactie is succesvol geannuleerd. Bevestigingsmails zijn verzonden.",
|
||||
"passBackDevice": "U kunt het apparaat nu teruggeven aan {{senderName}}.",
|
||||
"continueButton": "Doorgaan"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Transactie-audit",
|
||||
"meta.transaction_id": "Transactie-ID",
|
||||
"meta.transaction_status": "Transactiestatus",
|
||||
"meta.files": "Bestanden",
|
||||
"audit.title": "Volledige audit trail",
|
||||
"audit.description": "Werk het onderwerp en bericht hieronder bij voor een aangepast bericht.",
|
||||
"table.header.actions": "Acties",
|
||||
"table.header.language": "Taal",
|
||||
"table.header.ip_address": "IP-adres",
|
||||
"table.header.date": "Datum",
|
||||
"status.completed": "Voltooid",
|
||||
"status.pending": "In behandeling",
|
||||
"status.failed": "Mislukt",
|
||||
"action.created": "Aangemaakt",
|
||||
"action.updated": "Bijgewerkt",
|
||||
"action.deleted": "Verwijderd",
|
||||
"action.viewed": "Bekeken",
|
||||
"action.signed": "Ondertekend",
|
||||
"action.uploaded": "Geüpload",
|
||||
"action.downloaded": "Gedownload",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Transactie-audit",
|
||||
"meta": {
|
||||
"transactionId": "Transactie-ID",
|
||||
"transactionStatus": "Transactiestatus",
|
||||
"files": "Bestanden"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Volledige audit trail",
|
||||
"description": "Werk het onderwerp en bericht hieronder bij voor een aangepast bericht."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Acties",
|
||||
"language": "Taal",
|
||||
"ipAddress": "IP-adres",
|
||||
"date": "Datum"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Voltooid",
|
||||
"pending": "In behandeling",
|
||||
"failed": "Mislukt"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Transactie is gemaakt door {{userName}} <{{userEmail}}>",
|
||||
"sent": "Transactie is verzonden door {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Transactie is geannuleerd door {{userName}} <{{userEmail}}>",
|
||||
"edited": "Transactie is bewerkt door {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Transactie is bekeken door {{userName}} <{{userEmail}}>",
|
||||
"signed": "Transactie is ondertekend door {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Transactiehandtekening is geweigerd door {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Elektronische registratie en handtekeningopenbaarmaking is geaccepteerd door {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> heeft hun taal bijgewerkt naar {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "Uitnodigingsmail verzonden naar {{userName}} <{{userEmail}}>",
|
||||
"view": "Uitnodiging om het document te bekijken is verzonden naar {{userName}} <{{userEmail}}>",
|
||||
"resent": "Uitnodigingsmail opnieuw verzonden naar {{recipientName}} <{{recipientEmail}}> door {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Ondertekenaar is opnieuw toegewezen door {{fromName}} <{{fromEmail}}> aan {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> is opnieuw toegewezen door {{fromName}} <{{fromEmail}}> aan {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "Persoonlijke transactie is gestart door {{userName}} <{{userEmail}}>",
|
||||
"verification": "Persoonlijke handtekeningverificatie is geaccepteerd door {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Facilitatorproces is geaccepteerd door {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Handtekening",
|
||||
"initial": "Initialen",
|
||||
"edit": "Bewerken",
|
||||
"styleSelection": "Stijlselectie"
|
||||
},
|
||||
"subtitle": "Maak uw digitale handtekeningen",
|
||||
"tabs": {
|
||||
"select": "Selecteren",
|
||||
"draw": "Tekenen",
|
||||
"upload": "Uploaden"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Bevestig uw naam en kies een handtekeningstijl.",
|
||||
"requiredFields": "Verplichte velden.",
|
||||
"fullName": {
|
||||
"label": "Volledige naam",
|
||||
"required": "*",
|
||||
"placeholder": "Voer volledige naam in"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Initialen",
|
||||
"required": "*",
|
||||
"placeholder": "Voer initialen in"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Teken uw handtekening.",
|
||||
"required": "*",
|
||||
"requiredFields": "Zijn verplichte velden.",
|
||||
"signature": "Handtekening",
|
||||
"initials": "Initialen",
|
||||
"clearSignature": "Wis handtekening",
|
||||
"fullNameBox": {
|
||||
"label": "Volledige handtekening",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Initialen",
|
||||
"required": "*",
|
||||
"placeholder": "Voer initialen in"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Zowel handtekening als initialen zijn vereist.",
|
||||
"requirements": "Gebruik afbeeldingen van 300×100px voor handtekeningen en 100×100px voor initialen. Max. 300KB. Ondersteund: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Handtekening uploaden",
|
||||
"uploadHint": "JPG, PNG (300×100px, max. 300KB)",
|
||||
"browseButton": "Bladeren",
|
||||
"uploadedLabel": "Handtekening ✓",
|
||||
"changeButton": "Handtekening wijzigen",
|
||||
"altText": "Geüploade handtekeningafbeelding"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Initialen uploaden",
|
||||
"uploadHint": "JPG, PNG (100×100px, max. 300KB)",
|
||||
"browseButton": "Bladeren",
|
||||
"uploadedLabel": "Initialen ✓",
|
||||
"changeButton": "Initialen wijzigen",
|
||||
"altText": "Geüploade initialenafbeelding"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Ik begrijp dat ik dit document onderteken.",
|
||||
"cancelButton": "Annuleren",
|
||||
"adoptButton": "Handtekening overnemen en ondertekenen"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Dit veld is verplicht",
|
||||
"fileTooLarge": "Bestandsgrootte moet onder 300KB zijn",
|
||||
"invalidFileType": "Alleen .png, .jpg en .jpeg bestanden worden ondersteund",
|
||||
"signatureRequired": "Voeg een handtekening toe",
|
||||
"initialsRequired": "Voeg initialen toe"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Stempel toevoegen",
|
||||
"edit": "Stempel bewerken"
|
||||
},
|
||||
"closeButton": "Modal sluiten",
|
||||
"fileRequirements": "Maximale grootte = 400Kb | Ondersteunde bestandstypen = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Sleep een afbeelding, of klik om te uploaden",
|
||||
"previewAltText": "Stempelvoorbeeld",
|
||||
"changeImageButton": "Afbeelding wijzigen",
|
||||
"clearButton": "Sluiten",
|
||||
"saveButton": "Opslaan",
|
||||
"updateButton": "Bijwerken",
|
||||
"errors": {
|
||||
"fileTooLarge": "Bestandsgrootte overschrijdt de limiet van 400KB",
|
||||
"invalidFileType": "Alleen .png, .jpg en .jpeg bestanden worden ondersteund",
|
||||
"uploadFailed": "Afbeelding uploaden mislukt. Probeer het opnieuw."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Bijlage",
|
||||
"subtitle": {
|
||||
"hasFile": "Uw bijlage beheren",
|
||||
"noFile": "Bijlage uploaden"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Bestand uploaden...",
|
||||
"shimmerText": "Bestand uploaden..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Zet uw bestand hier neer",
|
||||
"default": "Upload of sleep een bestand",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (max. 10MB)",
|
||||
"browseButton": "Bladeren door bestanden"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Succesvol geüpload",
|
||||
"deleteButton": "Bestand verwijderen"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Sluiten",
|
||||
"uploading": "Uploaden...",
|
||||
"deleting": "Verwijderen...",
|
||||
"saved": "Bestand opgeslagen!",
|
||||
"done": "Gereed",
|
||||
"uploadFile": "Bestand uploaden"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "Bestandsgrootte overschrijdt de limiet van 10MB",
|
||||
"invalidFileType": "Alleen PDF, DOCX, JPG, PNG en TXT bestanden worden ondersteund",
|
||||
"uploadFailed": "Bestand uploaden mislukt. Probeer het opnieuw.",
|
||||
"deleteFailed": "Bestand verwijderen mislukt. Probeer het opnieuw.",
|
||||
"noFileSelected": "Selecteer een bestand voordat u doorgaat"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Bestand uploaden",
|
||||
"deleteFile": "Bestand verwijderen"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Chinees (Vereenvoudigd)",
|
||||
"zh_TW": "Chinees (Traditioneel)",
|
||||
"da": "Deens",
|
||||
"nl_NL": "Nederlands",
|
||||
"en": "Engels",
|
||||
"fi": "Fins",
|
||||
"fr": "Frans",
|
||||
"de": "Duits",
|
||||
"it": "Italiaans",
|
||||
"ja": "Japans",
|
||||
"ko": "Koreaans",
|
||||
"no": "Noors",
|
||||
"pt_BR": "Portugees (Brazilië)",
|
||||
"ru": "Russisch",
|
||||
"es": "Spaans",
|
||||
"es_MX": "Spaans (Mexico)",
|
||||
"sv": "Zweeds",
|
||||
"th": "Thais",
|
||||
"he": "Hebreeuws"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Sessie verlopen",
|
||||
"description": "Deze link voor het ondertekenen van documenten is verlopen vanwege inactiviteit of een time-out van de sessie. Ga terug naar uw e-mail en klik opnieuw op de link om verder te gaan met ondertekenen."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 Ondertekening voltooid!",
|
||||
"subtitle": "Document is succesvol ondertekend",
|
||||
"thankYou": "Bedankt voor het ondertekenen!",
|
||||
"message": "U ontvangt een bevestigingsmail zodra het document door alle partijen is ondertekend.",
|
||||
"passDevice": "U kunt het apparaat nu teruggeven aan <strong>{{senderName}}</strong>",
|
||||
"continueButton": "Doorgaan"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "Ved å klikke på <0>Jeg godtar</0> bekrefter du at du har gjennomgått <1>Opplysning om elektronisk registrering og signatur</1>, og samtykker til bruk av elektroniske registreringer og signaturer ved gjennomgang og utførelse av dette dokumentet.",
|
||||
"note": "Merk:",
|
||||
"noteText": "Å godta dette betyr ikke at du signerer dokumentet umiddelbart. Det tillater deg bare å gjennomgå det elektronisk. Du vil få muligheten til å gjennomgå dokumentet fullstendig før du signerer."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "Jeg godtar",
|
||||
"processing": "Behandler...",
|
||||
"close": "Lukk",
|
||||
"downloadPdf": "Last ned PDF",
|
||||
"downloading": "Laster ned..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "AI-sammendrag",
|
||||
"completeSign": "Fullfør signering",
|
||||
"sign": "Signer",
|
||||
"processing": "Behandler...",
|
||||
"options": "Last ned"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "Last ned PDF",
|
||||
"auditTrail": "Revisjonsspor",
|
||||
"reassignSigner": "Tilordne signatar på nytt",
|
||||
"cancelTransaction": "Avbryt transaksjon",
|
||||
"viewTerms": "Se vilkår og betingelser",
|
||||
"helpSupport": "Hjelp og støtte",
|
||||
"about": "Om SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Dokumenter",
|
||||
"pages": "Sider: {{count}}",
|
||||
"noDocuments": "Ingen tilgjengelige dokumenter."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "Klar til å fullføre?",
|
||||
"readyDesc": "Du har fylt ut de obligatoriske feltene. Gå gjennom arbeidet ditt, og velg deretter Fullfør.",
|
||||
"finish": "Fullfør",
|
||||
"submitting": "Sender inn...",
|
||||
"start": "Start",
|
||||
"next": "Neste",
|
||||
"agreementText": "Ved å signere godtar jeg Sign Made Easy's <0>vilkår og betingelser.</0>"
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "Helt ferdig!",
|
||||
"title": "Takk for at du signerte",
|
||||
"message": "Dokumentet ditt er nå fullført og sikkert lagret. Vi har sendt deg en kopi på e-post."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "Handling avbrutt!",
|
||||
"title": "Kanskje neste gang!",
|
||||
"message": "Forespørselen din er avvist."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "Handling avbrutt!",
|
||||
"title": "Kanskje neste gang!",
|
||||
"message": "Forespørselen din er avbrutt."
|
||||
},
|
||||
"download": "Last ned",
|
||||
"downloading": "Laster ned...",
|
||||
"downloadSuccess": "Fil lastet ned.",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDF-dokument",
|
||||
"audit": "Revisjonsspor",
|
||||
"selectFormat": "Velg format"
|
||||
},
|
||||
"downloadError": "Nedlasting mislyktes. Prøv igjen.",
|
||||
"appsTitle": "Øk effektiviteten med appene våre",
|
||||
"formsTitle": "Generer skjemaer enkelt",
|
||||
"docsTitle": "Generer dokumenter (fakturaer, rapporter, tilbud)",
|
||||
"tryNow": "Prøv nå",
|
||||
"footerText": "Opphavsrett 2026 Sign Made Easy. Alle rettigheter forbeholdt.<0>Personvernerklæring</0> | <1>Retningslinjer for rimelig bruk</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Tilordne signatar på nytt",
|
||||
"successSubtitle": "Dokumentet er blitt tilordnet på nytt",
|
||||
"successTitle": "Takk!",
|
||||
"successMessage": "Dokumentet er blitt tilordnet den nye signataren.",
|
||||
"fields": {
|
||||
"firstName": "Fornavn",
|
||||
"lastName": "Etternavn",
|
||||
"email": "E-post",
|
||||
"language": "Språk",
|
||||
"message": "Valgfri melding"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Skriv inn fornavnet ditt",
|
||||
"lastName": "Skriv inn etternavnet ditt",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Skriv meldingen din her..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Send inn",
|
||||
"submitting": "Sender inn...",
|
||||
"cancel": "Avbryt"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "Fornavn er påkrevd",
|
||||
"firstNameMin": "Fornavn må være minst 2 tegn",
|
||||
"lastNameRequired": "Etternavn er påkrevd",
|
||||
"lastNameMin": "Etternavn må være minst 2 tegn",
|
||||
"emailRequired": "E-post er påkrevd",
|
||||
"emailInvalid": "Ugyldig e-postadresse"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Avbryt transaksjon",
|
||||
"description": "Er du sikker på at du vil avbryte denne transaksjonen? Oppgi årsaken til avbruddet nedenfor.",
|
||||
"placeholder": "Vennligst oppgi årsaken til avbruddet...",
|
||||
"buttons": {
|
||||
"no": "Nei, ikke avbryt",
|
||||
"yes": "Ja, avbryt den"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "Årsak til avbrudd er påkrevd"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Avbryt transaksjon",
|
||||
"message": "Transaksjonen ble kansellert. Bekreftelses-e-poster ble sendt.",
|
||||
"passBackDevice": "Du kan nå gi enheten tilbake til {{senderName}}.",
|
||||
"continueButton": "Fortsett"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Transaksjonsrevisjon",
|
||||
"meta.transaction_id": "Transaksjons-ID",
|
||||
"meta.transaction_status": "Transaksjonsstatus",
|
||||
"meta.files": "Filer",
|
||||
"audit.title": "Fullt revisjonsspor",
|
||||
"audit.description": "Oppdater emne og melding nedenfor for en egendefinert melding.",
|
||||
"table.header.actions": "Handlinger",
|
||||
"table.header.language": "Språk",
|
||||
"table.header.ip_address": "IP-adresse",
|
||||
"table.header.date": "Dato",
|
||||
"status.completed": "Fullført",
|
||||
"status.pending": "Venter",
|
||||
"status.failed": "Mislyktes",
|
||||
"action.created": "Opprettet",
|
||||
"action.updated": "Oppdatert",
|
||||
"action.deleted": "Slettet",
|
||||
"action.viewed": "Vist",
|
||||
"action.signed": "Signert",
|
||||
"action.uploaded": "Lastet opp",
|
||||
"action.downloaded": "Lastet ned",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Transaksjonsrevisjon",
|
||||
"meta": {
|
||||
"transactionId": "Transaksjons-ID",
|
||||
"transactionStatus": "Transaksjonsstatus",
|
||||
"files": "Filer"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Fullt revisjonsspor",
|
||||
"description": "Oppdater emne og melding nedenfor for en egendefinert melding."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Handlinger",
|
||||
"language": "Språk",
|
||||
"ipAddress": "IP-adresse",
|
||||
"date": "Dato"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Fullført",
|
||||
"pending": "Venter",
|
||||
"failed": "Mislyktes"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Transaksjon ble opprettet av {{userName}} <{{userEmail}}>",
|
||||
"sent": "Transaksjon ble sendt av {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Transaksjon ble kansellert av {{userName}} <{{userEmail}}>",
|
||||
"edited": "Transaksjon ble redigert av {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Transaksjon ble sett av {{userName}} <{{userEmail}}>",
|
||||
"signed": "Transaksjon ble signert av {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Transaksjonssignatur ble avvist av {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Elektronisk opptak og signaturavsløring ble akseptert av {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> oppdaterte språket sitt til {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "Invitasjons-e-post sendt til {{userName}} <{{userEmail}}>",
|
||||
"view": "Invitasjon til å vise dokumentet er sendt til {{userName}} <{{userEmail}}>",
|
||||
"resent": "Invitasjons-e-post sendt på nytt til {{recipientName}} <{{recipientEmail}}> av {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Signatar ble tildelt på nytt av {{fromName}} <{{fromEmail}}> til {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> ble tildelt på nytt av {{fromName}} <{{fromEmail}}> til {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "Personlig transaksjon ble startet av {{userName}} <{{userEmail}}>",
|
||||
"verification": "Personlig signaturverifisering ble akseptert av {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Fasilitatorprosess ble akseptert av {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Signatur",
|
||||
"initial": "Initialer",
|
||||
"edit": "Rediger",
|
||||
"styleSelection": "Stilvalg"
|
||||
},
|
||||
"subtitle": "Opprett dine digitale signaturer",
|
||||
"tabs": {
|
||||
"select": "Velg",
|
||||
"draw": "Tegn",
|
||||
"upload": "Last opp"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Bekreft navnet ditt og velg en signaturstil.",
|
||||
"requiredFields": "Obligatoriske felt.",
|
||||
"fullName": {
|
||||
"label": "Fullt navn",
|
||||
"required": "*",
|
||||
"placeholder": "Skriv inn fullt navn"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Initialer",
|
||||
"required": "*",
|
||||
"placeholder": "Skriv inn initialer"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Tegn signaturen din.",
|
||||
"required": "*",
|
||||
"requiredFields": "Er obligatoriske felt.",
|
||||
"signature": "Signatur",
|
||||
"initials": "Initialer",
|
||||
"clearSignature": "Tøm signatur",
|
||||
"fullNameBox": {
|
||||
"label": "Full signatur",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Initialer",
|
||||
"required": "*",
|
||||
"placeholder": "Skriv inn initialer"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Både signatur og initialer er påkrevd.",
|
||||
"requirements": "Bruk bilder på 300×100px for signaturer og 100×100px for initialer. Maks 300KB. Støttet: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Last opp signatur",
|
||||
"uploadHint": "JPG, PNG (300×100px, maks 300KB)",
|
||||
"browseButton": "Bla gjennom",
|
||||
"uploadedLabel": "Signatur ✓",
|
||||
"changeButton": "Endre signatur",
|
||||
"altText": "Opplastet signaturbilde"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Last opp initialer",
|
||||
"uploadHint": "JPG, PNG (100×100px, maks 300KB)",
|
||||
"browseButton": "Bla gjennom",
|
||||
"uploadedLabel": "Initialer ✓",
|
||||
"changeButton": "Endre initialer",
|
||||
"altText": "Opplastet initialbilde"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Jeg forstår at jeg signerer dette dokumentet.",
|
||||
"cancelButton": "Avbryt",
|
||||
"adoptButton": "Adopter signatur og signer"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Dette feltet er påkrevd",
|
||||
"fileTooLarge": "Filstørrelsen må være under 300KB",
|
||||
"invalidFileType": "Kun .png, .jpg og .jpeg filer støttes",
|
||||
"signatureRequired": "Vennligst legg til en signatur",
|
||||
"initialsRequired": "Vennligst legg til initialer"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Legg til stempel",
|
||||
"edit": "Rediger stempel"
|
||||
},
|
||||
"closeButton": "Lukk modal",
|
||||
"fileRequirements": "Maksimal størrelse = 400Kb | Støttede filtyper = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Dra og slipp et bilde, eller klikk for å laste opp",
|
||||
"previewAltText": "Stempelforvisning",
|
||||
"changeImageButton": "Endre bilde",
|
||||
"clearButton": "Lukk",
|
||||
"saveButton": "Lagre",
|
||||
"updateButton": "Oppdater",
|
||||
"errors": {
|
||||
"fileTooLarge": "Filstørrelsen overstiger grensen på 400KB",
|
||||
"invalidFileType": "Kun .png, .jpg og .jpeg filer støttes",
|
||||
"uploadFailed": "Kunne ikke laste opp bildet. Prøv igjen."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Vedlegg",
|
||||
"subtitle": {
|
||||
"hasFile": "Administrer vedlegget ditt",
|
||||
"noFile": "Last opp vedlegg"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Laster opp fil...",
|
||||
"shimmerText": "Laster opp fil..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Slipp filen her",
|
||||
"default": "Last opp eller dra og slipp fil",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (maks 10MB)",
|
||||
"browseButton": "Bla gjennom filer"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Opplastet vellykket",
|
||||
"deleteButton": "Slett fil"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Lukk",
|
||||
"uploading": "Laster opp...",
|
||||
"deleting": "Sletter...",
|
||||
"saved": "Fil lagret!",
|
||||
"done": "Ferdig",
|
||||
"uploadFile": "Last opp fil"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "Filstørrelsen overstiger grensen på 10MB",
|
||||
"invalidFileType": "Kun PDF, DOCX, JPG, PNG og TXT filer støttes",
|
||||
"uploadFailed": "Kunne ikke laste opp filen. Prøv igjen.",
|
||||
"deleteFailed": "Kunne ikke slette filen. Prøv igjen.",
|
||||
"noFileSelected": "Vennligst velg en fil før du fortsetter"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Filopplasting",
|
||||
"deleteFile": "Slett fil"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Kinesisk (Forenklet)",
|
||||
"zh_TW": "Kinesisk (Tradisjonell)",
|
||||
"da": "Dansk",
|
||||
"nl_NL": "Nederlandsk",
|
||||
"en": "Engelsk",
|
||||
"fi": "Finsk",
|
||||
"fr": "Fransk",
|
||||
"de": "Tysk",
|
||||
"it": "Italiensk",
|
||||
"ja": "Japansk",
|
||||
"ko": "Koreansk",
|
||||
"no": "Norsk",
|
||||
"pt_BR": "Portugisisk (Brasil)",
|
||||
"ru": "Russisk",
|
||||
"es": "Spansk",
|
||||
"es_MX": "Spansk (Mexico)",
|
||||
"sv": "Svensk",
|
||||
"th": "Thai",
|
||||
"he": "Hebraisk"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Økten har utløpt",
|
||||
"description": "Denne dokumentunderskriftslenken har utløpt på grunn av inaktivitet eller tidsavbrudd for økten. Vennligst gå tilbake til e-posten din og klikk på lenken igjen for å fortsette å underskrive."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 Signering fullført!",
|
||||
"subtitle": "Dokumentet er signert",
|
||||
"thankYou": "Takk for at du signerte!",
|
||||
"message": "Du vil motta en bekreftelses-e-post når dokumentet er signert av alle parter.",
|
||||
"passDevice": "Du kan nå gi enheten tilbake til <strong>{{senderName}}</strong>",
|
||||
"continueButton": "Fortsett"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "Ao clicar em <0>Eu concordo</0>, você confirma que revisou a <1>Divulgação de Registro Eletrônico e Assinatura</1> e consente com o uso de registros e assinaturas eletrônicas na revisão e execução deste documento.",
|
||||
"note": "Observação:",
|
||||
"noteText": "Concordar com isso não significa que você está assinando o documento imediatamente. Apenas permite que você o revise eletronicamente. Você terá a chance de revisar o documento por completo antes de assinar."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "Eu concordo",
|
||||
"processing": "Processando...",
|
||||
"close": "Fechar",
|
||||
"downloadPdf": "Baixar PDF",
|
||||
"downloading": "Baixando..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "Resumo de IA",
|
||||
"completeSign": "Assinar completamente",
|
||||
"sign": "Assinar",
|
||||
"processing": "Processando...",
|
||||
"options": "Baixar"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "Baixar PDF",
|
||||
"auditTrail": "Trilha de Auditoria",
|
||||
"reassignSigner": "Reatribuir Signatário",
|
||||
"cancelTransaction": "Cancelar Transação",
|
||||
"viewTerms": "Ver Termos e Condições",
|
||||
"helpSupport": "Ajuda e Suporte",
|
||||
"about": "Sobre a SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Documentos",
|
||||
"pages": "Páginas: {{count}}",
|
||||
"noDocuments": "Nenhum documento disponível."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "Pronto para finalizar?",
|
||||
"readyDesc": "Você preencheu os campos obrigatórios. Revise seu trabalho e selecione Finalizar.",
|
||||
"finish": "Finalizar",
|
||||
"submitting": "Enviando...",
|
||||
"start": "Iniciar",
|
||||
"next": "Próximo",
|
||||
"agreementText": "Ao assinar, concordo com os <0>Termos e Condições</0> do Sign Made Easy."
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "Tudo pronto!",
|
||||
"title": "Obrigado por assinar",
|
||||
"message": "Seu documento agora está completo e armazenado com segurança. Enviamos uma cópia para seu e-mail."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "Ação cancelada!",
|
||||
"title": "Talvez na próxima!",
|
||||
"message": "Sua solicitação foi recusada."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "Ação cancelada!",
|
||||
"title": "Talvez na próxima!",
|
||||
"message": "Sua solicitação foi cancelada."
|
||||
},
|
||||
"download": "Baixar",
|
||||
"downloading": "Baixando...",
|
||||
"downloadSuccess": "Arquivo baixado com sucesso.",
|
||||
"downloadOptions": {
|
||||
"pdf": "Documento PDF",
|
||||
"audit": "Trilhas de Auditoria",
|
||||
"selectFormat": "Selecionar formato"
|
||||
},
|
||||
"downloadError": "Falha no download do arquivo. Tente novamente.",
|
||||
"appsTitle": "Aumente a eficiência com nossos aplicativos",
|
||||
"formsTitle": "Gere formulários com facilidade",
|
||||
"docsTitle": "Gere documentos (faturas, relatórios, cotações)",
|
||||
"tryNow": "Experimente agora",
|
||||
"footerText": "Copyright 2026 Sign Made Easy. Todos os direitos reservados.<0>Política de Privacidade</0> | <1>Política de Uso Razoável</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Reatribuir Signatário",
|
||||
"successSubtitle": "Documento foi reatribuído com sucesso",
|
||||
"successTitle": "Obrigado!",
|
||||
"successMessage": "O documento foi reatribuído com sucesso ao novo signatário.",
|
||||
"fields": {
|
||||
"firstName": "Nome",
|
||||
"lastName": "Sobrenome",
|
||||
"email": "E-mail",
|
||||
"language": "Idioma",
|
||||
"message": "Mensagem Opcional"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Digite seu nome",
|
||||
"lastName": "Digite seu sobrenome",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Escreva sua mensagem aqui..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Enviar",
|
||||
"submitting": "Enviando...",
|
||||
"cancel": "Cancelar"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "O nome é obrigatório",
|
||||
"firstNameMin": "O nome deve ter pelo menos 2 caracteres",
|
||||
"lastNameRequired": "O sobrenome é obrigatório",
|
||||
"lastNameMin": "O sobrenome deve ter pelo menos 2 caracteres",
|
||||
"emailRequired": "O e-mail é obrigatório",
|
||||
"emailInvalid": "Endereço de e-mail inválido"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Cancelar Transação",
|
||||
"description": "Tem certeza de que deseja cancelar esta transação? Forneça o motivo do cancelamento abaixo.",
|
||||
"placeholder": "Forneça o motivo do cancelamento...",
|
||||
"buttons": {
|
||||
"no": "Não, não cancelar",
|
||||
"yes": "Sim, cancelar"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "O motivo do cancelamento é obrigatório"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Cancelar Transação",
|
||||
"message": "A transação foi cancelada com sucesso. E-mails de confirmação foram enviados.",
|
||||
"passBackDevice": "Agora você pode devolver o dispositivo para {{senderName}}.",
|
||||
"continueButton": "Continuar"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Auditoria de Transação",
|
||||
"meta.transaction_id": "ID da Transação",
|
||||
"meta.transaction_status": "Status da Transação",
|
||||
"meta.files": "Arquivos",
|
||||
"audit.title": "Trilha de Auditoria Completa",
|
||||
"audit.description": "Atualize o Assunto e a Mensagem abaixo para uma mensagem personalizada.",
|
||||
"table.header.actions": "Ações",
|
||||
"table.header.language": "Idioma",
|
||||
"table.header.ip_address": "Endereço IP",
|
||||
"table.header.date": "Data",
|
||||
"status.completed": "Concluído",
|
||||
"status.pending": "Pendente",
|
||||
"status.failed": "Falhou",
|
||||
"action.created": "Criado",
|
||||
"action.updated": "Atualizado",
|
||||
"action.deleted": "Excluído",
|
||||
"action.viewed": "Visualizado",
|
||||
"action.signed": "Assinado",
|
||||
"action.uploaded": "Enviado",
|
||||
"action.downloaded": "Baixado",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Auditoria de Transação",
|
||||
"meta": {
|
||||
"transactionId": "ID da Transação",
|
||||
"transactionStatus": "Status da Transação",
|
||||
"files": "Arquivos"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Trilha de Auditoria Completa",
|
||||
"description": "Atualize o Assunto e a Mensagem abaixo para uma mensagem personalizada."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Ações",
|
||||
"language": "Idioma",
|
||||
"ipAddress": "Endereço IP",
|
||||
"date": "Data"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Concluído",
|
||||
"pending": "Pendente",
|
||||
"failed": "Falhou"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Transação foi criada por {{userName}} <{{userEmail}}>",
|
||||
"sent": "Transação foi enviada por {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Transação foi cancelada por {{userName}} <{{userEmail}}>",
|
||||
"edited": "Transação foi editada por {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Transação foi visualizada por {{userName}} <{{userEmail}}>",
|
||||
"signed": "Transação foi assinada por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Assinatura da transação foi recusada por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Divulgação de Registro Eletrônico e Assinatura foi aceita por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> atualizou seu idioma para {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "E-mail de convite enviado para {{userName}} <{{userEmail}}>",
|
||||
"view": "Convite para visualizar o documento enviado para {{userName}} <{{userEmail}}>",
|
||||
"resent": "E-mail de convite reenviado para {{recipientName}} <{{recipientEmail}}> por {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Signatário foi reatribuído por {{fromName}} <{{fromEmail}}> para {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> foi reatribuído por {{fromName}} <{{fromEmail}}> para {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "Transação presencial foi iniciada por {{userName}} <{{userEmail}}>",
|
||||
"verification": "Verificação de assinatura presencial foi aceita por {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Processo do Facilitador foi aceito por {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Assinatura",
|
||||
"initial": "Inicial",
|
||||
"edit": "Editar",
|
||||
"styleSelection": "Seleção de Estilo"
|
||||
},
|
||||
"subtitle": "Crie suas assinaturas digitais",
|
||||
"tabs": {
|
||||
"select": "Selecionar",
|
||||
"draw": "Desenhar",
|
||||
"upload": "Enviar"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Confirme seu nome e escolha um estilo de assinatura.",
|
||||
"requiredFields": "Campos obrigatórios.",
|
||||
"fullName": {
|
||||
"label": "Nome Completo",
|
||||
"required": "*",
|
||||
"placeholder": "Digite o nome completo"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Iniciais",
|
||||
"required": "*",
|
||||
"placeholder": "Digite as iniciais"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Desenhe sua assinatura.",
|
||||
"required": "*",
|
||||
"requiredFields": "São campos obrigatórios.",
|
||||
"signature": "Assinatura",
|
||||
"initials": "Iniciais",
|
||||
"clearSignature": "Limpar assinatura",
|
||||
"fullNameBox": {
|
||||
"label": "Assinatura completa",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Iniciais",
|
||||
"required": "*",
|
||||
"placeholder": "Digite as iniciais"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Tanto a assinatura quanto as iniciais são obrigatórias.",
|
||||
"requirements": "Use imagens de 300×100px para assinaturas e 100×100px para iniciais. Máx. 300KB. Suportado: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Enviar Assinatura",
|
||||
"uploadHint": "JPG, PNG (300×100px, máx. 300KB)",
|
||||
"browseButton": "Procurar",
|
||||
"uploadedLabel": "Assinatura ✓",
|
||||
"changeButton": "Alterar Assinatura",
|
||||
"altText": "Imagem de assinatura enviada"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Enviar Iniciais",
|
||||
"uploadHint": "JPG, PNG (100×100px, máx. 300KB)",
|
||||
"browseButton": "Procurar",
|
||||
"uploadedLabel": "Iniciais ✓",
|
||||
"changeButton": "Alterar Iniciais",
|
||||
"altText": "Imagem de iniciais enviada"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Entendo que estou assinando este documento.",
|
||||
"cancelButton": "Cancelar",
|
||||
"adoptButton": "Adotar Assinatura e Assinar"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Este campo é obrigatório",
|
||||
"fileTooLarge": "O tamanho do arquivo deve ser inferior a 300KB",
|
||||
"invalidFileType": "Apenas arquivos .png, .jpg e .jpeg são suportados",
|
||||
"signatureRequired": "Por favor, adicione uma assinatura",
|
||||
"initialsRequired": "Por favor, adicione iniciais"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Adicionar Carimbo",
|
||||
"edit": "Editar Carimbo"
|
||||
},
|
||||
"closeButton": "Fechar modal",
|
||||
"fileRequirements": "Tamanho máximo = 400Kb | Tipos de arquivo suportados = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Arraste e solte uma imagem, ou clique para enviar",
|
||||
"previewAltText": "Prévia do Carimbo",
|
||||
"changeImageButton": "Alterar imagem",
|
||||
"clearButton": "Fechar",
|
||||
"saveButton": "Salvar",
|
||||
"updateButton": "Atualizar",
|
||||
"errors": {
|
||||
"fileTooLarge": "O tamanho do arquivo excede o limite de 400KB",
|
||||
"invalidFileType": "Apenas arquivos .png, .jpg e .jpeg são suportados",
|
||||
"uploadFailed": "Falha ao enviar a imagem. Por favor, tente novamente."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Anexo",
|
||||
"subtitle": {
|
||||
"hasFile": "Gerenciar seu anexo",
|
||||
"noFile": "Enviar anexo"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Enviando arquivo...",
|
||||
"shimmerText": "Enviando arquivo..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Solte seu arquivo aqui",
|
||||
"default": "Enviar ou arrastar e soltar arquivo",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (máx. 10MB)",
|
||||
"browseButton": "Procurar Arquivos"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Enviado com sucesso",
|
||||
"deleteButton": "Excluir arquivo"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Fechar",
|
||||
"uploading": "Enviando...",
|
||||
"deleting": "Excluindo...",
|
||||
"saved": "Arquivo Salvo!",
|
||||
"done": "Concluído",
|
||||
"uploadFile": "Enviar Arquivo"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "O tamanho do arquivo excede o limite de 10MB",
|
||||
"invalidFileType": "Apenas arquivos PDF, DOCX, JPG, PNG e TXT são suportados",
|
||||
"uploadFailed": "Falha ao enviar o arquivo. Por favor, tente novamente.",
|
||||
"deleteFailed": "Falha ao excluir o arquivo. Por favor, tente novamente.",
|
||||
"noFileSelected": "Por favor, selecione um arquivo antes de prosseguir"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Envio de arquivo",
|
||||
"deleteFile": "Excluir arquivo"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Chinês (Simplificado)",
|
||||
"zh_TW": "Chinês (Tradicional)",
|
||||
"da": "Dinamarquês",
|
||||
"nl_NL": "Holandês",
|
||||
"en": "Inglês",
|
||||
"fi": "Finlandês",
|
||||
"fr": "Francês",
|
||||
"de": "Alemão",
|
||||
"it": "Italiano",
|
||||
"ja": "Japonês",
|
||||
"ko": "Coreano",
|
||||
"no": "Norueguês",
|
||||
"pt_BR": "Português (Brasil)",
|
||||
"ru": "Russo",
|
||||
"es": "Espanhol",
|
||||
"es_MX": "Espanhol (México)",
|
||||
"sv": "Sueco",
|
||||
"th": "Tailandês",
|
||||
"he": "Hebraico"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Sessão expirada",
|
||||
"description": "Este link de assinatura de documento expirou devido à inatividade ou tempo limite da sessão. Por favor, volte ao seu e-mail e clique no link novamente para continuar assinando."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 Assinatura concluída!",
|
||||
"subtitle": "Documento foi assinado com sucesso",
|
||||
"thankYou": "Obrigado por assinar!",
|
||||
"message": "Você receberá um e-mail de confirmação assim que o documento for assinado por todas as partes.",
|
||||
"passDevice": "Agora você pode devolver o dispositivo para <strong>{{senderName}}</strong>",
|
||||
"continueButton": "Continuar"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "Нажимая <0>Я соглашаюсь</0>, вы подтверждаете, что ознакомились с <1>Раскрытием информации об электронных записях и подписях</1> и соглашаетесь на использование электронных записей и подписей при просмотре и подписании этого документа.",
|
||||
"note": "Примечание:",
|
||||
"noteText": "Согласие с этим не означает, что вы немедленно подписываете документ. Это позволяет вам только просмотреть его в электронном виде. У вас будет возможность полностью ознакомиться с документом перед подписанием."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "Я соглашаюсь",
|
||||
"processing": "Обработка...",
|
||||
"close": "Закрыть",
|
||||
"downloadPdf": "Скачать PDF",
|
||||
"downloading": "Загрузка..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "Резюме ИИ",
|
||||
"completeSign": "Завершить подписание",
|
||||
"sign": "Подписать",
|
||||
"processing": "Обработка...",
|
||||
"options": "Скачать"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "Скачать PDF",
|
||||
"auditTrail": "Журнал аудита",
|
||||
"reassignSigner": "Переназначить подписанта",
|
||||
"cancelTransaction": "Отменить транзакцию",
|
||||
"viewTerms": "Просмотреть условия",
|
||||
"helpSupport": "Помощь и поддержка",
|
||||
"about": "О SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Документы",
|
||||
"pages": "Страниц: {{count}}",
|
||||
"noDocuments": "Нет доступных документов."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "Готовы завершить?",
|
||||
"readyDesc": "Вы заполнили обязательные поля. Проверьте свою работу и выберите Завершить.",
|
||||
"finish": "Завершить",
|
||||
"submitting": "Отправка...",
|
||||
"start": "Начать",
|
||||
"next": "Далее",
|
||||
"agreementText": "Подписывая, я соглашаюсь с <0>Условиями</0> Sign Made Easy."
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "Готово!",
|
||||
"title": "Спасибо за подписание",
|
||||
"message": "Ваш документ теперь завершен и надежно сохранен. Мы отправили вам копию по электронной почте."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "Действие отменено!",
|
||||
"title": "Может быть, в следующий раз!",
|
||||
"message": "Ваш запрос был отклонен."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "Действие отменено!",
|
||||
"title": "Может быть, в следующий раз!",
|
||||
"message": "Ваш запрос был отменен."
|
||||
},
|
||||
"download": "Скачать",
|
||||
"downloading": "Загрузка...",
|
||||
"downloadSuccess": "Файл успешно загружен.",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDF документ",
|
||||
"audit": "Журналы аудита",
|
||||
"selectFormat": "Выбрать формат"
|
||||
},
|
||||
"downloadError": "Не удалось загрузить файл. Пожалуйста, попробуйте снова.",
|
||||
"appsTitle": "Повысьте эффективность с нашими приложениями",
|
||||
"formsTitle": "Легко создавайте формы",
|
||||
"docsTitle": "Создавайте документы (счета, отчеты, предложения)",
|
||||
"tryNow": "Попробовать сейчас",
|
||||
"footerText": "Авторские права 2026 Sign Made Easy. Все права защищены.<0>Политика конфиденциальности</0> | <1>Политика добросовестного использования</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Переназначить подписанта",
|
||||
"successSubtitle": "Документ успешно переназначен",
|
||||
"successTitle": "Спасибо!",
|
||||
"successMessage": "Документ успешно переназначен новому подписанту.",
|
||||
"fields": {
|
||||
"firstName": "Имя",
|
||||
"lastName": "Фамилия",
|
||||
"email": "Электронная почта",
|
||||
"language": "Язык",
|
||||
"message": "Дополнительное сообщение"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Введите ваше имя",
|
||||
"lastName": "Введите вашу фамилию",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Напишите ваше сообщение здесь..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Отправить",
|
||||
"submitting": "Отправка...",
|
||||
"cancel": "Отмена"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "Имя обязательно",
|
||||
"firstNameMin": "Имя должно содержать не менее 2 символов",
|
||||
"lastNameRequired": "Фамилия обязательна",
|
||||
"lastNameMin": "Фамилия должна содержать не менее 2 символов",
|
||||
"emailRequired": "Электронная почта обязательна",
|
||||
"emailInvalid": "Неверный адрес электронной почты"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Отменить транзакцию",
|
||||
"description": "Вы уверены, что хотите отменить эту транзакцию? Укажите причину отмены ниже.",
|
||||
"placeholder": "Пожалуйста, укажите причину отмены...",
|
||||
"buttons": {
|
||||
"no": "Нет, не отменять",
|
||||
"yes": "Да, отменить"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "Необходимо указать причину отмены"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Отменить транзакцию",
|
||||
"message": "Транзакция успешно отменена. Письма с подтверждением отправлены.",
|
||||
"passBackDevice": "Теперь вы можете вернуть устройство {{senderName}}.",
|
||||
"continueButton": "Продолжить"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Аудит транзакций",
|
||||
"meta.transaction_id": "ID транзакции",
|
||||
"meta.transaction_status": "Статус транзакции",
|
||||
"meta.files": "Файлы",
|
||||
"audit.title": "Полный журнал аудита",
|
||||
"audit.description": "Обновите тему и сообщение ниже для настраиваемого сообщения.",
|
||||
"table.header.actions": "Действия",
|
||||
"table.header.language": "Язык",
|
||||
"table.header.ip_address": "IP-адрес",
|
||||
"table.header.date": "Дата",
|
||||
"status.completed": "Завершено",
|
||||
"status.pending": "Ожидает",
|
||||
"status.failed": "Ошибка",
|
||||
"action.created": "Создано",
|
||||
"action.updated": "Обновлено",
|
||||
"action.deleted": "Удалено",
|
||||
"action.viewed": "Просмотрено",
|
||||
"action.signed": "Подписано",
|
||||
"action.uploaded": "Загружено",
|
||||
"action.downloaded": "Скачано",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Аудит транзакций",
|
||||
"meta": {
|
||||
"transactionId": "ID транзакции",
|
||||
"transactionStatus": "Статус транзакции",
|
||||
"files": "Файлы"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Полный журнал аудита",
|
||||
"description": "Обновите тему и сообщение ниже для настраиваемого сообщения."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Действия",
|
||||
"language": "Язык",
|
||||
"ipAddress": "IP-адрес",
|
||||
"date": "Дата"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Завершено",
|
||||
"pending": "Ожидает",
|
||||
"failed": "Ошибка"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Транзакция создана {{userName}} <{{userEmail}}>",
|
||||
"sent": "Транзакция отправлена {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Транзакция отменена {{userName}} <{{userEmail}}>",
|
||||
"edited": "Транзакция отредактирована {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Транзакция просмотрена {{userName}} <{{userEmail}}>",
|
||||
"signed": "Транзакция подписана {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Подпись транзакции отклонена {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Раскрытие электронной записи и подписи принято {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> обновил язык на {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "Приглашение по электронной почте отправлено {{userName}} <{{userEmail}}>",
|
||||
"view": "Приглашение просмотреть документ отправлено {{userName}} <{{userEmail}}>",
|
||||
"resent": "Приглашение по электронной почте повторно отправлено {{recipientName}} <{{recipientEmail}}> от {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Подписывающий переназначен {{fromName}} <{{fromEmail}}> на {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> был переназначен {{fromName}} <{{fromEmail}}> на {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "Личная транзакция начата {{userName}} <{{userEmail}}>",
|
||||
"verification": "Проверка личной подписи принята {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Процесс фасилитатора принят {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Подпись",
|
||||
"initial": "Инициалы",
|
||||
"edit": "Редактировать",
|
||||
"styleSelection": "Выбор стиля"
|
||||
},
|
||||
"subtitle": "Создайте свои цифровые подписи",
|
||||
"tabs": {
|
||||
"select": "Выбрать",
|
||||
"draw": "Рисовать",
|
||||
"upload": "Загрузить"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Подтвердите свое имя и выберите стиль подписи.",
|
||||
"requiredFields": "Обязательные поля.",
|
||||
"fullName": {
|
||||
"label": "Полное имя",
|
||||
"required": "*",
|
||||
"placeholder": "Введите полное имя"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Инициалы",
|
||||
"required": "*",
|
||||
"placeholder": "Введите инициалы"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Нарисуйте свою подпись.",
|
||||
"required": "*",
|
||||
"requiredFields": "Являются обязательными полями.",
|
||||
"signature": "Подпись",
|
||||
"initials": "Инициалы",
|
||||
"clearSignature": "Очистить подпись",
|
||||
"fullNameBox": {
|
||||
"label": "Полная подпись",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Инициалы",
|
||||
"required": "*",
|
||||
"placeholder": "Введите инициалы"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Требуются как подпись, так и инициалы.",
|
||||
"requirements": "Используйте изображения 300×100px для подписей и 100×100px для инициалов. Макс. 300KB. Поддерживается: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Загрузить подпись",
|
||||
"uploadHint": "JPG, PNG (300×100px, макс. 300KB)",
|
||||
"browseButton": "Обзор",
|
||||
"uploadedLabel": "Подпись ✓",
|
||||
"changeButton": "Изменить подпись",
|
||||
"altText": "Загруженное изображение подписи"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Загрузить инициалы",
|
||||
"uploadHint": "JPG, PNG (100×100px, макс. 300KB)",
|
||||
"browseButton": "Обзор",
|
||||
"uploadedLabel": "Инициалы ✓",
|
||||
"changeButton": "Изменить инициалы",
|
||||
"altText": "Загруженное изображение инициалов"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Я понимаю, что подписываю этот документ.",
|
||||
"cancelButton": "Отмена",
|
||||
"adoptButton": "Принять подпись и подписать"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Это поле обязательно",
|
||||
"fileTooLarge": "Размер файла должен быть менее 300KB",
|
||||
"invalidFileType": "Поддерживаются только файлы .png, .jpg и .jpeg",
|
||||
"signatureRequired": "Пожалуйста, добавьте подпись",
|
||||
"initialsRequired": "Пожалуйста, добавьте инициалы"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Добавить штамп",
|
||||
"edit": "Редактировать штамп"
|
||||
},
|
||||
"closeButton": "Закрыть модальное окно",
|
||||
"fileRequirements": "Максимальный размер = 400Kb | Поддерживаемые типы файлов = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Перетащите изображение или нажмите для загрузки",
|
||||
"previewAltText": "Предпросмотр штампа",
|
||||
"changeImageButton": "Изменить изображение",
|
||||
"clearButton": "Закрыть",
|
||||
"saveButton": "Сохранить",
|
||||
"updateButton": "Обновить",
|
||||
"errors": {
|
||||
"fileTooLarge": "Размер файла превышает лимит 400KB",
|
||||
"invalidFileType": "Поддерживаются только файлы .png, .jpg и .jpeg",
|
||||
"uploadFailed": "Не удалось загрузить изображение. Пожалуйста, попробуйте снова."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Вложение",
|
||||
"subtitle": {
|
||||
"hasFile": "Управление вложением",
|
||||
"noFile": "Загрузить вложение"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Загрузка файла...",
|
||||
"shimmerText": "Загрузка файла..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Перетащите файл сюда",
|
||||
"default": "Загрузить или перетащить файл",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (макс. 10MB)",
|
||||
"browseButton": "Обзор файлов"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Загружено успешно",
|
||||
"deleteButton": "Удалить файл"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Закрыть",
|
||||
"uploading": "Загрузка...",
|
||||
"deleting": "Удаление...",
|
||||
"saved": "Файл сохранен!",
|
||||
"done": "Готово",
|
||||
"uploadFile": "Загрузить файл"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "Размер файла превышает лимит 10MB",
|
||||
"invalidFileType": "Поддерживаются только файлы PDF, DOCX, JPG, PNG и TXT",
|
||||
"uploadFailed": "Не удалось загрузить файл. Пожалуйста, попробуйте снова.",
|
||||
"deleteFailed": "Не удалось удалить файл. Пожалуйста, попробуйте снова.",
|
||||
"noFileSelected": "Пожалуйста, выберите файл перед продолжением"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Загрузка файла",
|
||||
"deleteFile": "Удалить файл"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Китайский (упрощенный)",
|
||||
"zh_TW": "Китайский (традиционный)",
|
||||
"da": "Датский",
|
||||
"nl_NL": "Голландский",
|
||||
"en": "Английский",
|
||||
"fi": "Финский",
|
||||
"fr": "Французский",
|
||||
"de": "Немецкий",
|
||||
"it": "Итальянский",
|
||||
"ja": "Японский",
|
||||
"ko": "Корейский",
|
||||
"no": "Норвежский",
|
||||
"pt_BR": "Португальский (Бразилия)",
|
||||
"ru": "Русский",
|
||||
"es": "Испанский",
|
||||
"es_MX": "Испанский (Мексика)",
|
||||
"sv": "Шведский",
|
||||
"th": "Тайский",
|
||||
"he": "Иврит"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Сессия истекла",
|
||||
"description": "Срок действия ссылки для подписания документа истек из-за бездействия или тайм-аута сеанса. Пожалуйста, вернитесь к своему электронному письму и нажмите на ссылку еще раз, чтобы продолжить подписание."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 Подписание завершено!",
|
||||
"subtitle": "Документ успешно подписан",
|
||||
"thankYou": "Спасибо за подписание!",
|
||||
"message": "Вы получите подтверждение по электронной почте, когда документ будет подписан всеми сторонами.",
|
||||
"passDevice": "Теперь вы можете передать устройство обратно <strong>{{senderName}}</strong>",
|
||||
"continueButton": "Продолжить"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "Genom att klicka på <0>Jag godkänner</0> bekräftar du att du har granskat <1>Information om elektroniska register och signaturer</1> och samtycker till användningen av elektroniska register och signaturer vid granskning och utförande av detta dokument.",
|
||||
"note": "Observera:",
|
||||
"noteText": "Att godkänna detta innebär inte att du omedelbart undertecknar dokumentet. Det tillåter dig bara att granska det elektroniskt. Du kommer att ha möjlighet att granska dokumentet fullständigt innan du undertecknar."
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "Jag godkänner",
|
||||
"processing": "Bearbetar...",
|
||||
"close": "Stäng",
|
||||
"downloadPdf": "Ladda ner PDF",
|
||||
"downloading": "Laddar ner..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "AI-sammanfattning",
|
||||
"completeSign": "Slutför signering",
|
||||
"sign": "Signera",
|
||||
"processing": "Bearbetar...",
|
||||
"options": "Ladda ner"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "Ladda ner PDF",
|
||||
"auditTrail": "Revisionsspår",
|
||||
"reassignSigner": "Omfördelad undertecknare",
|
||||
"cancelTransaction": "Avbryt transaktion",
|
||||
"viewTerms": "Visa villkor",
|
||||
"helpSupport": "Hjälp och support",
|
||||
"about": "Om SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "Dokument",
|
||||
"pages": "Sidor: {{count}}",
|
||||
"noDocuments": "Inga dokument tillgängliga."
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "Redo att avsluta?",
|
||||
"readyDesc": "Du har fyllt i de obligatoriska fälten. Granska ditt arbete och välj sedan Slutför.",
|
||||
"finish": "Slutför",
|
||||
"submitting": "Skickar...",
|
||||
"start": "Starta",
|
||||
"next": "Nästa",
|
||||
"agreementText": "Genom att underteckna godkänner jag Sign Made Easy's <0>villkor.</0>"
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "Helt klart!",
|
||||
"title": "Tack för din underskrift",
|
||||
"message": "Ditt dokument är nu slutfört och säkert lagrat. Vi har skickat en kopia till dig via e-post."
|
||||
},
|
||||
"declined": {
|
||||
"hit": "Åtgärd avbruten!",
|
||||
"title": "Kanske nästa gång!",
|
||||
"message": "Din begäran har avvisats."
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "Åtgärd avbruten!",
|
||||
"title": "Kanske nästa gång!",
|
||||
"message": "Din begäran har avbrutits."
|
||||
},
|
||||
"download": "Ladda ner",
|
||||
"downloading": "Laddar ner...",
|
||||
"downloadSuccess": "Fil nedladdad.",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDF-dokument",
|
||||
"audit": "Revisionsspår",
|
||||
"selectFormat": "Välj format"
|
||||
},
|
||||
"downloadError": "Nedladdning misslyckades. Försök igen.",
|
||||
"appsTitle": "Öka effektiviteten med våra appar",
|
||||
"formsTitle": "Skapa formulär enkelt",
|
||||
"docsTitle": "Skapa dokument (fakturor, rapporter, offerter)",
|
||||
"tryNow": "Prova nu",
|
||||
"footerText": "Upphovsrätt 2026 Sign Made Easy. Alla rättigheter förbehållna.<0>Sekretesspolicy</0> | <1>Policy för rimlig användning</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "Omfördelad undertecknare",
|
||||
"successSubtitle": "Dokumentet har omfördelats",
|
||||
"successTitle": "Tack!",
|
||||
"successMessage": "Dokumentet har omfördelats till den nya undertecknaren.",
|
||||
"fields": {
|
||||
"firstName": "Förnamn",
|
||||
"lastName": "Efternamn",
|
||||
"email": "E-post",
|
||||
"language": "Språk",
|
||||
"message": "Valfritt meddelande"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "Ange ditt förnamn",
|
||||
"lastName": "Ange ditt efternamn",
|
||||
"email": "your.email@example.com",
|
||||
"message": "Skriv ditt meddelande här..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "Skicka",
|
||||
"submitting": "Skickar...",
|
||||
"cancel": "Avbryt"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "Förnamn krävs",
|
||||
"firstNameMin": "Förnamn måste vara minst 2 tecken",
|
||||
"lastNameRequired": "Efternamn krävs",
|
||||
"lastNameMin": "Efternamn måste vara minst 2 tecken",
|
||||
"emailRequired": "E-post krävs",
|
||||
"emailInvalid": "Ogiltig e-postadress"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "Avbryt transaktion",
|
||||
"description": "Är du säker på att du vill avbryta denna transaktion? Ange din anledning till avbokning nedan.",
|
||||
"placeholder": "Vänligen ange din anledning till avbokning...",
|
||||
"buttons": {
|
||||
"no": "Nej, avbryt inte",
|
||||
"yes": "Ja, avbryt den"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "Avbokningsorsak krävs"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "Avbryt transaktion",
|
||||
"message": "Transaktionen avbröts. Bekräftelsemeddelanden skickades.",
|
||||
"passBackDevice": "Du kan nu lämna tillbaka enheten till {{senderName}}.",
|
||||
"continueButton": "Fortsätt"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "Transaktionsrevision",
|
||||
"meta.transaction_id": "Transaktions-ID",
|
||||
"meta.transaction_status": "Transaktionsstatus",
|
||||
"meta.files": "Filer",
|
||||
"audit.title": "Fullt revisionsspår",
|
||||
"audit.description": "Uppdatera ämne och meddelande nedan för ett anpassat meddelande.",
|
||||
"table.header.actions": "Åtgärder",
|
||||
"table.header.language": "Språk",
|
||||
"table.header.ip_address": "IP-adress",
|
||||
"table.header.date": "Datum",
|
||||
"status.completed": "Slutförd",
|
||||
"status.pending": "Väntande",
|
||||
"status.failed": "Misslyckades",
|
||||
"action.created": "Skapad",
|
||||
"action.updated": "Uppdaterad",
|
||||
"action.deleted": "Raderad",
|
||||
"action.viewed": "Visad",
|
||||
"action.signed": "Signerad",
|
||||
"action.uploaded": "Uppladdad",
|
||||
"action.downloaded": "Nerladdad",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "Transaktionsrevision",
|
||||
"meta": {
|
||||
"transactionId": "Transaktions-ID",
|
||||
"transactionStatus": "Transaktionsstatus",
|
||||
"files": "Filer"
|
||||
},
|
||||
"audit": {
|
||||
"title": "Fullt revisionsspår",
|
||||
"description": "Uppdatera ämne och meddelande nedan för ett anpassat meddelande."
|
||||
},
|
||||
"table": {
|
||||
"actions": "Åtgärder",
|
||||
"language": "Språk",
|
||||
"ipAddress": "IP-adress",
|
||||
"date": "Datum"
|
||||
},
|
||||
"status": {
|
||||
"completed": "Slutförd",
|
||||
"pending": "Väntande",
|
||||
"failed": "Misslyckades"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "Transaktion skapades av {{userName}} <{{userEmail}}>",
|
||||
"sent": "Transaktion skickades av {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "Transaktion avbröts av {{userName}} <{{userEmail}}>",
|
||||
"edited": "Transaktion redigerades av {{userName}} <{{userEmail}}>",
|
||||
"viewed": "Transaktion visades av {{userName}} <{{userEmail}}>",
|
||||
"signed": "Transaktion signerades av {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "Transaktionssignatur avvisades av {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "Elektronisk registrering och signaturavsöjning accepterades av {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> uppdaterade sitt språk till {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "Inbjudningsmejl skickat till {{userName}} <{{userEmail}}>",
|
||||
"view": "Inbjudan att visa dokumentet har skickats till {{userName}} <{{userEmail}}>",
|
||||
"resent": "Inbjudningsmejl skickades igen till {{recipientName}} <{{recipientEmail}}> av {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "Undertecknare omtilldelades av {{fromName}} <{{fromEmail}}> till {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> omtilldelades av {{fromName}} <{{fromEmail}}> till {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "Personlig transaktion startades av {{userName}} <{{userEmail}}>",
|
||||
"verification": "Personlig signaturverifiering accepterades av {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "Facilitatorprocess accepterades av {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "Signatur",
|
||||
"initial": "Initialer",
|
||||
"edit": "Redigera",
|
||||
"styleSelection": "Stilval"
|
||||
},
|
||||
"subtitle": "Skapa dina digitala signaturer",
|
||||
"tabs": {
|
||||
"select": "Välj",
|
||||
"draw": "Rita",
|
||||
"upload": "Ladda upp"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "Bekräfta ditt namn och välj en signaturstil.",
|
||||
"requiredFields": "Obligatoriska fält.",
|
||||
"fullName": {
|
||||
"label": "Fullständigt namn",
|
||||
"required": "*",
|
||||
"placeholder": "Ange fullständigt namn"
|
||||
},
|
||||
"initials": {
|
||||
"label": "Initialer",
|
||||
"required": "*",
|
||||
"placeholder": "Ange initialer"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "Rita din signatur.",
|
||||
"required": "*",
|
||||
"requiredFields": "Är obligatoriska fält.",
|
||||
"signature": "Signatur",
|
||||
"initials": "Initialer",
|
||||
"clearSignature": "Rensa signatur",
|
||||
"fullNameBox": {
|
||||
"label": "Fullständig signatur",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "Initialer",
|
||||
"required": "*",
|
||||
"placeholder": "Ange initialer"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "Både signatur och initialer krävs.",
|
||||
"requirements": "Använd bilder på 300×100px för signaturer och 100×100px för initialer. Max 300KB. Stödjer: .png, .jpg.",
|
||||
"signature": {
|
||||
"uploadLabel": "Ladda upp signatur",
|
||||
"uploadHint": "JPG, PNG (300×100px, max 300KB)",
|
||||
"browseButton": "Bläddra",
|
||||
"uploadedLabel": "Signatur ✓",
|
||||
"changeButton": "Ändra signatur",
|
||||
"altText": "Uppladdad signaturbild"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "Ladda upp initialer",
|
||||
"uploadHint": "JPG, PNG (100×100px, max 300KB)",
|
||||
"browseButton": "Bläddra",
|
||||
"uploadedLabel": "Initialer ✓",
|
||||
"changeButton": "Ändra initialer",
|
||||
"altText": "Uppladdad initialbild"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "Jag förstår att jag signerar detta dokument.",
|
||||
"cancelButton": "Avbryt",
|
||||
"adoptButton": "Adoptera signatur och signera"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "Detta fält är obligatoriskt",
|
||||
"fileTooLarge": "Filstorleken måste vara under 300KB",
|
||||
"invalidFileType": "Endast .png, .jpg och .jpeg filer stöds",
|
||||
"signatureRequired": "Lägg till en signatur",
|
||||
"initialsRequired": "Lägg till initialer"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "Lägg till stämpel",
|
||||
"edit": "Redigera stämpel"
|
||||
},
|
||||
"closeButton": "Stäng modal",
|
||||
"fileRequirements": "Maximal storlek = 400Kb | Filtyper som stöds = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "Dra och släpp en bild, eller klicka för att ladda upp",
|
||||
"previewAltText": "Förhandsgranskning av stämpel",
|
||||
"changeImageButton": "Ändra bild",
|
||||
"clearButton": "Stäng",
|
||||
"saveButton": "Spara",
|
||||
"updateButton": "Uppdatera",
|
||||
"errors": {
|
||||
"fileTooLarge": "Filstorleken överstiger gränsen på 400KB",
|
||||
"invalidFileType": "Endast .png, .jpg och .jpeg filer stöds",
|
||||
"uploadFailed": "Misslyckades att ladda upp bilden. Försök igen."
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "Bilaga",
|
||||
"subtitle": {
|
||||
"hasFile": "Hantera din bilaga",
|
||||
"noFile": "Ladda upp bilaga"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "Laddar upp fil...",
|
||||
"shimmerText": "Laddar upp fil..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "Släpp din fil här",
|
||||
"default": "Ladda upp eller dra och släpp fil",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (max 10MB)",
|
||||
"browseButton": "Bläddra bland filer"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "Uppladdad framgångsrikt",
|
||||
"deleteButton": "Ta bort fil"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "Stäng",
|
||||
"uploading": "Laddar upp...",
|
||||
"deleting": "Tar bort...",
|
||||
"saved": "Fil sparad!",
|
||||
"done": "Klart",
|
||||
"uploadFile": "Ladda upp fil"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "Filstorleken överstiger gränsen på 10MB",
|
||||
"invalidFileType": "Endast PDF, DOCX, JPG, PNG och TXT filer stöds",
|
||||
"uploadFailed": "Misslyckades att ladda upp filen. Försök igen.",
|
||||
"deleteFailed": "Misslyckades att ta bort filen. Försök igen.",
|
||||
"noFileSelected": "Välj en fil innan du fortsätter"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "Filuppladdning",
|
||||
"deleteFile": "Ta bort fil"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "Kinesiska (Förenklad)",
|
||||
"zh_TW": "Kinesiska (Traditionell)",
|
||||
"da": "Danska",
|
||||
"nl_NL": "Holländska",
|
||||
"en": "Engelska",
|
||||
"fi": "Finska",
|
||||
"fr": "Franska",
|
||||
"de": "Tyska",
|
||||
"it": "Italienska",
|
||||
"ja": "Japanska",
|
||||
"ko": "Koreanska",
|
||||
"no": "Norska",
|
||||
"pt_BR": "Portugisiska (Brasilien)",
|
||||
"ru": "Ryska",
|
||||
"es": "Spanska",
|
||||
"es_MX": "Spanska (Mexiko)",
|
||||
"sv": "Svenska",
|
||||
"th": "Thai",
|
||||
"he": "Hebreiska"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "Sessionen har upphört",
|
||||
"description": "Denna dokumentunderskriftslänk har upphört på grund av inaktivitet eller tidsgräns för sessionen. Gå tillbaka till din e-post och klicka på länken igen för att fortsätta skriva under."
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 Signering slutförd!",
|
||||
"subtitle": "Dokumentet har signerats",
|
||||
"thankYou": "Tack för din underskrift!",
|
||||
"message": "Du kommer att få ett bekräftelsemail när dokumentet har signerats av alla parter.",
|
||||
"passDevice": "Du kan nu lämna tillbaka enheten till <strong>{{senderName}}</strong>",
|
||||
"continueButton": "Fortsätt"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "การคลิก <0>ฉันยอมรับ</0> แสดงว่าคุณยืนยันว่าได้ตรวจสอบ <1>การเปิดเผยบันทึกอิเล็กทรอนิกส์และลายมือชื่อ</1> แล้ว และยินยอมให้ใช้บันทึกอิเล็กทรอนิกส์และลายมือชื่อในการตรวจสอบและดำเนินการตามเอกสารนี้",
|
||||
"note": "หมายเหตุ:",
|
||||
"noteText": "การยอมรับนี้ไม่ได้หมายความว่าคุณกำลังลงนามในเอกสารทันที เป็นเพียงการอนุญาตให้คุณตรวจสอบด้วยวิธีอิเล็กทรอนิกส์เท่านั้น คุณจะมีโอกาสตรวจสอบเอกสารทั้งหมดก่อนลงนาม"
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "ฉันยอมรับ",
|
||||
"processing": "กำลังดำเนินการ...",
|
||||
"close": "ปิด",
|
||||
"downloadPdf": "ดาวน์โหลด PDF",
|
||||
"downloading": "กำลังดาวน์โหลด..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "สรุปผลจาก AI",
|
||||
"completeSign": "ลงนามเสร็จสมบูรณ์",
|
||||
"sign": "ลงนาม",
|
||||
"processing": "กำลังดำเนินการ...",
|
||||
"options": "ดาวน์โหลด"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "ดาวน์โหลด PDF",
|
||||
"auditTrail": "เส้นทางการตรวจสอบ",
|
||||
"reassignSigner": "กำหนดผู้ลงนามใหม่",
|
||||
"cancelTransaction": "ยกเลิกรายการ",
|
||||
"viewTerms": "ดูข้อกำหนดและเงื่อนไข",
|
||||
"helpSupport": "ความช่วยเหลือและการสนับสนุน",
|
||||
"about": "เกี่ยวกับ SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "เอกสาร",
|
||||
"pages": "หน้า: {{count}}",
|
||||
"noDocuments": "ไม่มีเอกสาร"
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "พร้อมที่จะเสร็จสิ้นหรือยัง?",
|
||||
"readyDesc": "คุณกรอกข้อมูลในช่องที่จำเป็นเรียบร้อยแล้ว ตรวจสอบงานของคุณ จากนั้นเลือกเสร็จสิ้น",
|
||||
"finish": "เสร็จสิ้น",
|
||||
"submitting": "กำลังส่ง...",
|
||||
"start": "เริ่มต้น",
|
||||
"next": "ถัดไป",
|
||||
"agreementText": "การลงนามแสดงว่าฉันยอมรับ <0>ข้อกำหนดและเงื่อนไข</0> ของ Sign Made Easy"
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "เสร็จเรียบร้อย!",
|
||||
"title": "ขอบคุณที่ลงนาม",
|
||||
"message": "เอกสารของคุณเสร็จสมบูรณ์และถูกจัดเก็บอย่างปลอดภัยแล้ว เราได้ส่งสำเนาทางอีเมลถึงคุณแล้ว"
|
||||
},
|
||||
"declined": {
|
||||
"hit": "ยกเลิกการดำเนินการ!",
|
||||
"title": "โอกาสหน้า!",
|
||||
"message": "คำขอของคุณถูกปฏิเสธเรียบร้อยแล้ว"
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "ยกเลิกการดำเนินการ!",
|
||||
"title": "โอกาสหน้า!",
|
||||
"message": "คำขอของคุณถูกยกเลิกเรียบร้อยแล้ว"
|
||||
},
|
||||
"download": "ดาวน์โหลด",
|
||||
"downloading": "กำลังดาวน์โหลด...",
|
||||
"downloadSuccess": "ดาวน์โหลดไฟล์สำเร็จ",
|
||||
"downloadOptions": {
|
||||
"pdf": "เอกสาร PDF",
|
||||
"audit": "เส้นทางการตรวจสอบ",
|
||||
"selectFormat": "เลือกรูปแบบ"
|
||||
},
|
||||
"downloadError": "การดาวน์โหลดไฟล์ล้มเหลว กรุณาลองอีกครั้ง",
|
||||
"appsTitle": "เพิ่มประสิทธิภาพด้วยแอปของเรา",
|
||||
"formsTitle": "สร้างแบบฟอร์มได้อย่างง่ายดาย",
|
||||
"docsTitle": "สร้างเอกสาร (ใบแจ้งหนี้ รายงาน ใบเสนอราคา)",
|
||||
"tryNow": "ลองใช้เลย",
|
||||
"footerText": "ลิขสิทธิ์ 2026 Sign Made Easy สงวนลิขสิทธิ์ <0>นโยบายความเป็นส่วนตัว</0> | <1>นโยบายการใช้งานที่เหมาะสม</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "กำหนดผู้ลงนามใหม่",
|
||||
"successSubtitle": "เอกสารถูกกำหนดใหม่เรียบร้อยแล้ว",
|
||||
"successTitle": "ขอบคุณ!",
|
||||
"successMessage": "เอกสารถูกกำหนดให้กับผู้ลงนามใหม่เรียบร้อยแล้ว",
|
||||
"fields": {
|
||||
"firstName": "ชื่อ",
|
||||
"lastName": "นามสกุล",
|
||||
"email": "อีเมล",
|
||||
"language": "ภาษา",
|
||||
"message": "ข้อความเพิ่มเติม"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "ป้อนชื่อของคุณ",
|
||||
"lastName": "ป้อนนามสกุลของคุณ",
|
||||
"email": "your.email@example.com",
|
||||
"message": "เขียนข้อความของคุณที่นี่..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "ส่ง",
|
||||
"submitting": "กำลังส่ง...",
|
||||
"cancel": "ยกเลิก"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "ต้องระบุชื่อ",
|
||||
"firstNameMin": "ชื่อต้องมีอย่างน้อย 2 ตัวอักษร",
|
||||
"lastNameRequired": "ต้องระบุนามสกุล",
|
||||
"lastNameMin": "นามสกุลต้องมีอย่างน้อย 2 ตัวอักษร",
|
||||
"emailRequired": "ต้องระบุอีเมล",
|
||||
"emailInvalid": "ที่อยู่อีเมลไม่ถูกต้อง"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "ยกเลิกรายการ",
|
||||
"description": "คุณแน่ใจหรือว่าต้องการยกเลิกรายการนี้? กรุณาระบุเหตุผลในการยกเลิกด้านล่าง",
|
||||
"placeholder": "กรุณาระบุเหตุผลในการยกเลิก...",
|
||||
"buttons": {
|
||||
"no": "ไม่ ไม่ยกเลิก",
|
||||
"yes": "ใช่ ยกเลิก"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "ต้องระบุเหตุผลในการยกเลิก"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "ยกเลิกธุรกรรม",
|
||||
"message": "ยกเลิกธุรกรรมเรียบร้อยแล้ว มีการส่งอีเมลยืนยันแล้ว",
|
||||
"passBackDevice": "คุณสามารถส่งคืนอุปกรณ์ให้ {{senderName}} ได้แล้ว",
|
||||
"continueButton": "ดำเนินการต่อ"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "การตรวจสอบรายการ",
|
||||
"meta.transaction_id": "รหัสรายการ",
|
||||
"meta.transaction_status": "สถานะรายการ",
|
||||
"meta.files": "ไฟล์",
|
||||
"audit.title": "เส้นทางการตรวจสอบแบบเต็ม",
|
||||
"audit.description": "กรุณาอัปเดตหัวข้อและข้อความด้านล่างสำหรับข้อความที่กำหนดเอง",
|
||||
"table.header.actions": "การดำเนินการ",
|
||||
"table.header.language": "ภาษา",
|
||||
"table.header.ip_address": "ที่อยู่ IP",
|
||||
"table.header.date": "วันที่",
|
||||
"status.completed": "เสร็จสมบูรณ์",
|
||||
"status.pending": "รอดำเนินการ",
|
||||
"status.failed": "ล้มเหลว",
|
||||
"action.created": "สร้างแล้ว",
|
||||
"action.updated": "อัปเดตแล้ว",
|
||||
"action.deleted": "ลบแล้ว",
|
||||
"action.viewed": "ดูแล้ว",
|
||||
"action.signed": "ลงนามแล้ว",
|
||||
"action.uploaded": "อัปโหลดแล้ว",
|
||||
"action.downloaded": "ดาวน์โหลดแล้ว",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "การตรวจสอบรายการ",
|
||||
"meta": {
|
||||
"transactionId": "รหัสรายการ",
|
||||
"transactionStatus": "สถานะรายการ",
|
||||
"files": "ไฟล์"
|
||||
},
|
||||
"audit": {
|
||||
"title": "เส้นทางการตรวจสอบแบบเต็ม",
|
||||
"description": "กรุณาอัปเดตหัวข้อและข้อความด้านล่างสำหรับข้อความที่กำหนดเอง"
|
||||
},
|
||||
"table": {
|
||||
"actions": "การดำเนินการ",
|
||||
"language": "ภาษา",
|
||||
"ipAddress": "ที่อยู่ IP",
|
||||
"date": "วันที่"
|
||||
},
|
||||
"status": {
|
||||
"completed": "เสร็จสมบูรณ์",
|
||||
"pending": "รอดำเนินการ",
|
||||
"failed": "ล้มเหลว"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "ธุรกรรมถูกสร้างโดย {{userName}} <{{userEmail}}>",
|
||||
"sent": "ธุรกรรมถูกส่งโดย {{userName}} <{{userEmail}}>",
|
||||
"cancelled": "ธุรกรรมถูกยกเลิกโดย {{userName}} <{{userEmail}}>",
|
||||
"edited": "ธุรกรรมถูกแก้ไขโดย {{userName}} <{{userEmail}}>",
|
||||
"viewed": "ธุรกรรมถูกดูโดย {{userName}} <{{userEmail}}>",
|
||||
"signed": "ธุรกรรมถูกลงนามโดย {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "ลายเซ็นธุรกรรมถูกปฏิเสธโดย {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "การเปิดเผยบันทึกอิเล็กทรอนิกส์และลายเซ็นถูกยอมรับโดย {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> อัปเดตภาษาเป็น {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "ส่งอีเมลเชิญไปยัง {{userName}} <{{userEmail}}>",
|
||||
"view": "คำเชิญให้ดูเอกสารถูกส่งไปยัง {{userName}} <{{userEmail}}> แล้ว",
|
||||
"resent": "ส่งอีเมลเชิญอีกครั้งไปยัง {{recipientName}} <{{recipientEmail}}> โดย {{senderName}} <{{senderEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "ผู้ลงนามถูกมอบหมายใหม่โดย {{fromName}} <{{fromEmail}}> ไปยัง {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> ถูกมอบหมายใหม่โดย {{fromName}} <{{fromEmail}}> ไปยัง {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "ธุรกรรมแบบเผชิญหน้าเริ่มต้นโดย {{userName}} <{{userEmail}}>",
|
||||
"verification": "การยืนยันลายเซ็นแบบเผชิญหน้าถูกยอมรับโดย {{userName}} <{{userEmail}}>"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "กระบวนการผู้ช่วยถูกยอมรับโดย {{userName}} <{{userEmail}}>"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "ลายเซ็น",
|
||||
"initial": "อักษรย่อ",
|
||||
"edit": "แก้ไข",
|
||||
"styleSelection": "เลือกรูปแบบ"
|
||||
},
|
||||
"subtitle": "สร้างลายเซ็นดิจิทัลของคุณ",
|
||||
"tabs": {
|
||||
"select": "เลือก",
|
||||
"draw": "วาด",
|
||||
"upload": "อัปโหลด"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "ยืนยันชื่อของคุณและเลือกรูปแบบลายเซ็น",
|
||||
"requiredFields": "กรุณากรอกข้อมูล",
|
||||
"fullName": {
|
||||
"label": "ชื่อเต็ม",
|
||||
"required": "*",
|
||||
"placeholder": "กรอกชื่อเต็ม"
|
||||
},
|
||||
"initials": {
|
||||
"label": "อักษรย่อ",
|
||||
"required": "*",
|
||||
"placeholder": "กรอกอักษรย่อ"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "วาดลายเซ็นของคุณ",
|
||||
"required": "*",
|
||||
"requiredFields": "เป็นช่องที่ต้องกรอก",
|
||||
"signature": "ลายเซ็น",
|
||||
"initials": "อักษรย่อ",
|
||||
"clearSignature": "ล้างลายเซ็น",
|
||||
"fullNameBox": {
|
||||
"label": "ลายเซ็นเต็ม",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "อักษรย่อ",
|
||||
"required": "*",
|
||||
"placeholder": "ป้อนอักษรย่อ"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "ต้องมีทั้งลายเซ็นและอักษรย่อ",
|
||||
"requirements": "ใช้รูปภาพขนาด 300×100px สำหรับลายเซ็น และ 100×100px สำหรับอักษรย่อ สูงสุด 300KB รองรับ: .png, .jpg",
|
||||
"signature": {
|
||||
"uploadLabel": "อัปโหลดลายเซ็น",
|
||||
"uploadHint": "JPG, PNG (300×100px, สูงสุด 300KB)",
|
||||
"browseButton": "เรียกดู",
|
||||
"uploadedLabel": "ลายเซ็น ✓",
|
||||
"changeButton": "เปลี่ยนลายเซ็น",
|
||||
"altText": "รูปภาพลายเซ็นที่อัปโหลด"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "อัปโหลดอักษรย่อ",
|
||||
"uploadHint": "JPG, PNG (100×100px, สูงสุด 300KB)",
|
||||
"browseButton": "เรียกดู",
|
||||
"uploadedLabel": "อักษรย่อ ✓",
|
||||
"changeButton": "เปลี่ยนอักษรย่อ",
|
||||
"altText": "รูปภาพอักษรย่อที่อัปโหลด"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "ฉันเข้าใจว่าฉันกำลังลงนามในเอกสารนี้",
|
||||
"cancelButton": "ยกเลิก",
|
||||
"adoptButton": "ใช้ลายเซ็นและลงนาม"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "กรุณากรอกข้อมูลในช่องนี้",
|
||||
"fileTooLarge": "ขนาดไฟล์ต้องน้อยกว่า 300KB",
|
||||
"invalidFileType": "รองรับเฉพาะไฟล์ .png, .jpg และ .jpeg",
|
||||
"signatureRequired": "กรุณาเพิ่มลายเซ็น",
|
||||
"initialsRequired": "กรุณาเพิ่มอักษรย่อ"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "เพิ่มตราประทับ",
|
||||
"edit": "แก้ไขตราประทับ"
|
||||
},
|
||||
"closeButton": "ปิดหน้าต่าง",
|
||||
"fileRequirements": "ขนาดสูงสุด = 400Kb | ประเภทไฟล์ที่รองรับ = .png, .jpg, .jpeg",
|
||||
"dragDropLabel": "ลากและวางรูปภาพ หรือคลิกเพื่ออัปโหลด",
|
||||
"previewAltText": "ตัวอย่างตราประทับ",
|
||||
"changeImageButton": "เปลี่ยนรูปภาพ",
|
||||
"clearButton": "ปิด",
|
||||
"saveButton": "บันทึก",
|
||||
"updateButton": "อัปเดต",
|
||||
"errors": {
|
||||
"fileTooLarge": "ขนาดไฟล์เกินขีดจำกัด 400KB",
|
||||
"invalidFileType": "รองรับเฉพาะไฟล์ .png, .jpg และ .jpeg",
|
||||
"uploadFailed": "อัปโหลดรูปภาพไม่สำเร็จ กรุณาลองอีกครั้ง"
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "ไฟล์แนบ",
|
||||
"subtitle": {
|
||||
"hasFile": "จัดการไฟล์แนบของคุณ",
|
||||
"noFile": "อัปโหลดไฟล์แนบ"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "กำลังอัปโหลดไฟล์...",
|
||||
"shimmerText": "กำลังอัปโหลดไฟล์..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "วางไฟล์ของคุณที่นี่",
|
||||
"default": "อัปโหลดหรือลากและวางไฟล์",
|
||||
"fileTypes": "PDF, DOCX, JPG, PNG, TXT (สูงสุด 10MB)",
|
||||
"browseButton": "เรียกดูไฟล์"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "อัปโหลดสำเร็จ",
|
||||
"deleteButton": "ลบไฟล์"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "ปิด",
|
||||
"uploading": "กำลังอัปโหลด...",
|
||||
"deleting": "กำลังลบ...",
|
||||
"saved": "บันทึกไฟล์แล้ว!",
|
||||
"done": "เสร็จสิ้น",
|
||||
"uploadFile": "อัปโหลดไฟล์"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "ขนาดไฟล์เกินขีดจำกัด 10MB",
|
||||
"invalidFileType": "รองรับเฉพาะไฟล์ PDF, DOCX, JPG, PNG และ TXT",
|
||||
"uploadFailed": "อัปโหลดไฟล์ไม่สำเร็จ กรุณาลองอีกครั้ง",
|
||||
"deleteFailed": "ลบไฟล์ไม่สำเร็จ กรุณาลองอีกครั้ง",
|
||||
"noFileSelected": "กรุณาเลือกไฟล์ก่อนดำเนินการต่อ"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "การอัปโหลดไฟล์",
|
||||
"deleteFile": "ลบไฟล์"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "จีน (ตัวย่อ)",
|
||||
"zh_TW": "จีน (ตัวเต็ม)",
|
||||
"da": "เดนมาร์ก",
|
||||
"nl_NL": "ดัตช์",
|
||||
"en": "อังกฤษ",
|
||||
"fi": "ฟินแลนด์",
|
||||
"fr": "ฝรั่งเศส",
|
||||
"de": "เยอรมัน",
|
||||
"it": "อิตาลี",
|
||||
"ja": "ญี่ปุ่น",
|
||||
"ko": "เกาหลี",
|
||||
"no": "นอร์เวย์",
|
||||
"pt_BR": "โปรตุเกส (บราซิล)",
|
||||
"ru": "รัสเซีย",
|
||||
"es": "สเปน",
|
||||
"es_MX": "สเปน (เม็กซิโก)",
|
||||
"sv": "สวีเดน",
|
||||
"th": "ไทย",
|
||||
"he": "ฮีบรู"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "เซสชันหมดอายุ",
|
||||
"description": "ลิงก์เซ็นเอกสารนี้หมดอายุเนื่องจากการไม่มีการใช้งานหรือเซสชันหมดเวลา กรุณากลับไปที่อีเมลของคุณและคลิกลิงก์อีกครั้งเพื่อดำเนินการเซ็นชื่อต่อ"
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 การลงนามเสร็จสมบูรณ์!",
|
||||
"subtitle": "เอกสารได้รับการลงนามเรียบร้อยแล้ว",
|
||||
"thankYou": "ขอบคุณที่ลงนาม!",
|
||||
"message": "คุณจะได้รับอีเมลยืนยันเมื่อเอกสารได้รับการลงนามโดยทุกฝ่าย",
|
||||
"passDevice": "ตอนนี้คุณสามารถส่งคืนอุปกรณ์ให้ <strong>{{senderName}}</strong>",
|
||||
"continueButton": "ดำเนินการต่อ"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "点击<0>我同意</0>,即表示您确认已阅读 <1>电子记录和签名披露</1>,并同意在审查和执行本文档时使用电子记录和签名。",
|
||||
"note": "注意:",
|
||||
"noteText": "同意此条款并不意味着您立即签署文档。仅允许您以电子方式审阅文档。在签署之前,您将有机会完整审阅文档。"
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "我同意",
|
||||
"processing": "处理中...",
|
||||
"close": "关闭",
|
||||
"downloadPdf": "下载 PDF",
|
||||
"downloading": "下载中..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "AI 摘要",
|
||||
"completeSign": "完成签署",
|
||||
"sign": "签署",
|
||||
"processing": "处理中...",
|
||||
"options": "下载"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "下载 PDF",
|
||||
"auditTrail": "审计跟踪",
|
||||
"reassignSigner": "重新分配签署人",
|
||||
"cancelTransaction": "取消交易",
|
||||
"viewTerms": "查看条款和条件",
|
||||
"helpSupport": "帮助与支持",
|
||||
"about": "关于 SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "文档",
|
||||
"pages": "页数:{{count}}",
|
||||
"noDocuments": "没有可用文档。"
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "准备好完成了吗?",
|
||||
"readyDesc": "您已完成必填字段。请检查您的工作,然后选择完成。",
|
||||
"finish": "完成",
|
||||
"submitting": "提交中...",
|
||||
"start": "开始",
|
||||
"next": "下一步",
|
||||
"agreementText": "签署即表示我同意 Sign Made Easy <0>条款和条件。</0>"
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "全部完成!",
|
||||
"title": "感谢您的签署",
|
||||
"message": "您的文档现已完成并安全存储。我们已通过电子邮件发送了一份副本给您。"
|
||||
},
|
||||
"declined": {
|
||||
"hit": "操作已取消!",
|
||||
"title": "下次吧!",
|
||||
"message": "您的请求已成功取消。"
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "操作已取消!",
|
||||
"title": "下次吧!",
|
||||
"message": "您的请求已成功取消。"
|
||||
},
|
||||
"download": "下载",
|
||||
"downloading": "下载中...",
|
||||
"downloadSuccess": "文件下载成功。",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDF 文档",
|
||||
"audit": "审计跟踪",
|
||||
"selectFormat": "选择格式"
|
||||
},
|
||||
"downloadError": "文件下载失败,请重试。",
|
||||
"appsTitle": "使用我们的应用提高效率",
|
||||
"formsTitle": "轻松生成表单",
|
||||
"docsTitle": "生成文档(发票、报告、报价)",
|
||||
"tryNow": "立即试用",
|
||||
"footerText": "版权所有 2026 Sign Made Easy。保留所有权利。<0>隐私政策</0> | <1>合理使用政策</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "重新分配签署人",
|
||||
"successSubtitle": "文档已成功重新分配",
|
||||
"successTitle": "谢谢您!",
|
||||
"successMessage": "文档已成功重新分配给新的签署人。",
|
||||
"fields": {
|
||||
"firstName": "名字",
|
||||
"lastName": "姓氏",
|
||||
"email": "电子邮件",
|
||||
"language": "语言",
|
||||
"message": "可选消息"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "请输入您的名字",
|
||||
"lastName": "请输入您的姓氏",
|
||||
"email": "your.email@example.com",
|
||||
"message": "在此处撰写您的消息..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "提交",
|
||||
"submitting": "提交中...",
|
||||
"cancel": "取消"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "名字为必填项",
|
||||
"firstNameMin": "名字至少需要2个字符",
|
||||
"lastNameRequired": "姓氏为必填项",
|
||||
"lastNameMin": "姓氏至少需要2个字符",
|
||||
"emailRequired": "电子邮件为必填项",
|
||||
"emailInvalid": "电子邮件地址无效"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "取消交易",
|
||||
"description": "您确定要取消此交易吗?请在下方提供取消原因。",
|
||||
"placeholder": "请提供取消原因...",
|
||||
"buttons": {
|
||||
"no": "不,不要取消",
|
||||
"yes": "是的,取消它"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "取消原因为必填项"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "取消交易",
|
||||
"message": "交易已成功取消。确认邮件已发送。",
|
||||
"passBackDevice": "您现在可以将设备交还给{{senderName}}。",
|
||||
"continueButton": "继续"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "交易审计",
|
||||
"meta.transaction_id": "交易 ID",
|
||||
"meta.transaction_status": "交易状态",
|
||||
"meta.files": "文件",
|
||||
"audit.title": "完整审计跟踪",
|
||||
"audit.description": "请更新以下主题和消息以获得自定义消息。",
|
||||
"table.header.actions": "操作",
|
||||
"table.header.language": "语言",
|
||||
"table.header.ip_address": "IP 地址",
|
||||
"table.header.date": "日期",
|
||||
"status.completed": "已完成",
|
||||
"status.pending": "待处理",
|
||||
"status.failed": "失败",
|
||||
"action.created": "已创建",
|
||||
"action.updated": "已更新",
|
||||
"action.deleted": "已删除",
|
||||
"action.viewed": "已查看",
|
||||
"action.signed": "已签署",
|
||||
"action.uploaded": "已上传",
|
||||
"action.downloaded": "已下载",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "交易审计",
|
||||
"meta": {
|
||||
"transactionId": "交易 ID",
|
||||
"transactionStatus": "交易状态",
|
||||
"files": "文件"
|
||||
},
|
||||
"audit": {
|
||||
"title": "完整审计跟踪",
|
||||
"description": "请更新以下主题和消息以获得自定义消息。"
|
||||
},
|
||||
"table": {
|
||||
"actions": "操作",
|
||||
"language": "语言",
|
||||
"ipAddress": "IP 地址",
|
||||
"date": "日期"
|
||||
},
|
||||
"status": {
|
||||
"completed": "已完成",
|
||||
"pending": "待处理",
|
||||
"failed": "失败"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "交易由 {{userName}} <{{userEmail}}> 创建",
|
||||
"sent": "交易由 {{userName}} <{{userEmail}}> 发送",
|
||||
"cancelled": "交易由 {{userName}} <{{userEmail}}> 取消",
|
||||
"edited": "交易由 {{userName}} <{{userEmail}}> 编辑",
|
||||
"viewed": "交易由 {{userName}} <{{userEmail}}> 查看",
|
||||
"signed": "交易由 {{userName}} <{{userEmail}}> 签署"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "交易签名被 {{userName}} <{{userEmail}}> 拒绝"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "电子记录和签名披露已被 {{userName}} <{{userEmail}}> 接受"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> 将语言更新为 {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "邀请邮件已发送至 {{userName}} <{{userEmail}}>",
|
||||
"view": "查看文档的邀请已发送给 {{userName}} <{{userEmail}}>",
|
||||
"resent": "邀请邮件由 {{senderName}} <{{senderEmail}}> 重新发送至 {{recipientName}} <{{recipientEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "签署人由 {{fromName}} <{{fromEmail}}> 重新分配给 {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> 被 {{fromName}} <{{fromEmail}}> 重新分配给 {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "面对面交易由 {{userName}} <{{userEmail}}> 启动",
|
||||
"verification": "面对面签名验证已被 {{userName}} <{{userEmail}}> 接受"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "协调员流程已被 {{userName}} <{{userEmail}}> 接受"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "签名",
|
||||
"initial": "首字母",
|
||||
"edit": "编辑",
|
||||
"styleSelection": "样式选择"
|
||||
},
|
||||
"subtitle": "创建您的数字签名",
|
||||
"tabs": {
|
||||
"select": "选择",
|
||||
"draw": "绘制",
|
||||
"upload": "上传"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "确认您的姓名并选择签名样式。",
|
||||
"requiredFields": "必填字段。",
|
||||
"fullName": {
|
||||
"label": "全名",
|
||||
"required": "*",
|
||||
"placeholder": "输入全名"
|
||||
},
|
||||
"initials": {
|
||||
"label": "首字母缩写",
|
||||
"required": "*",
|
||||
"placeholder": "输入首字母缩写"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "绘制您的签名。",
|
||||
"required": "*",
|
||||
"requiredFields": "为必填字段。",
|
||||
"signature": "签名",
|
||||
"initials": "首字母缩写",
|
||||
"clearSignature": "清除签名",
|
||||
"fullNameBox": {
|
||||
"label": "完整签名",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "首字母缩写",
|
||||
"required": "*",
|
||||
"placeholder": "输入首字母缩写"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "签名和首字母缩写均为必填。",
|
||||
"requirements": "签名使用300×100px图片,首字母缩写使用100×100px图片。最大300KB。支持:.png、.jpg。",
|
||||
"signature": {
|
||||
"uploadLabel": "上传签名",
|
||||
"uploadHint": "JPG、PNG(300×100px,最大300KB)",
|
||||
"browseButton": "浏览",
|
||||
"uploadedLabel": "签名 ✓",
|
||||
"changeButton": "更换签名",
|
||||
"altText": "已上传的签名图片"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "上传首字母缩写",
|
||||
"uploadHint": "JPG、PNG(100×100px,最大300KB)",
|
||||
"browseButton": "浏览",
|
||||
"uploadedLabel": "首字母缩写 ✓",
|
||||
"changeButton": "更换首字母缩写",
|
||||
"altText": "已上传的首字母缩写图片"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "我理解,我正在签署此文件。",
|
||||
"cancelButton": "取消",
|
||||
"adoptButton": "采用签名并签署"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "此字段为必填",
|
||||
"fileTooLarge": "文件大小必须小于300KB",
|
||||
"invalidFileType": "仅支持.png、.jpg和.jpeg文件",
|
||||
"signatureRequired": "请添加签名",
|
||||
"initialsRequired": "请添加首字母缩写"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "添加印章",
|
||||
"edit": "编辑印章"
|
||||
},
|
||||
"closeButton": "关闭弹窗",
|
||||
"fileRequirements": "最大尺寸 = 400KB | 支持的文件类型 = .png、.jpg、.jpeg",
|
||||
"dragDropLabel": "拖放图片,或点击上传",
|
||||
"previewAltText": "印章预览",
|
||||
"changeImageButton": "更换图片",
|
||||
"clearButton": "关闭",
|
||||
"saveButton": "保存",
|
||||
"updateButton": "更新",
|
||||
"errors": {
|
||||
"fileTooLarge": "文件大小超过400KB限制",
|
||||
"invalidFileType": "仅支持.png、.jpg和.jpeg文件",
|
||||
"uploadFailed": "上传图片失败,请重试。"
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "附件",
|
||||
"subtitle": {
|
||||
"hasFile": "管理您的附件",
|
||||
"noFile": "上传附件"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "正在上传文件...",
|
||||
"shimmerText": "正在上传文件..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "将文件拖放到此处",
|
||||
"default": "上传或拖放文件",
|
||||
"fileTypes": "PDF、DOCX、JPG、PNG、TXT(最大10MB)",
|
||||
"browseButton": "浏览文件"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "上传成功",
|
||||
"deleteButton": "删除文件"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "关闭",
|
||||
"uploading": "上传中...",
|
||||
"deleting": "删除中...",
|
||||
"saved": "文件已保存!",
|
||||
"done": "完成",
|
||||
"uploadFile": "上传文件"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "文件大小超过10MB限制",
|
||||
"invalidFileType": "仅支持PDF、DOCX、JPG、PNG和TXT文件",
|
||||
"uploadFailed": "上传文件失败,请重试。",
|
||||
"deleteFailed": "删除文件失败,请重试。",
|
||||
"noFileSelected": "请先选择文件"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "文件上传",
|
||||
"deleteFile": "删除文件"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "中文(简体)",
|
||||
"zh_TW": "中文(繁体)",
|
||||
"da": "丹麦语",
|
||||
"nl_NL": "荷兰语",
|
||||
"en": "英语",
|
||||
"fi": "芬兰语",
|
||||
"fr": "法语",
|
||||
"de": "德语",
|
||||
"it": "意大利语",
|
||||
"ja": "日语",
|
||||
"ko": "韩语",
|
||||
"no": "挪威语",
|
||||
"pt_BR": "葡萄牙语(巴西)",
|
||||
"ru": "俄语",
|
||||
"es": "西班牙语",
|
||||
"es_MX": "西班牙语(墨西哥)",
|
||||
"sv": "瑞典语",
|
||||
"th": "泰语",
|
||||
"he": "希伯来语"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "会话已过期",
|
||||
"description": "由于不活动或会话超时,此文档签署链接已过期。请返回您的电子邮件,再次点击链接以继续签署。"
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 签署完成!",
|
||||
"subtitle": "文档已成功签署",
|
||||
"thankYou": "感谢您的签署!",
|
||||
"message": "文档经所有相关方签署后,您将收到一封确认电子邮件。",
|
||||
"passDevice": "您现在可以将设备交还给 <strong>{{senderName}}</strong>",
|
||||
"continueButton": "继续"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,380 @@
|
|||
{
|
||||
"terms": {
|
||||
"agreementText": "點擊<0>我同意</0>,即表示您確認已閱讀 <1>電子記錄和簽名披露</1>,並同意在審查和執行本文檔時使用電子記錄和簽名。",
|
||||
"note": "注意:",
|
||||
"noteText": "同意此條款並不意味著您立即簽署文檔。僅允許您以電子方式審閱文檔。在簽署之前,您將有機會完整審閱文檔。"
|
||||
},
|
||||
"buttons": {
|
||||
"agree": "我同意",
|
||||
"processing": "處理中...",
|
||||
"close": "關閉",
|
||||
"downloadPdf": "下載 PDF",
|
||||
"downloading": "下載中..."
|
||||
},
|
||||
"header": {
|
||||
"aiSummary": "AI 摘要",
|
||||
"completeSign": "完成簽署",
|
||||
"sign": "簽署",
|
||||
"processing": "處理中...",
|
||||
"options": "下載"
|
||||
},
|
||||
"menu": {
|
||||
"downloadPdf": "下載 PDF",
|
||||
"auditTrail": "審計追蹤",
|
||||
"reassignSigner": "重新分配簽署人",
|
||||
"cancelTransaction": "取消交易",
|
||||
"viewTerms": "查看條款和條件",
|
||||
"helpSupport": "幫助與支援",
|
||||
"about": "關於 SME"
|
||||
},
|
||||
"sidebar": {
|
||||
"documents": "文件",
|
||||
"pages": "頁數:{{count}}",
|
||||
"noDocuments": "沒有可用文件。"
|
||||
},
|
||||
"footer": {
|
||||
"readyTitle": "準備好完成了嗎?",
|
||||
"readyDesc": "您已完成必填欄位。請檢查您的工作,然後選擇完成。",
|
||||
"finish": "完成",
|
||||
"submitting": "提交中...",
|
||||
"start": "開始",
|
||||
"next": "下一步",
|
||||
"agreementText": "簽署即表示我同意 Sign Made Easy <0>條款和條件。</0>"
|
||||
},
|
||||
"completion": {
|
||||
"complete": {
|
||||
"hit": "全部完成!",
|
||||
"title": "感謝您的簽署",
|
||||
"message": "您的文件現已完成並安全存儲。我們已通過電子郵件發送了一份副本給您。"
|
||||
},
|
||||
"declined": {
|
||||
"hit": "操作已取消!",
|
||||
"title": "下次吧!",
|
||||
"message": "您的請求已成功取消。"
|
||||
},
|
||||
"cancelled": {
|
||||
"hit": "操作已取消!",
|
||||
"title": "下次吧!",
|
||||
"message": "您的請求已成功取消。"
|
||||
},
|
||||
"download": "下載",
|
||||
"downloading": "下載中...",
|
||||
"downloadSuccess": "文件下載成功。",
|
||||
"downloadOptions": {
|
||||
"pdf": "PDF 文件",
|
||||
"audit": "審計追蹤",
|
||||
"selectFormat": "選擇格式"
|
||||
},
|
||||
"downloadError": "文件下載失敗,請重試。",
|
||||
"appsTitle": "使用我們的應用提高效率",
|
||||
"formsTitle": "輕鬆生成表單",
|
||||
"docsTitle": "生成文件(發票、報告、報價)",
|
||||
"tryNow": "立即試用",
|
||||
"footerText": "版權所有 2026 Sign Made Easy。保留所有權利。<0>隱私政策</0> | <1>合理使用政策</1>"
|
||||
},
|
||||
"reassign": {
|
||||
"title": "重新分配簽署人",
|
||||
"successSubtitle": "文件已成功重新分配",
|
||||
"successTitle": "謝謝您!",
|
||||
"successMessage": "文件已成功重新分配給新的簽署人。",
|
||||
"fields": {
|
||||
"firstName": "名字",
|
||||
"lastName": "姓氏",
|
||||
"email": "電子郵件",
|
||||
"language": "語言",
|
||||
"message": "可選訊息"
|
||||
},
|
||||
"placeholders": {
|
||||
"firstName": "請輸入您的名字",
|
||||
"lastName": "請輸入您的姓氏",
|
||||
"email": "your.email@example.com",
|
||||
"message": "在此處撰寫您的訊息..."
|
||||
},
|
||||
"buttons": {
|
||||
"submit": "提交",
|
||||
"submitting": "提交中...",
|
||||
"cancel": "取消"
|
||||
},
|
||||
"errors": {
|
||||
"firstNameRequired": "名字為必填項",
|
||||
"firstNameMin": "名字至少需要2個字符",
|
||||
"lastNameRequired": "姓氏為必填項",
|
||||
"lastNameMin": "姓氏至少需要2個字符",
|
||||
"emailRequired": "電子郵件為必填項",
|
||||
"emailInvalid": "電子郵件地址無效"
|
||||
}
|
||||
},
|
||||
"cancelModal": {
|
||||
"title": "取消交易",
|
||||
"description": "您確定要取消此交易嗎?請在下方提供取消原因。",
|
||||
"placeholder": "請提供取消原因...",
|
||||
"buttons": {
|
||||
"no": "不,不要取消",
|
||||
"yes": "是的,取消它"
|
||||
},
|
||||
"errors": {
|
||||
"reasonRequired": "取消原因為必填項"
|
||||
},
|
||||
"inPersonSuccess": {
|
||||
"title": "取消交易",
|
||||
"message": "交易已成功取消。確認郵件已發送。",
|
||||
"passBackDevice": "您現在可以將設備交還給{{senderName}}。",
|
||||
"continueButton": "繼續"
|
||||
}
|
||||
},
|
||||
"enTranslations": {
|
||||
"app.name": "Sign Made Easy",
|
||||
"app.subtitle": "交易審計",
|
||||
"meta.transaction_id": "交易 ID",
|
||||
"meta.transaction_status": "交易狀態",
|
||||
"meta.files": "文件",
|
||||
"audit.title": "完整審計追蹤",
|
||||
"audit.description": "請更新以下主題和訊息以獲得自定義訊息。",
|
||||
"table.header.actions": "操作",
|
||||
"table.header.language": "語言",
|
||||
"table.header.ip_address": "IP 地址",
|
||||
"table.header.date": "日期",
|
||||
"status.completed": "已完成",
|
||||
"status.pending": "待處理",
|
||||
"status.failed": "失敗",
|
||||
"action.created": "已創建",
|
||||
"action.updated": "已更新",
|
||||
"action.deleted": "已刪除",
|
||||
"action.viewed": "已查看",
|
||||
"action.signed": "已簽署",
|
||||
"action.uploaded": "已上傳",
|
||||
"action.downloaded": "已下載",
|
||||
"placeholder.not_available": "—"
|
||||
},
|
||||
"auditPage": {
|
||||
"appName": "Sign Made Easy",
|
||||
"subtitle": "交易審計",
|
||||
"meta": {
|
||||
"transactionId": "交易 ID",
|
||||
"transactionStatus": "交易狀態",
|
||||
"files": "文件"
|
||||
},
|
||||
"audit": {
|
||||
"title": "完整審計追蹤",
|
||||
"description": "請更新以下主題和訊息以獲得自定義訊息。"
|
||||
},
|
||||
"table": {
|
||||
"actions": "操作",
|
||||
"language": "語言",
|
||||
"ipAddress": "IP 地址",
|
||||
"date": "日期"
|
||||
},
|
||||
"status": {
|
||||
"completed": "已完成",
|
||||
"pending": "待處理",
|
||||
"failed": "失敗"
|
||||
},
|
||||
"fallback": {
|
||||
"notAvailable": "—"
|
||||
}
|
||||
},
|
||||
"audit": {
|
||||
"transaction": {
|
||||
"created": "交易由 {{userName}} <{{userEmail}}> 建立",
|
||||
"sent": "交易由 {{userName}} <{{userEmail}}> 發送",
|
||||
"cancelled": "交易由 {{userName}} <{{userEmail}}> 取消",
|
||||
"edited": "交易由 {{userName}} <{{userEmail}}> 編輯",
|
||||
"viewed": "交易由 {{userName}} <{{userEmail}}> 檢視",
|
||||
"signed": "交易由 {{userName}} <{{userEmail}}> 簽署"
|
||||
},
|
||||
"signature": {
|
||||
"declined": "交易簽名被 {{userName}} <{{userEmail}}> 拒絕"
|
||||
},
|
||||
"ers": {
|
||||
"accepted": "電子記錄和簽名披露已被 {{userName}} <{{userEmail}}> 接受"
|
||||
},
|
||||
"language": {
|
||||
"updated": "{{userName}} <{{userEmail}}> 將語言更新為 {{language}}"
|
||||
},
|
||||
"invitation": {
|
||||
"sent": "邀請郵件已發送至 {{userName}} <{{userEmail}}>",
|
||||
"view": "檢視文件的邀請已發送給 {{userName}} <{{userEmail}}>",
|
||||
"resent": "邀請郵件由 {{senderName}} <{{senderEmail}}> 重新發送至 {{recipientName}} <{{recipientEmail}}>"
|
||||
},
|
||||
"reassigned": {
|
||||
"to": "簽署人由 {{fromName}} <{{fromEmail}}> 重新分配給 {{toName}} <{{toEmail}}>",
|
||||
"complex": "{{personName}} <{{personEmail}}> 被 {{fromName}} <{{fromEmail}}> 重新分配給 {{toName}} <{{toEmail}}>"
|
||||
},
|
||||
"inperson": {
|
||||
"started": "面對面交易由 {{userName}} <{{userEmail}}> 啟動",
|
||||
"verification": "面對面簽名驗證已被 {{userName}} <{{userEmail}}> 接受"
|
||||
},
|
||||
"facilitator": {
|
||||
"accepted": "協調員流程已被 {{userName}} <{{userEmail}}> 接受"
|
||||
}
|
||||
},
|
||||
"signatureModal": {
|
||||
"title": {
|
||||
"signature": "簽名",
|
||||
"initial": "縮寫",
|
||||
"edit": "編輯",
|
||||
"styleSelection": "樣式選擇"
|
||||
},
|
||||
"subtitle": "創建您的數位簽名",
|
||||
"tabs": {
|
||||
"select": "選擇",
|
||||
"draw": "繪製",
|
||||
"upload": "上傳"
|
||||
},
|
||||
"selectTab": {
|
||||
"description": "確認您的姓名並選擇簽名樣式。",
|
||||
"requiredFields": "必填欄位。",
|
||||
"fullName": {
|
||||
"label": "全名",
|
||||
"required": "*",
|
||||
"placeholder": "輸入全名"
|
||||
},
|
||||
"initials": {
|
||||
"label": "縮寫",
|
||||
"required": "*",
|
||||
"placeholder": "輸入縮寫"
|
||||
}
|
||||
},
|
||||
"drawTab": {
|
||||
"description": "繪製您的簽名。",
|
||||
"required": "*",
|
||||
"requiredFields": "為必填欄位。",
|
||||
"signature": "簽名",
|
||||
"initials": "姓名縮寫",
|
||||
"clearSignature": "清除簽名",
|
||||
"fullNameBox": {
|
||||
"label": "完整簽名",
|
||||
"required": "*"
|
||||
},
|
||||
"initialsBox": {
|
||||
"label": "姓名縮寫",
|
||||
"required": "*",
|
||||
"placeholder": "輸入姓名縮寫"
|
||||
}
|
||||
},
|
||||
"uploadTab": {
|
||||
"requiredMessage": "簽名和縮寫均為必填。",
|
||||
"requirements": "簽名使用300×100px圖片,縮寫使用100×100px圖片。最大300KB。支援格式:.png、.jpg。",
|
||||
"signature": {
|
||||
"uploadLabel": "上傳簽名",
|
||||
"uploadHint": "JPG、PNG(300×100px,最大300KB)",
|
||||
"browseButton": "瀏覽",
|
||||
"uploadedLabel": "簽名 ✓",
|
||||
"changeButton": "更改簽名",
|
||||
"altText": "已上傳的簽名圖片"
|
||||
},
|
||||
"initials": {
|
||||
"uploadLabel": "上傳縮寫",
|
||||
"uploadHint": "JPG、PNG(100×100px,最大300KB)",
|
||||
"browseButton": "瀏覽",
|
||||
"uploadedLabel": "縮寫 ✓",
|
||||
"changeButton": "更改縮寫",
|
||||
"altText": "已上傳的縮寫圖片"
|
||||
}
|
||||
},
|
||||
"footer": {
|
||||
"agreementText": "我理解我正在簽署此文件。",
|
||||
"cancelButton": "取消",
|
||||
"adoptButton": "採用簽名並簽署"
|
||||
},
|
||||
"errors": {
|
||||
"requiredField": "此欄位為必填",
|
||||
"fileTooLarge": "檔案大小必須小於300KB",
|
||||
"invalidFileType": "僅支援.png、.jpg和.jpeg檔案",
|
||||
"signatureRequired": "請添加簽名",
|
||||
"initialsRequired": "請添加縮寫"
|
||||
}
|
||||
},
|
||||
"stampModal": {
|
||||
"title": {
|
||||
"add": "添加印章",
|
||||
"edit": "編輯印章"
|
||||
},
|
||||
"closeButton": "關閉模態框",
|
||||
"fileRequirements": "最大尺寸 = 400Kb | 支援的檔案類型 = .png、.jpg、.jpeg",
|
||||
"dragDropLabel": "拖放圖片,或點擊上傳",
|
||||
"previewAltText": "印章預覽",
|
||||
"changeImageButton": "更改圖片",
|
||||
"clearButton": "關閉",
|
||||
"saveButton": "儲存",
|
||||
"updateButton": "更新",
|
||||
"errors": {
|
||||
"fileTooLarge": "檔案大小超過400KB限制",
|
||||
"invalidFileType": "僅支援.png、.jpg和.jpeg檔案",
|
||||
"uploadFailed": "上傳圖片失敗。請重試。"
|
||||
}
|
||||
},
|
||||
"attachmentModal": {
|
||||
"title": "附件",
|
||||
"subtitle": {
|
||||
"hasFile": "管理您的附件",
|
||||
"noFile": "上傳附件"
|
||||
},
|
||||
"uploading": {
|
||||
"status": "正在上傳檔案...",
|
||||
"shimmerText": "正在上傳檔案..."
|
||||
},
|
||||
"uploadArea": {
|
||||
"dragging": "將檔案拖放到此處",
|
||||
"default": "上傳或拖放檔案",
|
||||
"fileTypes": "PDF、DOCX、JPG、PNG、TXT(最大10MB)",
|
||||
"browseButton": "瀏覽檔案"
|
||||
},
|
||||
"uploadedFile": {
|
||||
"status": "上傳成功",
|
||||
"deleteButton": "刪除檔案"
|
||||
},
|
||||
"buttons": {
|
||||
"close": "關閉",
|
||||
"uploading": "上傳中...",
|
||||
"deleting": "刪除中...",
|
||||
"saved": "檔案已儲存!",
|
||||
"done": "完成",
|
||||
"uploadFile": "上傳檔案"
|
||||
},
|
||||
"errors": {
|
||||
"fileTooLarge": "檔案大小超過10MB限制",
|
||||
"invalidFileType": "僅支援PDF、DOCX、JPG、PNG和TXT檔案",
|
||||
"uploadFailed": "上傳檔案失敗。請重試。",
|
||||
"deleteFailed": "刪除檔案失敗。請重試。",
|
||||
"noFileSelected": "請先選擇檔案再繼續"
|
||||
},
|
||||
"accessibility": {
|
||||
"fileUpload": "檔案上傳",
|
||||
"deleteFile": "刪除檔案"
|
||||
}
|
||||
},
|
||||
"languages": {
|
||||
"zh_CN": "中文(簡體)",
|
||||
"zh_TW": "中文(繁體)",
|
||||
"da": "丹麥語",
|
||||
"nl_NL": "荷蘭語",
|
||||
"en": "英語",
|
||||
"fi": "芬蘭語",
|
||||
"fr": "法語",
|
||||
"de": "德語",
|
||||
"it": "義大利語",
|
||||
"ja": "日語",
|
||||
"ko": "韓語",
|
||||
"no": "挪威語",
|
||||
"pt_BR": "葡萄牙語(巴西)",
|
||||
"ru": "俄語",
|
||||
"es": "西班牙語",
|
||||
"es_MX": "西班牙語(墨西哥)",
|
||||
"sv": "瑞典語",
|
||||
"th": "泰語",
|
||||
"he": "希伯來語"
|
||||
},
|
||||
"session-expired": {
|
||||
"title": "會話已過期",
|
||||
"description": "由於不活動或會話超時,此文件簽署連結已過期。請返回您的電子郵件,再次點擊連結以繼續簽署。"
|
||||
},
|
||||
"inPersonComplete": {
|
||||
"title": "🎉 簽署完成!",
|
||||
"subtitle": "文件已成功簽署",
|
||||
"thankYou": "感謝您的簽署!",
|
||||
"message": "文件經所有相關方簽署後,您將收到一封確認電子郵件。",
|
||||
"passDevice": "您現在可以將設備交還給 <strong>{{senderName}}</strong>",
|
||||
"continueButton": "繼續"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
|
|
@ -0,0 +1,73 @@
|
|||
|
||||
import { BrowserRouter, Navigate, Route, Routes, useLocation } from "react-router-dom";
|
||||
import { Suspense, lazy, useEffect } from "react";
|
||||
|
||||
import Loader from "./helper/Loader.jsx";
|
||||
import AppLayout from "./layout/AppLayout";
|
||||
|
||||
// Lazy loaded pages
|
||||
const Home = lazy(() => import("./pages/Home"));
|
||||
const ErrorPage = lazy(() => import("./pages/ErrorPage"));
|
||||
const AccessDenied = lazy(() => import("./pages/AccessDenied"));
|
||||
const CompletionScreen = lazy(() => import("./pages/CompletionScreen"));
|
||||
const ReassignPage = lazy(() => import("./pages/ReassignPage"));
|
||||
const ReassignInfoPage = lazy(() => import("./pages/ReassignInfoPage.jsx"))
|
||||
const AuditTrails = lazy(() => import("./pages/AuditTrails.jsx"))
|
||||
const SessionExpired = lazy(() => import("./pages/SessionExpired.jsx"))
|
||||
const ExpiredPage = lazy(() => import("./pages/ExpiredPage.jsx"))
|
||||
const EmailTemplateEditorPage = lazy(() => import("./pages/EmailTemplateEditorPage.jsx"));
|
||||
|
||||
const titles = {
|
||||
'/': 'Sign',
|
||||
'/sign': 'Sign',
|
||||
'/preview': 'Preview',
|
||||
'/error': 'Error',
|
||||
'/expired': "Sign",
|
||||
'/access-denied': 'Access Denied',
|
||||
'/session-expired': 'Session Expired',
|
||||
'/status': 'Sign',
|
||||
'/reassign': 'Reassign',
|
||||
'/reassign-info': 'Reassign',
|
||||
'/audit-trails-info': 'Audit Trails'
|
||||
};
|
||||
|
||||
|
||||
const AppRoutes = () => {
|
||||
const location = useLocation();
|
||||
|
||||
useEffect(() => {
|
||||
document.title = titles[location.pathname] || 'Sign';
|
||||
}, [location.pathname]);
|
||||
|
||||
return (
|
||||
<Routes>
|
||||
<Route element={<AppLayout />}>
|
||||
<Route path="/" element={<Navigate to="/sign" replace />} />
|
||||
<Route path="/sign" element={<Home />} />
|
||||
<Route path="/preview" element={<Home />} />
|
||||
<Route path="/error" element={<ErrorPage />} />
|
||||
<Route path="/expired" element={<ExpiredPage />} />
|
||||
<Route path="/access-denied" element={<AccessDenied />} />
|
||||
<Route path="/session-expired" element={<SessionExpired />} />
|
||||
<Route path="/status" element={<CompletionScreen />} />
|
||||
<Route path="/reassign" element={<ReassignPage />} />
|
||||
<Route path="/reassign-info" element={<ReassignInfoPage />} />
|
||||
<Route path="/audit-trails-info" element={<AuditTrails />} />
|
||||
<Route path="*" element={<div />} />
|
||||
</Route>
|
||||
<Route path="/email-template-editor" element={<EmailTemplateEditorPage />} />
|
||||
</Routes>
|
||||
);
|
||||
};
|
||||
|
||||
const App = () => {
|
||||
return (
|
||||
<BrowserRouter>
|
||||
<Suspense fallback={<Loader transparentbg={false} />}>
|
||||
<AppRoutes />
|
||||
</Suspense>
|
||||
</BrowserRouter>
|
||||
);
|
||||
};
|
||||
|
||||
export default App;
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
import React from 'react'
|
||||
|
||||
const CompletionScreenShimmerUI = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-gradient-to-b from-white to-blue-50 flex flex-col">
|
||||
{/* Header Skeleton */}
|
||||
<header className="px-4 py-2 flex justify-center sm:justify-start items-center bg-white shadow-md">
|
||||
<div className="w-40 h-8 bg-gray-200 animate-pulse rounded"></div>
|
||||
</header>
|
||||
|
||||
{/* Main Content Skeleton */}
|
||||
<main className="flex flex-col items-center text-center px-4 flex-grow mt-6">
|
||||
<div className="w-3/4 max-w-2xl h-8 bg-gray-200 animate-pulse rounded mb-2"></div>
|
||||
<div className="w-1/2 max-w-md h-4 bg-gray-200 animate-pulse rounded mb-4"></div>
|
||||
<div className="w-32 h-10 bg-gray-300 animate-pulse rounded-lg mb-6"></div>
|
||||
|
||||
{/* Image Placeholder */}
|
||||
<div className="w-64 h-64 bg-gray-200 animate-pulse rounded-lg mb-8"></div>
|
||||
|
||||
{/* Apps Section Skeleton */}
|
||||
<div className="w-full max-w-4xl">
|
||||
<div className="w-48 h-6 bg-gray-200 animate-pulse rounded mx-auto mb-4"></div>
|
||||
<div className="flex flex-col sm:flex-row gap-4 justify-center">
|
||||
<div className="bg-white rounded-lg shadow p-4 w-full sm:w-80 h-32 animate-pulse"></div>
|
||||
<div className="bg-white rounded-lg shadow p-4 w-full sm:w-80 h-32 animate-pulse"></div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
{/* Footer Skeleton */}
|
||||
<footer className="text-center py-2 bg-white">
|
||||
<div className="w-2/3 h-3 bg-gray-200 animate-pulse rounded mx-auto"></div>
|
||||
</footer>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default CompletionScreenShimmerUI
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
const DocFormOverlayShimmerUI = () => {
|
||||
return (
|
||||
<>
|
||||
<div className="flex flex-col ">
|
||||
<div className="skeleton h-15 w-full"></div>
|
||||
<main className="flex w-full">
|
||||
{/* Sidebar - Documents List with Skeleton */}
|
||||
<section className="hidden max-h-[90vh] w-full min-w-[20vw] border-r border-slate-300 bg-base-100 md:flex flex-col">
|
||||
<div className="flex-1 overflow-y-auto no-scrollbar mx-3 my-4 p-2 space-y-3 max-w-[313px]">
|
||||
{/* Documents Header */}
|
||||
<div className="h-15 skeleton text-white text-center p-3 rounded-2xl font-semibold text-sm">
|
||||
|
||||
</div>
|
||||
|
||||
{/* Skeleton Document Items */}
|
||||
{Array.from({ length: 3 }).map((_, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className="collapse border border-base-300 rounded-xl bg-base-100 shadow-sm"
|
||||
>
|
||||
<div className="collapse-title font-semibold flex flex-col">
|
||||
{/* Document Name Skeleton */}
|
||||
<div className="skeleton h-4 w-3/4 rounded"></div>
|
||||
{/* Pages Count Skeleton */}
|
||||
<div className="skeleton h-3 w-1/3 mt-2 rounded"></div>
|
||||
</div>
|
||||
|
||||
<div className="collapse-content p-1 bg-base-200 rounded-b-xl">
|
||||
<div className="max-h-[240px] overflow-y-auto no-scrollbar flex flex-col items-center gap-3">
|
||||
{/* Thumbnail Skeletons */}
|
||||
{Array.from({ length: 2 }).map((_, pageIndex) => (
|
||||
<div
|
||||
key={pageIndex}
|
||||
className="relative border rounded-lg p-1 bg-white shadow-sm w-full"
|
||||
>
|
||||
<div className="skeleton w-[150px] h-[200px] rounded-md"></div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Main Document Viewer Area with Skeleton */}
|
||||
<section className="h-full w-full bg-docs-bg mt-3 md:mt-0">
|
||||
<div className="flex flex-col h-full">
|
||||
<div className="flex-1 flex flex-col">
|
||||
<div
|
||||
// ref={containerRef}
|
||||
className="bg-white min-w-[80vw] min-h-[80vh] max-h-[85vh] overflow-auto no-scrollbar p-0.5 sm:p-6 lg:p-8 flex flex-col items-center gap-6"
|
||||
>
|
||||
{Array.from({ length: 2 }).map((_, docIndex) => (
|
||||
<div key={docIndex} className="flex flex-col w-full">
|
||||
{/* Document Title Skeleton */}
|
||||
<div className="skeleton h-6 w-80 mx-auto my-3 md:mb-4 rounded"></div>
|
||||
|
||||
<div className="w-full flex flex-col items-center gap-8">
|
||||
{Array.from({ length: 3 }).map((_, pageIndex) => (
|
||||
<div
|
||||
key={pageIndex}
|
||||
className="block w-full max-w-full relative"
|
||||
>
|
||||
<div className="w-full md:max-w-[60vw] lg:max-w-[60vw] xl:max-w-[60vw] 2xl:max-w-[65vw] md:mx-auto">
|
||||
{/* Full Page Skeleton - A4-like aspect ratio */}
|
||||
<div className="skeleton w-full aspect-[8.5/11] rounded-2xl"></div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
{/* Skeleton Footer */}
|
||||
<footer className="fixed bottom-0 left-0 right-0 z-40 bg-white backdrop-blur-sm border-t border-gray-200 px-4 md:px-6 py-3">
|
||||
<div className="flex flex-col items-center justify-between max-w-7xl mx-auto">
|
||||
{/* Mobile: Start/Next Button Skeleton */}
|
||||
<div className="flex sm:hidden items-center justify-center gap-2 w-full mb-2">
|
||||
<div className="skeleton h-9 w-28 rounded-xl"></div>
|
||||
</div>
|
||||
|
||||
{/* Desktop: Terms & Conditions Skeleton */}
|
||||
<div className="sm:flex items-center justify-center w-full">
|
||||
<div className="skeleton h-4 w-96 rounded"></div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export default DocFormOverlayShimmerUI
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
import bgComplete from "../assets/bgComplete.png";
|
||||
|
||||
export default function ExpiredPageShimmerUI() {
|
||||
return (
|
||||
<div
|
||||
className="relative min-h-[100dvh] flex flex-col overflow-hidden animate-pulse"
|
||||
style={{
|
||||
backgroundImage: `url(${bgComplete})`,
|
||||
backgroundSize: "cover",
|
||||
backgroundPosition: "center",
|
||||
backgroundRepeat: "no-repeat",
|
||||
}}
|
||||
>
|
||||
{/* Header */}
|
||||
<header className="px-4 py-2 bg-white/80 shadow-md">
|
||||
<div className="w-40 h-8 bg-gray-200 rounded"></div>
|
||||
</header>
|
||||
|
||||
{/* Main */}
|
||||
<main className="flex flex-col items-center justify-center flex-grow px-4">
|
||||
<div className="w-72 h-10 bg-gray-200 rounded mb-6"></div>
|
||||
|
||||
<div className="w-52 h-52 rounded-full bg-gray-200 mb-6"></div>
|
||||
|
||||
<div className="w-full max-w-xl space-y-3">
|
||||
<div className="h-4 bg-gray-200 rounded"></div>
|
||||
<div className="h-4 bg-gray-200 rounded w-11/12 mx-auto"></div>
|
||||
<div className="h-4 bg-gray-200 rounded w-9/12 mx-auto"></div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
import axios from "axios";
|
||||
import { navigateTo } from "../helper/navigator";
|
||||
|
||||
const api = axios.create({
|
||||
baseURL: import.meta.env.VITE_BASE_API_URL,
|
||||
headers: {
|
||||
"X-AUTH-TYPE": "TRANSACTIONAL",
|
||||
"ngrok-skip-browser-warning": "69420",
|
||||
},
|
||||
});
|
||||
|
||||
// Request Interceptor — auto attach uuid from URL
|
||||
api.interceptors.request.use(
|
||||
(config) => {
|
||||
const uuid = new URLSearchParams(window.location.search).get("uuid");
|
||||
if (uuid) {
|
||||
config.headers.Authorization = `${uuid}`;
|
||||
// config.headers.Authorization = `Bearer ${uuid}`;
|
||||
}
|
||||
return config;
|
||||
},
|
||||
(error) => Promise.reject(error)
|
||||
);
|
||||
|
||||
// Response Interceptor — global error routing
|
||||
api.interceptors.response.use(
|
||||
(response) => response,
|
||||
(error) => {
|
||||
const status = error?.response?.status;
|
||||
const message = error?.response?.data?.message || "Something went wrong.";
|
||||
const errorCode = error?.response?.data?.errorCode || null;
|
||||
const uuid = new URLSearchParams(window.location.search).get("uuid");
|
||||
|
||||
if (status === 401) {
|
||||
navigateTo("/session-expired", {
|
||||
replace: true,
|
||||
state: { status, message, errorCode, uuid },
|
||||
});
|
||||
} else {
|
||||
navigateTo("/error", {
|
||||
replace: true,
|
||||
state: { status, message, errorCode },
|
||||
});
|
||||
}
|
||||
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
export default api;
|
||||
|
After Width: | Height: | Size: 174 KiB |
|
After Width: | Height: | Size: 469 B |
|
After Width: | Height: | Size: 232 KiB |
|
After Width: | Height: | Size: 6.8 KiB |
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 286 B |
|
After Width: | Height: | Size: 411 B |
|
After Width: | Height: | Size: 239 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M20.3334 19.6667L17.9834 22.0167C16.6834 23.3167 16.6834 25.4333 17.9834 26.7333C19.2834 28.0333 21.4001 28.0333 22.7001 26.7333L26.4001 23.0333C27.6487 21.7811 28.3498 20.085 28.3498 18.3167C28.3498 16.5484 27.6487 14.8522 26.4001 13.6C25.1479 12.3514 23.4517 11.6503 21.6834 11.6503C19.9151 11.6503 18.2189 12.3514 16.9668 13.6L12.9334 17.6333C12.4024 18.1639 11.9811 18.794 11.6937 19.4875C11.4062 20.181 11.2583 20.9243 11.2583 21.675C11.2583 22.4257 11.4062 23.169 11.6937 23.8625C11.9811 24.556 12.4024 25.1861 12.9334 25.7167" stroke="#FBC249" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M14.9999 36.6666H24.9999C33.3333 36.6666 36.6666 33.3333 36.6666 25V15C36.6666 6.66665 33.3333 3.33331 24.9999 3.33331H14.9999C6.66659 3.33331 3.33325 6.66665 3.33325 15V25C3.33325 33.3333 6.66659 36.6666 14.9999 36.6666Z" stroke="#0D6EFD" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
|
|
@ -0,0 +1,16 @@
|
|||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M37.5 36.25H36.25V5C36.25 2.9375 34.5625 1.25 32.5 1.25H17.5C15.4375 1.25 13.75 2.9375 13.75 5V7.5H7.5C5.4375 7.5 3.75 9.1875 3.75 11.25V36.25H2.5C1.8125 36.25 1.25 36.8125 1.25 37.5C1.25 38.1875 1.8125 38.75 2.5 38.75H37.5C38.1875 38.75 38.75 38.1875 38.75 37.5C38.75 36.8125 38.1875 36.25 37.5 36.25ZM26.25 33.75H33.75V36.25H26.25V33.75ZM16.25 5C16.25 4.3125 16.8125 3.75 17.5 3.75H32.5C33.1875 3.75 33.75 4.3125 33.75 5V31.25H26.25V11.25C26.25 9.1875 24.5625 7.5 22.5 7.5H16.25V5ZM6.25 11.25C6.25 10.5625 6.8125 10 7.5 10H22.5C23.1875 10 23.75 10.5625 23.75 11.25V36.25H20V29.375C20.6875 29.375 21.25 28.8125 21.25 28.125C21.25 27.4375 20.6875 26.875 20 26.875H10C9.3125 26.875 8.75 27.4375 8.75 28.125C8.75 28.8125 9.3125 29.375 10 29.375V36.25H6.25V11.25ZM17.5 29.375V36.25H12.5V29.375H17.5Z" fill="#0D6EFD"/>
|
||||
<path d="M9.375 14.375H10.0375C10.725 14.375 11.2875 13.8125 11.2875 13.125C11.2875 12.4375 10.725 11.875 10.0375 11.875H9.375C8.6875 11.875 8.125 12.4375 8.125 13.125C8.125 13.8125 8.6875 14.375 9.375 14.375Z" fill="#FBC249"/>
|
||||
<path d="M14.6748 14.375H15.3373C16.0248 14.375 16.5873 13.8125 16.5873 13.125C16.5873 12.4375 16.0248 11.875 15.3373 11.875H14.6748C13.9873 11.875 13.4248 12.4375 13.4248 13.125C13.4248 13.8125 13.9873 14.375 14.6748 14.375Z" fill="#FBC249"/>
|
||||
<path d="M19.9624 14.375H20.6249C21.3124 14.375 21.8749 13.8125 21.8749 13.125C21.8749 12.4375 21.3124 11.875 20.6249 11.875H19.9624C19.2749 11.875 18.7124 12.4375 18.7124 13.125C18.7124 13.8125 19.2749 14.375 19.9624 14.375Z" fill="#FBC249"/>
|
||||
<path d="M9.375 19.375H10.0375C10.725 19.375 11.2875 18.8125 11.2875 18.125C11.2875 17.4375 10.725 16.875 10.0375 16.875H9.375C8.6875 16.875 8.125 17.4375 8.125 18.125C8.125 18.8125 8.6875 19.375 9.375 19.375Z" fill="#FBC249"/>
|
||||
<path d="M14.6748 19.375H15.3373C16.0248 19.375 16.5873 18.8125 16.5873 18.125C16.5873 17.4375 16.0248 16.875 15.3373 16.875H14.6748C13.9873 16.875 13.4248 17.4375 13.4248 18.125C13.4248 18.8125 13.9873 19.375 14.6748 19.375Z" fill="#FBC249"/>
|
||||
<path d="M19.9624 19.375H20.6249C21.3124 19.375 21.8749 18.8125 21.8749 18.125C21.8749 17.4375 21.3124 16.875 20.6249 16.875H19.9624C19.2749 16.875 18.7124 17.4375 18.7124 18.125C18.7124 18.8125 19.2749 19.375 19.9624 19.375Z" fill="#FBC249"/>
|
||||
<path d="M10.0375 24.375C10.725 24.375 11.2875 23.8125 11.2875 23.125C11.2875 22.4375 10.725 21.875 10.0375 21.875H9.375C8.6875 21.875 8.125 22.4375 8.125 23.125C8.125 23.8125 8.6875 24.375 9.375 24.375H10.0375Z" fill="#FBC249"/>
|
||||
<path d="M14.6748 24.375H15.3373C16.0248 24.375 16.5873 23.8125 16.5873 23.125C16.5873 22.4375 16.0248 21.875 15.3373 21.875H14.6748C13.9873 21.875 13.4248 22.4375 13.4248 23.125C13.4248 23.8125 13.9873 24.375 14.6748 24.375Z" fill="#FBC249"/>
|
||||
<path d="M19.9624 24.375H20.6249C21.3124 24.375 21.8749 23.8125 21.8749 23.125C21.8749 22.4375 21.3124 21.875 20.6249 21.875H19.9624C19.2749 21.875 18.7124 22.4375 18.7124 23.125C18.7124 23.8125 19.2749 24.375 19.9624 24.375Z" fill="#FBC249"/>
|
||||
<path d="M29.375 13.75H30.625C31.3125 13.75 31.875 13.1875 31.875 12.5C31.875 11.8125 31.3125 11.25 30.625 11.25H29.375C28.6875 11.25 28.125 11.8125 28.125 12.5C28.125 13.1875 28.6875 13.75 29.375 13.75Z" fill="#FBC249"/>
|
||||
<path d="M29.375 18.75H30.625C31.3125 18.75 31.875 18.1875 31.875 17.5C31.875 16.8125 31.3125 16.25 30.625 16.25H29.375C28.6875 16.25 28.125 16.8125 28.125 17.5C28.125 18.1875 28.6875 18.75 29.375 18.75Z" fill="#FBC249"/>
|
||||
<path d="M29.375 23.75H30.625C31.3125 23.75 31.875 23.1875 31.875 22.5C31.875 21.8125 31.3125 21.25 30.625 21.25H29.375C28.6875 21.25 28.125 21.8125 28.125 22.5C28.125 23.1875 28.6875 23.75 29.375 23.75Z" fill="#FBC249"/>
|
||||
<path d="M29.375 28.75H30.625C31.3125 28.75 31.875 28.1875 31.875 27.5C31.875 26.8125 31.3125 26.25 30.625 26.25H29.375C28.6875 26.25 28.125 26.8125 28.125 27.5C28.125 28.1875 28.6875 28.75 29.375 28.75Z" fill="#FBC249"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M30.4168 14.4347V29.9094H32.9168V14.4347H30.4168ZM25.0002 35.4167H15.0002V37.9167H25.0002V35.4167ZM9.5835 29.9094V14.4347H7.0835V29.9094H9.5835ZM11.4814 10.2478L16.4814 5.90377L14.8417 4.01654L9.84175 8.36052L11.4814 10.2478ZM23.519 5.90377L28.519 10.2478L30.1587 8.36052L25.1587 4.01654L23.519 5.90377ZM16.4814 5.90377C18.5078 4.14324 21.4925 4.14324 23.519 5.90377L25.1587 4.01654C22.1918 1.43899 17.8085 1.43899 14.8417 4.01654L16.4814 5.90377ZM15.0002 35.4167C12.0245 35.4167 9.5835 32.967 9.5835 29.9094H7.0835C7.0835 34.3157 10.612 37.9167 15.0002 37.9167V35.4167ZM30.4168 29.9094C30.4168 32.967 27.9758 35.4167 25.0002 35.4167V37.9167C29.3883 37.9167 32.9168 34.3157 32.9168 29.9094H30.4168ZM32.9168 14.4347C32.9168 12.1033 31.912 9.88382 30.1587 8.36052L28.519 10.2478C29.7208 11.292 30.4168 12.8208 30.4168 14.4347H32.9168ZM9.5835 14.4347C9.5835 12.8208 10.2794 11.292 11.4814 10.2478L9.84175 8.36052C8.0884 9.88382 7.0835 12.1033 7.0835 14.4347H9.5835Z" fill="#0D6EFD"/>
|
||||
<path d="M22.0837 13.3333C22.0837 14.4839 21.151 15.4167 20.0003 15.4167V17.9167C22.5317 17.9167 24.5837 15.8646 24.5837 13.3333H22.0837ZM20.0003 15.4167C18.8497 15.4167 17.917 14.4839 17.917 13.3333H15.417C15.417 15.8646 17.469 17.9167 20.0003 17.9167V15.4167ZM17.917 13.3333C17.917 12.1827 18.8497 11.25 20.0003 11.25V8.75C17.469 8.75 15.417 10.802 15.417 13.3333H17.917ZM20.0003 11.25C21.151 11.25 22.0837 12.1827 22.0837 13.3333H24.5837C24.5837 10.802 22.5317 8.75 20.0003 8.75V11.25Z" fill="#FBC249"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
|
|
@ -0,0 +1,5 @@
|
|||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M19.9999 34.1666C19.6665 34.1666 19.3332 34 18.9999 33.8333L5.66654 23.8333C4.99987 23.3333 4.8332 22.1666 5.3332 21.5C5.8332 20.8333 6.99987 20.6666 7.66654 21.1666L19.9999 30.3333L32.3332 21.1666C32.9999 20.6666 34.1665 20.8333 34.6665 21.5C35.1665 22.1666 34.9999 23.3333 34.3332 23.8333L20.9999 33.8333C20.6665 34 20.3332 34.1666 19.9999 34.1666Z" fill="#0D6EFD"/>
|
||||
<path d="M33.3333 9.16665H6.66667C5.66667 9.16665 5 8.49998 5 7.49998C5 6.49998 5.66667 5.83331 6.66667 5.83331H33.3333C34.3333 5.83331 35 6.49998 35 7.49998C35 8.49998 34.3333 9.16665 33.3333 9.16665Z" fill="#FBC249"/>
|
||||
<path d="M33.3333 15.8333H6.66667C5.66667 15.8333 5 15.1667 5 14.1667C5 13.1667 5.66667 12.5 6.66667 12.5H33.3333C34.3333 12.5 35 13.1667 35 14.1667C35 15.1667 34.3333 15.8333 33.3333 15.8333Z" fill="#FBC249"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 912 B |
|
|
@ -0,0 +1,29 @@
|
|||
import SignatureIcon from "/src/assets/icons/signature.svg?react";
|
||||
import InitialIcon from "/src/assets/icons/initial.svg?react";
|
||||
import NameIcon from "/src/assets/icons/name.svg?react";
|
||||
import StampIcon from "/src/assets/icons/stamp.svg?react";
|
||||
import AttachmentIcon from "/src/assets/icons/attachment.svg?react";
|
||||
import CompanyIcon from "/src/assets/icons/company.svg?react";
|
||||
import TitleIcon from "/src/assets/icons/title.svg?react";
|
||||
import TextareaIcon from "/src/assets/icons/textarea.svg?react";
|
||||
import NumberIcon from "/src/assets/icons/number.svg?react";
|
||||
import TextIcon from "/src/assets/icons/text.svg?react";
|
||||
import CustomTagIcon from "/src/assets/icons/custom-tag.svg?react"
|
||||
import DropDownIcon from "/src/assets/icons/dropdown.svg?react"
|
||||
import WritebackIcon from "/src/assets/icons/writeback.svg?react"
|
||||
|
||||
export const FieldIcons = {
|
||||
signature: SignatureIcon,
|
||||
initial: InitialIcon,
|
||||
names: NameIcon,
|
||||
stamp: StampIcon,
|
||||
attachment: AttachmentIcon,
|
||||
company: CompanyIcon,
|
||||
titles: TitleIcon,
|
||||
textarea: TextareaIcon,
|
||||
number: NumberIcon,
|
||||
text: TextIcon,
|
||||
customtag: CustomTagIcon,
|
||||
dropdown: DropDownIcon,
|
||||
writeback: WritebackIcon,
|
||||
};
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
<svg width="39" height="36" viewBox="0 0 39 36" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M5.91844 27.3C4.31844 27.3 3.10844 26.85 2.28844 25.95C1.46844 25.03 1.05844 23.72 1.05844 22.02V20.82H4.17844V22.26C4.17844 23.62 4.74844 24.3 5.88844 24.3C6.44844 24.3 6.86844 24.14 7.14844 23.82C7.44844 23.48 7.59844 22.94 7.59844 22.2C7.59844 21.32 7.39844 20.55 6.99844 19.89C6.59844 19.21 5.85844 18.4 4.77844 17.46C3.41844 16.26 2.46844 15.18 1.92844 14.22C1.38844 13.24 1.11844 12.14 1.11844 10.92C1.11844 9.26 1.53844 7.98 2.37844 7.08C3.21844 6.16 4.43844 5.7 6.03844 5.7C7.61844 5.7 8.80844 6.16 9.60844 7.08C10.4284 7.98 10.8384 9.28 10.8384 10.98V11.85H7.71844V10.77C7.71844 10.05 7.57844 9.53 7.29844 9.21C7.01844 8.87 6.60844 8.7 6.06844 8.7C4.96844 8.7 4.41844 9.37 4.41844 10.71C4.41844 11.47 4.61844 12.18 5.01844 12.84C5.43844 13.5 6.18844 14.3 7.26844 15.24C8.64844 16.44 9.59844 17.53 10.1184 18.51C10.6384 19.49 10.8984 20.64 10.8984 21.96C10.8984 23.68 10.4684 25 9.60844 25.92C8.76844 26.84 7.53844 27.3 5.91844 27.3ZM12.7905 6H17.5005L19.6005 21.03H19.6605L21.7605 6H26.4705V27H23.3505V11.1H23.2905L20.8905 27H18.1305L15.7305 11.1H15.6705V27H12.7905V6ZM28.9331 6H37.9331V9H32.2331V14.55H36.7631V17.55H32.2331V24H37.9331V27H28.9331V6Z" fill="#0D6EFD"/>
|
||||
<path d="M0.398438 29.4H38.5931V31.8H0.398438V29.4Z" fill="#0D6EFD"/>
|
||||
<rect y="29" width="39" height="3" fill="#FBC249"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M34.3167 36.6667C34.3167 30.2167 27.9 25 20 25C12.1 25 5.68335 30.2167 5.68335 36.6667" stroke="#0D6EFD" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M25.8926 17.5592C24.3298 19.122 22.2102 20 20.0001 20C17.7899 20 15.6703 19.122 14.1075 17.5592C12.5447 15.9964 11.6667 13.8768 11.6667 11.6666C11.6667 9.45651 12.5447 7.33689 14.1075 5.77409C15.6703 4.21129 17.7899 3.33331 20.0001 3.33331C22.2102 3.33331 24.3298 4.21129 25.8926 5.77409C27.4554 7.33689 28.3334 9.45651 28.3334 11.6666C28.3334 13.8768 27.4554 15.9964 25.8926 17.5592Z" stroke="#FBC249" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 765 B |
|
|
@ -0,0 +1,6 @@
|
|||
<svg width="37" height="36" viewBox="0 0 37 36" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M30.3076 1.69275L21.5786 34.2697" stroke="#FBC249" stroke-width="3.38462" stroke-linecap="round"/>
|
||||
<path d="M15.3442 1.69275L6.61523 34.2697" stroke="#FBC249" stroke-width="3.38462" stroke-linecap="round"/>
|
||||
<path d="M34.6925 12.6927H3.38477" stroke="#0D6EFD" stroke-width="3.38462" stroke-linecap="round"/>
|
||||
<path d="M33.0001 24.5389H1.69238" stroke="#0D6EFD" stroke-width="3.38462" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 519 B |
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M24.0801 24.5987C21.5418 26.6325 18.4018 27.647 14.7059 27.647C13.0573 27.647 11.6623 27.2612 10.5509 26.6122C9.23383 27.2583 7.82453 27.647 6.47062 27.647C2.39344 27.647 0 25.453 0 21.7647C0 21.1149 0.52672 20.5882 1.17649 20.5882C1.82625 20.5882 2.35297 21.1149 2.35297 21.7647C2.35297 24.1057 3.64945 25.2941 6.47062 25.2941C7.1664 25.2941 7.89992 25.1431 8.62586 24.8792C7.57188 23.4205 7.22195 21.5556 7.68218 19.7146C8.42484 16.7438 10.361 14.7058 12.9412 14.7058C16.0278 14.7058 17.2912 18.6365 15.7581 21.7026C15.151 22.9167 14.1543 24.0938 12.9456 25.0758C13.4687 25.2168 14.0559 25.2941 14.7059 25.2941C17.8277 25.2941 20.4095 24.4789 22.4945 22.8528L24.1591 16.7493C24.2129 16.5518 24.3174 16.3717 24.4622 16.2269L33.2857 7.40343C33.7451 6.94397 34.49 6.94397 34.9495 7.40343C35.4089 7.86288 35.4089 8.6078 34.9495 9.06718L27.3366 16.6801C27.98 17.045 28.5577 17.4822 29.0671 17.9917C29.5766 18.5012 30.0138 19.0789 30.3787 19.7222L37.9916 12.1094C38.451 11.6499 39.1959 11.6499 39.6554 12.1094C40.1148 12.5687 40.1148 13.3137 39.6554 13.7731L30.8319 22.5966C30.6871 22.7414 30.507 22.8458 30.3095 22.8997L24.0801 24.5987ZM26.0741 18.6702L25.2062 21.8526L28.3886 20.9848C28.1148 20.4805 27.7864 20.0384 27.4034 19.6554C27.0204 19.2725 26.5784 18.9441 26.0741 18.6702ZM13.6536 20.6503C14.5119 18.9338 13.9092 17.0588 12.9412 17.0588C11.6096 17.0588 10.4722 18.2561 9.96492 20.2854C9.64672 21.5583 9.92117 22.831 10.7534 23.7749C12.0156 22.9148 13.0857 21.7862 13.6536 20.6503Z" fill="#0D6EFD"/>
|
||||
<path d="M0 33.1765C0 33.8262 0.52672 34.353 1.17649 34.353H21.1765C21.8263 34.353 22.353 33.8262 22.353 33.1765C22.353 32.5267 21.8263 32 21.1765 32H1.17649C0.52672 32 0 32.5267 0 33.1765Z" fill="#FBC249"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
|
|
@ -0,0 +1,17 @@
|
|||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_66_1285)">
|
||||
<mask id="mask0_66_1285" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="40" height="40">
|
||||
<path d="M0 3.8147e-06H40V40H0V3.8147e-06Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0_66_1285)">
|
||||
<path d="M32.8125 29.7656H7.1875C7.1875 26.3138 9.9857 23.5156 13.4375 23.5156H26.5625C30.0143 23.5156 32.8125 26.3138 32.8125 29.7656Z" stroke="#0D6EFD" stroke-width="2.34375" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M37.2656 38.8281H2.73437C1.87141 38.8281 1.17188 38.1286 1.17188 37.2656V31.3281C1.17188 30.4652 1.87141 29.7656 2.73437 29.7656H37.2656C38.1286 29.7656 38.8281 30.4652 38.8281 31.3281V37.2656C38.8281 38.1286 38.1286 38.8281 37.2656 38.8281Z" stroke="#FBC249" stroke-width="2.34375" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M26.8435 8.92406C27.358 4.80781 24.1484 1.17188 20 1.17188C15.8516 1.17188 12.642 4.80781 13.1566 8.92406L14.9805 23.5156H25.0195L26.8435 8.92406Z" stroke="#0D6EFD" stroke-width="2.34375" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_66_1285">
|
||||
<rect width="40" height="40" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M36.6668 18.8334H25.0002C24.5581 18.8334 24.1342 19.009 23.8217 19.3215C23.5091 19.6341 23.3335 20.058 23.3335 20.5V22.8334C23.3335 23.2754 23.5091 23.6993 23.8217 24.0119C24.1342 24.3244 24.5581 24.5 25.0002 24.5C25.4422 24.5 25.8661 24.3244 26.1787 24.0119C26.4912 23.6993 26.6668 23.2754 26.6668 22.8334V22.1667H29.1668V31.6667H27.3335C26.8915 31.6667 26.4675 31.8423 26.155 32.1549C25.8424 32.4674 25.6668 32.8913 25.6668 33.3334C25.6668 33.7754 25.8424 34.1993 26.155 34.5119C26.4675 34.8244 26.8915 35 27.3335 35H34.3335C34.7755 35 35.1994 34.8244 35.512 34.5119C35.8246 34.1993 36.0002 33.7754 36.0002 33.3334C36.0002 32.8913 35.8246 32.4674 35.512 32.1549C35.1994 31.8423 34.7755 31.6667 34.3335 31.6667H32.5002V22.1667H35.0002V22.8334C35.0002 23.2754 35.1758 23.6993 35.4883 24.0119C35.8009 24.3244 36.2248 24.5 36.6668 24.5C37.1089 24.5 37.5328 24.3244 37.8453 24.0119C38.1579 23.6993 38.3335 23.2754 38.3335 22.8334V20.5C38.3335 20.058 38.1579 19.6341 37.8453 19.3215C37.5328 19.009 37.1089 18.8334 36.6668 18.8334Z" fill="#FBC249"/>
|
||||
<path d="M22.5932 31.6667H18.3332V8.33333H28.3332V9.62833C28.3332 10.0704 28.5088 10.4943 28.8213 10.8068C29.1339 11.1194 29.5578 11.295 29.9998 11.295C30.4419 11.295 30.8658 11.1194 31.1783 10.8068C31.4909 10.4943 31.6665 10.0704 31.6665 9.62833V6.66667C31.6665 6.22464 31.4909 5.80072 31.1783 5.48816C30.8658 5.17559 30.4419 5 29.9998 5H3.33317C2.89114 5 2.46722 5.17559 2.15466 5.48816C1.8421 5.80072 1.6665 6.22464 1.6665 6.66667V9.62833C1.6665 10.0704 1.8421 10.4943 2.15466 10.8068C2.46722 11.1194 2.89114 11.295 3.33317 11.295C3.7752 11.295 4.19912 11.1194 4.51168 10.8068C4.82424 10.4943 4.99984 10.0704 4.99984 9.62833V8.33333H14.9998V31.6667H10.7398C10.2978 31.6667 9.87389 31.8423 9.56133 32.1548C9.24876 32.4674 9.07317 32.8913 9.07317 33.3333C9.07317 33.7754 9.24876 34.1993 9.56133 34.5118C9.87389 34.8244 10.2978 35 10.7398 35H22.5932C23.0352 35 23.4591 34.8244 23.7717 34.5118C24.0842 34.1993 24.2598 33.7754 24.2598 33.3333C24.2598 32.8913 24.0842 32.4674 23.7717 32.1548C23.4591 31.8423 23.0352 31.6667 22.5932 31.6667Z" fill="#0D6EFD"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
|
|
@ -0,0 +1,11 @@
|
|||
<svg width="38" height="38" viewBox="0 0 38 38" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_372_280)">
|
||||
<path d="M33.91 27.3225V10.6775C34.8386 10.4422 35.6883 9.96503 36.3726 9.29458C37.0569 8.62414 37.5513 7.78435 37.8056 6.86072C38.0598 5.93708 38.0648 4.96257 37.82 4.03639C37.5752 3.1102 37.0894 2.26541 36.412 1.58801C35.7346 0.910612 34.8898 0.424789 33.9636 0.179996C33.0374 -0.0647977 32.0629 -0.0598197 31.1393 0.194422C30.2156 0.448664 29.3759 0.943092 28.7054 1.62738C28.035 2.31166 27.5578 3.16137 27.3225 4.09001H10.6775C10.4422 3.16137 9.96503 2.31166 9.29458 1.62738C8.62414 0.943092 7.78435 0.448664 6.86072 0.194422C5.93708 -0.0598197 4.96257 -0.0647977 4.03639 0.179996C3.1102 0.424789 2.26541 0.910612 1.58801 1.58801C0.910612 2.26541 0.424789 3.1102 0.179996 4.03639C-0.0647977 4.96257 -0.0598197 5.93708 0.194422 6.86072C0.448664 7.78435 0.943092 8.62414 1.62738 9.29458C2.31166 9.96503 3.16137 10.4422 4.09001 10.6775V27.3225C3.16137 27.5578 2.31166 28.035 1.62738 28.7054C0.943092 29.3759 0.448664 30.2156 0.194422 31.1393C-0.0598197 32.0629 -0.0647977 33.0374 0.179996 33.9636C0.424789 34.8898 0.910612 35.7346 1.58801 36.412C2.26541 37.0894 3.1102 37.5752 4.03639 37.82C4.96257 38.0648 5.93708 38.0598 6.86072 37.8056C7.78435 37.5513 8.62414 37.0569 9.29458 36.3726C9.96503 35.6883 10.4422 34.8386 10.6775 33.91H27.3225C27.5578 34.8386 28.035 35.6883 28.7054 36.3726C29.3759 37.0569 30.2156 37.5513 31.1393 37.8056C32.0629 38.0598 33.0374 38.0648 33.9636 37.82C34.8898 37.5752 35.7346 37.0894 36.412 36.412C37.0894 35.7346 37.5752 34.8898 37.82 33.9636C38.0648 33.0374 38.0598 32.0629 37.8056 31.1393C37.5513 30.2156 37.0569 29.3759 36.3726 28.7054C35.6883 28.035 34.8386 27.5578 33.91 27.3225ZM32.5545 2.73455C33.0907 2.73455 33.6148 2.89355 34.0606 3.19143C34.5064 3.4893 34.8539 3.91269 35.0591 4.40804C35.2643 4.9034 35.318 5.44847 35.2134 5.97433C35.1088 6.5002 34.8506 6.98324 34.4714 7.36236C34.0923 7.74149 33.6093 7.99968 33.0834 8.10428C32.5575 8.20888 32.0125 8.1552 31.5171 7.95002C31.0218 7.74483 30.5984 7.39737 30.3005 6.95156C30.0026 6.50575 29.8436 5.98163 29.8436 5.44546C29.8436 4.72648 30.1292 4.03695 30.6376 3.52856C31.146 3.02017 31.8356 2.73455 32.5545 2.73455ZM2.73455 5.44546C2.73455 4.9093 2.89355 4.38517 3.19143 3.93936C3.4893 3.49356 3.91269 3.14609 4.40804 2.94091C4.9034 2.73573 5.44847 2.68204 5.97433 2.78664C6.5002 2.89124 6.98324 3.14943 7.36236 3.52856C7.74149 3.90769 7.99968 4.39073 8.10428 4.91659C8.20888 5.44246 8.1552 5.98753 7.95002 6.48288C7.74483 6.97824 7.39737 7.40162 6.95156 7.6995C6.50575 7.99738 5.98163 8.15637 5.44546 8.15637C4.72648 8.15637 4.03695 7.87076 3.52856 7.36236C3.02017 6.85397 2.73455 6.16444 2.73455 5.44546ZM5.44546 35.2654C4.9093 35.2654 4.38517 35.1065 3.93936 34.8086C3.49356 34.5107 3.14609 34.0873 2.94091 33.592C2.73573 33.0966 2.68204 32.5515 2.78664 32.0257C2.89124 31.4998 3.14943 31.0168 3.52856 30.6376C3.90769 30.2585 4.39073 30.0003 4.91659 29.8957C5.44246 29.7911 5.98753 29.8448 6.48288 30.05C6.97824 30.2552 7.40162 30.6026 7.6995 31.0484C7.99738 31.4942 8.15637 32.0184 8.15637 32.5545C8.15637 33.2735 7.87076 33.963 7.36236 34.4714C6.85397 34.9798 6.16444 35.2654 5.44546 35.2654ZM27.3225 31.1991H10.6775C10.4341 30.2667 9.94666 29.4161 9.26529 28.7347C8.58393 28.0533 7.73327 27.5659 6.80092 27.3225V10.6775C7.73327 10.4341 8.58393 9.94666 9.26529 9.26529C9.94666 8.58393 10.4341 7.73327 10.6775 6.80092H27.3225C27.5659 7.73327 28.0533 8.58393 28.7347 9.26529C29.4161 9.94666 30.2667 10.4341 31.1991 10.6775V27.3225C30.2667 27.5659 29.4161 28.0533 28.7347 28.7347C28.0533 29.4161 27.5659 30.2667 27.3225 31.1991ZM32.5545 35.2654C32.0184 35.2654 31.4942 35.1065 31.0484 34.8086C30.6026 34.5107 30.2552 34.0873 30.05 33.592C29.8448 33.0966 29.7911 32.5515 29.8957 32.0257C30.0003 31.4998 30.2585 31.0168 30.6376 30.6376C31.0168 30.2585 31.4998 30.0003 32.0257 29.8957C32.5515 29.7911 33.0966 29.8448 33.592 30.05C34.0873 30.2552 34.5107 30.6026 34.8086 31.0484C35.1065 31.4942 35.2654 32.0184 35.2654 32.5545C35.2654 33.2735 34.9798 33.963 34.4714 34.4714C33.963 34.9798 33.2735 35.2654 32.5545 35.2654Z" fill="#0D6EFD"/>
|
||||
<path d="M24.9375 13.0625H13.0625V15.4375H17.8125V26.125H20.1875V15.4375H24.9375V13.0625Z" fill="#FBC249"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_372_280">
|
||||
<rect width="38" height="38" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
|
|
@ -0,0 +1,20 @@
|
|||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<mask id="mask0_372_188" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="40" height="40">
|
||||
<path d="M0 3.8147e-06H40V40H0V3.8147e-06Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0_372_188)">
|
||||
<path d="M38.8281 22.3438H1.17188V8.28125H38.8281V22.3438Z" stroke="#0D6EFD" stroke-width="2.26563" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</g>
|
||||
<path d="M5.85938 12.9688H10.5469" stroke="#FBC249" stroke-width="2.26563" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M8.20312 17.6562V12.9688" stroke="#FBC249" stroke-width="2.26563" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12.8906 27.0312H17.5781" stroke="#0D6EFD" stroke-width="2.26563" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<mask id="mask1_372_188" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="40" height="40">
|
||||
<path d="M0 3.8147e-06H40V40H0V3.8147e-06Z" fill="white"/>
|
||||
</mask>
|
||||
<g mask="url(#mask1_372_188)">
|
||||
<path d="M15.2344 27.0312V3.59375" stroke="#0D6EFD" stroke-width="2.26563" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12.8906 3.59375H17.5781" stroke="#0D6EFD" stroke-width="2.26563" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M1.17188 31.7188H38.8281" stroke="#0D6EFD" stroke-width="2.26563" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M1.17188 36.4062H38.8281" stroke="#0D6EFD" stroke-width="2.26563" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -0,0 +1,5 @@
|
|||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M3.01636 31.3367C3.01636 35.3827 10.4083 37.5001 17.71 37.5001C25.0122 37.5001 32.4042 35.3827 32.4042 31.3367C32.4042 31.3293 32.4001 31.3231 32.3999 31.3156V25.7502C32.3999 25.0599 31.8402 24.5002 31.1499 24.5002C30.4596 24.5002 29.8999 25.0599 29.8999 25.7502V31.3373C29.8999 31.341 29.902 31.344 29.902 31.3476C29.8784 32.8059 25.0231 35.0001 17.71 35.0001C10.3796 35.0001 5.51636 32.7949 5.51636 31.3367V25.0982C8.29872 26.7965 13.0185 27.6752 17.7124 27.6752C19.3762 27.6752 21.0187 27.566 22.594 27.3511C23.2782 27.2577 23.7567 26.6279 23.6633 25.9437C23.5699 25.2588 22.9321 24.7797 22.2559 24.8743C20.7922 25.0739 19.2639 25.1752 17.7124 25.1752C10.4082 25.1752 5.55565 22.9889 5.51636 21.5307V15.2742C7.6358 16.5572 10.8035 17.3235 13.8574 17.6435C13.9014 17.6478 13.9453 17.6502 13.9886 17.6502C14.621 17.6502 15.1636 17.1729 15.2307 16.5302C15.3027 15.8436 14.8041 15.2289 14.1174 15.1569C8.52127 14.5711 5.53596 12.7769 5.51636 11.699V11.684C5.51636 11.6812 5.51476 11.6788 5.51476 11.676C5.53658 10.557 8.79784 8.66781 14.6832 8.15741C15.3711 8.0982 15.8801 7.49212 15.8203 6.80426C15.7611 6.117 15.1569 5.59515 14.4672 5.66717C9.18335 6.12494 3.0127 7.97674 3.0127 11.6877C3.0127 11.7003 3.0162 11.7119 3.01636 11.7246V31.3367Z" fill="#0D6EFD"/>
|
||||
<path d="M32.0069 7.01233L31.9172 7.06421C31.3105 6.5979 30.6427 6.21216 29.9372 5.9198V5.81787C29.9372 3.98865 28.4485 2.5 26.6193 2.5C24.7901 2.5 23.3014 3.98865 23.3014 5.81787V5.9198C22.5959 6.21216 21.9281 6.5979 21.3215 7.06421L21.2336 7.01355C20.4664 6.57043 19.5728 6.45264 18.7153 6.68152C17.8589 6.9104 17.143 7.45972 16.6999 8.22693C16.2568 8.99475 16.139 9.88892 16.3684 10.7446C16.5979 11.601 17.1473 12.3163 17.9145 12.7588L18.0024 12.8101C17.9493 13.1952 17.9224 13.5773 17.9224 13.9539C17.9224 14.3304 17.9493 14.7125 18.0024 15.0977L17.9145 15.1483C17.1466 15.592 16.5979 16.3074 16.3684 17.1637C16.139 18.0194 16.2568 18.9136 16.6999 19.6814C17.6142 21.264 19.646 21.8115 21.233 20.8954L21.3221 20.8441C21.9281 21.3104 22.5953 21.6962 23.3014 21.9885V22.0905C23.3014 23.9197 24.7901 25.4083 26.6193 25.4083C28.4485 25.4083 29.9372 23.9197 29.9372 22.0905V21.9885C30.6434 21.6962 31.3105 21.3104 31.9172 20.8441L32.0063 20.8954C33.592 21.8103 35.6244 21.2659 36.5393 19.6808C37.453 18.0969 36.9086 16.0638 35.3241 15.1483L35.2362 15.0977C35.2893 14.7125 35.3162 14.3298 35.3162 13.9539C35.3162 13.5779 35.2893 13.1958 35.2362 12.8101L35.3247 12.7594C36.9086 11.8451 37.4537 9.81201 36.5387 8.22632C36.0956 7.45911 35.3803 6.9104 34.5246 6.68091C33.6676 6.45203 32.7741 6.56921 32.0069 7.01233ZM33.2563 18.7305L32.4012 18.2367C31.9202 17.9578 31.3117 18.0316 30.9095 18.418C30.1874 19.1125 29.2987 19.6259 28.3399 19.9036C27.8052 20.058 27.4372 20.5475 27.4372 21.1041V22.0905C27.4372 22.5415 27.0704 22.9083 26.6193 22.9083C26.1683 22.9083 25.8014 22.5415 25.8014 22.0905V21.1041C25.8014 20.5475 25.4334 20.058 24.8987 19.9036C23.9392 19.6259 23.0512 19.1125 22.3298 18.418C22.0905 18.1879 21.778 18.0688 21.4624 18.0688C21.2482 18.0688 21.0328 18.1238 20.8374 18.2367L19.983 18.7305C19.5917 18.9569 19.0906 18.822 18.8654 18.4314C18.7555 18.2422 18.7268 18.0212 18.783 17.8107C18.8398 17.5995 18.9753 17.4231 19.1639 17.3138L20.0208 16.8195C20.503 16.5411 20.7434 15.9778 20.6098 15.4376C20.4853 14.9323 20.4224 14.433 20.4224 13.9539C20.4224 13.4747 20.4853 12.9761 20.6098 12.4707C20.7434 11.9305 20.5036 11.3678 20.0214 11.0895L19.1639 10.5939C18.9747 10.4846 18.8398 10.3088 18.783 10.0977C18.7268 9.88708 18.7555 9.66614 18.8654 9.47693C18.974 9.28772 19.1504 9.15283 19.3616 9.09607C19.5734 9.0387 19.7931 9.0686 19.983 9.17847L20.8393 9.67224C21.3221 9.94934 21.9288 9.87549 22.3298 9.48975C23.0518 8.79517 23.9405 8.28186 24.8981 8.00537C25.4334 7.85095 25.8014 7.36084 25.8014 6.8042V5.81787C25.8014 5.36682 26.1683 5 26.6193 5C27.0704 5 27.4372 5.36682 27.4372 5.81787V6.8042C27.4372 7.36084 27.8052 7.85095 28.3405 8.00537C29.2981 8.28186 30.1868 8.79517 30.9101 9.49036C31.3111 9.87427 31.9178 9.94934 32.4012 9.67163L33.2575 9.17725C33.6463 8.95325 34.148 9.0863 34.3738 9.47632C34.599 9.86755 34.4654 10.3687 34.0747 10.5945L33.2178 11.0895C32.7362 11.3672 32.4964 11.9299 32.6288 12.4695C32.7533 12.9761 32.8162 13.4753 32.8162 13.9539C32.8162 14.4324 32.7533 14.9323 32.6288 15.4388C32.4964 15.979 32.7362 16.5417 33.2184 16.8195L34.0741 17.3132C34.4648 17.5391 34.599 18.0408 34.3744 18.4308C34.1486 18.8208 33.6463 18.9539 33.2563 18.7305Z" fill="#FBC249"/>
|
||||
<path d="M26.6191 9.56421C24.1985 9.56421 22.2295 11.5332 22.2295 13.9539C22.2295 16.3745 24.1985 18.3441 26.6191 18.3441C29.0398 18.3441 31.0088 16.3745 31.0088 13.9539C31.0088 11.5332 29.0398 9.56421 26.6191 9.56421ZM26.6191 15.8441C25.5773 15.8441 24.7295 14.9963 24.7295 13.9539C24.7295 12.912 25.5773 12.0642 26.6191 12.0642C27.661 12.0642 28.5088 12.912 28.5088 13.9539C28.5088 14.9963 27.661 15.8441 26.6191 15.8441Z" fill="#FBC249"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.9 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 6.9 MiB |
|
After Width: | Height: | Size: 701 B |
|
|
@ -0,0 +1,274 @@
|
|||
import { useState, useEffect } from "react";
|
||||
import { FileText, ChevronDown, X, FolderOpen, AlertCircle } from "lucide-react";
|
||||
import { useDocStore } from "../store";
|
||||
import AiIcon from '../assets/AiIcon.png'
|
||||
|
||||
// -------------------- Shimmer --------------------
|
||||
const ShimmerSkeleton = () => (
|
||||
<div className="flex flex-col gap-3 px-5 py-5 animate-pulse">
|
||||
<div className="flex items-center gap-2 mb-2">
|
||||
<div style={{ width: 18, height: 18, borderRadius: 4, background: "#e5e7eb" }} />
|
||||
<div style={{ height: 20, width: "60%", borderRadius: 6, background: "#e5e7eb" }} />
|
||||
</div>
|
||||
|
||||
{[100, 92, 78, 95, 60].map((w, i) => (
|
||||
<div key={i} style={{ height: 13, width: `${w}%`, borderRadius: 4, background: "#e5e7eb" }} />
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
|
||||
// -------------------- Main --------------------
|
||||
const AIDrawerSidebar = ({ isOpen, onClose, uuid }) => {
|
||||
const [selectedId, setSelectedId] = useState("");
|
||||
const [error, setError] = useState(null);
|
||||
|
||||
const {
|
||||
aiSummaryList,
|
||||
aiLoading,
|
||||
setAiSummaryList,
|
||||
setAiLoading,
|
||||
documents,
|
||||
} = useDocStore();
|
||||
|
||||
|
||||
console.log("documents33", documents)
|
||||
|
||||
|
||||
// ✅ Find selected summary
|
||||
const selectedSummary = aiSummaryList.find(
|
||||
(item) => item.documentId === selectedId
|
||||
);
|
||||
|
||||
const summaryText = selectedSummary?.summary || null;
|
||||
|
||||
// -------------------- API CALL --------------------
|
||||
const fetchDocumentSummary = async () => {
|
||||
if (aiSummaryList.length > 0) return;
|
||||
|
||||
try {
|
||||
setError(null);
|
||||
setAiLoading(true);
|
||||
|
||||
const res = await fetch(
|
||||
`${import.meta.env.VITE_BASE_API_URL}/sign/summarize`,
|
||||
{
|
||||
method: "GET",
|
||||
headers: {
|
||||
"X-AUTH-TYPE": "TRANSACTIONAL",
|
||||
"Content-Type": "application/json",
|
||||
Authorization: `${uuid}`,
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
if (!res.ok) throw new Error("API failed");
|
||||
|
||||
const data = await res.json();
|
||||
|
||||
setAiSummaryList(data);
|
||||
} catch (err) {
|
||||
setError("Failed to load summary");
|
||||
} finally {
|
||||
setAiLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
// -------------------- Effects --------------------
|
||||
|
||||
// Call API
|
||||
useEffect(() => {
|
||||
if (uuid && isOpen && aiSummaryList.length === 0) {
|
||||
fetchDocumentSummary();
|
||||
}
|
||||
}, [uuid, isOpen]);
|
||||
|
||||
// Auto select first doc
|
||||
useEffect(() => {
|
||||
if (documents.length > 0 && !selectedId) {
|
||||
setSelectedId(documents[0].contentDocumentId);
|
||||
}
|
||||
}, [documents]);
|
||||
|
||||
// -------------------- Render --------------------
|
||||
const renderContent = () => {
|
||||
// ✅ 1. Shimmer FIRST
|
||||
if (aiLoading) {
|
||||
return <ShimmerSkeleton />;
|
||||
}
|
||||
|
||||
// ✅ 2. Empty
|
||||
if (!selectedId) {
|
||||
return (
|
||||
<div className="flex flex-col items-center justify-center h-full text-center pt-16">
|
||||
<FolderOpen size={24} className="text-gray-300 mb-3" />
|
||||
<p className="text-gray-400 text-sm">
|
||||
Select a document to view summary
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// ✅ 3. Error
|
||||
if (error) {
|
||||
return (
|
||||
<div className="flex flex-col items-center justify-center h-full text-center pt-16">
|
||||
<AlertCircle size={22} className="text-red-500 mb-2" />
|
||||
<p className="text-red-500 text-sm">{error}</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// ✅ 4. Content
|
||||
if (summaryText) {
|
||||
return (
|
||||
<div className="px-5 py-5">
|
||||
<div className="flex items-center gap-2 mb-4">
|
||||
<FileText size={18} className="text-gray-400" />
|
||||
<h3 className="font-semibold text-gray-900 text-lg">
|
||||
Document Summary
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
{/* 🔥 THIS IS WHERE YOU ADD dangerouslySetInnerHTML */}
|
||||
<div
|
||||
className="text-gray-600 text-sm leading-7"
|
||||
dangerouslySetInnerHTML={{ __html: summaryText }}
|
||||
/>
|
||||
|
||||
<div className="mt-3 text-xs text-gray-400">
|
||||
ID: {selectedId}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex items-center justify-center h-full text-gray-400 text-sm">
|
||||
No summary found
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
// -------------------- JSX --------------------
|
||||
return (
|
||||
<>
|
||||
{isOpen && (
|
||||
<div className="fixed inset-0 bg-black/40 z-[999]" onClick={onClose} />
|
||||
)}
|
||||
|
||||
<div
|
||||
className={`fixed top-0 right-0 h-full w-[360px] z-[1000] transform transition-transform duration-300
|
||||
${isOpen ? "translate-x-0" : "translate-x-full"}`}
|
||||
>
|
||||
<div className="flex flex-col h-full bg-[#f9fafb] border-l">
|
||||
|
||||
{/* Header */}
|
||||
<div className="flex items-center justify-between px-5 py-4 bg-white border-b">
|
||||
|
||||
{/* Left side */}
|
||||
<div className="flex items-center gap-2">
|
||||
|
||||
{/* Gradient Icon Wrapper */}
|
||||
<div className="w-8 h-8 rounded-md flex items-center justify-center bg-gradient-to-r from-[#0CCBD4] to-[#D865FF]">
|
||||
<img src={AiIcon} alt="AI" className="w-4 h-4 object-contain" />
|
||||
</div>
|
||||
|
||||
{/* Title */}
|
||||
<h2 className="text-[16px] font-semibold text-gray-900">
|
||||
Document Summary
|
||||
</h2>
|
||||
|
||||
</div>
|
||||
|
||||
{/* Close Button */}
|
||||
<button
|
||||
onClick={onClose}
|
||||
className="w-7 h-7 flex items-center justify-center rounded-md hover:bg-gray-100"
|
||||
>
|
||||
<X size={16} />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Dropdown Section */}
|
||||
<div className="px-5 py-4 ">
|
||||
|
||||
<label className="block text-sm text-gray-500 mb-2">
|
||||
Select Documents
|
||||
</label>
|
||||
|
||||
{/* Trigger Button */}
|
||||
<button
|
||||
className="btn w-full justify-between bg-white border border-gray-200 text-gray-700 font-normal"
|
||||
popoverTarget="doc-popover"
|
||||
style={{ anchorName: "--doc-anchor" }}
|
||||
>
|
||||
<span>
|
||||
{
|
||||
selectedId
|
||||
? documents.find(d => d.contentDocumentId === selectedId)?.name
|
||||
: "Select document"
|
||||
}
|
||||
</span>
|
||||
|
||||
<ChevronDown size={16} />
|
||||
</button>
|
||||
|
||||
{/* Dropdown Menu */}
|
||||
<ul
|
||||
className="dropdown menu w-full rounded-xl bg-base-100 shadow-md mt-2 max-h-60 overflow-y-auto z-[1001] "
|
||||
popover="auto"
|
||||
id="doc-popover"
|
||||
style={{ positionAnchor: "--doc-anchor" }}
|
||||
>
|
||||
{documents.map((doc) => (
|
||||
<li key={doc.contentDocumentId}>
|
||||
<a
|
||||
onClick={() => {
|
||||
setSelectedId(doc.contentDocumentId);
|
||||
|
||||
// ✅ close dropdown after select
|
||||
document.activeElement?.blur();
|
||||
}}
|
||||
className={`flex justify-between ${selectedId === doc.contentDocumentId ? "bg-gray-100" : ""
|
||||
}`}
|
||||
>
|
||||
<span className="truncate">{doc.name}</span>
|
||||
|
||||
{/* Optional selected indicator */}
|
||||
{selectedId === doc.contentDocumentId && (
|
||||
<span className="text-green-500 text-xs">✓</span>
|
||||
)}
|
||||
</a>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{/* Content Area */}
|
||||
<div className="flex-1 overflow-y-auto px-4 pb-4">
|
||||
|
||||
{/* Card */}
|
||||
<div className="bg-white rounded-xl p-4 shadow-sm border border-gray-100">
|
||||
|
||||
{/* 🔥 Shimmer */}
|
||||
{aiLoading ? (
|
||||
<ShimmerSkeleton />
|
||||
) : summaryText ? (
|
||||
<div
|
||||
className="text-gray-600 text-sm leading-7 space-y-4"
|
||||
dangerouslySetInnerHTML={{ __html: summaryText }}
|
||||
/>
|
||||
) : (
|
||||
<p className="text-gray-400 text-sm">
|
||||
No summary available
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default AIDrawerSidebar;
|
||||
|
|
@ -0,0 +1,523 @@
|
|||
import { useState, useEffect, useRef } from "react";
|
||||
import {
|
||||
PlusCircle, Send, Mail, Eye, ShieldCheck, FileEdit,
|
||||
Hash, Activity, FileText, FilePen, ClipboardList, Copy, Check,
|
||||
} from "lucide-react";
|
||||
import SMELogo from "../../assets/SMELogo.png";
|
||||
import { useDocStore } from "../../store";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import LanguageDropdown from "../LanguageDropdown";
|
||||
// import { getCachedTranslation, setCachedTranslation } from "../../services/auditTranslationCache";
|
||||
import { translateAuditAction } from "../../services/auditTranslator";
|
||||
import i18n from "../../i18n";
|
||||
import { languageSupport } from "../../constant/language";
|
||||
import { useLocalizedLabel } from "../../hooks/useLocalizedLabel";
|
||||
|
||||
|
||||
// ── TYPE → icon/color config ──────────────────────────────────────────────────
|
||||
const TYPE_CONFIG = {
|
||||
CREATE: {
|
||||
icon: PlusCircle,
|
||||
iconColor: "text-blue-500",
|
||||
iconBg: "bg-blue-50",
|
||||
badgeClass: "badge-info badge-outline",
|
||||
},
|
||||
SENT: {
|
||||
icon: Send,
|
||||
iconColor: "text-green-500",
|
||||
iconBg: "bg-green-50",
|
||||
badgeClass: "badge-success badge-outline",
|
||||
},
|
||||
EMAIL: {
|
||||
icon: Mail,
|
||||
iconColor: "text-amber-500",
|
||||
iconBg: "bg-amber-50",
|
||||
badgeClass: "badge-warning badge-outline",
|
||||
},
|
||||
VIEWED: {
|
||||
icon: Eye,
|
||||
iconColor: "text-sky-500",
|
||||
iconBg: "bg-sky-50",
|
||||
badgeClass: "badge-info badge-outline",
|
||||
},
|
||||
ACCEPT: {
|
||||
icon: ShieldCheck,
|
||||
iconColor: "text-violet-500",
|
||||
iconBg: "bg-violet-50",
|
||||
badgeClass: "badge-secondary badge-outline",
|
||||
},
|
||||
DEFAULT: {
|
||||
icon: FileEdit,
|
||||
iconColor: "text-gray-400",
|
||||
iconBg: "bg-gray-50",
|
||||
badgeClass: "badge-ghost badge-outline",
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Derives icon config from type; falls back to DEFAULT.
|
||||
* Special case: SENT + "Invitation email" → EMAIL style.
|
||||
*/
|
||||
function getConfig(type, action = "") {
|
||||
if (type === "SENT" && action.toLowerCase().includes("invitation email")) {
|
||||
return TYPE_CONFIG.EMAIL;
|
||||
}
|
||||
return TYPE_CONFIG[type] || TYPE_CONFIG.DEFAULT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Splits "04/13/2026 03:34:28 America/Los_Angeles"
|
||||
* into { datetime: "04/13/2026 03:34:28", tz: "America/Los_Angeles" }
|
||||
*/
|
||||
function parseDate(raw = "") {
|
||||
const parts = raw.trim().split(" ");
|
||||
const tz = parts.length >= 3 ? parts[parts.length - 1] : "";
|
||||
const datetime = parts.slice(0, parts.length - 1).join(" ");
|
||||
return { datetime, tz };
|
||||
}
|
||||
|
||||
// ── SHIMMER COMPONENTS ────────────────────────────────────────────────────────
|
||||
|
||||
function ShimmerBlock({ className = "" }) {
|
||||
return (
|
||||
<div
|
||||
className={`rounded animate-pulse bg-gradient-to-r from-base-300 via-base-200 to-base-300 bg-[length:200%_100%] ${className}`}
|
||||
style={{
|
||||
animation: "shimmer 1.6s infinite linear",
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
function MetaCardShimmer() {
|
||||
return (
|
||||
<div className="card bg-base-100 border border-base-300 shadow-sm">
|
||||
<div className="card-body p-4 gap-3">
|
||||
<ShimmerBlock className="h-3 w-24" />
|
||||
<ShimmerBlock className="h-6 w-full" />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function TableRowShimmer({ delay = 0 }) {
|
||||
return (
|
||||
<tr
|
||||
className="border-b border-base-100"
|
||||
style={{ animationDelay: `${delay}ms` }}
|
||||
>
|
||||
<td className="pl-5 py-3.5">
|
||||
<ShimmerBlock className="h-3 w-5" />
|
||||
</td>
|
||||
<td className="py-3.5">
|
||||
<div className="flex items-center gap-3">
|
||||
<ShimmerBlock className="h-8 w-8 rounded-full" />
|
||||
<div className="flex flex-col gap-1.5 flex-1">
|
||||
<ShimmerBlock className="h-3 w-3/4" />
|
||||
<ShimmerBlock className="h-2.5 w-1/2" />
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td className="py-3.5">
|
||||
<ShimmerBlock className="h-5 w-16 rounded-full" />
|
||||
</td>
|
||||
<td className="py-3.5">
|
||||
<ShimmerBlock className="h-5 w-24 rounded" />
|
||||
</td>
|
||||
<td className="py-3.5">
|
||||
<div className="flex flex-col gap-1.5">
|
||||
<ShimmerBlock className="h-3 w-32" />
|
||||
<ShimmerBlock className="h-2.5 w-20" />
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
|
||||
function ShimmerLayout() {
|
||||
return (
|
||||
<div className="h-screen flex flex-col bg-base-200 overflow-hidden font-sans">
|
||||
{/* Navbar shimmer */}
|
||||
<div className="navbar bg-base border-b border-base-300 shadow-sm px-4 min-h-14 flex-none">
|
||||
<div className="navbar-start gap-3">
|
||||
<ShimmerBlock className="h-8 w-8 rounded" />
|
||||
<ShimmerBlock className="h-5 w-32" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex-1 overflow-hidden flex flex-col gap-3 p-4">
|
||||
{/* Meta cards shimmer */}
|
||||
<div className="grid grid-cols-1 md:grid-cols-3 gap-3 flex-none">
|
||||
<MetaCardShimmer />
|
||||
<MetaCardShimmer />
|
||||
<MetaCardShimmer />
|
||||
</div>
|
||||
|
||||
{/* Table card shimmer */}
|
||||
<div className="card bg-base-100 border border-base-300 shadow-sm flex-1 min-h-0 flex flex-col">
|
||||
<div className="flex flex-col min-h-0 h-full">
|
||||
{/* Header */}
|
||||
<div className="flex items-center justify-between px-5 py-3 border-b border-base-200 flex-none">
|
||||
<div className="flex items-center gap-2">
|
||||
<ShimmerBlock className="h-6 w-6 rounded-md" />
|
||||
<ShimmerBlock className="h-4 w-28" />
|
||||
<ShimmerBlock className="h-5 w-14 rounded-full" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Table skeleton */}
|
||||
<div className="overflow-hidden flex-1">
|
||||
<table className="table table-sm w-full">
|
||||
<thead>
|
||||
<tr className="border-b border-base-200">
|
||||
{["w-12 pl-5", "", "w-28", "w-36", "w-52"].map((cls, i) => (
|
||||
<th key={i} className={cls}>
|
||||
<ShimmerBlock className="h-3 w-16" />
|
||||
</th>
|
||||
))}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Array.from({ length: 5 }).map((_, i) => (
|
||||
<TableRowShimmer key={i} delay={i * 80} />
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{/* Footer shimmer */}
|
||||
<div className="flex items-center px-5 py-2.5 border-t border-base-200 flex-none bg-base-50">
|
||||
<ShimmerBlock className="h-3 w-40" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>{`
|
||||
@keyframes shimmer {
|
||||
0% { background-position: 200% 0; }
|
||||
100% { background-position: -200% 0; }
|
||||
}
|
||||
`}</style>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// ── MAIN COMPONENT ────────────────────────────────────────────────────────────
|
||||
|
||||
export default function AuditTrailsBody() {
|
||||
const { t } = useTranslation();
|
||||
const [copied, setCopied] = useState(false);
|
||||
const [visible, setVisible] = useState([]);
|
||||
const [translatedActions, setTranslatedActions] = useState({});
|
||||
const [isTranslating, setIsTranslating] = useState(false);
|
||||
const previousLanguageRef = useRef(null);
|
||||
const { getLocalizedLabel } = useLocalizedLabel();
|
||||
|
||||
const { formJson } = useDocStore();
|
||||
const uid = useDocStore((s) => s.uid);
|
||||
const status = useDocStore((s) => s.status);
|
||||
const docs = useDocStore((s) => s.docs);
|
||||
const audit = useDocStore((s) => s.audit);
|
||||
const isLoaded = useDocStore((s) => s.isLoaded);
|
||||
const setAuditLoading = useDocStore((s) => s.setAuditLoading);
|
||||
const isProUser = useDocStore((s) => s.isProUser)
|
||||
const currentLanguage = useDocStore((s) => s.currentLanguage);
|
||||
|
||||
|
||||
// ── Translate all audit actions when language changes ──
|
||||
useEffect(() => {
|
||||
if (!audit?.length) return;
|
||||
const newLang = currentLanguage?.value || 'en';
|
||||
const languageChanged = previousLanguageRef.current !== newLang;
|
||||
if (!languageChanged) return;
|
||||
|
||||
previousLanguageRef.current = newLang;
|
||||
setAuditLoading(true);
|
||||
setTranslatedActions({});
|
||||
setVisible([]);
|
||||
|
||||
// Await the language change FIRST, then translate
|
||||
i18n.reloadResources(newLang, 'translation').then(() => { //reloadResources forces a fresh HTTP fetch regardless
|
||||
return i18n.changeLanguage(newLang);
|
||||
}).then(() => {
|
||||
const translations = {};
|
||||
for (let i = 0; i < audit.length; i++) {
|
||||
translations[i] = translateAuditAction(audit[i].action, i18n.t.bind(i18n));
|
||||
}
|
||||
setTranslatedActions(translations);
|
||||
setAuditLoading(false);
|
||||
audit.forEach((_, idx) => {
|
||||
setTimeout(() => setVisible(prev => [...prev, idx]), idx * 80);
|
||||
});
|
||||
});
|
||||
|
||||
}, [currentLanguage?.value, audit]);
|
||||
|
||||
// Staggered row reveal after data loads
|
||||
useEffect(() => {
|
||||
if (!isLoaded || !audit?.length) return;
|
||||
// Don't re-run if we're mid-language-change (translations will trigger their own reveal)
|
||||
if (previousLanguageRef.current === null) return;
|
||||
setVisible([]);
|
||||
audit.forEach((_, i) => {
|
||||
setTimeout(() => setVisible(v => [...v, i]), i * 120 + 200);
|
||||
});
|
||||
}, [isLoaded, audit]);
|
||||
|
||||
const handleCopy = () => {
|
||||
navigator.clipboard.writeText(uid);
|
||||
setCopied(true);
|
||||
setTimeout(() => setCopied(false), 2000);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// ── Show shimmer while data is not ready ──
|
||||
if (!isLoaded || !audit) return <ShimmerLayout />;
|
||||
|
||||
return (
|
||||
<div className="dvh-screen md:h-screen flex flex-col bg-base-200 overflow-hidden font-sans">
|
||||
|
||||
{/* ── NAVBAR ── */}
|
||||
<div className="navbar bg-regal-blue border-b border-base-300 shadow-sm px-3 sm:px-5 min-h-14 flex-none">
|
||||
|
||||
{/* LEFT SIDE */}
|
||||
<div className="navbar-start gap-2 sm:gap-3">
|
||||
<div className="flex items-center gap-2 sm:gap-3">
|
||||
|
||||
{/* Logo */}
|
||||
<div className="w-8 h-8 sm:w-10 sm:h-10 flex items-center justify-center">
|
||||
<img
|
||||
alt="logo"
|
||||
src={SMELogo}
|
||||
className="w-full h-full object-contain"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{/* Text */}
|
||||
<div className="flex flex-col leading-tight">
|
||||
<span className="text-[10px] sm:text-[12px] text-white">
|
||||
Sign Made Easy
|
||||
</span>
|
||||
<span className="font-semibold text-white text-xs sm:text-sm">
|
||||
{t("auditPage.subtitle")}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* RIGHT SIDE */}
|
||||
<div className="navbar-end">
|
||||
{isProUser && <LanguageDropdown />}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{/* ── PAGE BODY ── */}
|
||||
<div className="flex-1 overflow-hidden flex flex-col gap-2 sm:gap-3 p-2 sm:p-4">
|
||||
|
||||
{/* ── META CARDS ── */}
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2 sm:gap-3 flex-none">
|
||||
|
||||
{/* Transaction ID */}
|
||||
<div className="bg-gray-100 border border-base-300 shadow-sm">
|
||||
<div className="card-body p-3 sm:p-4 gap-1.5 sm:gap-2">
|
||||
<div className="flex items-center gap-1.5">
|
||||
<p className="text-[11px] sm:text-[13px] font-semibold text-black tracking-widest">
|
||||
{t("auditPage.meta.transactionId")}
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<code className="font-bold text-[12px] sm:text-[15px] text-base-content/70 truncate flex-1 px-2 py-1 rounded break-all">
|
||||
{uid || "—"}
|
||||
</code>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Status */}
|
||||
<div className="bg-gray-100 border border-base-300 shadow-sm">
|
||||
<div className="card-body p-3 sm:p-4 gap-1.5 sm:gap-2">
|
||||
<div className="flex items-center gap-1.5">
|
||||
<p className="text-[11px] sm:text-[13px] font-semibold text-black tracking-widest">
|
||||
{t("auditPage.meta.transactionStatus")}
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<span className="badge badge-success badge-outline font-semibold text-[10px] sm:text-xs px-2 sm:px-3 py-2 sm:py-3 gap-1.5">
|
||||
<span className="w-1.5 h-1.5 rounded-full bg-success inline-block animate-pulse" />
|
||||
{status || "—"}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* File Name */}
|
||||
<div className="bg-gray-100 border border-base-300 shadow-sm sm:col-span-2 lg:col-span-1">
|
||||
<div className="card-body p-3 sm:p-4 gap-1.5 sm:gap-2">
|
||||
<div className="flex items-center gap-1.5">
|
||||
<p className="text-[11px] sm:text-[13px] font-semibold text-black tracking-widest">
|
||||
{t("auditPage.meta.files")}
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex flex-wrap items-center gap-1.5 sm:gap-2">
|
||||
{docs.map((item, index) => (
|
||||
<span className="text-[9px] sm:text-[10px] font-medium text-base-content truncate bg-white px-1.5 sm:px-2 rounded-lg py-1 sm:py-2 max-w-[150px] sm:max-w-none" key={index}>
|
||||
{item.title}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* ── AUDIT TRAIL CARD ── */}
|
||||
<div className="card bg-base-100 border border-base-300 shadow-sm flex-1 min-h-0 flex flex-col">
|
||||
<div className="flex flex-col min-h-0 h-full">
|
||||
|
||||
{/* Card header */}
|
||||
<div className="flex flex-col sm:flex-row sm:items-center justify-between px-3 sm:px-5 py-2 sm:py-3 border-b border-base-200 flex-none bg-gray-100 gap-2 sm:gap-0">
|
||||
<div className="flex flex-col items-start">
|
||||
<span className="font-semibold text-sm sm:text-md text-base-content">
|
||||
{t("auditPage.audit.title")}
|
||||
</span>
|
||||
<span className="text-black text-[11px] sm:text-[13px]">
|
||||
{/* {t("auditPage.audit.description")} */}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Scrollable table - Horizontal scroll on mobile */}
|
||||
<div className="overflow-x-auto overflow-y-auto flex-1 no-scrollbar">
|
||||
<div className="min-w-[640px] lg:min-w-0">
|
||||
<table className="table table-sm w-full">
|
||||
<thead className="sticky top-0 z-10 bg-base-100">
|
||||
<tr className="border-b border-base-200">
|
||||
<th className="text-[9px] sm:text-[10px] font-semibold text-regal-blue uppercase tracking-widest px-3 sm:px-4 py-2 sm:py-3">
|
||||
{t("auditPage.table.actions")}
|
||||
</th>
|
||||
<th className="text-[9px] sm:text-[10px] font-semibold text-regal-blue uppercase tracking-widest px-3 sm:px-4 py-2 sm:py-3 whitespace-nowrap">
|
||||
{t("auditPage.table.language")}
|
||||
</th>
|
||||
<th className="text-[9px] sm:text-[10px] font-semibold text-regal-blue uppercase tracking-widest px-3 sm:px-4 py-2 sm:py-3 whitespace-nowrap">
|
||||
{t("auditPage.table.ipAddress")}
|
||||
</th>
|
||||
<th className="text-[9px] sm:text-[10px] font-semibold text-regal-blue uppercase tracking-widest px-3 sm:px-4 py-2 sm:py-3 whitespace-nowrap">
|
||||
{t("auditPage.table.date")}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{audit.map((row, i) => {
|
||||
const config = getConfig(row.type, row.action);
|
||||
const RowIcon = config.icon;
|
||||
const { datetime, tz } = parseDate(row.date);
|
||||
// const lang = row.language || "—";
|
||||
const translatedAction = translatedActions[i] || row.action;
|
||||
const isTranslationLoading = isTranslating;
|
||||
|
||||
return (
|
||||
<tr
|
||||
key={i}
|
||||
className="border-b border-base-100 last:border-0 hover:bg-base-50 transition-all duration-300"
|
||||
style={{
|
||||
opacity: visible.includes(i) ? 1 : 0,
|
||||
transform: visible.includes(i) ? "translateY(0)" : "translateY(10px)",
|
||||
transition: "opacity 0.35s ease, transform 0.35s ease",
|
||||
}}
|
||||
>
|
||||
{/* Action */}
|
||||
<td className="py-2 sm:py-3.5 px-3 sm:px-4">
|
||||
<div className="flex items-center gap-2 sm:gap-3">
|
||||
<div className={`w-7 h-7 sm:w-8 sm:h-8 rounded-full flex items-center justify-center shrink-0 ${config.iconBg}`}>
|
||||
<RowIcon size={12} className={`sm:text-[14px] ${config.iconColor}`} />
|
||||
</div>
|
||||
<div className="flex-1">
|
||||
{isTranslationLoading ? (
|
||||
<div className="flex items-center gap-2">
|
||||
<div className="w-3 h-3 border-2 border-gray-400 border-t-transparent rounded-full animate-spin" />
|
||||
<span className="text-xs text-gray-400">Loading translation...</span>
|
||||
</div>
|
||||
) : (
|
||||
<>
|
||||
<p className="text-xs sm:text-sm text-base-content/80 leading-snug break-words">
|
||||
{translatedAction}
|
||||
</p>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
{/* Language */}
|
||||
<td className="py-2 sm:py-3.5 px-3 sm:px-4">
|
||||
<span className={`badge badge-sm font-medium text-[9px] sm:text-xs whitespace-nowrap ${config.badgeClass}`}>
|
||||
{getLocalizedLabel(row.language)}
|
||||
</span>
|
||||
</td>
|
||||
|
||||
{/* IP Address */}
|
||||
<td className="py-2 sm:py-3.5 px-3 sm:px-4">
|
||||
<code className="font-mono text-[9px] sm:text-[11px] text-base-content/55 bg-base-200 px-1.5 sm:px-2 py-1 rounded break-all">
|
||||
{row.ip}
|
||||
</code>
|
||||
</td>
|
||||
|
||||
{/* Date */}
|
||||
<td className="py-2 sm:py-3.5 px-3 sm:px-4">
|
||||
<p className="font-mono text-[10px] sm:text-xs text-base-content/70 whitespace-nowrap">
|
||||
{datetime}
|
||||
</p>
|
||||
<p className="text-[8px] sm:text-[10px] text-base-content/35 mt-0.5 whitespace-nowrap">
|
||||
{tz}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>{`
|
||||
@keyframes shimmer {
|
||||
0% { background-position: 200% 0; }
|
||||
100% { background-position: -200% 0; }
|
||||
}
|
||||
|
||||
/* Custom scrollbar for better mobile experience */
|
||||
.scrollbar-thin::-webkit-scrollbar {
|
||||
height: 4px;
|
||||
width: 4px;
|
||||
}
|
||||
|
||||
.scrollbar-thin::-webkit-scrollbar-track {
|
||||
background: #f1f1f1;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.scrollbar-thin::-webkit-scrollbar-thumb {
|
||||
background: #888;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.scrollbar-thin::-webkit-scrollbar-thumb:hover {
|
||||
background: #555;
|
||||
}
|
||||
|
||||
/* Better touch scrolling on mobile */
|
||||
@media (max-width: 640px) {
|
||||
.overflow-x-auto {
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
}
|
||||
`}</style>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
@ -0,0 +1,368 @@
|
|||
import { ChevronDown, HelpCircle, Info, XCircle, RefreshCw, FileText, ArrowDownToLine, Download, History } from "lucide-react";
|
||||
import SMELogo from "../../assets/sme-logo.png";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { useDocStore } from "../../store";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import LanguageDropdown from "../LanguageDropdown";
|
||||
import AiIcon from '../../assets/AiIcon.png';
|
||||
import SMELogoIcon from '../../assets/SMELogo.png';
|
||||
import { downloadPdfApi } from "../../services/downloadDocument";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { fetchReassignData } from "../../services/reassignService";
|
||||
import { isRtlLanguage } from "../../i18n";
|
||||
|
||||
const Header = ({ progressPercent, uuid, setShowCancelTransaction, setShowLanguageBasedTermsAndConditions, handleSubmitClick, setOpenDrawer }) => {
|
||||
const docFormJson = useDocStore((state) => state.formJson);
|
||||
console.log("docFormJson123", docFormJson)
|
||||
const { t, i18n } = useTranslation();
|
||||
const [open, setOpen] = useState(false);
|
||||
const [userMenuOpen, setUserMenuOpen] = useState(false);
|
||||
const dropdownRef = useRef(null);
|
||||
const userMenuRef = useRef(null);
|
||||
const navigate = useNavigate();
|
||||
const [loadingItem, setLoadingItem] = useState(null);
|
||||
// Determine RTL based on current i18n language
|
||||
const isRtl = isRtlLanguage(i18n.language);
|
||||
|
||||
console.log(isRtl, "Drop Down ")
|
||||
|
||||
const isCCRole = docFormJson?.role === 'CC';
|
||||
const isInPersonSigner = docFormJson?.role === 'InPersonSigner';
|
||||
const isDraft = docFormJson?.status === 'DRAFT';
|
||||
const isProUser = docFormJson?.isProUser
|
||||
|
||||
// Menu configuration for regular signers
|
||||
const signerMenuItems = [
|
||||
{
|
||||
id: "download-pdf",
|
||||
labelKey: "menu.downloadPdf",
|
||||
icon: <ArrowDownToLine size={16} />,
|
||||
action: async () => {
|
||||
await downloadPdfApi('pdf');
|
||||
},
|
||||
danger: false,
|
||||
divider: false,
|
||||
visible: true
|
||||
},
|
||||
{
|
||||
id: "audit-trail",
|
||||
labelKey: "menu.auditTrail",
|
||||
icon: <History size={16} />,
|
||||
action: async () => {
|
||||
await downloadPdfApi('audit');
|
||||
},
|
||||
danger: false,
|
||||
divider: false,
|
||||
visible: !docFormJson?.hide_audit_trail
|
||||
},
|
||||
{
|
||||
id: "reassign",
|
||||
labelKey: "menu.reassignSigner",
|
||||
icon: <RefreshCw size={16} />,
|
||||
action: async () => {
|
||||
try {
|
||||
await fetchReassignData();
|
||||
navigate(`/reassign?uuid=${uuid}`, { state: { fromSign: true } }, { replace: true });
|
||||
} catch (error) {
|
||||
console.error("Failed to fetch reassign data", error);
|
||||
}
|
||||
},
|
||||
danger: false,
|
||||
divider: false,
|
||||
visible: docFormJson?.re_assignable && !isInPersonSigner
|
||||
},
|
||||
{
|
||||
id: "cancel",
|
||||
labelKey: "menu.cancelTransaction",
|
||||
icon: <XCircle size={16} />,
|
||||
action: () => setShowCancelTransaction(true),
|
||||
danger: true,
|
||||
divider: false,
|
||||
visible: true
|
||||
},
|
||||
{
|
||||
id: "terms",
|
||||
labelKey: "menu.viewTerms",
|
||||
icon: <FileText size={16} />,
|
||||
action: () => setShowLanguageBasedTermsAndConditions(true),
|
||||
danger: false,
|
||||
divider: true,
|
||||
visible: true
|
||||
},
|
||||
{
|
||||
id: "help",
|
||||
labelKey: "menu.helpSupport",
|
||||
icon: <HelpCircle size={16} />,
|
||||
action: () => console.log("Help & Support"),
|
||||
danger: false,
|
||||
href: "https://support.signmadeasy.com",
|
||||
divider: false,
|
||||
visible: true
|
||||
},
|
||||
{
|
||||
id: "about",
|
||||
labelKey: "menu.about",
|
||||
icon: <Info size={16} />,
|
||||
action: () => console.log("About SME"),
|
||||
danger: false,
|
||||
href: "https://signmadeasy.com",
|
||||
divider: false,
|
||||
visible: true
|
||||
}
|
||||
];
|
||||
|
||||
// Menu configuration for CC role (only PDF and Audit Trail)
|
||||
const ccMenuItems = [
|
||||
{
|
||||
id: "download-pdf",
|
||||
labelKey: "menu.downloadPdf",
|
||||
icon: <ArrowDownToLine size={16} />,
|
||||
action: async () => {
|
||||
await downloadPdfApi('pdf');
|
||||
},
|
||||
danger: false,
|
||||
divider: false,
|
||||
visible: true
|
||||
},
|
||||
{
|
||||
id: "audit-trail",
|
||||
labelKey: "menu.auditTrail",
|
||||
icon: <History size={16} />,
|
||||
action: async () => {
|
||||
await downloadPdfApi('audit');
|
||||
},
|
||||
danger: false,
|
||||
divider: false,
|
||||
visible: !docFormJson?.hide_audit_trail
|
||||
}
|
||||
];
|
||||
|
||||
// Select menu items based on role
|
||||
const userMenuItems = isCCRole ? ccMenuItems : signerMenuItems;
|
||||
|
||||
// Close dropdowns on outside click
|
||||
useEffect(() => {
|
||||
function handleClickOutside(e) {
|
||||
if (loadingItem) return;
|
||||
|
||||
if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {
|
||||
setOpen(false);
|
||||
}
|
||||
if (userMenuRef.current && !userMenuRef.current.contains(e.target)) {
|
||||
setUserMenuOpen(false);
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener("mousedown", handleClickOutside);
|
||||
return () => document.removeEventListener("mousedown", handleClickOutside);
|
||||
}, [loadingItem]);
|
||||
|
||||
const handleMenuItemClick = async (item) => {
|
||||
if (!item.action) return;
|
||||
|
||||
try {
|
||||
setLoadingItem(item.id);
|
||||
await item.action();
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
} finally {
|
||||
setLoadingItem(null);
|
||||
|
||||
// Don't close dropdown for download items
|
||||
if (item.id !== "download-pdf" && item.id !== "audit-trail") {
|
||||
setUserMenuOpen(false);
|
||||
setOpen(false);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="flex flex-col bg-regal-blue">
|
||||
{/* Top Bar */}
|
||||
<div className="flex items-center justify-between w-full px-4 py-3">
|
||||
{/* Responsive Logo - Mobile vs Tablet/Desktop */}
|
||||
{/* Mobile */}
|
||||
<img
|
||||
src={docFormJson?.logo_url ?? SMELogoIcon}
|
||||
className="h-7 max-w-25 w-auto object-contain block md:hidden"
|
||||
alt="SME Logo"
|
||||
/>
|
||||
|
||||
{/* Desktop */}
|
||||
<img
|
||||
src={docFormJson?.logo_url ?? SMELogo}
|
||||
className="h-7 w-auto object-contain hidden md:block"
|
||||
alt="SME Logo"
|
||||
/>
|
||||
|
||||
<div className="flex gap-1">
|
||||
{isProUser && <LanguageDropdown />}
|
||||
|
||||
{!isDraft && (
|
||||
<div className="flex items-center gap-2 sm:gap-4">
|
||||
{/* AI Summary Button - Only show for non-CC roles */}
|
||||
{docFormJson?.ai_enabled && !isCCRole && (
|
||||
<button
|
||||
className="btn btn-sm text-white bg-linear-to-r from-[#0CCBD4] to-[#D865FF] border-0 flex items-center gap-1 sm:gap-2"
|
||||
onClick={() => setOpenDrawer(true)}
|
||||
>
|
||||
<img src={AiIcon} alt="" className="w-4 h-4 sm:w-5 sm:h-5" />
|
||||
<span className="hidden sm:inline">{t("header.aiSummary")}</span>
|
||||
<span className="sm:hidden sr-only">{t("header.aiSummary")}</span>
|
||||
</button>
|
||||
)}
|
||||
|
||||
<div className="relative flex cursor-pointer" ref={dropdownRef}>
|
||||
{/* CC Role: Show single "Options" button instead of split button */}
|
||||
{isCCRole ? (
|
||||
<>
|
||||
<button
|
||||
className="group flex items-center gap-1 sm:gap-2 bg-white/95 hover:bg-white px-2 sm:px-4 py-1.5 rounded-l-lg
|
||||
text-regal-blue font-semibold text-sm transition-all duration-200
|
||||
hover:shadow-md active:scale-95 border-r border-gray-200"
|
||||
onClick={() => setOpen(!open)}
|
||||
>
|
||||
<Download size={16} className="sm:w-5 sm:h-5" />
|
||||
<span className="hidden sm:inline">{t("header.options")}</span>
|
||||
<span className="sm:hidden">{t("header.options")}</span>
|
||||
</button>
|
||||
|
||||
<button
|
||||
onClick={() => setOpen(!open)}
|
||||
className="bg-white/95 hover:bg-white px-2 py-1.5 rounded-r-lg
|
||||
text-regal-blue transition-all duration-200 hover:shadow-md
|
||||
active:scale-95 flex items-center justify-center"
|
||||
>
|
||||
<ChevronDown
|
||||
size={16}
|
||||
className={`transition-transform duration-200 ${open ? 'rotate-180' : ''}`}
|
||||
/>
|
||||
</button>
|
||||
</>
|
||||
) : (
|
||||
/* Regular Signer: Show split button with Complete Sign */
|
||||
<>
|
||||
<button
|
||||
className={`group flex items-center gap-1 sm:gap-2 bg-white/95 hover:bg-white px-2 sm:px-4 py-1.5
|
||||
text-regal-blue font-semibold text-sm transition-all duration-200
|
||||
hover:shadow-md active:scale-95 border-r border-gray-200 cursor-pointer ${isRtl
|
||||
? 'rounded-r-lg border-l border-gray-200'
|
||||
: 'rounded-l-lg border-r border-gray-200'
|
||||
}`}
|
||||
onClick={handleSubmitClick}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
className="h-4 w-4 sm:h-5 sm:w-5"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
strokeWidth={2}
|
||||
d="M5 13l4 4L19 7"
|
||||
/>
|
||||
</svg>
|
||||
<span className="hidden sm:inline">{t("header.completeSign")}</span>
|
||||
<span className="sm:hidden">{t("header.sign")}</span>
|
||||
</button>
|
||||
|
||||
<button
|
||||
onClick={() => setOpen(!open)}
|
||||
className={`
|
||||
bg-white/95 hover:bg-white px-2 py-1.5
|
||||
text-regal-blue transition-all duration-200 hover:shadow-md
|
||||
active:scale-95 flex items-center justify-center cursor-pointer
|
||||
${isRtl
|
||||
? 'rounded-l-lg'
|
||||
: 'rounded-r-lg'
|
||||
}
|
||||
`}
|
||||
>
|
||||
<ChevronDown
|
||||
size={16}
|
||||
className={`transition-transform duration-200 ${open ? 'rotate-180' : ''}`}
|
||||
/>
|
||||
</button>
|
||||
</>
|
||||
)}
|
||||
|
||||
{/* Dropdown Menu */}
|
||||
{open && (
|
||||
<div className={`absolute ${isRtl ? "left-0" : "right-0"} top-10 w-56 sm:w-64 bg-white rounded-lg shadow-xl z-50 py-2
|
||||
animate-in fade-in slide-in-from-top-2 duration-200`}>
|
||||
{userMenuItems.map((item, index) => {
|
||||
const commonClass = `w-full text-left px-4 py-2.5 text-xs sm:text-sm transition-all duration-200 cursor-pointer
|
||||
flex items-center gap-3 group
|
||||
${item.danger
|
||||
? "text-red-600 hover:bg-red-50 hover:text-red-700"
|
||||
: "text-gray-700 hover:bg-blue-50 hover:text-regal-blue"
|
||||
}`;
|
||||
|
||||
const iconClass = `transition-transform duration-200 group-hover:scale-110
|
||||
${item.danger
|
||||
? "text-red-500"
|
||||
: "text-gray-400 group-hover:text-regal-blue"
|
||||
}`;
|
||||
|
||||
return (
|
||||
<div key={item.id}>
|
||||
{item.divider && index > 0 && (
|
||||
<hr className="my-2 border-gray-200" />
|
||||
)}
|
||||
|
||||
{item.href ? (
|
||||
<a href={item.href} target="_blank" className={commonClass}>
|
||||
<span className={iconClass}>{item.icon}</span>
|
||||
<span className="flex-1">
|
||||
{loadingItem === item.id ? t("header.processing") : t(item.labelKey)}
|
||||
</span>
|
||||
</a>
|
||||
) : (
|
||||
item.visible && (
|
||||
<button
|
||||
onClick={() => handleMenuItemClick(item)}
|
||||
className={commonClass}
|
||||
disabled={loadingItem === item.id}
|
||||
>
|
||||
<span className={iconClass}>
|
||||
{loadingItem === item.id ? (
|
||||
<RefreshCw size={16} className="animate-spin" />
|
||||
) : (
|
||||
item.icon
|
||||
)}
|
||||
</span>
|
||||
|
||||
<span className="flex-1">
|
||||
{loadingItem === item.id ? t("header.processing") : t(item.labelKey)}
|
||||
</span>
|
||||
</button>
|
||||
)
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Progress Bar - Only show for non-CC roles */}
|
||||
{!isCCRole && (
|
||||
<div className="w-full h-1 bg-blue-300/20">
|
||||
<div
|
||||
className="h-full bg-gradient-to-r from-yellow-400 to-yellow-500 transition-all duration-500 ease-out rounded-r-full"
|
||||
style={{ width: `${progressPercent}%` }}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Header;
|
||||
|
|
@ -0,0 +1,437 @@
|
|||
import React, { useState, useCallback, useEffect, useRef } from 'react';
|
||||
import {
|
||||
IconMinus,
|
||||
IconPhoto,
|
||||
IconH1,
|
||||
IconLayoutList,
|
||||
IconTextSize,
|
||||
IconRectangle,
|
||||
IconLayoutBottombar,
|
||||
IconRotate,
|
||||
IconArrowUp,
|
||||
IconLoader2,
|
||||
IconAlertCircle,
|
||||
IconChevronDown,
|
||||
IconChevronRight,
|
||||
IconDeviceDesktop,
|
||||
IconPalette,
|
||||
IconAlignLeft,
|
||||
IconAlignCenter,
|
||||
IconAlignRight,
|
||||
IconEye,
|
||||
IconEyeOff,
|
||||
IconBuilding,
|
||||
IconLink,
|
||||
IconPhone,
|
||||
IconMapPin,
|
||||
} from '@tabler/icons-react';
|
||||
import { DEFAULT_CONFIG_JSON } from './EmailTemplateJson';
|
||||
import { AlignField, applyConfigToHTML, ColorField, Section, ToggleSwitch } from './EmailTemplateFeatures';
|
||||
import { X } from 'lucide-react';
|
||||
import axios from 'axios';
|
||||
import Loader from '../../helper/Loader';
|
||||
import { HeaderEmailIcon } from './HeaderEmailIcon';
|
||||
|
||||
|
||||
|
||||
// ─── Main Component ───────────────────────────────────────────────────────────
|
||||
const EmailTemplateEditor = ({ originalHTML, jsonConfig, setJsonConfig, isLoading, error, authDataSF, resetConfig }) => {
|
||||
const iframeRef = useRef(null);
|
||||
const [isSaving, setIsSaving] = useState(false);
|
||||
|
||||
const updateConfig = useCallback((key, value) => {
|
||||
console.log(`🔄 Updating ${key}:`, value);
|
||||
setJsonConfig((prev) => {
|
||||
const newConfig = { ...prev, [key]: value };
|
||||
console.log('📝 New config:', newConfig);
|
||||
return newConfig;
|
||||
});
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (!iframeRef.current || !originalHTML) return;
|
||||
const patched = applyConfigToHTML(originalHTML, jsonConfig);
|
||||
const doc = iframeRef.current.contentDocument;
|
||||
if (doc) {
|
||||
doc.open();
|
||||
doc.write(patched);
|
||||
doc.close();
|
||||
}
|
||||
}, [jsonConfig, originalHTML]);
|
||||
|
||||
const handleReset = () => {
|
||||
setJsonConfig(resetConfig);
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
window.parent.postMessage({
|
||||
type: "TEMPLATE_CLOSED",
|
||||
success: true,
|
||||
}, "*")
|
||||
}
|
||||
|
||||
const handleSave = async () => {
|
||||
try {
|
||||
setIsSaving(true);
|
||||
const finalHTML = originalHTML ? applyConfigToHTML(originalHTML, jsonConfig) : '';
|
||||
const payload = { buId: authDataSF?.buId, html: finalHTML, config: JSON.stringify(jsonConfig) };
|
||||
|
||||
|
||||
console.log('Saving config:', jsonConfig);
|
||||
console.log('Saving HTML:', finalHTML);
|
||||
|
||||
const res = await axios.post(
|
||||
`${import.meta.env.VITE_BASE_API_URL}/email/template?businessUnitId=${authDataSF.buid}`,
|
||||
jsonConfig,
|
||||
{
|
||||
headers: {
|
||||
'X-AUTH-TYPE': 'USER',
|
||||
'Authorization': `Bearer ${authDataSF.token}`,
|
||||
"ngrok-skip-browser-warning": "69420",
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
console.log("Response Save", res)
|
||||
|
||||
if (res.status === 200) {
|
||||
window.parent.postMessage({
|
||||
type: "TEMPLATE_SAVED",
|
||||
success: true,
|
||||
messgae: "Template Save",
|
||||
data: res?.data
|
||||
}, "*")
|
||||
console.log("End")
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Save failed:', err);
|
||||
window.parent.postMessage(
|
||||
{
|
||||
type: "TEMPLATE_SAVED",
|
||||
success: false,
|
||||
error: err?.message || "Unknown error",
|
||||
message: "An error occurred while saving the configuration. Please contact support.",
|
||||
},
|
||||
"*"
|
||||
);
|
||||
} finally {
|
||||
setIsSaving(false);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// Add this check - if config is null and not loading, show error
|
||||
if (!jsonConfig && !isLoading) {
|
||||
return (
|
||||
<div className="h-screen flex items-center justify-center bg-gray-100">
|
||||
<div className="text-center p-8 bg-white rounded-lg shadow-lg">
|
||||
<IconAlertCircle size={48} className="text-red-500 mx-auto mb-4" />
|
||||
<h3 className="text-lg font-semibold text-red-700 mb-2">No Configuration Found</h3>
|
||||
<p className="text-gray-600">Unable to load template configuration from server.</p>
|
||||
<button
|
||||
onClick={() => window.location.reload()}
|
||||
className="mt-4 px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600"
|
||||
>
|
||||
Retry
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
// If still loading or no config yet, show loading
|
||||
if (!jsonConfig || isLoading) {
|
||||
return (
|
||||
<Loader transparentbg={false} />
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
return (
|
||||
<div className="h-screen bg-gray-100 flex overflow-hidden ">
|
||||
{/* Sidebar */}
|
||||
<div className="w-96 bg-white border-r border-gray-200 flex flex-col shadow-xl z-10 overflow-y-auto no-scrollbar">
|
||||
<div className="px-6 py-4 border-b border-gray-100 bg-regal-blue sticky top-0 z-20">
|
||||
<div className="flex items-center justify-between">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-8 h-8 bg-white/20 rounded-lg flex items-center justify-center backdrop-blur">
|
||||
<HeaderEmailIcon />
|
||||
</div>
|
||||
<div>
|
||||
<h1 className="text-white font-semibold text-base">Customize Email Template</h1>
|
||||
</div>
|
||||
</div>
|
||||
{isLoading && <IconLoader2 size={18} className="text-white animate-spin" />}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{error && (
|
||||
<div className="mx-4 mt-4 p-3 rounded-lg bg-red-50 border border-red-200 flex items-start gap-2">
|
||||
<IconAlertCircle size={16} className="text-red-500 shrink-0 mt-0.5" />
|
||||
<div className="flex-1">
|
||||
<p className="text-xs text-red-700 font-medium">Failed to load template</p>
|
||||
<p className="text-xs text-red-600 mt-0.5">{error}</p>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="flex-1">
|
||||
<div className="py-4">
|
||||
<Section title="TOP BAR" icon={<IconMinus size={16} />} defaultExpanded={true}>
|
||||
<ColorField label="Background Color" jsonKey="top_bar_bg_color" value={jsonConfig.top_bar_bg_color} onChange={updateConfig} />
|
||||
<ColorField label="Gradient End Color" jsonKey="top_bar_gradient_end" value={jsonConfig.top_bar_gradient_end} onChange={updateConfig} />
|
||||
{/* <AlignField label="Alignment" jsonKey="top_bar_align" value={jsonConfig.top_bar_align} onChange={updateConfig} /> */}
|
||||
{/* <NumberField label="Height" jsonKey="top_bar_height" value={jsonConfig.top_bar_height} onChange={updateConfig} min={1} max={20} unit="px" /> */}
|
||||
</Section>
|
||||
|
||||
<Section title="LOGO / HEADER" icon={<IconPhoto size={16} />} defaultExpanded={false}>
|
||||
<ColorField label="Background Color" jsonKey="logo_bg_color" value={jsonConfig.logo_bg_color} onChange={updateConfig} />
|
||||
<AlignField label="Logo Alignment" jsonKey="logo_align" value={jsonConfig.logo_align} onChange={updateConfig} />
|
||||
{/* <NumberField label="Max Width" jsonKey="logo_max_width" value={jsonConfig.logo_max_width} onChange={updateConfig} min={50} max={500} unit="px" /> */}
|
||||
{/* <div className="grid grid-cols-2 gap-2">
|
||||
<NumberField label="Padding Top" jsonKey="logo_padding_top" value={jsonConfig.logo_padding_top} onChange={updateConfig} min={0} max={50} unit="px" />
|
||||
<NumberField label="Padding Bottom" jsonKey="logo_padding_bottom" value={jsonConfig.logo_padding_bottom} onChange={updateConfig} min={0} max={50} unit="px" />
|
||||
<NumberField label="Padding Left" jsonKey="logo_padding_left" value={jsonConfig.logo_padding_left} onChange={updateConfig} min={0} max={50} unit="px" />
|
||||
<NumberField label="Padding Right" jsonKey="logo_padding_right" value={jsonConfig.logo_padding_right} onChange={updateConfig} min={0} max={50} unit="px" />
|
||||
</div> */}
|
||||
</Section>
|
||||
|
||||
<Section title="TITLE" icon={<IconH1 size={16} />} defaultExpanded={false}>
|
||||
{/* <TextField label="Title Text" jsonKey="title_text" value={jsonConfig.title_text} onChange={updateConfig} /> */}
|
||||
<ColorField label="Text Color" jsonKey="title_text_color" value={jsonConfig.title_text_color} onChange={updateConfig} />
|
||||
<ColorField label="Background Color" jsonKey="title_bg_color" value={jsonConfig.title_bg_color} onChange={updateConfig} />
|
||||
<AlignField label="Alignment" jsonKey="title_align" value={jsonConfig.title_align} onChange={updateConfig} />
|
||||
{/* <NumberField label="Font Size" jsonKey="title_font_size" value={jsonConfig.title_font_size} onChange={updateConfig} min={12} max={72} unit="px" /> */}
|
||||
{/* <div className="grid grid-cols-2 gap-2">
|
||||
<NumberField label="Margin Top" jsonKey="title_margin_top" value={jsonConfig.title_margin_top} onChange={updateConfig} min={0} max={50} unit="px" />
|
||||
<NumberField label="Margin Bottom" jsonKey="title_margin_bottom" value={jsonConfig.title_margin_bottom} onChange={updateConfig} min={0} max={50} unit="px" />
|
||||
</div> */}
|
||||
</Section>
|
||||
|
||||
<Section title="BODY CONTENT" icon={<IconLayoutList size={16} />} defaultExpanded={false}>
|
||||
<ColorField label="Background Color" jsonKey="body_bg_color" value={jsonConfig.body_bg_color} onChange={updateConfig} />
|
||||
<ColorField label="Text Color" jsonKey="body_text_color" value={jsonConfig.body_text_color} onChange={updateConfig} />
|
||||
<AlignField label="Alignment" jsonKey="body_align" value={jsonConfig.body_align} onChange={updateConfig} />
|
||||
{/* <div className="grid grid-cols-2 gap-2">
|
||||
<NumberField label="Padding Top" jsonKey="body_padding_top" value={jsonConfig.body_padding_top} onChange={updateConfig} min={0} max={50} unit="px" />
|
||||
<NumberField label="Padding Bottom" jsonKey="body_padding_bottom" value={jsonConfig.body_padding_bottom} onChange={updateConfig} min={0} max={50} unit="px" />
|
||||
<NumberField label="Padding Left" jsonKey="body_padding_left" value={jsonConfig.body_padding_left} onChange={updateConfig} min={0} max={50} unit="px" />
|
||||
<NumberField label="Padding Right" jsonKey="body_padding_right" value={jsonConfig.body_padding_right} onChange={updateConfig} min={0} max={50} unit="px" />
|
||||
</div> */}
|
||||
</Section>
|
||||
|
||||
<Section title="SENDER HEADING" icon={<IconTextSize size={16} />} defaultExpanded={false}>
|
||||
{/* <TextField label="Sender Text" jsonKey="sender_text" value={jsonConfig.sender_text} onChange={updateConfig} rows={2} /> */}
|
||||
<ColorField label="Text Color" jsonKey="sender_text_color" value={jsonConfig.sender_text_color} onChange={updateConfig} />
|
||||
{/* <ColorField label="Background Color" jsonKey="sender_bg_color" value={jsonConfig.sender_bg_color} onChange={updateConfig} /> */}
|
||||
{/* <NumberField label="Font Size" jsonKey="sender_font_size" value={jsonConfig.sender_font_size} onChange={updateConfig} min={12} max={72} unit="px" /> */}
|
||||
</Section>
|
||||
|
||||
|
||||
|
||||
<Section title="CUSTOM MESSAGE" icon={<IconLayoutList size={16} />} defaultExpanded={false}>
|
||||
{/* <ToggleSwitch label="Show Custom Message" jsonKey="show_custom_message" checked={jsonConfig.show_custom_message} onChange={updateConfig} />
|
||||
{jsonConfig.show_custom_message && (
|
||||
<> */}
|
||||
{/* <TextField label="Message Text" jsonKey="custom_message_text" value={jsonConfig.custom_message_text} onChange={updateConfig} rows={4} /> */}
|
||||
<ColorField label="Text Color" jsonKey="custom_message_text_color" value={jsonConfig.custom_message_text_color} onChange={updateConfig} />
|
||||
<ColorField label="Background Color" jsonKey="custom_message_bg_color" value={jsonConfig.custom_message_bg_color} onChange={updateConfig} />
|
||||
{/* <AlignField label="Alignment" jsonKey="custom_message_text_align" value={jsonConfig.custom_message_text_align} onChange={updateConfig} /> */}
|
||||
{/* <NumberField label="Font Size" jsonKey="custom_message_font_size" value={jsonConfig.custom_message_font_size} onChange={updateConfig} min={10} max={72} unit="px" /> */}
|
||||
{/* <NumberField label="Line Height" jsonKey="custom_message_line_height" value={jsonConfig.custom_message_line_height} onChange={updateConfig} min={1} max={3} step={0.1} /> */}
|
||||
{/* </>
|
||||
)} */}
|
||||
</Section>
|
||||
|
||||
{/* <Section title="INSTRUCTION TEXT" icon={<IconTextSize size={16} />} defaultExpanded={false}>
|
||||
<ToggleSwitch label="Show Instruction" jsonKey="show_instruction" checked={jsonConfig.show_instruction} onChange={updateConfig} />
|
||||
{jsonConfig.show_instruction && (
|
||||
<>
|
||||
<TextField label="Instruction Text" jsonKey="instruction_text" value={jsonConfig.instruction_text} onChange={updateConfig} rows={2} />
|
||||
<ColorField label="Text Color" jsonKey="instruction_text_color" value={jsonConfig.instruction_text_color} onChange={updateConfig} />
|
||||
<AlignField label="Alignment" jsonKey="instruction_text_align" value={jsonConfig.instruction_text_align} onChange={updateConfig} />
|
||||
<NumberField label="Font Size" jsonKey="instruction_font_size" value={jsonConfig.instruction_font_size} onChange={updateConfig} min={10} max={72} unit="px" />
|
||||
</>
|
||||
)}
|
||||
</Section> */}
|
||||
|
||||
<Section title="BUTTON" icon={<IconRectangle size={16} />} defaultExpanded={false}>
|
||||
{/* <ToggleSwitch label="Show Button" jsonKey="show_button" checked={jsonConfig.show_button} onChange={updateConfig} /> */}
|
||||
{/* {jsonConfig.show_button && (
|
||||
<> */}
|
||||
{/* <TextField label="Button Text" jsonKey="button_text" value={jsonConfig.button_text} onChange={updateConfig} /> */}
|
||||
<ColorField label="Background Color" jsonKey="button_bg_color" value={jsonConfig.button_bg_color} onChange={updateConfig} />
|
||||
<ColorField label="Text Color" jsonKey="button_text_color" value={jsonConfig.button_text_color} onChange={updateConfig} />
|
||||
{/* <AlignField label="Alignment" jsonKey="button_align" value={jsonConfig.button_align} onChange={updateConfig} /> */}
|
||||
{/* <div className="grid grid-cols-2 gap-2">
|
||||
<NumberField label="Padding X" jsonKey="button_padding_left" value={jsonConfig.button_padding_left} onChange={updateConfig} min={5} max={50} unit="px" />
|
||||
<NumberField label="Padding Y" jsonKey="button_padding_top" value={jsonConfig.button_padding_top} onChange={updateConfig} min={5} max={50} unit="px" />
|
||||
</div> */}
|
||||
{/* <NumberField label="Border Radius" jsonKey="button_radius" value={jsonConfig.button_radius} onChange={updateConfig} min={0} max={50} unit="px" />
|
||||
<NumberField label="Font Size" jsonKey="button_font_size" value={jsonConfig.button_font_size} onChange={updateConfig} min={12} max={72} unit="px" /> */}
|
||||
{/* </>
|
||||
)} */}
|
||||
</Section>
|
||||
|
||||
<Section title="REASSIGN & AUDIT" icon={<IconLink size={16} />} defaultExpanded={false}>
|
||||
{/* <ToggleSwitch label="Show Reassign Section" jsonKey="show_reassign_section" checked={jsonConfig.show_reassign_section} onChange={updateConfig} />
|
||||
{jsonConfig.show_reassign_section && (
|
||||
<> */}
|
||||
{/* <TextField label="Reassign Text" jsonKey="reassign_text" value={jsonConfig.reassign_text} onChange={updateConfig} /> */}
|
||||
{/* <TextField label="Link Text" jsonKey="reassign_link_text" value={jsonConfig.reassign_link_text} onChange={updateConfig} /> */}
|
||||
<ColorField label="Reassign Link Color" jsonKey="reassign_link_color" value={jsonConfig.reassign_link_color} onChange={updateConfig} />
|
||||
{/* </>
|
||||
)} */}
|
||||
<div className="border-t border-gray-100 my-3"></div>
|
||||
{/* <ToggleSwitch label="Show Audit Trail Section" jsonKey="show_audit_trail_section" checked={jsonConfig.show_audit_trail_section} onChange={updateConfig} />
|
||||
{jsonConfig.show_audit_trail_section && (
|
||||
<> */}
|
||||
{/* <TextField label="Audit Trail Text" jsonKey="audit_trail_text" value={jsonConfig.audit_trail_text} onChange={updateConfig} /> */}
|
||||
{/* <TextField label="Link Text" jsonKey="audit_trail_link_text" value={jsonConfig.audit_trail_link_text} onChange={updateConfig} /> */}
|
||||
<ColorField label="Audit Link Color" jsonKey="audit_trail_link_color" value={jsonConfig.audit_trail_link_color} onChange={updateConfig} />
|
||||
{/* </>
|
||||
)} */}
|
||||
</Section>
|
||||
|
||||
{/* <Section title="TRANSACTION & REGARDS" icon={<IconTextSize size={16} />} defaultExpanded={false}>
|
||||
<ToggleSwitch label="Show Transaction ID" jsonKey="show_transaction_id" checked={jsonConfig.show_transaction_id} onChange={updateConfig} />
|
||||
{jsonConfig.show_transaction_id && (
|
||||
<>
|
||||
<ColorField label="Text Color" jsonKey="transaction_text_color" value={jsonConfig.transaction_text_color} onChange={updateConfig} />
|
||||
<NumberField label="Font Size" jsonKey="transaction_font_size" value={jsonConfig.transaction_font_size} onChange={updateConfig} min={10} max={72} unit="px" />
|
||||
</>
|
||||
)}
|
||||
<div className="border-t border-gray-100 my-3"></div>
|
||||
<ToggleSwitch label="Show Regards Text" jsonKey="show_regards" checked={jsonConfig.show_regards} onChange={updateConfig} />
|
||||
{jsonConfig.show_regards && (
|
||||
<>
|
||||
<TextField label="Regards Text" jsonKey="regards_text" value={jsonConfig.regards_text} onChange={updateConfig} />
|
||||
<ColorField label="Text Color" jsonKey="regards_text_color" value={jsonConfig.regards_text_color} onChange={updateConfig} />
|
||||
</>
|
||||
)}
|
||||
</Section> */}
|
||||
|
||||
<Section title="COMPANY ADDRESS" icon={<IconBuilding size={16} />} defaultExpanded={false}>
|
||||
{/* <ToggleSwitch label="Show Company Address" jsonKey="show_company_address" checked={jsonConfig.show_company_address} onChange={updateConfig} />
|
||||
{jsonConfig.show_company_address && (
|
||||
<> */}
|
||||
{/* <TextField label="Company Name" jsonKey="company_name" value={jsonConfig.company_name} onChange={updateConfig} /> */}
|
||||
{/* <TextField label="Address Line 1" jsonKey="company_address_line1" value={jsonConfig.company_address_line1} onChange={updateConfig} /> */}
|
||||
{/* <TextField label="Address Line 2" jsonKey="company_address_line2" value={jsonConfig.company_address_line2} onChange={updateConfig} /> */}
|
||||
{/* <TextField label="City/State/Zip" jsonKey="company_city_state_zip" value={jsonConfig.company_city_state_zip} onChange={updateConfig} /> */}
|
||||
{/* <TextField label="Phone" jsonKey="company_phone" value={jsonConfig.company_phone} onChange={updateConfig} /> */}
|
||||
{/* <TextField label="Website" jsonKey="company_website" value={jsonConfig.company_website} onChange={updateConfig} /> */}
|
||||
<ColorField label="Text Color" jsonKey="company_address_text_color" value={jsonConfig.company_address_text_color} onChange={updateConfig} />
|
||||
<ColorField label="Background Gradient Color" jsonKey="company_address_bg_gradient" value={jsonConfig.company_address_bg_gradient} onChange={updateConfig} />
|
||||
<ColorField label="Company Link Color" jsonKey="company_link_color" value={jsonConfig.company_link_color} onChange={updateConfig} />
|
||||
{/* <NumberField label="Font Size" jsonKey="company_address_font_size" value={jsonConfig.company_address_font_size} onChange={updateConfig} min={10} max={72} unit="px" /> */}
|
||||
{/* </>
|
||||
)} */}
|
||||
</Section>
|
||||
|
||||
{/* <Section title="FOOTER" icon={<IconLayoutBottombar size={16} />} defaultExpanded={false}>
|
||||
<ToggleSwitch label="Show Footer" jsonKey="show_footer" checked={jsonConfig.show_footer} onChange={updateConfig} />
|
||||
{jsonConfig.show_footer && (
|
||||
<>
|
||||
<TextField label="Footer Text" jsonKey="footer_text" value={jsonConfig.footer_text} onChange={updateConfig} />
|
||||
<ColorField label="Text Color" jsonKey="footer_text_color" value={jsonConfig.footer_text_color} onChange={updateConfig} />
|
||||
<ColorField label="Background Color" jsonKey="footer_bg_color" value={jsonConfig.footer_bg_color} onChange={updateConfig} />
|
||||
<AlignField label="Alignment" jsonKey="footer_align" value={jsonConfig.footer_align} onChange={updateConfig} />
|
||||
<NumberField label="Font Size" jsonKey="footer_font_size" value={jsonConfig.footer_font_size} onChange={updateConfig} min={10} max={72} unit="px" />
|
||||
<NumberField label="Padding" jsonKey="footer_padding" value={jsonConfig.footer_padding} onChange={updateConfig} min={5} max={50} unit="px" />
|
||||
</>
|
||||
)}
|
||||
</Section> */}
|
||||
|
||||
{/* <Section title="CONTAINER SETTINGS" icon={<IconDeviceDesktop size={16} />} defaultExpanded={false}>
|
||||
<NumberField label="Max Width" jsonKey="email_container_max_width" value={jsonConfig.email_container_max_width} onChange={updateConfig} min={300} max={1200} unit="px" />
|
||||
<ColorField label="Container BG Color" jsonKey="email_container_bg_color" value={jsonConfig.email_container_bg_color} onChange={updateConfig} />
|
||||
<ColorField label="Outer BG Color" jsonKey="body_bg_color_outer" value={jsonConfig.body_bg_color_outer} onChange={updateConfig} />
|
||||
</Section> */}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* <div className="p-5 border-t border-gray-200 bg-gray-50 space-y-3 sticky bottom-0">
|
||||
<button onClick={handleReset} className="w-full py-2.5 text-sm font-medium rounded-lg border border-gray-300 bg-white text-gray-700 hover:bg-gray-50 hover:border-gray-400 transition-all flex items-center justify-center gap-2 shadow-sm">
|
||||
<IconRotate size={16} /> Reset to Default
|
||||
</button>
|
||||
<button onClick={handleSave} disabled={isLoading || !originalHTML} className="w-full py-2.5 text-sm font-medium rounded-lg bg-blue-600 text-white hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed transition-all flex items-center justify-center gap-2 shadow-sm">
|
||||
<IconArrowUp size={16} /> Save Configuration
|
||||
</button>
|
||||
{showToast && (
|
||||
<div className="fixed bottom-6 left-96 transform -translate-x-1/2 z-50 animate-fade-in-up">
|
||||
<div className="px-4 py-2.5 rounded-lg bg-gray-900 text-white text-sm shadow-lg flex items-center gap-2">
|
||||
<svg className="w-4 h-4 text-green-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
|
||||
</svg>
|
||||
Config saved successfully!
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div> */}
|
||||
</div>
|
||||
|
||||
{/* Preview Area */}
|
||||
<div className="flex-1 flex flex-col bg-gray-100">
|
||||
{/* Preview Header */}
|
||||
<div className="bg-white border-b border-gray-200 px-6 py-3 flex items-center justify-end shadow-sm">
|
||||
<div className="flex gap-2">
|
||||
<button className="btn btn-md bg-[#b60554] text-white rounded-2xl" onClick={handleClose}>
|
||||
<X size={13} />
|
||||
Close
|
||||
</button>
|
||||
<button className="btn btn-md rounded-2xl" disabled={isLoading || !originalHTML || isSaving} onClick={handleReset}>
|
||||
<IconRotate size={13} />
|
||||
Reset
|
||||
</button>
|
||||
|
||||
<button
|
||||
className="btn btn-md text-white bg-regal-blue rounded-2xl flex items-center gap-2"
|
||||
onClick={handleSave}
|
||||
disabled={isLoading || !originalHTML || isSaving}
|
||||
>
|
||||
{isSaving ? (
|
||||
<>
|
||||
<IconLoader2 size={13} className="animate-spin" />
|
||||
Saving...
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<IconArrowUp size={13} />
|
||||
Save
|
||||
</>
|
||||
)}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex-1 p-6 overflow-auto">
|
||||
<div className="w-full h-full bg-white rounded-lg shadow-xl overflow-hidden border border-gray-200">
|
||||
{isLoading ? (
|
||||
<div className="flex-1 flex flex-col items-center justify-center h-full gap-4 text-gray-400">
|
||||
<IconLoader2 size={40} className="animate-spin text-blue-500" />
|
||||
<p className="text-sm text-gray-500 font-medium">Loading your email template...</p>
|
||||
</div>
|
||||
) : (
|
||||
<iframe ref={iframeRef} title="Email Template Preview" className="w-full h-full border-0" sandbox="allow-same-origin allow-scripts allow-popups" style={{ background: '#f5f7fa' }} />
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* <style jsx>{`
|
||||
.custom-scrollbar::-webkit-scrollbar { width: 6px; }
|
||||
.custom-scrollbar::-webkit-scrollbar-track { background: #f1f1f1; }
|
||||
.custom-scrollbar::-webkit-scrollbar-thumb { background: #c1c1c1; border-radius: 3px; }
|
||||
.custom-scrollbar::-webkit-scrollbar-thumb:hover { background: #a8a8a8; }
|
||||
@keyframes fade-in-up {
|
||||
from { opacity: 0; transform: translate(-50%, 20px); }
|
||||
to { opacity: 1; transform: translate(-50%, 0); }
|
||||
}
|
||||
.animate-fade-in-up { animation: fade-in-up 0.3s ease-out; }
|
||||
`}</style> */}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default EmailTemplateEditor;
|
||||
|
|
@ -0,0 +1,684 @@
|
|||
import { useState } from "react";
|
||||
import {
|
||||
IconMinus,
|
||||
IconPhoto,
|
||||
IconH1,
|
||||
IconLayoutList,
|
||||
IconTextSize,
|
||||
IconRectangle,
|
||||
IconLayoutBottombar,
|
||||
IconRotate,
|
||||
IconArrowUp,
|
||||
IconLoader2,
|
||||
IconAlertCircle,
|
||||
IconChevronDown,
|
||||
IconChevronRight,
|
||||
IconDeviceDesktop,
|
||||
IconPalette,
|
||||
IconAlignLeft,
|
||||
IconAlignCenter,
|
||||
IconAlignRight,
|
||||
IconEye,
|
||||
IconEyeOff,
|
||||
IconBuilding,
|
||||
IconLink,
|
||||
IconPhone,
|
||||
IconMapPin,
|
||||
} from '@tabler/icons-react';
|
||||
|
||||
// ─── Components ────────────────────────────────────────────────────────────────
|
||||
export const ColorField = ({ label, jsonKey, value, onChange }) => {
|
||||
|
||||
const [opacity, setOpacity] = useState(() => {
|
||||
if (value && value.length === 9) {
|
||||
return parseInt(value.slice(7, 9), 16) / 255;
|
||||
}
|
||||
return 1;
|
||||
});
|
||||
|
||||
const handleColorChange = (e) => {
|
||||
let newColor = e.target.value;
|
||||
// Preserve alpha if it exists
|
||||
if (value && value.length === 9 && opacity < 1) {
|
||||
const alphaHex = Math.round(opacity * 255).toString(16).padStart(2, '0');
|
||||
newColor = newColor + alphaHex;
|
||||
}
|
||||
onChange(jsonKey, newColor);
|
||||
};
|
||||
|
||||
const handleOpacityChange = (e) => {
|
||||
const newOpacity = parseFloat(e.target.value);
|
||||
setOpacity(newOpacity);
|
||||
if (value) {
|
||||
const baseColor = value.length === 9 ? value.slice(0, 7) : value.slice(0, 7);
|
||||
const alphaHex = Math.round(newOpacity * 255).toString(16).padStart(2, '0');
|
||||
onChange(jsonKey, baseColor + alphaHex);
|
||||
}
|
||||
};
|
||||
|
||||
const handleHexChange = (e) => {
|
||||
let rawValue = e.target.value;
|
||||
|
||||
// Ensure the value starts with # if empty
|
||||
if (rawValue === '') {
|
||||
rawValue = '#';
|
||||
}
|
||||
|
||||
// If the first character is not #, add it
|
||||
if (rawValue[0] !== '#') {
|
||||
rawValue = '#' + rawValue;
|
||||
}
|
||||
|
||||
// Allow 8-digit hex (with alpha) or 6-digit hex
|
||||
const maxLength = rawValue.startsWith('#') ? 9 : 7;
|
||||
if (rawValue.length > maxLength) {
|
||||
rawValue = rawValue.slice(0, maxLength);
|
||||
}
|
||||
|
||||
// Only allow valid hex characters after the #
|
||||
const hexPart = rawValue.slice(1);
|
||||
const validHexPart = hexPart.replace(/[^0-9a-fA-F]/g, '');
|
||||
const newValue = '#' + validHexPart;
|
||||
|
||||
console.log(`Hex input typing ${jsonKey}:`, newValue);
|
||||
onChange(jsonKey, newValue);
|
||||
};
|
||||
|
||||
const handleHexBlur = (e) => {
|
||||
let v = e.target.value.trim();
|
||||
|
||||
// If empty or just '#', revert to last valid value
|
||||
if (!v || v === '#') {
|
||||
onChange(jsonKey, value);
|
||||
return;
|
||||
}
|
||||
|
||||
// Ensure starts with #
|
||||
if (v[0] !== '#') {
|
||||
v = '#' + v;
|
||||
}
|
||||
|
||||
// Convert 3-digit to 6-digit
|
||||
if (/^#[0-9a-fA-F]{3}$/i.test(v)) {
|
||||
const hex = '#' + v[1] + v[1] + v[2] + v[2] + v[3] + v[3];
|
||||
onChange(jsonKey, hex);
|
||||
}
|
||||
// Check for 8-digit hex (with alpha)
|
||||
else if (/^#[0-9a-fA-F]{8}$/i.test(v)) {
|
||||
onChange(jsonKey, v);
|
||||
}
|
||||
// Check for 6-digit hex
|
||||
else if (/^#[0-9a-fA-F]{6}$/i.test(v)) {
|
||||
onChange(jsonKey, v);
|
||||
}
|
||||
// If not valid, revert to last valid
|
||||
else {
|
||||
onChange(jsonKey, value);
|
||||
}
|
||||
};
|
||||
|
||||
// Display value - if 8-digit, show as 6-digit with note
|
||||
const displayValue = value && value.length === 9 ? `${value.slice(0, 7)} (with alpha)` : value;
|
||||
|
||||
return (
|
||||
<div className="mb-4">
|
||||
<label className="block text-[11px] font-medium text-gray-600 uppercase tracking-wide mb-2">{label}</label>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="relative w-10 h-10 rounded-lg border-2 border-gray-200 overflow-hidden shrink-0 cursor-pointer shadow-sm hover:shadow-md transition-shadow">
|
||||
<div className="absolute inset-0 rounded-lg pointer-events-none" style={{ background: value }} />
|
||||
<input
|
||||
type="color"
|
||||
value={value && value.length === 9 ? value.slice(0, 7) : value}
|
||||
onChange={handleColorChange}
|
||||
className="absolute inset-[-6px] w-[calc(100%+12px)] h-[calc(100%+12px)] opacity-0 cursor-pointer"
|
||||
/>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={value || ''}
|
||||
onChange={handleHexChange}
|
||||
onBlur={handleHexBlur}
|
||||
maxLength={9}
|
||||
className="flex-1 text-sm font-mono border border-gray-200 rounded-lg px-3 py-2 bg-gray-50 text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all"
|
||||
/>
|
||||
</div>
|
||||
{value && value.length === 9 && (
|
||||
<div className="mt-2">
|
||||
<label className="block text-[10px] font-medium text-gray-500 mb-1">Opacity: {Math.round(opacity * 100)}%</label>
|
||||
<input
|
||||
type="range"
|
||||
min="0"
|
||||
max="1"
|
||||
step="0.01"
|
||||
value={opacity}
|
||||
onChange={handleOpacityChange}
|
||||
className="w-full"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const AlignField = ({ label, jsonKey, value, onChange }) => (
|
||||
<div className="mb-4">
|
||||
<label className="block text-[11px] font-medium text-gray-600 uppercase tracking-wide mb-2">{label}</label>
|
||||
<div className="flex gap-1 bg-gray-100 p-1 rounded-lg">
|
||||
{[
|
||||
{ value: 'left', icon: IconAlignLeft, label: 'Left' },
|
||||
{ value: 'center', icon: IconAlignCenter, label: 'Center' },
|
||||
{ value: 'right', icon: IconAlignRight, label: 'Right' }
|
||||
].map((opt) => (
|
||||
<button key={opt.value} onClick={() => onChange(jsonKey, opt.value)} className={`flex-1 py-2 px-3 rounded-md text-xs font-medium transition-all flex items-center justify-center gap-1.5 ${value === opt.value ? 'bg-white text-blue-600 shadow-sm ring-1 ring-blue-200' : 'text-gray-500 hover:text-gray-700 hover:bg-white/50'}`}>
|
||||
<opt.icon size={14} /><span className="hidden sm:inline">{opt.label}</span>
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
export const NumberField = ({ label, jsonKey, value, onChange, min, max, unit }) => (
|
||||
<div className="mb-4">
|
||||
<label className="block text-[11px] font-medium text-gray-600 uppercase tracking-wide mb-2">{label}</label>
|
||||
<div className="flex items-center gap-2">
|
||||
<input type="number" value={value} onChange={(e) => onChange(jsonKey, parseInt(e.target.value) || 0)} min={min} max={max} className="flex-1 text-sm border border-gray-200 rounded-lg px-3 py-2 bg-gray-50 text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all" />
|
||||
{unit && <span className="text-xs text-gray-500">{unit}</span>}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
export const TextField = ({ label, jsonKey, value, onChange, rows = 1 }) => {
|
||||
const handleChange = (e) => {
|
||||
const newValue = e.target.value;
|
||||
console.log(`TextField changing ${jsonKey}:`, newValue); // Debug log
|
||||
onChange(jsonKey, newValue);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="mb-4">
|
||||
<label className="block text-[11px] font-medium text-gray-600 uppercase tracking-wide mb-2">{label}</label>
|
||||
{rows === 1 ? (
|
||||
<input
|
||||
type="text"
|
||||
value={value || ''}
|
||||
onChange={handleChange}
|
||||
className="w-full text-sm border border-gray-200 rounded-lg px-3 py-2 bg-gray-50 text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all"
|
||||
/>
|
||||
) : (
|
||||
<textarea
|
||||
value={value || ''}
|
||||
onChange={handleChange}
|
||||
rows={rows}
|
||||
className="w-full text-sm border border-gray-200 rounded-lg px-3 py-2 bg-gray-50 text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all"
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const ToggleSwitch = ({ label, jsonKey, checked, onChange }) => (
|
||||
<div className="mb-4">
|
||||
<label className="block text-[11px] font-medium text-gray-600 uppercase tracking-wide mb-2">{label}</label>
|
||||
<div className="flex items-center gap-3">
|
||||
<button onClick={() => onChange(jsonKey, !checked)} className={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 ${checked ? 'bg-blue-600' : 'bg-gray-300'}`}>
|
||||
<span className={`inline-block h-4 w-4 transform rounded-full bg-white transition-transform ${checked ? 'translate-x-6' : 'translate-x-1'}`} />
|
||||
</button>
|
||||
<span className="text-sm text-gray-700 flex items-center gap-1">
|
||||
{checked ? <IconEye size={14} className="text-green-600" /> : <IconEyeOff size={14} className="text-red-600" />}
|
||||
{checked ? 'Visible' : 'Hidden'}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
export const Section = ({ title, icon, children, defaultExpanded = true }) => {
|
||||
const [expanded, setExpanded] = useState(defaultExpanded);
|
||||
|
||||
return (
|
||||
<div className="mb-3 mx-3 rounded-lg border border-gray-200 overflow-hidden bg-white shadow-sm hover:shadow-md transition-shadow">
|
||||
<button
|
||||
onClick={() => setExpanded(!expanded)}
|
||||
className="w-full flex items-center justify-between px-4 py-4 bg-gradient-to-r from-gray-50 to-white hover:from-gray-100 hover:to-gray-50 transition-all group"
|
||||
>
|
||||
<div className="flex items-center gap-2.5">
|
||||
<span className="text-gray-500 group-hover:text-blue-500 transition-colors">
|
||||
{icon}
|
||||
</span>
|
||||
<h3 className="text-xs font-semibold text-gray-700 uppercase tracking-wide">
|
||||
{title}
|
||||
</h3>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
{/* <span className="text-[10px] text-gray-400">
|
||||
{expanded ? 'Click to collapse' : 'Click to expand'}
|
||||
</span> */}
|
||||
{expanded ? (
|
||||
<IconChevronDown size={14} className="text-gray-400" />
|
||||
) : (
|
||||
<IconChevronRight size={14} className="text-gray-400" />
|
||||
)}
|
||||
</div>
|
||||
</button>
|
||||
{expanded && (
|
||||
<div className="px-4 pb-4 pt-2 border-t border-gray-100 bg-white">
|
||||
{children}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
// ─── Apply Config to HTML ──────────────────────────────────────────────────────
|
||||
export const applyConfigToHTML = (originalHTML, cfg) => {
|
||||
const parser = new DOMParser();
|
||||
const doc = parser.parseFromString(originalHTML, 'text/html');
|
||||
|
||||
const setStyle = (id, prop, value) => {
|
||||
const el = doc.getElementById(id);
|
||||
if (!el) return;
|
||||
let s = el.getAttribute('style') || '';
|
||||
const re = new RegExp(`(${prop}\\s*:\\s*)[^;]+(;?)`, 'i');
|
||||
if (re.test(s)) {
|
||||
s = s.replace(re, `$1${value}$2`);
|
||||
} else {
|
||||
s = s.trimEnd();
|
||||
if (s && !s.endsWith(';')) s += ';';
|
||||
s += ` ${prop}: ${value};`;
|
||||
}
|
||||
el.setAttribute('style', s);
|
||||
};
|
||||
|
||||
// Top Bar
|
||||
const topBar = doc.getElementById('top-bar');
|
||||
if (topBar) {
|
||||
let s = topBar.getAttribute('style') || '';
|
||||
s = s.replace(
|
||||
/linear-gradient\(45deg,\s*#[0-9a-fA-F]{6},\s*#[0-9a-fA-F]{6}\)/i,
|
||||
`linear-gradient(45deg, ${cfg.top_bar_bg_color}, ${cfg.top_bar_gradient_end})`
|
||||
);
|
||||
topBar.setAttribute('style', s);
|
||||
setStyle('top-bar', 'text-align', cfg.top_bar_align);
|
||||
}
|
||||
|
||||
// Logo Section
|
||||
setStyle('logo-container', 'background', cfg.logo_bg_color);
|
||||
setStyle('logo-container', 'text-align', cfg.logo_align);
|
||||
setStyle('logo-container', 'padding', `${cfg.logo_padding_top}px ${cfg.logo_padding_right}px ${cfg.logo_padding_bottom}px ${cfg.logo_padding_left}px`);
|
||||
|
||||
const logo = doc.getElementById('company-logo');
|
||||
if (logo) {
|
||||
logo.style.maxWidth = cfg.logo_max_width + 'px';
|
||||
logo.style.objectFit = cfg.logo_object_fit;
|
||||
}
|
||||
|
||||
// Title
|
||||
setStyle('title-text', 'color', cfg.title_text_color);
|
||||
setStyle('title-text', 'font-size', cfg.title_font_size + 'px');
|
||||
setStyle('title-text', 'font-family', cfg.title_font_family);
|
||||
setStyle('title-text', 'margin-top', cfg.title_margin_top + 'px');
|
||||
setStyle('title-text', 'margin-bottom', cfg.title_margin_bottom + 'px');
|
||||
|
||||
// const titleText = doc.getElementById('title-text');
|
||||
// if (titleText) titleText.textContent = cfg.title_text;
|
||||
|
||||
const titleWrapper = doc.getElementById('title-wrapper');
|
||||
if (titleWrapper) {
|
||||
setStyle('title-wrapper', 'background', cfg.title_bg_color);
|
||||
const centerTag = titleWrapper.querySelector('center');
|
||||
if (centerTag) {
|
||||
if (cfg.title_align === 'left') {
|
||||
centerTag.setAttribute('style', 'text-align: left; display: block;');
|
||||
} else if (cfg.title_align === 'right') {
|
||||
centerTag.setAttribute('style', 'text-align: right; display: block;');
|
||||
} else {
|
||||
centerTag.removeAttribute('style');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// BODY CONTENT - Apply to ALL elements including reassign, audit, transaction, regards
|
||||
const bodyContent = doc.getElementById('body-content');
|
||||
if (bodyContent) {
|
||||
setStyle('body-content', 'background', cfg.body_bg_color);
|
||||
setStyle('body-content', 'text-align', cfg.body_align);
|
||||
setStyle('body-content', 'color', cfg.body_text_color);
|
||||
setStyle('body-content', 'padding', `${cfg.body_padding_top}px ${cfg.body_padding_right}px ${cfg.body_padding_bottom}px ${cfg.body_padding_left}px`);
|
||||
|
||||
// Apply body alignment to ALL child elements
|
||||
const allElements = bodyContent.querySelectorAll('#custom-message, #instruction-text, #reassign-text, #audit-trail-text, #transaction-id, #regards-text, p, div, h3');
|
||||
allElements.forEach(el => {
|
||||
// Apply alignment
|
||||
if (cfg.body_align) {
|
||||
el.style.textAlign = cfg.body_align;
|
||||
}
|
||||
// Apply text color but preserve link colors
|
||||
if (cfg.body_text_color && el.tagName !== 'A') {
|
||||
// Don't override if it's a link or has specific color set
|
||||
const hasSpecificColor = el.id === 'reassign-text' || el.id === 'audit-trail-text' || el.id === 'transaction-id' || el.id === 'regards-text';
|
||||
if (hasSpecificColor || !el.querySelector('a')) {
|
||||
el.style.color = cfg.body_text_color;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sender Heading
|
||||
const senderHeading = doc.getElementById('sender-heading');
|
||||
if (senderHeading) {
|
||||
// senderHeading.textContent = cfg.sender_text;
|
||||
setStyle('sender-heading', 'color', cfg.sender_text_color);
|
||||
setStyle('sender-heading', 'font-size', cfg.sender_font_size + 'px');
|
||||
setStyle('sender-heading', 'font-family', cfg.sender_font_family);
|
||||
setStyle('sender-heading', 'margin-top', cfg.sender_margin_top + 'px');
|
||||
setStyle('sender-heading', 'margin-bottom', cfg.sender_margin_bottom + 'px');
|
||||
}
|
||||
|
||||
// CUSTOM MESSAGE - FIXED: Alignment and text color
|
||||
const customMessage = doc.getElementById('custom-message');
|
||||
if (customMessage) {
|
||||
customMessage.style.display = cfg.show_custom_message ? 'block' : 'none';
|
||||
|
||||
// Update text content
|
||||
// if (cfg.custom_message_text && cfg.custom_message_text !== customMessage.textContent) {
|
||||
// customMessage.textContent = cfg.custom_message_text;
|
||||
// }
|
||||
|
||||
// Apply text color
|
||||
const textColor = cfg.custom_message_text_color || cfg.body_text_color || '#000000';
|
||||
customMessage.style.color = textColor;
|
||||
|
||||
// Apply background color
|
||||
const bgColor = cfg.custom_message_bg_color || '#ffffff';
|
||||
customMessage.style.backgroundColor = bgColor;
|
||||
|
||||
// Apply other styles
|
||||
customMessage.style.fontSize = (cfg.custom_message_font_size || 14) + 'px';
|
||||
customMessage.style.fontFamily = cfg.custom_message_font_family || "Montserrat, sans-serif";
|
||||
customMessage.style.marginTop = (cfg.custom_message_margin_top || 20) + 'px';
|
||||
customMessage.style.lineHeight = cfg.custom_message_line_height || 1.6;
|
||||
customMessage.style.textAlign = cfg.body_align || 'justify';
|
||||
customMessage.style.fontStyle = 'italic';
|
||||
customMessage.style.padding = '5px 8px';
|
||||
customMessage.style.borderRadius = '5px';
|
||||
}
|
||||
|
||||
|
||||
// INSTRUCTION TEXT - FIXED: Alignment and text color
|
||||
const instructionText = doc.getElementById('instruction-text');
|
||||
if (instructionText) {
|
||||
instructionText.style.display = cfg.show_instruction ? 'block' : 'none';
|
||||
// instructionText.textContent = cfg.instruction_text;
|
||||
setStyle('instruction-text', 'color', cfg.body_text_color);
|
||||
setStyle('instruction-text', 'font-size', cfg.instruction_font_size + 'px');
|
||||
setStyle('instruction-text', 'font-family', cfg.instruction_font_family);
|
||||
setStyle('instruction-text', 'margin-top', cfg.instruction_margin_top + 'px');
|
||||
// Apply body alignment
|
||||
setStyle('instruction-text', 'text-align', cfg.body_align);
|
||||
}
|
||||
|
||||
// BUTTON - FIXED: Alignment
|
||||
const buttonBg = doc.getElementById('button-bg');
|
||||
if (buttonBg) {
|
||||
buttonBg.style.display = cfg.show_button ? 'block' : 'none';
|
||||
setStyle('button-bg', 'background-color', cfg.button_bg_color);
|
||||
setStyle('button-bg', 'padding', `${cfg.button_padding_top}px ${cfg.button_padding_right}px ${cfg.button_padding_bottom}px ${cfg.button_padding_left}px`);
|
||||
setStyle('button-bg', 'border-radius', cfg.button_radius + 'px');
|
||||
}
|
||||
|
||||
const buttonLink = doc.getElementById('button-link');
|
||||
if (buttonLink) {
|
||||
// buttonLink.textContent = cfg.button_text;
|
||||
setStyle('button-link', 'color', cfg.button_text_color);
|
||||
setStyle('button-link', 'font-size', cfg.button_font_size + 'px');
|
||||
setStyle('button-link', 'font-weight', cfg.button_font_weight);
|
||||
setStyle('button-link', 'font-family', cfg.button_font_family);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// BUTTON ALIGNMENT - COMPLETE FIX
|
||||
const buttonWrapper = doc.getElementById('button-wrapper');
|
||||
if (buttonWrapper) {
|
||||
const centerTag = buttonWrapper.querySelector('center');
|
||||
const buttonTable = buttonWrapper.querySelector('table');
|
||||
|
||||
// Reset all styles first
|
||||
if (centerTag) {
|
||||
centerTag.removeAttribute('style');
|
||||
centerTag.removeAttribute('align');
|
||||
}
|
||||
if (buttonTable) {
|
||||
buttonTable.removeAttribute('style');
|
||||
}
|
||||
buttonWrapper.removeAttribute('style');
|
||||
|
||||
// Apply new alignment
|
||||
if (cfg.button_align === 'left') {
|
||||
if (centerTag) {
|
||||
centerTag.setAttribute('align', 'left');
|
||||
centerTag.style.textAlign = 'left';
|
||||
}
|
||||
if (buttonTable) {
|
||||
buttonTable.style.margin = '0';
|
||||
buttonTable.style.marginRight = 'auto';
|
||||
}
|
||||
buttonWrapper.style.textAlign = 'left';
|
||||
}
|
||||
else if (cfg.button_align === 'right') {
|
||||
if (centerTag) {
|
||||
centerTag.setAttribute('align', 'right');
|
||||
centerTag.style.textAlign = 'right';
|
||||
}
|
||||
if (buttonTable) {
|
||||
buttonTable.style.margin = '0';
|
||||
buttonTable.style.marginLeft = 'auto';
|
||||
}
|
||||
buttonWrapper.style.textAlign = 'right';
|
||||
}
|
||||
else {
|
||||
// center
|
||||
if (buttonTable) {
|
||||
buttonTable.style.margin = '0 auto';
|
||||
}
|
||||
buttonWrapper.style.textAlign = 'center';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Reassign Section
|
||||
const reassignText = doc.getElementById('reassign-text');
|
||||
if (reassignText) {
|
||||
reassignText.style.display = cfg.show_reassign_section ? 'block' : 'none';
|
||||
|
||||
// Clear existing content while preserving the structure
|
||||
// Instead of manipulating text nodes, rebuild the content properly
|
||||
const reassignSpan = reassignText.querySelector('span');
|
||||
const reassignLink_ = reassignText.querySelector('#reassign-link');
|
||||
|
||||
if (reassignSpan) {
|
||||
// reassignSpan.textContent = cfg.reassign_text || "To reassign the signer,";
|
||||
}
|
||||
|
||||
if (reassignLink_) {
|
||||
const linkSpan = reassignLink_.querySelector('span');
|
||||
if (linkSpan) {
|
||||
linkSpan.textContent = cfg.reassign_link_text || "Click here";
|
||||
} else {
|
||||
reassignLink_.textContent = cfg.reassign_link_text || "Click here";
|
||||
}
|
||||
setStyle('reassign-link', 'color', cfg.reassign_link_color);
|
||||
}
|
||||
|
||||
setStyle('reassign-text', 'font-size', (cfg.reassign_font_size || 14) + 'px');
|
||||
setStyle('reassign-text', 'font-family', cfg.reassign_font_family || "Montserrat, sans-serif");
|
||||
setStyle('reassign-text', 'margin-top', (cfg.reassign_margin_top || 0) + 'px');
|
||||
setStyle('reassign-text', 'margin-bottom', (cfg.reassign_margin_bottom || 0) + 'px');
|
||||
setStyle('reassign-text', 'text-align', cfg.body_align || 'left');
|
||||
setStyle('reassign-text', 'color', cfg.body_text_color || '#000000');
|
||||
}
|
||||
|
||||
|
||||
// Audit Trail Section - FIXED
|
||||
const auditTrailText = doc.getElementById('audit-trail-text');
|
||||
if (auditTrailText) {
|
||||
auditTrailText.style.display = cfg.show_audit_trail_section ? 'block' : 'none';
|
||||
|
||||
const auditSpan = auditTrailText.querySelector('span:first-child');
|
||||
const auditLink = auditTrailText.querySelector('#audit-trail-link');
|
||||
|
||||
if (auditSpan) {
|
||||
// auditSpan.textContent = cfg.audit_trail_text || "To view the audit trail,";
|
||||
}
|
||||
|
||||
if (auditLink) {
|
||||
const linkSpan = auditLink.querySelector('span');
|
||||
if (linkSpan) {
|
||||
linkSpan.textContent = cfg.audit_trail_link_text || "Click here";
|
||||
} else {
|
||||
auditLink.textContent = cfg.audit_trail_link_text || "Click here";
|
||||
}
|
||||
setStyle('audit-trail-link', 'color', cfg.audit_trail_link_color);
|
||||
}
|
||||
|
||||
setStyle('audit-trail-text', 'font-size', (cfg.audit_trail_font_size || 14) + 'px');
|
||||
setStyle('audit-trail-text', 'font-family', cfg.audit_trail_font_family || "Montserrat, sans-serif");
|
||||
setStyle('audit-trail-text', 'line-height', cfg.audit_trail_line_height || 3);
|
||||
setStyle('audit-trail-text', 'text-align', cfg.body_align || 'left');
|
||||
setStyle('audit-trail-text', 'color', cfg.body_text_color || '#000000');
|
||||
}
|
||||
|
||||
// Transaction ID
|
||||
const transactionId = doc.getElementById('transaction-id');
|
||||
if (transactionId) {
|
||||
transactionId.style.display = cfg.show_transaction_id ? 'block' : 'none';
|
||||
setStyle('transaction-id', 'font-size', cfg.transaction_font_size + 'px');
|
||||
setStyle('transaction-id', 'font-family', cfg.transaction_font_family);
|
||||
setStyle('transaction-id', 'margin-top', cfg.transaction_margin_top + 'px');
|
||||
setStyle('transaction-id', 'margin-bottom', cfg.transaction_margin_bottom + 'px');
|
||||
setStyle('transaction-id', 'padding-top', cfg.transaction_padding_top + 'px');
|
||||
// Apply body text color and alignment
|
||||
setStyle('transaction-id', 'color', cfg.body_text_color);
|
||||
setStyle('transaction-id', 'text-align', cfg.body_align);
|
||||
}
|
||||
|
||||
|
||||
// Regards
|
||||
const regardsText = doc.getElementById('regards-text');
|
||||
if (regardsText) {
|
||||
regardsText.style.display = cfg.show_regards ? 'block' : 'none';
|
||||
// regardsText.textContent = cfg.regards_text;
|
||||
setStyle('regards-text', 'font-size', cfg.regards_font_size + 'px');
|
||||
setStyle('regards-text', 'font-family', cfg.regards_font_family);
|
||||
setStyle('regards-text', 'padding-top', cfg.regards_padding_top + 'px');
|
||||
// Apply body text color and alignment
|
||||
setStyle('regards-text', 'color', cfg.body_text_color);
|
||||
setStyle('regards-text', 'text-align', cfg.body_align);
|
||||
}
|
||||
|
||||
// Company Address Section - FIXED (update individual elements)
|
||||
const companyAddress = doc.getElementById('company-address');
|
||||
const companyInfoRow = doc.getElementById('company-info-row');
|
||||
|
||||
console.log(companyAddress, "companyAddress");
|
||||
|
||||
if (companyInfoRow) {
|
||||
companyInfoRow.style.display = cfg.show_company_address ? '' : 'none';
|
||||
}
|
||||
|
||||
if (companyAddress) {
|
||||
companyAddress.style.display = cfg.show_company_address ? 'block' : 'none';
|
||||
|
||||
// Update individual span elements instead of replacing entire HTML
|
||||
const companyNameSpan = doc.getElementById('company-name');
|
||||
console.log("companyNameSpan", companyNameSpan)
|
||||
const addressLine1Span = doc.getElementById('company-address-line1');
|
||||
const addressLine2Span = doc.getElementById('company-address-line2');
|
||||
const cityStateZipSpan = doc.getElementById('company-city-state-zip');
|
||||
const phoneSpan = doc.getElementById('company-phone');
|
||||
const phone2Span = doc.getElementById('company-phone2');
|
||||
const websiteLink = doc.getElementById('company-website');
|
||||
|
||||
if (companyNameSpan) {
|
||||
// companyNameSpan.textContent = cfg.company_name || "HIC Global Solutions";
|
||||
}
|
||||
|
||||
if (addressLine1Span) {
|
||||
// addressLine1Span.textContent = cfg.company_address_line1 || "Noida Sector 68";
|
||||
}
|
||||
|
||||
if (addressLine2Span) {
|
||||
// addressLine2Span.textContent = cfg.company_address_line2 || "";
|
||||
}
|
||||
|
||||
if (cityStateZipSpan) {
|
||||
// cityStateZipSpan.textContent = cfg.company_city_state_zip || "Noida, UP, 201301, India";
|
||||
}
|
||||
|
||||
if (phoneSpan) {
|
||||
// phoneSpan.textContent = cfg.company_phone || "+91 98765 43210";
|
||||
}
|
||||
|
||||
if (phone2Span) {
|
||||
// phone2Span.textContent = cfg.company_phone2 ? `, ${cfg.company_phone2}` : "";
|
||||
}
|
||||
|
||||
if (websiteLink) {
|
||||
const websiteSpan = websiteLink.querySelector('span');
|
||||
if (websiteSpan) {
|
||||
// websiteSpan.textContent = cfg.company_website_text || cfg.company_website || "https://www.google.com/";
|
||||
}
|
||||
// websiteLink.href = cfg.company_website || "https://www.google.com/";
|
||||
websiteLink.style.color = cfg.company_link_color || "#0000EE";
|
||||
}
|
||||
|
||||
// Apply styles to the container
|
||||
if (cfg.company_address_bg_gradient) {
|
||||
companyAddress.style.background = cfg.company_address_bg_gradient;
|
||||
}
|
||||
companyAddress.style.color = cfg.company_address_text_color || '#000000';
|
||||
companyAddress.style.fontSize = (cfg.company_address_font_size || 14) + 'px';
|
||||
companyAddress.style.fontFamily = cfg.company_address_font_family || "Montserrat, sans-serif";
|
||||
companyAddress.style.lineHeight = cfg.company_address_line_height || 1.6;
|
||||
companyAddress.style.padding = (cfg.company_address_padding || 18) + 'px';
|
||||
}
|
||||
|
||||
// Footer - Use visibility: hidden instead of display: none
|
||||
const footerCell = doc.getElementById('footer-text');
|
||||
|
||||
if (footerCell) {
|
||||
// footerCell.textContent = cfg.footer_text;
|
||||
setStyle('footer-text', 'color', cfg.footer_text_color);
|
||||
setStyle('footer-text', 'background', cfg.footer_bg_color);
|
||||
setStyle('footer-text', 'text-align', cfg.footer_align);
|
||||
setStyle('footer-text', 'font-size', cfg.footer_font_size + 'px');
|
||||
setStyle('footer-text', 'font-family', cfg.footer_font_family);
|
||||
setStyle('footer-text', 'padding', cfg.footer_padding + 'px');
|
||||
setStyle('footer-text', 'border-top', cfg.footer_border_top);
|
||||
footerCell.setAttribute('align', cfg.footer_align);
|
||||
|
||||
// Use visibility to hide content but keep the space and border
|
||||
if (!cfg.show_footer) {
|
||||
footerCell.style.visibility = 'hidden';
|
||||
} else {
|
||||
footerCell.style.visibility = 'visible';
|
||||
}
|
||||
}
|
||||
|
||||
// Email Container
|
||||
const emailContainer = doc.querySelector('.email-container');
|
||||
if (emailContainer) {
|
||||
emailContainer.style.maxWidth = cfg.email_container_max_width + 'px';
|
||||
emailContainer.style.background = cfg.email_container_bg_color;
|
||||
}
|
||||
|
||||
const bodyEl = doc.querySelector('body');
|
||||
if (bodyEl) {
|
||||
bodyEl.style.background = cfg.body_bg_color_outer;
|
||||
}
|
||||
|
||||
let htmlString = '<!DOCTYPE html>\n' + doc.documentElement.outerHTML;
|
||||
return htmlString;
|
||||
}
|
||||
|
|
@ -0,0 +1,150 @@
|
|||
// ─── Default JSON Configuration ────────────────────────────────────────────────
|
||||
export const DEFAULT_CONFIG_JSON = {
|
||||
// Top Bar
|
||||
top_bar_bg_color: "#006CF0",
|
||||
top_bar_align: "center",
|
||||
top_bar_height: 5,
|
||||
top_bar_gradient_end: "#34beff",
|
||||
|
||||
// Logo
|
||||
logo_align: "left",
|
||||
logo_bg_color: "#ffffff",
|
||||
logo_padding_top: 15,
|
||||
logo_padding_bottom: 15,
|
||||
logo_padding_left: 15,
|
||||
logo_padding_right: 15,
|
||||
logo_max_width: 203,
|
||||
logo_object_fit: "contain",
|
||||
|
||||
// Title
|
||||
title_text: "Please Sign Documents",
|
||||
title_text_color: "#000000",
|
||||
title_bg_color: "#ffffff",
|
||||
title_align: "center",
|
||||
title_font_size: 32,
|
||||
title_font_family: "Roboto, sans-serif",
|
||||
title_margin_top: 20,
|
||||
title_margin_bottom: 20,
|
||||
|
||||
// Body
|
||||
body_bg_color: "#1891f70d",
|
||||
body_padding_top: 18,
|
||||
body_padding_bottom: 10,
|
||||
body_padding_left: 20,
|
||||
body_padding_right: 20,
|
||||
|
||||
// Sender Heading
|
||||
sender_text: "Jai Pandey has sent Sign Made Easy Proposal for your signature",
|
||||
sender_text_color: "#0d80f4",
|
||||
sender_bg_color: "#1891f70d",
|
||||
sender_font_size: 18,
|
||||
sender_font_family: "Montserrat, sans-serif",
|
||||
sender_margin_top: 0,
|
||||
sender_margin_bottom: 0,
|
||||
|
||||
// Custom Message
|
||||
show_custom_message: true,
|
||||
custom_message_text: "HIC Global Solutions isn't just any Salesforce consulting company — we're a team of Salesforce and business experts passionate about delivering agile, creative solutions to meet your unique CRM needs.\n\nCustom message SR-08107",
|
||||
custom_message_text_color: "#000000",
|
||||
custom_message_font_size: 14,
|
||||
custom_message_font_family: "Montserrat, sans-serif",
|
||||
custom_message_margin_top: 20,
|
||||
custom_message_text_align: "justify",
|
||||
custom_message_line_height: 1.6,
|
||||
|
||||
// Instruction
|
||||
show_instruction: true,
|
||||
instruction_text: "Please click on the button below to start the signing process.",
|
||||
instruction_text_color: "#000000",
|
||||
instruction_font_size: 14,
|
||||
instruction_font_family: "Montserrat, sans-serif",
|
||||
instruction_margin_top: 20,
|
||||
instruction_text_align: "justify",
|
||||
|
||||
// Button
|
||||
show_button: true,
|
||||
button_text: "View Document",
|
||||
button_bg_color: "#0270f0",
|
||||
button_text_color: "#ffffff",
|
||||
button_align: "center",
|
||||
button_padding_top: 11,
|
||||
button_padding_bottom: 11,
|
||||
button_padding_left: 20,
|
||||
button_padding_right: 20,
|
||||
button_radius: 10,
|
||||
button_font_size: 16,
|
||||
button_font_weight: "500",
|
||||
button_font_family: "Montserrat, sans-serif",
|
||||
|
||||
// Reassign Section
|
||||
show_reassign_section: true,
|
||||
reassign_text: "To reassign the signer,",
|
||||
reassign_link_text: "Click here",
|
||||
reassign_link_color: "#0270f0",
|
||||
reassign_text_color: "#000000",
|
||||
reassign_font_size: 14,
|
||||
reassign_font_family: "Montserrat, sans-serif",
|
||||
reassign_margin_top: 0,
|
||||
reassign_margin_bottom: 0,
|
||||
|
||||
// Audit Trail Section
|
||||
show_audit_trail_section: true,
|
||||
audit_trail_text: "To view the audit trail,",
|
||||
audit_trail_link_text: "Click here",
|
||||
audit_trail_link_color: "#0270f0",
|
||||
audit_trail_text_color: "#000000",
|
||||
audit_trail_font_size: 14,
|
||||
audit_trail_font_family: "Montserrat, sans-serif",
|
||||
audit_trail_line_height: 3,
|
||||
|
||||
// Transaction ID
|
||||
show_transaction_id: true,
|
||||
transaction_id_prefix: "Sign Made Easy Transaction Id:",
|
||||
transaction_text_color: "#000000",
|
||||
transaction_font_size: 14,
|
||||
transaction_font_family: "Montserrat, sans-serif",
|
||||
transaction_margin_top: 10,
|
||||
transaction_margin_bottom: 10,
|
||||
transaction_padding_top: 10,
|
||||
|
||||
// Regards
|
||||
show_regards: true,
|
||||
regards_text: "Regards,",
|
||||
regards_text_color: "#000000",
|
||||
regards_font_size: 14,
|
||||
regards_font_family: "Montserrat, sans-serif",
|
||||
regards_padding_top: 20,
|
||||
|
||||
// Company Address Section
|
||||
show_company_address: true,
|
||||
company_name: "HIC",
|
||||
company_address_line1: "Noida Sector 68",
|
||||
company_address_line2: "Noida Sector",
|
||||
company_city_state_zip: "UP, Noida, 111002, India",
|
||||
company_phone: "638787836764 7637864863",
|
||||
company_website: "https://www.google.com/",
|
||||
company_website_text: "https://www.google.com/",
|
||||
company_address_bg_gradient: "linear-gradient(45deg, #006cf070, #34beff75)",
|
||||
company_address_text_color: "#000000",
|
||||
company_address_font_size: 14,
|
||||
company_address_font_family: "Montserrat, sans-serif",
|
||||
company_address_line_height: 1.6,
|
||||
company_address_padding: 18,
|
||||
company_link_color: "#0000EE",
|
||||
|
||||
// Footer
|
||||
show_footer: true,
|
||||
footer_text: "© 2026 Sign Made Easy. All Rights Reserved",
|
||||
footer_text_color: "#000000",
|
||||
footer_bg_color: "#ffffff",
|
||||
footer_align: "right",
|
||||
footer_font_size: 14,
|
||||
footer_font_family: "Montserrat, sans-serif",
|
||||
footer_padding: 10,
|
||||
footer_border_top: "1px solid #57a8f2",
|
||||
|
||||
// Container
|
||||
email_container_max_width: 700,
|
||||
email_container_bg_color: "#ffffff",
|
||||
body_bg_color_outer: "#f5f7fa",
|
||||
};
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
import React from 'react'
|
||||
|
||||
export const HeaderEmailIcon = () => {
|
||||
return (
|
||||
<>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="100" width="100" viewBox="0 0 1000 1000" fill="#fff"><path d="m723 334 2 1a3 3 0 0 0 2-1l9-9 3-4 1-5a11 11 0 0 0-4-8l-12-12a12 12 0 0 0-8-4l-4 1a9 9 0 0 0-4 3l-10 9-1 2 1 2zM579 447v2l1 2 2 2h3l32-9 98-98 1-2-1-2-24-25-2-1a3 3 0 0 0-2 1l-98 98zm156 38V359l-4 4-43 44v79a135 135 0 0 1 47-1m-220-23a31 31 0 0 0-21-14h-13c-18 4-35 10-52 16-18 6-36 10-54 14a15 15 0 0 0-9 7 15 15 0 0 0-2 11 15 15 0 0 0 18 10c19-3 37-8 55-13l26-9 16-5 9-3 2 3 4 11a25 25 0 0 0 22 15c17 1 32-12 47-20 16-9 1-35-15-25l-22 13a33 33 0 0 1-7 2v-1a32 32 0 0 0-5-12zm51 186H263a16 16 0 0 1-16-16V390a47 47 0 0 0-47 47v211a47 47 0 0 0 47 47h355c-9-14-16-30-20-47h-17zM327 389.5v-13a15.7 15.7 0 0 1 15.7-15.7h266.4l47-47H327a47 47 0 0 0-47 47v211.6a47 47 0 0 0 47 47h252a133.3 133.3 0 0 1 8.5-47H343a15.7 15.7 0 0 1-15.7-15.7V389.5zm468 213.3c-4-1-9.3-1-13.6-1.7-1 0-1.7-1-1.7-1.7-1.7-5-4-10-6-14.4v-2.5c2.5-3.4 6-7.6 8.5-11 1.7-2.5 1.7-5-1-7.6l-15.3-15.3c-1-1-2.5-1.7-3.4-1.7s-2.5 1-3.4 1.7c-3.4 2.5-7.6 6-11 8.5-1 0-1 1-1 1h-1c-5-1.7-9.3-4-14.4-6-1 0-1.7-1-1.7-1.7-1-4-1-8.5-1.7-12.7 0-2.5-1-4-3.4-6-1-1-1.7-1-1.7-1h-22c-1.7 0-2.5 0-3.4 1-1.7 1.7-3.4 3.4-3.4 6 0 4-1 8.5-1.7 12.7 0 1-1 1.7-1.7 1.7-5 1.7-9.3 4-14.4 6h-1q-1 0-1.7-1c-3.4-2.5-7-6-11-8.5-1-1-1.7-1.7-3.4-1.7s-2.5 1-4 1.7l-15.3 15.3c-2.5 2.5-2.5 5-1 7.6 2.5 3.4 6 7 8.5 11 1 1 1 1.7 0 2.5-1.7 5-4 9.3-6 14.4 0 1-1 1.7-1.7 1.7-4 1-8.5 1-12.7 1.7a6.4 6.4 0 0 0-6 4v25.4a10 10 0 0 0 6 4c4 0 8.5 1 12.7 1.7 1 0 1.7 1 1.7 1.7 1.7 5 4 9.3 6 14.4 0 1 1 1.7 0 2.5-2.5 3.4-6 7.6-8.5 11-1.7 2.5-1.7 5 1 7.6l15.3 15.3c1.7 1.7 2.5 1.7 4 1.7 1 0 2.5-1 3.4-1.7 3.4-2.5 7-6 11-8.5 1 0 1-1 1.7-1h1c5 1.7 9.3 4 14.4 6 1 0 1.7 1 1.7 1.7 1 4 1 9.3 1.7 13.6 0 3.4 2.5 5 6 5h21c3.4 0 5-1.7 6-5 1-4 1-9.3 1.7-13.6 0-1 1-1.7 1.7-1.7 5-1.7 10-4 14.4-6h1s1 0 1 1c3.4 2.5 7.6 6 11 8.5 1 1 2.5 1.7 3.4 1.7 1.7 0 2.5-1 4-1.7l15.3-15.3c2.5-2.5 2.5-5 1-7.6-2.5-3.4-6-7-8.5-11 1 1 1-1.7 0-2.5 1.7-5 4-9.3 6-14.4 0-1 1-1.7 1.7-1.7 4-1 9.3-1 13.6-1.7 3.4 0 5-2.5 5-6v-21c0-4-1.7-6-5-7zm-83 51s-1 0 0 0c-19.5 0-34-15.3-34-34s15.3-34 34-34a34 34 0 0 1 34 34 35 35 0 0 1-34 34"/></svg>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
import React from 'react'
|
||||
import { Trans } from 'react-i18next'
|
||||
|
||||
const FootertPrivacyPolicy = () => {
|
||||
const handlePolicy = (app) => {
|
||||
if (app === 'PP') {
|
||||
window.location.href = 'https://signmadeasy.com/privacy-policy'
|
||||
} else {
|
||||
window.location.href = 'https://signmadeasy.com/reasonable-use-policy'
|
||||
}
|
||||
}
|
||||
return (
|
||||
<>
|
||||
<footer className="relative bottom-0 text-center text-sm bg-white/80 backdrop-blur-sm py-3 z-50 mt-auto">
|
||||
<p className="px-4 font-semibold text-xs text-gray-600">
|
||||
<Trans
|
||||
i18nKey="completion.footerText"
|
||||
components={[
|
||||
<span className="text-blue-600 hover:text-blue-700 hover:underline transition cursor-pointer" onClick={() => handlePolicy('PP')}></span>,
|
||||
<span className="text-blue-600 hover:text-blue-700 hover:underline transition cursor-pointer" onClick={() => handlePolicy('RUP')}></span>,
|
||||
]}
|
||||
/>
|
||||
</p>
|
||||
</footer>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export default FootertPrivacyPolicy
|
||||
|
|
@ -0,0 +1,178 @@
|
|||
import { ChevronLeft } from "lucide-react";
|
||||
import React from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { isRtlLanguage } from "../i18n";
|
||||
|
||||
// Individual field badge component with click detection and position updates
|
||||
const IndividualFieldBadge = React.memo(
|
||||
({
|
||||
field,
|
||||
isFilled,
|
||||
isSubmitBadge,
|
||||
// isLastField,
|
||||
isRequiredField = false, // Add this prop
|
||||
handleSubmitClick,
|
||||
handleNextClick,
|
||||
handleFieldClick,
|
||||
goToField,
|
||||
fieldState,
|
||||
lastActiveTab,
|
||||
isBadgeClick = false,
|
||||
badgeStyle,
|
||||
setRadioFocusedOptionIndex,
|
||||
totalRadioOptions
|
||||
}) => {
|
||||
console.log("Badge render - field:", field.id, {
|
||||
isFilled,
|
||||
isSubmitBadge,
|
||||
isRequiredField,
|
||||
fieldType: field.type,
|
||||
});
|
||||
|
||||
const { t, i18n } = useTranslation();
|
||||
const isRtl = isRtlLanguage(i18n.language);
|
||||
|
||||
const topValue = parseFloat(field?.top) || 0;
|
||||
const leftValue = parseFloat(field?.left) || 0;
|
||||
|
||||
const getBadgeText = () => {
|
||||
if (isSubmitBadge) return "Submit";
|
||||
if (isFilled) return "Next";
|
||||
|
||||
// ✅ Radio: show "Select" instead of "Radio"
|
||||
if (field.type === "radio") return "Select";
|
||||
|
||||
const fieldTypeName = field.type.charAt(0).toUpperCase() + field.type.slice(1);
|
||||
return fieldTypeName;
|
||||
};
|
||||
|
||||
const handleBadgeClick = (e) => {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
|
||||
goToField?.(field.id);
|
||||
|
||||
if (isSubmitBadge) {
|
||||
handleSubmitClick();
|
||||
return;
|
||||
}
|
||||
|
||||
if (field.type === "radio") {
|
||||
if (isFilled) {
|
||||
handleNextClick?.();
|
||||
return;
|
||||
}
|
||||
|
||||
// ✅ Advance to next option index (cycles back to 0)
|
||||
const currentIndex = field._focusedOptionIndex ?? 0;
|
||||
const nextIndex = (currentIndex + 1) % (totalRadioOptions ?? 1);
|
||||
setRadioFocusedOptionIndex(nextIndex);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isFilled) {
|
||||
// ✅ For signature/initial fields, only navigate — never call handleFieldClick
|
||||
// with an empty value, as it would wipe out any previously set signature value.
|
||||
if (["signature", "initial"].includes(field.type)) {
|
||||
return;
|
||||
}
|
||||
|
||||
handleFieldClick?.(
|
||||
field.id,
|
||||
field.documentId || "",
|
||||
field.pageNumber || 1,
|
||||
field.type,
|
||||
fieldState?.[field.id]?.value || "",
|
||||
fieldState?.[field.id]?.activeTab || lastActiveTab || "",
|
||||
undefined, undefined, undefined,
|
||||
true
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
handleNextClick?.();
|
||||
};
|
||||
|
||||
const badgeText = getBadgeText();
|
||||
if (!badgeText) return null;
|
||||
|
||||
// Determine border color and icon
|
||||
const isCompletedState = isSubmitBadge || isFilled;
|
||||
const showRequiredIndicator = !isFilled && isRequiredField;
|
||||
|
||||
return (
|
||||
<div
|
||||
onClick={handleBadgeClick}
|
||||
className={`absolute bg-regal-blue z-[49] inline-flex items-center rounded-md font-semibold shadow-md border cursor-pointer transition-all duration-300 ease-in-out backdrop-blur-sm
|
||||
${isCompletedState
|
||||
? "border-yellow-400"
|
||||
: isRequiredField
|
||||
? "border-red-400"
|
||||
: "border-white/50"
|
||||
}
|
||||
${isBadgeClick ? "scale-105 ring-2 ring-yellow-400/50" : ""}
|
||||
`}
|
||||
style={{
|
||||
position: "absolute",
|
||||
...badgeStyle,
|
||||
pointerEvents: "auto",
|
||||
transition: "all 0.2s ease",
|
||||
// ✅ RTL-aware clip path
|
||||
clipPath: isRtl
|
||||
? "polygon(0% 0%, calc(100% - 16px) 0%, 100% 50%, calc(100% - 16px) 100%, 0% 100%)"
|
||||
: "polygon(16px 0%, 100% 0%, 100% 100%, 16px 100%, 0% 50%)",
|
||||
// ✅ RTL-aware padding
|
||||
paddingLeft: isRtl ? "8px" : "20px",
|
||||
paddingRight: isRtl ? "20px" : "8px",
|
||||
paddingTop: "9px",
|
||||
paddingBottom: "9px",
|
||||
// ✅ Prevent arrow distortion on short text like "Next"
|
||||
minWidth: isSubmitBadge ? "58px" : isFilled ? "44px" : "60px",
|
||||
// ✅ RTL direction for text
|
||||
direction: isRtl ? 'rtl' : 'ltr',
|
||||
}}
|
||||
data-field-id={field.id}
|
||||
data-is-badge="true"
|
||||
data-is-required={isRequiredField}
|
||||
>
|
||||
<div className={`
|
||||
flex items-center gap-1 w-full
|
||||
${isRtl ? 'flex-row-reverse' : 'flex-row'}
|
||||
`}>
|
||||
<span className="text-white text-[10px] leading-none whitespace-nowrap">
|
||||
{badgeText}
|
||||
</span>
|
||||
|
||||
{/* Chevron for completed / submit states */}
|
||||
{isCompletedState && (
|
||||
<svg
|
||||
className={`
|
||||
w-2.5 h-2.5 text-yellow-400 shrink-0
|
||||
${isRtl ? 'rotate-180' : ''}
|
||||
${isRtl ? 'mr-auto' : 'ml-auto'}
|
||||
`}
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
|
||||
</svg>
|
||||
)}
|
||||
|
||||
{/* Red asterisk for empty required fields */}
|
||||
{showRequiredIndicator && (
|
||||
<span className={`
|
||||
text-red-300 text-[9px] leading-none shrink-0
|
||||
${isRtl ? 'mr-auto' : 'ml-auto'}
|
||||
`}>
|
||||
*
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
export default IndividualFieldBadge
|
||||