Merge remote-tracking branch 'origin/support/3.0' into develop

This commit is contained in:
acognet
2022-03-16 09:44:33 +01:00
77 changed files with 604 additions and 349 deletions

View File

@@ -200,6 +200,17 @@ abstract class ActionNotification extends Action
*/
class ActionEmail extends ActionNotification
{
/**
* @var string
* @since 3.0.1
*/
const ENUM_HEADER_NAME_MESSAGE_ID = 'Message-ID';
/**
* @var string
* @since 3.0.1
*/
const ENUM_HEADER_NAME_REFERENCES = 'References';
/**
* @inheritDoc
*/
@@ -207,13 +218,13 @@ class ActionEmail extends ActionNotification
{
$aParams = array
(
"category" => "grant_by_profile,core/cmdb,application",
"key_type" => "autoincrement",
"name_attcode" => "name",
"state_attcode" => "",
"reconc_keys" => array('name'),
"db_table" => "priv_action_email",
"db_key_field" => "id",
"category" => "grant_by_profile,core/cmdb,application",
"key_type" => "autoincrement",
"name_attcode" => "name",
"state_attcode" => "",
"reconc_keys" => array('name'),
"db_table" => "priv_action_email",
"db_key_field" => "id",
"db_finalclass_field" => "",
);
MetaModel::Init_Params($aParams);
@@ -416,9 +427,8 @@ class ActionEmail extends ActionNotification
$sBody = MetaModel::ApplyParams($this->Get('body'), $aContextArgs);
$oObj = $aContextArgs['this->object()'];
$sMessageId = sprintf('iTop_%s_%d_%f@%s.openitop.org', get_class($oObj), $oObj->GetKey(), microtime(true /* get as float*/),
MetaModel::GetEnvironmentId());
$sReference = '<'.$sMessageId.'>';
$sMessageId = $this->GenerateIdentifierForHeaders($oObj, static::ENUM_HEADER_NAME_MESSAGE_ID);
$sReference = $this->GenerateIdentifierForHeaders($oObj, static::ENUM_HEADER_NAME_REFERENCES);
}
catch (Exception $e) {
/** @noinspection PhpUnhandledExceptionInspection */
@@ -456,8 +466,7 @@ class ActionEmail extends ActionNotification
$oEmail = new EMail();
if ($this->IsBeingTested())
{
if ($this->IsBeingTested()) {
$oEmail->SetSubject('TEST['.$sSubject.']');
$sTestBody = $sBody;
$sTestBody .= "<div style=\"border: dashed;\">\n";
@@ -467,8 +476,8 @@ class ActionEmail extends ActionNotification
$sTestBody .= "<li>TO: $sTo</li>\n";
$sTestBody .= "<li>CC: $sCC</li>\n";
$sTestBody .= "<li>BCC: $sBCC</li>\n";
$sTestBody .= empty($sFromLabel) ? "<li>From: $sFrom</li>\n": "<li>From: $sFromLabel &lt;$sFrom&gt;</li>\n";
$sTestBody .= empty($sReplyToLabel) ? "<li>Reply-To: $sReplyTo</li>\n": "<li>Reply-To: $sReplyToLabel &lt;$sReplyTo&gt;</li>\n";
$sTestBody .= empty($sFromLabel) ? "<li>From: $sFrom</li>\n" : "<li>From: $sFromLabel &lt;$sFrom&gt;</li>\n";
$sTestBody .= empty($sReplyToLabel) ? "<li>Reply-To: $sReplyTo</li>\n" : "<li>Reply-To: $sReplyToLabel &lt;$sReplyTo&gt;</li>\n";
$sTestBody .= "<li>References: $sReference</li>\n";
$sTestBody .= "</ul>\n";
$sTestBody .= "</p>\n";
@@ -478,9 +487,9 @@ class ActionEmail extends ActionNotification
$oEmail->SetRecipientFrom($sFrom, $sFromLabel);
$oEmail->SetReferences($sReference);
$oEmail->SetMessageId($sMessageId);
}
else
{
// Note: N°4849 We pass the "References" identifier instead of the "Message-ID" on purpose as we want notifications emails to group around the triggering iTop object, not just the users' replies to the notification
$oEmail->SetInReplyTo($sReference);
} else {
$oEmail->SetSubject($sSubject);
$oEmail->SetBody($sBody, 'text/html', $sStyles);
$oEmail->SetRecipientTO($sTo);
@@ -490,6 +499,8 @@ class ActionEmail extends ActionNotification
$oEmail->SetRecipientReplyTo($sReplyTo, $sReplyToLabel);
$oEmail->SetReferences($sReference);
$oEmail->SetMessageId($sMessageId);
// Note: N°4849 We pass the "References" identifier instead of the "Message-ID" on purpose as we want notifications emails to group around the triggering iTop object, not just the users' replies to the notification
$oEmail->SetInReplyTo($sReference);
}
if (isset($aContextArgs['attachments']))
@@ -516,26 +527,64 @@ class ActionEmail extends ActionNotification
{
case EMAIL_SEND_OK:
return "Sent";
case EMAIL_SEND_PENDING:
return "Pending";
case EMAIL_SEND_ERROR:
return "Errors: ".implode(', ', $aErrors);
}
}
}
else
{
if (is_array($this->m_aMailErrors) && count($this->m_aMailErrors) > 0)
{
} else {
if (is_array($this->m_aMailErrors) && count($this->m_aMailErrors) > 0) {
$sError = implode(', ', $this->m_aMailErrors);
}
else
{
} else {
$sError = 'Unknown reason';
}
return 'Notification was not sent: '.$sError;
}
}
/**
* @param \DBObject $oObject
* @param string $sHeaderName {@see \ActionEmail::ENUM_HEADER_NAME_REFERENCES}, {@see \ActionEmail::ENUM_HEADER_NAME_MESSAGE_ID}
*
* @return string The formatted identifier for $sHeaderName based on $oObject
* @throws \Exception
* @since 3.0.1 N°4849
*/
protected function GenerateIdentifierForHeaders(DBObject $oObject, string $sHeaderName): string
{
$sObjClass = get_class($oObject);
$sObjId = $oObject->GetKey();
$sAppName = utils::Sanitize(ITOP_APPLICATION_SHORT, '', utils::ENUM_SANITIZATION_FILTER_VARIABLE_NAME);
switch ($sHeaderName) {
case static::ENUM_HEADER_NAME_MESSAGE_ID:
case static::ENUM_HEADER_NAME_REFERENCES:
// Prefix
$sPrefix = sprintf('%s_%s_%d', $sAppName, $sObjClass, $sObjId);
if ($sHeaderName === static::ENUM_HEADER_NAME_MESSAGE_ID) {
$sPrefix .= sprintf('_%f', microtime(true /* get as float*/));
}
// Suffix
$sSuffix = sprintf('@%s.openitop.org', MetaModel::GetEnvironmentId());
// Identifier
$sIdentifier = $sPrefix.$sSuffix;
if ($sHeaderName === static::ENUM_HEADER_NAME_REFERENCES) {
$sIdentifier = "<$sIdentifier>";
}
return $sIdentifier;
}
// Requested header name invalid
$sErrorMessage = sprintf('%s: Could not generate identifier for header "%s", only %s are supported', static::class, $sHeaderName, implode(' / ', [static::ENUM_HEADER_NAME_MESSAGE_ID, static::ENUM_HEADER_NAME_REFERENCES]));
IssueLog::Error($sErrorMessage, LogChannels::NOTIFICATIONS, [
'Object' => $sObjClass.'::'.$sObjId.' ('.$oObject->GetRawName().')',
'Action' => get_class($this).'::'.$this->GetKey().' ('.$this->GetRawName().')',
]);
throw new Exception($sErrorMessage);
}
}

View File

@@ -496,6 +496,14 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => true,
],
'cron_task_max_execution_time' => [
'type' => 'integer',
'description' => 'Background tasks will use this value (integer) multiplicated by its periodicity (in seconds) as max duration per cron execution. 0 is unlimited time',
'default' => 0,
'value' => 0,
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'cron_sleep' => [
'type' => 'integer',
'description' => 'Duration (seconds) before cron.php checks again if something must be done',

View File

@@ -325,20 +325,33 @@ class EMail
// Note: Swift will add the angle brackets for you
// so let's remove the angle brackets if present, for historical reasons
$sId = str_replace(array('<', '>'), '', $sId);
$oMsgId = $this->m_oMessage->getHeaders()->get('Message-ID');
$oMsgId->SetId($sId);
}
public function SetReferences($sReferences)
{
$this->AddToHeader('References', $sReferences);
}
/**
* Set the "In-Reply-To" header to allow emails to group as a conversation in modern mail clients (GMail, Outlook 2016+, ...)
*
* @link https://en.wikipedia.org/wiki/Email#Header_fields
*
* @param string $sMessageId
*
* @since 3.0.1 N°4849
*/
public function SetInReplyTo(string $sMessageId)
{
$this->AddToHeader('In-Reply-To', $sMessageId);
}
public function SetBody($sBody, $sMimeType = 'text/html', $sCustomStyles = null)
{
if (($sMimeType === 'text/html') && ($sCustomStyles !== null))
{
if (($sMimeType === 'text/html') && ($sCustomStyles !== null)) {
$oDomDocument = CssInliner::fromHtml($sBody)->inlineCss($sCustomStyles)->getDomDocument();
HtmlPruner::fromDomDocument($oDomDocument)->removeElementsWithDisplayNone();
$sBody = CssToAttributeConverter::fromDomDocument($oDomDocument)->convertCssToVisualAttributes()->render(); // Adds html/body tags if not already present

View File

@@ -544,7 +544,13 @@ class LogChannels
{
public const APC = 'apc';
public const CLI = 'CLI';
/**
* @var string
* @since 3.0.1 N°4849
*/
public const NOTIFICATIONS = 'notifications';
public const CLI = 'CLI';
/**
* @var string

View File

@@ -20,9 +20,9 @@
* @copyright Copyright (C) 2021 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*
*
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:UserExternal' => 'Externer Benutzer',
'Class:UserExternal+' => 'Externe authentifizierter '.ITOP_APPLICATION_SHORT.'-Benutzer',
'Class:UserExternal+' => 'Extern authentifizierter '.ITOP_APPLICATION_SHORT.'-Benutzer',
));

View File

@@ -20,7 +20,7 @@
* @copyright Copyright (C) 2021 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*
*
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:UserLocal' => ITOP_APPLICATION_SHORT.'-Benutzer',
@@ -44,5 +44,5 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Error:UserLocalPasswordValidator:UserPasswordPolicyRegex:ValidationFailed' => 'Das Passwort entspricht nicht dem in den Konfigurationsregeln hinterlegten RegEx-Ausdruck',
'UserLocal:password:expiration' => 'Die folgenden Felder benötigen eine '.ITOP_APPLICATION_SHORT.' Erweiterung',
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Setting password expiration to "One-time password" is not allowed for your own User~~',
'Class:UserLocal/Error:OneTimePasswordChangeIsNotAllowed' => 'Das setzen des Passwortablaufs auf "Einmalpasswort" ist für den eigenen Benutzer nicht erlaubt.',
));

View File

@@ -22,5 +22,5 @@
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'theme:darkmoon' => 'Dark moon~~',
));
'theme:darkmoon' => 'Dark moon',
));

View File

@@ -24,7 +24,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'DBTools:Class' => 'Klasse',
'DBTools:Title' => 'Datenbankpflege-Tools',
'DBTools:ErrorsFound' => 'Fehler gefunden',
'DBTools:Indication' => 'Wichtig: Nach dem Fixen der Errors in der Datenbank müssen Sie die Analyse erneut laufen lassen, weil durch die Fixes eventuell weitere Inkonsistenzen enstanden sind',
'DBTools:Indication' => 'Wichtig: Nach dem Fixen der Errors in der Datenbank müssen Sie die Analyse erneut laufen lassen, weil durch die Fixes eventuell weitere Inkonsistenzen entstanden sind',
'DBTools:Disclaimer' => 'DISCLAIMER: FERTIGEN SIE EIN BACKUP IHRER DATENBANK AN, BEVOR SIE DIE FIXES ANWENDEN!',
'DBTools:Error' => 'Fehler',
'DBTools:Count' => 'Anzahl',
@@ -51,7 +51,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'DBAnalyzer-Integrity-MissingExtKey' => 'Fehlender Externer Key %1$s (Spalte: `%2$s.%3$s`)',
'DBAnalyzer-Integrity-InvalidValue' => 'Ungültiger Wert für %1$s (Spalte: `%2$s.%3$s`)',
'DBAnalyzer-Integrity-UsersWithoutProfile' => 'Manche Benutzerkonten haben keinerlei zugewiesenes Profil',
'DBAnalyzer-Integrity-HKInvalid' => 'Broken hierarchical key `%1$s`~~',
'DBAnalyzer-Integrity-HKInvalid' => 'Kaputter hierarchischer Schlüssel `%1$s`',
'DBAnalyzer-Fetch-Count-Error' => 'Fetch-Count-Fehler in `%1$s`, %2$d Einträge geholt (fetched) / %3$d gezählt',
'DBAnalyzer-Integrity-FinalClass' => 'Das Feld `%2$s`.`%1$s` muss den gleichen Wert `%3$s`.`%1$s` haben',
'DBAnalyzer-Integrity-RootFinalClass' => 'Das Feld `%2$s`.`%1$s` muss eine gültige Klasse enthalten',

View File

@@ -65,6 +65,9 @@ try
switch ($sOperation)
{
case 'add':
$oPage = new JsonPage();
$oPage->SetOutputDataOnly(true);
$aResult = array(
'error' => '',
'att_id' => 0,
@@ -111,7 +114,7 @@ try
$aResult['error'] = $e->GetMessage();
}
}
$oPage->add(json_encode($aResult));
$oPage->SetData($aResult);
break;
case 'remove':

View File

@@ -20,7 +20,7 @@
* @copyright Copyright (C) 2021 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*
*
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
@@ -35,15 +35,15 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'bkp-mysqldump-issue' => 'mysqldump konnte nicht ausgeführt werden (retcode=%1$d): Stellen Sie sicher, dass das Programm installiert und im angegebenen Pfad verfügbar ist, oder editieren Sie die Konfigurationsdatei um das MySQL bindir anzupassen.',
'bkp-missing-dir' => 'Zielverzeichniss <code>%1$s</code> nicht gefunden',
'bkp-free-disk-space' => '<b>%1$s frei</b> in <code>%2$s</code>',
'bkp-dir-not-writeable' => '%1$s ist nicht schreibbar',
'bkp-dir-not-writeable' => '%1$s ist nicht beschreibbar',
'bkp-wrong-format-spec' => 'Die verwendete Definition zur Formatierung von Dateinamen ist nicht korrekt (%1$s). Die Standard-Definition %2$s wird verwendet',
'bkp-name-sample' => 'Backup-Dateien werden abhängig von Datum, Zeit und Datenbank-Identifier erstellt. Beispiel: %1$s',
'bkp-week-days' => 'Backups werden <b>jeden %1$s um %2$s durchgeführt</b>',
'bkp-retention' => 'Mindestens <b>%1$d Backups werden im Zielverzeichniss vorgehalten</b>',
'bkp-retention' => 'Mindestens <b>%1$d Backups werden im Zielverzeichnis vorgehalten</b>',
'bkp-next-to-delete' => 'Wird gelöscht, wenn das nächste Backup angelegt wird (unter Einstellungen "Menge vorhalten")',
'bkp-table-file' => 'Datei',
'bkp-table-file+' => 'Nur Dateien mit der Endung .zip werden als Backup-Dateien berücksichtigt.',
'bkp-table-size' => 'Grösse',
'bkp-table-size' => 'Größe',
'bkp-table-size+' => '',
'bkp-table-actions' => 'Aktionen',
'bkp-table-actions+' => '',
@@ -51,7 +51,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'bkp-status-backups-manual' => 'Manuelle Backups',
'bkp-status-backups-none' => 'Kein Backup vorhanden',
'bkp-next-backup' => 'Das nächste Backup wird am <b>%1$s</b> (%2$s) um %3$s durchgeführt',
'bkp-next-backup-unknown' => 'The next backup is <b>not scheduled</b> yet.~~',
'bkp-next-backup-unknown' => 'Das nächste Backup ist <b>noch nicht geplant</b>.',
'bkp-button-backup-now' => 'Starte Backup',
'bkp-button-restore-now' => 'Wiederherstellen!',
'bkp-confirm-backup' => 'Bitte bestätigen Sie, dass Sie jetzt ein Backup erstellen wollen.',

View File

@@ -20,7 +20,7 @@
* @copyright Copyright (C) 2021 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*
*
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:ChangeManagement' => 'Change Management',
@@ -98,7 +98,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Change/Attribute:reject_reason+' => '',
'Class:Change/Attribute:changemanager_id' => 'Change Manager',
'Class:Change/Attribute:changemanager_id+' => '',
'Class:Change/Attribute:changemanager_email' => 'Change Manager Email',
'Class:Change/Attribute:changemanager_email' => 'Change Manager E-Mail',
'Class:Change/Attribute:changemanager_email+' => '',
'Class:Change/Attribute:parent_id' => 'Parent Change',
'Class:Change/Attribute:parent_id+' => '',

View File

@@ -20,7 +20,7 @@
* @copyright Copyright (C) 2021 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*
*
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Relation:impacts/Description' => 'Elemente betroffen von',
@@ -264,13 +264,13 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:DatacenterDevice/Attribute:nb_u+' => '',
'Class:DatacenterDevice/Attribute:managementip' => 'Management-IP',
'Class:DatacenterDevice/Attribute:managementip+' => '',
'Class:DatacenterDevice/Attribute:powerA_id' => 'PowerA-Quelle',
'Class:DatacenterDevice/Attribute:powerA_id' => 'Strom-A-Quelle',
'Class:DatacenterDevice/Attribute:powerA_id+' => '',
'Class:DatacenterDevice/Attribute:powerA_name' => 'PowerA-Quellenname',
'Class:DatacenterDevice/Attribute:powerA_name' => 'Strom-A-Quellenname',
'Class:DatacenterDevice/Attribute:powerA_name+' => '',
'Class:DatacenterDevice/Attribute:powerB_id' => 'PowerB-Quelle',
'Class:DatacenterDevice/Attribute:powerB_id' => 'Strom-B-Quelle',
'Class:DatacenterDevice/Attribute:powerB_id+' => '',
'Class:DatacenterDevice/Attribute:powerB_name' => 'PowerB-Quellenname',
'Class:DatacenterDevice/Attribute:powerB_name' => 'Strom-B-Quellenname',
'Class:DatacenterDevice/Attribute:powerB_name+' => '',
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list' => 'FC-Ports',
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list+' => '',
@@ -313,7 +313,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Server+' => '',
'Class:Server/Attribute:osfamily_id' => 'OS Familie',
'Class:Server/Attribute:osfamily_id+' => '',
'Class:Server/Attribute:osfamily_name' => 'OS-Famillenname',
'Class:Server/Attribute:osfamily_name' => 'OS-Familienname',
'Class:Server/Attribute:osfamily_name+' => '',
'Class:Server/Attribute:osversion_id' => 'OS Version',
'Class:Server/Attribute:osversion_id+' => '',
@@ -1109,7 +1109,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Model/Attribute:type/Value:TapeLibrary+' => '',
'Class:Model/Attribute:type/Value:Phone' => 'Telefon',
'Class:Model/Attribute:type/Value:Phone+' => '',
'Class:Model/Attribute:physicaldevices_list' => 'Phyische Geräte',
'Class:Model/Attribute:physicaldevices_list' => 'Physische Geräte',
'Class:Model/Attribute:physicaldevices_list+' => '',
'Class:Model/UniquenessRule:name_brand+' => 'Der Modellname für eine Marke muss eindeutig sein',
'Class:Model/UniquenessRule:name_brand' => 'Es existiert bereits ein Modell mit diesem Namen für diese Marke',

View File

@@ -75,8 +75,9 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Application can be updated~~',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Application cannot be updated: %1$s~~',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress'=>'Please wait during integrity check~~',
// Setup Messages
'iTopUpdate:UI:SetupMessage:Ready' => 'Ready to start~~',

View File

@@ -75,8 +75,9 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Application can be updated~~',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Application cannot be updated: %1$s~~',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress'=>'Please wait during integrity check~~',
// Setup Messages
'iTopUpdate:UI:SetupMessage:Ready' => 'Ready to start~~',

View File

@@ -74,9 +74,10 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'iTopUpdate:UI:CanCoreUpdate:Failed' => 'Dateisystemprüfung fehlgeschlagen',
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Anwendungsupgrade kann durchgeführt werden',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Anwendungsupgrade nicht möglich: %1$s',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Vorsicht: App-Upgrade kann fehlerschlagen: %1$s',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Einige angepasste Dateien wurden erkannt</b>, eine Teil-Update kann nicht ausgeführt werden.<br/>Befolgen Sie das <a href="%2$s">Verfahren</a>, um Ihr iTop manuell zu aktualisieren. Sie müssen das <a href="%1$s">Setup</a> benutzen, um Ihre Applikation zu aktualisieren.<br />',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Vorsicht: App-Upgrade kann fehlschlagen: %1$s',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Einige angepasste Dateien wurden erkannt</b>, eine Teil-Update kann nicht ausgeführt werden.<br/>Befolgen Sie das <a target="_blank" href="%2$s">Verfahren</a>, um Ihr iTop manuell zu aktualisieren. Sie müssen das <a href="%1$s">Setup</a> benutzen, um Ihre Applikation zu aktualisieren.<br />',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Einige neue Module wurden erkannt</b>, eine Teil-Update kann nicht ausgeführt werden.<br/>Befolgen Sie das <a target="_blank" href="%2$s">Verfahren</a>, um Ihr iTop manuell zu aktualisieren. Sie müssen das <a href="%1$s">Setup</a> benutzen, um Ihre Applikation zu aktualisieren.<br />',
'iTopUpdate:UI:CheckInProgress'=>'Please wait during integrity check~~',
// Setup Messages
'iTopUpdate:UI:SetupMessage:Ready' => 'Bereit zum Upgrade',
@@ -87,7 +88,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'iTopUpdate:UI:SetupMessage:CheckCompile' => 'Prüfung des Anwendungsupgrades',
'iTopUpdate:UI:SetupMessage:Compile' => 'Upgrade von Anwendung und Datenbank',
'iTopUpdate:UI:SetupMessage:UpdateDatabase' => 'Upgrade Datenbank',
'iTopUpdate:UI:SetupMessage:ExitMaintenance' => 'Wartungsmodus deaktivert',
'iTopUpdate:UI:SetupMessage:ExitMaintenance' => 'Wartungsmodus deaktiviert',
'iTopUpdate:UI:SetupMessage:UpdateDone' => 'Upgrade abgeschlossen',
// Errors
@@ -116,5 +117,3 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ModuleInstallation/Attribute:version' => 'Version',
'Class:ModuleInstallation/Attribute:comment' => 'Kommentar',
));

View File

@@ -75,8 +75,9 @@ Dict::Add('EN US', 'English', 'English', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Application can be updated',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Application cannot be updated: %1$s',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.',
'iTopUpdate:UI:CheckInProgress'=>'Please wait during integrity check',

View File

@@ -76,8 +76,9 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'La aplicación puede ser actualizada',
'iTopUpdate:UI:CanCoreUpdate:No' => 'La aplicación no puede ser actualizada: %1$s',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Advertencia: la actualización de la aplicación puede fallar: %1$s',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress'=>'Please wait during integrity check~~',
// Setup Messages
'iTopUpdate:UI:SetupMessage:Ready' => 'Listo para empezar',

View File

@@ -75,8 +75,9 @@ Dict::Add('FR FR', 'French', 'Français', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'L\'application peut être mise à jour',
'iTopUpdate:UI:CanCoreUpdate:No' => 'L\'application ne peut pas être mise à jour : %1$s',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Attention : la mise à jour de l\'application peut échouer : %1$s',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Des fichiers modifiés ont été détectés</b>, une mise à jour partielle ne peut pas être effectuée.<br />Suivez la <a href="%2$s"> procedure</a> pour mettre à jour manuellement votre iTop. Vous devez utiliser la page <a href="%1$s">d\'installation</a> pour mettre à jour l\'application.',
'iTopUpdate:UI:CheckInProgress' => 'Veuillez patienter pendant la vérification des fichiers',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Des fichiers modifiés ont été détectés</b>, une mise à jour partielle ne peut pas être effectuée.<br />Suivez la <a target="_blank" href="%2$s"> procedure</a> pour mettre à jour manuellement votre iTop. Vous devez utiliser la page <a href="%1$s">d\'installation</a> pour mettre à jour l\'application.',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>De nouveaux modules ont été détectés</b>, une mise à jour partielle ne peut pas être effectuée.<br />Suivez la <a target="_blank" href="%2$s"> procedure</a> pour mettre à jour manuellement votre iTop. Vous devez utiliser la page <a href="%1$s">d\'installation</a> pour mettre à jour l\'application.',
'iTopUpdate:UI:CheckInProgress'=>'Veuillez patienter pendant la vérification d\'intégrité',
// Setup Messages
'iTopUpdate:UI:SetupMessage:Ready' => 'Prêt pour l\\installation',

View File

@@ -75,7 +75,8 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Application can be updated~~',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Application cannot be updated: %1$s~~',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
// Setup Messages

View File

@@ -75,7 +75,8 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Application can be updated~~',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Application cannot be updated: %1$s~~',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
// Setup Messages

View File

@@ -75,7 +75,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Application can be updated~~',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Application cannot be updated: %1$s~~',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
// Setup Messages

View File

@@ -77,7 +77,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Updaten van toepassing is mogelijk',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Updaten van de toepassing is niet mogelijk: %1$s',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
// Setup Messages

View File

@@ -75,7 +75,8 @@ Dict::Add('PL PL', 'Polish', 'Polski', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Aplikacja może być zaktualizowana',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Nie można zaktualizować aplikacji: %1$s',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Ostrzeżenie: aktualizacja aplikacji może się nie powieść: %1$s',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
// Setup Messages

View File

@@ -75,7 +75,8 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Aplicação pode ser atualizada',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Aplicação não pode ser atualizada: %1$s',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Atenção: a atualização da aplicação pode falhar: %1$s',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
// Setup Messages

View File

@@ -63,7 +63,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Приложение может быть обновлено',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Приложение не может быть обновлено: %1$s',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
// Setup Messages

View File

@@ -75,7 +75,8 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Application can be updated~~',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Application cannot be updated: %1$s~~',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
// Setup Messages

View File

@@ -75,7 +75,8 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => 'Application can be updated~~',
'iTopUpdate:UI:CanCoreUpdate:No' => 'Application cannot be updated: %1$s~~',
'iTopUpdate:UI:CanCoreUpdate:Warning' => 'Warning: application update can fail: %1$s~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
// Setup Messages

View File

@@ -75,7 +75,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'iTopUpdate:UI:CanCoreUpdate:Yes' => '应用无法升级',
'iTopUpdate:UI:CanCoreUpdate:No' => '应用无法升级: %1$s',
'iTopUpdate:UI:CanCoreUpdate:Warning' => '警告: 应用升级可能失败: %1$s',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateUseSetup' => '<b>Some modified files were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a target="_blank" href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
'iTopUpdate:UI:CheckInProgress' => 'Please wait during integrity check~~',
// Setup Messages

View File

@@ -9,6 +9,7 @@
namespace Combodo\iTop\CoreUpdate\Service;
use Combodo\iTop\FilesInformation\Service\FileIntegrityException;
use Combodo\iTop\FilesInformation\Service\FilesIntegrity;
use DBBackup;
use Dict;
@@ -535,7 +536,11 @@ final class CoreUpdater
SetupLog::Info('itop-core-update: Archive extracted, check files integrity');
// Check files integrity
FilesIntegrity::CheckInstallationIntegrity(self::UPDATE_DIR.'web/', true);
$sRootPath = self::UPDATE_DIR.'web/';
FilesIntegrity::CheckInstallationIntegrity($sRootPath);
///Check new modules
self::CheckNewModules($sRootPath);
SetupLog::Info('itop-core-update: Files integrity OK');
} catch (Exception $e)
@@ -604,4 +609,38 @@ final class CoreUpdater
throw $e;
}
}
/**
* Check if new modules (not already installed) are present, and throw an exception if that is the case as core update doesn't know how to install them automatically for know
*
* @param string $sRootPath
*
* @throws \ApplicationException
* @since 2.7.7 3.0.1
*/
private static function CheckNewModules($sRootPath)
{
$aFilesInfo = FilesIntegrity::GetInstalledFiles($sRootPath.'manifest.xml');
if ($aFilesInfo === false) {
throw new FileIntegrityException(Dict::Format('FilesInformation:Error:MissingFile', 'manifest.xml'));
}
@clearstatcache();
$sSourceDir = MetaModel::GetConfig()->Get('source_dir');
foreach ($aFilesInfo as $aFileInfo) {
if (strpos($aFileInfo['path'], $sSourceDir) === 0) {
$aFilePath = explode('/', $aFileInfo['path']);
$sFolderPath = $aFilePath[0].'/'.$aFilePath[1].'/'.$aFilePath[2];
//if module don't already exist in itop and if module listed in manifest.xml is included in zip
if (!is_dir(APPROOT.'/'.$sFolderPath) && !is_file(APPROOT.'/'.$sFolderPath)
&& is_dir($sRootPath.'/'.$sFolderPath)) {
$sLink = utils::GetAbsoluteUrlAppRoot().'setup/';
$sLinkManualUpdate = 'https://www.itophub.io/wiki/page?id='.utils::GetItopVersionWikiSyntax().'%3Ainstall%3Aupgrading_itop#manually';
throw new FileIntegrityException(Dict::Format('iTopUpdate:UI:CannotUpdateNewModules' , $sLink, $sLinkManualUpdate));
}
}
// Packed with missing files...
}
}
}

View File

@@ -17,6 +17,7 @@ $.ajax({
if(data.sMessageDetails){
$("#header-requirements-details").removeClass("ibo-is-hidden");
$('#can-core-update-details').html(data.sMessageDetails);
$("#toggle-requirements-details").click( function() { $("#can-core-update-details").toggle(); } );
}
oRequirements.removeClass("ibo-is-information");
if (data.bStatus) {

View File

@@ -1,26 +1,26 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2010-2018 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with iTop. If not, see <http://www.gnu.org/licenses/>
*/
Dict::Add('PL PL', 'Polish', 'Polski', array(
// Dictionary entries go here
));
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2010-2018 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with iTop. If not, see <http://www.gnu.org/licenses/>
*/
Dict::Add('PL PL', 'Polish', 'Polski', array(
// Dictionary entries go here
));

View File

@@ -1,26 +1,26 @@
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2010-2018 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with iTop. If not, see <http://www.gnu.org/licenses/>
*/
Dict::Add('PL PL', 'Polish', 'Polski', array(
// Dictionary entries go here
));
<?php
/**
* Localized data
*
* @copyright Copyright (C) 2010-2018 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with iTop. If not, see <http://www.gnu.org/licenses/>
*/
Dict::Add('PL PL', 'Polish', 'Polski', array(
// Dictionary entries go here
));

View File

@@ -24,8 +24,8 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Missing file: %1$s~~',
'FilesInformation:Error:CorruptedFile' => 'File %1$s is corrupted~~',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Can not write to file %1$s~~',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -24,8 +24,8 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Missing file: %1$s~~',
'FilesInformation:Error:CorruptedFile' => 'File %1$s is corrupted~~',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Can not write to file %1$s~~',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -24,9 +24,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Fehlende Datei: %1$s',
'FilesInformation:Error:CorruptedFile' => 'Datei %1$s ist beschädigt',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Datei %1$s kann nicht geschrieben werden',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Einige neue Module wurden erkannt</b>, eine Teil-Update kann nicht ausgeführt werden.<br/>Befolgen Sie das <a href="%2$s">Verfahren</a>, um Ihr iTop manuell zu aktualisieren. Sie müssen das <a href="%1$s">Setup</a> benutzen, um Ihre Applikation zu aktualisieren.<br />',
));

View File

@@ -25,8 +25,8 @@ Dict::Add('EN US', 'English', 'English', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Missing file: %1$s',
'FilesInformation:Error:CorruptedFile' => 'File %1$s is corrupted',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s ',
'FilesInformation:Error:CantWriteToFile' => 'Can not write to file %1$s',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.',
));

View File

@@ -25,8 +25,8 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Archivo faltante: %1$s',
'FilesInformation:Error:CorruptedFile' => 'El archivo %1$s está corrupto',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'No se puede escribir al archivo %1$s',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -24,9 +24,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Ficher manquant : %1$s',
'FilesInformation:Error:CorruptedFile' => 'Le fichier %1$s est corrompu',
'FilesInformation:Error:ListCorruptedFile' => 'Fichier(s) corrompu(s): %1$s',
'FilesInformation:Error:CantWriteToFile' => 'Impossible de modifier le fichier %1$s',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>De nouveaux modules ont été détectés</b>, une mise à jour partielle ne peut pas être effectuée.<br />Suivez la <a href="%2$s"> procedure</a> pour mettre à jour manuellement votre iTop. Vous devez utiliser la page <a href="%1$s">d\'installation</a> pour mettre à jour l\'application.',
));

View File

@@ -24,8 +24,8 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Missing file: %1$s~~',
'FilesInformation:Error:CorruptedFile' => 'File %1$s is corrupted~~',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Can not write to file %1$s~~',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -24,8 +24,8 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Missing file: %1$s~~',
'FilesInformation:Error:CorruptedFile' => 'File %1$s is corrupted~~',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Can not write to file %1$s~~',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -24,8 +24,8 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Missing file: %1$s~~',
'FilesInformation:Error:CorruptedFile' => 'File %1$s is corrupted~~',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Can not write to file %1$s~~',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -26,8 +26,8 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Ontbrekend bestand: %1$s',
'FilesInformation:Error:CorruptedFile' => 'Corrupt bestand: %1$s',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Kan niet schrijven naar bestand %1$s',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -25,8 +25,8 @@ Dict::Add('PL PL', 'Polish', 'Polski', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Brakujący plik: %1$s',
'FilesInformation:Error:CorruptedFile' => 'Plik %1$s jest uszkodzony',
'FilesInformation:Error:ListCorruptedFile' => 'Fichier(s) corrompu(s): %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Nie można zapisać do pliku %1$s',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -24,8 +24,8 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Faltando arquivo: %1$s',
'FilesInformation:Error:CorruptedFile' => 'Arquivo %1$s está corrompido',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Sem permissão de escrita no arquivo %1$s',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -12,8 +12,8 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Файл %1$s отсутствует',
'FilesInformation:Error:CorruptedFile' => 'Файл %1$s повреждён',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Невозможно выполнить запись в файл %1$s',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -24,8 +24,8 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Missing file: %1$s~~',
'FilesInformation:Error:CorruptedFile' => 'File %1$s is corrupted~~',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Can not write to file %1$s~~',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -24,8 +24,8 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
// Errors
'FilesInformation:Error:MissingFile' => 'Missing file: %1$s~~',
'FilesInformation:Error:CorruptedFile' => 'File %1$s is corrupted~~',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => 'Can not write to file %1$s~~',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -24,8 +24,8 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
// Errors
'FilesInformation:Error:MissingFile' => '文件丢失: %1$s~~',
'FilesInformation:Error:CorruptedFile' => '文件 %1$s 已损坏',
'FilesInformation:Error:ListCorruptedFile' => 'File(s) corrupted: %1$s~~',
'FilesInformation:Error:CantWriteToFile' => '文件 %1$s 无法写入',
'FilesInformation:Error:CannotUpdateNewModules' => '<b>Some new modules were detected</b>, a partial update cannot be executed.</br>Follow the <a href="%2$s"> procedure</a> in order to manually upgrade your iTop. You must use the <a href="%1$s">setup</a> to update the application.~~',
));

View File

@@ -56,7 +56,7 @@ class FilesInformation
try
{
FilesIntegrity::CheckInstallationIntegrity();
FilesIntegrity::CheckInstallationIntegrity(APPROOT, false);
}
catch (FileIntegrityException $e)
{

View File

@@ -13,8 +13,6 @@ use DOMDocument;
use DOMElement;
use DOMNode;
use DOMXPath;
use MetaModel;
use utils;
class FilesIntegrity
{
@@ -81,12 +79,12 @@ class FilesIntegrity
* Check that files present in iTop folder corresponds to the manifest
*
* @param string $sRootPath
* @param bool $bCheckNewModule
* @param bool $bExitAtFirstError
*
* @throws \Combodo\iTop\FilesInformation\Service\FileIntegrityException
* @since 3.0.1 Add $bCheckNewModule parameter
* @since 2.7.7 3.0.1 Add $bExitAtFirstError parameter
*/
public static function CheckInstallationIntegrity($sRootPath = APPROOT, $bCheckNewModule = false)
public static function CheckInstallationIntegrity($sRootPath = APPROOT, $bExitAtFirstError = true)
{
$aFilesInfo = FilesIntegrity::GetInstalledFiles($sRootPath.'manifest.xml');
@@ -95,8 +93,10 @@ class FilesIntegrity
throw new FileIntegrityException(Dict::Format('FilesInformation:Error:MissingFile', 'manifest.xml'));
}
$bHasErrors = false;
$sErrorFiles ="";
@clearstatcache();
$sSourceDir = MetaModel::GetConfig()->Get('source_dir');
foreach ($aFilesInfo as $aFileInfo)
{
$sFile = $sRootPath.$aFileInfo['path'];
@@ -108,20 +108,19 @@ class FilesIntegrity
$sChecksum = md5($sContent);
if (($iSize != $aFileInfo['size']) || ($sChecksum != $aFileInfo['md5']))
{
throw new FileIntegrityException(Dict::Format('FilesInformation:Error:CorruptedFile', $sFile));
}
}
if($bCheckNewModule && strpos($aFileInfo['path'],$sSourceDir) === 0){
$aFilePath = explode('/',$aFileInfo['path']);
$sFolderPath = $aFilePath[0].'/'.$aFilePath[1].'/'.$aFilePath[2];
if ( !(is_dir(APPROOT.'/'.$sFolderPath)) && !(is_file(APPROOT.'/'.$sFolderPath)) ){
$sLink = utils::GetAbsoluteUrlAppRoot().'setup/';
$sLinkManualUpdate = 'https://www.itophub.io/wiki/page?id='.utils::GetItopVersionWikiSyntax().'%3Ainstall%3Aupgrading_itop#manually';
throw new FileIntegrityException(Dict::Format('FilesInformation:Error:CannotUpdateNewModules', $sLink, $sLinkManualUpdate));
if($bExitAtFirstError) {
throw new FileIntegrityException(Dict::Format('FilesInformation:Error:CorruptedFile', $sFile));
} else {
$bHasErrors = true;
$sErrorFiles .='<li> '.$aFileInfo['path'].'</li>';
}
}
}
// Packed with missing files...
}
if($bHasErrors){
throw new FileIntegrityException(Dict::Format('FilesInformation:Error:ListCorruptedFile','<ul> '.$sErrorFiles.'</ul>'));
}
}
public static function IsInstallationConform($sRootPath, &$sErrorMsg)

View File

@@ -515,6 +515,8 @@ class ObjectController extends BrickController
$oSubRequest = $oRequest;
$oSubRequest->request->set('operation', 'submit');
$oSubRequest->request->set('stimulus_code', '');
$oSubRequest->request->set('formmanager_class', $aData['form']['formmanager_class']);
$oSubRequest->request->set('formmanager_data', json_encode($aData['form']['formmanager_data']));
$aData = array('sMode' => 'apply_stimulus');
$aData['form'] = $oObjectFormHandler->HandleForm($oSubRequest, $aData['sMode'], $sObjectClass, $sObjectId,

View File

@@ -189,7 +189,7 @@ class ObjectFormManager extends FormManager
*
* @return bool true if the data are identical
*
* @since 2.7.6 3.0.0 N°4384 check formmanager_data
* @since 2.7.6 3.0.0 N°4384 Check formmanager_data
*/
public static function CanTrustFormLayoutContent($sPostedFormManagerData, $aOriginalFormProperties)
{
@@ -200,7 +200,7 @@ class ObjectFormManager extends FormManager
return true;
}
// we need to parse the content so that autoclose tags are returned correctly (`<div />` => `<div></div>`)
// We need to parse the content so that autoclose tags are returned correctly (`<div />` => `<div></div>`)
$oHtmlDocument = new \DOMDocument();
$sPostedFormLayoutContent = (isset($aPostedFormManagerData['formproperties']['layout']['content'])) ? $aPostedFormManagerData['formproperties']['layout']['content'] : '';

View File

@@ -50,12 +50,17 @@ use UserRights;
*/
class ObjectFormHandlerHelper
{
/** @var string ENUM_MODE_VIEW */
/** @var string */
const ENUM_MODE_VIEW = 'view';
/** @var string ENUM_MODE_EDIT */
/** @var string */
const ENUM_MODE_EDIT = 'edit';
/** @var string ENUM_MODE_CREATE */
/** @var string */
const ENUM_MODE_CREATE = 'create';
/**
* @var string
* @since 2.7.7 3.0.1 3.1.0
*/
const ENUM_MODE_APPLY_STIMULUS = 'apply_stimulus';
/** @var \Combodo\iTop\Portal\Helper\RequestManipulatorHelper $oRequestManipulator */
private $oRequestManipulator;
@@ -172,7 +177,7 @@ class ObjectFormHandlerHelper
'label' => Dict::S('Portal:Button:Submit'),
),
);
if ($sMode !== 'apply_stimulus')
if ($sMode !== static::ENUM_MODE_APPLY_STIMULUS)
{
// Add transition buttons
$oSetToCheckRights = DBObjectSet::FromObject($oObject);
@@ -237,9 +242,9 @@ class ObjectFormHandlerHelper
// Note : We might need to distinguish form & renderer endpoints
switch($sMode)
{
case 'create':
case 'edit':
case 'view':
case static::ENUM_MODE_CREATE:
case static::ENUM_MODE_EDIT:
case static::ENUM_MODE_VIEW:
$sFormEndpoint = $this->oUrlGenerator->generate(
'p_object_'.$sMode,
array(
@@ -249,7 +254,7 @@ class ObjectFormHandlerHelper
);
break;
case 'apply_stimulus':
case static::ENUM_MODE_APPLY_STIMULUS:
$sFormEndpoint = $this->oUrlGenerator->generate(
'p_object_apply_stimulus',
array(

View File

@@ -31,7 +31,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:UserRequest:OpenRequests+' => '',
'UI:WelcomeMenu:MyAssignedCalls' => 'Mir zugewiesene Benutzeranfragen',
'UI-RequestManagementOverview-RequestByType-last-14-days' => 'Benutzeranfragen der letzten 14 Tage nach Typ',
'UI-RequestManagementOverview-Last-14-days' => 'Anzahl Benutzeranfragen der letzen 14 Tage',
'UI-RequestManagementOverview-Last-14-days' => 'Anzahl Benutzeranfragen der letzten 14 Tage',
'UI-RequestManagementOverview-OpenRequestByStatus' => 'Offene Benutzeranfragen nach Status',
'UI-RequestManagementOverview-OpenRequestByAgent' => 'Offene Benutzeranfragen nach Bearbeiter',
'UI-RequestManagementOverview-OpenRequestByType' => 'Offene Benutzeranfragen nach Typ',
@@ -122,7 +122,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:UserRequest/Attribute:origin/Value:portal+' => '',
'Class:UserRequest/Attribute:approver_id' => 'Genehmiger',
'Class:UserRequest/Attribute:approver_id+' => '',
'Class:UserRequest/Attribute:approver_email' => 'Gemehhmiger-Email',
'Class:UserRequest/Attribute:approver_email' => 'Gemehhmiger-E-Mail',
'Class:UserRequest/Attribute:approver_email+' => '',
'Class:UserRequest/Attribute:service_id' => 'Service',
'Class:UserRequest/Attribute:service_id+' => '',

View File

@@ -128,7 +128,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:UserRequest/Attribute:origin/Value:portal+' => '',
'Class:UserRequest/Attribute:approver_id' => 'Genehmiger',
'Class:UserRequest/Attribute:approver_id+' => '',
'Class:UserRequest/Attribute:approver_email' => 'Genehmiger-Email',
'Class:UserRequest/Attribute:approver_email' => 'Genehmiger-E-Mail',
'Class:UserRequest/Attribute:approver_email+' => '',
'Class:UserRequest/Attribute:service_id' => 'Service',
'Class:UserRequest/Attribute:service_id+' => '',
@@ -178,7 +178,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:UserRequest/Attribute:resolution_code/Value:assistance+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:bug fixed' => 'Bugfix',
'Class:UserRequest/Attribute:resolution_code/Value:bug fixed+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:hardware repair' => 'Hardware-Reperatur',
'Class:UserRequest/Attribute:resolution_code/Value:hardware repair' => 'Hardware-Reparatur',
'Class:UserRequest/Attribute:resolution_code/Value:hardware repair+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:other' => 'Andere',
'Class:UserRequest/Attribute:resolution_code/Value:other+' => '',
@@ -260,7 +260,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Portal:SelectServiceElementFrom_Service' => 'Wählen Sie ein Service-Element für %1$s',
'Portal:ListServices' => 'Liste der Services',
'Portal:TitleDetailsFor_Service' => 'Details für Service',
'Portal:Button:CreateRequestFromService' => 'EIne Benutzeranfrage betreffend dieses Dienstes erzeugen',
'Portal:Button:CreateRequestFromService' => 'Eine Benutzeranfrage betreffend dieses Dienstes erzeugen',
'Portal:ListOpenRequests' => 'Offene Benutzeranfragen auflisten',
'Portal:UserRequest:MoreInfo' => 'Weitere Informationen',
'Portal:Details-Service-Element' => 'Service-Elemente',
@@ -272,7 +272,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Portal:NoOpenProblem' => 'Keine offenen Problems',
'Portal:SelectLanguage' => 'Ändern Sie Ihre Spracheinstellung',
'Portal:LanguageChangedTo_Lang' => 'Spracheinstellung geändert auf: ',
'Portal:ChooseYourFavoriteLanguage' => 'WÄhlen Sie Ihre bevorzugte Sprache',
'Portal:ChooseYourFavoriteLanguage' => 'Wählen Sie Ihre bevorzugte Sprache',
'Class:UserRequest/Method:ResolveChildTickets' => 'Kind-Tickets lösen',
'Class:UserRequest/Method:ResolveChildTickets+' => 'Lösung auf Kind-Tickets übertragen (ev_autoresolve), und folgende Ticket-Eigenschaften angleichen: Service, Team, Agent, Lösungsinformationen',

View File

@@ -20,7 +20,7 @@
* @copyright Copyright (C) 2021 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*
*
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:ServiceManagement' => 'Service-Management',
@@ -39,7 +39,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:ServiceSubcategory+' => '',
'Menu:Service' => 'Services',
'Menu:Service+' => '',
'Menu:ServiceElement' => 'Sevice-Elemente',
'Menu:ServiceElement' => 'Service-Elemente',
'Menu:ServiceElement+' => '',
'Menu:SLA' => 'SLAs',
'Menu:SLA+' => '',

View File

@@ -20,7 +20,7 @@
* @copyright Copyright (C) 2021 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*
*
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:ServiceManagement' => 'Service Management',
@@ -38,7 +38,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:ServiceSubcategory+' => 'Service-Unterkategorien',
'Menu:Service' => 'Services',
'Menu:Service+' => 'Services',
'Menu:ServiceElement' => 'Sevice-Elemente',
'Menu:ServiceElement' => 'Service-Elemente',
'Menu:ServiceElement+' => '',
'Menu:SLA' => 'SLAs',
'Menu:SLA+' => 'Service Level Agreements',

View File

@@ -118,7 +118,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Contact/Attribute:org_id+' => '',
'Class:Contact/Attribute:org_name' => 'Organisation',
'Class:Contact/Attribute:org_name+' => '',
'Class:Contact/Attribute:email' => 'Email',
'Class:Contact/Attribute:email' => 'E-Mail',
'Class:Contact/Attribute:email+' => '',
'Class:Contact/Attribute:phone' => 'Telefonnummer',
'Class:Contact/Attribute:phone+' => '',
@@ -163,7 +163,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Person/Attribute:team_list+' => '',
'Class:Person/Attribute:tickets_list' => 'Tickets',
'Class:Person/Attribute:tickets_list+' => '',
'Class:Person/Attribute:manager_id_friendlyname' => 'Manager Friendly Name',
'Class:Person/Attribute:manager_id_friendlyname' => 'Manager-Name (lesbar)',
'Class:Person/Attribute:manager_id_friendlyname+' => '',
'Class:Person/Attribute:picture' => 'Bild',
'Class:Person/Attribute:picture+' => '',
@@ -272,7 +272,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:DocumentType' => 'Dokumentyp',
'Class:DocumentType' => 'Dokumenttyp',
'Class:DocumentType+' => '',
));

View File

@@ -7,5 +7,5 @@
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'theme:light-grey' => 'Light Grey (deprecated)~~',
'theme:light-grey' => 'Light Grey (veraltet)',
));

View File

@@ -20,7 +20,7 @@
* @copyright Copyright (C) 2021 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*
*
*/
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Ticket' => 'Ticket',
@@ -90,7 +90,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkContactToTicket/Attribute:ticket_ref+' => '',
'Class:lnkContactToTicket/Attribute:contact_id' => 'Kontakt',
'Class:lnkContactToTicket/Attribute:contact_id+' => '',
'Class:lnkContactToTicket/Attribute:contact_email' => 'Kontakt-Email',
'Class:lnkContactToTicket/Attribute:contact_email' => 'Kontakt-E-Mail',
'Class:lnkContactToTicket/Attribute:contact_email+' => '',
'Class:lnkContactToTicket/Attribute:role' => 'Rolle (Text)',
'Class:lnkContactToTicket/Attribute:role+' => '',
@@ -127,7 +127,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:WorkOrder/Attribute:team_name+' => '',
'Class:WorkOrder/Attribute:agent_id' => 'Bearbeiter',
'Class:WorkOrder/Attribute:agent_id+' => '',
'Class:WorkOrder/Attribute:agent_email' => 'Melder-Email',
'Class:WorkOrder/Attribute:agent_email' => 'Melder-E-Mail',
'Class:WorkOrder/Attribute:agent_email+' => '',
'Class:WorkOrder/Attribute:start_date' => 'Startdatum',
'Class:WorkOrder/Attribute:start_date+' => '',
@@ -165,16 +165,16 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:cmdbAbstractObject/Method:SetCurrentDate+' => 'Ein Attribut (Feld) mit der aktuellen Zeit und Datum schreiben',
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1' => 'Zielfeld',
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1+' => 'Das Feld, das im aktuellen Objekt geschrieben werden soll',
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull' => 'SetCurrentDateIfNull~~',
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull+' => 'Set an empty field with the current date and time~~',
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull' => 'SetCurrentDateIfNull',
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull+' => 'Ein Attribut (Feld), wenn leer, mit der aktuellen Zeit und Datum schreiben',
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull/Param:1' => 'Zielfeld',
'Class:cmdbAbstractObject/Method:SetCurrentDateIfNull/Param:1+' => 'Das Feld, das im aktuellen Objekt geschrieben werden soll',
'Class:cmdbAbstractObject/Method:SetCurrentUser' => 'SetCurrentUser',
'Class:cmdbAbstractObject/Method:SetCurrentUser+' => 'Ein Attribut (Feld) mit dem dezeit eingeloggten User schreiben',
'Class:cmdbAbstractObject/Method:SetCurrentUser+' => 'Ein Attribut (Feld) mit dem derzeit eingeloggten User schreiben',
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1' => 'Zielfeld',
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1+' => 'Das Feld, das im aktuellen Objekt geschrieben werden soll. Falls das Feld vom Typ String ist, wird der FriendlyName des Users verwendet, ansonsten der Identifikator. Der FriendlyName ist der Name, der mit dem User-Account verknüpften Person (falls vorhanden), ansonsten der Accountname (Login).',
'Class:cmdbAbstractObject/Method:SetCurrentPerson' => 'SetCurrentPerson',
'Class:cmdbAbstractObject/Method:SetCurrentPerson+' => 'Schreibe ein Attribut (Feld) mit der gerade eingeloggten Person (die \\"Person\\", die mit dem geade eingeloggten User verknüpft ist)',
'Class:cmdbAbstractObject/Method:SetCurrentPerson+' => 'Schreibe ein Attribut (Feld) mit der gerade eingeloggten Person (die \\"Person\\", die mit dem gerade eingeloggten User verknüpft ist)',
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1' => 'Zielfeld',
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1+' => 'Das Feld, das im aktuellen Objekt geschrieben werden soll. Falls das Feld vom Typ String ist, wird der FriendlyName des Users verwendet, ansonsten der Identifikator.',
'Class:cmdbAbstractObject/Method:SetElapsedTime' => 'SetElapsedTime',
@@ -185,34 +185,34 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2+' => 'Das Feld, aus dem die Refernzzeit/datum gelesen werden soll',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3' => 'Arbeitszeiten',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3+' => 'Leer lassen um das Standard-Arbeitzeiten-Schema zu verwenden, oder auf \\"DefaultWorkingTimeComputer\\" setzen um ein 24x7-Schema zu erzwingen',
'Class:cmdbAbstractObject/Method:SetIfNull' => 'SetIfNull~~',
'Class:cmdbAbstractObject/Method:SetIfNull+' => 'Set a field only if it is empty, with a static value~~',
'Class:cmdbAbstractObject/Method:SetIfNull/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetIfNull/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:SetIfNull/Param:2' => 'Value~~',
'Class:cmdbAbstractObject/Method:SetIfNull/Param:2+' => 'The value to set~~',
'Class:cmdbAbstractObject/Method:AddValue' => 'AddValue~~',
'Class:cmdbAbstractObject/Method:AddValue+' => 'Add a fixed value to a field~~',
'Class:cmdbAbstractObject/Method:AddValue/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:AddValue/Param:1+' => 'The field to modify, in the current object~~',
'Class:cmdbAbstractObject/Method:AddValue/Param:2' => 'Value~~',
'Class:cmdbAbstractObject/Method:AddValue/Param:2+' => 'Decimal value which will be added, can be negative~~',
'Class:cmdbAbstractObject/Method:SetComputedDate' => 'SetComputedDate~~',
'Class:cmdbAbstractObject/Method:SetComputedDate+' => 'Set a field with a date computed from another field with extra logic~~',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:2' => 'Modifier~~',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:2+' => 'Textual information to modify the source date, eg. "+3 days"~~',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:3' => 'Source field~~',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:3+' => 'The field used as source to apply the Modifier logic~~',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull' => 'SetComputedDateIfNull~~',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull+' => 'Set non empty field with a date computed from another field with extra logic~~',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:2' => 'Modifier~~',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:2+' => 'Textual information to modify the source date, eg. "+3 days"~~',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:3' => 'Source field~~',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:3+' => 'The field used as source to apply the Modifier logic~~',
'Class:cmdbAbstractObject/Method:SetIfNull' => 'SetIfNull',
'Class:cmdbAbstractObject/Method:SetIfNull+' => 'Ein Attribut (Feld), wenn leer, mit einem festen Wert schreiben',
'Class:cmdbAbstractObject/Method:SetIfNull/Param:1' => 'Zielfeld',
'Class:cmdbAbstractObject/Method:SetIfNull/Param:1+' => 'Das Feld, das im aktuellen Objekt geschrieben werden soll',
'Class:cmdbAbstractObject/Method:SetIfNull/Param:2' => 'Wert',
'Class:cmdbAbstractObject/Method:SetIfNull/Param:2+' => 'Der Wert der geschrieben werden soll',
'Class:cmdbAbstractObject/Method:AddValue' => 'AddValue',
'Class:cmdbAbstractObject/Method:AddValue+' => 'Addiert einen festen Wert zu einem Attribut (Feld)',
'Class:cmdbAbstractObject/Method:AddValue/Param:1' => 'Zielfeld',
'Class:cmdbAbstractObject/Method:AddValue/Param:1+' => 'Das Feld, das im aktuellen Objekt geschrieben werden soll',
'Class:cmdbAbstractObject/Method:AddValue/Param:2' => 'Wert',
'Class:cmdbAbstractObject/Method:AddValue/Param:2+' => 'Dezimalwert welcher addiert werden soll, kann auch negativ sein',
'Class:cmdbAbstractObject/Method:SetComputedDate' => 'SetComputedDate',
'Class:cmdbAbstractObject/Method:SetComputedDate+' => 'Ein Attribut (Feld) mit einem Datum schreiben, welches aus einem anderen Feld berechnet wird',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:1' => 'Zielfeld',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:1+' => 'Das Feld, das im aktuellen Objekt geschrieben werden soll',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:2' => 'Modifikator',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:2+' => 'Modifikator für das Quellfeld in Textform z.B. "+3 days"',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:3' => 'Quellfeld',
'Class:cmdbAbstractObject/Method:SetComputedDate/Param:3+' => 'Das Feld, welches als Quellfeld für den Modifikator verwendet werden soll',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull' => 'SetComputedDateIfNull',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull+' => 'Ein Attribut (Feld), wenn leer, mit einem Datum schreiben, welches aus einem anderen Feld berechnet wird',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:1' => 'Zielfeld',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:1+' => 'Das Feld, das im aktuellen Objekt geschrieben werden soll',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:2' => 'Modifikator',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:2+' => 'Modifikator für das Quellfeld in Textform z.B. "+3 days"',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:3' => 'Quellfeld',
'Class:cmdbAbstractObject/Method:SetComputedDateIfNull/Param:3+' => 'Das Feld, welches als Quellfeld für den Modifikator verwendet werden soll',
'Class:cmdbAbstractObject/Method:Reset' => 'Reset',
'Class:cmdbAbstractObject/Method:Reset+' => 'Ein Attribut (Feld) auf seinen Default-Wert zurücksetzen',
'Class:cmdbAbstractObject/Method:Reset/Param:1' => 'Zielfeld',
@@ -242,4 +242,4 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Document/Attribute:contracts_list+' => '',
'Class:Document/Attribute:services_list' => 'Services',
'Class:Document/Attribute:services_list+' => '',
));
));

View File

@@ -77,7 +77,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Core:AttributeArchiveFlag/Value:no' => 'Nein',
'Core:AttributeArchiveFlag/Label' => 'Archiviert',
'Core:AttributeArchiveFlag/Label+' => '',
'Core:AttributeArchiveDate/Label' => 'Archivierungs Datum',
'Core:AttributeArchiveDate/Label' => 'Archivierungsdatum',
'Core:AttributeArchiveDate/Label+' => '',
'Core:AttributeObsolescenceFlag' => 'Obsoleszenz-Flag',
@@ -107,7 +107,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Core:AttributeEncryptedString' => 'Verschlüsselter String',
'Core:AttributeEncryptedString+' => 'mit einem lokalen Schüssel verschlüsselter String',
'Core:AttributeEncryptUnknownLibrary' => 'Angegebene Library zur Verschlüsslung (%1$s) ist unbekannt',
'Core:AttributeEncryptFailedToDecrypt' => '** Entschlüsslungsfehler **',
'Core:AttributeEncryptFailedToDecrypt' => '** Entschlüsselungsfehler **',
'Core:AttributeText' => 'Text',
'Core:AttributeText+' => 'Mehrzeiliger String',
@@ -115,14 +115,14 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Core:AttributeHTML' => 'HTML',
'Core:AttributeHTML+' => 'HTML-String',
'Core:AttributeEmailAddress' => 'Email-Adresse',
'Core:AttributeEmailAddress+' => 'Email-Adresse',
'Core:AttributeEmailAddress' => 'E-Mail-Adresse',
'Core:AttributeEmailAddress+' => 'E-Mail-Adresse',
'Core:AttributeIPAddress' => 'IP-Adresse',
'Core:AttributeIPAddress+' => 'IP-Adresse',
'Core:AttributeOQL' => 'OQL',
'Core:AttributeOQL+' => 'Object-Query-Langage-Ausdruck',
'Core:AttributeOQL+' => 'Object-Query-Language-Ausdruck',
'Core:AttributeEnum' => 'Enum',
'Core:AttributeEnum+' => 'Liste vordefinierter alphanumerischer Strings',
@@ -175,7 +175,7 @@ Operatoren:<br/>
'Core:AttributeExternalKey' => 'Externer Schlüssel',
'Core:AttributeExternalKey+' => 'Externer (oder fremder) Schlüssel',
'Core:AttributeHierarchicalKey' => 'Hierarischer Key',
'Core:AttributeHierarchicalKey' => 'Hierarchischer Key',
'Core:AttributeHierarchicalKey+' => 'Externer Key oder Foreign Key zum Parent',
'Core:AttributeExternalField' => 'Externes Feld',
@@ -204,7 +204,7 @@ Operatoren:<br/>
'Core:AttributeTag' => 'Tags',
'Core:AttributeTag+' => '',
'Core:Context=REST/JSON' => 'REST',
'Core:Context=Synchro' => 'Synchro',
'Core:Context=Setup' => 'Setup',
@@ -381,8 +381,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:EventNotificationEmail' => 'Email Emission Event',
'Class:EventNotificationEmail+' => 'Verfolgung einer Email, die gesendet wurde',
'Class:EventNotificationEmail' => 'E-Mail Emission Event',
'Class:EventNotificationEmail+' => 'Verfolgung einer E-Mail, die gesendet wurde',
'Class:EventNotificationEmail/Attribute:to' => 'An',
'Class:EventNotificationEmail/Attribute:to+' => '',
'Class:EventNotificationEmail/Attribute:cc' => 'Kopie an',
@@ -498,7 +498,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:Action/Attribute:trigger_list+' => 'Trigger, die mit dieser Aktion verknüpft sind',
'Class:Action/Attribute:finalclass' => 'Typ',
'Class:Action/Attribute:finalclass+' => '',
'Action:WarningNoTriggerLinked' => 'Warning, no trigger is linked to the action. It will not be active until it has at least 1.~~',
'Action:WarningNoTriggerLinked' => 'Warnung, es ist kein Trigger mit dieser Aktion verknüpft. Die Aktion ist nicht aktiv solange nicht mindestens 1 Trigger verknüpft ist.',
));
//
@@ -515,7 +515,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
//
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ActionEmail' => 'Email-Benachrichtigung',
'Class:ActionEmail' => 'E-Mail-Benachrichtigung',
'Class:ActionEmail+' => '',
'Class:ActionEmail/Attribute:status+' => 'Dieser Zustand entscheidet, wer benachrichtigt werden soll: nur der Testempfänger, alle (To, cc und Bcc) oder niemand',
'Class:ActionEmail/Attribute:status/Value:test+' => 'Nur der Testempfänger wird benachrichtigt',
@@ -524,13 +524,13 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ActionEmail/Attribute:test_recipient' => 'Testempfänger',
'Class:ActionEmail/Attribute:test_recipient+' => 'Empfänger im Fall eines "Test"-Status',
'Class:ActionEmail/Attribute:from' => 'Von (E-Mail)',
'Class:ActionEmail/Attribute:from+' => 'Absenderad­res­se wird im Email-Header mitgesendet',
'Class:ActionEmail/Attribute:from+' => 'Absenderad­resse wird im E-Mail-Header mitgesendet',
'Class:ActionEmail/Attribute:from_label' => 'Von (Label)',
'Class:ActionEmail/Attribute:from_label+' => 'Absendername wird im Email-Header mitgesendet',
'Class:ActionEmail/Attribute:from_label+' => 'Absendername wird im E-Mail-Header mitgesendet',
'Class:ActionEmail/Attribute:reply_to' => 'Antworten an (E-Mail)',
'Class:ActionEmail/Attribute:reply_to+' => 'Wird im Email-Header mitgesendet',
'Class:ActionEmail/Attribute:reply_to+' => 'Wird im E-Mail-Header mitgesendet',
'Class:ActionEmail/Attribute:reply_to_label' => 'Antworten an (Label)',
'Class:ActionEmail/Attribute:reply_to_label+' => 'Wird im Email-Header mitgesendet',
'Class:ActionEmail/Attribute:reply_to_label+' => 'Wird im E-Mail-Header mitgesendet',
'Class:ActionEmail/Attribute:to' => 'An',
'Class:ActionEmail/Attribute:to+' => 'Empfänger der Nachricht',
'Class:ActionEmail/Attribute:cc' => 'Kopie an',
@@ -538,7 +538,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ActionEmail/Attribute:bcc' => 'Blindkopie (BCC)',
'Class:ActionEmail/Attribute:bcc+' => '',
'Class:ActionEmail/Attribute:subject' => 'Betreff',
'Class:ActionEmail/Attribute:subject+' => 'Betreff der Email',
'Class:ActionEmail/Attribute:subject+' => 'Betreff der E-Mail',
'Class:ActionEmail/Attribute:body' => 'Inhalt der Nachricht',
'Class:ActionEmail/Attribute:body+' => '',
'Class:ActionEmail/Attribute:importance' => 'Priorität',
@@ -578,7 +578,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:TriggerOnObject/Attribute:target_class' => 'Zielklasse',
'Class:TriggerOnObject/Attribute:target_class+' => '',
'Class:TriggerOnObject/Attribute:filter' => 'Filter',
'Class:TriggerOnObject/Attribute:filter+' => 'Limit the object list (of the target class) which will activate the trigger~~',
'Class:TriggerOnObject/Attribute:filter+' => 'Einschränkung der Objekte (der Zielklasse) welche den Trigger aktivieren.',
'TriggerOnObject:WrongFilterQuery' => 'Fehlerhafter Filter-Query: %1$s',
'TriggerOnObject:WrongFilterClass' => 'Der Filter muss Objekte vom Typ \\"%1$s\\" zurückgeben.',
));
@@ -657,8 +657,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:TriggerOnObjectMention' => 'Trigger (bei Objekterwähnung)',
'Class:TriggerOnObjectMention+' => 'Trigger bei Objekterwähnung (@xxx) einer Objekt mit [eine Kinderklasse von] eine gegebene Klasse in ein Log-Attribut',
'Class:TriggerOnObjectMention/Attribute:mentioned_filter' => 'Mentioned filter~~',
'Class:TriggerOnObjectMention/Attribute:mentioned_filter+' => 'Limit the list of mentioned objects which will activate the trigger. If empty, any mentioned object (of any class) will activate it.~~',
'Class:TriggerOnObjectMention/Attribute:mentioned_filter' => 'Filter für Objekterwähnung',
'Class:TriggerOnObjectMention/Attribute:mentioned_filter+' => 'Einschränkung der Objekte welche diesen Trigger aktivieren. Wenn leer, wird er von jedem Objekt (beliebige Klasse) aktiviert.',
));
//
@@ -713,11 +713,11 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Intervall zwischen zwei vollständigen Reloads',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => 'Ein vollständiger Reload des gesamten Datenbestands muss mindestens in diesem Intervall erfolgen',
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Verhalten bei keinen Treffern',
'Class:SynchroDataSource/Attribute:action_on_zero+' => 'Verhalten, wenn die Suche keine Objekte zurückgibt',
'Class:SynchroDataSource/Attribute:action_on_zero+' => 'Verhalten, wenn die Suche keine Objekte zurück gibt',
'Class:SynchroDataSource/Attribute:action_on_one' => 'Verhalten bei einem Treffer',
'Class:SynchroDataSource/Attribute:action_on_one+' => 'Verhalten, wenn die Suche genau ein Objekt zurückgibt',
'Class:SynchroDataSource/Attribute:action_on_one+' => 'Verhalten, wenn die Suche genau ein Objekt zurück gibt',
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Verhalten bei vielen Treffern',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => 'Verhalten, wenn die Suche mehr als ein Objekt zurückgibt',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => 'Verhalten, wenn die Suche mehr als ein Objekt zurück gibt',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Zugelassene Benutzer',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => 'Benutzer, die synchronisierte Objekte löschen dürfen',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Niemand',
@@ -749,7 +749,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Core:SynchroUpdate:Yes' => 'Ja',
'Core:SynchroUpdate:No' => 'Nein',
'Core:Synchro:LastestStatus' => 'Neuester Status',
'Core:Synchro:History' => 'Synchronisations-Verlauf',
'Core:Synchro:History' => 'Synchronisationsverlauf',
'Core:Synchro:NeverRun' => 'Synchronisation noch nicht erfolgt. Kein Protokoll verfügbar.',
'Core:Synchro:SynchroEndedOn_Date' => 'Die letzte Synchronisation endete um %1$s.',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Die Synchronisation, die um %1$s gestartet wurde, läuft noch ...',
@@ -773,13 +773,13 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Core:SynchroLogTitle' => '%1$s - %2$s',
'Core:Synchro:Nb_Replica' => 'Replica verarbeitet: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Mindestens ein Abgleichsschlüssel muss angegeben werden, oder das Abgleichsvorgehen muß den primären Schlüssel verwenden.',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Mindestens ein Abgleichsschlüssel muss angegeben werden, oder das Abgleichsvorgehen muss den primären Schlüssel verwenden.',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'Der Zeitraum bis zur endgültigen Löschung muss angegeben werden, da die Objekte nach einer Kennzeichnung als obsolet gelöscht werden.',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Obsolete Objekte werden aktualisiert, aber es wurde keine Aktualisierung angegeben.',
'Class:SynchroDataSource/Error:DataTableAlreadyExists' => 'Tabelle %1$s existiert bereits in der Datenbank. Bitte benutzen Sie einen anderen Namen für die Datenbanktabelle aus dieser Datenquelle.',
'Core:SynchroReplica:PublicData' => 'Öffentliche Daten',
'Core:SynchroReplica:PrivateDetails' => 'Private Hinweise',
'Core:SynchroReplica:BackToDataSource' => 'Zurück zur Synchronisations-Datenquelle: %1$s',
'Core:SynchroReplica:BackToDataSource' => 'Zurück zur Synchronisationsdatenquelle: %1$s',
'Core:SynchroReplica:ListOfReplicas' => 'Liste der Replica',
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Primärschlüssel)',
'Core:SynchroAtt:attcode' => 'Attribut',
@@ -807,7 +807,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Core:SyncSplitModeCLIOnly' => 'Die Synchronisation kann nur in Chunks ausgeführt werden, wenn sie im CLI-Moduls verwendet wird.',
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s Replicas, %2$s Fehler, %3$s Warnung(en).',
'Core:SynchroReplica:TargetObject' => 'Synchronisiertes Objekt: %1$s',
'Class:AsyncSendEmail' => 'Email (asynchron)',
'Class:AsyncSendEmail' => 'E-Mail (asynchron)',
'Class:AsyncSendEmail/Attribute:to' => 'An',
'Class:AsyncSendEmail/Attribute:subject' => 'Betreff',
'Class:AsyncSendEmail/Attribute:body' => 'Body',
@@ -832,7 +832,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Erzeugen',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Fehler',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Ersten Treffer benutzen',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Löschungs-Policy',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Löschrichtlinie',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Löschen',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignorieren',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Update',
@@ -915,7 +915,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
// Bulk export
'Core:BulkExport:MissingParameter_Param' => 'Fehlender Parameter "%1$s"',
'Core:BulkExport:InvalidParameter_Query' => 'ungültiger Wert für den Paramter "query". Es gibt keinen Eintrag in der Query-Bibliothek, der zu der id "%1$s" korrespondiert.',
'Core:BulkExport:InvalidParameter_Query' => 'ungültiger Wert für den Parameter "query". Es gibt keinen Eintrag in der Query-Bibliothek, der zu der id "%1$s" korrespondiert.',
'Core:BulkExport:ExportFormatPrompt' => 'Exportformat:',
'Core:BulkExportOf_Class' => '%1$s-Export',
'Core:BulkExport:ClickHereToDownload_FileName' => 'Klicken Sie hier um %1$s herunterzuladen',
@@ -926,7 +926,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Core:BulkExport:XLSXFormat' => 'Excel 2007 oder neuer (*.xlsx)',
'Core:BulkExport:PDFFormat' => 'PDF-Dokument (*.pdf)',
'Core:BulkExport:DragAndDropHelp' => 'Nutzen Sie Drag and Drop für die Spaltenüberschriften um die Spalten zu sortieren. Vorschau %1$s Zeilen. Gesamtzeilenzahl für den Export: %2$s.',
'Core:BulkExport:EmptyPreview' => 'Wählen Sie die Spalten für den Export aus der obenstehenden Liste',
'Core:BulkExport:EmptyPreview' => 'Wählen Sie die Spalten für den Export aus der oben stehenden Liste',
'Core:BulkExport:ColumnsOrder' => 'Spaltenreihenfolge',
'Core:BulkExport:AvailableColumnsFrom_Class' => 'Verfügbare Spalten für %1$s',
'Core:BulkExport:NoFieldSelected' => 'Wählen Sie mindestens eine Spalte für den Export aus',
@@ -934,10 +934,10 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Core:BulkExport:UncheckAll' => 'Auswahl aufheben',
'Core:BulkExport:ExportCancelledByUser' => 'Export durch den Benutzer abgebrochen',
'Core:BulkExport:CSVOptions' => 'CSV-Optionen',
'Core:BulkExport:CSVLocalization' => 'Lokaliserung',
'Core:BulkExport:CSVLocalization' => 'Lokalisierung',
'Core:BulkExport:PDFOptions' => 'PDF-Optionen',
'Core:BulkExport:PDFPageFormat' => 'Seitenformat',
'Core:BulkExport:PDFPageSize' => 'Seitengrösse:',
'Core:BulkExport:PDFPageSize' => 'Seitengröße:',
'Core:BulkExport:PageSize-A4' => 'A4',
'Core:BulkExport:PageSize-A3' => 'A3',
'Core:BulkExport:PageSize-Letter' => 'Letter',
@@ -1088,8 +1088,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:AsyncTask/Attribute:last_error+' => '',
'Class:AsyncTask/Attribute:last_attempt' => 'Letzter Versuch',
'Class:AsyncTask/Attribute:last_attempt+' => '',
'Class:AsyncTask:InvalidConfig_Class_Keys' => 'Invalid format for the configuration of "async_task_retries[%1$s]". Expecting an array with the following keys: %2$s~~',
'Class:AsyncTask:InvalidConfig_Class_InvalidKey_Keys' => 'Invalid format for the configuration of "async_task_retries[%1$s]": unexpected key "%2$s". Expecting only the following keys: %3$s~~',
'Class:AsyncTask:InvalidConfig_Class_Keys' => 'Ungültiges Format der Konfiguration für "async_task_retries[%1$s]". Erwartet wird ein Array mit den Schlüsseln: %2$s',
'Class:AsyncTask:InvalidConfig_Class_InvalidKey_Keys' => 'Ungültiges Format der Konfiguration für "async_task_retries[%1$s]": unerwarteter Schlüssel "%2$s". Erwartet werden nur die Schlüssel: %3$s',
));
//
@@ -1127,6 +1127,3 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:ResourceSystemMenu' => 'Ressource "System Menü"',
'Class:ResourceSystemMenu+' => '',
));

View File

@@ -6,7 +6,7 @@
Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:AuditCategory' => 'Audit-Kategorie',
'Class:AuditCategory+' => 'Definition einer Objektgruppe, die durch Regeln überprüft werden soll.',
'Class:AuditCategory/Attribute:name' => 'Kategorienname',
'Class:AuditCategory/Attribute:name' => 'Kategoriename',
'Class:AuditCategory/Attribute:name+' => 'Kurzname für diese Kategorie',
'Class:AuditCategory/Attribute:description' => 'Beschreibung der Audit-Kategorien',
'Class:AuditCategory/Attribute:description+' => 'Ausführliche Beschreibung dieser Audit-Kategorie',
@@ -33,7 +33,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:AuditRule/Attribute:query' => 'Durchzuführende Abfrage',
'Class:AuditRule/Attribute:query+' => 'Die auszuführende OQL-Abfrage',
'Class:AuditRule/Attribute:valid_flag' => 'Gültiges Objekt?',
'Class:AuditRule/Attribute:valid_flag+' => 'true falls die Regel ein gültiges Objekt zurückgibt, andernfalls false',
'Class:AuditRule/Attribute:valid_flag+' => 'true falls die Regel ein gültiges Objekt zurück gibt, andernfalls false',
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'true',
'Class:AuditRule/Attribute:valid_flag/Value:true+' => 'true',
'Class:AuditRule/Attribute:valid_flag/Value:false' => 'false',
@@ -41,7 +41,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:AuditRule/Attribute:category_id' => 'Kategorie',
'Class:AuditRule/Attribute:category_id+' => 'Kategorie für diese Regel',
'Class:AuditRule/Attribute:category_name' => 'Kategorie',
'Class:AuditRule/Attribute:category_name+' => 'Kategorienname für diese Regel',
'Class:AuditRule/Attribute:category_name+' => 'Kategoriename für diese Regel',
));
//
@@ -86,11 +86,11 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:User/Attribute:org_id' => 'Organisation',
'Class:User/Attribute:org_id+' => 'Organisation der verknüpften Person',
'Class:User/Attribute:last_name' => 'Nachname',
'Class:User/Attribute:last_name+' => 'Nachname des Kontaktes',
'Class:User/Attribute:last_name+' => 'Nachname des Kontakts',
'Class:User/Attribute:first_name' => 'Vorname',
'Class:User/Attribute:first_name+' => 'Vorname des Kontaktes',
'Class:User/Attribute:email' => 'Email-Adresse',
'Class:User/Attribute:email+' => 'Email-Adresse des Kontaktes',
'Class:User/Attribute:first_name+' => 'Vorname des Kontakts',
'Class:User/Attribute:email' => 'E-Mail-Adresse',
'Class:User/Attribute:email+' => 'E-Mail-Adresse des Kontakts',
'Class:User/Attribute:login' => 'Login',
'Class:User/Attribute:login+' => 'Benutzer-Anmeldename',
'Class:User/Attribute:language' => 'Sprache',
@@ -110,10 +110,10 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:User/Error:LoginMustBeUnique' => 'Login-Namen müssen unterschiedlich sein - "%1s" benutzt diesen Login-Name bereits.',
'Class:User/Error:AtLeastOneProfileIsNeeded' => 'Mindestens ein Profil muss diesem Benutzer zugewiesen sein.',
'Class:User/Error:ProfileNotAllowed' => 'Profile "%1$s" cannot be added it will deny the access to backoffice~~',
'Class:User/Error:StatusChangeIsNotAllowed' => 'Changing status is not allowed for your own User~~',
'Class:User/Error:AllowedOrgsMustContainUserOrg' => 'Allowed organizations must contain User organization~~',
'Class:User/Error:CurrentProfilesHaveInsufficientRights' => 'The current list of profiles does not give sufficient access rights (Users are not modifiable anymore)~~',
'Class:User/Error:ProfileNotAllowed' => 'Profil "%1$s" kann nicht hinzugefügt werde, es verhindert den Zugriff auf das Backoffice.',
'Class:User/Error:StatusChangeIsNotAllowed' => 'Statusänderungen sind für den eigenen Benutzer nicht erlaubt.',
'Class:User/Error:AllowedOrgsMustContainUserOrg' => 'Die Organisation des Benutzers muss in den erlaubten Organisationen enthalten sein.',
'Class:User/Error:CurrentProfilesHaveInsufficientRights' => 'Die aktuelle Liste an Profilen vergibt unzureichende Berechtigungen (Benutzer können nicht mehr geändert werden)',
'Class:User/Error:AtLeastOneOrganizationIsNeeded' => 'Mindestens eine Organisation muss diesem Benutzer zugewiesen sein.',
'Class:User/Error:OrganizationNotAllowed' => 'Diese Organisation ist nicht erlaubt.',
'Class:User/Error:UserOrganizationNotAllowed' => 'Das Benutzerkonto gehört nicht zu den für Sie freigegebenen Organisationen',
@@ -412,7 +412,7 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'UI:Button:Insert' => 'Einfügen',
'UI:Button:More' => 'Mehr',
'UI:Button:Less' => 'Weniger',
'UI:Button:Wait' => 'Bitte warten Sie, während die Felder geupdated werden...',
'UI:Button:Wait' => 'Bitte warten Sie, während die Felder aktualisiert werden...',
'UI:Treeview:CollapseAll' => 'Alle einklappen',
'UI:Treeview:ExpandAll' => 'Alle ausklappen',
'UI:UserPref:DoNotShowAgain' => 'Nicht wieder zeigen',
@@ -424,19 +424,19 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'UI:SearchFor_Class' => 'Suche nach Objekten vom Typ "%1$s"',
'UI:NoObjectToDisplay' => 'Kein Objekt zur Anzeige vorhanden.',
'UI:Error:SaveFailed' => 'Objekt kann nicht gespeichert werden:',
'UI:Error:MandatoryTemplateParameter_object_id' => 'Parameter object_id ist erforderlich, wenn link_attr verwendet wird. Überprüfen Sie die Defintion des Display-Templates.',
'UI:Error:MandatoryTemplateParameter_target_attr' => 'Parameter target_attr ist erforderlich, wenn link_attr verwendet wird. Überprüfen Sie die Defintion des Display-Templates.',
'UI:Error:MandatoryTemplateParameter_group_by' => 'Parameter group_by ist erforderlich. Überprüfen Sie die Defintion des Display-Templates.',
'UI:Error:MandatoryTemplateParameter_object_id' => 'Parameter object_id ist erforderlich, wenn link_attr verwendet wird. Überprüfen Sie die Definition des Display-Templates.',
'UI:Error:MandatoryTemplateParameter_target_attr' => 'Parameter target_attr ist erforderlich, wenn link_attr verwendet wird. Überprüfen Sie die Definition des Display-Templates.',
'UI:Error:MandatoryTemplateParameter_group_by' => 'Parameter group_by ist erforderlich. Überprüfen Sie die Definition des Display-Templates.',
'UI:Error:InvalidGroupByFields' => 'Ungültige Felder-Liste, um diese zu gruppieren von: "%1$s".',
'UI:Error:UnsupportedStyleOfBlock' => 'Fehler: nicht unterstützter Blockform: "%1$s".',
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'Ungültige Link-Defintion: die Klasse der zu managenden Objekte: %1$s wurde nicht als externer Schlüssel in der Klasse %2$s gefunden.',
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'Ungültige Link-Definition: die Klasse der zu managenden Objekte: %1$s wurde nicht als externer Schlüssel in der Klasse %2$s gefunden.',
'UI:Error:Object_Class_Id_NotFound' => 'Objekt: %1$s:%2$d wurde nicht gefunden.',
'UI:Error:WizardCircularReferenceInDependencies' => 'Fehler: gegenseitige Beziehung in den Abhängigkeiten zwischen den Feldern, überprüfen Sie das Datenmodell.',
'UI:Error:UploadedFileTooBig' => 'Die hochgeladene Datei ist zu groß. (Maximal erlaubte Dateigröße ist %1$s. Überprüfen Sie upload_max_filesize und post_max_size in der PHP-Konfiguration.',
'UI:Error:UploadedFileTruncated.' => 'Hochgeladene Datei wurde beschränkt!',
'UI:Error:NoTmpDir' => 'Der temporäre Ordner ist nicht definiert.',
'UI:Error:CannotWriteToTmp_Dir' => 'Nicht möglich, die tempöräre Datei auf die Festplatte zu speichern: upload_tmp_dir = "%1$s".',
'UI:Error:UploadStoppedByExtension_FileName' => 'Der Upload wurde von der Erweiterung gestoppt. (urspünglicher Dateiname = "%1$s").',
'UI:Error:CannotWriteToTmp_Dir' => 'Nicht möglich, die temporäre Datei auf die Festplatte zu speichern: upload_tmp_dir = "%1$s".',
'UI:Error:UploadStoppedByExtension_FileName' => 'Der Upload wurde von der Erweiterung gestoppt. (ursprünglicher Dateiname = "%1$s").',
'UI:Error:UploadFailedUnknownCause_Code' => 'Dateiupload fehlgeschlagen, unbekannte Ursache (Fehlercode = "%1$s").',
'UI:Error:1ParametersMissing' => 'Fehler: der folgende Parameter muss für diese Operation spezifiziert sein: %1$s.',
@@ -492,7 +492,7 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'UI:Menu:New' => 'Neu...',
'UI:Menu:Add' => 'Hinzufügen...',
'UI:Menu:Manage' => 'Verwalten...',
'UI:Menu:EMail' => 'eMail',
'UI:Menu:EMail' => 'E-Mail',
'UI:Menu:CSVExport' => 'CSV-Export...',
'UI:Menu:Modify' => 'Modifizieren...',
'UI:Menu:Delete' => 'Löschen...',
@@ -527,7 +527,7 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'UI:Login:ForgotPwdForm' => 'Neues Passwort zusenden',
'UI:Login:ForgotPwdForm+' => ITOP_APPLICATION_SHORT.' kann Ihnen eine Mail mit Anweisungen senden, wie Sie Ihren Account/Passwort zurücksetzen können',
'UI:Login:ResetPassword' => 'Jetzt senden!',
'UI:Login:ResetPwdFailed' => 'Konnte keine Email versenden: %1$s',
'UI:Login:ResetPwdFailed' => 'Konnte keine E-Mail versenden: %1$s',
'UI:Login:SeparatorOr' => 'oder',
'UI:ResetPwd-Error-WrongLogin' => '\'%1$s\' ist kein gültiger Login',
@@ -535,14 +535,14 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'UI:ResetPwd-Error-FixedPwd' => 'das Benutzerkonto erlaubt keinen Passwort-Reset. ',
'UI:ResetPwd-Error-NoContact' => 'das Benutzerkonto ist nicht mit einer Person verknüpft. ',
'UI:ResetPwd-Error-NoEmailAtt' => 'das Benutzerkonto ist nicht mit einer Person verknüpft, die eine Mailadresse besitzt. Bitte wenden Sie sich an Ihren Administrator. ',
'UI:ResetPwd-Error-NoEmail' => 'die email Adresse dieses Accounts fehlt. Bitte kontaktieren Sie Ihren Administrator.',
'UI:ResetPwd-Error-Send' => 'Beim Versenden der Email trat ein technisches Problem auf. Bitte kontaktieren Sie Ihren Administrator.',
'UI:ResetPwd-Error-NoEmail' => 'die E-Mail-Adresse dieses Accounts fehlt. Bitte kontaktieren Sie Ihren Administrator.',
'UI:ResetPwd-Error-Send' => 'Beim Versenden der E-Mail trat ein technisches Problem auf. Bitte kontaktieren Sie Ihren Administrator.',
'UI:ResetPwd-EmailSent' => 'Bitte schauen Sie in Ihre Mailbox und folgen Sie den Anweisungen.',
'UI:ResetPwd-EmailSubject' => 'Zurücksetzen Ihres '.ITOP_APPLICATION_SHORT.'-Passworts',
'UI:ResetPwd-EmailBody' => '<body><p>Sie haben das Zurücksetzen Ihres '.ITOP_APPLICATION_SHORT.' Passworts angefordert.</p><p>Bitte folgen Sie diesem Link (funktioniert nur einmalig) : <a href="%1$s">neues Passwort eingeben</a></p>.',
'UI:ResetPwd-Title' => 'Passwort zurücksetzen',
'UI:ResetPwd-Error-InvalidToken' => 'Entschuldigung, aber entweder das passwort wurde bereits zurückgesetzt, oder Sie haben mehrere eMails für das Zurücksetzen erhalten. Bitte nutzen Sie den link in der letzten Mail, die Sie erhalten haben.',
'UI:ResetPwd-Error-InvalidToken' => 'Entschuldigung, aber entweder das Passwort wurde bereits zurückgesetzt, oder Sie haben mehrere E-Mails für das Zurücksetzen erhalten. Bitte nutzen Sie den link in der letzten Mail, die Sie erhalten haben.',
'UI:ResetPwd-Error-EnterPassword' => 'Geben Sie ein neues Passwort für das Konto \'%1$s\' ein.',
'UI:ResetPwd-Ready' => 'Das Passwort wurde geändert. ',
'UI:ResetPwd-Login' => 'Klicken Sie hier um sich einzuloggen...',
@@ -566,13 +566,13 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'UI:Login:Error:AccessRestricted' => 'Der '.ITOP_APPLICATION_SHORT.'-Zugang ist gesperrt. Bitte kontaktieren Sie Ihren '.ITOP_APPLICATION_SHORT.'-Administrator.',
'UI:Login:Error:AccessAdmin' => 'Zugang nur für Personen mit Administratorrechten. Bitte kontaktieren Sie Ihren '.ITOP_APPLICATION_SHORT.'-Administrator.',
'UI:Login:Error:WrongOrganizationName' => 'Unbekannte Organisation',
'UI:Login:Error:MultipleContactsHaveSameEmail' => 'Mehrere Kontakte mit gleicher EMail-Adresse',
'UI:Login:Error:MultipleContactsHaveSameEmail' => 'Mehrere Kontakte mit gleicher E-Mail-Adresse',
'UI:Login:Error:NoValidProfiles' => 'Kein gültiges Profil ausgewählt',
'UI:CSVImport:MappingSelectOne' => 'Bitte wählen',
'UI:CSVImport:MappingNotApplicable' => '-- Dieses Feld ignorieren --',
'UI:CSVImport:NoData' => 'Keine Daten eingegeben ... bitte geben Sie Daten ein!',
'UI:Title:DataPreview' => 'Datenvorschau',
'UI:CSVImport:ErrorOnlyOneColumn' => 'Fehler: die Daten behinhalten nur eine Spalte. Haben Sie das dazugehörige Trennzeichen ausgewählt?',
'UI:CSVImport:ErrorOnlyOneColumn' => 'Fehler: die Daten beinhalten nur eine Spalte. Haben Sie das dazugehörige Trennzeichen ausgewählt?',
'UI:CSVImport:FieldName' => 'Feld %1$d',
'UI:CSVImport:DataLine1' => 'Daten-Zeile 1',
'UI:CSVImport:DataLine2' => 'Daten-Zeile 2',
@@ -617,7 +617,7 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'UI:CSVImport:CommentsAndHeader' => 'Kommentare und Kopfzeile',
'UI:CSVImport:SelectClass' => 'Wählen Sie die Klasse zum Import:',
'UI:CSVImport:AdvancedMode' => 'Fortgeschrittener Modus',
'UI:CSVImport:AdvancedMode+' => 'Im fortgeschrittenen Modus kann die "ID" (primärer Schlüssel) der Objekte benutzt werden, um Ojekte zu aktualisieren oder umzubenennen.Allerdings kann die Spalte "ID" (sofern vorhanden) nur als Suchkriterium verwendet werden und nicht mit anderen Suchkriterien kombiniert werden.',
'UI:CSVImport:AdvancedMode+' => 'Im fortgeschrittenen Modus kann die "ID" (primärer Schlüssel) der Objekte benutzt werden, um Objekte zu aktualisieren oder umzubenennen.Allerdings kann die Spalte "ID" (sofern vorhanden) nur als Suchkriterium verwendet werden und nicht mit anderen Suchkriterien kombiniert werden.',
'UI:CSVImport:SelectAClassFirst' => 'Wählen Sie bitte zuerst eine Klasse aus, bevor Sie das Mapping erstellen',
'UI:CSVImport:HeaderFields' => 'Felder',
'UI:CSVImport:HeaderMappings' => 'Mappings',
@@ -692,7 +692,7 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'UI:Audit:Dashboard:ObjectsAudited' => 'Auditierte Objekte',
'UI:Audit:Dashboard:ObjectsInError' => 'Objekte mit Fehlern',
'UI:Audit:Dashboard:ObjectsValidated' => 'Validierte Objekte',
'UI:Audit:AuditCategory:Subtitle' => '%1$s Fehler von ingesamt %2$s - %3$s%%',
'UI:Audit:AuditCategory:Subtitle' => '%1$s Fehler von insgesamt %2$s - %3$s%%',
'UI:RunQuery:Title' => ITOP_APPLICATION_SHORT.' - OQL-Abfrage-Auswertung',
@@ -715,7 +715,7 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'UI:Query:UrlForExcel' => 'URL für MS Excel Web Queries',
'UI:Query:UrlV1' => 'Die Liste der Felder wurde nicht spezifiziert. Die Seite <em>export-V2.php</em> kann ohne diese Angabe nicht verarbeitet werden. Deswegen, zeigt die nachstehende URL zu der Legacy-Page: <em>export.php</em>. Diese Legacy-Version des Exports hat folgende Limitierungen: Die Liste exportierter Felder kann, abhängig vom Output-Format und vom Datenmodell von '.ITOP_APPLICATION_SHORT.', variieren. Möchten Sie garantieren, dass die Liste aller exportierten Spalten stabil bleibt, müssen Sie einen Wert für das Attribut Feld angeben und die Seite <em>export-V2.php</em> nutzen.',
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' Objekte-Schema',
'UI:Schema:TitleForClass' => '%1$s Schema~~',
'UI:Schema:TitleForClass' => '%1$s Schema',
'UI:Schema:CategoryMenuItem' => 'Kategorie <b>%1$s</b>',
'UI:Schema:Relationships' => 'Wechselseite Beziehungen',
'UI:Schema:AbstractClass' => 'Abstrakte Klasse: ein Objekt dieser Klasse kann nicht instanziiert werden.',
@@ -830,7 +830,7 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'UI:Delete:SorryDeletionNotAllowed' => 'Leider ist Ihnen nicht gestattet, dieses Objekt zu löschen. Eine ausführliche Erklärung dazu finden Sie oben',
'UI:Delete:PleaseDoTheManualOperations' => 'Bitte führen Sie die oben aufgelisteten manuellen Operationen zuerst durch, bevor Sie dieses Objekt löschen.',
'UI:Delect:Confirm_Object' => 'Bitte bestätigen Sie, dass Sie %1$s löschen möchten.',
'UI:Delect:Confirm_Count_ObjectsOf_Class' => 'Bitte bestätigen Sie, dasss Sie die folgenden %1$d Objekte der Klasse %2$s löschen möchten.',
'UI:Delect:Confirm_Count_ObjectsOf_Class' => 'Bitte bestätigen Sie, dass Sie die folgenden %1$d Objekte der Klasse %2$s löschen möchten.',
'UI:WelcomeToITop' => 'Willkommen bei '.ITOP_APPLICATION_SHORT,
'UI:DetailsPageTitle' => ITOP_APPLICATION_SHORT.' - %1$s - %2$s Details',
'UI:ErrorPageTitle' => ITOP_APPLICATION_SHORT.' - Fehler',
@@ -910,7 +910,7 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'Menu:AdminTools' => 'Admin-Tools',// Duplicated into itop-welcome-itil (will be removed from here...)
'Menu:AdminTools+' => 'Administrationswerkzeuge',// Duplicated into itop-welcome-itil (will be removed from here...)
'Menu:AdminTools?' => 'Werkzeuge, die nur für Benutzer mit Adminstratorprofil zugänglich sind',// Duplicated into itop-welcome-itil (will be removed from here...)
'Menu:AdminTools?' => 'Werkzeuge, die nur für Benutzer mit Administratorprofil zugänglich sind',// Duplicated into itop-welcome-itil (will be removed from here...)
'Menu:SystemTools' => 'System',
'UI:ChangeManagementMenu' => 'Change Management',
@@ -977,24 +977,24 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
<li>Einige Trigger werden ausgeführt, wenn ein <b>Schwellenwert</b> auf <b>TTO</b> oder <b>TTR</b> <b>erreicht</b> ist.</li>
</ol>
</p><p>
<i><b>Aktionen</b></i> define the actions to be performed when the triggers execute. For now there are only two kind of actions:
<i><b>Aktionen</b></i> definieren, welche beim auslösen eines Triggers ausgeführt werden. Aktuell gibt es nur zwei Arten von Aktionen:
<ol>
<li>Sending an email message: Such actions also define the template to be used for sending the email as well as the other parameters of the message like the recipients, importance, etc.<br />
<li>Senden einer E-Mail: Solche Aktionen definieren die verwendete Vorlage sowie andere Parameter der Nachricht wie Empfänger, Wichtigkeit, usw.<br />
Eine spezielle Seite: <a href="../setup/email.test.php" target="_blank">email.test.php</a> steht zum Testen und zur Fehlerbehebung Ihrer PHP-Mailkonfiguration bereit.</li>
<li>Outgoing webhooks: Allow integration with a third-party application by sending structured data to a defined URL.</li>
<li>Ausgehende webhooks: Erlaubt die Integration mit einer externen Anwendung indem strukturierte Daten an eine definierte URL gesendet werden.</li>
</ol>
</p>
<p>Um Aktionen auszuführen, müssen diese mit Trigger verknüpft sein.
Wenn Aktionen mit Trigger verknüpft sind, bekommt jede Aktion eine Auftragsnummer, die die Reihenfolge der auszuführenden Aktionen festlegt.</p>~~',
Wenn Aktionen mit Trigger verknüpft sind, bekommt jede Aktion eine Auftragsnummer, die die Reihenfolge der auszuführenden Aktionen festlegt.</p>',
'UI:NotificationsMenu:Triggers' => 'Trigger',
'UI:NotificationsMenu:AvailableTriggers' => 'Verfügbare Trigger',
'UI:NotificationsMenu:OnCreate' => 'Wenn ein Objekt erstellt wird',
'UI:NotificationsMenu:OnStateEnter' => 'Wenn ein Objekt einen gegebenen Status erlangt',
'UI:NotificationsMenu:OnStateLeave' => 'Wenn ein Objekt einen gegebenen Status verlässt',
'UI:NotificationsMenu:Actions' => 'Aktionen',
'UI:NotificationsMenu:Actions:ActionEmail' => 'Email actions~~',
'UI:NotificationsMenu:Actions:ActionWebhook' => 'Webhook actions (outgoing integrations)~~',
'UI:NotificationsMenu:Actions:Action' => 'Other actions~~',
'UI:NotificationsMenu:Actions:ActionEmail' => 'E-Mail Aktionen',
'UI:NotificationsMenu:Actions:ActionWebhook' => 'Webhook Aktionen (ausgehende Integrationen)',
'UI:NotificationsMenu:Actions:Action' => 'Andere Aktionen',
'UI:NotificationsMenu:AvailableActions' => 'Verfügbare Aktionen',
'Menu:TagAdminMenu' => 'Tag-Konfiguration',
@@ -1088,7 +1088,7 @@ Wenn Aktionen mit Trigger verknüpft sind, bekommt jede Aktion eine Auftragsnumm
'Portal:NoRequestMgmt' => 'Lieber %1$s, Sie wurden hierher umgeleitet, weil Ihr Account mit dem Profil \'Portal user\' konfiguriert wurde. Leider wurde in '.ITOP_APPLICATION_SHORT.' aber das \'Request Management\'-Feature nicht installiert. Bitte kontaktieren Sie Ihren Administrator.',
'Portal:Refresh' => 'Neu laden',
'Portal:Back' => 'Zurück',
'Portal:WelcomeUserOrg' => 'Wilkommen %1$s, von %2$s',
'Portal:WelcomeUserOrg' => 'Willkommen %1$s, von %2$s',
'Portal:TitleDetailsFor_Request' => 'Details für Benutzeranfrage',
'Portal:ShowOngoing' => 'Zeige offene Requests',
'Portal:ShowClosed' => 'Zeige geschlossene Requests',
@@ -1144,10 +1144,10 @@ Wenn Aktionen mit Trigger verknüpft sind, bekommt jede Aktion eine Auftragsnumm
'UI:CaseLogTypeYourTextHere' => 'Geben Sie Ihren Text hier ein:',
'UI:CaseLog:Header_Date_UserName' => '%1$s - %2$s:',
'UI:CaseLog:InitialValue' => 'Anfangswert:',
'UI:AttemptingToSetASlaveAttribute_Name' => 'Das Feld %1$s ist nicht schreibbar, weil es durch die Datensynchronisation geführt wird. Wert nicht gesetzt.',
'UI:AttemptingToSetASlaveAttribute_Name' => 'Das Feld %1$s ist nicht beschreibbar, weil es durch die Datensynchronisation geführt wird. Wert nicht gesetzt.',
'UI:ActionNotAllowed' => 'Sie haben nicht die Berechtigung, diese Aktion auf diesen Objekten auszuführen.',
'UI:BulkAction:NoObjectSelected' => 'Bitte wählen Sie mindestens ein Objekt, um diese Aktion auszuführen.',
'UI:AttemptingToChangeASlaveAttribute_Name' => 'Das Feld %1$s ist nicht schreibbar, weil es durch die Datensynchronisation geführt wird. Wert bleibt unverändert.',
'UI:AttemptingToChangeASlaveAttribute_Name' => 'Das Feld %1$s ist nicht beschreibbar, weil es durch die Datensynchronisation geführt wird. Wert bleibt unverändert.',
'UI:Pagination:HeaderSelection' => 'Gesamt: %1$s Objekte (%2$s Objekte ausgewählt).',
'UI:Pagination:HeaderNoSelection' => 'Gesamt: %1$s Objekte.',
'UI:Pagination:PageSize' => '%1$s Objekte pro Seite',
@@ -1169,7 +1169,7 @@ Wenn Aktionen mit Trigger verknüpft sind, bekommt jede Aktion eine Auftragsnumm
'UI:Favorites:ShowObsoleteData+' => 'Zeige obsolete (veraltete) Daten in Suchresultaten und Auswahllisten von Objekten',
'UI:NavigateAwayConfirmationMessage' => 'Jedwede Veränderung wird verworfen.',
'UI:CancelConfirmationMessage' => 'Sie werden Ihre Änderungen verlieren. Dennoch fortfahren?',
'UI:AutoApplyConfirmationMessage' => 'Einige Änderungen wurden noch nicht angewandt. Möchten Sie, daß '.ITOP_APPLICATION_SHORT.' diese berüchsichtigt?',
'UI:AutoApplyConfirmationMessage' => 'Einige Änderungen wurden noch nicht angewandt. Möchten Sie, dass '.ITOP_APPLICATION_SHORT.' diese berücksichtigt?',
'UI:Create_Class_InState' => 'Erzeuge die/das %1$s in Status: ',
'UI:OrderByHint_Values' => 'Sortierreihenfolge: %1$s',
'UI:Menu:AddToDashboard' => 'Zu Dashboard hinzufügen...',
@@ -1186,7 +1186,7 @@ Wenn Aktionen mit Trigger verknüpft sind, bekommt jede Aktion eine Auftragsnumm
'UI:ConfigureThisList' => 'Liste konfigurieren...',
'UI:ListConfigurationTitle' => 'Listenkonfiguration',
'UI:ColumnsAndSortOrder' => 'Spalten und Sortierrheienfolge:',
'UI:ColumnsAndSortOrder' => 'Spalten und Sortierreihenfolge:',
'UI:UseDefaultSettings' => 'Verwende Default-Einstellungen',
'UI:UseSpecificSettings' => 'Verwende folgende Einstellungen:',
'UI:Display_X_ItemsPerPage_prefix' => '',
@@ -1225,8 +1225,8 @@ Wenn Aktionen mit Trigger verknüpft sind, bekommt jede Aktion eine Auftragsnumm
'UI:DashboardEdit:AutoReload' => 'Automatischer Reload',
'UI:DashboardEdit:AutoReloadSec' => 'Intervall für automatischen Reload (Sekunden)',
'UI:DashboardEdit:AutoReloadSec+' => 'Der Mindestwert beträgt %1$d Sekunden',
'UI:DashboardEdit:Revert' => 'Revert~~',
'UI:DashboardEdit:Apply' => 'Apply~~',
'UI:DashboardEdit:Revert' => 'Zurücksetzen',
'UI:DashboardEdit:Apply' => 'Anwenden',
'UI:DashboardEdit:Layout' => 'Layout',
'UI:DashboardEdit:Properties' => 'Dashboard-Einstellungen',
@@ -1429,7 +1429,7 @@ Wenn Aktionen mit Trigger verknüpft sind, bekommt jede Aktion eine Auftragsnumm
'UI:About:Extension_Version' => 'Version: %1$s',
'UI:About:RemoteExtensionSource' => 'Data',
'UI:DisconnectedDlgMessage' => 'Sie sind abgemeldet. Sie müssen sich identifizeren, um die Anwendung weiter zu benutzen.',
'UI:DisconnectedDlgMessage' => 'Sie sind abgemeldet. Sie müssen sich identifizieren, um die Anwendung weiter zu benutzen.',
'UI:DisconnectedDlgTitle' => 'Warnung!',
'UI:LoginAgain' => 'Erneut einloggen',
'UI:StayOnThePage' => 'Auf dieser Seite bleiben',

View File

@@ -19,5 +19,5 @@
// Global search
Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Component:Breadcrumbs:PreviousItemsListToggler:Label' => 'Previous pages~~',
));
'UI:Component:Breadcrumbs:PreviousItemsListToggler:Label' => 'Vorherige Seiten',
));

View File

@@ -24,8 +24,8 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Datatables:Language:Info' => '_TOTAL_ Objekte',
'UI:Datatables:Language:InfoEmpty' => 'Keine Information',
'UI:Datatables:Language:EmptyTable' => 'Keine Daten in dieser Tabelle verfügbar',
'UI:Datatables:Language:Error' => 'An error occured while running the query~~',
'UI:Datatables:Language:Error' => 'Bei der Ausführung des Query ist ein Fehler aufgetreten',
'UI:Datatables:Language:DisplayLength:All' => 'Alle',
'UI:Datatables:Language:Sort:Ascending' => 'Aktivieren für aufsteigende Sortierung',
'UI:Datatables:Language:Sort:Descending' => 'Aktivieren für absteigende Sortierung',
));
));

View File

@@ -19,5 +19,5 @@
// Input
Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Component:Input:Password:DoesNotMatch' => 'Passwords do not match~~',
));
'UI:Component:Input:Password:DoesNotMatch' => 'Passwörter stimmen nicht überein',
));

View File

@@ -19,7 +19,7 @@
// Navigation menu
Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Unternehmenslogo',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Silo:Label' => 'Organisation zum filtern auswählen',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Ausklappen/Einklappen',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Ausklappen/Einklappen (Gefiltert nach %1$s)',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...',
@@ -28,7 +28,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'Kein Ergebnis für diesen Menü-Filter',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s Profilbild',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Benutzermenü öffnen',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filtere Menüeinträge',
));
));

View File

@@ -30,12 +30,12 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Preferences:RichText:ToolbarState:Collapsed' => 'Eingeklappt',
'UI:Preferences:ActivityPanel:Title' => 'Aktives Panel',
'UI:Preferences:ActivityPanel:EntryFormOpened' => 'Formular standardmäßig geöffnet',
'UI:Preferences:ActivityPanel:EntryFormOpened+' => 'Ob ein Formular, wenn ein Objekt angezeigt wird, standardmäßig geöffnet ist. Wenn dieser Haken nicht gesetzt ist, können Sie das Formmular mit einem Klick auf den Compose-Button trotzdem jederzeit öffnen.',
'UI:Preferences:ActivityPanel:EntryFormOpened+' => 'Ob ein Formular, wenn ein Objekt angezeigt wird, standardmäßig geöffnet ist. Wenn dieser Haken nicht gesetzt ist, können Sie das Formular mit einem Klick auf den Compose-Button trotzdem jederzeit öffnen.',
'UI:Preferences:PersonalizeKeyboardShortcuts:Title' => 'Keyboard-Shortcuts dieser Applikation',
'UI:Preferences:PersonalizeKeyboardShortcuts:Input:Hint' => 'Geben Sie einen Keyboard-Shortcut ein',
'UI:Preferences:PersonalizeKeyboardShortcuts:Button:Tooltip' => 'Nehmen Sie einen Keyboard-Shortcut auf',
'UI:Preferences:PersonalizeKeyboardShortcuts:Button:Reset' => 'Reset~~',
'UI:Preferences:PersonalizeKeyboardShortcuts:Button:Reset:Tooltip' => 'Back to default keyboard shortcut~~',
'UI:Preferences:PersonalizeKeyboardShortcuts:Button:Reset' => 'Zurücksetzen',
'UI:Preferences:PersonalizeKeyboardShortcuts:Button:Reset:Tooltip' => 'Auf den Standard-Keyboard-Shortcut zurücksetzen',
'UI:Preferences:Tabs:Title' => 'Tabs',
'UI:Preferences:Tabs:Layout:Label' => 'Layout',
'UI:Preferences:Tabs:Layout:Horizontal' => 'Horizontal',

View File

@@ -17,10 +17,26 @@
*/
;
// Apply a listener to <body> element so we don't havec to create one for every button on the page
// Apply a listener to <body> element so we don't have to create one for every button on the page
// ibo-button elements
$('body').on('enter_loading_state.button.itop', '[data-role="ibo-button"]', function(){
$(this).addClass('ibo-is-loading').prop('disabled', true);
})
.on('leave_loading_state.button.itop', '[data-role="ibo-button"]', function(){
$(this).removeClass('ibo-is-loading').prop('disabled', false);
});
// ibo-button-group elements
$('body').on('enter_loading_state.button_group.itop', '[data-role="ibo-button-group"]', function(){
$(this).find('[data-role="ibo-button"]').each(function(){
$(this).prop('disabled', true);
});
$(this).find('[data-role="ibo-button"]:first').trigger('enter_loading_state.button.itop');
})
.on('leave_loading_state.button_group.itop', '[data-role="ibo-button-group"]', function(){
$(this).find('[data-role="ibo-button"]').each(function(){
$(this).prop('disabled', false);
});
$(this).find('[data-role="ibo-button"]:first').trigger('leave_loading_state.button.itop');
});

View File

@@ -51,8 +51,8 @@ $(function () {
<div class= "ibo-panel--title" > `+this._format(this.options.labels.columns_selection, i)+`</div>
</div>`;
sContent += `
<div className="ibo-panel--header-right">
<div className="ibo-panel--toolbar">
<div class="ibo-panel--header-right">
<div class="ibo-panel--toolbar">
<button class="check_all ibo-button ibo-is-regular ibo-is-neutral action" type="button"><span class=""ibo-button-label">`+this.options.labels.check_all+`</span></button>
<button class="uncheck_all ibo-button ibo-is-regular ibo-is-neutral action" type="button"><span class=""ibo-button-label">`+this.options.labels.uncheck_all+`</span></button>
</div>

View File

@@ -888,6 +888,9 @@ try
break;
case 'import_dashboard':
$oPage = new JsonPage();
$oPage->SetOutputDataOnly(true);
$sTransactionId = utils::ReadParam('transaction_id', '', false, 'transaction_id');
if (!utils::IsTransactionValid($sTransactionId, true))
{
@@ -916,7 +919,7 @@ try
{
$aResult['error'] = 'Dashboard id="'.$sDashboardId.'" not found.';
}
$oPage->add(json_encode($aResult));
$oPage->SetData($aResult);
break;
case 'toggle_dashboard':
@@ -1851,7 +1854,8 @@ EOF
// Save the generated PDF as an attachment
$sPDF = $oPage->get_pdf();
$oPage = new AjaxPage('');
$oPage = new JsonPage();
$oPage->SetOutputDataOnly(true);
$oAttachment = MetaModel::NewObject('Attachment');
$oAttachment->Set('item_class', $sObjClass);
$oAttachment->Set('item_id', $iObjKey);
@@ -1862,7 +1866,7 @@ EOF
'status' => 'ok',
'att_id' => $iAttachmentId,
);
$oPage->add(json_encode($aRet));
$oPage->SetData($aRet);
}
break;
@@ -2040,10 +2044,14 @@ EOF
break;
case 'export_build':
$oPage = new JsonPage();
$oPage->SetOutputDataOnly(true);
$oAjaxRenderController->ExportBuild($oPage, false);
break;
case 'export_build_portal':
$oPage = new JsonPage();
$oPage->SetOutputDataOnly(true);
$oAjaxRenderController->ExportBuild($oPage, true);
break;
@@ -2163,6 +2171,9 @@ EOF
break;
case 'cke_img_upload':
$oPage = new JsonPage();
$oPage->SetOutputDataOnly(true);
// Image uploaded via CKEditor
$aResult = array(
'uploaded' => 0,
@@ -2233,7 +2244,7 @@ EOF
$aResult['error'] = $e->GetMessage();
}
}
$oPage->add(json_encode($aResult));
$oPage->SetData($aResult);
break;
/** @noinspection PhpMissingBreakStatementInspection cke_upload_and_browse and cke_browse are chained */
@@ -2632,7 +2643,8 @@ EOF
// Navigation menu
//--------------------------------
case 'get_menus_count':
$oPage = new JsonPage();
$oPage->SetOutputDataOnly(true);
$oAjaxRenderController->GetMenusCount($oPage);
break;

View File

@@ -50,6 +50,7 @@ class ActivityPanel extends UIBlock
public const DEFAULT_HTML_TEMPLATE_REL_PATH = 'base/layouts/activity-panel/layout';
public const DEFAULT_JS_TEMPLATE_REL_PATH = 'base/layouts/activity-panel/layout';
public const DEFAULT_JS_FILES_REL_PATH = [
'js/jquery.ba-bbq.min.js',
'js/layouts/activity-panel/activity-panel.js',
];

View File

@@ -123,12 +123,12 @@ class AjaxRenderController
}
/**
* @param \AjaxPage $oPage
* @param \JsonPage $oPage
* @param bool $bTokenOnly
*
* @throws \Exception
*/
public static function ExportBuild(AjaxPage $oPage, $bTokenOnly)
public static function ExportBuild(JsonPage $oPage, $bTokenOnly)
{
register_shutdown_function(function () {
$aErr = error_get_last();
@@ -208,13 +208,13 @@ class AjaxRenderController
$aResult['message'] = Dict::Format('Core:BulkExport:ClickHereToDownload_FileName', $oExporter->GetDownloadFileName());
}
}
$oPage->add(json_encode($aResult));
$oPage->SetData($aResult);
} catch (BulkExportException $e) {
$aResult = array('code' => 'error', 'percentage' => 100, 'message' => utils::HtmlEntities($e->GetLocalizedMessage()));
$oPage->add(json_encode($aResult));
$oPage->SetData($aResult);
} catch (Exception $e) {
$aResult = array('code' => 'error', 'percentage' => 100, 'message' => utils::HtmlEntities($e->getMessage()));
$oPage->add(json_encode($aResult));
$oPage->SetData($aResult);
}
}
@@ -224,13 +224,13 @@ class AjaxRenderController
* The resulting JSON is added to the page with the format:
* {"code": "done or error", "counts": {"menu_id_1": count1, "menu_id_2": count2...}}
*
* @param \AjaxPage $oPage
* @param \JsonPage $oPage
*/
public function GetMenusCount(AjaxPage $oPage)
public function GetMenusCount(JsonPage $oPage)
{
$aCounts = ApplicationMenu::GetMenusCount();
$aResult = ['code' => 'done', 'counts' => $aCounts];
$oPage->add(json_encode($aResult));
$oPage->SetData($aResult);
}
/**

View File

@@ -0,0 +1,91 @@
<?php
namespace Combodo\iTop\Test\UnitTest\Core;
use ActionEmail;
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
use Exception;
use MetaModel;
use utils;
/**
* @runTestsInSeparateProcesses
* @preserveGlobalState disabled
* @backupGlobals disabled
* @covers \ActionEmail
*/
class ActionEmailTest extends ItopDataTestCase
{
/**
* @inheritDoc
*/
const CREATE_TEST_ORG = true;
/** @var \ActionEmail|null Temp ActionEmail created for tests */
protected static $oActionEmail = null;
protected function setUp()
{
parent::setUp();
static::$oActionEmail = MetaModel::NewObject('ActionEmail', [
'name' => 'Test action',
'status' => 'disabled',
'from' => 'unit-test@openitop.org',
'subject' => 'Test subject',
'body' => 'Test body',
]);
static::$oActionEmail->DBInsert();
}
/**
* @covers \ActionEmail::GenerateIdentifierForHeaders
* @dataProvider GenerateIdentifierForHeadersProvider
* @throws \Exception
*/
public function testGenerateIdentifierForHeaders(string $sHeaderName)
{
// Retrieve object
$oObject = MetaModel::GetObject('Organization', $this->getTestOrgId(), true, true);
$sObjClass = get_class($oObject);
$sObjId = $oObject->GetKey();
try {
$sTestedIdentifier = $this->InvokeNonPublicMethod('\ActionEmail', 'GenerateIdentifierForHeaders', static::$oActionEmail, [$oObject, $sHeaderName]);
} catch (Exception $oException) {
$sTestedIdentifier = null;
}
$sAppName = utils::Sanitize(ITOP_APPLICATION_SHORT, '', utils::ENUM_SANITIZATION_FILTER_VARIABLE_NAME);
$sEnvironmentHash = MetaModel::GetEnvironmentId();
switch ($sHeaderName) {
case ActionEmail::ENUM_HEADER_NAME_MESSAGE_ID:
// Note: For this test we can't use the more readable sprintf test as the generated timestamp will never be the same as the one generated during the call of the tested method
// $sTimestamp = microtime(true /* get as float*/);
// $sExpectedIdentifier = sprintf('%s_%s_%d_%f@%s.openitop.org', $sAppName, $sObjClass, $sObjId, $sTimestamp, $sEnvironmentHash);
$this->assertEquals(1, preg_match('/'.$sAppName.'_'.$sObjClass.'_'.$sObjId.'_[\d]+\.[\d]+@'.$sEnvironmentHash.'.openitop.org/', $sTestedIdentifier), "Identifier doesn't match regexp for header $sHeaderName, got $sTestedIdentifier");
break;
case ActionEmail::ENUM_HEADER_NAME_REFERENCES:
$sExpectedIdentifier = '<'.sprintf('%s_%s_%d@%s.openitop.org', $sAppName, $sObjClass, $sObjId, $sEnvironmentHash).'>';
$this->assertEquals($sExpectedIdentifier, $sTestedIdentifier);
break;
default:
$sExpectedIdentifier = null;
$this->assertEquals($sExpectedIdentifier, $sTestedIdentifier);
break;
}
}
public function GenerateIdentifierForHeadersProvider()
{
return [
'Message-ID' => ['Message-ID'],
'References' => ['References'],
'IncorrectHeaderName' => ['IncorrectHeaderName'],
];
}
}

View File

@@ -38,6 +38,7 @@ class AttributeURLTest extends ItopTestCase {
'Sharepoint URL 1' => ['https://mydomain1.sharepoint.com/:i:/r/sites/DSIMyDept/Shared%20Documents/Architecture%20Technique/02%20-%20R%C3%A9seau/Baie%2025C/Baie%201er/Baie-25C-1er.jpg?csf=1&web=1&e=Il3txR', 1],
'Sharepoint URL 2' => ['https://mydomain2.sharepoint.com/:u:/r/sites/DIS/ITSM/00_Admin_iTOP/iTop%20-%20Upgrade%20manuel/Procedure%20upgrade%20Combodo.url?csf=1&web=1&e=DAF0i3', 1],
'Alfresco URL 2' => ['http://alfresco.mydomain3.org/share/page/site/books/document-details?nodeRef=workspace://SpacesStore/6274f55f-a25b-4762-a863-77f7066f2034', 1],
'SF URL' => ['https://sourceforge.net/p/itop/discussion/customizing-itop/thread/707145b859/?limit=25#f53c', 1],
];
}
}

View File

@@ -106,18 +106,18 @@ function RunTask(BackgroundTask $oTask, $iTimeLimit)
$oTask->Set('system_user', utils::GetCurrentUserName());
$oTask->Set('running', 1);
$oTask->DBUpdate();
// Time in seconds allowed to the task
$iCurrTimeLimit = $iTimeLimit;
// Compute allowed time
if ($oRefClass->implementsInterface('iScheduledProcess'))
if ($oRefClass->implementsInterface('iScheduledProcess') === false)
{
$iCurrTimeLimit = $iTimeLimit;
}
else
{
// Periodic task, allow only 3x the period
$iCurrTimeLimit = time() + $oProcess->GetPeriodicity() * 3;
if ($iCurrTimeLimit > $iTimeLimit)
// Periodic task, allow only X times ($iMaxTaskExecutionTime) its periodicity (GetPeriodicity())
$iMaxTaskExecutionTime = MetaModel::GetConfig()->Get('cron_task_max_execution_time');
$iTaskLimit = time() + $oProcess->GetPeriodicity() * $iMaxTaskExecutionTime;
// If our proposed time limit is less than cron limit, and cron_task_max_execution_time is > 0
if ($iTaskLimit < $iTimeLimit && $iMaxTaskExecutionTime > 0)
{
$iCurrTimeLimit = $iTimeLimit;
$iCurrTimeLimit = $iTaskLimit;
}
}
$sMessage = $oProcess->Process($iCurrTimeLimit);