Merge remote-tracking branch 'origin/master' into post-zephry-link-channel

This commit is contained in:
yasserfaraazkhan 2024-01-26 14:10:17 +05:30
commit eee4b19b6c
12 changed files with 617 additions and 497 deletions

View file

@ -38,30 +38,36 @@ export type DesktopAPI = {
onBrowserHistoryPush: (listener: (pathName: string) => void) => () => void; onBrowserHistoryPush: (listener: (pathName: string) => void) => () => void;
sendBrowserHistoryPush: (path: string) => void; sendBrowserHistoryPush: (path: string) => void;
// Calls widget // Calls
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<DesktopCaptureSource[]>;
onOpenScreenShareModal: (listener: () => void) => () => void;
shareScreen: (sourceID: string, withAudi: boolean) => void;
joinCall: (opts: { joinCall: (opts: {
callID: string; callID: string;
title: string; title: string;
rootID: string; rootID: string;
channelURL: string; channelURL: string;
}) => Promise<{callID: string; sessionID: 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; onCallsError: (listener: (err: string, callID?: string, errMsg?: string) => void) => () => void;
getDesktopSources: (opts: DesktopSourcesOptions) => Promise<DesktopCaptureSource[]>;
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 // Utility
unregister: (channel: string) => void; unregister: (channel: string) => void;
} }

View file

@ -1,3 +1,5 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
export declare type DesktopSourcesOptions = { export declare type DesktopSourcesOptions = {
types: Array<'screen' | 'window'>; types: Array<'screen' | 'window'>;
thumbnailSize?: { thumbnailSize?: {
@ -30,18 +32,6 @@ export declare type DesktopAPI = {
onBrowserHistoryStatusUpdated: (listener: (canGoBack: boolean, canGoForward: boolean) => void) => () => void; onBrowserHistoryStatusUpdated: (listener: (canGoBack: boolean, canGoForward: boolean) => void) => () => void;
onBrowserHistoryPush: (listener: (pathName: string) => void) => () => void; onBrowserHistoryPush: (listener: (pathName: string) => void) => () => void;
sendBrowserHistoryPush: (path: string) => 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<DesktopCaptureSource[]>;
onOpenScreenShareModal: (listener: () => void) => () => void;
shareScreen: (sourceID: string, withAudi: boolean) => void;
joinCall: (opts: { joinCall: (opts: {
callID: string; callID: string;
title: string; title: string;
@ -51,7 +41,19 @@ export declare type DesktopAPI = {
callID: string; callID: string;
sessionID: 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; onCallsError: (listener: (err: string, callID?: string, errMsg?: string) => void) => () => void;
getDesktopSources: (opts: DesktopSourcesOptions) => Promise<DesktopCaptureSource[]>;
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; unregister: (channel: string) => void;
}; };

View file

@ -1,4 +1,7 @@
"use strict";
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information. // 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});

View file

@ -1,12 +1,12 @@
{ {
"name": "@mattermost/desktop-api", "name": "@mattermost/desktop-api",
"version": "5.7.0-2", "version": "5.7.0-3",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@mattermost/desktop-api", "name": "@mattermost/desktop-api",
"version": "5.7.0-2", "version": "5.7.0-3",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"typescript": "^4.3" "typescript": "^4.3"

View file

@ -1,6 +1,6 @@
{ {
"name": "@mattermost/desktop-api", "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", "description": "Shared types for the Desktop App API provided to the Web App",
"keywords": [ "keywords": [
"mattermost" "mattermost"

View file

@ -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": "مصادقه الويب", "common.permissions.canBasicAuth": "مصادقه الويب",
"main.menus.app.help.checkForUpdates": "تحقق من وجود تحديثات", "common.tabs.TAB_FOCALBOARD": "اللوحات",
"main.menus.app.help": "المساعدة", "common.tabs.TAB_MESSAGING": "القنوات",
"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", "common.tabs.TAB_PLAYBOOKS": "Playbooks",
"renderer.components.configureServer.connect.saving": "توصيل", "label.accept": "قبول",
"renderer.components.configureServer.connect.default": "يتصل", "label.add": "أضف",
"renderer.components.configureServer.cardtitle": "أدخل تفاصيل الخادم الخاص بك", "label.allow": "سماح",
"renderer.components.autoSaveIndicator.saving": "يحفظ", "label.cancel": "إلغاء",
"renderer.components.autoSaveIndicator.saved": "حفظ", "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": "تصغير إلى الصينية", "main.windows.mainWindow.minimizeToTray.dialog.title": "تصغير إلى الصينية",
"main.windows.mainWindow.minimizeToTray.dialog.message": "سيستمر تشغيل {appName} في علبة النظام. يمكن تعطيل هذا في الإعدادات." "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": "يمكنك الوصول إلى <link>{url}</link> من خلال نافذة متصفح.",
"renderer.components.errorView.troubleshooting.computerIsConnected": "جهازك متصل بالانترنت.",
"renderer.components.errorView.troubleshooting.urlIsCorrect.appNameIsCorrect": "إرتباط منصة {appName} <link>{url}</link> صحيح",
"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}) للتثبيت."
} }

View file

@ -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", "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}.", "common.tabs.TAB_FOCALBOARD": "Boards",
"renderer.modals.login.loginModal.username": "User Name", "common.tabs.TAB_MESSAGING": "Channels",
"renderer.modals.login.loginModal.title": "Authentication Required", "common.tabs.TAB_PLAYBOOKS": "Playbooks",
"renderer.modals.login.loginModal.password": "Password", "label.accept": "Accept",
"renderer.modals.login.loginModal.message.server": "The server {url} requires a username and password.", "label.add": "Add",
"renderer.modals.login.loginModal.message.proxy": "The proxy {host}:{port} requires a username and password.", "label.allow": "Allow",
"renderer.modals.certificate.certificateModal.title": "Select a certificate", "label.cancel": "Cancel",
"renderer.modals.certificate.certificateModal.subtitle": "Select a certificate to authenticate yourself to {url}", "label.change": "Change",
"renderer.modals.certificate.certificateModal.subject": "Subject", "label.close": "Close",
"renderer.modals.certificate.certificateModal.serial": "Serial", "label.deny": "Deny",
"renderer.modals.certificate.certificateModal.noCertsAvailable": "No certificates available", "label.denyPermanently": "Deny Permanently",
"renderer.modals.certificate.certificateModal.issuer": "Issuer", "label.login": "Login",
"renderer.modals.certificate.certificateModal.certInfoButton": "Certificate Information", "label.no": "No",
"renderer.dropdown.servers": "Servers", "label.ok": "OK",
"renderer.dropdown.addAServer": "Add a server", "label.remove": "Remove",
"renderer.components.serverDropdownButton.noServersConfigured": "No servers configured", "label.save": "Save",
"renderer.components.showCertificateModal.subjectName": "Subject Name", "label.yes": "Yes",
"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 <link>{url}</link> is correct",
"renderer.components.errorView.troubleshooting.computerIsConnected": "Your computer is connected to the internet.",
"renderer.components.errorView.troubleshooting.browserView.canReachFromBrowserWindow": "You can reach <link>{url}</link> 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.CriticalErrorHandler.uncaughtException.button.reopen": "Reopen",
"main.badge.unreadMentions": "You have unread mentions ({mentionCount})", "main.CriticalErrorHandler.uncaughtException.button.showDetails": "Show Details",
"main.badge.unreadChannels": "You have unread channels", "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.badge.sessionExpired": "Session Expired: Please sign in to continue receiving notifications.", "main.CriticalErrorHandler.unresponsive.dialog.message": "The window is no longer responsive.\nDo you want to wait until the window becomes responsive again?",
"main.badge.noUnreads": "You have no unread messages", "main.allowProtocolDialog.button.saveProtocolAsAllowed": "Yes (Save {protocol} as allowed)",
"main.autoUpdater.update.dialog.message": "A new version is ready to install", "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.detail": "A new version of the {appName} Desktop App is ready to install.",
"renderer.modals.permission.permissionModal.unknownOrigin": "unknown origin", "main.autoUpdater.update.dialog.message": "A new version is ready to install",
"renderer.modals.permission.permissionModal.title": "{permission} Required", "main.badge.noUnreads": "You have no unread messages",
"renderer.modals.permission.permissionModal.requestOriginatedFromOrigin": "This request originated from <link>{origin}</link>", "main.badge.sessionExpired": "Session Expired: Please sign in to continue receiving notifications.",
"renderer.components.welcomeScreen.slides.welcome.title": "Welcome", "main.badge.unreadChannels": "You have unread channels",
"renderer.components.welcomeScreen.slides.welcome.subtitle": "Mattermost is an open source platform for developer collaboration. Secure, flexible and integrated with the tools you love.", "main.badge.unreadMentions": "You have unread mentions ({mentionCount})",
"renderer.components.welcomeScreen.slides.playbooks.title": "Playbooks", "main.downloadsManager.resetDownloadsFolder": "Please reset the folder where files will download",
"renderer.components.welcomeScreen.slides.palybooks.subtitle": "Move faster and make fewer mistakes with checklists, automations and tool integrations that power your teams workflows.", "main.downloadsManager.specifyDownloadsFolder": "Specify the folder where files will download",
"renderer.components.welcomeScreen.slides.channels.title": "Channels", "main.menus.app.edit": "&Edit",
"renderer.components.welcomeScreen.slides.channels.subtitle": "All your teams communication in one place.<br></br>Secure collaboration, built for developers.", "main.menus.app.edit.copy": "Copy",
"renderer.components.welcomeScreen.slides.boards.title": "Boards", "main.menus.app.edit.cut": "Cut",
"renderer.components.welcomeScreen.slides.boards.subtitle": "Ship your product on time, every time, with a project and task management solution built for digital operations.", "main.menus.app.edit.paste": "Paste",
"renderer.components.welcomeScreen.button.getStarted": "Get started", "main.menus.app.edit.pasteAndMatchStyle": "Paste and Match Style",
"renderer.components.mainPage.titleBar": "{appName}", "main.menus.app.edit.redo": "Redo",
"renderer.components.saveButton.saving": "Saving", "main.menus.app.edit.selectAll": "Select All",
"renderer.components.saveButton.save": "Save", "main.menus.app.edit.undo": "Undo",
"renderer.components.input.required": "This field is required", "main.menus.app.file": "&File",
"renderer.components.configureServer.url.placeholder": "Server URL", "main.menus.app.file.about": "About {appName}",
"renderer.components.configureServer.url.info": "The URL of your Mattermost server", "main.menus.app.file.exit": "Exit",
"renderer.components.configureServer.title": "Connect to a server", "main.menus.app.file.hide": "Hide {appName}",
"renderer.components.configureServer.subtitle": "Set up your first server to connect to your<br></br>teams communication hub", "main.menus.app.file.hideOthers": "Hide Others",
"renderer.components.configureServer.name.placeholder": "Server display name", "main.menus.app.file.preferences": "Preferences",
"renderer.components.configureServer.name.info": "The name that will be displayed in your server list", "main.menus.app.file.quit": "Quit {appName}",
"renderer.components.configureServer.connect.saving": "Connecting…", "main.menus.app.file.settings": "Settings",
"renderer.components.configureServer.connect.default": "Connect", "main.menus.app.file.signInToAnotherServer": "Sign in to another server",
"renderer.components.configureServer.cardtitle": "Enter your server details", "main.menus.app.file.unhide": "Show All",
"renderer.time.hours": "hours", "main.menus.app.help": "Hel&p",
"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.RunDiagnostics": "Run diagnostics",
"main.menus.app.help.ShowLogs": "Show logs", "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.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<br></br>teams 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.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.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.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.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.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.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 <link>{url}</link> 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 <link>{url}</link> 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.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.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.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.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.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.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", "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.",
"main.downloadsManager.specifyDownloadsFolder": "Specify the folder where files will download", "renderer.components.removeServerModal.confirm": "Confirm you wish to remove the {serverName} server?",
"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.", "renderer.components.removeServerModal.title": "Remove Server",
"label.allow": "Allow", "renderer.components.saveButton.save": "Save",
"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.", "renderer.components.saveButton.saving": "Saving",
"label.deny": "Deny", "renderer.components.serverDropdownButton.noServersConfigured": "No servers configured",
"label.denyPermanently": "Deny Permanently", "renderer.components.settingsPage.afterRestart": "Setting takes effect after restarting the app.",
"main.permissionsManager.checkPermission.dialog.detail.notifications": "{appName} will send you notifications for messages and calls. You can configure your notification preferences in Settings.", "renderer.components.settingsPage.appLanguage": "Set app language (beta)",
"main.permissionsManager.checkPermission.dialog.message.geolocation": "{appName} ({url}) would like to access your location.", "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.",
"main.permissionsManager.checkPermission.dialog.message.media": "{appName} ({url}) would like to access the microphone and camera.", "renderer.components.settingsPage.appLanguage.useSystemDefault": "Use system default",
"main.permissionsManager.checkPermission.dialog.message.notifications": "{appName} ({url}) would like to send you notifications.", "renderer.components.settingsPage.appOptions": "App Options",
"main.permissionsManager.checkPermission.dialog.title": "Permission Requested" "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 teams communication in one place.<br></br>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 teams 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 <link>{origin}</link>",
"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"
} }

View file

@ -89,7 +89,9 @@
"main.menus.app.view.actualSize": "实际尺寸", "main.menus.app.view.actualSize": "实际尺寸",
"main.menus.app.view.clearCacheAndReload": "清除缓存并重新加载", "main.menus.app.view.clearCacheAndReload": "清除缓存并重新加载",
"main.menus.app.view.devToolsAppWrapper": "Application Wrapper 开发工具", "main.menus.app.view.devToolsAppWrapper": "Application Wrapper 开发工具",
"main.menus.app.view.devToolsCurrentCallWidget": "通话小组件开发人员工具",
"main.menus.app.view.devToolsCurrentServer": "当前服务器的开发者工具", "main.menus.app.view.devToolsCurrentServer": "当前服务器的开发者工具",
"main.menus.app.view.devToolsSubMenu": "开发人员工具",
"main.menus.app.view.downloads": "下载", "main.menus.app.view.downloads": "下载",
"main.menus.app.view.find": "查找...", "main.menus.app.view.find": "查找...",
"main.menus.app.view.fullscreen": "全屏", "main.menus.app.view.fullscreen": "全屏",

View file

@ -81,25 +81,30 @@ const desktopAPI: DesktopAPI = {
onBrowserHistoryPush: (listener) => createListener(BROWSER_HISTORY_PUSH, listener), onBrowserHistoryPush: (listener) => createListener(BROWSER_HISTORY_PUSH, listener),
sendBrowserHistoryPush: (path) => ipcRenderer.send(BROWSER_HISTORY_PUSH, path), sendBrowserHistoryPush: (path) => ipcRenderer.send(BROWSER_HISTORY_PUSH, path),
// Calls widget // Calls
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),
joinCall: (opts) => ipcRenderer.invoke(CALLS_JOIN_CALL, opts), 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), 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 // Utility
unregister: (channel) => ipcRenderer.removeAllListeners(channel), unregister: (channel) => ipcRenderer.removeAllListeners(channel),
}; };

View file

@ -7,7 +7,7 @@ import {BrowserWindow, desktopCapturer, systemPreferences, ipcMain} from 'electr
import ServerViewState from 'app/serverViewState'; 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 { import {
MINIMUM_CALLS_WIDGET_WIDTH, MINIMUM_CALLS_WIDGET_WIDTH,
MINIMUM_CALLS_WIDGET_HEIGHT, MINIMUM_CALLS_WIDGET_HEIGHT,
@ -534,6 +534,7 @@ describe('main/windows/callsWidgetWindow', () => {
describe('handleGetDesktopSources', () => { describe('handleGetDesktopSources', () => {
const callsWidgetWindow = new CallsWidgetWindow(); const callsWidgetWindow = new CallsWidgetWindow();
callsWidgetWindow.options = {callID: 'callID'};
callsWidgetWindow.win = { callsWidgetWindow.win = {
webContents: { webContents: {
send: jest.fn(), send: jest.fn(),
@ -626,12 +627,8 @@ describe('main/windows/callsWidgetWindow', () => {
it('should send error with no sources', async () => { it('should send error with no sources', async () => {
jest.spyOn(desktopCapturer, 'getSources').mockResolvedValue([]); jest.spyOn(desktopCapturer, 'getSources').mockResolvedValue([]);
await callsWidgetWindow.handleGetDesktopSources({sender: {id: 1}}, null); await callsWidgetWindow.handleGetDesktopSources({sender: {id: 1}}, null);
expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', { expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID');
err: 'screen-permissions', expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID');
});
expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', {
err: 'screen-permissions',
});
expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledTimes(1); expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledTimes(1);
}); });
@ -649,12 +646,8 @@ describe('main/windows/callsWidgetWindow', () => {
await callsWidgetWindow.handleGetDesktopSources({sender: {id: 1}}, null); await callsWidgetWindow.handleGetDesktopSources({sender: {id: 1}}, null);
expect(systemPreferences.getMediaAccessStatus).toHaveBeenCalledWith('screen'); expect(systemPreferences.getMediaAccessStatus).toHaveBeenCalledWith('screen');
expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', { expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID');
err: 'screen-permissions', expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID');
});
expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', {
err: 'screen-permissions',
});
expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledTimes(1); expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledTimes(1);
expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledTimes(1); expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledTimes(1);
}); });
@ -680,12 +673,8 @@ describe('main/windows/callsWidgetWindow', () => {
expect(callsWidgetWindow.missingScreensharePermissions).toBe(true); expect(callsWidgetWindow.missingScreensharePermissions).toBe(true);
expect(resetScreensharePermissionsMacOS).toHaveBeenCalledTimes(1); expect(resetScreensharePermissionsMacOS).toHaveBeenCalledTimes(1);
expect(openScreensharePermissionsSettingsMacOS).toHaveBeenCalledTimes(0); expect(openScreensharePermissionsSettingsMacOS).toHaveBeenCalledTimes(0);
expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', { expect(callsWidgetWindow.win.webContents.send).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID');
err: 'screen-permissions', expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', 'screen-permissions', 'callID');
});
expect(views.get('server-1_view-1').sendToRenderer).toHaveBeenCalledWith('calls-error', {
err: 'screen-permissions',
});
await callsWidgetWindow.handleGetDesktopSources({sender: {id: 1}}, null); 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', () => { describe('isOpen', () => {
const callsWidgetWindow = new CallsWidgetWindow(); const callsWidgetWindow = new CallsWidgetWindow();

View file

@ -69,7 +69,7 @@ export class CallsWidgetWindow {
// forwards to the main app // forwards to the main app
ipcMain.on(DESKTOP_SOURCES_MODAL_REQUEST, this.forwardToMainApp(DESKTOP_SOURCES_MODAL_REQUEST)); ipcMain.on(DESKTOP_SOURCES_MODAL_REQUEST, this.forwardToMainApp(DESKTOP_SOURCES_MODAL_REQUEST));
ipcMain.on(CALLS_ERROR, this.forwardToMainApp(CALLS_ERROR)); 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)); ipcMain.on(CALLS_JOIN_REQUEST, this.forwardToMainApp(CALLS_JOIN_REQUEST));
// deprecated in favour of CALLS_LINK_CLICK // 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) => { return desktopCapturer.getSources(opts).then((sources) => {
let hasScreenPermissions = true; let hasScreenPermissions = true;
@ -409,8 +409,8 @@ export class CallsWidgetWindow {
if (!hasScreenPermissions || !sources.length) { if (!hasScreenPermissions || !sources.length) {
log.info('missing screen permissions'); log.info('missing screen permissions');
view.sendToRenderer(CALLS_ERROR, screenPermissionsErrMsg); view.sendToRenderer(CALLS_ERROR, ...screenPermissionsErrArgs);
this.win?.webContents.send(CALLS_ERROR, screenPermissionsErrMsg); this.win?.webContents.send(CALLS_ERROR, ...screenPermissionsErrArgs);
return []; return [];
} }
@ -426,8 +426,8 @@ export class CallsWidgetWindow {
}).catch((err) => { }).catch((err) => {
log.error('desktopCapturer.getSources failed', err); log.error('desktopCapturer.getSources failed', err);
view.sendToRenderer(CALLS_ERROR, screenPermissionsErrMsg); view.sendToRenderer(CALLS_ERROR, ...screenPermissionsErrArgs);
this.win?.webContents.send(CALLS_ERROR, screenPermissionsErrMsg); this.win?.webContents.send(CALLS_ERROR, ...screenPermissionsErrArgs);
return []; 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 * @deprecated
*/ */

View file

@ -20,5 +20,6 @@ export interface ExternalAPI {
createListener(event: 'calls-widget-share-screen', listener: (sourceID: string, withAudio: boolean) => void): () => void; 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-join-request', listener: (callID: string) => void): () => void;
createListener(event: 'calls-error', listener: (err: string, callID?: string, errMsg?: 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; createListener(event: 'desktop-sources-modal-request', listener: () => void): () => void;
} }