excel_translator/services/translator.py
2025-04-06 21:39:00 +02:00

49 lines
1.8 KiB
Python

from typing import List
import openpyxl
from googletrans import Translator
from pydantic import BaseModel
class Cell(BaseModel):
value: str
row: int
column: int
class Sheet(BaseModel):
name: str
cells: List[Cell]
class ExcelTranslator:
def __init__(self, src_language: str, dest_language: str):
self.translator = Translator()
self.src_language = src_language
self.dest_language = dest_language
def translate_text(self, text: str) -> str:
translated = self.translator.translate(text, src=self.src_language, dest=self.dest_language)
return translated.text
def translate_sheet(self, sheet: Sheet) -> Sheet:
translated_cells = []
for cell in sheet.cells:
translated_value = self.translate_text(cell.value)
translated_cells.append(Cell(value=translated_value, row=cell.row, column=cell.column))
return Sheet(name=sheet.name, cells=translated_cells)
def translate_workbook(self, file_path: str) -> None:
workbook = openpyxl.load_workbook(file_path)
translated_workbook = openpyxl.Workbook()
for sheet_name in workbook.sheetnames:
sheet = workbook[sheet_name]
translated_sheet = translated_workbook.create_sheet(title=sheet_name)
for row in sheet.iter_rows():
for cell in row:
translated_value = self.translate_text(cell.value) if cell.value else ''
translated_sheet[cell.coordinate].value = translated_value
# Preserve cell formatting
if cell.has_style:
translated_sheet[cell.coordinate]._style = cell._style
translated_file_path = file_path.replace('.xlsx', '_translated.xlsx')
translated_workbook.save(translated_file_path)