mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-13 03:27:39 +03:00
Merge branch 'master' into rtl-support
This commit is contained in:
commit
9cabfe7570
12 changed files with 92 additions and 48 deletions
1
.github/ISSUE_TEMPLATE/bug_report.md
vendored
1
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
|
@ -28,6 +28,7 @@ If applicable, add screenshots to help explain your problem.
|
||||||
- IMAP daemon: [e.g. courier, dovecot]
|
- IMAP daemon: [e.g. courier, dovecot]
|
||||||
- PHP version:
|
- PHP version:
|
||||||
- SnappyMail Version:
|
- SnappyMail Version:
|
||||||
|
- Mode: [e.g. standalone, nextcloud, cyberpanel, docker]
|
||||||
|
|
||||||
**[Debug/logging information](https://github.com/the-djmaze/snappymail/wiki/FAQ#how-do-i-enable-logging)**
|
**[Debug/logging information](https://github.com/the-djmaze/snappymail/wiki/FAQ#how-do-i-enable-logging)**
|
||||||
Place them here (few lines) or as attachments (many lines)
|
Place them here (few lines) or as attachments (many lines)
|
||||||
|
|
|
||||||
|
|
@ -265,8 +265,6 @@ export const
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpl.innerHTML = html
|
tmpl.innerHTML = html
|
||||||
// Strip Microsoft comments
|
|
||||||
.replace(/<!--\[if[\s\S]*?-->/gi, '')
|
|
||||||
// .replace(/<pre[^>]*>[\s\S]*?<\/pre>/gi, pre => pre.replace(/\n/g, '\n<br>'))
|
// .replace(/<pre[^>]*>[\s\S]*?<\/pre>/gi, pre => pre.replace(/\n/g, '\n<br>'))
|
||||||
// Not supported by <template> element
|
// Not supported by <template> element
|
||||||
// .replace(/<!doctype[^>]*>/gi, '')
|
// .replace(/<!doctype[^>]*>/gi, '')
|
||||||
|
|
@ -280,8 +278,7 @@ export const
|
||||||
.trim();
|
.trim();
|
||||||
html = '';
|
html = '';
|
||||||
|
|
||||||
// \MailSo\Base\HtmlUtils::ClearComments()
|
// Strip all comments
|
||||||
// https://github.com/the-djmaze/snappymail/issues/187
|
|
||||||
const nodeIterator = document.createNodeIterator(tmpl.content, NodeFilter.SHOW_COMMENT);
|
const nodeIterator = document.createNodeIterator(tmpl.content, NodeFilter.SHOW_COMMENT);
|
||||||
while (nodeIterator.nextNode()) {
|
while (nodeIterator.nextNode()) {
|
||||||
nodeIterator.referenceNode.remove();
|
nodeIterator.referenceNode.remove();
|
||||||
|
|
@ -531,11 +528,12 @@ export const
|
||||||
if (urls_broken.length) {
|
if (urls_broken.length) {
|
||||||
setAttribute('data-x-style-broken-urls', JSON.stringify(urls_broken));
|
setAttribute('data-x-style-broken-urls', JSON.stringify(urls_broken));
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
// https://github.com/the-djmaze/snappymail/issues/1082
|
||||||
if (11 > pInt(oStyle.fontSize)) {
|
if (11 > pInt(oStyle.fontSize)) {
|
||||||
oStyle.removeProperty('font-size');
|
oStyle.removeProperty('font-size');
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
// Removes background and color
|
// Removes background and color
|
||||||
// Many e-mails incorrectly only define one, not both
|
// Many e-mails incorrectly only define one, not both
|
||||||
// And in dark theme mode this kills the readability
|
// And in dark theme mode this kills the readability
|
||||||
|
|
|
||||||
|
|
@ -1355,10 +1355,15 @@ export class ComposePopupView extends AbstractViewPopup {
|
||||||
|
|
||||||
async getMessageRequestParams(sSaveFolder, draft)
|
async getMessageRequestParams(sSaveFolder, draft)
|
||||||
{
|
{
|
||||||
|
let Text = this.oEditor.getData().trim(),
|
||||||
|
l = Text.length,
|
||||||
|
hasAttachments = 0;
|
||||||
|
|
||||||
// Prepare ComposeAttachmentModel attachments
|
// Prepare ComposeAttachmentModel attachments
|
||||||
const attachments = {};
|
const attachments = {};
|
||||||
this.attachments.forEach(item => {
|
this.attachments.forEach(item => {
|
||||||
if (item?.complete() && item?.tempName() && item?.enabled()) {
|
if (item?.complete() && item?.tempName() && item?.enabled()) {
|
||||||
|
++hasAttachments;
|
||||||
attachments[item.tempName()] = {
|
attachments[item.tempName()] = {
|
||||||
name: item.fileName(),
|
name: item.fileName(),
|
||||||
inline: item.isInline,
|
inline: item.isInline,
|
||||||
|
|
@ -1369,6 +1374,10 @@ export class ComposePopupView extends AbstractViewPopup {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!draft && !l && !hasAttachments) {
|
||||||
|
throw i18n('COMPOSE/ERROR_EMPTY_BODY');
|
||||||
|
}
|
||||||
|
|
||||||
const
|
const
|
||||||
identity = this.currentIdentity(),
|
identity = this.currentIdentity(),
|
||||||
params = {
|
params = {
|
||||||
|
|
@ -1397,12 +1406,7 @@ export class ComposePopupView extends AbstractViewPopup {
|
||||||
encrypt = this.pgpEncrypt() && this.canPgpEncrypt(),
|
encrypt = this.pgpEncrypt() && this.canPgpEncrypt(),
|
||||||
isHtml = this.oEditor.isHtml();
|
isHtml = this.oEditor.isHtml();
|
||||||
|
|
||||||
let Text = this.oEditor.getData().trim();
|
|
||||||
if (!draft && !Text.length) {
|
|
||||||
throw i18n('COMPOSE/ERROR_EMPTY_BODY');
|
|
||||||
}
|
|
||||||
if (isHtml) {
|
if (isHtml) {
|
||||||
let l;
|
|
||||||
do {
|
do {
|
||||||
l = Text.length;
|
l = Text.length;
|
||||||
Text = Text
|
Text = Text
|
||||||
|
|
|
||||||
|
|
@ -35,13 +35,18 @@ class SnappyMailHelper
|
||||||
{
|
{
|
||||||
static::loadApp();
|
static::loadApp();
|
||||||
|
|
||||||
|
$oConfig = \RainLoop\Api::Config();
|
||||||
|
|
||||||
|
if (false !== \stripos(\php_sapi_name(), 'cli')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$oActions = \RainLoop\Api::Actions();
|
$oActions = \RainLoop\Api::Actions();
|
||||||
$oConfig = \RainLoop\Api::Config();
|
|
||||||
if (isset($_GET[$oConfig->Get('security', 'admin_panel_key', 'admin')])) {
|
if (isset($_GET[$oConfig->Get('security', 'admin_panel_key', 'admin')])) {
|
||||||
if ($oConfig->Get('security', 'allow_admin_panel', true)
|
if ($oConfig->Get('security', 'allow_admin_panel', true)
|
||||||
&& \OC_User::isAdminUser(\OC::$server->getUserSession()->getUser()->getUID())
|
&& \OC_User::isAdminUser(\OC::$server->getUserSession()->getUser()->getUID())
|
||||||
&& !$oActions->IsAdminLoggined(false)
|
&& !$oActions->IsAdminLoggined(false)
|
||||||
) {
|
) {
|
||||||
$sRand = \MailSo\Base\Utils::Sha1Rand();
|
$sRand = \MailSo\Base\Utils::Sha1Rand();
|
||||||
if ($oActions->Cacher(null, true)->Set(\RainLoop\KeyPathHelper::SessionAdminKey($sRand), \time())) {
|
if ($oActions->Cacher(null, true)->Set(\RainLoop\KeyPathHelper::SessionAdminKey($sRand), \time())) {
|
||||||
|
|
@ -88,16 +93,16 @@ class SnappyMailHelper
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($handle) {
|
||||||
|
\header_remove('Content-Security-Policy');
|
||||||
|
\RainLoop\Service::Handle();
|
||||||
|
// https://github.com/the-djmaze/snappymail/issues/1069
|
||||||
|
exit;
|
||||||
|
}
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
// Ignore login failure
|
// Ignore login failure
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($handle) {
|
|
||||||
\header_remove('Content-Security-Policy');
|
|
||||||
\RainLoop\Service::Handle();
|
|
||||||
// https://github.com/the-djmaze/snappymail/issues/1069
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getLoginCredentials() : array
|
public static function getLoginCredentials() : array
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
{
|
{
|
||||||
const
|
const
|
||||||
NAME = 'Nextcloud',
|
NAME = 'Nextcloud',
|
||||||
VERSION = '2.22',
|
VERSION = '2.23',
|
||||||
RELEASE = '2023-03-28',
|
RELEASE = '2023-04-11',
|
||||||
CATEGORY = 'Integrations',
|
CATEGORY = 'Integrations',
|
||||||
DESCRIPTION = 'Integrate with Nextcloud v20+',
|
DESCRIPTION = 'Integrate with Nextcloud v20+',
|
||||||
REQUIRED = '2.27.0';
|
REQUIRED = '2.27.0';
|
||||||
|
|
@ -34,6 +34,9 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
$this->addTemplate('templates/PopupsNextcloudFiles.html');
|
$this->addTemplate('templates/PopupsNextcloudFiles.html');
|
||||||
$this->addTemplate('templates/PopupsNextcloudCalendars.html');
|
$this->addTemplate('templates/PopupsNextcloudCalendars.html');
|
||||||
|
|
||||||
|
$this->addHook('imap.before-login', 'oidcLogin');
|
||||||
|
$this->addHook('smtp.before-login', 'oidcLogin');
|
||||||
|
$this->addHook('sieve.before-login', 'oidcLogin');
|
||||||
} else {
|
} else {
|
||||||
// \OC::$server->getConfig()->getAppValue('snappymail', 'snappymail-no-embed');
|
// \OC::$server->getConfig()->getAppValue('snappymail', 'snappymail-no-embed');
|
||||||
$this->addHook('main.content-security-policy', 'ContentSecurityPolicy');
|
$this->addHook('main.content-security-policy', 'ContentSecurityPolicy');
|
||||||
|
|
@ -62,6 +65,20 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
return static::IsIntegrated() && \OC::$server->getUserSession()->isLoggedIn();
|
return static::IsIntegrated() && \OC::$server->getUserSession()->isLoggedIn();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function oidcLogin(\RainLoop\Model\Account $oAccount, \MailSo\Net\NetClient $oClient, \MailSo\Net\ConnectSettings $oSettings) : void
|
||||||
|
{
|
||||||
|
if ($this->Config()->Get('plugin', 'oidc', false)
|
||||||
|
&& \OC::$server->getSession()->get('is_oidc')
|
||||||
|
// && $oClient->supportsAuthType('OAUTHBEARER') // v2.28
|
||||||
|
) {
|
||||||
|
$sAccessToken = \OC::$server->getSession()->get('oidc_access_token');
|
||||||
|
if ($sAccessToken) {
|
||||||
|
$oSettings->Password = $sAccessToken;
|
||||||
|
\array_unshift($oSettings->SASLMechanisms, 'OAUTHBEARER');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
\OC::$server->getCalendarManager();
|
\OC::$server->getCalendarManager();
|
||||||
\OC::$server->getLDAPProvider();
|
\OC::$server->getLDAPProvider();
|
||||||
|
|
@ -254,6 +271,9 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL)
|
->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL)
|
||||||
->SetDefaultValue(true),
|
->SetDefaultValue(true),
|
||||||
\RainLoop\Plugins\Property::NewInstance('calendar')->SetLabel('Enable "Put ICS in calendar"')
|
\RainLoop\Plugins\Property::NewInstance('calendar')->SetLabel('Enable "Put ICS in calendar"')
|
||||||
|
->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL)
|
||||||
|
->SetDefaultValue(false),
|
||||||
|
\RainLoop\Plugins\Property::NewInstance('oidc')->SetLabel('Login with OIDC')
|
||||||
->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL)
|
->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL)
|
||||||
->SetDefaultValue(false)
|
->SetDefaultValue(false)
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ class TwoFactorAuthPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
{
|
{
|
||||||
const
|
const
|
||||||
NAME = 'Two Factor Authentication',
|
NAME = 'Two Factor Authentication',
|
||||||
VERSION = '2.16.1',
|
VERSION = '2.16.2',
|
||||||
RELEASE = '2022-09-20',
|
RELEASE = '2023-04-11',
|
||||||
REQUIRED = '2.15.2',
|
REQUIRED = '2.15.2',
|
||||||
CATEGORY = 'Login',
|
CATEGORY = 'Login',
|
||||||
DESCRIPTION = 'Provides support for TOTP 2FA';
|
DESCRIPTION = 'Provides support for TOTP 2FA';
|
||||||
|
|
@ -167,10 +167,10 @@ class TwoFactorAuthPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||||
return $this->jsonResponse(__FUNCTION__, false);
|
return $this->jsonResponse(__FUNCTION__, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
$oSettings = $this->Manager()->Actions()->SettingsProvider()->Load($oAccount);
|
$oActions = $this->Manager()->Actions();
|
||||||
if ($this->Manager()->Actions()->HasActionParam('EnableTwoFactor')) {
|
if ($oActions->HasActionParam('EnableTwoFactor')) {
|
||||||
$sValue = $this->GetActionParam('EnableTwoFactor', '');
|
$sValue = $oActions->GetActionParam('EnableTwoFactor', '');
|
||||||
$oSettings->SetConf('EnableTwoFactor', !empty($sValue));
|
$oActions->SettingsProvider()->Load($oAccount)->SetConf('EnableTwoFactor', !empty($sValue));
|
||||||
}
|
}
|
||||||
|
|
||||||
$sEmail = $oAccount->Email();
|
$sEmail = $oAccount->Email();
|
||||||
|
|
|
||||||
|
|
@ -94,6 +94,11 @@ class ImapClient extends \MailSo\Net\NetClient
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function supportsAuthType(string $sasl_type) : bool
|
||||||
|
{
|
||||||
|
return $this->hasCapability("AUTH={$sasl_type}");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws \InvalidArgumentException
|
* @throws \InvalidArgumentException
|
||||||
* @throws \MailSo\RuntimeException
|
* @throws \MailSo\RuntimeException
|
||||||
|
|
|
||||||
|
|
@ -195,6 +195,7 @@ abstract class NetClient
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract public function supportsAuthType(string $sasl_type) : bool;
|
||||||
// abstract public function Login(ConnectSettings $oSettings) : self;
|
// abstract public function Login(ConnectSettings $oSettings) : self;
|
||||||
abstract public function Logout() : void;
|
abstract public function Logout() : void;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,11 @@ class SieveClient extends \MailSo\Net\NetClient
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function supportsAuthType(string $sasl_type) : bool
|
||||||
|
{
|
||||||
|
return \in_array(\strtoupper($sasl_type), $this->aAuth);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws \InvalidArgumentException
|
* @throws \InvalidArgumentException
|
||||||
* @throws \MailSo\RuntimeException
|
* @throws \MailSo\RuntimeException
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,11 @@ class SmtpClient extends \MailSo\Net\NetClient
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function supportsAuthType(string $sasl_type) : bool
|
||||||
|
{
|
||||||
|
return \in_array(\strtoupper($sasl_type), $this->aAuthTypes);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws \InvalidArgumentException
|
* @throws \InvalidArgumentException
|
||||||
* @throws \MailSo\RuntimeException
|
* @throws \MailSo\RuntimeException
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ abstract class Service
|
||||||
public static function Handle() : bool
|
public static function Handle() : bool
|
||||||
{
|
{
|
||||||
static $bOne = null;
|
static $bOne = null;
|
||||||
if (null === $bOne && false === \stripos(\php_sapi_name(), 'cli')) {
|
if (null === $bOne) {
|
||||||
$bOne = static::RunResult();
|
$bOne = static::RunResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,11 +20,11 @@
|
||||||
"MOVE_TO": "Verschieben nach",
|
"MOVE_TO": "Verschieben nach",
|
||||||
"NAME": "Name",
|
"NAME": "Name",
|
||||||
"NONE": "Keine",
|
"NONE": "Keine",
|
||||||
"TO_SPAM": "Move message(s) to Spam",
|
"TO_SPAM": "Nachricht(en) zu Spam verschieben",
|
||||||
"NOT_SPAM": "Kein Spam",
|
"NOT_SPAM": "Kein Spam",
|
||||||
"USERNAME": "Nutzername",
|
"USERNAME": "Nutzername",
|
||||||
"PASSWORD": "Passwort",
|
"PASSWORD": "Passwort",
|
||||||
"REMEMBER": "Remember",
|
"REMEMBER": "Zugangsdaten merken",
|
||||||
"REPLY_TO": "Antwort an",
|
"REPLY_TO": "Antwort an",
|
||||||
"SAVE": "Speichern",
|
"SAVE": "Speichern",
|
||||||
"SAVE_CHANGES": "Änderungen speichern?",
|
"SAVE_CHANGES": "Änderungen speichern?",
|
||||||
|
|
@ -108,7 +108,7 @@
|
||||||
"NEW_MESSAGE_NOTIFICATION": "Sie haben %COUNT% neue Nachrichten!",
|
"NEW_MESSAGE_NOTIFICATION": "Sie haben %COUNT% neue Nachrichten!",
|
||||||
"QUOTA_SIZE": "Sie nutzen <strong>%SIZE% (%PROC%%)<\/strong> von <strong>%LIMIT%<\/strong>.",
|
"QUOTA_SIZE": "Sie nutzen <strong>%SIZE% (%PROC%%)<\/strong> von <strong>%LIMIT%<\/strong>.",
|
||||||
"SORT": "Sortieren",
|
"SORT": "Sortieren",
|
||||||
"NO_SORT": "Mail server does not support sorting",
|
"NO_SORT": "Ihr Mailserver unterstützt das Sortieren von E-Mails nicht",
|
||||||
"SORT_DATE_ASC": "Datum aufsteigend",
|
"SORT_DATE_ASC": "Datum aufsteigend",
|
||||||
"SORT_DATE_DESC": "Datum absteigend",
|
"SORT_DATE_DESC": "Datum absteigend",
|
||||||
"SORT_SIZE_ASC": "Größe aufsteigend",
|
"SORT_SIZE_ASC": "Größe aufsteigend",
|
||||||
|
|
@ -230,11 +230,11 @@
|
||||||
"BUTTON_REQUEST_READ_RECEIPT": "Empfangsbestätigung anfordern",
|
"BUTTON_REQUEST_READ_RECEIPT": "Empfangsbestätigung anfordern",
|
||||||
"BUTTON_MARK_AS_IMPORTANT": "Als Wichtig markieren",
|
"BUTTON_MARK_AS_IMPORTANT": "Als Wichtig markieren",
|
||||||
"BUTTON_REQUEST_DSN": "Übermittlungsstatus anfordern",
|
"BUTTON_REQUEST_DSN": "Übermittlungsstatus anfordern",
|
||||||
"BUTTON_REQUIRE_TLS": "Require secure delivery",
|
"BUTTON_REQUIRE_TLS": "Erzwinge sichere Übermittlung (TLS)",
|
||||||
"ERROR_EMPTY_BODY": "Message body is empty"
|
"ERROR_EMPTY_BODY": "Inhalt der Nachricht ist leer"
|
||||||
},
|
},
|
||||||
"POPUPS_ASK": {
|
"POPUPS_ASK": {
|
||||||
"EXIT_ARE_YOU_SURE": "Are you sure you want to exit?",
|
"EXIT_ARE_YOU_SURE": "Sind Sie sicher, dass Sie SnappyMail beenden möchten?",
|
||||||
"DESC_WANT_CLOSE_THIS_WINDOW": "Sind Sie sicher, dass Sie dieses Fenster schließen möchten?",
|
"DESC_WANT_CLOSE_THIS_WINDOW": "Sind Sie sicher, dass Sie dieses Fenster schließen möchten?",
|
||||||
"DESC_WANT_DELETE_MESSAGES": "Sind Sie sicher, dass Sie diese Nachricht(en) löschen möchten?"
|
"DESC_WANT_DELETE_MESSAGES": "Sind Sie sicher, dass Sie diese Nachricht(en) löschen möchten?"
|
||||||
},
|
},
|
||||||
|
|
@ -318,7 +318,7 @@
|
||||||
"MARK_AS_READ_LABEL": "Als Gelesen markieren",
|
"MARK_AS_READ_LABEL": "Als Gelesen markieren",
|
||||||
"REPLY_INTERVAL_LABEL": "Antwortintervall (Tage)",
|
"REPLY_INTERVAL_LABEL": "Antwortintervall (Tage)",
|
||||||
"KEEP_LABEL": "Behalten",
|
"KEEP_LABEL": "Behalten",
|
||||||
"STOP_LABEL": "Stop further processing of rules",
|
"STOP_LABEL": "Stoppe das Abarbeiten nachfolgender Regeln",
|
||||||
"VACATION_SUBJECT_LABEL": "Betreff (optional)",
|
"VACATION_SUBJECT_LABEL": "Betreff (optional)",
|
||||||
"VACATION_MESSAGE_LABEL": "Nachricht",
|
"VACATION_MESSAGE_LABEL": "Nachricht",
|
||||||
"VACATION_RECIPIENTS_LABEL": "Empfänger (durch Komma getrennt)",
|
"VACATION_RECIPIENTS_LABEL": "Empfänger (durch Komma getrennt)",
|
||||||
|
|
@ -393,7 +393,7 @@
|
||||||
"LAYOUT_NO_SPLIT": "Keine Aufteilung",
|
"LAYOUT_NO_SPLIT": "Keine Aufteilung",
|
||||||
"LAYOUT_VERTICAL_SPLIT": "Vertikale Aufteilung",
|
"LAYOUT_VERTICAL_SPLIT": "Vertikale Aufteilung",
|
||||||
"LAYOUT_HORIZONTAL_SPLIT": "Horizontale Aufteilung",
|
"LAYOUT_HORIZONTAL_SPLIT": "Horizontale Aufteilung",
|
||||||
"SHOW_NEXT_MESSAGE": "Show next message when (re)move current message",
|
"SHOW_NEXT_MESSAGE": "Zeige nächste Nachricht wenn aktuelle gelöscht oder verschoben wird",
|
||||||
"EDITOR": "Standard-Texteditor",
|
"EDITOR": "Standard-Texteditor",
|
||||||
"EDITOR_HTML": "HTML",
|
"EDITOR_HTML": "HTML",
|
||||||
"EDITOR_PLAIN": "Unformatierter Text",
|
"EDITOR_PLAIN": "Unformatierter Text",
|
||||||
|
|
@ -406,27 +406,27 @@
|
||||||
"PREFER_HTML": "HTML gegenüber Klartext bevorzugen",
|
"PREFER_HTML": "HTML gegenüber Klartext bevorzugen",
|
||||||
"PREFER_HTML_INFO": "Nachrichten können manchmal in beiden Formaten empfangen werden. Diese Option setzt, ob die Nachricht standardmäßig in HTML oder als Klartext angezeigt wird.",
|
"PREFER_HTML_INFO": "Nachrichten können manchmal in beiden Formaten empfangen werden. Diese Option setzt, ob die Nachricht standardmäßig in HTML oder als Klartext angezeigt wird.",
|
||||||
"REMOVE_COLORS": "Entferne Hintergrund- und Textfarben aus der Nachricht",
|
"REMOVE_COLORS": "Entferne Hintergrund- und Textfarben aus der Nachricht",
|
||||||
"ALLOW_STYLES": "Allow <style> CSS",
|
"ALLOW_STYLES": "Erlaube erweiterte Darstellungen in Nachrichten (CSS <style>)",
|
||||||
"MESSAGE_PER_PAGE": "Nachrichten pro Seite",
|
"MESSAGE_PER_PAGE": "Nachrichten pro Seite",
|
||||||
"CHECK_MAIL_INTERVAL": "Check mail interval",
|
"CHECK_MAIL_INTERVAL": "Prüfintervall für neue Nachrichten",
|
||||||
"MARK_MESSAGE_READ_AFTER": "Nachricht als gelesen markieren nach",
|
"MARK_MESSAGE_READ_AFTER": "Nachricht als gelesen markieren nach",
|
||||||
"MSG_DEFAULT_ACTION": "Standardaktion",
|
"MSG_DEFAULT_ACTION": "Standardaktion",
|
||||||
"SECONDS": "Sekunden",
|
"SECONDS": "Sekunden",
|
||||||
"MINUTES": "minutes",
|
"MINUTES": "Minuten",
|
||||||
"NOTIFICATIONS": "Benachrichtigungen",
|
"NOTIFICATIONS": "Benachrichtigungen",
|
||||||
"SOUND_NOTIFICATION": "Benachrichtigungston",
|
"SOUND_NOTIFICATION": "Benachrichtigungston",
|
||||||
"CHROME_NOTIFICATION_DESC": "Popups einblenden, wenn neue Nachrichten vorhanden sind",
|
"CHROME_NOTIFICATION_DESC": "Popups einblenden, wenn neue Nachrichten vorhanden sind",
|
||||||
"CHROME_NOTIFICATION_DESC_DENIED": "(Vom Browser blockiert.)",
|
"CHROME_NOTIFICATION_DESC_DENIED": "(Vom Browser blockiert.)",
|
||||||
"COLLAPSE_BLOCKQUOTES": "Collapse quoted text",
|
"COLLAPSE_BLOCKQUOTES": "zitierten Text ausblenden",
|
||||||
"MAX_QUOTE_LEVEL": "Maximum visible quoted text levels",
|
"MAX_QUOTE_LEVEL": "Maximal sichtbare Ebenen von zitiertem Text",
|
||||||
"LIST_INLINE_ATTACHMENTS": "Inline-Anhänge in der Liste anzeigen",
|
"LIST_INLINE_ATTACHMENTS": "Inline-Anhänge in der Liste anzeigen",
|
||||||
"LIST_SIMPLE_ATTACHMENTS": "Vereinfachte Liste der Anhänge",
|
"LIST_SIMPLE_ATTACHMENTS": "Vereinfachte Liste der Anhänge",
|
||||||
"LIST_MESSAGES_GROUPED": "Nachrichten bei Sortierung nach Datum oder Absender gruppieren",
|
"LIST_MESSAGES_GROUPED": "Nachrichten bei Sortierung nach Datum oder Absender gruppieren",
|
||||||
"EXTERNAL_IMAGES": "External images",
|
"EXTERNAL_IMAGES": "Externe Bilder",
|
||||||
"IMAGES_OPTION_ASK": "Always ask",
|
"IMAGES_OPTION_ASK": "Jedesmal Fragen",
|
||||||
"IMAGES_OPTION_WHITELIST": "Whitelist or ask",
|
"IMAGES_OPTION_WHITELIST": "Nutze Ausnahmeliste oder frage den Benutzer",
|
||||||
"IMAGES_OPTION_ALWAYS": "Show always",
|
"IMAGES_OPTION_ALWAYS": "Immer anzeigen",
|
||||||
"IMAGES_WHITELIST": "Images whitelist"
|
"IMAGES_WHITELIST": "Ausnahmeliste für Bilder"
|
||||||
},
|
},
|
||||||
"SETTINGS_CONTACTS": {
|
"SETTINGS_CONTACTS": {
|
||||||
"LABEL_CONTACTS_AUTOSAVE": "Empfänger automatisch zu Ihrem Adressbuch hinzuzufügen",
|
"LABEL_CONTACTS_AUTOSAVE": "Empfänger automatisch zu Ihrem Adressbuch hinzuzufügen",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue