From dd6ab13e6e06cde215aa0d4f184a35299d227355 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Mon, 24 Jun 2024 15:55:27 +0200 Subject: [PATCH] =?UTF-8?q?Hinzugef=C3=BCgt=20Localizer=20Dienste=20f?= =?UTF-8?q?=C3=BCr=20beide=20api=20und=20angular?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnvelopeGenerator.Application.csproj | 22 +++++ .../envelope-table.component.ts | 7 +- .../src/app/models/envelope-receiver.model.ts | 6 -- .../app/pages/envelope/envelope.component.ts | 14 +++- .../app/services/envelope-receiver.service.ts | 8 +- .../app/services/localization.service.spec.ts | 16 ++++ .../src/app/services/localization.service.ts | 21 +++++ .../Controllers/LocalizationController.cs | 83 +++++++++++++++++++ .../EnvelopeGenerator.GeneratorAPI.csproj | 2 +- 9 files changed, 161 insertions(+), 18 deletions(-) delete mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/models/envelope-receiver.model.ts create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/localization.service.spec.ts create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/localization.service.ts create mode 100644 EnvelopeGenerator.GeneratorAPI/Controllers/LocalizationController.cs 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 @@ - +