diff --git a/src/app/features/project-editor/sections/languages-section.component.html b/src/app/features/project-editor/sections/languages-section.component.html index 94aec46..1e400ab 100644 --- a/src/app/features/project-editor/sections/languages-section.component.html +++ b/src/app/features/project-editor/sections/languages-section.component.html @@ -13,7 +13,11 @@ /> {{ 'builder.addLanguage' | translate }} - {{ 'builder.newLanguageDesc' | translate }} + @if (addLocaleError(); as addError) { +

{{ addError }}

+ } @else { + {{ 'builder.newLanguageDesc' | translate }} + }
@for (code of locales(); track code) { diff --git a/src/app/features/project-editor/sections/languages-section.component.ts b/src/app/features/project-editor/sections/languages-section.component.ts index 6215397..8faae25 100644 --- a/src/app/features/project-editor/sections/languages-section.component.ts +++ b/src/app/features/project-editor/sections/languages-section.component.ts @@ -37,15 +37,25 @@ export class ProjectEditorLanguagesSectionComponent { updateNewLocale(value: string): void { this.newLocale.set(value); + if (this.addLocaleError()) { + this.addLocaleError.set(null); + } } + readonly addLocaleError = signal(null); + addLocale(): void { - const code = this.newLocale().trim(); + const code = this.newLocale().trim().toLowerCase(); if (!code) { return; } + if (this.locales().includes(code)) { + this.addLocaleError.set(this.translate.t('builder.languageAlreadyAdded')); + return; + } this.facade.addLocale(code); this.newLocale.set(''); + this.addLocaleError.set(null); } removeLocale(code: string): void { diff --git a/src/app/i18n/en.ts b/src/app/i18n/en.ts index f3833ee..f615664 100644 --- a/src/app/i18n/en.ts +++ b/src/app/i18n/en.ts @@ -679,6 +679,7 @@ export const en: Translations = { catalogNavTopCarousel: 'Top category carousel', catalogNavTopCarouselDesc: 'Horizontally scrollable category chips above the catalog grid.', newLanguageDesc: 'ISO language code to add as a supported storefront language (e.g. de, fr).', + languageAlreadyAdded: 'This language is already supported.', languagesTabDesc: 'Languages available to shoppers. The default language is used as a fallback everywhere.', linkLabelDesc: 'Text shown for this navigation link.', linkUrlDesc: 'Path or URL this navigation link points to.', diff --git a/src/app/i18n/hy.ts b/src/app/i18n/hy.ts index 19d3b2a..10af5cd 100644 --- a/src/app/i18n/hy.ts +++ b/src/app/i18n/hy.ts @@ -679,6 +679,7 @@ export const hy: Translations = { catalogNavTopCarousel: 'Վերևի կատեգորիաների կարուսել', catalogNavTopCarouselDesc: 'Հորիզոնական թերթվող կատեգորիաների chip-եր կատալոգի ցանցի վերևում։', newLanguageDesc: 'ISO լեզվի կոդ՝ որպես աջակցվող լեզու ավելացնելու համար (օր․՝ de, fr)։', + languageAlreadyAdded: 'Այս լեզուն արդեն ավելացված է։', languagesTabDesc: 'Գնորդներին հասանելի լեզուներ։ Լռելյայն լեզուն օգտագործվում է որպես պահուստային ամենուր։', linkLabelDesc: 'Այս նավիգացիոն հղման համար ցուցադրվող տեքստը։', linkUrlDesc: 'Ուղին կամ URL-ը, որին ուղղորդում է այս նավիգացիոն հղումը։', diff --git a/src/app/i18n/ru.ts b/src/app/i18n/ru.ts index 11cbc7f..e57f0a9 100644 --- a/src/app/i18n/ru.ts +++ b/src/app/i18n/ru.ts @@ -679,6 +679,7 @@ export const ru: Translations = { catalogNavTopCarousel: 'Карусель категорий сверху', catalogNavTopCarouselDesc: 'Горизонтально прокручиваемые чипы категорий над сеткой каталога.', newLanguageDesc: 'Код языка ISO для добавления в поддерживаемые языки витрины (например, de, fr).', + languageAlreadyAdded: 'Этот язык уже добавлен.', languagesTabDesc: 'Языки, доступные покупателям. Язык по умолчанию используется как резервный везде.', linkLabelDesc: 'Текст, отображаемый для этой ссылки навигации.', linkUrlDesc: 'Путь или URL, на который ведёт эта ссылка навигации.', diff --git a/src/app/i18n/translations.ts b/src/app/i18n/translations.ts index 98bbd3b..488dae0 100644 --- a/src/app/i18n/translations.ts +++ b/src/app/i18n/translations.ts @@ -677,6 +677,7 @@ export interface Translations { catalogNavTopCarousel: string; catalogNavTopCarouselDesc: string; newLanguageDesc: string; + languageAlreadyAdded: string; languagesTabDesc: string; linkLabelDesc: string; linkUrlDesc: string;