feat(products): implement professional product management experience
Products dashboard (real total/published/drafts/out-of-stock/hidden/missing-images/missing-SEO/low-quality counts, recently-edited list, recommended next action); list gains table/grid view toggle, density, saved column visibility and saved sort (persisted via LocalStorageService), plus real bulk assign-category/assign-tags/duplicate/CSV-export alongside existing publish/hide/delete; per-row and per-editor reusable ProductHealthWidget (images/SEO/price/category/description/inventory checklist + completion %); editor reorganized into General/Media/Pricing/Inventory/Categories/Attributes/SEO/Visibility/Advanced tabs, media now uses the shared MediaPickerComponent/ImageFieldComponent (primary image + reorderable gallery) instead of raw URL textareas, specifications/attributes/variants moved off pipe-delimited textareas onto the shared KeyValueEditorComponent, SEO tab explains fields in plain language with a live search-result preview, inventory relabeled in business language, toggles/badges use the shared Toggle/Badge components. Filled in the adminProducts i18n namespace (previously ~98% missing, rendering raw translation keys) across en/ru/hy.
This commit is contained in:
@@ -1220,6 +1220,141 @@ export const ru: Translations = {
|
||||
adminProducts: {
|
||||
emptyTitle: 'Товары не найдены',
|
||||
emptyDescription: 'Измените фильтры или создайте новый товар.',
|
||||
emptyGuide: 'Хорошему товару нужны понятное название, минимум одно фото, цена и короткое описание — этого достаточно для публикации. Остальное можно добавить позже.',
|
||||
search: 'Поиск товаров…',
|
||||
category: 'Категория',
|
||||
allCategories: 'Все категории',
|
||||
visibility: 'Видимость',
|
||||
allVisibility: 'Любая видимость',
|
||||
visible: 'Видимый',
|
||||
hidden: 'Скрытый',
|
||||
stockStatus: 'Статус наличия',
|
||||
allStock: 'Любой остаток',
|
||||
inStock: 'В наличии',
|
||||
lowStock: 'Мало на складе',
|
||||
outOfStock: 'Нет в наличии',
|
||||
sortTitle: 'Имя',
|
||||
sortPrice: 'Цена',
|
||||
sortPriority: 'Приоритет',
|
||||
sortStock: 'Остаток',
|
||||
sortUpdated: 'Последнее изменение',
|
||||
showArchived: 'Показать архивные',
|
||||
infiniteScroll: 'Бесконечная прокрутка',
|
||||
viewMode: 'Вид',
|
||||
viewTable: 'Таблица',
|
||||
viewGrid: 'Сетка',
|
||||
density: 'Плотность',
|
||||
densityComfortable: 'Комфортная',
|
||||
densityCompact: 'Компактная',
|
||||
columns: 'Столбцы',
|
||||
column_sku: 'Артикул',
|
||||
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: 'Каждый вариант — это отдельный покупаемый вариант товара (например, размер или цвет) со своей ценой и остатком.',
|
||||
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: 'Пользователи не найдены',
|
||||
|
||||
Reference in New Issue
Block a user