2026-03-25 15:32:50 +04:00
import { Translations } from './translations' ;
2026-02-26 23:09:20 +04:00
export const hy : Translations = {
header : {
2026-03-24 00:09:11 +04:00
home : 'Գլխավոր' ,
search : 'Որոնում' ,
about : 'Մեր մասին' ,
contacts : 'Կապ' ,
searchPlaceholder : 'Փնտրել...' ,
catalog : 'Կատալոգ' ,
2026-07-09 01:13:54 +04:00
wishlist : 'Ընտրյալ' ,
compare : 'Համեմատում' ,
2026-07-09 02:29:12 +04:00
openMenu : 'Բացել մենյուն' ,
closeMenu : 'Փակել մենյուն' ,
2026-02-26 23:09:20 +04:00
} ,
footer : {
2026-03-24 00:09:11 +04:00
description : 'Ժամանակակից մարքեթփլեյս հարմար գնումների համար' ,
company : 'Ընկերություն' ,
aboutUs : 'Մեր մասին' ,
contacts : 'Կապ' ,
requisites : 'Վճարային տվյալներ' ,
support : 'Աջակցություն' ,
faq : 'ՀՏՀ' ,
delivery : 'Առաքում' ,
guarantee : 'Երաշխիք' ,
legal : 'Իրավական տեղեկատվություն' ,
offer : 'Օֆերտա' ,
privacy : 'Գաղտնիություն' ,
returns : 'Վերադարձ' ,
info : 'Տեղեկատվություն' ,
aboutCompany : 'Ընկերության մասին' ,
documents : 'Փաստաթղթեր' ,
paymentRules : 'Վճարման կանոններ' ,
returnPolicy : 'Վերադարձի քաղաքականություն' ,
publicOffer : 'Հանրային օֆերտա' ,
help : 'Օգնություն' ,
payment : 'Վճարում' ,
allRightsReserved : 'Բոլոր իրավունքները պաշտպանված են։' ,
2026-02-26 23:09:20 +04:00
} ,
home : {
2026-03-24 00:09:11 +04:00
welcomeTo : 'Բարի գալուստ {{brand}}' ,
subtitle : 'Գտեք այն ամենը, ինչ պետք է՝ մեկ վայրում' ,
startSearch : 'Սկսել որոնումը' ,
loading : 'Բեռնում ենք կատեգորիաները...' ,
errorTitle : 'Ինչ-որ բան սխալ գնաց' ,
retry : 'Փորձել կրկին' ,
categoriesTitle : 'Ապրանքների կատեգորիաներ' ,
categoriesSubtitle : 'Ընտրեք ձեզ հետաքրքիր կատեգորիան' ,
categoriesEmpty : 'Կատեգորիաները շուտով կհայտնվեն' ,
categoriesEmptyDesc : 'Մենք աշխատում ենք կատալոգի լրացման վրա' ,
dexarHeroTitle : 'Այստեղ կգտնես ամեն ինչ' ,
dexarHeroSubtitle : 'Հազարավոր ապրանքներ մեկ վայրում' ,
dexarHeroTagline : 'պարզ և հարմար' ,
goToCatalog : 'Գնալ կատալոգ' ,
findProduct : 'Գտնել ապրանք' ,
loadingDexar : 'Կատեգորիաների բեռնում...' ,
catalogTitle : 'Ապրանքների կատալոգ' ,
emptyCategoriesDexar : 'Կատեգորիաները դեռ չկան' ,
categoriesSoonDexar : 'Շուտով այստեղ կհայտնվեն կատեգորիաներ' ,
itemsCount : '{{count}} ապրանք' ,
2026-02-26 23:09:20 +04:00
} ,
cart : {
2026-03-24 00:09:11 +04:00
title : 'Զամբյուղ' ,
clear : 'Մաքրել' ,
empty : 'Զամբյուղը դատարկ է' ,
emptyDesc : 'Ավելացրեք ապրանքներ՝ գնումները սկսելու համար' ,
goShopping : 'Գնալ գնումների' ,
total : 'Ընդամենը' ,
items : 'Ապրանքներ' ,
deliveryLabel : 'Առաքում' ,
2026-06-21 23:13:01 +04:00
deliveryMethod : 'Առաքման տարբերակ' ,
selectDelivery : 'Ընտրեք առաքման տարբերակը' ,
deliveryPlace : 'Վայր' ,
deliveryTime : 'Առաքման ժամկետ' ,
digitalDelivery : 'Թվային առաքում' ,
deliveryRequired : 'Մինչ պատվերը ձևակերպելը ընտրեք առաքումը բոլոր առաքվող ապրանքների համար։' ,
2026-03-24 00:09:11 +04:00
toPay : 'Վճարման ենթակա' ,
agreeWith : 'Ես համաձայն եմ' ,
publicOffer : 'հանրային օֆերտայի' ,
returnPolicy : 'վերադարձի քաղաքականության' ,
guaranteeTerms : 'երաշխիքային պայմանների' ,
privacyPolicy : 'գաղտնիության քաղաքականության' ,
and : 'և' ,
checkout : 'Ձևակերպել պատվերը' ,
2026-06-29 00:06:18 +04:00
payViaQr : 'Վճարել QR-ով' ,
payViaCard : 'Վճարել քարտով' ,
2026-03-24 00:09:11 +04:00
close : 'Փակել' ,
creatingPayment : 'Վճարման ստեղծում...' ,
waitFewSeconds : 'Խնդրում ենք սպասել մի քանի վայրկյան' ,
scanQr : 'Սքանավորեք QR կոդը վճարման համար' ,
amountToPay : 'Վճարման գումար՝' ,
waitingPayment : 'Սպասում ենք վճարմանը...' ,
copied : '✓ Պատճենված է' ,
copyLink : 'Պատճենել հղումը' ,
openNewTab : 'Բացել նոր ներդիրում' ,
paymentSuccess : 'Շնորհավորում ենք! Վճարումը հաջող է անցել!' ,
paymentSuccessDesc : 'Մուտքագրեք ձեր տվյալները, և մենք կուղարկենք գնումը մի քանի րոպեի ընթացքում' ,
sending : 'Ուղարկվում է...' ,
send : 'Ուղարկել' ,
2026-06-02 00:57:36 +04:00
paymentError : 'Չհաջողվեց ստեղծել վճարումը' ,
paymentErrorDesc : 'Այս պահին չհաջողվեց պատրաստել վճարման QR կոդը։ Խնդրում ենք մի փոքր հետո կրկին փորձել։' ,
retryPayment : 'Փորձել կրկին' ,
2026-03-24 00:09:11 +04:00
paymentTimeout : 'Ժամանակը սպառվեց' ,
paymentTimeoutDesc : 'Մենք չստացանք վճարման հաստատում 3 րոպեի ընթացքում։' ,
autoClose : 'Պատուհանը կփակվի ավտոմատ...' ,
confirmClear : 'Վստա՞հ եք, որ ցանկանում եք մաքրել զամբյուղը' ,
2026-07-09 02:29:12 +04:00
removeItem : 'Հեռացնել ապրանքը' ,
2026-07-19 23:39:14 +04:00
increaseQuantity : 'Ավելացնել քանակը' ,
decreaseQuantity : 'Նվազեցնել քանակը' ,
2026-07-09 02:29:12 +04:00
paymentQrAlt : 'Վճարման QR կոդ' ,
2026-03-24 00:09:11 +04:00
acceptTerms : 'Խնդրում ենք ընդունել պայմանները՝ պատվերը հաստատելու համար։' ,
copyError : 'Պատճենման սխալ՝' ,
emailSuccess : 'Email-ը հաջողությամբ ուղարկվեց։ Ստուգեք ձեր փոստը։' ,
emailError : 'Սխալ email ուղարկելիս։ Խնդրում ենք փորձել կրկին։' ,
phoneRequired : 'Հեռախոսահամարը պարտադիր է' ,
phoneMoreDigits : 'Մուտքագրեք ևս {{count}} թիվ' ,
phoneTooMany : 'Չափազանց շատ թվեր' ,
emailRequired : 'Email-ը պարտադիր է' ,
emailTooShort : 'Email-ը չափազանց կարճ է (առնվազն 5 նիշ)' ,
emailTooLong : 'Email-ը չափազանց երկար է (առավելագույնը 100 նիշ)' ,
emailNeedsAt : 'Email-ը պետք է պարունակի @' ,
emailNeedsDomain : 'Email-ը պետք է պարունակի դոմեյն (.com, .ru և այլն)' ,
emailInvalid : 'Սխալ email ձևաչափ' ,
loginRequired : 'Մուտք գործեք ձևակերպելու համար' ,
loginRequiredDesc : 'Պատվեր ձևակերպելու համար մուտք գործեք Telegram-ով' ,
loginWithTelegram : 'Մուտք Telegram-ով' ,
orScanQr : 'Կամ սքանավորեք QR կոդը' ,
2026-02-26 23:09:20 +04:00
} ,
search : {
2026-03-24 00:09:11 +04:00
title : 'Ապրանքների որոնում' ,
placeholder : 'Մուտքագրեք ապրանքի անվանումը...' ,
2026-07-10 13:25:31 +04:00
searchBarAria : 'Որոնման դաշտ' ,
2026-03-24 00:09:11 +04:00
resultsCount : 'Գտնված ապրանքներ՝' ,
searching : 'Որոնում...' ,
retry : 'Փորձել կրկին' ,
noResults : 'Ոչինչ չի գտնվել' ,
noResultsFor : '"{{query}}" հարցմամբ ապրանքներ չեն գտնվել' ,
noResultsHint : 'Փորձեք փոխել հարցումը կամ օգտագործել այլ բանալի բառեր' ,
2026-07-10 13:25:31 +04:00
emptyResultsAria : 'Դատարկ որոնման արդյունքներ' ,
popularCategories : 'Հանրաճանաչ կատեգորիաներ' ,
recommendedProducts : 'Առաջարկվող ապրանքներ' ,
aiSuggestionHint : 'AI առաջարկ (ապագայում)' ,
suggestionType : {
product : 'Ապրանք' ,
category : 'Կատեգորիա' ,
brand : 'Բրենդ' ,
collection : 'Հավաքածու' ,
seller : 'Վաճառող' ,
'static-page' : 'Էջ' ,
ai : 'AI' ,
} ,
2026-03-24 00:09:11 +04:00
addToCart : 'Ավելացնել զամբյուղ' ,
loadingMore : 'Բեռնում...' ,
allLoaded : 'Բոլոր արդյունքները բեռնված են' ,
emptyState : 'Մուտքագրեք հարցում որոնման համար' ,
2026-07-05 01:10:56 +04:00
minLength : 'Որոնման համար մուտքագրեք առնվազն {{count}} նիշ' ,
2026-03-24 00:09:11 +04:00
of : '-ից' ,
2026-02-26 23:09:20 +04:00
} ,
category : {
2026-03-24 00:09:11 +04:00
retry : 'Փորձել կրկին' ,
addToCart : 'Ավելացնել զամբյուղ' ,
loadingMore : 'Բեռնում...' ,
allLoaded : 'Բոլոր ապրանքները բեռնված են' ,
emptyTitle : 'Վա՜յ, այստեղ դեռ դատարկ է' ,
emptyDesc : 'Այս կատեգորիայում դեռ ապրանքներ չկան' ,
goHome : 'Գլխավոր' ,
loading : 'Ապրանքների բեռնում...' ,
2026-02-26 23:09:20 +04:00
} ,
2026-07-05 01:36:21 +04:00
catalog : {
title : 'Կատալոգ' ,
breadcrumb : 'Կատալոգի նավիգացիա' ,
allCategories : 'Բոլոր կատեգորիաները' ,
products : 'Ապրանքներ' ,
loading : 'Կատալոգի բեռնում...' ,
loadingProducts : 'Ապրանքների բեռնում...' ,
errorTitle : 'Կատալոգը հասանելի չէ' ,
error : 'Չհաջողվեց բեռնել կատալոգը։ Փորձեք ավելի ուշ։' ,
retry : 'Փորձել կրկին' ,
categoryHint : 'Ընտրեք կատեգորիա շարունակելու համար' ,
productHint : 'Ապրանքներ այս կատեգորիայում' ,
emptyTitle : 'Այստեղ դեռ դատարկ է' ,
emptyCategories : 'Այս բաժնում դեռ ենթակատեգորիաներ չկան։' ,
emptyProducts : 'Այս կատեգորիայում դեռ ապրանքներ չկան։' ,
addToCart : 'Ավելացնել զամբյուղ' ,
categoriesCount : '{{count}} կատեգորիա' ,
productsCount : '{{count}} ապրանք' ,
2026-07-09 01:40:22 +04:00
entriesCount : '{{count}} տարր' ,
categoryBannerPlaceholder : 'Կատեգորիայի բանները պատրաստ է backend-ից եկող մեդիայի և նկարագրության համար։' ,
navigationPlaceholder : 'Նավիգացիայի դասավորությունը պատրաստ է backend/bootstrap կարգավորումների համար։' ,
removeSavedSearch : 'Ջնջել պահպանված որոնումը' ,
resetFilters : 'Վերակայել' ,
filtersTitle : 'Ֆիլտրեր' ,
2026-07-09 02:57:48 +04:00
from : 'Սկսած' ,
to : 'Մինչև' ,
2026-07-09 01:40:22 +04:00
minValue : 'Նվազ. {{value}}' ,
maxValue : 'Առավել. {{value}}' ,
enabled : 'Միացված' ,
searchPlaceholder : 'Որոնել ապրանքներ, բրենդներ, կատեգորիաներ' ,
searchSubmit : 'Որոնել' ,
2026-07-09 02:29:12 +04:00
clearSearch : 'Մաքրել' ,
2026-07-09 01:40:22 +04:00
suggestionsTitle : 'Առաջարկներ' ,
2026-07-09 02:29:12 +04:00
popularSearchesTitle : 'Հանրաճանաչ որոնումներ' ,
2026-07-09 01:40:22 +04:00
recentSearchesTitle : 'Վերջին որոնումներ' ,
searchHistoryTitle : 'Որոնման պատմություն' ,
clearHistory : 'Մաքրել' ,
searchNoResultsHint : 'Արդյունքներ չկան։ Փորձեք ավելի լայն բանալի բառեր։' ,
2026-07-09 02:29:12 +04:00
searchProductsFound : 'Գտնված ապրանքներ՝ {{total}}' ,
searchResultsSummary : '{{total}} արդյունք "{{query}}" հարցմամբ' ,
2026-07-10 15:55:38 +04:00
loadMore : 'Բեռնել ավելին' ,
2026-07-09 01:40:22 +04:00
sortBy : 'Տեսակավորել ըստ' ,
2026-07-09 01:46:32 +04:00
sortRelevance : 'Առաջարկվող' ,
2026-07-09 01:40:22 +04:00
sortLatest : 'Նորության' ,
sortPriceAsc : 'Գին․ աճման' ,
sortPriceDesc : 'Գին․ նվազման' ,
sortRating : 'Վարկանիշի' ,
sortPopular : 'Հանրաճանաչության' ,
sortDiscount : 'Զեղչի' ,
layoutGrid : 'Ցանց' ,
layoutLargeGrid : 'Մեծ ցանց' ,
layoutCompactGrid : 'Կոմպակտ ցանց' ,
2026-07-10 15:55:38 +04:00
layoutGrid2 : '2 սյուն' ,
layoutGrid3 : '3 սյուն' ,
layoutGrid4 : '4 սյուն' ,
layoutCompact : 'Կոմպակտ' ,
2026-07-09 01:40:22 +04:00
layoutList : 'Ցանկ' ,
noResults : 'Արդյունք չկա' ,
itemsCount : '{{count}} ապրանք' ,
emptyResultsTitle : 'Արդյունքներ չեն գտնվել' ,
emptyResultsDescription : 'Փորձեք փոխել ֆիլտրերը, տեսակավորումը կամ որոնման բառերը։' ,
previousPage : 'Նախորդ' ,
nextPage : 'Հաջորդ' ,
pageOf : 'Էջ {{page}} / {{total}}' ,
2026-07-09 01:46:32 +04:00
emptyCategoryTitle : 'Այս կատեգորիայում դեռ ապրանքներ չկան' ,
emptyCategoryMessage : 'Փորձեք անցնել ծնող կատեգորիաներ կամ վերադառնալ ամբողջ կատալոգ։' ,
2026-07-10 15:55:38 +04:00
goToParentCategory : 'Գնալ ծնող կատեգորիա' ,
2026-07-09 01:46:32 +04:00
browseCategories : 'Դիտել կատեգորիաները' ,
2026-07-10 15:55:38 +04:00
offlineTitle : 'Դուք offline եք' ,
offlineMessage : 'Միացեք ցանցին՝ կատալոգը շարունակելու համար։' ,
2026-07-09 01:46:32 +04:00
noFilterMatchTitle : 'Ձեր ընտրած ֆիլտրերին համապատասխան ապրանքներ չկան։' ,
noFilterMatchMessage : 'Փորձեք ընդլայնել գնի միջակայքը, հատկանիշները կամ բրենդները։' ,
clearFilters : 'Մաքրել ֆիլտրերը' ,
openFilters : 'Բացել ֆիլտրերը' ,
applyFilters : 'Կիրառել' ,
close : 'Փակել' ,
filtersDrawerAria : 'Ֆիլտրերի վահանակ' ,
sortSheetAria : 'Տեսակավորման տարբերակներ' ,
mobileToolbarAria : 'Կատալոգի բջջային գործիքաշար' ,
gridCycle : 'Ցանց' ,
filtersPanelAria : 'Կատալոգի ֆիլտրեր' ,
2026-07-09 01:40:22 +04:00
filterPrice : 'Գին' ,
filterAvailability : 'Առկայություն' ,
filterInStock : 'Առկա է' ,
filterLowStock : 'Քիչ է մնացել' ,
filterOutOfStock : 'Առկա չէ' ,
filterRating : 'Վարկանիշ' ,
filterStars : '{{count}} աստղ' ,
filterBrand : 'Բրենդ' ,
filterCategory : 'Կատեգորիա' ,
filterCategoryValue : 'Կատեգորիա {{value}}' ,
filterSubcategory : 'Ենթակատեգորիա' ,
filterDiscount : 'Զեղչ' ,
filterNew : 'Նոր' ,
filterColor : 'Գույն' ,
filterSize : 'Չափ' ,
filterAttributes : 'Հատկանիշներ' ,
2026-07-19 22:04:13 +04:00
favorite : 'Ավելացնել ընտրյալներում' ,
compare : 'Համեմատել' ,
share : 'Կիսվել' ,
quickView : 'Արագ դիտում' ,
stockHigh : 'Առկա է' ,
stockMedium : 'Սահմանափակ քանակ' ,
stockLow : 'Գրեթե սպառված է' ,
stockOut : 'Առկա չէ' ,
2026-07-09 01:40:22 +04:00
} ,
productDetails : {
loading : 'Ապրանքի բեռնում...' ,
errorTitle : 'Ապրանքը անհասանելի է' ,
retry : 'Փորձել կրկին' ,
missingTitle : 'Ապրանքը չի գտնվել' ,
missingDescription : 'Այս ապրանքը գոյություն չունի կամ այլևս հասանելի չէ։' ,
backToCatalog : 'Վերադառնալ կատալոգ' ,
tabsAria : 'Ապրանքի ներդիրներ' ,
mediaAria : 'Ապրանքի մեդիա' ,
ratingStarsAria : 'Աստղային վարկանիշ' ,
selectRatingAria : 'Ընտրեք գնահատականը' ,
reviewsEmpty : 'Կարծիքներ դեռ չկան։' ,
questionsEmpty : 'Հարցեր դեռ չկան։' ,
askQuestion : 'Տալ հարց' ,
hideQuestionForm : 'Թաքցնել հարցի ձևը' ,
questionFormTitle : 'Տալ հարց' ,
questionFormPlaceholder : 'Հարցրեք չափի, առաքման, համատեղելիության կամ օգտագործման մասին' ,
questionFormAnonymous : 'Հարցնել անանուն' ,
submitQuestion : 'Ուղարկել հարցը' ,
reviewFormTitle : 'Թողնել կարծիք' ,
reviewRatingLabel : 'Գնահատական' ,
reviewTitleLabel : 'Վերնագիր' ,
reviewTitlePlaceholder : 'Կարճ վերնագիր' ,
reviewTextLabel : 'Կարծիք' ,
reviewTextPlaceholder : 'Նկարագրեք ձեր փորձը' ,
reviewAnonymous : 'Ուղարկել անանուն' ,
reviewUploadPlaceholder : 'Լուսանկար վերբեռնելը նախատեսված է հաջորդ սպրինտում։' ,
2026-07-10 13:10:35 +04:00
reviewRatingRequired : 'Խնդրում ենք ընտրել գնահատական։' ,
reviewTextRequired : 'Խնդրում ենք գրել կարծիք։' ,
reviewSuccess : 'Կարծիքը հաջողությամբ ուղարկվեց։' ,
2026-07-09 01:40:22 +04:00
submitReview : 'Ուղարկել կարծիքը' ,
submitting : 'Ուղարկվում է...' ,
2026-07-10 13:10:35 +04:00
loadMore : 'Բեռնել ավելին' ,
showingOf : 'Ցուցադրվում է {{shown}} / {{total}}' ,
questionsSubmissionFuture : 'Հարցի ուղարկումը կարելի է միացնել ավելի ուշ՝ առանց բաղադրիչի փոփոխության։' ,
specificationsGeneral : 'Ընդհանուր' ,
actionsAria : 'Ապրանքի գործողություններ' ,
buyNow : 'Գնել հիմա' ,
wishlist : 'Նախընտրածներ' ,
compare : 'Համեմատել' ,
share : 'Կիսվել' ,
notifyMe : 'Ծանուցել ինձ' ,
zoom : 'Մեծացնել' ,
fullscreen : 'Ամբողջ էկրան' ,
pdfDocument : 'Ապրանքի PDF փաստաթուղթ' ,
manualDocument : 'Ապրանքի ուղեցույց' ,
warrantyDocument : 'Երաշխիքի փաստաթուղթ' ,
openDocument : 'Բացել փաստաթուղթը' ,
2026-07-09 01:40:22 +04:00
specificationsEmpty : 'Բնութագրերը դեռ հասանելի չեն։' ,
warrantyTitle : 'Երաշխիք և վերադարձ' ,
warrantyItem1 : 'Երաշխիքի պայմանները սահմանվում են վաճառողի և տեղական օրենքներով։' ,
warrantyItem2 : 'Վերադարձի իրավունքը կախված է ապրանքի վիճակից և կատեգորիայից։' ,
warrantyItem3 : 'Վերադարձի մանրամասն հրահանգները հասանելի են գնումից հետո։' ,
verifiedPurchase : 'Հաստատված գնում' ,
officialSeller : 'Պաշտոնական վաճառող' ,
acceptedAnswer : 'Ընդունված պատասխան' ,
like : 'Հավանել' ,
dislike : 'Չհավանել' ,
reviewsCountLabel : '{{count}} կարծիք' ,
previous : 'Նախորդ' ,
next : 'Հաջորդ' ,
pageOf : 'Էջ {{page}} / {{total}}' ,
2026-07-05 01:36:21 +04:00
} ,
2026-02-26 23:09:20 +04:00
subcategories : {
2026-03-24 00:09:11 +04:00
loading : 'Ենթակատեգորիաների բեռնում...' ,
retry : 'Փորձել կրկին' ,
emptyTitle : 'Ենթակատեգորիաներ չկան' ,
emptyDesc : 'Այս բաժնում դեռ ենթակատեգորիաներ չկան' ,
goHome : 'Գլխավոր' ,
itemsInCategory : 'Ապրանքներ այս կատեգորիայում' ,
2026-07-05 01:09:55 +04:00
childrenCount : '{{count}} կատեգորիա' ,
productsCount : '{{count}} ապրանք' ,
includesProducts : 'Կան ապրանքներ' ,
2026-02-26 23:09:20 +04:00
} ,
itemDetail : {
2026-03-24 00:09:11 +04:00
loading : 'Բեռնում...' ,
loadingDexar : 'Ապրանքի բեռնում...' ,
back : 'Վերադառնալ' ,
backHome : 'Վերադառնալ գլխավոր էջ' ,
noImage : 'Պատկեր չկա' ,
stock : 'Առկայություն՝' ,
inStock : 'Առկա է' ,
lowStock : 'Քիչ է մնացել' ,
lastItems : 'Վերջին հատերը' ,
mediumStock : 'Ավարտվում է' ,
addToCart : 'Ավելացնել զամբյուղ' ,
description : 'Նկարագրություն' ,
specifications : 'Բնութագրեր' ,
reviews : 'Կարծիքներ' ,
yourReview : 'Ձեր կարծիքը' ,
leaveReview : 'Թողնել կարծիք' ,
rating : 'Գնահատական՝' ,
reviewPlaceholder : 'Կիսվեք ձեր կարծիքով...' ,
reviewPlaceholderDexar : 'Կիսվեք տպավորություններով...' ,
anonymous : 'Անանուն' ,
submitting : 'Ուղարկվում է...' ,
submit : 'Ուղարկել' ,
reviewSuccess : 'Շնորհակալություն ձեր կարծիքի համար!' ,
reviewError : 'Սխալ ուղարկելիս։ Փորձեք ավելի ուշ։' ,
defaultUser : 'Օգտատեր' ,
defaultUserDexar : 'Անանուն' ,
noReviews : 'Կարծիքներ դեռ չկան' ,
qna : 'Հարցեր և պատասխաններ' ,
photo : 'Լուսանկար' ,
reviewsCount : 'կարծիք' ,
today : 'Այսօր' ,
yesterday : 'Երեկ' ,
daysAgo : 'օր առաջ' ,
weeksAgo : 'շաբաթ առաջ' ,
colour : 'Գույն' ,
size : 'Չափ' ,
2026-07-05 01:07:53 +04:00
relatedProducts : 'Նման ապրանքներ' ,
2026-02-26 23:09:20 +04:00
} ,
app : {
2026-03-24 00:09:11 +04:00
connecting : 'Կապ սերվերի հետ...' ,
serverUnavailable : 'Սերվերը անհասանելի է' ,
serverError : 'Չհաջողվեց միանալ սերվերին։ Ստուգեք ինտերնետը։' ,
retryConnection : 'Փորձել կրկին' ,
pageTitle : 'Ապրանքների և ծառայությունների մարքեթփլեյս' ,
2026-02-26 23:09:20 +04:00
} ,
2026-07-09 02:29:12 +04:00
platform : {
loadingPage : 'Պլատֆորմի էջի բեռնում...' ,
emptyConfig : 'Էջի կոնֆիգուրացիա չի գտնվել։' ,
} ,
backoffice : {
title : 'Backoffice Sandbox' ,
subtitle : 'Բիզնես տվյալների կառավարման դոմեն (mock պլատֆորմի հիմքի համար):' ,
loading : 'Backoffice տվյալների բեռնում...' ,
products : 'Ապրանքներ' ,
categories : 'Կատեգորիաներ' ,
otherDomains : 'Այլ դոմեններ' ,
sku : 'SKU' ,
titleColumn : 'Անվանում' ,
price : 'Գին' ,
status : 'Կարգավիճակ' ,
itemsCount : 'հատ' ,
orders : 'Պատվերներ' ,
customers : 'Հաճախորդներ' ,
inventory : 'Պահեստ' ,
media : 'Մեդիա' ,
settings : 'Կարգավորումներ' ,
notAvailable : 'չկա' ,
} ,
builder : {
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
title : 'Մարկետփլեյսի կոնստրուկտոր' ,
subtitle : 'Կառուցեք ձեր մարկետփլեյսը քայլ ա ռ քայլ։' ,
2026-07-10 13:43:53 +04:00
general : 'Ընդհանուր' ,
2026-07-09 02:29:12 +04:00
branding : 'Բրենդինգ' ,
2026-07-10 13:43:53 +04:00
theme : 'Թեմա' ,
header : 'Header' ,
footer : 'Footer' ,
homepage : 'Գլխավոր էջ' ,
widgets : 'Վիջեթներ' ,
2026-07-10 13:52:01 +04:00
staticPages : 'Ստատիկ էջեր' ,
2026-07-10 13:43:53 +04:00
marketplaceFeatures : 'Մարքեթփլեյսի հնարավորություններ' ,
preview : 'Preview' ,
2026-07-09 02:29:12 +04:00
brandName : 'Բրենդի անվանում' ,
2026-07-10 13:43:53 +04:00
marketplaceName : 'Մարքեթփլեյսի անվանում' ,
domain : 'Դոմեյն' ,
descriptionLabel : 'Նկարագրություն' ,
defaultLanguage : 'Լռելյայն լեզու' ,
supportedLanguages : 'Աջակցվող լեզուներ' ,
logo : 'Լոգո' ,
smallLogo : 'Փոքր լոգո' ,
favicon : 'Favicon' ,
2026-07-17 15:22:45 +04:00
socialImage : 'Սոցիալական պատկեր' ,
gallery : 'Պատկերասրահ' ,
addGalleryImage : 'Ավելացնել պատկեր' ,
2026-07-17 15:29:55 +04:00
headerLayout : 'Վերնագրի դասավորություն' ,
headerLayoutDefault : 'Կանխադրված' ,
headerLayoutCentered : 'Կենտրոնացված' ,
headerSticky : 'Կպչուն վերնագիր' ,
2026-07-10 13:43:53 +04:00
marketplaceTitle : 'Մարքեթփլեյսի վերնագիր' ,
primaryColor : 'Հիմնական գույն' ,
secondaryColor : 'Երկրորդական գույն' ,
backgroundColor : 'Ֆոն' ,
surfaceColor : 'Մակերես' ,
textColor : 'Տեքստ' ,
successColor : 'Success' ,
warningColor : 'Warning' ,
dangerColor : 'Danger' ,
showLogo : 'Լոգո' ,
showSearch : 'Որոնում' ,
showCategories : 'Կատեգորիաներ' ,
showLanguages : 'Լեզուներ' ,
showCart : 'Զամբյուղ' ,
showProfile : 'Պրոֆիլ' ,
showWishlist : 'Ընտրյալներ' ,
showCompare : 'Համեմատում' ,
showRegion : 'Տարածաշրջան' ,
companyName : 'Ընկերության տվյալներ' ,
address : 'Հասցե' ,
phone : 'Հեռախոս' ,
email : 'Email' ,
copyright : 'Copyright' ,
paymentIcons : 'Վճարման icon-ներ' ,
socialLinks : 'Սոցիալական հղումներ' ,
2026-07-16 02:06:26 +04:00
footerLogo : 'Footer-ի լոգո' ,
addPaymentIcon : 'Ավելացնել վճարային icon' ,
removePaymentIcon : 'Հեռացնել' ,
iconAltLabel : 'Icon-ի պիտակ' ,
addSocialLink : 'Ավելացնել սոցիալական հղում' ,
removeSocialLink : 'Հեռացնել' ,
socialLinkLabel : 'Հարթակ' ,
socialLinkUrl : 'URL' ,
invalidUrl : 'Մուտքագրեք վավեր URL, որը սկսվում է http:// կամ https://։ ' ,
2026-07-10 13:52:01 +04:00
createPage : 'Ստեղծել էջ' ,
deletePage : 'Ջնջել էջը' ,
pageId : 'Էջի ID' ,
slug : 'Slug' ,
iconLabel : 'Իկոնա' ,
showInFooter : 'Ցույց տալ footer-ում' ,
showInHeader : 'Ցույց տալ header-ում' ,
showInSitemap : 'Ցույց տալ sitemap-ում' ,
requiresAuthentication : 'Պահանջում է մուտք' ,
footerGroup : 'Footer խումբ' ,
orderLabel : 'Հերթականություն' ,
translationTitle : 'Թարգմանության վերնագիր' ,
htmlPreview : 'HTML' ,
2026-07-15 04:11:18 +04:00
seoSection : 'SEO' ,
seoTitle : 'SEO վերնագիր' ,
seoDescription : 'SEO նկարագրություն' ,
seoKeywords : 'Հիմնաբառեր' ,
seoCanonical : 'Canonical URL' ,
seoOgTitle : 'OG վերնագիր' ,
seoOgDescription : 'OG նկարագրություն' ,
seoOgImage : 'OG պատկեր' ,
2026-07-10 13:43:53 +04:00
visible : 'Տեսանելի' ,
layoutLabel : 'Layout' ,
columns : 'Սյուներ' ,
height : 'Բարձրություն' ,
overlay : 'Overlay' ,
autoplay : 'Autoplay' ,
cardsPerRow : 'Քարտեր մեկ շարքում' ,
filtersLabel : 'Ֆիլտրեր' ,
showBadges : 'Ցույց տալ badges' ,
showRating : 'Ցույց տալ վարկանիշ' ,
showPrice : 'Ցույց տալ գին' ,
widgetJson : 'Widget JSON' ,
reviews : 'Կարծիքներ' ,
questions : 'Հարցեր' ,
comments : 'Մեկնաբանություններ' ,
recommendations : 'Առաջարկություններ' ,
recentlyViewed : 'Վերջին դիտվածներ' ,
searchSuggestions : 'Որոնման առաջարկներ' ,
searchHistory : 'Որոնման պատմություն' ,
livePreview : 'Կենդանի preview' ,
2026-07-17 09:00:47 +04:00
previewChangesTitle : 'Փոփոխություններ վերջին հրապարակումից ի վեր' ,
previewNoIssues : 'Վավերացման խնդիրներ չկան։' ,
previewNoChanges : 'Փոփոխություններ վերջին հրապարակումից ի վեր չկան։' ,
previewChangeField : 'Դաշտ' ,
previewChangeBefore : 'Մինչ' ,
previewChangeAfter : 'Հետո' ,
2026-07-13 08:10:00 +04:00
languagesTab : 'Լեզուներ' ,
addLanguage : 'Ավելացնել լեզու' ,
removeLanguage : 'Հեռացնել' ,
setDefaultLanguage : 'Դարձնել լռելյայն' ,
defaultLanguageLabel : 'Լռելյայն' ,
2026-07-13 08:57:42 +04:00
navigationTab : 'Նավիգացիա' ,
navigationHeader : 'Վերին նավիգացիա' ,
navigationFooter : 'Ստորին նավիգացիա' ,
navigationFooterGrouped : 'Ստորին նավիգացիան խմբավորված է սյուներով և դեռ խմբագրելի չէ այստեղ. օգտագործեք «Footer» ներդիրը։' ,
addLink : 'Ավելացնել հղում' ,
2026-07-17 10:18:08 +04:00
insertPageLink : 'Ներդնել էջի հղում' ,
linkedToPage : 'Կապված է էջի հետ' ,
2026-07-13 08:57:42 +04:00
removeLink : 'Հեռացնել' ,
linkLabel : 'Պիտակ' ,
linkUrl : 'URL' ,
2026-07-10 13:43:53 +04:00
exportBootstrap : 'Արտահանել bootstrap' ,
importBootstrap : 'Ներմուծել bootstrap' ,
exportedBootstrap : 'Արտահանված bootstrap' ,
importSource : 'Ներմուծման աղբյուր' ,
importError : 'Ներմուծումը ձախողվեց։ Սխալ bootstrap JSON։ ' ,
2026-07-09 02:29:12 +04:00
featureFlags : 'Feature flags' ,
2026-07-13 10:51:05 +04:00
validationMissingLogo : 'Բրենդինգում բացակայում է լոգոն։' ,
validationNoLanguages : 'Կարգավորված լեզուներ չկան։' ,
2026-07-17 19:00:17 +04:00
validationDefaultLocaleNotSupported : 'Կանխադրված լեզուն աջակցվող լեզուների ցանկում չէ։' ,
2026-07-13 10:51:05 +04:00
validationInvalidUrl : 'Մարքեթփլեյսի URL-ը սխալ է։' ,
validationDuplicateSlugs : 'Երկու կամ ավելի ստատիկ էջեր ունեն նույն slug-ը։' ,
validationEmptyHomepage : 'Գլխավոր էջում սեկցիաներ չկան։' ,
validationMissingWidget : 'Գլխավոր էջի սեկցիաներից մեկն ունի վիջեթ առանց տիպի։' ,
validationDuplicateNavLinks : 'Վերնագրի նավիգացիայում կան կրկնվող հղումներ։' ,
validationInvalidColors : 'Թեմայի գույներից մեկը կամ մի քանիսը վավեր hex գույն չեն։' ,
2026-07-14 12:21:33 +04:00
validationMissingTranslations : 'Որոշ բովանդակություն թարգմանված չէ սատարվող լեզուներից մեկով։' ,
validationInvalidLayouts : 'Մեկ կամ մի քանի դասավորություններ հղում են անհայտ տեսակի։' ,
feat(project-editor): centralize schema-driven validation
Milestone 2 of the Configuration Engine sprint.
- Add schema/validators/primitives: pure isValidHexColor/HttpUrl/Email,
validateJson, validateCss, extractStyleBlocks, normalizeRoute. One function
per concern, no duplicated validator logic.
- Refactor ProjectValidator to compose the primitives and tag every issue with
section + fieldKey + severity ('error' blocks publish, 'warning' advisory).
Preserves all existing codes/messages; adds duplicate-routes, invalid-css,
invalid-widget-config checks.
- Facade: issuesByField, issuesBySection, blockingIssues, hasBlockingIssues;
publish() now gates on severity==='error' instead of any issue.
- i18n: add validationInvalidJson/Css/DuplicateRoutes/InvalidWidgetConfig to
the Translations interface + en/ru/hy.
- Specs: primitives + ProjectValidator (25 passing total).
Gate: tsc --noEmit, npm test (25/25), arch:check, build all green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 01:58:36 +04:00
validationInvalidJson : 'Կոնֆիգուրացիան վավեր JSON չէ։' ,
validationInvalidCss : 'Ստատիկ էջը պարունակում է անվավեր CSS։ ' ,
validationDuplicateRoutes : 'Երկու կամ ավելի էջ ունեն նույն երթուղին։' ,
validationInvalidWidgetConfig : 'Վիջեթին բացակայում է պարտադիր դաշտ (id, type, version կամ props)։ ' ,
2026-07-17 16:57:43 +04:00
validationInvalidContactEmail : 'Ընկերության կոնտակտային էլ. փոստը վավեր չէ։' ,
validationInvalidSocialLinkUrl : 'Ֆուտերի սոցիալական հղումներից մեկը կամ մի քանիսը վավեր URL չունեն։' ,
validationIncompletePaymentIcon : 'Ֆուտերի վճարային պատկերակին բացակայում է պատկերը կամ alt տեքստը։' ,
2026-07-17 02:13:34 +04:00
undo : 'Հետարկել' ,
redo : 'Կրկնել' ,
2026-07-13 15:00:03 +04:00
statusDraft : 'Սևագիր' ,
statusPublished : 'Հրապարակված' ,
unsavedChanges : 'Չպահված փոփոխություններ' ,
save : 'Պահպանել' ,
publish : 'Հրապարակել' ,
2026-07-13 15:57:54 +04:00
confirmLeaveUnsaved : 'Կան չպահված փոփոխություններ։ Այնուամենայնիվ դուրս գա՞լ։' ,
promptLinkUrl : 'URL' ,
promptImageUrl : 'Նկարի URL' ,
2026-07-17 10:00:33 +04:00
promptEmbedUrl : 'Ներդրման URL' ,
htmlEditorInvalidHtml : 'Այս HTML-ը ունի չփակված կամ չհամընկնող թեգ։ Ուղղեք նախքան տեսողական խմբագրիչին վերադառնալը։' ,
2026-07-13 15:57:54 +04:00
htmlEditorCode : 'Կոդ' ,
htmlEditorPreview : 'Նախադիտում' ,
2026-07-14 09:50:03 +04:00
lastSaved : 'Վերջին պահպանումը' ,
draftRestored : 'Տեղական սևագիրը վերականգնվել է նախորդ սեսիայից։' ,
dismiss : 'Փակել' ,
resetDraft : 'Զրոյացնել սևագիրը' ,
resetSection : 'Զրոյացնել սեկցիան' ,
confirmResetDraft : 'Ս ա կչեղարկի բոլոր չհրապարակված փոփոխությունները և կվերականգնի վերջին հրապարակված կոնֆիգուրացիան։ Շարունակե՞լ։' ,
confirmResetSection : 'Ս ա կչեղարկի չհրապարակված փոփոխությունները միայն այս սեկցիայում։ Շարունակե՞լ։' ,
2026-07-14 16:05:09 +04:00
marketplaceNameDesc : 'Անվանումը, որը տեսնում են գնորդները կայքում և բրաուզերի ներդիրում։' ,
domainDesc : 'Դոմեյնը, որով գնորդները մուտք են գործում մարքեթփլեյս։ Փոփոխությունը DNS չի տեղափոխում։' ,
descriptionFieldDesc : 'Կարճ նկարագրություն որոնողական համակարգերի և ս ո ց ․ ցանցերի նախադիտումների համար։' ,
defaultLanguageDesc : 'Լեզուն, որը ցուցադրվում է, եթե գնորդը լեզվային նախապատվություն չունի պահված։' ,
supportedLanguagesDesc : 'Ստորակետով բաժանված լեզվային կոդեր, որոնց միջև կարող է անցնել գնորդը (օր․՝ en, ru, hy)։ ' ,
logoDesc : 'Ամբողջական լոգոյի պատկերի URL, ցուցադրվում է header-ում դեսքթոփի վրա։' ,
smallLogoDesc : 'Կոմպակտ լոգոյի URL՝ սահմանափակ տարածքի համար (օր․՝ mobile header)։ ' ,
faviconDesc : 'Բրաուզերի ներդիրի պատկերակի URL։ Պետք է լինի փոքր քառակուսի պատկեր։' ,
2026-07-17 15:22:45 +04:00
socialImageDesc : 'Կանխադրված պատկեր, երբ մարքեթփլեյսը կիսվում է սոցիալական ցանցերում (Open Graph)։ ' ,
galleryDesc : 'Լրացուցիչ բրենդային պատկերներ ապագա օգտագործման համար։' ,
2026-07-17 15:29:55 +04:00
headerLayoutDesc : 'Ինչպես է դասավորված վերնագրի պարունակությունը՝ կանխադրված (լոգոն ձախից) կամ կենտրոնացված։' ,
headerStickyDesc : 'Պահել վերնագիրը էկրանի վերևում էջը էջում ոլորելիս։' ,
2026-07-14 16:05:09 +04:00
marketplaceTitleDesc : 'Էջի վերնագիրը որոնողական համակարգերի և բրաուզերի ներդիրների համար։' ,
primaryColorDesc : 'Բրենդի հիմնական գույնը՝ հիմնական կոճակների և ընդգծումների համար։ Պետք է վավեր hex գույն լինի։' ,
secondaryColorDesc : 'Բրենդի երկրորդական գույնը՝ երկրորդական տարրերի համար։ Պետք է վավեր hex գույն լինի։' ,
backgroundColorDesc : 'Էջի լռելյայն ֆոնի գույնը։ Պետք է վավեր hex գույն լինի։' ,
surfaceColorDesc : 'Քարտերի և բարձրացված մակերեսների ֆոնի գույնը։ Պետք է վավեր hex գույն լինի։' ,
textColorDesc : 'Հիմնական տեքստի գույնը։ Պետք է վավեր hex գույն լինի։' ,
successColorDesc : 'Հաջողության հաղորդագրությունների գույնը։ Պետք է վավեր hex գույն լինի։' ,
warningColorDesc : 'Զգուշացման հաղորդագրությունների գույնը։ Պետք է վավեր hex գույն լինի։' ,
dangerColorDesc : 'Սխալների և կործանարար գործողությունների գույնը։ Պետք է վավեր hex գույն լինի։' ,
themeModeLabel : 'Գունային ռեժիմ' ,
themeModeDesc : 'Որոշում է՝ կայքը ցուցադրվի բաց, մուգ, թե գնորդի սարքի նախապատվությամբ։' ,
themeModeLight : 'Բաց' ,
themeModeLightDesc : 'Միշտ օգտագործել բաց գունային սխեման։' ,
themeModeDark : 'Մուգ' ,
themeModeDarkDesc : 'Միշտ օգտագործել մուգ գունային սխեման։' ,
themeModeSystem : 'Համակարգային' ,
themeModeSystemDesc : 'Հետևել գնորդի սարքի/բրաուզերի գունային նախապատվությանը։' ,
siteLayoutLabel : 'Կայքի դասավորություն' ,
siteLayoutDesc : 'Ընդհանուր էջի դասավորության ռեժիմը կայքում։' ,
siteLayoutDefault : 'Լռելյայն' ,
siteLayoutDefaultDesc : 'Ստանդարտ դասավորություն վերևի նավիգացիայով։' ,
siteLayoutSidebarLeft : 'Կողային վահանակ (ձախ)' ,
siteLayoutSidebarLeftDesc : 'Ավելացնում է ձախ կողային վահանակ, սովորաբար կատեգորիաների նավիգացիայի համար։' ,
siteLayoutCarouselHome : 'Կարուսել գլխավոր էջում' ,
siteLayoutCarouselHomeDesc : 'Գլխավոր էջը սկսվում է լայնածավալ կարուսելով/hero-բլոկով։' ,
siteLayoutMinimal : 'Մինիմալ' ,
siteLayoutMinimalDesc : 'Պարզեցված տեսք՝ նվազագույն նավիգացիոն տարրերով։' ,
showLogoDesc : 'Ցույց տալ մարքեթփլեյսի լոգոն header-ում։' ,
showSearchDesc : 'Ցույց տալ որոնման դաշտը header-ում։' ,
showCategoriesDesc : 'Ցույց տալ կատեգորիաների մենյուի մուտքը header-ում։' ,
showLanguagesDesc : 'Ցույց տալ լեզվի փոխարկիչը header-ում։' ,
showCartDesc : 'Ցույց տալ զամբյուղի պատկերակը/հղումը header-ում։' ,
showProfileDesc : 'Ցույց տալ պրոֆիլի/հաշվի մուտքը header-ում։' ,
showWishlistDesc : 'Ցույց տալ ընտրյալների մուտքը header-ում։' ,
showCompareDesc : 'Ցույց տալ ապրանքների համեմատման մուտքը header-ում։' ,
showRegionDesc : 'Ցույց տալ տարածաշրջանի/երկրի ընտրիչը header-ում։' ,
companyNameDesc : 'Ընկերության իրավաբանական անվանումը՝ ցուցադրվում է footer-ում և ստատիկ էջերում։' ,
addressDesc : 'Ընկերության հասցեն՝ ցուցադրվում է footer-ում։' ,
phoneDesc : 'Կոնտակտային հեռախոսահամարը՝ ցուցադրվում է footer-ում։' ,
emailDesc : 'Կոնտակտային email-ը՝ ցուցադրվում է footer-ում։' ,
copyrightDesc : 'Copyright տողը՝ ցուցադրվում է յուրաքանչյուր էջի ներքևում։' ,
paymentIconsDesc : 'Մեկ վճարային icon մեկ տողում (պատկերի URL և պիտակ)՝ ցուցադրվում է footer-ում։' ,
socialLinksDesc : 'Մեկ սոցիալական հղում մեկ տողում (հարթակ և URL)՝ ցուցադրվում է footer-ում։' ,
2026-07-16 02:06:26 +04:00
footerLogoDesc : 'Footer-ում ցուցադրվող լոգո, եթե տարբերվում է header-ի լոգոյից։' ,
iconAltLabelDesc : 'Վճարային icon-ի այլընտրանքային տեքստ՝ մատչելիության համար։' ,
socialLinkUrlDesc : 'Սոցիալական պրոֆիլի ամբողջական URL, պետք է սկսվի http:// կամ https://-ով։' ,
2026-07-14 16:05:09 +04:00
staticPagesFieldDesc : 'Ստատիկ էջեր (մեր մասին, պայմաններ, գաղտնիության քաղաքականություն և այլն), որոնց հղում է անում footer-ը։' ,
2026-07-19 13:58:57 +04:00
additionalPhones : 'Լրացուցիչ հեռախոսահամարներ' ,
additionalPhonesDesc : 'Ավելացրեք համարներ, եթե սպասարկում եք հաճախորդների տարբեր երկրներում։' ,
addPhone : 'Ավելացնել համար' ,
removePhone : 'Հեռացնել համարը' ,
additionalEmails : 'Լրացուցիչ էլ. փոստի հասցեներ' ,
additionalEmailsDesc : 'Ավելացրեք հասցեներ տարբեր տարածաշրջանների կամ բաժինների համար։' ,
addEmail : 'Ավելացնել էլ. փոստ' ,
removeEmail : 'Հեռացնել էլ. փոստը' ,
footerColumns : 'Ստորատակի սյունակներ' ,
footerColumnsDesc : 'Խմբավորեք հղումները սյունակների մեջ, ինչպես իրական ստորատակում։ Քաշեք սյունակներն ու հղումները՝ կարգը փոխելու համար։' ,
footerColumnTitlePlaceholder : 'Սյունակի վերնագիր, օր.՝ Ընկերություն' ,
footerLinkLabelPlaceholder : 'Հղման տեքստ' ,
footerLinkExistingPage : 'Առկա էջ' ,
footerLinkCustomUrl : 'Սեփական URL' ,
addColumn : 'Ավելացնել սյունակ' ,
removeColumn : 'Հեռացնել սյունակը' ,
addColumnLink : 'Ավելացնել հղում' ,
removeColumnLink : 'Հեռացնել հղումը' ,
2026-07-14 16:05:09 +04:00
sectionVisibleDesc : 'Արդյո՞ք գլխավոր էջի այս սեկցիան ցուցադրվում է գնորդներին։' ,
layoutStrategyLabel : 'Դասավորության ռազմավարություն' ,
layoutStrategyDesc : 'Ինչպես են դասավորվում վիջեթները այս սեկցիայի ներսում։' ,
layoutStrategyStack : 'Stack' ,
layoutStrategyStackDesc : 'Վիջեթները դասավորվում են ուղղահայաց՝ մեկը մյուսի տակ։' ,
layoutStrategyGrid : 'Grid' ,
layoutStrategyGridDesc : 'Վիջեթները դասավորվում են բազմասյուն ցանցում։' ,
layoutStrategyHero : 'Hero' ,
layoutStrategyHeroDesc : 'Մեկ մեծ, լայնածավալ գովազդային բլոկ։' ,
layoutStrategyCarousel : 'Carousel' ,
layoutStrategyCarouselDesc : 'Վիջեթները թերթվում են հորիզոնական կարուսելի տեսքով։' ,
layoutStrategySplit : 'Split' ,
layoutStrategySplitDesc : 'Բովանդակությունը բաժանվում է երկու կողք-կողքի հատվածների։' ,
sectionColumnsDesc : 'Սյուների քանակը, երբ դասավորության ռազմավարությունն աջակցում է դրանք։' ,
widgetLayoutDesc : 'Այս վիջեթի հասկացող դասավորության տարբերակի ազատ տեքստային անվանում (օր․՝ "full-bleed", "boxed")։ ' ,
widgetHeightDesc : 'Այս վիջեթի նախընտրելի բարձրությունը (օր․՝ "480px" կամ "60vh")։ ' ,
widgetOverlayDesc : 'Ցույց տալ մուգ overlay hero տեքստի հետևում՝ ընթեռնելիության համար։' ,
widgetAutoplayDesc : 'Ինքնաշխատ պտտել hero սլայդները առանց գնորդի մասնակցության։' ,
feat(builder): visual homepage blocks, merchant-language widget settings, real carousel arrows
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
P0 user feedback: homepage builder showed raw section.id like 'section-hero'/'section-categories'; hero widget exposed 'full-bleed'/'boxed' and raw px/vh as free text with no explanation; Overlay/Autoplay toggles made no sense without a slides concept; product carousel widgets rendered arrows nowhere near a working carousel.
Homepage section (sections list -> visual blocks):
- Replaced raw section.id display with a merchant-facing block catalog (icon + name + one-line explanation) for hero/categories/featured-products/product-carousel/recently-viewed/banner/partners/custom-html
- Added block catalog picker to append new blocks (was fixed at whatever the seed data had - task asked 'what if we add manually? not fixed 3')
- Added duplicate and remove per block, alongside the existing drag-to-reorder
- Verified in browser: labels render correctly, add-block and duplicate both confirmed working end-to-end
Widgets section (hero widget):
- 'Layout' free-text replaced with a select (Full width / Boxed) instead of typing 'full-bleed'/'boxed' blind
- 'Height' free-text replaced with a select (Compact/Medium/Tall/Full screen) mapped to real vh values
- New Slides editor: title/subtitle pairs an admin can add/remove: this is the actual multi-slide data the Overlay/Autoplay toggles were referring to with nothing to point at before
- HeroWidgetData contract gains slides[]/autoplay; HeroWidgetComponent now renders a real rotator (dots, click-to-jump, autoplay interval) when more than one slide exists - previously autoplay/overlay props existed but there was no slideshow behavior anywhere to control
Carousel arrows root cause and fix:
- widget-manifest.json offers 'carousel' as a layout option for product-collection/product-carousel widgets, and the admin UI let you select it, but ProductCarouselWidgetComponent always rendered a static CSS grid regardless - there was no carousel implementation to have arrows in the first place
- Now renders a real horizontally-scrollable strip with working prev/next buttons (native scrollBy, disabled at each end) when section.layout.strategy === 'carousel'; falls back to the existing grid otherwise
- Confirmed src/app/components/items-carousel (a PrimeNG p-carousel) is dead code, not wired into any route or widget - not the source of the reported bug
New builder.* i18n keys (en/ru/hy), zero duplicate-key collisions verified via scan
2026-07-19 14:14:29 +04:00
heroLayoutFullBleed : 'Ամբողջ լայնությամբ (եզրից եզր)' ,
heroLayoutBoxed : 'Շրջանակով (էջի լուսանցքների սահմաններում)' ,
heroHeightCompact : 'Կոմպակտ' ,
heroHeightMedium : 'Միջին' ,
heroHeightTall : 'Բարձր' ,
heroHeightFullScreen : 'Լիաէկրան' ,
heroSlides : 'Սլայդներ' ,
heroSlidesHint : 'Ավելացրեք սլայդներ՝ սլայդշոու ստանալու համար։ Վերևի դաշտերը 1-ին սլայդն են։ Ինքնաշարժ և կետերը հայտնվում են միայն մեկից ավելի սլայդի դեպքում։' ,
heroSlideTitlePlaceholder : 'Սլայդի վերնագիր' ,
heroSlideSubtitlePlaceholder : 'Սլայդի ենթավերնագիր' ,
addSlide : 'Ավելացնել սլայդ' ,
removeSlide : 'Հեռացնել սլայդը' ,
2026-07-14 16:05:09 +04:00
widgetColumnsDesc : 'Կատեգորիայի սալիկների քանակը մեկ շարքում։' ,
widgetCardsPerRowDesc : 'Ապրանքի քարտերի քանակը մեկ շարքում։' ,
widgetFiltersDesc : 'Ցույց տալ ֆիլտրերի կառավարման տարրերը ապրանքների հավաքածուի կողքին։' ,
widgetShowBadgesDesc : 'Ցույց տալ badge-եր, օրինակ՝ "Նոր" կամ "Զեղչ", ապրանքի քարտերի վրա։' ,
widgetShowRatingDesc : 'Ցույց տալ աստղանիշ վարկանիշը ապրանքի քարտերի վրա։' ,
widgetShowPriceDesc : 'Ցույց տալ գինը ապրանքի քարտերի վրա։' ,
widgetJsonDesc : 'Վիջեթի հատկությունները՝ հում JSON ձևաչափով։ Օգտագործվում է, երբ այս վիջեթի տեսակի համար հատուկ խմբագիր չկա։' ,
2026-07-17 18:14:58 +04:00
widgetJsonInvalid : 'Սխալ JSON՝ պահպանված է վերջին վավեր տարբերակը։' ,
2026-07-14 16:05:09 +04:00
wishlistFeatureDesc : 'Թույլ տալ գնորդներին ապրանքներ պահել ընտրյալներում։' ,
compareFeatureDesc : 'Թույլ տալ գնորդներին համեմատել մի քանի ապրանք միաժամանակ։' ,
reviewsFeatureDesc : 'Թույլ տալ գնորդներին թողնել և կարդալ ապրանքի կարծիքներ։' ,
questionsFeatureDesc : 'Թույլ տալ գնորդներին հարցեր տալ և կարդալ ապրանքի պատասխանները։' ,
commentsFeatureDesc : 'Միացնել ընդհանուր մեկնաբանությունները մարքեթփլեյսի բովանդակության համար։' ,
recommendationsFeatureDesc : 'Ցույց տալ առաջարկվող ապրանքների բլոկներ ամբողջ կայքում։' ,
recentlyViewedFeatureDesc : 'Ցույց տալ գնորդներին "վերջին դիտվածներ" ապրանքների ցանկը։' ,
searchSuggestionsDesc : 'Ցույց տալ կենդանի որոնման առաջարկներ, մինչ գնորդը մուտքագրում է հարցումը։' ,
searchHistoryDesc : 'Հիշել և ցույց տալ գնորդի վերջին որոնումները։' ,
catalogNavigationModeLabel : 'Կատալոգի նավիգացիայի ռեժիմ' ,
catalogNavigationModeDesc : 'Ինչպես են գնորդները նավարկում կատեգորիաների միջև կատալոգում։' ,
catalogNavDefault : 'Լռելյայն' ,
catalogNavDefaultDesc : 'Ստանդարտ, breadcrumb-ի վրա հիմնված կատեգորիաների նավիգացիա։' ,
catalogNavLeftCategory : 'Ձախ կատեգորիաների նավիգացիա' ,
catalogNavLeftCategoryDesc : 'Մշտական կատեգորիաների ծառ ձախ կողային վահանակում։' ,
catalogNavMegaCategory : 'Մեգա կատեգորիաների դասավորություն' ,
catalogNavMegaCategoryDesc : 'Ընդարձակված dropdown ենթակատեգորիաներով և ընտրված ապրանքներով։' ,
catalogNavTopCarousel : 'Վերևի կատեգորիաների կարուսել' ,
catalogNavTopCarouselDesc : 'Հորիզոնական թերթվող կատեգորիաների chip-եր կատալոգի ցանցի վերևում։' ,
newLanguageDesc : 'ISO լեզվի կոդ՝ որպես աջակցվող լեզու ավելացնելու համար (օր․՝ de, fr)։ ' ,
2026-07-17 18:31:01 +04:00
languageAlreadyAdded : 'Այս լեզուն արդեն ավելացված է։' ,
2026-07-14 16:05:09 +04:00
languagesTabDesc : 'Գնորդներին հասանելի լեզուներ։ Լռելյայն լեզուն օգտագործվում է որպես պահուստային ամենուր։' ,
linkLabelDesc : 'Այս նավիգացիոն հղման համար ցուցադրվող տեքստը։' ,
linkUrlDesc : 'Ուղին կամ URL-ը, որին ուղղորդում է այս նավիգացիոն հղումը։' ,
linkVisibleDesc : 'Արդյո՞ք այս նավիգացիոն հղումը ցուցադրվում է գնորդներին։' ,
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 : 'Մարկետփլեյսի կոնստրուկտոր' ,
2026-07-19 08:25:29 +04:00
backToDashboard : 'Վերադառնալ կառավարման վահանակ' ,
2026-07-19 08:53:10 +04:00
languagesSummaryDesc : 'Լեզուները, որոնցով հասանելի է ձեր մարքեթփլեյսը։ Առաջինը գնորդների լռելյայն լեզուն է։' ,
manageLanguages : 'Կառավարել լեզուները' ,
2026-07-19 08:48:22 +04:00
htmlToolBold : 'Թավ' ,
htmlToolItalic : 'Շեղ' ,
htmlToolUnderline : 'Ընդգծված' ,
htmlToolHeading : 'Վերնագիր' ,
htmlToolSubheading : 'Ենթավերնագիր' ,
htmlToolBulletList : 'Կետային ցուցակ' ,
htmlToolNumberedList : 'Համարակալված ցուցակ' ,
htmlToolLink : 'Տեղադրել հղում' ,
htmlToolImage : 'Տեղադրել նկար' ,
htmlToolTable : 'Տեղադրել աղյուսակ' ,
htmlToolDivider : 'Բաժանարար գիծ' ,
htmlToolCodeBlock : 'Կոդի բլոկ' ,
htmlToolEmbed : 'Ներդնել տեսանյութ' ,
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
breadcrumbRoot : 'Մարկետփլեյսի կոնստրուկտոր' ,
statusComplete : 'Ավարտված' ,
statusInProgress : 'Ընթացքի մեջ' ,
statusNotStarted : 'Չսկսված' ,
statusUnknown : 'Դեռ չի հետևվում' ,
draftBadge : 'Սևագիր' ,
publishedBadge : 'Հրապարակված' ,
modifiedBadge : 'Չպահպանված փոփոխություններ' ,
helpToggleShow : 'Ի՞նչ է ս ա ' ,
helpToggleHide : 'Թաքցնել օգնությունը' ,
helpWhatIsThis : 'Ի՞նչ է ս ա ' ,
helpWhySkip : 'Ինչու՞ կարգավորել' ,
helpWhereVisible : 'Որտե՞ղ են տեսնում գնորդները' ,
helpWhatIfSkip : 'Ի՞նչ կլինի, եթե բաց թողնեք' ,
helpWhenReturn : 'Ե՞րբ վերադառնալ այս բաժնին' ,
openSidebar : 'Բացել բաժինների ցանկը' ,
closeSidebar : 'Փակել բաժինների ցանկը' ,
overviewTitle : 'Մարկետփլեյսի կոնստրուկտոր' ,
overviewSubtitle : 'Կառուցեք ձեր մարկետփլեյսը քայլ ա ռ քայլ' ,
overviewReadinessLabel : 'Ձեր մարկետփլեյսը կարգավորված է {{percent}}%' ,
overviewReadinessHint : 'Հիմնված է արդեն լրացված պարտադիր դաշտերի վրա։' ,
overviewNextStepLabel : 'Առաջարկվող հաջորդ քայլը' ,
overviewNextStepFallback : 'Բոլոր պարտադիր քայլերն ավարտված են՝ կարող եք հրապարակել։' ,
overviewQuickLinksTitle : 'Արագ հղումներ' ,
overviewSectionsTitle : 'Կոնստրուկտորի բաժինները' ,
overviewOpenSection : 'Բացել բաժինը' ,
overviewReadinessTitle : 'Մարկետփլեյսի պատրաստվածություն' ,
readinessLogoUploaded : 'Լոգոն վերբեռնված է' ,
readinessHomepageConfigured : 'Գլխավոր էջը կարգավորված է' ,
readinessThemeConfigured : 'Թեման կարգավորված է' ,
readinessLanguagesConfigured : 'Լեզուները կարգավորված են' ,
readinessContentPagesAdded : 'Ինֆորմացիոն էջեր ավելացված են' ,
readinessPreviewReviewed : 'Նախադիտումը ստուգված է' ,
readinessPublished : 'Մարկետփլեյսը հրապարակված է' ,
readinessCategoriesExist : 'Կատեգորիաներ կան' ,
readinessProductsExist : 'Ապրանքներ կան' ,
groupMarketplaceLabel : 'Մարկետփլեյս' ,
groupMarketplaceDescription : 'Անվանումը, հասցեն և ձեր մարկետփլեյսի հիմնական տվյալները։' ,
groupMarketplacePurpose : 'Հիմնական տվյալները, որոնք սահմանում են ձեր մարկետփլեյսը՝ անվանում, դոմեն և լռելյայն լեզու։' ,
groupMarketplaceWhere : 'Անվանումը և հասցեն երևում են բրաուզերի ներդիրում, որոնման արդյունքներում և խանութի բոլոր էջերում։' ,
groupMarketplaceSkip : 'Առանց անվանման և հասցեի ձեր մարկետփլեյսը գնորդներին կթվա անավարտ։' ,
groupBrandingLabel : 'Բրենդինգ և ձևավորում' ,
groupBrandingDescription : 'Լոգո, գույներ, վերնագիր և ստորագիր՝ ձեր խանութի տեսողական ոճը։' ,
groupBrandingPurpose : 'Կարգավորեք ձեր մարկետփլեյսի տեսքը՝ լոգո, գունային ներկապնակ, վերնագրի/ստորագրի տարրեր։' ,
groupBrandingWhere : 'Փոփոխությունները երևում են գնորդի տեսած յուրաքանչյուր էջում։' ,
groupBrandingSkip : 'Ձեր մարկետփլեյսը կօգտագործի լռելյայն ոճավորում, որը չի արտացոլում ձեր բրենդը։' ,
groupHomepageLabel : 'Գլխավոր էջ' ,
groupHomepageDescription : 'Բաններներ, ցուցափեղկեր և վիջեթներ, որոնք գնորդներն առաջինը տեսնում են։' ,
groupHomepagePurpose : 'Կառուցեք ձեր գլխավոր էջը բլոկներից՝ ողջունող բաններ, ընտրված կատեգորիաներ և ապրանքներ, ակցիաներ։' ,
groupHomepageWhere : 'Ս ա առաջին էջն է, որը գնորդը տեսնում է ձեր մարկետփլեյսը բացելիս։' ,
groupHomepageSkip : 'Ձեր գլխավոր էջը կմնա դատարկ կամ կօգտագործի լռելյայն դասավորություն։' ,
groupContentLabel : 'Բովանդակություն' ,
groupContentDescription : 'Մեր մասին, կոնտակտներ, առաքում, վերադարձ և այլ ինֆորմացիոն էջեր։' ,
groupContentPurpose : 'Ավելացրեք էջեր, որոնց գնորդները վստահում են՝ մեր մասին, կոնտակտներ, առաքման և վերադարձի պայմաններ։' ,
groupContentWhere : 'Այս էջերի հղումները սովորաբար ցուցադրվում են կայքի ստորագրում։' ,
groupContentSkip : 'Գնորդները չեն գտնի պատասխաններ առաքման, վերադարձի կամ կապի մասին հարցերին՝ ս ա նվազեցնում է վստահությունը։' ,
groupLanguagesLabel : 'Լեզուներ' ,
groupLanguagesDescription : 'Ինչ լեզուներով է աշխատում ձեր մարկետփլեյսը։' ,
groupLanguagesPurpose : 'Ընտրեք լռելյայն լեզուն և ավելացրեք լրացուցիչ լեզուներ այլ տարածաշրջանների գնորդների համար։' ,
groupLanguagesWhere : 'Լեզվի փոխարկիչը երևում է կայքի վերնագրում յուրաքանչյուր էջում։' ,
groupLanguagesSkip : 'Ձեր մարկետփլեյսը հասանելի կլինի միայն լռելյայն լեզվով։' ,
groupFeaturesLabel : 'Մարկետփլեյսի հնարավորություններ' ,
groupFeaturesDescription : 'Ցանկություններ, համեմատում, կարծիքներ, հյուր-պատվեր և այլն։' ,
groupFeaturesPurpose : 'Միացրեք կամ անջատեք գնորդի հնարավորությունները՝ ցանկությունների ցանկ, ապրանքների համեմատում, հյուր-պատվեր։' ,
groupFeaturesWhere : 'Ազդում է կատալոգի, ապրանքի և պատվերի ձևակերպման էջերի վրա։' ,
groupFeaturesSkip : 'Ձեր մարկետփլեյսը կօգտագործի հնարավորությունների լռելյայն հավաքածուն։' ,
groupNavigationLabel : 'Նավիգացիա և որոնում' ,
groupNavigationDescription : 'Կայքի ընտրացանկը և ինչպես են գնորդները գտնում ապրանքները։' ,
groupNavigationPurpose : 'Կարգավորեք ընտրացանկի կետերը և կատալոգի նավիգացիայի կառուցվածքը։' ,
groupNavigationWhere : 'Երևում է կայքի վերնագրում յուրաքանչյուր էջում։' ,
groupNavigationSkip : 'Գնորդները կօգտագործեն լռելյայն նավիգացիան։' ,
groupPreviewLabel : 'Նախադիտում' ,
groupPreviewDescription : 'Տեսեք, թե ինչպես է ձեր մարկետփլեյսը երևում դեսքթոփի, պլանշետի և հեռախոսի վրա։' ,
groupPreviewPurpose : 'Ստուգեք ձեր մարկետփլեյսը գնորդի աչքերով նախքան հրապարակելը՝ տարբեր էկրանների վրա։' ,
groupPreviewWhere : 'Ս ա նախադիտում է՝ գնորդները այն երբեք չեն տեսնում։' ,
groupPreviewSkip : 'Կարող եք հրապարակել փոփոխությունները առանց ստուգելու։' ,
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 : 'Բրենդի ինքնություն' ,
brandOverviewSubtitle : 'Լոգոն, գույները և տառատեսակները, որոնք գնորդները տեսնում են յուրաքանչյուր էջում։' ,
brandOverviewComplete : 'Ձեր բրենդը ամբողջությամբ կարգավորված է։' ,
brandLastModified : 'Վերջին փոփոխությունը' ,
brandFaviconUploaded : 'Կայքի պատկերակը վերբեռնված է' ,
brandColorsSelected : 'Բրենդի գույները ընտրված են' ,
brandTypographyConfigured : 'Տառատեսակները կարգավորված են' ,
brandSocialImageUploaded : 'Սոցիալական ցանցերի պատկերը վերբեռնված է' ,
brandAccessibilityPassed : 'Տեքստի հակադրությունը լավ է' ,
brandColorsPreviewTitle : 'Մարկետփլեյսի գույները' ,
brandTypographyPreviewTitle : 'Տառատեսակներ' ,
brandSocialPreviewTitle : 'Ինչպես է ս ա երևում հղումը կիսելիս' ,
brandTypeSampleHeading : 'Վերնագրի օրինակ' ,
brandTypeSampleBody : 'Հիմնական տեքստի օրինակ, ինչպես գնորդները կտեսնեն։' ,
brandContrastWarning : 'Տեքստը ֆոնի վրա դժվար է կարդալ․ դիտարկեք ավելի հակադիր գույներ։ Ս ա չի արգելափակում հրապարակումը։' ,
brandSocialEmpty : 'Սոցիալական պատկեր դեռ վերբեռնված չէ․ հղումը կիսելիս գնորդները կտեսնեն դատարկ քարտ։' ,
brandAccentColor : 'Ընդգծող' ,
brandBorderColor : 'Եզրագծեր' ,
feat(builder): implement visual homepage builder
New HomepageOverviewComponent (Tasks 1+8), mounted at the top of the
existing Homepage section page: completion ring, active/hidden section
counts, recommended next step, last-modified timestamp, and a 6-item
Homepage Health checklist (hero/categories/products/promotion/
newsletter/any-sections) - all derived from the real page.sections/
widgets data already in the facade, nothing fabricated.
Existing page-level drag-and-drop reordering (homepage-section's
CdkDragDrop over page.sections) was already implemented pre-Sprint 5 -
left as-is per "build on top of, do not replace."
Widgets section (Task 2) rewritten from a bare list into visual cards:
per-widget icon + humanized type label (hero/categories/product-
collection), a visible/hidden toggle and badge, up/down move buttons
(keyboard-accessible reorder within a section - see Known limitations
for why this replaces pointer drag for widgets specifically), duplicate,
and remove (with confirm). The existing per-type field editors (hero/
categories/product-collection) are unchanged; the raw-JSON fallback for
unknown widget types now sits behind a collapsed "Advanced settings"
disclosure instead of being the default view.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 10:24:13 +04:00
homepageOverviewTitle : 'Գլխավոր էջ' ,
homepageOverviewSubtitle : 'Ինչից է կազմված ձեր մարկետփլեյսի գլխավոր էջը։' ,
homepageOverviewComplete : 'Ձեր գլխավոր էջն ամբողջությամբ կարգավորված է։' ,
homepageActiveSections : 'Ակտիվ բլոկներ' ,
homepageDisabledSections : 'Թաքցված բլոկներ' ,
homepageHealthHero : 'Ողջունող բաններ ավելացված է' ,
homepageHealthCategories : 'Կատեգորիաների բլոկ ավելացված է' ,
homepageHealthProducts : 'Ապրանքների բլոկ ավելացված է' ,
homepageHealthPromotion : 'Ակցիայի բլոկ ավելացված է' ,
homepageHealthNewsletter : 'Բաժանորդագրման ձև ավելացված է' ,
homepageHealthAnySections : 'Էջում կա գոնե մեկ բլոկ' ,
widgetTypeHero : 'Ողջունող բաններ' ,
widgetTypeCategories : 'Կատեգորիաների բլոկ' ,
widgetTypeProducts : 'Ապրանքների բլոկ' ,
widgetHidden : 'Թաքցված' ,
widgetVisible : 'Ցուցադրել' ,
widgetMoveUp : 'Տեղափոխել վերև' ,
widgetMoveDown : 'Տեղափոխել ներքև' ,
widgetDuplicate : 'Կրկնօրինակել' ,
widgetRemove : 'Հեռացնել' ,
widgetRemoveConfirm : 'Հեռացնե՞լ այս բլոկը գլխավոր էջից։' ,
widgetAdvancedSettings : 'Լրացուցիչ կարգավորումներ' ,
feat(builder): visual homepage blocks, merchant-language widget settings, real carousel arrows
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
P0 user feedback: homepage builder showed raw section.id like 'section-hero'/'section-categories'; hero widget exposed 'full-bleed'/'boxed' and raw px/vh as free text with no explanation; Overlay/Autoplay toggles made no sense without a slides concept; product carousel widgets rendered arrows nowhere near a working carousel.
Homepage section (sections list -> visual blocks):
- Replaced raw section.id display with a merchant-facing block catalog (icon + name + one-line explanation) for hero/categories/featured-products/product-carousel/recently-viewed/banner/partners/custom-html
- Added block catalog picker to append new blocks (was fixed at whatever the seed data had - task asked 'what if we add manually? not fixed 3')
- Added duplicate and remove per block, alongside the existing drag-to-reorder
- Verified in browser: labels render correctly, add-block and duplicate both confirmed working end-to-end
Widgets section (hero widget):
- 'Layout' free-text replaced with a select (Full width / Boxed) instead of typing 'full-bleed'/'boxed' blind
- 'Height' free-text replaced with a select (Compact/Medium/Tall/Full screen) mapped to real vh values
- New Slides editor: title/subtitle pairs an admin can add/remove: this is the actual multi-slide data the Overlay/Autoplay toggles were referring to with nothing to point at before
- HeroWidgetData contract gains slides[]/autoplay; HeroWidgetComponent now renders a real rotator (dots, click-to-jump, autoplay interval) when more than one slide exists - previously autoplay/overlay props existed but there was no slideshow behavior anywhere to control
Carousel arrows root cause and fix:
- widget-manifest.json offers 'carousel' as a layout option for product-collection/product-carousel widgets, and the admin UI let you select it, but ProductCarouselWidgetComponent always rendered a static CSS grid regardless - there was no carousel implementation to have arrows in the first place
- Now renders a real horizontally-scrollable strip with working prev/next buttons (native scrollBy, disabled at each end) when section.layout.strategy === 'carousel'; falls back to the existing grid otherwise
- Confirmed src/app/components/items-carousel (a PrimeNG p-carousel) is dead code, not wired into any route or widget - not the source of the reported bug
New builder.* i18n keys (en/ru/hy), zero duplicate-key collisions verified via scan
2026-07-19 14:14:29 +04:00
homepageBlocksHint : 'Սրանք են բլոկները, որոնք գնորդները տեսնում են գլխավոր էջում վերևից ներքև։ Քաշեք բռնակից՝ կարգը փոխելու համար։' ,
addBlockHint : 'Ավելացնել բլոկ գլխավոր էջում.' ,
dragToReorder : 'Քաշեք՝ կարգը փոխելու համար' ,
blockRemoveConfirm : 'Հեռացնե՞լ այս բլոկը գլխավոր էջից։' ,
blockHero : 'Ողջույնի բաններ' ,
blockHeroDesc : 'Գլխավոր էջի վերևի մեծ բանները՝ վերնագրով և գործողության կոճակով։' ,
blockCategories : 'Կատեգորիաներ' ,
blockCategoriesDesc : 'Կատեգորիաների ցանց, որպեսզի գնորդները կարողանան դիտարկել բաժինները։' ,
blockFeaturedProducts : 'Առաջարկվող ապրանքներ' ,
blockFeaturedProductsDesc : 'Ընտրված կամ ամենավաճառվող ապրանքների ցանց։' ,
blockProductCarousel : 'Ապրանքների կարուսել' ,
blockProductCarouselDesc : 'Հորիզոնական ոլորվող ապրանքների շարք՝ սլաքներով ավելին դիտելու համար։' ,
blockRecentlyViewed : 'Վերջերս դիտվածներ' ,
blockRecentlyViewedDesc : 'Ցույց է տալիս յուրաքանչյուր գնորդի՝ նրա վերջերս դիտած ապրանքները։' ,
blockBanner : 'Գովազդային բաններ' ,
blockBannerDesc : 'Մեկ նկար՝ վերնագրով և կոճակով, զեղչերի կամ հայտարարությունների համար։' ,
blockPartners : 'Գործընկերների լոգոներ' ,
blockPartnersDesc : 'Բրենդի կամ գործընկերների լոգոների շարք՝ վստահության համար։' ,
blockCustomHtml : 'Սեփական բլոկ' ,
blockCustomHtmlDesc : 'Ազատ HTML այն ամենի համար, ինչ մյուս բլոկները չեն ծածկում։' ,
2026-07-09 02:29:12 +04:00
} ,
2026-07-14 12:21:33 +04:00
dashboard : {
title : 'Կառավարման վահանակ' ,
subtitle : 'Ձեր մարքեթփլեյսի ընդհանուր տեսք' ,
cardMarketplaceStatus : 'Մարքեթփլեյսի կարգավիճակ' ,
cardProjectName : 'Նախագծի անվանում' ,
cardCurrentTheme : 'Ընթացիկ թեմա' ,
cardLanguages : 'Լեզուներ' ,
cardCategoriesCount : 'Կատեգորիաներ' ,
cardProductsCount : 'Ապրանքներ' ,
cardOrders : 'Պատվերներ' ,
cardRevenue : 'Եկամուտ' ,
cardLastPublish : 'Վերջին հրապարակում' ,
cardLastDraftSave : 'Վերջին սևագրի պահպանում' ,
cardBootstrapVersion : 'Bootstrap-ի տարբերակ' ,
cardActiveLayout : 'Ակտիվ դասավորություն' ,
cardEnabledWidgets : 'Միացված վիջեթներ' ,
stateLoading : 'Բեռնվում է...' ,
stateEmpty : 'Դեռ տվյալներ չկան' ,
stateError : 'Չհաջողվեց բեռնել այս քարտը' ,
statePendingBackend : 'Սպասվում է backend ինտեգրման' ,
never : 'Երբեք' ,
quickActionsTitle : 'Արագ գործողություններ' ,
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
actionEditProject : 'Մարկետփլեյսի կոնստրուկտոր' ,
2026-07-14 12:21:33 +04:00
actionCategories : 'Կատեգորիաներ' ,
actionProducts : 'Ապրանքներ' ,
actionStaticPages : 'Ստատիկ էջեր' ,
actionTransactions : 'Գործարքներ' ,
actionOrders : 'Պատվերներ' ,
actionMediaLibrary : 'Մեդիագրադարան' ,
2026-07-15 20:25:12 +04:00
actionUsers : 'Օգտատերեր և իրավունքներ' ,
actionMonitoring : 'Մոնիտորինգ' ,
actionAnalytics : 'Վերլուծություն' ,
2026-07-14 12:21:33 +04:00
actionPreviewMarketplace : 'Դիտել մարքեթփլեյսը' ,
activityTitle : 'Վերջին ակտիվություն' ,
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
activityEmpty : 'Դեռ ակտիվություն չկա' ,
2026-07-14 12:21:33 +04:00
activityDraftSaved : 'Սևագիրը պահպանվեց' ,
activityPublished : 'Հրապարակվեց' ,
healthTitle : 'Համակարգի վիճակ' ,
healthAllClear : 'Բոլոր ստուգումներն անցել են' ,
healthBootstrapValid : 'Bootstrap-ը վավեր է' ,
healthConfigurationValid : 'Կոնֆիգուրացիան վավեր է' ,
healthMissingTranslations : 'Բացակայող թարգմանություններ' ,
healthInvalidColors : 'Անվավեր գույներ' ,
healthInvalidWidgetReferences : 'Անվավեր վիջեթ հղումներ' ,
healthInvalidLayouts : 'Անվավեր դասավորություններ' ,
comingSoonTitle : 'Շուտով' ,
comingSoonDescription : 'Այս բաժինը դեռ կառուցված չէ։ Ստուգեք ավելի ուշ։' ,
backToDashboard : 'Վերադառնալ վահանակ' ,
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 : 'Բարի վերադարձ' ,
welcomeFallbackTenant : 'Ձեր մարկետփլեյսը' ,
envProduction : 'Պրոդակշն' ,
envDevelopment : 'Մշակում' ,
factCurrentUser : 'Ընթացիկ օգտատեր' ,
factTenant : 'Խանութ' ,
quickActionsDescription : 'Ձեր ամենահաճախակի առաջադրանքները՝ սկսեք այստեղից' ,
actionAddProduct : 'Ավելացնել ապրանք' ,
actionAddProductDescription : 'Ստեղծել նոր ապրանքի քարտ' ,
actionCreateCategory : 'Ստեղծել կատեգորիա' ,
actionCreateCategoryDescription : 'Ավելացնել կատեգորիա կատալոգում' ,
actionEditProjectDescription : 'Բացել մարկետփլեյսի կոնստրուկտորը' ,
actionEditHomepage : 'Խմբագրել գլխավոր էջը' ,
actionEditHomepageDescription : 'Կարգավորել գլխավոր էջի վիջեթները' ,
actionMediaLibraryDescription : 'Վերբեռնեք և կազմակերպեք ֆայլերը' ,
actionOrdersDescription : 'Դիտեք վերջին պատվերները' ,
draftStatusTitle : 'Սևագրի կարգավիճակ' ,
draftStatusHasChanges : 'Կան չհրապարակված փոփոխություններ։' ,
draftStatusAllPublished : 'Ամեն ինչ հրապարակված է։ Սևագիր չկա։' ,
draftStatusMoreFields : '+{{count}} ևս' ,
draftOpenBuilder : 'Բացել կոնստրուկտորը' ,
draftPublish : 'Հրապարակել' ,
draftDiscard : 'Չեղարկել սևագիրը' ,
healthProductsCount : 'Ապրանքներ' ,
healthCategoriesCount : 'Կատեգորիաներ' ,
healthDraftExists : 'Սևագիր' ,
healthImagesWithoutAlt : 'Alt տեքստ չունեցող պատկերներ' ,
healthStaticPagesUnpublished : 'Չհրապարակված ստատիկ էջեր' ,
healthHomepageConfigured : 'Գլխավոր էջը կարգավորված է' ,
healthThemeConfigured : 'Թեման կարգավորված է' ,
statusHealthy : 'Կարգին է' ,
statusAttention : 'Ուշադրություն է պահանջում' ,
statusUnhealthy : 'Խնդիր' ,
statusUnknown : 'Դեռ չի հետևվում' ,
activityEmptyHint : 'Պահպանեք կամ հրապարակեք փոփոխություն՝ այն այստեղ տեսնելու համար։' ,
activityUnavailable : 'Ակտիվության պատմությունը հասանելի չէ' ,
activityUnavailableHint : 'Չհաջողվեց միանալ տվյալների աղբյուրին։ Փորձեք թարմացնել ավելի ուշ։' ,
activityErrorHint : 'Չհաջողվեց բեռնել վերջին ակտիվությունը։' ,
shortcutsTitle : 'Օգտակար հղումներ' ,
shortcutsDescription : 'Ադմին վահանակի հաճախակի օգտագործվող բաժինները' ,
shortcutMarketplaceBuilder : 'Մարկետփլեյսի կոնստրուկտոր' ,
shortcutSettings : 'Կարգավորումներ' ,
shortcutContent : 'Բովանդակություն' ,
docTitle : 'Փաստաթղթեր' ,
docDocumentation : 'Փաստաթղթեր' ,
docKeyboardShortcuts : 'Ստեղնաշարի դյուրանցումներ' ,
docReportIssue : 'Հայտնել խնդրի մասին' ,
docReleaseNotes : 'Թողարկման նշումներ' ,
2026-07-14 12:21:33 +04:00
} ,
2026-07-10 13:52:01 +04:00
staticPages : {
notFound : 'Էջը չի գտնվել' ,
backHome : 'Վերադառնալ գլխավոր' ,
duplicateSlug : 'Կրկնվող slug-երը թույլատրելի չեն։' ,
emptyTitle : 'Յուրաքանչյուր էջ պետք է ունենա առնվազն մեկ վերնագիր։' ,
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 : 'Երկու կամ ավելի էջ ունեն նույն երթուղին։' ,
invalidHtml : 'Այս էջը պարունակում է սխալ HTML բովանդակություն։' ,
invalidSeo : 'Այս էջն ունի անվավեր SEO դաշտ (canonical/OG պատկեր կամ robots արժեք)։ ' ,
searchPlaceholder : 'Փնտրել էջեր…' ,
filterAll : 'Բոլոր կարգավիճակները' ,
filterAllLocales : 'Բոլոր լեզուները' ,
confirmDeletePage : 'Ջնջե՞լ այս էջը։ Հնարավոր չէ հետարկել։' ,
confirmBulkDelete : 'Ջնջե՞լ ընտրված էջերը։ Հնարավոր չէ հետարկել։' ,
duplicatePage : 'Կրկնօրինակել' ,
selectAll : 'Ընտրել բոլորը' ,
selectedCount : 'ընտրված է' ,
bulkDelete : 'Ջնջել ընտրվածները' ,
bulkEnable : 'Միացնել ընտրվածները' ,
bulkDisable : 'Անջատել ընտրվածները' ,
bulkPublishAction : 'Հրապարակել ընտրվածները' ,
bulkUnpublish : 'Հանել հրապարակումից ընտրվածները' ,
routeLabel : 'Երթուղի' ,
enabledLabel : 'Միացված է' ,
statusLabel : 'Կարգավիճակ' ,
publishPageAction : 'Հրապարակել էջը' ,
unpublishPageAction : 'Հանել էջը հրապարակումից' ,
heroImageLabel : 'Գլխավոր պատկեր' ,
thumbnailLabel : 'Մանրապատկեր' ,
galleryLabel : 'Պատկերասրահ' ,
customTemplateLabel : 'Հատուկ ձևանմուշ' ,
seoRobotsLabel : 'Robots' ,
disabledBadge : 'Անջատված' ,
2026-07-17 10:11:31 +04:00
previewDesktop : 'Դեսքթոփ' ,
previewTablet : 'Պլանշետ' ,
previewMobile : 'Հեռախոս' ,
previewToggle : 'Նախադիտում' ,
2026-07-10 13:52:01 +04:00
} ,
2026-07-18 11:02:26 +04:00
contentManagement : {
publishedPages : 'Հրապարակված էջեր' ,
draftPages : 'Սևագրեր' ,
missingLegalPages : 'Բացակայող իրավական էջեր' ,
seoHealth : 'SEO վիճակ' ,
lastEdited : 'Վերջին փոփոխություն' ,
lastEditedNever : 'Երբեք' ,
completionLabel : 'Ավարտվածություն' ,
recommendedNext : 'Հաջորդ առաջարկվող քայլը' ,
recommendAddTitles : 'Որոշ էջեր չունեն վերնագիր առնվազն մեկ լեզվով։' ,
recommendFixSeo : 'Մի էջ ունի ուղղման կարիք ունեցող SEO դաշտ (canonical/OG պատկեր կամ robots)։ ' ,
recommendPublish : 'Պարտադիր իրավական էջը դեռ սևագիր է․ հրապարակեք այն։' ,
recommendNone : 'Հիանալի է․ բովանդակությունը լավ վիճակում է։' ,
openAction : 'Բացել' ,
backToPages : 'Վերադառնալ էջերին' ,
groupContent : 'Բովանդակություն' ,
groupSeo : 'SEO' ,
groupSharing : 'Տարածում' ,
groupAdvanced : 'Լրացուցիչ' ,
groupAdvancedHtml : 'Հում HTML (լրացուցիչ)' ,
seoExplainDesc : 'Ս ա այն է, ինչ երևում է որոնման արդյունքներում․ հստակ վերնագիրն ու նկարագրությունը օգնում են հաճախորդներին գտնել այս էջը։' ,
seoTitleHelp : 'Վերնագիրը, որ երևում է որոնման արդյունքներում։ Պահեք կարճ և հստակ։' ,
seoDescriptionHelp : 'Կարճ նկարագրություն՝ վերնագրի տակ, որոնման արդյունքներում։' ,
seoCanonicalHelp : 'Էջի պաշտոնական հասցեն՝ կրկնվող բովանդակության խնդիրներից խուսափելու համար։' ,
seoRobotsHelp : 'Կարգավորում է՝ արդյոք որոնողական համակարգերին թույլատրվում է ցուցադրել այս էջը։' ,
sharingExplain : 'Այսպես է էջը երևում սոցիալական ցանցերում կիսվելիս (Facebook, Twitter/X և այլն)։ ' ,
mediaSelect : 'Ընտրել պատկեր' ,
mediaReplace : 'Փոխարինել' ,
mediaRemove : 'Հեռացնել' ,
mediaAlt : 'Alt տեքստ' ,
mediaCaption : 'Ենթագիր' ,
emptyStateGuideTitle : 'Սկսեք ստեղծել ձեր խանութի էջերը' ,
emptyStateGuideBody : 'Իրավական էջերը՝ ինչպիսիք են Մեր մասին, Գաղտնիություն և Պայմաններ, մեծացնում են հաճախորդների վստահությունը։ Խորհուրդ ենք տալիս նախ հրապարակել Մեր մասին, Կապ, Գաղտնիություն և Պայմաններ, ապա ավելացնել Cookies, Առաքում, Վերադարձներ և ՀՏՀ։' ,
seoStatusGood : 'SEO լավ է' ,
seoStatusPartial : 'SEO մասնակի' ,
seoStatusWarning : 'SEO խնդիր' ,
seoStatusMissing : 'SEO բացակայում է' ,
needsAttention : 'Ուշադրություն է պահանջում' ,
legal : {
about : { label : 'Մեր մասին' , why : 'Ասում է հաճախորդներին, թե ով եք դուք, և վստահություն է ստեղծում գնումից առաջ։' } ,
contacts : { label : 'Կապ' , why : 'Հաճախորդներին հնարավորություն է տալիս կապվել հարցերով։' } ,
privacy : { label : 'Գաղտնիություն' , why : 'Բացատրում է, թե ինչպես են մշակվում տվյալները․ հաճախ պահանջվում է օրենքով։' } ,
terms : { label : 'Պայմաններ' , why : 'Սահմանում է խանութից օգտվելու կանոնները՝ պաշտպանելով և՛ ձեզ, և՛ հաճախորդներին։' } ,
cookies : { label : 'Cookies' , why : 'Բացահայտում է cookie-ների օգտագործումը՝ պահանջվում է շատ երկրներում։' } ,
delivery : { label : 'Առաքում' , why : 'Սահմանում է հստակ առաքման ակնկալիքներ և նվազեցնում աջակցության հարցումները։' } ,
returns : { label : 'Վերադարձներ' , why : 'Բացատրում է վերադարձի քաղաքականությունը և մեծացնում գնման վստահությունը։' } ,
faq : { label : 'ՀՏՀ' , why : 'Պատասխանում է հաճախակի հարցերին նախապես։' } ,
} ,
} ,
2026-07-09 02:29:12 +04:00
widgets : {
unavailable : 'Վիջեթը հասանելի չէ' ,
} ,
2026-02-26 23:09:20 +04:00
carousel : {
2026-03-24 00:09:11 +04:00
loading : 'Ապրանքների բեռնում...' ,
addToCart : 'Ավելացնել զամբյուղ' ,
2026-02-26 23:09:20 +04:00
} ,
common : {
2026-03-24 00:09:11 +04:00
retry : 'Փորձել կրկին' ,
loading : 'Բեռնում...' ,
2026-07-17 15:22:45 +04:00
remove : 'Հեռացնել' ,
2026-02-26 23:09:20 +04:00
} ,
2026-02-28 17:18:24 +04:00
location : {
2026-03-24 00:09:11 +04:00
allRegions : 'Բոլոր տարածաշրջանները' ,
chooseRegion : 'Ընտրեք տարածաշրջանը' ,
detectAuto : 'Որոշել ավտոմատ' ,
2026-02-28 17:18:24 +04:00
} ,
auth : {
2026-03-24 00:09:11 +04:00
loginRequired : 'Պահանջվում է մուտք' ,
loginDescription : 'Պատվերի համար մուտք գործեք Telegram-ով' ,
checking : 'Ստուգում...' ,
loginWithTelegram : 'Մուտք Telegram-ով' ,
orScanQr : 'Կամ սքանավորեք QR կոդը' ,
loginNote : 'Մուտքից հետո դուք կվերաուղղվեք' ,
2026-03-25 15:32:50 +04:00
qrExpired : 'QR կոդը հնացել է։ Սեղմեք՝ թարմացնելու համար' ,
2026-06-01 00:47:26 +04:00
qrError : 'Չհաջողվեց ստեղծել մուտքի սեսիա։ Սեղմեք՝ կրկնելու համար' ,
2026-02-28 17:18:24 +04:00
} ,
2026-07-09 01:13:54 +04:00
ux : {
items : 'ապրանք' ,
wishlistTitle : 'Ընտրյալներ' ,
wishlistEmptyTitle : 'Ընտրյալները դատարկ են' ,
wishlistEmptyDescription : 'Պահպանեք ապրանքները, որպեսզի արագ վերադառնաք դրանց։' ,
clearWishlist : 'Մաքրել ընտրյալները' ,
2026-07-09 02:29:12 +04:00
wishlistCleared : 'Ընտրյալները մաքրվել են' ,
2026-07-09 01:13:54 +04:00
compareTitle : 'Ապրանքների համեմատում' ,
compareEmptyTitle : 'Համեմատելու ապրանքներ չկան' ,
compareEmptyDescription : 'Ավելացրեք ապրանքներ կատալոգից՝ բնութագրերը և գները համեմատելու համար։' ,
clearCompare : 'Մաքրել համեմատումը' ,
2026-07-19 23:35:17 +04:00
removeFromCompare : 'Հեռացնել համեմատումից' ,
2026-07-09 01:13:54 +04:00
hideIdentical : 'Թաքցնել նույն արժեքները' ,
highlightDifferences : 'Ընդգծել տարբերությունները' ,
clearRecentlyViewed : 'Մաքրել դիտվածները' ,
recentlyViewedEmpty : 'Դուք դեռ ապրանքներ չեք դիտել։' ,
saveSearch : 'Պահպանել որոնումը' ,
goToCatalog : 'Գնալ կատալոգ' ,
2026-07-09 01:40:22 +04:00
wishlistAdded : 'Ավելացվեց ընտրյալներում' ,
wishlistRemoved : 'Հեռացվեց ընտրյալներից' ,
compareAdded : 'Ավելացվեց համեմատման մեջ' ,
compareRemoved : 'Հեռացվեց համեմատումից' ,
compareLimitReached : 'Համեմատման սահմանը հասել է ({{maxItems}})' ,
productShared : 'Ապրանքը կիսվել է' ,
productLinkCopied : 'Ապրանքի հղումը պատճենվել է' ,
sharingUnsupported : 'Այս սարքում կիսվելու հնարավորությունը չի աջակցվում' ,
2026-07-09 02:29:12 +04:00
addedToCart : 'Ավելացվեց զամբյուղում' ,
2026-07-09 01:40:22 +04:00
enterQueryBeforeSave : 'Մինչ պահպանումը մուտքագրեք որոնման հարցում' ,
savedSearchNamed : 'Պահպանված որոնում՝ {{name}}' ,
2026-07-09 02:29:12 +04:00
recentlyViewedTitle : 'Վերջին դիտվածներ' ,
compareAttribute : 'Ատրիբուտ' ,
comparePrice : 'Գին' ,
compareRating : 'Վարկանիշ' ,
compareStock : 'Առկայություն' ,
compareDiscount : 'Զեղչ' ,
compareColor : 'Գույն' ,
compareSize : 'Չափ' ,
compareUnknown : 'անհայտ' ,
2026-07-09 01:13:54 +04:00
} ,
2026-07-10 13:34:25 +04:00
diagnostics : {
title : 'Մարքեթփլեյսի ախտորոշում' ,
disabledTitle : 'Ախտորոշումը հասանելի չէ' ,
disabledDescription : 'Ախտորոշման էջը հասանելի է միայն development ռեժիմում։' ,
generatedAt : 'Ստեղծվել է {{value}}' ,
healthScore : 'Առողջության գնահատական' ,
summary : 'Ամփոփում' ,
passedChecks : '{{count}} հաջող ստուգում' ,
warnings : '{{count}} նախազգուշացում' ,
errors : '{{count}} սխալ' ,
critical : '{{count}} կրիտիկական' ,
healthChecks : 'Առողջության ստուգումներ' ,
results : 'Մանրամասն արդյունքներ' ,
noIssues : 'Ախտորոշման խնդիրներ չեն գտնվել։' ,
ok : 'Լավ' ,
failed : 'Խափանվեց' ,
affectedComponent : 'Վնասված բաղադրիչ' ,
suggestedResolution : 'Առաջարկվող լուծում' ,
severity : { info : 'Տեղեկ.' , warning : 'Զգուշ.' , error : 'Սխալ' , critical : 'Կրիտիկական' } ,
checks : {
bootstrapLoaded : 'Bootstrap բեռնված է' ,
tenantResolved : 'Tenant որոշված է' ,
runtimeInitialized : 'Runtime-ը մեկնարկված է' ,
themeLoaded : 'Թեման բեռնված է' ,
widgetManifestLoaded : 'Widget manifest-ը բեռնված է' ,
sectionEngineInitialized : 'Section Engine-ը հասանելի է' ,
configurationEngineInitialized : 'Configuration Engine-ը մեկնարկված է' ,
translationResourcesAvailable : 'Թարգմանությունները հասանելի են' ,
requiredAssetsAvailable : 'Պարտադիր assets-ը հասանելի են' ,
} ,
bootstrapMissingTitle : 'Bootstrap-ը բացակայում է' ,
bootstrapMissingDescription : 'Bootstrap կարգավորումը չի բեռնվել։' ,
bootstrapMissingResolution : 'Ստուգեք bootstrap provider-ը և local mock-ը։' ,
requiredPropertyMissingTitle : 'Պարտադիր հատկությունը բացակայում է' ,
requiredPropertyMissingDescription : 'Bootstrap-ում պարտադիր հատկություն չկա։' ,
requiredPropertyMissingResolution : 'Ավելացրեք հատկությունը bootstrap payload-ում։' ,
unknownWidgetTypeTitle : 'Անհայտ widget type' ,
unknownWidgetTypeDescription : 'Widget type-ը չկա widget manifest-ում։' ,
unknownWidgetTypeResolution : 'Ավելացրեք widget-ը manifest-ում կամ հեռացրեք սխալ config-ը։' ,
duplicateIdTitle : 'Կրկնվող ID' ,
duplicatePageIdDescription : 'Գտնվել է կրկնվող page id։ ' ,
duplicateSectionIdDescription : 'Գտնվել է կրկնվող section id։ ' ,
duplicateWidgetIdDescription : 'Գտնվել է կրկնվող widget id։ ' ,
duplicateIdResolution : 'Bootstrap config-ում ID-ները դարձրեք եզակի։' ,
unknownLayoutTitle : 'Անհայտ layout' ,
unknownLayoutDescription : 'Էջի layout արժեքը ճանաչված չէ։' ,
unknownLayoutResolution : 'Օգտագործեք աջակցվող layout կամ ընդլայնեք allow-list-ը։' ,
invalidFeatureFlagTitle : 'Սխալ feature flag' ,
invalidFeatureFlagDescription : 'Feature flag արժեքը պետք է boolean լինի։' ,
invalidFeatureFlagResolution : 'Նորմալացրեք արժեքը true կամ false։ ' ,
brokenPageDefinitionTitle : 'Կոտրված page definition' ,
brokenPageDefinitionDescription : 'Էջի նկարագրությունը թերի է։' ,
brokenPageDefinitionResolution : 'Ավելացրեք route, title, key կամ sections։ ' ,
invalidNavigationTargetTitle : 'Սխալ navigation target' ,
invalidNavigationTargetDescription : 'Navigation route-ը չի համընկնում հայտնի route-ների հետ։' ,
invalidNavigationTargetResolution : 'Թարմացրեք route target-ը կամ ավելացրեք route։ ' ,
missingTranslationTitle : 'Թարգմանությունը բացակայում է' ,
missingTranslationDescription : 'Թարգմանության key-ը չի թարգմանվում։' ,
missingTranslationResolution : 'Ավելացրեք key-ը translation resources-ում։' ,
missingMediaTitle : 'Media-ն բացակայում է' ,
missingMediaDescription : 'Սպասվող branding media-ն բացակայում է։' ,
missingMediaResolution : 'Տրամադրեք ճիշտ media URL-ներ branding config-ում։' ,
runtimeNotInitializedTitle : 'Runtime-ը մեկնարկված չէ' ,
runtimeNotInitializedDescription : 'Platform runtime state-ը initialized չէ։' ,
runtimeNotInitializedResolution : 'Ստուգեք PlatformRuntimeService initialize շղթան։' ,
configFallbackUsageTitle : 'Օգտագործվում է fallback config' ,
configFallbackUsageDescription : 'Development runtime-ը օգտագործում է fallback կամ mock config։ ' ,
configFallbackUsageResolution : 'Փոխեք provider mode-ը, եթե պետք է իրական bootstrap ստուգում։' ,
missingDatasourceTitle : 'Datasource-ը բացակայում է' ,
missingDatasourceDescription : 'Widget-ը աջակցում է datasource, բայց այն նշված չէ։' ,
missingDatasourceResolution : 'Նշեք source widget props-ում կամ manifest default settings-ում։' ,
widgetRenderFailureTitle : 'Widget render failure' ,
widgetRenderFailureDescription : 'Widget-ը անցել է unknown widget renderer-ի։' ,
widgetRenderFailureResolution : 'Գրանցեք widget component-ը կամ ուղղեք manifest component key-ը։' ,
brokenRouteTitle : 'Կոտրված route սպասում' ,
brokenRouteDescription : 'Սպասվող route-ը բացակայում է։' ,
brokenRouteResolution : 'Վերականգնեք route registration-ը կամ թարմացրեք diagnostics կանոնը։' ,
imageLoadFailedTitle : 'Նկարի բեռնումը ձախողվեց' ,
imageLoadFailedDescription : 'Արտապատկերվող նկարը չի բեռնվել։' ,
imageLoadFailedResolution : 'Ստուգեք asset path-ը, CORS-ը և media հասանելիությունը։' ,
optionalDataMissingTitle : 'Optional data բացակայում է' ,
optionalDataMissingDescription : 'Optional config արժեքը բացակայում է։' ,
optionalDataMissingResolution : 'Ավելացրեք արժեքը, եթե UX-ը կախված է դրանից։' ,
} ,
feat(admin): implement review and moderation center
New Reviews & Moderation feature (frontend only): moderation dashboard (real pending/approved/rejected/reported/spam counts, average rating, recent activity, moderation-health%, computed from the full review queue); reviews list with table/cards, density, saved column visibility, search/status/rating filters, bulk approve/reject/spam/hide/export; review detail shows customer/product/rating/text/photos/timeline/moderator-notes with a real moderation workflow (approve/reject/spam/hide/restore/pin/feature, feature disabled with an explanation unless the review is approved); reusable ReviewHealthWidget (rating/text/media/moderated/report-status/visible + completion%); reports queue lists reports against products/reviews/customers/categories with resolve/dismiss, and honestly renders 'Not available yet' rather than fabricating a value wherever a target can't be resolved (e.g. photos, customer-target reports). Backed by a new in-memory AdminModerationLocalGateway seeded from real product data - the same mock-gateway pattern already used by every other admin feature in this app (orders/products/categories), since no review/report backend exists to reuse. Replaced the 'Reviews' comingSoon nav placeholder with a working link; added full adminModeration i18n coverage.
2026-07-18 22:01:16 +04:00
adminModeration : {
search : 'Փնտրել ըստ հաճախորդի, ապրանքի կամ կարծիքի տեքստի…' ,
allStatuses : 'Բոլոր կարգավիճակները' ,
allRatings : 'Բոլոր գնահատականները' ,
rating : 'Գնահատական' ,
customer : 'Հաճախորդ' ,
product : 'Ապրանք' ,
reviewText : 'Կարծիք' ,
photos : 'Լուսանկարներ' ,
workflow : 'Գործողություններ' ,
approve : 'Հաստատել' ,
reject : 'Մերժել' ,
markSpam : 'Նշել որպես սպամ' ,
hide : 'Թաքցնել' ,
restore : 'Վերականգնել' ,
pin : 'Ամրացնել' ,
unpin : 'Հանել ամրացումը' ,
feature : 'Առանձնացնել' ,
unfeature : 'Հանել առանձնացումը' ,
featureDisabledHint : 'Առանձնացնել կարելի է միայն հաստատված կարծիքները։' ,
moderatorNotes : 'Մոդերատորի նշումներ' ,
notAvailable : 'Դեռ հասանելի չէ' ,
changeStatus : 'Փոխել կարգավիճակը' ,
hideSelected : 'Թաքցնել' ,
archiveSelected : 'Արխիվացնել' ,
reportsQueue : 'Բողոքների հերթ' ,
reportsColumn : 'Բողոքներ' ,
reportTarget : 'Բողոքարկված օբյեկտ' ,
reportType : 'Տեսակ' ,
reportReason : 'Պատճառ' ,
resolve : 'Լուծված' ,
dismiss : 'Մերժել' ,
reportsEmptyTitle : 'Բողոքներ չկան' ,
reportsEmptyDescription : 'Հաճախորդների բողոքները ապրանքների, կարծիքների կամ հաշիվների վերաբերյալ կհայտնվեն այստեղ։' ,
reportedCount : 'Բողոքարկված' ,
averageRating : 'Միջին գնահատական' ,
moderationHealth : 'Մոդերացիայի վիճակ' ,
emptyTitle : 'Կարծիքներ դեռ չկան' ,
emptyDescription : 'Կարծիքները կհայտնվեն այստեղ հաճախորդների առաջին գնահատականներից հետո։' ,
emptyGuide : 'Հաճախորդները թողնում են աստղանիշ գնահատական և տեքստ գնումից հետո։ Նոր կարծիքները ստանում են «Սպասման մեջ» կարգավիճակ, մինչև մոդերատորը հաստատի, մերժի կամ նշի որպես սպամ․ հաստատված կարծիքները դառնում են տեսանելի խանութում։ Փորձեք պարբերաբար մշակել սպասման հերթը։' ,
healthRating : 'Գնահատական' ,
healthText : 'Տեքստ' ,
healthMedia : 'Մեդիա' ,
healthModeration : 'Մոդերացված' ,
healthReportStatus : 'Բաց բողոքներ չկան' ,
healthVisibility : 'Տեսանելի է' ,
health : 'Վիճակ' ,
column_product : 'Ապրանք' ,
column_rating : 'Գնահատական' ,
column_status : 'Կարգավիճակ' ,
column_reports : 'Բողոքներ' ,
column_created : 'Ուղարկված է' ,
status : {
pending : 'Սպասման մեջ' ,
approved : 'Հաստատված' ,
rejected : 'Մերժված' ,
spam : 'Սպամ' ,
} ,
targetType : {
product : 'Ապրանք' ,
review : 'Կարծիք' ,
customer : 'Հաճախորդ' ,
category : 'Կատեգորիա' ,
unknown : 'Անհայտ' ,
} ,
reportStatus : {
open : 'Բաց' ,
resolved : 'Լուծված' ,
dismissed : 'Մերժված' ,
} ,
} ,
2026-07-18 21:47:54 +04:00
adminOrders : {
back : 'Վերադառնալ պատվերներին' ,
search : 'Փնտրել ըստ պատվերի համարի, անվան, էլ. փոստի կամ հեռախոսի…' ,
export : 'Արտահանել' ,
view : 'Դիտել' ,
orderNumber : 'Պատվեր' ,
customer : 'Հաճախորդ' ,
payment : 'Վճարում' ,
delivery : 'Առաքում' ,
trackingNumber : 'Հետևման համար' ,
createdAt : 'Ստեղծված է' ,
items : 'Ապրանքներ' ,
timeline : 'Ժամանակագրություն' ,
notes : 'Նշումներ հաճախորդի համար' ,
internalNotes : 'Ներքին նշումներ' ,
addNote : 'Ավելացնել նշում' ,
changeStatus : 'Փոխել կարգավիճակը' ,
applyStatus : 'Կիրառել' ,
archiveSelected : 'Արխիվացնել' ,
printSelected : 'Տպել' ,
printInvoice : 'Տպել հաշիվ-ապրանքագիրը' ,
requestRefund : 'Հայցել վերադարձ' ,
cancelOrder : 'Չեղարկել պատվերը' ,
confirmCancel : 'Չեղարկե՞լ այս պատվերը։' ,
confirmRefund : 'Հայցե՞լ վերադարձ այս պատվերի համար։' ,
emptyTitle : 'Պատվերներ դեռ չկան' ,
emptyDescription : 'Պատվերները կհայտնվեն այստեղ հաճախորդների գնումներից հետո։' ,
column_customer : 'Հաճախորդ' ,
column_status : 'Կարգավիճակ' ,
column_payment : 'Վճարում' ,
column_total : 'Գումար' ,
column_created : 'Ստեղծված է' ,
status : {
2026-07-19 23:04:51 +04:00
all : 'Բոլոր կարգավիճակները' ,
2026-07-18 21:47:54 +04:00
pending : 'Սպասման մեջ' ,
processing : 'Փաթեթավորում' ,
shipped : 'Առաքվում է' ,
delivered : 'Ավարտված' ,
cancelled : 'Չեղարկված' ,
refunded : 'Վերադարձված' ,
} ,
paymentStatus : {
unpaid : 'Չվճարված' ,
paid : 'Վճարված' ,
refund_requested : 'Հայցվել է վերադարձ' ,
refunded : 'Վերադարձված' ,
} ,
ordersToday : 'Այսօրվա պատվերներ' ,
paidCount : 'Վճարված' ,
customersCount : 'Հաճախորդներ' ,
returningCustomers : 'Կրկնվող հաճախորդներ' ,
averageOrder : 'Միջին պատվեր' ,
recentActivity : 'Վերջին ակտիվությունը' ,
noRecentActivity : 'Ակտիվություն դեռ չկա։' ,
alertStuckPending : 'պատվեր սպասման մեջ է 48 ժամից ավելի' ,
alertRefundRequested : 'պատվեր սպասում է վերադարձի հայցի' ,
} ,
adminCustomers : {
search : 'Փնտրել ըստ անվան, էլ. փոստի կամ հեռախոսի…' ,
name : 'Անուն' ,
email : 'Էլ. փոստ' ,
phone : 'Հեռախոս' ,
orderCount : 'Պատվերներ' ,
lifetimeValue : 'Ընդհանուր գնումների գումար' ,
returning : 'Կրկնվող' ,
profile : 'Պրոֆիլ' ,
statistics : 'Վիճակագրություն' ,
firstOrder : 'Առաջին պատվեր' ,
lastOrder : 'Վերջին պատվեր' ,
addresses : 'Հասցեներ' ,
notes : 'Նշումներ' ,
notesUnavailable : 'Հաճախորդի մակարդակի նշումներ դեռ չկան․ ավելացրեք նշում նրա որևէ պատվերի վրա։' ,
orders : 'Պատվերներ' ,
activity : 'Ակտիվություն' ,
emptyTitle : 'Հաճախորդներ դեռ չկան' ,
emptyDescription : 'Հաճախորդները կհայտնվեն այստեղ առաջին պատվերից հետո։' ,
} ,
feat(media): add Media Manager UI (grid, upload, delete)
MediaLibraryPageComponent replaces the coming-soon placeholder at
/backoffice/media. Built entirely on Sprint 6 Design System primitives
(app-card, app-button, app-input, app-empty-state, app-dialog, app-pagination,
app-skeleton) and Sprint 4 Task 2's MediaRepository/MockMediaRepository.
- Grid view with per-tile filename/size and delete action
- Hidden native file input triggered by an app-button, uploads via
MediaLibraryFacade -> MediaRepository.upload()
- Delete requires confirmation through app-dialog (destructive action)
- Search + pagination wired to MockMediaRepository's list() params
- Loading state shows app-skeleton tiles; empty state shows app-empty-state
- New mediaLibrary.* translation namespace across en/ru/hy
Verified in browser (via a temporary unguarded route, reverted before
commit - /backoffice/media itself requires Telegram QR admin auth not
available in this session): empty state renders correctly with translated
copy, search input and upload button present, no console errors.
2026-07-15 07:14:16 +04:00
mediaLibrary : {
title : 'Մեդիագրադարան' ,
upload : 'Վերբեռնել' ,
uploading : 'Վերբեռնվում է...' ,
searchPlaceholder : 'Փնտրել ֆայլեր...' ,
delete : 'Ջնջել' ,
deleteConfirmTitle : 'Ջնջե՞լ ֆայլը' ,
deleteConfirmBody : 'Այս գործողությունը հնարավոր չէ հետարկել։' ,
cancel : 'Չեղարկել' ,
confirm : 'Ջնջել' ,
emptyTitle : 'Ֆայլեր դեռ չկան' ,
emptyDescription : 'Վերբեռնեք պատկեր կամ փաստաթուղթ սկսելու համար։' ,
feat(builder): implement reusable media library
Media dashboard (real total/images/SVG/logos/unused/storage/alt-coverage, computed from actual assets + a bootstrap usage scan, no fabricated stats); gallery gets grid/list toggle, type filter, sort, drag-and-drop + multi-file upload with cancel/retry and friendly error mapping, lazy thumbnails, multi-select with bulk delete/download/export-metadata; asset details drawer shows real dimensions/size/format/date/usage locations (walks bootstrap config for exact URL matches, reports not-used rather than guessing) plus editable alt text/caption/description/decorative flag with missing-alt warning; shared MediaPickerComponent (already the one reusable picker used by content management) gains type filter, a recent shortcut, and keyboard grid navigation.
2026-07-18 16:09:47 +04:00
allFolders : 'Բոլոր պանակները' ,
newFolder : 'Նոր պանակ' ,
editTags : 'Խմբագրել պիտակները' ,
totalAssets : 'Ընդհանուր ֆայլեր' ,
logos : 'Լոգոներ' ,
unused : 'Չօգտագործվող' ,
storageUsed : 'Օգտագործված տարածք' ,
altCoverage : 'Alt տեքստի ծածկույթ' ,
allTypes : 'Բոլոր տեսակները' ,
typeImage : 'Պատկերներ' ,
typeSvg : 'SVG' ,
typePdf : 'PDF' ,
sortRecent : 'Վերջին' ,
sortName : 'Անուն' ,
sortSize : 'Չափ' ,
viewMode : 'Տեսք' ,
viewGrid : 'Ցանց' ,
viewList : 'Ցուցակ' ,
dropHint : 'Քաշեք և գցեք պատկերները այստեղ, կամ օգտագործեք վերևի «Վերբեռնել» կոճակը։' ,
cancelUpload : 'Չեղարկել' ,
retry : 'Կրկնել' ,
errorTooLarge : 'Ֆայլը չափազանց մեծ է։ Փորձեք ավելի փոքր ֆայլ։' ,
errorUnsupportedType : 'Այս ֆայլի տեսակը չի աջակցվում։ Օգտագործեք JPG, PNG, WebP, GIF, SVG կամ PDF։ ' ,
errorGeneric : 'Վերբեռնումը ձախողվեց։ Փորձեք կրկին։' ,
selectedCount : 'ընտրված է' ,
download : 'Ներբեռնել' ,
exportMetadata : 'Արտահանել մետատվյալները' ,
bulkDelete : 'Ջնջել ընտրվածները' ,
bulkDeleteConfirm : 'Ջնջե՞լ ընտրված ֆայլերը։ Հնարավոր չէ հետարկել։' ,
clearSelection : 'Չեղարկել ընտրությունը' ,
guideCopy : 'Առկա ֆայլի կրկնակի օգտագործումը խուսափում է կրկնօրինակումներից և խնայում է տարածք։ Հերոս/բաններ նկարների համար խորհուրդ ենք տալիս մոտ 1200× 1200px չափս և սեղմել մեծ լուսանկարները վերբեռնելուց առաջ։' ,
missingAlt : 'Alt տեքստը բացակայում է' ,
usageCount : 'օգտ.' ,
detailsTitle : 'Ֆայլի մանրամասներ' ,
filename : 'Ֆայլի անուն' ,
format : 'Ձևաչափ' ,
fileSize : 'Ֆայլի չափ' ,
dimensions : 'Չափսեր' ,
uploadDate : 'Վերբեռնված է' ,
lastUsed : 'Վերջին օգտագործում' ,
usageCountLabel : 'Օգտագործումների քանակ' ,
usedIn : 'Օգտագործվում է' ,
notUsed : 'Այս պահին ոչ մի տեղ չի օգտագործվում։' ,
unknownValue : 'Անհայտ' ,
altText : 'Alt տեքստ' ,
altTextHelp : 'Նկարագրում է պատկերը էկրանընթերցողների և որոնողական համակարգերի համար։' ,
decorative : 'Դեկորատիվ (alt տեքստ պետք չէ)' ,
missingAltWarning : 'Այս պատկերը չունի alt տեքստ և նշված չէ որպես դեկորատիվ․ էկրանընթերցող օգտագործողները չեն իմանա, թե ինչ է պատկերված։' ,
caption : 'Ենթագիր' ,
description : 'Նկարագրություն' ,
usage : {
brand : 'Լոգո' ,
theme : 'Թեմա' ,
header : 'Վերնագիր' ,
footer : 'Ստորագիր' ,
staticPage : 'Ստատիկ էջ' ,
homepage : 'Գլխավոր էջ' ,
catalog : 'Կատալոգ' ,
productPage : 'Ապրանքի էջ' ,
widget : 'Վիջեթ' ,
company : 'Ընկերության տվյալներ' ,
seo : 'SEO' ,
navigation : 'Նավիգացիա' ,
other : 'Այլ' ,
} ,
feat(media): add Media Manager UI (grid, upload, delete)
MediaLibraryPageComponent replaces the coming-soon placeholder at
/backoffice/media. Built entirely on Sprint 6 Design System primitives
(app-card, app-button, app-input, app-empty-state, app-dialog, app-pagination,
app-skeleton) and Sprint 4 Task 2's MediaRepository/MockMediaRepository.
- Grid view with per-tile filename/size and delete action
- Hidden native file input triggered by an app-button, uploads via
MediaLibraryFacade -> MediaRepository.upload()
- Delete requires confirmation through app-dialog (destructive action)
- Search + pagination wired to MockMediaRepository's list() params
- Loading state shows app-skeleton tiles; empty state shows app-empty-state
- New mediaLibrary.* translation namespace across en/ru/hy
Verified in browser (via a temporary unguarded route, reverted before
commit - /backoffice/media itself requires Telegram QR admin auth not
available in this session): empty state renders correctly with translated
copy, search input and upload button present, no console errors.
2026-07-15 07:14:16 +04:00
} ,
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
adminCategories : {
chooseImage : 'Ընտրել պատկեր' ,
2026-07-17 15:22:45 +04:00
replaceImage : 'Փոխարինել պատկերը' ,
2026-07-18 17:04:11 +04:00
search : 'Փնտրել կատեգորիաներ…' ,
showDeleted : 'Ցույց տալ ջնջվածները' ,
create : 'Ստեղծել կատեգորիա' ,
edit : 'Խմբագրել կատեգորիան' ,
title : 'Անուն' ,
slug : 'URL հասցե' ,
slugTaken : 'Այս հասցեն արդեն օգտագործվում է այլ կատեգորիայի կողմից։' ,
parent : 'Ծնող կատեգորիա' ,
noParent : 'Առանց ծնողի (վերին մակարդակ)' ,
icon : 'Պատկերակ' ,
image : 'Պատկեր' ,
imageHint : 'Ցուցադրվում է կատեգորիաների ցանկերում և նավիգացիայում։' ,
description : 'Նկարագրություն' ,
items : 'ապրանք' ,
status : { draft : 'Սևագիր' , published : 'Հրապարակված' } ,
restore : 'Վերականգնել' ,
saveDraft : 'Պահպանել սևագիրը' ,
publish : 'Հրապարակել' ,
confirmDelete : 'Ջնջե՞լ այս կատեգորիան։ Հնարավոր չէ հետարկել։' ,
confirmLeaveUnsaved : 'Դուք ունեք չպահպանված փոփոխություններ։ Դո՞ւրս գալ առանց պահպանելու։' ,
deleteBlocked : 'Այս կատեգորիան հնարավոր չէ ջնջել, քանի դեռ ունի ենթակատեգորիաներ կամ նշանակված ապրանքներ։' ,
emptyTitle : 'Կատեգորիաներ դեռ չկան' ,
emptyDescription : 'Ստեղծեք առաջին կատեգորիան՝ ապրանքները կազմակերպելու համար։' ,
emptyGuide : 'Կատեգորիաները օգնում են հաճախորդներին գտնել ապրանքներ։ Սկսեք մի քանի լայն վերին մակարդակի կատեգորիաներից (օր․՝ Հագուստ, Էլեկտրոնիկա), ապա ավելացրեք ենթակատեգորիաներ՝ կատալոգի աճին զուգահեռ․ խուսափեք 2-3 մակարդակից ավելի խորությունից։' ,
viewTree : 'Ծառ' ,
viewCards : 'Քարտեր' ,
expandAll : 'Ընդարձակել բոլորը' ,
collapseAll : 'Ծալել բոլորը' ,
expandNode : 'Ընդարձակել' ,
collapseNode : 'Ծալել' ,
jumpToParent : 'Անցնել ծնողին' ,
deletedBadge : 'Ջնջված' ,
column_slug : 'Հասցե' ,
column_items : 'Ապրանքներ' ,
column_status : 'Կարգավիճակ' ,
column_visibility : 'Տեսանելիություն' ,
column_updated : 'Վերջին փոփոխություն' ,
bulkAssignParent : 'Նշանակել ծնող' ,
bulkAssignImage : 'Նշանակել պատկեր' ,
groupGeneral : 'Հիմնական' ,
groupMedia : 'Մեդիա' ,
groupSeo : 'SEO' ,
groupVisibility : 'Տեսանելիություն' ,
groupNavigation : 'Նավիգացիա' ,
groupAttributes : 'Հատկանիշներ' ,
groupAdvanced : 'Լրացուցիչ' ,
visibilityExplain : 'Թաքցված կատեգորիան և դրա ապրանքները չեն երևում խանութի նավիգացիայում և որոնման մեջ, մինչև այն նորից տեսանելի դարձնեք։' ,
navBreadcrumb : 'Ուղենիշ' ,
2026-07-19 08:35:18 +04:00
navBreadcrumbHint : 'Ս ա այն ուղին է, որը գնորդները տեսնում են կատեգորիայի վերևում, օր.՝ Գլխավոր › Էլեկտրոնիկա › Հեռախոսներ։ Այն կառուցվում է ընտրված ծնող կատեգորիայից։' ,
iconHint : 'Փոքր էմոջի կամ նշան կատեգորիայի անվան կողքին մենյուում, օր.՝ 📱։ Թողեք դատարկ, եթե պետք չէ։' ,
2026-07-18 17:04:11 +04:00
navRoot : 'Ս ա վերին մակարդակի կատեգորիա է։' ,
navChildren : 'Ենթակատեգորիաներ' ,
navNoChildren : 'Ենթակատեգորիաներ դեռ չկան։' ,
navAppearsIn : 'Որտեղ է երևում' ,
navAppearsVisible : 'Տեսանելի է կատալոգի նավիգացիայում և որոնման մեջ։' ,
navAppearsHidden : 'Թաքցված է․ չի երևում կատալոգի նավիգացիայում, քանի դեռ թաքցված է։' ,
itemsCountLabel : 'Նշանակված ապրանքներ' ,
createdAtLabel : 'Ստեղծված է' ,
healthImage : 'Պատկեր' ,
healthSeo : 'SEO' ,
healthDescription : 'Նկարագրություն' ,
healthParent : 'Ծնող' ,
healthVisibility : 'Տեսանելիություն' ,
healthProducts : 'Նշանակված ապրանքներ' ,
totalCategories : 'Ընդհանուր կատեգորիաներ' ,
visibleCount : 'Տեսանելի' ,
hiddenCount : 'Թաքցված' ,
emptyCount : 'Դատարկ' ,
rootCount : 'Արմատային կատեգորիաներ' ,
subCount : 'Ենթակատեգորիաներ' ,
missingImagesCount : 'Առանց պատկերի' ,
missingSeoCount : 'Առանց SEO-ի' ,
lastModified : 'Վերջին փոփոխություն' ,
lastModifiedNever : 'Երբեք' ,
completionLabel : 'Ավարտվածություն' ,
recommendedNext : 'Հաջորդ առաջարկվող քայլը' ,
recommendAddImage : 'Կատեգորիան պատկեր չունի․ ավելացրեք մեկը՝ վստահելիության համար։' ,
recommendAddSeo : 'Կատեգորիան չունի որոնման վերնագիր կամ նկարագրություն․ ավելացրեք դրանք։' ,
recommendFillEmpty : 'Կատեգորիան ապրանքներ չունի․ ավելացրեք ապրանքներ կամ թաքցրեք այն։' ,
recommendNone : 'Հիանալի է․ կատեգորիաների կառուցվածքը լավ վիճակում է։' ,
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
} ,
2026-07-16 00:19:41 +04:00
adminProducts : {
emptyTitle : 'Ապրանքներ չեն գտնվել' ,
emptyDescription : 'Փոխեք ֆիլտրերը կամ ստեղծեք նոր ապրանք։' ,
feat(products): implement professional product management experience
Products dashboard (real total/published/drafts/out-of-stock/hidden/missing-images/missing-SEO/low-quality counts, recently-edited list, recommended next action); list gains table/grid view toggle, density, saved column visibility and saved sort (persisted via LocalStorageService), plus real bulk assign-category/assign-tags/duplicate/CSV-export alongside existing publish/hide/delete; per-row and per-editor reusable ProductHealthWidget (images/SEO/price/category/description/inventory checklist + completion %); editor reorganized into General/Media/Pricing/Inventory/Categories/Attributes/SEO/Visibility/Advanced tabs, media now uses the shared MediaPickerComponent/ImageFieldComponent (primary image + reorderable gallery) instead of raw URL textareas, specifications/attributes/variants moved off pipe-delimited textareas onto the shared KeyValueEditorComponent, SEO tab explains fields in plain language with a live search-result preview, inventory relabeled in business language, toggles/badges use the shared Toggle/Badge components. Filled in the adminProducts i18n namespace (previously ~98% missing, rendering raw translation keys) across en/ru/hy.
2026-07-18 16:34:06 +04:00
emptyGuide : 'Լավ ապրանքին բավական է հստակ վերնագիր, առնվազն մեկ լուսանկար, գին և կարճ նկարագրություն՝ հրապարակելու համար։ Մնացածը կարող եք ավելացնել հետո։' ,
search : 'Փնտրել ապրանքներ…' ,
category : 'Կատեգորիա' ,
allCategories : 'Բոլոր կատեգորիաները' ,
visibility : 'Տեսանելիություն' ,
allVisibility : 'Ցանկացած տեսանելիություն' ,
visible : 'Տեսանելի' ,
hidden : 'Թաքցված' ,
stockStatus : 'Պահեստի կարգավիճակ' ,
allStock : 'Ցանկացած մնացորդ' ,
inStock : 'Առկա է' ,
lowStock : 'Քիչ է մնացել' ,
outOfStock : 'Առկա չէ' ,
sortTitle : 'Անուն' ,
sortPrice : 'Գին' ,
sortPriority : 'Առաջնահերթություն' ,
sortStock : 'Մնացորդ' ,
sortUpdated : 'Վերջին փոփոխություն' ,
showArchived : 'Ցույց տալ արխիվայինները' ,
infiniteScroll : 'Անվերջ ոլորում' ,
viewMode : 'Տեսք' ,
viewTable : 'Աղյուսակ' ,
viewGrid : 'Ցանց' ,
density : 'Խտություն' ,
densityComfortable : 'Հարմարավետ' ,
densityCompact : 'Կոմպակտ' ,
columns : 'Սյունակներ' ,
column_sku : 'SKU' ,
column_brand : 'Ապրանքանիշ' ,
column_price : 'Գին' ,
column_stock : 'Մնացորդ' ,
column_visibility : 'Տեսանելիություն' ,
column_updated : 'Վերջին փոփոխություն' ,
create : 'Ստեղծել ապրանք' ,
edit : 'Խմբագրել ապրանքը' ,
duplicate : 'Կրկնօրինակել' ,
selectedCount : 'ընտրված է' ,
bulkShow : 'Հրապարակել' ,
bulkHide : 'Թաքցնել' ,
bulkAssignCategory : 'Նշանակել կատեգորիա' ,
bulkAssignTags : 'Նշանակել պիտակներ' ,
bulkDuplicateAction : 'Կրկնօրինակել' ,
bulkExportAction : 'Արտահանել' ,
bulkDelete : 'Ջնջել' ,
tagsPlaceholder : 'օր․՝ ամառ, զեղչ' ,
name : 'Անուն' ,
brand : 'Ապրանքանիշ' ,
healthColumn : 'Որակ' ,
actions : 'Գործողություններ' ,
archive : 'Արխիվացնել' ,
delete : 'Ջնջել' ,
items : 'ապրանք' ,
loadMore : 'Բեռնել ավելին' ,
noImage : 'Առանց պատկերի' ,
slug : 'URL հասցե' ,
barcode : 'Շտրիխկոդ' ,
priority : 'Առաջնահերթություն' ,
shortDescription : 'Կարճ նկարագրություն' ,
translations : 'Թարգմանություններ' ,
primaryImage : 'Հիմնական պատկեր' ,
primaryImageHint : 'Հիմնական լուսանկարը, որ երևում է ցանկերում և որոնման արդյունքներում։' ,
gallery : 'Պատկերասրահ' ,
galleryHint : 'Լրացուցիչ լուսանկարներ ապրանքի էջում։ Կարգը փոխեք սլաքներով։' ,
moveLeft : 'Տեղափոխել ավելի վաղ' ,
moveRight : 'Տեղափոխել ավելի ուշ' ,
videos : 'Տեսանյութեր (մեկ հղում մեկ տողում)' ,
discount : 'Զեղչ %' ,
currency : 'Արժույթ' ,
stockQuantity : 'Պահեստի քանակ' ,
stockQuantityHint : 'Քանի հատ է հասանելի վաճառքի համար հենց հիմա։' ,
availabilityStatus : 'Հասանելիություն' ,
availabilityStatusHint : 'Ինչ է տեսնում հաճախորդը՝ առկա է, քիչ է մնացել, թե առկա չէ։' ,
availabilityNote : 'Հասանելիության նշում' ,
availabilityNoteHint : 'Լրացուցիչ մանրամասն հաճախորդի համար, օր․՝ «Առաքում 3 օրում»։' ,
reservedNote : 'Ամրագրված պաշարը դեռ առանձին չի հաշվառվում․ այստեղ ցուցադրվում է ընդհանուր հասանելի քանակը։' ,
relatedProducts : 'Առնչվող ապրանքներ' ,
specifications : 'Բնութագրեր' ,
attributes : 'Հատկանիշներ' ,
addRow : 'Ավելացնել տող' ,
removeRow : 'Հեռացնել' ,
rowKey : 'Անուն' ,
rowValue : 'Արժեք' ,
addVariant : 'Ավելացնել տարբերակ' ,
variantName : 'Տարբերակի անուն' ,
variantsHint : 'Յուրաքանչյուր տարբերակ այս ապրանքի առանձին գնվող տարբերակ է (օր․՝ չափս կամ գույն)՝ իր գնով և մնացորդով։' ,
2026-07-18 22:44:39 +04:00
variants : 'Տարբերակներ' ,
feat(admin): Shopify-style variant attributes matching production data shape
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
P0 user feedback: variants were just free-text name+price, and the user shared the real production payload - a flat array of {color, size, price, currency, remaining} rows, colors as '0x8B4513' hex.
- New model: AdminProductVariantAttributeDef (key/label/isColor/values) + AdminProductVariant (attributes: Record<string,string>, sku, image, remaining, prices: {currency,price}[]) - this IS the production shape, grouped by combo with one row per currency instead of flattened, so admins edit one variant card instead of 4 duplicate rows
- Attribute manager: add custom attributes (Color, Size, or anything), color attributes get a native color picker + live swatch preview instead of typing hex; other attributes get plain value chips
- 'Generate variants' computes the cartesian product of attribute values (Color x Size = 4 combos for 1 color x 4 sizes) and preserves existing sku/price/stock data for combos that still exist after regeneration
- Multi-currency pricing per variant (matches prod: same combo priced in RUB/USD/EUR/AMD) with per-currency add/remove
- Color hex kept in the exact '0x8B4513' production format (toBackendColor/toCssColor conversion helpers)
- Fixed an Angular v21 control-flow parser bug hit while building this: an @if/@else block whose only content is a bare {{ interpolation }} touching the block's closing brace fails to parse (NG5002 'Unclosed block for' cascading from a completely unrelated line) - worked around by keeping interpolation in its own element
- Verified end-to-end in browser: added Color (color picker) + Size (S/M/L/XL) attributes, generated 4 variant combos, added all 4 currencies to a variant - matches the shared production JSON exactly
2026-07-19 13:40:51 +04:00
variantAttributes : 'Ընտրանքներ' ,
variantAttributesHint : 'Ավելացրեք ընտրանքներ, օրինակ՝ Գույն կամ Չափս, ապա նշեք արժեքները։ Ստորև զուգակցումները ստեղծվում են ինքնաշխատ։' ,
colorAttribute : 'Գույն' ,
removeAttribute : 'Հեռացնել ընտրանքը' ,
removeValue : 'Հեռացնել արժեքը' ,
pickColor : 'Ընտրել գույնը' ,
newValuePlaceholder : 'օր.՝ Փոքր' ,
addValue : 'Ավելացնել' ,
newAttributePlaceholder : 'օր.՝ Չափս' ,
addAttribute : 'Ավելացնել ընտրանք' ,
generateVariants : 'Գեներացնել տարբերակները' ,
variantsList : 'Տարբերակներ' ,
remaining : 'Պաշար' ,
variantImage : 'Նկար' ,
2026-07-18 22:44:39 +04:00
archived : 'Արխիվում' ,
feat(admin): product editor auto-slug, SKU helper, one-click SEO fill
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
P0 user feedback: admins did not know what SKU means, had to hand-write slugs, and left SEO empty.
- Name edits now derive the URL slug automatically (supports Cyrillic/Armenian characters); the derivation stops the moment the slug no longer matches the auto value, so a manually edited slug is never overwritten - verified in browser
- SEO title mirrors the name under the same only-while-untouched rule
- SKU field explains itself (what a stock keeping unit is, that any unique text works) and gains a Generate button producing readable codes like WIR-GAM-7K2P from the product name
- SEO tab gains 'Fill from product details': fills only empty title/description/keywords from name and short description, existing text untouched
- New adminProducts keys (slugHint, skuHint, generate, seoGenerate, seoGenerateHint) in en/ru/hy
2026-07-19 08:30:49 +04:00
slugHint : 'Ապրանքի վեբ-հասցեն։ Լրացվում է ինքնաշխատ անունից — փոխեք միայն, եթե պետք է հատուկ URL։ ' ,
skuHint : 'SKU (ապրանքային կոդ) — ձեր ներքին կոդն է պահեստի հաշվառման և պատվերների որոնման համար։ Ցանկացած եզակի տեքստ կաշխատի։' ,
generate : 'Գեներացնել' ,
seoGenerate : 'Լրացնել ապրանքի տվյալներից' ,
seoGenerateHint : 'Լրացնում է դատարկ դաշտերը անունից և կարճ նկարագրությունից։ Ձեր տեքստը չի փոխվում։' ,
2026-07-19 08:40:30 +04:00
translationsHint : 'Վերևի հիմնական դաշտերը ցուցադրվում են խանութի հիմնական լեզվով։ Այստեղ ավելացրեք թարգմանություններ այլ լեզուների համար — եթե թարգմանությունը դատարկ է, գնորդները կտեսնեն հիմնական տեքստը։' ,
2026-07-19 08:44:20 +04:00
badgesHint : 'Բեյջերը փոքր գունավոր պիտակներ են, որոնք գնորդները տեսնում են ապրանքի նկարի վրա։ Ընտրեք ստանդարտներից կամ ավելացրեք ձերը։' ,
addBadge : 'Ավելացնել' ,
removeBadge : 'Հեռացնել բեյջը' ,
customBadgePlaceholder : 'Ձեր բեյջի տեքստը…' ,
feat(products): implement professional product management experience
Products dashboard (real total/published/drafts/out-of-stock/hidden/missing-images/missing-SEO/low-quality counts, recently-edited list, recommended next action); list gains table/grid view toggle, density, saved column visibility and saved sort (persisted via LocalStorageService), plus real bulk assign-category/assign-tags/duplicate/CSV-export alongside existing publish/hide/delete; per-row and per-editor reusable ProductHealthWidget (images/SEO/price/category/description/inventory checklist + completion %); editor reorganized into General/Media/Pricing/Inventory/Categories/Attributes/SEO/Visibility/Advanced tabs, media now uses the shared MediaPickerComponent/ImageFieldComponent (primary image + reorderable gallery) instead of raw URL textareas, specifications/attributes/variants moved off pipe-delimited textareas onto the shared KeyValueEditorComponent, SEO tab explains fields in plain language with a live search-result preview, inventory relabeled in business language, toggles/badges use the shared Toggle/Badge components. Filled in the adminProducts i18n namespace (previously ~98% missing, rendering raw translation keys) across en/ru/hy.
2026-07-18 16:34:06 +04:00
seoExplain : 'Ս ա այն է, ինչ երևում է որոնման արդյունքներում․ հստակ վերնագիրն ու նկարագրությունը օգնում են գտնել այս ապրանքը։' ,
searchTitle : 'Որոնման վերնագիր' ,
searchTitleHint : 'Վերնագիրը, որ երևում է որոնման արդյունքներում։ Պահեք կարճ։' ,
searchDescription : 'Որոնման նկարագրություն' ,
searchDescriptionHint : 'Կարճ նկարագրություն՝ վերնագրի տակ, որոնման արդյունքներում։' ,
seoMissingTitle : 'Ավելացրեք որոնման վերնագիր, որպեսզի ապրանքը գտնվի։' ,
seoMissingDescription : 'Ավելացրեք որոնման նկարագրություն՝ ապրանքի ցուցադրումը բարելավելու համար։' ,
keywords : 'Հիմնաբառեր' ,
featured : 'Ընտրված' ,
recommended : 'Երաշխավորված' ,
new : 'Նոր' ,
bestseller : 'Բեսթսելլեր' ,
badges : 'Կրծքանշաններ (ստորակետերով)' ,
htmlDescription : 'Մանրամասն նկարագրություն' ,
customer : 'Հաճախորդների արձագանք' ,
reviewsReadonly : 'Կարծիքներ' ,
noReviews : 'Կարծիքներ դեռ չկան։' ,
questionsReadonly : 'Հարցեր' ,
noQuestions : 'Հարցեր դեռ չկան։' ,
save : 'Պահպանել ապրանքը' ,
groupGeneral : 'Հիմնական' ,
groupMedia : 'Մեդիա' ,
groupPricing : 'Գին' ,
groupInventory : 'Պահեստ' ,
groupCategories : 'Կատեգորիաներ' ,
groupAttributes : 'Հատկանիշներ' ,
groupSeo : 'SEO' ,
groupVisibility : 'Տեսանելիություն' ,
groupAdvanced : 'Լրացուցիչ' ,
healthImages : 'Պատկերներ' ,
healthSeo : 'SEO' ,
healthPrice : 'Գին' ,
healthCategory : 'Կատեգորիա' ,
healthDescription : 'Նկարագրություն' ,
healthInventory : 'Պահեստ' ,
totalProducts : 'Ընդհանուր ապրանքներ' ,
publishedCount : 'Հրապարակված' ,
draftsCount : 'Սևագրեր' ,
outOfStockCount : 'Առկա չէ' ,
hiddenCount : 'Թաքցված' ,
missingImagesCount : 'Առանց պատկերի' ,
missingSeoCount : 'Առանց SEO-ի' ,
lowQualityCount : 'Ցածր որակի' ,
recentlyEdited : 'Վերջերս խմբագրված' ,
recommendedNext : 'Հաջորդ առաջարկվող քայլը' ,
openAction : 'Բացել' ,
recommendAddImages : 'Ապրանքը լուսանկար չունի․ ավելացրեք առնվազն մեկ պատկեր։' ,
recommendAddSeo : 'Ապրանքը չունի որոնման վերնագիր կամ նկարագրություն․ ավելացրեք դրանք։' ,
recommendRestock : 'Ապրանքը սպառված է․ համալրեք պաշարը կամ թաքցրեք այն։' ,
recommendNone : 'Հիանալի է․ կատալոգը լավ վիճակում է։' ,
2026-07-16 00:19:41 +04:00
} ,
adminUsers : {
emptyTitle : 'Օգտատերեր չեն գտնվել' ,
emptyDescription : 'Հրավիրեք գործընկերոջ՝ սկսելու համար։' ,
invitationsEmptyTitle : 'Սպասող հրավերներ չկան' ,
2026-07-18 22:44:39 +04:00
title : 'Թիմ' ,
name : 'Անուն' ,
email : 'Էլ. փոստ' ,
scope : 'Աշխատանքային տարածք' ,
role : 'Դեր' ,
roles : 'Դերեր' ,
lastLogin : 'Վերջին մուտք' ,
sessions : 'Ակտիվ նստաշրջաններ' ,
currentSession : 'Ընթացիկ նստաշրջան' ,
invite : 'Հրավիրել անդամ' ,
sendInvite : 'Ուղարկել հրավեր' ,
revoke : 'Չեղարկել' ,
passwordlessHint : 'Անդամները մուտք են գործում Telegram-ով — գաղտնաբառեր պետք չեն։' ,
confirmSuspend : 'Արգելափակե՞լ այս անդամին։ Մուտքը կփակվի անմիջապես։' ,
2026-07-19 23:04:51 +04:00
suspend : 'Արգելափակել' ,
reactivate : 'Վերականգնել' ,
2026-07-18 22:44:39 +04:00
scopeValue : {
marketplace : 'Խանութ' ,
office : 'Բեք-օֆիս' ,
} ,
statusValue : {
active : 'Ակտիվ' ,
invited : 'Հրավիրված' ,
suspended : 'Արգելափակված' ,
} ,
invitationStatus : {
pending : 'Սպասում է' ,
accepted : 'Ընդունված' ,
expired : 'Ժամկետանց' ,
revoked : 'Չեղարկված' ,
} ,
} ,
adminTransactions : {
search : 'Գործարքների որոնում' ,
type : 'Տեսակ' ,
method : 'Վճարման եղանակ' ,
fraud : 'Խարդախության ստուգում' ,
flagged : 'Նշված' ,
2026-07-19 08:25:29 +04:00
flag : 'Նշել որպես կասկածելի' ,
clearFlag : 'Հանել նշումը' ,
2026-07-18 22:44:39 +04:00
retry : 'Կրկնել' ,
audit : 'Պատմություն' ,
emptyTitle : 'Գործարքներ չեն գտնվել' ,
emptyDescription : 'Փորձեք այլ ֆիլտր կամ որոնման բառ։' ,
status : {
all : 'Բոլոր կարգավիճակները' ,
pending : 'Մշակվում է' ,
success : 'Հաջողված' ,
failed : 'Ձախողված' ,
retried : 'Կրկնված' ,
} ,
typeValue : {
all : 'Բոլոր տեսակները' ,
payment : 'Վճարում' ,
refund : 'Վերադարձ' ,
qr_payment : 'QR վճարում' ,
} ,
2026-07-16 00:19:41 +04:00
} ,
adminMonitoring : {
eventsEmptyTitle : 'Իրադարձություններ չեն գտնվել' ,
eventsEmptyDescription : 'Փորձեք այլ կատեգորիայի ֆիլտր կամ որոնման բառ։' ,
2026-07-18 22:44:39 +04:00
health : 'Վիճակի ստուգումներ' ,
queues : 'Ֆոնային հերթեր' ,
depth : 'Սպասման մեջ' ,
webhooks : 'Վեբհուքերի առաքում' ,
endpoint : 'Ստացող' ,
event : 'Իրադարձություն' ,
events : 'Ակտիվության մատյան' ,
category : 'Կատեգորիա' ,
level : 'Կարևորություն' ,
message : 'Նկարագրություն' ,
categoryValue : {
all : 'Բոլոր կատեգորիաները' ,
audit : 'Ադմինի գործողություններ' ,
security : 'Անվտանգություն' ,
login : 'Մուտք' ,
failed_login : 'Ձախողված մուտք' ,
api : 'API' ,
error : 'Սխալ' ,
warning : 'Զգուշացում' ,
} ,
queueStatus : {
healthy : 'Աշխատում է կայուն' ,
degraded : 'Դանդաղել է' ,
down : 'Կանգնած է' ,
} ,
webhookStatus : {
delivered : 'Առաքված' ,
failed : 'Ձախողված' ,
pending : 'Սպասում է' ,
} ,
levelValue : {
info : 'Տեղեկություն' ,
warning : 'Զգուշացում' ,
error : 'Սխալ' ,
} ,
feat(admin): implement analytics and monitoring center
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Business Dashboard: revenue/orders/customers/AOV/top products/low stock/recent activity/warnings/completion% (Overview tab)
- Marketplace Health: real completion checks (images, SEO, categories, reviews, orders, translations, homepage, backend, performance) with clickable recommendations
- Product Analytics: top selling/most reviewed/worst rated/hidden/archived counts; top-viewed honestly marked Unknown (no view tracking exists)
- Customer Analytics: new/returning customers, average spend, retention - derived from real order data
- Search & Traffic tabs: honest 'Unknown - available after backend integration' placeholders, no fabricated numbers
- Recommendations engine: actionable cards (missing images/SEO/category, empty categories, incomplete homepage, unpublished static pages) linking to the relevant admin page
- System Monitoring: added real draft/publish/sync/backend-connectivity state from AdminDashboardFacade
- CSV export extended to top products and health checks; added print action
- New adminAnalytics.* and adminMarketplaceHealth.* i18n namespaces (en/ru/hy), no raw i18n keys
- Reused existing shared UI (app-table/app-badge/app-skeleton/app-empty-state) and content-health-widget completion-meter pattern - no new backend APIs, no storage changes
2026-07-18 22:33:36 +04:00
systemState : 'Համակարգի վիճակ' ,
backendConnectivity : 'Բեքենդ' ,
connected : 'Կապակցված է' ,
loading : 'Բեռնվում է' ,
draftState : 'Սևագիր' ,
unsavedChanges : 'Չպահպանված փոփոխություններ' ,
noDraft : 'Սևագիր չկա' ,
lastSaved : 'Վերջին պահպանում' ,
lastPublished : 'Վերջին հրապարակում' ,
syncStatus : 'Համաժամացում' ,
2026-07-16 00:19:41 +04:00
} ,
adminAnalytics : {
topProductsEmptyTitle : 'Այս ժամանակահատվածում ապրանքների վաճառք չկա' ,
topProductsEmptyDescription : 'Փորձեք ընտրել ավելի լայն ամսաթվերի միջակայք։' ,
2026-07-18 22:44:39 +04:00
topProducts : 'Թոփ ապրանքներ' ,
feat(admin): implement analytics and monitoring center
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Business Dashboard: revenue/orders/customers/AOV/top products/low stock/recent activity/warnings/completion% (Overview tab)
- Marketplace Health: real completion checks (images, SEO, categories, reviews, orders, translations, homepage, backend, performance) with clickable recommendations
- Product Analytics: top selling/most reviewed/worst rated/hidden/archived counts; top-viewed honestly marked Unknown (no view tracking exists)
- Customer Analytics: new/returning customers, average spend, retention - derived from real order data
- Search & Traffic tabs: honest 'Unknown - available after backend integration' placeholders, no fabricated numbers
- Recommendations engine: actionable cards (missing images/SEO/category, empty categories, incomplete homepage, unpublished static pages) linking to the relevant admin page
- System Monitoring: added real draft/publish/sync/backend-connectivity state from AdminDashboardFacade
- CSV export extended to top products and health checks; added print action
- New adminAnalytics.* and adminMarketplaceHealth.* i18n namespaces (en/ru/hy), no raw i18n keys
- Reused existing shared UI (app-table/app-badge/app-skeleton/app-empty-state) and content-health-widget completion-meter pattern - no new backend APIs, no storage changes
2026-07-18 22:33:36 +04:00
print : 'Տպել' ,
tabsLabel : 'Վերլուծության բաժիններ' ,
tab : {
overview : 'Ընդհանուր' ,
health : 'Առողջություն' ,
products : 'Ապրանքներ' ,
customers : 'Հաճախորդներ' ,
search : 'Որոնում' ,
traffic : 'Թրաֆիք' ,
recommendations : 'Առաջարկություններ' ,
} ,
revenue : 'Եկամուտ' ,
orders : 'Պատվերներ' ,
customers : 'Հաճախորդներ' ,
avgOrderValue : 'Միջին պատվեր' ,
conversion : 'Փոխարկում' ,
completionPercent : 'Ավարտվածություն' ,
unknown : 'Անհայտ' ,
salesChart : 'Վաճառքներ' ,
quantitySold : 'Վաճառված քանակ' ,
lowStock : 'Ցածր պաշար' ,
lowStockEmptyTitle : 'Ցածր պաշարով ապրանքներ չկան' ,
quantity : 'Քանակ' ,
status : 'Կարգավիճակ' ,
recentActivity : 'Վերջին ակտիվություն' ,
recentActivityEmptyTitle : 'Վերջին ակտիվություն չկա' ,
activityDraftSaved : 'Սևագիրը պահպանվեց' ,
activityPublished : 'Հրապարակվեց' ,
warnings : 'Զգուշացումներ' ,
topViewed : 'Ամենադիտված' ,
hiddenProducts : 'Թաքցված ապրանքներ' ,
archivedProducts : 'Արխիվացված ապրանքներ' ,
mostReviewed : 'Ամենաշատ գնահատված' ,
worstRated : 'Ամենացածր վարկանիշ' ,
noReviewedProducts : 'Դեռ գնահատված ապրանքներ չկան' ,
reviewCount : 'Կարծիքներ' ,
avgRating : 'Միջին վարկանիշ' ,
newCustomers : 'Նոր հաճախորդներ' ,
returningCustomers : 'Կրկնվող հաճախորդներ' ,
averageSpend : 'Միջին ծախս' ,
retention : 'Պահպանում' ,
searchAnalytics : 'Որոնման վերլուծություն' ,
trafficAnalytics : 'Թրաֆիք' ,
availableAfterBackend : 'Հասանելի կլինի բեքենդի ինտեգրումից հետո։' ,
pendingBackend : 'Սպասում է բեքենդին' ,
pendingBackendHint : 'Որոնման հարցումների հետագծում դեռ չկա։' ,
funnelsHeatmaps : 'Ձագարներ և ջերմային քարտեզներ' ,
visitors : 'Այցելուներ' ,
products : 'Ապրանքներ' ,
categories : 'Կատեգորիաներ' ,
} ,
adminMarketplaceHealth : {
title : 'Շուկայի առողջություն' ,
complete : 'ավարտված' ,
recommendationsTitle : 'Առաջարկություններ' ,
recommendNone : 'Ամեն ինչ կարգին է։' ,
checkImages : 'Ապրանքներն ունեն նկարներ' ,
checkSeo : 'Ապրանքներն ունեն SEO տվյալներ' ,
checkCategories : 'Կատեգորիաներն ունեն ապրանքներ' ,
checkReviews : 'Կարծիքները մոդերացվում են' ,
checkOrders : 'Պատվերները մշակվում են' ,
checkTranslations : 'Թարգմանությունները լրացված են' ,
checkHomepage : 'Գլխավոր էջը կարգավորված է' ,
checkBackend : 'Կապ բեքենդի հետ' ,
checkPerformance : 'Արտադրողականություն' ,
recommendImages : 'Ավելացրեք նկարներ դրանք չունեցող ապրանքներին' ,
recommendImagesCount : 'Նկարներ չունեցող ապրանքները նվազեցնում են փոխարկումը։' ,
recommendSeo : 'Լրացրեք SEO տվյալները դրանք չունեցող ապրանքների համար' ,
recommendSeoCount : 'SEO-ի բացակայությունը վատացնում է որոնման տեսանելիությունը։' ,
recommendCategory : 'Նշանակեք կատեգորիա առանց կատեգորիայի ապրանքներին' ,
recommendCategoryCount : 'Կատեգորիա չունեցող ապրանքներն ավելի դժվար են գտնվում։' ,
recommendEmptyCategories : 'Ապրանք չունեցող կատեգորիաներ' ,
recommendEmptyCategoriesCount : 'Դիտարկեք դատարկ կատեգորիաների միավորումը կամ հեռացումը։' ,
recommendHomepage : 'Գլխավոր էջը թերի է' ,
recommendStaticPages : 'Կան չհրապարակված ստատիկ էջեր' ,
severity : {
info : 'Տեղեկատվություն' ,
warning : 'Ուշադրություն' ,
critical : 'Կրիտիկական' ,
} ,
2026-07-16 00:19:41 +04:00
} ,
feat(admin): build shared admin shell
Sidebar (Dashboard/Catalog group/Products/Categories/Orders/Transactions/
Reviews/Reports/Content/Media/Marketplace Builder/Users/Settings/
Monitoring/Analytics + Documentation/Help/Logout), sticky topbar
(breadcrumbs, page title/description, search, notifications, tenant
selector and quick-publish placeholders, current user), reserved
right-rail slot, scrollable content area. Desktop 280px sidebar, tablet
icon rail, mobile drawer with focus management and Escape-to-close.
Nav items without a built page (Reviews, Reports, Settings, Docs, Help)
render disabled with a coming-soon badge instead of dead links; Content
and Marketplace Builder route to the existing project-editor pages
(static-pages / general) rather than duplicating them.
All 15 /backoffice/** routes now render through AdminLayoutComponent;
the public storefront header/back-button/footer no longer render on
admin routes (app.ts/app.html gate on a new isAdminRoute signal).
Added the adminShell i18n namespace (ru/en/hy) for every new shell
string so this doesn't add to the existing untranslated-admin-UI gap
tracked in KNOWN-ISSUES.md.
Colors/type sizes follow DESIGN.md tokens; the two rgba() modal-scrim
values are a documented, intentional exception (neutral overlay,
not a themed token).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 00:12:19 +04:00
adminShell : {
skipToContent : 'Անցնել բովանդակությանը' ,
openSidebar : 'Բացել ընտրացանկը' ,
closeSidebar : 'Փակել ընտրացանկը' ,
collapseSidebar : 'Ծալել ընտրացանկը' ,
expandSidebar : 'Ընդարձակել ընտրացանկը' ,
nav : {
dashboard : 'Կառավարման վահանակ' ,
catalogGroup : 'Կատալոգ' ,
products : 'Ապրանքներ' ,
categories : 'Կատեգորիաներ' ,
orders : 'Պատվերներ' ,
2026-07-18 21:47:54 +04:00
customers : 'Հաճախորդներ' ,
feat(admin): implement review and moderation center
New Reviews & Moderation feature (frontend only): moderation dashboard (real pending/approved/rejected/reported/spam counts, average rating, recent activity, moderation-health%, computed from the full review queue); reviews list with table/cards, density, saved column visibility, search/status/rating filters, bulk approve/reject/spam/hide/export; review detail shows customer/product/rating/text/photos/timeline/moderator-notes with a real moderation workflow (approve/reject/spam/hide/restore/pin/feature, feature disabled with an explanation unless the review is approved); reusable ReviewHealthWidget (rating/text/media/moderated/report-status/visible + completion%); reports queue lists reports against products/reviews/customers/categories with resolve/dismiss, and honestly renders 'Not available yet' rather than fabricating a value wherever a target can't be resolved (e.g. photos, customer-target reports). Backed by a new in-memory AdminModerationLocalGateway seeded from real product data - the same mock-gateway pattern already used by every other admin feature in this app (orders/products/categories), since no review/report backend exists to reuse. Replaced the 'Reviews' comingSoon nav placeholder with a working link; added full adminModeration i18n coverage.
2026-07-18 22:01:16 +04:00
moderation : 'Կարծիքներ և մոդերացիա' ,
feat(admin): build shared admin shell
Sidebar (Dashboard/Catalog group/Products/Categories/Orders/Transactions/
Reviews/Reports/Content/Media/Marketplace Builder/Users/Settings/
Monitoring/Analytics + Documentation/Help/Logout), sticky topbar
(breadcrumbs, page title/description, search, notifications, tenant
selector and quick-publish placeholders, current user), reserved
right-rail slot, scrollable content area. Desktop 280px sidebar, tablet
icon rail, mobile drawer with focus management and Escape-to-close.
Nav items without a built page (Reviews, Reports, Settings, Docs, Help)
render disabled with a coming-soon badge instead of dead links; Content
and Marketplace Builder route to the existing project-editor pages
(static-pages / general) rather than duplicating them.
All 15 /backoffice/** routes now render through AdminLayoutComponent;
the public storefront header/back-button/footer no longer render on
admin routes (app.ts/app.html gate on a new isAdminRoute signal).
Added the adminShell i18n namespace (ru/en/hy) for every new shell
string so this doesn't add to the existing untranslated-admin-UI gap
tracked in KNOWN-ISSUES.md.
Colors/type sizes follow DESIGN.md tokens; the two rgba() modal-scrim
values are a documented, intentional exception (neutral overlay,
not a themed token).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 00:12:19 +04:00
transactions : 'Գործարքներ' ,
reviews : 'Կարծիքներ' ,
reports : 'Հաշվետվություններ' ,
content : 'Բովանդակություն' ,
mediaLibrary : 'Մեդիադարան' ,
marketplaceBuilder : 'Մարկետփլեյսի կոնստրուկտոր' ,
users : 'Օգտատերեր' ,
settings : 'Կարգավորումներ' ,
monitoring : 'Մոնիտորինգ' ,
analytics : 'Վերլուծություն' ,
documentation : 'Փաստաթղթեր' ,
help : 'Օգնություն' ,
logout : 'Ելք' ,
comingSoonBadge : 'Շուտով' ,
} ,
topbar : {
searchLabel : 'Որոնում ադմին վահանակում' ,
searchPlaceholder : 'Փնտրել ապրանքներ, պատվերներ, էջեր...' ,
notifications : 'Ծանուցումներ' ,
notificationsEmpty : 'Նոր ծանուցումներ չկան' ,
account : 'Ադմինիստրատորի հաշիվ' ,
tenantSelector : 'Խանութ' ,
tenantSelectorComingSoon : 'Խանութների միջև անցումը շուտով կհասանելի լինի' ,
quickPublish : 'Հրապարակել' ,
quickPublishComingSoon : 'Արագ հրապարակումը շուտով կհասանելի լինի' ,
} ,
breadcrumbHome : 'Ադմին վահանակ' ,
pages : {
dashboard : { title : 'Կառավարման վահանակ' , description : 'Ձեր մարկետփլեյսի ընդհանուր վիճակը' } ,
products : { title : 'Ապրանքներ' , description : 'Կառավարեք ապրանքների քարտերը և տեսանելիությունը' } ,
productCreate : { title : 'Նոր ապրանք' , description : 'Լրացրեք տվյալները՝ կատալոգում ապրանք ավելացնելու համար' } ,
productEdit : { title : 'Ապրանքի խմբագրում' , description : 'Փոփոխեք ապրանքի տվյալները' } ,
productDuplicate : { title : 'Ապրանքի կրկնօրինակ' , description : 'Ստեղծեք նոր ապրանք առկա ապրանքի հիման վրա' } ,
categories : { title : 'Կատեգորիաներ' , description : 'Կառուցեք կատալոգի կատեգորիաների ծառը' } ,
categoryCreate : { title : 'Նոր կատեգորիա' , description : 'Ավելացրեք կատեգորիա կատալոգի ծառում' } ,
categoryEdit : { title : 'Կատեգորիայի խմբագրում' , description : 'Փոփոխեք կատեգորիայի տվյալները' } ,
orders : { title : 'Պատվերներ' , description : 'Դիտեք և մշակեք գնորդների պատվերները' } ,
orderDetail : { title : 'Պատվեր' , description : 'Պատվերի մանրամասներն ու կարգավիճակը' } ,
2026-07-18 21:47:54 +04:00
customers : { title : 'Հաճախորդներ' , description : 'Բոլորը, ովքեր պատվեր են կատարել' } ,
customerDetail : { title : 'Հաճախորդ' , description : 'Հաճախորդի պրոֆիլ, պատվերներ և ակտիվություն' } ,
feat(admin): implement review and moderation center
New Reviews & Moderation feature (frontend only): moderation dashboard (real pending/approved/rejected/reported/spam counts, average rating, recent activity, moderation-health%, computed from the full review queue); reviews list with table/cards, density, saved column visibility, search/status/rating filters, bulk approve/reject/spam/hide/export; review detail shows customer/product/rating/text/photos/timeline/moderator-notes with a real moderation workflow (approve/reject/spam/hide/restore/pin/feature, feature disabled with an explanation unless the review is approved); reusable ReviewHealthWidget (rating/text/media/moderated/report-status/visible + completion%); reports queue lists reports against products/reviews/customers/categories with resolve/dismiss, and honestly renders 'Not available yet' rather than fabricating a value wherever a target can't be resolved (e.g. photos, customer-target reports). Backed by a new in-memory AdminModerationLocalGateway seeded from real product data - the same mock-gateway pattern already used by every other admin feature in this app (orders/products/categories), since no review/report backend exists to reuse. Replaced the 'Reviews' comingSoon nav placeholder with a working link; added full adminModeration i18n coverage.
2026-07-18 22:01:16 +04:00
moderation : { title : 'Կարծիքներ և մոդերացիա' , description : 'Դիտեք և մոդերացրեք հաճախորդների կարծիքները' } ,
reviewDetail : { title : 'Կարծիք' , description : 'Կարծիքի մանրամասներ և մոդերացիայի գործողություններ' } ,
reportsQueue : { title : 'Բողոքների հերթ' , description : 'Հաճախորդների կողմից բողոքարկված բովանդակություն' } ,
feat(admin): build shared admin shell
Sidebar (Dashboard/Catalog group/Products/Categories/Orders/Transactions/
Reviews/Reports/Content/Media/Marketplace Builder/Users/Settings/
Monitoring/Analytics + Documentation/Help/Logout), sticky topbar
(breadcrumbs, page title/description, search, notifications, tenant
selector and quick-publish placeholders, current user), reserved
right-rail slot, scrollable content area. Desktop 280px sidebar, tablet
icon rail, mobile drawer with focus management and Escape-to-close.
Nav items without a built page (Reviews, Reports, Settings, Docs, Help)
render disabled with a coming-soon badge instead of dead links; Content
and Marketplace Builder route to the existing project-editor pages
(static-pages / general) rather than duplicating them.
All 15 /backoffice/** routes now render through AdminLayoutComponent;
the public storefront header/back-button/footer no longer render on
admin routes (app.ts/app.html gate on a new isAdminRoute signal).
Added the adminShell i18n namespace (ru/en/hy) for every new shell
string so this doesn't add to the existing untranslated-admin-UI gap
tracked in KNOWN-ISSUES.md.
Colors/type sizes follow DESIGN.md tokens; the two rgba() modal-scrim
values are a documented, intentional exception (neutral overlay,
not a themed token).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 00:12:19 +04:00
transactions : { title : 'Գործարքներ' , description : 'Վճարումներ, վերադարձներ և կեղծիքի ստուգում' } ,
media : { title : 'Մեդիադարան' , description : 'Ապրանքների և էջերի պատկերներ ու ֆայլեր' } ,
users : { title : 'Օգտատերեր' , description : 'Ադմինիստրատորների թիմը և իրավունքները' } ,
monitoring : { title : 'Մոնիտորինգ' , description : 'Հերթերի, webhook-ների և համակարգային իրադարձությունների վիճակը' } ,
analytics : { title : 'Վերլուծություն' , description : 'Վաճառքներ, ապրանքներ և գնորդների վարքագիծ' } ,
} ,
} ,
2026-02-26 23:09:20 +04:00
} ;