49 lines
1.8 KiB
Python
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) |