diff --git a/api-types/index.ts b/api-types/index.ts index d48fd1dc..6918bd70 100644 --- a/api-types/index.ts +++ b/api-types/index.ts @@ -38,30 +38,36 @@ export type DesktopAPI = { onBrowserHistoryPush: (listener: (pathName: string) => void) => () => void; sendBrowserHistoryPush: (path: string) => void; - // Calls widget - openLinkFromCallsWidget: (url: string) => void; - openScreenShareModal: () => void; - onScreenShared: (listener: (sourceID: string, withAudio: boolean) => void) => () => void; - callsWidgetConnected: (callID: string, sessionID: string) => void; - onJoinCallRequest: (listener: (callID: string) => void) => () => void; - resizeCallsWidget: (width: number, height: number) => void; - focusPopout: () => void; - leaveCall: () => void; - sendCallsError: (err: string, callID?: string, errMsg?: string) => void; - - // Calls plugin - getDesktopSources: (opts: DesktopSourcesOptions) => Promise; - onOpenScreenShareModal: (listener: () => void) => () => void; - shareScreen: (sourceID: string, withAudi: boolean) => void; + // Calls joinCall: (opts: { callID: string; title: string; rootID: string; channelURL: string; }) => Promise<{callID: string; sessionID: string}>; - sendJoinCallRequest: (callId: string) => void; + leaveCall: () => void; + + callsWidgetConnected: (callID: string, sessionID: string) => void; + resizeCallsWidget: (width: number, height: number) => void; + + sendCallsError: (err: string, callID?: string, errMsg?: string) => void; onCallsError: (listener: (err: string, callID?: string, errMsg?: string) => void) => () => void; + getDesktopSources: (opts: DesktopSourcesOptions) => Promise; + + openScreenShareModal: () => void; + onOpenScreenShareModal: (listener: () => void) => () => void; + + shareScreen: (sourceID: string, withAudio: boolean) => void; + onScreenShared: (listener: (sourceID: string, withAudio: boolean) => void) => () => void; + + sendJoinCallRequest: (callId: string) => void; + onJoinCallRequest: (listener: (callID: string) => void) => () => void; + + openLinkFromCalls: (url: string) => void; + + focusPopout: () => void; + // Utility unregister: (channel: string) => void; } diff --git a/api-types/lib/index.d.ts b/api-types/lib/index.d.ts index 9ebc44a3..a92e2b2c 100644 --- a/api-types/lib/index.d.ts +++ b/api-types/lib/index.d.ts @@ -1,3 +1,5 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. export declare type DesktopSourcesOptions = { types: Array<'screen' | 'window'>; thumbnailSize?: { @@ -30,18 +32,6 @@ export declare type DesktopAPI = { onBrowserHistoryStatusUpdated: (listener: (canGoBack: boolean, canGoForward: boolean) => void) => () => void; onBrowserHistoryPush: (listener: (pathName: string) => void) => () => void; sendBrowserHistoryPush: (path: string) => void; - openLinkFromCallsWidget: (url: string) => void; - openScreenShareModal: () => void; - onScreenShared: (listener: (sourceID: string, withAudio: boolean) => void) => () => void; - callsWidgetConnected: (callID: string, sessionID: string) => void; - onJoinCallRequest: (listener: (callID: string) => void) => () => void; - resizeCallsWidget: (width: number, height: number) => void; - focusPopout: () => void; - leaveCall: () => void; - sendCallsError: (err: string, callID?: string, errMsg?: string) => void; - getDesktopSources: (opts: DesktopSourcesOptions) => Promise; - onOpenScreenShareModal: (listener: () => void) => () => void; - shareScreen: (sourceID: string, withAudi: boolean) => void; joinCall: (opts: { callID: string; title: string; @@ -51,7 +41,19 @@ export declare type DesktopAPI = { callID: string; sessionID: string; }>; - sendJoinCallRequest: (callId: string) => void; + leaveCall: () => void; + callsWidgetConnected: (callID: string, sessionID: string) => void; + resizeCallsWidget: (width: number, height: number) => void; + sendCallsError: (err: string, callID?: string, errMsg?: string) => void; onCallsError: (listener: (err: string, callID?: string, errMsg?: string) => void) => () => void; + getDesktopSources: (opts: DesktopSourcesOptions) => Promise; + openScreenShareModal: () => void; + onOpenScreenShareModal: (listener: () => void) => () => void; + shareScreen: (sourceID: string, withAudio: boolean) => void; + onScreenShared: (listener: (sourceID: string, withAudio: boolean) => void) => () => void; + sendJoinCallRequest: (callId: string) => void; + onJoinCallRequest: (listener: (callID: string) => void) => () => void; + openLinkFromCalls: (url: string) => void; + focusPopout: () => void; unregister: (channel: string) => void; }; diff --git a/api-types/lib/index.js b/api-types/lib/index.js index 96ab4ebb..351eb9fc 100644 --- a/api-types/lib/index.js +++ b/api-types/lib/index.js @@ -1,4 +1,7 @@ -"use strict"; // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -Object.defineProperty(exports, "__esModule", { value: true }); +'use strict'; + +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +Object.defineProperty(exports, '__esModule', {value: true}); diff --git a/api-types/package-lock.json b/api-types/package-lock.json index eb4c10bc..37a30f08 100644 --- a/api-types/package-lock.json +++ b/api-types/package-lock.json @@ -1,12 +1,12 @@ { "name": "@mattermost/desktop-api", - "version": "5.7.0-2", + "version": "5.7.0-3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@mattermost/desktop-api", - "version": "5.7.0-2", + "version": "5.7.0-3", "license": "MIT", "peerDependencies": { "typescript": "^4.3" diff --git a/api-types/package.json b/api-types/package.json index 3ef770fc..69c36a5a 100644 --- a/api-types/package.json +++ b/api-types/package.json @@ -1,6 +1,6 @@ { "name": "@mattermost/desktop-api", - "version": "5.7.0-2", + "version": "5.7.0-3", "description": "Shared types for the Desktop App API provided to the Web App", "keywords": [ "mattermost" diff --git a/i18n/ar.json b/i18n/ar.json index 222dee74..60644bb9 100644 --- a/i18n/ar.json +++ b/i18n/ar.json @@ -1,123 +1,165 @@ { - "main.badge.noUnreads": "ليس لديك رسائل غير مقروءة", - "main.autoUpdater.noUpdate.message": "لديك اخر اصدار", - "main.autoUpdater.noUpdate.detail": "أنت تستخدم أحدث إصدار من {appName} اصدار سطح المكتب (الإصدار {version}). سيتم إعلامك عند توفر إصدار جديد للتثبيت.", - "main.app.utils.migrateMacAppStore.dialog.detail": "يبدو أن تهيئة {appName} موجودة ، هل ترغب في استيرادها؟ سيُطلب منك اختيار دليل التكوين الصحيح.", - "main.app.utils.migrateMacAppStore.button.dontImport": "لا تستورد", - "main.app.initialize.downloadBox.allFiles": "كل الملفات", - "main.app.app.handleAppCertificateError.dialog.extraDetail": "الشهادة مختلفة عن السابقة.\n\n", - "main.app.app.handleAppCertificateError.certNotTrusted.dialog.title": "الشهاده غير موثقة", - "main.app.app.handleAppCertificateError.certNotTrusted.dialog.message": "الشهاده من \"{issuerName}\" غيرموثقة.", - "main.app.app.handleAppCertificateError.certNotTrusted.button.trustInsecureCertificate": "مصادقه الشهاده غير الامنة", - "main.app.app.handleAppCertificateError.certNotTrusted.button.cancelConnection": "إلغاء الاتصال", - "main.app.app.handleAppCertificateError.certError.dialog.title": "خطأ فى الشهاده", - "main.app.app.handleAppCertificateError.certError.dialog.message": "هناك مشكلة في الاعدادات مع خادم Mattermost هذا ، أو أن شخصًا ما يحاول اعتراض اتصالك. قد تحتاج أيضًا إلى تسجيل الدخول إلى شبكة Wi-Fi التي تتصل بها باستخدام متصفح الويب الخاص بك.", - "main.app.app.handleAppCertificateError.certError.button.moreDetails": "تفاصيل اكثر", - "main.app.app.handleAppCertificateError.certError.button.cancelConnection": "ألغاء الاتصال", - "main.allowProtocolDialog.title": "ليس http(s) بروتوكول", - "main.allowProtocolDialog.message": "{protocol} الرابط يحتاج تطبيق خارجى.", - "main.allowProtocolDialog.detail": "الرابط المطلوب هو {URL} هل تريد الاستمرار ؟", - "label.yes": "نعم", - "label.save": "حفظ", - "label.remove": "حذف", - "label.ok": "نعم", - "label.no": "لا", - "label.login": "تسجيل الدخول", - "label.close": "اغلاق", - "label.change": "تغيير", - "label.cancel": "إلغاء", - "label.add": "أضف", - "label.accept": "قبول", - "common.tabs.TAB_MESSAGING": "القنوات", - "common.tabs.TAB_FOCALBOARD": "اللوحات", - "common.permissions.canBasicAuth": "مصادقه الويب", - "main.menus.app.help.checkForUpdates": "تحقق من وجود تحديثات", - "main.menus.app.help": "المساعدة", - "main.menus.app.file.unhide": "اظهار الكل", - "main.menus.app.file.signInToAnotherServer": "تسجيل الدخول لخادم اخر", - "main.menus.app.file.settings": "الاعدادات...", - "main.menus.app.file.quit": "انهاء{appName}", - "main.menus.app.file.preferences": "التفضيلات..", - "main.menus.app.file.hideOthers": "اخفاء الاخرين", - "main.menus.app.file.hide": "اخفاء{appName}", - "main.menus.app.file.exit": "انهاء", - "main.menus.app.file.about": "عن{appName}", - "main.menus.app.file": "&ملف", - "main.menus.app.edit.undo": "تراجع", - "main.menus.app.edit.selectAll": "تحديد الكل", - "main.menus.app.edit.redo": "إعادة", - "main.menus.app.edit.pasteAndMatchStyle": "لصق ومطابقة النمط", - "main.menus.app.edit.paste": "لصق", - "main.menus.app.edit.cut": "قطع", - "main.menus.app.edit.copy": "نسخ", - "main.menus.app.edit": "&تحرير", - "main.CriticalErrorHandler.unresponsive.dialog.message": "النافذة لم تعد تستجيب.\nهل تريد الانتظار حتى تستجيب النافذة مرة أخرى؟", - "main.CriticalErrorHandler.uncaughtException.dialog.message": "تم إنهاء التطبيق {appName} بشكل غير متوقع. انقر على \"{showDetails}\" لمعرفة المزيد أو \"{reopen}\" لفتح التطبيق مرة أخرى.\n\nخطأ داخلي: {err}", - "main.CriticalErrorHandler.uncaughtException.button.showDetails": "اظهار التفاصيل", - "main.CriticalErrorHandler.uncaughtException.button.reopen": "اعاده فتح", - "main.badge.unreadMentions": "لديك إشارات غير مقروءة ({الذكر Count})", - "main.badge.unreadChannels": "لديك قنوات غير مقروءة", - "main.badge.sessionExpired": "انتهت الجلسة: الرجاء تسجيل الدخول لمتابعة تلقي الإخطارات.", - "main.windows.mainWindow.minimizeToTray.dialog.checkboxLabel": "لا تظهر مرة أخرى", - "main.windows.mainWindow.closeApp.dialog.title": "اغلاق التطبيق", - "main.windows.mainWindow.closeApp.dialog.message": "هل أنت متأكد من أنك تريد الخروج؟", - "main.windows.mainWindow.closeApp.dialog.detail": "لن تتلقى بعد الآن إشعارات بالرسائل. إذا كنت تريد ترك {appName} قيد التشغيل في علبة النظام ، فيمكنك تمكين هذا في الإعدادات.", - "main.windows.mainWindow.closeApp.dialog.checkboxLabel": "لا تسأل مرة أخرى", - "main.views.viewManager.handleDeepLink.error.title": "لا يوجد خادم مطابق", - "main.views.viewManager.handleDeepLink.error.body": "لا يوجد خادم مهيأ في التطبيق يطابق عنوان url المطلوب: {url}", - "main.tray.tray.unread": "لديك قنوات غير مقروءة", - "main.tray.tray.mention": "تم الاشارة أليك", - "main.tray.tray.expired": "انتهت الجلسة: الرجاء تسجيل الدخول لمتابعة تلقي الإخطارات.", - "main.notifications.upgrade.readyToInstall.title": "انقر لإعادة التشغيل وتثبيت التحديث", - "main.notifications.upgrade.readyToInstall.body": "إصدار سطح المكتب الجديد جاهز للتثبيت الآن.", - "main.notifications.upgrade.newVersion.title": "إصدار سطح المكتب الجديد متاح", - "main.notifications.upgrade.newVersion.body": "يتوفر إصدار جديد للتنزيل الآن.", - "main.notifications.mention.title": "شخص م اشار اليك", - "main.notifications.download.complete.title": "تم التنزيل", - "main.notifications.download.complete.body": "تم التنزيل\n {filename}", - "main.menus.tray.settings": "الاعدادات...", - "main.menus.tray.preferences": "التفضيلات ...", - "main.menus.app.window.zoom": "تقريب", - "main.menus.app.window.showServers": "اظهار الخوادم", - "main.menus.app.window.selectPreviousTab": "حدد التبويبة السابقة", - "main.menus.app.window.selectNextTab": "حدد التبويبه التاليه", - "main.menus.app.window.minimize": "تصغير", - "main.menus.app.window.closeWindow": "اغلاق النافذة", - "main.menus.app.window.close": "اغلاق", - "main.menus.app.window.bringAllToFront": "إحضار الكل إلى المقدمة", - "main.menus.app.window": "&النافذة", - "main.menus.app.view.zoomOut": "تصغير", - "main.menus.app.view.zoomIn": "تكبير", - "main.menus.app.view.toggleDarkMode": "تبديل الوضع المظلم", - "main.menus.app.view.reload": "اعاده تحميل", - "main.menus.app.view.fullscreen": "تبديل ملىء الشاشة", - "main.menus.app.view.find": "بحث..", - "main.menus.app.view.downloads": "التنزيلات", - "main.menus.app.view.devToolsCurrentServer": "أدوات المطور للخادم الحالي", - "main.menus.app.view.devToolsAppWrapper": "أدوات المطور لغلاف التطبيق", - "main.menus.app.view.clearCacheAndReload": "امسح ذاكرة التخزين المؤقت وإعادة التحميل", - "main.menus.app.view.actualSize": "المقاس الحقيقى", - "main.menus.app.view": "&عرض", - "main.menus.app.history.forward": "الامام", - "main.menus.app.history.back": "الرجوع", - "main.menus.app.history": "&التاريخ", - "main.menus.app.help.versionString": "اصدار{version}{commit}", - "main.menus.app.help.ShowLogs": "اظهار السجلات", - "main.menus.app.help.restartAndUpdate": "اعد التشغيل والتحديث", - "main.menus.app.help.learnMore": "اعرف اكثر.", - "main.menus.app.help.downloadUpdate": "تنزل التحديثات", - "main.app.utils.migrateMacAppStore.dialog.message": "استيراد الاعدادات الحالية", - "main.app.utils.migrateMacAppStore.button.selectAndImport": "حدد مسار ثم استورد", - "main.app.app.handleAppCertificateError.certError.dialog.detail": "{extraDetail}الاصل: {origin}\nخطأ: {error}", - "main.allowProtocolDialog.button.saveProtocolAsAllowed": "نعم (احفظ {protocol} على النحو المسموح به)", - "main.menus.app.help.RunDiagnostics": "تشغيل التشخيصات", - "main.menus.app.help.commitString": " commit: {hashVersion}", - "common.tabs.TAB_PLAYBOOKS": "Playbooks", - "renderer.components.configureServer.connect.saving": "توصيل", - "renderer.components.configureServer.connect.default": "يتصل", - "renderer.components.configureServer.cardtitle": "أدخل تفاصيل الخادم الخاص بك", - "renderer.components.autoSaveIndicator.saving": "يحفظ", - "renderer.components.autoSaveIndicator.saved": "حفظ", - "main.windows.mainWindow.minimizeToTray.dialog.title": "تصغير إلى الصينية", - "main.windows.mainWindow.minimizeToTray.dialog.message": "سيستمر تشغيل {appName} في علبة النظام. يمكن تعطيل هذا في الإعدادات." + "common.permissions.canBasicAuth": "مصادقه الويب", + "common.tabs.TAB_FOCALBOARD": "اللوحات", + "common.tabs.TAB_MESSAGING": "القنوات", + "common.tabs.TAB_PLAYBOOKS": "Playbooks", + "label.accept": "قبول", + "label.add": "أضف", + "label.allow": "سماح", + "label.cancel": "إلغاء", + "label.change": "تغيير", + "label.close": "اغلاق", + "label.deny": "رفض", + "label.denyPermanently": "رفض بشكل دائم", + "label.login": "تسجيل الدخول", + "label.no": "لا", + "label.ok": "نعم", + "label.remove": "إزالة", + "label.save": "حفظ", + "label.yes": "موافق", + "main.CriticalErrorHandler.uncaughtException.button.reopen": "اعاده فتح", + "main.CriticalErrorHandler.uncaughtException.button.showDetails": "اظهار التفاصيل", + "main.CriticalErrorHandler.uncaughtException.dialog.message": "تم إنهاء التطبيق {appName} بشكل غير متوقع. انقر على \"{showDetails}\" لمعرفة المزيد أو \"{reopen}\" لفتح التطبيق مرة أخرى.\n\nخطأ داخلي: {err}", + "main.CriticalErrorHandler.unresponsive.dialog.message": "النافذة لم تعد تستجيب.\nهل تريد الانتظار حتى تستجيب النافذة مرة أخرى؟", + "main.allowProtocolDialog.button.saveProtocolAsAllowed": "نعم (احفظ {protocol} على النحو المسموح به)", + "main.allowProtocolDialog.detail": "الرابط المطلوب هو {URL}. هل تريد الاستمرار ؟", + "main.allowProtocolDialog.message": "{protocol} الرابط يحتاج تطبيق خارجى.", + "main.allowProtocolDialog.title": "ليس بروتوكول http(s)", + "main.app.app.handleAppCertificateError.certError.button.cancelConnection": "ألغاء الاتصال", + "main.app.app.handleAppCertificateError.certError.button.moreDetails": "تفاصيل اكثر", + "main.app.app.handleAppCertificateError.certError.dialog.detail": "{extraDetail} الاصل: {origin}\nخطأ: {error}", + "main.app.app.handleAppCertificateError.certError.dialog.message": "هناك مشكلة في الاعدادات مع خادم Mattermost هذا ، أو أن شخصًا ما يحاول اعتراض اتصالك. قد تحتاج أيضًا إلى تسجيل الدخول إلى شبكة Wi-Fi التي تتصل بها باستخدام متصفح الويب الخاص بك.", + "main.app.app.handleAppCertificateError.certError.dialog.title": "خطأ فى شهادة التصديق", + "main.app.app.handleAppCertificateError.certNotTrusted.button.cancelConnection": "إلغاء الاتصال", + "main.app.app.handleAppCertificateError.certNotTrusted.button.trustInsecureCertificate": "مصادقة الشهادة غير الآمنة", + "main.app.app.handleAppCertificateError.certNotTrusted.dialog.message": "الشهادة من \"{issuerName}\" غير موثقة.", + "main.app.app.handleAppCertificateError.certNotTrusted.dialog.title": "الشهادة غير موثقة", + "main.app.app.handleAppCertificateError.dialog.extraDetail": "الشهادة مختلفة عن السابقة.\n\n", + "main.app.initialize.downloadBox.allFiles": "كل الملفات", + "main.app.utils.migrateMacAppStore.button.dontImport": "لا تستورد", + "main.app.utils.migrateMacAppStore.button.selectAndImport": "حدد مسار ثم استورد", + "main.app.utils.migrateMacAppStore.dialog.detail": "يبدو أن تهيئة {appName} موجودة ، هل ترغب في استيرادها؟ سيُطلب منك اختيار دليل التكوين الصحيح.", + "main.app.utils.migrateMacAppStore.dialog.message": "استيراد الاعدادات الحالية", + "main.autoUpdater.noUpdate.detail": "أنت تستخدم أحدث إصدار من {appName} نسخة سطح المكتب (الإصدار {version}). سيتم إشعارك عند توفر إصدار جديد للتثبيت.", + "main.autoUpdater.noUpdate.message": "لديك اخر اصدار", + "main.badge.noUnreads": "ليس لديك رسائل غير مقروءة", + "main.badge.sessionExpired": "انتهت الجلسة: الرجاء تسجيل الدخول لمتابعة تلقي الإخطارات.", + "main.badge.unreadChannels": "لديك قنوات غير مقروءة", + "main.badge.unreadMentions": "لديك ({mentionCount}) إشعار(ات) غير مقروءة", + "main.downloadsManager.resetDownloadsFolder": "يرجى إعادة تعيين المجلد الذي سيحتوي الملفات المنزلة", + "main.downloadsManager.specifyDownloadsFolder": "المجلد الذي سوف يحتوي الملفات المنزلة", + "main.menus.app.edit": "&تحرير", + "main.menus.app.edit.copy": "نسخ", + "main.menus.app.edit.cut": "قطع", + "main.menus.app.edit.paste": "لصق", + "main.menus.app.edit.pasteAndMatchStyle": "لصق ومطابقة النمط", + "main.menus.app.edit.redo": "إعادة", + "main.menus.app.edit.selectAll": "تحديد الكل", + "main.menus.app.edit.undo": "تراجع", + "main.menus.app.file": "&ملف", + "main.menus.app.file.about": "عن {appName}", + "main.menus.app.file.exit": "انهاء", + "main.menus.app.file.hide": "اخفاء {appName}", + "main.menus.app.file.hideOthers": "اخفاء الاخرين", + "main.menus.app.file.preferences": "التفضيلات..", + "main.menus.app.file.quit": "انهاء {appName}", + "main.menus.app.file.settings": "الاعدادات...", + "main.menus.app.file.signInToAnotherServer": "تسجيل الدخول لخادم اخر", + "main.menus.app.file.unhide": "اظهار الكل", + "main.menus.app.help": "المساعدة", + "main.menus.app.help.RunDiagnostics": "تشغيل التشخيصات", + "main.menus.app.help.ShowLogs": "اظهار السجلات", + "main.menus.app.help.checkForUpdates": "تحقق من وجود تحديثات", + "main.menus.app.help.commitString": " التعديل: {hashVersion}", + "main.menus.app.help.downloadUpdate": "تنزل التحديثات", + "main.menus.app.help.learnMore": "اعرف اكثر...", + "main.menus.app.help.restartAndUpdate": "اعد التشغيل والتحديث", + "main.menus.app.help.versionString": "اصدار{version}{commit}", + "main.menus.app.history": "&التاريخ", + "main.menus.app.history.back": "الرجوع", + "main.menus.app.history.forward": "الامام", + "main.menus.app.view": "&عرض", + "main.menus.app.view.actualSize": "المقاس الحقيقى", + "main.menus.app.view.clearCacheAndReload": "امسح ذاكرة التخزين المؤقت وإعادة التحميل", + "main.menus.app.view.devToolsAppWrapper": "أدوات المطور لغلاف التطبيق", + "main.menus.app.view.devToolsCurrentCallWidget": "أدوات المطور لعنصر (أداة) الاتصال الاضافي(ة)", + "main.menus.app.view.devToolsCurrentServer": "أدوات المطور للخادم الحالي", + "main.menus.app.view.devToolsSubMenu": "أدوات المطور", + "main.menus.app.view.downloads": "التنزيلات", + "main.menus.app.view.find": "بحث..", + "main.menus.app.view.fullscreen": "تبديل ملىء الشاشة", + "main.menus.app.view.reload": "اعاده تحميل", + "main.menus.app.view.toggleDarkMode": "تبديل الوضع المظلم", + "main.menus.app.view.zoomIn": "تكبير", + "main.menus.app.view.zoomOut": "تصغير", + "main.menus.app.window": "&النافذة", + "main.menus.app.window.bringAllToFront": "إحضار الكل إلى المقدمة", + "main.menus.app.window.close": "اغلاق", + "main.menus.app.window.closeWindow": "اغلاق النافذة", + "main.menus.app.window.minimize": "تصغير", + "main.menus.app.window.selectNextTab": "حدد التبويبه التاليه", + "main.menus.app.window.selectPreviousTab": "حدد التبويبة السابقة", + "main.menus.app.window.showServers": "اظهار الخوادم", + "main.menus.app.window.zoom": "تقريب", + "main.menus.tray.preferences": "التفضيلات ...", + "main.menus.tray.settings": "الاعدادات...", + "main.notifications.download.complete.body": "تم التحميل\n{fileName}", + "main.notifications.download.complete.title": "تم التنزيل", + "main.notifications.mention.title": "شخص م اشار اليك", + "main.notifications.upgrade.newVersion.body": "يتوفر إصدار جديد للتنزيل الآن.", + "main.notifications.upgrade.newVersion.title": "إصدار سطح المكتب الجديد متاح", + "main.notifications.upgrade.readyToInstall.body": "إصدار سطح المكتب الجديد جاهز للتثبيت الآن.", + "main.notifications.upgrade.readyToInstall.title": "انقر لإعادة التشغيل وتثبيت التحديث", + "main.permissionsManager.checkPermission.dialog.detail.geolocation": "سيستخدم {appName} الموقع لإعداد منطقتك الزمنية. ويمكنك دائمًا تغيير ذلك لاحقًا في إعدادات جهاز الكمبيوتر الخاص بك.", + "main.permissionsManager.checkPermission.dialog.detail.media": "{appName} سوف يستخدم المايكروفون و الكاميرا من أجل الاتصالات و الملاحظات الصوتية، يمكنك تغيير هذا لاحقاً من خلال الإعدادات.", + "main.permissionsManager.checkPermission.dialog.detail.notifications": "{appName} سوف يرسل اشعارات للرسائل والاتصالات. يمكنك ضبط تفضيلات الاشعارات في الإعدادات.", + "main.permissionsManager.checkPermission.dialog.message.geolocation": "{appName} ({url}) يود الوصول الى موقعك.", + "main.permissionsManager.checkPermission.dialog.message.media": "{appName} ({url}) يود الوصول الى الكاميرا والمايكروفون.", + "main.permissionsManager.checkPermission.dialog.message.notifications": "{appName} ({url}) يود إرسال الإشعارات.", + "main.permissionsManager.checkPermission.dialog.title": "تم طلب الإذن", + "main.tray.tray.expired": "انتهت الجلسة: الرجاء تسجيل الدخول لمتابعة تلقي الإخطارات.", + "main.tray.tray.mention": "تم ذِكرك", + "main.tray.tray.unread": "لديك قنوات غير مقروءة", + "main.views.viewManager.handleDeepLink.error.body": "لا يوجد خادم مهيأ في التطبيق يطابق عنوان url المطلوب: {url}", + "main.views.viewManager.handleDeepLink.error.title": "لا يوجد خادم مطابق", + "main.windows.mainWindow.closeApp.dialog.checkboxLabel": "لا تسأل مرة أخرى", + "main.windows.mainWindow.closeApp.dialog.detail": "لن تتلقى بعد الآن إشعارات بالرسائل. إذا كنت تريد ترك {appName} قيد التشغيل في مصفوفة النظام ، فيمكنك تمكين هذا في الإعدادات.", + "main.windows.mainWindow.closeApp.dialog.message": "هل أنت متأكد من أنك تريد الخروج؟", + "main.windows.mainWindow.closeApp.dialog.title": "اغلاق التطبيق", + "main.windows.mainWindow.minimizeToTray.dialog.checkboxLabel": "لا تظهر مرة أخرى", + "main.windows.mainWindow.minimizeToTray.dialog.message": "سيستمر تشغيل {appName} في علبة النظام. يمكن تعطيل هذا في الإعدادات.", + "main.windows.mainWindow.minimizeToTray.dialog.title": "تصغير إلى الصينية", + "renderer.components.autoSaveIndicator.saved": "تم الحفظ", + "renderer.components.autoSaveIndicator.saving": "جاري الحفظ...", + "renderer.components.configureServer.cardtitle": "أدخل تفاصيل الخادم الخاص بك", + "renderer.components.configureServer.connect.default": "يتصل", + "renderer.components.configureServer.connect.override": "الإتصال على أي حال", + "renderer.components.configureServer.connect.saving": "جاري الإتصال…", + "renderer.components.configureServer.name.placeholder": "اسم الخادم", + "renderer.components.configureServer.url.info": "رابط الخادم الذي يخص Mattermost", + "renderer.components.configureServer.url.validating": "جاري التحقق...", + "renderer.components.errorView.cannotConnectToAppName": "لا يمكن الاتصال بـ{appName}", + "renderer.components.errorView.havingTroubleConnecting": "نواجه مشكلة في الاتصال بـ {appName} . سنستمر في محاولة إقامة اتصال.", + "renderer.components.errorView.refreshThenVerify": "إذا لم يعمل تحديث هذه الصفحة (Ctrl+R أو Command+R)، فيرجى التحقق من ما يلي:", + "renderer.components.errorView.troubleshooting.browserView.canReachFromBrowserWindow": "يمكنك الوصول إلى {url} من خلال نافذة متصفح.", + "renderer.components.errorView.troubleshooting.computerIsConnected": "جهازك متصل بالانترنت.", + "renderer.components.errorView.troubleshooting.urlIsCorrect.appNameIsCorrect": "إرتباط منصة {appName} {url} صحيح", + "renderer.components.extraBar.back": "رجوع", + "renderer.components.input.required": "هذه الخانة مطلوبة", + "renderer.components.mainPage.contextMenu.ariaLabel": "قائمة الخيارات", + "renderer.components.mainPage.titleBar": "{appName}", + "renderer.components.newServerModal.error.nameRequired": "الاسم مطلوب.", + "renderer.components.newServerModal.validating": "جاري التحقق...", + "renderer.components.saveButton.save": "حفظ", + "renderer.components.saveButton.saving": "جاري الحفظ", + "renderer.components.settingsPage.afterRestart": "يسري مفعول الإعداد بعد إعادة تشغيل التطبيق.", + "renderer.components.settingsPage.appLanguage": "ضبط لغة التطبيق (اختباري)", + "renderer.components.settingsPage.appOptions": "خيارات التطبيق", + "renderer.components.settingsPage.bounceIcon.once": "مرة", + "renderer.components.settingsPage.bounceIcon.untilOpenApp": "حتى أفتح التطبيق", + "renderer.components.settingsPage.checkSpelling": "التحقق من الإملاء", + "renderer.components.settingsPage.checkSpelling.preferredLanguages": "اختر اللغة أو اللغات المرغوبة", + "renderer.components.settingsPage.flashWindow.description.note": "ملاحظة: ", + "renderer.components.settingsPage.fullscreen.description": "إذا تم التمكين، فسيتم فتح تطبيق {appName} دائماً في وضع ملء الشاشة", + "renderer.downloadsDropdown.Update.ANewVersionIsAvailableToInstall": "يتوفر إصدار جديد من تطبيق سطح المكتب لـ{appName} (الإصدار {version}) للتثبيت." } diff --git a/i18n/en_AU.json b/i18n/en_AU.json index 5c6f2ab4..da6093bb 100644 --- a/i18n/en_AU.json +++ b/i18n/en_AU.json @@ -1,303 +1,305 @@ { - "main.autoUpdater.update.dialog.button.restartAndUpdate": "Restart and Update", - "main.autoUpdater.update.dialog.button.remindMeLater": "Remind me later", - "main.autoUpdater.noUpdate.message": "You're up to date", - "main.autoUpdater.noUpdate.detail": "You are using the latest version of the {appName} Desktop App (version {version}). You'll be notified when a new version is available to install.", - "main.autoUpdater.download.dialog.message": "New desktop version available", - "main.autoUpdater.download.dialog.detail": "A new version of the {appName} Desktop App is available for you to download and install now.", - "main.autoUpdater.download.dialog.button.remindMeLater": "Remind me later", - "main.autoUpdater.download.dialog.button.download": "Download", - "main.app.utils.migrateMacAppStore.dialog.message": "Import Existing Configuration", - "main.app.utils.migrateMacAppStore.dialog.detail": "It appears that an existing {appName} configuration exists, would you like to import it? You will be asked to pick the correct configuration directory.", - "main.app.utils.migrateMacAppStore.button.selectAndImport": "Select Directory and Import", - "main.app.utils.migrateMacAppStore.button.dontImport": "Don't Import", - "main.app.initialize.downloadBox.allFiles": "All files", - "main.app.app.handleAppCertificateError.dialog.extraDetail": "Certificate is different from previous one.\n\n", - "main.app.app.handleAppCertificateError.certNotTrusted.dialog.title": "Certificate Not Trusted", - "main.app.app.handleAppCertificateError.certNotTrusted.dialog.message": "Certificate from '\\{issuerName}'\\ is not trusted.", - "main.app.app.handleAppCertificateError.certNotTrusted.button.trustInsecureCertificate": "Trust Insecure Certificate", - "main.app.app.handleAppCertificateError.certNotTrusted.button.cancelConnection": "Cancel Connection", - "main.app.app.handleAppCertificateError.certError.dialog.title": "Certificate Error", - "main.app.app.handleAppCertificateError.certError.dialog.message": "There is a configuration issue with this Mattermost server, or someone is trying to intercept your connection. You also may need to sign into the Wi-Fi you are connected to using your web browser.", - "main.app.app.handleAppCertificateError.certError.dialog.detail": "{extraDetail}origin: {origin}\nError: {error}", - "main.app.app.handleAppCertificateError.certError.button.moreDetails": "More Details", - "main.app.app.handleAppCertificateError.certError.button.cancelConnection": "Cancel Connection", - "main.allowProtocolDialog.title": "Non http(s) protocol", - "main.allowProtocolDialog.message": "{protocol} link requires an external application.", - "main.allowProtocolDialog.detail": "The requested link is {URL}. Do you want to continue?", - "main.allowProtocolDialog.button.saveProtocolAsAllowed": "Yes (Save {protocol} as allowed)", - "label.yes": "Yes", - "label.save": "Save", - "label.remove": "Remove", - "label.ok": "OK", - "label.no": "No", - "label.login": "Login", - "label.close": "Close", - "label.change": "Change", - "label.cancel": "Cancel", - "label.add": "Add", - "label.accept": "Accept", - "common.tabs.TAB_PLAYBOOKS": "Playbooks", - "common.tabs.TAB_MESSAGING": "Channels", - "common.tabs.TAB_FOCALBOARD": "Boards", - "common.permissions.canBasicAuth": "Web Authentication", - "renderer.modals.permission.permissionModal.body": "A site that's not included in your Mattermost server configuration requires access for {permission}.", - "renderer.modals.login.loginModal.username": "User Name", - "renderer.modals.login.loginModal.title": "Authentication Required", - "renderer.modals.login.loginModal.password": "Password", - "renderer.modals.login.loginModal.message.server": "The server {url} requires a username and password.", - "renderer.modals.login.loginModal.message.proxy": "The proxy {host}:{port} requires a username and password.", - "renderer.modals.certificate.certificateModal.title": "Select a certificate", - "renderer.modals.certificate.certificateModal.subtitle": "Select a certificate to authenticate yourself to {url}", - "renderer.modals.certificate.certificateModal.subject": "Subject", - "renderer.modals.certificate.certificateModal.serial": "Serial", - "renderer.modals.certificate.certificateModal.noCertsAvailable": "No certificates available", - "renderer.modals.certificate.certificateModal.issuer": "Issuer", - "renderer.modals.certificate.certificateModal.certInfoButton": "Certificate Information", - "renderer.dropdown.servers": "Servers", - "renderer.dropdown.addAServer": "Add a server", - "renderer.components.serverDropdownButton.noServersConfigured": "No servers configured", - "renderer.components.showCertificateModal.subjectName": "Subject Name", - "renderer.components.showCertificateModal.serialNumber": "Serial Number", - "renderer.components.showCertificateModal.publicKeyInfo": "Public Key Info", - "renderer.components.showCertificateModal.notValidBefore": "Not Valid Before", - "renderer.components.showCertificateModal.notValidAfter": "Not Valid After", - "renderer.components.showCertificateModal.noCertSelected": "No certificate selected", - "renderer.components.showCertificateModal.issuerName": "Issuer Name", - "renderer.components.showCertificateModal.commonName": "Common Name", - "renderer.components.showCertificateModal.algorithm": "Algorithm", - "renderer.components.settingsPage.updates.checkNow": "Check for Updates now", - "renderer.components.settingsPage.updates.automatic.description": "If enabled, updates to the Desktop App will download automatically and you will be notified when they're ready to install.", - "renderer.components.settingsPage.updates.automatic": "Automatically check for updates", - "renderer.components.settingsPage.updates": "Updates", - "renderer.components.settingsPage.trayIcon.theme.systemDefault": "Use system default", - "renderer.components.settingsPage.trayIcon.theme.light": "Light", - "renderer.components.settingsPage.trayIcon.theme.dark": "Dark", - "renderer.components.settingsPage.trayIcon.theme": "Icon theme: ", - "renderer.components.settingsPage.trayIcon.show.darwin": "Show {appName} icon in the menu bar", - "renderer.components.settingsPage.trayIcon.show": "Show icon in the notification area", - "renderer.components.settingsPage.startAppOnLogin.description": "If enabled, the app starts automatically when you log in to your machine.", - "renderer.components.settingsPage.startAppOnLogin": "Start app on login", - "renderer.components.settingsPage.showUnreadBadge.description": "Regardless of this setting, mentions are always indicated with a red badge and item count on the {taskbar} icon.", - "renderer.components.settingsPage.showUnreadBadge": "Show red badge on {taskbar} icon to indicate unread messages", - "renderer.components.settingsPage.saving.error": "Your changes can't be saved. Please try again.", - "renderer.components.settingsPage.minimizeToTray.description": "If enabled, the app stays running in the notification area after app window is closed.", - "renderer.components.settingsPage.minimizeToTray": "Leave the app running in the notification area when the application window is closed", - "renderer.components.settingsPage.loggingLevel.level.warn": "Errors and Warnings (warn)", - "renderer.components.settingsPage.loggingLevel.level.verbose": "Verbose (verbose)", - "renderer.components.settingsPage.loggingLevel.level.silly": "Finest (silly)", - "renderer.components.settingsPage.loggingLevel.level.info": "Informational (info)", - "renderer.components.settingsPage.loggingLevel.level.error": "Errors (error)", - "renderer.components.settingsPage.loggingLevel.level.debug": "Debug (debug)", - "renderer.components.settingsPage.loggingLevel.description.subtitle": "Increasing the log level increases disk space usage and can impact performance. It is recommended to only increase the log level if you are having issues.", - "renderer.components.settingsPage.loggingLevel.description": "Logging is helpful for developers and support to isolate issues you may be encountering with the desktop app.", - "renderer.components.settingsPage.loggingLevel": "Logging level", - "renderer.components.settingsPage.loadingConfig": "Loading configuration...", - "renderer.components.settingsPage.launchAppMinimized.description": "If enabled, the app will start in system tray, and will not show the window on launch.", - "renderer.components.settingsPage.launchAppMinimized": "Launch app minimised", - "renderer.components.settingsPage.header": "Settings", - "renderer.components.settingsPage.fullscreen.description": "If enabled, the {appName} application will always open in full screen", - "renderer.components.settingsPage.fullscreen": "Open app in fullscreen", - "renderer.components.settingsPage.flashWindow.description.note": "NOTE: ", - "renderer.components.settingsPage.flashWindow.description.linuxFunctionality": "This functionality may not work with all Linux window managers.", - "renderer.components.settingsPage.flashWindow.description": "If enabled, the taskbar icon will flash for a few seconds when a new message is received.", - "renderer.components.settingsPage.flashWindow": "Flash taskbar icon when a new message is received", - "renderer.components.settingsPage.enableHardwareAcceleration.description": "If enabled, {appName} UI is rendered more efficiently but can lead to decreased stability for some systems.", - "renderer.components.settingsPage.enableHardwareAcceleration": "Use GPU hardware acceleration", - "renderer.components.settingsPage.downloadLocation.description": "Specify the folder where files will download.", - "renderer.components.settingsPage.downloadLocation": "Download Location", - "renderer.components.settingsPage.checkSpelling.specifyURL": "Specify the URL where dictionary definitions can be retrieved", - "renderer.components.settingsPage.checkSpelling.revertToDefault": "Revert to default", - "renderer.components.settingsPage.checkSpelling.preferredLanguages": "Select preferred language(s)", - "renderer.components.settingsPage.checkSpelling.editSpellcheckUrl": "Use an alternative dictionary URL", - "renderer.components.settingsPage.checkSpelling.description": "Highlight misspelt words in your messages based on your system language or language preference.", - "renderer.components.settingsPage.checkSpelling": "Check spelling", - "renderer.components.settingsPage.bounceIcon.untilOpenApp": "until I open the app", - "renderer.components.settingsPage.bounceIcon.once": "once", - "renderer.components.settingsPage.bounceIcon.description": "If enabled, the Dock icon bounces once or until the user opens the app when a new notification is received.", - "renderer.components.settingsPage.bounceIcon": "Bounce the Dock icon", - "renderer.components.settingsPage.appOptions": "App Options", - "renderer.components.settingsPage.appLanguage.useSystemDefault": "Use system default", - "renderer.components.settingsPage.appLanguage.description": "Chooses the language that the Desktop App will use for menu items and popups. This feature is still in beta, and some languages will be missing translation strings.", - "renderer.components.settingsPage.appLanguage": "Set app language (beta)", - "renderer.components.settingsPage.afterRestart": "Setting takes effect after restarting the app.", - "renderer.components.removeServerModal.confirm": "Confirm you wish to remove the {serverName} server?", - "renderer.components.removeServerModal.title": "Remove Server", - "renderer.components.removeServerModal.body": "This will remove the server from your Desktop App but will not delete any of its data - you can add the server back to the app at any time.", - "renderer.components.newServerModal.title.edit": "Edit Server", - "renderer.components.newServerModal.title.add": "Add Server", - "renderer.components.newServerModal.serverURL.description": "The URL of your Mattermost server. Must start with http:// or https://.", - "renderer.components.newServerModal.serverURL": "Server URL", - "renderer.components.newServerModal.serverDisplayName.description": "The name of the server displayed on your desktop app tab bar.", - "renderer.components.newServerModal.serverDisplayName": "Server Display Name", - "renderer.components.newServerModal.error.urlRequired": "URL is required.", - "renderer.components.newServerModal.error.urlNeedsHttp": "URL should start with http:// or https://.", - "renderer.components.newServerModal.error.urlIncorrectFormatting": "URL is not formatted correctly.", - "renderer.components.newServerModal.error.serverUrlExists": "A server with the same URL already exists.", - "renderer.components.newServerModal.error.serverNameExists": "A server with the same name already exists.", - "renderer.components.newServerModal.error.nameRequired": "Name is required.", - "renderer.components.mainPage.updateReady": "Update ready to install", - "renderer.components.mainPage.updateAvailable": "Update available", - "renderer.components.mainPage.downloadingUpdate": "Downloading update. {percentDone}% of {total} @ {speed}/s", - "renderer.components.mainPage.contextMenu.ariaLabel": "Context menu", - "renderer.components.extraBar.back": "Back", - "renderer.components.errorView.troubleshooting.urlIsCorrect.appNameIsCorrect": "The {appName} URL {url} is correct", - "renderer.components.errorView.troubleshooting.computerIsConnected": "Your computer is connected to the internet.", - "renderer.components.errorView.troubleshooting.browserView.canReachFromBrowserWindow": "You can reach {url} from a browser window.", - "renderer.components.errorView.refreshThenVerify": "If refreshing this page (Ctrl+R or Command+R) does not work, please verify that:", - "renderer.components.errorView.cannotConnectToAppName": "Cannot connect to {appName}", - "renderer.components.autoSaveIndicator.saving": "Saving...", - "renderer.components.autoSaveIndicator.saved": "Saved", - "main.windows.mainWindow.minimizeToTray.dialog.title": "Minimise to Tray", - "main.windows.mainWindow.minimizeToTray.dialog.message": "{appName} will continue to run in the system tray. This can be disabled in Settings.", - "main.windows.mainWindow.minimizeToTray.dialog.checkboxLabel": "Don't show again", - "main.windows.mainWindow.closeApp.dialog.title": "Close Application", - "main.windows.mainWindow.closeApp.dialog.message": "Are you sure you want to quit?", - "main.windows.mainWindow.closeApp.dialog.detail": "You will no longer receive notifications for messages. If you want to leave {appName} running in the system tray, you can enable this in Settings.", - "main.windows.mainWindow.closeApp.dialog.checkboxLabel": "Don't ask again", - "main.views.viewManager.handleDeepLink.error.title": "No matching server", - "main.views.viewManager.handleDeepLink.error.body": "There is no configured server in the app that matches the requested URL: {url}", - "main.tray.tray.unread": "You have unread channels", - "main.tray.tray.mention": "You have been mentioned", - "main.tray.tray.expired": "Session Expired: Please sign in to continue receiving notifications.", - "main.notifications.upgrade.readyToInstall.title": "Click to restart and install update", - "main.notifications.upgrade.readyToInstall.body": "A new desktop version is ready to install now.", - "main.notifications.upgrade.newVersion.title": "New desktop version available", - "main.notifications.upgrade.newVersion.body": "A new version is available for you to download now.", - "main.notifications.mention.title": "Someone mentioned you", - "main.notifications.download.complete.title": "Download Complete", - "main.notifications.download.complete.body": "Download Complete \n {fileName}", - "main.menus.tray.settings": "Settings", - "main.menus.tray.preferences": "Preferences", - "main.menus.app.window.zoom": "Zoom", - "main.menus.app.window.showServers": "Show Servers", - "main.menus.app.window.selectPreviousTab": "Select Previous Tab", - "main.menus.app.window.selectNextTab": "Select Next Tab", - "main.menus.app.window.minimize": "Minimise", - "main.menus.app.window.closeWindow": "Close Window", - "main.menus.app.window.close": "Close", - "main.menus.app.window.bringAllToFront": "Bring all to front", - "main.menus.app.window": "&Window", - "main.menus.app.view.zoomOut": "Zoom Out", - "main.menus.app.view.zoomIn": "Zoom In", - "main.menus.app.view.toggleDarkMode": "Toggle Dark Mode", - "main.menus.app.view.reload": "Reload", - "main.menus.app.view.fullscreen": "Toggle Full Screen", - "main.menus.app.view.find": "Find...", - "main.menus.app.view.devToolsCurrentServer": "Developer Tools for Current Server", - "main.menus.app.view.devToolsAppWrapper": "Developer Tools for Application Wrapper", - "main.menus.app.view.clearCacheAndReload": "Clear Cache and Reload", - "main.menus.app.view.actualSize": "Actual Size", - "main.menus.app.view": "&View", - "main.menus.app.history.forward": "Forward", - "main.menus.app.history.back": "Back", - "main.menus.app.history": "&History", - "main.menus.app.help": "Hel&p", - "main.menus.app.help.versionString": "Version {version}{commit}", - "main.menus.app.help.restartAndUpdate": "Restart and Update", - "main.menus.app.help.learnMore": "Learn More...", - "main.menus.app.help.downloadUpdate": "Download Update", - "main.menus.app.help.commitString": " commit: {hashVersion}", - "main.menus.app.help.checkForUpdates": "Check for Updates", - "main.menus.app.file.unhide": "Show All", - "main.menus.app.file.signInToAnotherServer": "Sign in to another server", - "main.menus.app.file.settings": "Settings", - "main.menus.app.file.quit": "Quit {appName}", - "main.menus.app.file.preferences": "Preferences", - "main.menus.app.file.hideOthers": "Hide Others", - "main.menus.app.file.hide": "Hide {appName}", - "main.menus.app.file.exit": "Exit", - "main.menus.app.file.about": "About {appName}", - "main.menus.app.file": "&File", - "main.menus.app.edit.undo": "Undo", - "main.menus.app.edit.selectAll": "Select All", - "main.menus.app.edit.redo": "Redo", - "main.menus.app.edit.pasteAndMatchStyle": "Paste and Match Style", - "main.menus.app.edit.paste": "Paste", - "main.menus.app.edit.cut": "Cut", - "main.menus.app.edit.copy": "Copy", - "main.menus.app.edit": "&Edit", - "main.CriticalErrorHandler.unresponsive.dialog.message": "The window is no longer responsive.\nDo you want to wait until the window becomes responsive again?", - "main.CriticalErrorHandler.uncaughtException.dialog.message": "The {appName} app quit unexpectedly. Click '\\{showDetails}'\\ to learn more or '\\{reopen}'\\ to open the application again.\n\nInternal error: {err}", - "main.CriticalErrorHandler.uncaughtException.button.showDetails": "Show Details", - "main.CriticalErrorHandler.uncaughtException.button.reopen": "Reopen", - "main.badge.unreadMentions": "You have unread mentions ({mentionCount})", - "main.badge.unreadChannels": "You have unread channels", - "main.badge.sessionExpired": "Session Expired: Please sign in to continue receiving notifications.", - "main.badge.noUnreads": "You have no unread messages", - "main.autoUpdater.update.dialog.message": "A new version is ready to install", - "main.autoUpdater.update.dialog.detail": "A new version of the {appName} Desktop App is ready to install.", - "renderer.modals.permission.permissionModal.unknownOrigin": "unknown origin", - "renderer.modals.permission.permissionModal.title": "{permission} Required", - "renderer.modals.permission.permissionModal.requestOriginatedFromOrigin": "This request originated from {origin}", - "renderer.components.welcomeScreen.slides.welcome.title": "Welcome", - "renderer.components.welcomeScreen.slides.welcome.subtitle": "Mattermost is an open source platform for developer collaboration. Secure, flexible and integrated with the tools you love.", - "renderer.components.welcomeScreen.slides.playbooks.title": "Playbooks", - "renderer.components.welcomeScreen.slides.palybooks.subtitle": "Move faster and make fewer mistakes with checklists, automations and tool integrations that power your team’s workflows.", - "renderer.components.welcomeScreen.slides.channels.title": "Channels", - "renderer.components.welcomeScreen.slides.channels.subtitle": "All your team’s communication in one place.

Secure collaboration, built for developers.", - "renderer.components.welcomeScreen.slides.boards.title": "Boards", - "renderer.components.welcomeScreen.slides.boards.subtitle": "Ship your product on time, every time, with a project and task management solution built for digital operations.", - "renderer.components.welcomeScreen.button.getStarted": "Get started", - "renderer.components.mainPage.titleBar": "{appName}", - "renderer.components.saveButton.saving": "Saving", - "renderer.components.saveButton.save": "Save", - "renderer.components.input.required": "This field is required", - "renderer.components.configureServer.url.placeholder": "Server URL", - "renderer.components.configureServer.url.info": "The URL of your Mattermost server", - "renderer.components.configureServer.title": "Connect to a server", - "renderer.components.configureServer.subtitle": "Set up your first server to connect to your

team’s communication hub", - "renderer.components.configureServer.name.placeholder": "Server display name", - "renderer.components.configureServer.name.info": "The name that will be displayed in your server list", - "renderer.components.configureServer.connect.saving": "Connecting…", - "renderer.components.configureServer.connect.default": "Connect", - "renderer.components.configureServer.cardtitle": "Enter your server details", - "renderer.time.hours": "hours", - "renderer.downloadsDropdownMenu.ShowInFolder": "Show in Folder", - "renderer.downloadsDropdownMenu.ShowInFinder": "Show in Finder", - "renderer.downloadsDropdownMenu.ShowInFileManager": "Show in File Manager", - "renderer.downloadsDropdownMenu.ShowInFileExplorer": "Show in File Explorer", - "renderer.downloadsDropdownMenu.Open": "Open", - "renderer.downloadsDropdownMenu.Clear": "Clear", - "renderer.downloadsDropdownMenu.CancelDownload": "Cancel Download", - "renderer.downloadsDropdown.Update.RestartAndUpdate": "Restart & update", - "renderer.downloadsDropdown.Update.NewDesktopVersionAvailable": "New Desktop version available", - "renderer.downloadsDropdown.Update.MattermostVersionX": "{appName} version {version}", - "renderer.downloadsDropdown.Update.DownloadUpdate": "Download Update", - "renderer.downloadsDropdown.Update.ANewVersionIsAvailableToInstall": "A new version of the {appName} Desktop App (version {version}) is available to install.", - "renderer.downloadsDropdown.remaining": "remaining", - "renderer.downloadsDropdown.Downloads": "Downloads", - "renderer.downloadsDropdown.ClearAll": "Clear All", - "main.menus.app.view.downloads": "Downloads", - "renderer.time.sec": "seconds", - "renderer.time.mins": "minutes", - "renderer.components.errorView.havingTroubleConnecting": "A connection to {appName} couldn't be established. Retrying...", - "renderer.components.settingsPage.trayIcon.color": "Icon colour: ", - "main.menus.app.help.RunDiagnostics": "Run diagnostics", - "main.menus.app.help.ShowLogs": "Show logs", - "renderer.components.configureServer.connect.override": "Connect anyway", - "renderer.components.configureServer.url.insecure": "Your server URL is potentially insecure. For best results, use a URL with the HTTPS protocol.", - "renderer.components.configureServer.url.notMattermost": "The server URL provided does not appear to point to a valid Mattermost server. Please verify the URL and check your connection.", - "renderer.components.configureServer.url.ok": "Server URL is valid. Server version: {serverVersion}", - "renderer.components.configureServer.url.urlNotMatched": "The server URL provided does not match the configured Site URL on your Mattermost server. Server version: {serverVersion}", - "renderer.components.configureServer.url.urlUpdated": "The server URL provided has been updated to match the configured Site URL on your Mattermost server. Server version: {serverVersion}", - "renderer.components.configureServer.url.validating": "Validating...", - "renderer.components.newServerModal.success.ok": "Server URL is valid. Server version: {serverVersion}", - "renderer.components.newServerModal.validating": "Validating...", - "renderer.components.newServerModal.warning.insecure": "Your server URL is potentially insecure. For best results, use a URL with the HTTPS protocol.", - "renderer.components.newServerModal.warning.notMattermost": "The server URL provided does not appear to point to a valid Mattermost server. Please verify the URL and check your connection.", - "renderer.components.newServerModal.warning.urlNotMatched": "The server URL does not match the configured Site URL on your Mattermost server. Server version: {serverVersion}", - "renderer.components.newServerModal.warning.urlUpdated": "The server URL provided has been updated to match the configured Site URL on your Mattermost server. Server version: {serverVersion}", - "main.downloadsManager.resetDownloadsFolder": "Please reset the folder where files will download", - "main.downloadsManager.specifyDownloadsFolder": "Specify the folder where files will download", - "main.permissionsManager.checkPermission.dialog.detail.media": "{appName} will use the microphone and camera for calls and voice messages. You can always change this later in your computer's settings.", - "label.allow": "Allow", - "main.permissionsManager.checkPermission.dialog.detail.geolocation": "{appName} will use the location for setting up your timezone. You can always change this later in your computer's settings.", - "label.deny": "Deny", - "label.denyPermanently": "Deny Permanently", - "main.permissionsManager.checkPermission.dialog.detail.notifications": "{appName} will send you notifications for messages and calls. You can configure your notification preferences in Settings.", - "main.permissionsManager.checkPermission.dialog.message.geolocation": "{appName} ({url}) would like to access your location.", - "main.permissionsManager.checkPermission.dialog.message.media": "{appName} ({url}) would like to access the microphone and camera.", - "main.permissionsManager.checkPermission.dialog.message.notifications": "{appName} ({url}) would like to send you notifications.", - "main.permissionsManager.checkPermission.dialog.title": "Permission Requested" + "common.permissions.canBasicAuth": "Web Authentication", + "common.tabs.TAB_FOCALBOARD": "Boards", + "common.tabs.TAB_MESSAGING": "Channels", + "common.tabs.TAB_PLAYBOOKS": "Playbooks", + "label.accept": "Accept", + "label.add": "Add", + "label.allow": "Allow", + "label.cancel": "Cancel", + "label.change": "Change", + "label.close": "Close", + "label.deny": "Deny", + "label.denyPermanently": "Deny Permanently", + "label.login": "Login", + "label.no": "No", + "label.ok": "OK", + "label.remove": "Remove", + "label.save": "Save", + "label.yes": "Yes", + "main.CriticalErrorHandler.uncaughtException.button.reopen": "Reopen", + "main.CriticalErrorHandler.uncaughtException.button.showDetails": "Show Details", + "main.CriticalErrorHandler.uncaughtException.dialog.message": "The {appName} app quit unexpectedly. Click '\\{showDetails}'\\ to learn more or '\\{reopen}'\\ to open the application again.\n\nInternal error: {err}", + "main.CriticalErrorHandler.unresponsive.dialog.message": "The window is no longer responsive.\nDo you want to wait until the window becomes responsive again?", + "main.allowProtocolDialog.button.saveProtocolAsAllowed": "Yes (Save {protocol} as allowed)", + "main.allowProtocolDialog.detail": "The requested link is {URL}. Do you want to continue?", + "main.allowProtocolDialog.message": "{protocol} link requires an external application.", + "main.allowProtocolDialog.title": "Non http(s) protocol", + "main.app.app.handleAppCertificateError.certError.button.cancelConnection": "Cancel Connection", + "main.app.app.handleAppCertificateError.certError.button.moreDetails": "More Details", + "main.app.app.handleAppCertificateError.certError.dialog.detail": "{extraDetail}origin: {origin}\nError: {error}", + "main.app.app.handleAppCertificateError.certError.dialog.message": "There is a configuration issue with this Mattermost server, or someone is trying to intercept your connection. You also may need to sign into the Wi-Fi you are connected to using your web browser.", + "main.app.app.handleAppCertificateError.certError.dialog.title": "Certificate Error", + "main.app.app.handleAppCertificateError.certNotTrusted.button.cancelConnection": "Cancel Connection", + "main.app.app.handleAppCertificateError.certNotTrusted.button.trustInsecureCertificate": "Trust Insecure Certificate", + "main.app.app.handleAppCertificateError.certNotTrusted.dialog.message": "Certificate from '\\{issuerName}'\\ is not trusted.", + "main.app.app.handleAppCertificateError.certNotTrusted.dialog.title": "Certificate Not Trusted", + "main.app.app.handleAppCertificateError.dialog.extraDetail": "Certificate is different from previous one.\n\n", + "main.app.initialize.downloadBox.allFiles": "All files", + "main.app.utils.migrateMacAppStore.button.dontImport": "Don't Import", + "main.app.utils.migrateMacAppStore.button.selectAndImport": "Select Directory and Import", + "main.app.utils.migrateMacAppStore.dialog.detail": "It appears that an existing {appName} configuration exists, would you like to import it? You will be asked to pick the correct configuration directory.", + "main.app.utils.migrateMacAppStore.dialog.message": "Import Existing Configuration", + "main.autoUpdater.download.dialog.button.download": "Download", + "main.autoUpdater.download.dialog.button.remindMeLater": "Remind me later", + "main.autoUpdater.download.dialog.detail": "A new version of the {appName} Desktop App is available for you to download and install now.", + "main.autoUpdater.download.dialog.message": "New desktop version available", + "main.autoUpdater.noUpdate.detail": "You are using the latest version of the {appName} Desktop App (version {version}). You'll be notified when a new version is available to install.", + "main.autoUpdater.noUpdate.message": "You're up to date", + "main.autoUpdater.update.dialog.button.remindMeLater": "Remind me later", + "main.autoUpdater.update.dialog.button.restartAndUpdate": "Restart and Update", + "main.autoUpdater.update.dialog.detail": "A new version of the {appName} Desktop App is ready to install.", + "main.autoUpdater.update.dialog.message": "A new version is ready to install", + "main.badge.noUnreads": "You have no unread messages", + "main.badge.sessionExpired": "Session Expired: Please sign in to continue receiving notifications.", + "main.badge.unreadChannels": "You have unread channels", + "main.badge.unreadMentions": "You have unread mentions ({mentionCount})", + "main.downloadsManager.resetDownloadsFolder": "Please reset the folder where files will download", + "main.downloadsManager.specifyDownloadsFolder": "Specify the folder where files will download", + "main.menus.app.edit": "&Edit", + "main.menus.app.edit.copy": "Copy", + "main.menus.app.edit.cut": "Cut", + "main.menus.app.edit.paste": "Paste", + "main.menus.app.edit.pasteAndMatchStyle": "Paste and Match Style", + "main.menus.app.edit.redo": "Redo", + "main.menus.app.edit.selectAll": "Select All", + "main.menus.app.edit.undo": "Undo", + "main.menus.app.file": "&File", + "main.menus.app.file.about": "About {appName}", + "main.menus.app.file.exit": "Exit", + "main.menus.app.file.hide": "Hide {appName}", + "main.menus.app.file.hideOthers": "Hide Others", + "main.menus.app.file.preferences": "Preferences", + "main.menus.app.file.quit": "Quit {appName}", + "main.menus.app.file.settings": "Settings", + "main.menus.app.file.signInToAnotherServer": "Sign in to another server", + "main.menus.app.file.unhide": "Show All", + "main.menus.app.help": "Hel&p", + "main.menus.app.help.RunDiagnostics": "Run diagnostics", + "main.menus.app.help.ShowLogs": "Show logs", + "main.menus.app.help.checkForUpdates": "Check for Updates", + "main.menus.app.help.commitString": " commit: {hashVersion}", + "main.menus.app.help.downloadUpdate": "Download Update", + "main.menus.app.help.learnMore": "Learn More...", + "main.menus.app.help.restartAndUpdate": "Restart and Update", + "main.menus.app.help.versionString": "Version {version}{commit}", + "main.menus.app.history": "&History", + "main.menus.app.history.back": "Back", + "main.menus.app.history.forward": "Forward", + "main.menus.app.view": "&View", + "main.menus.app.view.actualSize": "Actual Size", + "main.menus.app.view.clearCacheAndReload": "Clear Cache and Reload", + "main.menus.app.view.devToolsAppWrapper": "Developer Tools for Application Wrapper", + "main.menus.app.view.devToolsCurrentCallWidget": "Developer Tools for Call Widget", + "main.menus.app.view.devToolsCurrentServer": "Developer Tools for Current Server", + "main.menus.app.view.devToolsSubMenu": "Developer Tools", + "main.menus.app.view.downloads": "Downloads", + "main.menus.app.view.find": "Find...", + "main.menus.app.view.fullscreen": "Toggle Full Screen", + "main.menus.app.view.reload": "Reload", + "main.menus.app.view.toggleDarkMode": "Toggle Dark Mode", + "main.menus.app.view.zoomIn": "Zoom In", + "main.menus.app.view.zoomOut": "Zoom Out", + "main.menus.app.window": "&Window", + "main.menus.app.window.bringAllToFront": "Bring all to front", + "main.menus.app.window.close": "Close", + "main.menus.app.window.closeWindow": "Close Window", + "main.menus.app.window.minimize": "Minimise", + "main.menus.app.window.selectNextTab": "Select Next Tab", + "main.menus.app.window.selectPreviousTab": "Select Previous Tab", + "main.menus.app.window.showServers": "Show Servers", + "main.menus.app.window.zoom": "Zoom", + "main.menus.tray.preferences": "Preferences", + "main.menus.tray.settings": "Settings", + "main.notifications.download.complete.body": "Download Complete \n {fileName}", + "main.notifications.download.complete.title": "Download Complete", + "main.notifications.mention.title": "Someone mentioned you", + "main.notifications.upgrade.newVersion.body": "A new version is available for you to download now.", + "main.notifications.upgrade.newVersion.title": "New desktop version available", + "main.notifications.upgrade.readyToInstall.body": "A new desktop version is ready to install now.", + "main.notifications.upgrade.readyToInstall.title": "Click to restart and install update", + "main.permissionsManager.checkPermission.dialog.detail.geolocation": "{appName} will use the location for setting up your timezone. You can always change this later in your computer's settings.", + "main.permissionsManager.checkPermission.dialog.detail.media": "{appName} will use the microphone and camera for calls and voice messages. You can always change this later in your computer's settings.", + "main.permissionsManager.checkPermission.dialog.detail.notifications": "{appName} will send you notifications for messages and calls. You can configure your notification preferences in Settings.", + "main.permissionsManager.checkPermission.dialog.message.geolocation": "{appName} ({url}) would like to access your location.", + "main.permissionsManager.checkPermission.dialog.message.media": "{appName} ({url}) would like to access the microphone and camera.", + "main.permissionsManager.checkPermission.dialog.message.notifications": "{appName} ({url}) would like to send you notifications.", + "main.permissionsManager.checkPermission.dialog.title": "Permission Requested", + "main.tray.tray.expired": "Session Expired: Please sign in to continue receiving notifications.", + "main.tray.tray.mention": "You have been mentioned", + "main.tray.tray.unread": "You have unread channels", + "main.views.viewManager.handleDeepLink.error.body": "There is no configured server in the app that matches the requested URL: {url}", + "main.views.viewManager.handleDeepLink.error.title": "No matching server", + "main.windows.mainWindow.closeApp.dialog.checkboxLabel": "Don't ask again", + "main.windows.mainWindow.closeApp.dialog.detail": "You will no longer receive notifications for messages. If you want to leave {appName} running in the system tray, you can enable this in Settings.", + "main.windows.mainWindow.closeApp.dialog.message": "Are you sure you want to quit?", + "main.windows.mainWindow.closeApp.dialog.title": "Close Application", + "main.windows.mainWindow.minimizeToTray.dialog.checkboxLabel": "Don't show again", + "main.windows.mainWindow.minimizeToTray.dialog.message": "{appName} will continue to run in the system tray. This can be disabled in Settings.", + "main.windows.mainWindow.minimizeToTray.dialog.title": "Minimise to Tray", + "renderer.components.autoSaveIndicator.saved": "Saved", + "renderer.components.autoSaveIndicator.saving": "Saving...", + "renderer.components.configureServer.cardtitle": "Enter your server details", + "renderer.components.configureServer.connect.default": "Connect", + "renderer.components.configureServer.connect.override": "Connect anyway", + "renderer.components.configureServer.connect.saving": "Connecting…", + "renderer.components.configureServer.name.info": "The name that will be displayed in your server list", + "renderer.components.configureServer.name.placeholder": "Server display name", + "renderer.components.configureServer.subtitle": "Set up your first server to connect to your

team’s communication hub", + "renderer.components.configureServer.title": "Connect to a server", + "renderer.components.configureServer.url.info": "The URL of your Mattermost server", + "renderer.components.configureServer.url.insecure": "Your server URL is potentially insecure. For best results, use a URL with the HTTPS protocol.", + "renderer.components.configureServer.url.notMattermost": "The server URL provided does not appear to point to a valid Mattermost server. Please verify the URL and check your connection.", + "renderer.components.configureServer.url.ok": "Server URL is valid. Server version: {serverVersion}", + "renderer.components.configureServer.url.placeholder": "Server URL", + "renderer.components.configureServer.url.urlNotMatched": "The server URL provided does not match the configured Site URL on your Mattermost server. Server version: {serverVersion}", + "renderer.components.configureServer.url.urlUpdated": "The server URL provided has been updated to match the configured Site URL on your Mattermost server. Server version: {serverVersion}", + "renderer.components.configureServer.url.validating": "Validating...", + "renderer.components.errorView.cannotConnectToAppName": "Cannot connect to {appName}", + "renderer.components.errorView.havingTroubleConnecting": "A connection to {appName} couldn't be established. Retrying...", + "renderer.components.errorView.refreshThenVerify": "If refreshing this page (Ctrl+R or Command+R) does not work, please verify that:", + "renderer.components.errorView.troubleshooting.browserView.canReachFromBrowserWindow": "You can reach {url} from a browser window.", + "renderer.components.errorView.troubleshooting.computerIsConnected": "Your computer is connected to the internet.", + "renderer.components.errorView.troubleshooting.urlIsCorrect.appNameIsCorrect": "The {appName} URL {url} is correct", + "renderer.components.extraBar.back": "Back", + "renderer.components.input.required": "This field is required", + "renderer.components.mainPage.contextMenu.ariaLabel": "Context menu", + "renderer.components.mainPage.downloadingUpdate": "Downloading update. {percentDone}% of {total} @ {speed}/s", + "renderer.components.mainPage.titleBar": "{appName}", + "renderer.components.mainPage.updateAvailable": "Update available", + "renderer.components.mainPage.updateReady": "Update ready to install", + "renderer.components.newServerModal.error.nameRequired": "Name is required.", + "renderer.components.newServerModal.error.serverNameExists": "A server with the same name already exists.", + "renderer.components.newServerModal.error.serverUrlExists": "A server with the same URL already exists.", + "renderer.components.newServerModal.error.urlIncorrectFormatting": "URL is not formatted correctly.", + "renderer.components.newServerModal.error.urlNeedsHttp": "URL should start with http:// or https://.", + "renderer.components.newServerModal.error.urlRequired": "URL is required.", + "renderer.components.newServerModal.serverDisplayName": "Server Display Name", + "renderer.components.newServerModal.serverDisplayName.description": "The name of the server displayed on your desktop app tab bar.", + "renderer.components.newServerModal.serverURL": "Server URL", + "renderer.components.newServerModal.serverURL.description": "The URL of your Mattermost server. Must start with http:// or https://.", + "renderer.components.newServerModal.success.ok": "Server URL is valid. Server version: {serverVersion}", + "renderer.components.newServerModal.title.add": "Add Server", + "renderer.components.newServerModal.title.edit": "Edit Server", + "renderer.components.newServerModal.validating": "Validating...", + "renderer.components.newServerModal.warning.insecure": "Your server URL is potentially insecure. For best results, use a URL with the HTTPS protocol.", + "renderer.components.newServerModal.warning.notMattermost": "The server URL provided does not appear to point to a valid Mattermost server. Please verify the URL and check your connection.", + "renderer.components.newServerModal.warning.urlNotMatched": "The server URL does not match the configured Site URL on your Mattermost server. Server version: {serverVersion}", + "renderer.components.newServerModal.warning.urlUpdated": "The server URL provided has been updated to match the configured Site URL on your Mattermost server. Server version: {serverVersion}", + "renderer.components.removeServerModal.body": "This will remove the server from your Desktop App but will not delete any of its data - you can add the server back to the app at any time.", + "renderer.components.removeServerModal.confirm": "Confirm you wish to remove the {serverName} server?", + "renderer.components.removeServerModal.title": "Remove Server", + "renderer.components.saveButton.save": "Save", + "renderer.components.saveButton.saving": "Saving", + "renderer.components.serverDropdownButton.noServersConfigured": "No servers configured", + "renderer.components.settingsPage.afterRestart": "Setting takes effect after restarting the app.", + "renderer.components.settingsPage.appLanguage": "Set app language (beta)", + "renderer.components.settingsPage.appLanguage.description": "Chooses the language that the Desktop App will use for menu items and popups. This feature is still in beta, and some languages will be missing translation strings.", + "renderer.components.settingsPage.appLanguage.useSystemDefault": "Use system default", + "renderer.components.settingsPage.appOptions": "App Options", + "renderer.components.settingsPage.bounceIcon": "Bounce the Dock icon", + "renderer.components.settingsPage.bounceIcon.description": "If enabled, the Dock icon bounces once or until the user opens the app when a new notification is received.", + "renderer.components.settingsPage.bounceIcon.once": "once", + "renderer.components.settingsPage.bounceIcon.untilOpenApp": "until I open the app", + "renderer.components.settingsPage.checkSpelling": "Check spelling", + "renderer.components.settingsPage.checkSpelling.description": "Highlight misspelt words in your messages based on your system language or language preference.", + "renderer.components.settingsPage.checkSpelling.editSpellcheckUrl": "Use an alternative dictionary URL", + "renderer.components.settingsPage.checkSpelling.preferredLanguages": "Select preferred language(s)", + "renderer.components.settingsPage.checkSpelling.revertToDefault": "Revert to default", + "renderer.components.settingsPage.checkSpelling.specifyURL": "Specify the URL where dictionary definitions can be retrieved", + "renderer.components.settingsPage.downloadLocation": "Download Location", + "renderer.components.settingsPage.downloadLocation.description": "Specify the folder where files will download.", + "renderer.components.settingsPage.enableHardwareAcceleration": "Use GPU hardware acceleration", + "renderer.components.settingsPage.enableHardwareAcceleration.description": "If enabled, {appName} UI is rendered more efficiently but can lead to decreased stability for some systems.", + "renderer.components.settingsPage.flashWindow": "Flash taskbar icon when a new message is received", + "renderer.components.settingsPage.flashWindow.description": "If enabled, the taskbar icon will flash for a few seconds when a new message is received.", + "renderer.components.settingsPage.flashWindow.description.linuxFunctionality": "This functionality may not work with all Linux window managers.", + "renderer.components.settingsPage.flashWindow.description.note": "NOTE: ", + "renderer.components.settingsPage.fullscreen": "Open app in fullscreen", + "renderer.components.settingsPage.fullscreen.description": "If enabled, the {appName} application will always open in full screen", + "renderer.components.settingsPage.header": "Settings", + "renderer.components.settingsPage.launchAppMinimized": "Launch app minimised", + "renderer.components.settingsPage.launchAppMinimized.description": "If enabled, the app will start in system tray, and will not show the window on launch.", + "renderer.components.settingsPage.loadingConfig": "Loading configuration...", + "renderer.components.settingsPage.loggingLevel": "Logging level", + "renderer.components.settingsPage.loggingLevel.description": "Logging is helpful for developers and support to isolate issues you may be encountering with the desktop app.", + "renderer.components.settingsPage.loggingLevel.description.subtitle": "Increasing the log level increases disk space usage and can impact performance. It is recommended to only increase the log level if you are having issues.", + "renderer.components.settingsPage.loggingLevel.level.debug": "Debug (debug)", + "renderer.components.settingsPage.loggingLevel.level.error": "Errors (error)", + "renderer.components.settingsPage.loggingLevel.level.info": "Informational (info)", + "renderer.components.settingsPage.loggingLevel.level.silly": "Finest (silly)", + "renderer.components.settingsPage.loggingLevel.level.verbose": "Verbose (verbose)", + "renderer.components.settingsPage.loggingLevel.level.warn": "Errors and Warnings (warn)", + "renderer.components.settingsPage.minimizeToTray": "Leave the app running in the notification area when the application window is closed", + "renderer.components.settingsPage.minimizeToTray.description": "If enabled, the app stays running in the notification area after app window is closed.", + "renderer.components.settingsPage.saving.error": "Your changes can't be saved. Please try again.", + "renderer.components.settingsPage.showUnreadBadge": "Show red badge on {taskbar} icon to indicate unread messages", + "renderer.components.settingsPage.showUnreadBadge.description": "Regardless of this setting, mentions are always indicated with a red badge and item count on the {taskbar} icon.", + "renderer.components.settingsPage.startAppOnLogin": "Start app on login", + "renderer.components.settingsPage.startAppOnLogin.description": "If enabled, the app starts automatically when you log in to your machine.", + "renderer.components.settingsPage.trayIcon.color": "Icon colour: ", + "renderer.components.settingsPage.trayIcon.show": "Show icon in the notification area", + "renderer.components.settingsPage.trayIcon.show.darwin": "Show {appName} icon in the menu bar", + "renderer.components.settingsPage.trayIcon.theme": "Icon theme: ", + "renderer.components.settingsPage.trayIcon.theme.dark": "Dark", + "renderer.components.settingsPage.trayIcon.theme.light": "Light", + "renderer.components.settingsPage.trayIcon.theme.systemDefault": "Use system default", + "renderer.components.settingsPage.updates": "Updates", + "renderer.components.settingsPage.updates.automatic": "Automatically check for updates", + "renderer.components.settingsPage.updates.automatic.description": "If enabled, updates to the Desktop App will download automatically and you will be notified when they're ready to install.", + "renderer.components.settingsPage.updates.checkNow": "Check for Updates now", + "renderer.components.showCertificateModal.algorithm": "Algorithm", + "renderer.components.showCertificateModal.commonName": "Common Name", + "renderer.components.showCertificateModal.issuerName": "Issuer Name", + "renderer.components.showCertificateModal.noCertSelected": "No certificate selected", + "renderer.components.showCertificateModal.notValidAfter": "Not Valid After", + "renderer.components.showCertificateModal.notValidBefore": "Not Valid Before", + "renderer.components.showCertificateModal.publicKeyInfo": "Public Key Info", + "renderer.components.showCertificateModal.serialNumber": "Serial Number", + "renderer.components.showCertificateModal.subjectName": "Subject Name", + "renderer.components.welcomeScreen.button.getStarted": "Get started", + "renderer.components.welcomeScreen.slides.boards.subtitle": "Ship your product on time, every time, with a project and task management solution built for digital operations.", + "renderer.components.welcomeScreen.slides.boards.title": "Boards", + "renderer.components.welcomeScreen.slides.channels.subtitle": "All your team’s communication in one place.

Secure collaboration, built for developers.", + "renderer.components.welcomeScreen.slides.channels.title": "Channels", + "renderer.components.welcomeScreen.slides.palybooks.subtitle": "Move faster and make fewer mistakes with checklists, automations and tool integrations that power your team’s workflows.", + "renderer.components.welcomeScreen.slides.playbooks.title": "Playbooks", + "renderer.components.welcomeScreen.slides.welcome.subtitle": "Mattermost is an open source platform for developer collaboration. Secure, flexible and integrated with the tools you love.", + "renderer.components.welcomeScreen.slides.welcome.title": "Welcome", + "renderer.downloadsDropdown.ClearAll": "Clear All", + "renderer.downloadsDropdown.Downloads": "Downloads", + "renderer.downloadsDropdown.Update.ANewVersionIsAvailableToInstall": "A new version of the {appName} Desktop App (version {version}) is available to install.", + "renderer.downloadsDropdown.Update.DownloadUpdate": "Download Update", + "renderer.downloadsDropdown.Update.MattermostVersionX": "{appName} version {version}", + "renderer.downloadsDropdown.Update.NewDesktopVersionAvailable": "New Desktop version available", + "renderer.downloadsDropdown.Update.RestartAndUpdate": "Restart & update", + "renderer.downloadsDropdown.remaining": "remaining", + "renderer.downloadsDropdownMenu.CancelDownload": "Cancel Download", + "renderer.downloadsDropdownMenu.Clear": "Clear", + "renderer.downloadsDropdownMenu.Open": "Open", + "renderer.downloadsDropdownMenu.ShowInFileExplorer": "Show in File Explorer", + "renderer.downloadsDropdownMenu.ShowInFileManager": "Show in File Manager", + "renderer.downloadsDropdownMenu.ShowInFinder": "Show in Finder", + "renderer.downloadsDropdownMenu.ShowInFolder": "Show in Folder", + "renderer.dropdown.addAServer": "Add a server", + "renderer.dropdown.servers": "Servers", + "renderer.modals.certificate.certificateModal.certInfoButton": "Certificate Information", + "renderer.modals.certificate.certificateModal.issuer": "Issuer", + "renderer.modals.certificate.certificateModal.noCertsAvailable": "No certificates available", + "renderer.modals.certificate.certificateModal.serial": "Serial", + "renderer.modals.certificate.certificateModal.subject": "Subject", + "renderer.modals.certificate.certificateModal.subtitle": "Select a certificate to authenticate yourself to {url}", + "renderer.modals.certificate.certificateModal.title": "Select a certificate", + "renderer.modals.login.loginModal.message.proxy": "The proxy {host}:{port} requires a username and password.", + "renderer.modals.login.loginModal.message.server": "The server {url} requires a username and password.", + "renderer.modals.login.loginModal.password": "Password", + "renderer.modals.login.loginModal.title": "Authentication Required", + "renderer.modals.login.loginModal.username": "User Name", + "renderer.modals.permission.permissionModal.body": "A site that's not included in your Mattermost server configuration requires access for {permission}.", + "renderer.modals.permission.permissionModal.requestOriginatedFromOrigin": "This request originated from {origin}", + "renderer.modals.permission.permissionModal.title": "{permission} Required", + "renderer.modals.permission.permissionModal.unknownOrigin": "unknown origin", + "renderer.time.hours": "hours", + "renderer.time.mins": "minutes", + "renderer.time.sec": "seconds" } diff --git a/i18n/zh-CN.json b/i18n/zh-CN.json index d0a4b1f6..e22d22db 100644 --- a/i18n/zh-CN.json +++ b/i18n/zh-CN.json @@ -89,7 +89,9 @@ "main.menus.app.view.actualSize": "实际尺寸", "main.menus.app.view.clearCacheAndReload": "清除缓存并重新加载", "main.menus.app.view.devToolsAppWrapper": "Application Wrapper 开发工具", + "main.menus.app.view.devToolsCurrentCallWidget": "通话小组件开发人员工具", "main.menus.app.view.devToolsCurrentServer": "当前服务器的开发者工具", + "main.menus.app.view.devToolsSubMenu": "开发人员工具", "main.menus.app.view.downloads": "下载", "main.menus.app.view.find": "查找...", "main.menus.app.view.fullscreen": "全屏", diff --git a/src/main/preload/externalAPI.ts b/src/main/preload/externalAPI.ts index 9273ddca..28609279 100644 --- a/src/main/preload/externalAPI.ts +++ b/src/main/preload/externalAPI.ts @@ -81,25 +81,30 @@ const desktopAPI: DesktopAPI = { onBrowserHistoryPush: (listener) => createListener(BROWSER_HISTORY_PUSH, listener), sendBrowserHistoryPush: (path) => ipcRenderer.send(BROWSER_HISTORY_PUSH, path), - // Calls widget - openLinkFromCallsWidget: (url) => ipcRenderer.send(CALLS_LINK_CLICK, url), - openScreenShareModal: () => ipcRenderer.send(DESKTOP_SOURCES_MODAL_REQUEST), - onScreenShared: (listener) => createListener(CALLS_WIDGET_SHARE_SCREEN, listener), - callsWidgetConnected: (callID, sessionID) => ipcRenderer.send(CALLS_JOINED_CALL, callID, sessionID), - onJoinCallRequest: (listener) => createListener(CALLS_JOIN_REQUEST, listener), - resizeCallsWidget: (width, height) => ipcRenderer.send(CALLS_WIDGET_RESIZE, width, height), - focusPopout: () => ipcRenderer.send(CALLS_POPOUT_FOCUS), - leaveCall: () => ipcRenderer.send(CALLS_LEAVE_CALL), - sendCallsError: (error) => ipcRenderer.send(CALLS_ERROR, error), - - // Calls plugin - getDesktopSources: (opts) => ipcRenderer.invoke(GET_DESKTOP_SOURCES, opts), - onOpenScreenShareModal: (listener) => createListener(DESKTOP_SOURCES_MODAL_REQUEST, listener), - shareScreen: (sourceID, withAudio) => ipcRenderer.send(CALLS_WIDGET_SHARE_SCREEN, sourceID, withAudio), + // Calls joinCall: (opts) => ipcRenderer.invoke(CALLS_JOIN_CALL, opts), - sendJoinCallRequest: (callId) => ipcRenderer.send(CALLS_JOIN_REQUEST, callId), + leaveCall: () => ipcRenderer.send(CALLS_LEAVE_CALL), + + callsWidgetConnected: (callID, sessionID) => ipcRenderer.send(CALLS_JOINED_CALL, callID, sessionID), + resizeCallsWidget: (width, height) => ipcRenderer.send(CALLS_WIDGET_RESIZE, width, height), + + sendCallsError: (err, callID, errMsg) => ipcRenderer.send(CALLS_ERROR, err, callID, errMsg), onCallsError: (listener) => createListener(CALLS_ERROR, listener), + getDesktopSources: (opts) => ipcRenderer.invoke(GET_DESKTOP_SOURCES, opts), + openScreenShareModal: () => ipcRenderer.send(DESKTOP_SOURCES_MODAL_REQUEST), + onOpenScreenShareModal: (listener) => createListener(DESKTOP_SOURCES_MODAL_REQUEST, listener), + + shareScreen: (sourceID, withAudio) => ipcRenderer.send(CALLS_WIDGET_SHARE_SCREEN, sourceID, withAudio), + onScreenShared: (listener) => createListener(CALLS_WIDGET_SHARE_SCREEN, listener), + + sendJoinCallRequest: (callId) => ipcRenderer.send(CALLS_JOIN_REQUEST, callId), + onJoinCallRequest: (listener) => createListener(CALLS_JOIN_REQUEST, listener), + + openLinkFromCalls: (url) => ipcRenderer.send(CALLS_LINK_CLICK, url), + + focusPopout: () => ipcRenderer.send(CALLS_POPOUT_FOCUS), + // Utility unregister: (channel) => ipcRenderer.removeAllListeners(channel), }; diff --git a/src/main/windows/callsWidgetWindow.test.js b/src/main/windows/callsWidgetWindow.test.js index 5739f7e2..9ea63a32 100644 --- a/src/main/windows/callsWidgetWindow.test.js +++ b/src/main/windows/callsWidgetWindow.test.js @@ -7,7 +7,7 @@ import {BrowserWindow, desktopCapturer, systemPreferences, ipcMain} from 'electr import ServerViewState from 'app/serverViewState'; -import {CALLS_WIDGET_SHARE_SCREEN, UPDATE_SHORTCUT_MENU} from 'common/communication'; +import {CALLS_WIDGET_SHARE_SCREEN, BROWSER_HISTORY_PUSH, UPDATE_SHORTCUT_MENU} from 'common/communication'; import { MINIMUM_CALLS_WIDGET_WIDTH, MINIMUM_CALLS_WIDGET_HEIGHT, @@ -534,6 +534,7 @@ describe('main/windows/callsWidgetWindow', () => { describe('handleGetDesktopSources', () => { const callsWidgetWindow = new CallsWidgetWindow(); + callsWidgetWindow.options = {callID: 'callID'}; callsWidgetWindow.win = { webContents: { send: jest.fn(), @@ -626,12 +627,8 @@ describe('main/windows/callsWidgetWindow', () => { it('should send error with no sources', async () => { jest.spyOn(desktopCapturer, 'getSources').mockResolvedValue([]); await callsWidgetWindow.handleGetDesktopSources({sender: {id: 1}}, null); - expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', { - err: 'screen-permissions', - }); - expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', { - err: 'screen-permissions', - }); + expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID'); + expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID'); expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledTimes(1); }); @@ -649,12 +646,8 @@ describe('main/windows/callsWidgetWindow', () => { await callsWidgetWindow.handleGetDesktopSources({sender: {id: 1}}, null); expect(systemPreferences.getMediaAccessStatus).toHaveBeenCalledWith('screen'); - expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', { - err: 'screen-permissions', - }); - expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', { - err: 'screen-permissions', - }); + expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID'); + expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID'); expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledTimes(1); expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledTimes(1); }); @@ -680,12 +673,8 @@ describe('main/windows/callsWidgetWindow', () => { expect(callsWidgetWindow.missingScreensharePermissions).toBe(true); expect(resetScreensharePermissionsMacOS).toHaveBeenCalledTimes(1); expect(openScreensharePermissionsSettingsMacOS).toHaveBeenCalledTimes(0); - expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', { - err: 'screen-permissions', - }); - expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', { - err: 'screen-permissions', - }); + expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID'); + expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID'); await callsWidgetWindow.handleGetDesktopSources({sender: {id: 1}}, null); @@ -799,6 +788,49 @@ describe('main/windows/callsWidgetWindow', () => { }); }); + describe('handleCallsLinkClick', () => { + const view = { + view: { + server: { + id: 'server-1', + }, + }, + sendToRenderer: jest.fn(), + }; + const callsWidgetWindow = new CallsWidgetWindow(); + callsWidgetWindow.mainView = view; + callsWidgetWindow.win = {webContents: {id: 1}}; + + const focus = jest.fn(); + + beforeEach(() => { + urlUtils.parseURL.mockImplementation((url) => { + try { + return new URL(url); + } catch (e) { + return undefined; + } + }); + MainWindow.get.mockReturnValue({focus}); + ViewManager.getView.mockReturnValue(view); + ViewManager.handleDeepLink = jest.fn(); + }); + + it('should switch server, focus and send history push event', () => { + const url = '/team/channel'; + callsWidgetWindow.handleCallsLinkClick({sender: {id: 1}}, url); + expect(ServerViewState.switchServer).toHaveBeenCalledWith('server-1'); + expect(focus).toHaveBeenCalled(); + expect(view.sendToRenderer).toBeCalledWith(BROWSER_HISTORY_PUSH, url); + }); + + it('should call ViewManager.handleDeepLink for parseable urls', () => { + const url = 'http://localhost:8065/team/channel'; + callsWidgetWindow.handleCallsLinkClick({sender: {id: 1}}, url); + expect(ViewManager.handleDeepLink).toHaveBeenCalledWith(new URL(url)); + }); + }); + describe('isOpen', () => { const callsWidgetWindow = new CallsWidgetWindow(); diff --git a/src/main/windows/callsWidgetWindow.ts b/src/main/windows/callsWidgetWindow.ts index 84e939cd..9e80963e 100644 --- a/src/main/windows/callsWidgetWindow.ts +++ b/src/main/windows/callsWidgetWindow.ts @@ -69,7 +69,7 @@ export class CallsWidgetWindow { // forwards to the main app ipcMain.on(DESKTOP_SOURCES_MODAL_REQUEST, this.forwardToMainApp(DESKTOP_SOURCES_MODAL_REQUEST)); ipcMain.on(CALLS_ERROR, this.forwardToMainApp(CALLS_ERROR)); - ipcMain.on(CALLS_LINK_CLICK, this.forwardToMainApp(CALLS_LINK_CLICK)); + ipcMain.on(CALLS_LINK_CLICK, this.handleCallsLinkClick); ipcMain.on(CALLS_JOIN_REQUEST, this.forwardToMainApp(CALLS_JOIN_REQUEST)); // deprecated in favour of CALLS_LINK_CLICK @@ -394,7 +394,7 @@ export class CallsWidgetWindow { } } - const screenPermissionsErrMsg = {err: 'screen-permissions'}; + const screenPermissionsErrArgs = ['screen-permissions', this.callID]; return desktopCapturer.getSources(opts).then((sources) => { let hasScreenPermissions = true; @@ -409,8 +409,8 @@ export class CallsWidgetWindow { if (!hasScreenPermissions || !sources.length) { log.info('missing screen permissions'); - view.sendToRenderer(CALLS_ERROR, screenPermissionsErrMsg); - this.win?.webContents.send(CALLS_ERROR, screenPermissionsErrMsg); + view.sendToRenderer(CALLS_ERROR, ...screenPermissionsErrArgs); + this.win?.webContents.send(CALLS_ERROR, ...screenPermissionsErrArgs); return []; } @@ -426,8 +426,8 @@ export class CallsWidgetWindow { }).catch((err) => { log.error('desktopCapturer.getSources failed', err); - view.sendToRenderer(CALLS_ERROR, screenPermissionsErrMsg); - this.win?.webContents.send(CALLS_ERROR, screenPermissionsErrMsg); + view.sendToRenderer(CALLS_ERROR, ...screenPermissionsErrArgs); + this.win?.webContents.send(CALLS_ERROR, ...screenPermissionsErrArgs); return []; }); @@ -505,6 +505,31 @@ export class CallsWidgetWindow { }; } + private handleCallsLinkClick = (event: IpcMainEvent, url: string) => { + log.debug('handleCallsLinkClick', url); + + if (!this.isCallsWidget(event.sender.id)) { + return; + } + + if (!this.serverID) { + return; + } + + const parsedURL = parseURL(url); + if (parsedURL) { + ViewManager.handleDeepLink(parsedURL); + return; + } + + // If parsing above fails it means it's a relative path (e.g. + // pointing to a channel). + + ServerViewState.switchServer(this.serverID); + MainWindow.get()?.focus(); + this.mainView?.sendToRenderer(BROWSER_HISTORY_PUSH, url); + } + /** * @deprecated */ diff --git a/src/types/externalAPI.ts b/src/types/externalAPI.ts index 949c59df..4c33863a 100644 --- a/src/types/externalAPI.ts +++ b/src/types/externalAPI.ts @@ -20,5 +20,6 @@ export interface ExternalAPI { createListener(event: 'calls-widget-share-screen', listener: (sourceID: string, withAudio: boolean) => void): () => void; createListener(event: 'calls-join-request', listener: (callID: string) => void): () => void; createListener(event: 'calls-error', listener: (err: string, callID?: string, errMsg?: string) => void): () => void; + createListener(event: 'calls-link-click', listener: (url: string) => void): () => void; createListener(event: 'desktop-sources-modal-request', listener: () => void): () => void; }