added translations
This commit is contained in:
188
src/app/i18n/en.ts
Normal file
188
src/app/i18n/en.ts
Normal file
@@ -0,0 +1,188 @@
|
||||
import { Translations } from './translations';
|
||||
|
||||
export const en: Translations = {
|
||||
header: {
|
||||
home: 'Home',
|
||||
search: 'Search',
|
||||
about: 'About',
|
||||
contacts: 'Contacts',
|
||||
searchPlaceholder: 'Search...',
|
||||
catalog: 'Catalog',
|
||||
},
|
||||
footer: {
|
||||
description: 'A modern marketplace for comfortable shopping',
|
||||
company: 'Company',
|
||||
aboutUs: 'About us',
|
||||
contacts: 'Contacts',
|
||||
requisites: 'Company details',
|
||||
support: 'Support',
|
||||
faq: 'FAQ',
|
||||
delivery: 'Delivery',
|
||||
guarantee: 'Warranty',
|
||||
legal: 'Legal information',
|
||||
offer: 'Public offer',
|
||||
privacy: 'Privacy policy',
|
||||
returns: 'Returns',
|
||||
info: 'Information',
|
||||
aboutCompany: 'About company',
|
||||
documents: 'Documents',
|
||||
paymentRules: 'Payment terms',
|
||||
returnPolicy: 'Return policy',
|
||||
publicOffer: 'Public offer',
|
||||
help: 'Help',
|
||||
payment: 'Payment',
|
||||
allRightsReserved: 'All rights reserved.',
|
||||
},
|
||||
home: {
|
||||
welcomeTo: 'Welcome to {{brand}}',
|
||||
subtitle: 'Find everything you need in one place',
|
||||
startSearch: 'Start search',
|
||||
loading: 'Loading categories...',
|
||||
errorTitle: 'Something went wrong',
|
||||
retry: 'Try again',
|
||||
categoriesTitle: 'Product categories',
|
||||
categoriesSubtitle: 'Choose a category',
|
||||
categoriesEmpty: 'Categories coming soon',
|
||||
categoriesEmptyDesc: 'We are working on filling the catalog',
|
||||
dexarHeroTitle: 'Find everything here',
|
||||
dexarHeroSubtitle: 'Thousands of products in one place',
|
||||
dexarHeroTagline: 'simple and convenient',
|
||||
goToCatalog: 'Go to catalog',
|
||||
findProduct: 'Find a product',
|
||||
loadingDexar: 'Loading categories...',
|
||||
catalogTitle: 'Product catalog',
|
||||
emptyCategoriesDexar: 'No categories yet',
|
||||
categoriesSoonDexar: 'Categories will appear here soon',
|
||||
itemsCount: '{{count}} products',
|
||||
},
|
||||
cart: {
|
||||
title: 'Cart',
|
||||
clear: 'Clear',
|
||||
empty: 'Cart is empty',
|
||||
emptyDesc: 'Add products to start shopping',
|
||||
goShopping: 'Start shopping',
|
||||
total: 'Total',
|
||||
items: 'Products',
|
||||
deliveryLabel: 'Delivery',
|
||||
toPay: 'To pay',
|
||||
agreeWith: 'I agree with the',
|
||||
publicOffer: 'public offer',
|
||||
returnPolicy: 'return policy',
|
||||
guaranteeTerms: 'warranty terms',
|
||||
privacyPolicy: 'privacy policy',
|
||||
and: 'and',
|
||||
checkout: 'Place order',
|
||||
close: 'Close',
|
||||
creatingPayment: 'Creating payment...',
|
||||
waitFewSeconds: 'Please wait a few seconds',
|
||||
scanQr: 'Scan the QR code to pay',
|
||||
amountToPay: 'Amount due:',
|
||||
waitingPayment: 'Waiting for payment...',
|
||||
copied: '✓ Copied',
|
||||
copyLink: 'Copy link',
|
||||
openNewTab: 'Open in new tab',
|
||||
paymentSuccess: 'Congratulations! Payment successful!',
|
||||
paymentSuccessDesc: 'Enter your contact details and we will send your purchase within a few minutes',
|
||||
sending: 'Sending...',
|
||||
send: 'Send',
|
||||
paymentTimeout: 'Payment timed out',
|
||||
paymentTimeoutDesc: 'We did not receive payment confirmation within 3 minutes.',
|
||||
autoClose: 'Window will close automatically...',
|
||||
confirmClear: 'Are you sure you want to clear the cart?',
|
||||
acceptTerms: 'Please accept the offer terms, return policy, and warranty terms to proceed with the order.',
|
||||
copyError: 'Copy error:',
|
||||
emailSuccess: 'Email sent successfully! Check your inbox.',
|
||||
emailError: 'An error occurred while sending the email. Please try again.',
|
||||
phoneRequired: 'Phone number is required',
|
||||
phoneMoreDigits: 'Enter {{count}} more digits',
|
||||
phoneTooMany: 'Too many digits',
|
||||
emailRequired: 'Email is required',
|
||||
emailTooShort: 'Email is too short (minimum 5 characters)',
|
||||
emailTooLong: 'Email is too long (maximum 100 characters)',
|
||||
emailNeedsAt: 'Email must contain @',
|
||||
emailNeedsDomain: 'Email must contain a domain (.com, .ru, etc.)',
|
||||
emailInvalid: 'Invalid email format',
|
||||
},
|
||||
search: {
|
||||
title: 'Product search',
|
||||
placeholder: 'Enter product name...',
|
||||
resultsCount: 'Products found:',
|
||||
searching: 'Searching...',
|
||||
retry: 'Try again',
|
||||
noResults: 'Nothing found',
|
||||
noResultsFor: 'No products found for "{{query}}"',
|
||||
noResultsHint: 'Try changing your query or using different keywords',
|
||||
addToCart: 'Add to cart',
|
||||
loadingMore: 'Loading...',
|
||||
allLoaded: 'All results loaded',
|
||||
emptyState: 'Enter a query to search for products',
|
||||
of: 'of',
|
||||
},
|
||||
category: {
|
||||
retry: 'Try again',
|
||||
addToCart: 'Add to cart',
|
||||
loadingMore: 'Loading...',
|
||||
allLoaded: 'All products loaded',
|
||||
emptyTitle: 'Oops! Nothing here yet',
|
||||
emptyDesc: 'There are no products in this category yet, but they will appear soon',
|
||||
goHome: 'Go home',
|
||||
loading: 'Loading products...',
|
||||
},
|
||||
subcategories: {
|
||||
loading: 'Loading subcategories...',
|
||||
retry: 'Try again',
|
||||
emptyTitle: 'Oops! No subcategories yet',
|
||||
emptyDesc: 'There are no subcategories in this section yet, but they will appear soon',
|
||||
goHome: 'Go home',
|
||||
},
|
||||
itemDetail: {
|
||||
loading: 'Loading...',
|
||||
loadingDexar: 'Loading product...',
|
||||
back: 'Go back',
|
||||
backHome: 'Back to home',
|
||||
noImage: 'No image',
|
||||
stock: 'Availability:',
|
||||
inStock: 'In stock',
|
||||
lowStock: 'Few left',
|
||||
lastItems: 'Last items',
|
||||
mediumStock: 'Running low',
|
||||
addToCart: 'Add to cart',
|
||||
description: 'Description',
|
||||
reviews: 'Reviews',
|
||||
yourReview: 'Your review',
|
||||
leaveReview: 'Leave a review',
|
||||
rating: 'Rating:',
|
||||
reviewPlaceholder: 'Share your experience with this product...',
|
||||
reviewPlaceholderDexar: 'Share your thoughts on this product...',
|
||||
anonymous: 'Anonymous',
|
||||
submitting: 'Submitting...',
|
||||
submit: 'Submit',
|
||||
reviewSuccess: 'Thank you for your review!',
|
||||
reviewError: 'Submission failed. Please try later.',
|
||||
defaultUser: 'User',
|
||||
defaultUserDexar: 'Anonymous',
|
||||
noReviews: 'No reviews yet. Be the first!',
|
||||
qna: 'Questions & Answers',
|
||||
photo: 'Photo',
|
||||
reviewsCount: 'reviews',
|
||||
today: 'Today',
|
||||
yesterday: 'Yesterday',
|
||||
daysAgo: 'd. ago',
|
||||
weeksAgo: 'w. ago',
|
||||
},
|
||||
app: {
|
||||
connecting: 'Connecting to server...',
|
||||
serverUnavailable: 'Server unavailable',
|
||||
serverError: 'Could not connect to the server. Please check your internet connection.',
|
||||
retryConnection: 'Retry',
|
||||
pageTitle: 'Marketplace of goods and services',
|
||||
},
|
||||
carousel: {
|
||||
loading: 'Loading products...',
|
||||
addToCart: 'Add to cart',
|
||||
},
|
||||
common: {
|
||||
retry: 'Try again',
|
||||
loading: 'Loading...',
|
||||
},
|
||||
};
|
||||
188
src/app/i18n/hy.ts
Normal file
188
src/app/i18n/hy.ts
Normal file
@@ -0,0 +1,188 @@
|
||||
import { Translations } from './translations';
|
||||
|
||||
export const hy: Translations = {
|
||||
header: {
|
||||
home: 'Գլխավոր',
|
||||
search: 'Որոնում',
|
||||
about: 'Մեր մասին',
|
||||
contacts: 'Կապ',
|
||||
searchPlaceholder: 'Որոնել...',
|
||||
catalog: 'Կատալոգ',
|
||||
},
|
||||
footer: {
|
||||
description: 'Ժամանակակից մարքեթփլեյս հարմար գնումների համար',
|
||||
company: 'Ընկերություն',
|
||||
aboutUs: 'Մեր մասին',
|
||||
contacts: 'Կապ',
|
||||
requisites: 'Վավերապայմաններ',
|
||||
support: 'Աջակցություն',
|
||||
faq: 'ՀՏՀ',
|
||||
delivery: 'Առաքում',
|
||||
guarantee: 'Երաշխիք',
|
||||
legal: 'Իրավական տեղեկատվություն',
|
||||
offer: 'Օֆերտա',
|
||||
privacy: 'Գաղտնիություն',
|
||||
returns: 'Վերադարձ',
|
||||
info: 'Տեղեկատվություն',
|
||||
aboutCompany: 'Ընկերության մասին',
|
||||
documents: 'Փաստաթղթեր',
|
||||
paymentRules: 'Վճարման կանոններ',
|
||||
returnPolicy: 'Վերադարձի քաղաքականություն',
|
||||
publicOffer: 'Հանրային օֆերտա',
|
||||
help: 'Օգնություն',
|
||||
payment: 'Վճարում',
|
||||
allRightsReserved: 'Բոլոր իրավունքները պաշտպանված են։',
|
||||
},
|
||||
home: {
|
||||
welcomeTo: 'Բարի գալուստ {{brand}}',
|
||||
subtitle: 'Գտեք ամեն ինչ մեկ վայրում',
|
||||
startSearch: 'Սկսել որոնումը',
|
||||
loading: 'Կատեգորիաները բեռնվում են...',
|
||||
errorTitle: 'Ինչ-որ բան սխալ է գնացել',
|
||||
retry: 'Փորձել կրկին',
|
||||
categoriesTitle: 'Ապրանքների կատեգորիաներ',
|
||||
categoriesSubtitle: 'Ընտրեք հետաքրքրող կատեգորիան',
|
||||
categoriesEmpty: 'Կատեգորիաները շուտով կհայտնվեն',
|
||||
categoriesEmptyDesc: 'Մենք աշխատում ենք կատալոգի համալրման վրա',
|
||||
dexarHeroTitle: 'Այստեղ դու կգտնես ամեն ինչ',
|
||||
dexarHeroSubtitle: 'Հազարավոր ապրանքներ մեկ վայրում',
|
||||
dexarHeroTagline: 'պարզ և հարմար',
|
||||
goToCatalog: 'Անցնել կատալոգ',
|
||||
findProduct: 'Գտնել ապրանք',
|
||||
loadingDexar: 'Կատեգորիաները բեռնվում են...',
|
||||
catalogTitle: 'Ապրանքների կատալոգ',
|
||||
emptyCategoriesDexar: 'Կատեգորիաները դեռ չկան',
|
||||
categoriesSoonDexar: 'Շուտով այստեղ կհայտնվեն ապրանքների կատեգորիաներ',
|
||||
itemsCount: '{{count}} ապրանք',
|
||||
},
|
||||
cart: {
|
||||
title: 'Զամբյուղ',
|
||||
clear: 'Մաքրել',
|
||||
empty: 'Զամբյուղը դատարկ է',
|
||||
emptyDesc: 'Ավելացրեք ապրանքներ գնումները սկսելու համար',
|
||||
goShopping: 'Անցնել գնումների',
|
||||
total: 'Ընդամենը',
|
||||
items: 'Ապրանքներ',
|
||||
deliveryLabel: 'Առաքում',
|
||||
toPay: 'Վճարման ենթակա',
|
||||
agreeWith: 'Ես համաձայն եմ',
|
||||
publicOffer: 'հանրային օֆերտային',
|
||||
returnPolicy: 'վերադարձի քաղաքականությանը',
|
||||
guaranteeTerms: 'երաշխիքային պայմաններին',
|
||||
privacyPolicy: 'գաղտնիության քաղաքականությանը',
|
||||
and: 'և',
|
||||
checkout: 'Ձևակերպել պատվեր',
|
||||
close: 'Փակել',
|
||||
creatingPayment: 'Վճարումը ստեղծվում է...',
|
||||
waitFewSeconds: 'Սպասեք մի քանի վայրկյան',
|
||||
scanQr: 'Սկանավորեք QR կոդը վճարման համար',
|
||||
amountToPay: 'Վճարման գումարը՝',
|
||||
waitingPayment: 'Սպասում ենք վճարմանը...',
|
||||
copied: '✓ Պատճենված է',
|
||||
copyLink: 'Պատճենել հղումը',
|
||||
openNewTab: 'Բացել նոր ներդիրում',
|
||||
paymentSuccess: 'Շնորհավորում ենք։ Վճարումը հաջողությամբ կատարվել է։',
|
||||
paymentSuccessDesc: 'Մուտքագրեք ձեր կոնտակտային տվյալները, և մենք կուղարկենք գնումը մի քանի րոպեի ընթացքում',
|
||||
sending: 'Ուղարկվում է...',
|
||||
send: 'Ուղարկել',
|
||||
paymentTimeout: 'Սպասման ժամանակը սպառվել է',
|
||||
paymentTimeoutDesc: 'Մենք չենք ստացել վճարման հաստատում 3 րոպեի ընթացքում։',
|
||||
autoClose: 'Պատուհանը կփակվի ավտոմատ...',
|
||||
confirmClear: 'Համոզվա՞ծ եք, որ ցանկանում եք մաքրել զամբյուղը։',
|
||||
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-ի ձևաչափը սխալ է',
|
||||
},
|
||||
search: {
|
||||
title: 'Ապրանքների որոնում',
|
||||
placeholder: 'Մուտքագրեք ապրանքի անունը...',
|
||||
resultsCount: 'Գտնված ապրանքներ՝',
|
||||
searching: 'Որոնում...',
|
||||
retry: 'Փորձել կրկին',
|
||||
noResults: 'Ոչինչ չի գտնվել',
|
||||
noResultsFor: '"{{query}}" հարցման համար ապրանքներ չեն գտնվել',
|
||||
noResultsHint: 'Փորձեք փոխել հարցումը կամ օգտագործել այլ բանալի բառեր',
|
||||
addToCart: 'Ավելացնել զամբյուղ',
|
||||
loadingMore: 'Բեռնվում է...',
|
||||
allLoaded: 'Բոլոր արդյունքները բեռնված են',
|
||||
emptyState: 'Մուտքագրեք հարցում ապրանքներ որոնելու համար',
|
||||
of: 'ից',
|
||||
},
|
||||
category: {
|
||||
retry: 'Փորձել կրկին',
|
||||
addToCart: 'Ավելացնել զամբյուղ',
|
||||
loadingMore: 'Բեռնվում է...',
|
||||
allLoaded: 'Բոլոր ապրանքները բեռնված են',
|
||||
emptyTitle: 'Ուպս։ Այստեղ դեռ դատարկ է',
|
||||
emptyDesc: 'Այս կատեգորիայում դեռ ապրանքներ չկան, բայց շուտով կհայտնվեն',
|
||||
goHome: 'Գլխավոր էջ',
|
||||
loading: 'Ապրանքները բեռնվում են...',
|
||||
},
|
||||
subcategories: {
|
||||
loading: 'Ենթակատեգորիաները բեռնվում են...',
|
||||
retry: 'Փորձել կրկին',
|
||||
emptyTitle: 'Ուպս։ Ենթակատեգորիաներ դեռ չկան',
|
||||
emptyDesc: 'Այս բաժնում դեռ ենթակատեգորիաներ չկան, բայց շուտով կհայտնվեն',
|
||||
goHome: 'Գլխավոր էջ',
|
||||
},
|
||||
itemDetail: {
|
||||
loading: 'Բեռնվում է...',
|
||||
loadingDexar: 'Ապրանքը բեռնվում է...',
|
||||
back: 'Վերադառնալ',
|
||||
backHome: 'Վերադառնալ գլխավոր էջ',
|
||||
noImage: 'Պատկեր չկա',
|
||||
stock: 'Առկայություն՝',
|
||||
inStock: 'Առկա է',
|
||||
lowStock: 'Մնացել է քիչ',
|
||||
lastItems: 'Վերջին հատերը',
|
||||
mediumStock: 'Վերջանում է',
|
||||
addToCart: 'Ավելացնել զամբյուղ',
|
||||
description: 'Նկարագրություն',
|
||||
reviews: 'Կարծիքներ',
|
||||
yourReview: 'Ձեր կարծիքը',
|
||||
leaveReview: 'Թողնել կարծիք',
|
||||
rating: 'Գնահատական՝',
|
||||
reviewPlaceholder: 'Կիսվեք ձեր տպավորություններով ապրանքի մասին...',
|
||||
reviewPlaceholderDexar: 'Կիսվեք ձեր տպավորություններով...',
|
||||
anonymous: 'Անանուն',
|
||||
submitting: 'Ուղարկվում է...',
|
||||
submit: 'Ուղարկել',
|
||||
reviewSuccess: 'Շնորհակալություն ձեր կարծիքի համար։',
|
||||
reviewError: 'Ուղարկման սխալ։ Փորձեք ավելի ուշ։',
|
||||
defaultUser: 'Օգտատեր',
|
||||
defaultUserDexar: 'Անանուն',
|
||||
noReviews: 'Դեռ կարծիքներ չկան։ Դարձեք առաջինը։',
|
||||
qna: 'Հարցեր և պատասխաններ',
|
||||
photo: 'Լուսանկար',
|
||||
reviewsCount: 'կարծիք',
|
||||
today: 'Այսօր',
|
||||
yesterday: 'Երեկ',
|
||||
daysAgo: 'օր առաջ',
|
||||
weeksAgo: 'շաբաթ առաջ',
|
||||
},
|
||||
app: {
|
||||
connecting: 'Միացում սերվերին...',
|
||||
serverUnavailable: 'Սերվերը հասանելի չէ',
|
||||
serverError: 'Չհաջողվեց միանալ սերվերին։ Ստուգեք ինտերնետ կապը։',
|
||||
retryConnection: 'Կրկնել փորձը',
|
||||
pageTitle: 'Ապրանքների և ծառայությունների մարքեթփլեյս',
|
||||
},
|
||||
carousel: {
|
||||
loading: 'Ապրանքները բեռնվում են...',
|
||||
addToCart: 'Ավելացնել զամբյուղ',
|
||||
},
|
||||
common: {
|
||||
retry: 'Փորձել կրկին',
|
||||
loading: 'Բեռնվում է...',
|
||||
},
|
||||
};
|
||||
188
src/app/i18n/ru.ts
Normal file
188
src/app/i18n/ru.ts
Normal file
@@ -0,0 +1,188 @@
|
||||
import { Translations } from './translations';
|
||||
|
||||
export const ru: Translations = {
|
||||
header: {
|
||||
home: 'Главная',
|
||||
search: 'Поиск',
|
||||
about: 'О нас',
|
||||
contacts: 'Контакты',
|
||||
searchPlaceholder: 'Искать...',
|
||||
catalog: 'Каталог',
|
||||
},
|
||||
footer: {
|
||||
description: 'Современный маркетплейс для комфортных покупок',
|
||||
company: 'Компания',
|
||||
aboutUs: 'О нас',
|
||||
contacts: 'Контакты',
|
||||
requisites: 'Реквизиты',
|
||||
support: 'Поддержка',
|
||||
faq: 'FAQ',
|
||||
delivery: 'Доставка',
|
||||
guarantee: 'Гарантия',
|
||||
legal: 'Правовая информация',
|
||||
offer: 'Оферта',
|
||||
privacy: 'Конфиденциальность',
|
||||
returns: 'Возврат',
|
||||
info: 'Информация',
|
||||
aboutCompany: 'О компании',
|
||||
documents: 'Документы',
|
||||
paymentRules: 'Правила оплаты',
|
||||
returnPolicy: 'Политика возврата',
|
||||
publicOffer: 'Публичная оферта',
|
||||
help: 'Помощь',
|
||||
payment: 'Оплата',
|
||||
allRightsReserved: 'Все права защищены.',
|
||||
},
|
||||
home: {
|
||||
welcomeTo: 'Добро пожаловать в {{brand}}',
|
||||
subtitle: 'Найдите всё, что нужно, в одном месте',
|
||||
startSearch: 'Начать поиск',
|
||||
loading: 'Загружаем категории...',
|
||||
errorTitle: 'Что-то пошло не так',
|
||||
retry: 'Попробовать снова',
|
||||
categoriesTitle: 'Категории товаров',
|
||||
categoriesSubtitle: 'Выберите интересующую категорию',
|
||||
categoriesEmpty: 'Категории скоро появятся',
|
||||
categoriesEmptyDesc: 'Мы работаем над наполнением каталога',
|
||||
dexarHeroTitle: 'Здесь ты найдёшь всё',
|
||||
dexarHeroSubtitle: 'Тысячи товаров в одном месте',
|
||||
dexarHeroTagline: 'просто и удобно',
|
||||
goToCatalog: 'Перейти в каталог',
|
||||
findProduct: 'Найти товар',
|
||||
loadingDexar: 'Загрузка категорий...',
|
||||
catalogTitle: 'Каталог товаров',
|
||||
emptyCategoriesDexar: 'Категории пока отсутствуют',
|
||||
categoriesSoonDexar: 'Скоро здесь появятся категории товаров',
|
||||
itemsCount: '{{count}} товаров',
|
||||
},
|
||||
cart: {
|
||||
title: 'Корзина',
|
||||
clear: 'Очистить',
|
||||
empty: 'Корзина пуста',
|
||||
emptyDesc: 'Добавьте товары, чтобы начать покупки',
|
||||
goShopping: 'Перейти к покупкам',
|
||||
total: 'Итого',
|
||||
items: 'Товары',
|
||||
deliveryLabel: 'Доставка',
|
||||
toPay: 'К оплате',
|
||||
agreeWith: 'Я согласен с',
|
||||
publicOffer: 'публичной офертой',
|
||||
returnPolicy: 'политикой возврата',
|
||||
guaranteeTerms: 'условиями гарантии',
|
||||
privacyPolicy: 'политикой конфиденциальности',
|
||||
and: 'и',
|
||||
checkout: 'Оформить заказ',
|
||||
close: 'Закрыть',
|
||||
creatingPayment: 'Создание платежа...',
|
||||
waitFewSeconds: 'Подождите несколько секунд',
|
||||
scanQr: 'Сканируйте QR-код для оплаты',
|
||||
amountToPay: 'Сумма к оплате:',
|
||||
waitingPayment: 'Ожидание оплаты...',
|
||||
copied: '✓ Скопировано',
|
||||
copyLink: 'Скопировать ссылку',
|
||||
openNewTab: 'Открыть в новой вкладке',
|
||||
paymentSuccess: 'Поздравляем! Оплата прошла успешно!',
|
||||
paymentSuccessDesc: 'Введите ваши контактные данные, и мы отправим вам покупку в течение нескольких минут',
|
||||
sending: 'Отправка...',
|
||||
send: 'Отправить',
|
||||
paymentTimeout: 'Время ожидания истекло',
|
||||
paymentTimeoutDesc: 'Мы не получили подтверждение оплаты в течение 3 минут.',
|
||||
autoClose: 'Окно закроется автоматически...',
|
||||
confirmClear: 'Вы уверены, что хотите очистить корзину?',
|
||||
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',
|
||||
},
|
||||
search: {
|
||||
title: 'Поиск товаров',
|
||||
placeholder: 'Введите название товара...',
|
||||
resultsCount: 'Найдено товаров:',
|
||||
searching: 'Поиск...',
|
||||
retry: 'Попробовать снова',
|
||||
noResults: 'Ничего не найдено',
|
||||
noResultsFor: 'По запросу "{{query}}" товары не найдены',
|
||||
noResultsHint: 'Попробуйте изменить запрос или используйте другие ключевые слова',
|
||||
addToCart: 'В корзину',
|
||||
loadingMore: 'Загрузка...',
|
||||
allLoaded: 'Все результаты загружены',
|
||||
emptyState: 'Введите запрос для поиска товаров',
|
||||
of: 'из',
|
||||
},
|
||||
category: {
|
||||
retry: 'Попробовать снова',
|
||||
addToCart: 'В корзину',
|
||||
loadingMore: 'Загрузка...',
|
||||
allLoaded: 'Все товары загружены',
|
||||
emptyTitle: 'Упс! Здесь пока пусто',
|
||||
emptyDesc: 'В этой категории ещё нет товаров, но скоро они появятся',
|
||||
goHome: 'На главную',
|
||||
loading: 'Загрузка товаров...',
|
||||
},
|
||||
subcategories: {
|
||||
loading: 'Загрузка подкатегорий...',
|
||||
retry: 'Попробовать снова',
|
||||
emptyTitle: 'Упс! Подкатегорий пока нет',
|
||||
emptyDesc: 'В этом разделе ещё нет подкатегорий, но скоро они появятся',
|
||||
goHome: 'На главную',
|
||||
},
|
||||
itemDetail: {
|
||||
loading: 'Загрузка...',
|
||||
loadingDexar: 'Загрузка товара...',
|
||||
back: 'Вернуться',
|
||||
backHome: 'Вернуться на главную',
|
||||
noImage: 'Нет изображения',
|
||||
stock: 'Наличие:',
|
||||
inStock: 'В наличии',
|
||||
lowStock: 'Осталось немного',
|
||||
lastItems: 'Последние штуки',
|
||||
mediumStock: 'Заканчивается',
|
||||
addToCart: 'Добавить в корзину',
|
||||
description: 'Описание',
|
||||
reviews: 'Отзывы',
|
||||
yourReview: 'Ваш отзыв',
|
||||
leaveReview: 'Оставить отзыв',
|
||||
rating: 'Оценка:',
|
||||
reviewPlaceholder: 'Поделитесь своими впечатлениями о товаре...',
|
||||
reviewPlaceholderDexar: 'Поделитесь впечатлениями о товаре...',
|
||||
anonymous: 'Анонимно',
|
||||
submitting: 'Отправка...',
|
||||
submit: 'Отправить',
|
||||
reviewSuccess: 'Спасибо за ваш отзыв!',
|
||||
reviewError: 'Ошибка отправки. Попробуйте позже.',
|
||||
defaultUser: 'Пользователь',
|
||||
defaultUserDexar: 'Аноним',
|
||||
noReviews: 'Пока нет отзывов. Станьте первым!',
|
||||
qna: 'Вопросы и ответы',
|
||||
photo: 'Фото',
|
||||
reviewsCount: 'отзывов',
|
||||
today: 'Сегодня',
|
||||
yesterday: 'Вчера',
|
||||
daysAgo: 'дн. назад',
|
||||
weeksAgo: 'нед. назад',
|
||||
},
|
||||
app: {
|
||||
connecting: 'Подключение к серверу...',
|
||||
serverUnavailable: 'Сервер недоступен',
|
||||
serverError: 'Не удалось подключиться к серверу. Проверьте подключение к интернету.',
|
||||
retryConnection: 'Повторить попытку',
|
||||
pageTitle: 'Маркетплейс товаров и услуг',
|
||||
},
|
||||
carousel: {
|
||||
loading: 'Загрузка товаров...',
|
||||
addToCart: 'Добавить в корзину',
|
||||
},
|
||||
common: {
|
||||
retry: 'Попробовать снова',
|
||||
loading: 'Загрузка...',
|
||||
},
|
||||
};
|
||||
14
src/app/i18n/translate.pipe.ts
Normal file
14
src/app/i18n/translate.pipe.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { Pipe, PipeTransform, inject } from '@angular/core';
|
||||
import { TranslateService } from './translate.service';
|
||||
|
||||
@Pipe({
|
||||
name: 'translate',
|
||||
pure: false,
|
||||
})
|
||||
export class TranslatePipe implements PipeTransform {
|
||||
private translateService = inject(TranslateService);
|
||||
|
||||
transform(key: string, params?: Record<string, string | number>): string {
|
||||
return this.translateService.t(key, params);
|
||||
}
|
||||
}
|
||||
48
src/app/i18n/translate.service.ts
Normal file
48
src/app/i18n/translate.service.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import { Injectable, computed, inject } from '@angular/core';
|
||||
import { LanguageService } from '../services/language.service';
|
||||
import { Translations } from './translations';
|
||||
import { ru } from './ru';
|
||||
import { en } from './en';
|
||||
import { hy } from './hy';
|
||||
|
||||
const translationMap: Record<string, Translations> = { ru, en, hy };
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class TranslateService {
|
||||
private langService = inject(LanguageService);
|
||||
|
||||
readonly translations = computed<Translations>(
|
||||
() => translationMap[this.langService.currentLanguage()] ?? ru,
|
||||
);
|
||||
|
||||
/**
|
||||
* Translate a dot-separated key with optional interpolation params.
|
||||
* Usage: t('cart.phoneMoreDigits', { count: 3 }) → "Введите ещё 3 цифр"
|
||||
*/
|
||||
t(key: string, params?: Record<string, string | number>): string {
|
||||
const parts = key.split('.');
|
||||
let result: unknown = this.translations();
|
||||
|
||||
for (const part of parts) {
|
||||
if (result && typeof result === 'object') {
|
||||
result = (result as Record<string, unknown>)[part];
|
||||
} else {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof result !== 'string') {
|
||||
return key;
|
||||
}
|
||||
|
||||
if (params) {
|
||||
return result.replace(/\{\{(\w+)\}\}/g, (_, k) =>
|
||||
params[k] !== undefined ? String(params[k]) : `{{${k}}}`,
|
||||
);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
186
src/app/i18n/translations.ts
Normal file
186
src/app/i18n/translations.ts
Normal file
@@ -0,0 +1,186 @@
|
||||
export interface Translations {
|
||||
header: {
|
||||
home: string;
|
||||
search: string;
|
||||
about: string;
|
||||
contacts: string;
|
||||
searchPlaceholder: string;
|
||||
catalog: string;
|
||||
};
|
||||
footer: {
|
||||
description: string;
|
||||
company: string;
|
||||
aboutUs: string;
|
||||
contacts: string;
|
||||
requisites: string;
|
||||
support: string;
|
||||
faq: string;
|
||||
delivery: string;
|
||||
guarantee: string;
|
||||
legal: string;
|
||||
offer: string;
|
||||
privacy: string;
|
||||
returns: string;
|
||||
info: string;
|
||||
aboutCompany: string;
|
||||
documents: string;
|
||||
paymentRules: string;
|
||||
returnPolicy: string;
|
||||
publicOffer: string;
|
||||
help: string;
|
||||
payment: string;
|
||||
allRightsReserved: string;
|
||||
};
|
||||
home: {
|
||||
welcomeTo: string;
|
||||
subtitle: string;
|
||||
startSearch: string;
|
||||
loading: string;
|
||||
errorTitle: string;
|
||||
retry: string;
|
||||
categoriesTitle: string;
|
||||
categoriesSubtitle: string;
|
||||
categoriesEmpty: string;
|
||||
categoriesEmptyDesc: string;
|
||||
dexarHeroTitle: string;
|
||||
dexarHeroSubtitle: string;
|
||||
dexarHeroTagline: string;
|
||||
goToCatalog: string;
|
||||
findProduct: string;
|
||||
loadingDexar: string;
|
||||
catalogTitle: string;
|
||||
emptyCategoriesDexar: string;
|
||||
categoriesSoonDexar: string;
|
||||
itemsCount: string;
|
||||
};
|
||||
cart: {
|
||||
title: string;
|
||||
clear: string;
|
||||
empty: string;
|
||||
emptyDesc: string;
|
||||
goShopping: string;
|
||||
total: string;
|
||||
items: string;
|
||||
deliveryLabel: string;
|
||||
toPay: string;
|
||||
agreeWith: string;
|
||||
publicOffer: string;
|
||||
returnPolicy: string;
|
||||
guaranteeTerms: string;
|
||||
privacyPolicy: string;
|
||||
and: string;
|
||||
checkout: string;
|
||||
close: string;
|
||||
creatingPayment: string;
|
||||
waitFewSeconds: string;
|
||||
scanQr: string;
|
||||
amountToPay: string;
|
||||
waitingPayment: string;
|
||||
copied: string;
|
||||
copyLink: string;
|
||||
openNewTab: string;
|
||||
paymentSuccess: string;
|
||||
paymentSuccessDesc: string;
|
||||
sending: string;
|
||||
send: string;
|
||||
paymentTimeout: string;
|
||||
paymentTimeoutDesc: string;
|
||||
autoClose: string;
|
||||
confirmClear: string;
|
||||
acceptTerms: string;
|
||||
copyError: string;
|
||||
emailSuccess: string;
|
||||
emailError: string;
|
||||
phoneRequired: string;
|
||||
phoneMoreDigits: string;
|
||||
phoneTooMany: string;
|
||||
emailRequired: string;
|
||||
emailTooShort: string;
|
||||
emailTooLong: string;
|
||||
emailNeedsAt: string;
|
||||
emailNeedsDomain: string;
|
||||
emailInvalid: string;
|
||||
};
|
||||
search: {
|
||||
title: string;
|
||||
placeholder: string;
|
||||
resultsCount: string;
|
||||
searching: string;
|
||||
retry: string;
|
||||
noResults: string;
|
||||
noResultsFor: string;
|
||||
noResultsHint: string;
|
||||
addToCart: string;
|
||||
loadingMore: string;
|
||||
allLoaded: string;
|
||||
emptyState: string;
|
||||
of: string;
|
||||
};
|
||||
category: {
|
||||
retry: string;
|
||||
addToCart: string;
|
||||
loadingMore: string;
|
||||
allLoaded: string;
|
||||
emptyTitle: string;
|
||||
emptyDesc: string;
|
||||
goHome: string;
|
||||
loading: string;
|
||||
};
|
||||
subcategories: {
|
||||
loading: string;
|
||||
retry: string;
|
||||
emptyTitle: string;
|
||||
emptyDesc: string;
|
||||
goHome: string;
|
||||
};
|
||||
itemDetail: {
|
||||
loading: string;
|
||||
loadingDexar: string;
|
||||
back: string;
|
||||
backHome: string;
|
||||
noImage: string;
|
||||
stock: string;
|
||||
inStock: string;
|
||||
lowStock: string;
|
||||
lastItems: string;
|
||||
mediumStock: string;
|
||||
addToCart: string;
|
||||
description: string;
|
||||
reviews: string;
|
||||
yourReview: string;
|
||||
leaveReview: string;
|
||||
rating: string;
|
||||
reviewPlaceholder: string;
|
||||
reviewPlaceholderDexar: string;
|
||||
anonymous: string;
|
||||
submitting: string;
|
||||
submit: string;
|
||||
reviewSuccess: string;
|
||||
reviewError: string;
|
||||
defaultUser: string;
|
||||
defaultUserDexar: string;
|
||||
noReviews: string;
|
||||
qna: string;
|
||||
photo: string;
|
||||
reviewsCount: string;
|
||||
today: string;
|
||||
yesterday: string;
|
||||
daysAgo: string;
|
||||
weeksAgo: string;
|
||||
};
|
||||
app: {
|
||||
connecting: string;
|
||||
serverUnavailable: string;
|
||||
serverError: string;
|
||||
retryConnection: string;
|
||||
pageTitle: string;
|
||||
};
|
||||
carousel: {
|
||||
loading: string;
|
||||
addToCart: string;
|
||||
};
|
||||
common: {
|
||||
retry: string;
|
||||
loading: string;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user