diff --git a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj
index a960879f..229b4652 100644
--- a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj
+++ b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj
@@ -6,6 +6,10 @@
enable
+
+
+
+
@@ -41,6 +45,24 @@
+
+ True
+ True
+ Model.resx
+
+
+
+
+
+ My.Resources
+ Model.en.Designer.vb
+ PublicResXFileCodeGenerator
+
+
+ My.Resources
+ Model.Designer.cs
+ PublicResXFileCodeGenerator
+
PreserveNewest
diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts
index 112dc4b5..4b7b4b9d 100644
--- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts
+++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts
@@ -57,11 +57,8 @@ export class EnvelopeTableComponent {
constructor(private erService: EnvelopeReceiverService) { }
- ngOnInit() {
- this.erService.getEnvelopeReceiver().subscribe({
- next: res => this.source = res,
- error: console.error
- });
+ async ngOnInit() {
+ this.source = await this.erService.getEnvelopeReceiver();
}
columns: Array = [
diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/models/envelope-receiver.model.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/models/envelope-receiver.model.ts
deleted file mode 100644
index 405c92ea..00000000
--- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/models/envelope-receiver.model.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export interface EnvelopeReceiver {
- name: string | null
- privateMessage: string | null
- addedWhen: Date
- changedWhen: Date | null
-}
diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.ts
index b91f2f7f..7345260f 100644
--- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.ts
+++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.ts
@@ -1,6 +1,8 @@
import { Component } from '@angular/core';
import { EnvelopeTableComponent } from "../../components/envelope-table/envelope-table.component";
-import {MatTabsModule} from '@angular/material/tabs';
+import { MatTabsModule } from '@angular/material/tabs';
+import { LocalizationService } from '../../services/localization.service';
+import { firstValueFrom } from 'rxjs/internal/firstValueFrom';
@Component({
selector: 'app-envelope',
@@ -11,4 +13,12 @@ import {MatTabsModule} from '@angular/material/tabs';
})
export class EnvelopeComponent {
-}
+ private localizer: any = {};
+
+ constructor(private localizationService: LocalizationService) {
+ }
+
+ async ngOnInit() {
+ this.localizer = await this.localizationService.getLocalizer()
+ }
+}
\ No newline at end of file
diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts
index 8b4306da..52232bae 100644
--- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts
+++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts
@@ -1,6 +1,6 @@
import { Injectable, inject } from '@angular/core';
-import { HttpClient, HttpHeaders } from '@angular/common/http';
-import { Observable, catchError } from 'rxjs';
+import { HttpClient } from '@angular/common/http';
+import { Observable, firstValueFrom } from 'rxjs';
import { API_URL } from '../tokens/index';
@Injectable({
@@ -14,7 +14,7 @@ export class EnvelopeReceiverService {
this.url = `${api_url}/envelopereceiver`;
}
- getEnvelopeReceiver(): Observable {
- return this.http.get(this.url);
+ getEnvelopeReceiver(): Promise {
+ return firstValueFrom(this.http.get(this.url));
}
}
\ No newline at end of file
diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/localization.service.spec.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/localization.service.spec.ts
new file mode 100644
index 00000000..208606e2
--- /dev/null
+++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/localization.service.spec.ts
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { LocalizationService } from './localization.service';
+
+describe('LocalizationService', () => {
+ let service: LocalizationService;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({});
+ service = TestBed.inject(LocalizationService);
+ });
+
+ it('should be created', () => {
+ expect(service).toBeTruthy();
+ });
+});
\ No newline at end of file
diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/localization.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/localization.service.ts
new file mode 100644
index 00000000..925d4795
--- /dev/null
+++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/localization.service.ts
@@ -0,0 +1,21 @@
+import { Injectable, inject } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable, firstValueFrom } from 'rxjs';
+import { API_URL } from '../tokens/index';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class LocalizationService {
+
+ private url: string;
+
+ constructor(private http: HttpClient) {
+ const api_url = inject(API_URL);
+ this.url = `${api_url}/localization`;
+ }
+
+ getLocalizer(): Promise {
+ return firstValueFrom(this.http.get(this.url));
+ }
+}
\ No newline at end of file
diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs
new file mode 100644
index 00000000..c0fd54c1
--- /dev/null
+++ b/EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs
@@ -0,0 +1,83 @@
+using DigitalData.Core.API;
+using EnvelopeGenerator.Application.Resources;
+using Microsoft.AspNetCore.Localization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Caching.Memory;
+using Microsoft.Extensions.Localization;
+
+namespace EnvelopeGenerator.GeneratorAPI.Controllers
+{
+ [Route("api/[controller]")]
+ [ApiController]
+ public class LocalizationController : ControllerBase
+ {
+ private static readonly Guid L_KEY = Guid.NewGuid();
+
+ private readonly ILogger _logger;
+ private readonly IStringLocalizer _localizer;
+ private readonly IMemoryCache _cache;
+ public LocalizationController(ILogger logger, IStringLocalizer localizer, IMemoryCache memoryCache)
+ {
+ _logger = logger;
+ _localizer = localizer;
+ _cache = memoryCache;
+ }
+
+ [HttpGet]
+ public IActionResult GetAll() => Ok(_cache.GetOrCreate(L_KEY, _ => _localizer.ToDictionary()));
+
+ [HttpGet("lang")]
+ public IActionResult GetLanguage() => Language is null ? NotFound() : Ok(Language);
+
+ [HttpPost("lang")]
+ public IActionResult SetLanguage([FromQuery] string language)
+ {
+ if (string.IsNullOrEmpty(language))
+ return BadRequest();
+
+ Language = language;
+ return Ok();
+ }
+
+ [HttpDelete("lang")]
+ public IActionResult DeleteLanguage()
+ {
+ Language = null;
+ return Ok();
+ }
+
+ private string? Language
+ {
+ get
+ {
+ var cookieValue = Request.Cookies[CookieRequestCultureProvider.DefaultCookieName];
+
+ if (string.IsNullOrEmpty(cookieValue))
+ return null;
+
+ var culture = CookieRequestCultureProvider.ParseCookieValue(cookieValue)?.Cultures[0];
+ return culture?.Value ?? null;
+ }
+ set
+ {
+ if (value is null)
+ Response.Cookies.Delete(CookieRequestCultureProvider.DefaultCookieName);
+ else
+ {
+ var cookieOptions = new CookieOptions()
+ {
+ Expires = DateTimeOffset.UtcNow.AddYears(1),
+ Secure = false,
+ SameSite = SameSiteMode.Strict,
+ HttpOnly = true
+ };
+
+ Response.Cookies.Append(
+ CookieRequestCultureProvider.DefaultCookieName,
+ CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(value)),
+ cookieOptions);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj
index 0870ff7d..e864cdc2 100644
--- a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj
+++ b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj
@@ -8,7 +8,7 @@
-
+