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

1974 lines
126 KiB
TypeScript
Raw Normal View History

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: 'Կատալոգ',
wishlist: 'Ընտրյալ',
compare: 'Համեմատում',
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: 'Վստա՞հ եք, որ ցանկանում եք մաքրել զամբյուղը',
removeItem: 'Հեռացնել ապրանքը',
increaseQuantity: 'Ավելացնել քանակը',
decreaseQuantity: 'Նվազեցնել քանակը',
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: 'Մուտքագրեք ապրանքի անվանումը...',
searchBarAria: 'Որոնման դաշտ',
2026-03-24 00:09:11 +04:00
resultsCount: 'Գտնված ապրանքներ՝',
searching: 'Որոնում...',
retry: 'Փորձել կրկին',
noResults: 'Ոչինչ չի գտնվել',
noResultsFor: '"{{query}}" հարցմամբ ապրանքներ չեն գտնվել',
noResultsHint: 'Փորձեք փոխել հարցումը կամ օգտագործել այլ բանալի բառեր',
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: 'Ֆիլտրեր',
from: 'Սկսած',
to: 'Մինչև',
2026-07-09 01:40:22 +04:00
minValue: 'Նվազ. {{value}}',
maxValue: 'Առավել. {{value}}',
enabled: 'Միացված',
searchPlaceholder: 'Որոնել ապրանքներ, բրենդներ, կատեգորիաներ',
searchSubmit: 'Որոնել',
clearSearch: 'Մաքրել',
2026-07-09 01:40:22 +04:00
suggestionsTitle: 'Առաջարկներ',
popularSearchesTitle: 'Հանրաճանաչ որոնումներ',
2026-07-09 01:40:22 +04:00
recentSearchesTitle: 'Վերջին որոնումներ',
searchHistoryTitle: 'Որոնման պատմություն',
clearHistory: 'Մաքրել',
searchNoResultsHint: 'Արդյունքներ չկան։ Փորձեք ավելի լայն բանալի բառեր։',
searchProductsFound: 'Գտնված ապրանքներ՝ {{total}}',
searchResultsSummary: '{{total}} արդյունք "{{query}}" հարցմամբ',
2026-07-10 15:55:38 +04:00
loadMore: 'Բեռնել ավելին',
2026-07-09 01:40:22 +04:00
sortBy: 'Տեսակավորել ըստ',
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}}',
emptyCategoryTitle: 'Այս կատեգորիայում դեռ ապրանքներ չկան',
emptyCategoryMessage: 'Փորձեք անցնել ծնող կատեգորիաներ կամ վերադառնալ ամբողջ կատալոգ։',
2026-07-10 15:55:38 +04:00
goToParentCategory: 'Գնալ ծնող կատեգորիա',
browseCategories: 'Դիտել կատեգորիաները',
2026-07-10 15:55:38 +04:00
offlineTitle: 'Դուք offline եք',
offlineMessage: 'Միացեք ցանցին՝ կատալոգը շարունակելու համար։',
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: 'Հատկանիշներ',
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: 'Ընտրեք գնահատականը',
fix(storefront): premium UX polish for product, compare, wishlist - delivery-information, product-actions, product-description, product-gallery, product-information, related-products, variant-selector: normalize hardcoded hex colors to design tokens (--text-primary, --text-secondary, --border-color, --bg-primary/ --bg-secondary, --primary-color/--primary-hover); stock status and discount badge now use semantic --success-color/--warning-color/ --error-color instead of near-duplicate literal hex - product-actions: add aria-pressed to wishlist/compare toggle buttons; add hover/active/disabled states to action buttons - product-gallery: add aria-current + aria-label to active thumbnail button; add focus-visible ring and hover state on thumbnails and toolbar buttons - variant-selector: add aria-pressed to colour/size option buttons; add a visible checkmark glyph on the selected colour swatch so selection isn't color-only; add hover states - product-tabs: add role="tab"/aria-selected to tab buttons - star-selector: add per-star aria-label (new starsLabel i18n key added to en/hy/ru + translations.ts interface) - question-list: add aria-expanded to the ask-question disclosure toggle; swap plain empty-state <p> for app-empty-state; add hover/disabled states to pager buttons - review-list: swap plain empty-state <p> for app-empty-state; add hover/disabled states to pager and load-more buttons - question-card, question-form, review-form: normalize accepted/ success/error colors to semantic tokens; add focus-visible and hover/disabled states to inputs and submit buttons - compare-table: add scope="col"/scope="row" to table headers; make header row and attribute column sticky for easier comparison on long tables - compare-page: add hover/focus states to the remove-from-compare chip button Build verified green via `npm run build`. Out of scope / skipped: - src/app/pages/item-detail/* is dead code (not referenced by any route or component) - left untouched - wishlist page and product-details-container were already fully composed with shared skeleton/empty-state/button components from the RC-Visual-02 pass - no changes needed - stars.component display-only rating glyphs use a light gray not an exact token match - left as-is to avoid an unintended visual shift Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 11:47:57 +04:00
starsLabel: 'աստղ',
2026-07-09 01:40:22 +04:00
reviewsEmpty: 'Կարծիքներ դեռ չկան։',
questionsEmpty: 'Հարցեր դեռ չկան։',
askQuestion: 'Տալ հարց',
hideQuestionForm: 'Թաքցնել հարցի ձևը',
questionFormTitle: 'Տալ հարց',
questionFormPlaceholder: 'Հարցրեք չափի, առաքման, համատեղելիության կամ օգտագործման մասին',
questionFormAnonymous: 'Հարցնել անանուն',
submitQuestion: 'Ուղարկել հարցը',
reviewFormTitle: 'Թողնել կարծիք',
reviewRatingLabel: 'Գնահատական',
reviewTitleLabel: 'Վերնագիր',
reviewTitlePlaceholder: 'Կարճ վերնագիր',
reviewTextLabel: 'Կարծիք',
reviewTextPlaceholder: 'Նկարագրեք ձեր փորձը',
reviewAnonymous: 'Ուղարկել անանուն',
reviewUploadPlaceholder: 'Լուսանկար վերբեռնելը նախատեսված է հաջորդ սպրինտում։',
reviewRatingRequired: 'Խնդրում ենք ընտրել գնահատական։',
reviewTextRequired: 'Խնդրում ենք գրել կարծիք։',
reviewSuccess: 'Կարծիքը հաջողությամբ ուղարկվեց։',
2026-07-09 01:40:22 +04:00
submitReview: 'Ուղարկել կարծիքը',
submitting: 'Ուղարկվում է...',
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: 'Ապրանքների և ծառայությունների մարքեթփլեյս',
fix(storefront): WCAG 2.1 AA accessibility fixes RC A11Y-01 audit pass, storefront + shared app-shell chrome only. Builds on RC-Visual-02/RC-Premium-01/RC STORE-01 without redoing that work. - Skip link: added first-focusable "skip to main content" link (app.html, styles.scss .skip-link/.sr-only), targeting new #main-content landmark. New app.skipToContent i18n key in en/ru/hy. - Header: mobile menu items stayed keyboard-focusable and screen-reader reachable while visually collapsed (max-height:0 with no visibility toggle) - fixed with visibility:hidden + matched transition-delay. Desktop search input (readonly, click-to-navigate) had no keyboard activation - added aria-label + (keydown.enter). - Cart payment/bank-payment modals: custom (non-app-dialog) UI had no focus trap, no Escape handling, and never returned focus to the triggering element - ported app-dialog's confirmed-correct focus-trap/Escape/return-focus pattern directly onto cart.component.ts. Added role="dialog"/aria-modal/aria-label to both panels and role="status"|"alert"/aria-live to every payment-status screen so screen readers announce state changes (creating/waiting/success/ error/timeout). - Search combobox: suggestion listbox had no role="combobox" wiring on the input and suggestion buttons weren't role="option" - added aria-autocomplete, aria-controls, aria-activedescendant, aria-selected so the existing arrow-key navigation is announced to screen readers. - Product tabs: tablist/tab pattern was incomplete (no role="tablist", no tabpanel) - added role="tablist" + ids to product-tabs.component, role="tabpanel"/aria-labelledby to the content panel in product-details-container. - Review form: rating/text validation errors weren't associated with their controls (no aria-describedby, no role="alert") - fixed; added aria-required to the review textarea. - delivery-selector: added aria-required to the delivery <select> when a selection is mandatory. - Shared app-icon component: doc comment claimed "decorative by default (aria-hidden)" but no aria-hidden was ever applied - fixed to actually set aria-hidden="true" when undecorated, and role="img"/aria-label when ariaLabel is passed. Shared component, affects every icon-only usage app-wide, no visual change. - Color contrast: --text-light fails WCAG AA 4.5:1 for normal text in every theme (dexar 3.39:1, lavero/novo 2.54:1 against white). The two in-scope usages (company-details org-short/basis, review-form upload-placeholder) switched to --text-secondary (4.55:1-7.56:1, passes), same visual family, no layout change. Flagged, not fixed (design-system decisions, not polish): - --border-color fails WCAG 1.4.11 3:1 for UI-component boundaries in every theme (dexar 1.42:1, lavero/novo 1.24:1 vs white) - pervasive token used by hundreds of borders app-wide; needs theme-owner sign-off. - --success-color/--warning-color/--error-color/--info-color used as plain text-on-white in several places (product-information, question-card, review-form, compare-page) fail 4.5:1 (2.15-3.76:1) - genuine brand semantic colors, changing them to pass would visibly shift the palette; needs a deliberate token decision. - Header mobile-menu max-height/padding transition (pre-existing, unrelated to this fix) flagged by design lint as layout-thrashing; left as-is per the "no layout/business-logic changes" constraint. Verified: npx tsc --noEmit clean; npm run build green (only the pre-existing bundle-budget warning, unrelated to this pass). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 08:46:18 +04:00
skipToContent: 'Անցնել հիմնական բովանդակությանը',
2026-02-26 23:09:20 +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: 'Ընդհանուր',
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',
brandName: 'Բրենդի անվանում',
2026-07-10 13:43:53 +04:00
marketplaceName: 'Մարքեթփլեյսի անվանում',
domain: 'Դոմեյն',
descriptionLabel: 'Նկարագրություն',
defaultLanguage: 'Լռելյայն լեզու',
supportedLanguages: 'Աջակցվող լեզուներ',
logo: 'Լոգո',
smallLogo: 'Փոքր լոգո',
favicon: 'Favicon',
socialImage: 'Սոցիալական պատկեր',
gallery: 'Պատկերասրահ',
addGalleryImage: 'Ավելացնել պատկեր',
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: 'Սոցիալական հղումներ',
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',
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',
previewChangesTitle: 'Փոփոխություններ վերջին հրապարակումից ի վեր',
previewNoIssues: 'Վավերացման խնդիրներ չկան։',
previewNoChanges: 'Փոփոխություններ վերջին հրապարակումից ի վեր չկան։',
previewChangeField: 'Դաշտ',
previewChangeBefore: 'Մինչ',
previewChangeAfter: 'Հետո',
languagesTab: 'Լեզուներ',
addLanguage: 'Ավելացնել լեզու',
removeLanguage: 'Հեռացնել',
setDefaultLanguage: 'Դարձնել լռելյայն',
defaultLanguageLabel: 'Լռելյայն',
navigationTab: 'Նավիգացիա',
navigationHeader: 'Վերին նավիգացիա',
navigationFooter: 'Ստորին նավիգացիա',
navigationFooterGrouped: 'Ստորին նավիգացիան խմբավորված է սյուներով և դեռ խմբագրելի չէ այստեղ. օգտագործեք «Footer» ներդիրը։',
addLink: 'Ավելացնել հղում',
insertPageLink: 'Ներդնել էջի հղում',
linkedToPage: 'Կապված է էջի հետ',
removeLink: 'Հեռացնել',
linkLabel: 'Պիտակ',
linkUrl: 'URL',
2026-07-10 13:43:53 +04:00
exportBootstrap: 'Արտահանել bootstrap',
importBootstrap: 'Ներմուծել bootstrap',
exportedBootstrap: 'Արտահանված bootstrap',
importSource: 'Ներմուծման աղբյուր',
importError: 'Ներմուծումը ձախողվեց։ Սխալ bootstrap JSON։',
featureFlags: 'Feature flags',
validationMissingLogo: 'Բրենդինգում բացակայում է լոգոն։',
validationNoLanguages: 'Կարգավորված լեզուներ չկան։',
validationDefaultLocaleNotSupported: 'Կանխադրված լեզուն աջակցվող լեզուների ցանկում չէ։',
validationInvalidUrl: 'Մարքեթփլեյսի URL-ը սխալ է։',
validationDuplicateSlugs: 'Երկու կամ ավելի ստատիկ էջեր ունեն նույն slug-ը։',
validationEmptyHomepage: 'Գլխավոր էջում սեկցիաներ չկան։',
validationMissingWidget: 'Գլխավոր էջի սեկցիաներից մեկն ունի վիջեթ առանց տիպի։',
validationDuplicateNavLinks: 'Վերնագրի նավիգացիայում կան կրկնվող հղումներ։',
validationInvalidColors: 'Թեմայի գույներից մեկը կամ մի քանիսը վավեր hex գույն չեն։',
validationMissingTranslations: 'Որոշ բովանդակություն թարգմանված չէ սատարվող լեզուներից մեկով։',
validationInvalidLayouts: 'Մեկ կամ մի քանի դասավորություններ հղում են անհայտ տեսակի։',
validationInvalidJson: 'Կոնֆիգուրացիան վավեր JSON չէ։',
validationInvalidCss: 'Ստատիկ էջը պարունակում է անվավեր CSS։',
validationDuplicateRoutes: 'Երկու կամ ավելի էջ ունեն նույն երթուղին։',
validationInvalidWidgetConfig: 'Վիջեթին բացակայում է պարտադիր դաշտ (id, type, version կամ props)։',
validationInvalidContactEmail: 'Ընկերության կոնտակտային էլ. փոստը վավեր չէ։',
validationInvalidSocialLinkUrl: 'Ֆուտերի սոցիալական հղումներից մեկը կամ մի քանիսը վավեր URL չունեն։',
validationIncompletePaymentIcon: 'Ֆուտերի վճարային պատկերակին բացակայում է պատկերը կամ alt տեքստը։',
undo: 'Հետարկել',
redo: 'Կրկնել',
statusDraft: 'Սևագիր',
statusPublished: 'Հրապարակված',
unsavedChanges: 'Չպահված փոփոխություններ',
save: 'Պահպանել',
publish: 'Հրապարակել',
confirmLeaveUnsaved: 'Կան չպահված փոփոխություններ։ Այնուամենայնիվ դուրս գա՞լ։',
confirmPublish: 'Սա անմիջապես կկիրառի ընթացիկ փոփոխությունները կայքում՝ փոխարինելով այն, ինչ գնորդներն այժմ տեսնում են։ Շարունակե՞լ։',
confirmRemoveLanguage: 'Սա կհեռացնի լեզուն և դրանով թարգմանված ողջ բովանդակությունը։ Այս լեզվով օգտվող գնորդները կտեսնեն հիմնական լեզուն։ Շարունակե՞լ։',
promptLinkUrl: 'URL',
promptImageUrl: 'Նկարի URL',
promptEmbedUrl: 'Ներդրման URL',
htmlEditorInvalidHtml: 'Այս HTML-ը ունի չփակված կամ չհամընկնող թեգ։ Ուղղեք նախքան տեսողական խմբագրիչին վերադառնալը։',
htmlEditorCode: 'Կոդ',
htmlEditorPreview: 'Նախադիտում',
lastSaved: 'Վերջին պահպանումը',
draftRestored: 'Տեղական սևագիրը վերականգնվել է նախորդ սեսիայից։',
dismiss: 'Փակել',
resetDraft: 'Զրոյացնել սևագիրը',
resetSection: 'Զրոյացնել սեկցիան',
confirmResetDraft: 'Սա կչեղարկի բոլոր չհրապարակված փոփոխությունները և կվերականգնի վերջին հրապարակված կոնֆիգուրացիան։ Շարունակե՞լ։',
confirmResetSection: 'Սա կչեղարկի չհրապարակված փոփոխությունները միայն այս սեկցիայում։ Շարունակե՞լ։',
marketplaceNameDesc: 'Անվանումը, որը տեսնում են գնորդները կայքում և բրաուզերի ներդիրում։',
domainDesc: 'Դոմեյնը, որով գնորդները մուտք են գործում մարքեթփլեյս։ Փոփոխությունը DNS չի տեղափոխում։',
descriptionFieldDesc: 'Կարճ նկարագրություն որոնողական համակարգերի և սոց ցանցերի նախադիտումների համար։',
defaultLanguageDesc: 'Լեզուն, որը ցուցադրվում է, եթե գնորդը լեզվային նախապատվություն չունի պահված։',
supportedLanguagesDesc: 'Ստորակետով բաժանված լեզվային կոդեր, որոնց միջև կարող է անցնել գնորդը (օր․՝ en, ru, hy)։',
logoDesc: 'Ամբողջական լոգոյի պատկերի URL, ցուցադրվում է header-ում դեսքթոփի վրա։',
smallLogoDesc: 'Կոմպակտ լոգոյի URL՝ սահմանափակ տարածքի համար (օր․՝ mobile header)։',
faviconDesc: 'Բրաուզերի ներդիրի պատկերակի URL։ Պետք է լինի փոքր քառակուսի պատկեր։',
socialImageDesc: 'Կանխադրված պատկեր, երբ մարքեթփլեյսը կիսվում է սոցիալական ցանցերում (Open Graph)։',
galleryDesc: 'Լրացուցիչ բրենդային պատկերներ ապագա օգտագործման համար։',
headerLayoutDesc: 'Ինչպես է դասավորված վերնագրի պարունակությունը՝ կանխադրված (լոգոն ձախից) կամ կենտրոնացված։',
headerStickyDesc: 'Պահել վերնագիրը էկրանի վերևում էջը էջում ոլորելիս։',
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-ում։',
footerLogoDesc: 'Footer-ում ցուցադրվող լոգո, եթե տարբերվում է header-ի լոգոյից։',
iconAltLabelDesc: 'Վճարային icon-ի այլընտրանքային տեքստ՝ մատչելիության համար։',
socialLinkUrlDesc: 'Սոցիալական պրոֆիլի ամբողջական URL, պետք է սկսվի http:// կամ https://-ով։',
staticPagesFieldDesc: 'Ստատիկ էջեր (մեր մասին, պայմաններ, գաղտնիության քաղաքականություն և այլն), որոնց հղում է անում footer-ը։',
feat(builder): visual footer builder with drag-and-drop columns Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> P0 user feedback: footer static pages were comma-separated text; no way to add extra phones/emails for different countries. - New FooterColumnConfig/FooterLinkConfig model (footer-config.model.ts): columns of links, each link pointing at an existing static page (resolved by key, so it survives route renames) or a custom URL - Footer Builder UI: add/remove columns and links, per-link toggle between 'existing page' (dropdown of real static pages) and 'custom URL', drag-and-drop reordering of both columns and links via @angular/cdk/drag-drop (same primitive already used by the homepage section builder) - Wired FooterResolverService (the service the real storefront footer actually renders through) to read footer.columns as the primary source when present - without this the builder would have saved data nobody ever displayed. Falls back to the existing legacy static-page auto-grouping when no columns are configured, so existing sites are unaffected - CompanyContactConfig gains additionalPhones/additionalEmails (primary phone/email field unchanged) with add/remove UI for country-specific support lines - Old comma-separated staticPageKeys input removed from the UI; field kept on the model as deprecated/read-compat only - New builder.* i18n keys (en/ru/hy); fixed an accidental duplicate-key collision with pre-existing navigation-section addLink/removeLink keys during the rename pass - Verified in browser: added column, added link, switched link source page->custom, added phone number - all reactive and error-free
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: 'Հեռացնել հղումը',
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: 'Հեռացնել սլայդը',
widgetColumnsDesc: 'Կատեգորիայի սալիկների քանակը մեկ շարքում։',
widgetCardsPerRowDesc: 'Ապրանքի քարտերի քանակը մեկ շարքում։',
widgetFiltersDesc: 'Ցույց տալ ֆիլտրերի կառավարման տարրերը ապրանքների հավաքածուի կողքին։',
widgetShowBadgesDesc: 'Ցույց տալ badge-եր, օրինակ՝ "Նոր" կամ "Զեղչ", ապրանքի քարտերի վրա։',
widgetShowRatingDesc: 'Ցույց տալ աստղանիշ վարկանիշը ապրանքի քարտերի վրա։',
widgetShowPriceDesc: 'Ցույց տալ գինը ապրանքի քարտերի վրա։',
widgetJsonDesc: 'Վիջեթի հատկությունները՝ հում JSON ձևաչափով։ Օգտագործվում է, երբ այս վիջեթի տեսակի համար հատուկ խմբագիր չկա։',
widgetJsonInvalid: 'Սխալ JSON՝ պահպանված է վերջին վավեր տարբերակը։',
wishlistFeatureDesc: 'Թույլ տալ գնորդներին ապրանքներ պահել ընտրյալներում։',
compareFeatureDesc: 'Թույլ տալ գնորդներին համեմատել մի քանի ապրանք միաժամանակ։',
reviewsFeatureDesc: 'Թույլ տալ գնորդներին թողնել և կարդալ ապրանքի կարծիքներ։',
questionsFeatureDesc: 'Թույլ տալ գնորդներին հարցեր տալ և կարդալ ապրանքի պատասխանները։',
commentsFeatureDesc: 'Միացնել ընդհանուր մեկնաբանությունները մարքեթփլեյսի բովանդակության համար։',
recommendationsFeatureDesc: 'Ցույց տալ առաջարկվող ապրանքների բլոկներ ամբողջ կայքում։',
recentlyViewedFeatureDesc: 'Ցույց տալ գնորդներին "վերջին դիտվածներ" ապրանքների ցանկը։',
searchSuggestionsDesc: 'Ցույց տալ կենդանի որոնման առաջարկներ, մինչ գնորդը մուտքագրում է հարցումը։',
searchHistoryDesc: 'Հիշել և ցույց տալ գնորդի վերջին որոնումները։',
catalogNavigationModeLabel: 'Կատալոգի նավիգացիայի ռեժիմ',
catalogNavigationModeDesc: 'Ինչպես են գնորդները նավարկում կատեգորիաների միջև կատալոգում։',
catalogNavDefault: 'Լռելյայն',
catalogNavDefaultDesc: 'Ստանդարտ, breadcrumb-ի վրա հիմնված կատեգորիաների նավիգացիա։',
catalogNavLeftCategory: 'Ձախ կատեգորիաների նավիգացիա',
catalogNavLeftCategoryDesc: 'Մշտական կատեգորիաների ծառ ձախ կողային վահանակում։',
catalogNavMegaCategory: 'Մեգա կատեգորիաների դասավորություն',
catalogNavMegaCategoryDesc: 'Ընդարձակված dropdown ենթակատեգորիաներով և ընտրված ապրանքներով։',
catalogNavTopCarousel: 'Վերևի կատեգորիաների կարուսել',
catalogNavTopCarouselDesc: 'Հորիզոնական թերթվող կատեգորիաների chip-եր կատալոգի ցանցի վերևում։',
fix(builder): WCAG 2.1 AA accessibility fixes RC A11Y-01 audit pass, Builder (project-editor) + content-management static pages editor. Builds on 4ebc15f's composition pass without redoing it. - Skip link: Builder's /edit and /edit/:section routes render outside the storefront app-shell (isAdminRoute() branch has no skip link/landmark, only a bare router-outlet, unlike the storefront's app.html) - added a "skip to content" link targeting a new #builder-main-content landmark on project-editor-page.component, reusing the existing adminShell.skipToContent key and global .skip-link style. Nav landmark already had aria-label (builder.appName) from the prior pass, verified correct. - Save bar: added role="status"/aria-live="polite" to the save/publish status block and role="status" to the draft-restored notice so save/publish state changes and draft recovery are announced to screen readers (previously silent DOM updates). - Media picker (shared, used by both Builder and static-pages editor): upload error message had no aria-live wiring - added role="alert". - HTML editor (marketplace-html-editor): the contenteditable rich-text surface had no accessible role/name - added role="textbox", aria-multiline="true", aria-label. - Drag-and-drop keyboard fallback (WCAG 2.1.1): homepage-section's block list and footer-section's column list + per-column link list use Angular CDK drag-drop (cdkDrag/cdkDropList), which has no built-in keyboard reordering. Added move-up/move-down icon buttons (disabled at the first/last boundary), matching the existing pattern already used by widgets-section and navigation-section. - Color picker: the swatch <input type="color"> had no accessible name (only the paired text input was labelled via app-form-field) - added explicit ariaLabel bindings to all 8 color-picker instances in theme-section. - Languages: the new-locale code input relied on a placeholder ("de") as its only accessible name - added ariaLabel + new builder.newLanguageLabel i18n key (en/ru/hy). - Undefined CSS var --color-primary (never defined anywhere, silently used its hardcoded hex fallback and never responded to tenant theming - same recurring bug class as 4ebc15f) - remapped to the real --primary-color token in marketplace-html-editor, homepage-section, and section.shared (7 usages). - role="alert" added to all 11 validation-error <p class="editor-error"> occurrences across footer/homepage/languages/navigation/preview/widgets sections and the static-pages editor, so field/section validation messages are announced. - scope="col" added to preview-section's change-summary table headers. Flagged, not fixed (design-system decisions, matching the storefront pass's precedent): - Save bar's --warning-color/--error-color/--info-color text fail WCAG AA 4.5:1 in some themes - same genuine brand semantic colors flagged (not fixed) in fb1afb7's storefront pass; needs a deliberate token decision, not a Builder-specific issue. - locale-tabs (app-locale-tabs, shared) has role="tablist"/"tab" and aria-selected but no roving-tabindex/arrow-key navigation - matches the same partial-tablist pattern already accepted for product-tabs in the storefront pass; all tabs remain natively Tab-focusable, so this meets 4.1.2/2.1.1 without the full ARIA authoring-practice pattern. Verified: npx tsc --noEmit clean; npm run build green (only the pre-existing bundle-budget warning, unrelated to this pass). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 09:01:38 +04:00
newLanguageLabel: 'Նոր լեզվի կոդ',
newLanguageDesc: 'ISO լեզվի կոդ՝ որպես աջակցվող լեզու ավելացնելու համար (օր․՝ de, fr)։',
languageAlreadyAdded: 'Այս լեզուն արդեն ավելացված է։',
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: 'Մարկետփլեյսի կոնստրուկտոր',
backToDashboard: 'Վերադառնալ կառավարման վահանակ',
languagesSummaryDesc: 'Լեզուները, որոնցով հասանելի է ձեր մարքեթփլեյսը։ Առաջինը գնորդների լռելյայն լեզուն է։',
manageLanguages: 'Կառավարել լեզուները',
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: 'Եզրագծեր',
homepageOverviewTitle: 'Գլխավոր էջ',
homepageOverviewSubtitle: 'Ինչից է կազմված ձեր մարկետփլեյսի գլխավոր էջը։',
homepageOverviewComplete: 'Ձեր գլխավոր էջն ամբողջությամբ կարգավորված է։',
homepageActiveSections: 'Ակտիվ բլոկներ',
homepageDisabledSections: 'Թաքցված բլոկներ',
homepageHealthHero: 'Ողջունող բաններ ավելացված է',
homepageHealthCategories: 'Կատեգորիաների բլոկ ավելացված է',
homepageHealthProducts: 'Ապրանքների բլոկ ավելացված է',
homepageHealthPromotion: 'Ակցիայի բլոկ ավելացված է',
homepageHealthNewsletter: 'Բաժանորդագրման ձև ավելացված է',
homepageHealthAnySections: 'Էջում կա գոնե մեկ բլոկ',
widgetTypeHero: 'Ողջունող բաններ',
widgetTypeCategories: 'Կատեգորիաների բլոկ',
widgetTypeProducts: 'Ապրանքների բլոկ',
widgetHidden: 'Թաքցված',
widgetVisible: 'Ցուցադրել',
widgetMoveUp: 'Տեղափոխել վերև',
widgetMoveDown: 'Տեղափոխել ներքև',
widgetDuplicate: 'Կրկնօրինակել',
widgetRemove: 'Հեռացնել',
widgetRemoveConfirm: 'Հեռացնե՞լ այս բլոկը գլխավոր էջից։',
widgetAdvancedSettings: 'Լրացուցիչ կարգավորումներ',
widgetsEmptyTitle: 'Դեռ վիջեթներ չկան',
widgetsEmptyDesc: 'Ավելացրեք բլոկ գլխավոր էջում «Գլխավոր էջ» ներդիրից, և դրա կարգավորումները կհայտնվեն այստեղ։',
homepageEmptyTitle: 'Գլխավոր էջը կարգավորված չէ',
homepageEmptyDesc: 'Ձեր խանութն դեռ չունի կարգավորված գլխավոր էջ։ Ստեղծելու համար դիմեք աջակցության թիմին։',
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 այն ամենի համար, ինչ մյուս բլոկները չեն ծածկում։',
},
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: 'Մարկետփլեյսի կոնստրուկտոր',
actionCategories: 'Կատեգորիաներ',
actionProducts: 'Ապրանքներ',
actionStaticPages: 'Ստատիկ էջեր',
actionTransactions: 'Գործարքներ',
actionOrders: 'Պատվերներ',
actionMediaLibrary: 'Մեդիագրադարան',
actionUsers: 'Օգտատերեր և իրավունքներ',
actionMonitoring: 'Մոնիտորինգ',
actionAnalytics: 'Վերլուծություն',
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: 'Դեռ ակտիվություն չկա',
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-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: 'Անջատված',
previewDesktop: 'Դեսքթոփ',
previewTablet: 'Պլանշետ',
previewMobile: 'Հեռախոս',
previewToggle: 'Նախադիտում',
2026-07-10 13:52:01 +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 (լրացուցիչ)',
pageContentLabel: 'Էջի բովանդակություն',
pageContentDesc: 'Գրեք և ձևավորեք տեքստը, նկարներն ու հղումները, որոնք գնորդները կտեսնեն այս էջում։',
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: 'Պատասխանում է հաճախակի հարցերին նախապես։' },
},
},
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: 'Բեռնում...',
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
},
ux: {
items: 'ապրանք',
wishlistTitle: 'Ընտրյալներ',
wishlistEmptyTitle: 'Ընտրյալները դատարկ են',
wishlistEmptyDescription: 'Պահպանեք ապրանքները, որպեսզի արագ վերադառնաք դրանց։',
clearWishlist: 'Մաքրել ընտրյալները',
wishlistCleared: 'Ընտրյալները մաքրվել են',
compareTitle: 'Ապրանքների համեմատում',
compareEmptyTitle: 'Համեմատելու ապրանքներ չկան',
compareEmptyDescription: 'Ավելացրեք ապրանքներ կատալոգից՝ բնութագրերը և գները համեմատելու համար։',
clearCompare: 'Մաքրել համեմատումը',
removeFromCompare: 'Հեռացնել համեմատումից',
hideIdentical: 'Թաքցնել նույն արժեքները',
highlightDifferences: 'Ընդգծել տարբերությունները',
clearRecentlyViewed: 'Մաքրել դիտվածները',
recentlyViewedEmpty: 'Դուք դեռ ապրանքներ չեք դիտել։',
saveSearch: 'Պահպանել որոնումը',
goToCatalog: 'Գնալ կատալոգ',
2026-07-09 01:40:22 +04:00
wishlistAdded: 'Ավելացվեց ընտրյալներում',
wishlistRemoved: 'Հեռացվեց ընտրյալներից',
compareAdded: 'Ավելացվեց համեմատման մեջ',
compareRemoved: 'Հեռացվեց համեմատումից',
compareLimitReached: 'Համեմատման սահմանը հասել է ({{maxItems}})',
productShared: 'Ապրանքը կիսվել է',
productLinkCopied: 'Ապրանքի հղումը պատճենվել է',
sharingUnsupported: 'Այս սարքում կիսվելու հնարավորությունը չի աջակցվում',
addedToCart: 'Ավելացվեց զամբյուղում',
2026-07-09 01:40:22 +04:00
enterQueryBeforeSave: 'Մինչ պահպանումը մուտքագրեք որոնման հարցում',
savedSearchNamed: 'Պահպանված որոնում՝ {{name}}',
recentlyViewedTitle: 'Վերջին դիտվածներ',
compareAttribute: 'Ատրիբուտ',
comparePrice: 'Գին',
compareRating: 'Վարկանիշ',
compareStock: 'Առկայություն',
compareDiscount: 'Զեղչ',
compareColor: 'Գույն',
compareSize: 'Չափ',
compareUnknown: 'անհայտ',
},
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-ը կախված է դրանից։',
},
adminModeration: {
search: 'Փնտրել ըստ հաճախորդի, ապրանքի կամ կարծիքի տեքստի…',
selectAllRows: 'Ընտրել բոլոր կարծիքները',
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: 'Մերժված',
},
},
adminOrders: {
back: 'Վերադառնալ պատվերներին',
search: 'Փնտրել ըստ պատվերի համարի, անվան, էլ. փոստի կամ հեռախոսի…',
export: 'Արտահանել',
selectAllRows: 'Ընտրել բոլոր պատվերները',
selectRow: 'Ընտրել պատվերը',
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: {
all: 'Բոլոր կարգավիճակները',
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: 'Հաճախորդները կհայտնվեն այստեղ առաջին պատվերից հետո։',
},
mediaLibrary: {
title: 'Մեդիագրադարան',
upload: 'Վերբեռնել',
uploading: 'Վերբեռնվում է...',
searchPlaceholder: 'Փնտրել ֆայլեր...',
delete: 'Ջնջել',
deleteConfirmTitle: 'Ջնջե՞լ ֆայլը',
deleteConfirmBody: 'Այս գործողությունը հնարավոր չէ հետարկել։',
cancel: 'Չեղարկել',
confirm: 'Ջնջել',
emptyTitle: 'Ֆայլեր դեռ չկան',
emptyDescription: 'Վերբեռնեք պատկեր կամ փաստաթուղթ սկսելու համար։',
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: 'Այլ',
},
},
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: 'Ընտրել պատկեր',
replaceImage: 'Փոխարինել պատկերը',
feat(categories): implement professional category management experience Categories dashboard (real total/visible/hidden/empty/root/subcategory/missing-image/missing-SEO/last-modified/completion% stats, recommended next action); tree view is now a real expand/collapse hierarchy (state persisted via LocalStorageService) with keyboard navigation (arrow keys, jump-to-parent), search that force-expands and keeps only matching branches + their ancestors/descendants instead of silently dropping deep matches; added Table/Cards views alongside the tree with density and saved column visibility; real bulk actions (show/hide/delete/assign parent/assign image via the Media Library picker/duplicate via the existing createCategory call/CSV export) plus the pre-existing single-item actions; reusable CategoryHealthWidget (image/SEO/description/valid-parent/visibility/products-assigned + completion%); editor reorganized into General/Media/SEO/Visibility/Navigation/Attributes/Advanced tabs, media now uses the shared ImageFieldComponent, SEO explains fields in plain language with a live preview, Navigation tab shows real breadcrumb/children/visibility-based nav status, Attributes uses the shared KeyValueEditorComponent. Filled in the adminCategories i18n namespace (previously only 2 of ~90 referenced keys existed) across en/ru/hy. Also fixed the pre-existing bug where a filtered/searched category list could silently drop a matched descendant whose ancestor's title didn't match, by loading the full catalog once and filtering client-side.
2026-07-18 17:04:11 +04:00
search: 'Փնտրել կատեգորիաներ…',
showDeleted: 'Ցույց տալ ջնջվածները',
selectAllRows: 'Ընտրել բոլոր կատեգորիաները',
selectRow: 'Ընտրել կատեգորիան',
toggleVisibility: 'Փոխել տեսանելիությունը',
feat(categories): implement professional category management experience Categories dashboard (real total/visible/hidden/empty/root/subcategory/missing-image/missing-SEO/last-modified/completion% stats, recommended next action); tree view is now a real expand/collapse hierarchy (state persisted via LocalStorageService) with keyboard navigation (arrow keys, jump-to-parent), search that force-expands and keeps only matching branches + their ancestors/descendants instead of silently dropping deep matches; added Table/Cards views alongside the tree with density and saved column visibility; real bulk actions (show/hide/delete/assign parent/assign image via the Media Library picker/duplicate via the existing createCategory call/CSV export) plus the pre-existing single-item actions; reusable CategoryHealthWidget (image/SEO/description/valid-parent/visibility/products-assigned + completion%); editor reorganized into General/Media/SEO/Visibility/Navigation/Attributes/Advanced tabs, media now uses the shared ImageFieldComponent, SEO explains fields in plain language with a live preview, Navigation tab shows real breadcrumb/children/visibility-based nav status, Attributes uses the shared KeyValueEditorComponent. Filled in the adminCategories i18n namespace (previously only 2 of ~90 referenced keys existed) across en/ru/hy. Also fixed the pre-existing bug where a filtered/searched category list could silently drop a matched descendant whose ancestor's title didn't match, by loading the full catalog once and filtering client-side.
2026-07-18 17:04:11 +04:00
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: 'Ծալել',
fix(backoffice): WCAG 2.1 AA accessibility fixes RC A11Y-01 audit pass, Backoffice (admin/*) area. Builds on 712a7b4/63c9cee's composition pass (scope="col", skeletons, empty-states) without redoing that work. - Sidebar nav landmark: admin-layout's <nav aria-label> reused the "Dashboard" nav-item translation key as its landmark label, misleadingly announcing the whole sidebar as "Dashboard" - added a dedicated adminShell.sidebarLabel key ("Admin sidebar navigation") in en/ru/hy. Skip link, #admin-content main landmark, Escape handling, and mobile-drawer focus management were already correct - verified, not touched. - Categories tree drag-and-drop keyboard fallback (WCAG 2.1.1): the category tree's native HTML5 DnD (draggable/dragstart/drop) reorders siblings with no keyboard equivalent - existing arrow-key tree navigation only expands/ collapses/selects, never reorders. Added per-row move-up/move-down icon buttons (disabled at sibling boundaries), reusing the existing `reorder` output so the facade's reorder logic is untouched; new adminCategories.moveUp/moveDown keys in en/ru/hy. - Screen-reader loading announcements: skeleton-row loading states across Products, Categories, Customers, Orders, Transactions, Users, Reviews, Monitoring (webhooks/events), and Analytics (summary cards + top products) were purely visual (app-skeleton is aria-hidden by design) with no accessible "loading" text, unlike the storefront/product-details pattern - added role="status"/aria-live="polite"/aria-busy + sr-only text using the existing common.loading key. - Table row headers: added scope="row" to the primary identifying cell (product/category/customer name, order number, transaction order number, user name, review customer, report target, top-products/low-stock product name, webhook endpoint) on 9 tables that only had scope="col". Added matching `tbody th[scope='row'] { font-weight/color/text-align/ vertical-align }` + last-row border resets in each component's own scss so the semantic change doesn't alter visuals (the shared app-table stylesheet styles all <th> as bold/muted by default). Verified via `git show --stat` of fb1afb7/a03260e and `docs/UI-COMPOSITION- REVIEW.md`'s Backoffice sections first, per instructions - confirmed scope="col" coverage already complete, all admin modals already route through the shared app-dialog (focus-trap/Escape/return-focus already correct, nothing to fix), and the bare-<select> filters still carry aria-label per the accepted Sprint 28 decision (not re-migrated to app-select). Flagged, not fixed: - No toast/notification system exists anywhere in this codebase (product/ category save and delete call the gateway with no success/error UI at all, not even a subscribe error handler) - there is nothing to wire aria-live onto without adding a new UI mechanism, which is out of scope for an a11y-only pass. A prerequisite feature-level fix, not an a11y regression. - Dashboard's per-card metric/status-row/timeline skeletons (dashboard- metric, dashboard-status-row, dashboard-timeline) were left without aria-live wiring - wrapping each of the ~10 simultaneous mini-widgets in its own live region would fire a burst of redundant announcements; needs a single page-level "loading dashboard" region instead, a larger change than this surgical pass. - Monitoring's events table and the notifications dropdown (role="menu" with a static empty-state message, aria-haspopup="true") were left as-is - matches the same partial-widget-pattern precedent already accepted for locale-tabs/product-tabs in the storefront and builder passes. - Analytics `lowStockProducts` table's missing loading-skeleton branch (already flagged, not fixed, in the RC-Visual-02 pass) - untouched again here for the same reason. Verified: npx tsc --noEmit clean; npm run build green (only the pre-existing 768.57 kB vs 700 kB initial-bundle budget warning, unrelated to this pass). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 09:18:09 +04:00
moveUp: 'Տեղափոխել վերև',
moveDown: 'Տեղափոխել ներքև',
feat(categories): implement professional category management experience Categories dashboard (real total/visible/hidden/empty/root/subcategory/missing-image/missing-SEO/last-modified/completion% stats, recommended next action); tree view is now a real expand/collapse hierarchy (state persisted via LocalStorageService) with keyboard navigation (arrow keys, jump-to-parent), search that force-expands and keeps only matching branches + their ancestors/descendants instead of silently dropping deep matches; added Table/Cards views alongside the tree with density and saved column visibility; real bulk actions (show/hide/delete/assign parent/assign image via the Media Library picker/duplicate via the existing createCategory call/CSV export) plus the pre-existing single-item actions; reusable CategoryHealthWidget (image/SEO/description/valid-parent/visibility/products-assigned + completion%); editor reorganized into General/Media/SEO/Visibility/Navigation/Attributes/Advanced tabs, media now uses the shared ImageFieldComponent, SEO explains fields in plain language with a live preview, Navigation tab shows real breadcrumb/children/visibility-based nav status, Attributes uses the shared KeyValueEditorComponent. Filled in the adminCategories i18n namespace (previously only 2 of ~90 referenced keys existed) across en/ru/hy. Also fixed the pre-existing bug where a filtered/searched category list could silently drop a matched descendant whose ancestor's title didn't match, by loading the full catalog once and filtering client-side.
2026-07-18 17:04:11 +04:00
jumpToParent: 'Անցնել ծնողին',
deletedBadge: 'Ջնջված',
column_slug: 'Հասցե',
column_items: 'Ապրանքներ',
column_status: 'Կարգավիճակ',
column_visibility: 'Տեսանելիություն',
column_updated: 'Վերջին փոփոխություն',
bulkAssignParent: 'Նշանակել ծնող',
bulkAssignImage: 'Նշանակել պատկեր',
groupGeneral: 'Հիմնական',
groupMedia: 'Մեդիա',
groupSeo: 'SEO',
groupVisibility: 'Տեսանելիություն',
groupNavigation: 'Նավիգացիա',
groupAttributes: 'Հատկանիշներ',
groupAdvanced: 'Լրացուցիչ',
visibilityExplain: 'Թաքցված կատեգորիան և դրա ապրանքները չեն երևում խանութի նավիգացիայում և որոնման մեջ, մինչև այն նորից տեսանելի դարձնեք։',
navBreadcrumb: 'Ուղենիշ',
navBreadcrumbHint: 'Սա այն ուղին է, որը գնորդները տեսնում են կատեգորիայի վերևում, օր.՝ Գլխավոր Էլեկտրոնիկա Հեռախոսներ։ Այն կառուցվում է ընտրված ծնող կատեգորիայից։',
iconHint: 'Փոքր էմոջի կամ նշան կատեգորիայի անվան կողքին մենյուում, օր.՝ 📱։ Թողեք դատարկ, եթե պետք չէ։',
feat(categories): implement professional category management experience Categories dashboard (real total/visible/hidden/empty/root/subcategory/missing-image/missing-SEO/last-modified/completion% stats, recommended next action); tree view is now a real expand/collapse hierarchy (state persisted via LocalStorageService) with keyboard navigation (arrow keys, jump-to-parent), search that force-expands and keeps only matching branches + their ancestors/descendants instead of silently dropping deep matches; added Table/Cards views alongside the tree with density and saved column visibility; real bulk actions (show/hide/delete/assign parent/assign image via the Media Library picker/duplicate via the existing createCategory call/CSV export) plus the pre-existing single-item actions; reusable CategoryHealthWidget (image/SEO/description/valid-parent/visibility/products-assigned + completion%); editor reorganized into General/Media/SEO/Visibility/Navigation/Attributes/Advanced tabs, media now uses the shared ImageFieldComponent, SEO explains fields in plain language with a live preview, Navigation tab shows real breadcrumb/children/visibility-based nav status, Attributes uses the shared KeyValueEditorComponent. Filled in the adminCategories i18n namespace (previously only 2 of ~90 referenced keys existed) across en/ru/hy. Also fixed the pre-existing bug where a filtered/searched category list could silently drop a matched descendant whose ancestor's title didn't match, by loading the full catalog once and filtering client-side.
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
},
adminProducts: {
fix(admin): products canDeactivate guard, unblock npm, drop dead deps RC-01 Phase 1 mechanical fixes (verified against current repo state, not blindly reapplied from TODO.md): - admin/products create/edit/duplicate now protected by an unsaved- changes guard (adminProductDirtyGuard), mirroring the existing categories pattern. AdminProductsFacade had zero dirty-tracking before this - added a dirty signal, set true on updateDraft(), cleared on load/create/successful save. Added confirmLeaveUnsaved to the adminProducts i18n section (en/ru/hy) - categories already had its own copy of this key, products didn't. - barry-cache bumped ^0.1.0 -> ^0.9.3 (the pinned range no longer resolved on the registry - ETARGET - which had been silently blocking every npm install/uninstall all cycle). - Removed primeng/primeicons (npm uninstall, now unblocked) - the only consumer (items-carousel) was already deleted in RC PERF-01. - Removed core/search/services/search-history.service.ts, a dead 1-line re-export with zero importers (verified: the real implementation is features/search/services/search-history.service.ts, used by search.facade.ts). Left core/search/models/* alone - those ARE live, imported by catalog components. Verified before touching: HeaderConfig.showProfile toggle is already removed from the header-section editor template (TODO.md was stale on this one) - no change needed, will correct the tracking doc separately. tsc --noEmit clean, npm run build green (bundle unchanged, primeng was already tree-shaken out, this just removes the dead dependency declaration itself). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-25 20:04:51 +04:00
confirmLeaveUnsaved: 'Դուք ունեք չպահպանված փոփոխություններ։ Դո՞ւրս գալ առանց պահպանելու։',
emptyTitle: 'Ապրանքներ չեն գտնվել',
emptyDescription: 'Փոխեք ֆիլտրերը կամ ստեղծեք նոր ապրանք։',
emptyGuide: 'Լավ ապրանքին բավական է հստակ վերնագիր, առնվազն մեկ լուսանկար, գին և կարճ նկարագրություն՝ հրապարակելու համար։ Մնացածը կարող եք ավելացնել հետո։',
selectAllRows: 'Ընտրել բոլոր ապրանքները',
selectRow: 'Ընտրել ապրանքը',
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: 'Յուրաքանչյուր տարբերակ այս ապրանքի առանձին գնվող տարբերակ է (օր․՝ չափս կամ գույն)՝ իր գնով և մնացորդով։',
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: 'Նկար',
archived: 'Արխիվում',
slugHint: 'Ապրանքի վեբ-հասցեն։ Լրացվում է ինքնաշխատ անունից — փոխեք միայն, եթե պետք է հատուկ URL։',
skuHint: 'SKU (ապրանքային կոդ) — ձեր ներքին կոդն է պահեստի հաշվառման և պատվերների որոնման համար։ Ցանկացած եզակի տեքստ կաշխատի։',
generate: 'Գեներացնել',
seoGenerate: 'Լրացնել ապրանքի տվյալներից',
seoGenerateHint: 'Լրացնում է դատարկ դաշտերը անունից և կարճ նկարագրությունից։ Ձեր տեքստը չի փոխվում։',
translationsHint: 'Վերևի հիմնական դաշտերը ցուցադրվում են խանութի հիմնական լեզվով։ Այստեղ ավելացրեք թարգմանություններ այլ լեզուների համար — եթե թարգմանությունը դատարկ է, գնորդները կտեսնեն հիմնական տեքստը։',
badgesHint: 'Բեյջերը փոքր գունավոր պիտակներ են, որոնք գնորդները տեսնում են ապրանքի նկարի վրա։ Ընտրեք ստանդարտներից կամ ավելացրեք ձերը։',
addBadge: 'Ավելացնել',
removeBadge: 'Հեռացնել բեյջը',
customBadgePlaceholder: 'Ձեր բեյջի տեքստը…',
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: 'Հիանալի է․ կատալոգը լավ վիճակում է։',
},
adminUsers: {
emptyTitle: 'Օգտատերեր չեն գտնվել',
emptyDescription: 'Հրավիրեք գործընկերոջ՝ սկսելու համար։',
invitationsEmptyTitle: 'Սպասող հրավերներ չկան',
title: 'Թիմ',
name: 'Անուն',
email: 'Էլ. փոստ',
scope: 'Աշխատանքային տարածք',
role: 'Դեր',
roles: 'Դերեր',
lastLogin: 'Վերջին մուտք',
sessions: 'Ակտիվ նստաշրջաններ',
currentSession: 'Ընթացիկ նստաշրջան',
invite: 'Հրավիրել անդամ',
sendInvite: 'Ուղարկել հրավեր',
revoke: 'Չեղարկել',
passwordlessHint: 'Անդամները մուտք են գործում Telegram-ով — գաղտնաբառեր պետք չեն։',
confirmSuspend: 'Արգելափակե՞լ այս անդամին։ Մուտքը կփակվի անմիջապես։',
suspend: 'Արգելափակել',
reactivate: 'Վերականգնել',
scopeValue: {
marketplace: 'Խանութ',
office: 'Բեք-օֆիս',
},
statusValue: {
active: 'Ակտիվ',
invited: 'Հրավիրված',
suspended: 'Արգելափակված',
},
invitationStatus: {
pending: 'Սպասում է',
accepted: 'Ընդունված',
expired: 'Ժամկետանց',
revoked: 'Չեղարկված',
},
},
adminTransactions: {
search: 'Գործարքների որոնում',
type: 'Տեսակ',
method: 'Վճարման եղանակ',
fraud: 'Խարդախության ստուգում',
flagged: 'Նշված',
flag: 'Նշել որպես կասկածելի',
clearFlag: 'Հանել նշումը',
retry: 'Կրկնել',
audit: 'Պատմություն',
emptyTitle: 'Գործարքներ չեն գտնվել',
emptyDescription: 'Փորձեք այլ ֆիլտր կամ որոնման բառ։',
status: {
all: 'Բոլոր կարգավիճակները',
pending: 'Մշակվում է',
success: 'Հաջողված',
failed: 'Ձախողված',
retried: 'Կրկնված',
},
typeValue: {
all: 'Բոլոր տեսակները',
payment: 'Վճարում',
refund: 'Վերադարձ',
qr_payment: 'QR վճարում',
},
},
adminMonitoring: {
eventsEmptyTitle: 'Իրադարձություններ չեն գտնվել',
eventsEmptyDescription: 'Փորձեք այլ կատեգորիայի ֆիլտր կամ որոնման բառ։',
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: 'Սխալ',
},
systemState: 'Համակարգի վիճակ',
backendConnectivity: 'Բեքենդ',
connected: 'Կապակցված է',
loading: 'Բեռնվում է',
draftState: 'Սևագիր',
unsavedChanges: 'Չպահպանված փոփոխություններ',
noDraft: 'Սևագիր չկա',
lastSaved: 'Վերջին պահպանում',
lastPublished: 'Վերջին հրապարակում',
syncStatus: 'Համաժամացում',
},
adminAnalytics: {
topProductsEmptyTitle: 'Այս ժամանակահատվածում ապրանքների վաճառք չկա',
topProductsEmptyDescription: 'Փորձեք ընտրել ավելի լայն ամսաթվերի միջակայք։',
topProducts: 'Թոփ ապրանքներ',
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: 'Կրիտիկական',
},
},
adminShell: {
skipToContent: 'Անցնել բովանդակությանը',
fix(backoffice): WCAG 2.1 AA accessibility fixes RC A11Y-01 audit pass, Backoffice (admin/*) area. Builds on 712a7b4/63c9cee's composition pass (scope="col", skeletons, empty-states) without redoing that work. - Sidebar nav landmark: admin-layout's <nav aria-label> reused the "Dashboard" nav-item translation key as its landmark label, misleadingly announcing the whole sidebar as "Dashboard" - added a dedicated adminShell.sidebarLabel key ("Admin sidebar navigation") in en/ru/hy. Skip link, #admin-content main landmark, Escape handling, and mobile-drawer focus management were already correct - verified, not touched. - Categories tree drag-and-drop keyboard fallback (WCAG 2.1.1): the category tree's native HTML5 DnD (draggable/dragstart/drop) reorders siblings with no keyboard equivalent - existing arrow-key tree navigation only expands/ collapses/selects, never reorders. Added per-row move-up/move-down icon buttons (disabled at sibling boundaries), reusing the existing `reorder` output so the facade's reorder logic is untouched; new adminCategories.moveUp/moveDown keys in en/ru/hy. - Screen-reader loading announcements: skeleton-row loading states across Products, Categories, Customers, Orders, Transactions, Users, Reviews, Monitoring (webhooks/events), and Analytics (summary cards + top products) were purely visual (app-skeleton is aria-hidden by design) with no accessible "loading" text, unlike the storefront/product-details pattern - added role="status"/aria-live="polite"/aria-busy + sr-only text using the existing common.loading key. - Table row headers: added scope="row" to the primary identifying cell (product/category/customer name, order number, transaction order number, user name, review customer, report target, top-products/low-stock product name, webhook endpoint) on 9 tables that only had scope="col". Added matching `tbody th[scope='row'] { font-weight/color/text-align/ vertical-align }` + last-row border resets in each component's own scss so the semantic change doesn't alter visuals (the shared app-table stylesheet styles all <th> as bold/muted by default). Verified via `git show --stat` of fb1afb7/a03260e and `docs/UI-COMPOSITION- REVIEW.md`'s Backoffice sections first, per instructions - confirmed scope="col" coverage already complete, all admin modals already route through the shared app-dialog (focus-trap/Escape/return-focus already correct, nothing to fix), and the bare-<select> filters still carry aria-label per the accepted Sprint 28 decision (not re-migrated to app-select). Flagged, not fixed: - No toast/notification system exists anywhere in this codebase (product/ category save and delete call the gateway with no success/error UI at all, not even a subscribe error handler) - there is nothing to wire aria-live onto without adding a new UI mechanism, which is out of scope for an a11y-only pass. A prerequisite feature-level fix, not an a11y regression. - Dashboard's per-card metric/status-row/timeline skeletons (dashboard- metric, dashboard-status-row, dashboard-timeline) were left without aria-live wiring - wrapping each of the ~10 simultaneous mini-widgets in its own live region would fire a burst of redundant announcements; needs a single page-level "loading dashboard" region instead, a larger change than this surgical pass. - Monitoring's events table and the notifications dropdown (role="menu" with a static empty-state message, aria-haspopup="true") were left as-is - matches the same partial-widget-pattern precedent already accepted for locale-tabs/product-tabs in the storefront and builder passes. - Analytics `lowStockProducts` table's missing loading-skeleton branch (already flagged, not fixed, in the RC-Visual-02 pass) - untouched again here for the same reason. Verified: npx tsc --noEmit clean; npm run build green (only the pre-existing 768.57 kB vs 700 kB initial-bundle budget warning, unrelated to this pass). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 09:18:09 +04:00
sidebarLabel: 'Ադմինիստրատորի կողային նավիգացիա',
openSidebar: 'Բացել ընտրացանկը',
closeSidebar: 'Փակել ընտրացանկը',
collapseSidebar: 'Ծալել ընտրացանկը',
expandSidebar: 'Ընդարձակել ընտրացանկը',
nav: {
dashboard: 'Կառավարման վահանակ',
catalogGroup: 'Կատալոգ',
products: 'Ապրանքներ',
categories: 'Կատեգորիաներ',
orders: 'Պատվերներ',
customers: 'Հաճախորդներ',
moderation: 'Կարծիքներ և մոդերացիա',
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: 'Պատվերի մանրամասներն ու կարգավիճակը' },
customers: { title: 'Հաճախորդներ', description: 'Բոլորը, ովքեր պատվեր են կատարել' },
customerDetail: { title: 'Հաճախորդ', description: 'Հաճախորդի պրոֆիլ, պատվերներ և ակտիվություն' },
moderation: { title: 'Կարծիքներ և մոդերացիա', description: 'Դիտեք և մոդերացրեք հաճախորդների կարծիքները' },
reviewDetail: { title: 'Կարծիք', description: 'Կարծիքի մանրամասներ և մոդերացիայի գործողություններ' },
reportsQueue: { title: 'Բողոքների հերթ', description: 'Հաճախորդների կողմից բողոքարկված բովանդակություն' },
transactions: { title: 'Գործարքներ', description: 'Վճարումներ, վերադարձներ և կեղծիքի ստուգում' },
media: { title: 'Մեդիադարան', description: 'Ապրանքների և էջերի պատկերներ ու ֆայլեր' },
users: { title: 'Օգտատերեր', description: 'Ադմինիստրատորների թիմը և իրավունքները' },
monitoring: { title: 'Մոնիտորինգ', description: 'Հերթերի, webhook-ների և համակարգային իրադարձությունների վիճակը' },
analytics: { title: 'Վերլուծություն', description: 'Վաճառքներ, ապրանքներ և գնորդների վարքագիծ' },
},
},
2026-02-26 23:09:20 +04:00
};