Multi Language translation impl. Eine .json Datei enthält die ÜBersetztungen von allen Sprachen die übersetzt werden sollen. Dazu müssen diese Sektione allerdings auch befüllt sein

This commit is contained in:
2025-12-15 13:39:39 +01:00
parent ccbfcafb63
commit 6524a76c2a
3 changed files with 154766 additions and 108 deletions
+101 -7
View File
@@ -29,8 +29,11 @@ class TestRunner:
self.testdata_dir = Path(os.environ.get('PROJECT_TEST', self.project_root / "testdata"))
self.work_dir = Path(os.environ.get('PROJECT_WORK', self.project_root / "work"))
self.bin_dir = Path(os.environ.get('PROJECT_BIN', self.project_root / "bin"))
self.lib_dir = Path(os.environ.get('PROJECT_LIB', self.project_root / "lib"))
self.cfg_dir = Path(os.environ.get('PROJECT_CFG', self.project_root / "cfg"))
self.getexdraw_bat = self.bin_dir / "getexdraw.bat"
self.ioconverter_bat = self.bin_dir / "ioconverter.bat"
self.translate_py = self.lib_dir / "translate.py"
self.test_results = []
self.failed_tests = []
@@ -128,6 +131,80 @@ class TestRunner:
except Exception as e:
return False, f"Exception during execution: {str(e)}"
def run_translate(self, test_filename):
"""Execute translate.py for given test file with three variants: raw, cs, multilang"""
dxf_file = self.testdata_dir / f"{test_filename}.dxf"
if not dxf_file.exists():
return False, f"Test file {dxf_file} not found"
try:
# Set up environment for translate.py
env = os.environ.copy()
env['PROJECT_TRANSLATION'] = str(self.cfg_dir / "translation")
# Variant 1: Raw extraction (no translation)
cmd_raw = [
sys.executable,
str(self.translate_py),
'--extract',
'--filename', str(dxf_file),
'--export-type', 'json',
'--outname', f'{test_filename}_raw'
]
result_raw = subprocess.run(cmd_raw, capture_output=True, text=True, env=env)
# Variant 2: CS translation (single language)
cmd_cs = [
sys.executable,
str(self.translate_py),
'--extract',
'--filename', str(dxf_file),
'--export-type', 'json',
'--outname', f'{test_filename}_cs',
'--translate', 'CS'
]
result_cs = subprocess.run(cmd_cs, capture_output=True, text=True, env=env)
# Variant 3: Multilang translation (CS,EN)
cmd_multilang = [
sys.executable,
str(self.translate_py),
'--extract',
'--filename', str(dxf_file),
'--export-type', 'json',
'--outname', f'{test_filename}_multilang',
'--translate', 'CS,EN'
]
result_multilang = subprocess.run(cmd_multilang, capture_output=True, text=True, env=env)
# Check if all expected output files were created
expected_raw = self.work_dir / f"{test_filename}_raw.json"
expected_cs = self.work_dir / f"{test_filename}_cs.json"
expected_multilang = self.work_dir / f"{test_filename}_multilang.json"
missing_files = []
if not expected_raw.exists():
missing_files.append(f"{test_filename}_raw.json")
if not expected_cs.exists():
missing_files.append(f"{test_filename}_cs.json")
if not expected_multilang.exists():
missing_files.append(f"{test_filename}_multilang.json")
if missing_files:
error_msg = f"translate.py failed - expected output files not found: {', '.join(missing_files)}"
if result_raw.returncode != 0:
error_msg += f"\n\nRaw variant STDOUT:\n{result_raw.stdout}\nSTDERR:\n{result_raw.stderr}"
if result_cs.returncode != 0:
error_msg += f"\n\nCS variant STDOUT:\n{result_cs.stdout}\nSTDERR:\n{result_cs.stderr}"
if result_multilang.returncode != 0:
error_msg += f"\n\nMultilang variant STDOUT:\n{result_multilang.stdout}\nSTDERR:\n{result_multilang.stderr}"
return False, error_msg
else:
return True, "Success"
except Exception as e:
return False, f"Exception during execution: {str(e)}"
def cleanup_test_files(self, test_filename):
"""Remove the work folder for the given test"""
if not self.clean:
@@ -149,7 +226,11 @@ class TestRunner:
# Check what files actually exist and determine comparison strategy based on mode
errors_file = self.work_dir / test_filename / f"{test_filename}_errors.json"
if self.mode == 'ioconverter':
if self.mode == 'translation':
# For translation mode: compare _raw, _cs, and _multilang variants
file_suffixes = ['_raw', '_cs', '_multilang']
# Translation files are directly in work_dir, not in subdirectory
elif self.mode == 'ioconverter':
# For ioconverter mode: check for _positionsconv.json
positions_file = self.work_dir / test_filename / f"{test_filename}_positionsconv.json"
@@ -178,8 +259,12 @@ class TestRunner:
return False, f"No generated files found for {test_filename}", []
for suffix in file_suffixes:
# Generated file should be in work/<testfilename>/<testfilename><suffix>.json
generated_file = self.work_dir / test_filename / f"{test_filename}{suffix}.json"
# For translation mode, files are directly in work_dir
if self.mode == 'translation':
generated_file = self.work_dir / f"{test_filename}{suffix}.json"
else:
# For other modes, files are in work/<testfilename>/ subdirectory
generated_file = self.work_dir / test_filename / f"{test_filename}{suffix}.json"
# Reference file should be in testdata/<testfilename><suffix>.json
reference_file = self.testdata_dir / f"{test_filename}{suffix}.json"
@@ -237,8 +322,10 @@ class TestRunner:
result = TestResult(test_filename)
# Step 1: Run the appropriate batch script based on mode
if self.mode == 'ioconverter':
# Step 1: Run the appropriate script based on mode
if self.mode == 'translation':
success, msg = self.run_translate(test_filename)
elif self.mode == 'ioconverter':
success, msg = self.run_ioconverter(test_filename)
else:
success, msg = self.run_getexdraw(test_filename)
@@ -370,11 +457,18 @@ def main():
action='store_true',
help='Run ioconverter.bat tests'
)
mode_group.add_argument(
'--translation',
action='store_true',
help='Run translate.py tests (extract text with raw, CS, and multilang variants)'
)
args = parser.parse_args()
# Determine mode - default to getexdraw if neither is specified
if args.ioconverter:
# Determine mode - default to getexdraw if none is specified
if args.translation:
mode = 'translation'
elif args.ioconverter:
mode = 'ioconverter'
else:
mode = 'getexdraw'