Files
marketplaces/src/app/i18n/translations.ts

1193 lines
33 KiB
TypeScript
Raw Normal View History

2026-02-26 23:09:20 +04:00
export interface Translations {
header: {
home: string;
search: string;
about: string;
contacts: string;
searchPlaceholder: string;
catalog: string;
wishlist: string;
compare: string;
openMenu: string;
closeMenu: string;
2026-02-26 23:09:20 +04:00
};
footer: {
description: string;
company: string;
aboutUs: string;
contacts: string;
requisites: string;
support: string;
faq: string;
delivery: string;
guarantee: string;
legal: string;
offer: string;
privacy: string;
returns: string;
info: string;
aboutCompany: string;
documents: string;
paymentRules: string;
returnPolicy: string;
publicOffer: string;
help: string;
payment: string;
allRightsReserved: string;
};
home: {
welcomeTo: string;
subtitle: string;
startSearch: string;
loading: string;
errorTitle: string;
retry: string;
categoriesTitle: string;
categoriesSubtitle: string;
categoriesEmpty: string;
categoriesEmptyDesc: string;
dexarHeroTitle: string;
dexarHeroSubtitle: string;
dexarHeroTagline: string;
goToCatalog: string;
findProduct: string;
loadingDexar: string;
catalogTitle: string;
emptyCategoriesDexar: string;
categoriesSoonDexar: string;
itemsCount: string;
};
cart: {
title: string;
clear: string;
empty: string;
emptyDesc: string;
goShopping: string;
total: string;
items: string;
deliveryLabel: string;
2026-06-21 23:13:01 +04:00
deliveryMethod: string;
selectDelivery: string;
deliveryPlace: string;
deliveryTime: string;
digitalDelivery: string;
deliveryRequired: string;
2026-02-26 23:09:20 +04:00
toPay: string;
agreeWith: string;
publicOffer: string;
returnPolicy: string;
guaranteeTerms: string;
privacyPolicy: string;
and: string;
checkout: string;
2026-06-29 00:06:18 +04:00
payViaQr: string;
payViaCard: string;
2026-02-26 23:09:20 +04:00
close: string;
creatingPayment: string;
waitFewSeconds: string;
scanQr: string;
amountToPay: string;
waitingPayment: string;
copied: string;
copyLink: string;
openNewTab: string;
paymentSuccess: string;
paymentSuccessDesc: string;
sending: string;
send: string;
2026-06-02 00:57:36 +04:00
paymentError: string;
paymentErrorDesc: string;
retryPayment: string;
2026-02-26 23:09:20 +04:00
paymentTimeout: string;
paymentTimeoutDesc: string;
autoClose: string;
confirmClear: string;
removeItem: string;
paymentQrAlt: string;
2026-02-26 23:09:20 +04:00
acceptTerms: string;
copyError: string;
emailSuccess: string;
emailError: string;
phoneRequired: string;
phoneMoreDigits: string;
phoneTooMany: string;
emailRequired: string;
emailTooShort: string;
emailTooLong: string;
emailNeedsAt: string;
emailNeedsDomain: string;
emailInvalid: string;
2026-03-24 00:09:11 +04:00
loginRequired: string;
loginRequiredDesc: string;
loginWithTelegram: string;
orScanQr: string;
2026-02-26 23:09:20 +04:00
};
search: {
title: string;
placeholder: string;
searchBarAria: string;
2026-02-26 23:09:20 +04:00
resultsCount: string;
searching: string;
retry: string;
noResults: string;
noResultsFor: string;
noResultsHint: string;
emptyResultsAria: string;
popularCategories: string;
recommendedProducts: string;
aiSuggestionHint: string;
suggestionType: {
product: string;
category: string;
brand: string;
collection: string;
seller: string;
'static-page': string;
ai: string;
};
2026-02-26 23:09:20 +04:00
addToCart: string;
loadingMore: string;
allLoaded: string;
emptyState: string;
2026-07-05 01:10:56 +04:00
minLength: string;
2026-02-26 23:09:20 +04:00
of: string;
};
category: {
retry: string;
addToCart: string;
loadingMore: string;
allLoaded: string;
emptyTitle: string;
emptyDesc: string;
goHome: string;
loading: string;
};
2026-07-05 01:36:21 +04:00
catalog: {
title: string;
breadcrumb: string;
allCategories: string;
products: string;
loading: string;
loadingProducts: string;
errorTitle: string;
error: string;
retry: string;
categoryHint: string;
productHint: string;
emptyTitle: string;
emptyCategories: string;
emptyProducts: string;
addToCart: string;
categoriesCount: string;
productsCount: string;
2026-07-09 01:40:22 +04:00
entriesCount: string;
categoryBannerPlaceholder: string;
navigationPlaceholder: string;
removeSavedSearch: string;
resetFilters: string;
filtersTitle: string;
from: string;
to: string;
2026-07-09 01:40:22 +04:00
minValue: string;
maxValue: string;
enabled: string;
searchPlaceholder: string;
searchSubmit: string;
clearSearch: string;
2026-07-09 01:40:22 +04:00
suggestionsTitle: string;
popularSearchesTitle: string;
2026-07-09 01:40:22 +04:00
recentSearchesTitle: string;
searchHistoryTitle: string;
clearHistory: string;
searchNoResultsHint: string;
searchProductsFound: string;
searchResultsSummary: string;
2026-07-10 15:55:38 +04:00
loadMore: string;
2026-07-09 01:40:22 +04:00
sortBy: string;
sortRelevance: string;
sortLatest: string;
sortPriceAsc: string;
sortPriceDesc: string;
sortRating: string;
sortPopular: string;
sortDiscount: string;
layoutGrid: string;
layoutLargeGrid: string;
layoutCompactGrid: string;
2026-07-10 15:55:38 +04:00
layoutGrid2: string;
layoutGrid3: string;
layoutGrid4: string;
layoutCompact: string;
2026-07-09 01:40:22 +04:00
layoutList: string;
noResults: string;
itemsCount: string;
emptyResultsTitle: string;
emptyResultsDescription: string;
previousPage: string;
nextPage: string;
pageOf: string;
emptyCategoryTitle: string;
emptyCategoryMessage: string;
2026-07-10 15:55:38 +04:00
goToParentCategory: string;
browseCategories: string;
2026-07-10 15:55:38 +04:00
offlineTitle: string;
offlineMessage: string;
noFilterMatchTitle: string;
noFilterMatchMessage: string;
clearFilters: string;
openFilters: string;
applyFilters: string;
close: string;
filtersDrawerAria: string;
sortSheetAria: string;
mobileToolbarAria: string;
gridCycle: string;
filtersPanelAria: string;
2026-07-09 01:40:22 +04:00
filterPrice: string;
filterAvailability: string;
filterInStock: string;
filterLowStock: string;
filterOutOfStock: string;
filterRating: string;
filterStars: string;
filterBrand: string;
filterCategory: string;
filterCategoryValue: string;
filterSubcategory: string;
filterDiscount: string;
filterNew: string;
filterColor: string;
filterSize: string;
filterAttributes: string;
};
productDetails: {
loading: string;
errorTitle: string;
retry: string;
missingTitle: string;
missingDescription: string;
backToCatalog: string;
tabsAria: string;
mediaAria: string;
ratingStarsAria: string;
selectRatingAria: string;
reviewsEmpty: string;
questionsEmpty: string;
askQuestion: string;
hideQuestionForm: string;
questionFormTitle: string;
questionFormPlaceholder: string;
questionFormAnonymous: string;
submitQuestion: string;
reviewFormTitle: string;
reviewRatingLabel: string;
reviewTitleLabel: string;
reviewTitlePlaceholder: string;
reviewTextLabel: string;
reviewTextPlaceholder: string;
reviewAnonymous: string;
reviewUploadPlaceholder: string;
reviewRatingRequired: string;
reviewTextRequired: string;
reviewSuccess: string;
2026-07-09 01:40:22 +04:00
submitReview: string;
submitting: string;
loadMore: string;
showingOf: string;
questionsSubmissionFuture: string;
specificationsGeneral: string;
actionsAria: string;
buyNow: string;
wishlist: string;
compare: string;
share: string;
notifyMe: string;
zoom: string;
fullscreen: string;
pdfDocument: string;
manualDocument: string;
warrantyDocument: string;
openDocument: string;
2026-07-09 01:40:22 +04:00
specificationsEmpty: string;
warrantyTitle: string;
warrantyItem1: string;
warrantyItem2: string;
warrantyItem3: string;
verifiedPurchase: string;
officialSeller: string;
acceptedAnswer: string;
like: string;
dislike: string;
reviewsCountLabel: string;
previous: string;
next: string;
pageOf: string;
2026-07-05 01:36:21 +04:00
};
2026-02-26 23:09:20 +04:00
subcategories: {
loading: string;
retry: string;
emptyTitle: string;
emptyDesc: string;
goHome: string;
2026-03-24 00:09:11 +04:00
itemsInCategory: string;
2026-07-05 01:09:55 +04:00
childrenCount: string;
productsCount: string;
includesProducts: string;
2026-02-26 23:09:20 +04:00
};
itemDetail: {
loading: string;
loadingDexar: string;
back: string;
backHome: string;
noImage: string;
stock: string;
inStock: string;
lowStock: string;
lastItems: string;
mediumStock: string;
addToCart: string;
description: string;
specifications: string;
2026-02-26 23:09:20 +04:00
reviews: string;
yourReview: string;
leaveReview: string;
rating: string;
reviewPlaceholder: string;
reviewPlaceholderDexar: string;
anonymous: string;
submitting: string;
submit: string;
reviewSuccess: string;
reviewError: string;
defaultUser: string;
defaultUserDexar: string;
noReviews: string;
qna: string;
photo: string;
reviewsCount: string;
today: string;
yesterday: string;
daysAgo: string;
weeksAgo: string;
2026-03-24 00:09:11 +04:00
colour: string;
size: string;
2026-07-05 01:07:53 +04:00
relatedProducts: string;
2026-02-26 23:09:20 +04:00
};
app: {
connecting: string;
serverUnavailable: string;
serverError: string;
retryConnection: string;
pageTitle: string;
};
platform: {
loadingPage: string;
emptyConfig: string;
};
backoffice: {
title: string;
subtitle: string;
loading: string;
products: string;
categories: string;
otherDomains: string;
sku: string;
titleColumn: string;
price: string;
status: string;
itemsCount: string;
orders: string;
customers: string;
inventory: string;
media: string;
settings: string;
notAvailable: string;
};
builder: {
title: string;
subtitle: string;
2026-07-10 13:43:53 +04:00
general: string;
branding: string;
2026-07-10 13:43:53 +04:00
theme: string;
header: string;
footer: string;
homepage: string;
widgets: string;
2026-07-10 13:52:01 +04:00
staticPages: string;
2026-07-10 13:43:53 +04:00
marketplaceFeatures: string;
preview: string;
brandName: string;
2026-07-10 13:43:53 +04:00
marketplaceName: string;
domain: string;
descriptionLabel: string;
defaultLanguage: string;
supportedLanguages: string;
logo: string;
smallLogo: string;
favicon: string;
socialImage: string;
gallery: string;
addGalleryImage: string;
headerLayout: string;
headerLayoutDefault: string;
headerLayoutCentered: string;
headerSticky: string;
2026-07-10 13:43:53 +04:00
marketplaceTitle: string;
primaryColor: string;
secondaryColor: string;
backgroundColor: string;
surfaceColor: string;
textColor: string;
successColor: string;
warningColor: string;
dangerColor: string;
showLogo: string;
showSearch: string;
showCategories: string;
showLanguages: string;
showCart: string;
showProfile: string;
showWishlist: string;
showCompare: string;
showRegion: string;
companyName: string;
address: string;
phone: string;
email: string;
copyright: string;
paymentIcons: string;
socialLinks: string;
footerLogo: string;
addPaymentIcon: string;
removePaymentIcon: string;
iconAltLabel: string;
addSocialLink: string;
removeSocialLink: string;
socialLinkLabel: string;
socialLinkUrl: string;
invalidUrl: string;
2026-07-10 13:52:01 +04:00
createPage: string;
deletePage: string;
pageId: string;
slug: string;
iconLabel: string;
showInFooter: string;
showInHeader: string;
showInSitemap: string;
requiresAuthentication: string;
footerGroup: string;
orderLabel: string;
translationTitle: string;
htmlPreview: string;
seoSection: string;
seoTitle: string;
seoDescription: string;
seoKeywords: string;
seoCanonical: string;
seoOgTitle: string;
seoOgDescription: string;
seoOgImage: string;
2026-07-10 13:43:53 +04:00
visible: string;
layoutLabel: string;
columns: string;
height: string;
overlay: string;
autoplay: string;
cardsPerRow: string;
filtersLabel: string;
showBadges: string;
showRating: string;
showPrice: string;
widgetJson: string;
reviews: string;
questions: string;
comments: string;
recommendations: string;
recentlyViewed: string;
searchSuggestions: string;
searchHistory: string;
livePreview: string;
previewChangesTitle: string;
previewNoIssues: string;
previewNoChanges: string;
previewChangeField: string;
previewChangeBefore: string;
previewChangeAfter: string;
languagesTab: string;
addLanguage: string;
removeLanguage: string;
setDefaultLanguage: string;
defaultLanguageLabel: string;
navigationTab: string;
navigationHeader: string;
navigationFooter: string;
navigationFooterGrouped: string;
addLink: string;
insertPageLink: string;
linkedToPage: string;
removeLink: string;
linkLabel: string;
linkUrl: string;
2026-07-10 13:43:53 +04:00
exportBootstrap: string;
importBootstrap: string;
exportedBootstrap: string;
importSource: string;
importError: string;
featureFlags: string;
validationMissingLogo: string;
validationNoLanguages: string;
validationDefaultLocaleNotSupported: string;
validationInvalidUrl: string;
validationDuplicateSlugs: string;
validationEmptyHomepage: string;
validationMissingWidget: string;
validationDuplicateNavLinks: string;
validationInvalidColors: string;
validationMissingTranslations: string;
validationInvalidLayouts: string;
validationInvalidJson: string;
validationInvalidCss: string;
validationDuplicateRoutes: string;
validationInvalidWidgetConfig: string;
validationInvalidContactEmail: string;
validationInvalidSocialLinkUrl: string;
validationIncompletePaymentIcon: string;
undo: string;
redo: string;
statusDraft: string;
statusPublished: string;
unsavedChanges: string;
save: string;
publish: string;
confirmLeaveUnsaved: string;
promptLinkUrl: string;
promptImageUrl: string;
promptEmbedUrl: string;
htmlEditorInvalidHtml: string;
htmlEditorCode: string;
htmlEditorPreview: string;
lastSaved: string;
draftRestored: string;
dismiss: string;
resetDraft: string;
resetSection: string;
confirmResetDraft: string;
confirmResetSection: string;
marketplaceNameDesc: string;
domainDesc: string;
descriptionFieldDesc: string;
defaultLanguageDesc: string;
supportedLanguagesDesc: string;
logoDesc: string;
smallLogoDesc: string;
faviconDesc: string;
socialImageDesc: string;
galleryDesc: string;
headerLayoutDesc: string;
headerStickyDesc: string;
marketplaceTitleDesc: string;
primaryColorDesc: string;
secondaryColorDesc: string;
backgroundColorDesc: string;
surfaceColorDesc: string;
textColorDesc: string;
successColorDesc: string;
warningColorDesc: string;
dangerColorDesc: string;
themeModeLabel: string;
themeModeDesc: string;
themeModeLight: string;
themeModeLightDesc: string;
themeModeDark: string;
themeModeDarkDesc: string;
themeModeSystem: string;
themeModeSystemDesc: string;
siteLayoutLabel: string;
siteLayoutDesc: string;
siteLayoutDefault: string;
siteLayoutDefaultDesc: string;
siteLayoutSidebarLeft: string;
siteLayoutSidebarLeftDesc: string;
siteLayoutCarouselHome: string;
siteLayoutCarouselHomeDesc: string;
siteLayoutMinimal: string;
siteLayoutMinimalDesc: string;
showLogoDesc: string;
showSearchDesc: string;
showCategoriesDesc: string;
showLanguagesDesc: string;
showCartDesc: string;
showProfileDesc: string;
showWishlistDesc: string;
showCompareDesc: string;
showRegionDesc: string;
companyNameDesc: string;
addressDesc: string;
phoneDesc: string;
emailDesc: string;
copyrightDesc: string;
paymentIconsDesc: string;
socialLinksDesc: string;
footerLogoDesc: string;
iconAltLabelDesc: string;
socialLinkUrlDesc: string;
staticPagesFieldDesc: string;
sectionVisibleDesc: string;
layoutStrategyLabel: string;
layoutStrategyDesc: string;
layoutStrategyStack: string;
layoutStrategyStackDesc: string;
layoutStrategyGrid: string;
layoutStrategyGridDesc: string;
layoutStrategyHero: string;
layoutStrategyHeroDesc: string;
layoutStrategyCarousel: string;
layoutStrategyCarouselDesc: string;
layoutStrategySplit: string;
layoutStrategySplitDesc: string;
sectionColumnsDesc: string;
widgetLayoutDesc: string;
widgetHeightDesc: string;
widgetOverlayDesc: string;
widgetAutoplayDesc: string;
widgetColumnsDesc: string;
widgetCardsPerRowDesc: string;
widgetFiltersDesc: string;
widgetShowBadgesDesc: string;
widgetShowRatingDesc: string;
widgetShowPriceDesc: string;
widgetJsonDesc: string;
widgetJsonInvalid: string;
wishlistFeatureDesc: string;
compareFeatureDesc: string;
reviewsFeatureDesc: string;
questionsFeatureDesc: string;
commentsFeatureDesc: string;
recommendationsFeatureDesc: string;
recentlyViewedFeatureDesc: string;
searchSuggestionsDesc: string;
searchHistoryDesc: string;
catalogNavigationModeLabel: string;
catalogNavigationModeDesc: string;
catalogNavDefault: string;
catalogNavDefaultDesc: string;
catalogNavLeftCategory: string;
catalogNavLeftCategoryDesc: string;
catalogNavMegaCategory: string;
catalogNavMegaCategoryDesc: string;
catalogNavTopCarousel: string;
catalogNavTopCarouselDesc: string;
newLanguageDesc: string;
languageAlreadyAdded: string;
languagesTabDesc: string;
linkLabelDesc: string;
linkUrlDesc: string;
linkVisibleDesc: string;
feat(builder): redesign marketplace builder experience and navigation Renamed the experience consistently to Marketplace Builder everywhere visible (page title/subtitle, breadcrumbs, sidebar, dashboard quick action/shortcut copy) - internal ProjectEditor class/selector names kept as-is to avoid regressions. builder.title/subtitle no longer say 'bootstrap-config editing surface' to end users. New business-oriented IA (builder-groups.model.ts): 12 existing ProjectEditorSectionIds regrouped into 8 groups (Marketplace, Branding and Design, Homepage, Content, Languages, Marketplace Features, Navigation and Search, Preview) - every existing section mapped to exactly one group, none dropped, no group points at a page that doesn't exist. New Builder landing page at /edit (was a redirect straight into the General form): readiness percent, recommended next step, one overview card per group (purpose + real complete/in-progress/not-started/unknown status, icon+text never color-alone), a Marketplace Readiness checklist, quick links. All derived from real facade/schema signals (required-field fill state, modifiedSections, staticPages, catalog counts via BackofficeDataService) or explicitly marked unknown (the "preview reviewed" check has no tracking - shown as unknown, never guessed). Section pages (/edit/:section) now share one consistent header: breadcrumb (Builder > Group > Section), draft/published + modified badges, and a contextual help panel (what is this / where visible / what happens if you skip it) sourced per group. Sidebar nav rewritten as grouped, icon-led sections with per-section and per-group status indicators; layout converted from a top pill-tab bar to a responsive sidebar (desktop 280px, tablet 72px icon rail, mobile drawer with Escape-to-close), matching the Sprint 1 admin shell pattern. Section form components themselves untouched. Routes: 'edit' is now its own landing route instead of redirecting to 'edit/general'; /builder and /project-editor redirect to 'edit'. Sprint 1/2 destinations that pointed at edit/general now point at the new edit landing page. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 09:43:03 +04:00
appName: string;
breadcrumbRoot: string;
statusComplete: string;
statusInProgress: string;
statusNotStarted: string;
statusUnknown: string;
draftBadge: string;
publishedBadge: string;
modifiedBadge: string;
helpToggleShow: string;
helpToggleHide: string;
helpWhatIsThis: string;
helpWhySkip: string;
helpWhereVisible: string;
helpWhatIfSkip: string;
helpWhenReturn: string;
openSidebar: string;
closeSidebar: string;
overviewTitle: string;
overviewSubtitle: string;
overviewReadinessLabel: string;
overviewReadinessHint: string;
overviewNextStepLabel: string;
overviewNextStepFallback: string;
overviewQuickLinksTitle: string;
overviewSectionsTitle: string;
overviewOpenSection: string;
overviewReadinessTitle: string;
readinessLogoUploaded: string;
readinessHomepageConfigured: string;
readinessThemeConfigured: string;
readinessLanguagesConfigured: string;
readinessContentPagesAdded: string;
readinessPreviewReviewed: string;
readinessPublished: string;
readinessCategoriesExist: string;
readinessProductsExist: string;
groupMarketplaceLabel: string;
groupMarketplaceDescription: string;
groupMarketplacePurpose: string;
groupMarketplaceWhere: string;
groupMarketplaceSkip: string;
groupBrandingLabel: string;
groupBrandingDescription: string;
groupBrandingPurpose: string;
groupBrandingWhere: string;
groupBrandingSkip: string;
groupHomepageLabel: string;
groupHomepageDescription: string;
groupHomepagePurpose: string;
groupHomepageWhere: string;
groupHomepageSkip: string;
groupContentLabel: string;
groupContentDescription: string;
groupContentPurpose: string;
groupContentWhere: string;
groupContentSkip: string;
groupLanguagesLabel: string;
groupLanguagesDescription: string;
groupLanguagesPurpose: string;
groupLanguagesWhere: string;
groupLanguagesSkip: string;
groupFeaturesLabel: string;
groupFeaturesDescription: string;
groupFeaturesPurpose: string;
groupFeaturesWhere: string;
groupFeaturesSkip: string;
groupNavigationLabel: string;
groupNavigationDescription: string;
groupNavigationPurpose: string;
groupNavigationWhere: string;
groupNavigationSkip: string;
groupPreviewLabel: string;
groupPreviewDescription: string;
groupPreviewPurpose: string;
groupPreviewWhere: string;
groupPreviewSkip: string;
feat(builder): implement professional brand management experience New BrandOverviewComponent, mounted at the top of the existing Branding section page (no route/schema/business-logic changes): - Completion ring + recommended next step + last-modified timestamp, computed from real facade signals (branding.logoUrl/faviconUrl/ socialImageUrl, theme.palette, theme.typography, lastSavedAt) - nothing fabricated. - Brand Health checklist (6 items: logo, favicon, colors, typography, social image, accessibility) - icon+text, never color alone. - Color palette preview: 10 swatches from the real ThemePaletteConfig (primary/secondary/accent/success/warning/danger/backgrounds/text/ border), each with a readable label. - Real WCAG contrast check (contrast.util.ts, relative-luminance formula) between configured text and background colors - shows an inline warning when below 4.5:1, never blocks publishing. - Typography live preview using the configured heading/body font families and base size. - Social share preview card (Open Graph-style) using the existing socialImageUrl + seo.default.title/description, with an explicit empty state when no image is set yet. Scope cut from the full brief given this session's cost already well over budget entering this sprint - see Known limitations in the final report (no multi-variant logo/favicon management, no live responsive device preview, no new media library/asset picker; all reuse the existing single-logo/single-favicon fields and image-field upload component as-is). Could not verify live in-browser this sprint: port 4200 is held by another chat's dev server. Verified via `tsc --noEmit` (clean) and manual template/binding review only; one binding (`--pct` custom- property style binding) was replaced with a plain computed string to remove an unverifiable risk rather than ship it unverified. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 10:13:35 +04:00
brandOverviewTitle: string;
brandOverviewSubtitle: string;
brandOverviewComplete: string;
brandLastModified: string;
brandFaviconUploaded: string;
brandColorsSelected: string;
brandTypographyConfigured: string;
brandSocialImageUploaded: string;
brandAccessibilityPassed: string;
brandColorsPreviewTitle: string;
brandTypographyPreviewTitle: string;
brandSocialPreviewTitle: string;
brandTypeSampleHeading: string;
brandTypeSampleBody: string;
brandContrastWarning: string;
brandSocialEmpty: string;
brandAccentColor: string;
brandBorderColor: string;
homepageOverviewTitle: string;
homepageOverviewSubtitle: string;
homepageOverviewComplete: string;
homepageActiveSections: string;
homepageDisabledSections: string;
homepageHealthHero: string;
homepageHealthCategories: string;
homepageHealthProducts: string;
homepageHealthPromotion: string;
homepageHealthNewsletter: string;
homepageHealthAnySections: string;
widgetTypeHero: string;
widgetTypeCategories: string;
widgetTypeProducts: string;
widgetHidden: string;
widgetVisible: string;
widgetMoveUp: string;
widgetMoveDown: string;
widgetDuplicate: string;
widgetRemove: string;
widgetRemoveConfirm: string;
widgetAdvancedSettings: string;
};
dashboard: {
title: string;
subtitle: string;
cardMarketplaceStatus: string;
cardProjectName: string;
cardCurrentTheme: string;
cardLanguages: string;
cardCategoriesCount: string;
cardProductsCount: string;
cardOrders: string;
cardRevenue: string;
cardLastPublish: string;
cardLastDraftSave: string;
cardBootstrapVersion: string;
cardActiveLayout: string;
cardEnabledWidgets: string;
stateLoading: string;
stateEmpty: string;
stateError: string;
statePendingBackend: string;
never: string;
quickActionsTitle: string;
actionEditProject: string;
actionCategories: string;
actionProducts: string;
actionStaticPages: string;
actionTransactions: string;
actionOrders: string;
actionMediaLibrary: string;
actionUsers: string;
actionMonitoring: string;
actionAnalytics: string;
actionPreviewMarketplace: string;
activityTitle: string;
activityEmpty: string;
activityDraftSaved: string;
activityPublished: string;
healthTitle: string;
healthAllClear: string;
healthBootstrapValid: string;
healthConfigurationValid: string;
healthMissingTranslations: string;
healthInvalidColors: string;
healthInvalidWidgetReferences: string;
healthInvalidLayouts: string;
comingSoonTitle: string;
comingSoonDescription: string;
backToDashboard: string;
feat(admin): redesign dashboard into professional SaaS homepage Replaced the placeholder dashboard with a real business homepage built on 6 new reusable widget components (DashboardSection, DashboardCard, DashboardMetric, DashboardStatusRow, DashboardTimeline, DashboardShortcutCard), all wired through shared app-card/app-skeleton/ app-empty-state. Sections: Welcome (tenant, env badge, current user, last publish/save - all real facade signals, never blank), Quick Actions (large cards: add product, create category, open builder, edit homepage, media, orders), Draft Status (real dirty/modifiedFields/publish/discard from ProjectEditorFacade), Marketplace Health (9 checks - config, product/ category counts, missing translations, draft, static-pages-unpublished, homepage/theme configured, all real; images-without-alt shown as 'not tracked yet' rather than fabricated), Recent Activity (existing localStorage-backed history service, loading/empty states), Useful Shortcuts, Documentation (honest coming-soon list, no dead links). 12-column responsive grid: 3-across cards on desktop, 2-column on tablet, single column on mobile, no horizontal scroll. Keyboard/focus/ ARIA per shortcut card and status row; health status never conveyed by color alone (icon + text every time). AdminDashboardHealthCheck (boolean 'healthy' shape) and its facade signal are untouched - AdminMonitoringPageComponent also consumes them. New richer status data lives in a separate homeHealthChecks signal/ AdminDashboardHomeHealthCheck type instead of widening the shared one. Added ~50 new dashboard.* / kept existing i18n strings across ru/en/hy; no raw keys. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 08:59:29 +04:00
welcomeEyebrow: string;
welcomeFallbackTenant: string;
envProduction: string;
envDevelopment: string;
factCurrentUser: string;
factTenant: string;
quickActionsDescription: string;
actionAddProduct: string;
actionAddProductDescription: string;
actionCreateCategory: string;
actionCreateCategoryDescription: string;
actionEditProjectDescription: string;
actionEditHomepage: string;
actionEditHomepageDescription: string;
actionMediaLibraryDescription: string;
actionOrdersDescription: string;
draftStatusTitle: string;
draftStatusHasChanges: string;
draftStatusAllPublished: string;
draftStatusMoreFields: string;
draftOpenBuilder: string;
draftPublish: string;
draftDiscard: string;
healthProductsCount: string;
healthCategoriesCount: string;
healthDraftExists: string;
healthImagesWithoutAlt: string;
healthStaticPagesUnpublished: string;
healthHomepageConfigured: string;
healthThemeConfigured: string;
statusHealthy: string;
statusAttention: string;
statusUnhealthy: string;
statusUnknown: string;
activityEmptyHint: string;
activityUnavailable: string;
activityUnavailableHint: string;
activityErrorHint: string;
shortcutsTitle: string;
shortcutsDescription: string;
shortcutMarketplaceBuilder: string;
shortcutSettings: string;
shortcutContent: string;
docTitle: string;
docDocumentation: string;
docKeyboardShortcuts: string;
docReportIssue: string;
docReleaseNotes: string;
};
2026-07-10 13:52:01 +04:00
staticPages: {
notFound: string;
backHome: string;
duplicateSlug: string;
emptyTitle: string;
feat(static-pages): CRUD completion + search/filter/bulk actions Milestone 2 of the Static Pages Module sprint. - StaticPagesEditorComponent: duplicate page, confirm-before-delete/bulk- delete (matches the resetDraft confirm pattern), route/enabled/customTemplate/ media(hero/thumbnail/gallery) fields wired into the card, per-page publish/ unpublish action, status + duplicate-route/invalid-html/invalid-seo badges. - Search (id/slug/route/title across all locales), filter by status (draft/published) and by locale (hides pages missing a translation for the selected locale) - all local computed() filters, no new service. - Bulk selection (per-row + select-all-visible checkboxes) with bulk delete/ enable/disable/publish/unpublish, one updateBootstrap() call each. - Correctness note: introduced `allPages` (unfiltered) vs `pages` (filtered view) computeds. Every mutation (create/duplicate/delete/move/bulk) reads from allPages(), never the filtered pages() - reading from the filtered view would have silently deleted whatever an active search/filter hid on the next persist(). Documented inline on persist() as a guardrail for future edits. - Fixed a template compile error found by the build gate: Angular templates don't support inline arrow functions in binding expressions ((ngModelChange)="...map(v => v.trim())..." failed to parse) - moved the gallery CSV-parsing into a component method (updateGallery). - SEO robots field added to the page card (validated against a known-token set from M1). - i18n: staticPages.* extended (search/filter/bulk/route/enabled/status/ media/robots/disabled labels) across the interface + en/ru/hy. Gate: tsc --noEmit, npm test (57/57), arch:check, build all green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:55:21 +04:00
duplicateRoute: string;
invalidHtml: string;
invalidSeo: string;
searchPlaceholder: string;
filterAll: string;
filterAllLocales: string;
confirmDeletePage: string;
confirmBulkDelete: string;
duplicatePage: string;
selectAll: string;
selectedCount: string;
bulkDelete: string;
bulkEnable: string;
bulkDisable: string;
bulkPublishAction: string;
bulkUnpublish: string;
routeLabel: string;
enabledLabel: string;
statusLabel: string;
publishPageAction: string;
unpublishPageAction: string;
heroImageLabel: string;
thumbnailLabel: string;
galleryLabel: string;
customTemplateLabel: string;
seoRobotsLabel: string;
disabledBadge: string;
previewDesktop: string;
previewTablet: string;
previewMobile: string;
previewToggle: string;
2026-07-10 13:52:01 +04:00
};
widgets: {
unavailable: string;
};
2026-02-26 23:09:20 +04:00
carousel: {
loading: string;
addToCart: string;
};
common: {
retry: string;
loading: string;
remove: string;
2026-02-26 23:09:20 +04:00
};
2026-02-28 17:18:24 +04:00
location: {
allRegions: string;
chooseRegion: string;
detectAuto: string;
};
auth: {
loginRequired: string;
loginDescription: string;
checking: string;
loginWithTelegram: string;
orScanQr: string;
loginNote: string;
2026-03-25 15:32:50 +04:00
qrExpired: string;
2026-06-01 00:47:26 +04:00
qrError: string;
2026-02-28 17:18:24 +04:00
};
ux: {
items: string;
wishlistTitle: string;
wishlistEmptyTitle: string;
wishlistEmptyDescription: string;
clearWishlist: string;
wishlistCleared: string;
compareTitle: string;
compareEmptyTitle: string;
compareEmptyDescription: string;
clearCompare: string;
hideIdentical: string;
highlightDifferences: string;
clearRecentlyViewed: string;
recentlyViewedEmpty: string;
saveSearch: string;
goToCatalog: string;
2026-07-09 01:40:22 +04:00
wishlistAdded: string;
wishlistRemoved: string;
compareAdded: string;
compareRemoved: string;
compareLimitReached: string;
productShared: string;
productLinkCopied: string;
sharingUnsupported: string;
addedToCart: string;
2026-07-09 01:40:22 +04:00
enterQueryBeforeSave: string;
savedSearchNamed: string;
recentlyViewedTitle: string;
compareAttribute: string;
comparePrice: string;
compareRating: string;
compareStock: string;
compareDiscount: string;
compareColor: string;
compareSize: string;
compareUnknown: string;
};
2026-07-10 13:34:25 +04:00
diagnostics: {
title: string;
disabledTitle: string;
disabledDescription: string;
generatedAt: string;
healthScore: string;
summary: string;
passedChecks: string;
warnings: string;
errors: string;
critical: string;
healthChecks: string;
results: string;
noIssues: string;
ok: string;
failed: string;
affectedComponent: string;
suggestedResolution: string;
severity: {
info: string;
warning: string;
error: string;
critical: string;
};
checks: {
bootstrapLoaded: string;
tenantResolved: string;
runtimeInitialized: string;
themeLoaded: string;
widgetManifestLoaded: string;
sectionEngineInitialized: string;
configurationEngineInitialized: string;
translationResourcesAvailable: string;
requiredAssetsAvailable: string;
};
bootstrapMissingTitle: string;
bootstrapMissingDescription: string;
bootstrapMissingResolution: string;
requiredPropertyMissingTitle: string;
requiredPropertyMissingDescription: string;
requiredPropertyMissingResolution: string;
unknownWidgetTypeTitle: string;
unknownWidgetTypeDescription: string;
unknownWidgetTypeResolution: string;
duplicateIdTitle: string;
duplicatePageIdDescription: string;
duplicateSectionIdDescription: string;
duplicateWidgetIdDescription: string;
duplicateIdResolution: string;
unknownLayoutTitle: string;
unknownLayoutDescription: string;
unknownLayoutResolution: string;
invalidFeatureFlagTitle: string;
invalidFeatureFlagDescription: string;
invalidFeatureFlagResolution: string;
brokenPageDefinitionTitle: string;
brokenPageDefinitionDescription: string;
brokenPageDefinitionResolution: string;
invalidNavigationTargetTitle: string;
invalidNavigationTargetDescription: string;
invalidNavigationTargetResolution: string;
missingTranslationTitle: string;
missingTranslationDescription: string;
missingTranslationResolution: string;
missingMediaTitle: string;
missingMediaDescription: string;
missingMediaResolution: string;
runtimeNotInitializedTitle: string;
runtimeNotInitializedDescription: string;
runtimeNotInitializedResolution: string;
configFallbackUsageTitle: string;
configFallbackUsageDescription: string;
configFallbackUsageResolution: string;
missingDatasourceTitle: string;
missingDatasourceDescription: string;
missingDatasourceResolution: string;
widgetRenderFailureTitle: string;
widgetRenderFailureDescription: string;
widgetRenderFailureResolution: string;
brokenRouteTitle: string;
brokenRouteDescription: string;
brokenRouteResolution: string;
imageLoadFailedTitle: string;
imageLoadFailedDescription: string;
imageLoadFailedResolution: string;
optionalDataMissingTitle: string;
optionalDataMissingDescription: string;
optionalDataMissingResolution: string;
};
mediaLibrary: {
title: string;
upload: string;
uploading: string;
searchPlaceholder: string;
delete: string;
deleteConfirmTitle: string;
deleteConfirmBody: string;
cancel: string;
confirm: string;
emptyTitle: string;
emptyDescription: string;
};
// Sprint 28: only the new empty-state copy this sprint's skeleton/empty-
// state consistency fix introduces - NOT the full adminProducts/
// adminUsers/adminMonitoring/adminAnalytics translation surface, which is
// still missing entirely (see docs/KNOWN-ISSUES.md, deferred to Sprint 29).
fix(static-pages): backfill enabled/status in export, fix missing i18n key Independent review pass over the Static Pages Module sprint (M1-M7), including live browser E2E per the task's own verification checklist. - ProjectEditorFacade.normalize() now backfills enabled/status on record-format static pages (defaulting missing values to enabled+published, same rule ContentPageService.normalizePage applies for display - mirrored rather than imported, to avoid a project-editor <-> content-management circular dependency since ContentManagementFacade already depends on this facade). Found live: exporting a page that predates this sprint and was never touched/re-saved in the current session produced JSON missing enabled/status entirely - the editor UI and storefront resolver both normalize-on-read so nothing was actually broken live, but Export/Import fidelity should match what the editor shows. Verified fixed live (export now includes "enabled":true,"status":"published" for an untouched legacy page) and via the full gate. - Added the missing adminCategories.chooseImage i18n key (interface + en/ru/hy). Found live: the media-picker "choose image" button rendered as the literal string "adminCategories.chooseImage" - a pre-existing, repo-wide bug (5 templates reference this key; none of the locale files ever defined it) that I propagated into a 3rd/4th/5th... well, 2 new occurrences by copying the existing branding-section/footer-section pattern into static-pages-editor. Fixed the actual defect (missing translation) rather than renaming the key, which would have required touching 2 unrelated admin components outside this sprint's scope. Live-verified this pass: Static Pages editor renders with all new fields; create page works (page count 4->confirmed); device preview toggles desktop/tablet/mobile widths correctly; navigation "Insert page link" creates a real type:'staticPage' nav item end-to-end (confirmed in the exported JSON); export includes all Sprint X+2 fields after the fix; no console errors throughout. Gate: tsc --noEmit, npm test (57/57), arch:check, build all green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:27:29 +04:00
// Shared across branding/footer/static-pages/admin-product/admin-category media
// pickers - despite the namespace name, this is a generic "choose image" label,
// not category-specific. Renaming is a separate cleanup outside this sprint's
// scope; the key was previously referenced by 5 templates but never defined
// anywhere, so it rendered as the literal string "adminCategories.chooseImage".
adminCategories: {
chooseImage: string;
replaceImage: string;
fix(static-pages): backfill enabled/status in export, fix missing i18n key Independent review pass over the Static Pages Module sprint (M1-M7), including live browser E2E per the task's own verification checklist. - ProjectEditorFacade.normalize() now backfills enabled/status on record-format static pages (defaulting missing values to enabled+published, same rule ContentPageService.normalizePage applies for display - mirrored rather than imported, to avoid a project-editor <-> content-management circular dependency since ContentManagementFacade already depends on this facade). Found live: exporting a page that predates this sprint and was never touched/re-saved in the current session produced JSON missing enabled/status entirely - the editor UI and storefront resolver both normalize-on-read so nothing was actually broken live, but Export/Import fidelity should match what the editor shows. Verified fixed live (export now includes "enabled":true,"status":"published" for an untouched legacy page) and via the full gate. - Added the missing adminCategories.chooseImage i18n key (interface + en/ru/hy). Found live: the media-picker "choose image" button rendered as the literal string "adminCategories.chooseImage" - a pre-existing, repo-wide bug (5 templates reference this key; none of the locale files ever defined it) that I propagated into a 3rd/4th/5th... well, 2 new occurrences by copying the existing branding-section/footer-section pattern into static-pages-editor. Fixed the actual defect (missing translation) rather than renaming the key, which would have required touching 2 unrelated admin components outside this sprint's scope. Live-verified this pass: Static Pages editor renders with all new fields; create page works (page count 4->confirmed); device preview toggles desktop/tablet/mobile widths correctly; navigation "Insert page link" creates a real type:'staticPage' nav item end-to-end (confirmed in the exported JSON); export includes all Sprint X+2 fields after the fix; no console errors throughout. Gate: tsc --noEmit, npm test (57/57), arch:check, build all green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 11:27:29 +04:00
};
adminProducts: {
emptyTitle: string;
emptyDescription: string;
};
adminUsers: {
emptyTitle: string;
emptyDescription: string;
invitationsEmptyTitle: string;
};
adminMonitoring: {
eventsEmptyTitle: string;
eventsEmptyDescription: string;
};
adminAnalytics: {
topProductsEmptyTitle: string;
topProductsEmptyDescription: string;
};
adminShell: {
skipToContent: string;
openSidebar: string;
closeSidebar: string;
collapseSidebar: string;
expandSidebar: string;
nav: {
dashboard: string;
catalogGroup: string;
products: string;
categories: string;
orders: string;
transactions: string;
reviews: string;
reports: string;
content: string;
mediaLibrary: string;
marketplaceBuilder: string;
users: string;
settings: string;
monitoring: string;
analytics: string;
documentation: string;
help: string;
logout: string;
comingSoonBadge: string;
};
topbar: {
searchLabel: string;
searchPlaceholder: string;
notifications: string;
notificationsEmpty: string;
account: string;
tenantSelector: string;
tenantSelectorComingSoon: string;
quickPublish: string;
quickPublishComingSoon: string;
};
breadcrumbHome: string;
pages: {
dashboard: { title: string; description: string };
products: { title: string; description: string };
productCreate: { title: string; description: string };
productEdit: { title: string; description: string };
productDuplicate: { title: string; description: string };
categories: { title: string; description: string };
categoryCreate: { title: string; description: string };
categoryEdit: { title: string; description: string };
orders: { title: string; description: string };
orderDetail: { title: string; description: string };
transactions: { title: string; description: string };
media: { title: string; description: string };
users: { title: string; description: string };
monitoring: { title: string; description: string };
analytics: { title: string; description: string };
};
};
2026-02-26 23:09:20 +04:00
}