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
"
+ "Shortcut | Function |
"
+ f"Ctrl + O | {translations[settings.value('appLanguage')]['open_title']} |
"
+ f"Ctrl + S | {translations[settings.value('appLanguage')]['save_title']} |
"
+ f"Ctrl + N | {translations[settings.value('appLanguage')]['new_title']} |
"
+ f"Ctrl + Shift + S | {translations[settings.value('appLanguage')]['save_as_title']} |
"
+ f"Ctrl + P | {translations[settings.value('appLanguage')]['print_title']} |
"
+ f"Ctrl + Q | {translations[settings.value('appLanguage')]['exit_title']} |
"
+ f"Ctrl + D | {translations[settings.value('appLanguage')]['delete_title']} |
"
+ f"Ctrl + A | {translations[settings.value('appLanguage')]['about_title']} |
"
+ f"Ctrl + Z | {translations[settings.value('appLanguage')]['undo_title']} |
"
+ f"Ctrl + Y | {translations[settings.value('appLanguage')]['redo_title']} |
"
+ f"Ctrl + L | {translations[settings.value('appLanguage')]['darklight_message']} |
"
+ f"Ctrl + Shift + R | {translations[settings.value('appLanguage')]['add_row_title']} |
"
+ f"Ctrl + Shift + C | {translations[settings.value('appLanguage')]['add_column_title']} |
"
+ f"Ctrl + Shift + T | {translations[settings.value('appLanguage')]['add_row_above_title']} |
"
+ f"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(
- ""
- "Shortcut | Function |
"
- f"Ctrl + O | {translations[settings.value('appLanguage')]['open_title']} |
"
- f"Ctrl + S | {translations[settings.value('appLanguage')]['save_title']} |
"
- f"Ctrl + N | {translations[settings.value('appLanguage')]['new_title']} |
"
- f"Ctrl + Shift + S | {translations[settings.value('appLanguage')]['save_as_title']} |
"
- f"Ctrl + P | {translations[settings.value('appLanguage')]['print_title']} |
"
- f"Ctrl + Q | {translations[settings.value('appLanguage')]['exit_title']} |
"
- f"Ctrl + D | {translations[settings.value('appLanguage')]['delete_title']} |
"
- f"Ctrl + A | {translations[settings.value('appLanguage')]['about_title']} |
"
- f"Ctrl + Z | {translations[settings.value('appLanguage')]['undo_title']} |
"
- f"Ctrl + Y | {translations[settings.value('appLanguage')]['redo_title']} |
"
- f"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(
- ""
- "Shortcut | Function |
"
- f"Ctrl + N | {translations[settings.value('appLanguage')]['new_title']} |
"
- f"Ctrl + O | {translations[settings.value('appLanguage')]['open_title']} |
"
- f"Ctrl + S | {translations[settings.value('appLanguage')]['save_title']} |
"
- f"Ctrl + Shift + S | {translations[settings.value('appLanguage')]['save_as_title']} |
"
- f"Ctrl + P | {translations[settings.value('appLanguage')]['print_title']} |
"
- f"Ctrl + Q | {translations[settings.value('appLanguage')]['exit_title']} |
"
- f"Ctrl + D | {translations[settings.value('appLanguage')]['delete_title']} |
"
- f"Ctrl + A | {translations[settings.value('appLanguage')]['about_title']} |
"
- f"Ctrl + Z | {translations[settings.value('appLanguage')]['undo_title']} |
"
- f"Ctrl + Y | {translations[settings.value('appLanguage')]['redo_title']} |
"
- f"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": "חיסכון באנרגיה היברידי (אולטרה/סטנדרטי).",
+ },
}