From 2885e62eeab2631ce5909b83e668dbd35919866e Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Wed, 15 Nov 2023 21:44:31 +0300 Subject: [PATCH 001/316] [macos] fix bug 63451 --- macos/ONLYOFFICE/AppDelegate.mm | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/macos/ONLYOFFICE/AppDelegate.mm b/macos/ONLYOFFICE/AppDelegate.mm index 4b91e646f..9bac8137a 100644 --- a/macos/ONLYOFFICE/AppDelegate.mm +++ b/macos/ONLYOFFICE/AppDelegate.mm @@ -182,6 +182,34 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)fil }); } +-(NSMenu *)applicationDockMenu:(NSApplication *)sender { + NSMenu * menu = [[NSMenu alloc] initWithTitle:@"dockNewMenu"]; + + NSString * item_text = NSLocalizedStringWithDefaultValue(@"new-document", @"Localizable", [NSBundle mainBundle], @"New Document", nil); + NSMenuItem * + itemNewDoc = [[NSMenuItem alloc] initWithTitle:item_text + action:@selector(onMenuNew:) + keyEquivalent:@""]; + [itemNewDoc setTag: 0]; + [menu addItem: itemNewDoc]; + + item_text = NSLocalizedStringWithDefaultValue(@"new-spreadsheet", @"Localizable", [NSBundle mainBundle], @"New Spreadsheet", nil); + itemNewDoc = [[NSMenuItem alloc] initWithTitle:item_text + action:@selector(onMenuNew:) + keyEquivalent:@""]; + [itemNewDoc setTag: 2]; + [menu addItem: itemNewDoc]; + + item_text = NSLocalizedStringWithDefaultValue(@"new-presentation", @"Localizable", [NSBundle mainBundle], @"New Presentation", nil); + itemNewDoc = [[NSMenuItem alloc] initWithTitle:item_text + action:@selector(onMenuNew:) + keyEquivalent:@""]; + [itemNewDoc setTag: 1]; + [menu addItem: itemNewDoc]; + + return menu; +} + - (void)applicationWillTerminate:(NSNotification *)aNotification { // Insert code here to tear down your application From 80859f115620c2f983ea571eb28d3fc864445b01 Mon Sep 17 00:00:00 2001 From: OVSharova Date: Sun, 19 Nov 2023 02:52:00 +0300 Subject: [PATCH 002/316] Bug 61786 --- common/loginpage/locale/de.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/loginpage/locale/de.js b/common/loginpage/locale/de.js index 7354b7375..144e5ad4f 100644 --- a/common/loginpage/locale/de.js +++ b/common/loginpage/locale/de.js @@ -17,7 +17,7 @@ l10n.de = { listRecentFileTitle:'Neueste Dateien', listRecentDirTitle:'Neueste Ordner', menuFileOpen: 'Öffnen', - menuFileExplore: 'In dem Ordner anzeigen', + menuFileExplore: 'In dem Ordner anzeigen', menuRemoveModel: 'Aus Liste entfernen', menuClear: 'Löschen', menuLogout: 'Abmelden', From 7825d6cfb9d91937fb8704b18391ebea7ab573f3 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Sun, 19 Nov 2023 11:31:14 +0200 Subject: [PATCH 003/316] [win-linux] fix bug 61163 --- win-linux/src/cascapplicationmanagerwrapper.cpp | 2 +- win-linux/src/windows/ceditorwindow.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/win-linux/src/cascapplicationmanagerwrapper.cpp b/win-linux/src/cascapplicationmanagerwrapper.cpp index ad20a476f..43a9db301 100644 --- a/win-linux/src/cascapplicationmanagerwrapper.cpp +++ b/win-linux/src/cascapplicationmanagerwrapper.cpp @@ -1616,7 +1616,7 @@ bool CAscApplicationManagerWrapper::event(QEvent *event) // SKIP_EVENTS_QUEUE([=]{ if ( _main_window ) { QRect rect = _main_window->windowState().testFlag(Qt::WindowMaximized) ? - QRect() : _main_window->windowRect(); + _main_window->normalGeometry() : _main_window->windowRect(); CEditorWindow * editor_win = new CEditorWindow(rect.translated(QPoint(50,50)), _editor); editor_win->undock(_main_window->isMaximized()); diff --git a/win-linux/src/windows/ceditorwindow.cpp b/win-linux/src/windows/ceditorwindow.cpp index b8d74ab2c..dae313f86 100644 --- a/win-linux/src/windows/ceditorwindow.cpp +++ b/win-linux/src/windows/ceditorwindow.cpp @@ -173,11 +173,11 @@ bool CEditorWindow::holdView(const std::wstring& portal) const void CEditorWindow::undock(bool maximized) { if (isCustomWindowStyle()) { - m_restoreMaximized = maximized; + m_restoreMaximized = false; CWindowPlatform::show(false); captureMouse(); } else { - CWindowPlatform::show(maximized); + CWindowPlatform::show(false); } } From a4681addeef08cb856d4039a7e27236fbe064cd8 Mon Sep 17 00:00:00 2001 From: OVSharova Date: Mon, 20 Nov 2023 09:19:49 +0300 Subject: [PATCH 004/316] Bug 63183 --- common/loginpage/locale/es.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/loginpage/locale/es.js b/common/loginpage/locale/es.js index f24883b6c..ef081ea14 100644 --- a/common/loginpage/locale/es.js +++ b/common/loginpage/locale/es.js @@ -75,7 +75,7 @@ l10n.es = { settOpenMode: 'Abrir documento en modo de vista previa', setBtnApply: 'Aplicar', settLanguage: 'Idioma de la interfaz', - settAfterRestart: 'Los cambios se aplicarán después de reiniciar la aplicación', + settAfterRestart: 'Los cambios se aplicarán después de reiniciar la aplicación', settShowEncryptOpts: 'Probar cifrado de extremo a extremo', settCheckUpdates: 'Buscar actualizaciones automáticamente', settOptCheckNever: 'Nunca', From 2054cfbb20beb49eb38d82bc243235f2a8a0dd21 Mon Sep 17 00:00:00 2001 From: OVSharova Date: Mon, 20 Nov 2023 09:22:55 +0300 Subject: [PATCH 005/316] replace nbsp in local --- common/loginpage/locale/de.js | 8 ++++---- common/loginpage/locale/es.js | 8 ++++---- common/loginpage/locale/pt-BR.js | 4 ++-- common/loginpage/locale/ru.js | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/common/loginpage/locale/de.js b/common/loginpage/locale/de.js index 144e5ad4f..bd988e94f 100644 --- a/common/loginpage/locale/de.js +++ b/common/loginpage/locale/de.js @@ -10,7 +10,7 @@ l10n.de = { btnNext: 'Weiter', portalEmptyTitle: 'Zu Ihrer Cloud verbinden', portalEmptyDescr: 'Speichern Sie Ihre Dokumente in der Cloud und greifen Sie jederzeit und von überall darauf zu. Teilen und arbeiten Sie an Dokumenten zusammen. Chatten Sie in Echtzeit im Dokument, fügen Sie Kommentare hinzu oder teilen Sie es zur Überprüfung.', - portalEmptyAdv1: 'Haben Sie noch kein Cloud-Konto? Wechseln Sie zum Onlinemodus mit dem ONLYOFFICE Cloud Service und testen Sie die Möglichkeiten zur Zusammenarbeit  kostenlos.', + portalEmptyAdv1: 'Haben Sie noch kein Cloud-Konto? Wechseln Sie zum Onlinemodus mit dem ONLYOFFICE Cloud Service und testen Sie die Möglichkeiten zur Zusammenarbeit kostenlos.', portalListTitle: 'Angeschlosse Cloud', textNoFiles: 'Keine Dateien', listRecoveryTitle:'Dateien wiederherstellen', @@ -57,11 +57,11 @@ l10n.de = { actAbout: 'Über', actSettings: 'Einstellungen', actTemplates: 'Vorlagen', - licKeyHolder: 'Geben Sie den Aktivierungsschlüssel ein', + licKeyHolder: 'Geben Sie den Aktivierungsschlüssel ein', btnActivate: 'Aktivieren', licGetLicense: 'Erwerben Sie jetzt eine Lizenz', - licPanelTitle: 'Geben Sie den Produktschlüssel ein', - licPanelDescr: 'Ihr Produktschlüssel wurde an die E-Mail-Adresse zugeschickt, die Sie beim Kauf angegeben haben.', + licPanelTitle: 'Geben Sie den Produktschlüssel ein', + licPanelDescr: 'Ihr Produktschlüssel wurde an die E-Mail-Adresse zugeschickt, die Sie beim Kauf angegeben haben.', checkUpdates: 'Nach Updates suchen', strVersion: 'Version', emptySlide1Title: 'Freigabe & Zusammenarbeit', diff --git a/common/loginpage/locale/es.js b/common/loginpage/locale/es.js index ef081ea14..b2091697c 100644 --- a/common/loginpage/locale/es.js +++ b/common/loginpage/locale/es.js @@ -1,6 +1,6 @@ l10n.es = { welWelcome: '¡Bienvenido a ONLYOFFICE Desktop Editors!', - welDescr: 'Trabaje en documentos «offline» o conecte la suite a su nube: ONLYOFFICE, ownCloud, Nextcloud.', + welDescr: 'Trabaje en documentos «offline» o conecte la suite a su nube: ONLYOFFICE, ownCloud, Nextcloud.', btnConnect: 'Conectarse', textHavePortal: '¿Usa ya algún servicio en la nube?', btnCreatePortal: 'Crear cuenta de ONLYOFFICE en la nube', @@ -9,9 +9,9 @@ l10n.es = { btnBrowse: 'Navegar', btnNext: 'Siguiente', portalEmptyTitle: 'Conéctese a su nube', - portalEmptyDescr: 'Almacene sus documentos en la nube y acceda a ellos en cualquier momento y desde cualquier lugar. Comparta y colabore en archivos. Chatee en su documento, añada comentarios o compártalo para revisión.', + portalEmptyDescr: 'Almacene sus documentos en la nube y acceda a ellos en cualquier momento y desde cualquier lugar. Comparta y colabore en archivos. Chatee en su documento, añada comentarios o compártalo para revisión.', portalEmptyAdv1: '¿Todavía no tiene su cuenta en la nube? Conéctese en línea con el Servicio de ONLYOFFICE en la nube y pruebe sus prestaciones de colaboración gratis.', - portalListTitle: 'Servicios en la nube conectados', + portalListTitle: 'Servicios en la nube conectados', textNoFiles: 'No hay archivos', listRecoveryTitle:'Recuperar archivos', listRecentFileTitle:'Archivos recientes', @@ -72,7 +72,7 @@ l10n.es = { emptySlide3Text: 'Almacene sus documentos en la nube de ONLYOFFICE y acceda en cualquier momento y desde cualquier lugar.', settUserName: 'Nombre de usuario', settResetUserName: 'Restablecer a valores por defecto', - settOpenMode: 'Abrir documento en modo de vista previa', + settOpenMode: 'Abrir documento en modo de vista previa', setBtnApply: 'Aplicar', settLanguage: 'Idioma de la interfaz', settAfterRestart: 'Los cambios se aplicarán después de reiniciar la aplicación', diff --git a/common/loginpage/locale/pt-BR.js b/common/loginpage/locale/pt-BR.js index 397da521a..3d8d0698e 100644 --- a/common/loginpage/locale/pt-BR.js +++ b/common/loginpage/locale/pt-BR.js @@ -1,6 +1,6 @@ l10n.pt_BR = { welWelcome: 'Bem-vindo ao ONLYOFFICE Desktop Editors!', - welDescr: 'Trabalhe em documentos offline ou conecte-se à sua nuvem: ONLYOFFICE, ownCloud, Nextcloud.', + welDescr: 'Trabalhe em documentos offline ou conecte-se à sua nuvem: ONLYOFFICE, ownCloud, Nextcloud.', btnConnect: 'Conectar', textHavePortal: 'Já usa o nuvem?', btnCreatePortal: 'Criar ONLYOFFICE na nuvem', @@ -65,7 +65,7 @@ l10n.pt_BR = { checkUpdates: 'Verifique atualizações', strVersion: 'versão', emptySlide1Title: 'Compartilhe e colabore', - emptySlide1Text: 'Escolha modo de coedição em tempo real - Rápido ou Restrito, converse em seu documento, adicione comentários ou compartilhá-lo para revisão.', + emptySlide1Text: 'Escolha modo de coedição em tempo real - Rápido ou Restrito, converse em seu documento, adicione comentários ou compartilhá-lo para revisão.', emptySlide2Title: 'Visualize ou restaure versões anteriores', emptySlide2Text: 'Restaure ou apenas visualize versões anteriores do seu documento, controle as alterações e autores delas.', emptySlide3Title: 'Armazene na nuvem', diff --git a/common/loginpage/locale/ru.js b/common/loginpage/locale/ru.js index 9ef01d78e..07e3cf07f 100644 --- a/common/loginpage/locale/ru.js +++ b/common/loginpage/locale/ru.js @@ -9,7 +9,7 @@ l10n.ru = { btnBrowse: 'Открыть', btnNext: 'Далее', portalEmptyTitle: 'Подключитесь к облаку', - portalEmptyDescr: 'Храните документы в облаке и работайте с ними в любое время из любой точки мира. Предоставляйте к ним доступ и работайте совместно. Используйте встроенный чат, добавляйте комментарии или отправляйте документ на рецензирование.', + portalEmptyDescr: 'Храните документы в облаке и работайте с ними в любое время из любой точки мира. Предоставляйте к ним доступ и работайте совместно. Используйте встроенный чат, добавляйте комментарии или отправляйте документ на рецензирование.', portalEmptyAdv1: 'Еще нет облачного аккаунта? Перейдите в онлайн-режим с облачным сервисом ONLYOFFICE и попробуйте возможности совместного редактирования бесплатно.', portalListTitle: 'Подключенные облака', textNoFiles: 'Нет файлов для просмотра', @@ -44,7 +44,7 @@ l10n.ru = { pshPhone: 'номер телефона', pshCode: 'код из текстового сообщения', loginNoteAssignPhone: 'Для обеспечения повышенной безопасности в облаке ONLYOFFICE включена двухфакторная аутентификация. Для продолжения работы в облачном офисе введите ваш номер мобильного телефона. Номер мобильного телефона необходимо ввести в международном формате с кодом страны.', - loginNoteApplyCode: 'Двухфакторная аутентификация включена. Код отправлен в SMS-сообщении на номер $1.', + loginNoteApplyCode: 'Двухфакторная аутентификация включена. Код отправлен в SMS-сообщении на номер $1.', newDoc: 'Документ', newXlsx: 'Таблица', newPptx: 'Презентация', From 074000f6374d3fa6793965006a612d762a231f87 Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Mon, 20 Nov 2023 16:51:05 +0300 Subject: [PATCH 006/316] edited 'browse' ru --- common/loginpage/locale/ru.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/loginpage/locale/ru.js b/common/loginpage/locale/ru.js index 9ef01d78e..522cba6f8 100644 --- a/common/loginpage/locale/ru.js +++ b/common/loginpage/locale/ru.js @@ -6,7 +6,7 @@ l10n.ru = { btnCreatePortal: 'Создать облако ONLYOFFICE', btnAddPortal: 'Добавить облако', btnLogin: 'Войти', - btnBrowse: 'Открыть', + btnBrowse: 'Просмотреть', btnNext: 'Далее', portalEmptyTitle: 'Подключитесь к облаку', portalEmptyDescr: 'Храните документы в облаке и работайте с ними в любое время из любой точки мира. Предоставляйте к ним доступ и работайте совместно. Используйте встроенный чат, добавляйте комментарии или отправляйте документ на рецензирование.', From ac0fe8892c31d184376105687f5d16ddd2159477 Mon Sep 17 00:00:00 2001 From: Hugo Carvalho Date: Tue, 21 Nov 2023 15:16:49 +0000 Subject: [PATCH 007/316] Update pt-PT translation Update pt-PT translation in login page --- common/loginpage/locale/pt-PT.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/loginpage/locale/pt-PT.js b/common/loginpage/locale/pt-PT.js index 3f9e42de0..9d9b967b1 100644 --- a/common/loginpage/locale/pt-PT.js +++ b/common/loginpage/locale/pt-PT.js @@ -75,7 +75,7 @@ l10n.pt_PT = { settOpenMode: 'Abrir um documento em modo de pré-visualização', setBtnApply: 'Aplicar', settLanguage: 'Idioma da interface', - settAfterRestart: 'A opção será aplicada depois de reiniciar a aplicação', + settAfterRestart: 'A definição será aplicada após reiniciar a aplicação', settShowEncryptOpts: 'Teste a encriptação ponto a ponto', settCheckUpdates: 'Procurar atualizações automaticamente', settOptCheckNever: 'Nunca', @@ -105,4 +105,7 @@ l10n.pt_PT = { updateDownloadFinished: 'A transferência está concluída. Clique para instalar', updateDownloadCanceled: 'Transferência cancelada', updateDownloadProgress: 'A transferir $1%. Clique para parar', + settOptDescDisabled: "A verificação automática de atualizações será desativada", + settOptDescAUpdateSilent: "Transferir atualizações e perguntar antes de instalar", + settOptDescAUpdateAsk: "Será notificado sobre todas as etapas de atualização", } From a090a4addd36f8c66c206025614ae33a7ebf1ed0 Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Fri, 24 Nov 2023 16:39:34 +0300 Subject: [PATCH 008/316] updated translations --- common/loginpage/locale/cs.js | 17 ++++ common/loginpage/locale/de.js | 3 + common/loginpage/locale/fi.js | 17 ++++ common/loginpage/locale/ko.js | 17 ++++ common/loginpage/locale/nl.js | 19 +++- common/loginpage/locale/pl.js | 17 ++++ common/loginpage/locale/vi.js | 18 ++++ common/loginpage/locale/zh-CN.js | 3 + win-linux/langs/cs.ts | 118 +++++++++++----------- win-linux/langs/de.ts | 116 +++++++++++----------- win-linux/langs/fi.ts | 162 +++++++++++++++--------------- win-linux/langs/ko.ts | 162 +++++++++++++++--------------- win-linux/langs/nl.ts | 164 +++++++++++++++---------------- win-linux/langs/pl.ts | 162 +++++++++++++++--------------- win-linux/langs/pt_PT.ts | 162 +++++++++++++++--------------- win-linux/langs/vi.ts | 162 +++++++++++++++--------------- win-linux/langs/zh_CN.ts | 18 ++-- 17 files changed, 723 insertions(+), 614 deletions(-) diff --git a/common/loginpage/locale/cs.js b/common/loginpage/locale/cs.js index 5bf0de51b..06b4a443e 100644 --- a/common/loginpage/locale/cs.js +++ b/common/loginpage/locale/cs.js @@ -91,4 +91,21 @@ l10n.cs = { settOptLaunchMode: 'Otevřít soubor', settOptLaunchInTab: 'Na kartě', settOptLaunchInWindow: 'V okně', + settSpellcheckDetection: 'Detekce pravopisu jazyka', + settOptDisabled: 'Vypnuto', + settOptEnabled: 'Povoleno', + aboutChangelog: 'Log změny', + updateNoUpdates: 'Aplikace je aktuální', + updateAvialable: 'K dispozici je verze $1. Klikněte pro stažení.', + settOptThemeSystem: 'Stejné jako systém', + settOptThemeContrastDark: 'Tmavý kontrast', + settAUpdateMode: 'Režim automatické aktualizace', + settOptAUpdateSilent: 'Tichý režim', + settOptAUpdateAsk: 'Požádat o stažení', + updateDownloadFinished: 'Stahování dokončeno. Klikněte pro instalaci', + updateDownloadCanceled: 'Stahování zrušeno', + updateDownloadProgress: 'Stahování $1%. Klikněte pro zastavení', + settOptDescDisabled: "Automatická kontrola aktualizací bude zakázána", + settOptDescAUpdateSilent: "Stáhněte si aktualizace a před instalací se zeptejte", + settOptDescAUpdateAsk: "O všech krocích aktualizace budete informováni.", } \ No newline at end of file diff --git a/common/loginpage/locale/de.js b/common/loginpage/locale/de.js index bd988e94f..19c65bd20 100644 --- a/common/loginpage/locale/de.js +++ b/common/loginpage/locale/de.js @@ -105,4 +105,7 @@ l10n.de = { updateDownloadFinished: 'Herunterladen abgeschlossen. Für Installation hier klicken', updateDownloadCanceled: 'Herunterladen abgebrochen', updateDownloadProgress: '$1% wird heruntergeladen. Zum Abbrechen hier klicken', + settOptDescDisabled: "Die automatische Prüfung von Updates wird deaktiviert", + settOptDescAUpdateSilent: "Updates herunterladen und vor der Installation fragen", + settOptDescAUpdateAsk: "Sie werden über alle Aktualisierungsschritte benachrichtigt", } diff --git a/common/loginpage/locale/fi.js b/common/loginpage/locale/fi.js index df018276c..f8db84207 100644 --- a/common/loginpage/locale/fi.js +++ b/common/loginpage/locale/fi.js @@ -91,4 +91,21 @@ l10n.fi = { settOptLaunchMode: 'Avaa tiedosto', settOptLaunchInTab: 'Välilehdessä', settOptLaunchInWindow: 'Ikkunassa', + settSpellcheckDetection: 'Oikeinkirjoituksen tarkistus', + settOptDisabled: 'Ei käytössä', + settOptEnabled: 'Käytössä', + aboutChangelog: 'Muutosloki', + updateNoUpdates: 'Sovellus on ajan tasalla', + updateAvialable: 'Versio $1 on saatavilla. Klikkaa ladataksesi.', + settOptThemeSystem: 'Sama kuin systeemi', + settOptThemeContrastDark: 'Tumma kontrasti', + settAUpdateMode: 'Automaattinen päivitys-tila', + settOptAUpdateSilent: 'Hiljainen tila', + settOptAUpdateAsk: 'Pyydä lataamista', + updateDownloadFinished: 'Lataus suoritettu. Klikkaa asentaaksesi', + updateDownloadCanceled: 'Lataus peruttu', + updateDownloadProgress: 'Ladataan $1%. Klikkaa lopettaaksesi', + settOptDescDisabled: "Päivitysten automaattinen etsintä poistetaan käytöstä", + settOptDescAUpdateSilent: "Lataa päivitykset ja kysy ennen asennusta", + settOptDescAUpdateAsk: "Sinulle ilmoitetaan kaikista päivitysvaiheista", } diff --git a/common/loginpage/locale/ko.js b/common/loginpage/locale/ko.js index 52a4f612e..42ce13858 100644 --- a/common/loginpage/locale/ko.js +++ b/common/loginpage/locale/ko.js @@ -91,4 +91,21 @@ l10n.ko = { settOptLaunchMode: '파일 열기', settOptLaunchInTab: '탭에서', settOptLaunchInWindow: '창에서', + settSpellcheckDetection: '맞춤법 감지', + settOptDisabled: '비활성화됨', + settOptEnabled: '활성화됨', + aboutChangelog: '체인지로그', + updateNoUpdates: '앱이 최신 상태입니다', + updateAvialable: '$1 버전을 사용할 수 있습니다. 다운로드하려면 클릭하세요.', + settOptThemeSystem: '시스템과 동일', + settOptThemeContrastDark: '콘트라스트 다크', + settAUpdateMode: '자동 업데이트 모드', + settOptAUpdateSilent: '무음 모드', + settOptAUpdateAsk: '다운로드 묻기', + updateDownloadFinished: '다운로드가 완료되었습니다. 설치하려면 클릭하세요', + updateDownloadCanceled: '다운로드가 취소되었습니다', + updateDownloadProgress: '$1% 다운로드 중입니다. 중지하려면 클릭하세요', + settOptDescDisabled: "업데이트 자동 확인이 비활성화됩니다", + settOptDescAUpdateSilent: "업데이트 다운로드 및 설치 전 묻기", + settOptDescAUpdateAsk: "모든 업데이트 단계에 대한 알림을 받게 됩니다", } diff --git a/common/loginpage/locale/nl.js b/common/loginpage/locale/nl.js index 989de9ab3..2724b7ff1 100644 --- a/common/loginpage/locale/nl.js +++ b/common/loginpage/locale/nl.js @@ -1,4 +1,4 @@ -l10n.nl = { +l10n.nl = { welWelcome: 'Welkom bij ONLYOFFICE Desktop Editors!', welDescr: 'Werk offline aan documenten of sluit de suite aan op uw cloud: ONLYOFFICE, ownCloud, Nextcloud.', btnConnect: 'Nu verbinden', @@ -91,4 +91,21 @@ l10n.nl = { settOptLaunchMode: 'Open bestand', settOptLaunchInTab: 'In tabblad', settOptLaunchInWindow: 'In venster', + settSpellcheckDetection: 'Spelling taal detectie', + settOptDisabled: 'Uitgeschakeld', + settOptEnabled: 'Ingeschakeld', + aboutChangelog: 'Changelog', + updateNoUpdates: 'App is up-to-date', + updateAvialable: 'Versie $1 is beschikbaar. Klik om te downloaden.', + settOptThemeSystem: 'Zelfde als systeem', + settOptThemeContrastDark: 'Contrast donker', + settAUpdateMode: 'Automatische updatemodus', + settOptAUpdateSilent: 'Stille modus', + settOptAUpdateAsk: 'Vragen om te downloaden', + updateDownloadFinished: 'Downloaden voltooid. Klik om te installeren', + updateDownloadCanceled: 'Downloaden geannuleerd', + updateDownloadProgress: 'Downloaden van $1%. Klik om te stoppen', + settOptDescDisabled: "Automatisch controleren van updates wordt uitgeschakeld", + settOptDescAUpdateSilent: "Download updates en vraag vóór installatie", + settOptDescAUpdateAsk: "U krijgt bericht over alle update stappen", } diff --git a/common/loginpage/locale/pl.js b/common/loginpage/locale/pl.js index d88480644..ecf73066c 100644 --- a/common/loginpage/locale/pl.js +++ b/common/loginpage/locale/pl.js @@ -91,4 +91,21 @@ l10n.pl = { settOptLaunchMode: 'Otwórz plik', settOptLaunchInTab: 'W nowej zakładce', settOptLaunchInWindow: 'W nowym oknie', + settSpellcheckDetection: 'Wykrywanie języka pisowni', + settOptDisabled: 'Wyłączone', + settOptEnabled: 'Włączone', + aboutChangelog: 'Dziennik zmian', + updateNoUpdates: 'Aplikacja jest aktualna', + updateAvialable: 'Wersja $1 jest dostępna. Kliknij, aby pobrać.', + settOptThemeSystem: 'Systemowy', + settOptThemeContrastDark: 'Kontrastowa czerń', + settAUpdateMode: 'Tryb automatycznych aktualizacji', + settOptAUpdateSilent: 'Tryb cichy', + settOptAUpdateAsk: 'Pytaj przed pobraniem', + updateDownloadFinished: 'Pobieranie zostało zakończone. Kliknij, aby zainstalować', + updateDownloadCanceled: 'Pobieranie zostało anulowane', + updateDownloadProgress: 'Pobieranie $1%. Kliknij, aby zatrzymać', + settOptDescDisabled: "Automatyczne sprawdzanie aktualizacji zostanie wyłączone", + settOptDescAUpdateSilent: "Pobieraj aktualizacje i pytaj przed instalacją", + settOptDescAUpdateAsk: "Otrzymasz powiadomienie na temat wszystkich kroków aktualizacji", } diff --git a/common/loginpage/locale/vi.js b/common/loginpage/locale/vi.js index 5d90474d3..d391d73dc 100644 --- a/common/loginpage/locale/vi.js +++ b/common/loginpage/locale/vi.js @@ -55,6 +55,7 @@ l10n.vi = { actConnectTo: 'Kết nối với đám mây', actActivate: 'Kích hoạt', actAbout: 'Về ứng dụng', + actTemplates: 'Mẫu', actSettings: 'Cài đặt', licKeyHolder: 'nhập mã kích hoạt', btnActivate: 'Kích hoạt', @@ -90,4 +91,21 @@ l10n.vi = { settOptLaunchMode: 'Mở tập tin', settOptLaunchInTab: 'Trong tab', settOptLaunchInWindow: 'Trong window', + settSpellcheckDetection: 'Phát hiện ngôn ngữ chính tả', + settOptDisabled: 'Đã vô hiệu hóa', + settOptEnabled: 'Đã kích hoạt', + aboutChangelog: 'Nhật ký thay đổi', + updateNoUpdates: 'Ứng dụng được cập nhật', + updateAvialable: 'Hiện có phiên bản $1. Nhấp để tải xuống.', + settOptThemeSystem: 'Giống như hệ thống', + settOptThemeContrastDark: 'Tương phản tối', + settAUpdateMode: 'Chế độ tự động cập nhật', + settOptAUpdateSilent: 'Chế độ im lặng', + settOptAUpdateAsk: 'Yêu cầu tải xuống', + updateDownloadFinished: 'Đã tải xong. Nhấp để cài đặt', + updateDownloadCanceled: 'Đã hủy tải xuống', + updateDownloadProgress: 'Đang tải $1%. Nhấp vào để dừng', + settOptDescDisabled: "Tự động kiểm tra cập nhật sẽ bị vô hiệu hóa", + settOptDescAUpdateSilent: "Tải xuống bản cập nhật và hỏi trước khi cài đặt", + settOptDescAUpdateAsk: "Bạn sẽ được thông báo về tất cả các bước cập nhật", } diff --git a/common/loginpage/locale/zh-CN.js b/common/loginpage/locale/zh-CN.js index e1defdf9d..c7b0f4ab8 100644 --- a/common/loginpage/locale/zh-CN.js +++ b/common/loginpage/locale/zh-CN.js @@ -105,4 +105,7 @@ l10n.zh_CN = { updateDownloadFinished: '下载完成。点击安装', updateDownloadCanceled: '下载已取消', updateDownloadProgress: '正在下载 $1%。点击停止', + settOptDescDisabled: "自动检查更新将被禁用", + settOptDescAUpdateSilent: "下载更新并在安装前询问", + settOptDescAUpdateAsk: "您将获得所有更新步骤的通知", } diff --git a/win-linux/langs/cs.ts b/win-linux/langs/cs.ts index 812f39725..0c8303172 100644 --- a/win-linux/langs/cs.ts +++ b/win-linux/langs/cs.ts @@ -303,7 +303,7 @@ Macro-enabled Presentation File (*.pptm) - + Soubor prezentace s podporou maker (*.pptm) @@ -331,27 +331,27 @@ DOCX Document - + Dokument DOCX OpenDocument Document template - + Šablona dokumentu OpenDocument OpenDocument Presentation Template - + Šablona prezentace OpenDocument Macro-enabled spreadsheet template - + Šablona tabulkového procesoru s podporou maker OpenDocument Spreadsheet Template - + Šablona tabulkového procesoru OpenDocument @@ -381,7 +381,7 @@ SVG Image (*.svg) - + Obrázek SVG (*.svg) @@ -465,19 +465,19 @@ Spreadsheet template - + Šablona tabulky Presentation template - + Šablona prezentace Document template - + Šablona dokumentu @@ -523,12 +523,12 @@ More than one document is open.<br>Close the window anyway? - + Je otevřen více než jeden dokument.<br>Zavřít okno i tak? Don't ask again. - + Neptejte se znovu. @@ -635,169 +635,169 @@ Check for updates - + Zkontrolujte aktualizace Unable to check update: URL not defined. - + Nelze zkontrolovat aktualizaci: adresa URL není definována. To finish updating, restart app - + Chcete-li dokončit aktualizaci, restartujte aplikaci Restart - + Restartovat Checking for updates... - + Kontrola aktualizací... Updates are not allowed! - + Aktualizace nejsou povoleny! This folder configuration does not allow for updates! The folder name should be: - + Tato konfigurace složky neumožňuje aktualizace! Název složky by měl být: An error occurred while check updates: Update Service not found! - + Při kontrole aktualizací došlo k chybě: Služba aktualizace nebyla nalezena! Downloading new version %1 (%2%) - + Stahování nové verze %1 (%2%) An error occurred while loading updates: Update Service not found! - + Při načítání aktualizací došlo k chybě: Služba aktualizace nebyla nalezena! Cancel - Storno + Storno An error occurred while loading updates: package Url is empty! - + Při načítání aktualizací došlo k chybě: Url balíčku je prázdný! Update package error: md5 sum does not match the original. - + Chyba aktualizace balíčku: součet md5 neodpovídá originálu. Preparing update... - + Příprava aktualizace... An error occurred while unzip updates: Update Service not found! - + Při rozbalování aktualizací došlo k chybě: Služba aktualizace nebyla nalezena! Update is available (version %1) - + Je k dispozici aktualizace (verze %1) Download update - Stáhnout aktualizaci + Stáhnout aktualizaci Current version is up to date - + Aktuální verze je aktuální An error occured while unpacking the archive - + Při rozbalování archivu došlo k chybě Update download failed: out of memory! - + Stažení aktualizace se nezdařilo: došla paměť! Update download failed: server connection error! - + Stažení aktualizace se nezdařilo: chyba připojení k serveru! Update download failed: wrong URL! - + Stažení aktualizace se nezdařilo: nesprávná URL adresa! Update download failed: unable to create file! - + Stažení aktualizace se nezdařilo: nelze vytvořit soubor! Update download failed: network error! - + Stažení aktualizace se nezdařilo: chyba sítě! A service error has occurred! - + Došlo k chybě služby! Last check performed %1 - + Poslední provedená kontrola %1 Error opening JSON file. - + Chyba při otevírání souboru JSON. Update is available - + Je k dispozici aktualizace Current version - + Aktuální verze Update version - + Aktualizovaná verze Would you like to download update now? - + Chcete si nyní stáhnout aktualizaci? Update is ready to install - + Aktualizace je připravena k instalaci Would you like to restart app now? - + Chcete nyní aplikaci restartovat? A new version of %1 is available! @@ -841,13 +841,13 @@ XML File (*.xml) - + Soubor XML (*.xml) Access to file '%1' is denied! - + Přístup k souboru '%1' je odepřen! @@ -880,7 +880,7 @@ Install later - + Instalace později @@ -915,58 +915,58 @@ An error occurred while start install updates! - + Při zahájení instalace aktualizací došlo k chybě! An error occurred while start replacing files: Update Service not found! - + Při spouštění nahrazování souborů došlo k chybě: Aktualizační služba nebyla nalezena! Cancel - Storno + Storno Yes - Ano + Ano No - Ne + Ne OK - OK + OK Skip - Přeskočit + Přeskočit Buy Now - + Koupit nyní Activate - + Aktivace Continue - + Pokračovat An error occurred while opening the portal:<br>%1 - + Při otevírání portálu došlo k chybě:<br>%1 &OK diff --git a/win-linux/langs/de.ts b/win-linux/langs/de.ts index eef4bde53..d47fffc1b 100644 --- a/win-linux/langs/de.ts +++ b/win-linux/langs/de.ts @@ -335,27 +335,27 @@ DOCX Document - + DOCX-Dokument OpenDocument Document template - + Vorlage eines OpenDocument-Dokuments OpenDocument Presentation Template - + Vorlage einer OpenDocument-Präsentation Macro-enabled spreadsheet template - + Makrofähige Vorlage einer Tabellenkalkulation OpenDocument Spreadsheet Template - + Vorlage einer OpenDocument-Tabellenkalkulation @@ -385,7 +385,7 @@ SVG Image (*.svg) - + SVG-Bild (*.svg) @@ -469,19 +469,19 @@ Spreadsheet template - + Vorlage einer Tabellenkalkulation Presentation template - + Vorlage einer Präsentation Document template - + Vorlage eines Dokuments @@ -527,12 +527,12 @@ More than one document is open.<br>Close the window anyway? - + Mehr als ein Dokument ist geöffnet.<br>Möchten Sie das Fenster trotzdem schließen? Don't ask again. - + Nicht mehr fragen. @@ -639,169 +639,169 @@ Check for updates - + Nach Updates suchen Unable to check update: URL not defined. - + Aktualisierung kann nicht geprüft werden: URL nicht definiert. To finish updating, restart app - + Um die Aktualisierung zu bestätigen, starten Sie die Anwendung neu Restart - + Neu starten Checking for updates... - + Suche nach Updates... Updates are not allowed! - + Keine Updates erlaubt! This folder configuration does not allow for updates! The folder name should be: - + Diese Ordnerkonfiguration erlaubt keine Updates! Der Ordnername sollte sein: An error occurred while check updates: Update Service not found! - + Ein Fehler ist bei der Prüfung von Updates aufgetreten: Aktualisierungsdienst nicht gefunden! Downloading new version %1 (%2%) - + Herunterladen der neuen Version %1 (%2%) An error occurred while loading updates: Update Service not found! - + Ein Fehler ist beim Laden von Updates aufgetreten: Aktualisierungsdienst nicht gefunden! Cancel - Abbrechen + Abbrechen An error occurred while loading updates: package Url is empty! - + Ein Fehler ist beim Laden von Updates aufgetreten: Die URL des Pakets ist leer! Update package error: md5 sum does not match the original. - + Fehler beim Aktualisieren des Pakets: md5-Summe stimmt nicht mit dem ursprünglichen überein. Preparing update... - + Update wird vorbereitet... An error occurred while unzip updates: Update Service not found! - + Beim Entpacken der Updates ist ein Fehler aufgetreten: Aktualisierungsdienst nicht gefunden! Update is available (version %1) - + Update ist verfügbar (Version %1) Download update - Update herunterladen + Update herunterladen Current version is up to date - + Aktuelle Version ist auf dem neuesten Stand An error occured while unpacking the archive - + Beim Entpacken des Archivs ist ein Fehler aufgetreten Update download failed: out of memory! - + Herunterladen des Updates fehlgeschlagen: kein Speicherplatz vorhanden! Update download failed: server connection error! - + Herunterladen des Updates fehlgeschlagen: Fehler bei der Verbindung zum Server! Update download failed: wrong URL! - + Herunterladen des Updates fehlgeschlagen: inkorrekte URL! Update download failed: unable to create file! - + Herunterladen des Updates fehlgeschlagen: Datei kann nicht erstellt werden! Update download failed: network error! - + Herunterladen des Updates fehlgeschlagen: Netzwerkfehler! A service error has occurred! - + Beim Service ist ein Fehler aufgetreten! Last check performed %1 - + Letzte Suche durchgeführt %1 Error opening JSON file. - + Fehler beim Öffnen der JSON-Datei. Update is available - + Update ist verfügbar Current version - + Aktuelle Version Update version - + Aktualisierte Version Would you like to download update now? - + Möchten Sie das Update jetzt herunterladen? Update is ready to install - + Update ist bereit zur Installation Would you like to restart app now? - + Möchten Sie die Anwendung jetzt neu starten? A new version of %1 is available! @@ -845,13 +845,13 @@ XML File (*.xml) - + XML-Datei (*.xml) Access to file '%1' is denied! - + Der Zugriff auf die Datei '%1' ist verweigert! @@ -884,7 +884,7 @@ Install later - + Später installieren @@ -919,58 +919,58 @@ An error occurred while start install updates! - + Ein Fehler ist beim Starten der Installation von Updates aufgetreten! An error occurred while start replacing files: Update Service not found! - + Ein Fehler ist beim Starten des Ersetzens von Dateien aufgetreten: Aktualisierungsdienst nicht gefunden! Cancel - Abbrechen + Abbrechen Yes - Ja + Ja No - Nein + Nein OK - OK + OK Skip - Auslassen + Auslassen Buy Now - + Jetzt kaufen Activate - + Aktivieren Continue - + Fortfahren An error occurred while opening the portal:<br>%1 - + Ein Fehler ist beim Öffnen des Portals aufgetreten: <br>%1 &OK diff --git a/win-linux/langs/fi.ts b/win-linux/langs/fi.ts index ead93d618..c7dc58f13 100644 --- a/win-linux/langs/fi.ts +++ b/win-linux/langs/fi.ts @@ -95,7 +95,7 @@ Open Document - Avoin Dokumentti + Avoin Dokumentti @@ -179,7 +179,7 @@ There are no printers available - + Ei tulostimia saatavilla @@ -287,7 +287,7 @@ Macro-enabled Presentation File (*.pptm) - + Makrokäyttöinen esitysmalli (*pptm) @@ -315,27 +315,27 @@ DOCX Document - + DOCX-asiakirja OpenDocument Document template - + OpenDocument-malli OpenDocument Presentation Template - + OpenDocument-esitysmalli Macro-enabled spreadsheet template - + Makrokäyttöinen laskentataulukkomalli OpenDocument Spreadsheet Template - + OpenDocument-taulukkolaskentamalli @@ -365,12 +365,12 @@ SVG Image (*.svg) - + SVG-kuva (*.svg) JPG Image (*.jpg *.jpeg) - + JPG-kuva (*.jpg *.jpeg) @@ -443,25 +443,25 @@ All supported files - + Kaikki tuetut tiedostot Spreadsheet template - + Laskentataulukkomalli Presentation template - + Esitysmalli Document template - + Asiakirjamalli @@ -499,7 +499,7 @@ Select Folder - + Valitse kansio @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + Useampi kuin yksi asiakirja on auki. <br>Sulje ikkuna silti? Don't ask again. - + Älä kysy enää. File format not supported. - Tiedoston tyyppi ei ole tuettu. + Tiedoston tyyppi ei ole tuettu. %1 doesn't exists!<br>Remove file from the list? - %1 ei ole saatavilla. Se voi olla nimetty uudelleen, siirretty tai poistettu.<br>Haluatko poistaa tiedoston listalta? + %1 ei ole saatavilla. Se voi olla nimetty uudelleen, siirretty tai poistettu.<br>Haluatko poistaa tiedoston listalta? Document must be saved firstly. - Dokumentti tulee tallentaa ensin. + Dokumentti tulee tallentaa ensin. Document must be saved to continue.<br>Save the document? - Dokumentti on tallennettava ennen jatkamista.<br>Tallennetaanko dokumentti? + Dokumentti on tallennettava ennen jatkamista.<br>Tallennetaanko dokumentti? There are no printers available - + Ei tulostimia saatavilla Print Document - Tulosta dokumentti + Tulosta dokumentti Sign Up - Luo portaali + Luo portaali %1 is modified.<br>Do you want to keep changes? - %1 on muokattu.<br>Haluatko tallentaa muutokset? + %1 on muokattu.<br>Haluatko tallentaa muutokset? @@ -615,169 +615,169 @@ Check for updates - + Tarkista päivityksiä Unable to check update: URL not defined. - + Päivitystä ei voida tarkistaa: URL ei määritetty. To finish updating, restart app - + Käynnistä sovellus uudelleen viimeistelläksesi päivityksen Restart - + Käynnistä uudelleen Checking for updates... - + Tarkistetaan päivityksiä... Updates are not allowed! - + Päivityksiä ei hyväksytä! This folder configuration does not allow for updates! The folder name should be: - + Tämä kansiokokoonpano ei salli päivityksiä! Kansion nimi tulisi olla: An error occurred while check updates: Update Service not found! - + Virhe päivitysten tarkastamisessa: Päivityspalvelua ei löytynyt! Downloading new version %1 (%2%) - + Ladataan uutta versiota %1 (%2%) An error occurred while loading updates: Update Service not found! - + Virhe päivityksiä ladatessa: Päivityspalvelua ei löytynyt! Cancel - Peruuta + Peruuta An error occurred while loading updates: package Url is empty! - + Virhe päivityksiä ladatessa: paketin URL on tyhjä! Update package error: md5 sum does not match the original. - + Päivityksen pakkausvirhe: md5 sum ei vastaa alkuperäistä. Preparing update... - + Valmistellaan päivitystä... An error occurred while unzip updates: Update Service not found! - + Virhe päivitysten purkamisessa: Päivityspalvelua ei löytynyt! Update is available (version %1) - + Päivitys on saatavilla (versio %1) Download update - + Lataa päivitys Current version is up to date - + Nykyinen versio on ajantasalla An error occured while unpacking the archive - + Virhe arkiston purkamisessa Update download failed: out of memory! - + Päivityksen lataus epäonnistui: muisti loppu! Update download failed: server connection error! - + Päivityksen lataus epäonnistui: palvelimen yhteysvirhe! Update download failed: wrong URL! - + Päivityksen lataus epäonnistui: väärä URL! Update download failed: unable to create file! - + Päivityksen lataus epäonnistui: Tiedostoa ei voi luoda! Update download failed: network error! - + Päivityksen lataus epäonnistui: verkkovirhe! A service error has occurred! - + Palveluvirhe! Last check performed %1 - + Viimeisin tarkistus suoritettu %1 Error opening JSON file. - + Virhe JSON-tiedostoa avatessa. Update is available - + Päivitys on saatavilla Current version - + Nykyinen versio Update version - + Päivitä versio Would you like to download update now? - + Haluaisitko nyt ladata päivityksen? Update is ready to install - + Päivitys on valmiina asennettavaksi Would you like to restart app now? - + Haluaisitko nyt käynnistää sovelluksen uudelleen? @@ -805,128 +805,128 @@ XML File (*.xml) - + XML-tiedosto (*.xml) Access to file '%1' is denied! - + Pääsy tiedostoon '%1' evätty! Read only - + Vain luku Skip this version - + Ohita tämä versio Remind me later - + Muistuta minua myöhemmin Install update - + Asenna päivitys Install later - + Asenna myöhemmin Save and Restart Now - + Tallenna ja käynnistä nyt uudelleen Save and Install Now - + Tallenna ja asenna Nyt Download update - + Lataa päivitys Software Update - + Ohjelmistopäivitys Release notes - + Julkaisutiedot An error occurred while start install updates! - + Virhe päivitysten asentamisen aloittamisessa! An error occurred while start replacing files: Update Service not found! - + Virhe tiedostojen korvaamisessa: Päivityspalvelua ei löytynyt! Cancel - Peruuta + Peruuta Yes - Kyllä + Kyllä No - Ei + Ei OK - OK + OK Skip - + Ohita Buy Now - + Osta nyt Activate - + Aktivoi Continue - + Jatka An error occurred while opening the portal:<br>%1 - + Virhe portaalia avatessa: <br>%1 &OK diff --git a/win-linux/langs/ko.ts b/win-linux/langs/ko.ts index 9bdd416e2..9896b6058 100644 --- a/win-linux/langs/ko.ts +++ b/win-linux/langs/ko.ts @@ -91,7 +91,7 @@ Open Document - 문서 열기 + 문서 열기 @@ -175,7 +175,7 @@ There are no printers available - + 사용 가능한 프린터가 없습니다 @@ -283,7 +283,7 @@ Macro-enabled Presentation File (*.pptm) - + 매크로 지원 프레젠테이션 파일(*.pptm) @@ -311,27 +311,27 @@ DOCX Document - + DOCX 문서 OpenDocument Document template - + OpenDocument 문서 템플릿 OpenDocument Presentation Template - + OpenDocument 프레젠테이션 템플릿 Macro-enabled spreadsheet template - + 매크로 지원 스프레드시트 템플릿 OpenDocument Spreadsheet Template - + OpenDocument 스프레드시트 템플릿 @@ -361,12 +361,12 @@ SVG Image (*.svg) - + SVG 이미지(*.svg) JPG Image (*.jpg *.jpeg) - + JPG 이미지(*.jpg *.jpeg) @@ -439,25 +439,25 @@ All supported files - + 지원되는 모든 파일 Spreadsheet template - + 스프레드시트 템플릿 Presentation template - + 프레젠테이션 템플릿 Document template - + 문서 템플릿 @@ -495,7 +495,7 @@ Select Folder - + 폴더 선택 @@ -503,53 +503,53 @@ More than one document is open.<br>Close the window anyway? - + 두 개 이상의 문서가 열려 있습니다.<br>그래도 창을 닫으시겠습니까? Don't ask again. - + 다시 표시 안함. File format not supported. - 지원되지 않는 파일 형식입니다. + 지원되지 않는 파일 형식입니다. %1 doesn't exists!<br>Remove file from the list? - %1이 이용 불가합니다. 이름이 변경되었거나, 이동되었거나, 삭제된 것 같습니다.<br>목록에서 파일을 제거하시겠습니까? + %1이 이용 불가합니다. 이름이 변경되었거나, 이동되었거나, 삭제된 것 같습니다.<br>목록에서 파일을 제거하시겠습니까? Document must be saved firstly. - 문서를 먼저 저장해야 합니다. + 문서를 먼저 저장해야 합니다. Document must be saved to continue.<br>Save the document? - 계속하려면 문서를 저장해야 합니다.<br>문서를 저장하시겠습니까? + 계속하려면 문서를 저장해야 합니다.<br>문서를 저장하시겠습니까? There are no printers available - + 사용 가능한 프린터가 없습니다 Print Document - 문서 인쇄 + 문서 인쇄 Sign Up - 포털 생성 + 포털 생성 %1 is modified.<br>Do you want to keep changes? - %1이 수정되었습니다.<br>변경 사항을 저장하시겠습니까? + %1이 수정되었습니다.<br>변경 사항을 저장하시겠습니까? @@ -611,169 +611,169 @@ Check for updates - + 업데이트 확인 Unable to check update: URL not defined. - + 업데이트를 확인할 수 없습니다: URL이 정의되지 않았습니다. To finish updating, restart app - + 업데이트를 완료하려면 앱을 다시 시작하세요 Restart - + 다시 시작 Checking for updates... - + 업데이트 확인 중... Updates are not allowed! - + 업데이트가 허용되지 않습니다! This folder configuration does not allow for updates! The folder name should be: - + 이 폴더 구성에서는 업데이트가 허용되지 않습니다! 폴더 이름은 다음과 같아야 합니다: An error occurred while check updates: Update Service not found! - + 업데이트를 확인하는 동안 오류가 발생했습니다: 업데이트 서비스를 찾을 수 없습니다! Downloading new version %1 (%2%) - + 새버전 %1 (%2%) 다운로드 중 An error occurred while loading updates: Update Service not found! - + 업데이트를 로드하는 중 오류가 발생했습니다: 업데이트 서비스를 찾을 수 없습니다! Cancel - 취소 + 취소 An error occurred while loading updates: package Url is empty! - + 업데이트를 로드하는 중 오류가 발생했습니다: 패키지 URL이 비어 있습니다! Update package error: md5 sum does not match the original. - + 업데이트 패키지 오류입니다: md5 합계가 원본과 일치하지 않습니다. Preparing update... - + 업데이트 준비 중... An error occurred while unzip updates: Update Service not found! - + 업데이트 압축을 푸는 동안 오류가 발생했습니다: 업데이트 서비스를 찾을 수 없습니다! Update is available (version %1) - + 업데이트할 수 있습니다(버전 %1) Download update - + 업데이트 다운로드 Current version is up to date - + 현재 버전이 최신입니다 An error occured while unpacking the archive - + 아카이브 압축을 푸는 중 오류가 발생했습니다 Update download failed: out of memory! - + 업데이트 다운로드에 실패했습니다: 메모리가 부족합니다! Update download failed: server connection error! - + 업데이트다운로드에 실패했습니다: 서버 연결 오류입니다! Update download failed: wrong URL! - + 업데이트다운로드에 실패했습니다: 잘못된 URL입니다! Update download failed: unable to create file! - + 업데이트 다운로드에 실패했습니다: 파일을 생성할 수 없습니다! Update download failed: network error! - + 업데이트 다운로드에 실패했습니다: 네트워크 오류가 발생했습니다! A service error has occurred! - + 서비스 오류가 발생했습니다! Last check performed %1 - + 마지막 확인이 수행되었습니다 %1 Error opening JSON file. - + JSON 파일을 여는 동안 오류가 발생했습니다. Update is available - + 업데이트할 수 있습니다 Current version - + 현재 버전 Update version - + 버전 업데이트 Would you like to download update now? - + 지금 업데이트를 다운로드하시겠습니까? Update is ready to install - + 업데이트 설치가 준비되었습니다 Would you like to restart app now? - + 지금 앱을 다시 시작하시겠습니까? @@ -801,128 +801,128 @@ XML File (*.xml) - + XML 파일(*.xml) Access to file '%1' is denied! - + '%1' 파일에 대한 액세스가 거부되었습니다! Read only - + 읽기 전용 Skip this version - + 이 버전 건너뛰기 Remind me later - + 나중에 다시 표시 Install update - + 업데이트 설치 Install later - + 나중에 설치 Save and Restart Now - + 저장 후 지금 다시 시작 Save and Install Now - + 저장 후 지금 설치 Download update - + 업데이트 다운로드 Software Update - + 소프트웨어 업데이트 Release notes - + 릴리즈 노트 An error occurred while start install updates! - + 업데이트 설치를 시작하는 동안 오류가 발생했습니다! An error occurred while start replacing files: Update Service not found! - + 파일 교체를 시작하는 동안 오류가 발생했습니다: 업데이트 서비스를 찾을 수 없습니다! Cancel - 취소 + 취소 Yes - + No - 아니오 + 아니오 OK - 확인 + 확인 Skip - + 건너뛰기 Buy Now - + 지금 구매 Activate - + 활성화 Continue - + 계속 An error occurred while opening the portal:<br>%1 - + 포털을 여는 동안 오류가 발생했습니다:<br>%1 &OK diff --git a/win-linux/langs/nl.ts b/win-linux/langs/nl.ts index 37424bf42..cab53648e 100644 --- a/win-linux/langs/nl.ts +++ b/win-linux/langs/nl.ts @@ -95,7 +95,7 @@ Open Document - Document openen + Document openen @@ -179,7 +179,7 @@ There are no printers available - + Er zijn geen printers beschikbaar @@ -287,7 +287,7 @@ Macro-enabled Presentation File (*.pptm) - + Presentatiebestand met macro's (*.pptm) @@ -315,27 +315,27 @@ DOCX Document - + DOCX document OpenDocument Document template - + OpenDocument Document Sjabloon OpenDocument Presentation Template - + OpenDocument Presentatie Sjabloon Macro-enabled spreadsheet template - + Sjabloon Voor Spreadsheet Met Macro'S OpenDocument Spreadsheet Template - + OpenDocument Spreadsheet Sjabloon @@ -365,17 +365,17 @@ SVG Image (*.svg) - + SVG-afbeelding (*.svg) JPG Image (*.jpg *.jpeg) - + JPG-afbeelding (*.jpg *.jpeg) PNG Image (*.png) - PNG-afbeelding (. png) + PNG-afbeelding (*.png) @@ -443,25 +443,25 @@ All supported files - + Alle ondersteunde bestanden Spreadsheet template - + Spreadsheet sjabloon Presentation template - + Presentatie sjabloon Document template - + Document sjabloon @@ -499,7 +499,7 @@ Select Folder - + Selecteer Map @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + Er is meer dan één document geopend.<br>Het venster toch sluiten? Don't ask again. - + Niet opnieuw vragen. File format not supported. - Bestandsformaat wordt niet ondersteund. + Bestandsformaat wordt niet ondersteund. %1 doesn't exists!<br>Remove file from the list? - %1 is niet beschikbaar. Het is misschien hernoemd, verplaatst of verwijderd.<br>Wilt u het bestand van de lijst verwijderen?? + %1 is niet beschikbaar. Het is misschien hernoemd, verplaatst of verwijderd.<br>Wilt u het bestand van de lijst verwijderen?? Document must be saved firstly. - Het document moet eerst worden opgeslagen. + Het document moet eerst worden opgeslagen. Document must be saved to continue.<br>Save the document? - The Document moet worden opgeslagen om verder te kunnen gaan.<br>Document opslaan? + The Document moet worden opgeslagen om verder te kunnen gaan.<br>Document opslaan? There are no printers available - + Er zijn geen printers beschikbaar Print Document - Print document + Print document Sign Up - Portaal aanmaken + Portaal aanmaken %1 is modified.<br>Do you want to keep changes? - %1 is aangepast.<br>Wilt u de veranderingen opslaan? + %1 is aangepast.<br>Wilt u de veranderingen opslaan? @@ -615,169 +615,169 @@ Check for updates - + Controleer op updates Unable to check update: URL not defined. - + Kan update niet controleren: URL niet gedefinieerd. To finish updating, restart app - + Start de app opnieuw op om het bijwerken af te ronden Restart - + Opnieuw opstarten Checking for updates... - + Controleren op updates... Updates are not allowed! - + Updates zijn niet toegestaan! This folder configuration does not allow for updates! The folder name should be: - + Deze mapconfiguratie staat geen updates toe! De naam van de map zou moeten zijn: An error occurred while check updates: Update Service not found! - + Er is een fout opgetreden tijdens het controleren van updates: Update Service niet gevonden! Downloading new version %1 (%2%) - + Downloaden van nieuwe versie %1 (%2%) An error occurred while loading updates: Update Service not found! - + Er is een fout opgetreden tijdens het laden van updates: Update Service niet gevonden! Cancel - Annuleren + Annuleren An error occurred while loading updates: package Url is empty! - + Er is een fout opgetreden tijdens het laden van updates: pakket Url is leeg! Update package error: md5 sum does not match the original. - + Fout update pakket: md5 som komt niet overeen met origineel. Preparing update... - + Update voorbereiden... An error occurred while unzip updates: Update Service not found! - + Er is een fout opgetreden tijdens het uitpakken van updates: Update Service niet gevonden! Update is available (version %1) - + Update is beschikbaar (versie %1) Download update - + Download update Current version is up to date - + Huidige versie is up-to-date An error occured while unpacking the archive - + Er is een fout opgetreden tijdens het uitpakken van het archief Update download failed: out of memory! - + Downloaden van update mislukt: te weinig geheugen! Update download failed: server connection error! - + Downloaden van update mislukt: serververbindingsfout! Update download failed: wrong URL! - + Downloaden van update mislukt: verkeerde URL! Update download failed: unable to create file! - + Downloaden van update mislukt: kan bestand niet aanmaken! Update download failed: network error! - + Downloaden van update mislukt: netwerkfout! A service error has occurred! - + Er is een servicefout opgetreden! Last check performed %1 - + Laatst uitgevoerde controle %1 Error opening JSON file. - + Fout bij het openen van JSON-bestand. Update is available - + Update is beschikbaar Current version - + Huidige versie Update version - + Versie bijwerken Would you like to download update now? - + Wilt u update nu downloaden? Update is ready to install - + Update is klaar om te installeren Would you like to restart app now? - + Wilt u de app nu opnieuw starten? @@ -805,128 +805,128 @@ XML File (*.xml) - + XML Bestand (*.xml) Access to file '%1' is denied! - + Toegang tot %1' bestand is geweigerd! Read only - + Alleen lezen Skip this version - + Sla deze versie over Remind me later - + Herinner me later Install update - + Installeer update Install later - + Installeren op een later tijdstip Save and Restart Now - + Nu opslaan en Opnieuw Opstarten Save and Install Now - Installeren + Nu Opslaan en Installeren Download update - + Download update Software Update - + Software Update Release notes - + Release notes An error occurred while start install updates! - + Er is een fout opgetreden tijdens het installeren van updates! An error occurred while start replacing files: Update Service not found! - + Er is een fout opgetreden tijdens het vervangen van bestanden: Update Service niet gevonden! Cancel - Annuleren + Annuleren Yes - Ja + Ja No - Nee + Nee OK - OK + OK Skip - + Overslaan Buy Now - + Koop Nu Activate - + Activeer Continue - + Doorgaan An error occurred while opening the portal:<br>%1 - + Er is een fout opgetreden bij het openen van het portaal:<br>%1 &OK diff --git a/win-linux/langs/pl.ts b/win-linux/langs/pl.ts index 3b9b1ef65..20c46e2c8 100644 --- a/win-linux/langs/pl.ts +++ b/win-linux/langs/pl.ts @@ -95,7 +95,7 @@ Open Document - Otwórz Dokument + Otwórz Dokument @@ -179,7 +179,7 @@ There are no printers available - + Brak dostępnych drukarek @@ -287,7 +287,7 @@ Macro-enabled Presentation File (*.pptm) - + Plik prezentacji z obsługą makr (*.pptm) @@ -315,27 +315,27 @@ DOCX Document - + Dokument DOCX OpenDocument Document template - + Szablon Dokumentu OpenDocument OpenDocument Presentation Template - + Szablon Prezentacji OpenDocument Macro-enabled spreadsheet template - + Szablon arkusza kalkulacyjnego z obsługą makr OpenDocument Spreadsheet Template - + Szablon arkusza kalkulacyjnego OpenDocument @@ -365,12 +365,12 @@ SVG Image (*.svg) - + Obraz SVG (*.svg) JPG Image (*.jpg *.jpeg) - + Obraz JPG (*.jpg *.jpeg) @@ -443,25 +443,25 @@ All supported files - + Wszystkie obsługiwane pliki Spreadsheet template - + Szablon arkusza kalkulacyjnego Presentation template - + Szablon prezentacji Document template - + Szablon dokumentu @@ -499,7 +499,7 @@ Select Folder - + Wybierz katalog @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + Masz więcej niż jeden otwarty dokument. <br>Nadal chcesz zamknąć okno? Don't ask again. - + Nie pytaj ponownie. File format not supported. - Nieobsługiwany format pliku. + Nieobsługiwany format pliku. %1 doesn't exists!<br>Remove file from the list? - %1 jest niedostępny. Został przeniesiony, usunięty lub zmieniono jego nazwę.<br>Czy chcesz usunąć plik z listy? + %1 jest niedostępny. Został przeniesiony, usunięty lub zmieniono jego nazwę.<br>Czy chcesz usunąć plik z listy? Document must be saved firstly. - Dokument musi być najpierw zapisany. + Dokument musi być najpierw zapisany. Document must be saved to continue.<br>Save the document? - Dokument musi być zapisany, aby kontynuować.<br>Zapisać dokument? + Dokument musi być zapisany, aby kontynuować.<br>Zapisać dokument? There are no printers available - + Brak dostępnych drukarek Print Document - Drukuj dokument + Drukuj dokument Sign Up - Utwórz pakiet w chmurze + Utwórz pakiet w chmurze %1 is modified.<br>Do you want to keep changes? - %1 został zmieniony.<br>Czy chcesz zapisać zmiany? + %1 został zmieniony.<br>Czy chcesz zapisać zmiany? @@ -615,169 +615,169 @@ Check for updates - + Sprawdzanie dostępności aktualizacji Unable to check update: URL not defined. - + Nie można sprawdzić aktualizacji: Nie zdefiniowano URL. To finish updating, restart app - + Aby zakończyć aktualizację, zrestartuj aplikację Restart - + Uruchom ponownie Checking for updates... - + Trwa sprawdzanie dostępności aktualizacji… Updates are not allowed! - + Aktualizacje są zabronione! This folder configuration does not allow for updates! The folder name should be: - + Konfiguracja niniejszego katalogu nie pozwala na aktualizacje! Nazwa katalogu powinna: An error occurred while check updates: Update Service not found! - + Wystąpił błąd podczas sprawdzania aktualizacji: nie znaleziono usługi aktualizacji! Downloading new version %1 (%2%) - + Pobieranie nowej wersji %1 (%2%) An error occurred while loading updates: Update Service not found! - + Wystąpił błąd podczas ładowania aktualizacji: nie znaleziono usługi aktualizacji! Cancel - Anuluj + Anuluj An error occurred while loading updates: package Url is empty! - + Wystąpił błąd podczas ładowania aktualizacji: adres URL pakietu jest pusty! Update package error: md5 sum does not match the original. - + Błąd aktualizacji: suma md5 nie pasuje do oryginału. Preparing update... - + Przygotowywanie aktualizacji... An error occurred while unzip updates: Update Service not found! - + Wystąpił błąd podczas rozpakowywania aktualizacji: nie znaleziono usługi aktualizacji! Update is available (version %1) - + Aktualizacja jest dostępna (wersja %1) Download update - + Pobierz aktualizację Current version is up to date - + Bieżąca wersja jest aktualna An error occured while unpacking the archive - + Wystąpił błąd podczas rozpakowywania archiwum Update download failed: out of memory! - + Pobieranie aktualizacji nie powiodło się: brak pamięci! Update download failed: server connection error! - + Pobieranie aktualizacji nie powiodło się: błąd połączenia z serwerem! Update download failed: wrong URL! - + Pobieranie aktualizacji nie powiodło się: nieprawidłowy adres URL! Update download failed: unable to create file! - + Pobieranie aktualizacji nie powiodło się: nie można utworzyć pliku! Update download failed: network error! - + Pobieranie aktualizacji nie powiodło się: błąd sieci! A service error has occurred! - + Wystąpił błąd usługi! Last check performed %1 - + Ostatnia kontrola została przeprowadzona %1 Error opening JSON file. - + Błąd podczas otwierania pliku JSON. Update is available - + Aktualizacja jest dostępna Current version - + Bieżąca wersja Update version - + Wersja aktualizacji Would you like to download update now? - + Chcesz pobrać aktualizację? Update is ready to install - + Aktualizacja jest gotowa do zainstalowania Would you like to restart app now? - + Chcesz zrestartować aplikację? @@ -805,128 +805,128 @@ XML File (*.xml) - + Plik XML (*.xml) Access to file '%1' is denied! - + Odmowa dostępu do pliku '%1'! Read only - + Tylko do odczytu Skip this version - + Pomiń tę wersję Remind me later - + Przypomnij mi później Install update - + Zainstaluj aktualizację Install later - + Zainstaluj później Save and Restart Now - + Zapisz i uruchom ponownie teraz Save and Install Now - Zainstalować + Zapisz i zainstaluj teraz Download update - + Pobierz aktualizację Software Update - + Aktualizacja oprogramowania Release notes - + Informacje o wersji An error occurred while start install updates! - + Wystąpił błąd podczas rozpoczynania instalacji aktualizacji! An error occurred while start replacing files: Update Service not found! - + Wystąpił błąd podczas rozpoczynania zastępowania plików: nie znaleziono usługi aktualizacji! Cancel - Anuluj + Anuluj Yes - Tak + Tak No - Nie + Nie OK - OK + OK Skip - + Pomiń Buy Now - + Kup teraz Activate - + Aktywuj Continue - + Dalej An error occurred while opening the portal:<br>%1 - + Wystąpił błąd podczas otwierania portalu:<br>%1 &OK diff --git a/win-linux/langs/pt_PT.ts b/win-linux/langs/pt_PT.ts index 08f8c9e14..fa5e93342 100644 --- a/win-linux/langs/pt_PT.ts +++ b/win-linux/langs/pt_PT.ts @@ -95,7 +95,7 @@ Open Document - Abrir Documento + Abrir Documento @@ -179,7 +179,7 @@ There are no printers available - + Não há impressoras disponíveis @@ -287,7 +287,7 @@ Macro-enabled Presentation File (*.pptm) - + Arquivo de apresentação habilitado para macro (*.pptm) @@ -315,27 +315,27 @@ DOCX Document - + Documento DOCX OpenDocument Document template - + Modelo de documento OpenDocument OpenDocument Presentation Template - + Modelo de apresentação OpenDocument Macro-enabled spreadsheet template - + Modelo de planilha habilitado para macro OpenDocument Spreadsheet Template - + Modelo de planilha OpenDocument @@ -365,12 +365,12 @@ SVG Image (*.svg) - + Imagem SVG (*.svg) JPG Image (*.jpg *.jpeg) - + Imagem JPG (*.jpg *.jpeg) @@ -443,25 +443,25 @@ All supported files - + Todos os arquivos suportados Spreadsheet template - + Modelo de planilha Presentation template - + Modelo de apresentação Document template - + Modelo de documento @@ -499,7 +499,7 @@ Select Folder - + Selecione a pasta @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + Mais de um documento está aberto.<br>Fechar a janela mesmo assim? Don't ask again. - + Não pergunte novamente. File format not supported. - O Formato do Ficheiro não é suportado. + O Formato do Ficheiro não é suportado. %1 doesn't exists!<br>Remove file from the list? - %1 não está disponível. Ele pode ter sido renomeado, movido de lugar ou apagado.<br>Deseja remover o ficheiro da lista? + %1 não está disponível. Ele pode ter sido renomeado, movido de lugar ou apagado.<br>Deseja remover o ficheiro da lista? Document must be saved firstly. - O documento tem de ser guardado primeiro. + O documento tem de ser guardado primeiro. Document must be saved to continue.<br>Save the document? - Tem de guardar o documento para continuar.<br>Guardar o documento? + Tem de guardar o documento para continuar.<br>Guardar o documento? There are no printers available - + Não há impressoras disponíveis Print Document - Imprimir documento + Imprimir documento Sign Up - Criar Portal + Criar Portal %1 is modified.<br>Do you want to keep changes? - %1 foi modificado.<br>Quer guardar as alterações? + %1 foi modificado.<br>Quer guardar as alterações? @@ -615,169 +615,169 @@ Check for updates - + Verifique se há atualizações Unable to check update: URL not defined. - + Não foi possível verificar a atualização: URL não definido. To finish updating, restart app - + Para terminar a atualização, reinicie o aplicativo Restart - + Reiniciar Checking for updates... - + Verificando atualizações... Updates are not allowed! - + Atualizações não são permitidas! This folder configuration does not allow for updates! The folder name should be: - + Esta configuração de pasta não permite atualizações! O nome da pasta deve ser: An error occurred while check updates: Update Service not found! - + Ocorreu um erro ao verificar atualizações: Serviço de atualização não encontrado! Downloading new version %1 (%2%) - + Baixando a nova versão%1 (%2%) An error occurred while loading updates: Update Service not found! - + Ocorreu um erro ao carregar atualizações: Serviço de atualização não encontrado! Cancel - Cancelar + Cancelar An error occurred while loading updates: package Url is empty! - + Ocorreu um erro ao carregar atualizações: o URL do pacote está vazio! Update package error: md5 sum does not match the original. - + Erro no pacote de atualização: a soma md5 não corresponde ao original. Preparing update... - + Preparando atualização... An error occurred while unzip updates: Update Service not found! - + Ocorreu um erro ao descompactar atualizações: Serviço de atualização não encontrado! Update is available (version %1) - + A atualização está disponível (versão %1) Download update - + Baixar atualização Current version is up to date - + Current version is up to date An error occured while unpacking the archive - + Ocorreu um erro ao descompactar o arquivo Update download failed: out of memory! - + Falha no download da atualização: sem memória! Update download failed: server connection error! - + Falha no download da atualização: erro de conexão do servidor! Update download failed: wrong URL! - + Falha no download da atualização: URL errado! Update download failed: unable to create file! - + Falha no download da atualização: não foi possível criar o arquivo! Update download failed: network error! - + Falha no download da atualização: erro de rede! A service error has occurred! - + Ocorreu um erro de serviço! Last check performed %1 - + Última verificação realizada %1 Error opening JSON file. - + Erro ao abrir arquivo JSON. Update is available - + A atualização está disponível Current version - + Versão Atual Update version - + Versão atualizada Would you like to download update now? - + Gostaria de baixar a atualização agora? Update is ready to install - + A atualização está pronta para ser instalada Would you like to restart app now? - + Gostaria de reiniciar o aplicativo agora? @@ -805,128 +805,128 @@ XML File (*.xml) - + XML File (*.xml) Access to file '%1' is denied! - + Acesso ao arquivo '%1' negado! Read only - + Somente leitura Skip this version - + Pular esta versão Remind me later - + Lembre-me mais tarde Install update - + Instalar atualização Install later - + Instale depois Save and Restart Now - + Salve e reinicie agora Save and Install Now - + Salve e instale agora Download update - + Baixar atualização Software Update - + Atualização de software Release notes - + Notas de lançamento An error occurred while start install updates! - + Ocorreu um erro ao iniciar a instalação das atualizações! An error occurred while start replacing files: Update Service not found! - + Ocorreu um erro ao iniciar a substituição de arquivos: Serviço de atualização não encontrado! Cancel - Cancelar + Cancelar Yes - Sim + Sim No - Não + Não OK - OK + OK Skip - + Pular Buy Now - + Comprar agora Activate - + Ativar Continue - + Continuar An error occurred while opening the portal:<br>%1 - + Ocorreu um erro ao abrir o portal:<br>%1 &OK diff --git a/win-linux/langs/vi.ts b/win-linux/langs/vi.ts index 7ce6c1580..8b47c668b 100644 --- a/win-linux/langs/vi.ts +++ b/win-linux/langs/vi.ts @@ -95,7 +95,7 @@ Open Document - Mở tài liệu + Mở tài liệu @@ -179,7 +179,7 @@ There are no printers available - + Không có máy in nào @@ -287,7 +287,7 @@ Macro-enabled Presentation File (*.pptm) - + Tập tin Bản Trình chiếu hỗ trợ macro (*.pptm) @@ -315,27 +315,27 @@ DOCX Document - + Tài liệu DOCX OpenDocument Document template - + Mẫu Tài liệu OpenDocument OpenDocument Presentation Template - + Mẫu Trình chiếu OpenDocument Macro-enabled spreadsheet template - + Mẫu Bảng tính hỗ trợ macro OpenDocument Spreadsheet Template - + Mẫu Bảng tính OpenDocument @@ -365,12 +365,12 @@ SVG Image (*.svg) - + Hình ảnh SVG (*.svg) JPG Image (*.jpg *.jpeg) - + Hình ảnh JPG (*.jpg *.jpeg) @@ -443,25 +443,25 @@ All supported files - + Tất cả tập tin được hỗ trợ Spreadsheet template - + Mẫu bảng tính Presentation template - + Mẫu trình chiếu Document template - + Mẫu tài liệu @@ -499,7 +499,7 @@ Select Folder - + Chọn thư mục @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + Hơn một tài liệu đang mở.<br>Bạn vẫn muốn đóng cửa sổ? Don't ask again. - + Không hỏi lại. File format not supported. - Định dạng tập tin không được hỗ trợ. + Định dạng tập tin không được hỗ trợ. %1 doesn't exists!<br>Remove file from the list? - Không có %1. Có thể nó đã được đổi tên, chuyển đi hay xóa.<br>Bạn có muốn xóa tập tin này khỏi danh sách không? + Không có %1. Có thể nó đã được đổi tên, chuyển đi hay xóa.<br>Bạn có muốn xóa tập tin này khỏi danh sách không? Document must be saved firstly. - Cần lưu tài liệu trước. + Cần lưu tài liệu trước. Document must be saved to continue.<br>Save the document? - Phải lưu tài liệu để tiếp tục.<br>Lưu tài liệu? + Phải lưu tài liệu để tiếp tục.<br>Lưu tài liệu? There are no printers available - + Không có máy in nào Print Document - In tài liệu + In tài liệu Sign Up - Tạo cổng + Tạo cổng %1 is modified.<br>Do you want to keep changes? - %1 đã được chỉnh sửa.<br>Bạn có muốn lưu thay đổi không?? + %1 đã được chỉnh sửa.<br>Bạn có muốn lưu thay đổi không?? @@ -615,169 +615,169 @@ Check for updates - + Kiểm tra bản cập nhật Unable to check update: URL not defined. - + Không thể kiểm tra cập nhật: URL không được xác định. To finish updating, restart app - + Để hoàn tất cập nhật, hãy khởi động lại ứng dụng Restart - + Khởi động lại Checking for updates... - + Đang kiểm tra bản cập nhật… Updates are not allowed! - + Không được phép cập nhật! This folder configuration does not allow for updates! The folder name should be: - + Cấu hình thư mục này không cho phép cập nhật! Tên thư mục phải là: An error occurred while check updates: Update Service not found! - + Đã xảy ra lỗi khi kiểm tra cập nhật: Không tìm thấy Dịch vụ Cập nhật! Downloading new version %1 (%2%) - + Đang tải xuống phiên bản mới %1 (%2%) An error occurred while loading updates: Update Service not found! - + Đã xảy ra lỗi khi tải cập nhật: Không tìm thấy Dịch vụ Cập nhật! Cancel - Hủy + Hủy An error occurred while loading updates: package Url is empty! - + Đã xảy ra lỗi khi tải cập nhật: URL gói trống! Update package error: md5 sum does not match the original. - + Lỗi gói cập nhật: tổng md5 không khớp với bản gốc. Preparing update... - + Đang chuẩn bị cập nhật... An error occurred while unzip updates: Update Service not found! - + Đã xảy ra lỗi khi giải nén cập nhật: Không tìm thấy Dịch vụ Cập nhật! Update is available (version %1) - + Đã có bản cập nhật (phiên bản %1) Download update - + Tải xuống bản cập nhật Current version is up to date - + Phiên bản hiện tại đã được cập nhật An error occured while unpacking the archive - + Đã xảy ra lỗi khi giải nén kho lưu trữ Update download failed: out of memory! - + Tải xuống cập nhật không thành công: hết bộ nhớ! Update download failed: server connection error! - + Tải xuống cập nhật không thành công: lỗi kết nối máy chủ! Update download failed: wrong URL! - + Tải xuống cập nhật không thành công: URL sai! Update download failed: unable to create file! - + Tải xuống cập nhật không thành công: không thể tạo tập tin! Update download failed: network error! - + Tải xuống cập nhật không thành công: lỗi mạng! A service error has occurred! - + Đã xảy ra lỗi dịch vụ! Last check performed %1 - + Lần kiểm tra cuối cùng được thực hiện %1 Error opening JSON file. - + Lỗi mở tập tin JSON. Update is available - + Đã có bản cập nhật Current version - + Phiên bản hiện tại Update version - + Phiên bản cập nhật Would you like to download update now? - + Bạn có muốn tải xuống ngay bây giờ không? Update is ready to install - + Bản cập nhật đã sẵn sàng để được cài đặt Would you like to restart app now? - + Bạn có muốn khởi động lại ứng dụng ngay bây giờ không? @@ -805,128 +805,128 @@ XML File (*.xml) - + Tập tin XML (*.xml) Access to file '%1' is denied! - + Truy cập vào tập tin '%1' bị từ chối! Read only - + Chỉ đọc Skip this version - + Bỏ qua phiên bản này Remind me later - + Nhắc tôi sau Install update - + Cài đặt bản cập nhật Install later - + Cài đặt sau Save and Restart Now - + Lưu và Khởi động lại ngay Save and Install Now - Cài đặt + Lưu và Cài đặt ngay Download update - + Tải xuống bản cập nhật Software Update - + Cập nhật Phần mềm Release notes - + Ghi chú phát hành An error occurred while start install updates! - + Đã xảy ra lỗi khi bắt đầu cài đặt bản cập nhật! An error occurred while start replacing files: Update Service not found! - + Đã xảy ra lỗi khi bắt đầu thay thế các tập tin: Không tìm thấy Dịch vụ cập nhật! Cancel - Hủy + Hủy Yes - + No - Không + Không OK - OK + OK Skip - + Bỏ qua Buy Now - + Mua ngay Activate - + Kích Hoạt Continue - + Tiếp tục An error occurred while opening the portal:<br>%1 - + Đã xảy ra lỗi khi mở cổng thông tin:<br> %1 &OK diff --git a/win-linux/langs/zh_CN.ts b/win-linux/langs/zh_CN.ts index 6f3042926..f1325d817 100644 --- a/win-linux/langs/zh_CN.ts +++ b/win-linux/langs/zh_CN.ts @@ -737,47 +737,47 @@ An error occured while unpacking the archive - + 解压压缩包时发生错误 Update download failed: out of memory! - + 更新下载失败:内存不足! Update download failed: server connection error! - + 更新下载失败:服务器连接错误! Update download failed: wrong URL! - + 更新下载失败:URL 错误! Update download failed: unable to create file! - + 更新下载失败:无法创建文件! Update download failed: network error! - + 更新下载失败:网络错误! A service error has occurred! - + 发生服务错误! Last check performed %1 - + 最后一次检查 %1 Error opening JSON file. - + 打开 JSON 文件时出错。 From 2f83d93a16d3e968ddba39b98d6ab7c3567e19d6 Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Tue, 28 Nov 2023 18:18:45 +0300 Subject: [PATCH 009/316] added translations --- common/loginpage/locale/da.js | 1 + common/loginpage/locale/et.js | 18 ++++ common/loginpage/locale/gl.js | 18 ++++ common/loginpage/locale/hi.js | 17 ++++ common/loginpage/locale/hr.js | 18 ++++ common/loginpage/locale/hu.js | 17 ++++ common/loginpage/locale/id.js | 18 ++++ common/loginpage/locale/sl.js | 2 +- common/loginpage/locale/sv.js | 17 ++++ common/loginpage/locale/zh-TW.js | 3 + win-linux/langs/ca.ts | 16 +-- win-linux/langs/da.ts | 118 +++++++++++----------- win-linux/langs/et.ts | 164 +++++++++++++++---------------- win-linux/langs/gl.ts | 164 +++++++++++++++---------------- win-linux/langs/hr.ts | 164 +++++++++++++++---------------- win-linux/langs/sl.ts | 18 ++-- win-linux/langs/sv.ts | 164 +++++++++++++++---------------- win-linux/langs/zh_TW.ts | 120 +++++++++++----------- 18 files changed, 592 insertions(+), 465 deletions(-) diff --git a/common/loginpage/locale/da.js b/common/loginpage/locale/da.js index 8eaac73cc..a6e7ffdfa 100644 --- a/common/loginpage/locale/da.js +++ b/common/loginpage/locale/da.js @@ -56,6 +56,7 @@ l10n.da = { actActivate: 'Aktiver', actAbout: 'Om', actSettings: 'Indstillinger', + actTemplates: 'Skabeloner', licKeyHolder: 'indtast aktiveringsnøgle', btnActivate: 'Aktiver', licGetLicense: 'Få licens nu', diff --git a/common/loginpage/locale/et.js b/common/loginpage/locale/et.js index 1a4dbe314..8a70c6cb8 100644 --- a/common/loginpage/locale/et.js +++ b/common/loginpage/locale/et.js @@ -56,6 +56,7 @@ l10n.et = { actActivate: 'Aktiveeri', actAbout: 'Meist', actSettings: 'Seaded', + actTemplates: 'Mallid', licKeyHolder: 'sisestusklahv', btnActivate: 'Aktiveeri', licGetLicense: 'Saa litsents kohe', @@ -90,4 +91,21 @@ l10n.et = { settOptLaunchMode: 'Ava fail', settOptLaunchInTab: 'Vahekaardil', settOptLaunchInWindow: 'Eraldi aknas', + settSpellcheckDetection: 'Keele õigekirja tuvastamine', + settOptDisabled: 'Keelatud', + settOptEnabled: 'Lubatud', + aboutChangelog: 'Muutuste logi', + updateNoUpdates: 'Rakendus on ajakohane', + updateAvialable: 'Versioon $1 on saadaval. Allalaadimiseks kliki siia.', + settOptThemeSystem: 'Süsteemiga sama', + settOptThemeContrastDark: 'Kontrastne tume', + settAUpdateMode: 'Automaatsete uuenduste režiim', + settOptAUpdateSilent: 'Vaikne režiim', + settOptAUpdateAsk: 'Küsi allalaadimist', + updateDownloadFinished: 'Allalaadimine on lõpetatud. Paigaldamiseks vajutage siia', + updateDownloadCanceled: 'Allalaadimine on tühistatud', + updateDownloadProgress: 'Allalaadimine $1%. Lõpetamiseks vajutage siia', + settOptDescDisabled: "Automaatne uuenduste kontrollimine keelatakse", + settOptDescAUpdateSilent: "Uuenduste allalaadimine ja küsimine enne paigaldamist", + settOptDescAUpdateAsk: "Teid teavitatakse kõikidest uuenduste sammudest", } diff --git a/common/loginpage/locale/gl.js b/common/loginpage/locale/gl.js index 5920c1333..3033bac49 100644 --- a/common/loginpage/locale/gl.js +++ b/common/loginpage/locale/gl.js @@ -56,6 +56,7 @@ l10n.gl = { actActivate: 'Activar', actAbout: 'Sobre', actSettings: 'Configuración', + actTemplates: 'Modelos', licKeyHolder: 'clave de activación de entrada', btnActivate: 'Activar', licGetLicense: 'Consiga unha licenza agora', @@ -90,4 +91,21 @@ l10n.gl = { settOptLaunchMode: 'Abrir ficheiro', settOptLaunchInTab: 'Na lapela', settOptLaunchInWindow: 'Na xanela', + settSpellcheckDetection: 'Detección do idioma ortográfico', + settOptDisabled: 'Desactivado', + settOptEnabled: 'Activado', + aboutChangelog: 'Rexistro de cambios', + updateNoUpdates: 'A aplicación está actualizada', + updateAvialable: 'A versión $1 está dispoñible. Faga clic para descargar.', + settOptThemeSystem: 'Igual que o sistema', + settOptThemeContrastDark: 'Contraste escuro', + settAUpdateMode: 'Modo de actualización automática', + settOptAUpdateSilent: 'Modo silencioso', + settOptAUpdateAsk: 'Preguntar para descargar', + updateDownloadFinished: 'Descarga finalizada. Faga clic para instalar', + updateDownloadCanceled: 'Descarga cancelada', + updateDownloadProgress: 'Descargando $1%. Faga clic para deter', + settOptDescDisabled: "A verificación automática de actualizacións estará desactivada", + settOptDescAUpdateSilent: "Descargar actualizacións e preguntar antes de instalalas", + settOptDescAUpdateAsk: "Notificaráselle sobre todos os pasos de actualización", } diff --git a/common/loginpage/locale/hi.js b/common/loginpage/locale/hi.js index 51ddf95de..d69867003 100644 --- a/common/loginpage/locale/hi.js +++ b/common/loginpage/locale/hi.js @@ -91,4 +91,21 @@ l10n.hi = { settOptLaunchMode: 'फ़ाइल खोलें', settOptLaunchInTab: 'टैब में', settOptLaunchInWindow: 'विंडो में', + settSpellcheckDetection: 'वर्तनी की भाषा का पता लगाना', + settOptDisabled: 'अक्षम', + settOptEnabled: 'सक्षम', + aboutChangelog: 'लॉगबदलें', + updateNoUpdates: 'ऐप अद्यतित है', + updateAvialable: '$1 संस्करण उपलब्ध है। डाउनलोड करने के लिए क्लिक करें।', + settOptThemeSystem: 'सिस्टम के समान है', + settOptThemeContrastDark: 'कॉन्ट्रास्ट डार्क', + settAUpdateMode: 'स्वतः अद्यतन मोड', + settOptAUpdateSilent: 'मौन मोड', + settOptAUpdateAsk: 'डाउनलोड करने के लिए पूछें', + updateDownloadFinished: 'डाउनलोड पूरा हुआ। इंस्टॉल करने के लिए क्लिक करें।', + updateDownloadCanceled: 'डाउनलोड रद्द हुआ', + updateDownloadProgress: '$1% डाउनलोड हो रहा है। रोकने के लिए क्लिक करें।', + settOptDescDisabled: "स्वतः जाँच अपडेट अक्षम होंगे", + settOptDescAUpdateSilent: "अपडेट डाउनलोड करें और इंस्टॉल करने के पहले पूछें", + settOptDescAUpdateAsk: "आपको सभी अपडेट चरणों के बारे में सूचित किया जाएगा", } diff --git a/common/loginpage/locale/hr.js b/common/loginpage/locale/hr.js index 32093d3d4..baa7201ea 100644 --- a/common/loginpage/locale/hr.js +++ b/common/loginpage/locale/hr.js @@ -56,6 +56,7 @@ l10n.hr = { actActivate: 'Aktiviraj', actAbout: 'O nama', actSettings: 'Postavke', + actTemplates: 'Predlošci', licKeyHolder: 'ključ za aktivaciju ulaznih podataka', btnActivate: 'Aktiviraj', licGetLicense: 'Nabavi licencu sada', @@ -90,4 +91,21 @@ l10n.hr = { settOptLaunchMode: 'Otvori datoteku', settOptLaunchInTab: 'U kartici', settOptLaunchInWindow: 'U prozoru', + settSpellcheckDetection: 'Prepoznavanje pravopisa jezika', + settOptDisabled: 'Onemogućeno', + settOptEnabled: 'Omogućeno', + aboutChangelog: 'Zapis promjena', + updateNoUpdates: 'Aplikacija je ažurirana', + updateAvialable: 'Verzija $1 je dostupna. Kliknite za preuzimanje.', + settOptThemeSystem: 'Isto kao u sustavu', + settOptThemeContrastDark: 'Kontrastno tamno', + settAUpdateMode: 'Način automatskog ažuriranja', + settOptAUpdateSilent: 'Nečujni način', + settOptAUpdateAsk: 'Pitaj za preuzimanje', + updateDownloadFinished: 'Preuzimanje je dovršeno. Kliknite za instalaciju', + updateDownloadCanceled: 'Preuzimanje je otkazano', + updateDownloadProgress: 'Preuzimanje $1%. Kliknite za zaustavljanje', + settOptDescDisabled: "Automatska provjera ažuriranja bit će onemogućena", + settOptDescAUpdateSilent: "Preuzmi ažuriranja i pitaj prije instalacije", + settOptDescAUpdateAsk: "Bit ćete obaviješteni o svim koracima ažuriranja", } diff --git a/common/loginpage/locale/hu.js b/common/loginpage/locale/hu.js index 58382ca2f..948776425 100644 --- a/common/loginpage/locale/hu.js +++ b/common/loginpage/locale/hu.js @@ -91,4 +91,21 @@ l10n.hu = { settOptLaunchMode: 'Fájl megnyitása', settOptLaunchInTab: 'Lapon', settOptLaunchInWindow: 'Ablakban', + settSpellcheckDetection: 'Beviteli nyelv felismerése', + settOptDisabled: 'Letiltva', + settOptEnabled: 'Engedélyezve', + aboutChangelog: 'Változásnapló', + updateNoUpdates: 'Az alkalmazás naprakész', + updateAvialable: '$1 verzió elérhető. Kattintson a letöltéshez.', + settOptThemeSystem: 'Ugyanaz, mint a rendszerben', + settOptThemeContrastDark: 'Sötét kontraszt', + settAUpdateMode: 'Automatikus frissítés mód', + settOptAUpdateSilent: 'Csendes mód', + settOptAUpdateAsk: 'Letöltés jóváhagyási kérés', + updateDownloadFinished: 'A letöltés befejeződött. Kattintson a telepítéshez', + updateDownloadCanceled: 'Letöltés törölve', + updateDownloadProgress: '$1% letöltése. Kattintson a leállításhoz', + settOptDescDisabled: "A frissítések automatikus ellenőrzése le lesz tiltva", + settOptDescAUpdateSilent: "Frissítések letöltése és jóváhagyás kérése telepítés előtt", + settOptDescAUpdateAsk: "A frissítés minden lépéséről értesítést fog kapni", } diff --git a/common/loginpage/locale/id.js b/common/loginpage/locale/id.js index 10df56f9a..bfc29480e 100644 --- a/common/loginpage/locale/id.js +++ b/common/loginpage/locale/id.js @@ -56,6 +56,7 @@ l10n.id = { actActivate: 'Aktivasi', actAbout: 'Tentang', actSettings: 'Pengaturan', + actTemplates: 'Template', licKeyHolder: 'masukkan kunci aktivasi', btnActivate: 'Aktivasi', licGetLicense: 'Dapatkan lisensi sekarang', @@ -90,4 +91,21 @@ l10n.id = { settOptLaunchMode: 'Buka file', settOptLaunchInTab: 'Di tab', settOptLaunchInWindow: 'Di jendela', + settSpellcheckDetection: 'Deteksi bahasa ejaan', + settOptDisabled: 'Nonaktifkan', + settOptEnabled: 'Aktifkan', + aboutChangelog: 'Log perubahan', + updateNoUpdates: 'App sudah versi terbaru', + updateAvialable: 'Versi $1 tersedia. Klik untuk download.', + settOptThemeSystem: 'Sama seperti sistem', + settOptThemeContrastDark: 'Kontras Gelap', + settAUpdateMode: 'Mode Autoupdate', + settOptAUpdateSilent: 'Mode senyap', + settOptAUpdateAsk: 'Minta untuk download', + updateDownloadFinished: 'Download selesai. Klik untuk instalasi', + updateDownloadCanceled: 'Download batal', + updateDownloadProgress: 'Mendownload $1%. Klik untuk berhenti', + settOptDescDisabled: "Cek update otomatis akan dihentikan", + settOptDescAUpdateSilent: "Download update dan tanya sebelum instalasi", + settOptDescAUpdateAsk: "Anda akan mendapatkan notifikasi langkah untuk melakukan update", } diff --git a/common/loginpage/locale/sl.js b/common/loginpage/locale/sl.js index 85bf0f651..fd050ed5d 100644 --- a/common/loginpage/locale/sl.js +++ b/common/loginpage/locale/sl.js @@ -10,7 +10,7 @@ l10n.sl = { btnNext: 'Naprej', portalEmptyTitle: 'Poveži se s svojim oblakom', portalEmptyDescr: 'Shrani svoje dokumente v oblak in do njih dostopaj kadarkoli in od koderkoli. Deli jih in upravljaj skupaj z drugimi. Klepetaj preko dokumenta, dodajaj komentarje, deli dokument z drugimi za pregledovanje.', - portalEmptyAdv1: 'Še nimaš računa v oblaku? Pridruži se spletu s storitvijo ONLYOFFICE v oblaku in
brezplačno preizkusi zmogljivost in uporabnost.', + portalEmptyAdv1: 'Še nimaš računa v oblaku? Pridruži se spletu s storitvijo ONLYOFFICE v oblaku in
brezplačno preizkusi zmogljivost in uporabnost.', portalListTitle: 'Povezani oblaki', textNoFiles: 'Tukaj ni nobenih datotek', listRecoveryTitle: 'Obnovi datoteke', diff --git a/common/loginpage/locale/sv.js b/common/loginpage/locale/sv.js index 35e10bd87..0f7576e6a 100644 --- a/common/loginpage/locale/sv.js +++ b/common/loginpage/locale/sv.js @@ -91,4 +91,21 @@ l10n.sv = { settOptLaunchMode: 'Öppna fil', settOptLaunchInTab: 'I flik', settOptLaunchInWindow: 'I fönster', + settSpellcheckDetection: 'Språkidentifiering', + settOptDisabled: 'Inaktiverad', + settOptEnabled: 'Aktiverad', + aboutChangelog: 'Ändringslogg', + updateNoUpdates: 'Appen är uppdaterad', + updateAvialable: 'Version $1 är tillgänglig. Klicka för att ladda ner.', + settOptThemeSystem: 'Samma som systemet', + settOptThemeContrastDark: 'Mörkt tema', + settAUpdateMode: 'Automatisk uppdatering', + settOptAUpdateSilent: 'Tyst läge', + settOptAUpdateAsk: 'Fråga om nedladdning', + updateDownloadFinished: 'Nedladdningen är slutförd. Klicka för att installera', + updateDownloadCanceled: 'Nedladdningen är avbruten', + updateDownloadProgress: 'Laddar ner $1%. Klicka för att avbryta', + settOptDescDisabled: "Automatisk sökning efter uppdateringar kommer att inaktiveras", + settOptDescAUpdateSilent: "Ladda ner uppdateringar och fråga innan installation", + settOptDescAUpdateAsk: "Du kommer att meddelas om alla steg i uppdateringen", } diff --git a/common/loginpage/locale/zh-TW.js b/common/loginpage/locale/zh-TW.js index 8c8ce0334..d43df8175 100644 --- a/common/loginpage/locale/zh-TW.js +++ b/common/loginpage/locale/zh-TW.js @@ -105,4 +105,7 @@ l10n.zh_TW = { updateDownloadFinished: '下載完成, 點擊安裝', updateDownloadCanceled: '下載已取消', updateDownloadProgress: '正在下載$1%。 點擊停止', + settOptDescDisabled: "自動檢查更新將被停用", + settOptDescAUpdateSilent: "下載更新並在安裝前詢問", + settOptDescAUpdateAsk: "您將收到所有更新步驟的相關通知", } diff --git a/win-linux/langs/ca.ts b/win-linux/langs/ca.ts index bdcb36466..80043a23f 100644 --- a/win-linux/langs/ca.ts +++ b/win-linux/langs/ca.ts @@ -705,37 +705,37 @@ An error occured while unpacking the archive - + S'ha produït un error en desempaquetar l'arxiu Update download failed: out of memory! - + Ha fallat la baixada de l'actualització: no hi ha memoria! Update download failed: server connection error! - + Ha fallat la baixada de l'actualització: error de connexió del servidor! Update download failed: wrong URL! - + Ha fallat la baixada de l'actualització: URL incorrecte! Update download failed: unable to create file! - + Ha fallat la baixada de l'actualització: no s'ha pogut crear el fitxer! Update download failed: network error! - + Ha fallat la baixada de l'actualització: error de xarxa! A service error has occurred! - + S'ha produït un error de servei! @@ -745,7 +745,7 @@ Error opening JSON file. - + Error en obrir l'arxiu JSON. diff --git a/win-linux/langs/da.ts b/win-linux/langs/da.ts index 5e7cd40f0..7b44dfce5 100644 --- a/win-linux/langs/da.ts +++ b/win-linux/langs/da.ts @@ -299,7 +299,7 @@ Macro-enabled Presentation File (*.pptm) - + Macro-enabled præsentationsfil (*.pptm) @@ -327,27 +327,27 @@ DOCX Document - + DOCX-dokument OpenDocument Document template - + OpenDocument dokumentskabelon OpenDocument Presentation Template - + OpenDocument præsentationsskabelon Macro-enabled spreadsheet template - + Macro-enabled regnearksskabelon OpenDocument Spreadsheet Template - + OpenDocument regnearksskabelon @@ -377,7 +377,7 @@ SVG Image (*.svg) - + SVG-billede (*.svg) @@ -461,19 +461,19 @@ Spreadsheet template - + Regnearkskabelon Presentation template - + Præsentationsskabelon Document template - + Dokumentskabelon @@ -519,12 +519,12 @@ More than one document is open.<br>Close the window anyway? - + Mere end et document er åbent.<br>Ønsker at lukke vinduet alligevel? Don't ask again. - + Spørg ikke igen. @@ -631,169 +631,169 @@ Check for updates - + Tjek for opdateringer Unable to check update: URL not defined. - + Kunne ikke tjekke opdatering: URL ikke defineret. To finish updating, restart app - + Genstart appen for at afslutte opdatering Restart - + Genstart Checking for updates... - + Tjekker for opdateringer… Updates are not allowed! - + Opdateringer er ikke tilladt! This folder configuration does not allow for updates! The folder name should be: - + Denne mappekonfiguration tillader ikke opdateringer! Mappens navn skal være: An error occurred while check updates: Update Service not found! - + En fejl opstod under kontrol af opdateringer: Tjeneste ikke fundet! Downloading new version %1 (%2%) - + Downloader ny version %1 (%2%) An error occurred while loading updates: Update Service not found! - + En fejl opstod under indlæsning af opdateringer: Tjeneste ikke fundet! Cancel - Annuller + Annuller An error occurred while loading updates: package Url is empty! - + En fejl opstod under indlæsning af opdateringer: Pakke-URL er tom! Update package error: md5 sum does not match the original. - + Fejl i opdateringspakke: md5 sum matcher ikke den originale. Preparing update... - + Forbereder opdatering… An error occurred while unzip updates: Update Service not found! - + Der opstod en fejl under udpakning af opdateringer: Opdateringstjeneste ikke fundet! Update is available (version %1) - + Opdatering er tilgængelig (version %1) Download update - Download opdatering + Download opdatering Current version is up to date - + Den aktuelle version er opdateret An error occured while unpacking the archive - + En fejl opstod under udpakning af arkivet Update download failed: out of memory! - + Download af opdatering mislykkedes: hukommelsen er opbrugt! Update download failed: server connection error! - + Download af opdatering mislykkedes: fejl i serverforbindelsen! Update download failed: wrong URL! - + Download af opdatering mislykkedes: forkert URL! Update download failed: unable to create file! - + Download af opdatering mislykkedes: kunne ikke oprette fil! Update download failed: network error! - + Download af opdatering mislykkedes: netværksfejl! A service error has occurred! - + Der opstod en tjenestefejl! Last check performed %1 - + Sidste tjek udført %1 Error opening JSON file. - + Fejl under åbning af JSON-fil. Update is available - + Opdatering er tilgængelig Current version - + Aktuel version Update version - + pdateringsversion Would you like to download update now? - + Ønsker du at downloade opdateringen nu? Update is ready to install - + Opdatering er klar til at blive installeret Would you like to restart app now? - + Ønsker du at genstarte appen nu? A new version of %1 is available! @@ -837,13 +837,13 @@ XML File (*.xml) - + XML-dokument (*.xml) Access to file '%1' is denied! - + Adgang til filen %1 er nægtet! @@ -876,7 +876,7 @@ Install later - + Installer senere @@ -911,58 +911,58 @@ An error occurred while start install updates! - + En fejl opstod under påbegyndelsen af installering af opdateringer! An error occurred while start replacing files: Update Service not found! - + En fejl opstod under påbegyndelsen af erstatning af filer: Opdateringstjeneste ikke fundet! Cancel - Annuller + Annuller Yes - Ja + Ja No - Nej + Nej OK - OK + OK Skip - Spring over + Spring over Buy Now - + Køb nu Activate - + Aktiver Continue - + Fortsæt An error occurred while opening the portal:<br>%1 - + En fejl opstod under åbningen af portalen:<br>%1 &OK diff --git a/win-linux/langs/et.ts b/win-linux/langs/et.ts index e6e4de1cd..87faf1869 100644 --- a/win-linux/langs/et.ts +++ b/win-linux/langs/et.ts @@ -95,7 +95,7 @@ Open Document - Ava dokument + Ava dokument @@ -179,7 +179,7 @@ There are no printers available - + Printereid ei ole saadaval
@@ -287,7 +287,7 @@ Macro-enabled Presentation File (*.pptm) - + Makrotoega esitlusfail (*.pptm) @@ -315,27 +315,27 @@ DOCX Document - + DOCX dokument OpenDocument Document template - + OpenDocument dokumendi mall OpenDocument Presentation Template - + OpenDocument esitlusmall Macro-enabled spreadsheet template - + Makrotoega arvutustabeli mall OpenDocument Spreadsheet Template - + OpenDocument arvutustabeli mall @@ -365,12 +365,12 @@ SVG Image (*.svg) - + SVG-pilt (*.svg) JPG Image (*.jpg *.jpeg) - + JPG-pilt (*.jpg *.jpeg) @@ -443,25 +443,25 @@ All supported files - + Kõik toetatud failid Spreadsheet template - + Arvutustabeli mall Presentation template - + Esitlusmall Document template - + Dokumendi mall @@ -499,7 +499,7 @@ Select Folder - + Vaige fail @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + Rohkem kui üks dokument on avatus.<br>Soovite siiski akna sulgeda? Don't ask again. - + Ära enam küsi. File format not supported. - Faili formaati ei toetata. + Faili formaati ei toetata. %1 doesn't exists!<br>Remove file from the list? - %1 ei ole saadaval. Ta võib olla uue nimega, muudetud või kustutatud.<br> Kas sa soovid faili listist eemaldada? + %1 ei ole saadaval. Ta võib olla uue nimega, muudetud või kustutatud.<br> Kas sa soovid faili listist eemaldada? Document must be saved firstly. - Dokument tuleb enne salvestada. + Dokument tuleb enne salvestada. Document must be saved to continue.<br>Save the document? - Dokument tuleb salvestada, et jätkata.<br>Salvestasid dokumendi? + Dokument tuleb salvestada, et jätkata.<br>Salvestasid dokumendi? There are no printers available - + Printereid ei ole saadaval Print Document - Prindi dokument + Prindi dokument Sign Up - Loo portaal + Loo portaal %1 is modified.<br>Do you want to keep changes? - %1 on muudetud.<br>Kas sa tahad muutused salvestada? + %1 on muudetud.<br>Kas sa tahad muutused salvestada? @@ -615,169 +615,169 @@ Check for updates - + Kontrolli uuendusi Unable to check update: URL not defined. - + Ei saa uuendust kontrollida: URL ei ole selge. To finish updating, restart app - + Uuendamise lõpetuseks tehke rakendusele restart Restart - + Restart Checking for updates... - + Kontrollin uuendusi... Updates are not allowed! - + Uuendused pole lubatud! This folder configuration does not allow for updates! The folder name should be: - + Selle faili konfiguratsioon ei toeta uuendusi! Faili nimi peaks olema: An error occurred while check updates: Update Service not found! - + Uuenduste kontrollimisel tekkis viga: uuendusteenust ei leitud! Downloading new version %1 (%2%) - + Uue versiooni alla laadimine %1 (%2%) An error occurred while loading updates: Update Service not found! - + Uuenduste laadimisel tekkis viga: uuendusteenust ei leitud! Cancel - Tühista + Tühista An error occurred while loading updates: package Url is empty! - + Uuenduste laadimisel tekkis viga: paki URL on tühi! Update package error: md5 sum does not match the original. - + Uenduspaki viga: md5 summa ei toeta originaali. Preparing update... - + Valmistan uuendust ette... An error occurred while unzip updates: Update Service not found! - + Uuenduste lahtipakkimisel tekkis viga: uuendusteenuste ei leitud! Update is available (version %1) - + Uuendus on saadaval (versioon %1) Download update - + Lae uuendus alla Current version is up to date - + Praegune versioon on ajakohane An error occured while unpacking the archive - + Arhiivi lahtipakkimisel tekkis viga Update download failed: out of memory! - + Uuenduse allalaadimine ebaõnnestus: mälu on täis! Update download failed: server connection error! - + Uuenduse allalaadimine ebaõnnestus: serveri ühenduse viga! Update download failed: wrong URL! - + Uuenduse allalaadimine ebaõnnestus: vale URL! Update download failed: unable to create file! - + Uuenduse allalaadimine ebaõnnestus: faili loomine ebaõnnestus! Update download failed: network error! - + Uuenduse allalaadimine ebaõnnestus: võrgu viga! A service error has occurred! - + Tekkis teenuse viga! Last check performed %1 - + Viimane kontroll tehtud %1 Error opening JSON file. - + Viga JSON faili avamisel. Update is available - + Uuendus on saadaval Current version - + Praegune versioon Update version - + Uuenda versiooni Would you like to download update now? - + Kas soovite uuenduse kohe alla laadida? Update is ready to install - + Uuendus on paigaldamiseks valmis Would you like to restart app now? - + Kas soovite kohe rakendusele restarti teha? @@ -790,7 +790,7 @@ File %1 cannot be opened or doesn't exists. - + Faili %1 ei saa avada või seda ei eksisteeri. @@ -801,128 +801,128 @@ XML File (*.xml) - + XML fail (*.xml) Access to file '%1' is denied! - + Ligipääs failile '%1' on keelatud! Read only - + Ainult lugemiseks Skip this version - + Jäta see versioon vahele Remind me later - + Tuleta hiljem meelde Install update - + Paigalda uuendus Install later - + Paigalda hiljem Save and Restart Now - + Salvesta ja tee restart kohe Save and Install Now - + Salvesta ja paigalda kohe Download update - + Lae uuendus alla Software Update - + Tarkvara uuendus Release notes - + Vabasta märkmed An error occurred while start install updates! - + Paigaldusuuenduste alustamisel tekkis viga! An error occurred while start replacing files: Update Service not found! - + Failide asendamise alustamisel tekkis viga: uuendusteenust ei leitud! Cancel - Tühista + Tühista Yes - Jah + Jah No - Ei + Ei OK - OK + OK Skip - + Jäta vahele Buy Now - + Osta nüüd Activate - + Aktiveeri Continue - + Jätka An error occurred while opening the portal:<br>%1 - + Portaali avamisel tekkis viga:<br>%1 &OK diff --git a/win-linux/langs/gl.ts b/win-linux/langs/gl.ts index 8d18bbcd2..d569c747d 100644 --- a/win-linux/langs/gl.ts +++ b/win-linux/langs/gl.ts @@ -95,7 +95,7 @@ Open Document - Abrir documento + Abrir documento @@ -179,7 +179,7 @@ There are no printers available - + Non hai impresoras dispoñibles @@ -287,7 +287,7 @@ Macro-enabled Presentation File (*.pptm) - + Arquivo de presentación habilitado para macros (*.pptm) @@ -315,27 +315,27 @@ DOCX Document - + Documento DOCX OpenDocument Document template - + Modelo de documento OpenDocument OpenDocument Presentation Template - + Modelo presentación OpenDocument Macro-enabled spreadsheet template - + Modelo de folla de cálculo habilitada para macros OpenDocument Spreadsheet Template - + Modelo de folla de cálculo OpenDocument @@ -365,12 +365,12 @@ SVG Image (*.svg) - + Imaxe SVG (*.svg) JPG Image (*.jpg *.jpeg) - + Imaxe JPG (*.jpg *.jpeg) @@ -443,25 +443,25 @@ All supported files - + Todos os arquivos compatibles Spreadsheet template - + Modelo de folla de cálculo Presentation template - + Modelo de presentación Document template - + Modelo de documento @@ -499,7 +499,7 @@ Select Folder - + Seleccione Cartafol @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + Hai máis dun documento aberto.<br>Pechar a xanela de todos os xeitos? Don't ask again. - + Non volver preguntar. File format not supported. - O formato ficheiro non está soportado. + O formato ficheiro non está soportado. %1 doesn't exists!<br>Remove file from the list? - %1 non está dispoñible. Puido ser renomeado, movio ou eliminado.<br>Quere eliminar o ficheiro da lista? + %1 non está dispoñible. Puido ser renomeado, movio ou eliminado.<br>Quere eliminar o ficheiro da lista? Document must be saved firstly. - O documento débese gardar primeiro. + O documento débese gardar primeiro. Document must be saved to continue.<br>Save the document? - O documento ten que gardarse para poder continuar.<br>Gardar o documento? + O documento ten que gardarse para poder continuar.<br>Gardar o documento? There are no printers available - + Non hai impresoras dispoñibles Print Document - Imprimir documento + Imprimir documento Sign Up - Crear portal + Crear portal %1 is modified.<br>Do you want to keep changes? - Modificouse %1<br>Queres gardar os cambios? + Modificouse %1<br>Queres gardar os cambios? @@ -615,169 +615,169 @@ Check for updates - + Buscar actualizacións Unable to check update: URL not defined. - + Non se pode verificar a actualización: URL non definida. To finish updating, restart app - + Para finalizar a actualización, reinicie a aplicación Restart - + Renovar Checking for updates... - + Comprobando actualizacións... Updates are not allowed! - + Non se permiten actualizacións! This folder configuration does not allow for updates! The folder name should be: - + Esta configuración de cartafol non permite actualizacións! O nome do cartafol debe ser: An error occurred while check updates: Update Service not found! - + Produciuse un erro ao verificar as actualizacións: Non se atopou o servizo de actualización! Downloading new version %1 (%2%) - + Descargando nova versión %1 (%2%) An error occurred while loading updates: Update Service not found! - + Produciuse un erro ao cargar as actualizacións: Servizo de actualización non atopado! Cancel - Cancelar + Cancelar An error occurred while loading updates: package Url is empty! - + Produciuse un erro ao cargar as actualizacións: a URL do paquete está baleira! Update package error: md5 sum does not match the original. - + Erro de actualización do paquete: a suma md5 non coincide co orixinal. Preparing update... - + Preparando actualización... An error occurred while unzip updates: Update Service not found! - + Produciuse un erro ao descomprimir as actualizacións: Non se atopou o servizo de actualización! Update is available (version %1) - + A actualización está dispoñible (versión %1) Download update - + Descarga da actualización Current version is up to date - + A versión actual está actualizada An error occured while unpacking the archive - + Produciuse un erro ao descomprimir o arquivo Update download failed: out of memory! - + Fallou a descarga da actualización: sen memoria! Update download failed: server connection error! - + Erro na descarga da actualización: erro de conexión ao servidor! Update download failed: wrong URL! - + Fallou a descarga da actualización: URL incorrecta! Update download failed: unable to create file! - + Erro na descarga da actualización: non se pode crear o arquivo! Update download failed: network error! - + Fallou a descarga da actualización: erro de rede! A service error has occurred! - + Ocorreu un erro de servizo! Last check performed %1 - + Última comprobación realizada %1 Error opening JSON file. - + Erro ao abrir o arquivo JSON. Update is available - + A actualización está dispoñible Current version - + Versión actual Update version - + Versión actualizada Would you like to download update now? - + Queres descargar a actualización agora? Update is ready to install - + A actualización esta lista para instalarse Would you like to restart app now? - + Queres reiniciar a aplicación agora? @@ -790,7 +790,7 @@ File %1 cannot be opened or doesn't exists. - + O arquivo %1 non se pode abrir ou non existe. @@ -801,128 +801,128 @@ XML File (*.xml) - + Arquivo XML (*.xml) Access to file '%1' is denied! - + O acceso ao arquivo '%1' está denegado! Read only - + Só lectura Skip this version - + Omitir esta versión Remind me later - + Lémbrame máis tarde Install update - + Instalar actualización Install later - + Instalar despois Save and Restart Now - + Gardar e reiniciar agora Save and Install Now - + Gardar e instalar agora Download update - + Descarga da actualización Software Update - + Actualización de software Release notes - + Notas de lanzamento An error occurred while start install updates! - + Ocorreu un erro ao comezar a instalar as actualizacións! An error occurred while start replacing files: Update Service not found! - + Produciuse un erro ao comezar a substituír arquivos: Non se atopou o servizo de actualización! Cancel - Cancelar + Cancelar Yes - Si + Si No - Non + Non OK - Vale + Vale Skip - + Saltar Buy Now - + Comprar agora Activate - + Activar Continue - + Continuar An error occurred while opening the portal:<br>%1 - + Produciuse un erro ao abrir o portal:<br>%1 &OK diff --git a/win-linux/langs/hr.ts b/win-linux/langs/hr.ts index 998d5fc32..9c0f3dffa 100644 --- a/win-linux/langs/hr.ts +++ b/win-linux/langs/hr.ts @@ -95,7 +95,7 @@ Open Document - Otvori dokument + Otvori dokument @@ -179,7 +179,7 @@ There are no printers available - + Nema dostupnih pisača @@ -287,7 +287,7 @@ Macro-enabled Presentation File (*.pptm) - + Datoteka prezentacije s omogućenim makronaredbama (*.pptm) @@ -315,27 +315,27 @@ DOCX Document - + Dokument DOCX OpenDocument Document template - + Predložak dokumenta OpenDocument OpenDocument Presentation Template - + Predložak prezentacije OpenDocument Macro-enabled spreadsheet template - + Predložak proračunske tablice s omogućenim makronaredbama OpenDocument Spreadsheet Template - + Predložak proračunske tablice OpenDocument @@ -365,12 +365,12 @@ SVG Image (*.svg) - + SVG slika (*.svg) JPG Image (*.jpg *.jpeg) - + JPG slika (*.jpg *jpeg) @@ -443,25 +443,25 @@ All supported files - + Sve podržane datoteke Spreadsheet template - + Predložak proračunske tablice Presentation template - + Predložak prezentacije Document template - + Predložak dokumenta @@ -499,7 +499,7 @@ Select Folder - + Odaberi mapu @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + Otvoreno je više od jednog dokumenta.<br>Želite li ipak zatvoriti prozor? Don't ask again. - + Ne pitaj ponovno. File format not supported. - Format datoteke nije podržan. + Format datoteke nije podržan. %1 doesn't exists!<br>Remove file from the list? - %1 nije dostupna. Možda je preimenovana, premještena ili izbrisana.<br>Želite li ukloniti datoteku s popisa? + %1 nije dostupna. Možda je preimenovana, premještena ili izbrisana.<br>Želite li ukloniti datoteku s popisa? Document must be saved firstly. - Dokument se najprije mora spremiti. + Dokument se najprije mora spremiti. Document must be saved to continue.<br>Save the document? - Dokument se mora spremiti za nastavak.<br>Želite li spremiti dokument? + Dokument se mora spremiti za nastavak.<br>Želite li spremiti dokument? There are no printers available - + Nema dostupnih pisača Print Document - Ispis dokumenta + Ispis dokumenta Sign Up - Stvorite portal + Stvorite portal %1 is modified.<br>Do you want to keep changes? - %1 je izmijenjen.<br>Želite li spremiti promjene? + %1 je izmijenjen.<br>Želite li spremiti promjene? @@ -615,169 +615,169 @@ Check for updates - + Provjeri ima li ažuriranja Unable to check update: URL not defined. - + Nije moguće provjeriti ažuriranje: URL nije definiran. To finish updating, restart app - + Ponovno pokrenite aplikaciju kako biste dovršili ažuriranje Restart - + Ponovno pokreni Checking for updates... - + Provjera ažuriranja... Updates are not allowed! - + Ažuriranja nisu dopuštena! This folder configuration does not allow for updates! The folder name should be: - + Ova konfiguracija mape ne dopušta ažuriranja! Naziv mape trebao bi biti: An error occurred while check updates: Update Service not found! - + Došlo je do pogreške prilikom provjere ažuriranja: Usluga ažuriranja nije pronađena! Downloading new version %1 (%2%) - + Preuzimanje nove verzije %1 (%2%) An error occurred while loading updates: Update Service not found! - + Došlo je do pogreške prilikom učitavanja ažuriranja: Usluga ažuriranja nije pronađena! Cancel - Odustani + Odustani An error occurred while loading updates: package Url is empty! - + Došlo je do pogreške prilikom učitavanja ažuriranja: URL paketa je prazan! Update package error: md5 sum does not match the original. - + Pogreška ažuriranja paketa: zbroj md5 ne odgovara originalu. Preparing update... - + Priprema ažuriranja... An error occurred while unzip updates: Update Service not found! - + Došlo je do pogreške prilikom raspakiravanja ažuriranja: Usluga ažuriranja nije pronađena! Update is available (version %1) - + Dostupno je ažuriranje (verzija %1) Download update - + Preuzmi ažuriranje Current version is up to date - + Trenutna je verzija ažurirana An error occured while unpacking the archive - + Došlo je do pogreške prilikom raspakiravanja arhive Update download failed: out of memory! - + Preuzimanje ažuriranja nije uspjelo: nema dovoljno memorije! Update download failed: server connection error! - + Preuzimanje ažuriranja nije uspjelo: pogreška pri povezivanju s poslužiteljem! Update download failed: wrong URL! - + Preuzimanje ažuriranja nije uspjelo: pogrešan URL! Update download failed: unable to create file! - + Preuzimanje ažuriranja nije uspjelo: nije moguće stvoriti datoteku! Update download failed: network error! - + Preuzimanje ažuriranja nije uspjelo: mrežna pogreška! A service error has occurred! - + Došlo je do pogreške s uslugom! Last check performed %1 - + Zadnja je provjera izvršena %1 Error opening JSON file. - + Pogreška pri otvaranju datoteke JSON. Update is available - + Dostupno je ažuriranje Current version - + Trenutna verzija Update version - + Ažuriraj verziju Would you like to download update now? - + Želite li sada preuzeti ažuriranje? Update is ready to install - + Ažuriranje je spremno za instalaciju Would you like to restart app now? - + Želite li sada ponovno pokrenuti aplikaciju? @@ -790,7 +790,7 @@ File %1 cannot be opened or doesn't exists. - + Datoteku %1 nije moguće otvoriti ili ne postoji. @@ -801,128 +801,128 @@ XML File (*.xml) - + Datoteka XML (*.xml) Access to file '%1' is denied! - + Pristup datoteci '%1' je odbijen! Read only - + Samo za čitanje Skip this version - + Preskoči ovu verziju Remind me later - + Podsjeti me kasnije Install update - + Instaliraj ažuriranje Install later - + Instaliraj kasnije Save and Restart Now - + Spremi i odmah ponovno pokreni Save and Install Now - + Spremi i instaliraj sada Download update - + Preuzmi ažuriranje Software Update - + Ažuriranje softvera Release notes - + Napomene o izdanju An error occurred while start install updates! - + Došlo je do pogreške prilikom pokretanja instalacije ažuriranja! An error occurred while start replacing files: Update Service not found! - + Došlo je do pogreške prilikom pokretanja zamjene datoteka: Usluga ažuriranja nije pronađena! Cancel - Odustani + Odustani Yes - Da + Da No - Ne + Ne OK - OK + OK Skip - + Preskoči Buy Now - + Kupi sada Activate - + Aktiviraj Continue - + Nastavi An error occurred while opening the portal:<br>%1 - + Došlo je do pogreške prilikom otvaranja portala:<br>%1 &OK diff --git a/win-linux/langs/sl.ts b/win-linux/langs/sl.ts index 5ba272c80..7b27baefd 100644 --- a/win-linux/langs/sl.ts +++ b/win-linux/langs/sl.ts @@ -705,37 +705,37 @@ An error occured while unpacking the archive - + Med razpakiranjem arhiva je prišlo do napake Update download failed: out of memory! - + Prenos posodobitve ni uspel: premalo je pomnilnika! Update download failed: server connection error! - + Prenos posodobitve ni uspel: napaka v povezavi s strežnikom! Update download failed: wrong URL! - + Prenos posodobitve ni uspel: napačen URL! Update download failed: unable to create file! - + Prenos posodobitve ni uspel: ni mogoče ustvariti datoteke! Update download failed: network error! - + Prenos posodobitve ni uspel: omrežna napaka! A service error has occurred! - + Prišlo je do servisne napake! @@ -745,7 +745,7 @@ Error opening JSON file. - + Napaka pri odpiranju datoteke JSON. @@ -852,7 +852,7 @@ Save and Install Now - + Shranite in namestite zdaj diff --git a/win-linux/langs/sv.ts b/win-linux/langs/sv.ts index aebc59b29..0b8ea54b5 100644 --- a/win-linux/langs/sv.ts +++ b/win-linux/langs/sv.ts @@ -95,7 +95,7 @@ Open Document - Öppna dokument + Öppna dokument @@ -179,7 +179,7 @@ There are no printers available - + Det finns inga tillgängliga skrivare @@ -287,7 +287,7 @@ Macro-enabled Presentation File (*.pptm) - + Makroaktiverad presentationsfil (*.pptm) @@ -315,27 +315,27 @@ DOCX Document - + DOCX-dokument OpenDocument Document template - + OpenDocument dokumentmall OpenDocument Presentation Template - + OpenDocument presentationsmall Macro-enabled spreadsheet template - + Makroaktiverad kalkylbladsmall OpenDocument Spreadsheet Template - + OpenDocument kalkylbladsmall @@ -365,12 +365,12 @@ SVG Image (*.svg) - + SVG-bild (*.svg) JPG Image (*.jpg *.jpeg) - + JPG-bild (*.jpg *.jpeg) @@ -443,25 +443,25 @@ All supported files - + Alla filer som stöds Spreadsheet template - + Kalkylbladsmall Presentation template - + Presentationsmall Document template - + Dokumentmall @@ -499,7 +499,7 @@ Select Folder - + Välj mapp @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + Fler än ett dokument är öppet. Stäng fönstret ändå? Don't ask again. - + Fråga inte igen. File format not supported. - Filformatet stöds inte. + Filformatet stöds inte. %1 doesn't exists!<br>Remove file from the list? - %1 är inte tillgänlig. Det är möjligt att filen har bytt namn, flyttats eller tagits bort.<br>Vill du ta bort filen från listan? + %1 är inte tillgänlig. Det är möjligt att filen har bytt namn, flyttats eller tagits bort.<br>Vill du ta bort filen från listan? Document must be saved firstly. - Dokumentet måste sparas först. + Dokumentet måste sparas först. Document must be saved to continue.<br>Save the document? - Dokumentet måste sparas för att fortsätta.<br>Spara dokument? + Dokumentet måste sparas för att fortsätta.<br>Spara dokument? There are no printers available - + Det finns inga tillgängliga skrivare Print Document - Skriv ut dokument + Skriv ut dokument Sign Up - Skapa portal + Skapa portal %1 is modified.<br>Do you want to keep changes? - %1 har ändrats.<br>Vill du spara ändringarna? + %1 har ändrats.<br>Vill du spara ändringarna? @@ -615,169 +615,169 @@ Check for updates - + Sök efter uppdateringar Unable to check update: URL not defined. - + Kan inte söka efter uppdateringar: Odefinierad URL. To finish updating, restart app - + För att slutföra uppdateringen, starta om appen Restart - + Starta om Checking for updates... - + Söker efter uppdateringar... Updates are not allowed! - + Uppdateringar är inte tillåtna! This folder configuration does not allow for updates! The folder name should be: - + Denna mappkonfiguration tillåter inte uppdateringar! Mappens namn bör vara: An error occurred while check updates: Update Service not found! - + Ett fel uppstod vid sökning efter uppdateringar: Uppdateringstjänsten hittades inte! Downloading new version %1 (%2%) - + Laddar ner ny version %1 (%2%) An error occurred while loading updates: Update Service not found! - + Ett fel inträffade vid inläsning av uppdateringar: Uppdateringstjänsten hittades inte! Cancel - Avbryt + Avbryt An error occurred while loading updates: package Url is empty! - + Ett fel inträffade vid inläsning av uppdateringar: Paketets URL är tomt! Update package error: md5 sum does not match the original. - + Fel i uppdateringspaket: md5-summan stämmer inte överens med originalet. Preparing update... - + Förbereder uppdatering... An error occurred while unzip updates: Update Service not found! - + Ett fel inträffade vid extraktion av uppdateringar: Uppdateringstjänsten hittades inte! Update is available (version %1) - + Uppdatering är tillgänglig (version %1) Download update - + Ladda ner uppdatering Current version is up to date - + Nuvarande version är uppdaterad An error occured while unpacking the archive - + Ett fel inträffade vid extraktion av arkivet Update download failed: out of memory! - + Uppdateringsnedladdningen misslyckades: Otillräckligt minne! Update download failed: server connection error! - + Uppdateringsnedladdningen misslyckades: Serveranslutningsfel! Update download failed: wrong URL! - + Uppdateringsnedladdningen misslyckades: Felaktig URL! Update download failed: unable to create file! - + Uppdateringsnedladdningen misslyckades: Kan inte skapa fil! Update download failed: network error! - + Uppdateringsnedladdningen misslyckades: Nätverksfel! A service error has occurred! - + Ett servicefel har inträffat! Last check performed %1 - + Senaste sökning utförd %1 Error opening JSON file. - + Fel vid öppning av JSON-fil. Update is available - + Uppdatering är tillgänglig Current version - + Nuvarande version Update version - + Uppdateringsversion Would you like to download update now? - + Vill du ladda ner uppdateringen nu? Update is ready to install - + Uppdatering är redo för installation Would you like to restart app now? - + Vill du starta om appen nu? @@ -790,7 +790,7 @@ File %1 cannot be opened or doesn't exists. - + Fil %1 kan inte öppnas eller finns inte. @@ -801,128 +801,128 @@ XML File (*.xml) - + XML-fil (*.xml) Access to file '%1' is denied! - + Åtkomst till filen '%1' är nekad! Read only - + Skrivskyddad Skip this version - + Hoppa över denna version Remind me later - + Påminn mig senare Install update - + Installera uppdatering Install later - + Installera senare Save and Restart Now - + Spara och starta om nu Save and Install Now - Installera + Spara och installera nu Download update - + Ladda ner uppdatering Software Update - + Mjukvaruuppdatering Release notes - + Viktig information An error occurred while start install updates! - + Ett fel inträffade vid installation av uppdateringar! An error occurred while start replacing files: Update Service not found! - + Ett fel inträffade vid filersättning: Uppdateringstjänsten hittades inte! Cancel - Avbryt + Avbryt Yes - Ja + Ja No - Nej + Nej OK - OK + OK Skip - + Hoppa över Buy Now - + Köp nu Activate - + Aktivera Continue - + Fortsätt An error occurred while opening the portal:<br>%1 - + Ett fel inträffade vid öppning av portalen: <br>%1 &OK diff --git a/win-linux/langs/zh_TW.ts b/win-linux/langs/zh_TW.ts index cb52da8d4..8cec97e03 100644 --- a/win-linux/langs/zh_TW.ts +++ b/win-linux/langs/zh_TW.ts @@ -303,7 +303,7 @@ Macro-enabled Presentation File (*.pptm) - + 啟用巨集的簡報檔案 (*.pptm) @@ -331,27 +331,27 @@ DOCX Document - + DOCX文件 OpenDocument Document template - + OpenDocument文件範本 OpenDocument Presentation Template - + OpenDocument簡報範本 Macro-enabled spreadsheet template - + 啟用巨集的試算表範本 OpenDocument Spreadsheet Template - + OpenDocument試算表範本 @@ -381,7 +381,7 @@ SVG Image (*.svg) - + SVG圖像 (*.svg) @@ -465,19 +465,19 @@ Spreadsheet template - + 試算表範本 Presentation template - + 簡報範本 Document template - + 文件範本 @@ -523,12 +523,12 @@ More than one document is open.<br>Close the window anyway? - + 有多個文件是開啟的。<br>仍要關閉視窗? Don't ask again. - + 不再詢問。 @@ -635,169 +635,169 @@ Check for updates - + 檢查更新 Unable to check update: URL not defined. - + 無法檢查更新:未定義的URL。 To finish updating, restart app - + 若要完成更新,請重新啟動應用程式 Restart - + 重新啟動 Checking for updates... - + 正在檢查更新… Updates are not allowed! - + 不允許更新! This folder configuration does not allow for updates! The folder name should be: - + 此資料夾配置不允許進行更新!資料夾名稱應為: An error occurred while check updates: Update Service not found! - + 檢查更新時發生錯誤:找不到更新服務! Downloading new version %1 (%2%) - + 正在下載新版本%1(%2%) An error occurred while loading updates: Update Service not found! - + 載入更新時發生錯誤:找不到更新服務! Cancel - 取消 + 取消 An error occurred while loading updates: package Url is empty! - + 載入更新時發生錯誤:套件URL為空白。 Update package error: md5 sum does not match the original. - + 更新套件錯誤:md5摘要與原始檔不符。 Preparing update... - + 正在準備更新... An error occurred while unzip updates: Update Service not found! - + 解壓縮更新時發生錯誤:找不到更新服務! Update is available (version %1) - + 有可用的更新(版本 %1) Download update - 下載更新 + 下載更新 Current version is up to date - + 目前已是最新版本 An error occured while unpacking the archive - + 解壓縮存檔時發生錯誤 Update download failed: out of memory! - + 更新下載失敗:記憶體不足! Update download failed: server connection error! - + 更新下載失敗:伺服器連線錯誤! Update download failed: wrong URL! - + 更新下載失敗:錯誤的URL! Update download failed: unable to create file! - + 更新下載失敗:無法建立檔案! Update download failed: network error! - + 更新下載失敗:網路錯誤! A service error has occurred! - + 發生服務錯誤! Last check performed %1 - + 上次執行的檢查 %1 Error opening JSON file. - + 開啟JSON檔案時發生錯誤。 Update is available - + 有可用的更新 Current version - + 目前版本 Update version - + 更新版本 Would you like to download update now? - + 要立即下載更新嗎? Update is ready to install - + 已準備好安裝更新 Would you like to restart app now? - + 要立即重新啟動應用程式嗎? A new version of %1 is available! @@ -841,13 +841,13 @@ XML File (*.xml) - + XML 檔案 (*.xml) Access to file '%1' is denied! - + 拒絕存取檔案 '%1'! @@ -880,7 +880,7 @@ Install later - + 稍後安裝 @@ -892,7 +892,7 @@ Save and Install Now - 安裝 + 儲存並立即安裝 @@ -915,58 +915,58 @@ An error occurred while start install updates! - + 開始安裝更新時發生錯誤! An error occurred while start replacing files: Update Service not found! - + 開始替換檔案時發生錯誤:找不到更新服務! Cancel - 取消 + 取消 Yes - + No - + OK - + Skip - 跳過 + 跳過 Buy Now - + 立即購買 Activate - + 啟用 Continue - + 繼續 An error occurred while opening the portal:<br>%1 - + 開啟入口時發生錯誤:<br>%1 &OK From 6ec851b4dde4808d442df6b316b6e6a8b44d196f Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Wed, 29 Nov 2023 13:23:21 +0300 Subject: [PATCH 010/316] added translations --- common/loginpage/locale/zh-CN.js | 2 +- win-linux/langs/be.ts | 28 +++--- win-linux/langs/bg.ts | 18 ++-- win-linux/langs/el_GR.ts | 18 ++-- win-linux/langs/ga.ts | 26 ++--- win-linux/langs/hi.ts | 166 +++++++++++++++---------------- win-linux/langs/hu.ts | 164 +++++++++++++++--------------- win-linux/langs/id.ts | 162 +++++++++++++++--------------- win-linux/langs/lo.ts | 12 +-- win-linux/langs/lt.ts | 26 ++--- win-linux/langs/no.ts | 26 ++--- win-linux/langs/si.ts | 86 ++++++++-------- win-linux/langs/sk.ts | 18 ++-- win-linux/langs/tr.ts | 18 ++-- win-linux/langs/uk.ts | 18 ++-- win-linux/langs/zh_CN.ts | 2 +- 16 files changed, 395 insertions(+), 395 deletions(-) diff --git a/common/loginpage/locale/zh-CN.js b/common/loginpage/locale/zh-CN.js index c7b0f4ab8..e9e00a40a 100644 --- a/common/loginpage/locale/zh-CN.js +++ b/common/loginpage/locale/zh-CN.js @@ -44,7 +44,7 @@ l10n.zh_CN = { pshPhone: '电话号码', pshCode: '短信发送的代码', loginNoteAssignPhone: '双因素身份认证已启用,将为您提供附加的ONLYOFFICE云安全保护。请输入您的手机号码,以便继续使用云office。手机号码必须使用含国家/地区代码的国际格式。', - loginNoteApplyCode: '双因素身份认证已启用。已将代码通过短信发送到$1号码。', + loginNoteApplyCode: '双因素身份认证已启用。已将代码通过短信发送到$1号码。', newDoc: '文档', newXlsx: '电子表格', newPptx: '演示文稿', diff --git a/win-linux/langs/be.ts b/win-linux/langs/be.ts index 5bdc5b723..5ff8d2e32 100644 --- a/win-linux/langs/be.ts +++ b/win-linux/langs/be.ts @@ -95,7 +95,7 @@ Open Document - Адкрыць дакумент + Адкрыць дакумент @@ -518,22 +518,22 @@ File format not supported. - Фармат файла не падтрымліваецца + Фармат файла не падтрымліваецца. %1 doesn't exists!<br>Remove file from the list? - %1 недаступны. Яго можна перайменаваць, перамясціць або выдаліць.<br>Хочаце выдаліць файл са спісу? + %1 недаступны. Яго можна перайменаваць, перамясціць або выдаліць.<br>Хочаце выдаліць файл са спісу? Document must be saved firstly. - Спачатку трэба захаваць дакумент. + Спачатку трэба захаваць дакумент. Document must be saved to continue.<br>Save the document? - Каб працягнуць, дакумент трэба захаваць.<br>Захаваць дакумент? + Каб працягнуць, дакумент трэба захаваць.<br>Захаваць дакумент? @@ -543,17 +543,17 @@ Print Document - Друкаваць дакумент + Друкаваць дакумент Sign Up - Зарэгістравацца + Зарэгістравацца %1 is modified.<br>Do you want to keep changes? - %1 быў зменены.<br>Захаваць змены? + %1 быў зменены.<br>Захаваць змены? @@ -665,7 +665,7 @@ Cancel - Скасаваць + Скасаваць @@ -790,7 +790,7 @@ File %1 cannot be opened or doesn't exists. - Файл %1 не існуе або яго немагчыма адкрыць. > + Файл %1 не існуе або яго немагчыма адкрыць. All supported files (*.txt *.csv) @@ -885,23 +885,23 @@ Cancel - Скасаваць + Скасаваць Yes - Так + Так No - Не + Не OK - Добра + Добра diff --git a/win-linux/langs/bg.ts b/win-linux/langs/bg.ts index ba9cede51..8aa54804f 100644 --- a/win-linux/langs/bg.ts +++ b/win-linux/langs/bg.ts @@ -725,37 +725,37 @@ An error occured while unpacking the archive - + Възникна грешка при отваряне на архива Update download failed: out of memory! - + Неуспешно изтегляне на актуализация: няма памет! Update download failed: server connection error! - + Неуспешно изтегляне на актуализация: грешка при връзка със сървъра! Update download failed: wrong URL! - + Неуспешно изтегляне на актуализация: грешен URL адрес! Update download failed: unable to create file! - + Неуспешно изтегляне на актуализация: неуспешно създаване на файл! Update download failed: network error! - + Неуспешно изтегляне на актуализация: грешка в мрежата! A service error has occurred! - + Възникна грешка в услугата! @@ -765,7 +765,7 @@ Error opening JSON file. - + Грешка при отваряне на JSON файл. @@ -892,7 +892,7 @@ Save and Install Now - Инсталирайте + Запази и Инсталирай Сега diff --git a/win-linux/langs/el_GR.ts b/win-linux/langs/el_GR.ts index a2ab82b9e..125b29ba5 100644 --- a/win-linux/langs/el_GR.ts +++ b/win-linux/langs/el_GR.ts @@ -707,37 +707,37 @@ An error occured while unpacking the archive - + Εμφανίστηκε σφάλμα κατά την αποσυμπίεση του αρχείου Update download failed: out of memory! - + Η λήψη ενημέρωσης απέτυχε: ανεπαρκής μνήμη! Update download failed: server connection error! - + Η λήψη ενημέρωσης απέτυχε: σφάλμα σύνδεσης με τον διακομιστή! Update download failed: wrong URL! - + Η λήψη ενημέρωσης απέτυχε: λανθασμένη διεύθυνση URL! Update download failed: unable to create file! - + Η λήψη ενημέρωσης απέτυχε: αδυναμία δημιουργίας αρχείου! Update download failed: network error! - + Η λήψη ενημέρωσης απέτυχε: σφάλμα δικτύου! A service error has occurred! - + Εμφανίστηκε σφάλμα υπηρεσίας! @@ -747,7 +747,7 @@ Error opening JSON file. - + Σφάλμα ανοίγματος αρχείου JSON. @@ -854,7 +854,7 @@ Save and Install Now - Εγκατάσταση + Αποθήκευση και εγκατάσταση τώρα diff --git a/win-linux/langs/ga.ts b/win-linux/langs/ga.ts index 6bbbf6c62..b3d24237f 100644 --- a/win-linux/langs/ga.ts +++ b/win-linux/langs/ga.ts @@ -95,7 +95,7 @@ Open Document - Oscail doiciméad + Oscail doiciméad @@ -522,22 +522,22 @@ File format not supported. - Ní thacaítear le formáid comhaid. + Ní thacaítear le formáid comhaid. %1 doesn't exists!<br>Remove file from the list? - Níl %1 ar fáil.D’fhéadfaí é a athainmniú, a bhogadh nó a scriosadh.<br>Ar mhaith leat an comhad a bhaint den liosta? + Níl %1 ar fáil.D’fhéadfaí é a athainmniú, a bhogadh nó a scriosadh.<br>Ar mhaith leat an comhad a bhaint den liosta? Document must be saved firstly. - Caithfear an doiciméad a shábháil ar dtús. + Caithfear an doiciméad a shábháil ar dtús. Document must be saved to continue.<br>Save the document? - Caithfear an doiciméad a shábháil chun leanúint ar aghaidh.<br>Sábháil an doiciméad? + Caithfear an doiciméad a shábháil chun leanúint ar aghaidh.<br>Sábháil an doiciméad? @@ -547,17 +547,17 @@ Print Document - Doiciméad a phriontáil + Doiciméad a phriontáil Sign Up - Cruthaigh tairseach + Cruthaigh tairseach %1 is modified.<br>Do you want to keep changes? - Mionathraíodh %1.<br>Ar mhaith leat na hathruithe a shábháil? + Mionathraíodh %1.<br>Ar mhaith leat na hathruithe a shábháil? @@ -669,7 +669,7 @@ Cancel - Cealaigh + Cealaigh @@ -885,23 +885,23 @@ Cancel - Cealaigh + Cealaigh Yes - + No - Níl + Níl OK - OK + OK diff --git a/win-linux/langs/hi.ts b/win-linux/langs/hi.ts index db2595805..5df6fd11e 100644 --- a/win-linux/langs/hi.ts +++ b/win-linux/langs/hi.ts @@ -95,7 +95,7 @@ Open Document - दस्तावेज़ खोलें + दस्तावेज़ खोलें @@ -179,7 +179,7 @@ There are no printers available - + कोई प्रिंटर उपलब्ध नहीं है @@ -287,7 +287,7 @@ Macro-enabled Presentation File (*.pptm) - + मैक्रो-सक्षम प्रस्तुति फ़ाइल (*.pptm) @@ -315,27 +315,27 @@ DOCX Document - + डॉक्स दस्तावेज़ OpenDocument Document template - + ओपनडॉक्यूमेंट दस्तावेज़ का टेम्पलेट OpenDocument Presentation Template - + ओपनडॉक्यूमेंट प्रस्तुति का टेम्पलेट Macro-enabled spreadsheet template - + मैक्रो-सक्षम स्प्रेडशीट का टेम्पलेट OpenDocument Spreadsheet Template - + ओपनडॉक्यूमेंट स्प्रेडशीट का टेम्पलेट @@ -365,17 +365,17 @@ SVG Image (*.svg) - + SVG छवि (*.svg) JPG Image (*.jpg *.jpeg) - + JPG छवि (*.jpg *.jpeg) PNG Image (*.png) - + PNG छवि (*.png) @@ -443,25 +443,25 @@ All supported files - + सभी सहायक फ़ाइलें Spreadsheet template - + स्प्रेडशीट का टेम्पलेट Presentation template - + प्रस्तुति का टेम्पलेट Document template - + दस्तावेज़ का टेम्पलेट @@ -499,7 +499,7 @@ Select Folder - + फोल्डर चुनें @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + एक से अधिक दस्तावेज़ खुले हुए हैं।<br>फिर भी विंडो को बंद करें? Don't ask again. - + दोबारा मत पूछना।. File format not supported. - फ़ाइल प्रारूप समर्थित नहीं है। + फ़ाइल प्रारूप समर्थित नहीं है।. %1 doesn't exists!<br>Remove file from the list? - %1 यह उपलब्ध नहीं है। शायद इसका नाम बदला गया है, इसे कहीं और डाला गया है या इसे डिलीट कर दिया गया है।<br>क्या आप सूची से यह फ़ाइल को हटाना चाहते हैं? + %1 यह उपलब्ध नहीं है। शायद इसका नाम बदला गया है, इसे कहीं और डाला गया है या इसे डिलीट कर दिया गया है।<br>क्या आप सूची से यह फ़ाइल को हटाना चाहते हैं? Document must be saved firstly. - दस्तावेज़ को पहले सहेजना आवश्यक है। + दस्तावेज़ को पहले सहेजना आवश्यक है।. Document must be saved to continue.<br>Save the document? - जारी रखने के लिए दस्तावेज़ को सहेजना आवश्यक है।<br>दस्तावेज़ को सहेजें? + जारी रखने के लिए दस्तावेज़ को सहेजना आवश्यक है।<br>दस्तावेज़ को सहेजें? There are no printers available - + कोई प्रिंटर उपलब्ध नहीं है Print Document - दस्तावेज़ को प्रिंट करें + दस्तावेज़ को प्रिंट करें Sign Up - पोर्टल बनाएँ + पोर्टल बनाएँ %1 is modified.<br>Do you want to keep changes? - %1 को संशोधित कर लिया गया है। <br>क्या आप बदलावों को सहेजना चाहते हैं? + %1 को संशोधित कर लिया गया है। <br>क्या आप बदलावों को सहेजना चाहते हैं? @@ -615,169 +615,169 @@ Check for updates - + अपडेट के लिए जाँच करें Unable to check update: URL not defined. - + अपडेट की जाँच करने में असमर्थ: यूआरएल परिभाषित नहीं है।. To finish updating, restart app - + अपडेट पूरा करने के लिए, ऐप को पुनः आरंभ करें Restart - + पुनः आरंभ करें Checking for updates... - + अपडेट के लिए जाँच कर रहे हैं... Updates are not allowed! - + अपडेट की अनुमति नहीं है! This folder configuration does not allow for updates! The folder name should be: - + इस फोल्डर का कॉन्फ़िगरेशन अपडेट की अनुमति नहीं देता है! फोल्डर का नाम यह होना चाहिए: An error occurred while check updates: Update Service not found! - + अपडेट की जाँच करते समय कोई त्रुटि हुई है: अपडेट सेवा नहीं मिली! Downloading new version %1 (%2%) - + नए संस्करण %1 (%2%) को डाउनलोड कर रहे हैं An error occurred while loading updates: Update Service not found! - + अपडेट लोड करते समय कोई त्रुटि हुई है: अपडेट सेवा नहीं मिली! Cancel - रद्द करें + रद्द करें An error occurred while loading updates: package Url is empty! - + अपडेट लोड करते समय कोई त्रुटि हुई है: पैकेज यूआरएल (URL) खाली है! Update package error: md5 sum does not match the original. - + अपडेट पैकेज त्रुटि: md5 का योग मूल से मेल नहीं खाता।. Preparing update... - + अपडेट तैयार कर रहे हैं... An error occurred while unzip updates: Update Service not found! - + अपडेट को अनज़िप करते समय कोई त्रुटि हुई है: अपडेट सेवा नहीं मिली! Update is available (version %1) - + अपडेट उपलब्ध है (संस्करण %1) Download update - + अपडेट को डाउनलोड करें Current version is up to date - + वर्तमान संस्करण अद्यतित है An error occured while unpacking the archive - + संग्रह को अनपैक करते समय कोई त्रुटि हुई है Update download failed: out of memory! - + अपडेट का डाउनलोड विफल रहा: मेमोरी नहीं है! Update download failed: server connection error! - + अपडेट का डाउनलोड विफल रहा: सर्वर कनेक्शन में त्रुटि है! Update download failed: wrong URL! - + अपडेट का डाउनलोड विफल रहा: यूआरएल गलत है! Update download failed: unable to create file! - + अपडेट का डाउनलोड विफल रहा: फ़ाइल बनाने में असमर्थ हैं! Update download failed: network error! - + अपडेट का डाउनलोड विफल रहा: नेटवर्क त्रुटि है! A service error has occurred! - + एक सेवा त्रुटि हुई है! Last check performed %1 - + अंतिम जाँच %1 की गई Error opening JSON file. - + जेसन (JSON) फ़ाइल खोलने में त्रुटि हुई है।. Update is available - + अपडेट उपलब्ध है Current version - + वर्तमान संस्करण Update version - + संस्करण को अपडेट करें Would you like to download update now? - + क्या आप अभी अपडेट डाउनलोड करना चाहेंगे? Update is ready to install - + अपडेट इंस्टॉल करने के लिए तैयार है Would you like to restart app now? - + क्या आप अब ऐप को पुनः आरंभ करना चाहेंगे? @@ -790,7 +790,7 @@ File %1 cannot be opened or doesn't exists. - + %1 फ़ाइल को खोला नहीं जा सकता है या यह मौजूद नहीं है।. @@ -801,128 +801,128 @@ XML File (*.xml) - + एक्सएमएल फ़ाइल (*.xml) Access to file '%1' is denied! - + '%1' फ़ाइल की पहुँच अस्वीकृत हुई! Read only - + केवल पढ़ने के लिए Skip this version - + इस संस्करण को छोड़ दें Remind me later - + मुझे बाद में याद दिलाना Install update - + अपडेट इंस्टॉल करें Install later - + बाद में इंस्टॉल करें Save and Restart Now - + सहेजें और अभी पुनः आरंभ करें Save and Install Now - + सहेजें और अभी इंस्टॉल करें Download update - + अपडेट को डाउनलोड करें Software Update - + सॉफ्टवेयर अपडेट Release notes - + रिलीज नोट्स An error occurred while start install updates! - + अपडेट इंस्टॉल शुरू करते समय कोई त्रुटि हुई है! An error occurred while start replacing files: Update Service not found! - + फ़ाइलें बदलना आरंभ करते समय कोई त्रुटि हुई है: अपडेट सेवा नहीं मिली! Cancel - रद्द करें + रद्द करें Yes - हाँ + हाँ No - नहीं + नहीं OK - ठीक है + ठीक है Skip - + छोड़ दें Buy Now - + अभी खरीदें Activate - + सक्रिय करें Continue - + जारी रखें An error occurred while opening the portal:<br>%1 - + पोर्टल को खोलते समय कोई त्रुटि हुई है:<br>%1 &OK diff --git a/win-linux/langs/hu.ts b/win-linux/langs/hu.ts index 230783ea4..b6d50ca36 100644 --- a/win-linux/langs/hu.ts +++ b/win-linux/langs/hu.ts @@ -95,7 +95,7 @@ Open Document - Dokumentum megnyitása + Dokumentum megnyitása @@ -179,7 +179,7 @@ There are no printers available - + Nincs elérhető nyomtató @@ -287,7 +287,7 @@ Macro-enabled Presentation File (*.pptm) - + Makróbarát prezentáció fájl (*.pptm) @@ -315,27 +315,27 @@ DOCX Document - + DOCX dokumentum OpenDocument Document template - + OpenDocument dokumentum sablon OpenDocument Presentation Template - + OpenDocument prezentáció sablon Macro-enabled spreadsheet template - + Makróbarát munkalap sablon OpenDocument Spreadsheet Template - + OpenDocument munkalap sablon @@ -365,12 +365,12 @@ SVG Image (*.svg) - + SVG kép (*.svg) JPG Image (*.jpg *.jpeg) - + JPG kép (*.jpg *.jpeg) @@ -443,25 +443,25 @@ All supported files - + Összes támogatott fájl Spreadsheet template - + Munkalap sablon Presentation template - + Prezentáció sablon Document template - + Dokumentumsablon @@ -499,7 +499,7 @@ Select Folder - + Mappa kiválasztása @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + Egynél több dokumentum van megnyitva.<br>Biztosan bezárja az ablakot? Don't ask again. - + Ne kérdezzen rá újra. File format not supported. - A fájlformátum nem támogatott. + A fájlformátum nem támogatott. %1 doesn't exists!<br>Remove file from the list? - %1 nem elérhető. Lehet, hogy átnevezésre, áthelyezésre vagy törlésre került.<br>Eltávolítja a fájlt a listáról? + %1 nem elérhető. Lehet, hogy átnevezésre, áthelyezésre vagy törlésre került.<br>Eltávolítja a fájlt a listáról? Document must be saved firstly. - Előbb mentenie kell a dokumentumot. + Előbb mentenie kell a dokumentumot. Document must be saved to continue.<br>Save the document? - A folytatáshoz mentenie kell a dokumentumot.<br>Menti a dokumentumot? + A folytatáshoz mentenie kell a dokumentumot.<br>Menti a dokumentumot? There are no printers available - + Nincs elérhető nyomtató Print Document - Dokumentum nyomtatása + Dokumentum nyomtatása Sign Up - Portál létrehozása + Portál létrehozása %1 is modified.<br>Do you want to keep changes? - %1 módosítva lett.<br>Menti a módosításokat? + %1 módosítva lett.<br>Menti a módosításokat? @@ -615,169 +615,169 @@ Check for updates - + Frissítések keresése Unable to check update: URL not defined. - + Nem lehetséges a frissítések ellenőrzése: URL nem meghatározott. To finish updating, restart app - + A frissítés befejezéséhez indítsa újra az alkalmazást Restart - + Újraindítás Checking for updates... - + Frissítések keresése... Updates are not allowed! - + Frissítés nem megengedett! This folder configuration does not allow for updates! The folder name should be: - + A jelenlegi mappakonfiguráció nem teszi lehetővé a frissítést! A mappa neve a következő kell, hogy legyen: An error occurred while check updates: Update Service not found! - + Hiba történt a frissítések ellenőrzése közben: Frissítési szolgáltatás nem található! Downloading new version %1 (%2%) - + %1 (%2%) új verzió letöltése An error occurred while loading updates: Update Service not found! - + Hiba történt a frissítések betöltése közben: Frissítési szolgáltatás nem található! Cancel - Mégse + Mégse An error occurred while loading updates: package Url is empty! - + Hiba történt a frissítések betöltése közben: a csomag URL-je üres! Update package error: md5 sum does not match the original. - + Frissítéscsomag hiba: md5 összeg nem egyezik meg az eredetivel. Preparing update... - + Frissítés előkészítése... An error occurred while unzip updates: Update Service not found! - + Hiba történt a frissítések kicsomagolása közben: Frissítési szolgáltatás nem található! Update is available (version %1) - + Elérhető frissítés (%1 verzió) Download update - + Frissítés letöltése Current version is up to date - + Az aktuális verzió naprakész An error occured while unpacking the archive - + Hiba történt az arhívum kicsomagolása közben Update download failed: out of memory! - + Frissítés letöltése sikertelen: nincs elegendő memória! Update download failed: server connection error! - + Frissítés letöltése sikertelen: hiba történt a szerverkapcsolat létrehozása közben! Update download failed: wrong URL! - + Frissítés letöltése sikertelen: nem megfelelő URL! Update download failed: unable to create file! - + Frissítés letöltése sikertelen: nem hozható létre a fájl! Update download failed: network error! - + Frissítés letöltése sikertelen: hálózati hiba! A service error has occurred! - + Szolgáltatási hiba történt! Last check performed %1 - + Utolsó ellenőrzés elvégezve %1 Error opening JSON file. - + Hiba történt a JSON file megnyitása közben. Update is available - + Elérhető frissítés Current version - + Aktuális verzió Update version - + Frissítés verzió Would you like to download update now? - + Szeretné most letölteni a frissítést? Update is ready to install - + A frissítés telepítésre kész Would you like to restart app now? - + Szeretné most újraindítani az alkalamzást? @@ -790,7 +790,7 @@ File %1 cannot be opened or doesn't exists. - + %1 fájl nem nyitható meg vagy nem létezik. @@ -801,128 +801,128 @@ XML File (*.xml) - + XML fájl (*.xml) Access to file '%1' is denied! - + '%1' fájlhoz hozzáférés megtagadva! Read only - + Csak olvasható Skip this version - + Ezen verzió kihagyása Remind me later - + Emlékeztessen később Install update - + Frissítés telepítése Install later - + Telepítés később Save and Restart Now - + Mentés és ujraindítás most Save and Install Now - Telepítés + Mentés és telepítés most Download update - + Frissítés letöltése Software Update - + Szoftverfrissítés Release notes - + Kiadási megjegyzések An error occurred while start install updates! - + Hiba történt a frissítések telepítése közben! An error occurred while start replacing files: Update Service not found! - + Hiba történt a fájlok helyettesítése közben: Frissítési szolgáltatás nem található! Cancel - Mégse + Mégse Yes - Igen + Igen No - Nem + Nem OK - OK + OK Skip - + Kihagyás Buy Now - + Megvásárlás Activate - + Aktiválás Continue - + Folytatás An error occurred while opening the portal:<br>%1 - + Hiba történt a <br>%1 portál megnyitása közben &OK diff --git a/win-linux/langs/id.ts b/win-linux/langs/id.ts index ccec868c2..85b2e8550 100644 --- a/win-linux/langs/id.ts +++ b/win-linux/langs/id.ts @@ -91,7 +91,7 @@ Open Document - Buka Dokumen + Buka Dokumen @@ -175,7 +175,7 @@ There are no printers available - + Tidak ada printer yang tersedia @@ -283,7 +283,7 @@ Macro-enabled Presentation File (*.pptm) - + Macro-enabled Presentation File (*.pptm) @@ -336,12 +336,12 @@ JPG Image (*.jpg *.jpeg) - + Gambar JPG (*.jpg *.jpeg) Select Folder - + Pilih Folder JPG Image (*.jpg, *.jpeg) @@ -350,32 +350,32 @@ DOCX Document - + Dokumen DOCX OpenDocument Document template - + Template Dokumen OpenDocument OpenDocument Presentation Template - + Template Presentasi OpenDocument Macro-enabled spreadsheet template - + Macro-enabled Spreadsheet Template OpenDocument Spreadsheet Template - + Template Spreadsheet OpenDocument SVG Image (*.svg) - + Gambar SVG (*.svg) @@ -448,25 +448,25 @@ All supported files - + Semua file yang didukung Spreadsheet template - + Template spreadsheet Presentation template - + Template presentasi Document template - + Template dokumen @@ -507,53 +507,53 @@ More than one document is open.<br>Close the window anyway? - + Lebih dari satu dokumen terbuka.<br> Tetap tutup jendela? Don't ask again. - + Jangan tanya lagi. File format not supported. - Format file tidak didukung. + Format file tidak didukung. %1 doesn't exists!<br>Remove file from the list? - %1 tidak tersedia.Mungkin telah berganti nama, berpindah atau hilang.<br>Hapus file dari daftar? + %1 tidak tersedia.Mungkin telah berganti nama, berpindah atau hilang.<br>Hapus file dari daftar? Document must be saved firstly. - Dokumen harus disimpan terlebih dahulu. + Dokumen harus disimpan terlebih dahulu. Document must be saved to continue.<br>Save the document? - Dokumen harus disimpan untuk melanjutkan.<br>Simpan dokumen? + Dokumen harus disimpan untuk melanjutkan.<br>Simpan dokumen? There are no printers available - + Tidak ada printer yang tersedia Print Document - Cetak Dokumen + Cetak Dokumen Sign Up - Buat portal + Buat portal %1 is modified.<br>Do you want to keep changes? - %1 telah berubah.<br>Simpan perubahan? + %1 telah berubah.<br>Simpan perubahan? @@ -561,7 +561,7 @@ Licensed under - Lisensi di bawah + Lisensi di bawah @@ -615,169 +615,169 @@ Check for updates - + Periksa Update Unable to check update: URL not defined. - + Tidak dapat memeriksa update: URL tidak ditemukan. To finish updating, restart app - + Untuk menyelesaikan update, restart app Restart - + Restart Checking for updates... - + Memerika update... Updates are not allowed! - + Update tidak diizinkan! This folder configuration does not allow for updates! The folder name should be: - + Tidak bisa update karena pengaturan folder tidak tepat! Nama folder harus: An error occurred while check updates: Update Service not found! - + Terjadi kesalahan saat memeriksa update: Layanan Update tidak ditemukan! Downloading new version %1 (%2%) - + Proses download versi terbaru %1 (%2%) An error occurred while loading updates: Update Service not found! - + Terjadi kesalahan saat memuat update: Layanan Update tidak ditemukan! Cancel - Batal + Batal An error occurred while loading updates: package Url is empty! - + Terjadi kesalaahan saat memuat update: URL kosong! Update package error: md5 sum does not match the original. - + Kesalahan paket update: jumlah md5 tidak sesuai dengan yang asli. Preparing update... - + Mempersiapkan update... An error occurred while unzip updates: Update Service not found! - + Terjadi kesalahan saat membuka zip update: Layanan Update tidak ditemukan! Update is available (version %1) - + Update tersedia (version %1) Download update - + Download update Current version is up to date - + Sudah versi terbaru An error occured while unpacking the archive - + Terjadi kesalahan saat membuka arsip Update download failed: out of memory! - + Download update gagal: memori habis! Update download failed: server connection error! - + Download update gagal: kesalahan koneksi server! Update download failed: wrong URL! - + Download update gagal: URL tidak valid! Update download failed: unable to create file! - + Download update gagal: tidak bisa membuat file! Update download failed: network error! - + Download update gagal: kesalahan jaringan! A service error has occurred! - + Terjadi kesalahan layanan! Last check performed %1 - + Jadwal pemeriksaan terakhir %1 Error opening JSON file. - + Error membuka file JSON. Update is available - + Update tersedia Current version - + Versi saat ini Update version - + Update versi Would you like to download update now? - + Apakah Anda ingin download update sekarang? Update is ready to install - + Update siap untuk di install Would you like to restart app now? - + Apakah Anda ingin restart app sekarang? @@ -805,13 +805,13 @@ XML File (*.xml) - + XML File (*.xml) Access to file '%1' is denied! - + Akses ke file %1 ditolak! @@ -822,111 +822,111 @@ Skip this version - + Lewati versi ini Remind me later - + Ingatkan saya nanti Install update - + Install update Install later - + Install nanti Save and Restart Now - + Simpan dan Restart Sekarang Save and Install Now - + Simpan dan Install Sekarang Download update - + Download update Software Update - + Update Software Release notes - + Catatan rilis An error occurred while start install updates! - + Terjadi kesalahan saat mulai install update! An error occurred while start replacing files: Update Service not found! - + Terjadi kesalahan saat mulai mengganti file: Layanan Update tidak ditemukan! Cancel - Batal + Batal Yes - Ya + Ya No - Tidak + Tidak OK - OK + OK Skip - + Lewati Buy Now - + Beli Sekarang Activate - + Aktivasi Continue - + Lanjutkan An error occurred while opening the portal:<br>%1 - + Terjadi kesalahan saat membuka portal:<br>%1 &OK diff --git a/win-linux/langs/lo.ts b/win-linux/langs/lo.ts index 08970871f..0f8f77a78 100644 --- a/win-linux/langs/lo.ts +++ b/win-linux/langs/lo.ts @@ -527,7 +527,7 @@ %1 doesn't exists!<br>Remove file from the list? - ບໍ່ມີ. ມັນອາດຈະຖືກປ່ຽນຊື່, ຍ້າຍຫລືລຶບ.<br>ທ່ານຕ້ອງການທີ່ຈະເອົາໄຟລ໌ນັ້ນອອກຈາກບັນຊີບໍ? + %1 ບໍ່ມີ. ມັນອາດຈະຖືກປ່ຽນຊື່, ຍ້າຍຫລືລຶບ.<br>ທ່ານຕ້ອງການທີ່ຈະເອົາໄຟລ໌ນັ້ນອອກຈາກບັນຊີບໍ? @@ -654,7 +654,7 @@ An error occurred while check updates: Update Service not found! - ມີຂໍ້ຜິດພາດເກີດຂຶ້ນໃນຂະນະທີ່ກວດສອບການອັບເດດ: ບໍ່ພົບບໍລິການອັບເດດ! + ມີຂໍ້ຜິດພາດເກີດຂຶ້ນໃນຂະນະທີ່ກວດສອບການອັບເດດ: ບໍ່ພົບບໍລິການອັບເດດ! @@ -664,12 +664,12 @@ An error occurred while loading updates: Update Service not found! - ເກີດຄວາມຜິດພາດໃນລະຫວ່າງການໂຫຼດອັບເດດ: ບໍ່ພົບບໍລິການອັບເດດ! + ເກີດຄວາມຜິດພາດໃນລະຫວ່າງການໂຫຼດອັບເດດ: ບໍ່ພົບບໍລິການອັບເດດ! Cancel - ຍົກເລີກ + ຍົກເລີກ @@ -689,7 +689,7 @@ An error occurred while unzip updates: Update Service not found! - ມີຂໍ້ຜິດພາດເກີດຂຶ້ນໃນຂະນະທີ່ unzip ອັບເດດ: ບໍ່ພົບບໍລິການອັບເດດ! + ມີຂໍ້ຜິດພາດເກີດຂຶ້ນໃນຂະນະທີ່ unzip ອັບເດດ: ບໍ່ພົບບໍລິການອັບເດດ! @@ -699,7 +699,7 @@ Download update - ດາວໂຫລດອັບເດດ + ດາວໂຫລດອັບເດດ diff --git a/win-linux/langs/lt.ts b/win-linux/langs/lt.ts index 10f1671c8..72e7456c3 100644 --- a/win-linux/langs/lt.ts +++ b/win-linux/langs/lt.ts @@ -95,7 +95,7 @@ Open Document - Atidaryti dokumentą + Atidaryti dokumentą @@ -518,22 +518,22 @@ File format not supported. - Failo formatas nepalaikomas. + Failo formatas nepalaikomas. %1 doesn't exists!<br>Remove file from the list? - %1 negalimas. Jis galėjo būti pervardytas, perkeltas arba ištrintas.<br>Ar norite panaikinti failą iš sąrašo? + %1 negalimas. Jis galėjo būti pervardytas, perkeltas arba ištrintas.<br>Ar norite panaikinti failą iš sąrašo? Document must be saved firstly. - Dokumentas pirma turi būti išsaugotas. + Dokumentas pirma turi būti išsaugotas. Document must be saved to continue.<br>Save the document? - Norint tęsti, dokumentas privalo būti išsaugotas.<br>Išsaugoti dokumentą? + Norint tęsti, dokumentas privalo būti išsaugotas.<br>Išsaugoti dokumentą? @@ -543,17 +543,17 @@ Print Document - Spausdinti dokumentą + Spausdinti dokumentą Sign Up - Sukurti portalą + Sukurti portalą %1 is modified.<br>Do you want to keep changes? - %1 buvo pakeistas.<br>Ar norite išsaugoti pakeitimus? + %1 buvo pakeistas.<br>Ar norite išsaugoti pakeitimus? @@ -665,7 +665,7 @@ Cancel - Atšaukti + Atšaukti @@ -881,23 +881,23 @@ Cancel - Atšaukti + Atšaukti Yes - Taip + Taip No - Ne + Ne OK - GERAI + GERAI diff --git a/win-linux/langs/no.ts b/win-linux/langs/no.ts index 9e4ed47c4..4e8260c65 100644 --- a/win-linux/langs/no.ts +++ b/win-linux/langs/no.ts @@ -95,7 +95,7 @@ Open Document - Åpne dokument + Åpne dokument @@ -518,22 +518,22 @@ File format not supported. - Filformatet støttes ikke. + Filformatet støttes ikke. %1 doesn't exists!<br>Remove file from the list? - %1 er ikke tilgjengelig. Den kan gis nytt navn, flyttes eller slettes.<br>Vil du fjerne filen fra listen? + %1 er ikke tilgjengelig. Den kan gis nytt navn, flyttes eller slettes.<br>Vil du fjerne filen fra listen? Document must be saved firstly. - Dokumentet må lagres først. + Dokumentet må lagres først. Document must be saved to continue.<br>Save the document? - Dokumentet må lagres for å kunne fortsette.<br>Lagre dokumentet? + Dokumentet må lagres for å kunne fortsette.<br>Lagre dokumentet? @@ -543,17 +543,17 @@ Print Document - Skriv ut dokumentet + Skriv ut dokumentet Sign Up - Opprett portal + Opprett portal %1 is modified.<br>Do you want to keep changes? - %1 har blit endret.<br>Vil du lagre endringene? + %1 har blit endret.<br>Vil du lagre endringene? @@ -665,7 +665,7 @@ Cancel - Avbryt + Avbryt @@ -881,23 +881,23 @@ Cancel - Avbryt + Avbryt Yes - Ja + Ja No - Nei + Nei OK - OK + OK diff --git a/win-linux/langs/si.ts b/win-linux/langs/si.ts index d038e7322..a09e00522 100644 --- a/win-linux/langs/si.ts +++ b/win-linux/langs/si.ts @@ -332,27 +332,27 @@ DOCX Document - + DOCX ලේඛනය OpenDocument Document template - + OpenDocument ලේඛන අච්චුව OpenDocument Presentation Template - + OpenDocument සමර්පණ අච්චුව Macro-enabled spreadsheet template - + සාර්ව-සක්‍රිය පැතුරුම්පත් අච්චුව OpenDocument Spreadsheet Template - + OpenDocument පැතුරුම්පත් අච්චුව @@ -382,7 +382,7 @@ SVG Image (*.svg) - + SVG අනුරුව (*.svg) @@ -466,19 +466,19 @@ Spreadsheet template - + පැතුරුම්පත් අච්චුව Presentation template - + සමර්පණ අච්චුව Document template - + ලේඛන අච්චුව @@ -524,12 +524,12 @@ More than one document is open.<br>Close the window anyway? - + ලේඛනයකට වඩා විවෘතයි.<br>කෙසේ වුවත් කවුළුව වසන්න ද? Don't ask again. - + නැවත අසන්න එපා. @@ -636,37 +636,37 @@ Check for updates - + යාවත්කාල පරීක්‍ෂා කරන්න Unable to check update: URL not defined. - + යාවත්කාල පරීක්‍ෂාවට නොහැකිය: ඒ.ස.නි. දක්වා නැත. To finish updating, restart app - + යාවත්කාලය නිමාවට යෙදුම යළි අරඹන්න Restart - + යළි අරඹන්න Checking for updates... - + යාවත්කාල පරීක්‍ෂා වෙමින් Updates are not allowed! - + යාවත්කාල සඳහා ඉඩ නොදේ! This folder configuration does not allow for updates! The folder name should be: - මෙම බහාලුම් වින්‍යාසය යාවත්කාල සඳහා ඉඩ නොදේ! බහාලුමේ නම විය යුතු වන්නේ: + මෙම බහාලුම් වින්‍යාසය යාවත්කාල සඳහා ඉඩ නොදේ! බහාලුමේ නම විය යුතු වන්නේ: @@ -676,7 +676,7 @@ Downloading new version %1 (%2%) - + නව අනුවාදය බාගැනෙමින් %1 (%2%) @@ -686,22 +686,22 @@ Cancel - අවලංගු + අවලංගු An error occurred while loading updates: package Url is empty! - + යාවත්කාලය පූරණයේ දී දෝෂයක් සිදු විය: ඇසුරුමේ ඒ.ස.නි. හිස්ය! Update package error: md5 sum does not match the original. - + යාවත්කාල වන ඇසුරුමේ දෝෂයකි: md5 ඓක්‍යය මුල් පිටපතට නොගැළපේ. Preparing update... - + යාවත්කාලයට සූදානම් වෙමින්... @@ -711,94 +711,94 @@ Update is available (version %1) - + යාවත්කාලයක් තිබේ (අනුවාදය %1) Download update - යාවත්කාලය බාගන්න + යාවත්කාලය බාගන්න Current version is up to date - + වත්මන් අනුවාදය යාවත්කාලීනයි An error occured while unpacking the archive - + හැකිළුම දිග හැරීමේදී දෝෂයක් සිදු විය Update download failed: out of memory! - + යාවත්කාලය බාගැනීමට අසමත් විය: මතකය පිරී ඇත! Update download failed: server connection error! - + යාවත්කාලය බාගැනීමට අසමත් විය: සේවාදායකයට සම්බන්ධතාවයේ දෝෂයකි! Update download failed: wrong URL! - + යාවත්කාලය බාගැනීමට අසමත් විය: ඒ.ස.නි. වැරදිය! Update download failed: unable to create file! - + යාවත්කාලය බාගැනීමට අසමත් විය: ගොනුව සෑදීමට නොහැකිය! Update download failed: network error! - + යාවත්කාලය බාගැනීමට අසමත් විය: ජාලයේ දෝෂයකි! A service error has occurred! - + සේවාවේ දෝෂයක් මතු විය! Last check performed %1 - + අවසාන පරීක්‍ෂාව: %1 Error opening JSON file. - + JSON ගොනුව ඇරීමේ දෝෂයකි. Update is available - + යාවත්කාලයක් තිබේ Current version - + වත්මන් අනුවාදය Update version - + නව අනුවාදය Would you like to download update now? - + දැන් යාවත්කාලය බාගැනීමට කැමතිද? Update is ready to install - + යාවත්කාලය ස්ථාපනය සඳහා සූදානම් Would you like to restart app now? - + දැන් යෙදුම නැවත ආරම්භයට කැමතිද? A new version of %1 is available! @@ -881,7 +881,7 @@ Install later - + පසුව ස්ථාපනය කරන්න @@ -893,7 +893,7 @@ Save and Install Now - ස්ථාපනය + සුරකින්න හා ස්ථාපනය කරන්න diff --git a/win-linux/langs/sk.ts b/win-linux/langs/sk.ts index 5a8b65aa2..987d9341d 100644 --- a/win-linux/langs/sk.ts +++ b/win-linux/langs/sk.ts @@ -705,37 +705,37 @@ An error occured while unpacking the archive - + Pri rozbaľovaní archívu došlo k chybe Update download failed: out of memory! - + Sťahovanie aktualizácie zlyhalo: nedostatok pamäte! Update download failed: server connection error! - + Stiahnutie aktualizácie zlyhalo: chyba pripojenia k serveru! Update download failed: wrong URL! - + Stiahnutie aktualizácie zlyhalo: nesprávna adresa URL! Update download failed: unable to create file! - + Stiahnutie aktualizácie zlyhalo: nepodarilo sa vytvoriť súbor! Update download failed: network error! - + Stiahnutie aktualizácie zlyhalo: chyba siete! A service error has occurred! - + Vyskytla sa chyba služby! @@ -745,7 +745,7 @@ Error opening JSON file. - + Chyba pri otváraní súboru JSON. @@ -852,7 +852,7 @@ Save and Install Now - Inštalovať + Uložiť a nainštalovať teraz diff --git a/win-linux/langs/tr.ts b/win-linux/langs/tr.ts index d74af3d9c..8cde6c09c 100644 --- a/win-linux/langs/tr.ts +++ b/win-linux/langs/tr.ts @@ -705,37 +705,37 @@ An error occured while unpacking the archive - + Arşivi açarken bir hata oluştu Update download failed: out of memory! - + Güncelleme indirme işlemi başarısız oldu: bellek yetersiz! Update download failed: server connection error! - + Güncelleme indirme işlemi başarısız oldu: sunucu bağlantı hatası! Update download failed: wrong URL! - + Güncelleme indirme işlemi başarısız oldu: yanlış URL! Update download failed: unable to create file! - + Güncelleme indirme işlemi başarısız oldu: dosya oluşturulamıyor! Update download failed: network error! - + Güncelleme indirme işlemi başarısız oldu: ağ hatası! A service error has occurred! - + Bir servis hatası oluştu! @@ -745,7 +745,7 @@ Error opening JSON file. - + JSON dosyası açılırken hata oluştu. @@ -852,7 +852,7 @@ Save and Install Now - Kurulum + Şimdi Kaydet ve Yükle diff --git a/win-linux/langs/uk.ts b/win-linux/langs/uk.ts index d61bb2571..e6160d358 100644 --- a/win-linux/langs/uk.ts +++ b/win-linux/langs/uk.ts @@ -705,37 +705,37 @@ An error occured while unpacking the archive - + Під час розпаковування архіву сталася помилка Update download failed: out of memory! - + Збій завантаження оновлення: недостатньо пам’яті! Update download failed: server connection error! - + Збій завантаження оновлення: помилка підключення до сервера! Update download failed: wrong URL! - + Збій завантаження оновлення: неправильна URL-адреса! Update download failed: unable to create file! - + Збій завантаження оновлення: неможливо створити файл! Update download failed: network error! - + Збій завантаження оновлення: помилка мережі! A service error has occurred! - + Сталася помилка служби! @@ -745,7 +745,7 @@ Error opening JSON file. - + Помилка відкриття файлу JSON. @@ -852,7 +852,7 @@ Save and Install Now - Установити + Зберегти й інсталювати зараз diff --git a/win-linux/langs/zh_CN.ts b/win-linux/langs/zh_CN.ts index f1325d817..00723a261 100644 --- a/win-linux/langs/zh_CN.ts +++ b/win-linux/langs/zh_CN.ts @@ -648,7 +648,7 @@ Unable to check update: URL not defined. - + 无法检查更新:URL 未定义。 From 7f81e2ec45fe739c53bb66a974fc890c02dd5cee Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Wed, 29 Nov 2023 16:55:37 +0200 Subject: [PATCH 011/316] [linux] fix bug 50898 --- win-linux/src/cfilechecker.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/win-linux/src/cfilechecker.cpp b/win-linux/src/cfilechecker.cpp index 2b71f08a5..63483b727 100644 --- a/win-linux/src/cfilechecker.cpp +++ b/win-linux/src/cfilechecker.cpp @@ -4,6 +4,7 @@ #include #include #include +#include "utils.h" #define FILE_UNKNOWN 0 @@ -42,15 +43,7 @@ void CFileInspector::run() bool CFileInspector::isLocalFile(const QString& path) { - QUrl url = QUrl::fromUserInput(path); - if ( !url.isValid() ) { - QFileInfo info(path); - - if ( info.isFile() ) - return QUrl::fromUserInput(info.absoluteFilePath()).isLocalFile(); - } - - return url.isLocalFile(); + return Utils::isFileLocal(path); } /**/ From 4b6ca9c1cca4da72faf83284ff0366429a31c72a Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Thu, 30 Nov 2023 15:39:30 +0200 Subject: [PATCH 012/316] [win-linux] updmanager: add support for translation of service messages --- .../extras/update-daemon/UpdateDaemon.pro | 7 + win-linux/extras/update-daemon/common.pri | 6 +- .../extras/update-daemon/res/gresource.c | 402 ++++++++++++++++++ .../extras/update-daemon/res/gresource.xml | 12 + .../extras/update-daemon/res/langs/langs.iss | 54 +++ win-linux/extras/update-daemon/res/version.rc | 1 + .../update-daemon/src/classes/csocket.h | 1 + .../update-daemon/src/classes/csvcmanager.cpp | 33 +- .../classes/platform_linux/capplication.cpp | 3 +- .../update-daemon/src/classes/translator.cpp | 307 +++++++++++++ .../update-daemon/src/classes/translator.h | 56 +++ .../update-daemon/src/platform_linux/main.cpp | 4 + .../src/platform_linux/utils.cpp | 14 +- .../update-daemon/src/platform_linux/utils.h | 6 +- .../update-daemon/src/platform_win/main.cpp | 9 +- .../update-daemon/src/platform_win/resource.h | 2 + .../src/platform_win/svccontrol.cpp | 1 + .../update-daemon/src/platform_win/utils.cpp | 23 +- .../update-daemon/src/platform_win/utils.h | 5 +- .../src/cascapplicationmanagerwrapper.cpp | 5 +- win-linux/src/cupdatemanager.cpp | 9 + win-linux/src/cupdatemanager.h | 1 + 22 files changed, 938 insertions(+), 23 deletions(-) create mode 100644 win-linux/extras/update-daemon/res/gresource.c create mode 100644 win-linux/extras/update-daemon/res/gresource.xml create mode 100644 win-linux/extras/update-daemon/res/langs/langs.iss create mode 100644 win-linux/extras/update-daemon/src/classes/translator.cpp create mode 100644 win-linux/extras/update-daemon/src/classes/translator.h diff --git a/win-linux/extras/update-daemon/UpdateDaemon.pro b/win-linux/extras/update-daemon/UpdateDaemon.pro index 936837d9b..a442bcc8c 100644 --- a/win-linux/extras/update-daemon/UpdateDaemon.pro +++ b/win-linux/extras/update-daemon/UpdateDaemon.pro @@ -4,3 +4,10 @@ include(common.pri) DEFINES += COPYRIGHT_YEAR=$${CURRENT_YEAR} DEFINES += APP_ICON_PATH=\"./icons/desktopeditors.ico\" +DEFINES += APP_LANG_PATH=\"./langs/langs.iss\" + +core_linux { + SOURCES += $$PWD/res/gresource.c +} + +OTHER_FILES += $$PWD/res/langs/langs.iss diff --git a/win-linux/extras/update-daemon/common.pri b/win-linux/extras/update-daemon/common.pri index 22e26d609..43b6a475b 100644 --- a/win-linux/extras/update-daemon/common.pri +++ b/win-linux/extras/update-daemon/common.pri @@ -17,10 +17,12 @@ INCLUDEPATH += $$PWD/../../src/prop HEADERS += $$PWD/src/version.h \ $$PWD/src/classes/csocket.h \ - $$PWD/src/classes/csvcmanager.h + $$PWD/src/classes/csvcmanager.h \ + $$PWD/src/classes/translator.h SOURCES += $$PWD/src/classes/csocket.cpp \ - $$PWD/src/classes/csvcmanager.cpp + $$PWD/src/classes/csvcmanager.cpp \ + $$PWD/src/classes/translator.cpp ENV_PRODUCT_VERSION = $$(PRODUCT_VERSION) !isEmpty(ENV_PRODUCT_VERSION) { diff --git a/win-linux/extras/update-daemon/res/gresource.c b/win-linux/extras/update-daemon/res/gresource.c new file mode 100644 index 000000000..29deae304 --- /dev/null +++ b/win-linux/extras/update-daemon/res/gresource.c @@ -0,0 +1,402 @@ +#include + +#if defined (__ELF__) && ( __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6)) +# define SECTION __attribute__ ((section (".gresource.gresource"), aligned (8))) +#else +# define SECTION +#endif + +static const SECTION union { const guint8 data[3129]; const double alignment; void * const ptr;} gresource_resource_data = { + "\107\126\141\162\151\141\156\164\000\000\000\000\000\000\000\000" + "\030\000\000\000\164\000\000\000\000\000\000\050\003\000\000\000" + "\000\000\000\000\001\000\000\000\002\000\000\000\052\042\323\171" + "\001\000\000\000\164\000\000\000\011\000\166\000\200\000\000\000" + "\045\014\000\000\170\110\267\050\002\000\000\000\045\014\000\000" + "\006\000\114\000\054\014\000\000\060\014\000\000\324\265\002\000" + "\377\377\377\377\060\014\000\000\001\000\114\000\064\014\000\000" + "\070\014\000\000\154\141\156\147\163\056\151\163\163\000\000\000" + "\225\013\000\000\000\000\000\000\133\103\165\163\164\157\155\115" + "\145\163\163\141\147\145\163\135\012\012\145\156\056\103\101\120" + "\124\111\117\116\137\124\105\130\124\040\075\117\116\114\131\117" + "\106\106\111\103\105\040\125\160\144\141\164\145\040\123\145\162" + "\166\151\143\145\012\162\165\056\103\101\120\124\111\117\116\137" + "\124\105\130\124\040\075\320\241\320\265\321\200\320\262\320\270" + "\321\201\040\320\276\320\261\320\275\320\276\320\262\320\273\320" + "\265\320\275\320\270\320\271\040\117\116\114\131\117\106\106\111" + "\103\105\012\012\145\156\056\115\105\123\123\101\107\105\137\124" + "\105\130\124\137\105\122\122\061\040\075\101\156\040\145\162\162" + "\157\162\040\157\143\143\165\162\162\145\144\072\012\162\165\056" + "\115\105\123\123\101\107\105\137\124\105\130\124\137\105\122\122" + "\061\040\075\320\237\321\200\320\276\320\270\320\267\320\276\321" + "\210\320\273\320\260\040\320\276\321\210\320\270\320\261\320\272" + "\320\260\072\012\012\145\156\056\115\105\123\123\101\107\105\137" + "\124\105\130\124\137\105\122\122\062\040\075\101\156\040\145\162" + "\162\157\162\040\157\143\143\165\162\162\145\144\040\167\150\151" + "\154\145\040\144\145\154\145\164\151\156\147\072\012\162\165\056" + "\115\105\123\123\101\107\105\137\124\105\130\124\137\105\122\122" + "\062\040\075\320\237\321\200\320\276\320\270\320\267\320\276\321" + "\210\320\273\320\260\040\320\276\321\210\320\270\320\261\320\272" + "\320\260\040\320\277\321\200\320\270\040\321\203\320\264\320\260" + "\320\273\320\265\320\275\320\270\320\270\072\012\012\145\156\056" + "\115\105\123\123\101\107\105\137\124\105\130\124\137\105\122\122" + "\063\040\075\101\156\040\145\162\162\157\162\040\157\143\143\165" + "\162\162\145\144\040\167\150\151\154\145\040\143\162\145\141\164" + "\151\156\147\072\012\162\165\056\115\105\123\123\101\107\105\137" + "\124\105\130\124\137\105\122\122\063\040\075\320\237\321\200\320" + "\276\320\270\320\267\320\276\321\210\320\273\320\260\040\320\276" + "\321\210\320\270\320\261\320\272\320\260\040\320\277\321\200\320" + "\270\040\321\201\320\276\320\267\320\264\320\260\320\275\320\270" + "\320\270\072\012\012\145\156\056\115\105\123\123\101\107\105\137" + "\124\105\130\124\137\105\122\122\064\040\075\101\156\040\145\162" + "\162\157\162\040\157\143\143\165\162\162\145\144\040\167\150\151" + "\154\145\040\162\145\163\164\141\162\164\151\156\147\040\164\150" + "\145\040\163\145\162\166\151\143\145\041\012\162\165\056\115\105" + "\123\123\101\107\105\137\124\105\130\124\137\105\122\122\064\040" + "\075\320\237\321\200\320\276\320\270\320\267\320\276\321\210\320" + "\273\320\260\040\320\276\321\210\320\270\320\261\320\272\320\260" + "\040\320\277\321\200\320\270\040\320\277\320\265\321\200\320\265" + "\320\267\320\260\320\277\321\203\321\201\320\272\320\265\040\321" + "\201\320\265\321\200\320\262\320\270\321\201\320\260\041\012\012" + "\145\156\056\115\105\123\123\101\107\105\137\124\105\130\124\137" + "\105\122\122\065\040\075\125\160\144\141\164\145\040\143\141\156" + "\143\145\154\154\145\144\056\040\103\141\156\047\164\040\146\151" + "\156\144\040\146\157\154\144\145\162\072\012\162\165\056\115\105" + "\123\123\101\107\105\137\124\105\130\124\137\105\122\122\065\040" + "\075\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320" + "\275\320\270\320\265\040\320\276\321\202\320\274\320\265\320\275" + "\320\265\320\275\320\276\056\040\320\235\320\265\040\321\203\320" + "\264\320\260\320\273\320\276\321\201\321\214\040\320\275\320\260" + "\320\271\321\202\320\270\040\320\277\320\260\320\277\320\272\321" + "\203\072\012\012\145\156\056\115\105\123\123\101\107\105\137\124" + "\105\130\124\137\105\122\122\066\040\075\125\160\144\141\164\145" + "\040\143\141\156\143\145\154\154\145\144\056\040\124\150\145\040" + "\146\151\154\145\040\163\151\147\156\141\164\165\162\145\040\151" + "\163\040\155\151\163\163\151\156\147\072\012\162\165\056\115\105" + "\123\123\101\107\105\137\124\105\130\124\137\105\122\122\066\040" + "\075\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320" + "\275\320\270\320\265\040\320\276\321\202\320\274\320\265\320\275" + "\320\265\320\275\320\276\056\040\320\236\321\202\321\201\321\203" + "\321\202\321\201\321\202\320\262\321\203\320\265\321\202\040\320" + "\277\320\276\320\264\320\277\320\270\321\201\321\214\040\321\204" + "\320\260\320\271\320\273\320\260\072\012\012\145\156\056\115\105" + "\123\123\101\107\105\137\124\105\130\124\137\105\122\122\067\040" + "\075\125\160\144\141\164\145\040\143\141\156\143\145\154\154\145" + "\144\056\040\103\141\156\047\164\040\144\145\154\145\164\145\040" + "\146\157\154\144\145\162\072\012\162\165\056\115\105\123\123\101" + "\107\105\137\124\105\130\124\137\105\122\122\067\040\075\320\236" + "\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270" + "\320\265\040\320\276\321\202\320\274\320\265\320\275\320\265\320" + "\275\320\276\056\040\320\235\320\265\040\321\203\320\264\320\260" + "\320\273\320\276\321\201\321\214\040\321\203\320\264\320\260\320" + "\273\320\270\321\202\321\214\040\320\277\320\260\320\277\320\272" + "\321\203\072\012\012\145\156\056\115\105\123\123\101\107\105\137" + "\124\105\130\124\137\105\122\122\070\040\075\125\160\144\141\164" + "\145\040\143\141\156\143\145\154\154\145\144\056\040\124\150\145" + "\040\160\162\157\147\162\141\155\040\151\163\040\156\157\164\040" + "\143\154\157\163\145\144\072\012\162\165\056\115\105\123\123\101" + "\107\105\137\124\105\130\124\137\105\122\122\070\040\075\320\236" + "\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270" + "\320\265\040\320\276\321\202\320\274\320\265\320\275\320\265\320" + "\275\320\276\056\040\320\237\321\200\320\270\320\273\320\276\320" + "\266\320\265\320\275\320\270\320\265\040\320\275\320\265\040\320" + "\267\320\260\320\272\321\200\321\213\321\202\320\276\072\012\012" + "\145\156\056\115\105\123\123\101\107\105\137\124\105\130\124\137" + "\105\122\122\071\040\075\125\160\144\141\164\145\040\143\141\156" + "\143\145\154\154\145\144\056\040\103\141\156\047\164\040\143\162" + "\145\141\164\145\040\146\157\154\144\145\162\072\012\162\165\056" + "\115\105\123\123\101\107\105\137\124\105\130\124\137\105\122\122" + "\071\040\075\320\236\320\261\320\275\320\276\320\262\320\273\320" + "\265\320\275\320\270\320\265\040\320\276\321\202\320\274\320\265" + "\320\275\320\265\320\275\320\276\056\040\320\235\320\265\040\321" + "\203\320\264\320\260\320\273\320\276\321\201\321\214\040\321\201" + "\320\276\320\267\320\264\320\260\321\202\321\214\040\320\277\320" + "\260\320\277\320\272\321\203\072\012\012\145\156\056\115\105\123" + "\123\101\107\105\137\124\105\130\124\137\105\122\122\061\060\040" + "\075\125\160\144\141\164\145\040\143\141\156\143\145\154\154\145" + "\144\056\040\103\141\156\047\164\040\162\145\160\154\141\143\145" + "\040\146\151\154\145\163\040\164\157\040\142\141\143\153\165\160" + "\072\012\162\165\056\115\105\123\123\101\107\105\137\124\105\130" + "\124\137\105\122\122\061\060\040\075\320\236\320\261\320\275\320" + "\276\320\262\320\273\320\265\320\275\320\270\320\265\040\320\276" + "\321\202\320\274\320\265\320\275\320\265\320\275\320\276\056\040" + "\320\235\320\265\040\321\203\320\264\320\260\320\273\320\276\321" + "\201\321\214\040\320\277\320\265\321\200\320\265\320\274\320\265" + "\321\201\321\202\320\270\321\202\321\214\040\321\204\320\260\320" + "\271\320\273\321\213\040\320\262\040\321\200\320\265\320\267\320" + "\265\321\200\320\262\320\275\321\203\321\216\040\320\272\320\276" + "\320\277\320\270\321\216\072\012\012\145\156\056\115\105\123\123" + "\101\107\105\137\124\105\130\124\137\105\122\122\061\061\040\075" + "\103\141\156\047\164\040\162\145\163\164\157\162\145\040\146\151" + "\154\145\163\040\146\162\157\155\040\142\141\143\153\165\160\041" + "\012\162\165\056\115\105\123\123\101\107\105\137\124\105\130\124" + "\137\105\122\122\061\061\040\075\320\235\320\265\040\321\203\320" + "\264\320\260\320\273\320\276\321\201\321\214\040\320\262\320\276" + "\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\270" + "\321\202\321\214\040\321\204\320\260\320\271\320\273\321\213\040" + "\320\270\320\267\040\321\200\320\265\320\267\320\265\321\200\320" + "\262\320\275\320\276\320\271\040\320\272\320\276\320\277\320\270" + "\320\270\041\012\012\145\156\056\115\105\123\123\101\107\105\137" + "\124\105\130\124\137\105\122\122\061\062\040\075\125\160\144\141" + "\164\145\040\143\141\156\143\145\154\154\145\144\056\040\103\141" + "\156\047\164\040\155\157\166\145\040\165\160\144\141\164\145\163" + "\040\164\157\040\101\160\160\040\160\141\164\150\072\012\162\165" + "\056\115\105\123\123\101\107\105\137\124\105\130\124\137\105\122" + "\122\061\062\040\075\320\236\320\261\320\275\320\276\320\262\320" + "\273\320\265\320\275\320\270\320\265\040\320\276\321\202\320\274" + "\320\265\320\275\320\265\320\275\320\276\056\040\320\235\320\265" + "\040\321\203\320\264\320\260\320\273\320\276\321\201\321\214\040" + "\320\277\320\265\321\200\320\265\320\274\320\265\321\201\321\202" + "\320\270\321\202\321\214\040\320\276\320\261\320\275\320\276\320" + "\262\320\273\320\265\320\275\320\270\321\217\040\320\262\040\320" + "\277\320\260\320\277\320\272\321\203\040\320\277\321\200\320\270" + "\320\273\320\276\320\266\320\265\320\275\320\270\321\217\072\012" + "\012\145\156\056\115\105\123\123\101\107\105\137\124\105\130\124" + "\137\105\122\122\061\063\040\075\101\156\040\145\162\162\157\162" + "\040\157\143\143\165\162\162\145\144\040\167\150\151\154\145\040" + "\162\145\155\157\166\145\040\101\160\160\040\160\141\164\150\072" + "\012\162\165\056\115\105\123\123\101\107\105\137\124\105\130\124" + "\137\105\122\122\061\063\040\075\320\237\321\200\320\276\320\270" + "\320\267\320\276\321\210\320\273\320\260\040\320\276\321\210\320" + "\270\320\261\320\272\320\260\040\320\277\321\200\320\270\040\321" + "\203\320\264\320\260\320\273\320\265\320\275\320\270\320\270\040" + "\320\277\320\260\320\277\320\272\320\270\040\320\277\321\200\320" + "\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217\072" + "\012\012\145\156\056\115\105\123\123\101\107\105\137\124\105\130" + "\124\137\105\122\122\061\064\040\075\101\156\040\145\162\162\157" + "\162\040\157\143\143\165\162\162\145\144\040\167\150\151\154\145" + "\040\162\145\163\164\157\162\145\040\146\151\154\145\163\040\146" + "\162\157\155\040\142\141\143\153\165\160\072\012\162\165\056\115" + "\105\123\123\101\107\105\137\124\105\130\124\137\105\122\122\061" + "\064\040\075\320\237\321\200\320\276\320\270\320\267\320\276\321" + "\210\320\273\320\260\040\320\276\321\210\320\270\320\261\320\272" + "\320\260\040\320\277\321\200\320\270\040\320\262\320\276\321\201" + "\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265" + "\320\275\320\270\320\270\040\321\204\320\260\320\271\320\273\320" + "\276\320\262\040\320\270\320\267\040\321\200\320\265\320\267\320" + "\265\321\200\320\262\320\275\320\276\320\271\040\320\272\320\276" + "\320\277\320\270\320\270\072\012\012\145\156\056\115\105\123\123" + "\101\107\105\137\124\105\130\124\137\105\122\122\061\065\040\075" + "\101\156\040\145\162\162\157\162\040\157\143\143\165\162\162\145" + "\144\040\167\150\151\154\145\040\162\145\163\164\141\162\164\151" + "\156\147\040\164\150\145\040\160\162\157\147\162\141\155\041\012" + "\162\165\056\115\105\123\123\101\107\105\137\124\105\130\124\137" + "\105\122\122\061\065\040\075\320\237\321\200\320\276\320\270\320" + "\267\320\276\321\210\320\273\320\260\040\320\276\321\210\320\270" + "\320\261\320\272\320\260\040\320\277\321\200\320\270\040\320\277" + "\320\265\321\200\320\265\320\267\320\260\320\277\321\203\321\201" + "\320\272\320\265\040\320\277\321\200\320\270\320\273\320\276\320" + "\266\320\265\320\275\320\270\321\217\041\012\012\145\156\056\115" + "\105\123\123\101\107\105\137\124\105\130\124\137\105\122\122\061" + "\066\040\075\123\104\114\040\151\156\151\164\040\145\162\162\157" + "\162\072\012\162\165\056\115\105\123\123\101\107\105\137\124\105" + "\130\124\137\105\122\122\061\066\040\075\320\236\321\210\320\270" + "\320\261\320\272\320\260\040\320\270\320\275\320\270\321\206\320" + "\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\320" + "\270\040\123\104\114\072\012\012\145\156\056\115\105\123\123\101" + "\107\105\137\124\105\130\124\137\105\122\122\061\067\040\075\123" + "\145\162\166\151\143\145\103\164\162\154\104\151\163\160\141\164" + "\143\150\145\162\040\162\145\164\165\162\156\145\144\040\145\162" + "\162\157\162\072\012\162\165\056\115\105\123\123\101\107\105\137" + "\124\105\130\124\137\105\122\122\061\067\040\075\123\145\162\166" + "\151\143\145\103\164\162\154\104\151\163\160\141\164\143\150\145" + "\162\040\320\262\320\265\321\200\320\275\321\203\320\273\040\320" + "\276\321\210\320\270\320\261\320\272\321\203\072\012\000\000\050" + "\165\165\141\171\051\154\141\156\147\163\057\000\000\000\000\000" + "\057\000\000\000\001\000\000\000" }; + +static GStaticResource static_resource = { gresource_resource_data.data, sizeof (gresource_resource_data.data) - 1 /* nul terminator */, NULL, NULL, NULL }; + +G_MODULE_EXPORT +GResource *gresource_get_resource (void); +GResource *gresource_get_resource (void) +{ + return g_static_resource_get_resource (&static_resource); +} +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#ifndef __G_CONSTRUCTOR_H__ +#define __G_CONSTRUCTOR_H__ + +/* + If G_HAS_CONSTRUCTORS is true then the compiler support *both* constructors and + destructors, in a usable way, including e.g. on library unload. If not you're on + your own. + + Some compilers need #pragma to handle this, which does not work with macros, + so the way you need to use this is (for constructors): + + #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA + #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(my_constructor) + #endif + G_DEFINE_CONSTRUCTOR(my_constructor) + static void my_constructor(void) { + ... + } + +*/ + +#ifndef __GTK_DOC_IGNORE__ + +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) + +#define G_HAS_CONSTRUCTORS 1 + +#define G_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void); +#define G_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void); + +#elif defined (_MSC_VER) && (_MSC_VER >= 1500) +/* Visual studio 2008 and later has _Pragma */ + +/* + * Only try to include gslist.h if not already included via glib.h, + * so that items using gconstructor.h outside of GLib (such as + * GResources) continue to build properly. + */ +#ifndef __G_LIB_H__ +#include "gslist.h" +#endif + +#include + +#define G_HAS_CONSTRUCTORS 1 + +/* We do some weird things to avoid the constructors being optimized + * away on VS2015 if WholeProgramOptimization is enabled. First we + * make a reference to the array from the wrapper to make sure its + * references. Then we use a pragma to make sure the wrapper function + * symbol is always included at the link stage. Also, the symbols + * need to be extern (but not dllexport), even though they are not + * really used from another object file. + */ + +/* We need to account for differences between the mangling of symbols + * for x86 and x64/ARM/ARM64 programs, as symbols on x86 are prefixed + * with an underscore but symbols on x64/ARM/ARM64 are not. + */ +#ifdef _M_IX86 +#define G_MSVC_SYMBOL_PREFIX "_" +#else +#define G_MSVC_SYMBOL_PREFIX "" +#endif + +#define G_DEFINE_CONSTRUCTOR(_func) G_MSVC_CTOR (_func, G_MSVC_SYMBOL_PREFIX) +#define G_DEFINE_DESTRUCTOR(_func) G_MSVC_DTOR (_func, G_MSVC_SYMBOL_PREFIX) + +#define G_MSVC_CTOR(_func,_sym_prefix) \ + static void _func(void); \ + extern int (* _array ## _func)(void); \ + int _func ## _wrapper(void); \ + int _func ## _wrapper(void) { _func(); g_slist_find (NULL, _array ## _func); return 0; } \ + __pragma(comment(linker,"/include:" _sym_prefix # _func "_wrapper")) \ + __pragma(section(".CRT$XCU",read)) \ + __declspec(allocate(".CRT$XCU")) int (* _array ## _func)(void) = _func ## _wrapper; + +#define G_MSVC_DTOR(_func,_sym_prefix) \ + static void _func(void); \ + extern int (* _array ## _func)(void); \ + int _func ## _constructor(void); \ + int _func ## _constructor(void) { atexit (_func); g_slist_find (NULL, _array ## _func); return 0; } \ + __pragma(comment(linker,"/include:" _sym_prefix # _func "_constructor")) \ + __pragma(section(".CRT$XCU",read)) \ + __declspec(allocate(".CRT$XCU")) int (* _array ## _func)(void) = _func ## _constructor; + +#elif defined (_MSC_VER) + +#define G_HAS_CONSTRUCTORS 1 + +/* Pre Visual studio 2008 must use #pragma section */ +#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 +#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 + +#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ + section(".CRT$XCU",read) +#define G_DEFINE_CONSTRUCTOR(_func) \ + static void _func(void); \ + static int _func ## _wrapper(void) { _func(); return 0; } \ + __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func ## _wrapper; + +#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ + section(".CRT$XCU",read) +#define G_DEFINE_DESTRUCTOR(_func) \ + static void _func(void); \ + static int _func ## _constructor(void) { atexit (_func); return 0; } \ + __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; + +#elif defined(__SUNPRO_C) + +/* This is not tested, but i believe it should work, based on: + * http://opensource.apple.com/source/OpenSSL098/OpenSSL098-35/src/fips/fips_premain.c + */ + +#define G_HAS_CONSTRUCTORS 1 + +#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 +#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 + +#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ + init(_func) +#define G_DEFINE_CONSTRUCTOR(_func) \ + static void _func(void); + +#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ + fini(_func) +#define G_DEFINE_DESTRUCTOR(_func) \ + static void _func(void); + +#else + +/* constructors not supported for this compiler */ + +#endif + +#endif /* __GTK_DOC_IGNORE__ */ +#endif /* __G_CONSTRUCTOR_H__ */ + +#ifdef G_HAS_CONSTRUCTORS + +#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA +#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(gresourceresource_constructor) +#endif +G_DEFINE_CONSTRUCTOR(gresourceresource_constructor) +#ifdef G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA +#pragma G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(gresourceresource_destructor) +#endif +G_DEFINE_DESTRUCTOR(gresourceresource_destructor) + +#else +#warning "Constructor not supported on this compiler, linking in resources will not work" +#endif + +static void gresourceresource_constructor (void) +{ + g_static_resource_init (&static_resource); +} + +static void gresourceresource_destructor (void) +{ + g_static_resource_fini (&static_resource); +} diff --git a/win-linux/extras/update-daemon/res/gresource.xml b/win-linux/extras/update-daemon/res/gresource.xml new file mode 100644 index 000000000..2d420e866 --- /dev/null +++ b/win-linux/extras/update-daemon/res/gresource.xml @@ -0,0 +1,12 @@ + + + + langs/langs.iss + + + + diff --git a/win-linux/extras/update-daemon/res/langs/langs.iss b/win-linux/extras/update-daemon/res/langs/langs.iss new file mode 100644 index 000000000..6ddb24233 --- /dev/null +++ b/win-linux/extras/update-daemon/res/langs/langs.iss @@ -0,0 +1,54 @@ + +en.CAPTION_TEXT =ONLYOFFICE Update Service +ru.CAPTION_TEXT =Сервис обновлений ONLYOFFICE + +en.MESSAGE_TEXT_ERR1 =An error occurred: +ru.MESSAGE_TEXT_ERR1 =Произошла ошибка: + +en.MESSAGE_TEXT_ERR2 =An error occurred while deleting: +ru.MESSAGE_TEXT_ERR2 =Произошла ошибка при удалении: + +en.MESSAGE_TEXT_ERR3 =An error occurred while creating: +ru.MESSAGE_TEXT_ERR3 =Произошла ошибка при создании: + +en.MESSAGE_TEXT_ERR4 =An error occurred while restarting the service! +ru.MESSAGE_TEXT_ERR4 =Произошла ошибка при перезапуске сервиса! + +en.MESSAGE_TEXT_ERR5 =Update cancelled. Can't find folder: +ru.MESSAGE_TEXT_ERR5 =Обновление отменено. Не удалось найти папку: + +en.MESSAGE_TEXT_ERR6 =Update cancelled. The file signature is missing: +ru.MESSAGE_TEXT_ERR6 =Обновление отменено. Отсутствует подпись файла: + +en.MESSAGE_TEXT_ERR7 =Update cancelled. Can't delete folder: +ru.MESSAGE_TEXT_ERR7 =Обновление отменено. Не удалось удалить папку: + +en.MESSAGE_TEXT_ERR8 =Update cancelled. The program is not closed: +ru.MESSAGE_TEXT_ERR8 =Обновление отменено. Приложение не закрыто: + +en.MESSAGE_TEXT_ERR9 =Update cancelled. Can't create folder: +ru.MESSAGE_TEXT_ERR9 =Обновление отменено. Не удалось создать папку: + +en.MESSAGE_TEXT_ERR10 =Update cancelled. Can't replace files to backup: +ru.MESSAGE_TEXT_ERR10 =Обновление отменено. Не удалось переместить файлы в резервную копию: + +en.MESSAGE_TEXT_ERR11 =Can't restore files from backup! +ru.MESSAGE_TEXT_ERR11 =Не удалось восстановить файлы из резервной копии! + +en.MESSAGE_TEXT_ERR12 =Update cancelled. Can't move updates to App path: +ru.MESSAGE_TEXT_ERR12 =Обновление отменено. Не удалось переместить обновления в папку приложения: + +en.MESSAGE_TEXT_ERR13 =An error occurred while remove App path: +ru.MESSAGE_TEXT_ERR13 =Произошла ошибка при удалении папки приложения: + +en.MESSAGE_TEXT_ERR14 =An error occurred while restore files from backup: +ru.MESSAGE_TEXT_ERR14 =Произошла ошибка при восстановлении файлов из резервной копии: + +en.MESSAGE_TEXT_ERR15 =An error occurred while restarting the program! +ru.MESSAGE_TEXT_ERR15 =Произошла ошибка при перезапуске приложения! + +en.MESSAGE_TEXT_ERR16 =SDL init error: +ru.MESSAGE_TEXT_ERR16 =Ошибка инициализации SDL: + +en.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher returned error: +ru.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher вернул ошибку: diff --git a/win-linux/extras/update-daemon/res/version.rc b/win-linux/extras/update-daemon/res/version.rc index b85c01952..923c86acc 100644 --- a/win-linux/extras/update-daemon/res/version.rc +++ b/win-linux/extras/update-daemon/res/version.rc @@ -3,6 +3,7 @@ #include "../src/platform_win/resource.h" IDI_MAINICON ICON DISCARDABLE APP_ICON_PATH +IDT_TRANSLATIONS RCDATA APP_LANG_PATH CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "./manifest/updatesvc.exe.manifest" #include "../src/version.h" diff --git a/win-linux/extras/update-daemon/src/classes/csocket.h b/win-linux/extras/update-daemon/src/classes/csocket.h index 3a7573c1b..12568e0c4 100644 --- a/win-linux/extras/update-daemon/src/classes/csocket.h +++ b/win-linux/extras/update-daemon/src/classes/csocket.h @@ -68,6 +68,7 @@ enum MsgCommands { MSG_Progress, MSG_StopDownload, MSG_OtherError, + MSG_SetLanguage, MSG_RequestContentLenght }; diff --git a/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp b/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp index 1ca369426..07e06e4bc 100644 --- a/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp +++ b/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp @@ -44,6 +44,7 @@ # define WIN32_LEAN_AND_MEAN # endif # include "platform_win/utils.h" +# include "classes/translator.h" # include # include # include @@ -132,7 +133,7 @@ auto restartService()->void { const wstring fileName = NS_File::appPath() + RESTART_BATCH; if (NS_File::fileExists(fileName) && !NS_File::removeFile(fileName)) { - NS_Logger::WriteLog(L"An error occurred while deleting: " + fileName, true); + NS_Logger::WriteLog(_TR("An error occurred while deleting:") + _T(" ") + fileName, true); return; } @@ -146,7 +147,7 @@ auto restartService()->void }; if (!NS_File::writeToFile(fileName, batch)) { - NS_Logger::WriteLog(L"An error occurred while creating: " + fileName, true); + NS_Logger::WriteLog(_TR("An error occurred while creating:") + _T(" ") + fileName, true); return; } @@ -158,7 +159,7 @@ auto restartService()->void if (!CreateProcess(NULL, const_cast(fileName.c_str()), NULL, NULL, FALSE, CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT, NULL, NULL, &si, &pi)) { - NS_Logger::WriteLog(L"An error occurred while restarting the service!", true); + NS_Logger::WriteLog(_TR("An error occurred while restarting the service!"), true); return; } CloseHandle(pi.hProcess); @@ -265,6 +266,10 @@ void CSvcManager::init() clearTempFiles(params[1], params[2]); break; + case MSG_SetLanguage: + Translator::setLanguage(params[1]); + break; + default: break; } @@ -454,7 +459,7 @@ void CSvcManager::startReplacingFiles(const tstring &packageType, const bool res tstring updSubPath = NS_File::fileExists(updPath + SUBFOLDER + APP_LAUNCH_NAME) ? updPath + SUBFOLDER : updPath; tstring tmpPath = NS_File::parentPath(appPath) + BACKUP_PATH; if (!NS_File::dirExists(updPath)) { - NS_Logger::WriteLog(_T("Update cancelled. Can't find folder: ") + updPath, true); + NS_Logger::WriteLog(_TR("Update cancelled. Can't find folder:") + _T(" ") + updPath, true); return; } @@ -465,7 +470,7 @@ void CSvcManager::startReplacingFiles(const tstring &packageType, const bool res tstring apps[] = {APP_LAUNCH_NAME, APP_LAUNCH_NAME2, APP_HELPER, DAEMON_NAME}; for (int i = 0; i < sizeof(apps) / sizeof(apps[0]); i++) { if (!NS_File::verifyEmbeddedSignature(updSubPath + apps[i])) { - NS_Logger::WriteLog(L"Update cancelled. The file signature is missing: " + updSubPath + apps[i], true); + NS_Logger::WriteLog(_TR("Update cancelled. The file signature is missing:") + _T(" ") + updSubPath + apps[i], true); return; } } @@ -475,7 +480,7 @@ void CSvcManager::startReplacingFiles(const tstring &packageType, const bool res // Check backup folder if (NS_File::dirExists(tmpPath) && !NS_File::removeDirRecursively(tmpPath)) { - NS_Logger::WriteLog(_T("Update cancelled. Can't delete folder: ") + tmpPath, true); + NS_Logger::WriteLog(_TR("Update cancelled. Can't delete folder:") + _T(" ") + tmpPath, true); return; } @@ -494,7 +499,7 @@ void CSvcManager::startReplacingFiles(const tstring &packageType, const bool res sleep(500); if (NS_File::isProcessRunning(app)) { - NS_Logger::WriteLog(_T("Update cancelled. The ") + app + _T(" is not closed!"), true); + NS_Logger::WriteLog(_TR("Update cancelled. The program is not closed:") + _T(" ") + app, true); return; } } @@ -503,29 +508,29 @@ void CSvcManager::startReplacingFiles(const tstring &packageType, const bool res // Replace app path to Backup #ifdef _WIN32 if (!NS_File::dirExists(tmpPath) && !NS_File::makePath(tmpPath)) { - NS_Logger::WriteLog(L"Update cancelled. Can't create folder: " + tmpPath, true); + NS_Logger::WriteLog(_TR("Update cancelled. Can't create folder:") + _T(" ") + tmpPath, true); return; } if (!NS_File::replaceFolder(appPath, tmpPath, false)) { #else if (!NS_File::replaceFolder(appPath, tmpPath, true)) { #endif - NS_Logger::WriteLog(_T("Update cancelled. Can't replace files to backup: ") + NS_Utils::GetLastErrorAsString(), true); + NS_Logger::WriteLog(_TR("Update cancelled. Can't replace files to backup:") + _T(" ") + NS_Utils::GetLastErrorAsString(), true); if (NS_File::dirExists(tmpPath) && !NS_File::dirIsEmpty(tmpPath) && !NS_File::replaceFolder(tmpPath, appPath)) - NS_Logger::WriteLog(_T("Can't restore files from backup!"), true); + NS_Logger::WriteLog(_TR("Can't restore files from backup!"), true); return; } // Move update path to app path if (!NS_File::replaceFolder(updSubPath, appPath, true)) { - NS_Logger::WriteLog(_T("Update cancelled. Can't move updates to App path: ") + NS_Utils::GetLastErrorAsString(), true); + NS_Logger::WriteLog(_TR("Update cancelled. Can't move updates to App path:") + _T(" ") + NS_Utils::GetLastErrorAsString(), true); if (NS_File::dirExists(appPath) && !NS_File::removeDirRecursively(appPath)) { - NS_Logger::WriteLog(_T("An error occurred while remove App path: ") + NS_Utils::GetLastErrorAsString(), true); + NS_Logger::WriteLog(_TR("An error occurred while remove App path:") + _T(" ") + NS_Utils::GetLastErrorAsString(), true); return; } if (!NS_File::replaceFolder(tmpPath, appPath, true)) - NS_Logger::WriteLog(_T("An error occurred while restore files from backup: ") + NS_Utils::GetLastErrorAsString(), true); + NS_Logger::WriteLog(_TR("An error occurred while restore files from backup:") + _T(" ") + NS_Utils::GetLastErrorAsString(), true); NS_File::removeDirRecursively(updPath); return; @@ -598,7 +603,7 @@ void CSvcManager::startReplacingFiles(const tstring &packageType, const bool res // Restart program if (restartAfterUpdate) { if (!NS_File::runProcess(appPath + APP_LAUNCH_NAME, _T(""))) - NS_Logger::WriteLog(_T("An error occurred while restarting the program!"), true); + NS_Logger::WriteLog(_TR("An error occurred while restarting the program!"), true); } // Remove Backup dir diff --git a/win-linux/extras/update-daemon/src/classes/platform_linux/capplication.cpp b/win-linux/extras/update-daemon/src/classes/platform_linux/capplication.cpp index a48290b2f..ef372763c 100644 --- a/win-linux/extras/update-daemon/src/classes/platform_linux/capplication.cpp +++ b/win-linux/extras/update-daemon/src/classes/platform_linux/capplication.cpp @@ -32,6 +32,7 @@ #include "capplication.h" #include "platform_linux/utils.h" +#include "classes/translator.h" #include #include @@ -39,7 +40,7 @@ CApplication::CApplication() { if (SDL_Init(SDL_INIT_EVENTS | SDL_INIT_TIMER) != 0) - NS_Logger::WriteLog(string("SDL_Init error: ") + SDL_GetError(), true); + NS_Logger::WriteLog(_TR("SDL init error:") + _T(" ") + SDL_GetError(), true); } CApplication::~CApplication() diff --git a/win-linux/extras/update-daemon/src/classes/translator.cpp b/win-linux/extras/update-daemon/src/classes/translator.cpp new file mode 100644 index 000000000..a0bada119 --- /dev/null +++ b/win-linux/extras/update-daemon/src/classes/translator.cpp @@ -0,0 +1,307 @@ +#include "translator.h" +#ifdef _WIN32 +# include "platform_win/resource.h" +# include "platform_win/utils.h" +# include +# include +# define istalnum(c) std::iswalnum(c) +# define istalpha(c) std::iswalpha(c) +#else +# include "platform_linux/utils.h" +# include "res/gresource.c" +# include +# define istalnum(c) std::isalnum(c) +# define istalpha(c) std::isalpha(c) +#endif + + +bool isSeparator(tchar c) +{ + return c == _T(' ') || c == _T('\t') || c == _T('\r') || c == _T('\n'); +} + +bool isValidStringIdCharacter(tchar c) +{ + return istalnum(c) || istalpha(c) || c == _T('_'); +} + +bool isValidLocaleCharacter(tchar c) +{ + return istalpha(c) || c == _T('_'); +} + +tstring getPrimaryLang(const tstring &lang) +{ + if (lang.empty()) { + NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); + return _T("en"); + } + size_t pos = lang.find(_T('_')); + if (pos == tstring::npos) { + if (lang.length() == 2) + return lang; + } else { + tstring _lang = lang.substr(0, pos); + if (_lang.length() == 2) + return _lang; + } + NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); + return _T("en"); +} + +#ifdef _WIN32 +wstring StrToWStr(const char* str) +{ + wstring wstr; + { + size_t len = strlen(str), outSize = 0; + wchar_t *pDestBuf = new wchar_t[len + 1]; + mbstowcs_s(&outSize, pDestBuf, len + 1, str, len); + if (outSize > 0) + wstr = pDestBuf; + else + NS_Logger::WriteLog(DEFAULT_ERROR_MESSAGE); + delete[] pDestBuf; + } + return wstr; +} +#endif + +TranslationsMap Translator::translMap = TranslationsMap(); +tstring Translator::langName = _T("en"); +bool Translator::is_translations_valid = false; + +#ifdef _WIN32 +Translator::Translator(const tstring &lang, int resourceId) +#else +Translator::Translator(const tstring &lang, const char *resourcePath) +#endif +{ + langName = lang; + NS_Logger::WriteLog(_T("Current locale: ") + langName); + +#ifdef _WIN32 + HMODULE hInst = GetModuleHandle(NULL); + if (HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(resourceId), RT_RCDATA)) { + if (HGLOBAL hResData = LoadResource(hInst, hRes)) { + if (LPVOID pData = LockResource(hResData)) { + DWORD dataSize = SizeofResource(hInst, hRes); + if (dataSize > 0) { + string text((const char*)pData, dataSize); + translations = StrToWStr(text.c_str()); + } else + NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); + } else + NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); + FreeResource(hResData); + } else + NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); + } else + NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); +#else + if (GResource *res = gresource_get_resource()) { + g_resources_register(res); + if (GBytes *bytes = g_resource_lookup_data(res, resourcePath, G_RESOURCE_LOOKUP_FLAGS_NONE, NULL)) { + gsize dataSize = 0; + const char *pData = (const char*)g_bytes_get_data(bytes, &dataSize); + if (dataSize > 0) { + string text(pData, dataSize); + translations = text; + } else + NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); + g_bytes_unref(bytes); + } else + NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); + g_resource_unref(res); + } else + NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); +#endif + + if (!translations.empty()) { + parseTranslations(); + if (!is_translations_valid) + NS_Logger::WriteLog(_T("Cannot parse translations, error in string: ") + error_substr + _T(" <---")); + } else + NS_Logger::WriteLog(_T("Error: translations is empty.")); +} + +Translator::~Translator() +{ + +} + +tstring Translator::tr(const char *str) +{ +#ifdef _WIN32 + tstring translatedStr = StrToWStr(str); +#else + tstring translatedStr = str; +#endif + if (is_translations_valid) { + for (auto &strIdPair : translMap) { + //LocaleMap locMap = strIdPair.second; + for (LocaleMap::const_iterator it = strIdPair.second.begin(); it != strIdPair.second.end(); ++it) { + //wcout << L"\n\n" << translatedStr << L"\n" << it->second; + if (it->second == translatedStr) { + if (strIdPair.second.find(langName) != strIdPair.second.end()) + translatedStr = strIdPair.second[langName]; + else { + tstring primaryLang = getPrimaryLang(langName); + if (strIdPair.second.find(primaryLang) != strIdPair.second.end()) + translatedStr = strIdPair.second[primaryLang]; + } + break; + } + } + } + } + return translatedStr; +} + +void Translator::setLanguage(const tstring &lang) +{ + langName = lang; + NS_Logger::WriteLog(_T("Current locale: ") + langName); +} + +void Translator::parseTranslations() +{ + int token = TOKEN_BEGIN_DOCUMENT; + tstring stringId, currentLocale; + size_t pos = 0, len = translations.length(); + while (pos < len) { + size_t incr = 1; + tchar ch = translations.at(pos); + + switch (token) { + case TOKEN_BEGIN_DOCUMENT: + case TOKEN_END_VALUE: + if (!isSeparator(ch)) { + if (ch == _T(';')) { + // string is comment + size_t end = translations.find_first_of(_T('\n'), pos); + incr = (end == tstring::npos) ? len - pos : end - pos + 1; + } else { + size_t end; + for (end = pos; end < len; end++) { + tchar c = translations.at(end); + if (!isValidLocaleCharacter(c)) + break; + } + size_t locale_len = end - pos; + if (locale_len == 2 || locale_len == 5) { + token = TOKEN_BEGIN_LOCALE; + continue; + } else { + // TOKEN_ERROR + error_substr = translations.substr(0, pos + 1); + return; + } + } + } + break; + + case TOKEN_BEGIN_STRING_ID: + if (!isSeparator(ch)) { + size_t end; + tchar c; + for (end = pos; end < len; end++) { + c = translations.at(end); + if (!isValidStringIdCharacter(c)) + break; + } + c = translations.at(end); + if (end < len && !isSeparator(c) && c != _T('=')) { + // TOKEN_ERROR + error_substr = translations.substr(0, end + 1); + return; + } + stringId = translations.substr(pos, end - pos); + if (!stringId.empty() && translMap.find(stringId) == translMap.end()) + translMap[stringId] = LocaleMap(); + + token = TOKEN_END_STRING_ID; + incr = end - pos; + } + break; + + case TOKEN_END_STRING_ID: + if (!isSeparator(ch)) { + if (ch == _T('=')) { + token = TOKEN_BEGIN_VALUE; + } else { + // TOKEN_ERROR + error_substr = translations.substr(0, pos + 1); + return; + } + } + break; + + case TOKEN_BEGIN_LOCALE: { + size_t end; + for (end = pos; end < len; end++) { + tchar c = translations.at(end); + if (!isValidLocaleCharacter(c)) + break; + } + size_t locale_len = end - pos; + currentLocale = translations.substr(pos, locale_len); + if (pos + locale_len == len) { + error_substr = translations.substr(0, pos + locale_len); + return; + } + token = TOKEN_END_LOCALE; + incr = locale_len; + break; + } + + case TOKEN_END_LOCALE: + if (!isSeparator(ch)) { + if (ch == _T('.')) { + token = TOKEN_BEGIN_STRING_ID; + } else { + // TOKEN_ERROR + error_substr = translations.substr(0, pos + 1); + return; + } + } + break; + + case TOKEN_BEGIN_VALUE: { + size_t end = translations.find_first_of(_T('\n'), pos); + tstring val; + if (end == tstring::npos) { + val = translations.substr(pos); + incr = len - pos; + } else { + val = translations.substr(pos, end - pos); + incr = end - pos; + } + + if (!val.empty() && val.back() == _T('\r')) + val.pop_back(); + + size_t p = val.find(_T("\\n")); + while (p != std::string::npos) { + val.replace(p, 2, _T("\\")); + val[p] = _T('\n'); + p = val.find(_T("\\n"), p + 1); + } + if (!currentLocale.empty() && translMap.find(stringId) != translMap.end()) + translMap[stringId][currentLocale] = val; + + token = TOKEN_END_VALUE; + break; + } + + default: + break; + } + pos += incr; + if (pos == len) + token = TOKEN_END_DOCUMENT; + } + + if (token == TOKEN_END_DOCUMENT) + is_translations_valid = true; +} diff --git a/win-linux/extras/update-daemon/src/classes/translator.h b/win-linux/extras/update-daemon/src/classes/translator.h new file mode 100644 index 000000000..c27c81b26 --- /dev/null +++ b/win-linux/extras/update-daemon/src/classes/translator.h @@ -0,0 +1,56 @@ +#ifndef TRANSLATOR_H +#define TRANSLATOR_H + +#include +#include +#ifdef _WIN32 +# include +# define tchar wchar_t +# define tstring std::wstring +#else +# define _T(str) str +# define tchar char +# define tstring std::string +#endif + +using std::unordered_map; + +typedef unordered_map LocaleMap; +typedef unordered_map TranslationsMap; + + +class Translator +{ +public: +#ifdef _WIN32 + Translator(const tstring &lang, int resourceId); +#else + Translator(const tstring &lang, const char *resourcePath); +#endif + ~Translator(); + + static tstring tr(const char*); + static void setLanguage(const tstring &lang); + +private: + void parseTranslations(); + + static TranslationsMap translMap; + tstring translations, + error_substr; + static tstring langName; + static bool is_translations_valid; + + enum TokenType { + TOKEN_BEGIN_DOCUMENT = 0, + TOKEN_END_DOCUMENT, + TOKEN_BEGIN_STRING_ID, + TOKEN_END_STRING_ID, + TOKEN_BEGIN_LOCALE, + TOKEN_END_LOCALE, + TOKEN_BEGIN_VALUE, + TOKEN_END_VALUE + }; +}; + +#endif // TRANSLATOR_H diff --git a/win-linux/extras/update-daemon/src/platform_linux/main.cpp b/win-linux/extras/update-daemon/src/platform_linux/main.cpp index 9b250eac3..e9ed6f057 100644 --- a/win-linux/extras/update-daemon/src/platform_linux/main.cpp +++ b/win-linux/extras/update-daemon/src/platform_linux/main.cpp @@ -34,10 +34,12 @@ #include "classes/platform_linux/capplication.h" #include "classes/platform_linux/ctimer.h" #include "classes/csvcmanager.h" +#include "classes/translator.h" #include "../../src/defines.h" #include "../../src/prop/defines_p.h" #include #include +#include void strToNum(const char *str, int &num) @@ -54,6 +56,8 @@ int main(int argc, char *argv[]) if (argc > 1) { if (strcmp(argv[1], "--run-as-app") == 0) { + std::locale::global(std::locale("")); + Translator lang(NS_Utils::GetSysLanguage(), "/langs/langs.iss"); CSocket socket(0, INSTANCE_SVC_PORT); if (!socket.isPrimaryInstance()) return 0; diff --git a/win-linux/extras/update-daemon/src/platform_linux/utils.cpp b/win-linux/extras/update-daemon/src/platform_linux/utils.cpp index 3e4d8dd44..72ff212ad 100644 --- a/win-linux/extras/update-daemon/src/platform_linux/utils.cpp +++ b/win-linux/extras/update-daemon/src/platform_linux/utils.cpp @@ -142,13 +142,25 @@ namespace NS_Utils gtk_init(NULL, NULL); GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", str.c_str()); - gtk_window_set_title(GTK_WINDOW(dialog), VER_PRODUCTNAME_STR); + string prod_name = _TR(VER_PRODUCTNAME_STR); + gtk_window_set_title(GTK_WINDOW(dialog), prod_name.c_str()); int res = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); while (gtk_events_pending()) gtk_main_iteration_do(FALSE); return res; } + + string GetSysLanguage() + { + string lang("en_EN"); + size_t pos = std::string::npos; + if (char *_lang = getenv("LANG")) { + lang = _lang; + pos = lang.find('.'); + } + return (pos == std::string::npos) ? lang : lang.substr(0, pos); + } } namespace NS_File diff --git a/win-linux/extras/update-daemon/src/platform_linux/utils.h b/win-linux/extras/update-daemon/src/platform_linux/utils.h index fbff00db6..e459fe5d3 100644 --- a/win-linux/extras/update-daemon/src/platform_linux/utils.h +++ b/win-linux/extras/update-daemon/src/platform_linux/utils.h @@ -35,13 +35,16 @@ #include #include +#include "classes/translator.h" using std::string; using std::to_string; using std::list; +#define _TR(str) Translator::tr(str) + #define FUNCTION_INFO string(__FUNCTION__) + " Line: " + to_string(__LINE__) -#define DEFAULT_ERROR_MESSAGE "An error occurred: " + FUNCTION_INFO +#define DEFAULT_ERROR_MESSAGE _TR("An error occurred:") + " " + FUNCTION_INFO #define ADVANCED_ERROR_MESSAGE DEFAULT_ERROR_MESSAGE + \ " " + NS_Utils::GetLastErrorAsString() @@ -49,6 +52,7 @@ namespace NS_Utils { string GetLastErrorAsString(); int ShowMessage(string str, bool showError = false); +string GetSysLanguage(); } namespace NS_File diff --git a/win-linux/extras/update-daemon/src/platform_win/main.cpp b/win-linux/extras/update-daemon/src/platform_win/main.cpp index 016f58090..9c1e40f1d 100644 --- a/win-linux/extras/update-daemon/src/platform_win/main.cpp +++ b/win-linux/extras/update-daemon/src/platform_win/main.cpp @@ -30,11 +30,14 @@ * */ +#include #include "utils.h" +#include "platform_win/resource.h" #include "platform_win/svccontrol.h" #include "classes/platform_win/capplication.h" #include "classes/platform_win/ctimer.h" #include "classes/csvcmanager.h" +#include "classes/translator.h" #include "../../src/defines.h" #include "../../src/prop/defines_p.h" @@ -91,6 +94,8 @@ int __cdecl _tmain (int argc, TCHAR *argv[]) } else if (lstrcmpi(argv[1], _T("--run-as-app")) == 0) { NS_Utils::setRunAsApp(); + std::locale::global(std::locale("")); + Translator lang(NS_Utils::GetAppLanguage().c_str(), IDT_TRANSLATIONS); CSocket socket(0, INSTANCE_SVC_PORT); if (!socket.isPrimaryInstance()) return 0; @@ -131,6 +136,8 @@ int __cdecl _tmain (int argc, TCHAR *argv[]) } } + std::locale::global(std::locale("")); + Translator lang(NS_Utils::GetAppLanguage().c_str(), IDT_TRANSLATIONS); SERVICE_TABLE_ENTRY DispatchTable[] = { {(LPTSTR)SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)SvcMain}, @@ -138,7 +145,7 @@ int __cdecl _tmain (int argc, TCHAR *argv[]) }; if (StartServiceCtrlDispatcher(DispatchTable) == 0) { - NS_Utils::ShowMessage(L"ServiceCtrlDispatcher returned error:", true); + NS_Utils::ShowMessage(_TR("ServiceCtrlDispatcher returned error:") + _T(" ") + NS_Utils::GetLastErrorAsString(), true); return GetLastError(); } diff --git a/win-linux/extras/update-daemon/src/platform_win/resource.h b/win-linux/extras/update-daemon/src/platform_win/resource.h index 6416ebb85..f3d59c80f 100644 --- a/win-linux/extras/update-daemon/src/platform_win/resource.h +++ b/win-linux/extras/update-daemon/src/platform_win/resource.h @@ -1 +1,3 @@ #define IDI_MAINICON 101 + +#define IDT_TRANSLATIONS 10001 diff --git a/win-linux/extras/update-daemon/src/platform_win/svccontrol.cpp b/win-linux/extras/update-daemon/src/platform_win/svccontrol.cpp index e6863fca9..0a0fa4bfa 100644 --- a/win-linux/extras/update-daemon/src/platform_win/svccontrol.cpp +++ b/win-linux/extras/update-daemon/src/platform_win/svccontrol.cpp @@ -31,6 +31,7 @@ */ #include "svccontrol.h" +#include "classes/translator.h" #include "platform_win/utils.h" #include #include diff --git a/win-linux/extras/update-daemon/src/platform_win/utils.cpp b/win-linux/extras/update-daemon/src/platform_win/utils.cpp index 24a68cd52..eebf123c1 100644 --- a/win-linux/extras/update-daemon/src/platform_win/utils.cpp +++ b/win-linux/extras/update-daemon/src/platform_win/utils.cpp @@ -31,6 +31,7 @@ */ #include "platform_win/utils.h" +#include "classes/translator.h" #include "version.h" #include #include @@ -49,6 +50,8 @@ #include #include #include +#include "../../src/defines.h" +#include "../../src/prop/defines_p.h" #define BUFSIZE 1024 @@ -101,7 +104,8 @@ namespace NS_Utils { if (showError) str += L" " + GetLastErrorAsString(); - wchar_t *title = const_cast(TEXT(VER_PRODUCTNAME_STR)); + wstring prod_name = _TR(VER_PRODUCTNAME_STR); + wchar_t *title = const_cast(prod_name.c_str()); if (isRunAsApp()) { MessageBox(NULL, str.c_str(), title, MB_ICONERROR | MB_SERVICE_NOTIFICATION_NT3X | MB_SETFOREGROUND); return 0; @@ -114,6 +118,23 @@ namespace NS_Utils MB_OK | MB_ICONERROR | MB_SERVICE_NOTIFICATION_NT3X | MB_SETFOREGROUND, 30, &res, TRUE); return res; } + + wstring GetAppLanguage() + { + wstring lang = TEXT("en"), subkey = TEXT("SOFTWARE\\" REG_GROUP_KEY "\\" REG_APP_NAME); + HKEY hKey = NULL; + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkey.c_str(), 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) { + DWORD type = REG_SZ, cbData = 0; + if (RegGetValue(hKey, NULL, TEXT("locale"), RRF_RT_REG_SZ, &type, NULL, &cbData) == ERROR_SUCCESS) { + wchar_t *pvData = (wchar_t*)malloc(cbData); + if (RegGetValueW(hKey, NULL, TEXT("locale"), RRF_RT_REG_SZ, &type, (void*)pvData, &cbData) == ERROR_SUCCESS) + lang = pvData; + free(pvData); + } + RegCloseKey(hKey); + } + return lang; + } } namespace NS_File diff --git a/win-linux/extras/update-daemon/src/platform_win/utils.h b/win-linux/extras/update-daemon/src/platform_win/utils.h index 94ccd1817..de0aa79ed 100644 --- a/win-linux/extras/update-daemon/src/platform_win/utils.h +++ b/win-linux/extras/update-daemon/src/platform_win/utils.h @@ -41,8 +41,10 @@ using std::wstring; using std::to_wstring; using std::list; +#define _TR(str) Translator::tr(str) + #define FUNCTION_INFO wstring(TEXT(__FUNCTION__)) + L" Line: " + to_wstring(__LINE__) -#define DEFAULT_ERROR_MESSAGE L"An error occurred: " + FUNCTION_INFO +#define DEFAULT_ERROR_MESSAGE _TR("An error occurred:") + L" " + FUNCTION_INFO #define ADVANCED_ERROR_MESSAGE DEFAULT_ERROR_MESSAGE + \ L" " + NS_Utils::GetLastErrorAsString() @@ -52,6 +54,7 @@ void setRunAsApp(); bool isRunAsApp(); wstring GetLastErrorAsString(); int ShowMessage(wstring str, bool showError = false); +wstring GetAppLanguage(); } namespace NS_File diff --git a/win-linux/src/cascapplicationmanagerwrapper.cpp b/win-linux/src/cascapplicationmanagerwrapper.cpp index 43a9db301..65b994136 100644 --- a/win-linux/src/cascapplicationmanagerwrapper.cpp +++ b/win-linux/src/cascapplicationmanagerwrapper.cpp @@ -950,6 +950,7 @@ void CAscApplicationManagerWrapper::onDocumentReady(int uid) #ifdef _UPDMODULE if (!m_pUpdateManager) { m_pUpdateManager = new CUpdateManager(this); + m_pUpdateManager->setServiceLang(); m_pUpdateManager->launchIntervalStartTimer(); } if (uid < 0) { @@ -1660,8 +1661,10 @@ bool CAscApplicationManagerWrapper::applySettings(const wstring& wstrjson) _reg_user.setValue("locale", _lang_id); CLangater::reloadTranslations(_lang_id); #ifdef _UPDMODULE - if (m_pUpdateManager) + if (m_pUpdateManager) { + m_pUpdateManager->setServiceLang(_lang_id); m_pUpdateManager->refreshStartPage(); + } #endif } } diff --git a/win-linux/src/cupdatemanager.cpp b/win-linux/src/cupdatemanager.cpp index 468389454..31cb53b80 100644 --- a/win-linux/src/cupdatemanager.cpp +++ b/win-linux/src/cupdatemanager.cpp @@ -611,6 +611,15 @@ void CUpdateManager::launchIntervalStartTimer() m_pIntervalStartTimer->start(); } +void CUpdateManager::setServiceLang(QString lang) +{ + if (lang.isEmpty()) + lang = CLangater::getLangName(); + lang.replace('-', '_'); + if (!m_socket->sendMessage(MSG_SetLanguage, QStrToTStr(lang))) + CLogger::log("Cannot set service language to: " + lang); +} + QString CUpdateManager::getVersion() const { return m_packageData->version; diff --git a/win-linux/src/cupdatemanager.h b/win-linux/src/cupdatemanager.h index 07d49e52c..56303444d 100644 --- a/win-linux/src/cupdatemanager.h +++ b/win-linux/src/cupdatemanager.h @@ -94,6 +94,7 @@ class CUpdateManager: public QObject void installUpdates(); void refreshStartPage(const Command &cmd = Command()); void launchIntervalStartTimer(); + void setServiceLang(QString lang = QString()); public slots: void checkUpdates(bool manualCheck = false); From a56189b149216c2c55c124aea82ab3e95e5835e3 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Thu, 30 Nov 2023 15:24:38 +0200 Subject: [PATCH 013/316] [win] online-installer: adaptation translator to iss format --- .../online-installer/OnlineInstaller.pro | 4 +- .../online-installer/res/langs/langs.iss | 42 +++++ .../online-installer/res/langs/langs.txt | 76 --------- .../extras/online-installer/src/main.cpp | 2 +- .../online-installer/src/translator.cpp | 148 +++++++++++------- .../extras/online-installer/src/translator.h | 2 +- 6 files changed, 140 insertions(+), 134 deletions(-) create mode 100644 win-linux/extras/online-installer/res/langs/langs.iss delete mode 100644 win-linux/extras/online-installer/res/langs/langs.txt diff --git a/win-linux/extras/online-installer/OnlineInstaller.pro b/win-linux/extras/online-installer/OnlineInstaller.pro index 591fd97e6..15a81d34c 100644 --- a/win-linux/extras/online-installer/OnlineInstaller.pro +++ b/win-linux/extras/online-installer/OnlineInstaller.pro @@ -3,9 +3,9 @@ include(common.pri) DEFINES += COPYRIGHT_YEAR=$${CURRENT_YEAR} DEFINES += APP_ICON_PATH=\"./icons/desktopeditors.ico\" -DEFINES += APP_LANG_PATH=\"./langs/langs.txt\" +DEFINES += APP_LANG_PATH=\"./langs/langs.iss\" -OTHER_FILES += $$PWD/res/langs/langs.txt +OTHER_FILES += $$PWD/res/langs/langs.iss ENV_URL_INSTALL_X64 = $$(DESKTOP_URL_INSTALL_CHANNEL_X64) !isEmpty(ENV_URL_INSTALL_X64) { diff --git a/win-linux/extras/online-installer/res/langs/langs.iss b/win-linux/extras/online-installer/res/langs/langs.iss new file mode 100644 index 000000000..04b9bbafb --- /dev/null +++ b/win-linux/extras/online-installer/res/langs/langs.iss @@ -0,0 +1,42 @@ + +en.CAPTION_TEXT =ONLYOFFICE Online Installer +ru.CAPTION_TEXT =ONLYOFFICE Онлайн Установщик + +en.MESSAGE_TEXT_ERR1 =The application cannot continue because this architecture is not supported. +ru.MESSAGE_TEXT_ERR1 =Приложение не может продолжить работу, так как эта архитектура не поддерживается. + +en.MESSAGE_TEXT_ERR2 =The application is already running. +ru.MESSAGE_TEXT_ERR2 =Приложение уже запущено. + +en.LABEL_TITLE_TEXT =Preparing for installation +ru.LABEL_TITLE_TEXT =Подготовка к установке + +en.LABEL_MESSAGE_TEXT =Downloading a package +ru.LABEL_MESSAGE_TEXT =Загрузка пакета + +en.LABEL_MESSAGE_TEXT_ERR1 =An error occurred during initialization.\nPlease try restarting the app later. +ru.LABEL_MESSAGE_TEXT_ERR1 =Произошла ошибка при инициализации.\nПопробуйте перезапустить приложение позже. + +en.LABEL_MESSAGE_TEXT_ERR2 =Package download failed: Not enough memory!\nPlease try restarting the app later. +ru.LABEL_MESSAGE_TEXT_ERR2 =Ошибка при загрузке пакета: Недостаточно памяти!\nПопробуйте перезапустить приложение позже. + +en.LABEL_MESSAGE_TEXT_ERR3 =Package download failed: Server connection error!\nPlease try restarting the app later. +ru.LABEL_MESSAGE_TEXT_ERR3 =Ошибка при загрузке пакета: Ошибка соединения!\nПопробуйте перезапустить приложение позже. + +en.LABEL_MESSAGE_TEXT_ERR4 =Package download failed: Network error!\nPlease try restarting the app later. +ru.LABEL_MESSAGE_TEXT_ERR4 =Ошибка при загрузке пакета: Ошибка сети!\nПопробуйте перезапустить приложение позже. + +en.LABEL_MESSAGE_TEXT_ERR5 =An error occurred while running the package.\nPlease try restarting the app later. +ru.LABEL_MESSAGE_TEXT_ERR5 =Произошла ошибка при запуске установщика.\nПопробуйте перезапустить приложение позже. + +en.LABEL_MESSAGE_TEXT_ERR6 =An error occurred during initialization: Url not set. +ru.LABEL_MESSAGE_TEXT_ERR6 =Произошла ошибка при инициализации: Не задан Url. + +en.LABEL_MESSAGE_TEXT_ERR7 =An error occurred during initialization: File name not specified. +ru.LABEL_MESSAGE_TEXT_ERR7 =Произошла ошибка при инициализации: Не задано имя файла. + +en.BUTTON_CANCEL_TEXT =Cancel +ru.BUTTON_CANCEL_TEXT =Отмена + +en.SILENT_CHECK_TEXT =Silent Installation +ru.SILENT_CHECK_TEXT =Тихая установка diff --git a/win-linux/extras/online-installer/res/langs/langs.txt b/win-linux/extras/online-installer/res/langs/langs.txt deleted file mode 100644 index 53ac0224c..000000000 --- a/win-linux/extras/online-installer/res/langs/langs.txt +++ /dev/null @@ -1,76 +0,0 @@ -// File format for text translations -// This file is used to store translations of text using a given format. -// Each translation consists of a label and a corresponding translations -// in different languages. Below is the file structure: -// -// LABEL -// language_code1 =Translation1 -// language_code2 =Translation2 -// ... -// -// LABEL: The label serves as a translation identifier and written as -// one word. Valid characters for the label are numbers, letters, and "_". -// language_code1, language_code2, and so on are the ISO 639-1:2002 -// language codes that will be translated into (for example: en, ru). -// Translations: Immediately after the symbol "=" is the translation of -// the text into the specified language. The end of the translation string -// is a newline. Translations may include special characters and spaces. -// Note: comments are allowed only at the beginning of the file. - - -CAPTION_TEXT -en =ONLYOFFICE Online Installer -ru =ONLYOFFICE Онлайн Установщик - -MESSAGE_TEXT_ERR1 -en =The application cannot continue because this architecture is not supported. -ru =Приложение не может продолжить работу, так как эта архитектура не поддерживается. - -MESSAGE_TEXT_ERR2 -en =The application is already running. -ru =Приложение уже запущено. - -LABEL_TITLE_TEXT -en =Preparing for installation -ru =Подготовка к установке - -LABEL_MESSAGE_TEXT -en =Downloading a package -ru =Загрузка пакета - -LABEL_MESSAGE_TEXT_ERR1 -en =An error occurred during initialization.\nPlease try restarting the app later. -ru =Произошла ошибка при инициализации.\nПопробуйте перезапустить приложение позже. - -LABEL_MESSAGE_TEXT_ERR2 -en =Package download failed: Not enough memory!\nPlease try restarting the app later. -ru =Ошибка при загрузке пакета: Недостаточно памяти!\nПопробуйте перезапустить приложение позже. - -LABEL_MESSAGE_TEXT_ERR3 -en =Package download failed: Server connection error!\nPlease try restarting the app later. -ru =Ошибка при загрузке пакета: Ошибка соединения!\nПопробуйте перезапустить приложение позже. - -LABEL_MESSAGE_TEXT_ERR4 -en =Package download failed: Network error!\nPlease try restarting the app later. -ru =Ошибка при загрузке пакета: Ошибка сети!\nПопробуйте перезапустить приложение позже. - -LABEL_MESSAGE_TEXT_ERR5 -en =An error occurred while running the package.\nPlease try restarting the app later. -ru =Произошла ошибка при запуске установщика.\nПопробуйте перезапустить приложение позже. - -LABEL_MESSAGE_TEXT_ERR6 -en =An error occurred during initialization: Url not set. -ru =Произошла ошибка при инициализации: Не задан Url. - -LABEL_MESSAGE_TEXT_ERR7 -en =An error occurred during initialization: File name not specified. -ru =Произошла ошибка при инициализации: Не задано имя файла. - -BUTTON_CANCEL_TEXT -en =Cancel -ru =Отмена - -SILENT_CHECK_TEXT -en =Silent Installation -ru =Тихая установка - diff --git a/win-linux/extras/online-installer/src/main.cpp b/win-linux/extras/online-installer/src/main.cpp index 9e681d819..33943cc54 100644 --- a/win-linux/extras/online-installer/src/main.cpp +++ b/win-linux/extras/online-installer/src/main.cpp @@ -40,7 +40,7 @@ int WINAPI _tWinMain(_In_ HINSTANCE hInst, _In_opt_ HINSTANCE hPrevInstance, _In { UNREFERENCED_PARAMETER(hPrevInstance); std::locale::global(std::locale("")); - Translator lang(GetUserDefaultUILanguage(), IDT_TRANSLATIONS); + Translator lang(LOCALE_USER_DEFAULT, IDT_TRANSLATIONS); HANDLE hMutex = CreateMutex(NULL, FALSE, _T(VER_PRODUCTNAME_STR)); if (GetLastError() == ERROR_ALREADY_EXISTS) { NS_Utils::ShowMessage(_TR(MESSAGE_TEXT_ERR2)); diff --git a/win-linux/extras/online-installer/src/translator.cpp b/win-linux/extras/online-installer/src/translator.cpp index ff2503e35..a4c5b12c8 100644 --- a/win-linux/extras/online-installer/src/translator.cpp +++ b/win-linux/extras/online-installer/src/translator.cpp @@ -17,6 +17,30 @@ bool isValidStringIdCharacter(wchar_t c) return std::iswalnum(c) || std::iswalpha(c) || c == L'_'; } +bool isValidLocaleCharacter(wchar_t c) +{ + return iswalpha(c) || c == L'_'; +} + +wstring getPrimaryLang(const wstring &lang) +{ + if (lang.empty()) { + NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); + return L"en"; + } + size_t pos = lang.find(L'_'); + if (pos == wstring::npos) { + if (lang.length() == 2) + return lang; + } else { + wstring _lang = lang.substr(0, pos); + if (_lang.length() == 2) + return _lang; + } + NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); + return L"en"; +} + wstring StrToWStr(const char* str) { wstring wstr; @@ -34,16 +58,20 @@ wstring StrToWStr(const char* str) } TranslationsMap Translator::translMap = TranslationsMap(); -wstring Translator::langName = _T("en"); +wstring Translator::langName = _T("en_EN"); bool Translator::is_translations_valid = false; -Translator::Translator(unsigned short langId, int resourceId) +Translator::Translator(unsigned long langId, int resourceId) { TCHAR _langName[LOCALE_NAME_MAX_LENGTH] = {0}; - int res = GetLocaleInfo(PRIMARYLANGID(langId), LOCALE_SISO639LANGNAME, _langName, LOCALE_NAME_MAX_LENGTH); - if (res > 0) + if (GetLocaleInfo(langId, LOCALE_SNAME, _langName, LOCALE_NAME_MAX_LENGTH) > 0) { langName = _langName; - else + wstring::size_type pos = 0; + while ((pos = langName.find(L'-', pos)) != wstring::npos) { + langName.replace(pos, 1, L"_"); + pos++; + } + } else NS_Logger::WriteLog(ADVANCED_ERROR_MESSAGE); NS_Logger::WriteLog(_T("Current locale: ") + langName); @@ -90,6 +118,11 @@ wstring Translator::tr(const char *str) if (it->second == translatedStr) { if (strIdPair.second.find(langName) != strIdPair.second.end()) translatedStr = strIdPair.second[langName]; + else { + wstring primaryLang = getPrimaryLang(langName); + if (strIdPair.second.find(primaryLang) != strIdPair.second.end()) + translatedStr = strIdPair.second[primaryLang]; + } break; } } @@ -109,83 +142,90 @@ void Translator::parseTranslations() switch (token) { case TOKEN_BEGIN_DOCUMENT: + case TOKEN_END_VALUE: if (!isSeparator(ch)) { - if (isValidStringIdCharacter(ch)) { - token = TOKEN_BEGIN_STRING_ID; - continue; - } else - if (ch == L'/' && (pos + 1) < len && translations.at(pos + 1) == L'/') { + if (ch == L';') { // string is comment size_t end = translations.find_first_of(L'\n', pos); incr = (end == wstring::npos) ? len - pos : end - pos + 1; } else { - // TOKEN_ERROR - error_substr = translations.substr(0, pos + 1); - return; + size_t end; + for (end = pos; end < len; end++) { + wchar_t c = translations.at(end); + if (!isValidLocaleCharacter(c)) + break; + } + size_t locale_len = end - pos; + if (locale_len == 2 || locale_len == 5) { + token = TOKEN_BEGIN_LOCALE; + continue; + } else { + // TOKEN_ERROR + error_substr = translations.substr(0, pos + 1); + return; + } } } break; - case TOKEN_BEGIN_STRING_ID: { - size_t end; - for (end = pos; end < len; end++) { - wchar_t c = translations.at(end); - if (!isValidStringIdCharacter(c)) - break; - } - if (end < len && !isSeparator(translations.at(end))) { - // TOKEN_ERROR - error_substr = translations.substr(0, end + 1); - return; - } - stringId = translations.substr(pos, end - pos); - translMap[stringId] = LocaleMap(); - token = TOKEN_END_STRING_ID; - incr = end - pos; - break; - } - - case TOKEN_END_STRING_ID: - case TOKEN_END_VALUE: { + case TOKEN_BEGIN_STRING_ID: if (!isSeparator(ch)) { size_t end; + wchar_t c; for (end = pos; end < len; end++) { - wchar_t c = translations.at(end); - if (!std::iswalpha(c)) + c = translations.at(end); + if (!isValidStringIdCharacter(c)) break; } - if (end - pos == 2) { - token = TOKEN_BEGIN_LOCALE; - continue; + c = translations.at(end); + if (end < len && !isSeparator(c) && c != L'=') { + // TOKEN_ERROR + error_substr = translations.substr(0, end + 1); + return; + } + stringId = translations.substr(pos, end - pos); + if (!stringId.empty() && translMap.find(stringId) == translMap.end()) + translMap[stringId] = LocaleMap(); + + token = TOKEN_END_STRING_ID; + incr = end - pos; + } + break; + + case TOKEN_END_STRING_ID: + if (!isSeparator(ch)) { + if (ch == L'=') { + token = TOKEN_BEGIN_VALUE; } else { - if (isValidStringIdCharacter(ch)) { - token = TOKEN_BEGIN_STRING_ID; - continue; - } else { - // TOKEN_ERROR - error_substr = translations.substr(0, end + 1); - return; - } + // TOKEN_ERROR + error_substr = translations.substr(0, pos + 1); + return; } } break; - } case TOKEN_BEGIN_LOCALE: { - currentLocale = translations.substr(pos, 2); - if (pos + 2 == len) { - error_substr = translations.substr(0, pos + 2); + size_t end; + for (end = pos; end < len; end++) { + wchar_t c = translations.at(end); + if (!isValidLocaleCharacter(c)) + break; + } + size_t locale_len = end - pos; + currentLocale = translations.substr(pos, locale_len); + if (pos + locale_len == len) { + error_substr = translations.substr(0, pos + locale_len); return; } token = TOKEN_END_LOCALE; - incr = 2; + incr = locale_len; break; } case TOKEN_END_LOCALE: if (!isSeparator(ch)) { - if (ch == L'=') { - token = TOKEN_BEGIN_VALUE; + if (ch == L'.') { + token = TOKEN_BEGIN_STRING_ID; } else { // TOKEN_ERROR error_substr = translations.substr(0, pos + 1); diff --git a/win-linux/extras/online-installer/src/translator.h b/win-linux/extras/online-installer/src/translator.h index 99ed31a0d..5715d90b8 100644 --- a/win-linux/extras/online-installer/src/translator.h +++ b/win-linux/extras/online-installer/src/translator.h @@ -15,7 +15,7 @@ typedef unordered_map TranslationsMap; class Translator { public: - Translator(unsigned short langId, int resourceId); + Translator(unsigned long langId, int resourceId); ~Translator(); static wstring tr(const char*); From 7b1fe233e72ccc4de13d6c9e5fac0af5c95ff4ed Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Fri, 1 Dec 2023 17:52:28 +0300 Subject: [PATCH 014/316] added ar_SA --- common/loginpage/locale/ar-SA.js | 111 ++ macos/Localization/ar_SA.xliff | 1439 ++++++++++++++++++ win-linux/langs/ar_SA.ts | 901 +++++++++++ win-linux/package/windows/associate_page.iss | 40 +- win-linux/package/windows/common.iss | 11 + win-linux/package/windows/uninstall_page.iss | 2 + 6 files changed, 2503 insertions(+), 1 deletion(-) create mode 100644 common/loginpage/locale/ar-SA.js create mode 100644 macos/Localization/ar_SA.xliff create mode 100644 win-linux/langs/ar_SA.ts diff --git a/common/loginpage/locale/ar-SA.js b/common/loginpage/locale/ar-SA.js new file mode 100644 index 000000000..c2eb2b8df --- /dev/null +++ b/common/loginpage/locale/ar-SA.js @@ -0,0 +1,111 @@ +l10n.ar-SA = { + welWelcome: 'مرحبًا بك في محرر أونلي أوفس لسطح المكتب!', + welDescr: 'اعمل على مستنداتك بدون اتصال أو اتصل لسحابتك: أونلي أوفس, ownCloud, Nextcloud.', + btnConnect: 'اتصل الآن', + textHavePortal: 'هل تستخدم سحابة من قبل؟', + btnCreatePortal: 'أنشئ سحابة أونلي أوفيس', + btnAddPortal: 'أضِف سحابة', + btnLogin: 'تسجيل الدخول', + btnBrowse: 'تصفّح', + btnNext: 'التالي', + portalEmptyTitle: 'اتصل بسحابتك', + portalEmptyDescr: 'خزّن مستنداتك في السحابة للوصول إليها في أي مكان، وزمان. يمكنك نشرها والتعاون عليها مع رفقائك. كذلك يمكنك التحدث، إضافة التعليقات، أو نشرها ليتم مراجعتها.', + portalEmptyAdv1: 'ليس لديك حساب سحابي بعد؟ اتصل بالخدمة السحابية لأونلي أوفيس و
جرب الميزات التعاونية مجانًّا.', + portalListTitle: 'السحابات المتصلة', + textNoFiles: 'لا توجد ملفات', + listRecoveryTitle:'استرجاع الملفات', + listRecentFileTitle:'المفات المسجدّة', + listRecentDirTitle:'المجلدات المستجدّة', + menuFileOpen: 'فتح', + menuFileExplore: 'إظهار في المجلد', + menuRemoveModel: 'إزالة من القائمة', + menuClear: 'إخلاء القائمة', + menuLogout: 'تسجيل الخروج', + textMyComputer: 'حاسوبي', + textThrough: 'خلال', + linkForgotPass: 'هل نسيت كلمة المرور؟', + linkCreatePortal: 'أنشئ سحابة أونلي أوفيس', + linkResend: 'أرسل الرمز مجددًا', + linkChangePhone: 'تغيير رقم الهاتف', + loginTitleStart: 'اتصل بسحابة أوفس', + loginTitleConnectTo: '$تسجيل الدخول لـ 1', + loginTitleAssignPhone: 'أدخِل رقم الهاتف', + loginTitleApplyCode: 'أكِّد رفم الهاتف', + errLogin: 'البريد الإلكتروني أو كلمة المرور خاطئة', + errLoginPortal: 'تأكد من رابط سحابة أوفس', + errLoginEmail: 'تأكد من البريد الإلكتروني', + errLoginServer: 'رد خاطئ من الخادم أثناء تسجيل الدخول', + errLoginAuth: 'خطأ أثناء الاستعلام عن بيانات المستخدم', + errLoginPass: 'تأكد من كلمة المرور', + errLoginWrongPhone: 'صيغة رفم الهاتف غير صحيحة', + pshPortal: 'رابط سحابة أوفس', + pshEmail: 'البريد الإلكتروني', + pshPass: 'كلمة المرور', + pshPhone: 'رقم الهاتف', + pshCode: 'رمز من الرسالة النصية', + loginNoteAssignPhone: 'المصادقة الثنائية مفعلّة لتوفير حماية إضافية لسحابة أونلي أوفس. أدخِل رقم الهاتف الخاص بك لتكمل العمل على سحابتك. يجب إدخال رقم الهاتف بالصيغة العالمية بالرمز الدولي.', + loginNoteApplyCode: '$المصادقة الثنائية مفعلّة. تم إرسال الرمز إلى الرقم 1.', + newDoc: 'مستند', + newXlsx: 'جدول بياني', + newPptx: 'عرض تقديمي', + newForm: 'قالب استبيان', + actCreateNew: 'إنشاء جديد', + actRecentFiles: 'الملفات المستجدّة', + actOpenLocal: 'فتح الملف المحلي', + actConnectTo: 'اتصل بالسحابة', + actActivate: 'تفعيل', + actAbout: 'عن', + actSettings: 'إعدادات', + actTemplates: 'قوالب', + licKeyHolder: 'أدخِل رمز التفعيل', + btnActivate: 'تفعيل', + licGetLicense: 'احصل على الترخيص الآن', + licPanelTitle: 'أدحِل رمز المنتج', + licPanelDescr: 'تم إرسال مفتاح المنتج الخاص بك لبريدك الإلكتروني المُدخل أثناء عملية الشراء', + checkUpdates: 'التحقق من التحديثات', + strVersion: 'نسخة', + emptySlide1Title: 'نشر وتعاون', + emptySlide1Text: 'اختر بين تحرير مشترك سريع أو تحرير مشترك بالوفت الفعلي، تحدّث في المستند، أضف التعليقات أو انشرها ليتم مراجعتها.', + emptySlide2Title: 'اعرض أو استرجع النسخ السابقة', + emptySlide2Text: 'اعرض أو استرجع النسخ السابقة من مستندك، يمكنك مراقبة التغييرات وكاتبيهم.', + emptySlide3Title: 'خزّن في السحابة', + emptySlide3Text: 'خزّن مستنداتك في سحابة أونلي أوفيس لتصل إليها في أي مكان وزمان', + settUserName: 'اسم المستخدم', + settResetUserName: 'استعادة الإعداد الافتراضي', + settOpenMode: 'فتح المستند في وضع المعاينة', + setBtnApply: 'تطبيق', + settLanguage: 'لغة الواجهة', + settAfterRestart: 'سيتم تطبيق اختيارك بعد إعادة تشغيل التطبيق', + settShowEncryptOpts: 'اختبار التشفير بين الطرفين', + settCheckUpdates: 'التحقق من التحديثات تلقائيًّا', + settOptCheckNever: 'أبدًا', + settOptCheckDay: 'كل يوم', + settOptCheckWeek: 'كل أسبوع', + settScaling: 'مقاسات الواجهة', + settOptScalingAuto: 'تلقائي', + aboutProFeaturesAvailable: 'مع الميزات المدفوعة يمكنك', + settUITheme: 'شكل الواجهة', + settOptThemeLight: 'أبيض', + settOptThemeClassicLight: 'أبيض كلاسيكي', + settOptThemeDark: 'أسود', + settOptLaunchMode: 'فتح ملف', + settOptLaunchInTab: 'في علامة تبويب جديدة', + settOptLaunchInWindow: 'في نافذة جديدة', + settSpellcheckDetection: 'تحرّي التدقيق الإملائي', + settOptDisabled: 'تعطيل', + settOptEnabled: 'تمكين', + aboutChangelog: 'سِجِل التغيير', + updateNoUpdates: 'نسخة التطبيق الحالية هي الأحدث', + updateAvialable: 'نسخة 1$ متوفرة. اضغط للتحميل.', + settOptThemeSystem: 'مطابق للنظام', + settOptThemeContrastDark: 'أسود متباين', + settAUpdateMode: 'وضع التحديث التلقائي', + settOptAUpdateSilent: 'وضع التحديث الساكت', + settOptAUpdateAsk: 'وضع التحديث السائل', + updateDownloadFinished: 'انتهى التحميل. اضغط للتثبيت', + updateDownloadCanceled: 'تم إلغاء التحميل', + updateDownloadProgress: 'جاري التحميل %$1. اضغط للإيقاف', + settOptDescDisabled: "سيتم إلغاء التحقق التلقائي من التحديثات", + settOptDescAUpdateSilent: "سيتم تحميل التحديثات ثم السؤال قبل التثبيت", + settOptDescAUpdateAsk: "سيتم إبلاغك عن كل خطوات التحديثات", +} diff --git a/macos/Localization/ar_SA.xliff b/macos/Localization/ar_SA.xliff new file mode 100644 index 000000000..654530ca2 --- /dev/null +++ b/macos/Localization/ar_SA.xliff @@ -0,0 +1,1439 @@ + + + +
+ +
+ + + Enter the password for the digital signature. + ادخل كلمة مرور التوقيع الرقمي. + Class = "NSTextFieldCell"; title = "Enter the password for the digital signature."; ObjectID = "1Fy-mg-aq9"; + + + Enter the password for the private key. + ادخل كلمة مرور مفتاح التشفير الخاص + Class = "NSTextFieldCell"; title = "Enter the password for the private key."; ObjectID = "1dL-nN-bJI"; + + + Specify the digital signature file for the document. + حدّد ملف التوقيع الرقمي للمستند. + Class = "NSTextFieldCell"; title = "Specify the digital signature file for the document."; ObjectID = "2Ck-6y-ygx"; + + + Enter Password + ادخل كلمة المرور + Class = "NSSecureTextFieldCell"; placeholderString = "Enter Password"; ObjectID = "4gA-s8-Lne"; + + + Cancel + إلغاء + Class = "NSButtonCell"; title = "Cancel"; ObjectID = "GOU-av-TC1"; + + + Load a Private Key + فتح مفتاح التشفير الخاص + Class = "NSButtonCell"; title = "Load a Private Key"; ObjectID = "P3k-kI-w22"; + + + Cancel + إلغاء + Class = "NSButtonCell"; title = "Cancel"; ObjectID = "RbM-Dq-A3K"; + + + Specify a private key for the digital signature. + حدّد مفتاح التشفير الخاص للتوقيع الرقمي + Class = "NSTextFieldCell"; title = "Specify a private key for the digital signature."; ObjectID = "Tfc-EF-VnS"; + + + Enter Password + ادخل كلمة المرور + Class = "NSSecureTextFieldCell"; placeholderString = "Enter Password"; ObjectID = "Zj5-0h-hpW"; + + + Cancel + إلغاء + Class = "NSButtonCell"; title = "Cancel"; ObjectID = "jpH-3g-Gt5"; + + + Cancel + إلغاء + Class = "NSButtonCell"; title = "Cancel"; ObjectID = "qZ4-0O-L0G"; + + + Load Signature + فتح التوقيع + Class = "NSButtonCell"; title = "Load Signature"; ObjectID = "tTF-wa-eJp"; + + + Window + نافذة + Class = "NSWindow"; title = "Window"; ObjectID = "uKp-p4-6uB"; + + +
+ +
+ +
+ + + %@ Help + %@ مساعدة + No comment provided by engineer. + + + About %@ + عن %@ + No comment provided by engineer. + + + Acknowledgments + شكر وتقدير لـ + No comment provided by engineer. + + + Before signing the document, it must be saved. + لإجراء توقيع المستند، يجب الحفظ أولًا + No comment provided by engineer. + + + Cancel + إلغاء + No comment provided by engineer. + + + Cannot open file of Digital Signature + غير قادر على فتح ملف التوقيع الرقمي + No comment provided by engineer. + + + Cannot open file of Private Key + غير قادر على فتح ملف مفتاح التشفير الخاص + No comment provided by engineer. + + + Cannot open folder of the file location. + غير قادر على فتح المجلد للمكان المختار + No comment provided by engineer. + + + Comma-Separated Values + قيم مفرّقة بفاصلة (*.csv) + No comment provided by engineer. + + + Create portal + إنشاء بوابة سحابية + No comment provided by engineer. + + + Delete and Quit + حذف وخروج + No comment provided by engineer. + + + DjVu File + مستند رقمي (*.djvu) + No comment provided by engineer. + + + Do you want to save the changes made to the document "%@"? + هل تريد حفظ التغييرات للمستند "%@"؟ + No comment provided by engineer. + + + Document %ld.docx + مستند %ld.docx + No comment provided by engineer. + + + Document %ld.docxf + مستند %ld.docxf + No comment provided by engineer. + + + Document template + قالب وورد (*.dotx) + No comment provided by engineer. + + + Don't Save + عدم الحفظ + No comment provided by engineer. + + + Electronic Publication + كتاب النشر الإلكتروني (*.epub) + No comment provided by engineer. + + + Excel 97-2003 Spreadsheet + جدول إكسل 97-2003 (*.xls) + No comment provided by engineer. + + + Excel 2007 Spreadsheet + جدول إكسل (*.xlsx) + No comment provided by engineer. + + + Macro-enabled spreadsheet template + قالب جدول إكسيل مع خاصية الماكرو (*.xltm) + No comment provided by engineer. + + + FictionBook File + ملف فكشنبوك 2 (*.fb2) + No comment provided by engineer. + + + File "%@" can not be open or not exist. + "%@" غير قابل للفتح أو غير موجود. + No comment provided by engineer. + + + File Format: + صيغة الملف: + No comment provided by engineer. + + + File can not be open. + غير قادر على فتح الملف. + No comment provided by engineer. + + + HTML File + ملف لغة توصيف النص الفائق (*.html) + No comment provided by engineer. + + + Hide %@ + إخفاء %@ + No comment provided by engineer. + + + If you don't review your documents, all your changeses will be lost. + إن لم تراجع مستنداتك، فستخسر التغييرات. + No comment provided by engineer. + + + If you have already purchased %@, you should find your activation key in an email confirmation. + إن قمت بشراء %@ من قبل، فسوف تجد رمز التفعيل في رسالة تأكيدية بالبريد الإلكتروني. + No comment provided by engineer. + + + License Agreement + الموافقة على الترخيص + No comment provided by engineer. + + + MHT File + ملف ويب مخزّن (*.mht) + No comment provided by engineer. + + + Mobipocket e-book + ملف موبي بوكيت (*.mobi) + No comment provided by engineer. + + + No + لا + No comment provided by engineer. + + + OK + حسنًا + No comment provided by engineer. + + + ONLYOFFICE can not open the Digital Signature file. Try opening another file. + أونلي أوفيس غير قادر على فتح ملف التوقيع الرقمي. جرّب ملفًّا آخر. + No comment provided by engineer. + + + ONLYOFFICE can not open the Private Key. Try opening another file. + أونلي أوفيس غير قادر على فتح مفتاح التشفير الخاص. جرّب ملفًّا آخر. + No comment provided by engineer. + + + OpenDocument Document Template + مستند ليبري أوفس (*.ott) + No comment provided by engineer. + + + OpenDocument Presentation Template + قالب عرض ليبري أوفس (*.otp) + No comment provided by engineer. + + + OpenDocument Spreadsheet Template + قالب جدول ليبري أوفس (*.ots) + No comment provided by engineer. + + + OpenOffice Document + ملف نصي ليبري أوفس (*.odt) + No comment provided by engineer. + + + OpenOffice Presentation + عرض ليبري أوفس (*.odp) + No comment provided by engineer. + + + OpenOffice Spreadsheet + جدول ليبري أوفس (*.ods) + No comment provided by engineer. + + + Opening + جاري الفتح + No comment provided by engineer. + + + PDF File + بي دي إف (*.pdf) + No comment provided by engineer. + + + PDF/A File + بي دي إف طويل الأجل (*.pdf) + No comment provided by engineer. + + + Plain Text + ملف نصي (*.txt) + No comment provided by engineer. + + + PowerPoint 97-2003 Presentation + عرض بوربوينت 97-2003 (*.ppt) + No comment provided by engineer. + + + PowerPoint 2007 Presentation + عرض بوربوينت قابل للتعديل (*.pptx) + No comment provided by engineer. + + + Macro-enabled Presentation + عرض بوربوينت مع خاصية الماكرو (*.pptm) + No comment provided by engineer. + + + PowerPoint Slide Show + عرض بوربوينت غير قابل للتعديل (*.ppsx) + No comment provided by engineer. + + + Preparing... + تجهيز... + No comment provided by engineer. + + + Presentation %ld.pptx + عرض %ld.pptx + No comment provided by engineer. + + + Presentation template + قالب عرض بوربوينت (*.potx) + No comment provided by engineer. + + + Presenter View + وضع إلقاء العرض + No comment provided by engineer. + + + Quit %@ + خروج من %@ + No comment provided by engineer. + + + Review Changes... + مراجعة التغييرات... + No comment provided by engineer. + + + Rich Text Document + ملف نصي غني (*.rtf) + No comment provided by engineer. + + + Save + حفظ + No comment provided by engineer. + + + Save the document? + حفظ المستند؟ + No comment provided by engineer. + + + Signature Details + معلومات التوقيع + No comment provided by engineer. + + + Spreadsheet %ld.xlsx + جدول %ld.xlsx + No comment provided by engineer. + + + Spreadsheet template + قالب جدول إكسل (*.xltx) + No comment provided by engineer. + + + Thank you for evaluating %@! + شكرًا على تقييم %@! + No comment provided by engineer. + + + The document "%@" must be built. Continue? + المستند "%@" يجب بناؤه. استمر؟ + No comment provided by engineer. + + + To open the file location, it must be saved. + لفتح مكان الملف، يجب الحفظ. + No comment provided by engineer. + + + Unconfirmed + غير مؤكد + No comment provided by engineer. + + + Untitled + بدون عنوان + No comment provided by engineer. + + + Version %1$@ (%2$@) + نسخة %1$@ (%2$@) + No comment provided by engineer. + + + Web Page + صفحة ويب + No comment provided by engineer. + + + With access to pro features + مع صلاحية استخدام للميزات المدفوعة + No comment provided by engineer. + + + Word 97-2003 Document + مستند وورد 97-2003 (*.doc) + No comment provided by engineer. + + + Word 2007 Document + مستند وورد (*.docx) + No comment provided by engineer. + + + XML Paper Specification + مستند أوبن إكس بي إس (*.xps) + No comment provided by engineer. + + + Yes + نعم + No comment provided by engineer. + + + You have %1$ld %2$@ documents with unconfirmed changes. Do you want to review these changes before quitting? + لديك %1$ld %2$@ مستندات بتغييرات غير مؤكدة. هل تريد مراجعة التغييرات قبل الخروج؟ + No comment provided by engineer. + + + You have successfully activated %@. + لقد تم تفعيل %@. + No comment provided by engineer. + + + Your changes will be lost if you don’t save them. + سوف يتم فقد التغييرات إن لم تقم بالحفظ. + No comment provided by engineer. + + + Your subscription has expired. + +The program works in the non-activated mode. + +Now you can prolong or upgrade your subscription with a discount. + لقد انتهى اشتراكك. + +البرنامج يعمل في وضع عدم التفعيل. + +الآن يمكنك تجديد أو تطوير اشتراكك مع خصم. + No comment provided by engineer. + + + Your subscription is about to expire +(%d days left). + +We have a special offer for you. + اشتراكك على وشك الانتهاء +(%d أيام متبقية). + +لدينا عرض خاص لك. + No comment provided by engineer. + + + New Document + مستند جديد + No comment provided by engineer. + + + New Presentation + عرض تقديمي جديد + No comment provided by engineer. + + + New Spreadsheet + جدول بياني جديد + No comment provided by engineer. + + +
+ +
+ +
+ + + %#@days@ + %#@أيام@ + + + + %d day are left until the license expiration. + %d يوم متبقي لانتهاء الترخيص. + + + + %d days are left until the license expiration. + %d أيام متبقية لانتهاء الترخيص. + + + + %#@days@ + %#@أيام@ + + + + You are using a trial version of the application. +The trial period will end in %d day, after that you will not be able to create and edit documents. + أنت تستخدم نسخة تجريبية من التطبيق. +مدة التجريب ستنتهي بعد %d يوم، بعدها لن تستطيع أن تنشئ أو تعدل على المستندات. + + + + You are using a trial version of the application. +The trial period will end in %d days, after that you will not be able to create and edit documents. + أنت تستخدم نسخة تجريبية من التطبيق. +مدة التجريب ستنتهي بعد %d أيام، بعدها لن تستطيع أن تنشئ أو تعدل على المستندات. + + + + %#@documents@ + %#@مستندات@ + + + + You have %ld %@ document with unconfirmed changes. Do you want to review these changes before quitting? + لديك %ld %@ مستند بتغييرات غير مؤكدة. هل تريد مراجعة التغييرات قبل الخروج؟ + + + + You have %ld %@ documents with unconfirmed changes. Do you want to review these changes before quitting? + لديك %ld %@ مستندات بتغييرات غير مؤكدة. هل تريد مراجعة التغييرات قبل الخروج؟ + + + +
+ +
+ +
+ + + Customize Toolbar… + تخصيص شريط الأدوات + Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; + + + ONLYOFFICE + أونلي أوفيس + Class = "NSMenuItem"; title = "ONLYOFFICE"; ObjectID = "1Xt-HY-uBw"; + + + Find + بحث + Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; + + + Lower + تصغير + Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; + + + Raise + رفع + Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; + + + Transformations + تحويلات + Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; + + + Spelling + إملاء + Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; + + + Use Default + استخدم الافتراضي + Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; + + + Speech + تحدُّث + Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; + + + Find + بحث + Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; + + + License Agreement + الموافقة على الترخيص + Class = "NSMenuItem"; title = "License Agreement"; ObjectID = "4et-TX-a4m"; + + + Quit ONLYOFFICE + خروج من أونلي أوفيس + Class = "NSMenuItem"; title = "Quit ONLYOFFICE"; ObjectID = "4sb-4s-VLi"; + + + Edit + تعديل + Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; + + + Copy Style + نسخ التنسيق + Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; + + + About ONLYOFFICE + عن أونلي أوفيس + Class = "NSMenuItem"; title = "About ONLYOFFICE"; ObjectID = "5kV-Vb-QxS"; + + + Redo + إعادة + Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; + + + License agreement + الموافقة على الترخيص + Class = "NSButtonCell"; title = "License agreement"; ObjectID = "8Ga-Cu-VGe"; + + + Writing Direction + اتجاه الكتابة + Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; + + + New + جديد + Class = "NSMenuItem"; title = "New"; ObjectID = "9aQ-wl-gjS"; + + + none + لا شيء + Class = "NSTextFieldCell"; title = "none"; ObjectID = "9i7-kj-42B"; + + + Substitutions + بدائل + Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; + + + Smart Copy/Paste + نسخ/لصق ذكي + Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; + + + Tighten + تضييق + Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; + + + Correct Spelling Automatically + تصحيح تلقائي + Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; + + + Main Menu + القائمة الرئيسية + Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; + + + Preferences… + تفضيلات... + Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; + + + Left to Right + من اليسار إلى اليمين + Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; + + + Save As… + حفظ باسم... + Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; + + + Acknowledgments + شكر وتقدير لـ + Class = "NSMenuItem"; title = "Acknowledgments"; ObjectID = "CJU-dx-a9l"; + + + Spreadsheet + جدول + Class = "NSMenuItem"; title = "Spreadsheet"; ObjectID = "DOj-j9-dza"; + + + Close + إغلاق + Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; + + + Spelling and Grammar + تدقيق وإملاء + Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; + + + Help + مساعدة + Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; + + + Product Help + مساعدة حول المنتج + Class = "NSMenuItem"; title = "Product Help"; ObjectID = "FKE-Sm-Kum"; + + + Text + نص + Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; + + + Substitutions + بدائل + Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; + + + User Name + اسم المستخدم + Class = "NSTextFieldCell"; title = "User Name"; ObjectID = "FoF-wl-Dxi"; + + + Bold + عريض + Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; + + + Format + تنسيق + Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; + + + Use Default + استخدم الافتراضي + Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; + + + Font + خط + Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; + + + Writing Direction + اتجاه الكتابة + Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; + + + View + عرض + Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; + + + Text Replacement + استبدال نص + Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; + + + Show Spelling and Grammar + إظهار التدقيق الإملائي + Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; + + + View + عرض + Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; + + + Subscript + تحت السطر + Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; + + + Open… + فتح... + Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; + + + ONLYOFFICE + أونلي أوفيس + Class = "NSWindow"; title = "ONLYOFFICE"; ObjectID = "IQv-IB-iLA"; + + + Justify + ضبط النص + Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; + + + Use None + استخدم لا شيء + Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; + + + Revert to Saved + الرجوع إلى ما تم حفظه + Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; + + + Show All + إظهار الكل + Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; + + + Bring All to Front + عرض الكل إلى الأمام + Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; + + + Paste Ruler + لصق المسطرة + Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; + + + Left to Right + من اليسار إلى اليمين + Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; + + + Copy Ruler + نسخ المسطرة + Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; + + + Services + خدمات + Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; + + + Default + افتراضي + Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; + + + Minimize + تصغير + Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; + + + Baseline + على السطر + Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; + + + Hide ONLYOFFICE + إخفاء أونلي أوفيس + Class = "NSMenuItem"; title = "Hide ONLYOFFICE"; ObjectID = "Olw-nP-bQN"; + + + Find Previous + بحث للسابق + Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; + + + Stop Speaking + أوقف التحدُّث + Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; + + + Bigger + أكبر + Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; + + + Show Fonts + إظهار الخطوط + Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; + + + Zoom + تكبير + Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; + + + Right to Left + من اليمين إلى اليسار + Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; + + + Close + إغلاق + Class = "NSButtonCell"; title = "Close"; ObjectID = "Riu-oE-8dj"; + + + none + لا شيء + Class = "NSTextFieldCell"; title = "none"; ObjectID = "Rkd-xb-FRJ"; + + + Logout + تسجيل الخروج + Class = "NSButtonCell"; title = "Logout"; ObjectID = "RmO-tv-UKh"; + + + Superscript + فوق السطر + Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; + + + Select All + اختيار الكل + Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; + + + Jump to Selection + القفز إلى المكان المختار + Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; + + + Document + مستند + Class = "NSMenuItem"; title = "Document"; ObjectID = "TEm-B8-gsH"; + + + Window + نافذة + Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; + + + Capitalize + تكبير الحروف الإنجليزية الأولى من كل كلمة + Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; + + + Center + توسيط + Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; + + + Hide Others + إخفاء آخَر + Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; + + + Italic + مائل + Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; + + + Edit + تعديل + Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; + + + Underline + تسطير + Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; + + + Paste and Match Style + لصق ومطابقة التنسيق + Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; + + + Find… + بحث... + Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; + + + Find and Replace… + بحث واستبدال... + Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; + + + Default + افتراضي + Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; + + + Start Speaking + ابدأ التحدُّث + Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; + + + Align Left + محاذاة لليسار + Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; + + + Version + نسخة + Class = "NSTextFieldCell"; title = "Version"; ObjectID = "ZbA-hc-8PE"; + + + Email: + البريد الإلكتروني: + Class = "NSTextFieldCell"; title = "Email:"; ObjectID = "Zsi-3o-ASl"; + + + Paragraph + قطعة + Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; + + + Print… + طباعة... + Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; + + + Window + نافذة + Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; + + + Font + خط + Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; + + + Use Default + استخدم الافتراضي + Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; + + + Show Colors + إظهار الألوان + Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; + + + File + ملف + Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; + + + Use Selection for Find + استخدم النص المحدد للبحث + Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; + + + Transformations + تحويلات + Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; + + + Use None + استخدم لا شيء + Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; + + + Selection + اختيار + Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; + + + Smart Links + الروابط الذكية + Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; + + + Make Lower Case + تصغير الأحرف الإنجليزية + Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; + + + Text + نص + Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; + + + File + ملف + Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; + + + Undo + تراجع + Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; + + + Paste + لصق + Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; + + + File Name + اسم الملف + Class = "NSTextFieldCell"; title = "File Name"; ObjectID = "gm3-6i-EnL"; + + + New + جديد + Class = "NSMenu"; title = "New"; ObjectID = "hD5-Cz-ItX"; + + + Smart Quotes + الاقتباسات الذكية + Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; + + + Presentation + عرض + Class = "NSMenuItem"; title = "Presentation"; ObjectID = "hkB-TU-Ps1"; + + + Check Document Now + التحقق من المستند الآن + Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; + + + Services + خدمات + Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; + + + Smaller + أصغر + Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; + + + Baseline + على السطر + Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; + + + Kern + المسافة بين الأحرف + Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; + + + Right to Left + من اليمين إلى اليسار + Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; + + + Format + تنسيق + Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; + + + ONLYOFFICE + أونلي أوفيس + Class = "NSTabViewItem"; label = "ONLYOFFICE"; ObjectID = "kcg-El-49G"; + + + Cancel + إلغاء + Class = "NSButtonCell"; title = "Cancel"; ObjectID = "m0C-e9-0oc"; + + + Check Grammar With Spelling + التحقق من الإملاء + Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; + + + Ligatures + الوصلات الكتابية + Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; + + + Open Recent + فتح المستجدّات + Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; + + + Loosen + توسيع + Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; + + + Delete + حذف + Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; + + + Save + حفظ + Class = "NSMenuItem"; title = "Save"; ObjectID = "pxx-59-PXV"; + + + Find Next + بحث للتالي + Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; + + + Page Setup… + تهيئة الصفحة... + Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; + + + Check Spelling While Typing + التحقق من الإملاء أثناء الكتابة + Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; + + + Smart Dashes + الشرطات الذكية + Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; + + + Copyright info + حول حقوق التأليف والنشر + Class = "NSTextFieldCell"; title = "Copyright info"; ObjectID = "sGd-zc-V0B"; + + + Show Toolbar + إظهار شريط الأدوات + Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; + + + Data Detectors + مكتشف البيانات + Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; + + + Open Recent + فتح المستجدّات + Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; + + + Kern + المسافة بين الأحرف + Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; + + + ONLYOFFICE + أونلي أوفيس + Class = "NSMenu"; title = "ONLYOFFICE"; ObjectID = "uQy-DD-JDr"; + + + Cut + قص + Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; + + + Check for Updates… + التحقق من التحديثات... + Class = "NSMenuItem"; title = "Check for Updates…"; ObjectID = "ud7-wC-A79"; + + + Paste Style + لصق التنسيق + Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; + + + Show Ruler + إظهار المسطرة + Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; + + + Clear Menu + إخلاء القائمة + Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; + + + Make Upper Case + تكبير الأحرف الإنجليزية + Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; + + + Ligatures + الوصلات الكتابية + Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; + + + Align Right + محاذاة لليمين + Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; + + + Text Cell + خلية نص + Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "wpe-8d-5DV"; + + + Help + مساعدة + Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; + + + Copy + نسخ + Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; + + + Product + منتج + Class = "NSTextFieldCell"; title = "Product"; ObjectID = "xCO-ey-2lo"; + + + Use All + استخدم الكل + Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; + + + Speech + تحدُّث + Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; + + + Show Substitutions + إظهار البدائل + Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; + + + Portal: + البوابة السحابية: + Class = "NSTextFieldCell"; title = "Portal:"; ObjectID = "zwS-9G-S0N"; + + +
+ +
+ +
+ + + Could not move to Applications folder + غير قادر على النقل إلى مجلد التطبيقات + No comment provided by engineer. + + + Do Not Move + لا تحرّك + No comment provided by engineer. + + + I can move myself to the Applications folder if you'd like. + أستطيع نقل نفسي إلى ملف التطبيقات إذا أردت. + No comment provided by engineer. + + + Move to Applications Folder + نقل إلى مجلد التطبيقات + No comment provided by engineer. + + + Move to Applications folder in your Home folder? + نقل إلى مجلد التطبيقات داخل مجلد المنزل؟ + No comment provided by engineer. + + + Move to Applications folder? + نقل إلى مجلد التطبيقات؟ + No comment provided by engineer. + + + Note that this will require an administrator password. + لاحظ أن هذه العملية تتطلب كلمة مرور المسؤول + No comment provided by engineer. + + + This will keep your Downloads folder uncluttered. + هذا سيبقي ملف التحميلات مرتبًا + No comment provided by engineer. + + +
+ +
+ +
+ + + Reporter Window + نافذة الإبلاغ + Class = "NSWindow"; title = "Reporter Window"; ObjectID = "Ygx-5K-Hn8"; + + +
+ +
+ +
+ + + ONLYOFFICE + أونلي أوفيس + Bundle name + + + Copyright © 2023 Ascensio System SIA. All rights reserved. + الحقوق جميعها محفوظة 2023 © أسينسو سيستم. + Copyright (human-readable) + + +
+ +
+ +
+ + + ONLYOFFICE + أونلي أوفيس + Bundle name + + + Copyright © 2023 Ascensio System SIA. All rights reserved. + الحقوق جميعها محفوظة 2023 © أسينسو سيستم. + Copyright (human-readable) + + +
+ +
+ +
+ + + ONLYOFFICE + أونلي أوفيس + Bundle name + + + Copyright © 2023 Ascensio System SIA. All rights reserved. + الحقوق جميعها محفوظة 2023 © أسينسو سيستم. + Copyright (human-readable) + + +
+
diff --git a/win-linux/langs/ar_SA.ts b/win-linux/langs/ar_SA.ts new file mode 100644 index 000000000..f9e159c1c --- /dev/null +++ b/win-linux/langs/ar_SA.ts @@ -0,0 +1,901 @@ + + + + + CAscApplicationManagerWrapper + + + Presenter View + وضع إلقاء العرض + + + Update is running. Break update and close the app? + التحديث قيد التننفيذ. هل تريد إلغاء التحديث وإغلاق التطبيق؟ + + + Close all editors windows? + كل نوافذ التعديل ستغلق. هل تريد الاستمرار؟ + + + + + Document%1.docx + مستند%1.docx + + + + Book%1.xlsx + سِجِل%1.xlsx + + + + Presentation%1.pptx + عرض%1.pptx + + + + CAscTabWidget + + + + Document + جاري الفتح... + + + + CDialogCertificateInfo + + + Certificate Details + معلومات الشهادة + + + + CDialogCertificateInfo::Intf + + + OK + حسنًا + + + + CDialogOpenSsl + + + Select certificate + اختر الشهادة + + + + select certificate file... + اختر ملف الشهادة... + + + + Certificate password: + كلمة مرور الشهادة: + + + + select key file... + اختار ملف مفتاح التشفير... + + + + Key password: + كلمة مرور مفتاح التشفير: + + + + + + + Open Document + فتح مستند + + + + Enter certificate path + أدخِل مكان الشهادة + + + + Certificate is not supported + الشهادة غير مدعومة + + + + Enter certificate password + أدخِل كلمة مرور الشهادة + + + + Wrong certificate password.<br>Please enter again + كلمة مرور الشهادة خاطئة.<br>فضلًا أعِد الإدخال مجددًا + + + + Enter valid private key + أدخِل مفتاح تشفير صحيح + + + + Key is not supported + مفتاح التشفير غير مدعوم + + + + Enter key password + أدخِل كلمة مرور مفتاح التشفير + + + + CDownloadWidget + + + Cancel + إلغاء + + + + CEditorWindow + + + Open main window + فتح النافذة الرئيسية + + + + Document must be saved to continue.<br>Save the document? + يجب حفظ المستند للإكمال.<br>حفظ المستند؟ + + + + Print Document + طباعة المستند + + + + Document must be saved firstly. + يجب حفظ المستند أولًا. + + + + %1 has been changed. Save changes? + %1 تم تعديله. هل تريد حفظ التغييرات؟ + + + + Some data will lost.<br>Continue? + إذا استمررت بالحفظ بهذه الصيغة فإن كل الميزات ستضيع إلا النص.<br>هل أنت متأكد بالاستمرار؟ + + + + CEditorWindowPrivate + + + There are no printers available + لا توجد أي طابعة متاحة + + + + CFileDialogWrapper + + + All files (*.*) + كل الملفات (*.*) + + + DOCX Document (*.docx) + مستند وورد (*.docx) + + + Document template (*.dotx) + قالب وورد (*.dotx) + + + + DOC Document (*.doc) + مستند وورد 97-2003 (*.doc) + + + + ODT Document (*.odt) + ملف نصي ليبري أوفس (*.odt) + + + OpenDocument Document template (*.ott) + مستند ليبري أوفس (*.ott) + + + + RTF File (*.rtf) + ملف نصي غني (*.rtf) + + + + TXT File (*.txt) + ملف نصي (*.txt) + + + + HTML File (*.html) + ملف لغة توصيف النص الفائق (*.html) + + + + MHT File (*.mht) + ملف ويب مخزّن (*.mht) + + + + EPUB File (*.epub) + كتاب النشر الإلكتروني (*.epub) + + + + FB2 File (*.fb2) + ملف فكشنبوك 2.0 (*.fb2) + + + + MOBI File (*.mobi) + ملف موبي بوكيت (*.mobi) + + + + OFORM Document (*.oform) + استبيان قابل للتعبئة أونلي أوفيس أونلاين (*.oform) + + + + DOCXF Document (*.docxf) + قالب استبيان أونلي أوفيس (*.docxf) + + + + PPTX File (*.pptx) + عرض بوربوينت قابل للتعديل (*.pptx) + + + + PPT File (*.ppt) + عرض بوربوينت 97-2003 (*.ppt) + + + Presentation template (*.potx) + قالب عرض بوربوينت (*.potx) + + + + ODP File (*.odp) + عرض ليبري أوفس (*.odp) + + + + PPSX File (*.ppsx) + عرض بوربوينت غير قابل للتعديل (*.ppsx) + + + + Macro-enabled Presentation File (*.pptm) + عرض بوربوينت مع خاصية الماكرو (*.pptm) + + + + XLSX File (*.xlsx) + جدول إكسل (*.xlsx) + + + Spreadsheet template (*.xltx) + قالب جدول إكسل (*.xltx) + + + Macro-enabled spreadsheet template (*.xltm) + قالب جدول إكسيل مع خاصية الماكرو (*.xltm) + + + + XLS File (*.xls) + جدول إكسل 97-2003 (*.xls) + + + + ODS File (*.ods) + جدول ليبري أوفس (*.ods) + + + + DOCX Document + مستند وورد + + + + OpenDocument Document template + قالب مستند ليبري أوفس + + + + OpenDocument Presentation Template + قالب عرض ليبري أوفس + + + + Macro-enabled spreadsheet template + قالب جدول مع خاصية الماكرو + + + + OpenDocument Spreadsheet Template + قالب جدول ليبري أوفس + + + + CSV File (*.csv) + قيم مفرّقة بفاصلة (*.csv) + + + + PDF File (*.pdf) + بي دي إف (*.pdf) + + + + PDFA File (*.pdf) + بي دي إف طويل الأجل (*.pdf) + + + + DJVU File (*.djvu) + مستند رقمي (*.djvu) + + + + XPS File (*.xps) + مستند أوبن إكس بي إس (*.xps) + + + + SVG Image (*.svg) + صورة للرسوميات المتّجهة (*.svg) + + + + JPG Image (*.jpg *.jpeg) + صورة بخلفية (*.jpg *.jpeg) + + + + PNG Image (*.png) + صورة بلا خلفية (*.png) + + + + Save As + حفظ باسم + + + + %1 already exists.<br>Do you want to replace it? + %1 موجود مسبقًا.<br>هل تريد استبداله؟ + + + + Word Document + مستند وورد + + + + Excel Workbook + جدول إكسل + + + + PowerPoint Presentation + عرض بوربوينت + + + + %1 File (*.%2) + %1 ملف (*.%2) + + + + + + Text documents + مستندات نصية + + + + + + Spreadsheets + جداول بيانات + + + + + + Presentations + عروض تقديمية + + + + Web Page + صفحة ويب + + + + Text files + ملفات نصية + + + + + + All supported files + كل الملفات المدعومة + + + + + Spreadsheet template + قالب جدول بياني + + + + + Presentation template + قالب عرض تقديمي + + + + + Document template + قالب مستند + + + + Open Document + فتح مستند + + + + + All Images + كل الصور + + + + + Jpeg (*.jpeg *.jpg);;Png (*.png);;Gif (*.gif);;Bmp (*.bmp) + Jpeg (*.jpeg *.jpg);;Png (*.png);;Gif (*.gif);;Bmp (*.bmp) + + + + + Plugin file (*.plugin) + ملف إضافة (*.plugin) + + + + Video file + ملف فيديو + + + + Audio file + ملف صوتي + + + + Select Folder + اختر المجلد + + + + CMainWindow + + + More than one document is open.<br>Close the window anyway? + لديك أكثر من مستند مفتوح.<br>إغلاق النافذة على أي حال؟ + + + + Don't ask again. + لا تسألني مجددًا. + + + + + File format not supported. + صيغة الملف غير مدعومة + + + + %1 doesn't exists!<br>Remove file from the list? + %1 غير موجود. قد يتم إعادة تسمية الملف، نقله أو حذفه.<br>هل تريد إزالة الملف من القائمة؟ + + + + Document must be saved firstly. + يجب حفظ المستند أولًا. + + + + Document must be saved to continue.<br>Save the document? + يجب حفظ المستند للإكمال.<br>حفظ المستند؟ + + + + There are no printers available + لا توجد أي طابعة متاحة + + + + Print Document + طباعة المستند + + + + Sign Up + إنشاء بوابة سحابية + + + + %1 is modified.<br>Do you want to keep changes? + %1 تم تعديله.<br>هل تريد حفظ التغييرات؟ + + + + CMainWindowImpl + + + Licensed under + مرخص بموجب + + + + CPrintProgress + + + Document is printing: page %1 of %2 + جاري طباعة المستند: صفحة %1 من %2 + + + + Document is preparing + جاري تجهيز المستند + + + + &Cancel + &إلغاء + + + + Printing... + جاري الطباعة... + + + + CUpdateManager + + + Check for updates + التحقق من التحديثات + + + + Unable to check update: URL not defined. + غير قادر على التحقق من التحديثات: الرابط غير معرّف. + + + + To finish updating, restart app + لإنهاء التحديث، أعِد تشغيل التطبيق + + + + Restart + إعادة تشغيل + + + + Checking for updates... + جاري التحقق من التحديثات... + + + + Updates are not allowed! + غير مسموح بالتحديثات! + + + + This folder configuration does not allow for updates! The folder name should be: + إعدادات هذا المجلد لا تسمح للتحديثات! ينبغي تسمية المجلد بـ: + + + + An error occurred while check updates: Update Service not found! + حصل خطأ أثناء التحقق من التحديثات: خدمة التحديث مفقودة! + + + + Downloading new version %1 (%2%) + جاري تحميل النسخة الجديدة %1 (%2%) + + + + An error occurred while loading updates: Update Service not found! + حصل خطأ أثناء فتح التحديثات: خدمة التحديث مفقودة! + + + + Cancel + إلغاء + + + + An error occurred while loading updates: package Url is empty! + حصل خطأ أثناء فتح التحديثات: رابط حزمة البرامج فارغة! + + + + Update package error: md5 sum does not match the original. + خطأ في حزمة التحديث: عدم تطابق خوارزمية إم دي 5 التشفيرية مع الأصل. + + + + Preparing update... + جاري تجهيز التحديث... + + + + An error occurred while unzip updates: Update Service not found! + خطأ أثناء فك ضغط التحديثات: خدمة التحديث مفقودة! + + + + Update is available (version %1) + هنالك تحديث متوفر (version %1) + + + + Download update + تحميل التحديث + + + + Current version is up to date + النسخة الحالية هي الأحدث + + + + An error occured while unpacking the archive + خطأ أثناء فك ضغط الملف المضغوط + + + + Update download failed: out of memory! + فشل تحميل التحديث: نفذت الذاكرة العشوائية! + + + + Update download failed: server connection error! + فشل تحميل التحديث: خطأ في اتصال الخادم! + + + + Update download failed: wrong URL! + فشل تحميل التحديث: خطأ في الرابط! + + + + Update download failed: unable to create file! + فشل تحميل التحديث: غير قادر على إنشاء الملف! + + + + Update download failed: network error! + فشل تحميل التحديث: خطأ في الشبكة! + + + + A service error has occurred! + خطأ في الخدمة! + + + + Last check performed %1 + آخر تحقق نُفّذ %1 + + + + Error opening JSON file. + خطأ خلال فتح ملف جسون. + + + + Update is available + هنالك تحديث متوفر + + + + + Current version + النسخة الحالية + + + + + Update version + نسخة التحديث + + + + Would you like to download update now? + هل ترغب في التحديث الآن؟ + + + + Update is ready to install + التحديث جاهز للتثبيت + + + + Would you like to restart app now? + هل ترغب في إعادة تشغيل التطبيق؟ + + + + QObject + + + %1 doesn't exists!<br>Remove file from the list? + %1 غير موجود. قد يتم إعادة تسمية الملف، نقله أو حذفه.<br>هل تريد إزالة الملف من القائمة؟ + + + + File %1 cannot be opened or doesn't exists. + الملف المسمى بـ %1 لا يمكن فتحه أو غير موجود. + + + + + All files (*.*) + كل الملفات (*.*) + + + + XML File (*.xml) + ملف لغة التوصيف القابلة للتوسعة (*.xml) + + + + + Access to file '%1' is denied! + الوصول إلى الملف المسمى بـ ‘%1’ مرفوض! + + + + Read only + للقراءة فقط + + + + + Skip this version + تخطي هذه النسخة + + + + + Remind me later + ذكرني لاحقًا + + + + + Install update + تثبيت التحديث + + + + + Install later + التثبيت لاحقًا + + + + + Save and Restart Now + حفظ وإعادة التشغيل الآن + + + + + Save and Install Now + حفظ وتثبيت الآن + + + + + Download update + تحميل التحديث + + + + + Software Update + تحديث البرنامج + + + + + Release notes + سِجِلّ التغيير + + + + An error occurred while start install updates! + خطأ أثناء بداية تثبيت التحديثات! + + + + An error occurred while start replacing files: Update Service not found! + خطأ أثناء استبدال الملفات: خدمة التحديث مفقودة! + + + + Cancel + إلغاء + + + + Yes + نعم + + + + No + لا + + + + + OK + حسنًا + + + + Skip + تخطي + + + + Buy Now + اشتر الآن + + + + Activate + فعّل + + + + Continue + استمر + + + + An error occurred while opening the portal:<br>%1 + خطأ أثناء فتح البوابة السحابية:%1<br> + + + App can't working correctly under admin rights. + App can't work correctly under admin rights. + + + diff --git a/win-linux/package/windows/associate_page.iss b/win-linux/package/windows/associate_page.iss index 1e171ea47..b0ccda1ba 100644 --- a/win-linux/package/windows/associate_page.iss +++ b/win-linux/package/windows/associate_page.iss @@ -6,6 +6,7 @@ ChangesAssociations=true [CustomMessages] en.AssociateDescription =Associate office document file types with {#ASSC_APP_NAME} +ar_SA.AssociateDescription =هل تريد ربط صيغة المستند بـ {#ASSC_APP_NAME} bg.AssociateDescription =Свържете типовете файлове на офис документи с {#ASSC_APP_NAME} ca.AssociateDescription =Associa els tipus de fitxers de documents d'oficina amb{#ASSC_APP_NAME} cs.AssociateDescription =Přiřadit typy souborů kancelářských dokumentů {#ASSC_APP_NAME} @@ -48,6 +49,7 @@ si.AssociateDescription ={#ASSC_APP_NAME} සමඟ කාර්යාල ලේ zh_TW.AssociateDescription =與文書處理檔案類型聯結{#ASSC_APP_NAME} en.AssociateCaption =File Associations +ar_SA.AssociateCaption =ربط الملفات bg.AssociateCaption =Свързвания на файлове ca.AssociateCaption =Associacions de fitxers cs.AssociateCaption =Asociace souboru @@ -90,8 +92,9 @@ si.AssociateCaption =ගොනු නිශ්‍රය zh_TW.AssociateCaption =檔案聯結 en.AssociateDont =Do not associate -ca.AssociateDont =No associar +ar_SA.AssociateDont =عدم ربط bg.AssociateDont =Не свързвай +ca.AssociateDont =No associar cs.AssociateDont =Neasociováno el.AssociateDont =Να μην γίνει συσχετισμός ;et.AssociateDont =Ära ühenda @@ -132,6 +135,7 @@ si.AssociateDont =නිශ්‍ර කොකරන්න zh_TW.AssociateDont =不要聯結 en.AssociateAll =Associate all +ar_SA.AssociateAll =ربط الكل bg.AssociateAll =Свържи всички ca.AssociateAll =Associar tots cs.AssociateAll =Asociovat vše @@ -174,6 +178,7 @@ si.AssociateAll =සියල්ල නිහ්ශ්‍රය zh_TW.AssociateAll =全部聯結 en.AssociateSel =Associate selected +ar_SA.AssociateSel =ربط المختار bg.AssociateSel =Свържи избраните ca.AssociateSel =Associar seleccionats cs.AssociateSel =Vybraná asociace @@ -216,6 +221,7 @@ si.AssociateSel =තේරූ දෑ නිහ්ශ්‍රය zh_TW.AssociateSel =聯結已選定 en.AssociateAudio =File types +ar_SA.AssociateAudio =صيغ المف bg.AssociateAudio =Типове файлове ca.AssociateAudio =Tipus de fitxers cs.AssociateAudio =Typy souborů @@ -258,6 +264,7 @@ si.AssociateAudio =ගොනු වර්ග zh_TW.AssociateAudio =檔案類型 en.extMSWord =Microsoft Word Document +ar_SA.extMSWord =مستند مايكروسوفت وورد bg.extMSWord =Microsoft Word документ ca.extMSWord =Document Microsoft Word cs.extMSWord =Microsoft Word Dokument @@ -300,6 +307,7 @@ si.extMSWord =මයික්‍රොසොෆ්ට් වර්ඩ් ලේ zh_TW.extMSWord =Microsoft Word 文件 en.extMSExcel =Microsoft Excel Workbook +ar_SA.extMSExcel =جدول بياني مايكروسوفت إكسل bg.extMSExcel =Microsoft Excel работна книга ca.extMSExcel =Llibre de Microsoft Excel cs.extMSExcel =Microsoft Excel Sešit @@ -342,6 +350,7 @@ si.extMSExcel =මයික්‍රොසොෆ්ට් එක්සෙල් zh_TW.extMSExcel =Microsoft Excel 活頁簿 en.extMSPresentation =Microsoft PowerPoint Presentation +ar_SA.extMSPresentation =عرض تقديمي مايكروسوفت بوربوينت قابل للتعديل bg.extMSPresentation =Microsoft PowerPoint презентация ca.extMSPresentation =Presentació Microsoft PowerPoint cs.extMSPresentation =Microsoft PowerPoint Prezentace @@ -384,6 +393,7 @@ si.extMSPresentation =මයික්‍රොසොෆ්ට් පවර්ප zh_TW.extMSPresentation =Microsoft PowerPoint 簡報 en.extMSSlideshow =Microsoft PowerPoint Slideshow +ar_SA.extMSSlideshow =عرض تقديمي مايكروسوفت بوربوينت غير قابل للتعديل bg.extMSSlideshow =Microsoft PowerPoint слайдшоу ca.extMSSlideshow =Presentació de diapositives Microsoft PowerPoint cs.extMSSlideshow =Microsoft PowerPoint Slideshow @@ -426,6 +436,7 @@ si.extMSSlideshow =මයික්‍රොසොෆ්ට් පවර්පො zh_TW.extMSSlideshow =Microsoft PowerPoint 投影片 en.extODT =OpenDocument Text File +ar_SA.extODT =ملف نصي ليبري أوفس bg.extODT =OpenDocument текстов файл ca.extODT =Fitxer de text OpenDocument cs.extODT =Textový soubor OpenDocument @@ -468,6 +479,7 @@ si.extODT =ඕපන්ඩොකියුමන්ට් පෙළ ලේඛන zh_TW.extODT =OpenDocument Text 文件 en.extODS =OpenDocument Spreadsheet +ar_SA.extODS =جدول ليبري أوفس bg.extODS =OpenDocument електронна таблица ca.extODS =Full de càlcul OpenDocument cs.extODS =Sešit OpenDocument @@ -510,6 +522,7 @@ si.extODS =ඕපන්ඩොකියුමන්ට් පැතුරුම zh_TW.extODS =OpenDocument 試算表 en.extODP =OpenDocument Presentation +ar_SA.extODP =عرض ليبري أوفس bg.extODP =OpenDocument презентация ca.extODP =Presentació OpenDocument cs.extODP =Prezentace OpenDocument @@ -552,6 +565,7 @@ si.extODP =ඕපන්ඩොකියුමන්ට් සමර්පණය zh_TW.extODP =OpenDocument 簡報 en.extDOC =Word 97-2003 Document +ar_SA.extDOC =مستند وورد 97-2003 bg.extDOC =Word 97-2003 документ ca.extDOC =Document Word 97-2003 cs.extDOC =Dokument Word 97-2003 @@ -594,6 +608,7 @@ si.extDOC =වර්ඩ් 97-2003 ලේඛනය zh_TW.extDOC =Word 97-2003 文件 en.extDOCX =Office Open XML Document +ar_SA.extDOCX =مستند وورد bg.extDOCX =Office Open XML документ ca.extDOCX =Document Office Open XML cs.extDOCX =Dokument Office Open XML @@ -636,6 +651,7 @@ si.extDOCX =ඔෆිස් විවෘත XML ලේඛනය zh_TW.extDOCX =Office Open XML 文件 en.extDOCXF =ONLYOFFICE Form Template +ar_SA.extDOCXF =قالب استبيان أونلي أوفس bg.extDOCXF =ONLYOFFICE Шаблон на формуляр ca.extDOCXF =Plantilla de formulari ONLYOFFICE cs.extDOCXF =Šablona formuláře ONLYOFFICE @@ -678,6 +694,7 @@ si.extDOCXF =ඔන්ලිඔෆිස් ආකෘතිපත්‍ර අ zh_TW.extDOCXF =ONLYOFFICE 文档表单模板 en.extXLS =Excel 97-2003 Spreadsheet +ar_SA.extXLS =جدول إكسل 97-2003 bg.extXLS =Excel 97-2003 таблица ca.extXLS =Full de càlcul Excel 97-2003 cs.extXLS =Tabulka Excel 97-2003 @@ -720,6 +737,7 @@ si.extXLS =එක්සෙල් 97-2003 පැතුරුම්පත zh_TW.extXLS =Excel 97-2003 試算表 en.extXLSX =Office Open XML Spreadsheet +ar_SA.extXLSX =جدول إكسل bg.extXLSX =Office Open XML таблица ca.extXLSX =Full de càlcul Office Open XML cs.extXLSX =Tabulkový procesor Office Open XML @@ -762,6 +780,7 @@ si.extXLSX =ඔෆිස් විවෘත XML පැතුරුම්පත zh_TW.extXLSX =Office Open XML 試算表 en.extPPT =PowerPoint 97-2003 Presentation +ar_SA.extPPT =عرض بوربوينت 97-2003 bg.extPPT =PowerPoint 97-2003 Презентация ca.extPPT =Presentació de diapositives PowerPoint 97-2003 cs.extPPT =Prezentace PowerPoint 97-2003 @@ -804,6 +823,7 @@ si.extPPT =පවර්පොයින්ට් 97-2003 සමර්පණය zh_TW.extPPT =PowerPoint 97-2003 簡報 en.extPPTX =Office Open XML Presentation +ar_SA.extPPTX =عرض بوربوينت قابل للتعديل bg.extPPTX =Office Open XML Презентация ca.extPPTX =Presentació Office Open XML cs.extPPTX =Prezentace Office Open XML @@ -846,6 +866,7 @@ si.extPPTX =ඔෆිස් විවෘත XML සමර්පණය zh_TW.extPPTX =Office Open XML 簡報 en.extPPS =PowerPoint 97-2003 Slide Show +ar_SA.extPPS =عرض بوربوينت 97-2003 bg.extPPS =PowerPoint 97-2003 Слайдшоу ca.extPPS =Presentació de diapositives PowerPoint 97-2003 cs.extPPS =Prezentace PowerPoint 97-2003 @@ -888,6 +909,7 @@ si.extPPS =පවර්පොයින්ට් 97-2003 චිත්‍රකා zh_TW.extPPS =PowerPoint 97-2003投影片 en.extPPSX =Office Open XML Slide Show +ar_SA.extPPSX =عرض بوربوينت غير قابل للتعديل bg.extPPSX =Office Open XML Слайдшоу ca.extPPSX =Presentació de diapositives Office Open XML cs.extPPSX =Office Open XML Slide Show @@ -930,6 +952,7 @@ si.extPPSX =ඔෆිස් විවෘත XML චිත්‍රකාච ද zh_TW.extPPSX =Office Open XML 投影片 en.extRTF =Rich Text Format File +ar_SA.extRTF =ملف نصي غني bg.extRTF =Файл с богат текстов формат ca.extRTF =Fitxer en format de text enriquit cs.extRTF =Soubor ve formátu Rich Text @@ -972,6 +995,7 @@ si.extRTF =පොහොසත් පෙළ ආකෘති ගොනුව zh_TW.extRTF =Rich Text Format 文件 en.extCSV =Comma Separated Values +ar_SA.extCSV =قيم مفرّقة بفاصلة bg.extCSV =Стойности, разделени със запетая ca.extCSV =Valors separats per comes cs.extCSV =Hodnoty oddělené čárkou @@ -1014,6 +1038,7 @@ si.extCSV =අල්පවිරාම මගින් වෙන්කළ අග zh_TW.extCSV =逗點分隔值 en.extPDF =Portable Document +ar_SA.extPDF =بي دي إف bg.extPDF =Преносим документ ca.extPDF =Document portàtil cs.extPDF =Přenosný dokument @@ -1056,6 +1081,7 @@ si.extPDF =සුවහ ලේඛනය zh_TW.extPDF =PDF 檔案 en.extDJVU =Digital Document +ar_SA.extDJVU =مستند رقمي bg.extDJVU =Дигитален документ ca.extDJVU =Document digital cs.extDJVU =Digitální dokument @@ -1098,6 +1124,7 @@ si.extDJVU =සංඛ්‍යාංක ලේඛනය zh_TW.extDJVU =DjVu 檔案 en.extXPS =OpenXPS Document +ar_SA.extXPS =مستند أوبن إكس بي إس bg.extXPS =OpenXPS Документ ca.extXPS =Document OpenXPS cs.extXPS =Dokumentu OpenXPS @@ -1140,6 +1167,7 @@ si.extXPS =ඕපන් XPS ලේඛනය zh_TW.extXPS =OpenXPS 檔案 en.extOFORM =ONLYOFFICE Fillable Online Form +ar_SA.extOFORM =استبيان قابل للتعبئة أونلي أوفيس أونلاين bg.extOFORM =ONLYOFFICE Онлайн формуляр за попълване ca.extOFORM =Formulari d'emplenament en línia d’ONLYOFFICE cs.extOFORM =Vyplnitelný online formulář ONLYOFFICE @@ -1188,14 +1216,17 @@ en.extPPTM =PowerPoint Open XML Macro-Enabled Presentation en.extEPUB =Open eBook File en.extFB2 =FictionBook 2.0 File +ar_SA.extFB2 =ملف فكشنبوك 2.0 en.extDOTX =Word Open XML Document Template +ar_SA.extDOTX =قالب وور en.extOXPS =Open XML Paper Specification ;====================================================================================================== en.jumpDOCX =New document +ar_SA.jumpDOCX =مستند جديد bg.jumpDOCX =Нов документ ca.jumpDOCX =Nou document cs.jumpDOCX =Nový dokument @@ -1238,6 +1269,7 @@ si.jumpDOCX =නව ලේඛනය zh_TW.jumpDOCX =新文件 en.jumpXLSX =New spreadsheet +ar_SA.jumpXLSX =جدول بياني جديد bg.jumpXLSX =Нова електронна таблица ca.jumpXLSX =Nou full de càlcul cs.jumpXLSX =Nový sešit @@ -1280,6 +1312,7 @@ si.jumpXLSX =නව පැතුරුම්පත zh_TW.jumpXLSX =新試算表 en.jumpPPTX =New presentation +ar_SA.jumpPPTX =عرض تقديمي جديد bg.jumpPPTX =Нова презентация ca.jumpPPTX =Nova presentació cs.jumpPPTX =Nová prezentace @@ -1322,6 +1355,7 @@ si.jumpPPTX =නව සමර්පණය zh_TW.jumpPPTX =新簡報 en.jumpDOCXF =New form template +ar_SA.jumpDOCXF =قالب استبيان جديد bg.jumpDOCXF =Нов шаблон на формуляр ca.jumpDOCXF =Nova plantilla de formulari cs.jumpDOCXF =Nová šablona formuláře @@ -1364,6 +1398,7 @@ si.jumpDOCXF =නව ආකෘතිපත්‍ර අච්චුව zh_TW.jumpDOCXF =New form template en.defprogAppDescription=Free desktop office suite for document editing and collaboration +ar_SA.defprogAppDescription=حزمة برامج مكتبية مجانية لتحرير المستندات والتعاون لإنجازها مع رفقائك bg.defprogAppDescription=Безплатен офис пакет за редактиране и съвместна работа по документи ca.defprogAppDescription=Suite d'oficina gratuïta per a l'edició de documents i col·laboració cs.defprogAppDescription=Volně dostupný desktopový balíček pro úpravu dokumentů a spolupráci @@ -1406,6 +1441,7 @@ si.defprogAppDescription=ලේඛන සංස්කරණය සහ සහය zh_TW.defprogAppDescription=使用於檔案編輯和協作的免費桌面辦公套件 en.warnWin10FileAssociationDesc=To associate the files with the application, open the following window after the installation is complete: +ar_SA.warnWin10FileAssociationDesc=لربط الملفات مع التطبيق، افتح النافذة التالية بعد إكمال التثبيت bg.warnWin10FileAssociationDesc=За да свържете файловете с приложението, отворете следния прозорец, след като инсталацията приключи: ca.warnWin10FileAssociationDesc=Per associar els fitxers a l'aplicació, obriu la finestra següent després de la instal·lació: cs.warnWin10FileAssociationDesc=Pro připojení souborů k aplikaci, otevřete následující okno po dokončení aplikace: @@ -1448,6 +1484,7 @@ si.warnWin10FileAssociationDesc=යෙදුම සමඟ ගොනු නිහ zh_TW.warnWin10FileAssociationDesc=當安裝完成後,開啟以下的視窗將檔案與應用程式聯結: en.warnWin10FileAssociationPath=Settings > Apps > Default apps +ar_SA.warnWin10FileAssociationPath=الإعدادات > تطبيقات > الافتراضية bg.warnWin10FileAssociationPath=Настройки> Приложения> Приложение по подразбиране ca.warnWin10FileAssociationPath=Configuració> Aplicacions> Aplicacions predeterminades cs.warnWin10FileAssociationPath=Nastavení > Aplikace > Výchozí aplikace @@ -1490,6 +1527,7 @@ si.warnWin10FileAssociationPath=සැකසුම් > යෙදුම් > ප zh_TW.warnWin10FileAssociationPath=設定 > 應用程式 > 預設應用程式 en.runOpenDefaultApps=Open Default apps +ar_SA.runOpenDefaultApps=افتح التطبيقات الافتراضية bg.runOpenDefaultApps=Отвори приложения по подразбиране ca.runOpenDefaultApps=Obriu les aplicacions per defecte cs.runOpenDefaultApps=Otevřít výchozí aplikaci diff --git a/win-linux/package/windows/common.iss b/win-linux/package/windows/common.iss index 5a2fd3c12..b01d8b80b 100644 --- a/win-linux/package/windows/common.iss +++ b/win-linux/package/windows/common.iss @@ -158,6 +158,7 @@ Name: be; MessagesFile: compiler:Languages\Belarusian.isl; LicenseFile: {#sB Name: gl; MessagesFile: compiler:Languages\Galician.isl; LicenseFile: {#sBrandingFolder}\common\package\license\{#LIC_FILE}.rtf; Name: si; MessagesFile: compiler:Languages\Sinhala.islu; LicenseFile: {#sBrandingFolder}\common\package\license\{#LIC_FILE}.rtf; Name: zh_TW; MessagesFile: compiler:Languages\ChineseTraditional.isl; LicenseFile: {#sBrandingFolder}\common\package\license\{#LIC_FILE}.rtf; +Name: ar_SA; MessagesFile: compiler:Languages\Arabic.isl; LicenseFile: {#sBrandingFolder}\common\package\license\{#LIC_FILE}.rtf; [LangOptions] lo.LanguageName=ພາສາລາວ @@ -169,6 +170,7 @@ en.PrevVer=The previous version of {#sAppName} detected, please click 'OK' butto ru.PrevVer=Обнаружена предыдущая версия {#sAppName}, нажмите кнопку 'OK' чтобы удалить её, или 'Отмена' чтобы выйти из программы инсталляции. ;====================================================================================================== en.Launch =Launch %1 +ar_SA.Launch =بدء تشغيل %1 bg.Launch =Пускане %1 ca.Launch =Llança %1 cs.Launch =Spuštění %1 @@ -211,6 +213,7 @@ si.Launch =%1 දියත් කරන්න zh_TW.Launch =啓動 %1 ;====================================================================================================== en.CreateDesktopIcon =Create %1 &desktop icon +ar_SA.CreateDesktopIcon =إنشاء %1 &أيقونة سطح المكتب bg.CreateDesktopIcon =Създаване на %1 &икона на работния плот ca.CreateDesktopIcon =Crea una icona d'escriptori per a %1 cs.CreateDesktopIcon =Vytvořte %1 &ikonu pracovní plochy @@ -253,6 +256,7 @@ si.CreateDesktopIcon =%1 වැඩතල නිරූපකය සාදන් zh_TW.CreateDesktopIcon =建立 %1 和桌面圖示 ;====================================================================================================== en.InstallAdditionalComponents =Installing additional system components. Please wait... +ar_SA.InstallAdditionalComponents =جاري تثبيت مكونات نظام إضافية. الرجاء الانتظار... ca.InstallAdditionalComponents =Instal·lació de components de sistema addicionals. Si us plau, espereu... bg.InstallAdditionalComponents =Инсталиране на допълнителни системни компоненти. Моля, изчакайте... cs.InstallAdditionalComponents =Instalace dalších systémových komponent. Prosím, čekejte... @@ -295,6 +299,7 @@ si.InstallAdditionalComponents =අතිරේක පද්ධති සංර zh_TW.InstallAdditionalComponents =正在安裝附加系統元件,請稍候... ;====================================================================================================== en.AdditionalTasks =Tasks: +ar_SA.AdditionalTasks =المهام: bg.AdditionalTasks =Задачи: ca.AdditionalTasks =Tasques: cs.AdditionalTasks =Úkoly: @@ -337,6 +342,7 @@ si.AdditionalTasks =කාර්යන්: zh_TW.AdditionalTasks =工作: ;====================================================================================================== en.Uninstall =Uninstall +ar_SA.Uninstall =إزالة التثبيت bg.AdditionalTasks =Деинсталиране ca.AdditionalTasks =Desinstal·lar cs.Uninstall =Odinstalovat @@ -379,6 +385,7 @@ si.Uninstall =අස්ථාපනය zh_TW.Uninstall =解除安裝 ;====================================================================================================== en.WarningWrongArchitecture =You are trying to install the %1-bit application version over the %2-bit version installed. Please uninstall the previous version first or download the correct version for installation. +ar_SA.WarningWrongArchitecture =أنت تحاول تثبيت نسخة %1-bit من التطبيق على نسخة %2-bit المثبتة. فضلًا قم بإزالة النسخة السابقة أولًا أو قم بتحميل النسخة الصحيحة ليتم تثبيتها. bg.WarningWrongArchitecture =Опитвате се да инсталирате %1-битовата версия на приложението над инсталираната %2-битова версия. Моля, деинсталирайте първо предишната версия или изтеглете правилната версия за инсталиране. ca.WarningWrongArchitecture =Estau provant a instal·lar la versió de l'aplicació %1-bit amb la versió %2-bit instal·lada. Si us plau, desintaleu primer la versió anterior o descarregeu la versió correcta per a la instal·lació. cs.WarningWrongArchitecture =Pokoušíte se nainstalovat %1-bit verzi aplikace na nainstalovanou %2-bitovou verzi. Nejprve odinstalujte předchozí verzi nebo stáhněte správnou verzi pro instalaci. @@ -422,6 +429,7 @@ zh_TW.WarningWrongArchitecture =您正在嘗試安裝 %1-bit 應用程式版本 ;====================================================================================================== en.UpdateAppRunning=Setup has detected that %1 is currently running.%n%nIt'll be closed automatically. Click OK to continue, or Cancel to exit. +ar_SA.UpdateAppRunning=تم اكتشاف أن %1 قيد التشغيل.%n%nسيتم إغلاقه بشكل تلقائي. اضغط حسنًا للإكمال، أو إلغاء. bg.UpdateAppRunning=Настройката установи, че %1 в момента работи.%n%nТова ще бъде затворено автоматично. Щракнете върху OK, за да продължите, или Отказ, за да излезете. ca.UpdateAppRunning=La configuració ha detectat que actualment s'està executant %1.%n%n Es tancarà automàticament. Feu clic a D'acord per continuar o Cancel·la per sortir. cs.UpdateAppRunning=V rámci nastavení bylo zjištěno, že je aktuálně spuštěné 1%.%n%nBude automaticky zavřen. Chcete-li pokračovat, klikněte na tlačítko OK nebo Zrušit pro ukončení. @@ -464,6 +472,7 @@ si.UpdateAppRunning=%1 දැනට ධාවනය වන බව පිහි zh_TW.UpdateAppRunning=安裝程式偵測到 %1 正在執行中。%n%n將會自動關閉。 點擊 確認 繼續,或 取消 離開。 ;====================================================================================================== en.WarningClearAppData =Do you want to clear the user settings and application cached data? +ar_SA.WarningClearAppData =هل تريد مسح إعدادات المستخدم وبيانات التطبيق المؤقتة؟ bg.WarningClearAppData =Искате ли да изчистите потребителските настройки и кешираните данни на приложението? ca.WarningClearAppData =Voleu esborrar la configuració de l'usuari i les dades de la memòria cau de l'aplicació? cs.WarningClearAppData =Chcete zrušit uživatelské nastavení a údaje uložené v paměti? @@ -508,6 +517,7 @@ zh_TW.WarningClearAppData =您想要清除使用者設定和應用程式內的 ;en.AssociateDescription =Associate office document file types with %1 +;ar_SA.AssociateDescription =هل تريد ربط صيغة المستند بـ %1 ;bg.AssociateDescription =Свържете типовете файлове на офис документи с %1 ;it_IT.AssociateDescription =Associa i file documentodi Office con %1 ;cs.AssociateDescription =Asociovat typy souborů kancelářských dokumentů s %1 @@ -530,6 +540,7 @@ zh_TW.WarningClearAppData =您想要清除使用者設定和應用程式內的 ;zh_TW.AssociateDescription =與文書處理檔案類型聯結 %1 ;====================================================================================================== en.UpdateService =Update service for {#sAppName} +ar_SA.UpdateService =خدمة التحديث لـ {#sAppName} cs.UpdateService =Služba aktualizace {#sAppName} fi.UpdateService =Palvelu päivitystä varten {#sAppName} el.UpdateService =Υπηρεσία για ενημέρωση {#sAppName} diff --git a/win-linux/package/windows/uninstall_page.iss b/win-linux/package/windows/uninstall_page.iss index 206255041..c705bfb06 100644 --- a/win-linux/package/windows/uninstall_page.iss +++ b/win-linux/package/windows/uninstall_page.iss @@ -16,6 +16,7 @@ hy_AM.UninstallPageLabel=Ապատեղադրեք՝ ապատեղադրումը շ si.UninstallPageLabel=අස්ථාපනය සඳහා ඉදිරියට යාමට අස්ථාපනය ඔබන්න. zh_TW.UninstallPageLabel=按解除安裝以進行解除安裝。 da.UninstallPageLabel=Tryk Afinstaller for at fortsætte med afinstallationen. +ar_SA.UninstallPageLabel=اضغط إزالة التثبيت للاستمرار بذلك en.UninstallOptionClearData=Clear all user settings and application cached data @@ -34,6 +35,7 @@ hy_AM.UninstallOptionClearData=Մաքրել օգտատիրոջ բոլոր կար si.UninstallOptionClearData=සියළුම පරිශ්‍රීලක සැකසුම් හා යෙදුමේ නිහිතගත දත්ත මකන්න zh_TW.UninstallOptionClearData=清除所有使用者戶設定和應用程序暫存資料 da.UninstallOptionClearData=Slet alle brugerdata og applikationens cachede data +ar_SA.UninstallOptionClearData=مسح جميع بيانات المستخدم وبيانات التطبيق المؤقتة From 6d1c2c3f6111c855beb650bc26aa43d9fb2a6f4c Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Mon, 4 Dec 2023 18:32:11 +0300 Subject: [PATCH 015/316] added ar --- .../extras/update-daemon/res/langs/langs.iss | 18 ++++++++++++++++++ win-linux/package/windows/associate_page.iss | 6 +++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/win-linux/extras/update-daemon/res/langs/langs.iss b/win-linux/extras/update-daemon/res/langs/langs.iss index 6ddb24233..135217bde 100644 --- a/win-linux/extras/update-daemon/res/langs/langs.iss +++ b/win-linux/extras/update-daemon/res/langs/langs.iss @@ -1,54 +1,72 @@ en.CAPTION_TEXT =ONLYOFFICE Update Service ru.CAPTION_TEXT =Сервис обновлений ONLYOFFICE +ar_SA.CAPTION_TEXT =خدمة تحديث أونلي أوفيس en.MESSAGE_TEXT_ERR1 =An error occurred: ru.MESSAGE_TEXT_ERR1 =Произошла ошибка: +ar_SA.MESSAGE_TEXT_ERR1 =حصل خطأ: en.MESSAGE_TEXT_ERR2 =An error occurred while deleting: ru.MESSAGE_TEXT_ERR2 =Произошла ошибка при удалении: +ar_SA.MESSAGE_TEXT_ERR2 =حصل خطأ أثناء الحذف: en.MESSAGE_TEXT_ERR3 =An error occurred while creating: ru.MESSAGE_TEXT_ERR3 =Произошла ошибка при создании: +ar_SA.MESSAGE_TEXT_ERR3 =حصل خطأ أثناء الإنشاء: en.MESSAGE_TEXT_ERR4 =An error occurred while restarting the service! ru.MESSAGE_TEXT_ERR4 =Произошла ошибка при перезапуске сервиса! +ar_SA.MESSAGE_TEXT_ERR4 =حصل خطأ أثناء إعادة تشغيل الخدمة: en.MESSAGE_TEXT_ERR5 =Update cancelled. Can't find folder: ru.MESSAGE_TEXT_ERR5 =Обновление отменено. Не удалось найти папку: +ar_SA.MESSAGE_TEXT_ERR5 =تم الغاء التحديث. غير قادر على العثور على المجلد: en.MESSAGE_TEXT_ERR6 =Update cancelled. The file signature is missing: ru.MESSAGE_TEXT_ERR6 =Обновление отменено. Отсутствует подпись файла: +ar_SA.MESSAGE_TEXT_ERR6 =تم الغاء التحديث. توقيع الملف مفقود: en.MESSAGE_TEXT_ERR7 =Update cancelled. Can't delete folder: ru.MESSAGE_TEXT_ERR7 =Обновление отменено. Не удалось удалить папку: +ar_SA.MESSAGE_TEXT_ERR7 =تم الغاء التحديث. غير قادر على حذف المجلد: en.MESSAGE_TEXT_ERR8 =Update cancelled. The program is not closed: ru.MESSAGE_TEXT_ERR8 =Обновление отменено. Приложение не закрыто: +ar_SA.MESSAGE_TEXT_ERR8 =تم الغاء التحديث. البرنامج ليس مغلق: en.MESSAGE_TEXT_ERR9 =Update cancelled. Can't create folder: ru.MESSAGE_TEXT_ERR9 =Обновление отменено. Не удалось создать папку: +ar_SA.MESSAGE_TEXT_ERR9 =تم الغاء التحديث. غير قادر على إنشاء المجلد: en.MESSAGE_TEXT_ERR10 =Update cancelled. Can't replace files to backup: ru.MESSAGE_TEXT_ERR10 =Обновление отменено. Не удалось переместить файлы в резервную копию: +ar_SA.MESSAGE_TEXT_ERR10 =تم الغاء التحديث. غير قادر على استبدال الملفات إلى النسخة احتياطية: en.MESSAGE_TEXT_ERR11 =Can't restore files from backup! ru.MESSAGE_TEXT_ERR11 =Не удалось восстановить файлы из резервной копии! +ar_SA.MESSAGE_TEXT_ERR11 =غير قادر على استرجاع الملفات من النسخة الاحتياطية! en.MESSAGE_TEXT_ERR12 =Update cancelled. Can't move updates to App path: ru.MESSAGE_TEXT_ERR12 =Обновление отменено. Не удалось переместить обновления в папку приложения: +ar_SA.MESSAGE_TEXT_ERR12 =تم الغاء التحديث. غير قادر على نقل التحديثات إلى مسار البرنامج: en.MESSAGE_TEXT_ERR13 =An error occurred while remove App path: ru.MESSAGE_TEXT_ERR13 =Произошла ошибка при удалении папки приложения: +ar_SA.MESSAGE_TEXT_ERR13 =حصل خطأ أثاء إزالة مسار البرنامج: en.MESSAGE_TEXT_ERR14 =An error occurred while restore files from backup: ru.MESSAGE_TEXT_ERR14 =Произошла ошибка при восстановлении файлов из резервной копии: +ar_SA.MESSAGE_TEXT_ERR14 =حصل خطأ أثناء استرجاع الملفات من النسخة الاحتياطية: en.MESSAGE_TEXT_ERR15 =An error occurred while restarting the program! ru.MESSAGE_TEXT_ERR15 =Произошла ошибка при перезапуске приложения! +ar_SA.MESSAGE_TEXT_ERR15 =حصل خطأ أثناء إعادة تشغيل البرنامج! en.MESSAGE_TEXT_ERR16 =SDL init error: ru.MESSAGE_TEXT_ERR16 =Ошибка инициализации SDL: +ar_SA.MESSAGE_TEXT_ERR16 =خطأ من SDL init: en.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher returned error: ru.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher вернул ошибку: +ar_SA.MESSAGE_TEXT_ERR17 =خطأ من ServiceCtrlDispatcher: \ No newline at end of file diff --git a/win-linux/package/windows/associate_page.iss b/win-linux/package/windows/associate_page.iss index b0ccda1ba..4b7129622 100644 --- a/win-linux/package/windows/associate_page.iss +++ b/win-linux/package/windows/associate_page.iss @@ -1210,18 +1210,22 @@ si.extOFORM =ඔන්ලිඔෆිස් පුරවන මාර්ගග zh_TW.extOFORM =ONLYOFFICE可填写的在线表格 en.extPOT =PowerPoint Template +ar_SA.extPOT =قالب بوربوينت en.extPPTM =PowerPoint Open XML Macro-Enabled Presentation +ar_SA.extPPTM =عرض بوربوينت مع خاصية الماكرو en.extEPUB =Open eBook File +ar_SA.extEPUB =كتاب النشر الإلكتروني en.extFB2 =FictionBook 2.0 File ar_SA.extFB2 =ملف فكشنبوك 2.0 en.extDOTX =Word Open XML Document Template -ar_SA.extDOTX =قالب وور +ar_SA.extDOTX =قالب وورد en.extOXPS =Open XML Paper Specification +ar_SA.extOXPS =مستند أوبن إكس بي إس ;====================================================================================================== From 57fcffc330227811035ce1a7421b13ff052ab1f6 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Tue, 5 Dec 2023 11:25:55 +0300 Subject: [PATCH 016/316] [win-nix] fix translations for Arabic --- common/loginpage/locale/ar-SA.js | 2 +- common/loginpage/src/index.html | 1 + .../Code/Controllers/Common/ASCLinguist.m | 3 +- win-linux/defaults.pri | 3 +- win-linux/langs/ar_SA.qm | Bin 0 -> 18100 bytes win-linux/langs/ar_SA.ts | 268 ++++++++++++------ win-linux/resources.qrc | 1 + win-linux/src/clangater.cpp | 1 + 8 files changed, 183 insertions(+), 96 deletions(-) create mode 100644 win-linux/langs/ar_SA.qm diff --git a/common/loginpage/locale/ar-SA.js b/common/loginpage/locale/ar-SA.js index c2eb2b8df..403460e5f 100644 --- a/common/loginpage/locale/ar-SA.js +++ b/common/loginpage/locale/ar-SA.js @@ -1,4 +1,4 @@ -l10n.ar-SA = { +l10n.ar_SA = { welWelcome: 'مرحبًا بك في محرر أونلي أوفس لسطح المكتب!', welDescr: 'اعمل على مستنداتك بدون اتصال أو اتصل لسحابتك: أونلي أوفس, ownCloud, Nextcloud.', btnConnect: 'اتصل الآن', diff --git a/common/loginpage/src/index.html b/common/loginpage/src/index.html index f2e876345..d52299efd 100644 --- a/common/loginpage/src/index.html +++ b/common/loginpage/src/index.html @@ -175,6 +175,7 @@

Create new

+ diff --git a/macos/ONLYOFFICE/Code/Controllers/Common/ASCLinguist.m b/macos/ONLYOFFICE/Code/Controllers/Common/ASCLinguist.m index 5ce9ea189..f6277d125 100644 --- a/macos/ONLYOFFICE/Code/Controllers/Common/ASCLinguist.m +++ b/macos/ONLYOFFICE/Code/Controllers/Common/ASCLinguist.m @@ -109,7 +109,8 @@ + (NSDictionary *)availableLanguages { @"uk-UA": @"Украї́нська мо́ва", @"lo-LA": @"ພາສາລາວ", @"gl-ES": @"Galego", - @"si-LK": @"සිංහල" + @"si-LK": @"සිංහල", + @"ar-SA": @"اَلْعَرَبِيَّة" }; } diff --git a/win-linux/defaults.pri b/win-linux/defaults.pri index dd276435c..f4c0ec757 100644 --- a/win-linux/defaults.pri +++ b/win-linux/defaults.pri @@ -47,7 +47,8 @@ TRANSLATIONS = ./langs/en.ts \ ./langs/vi.ts \ ./langs/be.ts \ ./langs/zh_TW.ts \ - ./langs/si.ts + ./langs/si.ts \ + ./langs/ar_SA.ts CORE_ROOT_DIR = $$PWD/../../core diff --git a/win-linux/langs/ar_SA.qm b/win-linux/langs/ar_SA.qm new file mode 100644 index 0000000000000000000000000000000000000000..d43590e450e45a3d2543d3aaf96cf8424d27eb5f GIT binary patch literal 18100 zcmd^G3ve9eeg9-xtCw|><(F)1c`f;@^I4WGS$;@1#wXp$val`Lk{=|)<8-%@&OY5< z?_tT1rXd5JWI~%Xgbo=XflMedB|u0>0+f~{Fc2CVO3S2ahlVnxLrV)2+LUA_#r^%i zZ};18b+;$QOlCUM@mQOaG7K6X96e^Fdp{*&GR&`%j#^|$P~FaLtE?N^jF-t!H{c0N+p z`O=pd+kHjZk&0Hv+RMwX$#pT-_JgwN$Cop<@B3xH`^=k+t<=kI`|nQ1HlHZF_~u&1 zmgmbZzW+XBTW&9Vqv{F9YNJbfzy5o;KDuP0^LvbS{mYVMX9V;gSn}mh{1^D@FK18P z34%|Smu<~67T8$ccnq}^jbgoT>jS5+v?XaR#v(6 z&clDkSmnpWb=%A0y8nra%1hvP+3|{P_gsX$eo`?|_g&EUa7E;ncOZwCDsn%oW~||t z6%QT!XTUKk9{cP@z9bl~aBicvHRx!5!O>N@mDbW3%mPqZy-yhIY-v?j%M(xgjyN)sKQSF$l^&E>O9*6>sn?cn9{froHNan(oE@_o{nfOKjO& z)nmW*F?Qvd>f3UE!`S+tR^Rch`(am~5!WkMR6qVS^svgP{>zhX;QyBDw^pBky{xJJ zpyG3k`J*+E)UyU%_>KtmgG6df`WVYxh3|x(>!_BNG*jZS1Ta zT(=eUeqLPrPSqYsRzt4$*G@G*2z`{-PMP4l@4njXYw)@9AJ+cKo%s8b`)i-Q9(J}d zwQNNhsE$;41K>Xu6w^$*YvsfVCQS<^lw~({XSH8@!6Xh+j>*o`+o|* z-Rt)?Re53bCLoJU%pTF`Yp8q27O!#hDVlYS+zxwI=`uqM0ezKx|%dcT~ z?bp`d^ViE63-;H4=aq8ku`+>R_67XLnzWtTsMe1EVdiIDtb@(5B+Ih7Dl$h6|7-hA z^PIn{V=kGUtHk|=flxLUN~e>FSTvU~Q%9qz=#-H;or$K?My5;vjR0&=8`L^2pmAoh zm;$suY{v34Mk)uuaWl49z$>+0txMZ&0Zp?s%PBxtjAo21U~;kmIGxTd7I3pRr0v#v znXdV@u-31&X`AqS8-C{qr7(OJ3L~SRN*J??l*c*Eb(`GFKTEd_+0$4!{Qjc~Bcb(c+31`KCk;x?{NjZidHgeHKGD{#= z4}=rZq&cO0d^j~}a@aN6cIazRyIO0LaF&c*O^>ZF{#ak%;Z$ytKfIZXNfH9W`m|xK z3)ct;>*WMHxrzMGIM%1pH7>ZoDnC4J`3SU+DMIMlNO2ra30aNa-dxRN#IF4 z4%$9R`6?AfI-1SSnwfZ?7witL6=ZgB2hgm#Af`y$#^r@-vkO%O$lA2Q z`HV;etBWDXO?v_Fa{({LM?@pLYlGzp*##lJ5UEO{Y!oQZ85i`0cxiW`Q$b6xK(h;m zHLPuy2-XM$=cCC)Tu)~b=gCNc&WouIDBXi-KrgT}iD%{2U}3S=wWFxky%9T>R!3-T zNqJgWBWHo6E~BC(w2sVNS6#oD{Wn2t9nf8Y)k`>yV@A@5ND^)J17UMEl{BMqB@GPm+^54BA|NgZ zEp)=e!rCF|Nk=ju4Zu+FH`2{^=xi^pq}?F*7q~m_g4#xjvBlq|Pe-%*gaJ#8O-EBx zM!Z8Gi=H>EyX;j&P2E5wp2(S*(}`5voaJG;9a!46z&t$C$np19glb_iPNLgrTf07! z&*p$u&jME*!pdZG$qQU9MUagyh%5|Lei%39$FO3yst_b`iU4{&2+Emy%uMAHsl36B zl#3)cZRl~UcJY!+Ksr3heGue?v>iNo(R~-ZY8dHuSV`IqJPgdh?)6zNUk{0|gHHwk zuUA5o3`u>WL`kG_u9#9poR2|NJGdve@lq`Uy1IB-LGZ)Uassfa9k4E8L%TqAAIBZS z^OU=gXspj7_^cbxQfWfP-)`L71rL0gvof(BM!;#gk*P zo5su;Xd#-5LR!hBo;0&LuAu=-U0#Z52V+D^5N3%Wh2L6vO|}Qb1uUTw8OV`}ayE`n z8yQ27;(yAdtVK~Ot4GhHw2Dq74bs(0mv=w|l-anGtg{@}3RWz@f)Ih9bu*_Z^1%fM z5tQ^mu*2WIl>jyl&>uv}rk2*j5*)EG#F-!)2%u=C$m~RGAzddH2x$foFGv%I6nX9d z`e-s^MB^89V=j@+Ww|uNrhdW9>$6c<6MP|Kq?6H@p(k=&yj}!0C?>IsDm7`CH6iHg z@C=#-UXXeLaN87uFX)ARSb_^GVyh>B6l1d_xL`@SZBfYLst{1QEQ-~sD+snMOa+!w zdTD_DibO$72en~^?R-38atNgWbVGr|Jg8Hq>C%qlp6Xo+CT%FB!gOZ|A%+I+ydsE( zfw5E4fMVJ63rIr741n(f8hEY*9cO0&IY)=`6 z;3>vY78`^DASM1g70vTmm}8R)8%>0FP$IS%nVVdI73w<$2~viVmE|%^<%}74Vvffh zFDKd$bEh~)$(djdqSm*oM?dcAQ|hAz71bMPr}HTF9Bnj4Mo;!j)f?&jL`eo3DX0P{ zWdusZJGHPR-xrxfS)-peGv_8SPbj4dD*A;hg#e@nGzI{405;Q&@U}zR&Ln76qiDlm zf43xda-wt`rFK#v30oPBk^<#7yP_P_c3HwB2i&6dOT^QdI?P~7q6lhe{OA#hdpb9h zEGeiSAR@mI{@p=@0I}oWXQ7EHprcGdzZ@p5|eZ@m6*g$|4f>0CT7wlnL-h4DRBt$BU_K4ap^|vgxgxNa)yz* z98wyN4vkAq%}nP?B5+JG0)+*51mMO9bWTp1!EkE=vT%?z9v$gF>|ik`5+%_bLG3|f zEsFMJ7xZ%&b`KQbh>9p`$H+LzV#uGV#vLFJmVAm~*o;C%;Ak|KF}E8jDpKOQIvkUv zVMI1llC&P=2RkS^-n{@(((7B?BxKW6WMroe0~N(0qFB3>3xY4CA|_}QjzdZSHd!2| z=Lo-HBs?k^G~=aBs6&Za3n9t6k&G!wvI_{&wo?QZZbS>AQZ07nNO;_pO3Zj^tBpfr zl!9Te_>D3c=`g_KGBrumH3oQZ@0r_V&TAt>ltyO4`%TOOR5NQD85}ur)J@=|nJH~n zzu8R0E6W8H=u!(G|6UawPY@pzbwWakprYJ*bZ9?Rf`Li%m2m~Vf|Fn7rI_4 zgqvIl#}sc{3_glJRN`QufS-O!gjNhq!^70_reQQZD2+cIFJ0E`E(D7%mI9pJIkv(F z@w*4Iffb9g; z=V}cyD4|>d;KaBS05ZAK0pNh*l9YbBkeuigi;@#nIHH~jqH1f$Si;dP^|)%?yL{}F z;-uO0rJb}v8DUX6j7U*e@p%A5YN*Hz4ynWD2#*NHk4Zta&tkkR+ zz)Ce-FD4r`@yewQqNF%#1B6H=k;@d2CAp=uMbQjd>bF8MIjvfWG>o5dB1Uembi`-^ zP-_riDVhUU?9(@H%;n@XwIqeq=2Mp>EM`8S8V-n0f=a2PQL;(x7J1;1lvT~CMBG?- zO49&a4$*WFBBvA+BsZwydx$a$^HZn``5sNs_cS2*s znIlf+ibMU9L2+|YM4~aY76p{3+X&E3Sf_=7lEC*m76NfnSs&olDxVz)o5oMSQtHp4 z(05hgXGRrX(xrKM)Eb@IDVkb3F+!!I6NF^^L|eyaaDF5Mey)zc1u1&q6Q}ngOI(Ie z2JsXfy>R03b2~=mA$}BNADJEE&gl$c{d`2uXL*3{3?U+%arz4t4it{J&KuCiO(UCX z%UJ{3O>}B@!k95}O2c#9WX7D)>2M;6`7IyN)(#xSd4h6WbIjsjaOgfd@}gHgJMlU| z>csdMXRR}49BT(SJ0jBN&5q9*M%s0nR6yKs?<}bR)&JF#qyj=)U=HHAVkf*KEHW}o zgVG2;Uscve8p0-7M>Km*=jW&V7_9(eklIgc-ldwK;}V4%8|wzChN6xxnscvf6vvSS zr4(B+umjZt+BWMLmHJSb5%}+PvOmNZVQlmBgEsI?vo`J?>e(4BzZ~W;sXf`wKX=ZA z_8m2GK9j@orEaF2BRVon6Ahm@9>PHpeaEm4+4N}Y!ffEDXOfkhq z5f#tWic>7v$(f+U?F8q_vBXqLKbfZBUjXX2cYIZViV{^9Dj*txQuR%d(#dtcBZ-)i z%3`RLPg&(py%KE>V?NE#zLv2q;GPDo>JfM47UzuHH^5ITM>FOWcDJ(DwvV$d6$IWx zkWe@15C&_N6f*Cwk}W(`jgB`R#R1(E$*&mfe!#Ogu{@7bSs$>;JTDL2XbggLJBhi~ zjTv155cgrRVam`E63t27-|a<5vqA^)<fuO_JITAw6qk&O>p!k;#}De&%n+V);zQh;I^fo=oFV)vy-&xGwff*sXA6a!1;W z!(1LecSEmxEPQtTD0D=h3~75L?)Fg1Ldp@sZf2(`sN_@WXzU!g<4zgP#HJJHdHv)Y zC?q8Xcfm0j5ZdgjBoSgP)ggUS>~PX4{f(m0Hjp0VinT=}3`%~^p9J$S^gNeYwhvBA!qdkrA=6^pqzV7E=qtK(RLI@V!@9zNu%C2+_yt3RP=Yjpj2Z%uxNJ3z{nv_W|EW(Fm}sb@YKi+ zMNO;F+NIH4wmv+KDxbPBk^T_cSYW59m}AjO)gqindh_xDZuqDOY&yN7$L@Jij^tL_ zLEX`B4aY?0sUVY)urNfd=bQ{8vv%+dOMHn!LCvxC0~GTx!#R&N4lFQxQIGW)JnsPw zhKam{pY)wpVCmGhNeOM3hk-0FpQa@W3K3rT*6{#ForXOam3Af}*V`*$mgv1;g%!yY z6cwtQBPu4T8Ae4SG97w<+D`E+eI0sIv4}>hNEx%XSddsb!lYJV8<2MhJ(;Mvn0&hu53M(6neRKt$);j)e_sBM2SGH99ZG zV!M>!nj=wcor&0ueRZm95z+l!UXr8=#I6|TS0hqCIH$!wiGvo=MIBZAJZLd=TI(;CX?o@>c^XO z>{ZzhrJ~sA%1)d4WE>lTeYzL7V#jX~Jc>$$c$8Y;J-M@(N{h%`mY`UCkE*O;tzXi; zahxVTsYG^K=n2-=jy)$XZym2Qcu_IQ;gY>kx8BJu&u&j_ib}^hsxaxBP6BjVFd7pd z*FuUt1y1raTnZp+(Se%d#1SssxB)iMdV3Mv4_D~n-bcbxgMk#DRU6GOBzqvT0axzb zVih{r0_Dr8`Xu(?jCdacLk^qv=R~FFnPbNnNy;F;w?oc{DHhXtw>^XD1v}J9(JG}{ z7Z_qnOR02NkMdh7zIS-Zj7oBPi@;2!u)d9C zw1D)^ERsOmnhNbx?MBH0MHqJagbpuK^NtPT6d#o?&7C~eeEAkk=GyHnmT~qk3>SGPfD;S@$K_d^PMJ8L z5*gO%_U)cQ#i$3YvIIHFGp~yMSd|@0Qiph(ECTyB9_pO4fOQUYV$l<^B#}a-OY&Xw zVm$u7Oy0uG-6gt%oMIWRp^Jrdu}e!$SO@peE?(G+>8YQ82lWOdVJ}z7*G0G|lU``w zg*4X6+dU_%_E{|0B|UFr`}CRkE-Y%!IGF}>s@OE|D9ua)hk((fXIyNWSKdjcq*3@R zqzlxFVm2z?7oce|jkPFG5+4#M?t)5CXcC}dZG5xXN|7a+aqMARF`W7#T6ePJkAlP! zUJE#Lrej-9^UO-?yvf8l%)n5I+TlAd`qq>=%Lie_Ea89$;-Zy{ML>|xG>~l-GFl4B zP_ivDnKudl&xZGv$44g4A|vo2%n@!zw4G?5_=rg;8JAr}i{HugXhuo}nyxod;j6F3 zJq`0hczU;De$Am+3?nzP1%86i=I?5wMkS7_+cH8I6;*)Hi^9YyO{+pkS+wX*Wryp# zA8v=+1!`DEA$8oNPDj+4Dv3dvtD>l(ms+jyvUKV$uknH1a?p&JUP+85`{*=7bO$c7 z4i+U#Y}bom7sSko%1tWCi7c-$(BValC_}9vZ8Z{Ep6OhaTvwD5djpJb`&$%nTj4>7 zLiTSu2OBC)r+7Vp_v)w%7Mh2-IA{b-J&=#Rpp4ihRaM!azn~v8`J1+`hZY!g%=@ko z2i!mcuCiYiDKOs4?ZaItKf-lh!aKQP+HD!_f(-B@KyKK|k)mD5DTkGkg>C#~20eHz znxYm9uTqf#qn*WQ#(iGMGoXt=F)LAxlp1uJ&!}$!*Bur$f=&zPe9yrJghb_G<&sLD z4MHTE0&y>eZ?ws8FF9rwe4_?rdAy$NqGmN9(E%z|kehg`K=WK@3|)N!+ow1lO7izj zU5~B@0_!z+?YMMU68^AaGj%8MG9kUF2x*I#SX@Aw(6CUG!k6las{(P>h$Xoy$< literal 0 HcmV?d00001 diff --git a/win-linux/langs/ar_SA.ts b/win-linux/langs/ar_SA.ts index f9e159c1c..72b816802 100644 --- a/win-linux/langs/ar_SA.ts +++ b/win-linux/langs/ar_SA.ts @@ -4,7 +4,7 @@ CAscApplicationManagerWrapper - + Presenter View وضع إلقاء العرض @@ -17,18 +17,18 @@ كل نوافذ التعديل ستغلق. هل تريد الاستمرار؟
- - + + Document%1.docx مستند%1.docx - + Book%1.xlsx سِجِل%1.xlsx - + Presentation%1.pptx عرض%1.pptx @@ -36,8 +36,8 @@ CAscTabWidget - - + + Document جاري الفتح... @@ -132,40 +132,76 @@ CDownloadWidget - + + Downloads + + + + + Clear + + + + Cancel إلغاء + + + + kBps + + + + + Canceled + + + + + Open + + + + + Can't open file: + + + + + Show in folder + + CEditorWindow - + Open main window فتح النافذة الرئيسية - + Document must be saved to continue.<br>Save the document? يجب حفظ المستند للإكمال.<br>حفظ المستند؟ - + Print Document طباعة المستند - + Document must be saved firstly. يجب حفظ المستند أولًا. - + %1 has been changed. Save changes? %1 تم تعديله. هل تريد حفظ التغييرات؟ - + Some data will lost.<br>Continue? إذا استمررت بالحفظ بهذه الصيغة فإن كل الميزات ستضيع إلا النص.<br>هل أنت متأكد بالاستمرار؟ @@ -173,10 +209,15 @@ CEditorWindowPrivate - + There are no printers available لا توجد أي طابعة متاحة + + + There are no pages set to print. + + CFileDialogWrapper @@ -401,22 +442,22 @@
- - + + Text documents مستندات نصية - - + + Spreadsheets جداول بيانات - - + + Presentations عروض تقديمية @@ -432,8 +473,8 @@
- - + + All supported files كل الملفات المدعومة @@ -456,40 +497,45 @@ قالب مستند
- + + Theme file + + + + Open Document فتح مستند - - + + All Images كل الصور - - + + Jpeg (*.jpeg *.jpg);;Png (*.png);;Gif (*.gif);;Bmp (*.bmp) Jpeg (*.jpeg *.jpg);;Png (*.png);;Gif (*.gif);;Bmp (*.bmp) - - + + Plugin file (*.plugin) ملف إضافة (*.plugin) - + Video file ملف فيديو - + Audio file ملف صوتي - + Select Folder اختر المجلد @@ -497,53 +543,58 @@ CMainWindow - + More than one document is open.<br>Close the window anyway? لديك أكثر من مستند مفتوح.<br>إغلاق النافذة على أي حال؟ - + Don't ask again. لا تسألني مجددًا. - - + + File format not supported. صيغة الملف غير مدعومة - + %1 doesn't exists!<br>Remove file from the list? %1 غير موجود. قد يتم إعادة تسمية الملف، نقله أو حذفه.<br>هل تريد إزالة الملف من القائمة؟ - + Document must be saved firstly. يجب حفظ المستند أولًا. - + Document must be saved to continue.<br>Save the document? يجب حفظ المستند للإكمال.<br>حفظ المستند؟ - + There are no printers available لا توجد أي طابعة متاحة - + Print Document طباعة المستند - + + There are no pages set to print. + + + + Sign Up إنشاء بوابة سحابية - + %1 is modified.<br>Do you want to keep changes? %1 تم تعديله.<br>هل تريد حفظ التغييرات؟ @@ -582,169 +633,169 @@ CUpdateManager - + Check for updates التحقق من التحديثات - + Unable to check update: URL not defined. غير قادر على التحقق من التحديثات: الرابط غير معرّف. - + To finish updating, restart app لإنهاء التحديث، أعِد تشغيل التطبيق - + Restart إعادة تشغيل - + Checking for updates... جاري التحقق من التحديثات... - + Updates are not allowed! غير مسموح بالتحديثات! - + This folder configuration does not allow for updates! The folder name should be: إعدادات هذا المجلد لا تسمح للتحديثات! ينبغي تسمية المجلد بـ: - + An error occurred while check updates: Update Service not found! حصل خطأ أثناء التحقق من التحديثات: خدمة التحديث مفقودة! - + Downloading new version %1 (%2%) جاري تحميل النسخة الجديدة %1 (%2%) - + An error occurred while loading updates: Update Service not found! حصل خطأ أثناء فتح التحديثات: خدمة التحديث مفقودة! - + Cancel إلغاء - + An error occurred while loading updates: package Url is empty! حصل خطأ أثناء فتح التحديثات: رابط حزمة البرامج فارغة! - + Update package error: md5 sum does not match the original. خطأ في حزمة التحديث: عدم تطابق خوارزمية إم دي 5 التشفيرية مع الأصل. - + Preparing update... جاري تجهيز التحديث... - + An error occurred while unzip updates: Update Service not found! خطأ أثناء فك ضغط التحديثات: خدمة التحديث مفقودة! - + Update is available (version %1) هنالك تحديث متوفر (version %1) - + Download update تحميل التحديث - + Current version is up to date النسخة الحالية هي الأحدث - + An error occured while unpacking the archive خطأ أثناء فك ضغط الملف المضغوط - + Update download failed: out of memory! فشل تحميل التحديث: نفذت الذاكرة العشوائية! - + Update download failed: server connection error! فشل تحميل التحديث: خطأ في اتصال الخادم! - + Update download failed: wrong URL! فشل تحميل التحديث: خطأ في الرابط! - + Update download failed: unable to create file! فشل تحميل التحديث: غير قادر على إنشاء الملف! - + Update download failed: network error! فشل تحميل التحديث: خطأ في الشبكة! - + A service error has occurred! خطأ في الخدمة! - + Last check performed %1 آخر تحقق نُفّذ %1 - + Error opening JSON file. خطأ خلال فتح ملف جسون. - + Update is available هنالك تحديث متوفر - - + + Current version النسخة الحالية - - + + Update version نسخة التحديث - + Would you like to download update now? هل ترغب في التحديث الآن؟ - + Update is ready to install التحديث جاهز للتثبيت - + Would you like to restart app now? هل ترغب في إعادة تشغيل التطبيق؟ @@ -773,8 +824,8 @@ ملف لغة التوصيف القابلة للتوسعة (*.xml)
- - + + Access to file '%1' is denied! الوصول إلى الملف المسمى بـ ‘%1’ مرفوض! @@ -838,58 +889,58 @@ سِجِلّ التغيير
- + An error occurred while start install updates! خطأ أثناء بداية تثبيت التحديثات! - + An error occurred while start replacing files: Update Service not found! خطأ أثناء استبدال الملفات: خدمة التحديث مفقودة! - + Cancel إلغاء - + Yes نعم - + No لا - - + + OK حسنًا - + Skip تخطي - + Buy Now اشتر الآن - + Activate فعّل - + Continue استمر - + An error occurred while opening the portal:<br>%1 خطأ أثناء فتح البوابة السحابية:%1<br> @@ -897,5 +948,36 @@ App can't working correctly under admin rights. App can't work correctly under admin rights.
+ + + B + + + + + kB + + + + + MB + + + + + The syntaxis for the page range is invalid.<br>Enter one or more page ranges, for example: 1-3,7,11. + + + + + + Specified range %1-%2 exceeds document limits: maximum number of pages is %3 + + + + + Unable to open print dialog:<br>%1 + +
diff --git a/win-linux/resources.qrc b/win-linux/resources.qrc index c8366e84b..88310e7aa 100644 --- a/win-linux/resources.qrc +++ b/win-linux/resources.qrc @@ -177,6 +177,7 @@ res/styles/styles@5x.qss + langs/ar_SA.qm langs/be.qm langs/bg.qm langs/ca.qm diff --git a/win-linux/src/clangater.cpp b/win-linux/src/clangater.cpp index f08353ef8..df22f9122 100644 --- a/win-linux/src/clangater.cpp +++ b/win-linux/src/clangater.cpp @@ -151,6 +151,7 @@ class CLangater::CLangaterIntf ,{"lo-LA", "ພາສາລາວ"} ,{"gl-ES", "Galego"} ,{"si-LK", "සිංහල"} + ,{"ar-SA", "اَلْعَرَبِيَّة"} }; }; From 815b3ff16f61428022fc5653f564268ac3537472 Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Tue, 5 Dec 2023 13:45:44 +0300 Subject: [PATCH 017/316] added fr, it, de, es --- .../extras/update-daemon/res/langs/langs.iss | 74 ++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/win-linux/extras/update-daemon/res/langs/langs.iss b/win-linux/extras/update-daemon/res/langs/langs.iss index 135217bde..af48ba9f3 100644 --- a/win-linux/extras/update-daemon/res/langs/langs.iss +++ b/win-linux/extras/update-daemon/res/langs/langs.iss @@ -2,71 +2,143 @@ en.CAPTION_TEXT =ONLYOFFICE Update Service ru.CAPTION_TEXT =Сервис обновлений ONLYOFFICE ar_SA.CAPTION_TEXT =خدمة تحديث أونلي أوفيس +de.CAPTION_TEXT =Aktualisierungsdienst von ONLYOFFICE +es.CAPTION_TEXT =Servicio de actualización de ONLYOFFICE +fr.CAPTION_TEXT =Service de mise à jour ONLYOFFICE +it.CAPTION_TEXT =Servizio di aggiornamento ONLYOFFICE en.MESSAGE_TEXT_ERR1 =An error occurred: ru.MESSAGE_TEXT_ERR1 =Произошла ошибка: ar_SA.MESSAGE_TEXT_ERR1 =حصل خطأ: +de.MESSAGE_TEXT_ERR1 =Ein Fehler ist aufgetreten: +es.MESSAGE_TEXT_ERR1 =Se ha producido un error: +fr.MESSAGE_TEXT_ERR1 =Une erreur s'est produite : +it.MESSAGE_TEXT_ERR1 =Si è verificato un errore: en.MESSAGE_TEXT_ERR2 =An error occurred while deleting: ru.MESSAGE_TEXT_ERR2 =Произошла ошибка при удалении: ar_SA.MESSAGE_TEXT_ERR2 =حصل خطأ أثناء الحذف: +de.MESSAGE_TEXT_ERR2 =Beim Löschvorgang ist ein Fehler aufgetreten: +es.MESSAGE_TEXT_ERR2 =Se ha producido un error al eliminar: +fr.MESSAGE_TEXT_ERR2 =Une erreur s'est produite lors de la suppression : +it.MESSAGE_TEXT_ERR2 =Si è verificato un errore durante l'eliminazione: en.MESSAGE_TEXT_ERR3 =An error occurred while creating: ru.MESSAGE_TEXT_ERR3 =Произошла ошибка при создании: ar_SA.MESSAGE_TEXT_ERR3 =حصل خطأ أثناء الإنشاء: +de.MESSAGE_TEXT_ERR3 =Beim Erstellen ist ein Fehler aufgetreten: +es.MESSAGE_TEXT_ERR3 =Se ha producido un error al crear: +fr.MESSAGE_TEXT_ERR3 =Une erreur s'est produite lors de la création : +it.MESSAGE_TEXT_ERR3 =Si è verificato un errore durante la creazione: en.MESSAGE_TEXT_ERR4 =An error occurred while restarting the service! ru.MESSAGE_TEXT_ERR4 =Произошла ошибка при перезапуске сервиса! ar_SA.MESSAGE_TEXT_ERR4 =حصل خطأ أثناء إعادة تشغيل الخدمة: +de.MESSAGE_TEXT_ERR4 =Beim Neustart des Dienstes ist ein Fehler aufgetreten! +es.MESSAGE_TEXT_ERR4 =¡Se ha producido un error al reiniciar el servicio! +fr.MESSAGE_TEXT_ERR4 =Une erreur s'est produite lors du redémarrage du service ! +it.MESSAGE_TEXT_ERR4 =Si è verificato un errore durante il riavvio del servizio! en.MESSAGE_TEXT_ERR5 =Update cancelled. Can't find folder: ru.MESSAGE_TEXT_ERR5 =Обновление отменено. Не удалось найти папку: ar_SA.MESSAGE_TEXT_ERR5 =تم الغاء التحديث. غير قادر على العثور على المجلد: +de.MESSAGE_TEXT_ERR5 =Update abgebrochen. Ordner kann nicht gefunden werden: +es.MESSAGE_TEXT_ERR5 =Actualización cancelada. No se puede encontrar la carpeta: +fr.MESSAGE_TEXT_ERR5 =Mise à jour annulée. Impossible de trouver le dossier : +it.MESSAGE_TEXT_ERR5 =Aggiornamento annullato. Impossibile trovare la cartella: en.MESSAGE_TEXT_ERR6 =Update cancelled. The file signature is missing: ru.MESSAGE_TEXT_ERR6 =Обновление отменено. Отсутствует подпись файла: ar_SA.MESSAGE_TEXT_ERR6 =تم الغاء التحديث. توقيع الملف مفقود: +de.MESSAGE_TEXT_ERR6 =Update abgebrochen. Die Dateisignatur fehlt: +es.MESSAGE_TEXT_ERR6 =Actualización cancelada. No hay firma del archivo: +fr.MESSAGE_TEXT_ERR6 =Mise à jour annulée. La signature du fichier est manquante : +it.MESSAGE_TEXT_ERR6 =Aggiornamento annullato. Manca la firma del file: en.MESSAGE_TEXT_ERR7 =Update cancelled. Can't delete folder: ru.MESSAGE_TEXT_ERR7 =Обновление отменено. Не удалось удалить папку: ar_SA.MESSAGE_TEXT_ERR7 =تم الغاء التحديث. غير قادر على حذف المجلد: +de.MESSAGE_TEXT_ERR7 =Update abgebrochen. Ordner kann nicht gelöscht werden: +es.MESSAGE_TEXT_ERR7 =Actualización cancelada. No se puede eliminar la carpeta: +fr.MESSAGE_TEXT_ERR7 =Mise à jour annulée. Impossible de supprimer le dossier : +it.MESSAGE_TEXT_ERR7 =Aggiornamento annullato. Impossibile eliminare la cartella: en.MESSAGE_TEXT_ERR8 =Update cancelled. The program is not closed: ru.MESSAGE_TEXT_ERR8 =Обновление отменено. Приложение не закрыто: ar_SA.MESSAGE_TEXT_ERR8 =تم الغاء التحديث. البرنامج ليس مغلق: +de.MESSAGE_TEXT_ERR8 =Update abgebrochen. Die App ist nicht geschlossen: +es.MESSAGE_TEXT_ERR8 =Actualización cancelada. El programa no está cerrado: +fr.MESSAGE_TEXT_ERR8 =Mise à jour annulée. L'application n'est pas fermée : +it.MESSAGE_TEXT_ERR8 =Aggiornamento annullato. Il programma non è chiuso: en.MESSAGE_TEXT_ERR9 =Update cancelled. Can't create folder: ru.MESSAGE_TEXT_ERR9 =Обновление отменено. Не удалось создать папку: ar_SA.MESSAGE_TEXT_ERR9 =تم الغاء التحديث. غير قادر على إنشاء المجلد: +de.MESSAGE_TEXT_ERR9 =Update abgebrochen. Ordner kann nicht erstellt werden: +es.MESSAGE_TEXT_ERR9 =Actualización cancelada. No se puede crear la carpeta: +fr.MESSAGE_TEXT_ERR9 =Mise à jour annulée. Impossible de créer un dossier : +it.MESSAGE_TEXT_ERR9 =Aggiornamento annullato. Impossibile creare la cartella: en.MESSAGE_TEXT_ERR10 =Update cancelled. Can't replace files to backup: ru.MESSAGE_TEXT_ERR10 =Обновление отменено. Не удалось переместить файлы в резервную копию: ar_SA.MESSAGE_TEXT_ERR10 =تم الغاء التحديث. غير قادر على استبدال الملفات إلى النسخة احتياطية: +de.MESSAGE_TEXT_ERR10 =Update abgebrochen. Die zu sichernden Dateien können nicht ersetzt werden: +es.MESSAGE_TEXT_ERR10 =Actualización cancelada. No se pueden reemplazar los archivos en la copia de seguridad: +fr.MESSAGE_TEXT_ERR10 =Mise à jour annulée. Impossible de remplacer les fichiers par des fichiers de sauvegarde : +it.MESSAGE_TEXT_ERR10 =Aggiornamento annullato. Impossibile spostare i file nel backup: en.MESSAGE_TEXT_ERR11 =Can't restore files from backup! ru.MESSAGE_TEXT_ERR11 =Не удалось восстановить файлы из резервной копии! ar_SA.MESSAGE_TEXT_ERR11 =غير قادر على استرجاع الملفات من النسخة الاحتياطية! +de.MESSAGE_TEXT_ERR11 =Dateien können nicht aus dem Backup wiederhergestellt werden! +es.MESSAGE_TEXT_ERR11 =¡No se pueden restaurar los archivos de la copia de seguridad! +fr.MESSAGE_TEXT_ERR11 =Impossible de restaurer des fichiers à partir d'une sauvegarde ! +it.MESSAGE_TEXT_ERR11 =Impossibile ripristinare i file dal backup! en.MESSAGE_TEXT_ERR12 =Update cancelled. Can't move updates to App path: ru.MESSAGE_TEXT_ERR12 =Обновление отменено. Не удалось переместить обновления в папку приложения: ar_SA.MESSAGE_TEXT_ERR12 =تم الغاء التحديث. غير قادر على نقل التحديثات إلى مسار البرنامج: +de.MESSAGE_TEXT_ERR12 =Update abgebrochen. Updates können nicht in den App-Pfad verschoben werden: +es.MESSAGE_TEXT_ERR12 =Actualización cancelada. No se pueden mover las actualizaciones a la ruta de la aplicación: +fr.MESSAGE_TEXT_ERR12 =Mise à jour annulée. Impossible de déplacer les mises à jour vers le chemin d'accès à l'application : +it.MESSAGE_TEXT_ERR12 =Aggiornamento annullato. Impossibile spostare gli aggiornamenti nel percorso dell'app: en.MESSAGE_TEXT_ERR13 =An error occurred while remove App path: ru.MESSAGE_TEXT_ERR13 =Произошла ошибка при удалении папки приложения: ar_SA.MESSAGE_TEXT_ERR13 =حصل خطأ أثاء إزالة مسار البرنامج: +de.MESSAGE_TEXT_ERR13 =Beim Entfernen des App-Pfads ist ein Fehler aufgetreten: +es.MESSAGE_TEXT_ERR13 =Se ha producido un error al eliminar la ruta de la aplicación: +fr.MESSAGE_TEXT_ERR13 =Une erreur s'est produite lors de la suppression du chemin d'accès à l'application : +it.MESSAGE_TEXT_ERR13 =Si è verificato un errore durante la rimozione del percorso dell'app: en.MESSAGE_TEXT_ERR14 =An error occurred while restore files from backup: ru.MESSAGE_TEXT_ERR14 =Произошла ошибка при восстановлении файлов из резервной копии: ar_SA.MESSAGE_TEXT_ERR14 =حصل خطأ أثناء استرجاع الملفات من النسخة الاحتياطية: +de.MESSAGE_TEXT_ERR14 =Bei der Wiederherstellung von Dateien aus dem Backup ist ein Fehler aufgetreten: +es.MESSAGE_TEXT_ERR14 =Se ha producido un error al restaurar los archivos de la copia de seguridad: +fr.MESSAGE_TEXT_ERR14 =Une erreur s'est produite lors de la restauration des fichiers à partir de la sauvegarde : +it.MESSAGE_TEXT_ERR14 =Si è verificato un errore durante il ripristino dei file dal backup: en.MESSAGE_TEXT_ERR15 =An error occurred while restarting the program! ru.MESSAGE_TEXT_ERR15 =Произошла ошибка при перезапуске приложения! ar_SA.MESSAGE_TEXT_ERR15 =حصل خطأ أثناء إعادة تشغيل البرنامج! +de.MESSAGE_TEXT_ERR15 =Beim Neustart der App ist ein Fehler aufgetreten! +es.MESSAGE_TEXT_ERR15 =¡Se ha producido un error al reiniciar el programa! +fr.MESSAGE_TEXT_ERR15 =Une erreur s'est produite lors du redémarrage de l'application ! +it.MESSAGE_TEXT_ERR15 =Si è verificato un errore durante il riavvio del programma! en.MESSAGE_TEXT_ERR16 =SDL init error: ru.MESSAGE_TEXT_ERR16 =Ошибка инициализации SDL: ar_SA.MESSAGE_TEXT_ERR16 =خطأ من SDL init: +de.MESSAGE_TEXT_ERR16 =Fehler bei der SDL-Initialisierung: +es.MESSAGE_TEXT_ERR16 =Error de inicio SDL: +fr.MESSAGE_TEXT_ERR16 =Erreur d'initialisation SDL : +it.MESSAGE_TEXT_ERR16 =Errore di inizializzazione SDL: en.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher returned error: ru.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher вернул ошибку: -ar_SA.MESSAGE_TEXT_ERR17 =خطأ من ServiceCtrlDispatcher: \ No newline at end of file +ar_SA.MESSAGE_TEXT_ERR17 =خطأ من ServiceCtrlDispatcher: +de.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher hat einen Fehler zurückgegeben: +es.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher ha devuelto un error: +fr.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher a renvoyé une erreur : +it.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher ha restituito un errore: \ No newline at end of file From 02eb6fe4178cf7b106ad7b000f583bb8b177bc69 Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Tue, 5 Dec 2023 13:55:39 +0300 Subject: [PATCH 018/316] added pt-BR --- .../extras/update-daemon/res/langs/langs.iss | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/win-linux/extras/update-daemon/res/langs/langs.iss b/win-linux/extras/update-daemon/res/langs/langs.iss index af48ba9f3..2f1b72162 100644 --- a/win-linux/extras/update-daemon/res/langs/langs.iss +++ b/win-linux/extras/update-daemon/res/langs/langs.iss @@ -6,6 +6,7 @@ de.CAPTION_TEXT =Aktualisierungsdienst von ONLYOFFICE es.CAPTION_TEXT =Servicio de actualización de ONLYOFFICE fr.CAPTION_TEXT =Service de mise à jour ONLYOFFICE it.CAPTION_TEXT =Servizio di aggiornamento ONLYOFFICE +pt_BR.CAPTION_TEXT =Serviço de atualização ONLYOFFICE en.MESSAGE_TEXT_ERR1 =An error occurred: ru.MESSAGE_TEXT_ERR1 =Произошла ошибка: @@ -14,6 +15,7 @@ de.MESSAGE_TEXT_ERR1 =Ein Fehler ist aufgetreten: es.MESSAGE_TEXT_ERR1 =Se ha producido un error: fr.MESSAGE_TEXT_ERR1 =Une erreur s'est produite : it.MESSAGE_TEXT_ERR1 =Si è verificato un errore: +pt_BR.MESSAGE_TEXT_ERR1 =Um erro ocorreu: en.MESSAGE_TEXT_ERR2 =An error occurred while deleting: ru.MESSAGE_TEXT_ERR2 =Произошла ошибка при удалении: @@ -22,6 +24,7 @@ de.MESSAGE_TEXT_ERR2 =Beim Löschvorgang ist ein Fehler aufgetreten: es.MESSAGE_TEXT_ERR2 =Se ha producido un error al eliminar: fr.MESSAGE_TEXT_ERR2 =Une erreur s'est produite lors de la suppression : it.MESSAGE_TEXT_ERR2 =Si è verificato un errore durante l'eliminazione: +pt_BR.MESSAGE_TEXT_ERR2 =Ocorreu um erro ao excluir: en.MESSAGE_TEXT_ERR3 =An error occurred while creating: ru.MESSAGE_TEXT_ERR3 =Произошла ошибка при создании: @@ -30,6 +33,7 @@ de.MESSAGE_TEXT_ERR3 =Beim Erstellen ist ein Fehler aufgetreten: es.MESSAGE_TEXT_ERR3 =Se ha producido un error al crear: fr.MESSAGE_TEXT_ERR3 =Une erreur s'est produite lors de la création : it.MESSAGE_TEXT_ERR3 =Si è verificato un errore durante la creazione: +pt_BR.MESSAGE_TEXT_ERR3 =Ocorreu um erro ao criar: en.MESSAGE_TEXT_ERR4 =An error occurred while restarting the service! ru.MESSAGE_TEXT_ERR4 =Произошла ошибка при перезапуске сервиса! @@ -38,6 +42,7 @@ de.MESSAGE_TEXT_ERR4 =Beim Neustart des Dienstes ist ein Fehler aufgetreten! es.MESSAGE_TEXT_ERR4 =¡Se ha producido un error al reiniciar el servicio! fr.MESSAGE_TEXT_ERR4 =Une erreur s'est produite lors du redémarrage du service ! it.MESSAGE_TEXT_ERR4 =Si è verificato un errore durante il riavvio del servizio! +pt_BR.MESSAGE_TEXT_ERR4 =Ocorreu um erro ao reiniciar o serviço! en.MESSAGE_TEXT_ERR5 =Update cancelled. Can't find folder: ru.MESSAGE_TEXT_ERR5 =Обновление отменено. Не удалось найти папку: @@ -46,6 +51,7 @@ de.MESSAGE_TEXT_ERR5 =Update abgebrochen. Ordner kann nicht gefunden werden: es.MESSAGE_TEXT_ERR5 =Actualización cancelada. No se puede encontrar la carpeta: fr.MESSAGE_TEXT_ERR5 =Mise à jour annulée. Impossible de trouver le dossier : it.MESSAGE_TEXT_ERR5 =Aggiornamento annullato. Impossibile trovare la cartella: +pt_BR.MESSAGE_TEXT_ERR5 =Atualização cancelada. Não foi possível encontrar a pasta: en.MESSAGE_TEXT_ERR6 =Update cancelled. The file signature is missing: ru.MESSAGE_TEXT_ERR6 =Обновление отменено. Отсутствует подпись файла: @@ -54,6 +60,7 @@ de.MESSAGE_TEXT_ERR6 =Update abgebrochen. Die Dateisignatur fehlt: es.MESSAGE_TEXT_ERR6 =Actualización cancelada. No hay firma del archivo: fr.MESSAGE_TEXT_ERR6 =Mise à jour annulée. La signature du fichier est manquante : it.MESSAGE_TEXT_ERR6 =Aggiornamento annullato. Manca la firma del file: +pt_BR.MESSAGE_TEXT_ERR6 =Atualização cancelada. A assinatura do arquivo está faltando: en.MESSAGE_TEXT_ERR7 =Update cancelled. Can't delete folder: ru.MESSAGE_TEXT_ERR7 =Обновление отменено. Не удалось удалить папку: @@ -62,6 +69,7 @@ de.MESSAGE_TEXT_ERR7 =Update abgebrochen. Ordner kann nicht gelöscht werden: es.MESSAGE_TEXT_ERR7 =Actualización cancelada. No se puede eliminar la carpeta: fr.MESSAGE_TEXT_ERR7 =Mise à jour annulée. Impossible de supprimer le dossier : it.MESSAGE_TEXT_ERR7 =Aggiornamento annullato. Impossibile eliminare la cartella: +pt_BR.MESSAGE_TEXT_ERR7 =Atualização cancelada. Não é possível excluir a pasta: en.MESSAGE_TEXT_ERR8 =Update cancelled. The program is not closed: ru.MESSAGE_TEXT_ERR8 =Обновление отменено. Приложение не закрыто: @@ -70,6 +78,7 @@ de.MESSAGE_TEXT_ERR8 =Update abgebrochen. Die App ist nicht geschlossen: es.MESSAGE_TEXT_ERR8 =Actualización cancelada. El programa no está cerrado: fr.MESSAGE_TEXT_ERR8 =Mise à jour annulée. L'application n'est pas fermée : it.MESSAGE_TEXT_ERR8 =Aggiornamento annullato. Il programma non è chiuso: +pt_BR.MESSAGE_TEXT_ERR8 =Atualização cancelada. O programa não está fechado: en.MESSAGE_TEXT_ERR9 =Update cancelled. Can't create folder: ru.MESSAGE_TEXT_ERR9 =Обновление отменено. Не удалось создать папку: @@ -78,6 +87,7 @@ de.MESSAGE_TEXT_ERR9 =Update abgebrochen. Ordner kann nicht erstellt werden: es.MESSAGE_TEXT_ERR9 =Actualización cancelada. No se puede crear la carpeta: fr.MESSAGE_TEXT_ERR9 =Mise à jour annulée. Impossible de créer un dossier : it.MESSAGE_TEXT_ERR9 =Aggiornamento annullato. Impossibile creare la cartella: +pt_BR.MESSAGE_TEXT_ERR9 =Atualização cancelada. Não é possível criar a pasta: en.MESSAGE_TEXT_ERR10 =Update cancelled. Can't replace files to backup: ru.MESSAGE_TEXT_ERR10 =Обновление отменено. Не удалось переместить файлы в резервную копию: @@ -86,6 +96,7 @@ de.MESSAGE_TEXT_ERR10 =Update abgebrochen. Die zu sichernden Dateien können nic es.MESSAGE_TEXT_ERR10 =Actualización cancelada. No se pueden reemplazar los archivos en la copia de seguridad: fr.MESSAGE_TEXT_ERR10 =Mise à jour annulée. Impossible de remplacer les fichiers par des fichiers de sauvegarde : it.MESSAGE_TEXT_ERR10 =Aggiornamento annullato. Impossibile spostare i file nel backup: +pt_BR.MESSAGE_TEXT_ERR10 =Atualização cancelada. Não é possível substituir arquivos para backup: en.MESSAGE_TEXT_ERR11 =Can't restore files from backup! ru.MESSAGE_TEXT_ERR11 =Не удалось восстановить файлы из резервной копии! @@ -94,6 +105,7 @@ de.MESSAGE_TEXT_ERR11 =Dateien können nicht aus dem Backup wiederhergestellt we es.MESSAGE_TEXT_ERR11 =¡No se pueden restaurar los archivos de la copia de seguridad! fr.MESSAGE_TEXT_ERR11 =Impossible de restaurer des fichiers à partir d'une sauvegarde ! it.MESSAGE_TEXT_ERR11 =Impossibile ripristinare i file dal backup! +pt_BR.MESSAGE_TEXT_ERR11 =Não é possível restaurar arquivos do backup! en.MESSAGE_TEXT_ERR12 =Update cancelled. Can't move updates to App path: ru.MESSAGE_TEXT_ERR12 =Обновление отменено. Не удалось переместить обновления в папку приложения: @@ -102,6 +114,7 @@ de.MESSAGE_TEXT_ERR12 =Update abgebrochen. Updates können nicht in den App-Pfad es.MESSAGE_TEXT_ERR12 =Actualización cancelada. No se pueden mover las actualizaciones a la ruta de la aplicación: fr.MESSAGE_TEXT_ERR12 =Mise à jour annulée. Impossible de déplacer les mises à jour vers le chemin d'accès à l'application : it.MESSAGE_TEXT_ERR12 =Aggiornamento annullato. Impossibile spostare gli aggiornamenti nel percorso dell'app: +pt_BR.MESSAGE_TEXT_ERR12 =Atualização cancelada. Não é possível mover as atualizações para o caminho do aplicativo: en.MESSAGE_TEXT_ERR13 =An error occurred while remove App path: ru.MESSAGE_TEXT_ERR13 =Произошла ошибка при удалении папки приложения: @@ -110,6 +123,7 @@ de.MESSAGE_TEXT_ERR13 =Beim Entfernen des App-Pfads ist ein Fehler aufgetreten: es.MESSAGE_TEXT_ERR13 =Se ha producido un error al eliminar la ruta de la aplicación: fr.MESSAGE_TEXT_ERR13 =Une erreur s'est produite lors de la suppression du chemin d'accès à l'application : it.MESSAGE_TEXT_ERR13 =Si è verificato un errore durante la rimozione del percorso dell'app: +pt_BR.MESSAGE_TEXT_ERR13 =Ocorreu um erro ao remover o caminho do aplicativo: en.MESSAGE_TEXT_ERR14 =An error occurred while restore files from backup: ru.MESSAGE_TEXT_ERR14 =Произошла ошибка при восстановлении файлов из резервной копии: @@ -118,6 +132,7 @@ de.MESSAGE_TEXT_ERR14 =Bei der Wiederherstellung von Dateien aus dem Backup ist es.MESSAGE_TEXT_ERR14 =Se ha producido un error al restaurar los archivos de la copia de seguridad: fr.MESSAGE_TEXT_ERR14 =Une erreur s'est produite lors de la restauration des fichiers à partir de la sauvegarde : it.MESSAGE_TEXT_ERR14 =Si è verificato un errore durante il ripristino dei file dal backup: +pt_BR.MESSAGE_TEXT_ERR14 =Ocorreu um erro ao restaurar arquivos do backup: en.MESSAGE_TEXT_ERR15 =An error occurred while restarting the program! ru.MESSAGE_TEXT_ERR15 =Произошла ошибка при перезапуске приложения! @@ -126,6 +141,7 @@ de.MESSAGE_TEXT_ERR15 =Beim Neustart der App ist ein Fehler aufgetreten! es.MESSAGE_TEXT_ERR15 =¡Se ha producido un error al reiniciar el programa! fr.MESSAGE_TEXT_ERR15 =Une erreur s'est produite lors du redémarrage de l'application ! it.MESSAGE_TEXT_ERR15 =Si è verificato un errore durante il riavvio del programma! +pt_BR.MESSAGE_TEXT_ERR15 =Ocorreu um erro ao reiniciar o programa! en.MESSAGE_TEXT_ERR16 =SDL init error: ru.MESSAGE_TEXT_ERR16 =Ошибка инициализации SDL: @@ -134,6 +150,7 @@ de.MESSAGE_TEXT_ERR16 =Fehler bei der SDL-Initialisierung: es.MESSAGE_TEXT_ERR16 =Error de inicio SDL: fr.MESSAGE_TEXT_ERR16 =Erreur d'initialisation SDL : it.MESSAGE_TEXT_ERR16 =Errore di inizializzazione SDL: +pt_BR.MESSAGE_TEXT_ERR16 =Erro de inicialização SDL: en.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher returned error: ru.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher вернул ошибку: @@ -141,4 +158,5 @@ ar_SA.MESSAGE_TEXT_ERR17 =خطأ من ServiceCtrlDispatcher: de.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher hat einen Fehler zurückgegeben: es.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher ha devuelto un error: fr.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher a renvoyé une erreur : -it.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher ha restituito un errore: \ No newline at end of file +it.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher ha restituito un errore: +pt_BR.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher retornou erro: \ No newline at end of file From b17e94cc2bb039dc0c702bce031f45091493aafc Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Fri, 8 Dec 2023 11:39:43 +0300 Subject: [PATCH 019/316] [macos] added Arabic language --- macos/ONLYOFFICE.xcodeproj/project.pbxproj | 21 +- .../ar-SA.lproj/InfoPlist.strings | 6 + .../ar-SA.lproj/InfoPlist.strings | 6 + .../ar-SA.lproj/InfoPlist.strings | 6 + .../ar-SA.lproj/Document-Sign.strings | 39 ++ .../ar-SA.lproj/Localizable.strings | 234 +++++++++ .../ar-SA.lproj/Localizable.stringsdict | 85 ++++ macos/ONLYOFFICE/ar-SA.lproj/Main.strings | 456 ++++++++++++++++++ .../ar-SA.lproj/MoveApplication.strings | 24 + .../ar-SA.lproj/Presentation-Reporter.strings | 3 + 10 files changed, 878 insertions(+), 2 deletions(-) create mode 100644 macos/ONLYOFFICE/Resources/ONLYOFFICE-arm/ar-SA.lproj/InfoPlist.strings create mode 100644 macos/ONLYOFFICE/Resources/ONLYOFFICE-v8/ar-SA.lproj/InfoPlist.strings create mode 100644 macos/ONLYOFFICE/Resources/ONLYOFFICE-x86_64/ar-SA.lproj/InfoPlist.strings create mode 100644 macos/ONLYOFFICE/ar-SA.lproj/Document-Sign.strings create mode 100644 macos/ONLYOFFICE/ar-SA.lproj/Localizable.strings create mode 100644 macos/ONLYOFFICE/ar-SA.lproj/Localizable.stringsdict create mode 100644 macos/ONLYOFFICE/ar-SA.lproj/Main.strings create mode 100644 macos/ONLYOFFICE/ar-SA.lproj/MoveApplication.strings create mode 100644 macos/ONLYOFFICE/ar-SA.lproj/Presentation-Reporter.strings diff --git a/macos/ONLYOFFICE.xcodeproj/project.pbxproj b/macos/ONLYOFFICE.xcodeproj/project.pbxproj index 1f50b2969..0567dad19 100644 --- a/macos/ONLYOFFICE.xcodeproj/project.pbxproj +++ b/macos/ONLYOFFICE.xcodeproj/project.pbxproj @@ -781,6 +781,15 @@ 5AAFF0A62989B70400D433B5 /* si */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = si; path = si.lproj/InfoPlist.strings; sourceTree = ""; }; 5AB20F5D274D35F2003732A0 /* file-docxf.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "file-docxf.icns"; sourceTree = ""; }; 5AB20F61274D360A003732A0 /* file-oform.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "file-oform.icns"; sourceTree = ""; }; + 5ABE02512B22699F0031328E /* ar-SA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ar-SA"; path = "ar-SA.lproj/Document-Sign.strings"; sourceTree = ""; }; + 5ABE02522B22699F0031328E /* ar-SA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ar-SA"; path = "ar-SA.lproj/Localizable.strings"; sourceTree = ""; }; + 5ABE02532B22699F0031328E /* ar-SA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "ar-SA"; path = "ar-SA.lproj/Localizable.stringsdict"; sourceTree = ""; }; + 5ABE02542B22699F0031328E /* ar-SA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ar-SA"; path = "ar-SA.lproj/Main.strings"; sourceTree = ""; }; + 5ABE02552B22699F0031328E /* ar-SA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ar-SA"; path = "ar-SA.lproj/MoveApplication.strings"; sourceTree = ""; }; + 5ABE02562B22699F0031328E /* ar-SA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ar-SA"; path = "ar-SA.lproj/Presentation-Reporter.strings"; sourceTree = ""; }; + 5ABE02572B22699F0031328E /* ar-SA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ar-SA"; path = "ar-SA.lproj/InfoPlist.strings"; sourceTree = ""; }; + 5ABE02582B22699F0031328E /* ar-SA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ar-SA"; path = "ar-SA.lproj/InfoPlist.strings"; sourceTree = ""; }; + 5ABE02592B22699F0031328E /* ar-SA */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ar-SA"; path = "ar-SA.lproj/InfoPlist.strings"; sourceTree = ""; }; 5AD24E292902AE3C00748926 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = Vendor/Sparkle/Sparkle.framework; sourceTree = SOURCE_ROOT; }; BE6251B922BD089100656116 /* dictionaries */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dictionaries; path = ../../../../dictionaries; sourceTree = ""; }; BE95F0A623E9FF590045E0CB /* mac_cefview.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mac_cefview.h; sourceTree = ""; }; @@ -1919,6 +1928,7 @@ si, nb, "zh-Hant-TW", + "ar-SA", ); mainGroup = FCBC425F1B9D650400405301; productRefGroup = FCBC42691B9D650400405301 /* Products */; @@ -2536,6 +2546,7 @@ 5AAFF0A32989B70400D433B5 /* si */, 5A9AC2A929AEB1E100B6A250 /* nb */, 5A4ECA6A2AA88CB900286D52 /* zh-Hant-TW */, + 5ABE02562B22699F0031328E /* ar-SA */, ); name = "Presentation-Reporter.storyboard"; sourceTree = ""; @@ -2583,6 +2594,7 @@ 5AAFF0A22989B70400D433B5 /* si */, 5A9AC2A829AEB1E100B6A250 /* nb */, 5A4ECA692AA88CB900286D52 /* zh-Hant-TW */, + 5ABE02552B22699F0031328E /* ar-SA */, ); name = MoveApplication.strings; sourceTree = ""; @@ -2670,7 +2682,7 @@ 5A7F872D27A346DA006B6E27 /* uk-UA */, 5A7F874227A3478C006B6E27 /* ja-JP */, 5AAFF0A62989B70400D433B5 /* si */, - 5AC517712AA7D8DE00556F12 /* en */, + 5ABE02592B22699F0031328E /* ar-SA */, ); name = InfoPlist.strings; sourceTree = ""; @@ -2758,7 +2770,7 @@ 5A7F870A27A340D5006B6E27 /* uk-UA */, 5A7F874327A348BB006B6E27 /* ja-JP */, 5AAFF0A52989B70400D433B5 /* si */, - 5AC517702AA7D8DE00556F12 /* en */, + 5ABE02582B22699F0031328E /* ar-SA */, ); name = InfoPlist.strings; sourceTree = ""; @@ -2847,6 +2859,7 @@ 5A7F874827A34A06006B6E27 /* ja-JP */, 5AAFF0A42989B70400D433B5 /* si */, 5A9AC2AA29AEB1F000B6A250 /* nb */, + 5ABE02572B22699F0031328E /* ar-SA */, ); name = InfoPlist.strings; sourceTree = ""; @@ -2894,6 +2907,7 @@ 5AAFF0A12989B70400D433B5 /* si */, 5A9AC2A729AEB1E100B6A250 /* nb */, 5A4ECA682AA88CB900286D52 /* zh-Hant-TW */, + 5ABE02542B22699F0031328E /* ar-SA */, ); name = Main.storyboard; sourceTree = ""; @@ -2941,6 +2955,7 @@ 5AAFF0A02989B70400D433B5 /* si */, 5A9AC2A629AEB1E100B6A250 /* nb */, 5A4ECA672AA88CB900286D52 /* zh-Hant-TW */, + 5ABE02532B22699F0031328E /* ar-SA */, ); name = Localizable.stringsdict; sourceTree = ""; @@ -2988,6 +3003,7 @@ 5AAFF09E2989B70400D433B5 /* si */, 5A9AC2A429AEB1E100B6A250 /* nb */, 5A4ECA652AA88CB900286D52 /* zh-Hant-TW */, + 5ABE02512B22699F0031328E /* ar-SA */, ); name = "Document-Sign.storyboard"; sourceTree = ""; @@ -3035,6 +3051,7 @@ 5AAFF09F2989B70400D433B5 /* si */, 5A9AC2A529AEB1E100B6A250 /* nb */, 5A4ECA662AA88CB900286D52 /* zh-Hant-TW */, + 5ABE02522B22699F0031328E /* ar-SA */, ); name = Localizable.strings; sourceTree = ""; diff --git a/macos/ONLYOFFICE/Resources/ONLYOFFICE-arm/ar-SA.lproj/InfoPlist.strings b/macos/ONLYOFFICE/Resources/ONLYOFFICE-arm/ar-SA.lproj/InfoPlist.strings new file mode 100644 index 000000000..44b2d6769 --- /dev/null +++ b/macos/ONLYOFFICE/Resources/ONLYOFFICE-arm/ar-SA.lproj/InfoPlist.strings @@ -0,0 +1,6 @@ +/* Bundle name */ +"CFBundleName" = "أونلي أوفيس"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "الحقوق جميعها محفوظة 2023 © أسينسو سيستم."; + diff --git a/macos/ONLYOFFICE/Resources/ONLYOFFICE-v8/ar-SA.lproj/InfoPlist.strings b/macos/ONLYOFFICE/Resources/ONLYOFFICE-v8/ar-SA.lproj/InfoPlist.strings new file mode 100644 index 000000000..44b2d6769 --- /dev/null +++ b/macos/ONLYOFFICE/Resources/ONLYOFFICE-v8/ar-SA.lproj/InfoPlist.strings @@ -0,0 +1,6 @@ +/* Bundle name */ +"CFBundleName" = "أونلي أوفيس"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "الحقوق جميعها محفوظة 2023 © أسينسو سيستم."; + diff --git a/macos/ONLYOFFICE/Resources/ONLYOFFICE-x86_64/ar-SA.lproj/InfoPlist.strings b/macos/ONLYOFFICE/Resources/ONLYOFFICE-x86_64/ar-SA.lproj/InfoPlist.strings new file mode 100644 index 000000000..44b2d6769 --- /dev/null +++ b/macos/ONLYOFFICE/Resources/ONLYOFFICE-x86_64/ar-SA.lproj/InfoPlist.strings @@ -0,0 +1,6 @@ +/* Bundle name */ +"CFBundleName" = "أونلي أوفيس"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "الحقوق جميعها محفوظة 2023 © أسينسو سيستم."; + diff --git a/macos/ONLYOFFICE/ar-SA.lproj/Document-Sign.strings b/macos/ONLYOFFICE/ar-SA.lproj/Document-Sign.strings new file mode 100644 index 000000000..afa06a4b7 --- /dev/null +++ b/macos/ONLYOFFICE/ar-SA.lproj/Document-Sign.strings @@ -0,0 +1,39 @@ +/* Class = "NSTextFieldCell"; title = "Enter the password for the private key."; ObjectID = "1dL-nN-bJI"; */ +"1dL-nN-bJI.title" = "ادخل كلمة مرور مفتاح التشفير الخاص"; + +/* Class = "NSTextFieldCell"; title = "Enter the password for the digital signature."; ObjectID = "1Fy-mg-aq9"; */ +"1Fy-mg-aq9.title" = "ادخل كلمة مرور التوقيع الرقمي."; + +/* Class = "NSTextFieldCell"; title = "Specify the digital signature file for the document."; ObjectID = "2Ck-6y-ygx"; */ +"2Ck-6y-ygx.title" = "حدّد ملف التوقيع الرقمي للمستند."; + +/* Class = "NSSecureTextFieldCell"; placeholderString = "Enter Password"; ObjectID = "4gA-s8-Lne"; */ +"4gA-s8-Lne.placeholderString" = "ادخل كلمة المرور"; + +/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "GOU-av-TC1"; */ +"GOU-av-TC1.title" = "إلغاء"; + +/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "jpH-3g-Gt5"; */ +"jpH-3g-Gt5.title" = "إلغاء"; + +/* Class = "NSButtonCell"; title = "Load a Private Key"; ObjectID = "P3k-kI-w22"; */ +"P3k-kI-w22.title" = "فتح مفتاح التشفير الخاص"; + +/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "qZ4-0O-L0G"; */ +"qZ4-0O-L0G.title" = "إلغاء"; + +/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "RbM-Dq-A3K"; */ +"RbM-Dq-A3K.title" = "إلغاء"; + +/* Class = "NSTextFieldCell"; title = "Specify a private key for the digital signature."; ObjectID = "Tfc-EF-VnS"; */ +"Tfc-EF-VnS.title" = "حدّد مفتاح التشفير الخاص للتوقيع الرقمي"; + +/* Class = "NSButtonCell"; title = "Load Signature"; ObjectID = "tTF-wa-eJp"; */ +"tTF-wa-eJp.title" = "فتح التوقيع"; + +/* Class = "NSWindow"; title = "Window"; ObjectID = "uKp-p4-6uB"; */ +"uKp-p4-6uB.title" = "نافذة"; + +/* Class = "NSSecureTextFieldCell"; placeholderString = "Enter Password"; ObjectID = "Zj5-0h-hpW"; */ +"Zj5-0h-hpW.placeholderString" = "ادخل كلمة المرور"; + diff --git a/macos/ONLYOFFICE/ar-SA.lproj/Localizable.strings b/macos/ONLYOFFICE/ar-SA.lproj/Localizable.strings new file mode 100644 index 000000000..f3b62a31b --- /dev/null +++ b/macos/ONLYOFFICE/ar-SA.lproj/Localizable.strings @@ -0,0 +1,234 @@ +/* No comment provided by engineer. */ +"%@ Help" = "%@ مساعدة"; + +/* No comment provided by engineer. */ +"About %@" = "عن %@"; + +/* No comment provided by engineer. */ +"Acknowledgments" = "شكر وتقدير لـ"; + +/* No comment provided by engineer. */ +"Before signing the document, it must be saved." = "لإجراء توقيع المستند، يجب الحفظ أولًا"; + +/* No comment provided by engineer. */ +"Cancel" = "إلغاء"; + +/* No comment provided by engineer. */ +"Cannot open file of Digital Signature" = "غير قادر على فتح ملف التوقيع الرقمي"; + +/* No comment provided by engineer. */ +"Cannot open file of Private Key" = "غير قادر على فتح ملف مفتاح التشفير الخاص"; + +/* No comment provided by engineer. */ +"Cannot open folder of the file location." = "غير قادر على فتح المجلد للمكان المختار"; + +/* No comment provided by engineer. */ +"Comma-Separated Values" = "قيم مفرّقة بفاصلة (*.csv)"; + +/* No comment provided by engineer. */ +"Create portal" = "إنشاء بوابة سحابية"; + +/* No comment provided by engineer. */ +"Delete and Quit" = "حذف وخروج"; + +/* No comment provided by engineer. */ +"DjVu File" = "مستند رقمي (*.djvu)"; + +/* No comment provided by engineer. */ +"Do you want to save the changes made to the document \"%@\"?" = "هل تريد حفظ التغييرات للمستند \"%@\"؟"; + +/* No comment provided by engineer. */ +"Document %ld.docx" = "مستند %ld.docx"; + +/* No comment provided by engineer. */ +"Document %ld.docxf" = "مستند %ld.docxf"; + +/* No comment provided by engineer. */ +"Document template" = "قالب وورد (*.dotx)"; + +/* No comment provided by engineer. */ +"Don't Save" = "عدم الحفظ"; + +/* No comment provided by engineer. */ +"Excel 97-2003 Spreadsheet" = "جدول إكسل 97-2003 (*.xls)"; + +/* No comment provided by engineer. */ +"Excel 2007 Spreadsheet" = "جدول إكسل (*.xlsx)"; + +/* No comment provided by engineer. */ +"FictionBook File" = "ملف فكشنبوك 2 (*.fb2)"; + +/* No comment provided by engineer. */ +"File \"%@\" can not be open or not exist." = "\"%@\" غير قابل للفتح أو غير موجود."; + +/* No comment provided by engineer. */ +"File can not be open." = "غير قادر على فتح الملف."; + +/* No comment provided by engineer. */ +"File Format:" = "صيغة الملف:"; + +/* No comment provided by engineer. */ +"Hide %@" = "إخفاء %@"; + +/* No comment provided by engineer. */ +"If you don't review your documents, all your changeses will be lost." = "إن لم تراجع مستنداتك، فستخسر التغييرات."; + +/* No comment provided by engineer. */ +"If you have already purchased %@, you should find your activation key in an email confirmation." = "إن قمت بشراء %@ من قبل، فسوف تجد رمز التفعيل في رسالة تأكيدية بالبريد الإلكتروني."; + +/* No comment provided by engineer. */ +"License Agreement" = "الموافقة على الترخيص"; + +/* No comment provided by engineer. */ +"Macro-enabled Presentation" = "عرض بوربوينت مع خاصية الماكرو (*.pptm)"; + +/* No comment provided by engineer. */ +"Macro-enabled spreadsheet template" = "قالب جدول إكسيل مع خاصية الماكرو (*.xltm)"; + +/* No comment provided by engineer. */ +"Mobipocket e-book" = "ملف موبي بوكيت (*.mobi)"; + +/* No comment provided by engineer. */ +"new-document" = "مستند جديد"; + +/* No comment provided by engineer. */ +"new-presentation" = "عرض تقديمي جديد"; + +/* No comment provided by engineer. */ +"new-spreadsheet" = "جدول بياني جديد"; + +/* No comment provided by engineer. */ +"No" = "لا"; + +/* No comment provided by engineer. */ +"OK" = "حسنًا"; + +/* No comment provided by engineer. */ +"ONLYOFFICE can not open the Digital Signature file. Try opening another file." = "أونلي أوفيس غير قادر على فتح ملف التوقيع الرقمي. جرّب ملفًّا آخر."; + +/* No comment provided by engineer. */ +"ONLYOFFICE can not open the Private Key. Try opening another file." = "أونلي أوفيس غير قادر على فتح مفتاح التشفير الخاص. جرّب ملفًّا آخر."; + +/* No comment provided by engineer. */ +"OpenDocument Document Template" = "مستند ليبري أوفس (*.ott)"; + +/* No comment provided by engineer. */ +"OpenDocument Presentation Template" = "قالب عرض ليبري أوفس (*.otp)"; + +/* No comment provided by engineer. */ +"OpenDocument Spreadsheet Template" = "قالب جدول ليبري أوفس (*.ots)"; + +/* No comment provided by engineer. */ +"Opening" = "جاري الفتح"; + +/* No comment provided by engineer. */ +"OpenOffice Document" = "ملف نصي ليبري أوفس (*.odt)"; + +/* No comment provided by engineer. */ +"OpenOffice Presentation" = "عرض ليبري أوفس (*.odp)"; + +/* No comment provided by engineer. */ +"OpenOffice Spreadsheet" = "جدول ليبري أوفس (*.ods)"; + +/* No comment provided by engineer. */ +"PDF File" = "بي دي إف (*.pdf)"; + +/* No comment provided by engineer. */ +"PDF/A File" = "بي دي إف طويل الأجل (*.pdf)"; + +/* No comment provided by engineer. */ +"Plain Text" = "ملف نصي (*.txt)"; + +/* No comment provided by engineer. */ +"PowerPoint 97-2003 Presentation" = "عرض بوربوينت 97-2003 (*.ppt)"; + +/* No comment provided by engineer. */ +"PowerPoint 2007 Presentation" = "عرض بوربوينت قابل للتعديل (*.pptx)"; + +/* No comment provided by engineer. */ +"PowerPoint Slide Show" = "عرض بوربوينت غير قابل للتعديل (*.ppsx)"; + +/* No comment provided by engineer. */ +"Preparing..." = "تجهيز..."; + +/* No comment provided by engineer. */ +"Presentation %ld.pptx" = "عرض %ld.pptx"; + +/* No comment provided by engineer. */ +"Presentation template" = "قالب عرض بوربوينت (*.potx)"; + +/* No comment provided by engineer. */ +"Presenter View" = "وضع إلقاء العرض"; + +/* No comment provided by engineer. */ +"Quit %@" = "خروج من %@"; + +/* No comment provided by engineer. */ +"Review Changes..." = "مراجعة التغييرات..."; + +/* No comment provided by engineer. */ +"Rich Text Document" = "ملف نصي غني (*.rtf)"; + +/* No comment provided by engineer. */ +"Save" = "حفظ"; + +/* No comment provided by engineer. */ +"Save the document?" = "حفظ المستند؟"; + +/* No comment provided by engineer. */ +"Signature Details" = "معلومات التوقيع"; + +/* No comment provided by engineer. */ +"Spreadsheet %ld.xlsx" = "جدول %ld.xlsx"; + +/* No comment provided by engineer. */ +"Spreadsheet template" = "قالب جدول إكسل (*.xltx)"; + +/* No comment provided by engineer. */ +"Thank you for evaluating %@!" = "شكرًا على تقييم %@!"; + +/* No comment provided by engineer. */ +"The document \"%@\" must be built. Continue?" = "المستند \"%@\" يجب بناؤه. استمر؟"; + +/* No comment provided by engineer. */ +"To open the file location, it must be saved." = "لفتح مكان الملف، يجب الحفظ."; + +/* No comment provided by engineer. */ +"Unconfirmed" = "غير مؤكد"; + +/* No comment provided by engineer. */ +"Untitled" = "بدون عنوان"; + +/* No comment provided by engineer. */ +"Web Page" = "صفحة ويب"; + +/* No comment provided by engineer. */ +"With access to pro features" = "مع صلاحية استخدام للميزات المدفوعة"; + +/* No comment provided by engineer. */ +"Word 97-2003 Document" = "مستند وورد 97-2003 (*.doc)"; + +/* No comment provided by engineer. */ +"Word 2007 Document" = "مستند وورد (*.docx)"; + +/* No comment provided by engineer. */ +"XML Paper Specification" = "مستند أوبن إكس بي إس (*.xps)"; + +/* No comment provided by engineer. */ +"Yes" = "نعم"; + +/* No comment provided by engineer. */ +"You have %ld %@ documents with unconfirmed changes. Do you want to review these changes before quitting?" = "لديك %1$ld %2$@ مستندات بتغييرات غير مؤكدة. هل تريد مراجعة التغييرات قبل الخروج؟"; + +/* No comment provided by engineer. */ +"You have successfully activated %@." = "لقد تم تفعيل %@."; + +/* No comment provided by engineer. */ +"Your changes will be lost if you don’t save them." = "سوف يتم فقد التغييرات إن لم تقم بالحفظ."; + +/* No comment provided by engineer. */ +"Your subscription has expired.\n\nThe program works in the non-activated mode.\n\nNow you can prolong or upgrade your subscription with a discount." = "لقد انتهى اشتراكك.\n\nالبرنامج يعمل في وضع عدم التفعيل.\n\nالآن يمكنك تجديد أو تطوير اشتراكك مع خصم."; + +/* No comment provided by engineer. */ +"Your subscription is about to expire\n(%d days left).\n\nWe have a special offer for you." = "اشتراكك على وشك الانتهاء\n(%d أيام متبقية).\n\nلدينا عرض خاص لك."; + diff --git a/macos/ONLYOFFICE/ar-SA.lproj/Localizable.stringsdict b/macos/ONLYOFFICE/ar-SA.lproj/Localizable.stringsdict new file mode 100644 index 000000000..5e7dd4c47 --- /dev/null +++ b/macos/ONLYOFFICE/ar-SA.lproj/Localizable.stringsdict @@ -0,0 +1,85 @@ + + + + + %d days are left until the license expiration. + + NSStringLocalizedFormatKey + %#@أيام@ + days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + few + %d days are left until the license expiration. + many + %d days are left until the license expiration. + one + %d يوم متبقي لانتهاء الترخيص. + other + %d أيام متبقية لانتهاء الترخيص. + two + %d days are left until the license expiration. + zero + %d days are left until the license expiration. + + + You are using a trial version of the application. +The trial period will end in %d days, after that you will not be able to create and edit documents. + + NSStringLocalizedFormatKey + %#@أيام@ + days + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + few + You are using a trial version of the application. +The trial period will end in %d days, after that you will not be able to create and edit documents. + many + You are using a trial version of the application. +The trial period will end in %d days, after that you will not be able to create and edit documents. + one + أنت تستخدم نسخة تجريبية من التطبيق. +مدة التجريب ستنتهي بعد %d يوم، بعدها لن تستطيع أن تنشئ أو تعدل على المستندات. + other + أنت تستخدم نسخة تجريبية من التطبيق. +مدة التجريب ستنتهي بعد %d أيام، بعدها لن تستطيع أن تنشئ أو تعدل على المستندات. + two + You are using a trial version of the application. +The trial period will end in %d days, after that you will not be able to create and edit documents. + zero + You are using a trial version of the application. +The trial period will end in %d days, after that you will not be able to create and edit documents. + + + You have %ld %@ documents with unconfirmed changes. Do you want to review these changes before quitting? + + NSStringLocalizedFormatKey + %#@مستندات@ + documents + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + ld + few + You have %ld %@ documents with unconfirmed changes. Do you want to review these changes before quitting? + many + You have %ld %@ documents with unconfirmed changes. Do you want to review these changes before quitting? + one + لديك %ld %@ مستند بتغييرات غير مؤكدة. هل تريد مراجعة التغييرات قبل الخروج؟ + other + لديك %ld %@ مستندات بتغييرات غير مؤكدة. هل تريد مراجعة التغييرات قبل الخروج؟ + two + You have %ld %@ documents with unconfirmed changes. Do you want to review these changes before quitting? + zero + You have %ld %@ documents with unconfirmed changes. Do you want to review these changes before quitting? + + + + diff --git a/macos/ONLYOFFICE/ar-SA.lproj/Main.strings b/macos/ONLYOFFICE/ar-SA.lproj/Main.strings new file mode 100644 index 000000000..c7bf380b8 --- /dev/null +++ b/macos/ONLYOFFICE/ar-SA.lproj/Main.strings @@ -0,0 +1,456 @@ +/* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */ +"1b7-l0-nxx.title" = "بحث"; + +/* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */ +"1tx-W0-xDw.title" = "تصغير"; + +/* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */ +"1UK-8n-QPP.title" = "تخصيص شريط الأدوات"; + +/* Class = "NSMenuItem"; title = "ONLYOFFICE"; ObjectID = "1Xt-HY-uBw"; */ +"1Xt-HY-uBw.title" = "أونلي أوفيس"; + +/* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */ +"2h7-ER-AoG.title" = "رفع"; + +/* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */ +"2oI-Rn-ZJC.title" = "تحويلات"; + +/* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */ +"3IN-sU-3Bg.title" = "إملاء"; + +/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */ +"3Om-Ey-2VK.title" = "استخدم الافتراضي"; + +/* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */ +"3rS-ZA-NoH.title" = "تحدُّث"; + +/* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */ +"4EN-yA-p0u.title" = "بحث"; + +/* Class = "NSMenuItem"; title = "License Agreement"; ObjectID = "4et-TX-a4m"; */ +"4et-TX-a4m.title" = "الموافقة على الترخيص"; + +/* Class = "NSMenuItem"; title = "Quit ONLYOFFICE"; ObjectID = "4sb-4s-VLi"; */ +"4sb-4s-VLi.title" = "خروج من أونلي أوفيس"; + +/* Class = "NSMenuItem"; title = "About ONLYOFFICE"; ObjectID = "5kV-Vb-QxS"; */ +"5kV-Vb-QxS.title" = "عن أونلي أوفيس"; + +/* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */ +"5QF-Oa-p0T.title" = "تعديل"; + +/* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */ +"5Vv-lz-BsD.title" = "نسخ التنسيق"; + +/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */ +"6dh-zS-Vam.title" = "إعادة"; + +/* Class = "NSButtonCell"; title = "License agreement"; ObjectID = "8Ga-Cu-VGe"; */ +"8Ga-Cu-VGe.title" = "الموافقة على الترخيص"; + +/* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */ +"8mr-sm-Yjd.title" = "اتجاه الكتابة"; + +/* Class = "NSMenuItem"; title = "New"; ObjectID = "9aQ-wl-gjS"; */ +"9aQ-wl-gjS.title" = "جديد"; + +/* Class = "NSTextFieldCell"; title = "none"; ObjectID = "9i7-kj-42B"; */ +"9i7-kj-42B.title" = "لا شيء"; + +/* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */ +"9ic-FL-obx.title" = "بدائل"; + +/* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */ +"9yt-4B-nSM.title" = "نسخ/لصق ذكي"; + +/* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */ +"46P-cB-AYj.title" = "تضييق"; + +/* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */ +"78Y-hA-62v.title" = "تصحيح تلقائي"; + +/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */ +"agt-UL-0e3.title" = "استخدم الافتراضي"; + +/* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */ +"aTl-1u-JFS.title" = "طباعة..."; + +/* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ +"aUF-d1-5bR.title" = "نافذة"; + +/* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */ +"aXa-aM-Jaq.title" = "خط"; + +/* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ +"AYu-sK-qS6.title" = "القائمة الرئيسية"; + +/* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */ +"BgM-ve-c93.title" = "\tمن اليسار إلى اليمين"; + +/* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */ +"bgn-CT-cEk.title" = "إظهار الألوان"; + +/* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */ +"bib-Uj-vzu.title" = "ملف"; + +/* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ +"BOF-NM-1cW.title" = "تفضيلات..."; + +/* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */ +"buJ-ug-pKt.title" = "استخدم النص المحدد للبحث"; + +/* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */ +"Bw7-FT-i3A.title" = "حفظ باسم..."; + +/* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */ +"c8a-y6-VQd.title" = "تحويلات"; + +/* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */ +"cDB-IK-hbR.title" = "استخدم لا شيء"; + +/* Class = "NSMenuItem"; title = "Acknowledgments"; ObjectID = "CJU-dx-a9l"; */ +"CJU-dx-a9l.title" = "شكر وتقدير لـ"; + +/* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */ +"cqv-fj-IhA.title" = "اختيار"; + +/* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */ +"cwL-P1-jid.title" = "الروابط الذكية"; + +/* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */ +"d9c-me-L2H.title" = "نص"; + +/* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */ +"d9M-CD-aMd.title" = "تصغير الأحرف الإنجليزية"; + +/* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */ +"dMs-cI-mzQ.title" = "ملف"; + +/* Class = "NSMenuItem"; title = "Spreadsheet"; ObjectID = "DOj-j9-dza"; */ +"DOj-j9-dza.title" = "جدول"; + +/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */ +"dRJ-4n-Yzg.title" = "تراجع"; + +/* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */ +"Dv1-io-Yv7.title" = "تدقيق وإملاء"; + +/* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */ +"DVo-aG-piG.title" = "إغلاق"; + +/* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ +"F2S-fz-NVQ.title" = "مساعدة"; + +/* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */ +"Fal-I4-PZk.title" = "نص"; + +/* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */ +"FeM-D8-WVr.title" = "بدائل"; + +/* Class = "NSMenuItem"; title = "Product Help"; ObjectID = "FKE-Sm-Kum"; */ +"FKE-Sm-Kum.title" = "مساعدة حول المنتج"; + +/* Class = "NSTextFieldCell"; title = "User Name"; ObjectID = "FoF-wl-Dxi"; */ +"FoF-wl-Dxi.title" = "اسم المستخدم"; + +/* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */ +"GB9-OM-e27.title" = "عريض"; + +/* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */ +"GEO-Iw-cKr.title" = "تنسيق"; + +/* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */ +"Gi5-1S-RQB.title" = "خط"; + +/* Class = "NSTextFieldCell"; title = "File Name"; ObjectID = "gm3-6i-EnL"; */ +"gm3-6i-EnL.title" = "اسم الملف"; + +/* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */ +"GUa-eO-cwY.title" = "استخدم الافتراضي"; + +/* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */ +"gVA-U4-sdL.title" = "لصق"; + +/* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */ +"H1b-Si-o9J.title" = "اتجاه الكتابة"; + +/* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */ +"H8h-7b-M4v.title" = "عرض"; + +/* Class = "NSMenu"; title = "New"; ObjectID = "hD5-Cz-ItX"; */ +"hD5-Cz-ItX.title" = "جديد"; + +/* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */ +"HFo-cy-zxI.title" = "إظهار التدقيق الإملائي"; + +/* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */ +"HFQ-gK-NFA.title" = "استبدال نص"; + +/* Class = "NSMenuItem"; title = "Presentation"; ObjectID = "hkB-TU-Ps1"; */ +"hkB-TU-Ps1.title" = "عرض"; + +/* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */ +"hQb-2v-fYv.title" = "الاقتباسات الذكية"; + +/* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */ +"HyV-fh-RgO.title" = "عرض"; + +/* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */ +"hz2-CU-CR7.title" = "التحقق من المستند الآن"; + +/* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ +"hz9-B4-Xy5.title" = "خدمات"; + +/* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */ +"I0S-gh-46l.title" = "تحت السطر"; + +/* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */ +"i1d-Er-qST.title" = "أصغر"; + +/* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */ +"IAo-SY-fd9.title" = "فتح..."; + +/* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */ +"ijk-EB-dga.title" = "على السطر"; + +/* Class = "NSWindow"; title = "ONLYOFFICE"; ObjectID = "IQv-IB-iLA"; */ +"IQv-IB-iLA.title" = "أونلي أوفيس"; + +/* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */ +"J5U-5w-g23.title" = "ضبط النص"; + +/* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */ +"J7y-lM-qPV.title" = "استخدم لا شيء"; + +/* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */ +"jBQ-r6-VK2.title" = "المسافة بين الأحرف"; + +/* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */ +"jFq-tB-4Kx.title" = "\tمن اليمين إلى اليسار"; + +/* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */ +"jxT-CU-nIS.title" = "تنسيق"; + +/* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */ +"KaW-ft-85H.title" = "الرجوع إلى ما تم حفظه"; + +/* Class = "NSTabViewItem"; label = "ONLYOFFICE"; ObjectID = "kcg-El-49G"; */ +"kcg-El-49G.label" = "أونلي أوفيس"; + +/* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ +"Kd2-mp-pUS.title" = "إظهار الكل"; + +/* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */ +"Lbh-J2-qVU.title" = "\tمن اليسار إلى اليمين"; + +/* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ +"LE2-aR-0XJ.title" = "عرض الكل إلى الأمام"; + +/* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */ +"LVM-kO-fVI.title" = "لصق المسطرة"; + +/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "m0C-e9-0oc"; */ +"m0C-e9-0oc.title" = "إلغاء"; + +/* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */ +"mK6-2p-4JG.title" = "التحقق من الإملاء"; + +/* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */ +"MkV-Pr-PK5.title" = "نسخ المسطرة"; + +/* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ +"NMo-om-nkz.title" = "خدمات"; + +/* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */ +"Nop-cj-93Q.title" = "\tافتراضي"; + +/* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */ +"o6e-r0-MWq.title" = "الوصلات الكتابية"; + +/* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */ +"OaQ-X3-Vso.title" = "على السطر"; + +/* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */ +"oas-Oc-fiZ.title" = "فتح المستجدّات"; + +/* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */ +"ogc-rX-tC1.title" = "توسيع"; + +/* Class = "NSMenuItem"; title = "Hide ONLYOFFICE"; ObjectID = "Olw-nP-bQN"; */ +"Olw-nP-bQN.title" = "إخفاء أونلي أوفيس"; + +/* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */ +"OwM-mh-QMV.title" = "بحث للسابق"; + +/* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ +"OY7-WF-poV.title" = "تصغير"; + +/* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */ +"Oyz-dy-DGm.title" = "أوقف التحدُّث"; + +/* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */ +"pa3-QI-u2k.title" = "حذف"; + +/* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */ +"Ptp-SP-VEL.title" = "أكبر"; + +/* Class = "NSMenuItem"; title = "Save"; ObjectID = "pxx-59-PXV"; */ +"pxx-59-PXV.title" = "حفظ"; + +/* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */ +"Q5e-8K-NDq.title" = "إظهار الخطوط"; + +/* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */ +"q09-fT-Sye.title" = "بحث للتالي"; + +/* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */ +"qIS-W8-SiK.title" = "تهيئة الصفحة..."; + +/* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ +"R4o-n2-Eq4.title" = "تكبير"; + +/* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */ +"RB4-Sm-HuC.title" = "\tمن اليمين إلى اليسار"; + +/* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */ +"rbD-Rh-wIN.title" = "التحقق من الإملاء أثناء الكتابة"; + +/* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */ +"rgM-f4-ycn.title" = "الشرطات الذكية"; + +/* Class = "NSButtonCell"; title = "Close"; ObjectID = "Riu-oE-8dj"; */ +"Riu-oE-8dj.title" = "إغلاق"; + +/* Class = "NSTextFieldCell"; title = "none"; ObjectID = "Rkd-xb-FRJ"; */ +"Rkd-xb-FRJ.title" = "لا شيء"; + +/* Class = "NSButtonCell"; title = "Logout"; ObjectID = "RmO-tv-UKh"; */ +"RmO-tv-UKh.title" = "تسجيل الخروج"; + +/* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */ +"Rqc-34-cIF.title" = "فوق السطر"; + +/* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */ +"Ruw-6m-B2m.title" = "اختيار الكل"; + +/* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */ +"S0p-oC-mLd.title" = "القفز إلى المكان المختار"; + +/* Class = "NSTextFieldCell"; title = "Copyright info"; ObjectID = "sGd-zc-V0B"; */ +"sGd-zc-V0B.title" = "حول حقوق التأليف والنشر"; + +/* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */ +"snW-S8-Cw5.title" = "إظهار شريط الأدوات"; + +/* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ +"Td7-aD-5lo.title" = "نافذة"; + +/* Class = "NSMenuItem"; title = "Document"; ObjectID = "TEm-B8-gsH"; */ +"TEm-B8-gsH.title" = "مستند"; + +/* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */ +"tlD-Oa-oAM.title" = "المسافة بين الأحرف"; + +/* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */ +"tRr-pd-1PS.title" = "مكتشف البيانات"; + +/* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */ +"tXI-mr-wws.title" = "فتح المستجدّات"; + +/* Class = "NSMenuItem"; title = "Check for Updates…"; ObjectID = "ud7-wC-A79"; */ +"ud7-wC-A79.title" = "التحقق من التحديثات..."; + +/* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */ +"UEZ-Bs-lqG.title" = "تكبير الحروف الإنجليزية الأولى من كل كلمة"; + +/* Class = "NSMenu"; title = "ONLYOFFICE"; ObjectID = "uQy-DD-JDr"; */ +"uQy-DD-JDr.title" = "أونلي أوفيس"; + +/* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */ +"uRl-iY-unG.title" = "قص"; + +/* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ +"Vdr-fp-XzO.title" = "إخفاء آخَر"; + +/* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */ +"VIY-Ag-zcb.title" = "توسيط"; + +/* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */ +"Vjx-xi-njq.title" = "مائل"; + +/* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */ +"vKC-jM-MkH.title" = "لصق التنسيق"; + +/* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */ +"vLm-3I-IUL.title" = "إظهار المسطرة"; + +/* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */ +"vmV-6d-7jI.title" = "تكبير الأحرف الإنجليزية"; + +/* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */ +"vNY-rz-j42.title" = "إخلاء القائمة"; + +/* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */ +"w0m-vy-SC9.title" = "الوصلات الكتابية"; + +/* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */ +"W48-6f-4Dl.title" = "تعديل"; + +/* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */ +"wb2-vD-lq4.title" = "محاذاة لليمين"; + +/* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */ +"WeT-3V-zwk.title" = "لصق ومطابقة التنسيق"; + +/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "wpe-8d-5DV"; */ +"wpe-8d-5DV.title" = "خلية نص"; + +/* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ +"wpr-3q-Mcd.title" = "مساعدة"; + +/* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */ +"WRG-CD-K1S.title" = "تسطير"; + +/* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */ +"x3v-GG-iWU.title" = "نسخ"; + +/* Class = "NSTextFieldCell"; title = "Product"; ObjectID = "xCO-ey-2lo"; */ +"xCO-ey-2lo.title" = "منتج"; + +/* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */ +"xQD-1f-W4t.title" = "استخدم الكل"; + +/* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */ +"xrE-MZ-jX0.title" = "تحدُّث"; + +/* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */ +"Xz5-n4-O0W.title" = "بحث..."; + +/* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */ +"YEy-JH-Tfz.title" = "بحث واستبدال..."; + +/* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */ +"YGs-j5-SAR.title" = "\tافتراضي"; + +/* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */ +"Ynk-f8-cLZ.title" = "ابدأ التحدُّث"; + +/* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */ +"z6F-FW-3nz.title" = "إظهار البدائل"; + +/* Class = "NSTextFieldCell"; title = "Version"; ObjectID = "ZbA-hc-8PE"; */ +"ZbA-hc-8PE.title" = "نسخة"; + +/* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */ +"ZM1-6Q-yy1.title" = "محاذاة لليسار"; + +/* Class = "NSTextFieldCell"; title = "Email:"; ObjectID = "Zsi-3o-ASl"; */ +"Zsi-3o-ASl.title" = "البريد الإلكتروني:"; + +/* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */ +"ZvO-Gk-QUH.title" = "قطعة"; + +/* Class = "NSTextFieldCell"; title = "Portal:"; ObjectID = "zwS-9G-S0N"; */ +"zwS-9G-S0N.title" = "البوابة السحابية:"; + diff --git a/macos/ONLYOFFICE/ar-SA.lproj/MoveApplication.strings b/macos/ONLYOFFICE/ar-SA.lproj/MoveApplication.strings new file mode 100644 index 000000000..fb906767d --- /dev/null +++ b/macos/ONLYOFFICE/ar-SA.lproj/MoveApplication.strings @@ -0,0 +1,24 @@ +/* No comment provided by engineer. */ +"Could not move to Applications folder" = "غير قادر على النقل إلى مجلد التطبيقات"; + +/* No comment provided by engineer. */ +"Do Not Move" = "لا تحرّك"; + +/* No comment provided by engineer. */ +"I can move myself to the Applications folder if you'd like." = "أستطيع نقل نفسي إلى ملف التطبيقات إذا أردت."; + +/* No comment provided by engineer. */ +"Move to Applications Folder" = "نقل إلى مجلد التطبيقات"; + +/* No comment provided by engineer. */ +"Move to Applications folder in your Home folder?" = "نقل إلى مجلد التطبيقات داخل مجلد المنزل؟"; + +/* No comment provided by engineer. */ +"Move to Applications folder?" = "نقل إلى مجلد التطبيقات؟"; + +/* No comment provided by engineer. */ +"Note that this will require an administrator password." = "لاحظ أن هذه العملية تتطلب كلمة مرور المسؤول"; + +/* No comment provided by engineer. */ +"This will keep your Downloads folder uncluttered." = "هذا سيبقي ملف التحميلات مرتبًا"; + diff --git a/macos/ONLYOFFICE/ar-SA.lproj/Presentation-Reporter.strings b/macos/ONLYOFFICE/ar-SA.lproj/Presentation-Reporter.strings new file mode 100644 index 000000000..d6db32615 --- /dev/null +++ b/macos/ONLYOFFICE/ar-SA.lproj/Presentation-Reporter.strings @@ -0,0 +1,3 @@ +/* Class = "NSWindow"; title = "Reporter Window"; ObjectID = "Ygx-5K-Hn8"; */ +"Ygx-5K-Hn8.title" = "نافذة الإبلاغ"; + From 1e38314f4b97c5fed3f85871d9df27dea4568584 Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Tue, 12 Dec 2023 14:04:38 +0300 Subject: [PATCH 020/316] added translations --- .../extras/update-daemon/res/langs/langs.iss | 236 +++++++++++++++++- 1 file changed, 235 insertions(+), 1 deletion(-) diff --git a/win-linux/extras/update-daemon/res/langs/langs.iss b/win-linux/extras/update-daemon/res/langs/langs.iss index 2f1b72162..5e56cc16c 100644 --- a/win-linux/extras/update-daemon/res/langs/langs.iss +++ b/win-linux/extras/update-daemon/res/langs/langs.iss @@ -7,6 +7,19 @@ es.CAPTION_TEXT =Servicio de actualización de ONLYOFFICE fr.CAPTION_TEXT =Service de mise à jour ONLYOFFICE it.CAPTION_TEXT =Servizio di aggiornamento ONLYOFFICE pt_BR.CAPTION_TEXT =Serviço de atualização ONLYOFFICE +zh_CN.CAPTION_TEXT =ONLYOFFICE 更新服务 +bg.CAPTION_TEXT =ONLYOFFICE Услуга за Актуализации +cs.CAPTION_TEXT =Aktualizační služba ONLYOFFICE +el.CAPTION_TEXT =Υπηρεσία ενημέρωσης ONLYOFFICE +hy.CAPTION_TEXT =ONLYOFFICE-ի թարմացման ծառայություն +ko.CAPTION_TEXT =ONLYOFFICE 업데이트 서비스 +lv.CAPTION_TEXT =ONLYOFFICE atjaunināšanas pakalpojums +nl.CAPTION_TEXT =ONLYOFFICE Update Service +pl.CAPTION_TEXT =Usługa aktualizacji ONLYOFFICE +pt_PT.CAPTION_TEXT =Serviço de atualização ONLYOFFICE +sl.CAPTION_TEXT =Storitev posodabljanja ONLYOFFICE +tr.CAPTION_TEXT =ONLYOFFICE Güncelleme Hizmeti +uk.CAPTION_TEXT =Служба оновлень ONLYOFFICE en.MESSAGE_TEXT_ERR1 =An error occurred: ru.MESSAGE_TEXT_ERR1 =Произошла ошибка: @@ -16,6 +29,19 @@ es.MESSAGE_TEXT_ERR1 =Se ha producido un error: fr.MESSAGE_TEXT_ERR1 =Une erreur s'est produite : it.MESSAGE_TEXT_ERR1 =Si è verificato un errore: pt_BR.MESSAGE_TEXT_ERR1 =Um erro ocorreu: +zh_CN.MESSAGE_TEXT_ERR1 =发生错误: +bg.MESSAGE_TEXT_ERR1 =Възникна грешка: +cs.MESSAGE_TEXT_ERR1 =Došlo k chybě: +el.MESSAGE_TEXT_ERR1 =Εμφανίστηκε σφάλμα: +hy.MESSAGE_TEXT_ERR1 =Սխալ է տեղի ունեցել․ +ko.MESSAGE_TEXT_ERR1 =오류가 발생했습니다: +lv.MESSAGE_TEXT_ERR1 =Radās kļūda: +nl.MESSAGE_TEXT_ERR1 =Er is een fout opgetreden: +pl.MESSAGE_TEXT_ERR1 =Wystąpił błąd: +pt_PT.MESSAGE_TEXT_ERR1 =Um erro ocorreu: +sl.MESSAGE_TEXT_ERR1 =Pojavila se je napaka: +tr.MESSAGE_TEXT_ERR1 =Bir hata oluştu: +uk.MESSAGE_TEXT_ERR1 =Сталася помилка: en.MESSAGE_TEXT_ERR2 =An error occurred while deleting: ru.MESSAGE_TEXT_ERR2 =Произошла ошибка при удалении: @@ -25,6 +51,19 @@ es.MESSAGE_TEXT_ERR2 =Se ha producido un error al eliminar: fr.MESSAGE_TEXT_ERR2 =Une erreur s'est produite lors de la suppression : it.MESSAGE_TEXT_ERR2 =Si è verificato un errore durante l'eliminazione: pt_BR.MESSAGE_TEXT_ERR2 =Ocorreu um erro ao excluir: +zh_CN.MESSAGE_TEXT_ERR2 =删除时出错: +bg.MESSAGE_TEXT_ERR2 =Възникна грешка при изтриването: +cs.MESSAGE_TEXT_ERR2 =Při mazání došlo k chybě: +el.MESSAGE_TEXT_ERR2 =Προέκυψε σφάλμα κατά τη διαγραφή: +hy.MESSAGE_TEXT_ERR2 =Ջնջելիս սխալ է տեղի ունեցել՝ +ko.MESSAGE_TEXT_ERR2 =삭제하는 동안 오류가 발생했습니다: +lv.MESSAGE_TEXT_ERR2 =Dzēšot, radās kļūda: +nl.MESSAGE_TEXT_ERR2 =Er is een fout opgetreden tijdens het verwijderen: +pl.MESSAGE_TEXT_ERR2 =Wystąpił błąd podczas usuwania: +pt_PT.MESSAGE_TEXT_ERR2 =Ocorreu um erro ao excluir: +sl.MESSAGE_TEXT_ERR2 =Pojavila se je napaka med brisanjem: +tr.MESSAGE_TEXT_ERR2 =Silinirken bir hata oluştu: +uk.MESSAGE_TEXT_ERR2 =Сталася помилка під час видалення: en.MESSAGE_TEXT_ERR3 =An error occurred while creating: ru.MESSAGE_TEXT_ERR3 =Произошла ошибка при создании: @@ -34,6 +73,19 @@ es.MESSAGE_TEXT_ERR3 =Se ha producido un error al crear: fr.MESSAGE_TEXT_ERR3 =Une erreur s'est produite lors de la création : it.MESSAGE_TEXT_ERR3 =Si è verificato un errore durante la creazione: pt_BR.MESSAGE_TEXT_ERR3 =Ocorreu um erro ao criar: +zh_CN.MESSAGE_TEXT_ERR3 =创建时出错: +bg.MESSAGE_TEXT_ERR3 =Възникна грешка при създаването: +cs.MESSAGE_TEXT_ERR3 =Při vytváření došlo k chybě: +el.MESSAGE_TEXT_ERR3 =Εμφανίστηκε σφάλμα κατά τη δημιουργία: +hy.MESSAGE_TEXT_ERR3 =Սխալ է տեղի ունեցել ստեղծելիս՝ +ko.MESSAGE_TEXT_ERR3 =생성하는 동안 오류가 발생했습니다: +lv.MESSAGE_TEXT_ERR3 =Radās kļūda, veidojot: +nl.MESSAGE_TEXT_ERR3 =Er is een fout opgetreden tijdens het aanmaken: +pl.MESSAGE_TEXT_ERR3 =Wystąpił błąd podczas tworzenia: +pt_PT.MESSAGE_TEXT_ERR3 =Ocorreu um erro ao criar: +sl.MESSAGE_TEXT_ERR3 =Pojavila se je napaka md ustvarjanjem: +tr.MESSAGE_TEXT_ERR3 =Oluşturulurken bir hata oluştu: +uk.MESSAGE_TEXT_ERR3 =Сталася помилка під час створення: en.MESSAGE_TEXT_ERR4 =An error occurred while restarting the service! ru.MESSAGE_TEXT_ERR4 =Произошла ошибка при перезапуске сервиса! @@ -43,6 +95,19 @@ es.MESSAGE_TEXT_ERR4 =¡Se ha producido un error al reiniciar el servicio! fr.MESSAGE_TEXT_ERR4 =Une erreur s'est produite lors du redémarrage du service ! it.MESSAGE_TEXT_ERR4 =Si è verificato un errore durante il riavvio del servizio! pt_BR.MESSAGE_TEXT_ERR4 =Ocorreu um erro ao reiniciar o serviço! +zh_CN.MESSAGE_TEXT_ERR4 =重新启动服务时出错! +bg.MESSAGE_TEXT_ERR4 =Възникна грешка при рестартирането на услугата! +cs.MESSAGE_TEXT_ERR4 =Při restartování služby došlo k chybě! +el.MESSAGE_TEXT_ERR4 =Εμφανίστηκε σφάλμα κατά την επανεκκίνηση της υπηρεσίας! +hy.MESSAGE_TEXT_ERR4 =Սխալ է տեղի ունեցել ծառայությունը վերագործարկելիս․ +ko.MESSAGE_TEXT_ERR4 =서비스를 다시 시작하는 동안 오류가 발생했습니다! +lv.MESSAGE_TEXT_ERR4 =Restartējot pakalpojumu, radās kļūda! +nl.MESSAGE_TEXT_ERR4 =Er is een fout opgetreden tijdens het opnieuw opstarten van de service! +pl.MESSAGE_TEXT_ERR4 =Wystąpił błąd podczas ponownego uruchamiania usługi! +pt_PT.MESSAGE_TEXT_ERR4 =Ocorreu um erro ao reiniciar o serviço! +sl.MESSAGE_TEXT_ERR4 =Med ponovnim zagonom storitve je prišlo do napake! +tr.MESSAGE_TEXT_ERR4 =Hizmet yeniden başlatılırken bir hata oluştu! +uk.MESSAGE_TEXT_ERR4 =Сталася помилка під час перезапуску служби! en.MESSAGE_TEXT_ERR5 =Update cancelled. Can't find folder: ru.MESSAGE_TEXT_ERR5 =Обновление отменено. Не удалось найти папку: @@ -52,6 +117,19 @@ es.MESSAGE_TEXT_ERR5 =Actualización cancelada. No se puede encontrar la carpeta fr.MESSAGE_TEXT_ERR5 =Mise à jour annulée. Impossible de trouver le dossier : it.MESSAGE_TEXT_ERR5 =Aggiornamento annullato. Impossibile trovare la cartella: pt_BR.MESSAGE_TEXT_ERR5 =Atualização cancelada. Não foi possível encontrar a pasta: +zh_CN.MESSAGE_TEXT_ERR5 =更新已取消。找不到文件夹: +bg.MESSAGE_TEXT_ERR5 =Актуализацията е отменена. Не откриваме папка: +cs.MESSAGE_TEXT_ERR5 =Aktualizace byla zrušena. Nelze najít složku: +el.MESSAGE_TEXT_ERR5 =Η ενημέρωση ακυρώθηκε. Δεν μπορεί να βρεθεί ο φάκελος: +hy.MESSAGE_TEXT_ERR5 =Թարմացումը չեղարկվել է: Թղթապանակը չի գտնվել՝ +ko.MESSAGE_TEXT_ERR5 =업데이트가 취소되었습니다. 폴더를 찾을 수 없습니다: +lv.MESSAGE_TEXT_ERR5 =Atjaunināšana ir atcelta. Nevar atrast mapi: +nl.MESSAGE_TEXT_ERR5 =Update geannuleerd. Kan map niet vinden: +pl.MESSAGE_TEXT_ERR5 =Aktualizacja została anulowana. Nie można znaleźć katalogu: +pt_PT.MESSAGE_TEXT_ERR5 =Atualização cancelada. Não foi possível encontrar a pasta: +sl.MESSAGE_TEXT_ERR5 =Posodobitev preklicana. Ne najdem mape: +tr.MESSAGE_TEXT_ERR5 =Güncelleme iptal edildi. Klasör bulunamıyor: +uk.MESSAGE_TEXT_ERR5 =Оновлення скасовано. Не вдається знайти папку: en.MESSAGE_TEXT_ERR6 =Update cancelled. The file signature is missing: ru.MESSAGE_TEXT_ERR6 =Обновление отменено. Отсутствует подпись файла: @@ -61,6 +139,19 @@ es.MESSAGE_TEXT_ERR6 =Actualización cancelada. No hay firma del archivo: fr.MESSAGE_TEXT_ERR6 =Mise à jour annulée. La signature du fichier est manquante : it.MESSAGE_TEXT_ERR6 =Aggiornamento annullato. Manca la firma del file: pt_BR.MESSAGE_TEXT_ERR6 =Atualização cancelada. A assinatura do arquivo está faltando: +zh_CN.MESSAGE_TEXT_ERR6 =更新已取消。 文件签名丢失: +bg.MESSAGE_TEXT_ERR6 =Актуализацията е отменена. Подписът на файла липсва: +cs.MESSAGE_TEXT_ERR6 =Aktualizace zrušena. Chybí podpis souboru: +el.MESSAGE_TEXT_ERR6 =Η ενημέρωση ακυρώθηκε. Λείπει η υπογραφή του αρχείου: +hy.MESSAGE_TEXT_ERR6 =Թարմացումը չեղարկվել է: Ֆայլի ստորագրությունը բացակայում է․ +ko.MESSAGE_TEXT_ERR6 =업데이트가 취소되었습니다. 파일 서명이 누락되었습니다: +lv.MESSAGE_TEXT_ERR6 =Atjaunināšana ir atcelta. Trūkst faila paraksta: +nl.MESSAGE_TEXT_ERR6 =Update geannuleerd. De bestandsondertekening ontbreekt: +pl.MESSAGE_TEXT_ERR6 =Aktualizacja została anulowana. Brak podpisu pliku: +pt_PT.MESSAGE_TEXT_ERR6 =Atualização cancelada. A assinatura do arquivo está faltando: +sl.MESSAGE_TEXT_ERR6 =Posodobitev preklicana. Manjka podpis datoteke: +tr.MESSAGE_TEXT_ERR6 =Güncelleme iptal edildi. Dosya imzası eksik: +uk.MESSAGE_TEXT_ERR6 =Оновлення скасовано. Відсутній підпис файлу: en.MESSAGE_TEXT_ERR7 =Update cancelled. Can't delete folder: ru.MESSAGE_TEXT_ERR7 =Обновление отменено. Не удалось удалить папку: @@ -70,6 +161,19 @@ es.MESSAGE_TEXT_ERR7 =Actualización cancelada. No se puede eliminar la carpeta: fr.MESSAGE_TEXT_ERR7 =Mise à jour annulée. Impossible de supprimer le dossier : it.MESSAGE_TEXT_ERR7 =Aggiornamento annullato. Impossibile eliminare la cartella: pt_BR.MESSAGE_TEXT_ERR7 =Atualização cancelada. Não é possível excluir a pasta: +zh_CN.MESSAGE_TEXT_ERR7 =更新已取消。 无法删除文件夹: +bg.MESSAGE_TEXT_ERR7 =Актуализацията е отменена. Папката не може да се изтрие: +cs.MESSAGE_TEXT_ERR7 =Aktualizace zrušena. Nelze smazat složku: +el.MESSAGE_TEXT_ERR7 =Η ενημέρωση ακυρώθηκε. Δεν είναι δυνατή η διαγραφή φακέλου: +hy.MESSAGE_TEXT_ERR7 =Թարմացումը չեղարկվել է: Հնարավոր չէ ջնջել պանակը՝ +ko.MESSAGE_TEXT_ERR7 =업데이트가 취소되었습니다. 폴더를 삭제할 수 없습니다: +lv.MESSAGE_TEXT_ERR7 =Atjaunināšana ir atcelta. Nevar izdzēst mapi: +nl.MESSAGE_TEXT_ERR7 =Update geannuleerd. Kan map niet verwijderen: +pl.MESSAGE_TEXT_ERR7 =Aktualizacja została anulowana. Nie można usunąć katalogu: +pt_PT.MESSAGE_TEXT_ERR7 =Atualização cancelada. Não é possível excluir a pasta: +sl.MESSAGE_TEXT_ERR7 =Posodobitev preklicana. Mape ni mogoče izbrisati: +tr.MESSAGE_TEXT_ERR7 =Güncelleme iptal edildi. Klasör silinemiyor: +uk.MESSAGE_TEXT_ERR7 =Оновлення скасовано. Не вдається видалити папку: en.MESSAGE_TEXT_ERR8 =Update cancelled. The program is not closed: ru.MESSAGE_TEXT_ERR8 =Обновление отменено. Приложение не закрыто: @@ -79,6 +183,19 @@ es.MESSAGE_TEXT_ERR8 =Actualización cancelada. El programa no está cerrado: fr.MESSAGE_TEXT_ERR8 =Mise à jour annulée. L'application n'est pas fermée : it.MESSAGE_TEXT_ERR8 =Aggiornamento annullato. Il programma non è chiuso: pt_BR.MESSAGE_TEXT_ERR8 =Atualização cancelada. O programa não está fechado: +zh_CN.MESSAGE_TEXT_ERR8 =更新已取消。 程序未关闭: +bg.MESSAGE_TEXT_ERR8 =Актуализацията е отменена. Програмата не е затворена: +cs.MESSAGE_TEXT_ERR8 =Aktualizace zrušena. Program není uzavřen: +el.MESSAGE_TEXT_ERR8 =Η ενημέρωση ακυρώθηκε. Το πρόγραμμα δεν έχει κλείσει: +hy.MESSAGE_TEXT_ERR8 =Թարմացումը չեղարկվել է: Ծրագիրը փակված չէ։ +ko.MESSAGE_TEXT_ERR8 =업데이트가 취소되었습니다. 프로그램이 종료되지 않았습니다: +lv.MESSAGE_TEXT_ERR8 =Atjaunināšana ir atcelta. Programma nav aizvērta: +nl.MESSAGE_TEXT_ERR8 =Update geannuleerd. Het programma is niet afgesloten: +pl.MESSAGE_TEXT_ERR8 =Aktualizacja została anulowana. Program nie jest zamknięty: +pt_PT.MESSAGE_TEXT_ERR8 =Atualização cancelada. O programa não está fechado: +sl.MESSAGE_TEXT_ERR8 =Posodobitev preklicana. Program ni zaprt: +tr.MESSAGE_TEXT_ERR8 =Güncelleme iptal edildi. Program kapalı değil: +uk.MESSAGE_TEXT_ERR8 =Оновлення скасовано. Програма не закрита: en.MESSAGE_TEXT_ERR9 =Update cancelled. Can't create folder: ru.MESSAGE_TEXT_ERR9 =Обновление отменено. Не удалось создать папку: @@ -88,6 +205,19 @@ es.MESSAGE_TEXT_ERR9 =Actualización cancelada. No se puede crear la carpeta: fr.MESSAGE_TEXT_ERR9 =Mise à jour annulée. Impossible de créer un dossier : it.MESSAGE_TEXT_ERR9 =Aggiornamento annullato. Impossibile creare la cartella: pt_BR.MESSAGE_TEXT_ERR9 =Atualização cancelada. Não é possível criar a pasta: +zh_CN.MESSAGE_TEXT_ERR9 =更新已取消。 无法创建文件夹: +bg.MESSAGE_TEXT_ERR9 =Актуализацията е отменена. Папката не може да се създаде: +cs.MESSAGE_TEXT_ERR9 =Aktualizace zrušena. Nelze vytvořit složku: +el.MESSAGE_TEXT_ERR9 =Η ενημέρωση ακυρώθηκε. Δεν μπορεί να δημιουργηθεί φάκελος: +hy.MESSAGE_TEXT_ERR9 =Թարմացումը չեղարկվել է: Թղթապանակ ստեղծել հնարավոր չէ՝ +ko.MESSAGE_TEXT_ERR9 =업데이트가 취소되었습니다. 폴더를 생성할 수 없습니다: +lv.MESSAGE_TEXT_ERR9 =Atjaunināšana ir atcelta. Nevar izveidot mapi: +nl.MESSAGE_TEXT_ERR9 =Update geannuleerd. Kan map niet aanmaken: +pl.MESSAGE_TEXT_ERR9 =Aktualizacja została anulowana. Nie można utworzyć katalogu: +pt_PT.MESSAGE_TEXT_ERR9 =Atualização cancelada. Não é possível criar a pasta: +sl.MESSAGE_TEXT_ERR9 =Posodobitev preklicana. Mape ni mogoče ustvariti: +tr.MESSAGE_TEXT_ERR9 =Güncelleme iptal edildi. Klasör oluşturulamıyor: +uk.MESSAGE_TEXT_ERR9 =Оновлення скасовано. Не вдається створити папку: en.MESSAGE_TEXT_ERR10 =Update cancelled. Can't replace files to backup: ru.MESSAGE_TEXT_ERR10 =Обновление отменено. Не удалось переместить файлы в резервную копию: @@ -97,6 +227,19 @@ es.MESSAGE_TEXT_ERR10 =Actualización cancelada. No se pueden reemplazar los arc fr.MESSAGE_TEXT_ERR10 =Mise à jour annulée. Impossible de remplacer les fichiers par des fichiers de sauvegarde : it.MESSAGE_TEXT_ERR10 =Aggiornamento annullato. Impossibile spostare i file nel backup: pt_BR.MESSAGE_TEXT_ERR10 =Atualização cancelada. Não é possível substituir arquivos para backup: +zh_CN.MESSAGE_TEXT_ERR10 =更新已取消。 无法替换要备份的文件: +bg.MESSAGE_TEXT_ERR10 =Актуализацията е отменена. Не могат да се заменят файловете за архивиране: +cs.MESSAGE_TEXT_ERR10 =Aktualizace zrušena. Nelze nahradit soubory do zálohy: +el.MESSAGE_TEXT_ERR10 =Η ενημέρωση ακυρώθηκε. Δεν μπορεί να αντικαταστήσει αρχεία για δημιουργία αντιγράφων ασφαλείας: +hy.MESSAGE_TEXT_ERR10 =Թարմացումը չեղարկվել է: Հնարավոր չէ փոխարինել ֆայլերը կրկնօրինակում՝ +ko.MESSAGE_TEXT_ERR10 =업데이트가 취소되었습니다. 백업할 파일을 교체할 수 없습니다: +lv.MESSAGE_TEXT_ERR10 =Atjaunināšana ir atcelta. Nevar aizstāt failus, lai dublētu: +nl.MESSAGE_TEXT_ERR10 =Update geannuleerd. Kan bestanden niet vervangen voor back-up: +pl.MESSAGE_TEXT_ERR10 =Aktualizacja została anulowana. Nie można zastąpić plików do utworzenia kopii zapasowej: +pt_PT.MESSAGE_TEXT_ERR10 =Atualização cancelada. Não é possível substituir arquivos para backup: +sl.MESSAGE_TEXT_ERR10 =Posodobitev preklicana. Datotek za varnostno kopiranje ni mogoče zamenjati: +tr.MESSAGE_TEXT_ERR10 =Güncelleme iptal edildi. Yedeklenecek dosyalar değiştirilemiyor: +uk.MESSAGE_TEXT_ERR10 =Оновлення скасовано. Не вдається замінити файли для резервної копії: en.MESSAGE_TEXT_ERR11 =Can't restore files from backup! ru.MESSAGE_TEXT_ERR11 =Не удалось восстановить файлы из резервной копии! @@ -106,6 +249,19 @@ es.MESSAGE_TEXT_ERR11 =¡No se pueden restaurar los archivos de la copia de segu fr.MESSAGE_TEXT_ERR11 =Impossible de restaurer des fichiers à partir d'une sauvegarde ! it.MESSAGE_TEXT_ERR11 =Impossibile ripristinare i file dal backup! pt_BR.MESSAGE_TEXT_ERR11 =Não é possível restaurar arquivos do backup! +zh_CN.MESSAGE_TEXT_ERR11 =无法从备份中恢复文件! +bg.MESSAGE_TEXT_ERR11 =Файловете от резервното копие не могат да се възстановят! +cs.MESSAGE_TEXT_ERR11 =Nelze obnovit soubory ze zálohy! +el.MESSAGE_TEXT_ERR11 =Δεν είναι δυνατή η επαναφορά αρχείων από το αντίγραφο ασφαλείας! +hy.MESSAGE_TEXT_ERR11 =Հնարավոր չէ վերականգնել ֆայլերը կրկնօրինակումից։ +ko.MESSAGE_TEXT_ERR11 =백업에서 파일을 복원할 수 없습니다! +lv.MESSAGE_TEXT_ERR11 =Nevar atjaunot failus no dublējuma! +nl.MESSAGE_TEXT_ERR11 =Kan bestanden niet herstellen vanuit back-up! +pl.MESSAGE_TEXT_ERR11 =Nie można przywrócić plików z kopii zapasowej! +pt_PT.MESSAGE_TEXT_ERR11 =Não é possível restaurar arquivos do backup! +sl.MESSAGE_TEXT_ERR11 =Datotek ni mogoče obnoviti iz varnostne kopije! +tr.MESSAGE_TEXT_ERR11 =Dosyalar yedeklemeden geri yüklenemiyor! +uk.MESSAGE_TEXT_ERR11 =Не вдається відновити файли з резервної копії! en.MESSAGE_TEXT_ERR12 =Update cancelled. Can't move updates to App path: ru.MESSAGE_TEXT_ERR12 =Обновление отменено. Не удалось переместить обновления в папку приложения: @@ -115,6 +271,19 @@ es.MESSAGE_TEXT_ERR12 =Actualización cancelada. No se pueden mover las actualiz fr.MESSAGE_TEXT_ERR12 =Mise à jour annulée. Impossible de déplacer les mises à jour vers le chemin d'accès à l'application : it.MESSAGE_TEXT_ERR12 =Aggiornamento annullato. Impossibile spostare gli aggiornamenti nel percorso dell'app: pt_BR.MESSAGE_TEXT_ERR12 =Atualização cancelada. Não é possível mover as atualizações para o caminho do aplicativo: +zh_CN.MESSAGE_TEXT_ERR12 =更新已取消。 无法将更新文件移动到应用程序路径: +bg.MESSAGE_TEXT_ERR12 =Актуализацията е отменена. Не можете да местите актуализации към пътя на Приложението: +cs.MESSAGE_TEXT_ERR12 =Aktualizace zrušena. Nelze přesunout aktualizace do cesty k aplikaci: +el.MESSAGE_TEXT_ERR12 =Η ενημέρωση ακυρώθηκε. Δεν είναι δυνατή η μετακίνηση ενημερώσεων στη διαδρομή της εφαρμογής: +hy.MESSAGE_TEXT_ERR12 =Թարմացումը չեղարկվել է: Հնարավոր չէ թարմացումները տեղափոխել App(հավելված) path +ko.MESSAGE_TEXT_ERR12 =업데이트가 취소되었습니다. 업데이트를 앱 경로로 이동할 수 없습니다: +lv.MESSAGE_TEXT_ERR12 =Atjaunināšana ir atcelta. Nevar pārvietot atjauninājumus uz lietotnes ceļu: +nl.MESSAGE_TEXT_ERR12 =Update geannuleerd. Kan updates niet verplaatsen naar App path: +pl.MESSAGE_TEXT_ERR12 =Aktualizacja została anulowana. Nie można przenieść aktualizacji do ścieżki aplikacji: +pt_PT.MESSAGE_TEXT_ERR12 =Atualização cancelada. Não é possível mover as atualizações para o caminho do aplicativo: +sl.MESSAGE_TEXT_ERR12 =Posodobitev preklicana. Posodobitev ni mogoče premakniti na pot aplikacije: +tr.MESSAGE_TEXT_ERR12 =Güncelleme iptal edildi. Güncellemeler Uygulama yoluna taşınamıyor: +uk.MESSAGE_TEXT_ERR12 =Оновлення скасовано. Не вдається перемістити оновлення до шляху застосунку: en.MESSAGE_TEXT_ERR13 =An error occurred while remove App path: ru.MESSAGE_TEXT_ERR13 =Произошла ошибка при удалении папки приложения: @@ -124,6 +293,19 @@ es.MESSAGE_TEXT_ERR13 =Se ha producido un error al eliminar la ruta de la aplica fr.MESSAGE_TEXT_ERR13 =Une erreur s'est produite lors de la suppression du chemin d'accès à l'application : it.MESSAGE_TEXT_ERR13 =Si è verificato un errore durante la rimozione del percorso dell'app: pt_BR.MESSAGE_TEXT_ERR13 =Ocorreu um erro ao remover o caminho do aplicativo: +zh_CN.MESSAGE_TEXT_ERR13 =删除应用程序路径时出错: +bg.MESSAGE_TEXT_ERR13 =Възникна грешка при премахване пътя на Приложението: +cs.MESSAGE_TEXT_ERR13 =Při odebírání cesty k aplikaci došlo k chybě: +el.MESSAGE_TEXT_ERR13 =Παρουσιάστηκε σφάλμα κατά την αφαίρεση της διαδρομής της εφαρμογής: +hy.MESSAGE_TEXT_ERR13 =App path-ը հեռացնելիս սխալ առաջացավ՝ +ko.MESSAGE_TEXT_ERR13 =앱 경로를 삭제하는 동안 오류가 발생했습니다: +lv.MESSAGE_TEXT_ERR13 =Noņemot lietotnes ceļu, radās kļūda: +nl.MESSAGE_TEXT_ERR13 =Er is een fout opgetreden tijdens het verwijderen van App path: +pl.MESSAGE_TEXT_ERR13 =Wystąpił błąd podczas usuwania ścieżki aplikacji: +pt_PT.MESSAGE_TEXT_ERR13 =Ocorreu um erro ao remover o caminho do aplicativo: +sl.MESSAGE_TEXT_ERR13 =Pri odstranjevanju poti aplikacije je prišlo do napake: +tr.MESSAGE_TEXT_ERR13 =Uygulama yolu kaldırılırken bir hata oluştu: +uk.MESSAGE_TEXT_ERR13 =Сталася помилка під час видалення шляху застосунку: en.MESSAGE_TEXT_ERR14 =An error occurred while restore files from backup: ru.MESSAGE_TEXT_ERR14 =Произошла ошибка при восстановлении файлов из резервной копии: @@ -133,6 +315,19 @@ es.MESSAGE_TEXT_ERR14 =Se ha producido un error al restaurar los archivos de la fr.MESSAGE_TEXT_ERR14 =Une erreur s'est produite lors de la restauration des fichiers à partir de la sauvegarde : it.MESSAGE_TEXT_ERR14 =Si è verificato un errore durante il ripristino dei file dal backup: pt_BR.MESSAGE_TEXT_ERR14 =Ocorreu um erro ao restaurar arquivos do backup: +zh_CN.MESSAGE_TEXT_ERR14 =从备份恢复文件时出错: +bg.MESSAGE_TEXT_ERR14 =Възникна грешка при възстановяване на файлове от резервно копие: +cs.MESSAGE_TEXT_ERR14 =Při obnově souborů ze zálohy došlo k chybě: +el.MESSAGE_TEXT_ERR14 =Εμφανίστηκε σφάλμα κατά την επαναφορά αρχείων από αντίγραφο ασφαλείας: +hy.MESSAGE_TEXT_ERR14 =Սխալ է տեղի ունեցել ֆայլերը կրկնօրինակումից վերականգնելիս՝ +ko.MESSAGE_TEXT_ERR14 =백업에서 파일을 복원하는 동안 오류가 발생했습니다: +lv.MESSAGE_TEXT_ERR14 =Atjaunojot failus no dublējuma, radās kļūda: +nl.MESSAGE_TEXT_ERR14 =Er is een fout opgetreden tijdens het herstellen van bestanden vanaf een back-up: +pl.MESSAGE_TEXT_ERR14 =Wystąpił błąd podczas próby przywrócenia plików z kopii zapasowej: +pt_PT.MESSAGE_TEXT_ERR14 =Ocorreu um erro ao restaurar arquivos do backup: +sl.MESSAGE_TEXT_ERR14 =Med obnavljanjem datotek iz varnostne kopije je prišlo do napake: +tr.MESSAGE_TEXT_ERR14 =Yedeklemeden dosyalar geri yüklenirken bir hata oluştu: +uk.MESSAGE_TEXT_ERR14 =Сталася помилка під час відновлення файлів із резервної копії: en.MESSAGE_TEXT_ERR15 =An error occurred while restarting the program! ru.MESSAGE_TEXT_ERR15 =Произошла ошибка при перезапуске приложения! @@ -142,6 +337,19 @@ es.MESSAGE_TEXT_ERR15 =¡Se ha producido un error al reiniciar el programa! fr.MESSAGE_TEXT_ERR15 =Une erreur s'est produite lors du redémarrage de l'application ! it.MESSAGE_TEXT_ERR15 =Si è verificato un errore durante il riavvio del programma! pt_BR.MESSAGE_TEXT_ERR15 =Ocorreu um erro ao reiniciar o programa! +zh_CN.MESSAGE_TEXT_ERR15 =重新启动程序时出错! +bg.MESSAGE_TEXT_ERR15 =Възникна грешка при рестартиране на програмата! +cs.MESSAGE_TEXT_ERR15 =Při restartování programu došlo k chybě! +el.MESSAGE_TEXT_ERR15 =Εμφανίστηκε σφάλμα κατά την επανεκκίνηση του προγράμματος! +hy.MESSAGE_TEXT_ERR15 =Ծրագիրը վերագործարկելիս սխալ է տեղի ունեցել: +ko.MESSAGE_TEXT_ERR15 =프로그램을 다시 시작하는 동안 오류가 발생했습니다! +lv.MESSAGE_TEXT_ERR15 =Restartējot programmu, radās kļūda! +nl.MESSAGE_TEXT_ERR15 =Er is een fout opgetreden tijdens het opnieuw opstarten van het programma! +pl.MESSAGE_TEXT_ERR15 =Wystąpił błąd podczas ponownego uruchamiania programu! +pt_PT.MESSAGE_TEXT_ERR15 =Ocorreu um erro ao reiniciar o programa! +sl.MESSAGE_TEXT_ERR15 =Pri ponovnem zagonu programa je prišlo do napake! +tr.MESSAGE_TEXT_ERR15 =Program yeniden başlatılırken bir hata oluştu! +uk.MESSAGE_TEXT_ERR15 =Сталася помилка під час перезапуску програми! en.MESSAGE_TEXT_ERR16 =SDL init error: ru.MESSAGE_TEXT_ERR16 =Ошибка инициализации SDL: @@ -151,6 +359,19 @@ es.MESSAGE_TEXT_ERR16 =Error de inicio SDL: fr.MESSAGE_TEXT_ERR16 =Erreur d'initialisation SDL : it.MESSAGE_TEXT_ERR16 =Errore di inizializzazione SDL: pt_BR.MESSAGE_TEXT_ERR16 =Erro de inicialização SDL: +zh_CN.MESSAGE_TEXT_ERR16 =SDL 初始化错误: +bg.MESSAGE_TEXT_ERR16 =Грешка при стартиране на SDL: +cs.MESSAGE_TEXT_ERR16 =Chyba při inicializaci SDL: +el.MESSAGE_TEXT_ERR16 =Σφάλμα εκκίνησης SDL: +hy.MESSAGE_TEXT_ERR16 =SDL սկզբնական սխալ. +ko.MESSAGE_TEXT_ERR16 =SDL 초기화 오류: +lv.MESSAGE_TEXT_ERR16 =SDL init kļūda: +nl.MESSAGE_TEXT_ERR16 =SDL init fout: +pl.MESSAGE_TEXT_ERR16 =Błąd SDL init: +pt_PT.MESSAGE_TEXT_ERR16 =Erro de inicialização SDL: +sl.MESSAGE_TEXT_ERR16 =Napaka pri zagonu SDL: +tr.MESSAGE_TEXT_ERR16 =SDL başlatma hatası: +uk.MESSAGE_TEXT_ERR16 =Помилка запуску SDL: en.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher returned error: ru.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher вернул ошибку: @@ -159,4 +380,17 @@ de.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher hat einen Fehler zurückgegeben: es.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher ha devuelto un error: fr.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher a renvoyé une erreur : it.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher ha restituito un errore: -pt_BR.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher retornou erro: \ No newline at end of file +pt_BR.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher retornou erro: +zh_CN.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher 返回错误: +bg.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher върна грешка: +cs.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher hlásí chybu: +el.MESSAGE_TEXT_ERR17 =Το ServiceCtrlDispatcher επέστρεψε σφάλμα: +hy.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher-ը վերադարձրեց սխալը. +ko.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher가 오류를 반환했습니다: +lv.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher atgrieza kļūdu: +nl.MESSAGE_TEXT_ERR17 =ONLYOFFICE Update Service +pl.MESSAGE_TEXT_ERR17 =Funkcja ServiceCtrlDispatcher odesłała błąd: +pt_PT.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher retornou erro: +sl.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher je vrnil napako: +tr.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher hata döndürdü: +uk.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher повернув помилку: \ No newline at end of file From 836a55cebd0cfe0d290396a7a3a094273eefc7e0 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Tue, 12 Dec 2023 14:11:03 +0200 Subject: [PATCH 021/316] [linux] add feature 63817: display of recent files --- .../cascapplicationmanagerwrapper_private.h | 2 -- win-linux/src/ceditortools.cpp | 2 -- win-linux/src/components/cdownloadwidget.cpp | 2 -- win-linux/src/platform_linux/gtkutils.cpp | 7 ++++++ win-linux/src/platform_linux/gtkutils.h | 1 + win-linux/src/utils.cpp | 22 +++++++++++++------ win-linux/src/utils.h | 2 +- win-linux/src/windows/cmainwindow.cpp | 2 -- 8 files changed, 24 insertions(+), 16 deletions(-) diff --git a/win-linux/src/cascapplicationmanagerwrapper_private.h b/win-linux/src/cascapplicationmanagerwrapper_private.h index 4bed14c7c..098643792 100644 --- a/win-linux/src/cascapplicationmanagerwrapper_private.h +++ b/win-linux/src/cascapplicationmanagerwrapper_private.h @@ -232,9 +232,7 @@ class CAscApplicationManagerWrapper_Private CMessage::error(m_appmanager.mainWindow()->handle(), QObject::tr("File %1 cannot be opened or doesn't exists.").arg(_info.fileName())); } -#ifdef _WIN32 else Utils::addToRecent(file_path); -#endif } } diff --git a/win-linux/src/ceditortools.cpp b/win-linux/src/ceditortools.cpp index 33b851d04..fa833b9a1 100644 --- a/win-linux/src/ceditortools.cpp +++ b/win-linux/src/ceditortools.cpp @@ -394,9 +394,7 @@ namespace CEditorTools AscAppManager::GetFileFormatByExtentionForSave(pSaveData->get_Path()); pSaveData->put_FileType(format > -1 ? format : 0); -#ifdef _WIN32 Utils::addToRecent(_full_path.toStdWString()); -#endif } } diff --git a/win-linux/src/components/cdownloadwidget.cpp b/win-linux/src/components/cdownloadwidget.cpp index d408cdea5..8a96dcde6 100644 --- a/win-linux/src/components/cdownloadwidget.cpp +++ b/win-linux/src/components/cdownloadwidget.cpp @@ -343,9 +343,7 @@ void CDownloadWidget::downloadProcess(void * info) CMessage::error(parentWidget(), tr("Can't open file: ") + path); } else { AscAppManager::handleInputCmd({path.toStdWString()}); -#ifdef _WIN32 Utils::addToRecent(path.toStdWString()); -#endif } }); diff --git a/win-linux/src/platform_linux/gtkutils.cpp b/win-linux/src/platform_linux/gtkutils.cpp index fb3836e14..e01d080b8 100644 --- a/win-linux/src/platform_linux/gtkutils.cpp +++ b/win-linux/src/platform_linux/gtkutils.cpp @@ -72,6 +72,13 @@ void set_parent(GtkWidget *dialog, gpointer data) } } +void add_to_recent(const gchar *uri) +{ + gtk_init(NULL, NULL); + GtkRecentManager *rm = gtk_recent_manager_get_default(); + gtk_recent_manager_add_item(rm, uri); +} + GtkWidget *find_widget_by_path(GtkWidget *parent, const gchar *widget_path) { if (!parent) diff --git a/win-linux/src/platform_linux/gtkutils.h b/win-linux/src/platform_linux/gtkutils.h index c6b1c9ac7..9b85b4da6 100644 --- a/win-linux/src/platform_linux/gtkutils.h +++ b/win-linux/src/platform_linux/gtkutils.h @@ -44,6 +44,7 @@ typedef struct DialogTag { gboolean set_focus(GtkWidget *dialog); gboolean focus_out(gpointer data); void set_parent(GtkWidget *dialog, gpointer data); +void add_to_recent(const gchar *uri); GtkWidget *find_widget_by_path(GtkWidget *parent, const gchar *widget_path); #endif // GTKUTILS_H diff --git a/win-linux/src/utils.cpp b/win-linux/src/utils.cpp index 5bacb475c..4bb4ca642 100644 --- a/win-linux/src/utils.cpp +++ b/win-linux/src/utils.cpp @@ -30,6 +30,9 @@ * */ +#ifdef __linux__ +# include "platform_linux/gtkutils.h" +#endif #include "utils.h" #include "defines.h" #include @@ -710,6 +713,18 @@ bool Utils::updatesAllowed() return false; } +void Utils::addToRecent(const std::wstring &path) +{ + QString _path = QString::fromStdWString(path); +#ifdef _WIN32 + QString appPath = qApp->applicationDirPath(); + QProcess::startDetached(appPath + "/" + QString(REG_APP_NAME), {"--add-to-recent", QDir::toNativeSeparators(_path)}, appPath); +#else + std::string uri = "file://" + _path.toStdString(); + add_to_recent(uri.c_str()); +#endif +} + #ifdef _WIN32 Utils::WinVer Utils::getWinVersion() { @@ -750,13 +765,6 @@ Utils::WinVer Utils::getWinVersion() return WinVer::Undef; } -void Utils::addToRecent(const std::wstring &path) -{ - QString _path = QString::fromStdWString(path); - QString appPath = qApp->applicationDirPath(); - QProcess::startDetached(appPath + "/" + QString(REG_APP_NAME), {"--add-to-recent", QDir::toNativeSeparators(_path)}, appPath); -} - std::atomic_bool sessionInProgress{true}; bool Utils::isSessionInProgress() diff --git a/win-linux/src/utils.h b/win-linux/src/utils.h index 14bd584b7..cb35ea1eb 100644 --- a/win-linux/src/utils.h +++ b/win-linux/src/utils.h @@ -118,13 +118,13 @@ class Utils { static QJsonObject parseJsonString(const std::wstring&); static QJsonObject parseJsonFile(const QString&); static bool updatesAllowed(); + static void addToRecent(const std::wstring&); #ifdef _WIN32 enum class WinVer : uchar { Undef, WinXP, WinVista, Win7, Win8, Win8_1, Win10, Win11 }; static WinVer getWinVersion(); - static void addToRecent(const std::wstring&); static bool isSessionInProgress(); static void setSessionInProgress(bool); #endif diff --git a/win-linux/src/windows/cmainwindow.cpp b/win-linux/src/windows/cmainwindow.cpp index 8ed8b34a8..c509c1b90 100644 --- a/win-linux/src/windows/cmainwindow.cpp +++ b/win-linux/src/windows/cmainwindow.cpp @@ -749,9 +749,7 @@ void CMainWindow::doOpenLocalFile(COpenOptions& opts) int result = m_pTabs->openLocalDocument(opts, true); if ( !(result < 0) ) { toggleButtonMain(false, true); -#ifdef _WIN32 Utils::addToRecent(opts.wurl); -#endif } else if (result == -255) { QTimer::singleShot(0, this, [=] { From 05e594e1d9a8e47dc7a77d20dc95a08374fc630b Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Tue, 12 Dec 2023 14:13:42 +0200 Subject: [PATCH 022/316] [linux] refactoring: hide dialog box icon on taskbar --- win-linux/src/platform_linux/gtkfilechooser.cpp | 1 + win-linux/src/platform_linux/gtkprintdialog.cpp | 1 + win-linux/src/platform_linux/updatedialog.cpp | 1 + win-linux/src/platform_linux/xcbutils.cpp | 9 +++++++++ 4 files changed, 12 insertions(+) diff --git a/win-linux/src/platform_linux/gtkfilechooser.cpp b/win-linux/src/platform_linux/gtkfilechooser.cpp index 42b5e18f0..f268233c0 100755 --- a/win-linux/src/platform_linux/gtkfilechooser.cpp +++ b/win-linux/src/platform_linux/gtkfilechooser.cpp @@ -93,6 +93,7 @@ static void nativeFileDialog(const Window &parent_xid, GTK_RESPONSE_ACCEPT, NULL); + gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), TRUE); //g_signal_connect(G_OBJECT(dialog), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(dialog), "realize", G_CALLBACK(set_parent), (gpointer)&parent_xid); g_signal_connect(G_OBJECT(dialog), "map_event", G_CALLBACK(set_focus), NULL); diff --git a/win-linux/src/platform_linux/gtkprintdialog.cpp b/win-linux/src/platform_linux/gtkprintdialog.cpp index bbd7a34f7..27bd99c1a 100644 --- a/win-linux/src/platform_linux/gtkprintdialog.cpp +++ b/win-linux/src/platform_linux/gtkprintdialog.cpp @@ -372,6 +372,7 @@ QDialog::DialogCode GtkPrintDialog::exec() GtkWidget *dialog; dialog = gtk_print_unix_dialog_new(m_title.toUtf8().data(), NULL); gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG); + gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), TRUE); GtkEntry *page_ranges_entry = NULL; g_signal_connect(G_OBJECT(dialog), "map", G_CALLBACK(get_page_ranges_entry), (gpointer)&page_ranges_entry); diff --git a/win-linux/src/platform_linux/updatedialog.cpp b/win-linux/src/platform_linux/updatedialog.cpp index d46226be6..157d687da 100644 --- a/win-linux/src/platform_linux/updatedialog.cpp +++ b/win-linux/src/platform_linux/updatedialog.cpp @@ -85,6 +85,7 @@ int WinDlg::showDialog(QWidget *parent, "%s", primaryText.toLocal8Bit().data()); + gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), TRUE); g_signal_connect(G_OBJECT(dialog), "realize", G_CALLBACK(set_parent), (gpointer)&parent_xid); g_signal_connect(G_OBJECT(dialog), "map_event", G_CALLBACK(set_focus), NULL); DialogTag tag; // unable to send parent_xid via g_signal_connect and "focus_out_event" diff --git a/win-linux/src/platform_linux/xcbutils.cpp b/win-linux/src/platform_linux/xcbutils.cpp index 27646464e..99cbb8d66 100644 --- a/win-linux/src/platform_linux/xcbutils.cpp +++ b/win-linux/src/platform_linux/xcbutils.cpp @@ -70,6 +70,14 @@ void XcbUtils::setNativeFocusTo(xcb_window_t window) } } +static void SetSkipTaskbar(Display* disp, Window win) +{ + Atom wm_state = XInternAtom(disp, "_NET_WM_STATE", True); + Atom wm_state_skip_taskbar = XInternAtom(disp, "_NET_WM_STATE_SKIP_TASKBAR", True); + if (wm_state != None && wm_state_skip_taskbar != None) + XChangeProperty(disp, win, wm_state, XA_ATOM, 32, PropModeReplace, (const unsigned char*)&wm_state_skip_taskbar, 1); +} + static void GetWindowName(Display* disp, Window win, char **name) { XClassHint* class_hint = NULL; class_hint = XAllocClassHint(); @@ -135,6 +143,7 @@ void XcbUtils::findWindowAsync(const char *window_name, if (strstr(name, window_name) != NULL) { if (IsVisible(disp, win_list[i])) { win_found = win_list[i]; + SetSkipTaskbar(disp, win_found); callback((xcb_window_t)win_found); } free(name); From 6cc5a66b040dc165d495f297b00e2f88ae413224 Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Wed, 13 Dec 2023 15:52:10 +0300 Subject: [PATCH 023/316] added sk --- .../extras/update-daemon/res/langs/langs.iss | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/win-linux/extras/update-daemon/res/langs/langs.iss b/win-linux/extras/update-daemon/res/langs/langs.iss index 5e56cc16c..ed5f69909 100644 --- a/win-linux/extras/update-daemon/res/langs/langs.iss +++ b/win-linux/extras/update-daemon/res/langs/langs.iss @@ -17,6 +17,7 @@ lv.CAPTION_TEXT =ONLYOFFICE atjaunināšanas pakalpojums nl.CAPTION_TEXT =ONLYOFFICE Update Service pl.CAPTION_TEXT =Usługa aktualizacji ONLYOFFICE pt_PT.CAPTION_TEXT =Serviço de atualização ONLYOFFICE +sk.CAPTION_TEXT =Servis aktualizácie ONLYOFFICE sl.CAPTION_TEXT =Storitev posodabljanja ONLYOFFICE tr.CAPTION_TEXT =ONLYOFFICE Güncelleme Hizmeti uk.CAPTION_TEXT =Служба оновлень ONLYOFFICE @@ -39,6 +40,7 @@ lv.MESSAGE_TEXT_ERR1 =Radās kļūda: nl.MESSAGE_TEXT_ERR1 =Er is een fout opgetreden: pl.MESSAGE_TEXT_ERR1 =Wystąpił błąd: pt_PT.MESSAGE_TEXT_ERR1 =Um erro ocorreu: +sk.MESSAGE_TEXT_ERR1 =Vyskytla sa chyba: sl.MESSAGE_TEXT_ERR1 =Pojavila se je napaka: tr.MESSAGE_TEXT_ERR1 =Bir hata oluştu: uk.MESSAGE_TEXT_ERR1 =Сталася помилка: @@ -61,6 +63,7 @@ lv.MESSAGE_TEXT_ERR2 =Dzēšot, radās kļūda: nl.MESSAGE_TEXT_ERR2 =Er is een fout opgetreden tijdens het verwijderen: pl.MESSAGE_TEXT_ERR2 =Wystąpił błąd podczas usuwania: pt_PT.MESSAGE_TEXT_ERR2 =Ocorreu um erro ao excluir: +sk.MESSAGE_TEXT_ERR2 =Pri vymazávaní došlo k chybe: sl.MESSAGE_TEXT_ERR2 =Pojavila se je napaka med brisanjem: tr.MESSAGE_TEXT_ERR2 =Silinirken bir hata oluştu: uk.MESSAGE_TEXT_ERR2 =Сталася помилка під час видалення: @@ -83,6 +86,7 @@ lv.MESSAGE_TEXT_ERR3 =Radās kļūda, veidojot: nl.MESSAGE_TEXT_ERR3 =Er is een fout opgetreden tijdens het aanmaken: pl.MESSAGE_TEXT_ERR3 =Wystąpił błąd podczas tworzenia: pt_PT.MESSAGE_TEXT_ERR3 =Ocorreu um erro ao criar: +sk.MESSAGE_TEXT_ERR3 =Pri vytváraní došlo k chybe: sl.MESSAGE_TEXT_ERR3 =Pojavila se je napaka md ustvarjanjem: tr.MESSAGE_TEXT_ERR3 =Oluşturulurken bir hata oluştu: uk.MESSAGE_TEXT_ERR3 =Сталася помилка під час створення: @@ -105,6 +109,7 @@ lv.MESSAGE_TEXT_ERR4 =Restartējot pakalpojumu, radās kļūda! nl.MESSAGE_TEXT_ERR4 =Er is een fout opgetreden tijdens het opnieuw opstarten van de service! pl.MESSAGE_TEXT_ERR4 =Wystąpił błąd podczas ponownego uruchamiania usługi! pt_PT.MESSAGE_TEXT_ERR4 =Ocorreu um erro ao reiniciar o serviço! +sk.MESSAGE_TEXT_ERR4 =Pri reštartovaní služby došlo k chybe! sl.MESSAGE_TEXT_ERR4 =Med ponovnim zagonom storitve je prišlo do napake! tr.MESSAGE_TEXT_ERR4 =Hizmet yeniden başlatılırken bir hata oluştu! uk.MESSAGE_TEXT_ERR4 =Сталася помилка під час перезапуску служби! @@ -127,6 +132,7 @@ lv.MESSAGE_TEXT_ERR5 =Atjaunināšana ir atcelta. Nevar atrast mapi: nl.MESSAGE_TEXT_ERR5 =Update geannuleerd. Kan map niet vinden: pl.MESSAGE_TEXT_ERR5 =Aktualizacja została anulowana. Nie można znaleźć katalogu: pt_PT.MESSAGE_TEXT_ERR5 =Atualização cancelada. Não foi possível encontrar a pasta: +sk.MESSAGE_TEXT_ERR5 =Aktualizácia zrušená. Nie je možné nájsť priečinok: sl.MESSAGE_TEXT_ERR5 =Posodobitev preklicana. Ne najdem mape: tr.MESSAGE_TEXT_ERR5 =Güncelleme iptal edildi. Klasör bulunamıyor: uk.MESSAGE_TEXT_ERR5 =Оновлення скасовано. Не вдається знайти папку: @@ -149,6 +155,7 @@ lv.MESSAGE_TEXT_ERR6 =Atjaunināšana ir atcelta. Trūkst faila paraksta: nl.MESSAGE_TEXT_ERR6 =Update geannuleerd. De bestandsondertekening ontbreekt: pl.MESSAGE_TEXT_ERR6 =Aktualizacja została anulowana. Brak podpisu pliku: pt_PT.MESSAGE_TEXT_ERR6 =Atualização cancelada. A assinatura do arquivo está faltando: +sk.MESSAGE_TEXT_ERR6 =Aktualizácia zrušená. Chýba podpis súboru: sl.MESSAGE_TEXT_ERR6 =Posodobitev preklicana. Manjka podpis datoteke: tr.MESSAGE_TEXT_ERR6 =Güncelleme iptal edildi. Dosya imzası eksik: uk.MESSAGE_TEXT_ERR6 =Оновлення скасовано. Відсутній підпис файлу: @@ -171,6 +178,7 @@ lv.MESSAGE_TEXT_ERR7 =Atjaunināšana ir atcelta. Nevar izdzēst mapi: nl.MESSAGE_TEXT_ERR7 =Update geannuleerd. Kan map niet verwijderen: pl.MESSAGE_TEXT_ERR7 =Aktualizacja została anulowana. Nie można usunąć katalogu: pt_PT.MESSAGE_TEXT_ERR7 =Atualização cancelada. Não é possível excluir a pasta: +sk.MESSAGE_TEXT_ERR7 =Aktualizácia zrušená. Nie je možné odstrániť priečinok: sl.MESSAGE_TEXT_ERR7 =Posodobitev preklicana. Mape ni mogoče izbrisati: tr.MESSAGE_TEXT_ERR7 =Güncelleme iptal edildi. Klasör silinemiyor: uk.MESSAGE_TEXT_ERR7 =Оновлення скасовано. Не вдається видалити папку: @@ -193,6 +201,7 @@ lv.MESSAGE_TEXT_ERR8 =Atjaunināšana ir atcelta. Programma nav aizvērta: nl.MESSAGE_TEXT_ERR8 =Update geannuleerd. Het programma is niet afgesloten: pl.MESSAGE_TEXT_ERR8 =Aktualizacja została anulowana. Program nie jest zamknięty: pt_PT.MESSAGE_TEXT_ERR8 =Atualização cancelada. O programa não está fechado: +sk.MESSAGE_TEXT_ERR8 =Aktualizácia zrušená. Program nie je ukončený: sl.MESSAGE_TEXT_ERR8 =Posodobitev preklicana. Program ni zaprt: tr.MESSAGE_TEXT_ERR8 =Güncelleme iptal edildi. Program kapalı değil: uk.MESSAGE_TEXT_ERR8 =Оновлення скасовано. Програма не закрита: @@ -215,6 +224,7 @@ lv.MESSAGE_TEXT_ERR9 =Atjaunināšana ir atcelta. Nevar izveidot mapi: nl.MESSAGE_TEXT_ERR9 =Update geannuleerd. Kan map niet aanmaken: pl.MESSAGE_TEXT_ERR9 =Aktualizacja została anulowana. Nie można utworzyć katalogu: pt_PT.MESSAGE_TEXT_ERR9 =Atualização cancelada. Não é possível criar a pasta: +sk.MESSAGE_TEXT_ERR9 =Aktualizácia zrušená. Nie je možné vytvoriť priečinok: sl.MESSAGE_TEXT_ERR9 =Posodobitev preklicana. Mape ni mogoče ustvariti: tr.MESSAGE_TEXT_ERR9 =Güncelleme iptal edildi. Klasör oluşturulamıyor: uk.MESSAGE_TEXT_ERR9 =Оновлення скасовано. Не вдається створити папку: @@ -237,6 +247,7 @@ lv.MESSAGE_TEXT_ERR10 =Atjaunināšana ir atcelta. Nevar aizstāt failus, lai du nl.MESSAGE_TEXT_ERR10 =Update geannuleerd. Kan bestanden niet vervangen voor back-up: pl.MESSAGE_TEXT_ERR10 =Aktualizacja została anulowana. Nie można zastąpić plików do utworzenia kopii zapasowej: pt_PT.MESSAGE_TEXT_ERR10 =Atualização cancelada. Não é possível substituir arquivos para backup: +sk.MESSAGE_TEXT_ERR10 =Aktualizácia zrušená. Nie je možné nahradiť súbory na zálohovanie: sl.MESSAGE_TEXT_ERR10 =Posodobitev preklicana. Datotek za varnostno kopiranje ni mogoče zamenjati: tr.MESSAGE_TEXT_ERR10 =Güncelleme iptal edildi. Yedeklenecek dosyalar değiştirilemiyor: uk.MESSAGE_TEXT_ERR10 =Оновлення скасовано. Не вдається замінити файли для резервної копії: @@ -259,6 +270,7 @@ lv.MESSAGE_TEXT_ERR11 =Nevar atjaunot failus no dublējuma! nl.MESSAGE_TEXT_ERR11 =Kan bestanden niet herstellen vanuit back-up! pl.MESSAGE_TEXT_ERR11 =Nie można przywrócić plików z kopii zapasowej! pt_PT.MESSAGE_TEXT_ERR11 =Não é possível restaurar arquivos do backup! +sk.MESSAGE_TEXT_ERR11 =Nie je možné obnoviť súbory zo zálohy! sl.MESSAGE_TEXT_ERR11 =Datotek ni mogoče obnoviti iz varnostne kopije! tr.MESSAGE_TEXT_ERR11 =Dosyalar yedeklemeden geri yüklenemiyor! uk.MESSAGE_TEXT_ERR11 =Не вдається відновити файли з резервної копії! @@ -281,6 +293,7 @@ lv.MESSAGE_TEXT_ERR12 =Atjaunināšana ir atcelta. Nevar pārvietot atjaunināju nl.MESSAGE_TEXT_ERR12 =Update geannuleerd. Kan updates niet verplaatsen naar App path: pl.MESSAGE_TEXT_ERR12 =Aktualizacja została anulowana. Nie można przenieść aktualizacji do ścieżki aplikacji: pt_PT.MESSAGE_TEXT_ERR12 =Atualização cancelada. Não é possível mover as atualizações para o caminho do aplicativo: +sk.MESSAGE_TEXT_ERR12 =Aktualizácia zrušená. Nie je možné presunúť aktualizácie do cesty k aplikácii: sl.MESSAGE_TEXT_ERR12 =Posodobitev preklicana. Posodobitev ni mogoče premakniti na pot aplikacije: tr.MESSAGE_TEXT_ERR12 =Güncelleme iptal edildi. Güncellemeler Uygulama yoluna taşınamıyor: uk.MESSAGE_TEXT_ERR12 =Оновлення скасовано. Не вдається перемістити оновлення до шляху застосунку: @@ -303,6 +316,7 @@ lv.MESSAGE_TEXT_ERR13 =Noņemot lietotnes ceļu, radās kļūda: nl.MESSAGE_TEXT_ERR13 =Er is een fout opgetreden tijdens het verwijderen van App path: pl.MESSAGE_TEXT_ERR13 =Wystąpił błąd podczas usuwania ścieżki aplikacji: pt_PT.MESSAGE_TEXT_ERR13 =Ocorreu um erro ao remover o caminho do aplicativo: +sk.MESSAGE_TEXT_ERR13 =Pri odstraňovaní cesty k aplikácii došlo k chybe: sl.MESSAGE_TEXT_ERR13 =Pri odstranjevanju poti aplikacije je prišlo do napake: tr.MESSAGE_TEXT_ERR13 =Uygulama yolu kaldırılırken bir hata oluştu: uk.MESSAGE_TEXT_ERR13 =Сталася помилка під час видалення шляху застосунку: @@ -325,6 +339,7 @@ lv.MESSAGE_TEXT_ERR14 =Atjaunojot failus no dublējuma, radās kļūda: nl.MESSAGE_TEXT_ERR14 =Er is een fout opgetreden tijdens het herstellen van bestanden vanaf een back-up: pl.MESSAGE_TEXT_ERR14 =Wystąpił błąd podczas próby przywrócenia plików z kopii zapasowej: pt_PT.MESSAGE_TEXT_ERR14 =Ocorreu um erro ao restaurar arquivos do backup: +sk.MESSAGE_TEXT_ERR14 =Pri obnovovaní súborov zo zálohy došlo k chybe: sl.MESSAGE_TEXT_ERR14 =Med obnavljanjem datotek iz varnostne kopije je prišlo do napake: tr.MESSAGE_TEXT_ERR14 =Yedeklemeden dosyalar geri yüklenirken bir hata oluştu: uk.MESSAGE_TEXT_ERR14 =Сталася помилка під час відновлення файлів із резервної копії: @@ -347,6 +362,7 @@ lv.MESSAGE_TEXT_ERR15 =Restartējot programmu, radās kļūda! nl.MESSAGE_TEXT_ERR15 =Er is een fout opgetreden tijdens het opnieuw opstarten van het programma! pl.MESSAGE_TEXT_ERR15 =Wystąpił błąd podczas ponownego uruchamiania programu! pt_PT.MESSAGE_TEXT_ERR15 =Ocorreu um erro ao reiniciar o programa! +sk.MESSAGE_TEXT_ERR15 =Pri reštartovaní programu došlo k chybe! sl.MESSAGE_TEXT_ERR15 =Pri ponovnem zagonu programa je prišlo do napake! tr.MESSAGE_TEXT_ERR15 =Program yeniden başlatılırken bir hata oluştu! uk.MESSAGE_TEXT_ERR15 =Сталася помилка під час перезапуску програми! @@ -369,6 +385,7 @@ lv.MESSAGE_TEXT_ERR16 =SDL init kļūda: nl.MESSAGE_TEXT_ERR16 =SDL init fout: pl.MESSAGE_TEXT_ERR16 =Błąd SDL init: pt_PT.MESSAGE_TEXT_ERR16 =Erro de inicialização SDL: +sk.MESSAGE_TEXT_ERR16 =Chyba SDL init: sl.MESSAGE_TEXT_ERR16 =Napaka pri zagonu SDL: tr.MESSAGE_TEXT_ERR16 =SDL başlatma hatası: uk.MESSAGE_TEXT_ERR16 =Помилка запуску SDL: @@ -391,6 +408,7 @@ lv.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher atgrieza kļūdu: nl.MESSAGE_TEXT_ERR17 =ONLYOFFICE Update Service pl.MESSAGE_TEXT_ERR17 =Funkcja ServiceCtrlDispatcher odesłała błąd: pt_PT.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher retornou erro: +sk.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher vrátil chybu: sl.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher je vrnil napako: tr.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher hata döndürdü: uk.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher повернув помилку: \ No newline at end of file From aa84e99cc43d307e25d44eb92a6a5b66bc233415 Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Wed, 13 Dec 2023 18:36:40 +0300 Subject: [PATCH 024/316] added vi --- .../extras/update-daemon/res/langs/langs.iss | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/win-linux/extras/update-daemon/res/langs/langs.iss b/win-linux/extras/update-daemon/res/langs/langs.iss index ed5f69909..60e3c4dce 100644 --- a/win-linux/extras/update-daemon/res/langs/langs.iss +++ b/win-linux/extras/update-daemon/res/langs/langs.iss @@ -21,6 +21,7 @@ sk.CAPTION_TEXT =Servis aktualizácie ONLYOFFICE sl.CAPTION_TEXT =Storitev posodabljanja ONLYOFFICE tr.CAPTION_TEXT =ONLYOFFICE Güncelleme Hizmeti uk.CAPTION_TEXT =Служба оновлень ONLYOFFICE +vi.CAPTION_TEXT =Dịch vụ Cập nhật ONLYOFFICE en.MESSAGE_TEXT_ERR1 =An error occurred: ru.MESSAGE_TEXT_ERR1 =Произошла ошибка: @@ -44,6 +45,7 @@ sk.MESSAGE_TEXT_ERR1 =Vyskytla sa chyba: sl.MESSAGE_TEXT_ERR1 =Pojavila se je napaka: tr.MESSAGE_TEXT_ERR1 =Bir hata oluştu: uk.MESSAGE_TEXT_ERR1 =Сталася помилка: +vi.MESSAGE_TEXT_ERR1 =Đã xảy ra lỗi: en.MESSAGE_TEXT_ERR2 =An error occurred while deleting: ru.MESSAGE_TEXT_ERR2 =Произошла ошибка при удалении: @@ -67,6 +69,7 @@ sk.MESSAGE_TEXT_ERR2 =Pri vymazávaní došlo k chybe: sl.MESSAGE_TEXT_ERR2 =Pojavila se je napaka med brisanjem: tr.MESSAGE_TEXT_ERR2 =Silinirken bir hata oluştu: uk.MESSAGE_TEXT_ERR2 =Сталася помилка під час видалення: +vi.MESSAGE_TEXT_ERR2 =Đã xảy ra lỗi khi xóa: en.MESSAGE_TEXT_ERR3 =An error occurred while creating: ru.MESSAGE_TEXT_ERR3 =Произошла ошибка при создании: @@ -90,6 +93,7 @@ sk.MESSAGE_TEXT_ERR3 =Pri vytváraní došlo k chybe: sl.MESSAGE_TEXT_ERR3 =Pojavila se je napaka md ustvarjanjem: tr.MESSAGE_TEXT_ERR3 =Oluşturulurken bir hata oluştu: uk.MESSAGE_TEXT_ERR3 =Сталася помилка під час створення: +vi.MESSAGE_TEXT_ERR3 =Đã xảy ra lỗi khi tạo: en.MESSAGE_TEXT_ERR4 =An error occurred while restarting the service! ru.MESSAGE_TEXT_ERR4 =Произошла ошибка при перезапуске сервиса! @@ -113,6 +117,7 @@ sk.MESSAGE_TEXT_ERR4 =Pri reštartovaní služby došlo k chybe! sl.MESSAGE_TEXT_ERR4 =Med ponovnim zagonom storitve je prišlo do napake! tr.MESSAGE_TEXT_ERR4 =Hizmet yeniden başlatılırken bir hata oluştu! uk.MESSAGE_TEXT_ERR4 =Сталася помилка під час перезапуску служби! +vi.MESSAGE_TEXT_ERR4 =Đã xảy ra lỗi khi khởi động lại dịch vụ! en.MESSAGE_TEXT_ERR5 =Update cancelled. Can't find folder: ru.MESSAGE_TEXT_ERR5 =Обновление отменено. Не удалось найти папку: @@ -136,6 +141,7 @@ sk.MESSAGE_TEXT_ERR5 =Aktualizácia zrušená. Nie je možné nájsť priečinok sl.MESSAGE_TEXT_ERR5 =Posodobitev preklicana. Ne najdem mape: tr.MESSAGE_TEXT_ERR5 =Güncelleme iptal edildi. Klasör bulunamıyor: uk.MESSAGE_TEXT_ERR5 =Оновлення скасовано. Не вдається знайти папку: +vi.MESSAGE_TEXT_ERR5 =Đã hủy cập nhật. Không thể tìm thấy thư mục: en.MESSAGE_TEXT_ERR6 =Update cancelled. The file signature is missing: ru.MESSAGE_TEXT_ERR6 =Обновление отменено. Отсутствует подпись файла: @@ -159,6 +165,7 @@ sk.MESSAGE_TEXT_ERR6 =Aktualizácia zrušená. Chýba podpis súboru: sl.MESSAGE_TEXT_ERR6 =Posodobitev preklicana. Manjka podpis datoteke: tr.MESSAGE_TEXT_ERR6 =Güncelleme iptal edildi. Dosya imzası eksik: uk.MESSAGE_TEXT_ERR6 =Оновлення скасовано. Відсутній підпис файлу: +vi.MESSAGE_TEXT_ERR6 =Đã hủy cập nhật. Thiếu chữ ký tập tin: en.MESSAGE_TEXT_ERR7 =Update cancelled. Can't delete folder: ru.MESSAGE_TEXT_ERR7 =Обновление отменено. Не удалось удалить папку: @@ -182,6 +189,7 @@ sk.MESSAGE_TEXT_ERR7 =Aktualizácia zrušená. Nie je možné odstrániť prieč sl.MESSAGE_TEXT_ERR7 =Posodobitev preklicana. Mape ni mogoče izbrisati: tr.MESSAGE_TEXT_ERR7 =Güncelleme iptal edildi. Klasör silinemiyor: uk.MESSAGE_TEXT_ERR7 =Оновлення скасовано. Не вдається видалити папку: +vi.MESSAGE_TEXT_ERR7 =Đã hủy cập nhật. Không thể xóa thư mục: en.MESSAGE_TEXT_ERR8 =Update cancelled. The program is not closed: ru.MESSAGE_TEXT_ERR8 =Обновление отменено. Приложение не закрыто: @@ -205,6 +213,7 @@ sk.MESSAGE_TEXT_ERR8 =Aktualizácia zrušená. Program nie je ukončený: sl.MESSAGE_TEXT_ERR8 =Posodobitev preklicana. Program ni zaprt: tr.MESSAGE_TEXT_ERR8 =Güncelleme iptal edildi. Program kapalı değil: uk.MESSAGE_TEXT_ERR8 =Оновлення скасовано. Програма не закрита: +vi.MESSAGE_TEXT_ERR8 =Đã hủy cập nhật. Chương trình chưa được đóng: en.MESSAGE_TEXT_ERR9 =Update cancelled. Can't create folder: ru.MESSAGE_TEXT_ERR9 =Обновление отменено. Не удалось создать папку: @@ -228,6 +237,7 @@ sk.MESSAGE_TEXT_ERR9 =Aktualizácia zrušená. Nie je možné vytvoriť priečin sl.MESSAGE_TEXT_ERR9 =Posodobitev preklicana. Mape ni mogoče ustvariti: tr.MESSAGE_TEXT_ERR9 =Güncelleme iptal edildi. Klasör oluşturulamıyor: uk.MESSAGE_TEXT_ERR9 =Оновлення скасовано. Не вдається створити папку: +vi.MESSAGE_TEXT_ERR9 =Đã hủy cập nhật. Không thể tạo thư mục: en.MESSAGE_TEXT_ERR10 =Update cancelled. Can't replace files to backup: ru.MESSAGE_TEXT_ERR10 =Обновление отменено. Не удалось переместить файлы в резервную копию: @@ -251,6 +261,7 @@ sk.MESSAGE_TEXT_ERR10 =Aktualizácia zrušená. Nie je možné nahradiť súbory sl.MESSAGE_TEXT_ERR10 =Posodobitev preklicana. Datotek za varnostno kopiranje ni mogoče zamenjati: tr.MESSAGE_TEXT_ERR10 =Güncelleme iptal edildi. Yedeklenecek dosyalar değiştirilemiyor: uk.MESSAGE_TEXT_ERR10 =Оновлення скасовано. Не вдається замінити файли для резервної копії: +vi.MESSAGE_TEXT_ERR10 =Đã hủy cập nhật. Không thể thay thế tập tin để sao lưu: en.MESSAGE_TEXT_ERR11 =Can't restore files from backup! ru.MESSAGE_TEXT_ERR11 =Не удалось восстановить файлы из резервной копии! @@ -274,6 +285,7 @@ sk.MESSAGE_TEXT_ERR11 =Nie je možné obnoviť súbory zo zálohy! sl.MESSAGE_TEXT_ERR11 =Datotek ni mogoče obnoviti iz varnostne kopije! tr.MESSAGE_TEXT_ERR11 =Dosyalar yedeklemeden geri yüklenemiyor! uk.MESSAGE_TEXT_ERR11 =Не вдається відновити файли з резервної копії! +vi.MESSAGE_TEXT_ERR11 =Không thể khôi phục tập tin từ bản sao lưu! en.MESSAGE_TEXT_ERR12 =Update cancelled. Can't move updates to App path: ru.MESSAGE_TEXT_ERR12 =Обновление отменено. Не удалось переместить обновления в папку приложения: @@ -297,6 +309,7 @@ sk.MESSAGE_TEXT_ERR12 =Aktualizácia zrušená. Nie je možné presunúť aktual sl.MESSAGE_TEXT_ERR12 =Posodobitev preklicana. Posodobitev ni mogoče premakniti na pot aplikacije: tr.MESSAGE_TEXT_ERR12 =Güncelleme iptal edildi. Güncellemeler Uygulama yoluna taşınamıyor: uk.MESSAGE_TEXT_ERR12 =Оновлення скасовано. Не вдається перемістити оновлення до шляху застосунку: +vi.MESSAGE_TEXT_ERR12 =Đã hủy cập nhật. Không thể chuyển các bản cập nhật sang đường dẫn Ứng dụng: en.MESSAGE_TEXT_ERR13 =An error occurred while remove App path: ru.MESSAGE_TEXT_ERR13 =Произошла ошибка при удалении папки приложения: @@ -320,6 +333,7 @@ sk.MESSAGE_TEXT_ERR13 =Pri odstraňovaní cesty k aplikácii došlo k chybe: sl.MESSAGE_TEXT_ERR13 =Pri odstranjevanju poti aplikacije je prišlo do napake: tr.MESSAGE_TEXT_ERR13 =Uygulama yolu kaldırılırken bir hata oluştu: uk.MESSAGE_TEXT_ERR13 =Сталася помилка під час видалення шляху застосунку: +vi.MESSAGE_TEXT_ERR13 =Đã xảy ra lỗi khi xóa đường dẫn Ứng dụng: en.MESSAGE_TEXT_ERR14 =An error occurred while restore files from backup: ru.MESSAGE_TEXT_ERR14 =Произошла ошибка при восстановлении файлов из резервной копии: @@ -343,6 +357,7 @@ sk.MESSAGE_TEXT_ERR14 =Pri obnovovaní súborov zo zálohy došlo k chybe: sl.MESSAGE_TEXT_ERR14 =Med obnavljanjem datotek iz varnostne kopije je prišlo do napake: tr.MESSAGE_TEXT_ERR14 =Yedeklemeden dosyalar geri yüklenirken bir hata oluştu: uk.MESSAGE_TEXT_ERR14 =Сталася помилка під час відновлення файлів із резервної копії: +vi.MESSAGE_TEXT_ERR14 =Đã xảy ra lỗi khi khôi phục tập tin từ bản sao lưu: en.MESSAGE_TEXT_ERR15 =An error occurred while restarting the program! ru.MESSAGE_TEXT_ERR15 =Произошла ошибка при перезапуске приложения! @@ -366,6 +381,7 @@ sk.MESSAGE_TEXT_ERR15 =Pri reštartovaní programu došlo k chybe! sl.MESSAGE_TEXT_ERR15 =Pri ponovnem zagonu programa je prišlo do napake! tr.MESSAGE_TEXT_ERR15 =Program yeniden başlatılırken bir hata oluştu! uk.MESSAGE_TEXT_ERR15 =Сталася помилка під час перезапуску програми! +vi.MESSAGE_TEXT_ERR15 =Đã xảy ra lỗi khi khởi động lại chương trình! en.MESSAGE_TEXT_ERR16 =SDL init error: ru.MESSAGE_TEXT_ERR16 =Ошибка инициализации SDL: @@ -389,6 +405,7 @@ sk.MESSAGE_TEXT_ERR16 =Chyba SDL init: sl.MESSAGE_TEXT_ERR16 =Napaka pri zagonu SDL: tr.MESSAGE_TEXT_ERR16 =SDL başlatma hatası: uk.MESSAGE_TEXT_ERR16 =Помилка запуску SDL: +vi.MESSAGE_TEXT_ERR16 =Lỗi khởi tạo SDL: en.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher returned error: ru.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher вернул ошибку: @@ -411,4 +428,5 @@ pt_PT.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher retornou erro: sk.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher vrátil chybu: sl.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher je vrnil napako: tr.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher hata döndürdü: -uk.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher повернув помилку: \ No newline at end of file +uk.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher повернув помилку: +vi.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher đã trả lỗi: \ No newline at end of file From 33e96341fe209e12aae09e08ff0d0d5a8a8b4af7 Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Thu, 14 Dec 2023 12:08:54 +0300 Subject: [PATCH 025/316] added fi --- .../extras/update-daemon/res/langs/langs.iss | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/win-linux/extras/update-daemon/res/langs/langs.iss b/win-linux/extras/update-daemon/res/langs/langs.iss index 60e3c4dce..4cf6745e1 100644 --- a/win-linux/extras/update-daemon/res/langs/langs.iss +++ b/win-linux/extras/update-daemon/res/langs/langs.iss @@ -11,6 +11,7 @@ zh_CN.CAPTION_TEXT =ONLYOFFICE 更新服务 bg.CAPTION_TEXT =ONLYOFFICE Услуга за Актуализации cs.CAPTION_TEXT =Aktualizační služba ONLYOFFICE el.CAPTION_TEXT =Υπηρεσία ενημέρωσης ONLYOFFICE +fi.CAPTION_TEXT =ONLYOFFICE Päivityspalvelu hy.CAPTION_TEXT =ONLYOFFICE-ի թարմացման ծառայություն ko.CAPTION_TEXT =ONLYOFFICE 업데이트 서비스 lv.CAPTION_TEXT =ONLYOFFICE atjaunināšanas pakalpojums @@ -35,6 +36,7 @@ zh_CN.MESSAGE_TEXT_ERR1 =发生错误: bg.MESSAGE_TEXT_ERR1 =Възникна грешка: cs.MESSAGE_TEXT_ERR1 =Došlo k chybě: el.MESSAGE_TEXT_ERR1 =Εμφανίστηκε σφάλμα: +fi.MESSAGE_TEXT_ERR1 =Tapahtui virhe: hy.MESSAGE_TEXT_ERR1 =Սխալ է տեղի ունեցել․ ko.MESSAGE_TEXT_ERR1 =오류가 발생했습니다: lv.MESSAGE_TEXT_ERR1 =Radās kļūda: @@ -59,6 +61,7 @@ zh_CN.MESSAGE_TEXT_ERR2 =删除时出错: bg.MESSAGE_TEXT_ERR2 =Възникна грешка при изтриването: cs.MESSAGE_TEXT_ERR2 =Při mazání došlo k chybě: el.MESSAGE_TEXT_ERR2 =Προέκυψε σφάλμα κατά τη διαγραφή: +fi.MESSAGE_TEXT_ERR2 =Virhe poistaessa: hy.MESSAGE_TEXT_ERR2 =Ջնջելիս սխալ է տեղի ունեցել՝ ko.MESSAGE_TEXT_ERR2 =삭제하는 동안 오류가 발생했습니다: lv.MESSAGE_TEXT_ERR2 =Dzēšot, radās kļūda: @@ -83,6 +86,7 @@ zh_CN.MESSAGE_TEXT_ERR3 =创建时出错: bg.MESSAGE_TEXT_ERR3 =Възникна грешка при създаването: cs.MESSAGE_TEXT_ERR3 =Při vytváření došlo k chybě: el.MESSAGE_TEXT_ERR3 =Εμφανίστηκε σφάλμα κατά τη δημιουργία: +fi.MESSAGE_TEXT_ERR3 =Virhe luodessa: hy.MESSAGE_TEXT_ERR3 =Սխալ է տեղի ունեցել ստեղծելիս՝ ko.MESSAGE_TEXT_ERR3 =생성하는 동안 오류가 발생했습니다: lv.MESSAGE_TEXT_ERR3 =Radās kļūda, veidojot: @@ -107,6 +111,7 @@ zh_CN.MESSAGE_TEXT_ERR4 =重新启动服务时出错! bg.MESSAGE_TEXT_ERR4 =Възникна грешка при рестартирането на услугата! cs.MESSAGE_TEXT_ERR4 =Při restartování služby došlo k chybě! el.MESSAGE_TEXT_ERR4 =Εμφανίστηκε σφάλμα κατά την επανεκκίνηση της υπηρεσίας! +fi.MESSAGE_TEXT_ERR4 =Virhe palvelun uudelleen käynnistämisessä! hy.MESSAGE_TEXT_ERR4 =Սխալ է տեղի ունեցել ծառայությունը վերագործարկելիս․ ko.MESSAGE_TEXT_ERR4 =서비스를 다시 시작하는 동안 오류가 발생했습니다! lv.MESSAGE_TEXT_ERR4 =Restartējot pakalpojumu, radās kļūda! @@ -131,6 +136,7 @@ zh_CN.MESSAGE_TEXT_ERR5 =更新已取消。找不到文件夹: bg.MESSAGE_TEXT_ERR5 =Актуализацията е отменена. Не откриваме папка: cs.MESSAGE_TEXT_ERR5 =Aktualizace byla zrušena. Nelze najít složku: el.MESSAGE_TEXT_ERR5 =Η ενημέρωση ακυρώθηκε. Δεν μπορεί να βρεθεί ο φάκελος: +fi.MESSAGE_TEXT_ERR5 =Päivitys peruutettu. Kansiota ei löydy. hy.MESSAGE_TEXT_ERR5 =Թարմացումը չեղարկվել է: Թղթապանակը չի գտնվել՝ ko.MESSAGE_TEXT_ERR5 =업데이트가 취소되었습니다. 폴더를 찾을 수 없습니다: lv.MESSAGE_TEXT_ERR5 =Atjaunināšana ir atcelta. Nevar atrast mapi: @@ -155,6 +161,7 @@ zh_CN.MESSAGE_TEXT_ERR6 =更新已取消。 文件签名丢失: bg.MESSAGE_TEXT_ERR6 =Актуализацията е отменена. Подписът на файла липсва: cs.MESSAGE_TEXT_ERR6 =Aktualizace zrušena. Chybí podpis souboru: el.MESSAGE_TEXT_ERR6 =Η ενημέρωση ακυρώθηκε. Λείπει η υπογραφή του αρχείου: +fi.MESSAGE_TEXT_ERR6 =Päivitys peruutettu. Tiedoston allekirjoitus puuttuu: hy.MESSAGE_TEXT_ERR6 =Թարմացումը չեղարկվել է: Ֆայլի ստորագրությունը բացակայում է․ ko.MESSAGE_TEXT_ERR6 =업데이트가 취소되었습니다. 파일 서명이 누락되었습니다: lv.MESSAGE_TEXT_ERR6 =Atjaunināšana ir atcelta. Trūkst faila paraksta: @@ -179,6 +186,7 @@ zh_CN.MESSAGE_TEXT_ERR7 =更新已取消。 无法删除文件夹: bg.MESSAGE_TEXT_ERR7 =Актуализацията е отменена. Папката не може да се изтрие: cs.MESSAGE_TEXT_ERR7 =Aktualizace zrušena. Nelze smazat složku: el.MESSAGE_TEXT_ERR7 =Η ενημέρωση ακυρώθηκε. Δεν είναι δυνατή η διαγραφή φακέλου: +fi.MESSAGE_TEXT_ERR7 =Päivitys peruutettu. Kansiota ei voi poistaa: hy.MESSAGE_TEXT_ERR7 =Թարմացումը չեղարկվել է: Հնարավոր չէ ջնջել պանակը՝ ko.MESSAGE_TEXT_ERR7 =업데이트가 취소되었습니다. 폴더를 삭제할 수 없습니다: lv.MESSAGE_TEXT_ERR7 =Atjaunināšana ir atcelta. Nevar izdzēst mapi: @@ -203,6 +211,7 @@ zh_CN.MESSAGE_TEXT_ERR8 =更新已取消。 程序未关闭: bg.MESSAGE_TEXT_ERR8 =Актуализацията е отменена. Програмата не е затворена: cs.MESSAGE_TEXT_ERR8 =Aktualizace zrušena. Program není uzavřen: el.MESSAGE_TEXT_ERR8 =Η ενημέρωση ακυρώθηκε. Το πρόγραμμα δεν έχει κλείσει: +fi.MESSAGE_TEXT_ERR8 =Päivitys peruutettu. Ohjelmaa ei ole suljettu: hy.MESSAGE_TEXT_ERR8 =Թարմացումը չեղարկվել է: Ծրագիրը փակված չէ։ ko.MESSAGE_TEXT_ERR8 =업데이트가 취소되었습니다. 프로그램이 종료되지 않았습니다: lv.MESSAGE_TEXT_ERR8 =Atjaunināšana ir atcelta. Programma nav aizvērta: @@ -227,6 +236,7 @@ zh_CN.MESSAGE_TEXT_ERR9 =更新已取消。 无法创建文件夹: bg.MESSAGE_TEXT_ERR9 =Актуализацията е отменена. Папката не може да се създаде: cs.MESSAGE_TEXT_ERR9 =Aktualizace zrušena. Nelze vytvořit složku: el.MESSAGE_TEXT_ERR9 =Η ενημέρωση ακυρώθηκε. Δεν μπορεί να δημιουργηθεί φάκελος: +fi.MESSAGE_TEXT_ERR9 =Päivitys peruutettu. Kansiota ei voi luoda: hy.MESSAGE_TEXT_ERR9 =Թարմացումը չեղարկվել է: Թղթապանակ ստեղծել հնարավոր չէ՝ ko.MESSAGE_TEXT_ERR9 =업데이트가 취소되었습니다. 폴더를 생성할 수 없습니다: lv.MESSAGE_TEXT_ERR9 =Atjaunināšana ir atcelta. Nevar izveidot mapi: @@ -251,6 +261,7 @@ zh_CN.MESSAGE_TEXT_ERR10 =更新已取消。 无法替换要备份的文件: bg.MESSAGE_TEXT_ERR10 =Актуализацията е отменена. Не могат да се заменят файловете за архивиране: cs.MESSAGE_TEXT_ERR10 =Aktualizace zrušena. Nelze nahradit soubory do zálohy: el.MESSAGE_TEXT_ERR10 =Η ενημέρωση ακυρώθηκε. Δεν μπορεί να αντικαταστήσει αρχεία για δημιουργία αντιγράφων ασφαλείας: +fi.MESSAGE_TEXT_ERR10 =Päivitys peruutettu. Varmuuskopioitavia tiedostoja ei voi korvata: hy.MESSAGE_TEXT_ERR10 =Թարմացումը չեղարկվել է: Հնարավոր չէ փոխարինել ֆայլերը կրկնօրինակում՝ ko.MESSAGE_TEXT_ERR10 =업데이트가 취소되었습니다. 백업할 파일을 교체할 수 없습니다: lv.MESSAGE_TEXT_ERR10 =Atjaunināšana ir atcelta. Nevar aizstāt failus, lai dublētu: @@ -275,6 +286,7 @@ zh_CN.MESSAGE_TEXT_ERR11 =无法从备份中恢复文件! bg.MESSAGE_TEXT_ERR11 =Файловете от резервното копие не могат да се възстановят! cs.MESSAGE_TEXT_ERR11 =Nelze obnovit soubory ze zálohy! el.MESSAGE_TEXT_ERR11 =Δεν είναι δυνατή η επαναφορά αρχείων από το αντίγραφο ασφαλείας! +fi.MESSAGE_TEXT_ERR11 =Tiedostoja ei voi palauttaa varmuuskopiosta! hy.MESSAGE_TEXT_ERR11 =Հնարավոր չէ վերականգնել ֆայլերը կրկնօրինակումից։ ko.MESSAGE_TEXT_ERR11 =백업에서 파일을 복원할 수 없습니다! lv.MESSAGE_TEXT_ERR11 =Nevar atjaunot failus no dublējuma! @@ -299,6 +311,7 @@ zh_CN.MESSAGE_TEXT_ERR12 =更新已取消。 无法将更新文件移动到应 bg.MESSAGE_TEXT_ERR12 =Актуализацията е отменена. Не можете да местите актуализации към пътя на Приложението: cs.MESSAGE_TEXT_ERR12 =Aktualizace zrušena. Nelze přesunout aktualizace do cesty k aplikaci: el.MESSAGE_TEXT_ERR12 =Η ενημέρωση ακυρώθηκε. Δεν είναι δυνατή η μετακίνηση ενημερώσεων στη διαδρομή της εφαρμογής: +fi.MESSAGE_TEXT_ERR12 =Päivitys peruutettu. Päivityksiä ei voi siirtää sovelluspolkuun: hy.MESSAGE_TEXT_ERR12 =Թարմացումը չեղարկվել է: Հնարավոր չէ թարմացումները տեղափոխել App(հավելված) path ko.MESSAGE_TEXT_ERR12 =업데이트가 취소되었습니다. 업데이트를 앱 경로로 이동할 수 없습니다: lv.MESSAGE_TEXT_ERR12 =Atjaunināšana ir atcelta. Nevar pārvietot atjauninājumus uz lietotnes ceļu: @@ -323,6 +336,7 @@ zh_CN.MESSAGE_TEXT_ERR13 =删除应用程序路径时出错: bg.MESSAGE_TEXT_ERR13 =Възникна грешка при премахване пътя на Приложението: cs.MESSAGE_TEXT_ERR13 =Při odebírání cesty k aplikaci došlo k chybě: el.MESSAGE_TEXT_ERR13 =Παρουσιάστηκε σφάλμα κατά την αφαίρεση της διαδρομής της εφαρμογής: +fi.MESSAGE_TEXT_ERR13 =Virhe poistaessa sovelluspolkua: hy.MESSAGE_TEXT_ERR13 =App path-ը հեռացնելիս սխալ առաջացավ՝ ko.MESSAGE_TEXT_ERR13 =앱 경로를 삭제하는 동안 오류가 발생했습니다: lv.MESSAGE_TEXT_ERR13 =Noņemot lietotnes ceļu, radās kļūda: @@ -347,6 +361,7 @@ zh_CN.MESSAGE_TEXT_ERR14 =从备份恢复文件时出错: bg.MESSAGE_TEXT_ERR14 =Възникна грешка при възстановяване на файлове от резервно копие: cs.MESSAGE_TEXT_ERR14 =Při obnově souborů ze zálohy došlo k chybě: el.MESSAGE_TEXT_ERR14 =Εμφανίστηκε σφάλμα κατά την επαναφορά αρχείων από αντίγραφο ασφαλείας: +fi.MESSAGE_TEXT_ERR14 =Virhe palautettaessa tiedostoja varmuuskopiosta: hy.MESSAGE_TEXT_ERR14 =Սխալ է տեղի ունեցել ֆայլերը կրկնօրինակումից վերականգնելիս՝ ko.MESSAGE_TEXT_ERR14 =백업에서 파일을 복원하는 동안 오류가 발생했습니다: lv.MESSAGE_TEXT_ERR14 =Atjaunojot failus no dublējuma, radās kļūda: @@ -371,6 +386,7 @@ zh_CN.MESSAGE_TEXT_ERR15 =重新启动程序时出错! bg.MESSAGE_TEXT_ERR15 =Възникна грешка при рестартиране на програмата! cs.MESSAGE_TEXT_ERR15 =Při restartování programu došlo k chybě! el.MESSAGE_TEXT_ERR15 =Εμφανίστηκε σφάλμα κατά την επανεκκίνηση του προγράμματος! +fi.MESSAGE_TEXT_ERR15 =Virhe ohjelmaa uudelleen käynnistettäessä! hy.MESSAGE_TEXT_ERR15 =Ծրագիրը վերագործարկելիս սխալ է տեղի ունեցել: ko.MESSAGE_TEXT_ERR15 =프로그램을 다시 시작하는 동안 오류가 발생했습니다! lv.MESSAGE_TEXT_ERR15 =Restartējot programmu, radās kļūda! @@ -395,6 +411,7 @@ zh_CN.MESSAGE_TEXT_ERR16 =SDL 初始化错误: bg.MESSAGE_TEXT_ERR16 =Грешка при стартиране на SDL: cs.MESSAGE_TEXT_ERR16 =Chyba při inicializaci SDL: el.MESSAGE_TEXT_ERR16 =Σφάλμα εκκίνησης SDL: +fi.MESSAGE_TEXT_ERR16 =SDL-aloitusvirhe: hy.MESSAGE_TEXT_ERR16 =SDL սկզբնական սխալ. ko.MESSAGE_TEXT_ERR16 =SDL 초기화 오류: lv.MESSAGE_TEXT_ERR16 =SDL init kļūda: @@ -419,6 +436,7 @@ zh_CN.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher 返回错误: bg.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher върна грешка: cs.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher hlásí chybu: el.MESSAGE_TEXT_ERR17 =Το ServiceCtrlDispatcher επέστρεψε σφάλμα: +fi.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher palautti virheen: hy.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher-ը վերադարձրեց սխալը. ko.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher가 오류를 반환했습니다: lv.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher atgrieza kļūdu: From ea657469f3e9761fb0b970c5061bd2da546c29c4 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Wed, 20 Dec 2023 10:32:23 +0200 Subject: [PATCH 026/316] [win-linux] ctabar: refactoring --- win-linux/src/components/ctabbar.cpp | 70 ++++++++++++---------------- 1 file changed, 29 insertions(+), 41 deletions(-) diff --git a/win-linux/src/components/ctabbar.cpp b/win-linux/src/components/ctabbar.cpp index a54d1ebf6..40a0856c4 100644 --- a/win-linux/src/components/ctabbar.cpp +++ b/win-linux/src/components/ctabbar.cpp @@ -54,6 +54,7 @@ #define tabIndex(i) tabList[i]->index #define signum(a) (a ? 1 : -1); #define PROCESSEVENTS() AscAppManager::getInstance().processEvents() +#define SKIP_EVENTS_QUEUE(callback) QTimer::singleShot(0, this, callback) class Tab : public QFrame @@ -269,7 +270,7 @@ void Tab::resizeEvent(QResizeEvent *event) } else { if (tab_width != new_width) { tab_width = new_width; - QTimer::singleShot(0, this, [=]() { + SKIP_EVENTS_QUEUE([=]() { emit onTabWidthChanged(tab_width); }); } @@ -316,6 +317,7 @@ class CTabBar::CTabBarPrivate Left, Right }; + Tab* createTab(int posX, const QString &text); int getIntersectedOffset(int index); int getIntersectedIndex(int direction, int &offsetX); int getLayoutsIntersectedIndex(Tab *tab, int &offsetX); @@ -362,6 +364,28 @@ CTabBar::CTabBarPrivate::CTabBarPrivate(CTabBar* owner) : CTabBar::CTabBarPrivate::~CTabBarPrivate() {} +Tab* CTabBar::CTabBarPrivate::createTab(int posX, const QString &text) +{ + Tab *tab = new Tab(tabArea); + tab->move(posX, 0); + tab->setFixedHeight(tabArea->height()); + tab->setText(text, elideMode); + if (tab->icon_label->minimumSize().isNull()) { + tab->icon_label->setBaseSize(iconSize); + tab->icon_label->setFixedSize(iconSize); + } + connect(tab->close_btn, &QToolButton::clicked, tab, [=]() { + emit owner->tabCloseRequested(tab->index); + }); + connect(tab, &Tab::onTabWidthChanged, tab, [=](int width) { + if (tab_width != width) { + tab_width = width; + onTabWidthChanged(width); + } + }); + return tab; +} + int CTabBar::CTabBarPrivate::getIntersectedOffset(int index) { if (indexIsValid(index)) { @@ -635,25 +659,9 @@ int CTabBar::addTab(const QString &text) const int lastIndex = d->tabList.size() - 1; const int posX = (lastIndex == -1) ? 0 : d->nextTabPosByPrev(lastIndex); - Tab *tab = new Tab(d->tabArea); - tab->move(posX, 0); - tab->setFixedHeight(d->tabArea->height()); - tab->setText(text, d->elideMode); - if (tab->icon_label->minimumSize().isNull()) { - tab->icon_label->setBaseSize(d->iconSize); - tab->icon_label->setFixedSize(d->iconSize); - } + Tab *tab = d->createTab(posX, text); tab->index = lastIndex + 1; d->tabList.append(tab); - connect(tab->close_btn, &QToolButton::clicked, this, [=]() { - emit tabCloseRequested(tab->index); - }); - connect(tab, &Tab::onTabWidthChanged, this, [=](int width) { - if (d->tab_width != width) { - d->tab_width = width; - d->onTabWidthChanged(width); - } - }); tabInserted(lastIndex + 1); d->onCurrentChanged(lastIndex + 1); return d->currentIndex; @@ -694,35 +702,15 @@ int CTabBar::insertTab(int index, const QString &text) if (!d->indexIsValid(index)) return addTab(text); - while (d->animationInProgress) - PROCESSEVENTS(); - int posX = d->_tabRect(index).left(); d->slide(index, d->tabList.size() - 1, d->cellWidth(), ANIMATION_DEFAULT_MS); while (d->animationInProgress) PROCESSEVENTS(); - Tab *tab = new Tab(d->tabArea); - tab->move(posX, 0); - tab->setFixedHeight(d->tabArea->height()); - tab->setText(text, d->elideMode); - if (tab->icon_label->minimumSize().isNull()) { - tab->icon_label->setBaseSize(d->iconSize); - tab->icon_label->setFixedSize(d->iconSize); - } + Tab *tab = d->createTab(posX, text); d->tabList.insert(index, tab); for (int i = index; i < d->tabList.size(); i++) d->tabIndex(i) = i; - - connect(tab->close_btn, &QToolButton::clicked, this, [=]() { - emit tabCloseRequested(tab->index); - }); - connect(tab, &Tab::onTabWidthChanged, this, [=](int width) { - if (d->tab_width != width) { - d->tab_width = width; - d->onTabWidthChanged(width); - } - }); tabInserted(index); d->onCurrentChanged(index); return d->currentIndex; @@ -863,7 +851,7 @@ void CTabBar::setTabIcon(int index, const QIcon &icon) void CTabBar::setTabText(int index, const QString &text) { if (d->indexIsValid(index)) - d->tabList[index]->setText(text); + d->tabList[index]->setText(text, d->elideMode); } void CTabBar::setTabToolTip(int index, const QString &text) @@ -1097,7 +1085,7 @@ bool CTabBar::eventFilter(QObject *watched, QEvent *event) d->movedTab->hide(); d->movedTab = nullptr; d->movedTabIndex = -1; - QTimer::singleShot(0, this, [=]() { + SKIP_EVENTS_QUEUE([=]() { removeTab(d->currentIndex); while (d->animationInProgress) PROCESSEVENTS(); From 2ad2aee4530621042809ee1cbe824a1f6d0bb0f2 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Wed, 20 Dec 2023 10:32:56 +0200 Subject: [PATCH 027/316] [win-linux] ceditorwindow: debug --- win-linux/src/windows/ceditorwindow_p.h | 1 + 1 file changed, 1 insertion(+) diff --git a/win-linux/src/windows/ceditorwindow_p.h b/win-linux/src/windows/ceditorwindow_p.h index ce628b435..ee5be227f 100644 --- a/win-linux/src/windows/ceditorwindow_p.h +++ b/win-linux/src/windows/ceditorwindow_p.h @@ -747,6 +747,7 @@ class CEditorWindowPrivate : public CCefEventsGate iconcrypted->setPixmap(QIcon{":/title/icons/secure.svg"}.pixmap(QSize(20,20) * window->m_dpiRatio)); iconcrypted->setFixedSize(ICON_SIZE * window->m_dpiRatio); + iconcrypted->show(); int y = (window->m_labelTitle->height() - ICON_SIZE.height() * window->m_dpiRatio)/2; iconcrypted->move(0, y); connect(window->m_labelTitle, &CElipsisLabel::onResize, this, [=](QSize size, int textWidth) { From c41c1aeea21d25e22f3d317da5da262d455e3aac Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Wed, 20 Dec 2023 10:35:29 +0200 Subject: [PATCH 028/316] [win-linux] add feature: RTL mode --- win-linux/res/styles/styles.qss | 28 +++++---- win-linux/res/styles/styles@1.25x.qss | 2 + win-linux/res/styles/styles@1.5x.qss | 2 + win-linux/res/styles/styles@1.75x.qss | 2 + win-linux/res/styles/styles@2.25x.qss | 2 + win-linux/res/styles/styles@2.5x.qss | 2 + win-linux/res/styles/styles@2.75x.qss | 2 + win-linux/res/styles/styles@2x.qss | 2 + win-linux/res/styles/styles@3.5x.qss | 2 + win-linux/res/styles/styles@3x.qss | 2 + win-linux/res/styles/styles@4.5x.qss | 2 + win-linux/res/styles/styles@4x.qss | 2 + win-linux/res/styles/styles@5x.qss | 2 + win-linux/res/styles/tabbar.qss | 19 ++++++- .../src/cascapplicationmanagerwrapper.cpp | 39 +++++++++++++ win-linux/src/cascapplicationmanagerwrapper.h | 3 + win-linux/src/clangater.cpp | 5 ++ win-linux/src/clangater.h | 1 + win-linux/src/components/asctabwidget.cpp | 31 ++++++++-- win-linux/src/components/cdownloadwidget.cpp | 26 ++++++++- win-linux/src/components/cdownloadwidget.h | 1 + win-linux/src/components/celipsislabel.cpp | 12 ++++ win-linux/src/components/celipsislabel.h | 1 + win-linux/src/components/ctabbar.cpp | 57 +++++++++++++++++-- win-linux/src/components/ctabbar.h | 3 +- .../src/platform_linux/gtkfilechooser.cpp | 4 ++ win-linux/src/platform_linux/gtkmessage.cpp | 3 + .../src/platform_linux/gtkprintdialog.cpp | 3 + win-linux/src/platform_linux/updatedialog.cpp | 4 ++ win-linux/src/platform_win/message.cpp | 3 + win-linux/src/platform_win/updatedialog.cpp | 3 + win-linux/src/prop/cmainwindowimpl.cpp | 2 + win-linux/src/windows/ceditorwindow.cpp | 5 ++ win-linux/src/windows/ceditorwindow.h | 1 + win-linux/src/windows/ceditorwindow_p.h | 33 ++++++++++- win-linux/src/windows/cmainwindow.cpp | 17 +++++- win-linux/src/windows/cmainwindow.h | 1 + win-linux/src/windows/cpresenterwindow.cpp | 5 ++ win-linux/src/windows/cpresenterwindow.h | 1 + .../platform_linux/cwindowplatform.cpp | 8 +++ .../windows/platform_linux/cwindowplatform.h | 1 + .../windows/platform_win/cwindowplatform.cpp | 13 +++++ .../windows/platform_win/cwindowplatform.h | 2 + 43 files changed, 331 insertions(+), 28 deletions(-) diff --git a/win-linux/res/styles/styles.qss b/win-linux/res/styles/styles.qss index 7d12e1abb..e0c6e212f 100644 --- a/win-linux/res/styles/styles.qss +++ b/win-linux/res/styles/styles.qss @@ -93,8 +93,10 @@ QPushButton#toolButtonMain { font-size: 10px; font-family: 'Open Sans',sans-serif; font-weight: bold; + border-left: 0px; border-right: 1px solid #f1f1f1; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-right: 0px; border-left: 1px solid #f1f1f1;} /*QPushButton#toolButtonMain[theme=light] {*/ /* border: 1px solid #b6b6b6;*/ @@ -117,8 +119,9 @@ QPushButton#toolButtonMain[class=normal], QPushButton#toolButtonMain[class=normal] { background: #f1f1f1; - border-right-color: #dfdfdf; + border-color: #dfdfdf; } +#mainPanel[rtl=true] QPushButton#toolButtonMain[class=normal] {border-color: #dfdfdf;} QPushButton#toolButtonMain[class=normal]:hover { background: #cecece; @@ -145,7 +148,8 @@ QPushButton::menu-indicator {width: 0px; height: 0px;} /*border-image: url(:/res/icons/menu-indicator-dark.png) 0 10 0 0 repeat repeat;*/ /*}*/ -QPushButton#toolButtonDownload {border-right: 1px solid #dfdfdf; max-width: 40px; width: 40px; max-height: 28px; height: 28px;} +QPushButton#toolButtonDownload {border-left: 0px; border-right: 1px solid #dfdfdf; max-width: 40px; width: 40px; max-height: 28px; height: 28px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-right: 0px; border-left: 1px solid #dfdfdf;} /**************************/ /* dark theme definitions */ @@ -160,9 +164,11 @@ QPushButton#toolButtonDownload {border-right: 1px solid #dfdfdf; max-width: 40px color: #d9d9d9; } -#mainPanel[uitheme=theme-dark] QPushButton#toolButtonDownload, +#mainPanel[uitheme=theme-dark] QPushButton#toolButtonDownload { + border-color: #505050; +} #mainPanel[uitheme=theme-dark] QPushButton#toolButtonMain { - border-right-color: #333; + border-color: #333; } #mainPanel[uitheme=theme-dark] QPushButton#toolButtonMain[class=active] { @@ -171,7 +177,7 @@ QPushButton#toolButtonDownload {border-right: 1px solid #dfdfdf; max-width: 40px #mainPanel[uitheme=theme-dark] QPushButton#toolButtonMain[class=normal] { background: #404040; - border-right-color: #505050; + border-color: #505050; } #mainPanel[uitheme=theme-dark] QPushButton#toolButtonMain[class=normal]:hover { @@ -223,14 +229,16 @@ QPushButton#toolButtonDownload {border-right: 1px solid #dfdfdf; max-width: 40px background: #1e1e1e; } -#mainPanel[uitheme=theme-contrast-dark] QPushButton#toolButtonDownload, +#mainPanel[uitheme=theme-contrast-dark] QPushButton#toolButtonDownload { + border-color: #414141; +} #mainPanel[uitheme=theme-contrast-dark] QPushButton#toolButtonMain { - border-right-color: #1e1e1e; + border-color: #1e1e1e; } #mainPanel[uitheme=theme-contrast-dark] QPushButton#toolButtonMain[class=normal] { background: #2a2a2a; - border-right-color: #414141; + border-color: #414141; } #mainPanel[uitheme=theme-contrast-dark] QPushButton#toolButtonMain[class=normal]:hover { @@ -249,11 +257,11 @@ QPushButton#toolButtonDownload {border-right: 1px solid #dfdfdf; max-width: 40px /***********************************/ #mainPanel[uitheme=theme-classic-light] QPushButton#toolButtonMain { - border-right-color: #f1f1f1; + border-color: #f1f1f1; } #mainPanel[uitheme=theme-classic-light] QPushButton#toolButtonMain[class=normal] { - border-right-color: #cbcbcb; + border-color: #cbcbcb; } diff --git a/win-linux/res/styles/styles@1.25x.qss b/win-linux/res/styles/styles@1.25x.qss index 9ec5f21f0..f569d11e7 100644 --- a/win-linux/res/styles/styles@1.25x.qss +++ b/win-linux/res/styles/styles@1.25x.qss @@ -25,6 +25,7 @@ QPushButton#toolButtonMaximize[kde=true], QPushButton#toolButtonMinimize[kde=tru QPushButton#toolButtonMain { border-right-width: 1px; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 1px;} QPushButton#toolButtonMain[theme=light] { border-width: 1px; @@ -38,6 +39,7 @@ QPushButton#toolButtonMain[class=normal], } QPushButton#toolButtonDownload {border-right-width: 1px; max-width: 50px; width: 50px; max-height: 35px; height: 35px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 1px;} /* ToolTip*/ diff --git a/win-linux/res/styles/styles@1.5x.qss b/win-linux/res/styles/styles@1.5x.qss index 1b3834555..8ba57ba52 100644 --- a/win-linux/res/styles/styles@1.5x.qss +++ b/win-linux/res/styles/styles@1.5x.qss @@ -26,6 +26,7 @@ QPushButton#toolButtonMain { /*font-size: 20px;*/ border-right-width: 2px; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 2px;} QPushButton#toolButtonMain[theme=light] { border-width: 2px; @@ -39,6 +40,7 @@ QPushButton#toolButtonMain[class=normal], } QPushButton#toolButtonDownload {border-right-width: 2px; max-width: 60px; width: 60px; max-height: 42px; height: 42px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 2px;} /* ToolTip*/ diff --git a/win-linux/res/styles/styles@1.75x.qss b/win-linux/res/styles/styles@1.75x.qss index aa533bc6d..dea8aa8f7 100644 --- a/win-linux/res/styles/styles@1.75x.qss +++ b/win-linux/res/styles/styles@1.75x.qss @@ -26,6 +26,7 @@ QPushButton#toolButtonMain { /*font-size: 20px;*/ border-right-width: 2px; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 2px;} QPushButton#toolButtonMain[theme=light] { border-width: 2px; @@ -39,6 +40,7 @@ QPushButton#toolButtonMain[class=normal], } QPushButton#toolButtonDownload {border-right-width: 2px; max-width: 70px; width: 70px; max-height: 49px; height: 49px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 2px;} /* ToolTip*/ diff --git a/win-linux/res/styles/styles@2.25x.qss b/win-linux/res/styles/styles@2.25x.qss index a89bdd71e..e095236f3 100644 --- a/win-linux/res/styles/styles@2.25x.qss +++ b/win-linux/res/styles/styles@2.25x.qss @@ -11,11 +11,13 @@ QPushButton#toolButtonMaximize[kde=true], QPushButton#toolButtonMinimize[kde=tru QPushButton#toolButtonClose[kde=true] {padding: 5px 0px 15px;} QPushButton#toolButtonMain {font-size: 23px; border-right-width: 2px;} +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 2px;} QPushButton#toolButtonMain[theme=light] {border-width: 2px; border-bottom: 0 none;} QPushButton#toolButtonMain[class=normal], QPushButton#toolButtonMain[class=normal]:hover {border-bottom-width: 2px;} QPushButton#toolButtonDownload {border-right-width: 2px; max-width: 90px; width: 90px; max-height: 63px; height: 63px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 2px;} /* ToolTip*/ diff --git a/win-linux/res/styles/styles@2.5x.qss b/win-linux/res/styles/styles@2.5x.qss index 1110c156f..ede78c8ef 100644 --- a/win-linux/res/styles/styles@2.5x.qss +++ b/win-linux/res/styles/styles@2.5x.qss @@ -26,6 +26,7 @@ QPushButton#toolButtonMain { font-size: 25px; border-right-width: 3px; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 3px;} QPushButton#toolButtonMain[theme=light] { border-width: 3px; @@ -39,6 +40,7 @@ QPushButton#toolButtonMain[class=normal], } QPushButton#toolButtonDownload {border-right-width: 3px; max-width: 100px; width: 100px; max-height: 70px; height: 70px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 3px;} /* ToolTip*/ diff --git a/win-linux/res/styles/styles@2.75x.qss b/win-linux/res/styles/styles@2.75x.qss index f713e1224..753f6d325 100644 --- a/win-linux/res/styles/styles@2.75x.qss +++ b/win-linux/res/styles/styles@2.75x.qss @@ -26,6 +26,7 @@ QPushButton#toolButtonMain { font-size: 28px; border-right-width: 3px; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 3px;} QPushButton#toolButtonMain[theme=light] { border-width: 3px; @@ -39,6 +40,7 @@ QPushButton#toolButtonMain[class=normal], } QPushButton#toolButtonDownload {border-right-width: 3px; max-width: 110px; width: 110px; max-height: 77px; height: 77px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 3px;} /* ToolTip*/ diff --git a/win-linux/res/styles/styles@2x.qss b/win-linux/res/styles/styles@2x.qss index cc02d82c6..fe550d24b 100644 --- a/win-linux/res/styles/styles@2x.qss +++ b/win-linux/res/styles/styles@2x.qss @@ -26,6 +26,7 @@ QPushButton#toolButtonMain { font-size: 20px; border-right-width: 2px; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 2px;} QPushButton#toolButtonMain[theme=light] { border-width: 2px; @@ -39,6 +40,7 @@ QPushButton#toolButtonMain[class=normal], } QPushButton#toolButtonDownload {border-right-width: 2px; max-width: 80px; width: 80px; max-height: 56px; height: 56px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 2px;} /* ToolTip*/ diff --git a/win-linux/res/styles/styles@3.5x.qss b/win-linux/res/styles/styles@3.5x.qss index f4e625d8c..f5b63e7f4 100644 --- a/win-linux/res/styles/styles@3.5x.qss +++ b/win-linux/res/styles/styles@3.5x.qss @@ -26,6 +26,7 @@ QPushButton#toolButtonMain { font-size: 35px; border-right-width: 4px; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 4px;} QPushButton#toolButtonMain[theme=light] { border-width: 4px; @@ -39,6 +40,7 @@ QPushButton#toolButtonMain[class=normal], } QPushButton#toolButtonDownload {border-right-width: 4px; max-width: 140px; width: 140px; max-height: 98px; height: 98px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 4px;} /* ToolTip*/ diff --git a/win-linux/res/styles/styles@3x.qss b/win-linux/res/styles/styles@3x.qss index e0a14f3d8..acdb42766 100644 --- a/win-linux/res/styles/styles@3x.qss +++ b/win-linux/res/styles/styles@3x.qss @@ -26,6 +26,7 @@ QPushButton#toolButtonMain { font-size: 30px; border-right-width: 3px; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 3px;} QPushButton#toolButtonMain[theme=light] { border-width: 3px; @@ -39,6 +40,7 @@ QPushButton#toolButtonMain[class=normal], } QPushButton#toolButtonDownload {border-right-width: 3px; max-width: 120px; width: 120px; max-height: 84px; height: 84px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 3px;} /* ToolTip*/ diff --git a/win-linux/res/styles/styles@4.5x.qss b/win-linux/res/styles/styles@4.5x.qss index aaf6f616c..084c739b1 100644 --- a/win-linux/res/styles/styles@4.5x.qss +++ b/win-linux/res/styles/styles@4.5x.qss @@ -26,6 +26,7 @@ QPushButton#toolButtonMain { font-size: 45px; border-right-width: 5px; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 5px;} QPushButton#toolButtonMain[theme=light] { border-width: 5px; @@ -39,6 +40,7 @@ QPushButton#toolButtonMain[class=normal], } QPushButton#toolButtonDownload {border-right-width: 5px; max-width: 180px; width: 180px; max-height: 126px; height: 126px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 5px;} /* ToolTip*/ diff --git a/win-linux/res/styles/styles@4x.qss b/win-linux/res/styles/styles@4x.qss index 14c59fb86..0ed0d5fce 100644 --- a/win-linux/res/styles/styles@4x.qss +++ b/win-linux/res/styles/styles@4x.qss @@ -26,6 +26,7 @@ QPushButton#toolButtonMain { font-size: 40px; border-right-width: 4px; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 4px;} QPushButton#toolButtonMain[theme=light] { border-width: 4px; @@ -39,6 +40,7 @@ QPushButton#toolButtonMain[class=normal], } QPushButton#toolButtonDownload {border-right-width: 4px; max-width: 160px; width: 160px; max-height: 112px; height: 112px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 4px;} /* ToolTip*/ diff --git a/win-linux/res/styles/styles@5x.qss b/win-linux/res/styles/styles@5x.qss index 3ed528af6..3c3342768 100644 --- a/win-linux/res/styles/styles@5x.qss +++ b/win-linux/res/styles/styles@5x.qss @@ -26,6 +26,7 @@ QPushButton#toolButtonMain { font-size: 50px; border-right-width: 5px; } +#mainPanel[rtl=true] QPushButton#toolButtonMain {border-left-width: 5px;} QPushButton#toolButtonMain[theme=light] { border-width: 5px; @@ -39,6 +40,7 @@ QPushButton#toolButtonMain[class=normal], } QPushButton#toolButtonDownload {border-right-width: 5px; max-width: 200px; width: 200px; max-height: 140px; height: 140px;} +#mainPanel[rtl=true] QPushButton#toolButtonDownload {border-left-width: 5px;} /* ToolTip*/ diff --git a/win-linux/res/styles/tabbar.qss b/win-linux/res/styles/tabbar.qss index 69cee6372..e5ffd3987 100644 --- a/win-linux/res/styles/tabbar.qss +++ b/win-linux/res/styles/tabbar.qss @@ -16,10 +16,11 @@ CTabBar #tabScroll>#rightButton:disabled {image: url(:/tabbar/icons/scrolltab_rd CTabBar #tabScroll>#rightButton:hover {image: url(:/tabbar/icons/scrolltab_rh.svg);} CTabBar #tabScroll>#rightButton:pressed {image: url(:/tabbar/icons/scrolltab_rp.svg);} -Tab {background: #f1f1f1; border: none; border-right: 1px solid #dfdfdf; margin: 0px; padding: 0px;} +Tab {background: #f1f1f1; border: none; border-left: 0px; border-right: 1px solid #dfdfdf; margin: 0px; padding: 0px;} Tab #tabIcon {background: transparent;} Tab #tabText {background: transparent; font-family: "Arial", "Helvetica", "Helvetica Neue", sans-serif;} Tab #tabButton {border: none; margin-top: 0px; image: none; background: transparent;} +#mainPanel[rtl=true] Tab {border-right: 0px; border-left: 1px solid #dfdfdf;} Tab[selected=true] {background: #446995; border-color: #446995;} @@ -31,9 +32,11 @@ CTabBar[active=false] Tab[selected=true][hovered=true] {background: #cecece;} /* light */ #mainPanel[uitheme=theme-light] Tab {border-right-color: #dfdfdf;} +#mainPanel[uitheme=theme-light][rtl=true] Tab {border-left-color: #dfdfdf;} /* classic light */ #mainPanel[uitheme=theme-classic-light] Tab {border-right-color: #cbcbcb;} +#mainPanel[uitheme=theme-classic-light][rtl=true] Tab {border-left-color: #cbcbcb;} /* dark */ #mainPanel[uitheme=theme-dark] CTabBar {background: #404040;} @@ -45,6 +48,7 @@ CTabBar[active=false] Tab[selected=true][hovered=true] {background: #cecece;} #mainPanel[uitheme=theme-dark] CTabBar[active=false] Tab[selected=true] {background: #404040; border-color: #505050;} #mainPanel[uitheme=theme-dark] Tab[selected=false][hovered=true], #mainPanel[uitheme=theme-dark] CTabBar[active=false] Tab[selected=true][hovered=true] {background: #555;} +#mainPanel[uitheme=theme-dark][rtl=true] Tab {border-left-color: #505050;} /* contrast-dark */ #mainPanel[uitheme=theme-contrast-dark] CTabBar {background: #2a2a2a;} @@ -56,6 +60,7 @@ CTabBar[active=false] Tab[selected=true][hovered=true] {background: #cecece;} #mainPanel[uitheme=theme-contrast-dark] CTabBar[active=false] Tab[selected=true] {background: #2a2a2a; border-color: #414141;} #mainPanel[uitheme=theme-contrast-dark] Tab[selected=false][hovered=true], #mainPanel[uitheme=theme-contrast-dark] CTabBar[active=false] Tab[selected=true][hovered=true] {background: #424242;} +#mainPanel[uitheme=theme-contrast-dark][rtl=true] Tab {border-left-color: #414141;} /* portal */ @@ -109,6 +114,7 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="1.25x"] Tab #tabIcon {padding-left: 8px; padding-right: 8px; min-width: 19px; min-height: 19px; max-width: 19px; max-height: 19px;} #mainPanel[zoom="1.25x"] Tab #tabText {font-size: 14px;} #mainPanel[zoom="1.25x"] Tab #tabButton {width: 20px; max-width: 20px; max-height: 20px; border-width: 2px;} +#mainPanel[zoom="1.25x"][rtl=true] Tab {border-left-width: 1px;} /* 1.5x */ #mainPanel[zoom="1.5x"] CTabBar #tabScroll {min-width: 48px; max-width: 48px;} @@ -117,6 +123,7 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="1.5x"] Tab #tabIcon {padding-left: 8px; padding-right: 8px; min-width: 24px; min-height: 24px; max-width: 24px; max-height: 24px;} #mainPanel[zoom="1.5x"] Tab #tabText {font-size: 15px;} #mainPanel[zoom="1.5x"] Tab #tabButton {width: 24px; max-width: 24px; max-height: 24px; border-width: 2px;} +#mainPanel[zoom="1.5x"][rtl=true] Tab {border-left-width: 2px;} /* 1.75x */ #mainPanel[zoom="1.75x"] CTabBar #tabScroll {min-width: 64px; max-width: 64px;} @@ -125,6 +132,7 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="1.75x"] Tab #tabIcon {padding-left: 8px; padding-right: 8px; min-width: 28px; min-height: 28px; max-width: 28px; max-height: 28px;} #mainPanel[zoom="1.75x"] Tab #tabText {font-size: 18px;} #mainPanel[zoom="1.75x"] Tab #tabButton {width: 28px; max-width: 28px; max-height: 28px; border-width: 2px;} +#mainPanel[zoom="1.75x"][rtl=true] Tab {border-left-width: 2px;} /* 2x */ #mainPanel[zoom="2x"] CTabBar #tabScroll {min-width: 64px; max-width: 64px;} @@ -133,6 +141,7 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="2x"] Tab #tabIcon {padding-left: 8px; padding-right: 8px; min-width: 32px; min-height: 32px; max-width: 32px; max-height: 32px;} #mainPanel[zoom="2x"] Tab #tabText {font-size: 20px;} #mainPanel[zoom="2x"] Tab #tabButton {width: 32px; max-width: 32px; max-height: 32px; border-width: 2px;} +#mainPanel[zoom="2x"][rtl=true] Tab {border-left-width: 2px;} /* 2.25x */ #mainPanel[zoom="2.25x"] CTabBar #tabScroll {min-width: 72px; max-width: 72px;} @@ -141,6 +150,7 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="2.25x"] Tab #tabIcon {padding-left: 9px; padding-right: 9px; min-width: 36px; min-height: 36px; max-width: 36px; max-height: 36px;} #mainPanel[zoom="2.25x"] Tab #tabText {font-size: 23px;} #mainPanel[zoom="2.25x"] Tab #tabButton {width: 36px; max-width: 36px; max-height: 36px; border-width: 2px;} +#mainPanel[zoom="2.25x"][rtl=true] Tab {border-left-width: 2px;} /* 2.5x */ #mainPanel[zoom="2.5x"] CTabBar #tabScroll {min-width: 80px; max-width: 80px;} @@ -149,6 +159,7 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="2.5x"] Tab #tabIcon {padding-left: 8px; padding-right: 8px; min-width: 40px; min-height: 40px; max-width: 40px; max-height: 40px;} #mainPanel[zoom="2.5x"] Tab #tabText {font-size: 25px;} #mainPanel[zoom="2.5x"] Tab #tabButton {width: 40px; max-width: 40px; max-height: 40px; border-width: 2px;} +#mainPanel[zoom="2.5x"][rtl=true] Tab {border-left-width: 3px;} /* 2.75x */ #mainPanel[zoom="2.75x"] CTabBar #tabScroll {min-width: 88px; max-width: 88px;} @@ -157,6 +168,7 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="2.75x"] Tab #tabIcon {padding-left: 8px; padding-right: 8px; min-width: 44px; min-height: 44px; max-width: 44px; max-height: 44px;} #mainPanel[zoom="2.75x"] Tab #tabText {font-size: 28px;} #mainPanel[zoom="2.75x"] Tab #tabButton {width: 44px; max-width: 44px; max-height: 44px; border-width: 2px;} +#mainPanel[zoom="2.75x"][rtl=true] Tab {border-left-width: 3px;} /* 3x */ #mainPanel[zoom="3x"] CTabBar #tabScroll {min-width: 96px; max-width: 96px;} @@ -165,6 +177,7 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="3x"] Tab #tabIcon {padding-left: 8px; padding-right: 8px; min-width: 48px; min-height: 48px; max-width: 48px; max-height: 48px;} #mainPanel[zoom="3x"] Tab #tabText {font-size: 30px;} #mainPanel[zoom="3x"] Tab #tabButton {width: 48px; max-width: 48px; max-height: 48px; border-width: 2px;} +#mainPanel[zoom="3x"][rtl=true] Tab {border-left-width: 3px;} /* 3.5x */ #mainPanel[zoom="3.5x"] CTabBar #tabScroll {min-width: 112px; max-width: 112px;} @@ -173,6 +186,7 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="3.5x"] Tab #tabIcon {padding-left: 8px; padding-right: 8px; min-width: 56px; min-height: 56px; max-width: 56px; max-height: 56px;} #mainPanel[zoom="3.5x"] Tab #tabText {font-size: 35px;} #mainPanel[zoom="3.5x"] Tab #tabButton {width: 56px; max-width: 56px; max-height: 56px; border-width: 2px;} +#mainPanel[zoom="3.5x"][rtl=true] Tab {border-left-width: 4px;} /* 4x */ #mainPanel[zoom="4x"] CTabBar #tabScroll {min-width: 128px; max-width: 128px;} @@ -181,6 +195,7 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="4x"] Tab #tabIcon {padding-left: 8px; padding-right: 8px; min-width: 64px; min-height: 64px; max-width: 64px; max-height: 64px;} #mainPanel[zoom="4x"] Tab #tabText {font-size: 40px;} #mainPanel[zoom="4x"] Tab #tabButton {width: 64px; max-width: 64px; max-height: 64px; border-width: 2px;} +#mainPanel[zoom="4x"][rtl=true] Tab {border-left-width: 4px;} /* 4.5x */ #mainPanel[zoom="4.5x"] CTabBar #tabScroll {min-width: 144px; max-width: 144px;} @@ -189,6 +204,7 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="4.5x"] Tab #tabIcon {padding-left: 8px; padding-right: 8px; min-width: 72px; min-height: 72px; max-width: 72px; max-height: 72px;} #mainPanel[zoom="4.5x"] Tab #tabText {font-size: 45px;} #mainPanel[zoom="4.5x"] Tab #tabButton {width: 72px; max-width: 72px; max-height: 72px; border-width: 2px;} +#mainPanel[zoom="4.5x"][rtl=true] Tab {border-left-width: 5px;} /* 5x */ #mainPanel[zoom="5x"] CTabBar #tabScroll {min-width: 160px; max-width: 160px;} @@ -197,3 +213,4 @@ Tab #tabButton {width: 16px; max-width: 16px; max-height: 16px; border-width: 2p #mainPanel[zoom="5x"] Tab #tabIcon {padding-left: 8px; padding-right: 8px; min-width: 80px; min-height: 80px; max-width: 80px; max-height: 80px;} #mainPanel[zoom="5x"] Tab #tabText {font-size: 50px;} #mainPanel[zoom="5x"] Tab #tabButton {width: 80px; max-width: 80px; max-height: 80px; border-width: 2px;} +#mainPanel[zoom="5x"][rtl=true] Tab {border-left-width: 5px;} diff --git a/win-linux/src/cascapplicationmanagerwrapper.cpp b/win-linux/src/cascapplicationmanagerwrapper.cpp index 65b994136..f0afb40c8 100644 --- a/win-linux/src/cascapplicationmanagerwrapper.cpp +++ b/win-linux/src/cascapplicationmanagerwrapper.cpp @@ -54,6 +54,8 @@ using namespace std; using namespace std::placeholders; +bool CAscApplicationManagerWrapper::m_rtlEnabled = false; + CAscApplicationManagerWrapper::CAscApplicationManagerWrapper(CAscApplicationManagerWrapper const&) { @@ -1159,6 +1161,11 @@ void CAscApplicationManagerWrapper::initializeApp() if ( !local_themes_array.isEmpty() ) EditorJSVariables::setVariable("localthemes", local_themes_array); + const bool _is_rtl = reg_user.contains("forcedRtl") ? reg_user.value("forcedRtl", false).toBool() : + CLangater::isRtlLanguage(CLangater::getCurrentLangCode()); + AscAppManager::setRtlEnabled(_is_rtl); + EditorJSVariables::setVariable("rtl", _is_rtl ? "yes" : "no"); + EditorJSVariables::setVariable("lang", CLangater::getCurrentLangCode()); EditorJSVariables::applyVariable("theme", { {"type", _app.m_themes->current().stype()}, @@ -1637,6 +1644,28 @@ bool CAscApplicationManagerWrapper::event(QEvent *event) return QObject::event(event); } +void CAscApplicationManagerWrapper::setRtlEnabled(bool state) +{ + if (m_rtlEnabled != state) { + m_rtlEnabled = state; + Qt::LayoutDirection direct = m_rtlEnabled ? Qt::RightToLeft : Qt::LeftToRight; + APP_CAST(_app); + if (_app.m_pMainWindow) + _app.m_pMainWindow->setLayoutDirection(direct); + for (auto const &r : _app.m_winsReporter) + r.second->setLayoutDirection(direct); + for (auto const &e : _app.m_vecEditors) { + CEditorWindow *editor = reinterpret_cast(e); + editor->setLayoutDirection(direct); + } + } +} + +bool CAscApplicationManagerWrapper::isRtlEnabled() +{ + return m_rtlEnabled; +} + bool CAscApplicationManagerWrapper::applySettings(const wstring& wstrjson) { QJsonParseError jerror; @@ -1691,6 +1720,16 @@ bool CAscApplicationManagerWrapper::applySettings(const wstring& wstrjson) setUserSettings(L"spell-check-input-mode", objRoot["spellcheckdetect"].toString() == "off" ? L"0" : L"default"); } + if ( objRoot.contains("rtl") ) { + _reg_user.setValue("forcedRtl", objRoot["rtl"].toBool(false)); + + /* + * show message and relaunch app + */ + } else { + _reg_user.remove("forcedRtl"); + } + wstring params = QString("lang=%1&username=%3&location=%2") .arg(_lang_id, Utils::systemLocationCode(), QUrl::toPercentEncoding(_user_newname)).toStdWString(); diff --git a/win-linux/src/cascapplicationmanagerwrapper.h b/win-linux/src/cascapplicationmanagerwrapper.h index 3e6fa2788..92d52e884 100644 --- a/win-linux/src/cascapplicationmanagerwrapper.h +++ b/win-linux/src/cascapplicationmanagerwrapper.h @@ -120,6 +120,7 @@ class CAscApplicationManagerWrapper : public QObject, public QAscApplicationMana CMainWindow * m_pMainWindow = nullptr; std::shared_ptr m_themes; + static bool m_rtlEnabled; public: CWindowsQueue& closeQueue(); @@ -201,6 +202,8 @@ private slots: static void closeAppWindows(); // TODO: combine with launchAppClose static void cancelClose(); + static void setRtlEnabled(bool); + static bool isRtlEnabled(); uint logoutCount(const std::wstring& portal) const; void Logout(const std::wstring& portal); diff --git a/win-linux/src/clangater.cpp b/win-linux/src/clangater.cpp index df22f9122..5af1d363b 100644 --- a/win-linux/src/clangater.cpp +++ b/win-linux/src/clangater.cpp @@ -305,3 +305,8 @@ void CLangater::addTranslation(const QString& dir) { addTranslation(dir, getInstance()->m_lang); } + +bool CLangater::isRtlLanguage(const QString &lang) { + QLocale loc = lang.isEmpty() ? QLocale::system() : QLocale(lang); + return loc.textDirection() == Qt::LayoutDirection::RightToLeft; +} diff --git a/win-linux/src/clangater.h b/win-linux/src/clangater.h index b44de8b66..5e7eea7cf 100644 --- a/win-linux/src/clangater.h +++ b/win-linux/src/clangater.h @@ -20,6 +20,7 @@ class CLangater : public QObject static QString getLangName(const QString& code = QString()); static void addTranslation(const QString& dir, const QString& name); static void addTranslation(const QString& dir); + static bool isRtlLanguage(const QString &lang = QString()); static QJsonObject availableLangsToJson(); diff --git a/win-linux/src/components/asctabwidget.cpp b/win-linux/src/components/asctabwidget.cpp index 19a41fdaa..fd7f7be6e 100644 --- a/win-linux/src/components/asctabwidget.cpp +++ b/win-linux/src/components/asctabwidget.cpp @@ -187,6 +187,23 @@ CAscTabWidget::CAscTabWidget(QWidget *parent, CTabBar *_pBar) removeWidget(wgt); insertWidget(to, wgt); }); + QObject::connect(m_pBar, &CTabBar::tabsSwapped, this, [=](int from, int to) { + if (from == to || !indexIsValid(from) || !indexIsValid(to)) + return; + auto wgt_from = widget(from); + auto wgt_to = widget(to); + blockSignals(true); + removeWidget(wgt_from); + removeWidget(wgt_to); + insertWidget(from < to ? from : to, from < to ? wgt_to : wgt_from); + insertWidget(from < to ? to : from, from < to ? wgt_from : wgt_to); + if (from == m_pBar->currentIndex()) + QStackedWidget::setCurrentIndex(to); + else + if (to == m_pBar->currentIndex()) + QStackedWidget::setCurrentIndex(from); + blockSignals(false); + }); } CTabPanel * CAscTabWidget::panel(int index) const @@ -220,7 +237,7 @@ int CAscTabWidget::addEditor(const COpenOptions& opts) pView->initAsEditor(); - int tab_index = -1; + int tab_index = AscAppManager::isRtlEnabled() ? 0 : -1; bool res_open = true; if (opts.srctype == etLocalFile) { pView->openLocalFile(opts.wurl, file_format, L""); @@ -247,8 +264,8 @@ int CAscTabWidget::addEditor(const COpenOptions& opts) data->setChanged(opts.srctype == etRecoveryFile); pView->setData(data); - tab_index = addWidget(panelwidget); - m_pBar->addTab(data->title()); + tab_index = insertWidget(tab_index, panelwidget); + m_pBar->insertTab(tab_index, data->title()); m_pBar->setTabToolTip(tab_index, data->title()); m_pBar->tabStartLoading(tab_index); @@ -367,7 +384,7 @@ int CAscTabWidget::addPortal(const QString& url, const QString& name, const QStr data->setUrl(_url); pView->setData(data); - int tab_index = -1; + int tab_index = AscAppManager::isRtlEnabled() ? 0 : -1; tab_index = insertWidget(tab_index, panelwidget); m_pBar->insertTab(tab_index, portal); @@ -408,7 +425,7 @@ int CAscTabWidget::addOAuthPortal(const QString& portal, const QString& type, co data->setUrl(portal); pView->setData(data); - int tab_index = -1; + int tab_index = AscAppManager::isRtlEnabled() ? 0 : -1; tab_index = insertWidget(tab_index, panelwidget); m_pBar->insertTab(tab_index, _portal); @@ -423,7 +440,7 @@ int CAscTabWidget::addOAuthPortal(const QString& portal, const QString& type, co int CAscTabWidget::insertPanel(QWidget * panel, int index) { - int tabindex = -1; + int tabindex = AscAppManager::isRtlEnabled() ? 0 : -1; CTabPanel * _panel = dynamic_cast(panel); Q_ASSERT(_panel != nullptr); @@ -432,6 +449,8 @@ int CAscTabWidget::insertPanel(QWidget * panel, int index) QWidget * panelwidget = createTabPanel(this, _panel); + if (index < 0 && AscAppManager::isRtlEnabled()) + index = 0; tabindex = insertWidget(index, panelwidget); m_pBar->insertTab(tabindex, tabdata->title()); m_pBar->setTabToolTip(tabindex, tabdata->title()); diff --git a/win-linux/src/components/cdownloadwidget.cpp b/win-linux/src/components/cdownloadwidget.cpp index 8a96dcde6..0825342e2 100644 --- a/win-linux/src/components/cdownloadwidget.cpp +++ b/win-linux/src/components/cdownloadwidget.cpp @@ -171,6 +171,7 @@ CDownloadWidget::CDownloadWidget(QWidget *parent) QLabel *labelTitle = new QLabel(m_titleFrame); labelTitle->setObjectName("labelTitle"); labelTitle->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + labelTitle->setAlignment((AscAppManager::isRtlEnabled() ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignAbsolute); labelTitle->setText(tr("Downloads")); m_titleFrame->layout()->addWidget(labelTitle); @@ -210,8 +211,10 @@ CDownloadWidget::CDownloadWidget(QWidget *parent) connect(m_pToolButton, &QPushButton::clicked, this, [=]() { polish(); show(); - QPoint offset(-1 * MAIN_WINDOW_BORDER_WIDTH * m_dpiRatio, (TITLE_HEIGHT + MAIN_WINDOW_BORDER_WIDTH) * m_dpiRatio); - QPoint pos = parent->geometry().topRight() - QPoint(WIDGET_MAX_WIDTH, 0) + offset + QPoint(qRound(SHADOW - MARGINS/3), qRound(-SHADOW + MARGINS/3)); + QPoint pos = AscAppManager::isRtlEnabled() ? parent->geometry().topLeft() : parent->geometry().topRight() - QPoint(WIDGET_MAX_WIDTH, 0); + QPoint brd_offset((AscAppManager::isRtlEnabled() ? 1 : -1) * MAIN_WINDOW_BORDER_WIDTH * m_dpiRatio, (TITLE_HEIGHT + MAIN_WINDOW_BORDER_WIDTH) * m_dpiRatio); + QPoint shd_offset((AscAppManager::isRtlEnabled() ? -1 : 1) * qRound(SHADOW - MARGINS/3), qRound(-SHADOW + MARGINS/3)); + pos += brd_offset + shd_offset; move(pos); int prefHeight = m_mapDownloads.size() * ITEM_MAX_HEIGHT + 74 * m_dpiRatio; setGeometry(QRect(pos, QSize(WIDGET_MAX_WIDTH, (prefHeight > WIDGET_MAX_HEIGHT) ? WIDGET_MAX_HEIGHT : prefHeight))); @@ -248,6 +251,7 @@ QWidget * CDownloadWidget::addFile(const QString& fn, int id) CElipsisLabel * name = new CElipsisLabel(fn); name->setObjectName("labelName"); name->setEllipsisMode(Qt::ElideRight); + name->setAlignment((AscAppManager::isRtlEnabled() ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignAbsolute); name->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); grid->addWidget(name, 0, 0, 1, 1); @@ -273,6 +277,7 @@ QWidget * CDownloadWidget::addFile(const QString& fn, int id) CElipsisLabel * info = new CElipsisLabel(QString("0 %1").arg(tr("kBps"))); info->setObjectName("labelInfo"); info->setEllipsisMode(Qt::ElideRight); + info->setAlignment((AscAppManager::isRtlEnabled() ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignAbsolute); info->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); grid->addWidget(info, 2, 0, 1, 2); @@ -325,6 +330,7 @@ void CDownloadWidget::downloadProcess(void * info) } QLabel *size_label = new QLabel; size_label->setObjectName("labelSize"); + size_label->setAlignment((AscAppManager::isRtlEnabled() ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignAbsolute); size_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); size_label->setText(getFileSize(QString::fromStdWString(pData->get_FilePath()))); lut->addWidget(size_label, 1, 0, 1, 2); @@ -505,6 +511,22 @@ void CDownloadWidget::applyTheme(const QString &theme) polish(); } +void CDownloadWidget::onLayoutDirectionChanged() +{ + setLayoutDirection(AscAppManager::isRtlEnabled() ? Qt::RightToLeft : Qt::LeftToRight); + if (QLabel *labelTitle = m_titleFrame->findChild("labelTitle")) + labelTitle->setAlignment((AscAppManager::isRtlEnabled() ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignAbsolute); + for (int i = 0; i < m_pContentArea->layout()->count(); ++i) { + auto item = m_pContentArea->layout()->itemAt(i); + if (item && item->widget()) { + const auto lb_list = item->widget()->findChildren(); + for (QLabel *lb : lb_list) { + lb->setAlignment((AscAppManager::isRtlEnabled() ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignAbsolute); + } + } + } +} + void CDownloadWidget::onStart() { if (!m_pToolButton->isVisible()) diff --git a/win-linux/src/components/cdownloadwidget.h b/win-linux/src/components/cdownloadwidget.h index 97ce4ae2a..4737f8ce4 100644 --- a/win-linux/src/components/cdownloadwidget.h +++ b/win-linux/src/components/cdownloadwidget.h @@ -52,6 +52,7 @@ class CDownloadWidget : public QWidget QPushButton * toolButton(); void updateScalingFactor(double); void applyTheme(const QString&); + void onLayoutDirectionChanged(); protected: virtual void closeEvent(QCloseEvent *) final; diff --git a/win-linux/src/components/celipsislabel.cpp b/win-linux/src/components/celipsislabel.cpp index 05f31704c..1587aad29 100644 --- a/win-linux/src/components/celipsislabel.cpp +++ b/win-linux/src/components/celipsislabel.cpp @@ -85,6 +85,18 @@ auto CElipsisLabel::setEllipsisMode(Qt::TextElideMode mode) -> void elide_mode = mode; } +auto CElipsisLabel::textWidth() -> int +{ + QString elt = ellipsis_text_(this, orig_text, elide_mode); + QFontMetrics fm(font()); +#if (QT_VERSION < QT_VERSION_CHECK(5,11,0)) + int textWidth = fm.width(elt); +#else + int textWidth = fm.horizontalAdvance(elt); +#endif + return textWidth; +} + auto CElipsisLabel::updateText() -> void { QString elt = ellipsis_text_(this, orig_text, elide_mode); diff --git a/win-linux/src/components/celipsislabel.h b/win-linux/src/components/celipsislabel.h index a3ff8df8a..01483365d 100644 --- a/win-linux/src/components/celipsislabel.h +++ b/win-linux/src/components/celipsislabel.h @@ -46,6 +46,7 @@ class CElipsisLabel : public QLabel auto setText(const QString&) -> void; auto setEllipsisMode(Qt::TextElideMode) -> void; auto updateText() -> void; + auto textWidth() -> int; signals: void onResize(QSize size, int textWidth); diff --git a/win-linux/src/components/ctabbar.cpp b/win-linux/src/components/ctabbar.cpp index 40a0856c4..a987a3479 100644 --- a/win-linux/src/components/ctabbar.cpp +++ b/win-linux/src/components/ctabbar.cpp @@ -122,6 +122,7 @@ Tab::Tab(QWidget *parent) : text_label = new QLabel(this); text_label->setObjectName("tabText"); + text_label->setAlignment((AscAppManager::isRtlEnabled() ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignVCenter | Qt::AlignAbsolute); text_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); lut->addWidget(text_label); @@ -472,6 +473,8 @@ void CTabBar::CTabBarPrivate::slide(int from, int to, int offset, int animation_ void CTabBar::CTabBarPrivate::scrollToDirection(int direction) { + if (AscAppManager::isRtlEnabled()) + direction = (direction == Direction::Left) ? Direction::Right : Direction::Left; while (animationInProgress) PROCESSEVENTS(); @@ -559,7 +562,10 @@ void CTabBar::CTabBarPrivate::changeScrollerState() break; } } - leftButton->setEnabled(allowScroll); + if (AscAppManager::isRtlEnabled()) + rightButton->setEnabled(allowScroll); + else + leftButton->setEnabled(allowScroll); allowScroll = false; for (int i = 0; i < tabList.size(); i++) { @@ -568,7 +574,10 @@ void CTabBar::CTabBarPrivate::changeScrollerState() break; } } - rightButton->setEnabled(allowScroll); + if (AscAppManager::isRtlEnabled()) + leftButton->setEnabled(allowScroll); + else + rightButton->setEnabled(allowScroll); } void CTabBar::CTabBarPrivate::reorderIndexes() @@ -624,8 +633,8 @@ CTabBar::CTabBar(QWidget *parent) : d->leftButton = new QToolButton(d->scrollFrame); d->rightButton = new QToolButton(d->scrollFrame); - d->leftButton->setObjectName("leftButton"); - d->rightButton->setObjectName("rightButton"); + d->leftButton->setObjectName(AscAppManager::isRtlEnabled() ? "rightButton" : "leftButton"); + d->rightButton->setObjectName(AscAppManager::isRtlEnabled() ? "leftButton" : "rightButton"); scrollLayout->addWidget(d->leftButton); scrollLayout->addWidget(d->rightButton); @@ -723,6 +732,27 @@ int CTabBar::insertTab(int index, const QIcon &icon, const QString &text) return actual_index; } +void CTabBar::swapTabs(int from, int to) +{ + while (d->animationInProgress) + PROCESSEVENTS(); + if (from == to || !d->indexIsValid(from) || !d->indexIsValid(to)) + return; + int posX = d->_tabRect(from).x(); + d->tabList[from]->move(d->_tabRect(to).x(), 0); + d->tabList[to]->move(posX, 0); + int from_index = d->tabIndex(from); + d->tabIndex(from) = d->tabIndex(to); + d->tabIndex(to) = from_index; + std::swap(d->tabList[from], d->tabList[to]); + emit tabsSwapped(from, to); + if (from == d->currentIndex) + d->onCurrentChanged(to); + else + if (to == d->currentIndex) + d->onCurrentChanged(from); +} + void CTabBar::removeTab(int index) { while (d->animationInProgress) @@ -1076,7 +1106,8 @@ bool CTabBar::eventFilter(QObject *watched, QEvent *event) } } } - if (!d->tabArea->rect().contains(me->pos()) && d->tabArea->rect().right() >= me->x()) { + bool undockDirectionIsValid = AscAppManager::isRtlEnabled() ? d->tabArea->rect().left() <= me->x() : d->tabArea->rect().right() >= me->x(); + if (!d->tabArea->rect().contains(me->pos()) && undockDirectionIsValid) { if (d->currentIndex != d->movedTabIndex) d->reorderIndexes(); bool accepted = false; @@ -1185,6 +1216,22 @@ bool CTabBar::eventFilter(QObject *watched, QEvent *event) case QEvent::Leave: QApplication::postEvent(d->tabArea, new QMouseEvent(QEvent::MouseButtonRelease, QCursor::pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier)); break; + case QEvent::LayoutDirectionChange: { + SKIP_EVENTS_QUEUE([=]() { + for (int i = 0; i < d->tabList.size(); i++) { + d->tabList[i]->polish(); + d->tabList[i]->text_label->setAlignment((AscAppManager::isRtlEnabled() ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignVCenter | Qt::AlignAbsolute); + } + d->leftButton->setObjectName(AscAppManager::isRtlEnabled() ? "rightButton" : "leftButton"); + d->rightButton->setObjectName(AscAppManager::isRtlEnabled() ? "leftButton" : "rightButton"); + d->leftButton->style()->polish(d->leftButton); + d->rightButton->style()->polish(d->rightButton); + int n = count(); + for (int i = 0; i < n/2; i++) + swapTabs(i, n - i - 1); + }); + break; + } default: break; } diff --git a/win-linux/src/components/ctabbar.h b/win-linux/src/components/ctabbar.h index d2960feae..82e9e8347 100644 --- a/win-linux/src/components/ctabbar.h +++ b/win-linux/src/components/ctabbar.h @@ -56,7 +56,7 @@ class CTabBar : public QFrame QSize iconSize() const; int insertTab(int index, const QString &text); int insertTab(int index, const QIcon &icon, const QString &text); -// void moveTab(int from, int to); + void swapTabs(int from, int to); void removeTab(int index); void setElideMode(Qt::TextElideMode mode); void setIconSize(const QSize &size); @@ -92,6 +92,7 @@ class CTabBar : public QFrame // void tabBarDoubleClicked(int index); void tabCloseRequested(int index); void tabMoved(int from, int to); + void tabsSwapped(int from, int to); void tabUndock(int index, bool &accepted); protected: diff --git a/win-linux/src/platform_linux/gtkfilechooser.cpp b/win-linux/src/platform_linux/gtkfilechooser.cpp index f268233c0..39eef5e92 100755 --- a/win-linux/src/platform_linux/gtkfilechooser.cpp +++ b/win-linux/src/platform_linux/gtkfilechooser.cpp @@ -3,6 +3,7 @@ #include #include "gtkutils.h" #include "gtkfilechooser.h" +#include "cascapplicationmanagerwrapper.h" #include @@ -82,6 +83,9 @@ static void nativeFileDialog(const Window &parent_xid, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER }; + + if (AscAppManager::isRtlEnabled()) + gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL); GtkWidget *dialog = NULL; dialog = gtk_file_chooser_dialog_new(title, NULL, diff --git a/win-linux/src/platform_linux/gtkmessage.cpp b/win-linux/src/platform_linux/gtkmessage.cpp index 65d1642ef..7af2bd360 100644 --- a/win-linux/src/platform_linux/gtkmessage.cpp +++ b/win-linux/src/platform_linux/gtkmessage.cpp @@ -36,6 +36,7 @@ #include #include #include "gtkmessage.h" +#include "cascapplicationmanagerwrapper.h" #include @@ -84,6 +85,8 @@ int GtkMsg::showMessage(QWidget *parent, GtkDialogFlags flags; flags = (GtkDialogFlags)(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT); + if (AscAppManager::isRtlEnabled()) + gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL); GtkWidget *dialog = NULL; dialog = gtk_message_dialog_new(NULL, flags, diff --git a/win-linux/src/platform_linux/gtkprintdialog.cpp b/win-linux/src/platform_linux/gtkprintdialog.cpp index 27bd99c1a..c58527d4a 100644 --- a/win-linux/src/platform_linux/gtkprintdialog.cpp +++ b/win-linux/src/platform_linux/gtkprintdialog.cpp @@ -3,6 +3,7 @@ #include "gtkutils.h" #include "gtkprintdialog.h" #include "components/cmessage.h" +#include "cascapplicationmanagerwrapper.h" #include #include #include @@ -369,6 +370,8 @@ QDialog::DialogCode GtkPrintDialog::exec() } // Init dialog + if (AscAppManager::isRtlEnabled()) + gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL); GtkWidget *dialog; dialog = gtk_print_unix_dialog_new(m_title.toUtf8().data(), NULL); gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG); diff --git a/win-linux/src/platform_linux/updatedialog.cpp b/win-linux/src/platform_linux/updatedialog.cpp index 157d687da..ce06f3cfb 100644 --- a/win-linux/src/platform_linux/updatedialog.cpp +++ b/win-linux/src/platform_linux/updatedialog.cpp @@ -36,6 +36,7 @@ #include "utils.h" #include #include "updatedialog.h" +#include "cascapplicationmanagerwrapper.h" #include //extern "C" { //#include "gtk_resources.h" @@ -77,6 +78,9 @@ int WinDlg::showDialog(QWidget *parent, gtk_init(NULL, NULL); GtkDialogFlags flags; flags = (GtkDialogFlags)(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT); + + if (AscAppManager::isRtlEnabled()) + gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL); GtkWidget *dialog = NULL; dialog = gtk_message_dialog_new(NULL, flags, diff --git a/win-linux/src/platform_win/message.cpp b/win-linux/src/platform_win/message.cpp index 4099ecd99..c506d09c2 100644 --- a/win-linux/src/platform_win/message.cpp +++ b/win-linux/src/platform_win/message.cpp @@ -33,6 +33,7 @@ #include #include "message.h" #include "utils.h" +#include "cascapplicationmanagerwrapper.h" #include #include #include @@ -172,6 +173,8 @@ int WinMsg::showMessage(QWidget *parent, config.dwFlags = TDF_POSITION_RELATIVE_TO_WINDOW | TDF_ALLOW_DIALOG_CANCELLATION | TDF_SIZE_TO_CONTENT; + if (AscAppManager::isRtlEnabled()) + config.dwFlags |= TDF_RTL_LAYOUT; config.hwndParent = parent_hwnd; config.hInstance = GetModuleHandle(NULL); config.pfCallback = (PFTASKDIALOGCALLBACK)Pftaskdialogcallback; diff --git a/win-linux/src/platform_win/updatedialog.cpp b/win-linux/src/platform_win/updatedialog.cpp index 95cb34770..f1fd3d0db 100644 --- a/win-linux/src/platform_win/updatedialog.cpp +++ b/win-linux/src/platform_win/updatedialog.cpp @@ -33,6 +33,7 @@ #include #include "updatedialog.h" #include "platform_win/resource.h" +#include "cascapplicationmanagerwrapper.h" #include "defines.h" #include "utils.h" #include @@ -152,6 +153,8 @@ int WinDlg::showDialog(QWidget *parent, config.dwFlags = TDF_ENABLE_HYPERLINKS | TDF_POSITION_RELATIVE_TO_WINDOW | TDF_ALLOW_DIALOG_CANCELLATION; + if (AscAppManager::isRtlEnabled()) + config.dwFlags |= TDF_RTL_LAYOUT; config.hwndParent = parent_hwnd; config.hInstance = GetModuleHandle(NULL); config.pfCallback = (PFTASKDIALOGCALLBACK)Pftaskdialogcallback; diff --git a/win-linux/src/prop/cmainwindowimpl.cpp b/win-linux/src/prop/cmainwindowimpl.cpp index 72be32811..a46dddb63 100644 --- a/win-linux/src/prop/cmainwindowimpl.cpp +++ b/win-linux/src/prop/cmainwindowimpl.cpp @@ -94,6 +94,8 @@ void CMainWindowImpl::refreshAboutVersion() GET_REGISTRY_USER(reg_user); _json_obj["editorwindowmode"] = reg_user.value("editorWindowMode",false).toBool(); + _json_obj["rtl"] = reg_user.contains("forcedRtl") ? reg_user.value("forcedRtl", false).toBool() : + CLangater::isRtlLanguage(CLangater::getCurrentLangCode()); // Read update settings #ifdef _UPDMODULE diff --git a/win-linux/src/windows/ceditorwindow.cpp b/win-linux/src/windows/ceditorwindow.cpp index dae313f86..21270b6b7 100644 --- a/win-linux/src/windows/ceditorwindow.cpp +++ b/win-linux/src/windows/ceditorwindow.cpp @@ -457,3 +457,8 @@ void CEditorWindow::closeEvent(QCloseEvent * e) AscAppManager::getInstance().closeQueue().enter(sWinTag{CLOSE_QUEUE_WIN_TYPE_EDITOR, size_t(this)}); e->ignore(); } + +void CEditorWindow::onLayoutDirectionChanged() +{ + d_ptr->onLayoutDirectionChanged(); +} diff --git a/win-linux/src/windows/ceditorwindow.h b/win-linux/src/windows/ceditorwindow.h index f1b7d93a9..8a5a883d2 100644 --- a/win-linux/src/windows/ceditorwindow.h +++ b/win-linux/src/windows/ceditorwindow.h @@ -67,6 +67,7 @@ class CEditorWindow : public CWindowPlatform protected: void closeEvent(QCloseEvent *) override; + virtual void onLayoutDirectionChanged() final; private: QWidget * createMainPanel(QWidget *, const QString&); diff --git a/win-linux/src/windows/ceditorwindow_p.h b/win-linux/src/windows/ceditorwindow_p.h index ee5be227f..c2e0026fc 100644 --- a/win-linux/src/windows/ceditorwindow_p.h +++ b/win-linux/src/windows/ceditorwindow_p.h @@ -66,6 +66,7 @@ #define TOP_PANEL_OFFSET 6*TOOLBTN_WIDTH #define ICON_SPACER_WIDTH 9 #define ICON_SIZE QSize(20,20) +#define MARGINS 6 using namespace NSEditorApi; @@ -219,10 +220,36 @@ class CEditorWindowPrivate : public CCefEventsGate } } QMargins mrg(0, 0, 0, 2*dpiRatio); - diffW > 0 ? mrg.setRight(diffW) : mrg.setLeft(-diffW); + if (AscAppManager::isRtlEnabled()) + diffW > 0 ? mrg.setLeft(diffW) : mrg.setRight(-diffW); + else + diffW > 0 ? mrg.setRight(diffW) : mrg.setLeft(-diffW); boxtitlelabel->setContentsMargins(mrg); } + auto onLayoutDirectionChanged()->void + { + if (boxtitlelabel) { + QMargins mrg = boxtitlelabel->contentsMargins(); + if (AscAppManager::isRtlEnabled()) { + mrg.setLeft(mrg.right()); + mrg.setRight(0); + } else { + mrg.setRight(mrg.left()); + mrg.setLeft(0); + } + boxtitlelabel->setContentsMargins(mrg); + } + if (iconcrypted) { + QSize size = window->m_labelTitle->size(); + int offset = window->m_labelTitle->textWidth()/2 + MARGINS * window->m_dpiRatio; + int x = size.width()/2; + x += AscAppManager::isRtlEnabled() ? offset : -offset - ICON_SIZE.width() * window->m_dpiRatio; + int y = (size.height() - ICON_SIZE.height() * window->m_dpiRatio)/2; + iconcrypted->move(x, y); + } + } + void onEditorConfig(int, std::wstring cfg) override { // if ( id == window->holdView(id) ) @@ -752,7 +779,9 @@ class CEditorWindowPrivate : public CCefEventsGate iconcrypted->move(0, y); connect(window->m_labelTitle, &CElipsisLabel::onResize, this, [=](QSize size, int textWidth) { if (iconcrypted) { - int x = (size.width() - textWidth)/2 - ((ICON_SIZE.width() + 6) * window->m_dpiRatio); + int offset = textWidth/2 + MARGINS * window->m_dpiRatio; + int x = size.width()/2; + x += AscAppManager::isRtlEnabled() ? offset : -offset - ICON_SIZE.width() * window->m_dpiRatio; int y = (size.height() - ICON_SIZE.height() * window->m_dpiRatio)/2; iconcrypted->move(x, y); } diff --git a/win-linux/src/windows/cmainwindow.cpp b/win-linux/src/windows/cmainwindow.cpp index c509c1b90..525c9ed02 100644 --- a/win-linux/src/windows/cmainwindow.cpp +++ b/win-linux/src/windows/cmainwindow.cpp @@ -147,6 +147,8 @@ int CMainWindow::attachEditor(QWidget * panel, int index) int CMainWindow::attachEditor(QWidget * panel, const QPoint& pt) { QPoint _pt_local = tabWidget()->tabBar()->mapFromGlobal(pt); + if (AscAppManager::isRtlEnabled()) + _pt_local -= QPoint(32 * m_dpiRatio, 0); // Minus tabScroll width #ifdef Q_OS_WIN # if (QT_VERSION < QT_VERSION_CHECK(5, 10, 0)) QPoint _tl = windowRect().topLeft(); @@ -176,7 +178,9 @@ bool CMainWindow::pointInTabs(const QPoint& pt) { QRect _rc_title(m_pMainPanel->geometry()); _rc_title.setHeight(tabWidget()->tabBar()->height()); - _rc_title.adjust(m_pButtonMain->width(), 1, -3*int(TITLEBTN_WIDTH*m_dpiRatio), 0); + int dx1 = (AscAppManager::isRtlEnabled()) ? 3 * int(TITLEBTN_WIDTH * m_dpiRatio) : m_pButtonMain->width(); + int dx2 = (AscAppManager::isRtlEnabled()) ? -1 * m_pButtonMain->width() : -3 * int(TITLEBTN_WIDTH * m_dpiRatio); + _rc_title.adjust(dx1, 1, dx2, 0); return _rc_title.contains(mapFromGlobal(pt)); } @@ -367,6 +371,7 @@ QWidget* CMainWindow::createMainPanel(QWidget *parent) { QWidget *mainPanel = new QWidget(parent); mainPanel->setObjectName("mainPanel"); + mainPanel->setProperty("rtl", AscAppManager::isRtlEnabled()); QGridLayout *_pMainGridLayout = new QGridLayout(mainPanel); _pMainGridLayout->setSpacing(0); _pMainGridLayout->setObjectName(QString::fromUtf8("mainGridLayout")); @@ -999,6 +1004,7 @@ void CMainWindow::onDocumentDownload(void * info) }); QHBoxLayout * layoutBtns = qobject_cast(m_boxTitleBtns->layout()); layoutBtns->insertWidget(1, m_pWidgetDownload->toolButton()); + m_pWidgetDownload->setLayoutDirection(AscAppManager::isRtlEnabled() ? Qt::RightToLeft : Qt::LeftToRight); m_pWidgetDownload->setStyleSheet(Utils::readStylesheets(":/styles/download.qss")); m_pWidgetDownload->applyTheme(m_pMainPanel->property("uitheme").toString()); m_pWidgetDownload->updateScalingFactor(m_dpiRatio); @@ -1484,3 +1490,12 @@ void CMainWindow::cancelClose() { m_isCloseAll && (m_isCloseAll = false); } + +void CMainWindow::onLayoutDirectionChanged() +{ + m_pButtonMain->style()->polish(m_pButtonMain); + if (m_pWidgetDownload && m_pWidgetDownload->toolButton()) { + m_pWidgetDownload->onLayoutDirectionChanged(); + m_pWidgetDownload->toolButton()->style()->polish(m_pWidgetDownload->toolButton()); + } +} diff --git a/win-linux/src/windows/cmainwindow.h b/win-linux/src/windows/cmainwindow.h index 77e04e2c7..d528af6b2 100644 --- a/win-linux/src/windows/cmainwindow.h +++ b/win-linux/src/windows/cmainwindow.h @@ -106,6 +106,7 @@ class CMainWindow : public CWindowPlatform, public CScalingWrapper protected: virtual QString getSaveMessage() const; virtual void refreshAboutVersion() {}; + virtual void onLayoutDirectionChanged() final; void closeEvent(QCloseEvent *) override; void showEvent(QShowEvent *) override; diff --git a/win-linux/src/windows/cpresenterwindow.cpp b/win-linux/src/windows/cpresenterwindow.cpp index 449fbb640..d4d0e153e 100644 --- a/win-linux/src/windows/cpresenterwindow.cpp +++ b/win-linux/src/windows/cpresenterwindow.cpp @@ -99,6 +99,11 @@ void CPresenterWindow::closeEvent(QCloseEvent *e) e->ignore(); } +void CPresenterWindow::onLayoutDirectionChanged() +{ + +} + /** Private **/ QWidget * CPresenterWindow::createMainPanel(QWidget * parent, const QString& title, QWidget * view) diff --git a/win-linux/src/windows/cpresenterwindow.h b/win-linux/src/windows/cpresenterwindow.h index 62254bff8..b14a5a4a5 100644 --- a/win-linux/src/windows/cpresenterwindow.h +++ b/win-linux/src/windows/cpresenterwindow.h @@ -52,6 +52,7 @@ class CPresenterWindow : public CWindowPlatform protected: void closeEvent(QCloseEvent *) final; + virtual void onLayoutDirectionChanged() final; private: QWidget * createMainPanel(QWidget *, const QString&, QWidget * view = nullptr); diff --git a/win-linux/src/windows/platform_linux/cwindowplatform.cpp b/win-linux/src/windows/platform_linux/cwindowplatform.cpp index c8ba15ad1..32086a30b 100644 --- a/win-linux/src/windows/platform_linux/cwindowplatform.cpp +++ b/win-linux/src/windows/platform_linux/cwindowplatform.cpp @@ -49,6 +49,8 @@ CWindowPlatform::CWindowPlatform(const QRect &rect) : CWindowBase(rect), CX11Decoration(this) { + if (AscAppManager::isRtlEnabled()) + setLayoutDirection(Qt::RightToLeft); if (isCustomWindowStyle()) { if (QX11Info::isCompositingManagerRunning()) setAttribute(Qt::WA_TranslucentBackground); @@ -120,6 +122,12 @@ bool CWindowPlatform::event(QEvent * event) if (event->type() == QEvent::HoverLeave) { if (m_boxTitleBtns) m_boxTitleBtns->setCursor(QCursor(Qt::ArrowCursor)); + } else + if (event->type() == QEvent::LayoutDirectionChange) { + if (m_pMainPanel) { + m_pMainPanel->setProperty("rtl", AscAppManager::isRtlEnabled()); + onLayoutDirectionChanged(); + } } return CWindowBase::event(event); } diff --git a/win-linux/src/windows/platform_linux/cwindowplatform.h b/win-linux/src/windows/platform_linux/cwindowplatform.h index 02a194bc9..b64a55b5b 100644 --- a/win-linux/src/windows/platform_linux/cwindowplatform.h +++ b/win-linux/src/windows/platform_linux/cwindowplatform.h @@ -54,6 +54,7 @@ class CWindowPlatform : public CWindowBase, public CX11Decoration virtual bool nativeEvent(const QByteArray&, void*, long*) final; virtual void setScreenScalingFactor(double, bool resize = true) override; virtual void paintEvent(QPaintEvent *event) override; + virtual void onLayoutDirectionChanged() = 0; private: virtual void mouseMoveEvent(QMouseEvent *) final; diff --git a/win-linux/src/windows/platform_win/cwindowplatform.cpp b/win-linux/src/windows/platform_win/cwindowplatform.cpp index 7f80461b4..90452bb4c 100644 --- a/win-linux/src/windows/platform_win/cwindowplatform.cpp +++ b/win-linux/src/windows/platform_win/cwindowplatform.cpp @@ -55,6 +55,8 @@ CWindowPlatform::CWindowPlatform(const QRect &rect) : m_isResizeable(true), m_allowMaximize(true) { + if (AscAppManager::isRtlEnabled()) + setLayoutDirection(Qt::RightToLeft); setWindowFlags(windowFlags() | Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMaximizeButtonHint |Qt::WindowMinimizeButtonHint | Qt::MSWindowsFixedSizeDialogHint); @@ -151,6 +153,17 @@ bool CWindowPlatform::isSessionInProgress() return m_isSessionInProgress; } +bool CWindowPlatform::event(QEvent * event) +{ + if (event->type() == QEvent::LayoutDirectionChange) { + if (m_pMainPanel) { + m_pMainPanel->setProperty("rtl", AscAppManager::isRtlEnabled()); + onLayoutDirectionChanged(); + } + } + return CWindowBase::event(event); +} + /** Private **/ bool CWindowPlatform::isTaskbarAutoHideOn() diff --git a/win-linux/src/windows/platform_win/cwindowplatform.h b/win-linux/src/windows/platform_win/cwindowplatform.h index fbe592305..0dfa13124 100644 --- a/win-linux/src/windows/platform_win/cwindowplatform.h +++ b/win-linux/src/windows/platform_win/cwindowplatform.h @@ -54,6 +54,8 @@ class CWindowPlatform : public CWindowBase protected: bool isSessionInProgress(); + virtual bool event(QEvent *event) override; + virtual void onLayoutDirectionChanged() = 0; private: bool isTaskbarAutoHideOn(); From dc6c31934b0a6105abb578ad5ddd02d27fe0f4f3 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Fri, 1 Dec 2023 01:01:05 +0300 Subject: [PATCH 029/316] [win-nix] added option to turn on rtl mode --- common/loginpage/src/panelsettings.js | 22 ++++++++++++++++++++++ common/loginpage/src/styles.less | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/common/loginpage/src/panelsettings.js b/common/loginpage/src/panelsettings.js index 687516e3c..298a4d9ec 100644 --- a/common/loginpage/src/panelsettings.js +++ b/common/loginpage/src/panelsettings.js @@ -260,6 +260,12 @@ +
@@ -300,6 +306,7 @@ $optsSpellcheckMode, $optsLaunchMode, $optsAutoupdateMode; + let $chRtl; function _set_user_name(name) { let me = this; @@ -404,6 +411,10 @@ $optsSpellcheckMode.selectpicker('refresh'); } + if ( $chRtl ) { + _new_settings.rtl = $chRtl.prop("checked"); + } + sdk.command("settings:apply", JSON.stringify(_new_settings)); $btnApply.disable(true); @@ -587,6 +598,17 @@ } } + if ( opts.rtl !== undefined ) { + $chRtl = $('#sett-box-rtl-mode', $panel).parent().show().find('#sett-rtl-mode'); + $chRtl.prop('checked', !!opts.rtl) + .on('change', e => { + $btnApply.prop('disabled') && $btnApply.prop('disabled', false); + }); + + document.body.setAttribute('dir', 'rtl'); + document.body.classList.add('rtl'); + } + $('.settings-field:visible:last').css('margin-bottom','0'); } else if (/updates/.test(cmd)) { diff --git a/common/loginpage/src/styles.less b/common/loginpage/src/styles.less index f219c24aa..797ce3d72 100644 --- a/common/loginpage/src/styles.less +++ b/common/loginpage/src/styles.less @@ -1175,7 +1175,7 @@ li.menu-item { } } -#sett-preview-mode { +.checkbox { width: 12px; height: 18px; margin-right: 16px; From c54f7e1cc7b2ee7371e16b10eab3db5f87453fa7 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Fri, 1 Dec 2023 01:10:31 +0300 Subject: [PATCH 030/316] [win-nix] debug --- common/loginpage/src/panelsettings.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/common/loginpage/src/panelsettings.js b/common/loginpage/src/panelsettings.js index 298a4d9ec..ffa9bf33a 100644 --- a/common/loginpage/src/panelsettings.js +++ b/common/loginpage/src/panelsettings.js @@ -605,8 +605,10 @@ $btnApply.prop('disabled') && $btnApply.prop('disabled', false); }); - document.body.setAttribute('dir', 'rtl'); - document.body.classList.add('rtl'); + if ( opts.rtl ) { + document.body.setAttribute('dir', 'rtl'); + document.body.classList.add('rtl'); + } } $('.settings-field:visible:last').css('margin-bottom','0'); From 83dd746076fdd478261b105fab5c0414be0fcc8b Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Mon, 4 Dec 2023 14:43:50 +0300 Subject: [PATCH 031/316] [start page] fix stylesheet for rtl --- common/loginpage/build/Gruntfile.js | 4 +--- common/loginpage/build/startpage.json | 7 +++++-- common/loginpage/src/index.html | 1 + common/loginpage/src/index.html.deploy | 1 + common/loginpage/src/panelsettings.js | 2 +- common/loginpage/src/styles.less | 5 +++++ 6 files changed, 14 insertions(+), 6 deletions(-) diff --git a/common/loginpage/build/Gruntfile.js b/common/loginpage/build/Gruntfile.js index 65211495a..0671ba270 100644 --- a/common/loginpage/build/Gruntfile.js +++ b/common/loginpage/build/Gruntfile.js @@ -52,9 +52,7 @@ module.exports = function(grunt) { compress: true, ieCompat: false }, - files: { - "<%= pkg.desktop.less.files.dest %>": packageFile['desktop']['less']['files']['src'] - } + files: packageFile.desktop.less.files } }, diff --git a/common/loginpage/build/startpage.json b/common/loginpage/build/startpage.json index 1da51033f..c2f37f6e8 100644 --- a/common/loginpage/build/startpage.json +++ b/common/loginpage/build/startpage.json @@ -54,10 +54,13 @@ ] }, "less": { - "files": { + "files": [{ "src": "../src/styles.less", "dest": "../deploy/styles.css" - } + },{ + "src": "../src/css/rtl.less", + "dest": "../deploy/rtl.css" + }] }, "concat": { "files": { diff --git a/common/loginpage/src/index.html b/common/loginpage/src/index.html index d52299efd..292fb5b7b 100644 --- a/common/loginpage/src/index.html +++ b/common/loginpage/src/index.html @@ -9,6 +9,7 @@ + diff --git a/common/loginpage/src/index.html.deploy b/common/loginpage/src/index.html.deploy index 369cf0621..80fd91336 100644 --- a/common/loginpage/src/index.html.deploy +++ b/common/loginpage/src/index.html.deploy @@ -5,6 +5,7 @@ + + + +
+

ONLYOFFICE 8.1.0 - {{DATE}}

+ +

New Features

+ +

All Editors

+
    +
  • TODO
  • +
+

Document Editor

+
    +
  • TODO
  • +
+

Spreadsheet Editor

+
    +
  • TODO
  • +
+

Presentation Editor

+
    +
  • TODO
  • +
+

Forms

+
    +
  • TODO
  • +
+ +

Fixes

+ +

All Editors

+
    +
  • TODO
  • +
+

Document Editor

+
    +
  • TODO
  • +
+

Spreadsheet Editor

+
    +
  • TODO
  • +
+

Presentation Editor

+
    +
  • TODO
  • +
+

Forms

+
    +
  • TODO
  • +
+
+ + diff --git a/macos/ONLYOFFICE/update/updates/ONLYOFFICE/changes/8.1.0/changes.ru.html b/macos/ONLYOFFICE/update/updates/ONLYOFFICE/changes/8.1.0/changes.ru.html new file mode 100644 index 000000000..ce94e5e4a --- /dev/null +++ b/macos/ONLYOFFICE/update/updates/ONLYOFFICE/changes/8.1.0/changes.ru.html @@ -0,0 +1,137 @@ + + + + + История изменений ONLYOFFICE + + + +
+

ONLYOFFICE 8.1.0 - {{DATE}}

+ +

Новые функции

+ +

Все редакторы

+
    +
  • TODO
  • +
+

Редактор документов

+
    +
  • TODO
  • +
+

Редактор таблиц

+
    +
  • TODO
  • +
+

Редактор презентаций

+
    +
  • TODO
  • +
+

Формы

+
    +
  • TODO
  • +
+ +

Исправления

+ +

Все редакторы

+
    +
  • TODO
  • +
+

Редактор документов

+
    +
  • TODO
  • +
+

Редактор таблиц

+
    +
  • TODO
  • +
+

Редактор презентаций

+
    +
  • TODO
  • +
+

Формы

+
    +
  • TODO
  • +
+
+ + diff --git a/win-linux/package/windows/update/changes/8.1.0/changes.html b/win-linux/package/windows/update/changes/8.1.0/changes.html new file mode 100644 index 000000000..1ad8c7ee8 --- /dev/null +++ b/win-linux/package/windows/update/changes/8.1.0/changes.html @@ -0,0 +1,100 @@ + + + + + ONLYOFFICE Desktop Editors Release Notes + + + +
+

ONLYOFFICE Desktop Editors 8.1.0 - {{DATE}}

+ +

New Features

+ +

All Editors

+
    +
  • TODO
  • +
+

Document Editor

+
    +
  • TODO
  • +
+

Spreadsheet Editor

+
    +
  • TODO
  • +
+

Presentation Editor

+
    +
  • TODO
  • +
+

Forms

+
    +
  • TODO
  • +
+ +

Fixes

+ +

All Editors

+
    +
  • TODO
  • +
+

Document Editor

+
    +
  • TODO
  • +
+

Spreadsheet Editor

+
    +
  • TODO
  • +
+

Presentation Editor

+
    +
  • TODO
  • +
+

Forms

+
    +
  • TODO
  • +
+ + +
+ + diff --git a/win-linux/package/windows/update/changes/8.1.0/changes_ru.html b/win-linux/package/windows/update/changes/8.1.0/changes_ru.html new file mode 100644 index 000000000..d0e186451 --- /dev/null +++ b/win-linux/package/windows/update/changes/8.1.0/changes_ru.html @@ -0,0 +1,100 @@ + + + + + История изменений ONLYOFFICE Desktop Editors + + + +
+

ONLYOFFICE Desktop Editors 8.1.0 - {{DATE}}

+ +

Новые функции

+ +

Все редакторы

+
    +
  • TODO
  • +
+

Редактор документов

+
    +
  • TODO
  • +
+

Редактор таблиц

+
    +
  • TODO
  • +
+

Редактор презентаций

+
    +
  • TODO
  • +
+

Формы

+
    +
  • TODO
  • +
+ +

Исправления

+ +

Все редакторы

+
    +
  • TODO
  • +
+

Редактор документов

+
    +
  • TODO
  • +
+

Редактор таблиц

+
    +
  • TODO
  • +
+

Редактор презентаций

+
    +
  • TODO
  • +
+

Формы

+
    +
  • TODO
  • +
+ + +
+ + From 3b28fed37fafb96666a20fa8d0eeeb40f8822263 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Wed, 21 Feb 2024 12:44:56 +0400 Subject: [PATCH 101/316] Fix preview redrawing when printing to PDF --- macos/ONLYOFFICE/Code/Utils/ascprinter.h | 27 +++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/macos/ONLYOFFICE/Code/Utils/ascprinter.h b/macos/ONLYOFFICE/Code/Utils/ascprinter.h index 8f37a37ca..cf8da0cf2 100644 --- a/macos/ONLYOFFICE/Code/Utils/ascprinter.h +++ b/macos/ONLYOFFICE/Code/Utils/ascprinter.h @@ -55,6 +55,8 @@ class ASCPrinterInfo int m_nPaperWidthOrigin; int m_nPaperHeightOrigin; + bool m_bIsPrintingOnScreen; // true if printing to preview panel on screen + NSEditorApi::CAscPrinterContextBase* m_pContext; public: @@ -76,6 +78,8 @@ class ASCPrinterInfo m_nPaperWidthOrigin = 0; m_nPaperHeightOrigin = 0; + + m_bIsPrintingOnScreen = false; } }; @@ -249,12 +253,26 @@ class ASCPrinterInfo if (nPage < m_pPrinterInfo->m_nPagesCount) { NSPrintInfo* pInfo = [[NSPrintOperation currentOperation] printInfo]; + // check if printing on screen + if (nPage == 0) + { + PMPrintSession printSession = (PMPrintSession)[pInfo PMPrintSession]; + PMPrintSettings printSettings = (PMPrintSettings)[pInfo PMPrintSettings]; + + PMDestinationType destType; + PMSessionGetDestinationType(printSession, printSettings, &destType); - if ([pInfo jobDisposition] != NSPrintSpoolJob) + CFURLRef destLocation; + PMSessionCopyDestinationLocation(printSession, printSettings, &destLocation); + + m_pPrinterInfo->m_bIsPrintingOnScreen = (destType == kPMDestinationPrinter || + (destType == kPMDestinationFile && destLocation == NULL)); + } + // apply page orientation only when not printing to screen + if (!m_pPrinterInfo->m_bIsPrintingOnScreen) { [pInfo setOrientation: (m_arOrientation[nPage]) ? NSPaperOrientationLandscape : NSPaperOrientationPortrait]; } - // update page sizes and margins [self recalcPageSizes]; } @@ -445,10 +463,9 @@ class ASCPrinterContext : public NSEditorApi::CAscPrinterContextBase CGContextRef _context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; CGContextSaveGState(_context); - NSPrintInfo* pInfo = [[NSPrintOperation currentOperation] printInfo]; - if ([pInfo jobDisposition] == NSPrintSpoolJob && fabs(dAngle - M_PI_2) <= 1e-5) + if (m_oInfo.m_bIsPrintingOnScreen && fabs(dAngle - M_PI_2) <= 1e-5) { - // if printing to a preview panel (or an actual printer) and dAngle is PI/2, + // if printing to a preview panel (or an actual printer) and `dAngle` is PI/2, // then rotate image by 90 degrees and translate it to fit in rect CGAffineTransform transform = CGAffineTransformMake(0, -1, 1, 0, fX, fH + fY); CGContextConcatCTM(_context, transform); From 48dc3a48da0cc5c471a6c0759c29095e816d2ff1 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Wed, 21 Feb 2024 13:34:02 +0400 Subject: [PATCH 102/316] Change tabs to spaces in controller code --- .../Common/ASCCommonViewController.mm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm b/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm index 0dcea47c2..30f867a28 100644 --- a/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm +++ b/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm @@ -1048,15 +1048,15 @@ - (void)onCEFOnBeforePrintEnd:(NSNotification *)notification { CAscApplicationManager * appManager = [NSAscApplicationWorker getAppManager]; - // using synchronization to be sure that flag `ASCPrinterContext::isCurrentlyPrinting` is correctly handled - static dispatch_queue_t printQueue = dispatch_queue_create(NULL, NULL); - dispatch_sync(printQueue, ^{ - if (appManager && !ASCPrinterContext::isCurrentlyPrinting) { - m_pContext = new ASCPrinterContext(appManager); - // m_pContext->BeginPaint([viewId intValue], [pagesCount intValue], self, @selector(printOperationDidRun:success:contextInfo:)); - m_pContext->BeginPaint(notification.userInfo, self, @selector(printOperationDidRun:success:contextInfo:)); - } - }); + // using synchronization to be sure that flag `ASCPrinterContext::isCurrentlyPrinting` is correctly handled + static dispatch_queue_t printQueue = dispatch_queue_create(NULL, NULL); + dispatch_sync(printQueue, ^{ + if (appManager && !ASCPrinterContext::isCurrentlyPrinting) { + m_pContext = new ASCPrinterContext(appManager); + // m_pContext->BeginPaint([viewId intValue], [pagesCount intValue], self, @selector(printOperationDidRun:success:contextInfo:)); + m_pContext->BeginPaint(notification.userInfo, self, @selector(printOperationDidRun:success:contextInfo:)); + } + }); } } From cb77c558b7bbe920e959d568805d29310fd96a3e Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Wed, 21 Feb 2024 16:12:03 +0300 Subject: [PATCH 103/316] [macos] refactoring --- macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m | 2 +- macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabViewCell.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m index 704dbac3d..f14f03d3e 100644 --- a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m +++ b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m @@ -128,7 +128,7 @@ - (void)initialize { [self setBordered:NO]; [self setCell:tabCell]; [self setState:NSControlStateValueOn]; - [self.cell setImagePosition:NSImageLeft]; +// [self.cell setImagePosition:NSImageLeft]; [self.cell setBordered:NO]; self.close = [[ASCButton alloc] initWithFrame:CGRectZero]; diff --git a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabViewCell.m b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabViewCell.m index 98057b5c6..f230eefd1 100644 --- a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabViewCell.m +++ b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabViewCell.m @@ -306,7 +306,7 @@ - (NSRect)drawTitle:(NSAttributedString *)title withFrame:(NSRect)frame inView:( } if (self.closeButton) { - rightOffset = CGRectGetHeight(self.closeButton.frame) * 1.5; + rightOffset = CGRectGetHeight(self.closeButton.frame) * 1.5 + 2; } if (CGRectGetWidth(frame) - leftOffset - rightOffset > 15) { From d2dea40100af6cb583831a6d57b79f2476cf3b9e Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Wed, 21 Feb 2024 16:16:08 +0300 Subject: [PATCH 104/316] [macos] support rtl for tab --- .../Code/Controls/ASCTabs/ASCTabView.m | 29 ++++++++++++++----- .../Code/Controls/ASCTabs/ASCTabViewCell.m | 13 ++++++++- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m index f14f03d3e..b0f117292 100644 --- a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m +++ b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m @@ -88,7 +88,8 @@ - (id)initWithCoder:(NSCoder *)coder { - (instancetype)copyWithZone:(NSZone *)zone { - ASCTabView * copy = [[ASCTabView allocWithZone:zone] initWithFrame:self.frame]; +// ASCTabView * copy = [[ASCTabView allocWithZone:zone] initWithFrame:self.frame]; + ASCTabView * copy = [[ASCTabView allocWithZone:zone] initWithFrame:CGRectZero]; copy.type = self.type; ASCTabViewCell * cellCopy = [self.cell copy]; @@ -96,6 +97,7 @@ - (instancetype)copyWithZone:(NSZone *)zone [copy setState:[self state]]; [copy setNeedsDisplay]; + copy.frame = self.frame; return copy; } @@ -141,12 +143,9 @@ - (void)initialize { [self.cell setCloseButton:self.close]; [self.close setAutoresizingMask:NSViewMinXMargin | NSViewMaxYMargin]; - [self.close setFrame:CGRectMake( - CGRectGetWidth(self.frame) - kASTabViewCloseButtonSize * 1.5, - kASTabViewCloseButtonSize / 1.5, - kASTabViewCloseButtonSize, - kASTabViewCloseButtonSize - )]; + + if ( CGRectGetWidth(self.frame) ) + [self setButtonCloseOrigin:self.frame]; __weak __typeof__(self) weakSelf = self; tabCell.updateState = ^{ @@ -167,6 +166,10 @@ - (void)initialize { } - (void)setFrame:(NSRect)frame { + if ( self.frame.size.width != frame.size.width ) { + [self setButtonCloseOrigin:frame]; + } + [super setFrame:frame]; } @@ -276,6 +279,18 @@ - (void)setIsProcessing:(BOOL)isProcessing { } } +- (void)setButtonCloseOrigin:(NSRect)rect { + CGFloat btnCloseOriginLeft = -([self userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft ? + CGRectGetWidth(rect) - kASTabViewCloseButtonSize / 1.5 : kASTabViewCloseButtonSize * 1.5); + + NSLog(@"tabview btn close origin %f %@", btnCloseOriginLeft, NSStringFromRect(rect)); + [self.close setFrame:CGRectMake(btnCloseOriginLeft, + kASTabViewCloseButtonSize / 1.5, + kASTabViewCloseButtonSize, + kASTabViewCloseButtonSize + )]; +} + - (NSString *)title { return _changed ? [NSString stringWithFormat:@"%@*", [super title]] : [super title]; } diff --git a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabViewCell.m b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabViewCell.m index f230eefd1..8a3c92d10 100644 --- a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabViewCell.m +++ b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabViewCell.m @@ -294,6 +294,9 @@ - (NSCellStyleMask)highlightsBy { - (void)drawImage:(NSImage *)image withFrame:(NSRect)frame inView:(NSView *)controlView { NSSize size = [image size]; CGRect rect = CGRectMake(8, (CGRectGetHeight(frame) - size.width) * .5 - 1, size.width, size.height); + if ( [self userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft ) + rect.origin.x = frame.size.width - 8 - size.width; + [super drawImage:image withFrame:rect inView:controlView]; } @@ -309,6 +312,12 @@ - (NSRect)drawTitle:(NSAttributedString *)title withFrame:(NSRect)frame inView:( rightOffset = CGRectGetHeight(self.closeButton.frame) * 1.5 + 2; } + if ( [self userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft ) { + CGFloat t = leftOffset; + leftOffset = rightOffset; + rightOffset = t; + } + if (CGRectGetWidth(frame) - leftOffset - rightOffset > 15) { return [super drawTitle:title withFrame:CGRectMake(frame.origin.x + leftOffset, frame.origin.y, frame.size.width - rightOffset - leftOffset, frame.size.height) inView:controlView]; } else { @@ -327,7 +336,9 @@ - (NSAttributedString *)attributedTitle { color = self.activeTextColor; } - [paragraphStyle setAlignment:NSLeftTextAlignment]; + if ( [self userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft ) + [paragraphStyle setAlignment:NSRightTextAlignment]; + else [paragraphStyle setAlignment:NSLeftTextAlignment]; [paragraphStyle setLineBreakMode:NSLineBreakByTruncatingTail]; [attributedTitle addAttributes:@{ From 04fefb3a4b270db6396dcf42bab78c8374a7a7f3 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Mon, 26 Feb 2024 13:51:44 +0200 Subject: [PATCH 105/316] [win] caption: small refactoring --- win-linux/src/windows/platform_win/caption.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win-linux/src/windows/platform_win/caption.h b/win-linux/src/windows/platform_win/caption.h index c7e6bbee3..d18a57b1c 100644 --- a/win-linux/src/windows/platform_win/caption.h +++ b/win-linux/src/windows/platform_win/caption.h @@ -63,7 +63,7 @@ class Caption: public QWidget return false; } - bool nativeEvent(const QByteArray &eventType, void *message, long *result) + virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result) override { #if (QT_VERSION == QT_VERSION_CHECK(5, 11, 1)) MSG* msg = *reinterpret_cast(message); From 799d6e0b56fbc0577ed9410e5b71e2ca8a0c9452 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Mon, 26 Feb 2024 14:25:42 +0200 Subject: [PATCH 106/316] [win] fix bug 62589 --- win-linux/defaults.pri | 2 - win-linux/res/styles/editor.qss | 3 + win-linux/res/styles/styles.qss | 5 ++ win-linux/src/windows/cwindowbase.cpp | 9 -- win-linux/src/windows/platform_win/caption.h | 87 +++++++++++++++++-- .../windows/platform_win/cwindowplatform.cpp | 16 ++-- 6 files changed, 101 insertions(+), 21 deletions(-) diff --git a/win-linux/defaults.pri b/win-linux/defaults.pri index f1dec351c..4e5aa89e7 100644 --- a/win-linux/defaults.pri +++ b/win-linux/defaults.pri @@ -244,7 +244,6 @@ core_windows { # RC_ICONS += ./res/icons/desktop_icons.ico HEADERS += $$PWD/src/windows/platform_win/cwindowplatform.h \ - $$PWD/src/windows/platform_win/csnap.h \ $$PWD/src/windows/platform_win/caption.h \ $$PWD/src/platform_win/singleapplication.h \ $$PWD/src/platform_win/filechooser.h \ @@ -253,7 +252,6 @@ core_windows { $$PWD/src/platform_win/resource.h SOURCES += $$PWD/src/windows/platform_win/cwindowplatform.cpp \ - $$PWD/src/windows/platform_win/csnap.cpp \ $$PWD/src/platform_win/singleapplication.cpp \ $$PWD/src/platform_win/filechooser.cpp \ $$PWD/src/platform_win/printdialog.cpp \ diff --git a/win-linux/res/styles/editor.qss b/win-linux/res/styles/editor.qss index 8acebfda9..2400f595d 100644 --- a/win-linux/res/styles/editor.qss +++ b/win-linux/res/styles/editor.qss @@ -3,17 +3,20 @@ #box-title-tools QLabel {font-family: "Arial", "Helvetica", "Helvetica Neue", sans-serif;} #labelTitle {color: #444; font-weight: normal;} #iconuser {color: %1; background: #d9ffffff; font-size: 10px;} +QPushButton[act=tool][hovered=true], QPushButton[act=tool]:hover {background-color: rgba(0,0,0,20%);} QPushButton#toolButtonClose:hover {background-color: #d42b2b;} QPushButton#toolButtonClose:pressed {background-color: #d75050;} /* pretty */ +#mainPanel[window=pretty] QPushButton[act=tool][unix=false][hovered=true], #mainPanel[window=pretty] QPushButton[act=tool][unix=false]:hover {background-color: rgba(255,255,255,20%);} #mainPanel[window=pretty] QPushButton#toolButtonMinimize {image: url(:/minimize_light.svg);} #mainPanel[window=pretty] QPushButton#toolButtonClose {image: url(:/close_light.svg);} #mainPanel[window=pretty] QPushButton#toolButtonClose[unix=false]:hover {background-color: #d42b2b;} #mainPanel[window=pretty] QPushButton#toolButtonMaximize {image: url(:/restore_light.svg);} #mainPanel[window=pretty] QPushButton#toolButtonMaximize[class=min] {image: url(:/maximize_light.svg);} +#mainPanel[window=pretty] QPushButton#toolButtonMaximize[unix=false][pressed=true] {background-color: rgba(255,255,255,20%);} #mainPanel[window=pretty] #labelTitle {color: #fff; font-size: 12px;} /* dark style */ diff --git a/win-linux/res/styles/styles.qss b/win-linux/res/styles/styles.qss index 2a1b12334..5da6d1210 100644 --- a/win-linux/res/styles/styles.qss +++ b/win-linux/res/styles/styles.qss @@ -5,7 +5,9 @@ QPushButton {/*background-color:#d9d9d9;*/ padding:0 20px; font-weight: normal; height: 22px; font-size: 12px;} QPushButton[act=tool] {/*background-origin: content;*/ border: none; margin: 0; padding: 0; border-radius:0;} +QPushButton[act=tool][hovered=true], QPushButton[act=tool]:hover {background-color:#cecece;} +QPushButton[act=tool][pressed=true], QPushButton[act=tool]:pressed {background-color:#b7b7b7;} QPushButton#toolButtonMaximize, @@ -78,9 +80,11 @@ QPushButton#toolButtonDownload {border-left: 0px; border-right: 1px solid #dfdfd #mainPanel[uitheme=theme-dark] QPushButton#toolButtonMinimize:hover, #mainPanel[uitheme=theme-dark] QPushButton#toolButtonMaximize:hover, +#mainPanel[uitheme=theme-dark] QPushButton#toolButtonMaximize[hovered=true], #mainPanel[uitheme=theme-dark] QPushButton#toolButtonDownload:hover {background-color: #555;} #mainPanel[uitheme=theme-dark] QPushButton#toolButtonMinimize:pressed, #mainPanel[uitheme=theme-dark] QPushButton#toolButtonMaximize:pressed, +#mainPanel[uitheme=theme-dark] QPushButton#toolButtonMaximize[pressed=true], #mainPanel[uitheme=theme-dark] QPushButton#toolButtonDownload:pressed {background-color: #606060;} /* Contrast-Dark*/ @@ -98,6 +102,7 @@ QPushButton#toolButtonDownload {border-left: 0px; border-right: 1px solid #dfdfd #mainPanel[uitheme=theme-contrast-dark] QPushButton#toolButtonMinimize:hover, #mainPanel[uitheme=theme-contrast-dark] QPushButton#toolButtonMaximize:hover, +#mainPanel[uitheme=theme-contrast-dark] QPushButton#toolButtonMaximize[hovered=true], #mainPanel[uitheme=theme-contrast-dark] QPushButton#toolButtonDownload:hover {background-color: #555;} /***********************************/ diff --git a/win-linux/src/windows/cwindowbase.cpp b/win-linux/src/windows/cwindowbase.cpp index b139e5461..5b6e00131 100644 --- a/win-linux/src/windows/cwindowbase.cpp +++ b/win-linux/src/windows/cwindowbase.cpp @@ -37,9 +37,6 @@ #include "defines.h" #ifdef _WIN32 # include "windows/platform_win/caption.h" -# ifndef __OS_WIN_XP -# include "windows/platform_win/csnap.h" -# endif #endif #include #include @@ -181,12 +178,6 @@ QWidget* CWindowBase::createTopPanel(QWidget *parent) m_pTopButtons.push_back(btn); layoutBtns->addWidget(btn); } -#if defined (_WIN32) && !defined (__OS_WIN_XP) - if (Utils::getWinVersion() >= Utils::WinVer::Win11) { - CWin11Snap *snap = new CWin11Snap(m_pTopButtons[BtnType::Btn_Maximize]); - Q_UNUSED(snap) - } -#endif } return _boxTitleBtns; } diff --git a/win-linux/src/windows/platform_win/caption.h b/win-linux/src/windows/platform_win/caption.h index d18a57b1c..75a7da891 100644 --- a/win-linux/src/windows/platform_win/caption.h +++ b/win-linux/src/windows/platform_win/caption.h @@ -36,8 +36,11 @@ #include #include #include +#include +#include #include #include +#include "utils.h" class Caption: public QWidget @@ -45,18 +48,44 @@ class Caption: public QWidget public: Caption(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags()): QWidget(parent, f) - {} + { + hwnd_root = ::GetAncestor((HWND)winId(), GA_ROOT); + snapLayoutAllowed = isArrangingAllowed(); + } private: + HWND hwnd_root; + bool snapLayoutAllowed = false; + + bool isArrangingAllowed() { + BOOL arranging = FALSE; + SystemParametersInfoA(SPI_GETWINARRANGING, 0, &arranging, 0); + return (arranging == TRUE); + } + + QPoint cursorPos() { + POINT pt; + ::GetCursorPos(&pt); + return mapFromGlobal(QPoint(pt.x, pt.y)); + } + + QPushButton* buttonAtPos(const QPoint &pos) { + QWidget *child = childAt(pos); + return child ? qobject_cast(child) : nullptr; + } + + QPushButton* buttonMaxUnderMouse() { + QPushButton *btn = buttonAtPos(cursorPos()); + return (btn && btn->objectName() == "toolButtonMaximize") ? btn : nullptr; + } + bool postMsg(DWORD cmd) { POINT pt; ::GetCursorPos(&pt); QPoint pos = mapFromGlobal(QPoint(int(pt.x), int(pt.y))); - QPushButton *pushButton = childAt(pos) ? qobject_cast(childAt(pos)) : nullptr; - if (!pushButton) { - HWND hWnd = ::GetAncestor((HWND)(window()->windowHandle()->winId()), GA_ROOT); + if (!buttonAtPos(pos)) { ::ReleaseCapture(); - ::PostMessage(hWnd, cmd, HTCAPTION, POINTTOPOINTS(pt)); + ::PostMessage(hwnd_root, cmd, HTCAPTION, POINTTOPOINTS(pt)); QCoreApplication::postEvent(parent(), new QEvent(QEvent::MouseButtonPress)); return true; } @@ -83,6 +112,54 @@ class Caption: public QWidget return true; break; } + case WM_NCLBUTTONDOWN: { + if (Utils::getWinVersion() < Utils::WinVer::Win11) + break; + if (QPushButton *btn = buttonMaxUnderMouse()) { + btn->setProperty("hovered", false); + btn->setProperty("pressed", true); + btn->style()->polish(btn); + btn->repaint(); + } + break; + } + case WM_TIMER: { + QPushButton *btn = buttonMaxUnderMouse(); + if (!btn) { + KillTimer(msg->hwnd, msg->wParam); + if (QPushButton *btn = findChild("toolButtonMaximize")) { + btn->setProperty("hovered", false); + btn->setProperty("pressed", false); + btn->style()->polish(btn); + } + } + break; + } + case WM_NCHITTEST: { + if (Utils::getWinVersion() < Utils::WinVer::Win11 || !snapLayoutAllowed) + break; + *result = 0; + if (QPushButton *btn = buttonMaxUnderMouse()) { + if (!btn->property("hovered").toBool()) { + btn->setProperty("hovered", true); + btn->style()->polish(btn); + SetTimer(msg->hwnd, 1, 200, NULL); + } + *result = HTMAXBUTTON; + } + return (*result != 0); + } + case WM_CAPTURECHANGED: { + if (Utils::getWinVersion() < Utils::WinVer::Win11) + break; + if (QPushButton *btn = buttonMaxUnderMouse()) + btn->click(); + break; + } + case WM_SETTINGCHANGE: { + snapLayoutAllowed = isArrangingAllowed(); + break; + } default: break; } diff --git a/win-linux/src/windows/platform_win/cwindowplatform.cpp b/win-linux/src/windows/platform_win/cwindowplatform.cpp index 3b7f528a1..5dec6f2ec 100644 --- a/win-linux/src/windows/platform_win/cwindowplatform.cpp +++ b/win-linux/src/windows/platform_win/cwindowplatform.cpp @@ -194,11 +194,13 @@ bool CWindowPlatform::nativeEvent(const QByteArray &eventType, void *message, lo { case WM_ACTIVATE: { #ifndef __OS_WIN_XP - MARGINS mrg; - mrg.cxLeftWidth = 4; - mrg.cxRightWidth = 4; - mrg.cyBottomHeight = 4; - mrg.cyTopHeight = 29; + MARGINS mrg = {4, 4, 29, 4}; + if (Utils::getWinVersion() > Utils::WinVer::Win10) { + mrg.cxLeftWidth = 1; + mrg.cxRightWidth = 0; + mrg.cyBottomHeight = 0; + mrg.cyTopHeight = 0; + } DwmExtendFrameIntoClientArea(m_hWnd, &mrg); #endif break; @@ -299,6 +301,10 @@ bool CWindowPlatform::nativeEvent(const QByteArray &eventType, void *message, lo } case WM_SETTINGCHANGE: { + if (msg->wParam == SPI_SETWINARRANGING) { + if (Utils::getWinVersion() > Utils::WinVer::Win10 && m_boxTitleBtns) + SendMessage((HWND)m_boxTitleBtns->winId(), WM_SETTINGCHANGE, 0, 0); + } else if (msg->wParam == SPI_SETWORKAREA) { static RECT oldWorkArea = {0,0,0,0}; RECT workArea; // Taskbar show/hide detection From 83338088797523a550618f886846fc83d864b8c2 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Mon, 26 Feb 2024 14:45:59 +0200 Subject: [PATCH 107/316] [linux] updatesvc: change app path detection --- .../extras/update-daemon/src/platform_linux/main.cpp | 2 -- .../extras/update-daemon/src/platform_linux/utils.cpp | 11 +++-------- .../extras/update-daemon/src/platform_linux/utils.h | 1 - 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/win-linux/extras/update-daemon/src/platform_linux/main.cpp b/win-linux/extras/update-daemon/src/platform_linux/main.cpp index d2e4a2e8b..248fe7204 100644 --- a/win-linux/extras/update-daemon/src/platform_linux/main.cpp +++ b/win-linux/extras/update-daemon/src/platform_linux/main.cpp @@ -52,8 +52,6 @@ void strToNum(const char *str, int &num) int main(int argc, char *argv[]) { - NS_File::setAppPath(argv[0]); - if (argc > 1) { if (strcmp(argv[1], "--run-as-app") == 0) { std::locale::global(std::locale("")); diff --git a/win-linux/extras/update-daemon/src/platform_linux/utils.cpp b/win-linux/extras/update-daemon/src/platform_linux/utils.cpp index 5cd54db78..90c83cff1 100644 --- a/win-linux/extras/update-daemon/src/platform_linux/utils.cpp +++ b/win-linux/extras/update-daemon/src/platform_linux/utils.cpp @@ -175,13 +175,6 @@ namespace NS_Utils namespace NS_File { - string app_path; - - void setAppPath(const std::string &path) - { - app_path = parentPath(path); - } - bool GetFilesList(const string &path, list *lst, string &error, bool ignore_locked, bool folders_only) { DIR *dir = opendir(path.c_str()); @@ -451,7 +444,9 @@ namespace NS_File string appPath() { - return app_path; + char path[PATH_MAX] = {0}; + ssize_t count = readlink("/proc/self/exe", path, PATH_MAX); + return (count > 0) ? parentPath(string(path, count)) : ""; } // string getFileHash(const string &fileName) diff --git a/win-linux/extras/update-daemon/src/platform_linux/utils.h b/win-linux/extras/update-daemon/src/platform_linux/utils.h index 9635c9fba..23689629b 100644 --- a/win-linux/extras/update-daemon/src/platform_linux/utils.h +++ b/win-linux/extras/update-daemon/src/platform_linux/utils.h @@ -58,7 +58,6 @@ string GetAppLanguage(); namespace NS_File { -void setAppPath(const string &path); bool GetFilesList(const string &path, list *lst, string &error, bool ignore_locked = false, bool folders_only = false); bool readFile(const string &filePath, list &linesList); bool writeToFile(const string &filePath, list &linesList); From 4ab10bb50cb09817f3ecc19f7d2d80880621c24c Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Mon, 26 Feb 2024 15:38:16 +0200 Subject: [PATCH 108/316] [linux] updmanager: fix runProcess --- win-linux/src/cupdatemanager.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/win-linux/src/cupdatemanager.cpp b/win-linux/src/cupdatemanager.cpp index 9bc1981f7..27e4a2a74 100644 --- a/win-linux/src/cupdatemanager.cpp +++ b/win-linux/src/cupdatemanager.cpp @@ -51,6 +51,7 @@ #else # include # include +# include # include "components/cmessage.h" # include "platform_linux/updatedialog.h" # define DAEMON_NAME "/updatesvc" @@ -210,13 +211,25 @@ auto runProcess(const tstring &fileName, const tstring &args, bool runAsAdmin = CloseHandle(shExInfo.hProcess); return true; } + return false; #else Q_UNUSED(runAsAdmin) - QStringList _args = QString::fromStdString(args).split(" "); - if (QProcess::startDetached(QString::fromStdString(fileName), _args)) - return true; + const QStringList args_list = args.empty() ? QStringList() : QString::fromStdString(args).split(" "); + char **_args = new char*[args_list.size() + 2]; + int i = 0; + _args[i++] = const_cast(fileName.c_str()); + for (const auto &arg : args_list) + _args[i++] = arg.toLocal8Bit().data(); + _args[i] = NULL; + pid_t pid; + posix_spawn_file_actions_t acts; + posix_spawn_file_actions_init(&acts); + posix_spawn_file_actions_addclosefrom_np(&acts, 0); + int res = posix_spawn(&pid, fileName.c_str(), &acts, NULL, _args, environ); + posix_spawn_file_actions_destroy(&acts); + delete[] _args; + return res == 0; #endif - return false; } struct CUpdateManager::PackageData { From 341ab8132b0a3bbfcb3fbc851913e28b90ef9e01 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Mon, 26 Feb 2024 23:26:38 +0300 Subject: [PATCH 109/316] [macos] changed adding tab order for rtl --- .../MainWindow/ASCTitleBarController.mm | 14 +++++++++++--- .../Code/Controls/ASCTabs/ASCTabsControl.m | 15 ++++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm b/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm index cac54def0..3e4636b87 100644 --- a/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm +++ b/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm @@ -256,11 +256,12 @@ - (BOOL)isFullScreen { } - (void)doLayout { - CGFloat btnContainerWidth = CGRectGetWidth([self.standardButtonsDefaults[0] frame]) + 6.0; + int btnSpacing = 6.0; + CGFloat btnContainerWidth = CGRectGetWidth([self.standardButtonsDefaults[0] frame]) + btnSpacing; CGFloat leftOffset = kASCWindowDefaultTrafficButtonsLeftMargin; if ( [ASCLinguist isUILayoutDirectionRtl] ) { CGFloat windowWidth = CGRectGetWidth([[self view] frame]); - leftOffset = windowWidth - kASCWindowDefaultTrafficButtonsLeftMargin - btnContainerWidth * 3; + leftOffset = windowWidth - kASCWindowDefaultTrafficButtonsLeftMargin - btnContainerWidth * 3 + btnSpacing; } void (^layoutStandartButtons)(NSArray *, BOOL) = ^ (NSArray *views, BOOL hidden) { @@ -283,7 +284,14 @@ - (void)doLayout { CGFloat maxTabsWidth = containerWidth - kASCWindowMinTitleWidth - 100; CGFloat actualTabsWidth = self.tabsControl.maxTabWidth * [self.tabsControl.tabs count]; - self.tabsControl.frame = CGRectMake(0, 0, MIN(actualTabsWidth, maxTabsWidth), CGRectGetHeight(self.tabsControl.frame)); + int rtlDependedLeftOffset = 0; + if ([self.view userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft) { + NSRect rect = [[self.tabsControl superview] frame]; + rtlDependedLeftOffset = rect.size.width - MIN(actualTabsWidth, maxTabsWidth); + } + + self.tabsControl.frame = CGRectMake(rtlDependedLeftOffset, 0, MIN(actualTabsWidth, maxTabsWidth), CGRectGetHeight(self.tabsControl.frame)); + NSLog(@"tabs width %@", NSStringFromRect([self.tabsControl frame])); } - (void)viewWillTransitionToSize:(NSSize)newSize { diff --git a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabsControl.m b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabsControl.m index 161977018..2c7013ac7 100644 --- a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabsControl.m +++ b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabsControl.m @@ -318,8 +318,10 @@ - (void)layoutTabs:(NSArray *)tabs animated:(BOOL)anim { // Don't animate if it is hidden, as it will screw order of tabs if (anim && ![tabView isHidden]) { + NSLog(@"tabs layoutTabs anim %ld %@", idx, NSStringFromRect(rect)); [[tabView animator] setFrame:rect]; } else { + NSLog(@"tabs layoutTabs %ld %hhd %@", idx, anim, NSStringFromRect(rect)); [tabView setFrame:rect]; } @@ -596,7 +598,8 @@ - (void)reorderTab:(ASCTabView *)tab withEvent:(NSEvent *)event { newRect.origin.x = nextX; draggingTab.frame = CGRectOffset(newRect, -scrollPosition, 0); - + NSLog(@"tab dragging copy %@", NSStringFromRect(draggingTab.frame)); + BOOL movingLeft = (nextPoint.x < prevPoint.x); BOOL movingRight = (nextPoint.x > prevPoint.x); @@ -620,7 +623,10 @@ - (void)reorderTab:(ASCTabView *)tab withEvent:(NSEvent *)event { - (void)addTab:(ASCTabView *)tab selected:(BOOL)selected { if (tab) { tab.hidden = YES; - [self.tabs addObject:tab]; + if ( [self userInterfaceLayoutDirection] != NSUserInterfaceLayoutDirectionRightToLeft ) + [self.tabs addObject:tab]; + else + [self.tabs insertObject:tab atIndex:0]; if (_delegate && [_delegate respondsToSelector:@selector(tabs:didResize:)]) { [_delegate tabs:self didResize:CGRectZero]; @@ -631,8 +637,10 @@ - (void)addTab:(ASCTabView *)tab selected:(BOOL)selected { tab.hidden = NO; tab.frame = CGRectOffset(tab.frame, 0, -CGRectGetHeight(self.scrollView.frame)); + NSLog(@"tabs addtab before %@, %@", NSStringFromRect(tab.frame), NSStringFromRect(self.scrollView.frame)); [self.tabsView setFrame:CGRectMake(0.0, 0.0, CGRectGetMaxX(tab.frame), CGRectGetHeight(self.scrollView.frame))]; - + NSLog(@"tabs addtab after %@, %@", NSStringFromRect(tab.frame), NSStringFromRect(self.scrollView.frame)); + tab.delegate = self; tab.target = self; tab.action = @selector(handleSelectTab:); @@ -644,6 +652,7 @@ - (void)addTab:(ASCTabView *)tab selected:(BOOL)selected { [context setAllowsImplicitAnimation:YES]; tab.animator.frame = CGRectOffset(tab.frame, 0, CGRectGetHeight(self.scrollView.frame)); [tab.superview scrollRectToVisible:tab.frame]; + NSLog(@"tab animation %@", NSStringFromRect(tab.animator.frame)); } completionHandler:^{ [self layoutTabs:nil animated:NO]; [self updateAuxiliaryButtons]; From f65eaa20a030ceddead80527be313b2bab6d96e2 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Mon, 26 Feb 2024 23:26:56 +0300 Subject: [PATCH 110/316] [macos] refactoring --- .../MainWindow/ASCTitleWindowController.mm | 13 ++++++++++--- macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m | 1 - 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleWindowController.mm b/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleWindowController.mm index 652a188f2..febd0e526 100644 --- a/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleWindowController.mm +++ b/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleWindowController.mm @@ -98,7 +98,7 @@ - (void)setupToolbar { NSView * superview = view.superview; view.translatesAutoresizingMaskIntoConstraints = NO; - + // leading [superview addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeading @@ -116,10 +116,17 @@ - (void)setupToolbar { multiplier:1 constant:0]]; // width +// [superview addConstraint:[NSLayoutConstraint constraintWithItem:superview +// attribute:NSLayoutAttributeWidth +// relatedBy:NSLayoutRelationEqual +// toItem:view attribute:NSLayoutAttributeWidth +// multiplier:1 +// constant:0]]; + // width [superview addConstraint:[NSLayoutConstraint constraintWithItem:superview - attribute:NSLayoutAttributeWidth + attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual - toItem:view attribute:NSLayoutAttributeWidth + toItem:view attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]]; // height diff --git a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m index b0f117292..fd351dd3a 100644 --- a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m +++ b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m @@ -283,7 +283,6 @@ - (void)setButtonCloseOrigin:(NSRect)rect { CGFloat btnCloseOriginLeft = -([self userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft ? CGRectGetWidth(rect) - kASTabViewCloseButtonSize / 1.5 : kASTabViewCloseButtonSize * 1.5); - NSLog(@"tabview btn close origin %f %@", btnCloseOriginLeft, NSStringFromRect(rect)); [self.close setFrame:CGRectMake(btnCloseOriginLeft, kASTabViewCloseButtonSize / 1.5, kASTabViewCloseButtonSize, From 9000de3f8ac8a055c7a7bcac7c369b786678a5c2 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Tue, 27 Feb 2024 07:58:39 +0200 Subject: [PATCH 111/316] [win-linux] updmanager: add service update --- .../update-daemon/src/classes/csocket.h | 3 +- .../update-daemon/src/classes/csvcmanager.cpp | 77 +++++++++++ .../update-daemon/src/classes/csvcmanager.h | 1 + .../update-daemon/src/platform_linux/main.cpp | 4 + win-linux/src/cupdatemanager.cpp | 122 +++++++++++++++--- 5 files changed, 189 insertions(+), 18 deletions(-) diff --git a/win-linux/extras/update-daemon/src/classes/csocket.h b/win-linux/extras/update-daemon/src/classes/csocket.h index 151a4901c..2a1f5e490 100644 --- a/win-linux/extras/update-daemon/src/classes/csocket.h +++ b/win-linux/extras/update-daemon/src/classes/csocket.h @@ -70,7 +70,8 @@ enum MsgCommands { MSG_OtherError, MSG_RequestContentLenght, MSG_UnzipProgress, - MSG_SetLanguage + MSG_SetLanguage, + MSG_StartReplacingService }; class CSocket diff --git a/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp b/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp index 0d4cfb0ce..9af304b84 100644 --- a/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp +++ b/win-linux/extras/update-daemon/src/classes/csvcmanager.cpp @@ -68,6 +68,7 @@ # define APP_LAUNCH_NAME "/DesktopEditors" # define APP_HELPER "/editors_helper" # define DAEMON_NAME "/updatesvc" +# define DAEMON_NAME_OLD "/~updatesvc" # define SUBFOLDER "/desktopeditors" # define ARCHIVE_EXT _T(".tar.xz") # define ARCHIVE_PATTERN _T("*.tar.xz") @@ -274,6 +275,12 @@ void CSvcManager::init() __UNLOCK break; + case MSG_StartReplacingService: + __GLOBAL_LOCK + startReplacingService(params[2] == _T("true")); + __UNLOCK + break; + case MSG_ClearTempFiles: clearTempFiles(params[1], params[2]); break; @@ -629,3 +636,73 @@ void CSvcManager::startReplacingFiles(const tstring &packageType, const bool res restartService(); #endif } + +void CSvcManager::startReplacingService(const bool restartAfterUpdate) +{ + tstring appPath = NS_File::appPath(); + tstring updPath = NS_File::parentPath(appPath) + UPDATE_PATH; + tstring updSubPath = NS_File::fileExists(updPath + SUBFOLDER + APP_LAUNCH_NAME) ? updPath + SUBFOLDER : updPath; + if (!NS_File::dirExists(updPath)) { + NS_Logger::WriteLog(_TR("Update cancelled. Can't find folder:") + _T(" ") + updPath, true); + return; + } + +#ifdef _WIN32 +# ifndef DONT_VERIFY_SIGNATURE + // Verify the signature of executable files + if (!NS_File::verifyEmbeddedSignature(updSubPath + DAEMON_NAME)) { + NS_Logger::WriteLog(_TR("Update cancelled. The file signature is missing:") + _T(" ") + updSubPath + DAEMON_NAME, true); + return; + } +# endif +#endif + + // Wait until the main app closes + { +#ifdef _WIN32 + tstring apps[] = {APP_LAUNCH_NAME2, APP_HELPER}; +#else + tstring apps[] = {APP_LAUNCH_NAME, APP_HELPER}; +#endif + for (int i = 0; i < sizeof(apps) / sizeof(apps[0]); i++) { + int retries = 10; + tstring app(apps[i]); + app = app.substr(1); + while (NS_File::isProcessRunning(app) && retries-- > 0) + sleep(500); + + if (NS_File::isProcessRunning(app)) { + NS_Logger::WriteLog(_TR("Update cancelled. The program is not closed:") + _T(" ") + app, true); + return; + } + } + } + + // Rename updatesvc.exe to ~updatesvc.exe + if (NS_File::fileExists(appPath + DAEMON_NAME) && !NS_File::replaceFile(appPath + DAEMON_NAME, appPath + DAEMON_NAME_OLD)) { + NS_Logger::WriteLog(_TR("Update cancelled. Can't rename updatesvc.exe to ~updatesvc.exe:") + _T(" ") + NS_Utils::GetLastErrorAsString(), true); + return; + } + + // Move updatesvc.exe to app path + if (!NS_File::replaceFile(updSubPath + DAEMON_NAME, appPath + DAEMON_NAME)) { + NS_Logger::WriteLog(_TR("Update cancelled. Can't replace file updatesvc.exe to app path:") + _T(" ") + NS_Utils::GetLastErrorAsString(), true); + if (NS_File::fileExists(appPath + DAEMON_NAME_OLD) && !NS_File::replaceFile(appPath + DAEMON_NAME_OLD, appPath + DAEMON_NAME)) + NS_Logger::WriteLog(_TR("Can't restore file updatesvc.exe!"), true); + return; + } + + // Restart program + if (restartAfterUpdate) { + if (!NS_File::runProcess(appPath + APP_LAUNCH_NAME, _T(""))) + NS_Logger::WriteLog(_TR("An error occurred while restarting the program!"), true); + } + + // Remove Update dir + NS_File::removeDirRecursively(updPath); + + // Restart service +#ifdef _WIN32 + restartService(); +#endif +} diff --git a/win-linux/extras/update-daemon/src/classes/csvcmanager.h b/win-linux/extras/update-daemon/src/classes/csvcmanager.h index c2c34e01d..7f718695c 100644 --- a/win-linux/extras/update-daemon/src/classes/csvcmanager.h +++ b/win-linux/extras/update-daemon/src/classes/csvcmanager.h @@ -65,6 +65,7 @@ class CSvcManager void unzipIfNeeded(const tstring &filePath, const tstring &newVersion); void clearTempFiles(const tstring &prefix, const tstring &except = tstring()); void startReplacingFiles(const tstring &packageType, const bool restartAfterUpdate); + void startReplacingService(const bool restartAfterUpdate); FnVoidVoid m_quit_callback = nullptr; tstring m_newVersion; diff --git a/win-linux/extras/update-daemon/src/platform_linux/main.cpp b/win-linux/extras/update-daemon/src/platform_linux/main.cpp index 248fe7204..81f774e35 100644 --- a/win-linux/extras/update-daemon/src/platform_linux/main.cpp +++ b/win-linux/extras/update-daemon/src/platform_linux/main.cpp @@ -35,12 +35,16 @@ #include "classes/platform_linux/ctimer.h" #include "classes/csvcmanager.h" #include "classes/translator.h" +#include "version.h" #include "../../src/defines.h" #include "../../src/prop/defines_p.h" #include #include #include +#define DECL_VERSION __attribute__((section(".version_info"), unused)) + +volatile static const char DECL_VERSION version[] = VER_STRING; void strToNum(const char *str, int &num) { diff --git a/win-linux/src/cupdatemanager.cpp b/win-linux/src/cupdatemanager.cpp index 27e4a2a74..e26de5639 100644 --- a/win-linux/src/cupdatemanager.cpp +++ b/win-linux/src/cupdatemanager.cpp @@ -52,6 +52,8 @@ # include # include # include +# include +# include # include "components/cmessage.h" # include "platform_linux/updatedialog.h" # define DAEMON_NAME "/updatesvc" @@ -66,6 +68,7 @@ #define CHECK_ON_STARTUP_MS 9000 #define CMD_ARGUMENT_UPDATES_CHANNEL L"--updates-appcast-channel" #define CMD_ARGUMENT_UPDATES_INTERVAL L"--updates-interval" +#define SERVICE_NAME APP_TITLE " Update Service" #ifndef URL_APPCAST_UPDATES # define URL_APPCAST_UPDATES "" #endif @@ -232,10 +235,67 @@ auto runProcess(const tstring &fileName, const tstring &args, bool runAsAdmin = #endif } +auto getFileVersion(const tstring &filePath)->QString +{ + QString ver; +#ifdef _WIN32 + DWORD handle, size = GetFileVersionInfoSize(filePath.c_str(), &handle); + if (size > 0) { + BYTE *data = new BYTE[size]; + if (GetFileVersionInfo(filePath.c_str(), handle, size, (LPVOID)data)) { + UINT len = 0; + VS_FIXEDFILEINFO *verInfo = NULL; + if (VerQueryValue((LPCVOID)data, L"\\", (LPVOID*)&verInfo, &len)) { + if (verInfo->dwSignature == 0xfeef04bd) { + ver = QString("%1.%2.%3.%4").arg(QString::number(HIWORD(verInfo->dwFileVersionMS)), + QString::number(LOWORD(verInfo->dwFileVersionMS)), + QString::number(HIWORD(verInfo->dwFileVersionLS)), + QString::number(LOWORD(verInfo->dwFileVersionLS))); + } + } + } + delete[] data; + } +#else + int fd = open(filePath.c_str(), O_RDONLY); + if (fd != -1) { + Elf64_Ehdr header; + if (read(fd, &header, sizeof(header)) == sizeof(header)) { + Elf64_Shdr section; + off_t ofset = header.e_shoff + header.e_shentsize * header.e_shstrndx; + if (lseek(fd, ofset, SEEK_SET) == ofset && read(fd, §ion, sizeof(section)) == sizeof(section)) { + char *shstrtab = new char[section.sh_size]; + if (lseek(fd, section.sh_offset, SEEK_SET) == (off_t)section.sh_offset && + read(fd, shstrtab, section.sh_size) == (ssize_t)section.sh_size) { + for (int i = 0; i < header.e_shnum; ++i) { + ofset = header.e_shoff + i * header.e_shentsize; + if (lseek(fd, ofset, SEEK_SET) == ofset && read(fd, §ion, sizeof(section)) == sizeof(section)) { + if (strcmp(".version_info", shstrtab + section.sh_name) == 0) { + if (lseek(fd, section.sh_offset, SEEK_SET) == (off_t)section.sh_offset) { + char *version = new char[section.sh_size]; + if (read(fd, version, section.sh_size) == (ssize_t)section.sh_size) + ver = QString(version); + delete[] version; + } + break; + } + } + } + } + delete[] shstrtab; + } + } + close(fd); + } +#endif + return ver; +} + struct CUpdateManager::PackageData { QString fileName, fileType, fileSize, + object, hash, version; wstring packageUrl, @@ -244,6 +304,7 @@ struct CUpdateManager::PackageData { fileName.clear(); fileType.clear(); fileSize.clear(); + object.clear(); hash.clear(); version.clear(); packageUrl.clear(); @@ -701,7 +762,8 @@ void CUpdateManager::handleAppClose() return; } #endif - if (!m_socket->sendMessage(MSG_StartReplacingFiles, IsPackage(ISS) ? _T("iss") : IsPackage(MSI) ? _T("msi") : + int cmd = (m_packageData->object == "app") ? MSG_StartReplacingFiles : MSG_StartReplacingService; + if (!m_socket->sendMessage(cmd, IsPackage(ISS) ? _T("iss") : IsPackage(MSI) ? _T("msi") : IsPackage(Portable) ? _T("portable") : _T("other"), m_restartAfterUpdate ? _T("true") : _T("false"))) { criticalMsg(nullptr, QObject::tr("An error occurred while start replacing files: Update Service not found!")); } @@ -761,19 +823,24 @@ void CUpdateManager::onLoadCheckFinished(const QString &filePath) QString version = root.value("version").toString(); QString curr_version = QString::fromLatin1(VER_FILEVERSION_STR); - - if (isVersionBHigherThanA(curr_version, version) && (version != ignoredVersion())) { - m_packageData->version = version; - // parse package - QJsonObject package = root.value("package").toObject(); + QString svc_version = root.value("serviceVersion").toString(); + QString curr_svc_version = getFileVersion(QStrToTStr(qApp->applicationDirPath()) + DAEMON_NAME); + QJsonObject package = root.value("package").toObject(); #ifdef _WIN32 # ifdef _WIN64 - QJsonObject win = package.value("win_64").toObject(); + QJsonObject win = package.value("win_64").toObject(); # else - QJsonObject win = package.value("win_32").toObject(); + QJsonObject win = package.value("win_32").toObject(); # endif - QJsonObject package_type = win.value("archive").toObject(); +#else + QJsonObject win = package.value("linux_64").toObject(); +#endif + if (isVersionBHigherThanA(curr_version, version) && (version != ignoredVersion())) { + m_packageData->object = "app"; + m_packageData->version = version; m_packageData->fileType = "archive"; + QJsonObject package_type = win.value("archive").toObject(); +#ifdef _WIN32 if (!IsPackage(Portable)) { const QString install_key = IsPackage(MSI) ? "msi" : "iss"; if (win.contains(install_key)) { @@ -788,10 +855,6 @@ void CUpdateManager::onLoadCheckFinished(const QString &filePath) } } } -#else - QJsonObject win = package.value("linux_64").toObject(); - QJsonObject package_type = win.value("archive").toObject(); - m_packageData->fileType = "archive"; #endif m_packageData->packageUrl = package_type.value("url").toString().toStdWString(); m_packageData->hash = package_type.value("md5").toString().toLower(); @@ -801,6 +864,20 @@ void CUpdateManager::onLoadCheckFinished(const QString &filePath) const QString lang = CLangater::getCurrentLangCode() == "ru-RU" ? "ru-RU" : "en-EN"; QJsonValue changelog = release_notes.value(lang); + clearTempFiles(isSavedPackageValid() ? m_savedPackageData->fileName : ""); + if (m_packageData->packageUrl.empty() || !m_socket->sendMessage(MSG_RequestContentLenght, WStrToTStr(m_packageData->packageUrl))) { + m_packageData->fileSize = "--"; + onCheckFinished(false, true, m_packageData->version, ""); + } + } else + if (isVersionBHigherThanA(curr_svc_version, svc_version)) { + m_packageData->object = "svc"; + m_packageData->version = svc_version; + m_packageData->fileType = "archive"; + QJsonObject package_type = win.value("serviceArchive").toObject(); + m_packageData->packageUrl = package_type.value("url").toString().toStdWString(); + m_packageData->hash = package_type.value("md5").toString().toLower(); + clearTempFiles(isSavedPackageValid() ? m_savedPackageData->fileName : ""); if (m_packageData->packageUrl.empty() || !m_socket->sendMessage(MSG_RequestContentLenght, WStrToTStr(m_packageData->packageUrl))) { m_packageData->fileSize = "--"; @@ -819,6 +896,11 @@ void CUpdateManager::onCheckFinished(bool error, bool updateExist, const QString { if ( !error) { if ( updateExist ) { + if (m_packageData->object == "svc") { + __UNLOCK + loadUpdates(); + return; + } switch (getUpdateMode()) { case UpdateMode::SILENT: __UNLOCK @@ -848,9 +930,12 @@ void CUpdateManager::onCheckFinished(bool error, bool updateExist, const QString } void CUpdateManager::showUpdateMessage(QWidget *parent) { + QString name = (m_packageData->object == "app") ? QString(WINDOW_NAME) : QString(SERVICE_NAME); + QString curr_version = (m_packageData->object == "app") ? QString(VER_FILEVERSION_STR) : + getFileVersion(QStrToTStr(qApp->applicationDirPath()) + DAEMON_NAME); int result = WinDlg::showDialog(parent, tr("Update is available"), - QString("%1\n%2: %3\n%4: %5\n%6 (%7 MB)").arg(QString(WINDOW_NAME), tr("Current version"), - QString(VER_FILEVERSION_STR), tr("New version"), getVersion(), + QString("%1\n%2: %3\n%4: %5\n%6 (%7 MB)").arg(name, tr("Current version"), + curr_version, tr("New version"), getVersion(), tr("Would you like to download update now?"), m_packageData->fileSize), WinDlg::DlgBtns::mbSkipRemindDownload); __UNLOCK @@ -871,9 +956,12 @@ void CUpdateManager::showUpdateMessage(QWidget *parent) { void CUpdateManager::showStartInstallMessage(QWidget *parent) { + QString name = (m_packageData->object == "app") ? QString(WINDOW_NAME) : QString(SERVICE_NAME); + QString curr_version = (m_packageData->object == "app") ? QString(VER_FILEVERSION_STR) : + getFileVersion(QStrToTStr(qApp->applicationDirPath()) + DAEMON_NAME); int result = WinDlg::showDialog(parent, tr("Update is ready to install"), - QString("%1: %2\n%3: %4\n%5").arg(tr("Current version"), - QString(VER_FILEVERSION_STR), tr("New version"), getVersion(), + QString("%1\n%2: %3\n%4: %5\n%6").arg(name, tr("Current version"), + curr_version, tr("New version"), getVersion(), tr("To finish updating, restart the app")), WinDlg::DlgBtns::mbInslaterRestart); __UNLOCK From c233b1cf5a8a81339c7034f4c47941f57ca12d8b Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Tue, 27 Feb 2024 12:07:09 +0200 Subject: [PATCH 112/316] [linux] updatesvc: refactoring after fixing runProcess --- win-linux/extras/update-daemon/src/platform_linux/main.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/win-linux/extras/update-daemon/src/platform_linux/main.cpp b/win-linux/extras/update-daemon/src/platform_linux/main.cpp index 81f774e35..e764bbad4 100644 --- a/win-linux/extras/update-daemon/src/platform_linux/main.cpp +++ b/win-linux/extras/update-daemon/src/platform_linux/main.cpp @@ -77,11 +77,9 @@ int main(int argc, char *argv[]) strToNum((const char*)buff, pid); }); - // Checking for the completion of the main application: - // updatevc needs to be terminated when the main application is using a socket - // with the same address in the SingleApplication implementation and has been terminated incorrectly. + // Termination on crash of the main application CTimer tmr; - tmr.start(5000, [&app, &pid]() { + tmr.start(30000, [&app, &pid]() { if (pid != -1 && kill(pid, 0) != 0) app.exit(0); }); From 13b1415dddc4b287a60029e92dabc2e8600c784b Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Tue, 27 Feb 2024 19:26:11 +0300 Subject: [PATCH 113/316] [macos] refactoring --- .../Code/Controllers/Common/ASCCommonViewController.mm | 3 +++ macos/ONLYOFFICE/Code/Utils/ascprinter.h | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm b/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm index 695d8a0c3..1d5ea6769 100644 --- a/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm +++ b/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm @@ -1034,6 +1034,9 @@ - (void)onCEFStartSave:(NSNotification *)notification { - (void)printOperationDidRun:(NSPrintOperation *)printOperation success:(BOOL)success contextInfo:(void *)contextInfo { if (m_pContext) { m_pContext->EndPaint(); + + m_pContext->Release(); + m_pContext = nullptr; } } diff --git a/macos/ONLYOFFICE/Code/Utils/ascprinter.h b/macos/ONLYOFFICE/Code/Utils/ascprinter.h index cf8da0cf2..713e90866 100644 --- a/macos/ONLYOFFICE/Code/Utils/ascprinter.h +++ b/macos/ONLYOFFICE/Code/Utils/ascprinter.h @@ -413,7 +413,6 @@ class ASCPrinterContext : public NSEditorApi::CAscPrinterContextBase m_pView = nil; isCurrentlyPrinting = false; - this->Release(); } virtual void GetLogicalDPI(int& nDpiX, int& nDpiY) From b363d83cd90229da806eb675792ebaf389faafc4 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Tue, 27 Feb 2024 23:19:47 +0300 Subject: [PATCH 114/316] [win-nix] added xlsb format description --- macos/ONLYOFFICE/Code/Utils/ASCConstants.m | 4 ++++ win-linux/src/components/cfiledialog.cpp | 1 + 2 files changed, 5 insertions(+) diff --git a/macos/ONLYOFFICE/Code/Utils/ASCConstants.m b/macos/ONLYOFFICE/Code/Utils/ASCConstants.m index 94dc878e5..8b35bcc8a 100644 --- a/macos/ONLYOFFICE/Code/Utils/ASCConstants.m +++ b/macos/ONLYOFFICE/Code/Utils/ASCConstants.m @@ -181,6 +181,10 @@ + (NSDictionary *)ascFormatsInfo { @"description" : NSLocalizedString(@"Excel 2007 Spreadsheet", nil), @"extension" : @"xlsx" }, + @(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB): @{ + @"description" : NSLocalizedString(@"Excel Binary Workbook", nil), + @"extension" : @"xlsb" + }, @(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS): @{ @"description" : NSLocalizedString(@"Excel 97-2003 Spreadsheet", nil), @"extension" : @"xls" diff --git a/win-linux/src/components/cfiledialog.cpp b/win-linux/src/components/cfiledialog.cpp index 499b12474..6f67be5eb 100644 --- a/win-linux/src/components/cfiledialog.cpp +++ b/win-linux/src/components/cfiledialog.cpp @@ -89,6 +89,7 @@ CFileDialogWrapper::CFileDialogWrapper(QWidget * parent) : QObject(parent) m_mapFilters[AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX] = tr("XLSX File (*.xlsx)"); m_mapFilters[AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTX] = tr("Spreadsheet template") + " (*.xltx)"; m_mapFilters[AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLTM] = tr("Macro-enabled spreadsheet template") + " (*.xltm)"; + m_mapFilters[AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB] = tr("XLSB File (*.xlsb)"); m_mapFilters[AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS] = tr("XLS File (*.xls)"); m_mapFilters[AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS] = tr("ODS File (*.ods)"); m_mapFilters[AVS_OFFICESTUDIO_FILE_SPREADSHEET_OTS] = tr("OpenDocument Spreadsheet Template") + " (*.ots)"; From c6e49084fc2d12e6c0ef50c8c73178f2aad15dcc Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Wed, 28 Feb 2024 18:36:58 +0300 Subject: [PATCH 115/316] [macos] refactoring --- .../Code/Controllers/MainWindow/ASCTitleBarController.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm b/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm index 3e4636b87..9379b051f 100644 --- a/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm +++ b/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm @@ -117,7 +117,7 @@ - (void)initialize { [mainWindow standardWindowButton:NSWindowMiniaturizeButton], [mainWindow standardWindowButton:NSWindowZoomButton]]; - if ( [ASCLinguist isUILayoutDirectionRtl] ) { + if ( [self.view userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft ) { self.standardButtonsDefaults = [[self.standardButtonsDefaults reverseObjectEnumerator] allObjects]; } } From 6fc2b83ae4ffb9084208cab230cab232da2125b5 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Wed, 28 Feb 2024 18:49:20 +0300 Subject: [PATCH 116/316] [macos] 'start' button divider for rtl --- macos/ONLYOFFICE/Base.lproj/Main.storyboard | 2 ++ .../Code/Controllers/MainWindow/ASCTitleBarController.mm | 7 ++++++- macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabsControl.m | 7 ++----- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/macos/ONLYOFFICE/Base.lproj/Main.storyboard b/macos/ONLYOFFICE/Base.lproj/Main.storyboard index dafeda870..4782d0528 100644 --- a/macos/ONLYOFFICE/Base.lproj/Main.storyboard +++ b/macos/ONLYOFFICE/Base.lproj/Main.storyboard @@ -1524,6 +1524,8 @@ DQ + + diff --git a/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm b/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm index 9379b051f..781105e07 100644 --- a/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm +++ b/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm @@ -71,6 +71,8 @@ @interface ASCTitleBarController () Date: Thu, 29 Feb 2024 17:33:23 +0300 Subject: [PATCH 117/316] [macos] fix selected index after tab removed --- .../Code/Controls/ASCTabs/ASCTabsControl.m | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabsControl.m b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabsControl.m index e846cfdaa..4ae966a77 100644 --- a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabsControl.m +++ b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabsControl.m @@ -708,15 +708,27 @@ - (void)removeTab:(ASCTabView *)tab selected:(BOOL)selected { if (selected) { NSInteger tabsCount = [self.tabs count]; - if (tabsCount > tabIndex) { - [self selectTab:[self.tabs objectAtIndex:tabIndex]]; - } else if (tabsCount > tabIndex - 1 && tabIndex - 1 >= 0) { - [self selectTab:[self.tabs objectAtIndex:tabIndex - 1]]; - } else if (tabsCount > 0) { - [self selectTab:[self.tabs objectAtIndex:tabsCount - 1]]; - } else { - [self selectTab:nil]; + ASCTabView * tabToSelect = nil; + if ( tabsCount ) { + if ( [self userInterfaceLayoutDirection] != NSUserInterfaceLayoutDirectionRightToLeft ) { + if (tabsCount > tabIndex) { + tabToSelect = [self.tabs objectAtIndex:tabIndex]; +// } else if (tabsCount > tabIndex - 1 && tabIndex - 1 >= 0) { +// tabToSelect = [self.tabs objectAtIndex:tabIndex - 1]; +// } else if (tabsCount > 0) { + } else { + tabToSelect = [self.tabs objectAtIndex:tabsCount - 1]; + } + } else { + if ( tabIndex > 0 ) { + tabToSelect = [self.tabs objectAtIndex:tabIndex - 1]; + } else { + tabToSelect = [self.tabs objectAtIndex:tabIndex]; + } + } } + + [self selectTab:tabToSelect]; } }]; } From 6f80c3f0843f2009db4d983145d4b4059c7420f5 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Thu, 29 Feb 2024 17:34:11 +0300 Subject: [PATCH 118/316] [macos] fix tab's close button position for rtl mode --- macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m index fd351dd3a..2947204b4 100644 --- a/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m +++ b/macos/ONLYOFFICE/Code/Controls/ASCTabs/ASCTabView.m @@ -166,11 +166,13 @@ - (void)initialize { } - (void)setFrame:(NSRect)frame { - if ( self.frame.size.width != frame.size.width ) { - [self setButtonCloseOrigin:frame]; - } + bool needUpdateCloseOrigin = self.frame.size.width != frame.size.width; [super setFrame:frame]; + + if ( needUpdateCloseOrigin ) { + [self setButtonCloseOrigin:frame]; + } } - (void)setState:(NSInteger)state { @@ -280,8 +282,8 @@ - (void)setIsProcessing:(BOOL)isProcessing { } - (void)setButtonCloseOrigin:(NSRect)rect { - CGFloat btnCloseOriginLeft = -([self userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft ? - CGRectGetWidth(rect) - kASTabViewCloseButtonSize / 1.5 : kASTabViewCloseButtonSize * 1.5); + CGFloat btnCloseOriginLeft = [self userInterfaceLayoutDirection] != NSUserInterfaceLayoutDirectionRightToLeft ? + CGRectGetWidth(rect) - kASTabViewCloseButtonSize * 1.5 : kASTabViewCloseButtonSize / 1.5; [self.close setFrame:CGRectMake(btnCloseOriginLeft, kASTabViewCloseButtonSize / 1.5, From ee0c6e4fdc105942dc7ffa5c1f64eae890cd1413 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Thu, 29 Feb 2024 20:04:51 +0300 Subject: [PATCH 119/316] [win] debug after merge with 8.0.1 --- win-linux/src/windows/ceditorwindow.cpp | 1 + win-linux/src/windows/cpresenterwindow.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/win-linux/src/windows/ceditorwindow.cpp b/win-linux/src/windows/ceditorwindow.cpp index 3971f3031..95f5846c0 100644 --- a/win-linux/src/windows/ceditorwindow.cpp +++ b/win-linux/src/windows/ceditorwindow.cpp @@ -33,6 +33,7 @@ #include "windows/ceditorwindow.h" #include "windows/ceditorwindow_p.h" #include +#include #define CAPTURED_WINDOW_OFFSET_X (6*TOOLBTN_WIDTH + 10) * m_dpiRatio #define CAPTURED_WINDOW_OFFSET_Y 15 * m_dpiRatio diff --git a/win-linux/src/windows/cpresenterwindow.cpp b/win-linux/src/windows/cpresenterwindow.cpp index b74bd123e..0d2dc59dc 100644 --- a/win-linux/src/windows/cpresenterwindow.cpp +++ b/win-linux/src/windows/cpresenterwindow.cpp @@ -36,6 +36,7 @@ #include "defines.h" #include "utils.h" #include +#include using namespace std::placeholders; From e5e607bf46279a4cc772088db1778899759f875c Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 1 Mar 2024 08:29:11 +0200 Subject: [PATCH 120/316] [win-linux] debug after merge with 8.0.1 --- win-linux/extras/update-daemon/common.pri | 6 +- .../src/classes/platform_win/cunzip.cpp | 264 +++++------------- win-linux/res/styles/styles.qss | 14 +- 3 files changed, 77 insertions(+), 207 deletions(-) diff --git a/win-linux/extras/update-daemon/common.pri b/win-linux/extras/update-daemon/common.pri index 92f2889a3..0e2dd0676 100644 --- a/win-linux/extras/update-daemon/common.pri +++ b/win-linux/extras/update-daemon/common.pri @@ -103,7 +103,11 @@ core_windows { DEFINES += __OS_WIN_XP } - LIBS += -lwinhttp \ + LIBS += -luser32 \ + -lshell32 \ + -lshlwapi \ + -ladvapi32 \ + -lwinhttp \ -lws2_32 \ -lrpcrt4 \ -lwtsapi32 \ diff --git a/win-linux/extras/update-daemon/src/classes/platform_win/cunzip.cpp b/win-linux/extras/update-daemon/src/classes/platform_win/cunzip.cpp index 5fd72e1e6..9ba745eae 100644 --- a/win-linux/extras/update-daemon/src/classes/platform_win/cunzip.cpp +++ b/win-linux/extras/update-daemon/src/classes/platform_win/cunzip.cpp @@ -32,10 +32,12 @@ #include "cunzip.h" #include "platform_win/utils.h" -#ifdef USE_NATIVE_UNZIP -#include -#include +#include +#include +#include "unzip.h" +#define MAX_PATH_LEN 512 +#define BLOCK_SIZE 8192 class CUnzip::CUnzipPrivate { @@ -45,224 +47,98 @@ class CUnzip::CUnzipPrivate ~CUnzipPrivate() {} - bool calcFilesCountRecursively(IShellDispatch *pISD, const CComPtr &pSrcFolder) + int unzipArchive(const wstring &zipFilePath, const wstring &folderPath) { - CComPtr pItems; - if (FAILED(pSrcFolder->Items(&pItems))) - return false; - - long itemCount = 0; - if (FAILED(pItems->get_Count(&itemCount))) - return false; - - for (int i = 0; i < itemCount; i++) { - CComPtr pItem; - if (FAILED(pItems->Item(CComVariant(i), &pItem))) - return false; - - VARIANT_BOOL isFolder = VARIANT_FALSE; - if (FAILED(pItem->get_IsFolder(&isFolder))) - return false; - - if (isFolder == VARIANT_TRUE) { - CComPtr pSubFolder; - if (FAILED(pISD->NameSpace(CComVariant(pItem), &pSubFolder))) - return false; + if (!NS_File::fileExists(zipFilePath) || !NS_File::dirExists(folderPath)) + return UNZIP_ERROR; - if (!calcFilesCountRecursively(pISD, pSubFolder)) - return false; + std::wstring_convert> utf8_conv; + std::string utf8ZipFilePath = utf8_conv.to_bytes(NS_File::fromNativeSeparators(zipFilePath)); + std::string utf8FolderPath = utf8_conv.to_bytes(NS_File::fromNativeSeparators(folderPath)); - } else { - ++total_count; - } - } - return true; - } - - int extractRecursively(IShellDispatch *pISD, const CComPtr &pSrcFolder, const wstring &destFolder) - { - CComPtr pItems; - if (FAILED(pSrcFolder->Items(&pItems))) + unzFile hzf = unzOpen(utf8ZipFilePath.c_str()); + if (!hzf) return UNZIP_ERROR; - long itemCount = 0; - if (FAILED(pItems->get_Count(&itemCount))) + unz_global_info g_info; + if (unzGetGlobalInfo(hzf, &g_info) != UNZ_OK) { + unzClose(hzf); return UNZIP_ERROR; + } - for (int i = 0; i < itemCount; i++) { - if (!run) + int prev_percent = -1; + uLong total_count = g_info.number_entry; + for (uLong i = 0; i < total_count; ++i) { + if (!run) { + unzClose(hzf); return UNZIP_ABORT; - - CComPtr pItem; - if (FAILED(pItems->Item(CComVariant(i), &pItem))) - return UNZIP_ERROR; - - VARIANT_BOOL isFolder = VARIANT_FALSE; - if (FAILED(pItem->get_IsFolder(&isFolder))) + } + unz_file_info file_info; + char entry_name[MAX_PATH_LEN]; + if (unzGetCurrentFileInfo(hzf, &file_info, entry_name, MAX_PATH_LEN, NULL, 0, NULL, 0) != UNZ_OK) { + unzClose(hzf); return UNZIP_ERROR; + } - if (isFolder == VARIANT_TRUE) { - // Source path - CComPtr pSubFolder; - if (FAILED(pISD->NameSpace(CComVariant(pItem), &pSubFolder))) + char out_path[MAX_PATH_LEN]; + snprintf(out_path, MAX_PATH_LEN, "%s/%s", utf8FolderPath.c_str(), entry_name); + if (entry_name[strlen(entry_name) - 1] == '/') { + if (::CreateDirectoryA(out_path, NULL) == 0) return UNZIP_ERROR; - // Dest path - BSTR bstrName; - if (FAILED(pItem->get_Name(&bstrName))) + } else { + if (unzOpenCurrentFile(hzf) != UNZ_OK) { + unzClose(hzf); return UNZIP_ERROR; + } - wstring targetFolder = destFolder + L"\\" + bstrName; - SysFreeString(bstrName); - if (CreateDirectory(targetFolder.c_str(), NULL) == 0) + FILE *hFile = fopen(out_path, "wb"); + if (!hFile) { + unzCloseCurrentFile(hzf); + unzClose(hzf); return UNZIP_ERROR; + } - int res = extractRecursively(pISD, pSubFolder, targetFolder); - if (res != UNZIP_OK) - return res; - - } else { - CComPtr pDestFolder; - if (FAILED(pISD->NameSpace(CComVariant(destFolder.c_str()), &pDestFolder))) - return UNZIP_ERROR; - if (FAILED(pDestFolder->CopyHere(CComVariant(pItem), CComVariant(1024 | 512 | 16 | 4)))) - return UNZIP_ERROR; - if (total_count > 0 && progress_callback) { - ++curr_count; - int percent = static_cast(100.0 * ((double)curr_count / total_count)); - if (percent != prev_percent) { - progress_callback(percent); - prev_percent = percent; + int bytes_read = 0; + do { + char buff[BLOCK_SIZE] = {0}; + bytes_read = unzReadCurrentFile(hzf, buff, BLOCK_SIZE); + if (bytes_read < 0 || (bytes_read > 0 && fwrite(buff, bytes_read, 1, hFile) != 1)) { + fclose(hFile); + unzCloseCurrentFile(hzf); + unzClose(hzf); + return UNZIP_ERROR; } - } + } while (bytes_read > 0); + fclose(hFile); + unzCloseCurrentFile(hzf); } - } - return UNZIP_OK; - } - - int unzipArchive(const wstring &zipFilePath, const wstring &folderPath) - { - if (!NS_File::fileExists(zipFilePath) || !NS_File::dirExists(folderPath)) - return UNZIP_ERROR; - - wstring file = NS_File::toNativeSeparators(zipFilePath); - wstring path = NS_File::toNativeSeparators(folderPath); - HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); - if (FAILED(hr)) - return UNZIP_ERROR; - - IShellDispatch *pShell = NULL; - hr = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pShell)); - if (FAILED(hr)) { - CoUninitialize(); - return UNZIP_ERROR; - } - - CComPtr pSrcFolder; - if (FAILED(pShell->NameSpace(CComVariant(file.c_str()), &pSrcFolder))) { - pShell->Release(); - CoUninitialize(); - return UNZIP_ERROR; - } - - prev_percent = -1; - curr_count = 0; - total_count = 0; - if (!calcFilesCountRecursively(pShell, pSrcFolder)) - total_count = 0; - int res = extractRecursively(pShell, pSrcFolder, path); - pSrcFolder.Release(); - pShell->Release(); - CoUninitialize(); - return res; - } -#else -#include -#include -#include "unzip.h" - -#define MAX_PATH_LEN 512 -#define BLOCK_SIZE 8192 - - -int unzipArchive(const wstring &zipFilePath, const wstring &folderPath, std::atomic_bool &run) -{ - if (!NS_File::fileExists(zipFilePath) || !NS_File::dirExists(folderPath)) - return UNZIP_ERROR; - - std::wstring_convert> utf8_conv; - std::string utf8ZipFilePath = utf8_conv.to_bytes(NS_File::fromNativeSeparators(zipFilePath)); - std::string utf8FolderPath = utf8_conv.to_bytes(NS_File::fromNativeSeparators(folderPath)); - - unzFile hzf = unzOpen(utf8ZipFilePath.c_str()); - if (!hzf) - return UNZIP_ERROR; - - unz_global_info g_info; - if (unzGetGlobalInfo(hzf, &g_info) != UNZ_OK) { - unzClose(hzf); - return UNZIP_ERROR; - } - - uLong total_count = g_info.number_entry; - for (uLong i = 0; i < total_count; ++i) { - if (!run) { - unzClose(hzf); - return UNZIP_ABORT; - } - unz_file_info file_info; - char entry_name[MAX_PATH_LEN]; - if (unzGetCurrentFileInfo(hzf, &file_info, entry_name, MAX_PATH_LEN, NULL, 0, NULL, 0) != UNZ_OK) { - unzClose(hzf); - return UNZIP_ERROR; - } - - char out_path[MAX_PATH_LEN]; - snprintf(out_path, MAX_PATH_LEN, "%s/%s", utf8FolderPath.c_str(), entry_name); - if (entry_name[strlen(entry_name) - 1] == '/') { - if (::CreateDirectoryA(out_path, NULL) == 0) - return UNZIP_ERROR; - - } else { - if (unzOpenCurrentFile(hzf) != UNZ_OK) { - unzClose(hzf); - return UNZIP_ERROR; + if (progress_callback) { + int percent = static_cast(100.0 * (double(i + 1) / total_count)); + if (percent != prev_percent) { + progress_callback(percent); + prev_percent = percent; + } } - FILE *hFile = fopen(out_path, "wb"); - if (!hFile) { - unzCloseCurrentFile(hzf); + if ((i + 1) < total_count && unzGoToNextFile(hzf) != UNZ_OK) { unzClose(hzf); return UNZIP_ERROR; } - - int bytes_read = 0; - do { - char buff[BLOCK_SIZE] = {0}; - bytes_read = unzReadCurrentFile(hzf, buff, BLOCK_SIZE); - if (bytes_read < 0 || (bytes_read > 0 && fwrite(buff, bytes_read, 1, hFile) != 1)) { - fclose(hFile); - unzCloseCurrentFile(hzf); - unzClose(hzf); - return UNZIP_ERROR; - } - } while (bytes_read > 0); - fclose(hFile); - unzCloseCurrentFile(hzf); - } - - if ((i + 1) < total_count && unzGoToNextFile(hzf) != UNZ_OK) { - unzClose(hzf); - return UNZIP_ERROR; } + unzClose(hzf); + return UNZIP_OK; } - unzClose(hzf); - return UNZIP_OK; -} -#endif -CUnzip::CUnzip() + FnVoidInt complete_callback = nullptr, + progress_callback = nullptr; + std::atomic_bool run; + std::future future; +}; + +CUnzip::CUnzip() : + pimpl(new CUnzipPrivate) { pimpl->run = false; } diff --git a/win-linux/res/styles/styles.qss b/win-linux/res/styles/styles.qss index 48bdc7977..9a2612aa8 100644 --- a/win-linux/res/styles/styles.qss +++ b/win-linux/res/styles/styles.qss @@ -127,16 +127,6 @@ QPushButton#toolButtonDownload {border-left: 0px; border-right: 1px solid #dfdfd border: 1px solid #c0c0c0; border-radius: 4px; background-color: #ffffff; background-clip: border-box; } -#mainPanel[uitheme=theme-dark] #CToolTip>QLabel { - margin: 0px; - border: 1px solid #666666; - color: #d2d2d2; - background-color: #333333; -} -#mainPanel[uitheme=theme-contrast-dark] #CToolTip>QLabel { - margin: 0px; - border: 1px solid #696969; - color: #d2d2d2; - background-color: #212121; -} +#mainPanel[uitheme=theme-dark] #CToolTip>QLabel {margin: 0px; border: 1px solid #666666; color: #d2d2d2; background-color: #333333;} +#mainPanel[uitheme=theme-contrast-dark] #CToolTip>QLabel {margin: 0px; border: 1px solid #696969; color: #d2d2d2; background-color: #212121;} #mainPanel[rtl-font=true] #CToolTip>QLabel {font-family: "Segoe UI", "Traditional Arabic", "Noto Sans";} From 61eca79bb7b5bf6691251a7eb5831f0bf9dc220a Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 1 Mar 2024 08:42:01 +0200 Subject: [PATCH 121/316] [win-linux] csocket: refactoring --- win-linux/extras/update-daemon/src/classes/csocket.cpp | 4 ++-- win-linux/extras/update-daemon/src/classes/csocket.h | 2 +- win-linux/src/platform_linux/singleapplication.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/win-linux/extras/update-daemon/src/classes/csocket.cpp b/win-linux/extras/update-daemon/src/classes/csocket.cpp index 792f5a8f8..2a56fafbe 100644 --- a/win-linux/extras/update-daemon/src/classes/csocket.cpp +++ b/win-linux/extras/update-daemon/src/classes/csocket.cpp @@ -210,7 +210,7 @@ void CSocket::CSocketPrv::postError(const char *error) m_error_callback(error); } -CSocket::CSocket(int sender_port, int receiver_port) : +CSocket::CSocket(int sender_port, int receiver_port, bool retry_connect) : pimpl(new CSocketPrv) { pimpl->m_sender_port = sender_port; @@ -218,7 +218,7 @@ CSocket::CSocket(int sender_port, int receiver_port) : return; pimpl->m_socket_created = pimpl->createSocket(receiver_port); pimpl->m_future = std::async(std::launch::async, [=]() { - while (pimpl->m_run && !pimpl->m_socket_created) { + while (retry_connect && pimpl->m_run && !pimpl->m_socket_created) { pimpl->postError("Unable to create socket, retrying after 4 seconds."); sleep(RETRIES_DELAY_MS); pimpl->m_socket_created = pimpl->createSocket(receiver_port); diff --git a/win-linux/extras/update-daemon/src/classes/csocket.h b/win-linux/extras/update-daemon/src/classes/csocket.h index 2a1f5e490..8b15eccc2 100644 --- a/win-linux/extras/update-daemon/src/classes/csocket.h +++ b/win-linux/extras/update-daemon/src/classes/csocket.h @@ -77,7 +77,7 @@ enum MsgCommands { class CSocket { public: - CSocket(int sender_port, int receiver_port); + CSocket(int sender_port, int receiver_port, bool retry_connect = true); ~CSocket(); /* callback */ diff --git a/win-linux/src/platform_linux/singleapplication.cpp b/win-linux/src/platform_linux/singleapplication.cpp index 0cd4d291c..093e1f2dc 100644 --- a/win-linux/src/platform_linux/singleapplication.cpp +++ b/win-linux/src/platform_linux/singleapplication.cpp @@ -39,7 +39,7 @@ SingleApplication::SingleApplication(int &argc, char *argv[], const QString&) : QApplication(argc, argv), - m_socket(new CSocket(0, INSTANCE_APP_PORT)) + m_socket(new CSocket(0, INSTANCE_APP_PORT, false)) { if (m_socket->isPrimaryInstance()) { m_isPrimary = true; From 464590931a8d72bb5a198b96bc35ea5e53bd6a0a Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 1 Mar 2024 08:47:21 +0200 Subject: [PATCH 122/316] [linux] singleapplication: fix multi user mode --- .../update-daemon/src/classes/csocket.cpp | 24 +++++++++++++++---- .../update-daemon/src/classes/csocket.h | 2 +- .../src/platform_linux/singleapplication.cpp | 6 ++--- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/win-linux/extras/update-daemon/src/classes/csocket.cpp b/win-linux/extras/update-daemon/src/classes/csocket.cpp index 2a56fafbe..9d6cc4df8 100644 --- a/win-linux/extras/update-daemon/src/classes/csocket.cpp +++ b/win-linux/extras/update-daemon/src/classes/csocket.cpp @@ -66,7 +66,19 @@ typedef struct sockaddr_in SockAddr; -static bool initSocket(u_short port, SOCKET &tmpd, SockAddr &addr, int &ret, std::string &error) +static unsigned long inetAddrFromUserId() +{ +#ifdef _WIN32 + return inet_addr(INADDR); +#else + uint16_t uid = uint16_t(getuid() - 1000); + char addr[14]; + snprintf(addr, sizeof(addr), "127.%d.%d.1", (uid >> 8) & 0xff, uid & 0xff); + return inet_addr(addr); +#endif +} + +static bool initSocket(u_short port, SOCKET &tmpd, SockAddr &addr, int &ret, std::string &error, bool use_unique_addr) { #ifdef _WIN32 WSADATA wsaData = {0}; @@ -87,7 +99,7 @@ static bool initSocket(u_short port, SOCKET &tmpd, SockAddr &addr, int &ret, std } memset(&addr, 0, sizeof(SockAddr)); addr.sin_family = AF_INET; - addr.sin_addr.s_addr = inet_addr(INADDR); + addr.sin_addr.s_addr = use_unique_addr ? inetAddrFromUserId() : inet_addr(INADDR); addr.sin_port = htons(port); ret = ::bind(tmpd, (struct sockaddr*)&addr, sizeof(addr)); return true; @@ -113,6 +125,7 @@ class CSocket::CSocketPrv std::future m_future; int m_sender_port; std::atomic_bool m_run, + m_use_unique_addr, m_socket_created; }; @@ -131,7 +144,7 @@ bool CSocket::CSocketPrv::createSocket(u_short port) SOCKET tmpd; SockAddr addr; std::string error; - if (!initSocket(port, tmpd, addr, ret, error)) { + if (!initSocket(port, tmpd, addr, ret, error, m_use_unique_addr)) { postError(error.c_str()); return false; } @@ -151,7 +164,7 @@ bool CSocket::CSocketPrv::connectToSocket(u_short port) SOCKET tmpd; SockAddr addr; std::string error; - if (!initSocket(port, tmpd, addr, ret, error)) { + if (!initSocket(port, tmpd, addr, ret, error, m_use_unique_addr)) { postError(error.c_str()); return false; } @@ -210,9 +223,10 @@ void CSocket::CSocketPrv::postError(const char *error) m_error_callback(error); } -CSocket::CSocket(int sender_port, int receiver_port, bool retry_connect) : +CSocket::CSocket(int sender_port, int receiver_port, bool retry_connect, bool use_unique_addr) : pimpl(new CSocketPrv) { + pimpl->m_use_unique_addr = use_unique_addr; pimpl->m_sender_port = sender_port; if (receiver_port <= 0) return; diff --git a/win-linux/extras/update-daemon/src/classes/csocket.h b/win-linux/extras/update-daemon/src/classes/csocket.h index 8b15eccc2..8a13929a9 100644 --- a/win-linux/extras/update-daemon/src/classes/csocket.h +++ b/win-linux/extras/update-daemon/src/classes/csocket.h @@ -77,7 +77,7 @@ enum MsgCommands { class CSocket { public: - CSocket(int sender_port, int receiver_port, bool retry_connect = true); + CSocket(int sender_port, int receiver_port, bool retry_connect = true, bool use_unique_addr = false); ~CSocket(); /* callback */ diff --git a/win-linux/src/platform_linux/singleapplication.cpp b/win-linux/src/platform_linux/singleapplication.cpp index 093e1f2dc..a990691ae 100644 --- a/win-linux/src/platform_linux/singleapplication.cpp +++ b/win-linux/src/platform_linux/singleapplication.cpp @@ -38,9 +38,9 @@ SingleApplication::SingleApplication(int &argc, char *argv[], const QString&) : - QApplication(argc, argv), - m_socket(new CSocket(0, INSTANCE_APP_PORT, false)) + QApplication(argc, argv) { + m_socket = new CSocket(0, INSTANCE_APP_PORT, false, true); if (m_socket->isPrimaryInstance()) { m_isPrimary = true; m_socket->onMessageReceived([=](void *buff, size_t size) { @@ -67,7 +67,7 @@ bool SingleApplication::sendMessage(const QByteArray &msg) return false; QThread::msleep(RETRIES_DELAY_MS); - CSocket socket(INSTANCE_APP_PORT, 0); + CSocket socket(INSTANCE_APP_PORT, 0, false, true); return socket.sendMessage((void*)msg.data(), msg.size()); } From 32d41f2089176fda812afb1c249b93d42594a3d1 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 1 Mar 2024 08:48:22 +0200 Subject: [PATCH 123/316] [win-linux] add log that instance is not primary --- win-linux/src/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/win-linux/src/main.cpp b/win-linux/src/main.cpp index d83e5c6d8..b6535f5d0 100644 --- a/win-linux/src/main.cpp +++ b/win-linux/src/main.cpp @@ -40,6 +40,7 @@ #endif #include "defines.h" #include "clangater.h" +#include "clogger.h" #include "version.h" #include "utils.h" #include "chelp.h" @@ -136,7 +137,8 @@ int main( int argc, char *argv[] ) _out_args.append(arg + ";"); } } - app.sendMessage(_out_args.toUtf8()); + bool res = app.sendMessage(_out_args.toUtf8()); + CLogger::log("The instance is not primary and will be closed. Parameter sending status: " + QString::number(res)); return 0; } From 90245286d746856d14fc8b4d90070c1ff05d487a Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 1 Mar 2024 08:51:53 +0200 Subject: [PATCH 124/316] [linux] add ability to set custom instance app port --- win-linux/src/main.cpp | 4 ++++ .../src/platform_linux/singleapplication.cpp | 6 +++--- win-linux/src/utils.cpp | 19 +++++++++++++++++++ win-linux/src/utils.h | 3 +++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/win-linux/src/main.cpp b/win-linux/src/main.cpp index b6535f5d0..740206519 100644 --- a/win-linux/src/main.cpp +++ b/win-linux/src/main.cpp @@ -65,6 +65,10 @@ int main( int argc, char *argv[] ) CMessage::warning(nullptr, WARNING_LAUNCH_WITH_ADMIN_RIGHTS); return 0; } + if ( InputArgs::contains(L"--set-instapp-port") ) { + Utils::setInstAppPort(std::stoi(InputArgs::argument_value(L"--set-instapp-port"))); + return 0; + } #endif QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling); QCoreApplication::setAttribute(Qt::AA_Use96Dpi); diff --git a/win-linux/src/platform_linux/singleapplication.cpp b/win-linux/src/platform_linux/singleapplication.cpp index a990691ae..5ee36a34b 100644 --- a/win-linux/src/platform_linux/singleapplication.cpp +++ b/win-linux/src/platform_linux/singleapplication.cpp @@ -31,7 +31,7 @@ */ #include "singleapplication.h" -#include "defines.h" +#include "utils.h" #include #define RETRIES_DELAY_MS 100 @@ -40,7 +40,7 @@ SingleApplication::SingleApplication(int &argc, char *argv[], const QString&) : QApplication(argc, argv) { - m_socket = new CSocket(0, INSTANCE_APP_PORT, false, true); + m_socket = new CSocket(0, Utils::getInstAppPort(), false, true); if (m_socket->isPrimaryInstance()) { m_isPrimary = true; m_socket->onMessageReceived([=](void *buff, size_t size) { @@ -67,7 +67,7 @@ bool SingleApplication::sendMessage(const QByteArray &msg) return false; QThread::msleep(RETRIES_DELAY_MS); - CSocket socket(INSTANCE_APP_PORT, 0, false, true); + CSocket socket(Utils::getInstAppPort(), 0, false, true); return socket.sendMessage((void*)msg.data(), msg.size()); } diff --git a/win-linux/src/utils.cpp b/win-linux/src/utils.cpp index ba7128a92..8be87122d 100644 --- a/win-linux/src/utils.cpp +++ b/win-linux/src/utils.cpp @@ -762,6 +762,25 @@ void Utils::setSessionInProgress(bool state) { sessionInProgress = state; } +#else +void Utils::setInstAppPort(int port) +{ + GET_REGISTRY_USER(reg_user); + if (port == -1) { + reg_user.remove("instAppPort"); + } else + if (port > 1023 && port < 65536) { + reg_user.setValue("instAppPort", port); + } else { + qWarning() << "Value not applied: port must be in the range 1024 - 65535"; + } +} + +int Utils::getInstAppPort() +{ + GET_REGISTRY_USER(reg_user); + return reg_user.value("instAppPort", INSTANCE_APP_PORT).toInt(); +} #endif QString Utils::replaceBackslash(const QString& path) diff --git a/win-linux/src/utils.h b/win-linux/src/utils.h index c0cdbf7ea..6dfaa0875 100644 --- a/win-linux/src/utils.h +++ b/win-linux/src/utils.h @@ -128,6 +128,9 @@ class Utils { static WinVer getWinVersion(); static bool isSessionInProgress(); static void setSessionInProgress(bool); +#else + static void setInstAppPort(int); + static int getInstAppPort(); #endif }; From fe6da6f6c35eb89a7eeda6fedc8fdfac0b693197 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 1 Mar 2024 14:00:34 +0200 Subject: [PATCH 125/316] [win-linux] set cef size when show --- win-linux/src/components/ctabpanel.cpp | 10 +++++++--- win-linux/src/components/ctabpanel.h | 2 +- win-linux/src/windows/ceditorwindow.cpp | 8 ++++++++ win-linux/src/windows/cmainwindow.cpp | 4 ++++ win-linux/src/windows/cpresenterwindow.cpp | 9 +++++++++ win-linux/src/windows/cpresenterwindow.h | 1 + 6 files changed, 30 insertions(+), 4 deletions(-) diff --git a/win-linux/src/components/ctabpanel.cpp b/win-linux/src/components/ctabpanel.cpp index 2b7493863..c236306da 100644 --- a/win-linux/src/components/ctabpanel.cpp +++ b/win-linux/src/components/ctabpanel.cpp @@ -150,10 +150,14 @@ bool CTabPanel::isReady() m_pViewer->resize(event->size()); }*/ -/*void CTabPanel::showEvent(QShowEvent *) +void CTabPanel::showEvent(QShowEvent *ev) { -// cef()->resizeEvent(); -}*/ + QWidget::showEvent(ev); + if (ev->type() == QShowEvent::Show) { + m_pViewer->resize(size()); + cef()->resizeEvent(); + } +} /*void CTabPanel::paintEvent(QPaintEvent *) { diff --git a/win-linux/src/components/ctabpanel.h b/win-linux/src/components/ctabpanel.h index 9daaf7b21..4d8c16e32 100644 --- a/win-linux/src/components/ctabpanel.h +++ b/win-linux/src/components/ctabpanel.h @@ -38,7 +38,7 @@ class CTabPanel : public QWidget void setReady(); //void resize(int w, int h); //void resizeEvent(QResizeEvent *event); - //void showEvent(QShowEvent *event); + virtual void showEvent(QShowEvent *event) override; bool prettyTitle() { return m_prettyTitle; } void setPrettyTitle(bool v) { m_prettyTitle = v; } diff --git a/win-linux/src/windows/ceditorwindow.cpp b/win-linux/src/windows/ceditorwindow.cpp index 95f5846c0..b12dfb396 100644 --- a/win-linux/src/windows/ceditorwindow.cpp +++ b/win-linux/src/windows/ceditorwindow.cpp @@ -394,6 +394,14 @@ bool CEditorWindow::event(QEvent * event) if (event->type() == QEvent::Resize) { onSizeEvent(0); } else + if (event->type() == QEvent::Show) { + QTimer::singleShot(0, this, [=]() { + if (m_pMainView) { + d_ptr->panel()->view()->resize(m_pMainView->size()); + d_ptr->panel()->cef()->resizeEvent(); + } + }); + } else // if (event->type() == QEvent::User) { // onExitSizeMove(); // } else diff --git a/win-linux/src/windows/cmainwindow.cpp b/win-linux/src/windows/cmainwindow.cpp index ed9781083..8d6ac8dfc 100644 --- a/win-linux/src/windows/cmainwindow.cpp +++ b/win-linux/src/windows/cmainwindow.cpp @@ -1508,6 +1508,10 @@ void CMainWindow::showEvent(QShowEvent * e) { CWindowPlatform::showEvent(e); cancelClose(); + if (e->type() == QEvent::Show) { + m_pMainWidget->resize(m_pMainPanel->size() - QSize(0, m_boxTitleBtns->height())); + static_cast(m_pMainWidget)->GetCefView()->resizeEvent(); + } } bool CMainWindow::isAboutToClose() const diff --git a/win-linux/src/windows/cpresenterwindow.cpp b/win-linux/src/windows/cpresenterwindow.cpp index 0d2dc59dc..bfdbe66b5 100644 --- a/win-linux/src/windows/cpresenterwindow.cpp +++ b/win-linux/src/windows/cpresenterwindow.cpp @@ -85,6 +85,15 @@ bool CPresenterWindow::holdView(int id) const return ((QCefView *)m_pMainView)->GetCefView()->GetId() == id; } +void CPresenterWindow::showEvent(QShowEvent *ev) +{ + CWindowPlatform::showEvent(ev); + if (ev->type() == QShowEvent::Show) { + m_pMainView->resize(m_pMainPanel->size() - QSize(0, m_boxTitleBtns->height())); + static_cast(m_pMainView)->GetCefView()->resizeEvent(); + } +} + void CPresenterWindow::closeEvent(QCloseEvent *e) { onCloseEvent(); diff --git a/win-linux/src/windows/cpresenterwindow.h b/win-linux/src/windows/cpresenterwindow.h index b14a5a4a5..d9dc4c0d3 100644 --- a/win-linux/src/windows/cpresenterwindow.h +++ b/win-linux/src/windows/cpresenterwindow.h @@ -51,6 +51,7 @@ class CPresenterWindow : public CWindowPlatform virtual bool holdView(int id) const final; protected: + virtual void showEvent(QShowEvent*) override; void closeEvent(QCloseEvent *) final; virtual void onLayoutDirectionChanged() final; From 4141582aa5d1af4d6c048785b2bfcaf2c8df6574 Mon Sep 17 00:00:00 2001 From: Semyon Bezrukov Date: Fri, 1 Mar 2024 19:03:23 +0300 Subject: [PATCH 126/316] Refactoring msi package (#1178) --- win-linux/package/windows/DesktopEditors.aip | 1267 +++++++++--------- win-linux/package/windows/branding.ps1 | 19 + win-linux/package/windows/dictionary.ail | 353 +---- win-linux/package/windows/make_advinst.ps1 | 117 ++ win-linux/package/windows/utils.vbs | 4 +- 5 files changed, 857 insertions(+), 903 deletions(-) create mode 100644 win-linux/package/windows/branding.ps1 create mode 100644 win-linux/package/windows/make_advinst.ps1 diff --git a/win-linux/package/windows/DesktopEditors.aip b/win-linux/package/windows/DesktopEditors.aip index 90245f8d4..4818d44d0 100644 --- a/win-linux/package/windows/DesktopEditors.aip +++ b/win-linux/package/windows/DesktopEditors.aip @@ -7,47 +7,46 @@ - + - - - - - + + - - - - - - - + + + + + + - - - - - - + + + + + + + - - + - + - - - + + + + - + + + @@ -79,24 +78,30 @@ - - - + + + + + - - + + + + - + - + + + @@ -122,7 +127,7 @@ - + @@ -130,7 +135,7 @@ - + @@ -147,15 +152,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -163,7 +197,7 @@ - + @@ -184,7 +218,7 @@ - + @@ -192,7 +226,7 @@ - + @@ -209,52 +243,50 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -264,30 +296,30 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - + + @@ -297,8 +329,8 @@ - - + + @@ -316,7 +348,7 @@ - + @@ -394,11 +426,38 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -593,8 +652,8 @@ - - + + @@ -618,22 +677,22 @@ - + - + - - + + @@ -740,158 +799,158 @@ - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -944,7 +1003,9 @@ + + @@ -992,67 +1053,96 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1082,249 +1172,220 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1354,63 +1415,63 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - + - - - - + + + + diff --git a/win-linux/package/windows/branding.ps1 b/win-linux/package/windows/branding.ps1 new file mode 100644 index 000000000..fa4583bd9 --- /dev/null +++ b/win-linux/package/windows/branding.ps1 @@ -0,0 +1,19 @@ +$PackageName = "ONLYOFFICE Desktop Editors" +$BuildDir = "build" +$DesktopDir = "DesktopEditors" + +Function BrandingAdvInstConfig { + return ` + "DelFolder CUSTOM_PATH", ` + "SetProductCode -langid 1029 -guid $ProductCode", ` + "SetProductCode -langid 1031 -guid $ProductCode", ` + "SetProductCode -langid 1033 -guid $ProductCode", ` + "SetProductCode -langid 1036 -guid $ProductCode", ` + "SetProductCode -langid 1041 -guid $ProductCode", ` + "SetProductCode -langid 1046 -guid $ProductCode", ` + "SetProductCode -langid 1049 -guid $ProductCode", ` + "SetProductCode -langid 1060 -guid $ProductCode", ` + "SetProductCode -langid 2070 -guid $ProductCode", ` + "SetProductCode -langid 3082 -guid $ProductCode", ` + "SetProperty FORMS=1" +} diff --git a/win-linux/package/windows/dictionary.ail b/win-linux/package/windows/dictionary.ail index 54339c38b..f326d2967 100644 --- a/win-linux/package/windows/dictionary.ail +++ b/win-linux/package/windows/dictionary.ail @@ -15,9 +15,6 @@ - - - @@ -67,27 +64,6 @@ - - - - - - - - - - - - - - - - - - - - - @@ -109,28 +85,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -142,170 +96,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + @@ -318,94 +118,51 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win-linux/package/windows/make_advinst.ps1 b/win-linux/package/windows/make_advinst.ps1 new file mode 100644 index 000000000..d2c247e9d --- /dev/null +++ b/win-linux/package/windows/make_advinst.ps1 @@ -0,0 +1,117 @@ +param ( + [System.Version]$Version = "0.0.0.0", + [string]$Arch = "x64", + [switch]$Sign, + [string]$BrandingDir = "." +) + +$ErrorActionPreference = "Stop" + +Set-Location $PSScriptRoot + +if ( Test-Path "$BrandingDir\branding.ps1" ) { + Import-Module "$BrandingDir\branding.ps1" +} +$VersionShort = "$($Version.Major).$($Version.Minor).$($Version.Build)" +switch ( $Arch ) { + "x64" { $MsiBuild = 'MsiBuild64' } + "x86" { $MsiBuild = 'MsiBuild32' } +} +$MD5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider +$ASCII = New-Object -TypeName System.Text.ASCIIEncoding +[guid]$GUID = $MD5.ComputeHash($ASCII.GetBytes("$PackageName $VersionShort $Arch")) +$ProductCode = "{" + $GUID.ToString().ToUpper() + "}" + +Write-Host @" +PackageName = $PackageName +Version = $Version +Arch = $Arch +Sign = $Sign +BrandingDir = $BrandingDir +MsiBuild = $MsiBuild +ProductCode = $ProductCode +"@ + + + +Write-Host "`n[ Get Advanced Installer path ]" +if ( $ENV:ADVINSTPATH ) { + $AdvInstPath = $ENV:ADVINSTPATH +} +else +{ + $RegPath = "HKLM:\SOFTWARE\WOW6432Node\Caphyon\Advanced Installer" + $AdvInstPath = (Get-ItemProperty $RegPath)."InstallRoot" + "bin\x86" +} +$AdvInstPath +$ENV:Path = "$AdvInstPath;$ENV:Path" + + + +Write-Host "`n[ Create package.config ]" +Write-Output "package=msi" ` + | Out-File -Encoding ASCII "$BuildDir\$DesktopDir\converter\package.config" +Write-Host "$BuildDir\$DesktopDir\converter\package.config" + + + +Write-Host "`n[ Create Advanced Installer config ]" +$AdvInstConfig = @() +$AdvInstConfig += BrandingAdvInstConfig +if ( $Arch -eq "x86" ) { + $AdvInstConfig += ` + "SetComponentAttribute -feature_name MainFeature -unset -64bit_component", ` + "SetComponentAttribute -feature_name Files -unset -64bit_component", ` + "SetComponentAttribute -feature_name Registry -unset -64bit_component", ` + "SetComponentAttribute -feature_name UpdateService -unset -64bit_component", ` + "SetComponentAttribute -feature_name RegFileTypeAssociations -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__csv -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__djvu -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__doc -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__docx -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__docxf -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__dotx -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__epub -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__fb2 -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__html -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__odp -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__ods -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__odt -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__oform -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__otp -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__ots -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__ott -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__pdf -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__potx -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__pps -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__ppsx -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__ppt -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__pptx -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__rtf -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__txt -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__xls -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__xlsx -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__xltx -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__xml -unset -64bit_component", ` + "SetComponentAttribute -feature_name ft_fa_ext__xps -unset -64bit_component" +} +if ( ! $Sign ) { + $AdvInstConfig += "ResetSig" +} +$AdvInstConfig += ` + "SetProperty Version=$VersionShort", ` + "SetVersion $Version -noprodcode", ` + "SetCurrentFeature MainFeature", ` + "NewSync APPDIR $BuildDir\$DesktopDir -existingfiles keep -feature Files", ` + # "GenerateReport -buildname $MsiBuild -output_path .\report.pdf", ` + "Rebuild -buildslist $MsiBuild" +$AdvInstConfig = ";aic", $AdvInstConfig +$AdvInstConfig +Write-Output $AdvInstConfig | Out-File -Encoding UTF8 "DesktopEditors.aic" + + + +Write-Host "`n[ Build Advanced Installer project ]" +AdvancedInstaller.com /? | Select-Object -First 1 +Write-Host "AdvancedInstaller.com /execute DesktopEditors.aip DesktopEditors.aic" +AdvancedInstaller.com /execute DesktopEditors.aip DesktopEditors.aic diff --git a/win-linux/package/windows/utils.vbs b/win-linux/package/windows/utils.vbs index bb0f7cc84..a432e1a11 100644 --- a/win-linux/package/windows/utils.vbs +++ b/win-linux/package/windows/utils.vbs @@ -27,7 +27,7 @@ Function UninstallOlderVersion If (RegistryExist(regPath) = True) Then RegistryPath = objShell.RegRead(regPath) If Session.Property("UILevel") <> 2 Then - Button = MsgBox(Session.Property("UNINSTALL_PREV_MSGBOX"), 1, Session.Property("Setup") + " " + Session.Property("ProductName")) + Button = MsgBox(Session.Property("UninstallPrevDlg_MsgBox"), 1, Session.Property("Setup") + " " + Session.Property("ProductName")) End If If Button = 1 Then objShell.Run RegistryPath, 0, True @@ -48,7 +48,7 @@ Function SetLocaleProperty Dim regPath Dim locale - regPath = "HKEY_LOCAL_MACHINE\SOFTWARE\" + Session.Property("MANUFACTURER_INSTALL_FOLDER") + "\" + Session.Property("PRODUCT_INSTALL_FOLDER") + "\locale" + regPath = "HKEY_LOCAL_MACHINE\SOFTWARE\" + Session.Property("VendorShortName") + "\" + Session.Property("AppShortName") + "\locale" If (RegistryExist(regPath) = True) Then locale = objShell.RegRead(regPath) From 6ce227df38eb9706a13d04d29d4cbe8b63593ee3 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Tue, 5 Mar 2024 11:41:39 +0200 Subject: [PATCH 127/316] [win] updatesvc: creating subfolders when unpacking for some cases --- .../src/classes/platform_win/cunzip.cpp | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/win-linux/extras/update-daemon/src/classes/platform_win/cunzip.cpp b/win-linux/extras/update-daemon/src/classes/platform_win/cunzip.cpp index 9ba745eae..3faad7825 100644 --- a/win-linux/extras/update-daemon/src/classes/platform_win/cunzip.cpp +++ b/win-linux/extras/update-daemon/src/classes/platform_win/cunzip.cpp @@ -39,6 +39,24 @@ #define MAX_PATH_LEN 512 #define BLOCK_SIZE 8192 +static bool makePathA(char *path, size_t root_offset = 0) { + char *it = path + root_offset; + while (*it++ != '\0') { + while (*it != '\0' && *it != '/') + it++; + if (*it == '\0' && *(it - 1) == '/') + break; + char tmp = *it; + *it = '\0'; + if (CreateDirectoryA(path, NULL) == 0 && GetLastError() != ERROR_ALREADY_EXISTS) { + *it = tmp; + return false; + } + *it = tmp; + } + return true; +} + class CUnzip::CUnzipPrivate { public: @@ -83,7 +101,7 @@ class CUnzip::CUnzipPrivate char out_path[MAX_PATH_LEN]; snprintf(out_path, MAX_PATH_LEN, "%s/%s", utf8FolderPath.c_str(), entry_name); if (entry_name[strlen(entry_name) - 1] == '/') { - if (::CreateDirectoryA(out_path, NULL) == 0) + if (::CreateDirectoryA(out_path, NULL) == 0 && !makePathA(out_path, utf8FolderPath.size() + 1)) return UNZIP_ERROR; } else { From de86d42252c066084461485c75ebe13a812fd934 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Tue, 5 Mar 2024 11:44:33 +0200 Subject: [PATCH 128/316] [win-linux] updmanager: add support for minVersion parameter --- win-linux/src/cupdatemanager.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/win-linux/src/cupdatemanager.cpp b/win-linux/src/cupdatemanager.cpp index e26de5639..43ff2b17d 100644 --- a/win-linux/src/cupdatemanager.cpp +++ b/win-linux/src/cupdatemanager.cpp @@ -300,6 +300,7 @@ struct CUpdateManager::PackageData { version; wstring packageUrl, packageArgs; + bool isInstallable = true; void clear() { fileName.clear(); fileType.clear(); @@ -309,6 +310,7 @@ struct CUpdateManager::PackageData { version.clear(); packageUrl.clear(); packageArgs.clear(); + isInstallable = true; } }; @@ -864,7 +866,10 @@ void CUpdateManager::onLoadCheckFinished(const QString &filePath) const QString lang = CLangater::getCurrentLangCode() == "ru-RU" ? "ru-RU" : "en-EN"; QJsonValue changelog = release_notes.value(lang); - clearTempFiles(isSavedPackageValid() ? m_savedPackageData->fileName : ""); + QString min_version = root.value("minVersion").toString(); + if (!min_version.isEmpty() && isVersionBHigherThanA(curr_version, min_version)) + m_packageData->isInstallable = false; + clearTempFiles(m_packageData->isInstallable && isSavedPackageValid() ? m_savedPackageData->fileName : ""); if (m_packageData->packageUrl.empty() || !m_socket->sendMessage(MSG_RequestContentLenght, WStrToTStr(m_packageData->packageUrl))) { m_packageData->fileSize = "--"; onCheckFinished(false, true, m_packageData->version, ""); @@ -900,6 +905,11 @@ void CUpdateManager::onCheckFinished(bool error, bool updateExist, const QString __UNLOCK loadUpdates(); return; + } else + if (!m_packageData->isInstallable) { + refreshStartPage({"lastcheck", {TXT_AVAILABLE_UPD, version}, BTN_TXT_CHECK, "check", "false"}); + m_dialogSchedule->addToSchedule("showUpdateMessage"); + return; } switch (getUpdateMode()) { case UpdateMode::SILENT: @@ -933,15 +943,21 @@ void CUpdateManager::showUpdateMessage(QWidget *parent) { QString name = (m_packageData->object == "app") ? QString(WINDOW_NAME) : QString(SERVICE_NAME); QString curr_version = (m_packageData->object == "app") ? QString(VER_FILEVERSION_STR) : getFileVersion(QStrToTStr(qApp->applicationDirPath()) + DAEMON_NAME); + QString text = m_packageData->isInstallable ? tr("Would you like to download update now?") : + tr("The current version does not support installing this update directly. " + "To install updates, you can download the required package from the official website."); int result = WinDlg::showDialog(parent, tr("Update is available"), QString("%1\n%2: %3\n%4: %5\n%6 (%7 MB)").arg(name, tr("Current version"), curr_version, tr("New version"), getVersion(), - tr("Would you like to download update now?"), m_packageData->fileSize), + text, m_packageData->fileSize), WinDlg::DlgBtns::mbSkipRemindDownload); __UNLOCK switch (result) { case WinDlg::DLG_RESULT_DOWNLOAD: - loadUpdates(); + if (m_packageData->isInstallable) + loadUpdates(); + else + Utils::openUrl(DOWNLOAD_PAGE); break; case WinDlg::DLG_RESULT_SKIP: { skipVersion(); From 78e0b26229258d1003281d0a012f4f83b0e38c97 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Fri, 2 Feb 2024 16:36:09 +0300 Subject: [PATCH 129/316] [win-nix] handle opening error page in editors --- common/loginpage/noconnect/init.js | 5 +++++ win-linux/src/ccefeventsgate.cpp | 3 +++ win-linux/src/ccefeventsgate.h | 2 ++ win-linux/src/ccefeventstransformer.cpp | 3 +++ win-linux/src/windows/cmainwindow.cpp | 10 ++++++++++ win-linux/src/windows/cmainwindow.h | 1 + 6 files changed, 24 insertions(+) diff --git a/common/loginpage/noconnect/init.js b/common/loginpage/noconnect/init.js index 742c4b2a4..051ad07df 100644 --- a/common/loginpage/noconnect/init.js +++ b/common/loginpage/noconnect/init.js @@ -12,6 +12,11 @@ return urlParams; } +const sdk = window.AscDesktopEditor; +if ( sdk ) { + sdk.execCommand('error:page', 'open'); +} + const nativevars = window.RendererProcessVariable; let lang, theme, page; diff --git a/win-linux/src/ccefeventsgate.cpp b/win-linux/src/ccefeventsgate.cpp index 313047ee8..d4a9a4961 100644 --- a/win-linux/src/ccefeventsgate.cpp +++ b/win-linux/src/ccefeventsgate.cpp @@ -96,3 +96,6 @@ void CCefEventsGate::onReporterMode(int, bool m) { panel()->setReporterMode(m); } + +void CCefEventsGate::onErrorPage(int, const std::wstring&) +{} diff --git a/win-linux/src/ccefeventsgate.h b/win-linux/src/ccefeventsgate.h index a83ddabc2..e6dd07264 100644 --- a/win-linux/src/ccefeventsgate.h +++ b/win-linux/src/ccefeventsgate.h @@ -78,6 +78,8 @@ public slots: virtual void onWebTitleChanged(int, std::wstring json) = 0; virtual void onWebAppsFeatures(int, std::wstring) = 0; virtual void onReporterMode(int, bool); + + virtual void onErrorPage(int id, const std::wstring& action); }; #endif // CCEFEVENTSGATE_H diff --git a/win-linux/src/ccefeventstransformer.cpp b/win-linux/src/ccefeventstransformer.cpp index 0855805e7..cf5bd88ec 100644 --- a/win-linux/src/ccefeventstransformer.cpp +++ b/win-linux/src/ccefeventstransformer.cpp @@ -245,6 +245,9 @@ void CCefEventsTransformer::OnEvent(QObject * target, NSEditorApi::CAscCefMenuEv if ( cmd.compare(L"encrypt:isneedbuild") == 0 ) { bool isFragmented = pData->get_Param() == L"true" ? true : false; QMetaObject::invokeMethod(target, "onDocumentFragmented", Qt::QueuedConnection, Q_ARG(int, event->get_SenderId()), Q_ARG(bool, isFragmented)); + } else + if ( cmd.compare(L"error:page") == 0 ) { + QMetaObject::invokeMethod(target, "onErrorPage", Qt::QueuedConnection, Q_ARG(int, event->get_SenderId()), Q_ARG(std::wstring, pData->get_Param())); } else { // std::wregex _re_appcmd(L"^app\\:(\\w+)", std::tr1::wregex::icase); // auto _iter_cmd = std::wsregex_iterator(cmd.begin(), cmd.end(), _re_appcmd); diff --git a/win-linux/src/windows/cmainwindow.cpp b/win-linux/src/windows/cmainwindow.cpp index 8d6ac8dfc..014e7b9a4 100644 --- a/win-linux/src/windows/cmainwindow.cpp +++ b/win-linux/src/windows/cmainwindow.cpp @@ -1424,6 +1424,16 @@ void CMainWindow::onReporterMode(int id, bool status) } } +void CMainWindow::onErrorPage(int id, const std::wstring& action) +{ + CCefView * view = AscAppManager::getInstance().GetViewById(id); + if ( view && cvwtEditor == view->GetType() ) { + if ( action.compare(L"open") ) { + + } + } +} + void CMainWindow::updateScalingFactor(double dpiratio) { CScalingWrapper::updateScalingFactor(dpiratio); diff --git a/win-linux/src/windows/cmainwindow.h b/win-linux/src/windows/cmainwindow.h index fcc8283b0..de9ba81aa 100644 --- a/win-linux/src/windows/cmainwindow.h +++ b/win-linux/src/windows/cmainwindow.h @@ -147,6 +147,7 @@ public slots: void onWebTitleChanged(int, std::wstring json) {} void onDocumentPrint(void *); void onReporterMode(int, bool); + void onErrorPage(int, const std::wstring&); virtual void onDocumentReady(int); private: From 046c97c9af678a4785bd489912865fc41257e384 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Tue, 5 Mar 2024 11:58:19 +0200 Subject: [PATCH 130/316] [win-linux] handle opening error page in editors --- win-linux/src/casctabdata.cpp | 10 ++++ win-linux/src/casctabdata.h | 3 + win-linux/src/windows/ceditorwindow.cpp | 8 ++- win-linux/src/windows/ceditorwindow_p.h | 77 +++++++++++++++++-------- win-linux/src/windows/cmainwindow.cpp | 7 +-- 5 files changed, 75 insertions(+), 30 deletions(-) diff --git a/win-linux/src/casctabdata.cpp b/win-linux/src/casctabdata.cpp index 2f33bc82c..b6401c39b 100644 --- a/win-linux/src/casctabdata.cpp +++ b/win-linux/src/casctabdata.cpp @@ -162,6 +162,11 @@ bool CAscTabData::eventLoadSupported() const return _event_load_supported; } +void CAscTabData::setHasError() +{ + _has_error = true; +} + void CAscTabData::setEventLoadSupported(bool value) { _event_load_supported = value; @@ -209,3 +214,8 @@ bool CAscTabData::hasFrame() const { return _has_frame; } + +bool CAscTabData::hasError() const +{ + return _has_error; +} diff --git a/win-linux/src/casctabdata.h b/win-linux/src/casctabdata.h index 62afcef89..8b48d130f 100644 --- a/win-linux/src/casctabdata.h +++ b/win-linux/src/casctabdata.h @@ -62,11 +62,13 @@ struct CAscTabData std::wstring url() const; bool isViewType(CefType) const; bool eventLoadSupported() const; + void setHasError(); void setEventLoadSupported(bool); void setFeatures(const std::wstring&); std::wstring features() const; bool hasFeature(const std::wstring&) const; bool hasFrame() const; + bool hasError() const; AscEditorType contentType() const; void setContentType(AscEditorType); @@ -78,6 +80,7 @@ struct CAscTabData bool _is_closed = false; bool _is_local; bool _has_frame = false; + bool _has_error = false; CefType _vtype; std::wstring _url; bool _event_load_supported = false; diff --git a/win-linux/src/windows/ceditorwindow.cpp b/win-linux/src/windows/ceditorwindow.cpp index b12dfb396..6339bc799 100644 --- a/win-linux/src/windows/ceditorwindow.cpp +++ b/win-linux/src/windows/ceditorwindow.cpp @@ -203,9 +203,11 @@ QWidget * CEditorWindow::createMainPanel(QWidget * parent, const QString& title) if (d_ptr->usedOldEditorVersion) // For old editors only static_cast(m_boxTitleBtns->layout())->insertStretch(0); - if ( !d_ptr->canExtendTitle() ) { + if ( !d_ptr->canExtendTitle() || d_ptr->panel()->data()->hasError()) { mainGridLayout->addWidget(m_boxTitleBtns, 0, 0); m_labelTitle->setText(APP_TITLE); + if (d_ptr->panel()->data()->hasError()) + mainPanel->setProperty("window", "pretty"); } else { if (d_ptr->panel()->data()->contentType() != AscEditorType::etUndefined) mainPanel->setProperty("window", "pretty"); @@ -251,7 +253,7 @@ QWidget * CEditorWindow::createMainPanel(QWidget * parent, const QString& title) mainGridLayout->addWidget(m_pMainView, 1, 0, 1, 2); mainGridLayout->setRowStretch(1,1); - if (d_ptr->canExtendTitle()) { + if (d_ptr->canExtendTitle() && !d_ptr->panel()->data()->hasError()) { if (d_ptr->usedOldEditorVersion) // For old editors only mainGridLayout->addWidget(m_boxTitleBtns, 1, 0, Qt::AlignTop); else { @@ -277,7 +279,7 @@ void CEditorWindow::recalculatePlaces() d_ptr->panel()->view()->SetCaptionMaskSize(int(TITLE_HEIGHT * m_dpiRatio)); } - if ( d_ptr->canExtendTitle() ) { + if ( d_ptr->canExtendTitle() && !d_ptr->panel()->data()->hasError() ) { m_pMainView->lower(); } } diff --git a/win-linux/src/windows/ceditorwindow_p.h b/win-linux/src/windows/ceditorwindow_p.h index fc0c4b55e..0d16ef809 100644 --- a/win-linux/src/windows/ceditorwindow_p.h +++ b/win-linux/src/windows/ceditorwindow_p.h @@ -109,28 +109,32 @@ class CEditorWindowPrivate : public CCefEventsGate leftboxbuttons->deleteLater(); } + void createHomeButton() { + leftboxbuttons = new QWidget; + leftboxbuttons->setLayout(new QHBoxLayout); + leftboxbuttons->layout()->setSpacing(0); + leftboxbuttons->layout()->setMargin(0); + + CSVGPushButton * btnHome = new CSVGPushButton; + btnHome->setProperty("class", "normal"); + btnHome->setProperty("act", "tool"); + btnHome->setFixedSize(QSize(TOOLBTN_WIDTH,TOOLBTN_HEIGHT) * window->m_dpiRatio); + btnHome->setIconSize(QSize(20,20) * window->m_dpiRatio); + btnHome->setMouseTracking(true); + btnHome->setIcon(":/title/icons/buttons.svg", "svg-btn-home"); + //btnHome->setToolTip(CEditorWindow::tr("Open main window")); + btnHome->setProperty("ToolTip", CEditorWindow::tr("Open main window")); + btnHome->setIconOpacity(GetColorByRole(ecrButtonNormalOpacity)); + m_mapTitleButtons["home"] = btnHome; + connect(btnHome, &QPushButton::clicked, std::bind(&CEditorWindow::onClickButtonHome, window)); + leftboxbuttons->layout()->addWidget(btnHome); + } + void init(CTabPanel * const p) override { CCefEventsGate::init(p); - if (!m_panel->data()->hasFeature(L"btnhome") || viewerMode() || fillformMode()) { // For old editors only + if (!m_panel->data()->hasFeature(L"btnhome") || viewerMode() || fillformMode() || m_panel->data()->hasError()) { usedOldEditorVersion = true; - leftboxbuttons = new QWidget; - leftboxbuttons->setLayout(new QHBoxLayout); - leftboxbuttons->layout()->setSpacing(0); - leftboxbuttons->layout()->setMargin(0); - - CSVGPushButton * btnHome = new CSVGPushButton; - btnHome->setProperty("class", "normal"); - btnHome->setProperty("act", "tool"); - btnHome->setFixedSize(QSize(TOOLBTN_WIDTH,TOOLBTN_HEIGHT) * window->m_dpiRatio); - btnHome->setIconSize(QSize(20,20) * window->m_dpiRatio); - btnHome->setMouseTracking(true); - btnHome->setIcon(":/title/icons/buttons.svg", "svg-btn-home"); - //btnHome->setToolTip(CEditorWindow::tr("Open main window")); - btnHome->setProperty("ToolTip", CEditorWindow::tr("Open main window")); - btnHome->setIconOpacity(GetColorByRole(ecrButtonNormalOpacity)); - m_mapTitleButtons["home"] = btnHome; - connect(btnHome, &QPushButton::clicked, std::bind(&CEditorWindow::onClickButtonHome, window)); - leftboxbuttons->layout()->addWidget(btnHome); + createHomeButton(); } } @@ -168,14 +172,15 @@ class CEditorWindowPrivate : public CCefEventsGate return btn; } - auto extendableTitleToSimple() -> void { + auto extendableTitleToSimple(bool set_title = true) -> void { Q_ASSERT(window->m_boxTitleBtns != nullptr); QGridLayout * const _layout = static_cast(window->m_pMainPanel->layout()); if ( !_layout->itemAtPosition(0,0) && !_layout->findChild(window->m_boxTitleBtns->objectName()) ) { _layout->addWidget(window->m_boxTitleBtns,0,0,Qt::AlignTop); if (iconuser) iconuser->hide(); - window->m_labelTitle->setText(APP_TITLE); + if (set_title) + window->m_labelTitle->setText(APP_TITLE); changeTheme(GetCurrentTheme().id()); } } @@ -195,7 +200,7 @@ class CEditorWindowPrivate : public CCefEventsGate auto centerTitle(double dpiRatio)->void { - int left_btns = (viewerMode() || fillformMode()) ? 1 : 6; + int left_btns = (viewerMode() || fillformMode() || m_panel->data()->hasError()) ? 1 : 6; int right_btns = 3; int spacing = window->m_boxTitleBtns->layout()->spacing(); int left_offset = left_btns*TOOLBTN_WIDTH + 3*spacing; // added extra spacing @@ -203,7 +208,7 @@ class CEditorWindowPrivate : public CCefEventsGate int diffW = (left_offset - right_offset)*dpiRatio; if (iconuser) { diffW -= ICON_SPACER_WIDTH + spacing*dpiRatio; - if (!viewerMode() && !fillformMode()) { + if (!viewerMode() && !fillformMode() && !m_panel->data()->hasError()) { diffW -= iconuser->width() + spacing*dpiRatio; } } @@ -611,6 +616,32 @@ class CEditorWindowPrivate : public CCefEventsGate isPrinting = false; } + void onErrorPage(int id, const std::wstring& action) override + { + if (m_panel->data()->viewType() == cvwtEditor && action.compare(L"open") == 0) { + m_panel->data()->setHasError(); + if (window->isCustomWindowStyle() && canExtendTitle()) { + extendableTitleToSimple(false); + if (!leftboxbuttons) + createHomeButton(); + else { + for (auto it = m_mapTitleButtons.begin(); it != m_mapTitleButtons.end();) { + if (it.key() != "home") { + delete it.value(); + it = m_mapTitleButtons.erase(it); + continue; + } + ++it; + } + } + QHBoxLayout *lut = qobject_cast(window->m_boxTitleBtns->layout()); + if (lut->itemAt(0)->widget() != leftboxbuttons) + lut->insertWidget(0, leftboxbuttons); + leftboxbuttons->show(); + centerTitle(window->m_dpiRatio); + } + } + } void onEditorAllowedClose(int) override { diff --git a/win-linux/src/windows/cmainwindow.cpp b/win-linux/src/windows/cmainwindow.cpp index 014e7b9a4..fafc9e660 100644 --- a/win-linux/src/windows/cmainwindow.cpp +++ b/win-linux/src/windows/cmainwindow.cpp @@ -1427,10 +1427,9 @@ void CMainWindow::onReporterMode(int id, bool status) void CMainWindow::onErrorPage(int id, const std::wstring& action) { CCefView * view = AscAppManager::getInstance().GetViewById(id); - if ( view && cvwtEditor == view->GetType() ) { - if ( action.compare(L"open") ) { - - } + if ( view && cvwtEditor == view->GetType() && action.compare(L"open") == 0 ) { + int ind = m_pTabs->tabIndexByView(id); + m_pTabs->panel(ind)->data()->setHasError(); } } From 1a4281bd9efeac5006a86abd5b349cd98e2a449c Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Tue, 5 Mar 2024 15:12:37 +0300 Subject: [PATCH 131/316] [start page] fix security issues in dependencies --- common/loginpage/build/package-lock.json | 2647 ++++++++++------- common/loginpage/build/package.json | 4 +- .../build/plugins/grunt-inline/package.json | 2 +- 3 files changed, 1499 insertions(+), 1154 deletions(-) diff --git a/common/loginpage/build/package-lock.json b/common/loginpage/build/package-lock.json index d6e329df6..d8a015678 100644 --- a/common/loginpage/build/package-lock.json +++ b/common/loginpage/build/package-lock.json @@ -17,30 +17,31 @@ "grunt-inline": "file:plugins/grunt-inline", "grunt-terser": "^2.0.0", "grunt-text-replace": "0.4.0", + "iconsprite": "file:sprites", "lodash": "^4.17.20", - "terser": "^5.17.3" + "terser": "^5.28.1" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -88,6 +89,15 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/@babel/code-frame/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -110,31 +120,31 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", - "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.20", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -148,27 +158,10 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/@babel/core/node_modules/semver": { @@ -181,12 +174,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -196,14 +189,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -230,13 +223,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" @@ -267,9 +260,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", - "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -310,9 +303,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -328,32 +321,32 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -405,6 +398,15 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -427,9 +429,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -439,75 +441,70 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", - "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.19", - "debug": "^4.1.0", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { - "ms": "2.1.2" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } }, - "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", - "dev": true, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" } }, "node_modules/@istanbuljs/load-nyc-config": { @@ -536,30 +533,30 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } @@ -579,23 +576,246 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@resvg/resvg-js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.0.tgz", + "integrity": "sha512-Tf3YpbBKcQn991KKcw/vg7vZf98v01seSv6CVxZBbRkL/xyjnoYB6KgrFL6zskT1A4dWC/vg77KyNOW+ePaNlA==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@resvg/resvg-js-android-arm-eabi": "2.6.0", + "@resvg/resvg-js-android-arm64": "2.6.0", + "@resvg/resvg-js-darwin-arm64": "2.6.0", + "@resvg/resvg-js-darwin-x64": "2.6.0", + "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.0", + "@resvg/resvg-js-linux-arm64-gnu": "2.6.0", + "@resvg/resvg-js-linux-arm64-musl": "2.6.0", + "@resvg/resvg-js-linux-x64-gnu": "2.6.0", + "@resvg/resvg-js-linux-x64-musl": "2.6.0", + "@resvg/resvg-js-win32-arm64-msvc": "2.6.0", + "@resvg/resvg-js-win32-ia32-msvc": "2.6.0", + "@resvg/resvg-js-win32-x64-msvc": "2.6.0" + } + }, + "node_modules/@resvg/resvg-js-android-arm-eabi": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.0.tgz", + "integrity": "sha512-lJnZ/2P5aMocrFMW7HWhVne5gH82I8xH6zsfH75MYr4+/JOaVcGCTEQ06XFohGMdYRP3v05SSPLPvTM/RHjxfA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.0.tgz", + "integrity": "sha512-N527f529bjMwYWShZYfBD60dXA4Fux+D695QsHQ93BDYZSHUoOh1CUGUyICevnTxs7VgEl98XpArmUWBZQVMfQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-MabUKLVayEwlPo0mIqAmMt+qESN8LltCvv5+GLgVga1avpUrkxj/fkU1TKm8kQegutUjbP/B0QuMuUr0uhF8ew==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.0.tgz", + "integrity": "sha512-zrFetdnSw/suXjmyxSjfDV7i61hahv6DDG6kM7BYN2yJ3Es5+BZtqYZTcIWogPJedYKmzN1YTMWGd/3f0ubFiA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm-gnueabihf": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.0.tgz", + "integrity": "sha512-sH4gxXt7v7dGwjGyzLwn7SFGvwZG6DQqLaZ11MmzbCwd9Zosy1TnmrMJfn6TJ7RHezmQMgBPi18bl55FZ1AT4A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm64-gnu": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.0.tgz", + "integrity": "sha512-fCyMncqCJtrlANADIduYF4IfnWQ295UKib7DAxFXQhBsM9PLDTpizr0qemZcCNadcwSVHnAIzL4tliZhCM8P6A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-ouLjTgBQHQyxLht4FdMPTvuY8xzJigM9EM2Tlu0llWkN1mKyTQrvYWi6TA6XnKdzDJHy7ZLpWpjZi7F5+Pg+Vg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-x64-gnu": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.0.tgz", + "integrity": "sha512-n3zC8DWsvxC1AwxpKFclIPapDFibs5XdIRoV/mcIlxlh0vseW1F49b97F33BtJQRmlntsqqN6GMMqx8byB7B+Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-n4tasK1HOlAxdTEROgYA1aCfsEKk0UOFDNd/AQTTZlTmCbHKXPq+O8npaaKlwXquxlVK8vrkcWbksbiGqbCAcw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-arm64-msvc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.0.tgz", + "integrity": "sha512-X2+EoBJFwDI5LDVb51Sk7ldnVLitMGr9WwU/i21i3fAeAXZb3hM16k67DeTy16OYkT2dk/RfU1tP1wG+rWbz2Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-ia32-msvc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.0.tgz", + "integrity": "sha512-L7oevWjQoUgK5W1fCKn0euSVemhDXVhrjtwqpc7MwBKKimYeiOshO1Li1pa8bBt5PESahenhWgdB6lav9O0fEg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-x64-msvc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.0.tgz", + "integrity": "sha512-8lJlghb+Unki5AyKgsnFbRJwkEj9r1NpwyuBG8yEJiG1W9eEGl03R3I7bsVa3haof/3J1NlWf0rzSa1G++A2iw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "bin": { "acorn": "bin/acorn" }, @@ -616,28 +836,12 @@ "node": ">=8" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/ansi-styles": { @@ -709,28 +913,10 @@ "node": ">=0.10.0" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/async-hook-domain": { "version": "2.0.4", @@ -741,41 +927,11 @@ "node": ">=10" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -794,6 +950,11 @@ "node": ">=10" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -815,9 +976,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -834,9 +995,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -909,9 +1070,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001538", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", - "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "version": "1.0.30001594", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz", + "integrity": "sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==", "dev": true, "funding": [ { @@ -928,12 +1089,6 @@ } ] }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -950,16 +1105,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -972,6 +1121,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -1015,25 +1167,44 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "engines": { - "node": ">=8" + "node": ">=0.8" } }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", "engines": { - "node": ">=8" + "node": ">= 0.10" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==" + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "node_modules/color-convert": { @@ -1052,6 +1223,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -1061,6 +1241,19 @@ "color-support": "bin.js" } }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, "node_modules/colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", @@ -1069,16 +1262,13 @@ "node": ">=0.1.90" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "color": "^3.1.3", + "text-hex": "1.0.x" } }, "node_modules/commander": { @@ -1115,29 +1305,9 @@ } }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/coveralls": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", - "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", - "dev": true, - "dependencies": { - "js-yaml": "^3.13.1", - "lcov-parse": "^1.0.0", - "log-driver": "^1.2.7", - "minimist": "^1.2.5", - "request": "^2.88.2" - }, - "bin": { - "coveralls": "bin/coveralls.js" - }, - "engines": { - "node": ">=6" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -1153,18 +1323,73 @@ "node": ">= 8" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dependencies": { - "assert-plus": "^1.0.0" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", + "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==" + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { - "node": ">=0.10" + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" } }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, "node_modules/datauri": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/datauri/-/datauri-4.1.0.tgz", @@ -1177,20 +1402,6 @@ "node": ">= 10" } }, - "node_modules/datauri/node_modules/image-size": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", - "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/dateformat": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", @@ -1200,12 +1411,20 @@ } }, "node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "optional": true, + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { - "ms": "^2.1.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/decamelize": { @@ -1232,15 +1451,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -1258,14 +1468,55 @@ "node": ">=0.3.1" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/ejs": { @@ -1284,16 +1535,28 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.527", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.527.tgz", - "integrity": "sha512-EafxEiEDzk2aLrdbtVczylHflHdHkNrpGNHIgDyA63sUQLQVS2ayj2hPw3RsVB42qkwURH+T2OxV7kGPUuYszA==", + "version": "1.4.692", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.692.tgz", + "integrity": "sha512-d5rZRka9n2Y3MkWRN74IoAsxR0HK3yaAt7T50e3iT9VZmCCQDT3geXUO5ZRMhDToa1pkCeQXuNo+0g+NfDOVPA==", "dev": true }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/errno": { "version": "0.1.8", @@ -1314,20 +1577,20 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=8" } }, "node_modules/esprima": { @@ -1377,26 +1640,32 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } }, "node_modules/file-sync-cmp": { "version": "0.1.1", @@ -1541,6 +1810,11 @@ "node": ">= 0.10" } }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1573,29 +1847,6 @@ "node": ">=8.0.0" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/fromentries": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", @@ -1642,9 +1893,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function-loop": { "version": "2.0.1", @@ -1665,7 +1919,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -1687,15 +1940,6 @@ "node": ">=10" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -1879,6 +2123,14 @@ "node": ">=0.10.0" } }, + "node_modules/grunt-contrib-copy/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/grunt-contrib-copy/node_modules/ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -1902,6 +2154,25 @@ "node": ">=0.10.0" } }, + "node_modules/grunt-contrib-copy/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-copy/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/grunt-contrib-copy/node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -1960,6 +2231,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "node_modules/grunt-contrib-htmlmin/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/grunt-contrib-htmlmin/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -1994,15 +2273,15 @@ } }, "node_modules/grunt-contrib-nodeunit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-nodeunit/-/grunt-contrib-nodeunit-4.0.0.tgz", - "integrity": "sha512-pLLDrTKfitBn2b1U9ecX+nkECcQ12tsiW58Y0SaZcsQgjljthPs78N5D24Y3b34dD8QKBAEW1J0VgO7cW0QcVQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-nodeunit/-/grunt-contrib-nodeunit-5.0.0.tgz", + "integrity": "sha512-6PeUhAAOAgao+s5fqRirb8uArqT9Xdamr3+dVSp9HHgAWmnT0w9oNILlyh8bQ/j36/B3oYRBL0O3CuW+PdH+vA==", "dev": true, "dependencies": { - "nodeunit-x": "^0.15.0" + "nodeunit-x": "^0.16.0" }, "engines": { - "node": ">=0.12.0" + "node": ">=14.0" } }, "node_modules/grunt-inline": { @@ -2060,8 +2339,25 @@ "node": ">=10" } }, - "node_modules/grunt-terser": { - "version": "2.0.0", + "node_modules/grunt-svg-sprite": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/grunt-svg-sprite/-/grunt-svg-sprite-2.0.2.tgz", + "integrity": "sha512-BByPBYNPzDASSO5mAD8aHnVXabyalC2lpxB9KKgkbWaTMoJ2nhjcCHJ8NSP9rGHoZhENvqazmu6Wxq3b8/9nZQ==", + "dependencies": { + "figures": "^3.2.0", + "picocolors": "^1.0.0", + "prettysize": "^2.0.0", + "svg-sprite": "^2.0.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "grunt": ">=1.0.1" + } + }, + "node_modules/grunt-terser": { + "version": "2.0.0", "resolved": "https://registry.npmjs.org/grunt-terser/-/grunt-terser-2.0.0.tgz", "integrity": "sha512-9Rw1TiPsqadCJnEaKz+mZiS4k9ydnkNfrfvEq9SS6MqMXUxBC+sndDCHV05s5/PXQsFjFBhoRVFij5FaV36tYA==", "dependencies": { @@ -2083,40 +2379,6 @@ "node": ">= 0.8.0" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -2128,6 +2390,14 @@ "node": ">=0.10.0" } }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2152,6 +2422,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2205,20 +2486,9 @@ "node": ">=6" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } + "node_modules/iconsprite": { + "resolved": "sprites", + "link": true }, "node_modules/iconv-lite": { "version": "0.6.3", @@ -2232,15 +2502,17 @@ } }, "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "optional": true, + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", + "integrity": "sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==", + "dependencies": { + "queue": "6.0.2" + }, "bin": { "image-size": "bin/image-size.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=12.0.0" } }, "node_modules/imurmurhash": { @@ -2297,6 +2569,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2310,11 +2587,11 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2332,7 +2609,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -2382,7 +2658,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -2420,6 +2695,11 @@ "node": ">=0.10.0" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2433,16 +2713,10 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -2558,9 +2832,9 @@ } }, "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2586,29 +2860,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2619,9 +2870,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -2691,12 +2942,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -2709,24 +2954,6 @@ "node": ">=4" } }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2739,21 +2966,6 @@ "node": ">=6" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -2762,14 +2974,10 @@ "node": ">=0.10.0" } }, - "node_modules/lcov-parse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", - "integrity": "sha512-aprLII/vPzuQvYZnDRU78Fns9I2Ag3gi4Ipga/hxnVMCZC8DnR2nI7XBqrPoywGfxqIx/DgarGvDJZAD3YBTgQ==", - "dev": true, - "bin": { - "lcov-parse": "bin/cli.js" - } + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, "node_modules/less": { "version": "4.2.0", @@ -2796,6 +3004,18 @@ "source-map": "~0.6.0" } }, + "node_modules/less/node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/less/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2881,19 +3101,36 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==" + }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, - "node_modules/log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", - "dev": true, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, "engines": { - "node": ">=0.8.6" + "node": ">= 12.0.0" } }, "node_modules/lower-case": { @@ -2948,6 +3185,11 @@ "node": ">=0.10.0" } }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -2972,27 +3214,6 @@ "node": ">=4" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimer": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/mimer/-/mimer-2.0.2.tgz", @@ -3015,15 +3236,6 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", @@ -3049,18 +3261,24 @@ } }, "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "optional": true + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } }, "node_modules/needle": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", - "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "optional": true, "dependencies": { - "debug": "^3.2.6", "iconv-lite": "^0.6.3", "sax": "^1.2.4" }, @@ -3092,19 +3310,19 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/nodeunit-x": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/nodeunit-x/-/nodeunit-x-0.15.0.tgz", - "integrity": "sha512-g3XCZ3Gh1Fxr9NPPo0PtmEooZ2jSJF+tP0DPtqCZmFA22uQ0N2clAew6+GIAIMnjH4eX9BS0ixxpb45IAYHnVA==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/nodeunit-x/-/nodeunit-x-0.16.0.tgz", + "integrity": "sha512-9HLrnteQBYDOrx2RP2KlRRcIkxkTogQ/3e75Qk1yUVZjNzAUAVZ/n+Fcv4UgWsxJ5mqMFwMWQo4biZP79o00HQ==", "dev": true, "dependencies": { - "ejs": "^3.1.6", - "tap": "^15.0.10" + "ejs": "^3.1.8", + "tap": "^16.3.4" }, "bin": { "nodeunit": "bin/nodeunit" @@ -3130,6 +3348,17 @@ "node": ">=0.10.0" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/nyc": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", @@ -3210,15 +3439,6 @@ "semver": "bin/semver.js" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -3264,6 +3484,14 @@ "wrappy": "1" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -3463,17 +3691,10 @@ "node": ">=0.10.0" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -3518,6 +3739,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/prettysize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prettysize/-/prettysize-2.0.0.tgz", + "integrity": "sha512-VVtxR7sOh0VsG8o06Ttq5TrI1aiZKmC+ClSn4eBPaNf4SHr5lzbYW+kYGX3HocBL/MfpVrRfFZ9V3vCbLaiplg==" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", @@ -3536,30 +3767,15 @@ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "optional": true }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" } }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", @@ -3568,6 +3784,20 @@ "inherits": "~2.0.3" } }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3611,53 +3841,23 @@ "node": ">=4" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "engines": { + "node": ">= 0.10" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3669,9 +3869,9 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -3717,24 +3917,17 @@ } }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -3742,9 +3935,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", "optional": true }, "node_modules/semver": { @@ -3789,6 +3982,14 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -3875,29 +4076,18 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "engines": { - "node": ">=0.10.0" + "node": "*" } }, "node_modules/stack-utils": { @@ -3912,20 +4102,18 @@ "node": ">=10" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -3935,20 +4123,10 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3956,17 +4134,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -3998,10 +4165,160 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-sprite": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/svg-sprite/-/svg-sprite-2.0.3.tgz", + "integrity": "sha512-y39yDRCm4A7hVGiJOSCTTu0S04lvCZAUNVQ5wG9URWqlLPWHqDQUp610GUUnszxXH5IJsHv5R+/S2HoYrwMYQw==", + "dependencies": { + "@resvg/resvg-js": "^2.6.0", + "@xmldom/xmldom": "^0.8.10", + "async": "^3.2.5", + "css-selector-parser": "^1.4.1", + "csso": "^4.2.0", + "cssom": "^0.5.0", + "glob": "^7.2.3", + "js-yaml": "^4.1.0", + "lodash.escape": "^4.0.1", + "lodash.merge": "^4.6.2", + "mustache": "^4.2.0", + "prettysize": "^2.0.0", + "svgo": "^2.8.0", + "vinyl": "^2.2.1", + "winston": "^3.11.0", + "xpath": "^0.0.34", + "yargs": "^17.7.2" + }, + "bin": { + "svg-sprite": "bin/svg-sprite.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/svg-sprite/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/svg-sprite/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/svg-sprite/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/svg-sprite/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/svg-sprite/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/svg-sprite/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/svg-sprite/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/svg-sprite/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, "node_modules/tap": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/tap/-/tap-15.2.3.tgz", - "integrity": "sha512-EVbovHd/SdevGMUnkNU5JJqC1YC0hzaaZ2jnqs0fKHv9Oudx27qW3Xwox7A6TB92wvR0mqgQPr+Au2w56kD+aQ==", + "version": "16.3.10", + "resolved": "https://registry.npmjs.org/tap/-/tap-16.3.10.tgz", + "integrity": "sha512-q5Am+PpGHS6JSjk/Zn4bCRBihmZVM15v/MYXUy60wenw5HDe7pVrevLCEoMEz7tuw6jaPOJJqni1y8apN23IGw==", "bundleDependencies": [ "ink", "treport", @@ -4011,49 +4328,52 @@ ], "dev": true, "dependencies": { - "@isaacs/import-jsx": "*", - "@types/react": "*", + "@isaacs/import-jsx": "^4.0.1", + "@types/react": "^17.0.52", "chokidar": "^3.3.0", - "coveralls": "^3.0.11", "findit": "^2.0.0", "foreground-child": "^2.0.0", "fs-exists-cached": "^1.0.0", - "glob": "^7.1.6", - "ink": "*", + "glob": "^7.2.3", + "ink": "^3.2.0", "isexe": "^2.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "jackspeak": "^1.4.1", - "libtap": "^1.3.0", - "minipass": "^3.1.1", + "istanbul-lib-processinfo": "^2.0.3", + "jackspeak": "^1.4.2", + "libtap": "^1.4.0", + "minipass": "^3.3.4", "mkdirp": "^1.0.4", "nyc": "^15.1.0", "opener": "^1.5.1", - "react": "*", + "react": "^17.0.2", "rimraf": "^3.0.0", "signal-exit": "^3.0.6", "source-map-support": "^0.5.16", "tap-mocha-reporter": "^5.0.3", - "tap-parser": "^11.0.1", - "tap-yaml": "^1.0.0", + "tap-parser": "^11.0.2", + "tap-yaml": "^1.0.2", "tcompare": "^5.0.7", - "treport": "*", + "treport": "^3.0.4", "which": "^2.0.2" }, "bin": { "tap": "bin/run.js" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "peerDependencies": { + "coveralls": "^3.1.1", "flow-remove-types": ">=2.112.0", "ts-node": ">=8.5.2", "typescript": ">=3.7.2" }, "peerDependenciesMeta": { + "coveralls": { + "optional": true + }, "flow-remove-types": { "optional": true }, @@ -4066,9 +4386,9 @@ } }, "node_modules/tap-mocha-reporter": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.3.tgz", - "integrity": "sha512-6zlGkaV4J+XMRFkN0X+yuw6xHbE9jyCZ3WUKfw4KxMyRGOpYSRuuQTRJyWX88WWuLdVTuFbxzwXhXuS2XE6o0g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.4.tgz", + "integrity": "sha512-J+YMO8B7lq1O6Zxd/jeuG27vJ+Y4tLiRMKPSb7KR6FVh86k3Rq1TwYc2GKPyIjCbzzdMdReh3Vfz9L5cg1Z2Bw==", "dev": true, "dependencies": { "color-support": "^1.1.0", @@ -4087,38 +4407,6 @@ "node": ">= 8" } }, - "node_modules/tap-mocha-reporter/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/tap-mocha-reporter/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tap-mocha-reporter/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/tap-parser": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.2.tgz", @@ -4145,20 +4433,34 @@ "yaml": "^1.10.2" } }, + "node_modules/tap/node_modules/@ampproject/remapping": { + "version": "2.2.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/tap/node_modules/@babel/code-frame": { - "version": "7.16.0", + "version": "7.23.5", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/compat-data": { - "version": "7.16.0", + "version": "7.23.5", "dev": true, "inBundle": true, "license": "MIT", @@ -4167,26 +4469,26 @@ } }, "node_modules/tap/node_modules/@babel/core": { - "version": "7.16.0", + "version": "7.23.6", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -4197,144 +4499,115 @@ } }, "node_modules/tap/node_modules/@babel/generator": { - "version": "7.16.0", + "version": "7.23.6", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.0", + "version": "7.22.5", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-compilation-targets": { - "version": "7.16.3", + "version": "7.23.6", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.17.5", - "semver": "^6.3.0" + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/tap/node_modules/@babel/helper-function-name": { - "version": "7.16.0", + "node_modules/tap/node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - }, "engines": { "node": ">=6.9.0" } }, - "node_modules/tap/node_modules/@babel/helper-get-function-arity": { - "version": "7.16.0", + "node_modules/tap/node_modules/@babel/helper-function-name": { + "version": "7.23.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-hoist-variables": { - "version": "7.16.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/tap/node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.0", + "version": "7.22.5", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-module-imports": { - "version": "7.16.0", + "version": "7.22.15", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-module-transforms": { - "version": "7.16.0", + "version": "7.23.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/tap/node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.16.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/tap/node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", + "version": "7.22.5", "dev": true, "inBundle": true, "license": "MIT", @@ -4342,47 +4615,41 @@ "node": ">=6.9.0" } }, - "node_modules/tap/node_modules/@babel/helper-replace-supers": { - "version": "7.16.0", + "node_modules/tap/node_modules/@babel/helper-simple-access": { + "version": "7.22.5", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/tap/node_modules/@babel/helper-simple-access": { - "version": "7.16.0", + "node_modules/tap/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/tap/node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.0", + "node_modules/tap/node_modules/@babel/helper-string-parser": { + "version": "7.23.4", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.16.0" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", + "version": "7.22.20", "dev": true, "inBundle": true, "license": "MIT", @@ -4391,7 +4658,7 @@ } }, "node_modules/tap/node_modules/@babel/helper-validator-option": { - "version": "7.14.5", + "version": "7.23.5", "dev": true, "inBundle": true, "license": "MIT", @@ -4400,27 +4667,27 @@ } }, "node_modules/tap/node_modules/@babel/helpers": { - "version": "7.16.3", + "version": "7.23.6", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", - "@babel/types": "^7.16.0" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/highlight": { - "version": "7.16.0", + "version": "7.23.4", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -4428,7 +4695,7 @@ } }, "node_modules/tap/node_modules/@babel/parser": { - "version": "7.16.3", + "version": "7.23.6", "dev": true, "inBundle": true, "license": "MIT", @@ -4440,16 +4707,16 @@ } }, "node_modules/tap/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.0", + "version": "7.20.7", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.0" + "@babel/plugin-transform-parameters": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -4459,12 +4726,12 @@ } }, "node_modules/tap/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.0", + "version": "7.23.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -4486,12 +4753,12 @@ } }, "node_modules/tap/node_modules/@babel/plugin-transform-destructuring": { - "version": "7.16.0", + "version": "7.23.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -4501,12 +4768,12 @@ } }, "node_modules/tap/node_modules/@babel/plugin-transform-parameters": { - "version": "7.16.3", + "version": "7.23.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -4516,16 +4783,16 @@ } }, "node_modules/tap/node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.16.0", + "version": "7.23.4", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" @@ -4535,33 +4802,34 @@ } }, "node_modules/tap/node_modules/@babel/template": { - "version": "7.16.0", + "version": "7.22.15", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/tap/node_modules/@babel/traverse": { - "version": "7.16.3", + "version": "7.23.6", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.3", - "@babel/types": "^7.16.0", - "debug": "^4.1.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -4569,12 +4837,13 @@ } }, "node_modules/tap/node_modules/@babel/types": { - "version": "7.16.0", + "version": "7.23.6", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -4601,47 +4870,62 @@ "node": ">=10" } }, - "node_modules/tap/node_modules/@isaacs/import-jsx/node_modules/caller-callsite": { - "version": "4.1.0", + "node_modules/tap/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "callsites": "^3.1.0" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/tap/node_modules/@isaacs/import-jsx/node_modules/caller-path": { - "version": "3.0.1", + "node_modules/tap/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "caller-callsite": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/tap/node_modules/@isaacs/import-jsx/node_modules/callsites": { - "version": "3.1.0", + "node_modules/tap/node_modules/@jridgewell/set-array": { + "version": "1.1.2", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=6.0.0" + } + }, + "node_modules/tap/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/tap/node_modules/@types/prop-types": { - "version": "15.7.4", + "version": "15.7.11", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/@types/react": { - "version": "17.0.34", + "version": "17.0.73", "dev": true, "inBundle": true, "license": "MIT", @@ -4652,7 +4936,7 @@ } }, "node_modules/tap/node_modules/@types/scheduler": { - "version": "0.16.2", + "version": "0.16.8", "dev": true, "inBundle": true, "license": "MIT" @@ -4733,59 +5017,111 @@ "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/tap/node_modules/browserslist": { + "version": "4.22.2", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/tap/node_modules/caller-callsite": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/tap/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/tap/node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/tap/node_modules/caller-path": { + "version": "3.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "caller-callsite": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/tap/node_modules/browserslist": { - "version": "4.17.6", + "node_modules/tap/node_modules/callsites": { + "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001274", - "electron-to-chromium": "^1.3.886", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "node": ">=6" } }, "node_modules/tap/node_modules/caniuse-lite": { - "version": "1.0.30001279", + "version": "1.0.30001570", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "inBundle": true, - "license": "CC-BY-4.0", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "license": "CC-BY-4.0" }, "node_modules/tap/node_modules/cardinal": { "version": "2.1.1", @@ -4900,13 +5236,10 @@ "license": "MIT" }, "node_modules/tap/node_modules/convert-source-map": { - "version": "1.8.0", + "version": "2.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.1" - } + "license": "MIT" }, "node_modules/tap/node_modules/convert-to-spaces": { "version": "1.0.2", @@ -4918,13 +5251,13 @@ } }, "node_modules/tap/node_modules/csstype": { - "version": "3.0.9", + "version": "3.1.3", "dev": true, "inBundle": true, "license": "MIT" }, "node_modules/tap/node_modules/debug": { - "version": "4.3.2", + "version": "4.3.4", "dev": true, "inBundle": true, "license": "MIT", @@ -4941,7 +5274,7 @@ } }, "node_modules/tap/node_modules/electron-to-chromium": { - "version": "1.3.893", + "version": "1.4.614", "dev": true, "inBundle": true, "license": "ISC" @@ -5035,7 +5368,7 @@ } }, "node_modules/tap/node_modules/glob": { - "version": "7.2.0", + "version": "7.2.3", "dev": true, "inBundle": true, "license": "ISC", @@ -5043,7 +5376,7 @@ "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -5251,9 +5584,9 @@ }, "node_modules/tap/node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "inBundle": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -5291,6 +5624,15 @@ "loose-envify": "cli.js" } }, + "node_modules/tap/node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/tap/node_modules/make-dir": { "version": "3.1.0", "dev": true, @@ -5316,7 +5658,7 @@ } }, "node_modules/tap/node_modules/minimatch": { - "version": "3.0.4", + "version": "3.1.2", "dev": true, "inBundle": true, "license": "ISC", @@ -5327,14 +5669,8 @@ "node": "*" } }, - "node_modules/tap/node_modules/minimist": { - "version": "1.2.5", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/tap/node_modules/minipass": { - "version": "3.1.6", + "version": "3.3.6", "dev": true, "inBundle": true, "license": "ISC", @@ -5345,6 +5681,12 @@ "node": ">=8" } }, + "node_modules/tap/node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, "node_modules/tap/node_modules/ms": { "version": "2.1.2", "dev": true, @@ -5352,7 +5694,7 @@ "license": "MIT" }, "node_modules/tap/node_modules/node-releases": { - "version": "2.0.1", + "version": "2.0.14", "dev": true, "inBundle": true, "license": "MIT" @@ -5472,7 +5814,7 @@ } }, "node_modules/tap/node_modules/punycode": { - "version": "2.1.1", + "version": "2.3.1", "dev": true, "inBundle": true, "license": "MIT", @@ -5494,7 +5836,7 @@ } }, "node_modules/tap/node_modules/react-devtools-core": { - "version": "4.21.0", + "version": "4.28.5", "dev": true, "inBundle": true, "license": "MIT", @@ -5566,12 +5908,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tap/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/tap/node_modules/scheduler": { "version": "0.20.2", "dev": true, @@ -5583,7 +5919,7 @@ } }, "node_modules/tap/node_modules/semver": { - "version": "6.3.0", + "version": "6.3.1", "dev": true, "inBundle": true, "license": "ISC", @@ -5592,13 +5928,16 @@ } }, "node_modules/tap/node_modules/shell-quote": { - "version": "1.7.3", + "version": "1.8.1", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/tap/node_modules/signal-exit": { - "version": "3.0.6", + "version": "3.0.7", "dev": true, "inBundle": true, "license": "ISC" @@ -5650,17 +5989,8 @@ "inBundle": true, "license": "MIT" }, - "node_modules/tap/node_modules/source-map": { - "version": "0.5.7", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/tap/node_modules/stack-utils": { - "version": "2.0.5", + "version": "2.0.6", "dev": true, "inBundle": true, "license": "MIT", @@ -5719,7 +6049,7 @@ } }, "node_modules/tap/node_modules/tap-parser": { - "version": "11.0.1", + "version": "11.0.2", "dev": true, "inBundle": true, "license": "MIT", @@ -5736,12 +6066,12 @@ } }, "node_modules/tap/node_modules/tap-yaml": { - "version": "1.0.0", + "version": "1.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "yaml": "^1.5.0" + "yaml": "^1.10.2" } }, "node_modules/tap/node_modules/to-fast-properties": { @@ -5754,7 +6084,7 @@ } }, "node_modules/tap/node_modules/treport": { - "version": "3.0.3", + "version": "3.0.4", "dev": true, "inBundle": true, "license": "ISC", @@ -5765,6 +6095,7 @@ "ink": "^3.2.0", "ms": "^2.1.2", "tap-parser": "^11.0.0", + "tap-yaml": "^1.0.0", "unicode-length": "^2.0.2" }, "peerDependencies": { @@ -5851,34 +6182,42 @@ } }, "node_modules/tap/node_modules/unicode-length": { - "version": "2.0.2", + "version": "2.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "punycode": "^2.0.0", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/tap/node_modules/unicode-length/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "punycode": "^2.0.0" } }, - "node_modules/tap/node_modules/unicode-length/node_modules/strip-ansi": { - "version": "3.0.1", + "node_modules/tap/node_modules/update-browserslist-db": { + "version": "1.0.13", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "inBundle": true, "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, "node_modules/tap/node_modules/widest-line": { @@ -5947,7 +6286,7 @@ "license": "ISC" }, "node_modules/tap/node_modules/ws": { - "version": "7.5.5", + "version": "7.5.9", "dev": true, "inBundle": true, "license": "MIT", @@ -5968,7 +6307,7 @@ } }, "node_modules/tap/node_modules/yallist": { - "version": "4.0.0", + "version": "3.1.1", "dev": true, "inBundle": true, "license": "ISC" @@ -6007,9 +6346,9 @@ } }, "node_modules/terser": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.20.0.tgz", - "integrity": "sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ==", + "version": "5.28.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.28.1.tgz", + "integrity": "sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -6037,6 +6376,11 @@ "node": ">=8" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -6057,19 +6401,12 @@ "node": ">=8.0" } }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "engines": { - "node": ">=6" + "node": ">= 14.0.0" } }, "node_modules/trivial-deferred": { @@ -6086,24 +6423,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, "node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -6202,15 +6521,6 @@ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -6236,18 +6546,20 @@ "node": ">= 0.10" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/which": { @@ -6270,11 +6582,70 @@ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, + "node_modules/winston": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.12.0.tgz", + "integrity": "sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", + "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/winston/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6287,27 +6658,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -6325,6 +6675,14 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/xpath": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz", + "integrity": "sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==", + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", @@ -6381,15 +6739,6 @@ "node": ">=6" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/yargs/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -6401,18 +6750,6 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yargs/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -6438,16 +6775,16 @@ "grunt": "^1.4.0", "grunt-contrib-clean": "^2.0.0", "grunt-contrib-htmlmin": "^3.1.0", - "grunt-contrib-nodeunit": "^4.0.0" + "grunt-contrib-nodeunit": "^5.0.0" }, "engines": { "node": ">=0.8.0" } }, "plugins/grunt-inline/node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dependencies": { "source-map": "~0.6.0" }, @@ -6462,6 +6799,14 @@ "engines": { "node": ">=0.10.0" } + }, + "sprites": { + "name": "sprites", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "grunt-svg-sprite": "^2.0.2" + } } } } diff --git a/common/loginpage/build/package.json b/common/loginpage/build/package.json index af0d16170..d586ff0bf 100644 --- a/common/loginpage/build/package.json +++ b/common/loginpage/build/package.json @@ -11,11 +11,11 @@ "grunt-contrib-htmlmin": "^3.1.0", "grunt-contrib-less": "^3.0.0", "grunt-inline": "file:plugins/grunt-inline", - "iconsprite": "file:sprites", "grunt-terser": "^2.0.0", "grunt-text-replace": "0.4.0", + "iconsprite": "file:sprites", "lodash": "^4.17.20", - "terser": "^5.17.3" + "terser": "^5.28.1" }, "overrides": { "tough-cookie": "4.1.3", diff --git a/common/loginpage/build/plugins/grunt-inline/package.json b/common/loginpage/build/plugins/grunt-inline/package.json index 80d2ed993..9fcf580a0 100644 --- a/common/loginpage/build/plugins/grunt-inline/package.json +++ b/common/loginpage/build/plugins/grunt-inline/package.json @@ -25,7 +25,7 @@ "grunt": "^1.4.0", "grunt-contrib-clean": "^2.0.0", "grunt-contrib-htmlmin": "^3.1.0", - "grunt-contrib-nodeunit": "^4.0.0" + "grunt-contrib-nodeunit": "^5.0.0" }, "dependencies": { "clean-css": "^5.2.4", From c915eda5b8d7eb96ec0276b8685c874d8abad7c3 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Wed, 6 Mar 2024 11:52:35 +0300 Subject: [PATCH 132/316] [macos] fix bug 66178 --- .../pdf_desktop.png | Bin 279 -> 208 bytes .../pdf_desktop_2x.png | Bin 361 -> 262 bytes .../pdf_desktop.png | Bin 279 -> 208 bytes .../pdf_desktop_2x.png | Bin 361 -> 262 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_active.imageset/pdf_desktop.png b/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_active.imageset/pdf_desktop.png index 5e25461b272e4916628578f43f3b5148b32d4787..421361ce330c69b64f33bf9b400f924bf31aa11c 100644 GIT binary patch delta 143 zcmbQvbb)b#iV$akM`SSr1K(i~W;~w1B4whRMp3M%i(`n!#N-%Jk&-EmjR(6LOA4lR z`tnBY*+7%BNJi|?$FYB rVZYPtvfh@BjRzm*beYPl2EP|%VDyka=a^hv%>V?Ru6{1-oD!M<{;oGG delta 215 zcmV;|04V>^0ha=hBq9WJLP=Bz2nYy#2xN!=000SaNLh0L01m_e01m_fl`9S#kv1rQ zlu1NER49?9(mf7>Fc^pNr^SUE;H|8KMuE$zIGFfxD&+()Sc(%S4K^>-|JLD`_Zg}# zYx4w_%->4`Sp)>gbR+~|;XTq+1h#F*SZR$pRU*D_H#lp3+&jm;$VEIr4-ePp%*$RK zjv@$V-}XBZhqINMQai>fNifw}1i!N?yN*X$h&Y)2Zkj2z-~IJHHBd*|`UAZ!Ga;b4 R3+ey>002ovPDHLkV1oHQR?+|f diff --git a/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_active.imageset/pdf_desktop_2x.png b/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_active.imageset/pdf_desktop_2x.png index 4fdbe6dbe26ea5665b02cc99d5133d25bef59ea7..0b474c93f85fde12c9f7d8fba1f6a9610dac6f16 100644 GIT binary patch delta 179 zcmV;k08Ibs0)_&RB#|^af0Ic>K~zYI?UKO_gD?yL&r!E1Ow?acXUIyh0u@ui9JsH1 zkZ6!9IT6WyW9ww)WcL0AOu!QxHWdjD7!9QWov4lu=nSQi-er&i(8Tu_Kh7TB%kp#a zGYpsJk8_doE{^Q2oSSGCOEYYuUJag|r~)tXbZDXJs&#nr^7;w^)B hbt)2!<*V#__yQE$CT{0ev@`$!002ovPDHLkV1jp7Q;7fo delta 276 zcmV+v0qg#T0_g&fBn<>}LP=Bz2nYy#2xN$nAw7TQNklAuF%S+LeNYH8-drVStQg!*ZlguyY$%Pbi z15_}Hj}yGn|M0iN8QnpySQG({n++%x4K_@Z>To0i+f9qm^X?6i+h54Ti7!FG zqT75C0Ycx84g(xrR|M82S*r%fm&zi*e!Y6G)s?|O1pb^>&)O{!;L)^N7{K4{L||Q# zwQ7KDp&$Zy+ii3>ZJN}^6A{?9EJ8o&tv&|<%YIJ;2v1MG)d$BBfpz)4ug@Qj6<)r< aonHZoXhwrp^dIj40000nBY*+7%BNJi|?$FYB rVZYPtvfh@BjRzm*beYPl2EP|%VDyka=a^hv%>V?Ru6{1-oD!M<{;oGG delta 215 zcmV;|04V>^0ha=hBq9WJLP=Bz2nYy#2xN!=000SaNLh0L01m_e01m_fl`9S#kv1rQ zlu1NER49?9(mf7>Fc^pNr^SUE;H|8KMuE$zIGFfxD&+()Sc(%S4K^>-|JLD`_Zg}# zYx4w_%->4`Sp)>gbR+~|;XTq+1h#F*SZR$pRU*D_H#lp3+&jm;$VEIr4-ePp%*$RK zjv@$V-}XBZhqINMQai>fNifw}1i!N?yN*X$h&Y)2Zkj2z-~IJHHBd*|`UAZ!Ga;b4 R3+ey>002ovPDHLkV1oHQR?+|f diff --git a/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_inactive.imageset/pdf_desktop_2x.png b/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_inactive.imageset/pdf_desktop_2x.png index 4fdbe6dbe26ea5665b02cc99d5133d25bef59ea7..0b474c93f85fde12c9f7d8fba1f6a9610dac6f16 100644 GIT binary patch delta 179 zcmV;k08Ibs0)_&RB#|^af0Ic>K~zYI?UKO_gD?yL&r!E1Ow?acXUIyh0u@ui9JsH1 zkZ6!9IT6WyW9ww)WcL0AOu!QxHWdjD7!9QWov4lu=nSQi-er&i(8Tu_Kh7TB%kp#a zGYpsJk8_doE{^Q2oSSGCOEYYuUJag|r~)tXbZDXJs&#nr^7;w^)B hbt)2!<*V#__yQE$CT{0ev@`$!002ovPDHLkV1jp7Q;7fo delta 276 zcmV+v0qg#T0_g&fBn<>}LP=Bz2nYy#2xN$nAw7TQNklAuF%S+LeNYH8-drVStQg!*ZlguyY$%Pbi z15_}Hj}yGn|M0iN8QnpySQG({n++%x4K_@Z>To0i+f9qm^X?6i+h54Ti7!FG zqT75C0Ycx84g(xrR|M82S*r%fm&zi*e!Y6G)s?|O1pb^>&)O{!;L)^N7{K4{L||Q# zwQ7KDp&$Zy+ii3>ZJN}^6A{?9EJ8o&tv&|<%YIJ;2v1MG)d$BBfpz)4ug@Qj6<)r< aonHZoXhwrp^dIj40000 Date: Wed, 6 Mar 2024 12:19:08 +0300 Subject: [PATCH 133/316] [macos] fix some icons size --- .../pdf_desktop.png | Bin 208 -> 209 bytes .../pdf_desktop_2x.png | Bin 262 -> 252 bytes .../pdf_desktop.png | Bin 208 -> 209 bytes .../pdf_desktop_2x.png | Bin 262 -> 252 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_active.imageset/pdf_desktop.png b/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_active.imageset/pdf_desktop.png index 421361ce330c69b64f33bf9b400f924bf31aa11c..cbafc198b71a677971ee269db4a9b0e9c7f117c1 100644 GIT binary patch delta 160 zcmV;R0AK&m0nq`FBpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m+W=TXrR5(v# zTon{_l!1Z43W!MsN11>GIT}I08l;(QK#^t^C=CXoYu7?q5U@Hp7)&FJ!^A)UMKcHx z(tr%8=WGx_cRC2*as?=!|3ld%1B#rDVly@;ql3ZWY>G95aupeX;Rpb=P#zct diff --git a/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_active.imageset/pdf_desktop_2x.png b/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_active.imageset/pdf_desktop_2x.png index 0b474c93f85fde12c9f7d8fba1f6a9610dac6f16..90800fa037065055c5091547b195a9d161261290 100644 GIT binary patch delta 224 zcmZo;`olOurJk`k$lZxy-8q?;3=9k`>5jgR3=A9lx&I`x0{NT;9+AZi419+{nDKc2 ziWH#WL{AsT5D)LS(+_es81T5xUboQiiEklW_$ARPexc7dsBMuG;ePZ`dj@-ByoL?a z{`N~(Otu=PJ<+TX&}m$;U4~6=N{EJLi{p`08|RfSk$~wCCc&;fA81)=qyRUm&m3uVrKlEDpwFbn|CQMV{e)L&3%$V#vR6;r_+ zxUYPWXpky75y^dH>ty9*_WlJ-z!Mub6$uU)4W$5`sE!Wk3}dB{-er&i(8Tu_Kh7TB z%kp#aGYpsJk8_doE{^Q2oSSGCOEYYuUJag|r~)tXbZsw4Hq)x@Ua kErWM;DiVz4tL%ID0uh($ diff --git a/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_inactive.imageset/pdf_desktop.png b/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_inactive.imageset/pdf_desktop.png index 421361ce330c69b64f33bf9b400f924bf31aa11c..cbafc198b71a677971ee269db4a9b0e9c7f117c1 100644 GIT binary patch delta 160 zcmV;R0AK&m0nq`FBpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%m+W=TXrR5(v# zTon{_l!1Z43W!MsN11>GIT}I08l;(QK#^t^C=CXoYu7?q5U@Hp7)&FJ!^A)UMKcHx z(tr%8=WGx_cRC2*as?=!|3ld%1B#rDVly@;ql3ZWY>G95aupeX;Rpb=P#zct diff --git a/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_inactive.imageset/pdf_desktop_2x.png b/macos/ONLYOFFICE/Images.xcassets/Tabs/icon_tabs_pdf_inactive.imageset/pdf_desktop_2x.png index 0b474c93f85fde12c9f7d8fba1f6a9610dac6f16..90800fa037065055c5091547b195a9d161261290 100644 GIT binary patch delta 224 zcmZo;`olOurJk`k$lZxy-8q?;3=9k`>5jgR3=A9lx&I`x0{NT;9+AZi419+{nDKc2 ziWH#WL{AsT5D)LS(+_es81T5xUboQiiEklW_$ARPexc7dsBMuG;ePZ`dj@-ByoL?a z{`N~(Otu=PJ<+TX&}m$;U4~6=N{EJLi{p`08|RfSk$~wCCc&;fA81)=qyRUm&m3uVrKlEDpwFbn|CQMV{e)L&3%$V#vR6;r_+ zxUYPWXpky75y^dH>ty9*_WlJ-z!Mub6$uU)4W$5`sE!Wk3}dB{-er&i(8Tu_Kh7TB z%kp#aGYpsJk8_doE{^Q2oSSGCOEYYuUJag|r~)tXbZsw4Hq)x@Ua kErWM;DiVz4tL%ID0uh($ From 8b98effab2105c07cd653b6df7f5a7b3f8e0437a Mon Sep 17 00:00:00 2001 From: Semyon Bezrukov Date: Mon, 11 Mar 2024 14:59:23 +0300 Subject: [PATCH 134/316] Fix bug 45231 - Add menu shortcuts for each editor (msi) (#1180) --- win-linux/package/windows/DesktopEditors.aip | 12 ++++++ win-linux/package/windows/dictionary.ail | 44 ++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/win-linux/package/windows/DesktopEditors.aip b/win-linux/package/windows/DesktopEditors.aip index 4818d44d0..59d736e9b 100644 --- a/win-linux/package/windows/DesktopEditors.aip +++ b/win-linux/package/windows/DesktopEditors.aip @@ -38,6 +38,10 @@ + + + + @@ -954,6 +958,10 @@ + + + + @@ -1470,6 +1478,10 @@ + + + + diff --git a/win-linux/package/windows/dictionary.ail b/win-linux/package/windows/dictionary.ail index f326d2967..aec477eff 100644 --- a/win-linux/package/windows/dictionary.ail +++ b/win-linux/package/windows/dictionary.ail @@ -129,6 +129,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c183698725cf8c35a0852c7bfd2ca7d0e8b1e9c9 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Wed, 13 Mar 2024 07:26:28 +0200 Subject: [PATCH 135/316] Revert "[win-linux] set cef size when show" This reverts commit fe6da6f6c35eb89a7eeda6fedc8fdfac0b693197. --- win-linux/src/components/ctabpanel.cpp | 10 +++------- win-linux/src/components/ctabpanel.h | 2 +- win-linux/src/windows/ceditorwindow.cpp | 8 -------- win-linux/src/windows/cmainwindow.cpp | 4 ---- win-linux/src/windows/cpresenterwindow.cpp | 9 --------- win-linux/src/windows/cpresenterwindow.h | 1 - 6 files changed, 4 insertions(+), 30 deletions(-) diff --git a/win-linux/src/components/ctabpanel.cpp b/win-linux/src/components/ctabpanel.cpp index c236306da..2b7493863 100644 --- a/win-linux/src/components/ctabpanel.cpp +++ b/win-linux/src/components/ctabpanel.cpp @@ -150,14 +150,10 @@ bool CTabPanel::isReady() m_pViewer->resize(event->size()); }*/ -void CTabPanel::showEvent(QShowEvent *ev) +/*void CTabPanel::showEvent(QShowEvent *) { - QWidget::showEvent(ev); - if (ev->type() == QShowEvent::Show) { - m_pViewer->resize(size()); - cef()->resizeEvent(); - } -} +// cef()->resizeEvent(); +}*/ /*void CTabPanel::paintEvent(QPaintEvent *) { diff --git a/win-linux/src/components/ctabpanel.h b/win-linux/src/components/ctabpanel.h index 4d8c16e32..9daaf7b21 100644 --- a/win-linux/src/components/ctabpanel.h +++ b/win-linux/src/components/ctabpanel.h @@ -38,7 +38,7 @@ class CTabPanel : public QWidget void setReady(); //void resize(int w, int h); //void resizeEvent(QResizeEvent *event); - virtual void showEvent(QShowEvent *event) override; + //void showEvent(QShowEvent *event); bool prettyTitle() { return m_prettyTitle; } void setPrettyTitle(bool v) { m_prettyTitle = v; } diff --git a/win-linux/src/windows/ceditorwindow.cpp b/win-linux/src/windows/ceditorwindow.cpp index 6339bc799..c564a292d 100644 --- a/win-linux/src/windows/ceditorwindow.cpp +++ b/win-linux/src/windows/ceditorwindow.cpp @@ -396,14 +396,6 @@ bool CEditorWindow::event(QEvent * event) if (event->type() == QEvent::Resize) { onSizeEvent(0); } else - if (event->type() == QEvent::Show) { - QTimer::singleShot(0, this, [=]() { - if (m_pMainView) { - d_ptr->panel()->view()->resize(m_pMainView->size()); - d_ptr->panel()->cef()->resizeEvent(); - } - }); - } else // if (event->type() == QEvent::User) { // onExitSizeMove(); // } else diff --git a/win-linux/src/windows/cmainwindow.cpp b/win-linux/src/windows/cmainwindow.cpp index fafc9e660..69612917b 100644 --- a/win-linux/src/windows/cmainwindow.cpp +++ b/win-linux/src/windows/cmainwindow.cpp @@ -1517,10 +1517,6 @@ void CMainWindow::showEvent(QShowEvent * e) { CWindowPlatform::showEvent(e); cancelClose(); - if (e->type() == QEvent::Show) { - m_pMainWidget->resize(m_pMainPanel->size() - QSize(0, m_boxTitleBtns->height())); - static_cast(m_pMainWidget)->GetCefView()->resizeEvent(); - } } bool CMainWindow::isAboutToClose() const diff --git a/win-linux/src/windows/cpresenterwindow.cpp b/win-linux/src/windows/cpresenterwindow.cpp index bfdbe66b5..0d2dc59dc 100644 --- a/win-linux/src/windows/cpresenterwindow.cpp +++ b/win-linux/src/windows/cpresenterwindow.cpp @@ -85,15 +85,6 @@ bool CPresenterWindow::holdView(int id) const return ((QCefView *)m_pMainView)->GetCefView()->GetId() == id; } -void CPresenterWindow::showEvent(QShowEvent *ev) -{ - CWindowPlatform::showEvent(ev); - if (ev->type() == QShowEvent::Show) { - m_pMainView->resize(m_pMainPanel->size() - QSize(0, m_boxTitleBtns->height())); - static_cast(m_pMainView)->GetCefView()->resizeEvent(); - } -} - void CPresenterWindow::closeEvent(QCloseEvent *e) { onCloseEvent(); diff --git a/win-linux/src/windows/cpresenterwindow.h b/win-linux/src/windows/cpresenterwindow.h index d9dc4c0d3..b14a5a4a5 100644 --- a/win-linux/src/windows/cpresenterwindow.h +++ b/win-linux/src/windows/cpresenterwindow.h @@ -51,7 +51,6 @@ class CPresenterWindow : public CWindowPlatform virtual bool holdView(int id) const final; protected: - virtual void showEvent(QShowEvent*) override; void closeEvent(QCloseEvent *) final; virtual void onLayoutDirectionChanged() final; From 6205b33a1aeaeeebd8442c5ae05ab9a2e6742cee Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Wed, 13 Mar 2024 07:29:39 +0200 Subject: [PATCH 136/316] [win-linux] cascappmanager: comment out unused code --- .../cascapplicationmanagerwrapper_private.h | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/win-linux/src/cascapplicationmanagerwrapper_private.h b/win-linux/src/cascapplicationmanagerwrapper_private.h index 098643792..d38243f73 100644 --- a/win-linux/src/cascapplicationmanagerwrapper_private.h +++ b/win-linux/src/cascapplicationmanagerwrapper_private.h @@ -92,31 +92,31 @@ class CAscApplicationManagerWrapper_Private { } - auto createStartPanel() -> void { - GET_REGISTRY_USER(reg_user) - - m_pStartPanel = AscAppManager::createViewer(nullptr); - m_pStartPanel->Create(&m_appmanager, cvwtSimple); - m_pStartPanel->setObjectName("mainPanel"); - - QString data_path; -#if defined(QT_DEBUG) - data_path = reg_user.value("startpage").value(); -#endif - - if ( data_path.isEmpty() ) - data_path = qApp->applicationDirPath() + "/index.html"; - - QString additional = "?waitingloader=yes&lang=" + CLangater::getCurrentLangCode(); - QString _portal = reg_user.value("portal").value(); - if (!_portal.isEmpty()) { - QString arg_portal = (additional.isEmpty() ? "?portal=" : "&portal=") + _portal; - additional.append(arg_portal); - } - - std::wstring start_path = ("file:///" + data_path + additional).toStdWString(); - m_pStartPanel->GetCefView()->load(start_path); - } +// auto createStartPanel() -> void { +// GET_REGISTRY_USER(reg_user) + +// m_pStartPanel = AscAppManager::createViewer(nullptr, QSize()); +// m_pStartPanel->Create(&m_appmanager, cvwtSimple); +// m_pStartPanel->setObjectName("mainPanel"); + +// QString data_path; +//#if defined(QT_DEBUG) +// data_path = reg_user.value("startpage").value(); +//#endif + +// if ( data_path.isEmpty() ) +// data_path = qApp->applicationDirPath() + "/index.html"; + +// QString additional = "?waitingloader=yes&lang=" + CLangater::getCurrentLangCode(); +// QString _portal = reg_user.value("portal").value(); +// if (!_portal.isEmpty()) { +// QString arg_portal = (additional.isEmpty() ? "?portal=" : "&portal=") + _portal; +// additional.append(arg_portal); +// } + +// std::wstring start_path = ("file:///" + data_path + additional).toStdWString(); +// m_pStartPanel->GetCefView()->load(start_path); +// } auto sendOpenFolderEvent(int id) -> void { if (!mainWindow() || mainWindow()->startPanelId() != id) { // Ignore start page From 3485b57c122f62e3fb7fa6eaa22228565b8186e9 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Wed, 13 Mar 2024 07:41:21 +0200 Subject: [PATCH 137/316] [win-linux] cascappmanager: debug --- win-linux/src/cascapplicationmanagerwrapper_private.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win-linux/src/cascapplicationmanagerwrapper_private.h b/win-linux/src/cascapplicationmanagerwrapper_private.h index d38243f73..89de2a2f0 100644 --- a/win-linux/src/cascapplicationmanagerwrapper_private.h +++ b/win-linux/src/cascapplicationmanagerwrapper_private.h @@ -319,7 +319,7 @@ class CAscApplicationManagerWrapper_Private if ( !(viewid < 0) ) { CEditorWindow * editor = m_appmanager.editorWindowFromViewId(viewid); if ( editor ) - return editor->geometry(); + return editor->normalGeometry(); else if ( m_appmanager.mainWindow() && m_appmanager.mainWindow()->holdView(viewid) ) return m_appmanager.mainWindow()->windowRect(); From f72c631805f316ad6595a79a671b5ce135aacc85 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Wed, 13 Mar 2024 08:02:11 +0200 Subject: [PATCH 138/316] [win-linux] set size for qcefwidget on constructor --- .../src/cascapplicationmanagerwrapper.cpp | 14 ++++----- win-linux/src/cascapplicationmanagerwrapper.h | 2 +- .../cascapplicationmanagerwrapper_private.h | 31 ++++++++++++------- win-linux/src/ceditortools.cpp | 4 +-- win-linux/src/ceditortools.h | 2 +- win-linux/src/components/asctabwidget.cpp | 8 +++-- win-linux/src/components/ctabpanel.cpp | 8 ++--- win-linux/src/components/ctabpanel.h | 4 +-- win-linux/src/windows/cmainwindow.cpp | 5 +++ win-linux/src/windows/cmainwindow.h | 1 + win-linux/src/windows/cpresenterwindow.cpp | 2 +- win-linux/src/windows/cwindowbase.cpp | 31 +++++++++++-------- win-linux/src/windows/cwindowbase.h | 2 ++ 13 files changed, 70 insertions(+), 44 deletions(-) diff --git a/win-linux/src/cascapplicationmanagerwrapper.cpp b/win-linux/src/cascapplicationmanagerwrapper.cpp index efa125ab7..2b14d3735 100644 --- a/win-linux/src/cascapplicationmanagerwrapper.cpp +++ b/win-linux/src/cascapplicationmanagerwrapper.cpp @@ -801,7 +801,7 @@ CMainWindow * CAscApplicationManagerWrapper::prepareMainWindow(const QRect& r) if ( r.isEmpty() ) _start_rect = reg_user.value("position").toRect(); - QPointer _startPanel = AscAppManager::createViewer(nullptr); + QPointer _startPanel = AscAppManager::createViewer(nullptr, CWindowBase::expectedContentSize(_start_rect)); _startPanel->Create(&_app, cvwtSimple); _startPanel->setObjectName("startPanel"); //_startPanel->resize(_start_rect.width(), _start_rect.height()); @@ -966,7 +966,7 @@ void CAscApplicationManagerWrapper::handleInputCmd(const std::vector& v // open_in_new_window = std::find(vargs.begin(), vargs.end(), L"--force-use-tab") == std::end(vargs); // - CTabPanel * panel = CEditorTools::createEditorPanel(open_opts); + CTabPanel * panel = CEditorTools::createEditorPanel(open_opts, CWindowBase::expectedContentSize(_start_rect, open_in_new_window)); if ( panel ) { if ( open_in_new_window ) { CEditorWindow * editor_win = new CEditorWindow(_start_rect, panel); @@ -1265,9 +1265,6 @@ CPresenterWindow * CAscApplicationManagerWrapper::createReporterWindow(void * da CAscReporterData * pCreateData = reinterpret_cast(pData->get_Data()); pData->put_Data(NULL); - QCefView * pView = createViewer(NULL); - pView->CreateReporter(this, pCreateData); - QString _doc_name; QWindow *wnd = nullptr; if ( m_pMainWindow && m_pMainWindow->holdView(parentid) ) { @@ -1299,6 +1296,9 @@ CPresenterWindow * CAscApplicationManagerWrapper::createReporterWindow(void * da QRect _window_rect{QPoint(0,0), _saved_rect.size()}; _window_rect.moveCenter(_scr_rect.center()); + QCefView * pView = createViewer(nullptr, CWindowBase::expectedContentSize(_window_rect)); + pView->CreateReporter(this, pCreateData); + CPresenterWindow * reporterWindow = new CPresenterWindow(_window_rect, tr("Presenter View") + " - " + _doc_name, pView); m_winsReporter[pView->GetCefView()->GetId()] = reporterWindow; @@ -1934,12 +1934,12 @@ bool CAscApplicationManagerWrapper::canAppClose() return true; } -QCefView * CAscApplicationManagerWrapper::createViewer(QWidget * parent) +QCefView * CAscApplicationManagerWrapper::createViewer(QWidget * parent, const QSize& size) { APP_CAST(_app); ++_app.m_countViews; - return _app.m_private->createView(parent); + return _app.m_private->createView(parent, size); } void CAscApplicationManagerWrapper::destroyViewer(int id) diff --git a/win-linux/src/cascapplicationmanagerwrapper.h b/win-linux/src/cascapplicationmanagerwrapper.h index bec40d9e7..63fc6a1e0 100644 --- a/win-linux/src/cascapplicationmanagerwrapper.h +++ b/win-linux/src/cascapplicationmanagerwrapper.h @@ -190,7 +190,7 @@ private slots: static QString getWindowStylesheets(double); static QString getWindowStylesheets(CScalingFactor); static bool canAppClose(); - static QCefView * createViewer(QWidget * parent); + static QCefView * createViewer(QWidget * parent, const QSize& size); static QString newFileName(int format); static QString newFileName(const std::wstring& format); static CThemes & themes(); diff --git a/win-linux/src/cascapplicationmanagerwrapper_private.h b/win-linux/src/cascapplicationmanagerwrapper_private.h index 89de2a2f0..5944111a0 100644 --- a/win-linux/src/cascapplicationmanagerwrapper_private.h +++ b/win-linux/src/cascapplicationmanagerwrapper_private.h @@ -78,9 +78,9 @@ class CAscApplicationManagerWrapper_Private m_appmanager.addStylesheets(f, s); } - virtual QCefView * createView(QWidget * parent) + virtual QCefView * createView(QWidget * parent, const QSize& s) { - return new QCefView_Media(parent); + return new QCefView_Media(parent, s); } bool allowedCreateLocalFile() @@ -335,7 +335,23 @@ class CAscApplicationManagerWrapper_Private auto openDocument(const COpenOptions& opts) -> bool { - CTabPanel * panel = CEditorTools::createEditorPanel(opts); + bool isMaximized = false; + QRect rect; + QSize panel_size; + if ( preferOpenEditorWindow() ) { + GET_REGISTRY_USER(reg_user); + isMaximized = mainWindow() ? mainWindow()->windowState().testFlag(Qt::WindowMaximized) : reg_user.value("maximized", false).toBool(); + if ( !isMaximized ) + rect = windowRectFromViewId(opts.parent_id); + if ( !rect.isEmpty() ) + rect.adjust(50,50,50,50); + panel_size = CWindowBase::expectedContentSize(rect, true); + } else { + m_appmanager.gotoMainWindow(size_t(m_appmanager.editorWindowFromViewId(opts.parent_id))); + panel_size = mainWindow()->contentSize(); + } + + CTabPanel * panel = CEditorTools::createEditorPanel(opts, panel_size); if ( panel ) { CAscTabData * panel_data = panel->data(); QRegularExpression re("^ascdesktop:\\/\\/(?:compare|merge|template)"); @@ -346,13 +362,6 @@ class CAscApplicationManagerWrapper_Private } if ( preferOpenEditorWindow() ) { - GET_REGISTRY_USER(reg_user); - bool isMaximized = mainWindow() ? mainWindow()->windowState().testFlag(Qt::WindowMaximized) : - reg_user.value("maximized", false).toBool(); - QRect rect = isMaximized ? QRect() : windowRectFromViewId(opts.parent_id); - if ( !rect.isEmpty() ) - rect.adjust(50,50,50,50); - CEditorWindow * editor_win = new CEditorWindow(rect, panel); editor_win->show(isMaximized); @@ -361,7 +370,7 @@ class CAscApplicationManagerWrapper_Private m_appmanager.sendCommandTo(panel->cef(), L"window:features", Utils::stringifyJson(QJsonObject{{"skiptoparea", TOOLBTN_HEIGHT},{"singlewindow",true}}).toStdWString()); } else { - m_appmanager.gotoMainWindow(size_t(m_appmanager.editorWindowFromViewId(opts.parent_id))); +// m_appmanager.gotoMainWindow(size_t(m_appmanager.editorWindowFromViewId(opts.parent_id))); mainWindow()->attachEditor(panel); } diff --git a/win-linux/src/ceditortools.cpp b/win-linux/src/ceditortools.cpp index ce6e8d70b..3e0ffeb1d 100644 --- a/win-linux/src/ceditortools.cpp +++ b/win-linux/src/ceditortools.cpp @@ -259,7 +259,7 @@ namespace CEditorTools return dlg.selectFolder(sel_path).toStdWString(); } - auto createEditorPanel(const COpenOptions& opts, const QRect& rect) -> CTabPanel * + auto createEditorPanel(const COpenOptions& opts, const QSize& s) -> CTabPanel * { int _file_format{0}; if ( opts.srctype == etLocalFile ) { @@ -277,7 +277,7 @@ namespace CEditorTools } } - CTabPanel * panel = CTabPanel::createEditorPanel(); + CTabPanel * panel = CTabPanel::createEditorPanel(nullptr, s); bool result = true; if (opts.srctype == etLocalFile) { diff --git a/win-linux/src/ceditortools.h b/win-linux/src/ceditortools.h index c38ff958b..d376f35ad 100644 --- a/win-linux/src/ceditortools.h +++ b/win-linux/src/ceditortools.h @@ -61,7 +61,7 @@ namespace CEditorTools QString getlocaltheme(int parentid); std::wstring getFolder(const std::wstring&, int parentid = -1); - auto createEditorPanel(const COpenOptions& opts, const QRect& rect = QRect()) -> CTabPanel *; + auto createEditorPanel(const COpenOptions& opts, const QSize& s) -> CTabPanel *; auto editorTypeFromFormat(int format) -> AscEditorType; auto processLocalFileSaveAs(const NSEditorApi::CAscCefMenuEvent * event) -> void; } diff --git a/win-linux/src/components/asctabwidget.cpp b/win-linux/src/components/asctabwidget.cpp index fd7f7be6e..1a129d198 100644 --- a/win-linux/src/components/asctabwidget.cpp +++ b/win-linux/src/components/asctabwidget.cpp @@ -115,8 +115,12 @@ auto createTabPanel(QWidget * parent, CTabPanel * panel = nullptr) -> QWidget * layout->setSpacing(0); layout->setContentsMargins(0,0,0,0); panelwidget->setLayout(layout); - panelwidget->layout()->addWidget(panel ? panel : new CTabPanel); - + if (!panel) { + // workaround for determining the size of a CAscTabWidget that does not contain widgets + CMainWindow *w = parent ? qobject_cast(parent->topLevelWidget()) : nullptr; + panel = new CTabPanel(nullptr, w ? w->contentSize() : QSize()); + } + panelwidget->layout()->addWidget(panel); return panelwidget; } diff --git a/win-linux/src/components/ctabpanel.cpp b/win-linux/src/components/ctabpanel.cpp index 2b7493863..7f7aacfd2 100644 --- a/win-linux/src/components/ctabpanel.cpp +++ b/win-linux/src/components/ctabpanel.cpp @@ -8,16 +8,16 @@ using namespace NSEditorApi; -CTabPanel * CTabPanel::createEditorPanel(QWidget *parent) +CTabPanel * CTabPanel::createEditorPanel(QWidget *parent, const QSize& s) { - CTabPanel * panel = new CTabPanel(parent); + CTabPanel * panel = new CTabPanel(parent, s); panel->initAsEditor(); return panel; } -CTabPanel::CTabPanel(QWidget *parent) +CTabPanel::CTabPanel(QWidget *parent, const QSize& s) : QWidget(parent) - , m_pViewer(AscAppManager::createViewer(this)) + , m_pViewer(AscAppManager::createViewer(this, s)) { QHBoxLayout *_layout = new QHBoxLayout(this); _layout->setSpacing(0); diff --git a/win-linux/src/components/ctabpanel.h b/win-linux/src/components/ctabpanel.h index 9daaf7b21..f3051e250 100644 --- a/win-linux/src/components/ctabpanel.h +++ b/win-linux/src/components/ctabpanel.h @@ -12,10 +12,10 @@ class CTabPanel : public QWidget Q_OBJECT public: - explicit CTabPanel(QWidget *parent = nullptr); + explicit CTabPanel(QWidget *parent, const QSize& s); ~CTabPanel(); - static CTabPanel * createEditorPanel(QWidget *parent = nullptr); + static CTabPanel * createEditorPanel(QWidget *parent, const QSize& size); QCefView * view() const; CCefView * cef() const; diff --git a/win-linux/src/windows/cmainwindow.cpp b/win-linux/src/windows/cmainwindow.cpp index 69612917b..20e9f2f72 100644 --- a/win-linux/src/windows/cmainwindow.cpp +++ b/win-linux/src/windows/cmainwindow.cpp @@ -1529,6 +1529,11 @@ void CMainWindow::cancelClose() m_isCloseAll && (m_isCloseAll = false); } +QSize CMainWindow::contentSize() +{ + return m_pMainWidget ? m_pMainWidget->size() : QSize(); +} + void CMainWindow::onLayoutDirectionChanged() { m_pButtonMain->style()->polish(m_pButtonMain); diff --git a/win-linux/src/windows/cmainwindow.h b/win-linux/src/windows/cmainwindow.h index de9ba81aa..c5d4d8918 100644 --- a/win-linux/src/windows/cmainwindow.h +++ b/win-linux/src/windows/cmainwindow.h @@ -70,6 +70,7 @@ class CMainWindow : public CWindowPlatform, public CScalingWrapper void close(); bool isAboutToClose() const; void cancelClose(); + QSize contentSize(); signals: void aboutToClose(); diff --git a/win-linux/src/windows/cpresenterwindow.cpp b/win-linux/src/windows/cpresenterwindow.cpp index 0d2dc59dc..cff1ade74 100644 --- a/win-linux/src/windows/cpresenterwindow.cpp +++ b/win-linux/src/windows/cpresenterwindow.cpp @@ -153,7 +153,7 @@ QWidget * CPresenterWindow::createMainPanel(QWidget * parent, const QString& tit } mainGridLayout->addWidget(m_boxTitleBtns, 0, 0, Qt::AlignTop); if (!view) { - QCefView * pMainWidget = AscAppManager::createViewer(mainPanel); + QCefView * pMainWidget = AscAppManager::createViewer(mainPanel, mainPanel->size()); pMainWidget->Create(&AscAppManager::getInstance(), cvwtSimple); pMainWidget->setObjectName("mainPanel"); pMainWidget->setHidden(false); diff --git a/win-linux/src/windows/cwindowbase.cpp b/win-linux/src/windows/cwindowbase.cpp index 5b6e00131..ceea884d4 100644 --- a/win-linux/src/windows/cwindowbase.cpp +++ b/win-linux/src/windows/cwindowbase.cpp @@ -72,19 +72,7 @@ CWindowBase::CWindowBase(const QRect& rect) , m_windowActivated(false) { setWindowIcon(Utils::appIcon()); - if ( !rect.isEmpty() ) { - m_dpiRatio = Utils::getScreenDpiRatio(rect.topLeft()); - m_window_rect = rect; - } else { - QScreen * _screen = QApplication::primaryScreen(); - m_dpiRatio = Utils::getScreenDpiRatio(_screen->geometry().topLeft()); - m_window_rect = QRect(QPoint(100, 100)*m_dpiRatio, MAIN_WINDOW_DEFAULT_SIZE * m_dpiRatio); - } - QRect _screen_size = Utils::getScreenGeometry(m_window_rect.topLeft()); - if (_screen_size.intersects(m_window_rect)) - m_window_rect = _screen_size.intersected(m_window_rect); - else - m_window_rect = QRect(QPoint(100, 100)*m_dpiRatio, MAIN_WINDOW_DEFAULT_SIZE * m_dpiRatio); + m_window_rect = startRect(rect, m_dpiRatio); } CWindowBase::~CWindowBase() @@ -94,6 +82,23 @@ CWindowBase::~CWindowBase() /** Public **/ +QRect CWindowBase::startRect(const QRect &rc, double &dpi) +{ + dpi = Utils::getScreenDpiRatio(rc.isEmpty() ? qApp->primaryScreen()->geometry().topLeft() : rc.topLeft()); + QRect def_rc = QRect(QPoint(100, 100) * dpi, MAIN_WINDOW_DEFAULT_SIZE * dpi), + out_rc = rc.isEmpty() ? def_rc : rc, + scr_rc = Utils::getScreenGeometry(out_rc.topLeft()); + return scr_rc.intersects(out_rc) ? scr_rc.intersected(out_rc) : def_rc; +} + +QSize CWindowBase::expectedContentSize(const QRect &rc, bool extended) +{ + double dpi = 1.0; + QRect win_rc = startRect(rc, dpi); + int brd = MAIN_WINDOW_BORDER_WIDTH * dpi; + return win_rc.adjusted(brd, extended ? brd : TITLE_HEIGHT * dpi + brd, -brd, -brd).size(); +} + QWidget * CWindowBase::handle() const { return qobject_cast(const_cast(this)); diff --git a/win-linux/src/windows/cwindowbase.h b/win-linux/src/windows/cwindowbase.h index 0bb962b5b..608d4d459 100644 --- a/win-linux/src/windows/cwindowbase.h +++ b/win-linux/src/windows/cwindowbase.h @@ -71,6 +71,8 @@ class CWindowBase : public QMainWindow explicit CWindowBase(const QRect&); virtual ~CWindowBase(); + static QRect startRect(const QRect &rc, double &dpi); + static QSize expectedContentSize(const QRect &rc, bool extended = false); QWidget * handle() const; bool isCustomWindowStyle(); void updateScaling(bool resize = true); From 483978f140871209f3454ef1be3df2a72c21433f Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Wed, 13 Mar 2024 18:12:27 +0300 Subject: [PATCH 139/316] edited OO ar --- macos/Localization/ar_SA.xliff | 30 +++++++++---------- .../extras/update-daemon/res/langs/langs.iss | 4 +-- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/macos/Localization/ar_SA.xliff b/macos/Localization/ar_SA.xliff index 751cef7db..377abbc97 100644 --- a/macos/Localization/ar_SA.xliff +++ b/macos/Localization/ar_SA.xliff @@ -249,12 +249,12 @@ ONLYOFFICE can not open the Digital Signature file. Try opening another file. - أونلي أوفيس غير قادر على فتح ملف التوقيع الرقمي. جرّب ملفًّا آخر. + ONLYOFFICE غير قادر على فتح ملف التوقيع الرقمي. جرّب ملفًّا آخر. No comment provided by engineer. ONLYOFFICE can not open the Private Key. Try opening another file. - أونلي أوفيس غير قادر على فتح مفتاح التشفير الخاص. جرّب ملفًّا آخر. + ONLYOFFICE غير قادر على فتح المفتاح الخاص، حاول فتح ملف آخر. No comment provided by engineer. @@ -571,7 +571,7 @@ The trial period will end in %d days, after that you will not be able to create ONLYOFFICE - أونلي أوفيس + ONLYOFFICE Class = "NSMenuItem"; title = "ONLYOFFICE"; ObjectID = "1Xt-HY-uBw"; @@ -621,7 +621,7 @@ The trial period will end in %d days, after that you will not be able to create Quit ONLYOFFICE - خروج من أونلي أوفيس + خروج منONLYOFFICE Class = "NSMenuItem"; title = "Quit ONLYOFFICE"; ObjectID = "4sb-4s-VLi"; @@ -636,7 +636,7 @@ The trial period will end in %d days, after that you will not be able to create About ONLYOFFICE - عن أونلي أوفيس + عن ONLYOFFICE Class = "NSMenuItem"; title = "About ONLYOFFICE"; ObjectID = "5kV-Vb-QxS"; @@ -806,7 +806,7 @@ The trial period will end in %d days, after that you will not be able to create ONLYOFFICE - أونلي أوفيس + ONLYOFFICE Class = "NSWindow"; title = "ONLYOFFICE"; ObjectID = "IQv-IB-iLA"; @@ -871,7 +871,7 @@ The trial period will end in %d days, after that you will not be able to create Hide ONLYOFFICE - إخفاء أونلي أوفيس + إخفاء ONLYOFFICE Class = "NSMenuItem"; title = "Hide ONLYOFFICE"; ObjectID = "Olw-nP-bQN"; @@ -1156,7 +1156,7 @@ The trial period will end in %d days, after that you will not be able to create ONLYOFFICE - أونلي أوفيس + ONLYOFFICE Class = "NSTabViewItem"; label = "ONLYOFFICE"; ObjectID = "kcg-El-49G"; @@ -1241,7 +1241,7 @@ The trial period will end in %d days, after that you will not be able to create ONLYOFFICE - أونلي أوفيس + ONLYOFFICE Class = "NSMenu"; title = "ONLYOFFICE"; ObjectID = "uQy-DD-JDr"; @@ -1392,12 +1392,12 @@ The trial period will end in %d days, after that you will not be able to create ONLYOFFICE - أونلي أوفيس + ONLYOFFICE Bundle name Copyright © 2024 Ascensio System SIA. All rights reserved. - الحقوق جميعها محفوظة 2024 © أسينسو سيستم. + الحقوق جميعها محفوظة 2024 © Ascensio System SIA Copyright (human-readable) @@ -1409,12 +1409,12 @@ The trial period will end in %d days, after that you will not be able to create ONLYOFFICE - أونلي أوفيس + ONLYOFFICE Bundle name Copyright © 2024 Ascensio System SIA. All rights reserved. - الحقوق جميعها محفوظة 2024 © أسينسو سيستم. + الحقوق جميعها محفوظة 2024 © Ascensio System SIA Copyright (human-readable) @@ -1426,12 +1426,12 @@ The trial period will end in %d days, after that you will not be able to create ONLYOFFICE - أونلي أوفيس + ONLYOFFICE Bundle name Copyright © 2024 Ascensio System SIA. All rights reserved. - الحقوق جميعها محفوظة 2024 © أسينسو سيستم. + الحقوق جميعها محفوظة 2024 © Ascensio System SIA Copyright (human-readable) diff --git a/win-linux/extras/update-daemon/res/langs/langs.iss b/win-linux/extras/update-daemon/res/langs/langs.iss index 2cc2161b8..61eb3dace 100644 --- a/win-linux/extras/update-daemon/res/langs/langs.iss +++ b/win-linux/extras/update-daemon/res/langs/langs.iss @@ -1,7 +1,7 @@ en.CAPTION_TEXT =ONLYOFFICE Update Service ru.CAPTION_TEXT =Сервис обновлений ONLYOFFICE -ar_SA.CAPTION_TEXT =خدمة تحديث أونلي أوفيس +ar_SA.CAPTION_TEXT =خدمة تحديث ONLYOFFICE de.CAPTION_TEXT =Aktualisierungsdienst von ONLYOFFICE es.CAPTION_TEXT =Servicio de actualización de ONLYOFFICE fr.CAPTION_TEXT =Service de mise à jour ONLYOFFICE @@ -457,7 +457,7 @@ fi.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher palautti virheen: hy.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher-ը վերադարձրեց սխալը. ko.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher가 오류를 반환했습니다: lv.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher atgrieza kļūdu: -nl.MESSAGE_TEXT_ERR17 =ONLYOFFICE Update Service +nl.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher retourneerde fout: pl.MESSAGE_TEXT_ERR17 =Funkcja ServiceCtrlDispatcher odesłała błąd: pt_PT.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher retornou erro: sk.MESSAGE_TEXT_ERR17 =ServiceCtrlDispatcher vrátil chybu: From 6075118615cd9e145766de904ef1b2fc4f30bbc5 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Fri, 15 Mar 2024 01:09:15 +0300 Subject: [PATCH 140/316] [macos][rtl] fix but 6687 --- macos/ONLYOFFICE/Code/TouchBar/Views/ASCTabTouchBarItem.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/macos/ONLYOFFICE/Code/TouchBar/Views/ASCTabTouchBarItem.m b/macos/ONLYOFFICE/Code/TouchBar/Views/ASCTabTouchBarItem.m index fb5b2e945..e9aa9c1ab 100644 --- a/macos/ONLYOFFICE/Code/TouchBar/Views/ASCTabTouchBarItem.m +++ b/macos/ONLYOFFICE/Code/TouchBar/Views/ASCTabTouchBarItem.m @@ -66,7 +66,8 @@ - (instancetype)initWithFrame:(NSRect)frameRect { _textField.font = [NSFont systemFontOfSize: 14]; _textField.textColor = [NSColor alternateSelectedControlTextColor]; - _textField.alignment = NSTextAlignmentLeft; + _textField.alignment = [self userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionLeftToRight ? + NSTextAlignmentLeft : NSTextAlignmentRight; _textField.lineBreakMode = NSLineBreakByTruncatingTail; [self addSubview:_imageView]; From 4d75862864dda75a001aa195cbbc2a6caeac31e1 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Fri, 15 Mar 2024 01:13:51 +0300 Subject: [PATCH 141/316] [macos][rtl] fix bug 66829 --- .../Code/TouchBar/Controllers/ASCTouchBarController.m | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/macos/ONLYOFFICE/Code/TouchBar/Controllers/ASCTouchBarController.m b/macos/ONLYOFFICE/Code/TouchBar/Controllers/ASCTouchBarController.m index 9cbae6051..0d3ca386a 100644 --- a/macos/ONLYOFFICE/Code/TouchBar/Controllers/ASCTouchBarController.m +++ b/macos/ONLYOFFICE/Code/TouchBar/Controllers/ASCTouchBarController.m @@ -143,11 +143,14 @@ - (NSTouchBar *)makeTouchBar bar.customizationIdentifier = kScrubberCustomizationIdentifier; // Set the default ordering of items. - if (_tabs.count > 0) { - bar.defaultItemIdentifiers = @[kStartPageItemIdentifier, kScrubbedItemIdentifier, NSTouchBarItemIdentifierOtherItemsProxy]; - } else { - bar.defaultItemIdentifiers = @[kNewItemsItemIdentifier, NSTouchBarItemIdentifierOtherItemsProxy]; + NSArray * items = !(_tabs.count > 0) ? @[kNewItemsItemIdentifier, NSTouchBarItemIdentifierOtherItemsProxy] : + @[kStartPageItemIdentifier, kScrubbedItemIdentifier, NSTouchBarItemIdentifierOtherItemsProxy]; + + if ([self.viewController.view userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft) { + items = [[items reverseObjectEnumerator] allObjects]; } + bar.defaultItemIdentifiers = items; + // bar.customizationAllowedItemIdentifiers = @[kScrubbedItemIdentifier]; // bar.principalItemIdentifier = kScrubbedItemIdentifier; From cab10ac798341c7629f1ddcc7eb9242f096924d0 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Fri, 15 Mar 2024 01:15:45 +0300 Subject: [PATCH 142/316] [macos][rtl] fix touchbar 'new' items alignment --- .../Code/TouchBar/Controllers/ASCTouchBarController.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/macos/ONLYOFFICE/Code/TouchBar/Controllers/ASCTouchBarController.m b/macos/ONLYOFFICE/Code/TouchBar/Controllers/ASCTouchBarController.m index 0d3ca386a..ecf788110 100644 --- a/macos/ONLYOFFICE/Code/TouchBar/Controllers/ASCTouchBarController.m +++ b/macos/ONLYOFFICE/Code/TouchBar/Controllers/ASCTouchBarController.m @@ -143,7 +143,7 @@ - (NSTouchBar *)makeTouchBar bar.customizationIdentifier = kScrubberCustomizationIdentifier; // Set the default ordering of items. - NSArray * items = !(_tabs.count > 0) ? @[kNewItemsItemIdentifier, NSTouchBarItemIdentifierOtherItemsProxy] : + NSArray * items = !(_tabs.count > 0) ? @[kNewItemsItemIdentifier, NSTouchBarItemIdentifierOtherItemsProxy, NSTouchBarItemIdentifierFlexibleSpace] : @[kStartPageItemIdentifier, kScrubbedItemIdentifier, NSTouchBarItemIdentifierOtherItemsProxy]; if ([self.viewController.view userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft) { @@ -280,6 +280,8 @@ - (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifi customizationLabel:NSLocalizedStringWithDefaultValue(@"new-presentation", @"Localizable", [NSBundle mainBundle], @"New Presentation", nil)], ]; + if ([self.viewController.view userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft) + creationButtons = [[creationButtons reverseObjectEnumerator] allObjects]; NSGroupTouchBarItem * createonGroup = [NSGroupTouchBarItem groupItemWithIdentifier:kNewItemsItemIdentifier items:creationButtons]; return createonGroup; } From da28cdf5eebfabe36db17e44363bb026bcf8a4da Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Mon, 18 Mar 2024 17:14:48 +0300 Subject: [PATCH 143/316] [macos] for bug 66903 --- .../Code/Controllers/Common/ASCCommonViewController.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm b/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm index 9555a11ad..b574d217a 100644 --- a/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm +++ b/macos/ONLYOFFICE/Code/Controllers/Common/ASCCommonViewController.mm @@ -1172,6 +1172,8 @@ - (void)onCEFOpenFileDialog:(NSNotification *)notification { allowedFileTypes = [ASCConstants cancryptformats]; } else if ([fileTypes isEqualToString:CEFOpenFileFilterXML]) { allowedFileTypes = [ASCConstants xmldata]; + } else if ([fileTypes isEqualToString:@"any"] || [fileTypes isEqualToString:@"*.*"]) { +// allowedFileTypes = @[@"*.*"]; } else { // filters come in view "*.docx *.pptx *.xlsx" NSError *error = nil; From a105d974dd586a4971d16722708dab86c0af95e8 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Tue, 19 Mar 2024 20:58:21 +0300 Subject: [PATCH 144/316] [start page] skip to send system color scheme changed to native --- common/loginpage/src/panelsettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/loginpage/src/panelsettings.js b/common/loginpage/src/panelsettings.js index 575ae9af5..89eed8724 100644 --- a/common/loginpage/src/panelsettings.js +++ b/common/loginpage/src/panelsettings.js @@ -810,7 +810,7 @@ }); window.sdk.on('on_native_message', _on_app_message.bind(this)); - window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', on_system_theme_dark.bind(this)); + // window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', on_system_theme_dark.bind(this)); // on_system_theme_dark({target: window.matchMedia('(prefers-color-scheme: dark)')}); $(window).on('resize', on_window_resize.bind(this)); From 52614545b8592c0ef2878c3aeaf57c3c597d285c Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Wed, 20 Mar 2024 15:33:50 +0300 Subject: [PATCH 145/316] updated keys 'autoupdates' --- common/loginpage/locale/ar-SA.js | 6 +++--- common/loginpage/locale/be.js | 5 +++-- common/loginpage/locale/bg.js | 5 +++-- common/loginpage/locale/ca.js | 5 +++-- common/loginpage/locale/cs.js | 5 +++-- common/loginpage/locale/da.js | 5 +++-- common/loginpage/locale/de.js | 6 +++--- common/loginpage/locale/el.js | 5 +++-- common/loginpage/locale/es.js | 6 +++--- common/loginpage/locale/et.js | 5 +++-- common/loginpage/locale/fi.js | 5 +++-- common/loginpage/locale/fr.js | 6 +++--- common/loginpage/locale/ga.js | 5 +++-- common/loginpage/locale/gl.js | 5 +++-- common/loginpage/locale/hi.js | 5 +++-- common/loginpage/locale/hr.js | 5 +++-- common/loginpage/locale/hu.js | 5 +++-- common/loginpage/locale/hy.js | 6 +++--- common/loginpage/locale/id.js | 5 +++-- common/loginpage/locale/it.js | 6 +++--- common/loginpage/locale/ja.js | 6 +++--- common/loginpage/locale/ko.js | 5 +++-- common/loginpage/locale/lt.js | 5 +++-- common/loginpage/locale/lv.js | 5 +++-- common/loginpage/locale/nl.js | 5 +++-- common/loginpage/locale/pl.js | 5 +++-- common/loginpage/locale/pt-BR.js | 6 +++--- common/loginpage/locale/pt-PT.js | 5 +++-- common/loginpage/locale/ro.js | 6 +++--- common/loginpage/locale/ru.js | 6 +++--- common/loginpage/locale/si.js | 5 +++-- common/loginpage/locale/sk.js | 5 +++-- common/loginpage/locale/sl.js | 5 +++-- common/loginpage/locale/sr-Latn-RS.js | 5 +++-- common/loginpage/locale/sv.js | 5 +++-- common/loginpage/locale/tr.js | 5 +++-- common/loginpage/locale/uk.js | 5 +++-- common/loginpage/locale/vi.js | 5 +++-- common/loginpage/locale/zh-CN.js | 6 +++--- common/loginpage/locale/zh-TW.js | 5 +++-- common/loginpage/src/locale.js | 6 +++--- 41 files changed, 123 insertions(+), 94 deletions(-) diff --git a/common/loginpage/locale/ar-SA.js b/common/loginpage/locale/ar-SA.js index afdd669c1..1ba07c005 100644 --- a/common/loginpage/locale/ar-SA.js +++ b/common/loginpage/locale/ar-SA.js @@ -101,9 +101,9 @@ l10n.ar_SA = { settOptThemeAddLocal: 'إضافة نسق محلي', settOptThemeContrastDark: 'أسود متباين', settAUpdateMode: 'تحديثات', - settOptAUpdateSilent: 'التحديث التلقائي', - settOptAUpdateAsk: 'التحقق من وجود تحديثات', - settOptAUpdateDisabled: 'لا تتحقق من وجود تحديثات', + settOptAUpdateSilent: 'خۆکار', + settOptAUpdateAsk: 'إبلاغ', + settOptAUpdateDisabled: 'يدوي', updateDownloadFinished: 'انتهى التحميل. اضغط للتثبيت', updateDownloadCanceled: 'تم إلغاء التحميل', updateDownloadProgress: 'جاري التحميل %$1. اضغط للإيقاف', diff --git a/common/loginpage/locale/be.js b/common/loginpage/locale/be.js index d7a78a74f..aa7cfa2dc 100644 --- a/common/loginpage/locale/be.js +++ b/common/loginpage/locale/be.js @@ -100,8 +100,9 @@ l10n.be = { settOptThemeSystem: 'Сістэмная', settOptThemeContrastDark: 'Кантрасная цёмная', settAUpdateMode: 'Рэжым аўтаабнаўлення', - settOptAUpdateSilent: 'Ціхі рэжым', - settOptAUpdateAsk: 'Папрасіць спампаваць', + settOptAUpdateSilent: 'Аўта', + settOptAUpdateAsk: 'Паведамляць', + settOptAUpdateDisabled: 'Уласнаручна', updateDownloadFinished: 'Спампоўка скончана. Націсніце, каб усталяваць', updateDownloadCanceled: 'Спампоўка скасавана', updateDownloadProgress: 'Спампоўка $1%. Націсніце, каб спыніць', diff --git a/common/loginpage/locale/bg.js b/common/loginpage/locale/bg.js index c1fa49d9a..f314afcc4 100644 --- a/common/loginpage/locale/bg.js +++ b/common/loginpage/locale/bg.js @@ -101,8 +101,9 @@ l10n.bg = { settOptThemeAddLocal: 'Добави местна тема', settOptThemeContrastDark: 'Контрастно Тъмно', settAUpdateMode: 'Актуализации', - settOptAUpdateSilent: 'Автоматични актуализации', - settOptAUpdateAsk: 'Провери за актуализации', + settOptAUpdateSilent: 'Автоматични', + settOptAUpdateAsk: 'Извести', + settOptAUpdateDisabled: 'Наръчник', updateDownloadFinished: 'Изтеглянето приключи. Натиснете за инсталиране', updateDownloadCanceled: 'Изтеглянето е отказано', updateDownloadProgress: 'Изтегляне $1%. Натиснете за прекратяване', diff --git a/common/loginpage/locale/ca.js b/common/loginpage/locale/ca.js index 27421fb05..9baeff9c6 100644 --- a/common/loginpage/locale/ca.js +++ b/common/loginpage/locale/ca.js @@ -100,8 +100,9 @@ l10n.ca = { settOptThemeSystem: 'Igual que el sistema', settOptThemeContrastDark: 'Contrast fosc', settAUpdateMode: 'Mode d\'actualització automàtica', - settOptAUpdateSilent: 'Mode silenciós', - settOptAUpdateAsk: 'Demanar descarregar-la', + settOptAUpdateSilent: 'Automàtic', + settOptAUpdateAsk: 'Notificar', + settOptAUpdateDisabled: 'Manual', updateDownloadFinished: 'La descàrrega ha finalitzat. Feu clic per instal·lar', updateDownloadCanceled: 'Descàrrega cancel·lada', updateDownloadProgress: 'Descarregant $1%. Fes clic per pausar', diff --git a/common/loginpage/locale/cs.js b/common/loginpage/locale/cs.js index 99ce35055..fa3106900 100644 --- a/common/loginpage/locale/cs.js +++ b/common/loginpage/locale/cs.js @@ -101,8 +101,9 @@ l10n.cs = { settOptThemeAddLocal: 'Přidat místní téma', settOptThemeContrastDark: 'Tmavý kontrast', settAUpdateMode: 'Aktualizace', - settOptAUpdateSilent: 'Automatická aktualizace', - settOptAUpdateAsk: 'Kontrola aktualizací', + settOptAUpdateSilent: 'Automaticky', + settOptAUpdateAsk: 'Oznámit', + settOptAUpdateDisabled: 'Ručně', updateDownloadFinished: 'Stahování dokončeno. Klikněte pro instalaci', updateDownloadCanceled: 'Stahování zrušeno', updateDownloadProgress: 'Stahování $1%. Klikněte pro zastavení', diff --git a/common/loginpage/locale/da.js b/common/loginpage/locale/da.js index 543de26a9..f660f4b25 100644 --- a/common/loginpage/locale/da.js +++ b/common/loginpage/locale/da.js @@ -100,8 +100,9 @@ l10n.da = { settOptThemeSystem: 'Samme som system', settOptThemeContrastDark: 'Kontrast Mørk', settAUpdateMode: 'Autoopdateringstilstand', - settOptAUpdateSilent: 'Stille tilstand', - settOptAUpdateAsk: 'Anmod om at downloade', + settOptAUpdateSilent: 'Automatisk', + settOptAUpdateAsk: 'Underret', + settOptAUpdateDisabled: 'Manuelt', updateDownloadFinished: 'Download afsluttet. Klik for at installere', updateDownloadCanceled: 'Download afbrudt', updateDownloadProgress: 'Downloader $1%. Klik for at stoppe', diff --git a/common/loginpage/locale/de.js b/common/loginpage/locale/de.js index 7e02c3452..3c52852a9 100644 --- a/common/loginpage/locale/de.js +++ b/common/loginpage/locale/de.js @@ -101,9 +101,9 @@ l10n.de = { settOptThemeAddLocal: 'Lokales Thema hinzufügen', settOptThemeContrastDark: 'Dunkler Kontrast', settAUpdateMode: 'Updates', - settOptAUpdateSilent: 'Automatisches Update', - settOptAUpdateAsk: 'Auf Updates prüfen', - settOptAUpdateDisabled: 'Nicht auf Updates prüfen', + settOptAUpdateSilent: 'Automatisch', + settOptAUpdateAsk: 'Benachrichtigen', + settOptAUpdateDisabled: 'Manuell', updateDownloadFinished: 'Herunterladen abgeschlossen. Für Installation hier klicken', updateDownloadCanceled: 'Herunterladen abgebrochen', updateDownloadProgress: '$1% wird heruntergeladen. Zum Abbrechen hier klicken', diff --git a/common/loginpage/locale/el.js b/common/loginpage/locale/el.js index 9b9ef22f2..ea9697b33 100644 --- a/common/loginpage/locale/el.js +++ b/common/loginpage/locale/el.js @@ -101,8 +101,9 @@ l10n.el = { settOptThemeAddLocal: 'Προσθήκη τοπικού θέματος', settOptThemeContrastDark: 'Αντίθεση σκουρόχρωμο', settAUpdateMode: 'Ενημερώσεις', - settOptAUpdateSilent: 'Αυτόματη ενημέρωση', - settOptAUpdateAsk: 'Έλεγχος για ενημερώσεις', + settOptAUpdateSilent: 'Αυτόματα', + settOptAUpdateAsk: 'Ειδοποίηση', + settOptAUpdateDisabled: 'Χειροκίνητα', updateDownloadFinished: 'Η λήψη ολοκληρώθηκε. Κάντε κλικ για εγκατάσταση', updateDownloadCanceled: 'Η λήψη ακυρώθηκε', updateDownloadProgress: 'Λήψη $1%. Κάντε κλικ για διακοπή', diff --git a/common/loginpage/locale/es.js b/common/loginpage/locale/es.js index c3032b2f4..b59f44a44 100644 --- a/common/loginpage/locale/es.js +++ b/common/loginpage/locale/es.js @@ -101,9 +101,9 @@ l10n.es = { settOptThemeAddLocal: 'Añadir un tema local', settOptThemeContrastDark: 'Contraste oscuro', settAUpdateMode: 'Actualizaciones', - settOptAUpdateSilent: 'Actualización automática', - settOptAUpdateAsk: 'Buscar actualizaciones', - settOptAUpdateDisabled: 'No buscar actualizaciones', + settOptAUpdateSilent: 'Auto', + settOptAUpdateAsk: 'Notificar', + settOptAUpdateDisabled: 'Manualmente', updateDownloadFinished: 'Descarga finalizada. Haga clic para instalar', updateDownloadCanceled: 'Descarga cancelada', updateDownloadProgress: 'Descargando $1%. Haga clic para cancelar', diff --git a/common/loginpage/locale/et.js b/common/loginpage/locale/et.js index 97f3d55f1..d530266c9 100644 --- a/common/loginpage/locale/et.js +++ b/common/loginpage/locale/et.js @@ -100,8 +100,9 @@ l10n.et = { settOptThemeSystem: 'Süsteemiga sama', settOptThemeContrastDark: 'Kontrastne tume', settAUpdateMode: 'Automaatsete uuenduste režiim', - settOptAUpdateSilent: 'Vaikne režiim', - settOptAUpdateAsk: 'Küsi allalaadimist', + settOptAUpdateSilent: 'Automaatne', + settOptAUpdateAsk: 'Teavita', + settOptAUpdateDisabled: 'Manuaalselt', updateDownloadFinished: 'Allalaadimine on lõpetatud. Paigaldamiseks vajutage siia', updateDownloadCanceled: 'Allalaadimine on tühistatud', updateDownloadProgress: 'Allalaadimine $1%. Lõpetamiseks vajutage siia', diff --git a/common/loginpage/locale/fi.js b/common/loginpage/locale/fi.js index 48ec92cb3..e7e04be1d 100644 --- a/common/loginpage/locale/fi.js +++ b/common/loginpage/locale/fi.js @@ -101,8 +101,9 @@ l10n.fi = { settOptThemeAddLocal: 'Lisää paikallinen teema', settOptThemeContrastDark: 'Tumma kontrasti', settAUpdateMode: 'Päivitykset', - settOptAUpdateSilent: 'Automaattinen päivitys', - settOptAUpdateAsk: 'Hae päivityksiä', + settOptAUpdateSilent: 'Automaattinen', + settOptAUpdateAsk: 'Ilmoita', + settOptAUpdateDisabled: 'Manuaalinen', updateDownloadFinished: 'Lataus suoritettu. Klikkaa asentaaksesi', updateDownloadCanceled: 'Lataus peruttu', updateDownloadProgress: 'Ladataan $1%. Klikkaa lopettaaksesi', diff --git a/common/loginpage/locale/fr.js b/common/loginpage/locale/fr.js index b4f32d9a0..19577ea92 100644 --- a/common/loginpage/locale/fr.js +++ b/common/loginpage/locale/fr.js @@ -101,9 +101,9 @@ l10n.fr = { settOptThemeAddLocal: 'Ajouter un thème local', settOptThemeContrastDark: 'Contraste sombre', settAUpdateMode: 'Mises à jour', - settOptAUpdateSilent: 'Mise à jour automatique', - settOptAUpdateAsk: 'Vérifier les mises à jour', - settOptAUpdateDisabled: 'Ne pas vérifier les mises à jour', + settOptAUpdateSilent: 'Auto', + settOptAUpdateAsk: 'Informer', + settOptAUpdateDisabled: 'Manuellement', updateDownloadFinished: 'Téléchargement terminé. Cliquez pour installer', updateDownloadCanceled: 'Téléchargement annulé', updateDownloadProgress: 'Téléchargement de $1%. Cliquez pour arrêter', diff --git a/common/loginpage/locale/ga.js b/common/loginpage/locale/ga.js index 065a74579..c0230a897 100644 --- a/common/loginpage/locale/ga.js +++ b/common/loginpage/locale/ga.js @@ -100,8 +100,9 @@ l10n.ga = { settOptThemeSystem: 'Córas mar in gcéanna', settOptThemeContrastDark: 'Codarsnacht dorcha', settAUpdateMode: 'Mód uath-nuashonraithe', - settOptAUpdateSilent: 'Mód chiúin', - settOptAUpdateAsk: 'Iarr chun íoslódáil', + settOptAUpdateSilent: 'Auto', + settOptAUpdateAsk: 'Fógraigh', + settOptAUpdateDisabled: 'Lámhleabhar', updateDownloadFinished: 'Críochnaithe ag íoslódáil. Cliceáil chun suiteáil', updateDownloadCanceled: 'Cealaíodh an íoslódáil', updateDownloadProgress: '$1% á íoslódáil. Cliceáil chun stop a chur leis', diff --git a/common/loginpage/locale/gl.js b/common/loginpage/locale/gl.js index 59a0de2c4..1666f894c 100644 --- a/common/loginpage/locale/gl.js +++ b/common/loginpage/locale/gl.js @@ -100,8 +100,9 @@ l10n.gl = { settOptThemeSystem: 'Igual que o sistema', settOptThemeContrastDark: 'Contraste escuro', settAUpdateMode: 'Modo de actualización automática', - settOptAUpdateSilent: 'Modo silencioso', - settOptAUpdateAsk: 'Preguntar para descargar', + settOptAUpdateSilent: 'Automático', + settOptAUpdateAsk: 'Notificar', + settOptAUpdateDisabled: 'Manual', updateDownloadFinished: 'Descarga finalizada. Faga clic para instalar', updateDownloadCanceled: 'Descarga cancelada', updateDownloadProgress: 'Descargando $1%. Faga clic para deter', diff --git a/common/loginpage/locale/hi.js b/common/loginpage/locale/hi.js index 7e7958135..7c71cf853 100644 --- a/common/loginpage/locale/hi.js +++ b/common/loginpage/locale/hi.js @@ -100,8 +100,9 @@ l10n.hi = { settOptThemeSystem: 'सिस्टम के समान है', settOptThemeContrastDark: 'कॉन्ट्रास्ट डार्क', settAUpdateMode: 'स्वतः अद्यतन मोड', - settOptAUpdateSilent: 'मौन मोड', - settOptAUpdateAsk: 'डाउनलोड करने के लिए पूछें', + settOptAUpdateSilent: 'ऑटो', + settOptAUpdateAsk: 'सूचित करना', + settOptAUpdateDisabled: 'नियमावली', updateDownloadFinished: 'डाउनलोड पूरा हुआ। इंस्टॉल करने के लिए क्लिक करें।', updateDownloadCanceled: 'डाउनलोड रद्द हुआ', updateDownloadProgress: '$1% डाउनलोड हो रहा है। रोकने के लिए क्लिक करें।', diff --git a/common/loginpage/locale/hr.js b/common/loginpage/locale/hr.js index 621ad0512..e19b06c4b 100644 --- a/common/loginpage/locale/hr.js +++ b/common/loginpage/locale/hr.js @@ -100,8 +100,9 @@ l10n.hr = { settOptThemeSystem: 'Isto kao u sustavu', settOptThemeContrastDark: 'Kontrastno tamno', settAUpdateMode: 'Način automatskog ažuriranja', - settOptAUpdateSilent: 'Nečujni način', - settOptAUpdateAsk: 'Pitaj za preuzimanje', + settOptAUpdateSilent: 'Automatski', + settOptAUpdateAsk: 'Obavijesti', + settOptAUpdateDisabled: 'Ručno', updateDownloadFinished: 'Preuzimanje je dovršeno. Kliknite za instalaciju', updateDownloadCanceled: 'Preuzimanje je otkazano', updateDownloadProgress: 'Preuzimanje $1%. Kliknite za zaustavljanje', diff --git a/common/loginpage/locale/hu.js b/common/loginpage/locale/hu.js index a0f9602d4..32b8ca910 100644 --- a/common/loginpage/locale/hu.js +++ b/common/loginpage/locale/hu.js @@ -100,8 +100,9 @@ l10n.hu = { settOptThemeSystem: 'Ugyanaz, mint a rendszerben', settOptThemeContrastDark: 'Sötét kontraszt', settAUpdateMode: 'Automatikus frissítés mód', - settOptAUpdateSilent: 'Csendes mód', - settOptAUpdateAsk: 'Letöltés jóváhagyási kérés', + settOptAUpdateSilent: 'Automatikus', + settOptAUpdateAsk: 'Értesítés', + settOptAUpdateDisabled: 'Kézi', updateDownloadFinished: 'A letöltés befejeződött. Kattintson a telepítéshez', updateDownloadCanceled: 'Letöltés törölve', updateDownloadProgress: '$1% letöltése. Kattintson a leállításhoz', diff --git a/common/loginpage/locale/hy.js b/common/loginpage/locale/hy.js index b9145d76d..60f98003d 100644 --- a/common/loginpage/locale/hy.js +++ b/common/loginpage/locale/hy.js @@ -101,9 +101,9 @@ l10n.hy = { settOptThemeAddLocal: 'Ավելացնել տեղական թեմա', settOptThemeContrastDark: 'Մութ հակադրություն', settAUpdateMode: 'Թարմացումներ', - settOptAUpdateSilent: 'Ավտոմատ թարմացում', - settOptAUpdateAsk: 'Ստուգել թարմացումները', - settOptAUpdateDisabled: 'Մի ստուգեք թարմացումները', + settOptAUpdateSilent: 'Ինքնաշխատ', + settOptAUpdateAsk: 'Ծանուցում', + settOptAUpdateDisabled: 'Ձեռնադիր', updateDownloadFinished: 'Ներբեռնումն ավարտված է։ Սեղմեք՝ տեղադրելու համար', updateDownloadCanceled: 'Ներբեռնումը չեղարկվել է', updateDownloadProgress: 'Ներբեռնվում է $1%: Սեղմեք դադարեցնելու համար', diff --git a/common/loginpage/locale/id.js b/common/loginpage/locale/id.js index 8c315a3e1..eb1dbf30b 100644 --- a/common/loginpage/locale/id.js +++ b/common/loginpage/locale/id.js @@ -100,8 +100,9 @@ l10n.id = { settOptThemeSystem: 'Sama seperti sistem', settOptThemeContrastDark: 'Kontras Gelap', settAUpdateMode: 'Mode Autoupdate', - settOptAUpdateSilent: 'Mode senyap', - settOptAUpdateAsk: 'Minta untuk download', + settOptAUpdateSilent: 'Otomatis', + settOptAUpdateAsk: 'Beritahukan', + settOptAUpdateDisabled: 'Manual', updateDownloadFinished: 'Download selesai. Klik untuk instalasi', updateDownloadCanceled: 'Download batal', updateDownloadProgress: 'Mendownload $1%. Klik untuk berhenti', diff --git a/common/loginpage/locale/it.js b/common/loginpage/locale/it.js index 7d1c838a6..cf06f4a20 100644 --- a/common/loginpage/locale/it.js +++ b/common/loginpage/locale/it.js @@ -101,9 +101,9 @@ l10n.it_IT = { settOptThemeAddLocal: 'Aggiungere un tema locale', settOptThemeContrastDark: 'Contrasto scuro', settAUpdateMode: 'Aggiornamenti', - settOptAUpdateSilent: 'Aggiornamento automatico', - settOptAUpdateAsk: 'Verifica la disponibilità di aggiornamenti', - settOptAUpdateDisabled: 'Non verificare la disponibilità di aggiornamenti', + settOptAUpdateSilent: 'Auto', + settOptAUpdateAsk: 'Notifica', + settOptAUpdateDisabled: 'Manuale', updateDownloadFinished: 'Download completato. Clicca per installare', updateDownloadCanceled: 'Download annullato', updateDownloadProgress: 'Scaricamento $ 1%. Clicca per interrompere', diff --git a/common/loginpage/locale/ja.js b/common/loginpage/locale/ja.js index c3548c30c..b71b395c9 100644 --- a/common/loginpage/locale/ja.js +++ b/common/loginpage/locale/ja.js @@ -101,9 +101,9 @@ l10n.ja = { settOptThemeAddLocal: 'ローカルテーマの追加', settOptThemeContrastDark: 'ダークコントラスト', settAUpdateMode: 'アップデート', - settOptAUpdateSilent: '自動アップデート', - settOptAUpdateAsk: 'アップデートを確認', - settOptAUpdateDisabled: 'アップデートを確認しない', + settOptAUpdateSilent: '自動', + settOptAUpdateAsk: '通知する', + settOptAUpdateDisabled: '手動的に', updateDownloadFinished: 'ダウンロードが完了しました。クリックしてインストールしてください', updateDownloadCanceled: 'ダウンロードがキャンセルされました', updateDownloadProgress: 'ダウンロードは$1%です。停止するにはクリックしてください', diff --git a/common/loginpage/locale/ko.js b/common/loginpage/locale/ko.js index fe7d3c0f6..5db7afb91 100644 --- a/common/loginpage/locale/ko.js +++ b/common/loginpage/locale/ko.js @@ -101,8 +101,9 @@ l10n.ko = { settOptThemeAddLocal: '로컬 테마 추가', settOptThemeContrastDark: '콘트라스트 다크', settAUpdateMode: '업데이트', - settOptAUpdateSilent: '자동 업데이트', - settOptAUpdateAsk: '업데이트 확인', + settOptAUpdateSilent: '자동', + settOptAUpdateAsk: '알림', + settOptAUpdateDisabled: '수동', updateDownloadFinished: '다운로드가 완료되었습니다. 설치하려면 클릭하세요', updateDownloadCanceled: '다운로드가 취소되었습니다', updateDownloadProgress: '$1% 다운로드 중입니다. 중지하려면 클릭하세요', diff --git a/common/loginpage/locale/lt.js b/common/loginpage/locale/lt.js index 2d830f435..15b69ba83 100644 --- a/common/loginpage/locale/lt.js +++ b/common/loginpage/locale/lt.js @@ -100,8 +100,9 @@ l10n.lt = { settOptThemeSystem: 'Tokia pati kaip sistema', settOptThemeContrastDark: 'Tamsus kontrastas', settAUpdateMode: 'Automatinio atnaujinimo režimas', - settOptAUpdateSilent: 'Tylusis režimas', - settOptAUpdateAsk: 'Prašyti atsisiųsti', + settOptAUpdateSilent: 'Auto', + settOptAUpdateAsk: 'Informuoti', + settOptAUpdateDisabled: 'Rankiniu būdu', updateDownloadFinished: 'Atsisiuntimas baigtas. Spustelėkite kad įdiegtumėte', updateDownloadCanceled: 'DAtsisiuntimas atšauktas', updateDownloadProgress: 'Atsisiunčiama 1%. Spustelėkite, jei norite sustabdyti', diff --git a/common/loginpage/locale/lv.js b/common/loginpage/locale/lv.js index 18360b499..a556a5632 100644 --- a/common/loginpage/locale/lv.js +++ b/common/loginpage/locale/lv.js @@ -101,8 +101,9 @@ l10n.lv = { settOptThemeAddLocal: 'Pievienojiet vietējo tēmu', settOptThemeContrastDark: 'Tumšs kontrasts', settAUpdateMode: 'Atjauninājumi', - settOptAUpdateSilent: 'Automātiska atjaunināšana', - settOptAUpdateAsk: 'Meklēt atjauninājumus', + settOptAUpdateSilent: 'Automātiski', + settOptAUpdateAsk: 'Paziņot', + settOptAUpdateDisabled: 'Manuāli', updateDownloadFinished: 'Lejupielāde ir pabeigta. Noklikšķiniet, lai instalētu', updateDownloadCanceled: 'Lejupielāde ir atcelta', updateDownloadProgress: 'Lejupielādē $1%. Noklikšķiniet, lai apturētu', diff --git a/common/loginpage/locale/nl.js b/common/loginpage/locale/nl.js index f7db1531f..357951769 100644 --- a/common/loginpage/locale/nl.js +++ b/common/loginpage/locale/nl.js @@ -101,8 +101,9 @@ settOptThemeAddLocal: 'Lokaal thema toevoegen', settOptThemeContrastDark: 'Contrast donker', settAUpdateMode: 'Updates', - settOptAUpdateSilent: 'Automatisch bijwerken', - settOptAUpdateAsk: 'Controleren op updates', + settOptAUpdateSilent: 'Automatisch', + settOptAUpdateAsk: 'Melden', + settOptAUpdateDisabled: 'Handmatig', updateDownloadFinished: 'Downloaden voltooid. Klik om te installeren', updateDownloadCanceled: 'Downloaden geannuleerd', updateDownloadProgress: 'Downloaden van $1%. Klik om te stoppen', diff --git a/common/loginpage/locale/pl.js b/common/loginpage/locale/pl.js index a50a4538c..2e1f162d5 100644 --- a/common/loginpage/locale/pl.js +++ b/common/loginpage/locale/pl.js @@ -101,8 +101,9 @@ l10n.pl = { settOptThemeAddLocal: 'Dodaj motyw lokalny', settOptThemeContrastDark: 'Kontrastowa czerń', settAUpdateMode: 'Aktualizacje', - settOptAUpdateSilent: 'Aktualizuj automatycznie', - settOptAUpdateAsk: 'Sprawdzaj dostępność aktualizacji', + settOptAUpdateSilent: 'Automatycznie', + settOptAUpdateAsk: 'Powiadom', + settOptAUpdateDisabled: 'Ręczny', updateDownloadFinished: 'Pobieranie zostało zakończone. Kliknij, aby zainstalować', updateDownloadCanceled: 'Pobieranie zostało anulowane', updateDownloadProgress: 'Pobieranie $1%. Kliknij, aby zatrzymać', diff --git a/common/loginpage/locale/pt-BR.js b/common/loginpage/locale/pt-BR.js index 600771c60..a139e59a4 100644 --- a/common/loginpage/locale/pt-BR.js +++ b/common/loginpage/locale/pt-BR.js @@ -101,9 +101,9 @@ l10n.pt_BR = { settOptThemeAddLocal: 'Adicionar tema local', settOptThemeContrastDark: 'Contraste escuro', settAUpdateMode: 'Atualizações', - settOptAUpdateSilent: 'Atualização automática', - settOptAUpdateAsk: 'Verificar atualizações', - settOptAUpdateDisabled: 'Não verificar atualizações', + settOptAUpdateSilent: 'Automático', + settOptAUpdateAsk: 'Notificar', + settOptAUpdateDisabled: 'Manual', updateDownloadFinished: 'Download finalizado. Clique para instalar', updateDownloadCanceled: 'Download cancelado', updateDownloadProgress: 'Baixando $1%. Clique para parar', diff --git a/common/loginpage/locale/pt-PT.js b/common/loginpage/locale/pt-PT.js index 3dc207953..861050520 100644 --- a/common/loginpage/locale/pt-PT.js +++ b/common/loginpage/locale/pt-PT.js @@ -101,8 +101,9 @@ l10n.pt_PT = { settOptThemeAddLocal: 'Adicionar tema local', settOptThemeContrastDark: 'Contraste escuro', settAUpdateMode: 'Atualizações', - settOptAUpdateSilent: 'Atualização automática', - settOptAUpdateAsk: 'Verifique se há atualizações', + settOptAUpdateSilent: 'Auto', + settOptAUpdateAsk: 'Notificar', + settOptAUpdateDisabled: 'Manual', updateDownloadFinished: 'A transferência está concluída. Clique para instalar', updateDownloadCanceled: 'Transferência cancelada', updateDownloadProgress: 'A transferir $1%. Clique para parar', diff --git a/common/loginpage/locale/ro.js b/common/loginpage/locale/ro.js index 5ba637546..6d90a9cdb 100644 --- a/common/loginpage/locale/ro.js +++ b/common/loginpage/locale/ro.js @@ -101,9 +101,9 @@ l10n.ro = { settOptThemeAddLocal: 'Adăugare temă locală', settOptThemeContrastDark: 'Contrast Întunecat', settAUpdateMode: 'Actualizări', - settOptAUpdateSilent: 'Actualizare automată', - settOptAUpdateAsk: 'Verificarea actualizărilor', - settOptAUpdateDisabled: 'Fără verificarea actualizărilor', + settOptAUpdateSilent: 'Auto', + settOptAUpdateAsk: 'Notifică', + settOptAUpdateDisabled: 'Manual', updateDownloadFinished: 'Descărcare încheiată. Faceți clic pentru a instala', updateDownloadCanceled: 'Descărcare anulată', updateDownloadProgress: 'Se descarcă $1%. Faceți clic pentru a opri descărcarea', diff --git a/common/loginpage/locale/ru.js b/common/loginpage/locale/ru.js index 01450b11d..38b6865b9 100644 --- a/common/loginpage/locale/ru.js +++ b/common/loginpage/locale/ru.js @@ -101,9 +101,9 @@ l10n.ru = { settOptThemeAddLocal: 'Добавить локальную тему', settOptThemeContrastDark: 'Контрастная темная', settAUpdateMode: 'Обновления', - settOptAUpdateSilent: 'Автоматическое обновление', - settOptAUpdateAsk: 'Проверка обновлений', - settOptAUpdateDisabled: 'Не проверять обновления', + settOptAUpdateSilent: 'Автоматически', + settOptAUpdateAsk: 'Оповестить', + settOptAUpdateDisabled: 'Вручную', updateDownloadFinished: 'Загрузка завершена. Нажмите, чтобы установить', updateDownloadCanceled: 'Загрузка отменена', updateDownloadProgress: 'Загрузка $1%. Нажмите, чтобы остановить', diff --git a/common/loginpage/locale/si.js b/common/loginpage/locale/si.js index 021285842..cc27171c1 100644 --- a/common/loginpage/locale/si.js +++ b/common/loginpage/locale/si.js @@ -101,8 +101,9 @@ l10n.si = { settOptThemeAddLocal: 'ස්ථානීය තේමාවක් යොදන්න', settOptThemeContrastDark: 'අසමාන අඳුරු', settAUpdateMode: 'යාවත්කාල', - settOptAUpdateSilent: 'ස්වයං යාවත්කාලය', - settOptAUpdateAsk: 'යාවත්කාල බලන්න', + settOptAUpdateSilent: 'ස්වයං', + settOptAUpdateAsk: 'දන්වන්න', + settOptAUpdateDisabled: 'අතින්', updateDownloadFinished: 'බාගැනීම අහවරයි. ස්ථාපනයට ඔබන්න', updateDownloadCanceled: 'බාගැනීම අවලංගු කෙරිණි', updateDownloadProgress: '$1% බාගැනෙමින්. නැවතීමට ඔබන්න', diff --git a/common/loginpage/locale/sk.js b/common/loginpage/locale/sk.js index 5fd17ba8a..dd73a115f 100644 --- a/common/loginpage/locale/sk.js +++ b/common/loginpage/locale/sk.js @@ -101,8 +101,9 @@ l10n.sk = { settOptThemeAddLocal: 'Pridať lokálnu tému', settOptThemeContrastDark: 'Kontrast tmavý', settAUpdateMode: 'Aktualizácie', - settOptAUpdateSilent: 'Automatická aktualizácia', - settOptAUpdateAsk: 'Kontrola aktualizácií', + settOptAUpdateSilent: 'Automaticky', + settOptAUpdateAsk: 'Informovať', + settOptAUpdateDisabled: 'Manuál', updateDownloadFinished: 'Sťahovanie ukončené. Kliknite, aby sa spustila inštalácia', updateDownloadCanceled: 'Sťahovanie bolo zrušené', updateDownloadProgress: 'Sťahovanie $1%. Kliknutím zastavíte', diff --git a/common/loginpage/locale/sl.js b/common/loginpage/locale/sl.js index b9177c73d..1f84ff99d 100644 --- a/common/loginpage/locale/sl.js +++ b/common/loginpage/locale/sl.js @@ -101,8 +101,9 @@ l10n.sl = { settOptThemeAddLocal: 'Dodaj lokalno temo', settOptThemeContrastDark: 'Temen kontrast', settAUpdateMode: 'Posodobitve', - settOptAUpdateSilent: 'Samodejno posodabljanje', - settOptAUpdateAsk: 'Preveri za posodobitve', + settOptAUpdateSilent: 'Samodejno', + settOptAUpdateAsk: 'Obvesti', + settOptAUpdateDisabled: 'Ročno', updateDownloadFinished: 'Prenos končan. Kliknite za namestitev', updateDownloadCanceled: 'Prenos preklican', updateDownloadProgress: 'Prenašanje $1%. Kliknite za zaustavitev', diff --git a/common/loginpage/locale/sr-Latn-RS.js b/common/loginpage/locale/sr-Latn-RS.js index 0b79835f1..f5839c88e 100644 --- a/common/loginpage/locale/sr-Latn-RS.js +++ b/common/loginpage/locale/sr-Latn-RS.js @@ -100,8 +100,9 @@ l10n.sr_Latn_RS = { settOptThemeSystem: 'Isto kao Sistem', settOptThemeContrastDark: 'Kontrast Tamno', settAUpdateMode: 'Auto-ažuriranje režim', - settOptAUpdateSilent: 'Tihi režim', - settOptAUpdateAsk: 'Pitaj da preuzmeš', + settOptAUpdateSilent: 'Auto', + settOptAUpdateAsk: 'Obavesti', + settOptAUpdateDisabled: 'Manualno', updateDownloadFinished: 'Preuzimanje završeno. Kliknite da instalirate', updateDownloadCanceled: 'Preuzimanje otkazano', updateDownloadProgress: 'Preuzimanje $1%. Kliknite da zaustavite', diff --git a/common/loginpage/locale/sv.js b/common/loginpage/locale/sv.js index 2ae5af08b..a9094e215 100644 --- a/common/loginpage/locale/sv.js +++ b/common/loginpage/locale/sv.js @@ -100,8 +100,9 @@ l10n.sv = { settOptThemeSystem: 'Samma som systemet', settOptThemeContrastDark: 'Mörkt tema', settAUpdateMode: 'Automatisk uppdatering', - settOptAUpdateSilent: 'Tyst läge', - settOptAUpdateAsk: 'Fråga om nedladdning', + settOptAUpdateSilent: 'Auto', + settOptAUpdateAsk: 'Underrätta', + settOptAUpdateDisabled: 'Manuell', updateDownloadFinished: 'Nedladdningen är slutförd. Klicka för att installera', updateDownloadCanceled: 'Nedladdningen är avbruten', updateDownloadProgress: 'Laddar ner $1%. Klicka för att avbryta', diff --git a/common/loginpage/locale/tr.js b/common/loginpage/locale/tr.js index ceff93c24..b0b7439e6 100644 --- a/common/loginpage/locale/tr.js +++ b/common/loginpage/locale/tr.js @@ -101,8 +101,9 @@ l10n.tr = { settOptThemeAddLocal: 'Yerel tema ekle', settOptThemeContrastDark: 'Kontrast Koyu', settAUpdateMode: 'Güncellemeler', - settOptAUpdateSilent: 'Otomatik güncelleme', - settOptAUpdateAsk: 'Güncellemeleri kontrol et', + settOptAUpdateSilent: 'Otomatik', + settOptAUpdateAsk: 'Bildir', + settOptAUpdateDisabled: 'Manüel', updateDownloadFinished: 'İndirme tamamlandı. Kurmak için tıklayın', updateDownloadCanceled: 'İndirme iptal edildi', updateDownloadProgress: '$1% indiriliyor. Durdurmak için tıklayın', diff --git a/common/loginpage/locale/uk.js b/common/loginpage/locale/uk.js index 97ea3930e..ae71884bb 100644 --- a/common/loginpage/locale/uk.js +++ b/common/loginpage/locale/uk.js @@ -101,8 +101,9 @@ l10n.uk = { settOptThemeAddLocal: 'Додати локальну тему', settOptThemeContrastDark: 'Контрастна темна', settAUpdateMode: 'Оновлення', - settOptAUpdateSilent: 'Автооновлення', - settOptAUpdateAsk: 'Перевіряти оновлення', + settOptAUpdateSilent: 'Авто', + settOptAUpdateAsk: 'Повідомити', + settOptAUpdateDisabled: 'Вручну', updateDownloadFinished: 'Завантаження завершено. Клацніть, щоб інсталювати', updateDownloadCanceled: 'Завантаження скасовано', updateDownloadProgress: 'Завантаження $1%. Клацніть, щоб припинити', diff --git a/common/loginpage/locale/vi.js b/common/loginpage/locale/vi.js index 387010b75..bc46b47bc 100644 --- a/common/loginpage/locale/vi.js +++ b/common/loginpage/locale/vi.js @@ -101,8 +101,9 @@ l10n.vi = { settOptThemeAddLocal: 'Thêm thiết lập nền cục bộ', settOptThemeContrastDark: 'Tương phản tối', settAUpdateMode: 'Cập nhật', - settOptAUpdateSilent: 'Tự động cập nhật', - settOptAUpdateAsk: 'Kiểm tra cập nhật', + settOptAUpdateSilent: 'Tự động', + settOptAUpdateAsk: 'Thông báo', + settOptAUpdateDisabled: 'Thủ công', updateDownloadFinished: 'Đã tải xong. Nhấp để cài đặt', updateDownloadCanceled: 'Đã hủy tải xuống', updateDownloadProgress: 'Đang tải $1%. Nhấp vào để dừng', diff --git a/common/loginpage/locale/zh-CN.js b/common/loginpage/locale/zh-CN.js index 6a567c067..8e052d29e 100644 --- a/common/loginpage/locale/zh-CN.js +++ b/common/loginpage/locale/zh-CN.js @@ -101,9 +101,9 @@ l10n.zh_CN = { settOptThemeAddLocal: '添加本地主题', settOptThemeContrastDark: '暗色对比', settAUpdateMode: '更新', - settOptAUpdateSilent: '自动更新', - settOptAUpdateAsk: '检查更新', - settOptAUpdateDisabled: '不检查更新', + settOptAUpdateSilent: '自动', + settOptAUpdateAsk: '发送通知', + settOptAUpdateDisabled: '手动更改', updateDownloadFinished: '下载完成。点击安装', updateDownloadCanceled: '下载已取消', updateDownloadProgress: '正在下载 $1%。点击停止', diff --git a/common/loginpage/locale/zh-TW.js b/common/loginpage/locale/zh-TW.js index 556738981..59a860833 100644 --- a/common/loginpage/locale/zh-TW.js +++ b/common/loginpage/locale/zh-TW.js @@ -101,8 +101,9 @@ l10n.zh_TW = { settOptThemeAddLocal: '新增本機主題', settOptThemeContrastDark: '暗色对比', settAUpdateMode: '更新', - settOptAUpdateSilent: '自動更新', - settOptAUpdateAsk: '檢查更新', + settOptAUpdateSilent: '自動', + settOptAUpdateAsk: '通知', + settOptAUpdateDisabled: '手動', updateDownloadFinished: '下載完成, 點擊安裝', updateDownloadCanceled: '下載已取消', updateDownloadProgress: '正在下載$1%。 點擊停止', diff --git a/common/loginpage/src/locale.js b/common/loginpage/src/locale.js index 4d61083dc..c791d34a4 100644 --- a/common/loginpage/src/locale.js +++ b/common/loginpage/src/locale.js @@ -134,9 +134,9 @@ l10n.en = { settOptThemeAddLocal: 'Add local theme', settOptThemeContrastDark: 'Contrast Dark', settAUpdateMode: 'Updates', - settOptAUpdateSilent: 'Auto-update', - settOptAUpdateAsk: 'Check for updates', - settOptAUpdateDisabled: 'Don\'t check for updates', + settOptAUpdateSilent: 'Auto', + settOptAUpdateAsk: 'Notify', + settOptAUpdateDisabled: 'Manual', updateDownloadFinished: 'Downloading finished. Click to install', updateDownloadCanceled: 'Downloading canceled', updateDownloadProgress: 'Downloading $1%. Click to stop', From 9a8be624ba5b61f6b980dc684f3f17096b0a83d6 Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Wed, 20 Mar 2024 16:45:29 +0300 Subject: [PATCH 146/316] edited 'settOptDisabled' translations --- common/loginpage/locale/bg.js | 2 +- common/loginpage/locale/cs.js | 2 +- common/loginpage/locale/el.js | 2 +- common/loginpage/locale/fi.js | 2 +- common/loginpage/locale/ko.js | 2 +- common/loginpage/locale/lv.js | 2 +- common/loginpage/locale/nl.js | 2 +- common/loginpage/locale/pl.js | 2 +- common/loginpage/locale/pt-PT.js | 2 +- common/loginpage/locale/sl.js | 2 +- common/loginpage/locale/tr.js | 2 +- common/loginpage/locale/uk.js | 2 +- common/loginpage/locale/vi.js | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/common/loginpage/locale/bg.js b/common/loginpage/locale/bg.js index f314afcc4..cd83a2d3f 100644 --- a/common/loginpage/locale/bg.js +++ b/common/loginpage/locale/bg.js @@ -92,7 +92,7 @@ l10n.bg = { settOptLaunchInTab: 'В раздела', settOptLaunchInWindow: 'В прозореца', settSpellcheckDetection: 'Откриване на езиково спелуване', - settOptDisabled: 'Не проверявай за актуализации', + settOptDisabled: 'Хора с увреждания', settOptEnabled: 'Активирано', aboutChangelog: 'Дневник за промени', updateNoUpdates: 'Приложението е актуално', diff --git a/common/loginpage/locale/cs.js b/common/loginpage/locale/cs.js index fa3106900..fd72f1d89 100644 --- a/common/loginpage/locale/cs.js +++ b/common/loginpage/locale/cs.js @@ -92,7 +92,7 @@ l10n.cs = { settOptLaunchInTab: 'Na kartě', settOptLaunchInWindow: 'V okně', settSpellcheckDetection: 'Detekce pravopisu jazyka', - settOptDisabled: 'Nekontrolovat aktualizace', + settOptDisabled: 'Zakázáno', settOptEnabled: 'Povoleno', aboutChangelog: 'Log změny', updateNoUpdates: 'Aplikace je aktuální', diff --git a/common/loginpage/locale/el.js b/common/loginpage/locale/el.js index ea9697b33..ed76c97c7 100644 --- a/common/loginpage/locale/el.js +++ b/common/loginpage/locale/el.js @@ -92,7 +92,7 @@ l10n.el = { settOptLaunchInTab: 'Σε καρτέλα', settOptLaunchInWindow: 'Σε παράθυρο', settSpellcheckDetection: 'Εντοπισμός ορθογραφικής γλώσσας', - settOptDisabled: 'Να μη γίνεται έλεγχος για ενημερώσεις', + settOptDisabled: 'Απενεργοποιημένο', settOptEnabled: 'Ενεργοποιημένος', aboutChangelog: 'Καταγραφή αλλαγών', updateNoUpdates: 'Η εφαρμογή είναι ενημερωμένη', diff --git a/common/loginpage/locale/fi.js b/common/loginpage/locale/fi.js index e7e04be1d..39f367a2a 100644 --- a/common/loginpage/locale/fi.js +++ b/common/loginpage/locale/fi.js @@ -92,7 +92,7 @@ l10n.fi = { settOptLaunchInTab: 'Välilehdessä', settOptLaunchInWindow: 'Ikkunassa', settSpellcheckDetection: 'Oikeinkirjoituksen tarkistus', - settOptDisabled: 'Älä hae päivityksiä', + settOptDisabled: 'Ei käytössä', settOptEnabled: 'Käytössä', aboutChangelog: 'Muutosloki', updateNoUpdates: 'Sovellus on ajan tasalla', diff --git a/common/loginpage/locale/ko.js b/common/loginpage/locale/ko.js index 5db7afb91..75f738cad 100644 --- a/common/loginpage/locale/ko.js +++ b/common/loginpage/locale/ko.js @@ -92,7 +92,7 @@ l10n.ko = { settOptLaunchInTab: '탭에서', settOptLaunchInWindow: '창에서', settSpellcheckDetection: '맞춤법 감지', - settOptDisabled: '업데이트 확인 안 함', + settOptDisabled: '사용 안 함', settOptEnabled: '활성화됨', aboutChangelog: '체인지로그', updateNoUpdates: '앱이 최신 상태입니다', diff --git a/common/loginpage/locale/lv.js b/common/loginpage/locale/lv.js index a556a5632..829c746ca 100644 --- a/common/loginpage/locale/lv.js +++ b/common/loginpage/locale/lv.js @@ -92,7 +92,7 @@ l10n.lv = { settOptLaunchInTab: 'Cilnē', settOptLaunchInWindow: 'Logā', settSpellcheckDetection: 'Pareizrakstības valodas noteikšana', - settOptDisabled: 'Nemeklēt atjauninājumus', + settOptDisabled: 'Atspējots', settOptEnabled: 'Iespējots', aboutChangelog: 'Izmaiņu žurnāls', updateNoUpdates: 'Lietotne ir atjaunināta', diff --git a/common/loginpage/locale/nl.js b/common/loginpage/locale/nl.js index 357951769..d1c72ba3f 100644 --- a/common/loginpage/locale/nl.js +++ b/common/loginpage/locale/nl.js @@ -92,7 +92,7 @@ settOptLaunchInTab: 'In tabblad', settOptLaunchInWindow: 'In venster', settSpellcheckDetection: 'Spelling taal detectie', - settOptDisabled: 'Niet controleren op updates', + settOptDisabled: 'Gedeactiveerd', settOptEnabled: 'Ingeschakeld', aboutChangelog: 'Changelog', updateNoUpdates: 'App is up-to-date', diff --git a/common/loginpage/locale/pl.js b/common/loginpage/locale/pl.js index 2e1f162d5..20f8bf92b 100644 --- a/common/loginpage/locale/pl.js +++ b/common/loginpage/locale/pl.js @@ -92,7 +92,7 @@ l10n.pl = { settOptLaunchInTab: 'W nowej zakładce', settOptLaunchInWindow: 'W nowym oknie', settSpellcheckDetection: 'Wykrywanie języka pisowni', - settOptDisabled: 'Nie sprawdzaj dostępności aktualizacji', + settOptDisabled: 'Wyłączony', settOptEnabled: 'Włączone', aboutChangelog: 'Dziennik zmian', updateNoUpdates: 'Aplikacja jest aktualna', diff --git a/common/loginpage/locale/pt-PT.js b/common/loginpage/locale/pt-PT.js index 861050520..ebb0263a0 100644 --- a/common/loginpage/locale/pt-PT.js +++ b/common/loginpage/locale/pt-PT.js @@ -92,7 +92,7 @@ l10n.pt_PT = { settOptLaunchInTab: 'Em separador', settOptLaunchInWindow: 'Em janela', settSpellcheckDetection: 'Deteção de idioma de ortografia', - settOptDisabled: 'Não verifique se há atualizações', + settOptDisabled: 'Desativado', settOptEnabled: 'Ativado', aboutChangelog: 'Registo de alterações', updateNoUpdates: 'A aplicação está atualizada', diff --git a/common/loginpage/locale/sl.js b/common/loginpage/locale/sl.js index 1f84ff99d..5d159cf7d 100644 --- a/common/loginpage/locale/sl.js +++ b/common/loginpage/locale/sl.js @@ -92,7 +92,7 @@ l10n.sl = { settOptLaunchInTab: 'V zavihku', settOptLaunchInWindow: 'V oknu', settSpellcheckDetection: 'Zaznavanje črkovanja jezika', - settOptDisabled: 'Ne preverjaj posodobitev', + settOptDisabled: 'Onemogočeno', settOptEnabled: 'Omogočeno', aboutChangelog: 'Dnevnik sprememb', updateNoUpdates: 'Aplikacija je posodobljena', diff --git a/common/loginpage/locale/tr.js b/common/loginpage/locale/tr.js index b0b7439e6..b29572762 100644 --- a/common/loginpage/locale/tr.js +++ b/common/loginpage/locale/tr.js @@ -92,7 +92,7 @@ l10n.tr = { settOptLaunchInTab: 'Sekmede', settOptLaunchInWindow: 'Pencerede', settSpellcheckDetection: 'Yazım dili algılama', - settOptDisabled: 'Güncellemeleri kontrol etme', + settOptDisabled: 'Devre Dışı', settOptEnabled: 'Devrede', aboutChangelog: 'Değişiklik günlüğü', updateNoUpdates: 'Uygulama güncel', diff --git a/common/loginpage/locale/uk.js b/common/loginpage/locale/uk.js index ae71884bb..98b2da0ec 100644 --- a/common/loginpage/locale/uk.js +++ b/common/loginpage/locale/uk.js @@ -92,7 +92,7 @@ l10n.uk = { settOptLaunchInTab: 'У вкладці', settOptLaunchInWindow: 'У вікні', settSpellcheckDetection: 'Визначення мови перевірки правопису', - settOptDisabled: 'Не перевіряти оновлення', + settOptDisabled: 'Заблокован', settOptEnabled: 'Увімкнено', aboutChangelog: 'Журнал змін', updateNoUpdates: 'Застосунок актуальний', diff --git a/common/loginpage/locale/vi.js b/common/loginpage/locale/vi.js index bc46b47bc..7ac6e64e3 100644 --- a/common/loginpage/locale/vi.js +++ b/common/loginpage/locale/vi.js @@ -92,7 +92,7 @@ l10n.vi = { settOptLaunchInTab: 'Trong tab', settOptLaunchInWindow: 'Trong window', settSpellcheckDetection: 'Phát hiện ngôn ngữ chính tả', - settOptDisabled: 'Không kiểm tra cập nhật', + settOptDisabled: 'Không hoạt động', settOptEnabled: 'Đã kích hoạt', aboutChangelog: 'Nhật ký thay đổi', updateNoUpdates: 'Ứng dụng được cập nhật', From fcd8f1521832ddca9622f9274851c0fcee60a267 Mon Sep 17 00:00:00 2001 From: maxkadushkin Date: Wed, 20 Mar 2024 21:51:06 +0300 Subject: [PATCH 147/316] [macos] fix bug 66920 --- .../Code/Controllers/MainWindow/ASCTitleBarController.mm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm b/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm index 781105e07..f34cad94f 100644 --- a/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm +++ b/macos/ONLYOFFICE/Code/Controllers/MainWindow/ASCTitleBarController.mm @@ -108,6 +108,9 @@ - (void)initialize { self.miniaturizeButtonImageViewFullscreen.image = miniaturizeButtonImage; self.standardButtonsFullscreen = @[self.closeButtonFullscreen, self.miniaturizeButtonImageViewFullscreen, self.fullscreenButtonFullscreen]; + if ( [self.view userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft ) + self.standardButtonsFullscreen = [[self.standardButtonsFullscreen reverseObjectEnumerator] allObjects]; + [self.standardButtonsFullscreen enumerateObjectsUsingBlock:^(NSView *standardButtonView, NSUInteger idx, BOOL *stop) { [self.view addSubview:standardButtonView]; }]; From 219358dbfd73d6825600b7e3df9a36a78ff647d9 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 22 Mar 2024 11:28:43 +0200 Subject: [PATCH 148/316] [win] updmanager: disable auto downloading of the service --- win-linux/src/cupdatemanager.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/win-linux/src/cupdatemanager.cpp b/win-linux/src/cupdatemanager.cpp index 43ff2b17d..99eaa2ed8 100644 --- a/win-linux/src/cupdatemanager.cpp +++ b/win-linux/src/cupdatemanager.cpp @@ -901,11 +901,11 @@ void CUpdateManager::onCheckFinished(bool error, bool updateExist, const QString { if ( !error) { if ( updateExist ) { - if (m_packageData->object == "svc") { - __UNLOCK - loadUpdates(); - return; - } else +// if (m_packageData->object == "svc") { +// __UNLOCK +// loadUpdates(); +// return; +// } else if (!m_packageData->isInstallable) { refreshStartPage({"lastcheck", {TXT_AVAILABLE_UPD, version}, BTN_TXT_CHECK, "check", "false"}); m_dialogSchedule->addToSchedule("showUpdateMessage"); From b313c55836203f80f2f8a12e4687ecc68a9f0e6b Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 22 Mar 2024 11:38:34 +0200 Subject: [PATCH 149/316] [win] printdialog: fix collate mode --- win-linux/src/platform_win/printdialog.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/win-linux/src/platform_win/printdialog.cpp b/win-linux/src/platform_win/printdialog.cpp index bce29e2d4..2f234aada 100644 --- a/win-linux/src/platform_win/printdialog.cpp +++ b/win-linux/src/platform_win/printdialog.cpp @@ -300,8 +300,8 @@ QDialog::DialogCode PrintDialog::exec() if (pDevMode->dmFields & DM_COLOR) pDevMode->dmColor = (qt_color_mode == QPrinter::Color) ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME; -// if (pDevMode->dmFields & DM_COLLATE) -// pDevMode->dmCollate = DMCOLLATE_TRUE; + if (pDevMode->dmFields & DM_COLLATE) + pDevMode->dmCollate = m_printer->collateCopies() ? DMCOLLATE_TRUE : DMCOLLATE_FALSE; if (pDevMode->dmFields & DM_DEFAULTSOURCE) pDevMode->dmDefaultSource = (qt_paper_source == QPrinter::Auto) ? DMBIN_AUTO : @@ -444,7 +444,7 @@ QDialog::DialogCode PrintDialog::exec() if (i == 0) m_printer->setFromTo(start > end ? end : start, start > end ? start : end); } - m_printer->setCollateCopies(bool(dlg.Flags & PD_COLLATE)); + m_printer->setCollateCopies(pDevmode->dmCollate == DMCOLLATE_TRUE); m_printer->setDuplex(pDevmode->dmDuplex == DMDUP_VERTICAL ? QPrinter::DuplexLongSide : pDevmode->dmDuplex == DMDUP_HORIZONTAL ? QPrinter::DuplexShortSide : QPrinter::DuplexNone); From 3443c8addcdb3b820e1e7745ed25e79429ee8577 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 22 Mar 2024 17:38:33 +0200 Subject: [PATCH 150/316] [linux] gtkprintdialog: fix collate mode --- win-linux/src/platform_linux/gtkprintdialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win-linux/src/platform_linux/gtkprintdialog.cpp b/win-linux/src/platform_linux/gtkprintdialog.cpp index c58527d4a..2697be0c2 100644 --- a/win-linux/src/platform_linux/gtkprintdialog.cpp +++ b/win-linux/src/platform_linux/gtkprintdialog.cpp @@ -300,7 +300,7 @@ QDialog::DialogCode GtkPrintDialog::exec() GTK_PAGE_SET_ODD }; gtk_print_settings_set_page_set(settings, page_set_arr[0]); - gtk_print_settings_set_collate(settings, FALSE); + gtk_print_settings_set_collate(settings, m_printer->collateCopies() ? TRUE : FALSE); // Qt-Duplex: // DuplexNone = 0 From 3ad93a462ce2d7e6d31ba10fb6751ed971a2dd10 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Mon, 25 Mar 2024 08:10:33 +0200 Subject: [PATCH 151/316] [win-linux] ceditorwindow: comment out unused code --- win-linux/src/windows/ceditorwindow.cpp | 12 ++++++------ win-linux/src/windows/ceditorwindow.h | 2 +- win-linux/src/windows/ceditorwindow_p.h | 18 +++++++++--------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/win-linux/src/windows/ceditorwindow.cpp b/win-linux/src/windows/ceditorwindow.cpp index c564a292d..1fbeb90a1 100644 --- a/win-linux/src/windows/ceditorwindow.cpp +++ b/win-linux/src/windows/ceditorwindow.cpp @@ -354,12 +354,12 @@ void CEditorWindow::captureMouse() #endif } -int CEditorWindow::calcTitleCaptionWidth() -{ - int base_width = (isCustomWindowStyle()) ? m_boxTitleBtns->width() - - (m_pTopButtons[BtnType::Btn_Maximize]->width() * 3) : 0; - return d_ptr->calcTitleLabelWidth(base_width); -} +//int CEditorWindow::calcTitleCaptionWidth() +//{ +// int base_width = (isCustomWindowStyle()) ? m_boxTitleBtns->width() - +// (m_pTopButtons[BtnType::Btn_Maximize]->width() * 3) : 0; +// return d_ptr->calcTitleLabelWidth(base_width); +//} void CEditorWindow::focus() { diff --git a/win-linux/src/windows/ceditorwindow.h b/win-linux/src/windows/ceditorwindow.h index ca2262227..7dc3673d8 100644 --- a/win-linux/src/windows/ceditorwindow.h +++ b/win-linux/src/windows/ceditorwindow.h @@ -78,7 +78,7 @@ class CEditorWindow : public CWindowPlatform void onMoveEvent(const QRect&); // void onExitSizeMove(); void captureMouse(); - virtual int calcTitleCaptionWidth() final; +// virtual int calcTitleCaptionWidth() final; virtual void focus() final; virtual void onCloseEvent() final; virtual void onMinimizeEvent() final; diff --git a/win-linux/src/windows/ceditorwindow_p.h b/win-linux/src/windows/ceditorwindow_p.h index 0d16ef809..bfceec82b 100644 --- a/win-linux/src/windows/ceditorwindow_p.h +++ b/win-linux/src/windows/ceditorwindow_p.h @@ -908,18 +908,18 @@ class CEditorWindowPrivate : public CCefEventsGate return m_panel->data()->hasFeature(L"uitype\":\"fillform"); } - auto calcTitleLabelWidth(int basewidth) const -> int { - if ( iconuser ) - basewidth -= iconuser->width(); +// auto calcTitleLabelWidth(int basewidth) const -> int { +// if ( iconuser ) +// basewidth -= iconuser->width(); - basewidth -= boxtitlelabel->contentsMargins().left() + boxtitlelabel->contentsMargins().right(); - if ( iconcrypted ) - basewidth -= iconcrypted->width(); +// basewidth -= boxtitlelabel->contentsMargins().left() + boxtitlelabel->contentsMargins().right(); +// if ( iconcrypted ) +// basewidth -= iconcrypted->width(); - basewidth -= m_mapTitleButtons.count() * (TITLEBTN_WIDTH + 1) * window->m_dpiRatio; +// basewidth -= m_mapTitleButtons.count() * (TITLEBTN_WIDTH + 1) * window->m_dpiRatio; - return basewidth; - } +// return basewidth; +// } auto customizeTitleLabel() -> void { Q_ASSERT(window->m_boxTitleBtns != nullptr); From 10166beaa7ddad9ad73eb748fa4fe6af187a4afe Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Mon, 25 Mar 2024 10:53:16 +0200 Subject: [PATCH 152/316] [win-linux] ceditorwindow: small refactoring --- win-linux/src/windows/ceditorwindow_p.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/win-linux/src/windows/ceditorwindow_p.h b/win-linux/src/windows/ceditorwindow_p.h index bfceec82b..c337884cb 100644 --- a/win-linux/src/windows/ceditorwindow_p.h +++ b/win-linux/src/windows/ceditorwindow_p.h @@ -895,16 +895,14 @@ class CEditorWindowPrivate : public CCefEventsGate { if ( m_panel->data()->features().empty() ) return true; else if ( m_panel->data()->hasFeature(L"uitype\":\"fillform") ) return true; - else if ( m_panel->data()->hasFrame() ) return false; else return !viewerMode() && (m_panel->data()->isLocal() || m_panel->data()->hasFeature(L"titlebuttons\":")); } auto viewerMode() const -> bool { - if ( m_panel->data()->hasFrame() ) return true; - return m_panel->data()->hasFeature(L"viewmode\":true"); + return m_panel->data()->hasFeature(L"viewmode\":true") || m_panel->data()->hasFrame(); } - auto fillformMode() -> bool { + auto fillformMode() const -> bool { return m_panel->data()->hasFeature(L"uitype\":\"fillform"); } From e9bfebff97f447d6a1badce6ac5b07812513ab26 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Mon, 25 Mar 2024 13:35:09 +0200 Subject: [PATCH 153/316] [win-linux] ceditorwindow: improve title rendering --- win-linux/src/windows/ceditorwindow.cpp | 26 ++--- win-linux/src/windows/ceditorwindow_p.h | 136 +++++++++++------------- 2 files changed, 67 insertions(+), 95 deletions(-) diff --git a/win-linux/src/windows/ceditorwindow.cpp b/win-linux/src/windows/ceditorwindow.cpp index 1fbeb90a1..384a7c830 100644 --- a/win-linux/src/windows/ceditorwindow.cpp +++ b/win-linux/src/windows/ceditorwindow.cpp @@ -62,7 +62,7 @@ CEditorWindow::CEditorWindow(const QRect& rect, CTabPanel* panel) AscAppManager::bindReceiver(panel->cef()->GetId(), d_ptr.get()); AscAppManager::sendCommandTo(panel->cef(), L"editor:config", L"request"); - if (d_ptr->fillformMode()) + if (d_ptr->fillformMode() || d_ptr->panel()->data()->hasError()) d_ptr->ffWindowCustomize(); QTimer::singleShot(200, this, [=]() { @@ -195,23 +195,21 @@ QWidget * CEditorWindow::createMainPanel(QWidget * parent, const QString& title) m_labelTitle = new CElipsisLabel(title, m_boxTitleBtns); m_labelTitle->setObjectName("labelTitle"); + m_labelTitle->setVisible(false); m_labelTitle->setMouseTracking(true); m_labelTitle->setEllipsisMode(Qt::ElideMiddle); m_labelTitle->setAlignment(Qt::AlignCenter); m_labelTitle->setMinimumWidth(100); static_cast(m_boxTitleBtns->layout())->insertWidget(0, m_labelTitle); - if (d_ptr->usedOldEditorVersion) // For old editors only - static_cast(m_boxTitleBtns->layout())->insertStretch(0); - if ( !d_ptr->canExtendTitle() || d_ptr->panel()->data()->hasError()) { + if ( d_ptr->panel()->data()->hasError()) { mainGridLayout->addWidget(m_boxTitleBtns, 0, 0); m_labelTitle->setText(APP_TITLE); - if (d_ptr->panel()->data()->hasError()) mainPanel->setProperty("window", "pretty"); } else { if (d_ptr->panel()->data()->contentType() != AscEditorType::etUndefined) mainPanel->setProperty("window", "pretty"); - int pos = (d_ptr->usedOldEditorVersion) ? 3 : 2; // For old editors only + int pos = 2; auto *pIconSpacer = new QSpacerItem(ICON_SPACER_WIDTH, 5, QSizePolicy::Fixed, QSizePolicy::Fixed); auto *pTopLayout = static_cast(m_boxTitleBtns->layout()); pTopLayout->insertWidget(pos, d_ptr->iconUser()); @@ -247,21 +245,11 @@ QWidget * CEditorWindow::createMainPanel(QWidget * parent, const QString& title) } d_ptr.get()->onScreenScalingFactor(m_dpiRatio); - if (d_ptr->usedOldEditorVersion) // For old editors only - mainGridLayout->addWidget(m_pMainView, 1, 0); - else mainGridLayout->addWidget(m_pMainView, 1, 0, 1, 2); mainGridLayout->setRowStretch(1,1); - if (d_ptr->canExtendTitle() && !d_ptr->panel()->data()->hasError()) { - if (d_ptr->usedOldEditorVersion) // For old editors only - mainGridLayout->addWidget(m_boxTitleBtns, 1, 0, Qt::AlignTop); - else { - m_pSpacer = new QSpacerItem(int(TOP_PANEL_OFFSET*m_dpiRatio), 5, - QSizePolicy::Fixed, QSizePolicy::Fixed); - mainGridLayout->addItem(m_pSpacer, 1, 0, Qt::AlignTop); - mainGridLayout->addWidget(m_boxTitleBtns, 1, 1, Qt::AlignTop); - } + if (isCustomWindowStyle() && !d_ptr->panel()->data()->hasError()) { + mainGridLayout->addWidget(m_boxTitleBtns, 1, 1, Qt::AlignTop); } return mainPanel; } @@ -411,7 +399,7 @@ void CEditorWindow::setScreenScalingFactor(double factor, bool resize) CWindowPlatform::setScreenScalingFactor(factor, resize); if (isCustomWindowStyle()) { m_boxTitleBtns->setFixedHeight(int(TOOLBTN_HEIGHT * factor)); - if (m_pSpacer && !d_ptr->usedOldEditorVersion) { + if (m_pSpacer) { m_pSpacer->changeSize(int(TOP_PANEL_OFFSET*m_dpiRatio), 5, QSizePolicy::Fixed, QSizePolicy::Fixed); } diff --git a/win-linux/src/windows/ceditorwindow_p.h b/win-linux/src/windows/ceditorwindow_p.h index c337884cb..64d641b41 100644 --- a/win-linux/src/windows/ceditorwindow_p.h +++ b/win-linux/src/windows/ceditorwindow_p.h @@ -90,6 +90,7 @@ class CEditorWindowPrivate : public CCefEventsGate CEditorWindow * window = nullptr; QLabel * iconuser = nullptr; bool isPrinting = false, + layoutIsSet = false, isFullScreen = false; CFullScrWidget * fs_parent = nullptr; QLabel * iconcrypted = nullptr; @@ -100,7 +101,6 @@ class CEditorWindowPrivate : public CCefEventsGate public: int titleLeftOffset = 0; - bool usedOldEditorVersion = false; public: CEditorWindowPrivate(CEditorWindow * w) : window(w) {} @@ -132,10 +132,6 @@ class CEditorWindowPrivate : public CCefEventsGate void init(CTabPanel * const p) override { CCefEventsGate::init(p); - if (!m_panel->data()->hasFeature(L"btnhome") || viewerMode() || fillformMode() || m_panel->data()->hasError()) { - usedOldEditorVersion = true; - createHomeButton(); - } } QPushButton * cloneEditorHeaderButton(const QJsonObject& jsonobj) // For old editors only @@ -183,6 +179,23 @@ class CEditorWindowPrivate : public CCefEventsGate window->m_labelTitle->setText(APP_TITLE); changeTheme(GetCurrentTheme().id()); } + + if (!leftboxbuttons) + createHomeButton(); + else { + for (auto it = m_mapTitleButtons.begin(); it != m_mapTitleButtons.end();) { + if (it.key() != "home") { + delete it.value(); + it = m_mapTitleButtons.erase(it); + continue; + } + ++it; + } + } + QHBoxLayout *lut = qobject_cast(window->m_boxTitleBtns->layout()); + if (lut->itemAt(0)->widget() != leftboxbuttons) + lut->insertWidget(0, leftboxbuttons); + leftboxbuttons->show(); } auto getInitials(const QString &name) -> QString { @@ -200,7 +213,7 @@ class CEditorWindowPrivate : public CCefEventsGate auto centerTitle(double dpiRatio)->void { - int left_btns = (viewerMode() || fillformMode() || m_panel->data()->hasError()) ? 1 : 6; + int left_btns = m_mapTitleButtons.size() != 0 ? m_mapTitleButtons.size() : 6; int right_btns = 3; int spacing = window->m_boxTitleBtns->layout()->spacing(); int left_offset = left_btns*TOOLBTN_WIDTH + 3*spacing; // added extra spacing @@ -246,30 +259,37 @@ class CEditorWindowPrivate : public CCefEventsGate void onEditorConfig(int, std::wstring cfg) override { // if ( id == window->holdView(id) ) - if ( !window->isCustomWindowStyle() ) return; - - QJsonParseError jerror; - QJsonDocument jdoc = QJsonDocument::fromJson(QString::fromStdWString(cfg).toUtf8(), &jerror); - if( jerror.error == QJsonParseError::NoError ) { - QJsonObject objRoot = jdoc.object(); + if ( layoutIsSet || !window->isCustomWindowStyle() ) + return; + layoutIsSet = true; - if ( viewerMode() && !fillformMode()) - extendableTitleToSimple(); + if (window->m_labelTitle) + window->m_labelTitle->setVisible(true); - if ( canExtendTitle() ) { + if ( viewerMode() || panel()->data()->features().empty() ) { + extendableTitleToSimple(); + } else + if ( canExtendTitle() ) { + QJsonParseError jerror; + QJsonDocument jdoc = QJsonDocument::fromJson(QString::fromStdWString(cfg).toUtf8(), &jerror); + if ( jerror.error == QJsonParseError::NoError ) { + QJsonObject objRoot = jdoc.object(); if ( objRoot.contains("user") ) { QString _user_name = objRoot["user"].toObject().value("name").toString(); //iconUser()->setToolTip(_user_name); iconUser()->setProperty("ToolTip", _user_name); adjustIconUser(); iconuser->setText(getInitials(_user_name)); + iconuser->setVisible(true); } if ( objRoot.contains("title") /*&& m_mapTitleButtons.empty()*/ ) { const QJsonArray _btns = objRoot["title"].toObject().value("buttons").toArray(); QHBoxLayout * _layout = qobject_cast(window->m_boxTitleBtns->layout()); - if (usedOldEditorVersion) { // For old editors only + if (!m_panel->data()->hasFeature(L"btnhome")) { // For old editors only + if (!leftboxbuttons) + createHomeButton(); for (const auto jv: _btns) { const QJsonObject obj = jv.toObject(); if ( !m_mapTitleButtons.contains(obj["action"].toString()) ) @@ -278,14 +298,19 @@ class CEditorWindowPrivate : public CCefEventsGate if ( _layout->itemAt(0)->widget() != leftboxbuttons ) _layout->insertWidget(0, leftboxbuttons); + } else { + if (auto mainGridLayout = qobject_cast(window->m_pMainPanel->layout())) { + window->m_pSpacer = new QSpacerItem(int(TOP_PANEL_OFFSET*window->m_dpiRatio), 5, QSizePolicy::Fixed, QSizePolicy::Fixed); + mainGridLayout->addItem(window->m_pSpacer, 1, 0, Qt::AlignTop); + } } } // update title caption for elipsis window->updateTitleCaption(); } - centerTitle(window->m_dpiRatio); } + centerTitle(window->m_dpiRatio); } void onEditorActionRequest(int, const QString& json) override @@ -332,14 +357,6 @@ class CEditorWindowPrivate : public CCefEventsGate void onDocumentReady(int uid) override { // if (window->holdView(uid)) - if ( panel()->data()->features().empty() ) { - panel()->data()->setFeatures(L"old version of editor"); - extendableTitleToSimple(); - } - if (m_panel->data()->hasFeature(L"btnhome") && usedOldEditorVersion && !viewerMode() && !fillformMode()) { // For old editors only - usedOldEditorVersion = false; - adjustToNewEditorVersion(); - } panel()->setReady(); if (window->isActiveWindow()) window->focus(); @@ -351,7 +368,7 @@ class CEditorWindowPrivate : public CCefEventsGate CCefEventsGate::onDocumentName(data); if ( window->isCustomWindowStyle() ) { - if ( !canExtendTitle() /*|| !window->isCustomWindowStyle()*/ ) { + if ( !canExtendTitle() && !fillformMode() ) { window->m_labelTitle->setText(APP_TITLE); } else { window->setWindowTitle(m_panel->data()->title()); @@ -364,7 +381,7 @@ class CEditorWindowPrivate : public CCefEventsGate { CCefEventsGate::onDocumentType(id, type); - if ( canExtendTitle() && window->isCustomWindowStyle() ) { + if ( /*canExtendTitle() &&*/ window->isCustomWindowStyle() ) { window->m_pMainPanel->setProperty("window", "pretty"); changeTheme(GetCurrentTheme().id()); } @@ -405,10 +422,8 @@ class CEditorWindowPrivate : public CCefEventsGate window->m_pMainPanel->setProperty("uitheme", QString::fromStdWString(GetActualTheme(theme))); window->m_pMainPanel->setProperty("uithemetype", GetCurrentTheme().stype()); if (!viewerMode()) { - if (usedOldEditorVersion) { // For old editors only foreach (auto btn, m_mapTitleButtons) btn->setIconOpacity(GetColorByRole(ecrButtonNormalOpacity)); - } } else { window->m_pMainPanel->setProperty("window", "pretty"); if ( m_mapTitleButtons.contains("home") ) @@ -431,7 +446,7 @@ class CEditorWindowPrivate : public CCefEventsGate { CCefEventsGate::onDocumentChanged(id, state); if ( panel()->data()->hasChanges() != state ) { - if ( canExtendTitle() && window->isCustomWindowStyle() ) { + if ( (canExtendTitle() || fillformMode()) && window->isCustomWindowStyle() ) { window->setWindowTitle(m_panel->data()->title()); window->m_boxTitleBtns->repaint(); } @@ -622,22 +637,6 @@ class CEditorWindowPrivate : public CCefEventsGate m_panel->data()->setHasError(); if (window->isCustomWindowStyle() && canExtendTitle()) { extendableTitleToSimple(false); - if (!leftboxbuttons) - createHomeButton(); - else { - for (auto it = m_mapTitleButtons.begin(); it != m_mapTitleButtons.end();) { - if (it.key() != "home") { - delete it.value(); - it = m_mapTitleButtons.erase(it); - continue; - } - ++it; - } - } - QHBoxLayout *lut = qobject_cast(window->m_boxTitleBtns->layout()); - if (lut->itemAt(0)->widget() != leftboxbuttons) - lut->insertWidget(0, leftboxbuttons); - leftboxbuttons->show(); centerTitle(window->m_dpiRatio); } } @@ -667,7 +666,8 @@ class CEditorWindowPrivate : public CCefEventsGate btn->setFixedSize(QSize(int(TITLEBTN_WIDTH*f), int(TOOLBTN_HEIGHT*f))); btn->setIconSize(QSize(20,20) * f); } - centerTitle(f); + if (layoutIsSet) + centerTitle(f); } } @@ -693,7 +693,7 @@ class CEditorWindowPrivate : public CCefEventsGate window->show(false); // _fs_widget->view()->resize(_fs_widget->size().width(), _fs_widget->size().height()-1); - if (usedOldEditorVersion) { // For old editors only + if (m_mapTitleButtons.size() > 1) { // For old editors only qobject_cast(window->m_pMainPanel->layout())->addWidget(_fs_widget, 1, 0); } else { qobject_cast(window->m_pMainPanel->layout())->addWidget(_fs_widget, 1, 0, 1, 2); @@ -780,6 +780,7 @@ class CEditorWindowPrivate : public CCefEventsGate if ( !iconuser ) { iconuser = new QLabel(window->m_boxTitleBtns); iconuser->setObjectName("iconuser"); + iconuser->setVisible(false); iconuser->setContentsMargins(0,0,0,0); iconuser->setAlignment(Qt::AlignCenter); } @@ -826,9 +827,8 @@ class CEditorWindowPrivate : public CCefEventsGate bool is_read_only = panel()->data()->hasFeature(L"readonly\":true"); panel()->data()->setFeatures(f); - if ( m_panel->data()->hasFeature(L"uitype\":\"fillform") ) { - ffWindowCustomize(); - centerTitle(window->m_dpiRatio); + if ( !layoutIsSet && fillformMode() ) { + ffWindowCustomize(); } if ( panel()->data()->hasFeature(L"crypted\":true") && boxtitlelabel && !iconcrypted ) { @@ -848,7 +848,7 @@ class CEditorWindowPrivate : public CCefEventsGate if( jerror.error == QJsonParseError::NoError ) { QJsonObject objRoot = jdoc.object(); - if ( usedOldEditorVersion ) { // For old editors only + if ( m_mapTitleButtons.size() > 0 ) { // For old editors only if (objRoot.contains("disabled")) { QJsonObject _disabled = objRoot["disabled"].toObject(); @@ -894,7 +894,7 @@ class CEditorWindowPrivate : public CCefEventsGate bool canExtendTitle() const { if ( m_panel->data()->features().empty() ) return true; - else if ( m_panel->data()->hasFeature(L"uitype\":\"fillform") ) return true; + else if ( fillformMode() ) return false; else return !viewerMode() && (m_panel->data()->isLocal() || m_panel->data()->hasFeature(L"titlebuttons\":")); } @@ -924,11 +924,9 @@ class CEditorWindowPrivate : public CCefEventsGate QHBoxLayout * _layout = qobject_cast(window->m_boxTitleBtns->layout()); _layout->removeWidget(window->m_labelTitle); - if (!usedOldEditorVersion) { QLayoutItem *stretch = _layout->takeAt(0); if (stretch) delete stretch; - } boxtitlelabel = new QWidget(window->m_boxTitleBtns); boxtitlelabel->setLayout(new QHBoxLayout(boxtitlelabel)); boxtitlelabel->layout()->setSpacing(0); @@ -938,31 +936,17 @@ class CEditorWindowPrivate : public CCefEventsGate if ( m_panel->data()->hasFeature(L"crypted\":true") && !iconcrypted ) { iconCrypted(); } - - if (usedOldEditorVersion) { // For old editors only - _layout->insertWidget(1, boxtitlelabel); - if ( _layout->itemAt(0)->widget() != leftboxbuttons ) - _layout->insertWidget(0, leftboxbuttons); - } else { _layout->insertWidget(0, boxtitlelabel); - } } auto ffWindowCustomize() -> void { - Q_ASSERT(window->m_boxTitleBtns != nullptr); - QGridLayout * const _layout = static_cast(window->m_pMainPanel->layout()); - if ( !_layout->itemAtPosition(0,0) && !_layout->findChild(window->m_boxTitleBtns->objectName()) ) { - _layout->addWidget(window->m_boxTitleBtns,0,0,Qt::AlignTop); - if (iconuser) - iconuser->hide(); - auto layout = qobject_cast(window->m_boxTitleBtns->layout()); - auto stretch = layout->takeAt(1); - if (stretch) - delete stretch; - stretch = layout->takeAt(2); - if (stretch) - delete stretch; - } + if ( layoutIsSet || !window->isCustomWindowStyle() ) + return; + layoutIsSet = true; + if (window->m_labelTitle) + window->m_labelTitle->setVisible(true); + extendableTitleToSimple(false); + centerTitle(window->m_dpiRatio); } }; From e46aa486afbe753ed67505fa805f0ecb0d704efc Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Mon, 25 Mar 2024 13:38:28 +0200 Subject: [PATCH 154/316] [win-linux] ceditorwindow: comment out unused code --- win-linux/src/windows/ceditorwindow_p.h | 66 ++++++++++++------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/win-linux/src/windows/ceditorwindow_p.h b/win-linux/src/windows/ceditorwindow_p.h index 64d641b41..9d704938e 100644 --- a/win-linux/src/windows/ceditorwindow_p.h +++ b/win-linux/src/windows/ceditorwindow_p.h @@ -320,39 +320,39 @@ class CEditorWindowPrivate : public CCefEventsGate } } - void adjustToNewEditorVersion() // For old editors only - { - if (window->isCustomWindowStyle()) { - leftboxbuttons->hide(); - auto layout = qobject_cast(window->m_boxTitleBtns->layout()); - if (canExtendTitle()) { - auto icon = layout->takeAt(3); - if (icon && icon->widget()) - layout->insertWidget(2, icon->widget()); - } - auto stretch = layout->takeAt(1); - if (stretch) - delete stretch; - auto mainGridLayout = dynamic_cast(window->m_pMainPanel->layout()); - if (mainGridLayout) { - auto mainView = mainGridLayout->itemAtPosition(1, 0); - if (mainView) - mainGridLayout->removeItem(mainView); - QLayoutItem *boxTitleBtns = canExtendTitle() ? mainGridLayout->itemAtPosition(1, 0) : nullptr; - if (boxTitleBtns) - mainGridLayout->removeItem(boxTitleBtns); - - if (mainView && mainView->widget()) - mainGridLayout->addWidget(mainView->widget(), 1, 0, 1, 2); - if (boxTitleBtns && boxTitleBtns->widget()) { - mainGridLayout->addWidget(boxTitleBtns->widget(), 1, 1, Qt::AlignTop); - window->m_pSpacer = new QSpacerItem(int(TOP_PANEL_OFFSET*window->m_dpiRatio), 5, - QSizePolicy::Fixed, QSizePolicy::Fixed); - mainGridLayout->addItem(window->m_pSpacer, 1, 0, Qt::AlignTop); - } - } - } - } +// void adjustToNewEditorVersion() // For old editors only +// { +// if (window->isCustomWindowStyle()) { +// leftboxbuttons->hide(); +// auto layout = qobject_cast(window->m_boxTitleBtns->layout()); +// if (canExtendTitle()) { +// auto icon = layout->takeAt(3); +// if (icon && icon->widget()) +// layout->insertWidget(2, icon->widget()); +// } +// auto stretch = layout->takeAt(1); +// if (stretch) +// delete stretch; +// auto mainGridLayout = dynamic_cast(window->m_pMainPanel->layout()); +// if (mainGridLayout) { +// auto mainView = mainGridLayout->itemAtPosition(1, 0); +// if (mainView) +// mainGridLayout->removeItem(mainView); +// QLayoutItem *boxTitleBtns = canExtendTitle() ? mainGridLayout->itemAtPosition(1, 0) : nullptr; +// if (boxTitleBtns) +// mainGridLayout->removeItem(boxTitleBtns); + +// if (mainView && mainView->widget()) +// mainGridLayout->addWidget(mainView->widget(), 1, 0, 1, 2); +// if (boxTitleBtns && boxTitleBtns->widget()) { +// mainGridLayout->addWidget(boxTitleBtns->widget(), 1, 1, Qt::AlignTop); +// window->m_pSpacer = new QSpacerItem(int(TOP_PANEL_OFFSET*window->m_dpiRatio), 5, +// QSizePolicy::Fixed, QSizePolicy::Fixed); +// mainGridLayout->addItem(window->m_pSpacer, 1, 0, Qt::AlignTop); +// } +// } +// } +// } void onDocumentReady(int uid) override { From 3489b6f632a50c580a276ccf8408423bbacba857 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Mon, 25 Mar 2024 13:38:50 +0200 Subject: [PATCH 155/316] [win-linux] ceditorwindow: small refactoring --- win-linux/src/windows/ceditorwindow.cpp | 4 ++-- win-linux/src/windows/ceditorwindow_p.h | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/win-linux/src/windows/ceditorwindow.cpp b/win-linux/src/windows/ceditorwindow.cpp index 384a7c830..bb5a9b1e3 100644 --- a/win-linux/src/windows/ceditorwindow.cpp +++ b/win-linux/src/windows/ceditorwindow.cpp @@ -205,7 +205,7 @@ QWidget * CEditorWindow::createMainPanel(QWidget * parent, const QString& title) if ( d_ptr->panel()->data()->hasError()) { mainGridLayout->addWidget(m_boxTitleBtns, 0, 0); m_labelTitle->setText(APP_TITLE); - mainPanel->setProperty("window", "pretty"); + mainPanel->setProperty("window", "pretty"); } else { if (d_ptr->panel()->data()->contentType() != AscEditorType::etUndefined) mainPanel->setProperty("window", "pretty"); @@ -245,7 +245,7 @@ QWidget * CEditorWindow::createMainPanel(QWidget * parent, const QString& title) } d_ptr.get()->onScreenScalingFactor(m_dpiRatio); - mainGridLayout->addWidget(m_pMainView, 1, 0, 1, 2); + mainGridLayout->addWidget(m_pMainView, 1, 0, 1, 2); mainGridLayout->setRowStretch(1,1); if (isCustomWindowStyle() && !d_ptr->panel()->data()->hasError()) { diff --git a/win-linux/src/windows/ceditorwindow_p.h b/win-linux/src/windows/ceditorwindow_p.h index 9d704938e..0dee726b9 100644 --- a/win-linux/src/windows/ceditorwindow_p.h +++ b/win-linux/src/windows/ceditorwindow_p.h @@ -422,8 +422,8 @@ class CEditorWindowPrivate : public CCefEventsGate window->m_pMainPanel->setProperty("uitheme", QString::fromStdWString(GetActualTheme(theme))); window->m_pMainPanel->setProperty("uithemetype", GetCurrentTheme().stype()); if (!viewerMode()) { - foreach (auto btn, m_mapTitleButtons) - btn->setIconOpacity(GetColorByRole(ecrButtonNormalOpacity)); + foreach (auto btn, m_mapTitleButtons) + btn->setIconOpacity(GetColorByRole(ecrButtonNormalOpacity)); } else { window->m_pMainPanel->setProperty("window", "pretty"); if ( m_mapTitleButtons.contains("home") ) @@ -924,9 +924,8 @@ class CEditorWindowPrivate : public CCefEventsGate QHBoxLayout * _layout = qobject_cast(window->m_boxTitleBtns->layout()); _layout->removeWidget(window->m_labelTitle); - QLayoutItem *stretch = _layout->takeAt(0); - if (stretch) - delete stretch; + if (QLayoutItem *stretch = _layout->takeAt(0)) + delete stretch; boxtitlelabel = new QWidget(window->m_boxTitleBtns); boxtitlelabel->setLayout(new QHBoxLayout(boxtitlelabel)); boxtitlelabel->layout()->setSpacing(0); @@ -936,7 +935,7 @@ class CEditorWindowPrivate : public CCefEventsGate if ( m_panel->data()->hasFeature(L"crypted\":true") && !iconcrypted ) { iconCrypted(); } - _layout->insertWidget(0, boxtitlelabel); + _layout->insertWidget(0, boxtitlelabel); } auto ffWindowCustomize() -> void { From ab93bc5cc66f1bce3136594142acbf46189fbde2 Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Mon, 25 Mar 2024 13:43:00 +0200 Subject: [PATCH 156/316] [win-linux] casctabdata: add accumulation of features --- .../src/cascapplicationmanagerwrapper.cpp | 4 +- win-linux/src/casctabdata.cpp | 41 +++++++++++++++---- win-linux/src/casctabdata.h | 1 - win-linux/src/ccefeventstransformer.cpp | 2 +- 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/win-linux/src/cascapplicationmanagerwrapper.cpp b/win-linux/src/cascapplicationmanagerwrapper.cpp index 2b14d3735..e3eaee3f0 100644 --- a/win-linux/src/cascapplicationmanagerwrapper.cpp +++ b/win-linux/src/cascapplicationmanagerwrapper.cpp @@ -212,7 +212,7 @@ bool CAscApplicationManagerWrapper::processCommonEvent(NSEditorApi::CAscCefMenuE if ( !((pData->get_Param()).find(L"fillform") == std::wstring::npos) ) { if ( m_receivers.find(sid) != m_receivers.end() ) - m_receivers[sid]->onWebAppsFeatures(sid,L"\"uitype\":\"fillform\""); + m_receivers[sid]->onWebAppsFeatures(sid,L"{\"uitype\":\"fillform\"}"); } if ( !((pData->get_Param()).find(L"framesize") == std::wstring::npos) ) { @@ -230,7 +230,7 @@ bool CAscApplicationManagerWrapper::processCommonEvent(NSEditorApi::CAscCefMenuE const QSize s = view->geometry().size() / Utils::getScreenDpiRatioByWidget(view); if ( abs(s.width() - _frame_w) > 1 || abs(s.height() - _frame_h) > 1 ) { - const std::wstring feature = L"\"hasframe\":true"; + const std::wstring feature = L"{\"hasframe\":true}"; if ( m_receivers.find(sid) != m_receivers.end() ) m_receivers[sid]->onWebAppsFeatures(sid, feature); else m_pMainWindow->onWebAppsFeatures(sid, feature); diff --git a/win-linux/src/casctabdata.cpp b/win-linux/src/casctabdata.cpp index b6401c39b..099ea2d03 100644 --- a/win-linux/src/casctabdata.cpp +++ b/win-linux/src/casctabdata.cpp @@ -31,6 +31,8 @@ */ #include "casctabdata.h" +#include +#include using namespace std; @@ -174,7 +176,35 @@ void CAscTabData::setEventLoadSupported(bool value) void CAscTabData::setFeatures(const wstring& fs) { - _features = fs; + QJsonParseError err; + QJsonDocument doc = QJsonDocument::fromJson(QString::fromStdWString(fs).toUtf8(), &err); + if (err.error == QJsonParseError::NoError) { + QJsonObject obj = doc.object(); + if (_features.empty()) { + _features = QString(QJsonDocument(obj).toJson(QJsonDocument::Compact)).toStdWString(); +// qDebug() << QString::fromStdWString(_features); + } else { + QJsonDocument src_doc = QJsonDocument::fromJson(QString::fromStdWString(_features).toUtf8(), &err); + if (err.error == QJsonParseError::NoError) { + QJsonObject src_obj = src_doc.object(); + QVariantMap map = src_obj.toVariantMap(); +#if (QT_VERSION < QT_VERSION_CHECK(5,15,0)) + QVariantMap fs_map = obj.toVariantMap(); + for (QVariantMap::iterator it = fs_map.begin(); it != fs_map.end(); it++) + map.insert(it.key(), it.value()); +#else + map.insert(obj.toVariantMap()); +#endif + QJsonObject res = QJsonObject::fromVariantMap(map); + _features = QString(QJsonDocument(res).toJson(QJsonDocument::Compact)).toStdWString(); +// qDebug() << QString::fromStdWString(_features); + } else { +// qDebug() << "JSON has error: " << QString::fromStdWString(_features); + } + } + } else { +// qDebug() << "JSON has error: " << QString::fromStdWString(fs); + } if ( hasFeature(L"readonly\":true") ) { _is_readonly = true; @@ -185,13 +215,6 @@ void CAscTabData::setFeatures(const wstring& fs) if ( hasFeature(L"readonly\":false") ) { _is_readonly = false; } - - if ( hasFeature(L"hasframe\":true") ) { - _has_frame = true; - } else - if ( hasFeature(L"hasframe\":false") ) { - _has_frame = false; - } } wstring CAscTabData::features() const @@ -212,7 +235,7 @@ bool CAscTabData::hasFeature(const wstring& f) const bool CAscTabData::hasFrame() const { - return _has_frame; + return hasFeature(L"hasframe\":true"); } bool CAscTabData::hasError() const diff --git a/win-linux/src/casctabdata.h b/win-linux/src/casctabdata.h index 8b48d130f..0dc16f9f8 100644 --- a/win-linux/src/casctabdata.h +++ b/win-linux/src/casctabdata.h @@ -79,7 +79,6 @@ struct CAscTabData _has_changes = false; bool _is_closed = false; bool _is_local; - bool _has_frame = false; bool _has_error = false; CefType _vtype; std::wstring _url; diff --git a/win-linux/src/ccefeventstransformer.cpp b/win-linux/src/ccefeventstransformer.cpp index cf5bd88ec..88d969f83 100644 --- a/win-linux/src/ccefeventstransformer.cpp +++ b/win-linux/src/ccefeventstransformer.cpp @@ -232,7 +232,7 @@ void CCefEventsTransformer::OnEvent(QObject * target, NSEditorApi::CAscCefMenuEv } else /* webapps:events is deprecated. used for back compatibility for awhile */ if ( !(cmd.find(L"webapps:events") == std::wstring::npos) ) { - QMetaObject::invokeMethod( target, "onWebAppsFeatures", Qt::QueuedConnection, Q_ARG(int, event->get_SenderId()), Q_ARG(std::wstring, L"eventloading:true") ); + QMetaObject::invokeMethod( target, "onWebAppsFeatures", Qt::QueuedConnection, Q_ARG(int, event->get_SenderId()), Q_ARG(std::wstring, L"{\"eventloading\":true}") ); } else if ( !(cmd.find(L"webapps:features") == std::wstring::npos) ) { QMetaObject::invokeMethod(target, "onWebAppsFeatures", Qt::QueuedConnection, From 8dbc3e26d9502273317974f6cec40f7e3952220e Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Mon, 25 Mar 2024 13:44:16 +0200 Subject: [PATCH 157/316] [win-linux] cascappmanager: fix hasframe feature --- .../src/cascapplicationmanagerwrapper.cpp | 53 +++++++++++-------- win-linux/src/cascapplicationmanagerwrapper.h | 1 + 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/win-linux/src/cascapplicationmanagerwrapper.cpp b/win-linux/src/cascapplicationmanagerwrapper.cpp index e3eaee3f0..8ba76e188 100644 --- a/win-linux/src/cascapplicationmanagerwrapper.cpp +++ b/win-linux/src/cascapplicationmanagerwrapper.cpp @@ -114,6 +114,29 @@ std::wstring CAscApplicationManagerWrapper::GetExternalSchemeName() return !scheme.empty() ? scheme.back() != L':' ? scheme + L":" : scheme : L""; } +void CAscApplicationManagerWrapper::setHasFrameFeature(CCefView *cef, const wstring ¶m, int sid) +{ + if (param.find(L"framesize") != std::wstring::npos) { + if (CCefViewWidgetImpl * _impl = cef->GetWidgetImpl()) { + QJsonParseError err; + const QJsonDocument doc = QJsonDocument::fromJson(QString::fromStdWString(param).toUtf8(), &err); + if ( err.error == QJsonParseError::NoError ) { + const QJsonObject obj = doc.object()["framesize"].toObject(); + int _frame_w = obj["width"].toInt(), + _frame_h = obj["height"].toInt(); + + QCefView * view = static_cast(_impl); + const QSize s = view->size() / Utils::getScreenDpiRatioByWidget(view); + std::wstring feature = L"{\"hasframe\":"; + feature += ( abs(s.width() - _frame_w) > 1 || abs(s.height() - _frame_h) > 1 ) ? L"true}" : L"false}"; + if ( m_receivers.find(sid) != m_receivers.end() ) + m_receivers[sid]->onWebAppsFeatures(sid, feature); + else m_pMainWindow->onWebAppsFeatures(sid, feature); + } + } + } +} + void CAscApplicationManagerWrapper::OnEvent(CAscCefMenuEvent * event) { if ( event->m_nType == ASC_MENU_EVENT_TYPE_CEF_EXECUTE_COMMAND ) { @@ -215,29 +238,7 @@ bool CAscApplicationManagerWrapper::processCommonEvent(NSEditorApi::CAscCefMenuE m_receivers[sid]->onWebAppsFeatures(sid,L"{\"uitype\":\"fillform\"}"); } - if ( !((pData->get_Param()).find(L"framesize") == std::wstring::npos) ) { - CCefViewWidgetImpl * _impl = ptr->GetWidgetImpl(); - if ( _impl ) { - QJsonParseError jerror; - const QJsonDocument jdoc = QJsonDocument::fromJson(QString::fromStdWString(pData->get_Param()).toUtf8(), &jerror); - - if( jerror.error == QJsonParseError::NoError ) { - const QJsonObject obj = jdoc.object()["framesize"].toObject(); - int _frame_w = obj["width"].toInt(), - _frame_h = obj["height"].toInt(); - - QCefView * view = static_cast(_impl); - const QSize s = view->geometry().size() / Utils::getScreenDpiRatioByWidget(view); - - if ( abs(s.width() - _frame_w) > 1 || abs(s.height() - _frame_h) > 1 ) { - const std::wstring feature = L"{\"hasframe\":true}"; - if ( m_receivers.find(sid) != m_receivers.end() ) - m_receivers[sid]->onWebAppsFeatures(sid, feature); - else m_pMainWindow->onWebAppsFeatures(sid, feature); - } - } - } - } + setHasFrameFeature(ptr, pData->get_Param(), sid); auto * editor = editorWindowFromViewId(event->get_SenderId()); if ( editor && editor->isCustomWindowStyle() ) { @@ -254,6 +255,12 @@ bool CAscApplicationManagerWrapper::processCommonEvent(NSEditorApi::CAscCefMenuE } return true; } else + if ( cmd.compare(L"webapps:features") == 0 ) { + int sid = event->get_SenderId(); + if (CCefView * ptr = GetViewById(sid)) + setHasFrameFeature(ptr, pData->get_Param(), sid); + return false; + } else if ( cmd.compare(L"portal:login") == 0 ) { AscAppManager::sendCommandTo(SEND_TO_ALL_START_PAGE, L"portal:login", pData->get_Param()); if ( m_pMainWindow ) { diff --git a/win-linux/src/cascapplicationmanagerwrapper.h b/win-linux/src/cascapplicationmanagerwrapper.h index 63fc6a1e0..f8c969d18 100644 --- a/win-linux/src/cascapplicationmanagerwrapper.h +++ b/win-linux/src/cascapplicationmanagerwrapper.h @@ -140,6 +140,7 @@ class CAscApplicationManagerWrapper : public QObject, public QAscApplicationMana void sendSettings(const std::wstring& opts); void applyTheme(const std::wstring&, bool force = false); void handleDeeplinkActions(const std::vector& actions); + void setHasFrameFeature(CCefView*, const std::wstring&, int); CMainWindow * prepareMainWindow(const QRect& r = QRect()); CMainWindow * mainWindowFromViewId(int uid) const; From ac00e3c25f9fee8aa109d59fb8e1dbd8b07c09b0 Mon Sep 17 00:00:00 2001 From: Maria-Sukhova Date: Tue, 26 Mar 2024 15:43:11 +0300 Subject: [PATCH 158/316] updated no, lo --- common/loginpage/locale/lo.js | 1 + common/loginpage/locale/no.js | 1 + 2 files changed, 2 insertions(+) diff --git a/common/loginpage/locale/lo.js b/common/loginpage/locale/lo.js index 73d42df0f..3c4b58553 100644 --- a/common/loginpage/locale/lo.js +++ b/common/loginpage/locale/lo.js @@ -91,4 +91,5 @@ l10n.lo = { settOptLaunchMode: 'ເປີດແຟ້ມທ', settOptLaunchInTab: 'ໃນຊ່ອງ', settOptLaunchInWindow: 'ໃນປ່ອງ', + settOptDisabled: 'ປິດ', } diff --git a/common/loginpage/locale/no.js b/common/loginpage/locale/no.js index 2f48ae378..f7438314c 100644 --- a/common/loginpage/locale/no.js +++ b/common/loginpage/locale/no.js @@ -91,4 +91,5 @@ l10n.no = { settOptLaunchMode: 'Åpne fil', settOptLaunchInTab: 'I fanegruppe', settOptLaunchInWindow: 'I vindu', + settOptDisabled: 'Deaktivert', } From cb56e3e33441592651d311a9713be18c1d505cee Mon Sep 17 00:00:00 2001 From: SimplestStudio Date: Fri, 29 Mar 2024 11:14:46 +0200 Subject: [PATCH 159/316] [win-linux] add feature: lock portals --- win-linux/src/cascapplicationmanagerwrapper.cpp | 9 ++++++--- win-linux/src/chelp.cpp | 2 ++ win-linux/src/main.cpp | 8 ++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/win-linux/src/cascapplicationmanagerwrapper.cpp b/win-linux/src/cascapplicationmanagerwrapper.cpp index 8ba76e188..758fb82f3 100644 --- a/win-linux/src/cascapplicationmanagerwrapper.cpp +++ b/win-linux/src/cascapplicationmanagerwrapper.cpp @@ -301,12 +301,15 @@ bool CAscApplicationManagerWrapper::processCommonEvent(NSEditorApi::CAscCefMenuE // RELEASEINTERFACE(event); return true; } else -#ifdef Q_OS_WIN if ( cmd.find(L"app:onready") != std::wstring::npos ) { - if ( !IsWindowsVistaOrGreater() && !InputArgs::contains(L"--xp-unlock-portals")) // TODO: remove --xp-unlock-portals in ver 7.4, for tests only + GET_REGISTRY_USER(reg_user) + if (reg_user.value("lockPortals", false).toBool() +#ifdef Q_OS_WIN + || !IsWindowsVistaOrGreater() +#endif + ) sendCommandTo(SEND_TO_ALL_START_PAGE, "panel:hide", "connect"); } else -#endif if ( cmd.compare(0, 8, L"settings") == 0 ) { if ( cmd.rfind(L"apply") != wstring::npos ) { applySettings(pData->get_Param()); diff --git a/win-linux/src/chelp.cpp b/win-linux/src/chelp.cpp index b585f5340..a2ccc999d 100644 --- a/win-linux/src/chelp.cpp +++ b/win-linux/src/chelp.cpp @@ -62,6 +62,8 @@ void CHelp::out() " --xdg-desktop-portal use portals instead of gtk file chooser (the flag is saved for subsequent sessions)\n" " --xdg-desktop-portal=default use portals instead of gtk file chooser for current session\n" " --native-file-dialog use non Qt dialog\n" + " --lock-portals force hide the Connect to the cloud button on the start page" + " --unlock-portals disable forced hiding of the Connect to the cloud button on the start page" " --updates-appcast-channel=dev set development URL for updates\n" " --updates-interval=
+