Skip to content

Commit b770eab

Browse files
committed
Implement text_set_po_to_mo.py
1 parent 9fb3ada commit b770eab

File tree

4 files changed

+72
-1
lines changed

4 files changed

+72
-1
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from collections.abc import Iterable
2+
from typing import BinaryIO, TextIO
3+
4+
from babel.messages.catalog import Catalog, Message
5+
from babel.messages.mofile import write_mo
6+
from babel.messages.pofile import read_po
7+
from loguru import logger
8+
9+
from df_translation_toolkit.utils.fix_translated_strings import cleanup_string, fix_spaces
10+
from df_translation_toolkit.validation.validate_general import validate
11+
from df_translation_toolkit.validation.validation_models import Diagnostics, ProblemInfo
12+
13+
14+
def validate_translation(
15+
original: str,
16+
translation: str,
17+
diagnostics: Diagnostics | None = None,
18+
) -> str | None:
19+
validation_problems = list(validate(original, translation))
20+
if validation_problems:
21+
problem_info = ProblemInfo(original=original, translation=translation, problems=validation_problems)
22+
logger.error("\n" + str(problem_info))
23+
if diagnostics:
24+
diagnostics.add(problem_info)
25+
26+
if problem_info.contains_errors():
27+
return None
28+
29+
return fix_spaces(original, translation)
30+
31+
32+
def translate_tag_string(
33+
original: str,
34+
translation: str,
35+
diagnostics: Diagnostics | None = None,
36+
) -> str | None:
37+
if not (original and translation and translation != original):
38+
return None
39+
40+
validated_translation = validate_translation(original, translation, diagnostics=diagnostics)
41+
if not validated_translation:
42+
return None
43+
44+
return cleanup_string(validated_translation)
45+
46+
47+
def prepare_translation_messages(catalog: Catalog, diagnostics: Diagnostics | None = None) -> Iterable[Message]:
48+
for message in catalog:
49+
translation = translate_tag_string(str(message.id), str(message.string), diagnostics=diagnostics)
50+
if translation:
51+
yield Message(id=message.id, context=message.context, string=translation)
52+
53+
54+
def convert(po_file: TextIO, mo_file: BinaryIO, diagnostics: Diagnostics | None = None) -> None:
55+
input_catalog = read_po(po_file)
56+
output_catalog = Catalog()
57+
58+
for message in prepare_translation_messages(input_catalog, diagnostics):
59+
output_catalog.add(id=message.id, context=message.context, string=message.string)
60+
61+
write_mo(mo_file, output_catalog)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
from collections.abc import Iterator
3+
4+
from df_translation_toolkit.validation.validation_models import ValidationProblem
5+
6+
7+
def validate(original: str, translation: str) -> Iterator[ValidationProblem]:
8+
"""Draft for general validation."""
9+
_ = original, translation
10+
return iter(())

tests/test_text_to_mo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
22

3-
from df_translation_toolkit.convert.text_to_mo import fix_spaces_in_tag_parts_translations, translate_tag_string
3+
from df_translation_toolkit.convert.objects_po_to_mo import fix_spaces_in_tag_parts_translations, translate_tag_string
44

55

66
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)