From 31a6cc5ef7796fdb4770be531cc24e2bd01e2363 Mon Sep 17 00:00:00 2001 From: Denis Bezykornov Date: Sat, 6 Dec 2025 15:42:36 +0300 Subject: [PATCH 1/8] Add translation source for document records --- ...82ea683d_add_segment_translation_source.py | 47 ++++++++++++++++ backend/app/documents/models.py | 9 ++++ backend/app/documents/schema.py | 6 +-- backend/app/routers/document.py | 4 +- backend/app/translation_memory/schema.py | 7 --- .../tests/routers/test_routes_doc_records.py | 10 +++- .../tests/routers/test_routes_documents.py | 8 --- backend/tests/test_worker.py | 53 ------------------- backend/worker.py | 30 ++++------- 9 files changed, 82 insertions(+), 92 deletions(-) create mode 100644 backend/alembic/versions/3fbb82ea683d_add_segment_translation_source.py diff --git a/backend/alembic/versions/3fbb82ea683d_add_segment_translation_source.py b/backend/alembic/versions/3fbb82ea683d_add_segment_translation_source.py new file mode 100644 index 0000000..df34607 --- /dev/null +++ b/backend/alembic/versions/3fbb82ea683d_add_segment_translation_source.py @@ -0,0 +1,47 @@ +"""Add segment translation source + +Revision ID: 3fbb82ea683d +Revises: 32d5a77e6615 +Create Date: 2025-12-06 13:49:58.517637 + +""" + +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# pylint: disable=E1101 + +# revision identifiers, used by Alembic. +revision: str = "3fbb82ea683d" +down_revision: Union[str, None] = "32d5a77e6615" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +segmentsource = sa.Enum( + "glossary", + "machine_translation", + "translation_memory", + "user_input", + "full_match", + name="recordsource", +) + + +def upgrade() -> None: + segmentsource.create(op.get_bind(), checkfirst=True) + op.add_column( + "document_record", + sa.Column( + "target_source", + segmentsource, + nullable=True, + ), + ) + + +def downgrade() -> None: + op.drop_column("document_record", "target_source") + segmentsource.drop(op.get_bind(), checkfirst=True) diff --git a/backend/app/documents/models.py b/backend/app/documents/models.py index b5547ba..32858ff 100644 --- a/backend/app/documents/models.py +++ b/backend/app/documents/models.py @@ -97,6 +97,14 @@ class Document(Base): ) +class RecordSource(Enum): + glossary = "glossary" + machine_translation = "mt" + translation_memory = "tm" + user_input = "user" + full_match = "fm" # for digits + + class DocumentRecord(Base): __tablename__ = "document_record" @@ -105,6 +113,7 @@ class DocumentRecord(Base): source: Mapped[str] = mapped_column() target: Mapped[str] = mapped_column() approved: Mapped[bool] = mapped_column(default=False) + target_source: Mapped[RecordSource] = mapped_column(nullable=True) document: Mapped["Document"] = relationship(back_populates="records") comments: Mapped[list["Comment"]] = relationship( diff --git a/backend/app/documents/schema.py b/backend/app/documents/schema.py index ff964c0..254aa71 100644 --- a/backend/app/documents/schema.py +++ b/backend/app/documents/schema.py @@ -2,10 +2,10 @@ from pydantic import BaseModel, Field -from app.documents.models import TmMode +from app.documents.models import RecordSource, TmMode from app.glossary.schema import GlossaryResponse from app.models import DocumentStatus, Identified, MachineTranslationSettings -from app.translation_memory.schema import TranslationMemory, TranslationMemoryUsage +from app.translation_memory.schema import TranslationMemory class DocumentRecordFilter(BaseModel): @@ -31,6 +31,7 @@ class DocumentRecord(Identified): approved: bool repetitions_count: int has_comments: bool + translation_src: RecordSource | None class DocumentRecordListResponse(BaseModel): @@ -54,7 +55,6 @@ class DocumentRecordUpdate(BaseModel): class DocumentProcessingSettings(BaseModel): substitute_numbers: bool machine_translation_settings: Optional[MachineTranslationSettings] - memory_usage: TranslationMemoryUsage similarity_threshold: float = Field(default=1.0, ge=0.0, le=1.0) diff --git a/backend/app/routers/document.py b/backend/app/routers/document.py index e60f476..7745e98 100644 --- a/backend/app/routers/document.py +++ b/backend/app/routers/document.py @@ -118,7 +118,6 @@ def get_doc_records( query = GenericDocsQuery(db) total_records = query.get_document_records_count_filtered(doc, filters) records = query.get_document_records_paged(doc, page, filters=filters) - record_list = [ doc_schema.DocumentRecord( id=record.id, @@ -127,6 +126,9 @@ def get_doc_records( approved=record.approved, repetitions_count=repetitions_count, has_comments=has_comments, + translation_src=record.target_source.value + if record.target_source + else None, ) for record, repetitions_count, has_comments in records ] diff --git a/backend/app/translation_memory/schema.py b/backend/app/translation_memory/schema.py index 3ba36b7..3262387 100644 --- a/backend/app/translation_memory/schema.py +++ b/backend/app/translation_memory/schema.py @@ -1,5 +1,3 @@ -from enum import Enum - from pydantic import BaseModel, Field from app.base.schema import Identified @@ -11,11 +9,6 @@ class MemorySubstitution(BaseModel): similarity: float -class TranslationMemoryUsage(Enum): - NEWEST = "newest" - OLDEST = "oldest" - - class TranslationMemory(Identified): name: str created_by: int diff --git a/backend/tests/routers/test_routes_doc_records.py b/backend/tests/routers/test_routes_doc_records.py index a4f9a90..ecb7cb3 100644 --- a/backend/tests/routers/test_routes_doc_records.py +++ b/backend/tests/routers/test_routes_doc_records.py @@ -10,6 +10,7 @@ Document, DocumentRecord, DocumentType, + RecordSource, ) from app.translation_memory.models import TranslationMemory, TranslationMemoryRecord @@ -19,7 +20,11 @@ def test_can_get_doc_records(user_logged_client: TestClient, session: Session): with session as s: records = [ - DocumentRecord(source="Regional Effects", target="Translation"), + DocumentRecord( + source="Regional Effects", + target="Translation", + target_source=RecordSource.translation_memory, + ), DocumentRecord(source="User Interface", target="UI", approved=True), ] s.add( @@ -46,6 +51,7 @@ def test_can_get_doc_records(user_logged_client: TestClient, session: Session): "approved": False, "repetitions_count": 1, "has_comments": False, + "translation_src": "tm", }, { "id": 2, @@ -54,6 +60,7 @@ def test_can_get_doc_records(user_logged_client: TestClient, session: Session): "approved": True, "repetitions_count": 1, "has_comments": False, + "translation_src": None, }, ] @@ -94,6 +101,7 @@ def test_doc_records_returns_second_page( "approved": False, "repetitions_count": 1, "has_comments": False, + "translation_src": None, } diff --git a/backend/tests/routers/test_routes_documents.py b/backend/tests/routers/test_routes_documents.py index 9e6366f..2dc7ebd 100644 --- a/backend/tests/routers/test_routes_documents.py +++ b/backend/tests/routers/test_routes_documents.py @@ -25,7 +25,6 @@ from app.models import DocumentStatus from app.schema import DocumentTask from app.translation_memory.models import TranslationMemory -from app.translation_memory.schema import TranslationMemoryUsage # pylint: disable=C0116 @@ -298,7 +297,6 @@ def test_process_sets_document_in_pending_stage_and_creates_task_xliff( json={ "substitute_numbers": False, "machine_translation_settings": None, - "memory_usage": TranslationMemoryUsage.NEWEST.value, }, ) @@ -320,7 +318,6 @@ def test_process_sets_document_in_pending_stage_and_creates_task_txt( json={ "substitute_numbers": False, "machine_translation_settings": None, - "memory_usage": TranslationMemoryUsage.NEWEST.value, }, ) @@ -342,7 +339,6 @@ def test_process_creates_task_for_xliff( json={ "substitute_numbers": False, "machine_translation_settings": None, - "memory_usage": TranslationMemoryUsage.NEWEST.value, }, ) @@ -358,7 +354,6 @@ def test_process_creates_task_for_xliff( "settings": { "substitute_numbers": False, "machine_translation_settings": None, - "memory_usage": "newest", "similarity_threshold": 1.0, }, } @@ -373,7 +368,6 @@ def test_process_creates_task_for_txt(user_logged_client: TestClient, session: S json={ "substitute_numbers": False, "machine_translation_settings": None, - "memory_usage": TranslationMemoryUsage.NEWEST.value, }, ) @@ -389,7 +383,6 @@ def test_process_creates_task_for_txt(user_logged_client: TestClient, session: S "settings": { "substitute_numbers": False, "machine_translation_settings": None, - "memory_usage": "newest", "similarity_threshold": 1.0, }, } @@ -403,7 +396,6 @@ def test_returns_404_when_processing_nonexistent_doc( json={ "substitute_numbers": False, "machine_translation_settings": None, - "memory_usage": TranslationMemoryUsage.NEWEST.value, }, ) assert response.status_code == 404 diff --git a/backend/tests/test_worker.py b/backend/tests/test_worker.py index 60d7e86..7314b0e 100644 --- a/backend/tests/test_worker.py +++ b/backend/tests/test_worker.py @@ -27,7 +27,6 @@ ) from app.schema import DocumentTask from app.translation_memory.models import TranslationMemory, TranslationMemoryRecord -from app.translation_memory.schema import TranslationMemoryUsage from worker import process_task # pylint: disable=C0116 @@ -54,7 +53,6 @@ def create_xliff_doc(data: str): def create_task( *, type_: Literal["xliff", "txt"] = "xliff", - usage: TranslationMemoryUsage = TranslationMemoryUsage.NEWEST, substitute_numbers: bool = False, mt_settings: YandexTranslatorSettings | None = None, ): @@ -65,7 +63,6 @@ def create_task( settings=DocumentProcessingSettings( substitute_numbers=substitute_numbers, machine_translation_settings=mt_settings, - memory_usage=usage, ), ).model_dump_json(), status="pending", @@ -289,53 +286,6 @@ def test_process_task_uses_correct_tm_ids(session: Session): assert doc.records[0].target == "Another translation" -@pytest.mark.parametrize( - ["mode", "trans_result"], - [("newest", "Another translation"), ("oldest", "Translation")], -) -def test_process_task_uses_tm_mode(mode: str, trans_result: str, session: Session): - with open("tests/fixtures/small.xliff", "r", encoding="utf-8") as fp: - file_data = fp.read() - - with session as s: - tm_records_1 = [ - TranslationMemoryRecord( - source="Regional Effects", - target="Translation", - creation_date=datetime(2020, 1, 1, 0, 0, 0), - change_date=datetime(2020, 1, 1, 0, 0, 0), - ) - ] - tm_records_2 = [ - TranslationMemoryRecord( - source="Regional Effects", - target="Another translation", - creation_date=datetime(2021, 1, 1, 0, 0, 0), - change_date=datetime(2021, 1, 1, 0, 0, 0), - ) - ] - s.add_all( - [ - TranslationMemory(name="test1", records=tm_records_1, created_by=1), - TranslationMemory(name="test2", records=tm_records_2, created_by=1), - create_doc(name="small.xliff", type_=DocumentType.xliff), - create_xliff_doc(file_data), - create_task(usage=TranslationMemoryUsage(mode)), - DocMemoryAssociation(doc_id=1, tm_id=1, mode="read"), - DocMemoryAssociation(doc_id=1, tm_id=2, mode="read"), - ] - ) - s.commit() - - result = process_task(s, s.query(DocumentTask).one()) - assert result - - doc = s.query(Document).filter_by(id=1).one() - assert doc.processing_status == "done" - assert len(doc.records) > 1 - assert doc.records[0].target == trans_result - - def test_process_task_substitutes_numbers(session: Session): with open("tests/fixtures/small.xliff", "r", encoding="utf-8") as fp: file_data = fp.read() @@ -370,7 +320,6 @@ def test_process_task_substitutes_numbers(session: Session): "substitute_numbers": False, "use_machine_translation": False, "machine_translation_settings": None, - "memory_usage": "newest", }, }, { @@ -379,7 +328,6 @@ def test_process_task_substitutes_numbers(session: Session): "substitute_numbers": False, "use_machine_translation": False, "machine_translation_settings": None, - "memory_usage": "newest", }, }, { @@ -393,7 +341,6 @@ def test_process_task_substitutes_numbers(session: Session): "substitute_numbers": False, "use_machine_translation": False, "machine_translation_settings": None, - "memory_usage": "newest", }, }, ], diff --git a/backend/worker.py b/backend/worker.py index 465cf6c..0efe476 100644 --- a/backend/worker.py +++ b/backend/worker.py @@ -1,4 +1,4 @@ -# This is a worker that takes tasks from the database every 10 seconds and +# This is a worker that takes tasks from the database every N seconds and # processes files in it. # Tasks are stored in document_task table and encoded in JSON. @@ -14,6 +14,7 @@ Document, DocumentRecord, DocumentType, + RecordSource, TxtRecord, XliffRecord, ) @@ -28,7 +29,6 @@ from app.schema import DocumentTask from app.translation_memory.models import TranslationMemoryRecord from app.translation_memory.query import TranslationMemoryQuery -from app.translation_memory.schema import TranslationMemoryUsage from app.translators import llm, yandex from app.translators.common import LineWithGlossaries @@ -43,14 +43,13 @@ def get_segment_translation( source: str, threshold: float, tm_ids: list[int], - tm_usage: TranslationMemoryUsage, substitute_numbers: bool, glossary_ids: list[int], session: Session, -) -> str | None: +) -> tuple[str, RecordSource | None] | None: # TODO: this would be nice to have batching for all segments to reduce amounts of requests to DB if substitute_numbers and source.isdigit(): - return source + return source, None glossary_record = ( session.query(GlossaryRecord) @@ -61,31 +60,23 @@ def get_segment_translation( .first() ) if glossary_record: - return glossary_record.target + return glossary_record.target, RecordSource.glossary if threshold < 1.0: substitutions = TranslationMemoryQuery(session).get_substitutions( source, tm_ids, threshold, 1 ) if substitutions: - return substitutions[0].target + return substitutions[0].target, RecordSource.translation_memory else: selector = ( select(TranslationMemoryRecord.source, TranslationMemoryRecord.target) .where(TranslationMemoryRecord.source == source) .where(TranslationMemoryRecord.document_id.in_(tm_ids)) + .order_by(TranslationMemoryRecord.change_date.desc()) ) - match tm_usage: - case TranslationMemoryUsage.NEWEST: - selector = selector.order_by(TranslationMemoryRecord.change_date.desc()) - case TranslationMemoryUsage.OLDEST: - selector = selector.order_by(TranslationMemoryRecord.change_date.asc()) - case _: - logging.error("Unknown translation memory usage option") - return None - tm_data = session.execute(selector.limit(1)).first() - return tm_data.target if tm_data else None + return (tm_data.target, RecordSource.translation_memory) if tm_data else None return None @@ -183,7 +174,6 @@ def substitute_segments( segment.original, settings.similarity_threshold, tm_ids, - settings.memory_usage, settings.substitute_numbers, glossary_ids, session, @@ -192,7 +182,9 @@ def substitute_segments( to_translate.append(idx) continue - segment.translation = translation or "" + # TODO: use target source + target_translation, _ = translation + segment.translation = target_translation or "" return to_translate From 13f02f812a1fe147e8827613dcea1482f8534655 Mon Sep 17 00:00:00 2001 From: Denis Bezykornov Date: Sun, 7 Dec 2025 19:20:15 +0300 Subject: [PATCH 2/8] Make numbers subsitution automated, not option --- backend/app/documents/schema.py | 1 - .../tests/routers/test_routes_documents.py | 7 ---- backend/tests/test_worker.py | 36 ++----------------- backend/worker.py | 4 +-- 4 files changed, 4 insertions(+), 44 deletions(-) diff --git a/backend/app/documents/schema.py b/backend/app/documents/schema.py index 254aa71..73eb8b9 100644 --- a/backend/app/documents/schema.py +++ b/backend/app/documents/schema.py @@ -53,7 +53,6 @@ class DocumentRecordUpdate(BaseModel): class DocumentProcessingSettings(BaseModel): - substitute_numbers: bool machine_translation_settings: Optional[MachineTranslationSettings] similarity_threshold: float = Field(default=1.0, ge=0.0, le=1.0) diff --git a/backend/tests/routers/test_routes_documents.py b/backend/tests/routers/test_routes_documents.py index 2dc7ebd..2c51ed9 100644 --- a/backend/tests/routers/test_routes_documents.py +++ b/backend/tests/routers/test_routes_documents.py @@ -295,7 +295,6 @@ def test_process_sets_document_in_pending_stage_and_creates_task_xliff( response = user_logged_client.post( "/document/1/process", json={ - "substitute_numbers": False, "machine_translation_settings": None, }, ) @@ -316,7 +315,6 @@ def test_process_sets_document_in_pending_stage_and_creates_task_txt( response = user_logged_client.post( "/document/1/process", json={ - "substitute_numbers": False, "machine_translation_settings": None, }, ) @@ -337,7 +335,6 @@ def test_process_creates_task_for_xliff( response = user_logged_client.post( "/document/1/process", json={ - "substitute_numbers": False, "machine_translation_settings": None, }, ) @@ -352,7 +349,6 @@ def test_process_creates_task_for_xliff( "type": "xliff", "document_id": 1, "settings": { - "substitute_numbers": False, "machine_translation_settings": None, "similarity_threshold": 1.0, }, @@ -366,7 +362,6 @@ def test_process_creates_task_for_txt(user_logged_client: TestClient, session: S response = user_logged_client.post( "/document/1/process", json={ - "substitute_numbers": False, "machine_translation_settings": None, }, ) @@ -381,7 +376,6 @@ def test_process_creates_task_for_txt(user_logged_client: TestClient, session: S "type": "txt", "document_id": 1, "settings": { - "substitute_numbers": False, "machine_translation_settings": None, "similarity_threshold": 1.0, }, @@ -394,7 +388,6 @@ def test_returns_404_when_processing_nonexistent_doc( response = user_logged_client.post( "/document/1/process", json={ - "substitute_numbers": False, "machine_translation_settings": None, }, ) diff --git a/backend/tests/test_worker.py b/backend/tests/test_worker.py index 7314b0e..dfd6794 100644 --- a/backend/tests/test_worker.py +++ b/backend/tests/test_worker.py @@ -53,7 +53,6 @@ def create_xliff_doc(data: str): def create_task( *, type_: Literal["xliff", "txt"] = "xliff", - substitute_numbers: bool = False, mt_settings: YandexTranslatorSettings | None = None, ): return DocumentTask( @@ -61,7 +60,6 @@ def create_task( type=type_, document_id=1, settings=DocumentProcessingSettings( - substitute_numbers=substitute_numbers, machine_translation_settings=mt_settings, ), ).model_dump_json(), @@ -139,16 +137,16 @@ def test_process_task_sets_xliff_records(session: Session): assert xliff_record.segment_id == 675608 assert xliff_record.state == "translated" - # It does not substitute numbers + # It does substitute numbers record = doc.records[3] assert record.source == "123456789" - assert record.target == "" + assert record.target == "123456789" assert not record.approved xliff_record = ( s.query(XliffRecord).filter(XliffRecord.parent_id == record.id).one() ) assert xliff_record.segment_id == 675609 - assert xliff_record.state == "needs-translation" + assert xliff_record.state == "translated" def test_process_task_sets_txt_records(session: Session): @@ -286,38 +284,12 @@ def test_process_task_uses_correct_tm_ids(session: Session): assert doc.records[0].target == "Another translation" -def test_process_task_substitutes_numbers(session: Session): - with open("tests/fixtures/small.xliff", "r", encoding="utf-8") as fp: - file_data = fp.read() - - with session as s: - s.add_all( - [ - TranslationMemory(name="test", records=[], created_by=1), - create_doc(name="small.xliff", type_=DocumentType.xliff), - create_xliff_doc(file_data), - create_task(substitute_numbers=True), - ] - ) - s.commit() - - result = process_task(s, s.query(DocumentTask).one()) - assert result - - doc = s.query(Document).filter_by(id=1).one() - assert doc.processing_status == "done" - assert len(doc.records) == 4 - assert doc.records[3].source == "123456789" - assert doc.records[3].target == "123456789" - - @pytest.mark.parametrize( "task_data", [ { "document_id": 1, "settings": { - "substitute_numbers": False, "use_machine_translation": False, "machine_translation_settings": None, }, @@ -325,7 +297,6 @@ def test_process_task_substitutes_numbers(session: Session): { "type": "xliff", "settings": { - "substitute_numbers": False, "use_machine_translation": False, "machine_translation_settings": None, }, @@ -338,7 +309,6 @@ def test_process_task_substitutes_numbers(session: Session): "type": "broken", "document_id": 1, "settings": { - "substitute_numbers": False, "use_machine_translation": False, "machine_translation_settings": None, }, diff --git a/backend/worker.py b/backend/worker.py index 0efe476..d9394ee 100644 --- a/backend/worker.py +++ b/backend/worker.py @@ -43,12 +43,11 @@ def get_segment_translation( source: str, threshold: float, tm_ids: list[int], - substitute_numbers: bool, glossary_ids: list[int], session: Session, ) -> tuple[str, RecordSource | None] | None: # TODO: this would be nice to have batching for all segments to reduce amounts of requests to DB - if substitute_numbers and source.isdigit(): + if source.isdigit(): return source, None glossary_record = ( @@ -174,7 +173,6 @@ def substitute_segments( segment.original, settings.similarity_threshold, tm_ids, - settings.substitute_numbers, glossary_ids, session, ) From 8a2813824fae3c964bf7cad67599a2595ea273e3 Mon Sep 17 00:00:00 2001 From: Denis Bezykornov Date: Sun, 7 Dec 2025 19:21:59 +0300 Subject: [PATCH 3/8] Generate client --- frontend/src/client/schemas/DocumentProcessingSettings.ts | 3 --- frontend/src/client/schemas/DocumentRecord.ts | 3 +++ frontend/src/client/schemas/RecordSource.ts | 3 +++ frontend/src/client/schemas/TranslationMemoryUsage.ts | 3 --- 4 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 frontend/src/client/schemas/RecordSource.ts delete mode 100644 frontend/src/client/schemas/TranslationMemoryUsage.ts diff --git a/frontend/src/client/schemas/DocumentProcessingSettings.ts b/frontend/src/client/schemas/DocumentProcessingSettings.ts index b71c73f..f343ba5 100644 --- a/frontend/src/client/schemas/DocumentProcessingSettings.ts +++ b/frontend/src/client/schemas/DocumentProcessingSettings.ts @@ -2,11 +2,8 @@ import {LlmTranslatorSettings} from './LlmTranslatorSettings' import {YandexTranslatorSettings} from './YandexTranslatorSettings' -import {TranslationMemoryUsage} from './TranslationMemoryUsage' export interface DocumentProcessingSettings { - substitute_numbers: boolean machine_translation_settings: LlmTranslatorSettings | YandexTranslatorSettings | null - memory_usage: TranslationMemoryUsage similarity_threshold?: number } diff --git a/frontend/src/client/schemas/DocumentRecord.ts b/frontend/src/client/schemas/DocumentRecord.ts index 1a545fa..39ff479 100644 --- a/frontend/src/client/schemas/DocumentRecord.ts +++ b/frontend/src/client/schemas/DocumentRecord.ts @@ -1,5 +1,7 @@ // This file is autogenerated, do not edit directly. +import {RecordSource} from './RecordSource' + export interface DocumentRecord { id: number source: string @@ -7,4 +9,5 @@ export interface DocumentRecord { approved: boolean repetitions_count: number has_comments: boolean + translation_src: RecordSource | null } diff --git a/frontend/src/client/schemas/RecordSource.ts b/frontend/src/client/schemas/RecordSource.ts new file mode 100644 index 0000000..221d644 --- /dev/null +++ b/frontend/src/client/schemas/RecordSource.ts @@ -0,0 +1,3 @@ +// This file is autogenerated, do not edit directly. + +export type RecordSource = 'glossary' | 'mt' | 'tm' | 'user' diff --git a/frontend/src/client/schemas/TranslationMemoryUsage.ts b/frontend/src/client/schemas/TranslationMemoryUsage.ts deleted file mode 100644 index fdadb5c..0000000 --- a/frontend/src/client/schemas/TranslationMemoryUsage.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is autogenerated, do not edit directly. - -export type TranslationMemoryUsage = 'newest' | 'oldest' From 6baa58dbce807324162ac87cdeddd1067503ffaa Mon Sep 17 00:00:00 2001 From: Denis Bezykornov Date: Sun, 7 Dec 2025 19:22:14 +0300 Subject: [PATCH 4/8] Remove dead options from uploading dialog --- frontend/mocks/documentMocks.ts | 12 +++++++ .../src/components/DocUploadingDialog.vue | 33 ------------------- 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/frontend/mocks/documentMocks.ts b/frontend/mocks/documentMocks.ts index 16aa97d..c549200 100644 --- a/frontend/mocks/documentMocks.ts +++ b/frontend/mocks/documentMocks.ts @@ -187,6 +187,7 @@ const segments: DocumentRecord[] = [ target: 'Зацепки приключения', repetitions_count: 2, has_comments: false, + translation_src: 'glossary', }, { id: 10001, @@ -197,6 +198,7 @@ const segments: DocumentRecord[] = [ 'В тот момент, когда кинидийцы извлекли рог из монолита, их город был обречен.', repetitions_count: 1, has_comments: true, + translation_src: 'tm', }, { id: 10002, @@ -205,6 +207,16 @@ const segments: DocumentRecord[] = [ target: 'Зацепки приключения', repetitions_count: 2, has_comments: true, + translation_src: 'mt', + }, + { + id: 10003, + approved: true, + source: 'Adventure Hooks', + target: 'Зацепки приключения', + repetitions_count: 3, + has_comments: false, + translation_src: null, }, ] diff --git a/frontend/src/components/DocUploadingDialog.vue b/frontend/src/components/DocUploadingDialog.vue index ff84e22..a60a0af 100644 --- a/frontend/src/components/DocUploadingDialog.vue +++ b/frontend/src/components/DocUploadingDialog.vue @@ -9,7 +9,6 @@ import { setTranslationMemories, } from '../client/services/DocumentService' import {Document} from '../client/schemas/Document' -import {TranslationMemoryUsage} from '../client/schemas/TranslationMemoryUsage' import {useTmStore} from '../stores/tm' import {useGlossaryStore} from '../stores/glossary' @@ -18,7 +17,6 @@ import MachineTranslationOptions, { MtType, } from './MachineTranslationOptions.vue' -import Checkbox from 'primevue/checkbox' import MultiSelect from 'primevue/multiselect' import Select from 'primevue/select' import FileUpload, {FileUploadSelectEvent} from 'primevue/fileupload' @@ -36,7 +34,6 @@ const uploadedFile = ref(null) as Ref const uploading = ref(false) const status = ref('') -const substituteNumbers = ref(true) const mtOptions = ref({ enabled: false, // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment @@ -57,8 +54,6 @@ const processingAvailable = computed(() => uploadedFile.value != null) const tmStore = useTmStore() const glossaryStore = useGlossaryStore() -const memoryMode = ref('newest') - const createFile = async (event: FileUploadSelectEvent) => { status.value = '' if (!event.files) { @@ -102,13 +97,11 @@ const startProcessing = async () => { }) const mtSettings = mtOptions.value await processDoc(uploadedFile.value!.id, { - substitute_numbers: substituteNumbers.value, machine_translation_settings: mtSettings.enabled ? mtSettings.type === 'yandex' ? mtSettings.yandexSettings : mtSettings.llmSettings : null, - memory_usage: memoryMode.value, similarity_threshold: similarityThreshold.value, }) uploading.value = false @@ -159,18 +152,6 @@ const selectedGlossaries = ref([]) filter-placeholder="Search TMX files..." /> -
- - ([]) option-value="value" />
-
- - -
Date: Sun, 7 Dec 2025 23:57:13 +0300 Subject: [PATCH 5/8] Add UI to show segment sources --- frontend/src/components/DocSegment.vue | 41 +++++++++++++++++++++++++- frontend/src/views/DocView.vue | 1 + 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/DocSegment.vue b/frontend/src/components/DocSegment.vue index 959314d..25f41f0 100644 --- a/frontend/src/components/DocSegment.vue +++ b/frontend/src/components/DocSegment.vue @@ -4,6 +4,7 @@ import {computed, ref, useTemplateRef, watch} from 'vue' import Button from 'primevue/button' import {cleanableDebounce} from '../utilities/utils' +import {RecordSource} from '../client/schemas/RecordSource' const props = defineProps<{ id: number @@ -15,6 +16,7 @@ const props = defineProps<{ approved?: boolean repetitionsCount?: number hasComments?: boolean + recordSrc?: RecordSource }>() const emit = defineEmits<{ @@ -74,6 +76,32 @@ const icon = computed( const showCommentsDialog = () => { emit('addComment') } + +const segSourceTitle = computed(() => { + switch (props.recordSrc) { + case 'glossary': + return 'Glossary term' + case 'mt': + return 'Machine translation' + case 'tm': + return 'Translation memory' + default: + return undefined + } +}) + +const segSourceIcon = computed(() => { + switch (props.recordSrc) { + case 'glossary': + return 'pi-globe' + case 'mt': + return 'pi-language' + case 'tm': + return 'pi-database' + default: + return undefined + } +})