diff --git a/lector/__main__.py b/lector/__main__.py
index 59c6de5..4e942cb 100755
--- a/lector/__main__.py
+++ b/lector/__main__.py
@@ -50,6 +50,9 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
super(MainUI, self).__init__()
self.setupUi(self)
+ # Initialize translation function
+ self._translate = QtCore.QCoreApplication.translate
+
# Empty variables that will be infested soon
self.settings = {}
self.thread = None # Background Thread
@@ -103,7 +106,8 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
# Statusbar + Toolbar Visibility
self.distractionFreeToggle.setIcon(self.QImageFactory.get_image('visibility'))
self.distractionFreeToggle.setObjectName('distractionFreeToggle')
- self.distractionFreeToggle.setToolTip('Toggle distraction free mode (Ctrl + D)')
+ self.distractionFreeToggle.setToolTip(
+ self._translate('Main_UI', 'Toggle distraction free mode (Ctrl + D)'))
self.distractionFreeToggle.setAutoRaise(True)
self.distractionFreeToggle.clicked.connect(self.toggle_distraction_free)
self.statusBar.addPermanentWidget(self.distractionFreeToggle)
@@ -198,7 +202,7 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
# The library refresh button on the Library tab
self.reloadLibrary.setIcon(self.QImageFactory.get_image('reload'))
self.reloadLibrary.setObjectName('reloadLibrary')
- self.reloadLibrary.setToolTip('Scan library')
+ self.reloadLibrary.setToolTip(self._translate('Main_UI', 'Scan library'))
self.reloadLibrary.setAutoRaise(True)
self.reloadLibrary.clicked.connect(self.settingsDialog.start_library_scan)
@@ -451,9 +455,11 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
# If a file is added from here, it should not be removed
# from the libary in case of a database refresh
+ dialog_prompt = self._translate('Main_UI', 'Add books to database')
+ ebooks_string = self._translate('Main_UI', 'eBooks')
opened_files = QtWidgets.QFileDialog.getOpenFileNames(
- self, 'Add books to database', self.settings['last_open_path'],
- f'eBooks ({self.available_parsers})')
+ self, dialog_prompt, self.settings['last_open_path'],
+ f'{ebooks_string} ({self.available_parsers})')
if not opened_files[0]:
return
@@ -463,7 +469,7 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
self.settings['last_open_path'] = os.path.dirname(opened_files[0][0])
self.sorterProgress.setVisible(True)
- self.statusMessage.setText('Adding books...')
+ self.statusMessage.setText(self._translate('Main_UI', 'Adding books...'))
self.thread = BackGroundBookAddition(
opened_files[0], self.database_path, False, self)
self.thread.finished.connect(self.move_on)
@@ -527,9 +533,11 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
# Generate a message box to confirm deletion
selected_number = len(selected_indexes)
confirm_deletion = QtWidgets.QMessageBox()
- confirm_deletion.setText('Delete %d book(s)?' % selected_number)
+ deletion_prompt = self._translate(
+ 'Main_UI', f'Delete {selected_number} book(s)?')
+ confirm_deletion.setText(deletion_prompt)
confirm_deletion.setIcon(QtWidgets.QMessageBox.Question)
- confirm_deletion.setWindowTitle('Confirm deletion')
+ confirm_deletion.setWindowTitle(self._translate('Main_UI', 'Confirm deletion'))
confirm_deletion.setStandardButtons(
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
confirm_deletion.buttonClicked.connect(ifcontinue)
@@ -539,7 +547,7 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
def move_on(self):
self.settingsDialog.okButton.setEnabled(True)
self.settingsDialog.okButton.setToolTip(
- 'Save changes and start library scan')
+ self._translate('Main_UI', 'Save changes and start library scan'))
self.reloadLibrary.setEnabled(True)
self.sorterProgress.setVisible(False)
@@ -583,7 +591,8 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
# Making the proxy model available doesn't affect
# memory utilization at all. Bleh.
self.statusMessage.setText(
- str(self.lib_ref.item_proxy_model.rowCount()) + ' Books')
+ str(self.lib_ref.item_proxy_model.rowCount()) +
+ self._translate('Main_UI', ' Books'))
else:
if self.settings['show_bars']:
@@ -1009,19 +1018,24 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
context_menu = QtWidgets.QMenu()
openAction = context_menu.addAction(
- self.QImageFactory.get_image('view-readermode'), 'Start reading')
+ self.QImageFactory.get_image('view-readermode'),
+ self._translate('Main_UI', 'Start reading'))
editAction = None
if len(selected_indexes) == 1:
editAction = context_menu.addAction(
- self.QImageFactory.get_image('edit-rename'), 'Edit')
+ self.QImageFactory.get_image('edit-rename'),
+ self._translate('Main_UI', 'Edit'))
deleteAction = context_menu.addAction(
- self.QImageFactory.get_image('trash-empty'), 'Delete')
+ self.QImageFactory.get_image('trash-empty'),
+ self._translate('Main_UI', 'Delete'))
readAction = context_menu.addAction(
- QtGui.QIcon(':/images/checkmark.svg'), 'Mark read')
+ QtGui.QIcon(':/images/checkmark.svg'),
+ self._translate('Main_UI', 'Mark read'))
unreadAction = context_menu.addAction(
- QtGui.QIcon(':/images/xmark.svg'), 'Mark unread')
+ QtGui.QIcon(':/images/xmark.svg'),
+ self._translate('Main_UI', 'Mark unread'))
action = context_menu.exec_(self.sender().mapToGlobal(position))
@@ -1118,7 +1132,7 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow):
checked = [i for i in directory_list if i[3] == QtCore.Qt.Checked]
filter_list = list(map(generate_name, checked))
filter_list.sort()
- filter_list.append('Manually Added')
+ filter_list.append(self._translate('Main_UI', 'Manually Added'))
filter_actions = [QtWidgets.QAction(i, self.libraryFilterMenu) for i in filter_list]
filter_all = QtWidgets.QAction('All', self.libraryFilterMenu)
@@ -1211,6 +1225,14 @@ def main():
app = QtWidgets.QApplication(sys.argv)
app.setApplicationName('Lector') # This is needed for QStandardPaths
# and my own hubris
+
+ # Internationalization support
+ translator = QtCore.QTranslator()
+ translation_file = f':/translations/Lector_{QtCore.QLocale.system().name()}.qm'
+ print(f'Localization: {QtCore.QLocale.system().name()}')
+ translator.load(translation_file)
+ app.installTranslator(translator)
+
form = MainUI()
form.show()
form.resizeEvent()
diff --git a/lector/definitionsdialog.py b/lector/definitionsdialog.py
index bd5b5d3..6f6e043 100644
--- a/lector/definitionsdialog.py
+++ b/lector/definitionsdialog.py
@@ -26,8 +26,10 @@ class DefinitionsUI(QtWidgets.QDialog, definitions.Ui_Dialog):
def __init__(self, parent):
super(DefinitionsUI, self).__init__()
self.setupUi(self)
+ self._translate = QtCore.QCoreApplication.translate
self.parent = parent
+ self.previous_position = None
self.setWindowFlags(
QtCore.Qt.Popup |
@@ -109,8 +111,9 @@ class DefinitionsUI(QtWidgets.QDialog, definitions.Ui_Dialog):
html_string += f'
{word}
\n'
if nothing_found:
+ nope_string = self._translate('DefinitionsUI', 'No definitions found in')
language = self.parent.settings['dictionary_language'].upper()
- html_string += f'No definitions found in {language}
\n'
+ html_string += f'{nope_string} {language}
\n'
else:
# Word root
html_string += f'Word root: {word_root}
\n'
diff --git a/lector/library.py b/lector/library.py
index da58235..9b958e3 100644
--- a/lector/library.py
+++ b/lector/library.py
@@ -31,6 +31,7 @@ class Library:
self.view_model = None
self.item_proxy_model = None
self.table_proxy_model = None
+ self._translate = QtCore.QCoreApplication.translate
def generate_model(self, mode, parsed_books=None, is_database_ready=True):
if mode == 'build':
@@ -117,7 +118,9 @@ class Library:
'last_accessed': last_accessed,
'file_exists': file_exists}
- tooltip_string = title + '\nAuthor: ' + author + '\nYear: ' + str(year)
+ author_string = self._translate('Library', 'Author')
+ year_string = self._translate('Library', 'Year')
+ tooltip_string = f'{title} \n{author_string}: {author} \n{year_string}: {str(year)}'
# Additional data can be set using an incrementing
# QtCore.Qt.UserRole
@@ -251,7 +254,8 @@ class Library:
return directory_name, directory_tags
- return 'manually added', None
+ added_string = self._translate('Library', 'manually added')
+ return added_string.lower(), None
# Generate tags for the QStandardItemModel
for i in range(self.view_model.rowCount()):
diff --git a/lector/metadatadialog.py b/lector/metadatadialog.py
index 70d1731..ad190f9 100644
--- a/lector/metadatadialog.py
+++ b/lector/metadatadialog.py
@@ -19,15 +19,16 @@
from PyQt5 import QtWidgets, QtCore, QtGui
from lector import database
+from lector.widgets import PliantQGraphicsScene
from resources import metadata
-from lector.widgets import PliantQGraphicsScene
class MetadataUI(QtWidgets.QDialog, metadata.Ui_Dialog):
def __init__(self, parent):
super(MetadataUI, self).__init__()
self.setupUi(self)
+ self._translate = QtCore.QCoreApplication.translate
self.setWindowFlags(
QtCore.Qt.Popup |
@@ -97,7 +98,9 @@ class MetadataUI(QtWidgets.QDialog, metadata.Ui_Dialog):
except ValueError:
year = self.book_year
- tooltip_string = title + '\nAuthor: ' + author + '\nYear: ' + str(year)
+ author_string = self._translate('MetadataUI', 'Author')
+ year_string = self._translate('MetadataUI', 'Year')
+ tooltip_string = f'{title} \n{author_string}: {author} \n{year_string}: {str(year)}'
book_item.setData(title, QtCore.Qt.UserRole)
book_item.setData(author, QtCore.Qt.UserRole + 1)
diff --git a/lector/models.py b/lector/models.py
index 074ae68..4f80fcd 100644
--- a/lector/models.py
+++ b/lector/models.py
@@ -27,7 +27,7 @@ class BookmarkProxyModel(QtCore.QSortFilterProxyModel):
def __init__(self, parent=None):
super(BookmarkProxyModel, self).__init__(parent)
self.parent = parent
- self.filter_string = None
+ self.filter_text = None
def setFilterParams(self, filter_text):
self.filter_text = filter_text
@@ -68,8 +68,18 @@ class ItemProxyModel(QtCore.QSortFilterProxyModel):
class TableProxyModel(QtCore.QSortFilterProxyModel):
def __init__(self, temp_dir, parent=None):
super(TableProxyModel, self).__init__(parent)
+
+ self._translate = QtCore.QCoreApplication.translate
+
+ title_string = self._translate('TableProxyModel', 'Title')
+ author_string = self._translate('TableProxyModel', 'Author')
+ year_string = self._translate('TableProxyModel', 'Year')
+ lastread_string = self._translate('TableProxyModel', 'Last Read')
+ tags_string = self._translate('TableProxyModel', 'Tags')
self.header_data = [
- None, 'Title', 'Author', 'Year', 'Last Read', '%', 'Tags']
+ None, title_string, author_string,
+ year_string, lastread_string, '%', tags_string]
+
self.temp_dir = temp_dir
self.filter_text = None
self.active_library_filters = None
diff --git a/lector/settingsdialog.py b/lector/settingsdialog.py
index 510409b..27f5e43 100644
--- a/lector/settingsdialog.py
+++ b/lector/settingsdialog.py
@@ -34,6 +34,7 @@ class SettingsUI(QtWidgets.QDialog, settingswindow.Ui_Dialog):
def __init__(self, parent):
super(SettingsUI, self).__init__()
self.setupUi(self)
+ self._translate = QtCore.QCoreApplication.translate
self.parent = parent
self.database_path = self.parent.database_path
@@ -53,7 +54,11 @@ class SettingsUI(QtWidgets.QDialog, settingswindow.Ui_Dialog):
self.filesystem_model = None
self.tag_data_copy = None
- languages = ['English', 'Spanish', 'Hindi']
+ english_string = self._translate('SettingsUI', 'English')
+ spanish_string = self._translate('SettingsUI', 'Spanish')
+ hindi_string = self._translate('SettingsUI', 'Hindi')
+ languages = [english_string, spanish_string, hindi_string]
+
self.languageBox.addItems(languages)
current_language = self.parent.settings['dictionary_language']
if current_language == 'en':
@@ -64,7 +69,8 @@ class SettingsUI(QtWidgets.QDialog, settingswindow.Ui_Dialog):
self.languageBox.setCurrentIndex(2)
self.languageBox.activated.connect(self.change_dictionary_language)
- self.okButton.setToolTip('Save changes and start library scan')
+ self.okButton.setToolTip(
+ self._translate('SettingsUI', 'Save changes and start library scan'))
self.okButton.clicked.connect(self.start_library_scan)
self.cancelButton.clicked.connect(self.cancel_pressed)
self.aboutButton.clicked.connect(self.about_pressed)
@@ -206,10 +212,12 @@ class SettingsUI(QtWidgets.QDialog, settingswindow.Ui_Dialog):
# Disallow rechecking until the first check completes
self.okButton.setEnabled(False)
self.parent.reloadLibrary.setEnabled(False)
- self.okButton.setToolTip('Library scan in progress...')
+ self.okButton.setToolTip(
+ self._translate('SettingsUI', 'Library scan in progress...'))
# Traverse directories looking for files
- self.parent.statusMessage.setText('Checking library folders')
+ self.parent.statusMessage.setText(
+ self._translate('SettingsUI', 'Checking library folders'))
self.thread = BackGroundBookSearch(data_pairs, self)
self.thread.finished.connect(self.finished_iterating)
self.thread.start()
@@ -222,7 +230,8 @@ class SettingsUI(QtWidgets.QDialog, settingswindow.Ui_Dialog):
# Hey, messaging is important, okay?
self.parent.sorterProgress.setVisible(True)
- self.parent.statusMessage.setText('Parsing files')
+ self.parent.statusMessage.setText(
+ self._translate('SettingsUI', 'Parsing files'))
# We now create a new thread to put those files into the database
self.thread = BackGroundBookAddition(
diff --git a/lector/toolbars.py b/lector/toolbars.py
index 43d7dc5..284ee73 100644
--- a/lector/toolbars.py
+++ b/lector/toolbars.py
@@ -17,12 +17,13 @@
# along with this program. If not, see .
-from PyQt5 import QtWidgets, QtGui, QtCore
+from PyQt5 import QtWidgets, QtCore
class BookToolBar(QtWidgets.QToolBar):
def __init__(self, parent=None):
super(BookToolBar, self).__init__(parent)
+ self._translate = QtCore.QCoreApplication.translate
# Spacer
spacer = QtWidgets.QWidget()
@@ -36,27 +37,32 @@ class BookToolBar(QtWidgets.QToolBar):
self.setIconSize(QtCore.QSize(22, 22))
self.setFloatable(False)
self.setContextMenuPolicy(QtCore.Qt.PreventContextMenu)
- self.setObjectName("LibraryToolBar")
+ self.setObjectName('LibraryToolBar')
image_factory = self.window().QImageFactory
# Buttons
self.fontButton = QtWidgets.QAction(
image_factory.get_image('gtk-select-font'),
- 'View settings', self)
+ self._translate('BookToolBar', 'View settings'),
+ self)
self.fullscreenButton = QtWidgets.QAction(
image_factory.get_image('view-fullscreen'),
- 'Fullscreen', self)
+ self._translate('BookToolBar', 'Fullscreen'),
+ self)
self.addBookmarkButton = QtWidgets.QAction(
image_factory.get_image('bookmark-new'),
- 'Add bookmark', self)
+ self._translate('BookToolBar', 'Add bookmark'),
+ self)
self.bookmarkButton = QtWidgets.QAction(
image_factory.get_image('bookmarks'),
- 'Bookmarks', self)
+ self._translate('BookToolBar', 'Bookmarks'),
+ self)
self.bookmarkButton.setObjectName('bookmarkButton')
self.resetProfile = QtWidgets.QAction(
image_factory.get_image('reload'),
- 'Reset profile', self)
+ self._translate('BookToolBar', 'Reset profile'),
+ self)
# Add buttons
self.addAction(self.fontButton)
@@ -74,49 +80,57 @@ class BookToolBar(QtWidgets.QToolBar):
font_sizes.extend(['56', '64', '72'])
self.fontSizeBox = QtWidgets.QComboBox(self)
self.fontSizeBox.setObjectName('fontSizeBox')
- self.fontSizeBox.setToolTip('Font size')
+ self.fontSizeBox.setToolTip(self._translate('BookToolBar', 'Font size'))
self.fontSizeBox.addItems(font_sizes)
self.fontSizeBox.setEditable(True)
self.paddingUp = QtWidgets.QAction(
image_factory.get_image('format-indent-less'),
- 'Increase padding', self)
+ self._translate('BookToolBar', 'Increase padding'),
+ self)
self.paddingUp.setObjectName('paddingUp')
self.paddingDown = QtWidgets.QAction(
image_factory.get_image('format-indent-more'),
- 'Decrease padding', self)
+ self._translate('BookToolBar', 'Decrease padding'),
+ self)
self.paddingDown.setObjectName('paddingDown')
self.lineSpacingUp = QtWidgets.QAction(
image_factory.get_image('format-line-spacing-triple'),
- 'Increase line spacing', self)
+ self._translate('BookToolBar', 'Increase line spacing'),
+ self)
self.lineSpacingUp.setObjectName('lineSpacingUp')
self.lineSpacingDown = QtWidgets.QAction(
image_factory.get_image('format-line-spacing-double'),
- 'Decrease line spacing', self)
+ self._translate('BookToolBar', 'Decrease line spacing'),
+ self)
self.lineSpacingDown.setObjectName('lineSpacingDown')
self.alignLeft = QtWidgets.QAction(
image_factory.get_image('format-justify-left'),
- 'Left align text', self)
+ self._translate('BookToolBar', 'Left align text'),
+ self)
self.alignLeft.setObjectName('alignLeft')
self.alignLeft.setCheckable(True)
self.alignRight = QtWidgets.QAction(
image_factory.get_image('format-justify-right'),
- 'Right align text', self)
+ self._translate('BookToolBar', 'Right align text'),
+ self)
self.alignRight.setObjectName('alignRight')
self.alignRight.setCheckable(True)
self.alignCenter = QtWidgets.QAction(
image_factory.get_image('format-justify-center'),
- 'Center align text', self)
+ self._translate('BookToolBar', 'Center align text'),
+ self)
self.alignCenter.setObjectName('alignCenter')
self.alignCenter.setCheckable(True)
self.alignJustify = QtWidgets.QAction(
image_factory.get_image('format-justify-fill'),
- 'Justify text', self)
+ self._translate('BookToolBar', 'Justify text'),
+ self)
self.alignJustify.setObjectName('alignJustify')
self.alignJustify.setCheckable(True)
@@ -135,7 +149,7 @@ class BookToolBar(QtWidgets.QToolBar):
self.colorBoxFG.setObjectName('fgColor')
self.colorBoxFG.setToolTip('Text color')
self.colorBoxBG = FixedPushButton(self)
- self.colorBoxBG.setToolTip('Background color')
+ self.colorBoxBG.setToolTip(self._translate('BookToolBar', 'Background color'))
self.colorBoxBG.setObjectName('bgColor')
profiles = ['Profile 1', 'Profile 2', 'Profile 3']
@@ -187,31 +201,36 @@ class BookToolBar(QtWidgets.QToolBar):
# Comic view modification
self.zoomIn = QtWidgets.QAction(
image_factory.get_image('zoom-in'),
- 'Zoom in', self)
+ self._translate('BookToolBar', 'Zoom in'),
+ self)
self.zoomIn.setObjectName('zoomIn')
self.zoomOut = QtWidgets.QAction(
image_factory.get_image('zoom-out'),
- 'Zoom Out', self)
+ self._translate('BookToolBar', 'Zoom Out'),
+ self)
self.zoomOut.setObjectName('zoomOut')
self.fitWidth = QtWidgets.QAction(
image_factory.get_image('zoom-fit-width'),
- 'Fit Width', self)
+ self._translate('BookToolBar', 'Fit Width'),
+ self)
self.fitWidth.setObjectName('fitWidth')
self.fitWidth.setCheckable(True)
self.bestFit = QtWidgets.QAction(
image_factory.get_image('zoom-fit-best'),
- 'Best Fit', self)
+ self._translate('BookToolBar', 'Best Fit'),
+ self)
self.bestFit.setObjectName('bestFit')
self.bestFit.setCheckable(True)
self.originalSize = QtWidgets.QAction(
image_factory.get_image('zoom-original'),
- 'Original size', self)
+ self._translate('BookToolBar', 'Original size'),
+ self)
self.originalSize.setObjectName('originalSize')
self.originalSize.setCheckable(True)
self.comicBGColor = FixedPushButton(self)
- self.comicBGColor.setToolTip('Background color')
+ self.comicBGColor.setToolTip(self._translate('BookToolBar', 'Background color'))
self.comicBGColor.setObjectName('comicBGColor')
self.comicSeparator1 = self.addSeparator()
@@ -239,7 +258,7 @@ class BookToolBar(QtWidgets.QToolBar):
# Other booktoolbar widgets
self.searchBar = FixedLineEdit(self)
self.searchBar.setPlaceholderText(
- 'Search...')
+ self._translate('BookToolBar', 'Search...'))
self.searchBar.setSizePolicy(sizePolicy)
self.searchBar.setContentsMargins(10, 0, 0, 0)
self.searchBar.setObjectName('searchBar')
@@ -247,7 +266,8 @@ class BookToolBar(QtWidgets.QToolBar):
# Sorter
self.tocBox = FixedComboBox(self)
self.tocBox.setObjectName('sortingBox')
- self.tocBox.setToolTip('Table of Contents')
+ self.tocBox.setToolTip(
+ self._translate('BookToolBar', 'Table of Contents'))
# All of these will be put after the spacer
# This means that the buttons in the left side of
@@ -311,6 +331,7 @@ class BookToolBar(QtWidgets.QToolBar):
class LibraryToolBar(QtWidgets.QToolBar):
def __init__(self, parent=None):
super(LibraryToolBar, self).__init__(parent)
+ self._translate = QtCore.QCoreApplication.translate
spacer = QtWidgets.QWidget()
spacer.setSizePolicy(
@@ -326,27 +347,41 @@ class LibraryToolBar(QtWidgets.QToolBar):
# Buttons
self.addButton = QtWidgets.QAction(
- image_factory.get_image('add'), 'Add book', self)
+ image_factory.get_image('add'),
+ self._translate('LibraryToolBar', 'Add book'),
+ self)
self.deleteButton = QtWidgets.QAction(
- image_factory.get_image('remove'), 'Delete book', self)
+ image_factory.get_image('remove'),
+ self._translate('LibraryToolBar', 'Delete book'),
+ self)
self.colorButton = QtWidgets.QAction(
- image_factory.get_image('color-picker'), 'Library background color', self)
+ image_factory.get_image('color-picker'),
+ self._translate('LibraryToolBar', 'Library background color'),
+ self)
self.colorButton.setObjectName('libraryBackground')
self.settingsButton = QtWidgets.QAction(
- image_factory.get_image('settings'), 'Settings', self)
+ image_factory.get_image('settings'),
+ self._translate('LibraryToolBar', 'Settings'),
+ self)
self.settingsButton.setCheckable(True)
self.coverViewButton = QtWidgets.QAction(
- image_factory.get_image('view-grid'), 'View as covers', self)
+ image_factory.get_image('view-grid'),
+ self._translate('LibraryToolBar', 'View as covers'),
+ self)
self.coverViewButton.setCheckable(True)
self.tableViewButton = QtWidgets.QAction(
- image_factory.get_image('table'), 'View as table', self)
+ image_factory.get_image('table'),
+ self._translate('LibraryToolBar', 'View as table'),
+ self)
self.tableViewButton.setCheckable(True)
self.libraryFilterButton = QtWidgets.QToolButton(self)
self.libraryFilterButton.setIcon(image_factory.get_image('view-readermode'))
- self.libraryFilterButton.setText('Filter library')
- self.libraryFilterButton.setToolTip('Filter library')
+ self.libraryFilterButton.setText(
+ self._translate('LibraryToolBar', 'Filter library'))
+ self.libraryFilterButton.setToolTip(
+ self._translate('LibraryToolBar', 'Filter library'))
# Auto unchecks the other QToolButton in case of clicking
self.viewButtons = QtWidgets.QActionGroup(self)
@@ -373,19 +408,26 @@ class LibraryToolBar(QtWidgets.QToolBar):
self.searchBar = FixedLineEdit(self)
self.searchBar.setClearButtonEnabled(True)
self.searchBar.setPlaceholderText(
- 'Search for Title, Author, Tags...')
+ self._translate('LibraryToolBar', 'Search for Title, Author, Tags...'))
self.searchBar.setSizePolicy(sizePolicy)
self.searchBar.setContentsMargins(10, 0, 0, 0)
self.searchBar.setObjectName('searchBar')
# Sorter
- sorting_choices = ['Title', 'Author', 'Year', 'Newest', 'Last read']
+ title_string = self._translate('TableProxyModel', 'Title')
+ author_string = self._translate('TableProxyModel', 'Author')
+ year_string = self._translate('TableProxyModel', 'Year')
+ newest_string = self._translate('TableProxyModel', 'Newest')
+ lastread_string = self._translate('TableProxyModel', 'Last Read')
+ sorting_choices = [
+ title_string, author_string, year_string, newest_string, lastread_string]
+
self.sortingBox = FixedComboBox(self)
self.sortingBox.addItems(sorting_choices)
self.sortingBox.setObjectName('sortingBox')
self.sortingBox.setSizePolicy(sizePolicy)
self.sortingBox.setMinimumContentsLength(10)
- self.sortingBox.setToolTip('Sort by')
+ self.sortingBox.setToolTip(self._translate('LibraryToolBar', 'Sort by'))
# Add widgets
self.addWidget(spacer)
diff --git a/lector/widgets.py b/lector/widgets.py
index 337c04c..90c2c46 100644
--- a/lector/widgets.py
+++ b/lector/widgets.py
@@ -43,6 +43,8 @@ from lector.sorter import resize_image
class Tab(QtWidgets.QWidget):
def __init__(self, metadata, parent=None):
super(Tab, self).__init__(parent)
+ self._translate = QtCore.QCoreApplication.translate
+
self.parent = parent
self.metadata = metadata # Save progress data into this dictionary
self.are_we_doing_images_only = self.metadata['images_only']
@@ -118,7 +120,7 @@ class Tab(QtWidgets.QWidget):
# Create the dock widget for context specific display
self.dockWidget = PliantDockWidget(self)
- self.dockWidget.setWindowTitle('Bookmarks')
+ self.dockWidget.setWindowTitle(self._translate('Tab', 'Bookmarks'))
self.dockWidget.setFeatures(QtWidgets.QDockWidget.DockWidgetClosable)
self.dockWidget.setFloating(False)
self.dockWidget.hide()
@@ -373,7 +375,7 @@ class Tab(QtWidgets.QWidget):
# Start dockListView.edit(index) when something new is added
identifier = uuid.uuid4().hex[:10]
- description = 'New bookmark'
+ description = self._translate('Tab', 'New bookmark')
if self.are_we_doing_images_only:
chapter = self.metadata['position']['current_chapter']
@@ -446,9 +448,11 @@ class Tab(QtWidgets.QWidget):
bookmark_menu = QtWidgets.QMenu()
editAction = bookmark_menu.addAction(
- self.main_window.QImageFactory.get_image('edit-rename'), 'Edit')
+ self.main_window.QImageFactory.get_image('edit-rename'),
+ self._translate('Tab', 'Edit'))
deleteAction = bookmark_menu.addAction(
- self.main_window.QImageFactory.get_image('trash-empty'), 'Delete')
+ self.main_window.QImageFactory.get_image('trash-empty'),
+ self._translate('Tab', 'Delete'))
action = bookmark_menu.exec_(
self.dockListView.mapToGlobal(position))
@@ -482,6 +486,7 @@ class Tab(QtWidgets.QWidget):
class PliantQGraphicsView(QtWidgets.QGraphicsView):
def __init__(self, filepath, main_window, parent=None):
super(PliantQGraphicsView, self).__init__(parent)
+ self._translate = QtCore.QCoreApplication.translate
self.parent = parent
self.main_window = main_window
@@ -677,31 +682,31 @@ class PliantQGraphicsView(QtWidgets.QGraphicsView):
saveAction = contextMenu.addAction(
self.main_window.QImageFactory.get_image('filesaveas'),
- 'Save page as...')
+ self._translate('PliantQGraphicsView', 'Save page as...'))
zoominAction = viewSubMenu.addAction(
self.main_window.QImageFactory.get_image('zoom-in'),
- 'Zoom in (+)')
+ self._translate('PliantQGraphicsView', 'Zoom in (+)'))
zoomoutAction = viewSubMenu.addAction(
self.main_window.QImageFactory.get_image('zoom-out'),
- 'Zoom out (-)')
+ self._translate('PliantQGraphicsView', 'Zoom out (-)'))
fitWidthAction = viewSubMenu.addAction(
self.main_window.QImageFactory.get_image('zoom-fit-width'),
- 'Fit width (W)')
+ self._translate('PliantQGraphicsView', 'Fit width (W)'))
bestFitAction = viewSubMenu.addAction(
self.main_window.QImageFactory.get_image('zoom-fit-best'),
- 'Best fit (B)')
+ self._translate('PliantQGraphicsView', 'Best fit (B)'))
originalSizeAction = viewSubMenu.addAction(
self.main_window.QImageFactory.get_image('zoom-original'),
- 'Original size (O)')
+ self._translate('PliantQGraphicsView', 'Original size (O)'))
toggleAction = contextMenu.addAction(
self.main_window.QImageFactory.get_image('visibility'),
- 'Toggle distraction free mode')
+ self._translate('PliantQGraphicsView', 'Toggle distraction free mode'))
action = contextMenu.exec_(self.sender().mapToGlobal(position))
@@ -730,18 +735,23 @@ class PliantQGraphicsView(QtWidgets.QGraphicsView):
class PliantQTextBrowser(QtWidgets.QTextBrowser):
def __init__(self, main_window, parent=None):
super(PliantQTextBrowser, self).__init__(parent)
- self.main_window = main_window
+ self._translate = QtCore.QCoreApplication.translate
+
self.parent = parent
- self.ignore_wheel_event = False
- self.ignore_wheel_event_number = 0
+ self.main_window = main_window
+
self.common_functions = PliantWidgetsCommonFunctions(
self, self.main_window)
- self.verticalScrollBar().sliderMoved.connect(self.record_scroll_position)
- self.setMouseTracking(True)
+
self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.customContextMenuRequested.connect(
self.generate_textbrowser_context_menu)
+
+ self.setMouseTracking(True)
self.viewport().setCursor(QtCore.Qt.IBeamCursor)
+ self.verticalScrollBar().sliderMoved.connect(self.record_scroll_position)
+ self.ignore_wheel_event = False
+ self.ignore_wheel_event_number = 0
def wheelEvent(self, event):
self.record_scroll_position()
@@ -794,17 +804,18 @@ class PliantQTextBrowser(QtWidgets.QTextBrowser):
defineAction = 'Caesar si viveret, ad remum dareris'
if selected_word and selected_word != '':
selected_word = selected_word.split()[0]
+ define_string = self._translate('PliantQTextBrowser', 'Define')
defineAction = context_menu.addAction(
self.main_window.QImageFactory.get_image('view-readermode'),
- f'Define "{selected_word}"')
+ f'{define_string} "{selected_word}"')
searchAction = context_menu.addAction(
self.main_window.QImageFactory.get_image('search'),
- 'Search')
+ self._translate('PliantQTextBrowser', 'Search'))
toggleAction = context_menu.addAction(
self.main_window.QImageFactory.get_image('visibility'),
- 'Toggle distraction free mode')
+ self._translate('PliantQTextBrowser', 'Toggle distraction free mode'))
action = context_menu.exec_(self.sender().mapToGlobal(position))
@@ -877,7 +888,8 @@ class PliantWidgetsCommonFunctions():
if (current_toc_index < max_toc_index and direction == 1) or (
current_toc_index > 0 and direction == -1):
- self.main_window.bookToolBar.tocBox.setCurrentIndex(current_toc_index + direction)
+ self.main_window.bookToolBar.tocBox.setCurrentIndex(
+ current_toc_index + direction)
# Set page position depending on if the chapter number is increasing or decreasing
if direction == 1 or was_button_pressed:
@@ -906,14 +918,17 @@ class PliantQGraphicsScene(QtWidgets.QGraphicsScene):
def __init__(self, parent=None):
super(PliantQGraphicsScene, self).__init__(parent)
self.parent = parent
+ self._translate = QtCore.QCoreApplication.translate
def mouseReleaseEvent(self, event):
self.parent.previous_position = self.parent.pos()
image_files = '*.jpg *.png'
+ dialog_prompt = self._translate('PliantQGraphicsScene', 'Select new cover')
+ images_string = self._translate('PliantQGraphicsScene', 'Images')
new_cover = QtWidgets.QFileDialog.getOpenFileName(
- None, 'Select new cover', self.parent.parent.settings['last_open_path'],
- f'Images ({image_files})')[0]
+ None, dialog_prompt, self.parent.parent.settings['last_open_path'],
+ f'{images_string} ({image_files})')[0]
if not new_cover:
self.parent.show()