0011252: Can not use Expressomail
authorFlávio Gomes da Silva Lisboa <flavio.lisboa@serpro.gov.br>
Wed, 2 Sep 2015 20:11:14 +0000 (17:11 -0300)
committerPhilipp Schüle <p.schuele@metaways.de>
Wed, 9 Sep 2015 08:13:54 +0000 (10:13 +0200)
- Update application files according release ExpressoBr.20150619
- Remove unnecessary Java files

Change-Id: Idc539609aacc254b204f9f7cfb3256310fee2afe
Reviewed-on: https://gerrit.tine20.org/tine20/3202
Tested-by: jenkins user
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
35 files changed:
tine20/Expressomail/Backend/Folder.php
tine20/Expressomail/Config.php
tine20/Expressomail/Controller.php
tine20/Expressomail/Controller/Account.php
tine20/Expressomail/Controller/Folder.php
tine20/Expressomail/Controller/Message.php
tine20/Expressomail/Controller/Message/Send.php
tine20/Expressomail/Exception/IMAPCacheTooMuchResults.php
tine20/Expressomail/Frontend/Json.php
tine20/Expressomail/Java/ExpressoCertMail-all.jar [deleted file]
tine20/Expressomail/Model/Account.php
tine20/Expressomail/Model/DeliveryStatusNotificationMessagePart.php [new file with mode: 0644]
tine20/Expressomail/Model/Message.php
tine20/Expressomail/Protocol/Imap.php
tine20/Expressomail/Record/SearchTotalCountInterface.php
tine20/Expressomail/Record/SearchTotalCountRecordSet.php
tine20/Expressomail/Setup/Initialize.php
tine20/Expressomail/Setup/Update/Release0.php
tine20/Expressomail/Setup/setup.xml
tine20/Expressomail/css/Expressomail.css
tine20/Expressomail/js/AdminPanel.js
tine20/Expressomail/js/Expressomail.js
tine20/Expressomail/js/GridPanel.js
tine20/Expressomail/js/ImportEmlDialog.js
tine20/Expressomail/js/MessageDisplayDialog.js
tine20/Expressomail/js/MessageEditDialog.js
tine20/Expressomail/js/Model.js
tine20/Expressomail/js/TreeContextMenu.js
tine20/Expressomail/js/TreePanel.js
tine20/Expressomail/translations/de.po
tine20/Expressomail/translations/en.po
tine20/Expressomail/translations/es.po
tine20/Expressomail/translations/pt_BR.po
tine20/Expressomail/translations/template.pot
tine20/Tinebase/Core.php

index d92d1f3..3cc853c 100644 (file)
@@ -440,7 +440,12 @@ class Expressomail_Backend_Folder //extends Tinebase_Backend_Sql_Abstract
                 $quota = $imap->getQuota($folderDecoded['globalName']);
                 $expressomailSession->quota[$folderDecoded['globalName']] = $quota;
             }else {
-                $globalNameFolder = $arrDecodedFolder[0];
+                if($arrDecodedFolder[0] === 'INBOX' && isset($arrDecodedFolder[1]) && $arrDecodedFolder[1] === 'Arquivo Remoto'){
+                    $globalNameFolder = $arrDecodedFolder[0] . self::IMAPDELIMITER . $arrDecodedFolder[1];
+                }else{
+                    $globalNameFolder = $arrDecodedFolder[0];
+                }
+
                 if ($arrDecodedFolder[0] !== 'INBOX'){
                     $globalNameFolder .= (isset($arrDecodedFolder[1]))?self::IMAPDELIMITER . $arrDecodedFolder[1]:'';
                 }
index 07368d9..0502348 100644 (file)
@@ -44,6 +44,13 @@ class Expressomail_Config extends Tinebase_Config_Abstract
     const AUTOSAVEDRAFTSINTERVAL = 'autoSaveDraftsInterval';
 
     /**
+     * Email to send reports of phishings
+     *
+     * @var string
+     */
+    const REPORTPHISHINGEMAIL = 'reportPhishingEmail';
+
+    /**
      * id to use at cache and '_config' database table
      * @var string
      */
@@ -99,6 +106,15 @@ class Expressomail_Config extends Tinebase_Config_Abstract
             'setBySetupModule'      => FALSE,
             'default'               => 15,
         ),
+        self::REPORTPHISHINGEMAIL => array(
+            'label'                 => 'Report Phishing Email',
+            'description'           => 'Email to which to report phishing',
+            'type'                  => Tinebase_Config_Abstract::TYPE_STRING,
+            'clientRegistryInclude' => TRUE,
+            'setByAdminModule'      => TRUE,
+            'setBySetupModule'      => FALSE,
+            'default'               => '',
+        ),
         self::MAX_CONTACT_ADD_TO_UNKNOWN => array(
             'label'                 => 'Unknown Contacts Maximum Import',
             'description'           => 'Maximum contacts to use Unknown Contacts import feature',
@@ -165,7 +181,8 @@ class Expressomail_Config extends Tinebase_Config_Abstract
      * (non-PHPdoc)
      * @see Tinebase_Config_Abstract::clearCache()
      */
-    public function clearCache($appFilter = null) {
+    public function clearCache($appFilter = null)
+    {
        parent::clearCache();
            $cache = Tinebase_Core::getCache();
            $cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array(Expressomail_Config::EXPRESSOMAIL_SETTINGS));
index 56885bb..dab1c18 100644 (file)
@@ -35,6 +35,7 @@ class Expressomail_Controller extends Tinebase_Controller_Event
         $this->_defaultsSettings = array(
             Expressomail_Config::IMAPSEARCHMAXRESULTS => 1000,
             Expressomail_Config::AUTOSAVEDRAFTSINTERVAL => 15,
+            Expressomail_Config::REPORTPHISHINGEMAIL => '',
         );
     }
     
index 02f72a1..2224f77 100644 (file)
@@ -172,7 +172,7 @@ class Expressomail_Controller_Account extends Tinebase_Controller_Record_Abstrac
     {
         Tinebase_Core::setupCache();
         $cache = Tinebase_Core::getCache();
-        $cacheId = Tinebase_Core::createCacheId(array(Tinebase_Core::getUser()->accountId,$_id));
+        $cacheId = Tinebase_Helper::arrayHash(array(Tinebase_Core::getUser()->accountId,$_id));
         $record = $cache->load($cacheId);
         if ($record === FALSE){
             $record = parent::get($_id, $_containerId);
index 6ff78bb..d2a00ed 100644 (file)
@@ -85,25 +85,27 @@ class Expressomail_Controller_Folder extends Tinebase_Controller_Abstract implem
     /**
      * get folder status/values from imap server and update folder cache record in database
      *
-     * @param Expressomail_Model_Folder $_folder
-     * @param Expressomail_Backend_Imap|boolean $_imap
+     * @param string $_folderID
      * @return Expressomail_Model_Folder
      *
      * @todo It should'nt access Imap Backend directly. Method should be at Expressomail_Backend_Folder
      */
-    public function getIMAPFolderCounter(Expressomail_Model_Folder $_folder)
+    public function getIMAPFolderCounter($_folderID)
     {
-        $folder = ($_folder instanceof Expressomail_Model_Folder) ? $_folder : Expressomail_Controller_Folder::getInstance()->get($_folder);
-
-        $imap = Expressomail_Backend_ImapFactory::factory($folder->account_id);
-
+        $folderData = Expressomail_Backend_Folder::decodeFolderUid($_folderID);
+        $imap = Expressomail_Backend_ImapFactory::factory($folderData['accountId']);
         // get folder values / status from imap server
-        $counter = $imap->examineFolder(Expressomail_Model_Folder::encodeFolderName($folder->globalname));
-
-        if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ .  ' ' . print_r($counter, TRUE));
-
+        $counter = $imap->examineFolder($folderData['globalName']);
+        if($counter['recent'] > 0){
+            $imap->selectFolder($folderData['globalName']);
+            $idsInFolder = $imap->sort(array('DATE'), array('RECENT'));
+        }
+        if(Tinebase_Core::isLogLevel(Zend_Log::TRACE)) Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ .  ' ' . print_r($counter, TRUE));
+        $folder = new Expressomail_Model_Folder();
         // check validity
-        $folder->cache_uidvalidity = $folder->imap_uidvalidity;
+        $folder->id = $_folderID;
+        $folder->globalname = $folderData['globalName'];
+        $folder->cache_recentcount = $counter['recent'];
         $folder->imap_uidvalidity  = $counter['uidvalidity'];
         $folder->imap_totalcount   = $counter['exists'];
         $folder->imap_status       = Expressomail_Model_Folder::IMAP_STATUS_OK;
@@ -409,7 +411,7 @@ class Expressomail_Controller_Folder extends Tinebase_Controller_Abstract implem
      * @param  mixed   $_accountId
      * @param  string  $_folderName global name
      * @param  boolean $_recursive 
-     * @return Tinebase_Record_RecordSet of Felamimail_Model_Folder
+     * @return Tinebase_Record_RecordSet of Expressomail_Model_Folder
      */
     public function updateFolderCache($_accountId, $_folderName = '', $_recursive = FALSE)
     {
@@ -941,12 +943,15 @@ class Expressomail_Controller_Folder extends Tinebase_Controller_Abstract implem
     public function getFolderStatus(Expressomail_Model_FolderFilter $_filter)
     {
 
-        // add user account ids to filter and use the folder backend to search as the folder controller has some special handling in its search function
-        $_filter->createFilter(array('field' => 'account_id', 'operator' => 'in', 'value' => Expressomail_Controller_Account::getInstance()->search()->getArrayOfIds()));
-        $folders = $this->_backend->search($_filter, FALSE);
-
+        $filters = $_filter->getFilterObjects();
+        foreach($filters as $filter) {
+            if($filter->getField() === 'id') {
+                $ids = $filter->getValue();
+                break;
+            }
+        }
         $result = new Tinebase_Record_RecordSet('Expressomail_Model_Folder');
-        foreach ($folders as $folder) {
+        foreach ($ids as $folder) {
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ .  ' Checking folder ' . $folder->globalname);
 
             $folder = $this->getIMAPFolderCounter($folder);
index a2238d5..3c41cb7 100644 (file)
@@ -286,7 +286,7 @@ class Expressomail_Controller_Message extends Tinebase_Controller_Record_Abstrac
           /**
      * get Raw message
      *
-     * @param string|Felamimail_Model_Message $_id
+     * @param string|Expressomail_Model_Message $_id
      * @return String
      */
     public function getRawMessage($_id)
@@ -717,6 +717,43 @@ class Expressomail_Controller_Message extends Tinebase_Controller_Record_Abstrac
             }
 
     /**
+     * Process a multipart/report message and returns an user friendly Html formatted body
+     *
+     * @param Expressomail_Model_Message $_message
+     * @param type $_partId
+     * @param type $_contentType
+     * @param type $_account
+     * @return string processed message body
+     */
+    protected function _getMultipartReportMessageBody(Expressomail_Model_Message $_message,
+        $_partId, $_contentType, $_account = NULL)
+    {
+        $structure = $_message->getPartStructure($_partId);
+        $bodyParts = $_message->getBodyParts($structure, $_contentType);
+
+        // test if we have all the parts
+        if (empty($bodyParts)
+            || count($bodyParts) < 2 || count($bodyParts) > 3
+            || (!isset($bodyParts[2]['contentType'])
+                && $bodyParts[2]['contentType'] !== Expressomail_Model_Message::CONTENT_TYPE_MESSAGE_DELIVERYSTATUS
+            )
+        ){
+            Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
+                . ' Malformed DSN Message.');
+            Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__
+                . ' Message Model Dump:.' . print_r($_message->toArray(), true));
+            return '';
+        }
+
+        // delivery status parts are always partId 2
+        $bodyPart = $this->getMessagePart($_message, 2, TRUE, $structure);
+
+        $dsn = new Expressomail_Model_DeliveryStatusNotificationMessagePart(
+                $this->_getDecodedBodyContent($bodyPart, $structure));
+        return $dsn->getHTMLFormatted();
+    }
+
+    /**
      * get message body
      *
      * @param string|Expressomail_Model_Message $_messageId
@@ -732,7 +769,11 @@ class Expressomail_Controller_Message extends Tinebase_Controller_Record_Abstrac
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
             . ' Get Message body (part: ' . $_partId . ') of message id ' . $message->getId() . ' (content type ' . $_contentType . ')');
 
-        $messageBody = $this->_getAndDecodeMessageBody($message, $_partId, $_contentType, $_account);
+        if ($_partId == NULL && $message->content_type === Expressomail_Model_Message::CONTENT_TYPE_MULTIPART_REPORT) {
+            $messageBody = $this->_getMultipartReportMessageBody($message, $_partId, $_contentType, $_account);
+        } else {
+            $messageBody = $this->_getAndDecodeMessageBody($message, $_partId, $_contentType, $_account);
+        }
 
         return $messageBody;
     }
@@ -821,7 +862,7 @@ class Expressomail_Controller_Message extends Tinebase_Controller_Record_Abstrac
                     . ' Do not convert ' . $bodyPart->type . ' part to ' . $_contentType);
             }
 
-            // Use only Felamimail to send e-mails
+            // Use only Expressomail to send e-mails
             $body = Expressomail_Message::replaceEmails($body);
 
             if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__
@@ -867,6 +908,7 @@ class Expressomail_Controller_Message extends Tinebase_Controller_Record_Abstrac
                 // '=0A' is a invalid UTF8 character so we need to remove ir defore the quoted_printable_decode
                 $body = str_ireplace('=0A', '', $rawBody);
                 $body = quoted_printable_decode($body);
+                $body = mb_convert_encoding($body, $charset, 'UTF-8');
                 $body = iconv($charset, 'utf-8', $body);
             } else {
                 unset($rawBody);
@@ -1221,9 +1263,14 @@ class Expressomail_Controller_Message extends Tinebase_Controller_Record_Abstrac
             if ($part['type'] == 'multipart') {
                 $attachments = $attachments + $this->getAttachments($message, $part['partId']);
             } else {
-                if ($part['type'] == 'text' &&
-                    (!is_array($part['disposition']) || ($part['disposition']['type'] == Zend_Mime::DISPOSITION_INLINE && !array_key_exists("parameters", $part['disposition'])))
-                ) {
+                if ($part['type'] == 'text'
+                    && $structure['contentType'] != Expressomail_Model_Message::CONTENT_TYPE_MULTIPART_REPORT
+                    && (!is_array($part['disposition'])
+                        || ($part['disposition']['type'] == Zend_Mime::DISPOSITION_INLINE
+                            && !array_key_exists("parameters", $part['disposition'])
+                        )
+                    )
+                ){
                     continue;
                 }
 
@@ -1579,4 +1626,86 @@ class Expressomail_Controller_Message extends Tinebase_Controller_Record_Abstrac
         }
     }
 
+    /**
+     * parse phishing notification
+     *
+     * @param Object $message
+     * @param Object $zipFile
+     * @return Object
+     */
+    public function parsePhishingNotification($message, $zipFile)
+    {
+        $body = str_replace("{0}", $this->getFormattedGmtDateTime(), $message->body);
+        $message->body = $body;
+
+        $message->attachments = array(
+            array(
+              'tempFile'  => array(
+                  'id'          => $zipFile['id'],
+                  'session_id'  => $zipFile['session_id'],
+                  'time'        => $zipFile['time'],
+                  'path'        => $zipFile['path'],
+                  'name'        => $zipFile['name'],
+                  'type'        => $zipFile['type'],
+                  'error'       => $zipFile['error'],
+                  'size'        => $zipFile['size'],
+              ),
+              'name'      => $zipFile['name'],
+              'size'      => $zipFile['size'],
+              'path'      => $zipFile['path'],
+            )
+        );
+
+        return $message;
+    }
+
+    /**
+     * zip message(s)
+     *
+     * @param  array $msgIds
+     * @return Object
+     */
+    public function zipMessages($msgIds)
+    {
+        $zipArchive = new ZipArchive();
+        $tmpFile = tempnam(Tinebase_Core::getTempDir(), 'tine20_');
+        if ($zipArchive->open($tmpFile) === TRUE) {
+            foreach($msgIds as $msgId){
+                $part = Expressomail_Controller_Message::getInstance()->getRawMessage($msgId);
+                $filename = $msgId . '.eml';
+                $zipArchive->addFromString($filename, $part);
+            }
+            $zipArchive->close();
+        }
+
+        $zipFile = Tinebase_TempFile::getInstance()->createTempFile($tmpFile, "mensagem.zip");
+
+        return $zipFile;
+    }
+
+    /**
+     * get formatted gmt date and time
+     *
+     * @return String
+     */
+    private function getFormattedGmtDateTime()
+    {
+        // calculate timezone in "GMT-HH:MM" format
+        $dtz = new DateTimeZone(Tinebase_Core::get(Tinebase_Core::USERTIMEZONE));
+        $time = new DateTime('now', $dtz);
+        $offset = $dtz->getOffset( $time );
+        $sign = ($offset < 0 ) ? "-" : "+";
+        $offset = abs($offset);
+        $hours = floor($offset / 3600);
+        $hours = $hours < 10 ? '0' . $hours : $hours;
+        $minutes = offset % 60;
+        $minutes = $minutes < 10 ? '0' . $minutes : $minutes;
+        $gmt =  '(GMT'.$sign . $hours . ":" . $minutes . ')';
+
+        $dateTime = date('Y-m-d H:i:s');
+        $formattedDateTime = Tinebase_Translation::dateToStringInTzAndLocaleFormat(Expressomail_Message::convertDate($dateTime));
+
+        return $formattedDateTime . ' ' . $gmt;
+    }
+
 }
index 5378954..1e559a2 100644 (file)
@@ -454,9 +454,14 @@ class Expressomail_Controller_Message_Send extends Expressomail_Controller_Messa
     protected function _selectSentFolder($_message, $_account)
     {
         if (!(is_null($_message))){
+            $imapConfig = Tinebase_Config::getInstance()->get(Tinebase_Config::IMAP, new Tinebase_Config_Struct())->toArray();
             $sendFolder = Expressomail_Controller_Account::getInstance()->getSystemFolder($_message->account_id, Expressomail_Model_Folder::FOLDER_SENT);
             if($_message->sender_account){
-                $this->_sentFolder = 'user/'.$_message->sender_account.substr($sendFolder->globalname, 5);
+                if(isset($imapConfig['useEmailAsLoginName']) && $imapConfig['useEmailAsLoginName'] === '1'){
+                    $this->_sentFolder = 'user/'.str_ireplace('@','/'.$sendFolder->localname.'@', $_message->from_email);
+                }else{
+                    $this->_sentFolder = 'user/'.$_message->sender_account.substr($sendFolder->globalname, 5);
+                }
             }else {
                 $this->_sentFolder = $sendFolder->globalname;
             }
@@ -666,7 +671,7 @@ class Expressomail_Controller_Message_Send extends Expressomail_Controller_Messa
      */
     public function processEmbeddedImagesInHtmlBody($html)
     {
-        //todo find everything in the format <img style="....." alt="'+data.name+'" src="index.php?method=Felamimail.showTempImage&tempImageId='+data.url+'"/>
+        //todo find everything in the format <img style="....." alt="'+data.name+'" src="index.php?method=Expressomail.showTempImage&tempImageId='+data.url+'"/>
         //     create multipart/related parts and replace src with CID:cid
         $expImages = '/<img .?[^>]*?alt="([^\"]+)" src="index.php\?method=Expressomail\.showTempImage&amp;tempImageId=([a-z0-9A-Z]+)"(?: \w+=".+?")*>/i';
         preg_match_all($expImages, $html, $result);
@@ -687,7 +692,7 @@ class Expressomail_Controller_Message_Send extends Expressomail_Controller_Messa
      */
     public function processEmbeddedImagesInHtmlBodyForReply($html)
     {
-   //todo achar tudo no formato <img alt="'+data.name+'" src="index.php?method=Felamimail.showTempImage&tempImageId='+data.url+'"/>, criar as partes multipart/related e substituir o src por CID:cid
+   //todo achar tudo no formato <img alt="'+data.name+'" src="index.php?method=Expressomail.showTempImage&tempImageId='+data.url+'"/>, criar as partes multipart/related e substituir o src por CID:cid
         $exp = "/src=['\"]index.php\?method=Expressomail\.downloadAttachment&amp;messageId=([a-z0-9A-Z]+)&amp;partId=([0-9\.]+)(?:&amp;[^?&\\=;'\"]+=[^?&\\=;'\"]+)*['\"]/i";
        //a-z0-9A-Z. _-
         preg_match_all($exp, $html, $result);
index 089a834..735e07c 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Tine 2.0
  *
- * @package     Felamimail
+ * @package     Expressomail
  * @subpackage  Exception
  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
  * @copyright   Copyright (c) 2010 Metaways Infosystems GmbH (http://www.metaways.de)
@@ -13,7 +13,7 @@
 /**
  * General IMAP Exception
  *
- * @package     Felamimail
+ * @package     Expressomail
  * @subpackage  Exception
  */
 class Expressomail_Exception_IMAPCacheTooMuchResults extends Expressomail_Exception
index 65e7886..d63830f 100644 (file)
@@ -423,6 +423,28 @@ class Expressomail_Frontend_Json extends Tinebase_Frontend_Json_Abstract
     }
 
     /**
+     * report message(s) as phishing
+     *
+     * @param  array $msgIds
+     * @param  array $recordData
+     * @return array
+     */
+    public function reportPhishing($msgIds, $recordData)
+    {
+        $message = new Expressomail_Model_Message();
+        $message->setFromJsonInUsersTimezone($recordData);
+
+        $zipFile = Expressomail_Controller_Message::getInstance()->zipMessages($msgIds);
+
+        $message = Expressomail_Controller_Message::getInstance()->parsePhishingNotification($message, $zipFile);
+
+        $message = Expressomail_Controller_Message_Send::getInstance()->sendMessage($message);
+        $result = $this->_recordToJson($message);
+
+        return $result;
+    }
+
+    /**
      * get draft message data
      *
      * @param  string $id
@@ -875,9 +897,11 @@ class Expressomail_Frontend_Json extends Tinebase_Frontend_Json_Abstract
         $config = Tinebase_Core::getConfig();
         $result['useKeyEscrow'] = $config->certificate->active && $config->certificate->useKeyEscrow;
 
-        // add autoSaveDraftsInterval to client registry
         $config = Expressomail_Controller::getInstance()->getConfigSettings(false);
+        // add autoSaveDraftsInterval to client registry
         $result['autoSaveDraftsInterval'] = $config->autoSaveDraftsInterval;
+        // add reportPhishingEmail to client registry
+        $result['reportPhishingEmail'] = $config->reportPhishingEmail;
 
         return $result;
     }
diff --git a/tine20/Expressomail/Java/ExpressoCertMail-all.jar b/tine20/Expressomail/Java/ExpressoCertMail-all.jar
deleted file mode 100644 (file)
index c8709c3..0000000
Binary files a/tine20/Expressomail/Java/ExpressoCertMail-all.jar and /dev/null differ
index bbc132a..5a23b65 100644 (file)
@@ -281,7 +281,7 @@ class Expressomail_Model_Account extends Tinebase_Record_Abstract
     public function getUsername($_username = NULL)
     {
         $imapConfig = Tinebase_Config::getInstance()->get(Tinebase_Config::IMAP, new Tinebase_Config_Struct())->toArray();
-        $useUsernameAsLoginName = !$imapConfig['useEmailAsLoginName'];
+        $useUsernameAsLoginName = isset($imapConfig['useEmailAsLoginName']) ? !$imapConfig['useEmailAsLoginName'] : TRUE;
 
         $result = $this->email;
 
diff --git a/tine20/Expressomail/Model/DeliveryStatusNotificationMessagePart.php b/tine20/Expressomail/Model/DeliveryStatusNotificationMessagePart.php
new file mode 100644 (file)
index 0000000..7c775d8
--- /dev/null
@@ -0,0 +1,462 @@
+<?php
+/**
+ * class to hold prepared message part data
+ *
+ * @package     Expressomail
+ * @subpackage  Model
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Mário César Kolling <mario.kolling@serpro.gov.br>
+ * @copyright   Copyright (c) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
+ * @copyright   Copyright (c) 2014 Serviço Fedral de Processamento de Dados - SERPRO
+ */
+
+class Expressomail_Model_DeliveryStatusNotificationMessagePart
+{
+
+    /***** CONSTANTS *****/
+    /**
+     * Status Class Success
+     */
+    const CLASS_SUCCESS_STATUS = '2';
+
+    /**
+     * Status Class Persistent Transient Failure
+     */
+    const CLASS_TRANSIENT_STATUS = '4';
+
+    /**
+     * Status Class Permanent Failure
+     */
+    const CLASS_PERMANENT_STATUS = '5';
+
+    /**
+     * X.0.0 Other or Undefined Status
+     */
+    const OTHER_STATUS = '0.0';
+
+    /**
+     * Other address status
+     */
+    const OTHER_ADDRESS_STATUS = '1.0';
+
+    /**
+     * X.1.1   Bad destination mailbox address status
+     */
+    const BAD_DESTINATION_MAILBOX_ADDRESS_STATUS = '1.1';
+
+    /**
+     * X.1.2   Bad destination system address
+     */
+    const BAD_DESTINATION_SYSTEM_ADDRESS_STATUS = '1.2';
+
+    /**
+     * X.1.3   Bad destination mailbox address syntax
+     */
+    const BAD_DESTINATION_MAILBOX_ADDRESS_SYNTAX_STATUS = '1.3';
+
+    /**
+     * X.1.4   Destination mailbox address ambiguous
+     */
+    const BAD_DESTINATION_MAILBOX_ADDRESS_AMBIGUOUS_STATUS = '1.4';
+
+    /**
+     * X.1.5   Destination address valid
+     */
+    const DESTINATION_ADDRESS_VALID_STATUS = '1.5';
+
+    /**
+     * X.1.6   Destination mailbox has moved, No forwarding address
+     */
+    const DESTINATION_MAILBOX_HAS_MOVED_STATUS = '1.6';
+
+    /**
+     * X.1.7   Bad sender's mailbox address syntax
+     */
+    const BAD_SENDER_MAILBOX_ADDRESS_SYNTAX_STATUS = '1.7';
+
+    /**
+     * X.1.8   Bad sender's system address
+     */
+    const BAD_SENDER_SYSTEM_ADDRESS_STATUS = '1.8';
+
+    /**
+     * X.2.0   Other or undefined mailbox status
+     */
+    const OTHER_MAILBOX_STATUS = '2.0';
+
+    /**
+     * X.2.1   Mailbox disabled, not accepting messages
+     */
+    const MAILBOX_DISABLED_STATUS = '2.1';
+
+    /**
+     * X.2.2   Mailbox full
+     */
+    const MAILBOX_FULL_STATUS = '2.2';
+
+    /**
+     * X.2.3   Message length exceeds administrative limit
+     */
+    const MESSAGE_LENGTH_EXCEEDED_STATUS = '2.3';
+
+    /**
+     * X.2.4   Mailing list expansion problem
+     */
+    const MAILING_LIST_EXPANSION_PROBLEM_STATUS = '2.4';
+
+    /**
+     * X.3.0   Other or undefined mail system status
+     */
+    const OTHER_MAIL_SYSTEM_STATUS = '3.0';
+
+    /**
+     * X.3.1   Mail system full
+     */
+    const MAIL_SYSTEM_FULL_STATUS = '3.1';
+
+    /**
+     * X.3.2   System not accepting network messages
+     */
+    const SYSTEM_NOT_ACCEPTING_MESSAGES_STATUS = '3.2';
+
+    /**
+     * X.3.3   System not capable of selected features
+     */
+    const SYSTEM_NOT_CAPABLE_STATUS = '3.3';
+
+    /**
+     * X.3.4   Message too big for system
+     */
+    const MESSAGE_TOO_BIG_STATUS = '3.4';
+
+    /**
+     * X.3.5 System incorrectly configured
+     */
+    const SYSTEM_CONFIGURATION_INCORRECT_STATUS = '3.5';
+
+    /**
+     * X.4.0   Other or undefined network or routing status
+     */
+    const OTHER_NETWORK_STATUS = '4.0';
+
+    /**
+     * X.4.1   No answer from host
+     */
+    const NO_ANSWER_FROM_HOST_STATUS = '4.1';
+
+    /**
+     * X.4.2   Bad connection
+     */
+    const BAD_CONNECTION_STATUS = '4.2';
+
+    /**
+     * X.4.3   Directory server failure
+     */
+    const DIRECTORY_SERVER_FAILURE_STATUS = '4.3';
+
+    /**
+     * X.4.4   Unable to route
+     */
+    const UNABLE_TO_ROUTE_STATUS = '4.4';
+
+    /**
+     * X.4.5   Mail system congestion
+     */
+    const MAIL_SYSTEM_CONGESTION_STATUS = '4.5';
+
+    /**
+     * X.4.6   Routing loop detected
+     */
+    const ROUTING_LOOP_DETECTED_STATUS = '4.6';
+
+    /**
+     * X.4.7   Delivery time expired
+     */
+    const DELIVERY_TIME_EXPIRED_STATUS = '4.7';
+
+    /**
+     * X.5.0   Other or undefined protocol status
+     */
+    const OTHER_PROTOCOL_STATUS = '5.0';
+
+    /**
+     * X.5.1   Invalid command
+     */
+    const INVALID_COMMAND_STATUS = '5.1';
+
+    /**
+     * X.5.2   Syntax error
+     */
+    const SYNTAX_ERROR_STATUS = '5.2';
+
+    /**
+     * X.5.3   Too many recipients
+     */
+    const TOO_MANY_RECIPIENTS_STATUS = '5.3';
+
+    /**
+     * X.5.4   Invalid command arguments
+     */
+    const INVALID_COMMAND_ARGUMENTS_STATUS = '5.4';
+
+    /**
+     * X.5.5   Wrong protocol version
+     */
+    const WRONG_PROTOCOL_VERSION_STATUS = '5.5';
+
+    /**
+     * X.6.0   Other or undefined media error
+     */
+    const OTHER_MEDIA_ERROR_STATUS = '6.0';
+
+    /**
+     * X.6.1   Media not supported
+     */
+    const MEDIA_NOT_SUPPORTED_STATUS = '6.1';
+
+    /**
+     * X.6.2   Conversion required and prohibited
+     */
+    const CONVERSION_PROHIBITED_STATUS = '6.2';
+
+    /**
+     * X.6.3   Conversion required but not supported
+     */
+    const CONVERSION_NOT_SUPPORTED_STATUS = '6.3';
+
+    /**
+     * X.6.4   Conversion with loss performed
+     */
+    const CONVERSION_WITH_LOSS_PERFORMED_STATUS = '6.4';
+
+    /**
+     * X.6.5   Conversion Failed
+     */
+    const CONVERSION_FAILED_STATUS = '6.5';
+
+    /**
+     * X.7.0   Other or undefined security status
+     */
+    const OTHER_SECURITY_STATUS = '7.0';
+
+    /**
+     * X.7.1   Delivery not authorized, message refused
+     */
+    const DELIVERY_NOT_AUTHORIZED_STATUS = '7.1';
+
+    /**
+     * X.7.2   Mailing list expansion prohibited
+     */
+    const MAILING_LIST_EXPANSION_PROHIBITED_STATUS = '7.2';
+
+    /**
+     * X.7.3   Security conversion required but not possible
+     */
+    const SECURITY_CONVERSION_NOT_POSSIBLE_STATUS = '7.3';
+
+    /**
+     * X.7.4   Security features not supported
+     */
+    const SECURITY_FEATURE_NOT_SUPPORTED_STATUS = '7.4';
+
+    /**
+     * X.7.5   Cryptographic failure
+     */
+    const CRYPTOGRAPHIC_FAILURE_STATUS = '7.5';
+
+    /**
+     * X.7.6   Cryptographic algorithm not supported
+     */
+    const CRYPTO_ALGORITHM_NOT_SUPPORTED_STATUS = '7.6';
+
+    /**
+     * X.7.7   Message integrity failure
+     */
+    const MESSAGE_INTEGRITY_FAILURE_STATUS = '7.7';
+
+    /***** FIELDS *****/
+    protected $_parsed = FALSE;
+    protected $_dsnBody;
+    protected $_recipients = array();
+
+    /**
+     *
+     * @param type $_dsnBody
+     */
+    public function __construct($_dsnBody)
+    {
+        $this->_dsnBody = $_dsnBody;
+    }
+
+    /**
+     * Get a status message for status value received
+     *
+     * @param string $statusValue
+     * @return string Status message
+     */
+    protected function _getStatusMessage($statusValue)
+    {
+
+        $return = '';
+        switch ($statusValue) {
+            case self::OTHER_STATUS :
+            case self::OTHER_ADDRESS_STATUS :
+            case self::OTHER_MAILBOX_STATUS :
+            case self::OTHER_MAIL_SYSTEM_STATUS :
+            case self::OTHER_NETWORK_STATUS :
+            case self::OTHER_PROTOCOL_STATUS :
+            case self::OTHER_MEDIA_ERROR_STATUS :
+            case self::OTHER_SECURITY_STATUS :
+                $return = 'Unknown Status';
+                Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__
+                    . ' Unknown Status: ' . $statusValue);
+                break;
+            case self::BAD_DESTINATION_MAILBOX_ADDRESS_STATUS :
+            case self::BAD_DESTINATION_MAILBOX_ADDRESS_SYNTAX_STATUS :
+            case self::BAD_DESTINATION_MAILBOX_ADDRESS_AMBIGUOUS_STATUS :
+            case self::DESTINATION_MAILBOX_HAS_MOVED_STATUS :
+                $return = 'Recipient Address Not Found';
+                break;
+            case self::BAD_DESTINATION_SYSTEM_ADDRESS_STATUS :
+            case self::UNABLE_TO_ROUTE_STATUS :
+                $return = 'Domain Not Found';
+                break;
+            case self::MAILBOX_FULL_STATUS :
+                $return = 'Mailbox Full';
+                break;
+            default:
+                $return = 'Unknown Status';
+                Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__
+                    . ' We got an untreated status Value: ' . $statusValue);
+                break;
+        }
+
+        return $return;
+    }
+
+    /**
+     * Parse dsn Messages
+     */
+    public function parse()
+    {
+        // Break per message and per recipient fields
+        $out = preg_split('/(?<=\x0A)\x0D\x0A/', $this->_dsnBody);
+
+        // Removing per message attributes
+        array_shift($out); // TODO: form a header with per message attributes
+        $errors = array();
+
+        $this->_recipients = array();
+        foreach ($out as $perRecipients) {
+            $recipient = array();
+
+            //Final-Recipient (Required)
+            preg_match('/Final-Recipient:\s*[[:alnum:]-_]+;\s*(.+?)\x0D\x0A/', $perRecipients, $matches);
+            if (empty($matches) || count($matches) != 2) {
+                $errors[] = 'Error Parsing per Message Block: Final-Recipient Field';
+            }
+            $finalRecipient = $matches[1];
+            $recipient['finalRecipient'] = $finalRecipient;
+            unset($matches);
+
+            // Status (Required)
+            $classSelector = self::CLASS_SUCCESS_STATUS . self::CLASS_TRANSIENT_STATUS
+                . self::CLASS_PERMANENT_STATUS;
+            preg_match("/Status:\s*([$classSelector])\.(\d{1,3})\.(\d{1,3})\x0D\x0A/",
+                $this->_dsnBody, $matches);
+            if (empty($matches) || count($matches) != 4) {
+                $errors[] = 'Error Parsing per Message Block: Status Field';
+            } else {
+                list(,$statusClass, $statusSubject, $statusDetail) = $matches;
+                $statusValue = $statusSubject . '.' . $statusDetail;
+                $recipient['status'] = array(
+                    'class' => $statusClass,
+                    'value' => $statusValue,
+                    'msg'   => $this->_getStatusMessage($statusValue),
+                );
+            }
+            unset($matches);
+
+            //Original-Recipient (Optional)
+            preg_match('/Original-Recipient:\s*[[:alnum:]-_]+;\s*(.+?)\x0D\x0A/',
+                $perRecipients, $matches);
+            if (empty($matches) || count($matches) != 2) {
+                Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__
+                    . ' Wrong Delivery Notification Part: Original-Recipient Field not Found');
+            }
+            $recipient['originalRecipient'] = $matches[1];
+
+            $this->_recipients[] = $recipient;
+        }
+
+        if (!empty($errors)) {
+            Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__
+                . ' Errors parsing Delivery Notification Status Message: ' . print_r($errors, true));
+        }
+        $this->_parsed = TRUE;
+    }
+
+    /**
+     * Get the user friendly html formatted body
+     *
+     * @return string user friendly html formatted body
+     */
+    public function getHTMLFormatted()
+    {
+        if (!$this->_parsed) {
+            $this->parse();
+        }
+
+        $translate = Tinebase_Translation::getTranslation('Expressomail');
+        $html = '<html>'
+                    . '<head>'
+                        . '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
+                        . '<style type="text/css">'
+                            . '.expressomail-body-blockquote {'
+                                    . 'margin: 5px 10px 0 3px;'
+                                    . 'padding-left: 10px;'
+                                    . 'border-left: 2px solid #000088;'
+                            . '}'
+                        . '</style>'
+                    . '</head>'
+                    . '<body>';
+
+        // Body Content
+        $html .= '<h3>' . $translate->_('Delivery Status Notification Message') . '</h3>';
+        $html .= '<br /><br />';
+
+        // Per Recipient Notification Status
+        foreach ($this->_recipients as $finalRecipient => $recipient) {
+            // Recipient Address
+            $html .= '<b>' . $translate->_('Recipient') . ':</b> ';
+            $html .= isset($recipient['originalRecipient']) ? $recipient['originalRecipient']
+                        : $finalRecipient;
+            $html .= '<br />';
+
+            // Delivery Status Notification Class
+            $html .= '<b>' . $translate->_('Type') . ':</b> ';
+            switch ($recipient['status']['class']) {
+                case self::CLASS_TRANSIENT_STATUS :
+                    $html .= $translate->_('Persistent Transient Failure');
+                    break;
+                case self::CLASS_PERMANENT_STATUS :
+                    $html .= $translate->_('Permanent Failure');
+                    break;
+                case self::CLASS_SUCCESS_STATUS :
+                    $html .= $translate->_('Successful Delivery');
+                    break;
+                default :
+                    break;
+            }
+            $html .= '<br />';
+
+            // Failure Message (Cause)
+            $html .= '<b>' . $translate->_('Cause') . ':</b> ';
+            $html .= $translate->_($recipient['status']['msg']);
+            $html .= '<br /><br />';
+        }
+
+        $html .= '</body></html>';
+        return $html;
+    }
+}
index c9f9f62..7398552 100644 (file)
@@ -75,6 +75,11 @@ class Expressomail_Model_Message extends Tinebase_Record_Abstract implements Tin
     const CONTENT_TYPE_MULTIPART_REPORT = 'multipart/report';
 
     /**
+     * content type message/delivery-status
+     */
+    const CONTENT_TYPE_MESSAGE_DELIVERYSTATUS = 'message/delivery-status';
+
+    /**
      * content type text/calendar
      */
     const CONTENT_TYPE_CALENDAR = 'text/calendar';
@@ -292,6 +297,16 @@ class Expressomail_Model_Message extends Tinebase_Record_Abstract implements Tin
     }
 
     /**
+     * check if message has \DRAFT flag
+     *
+     * @return boolean
+     */
+    public function hasDraftFlag()
+    {
+        return (is_array($this->flags) && in_array(Zend_Mail_Storage::FLAG_DRAFT, $this->flags));
+    }
+
+    /**
      * Send the reading confirmation in a message who has the correct header and is not seen yet
      *
      * @return void
@@ -302,7 +317,12 @@ class Expressomail_Model_Message extends Tinebase_Record_Abstract implements Tin
             $this->headers = Expressomail_Controller_Message::getInstance()->getMessageHeaders($this->getId(), NULL, TRUE);
         }
 
-        if (array_key_exists('disposition-notification-to', $this->headers) && $this->headers['disposition-notification-to'] && !$this->hasSeenFlag() && !$this->hasReadFlag() ) {
+        if (array_key_exists('disposition-notification-to', $this->headers)
+            && $this->headers['disposition-notification-to']
+            && !$this->hasSeenFlag() 
+            && !$this->hasReadFlag() 
+            && !$this->hasDraftFlag()
+        ) {
             $translate = Tinebase_Translation::getTranslation($this->_application);
             $from = Expressomail_Controller_Account::getInstance()->get($this->account_id);
 
@@ -683,11 +703,13 @@ class Expressomail_Model_Message extends Tinebase_Record_Abstract implements Tin
                 // found the alternative body part
                 $result[$foundParts[$alternativeType]] = $_structure['parts'][$foundParts[$alternativeType]];
             }
-            // If related get message/rfc822 part
-            if ($_structure['subType'] == 'report' &&
-                    array_key_exists(self::CONTENT_TYPE_MESSAGE_RFC822, $foundParts)){
+            // Add CONTENT_TYPE_MESSAGE_RFC822 and CONTENT_TYPE_MESSAGE_DELIVERYSTATUS
+            // parts if Content-Type == message/report
+            if ($_structure['subType'] == 'report') {
                 $result[$foundParts[self::CONTENT_TYPE_MESSAGE_RFC822]] =
-                        $_structure['parts'][$foundParts[self::CONTENT_TYPE_MESSAGE_RFC822]];
+                    $_structure['parts'][$foundParts[self::CONTENT_TYPE_MESSAGE_RFC822]];
+                $result[$foundParts[self::CONTENT_TYPE_MESSAGE_DELIVERYSTATUS]] =
+                    $_structure['parts'][$foundParts[self::CONTENT_TYPE_MESSAGE_DELIVERYSTATUS]];
             }
 
         } else {
index f3374da..2140207 100644 (file)
@@ -343,7 +343,7 @@ class Expressomail_Protocol_Imap extends Zend_Mail_Protocol_Imap
                     }
             }
         }
-
+        sleep(3);
         return true;
 
     }
@@ -569,6 +569,10 @@ class Expressomail_Protocol_Imap extends Zend_Mail_Protocol_Imap
     protected function _useUidAsLogin()
     {
         $imapConfig = Tinebase_Config::getInstance()->get(Tinebase_Config::IMAP, new Tinebase_Config_Struct())->toArray();
-        return $imapConfig['useEmailAsLoginName'] === '1'?FALSE:TRUE;
+        if (isset($imapConfig['useEmailAsLoginName'])){
+            return $imapConfig['useEmailAsLoginName'] === '1' ? FALSE : TRUE;
+        } else {
+            return TRUE;
+        }
     }
 }
index d3ae3bc..0b0dbef 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * Tine 2.0
  *
- * @package     Felamimail
+ * @package     Expressomail
  * @subpackage  Record
  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
  * @author      Mario Cesar Kolling <mario.kolling@serpro.gov.br>
index 2acb021..0606e9b 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * Tine 2.0
  *
- * @package     Felamimail
+ * @package     Expressomail
  * @subpackage  Record
  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
  * @author      Mario Cesar Kolling <mario.kolling@serpro.gov.br>
index 41f7eb7..78c1cd0 100644 (file)
@@ -115,6 +115,9 @@ class Expressomail_Setup_Initialize extends Setup_Initialize
         $property_autoSaveDraftsInterval = $properties[Expressomail_Config::AUTOSAVEDRAFTSINTERVAL];
         $default_value_autoSaveDraftsInterval = $property_autoSaveDraftsInterval['default'];
         $config[Expressomail_Config::AUTOSAVEDRAFTSINTERVAL] = $default_value_autoSaveDraftsInterval;
+        $property_reportPhishingEmail = $properties[Expressomail_Config::REPORTPHISHINGEMAIL];
+        $default_value_reportPhishingEmail = $property_reportPhishingEmail['default'];
+        $config[Expressomail_Config::REPORTPHISHINGEMAIL] = $default_value_reportPhishingEmail;
        Expressomail_Controller::getInstance()->saveConfigSettings($config);
     }
 
index 7ea58a6..7eea6e6 100644 (file)
@@ -44,7 +44,7 @@ class Expressomail_Setup_Update_Release0 extends Setup_Update_Abstract
     /**
      * update to 0.3
      *
-     * change index name conflicting with Felamimail
+     * change index name conflicting with Expressomail
      */
     public function update_2()
     {
@@ -94,4 +94,28 @@ class Expressomail_Setup_Update_Release0 extends Setup_Update_Abstract
 
         $this->setApplicationVersion('Expressomail', '0.4');
     }
+
+    /**
+     * update to 0.5
+     * add Expressomail config parameter AUTOSAVEDRAFTSINTERVAL
+     *
+     * @return void
+     */
+    public function update_4()
+    {
+        $settings = Expressomail_Config::getInstance()->get(Expressomail_Config::EXPRESSOMAIL_SETTINGS);
+        if (! array_key_exists(Expressomail_Config::REPORTPHISHINGEMAIL, $settings)) {
+            try {
+                $properties = Expressomail_Config::getProperties();
+                $property = $properties[Expressomail_Config::REPORTPHISHINGEMAIL];
+                $default_value = $property['default'];
+                $settings[Expressomail_Config::REPORTPHISHINGEMAIL] = $default_value;
+                Expressomail_Controller::getInstance()->saveConfigSettings($settings);
+            } catch (Tinebase_Exception_NotFound $tenf) {
+                // do nothing
+            }
+        }
+
+        $this->setApplicationVersion('Expressomail', '0.5');
+    }
 }
\ No newline at end of file
index c89dcaa..ceda44e 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <application>
     <name>Expressomail</name>
-    <version>0.4</version>
+    <version>0.5</version>
     <order>50</order>
     <status>enabled</status>
     <tables>
index d87fbcc..3f7c0ff 100644 (file)
     margin-left: 20px;
 }
 
+.preview-panel-expressomail-body blockquote {
+    margin: 5px 10px 0 3px !important;
+    padding-left: 10px !important;
+}
 
 /* note: htmlarea has textarea as its basis, so when we support text composing
          this need to be restructured e.g. by having a expressomail-message-body-text cls
@@ -674,3 +678,17 @@ a.x-menu-fontsize-noicon span {
 .x-grid-outdated-row * {
     text-decoration: line-through;
 }
+.action_reportPhishing {
+    background-image: url(/images/oxygen/16x16/actions/dialog-warning.png);
+}
+ul.mail-phishing-subjects-list {
+    padding: 10px 0;
+}
+li.mail-phishing-subject-item {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    max-width: 440px;
+    white-space: nowrap;
+    list-style-type: disc;
+    list-style-position: inside;
+}
index 5635f9d..493fb4f 100644 (file)
@@ -59,6 +59,14 @@ Tine.Expressomail.AdminPanel = Ext.extend(Tine.widgets.dialog.AdminPanel, {
                 minValue: 0,
                 maxValue: 9999,
                 allowBlank: false
+            },
+            {
+                name: 'reportPhishingEmail',
+                fieldLabel: this.app.i18n._('Email to which to report phishing'),
+                xtype: 'textfield',
+                value: null,
+                maxLength: 64,
+                allowBlank: true
             }
         ]];
     }
index 01ac475..1a3c9f7 100644 (file)
@@ -153,14 +153,7 @@ Tine.Expressomail.Application = Ext.extend(Tine.Tinebase.Application, {
                 foreignAppName: 'Addressbook',
                 recordTypeName: 'List'
             });
-            var crmHook = new Tine.Expressomail.GridPanelHook({
-                app: this,
-                foreignAppName: 'Crm',
-                contactInRelation: true,
-                recordTypeName: 'Lead',
-                relationType: 'CUSTOMER'
-            });
-            
+
             this.mailStore = Tine.Expressomail.getMailStore();
             this.mailStore.load();
         }
index ef83ab7..e526a44 100644 (file)
@@ -67,6 +67,8 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
     
     fetchtry: 0,
 
+    saveOnDestroy: {},
+
     /**
      * @private grid cfg
      */
@@ -136,6 +138,8 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
         this.app.getFolderStore().on('update', this.onUpdateFolderStore, this);
 
         this.initPagingToolbar();
+
+        this.saveOnDestroy = {};
     },
     
     /**
@@ -478,6 +482,15 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
                 ]
             }
         });
+        this.action_reportPhishing = new Ext.Action({
+            requiredGrant: 'readGrant',
+            text: this.app.i18n._('Report phishing'),
+            handler: this.onReportPhishing,
+            iconCls: 'action_reportPhishing',
+            allowMultiple: true,
+            disabled: true,
+            scope: this
+        });
         this.actionUpdater.addActions([
 //            this.action_write,
             this.action_deleteRecord,
@@ -488,7 +501,8 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
             this.action_markUnread,
             this.action_addAccount,
             this.action_print,
-            this.action_printPreview
+            this.action_printPreview,
+            this.action_reportPhishing
         ]);
 
         if (Tine.Expressomail.registry.get('preferences').get('enableEncryptedMessage') == '1'
@@ -532,6 +546,11 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
             ];
         }
 
+        if (Tine.Expressomail.registry.get("reportPhishingEmail") && Tine.Expressomail.registry.get("reportPhishingEmail") != '') {
+            // just show this menu item if report phishing email is configured
+            menu_items.push(this.action_reportPhishing);
+        }
+
         this.contextMenu = new Ext.menu.Menu({
             items: menu_items
         });
@@ -539,6 +558,90 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
     },
 
     /**
+     * delete messages handler
+     *
+     * @return {void}
+     */
+    onReportPhishing: function() {
+        var email = Tine.Expressomail.registry.get("reportPhishingEmail");
+        var subjects = [];
+        var msgs = this.selectionModel.getSelections();
+        var msgsIds = [];
+        Ext.each(msgs, function(item) {
+            subjects.push(item.get('subject'));
+            msgsIds.push(item.id);
+        });
+        var title = this.app.i18n._('Report phishing');
+        var text_init = this.app.i18n._("Phishing are messages with the intention of getting personal data like:<br/>passwords, finantial data like credit card numbers and so on.");
+        var text_end = this.app.i18n._("Report listed messages as phishing?");
+        var text = text_init
+                 + "<ul class='mail-phishing-subjects-list'>"
+                 + "<li class='mail-phishing-subject-item'>"
+                 + subjects.join("</li><li class='mail-phishing-subject-item'>")
+                 + "</li>"
+                 + "</ul>"
+                 + text_end;
+
+        Ext.MessageBox.confirm(title, text, function(btn) {
+            Ext.MessageBox.updateText(""); // this is a workaround to the MessageBox width issue in Chrome
+            if(btn === 'yes') {
+                this.reportPhishingMask = new Ext.LoadMask(Ext.getBody(), {msg: this.app.i18n._('Sending phishing report...')});
+                this.reportPhishingMask.show();
+                var account = this.app.getActiveAccount(),
+                    accountId = account ? account.id : null;
+                var message = new Tine.Expressomail.Model.Message(Tine.Expressomail.Model.Message.getDefaultData());
+                message.set('account_id', accountId);
+                message.set('to', [email]);
+                message.set('cc', []);
+                message.set('bcc', []);
+                var subject_string = 'Phishing - {0} message',
+                    subject_string_plural = 'Phishing - {0} messages',
+                    subject = String.format(this.app.i18n.ngettext(subject_string, subject_string_plural, subjects.length), subjects.length);
+                message.set('subject', subject);
+                var body_string = "At {0}, user {1} reported attached message as phishing:",
+                    body_string_plural = "At {0}, user {1} reported attached messages as phishing:";
+                // the first param of the translated string is not replaced in js, the php will replace it with server datetime
+                var body = String.format(this.app.i18n.ngettext(body_string, body_string_plural, subjects.length), "{0}", account.get('from'));
+                message.set("body",
+                            "<p>" + body + "</p>"
+                          + "<ul class='mail-phishing-subjects-list'>"
+                          + "<li class='mail-phishing-subject-item'>"
+                          + subjects.join("</li><li class='mail-phishing-subject-item'>")
+                          + "</li>"
+                          + "</ul>");
+                Tine.Expressomail.messageBackend.reportPhishing(message, msgsIds, {
+                    scope: this,
+                    success: function(record){
+                        var account = this.app.getActiveAccount(),
+                            trashId = (account) ? account.getTrashFolderId() : null,
+                            trash = trashId ? this.app.getFolderStore().getById(trashId) : null,
+                            trashConfigured = (account.get('trash_folder'));
+
+                        if ( (Tine.Expressomail.registry.get('preferences').get('confirmUseTrash') == '1' && trash && ! trash.isCurrentSelection())
+                           || (! trash && trashConfigured) ) {
+                            this.moveSelectedMessages(trash, true);
+                        } else {
+                            this.deleteSelectedMessages();
+                        }
+                        this.reportPhishingMask.hide();
+                    },
+                    failure: function(record){
+                        Ext.MessageBox.show({
+                            title: this.app.i18n._('Failed to send phishing report!'),
+                            msg: this.app.i18n._('Your phishing report could not be send.'),
+                            buttons: Ext.MessageBox.OK,
+                            icon: Ext.MessageBox.WARNING
+                        });
+                        this.reportPhishingMask.hide();
+                    },
+                    timeout: 300000 // 5 minutes
+                });
+            }
+        }, this);
+
+    },
+
+    /**
      * initialises filter toolbar
      *
      * @private
@@ -1442,10 +1545,10 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
                 mailStoreData: Tine.Expressomail.getMailStoreData(Tine.Expressomail.getMailStore()),
                 replyTo : Ext.encode(msg.data),
                 replyToAll: toAll,
-                listeners: [
-                    {update: this.onAfterCompose.createDelegate(this, ['reply', [msg]], 1)},
-                    {addcontact: this.onEditClose.createDelegate(this)}
-                ]
+                listeners: {
+                    update: this.onAfterCompose.createDelegate(this, ['reply', [msg]], 1),
+                    addcontact: this.onEditClose.createDelegate(this)
+                }
             });
         }
         this.getLoadMask().hide();
@@ -1587,20 +1690,22 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
     onMessageEditWindowDestroy: function() {
         this.saveDraftsInterval = 0; // prevent more save draft calls
         this.unloading = true;
+        var grid = this.window.ref.getMainScreen().getCenterPanel();
         if (!this.saving) { // just check and save draft if it is not already doing it
             if (this.autoSaveDraftsEnabled) {
                 this.checkDraftChanges();
             }
             else {
-                this.checkDraftChanges();
-                this.window.ref.getMainScreen().getCenterPanel().confirmSaveDraft();
+                if (this.checkDraftChanges(grid.saveOnDestroy.forced)) {
+                    grid.confirmSaveDraft();
+                }
             }
         }
     },
 
     confirmSaveDraft: function() {
         this.saveOnDestroy.confirm = true;
-        Ext.MessageBox.confirm('', this.app.i18n._('Save as a draft?'),
+        Ext.MessageBox.confirm('', this.app.i18n._('Keep as a draft?'),
             function(btn) {
                 if(btn === 'yes') {
                     if (this.isDraftFolderSelected && this.saveOnDestroy.record) {
@@ -1633,15 +1738,17 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
      * @param {Tine.Tinebase.data.Record} record
      * @param {String} folderName
      * @param {Tine.Expressomail.MessageEditDialog} editwindow
+     * @param {Boolean} forced
      */
-    callSaveDraft: function(record, folderName, editwindow) {
+    callSaveDraft: function(record, folderName, editwindow, forced) {
         // this is in GridPanel instead of MessageEditWindow
         // because of 'Browser' style window related issues in IE
         this.saveOnDestroy = {
             confirm: false, // true if confirmSaveDraft is in progress
             started: false, // true if either confirmSaveDraft or onSaveDraftSuccess are completed
             save: false, // true if user selected YES on confirmSaveDraft
-            error: false, // true if onSaveDraftFailure has been called
+            error: false, // true if onSaveDraftFailure has been called,
+            forced: forced || false, // true if draft saving was called by clicking 'Save Draft' button
             record: null // message record
         };
         if (editwindow.isDraftFolderSelected) {
@@ -1666,8 +1773,14 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
      * @param {Tine.Expressomail.MessageEditDialog} editwindow
      */
     onSaveDraftSuccess: function(record, editwindow) {
+        var unloading;
+        try { // because editwindow could be closed yet
+            unloading = editwindow.unloading;
+        } catch (e) { // editwindow already closed, unloading must be true
+            unloading = true;
+        }
         if (this.isDraftFolderSelected) {
-            if (this.autoSaveDraftsEnabled || this.saveOnDestroy.save) {
+            if (this.autoSaveDraftsEnabled || this.saveOnDestroy.save || (this.saveOnDestroy.forced && !unloading)) {
                 this.updateGridPanel(record);
             }
             else {
@@ -1684,14 +1797,12 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
         }
         try { // because editwindow could be closed yet
             editwindow.record.commit(true);
-            editwindow.record.set('original_id', record.get('original_id'));
-            editwindow.record.set('draft_id', editwindow.record.get('original_id'));
+            editwindow.record.set('draft_id', record.get('original_id'));
             editwindow.setMessageOnTitle(editwindow.notifyClear);
             editwindow.setSaveDraftsDelayedTask();
             editwindow.saving = false;
         }
-        catch (e) {
-        }
+        catch (e) { } // editwindow already closed, ignore and go on
     },
 
     /**
@@ -1712,8 +1823,7 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
             editwindow.setSaveDraftsDelayedTask();
             editwindow.saving = false;
         }
-        catch (e) {
-        }
+        catch (e) { } // editwindow already closed, ignore and go on
     },
 
     showSaveDraftErrorMessage: function() {
@@ -1741,6 +1851,10 @@ Tine.Expressomail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
                     this.movingOrDeleting = false;
                 }
             });
+            if (this.saveOnDestroy.forced) {
+                // draft in grid is outdated
+                id = record.get('draft_id');
+            }
             var msg = this.getStore().getById(id);
             this.getStore().remove(msg);
         }
index 76211e8..1673509 100644 (file)
@@ -141,6 +141,19 @@ Tine.Expressomail.ImportEmlDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
         }, this);
     },
             
+    /**
+     * executed after record got updated from proxy
+     */
+    onRecordLoad: function() {
+        // interrupt process flow until dialog is rendered
+        if (! this.rendered) {
+            this.onRecordLoad.defer(250, this);
+            return;
+        }
+
+        this.window.setTitle(this.app.i18n._('Import msg(eml)'));
+    },
+
     getFormItems: function() {
 
         this.southPanel = new Ext.Panel({
index 59a8e4c..2b14717 100644 (file)
@@ -259,6 +259,7 @@ Tine.Expressomail.MessageDisplayDialog = Ext.extend(Tine.Expressomail.GridDetail
      */
     onAfterCompose: function(composedMsg, action, affectedMsgs) {
         this.fireEvent('update', composedMsg, action, affectedMsgs);
+        this.app.mainScreen.GridPanel.onAfterCompose(composedMsg, action, affectedMsgs);
     },
 
     /**
index ded57c7..60ef718 100644 (file)
@@ -128,6 +128,11 @@ Tine.Expressomail.MessageEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog,
      * @type Boolean
      */
     sending: false,
+    /**
+     * dialog is currently checking email size
+     * @type Boolean
+     */
+    checking: false,
     
     /**
      * @private
@@ -189,18 +194,24 @@ Tine.Expressomail.MessageEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog,
                 this.on('removed', this.window.ref.getMainScreen().getCenterPanel().onMessageEditWindowDestroy, this);
             }
         }
-        if (Tine.Expressomail.registry.get("autoSaveDraftsInterval")) {
-            // autosave is enabled (interval>0)
-            this.saveDraftsInterval = Tine.Expressomail.registry.get("autoSaveDraftsInterval") * 1000; // convert s to ms
-            this.autoSaveDraftsEnabled = true;
-            this.window.ref.getMainScreen().getCenterPanel().autoSaveDraftsEnabled = true;
-            this.saveDraftsIntervaledTask = new Ext.util.DelayedTask(this.checkDraftChanges, this);
-            this.setSaveDraftsDelayedTask();
-        } else {
-            // autosave is enabled (interval=0)
-            this.saveDraftsInterval = 0;
+        //Disable autosave for encrypted messages
+        if(this.encrypted){
             this.autoSaveDraftsEnabled = false;
         }
+        else{
+            if (Tine.Expressomail.registry.get("autoSaveDraftsInterval")) {
+                // autosave is enabled (interval>0)
+                this.saveDraftsInterval = Tine.Expressomail.registry.get("autoSaveDraftsInterval") * 1000; // convert s to ms
+                this.autoSaveDraftsEnabled = true;
+                this.window.ref.getMainScreen().getCenterPanel().autoSaveDraftsEnabled = true;
+                this.saveDraftsIntervaledTask = new Ext.util.DelayedTask(this.checkDraftChanges, this);
+                this.setSaveDraftsDelayedTask();
+            } else {
+                // autosave is enabled (interval=0)
+                this.saveDraftsInterval = 0;
+                this.autoSaveDraftsEnabled = false;
+            }
+        }
     },
 
     /**
@@ -290,10 +301,11 @@ Tine.Expressomail.MessageEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog,
 
     /**
      * check changes to save draft in autosave
+     * @param {Boolean} forced
      *
      * @private
      */
-    checkDraftChanges: function() {
+    checkDraftChanges: function(forced) {
         if (this.autoSaveDraftsEnabled) {
             this.saveDraftsIntervaledTask.cancel();
         }
@@ -307,30 +319,38 @@ Tine.Expressomail.MessageEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog,
         var modified = this.record.modified;
         var wasModified = (modified && (modified.to!==undefined || modified.cc!==undefined || modified.cco!==undefined || modified.subject!==undefined || modified.body!==undefined || modified.attachments!==undefined));
 
-        if (!this.sending && !this.attachmentGrid.isUploading() && wasModified && (hasRecipient || hasSubject || hasContent || hasAttachment)) {
+        if (wasModified
+            && !this.sending
+            && !this.checking
+            && !this.attachmentGrid.isUploading()
+            && (hasRecipient || hasSubject || hasContent || hasAttachment)
+        ) {
             if (this.isDraftFolderSelected) {
                 this.window.ref.getMainScreen().getCenterPanel().markRowOutdated(this.record.get('draft_id'));
             }
-            this.callSaveDraft();
+            this.callSaveDraft(forced);
+            return true;
         }
         else {
             this.setSaveDraftsDelayedTask();
+            return false;
         }
     },
 
     /**
      * call save draft in gridpanel for autosave
+     * @param {Boolean} forced
      *
      * @private
      */
-    callSaveDraft: function() {
+    callSaveDraft: function(forced) {
         var account = Tine.Tinebase.appMgr.get('Expressomail').getAccountStore().getById(this.record.get('account_id')),
             folderName = account.get('drafts_folder');
         this.saving = true; // this will reset at GridPanel.callSaveDraft callbacks (success, failure)
         this.setMessageOnTitle(this.notifySaveDraftOperation);
         try {
             // draft saving must be executed in main window grid panel due to IE issues in browser window mode
-            this.window.ref.getMainScreen().getCenterPanel().callSaveDraft(this.record, folderName, this);
+            this.window.ref.getMainScreen().getCenterPanel().callSaveDraft(this.record, folderName, this, forced);
         }
         catch(e) {
             this.setMessageOnTitle(this.notifySaveDraftFailure);
@@ -480,6 +500,7 @@ Tine.Expressomail.MessageEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog,
     },
     
     checkMessageSize: function() {
+        this.checking = true;
         try {
             this.contactsCheckMask = new Ext.LoadMask(this.ownerCt.body, {msg: this.app.i18n._('Calculating message size...')});
         }
@@ -532,6 +553,7 @@ Tine.Expressomail.MessageEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog,
                     // parameter maxMessageSize is not defined in config.inc.php
                     that.contactsCheckMask.hide();
                     that.onSaveAndClose();
+                    that.checking = false;
                     return;
                 }
                 
@@ -558,11 +580,13 @@ Tine.Expressomail.MessageEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog,
                 } else {
                     that.onSaveAndClose();
                 }
+                that.checking = false;
             },
             failure: function (err, details) {
                 Ext.MessageBox.alert(that.app.i18n._('Failed'),
-                    that.app.i18n._('Message size validation step failed.'));
-                this.contactsCheckMask.hide();
+                    that.app.i18n._('Network problem.'));
+                that.contactsCheckMask.hide();
+                that.checking = false;
             }
         });
     },
@@ -571,8 +595,8 @@ Tine.Expressomail.MessageEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog,
      * onSaveAndClose
      */
     onSaveAndClose: function() {
-        this.fireEvent('saveAndClose');
         this.sending = true;
+        this.fireEvent('saveAndClose');
         //to clean temporary editor classes
         var editor_content = this.htmlEditor.getValue();
         editor_content = editor_content.replace(/editor-wysiwyg-[^'"]*/gi, "");
@@ -833,7 +857,7 @@ Tine.Expressomail.MessageEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog,
             this.record.set('flags', 'Passed');
             this.record.set('original_id', this.forwardMsgs[0].id);
         } else if (this.draftOrTemplate) {
-            this.record.set('original_id', this.draftOrTemplate.id);
+            this.record.set('draft_id', this.draftOrTemplate.id);
         }
         this.record.set('add_contacts', true);
 
@@ -1450,17 +1474,20 @@ Tine.Expressomail.MessageEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog,
                 String.format(this.app.i18n._('{0} account setting empty.'), folderField)
             );
         } else if (this.isValid()) {
-            this.loadMask.show();
-            this.recordProxy.saveInFolder(this.record, folderName, {
-                scope: this,
-                success: function(record) {
-                    this.fireEvent('update', Ext.util.JSON.encode(this.record.data));
-                    this.purgeListeners();
-                    this.loadMask.hide();
-                },
-                failure: this.onRequestFailed,
-                timeout: 150000 // 3 minutes
-            });
+            if (folderField == 'drafts_folder') {
+                this.callSaveDraft(true);
+            } else {
+                this.loadMask.show();
+                this.recordProxy.saveInFolder(this.record, folderName, {
+                    scope: this,
+                    success: function(record) {
+                        this.fireEvent('update', Ext.util.JSON.encode(this.record.data));
+                        this.loadMask.hide();
+                    },
+                    failure: this.onRequestFailed,
+                    timeout: 150000 // 3 minutes
+                });
+            }
         } else {
             Ext.MessageBox.alert(_('Errors'), _('Please fix the errors noted.'));
         }
index efcd85a..ce32b32 100644 (file)
@@ -413,6 +413,32 @@ Tine.Expressomail.messageBackend = new Tine.Tinebase.data.RecordProxy({
     },
 
     /**
+     * report message(s) as phishing
+     *
+     * @param   {Ext.data.Record} record
+     * @param  {Array} msgIds
+     * @param   {Object} options
+     * @return  {Number} Ext.Ajax transaction id
+     * @success {Ext.data.Record}
+     */
+    reportPhishing: function(record, msgIds, options)
+    {
+        var options = options || {};
+        options.params = options.params || {};
+
+        var p = options.params;
+
+        p.method = this.appName + '.reportPhishing';
+        p.recordData = record.data;
+        p.msgIds = msgIds;
+
+        // increase timeout as this can take a longer (5 minutes)
+        options.timeout = 300000;
+
+        return this.doXHTTPRequest(options);
+    },
+
+    /**
      * add given flags to given messages
      *
      * @param  {String/Array} ids
index e40e4eb..9b357b7 100644 (file)
@@ -198,7 +198,6 @@ Tine.Expressomail.setTreeContextMenus = function() {
         handler:function() {
                 if (this.ctxNode) {
                     var window = Tine.Expressomail.ImportEmlDialog.openWindow({
-                        title: String.format(_(this.ctxNode.attributes.globalname)),
                         account: this.ctxNode.attributes.account_id,
                         textName: this.ctxNode.text,
                         folderId: this.ctxNode.attributes.folder_id,
index 5c32360..1f6d559 100644 (file)
@@ -249,7 +249,9 @@ Ext.extend(Tine.Expressomail.TreePanel, Ext.tree.TreePanel, {
     onSelectionChange: function(sm, nodes) {
 
         //Ignore non-selectable node
-        if(!nodes[0].attributes.is_selectable){
+        if((typeof(nodes[0]) !== 'undefined')
+            && !nodes[0].attributes.is_selectable
+        ){
             return;
         }
         if (this.filterMode == 'gridFilter' && this.filterPlugin) {
index e7882cf..0a06328 100644 (file)
@@ -1,4 +1,4 @@
-# 
+#
 # Translators:
 # Alexander Stintzing <a.stintzing@metaways.de>, 2012.
 # Björn Balazs <transifex@lazs.de>, 2013.
@@ -11,17 +11,17 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Tine 2.0\n"
 "POT-Creation-Date: 2008-05-17 22:12+0100\n"
-"PO-Revision-Date: 2013-02-26 12:23+0000\n"
-"Last-Translator: pschuele <p.schuele@metaways.de>\n"
-"Language-Team: German (http://www.transifex.com/projects/p/tine20/language/de/)\n"
+"PO-Revision-Date: 2015-08-24 10:49-0300\n"
+"Last-Translator: Rommel Cysne <rommel.cysne@serpro.gov.br>\n"
+"Language-Team: German (http://www.transifex.com/projects/p/tine20/language/"
+"de/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: de\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Poedit-Country: GB\n"
-"X-Poedit-Language: en\n"
 "X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 1.5.4\n"
 
 #: Acl/Rights.php:106
 msgid "manage email accounts"
@@ -69,7 +69,9 @@ msgstr "Benutzerdefnierte Abwesenheitsnotiz"
 
 #: Config.php:56
 msgid "User is allowed to set custom vacation message for system account"
-msgstr "Der Benutzer darf eine benutzerdefinierte Abwesenheitsnotiz für das Systemkonto einstellen"
+msgstr ""
+"Der Benutzer darf eine benutzerdefinierte Abwesenheitsnotiz für das "
+"Systemkonto einstellen"
 
 #: Config.php:65
 msgid "Cache email body"
@@ -79,7 +81,9 @@ msgstr "E-Mail zwischenspeichern"
 msgid ""
 "Should the email body be cached (recommended for slow IMAP server "
 "connections)"
-msgstr "Soll die E-Mail zwischengespeichert werden (empfohlen für langsame IMAP Verbindungen)"
+msgstr ""
+"Soll die E-Mail zwischengespeichert werden (empfohlen für langsame IMAP "
+"Verbindungen)"
 
 #: Setup/Initialize.php:44
 msgid "All inboxes of my email accounts"
@@ -129,7 +133,8 @@ msgstr "E-Mail Aktualisierungsintervall"
 msgid ""
 "How often should Expressomail check for new Emails (in minutes). \"0\" means "
 "never."
-msgstr "Wie oft Expressomail nach neuen E-Mails schauen soll. \"0\" heisst nie."
+msgstr ""
+"Wie oft Expressomail nach neuen E-Mails schauen soll. \"0\" heisst nie."
 
 #: Preference.php:114
 msgid "Use in Addressbook"
@@ -145,7 +150,9 @@ msgstr "E-Mail-Notiz erzeugen"
 
 #: Preference.php:119
 msgid "Save Note default Value."
-msgstr "Es wird standardmäßig eine E-Mail-Notiz beim versenden einer Nachricht erzeugt."
+msgstr ""
+"Es wird standardmäßig eine E-Mail-Notiz beim versenden einer Nachricht "
+"erzeugt."
 
 #: Preference.php:122
 msgid "Confirm Delete"
@@ -287,13 +294,17 @@ msgstr "Zugangsdaten für Empfangsserver (IMAP) falsch"
 
 #: js/Expressomail.js:820
 msgid "Your email credentials are wrong. Please contact your administrator"
-msgstr "Ihre E-Mail-Zugangsdaten sind falsch. Bitte kontaktieren Sie Ihren Administrator."
+msgstr ""
+"Ihre E-Mail-Zugangsdaten sind falsch. Bitte kontaktieren Sie Ihren "
+"Administrator."
 
 #: js/Expressomail.js:836
 msgid ""
 "One of your folders was deleted or renamed by another client. Please update "
 "the folder list of this account."
-msgstr "Einer Ihrer Ordner wurde von einem anderen Client gelöscht oder umbenannt.  Bitte aktualisieren Sie die Ordnerliste."
+msgstr ""
+"Einer Ihrer Ordner wurde von einem anderen Client gelöscht oder umbenannt.  "
+"Bitte aktualisieren Sie die Ordnerliste."
 
 #: js/Expressomail.js:865
 msgid "SMTP Error"
@@ -403,9 +414,10 @@ msgstr "E-Mailnotiz anlegen"
 
 #: js/MessageEditDialog.js:184
 msgid ""
-"Activate this toggle button to save the email text as a note attached to the"
-" recipient(s) contact(s)."
-msgstr "Diesen Knopf aktivieren um die E-Mail als Notiz bei dem Empfänger anzuhängen."
+"Activate this toggle button to save the email text as a note attached to the "
+"recipient(s) contact(s)."
+msgstr ""
+"Diesen Knopf aktivieren um die E-Mail als Notiz bei dem Empfänger anzuhängen."
 
 #: js/MessageEditDialog.js:188
 msgid "Reading Confirmation"
@@ -417,7 +429,9 @@ msgstr "Aktivieren Sie diesen Knopf um eine Lesebestätigung zu erhalten."
 
 #: js/MessageEditDialog.js:214
 msgid "Click to search for and add recipients from the Addressbook."
-msgstr "Klicken um Empfänger im Adressbuch zu suchen und zur Empfängerliste hinzuzufügen."
+msgstr ""
+"Klicken um Empfänger im Adressbuch zu suchen und zur Empfängerliste "
+"hinzuzufügen."
 
 #: js/MessageEditDialog.js:349
 msgid "On {0}, {1} wrote"
index d07217f..d349938 100644 (file)
@@ -3,19 +3,17 @@ msgstr ""
 "Project-Id-Version: Tine 2.0 - Expressomail\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2008-05-17 22:12+0100\n"
-"PO-Revision-Date: 2013-11-06 16:35-0300\n"
-"Last-Translator: Lucas Alberto Souza Santos <lucas-alberto.santos@serpro.gov.br>\n"
+"PO-Revision-Date: 2015-08-24 10:49-0300\n"
+"Last-Translator: Rommel Cysne <rommel.cysne@serpro.gov.br>\n"
 "Language-Team: Tine 2.0 Translators\n"
-"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Launchpad-Export-Date: 2012-03-02 09:32+0000\n"
-"X-Generator: Launchpad (build 14886)\n"
-"X-Poedit-Country: GB\n"
-"X-Poedit-Language: en\n"
-"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 1.5.4\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"Language: en\n"
 
 #: Acl/Rights.php:106
 msgid "manage email accounts"
@@ -33,8 +31,7 @@ msgstr "Add email accounts"
 msgid "Create new email accounts"
 msgstr "Create new email accounts"
 
-#: Controller/Message/Flags.php:24
-#: js/GridPanel.js:577
+#: Controller/Message/Flags.php:24 js/GridPanel.js:577
 msgid "Answered"
 msgstr "Answered"
 
@@ -54,17 +51,13 @@ msgstr "Draft"
 msgid "Flagged"
 msgstr "Flagged"
 
-#: Controller/Message/Send.php:236
-#: js/GridDetailsPanel.js:233
-#: js/GridPanel.js:482
-#: js/MessageEditDialog.js:921
-#: js/Model.js:141
+#: Controller/Message/Send.php:236 js/GridDetailsPanel.js:233
+#: js/GridPanel.js:482 js/MessageEditDialog.js:921 js/Model.js:141
 #: js/sieve/RuleConditionsPanel.js:72
 msgid "Subject"
 msgstr "Subject"
 
-#: Controller/Message/Send.php:236
-#: js/MessageEditDialog.js:896
+#: Controller/Message/Send.php:236 js/MessageEditDialog.js:896
 msgid "Body"
 msgstr "Body"
 
@@ -76,8 +69,7 @@ msgstr "Out of Office reply from %1$s"
 msgid "Signature"
 msgstr "Signature"
 
-#: js/AccountEditDialog.js:111
-#: js/Model.js:350
+#: js/AccountEditDialog.js:111 js/Model.js:350
 msgid "Account"
 msgid_plural "Accounts"
 msgstr[0] "Account"
@@ -115,8 +107,7 @@ msgstr "Below the quote"
 msgid "IMAP"
 msgstr "IMAP"
 
-#: js/AccountEditDialog.js:158
-#: js/AccountEditDialog.js:201
+#: js/AccountEditDialog.js:158 js/AccountEditDialog.js:201
 #: js/AccountEditDialog.js:256
 msgid "Host"
 msgstr "Host"
@@ -125,28 +116,23 @@ msgstr "Host"
 msgid "Port (Default: 143 / SSL: 993)"
 msgstr "Port (Default: 143 / SSL: 993)"
 
-#: js/AccountEditDialog.js:168
-#: js/AccountEditDialog.js:210
+#: js/AccountEditDialog.js:168 js/AccountEditDialog.js:210
 #: js/AccountEditDialog.js:265
 msgid "Secure Connection"
 msgstr "Secure Connection"
 
-#: js/AccountEditDialog.js:179
-#: js/AccountEditDialog.js:220
-#: js/AccountEditDialog.js:235
-#: js/AccountEditDialog.js:275
+#: js/AccountEditDialog.js:179 js/AccountEditDialog.js:220
+#: js/AccountEditDialog.js:235 js/AccountEditDialog.js:275
 #: js/ContactGrid.js:110
 msgid "None"
 msgstr "None"
 
-#: js/AccountEditDialog.js:180
-#: js/AccountEditDialog.js:221
+#: js/AccountEditDialog.js:180 js/AccountEditDialog.js:221
 #: js/AccountEditDialog.js:276
 msgid "TLS"
 msgstr "TLS"
 
-#: js/AccountEditDialog.js:181
-#: js/AccountEditDialog.js:222
+#: js/AccountEditDialog.js:181 js/AccountEditDialog.js:222
 msgid "SSL"
 msgstr "SSL"
 
@@ -250,8 +236,7 @@ msgstr "Add as \"Bcc\""
 msgid "Remove from recipients"
 msgstr "Remove from recipients"
 
-#: js/ContactGrid.js:341
-#: js/MessageEditDialog.js:505
+#: js/ContactGrid.js:341 js/MessageEditDialog.js:505
 msgid "Loading Mail Addresses"
 msgstr "Loading Mail Addresses"
 
@@ -287,8 +272,7 @@ msgstr "IMAP Credentials for {0}"
 msgid "Credentials"
 msgstr "Credentials"
 
-#: js/Expressomail.js:784
-#: js/Expressomail.js:817
+#: js/Expressomail.js:784 js/Expressomail.js:817
 msgid "IMAP Error"
 msgstr "IMAP Error"
 
@@ -305,8 +289,12 @@ msgid "Your email credentials are wrong. Please contact your administrator"
 msgstr "Your email credentials are wrong. Please contact your administrator"
 
 #: js/Expressomail.js:818
-msgid "One of your folders was deleted or renamed by another client. Please update the folder list of this account."
-msgstr "One of your folders was deleted or renamed by another client. Please update the folder list of this account."
+msgid ""
+"One of your folders was deleted or renamed by another client. Please update "
+"the folder list of this account."
+msgstr ""
+"One of your folders was deleted or renamed by another client. Please update "
+"the folder list of this account."
 
 #: js/Expressomail.js:847
 msgid "SMTP Error"
@@ -332,14 +320,9 @@ msgstr "Save Sieve Script Error"
 msgid "Could not save script on Sieve server."
 msgstr "Could not save script on Sieve server."
 
-#: js/FolderFilterModel.js:30
-#: js/GridPanel.js:529
-#: js/Model.js:53
-#: js/Model.js:496
-#: js/TreeContextMenu.js:45
-#: js/TreeContextMenu.js:100
-#: js/TreeContextMenu.js:103
-#: js/TreeContextMenu.js:106
+#: js/FolderFilterModel.js:30 js/GridPanel.js:529 js/Model.js:53
+#: js/Model.js:496 js/TreeContextMenu.js:45 js/TreeContextMenu.js:100
+#: js/TreeContextMenu.js:103 js/TreeContextMenu.js:106
 msgid "Folder"
 msgid_plural "Folders"
 msgstr[0] "Folder"
@@ -361,8 +344,7 @@ msgstr "Folders of account {0}"
 msgid "Folders of all accounts"
 msgstr "Folders of all accounts"
 
-#: js/GridDetailsPanel.js:234
-#: js/MessageEditDialog.js:827
+#: js/GridDetailsPanel.js:234 js/MessageEditDialog.js:827
 msgid "From"
 msgstr "From"
 
@@ -378,14 +360,11 @@ msgstr "Add contact to addressbook"
 msgid "Date"
 msgstr "Date"
 
-#: js/GridDetailsPanel.js:239
-#: js/GridDetailsPanel.js:464
+#: js/GridDetailsPanel.js:239 js/GridDetailsPanel.js:464
 msgid "Show or hide header information"
 msgstr "Show or hide header information"
 
-#: js/GridDetailsPanel.js:330
-#: js/GridPanel.js:468
-#: js/MessageEditDialog.js:761
+#: js/GridDetailsPanel.js:330 js/GridPanel.js:468 js/MessageEditDialog.js:761
 msgid "Attachments"
 msgstr "Attachments"
 
@@ -401,18 +380,15 @@ msgstr "Quota usage"
 msgid "Compose"
 msgstr "Compose"
 
-#: js/GridPanel.js:250
-#: js/MessageDisplayDialog.js:47
+#: js/GridPanel.js:250 js/MessageDisplayDialog.js:47
 msgid "Reply"
 msgstr "Reply"
 
-#: js/GridPanel.js:259
-#: js/MessageDisplayDialog.js:53
+#: js/GridPanel.js:259 js/MessageDisplayDialog.js:53
 msgid "Reply To All"
 msgstr "Reply To All"
 
-#: js/GridPanel.js:268
-#: js/MessageDisplayDialog.js:59
+#: js/GridPanel.js:268 js/MessageDisplayDialog.js:59
 msgid "Forward"
 msgstr "Forward"
 
@@ -424,9 +400,7 @@ msgstr "Toggle highlighting"
 msgid "Mark read/unread"
 msgstr "Mark read/unread"
 
-#: js/GridPanel.js:295
-#: js/GridPanel.js:296
-#: js/GridPanel.js:298
+#: js/GridPanel.js:295 js/GridPanel.js:296 js/GridPanel.js:298
 #: js/MessageDisplayDialog.js:40
 msgid "Delete"
 msgstr "Delete"
@@ -435,15 +409,12 @@ msgstr "Delete"
 msgid "Add Account"
 msgstr "Add Account"
 
-#: js/GridPanel.js:314
-#: js/GridPanel.js:1275
-#: js/GridPanel.js:1291
+#: js/GridPanel.js:314 js/GridPanel.js:1275 js/GridPanel.js:1291
 #: js/MessageDisplayDialog.js:78
 msgid "Print Preview"
 msgstr "Print Preview"
 
-#: js/GridPanel.js:322
-#: js/MessageDisplayDialog.js:72
+#: js/GridPanel.js:322 js/MessageDisplayDialog.js:72
 msgid "Print Message"
 msgstr "Print Message"
 
@@ -451,19 +422,15 @@ msgstr "Print Message"
 msgid "Id"
 msgstr "Id"
 
-#: js/GridPanel.js:475
-#: js/Model.js:147
+#: js/GridPanel.js:475 js/Model.js:147
 msgid "Flags"
 msgstr "Flags"
 
-#: js/GridPanel.js:488
-#: js/Model.js:142
-#: js/sieve/RuleConditionsPanel.js:69
+#: js/GridPanel.js:488 js/Model.js:142 js/sieve/RuleConditionsPanel.js:69
 msgid "From (Email)"
 msgstr "From (Email)"
 
-#: js/GridPanel.js:494
-#: js/Model.js:143
+#: js/GridPanel.js:494 js/Model.js:143
 msgid "From (Name)"
 msgstr "From (Name)"
 
@@ -471,23 +438,19 @@ msgstr "From (Name)"
 msgid "Sender"
 msgstr "Sender"
 
-#: js/GridPanel.js:507
-#: js/Model.js:144
+#: js/GridPanel.js:507 js/Model.js:144
 msgid "To"
 msgstr "To"
 
-#: js/GridPanel.js:514
-#: js/Model.js:490
+#: js/GridPanel.js:514 js/Model.js:490
 msgid "Sent"
 msgstr "Sent"
 
-#: js/GridPanel.js:522
-#: js/Model.js:150
+#: js/GridPanel.js:522 js/Model.js:150
 msgid "Received"
 msgstr "Received"
 
-#: js/GridPanel.js:537
-#: js/sieve/RuleConditionsPanel.js:73
+#: js/GridPanel.js:537 js/sieve/RuleConditionsPanel.js:73
 msgid "Size"
 msgstr "Size"
 
@@ -536,8 +499,12 @@ msgid "Save Email Note"
 msgstr "Save Email Note"
 
 #: js/MessageEditDialog.js:174
-msgid "Activate this toggle button to save the email text as a note attached to the recipient(s) contact(s)."
-msgstr "Activate this toggle button to save the email text as a note attached to the recipient(s) contact(s)."
+msgid ""
+"Activate this toggle button to save the email text as a note attached to the "
+"recipient(s) contact(s)."
+msgstr ""
+"Activate this toggle button to save the email text as a note attached to the "
+"recipient(s) contact(s)."
 
 #: js/MessageEditDialog.js:192
 msgid "Click to search for and add recipients from the Addressbook."
@@ -555,8 +522,7 @@ msgstr "On {0}, {1} wrote"
 msgid "Original message"
 msgstr "Original message"
 
-#: js/MessageEditDialog.js:342
-#: js/FileUpload.js:76
+#: js/MessageEditDialog.js:342 js/FileUpload.js:76
 msgid "Message Size Limit Exceeded"
 msgstr "Message Size Limit Exceeded"
 
@@ -591,8 +557,7 @@ msgstr "Fwd:"
 msgid "{0} Message"
 msgstr "{0} Message"
 
-#: js/MessageEditDialog.js:611
-#: js/MessageEditDialog.js:746
+#: js/MessageEditDialog.js:611 js/MessageEditDialog.js:746
 msgid "Failed"
 msgstr "Failed"
 
@@ -608,8 +573,7 @@ msgstr "Errors"
 msgid "Please fix the errors noted."
 msgstr "Please fix the errors noted."
 
-#: js/MessageEditDialog.js:669
-#: js/MessageEditDialog.js:931
+#: js/MessageEditDialog.js:669 js/MessageEditDialog.js:931
 msgid "Compose email:"
 msgstr "Compose email:"
 
@@ -637,8 +601,7 @@ msgstr "Files are still uploading."
 msgid "No recipients set."
 msgstr "No recipients set."
 
-#: js/Model.js:49
-#: js/TreeContextMenu.js:24
+#: js/Model.js:49 js/TreeContextMenu.js:24
 msgid "Message"
 msgid_plural "Messages"
 msgstr[0] "Message"
@@ -678,9 +641,7 @@ msgstr "Templates"
 msgid "Trash"
 msgstr "Trash"
 
-#: js/Model.js:499
-#: js/Model.js:616
-#: js/Model.js:681
+#: js/Model.js:499 js/Model.js:616 js/Model.js:681
 msgid "record list"
 msgid_plural "record lists"
 msgstr[0] "record list"
@@ -714,18 +675,15 @@ msgstr[1] "Flag lists"
 msgid "Click here to set To/CC/BCC."
 msgstr "Click here to set To/CC/BCC."
 
-#: js/RecipientGrid.js:208
-#: js/RecipientGrid.js:232
+#: js/RecipientGrid.js:208 js/RecipientGrid.js:232
 msgid "To:"
 msgstr "To:"
 
-#: js/RecipientGrid.js:211
-#: js/RecipientGrid.js:233
+#: js/RecipientGrid.js:211 js/RecipientGrid.js:233
 msgid "Cc:"
 msgstr "Cc:"
 
-#: js/RecipientGrid.js:214
-#: js/RecipientGrid.js:234
+#: js/RecipientGrid.js:214 js/RecipientGrid.js:234
 msgid "Bcc:"
 msgstr "Bcc:"
 
@@ -765,13 +723,11 @@ msgstr "To (Email)"
 msgid "Header contains"
 msgstr "Header contains"
 
-#: js/sieve/RuleConditionsPanel.js:75
-#: js/sieve/RuleConditionsPanel.js:77
+#: js/sieve/RuleConditionsPanel.js:75 js/sieve/RuleConditionsPanel.js:77
 msgid "Header name"
 msgstr "Header name"
 
-#: js/sieve/RuleConditionsPanel.js:75
-#: js/sieve/RuleConditionsPanel.js:77
+#: js/sieve/RuleConditionsPanel.js:75 js/sieve/RuleConditionsPanel.js:77
 msgid "Header value"
 msgstr "Header value"
 
@@ -875,13 +831,11 @@ msgstr "Incoming mails will be answered with this text:"
 msgid "General"
 msgstr "General"
 
-#: js/sieve/VacationEditDialog.js:133
-#: js/sieve/VacationEditDialog.js:167
+#: js/sieve/VacationEditDialog.js:133 js/sieve/VacationEditDialog.js:167
 msgid "I am available (vacation message disabled)"
 msgstr "I am available (vacation message disabled)"
 
-#: js/sieve/VacationEditDialog.js:140
-#: js/sieve/VacationEditDialog.js:168
+#: js/sieve/VacationEditDialog.js:140 js/sieve/VacationEditDialog.js:168
 msgid "I am not available (vacation message enabled)"
 msgstr "I am not available (vacation message enabled)"
 
@@ -1001,8 +955,12 @@ msgid "Email Update Interval"
 msgstr "Email Update Interval"
 
 #: Preference.php:111
-msgid "How often should Expressomail check for new Emails (in minutes). \"0\" means never."
-msgstr "How often should Expressomail check for new Emails (in minutes). \"0\" means never."
+msgid ""
+"How often should Expressomail check for new Emails (in minutes). \"0\" means "
+"never."
+msgstr ""
+"How often should Expressomail check for new Emails (in minutes). \"0\" means "
+"never."
 
 #: Preference.php:114
 msgid "Use in Addressbook"
@@ -1056,87 +1014,74 @@ msgstr "All drafts"
 msgid "All mails with the draft flag"
 msgstr "All mails with the draft flag"
 
-#: js/GridDetailsPanel.js:
-#: 255
+#: js/GridDetailsPanel.js:255
 msgid "Verification Failed!"
 msgstr "Verification Failed!"
 
-#: js/GridDetailsPanel.js:
-#: 251
+#: js/GridDetailsPanel.js:251
 msgid "Verification Successful!"
 msgstr "Verification Successful!"
 
-#: js/GridDetailsPanel.js:
-#: 245
+#: js/GridDetailsPanel.js:245
 msgid "Digital Signature"
 msgstr "Digital Signature"
 
-#: js/GridDetailsPanel.js:
-#: 547
+#: js/GridDetailsPanel.js:547
 msgid "Verification Details"
 msgstr "Verification Details"
 
-#: js/GridDetailsPanel.js:
-#: 542
+#: js/GridDetailsPanel.js:542
 msgid "Serial Number"
 msgstr "Serial Number"
 
-#: js/GridDetailsPanel.js:
-#: 542
+#: js/GridDetailsPanel.js:542
 msgid "Issuer"
 msgstr "Issuer"
 
-#: js/GridDetailsPanel.js:
-#: 542
+#: js/GridDetailsPanel.js:542
 msgid "Owner"
 msgstr "Owner"
 
-#: js/GridDetailsPanel.js:
-#: 542
+#: js/GridDetailsPanel.js:542
 msgid "Valid From"
 msgstr "Valid From"
 
-#: js/GridDetailsPanel.js:
-#: 542
+#: js/GridDetailsPanel.js:542
 msgid "Valid To"
 msgstr "Valid To"
 
-#: Smime.php:
-#: 129
+#: Smime.php:129
 msgid "Message Integrity Verification Failure"
 msgstr "Message Integrity Verification Failure"
 
-#: js/GridDetailsPanel.js:
-#: 561
+#: js/GridDetailsPanel.js:561
 msgid "Sender's email is different from Digital Certificate's email"
 msgstr "Sender's email is different from Digital Certificate's email"
 
-#: js/GridDetailsPanel.js:
-#: 392
+#: js/GridDetailsPanel.js:392
 msgid "show details of digitial signature verification"
 msgstr "show details of digitial signature verification"
 
-#: Preference.php:
-#: 166
+#: Preference.php:166
 msgid "Sign messages by default when sending mail"
 msgstr "Sign messages by default when sending mail"
 
-#: Preference.php:
-#: 166
-msgid "Choose yes, to open message editor with toggle button \"Sign Message\" pressed"
-msgstr "Choose yes, to open message editor with toggle button \"Sign Message\" pressed"
+#: Preference.php:166
+msgid ""
+"Choose yes, to open message editor with toggle button \"Sign Message\" "
+"pressed"
+msgstr ""
+"Choose yes, to open message editor with toggle button \"Sign Message\" "
+"pressed"
 
-#: js/TreeContextMenu.js:
-#: 199
+#: js/TreeContextMenu.js:199
 msgid "Digitally Sign Mail"
 msgstr "Digitally Sign Mail"
 
-#: js/TreeContextMenu.js:
-#: 199
+#: js/TreeContextMenu.js:199
 msgid "Activate this toggle button to sign a message on send"
 msgstr "Activate this toggle button to sign a message on send"
 
 #: js/sieve/RuleEditDialog.js:103
 msgid "All fields must be filled"
 msgstr "All fields must be filled"
-
index e60547c..d490d58 100644 (file)
@@ -5,8 +5,8 @@ msgstr ""
 "Project-Id-Version: Tine 2.0 - Expresso Mail\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2014-04-09 17:14-0300\n"
-"PO-Revision-Date: 2014-11-27 14:45-0300\n"
-"Last-Translator: Daniel Coletti <dcoletti@xtech.com.ar>\n"
+"PO-Revision-Date: 2015-08-24 10:49-0300\n"
+"Last-Translator: Rommel Cysne <rommel.cysne@serpro.gov.br>\n"
 "Language-Team: Expresso Castilian Translators\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
index 6503d59..6400d00 100644 (file)
@@ -1,4 +1,4 @@
-# 
+#
 # Translators:
 # antacs <antonio-carlos.silva@serpro.gov.br>, 2013
 # DECIO FERREIRA LINDOSO <decio.lindoso@gmail.com>, 2013
@@ -8,17 +8,17 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Tine 2.0\n"
 "POT-Creation-Date: 2008-05-17 22:12+0100\n"
-"PO-Revision-Date: 2015-04-08 09:48-0300\n"
-"Last-Translator: Fernando Lages <fernando.lages@serpro.gov.br>\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/tine20/language/pt_BR/)\n"
+"PO-Revision-Date: 2015-08-24 10:50-0300\n"
+"Last-Translator: Rommel Cysne <rommel.cysne@serpro.gov.br>\n"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/"
+"tine20/language/pt_BR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Language: pt_BR\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Poedit-Country: GB\n"
-"X-Poedit-Language: en\n"
 "X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: Poedit 1.5.4\n"
 
 #: Exception/PasswordPolicyViolation.php:22
 msgid "Password Policy Violation"
@@ -42,7 +42,8 @@ msgstr "Reportar erros"
 
 #: Acl/Rights.php:148
 msgid "Report bugs to the software vendor directly when they occur."
-msgstr "Reportar problemas para o desenvolvedor diretamente quando eles ocorrerem"
+msgstr ""
+"Reportar problemas para o desenvolvedor diretamente quando eles ocorrerem"
 
 #: Acl/Rights.php:151
 msgid "Check version"
@@ -58,7 +59,9 @@ msgstr "Administrar seu perfil"
 
 #: Acl/Rights.php:156
 msgid "The right to manage the own profile (selected contact data)."
-msgstr "O direito para gerenciar o próprio perfil (informação de contato selecionada)."
+msgstr ""
+"O direito para gerenciar o próprio perfil (informação de contato "
+"selecionada)."
 
 #: Acl/Rights.php:159
 msgid "Manage own client state"
@@ -88,8 +91,7 @@ msgstr "descrição de direitos de execução"
 msgid "default"
 msgstr "padrão"
 
-#: Frontend/Http.php:396
-#: js/ExceptionHandler.js:149
+#: Frontend/Http.php:396 js/ExceptionHandler.js:149
 msgid "Authorisation Required"
 msgstr "Autorização necessária"
 
@@ -97,13 +99,11 @@ msgstr "Autorização necessária"
 msgid "Your session is not valid. You need to login again."
 msgstr "Sua sessão não é válida.  Você precisa logar-se de novo."
 
-#: Frontend/Http.php:422
-#: js/ExceptionDialog.js:62
+#: Frontend/Http.php:422 js/ExceptionDialog.js:62
 msgid "Abnormal End"
 msgstr "Fim Anormal"
 
-#: Frontend/Http.php:423
-#: js/ExceptionDialog.js:134
+#: Frontend/Http.php:423 js/ExceptionDialog.js:134
 msgid "An error occurred, the program ended abnormal."
 msgstr "Ocorreu um erro, o programa terminou de maneira anormal."
 
@@ -115,12 +115,8 @@ msgstr "por"
 msgid "Changed fields:"
 msgstr "Campos modificados:"
 
-#: User/Abstract.php:281
-#: User/Abstract.php:282
-#: User/Abstract.php:283
-#: User/Abstract.php:284
-#: User/Abstract.php:285
-#: js/ux/ConnectionStatus.js:58
+#: User/Abstract.php:281 User/Abstract.php:282 User/Abstract.php:283
+#: User/Abstract.php:284 User/Abstract.php:285 js/ux/ConnectionStatus.js:58
 #: Group/Abstract.php:191
 msgid "unknown"
 msgstr "desconhecido"
@@ -268,7 +264,8 @@ msgstr "Validador da Sessão UA"
 
 #: Config.php:434
 msgid "Destroy session if the users user agent string changes."
-msgstr "Extinguir a sessão se os usuários usuarem agente de mudança de seqüência."
+msgstr ""
+"Extinguir a sessão se os usuários usuarem agente de mudança de seqüência."
 
 #: Config.php:442
 msgid "Files Directory"
@@ -276,15 +273,14 @@ msgstr "Diretório de arquivos"
 
 #: Config.php:444
 msgid "Directory with web server write access for user files."
-msgstr "Diretório com direito de escrita no servidor web para os arquivos do usuário"
+msgstr ""
+"Diretório com direito de escrita no servidor web para os arquivos do usuário"
 
-#: Config.php:452
-#: Config.php:454
+#: Config.php:452 Config.php:454
 msgid "User may change password"
 msgstr "Usuário pode modificar a senha"
 
-#: Config.php:462
-#: Config.php:464
+#: Config.php:462 Config.php:464
 msgid "Enable password policy"
 msgstr "Política de senha disponível"
 
@@ -349,8 +345,11 @@ msgid "Automatic bugreports"
 msgstr "Relatórios de erros automáticos"
 
 #: Config.php:544
-msgid "Always send bugreports, even on timeouts and other exceptions / failures."
-msgstr "Enviar sempre relatórios de erros, mesmo após tempo limite ou outras exceções / falhas."
+msgid ""
+"Always send bugreports, even on timeouts and other exceptions / failures."
+msgstr ""
+"Enviar sempre relatórios de erros, mesmo após tempo limite ou outras "
+"exceções / falhas."
 
 #: Config.php:552
 msgid "Last sessions cleanup run"
@@ -416,8 +415,7 @@ msgstr "modificado"
 msgid "record changed"
 msgstr "registros modificado"
 
-#: Preference.php:87
-#: js/widgets/TimezoneChooser.js:37
+#: Preference.php:87 js/widgets/TimezoneChooser.js:37
 msgid "Timezone"
 msgstr "Fuso horário"
 
@@ -425,8 +423,7 @@ msgstr "Fuso horário"
 msgid "The timezone in which dates are shown in Tine 2.0."
 msgstr "O fuso horário no qual as datas são exibidas no Tine 2.0."
 
-#: Preference.php:91
-#: js/widgets/LangChooser.js:35
+#: Preference.php:91 js/widgets/LangChooser.js:35
 msgid "Language"
 msgstr "Idioma"
 
@@ -448,7 +445,9 @@ msgstr "Tipo de Janela"
 
 #: Preference.php:100
 msgid "You can choose between modal windows or normal browser popup windows."
-msgstr "Você pode escolher entre janelas modais ou janelas normais que surgem no navegador"
+msgstr ""
+"Você pode escolher entre janelas modais ou janelas normais que surgem no "
+"navegador"
 
 #: Preference.php:103
 msgid "Confirm Logout"
@@ -462,8 +461,7 @@ msgstr "Mostrar diálogo de confiramação na saída"
 msgid "Data"
 msgstr "Dados"
 
-#: Export/Pdf.php:216
-#: js/widgets/tags/TagsPanel.js:57
+#: Export/Pdf.php:216 js/widgets/tags/TagsPanel.js:57
 msgid "Tags"
 msgstr "Rótulos"
 
@@ -479,20 +477,17 @@ msgstr "Atividades"
 msgid "Profile Information"
 msgstr "Informações de Perfil"
 
-#: js/AdminPanel.js:79
-#: js/widgets/EditRecord.js:168
+#: js/AdminPanel.js:79 js/widgets/EditRecord.js:168
 #: js/widgets/dialog/EditDialog.js:309
 msgid "Apply"
 msgstr "Aplicar"
 
-#: js/AdminPanel.js:94
-#: js/widgets/TimezoneChooser.js:77
+#: js/AdminPanel.js:94 js/widgets/TimezoneChooser.js:77
 #: js/widgets/LangChooser.js:68
 msgid "Please Wait"
 msgstr "Por favor, aguarde"
 
-#: js/AdminPanel.js:156
-#: js/widgets/container/GrantsGrid.js:43
+#: js/AdminPanel.js:156 js/widgets/container/GrantsGrid.js:43
 msgid "Read"
 msgstr "Ler"
 
@@ -500,8 +495,7 @@ msgstr "Ler"
 msgid "The field is readable part of the profile"
 msgstr "O campo é parte legível do perfil"
 
-#: js/AdminPanel.js:161
-#: js/widgets/container/GrantsGrid.js:47
+#: js/AdminPanel.js:161 js/widgets/container/GrantsGrid.js:47
 msgid "Edit"
 msgstr "Editar"
 
@@ -509,29 +503,22 @@ msgstr "Editar"
 msgid "The field is editable part of the profile"
 msgstr "O campo é parte legível do perfil"
 
-#: js/AdminPanel.js:175
-#: js/widgets/dialog/DuplicateResolveGridPanel.js:139
+#: js/AdminPanel.js:175 js/widgets/dialog/DuplicateResolveGridPanel.js:139
 msgid "Field Name"
 msgstr "Nome do campo"
 
-#: js/AboutDialog.js:41
-#: js/MainMenu.js:112
+#: js/AboutDialog.js:41 js/MainMenu.js:112
 msgid "About {0}"
 msgstr "Sobre {0}"
 
-#: js/AboutDialog.js:60
-#: js/CreditsScreen.js:53
-#: js/LicenseScreen.js:51
-#: js/PasswordChangeDialog.js:66
-#: js/widgets/EditRecord.js:157
+#: js/AboutDialog.js:60 js/CreditsScreen.js:53 js/LicenseScreen.js:51
+#: js/PasswordChangeDialog.js:66 js/widgets/EditRecord.js:157
 #: js/widgets/tags/TagsMassAttachAction.js:84
 #: js/widgets/dialog/MultiOptionsDialog.js:102
 #: js/widgets/dialog/AddToRecordPanel.js:111
 #: js/widgets/dialog/PreferencesDialog.js:109
-#: js/widgets/dialog/EditDialog.js:298
-#: js/widgets/ActivitiesPanel.js:311
-#: js/widgets/container/ContainerSelect.js:490
-#: js/ux/form/LayerCombo.js:186
+#: js/widgets/dialog/EditDialog.js:298 js/widgets/ActivitiesPanel.js:311
+#: js/widgets/container/ContainerSelect.js:490 js/ux/form/LayerCombo.js:186
 msgid "Ok"
 msgstr "OK"
 
@@ -552,16 +539,23 @@ msgid "Contributors"
 msgstr "Contribuidores"
 
 #: js/tineInit.js:603
-msgid "Fatal Error: Client self-update failed, please contact your administrator and/or restart/reload your browser."
-msgstr "Erro Fatal: a auto-atualização do Cliente falhou, favor contactar o administrador e/ou reiniciar/recarregar seu navegador."
+msgid ""
+"Fatal Error: Client self-update failed, please contact your administrator "
+"and/or restart/reload your browser."
+msgstr ""
+"Erro Fatal: a auto-atualização do Cliente falhou, favor contactar o "
+"administrador e/ou reiniciar/recarregar seu navegador."
 
 #: js/AppManager.js:208
 msgid "Missing Applications"
 msgstr "Faltando Aplicativos"
 
 #: js/AppManager.js:209
-msgid "There are no applications enabled for you. Please contact your administrator."
-msgstr "Não existem aplicativos disponíveis para você.  Por favor contacte o administrador do sistema."
+msgid ""
+"There are no applications enabled for you. Please contact your administrator."
+msgstr ""
+"Não existem aplicativos disponíveis para você.  Por favor contacte o "
+"administrador do sistema."
 
 #: js/CreditsScreen.js:36
 msgid "Credits"
@@ -571,18 +565,13 @@ msgstr "Créditos"
 msgid "Usage:&#160;"
 msgstr "Uso:&#160;"
 
-#: js/common.js:255
-#: js/common.js:260
-#: js/widgets/tags/TagToggleBox.js:112
-#: js/widgets/tags/TagToggleBox.js:117
-#: js/widgets/tags/TagsPanel.js:128
-#: js/widgets/tags/TagCombo.js:134
-#: js/widgets/tags/TagCombo.js:139
+#: js/common.js:255 js/common.js:260 js/widgets/tags/TagToggleBox.js:112
+#: js/widgets/tags/TagToggleBox.js:117 js/widgets/tags/TagsPanel.js:128
+#: js/widgets/tags/TagCombo.js:134 js/widgets/tags/TagCombo.js:139
 msgid "personal"
 msgstr "pessoal"
 
-#: js/common.js:273
-#: js/common.js:311
+#: js/common.js:273 js/common.js:311
 msgid "No Information"
 msgstr "Nenhuma Informação"
 
@@ -610,18 +599,15 @@ msgid_plural "{0} seconds"
 msgstr[0] "segundo"
 msgstr[1] "segunedos"
 
-#: js/LoginPanel.js:80
-#: js/LoginPanel.js:118
+#: js/LoginPanel.js:80 js/LoginPanel.js:118
 msgid "Login"
 msgstr "Login"
 
-#: js/LoginPanel.js:90
-#: js/widgets/dialog/CredentialsDialog.js:61
+#: js/LoginPanel.js:90 js/widgets/dialog/CredentialsDialog.js:61
 msgid "Username"
 msgstr "Usuário"
 
-#: js/LoginPanel.js:107
-#: js/widgets/dialog/CredentialsDialog.js:65
+#: js/LoginPanel.js:107 js/widgets/dialog/CredentialsDialog.js:65
 msgid "Password"
 msgstr "Senha"
 
@@ -630,8 +616,14 @@ msgid "Tine 2.0 is made for you"
 msgstr "Tine 2.0 é feito para você"
 
 #: js/LoginPanel.js:139
-msgid "Tine 2.0 wants to make business collaboration easier and more enjoyable - for your needs! So you are warmly welcome to discuss with us, bring in ideas and get help."
-msgstr "Tine 2.0 quer tornar a colaboração nos negócios mais fácil e mais amigável - para as suas necessidades! Então você é bem vindo para discutir conosco, trazer idéias e obter ajuda."
+msgid ""
+"Tine 2.0 wants to make business collaboration easier and more enjoyable - "
+"for your needs! So you are warmly welcome to discuss with us, bring in ideas "
+"and get help."
+msgstr ""
+"Tine 2.0 quer tornar a colaboração nos negócios mais fácil e mais amigável - "
+"para as suas necessidades! Então você é bem vindo para discutir conosco, "
+"trazer idéias e obter ajuda."
 
 #: js/LoginPanel.js:145
 msgid "Tine 2.0 Homepage"
@@ -646,8 +638,12 @@ msgid "Translations"
 msgstr "Traduções"
 
 #: js/LoginPanel.js:152
-msgid "If you miss a language, or your language is not supported completely, you can help our translation teams at transifex."
-msgstr "Se você omitir o idioma ou seu idioma não é suportado completamente, você pode pedir ajuda à nossa equipe de tradução na Transifex."
+msgid ""
+"If you miss a language, or your language is not supported completely, you "
+"can help our translation teams at transifex."
+msgstr ""
+"Se você omitir o idioma ou seu idioma não é suportado completamente, você "
+"pode pedir ajuda à nossa equipe de tradução na Transifex."
 
 #: js/LoginPanel.js:155
 msgid "Tine 2.0 Translation Portal"
@@ -657,15 +653,18 @@ msgstr "Portal de Tradução do Tine 2.0"
 msgid "about {0} minutes"
 msgstr "sobre {0} minutos"
 
-#: js/LoginPanel.js:205
-#: js/LoginPanel.js:430
+#: js/LoginPanel.js:205 js/LoginPanel.js:430
 msgid "Tine 2.0 needs your help"
 msgstr "Tine 2.0 precisa da sua ajuda"
 
-#: js/LoginPanel.js:207
-#: js/LoginPanel.js:432
-msgid "We regularly need your feedback to make the next Tine 2.0 releases fit your needs even better. Help us and yourself by participating:"
-msgstr "Nós necessitamos ter o seu retorno regularmente para que os próximos lançamentos do Tine 2.0 para atender cada vez melhor suas necessidades.  Ajude-nos e a você mesmo participando:"
+#: js/LoginPanel.js:207 js/LoginPanel.js:432
+msgid ""
+"We regularly need your feedback to make the next Tine 2.0 releases fit your "
+"needs even better. Help us and yourself by participating:"
+msgstr ""
+"Nós necessitamos ter o seu retorno regularmente para que os próximos "
+"lançamentos do Tine 2.0 para atender cada vez melhor suas necessidades.  "
+"Ajude-nos e a você mesmo participando:"
 
 #: js/LoginPanel.js:213
 msgid "participate!"
@@ -692,8 +691,12 @@ msgid "Browser incompatible?"
 msgstr "Navegador incompatível ?"
 
 #: js/LoginPanel.js:286
-msgid "You are using an unrecognized browser. This could result in unexpected behaviour."
-msgstr "Você está usando um navegador desconhecido.  Isso pode resultar num comportamento inesperado."
+msgid ""
+"You are using an unrecognized browser. This could result in unexpected "
+"behaviour."
+msgstr ""
+"Você está usando um navegador desconhecido.  Isso pode resultar num "
+"comportamento inesperado."
 
 #: js/LoginPanel.js:292
 msgid "You might try one of these browsers:"
@@ -703,8 +706,7 @@ msgstr "Você poderia tentar um desses navegadores:"
 msgid "Logging you in..."
 msgstr "Autenticando você no..."
 
-#: js/LoginPanel.js:350
-#: js/widgets/tree/ContextMenu.js:191
+#: js/LoginPanel.js:350 js/widgets/tree/ContextMenu.js:191
 #: js/widgets/dialog/MultipleEditDialogPlugin.js:641
 #: js/widgets/persistentfilter/PickerPanel.js:317
 #: js/widgets/persistentfilter/PickerPanel.js:355
@@ -717,13 +719,11 @@ msgstr "Por favor aguarde"
 msgid "Login successful. Loading {0}..."
 msgstr "Login bem sucedido.  Carregando {0}..."
 
-#: js/LoginPanel.js:363
-#: js/MainMenu.js:227
+#: js/LoginPanel.js:363 js/MainMenu.js:227
 msgid "Please wait!"
 msgstr "Favor aguardar!"
 
-#: js/LoginPanel.js:371
-#: js/ExceptionHandler.js:214
+#: js/LoginPanel.js:371 js/ExceptionHandler.js:214
 msgid "Connection lost, please check your network!"
 msgstr "Conexão perdida, favor verificar sua rede!"
 
@@ -735,20 +735,16 @@ msgstr "Falha na autenticação"
 msgid "Your username and/or your password are wrong!!!"
 msgstr "Seu nome de usuário e/ou sua senha estão errados"
 
-#: js/LoginPanel.js:388
-#: js/widgets/dialog/CredentialsDialog.js:126
+#: js/LoginPanel.js:388 js/widgets/dialog/CredentialsDialog.js:126
 #: js/widgets/dialog/PreferencesDialog.js:245
 #: js/widgets/dialog/PreferencesDialog.js:274
-#: js/widgets/dialog/EditDialog.js:671
-#: js/widgets/dialog/ExportDialog.js:150
+#: js/widgets/dialog/EditDialog.js:671 js/widgets/dialog/ExportDialog.js:150
 #: js/widgets/dialog/MultipleEditDialogPlugin.js:603
 msgid "Errors"
 msgstr "Erros"
 
-#: js/LoginPanel.js:388
-#: js/widgets/dialog/CredentialsDialog.js:126
-#: js/widgets/dialog/EditDialog.js:691
-#: js/widgets/dialog/ExportDialog.js:150
+#: js/LoginPanel.js:388 js/widgets/dialog/CredentialsDialog.js:126
+#: js/widgets/dialog/EditDialog.js:691 js/widgets/dialog/ExportDialog.js:150
 #: js/widgets/dialog/MultipleEditDialogPlugin.js:603
 msgid "Please fix the errors noted."
 msgstr "Favor corrigir os erros observados"
@@ -777,20 +773,17 @@ msgstr "Nova Senha"
 msgid "Repeat new Password"
 msgstr "Repeta a nova Senha"
 
-#: js/PasswordChangeDialog.js:60
-#: js/widgets/EditRecord.js:178
+#: js/PasswordChangeDialog.js:60 js/widgets/EditRecord.js:178
 #: js/widgets/tags/TagToggleBox.js:59
 #: js/widgets/tags/TagsMassAttachAction.js:105
 #: js/widgets/dialog/DuplicateMergeDialog.js:79
 #: js/widgets/dialog/MultiOptionsDialog.js:109
 #: js/widgets/dialog/AddToRecordPanel.js:103
 #: js/widgets/dialog/PreferencesDialog.js:117
-#: js/widgets/dialog/EditDialog.js:318
-#: js/widgets/dialog/WizardPanel.js:187
+#: js/widgets/dialog/EditDialog.js:318 js/widgets/dialog/WizardPanel.js:187
 #: js/widgets/ActivitiesPanel.js:303
 #: js/widgets/persistentfilter/EditPersistentFilterPanel.js:76
-#: js/widgets/container/ContainerSelect.js:481
-#: js/ExceptionDialog.js:100
+#: js/widgets/container/ContainerSelect.js:481 js/ExceptionDialog.js:100
 #: js/ux/form/LayerCombo.js:193
 msgid "Cancel"
 msgstr "Cancelar"
@@ -811,8 +804,7 @@ msgstr "Sucesso"
 msgid "Your password has been changed."
 msgstr "Sua senha foi alterada."
 
-#: js/PasswordChangeDialog.js:100
-#: js/PasswordChangeDialog.js:110
+#: js/PasswordChangeDialog.js:100 js/PasswordChangeDialog.js:110
 #: js/widgets/relation/GenericPickerGridPanel.js:707
 #: js/widgets/relation/GenericPickerGridPanel.js:720
 #: js/widgets/dialog/ImportDialog.js:654
@@ -833,8 +825,7 @@ msgstr "Usuário: {0}"
 msgid "Debug Console (Ctrl + F11)"
 msgstr "Console de Depuração (Ctrl + F11)"
 
-#: js/MainMenu.js:124
-#: js/widgets/dialog/PreferencesPanel.js:36
+#: js/MainMenu.js:124 js/widgets/dialog/PreferencesPanel.js:36
 msgid "Preferences"
 msgstr "Preferências"
 
@@ -860,7 +851,8 @@ msgstr "Permitir notificações na Área de Trabalho"
 
 #: js/MainMenu.js:154
 msgid "Request permissions for webkit desktop notifications."
-msgstr "Solicitação de permissão para notificações do webkit na área de trabalho."
+msgstr ""
+"Solicitação de permissão para notificações do webkit na área de trabalho."
 
 #: js/MainMenu.js:164
 msgid "Install web app"
@@ -870,10 +862,8 @@ msgstr "Instalar applicação web"
 msgid "Install Tine 2.0 as web app in your browser."
 msgstr "Instalar Tine 2.0 como uma aplicação web no seu navegador."
 
-#: js/MainMenu.js:213
-#: js/widgets/grid/GridPanel.js:1667
-#: js/widgets/tree/ContextMenu.js:346
-#: js/widgets/dialog/EditDialog.js:698
+#: js/MainMenu.js:213 js/widgets/grid/GridPanel.js:1667
+#: js/widgets/tree/ContextMenu.js:346 js/widgets/dialog/EditDialog.js:698
 #: js/widgets/dialog/MultipleEditDialogPlugin.js:638
 #: js/widgets/persistentfilter/PickerPanel.js:315
 msgid "Confirm"
@@ -916,24 +906,40 @@ msgid "Not Found"
 msgstr "Não encontrado"
 
 #: js/ExceptionHandler.js:175
-msgid "Sorry, your request could not be completed because the required data could not be found. In most cases this means that someone already deleted the data. Please refresh your current view."
-msgstr "Desculpe, sua solicitação não pode ser completada porque a informação requisitada não pode ser encontrada.  Em muitos casos isso parece que alguém já apagou a informação.  Por favor, atualize sua visão atual."
+msgid ""
+"Sorry, your request could not be completed because the required data could "
+"not be found. In most cases this means that someone already deleted the "
+"data. Please refresh your current view."
+msgstr ""
+"Desculpe, sua solicitação não pode ser completada porque a informação "
+"requisitada não pode ser encontrada.  Em muitos casos isso parece que alguém "
+"já apagou a informação.  Por favor, atualize sua visão atual."
 
 #: js/ExceptionHandler.js:183
 msgid "Concurrent Updates"
 msgstr "Atualizações Concorrentes"
 
 #: js/ExceptionHandler.js:184
-msgid "Someone else saved this record while you where editing the data. You need to reload and make your changes again."
-msgstr "Alguém salvou este registro enquanto você estava editando a informação.  Você deverecarregar e fazer suas modificações de novo."
+msgid ""
+"Someone else saved this record while you where editing the data. You need to "
+"reload and make your changes again."
+msgstr ""
+"Alguém salvou este registro enquanto você estava editando a informação.  "
+"Você deverecarregar e fazer suas modificações de novo."
 
 #: js/ExceptionHandler.js:192
 msgid "Service Unavailable"
 msgstr "Serviço Indisponível"
 
 #: js/ExceptionHandler.js:193
-msgid "The server is currently unable to handle the request due to a temporary overloading, maintenance or misconfiguration of the server. Please try again or contact your administrator."
-msgstr "O servidor não está disponível para processar sua solicitação devido a uma sobrecarga temporária, manutenção ou reconfiguração do servidor.  Favor tente de novoou contacte o administrador do sistema."
+msgid ""
+"The server is currently unable to handle the request due to a temporary "
+"overloading, maintenance or misconfiguration of the server. Please try again "
+"or contact your administrator."
+msgstr ""
+"O servidor não está disponível para processar sua solicitação devido a uma "
+"sobrecarga temporária, manutenção ou reconfiguração do servidor.  Favor "
+"tente de novoou contacte o administrador do sistema."
 
 #: js/ExceptionHandler.js:199
 msgid "Server Message:"
@@ -945,39 +951,56 @@ msgstr "Informação inválida"
 
 #: js/ExceptionHandler.js:202
 msgid "Your input data is not valid. Please provide valid data."
-msgstr "O dado informado não é válido.  Favor providenciar uma informação válida."
+msgstr ""
+"O dado informado não é válido.  Favor providenciar uma informação válida."
 
 #: js/ExceptionHandler.js:220
 msgid "Timeout"
 msgstr "Tempo limite"
 
 #: js/ExceptionHandler.js:221
-msgid "Sorry, some timeout occured while processing your request. Please reload your browser, try again or contact your administrator."
-msgstr "Desculpe, o limite de tempo foi excedido enquanto processava sua solicitação.  Favor recarregar seu navegador, tente de novo ou contacte o administrador do sistema."
+msgid ""
+"Sorry, some timeout occured while processing your request. Please reload "
+"your browser, try again or contact your administrator."
+msgstr ""
+"Desculpe, o limite de tempo foi excedido enquanto processava sua "
+"solicitação.  Favor recarregar seu navegador, tente de novo ou contacte o "
+"administrador do sistema."
 
 #: js/ExceptionHandler.js:229
 msgid "No Response"
 msgstr "Sem resposta"
 
 #: js/ExceptionHandler.js:230
-msgid "Sorry, the Server did not respond any data. Please reload your browser, try again or contact your administrator."
-msgstr "Desculpe, o Servidor não retornou nenhuma informação.  Favor recarregar seu navegador, tente de novo ou contacte o administrador do sistema"
+msgid ""
+"Sorry, the Server did not respond any data. Please reload your browser, try "
+"again or contact your administrator."
+msgstr ""
+"Desculpe, o Servidor não retornou nenhuma informação.  Favor recarregar seu "
+"navegador, tente de novo ou contacte o administrador do sistema"
 
 #: js/ExceptionHandler.js:237
 msgid "Out of Resources"
 msgstr "Fora de Recursos"
 
 #: js/ExceptionHandler.js:238
-msgid "Sorry, the Server stated a \"memory exhausted\" condition. Please contact your administrator."
-msgstr "Desculpe, o Servidor apresenta \"memória esgotada\".  Favor contactar o administrador do sistema."
+msgid ""
+"Sorry, the Server stated a \"memory exhausted\" condition. Please contact "
+"your administrator."
+msgstr ""
+"Desculpe, o Servidor apresenta \"memória esgotada\".  Favor contactar o "
+"administrador do sistema."
 
 #: js/ExceptionHandler.js:254
 msgid "No Role Memberships"
 msgstr "Sem funções associadas"
 
 #: js/ExceptionHandler.js:255
-msgid "Your user account has no role memberships. Please contact your administrator."
-msgstr "Sua conta não tem funcões associadas.  Favor contactar o administrador do sistema."
+msgid ""
+"Your user account has no role memberships. Please contact your administrator."
+msgstr ""
+"Sua conta não tem funcões associadas.  Favor contactar o administrador do "
+"sistema."
 
 #: js/Container.js:123
 msgid "All {0}"
@@ -995,14 +1018,12 @@ msgstr "Outros usuários {0}"
 msgid "My {0}"
 msgstr "Meu {0}"
 
-#: js/widgets/EditRecord.js:131
-#: js/widgets/dialog/EditDialog.js:360
+#: js/widgets/EditRecord.js:131 js/widgets/dialog/EditDialog.js:360
 #: js/widgets/dialog/EditDialog.js:388
 msgid "Saved in"
 msgstr "Salvo em"
 
-#: js/widgets/EditRecord.js:188
-#: js/widgets/dialog/EditDialog.js:327
+#: js/widgets/EditRecord.js:188 js/widgets/dialog/EditDialog.js:327
 msgid "delete"
 msgstr "apagar"
 
@@ -1016,7 +1037,8 @@ msgstr "Vincular Identificações"
 
 #: js/widgets/tags/TagToggleBox.js:140
 msgid "No Tags to detach found in the selected records"
-msgstr "Não existem identificações para separar os registros selecionados encontrados"
+msgstr ""
+"Não existem identificações para separar os registros selecionados encontrados"
 
 #: js/widgets/tags/TagToggleBox.js:141
 msgid "Please Wait..."
@@ -1036,7 +1058,8 @@ msgstr "Adicionar nova identificação pessoal"
 
 #: js/widgets/tags/TagsPanel.js:109
 msgid "Please note: You create a personal tag. Only you can see it!"
-msgstr "Favor observar: você cria uma identificação pessoal. Somente você pode vê-la!"
+msgstr ""
+"Favor observar: você cria uma identificação pessoal. Somente você pode vê-la!"
 
 #: js/widgets/tags/TagsPanel.js:109
 msgid "Enter tag name:"
@@ -1056,8 +1079,7 @@ msgstr[1] "Desvincular identificações"
 msgid "Edit tag"
 msgstr "Editar identificação"
 
-#: js/widgets/tags/TagsPanel.js:188
-#: js/widgets/tags/TagsPanel.js:193
+#: js/widgets/tags/TagsPanel.js:188 js/widgets/tags/TagsPanel.js:193
 msgid "Rename Tag"
 msgstr "Renomear identificação"
 
@@ -1096,8 +1118,11 @@ msgstr[1] "Apagar realmente as Identificações selecionadas?"
 #: js/widgets/tags/TagsPanel.js:259
 msgid "the selected tag will be deleted and disapear for all entries"
 msgid_plural "The selected tags will be removed and disapear for all entries"
-msgstr[0] "a identificação selecionada será apagada e desaparecerá de todas as entradas"
-msgstr[1] "As identificações selecionadas serão apagadas e desaparecerão de todas as entradas"
+msgstr[0] ""
+"a identificação selecionada será apagada e desaparecerá de todas as entradas"
+msgstr[1] ""
+"As identificações selecionadas serão apagadas e desaparecerão de todas as "
+"entradas"
 
 #: js/widgets/tags/TagsPanel.js:263
 msgid "Please wait a moment..."
@@ -1109,10 +1134,8 @@ msgid_plural "Deleting Tags"
 msgstr[0] "Apagando Identificação"
 msgstr[1] "Apagando Identificações"
 
-#: js/widgets/tags/TagsPanel.js:279
-#: js/widgets/tags/TagsPanel.js:371
-#: js/widgets/tags/TagsPanel.js:404
-#: js/widgets/dialog/EditDialog.js:710
+#: js/widgets/tags/TagsPanel.js:279 js/widgets/tags/TagsPanel.js:371
+#: js/widgets/tags/TagsPanel.js:404 js/widgets/dialog/EditDialog.js:710
 msgid "Failed"
 msgstr "Falhou"
 
@@ -1120,13 +1143,11 @@ msgstr "Falhou"
 msgid "Could not delete Tag(s)."
 msgstr "Não é possível apagar Identificação(ões)"
 
-#: js/widgets/tags/TagsPanel.js:323
-#: js/widgets/tags/TagsPanel.js:385
+#: js/widgets/tags/TagsPanel.js:323 js/widgets/tags/TagsPanel.js:385
 msgid "Notice"
 msgstr "Observação"
 
-#: js/widgets/tags/TagsPanel.js:324
-#: js/widgets/tags/TagsPanel.js:386
+#: js/widgets/tags/TagsPanel.js:324 js/widgets/tags/TagsPanel.js:386
 msgid "The minimum tag length is three."
 msgstr "O tamanho mínimo da identificação é três"
 
@@ -1166,8 +1187,7 @@ msgstr "Selecionar Identificação"
 msgid "Attaching Tag"
 msgstr "Vinculando Identificação"
 
-#: js/widgets/tags/TagFilter.js:30
-#: js/Models.js:141
+#: js/widgets/tags/TagFilter.js:30 js/Models.js:141
 msgid "Tag"
 msgid_plural "Tags"
 msgstr[0] "Identificação"
@@ -1185,13 +1205,11 @@ msgstr "Selecione identificação(ões) a desvincular"
 msgid "tag name"
 msgstr "nome da identificação"
 
-#: js/widgets/VersionCheck.js:44
-#: js/widgets/VersionCheck.js:53
+#: js/widgets/VersionCheck.js:44 js/widgets/VersionCheck.js:53
 msgid "New version of Tine 2.0 available"
 msgstr "Nova versão do Tine 2.0 está disponível"
 
-#: js/widgets/VersionCheck.js:45
-#: js/widgets/VersionCheck.js:54
+#: js/widgets/VersionCheck.js:45 js/widgets/VersionCheck.js:54
 msgid "Version \"{0}\" of Tine 2.0 is available."
 msgstr "Versão \"{0}\" do Tine 2.0 está disponível."
 
@@ -1207,8 +1225,7 @@ msgstr "Favor considerar a atualização!"
 msgid "Remove record"
 msgstr "Remover registro"
 
-#: js/widgets/grid/PickerGridPanel.js:255
-#: js/widgets/grid/PickerFilter.js:310
+#: js/widgets/grid/PickerGridPanel.js:255 js/widgets/grid/PickerFilter.js:310
 #: js/widgets/grid/FilterModelMultiSelect.js:214
 #: js/widgets/container/FilterModel.js:249
 msgid "Selected  {0}"
@@ -1226,8 +1243,7 @@ msgstr "contém"
 msgid "reg. exp."
 msgstr "reg. exp."
 
-#: js/widgets/grid/FilterModel.js:170
-#: js/widgets/container/FilterModel.js:142
+#: js/widgets/grid/FilterModel.js:170 js/widgets/container/FilterModel.js:142
 #: js/widgets/container/FilterModel.js:146
 msgid "is equal to"
 msgstr "é igual a"
@@ -1358,8 +1374,7 @@ msgstr "próximo ano"
 msgid "Attention: There are more filters active!"
 msgstr "Atenção: Existem mais filtros ativos!"
 
-#: js/widgets/grid/FilterPanel.js:175
-#: js/widgets/grid/FilterPanel.js:485
+#: js/widgets/grid/FilterPanel.js:175 js/widgets/grid/FilterPanel.js:485
 msgid "Criteria {0}"
 msgstr "Critério {0}"
 
@@ -1379,21 +1394,23 @@ msgid_plural "Your view is limited by {0} criterias:"
 msgstr[0] "Sua visão está limitada pelo {0} critério:"
 msgstr[1] "Sua visão está limitada pelos {0} critérios:"
 
-#: js/widgets/grid/FileUploadGrid.js:115
-#: js/ux/form/ImageField.js:211
+#: js/widgets/grid/FileUploadGrid.js:115 js/ux/form/ImageField.js:211
 msgid "Upload Failed"
 msgstr "Carregamento falhou"
 
 #: js/widgets/grid/FileUploadGrid.js:116
-msgid "Could not upload file. Filesize could be too big. Please notify your Administrator. Max upload size: "
-msgstr "Não foi possível carregar o arquivo.  O tamanho pode ser muito grande. Favor notificar o Administrador.  Tamanho máximo de carregamento: "
+msgid ""
+"Could not upload file. Filesize could be too big. Please notify your "
+"Administrator. Max upload size: "
+msgstr ""
+"Não foi possível carregar o arquivo.  O tamanho pode ser muito grande. Favor "
+"notificar o Administrador.  Tamanho máximo de carregamento: "
 
 #: js/widgets/grid/FileUploadGrid.js:180
 msgid "Remove file"
 msgstr "Remover arquivo"
 
-#: js/widgets/grid/FileUploadGrid.js:188
-#: js/widgets/tree/ContextMenu.js:116
+#: js/widgets/grid/FileUploadGrid.js:188 js/widgets/tree/ContextMenu.js:116
 msgid "Pause upload"
 msgstr "Pausar carregamento"
 
@@ -1417,8 +1434,7 @@ msgstr "tipo"
 msgid "Remove"
 msgstr "Remover"
 
-#: js/widgets/grid/FilterToolbar.js:85
-#: js/widgets/grid/FilterToolbar.js:571
+#: js/widgets/grid/FilterToolbar.js:85 js/widgets/grid/FilterToolbar.js:571
 msgid "Show"
 msgstr "Exibir"
 
@@ -1464,15 +1480,13 @@ msgstr "existem relações"
 
 #: js/widgets/grid/LinkGridPanel.js:103
 #: js/widgets/account/PickerGridPanel.js:267
-#: js/widgets/container/PropertiesDialog.js:107
-#: js/Models.js:428
+#: js/widgets/container/PropertiesDialog.js:107 js/Models.js:428
 msgid "Name"
 msgstr "Nome"
 
 #: js/widgets/grid/LinkGridPanel.js:105
 #: js/widgets/relation/GenericPickerGridPanel.js:430
-#: js/widgets/ActivitiesPanel.js:461
-#: js/widgets/ActivitiesPanel.js:598
+#: js/widgets/ActivitiesPanel.js:461 js/widgets/ActivitiesPanel.js:598
 msgid "Type"
 msgstr "Tipo"
 
@@ -1495,27 +1509,27 @@ msgid "Remove Filter"
 msgstr "Remover Filtro"
 
 #: js/widgets/grid/GridPanel.js:286
-msgid "There could not be found any {0}. Please try to change your filter-criteria, view-options or the {1} you search in."
-msgstr "Não foram encontrados qualquer {0}.  Favor tentar modificar seu critério de pesquisa,ver opções ou o {1} sua pesquisa em."
+msgid ""
+"There could not be found any {0}. Please try to change your filter-criteria, "
+"view-options or the {1} you search in."
+msgstr ""
+"Não foram encontrados qualquer {0}.  Favor tentar modificar seu critério de "
+"pesquisa,ver opções ou o {1} sua pesquisa em."
 
-#: js/widgets/grid/GridPanel.js:288
-#: js/widgets/grid/GridPanel.js:474
-#: js/widgets/grid/GridPanel.js:475
-#: js/widgets/grid/GridPanel.js:476
+#: js/widgets/grid/GridPanel.js:288 js/widgets/grid/GridPanel.js:474
+#: js/widgets/grid/GridPanel.js:475 js/widgets/grid/GridPanel.js:476
 msgid "Edit {0}"
 msgid_plural "Edit {0}"
 msgstr[0] "Editar {0}"
 msgstr[1] "Editar {0}"
 
-#: js/widgets/grid/GridPanel.js:489
-#: js/widgets/dialog/EditDialog.js:484
+#: js/widgets/grid/GridPanel.js:489 js/widgets/dialog/EditDialog.js:484
 msgid "Copy {0}"
 msgstr "Copiar {0}"
 
-#msgid "Add {0}"
-#msgstr "Adicionar {0}"
-#: js/widgets/grid/GridPanel.js:500
-#: js/widgets/tree/ContextMenu.js:35
+# msgid "Add {0}"
+# msgstr "Adicionar {0}"
+#: js/widgets/grid/GridPanel.js:500 js/widgets/tree/ContextMenu.js:35
 #: js/widgets/grid/GridPanel.js:508
 msgid "Print Page"
 msgstr "Imprimir Página"
@@ -1546,8 +1560,7 @@ msgstr "Adicionar para..."
 msgid "Creation Time"
 msgstr "Hora da criação"
 
-#: js/widgets/grid/GridPanel.js:1270
-#: js/widgets/ActivitiesPanel.js:464
+#: js/widgets/grid/GridPanel.js:1270 js/widgets/ActivitiesPanel.js:464
 msgid "Created By"
 msgstr "Criado Por"
 
@@ -1580,8 +1593,7 @@ msgid "Related to"
 msgstr "Relacionado com"
 
 #: js/widgets/relation/FilterModel.js:32
-#: js/widgets/relation/GenericPickerGridPanel.js:133
-#: js/Models.js:400
+#: js/widgets/relation/GenericPickerGridPanel.js:133 js/Models.js:400
 msgid "Relation"
 msgid_plural "Relations"
 msgstr[0] "Relação"
@@ -1620,8 +1632,11 @@ msgid "There are invalid relations. Please check before saving."
 msgstr "Existem relações inválidas.  Favor verifique antes de salvar."
 
 #: js/widgets/relation/GenericPickerGridPanel.js:252
-msgid "The maximum number of {0} with the type {1} is reached. Please change the type of this relation"
-msgstr "O número máximo de {0} com o tipo {1} foi atingido.  Favor modifique o "
+msgid ""
+"The maximum number of {0} with the type {1} is reached. Please change the "
+"type of this relation"
+msgstr ""
+"O número máximo de {0} com o tipo {1} foi atingido.  Favor modifique o "
 
 #: js/widgets/relation/GenericPickerGridPanel.js:426
 msgid "Record"
@@ -1636,8 +1651,11 @@ msgid "Dependency"
 msgstr "Dependencia"
 
 #: js/widgets/relation/GenericPickerGridPanel.js:708
-msgid "The record you tried to link is already linked. Please edit the existing link."
-msgstr "O registro que você tentou ligar já está ligado.  Favor editar a ligação."
+msgid ""
+"The record you tried to link is already linked. Please edit the existing "
+"link."
+msgstr ""
+"O registro que você tentou ligar já está ligado.  Favor editar a ligação."
 
 #: js/widgets/relation/GenericPickerGridPanel.js:721
 #: js/widgets/form/RecordPickerComboBox.js:268
@@ -1645,8 +1663,12 @@ msgid "You tried to link a record with itself. This is not allowed!"
 msgstr "você tentou ligar um registro a ele mesmo.  Isso não é permitido"
 
 #: js/widgets/relation/PickerCombo.js:93
-msgid "The {1} \"{2}\" is already used in the Field \"{0}\" and can be linked only once!"
-msgstr "O {1} \"{2}\" já está em uso no Campo \"{0}\" e pode ser vinculado somente uma vez!"
+msgid ""
+"The {1} \"{2}\" is already used in the Field \"{0}\" and can be linked only "
+"once!"
+msgstr ""
+"O {1} \"{2}\" já está em uso no Campo \"{0}\" e pode ser vinculado somente "
+"uma vez!"
 
 #: js/widgets/tree/ContextMenu.js:185
 msgid "Please enter the name of the new {0}:"
@@ -1656,8 +1678,7 @@ msgstr "Favor entrar o nome do novo {0}:"
 msgid "No {0} added"
 msgstr "Nenhum {0} adicionado"
 
-#: js/widgets/tree/ContextMenu.js:188
-#: js/widgets/tree/ContextMenu.js:272
+#: js/widgets/tree/ContextMenu.js:188 js/widgets/tree/ContextMenu.js:272
 msgid "You have to supply a {0} name!"
 msgstr "Vocẽ deve fornecer o nome {0}!"
 
@@ -1694,32 +1715,44 @@ msgid "Choose Import File"
 msgstr "Escolha o arquivo a importar"
 
 #: js/widgets/dialog/ImportDialog.js:236
-msgid "Please choose the file that contains the records you want to add to Tine 2.0"
-msgstr "Favor escolher o arquivo que contém os registros que você quer adicionar ao Tine 2.0"
+msgid ""
+"Please choose the file that contains the records you want to add to Tine 2.0"
+msgstr ""
+"Favor escolher o arquivo que contém os registros que você quer adicionar ao "
+"Tine 2.0"
 
 #: js/widgets/dialog/ImportDialog.js:240
 msgid "Select file containing your {0}"
 msgstr "Selecione o arquivo contendo seu {0}"
 
-#: js/widgets/dialog/ImportDialog.js:248
-#: js/widgets/dialog/ImportDialog.js:253
+#: js/widgets/dialog/ImportDialog.js:248 js/widgets/dialog/ImportDialog.js:253
 msgid "What should the file you upload look like?"
 msgstr "Que arquivo você gostaria de carregar?"
 
 #: js/widgets/dialog/ImportDialog.js:256
-msgid "Tine 2.0 does not understand all kind of files you might want to upload. You will have to manually adjust your file so Tine 2.0 can handle it."
-msgstr "Tine 2.0 não reconhece todos os tipos de arquivos que você gostaria de carregar.  Você terá que ajustar manualmente seu arquivo para que o Tine 2.0 possa manuseá-lo."
+msgid ""
+"Tine 2.0 does not understand all kind of files you might want to upload. You "
+"will have to manually adjust your file so Tine 2.0 can handle it."
+msgstr ""
+"Tine 2.0 não reconhece todos os tipos de arquivos que você gostaria de "
+"carregar.  Você terá que ajustar manualmente seu arquivo para que o Tine 2.0 "
+"possa manuseá-lo."
 
 #: js/widgets/dialog/ImportDialog.js:259
-msgid "Following you find a list of all supported import formats and a sample file, how Tine 2.0 expects your file to look like."
-msgstr "A seguir você encontrará uma lista de todos os formatos de importação suportados e um arquivo de exemplo, como o Tine 2.0 espera que o seu arquivo se pareça."
+msgid ""
+"Following you find a list of all supported import formats and a sample file, "
+"how Tine 2.0 expects your file to look like."
+msgstr ""
+"A seguir você encontrará uma lista de todos os formatos de importação "
+"suportados e um arquivo de exemplo, como o Tine 2.0 espera que o seu arquivo "
+"se pareça."
 
 #: js/widgets/dialog/ImportDialog.js:262
 msgid "Please select the import format of the file you want to upload"
-msgstr "Favor selecionar o formato de importação do arquivo que você quer carregar"
+msgstr ""
+"Favor selecionar o formato de importação do arquivo que você quer carregar"
 
-#: js/widgets/dialog/ImportDialog.js:283
-#: js/widgets/dialog/ImportDialog.js:315
+#: js/widgets/dialog/ImportDialog.js:283 js/widgets/dialog/ImportDialog.js:315
 msgid "Download example file"
 msgstr "Baixando o arquivo de exemplo"
 
@@ -1779,8 +1812,7 @@ msgstr "Resolver todos os conflitos"
 msgid "Processing Conflict Data"
 msgstr "Processando Conflito de Dado"
 
-#: js/widgets/dialog/ImportDialog.js:575
-#: js/widgets/dialog/ImportDialog.js:595
+#: js/widgets/dialog/ImportDialog.js:575 js/widgets/dialog/ImportDialog.js:595
 msgid "No conflict to resolve"
 msgstr "Nenhum conflito a resolver"
 
@@ -1819,8 +1851,10 @@ msgid "{0} of them where identified as duplicates."
 msgstr "{0} deles foram identificados como duplicatas."
 
 #: js/widgets/dialog/ImportDialog.js:755
-msgid "From the identified duplicates {0} will be merged into the existing records."
-msgstr "Das duplicatas identificadas {0} serão juntadas aos registros existentes."
+msgid ""
+"From the identified duplicates {0} will be merged into the existing records."
+msgstr ""
+"Das duplicatas identificadas {0} serão juntadas aos registros existentes."
 
 #: js/widgets/dialog/ImportDialog.js:759
 msgid "From the identified duplicates {0} will be discarded."
@@ -1983,7 +2017,8 @@ msgstr "Carregando ..."
 #: js/widgets/dialog/PreferencesDialog.js:245
 #: js/widgets/form/ConfigPanel.js:134
 msgid "You need to correct the red marked fields before config could be saved"
-msgstr "Você precisa corrigir os campos em vermelho antes da configuração ser salva"
+msgstr ""
+"Você precisa corrigir os campos em vermelho antes da configuração ser salva"
 
 #: js/widgets/dialog/PreferencesDialog.js:274
 msgid "Saving of preferences failed."
@@ -2026,12 +2061,17 @@ msgid "{0} {1} has been updated properly."
 msgstr "{0} {1} atualizou corretamente."
 
 #: js/widgets/dialog/MultipleEditResultSummary.js:152
-msgid "{0} {1} have invalid data after updating. These {1} have not been changed."
-msgstr "{0} {1} tem informação inválida após a atualização. Este {1} não foi modificado."
+msgid ""
+"{0} {1} have invalid data after updating. These {1} have not been changed."
+msgstr ""
+"{0} {1} tem informação inválida após a atualização. Este {1} não foi "
+"modificado."
 
 #: js/widgets/dialog/MultipleEditResultSummary.js:152
 msgid "{0} {1} has invalid data after updating. This {1} has not been changed."
-msgstr "{0} {1} tem informação inválida após a atualização. Este {1} não foi modificado."
+msgstr ""
+"{0} {1} tem informação inválida após a atualização. Este {1} não foi "
+"modificado."
 
 #: js/widgets/dialog/ExportDialog.js:84
 msgid "Export {0} {1}"
@@ -2063,8 +2103,12 @@ msgid "Different Values"
 msgstr "Valores Diferentes"
 
 #: js/widgets/dialog/MultipleEditDialogPlugin.js:541
-msgid "This field has different values. Editing this field will overwrite the old values."
-msgstr "Este campo tem valores diferentes.  Editando este campo os valores antigos serão subrescritos."
+msgid ""
+"This field has different values. Editing this field will overwrite the old "
+"values."
+msgstr ""
+"Este campo tem valores diferentes.  Editando este campo os valores antigos "
+"serão subrescritos."
 
 #: js/widgets/dialog/MultipleEditDialogPlugin.js:638
 msgid "Do you really want to change these {0} records?"
@@ -2150,19 +2194,16 @@ msgstr "Campos Customizados"
 msgid "Add a Note..."
 msgstr "Adicionar Nota..."
 
-#: js/widgets/ActivitiesPanel.js:162
-#: js/widgets/ActivitiesPanel.js:174
+#: js/widgets/ActivitiesPanel.js:162 js/widgets/ActivitiesPanel.js:174
 #: js/widgets/container/GrantsGrid.js:45
 msgid "Add"
 msgstr "Adicionar"
 
-#: js/widgets/ActivitiesPanel.js:162
-#: js/widgets/ActivitiesPanel.js:463
+#: js/widgets/ActivitiesPanel.js:162 js/widgets/ActivitiesPanel.js:463
 msgid "Note"
 msgstr "Nota"
 
-#: js/widgets/ActivitiesPanel.js:175
-#: js/widgets/ActivitiesPanel.js:385
+#: js/widgets/ActivitiesPanel.js:175 js/widgets/ActivitiesPanel.js:385
 msgid "Add new note"
 msgstr "Adicionar nova nota"
 
@@ -2174,8 +2215,7 @@ msgstr "Notas"
 msgid "Enter new note:"
 msgstr "Incluir nova nota"
 
-#: js/widgets/ActivitiesPanel.js:319
-#: js/widgets/ActivitiesPanel.js:384
+#: js/widgets/ActivitiesPanel.js:319 js/widgets/ActivitiesPanel.js:384
 msgid "Add Note"
 msgstr "Adicionar Nota"
 
@@ -2199,13 +2239,11 @@ msgstr "Nenhum histórico a exibir"
 msgid "History"
 msgstr "Histórico"
 
-#: js/widgets/ActivitiesPanel.js:592
-#: js/ApplicationStarter.js:222
+#: js/widgets/ActivitiesPanel.js:592 js/ApplicationStarter.js:222
 msgid "Quick search"
 msgstr "Pesquisa rápida"
 
-#: js/widgets/ActivitiesPanel.js:593
-#: js/widgets/ActivitiesPanel.js:594
+#: js/widgets/ActivitiesPanel.js:593 js/widgets/ActivitiesPanel.js:594
 msgid "Time"
 msgstr "Hora"
 
@@ -2276,8 +2314,12 @@ msgid "Favorite not Saved"
 msgstr "Favorito não foi salvo"
 
 #: js/widgets/persistentfilter/EditPersistentFilterPanel.js:132
-msgid "You have to supply a shorter name! Names of favorite can only be up to 40 characters long."
-msgstr "Você deve fornecer um nome curto! Nomes de favoritos devem ter mais de 40 caracteres"
+msgid ""
+"You have to supply a shorter name! Names of favorite can only be up to 40 "
+"characters long."
+msgstr ""
+"Você deve fornecer um nome curto! Nomes de favoritos devem ter mais de 40 "
+"caracteres"
 
 #: js/widgets/persistentfilter/EditPersistentFilterPanel.js:136
 msgid "You have to supply a name for the favorite!"
@@ -2349,7 +2391,9 @@ msgstr "Erro"
 
 #: js/widgets/container/GrantsDialog.js:126
 msgid "You are not allowed to remove all admins for this container!"
-msgstr "Você não tem permissão para remover todos os administradores deste repositório!"
+msgstr ""
+"Você não tem permissão para remover todos os administradores deste "
+"repositório!"
 
 #: js/widgets/container/FilterModel.js:142
 msgid "is personal of"
@@ -2444,7 +2488,9 @@ msgstr "Livre Ocupado"
 
 #: js/widgets/container/GrantsGrid.js:59
 msgid "The grant to access free busy information of events in this calendar"
-msgstr "O privilégio para acessar a informação de ventos livre ocupado neste calendário"
+msgstr ""
+"O privilégio para acessar a informação de ventos livre ocupado neste "
+"calendário"
 
 #: js/widgets/container/GrantsGrid.js:60
 msgid "Private"
@@ -2452,7 +2498,8 @@ msgstr "Privado0"
 
 #: js/widgets/container/GrantsGrid.js:61
 msgid "The grant to access records marked as private in this container"
-msgstr "O privilégio para acessar registros marcados como privados neste repositório"
+msgstr ""
+"O privilégio para acessar registros marcados como privados neste repositório"
 
 #: js/widgets/form/ConfigPanel.js:113
 msgid "Configuration Problem"
@@ -2496,8 +2543,12 @@ msgid "The last action you made was potentially not performed correctly."
 msgstr "A última ação que você fez pode não ter sido executada corretamente"
 
 #: js/ExceptionDialog.js:136
-msgid "Please help improving this software and notify the vendor. Include a brief description of what you where doing when the error occurred."
-msgstr "Por favor melhore este software e notifique o vendedor.  Inclua uma breve descrição do que você estava fazendo quando o erro ocorreu."
+msgid ""
+"Please help improving this software and notify the vendor. Include a brief "
+"description of what you where doing when the error occurred."
+msgstr ""
+"Por favor melhore este software e notifique o vendedor.  Inclua uma breve "
+"descrição do que você estava fazendo quando o erro ocorreu."
 
 #: js/ExceptionDialog.js:150
 msgid "Send Contact Information"
@@ -2531,18 +2582,15 @@ msgstr "Favor reiniciar seu navegador agora!"
 msgid "Your password expired. Please enter a new user password:"
 msgstr "Sua senha expirou. Entre com uma nova senha:"
 
-#: js/prototypeTranslations.js:20
-#: js/prototypeTranslations.js:21
+#: js/prototypeTranslations.js:20 js/prototypeTranslations.js:21
 msgid "Outdent Text"
 msgstr "Texto obsoleto"
 
-#: js/prototypeTranslations.js:22
-#: js/prototypeTranslations.js:23
+#: js/prototypeTranslations.js:22 js/prototypeTranslations.js:23
 msgid "Indent Text"
 msgstr "Indentar o Texto"
 
-#: js/prototypeTranslations.js:24
-#: js/prototypeTranslations.js:25
+#: js/prototypeTranslations.js:24 js/prototypeTranslations.js:25
 msgid "Remove Formatting"
 msgstr "Remover a Formatação"
 
@@ -2571,12 +2619,24 @@ msgid "Congratulations!"
 msgstr "Parabéns!"
 
 #: js/UserRegistration.js:171
-msgid "You have entered all needed information. If you press the Finish button we will send you the registration email."
-msgstr "Você informou todas as informações necessárias.  Se você pressionar o botão Terminar nós enviaremos o email de registro."
+msgid ""
+"You have entered all needed information. If you press the Finish button we "
+"will send you the registration email."
+msgstr ""
+"Você informou todas as informações necessárias.  Se você pressionar o botão "
+"Terminar nós enviaremos o email de registro."
 
 #: js/ux/PopupWindowManager.js:164
-msgid "The window you want to work with is backgrounded. Your browser doesn't support to foreground the window for you, so you need to use your operating systems window switching features. Please send complaints to your browser vendor!"
-msgstr "A janela que você quer trabalhar está no fundo.  Seu navegador não permite colocar a janela em primeiro plano, então você precisa usar a janela do seu sistema operacional alternando atributos.  Favor envie reclamações para o seu vendedor!"
+msgid ""
+"The window you want to work with is backgrounded. Your browser doesn't "
+"support to foreground the window for you, so you need to use your operating "
+"systems window switching features. Please send complaints to your browser "
+"vendor!"
+msgstr ""
+"A janela que você quer trabalhar está no fundo.  Seu navegador não permite "
+"colocar a janela em primeiro plano, então você precisa usar a janela do seu "
+"sistema operacional alternando atributos.  Favor envie reclamações para o "
+"seu vendedor!"
 
 #: js/ux/Percentage.js:190
 msgid "(paused)"
@@ -2628,7 +2688,9 @@ msgstr "Imagem falhou"
 
 #: js/ux/form/ImageField.js:146
 msgid "Could not load image. Please notify your Administrator"
-msgstr "Não foi possível carregar a image.  Favor informar ao Administrador do Sistema"
+msgstr ""
+"Não foi possível carregar a image.  Favor informar ao Administrador do "
+"Sistema"
 
 #: js/ux/form/ImageField.js:168
 msgid "Not An Image"
@@ -2640,14 +2702,14 @@ msgstr "Favor selecionar um arquivo de imagem (gif/png/jpeg)"
 
 #: js/ux/form/ImageField.js:211
 msgid "Could not upload image. Please notify your Administrator"
-msgstr "Não foi possível carregar a image.  Favor informar o Administrador do Sistema"
+msgstr ""
+"Não foi possível carregar a image.  Favor informar o Administrador do Sistema"
 
 #: js/ux/form/ImageField.js:224
 msgid "Change Image"
 msgstr "Alterar a Imagem"
 
-#: js/ux/form/ImageField.js:232
-#: js/ux/form/ImageField.js:250
+#: js/ux/form/ImageField.js:232 js/ux/form/ImageField.js:250
 msgid "Crop Image"
 msgstr "Obter Imagem"
 
@@ -2701,21 +2763,23 @@ msgid "%s's personal container"
 msgstr "%s's repositório pessoal"
 
 #: Container.php:1525
-msgid "You are not allowed to delete this Container. Please define another container as the default addressbook for internal contacts!"
-msgstr "Você não tem permissão para apagar este Repositório.  Favor definir outro repositório como catálogo de endereços para contatos internos!"
+msgid ""
+"You are not allowed to delete this Container. Please define another "
+"container as the default addressbook for internal contacts!"
+msgstr ""
+"Você não tem permissão para apagar este Repositório.  Favor definir outro "
+"repositório como catálogo de endereços para contatos internos!"
 
 # - =================== Added by SERPRO (begin) ==============================
 #: js/sieve/RulesGridPanel.js:214
 msgid "Action"
 msgstr "Ação"
 
-#: js/Expressomail.js:118
-#: js/Expressomail.js:120
+#: js/Expressomail.js:118 js/Expressomail.js:120
 msgid "Active Vacation Message"
 msgstr "Mensagem de férias ativa"
 
-#: js/MessageEditDialog.js:607
-#: js/MessageEditDialog.js:869
+#: js/MessageEditDialog.js:607 js/MessageEditDialog.js:869
 msgid "Compose email:"
 msgstr "Compor mensagem:"
 
@@ -2727,8 +2791,7 @@ msgstr "Criar novas contas de email"
 msgid "Export"
 msgstr "Exportar"
 
-#: js/GridDetailsPanel.js:
-#: 251
+#: js/GridDetailsPanel.js:251
 msgid "Verification Successful!"
 msgstr "Mensagem Verificada com Sucesso!"
 
@@ -2744,10 +2807,8 @@ msgstr "Novas mensagens"
 msgid "No connection to IMAP server."
 msgstr "Sem conexão com o servidor IMAP."
 
-#: js/AccountEditDialog.js:162
-#: js/AccountEditDialog.js:203
-#: js/AccountEditDialog.js:218
-#: js/AccountEditDialog.js:258
+#: js/AccountEditDialog.js:162 js/AccountEditDialog.js:203
+#: js/AccountEditDialog.js:218 js/AccountEditDialog.js:258
 #: js/ContactGrid.js:110
 msgid "None"
 msgstr "Nenhum"
@@ -2756,8 +2817,7 @@ msgstr "Nenhum"
 msgid "Send"
 msgstr "Enviar"
 
-#: js/GridPanel.js:519
-#: js/Model.js:490
+#: js/GridPanel.js:519 js/Model.js:490
 msgid "Sent"
 msgstr "Enviadas"
 
@@ -2778,8 +2838,12 @@ msgid "{0} account setting empty."
 msgstr "{0} configuração da conta vazia."
 
 #: js/MessageEditDialog.js:174
-msgid "Activate this toggle button to save the email text as a note attached to the recipient(s) contact(s)."
-msgstr "Ativar botão para salvar texto da mensagem como uma nota anexada ao(s) destinatário(s) no seu Catálogo de Endereços."
+msgid ""
+"Activate this toggle button to save the email text as a note attached to the "
+"recipient(s) contact(s)."
+msgstr ""
+"Ativar botão para salvar texto da mensagem como uma nota anexada ao(s) "
+"destinatário(s) no seu Catálogo de Endereços."
 
 #: js/TreeContextMenu.js:95
 msgid "Add Folder"
@@ -2821,8 +2885,7 @@ msgstr "Todos os destinatários"
 msgid "Delete trash messages after how many days"
 msgstr "Remover msgs da lixeira após quantos dias?"
 
-#: js/GridPanel.js:266
-#: js/MessageDisplayDialog.js:59
+#: js/GridPanel.js:266 js/MessageDisplayDialog.js:59
 msgid "Forward"
 msgstr "Encaminhar"
 
@@ -2838,8 +2901,7 @@ msgstr "HTML"
 msgid "ID"
 msgstr "ID"
 
-#: js/Expressomail.js:728
-#: js/Expressomail.js:761
+#: js/Expressomail.js:728 js/Expressomail.js:761
 msgid "IMAP Error"
 msgstr "Erro de IMAP"
 
@@ -2860,8 +2922,13 @@ msgid "No recipients set."
 msgstr "Nenhum destinatário informado."
 
 #: js/Expressomail.js:851
-msgid "One of your folders was deleted or renamed by another client. Please update the folder list of this account."
-msgstr "Uma de suas pastas foi excluída ou renomeada por outro cliente. Por favor atualize a lista de pastas desta conta. Se o problema persistir contate um administrador."
+msgid ""
+"One of your folders was deleted or renamed by another client. Please update "
+"the folder list of this account."
+msgstr ""
+"Uma de suas pastas foi excluída ou renomeada por outro cliente. Por favor "
+"atualize a lista de pastas desta conta. Se o problema persistir contate um "
+"administrador."
 
 #: js/MessageEditDialog.js:476
 msgid "Re:"
@@ -2887,8 +2954,7 @@ msgstr "Nome da pasta Enviadas"
 msgid "Set Filter Rules"
 msgstr "Configurar regras de filtro"
 
-#: js/GridDetailsPanel.js:141
-#: js/GridDetailsPanel.js:385
+#: js/GridDetailsPanel.js:141 js/GridDetailsPanel.js:385
 msgid "Show or hide header information"
 msgstr "Exibir ou esconder informações do cabeçalho"
 
@@ -2896,8 +2962,7 @@ msgstr "Exibir ou esconder informações do cabeçalho"
 msgid "Subject/From"
 msgstr "Assunto/De"
 
-#: js/GridPanel.js:512
-#: js/Model.js:145
+#: js/GridPanel.js:512 js/Model.js:145
 msgid "To"
 msgstr "Destinatário"
 
@@ -2929,8 +2994,7 @@ msgstr "Todas as mensagens marcadas como rascunho"
 msgid "All unread mail from Inbox"
 msgstr "Todas as mensagens não lidas"
 
-#: js/MessageEditDialog.js:
-#: 1133
+#: js/MessageEditDialog.js:1133
 msgid "Empty subject"
 msgstr "Assunto vazio"
 
@@ -2938,8 +3002,7 @@ msgstr "Assunto vazio"
 msgid "Number of contacts exceeds the maximum of 50 permitted."
 msgstr "Número de contatos excede o máximo de 50 permitidos."
 
-#: js/RecipientGrid.js:208
-#: js/RecipientGrid.js:232
+#: js/RecipientGrid.js:208 js/RecipientGrid.js:232
 msgid "To:"
 msgstr "Para:"
 
@@ -2971,13 +3034,11 @@ msgstr "Autenticação"
 msgid "Bcc"
 msgstr "Cco"
 
-#: Controller/Message/Send.php:236
-#: js/MessageEditDialog.js:834
+#: Controller/Message/Send.php:236 js/MessageEditDialog.js:834
 msgid "Body"
 msgstr "Corpo"
 
-#: js/RecipientGrid.js:211
-#: js/RecipientGrid.js:233
+#: js/RecipientGrid.js:211 js/RecipientGrid.js:233
 msgid "Cc:"
 msgstr "Cc:"
 
@@ -2987,7 +3048,8 @@ msgstr "Escolher sim, para mover as mensagens para a lixeira."
 
 #: Preference.php:115
 msgid "Compose Emails from the Addressbook with Expressomail."
-msgstr "Compor mensagens originadas no Catálogo de Endereços usando o Expressomail."
+msgstr ""
+"Compor mensagens originadas no Catálogo de Endereços usando o Expressomail."
 
 #: js/GridDetailsPanel.js:139
 msgid "Date"
@@ -3010,13 +3072,11 @@ msgstr "Trazendo mensagens... ({0}% done)"
 msgid "Forwarded"
 msgstr "Encaminhadas"
 
-#: js/GridDetailsPanel.js:136
-#: js/MessageEditDialog.js:765
+#: js/GridDetailsPanel.js:136 js/MessageEditDialog.js:765
 msgid "From"
 msgstr "De"
 
-#: js/sieve/RuleConditionsPanel.js:75
-#: js/sieve/RuleConditionsPanel.js:77
+#: js/sieve/RuleConditionsPanel.js:75 js/sieve/RuleConditionsPanel.js:77
 msgid "Header value"
 msgstr "Valor do cabeçalho"
 
@@ -3032,8 +3092,7 @@ msgstr "Sem conexão com o servidor IMAP: {0}"
 msgid "Plain"
 msgstr "Plain"
 
-#: js/GridPanel.js:320
-#: js/MessageDisplayDialog.js:72
+#: js/GridPanel.js:320 js/MessageDisplayDialog.js:72
 msgid "Print Message"
 msgstr "Imprimir mensagem"
 
@@ -3041,8 +3100,7 @@ msgstr "Imprimir mensagem"
 msgid "Remove from recipients"
 msgstr "Remover dos destinatários"
 
-#: js/GridPanel.js:248
-#: js/MessageDisplayDialog.js:47
+#: js/GridPanel.js:248 js/MessageDisplayDialog.js:47
 msgid "Reply"
 msgstr "Responder"
 
@@ -3062,16 +3120,12 @@ msgstr "Exibir mensagem de confirmação quando excluir mensagens."
 msgid "Sieve Error"
 msgstr "Erro de Sieve"
 
-#: js/GridPanel.js:
-#: 569
+#: js/GridPanel.js:569
 msgid "Signed"
 msgstr "Assinado"
 
-#: Controller/Message/Send.php:236
-#: js/GridDetailsPanel.js:135
-#: js/GridPanel.js:487
-#: js/MessageEditDialog.js:859
-#: js/Model.js:142
+#: Controller/Message/Send.php:236 js/GridDetailsPanel.js:135
+#: js/GridPanel.js:487 js/MessageEditDialog.js:859 js/Model.js:142
 #: js/sieve/RuleConditionsPanel.js:72
 msgid "Subject"
 msgstr "Assunto"
@@ -3084,13 +3138,11 @@ msgstr "Alternar destaque"
 msgid "Total Messages:"
 msgstr "Total de mensagens:"
 
-#: js/MessageEditDialog.js:
-#: 198
+#: js/MessageEditDialog.js:198
 msgid "Activate this toggle button to mark this message as important."
 msgstr "Ative este botão para marcar esta mensagem como importante."
 
-#: js/ImportEmlDialog.js:
-#: 165
+#: js/ImportEmlDialog.js:165
 msgid "File to Import"
 msgstr "Selecionar Arquivo para importar"
 
@@ -3098,8 +3150,7 @@ msgstr "Selecionar Arquivo para importar"
 msgid "All inboxes"
 msgstr "Todas as caixas de entrada"
 
-#: Controller/Message/Flags.php:24
-#: js/GridPanel.js:582
+#: Controller/Message/Flags.php:24 js/GridPanel.js:582
 msgid "Answered"
 msgstr "Respondida"
 
@@ -3123,8 +3174,7 @@ msgstr "Conta de Email"
 msgid "Empty Folder"
 msgstr "Esvaziar pasta"
 
-#: js/GridPanel.js:480
-#: js/Model.js:146
+#: js/GridPanel.js:480 js/Model.js:146
 msgid "Flags"
 msgstr "Etiquetas"
 
@@ -3142,10 +3192,10 @@ msgstr "De (Email e Nome)"
 
 #: Preference.php:111
 msgid "How often should Expressomail check for new Emails (in minutes)."
-msgstr "Frequência que o Expressomail deve verificar novas mensagens (em minutos)."
+msgstr ""
+"Frequência que o Expressomail deve verificar novas mensagens (em minutos)."
 
-#: js/sieve/VacationEditDialog.js:133
-#: js/sieve/VacationEditDialog.js:167
+#: js/sieve/VacationEditDialog.js:133 js/sieve/VacationEditDialog.js:167
 msgid "I am available (vacation message disabled)"
 msgstr "Estou disponível (mensagem de férias desabilitada)"
 
@@ -3157,8 +3207,7 @@ msgstr "IMAP"
 msgid "Incoming mails will be answered with this text:"
 msgstr "Mensagens recebida serão respondidas com este texto:"
 
-#: js/ContactGrid.js:341
-#: js/MessageEditDialog.js:454
+#: js/ContactGrid.js:341 js/MessageEditDialog.js:454
 msgid "Loading Mail Addresses"
 msgstr "Carregando endereços de correio"
 
@@ -3210,8 +3259,7 @@ msgstr "Porta (Padrão: 2000)"
 msgid "Save As Template"
 msgstr "Salvar como modelo"
 
-#: js/MessageEditDialog.js:342
-#: js/FileUpload.js:76
+#: js/MessageEditDialog.js:342 js/FileUpload.js:76
 msgid "Message Size Limit Exceeded"
 msgstr "Limite de Tamanho de Mensagem Excedido"
 
@@ -3250,8 +3298,7 @@ msgstr "Nome de usuário (opcional)"
 msgid "Your quota"
 msgstr "Sua cota"
 
-#: Model/Message.php:
-#: 179
+#: Model/Message.php:179
 msgid "in"
 msgstr "em"
 
@@ -3259,10 +3306,11 @@ msgstr "em"
 msgid "user"
 msgstr "Usuários"
 
-#: js/MessageEditDialog.js:
-#: 186
+#: js/MessageEditDialog.js:186
 msgid "Activate this toggle button to receive a reading confirmation."
-msgstr "Ative esta opção para receber uma confirmação de leitura dos destinatários deste email"
+msgstr ""
+"Ative esta opção para receber uma confirmação de leitura dos destinatários "
+"deste email"
 
 #: js/sieve/VacationEditDialog.js:191
 msgid "Only send all X days to the same sender"
@@ -3280,8 +3328,7 @@ msgstr "Salvar nota de email"
 msgid "Save Note default Value."
 msgstr "Salvar valor padrão de Nota"
 
-#: js/TreecontexMenu.js:
-#: 266
+#: js/TreecontexMenu.js:266
 msgid "Share mailbox"
 msgstr "Compartilhar pastas"
 
@@ -3289,8 +3336,7 @@ msgstr "Compartilhar pastas"
 msgid "Templates"
 msgstr "Modelos"
 
-#: Model/Message.php:
-#: 178
+#: Model/Message.php:178
 msgid "Was readed by:"
 msgstr "Foi lida por:"
 
@@ -3310,14 +3356,11 @@ msgstr "Adicionar como \"Para\""
 msgid "All inboxes of my email accounts"
 msgstr "Todas as caixas de entrada das minhas contas de email"
 
-#: js/GridDetailsPanel.js:232
-#: js/GridPanel.js:473
-#: js/MessageEditDialog.js:699
+#: js/GridDetailsPanel.js:232 js/GridPanel.js:473 js/MessageEditDialog.js:699
 msgid "Attachments"
 msgstr "Anexos"
 
-#: js/RecipientGrid.js:214
-#: js/RecipientGrid.js:234
+#: js/RecipientGrid.js:214 js/RecipientGrid.js:234
 msgid "Bcc:"
 msgstr "Cco:"
 
@@ -3327,7 +3370,8 @@ msgstr "Escolha o número de mensagens a serem exibidas em cada página."
 
 #: js/MessageEditDialog.js:240
 msgid "Click to search for and add recipients from the Addressbook."
-msgstr "Clique para buscar e adicionar destinatário(s) do Catálogo de Endereços."
+msgstr ""
+"Clique para buscar e adicionar destinatário(s) do Catálogo de Endereços."
 
 #: js/sieve/RulesGridPanel.js:206
 msgid "Conditions"
@@ -3345,8 +3389,7 @@ msgstr "Credenciais"
 msgid "Default Email Account"
 msgstr "Conta de email padrão"
 
-#: js/GridDetailsPanel.js:
-#: 245
+#: js/GridDetailsPanel.js:245
 msgid "Digital Signature"
 msgstr "Assinatura Digital"
 
@@ -3358,8 +3401,7 @@ msgstr "Intervalo de atualização de mensagens"
 msgid "Files are still uploading."
 msgstr "Arquivos ainda estão sendo carregados."
 
-#: js/GridPanel.js:499
-#: js/Model.js:144
+#: js/GridPanel.js:499 js/Model.js:144
 msgid "From (Name)"
 msgstr "De (Nome)"
 
@@ -3371,14 +3413,12 @@ msgstr "Cabeçalho contém"
 msgid "Header regex"
 msgstr "Expressão regular do cabeçalho"
 
-#: js/AccountEditDialog.js:141
-#: js/AccountEditDialog.js:184
+#: js/AccountEditDialog.js:141 js/AccountEditDialog.js:184
 #: js/AccountEditDialog.js:239
 msgid "Host"
 msgstr "Servidor"
 
-#: js/TreecontexMenu.js:
-#: 329
+#: js/TreecontexMenu.js:329
 msgid "Loading..."
 msgstr "Carregando..."
 
@@ -3386,17 +3426,15 @@ msgstr "Carregando..."
 msgid "Port (Default: 25)"
 msgstr "Porta (Padrão: 25)"
 
-#: js/GridPanel.js:1101
-#: js/GridPanel.js:1133
+#: js/GridPanel.js:1101 js/GridPanel.js:1133
 msgid "Quota unknown"
 msgstr "Cota desconhecida"
 
-#: js/GridPanel.js:257
-#: js/MessageDisplayDialog.js:53
+#: js/GridPanel.js:257 js/MessageDisplayDialog.js:53
 msgid "Reply To All"
 msgstr "Responder a todos"
 
-#msgid_plural "Rules"
+# msgid_plural "Rules"
 #: js/Model.js:678
 msgid "Rule"
 msgstr "Regra"
@@ -3405,13 +3443,11 @@ msgstr "Regra"
 msgid "SMTP Error"
 msgstr "Erro de SMTP"
 
-#: js/AccountEditDialog.js:164
-#: js/AccountEditDialog.js:205
+#: js/AccountEditDialog.js:164 js/AccountEditDialog.js:205
 msgid "SSL"
 msgstr "SSL"
 
-#: js/GridPanel.js:
-#: 472
+#: js/GridPanel.js:472
 msgid "Security"
 msgstr "Segurança"
 
@@ -3435,8 +3471,7 @@ msgstr "Para (Email)"
 msgid "\"{0}\" recipients"
 msgstr "\"{0}\" destinatários"
 
-#: Model/Message.php:
-#: 176
+#: Model/Message.php:176
 msgid "Your message:"
 msgstr "Sua mensagem: "
 
@@ -3451,8 +3486,7 @@ msgstr "Adicionar contato ao catálogo de endereços"
 msgid "Checking Contacts"
 msgstr "Verificando Contatos"
 
-#: js/GridPanel.js:
-#: 577
+#: js/GridPanel.js:577
 msgid "Compressed"
 msgstr "Compactado"
 
@@ -3472,14 +3506,9 @@ msgstr "Formato de Exibição"
 msgid "Download all attachments"
 msgstr "baixar todos os anexos"
 
-#: js/FolderFilterModel.js:30
-#: js/GridPanel.js:534
-#: js/Model.js:54
-#: js/Model.js:496
-#: js/TreeContextMenu.js:45
-#: js/TreeContextMenu.js:100
-#: js/TreeContextMenu.js:103
-#: js/TreeContextMenu.js:106
+#: js/FolderFilterModel.js:30 js/GridPanel.js:534 js/Model.js:54
+#: js/Model.js:496 js/TreeContextMenu.js:45 js/TreeContextMenu.js:100
+#: js/TreeContextMenu.js:103 js/TreeContextMenu.js:106
 msgid "Folders"
 msgstr "Pastas"
 
@@ -3487,8 +3516,7 @@ msgstr "Pastas"
 msgid "Header \"{0}\" matches \"{1}\""
 msgstr "Cabeçalho \"{0}\" combina com \"{1}\""
 
-#: js/TreecontexMenu.js:
-#: 284
+#: js/TreecontexMenu.js:284
 msgid "Import msg(eml)"
 msgstr "Importar msg(eml)"
 
@@ -3496,8 +3524,7 @@ msgstr "Importar msg(eml)"
 msgid "Last update:"
 msgstr "Última atualização:"
 
-#: js/GridDetailsPanel.js:
-#: 255
+#: js/GridDetailsPanel.js:255
 msgid "Verification Failed!"
 msgstr "Falha na Verificação da Mensagem!"
 
@@ -3505,8 +3532,7 @@ msgstr "Falha na Verificação da Mensagem!"
 msgid "New Mail"
 msgstr "Nova mensagem"
 
-#: js/MessageEditDialog.js:
-#: 178
+#: js/MessageEditDialog.js:178
 msgid "Reading Confirmation"
 msgstr "Confirmação de Leitura"
 
@@ -3524,13 +3550,11 @@ msgstr "Selecionar destinatários para \"{0}\""
 msgid "Signature position"
 msgstr "Posição da assinatura"
 
-#: js/GridPanel.js:542
-#: js/sieve/RuleConditionsPanel.js:73
+#: js/GridPanel.js:542 js/sieve/RuleConditionsPanel.js:73
 msgid "Size"
 msgstr "Tamanho"
 
-#: js/AccountEditDialog.js:163
-#: js/AccountEditDialog.js:204
+#: js/AccountEditDialog.js:163 js/AccountEditDialog.js:204
 #: js/AccountEditDialog.js:259
 msgid "TLS"
 msgstr "TLS"
@@ -3577,13 +3601,11 @@ msgstr "{0} %"
 msgid "{0} Message"
 msgstr "{0} mensagem"
 
-#: js/MessageEditDialog.js:
-#: 190
+#: js/MessageEditDialog.js:190
 msgid "Mark as Important"
 msgstr "Marcar como Importante"
 
-#: Model/Message.php:
-#: 175
+#: Model/Message.php:175
 msgid "Reading Confirmation:"
 msgstr "Confirmação de Leitura:"
 
@@ -3631,8 +3653,7 @@ msgstr "Contas de Email"
 msgid "Email account \"{0}\" has an active vacation message."
 msgstr "Conta de email \"{0}\" tem uma mensagem de férias ativa"
 
-#: js/GridPanel.js:
-#: 573
+#: js/GridPanel.js:573
 msgid "Encrypted"
 msgstr "Criptografado"
 
@@ -3640,8 +3661,7 @@ msgstr "Criptografado"
 msgid "Error:"
 msgstr "Erro:"
 
-#: js/sieve/RuleConditionsPanel.js:75
-#: js/sieve/RuleConditionsPanel.js:77
+#: js/sieve/RuleConditionsPanel.js:75 js/sieve/RuleConditionsPanel.js:77
 msgid "Header name"
 msgstr "Nome do cabeçalho"
 
@@ -3691,10 +3711,10 @@ msgstr "Nome da pasta Modelos"
 
 #: js/Expressomail.js:746
 msgid "Your email credentials are wrong. Please contact your administrator"
-msgstr "Suas credenciais de email estão erradas. Por favor contate seu administrador."
+msgstr ""
+"Suas credenciais de email estão erradas. Por favor contate seu administrador."
 
-#: js/GridPanel.js:
-#: 581
+#: js/GridPanel.js:581
 msgid "Certs Only"
 msgstr "Apenas Certificados"
 
@@ -3730,9 +3750,7 @@ msgstr "Mensagens exibidas por página."
 msgid "Enable"
 msgstr "Habilitar"
 
-#: js/GridPanel.js:493
-#: js/Model.js:143
-#: js/sieve/RuleConditionsPanel.js:69
+#: js/GridPanel.js:493 js/Model.js:143 js/sieve/RuleConditionsPanel.js:69
 msgid "From (Email)"
 msgstr "De (Email)"
 
@@ -3740,8 +3758,7 @@ msgstr "De (Email)"
 msgid "Header \"{0}\" contains \"{1}\""
 msgstr "Cabeçalho \"{0}\" contém \"{1}\""
 
-#: js/sieve/VacationEditDialog.js:140
-#: js/sieve/VacationEditDialog.js:168
+#: js/sieve/VacationEditDialog.js:140 js/sieve/VacationEditDialog.js:168
 msgid "I am not available (vacation message enabled)"
 msgstr "Não estou disponível (mensagem de férias habilitada)"
 
@@ -3773,9 +3790,7 @@ msgstr "Em {0}, {1} escreveu"
 msgid "Plain Text"
 msgstr "Texto Plano"
 
-#: js/GridPanel.js:312
-#: js/GridPanel.js:1258
-#: js/GridPanel.js:1274
+#: js/GridPanel.js:312 js/GridPanel.js:1258 js/GridPanel.js:1274
 #: js/MessageDisplayDialog.js:78
 msgid "Print Preview"
 msgstr "Visualizar impressão"
@@ -3784,8 +3799,7 @@ msgstr "Visualizar impressão"
 msgid "Quota usage"
 msgstr "Uso da cota"
 
-#: js/GridPanel.js:527
-#: js/Model.js:151
+#: js/GridPanel.js:527 js/Model.js:151
 msgid "Received"
 msgstr "Recebidas"
 
@@ -3793,8 +3807,7 @@ msgstr "Recebidas"
 msgid "Recent"
 msgstr "Recente"
 
-#: js/AccountEditDialog.js:151
-#: js/AccountEditDialog.js:193
+#: js/AccountEditDialog.js:151 js/AccountEditDialog.js:193
 #: js/AccountEditDialog.js:248
 msgid "Secure Connection"
 msgstr "Conexão Segura"
@@ -3811,38 +3824,34 @@ msgstr "Regras de filtro Sieve"
 msgid "Use in Addressbook"
 msgstr "Usar no Catálogo de Endereços"
 
-#: Backend/Imap.php:
-#: 194
+#: Backend/Imap.php:194
 msgid "cannot create folder"
 msgstr "Não foi possível criar a pasta"
 
-#: Backend/Imap.php:
-#: 194
+#: Backend/Imap.php:194
 msgid "it already exists."
 msgstr "ela já existe."
 
-#: Backend/Imap.php:
-#: 329
-msgid "cannot set flags, have you tried to set the recent flag or special chars?"
-msgstr "Não é possível mudar o status da mensagem, talvez já tenha sido mudado ou você não tem permissão."
+#: Backend/Imap.php:329
+msgid ""
+"cannot set flags, have you tried to set the recent flag or special chars?"
+msgstr ""
+"Não é possível mudar o status da mensagem, talvez já tenha sido mudado ou "
+"você não tem permissão."
 
-#: Backend/Imap.php:
-#: 76
+#: Backend/Imap.php:76
 msgid "Could not select "
 msgstr "Não foi possível selecionar "
 
-#: Backend/Imap.php:
-#: 398
+#: Backend/Imap.php:398
 msgid "folder not found"
 msgstr "Pasta não encontrada"
 
-#: Backend/Imap.php:
-#: 970
+#: Backend/Imap.php:970
 msgid "cannot set deleted flags"
 msgstr "Não foi possível setar flag de excluída"
 
-#: Backend/Imap.php:
-#: 180
+#: Backend/Imap.php:180
 msgid "cannot change folder, maybe it does not exist"
 msgstr "Não pode trocar folder, pode ser que não exista"
 
@@ -3870,8 +3879,7 @@ msgstr "Marcada"
 msgid "No Messages found or the cache is empty."
 msgstr "Nenhuma mensagem encontrada ou o cache está vazio."
 
-#: Model/Message.php:
-#: 177
+#: Model/Message.php:177
 msgid "Received in"
 msgstr "Recebida em"
 
@@ -3887,7 +3895,8 @@ msgstr "Adicionar aos Contatos"
 
 #: js/MessageEditDialog.js:236,371
 msgid "Activate this toggle button to add unknown recipient to contacts."
-msgstr "Ative este botão para adicionar destinatários desconhecidos aos Contatos."
+msgstr ""
+"Ative este botão para adicionar destinatários desconhecidos aos Contatos."
 
 #: js/MessageEditDialog.js:371,425
 msgid "Error saving unknown contacts."
@@ -3901,93 +3910,79 @@ msgstr "Contatos Coletados"
 msgid "Saving unknown recipients to Unknown Contacts folder..."
 msgstr "Salvando destinatários na pasta Contatos Coletados..."
 
-#: js/GridDetailsPanel.js:
-#: 547
+#: js/GridDetailsPanel.js:547
 msgid "Verification Details"
 msgstr "Detalhes da Verificação"
 
-#: js/GridDetailsPanel.js:
-#: 542
+#: js/GridDetailsPanel.js:542
 msgid "Serial Number"
 msgstr "Serial"
 
-#: js/GridDetailsPanel.js:
-#: 542
+#: js/GridDetailsPanel.js:542
 msgid "Issuer"
 msgstr "Emissor"
 
-#: js/GridDetailsPanel.js:
-#: 542
+#: js/GridDetailsPanel.js:542
 msgid "Owner"
 msgstr "Dono"
 
-#: js/GridDetailsPanel.js:
-#: 542
+#: js/GridDetailsPanel.js:542
 msgid "Valid From"
 msgstr "Válido a Partir de"
 
-#: js/GridDetailsPanel.js:
-#: 542
+#: js/GridDetailsPanel.js:542
 msgid "Valid To"
 msgstr "Válido Até"
 
-#: Smime.php:
-#: 129
+#: Smime.php:129
 msgid "Message Integrity Verification Failure"
 msgstr "Falha na Verificação da Integridade da Mensagem"
 
-#: js/GridDetailsPanel.js:
-#: 561
+#: js/GridDetailsPanel.js:561
 msgid "Sender email is different from Digital Certificate email"
 msgstr "E-mail do Remetente Diferente do E-mail Informado no Certificado"
 
-#: js/GridDetailsPanel.js:
-#: 392
+#: js/GridDetailsPanel.js:392
 msgid "show details of digitial signature verification"
 msgstr "mostra detalhes da verificação da assinatura"
 
-#: Preference.php:
-#: 166
+#: Preference.php:166
 msgid "Digitally sign messages by default when sending mail"
 msgstr "Sempre assinar digitalmente as mensagens"
 
-#: Preference.php:
-#: 166
-msgid "Choose yes, to open message editor with toggle button \"Sign Message\" pressed"
-msgstr "Escolher sim para sempre abrir o editor de mensagens com a opção \"Assinar Mensagem\" selecionada"
+#: Preference.php:166
+msgid ""
+"Choose yes, to open message editor with toggle button \"Sign Message\" "
+"pressed"
+msgstr ""
+"Escolher sim para sempre abrir o editor de mensagens com a opção \"Assinar "
+"Mensagem\" selecionada"
 
-#: js/TreeContextMenu.js:
-#: 194
+#: js/TreeContextMenu.js:194
 msgid "Delete Folder"
 msgstr "Apagar Pasta"
 
-#: js/TreeContextMenu.js:
-#: 199
+#: js/TreeContextMenu.js:199
 msgid "Warning"
 msgstr "Aviso"
 
-#: js/TreeContextMenu.js:
-#: 199
+#: js/TreeContextMenu.js:199
 msgid "Delete your sub-folders first."
 msgstr "Delete as sub-pastas primeiro."
 
-#: js/TreeContextMenu.js:
-#: 199
+#: js/TreeContextMenu.js:199
 msgid "Digitally Sign Mail"
 msgstr "Assinar Digitalmente"
 
-#: js/TreeContextMenu.js:
-#: 199
+#: js/TreeContextMenu.js:199
 msgid "Activate this toggle button to sign a message on send"
 msgstr "Ative este botão para assinar digitalmente a mensagem"
 
-#: js/GridDetailsPanel.js:
-#: 656
+#: js/GridDetailsPanel.js:656
 msgid "Block Sender"
 msgstr "Bloquear remetente"
 
-#: js/GridDetailsPanel.js:
-#: 657
+#: js/GridDetailsPanel.js:657
 msgid "Block incoming messages from this sender?"
 msgstr "Bloquear mensagens enviadas por este remetente"
 
@@ -4009,8 +4004,7 @@ msgstr "Todos os campos devem ser preenchidos"
 msgid "One or more contacts have not been added to the folder "
 msgstr "Um ou mais contatos não puderam ser adicionados a pasta "
 
-#: js/MessageEditDialog.js:
-#: 318, 321
+#: js/MessageEditDialog.js: 318, 321
 msgid "Checking existance of unknown recipients..."
 msgstr "Verificando existência de destinatários desconhecidos..."
 
@@ -4026,8 +4020,7 @@ msgstr "Número Máximo de Resultados em Buscas de Mensagens"
 msgid "New Mail (encrypted)"
 msgstr "Nova mensagem (cifrada)"
 
-#: Expressomail/js/GridPanel.js:260
-#: Expressomail/js/MessageDisplayDialog.js:67
+#: Expressomail/js/GridPanel.js:260 Expressomail/js/MessageDisplayDialog.js:67
 #: Expressomail/js/MessageEditDialog.js:158
 msgid "encrypted"
 msgstr "cifrada"
@@ -4037,8 +4030,12 @@ msgid "Enable sending encrypted messages"
 msgstr "Habilitar o envio de mensagens cifradas"
 
 #: Preference.php:177
-msgid "Choose yes, to enable sending encrypted messages (only if preference \"Windows Type\" is set to \"Browser windows\")."
-msgstr "Escolher sim, para habilitar o envio de mensagens cifradas (somente se a preferência \"Tipo da Janela\" for \"Browser windows\")."
+msgid ""
+"Choose yes, to enable sending encrypted messages (only if preference "
+"\"Windows Type\" is set to \"Browser windows\")."
+msgstr ""
+"Escolher sim, para habilitar o envio de mensagens cifradas (somente se a "
+"preferência \"Tipo da Janela\" for \"Browser windows\")."
 
 #: Expressomail/js/MessageEditDialog.js:158
 msgid "No valid certificate found for this email address."
@@ -4046,7 +4043,9 @@ msgstr "Um certificado válido não foi encontrado para esse endereço de email.
 
 #: Expressomail/js/MessageEditDialog.js:158
 msgid "No valid certificate found for one or more of these email address."
-msgstr "Os certificados dos seguintes usuários não foram encontrados ou são inválidos ou não puderam ser validados: "
+msgstr ""
+"Os certificados dos seguintes usuários não foram encontrados ou são "
+"inválidos ou não puderam ser validados: "
 
 #: Expressomail/js/Expressomail.js:1207
 msgid "Loading Criptography Components..."
@@ -4054,7 +4053,8 @@ msgstr "Carregando componentes de criptografia..."
 
 #: Expressomail/js/Expressomail.js:1239
 msgid "Failure loading criptography components, please try again."
-msgstr "Falha ao carregar os componentes de criptografia, por favor tente novamente."
+msgstr ""
+"Falha ao carregar os componentes de criptografia, por favor tente novamente."
 
 #: Expressomail/js/Expressomail.js:1368
 msgid "Failure decrypting the message, please try again."
@@ -4116,7 +4116,9 @@ msgstr "Sua lixeira não está vazia!"
 
 #: Expressomail/js/GridPanel.js:1091
 msgid "You can CANCEL this operation and clean trash before try again."
-msgstr "Você pode CANCELAR esta operação e limpar a lixeira antes de tentar novamente."
+msgstr ""
+"Você pode CANCELAR esta operação e limpar a lixeira antes de tentar "
+"novamente."
 
 #: Expressomail/js/GridPanel.js:1092
 msgid "or,"
@@ -4180,20 +4182,109 @@ msgstr "Mensagem Anexada"
 msgid "Saving as a draft..."
 msgstr "Salvando como rascunho..."
 
-#: Expressomail/js/MessageEditDialog.js:270
-#: Expressomail/js/GridPanel.js:1709
+#: Expressomail/js/MessageEditDialog.js:270 Expressomail/js/GridPanel.js:1709
 msgid "Failed to save draft!"
 msgstr "Erro ao salvar o rascunho!"
 
 #: Expressomail/js/GridPanel.js:1591
-msgid "Save as a draft?"
-msgstr "Salvar como rascunho?"
+msgid "Keep as a draft?"
+msgstr "Manter como rascunho?"
 
 #: Expressomail/js/GridPanel.js:1710
-msgid "A draft could not be saved. Maybe the connection to the server was lost."
+msgid ""
+"A draft could not be saved. Maybe the connection to the server was lost."
 msgstr "O rascunho não pode ser salvo. Verifique a conexão com o servidor."
 
 #: js/AdminPanel.js:61
 msgid "Interval (in seconds) for Auto Saving Drafts (0 to disable)"
-msgstr "Intervalo (em segundos) de auto salvamento de rascunhos (0 para desabilitar)"
+msgstr ""
+"Intervalo (em segundos) de auto salvamento de rascunhos (0 para desabilitar)"
 
+#: js/MessageEditDialog.js:587
+msgid "Network problem."
+msgstr "Problema de comunicação."
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:365
+msgid "Delivery Status Notification Message"
+msgstr "Mensagem de Notificação de Status de Entrega"
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:371
+msgid "Recipient"
+msgstr "Destinatário"
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:394
+msgid "Cause"
+msgstr "Motivo"
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:383
+msgid "Permanent Failure"
+msgstr "Falha Permanente"
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:380
+msgid "Persistent Transient Failure"
+msgstr "Falha Transitória Persistente, Tente Novamente Mais Tarde"
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:386
+msgid "Successful Delivery"
+msgstr "Entrega Obteve Sucesso"
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:274
+msgid "Domain Not Found"
+msgstr "Domínio não Encontrado"
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:269
+msgid "Recipient Address Not Found"
+msgstr "Endereço do Destinatário não Encontrado"
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:276
+msgid "Mailbox Full"
+msgstr "Caixa de Mensagem do Destinatário Está Cheia"
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:263
+msgid "Unknown Status"
+msgstr "Status Desconhecido"
+
+#: js/AdminPanel.js:65
+msgid "Email to which to report phishing"
+msgstr "Email para o qual relatar <i>phishing</i>"
+
+#: js/GridPanel.js:578 js/GridPanel.js:662
+msgid "Report phishing"
+msgstr "Denunciar phishing"
+
+#: js/GridPanel.js:663
+msgid ""
+"Phishing are messages with the intention of getting personal data like:<br/"
+">passwords, finantial data like credit card numbers and so on."
+msgstr ""
+"<i>Phishing</i> são mensagens com a finalidade de adquirir dados pessoais de "
+"diversos tipos:<br/>senhas, dados financeiros como número de cartões de "
+"crédito e outros dados pessoais."
+
+#: js/GridPanel.js:669
+msgid "Report listed messages as phishing?"
+msgstr "Reportar para o suporte as mensagens listadas como <i>phishing</i>?"
+
+#: js/GridPanel.js:674
+msgid "Sending phishing report..."
+msgstr "Enviando relatório de <i>phishing</i>..."
+
+#: js/GridPanel.js:683
+msgid "Phishing - {0} message"
+msgid_plural "Phishing - {0} messages"
+msgstr[0] "Phishing - {0} mensagem"
+msgstr[1] "Phishing - {0} mensagens"
+
+#: js/GridPanel.js:687
+msgid "At {0}, user {1} reported attached message as phishing:"
+msgid_plural "At {0}, user {1} reported attached messages as phishing:"
+msgstr[0] ""
+"Em {0}, o usuário {1} reportou a mensagem em anexo como <i>phishing</i>:"
+msgstr[1] ""
+"Em {0}, o usuário {1} reportou as mensagens em anexo como <i>phishing</i>:"
+
+msgid "Failed to send phishing report!"
+msgstr "Erro no envio!"
+
+msgid "Your phishing report could not be send."
+msgstr "Sua denúncia de <i>phishing</i> não pode ser enviada."
index 40d9216..4f7124a 100644 (file)
@@ -1191,7 +1191,7 @@ msgid "Failed to save draft!"
 msgstr ""
 
 #: Expressomail/js/GridPanel.js:1591
-msgid "Save as a draft?"
+msgid "Keep as a draft?"
 msgstr ""
 
 #: Expressomail/js/GridPanel.js:1710
@@ -1201,3 +1201,88 @@ msgstr ""
 #: js/AdminPanel.js:61
 msgid "Interval (in seconds) for Auto Saving Drafts (0 to disable)"
 msgstr ""
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:365
+msgid "Delivery Status Notification Message"
+msgstr ""
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:371
+msgid "Recipient"
+msgstr ""
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:394
+msgid "Cause"
+msgstr ""
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:383
+msgid "Permanent Failure"
+msgstr ""
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:380
+msgid "Persistent Transient Failure"
+msgstr ""
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:386
+msgid "Successful Delivery"
+msgstr ""
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:274
+msgid "Domain Not Found"
+msgstr ""
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:270
+msgid "Recipient Address Not Found"
+msgstr ""
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:277
+msgid "Mailbox Full"
+msgstr ""
+
+#: Expressomail/Model/DeliveryStatusNotificationMessagePart.php:263
+msgid "Unknown Status"
+msgstr ""
+
+#: js/AdminPanel.js:65
+msgid "Email to which to report phishing"
+msgstr ""
+
+#: js/GridPanel.js:578
+#: js/GridPanel.js:662
+msgid "Report phishing"
+msgstr ""
+
+#: js/GridPanel.js:663
+msgid "Phishing are messages with the intention of getting personal data like:<br/>passwords, finantial data like credit card numbers and so on."
+msgstr ""
+
+#: js/GridPanel.js:669
+msgid "Report listed messages as phishing?"
+msgstr ""
+
+#: js/GridPanel.js:674
+msgid "Sending phishing report..."
+msgstr ""
+
+#: js/GridPanel.js:683
+msgid "Phishing - {0} message"
+msgid_plural "Phishing - {0} messages"
+msgstr[0] ""
+msgstr[1] ""
+
+#: js/GridPanel.js:687
+msgid "At {0}, user {1} reported attached message as phishing:"
+msgid_plural "At {0}, user {1} reported attached messages as phishing:"
+msgstr[0] ""
+msgstr[1] ""
+
+#:js/GridPanel.js:715
+msgid "Failed to send phishing report!"
+msgstr ""
+
+#: js/MessageEditDialog.js:587
+msgid "Network problem."
+msgstr ""
+
+#:js/GridPanel.js:716
+msgid "Your phishing report could not be send."
+msgstr ""
index df80c17..976b0bd 100644 (file)
@@ -174,6 +174,13 @@ class Tinebase_Core
     const TINEBASE_SERVER_PLUGINS = 'Tinebase_Server_Plugins';
 
     /**
+     * name of frontend server class
+     *
+     * @var string
+     */
+    const SERVER_CLASS_NAME = 'serverclassname';
+
+    /**
      * Application Instance Cache
      * @var array
      */