diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index accfed6..0f4a490 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -1,8 +1,9 @@
-import { Component } from '@angular/core';
+import { Component, OnInit } from '@angular/core';
import { RouterModule } from '@angular/router';
import { ClearBtnComponent } from './components/clear_btn/clear_btn.component';
import { TextListComponent } from './components/text_list/text_list.component';
import { UploadBtnComponent } from './components/upload_btn/upload_btn.component';
+import { TranslateData } from './dto/translate_data.dto';
import { parse } from './lib/parser';
@Component({
@@ -12,9 +13,16 @@ import { parse } from './lib/parser';
templateUrl: './app.component.html',
styleUrl: './app.component.scss',
})
-export class AppComponent {
+export class AppComponent implements OnInit {
title = 'NitroPlusTranslator';
- elements: string[] = [];
+ elements: TranslateData[] = [];
+
+ ngOnInit(): void {
+ const data = localStorage.getItem('translations');
+ if (data) {
+ this.elements = JSON.parse(data);
+ }
+ }
onFileLoaded(text: string) {
const parsed = parse(text);
diff --git a/src/app/components/text_list/text_list.component.ts b/src/app/components/text_list/text_list.component.ts
index 2cf02c4..ef631f7 100644
--- a/src/app/components/text_list/text_list.component.ts
+++ b/src/app/components/text_list/text_list.component.ts
@@ -1,8 +1,7 @@
import { CommonModule } from '@angular/common';
-import { HttpClient } from '@angular/common/http';
-import { ChangeDetectorRef, Component, Input } from '@angular/core';
+import { Component, Input } from '@angular/core';
+import { TranslateData } from 'src/app/dto/translate_data.dto';
import { TranslateBlockComponent } from '../translate_block/translate_block.component';
-import { TranslateData } from './text_list.dto';
@Component({
selector: 'app-text-list',
@@ -12,56 +11,13 @@ import { TranslateData } from './text_list.dto';
imports: [CommonModule, TranslateBlockComponent],
})
export class TextListComponent {
- constructor(private http: HttpClient, private changeDetectionRef: ChangeDetectorRef) {
- const data = localStorage.getItem('translations');
- if (data) {
- this.elements_data = JSON.parse(data);
- }
- }
elements_data: TranslateData[] = [];
- @Input() set elements(el: string[]) {
- this.elements_data = el.map((item) => ({ english_text: item, translated_text: '' }));
+ @Input() set elements(el: TranslateData[]) {
+ this.elements_data = el;
localStorage.setItem('translations', JSON.stringify(this.elements_data));
}
get elements() {
- return this.elements_data.map((item) => item.english_text);
- }
-
- sendToTranslate($text: string, $index: number) {
- if (!$text) {
- return;
- }
- if (this.elements_data[$index].translated_text && !confirm('Are you sure you want to override the translation?')) {
- return;
- }
- console.log('translated');
- $text = encodeURIComponent($text);
-
- this.http
- .get(`https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=ru&dt=t&q=` + $text)
- .subscribe({
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- next: (data: any) => {
- this.elements_data[$index].translated_text = data[0][0][0];
- localStorage.setItem('translations', JSON.stringify(this.elements_data));
- this.changeDetectionRef.detectChanges();
- },
- error: (error) => {
- alert(error);
- console.error(error);
- },
- });
- }
-
- typeTranslation($event: Event, $index: number) {
- const target = $event.target as HTMLDivElement;
- if (target) {
- this.elements_data[$index].translated_text = target.textContent || '[]';
- localStorage.setItem('translations', JSON.stringify(this.elements_data));
- target.style.height = '3rem';
- target.style.height = target.scrollHeight + 'px';
- // this.changeDetectionRef.detectChanges();
- }
+ return this.elements_data;
}
}
diff --git a/src/app/components/translate_block/translate_block.component.html b/src/app/components/translate_block/translate_block.component.html
index 64db149..b82faf5 100644
--- a/src/app/components/translate_block/translate_block.component.html
+++ b/src/app/components/translate_block/translate_block.component.html
@@ -2,15 +2,11 @@
{{ index + 1 }}
{{ item.english_text }}
-
-
-
+
+
+
+
+
+
-
diff --git a/src/app/components/translate_block/translate_block.component.scss b/src/app/components/translate_block/translate_block.component.scss
index 8a402d4..4203fee 100644
--- a/src/app/components/translate_block/translate_block.component.scss
+++ b/src/app/components/translate_block/translate_block.component.scss
@@ -1,6 +1,6 @@
.translated-text {
border-radius: 8px;
- height: fit-content;
+ height: auto;
color: #efdee0;
outline: none;
padding-inline: 2rem 1rem;
@@ -8,23 +8,15 @@
border: 2px solid #e4bdc3;
font-size: 1rem;
font-weight: inherit;
+ min-height: 3rem;
+ line-height: 3rem;
&:focus {
border: 2px solid #efdee0;
}
- textarea {
- resize: none;
- width: 100%;
- height: fit-content;
- background-color: transparent;
- border: none;
- outline: none;
- color: #efdee0;
- font-size: 1rem;
- font-weight: inherit;
- line-height: 3rem;
-
- word-wrap: break-word;
+ &:read-only {
+ opacity: 0.5;
}
+ word-wrap: break-word;
}
.english-text {
@@ -66,17 +58,28 @@
}
}
-.send-translate-btn {
- outline: none;
- border: none;
- cursor: pointer;
- background-color: #5b3f45;
- padding: 1em 1.5em;
- color: #f5f6fa;
- border-radius: 15px;
- transition: ease-in-out 0.2s;
- margin: 2rem;
- &:hover {
- transform: scale(1.2);
+.btns {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ .btn {
+ outline: none;
+ border: none;
+ cursor: pointer;
+ background-color: #5b3f45;
+ padding: 1em 1.5em;
+ color: #f5f6fa;
+ border-radius: 15px;
+ transition: ease-in-out 0.2s;
+ &:hover {
+ transform: scale(1.2);
+ }
+ &:disabled {
+ opacity: 0.5;
+ &:hover {
+ cursor: not-allowed;
+ transform: scale(1);
+ }
+ }
}
}
diff --git a/src/app/components/translate_block/translate_block.component.ts b/src/app/components/translate_block/translate_block.component.ts
index 78eab94..c5446e4 100644
--- a/src/app/components/translate_block/translate_block.component.ts
+++ b/src/app/components/translate_block/translate_block.component.ts
@@ -1,7 +1,7 @@
import { CommonModule } from '@angular/common';
-import { Component, ElementRef, Input, ViewChild } from '@angular/core';
+import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';
+import { TranslateData } from 'src/app/dto/translate_data.dto';
import { TranslatePipe } from 'src/app/pipes/translate.pipe';
-import { TranslateData } from '../text_list/text_list.dto';
@Component({
selector: 'app-translate-block',
@@ -11,21 +11,52 @@ import { TranslateData } from '../text_list/text_list.dto';
imports: [CommonModule],
providers: [TranslatePipe],
})
-export class TranslateBlockComponent {
- @ViewChild('translatedText') translatedText: ElementRef | null = null;
+export class TranslateBlockComponent implements OnInit, AfterViewInit {
+ @ViewChild('translatedText') translatedText: ElementRef | null = null;
@Input() item: TranslateData = { english_text: '', translated_text: '' };
@Input() index = 0;
+ isEditing = false;
- constructor(private translatePipe: TranslatePipe) {}
+ saveChanges() {
+ const data: TranslateData[] = JSON.parse(localStorage.getItem('translations') ?? '[]');
+ if (!data.length) {
+ alert('No data');
+ return;
+ }
+ data[this.index] = this.item;
+ localStorage.setItem('translations', JSON.stringify(data));
+ }
+
+ ngOnInit(): void {
+ this.isEditing = this.item.translated_text === '';
+ }
+
+ constructor(private translatePipe: TranslatePipe, private changeDetectionRef: ChangeDetectorRef) {}
async sendToTranslate() {
const text = await this.translatePipe.transform(this.item.english_text);
this.item.translated_text = text;
+ if (this.translatedText) this.translatedText.nativeElement.textContent = text;
+ this.isEditing = false;
+ this.saveChanges();
}
- typeTranslation() {
+
+ saveTranslate() {
+ this.isEditing = false;
if (this.translatedText) {
- const element = this.translatedText.nativeElement;
- element.setAttribute('style', 'height: 3px;');
- element.setAttribute('style', 'height:' + element.scrollHeight + 'px; overflow-y:hidden;');
+ this.item.translated_text = this.translatedText.nativeElement.textContent || '';
+ this.translatedText.nativeElement.textContent = '';
+ this.translatedText.nativeElement.textContent = this.item.translated_text;
}
+ this.saveChanges();
+ }
+ clear() {
+ this.item.translated_text = '';
+ if (this.translatedText) this.translatedText.nativeElement.textContent = '';
+ this.isEditing = true;
+ this.saveChanges();
+ }
+
+ ngAfterViewInit(): void {
+ if (this.translatedText) this.translatedText.nativeElement.textContent = this.item.translated_text;
}
}
diff --git a/src/app/components/text_list/text_list.dto.ts b/src/app/dto/translate_data.dto.ts
similarity index 100%
rename from src/app/components/text_list/text_list.dto.ts
rename to src/app/dto/translate_data.dto.ts
diff --git a/src/app/lib/parser.ts b/src/app/lib/parser.ts
index a06369e..17e399a 100644
--- a/src/app/lib/parser.ts
+++ b/src/app/lib/parser.ts
@@ -1,10 +1,15 @@
-export function parse(text: string): string[] {
+import { TranslateData } from '../dto/translate_data.dto';
+
+export function parse(text: string): TranslateData[] {
const replaced_text = text
.replace('/<[kK]{1}>/gm', '\n')
.replace(/(<[^>]*>|\/\/.*)/gm, '')
.replace(/\s*\n\s*/gm, '\n');
- return replaced_text
+ const result = replaced_text
.split('\n')
.map((line) => line.trim())
- .filter((line) => line.length > 0);
+ .filter((line) => line.length > 0)
+ .map((line) => ({ english_text: line, translated_text: '' }));
+ console.log(result);
+ return result;
}
diff --git a/src/app/lib/translater.ts b/src/app/lib/translater.ts
deleted file mode 100644
index 30a8184..0000000
--- a/src/app/lib/translater.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { HttpClient } from '@angular/common/http';
-import { firstValueFrom } from 'rxjs';
-import { map } from 'rxjs/operators';
-
-export async function translate(text: string, http: HttpClient): Promise {
- const response = await firstValueFrom(
- http
- .get(
- `https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=ru&dt=t&q=` + encodeURIComponent(text),
- )
- .pipe(
- map((data: any) => data[0][0][0]), // Assuming the response structure from the API
- ),
- );
-
- return response;
-}