added translations
This commit is contained in:
@@ -4,14 +4,14 @@
|
||||
@if (loading()) {
|
||||
<div class="novo-loading">
|
||||
<div class="novo-spinner"></div>
|
||||
<p>Загрузка...</p>
|
||||
<p>{{ 'itemDetail.loading' | translate }}</p>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (error()) {
|
||||
<div class="novo-error">
|
||||
<p>{{ error() }}</p>
|
||||
<a [routerLink]="'/' | langRoute" class="novo-back-link">Вернуться</a>
|
||||
<a [routerLink]="'/' | langRoute" class="novo-back-link">{{ 'itemDetail.back' | translate }}</a>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
<circle cx="8.5" cy="8.5" r="1.5"></circle>
|
||||
<path d="M21 15l-5-5L5 21"></path>
|
||||
</svg>
|
||||
<p>Нет изображения</p>
|
||||
<p>{{ 'itemDetail.noImage' | translate }}</p>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@@ -76,10 +76,10 @@
|
||||
</div>
|
||||
|
||||
<div class="novo-stock">
|
||||
<span class="stock-label">Наличие:</span>
|
||||
<span class="stock-label">{{ 'itemDetail.stock' | translate }}</span>
|
||||
<div class="stock-indicator" [class.high]="item()!.remainings === 'high'" [class.medium]="item()!.remainings === 'medium'" [class.low]="item()!.remainings === 'low'">
|
||||
<span class="dot"></span>
|
||||
{{ item()!.remainings === 'high' ? 'В наличии' : item()!.remainings === 'medium' ? 'Мало' : 'Осталось немного' }}
|
||||
{{ item()!.remainings === 'high' ? ('itemDetail.inStock' | translate) : item()!.remainings === 'medium' ? ('itemDetail.mediumStock' | translate) : ('itemDetail.lowStock' | translate) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -89,24 +89,24 @@
|
||||
<circle cx="20" cy="21" r="1"></circle>
|
||||
<path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path>
|
||||
</svg>
|
||||
Добавить в корзину
|
||||
{{ 'itemDetail.addToCart' | translate }}
|
||||
</button>
|
||||
|
||||
<div class="novo-description">
|
||||
<h3>Описание</h3>
|
||||
<h3>{{ 'itemDetail.description' | translate }}</h3>
|
||||
<div [innerHTML]="getSafeHtml(item()!.description)"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="novo-reviews">
|
||||
<h2>Отзывы ({{ item()!.callbacks?.length || 0 }})</h2>
|
||||
<h2>{{ 'itemDetail.reviews' | translate }} ({{ item()!.callbacks?.length || 0 }})</h2>
|
||||
|
||||
<!-- novo Review Form -->
|
||||
<div class="novo-review-form">
|
||||
<h3>Ваш отзыв</h3>
|
||||
<h3>{{ 'itemDetail.yourReview' | translate }}</h3>
|
||||
<div class="novo-rating-input">
|
||||
<label>Оценка:</label>
|
||||
<label>{{ 'itemDetail.rating' | translate }}</label>
|
||||
<div class="novo-star-selector">
|
||||
@for (star of [1, 2, 3, 4, 5]; track star) {
|
||||
<span
|
||||
@@ -120,14 +120,14 @@
|
||||
</div>
|
||||
<textarea
|
||||
[(ngModel)]="newReview.comment"
|
||||
placeholder="Поделитесь своими впечатлениями о товаре..."
|
||||
[placeholder]="'itemDetail.reviewPlaceholder' | translate"
|
||||
rows="4"
|
||||
class="novo-textarea">
|
||||
</textarea>
|
||||
<div class="novo-form-actions">
|
||||
<label class="novo-anonymous-toggle">
|
||||
<input type="checkbox" [(ngModel)]="newReview.anonymous">
|
||||
<span>Анонимно</span>
|
||||
<span>{{ 'itemDetail.anonymous' | translate }}</span>
|
||||
</label>
|
||||
@if (!newReview.anonymous && getUserDisplayName()) {
|
||||
<span class="novo-username-preview">{{ getUserDisplayName() }}</span>
|
||||
@@ -139,12 +139,12 @@
|
||||
[class.submitting]="reviewSubmitStatus() === 'loading'">
|
||||
@if (reviewSubmitStatus() === 'loading') {
|
||||
<span class="novo-spinner-small"></span>
|
||||
Отправка...
|
||||
{{ 'itemDetail.submitting' | translate }}
|
||||
} @else {
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||
<path d="M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z"/>
|
||||
</svg>
|
||||
Отправить
|
||||
{{ 'itemDetail.submit' | translate }}
|
||||
}
|
||||
</button>
|
||||
</div>
|
||||
@@ -154,7 +154,7 @@
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5">
|
||||
<path d="M20 6L9 17l-5-5"/>
|
||||
</svg>
|
||||
Спасибо за ваш отзыв!
|
||||
{{ 'itemDetail.reviewSuccess' | translate }}
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5">
|
||||
<path d="M18 6L6 18M6 6l12 12"/>
|
||||
</svg>
|
||||
Ошибка отправки. Попробуйте позже.
|
||||
{{ 'itemDetail.reviewError' | translate }}
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@@ -174,7 +174,7 @@
|
||||
<div class="novo-review-card">
|
||||
<div class="review-header">
|
||||
<div class="reviewer-info">
|
||||
<span class="reviewer-name">{{ review.userID || 'Пользователь' }}</span>
|
||||
<span class="reviewer-name">{{ review.userID ? review.userID : ('itemDetail.defaultUser' | translate) }}</span>
|
||||
@if (review.timestamp) {
|
||||
<span class="review-date">{{ formatDate(review.timestamp) }}</span>
|
||||
}
|
||||
@@ -185,7 +185,7 @@
|
||||
</div>
|
||||
}
|
||||
} @else {
|
||||
<p class="novo-no-reviews">Пока нет отзывов. Станьте первым!</p>
|
||||
<p class="novo-no-reviews">{{ 'itemDetail.noReviews' | translate }}</p>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
@@ -197,14 +197,14 @@
|
||||
@if (loading()) {
|
||||
<div class="dx-loading">
|
||||
<div class="dx-spinner"></div>
|
||||
<p>Загрузка товара...</p>
|
||||
<p>{{ 'itemDetail.loadingDexar' | translate }}</p>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (error()) {
|
||||
<div class="dx-error">
|
||||
<p>{{ error() }}</p>
|
||||
<a [routerLink]="'/' | langRoute" class="dx-back-link">Вернуться на главную</a>
|
||||
<a [routerLink]="'/' | langRoute" class="dx-back-link">{{ 'itemDetail.backHome' | translate }}</a>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
@if (photo.video) {
|
||||
<div class="dx-video-badge">▶</div>
|
||||
}
|
||||
<img [src]="photo.url" [alt]="'Фото ' + ($index + 1)" loading="lazy" decoding="async" />
|
||||
<img [src]="photo.url" [alt]="('itemDetail.photo' | translate) + ' ' + ($index + 1)" loading="lazy" decoding="async" />
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@@ -241,7 +241,7 @@
|
||||
<circle cx="8.5" cy="8.5" r="1.5"></circle>
|
||||
<path d="M21 15l-5-5L5 21"></path>
|
||||
</svg>
|
||||
<span>Нет изображения</span>
|
||||
<span>{{ 'itemDetail.noImage' | translate }}</span>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@@ -260,7 +260,7 @@
|
||||
}
|
||||
</div>
|
||||
<span class="dx-rating-value">{{ item()!.rating }}</span>
|
||||
<span class="dx-rating-count">({{ item()!.callbacks?.length || 0 }} отзывов)</span>
|
||||
<span class="dx-rating-count">({{ item()!.callbacks?.length || 0 }} {{ 'itemDetail.reviewsCount' | translate }})</span>
|
||||
</div>
|
||||
|
||||
<div class="dx-price-block">
|
||||
@@ -276,13 +276,13 @@
|
||||
</div>
|
||||
|
||||
<div class="dx-stock">
|
||||
<span class="dx-stock-label">Наличие:</span>
|
||||
<span class="dx-stock-label">{{ 'itemDetail.stock' | translate }}</span>
|
||||
<span class="dx-stock-status"
|
||||
[class.high]="item()!.remainings === 'high'"
|
||||
[class.medium]="item()!.remainings === 'medium'"
|
||||
[class.low]="item()!.remainings === 'low'">
|
||||
<span class="dx-stock-dot"></span>
|
||||
{{ item()!.remainings === 'high' ? 'В наличии' : item()!.remainings === 'medium' ? 'Заканчивается' : 'Последние штуки' }}
|
||||
{{ item()!.remainings === 'high' ? ('itemDetail.inStock' | translate) : item()!.remainings === 'medium' ? ('itemDetail.mediumStock' | translate) : ('itemDetail.lastItems' | translate) }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -292,11 +292,11 @@
|
||||
<circle cx="20" cy="21" r="1"></circle>
|
||||
<path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path>
|
||||
</svg>
|
||||
Добавить в корзину
|
||||
{{ 'itemDetail.addToCart' | translate }}
|
||||
</button>
|
||||
|
||||
<div class="dx-description">
|
||||
<h2>Описание</h2>
|
||||
<h2>{{ 'itemDetail.description' | translate }}</h2>
|
||||
<div class="dx-description-text" [innerHTML]="getSafeHtml(item()!.description)"></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -304,12 +304,12 @@
|
||||
|
||||
<!-- Reviews Section -->
|
||||
<div class="dx-reviews-section">
|
||||
<h2>Отзывы ({{ item()!.callbacks?.length || 0 }})</h2>
|
||||
<h2>{{ 'itemDetail.reviews' | translate }} ({{ item()!.callbacks?.length || 0 }})</h2>
|
||||
|
||||
<div class="dx-review-form">
|
||||
<h3>Оставить отзыв</h3>
|
||||
<h3>{{ 'itemDetail.leaveReview' | translate }}</h3>
|
||||
<div class="dx-rating-input">
|
||||
<label>Оценка:</label>
|
||||
<label>{{ 'itemDetail.rating' | translate }}</label>
|
||||
<div class="dx-star-selector">
|
||||
@for (star of [1, 2, 3, 4, 5]; track star) {
|
||||
<span
|
||||
@@ -323,14 +323,14 @@
|
||||
</div>
|
||||
<textarea
|
||||
[(ngModel)]="newReview.comment"
|
||||
placeholder="Поделитесь впечатлениями о товаре..."
|
||||
[placeholder]="'itemDetail.reviewPlaceholderDexar' | translate"
|
||||
rows="4"
|
||||
class="dx-textarea">
|
||||
</textarea>
|
||||
<div class="dx-form-actions">
|
||||
<label class="dx-anon-toggle">
|
||||
<input type="checkbox" [(ngModel)]="newReview.anonymous">
|
||||
<span>Анонимно</span>
|
||||
<span>{{ 'itemDetail.anonymous' | translate }}</span>
|
||||
</label>
|
||||
@if (!newReview.anonymous && getUserDisplayName()) {
|
||||
<span class="dx-user-preview">{{ getUserDisplayName() }}</span>
|
||||
@@ -342,9 +342,9 @@
|
||||
[class.submitting]="reviewSubmitStatus() === 'loading'">
|
||||
@if (reviewSubmitStatus() === 'loading') {
|
||||
<span class="dx-spinner-sm"></span>
|
||||
Отправка...
|
||||
{{ 'itemDetail.submitting' | translate }}
|
||||
} @else {
|
||||
Отправить
|
||||
{{ 'itemDetail.submit' | translate }}
|
||||
}
|
||||
</button>
|
||||
</div>
|
||||
@@ -352,14 +352,14 @@
|
||||
@if (reviewSubmitStatus() === 'success') {
|
||||
<div class="dx-status success">
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M20 6L9 17l-5-5"/></svg>
|
||||
Спасибо за ваш отзыв!
|
||||
{{ 'itemDetail.reviewSuccess' | translate }}
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (reviewSubmitStatus() === 'error') {
|
||||
<div class="dx-status error">
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M18 6L6 18M6 6l12 12"/></svg>
|
||||
Ошибка отправки. Попробуйте позже.
|
||||
{{ 'itemDetail.reviewError' | translate }}
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@@ -370,7 +370,7 @@
|
||||
<div class="dx-review-card">
|
||||
<div class="dx-review-header">
|
||||
<div class="dx-reviewer">
|
||||
<span class="dx-reviewer-name">{{ callback.userID || 'Аноним' }}</span>
|
||||
<span class="dx-reviewer-name">{{ callback.userID ? callback.userID : ('itemDetail.defaultUser' | translate) }}</span>
|
||||
@if (callback.timestamp) {
|
||||
<span class="dx-review-date">{{ formatDate(callback.timestamp) }}</span>
|
||||
}
|
||||
@@ -391,7 +391,7 @@
|
||||
</div>
|
||||
}
|
||||
} @else {
|
||||
<p class="dx-no-reviews">Пока нет отзывов. Станьте первым!</p>
|
||||
<p class="dx-no-reviews">{{ 'itemDetail.noReviews' | translate }}</p>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
@@ -399,7 +399,7 @@
|
||||
<!-- Q&A Section -->
|
||||
@if (item()!.questions && item()!.questions!.length > 0) {
|
||||
<div class="dx-qa-section">
|
||||
<h2>Вопросы и ответы ({{ item()!.questions!.length }})</h2>
|
||||
<h2>{{ 'itemDetail.qna' | translate }} ({{ item()!.questions!.length }})</h2>
|
||||
<div class="dx-qa-list">
|
||||
@for (question of item()!.questions!; track $index) {
|
||||
<div class="dx-qa-card">
|
||||
|
||||
Reference in New Issue
Block a user