diff --git a/.gitignore b/.gitignore index 22bbba5..5dd5f84 100644 --- a/.gitignore +++ b/.gitignore @@ -173,3 +173,6 @@ cython_debug/ # Built Visual Studio Code Extensions *.vsix +solidsheets_G*.png +solidsheets_G*.jpg +solidsheets_G*.jpeg \ No newline at end of file diff --git a/README.md b/README.md index a8aaeff..82ecda9 100644 --- a/README.md +++ b/README.md @@ -13,12 +13,12 @@ SolidSheets is a lightweight spreadsheet editor written in Python, utilizing the - [x] **File Operations**: Open and save CSV, SSFS (SolidSheets Files) & XLSX (partial). - [x] **Printing**: Print or export tables to PDF format. - [x] **Editing**: Modify tables with options to delete, edit rows, and columns. -- [x] **Formula Support**: Includes functions like avg, sum, min, max, count, similargraph, etc. +- [x] **Formula Support**: Includes functions like avg, sum, min, max, count, similargraph, pointgraph, bargraph, piegraph & histogram. - [x] **Customizable Toolbar**: Tailor the interface to your needs. - [x] **Performance**: Fast and lightweight with threading support. - [x] **User Experience**: Alerts for unsaved changes and supports dark/light mode. - [x] **Real-Time Statistics**: Displays live updates on row count, column count, and cell count. -- [x] **Multilingual**: Available in English, Turkish, German, Spanish, Azerbaijani. +- [x] **Multilingual**: Available in English, Turkish, German, Spanish, Azerbaijani, Uzbek, Chinese, Korean, Japanese, Arabic, Russian, French, Greek & Hebrew. - [x] **Cross-Platform**: Compatible with Windows, macOS, and Linux. - [x] **Efficiency**: Designed for power-saving and utilizes hardware acceleration. diff --git a/SolidSheets.py b/SolidSheets.py index 86cf0d1..99e9af9 100644 --- a/SolidSheets.py +++ b/SolidSheets.py @@ -3,6 +3,7 @@ import locale import os import sys +from datetime import timezone import matplotlib.pyplot as plt import pandas as pd @@ -39,7 +40,7 @@ def __init__(self, parent=None): self.about_label.setText( "
" f"{app.applicationDisplayName()}

" - "A powerful spreadsheet application
" + "Real-time calculation and formula supported spreadsheet editor.
" "Made by Berkay Gediz

" "GNU General Public License v3.0
GNU LESSER GENERAL PUBLIC LICENSE v3.0
Mozilla Public License Version 2.0

Libraries: pandas-dev/pandas, matplotlib/matplotlib, openpyxl/openpyxl, PySide6, psutil

" "OpenGL: ON
" @@ -47,6 +48,74 @@ def __init__(self, parent=None): self.setCentralWidget(self.about_label) +class SS_Help(QMainWindow): + def __init__(self, parent=None): + super(SS_Help, self).__init__(parent) + self.setWindowFlags(Qt.Dialog) + self.setWindowIcon(QIcon("solidsheets_icon.ico")) + self.setWindowModality(Qt.WindowModality.WindowModal) + self.setMinimumSize(480, 360) + + self.setGeometry( + QStyle.alignedRect( + Qt.LeftToRight, + Qt.AlignCenter, + self.size(), + QApplication.primaryScreen().availableGeometry(), + ) + ) + + scroll_area = QScrollArea() + scroll_area.setWidgetResizable(True) + scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) + scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) + + main_widget = QWidget() + layout = QVBoxLayout() + layout.setContentsMargins(0, 20, 0, 0) + + self.help_label = QLabel() + self.help_label.setWordWrap(True) + self.help_label.setTextInteractionFlags(Qt.TextSelectableByMouse) + self.help_label.setTextFormat(Qt.RichText) + + settings = QSettings("berkaygediz", "SolidSheets") + self.help_label.setText( + "" + "

Help

" + "" + f"" + f"" + f"" + f"" + f"" + f"" + f"" + f"" + f"" + f"" + f"" + f"" + f"" + f"" + f"" + "
ShortcutFunction
Ctrl + O{translations[settings.value('appLanguage')]['open_title']}
Ctrl + S{translations[settings.value('appLanguage')]['save_title']}
Ctrl + N{translations[settings.value('appLanguage')]['new_title']}
Ctrl + Shift + S{translations[settings.value('appLanguage')]['save_as_title']}
Ctrl + P{translations[settings.value('appLanguage')]['print_title']}
Ctrl + Q{translations[settings.value('appLanguage')]['exit_title']}
Ctrl + D{translations[settings.value('appLanguage')]['delete_title']}
Ctrl + A{translations[settings.value('appLanguage')]['about_title']}
Ctrl + Z{translations[settings.value('appLanguage')]['undo_title']}
Ctrl + Y{translations[settings.value('appLanguage')]['redo_title']}
Ctrl + L{translations[settings.value('appLanguage')]['darklight_message']}
Ctrl + Shift + R{translations[settings.value('appLanguage')]['add_row_title']}
Ctrl + Shift + C{translations[settings.value('appLanguage')]['add_column_title']}
Ctrl + Shift + T{translations[settings.value('appLanguage')]['add_row_above_title']}
Ctrl + Shift + L{translations[settings.value('appLanguage')]['add_column_left_title']}
" + ) + + layout.addWidget(self.help_label) + main_widget.setLayout(layout) + scroll_area.setWidget(main_widget) + + self.setCentralWidget(scroll_area) + + class SS_UndoCommand(QUndoCommand): def __init__(self, table, old_data, new_data, row, col): super().__init__() @@ -144,7 +213,7 @@ def initUI(self): endtime = datetime.datetime.now() self.status_bar.showMessage( - str((endtime - starttime).total_seconds()) + " ms", 2500 + str((endtime - starttime).total_seconds()) + " sec", 2500 ) def closeEvent(self, event): @@ -408,10 +477,6 @@ def toolbarTranslate(self): self.printAction.setStatusTip( translations[settings.value("appLanguage")]["print_title"] ) - self.exitAction.setText(translations[settings.value("appLanguage")]["exit"]) - self.exitAction.setStatusTip( - translations[settings.value("appLanguage")]["exit_title"] - ) self.deleteAction.setText(translations[settings.value("appLanguage")]["delete"]) self.deleteAction.setStatusTip( translations[settings.value("appLanguage")]["delete_title"] @@ -464,80 +529,27 @@ def toolbarTranslate(self): self.powersaveraction.setStatusTip( translations[settings.value("appLanguage")]["powersaver_message"] ) - self.helpText.setText( - "" - "" - f"" - f"" - f"" - f"" - f"" - f"" - f"" - f"" - f"" - f"" - f"" - "
ShortcutFunction
Ctrl + O{translations[settings.value('appLanguage')]['open_title']}
Ctrl + S{translations[settings.value('appLanguage')]['save_title']}
Ctrl + N{translations[settings.value('appLanguage')]['new_title']}
Ctrl + Shift + S{translations[settings.value('appLanguage')]['save_as_title']}
Ctrl + P{translations[settings.value('appLanguage')]['print_title']}
Ctrl + Q{translations[settings.value('appLanguage')]['exit_title']}
Ctrl + D{translations[settings.value('appLanguage')]['delete_title']}
Ctrl + A{translations[settings.value('appLanguage')]['about_title']}
Ctrl + Z{translations[settings.value('appLanguage')]['undo_title']}
Ctrl + Y{translations[settings.value('appLanguage')]['redo_title']}
Ctrl + L{translations[settings.value('appLanguage')]['darklight_message']}
" - ) def initDock(self): settings = QSettings("berkaygediz", "SolidSheets") settings.sync() - self.dock_widget = QDockWidget( - translations[settings.value("appLanguage")]["help"] + " && Graph Log", self - ) - self.dock_widget.setObjectName("Help & Graph Log") + self.statistics_label = QLabel() + self.dock_widget = QDockWidget("Graph Log", self) + self.dock_widget.setObjectName("Graph Log") self.dock_widget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) - self.addDockWidget(Qt.RightDockWidgetArea, self.dock_widget) self.scrollableArea = QScrollArea() self.GraphLog_QVBox = QVBoxLayout() - self.statistics_label = QLabel() - self.helpText = QLabel() - self.helpText.setWordWrap(True) - self.helpText.setTextInteractionFlags(Qt.TextSelectableByMouse) - self.helpText.setTextFormat(Qt.RichText) - self.helpText.setText( - "" - "" - f"" - f"" - f"" - f"" - f"" - f"" - f"" - f"" - f"" - f"" - f"" - "
ShortcutFunction
Ctrl + N{translations[settings.value('appLanguage')]['new_title']}
Ctrl + O{translations[settings.value('appLanguage')]['open_title']}
Ctrl + S{translations[settings.value('appLanguage')]['save_title']}
Ctrl + Shift + S{translations[settings.value('appLanguage')]['save_as_title']}
Ctrl + P{translations[settings.value('appLanguage')]['print_title']}
Ctrl + Q{translations[settings.value('appLanguage')]['exit_title']}
Ctrl + D{translations[settings.value('appLanguage')]['delete_title']}
Ctrl + A{translations[settings.value('appLanguage')]['about_title']}
Ctrl + Z{translations[settings.value('appLanguage')]['undo_title']}
Ctrl + Y{translations[settings.value('appLanguage')]['redo_title']}
Ctrl + L{translations[settings.value('appLanguage')]['darklight_message']}

NOTE: Graph Log support planned.

" - ) - self.GraphLog_QVBox.addWidget(self.helpText) - self.dock_widget.setObjectName("Help") + self.graph_labels = [] + self.dock_widget.setObjectName("GraphLog") self.dock_widget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) - self.addDockWidget(Qt.RightDockWidgetArea, self.dock_widget) self.dock_widget.setWidget(self.scrollableArea) self.dock_widget.setFeatures( QDockWidget.NoDockWidgetFeatures | QDockWidget.DockWidgetClosable ) - self.dock_widget.setWidget(self.scrollableArea) self.scrollableArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.scrollableArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.scrollableArea.setWidgetResizable(True) @@ -545,6 +557,9 @@ def initDock(self): scroll_contents.setLayout(self.GraphLog_QVBox) self.scrollableArea.setWidget(scroll_contents) + self.dock_widget.setWidget(self.scrollableArea) + self.addDockWidget(Qt.RightDockWidgetArea, self.dock_widget) + def toolbarLabel(self, toolbar, text): label = QLabel(f"{text}") toolbar.addWidget(label) @@ -596,13 +611,6 @@ def initActions(self): QKeySequence.Print, "", ) - self.exitAction = self.createAction( - translations[settings.value("appLanguage")]["exit"], - translations[settings.value("appLanguage")]["exit_message"], - self.close, - QKeySequence.Quit, - "", - ) self.deleteAction = self.createAction( translations[settings.value("appLanguage")]["delete"], translations[settings.value("appLanguage")]["delete_title"], @@ -638,13 +646,23 @@ def initActions(self): QKeySequence("Ctrl+Shift+L"), "", ) + self.hide_dock_widget_action = self.createAction( + "Graph Log", + "Graph Log", + self.SS_toggleDock, + QKeySequence("Ctrl+H"), + "", + ) + + self.helpAction = self.createAction( translations[settings.value("appLanguage")]["help"], translations[settings.value("appLanguage")]["help"], - self.SS_toggleDock, + self.viewHelp, QKeySequence("Ctrl+H"), "", ) + self.aboutAction = self.createAction( translations[settings.value("appLanguage")]["about"], translations[settings.value("appLanguage")]["about_title"], @@ -692,7 +710,6 @@ def initToolbar(self): self.saveAction, self.saveasAction, self.printAction, - self.exitAction, ] ) @@ -758,6 +775,7 @@ def initToolbar(self): self.powersaveraction.setChecked(response_exponential > 1) self.interface_toolbar.addAction(self.powersaveraction) self.interface_toolbar.addAction(self.hide_dock_widget_action) + self.interface_toolbar.addAction(self.helpAction) self.interface_toolbar.addAction(self.aboutAction) self.language_combobox = QComboBox(self) self.language_combobox.setStyleSheet("background-color:#000000; color:#FFFFFF;") @@ -911,11 +929,9 @@ def OpenProcess(self): if self.file_name.endswith(".xlsx"): try: read_file = pd.read_excel(self.file_name) - read_file.to_csv( - f"{self.file_name}-transformed.ssfs", index=None, header=True - ) - # df = pd.DataFrame(pd.read_csv(f"{self.file_name}-transformed.ssfs")) - self.LoadSpreadsheet(f"{self.file_name}-transformed.ssfs") + read_file.to_csv(f"{self.file_name}.ssfs", index=None, header=True) + # df = pd.DataFrame(pd.read_csv(f"{self.file_name}.ssfs")) + self.LoadSpreadsheet(f"{self.file_name}.ssfs") except: QMessageBox.warning(self, None, "Conversion failed.") else: @@ -1000,20 +1016,67 @@ def SaveProcess(self): self.updateTitle() def PrintSpreadsheet(self): - printer = QPrinter(QPrinter.HighResolution) - printer.setOrientation(QPrinter.Landscape) - printer.setPageMargins(0, 0, 0, 0, QPrinter.Millimeter) - printer.setFullPage(True) - printer.setDocName(self.file_name) + settings = QSettings("berkaygediz", "SolidSheets") + selected_ranges = self.SpreadsheetArea.selectedRanges() + + if selected_ranges: + printer = QPrinter(QPrinter.HighResolution) + printer.setPageOrientation(QPageLayout.Orientation.Landscape) + printer.setPageMargins(QMargins(0, 0, 0, 0), QPageLayout.Millimeter) + + printer.setFullPage(True) + printer.setDocName(self.file_name) + + preview_dialog = QPrintPreviewDialog(printer, self) + preview_dialog.paintRequested.connect(self.PrintSelectedCells) + preview_dialog.exec() + else: + QMessageBox.warning( + self, None, translations[settings.value("appLanguage")]["print_warning"] + ) + + def PrintSelectedCells(self, printer): + painter = QPainter(printer) + rect = painter.viewport() + + rect.adjust(20, 20, -20, -20) + + selected_ranges = self.SpreadsheetArea.selectedRanges() + + for range_ in selected_ranges: + for row in range(range_.topRow(), range_.bottomRow() + 1): + for column in range(range_.leftColumn(), range_.rightColumn() + 1): + item = self.SpreadsheetArea.item(row, column) + if item: + cell_width = self.SpreadsheetArea.columnWidth(column) + cell_height = self.SpreadsheetArea.rowHeight(row) + + x = rect.x() + (column - range_.leftColumn()) * cell_width + y = rect.y() + (row - range_.topRow()) * cell_height + + painter.fillRect( + QRect(x, y, cell_width, cell_height), Qt.lightGray + ) + painter.drawRect(QRect(x, y, cell_width, cell_height)) - preview_dialog = QPrintPreviewDialog(printer, self) - preview_dialog.paintRequested.connect(self.SpreadsheetArea.print_) - preview_dialog.exec_() + painter.setPen(Qt.black) + painter.setFont(QFont("Arial", 10)) + painter.drawText( + QRect(x, y, cell_width, cell_height), + Qt.AlignCenter, + item.text(), + ) + + painter.end() def viewAbout(self): self.viewAbout = SS_About() self.viewAbout.show() + def viewHelp(self): + help_window = SS_Help(self) + help_window.show() + def selectedCells(self): selected_cells = self.SpreadsheetArea.selectedRanges() @@ -1034,6 +1097,9 @@ def selectedCells(self): return values def computeFormula(self): + QTimer.singleShot(25, self.processFormula) + + def processFormula(self): try: formulavalue = self.formula_edit.text().strip() formula = formulavalue.split()[0] @@ -1056,55 +1122,55 @@ def computeFormula(self): result = max(operands) elif formula == "min": result = min(operands) - elif formula == "similargraph": - pltgraph = plt.figure() - pltgraph.suptitle("Similar Graph") - plt.plot(operands) - plt.xlabel("X") - plt.ylabel("Y") - plt.grid(True) - plt.show() - result = "Graph" - elif formula == "pointgraph": + elif formula in graphformulas: + start_elapsed = datetime.datetime.now() + result = "graph" pltgraph = plt.figure() - pltgraph.suptitle("Point Graph") - plt.plot(operands, "o") + pltgraph.suptitle(graphformulas[formula]) + if formula == "similargraph": + plt.plot(operands) + elif formula == "pointgraph": + plt.plot(operands, "o") + elif formula == "bargraph": + plt.bar(range(len(operands)), operands) + elif formula == "piegraph": + plt.pie(operands) + elif formula == "histogram": + plt.hist(operands) plt.xlabel("X") plt.ylabel("Y") plt.grid(True) - plt.show() - result = "Graph" - elif formula == "bargraph": - pltgraph = plt.figure() - pltgraph.suptitle("Bar Graph") - plt.bar(range(len(operands)), operands) - plt.xlabel("X") - plt.ylabel("Y") - plt.grid(True) - plt.show() - result = "Graph" - elif formula == "piegraph": - pltgraph = plt.figure() - pltgraph.suptitle("Pie Graph") - plt.pie(operands) - plt.xlabel("X") - plt.ylabel("Y") - plt.grid(True) - plt.show() - result = "Graph" - elif formula == "histogram": - pltgraph = plt.figure() - pltgraph.suptitle("Histogram") - plt.hist(operands) - plt.xlabel("X") - plt.ylabel("Y") - plt.grid(True) - plt.show() + datetime_string = QDateTime.currentDateTimeUtc().toString( + "yyyy-MM-dd HH:mm:ss" + ) + utc_timestamp = ( + datetime.datetime.now(timezone.utc) + .replace(tzinfo=timezone.utc) + .timestamp() + ) + plt.savefig(f"solidsheets_G{utc_timestamp}.png") + plt.close() result = "Graph" + end_elasped = datetime.datetime.now() - if result == "Graph": - pass - else: + graph_label = QLabel() + graph_label.setPixmap(QPixmap(f"solidsheets_G{utc_timestamp}.png")) + graph_label.setScaledContents(True) + self.GraphLog_QVBox.insertWidget(0, graph_label) + + date_label = QLabel( + f"{datetime_string} ({str((end_elasped - start_elapsed).total_seconds()) + " sec"})" + ) + self.GraphLog_QVBox.insertWidget(1, date_label) + + save_button = QPushButton("Save") + save_button.clicked.connect( + lambda: self.saveGraph(f"solidsheets_G{utc_timestamp}.png") + ) + self.GraphLog_QVBox.insertWidget(2, save_button) + self.dock_widget.setVisible(True) + + if result != "Graph": QMessageBox.information(self, "Formula", f"{formula} : {result}") except ValueError as valueerror: @@ -1112,6 +1178,18 @@ def computeFormula(self): except Exception as exception: QMessageBox.critical(self, "Formula", str(exception)) + def saveGraph(self, filepath): + options = QFileDialog.Options() + filename, _ = QFileDialog.getSaveFileName( + self, + "Save Graph", + self.directory + "/" + filepath, + fallbackValues["graphSaveFilter"], + options=options, + ) + if filename: + QPixmap(filepath).save(filename) + def cellDelete(self): for item in self.SpreadsheetArea.selectedItems(): item.setText("") @@ -1138,8 +1216,8 @@ def columnAddLeft(self): app.setWindowIcon(QIcon(os.path.join(applicationPath, "solidsheets_icon.ico"))) app.setOrganizationName("berkaygediz") app.setApplicationName("SolidSheets") - app.setApplicationDisplayName("SolidSheets 2024.10") - app.setApplicationVersion("1.4.2024.10-1") + app.setApplicationDisplayName("SolidSheets 2024.10.2") + app.setApplicationVersion("1.4.2024.10-2") wb = SS_Workbook() wb.show() sys.exit(app.exec()) diff --git a/modules/globals.py b/modules/globals.py index bad905a..9951f19 100644 --- a/modules/globals.py +++ b/modules/globals.py @@ -14,6 +14,7 @@ "adaptiveResponse": 1, "readFilter": "General File (*.ssfs *.xsrc *.csv *.xlsx)", "writeFilter": "SolidSheets Workbook (*.ssfs);;Comma Separated Values (*.csv)", + "graphSaveFilter": "Portable Network Graphics (*.png);;JPEG Image Files (*.jpg; *.jpeg)", } # Locale ID (LCID) @@ -31,6 +32,7 @@ "1049": "Русский", # Russia "1036": "Français", "1032": "Ελληνικά", # Greek + "1037": "Hebrew (עברית)", } formulas = [ @@ -45,6 +47,14 @@ "histogram", ] +graphformulas = { + "similargraph": "Similar Graph", + "pointgraph": "Point Graph", + "bargraph": "Bar Graph", + "piegraph": "Pie Graph", + "histogram": "Histogram", +} + translations = { "1252": { "new": "New", @@ -59,6 +69,7 @@ "delete_title": "Delete file", "print": "Print", "print_title": "Print file", + "print_warning": "Please select a field in the table to print.", "undo": "Undo", "undo_title": "Undo action", "redo": "Redo", @@ -126,6 +137,7 @@ "delete_title": "Dosya sil", "print": "Yazdır", "print_title": "Dosya yazdır", + "print_warning": "Lütfen yazdırmak için tablo içinde bir alan seçin.", "undo": "Geri al", "undo_title": "İşlemi geri al", "redo": "İleri al", @@ -193,6 +205,7 @@ "delete_title": "Fayl sil", "print": "Çap et", "print_title": "Fayl çap et", + "print_warning": "Zəhmət olmasa, çap etmək üçün cədvəldə bir sahə seçin.", "undo": "Geri al", "undo_title": "Əməliyyatı geri al", "redo": "İrəli al", @@ -260,6 +273,7 @@ "delete_title": "Datei löschen", "print": "Drucken", "print_title": "Datei drucken", + "print_warning": "Bitte wählen Sie ein Feld in der Tabelle zum Drucken aus.", "about": "Über", "about_title": "Über dieses Programm", "formula": "Formel", @@ -327,6 +341,7 @@ "delete_title": "Eliminar archivo", "print": "Imprimir", "print_title": "Imprimir archivo", + "print_warning": "Por favor, seleccione un campo en la tabla para imprimir.", "about": "Acerca de", "about_title": "Acerca de este programa", "formula": "Fórmula", @@ -394,6 +409,7 @@ "delete_title": "Faylni o'chirish", "print": "Chop etish", "print_title": "Faylni chop etish", + "print_warning": "Iltimos, chop etish uchun jadvalda bir maydonni tanlang.", "undo": "Bekor qilish", "undo_title": "Amalni bekor qilish", "redo": "Qayta bajarish", @@ -461,6 +477,7 @@ "delete_title": "删除文件", "print": "打印", "print_title": "打印文件", + "print_warning": "请在表格中选择一个字段以打印。", "undo": "撤销", "undo_title": "撤销操作", "redo": "重做", @@ -528,6 +545,7 @@ "delete_title": "파일 삭제", "print": "인쇄", "print_title": "파일 인쇄", + "print_warning": "인쇄할 필드를 테이블에서 선택해 주세요.", "undo": "실행 취소", "undo_title": "작업 취소", "redo": "다시 실행", @@ -595,6 +613,7 @@ "delete_title": "ファイルを削除", "print": "印刷", "print_title": "ファイルを印刷", + "print_warning": "印刷するためにテーブル内のフィールドを選択してください。", "undo": "元に戻す", "undo_title": "操作を元に戻す", "redo": "やり直す", @@ -662,6 +681,7 @@ "delete_title": "حذف الملف", "print": "طباعة", "print_title": "طباعة الملف", + "print_warning": "يرجى اختيار حقل في الجدول للطباعة", "undo": "تراجع", "undo_title": "تراجع عن العملية", "redo": "إعادة", @@ -729,6 +749,7 @@ "delete_title": "Удалить файл", "print": "Печать", "print_title": "Напечатать файл", + "print_warning": "Пожалуйста, выберите поле в таблице для печати.", "undo": "Отменить", "undo_title": "Отменить действие", "redo": "Повторить", @@ -796,6 +817,7 @@ "delete_title": "Supprimer le fichier", "print": "Imprimer", "print_title": "Imprimer le fichier", + "print_warning": "Veuillez sélectionner un champ dans le tableau pour imprimer.", "undo": "Annuler", "undo_title": "Annuler l'opération", "redo": "Rétablir", @@ -863,6 +885,7 @@ "delete_title": "Διαγραφή αρχείου", "print": "Εκτύπωση", "print_title": "Εκτύπωση αρχείου", + "print_warning": "Παρακαλώ επιλέξτε ένα πεδίο στον πίνακα για εκτύπωση.", "undo": "Αναίρεση", "undo_title": "Αναίρεση ενέργειας", "redo": "Επαναφορά", @@ -917,4 +940,72 @@ "powersaver": "Εξοικονόμηση ενέργειας", "powersaver_message": "Υβριδική (Ultra/Standard) λειτουργία εξοικονόμησης ενέργειας.", }, + "1037": { + "new": "חדש", + "new_title": "קובץ חדש", + "open": "פתח", + "open_title": "פתח קובץ", + "save": "שמור", + "save_title": "שמור קובץ", + "save_as": "שמור בשם", + "save_as_title": "שמור קובץ בשם", + "delete": "מחק", + "delete_title": "מחק קובץ", + "print": "הדפס", + "print_title": "הדפס קובץ", + "print_warning": "אנא בחר תחום בטבלה להדפסה.", + "undo": "בטל", + "undo_title": "בטל פעולה", + "redo": "בצע שוב", + "redo_title": "בצע פעולה שוב", + "about": "אודות", + "about_title": "אודות התכנית הזו", + "formula": "נוסחה", + "file": "קובץ", + "edit": "ערוך", + "interface": "ממשק", + "darklight": "כהה/בהיר", + "darklight_message": "מעבר בין מצב כהה למצב בהיר", + "help": "עזרה", + "exit": "יציאה", + "exit_message": "האם אתה בטוח שברצונך לצאת?", + "exit_title": "אישור יציאה", + "statistics_title": "סטטיסטיקות", + "statistics_message1": "שורות: ", + "statistics_message2": "עמודות: ", + "statistics_message3": "תאים נבחרים:", + "statistics_message4": "טווח נבחר:", + "xsrc": "חוברת עבודה של SolidSheets", + "connection_verified": "חיבור מאומת", + "connection_denied": "חיבור נדחה", + "logout": "התנתק", + "syncsettings": "סנכרן הגדרות", + "welcome-title": "ברוך הבא — SolidSheets", + "intro": "כדי להמשיך, התחבר עם חשבון BG Ecosystem שלך או הירשם.", + "wrong_password": "סיסמה שגויה", + "no_account": "אין לך חשבון.", + "email": "דואר אלקטרוני", + "password": "סיסמה", + "login": "התחבר", + "register": "הרשם", + "error": "שגיאה", + "fill_all": "אנא מלא את כל השדות.", + "login_success": "התחברות הצליחה, מפנה...", + "wrong_credentials": "פרטי כניסה שגויים", + "register_success": "הרשמה הצליחה, אנא התחבר.", + "already_registered": "כבר רשום", + "exit": "יציאה", + "compute": "חשב", + "account": "חשבון", + "add_row": "הוסף שורה", + "add_row_title": "הוסף שורה", + "add_column": "הוסף עמודה", + "add_column_title": "הוסף עמודה", + "add_row_above": "הוסף שורה מעל", + "add_row_above_title": "הוסף שורה מעל", + "add_column_left": "הוסף עמודה משמאל", + "add_column_left_title": "הוסף עמודה משמאל", + "powersaver": "חיסכון באנרגיה", + "powersaver_message": "חיסכון באנרגיה היברידי (אולטרה/סטנדרטי).", + }, }