diff --git a/dev/App/User.js b/dev/App/User.js index 46a813dee..ccb02367c 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -1042,6 +1042,7 @@ oData.Result.IsThreadsSupported && true); FolderStore.folderList(this.folderResponseParseRec(FolderStore.namespace, oData.Result['@Collection'])); + FolderStore.folderList.optimized(!!oData.Result.Optimized); if (oData.Result['SystemFolders'] && '' === '' + Settings.settingsGet('SentFolder') + diff --git a/dev/Common/Selector.js b/dev/Common/Selector.js index eacc5c324..3c86b0d7b 100644 --- a/dev/Common/Selector.js +++ b/dev/Common/Selector.js @@ -687,7 +687,7 @@ if (oEvent) { - if (oEvent.shiftKey && !oEvent.ctrlKey && !oEvent.altKey) + if (oEvent.shiftKey && !(oEvent.ctrlKey || oEvent.metaKey) && !oEvent.altKey) { bClick = false; if ('' === this.sLastUid) @@ -700,7 +700,7 @@ this.focusedItem(oItem); } - else if (oEvent.ctrlKey && !oEvent.shiftKey && !oEvent.altKey) + else if ((oEvent.ctrlKey || oEvent.metaKey) && !oEvent.shiftKey && !oEvent.altKey) { bClick = false; this.focusedItem(oItem); diff --git a/dev/Model/ComposeAttachment.js b/dev/Model/ComposeAttachment.js index f59e11631..d9a470135 100644 --- a/dev/Model/ComposeAttachment.js +++ b/dev/Model/ComposeAttachment.js @@ -48,12 +48,12 @@ this.progressText = ko.computed(function () { var iP = this.progress(); - return 0 === iP ? '' : '' + (99 === iP ? 100 : iP) + '%'; + return 0 === iP ? '' : '' + (98 < iP ? 100 : iP) + '%'; }, this); this.progressStyle = ko.computed(function () { var iP = this.progress(); - return 0 === iP ? '' : 'width:' + (99 === iP ? 100 : iP) + '%'; + return 0 === iP ? '' : 'width:' + (98 < iP ? 100 : iP) + '%'; }, this); this.title = ko.computed(function () { diff --git a/dev/View/User/Login.js b/dev/View/User/Login.js index 225c52bf5..3c0d7eedd 100644 --- a/dev/View/User/Login.js +++ b/dev/View/User/Login.js @@ -22,7 +22,7 @@ Local = require('Storage/Client'), Settings = require('Storage/Settings'), - + Remote = require('Remote/User/Ajax'), kn = require('Knoin/Knoin'), @@ -58,6 +58,7 @@ this.passwordError = ko.observable(false); this.emailFocus = ko.observable(false); + this.passwordFocus = ko.observable(false); this.submitFocus = ko.observable(false); this.email.subscribe(function () { @@ -297,29 +298,38 @@ LoginUserView.prototype.onShow = function () { kn.routeOff(); + }; - _.delay(_.bind(function () { - if ('' !== this.email() && '' !== this.password()) - { - this.submitFocus(true); - } - else - { - this.emailFocus(true); - } + LoginUserView.prototype.onShowWithDelay = function () + { + if ('' !== this.email() && '' !== this.password()) + { + this.submitFocus(true); + } + else if ('' === this.email()) + { + this.emailFocus(true); + } + else if ('' === this.password()) + { + this.passwordFocus(true); + } + else + { + this.emailFocus(true); + } - if (Settings.settingsGet('UserLanguage')) - { - $.cookie('rllang', LanguageStore.language(), {'expires': 30}); - } - - }, this), 100); + if (Settings.settingsGet('UserLanguage')) + { + $.cookie('rllang', LanguageStore.language(), {'expires': 30}); + } }; LoginUserView.prototype.onHide = function () { this.submitFocus(false); this.emailFocus(false); + this.passwordFocus(false); }; LoginUserView.prototype.onBuild = function () diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 42582fa8e..f43b68aa2 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -279,8 +279,8 @@ this.viewIsImportant(oMessage.isImportant()); sLastEmail = oMessage.fromAsSingleEmail(); - Cache.getUserPic(sLastEmail, function (sPic, $sEmail) { - if (sPic !== self.viewUserPic() && sLastEmail === $sEmail) + Cache.getUserPic(sLastEmail, function (sPic, sEmail) { + if (sPic !== self.viewUserPic() && sLastEmail === sEmail) { self.viewUserPicVisible(false); self.viewUserPic(Consts.DataImages.UserDotPic); diff --git a/package.json b/package.json index 384e4d661..f3d3bf476 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "RainLoop", "title": "RainLoop Webmail", "version": "1.8.1", - "release": "276", + "release": "281", "description": "Simple, modern & fast web-based email client", "homepage": "http://rainloop.net", "main": "gulpfile.js", diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php index fb6b94e47..fd018300b 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Http.php @@ -280,20 +280,37 @@ class Http } /** + * @param bool $bCheckProxy = true + * * @return string */ - public function GetScheme() + public function GetScheme($bCheckProxy = true) { - $sHttps = \strtolower($this->GetServer('HTTPS', '')); - return ('on' === $sHttps || ('' === $sHttps && '443' === (string) $this->GetServer('SERVER_PORT', ''))) ? 'https' : 'http'; + return $this->IsSecure($bCheckProxy) ? 'https' : 'http'; } /** + * @param bool $bCheckProxy = true + * * @return bool */ - public function IsSecure() + public function IsSecure($bCheckProxy = true) { - return ('https' === $this->GetScheme()); + $sHttps = \strtolower($this->GetServer('HTTPS', '')); + if ('on' === $sHttps || ('' === $sHttps && '443' === (string) $this->GetServer('SERVER_PORT', ''))) + { + return true; + } + + if ($bCheckProxy && ( + ('https' === \strtolower($this->GetServer('HTTP_X_FORWARDED_PROTO', ''))) || + ('on' === \strtolower($this->GetServer('HTTP_X_FORWARDED_SSL', ''))) + )) + { + return true; + } + + return false; } /** @@ -308,12 +325,10 @@ class Http $sHost = $this->GetServer('HTTP_HOST', ''); if (0 === \strlen($sHost)) { - $sScheme = $this->GetScheme(); $sName = $this->GetServer('SERVER_NAME'); - $iPort = (int) $this->GetServer('SERVER_PORT'); + $iPort = (int) $this->GetServer('SERVER_PORT', 80); - $sHost = (('http' === $sScheme && 80 === $iPort) || ('https' === $sScheme && 443 === $iPort)) - ? $sName : $sName.':'.$iPort; + $sHost = (\in_array($iPort, array(80, 433))) ? $sName : $sName.':'.$iPort; } if ($bWithoutWWW) diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Cache/CacheClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Cache/CacheClient.php index 3073dbf1f..e72f56eaa 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Cache/CacheClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Cache/CacheClient.php @@ -191,4 +191,25 @@ class CacheClient return $this; } + + /** + * @param bool $bCache = false + * + * @return bool + */ + public function Verify($bCache = false) + { + if ($this->oDriver) + { + $sCacheData = \gmdate('Y-m-d-H'); + if ($bCache && $sCacheData === $this->Get('__verify_key__')) + { + return true; + } + + return $this->Set('__verify_key__', $sCacheData); + } + + return false; + } } diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php index df84926c5..9629f9290 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php @@ -617,6 +617,9 @@ class ImapClient extends \MailSo\Net\NetClient { $aReturn = array(); + $sDelimiter = ''; + $bInbox = false; + $oImapResponse = null; foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) { @@ -628,6 +631,16 @@ class ImapClient extends \MailSo\Net\NetClient $oFolder = Folder::NewInstance($oImapResponse->ResponseList[4], $oImapResponse->ResponseList[3], $oImapResponse->ResponseList[2]); + if ($oFolder->IsInbox()) + { + $bInbox = true; + } + + if (empty($sDelimiter)) + { + $sDelimiter = $oFolder->Delimiter(); + } + $aReturn[] = $oFolder; } catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) @@ -637,6 +650,11 @@ class ImapClient extends \MailSo\Net\NetClient } } + if (!$bInbox && !empty($sDelimiter)) + { + $aReturn[] = Folder::NewInstance('INBOX', $sDelimiter); + } + if ($bUseListStatus) { foreach ($aResult as /* @var $oImapResponse \MailSo\Imap\Response */ $oImapResponse) diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/FolderCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/FolderCollection.php index bfb3d202a..25303c8b6 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/FolderCollection.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/FolderCollection.php @@ -104,6 +104,27 @@ class FolderCollection extends \MailSo\Base\Collection return $this->sNamespace; } + /** + * @return string + */ + public function FindDelimiter() + { + $sDelimiter = '/'; + + $oFolder = $this->GetByFullNameRaw('INBOX'); + if (!$oFolder) + { + $oFolder = $this->GetByIndex(0); + } + + if ($oFolder) + { + $sDelimiter = $oFolder->Delimiter(); + } + + return $sDelimiter; + } + /** * @param string $sNamespace * diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index 99c49d9fe..262e69620 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -2038,10 +2038,10 @@ class MailClient * * @return array */ - public function folerListOptimization($aMailFoldersHelper, $iOptimizationLimit = 0) + public function folderListOptimization($aMailFoldersHelper, $iOptimizationLimit = 0) { // optimization - if (10 < $iOptimizationLimit && $iOptimizationLimit < \count($aMailFoldersHelper)) + if (10 < $iOptimizationLimit && \is_array($aMailFoldersHelper) && $iOptimizationLimit < \count($aMailFoldersHelper)) { if ($this->oLogger) { @@ -2056,7 +2056,7 @@ class MailClient 'drafts', 'junk', 'spam', 'trash', 'bin', - 'archive', 'allmail', 'all', + 'archives', 'archive', 'allmail', 'all', 'starred', 'flagged', 'important', 'contacts', 'chats' ); @@ -2064,10 +2064,21 @@ class MailClient $aNewMailFoldersHelper = array(); $iCountLimit = $iForeachLimit; + foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) { - // normal and subscribed only - if ($oFolder && ($oFolder->IsSubscribed() || \in_array(\strtolower($oFolder->NameRaw()), $aFilteredNames))) + // mandatory folders + if ($oFolder && \in_array(\strtolower($oFolder->NameRaw()), $aFilteredNames)) + { + $aNewMailFoldersHelper[] = $oFolder; + $aMailFoldersHelper[$iIndex] = null; + } + } + + foreach ($aMailFoldersHelper as $iIndex => /* @var $oImapFolder \MailSo\Mail\Folder */ $oFolder) + { + // subscribed folders + if ($oFolder && $oFolder->IsSubscribed()) { $aNewMailFoldersHelper[] = $oFolder; @@ -2205,7 +2216,7 @@ class MailClient } $iCount = \count($aMailFoldersHelper); - $aMailFoldersHelper = $this->folerListOptimization($aMailFoldersHelper, $iOptimizationLimit); + $aMailFoldersHelper = $this->folderListOptimization($aMailFoldersHelper, $iOptimizationLimit); $bOptimized = $iCount !== \count($aMailFoldersHelper); } diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 418d86f61..9c702f064 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -3371,7 +3371,7 @@ class Actions $oCacher = $this->Cacher(null, true); $oHttp = \MailSo\Base\Http::SingletonInstance(); - if (0 === \strlen($sDomain) || $oHttp->CheckLocalhost($sDomain) || !$oCacher) + if (0 === \strlen($sDomain) || $oHttp->CheckLocalhost($sDomain) || !$oCacher || !$oCacher->Verify(true)) { return 'NO'; } @@ -5028,8 +5028,7 @@ class Actions $sNamespace = $oFolderCollection->GetNamespace(); $sParent = empty($sNamespace) ? '' : \substr($sNamespace, 0, -1); - $oInboxFolder = $oFolderCollection->GetByFullNameRaw('INBOX'); - $sDelimiter = $oInboxFolder ? $oInboxFolder->Delimiter() : '/'; + $sDelimiter = $oFolderCollection->FindDelimiter(); $aList = array(); $aMap = $this->systemFoldersNames($oAccount); @@ -5108,7 +5107,8 @@ class Actions if ($bDoItAgain) { $oFolderCollection = $this->MailClient()->Folders('', '*', - !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true) + !!$this->Config()->Get('labs', 'use_imap_list_subscribe', true), + (int) $this->Config()->Get('labs', 'imap_folder_list_limit', 200) ); if ($oFolderCollection) @@ -5950,9 +5950,7 @@ class Actions { $this->smtpSendMessage($oAccount, $oMessage, $rMessageStream, $iMessageStreamSize, $bDsn, true); - $this->deleteMessageAttachmnets($oAccount); - - if (is_array($aDraftInfo) && 3 === count($aDraftInfo)) + if (\is_array($aDraftInfo) && 3 === \count($aDraftInfo)) { $sDraftInfoType = $aDraftInfo[0]; $sDraftInfoUid = $aDraftInfo[1]; @@ -6035,7 +6033,9 @@ class Actions @\fclose($rMessageStream); } - if (0 < strlen($sDraftFolder) && 0 < strlen($sDraftUid)) + $this->deleteMessageAttachmnets($oAccount); + + if (0 < \strlen($sDraftFolder) && 0 < \strlen($sDraftUid)) { try { diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Social.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Social.php index 21ff4d6ae..aa0175c40 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Social.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Social.php @@ -261,7 +261,7 @@ class Social $oSettings->SetConf('TwitterAccessToken', ''); $oSettings->SetConf('TwitterSocialName', ''); - + return $this->oActions->SettingsProvider()->Save($oAccount, $oSettings); } @@ -275,6 +275,7 @@ class Social { $sResult = ''; $sLoginUrl = ''; + $oAccount = null; $bLogin = false; $iErrorCode = \RainLoop\Notifications::UnknownError; @@ -347,13 +348,7 @@ class Social if ($aUserData && \is_array($aUserData) && !empty($aUserData['Email']) && isset($aUserData['Password'])) { - $oAccount = $this->oActions->LoginProcess($aUserData['Email'], $aUserData['Password']); - if ($oAccount instanceof \RainLoop\Model\Account) - { - $this->oActions->AuthToken($oAccount); - - $iErrorCode = 0; - } + $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); } else { @@ -421,6 +416,7 @@ class Social $mData = false; $sUserData = ''; $aUserData = false; + $oAccount = null; $bLogin = false; $iErrorCode = \RainLoop\Notifications::UnknownError; @@ -494,13 +490,7 @@ class Social if ($aUserData && \is_array($aUserData) && !empty($aUserData['Email']) && isset($aUserData['Password'])) { - $oAccount = $this->oActions->LoginProcess($aUserData['Email'], $aUserData['Password']); - if ($oAccount instanceof \RainLoop\Model\Account) - { - $this->oActions->AuthToken($oAccount); - - $iErrorCode = 0; - } + $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); } else { @@ -543,6 +533,7 @@ class Social $sLoginUrl = ''; $sSocialName = ''; + $oAccount = null; $bLogin = false; $iErrorCode = \RainLoop\Notifications::UnknownError; @@ -670,13 +661,7 @@ class Social !empty($aUserData['Email']) && isset($aUserData['Password'])) { - $oAccount = $this->oActions->LoginProcess($aUserData['Email'], $aUserData['Password']); - if ($oAccount instanceof \RainLoop\Model\Account) - { - $this->oActions->AuthToken($oAccount); - - $iErrorCode = 0; - } + $iErrorCode = $this->loginProcess($oAccount, $aUserData['Email'], $aUserData['Password']); } else { @@ -876,4 +861,42 @@ class Social { return \implode('_', array('twitter', \md5($oTwitter->config['consumer_secret']), $sTwitterUserId, APP_SALT)); } + + /** + * @param \RainLoop\Model\Account|null $oAccount + * @param string $sEmail + * @param string $sPassword + * + * @return int + */ + private function loginProcess(&$oAccount, $sEmail, $sPassword) + { + $iErrorCode = \RainLoop\Notifications::UnknownError; + + try + { + $oAccount = $this->oActions->LoginProcess($sEmail, $sPassword); + if ($oAccount instanceof \RainLoop\Model\Account) + { + $this->oActions->AuthToken($oAccount); + $iErrorCode = 0; + } + else + { + $oAccount = null; + $iErrorCode = \RainLoop\Notifications::AuthError; + } + } + catch (\RainLoop\Exceptions\ClientException $oException) + { + $iErrorCode = $oException->getCode(); + } + catch (\Exception $oException) + { + unset($oException); + $iErrorCode = \RainLoop\Notifications::UnknownError; + } + + return $iErrorCode; + } } \ No newline at end of file diff --git a/rainloop/v/0.0.0/app/templates/Views/User/Login.html b/rainloop/v/0.0.0/app/templates/Views/User/Login.html index adef613d1..20e128a84 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/Login.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/Login.html @@ -35,7 +35,7 @@
+ data-bind="textInput: password, hasFocus: passwordFocus" data-i18n-placeholder="LOGIN/LABEL_PASSWORD" /> @@ -59,7 +59,7 @@
{{INCLUDE/BottomControlGroup/PLACE}}
- diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolders.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolders.html index d520374b8..9c5106719 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolders.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsFolders.html @@ -26,10 +26,7 @@
-
-
-
- +
diff --git a/rainloop/v/0.0.0/langs/cs.ini b/rainloop/v/0.0.0/langs/cs.ini index 8347ca547..e44fa5b73 100644 --- a/rainloop/v/0.0.0/langs/cs.ini +++ b/rainloop/v/0.0.0/langs/cs.ini @@ -250,17 +250,17 @@ TITLE_UPDATE_ACCOUNT = "Upravit účet?" BUTTON_UPDATE_ACCOUNT = "Upravit" [POPUPS_IDENTITY] -TITLE_ADD_IDENTITY = "Add Identity?" -TITLE_UPDATE_IDENTITY = "Update Identity?" -BUTTON_ADD_IDENTITY = "Add" -BUTTON_UPDATE_IDENTITY = "Update" +TITLE_ADD_IDENTITY = "Opravdu přidat?" +TITLE_UPDATE_IDENTITY = "Uložit změny?" +BUTTON_ADD_IDENTITY = "Přídat" +BUTTON_UPDATE_IDENTITY = "Uložit" LABEL_EMAIL = "Email" -LABEL_NAME = "Name" -LABEL_REPLY_TO = "Reply-To" -LABEL_SIGNATURE = "Signature" -LABEL_CC = "Cc" -LABEL_BCC = "Bcc" -LABEL_SIGNATURE_INSERT_BEFORE = "Insert this signature before quoted text in replies" +LABEL_NAME = "Jméno" +LABEL_REPLY_TO = "Adresa odpovědi" +LABEL_SIGNATURE = "Podpis" +LABEL_CC = "kopie" +LABEL_BCC = "Skrytá" +LABEL_SIGNATURE_INSERT_BEFORE = "V odpovědích vložit podpis před citovaný text." [POPUPS_CREATE_FOLDER] TITLE_CREATE_FOLDER = "Vytvořit složku?" @@ -405,14 +405,14 @@ LABEL_FILTERS_NAME = "Filtry" LABEL_TEMPLATES_NAME = "Templates" LABEL_SECURITY_NAME = "Zabezpečení" LABEL_SOCIAL_NAME = "Sociální" -LABEL_THEMES_NAME = "Motívy" +LABEL_THEMES_NAME = "Motivy" LABEL_CHANGE_PASSWORD_NAME = "Heslo" LABEL_OPEN_PGP_NAME = "OpenPGP" BUTTON_BACK = "Zpět" [SETTINGS_FILTERS] LEGEND_FILTERS = "Filtry" -BUTTON_SAVE = "Uložiz" +BUTTON_SAVE = "Uložit" BUTTON_ADD_FILTER = "Přidat filtr" BUTTON_DELETE = "Smazat" BUTTON_RAW_SCRIPT = "Použít uživatelský skript" @@ -474,9 +474,9 @@ LABEL_ANIMATION_NORMAL = "Normlání" LABEL_ANIMATION_NONE = "Žádné" LABEL_VIEW_OPTIONS = "Možnosti zobrazení" LABEL_USE_PREVIEW_PANE = "Používate panel rychlého zobrazení" -LABEL_USE_CHECKBOXES_IN_LIST = "Zobrazení zaškrtávácích políče v seznamu" -LABEL_USE_THREADS = "Zobrazit jako konverzaceZobraziť ako konverzácie" -LABEL_REPLY_SAME_FOLDER = "Ukládat odpovědit do složky se správou, které se týkají" +LABEL_USE_CHECKBOXES_IN_LIST = "Zobrazení zaškrtávácích políček v seznamu" +LABEL_USE_THREADS = "Zobrazit jako konverzace" +LABEL_REPLY_SAME_FOLDER = "Ukládat odpovědi do složky se zprávou, které se týkají" LABEL_SHOW_IMAGES = "Vždy zobrazovat obrázky v těle správy" LABEL_SHOW_ANIMATION = "Animovat" LABEL_MESSAGE_PER_PAGE = "Zpráv na stranu" @@ -538,14 +538,14 @@ TO_MANY_FOLDERS_DESC_2 = "Můžeme zobrazit jen část z nich, abychom zabránil [SETTINGS_ACCOUNTS] LEGEND_ACCOUNTS = "Seznam účtů" -LEGEND_IDENTITIES = "Identities" -LEGEND_ACCOUNTS_AND_IDENTITIES = "Accounts and Identities" +LEGEND_IDENTITIES = "Identity" +LEGEND_ACCOUNTS_AND_IDENTITIES = "Účty a identity" BUTTON_ADD_ACCOUNT = "Přidat účet" -BUTTON_ADD_IDENTITY = "Add an Identity" +BUTTON_ADD_IDENTITY = "Přidat identitu" BUTTON_DELETE = "Odstranit" LOADING_PROCESS = "Aktualizace seznamu účtů" DELETING_ASK = "Opravdu to chcete?" -DEFAULT_IDENTITY_LABEL = "default" +DEFAULT_IDENTITY_LABEL = "výchozí" [SETTINGS_IDENTITIES] LEGEND_IDENTITY = "Identita"