Skip to content

Commit

Permalink
refactor: Enhanced side-by-side translation position for ignored para…
Browse files Browse the repository at this point in the history
…graphs.
  • Loading branch information
bookfere committed Mar 14, 2024
1 parent a871b7a commit 7354b82
Show file tree
Hide file tree
Showing 6 changed files with 310 additions and 123 deletions.
4 changes: 2 additions & 2 deletions advanced.py
Original file line number Diff line number Diff line change
Expand Up @@ -559,11 +559,11 @@ def layout_control(self):
title_layout = QHBoxLayout(title_group)
custom_title = QCheckBox()
ebook_title = QLineEdit()
ebook_title.setText(self.ebook.title)
ebook_title.setToolTip(
_('By default, title metadata will be translated.'))
ebook_title.setText(self.ebook.title)
ebook_title.setCursorPosition(0)
ebook_title.setDisabled(True)
# ebook_title.setCursorPosition(0)
title_layout.addWidget(custom_title)
title_layout.addWidget(ebook_title)

Expand Down
2 changes: 2 additions & 0 deletions components/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,8 @@ def add_data():
custom_list.setCurrentText(name)
custom_engine_data.setPlainText(template)
self.custom_engines[name] = template
if len(self.custom_engines) < 1:
add_data()

def restore_data(name=None):
name = name or custom_list.currentText()
Expand Down
1 change: 1 addition & 0 deletions lib/conversion.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ def translate_done(self, job):
filename = '%s.%s' % (metadata.title, ebook.output_format)
new_output_path = os.path.join(dirname, filename)
os.rename(output_path, new_output_path)
output_path = new_output_path

self.gui.status_bar.show_message(
job.description + ' ' + _('completed'), 5000)
Expand Down
69 changes: 33 additions & 36 deletions lib/element.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ def add_translation(
self.element[2] += '\n%s' % translation
else:
self.element[2] = '%s\n%s' % (translation, self.element[2])
return self.element

def get_translation(self):
return '\n'.join(self.element)
Expand All @@ -117,9 +116,10 @@ def add_translation(
if position not in ('below', 'right'):
content = reversed(content)
self.element[1] = ' | '.join(content)
return self.element

def get_translation(self):
if self.element[1] is None:
return self.element[0]
return '{%s}' % self.element[1]


Expand All @@ -145,7 +145,6 @@ def add_translation(
else:
self.element.content = '%s %s' %(
self.element.content, translation)
return self.element


class TocElement(Element):
Expand All @@ -165,7 +164,6 @@ def add_translation(
items = [self.element.title, translation]
self.element.title = items[-1] if position == 'only' else ' '.join(
reversed(items) if position in ('above', 'left') else items)
return self.element


class PageElement(Element):
Expand Down Expand Up @@ -223,16 +221,16 @@ def _polish_translation(self, translation):
def add_translation(
self, translation, position, translation_lang=None,
original_color=None, translation_color=None):
if original_color is not None:
self.element.set('style', 'color:%s' % original_color)
if translation is None:
if position in ('left', 'right'):
if original_color is not None:
self.element_color.set(
'style', 'color:%s' % original_color)
self.element.addnext(
self._create_table(position, self._element_copy()))
if position in ('only', 'left', 'right'):
if position in ('left', 'right'):
self.delete()
return self.element
# return self.element
return
# Escape the markups (<m id=1 />) to replace escaped markups.
translation = xml_escape(translation)
for rid, reserve in enumerate(self.reserve_elements):
Expand All @@ -259,17 +257,13 @@ def add_translation(
new_element.set(name, value)
if translation_lang is not None:
new_element.set('lang', translation_lang)
if original_color is not None:
self.element.set('style', 'color:%s' % original_color)
if translation_color is not None:
new_element.set('style', 'color:%s' % translation_color)

self.element.tail = None # Make sure the element has no tail

if position in ('left', 'right'):
element_copy = self._element_copy()
if original_color is not None:
element_copy.set('style', 'color:%s' % original_color)
self.element.addnext(
self._create_table(position, element_copy, new_element))
elif position == 'above':
Expand All @@ -278,7 +272,6 @@ def add_translation(
self.element.addnext(new_element)
if position in ['left', 'right', 'only']:
self.delete()
return new_element

def _create_table(self, position, original, translation=None):
# table = self.element.makeelement('table', attrib={'width': '100%'})
Expand All @@ -300,7 +293,9 @@ def _create_table(self, position, original, translation=None):
td_middle.set('width', '%s%%' % value)
td_right.set('width', width)
else:
td_left.set('width', '50%')
td_middle.text = '\xa0' * value
td_right.set('width', '50%')
if position == 'left':
if translation is not None:
td_left.append(translation)
Expand Down Expand Up @@ -378,8 +373,8 @@ def need_ignore(self, element):
def extract_elements(self, page_id, root, elements=[]):
priority_elements = ['p', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']
for element in root.findall('./*'):
if self.need_ignore(element):
continue
# if self.need_ignore(element):
# continue
element_has_content = False
if element.text is not None and trim(element.text) != '':
element_has_content = True
Expand All @@ -393,12 +388,15 @@ def extract_elements(self, page_id, root, elements=[]):
element_has_content = True
break
if element_has_content:
elements.append(PageElement(element, page_id))
page_element = PageElement(element, page_id)
page_element.set_ignored(self.need_ignore(element))
elements.append(page_element)
else:
self.extract_elements(page_id, element, elements)
# Return root if all children have no content
root = PageElement(root, page_id)
return elements if elements else [root]
page_element = PageElement(root, page_id)
page_element.set_ignored(self.need_ignore(root))
return elements if elements else [page_element]

def filter_content(self, element):
# Ignore the element contains empty content
Expand Down Expand Up @@ -449,12 +447,8 @@ def set_translation_color(self, color):
self.translation_color = color

def set_column_gap(self, values):
self.column_gap = values

def remove_unused_elements(self):
if self.position == 'only':
for element in self.elements.values():
element.delete()
if isinstance(values, tuple) and len(values) == 2:
self.column_gap = values

def prepare_original(self, elements):
count = 0
Expand Down Expand Up @@ -493,26 +487,26 @@ def add_translations(self, paragraphs):
for eid, element in self.elements.copy().items():
if element.ignored:
self.elements.pop(eid)
self.remove_unused_elements()
for element in self.elements.values():
element.add_translation(
None, self.position, original_color=self.original_color)


class ElementHandlerMerge(ElementHandler):
def prepare_original(self, elements):
raw = ''
txt = ''
oid = 0
count = 0
for element in elements:
for eid, element in enumerate(elements):
self.elements[eid] = element
if element.ignored:
continue
element.set_placeholder(self.placeholder)
if self.column_gap is not None:
element.set_column_gap(self.column_gap)
self.elements[count] = element
code = element.get_raw()
content = element.get_content()
self.base_originals.append(content)
count += 1
content += self.separator
if len(txt + content) < self.merge_length:
raw += code + self.separator
Expand All @@ -535,16 +529,18 @@ def align_paragraph(self, paragraph):
r'\s*%s\s*' % self.placeholder[1].format(r'(0|[^0]\d*)'))
paragraph.original = pattern.sub(
self.separator, paragraph.original)
paragraph.translation = pattern.sub(
self.separator, paragraph.translation)
if paragraph.translation is not None:
paragraph.translation = pattern.sub(
self.separator, paragraph.translation)
# Ensure the translation count matches the actual elements count.
originals = paragraph.original.strip().split(self.separator)
if paragraph.translation is None:
return list(zip(originals, [None] * len(originals)))
pattern = re.compile('%s+' % self.separator)
translation = pattern.sub(self.separator, paragraph.translation)
translations = translation.strip().split(self.separator)
offset = len(originals) - len(translations)
if offset > 0:
# TODO: Merge the original and translation for the left and right.
if self.position in ['left', 'right']:
addition = [None] * offset
translations += addition
Expand All @@ -571,21 +567,23 @@ def add_translations(self, paragraphs):
translations = dict(translations)
for eid, element in self.elements.copy().items():
if element.ignored:
element.add_translation(
None, self.position, original_color=self.original_color)
continue
original = element.get_content()
translation = translations.get(original)
if translation is None:
element.add_translation(
None, self.position, original_color=self.original_color)
continue
element.add_translation(
translation, self.position, self.translation_lang,
self.original_color, self.translation_color)
self.elements.pop(eid)
self.remove_unused_elements()


def get_srt_elements(path):
elements = []

try:
with open(path, 'r', newline=None) as f:
content = f.read().strip()
Expand All @@ -598,7 +596,6 @@ def get_srt_elements(path):
time = lines.pop(0)
content = '\n'.join(lines)
elements.append(SrtElement([number, time, content]))

return elements


Expand Down
4 changes: 2 additions & 2 deletions lib/translation.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,9 +154,9 @@ def _translate_text(self, text, retry=0, interval=0):
retry += 1
interval += 5
# Logging any errors that occur during translation.
text = text[:200] + '...' if len(text) > 200 else text
logged_text = text[:200] + '...' if len(text) > 200 else text
error_message = '{0}\n{2}\n{1}\n{3}\n{1}\n{4}'.format(
sep(), sep('┈'), _('Original: {}').format(text),
sep(), sep('┈'), _('Original: {}').format(logged_text),
_('Status: Failed {} times / Sleeping for {} seconds')
.format(retry, interval), _('Error: {}').format(str(e)))
self.log(error_message, True)
Expand Down
Loading

0 comments on commit 7354b82

Please sign in to comment.