Added a signature legal agreement warning and integrated the resource file (resx) as a JavaScript object into the _Layout.cshtml file. This enables the agreement warning to support multiple languages.
This commit is contained in:
parent
21934928c2
commit
c31f081208
@ -120,6 +120,9 @@
|
|||||||
<data name="Complete" xml:space="preserve">
|
<data name="Complete" xml:space="preserve">
|
||||||
<value>Abschließen</value>
|
<value>Abschließen</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Confirmation" xml:space="preserve">
|
||||||
|
<value>Konfirmation</value>
|
||||||
|
</data>
|
||||||
<data name="de-DE" xml:space="preserve">
|
<data name="de-DE" xml:space="preserve">
|
||||||
<value>Deutch</value>
|
<value>Deutch</value>
|
||||||
</data>
|
</data>
|
||||||
@ -135,6 +138,9 @@
|
|||||||
<data name="EnvelopeInfo2" xml:space="preserve">
|
<data name="EnvelopeInfo2" xml:space="preserve">
|
||||||
<value>Erstellt am {0} von {1}. Sie können den Absender über <a href="mailto:{2}?subject={3}&body=Sehr%20geehrter%20{4}%20{5},%0A%0A%0A">{6}</a> kontaktieren.</value>
|
<value>Erstellt am {0} von {1}. Sie können den Absender über <a href="mailto:{2}?subject={3}&body=Sehr%20geehrter%20{4}%20{5},%0A%0A%0A">{6}</a> kontaktieren.</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Finalize" xml:space="preserve">
|
||||||
|
<value>Abschließen</value>
|
||||||
|
</data>
|
||||||
<data name="LocakedOpen" xml:space="preserve">
|
<data name="LocakedOpen" xml:space="preserve">
|
||||||
<value>Öffnen</value>
|
<value>Öffnen</value>
|
||||||
</data>
|
</data>
|
||||||
@ -156,8 +162,11 @@
|
|||||||
<data name="Reject" xml:space="preserve">
|
<data name="Reject" xml:space="preserve">
|
||||||
<value>Ablehnen</value>
|
<value>Ablehnen</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Review" xml:space="preserve">
|
||||||
|
<value>Überprüfung</value>
|
||||||
|
</data>
|
||||||
<data name="SigAgree" xml:space="preserve">
|
<data name="SigAgree" xml:space="preserve">
|
||||||
<value>Durch Auswahl von Übernehmen und signieren stimme ich zu, dass die Signatur und die Initialen als elektronische Darstellung meiner Signatur und meiner Initialen in den Fällen gelten, in denen ich (oder mein Beauftragter) sie auf Dokumenten, einschließlich rechtsgültiger Verträge, verwende.</value>
|
<value>Durch Klick auf Abschließen stimme ich zu, dass die abgebildete und übermittelte Signatur als elektronische Darstellung meiner Signatur in den Fällen gelten, in denen ich sie auf Dokumenten, einschließlich rechtsgültiger Verträge verwende.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SignDoc" xml:space="preserve">
|
<data name="SignDoc" xml:space="preserve">
|
||||||
<value>Dokument unterschreiben</value>
|
<value>Dokument unterschreiben</value>
|
||||||
|
|||||||
@ -120,6 +120,9 @@
|
|||||||
<data name="Complete" xml:space="preserve">
|
<data name="Complete" xml:space="preserve">
|
||||||
<value>Complete</value>
|
<value>Complete</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Confirmation" xml:space="preserve">
|
||||||
|
<value>Confirmation</value>
|
||||||
|
</data>
|
||||||
<data name="de-DE" xml:space="preserve">
|
<data name="de-DE" xml:space="preserve">
|
||||||
<value>German</value>
|
<value>German</value>
|
||||||
</data>
|
</data>
|
||||||
@ -135,6 +138,9 @@
|
|||||||
<data name="EnvelopeInfo2" xml:space="preserve">
|
<data name="EnvelopeInfo2" xml:space="preserve">
|
||||||
<value>Created on {0} by {1}. You can contact the sender via <a href="mailto:{2}?subject={3}&body=Dear%20{4}%20{5},%0A%0A%0A">{6}</a>.</value>
|
<value>Created on {0} by {1}. You can contact the sender via <a href="mailto:{2}?subject={3}&body=Dear%20{4}%20{5},%0A%0A%0A">{6}</a>.</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Finalize" xml:space="preserve">
|
||||||
|
<value>Finalize</value>
|
||||||
|
</data>
|
||||||
<data name="LocakedOpen" xml:space="preserve">
|
<data name="LocakedOpen" xml:space="preserve">
|
||||||
<value>Open</value>
|
<value>Open</value>
|
||||||
</data>
|
</data>
|
||||||
@ -156,8 +162,11 @@
|
|||||||
<data name="Reject" xml:space="preserve">
|
<data name="Reject" xml:space="preserve">
|
||||||
<value>Reject</value>
|
<value>Reject</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Review" xml:space="preserve">
|
||||||
|
<value>Review</value>
|
||||||
|
</data>
|
||||||
<data name="SigAgree" xml:space="preserve">
|
<data name="SigAgree" xml:space="preserve">
|
||||||
<value>By selecting accept and sign, I agree that the signature and the initials are considered as electronic representations of my signature and my initials in cases where I (or my agent) use them on documents, including legally valid contracts.</value>
|
<value>By clicking on Finalize, I agree that the signature shown and submitted is an electronic representation of my signature in cases where I use it on documents, including legally binding contracts.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SignDoc" xml:space="preserve">
|
<data name="SignDoc" xml:space="preserve">
|
||||||
<value>Sign document</value>
|
<value>Sign document</value>
|
||||||
|
|||||||
33
EnvelopeGenerator.Web/Controllers/LocalizationController.cs
Normal file
33
EnvelopeGenerator.Web/Controllers/LocalizationController.cs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
using EnvelopeGenerator.Application.Resources;
|
||||||
|
using Ganss.Xss;
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.Extensions.Localization;
|
||||||
|
|
||||||
|
namespace EnvelopeGenerator.Web.Controllers
|
||||||
|
{
|
||||||
|
[ApiController]
|
||||||
|
[Route("api/[controller]")]
|
||||||
|
public class LocalizationController : ControllerBase
|
||||||
|
{
|
||||||
|
private readonly IStringLocalizer<Resource> _localizer;
|
||||||
|
private readonly ILogger<LocalizationController> _logger;
|
||||||
|
private readonly HtmlSanitizer _sanitizer;
|
||||||
|
|
||||||
|
public LocalizationController(IStringLocalizer<Resource> localizer, ILogger<LocalizationController> logger, HtmlSanitizer sanitizer)
|
||||||
|
{
|
||||||
|
_localizer = localizer;
|
||||||
|
_logger = logger;
|
||||||
|
_sanitizer = sanitizer;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet]
|
||||||
|
public IActionResult GetLocalized([FromQuery] string[]? name = null, [FromQuery] string[]? ignore = null)
|
||||||
|
{
|
||||||
|
ignore ??= Array.Empty<string>();
|
||||||
|
var pairs = name?.ToDictionary(n => n, n => _localizer[n].Value)
|
||||||
|
?? _localizer.GetAllStrings().Where(ls => !ignore.Contains(ls.Name)).ToDictionary(ls => ls.Name, ls => ls.Value); ;
|
||||||
|
return Ok(pairs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -28,11 +28,5 @@ namespace EnvelopeGenerator.Web.Controllers.Test
|
|||||||
|
|
||||||
[HttpGet("culture")]
|
[HttpGet("culture")]
|
||||||
public IActionResult GetCultures(string? lang = null) => lang is null ? Ok(_cultures) : Ok(_cultures[lang]);
|
public IActionResult GetCultures(string? lang = null) => lang is null ? Ok(_cultures) : Ok(_cultures[lang]);
|
||||||
|
|
||||||
[HttpGet("to-culture-info")]
|
|
||||||
public IActionResult ToCultureInfo(string locale) => Ok(locale.ToCultureInfo());
|
|
||||||
|
|
||||||
[HttpGet("two-letter-iso-language-name")]
|
|
||||||
public IActionResult TwoLetterISOLanguageName(string locale) => Ok(locale.TwoLetterISOLanguageName());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,6 +3,8 @@
|
|||||||
}
|
}
|
||||||
@using DigitalData.Core.DTO;
|
@using DigitalData.Core.DTO;
|
||||||
@using EnvelopeGenerator.Application.DTOs;
|
@using EnvelopeGenerator.Application.DTOs;
|
||||||
|
@using Newtonsoft.Json
|
||||||
|
@using Newtonsoft.Json.Serialization
|
||||||
@model EnvelopeReceiverDto;
|
@model EnvelopeReceiverDto;
|
||||||
@{
|
@{
|
||||||
ViewData["Title"] = _localizer[WebKey.SignDoc];
|
ViewData["Title"] = _localizer[WebKey.SignDoc];
|
||||||
@ -88,11 +90,11 @@
|
|||||||
}
|
}
|
||||||
@if (ViewData["DocumentBytes"] is byte[] documentBytes)
|
@if (ViewData["DocumentBytes"] is byte[] documentBytes)
|
||||||
{
|
{
|
||||||
var settings = new Newtonsoft.Json.JsonSerializerSettings
|
var settings = new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
|
ContractResolver = new CamelCasePropertyNamesContractResolver()
|
||||||
};
|
};
|
||||||
var envelopeReceiverJson = Newtonsoft.Json.JsonConvert.SerializeObject(Model, settings);
|
var envelopeReceiverJson = JsonConvert.SerializeObject(Model, settings);
|
||||||
var documentBase64String = Convert.ToBase64String(documentBytes);
|
var documentBase64String = Convert.ToBase64String(documentBytes);
|
||||||
var envelopeKey = ViewData["EnvelopeKey"] as string;
|
var envelopeKey = ViewData["EnvelopeKey"] as string;
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,9 @@
|
|||||||
<!DOCTYPE html>
|
@using DigitalData.Core.API
|
||||||
|
@using Newtonsoft.Json
|
||||||
|
@{
|
||||||
|
var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string;
|
||||||
|
}
|
||||||
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
@ -24,6 +29,13 @@
|
|||||||
<script src="~/js/util.js" asp-append-version="true"></script>
|
<script src="~/js/util.js" asp-append-version="true"></script>
|
||||||
<script src="~/js/api.js" asp-append-version="true"></script>
|
<script src="~/js/api.js" asp-append-version="true"></script>
|
||||||
@await RenderSectionAsync("Scripts", required: false)
|
@await RenderSectionAsync("Scripts", required: false)
|
||||||
|
@{
|
||||||
|
var lStrsJson = JsonConvert.SerializeObject(_localizer.ToDictionary()).TrySanitize(_sanitizer);
|
||||||
|
}
|
||||||
|
<script nonce="@nonce">
|
||||||
|
var localized = @Html.Raw(lStrsJson)
|
||||||
|
</script>
|
||||||
|
|
||||||
<main role="main">
|
<main role="main">
|
||||||
<partial name="_CookieConsentPartial" />
|
<partial name="_CookieConsentPartial" />
|
||||||
@RenderBody()
|
@RenderBody()
|
||||||
|
|||||||
@ -177,9 +177,20 @@ class App {
|
|||||||
icon: 'warning',
|
icon: 'warning',
|
||||||
})
|
})
|
||||||
return false
|
return false
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return Swal.fire({
|
||||||
|
title: localized.Confirmation,
|
||||||
|
html: `<div class="text-start fs-6 p-0 m-0">${localized.SigAgree}</div>`,
|
||||||
|
icon: "question",
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonColor: "#3085d6",
|
||||||
|
cancelButtonColor: "#d33",
|
||||||
|
confirmButtonText: localized.Finalize,
|
||||||
|
cancelButtonText: localized.Review
|
||||||
|
}).then(async (result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
//---
|
||||||
// Save changes before doing anything
|
// Save changes before doing anything
|
||||||
try {
|
try {
|
||||||
await this.Instance.save()
|
await this.Instance.save()
|
||||||
@ -223,6 +234,11 @@ class App {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
//---
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user