fix(i18n): route dirty-guard and html-editor strings through TranslateService
Some checks failed
Architecture Governance / architecture (push) Has been cancelled

window.confirm/window.prompt calls in projectEditorDirtyGuard and
MarketplaceHtmlEditorComponent, and the hardcoded Preview/Code toggle
label in its template, bypassed the app's translation pipeline. Add
builder.confirmLeaveUnsaved, promptLinkUrl, promptImageUrl,
htmlEditorCode and htmlEditorPreview keys (en/ru/hy), resolve them via
TranslateService.t() before passing to confirm/prompt, and use
TranslatePipe for the toggle button label.
This commit is contained in:
sdarbinyan
2026-07-13 15:57:54 +04:00
parent 68442919d3
commit a7df1980ed
7 changed files with 32 additions and 6 deletions

View File

@@ -3,7 +3,7 @@
@for (item of toolbar; track item.id) {
<button type="button" (click)="runCommand(item)">{{ item.label }}</button>
}
<button type="button" (click)="toggleCode()">{{ showCode() ? 'Preview' : 'Code' }}</button>
<button type="button" (click)="toggleCode()">{{ (showCode() ? 'builder.htmlEditorPreview' : 'builder.htmlEditorCode') | translate }}</button>
</div>
<textarea

View File

@@ -1,4 +1,6 @@
import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild, signal } from '@angular/core';
import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild, inject, signal } from '@angular/core';
import { TranslateService } from '../../../../i18n/translate.service';
import { TranslatePipe } from '../../../../i18n/translate.pipe';
export interface HtmlEditorToolbarCommand {
id: string;
@@ -23,12 +25,14 @@ export const HTML_EDITOR_TOOLBAR: HtmlEditorToolbarCommand[] = [
@Component({
selector: 'app-marketplace-html-editor',
standalone: true,
imports: [],
imports: [TranslatePipe],
templateUrl: './marketplace-html-editor.component.html',
styleUrls: ['./marketplace-html-editor.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class MarketplaceHtmlEditorComponent implements OnChanges, AfterViewInit {
private readonly translate = inject(TranslateService);
@Input() html = '';
@Output() htmlChange = new EventEmitter<string>();
@ViewChild('surface', { static: true }) surface!: ElementRef<HTMLDivElement>;
@@ -58,13 +62,13 @@ export class MarketplaceHtmlEditorComponent implements OnChanges, AfterViewInit
runCommand(item: HtmlEditorToolbarCommand): void {
this.surface.nativeElement.focus();
if (item.command === 'createLink') {
const url = window.prompt('URL');
const url = window.prompt(this.translate.t('builder.promptLinkUrl'));
if (!url) {
return;
}
document.execCommand('createLink', false, url);
} else if (item.command === 'insertImage') {
const url = window.prompt('Image URL');
const url = window.prompt(this.translate.t('builder.promptImageUrl'));
if (!url) {
return;
}

View File

@@ -2,11 +2,13 @@ import { inject } from '@angular/core';
import { CanDeactivateFn } from '@angular/router';
import { ProjectEditorFacade } from '../facade/project-editor.facade';
import { ProjectEditorPageComponent } from '../pages/project-editor-page.component';
import { TranslateService } from '../../../i18n/translate.service';
export const projectEditorDirtyGuard: CanDeactivateFn<ProjectEditorPageComponent> = () => {
const facade = inject(ProjectEditorFacade);
if (!facade.dirty()) {
return true;
}
return window.confirm('You have unsaved changes. Leave anyway?');
const translate = inject(TranslateService);
return window.confirm(translate.t('builder.confirmLeaveUnsaved'));
};