From 753c47f02537d3d4d1a0d23147125eac3a8c72eb Mon Sep 17 00:00:00 2001 From: berkaygediz <121058050+berkaygediz@users.noreply.github.com> Date: Sat, 17 Aug 2024 21:43:12 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=8D=B1=20PySide6=20upgrade,=20threading?= =?UTF-8?q?=20improvements,=20language=20detection,=20theme=20palette=20fi?= =?UTF-8?q?xes,=20Korean/Japanese/Russian/French/Greek=20language=20suppor?= =?UTF-8?q?t,=20bug=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RichSpan.py | 120 ++++++--- modules/translations.py | 523 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 604 insertions(+), 39 deletions(-) diff --git a/RichSpan.py b/RichSpan.py index 14d994d..7d1b5aa 100644 --- a/RichSpan.py +++ b/RichSpan.py @@ -8,11 +8,13 @@ import mammoth import psutil import qtawesome as qta -from PyQt5.QtCore import * -from PyQt5.QtGui import * -from PyQt5.QtOpenGL import * -from PyQt5.QtPrintSupport import * -from PyQt5.QtWidgets import * +from langdetect import DetectorFactory, detect +from PySide6.QtCore import * +from PySide6.QtGui import * +from PySide6.QtOpenGL import * +from PySide6.QtOpenGLWidgets import * +from PySide6.QtPrintSupport import * +from PySide6.QtWidgets import * from modules.translations import * @@ -41,19 +43,24 @@ class RS_Threading(QThread): - update_signal = pyqtSignal() + update_signal = Signal() def __init__(self, adaptiveResponse, parent=None): super(RS_Threading, self).__init__(parent) self.adaptiveResponse = float(adaptiveResponse) self.running = False + self.mutex = QMutex() def run(self): if not self.running: + self.mutex.lock() self.running = True + self.mutex.unlock() time.sleep(0.15 * self.adaptiveResponse) self.update_signal.emit() + self.mutex.lock() self.running = False + self.mutex.unlock() class RS_About(QMainWindow): @@ -67,7 +74,7 @@ def __init__(self, parent=None): Qt.LeftToRight, Qt.AlignCenter, self.size(), - QApplication.desktop().availableGeometry(), + QApplication.primaryScreen().availableGeometry(), ) ) self.about_label = QLabel() @@ -96,10 +103,11 @@ def __init__(self, parent=None): if settings.value("adaptiveResponse") == None: settings.setValue("adaptiveResponse", 1) settings.sync() - self.setWindowIcon(QIcon("richspan_icon.png")) + self.setWindowIcon(QIcon("richspan_icon.ico")) self.setWindowModality(Qt.ApplicationModal) + self.setMinimumSize(768, 540) - centralWidget = QGLWidget(self) + centralWidget = QOpenGLWidget(self) layout = QVBoxLayout(centralWidget) self.hardwareAcceleration = QOpenGLWidget() @@ -129,16 +137,19 @@ def __init__(self, parent=None): self.rs_area.setDisabled(True) self.RS_setupActions() self.RS_setupToolbar() + self.adaptiveResponse = settings.value("adaptiveResponse") self.setPalette(self.light_theme) - self.rs_area.textChanged.connect(self.richspan_thread.start) + self.text_changed_timer = QTimer() + self.text_changed_timer.setInterval(150 * self.adaptiveResponse) + self.text_changed_timer.timeout.connect(self.RS_threadStart) + self.rs_area.textChanged.connect(self.RS_textChanged) + self.thread_running = False self.showMaximized() self.rs_area.setFocus() self.rs_area.setAcceptRichText(True) - self.adaptiveResponse = settings.value("adaptiveResponse") - QTimer.singleShot(50 * self.adaptiveResponse, self.RS_restoreTheme) QTimer.singleShot(150 * self.adaptiveResponse, self.RS_restoreState) @@ -147,8 +158,7 @@ def __init__(self, parent=None): endtime = datetime.datetime.now() self.status_bar.showMessage( - str((endtime - starttime).total_seconds()) + " ms", - 2500 * self.adaptiveResponse, + str((endtime - starttime).total_seconds()) + " ms", 2500 ) def closeEvent(self, event): @@ -203,7 +213,18 @@ def RS_updateTitle(self): f"{file}{asterisk}{textMode} — {app.applicationDisplayName()}" ) + def RS_threadStart(self): + if not self.thread_running: + self.richspan_thread.start() + self.thread_running = True + + def RS_textChanged(self): + if not self.text_changed_timer.isActive(): + self.text_changed_timer.start() + def RS_updateStatistics(self): + self.text_changed_timer.stop() + self.thread_running = False settings = QSettings("berkaygediz", "RichSpan") text = self.rs_area.toPlainText() character_count = len(text) @@ -212,11 +233,12 @@ def RS_updateStatistics(self): statistics = f"" statistics += "" @@ -234,6 +256,11 @@ def RS_updateStatistics(self): lowercase_count = sum(1 for char in text if char.islower()) statistics += f"" statistics += f"" + if word_count > 8: + DetectorFactory.seed = 0 + lang = detect(text) + statistics += f"" + else: self.rs_area.setFontFamily(fallbackValues["fontFamily"]) self.rs_area.setFontPointSize(fallbackValues["fontSize"]) @@ -345,8 +372,9 @@ def RS_themePalette(self): self.light_theme.setColor(QPalette.Window, QColor(3, 65, 135)) self.light_theme.setColor(QPalette.WindowText, QColor(255, 255, 255)) self.light_theme.setColor(QPalette.Base, QColor(255, 255, 255)) - self.light_theme.setColor(QPalette.Text, QColor(230, 230, 230)) + self.light_theme.setColor(QPalette.Text, QColor(0, 0, 0)) self.light_theme.setColor(QPalette.Highlight, QColor(105, 117, 156)) + self.light_theme.setColor(QPalette.Button, QColor(0, 0, 0)) self.light_theme.setColor(QPalette.ButtonText, QColor(255, 255, 255)) self.dark_theme.setColor(QPalette.Window, QColor(35, 39, 52)) @@ -354,6 +382,7 @@ def RS_themePalette(self): self.dark_theme.setColor(QPalette.Base, QColor(80, 85, 122)) self.dark_theme.setColor(QPalette.Text, QColor(255, 255, 255)) self.dark_theme.setColor(QPalette.Highlight, QColor(105, 117, 156)) + self.dark_theme.setColor(QPalette.Button, QColor(0, 0, 0)) self.dark_theme.setColor(QPalette.ButtonText, QColor(255, 255, 255)) def RS_themeAction(self): @@ -468,18 +497,20 @@ def RS_toolbarTranslate(self): ] ) self.dock_widget.setWindowTitle( - translations[settings.value("appLanguage")]["help"] + translations[settings.value("appLanguage")]["help"] + " && AI" ) self.dock_widget.setWidget(self.helpText) self.helpText.setText( "" - "
{translations[settings.value('appLanguage')]['analysis_message_3'].format(uppercase_count)}{translations[settings.value('appLanguage')]['analysis_message_4'].format(lowercase_count)}{translations[settings.value('appLanguage')]['analysis_message_5'].format(lang)}
" + "
" f"" f"" f"" @@ -505,7 +536,7 @@ def RS_toolbarTranslate(self): f"" f"" f"" - "
{translations[settings.value('appLanguage')]['help_shortcut']}{translations[settings.value('appLanguage')]['help_description']}
Ctrl+N{translations[settings.value('appLanguage')]['new_message']}
Ctrl+Shift+L{translations[settings.value('appLanguage')]['left']}
Ctrl+Shift+E{translations[settings.value('appLanguage')]['center']}
Ctrl+Shift+J{translations[settings.value('appLanguage')]['justify']}
" + "

NOTE: AI support planned.

" ) def RS_setupArea(self): @@ -519,21 +550,21 @@ def RS_setupArea(self): self.rs_area.setTextBackgroundColor( QColor(fallbackValues["contentBackgroundColor"]) ) - self.rs_area.setTabStopWidth(33) + self.rs_area.setTabStopDistance(27) self.rs_area.document().setDocumentMargin(self.width() * 0.25) def RS_setupDock(self): settings = QSettings("berkaygediz", "RichSpan") settings.sync() self.dock_widget = QDockWidget( - translations[settings.value("appLanguage")]["help"] + " && LLM", self + translations[settings.value("appLanguage")]["help"] + " && AI", self ) - self.dock_widget.setObjectName("Help & LLM") + self.dock_widget.setObjectName("Help & AI") self.dock_widget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.addDockWidget(Qt.RightDockWidgetArea, self.dock_widget) self.scrollableArea = QScrollArea() - self.LLM_QVBox = QVBoxLayout() + self.AI_QVBox = QVBoxLayout() self.statistics_label = QLabel() self.helpText = QLabel() self.helpText.setWordWrap(True) @@ -541,13 +572,15 @@ def RS_setupDock(self): self.helpText.setTextFormat(Qt.RichText) self.helpText.setText( "" - "" + "
" f"" f"" f"" @@ -573,9 +606,9 @@ def RS_setupDock(self): f"" f"" f"" - "
{translations[settings.value('appLanguage')]['help_shortcut']}{translations[settings.value('appLanguage')]['help_description']}
Ctrl+N{translations[settings.value('appLanguage')]['new_message']}
Ctrl+Shift+L{translations[settings.value('appLanguage')]['left']}
Ctrl+Shift+E{translations[settings.value('appLanguage')]['center']}
Ctrl+Shift+J{translations[settings.value('appLanguage')]['justify']}

NOTE: LLM support planned.

" + "

NOTE: AI support planned.

" ) - self.LLM_QVBox.addWidget(self.helpText) + self.AI_QVBox.addWidget(self.helpText) self.dock_widget.setObjectName("Help") self.dock_widget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) @@ -591,7 +624,7 @@ def RS_setupDock(self): self.scrollableArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.scrollableArea.setWidgetResizable(True) scroll_contents = QWidget() - scroll_contents.setLayout(self.LLM_QVBox) + scroll_contents.setLayout(self.AI_QVBox) self.scrollableArea.setWidget(scroll_contents) def RS_toolbarLabel(self, toolbar, text): @@ -605,7 +638,9 @@ def RS_createAction(self, text, status_tip, function, shortcut=None, icon=None): if shortcut: action.setShortcut(shortcut) if icon: - action.setIcon(QIcon(icon)) + action.setIcon( + QIcon("") + ) # qtawesome is library based on qt5 --> icon = Qt5.QtGui.QIcon return action def RS_setupActions(self): @@ -843,7 +878,7 @@ def RS_setupToolbar(self): self.toolbar.addAction(self.theme_action) actionicon = qta.icon("fa5s.leaf", color="lime") self.powersaveraction = QAction("Hybrid Power Saver", self, checkable=True) - self.powersaveraction.setIcon(QIcon(actionicon)) + # self.powersaveraction.setIcon(QIcon(actionicon)) self.powersaveraction.setStatusTip("Hybrid (Ultra/Standard) power saver.") self.powersaveraction.toggled.connect(self.RS_hybridSaver) @@ -861,7 +896,7 @@ def RS_setupToolbar(self): self.toolbar.addAction(self.powersaveraction) actionicon = qta.icon("fa.connectdevelop", color="white") self.hide_dock_widget_action = self.RS_createAction( - translations[settings.value("appLanguage")]["help"] + " && LLM", + translations[settings.value("appLanguage")]["help"] + " && AI", translations[settings.value("appLanguage")]["help_message"], self.RS_toggleDock, QKeySequence("Ctrl+Shift+D"), @@ -870,6 +905,7 @@ def RS_setupToolbar(self): self.toolbar.addAction(self.hide_dock_widget_action) self.toolbar.addAction(self.aboutaction) self.language_combobox = QComboBox(self) + self.language_combobox.setStyleSheet("background-color:#000000; color:#FFFFFF;") self.language_combobox.addItems( [ "English", @@ -879,7 +915,12 @@ def RS_setupToolbar(self): "Azərbaycanca", "Uzbek", "Chinese", + "Korean", + "Japanese", "Arabic", + "Russian", + "French", + "Greek", ] ) self.language_combobox.currentIndexChanged.connect(self.RS_changeLanguage) @@ -995,7 +1036,7 @@ def new(self): self.rs_area.setTextBackgroundColor( QColor(fallbackValues["contentBackgroundColor"]) ) - self.rs_area.setTabStopWidth(33) + self.rs_area.setTabStopDistance(27) self.directory = self.default_directory self.file_name = None self.is_saved = False @@ -1021,7 +1062,7 @@ def new(self): self.rs_area.setTextBackgroundColor( QColor(fallbackValues["contentBackgroundColor"]) ) - self.rs_area.setTabStopWidth(33) + self.rs_area.setTabStopDistance(27) self.directory = self.default_directory self.file_name = None self.is_saved = False @@ -1124,14 +1165,15 @@ def saveFile(self): def print(self): printer = QPrinter(QPrinter.HighResolution) - printer.setOrientation(QPrinter.Portrait) - printer.setPageMargins(10, 10, 10, 10, QPrinter.Millimeter) + printer.setPageOrientation(QPageLayout.Orientation.Portrait) + printer.setPageMargins(QMargins(10, 10, 10, 10), QPageLayout.Millimeter) + printer.setFullPage(True) printer.setDocName(self.file_name) preview_dialog = QPrintPreviewDialog(printer, self) preview_dialog.paintRequested.connect(self.rs_area.print_) - preview_dialog.exec_() + preview_dialog.exec() def showAbout(self): self.about_window = RS_About() @@ -1269,4 +1311,4 @@ def replaceText(self, text): app.setApplicationVersion("1.4.2024.08-1") ws = RS_Workspace() ws.show() - sys.exit(app.exec_()) + sys.exit(app.exec()) diff --git a/modules/translations.py b/modules/translations.py index 32127ac..dafc5b5 100644 --- a/modules/translations.py +++ b/modules/translations.py @@ -82,6 +82,7 @@ "analysis_message_2": "Average Line: {0}", "analysis_message_3": "Uppercase: {0}", "analysis_message_4": "Lowercase: {0}", + "analysis_message_5": "Language: {0}", "exit": "Exit", "exit_message": "Are you sure you want to exit?", "cancel": "Cancel", @@ -194,6 +195,7 @@ "analysis_message_2": "Ortalama Satır: {0}", "analysis_message_3": "Büyük Harf: {0}", "analysis_message_4": "Küçük Harf: {0}", + "analysis_message_5": "Dil: {0}", "exit": "Çıkış", "exit_message": "Çıkmak istediğinize emin misiniz?", "cancel": "İptal", @@ -306,6 +308,7 @@ "analysis_message_2": "Orta Sətir: {0}", "analysis_message_3": "Böyük Hərf: {0}", "analysis_message_4": "Kiçik Hərf: {0}", + "analysis_message_5": "Dil: {0}", "exit": "Çıxış", "exit_message": "Həqiqətən çıxmaq istəyirsiniz?", "cancel": "İmtina Et", @@ -418,6 +421,7 @@ "analysis_message_2": "Durchschnittliche Zeile: {0}", "analysis_message_3": "Großbuchstaben: {0}", "analysis_message_4": "Kleinbuchstaben: {0}", + "analysis_message_5": "Sprache: {0}", "exit": "Beenden", "exit_message": "Möchten Sie wirklich beenden?", "cancel": "Abbrechen", @@ -529,6 +533,7 @@ "analysis_message_2": "Línea promedio: {0}", "analysis_message_3": "Mayúsculas: {0}", "analysis_message_4": "Minúsculas: {0}", + "analysis_message_5": "Idioma: {0}", "exit": "Salir", "exit_message": "¿Estás seguro de que quieres salir?", "cancel": "Cancelar", @@ -632,6 +637,7 @@ "analysis_message_2": "平均行: {0}", "analysis_message_3": "大写字母: {0}", "analysis_message_4": "小写字母: {0}", + "analysis_message_5": "语言: {0}", "exit_message": "您确定要退出吗?", "cancel": "取消", "rsdoc": "RichSpan 文档", @@ -659,6 +665,212 @@ "account": "账户", "list": "列表", }, + "Korean": { + "new": "새로 만들기", + "open": "열기", + "save": "저장", + "save_as": "다른 이름으로 저장", + "print": "인쇄", + "exit": "종료", + "file": "파일", + "interface": "인터페이스", + "ui": "UI", + "format": "형식", + "alignment": "정렬", + "color": "색상", + "multimedia": "멀티미디어", + "darklight": "어두운/밝은 모드", + "darklight_message": "테마 변경", + "edit": "편집", + "view": "보기", + "viewmode": "보기 모드", + "viewmode_message": "보기 모드 변경", + "help": "도움말", + "help_message": "도움말", + "help_shortcut": "단축키", + "help_description": "설명", + "about": "정보", + "new_message": "새 문서", + "open_message": "문서 열기", + "save_message": "문서 저장", + "save_as_message": "문서를 다른 이름으로 저장", + "print_message": "문서 인쇄", + "find": "찾기", + "find_message": "텍스트 찾기", + "replace": "바꾸기", + "replace_message": "텍스트 바꾸기", + "undo": "실행 취소", + "undo_message": "작업 취소", + "redo": "다시 실행", + "redo_message": "작업 다시 실행", + "right": "오른쪽", + "right_message": "텍스트 오른쪽 정렬", + "center": "가운데", + "center_message": "텍스트 가운데 정렬", + "left": "왼쪽", + "left_message": "텍스트 왼쪽 정렬", + "justify": "양쪽 맞춤", + "justify_message": "텍스트 양쪽 맞춤", + "font": "글꼴", + "font_message": "글꼴 변경", + "font_size": "글꼴 크기", + "font_size_message": "글꼴 크기 변경", + "font_color": "글꼴 색상", + "font_color_message": "글꼴 색상 변경", + "contentBackgroundColor": "배경 색상", + "contentBackgroundColor_message": "배경 색상 변경", + "bold": "굵게", + "bold_message": "굵게 텍스트", + "italic": "기울임꼴", + "italic_message": "기울임꼴 텍스트", + "underline": "밑줄", + "underline_message": "밑줄 텍스트", + "inc_font_message": "글꼴 크기 증가", + "dec_font_message": "글꼴 크기 감소", + "image": "이미지", + "image_message": "이미지 삽입", + "untitled": "제목 없음", + "statistic": "통계", + "statistic_message_1": "줄: {0}", + "statistic_message_2": "단어: {0}", + "statistic_message_3": "문자: {0}", + "statistic_message_4": "페이지: {0}", + "analysis": "분석", + "analysis_message_1": "평균 단어 길이: {0}", + "analysis_message_2": "평균 줄 길이: {0}", + "analysis_message_3": "대문자: {0}", + "analysis_message_4": "소문자: {0}", + "analysis_message_5": "언어: {0}", + "exit_message": "정말로 종료하시겠습니까?", + "cancel": "취소", + "rsdoc": "RichSpan 문서", + "connection_verified": "연결 확인됨", + "connection_denied": "연결 거부됨", + "logout": "로그아웃", + "sync_settings": "설정 동기화", + "welcome-title": "환영합니다 — RichSpan", + "intro": "계속하려면 BG Ecosystem 계정으로 로그인하거나 등록하십시오.", + "wrong_password": "잘못된 비밀번호", + "no_account": "계정이 없습니다.", + "email": "이메일", + "password": "비밀번호", + "login": "로그인", + "register": "등록", + "error": "오류", + "fill_all": "모든 필드를 작성해 주세요.", + "login_success": "로그인 성공, 리디렉션 중...", + "wrong_credentials": "잘못된 자격 증명", + "register_success": "등록 성공, 로그인해 주세요.", + "already_registered": "이미 등록됨", + "invalid_email": "잘못된 이메일", + "bullet": "글머리 기호", + "numbered": "번호 매기기", + "account": "계정", + "list": "목록", + }, + "Japanese": { + "new": "新規", + "open": "開く", + "save": "保存", + "save_as": "名前を付けて保存", + "print": "印刷", + "exit": "終了", + "file": "ファイル", + "interface": "インターフェース", + "ui": "UI", + "format": "フォーマット", + "alignment": "整列", + "color": "カラー", + "multimedia": "マルチメディア", + "darklight": "ダーク/ライト", + "darklight_message": "テーマを変更", + "edit": "編集", + "view": "表示", + "viewmode": "表示モード", + "viewmode_message": "表示モードを変更", + "help": "ヘルプ", + "help_message": "ヘルプ", + "help_shortcut": "ショートカット", + "help_description": "説明", + "about": "について", + "new_message": "新しい文書", + "open_message": "文書を開く", + "save_message": "文書を保存", + "save_as_message": "文書を別名で保存", + "print_message": "文書を印刷", + "find": "検索", + "find_message": "テキストを検索", + "replace": "置換", + "replace_message": "テキストを置換", + "undo": "元に戻す", + "undo_message": "操作を元に戻す", + "redo": "やり直し", + "redo_message": "操作をやり直し", + "right": "右", + "right_message": "テキストを右揃え", + "center": "中央", + "center_message": "テキストを中央揃え", + "left": "左", + "left_message": "テキストを左揃え", + "justify": "両端揃え", + "justify_message": "テキストを両端揃え", + "font": "フォント", + "font_message": "フォントを変更", + "font_size": "フォントサイズ", + "font_size_message": "フォントサイズを変更", + "font_color": "フォントカラー", + "font_color_message": "フォントカラーを変更", + "contentBackgroundColor": "背景色", + "contentBackgroundColor_message": "背景色を変更", + "bold": "太字", + "bold_message": "テキストを太字に", + "italic": "斜体", + "italic_message": "テキストを斜体に", + "underline": "下線", + "underline_message": "テキストに下線を引く", + "inc_font_message": "フォントサイズを増加", + "dec_font_message": "フォントサイズを減少", + "image": "画像", + "image_message": "画像を挿入", + "untitled": "無題", + "statistic": "統計", + "statistic_message_1": "行数: {0}", + "statistic_message_2": "単語数: {0}", + "statistic_message_3": "文字数: {0}", + "statistic_message_4": "ページ数: {0}", + "analysis": "分析", + "analysis_message_1": "平均単語数: {0}", + "analysis_message_2": "平均行数: {0}", + "analysis_message_3": "大文字: {0}", + "analysis_message_4": "小文字: {0}", + "analysis_message_5": "言語: {0}", + "exit_message": "本当に終了しますか?", + "cancel": "キャンセル", + "rsdoc": "RichSpan ドキュメント", + "connection_verified": "接続確認済み", + "connection_denied": "接続拒否", + "logout": "ログアウト", + "sync_settings": "設定を同期", + "welcome-title": "ようこそ — RichSpan", + "intro": "BG Ecosystem アカウントでログインまたは登録して続行してください。", + "wrong_password": "パスワードが間違っています", + "no_account": "アカウントがありません。", + "email": "メール", + "password": "パスワード", + "login": "ログイン", + "register": "登録", + "error": "エラー", + "fill_all": "すべてのフィールドを入力してください。", + "login_success": "ログイン成功、リダイレクト中...", + "wrong_credentials": "認証情報が間違っています", + "register_success": "登録成功、ログインしてください。", + "already_registered": "すでに登録済み", + "invalid_email": "無効なメール", + "bullet": "箇条書き", + "numbered": "番号付き", + "account": "アカウント", + "list": "リスト", + }, "Arabic": { "new": "جديد", "open": "فتح", @@ -734,6 +946,7 @@ "analysis_message_2": "متوسط الأسطر: {0}", "analysis_message_3": "الحروف الكبيرة: {0}", "analysis_message_4": "الحروف الصغيرة: {0}", + "analysis_message_5": "لغة: {0}", "exit_message": "هل أنت متأكد أنك تريد الخروج؟", "cancel": "إلغاء", "rsdoc": "مستند RichSpan", @@ -836,6 +1049,7 @@ "analysis_message_2": "O'rtacha qator: {0}", "analysis_message_3": "Katta harf: {0}", "analysis_message_4": "Kichik harf: {0}", + "analysis_message_5": "Til: {0}", "exit_message": "Chiqishni xohlayotganingizga ishonchingiz komilmi?", "cancel": "Bekor qilish", "rsdoc": "RichSpan hujjati", @@ -863,4 +1077,313 @@ "account": "Hisob", "list": "Ro'yxat", }, + "Russian": { + "new": "Новый", + "open": "Открыть", + "save": "Сохранить", + "save_as": "Сохранить как", + "print": "Печать", + "exit": "Выход", + "file": "Файл", + "interface": "Интерфейс", + "ui": "UI", + "format": "Формат", + "alignment": "Выравнивание", + "color": "Цвет", + "multimedia": "Мультимедиа", + "darklight": "Темная/Светлая", + "darklight_message": "Изменить тему", + "edit": "Правка", + "view": "Просмотр", + "viewmode": "Режим просмотра", + "viewmode_message": "Изменить режим просмотра", + "help": "Помощь", + "help_message": "Помощь", + "help_shortcut": "Ярлыки", + "help_description": "Описание", + "about": "О программе", + "new_message": "Новый документ", + "open_message": "Открыть документ", + "save_message": "Сохранить документ", + "save_as_message": "Сохранить документ как", + "print_message": "Распечатать документ", + "find": "Найти", + "find_message": "Найти текст", + "replace": "Заменить", + "replace_message": "Заменить текст", + "undo": "Отменить", + "undo_message": "Отменить действие", + "redo": "Повторить", + "redo_message": "Повторить действие", + "right": "По правому краю", + "right_message": "Выравнить текст по правому краю", + "center": "По центру", + "center_message": "Выравнить текст по центру", + "left": "По левому краю", + "left_message": "Выравнить текст по левому краю", + "justify": "По ширине", + "justify_message": "Выравнить текст по ширине", + "font": "Шрифт", + "font_message": "Изменить шрифт", + "font_size": "Размер шрифта", + "font_size_message": "Изменить размер шрифта", + "font_color": "Цвет шрифта", + "font_color_message": "Изменить цвет шрифта", + "contentBackgroundColor": "Цвет фона", + "contentBackgroundColor_message": "Изменить цвет фона", + "bold": "Жирный", + "bold_message": "Жирный текст", + "italic": "Курсив", + "italic_message": "Курсивный текст", + "underline": "Подчеркнутый", + "underline_message": "Подчеркнутый текст", + "inc_font_message": "Увеличить размер шрифта", + "dec_font_message": "Уменьшить размер шрифта", + "image": "Изображение", + "image_message": "Вставить изображение", + "untitled": "Без названия", + "statistic": "Статистика", + "statistic_message_1": "Строки: {0}", + "statistic_message_2": "Слова: {0}", + "statistic_message_3": "Символы: {0}", + "statistic_message_4": "Страницы: {0}", + "analysis": "Анализ", + "analysis_message_1": "Среднее слово: {0}", + "analysis_message_2": "Средняя строка: {0}", + "analysis_message_3": "Заглавные: {0}", + "analysis_message_4": "Строчные: {0}", + "analysis_message_5": "Язык: {0}", + "exit_message": "Вы уверены, что хотите выйти?", + "cancel": "Отмена", + "rsdoc": "RichSpan Документ", + "connection_verified": "Подключение проверено", + "connection_denied": "Подключение отклонено", + "logout": "Выход", + "sync_settings": "Синхронизировать настройки", + "welcome-title": "Добро пожаловать — RichSpan", + "intro": "Войдите или зарегистрируйтесь с помощью аккаунта BG Ecosystem, чтобы продолжить.", + "wrong_password": "Неправильный пароль", + "no_account": "У вас нет аккаунта.", + "email": "Электронная почта", + "password": "Пароль", + "login": "Войти", + "register": "Зарегистрироваться", + "error": "Ошибка", + "fill_all": "Пожалуйста, заполните все поля.", + "login_success": "Вход выполнен успешно, перенаправление...", + "wrong_credentials": "Неправильные учетные данные", + "register_success": "Регистрация успешна, пожалуйста, войдите.", + "already_registered": "Уже зарегистрирован", + "invalid_email": "Неверный email", + "bullet": "Метка", + "numbered": "Нумерованный", + "account": "Аккаунт", + "list": "Список", + }, + "French": { + "new": "Nouveau", + "open": "Ouvrir", + "save": "Enregistrer", + "save_as": "Enregistrer sous", + "print": "Imprimer", + "exit": "Quitter", + "file": "Fichier", + "interface": "Interface", + "ui": "UI", + "format": "Format", + "alignment": "Alignement", + "color": "Couleur", + "multimedia": "Multimédia", + "darklight": "Sombre/Clair", + "darklight_message": "Changer le thème", + "edit": "Éditer", + "view": "Afficher", + "viewmode": "Mode d'affichage", + "viewmode_message": "Changer le mode d'affichage", + "help": "Aide", + "help_message": "Aide", + "help_shortcut": "Raccourcis", + "help_description": "Description", + "about": "À propos", + "new_message": "Nouveau document", + "open_message": "Ouvrir le document", + "save_message": "Enregistrer le document", + "save_as_message": "Enregistrer le document sous", + "print_message": "Imprimer le document", + "find": "Trouver", + "find_message": "Trouver du texte", + "replace": "Remplacer", + "replace_message": "Remplacer le texte", + "undo": "Annuler", + "undo_message": "Annuler l'action", + "redo": "Rétablir", + "redo_message": "Rétablir l'action", + "right": "Droite", + "right_message": "Aligner le texte à droite", + "center": "Centre", + "center_message": "Aligner le texte au centre", + "left": "Gauche", + "left_message": "Aligner le texte à gauche", + "justify": "Justifier", + "justify_message": "Justifier le texte", + "font": "Police", + "font_message": "Changer la police", + "font_size": "Taille de police", + "font_size_message": "Changer la taille de la police", + "font_color": "Couleur de la police", + "font_color_message": "Changer la couleur de la police", + "contentBackgroundColor": "Couleur de fond", + "contentBackgroundColor_message": "Changer la couleur de fond", + "bold": "Gras", + "bold_message": "Texte en gras", + "italic": "Italique", + "italic_message": "Texte en italique", + "underline": "Souligné", + "underline_message": "Texte souligné", + "inc_font_message": "Augmenter la taille de la police", + "dec_font_message": "Diminuer la taille de la police", + "image": "Image", + "image_message": "Insérer une image", + "untitled": "Sans titre", + "statistic": "Statistique", + "statistic_message_1": "Lignes : {0}", + "statistic_message_2": "Mots : {0}", + "statistic_message_3": "Caractères : {0}", + "statistic_message_4": "Pages : {0}", + "analysis": "Analyse", + "analysis_message_1": "Moyenne des mots : {0}", + "analysis_message_2": "Moyenne des lignes : {0}", + "analysis_message_3": "Majuscules : {0}", + "analysis_message_4": "Minuscules : {0}", + "analysis_message_5": "Langue : {0}", + "exit_message": "Êtes-vous sûr de vouloir quitter ?", + "cancel": "Annuler", + "rsdoc": "Document RichSpan", + "connection_verified": "Connexion vérifiée", + "connection_denied": "Connexion refusée", + "logout": "Déconnexion", + "sync_settings": "Synchroniser les paramètres", + "welcome-title": "Bienvenue — RichSpan", + "intro": "Connectez-vous ou inscrivez-vous avec un compte BG Ecosystem pour continuer.", + "wrong_password": "Mot de passe incorrect", + "no_account": "Vous n'avez pas de compte.", + "email": "Email", + "password": "Mot de passe", + "login": "Connexion", + "register": "Inscription", + "error": "Erreur", + "fill_all": "Veuillez remplir tous les champs.", + "login_success": "Connexion réussie, redirection...", + "wrong_credentials": "Identifiants incorrects", + "register_success": "Inscription réussie, veuillez vous connecter.", + "already_registered": "Déjà inscrit", + "invalid_email": "Email invalide", + "bullet": "Puces", + "numbered": "Numéroté", + "account": "Compte", + "list": "Liste", + }, + "Greek": { + "new": "Νέο", + "open": "Άνοιγμα", + "save": "Αποθήκευση", + "save_as": "Αποθήκευση ως", + "print": "Εκτύπωση", + "exit": "Έξοδος", + "file": "Αρχείο", + "interface": "Διεπαφή", + "ui": "UI", + "format": "Μορφοποίηση", + "alignment": "Στοίχιση", + "color": "Χρώμα", + "multimedia": "Πολυμέσα", + "darklight": "Σκοτεινό/Ανοιχτό", + "darklight_message": "Αλλαγή θέματος", + "edit": "Επεξεργασία", + "view": "Προβολή", + "viewmode": "Λειτουργία προβολής", + "viewmode_message": "Αλλαγή λειτουργίας προβολής", + "help": "Βοήθεια", + "help_message": "Βοήθεια", + "help_shortcut": "Συντομεύσεις", + "help_description": "Περιγραφή", + "about": "Σχετικά", + "new_message": "Νέο έγγραφο", + "open_message": "Άνοιγμα εγγράφου", + "save_message": "Αποθήκευση εγγράφου", + "save_as_message": "Αποθήκευση εγγράφου ως", + "print_message": "Εκτύπωση εγγράφου", + "find": "Εύρεση", + "find_message": "Εύρεση κειμένου", + "replace": "Αντικατάσταση", + "replace_message": "Αντικατάσταση κειμένου", + "undo": "Αναίρεση", + "undo_message": "Αναίρεση ενέργειας", + "redo": "Επαναφορά", + "redo_message": "Επαναφορά ενέργειας", + "right": "Δεξιά", + "right_message": "Στοίχιση κειμένου δεξιά", + "center": "Κέντρο", + "center_message": "Στοίχιση κειμένου στο κέντρο", + "left": "Αριστερά", + "left_message": "Στοίχιση κειμένου αριστερά", + "justify": "Δικαιολογημένο", + "justify_message": "Δικαιολόγηση κειμένου", + "font": "Γραμματοσειρά", + "font_message": "Αλλαγή γραμματοσειράς", + "font_size": "Μέγεθος γραμματοσειράς", + "font_size_message": "Αλλαγή μεγέθους γραμματοσειράς", + "font_color": "Χρώμα γραμματοσειράς", + "font_color_message": "Αλλαγή χρώματος γραμματοσειράς", + "contentBackgroundColor": "Χρώμα φόντου", + "contentBackgroundColor_message": "Αλλαγή χρώματος φόντου", + "bold": "Έντονα", + "bold_message": "Έντονο κείμενο", + "italic": "Πλάγια", + "italic_message": "Πλάγιο κείμενο", + "underline": "Υπογραμμισμένο", + "underline_message": "Υπογραμμισμένο κείμενο", + "inc_font_message": "Αύξηση μεγέθους γραμματοσειράς", + "dec_font_message": "Μείωση μεγέθους γραμματοσειράς", + "image": "Εικόνα", + "image_message": "Εισαγωγή εικόνας", + "untitled": "Αχωρίστως", + "statistic": "Στατιστικά", + "statistic_message_1": "Γραμμές: {0}", + "statistic_message_2": "Λέξεις: {0}", + "statistic_message_3": "Χαρακτήρες: {0}", + "statistic_message_4": "Σελίδες: {0}", + "analysis": "Ανάλυση", + "analysis_message_1": "Μέσος όρος λέξεων: {0}", + "analysis_message_2": "Μέσος όρος γραμμών: {0}", + "analysis_message_3": "Κεφαλαία: {0}", + "analysis_message_4": "Μικρά: {0}", + "analysis_message_5": "Γλώσσα: {0}", + "exit_message": "Είστε σίγουροι ότι θέλετε να βγείτε;", + "cancel": "Ακύρωση", + "rsdoc": "Έγγραφο RichSpan", + "connection_verified": "Σύνδεση επιβεβαιωμένη", + "connection_denied": "Σύνδεση απορρίφθηκε", + "logout": "Αποσύνδεση", + "sync_settings": "Συγχρονισμός ρυθμίσεων", + "welcome-title": "Καλώς ήρθατε — RichSpan", + "intro": "Συνδεθείτε ή εγγραφείτε με τον λογαριασμό BG Ecosystem για να συνεχίσετε.", + "wrong_password": "Λάθος κωδικός", + "no_account": "Δεν έχετε λογαριασμό.", + "email": "Email", + "password": "Κωδικός", + "login": "Σύνδεση", + "register": "Εγγραφή", + "error": "Σφάλμα", + "fill_all": "Παρακαλώ συμπληρώστε όλα τα πεδία.", + "login_success": "Σύνδεση επιτυχής, ανακατεύθυνση...", + "wrong_credentials": "Λάθος στοιχεία", + "register_success": "Η εγγραφή ήταν επιτυχής, παρακαλώ συνδεθείτε.", + "already_registered": "Ήδη εγγεγραμμένος", + "invalid_email": "Μη έγκυρο email", + "bullet": "Κουκίδα", + "numbered": "Αριθμημένος", + "account": "Λογαριασμός", + "list": "Λίστα", + }, }