From 341707264bcc1c9b5c44397883f9bfa4ccde68d9 Mon Sep 17 00:00:00 2001 From: Fahri Gedik Date: Mon, 28 Jul 2025 23:31:07 +0300 Subject: [PATCH 1/5] Refactor locale initialization to support async and injector Updated provideAppInitializer to use an async function and pass the Injector to localeInitializer. Modified localeInitializer to accept an optional Injector parameter for improved flexibility and testability. --- .../src/lib/providers/core-module-config.provider.ts | 11 +++++++---- .../packages/core/src/lib/utils/initial-utils.ts | 8 ++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts b/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts index fafb51ff6d..3ebe64360f 100644 --- a/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts +++ b/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts @@ -1,4 +1,4 @@ -import { makeEnvironmentProviders, Provider, inject, provideAppInitializer } from '@angular/core'; +import { makeEnvironmentProviders, Provider, provideAppInitializer, inject, Injector } from '@angular/core'; import { TitleStrategy } from '@angular/router'; import { HTTP_INTERCEPTORS, @@ -107,13 +107,16 @@ export function provideAbpCore(...features: CoreFeature[]) { }), ), provideAppInitializer(() => { - getInitialData(); - localeInitializer(); + const injector = inject(Injector); inject(LocalizationService); inject(LocalStorageListenerService); inject(RoutesHandler); - }), + return (async (): Promise => { + await getInitialData(); + await localeInitializer(injector); + })(); + }), LocaleProvider, CookieLanguageProvider, { diff --git a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts index 3bc9b6f2b5..254d61896d 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts @@ -52,10 +52,10 @@ export async function getInitialData() { await lastValueFrom(result$); } -export function localeInitializer() { - const injector = inject(Injector); - const sessionState = injector.get(SessionStateService); - const { registerLocaleFn }: ABP.Root = injector.get(CORE_OPTIONS); +export function localeInitializer(injector?: Injector) { + const currentInjector = injector || inject(Injector); + const sessionState = currentInjector.get(SessionStateService); + const { registerLocaleFn }: ABP.Root = currentInjector.get(CORE_OPTIONS); const lang = sessionState.getLanguage() || 'en'; From a9fae7ff2973811eb19c2dd6b26f4f66b32071fe Mon Sep 17 00:00:00 2001 From: Fahri Gedik Date: Tue, 29 Jul 2025 17:22:18 +0300 Subject: [PATCH 2/5] Move localeInitializer call to getInitialData The localeInitializer invocation was moved from the app initializer in core-module-config.provider.ts to the getInitialData function in initial-utils.ts. This change centralizes initialization logic and ensures locale setup occurs after initial data is loaded. --- .../core/src/lib/providers/core-module-config.provider.ts | 2 -- npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts b/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts index 3ebe64360f..fa24f66e45 100644 --- a/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts +++ b/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts @@ -107,14 +107,12 @@ export function provideAbpCore(...features: CoreFeature[]) { }), ), provideAppInitializer(() => { - const injector = inject(Injector); inject(LocalizationService); inject(LocalStorageListenerService); inject(RoutesHandler); return (async (): Promise => { await getInitialData(); - await localeInitializer(injector); })(); }), LocaleProvider, diff --git a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts index 254d61896d..0c65073ef6 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/initial-utils.ts @@ -50,6 +50,7 @@ export async function getInitialData() { }), ); await lastValueFrom(result$); + await localeInitializer(injector); } export function localeInitializer(injector?: Injector) { From 4e462b577d3b6368d1c90217fe702df47ed9fb49 Mon Sep 17 00:00:00 2001 From: Fahri Gedik Date: Wed, 30 Jul 2025 09:27:56 +0300 Subject: [PATCH 3/5] Refactor app initializer to use async function Simplifies the app initializer by making it an async function directly instead of returning an async IIFE. This improves readability and maintains the same initialization behavior. --- .../core/src/lib/providers/core-module-config.provider.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts b/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts index fa24f66e45..631f25217c 100644 --- a/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts +++ b/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts @@ -106,14 +106,11 @@ export function provideAbpCore(...features: CoreFeature[]) { headerName: 'RequestVerificationToken', }), ), - provideAppInitializer(() => { + provideAppInitializer(async () => { inject(LocalizationService); inject(LocalStorageListenerService); inject(RoutesHandler); - - return (async (): Promise => { - await getInitialData(); - })(); + await getInitialData(); }), LocaleProvider, CookieLanguageProvider, From de1db9761a909d3757bd4459919c55808f767691 Mon Sep 17 00:00:00 2001 From: sumeyye Date: Wed, 30 Jul 2025 09:32:16 +0300 Subject: [PATCH 4/5] update: remove unused imports --- .../core/src/lib/providers/core-module-config.provider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts b/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts index 631f25217c..e8ca5ea711 100644 --- a/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts +++ b/npm/ng-packs/packages/core/src/lib/providers/core-module-config.provider.ts @@ -1,4 +1,4 @@ -import { makeEnvironmentProviders, Provider, provideAppInitializer, inject, Injector } from '@angular/core'; +import { makeEnvironmentProviders, Provider, provideAppInitializer, inject } from '@angular/core'; import { TitleStrategy } from '@angular/router'; import { HTTP_INTERCEPTORS, @@ -23,7 +23,7 @@ import { ABP, SortableItem } from '../models'; import { AuthErrorFilterService } from '../abstracts'; import { DEFAULT_DYNAMIC_LAYOUTS } from '../constants'; import { LocalizationService, LocalStorageListenerService, AbpTitleStrategy } from '../services'; -import { DefaultQueueManager, getInitialData, localeInitializer } from '../utils'; +import { DefaultQueueManager, getInitialData } from '../utils'; import { CookieLanguageProvider, IncludeLocalizationResourcesProvider, LocaleProvider } from './'; import { TimezoneInterceptor } from '../interceptors'; From 7c75110d6d250c5a1ceb49e726874de958bc724f Mon Sep 17 00:00:00 2001 From: Fahri Gedik Date: Sun, 3 Aug 2025 00:57:07 +0300 Subject: [PATCH 5/5] Add Czech translations for Marked Items and comments Added new Czech localization strings for Marked Items, favorites, and comment approval features in cs.json. This update supports new UI elements and system messages related to marking items, filtering favorites, and comment moderation. --- .../CmsKit/Localization/Resources/cs.json | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json index c530dd064b..17e549f7a7 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/cs.json @@ -15,6 +15,7 @@ "CmsKit.Ratings": "Hodnocení", "CmsKit.Reactions": "Reakce", "CmsKit.Tags": "Tagy", + "CmsKit.MarkedItems": "Označené položky", "CmsKit:0002": "Obsah již existuje!", "CmsKit:0003": "Entitu {0} nelze označit.", "CmsKit:Blog:0001": "Daný slimák ({Slug}) již existuje!", @@ -26,8 +27,19 @@ "CmsKit:Rating:0001": "Entitu {EntityType} nelze hodnotit.", "CmsKit:Reaction:0001": "Entita {EntityType} nemůže mít reakce.", "CmsKit:Tag:0002": "Entitu nelze označit!", + "CmsKit:MarkedItem:ToggleConfirmation": "Opravdu chcete přepnout označenou položku?", + "ToggleFavorite": "Přidat/Odebrat z oblíbených", + "FavoritesFilterMessage": "Pro filtrování oblíbených se přihlaste", + "FilterOnFavorites": "Filtrovat podle oblíbených", "CommentAuthorizationExceptionMessage": "Tyto komentáře nejsou povoleny pro veřejné zobrazení.", + "CmsKit:Modals:Login": "Přihlášení", + "CmsKit:Modals:LoginModalDefaultMessage": "Pro pokračování se přihlaste!", + "CmsKit:Modals:YouAreNotAuthenticated": "Tato operace pro vás není autorizována.", "CommentDeletionConfirmationMessage": "Tento komentář a všechny odpovědi budou smazány!", + "CmsKit:MarkedItem:0001": "Entitu {EntityType} nelze označit.", + "CmsKit:MarkedItem:0002": "Pro typ entity '{EntityType}' nebyla nalezena žádná definice.", + "CmsKit:MarkedItem:0003": "Definice pro typ entity '{EntityType}' již existuje. Každý typ entity by měl mít pouze jednu definici.", + "CmsKit:MarkedItem:LoginMessage": "Pro označení této položky se přihlaste.", "Comments": "Komentáře", "Content": "Obsah", "ContentDeletionConfirmationMessage": "Opravdu chcete tento obsah smazat?", @@ -134,6 +146,7 @@ "SamplePageMessage": "Ukázková stránka pro modul Pro", "SaveChanges": "Uložit změny", "Script": "Skript", + "SelectLayout": "Vybrat rozložení", "SelectAll": "Vybrat vše", "Send": "Poslat", "SendMessage": "Poslat zprávu", @@ -216,6 +229,8 @@ "Feature:ReactionEnableDescription": "Systém reakcí CMS Kit, který umožňuje uživatelům posílat reakce entitám, jako jsou BlogPost, Komentáře atd.", "Feature:TagEnable": "Označování", "Feature:TagEnableDescription": "Systém značek CMS Kit, který umožňuje označování entit, jako je BlogPost.", + "Feature:MarkedItemEnable": "Označená položka", + "Feature:MarkedItemEnableDescription": "Systém označování CMS Kit, který umožňuje uživatelům označovat entity jako oblíbené.", "DeleteBlogPostMessage": "Blog bude smazán. Jsi si jistá?", "CaptchaCode": "Captcha kód", "CommentTextRequired": "Komentář je povinný", @@ -230,6 +245,37 @@ "TagsHelpText": "Značky by měly být odděleny čárkami (např.: tag1, tag2, tag3)", "ThisPartOfContentCouldntBeLoaded": "Tato část obsahu nemohla být načtena.", "DuplicateCommentAttemptMessage": "Byl zjištěn duplicitní pokus o vložení komentáře. Váš komentář již byl odeslán.", + "NoBlogPostYet": "Zatím žádný blogový příspěvek!", + "CmsKit:Comment": "Komentář", + "CmsKitCommentOptions:RequireApprovement": "Vyžadovat schválení komentářů", + "CmsKitCommentOptions:RequireApprovementDescription": "Když je povoleno, komentáře budou vyžadovat schválení před zveřejněním.", + "CommentFilter:ApproveState": "Stav schválení", + "ApproveState": "Stav schválení", + "CommentFilter:0": "Vše", + "CommentFilter:1": "Schváleno", + "CommentFilter:2": "Zamítnuto", + "CommentFilter:4": "Čeká", + "ApprovedSuccessfully": "Úspěšně schváleno", + "ApprovalRevokedSuccessfully": "Schválení úspěšně odvoláno", + "Approve": "Schválit", + "Disapproved": "Zamítnuto", + "CommentAlertMessage": "Čeká {0} komentářů na schválení", + "Settings:Menu:CmsKit": "CMS", + "CommentsAwaitingApproval": "Komentáře čekající na schválení", + "JustNow": "Právě teď", + "MinuteAgo": "před 1 minutou", + "MinutesAgo": "před {0} minutami", + "HourAgo": "před 1 hodinou", + "HoursAgo": "před {0} hodinami", + "YesterdayAt": "Včera v {0}", + "DayAt": "{0} v {1}", + "MonthDayAt": "{0} {1} v {2}", + "FullDate": "{0} {1} {2}", + "Minute": "m", + "Hour": "h", + "Day": "d", + "Week": "t", + "CommentSubmittedForApproval": "Váš komentář byl odeslán ke schválení.", "ChooseAnActionForBlog": "Vyberte akci pro blog", "AssignBlogPostsToOtherBlog": "Přiřaďte blogové příspěvky k jinému blogu", "SelectAnBlogToAssign": "Vyberte blog, ke kterému chcete přiřadit blogové příspěvky",