Compare commits

..

48 Commits

Author SHA1 Message Date
Denis Flaven
d40c85a64b (retrofit from trunk) Security: prevent grouping on password fields since it may lead to disclosure of the encrypted version of the password.
SVN:2.1.1[4246]
2016-06-22 14:00:37 +00:00
Denis Flaven
bfed914893 (retrofit from trunk) Properly sanitize the "switch_env" parameter and take it into account only if it contains a valid value.
SVN:2.1.1[4240]
2016-06-22 12:12:04 +00:00
Denis Flaven
17e49dcc55 (retrofit from trunk) Optimization/bug (!): Never use the whole object as a placeholder in ApplyParams !!
SVN:2.1.1[3933]
2016-02-29 16:26:18 +00:00
Denis Flaven
6ceab2ab5e Use one-way encryption for storing the token used for the "Forgotten password" feature.
SVN:2.1.1[3922]
2016-02-19 18:20:28 +00:00
Denis Flaven
b621e746d9 (retrofit from trunk) #1202: Fix for a security vulnerability in the Configuration Editor.
SVN:2.1.1[3905]
2016-02-11 10:30:19 +00:00
Denis Flaven
41345e6636 #1150: Spurious message "A restore is running..." - FIXED !
SVN:2.1.1[3866]
2016-01-20 16:06:05 +00:00
Denis Flaven
7c3a3820b7 Support of derived classes in "add_remove" edition mode for AttributeLinkSet fields (the search form was not refreshing / loading properly when toggling the class to search for).
SVN:2.1.1[3824]
2015-11-20 14:26:05 +00:00
Denis Flaven
b4b25b3c5b Make ReloadSearchForm work properly when the "submit" event handler is declared either with or without a "namespace" portion (e.g. 'submit.itop' vs 'submit') - retrofit from trunk
SVN:2.1.1[3818]
2015-11-09 10:50:38 +00:00
Denis Flaven
f45b9921a6 Retrofit of file based "transactions" as an alternative to session based ones.
SVN:2.1.1[3670]
2015-08-05 14:18:13 +00:00
Denis Flaven
fd21ae262b Fixed a potential XSS vulnerability.
SVN:2.1.1[3663]
2015-07-30 09:07:47 +00:00
Denis Flaven
0d14a20e1b Bug fix: typo causing the generation of invalid SQL queries (in some rare cases). - fix for the 2.1.1 branch.
SVN:2.1.1[3655]
2015-07-28 12:32:22 +00:00
Denis Flaven
ad36b978c5 Better error reporting (thanks to Stefan Goethals for suggesting it).
SVN:2.1.1[3625]
2015-07-06 17:08:34 +00:00
Denis Flaven
e3f550fb39 Bug fix: don't accept attachments (like images) via Chrome's copy/paste since it may duplicate the text content of a normal copy/paste and moreover causes troubles because there is no file name associated with the pasted content.
SVN:2.1.1[3623]
2015-07-06 14:37:42 +00:00
Denis Flaven
96e886199f #1107: Make sure that all settings are preserved upon update.
SVN:2.1.1[3615]
2015-07-01 08:45:05 +00:00
Denis Flaven
ff4ba2ddfe Bug fix: make Excel export work on results of the global search.
SVN:2.1.1[3605]
2015-06-22 10:12:03 +00:00
Denis Flaven
a4091ea771 Bug fix: make Excel export work on results of the global search.
SVN:2.1.1[3604]
2015-06-22 10:05:15 +00:00
Denis Flaven
c33bbd853d Added an alternate implementation for storing "transaction" identifiers on disk instead of inside the $_SESSION variable.
SVN:2.1.1[3600]
2015-06-20 13:41:13 +00:00
Denis Flaven
3345b07cc0 Mutex instrumentation for troubleshooting...
SVN:2.1.1[3597]
2015-06-19 14:49:15 +00:00
Romain Quetiez
5dd7141d54 ormStopWatch::GetElapsedTime not working in case of queries containing :this-> parameters (the prototype of GetElapsedTime has changed and is NOT compatible with the previous one) -reintegrated from trunk
SVN:2.1.1[3566]
2015-04-27 09:33:26 +00:00
Denis Flaven
55da100f9c Bug fix: prevent a crash of the web services when trying to log a non scalar paramater value...
SVN:2.1.1[3550]
2015-04-16 15:35:09 +00:00
Denis Flaven
88665da96e Enhancement: allow the API to create entries with a specified user_login.
SVN:2.1.1[3515]
2015-03-24 17:08:03 +00:00
Denis Flaven
4c25362b84 #594: properly display attachments inside "properties" by closing the span and the fieldset in non-edit mode.
SVN:2.1.1[3511]
2015-03-23 17:55:24 +00:00
Romain Quetiez
e520320736 Creating 2.1.1
SVN:2.1.1[3508]
2015-03-20 10:14:45 +00:00
Denis Flaven
95fc4d867d Fixed another regression of 3500: LongTextFields also support multiple forbidden lists...
SVN:trunk[3505]
2015-03-12 15:26:08 +00:00
Denis Flaven
6524a40eaa Enhancement: do not retrieve disabled fields.
SVN:trunk[3504]
2015-03-12 14:00:14 +00:00
Romain Quetiez
f53943e78c Meta information on lifecycle actions arguments: added type restrictions, and added the method ResetStopWatch
SVN:trunk[3503]
2015-03-12 10:42:51 +00:00
Denis Flaven
528a8901df Fixed a regression introduced by the revision 3500: the default value is NEVER "forbidden"
SVN:trunk[3502]
2015-03-11 15:46:53 +00:00
Denis Flaven
acd6d9679a Additional markup for JQuery scripts...
SVN:trunk[3501]
2015-03-11 15:33:01 +00:00
Denis Flaven
f7c7fc5dc4 Support several sets of forbidden values (with a specific "reason" message) per field.
SVN:trunk[3500]
2015-03-10 15:34:04 +00:00
Romain Quetiez
d575c48579 N°257 Aperçu des dashlets Badge partiellement hardcodé ("Search for objects of type Server")
SVN:trunk[3499]
2015-03-10 13:48:50 +00:00
Denis Flaven
930d833e1b #803: template placeholders are now built on demand. Yes !!
SVN:trunk[3498]
2015-02-27 10:02:44 +00:00
Denis Flaven
f7f77911be - Properly handle "suggested" attachments
- Properly pass the name of the uploaded file to the internal JS event

SVN:trunk[3496]
2015-02-12 17:59:08 +00:00
Romain Quetiez
508f82946f #1060 Internal: improved the symptoms when calling MetaModel::GetAttributeDef with an invalid attribute code (feedback on the class name and no more FATAL errors)
SVN:trunk[3492]
2015-02-09 13:11:49 +00:00
Romain Quetiez
6bb9754628 Internal: fixed the caching of DBObject::ToArgs()
1) Wasn't reset when the object was written the DB (thus having its ID set)
2) Wasn't taking the argument name into account (the list of placeholders was defined by the first caller)

SVN:trunk[3491]
2015-01-30 10:04:42 +00:00
Romain Quetiez
44fad50031 #1053 XML comments breaking the setup with message "Notice: Undefined property: DOMComment::$wholeText in ...modelfactory.class.inc.php on line 1280"
SVN:trunk[3490]
2015-01-14 13:51:37 +00:00
Denis Flaven
ed2cd2cea3 Change of the QueryReflection API to support DesignTime.
SVN:trunk[3489]
2015-01-12 14:20:20 +00:00
Romain Quetiez
eaf74a3f23 ModelFactory: Re-creating a class into another location in the class hierarchy it equivalent to moving that class => the delta must be a "redefine" for the class (improved the comment from the previous commit)
SVN:trunk[3487]
2015-01-08 11:05:18 +00:00
Romain Quetiez
1a99146b7a ModelFactory: Re-creating a class into another location in the class hierarchy it equivalent to moving that class => the delta must be a "redefine" for the class
SVN:trunk[3486]
2015-01-08 10:39:34 +00:00
Denis Flaven
4a8e9e71f4 Regression: the instance method is only available since jquery UI 1.11
SVN:trunk[3484]
2014-12-26 09:08:14 +00:00
Denis Flaven
6d2d0ff701 - Read-only "long text" fields no longer appear as editable
- Combo and FormSelector fields are now sorted by default (but sorting can be disabled if needed)

SVN:trunk[3483]
2014-12-23 15:23:12 +00:00
Denis Flaven
af3c93051f Protect against JS errors when the form is in read-only mode.
SVN:trunk[3482]
2014-12-23 14:49:06 +00:00
Denis Flaven
f594190005 Properly handle property_sheets with nested selector fields...
SVN:trunk[3481]
2014-12-23 13:42:25 +00:00
Denis Flaven
546d181ea9 Addition of the Danish localization contributed by Erik Bøg
SVN:trunk[3480]
2014-12-18 08:56:23 +00:00
Denis Flaven
143cefe4e3 #1041 Protect against some XSS injections
SVN:trunk[3479]
2014-12-18 08:50:04 +00:00
Romain Quetiez
ece152173f Advanced customization: a stop watch can be started in the past (incident ticket created from an alarm)
SVN:trunk[3478]
2014-12-18 08:37:00 +00:00
Denis Flaven
b08de31b3c Prevent duplicate declaration of the "Data Admin" menu (both in XML and PHP) which makes it impossible to customize.
SVN:trunk[3477]
2014-12-17 17:40:01 +00:00
Denis Flaven
0f967a41df Prevent a PHP crash when the icon tag is missing from a highlight_code definition in the XML.
SVN:trunk[3476]
2014-12-17 17:27:24 +00:00
Romain Quetiez
4c3bf70cc4 Completing [3423]: Problem/ev_assign still invoking the legacy verb SetAssignedDate
SVN:trunk[3475]
2014-12-17 08:55:02 +00:00
81 changed files with 7951 additions and 391 deletions

View File

@@ -783,6 +783,10 @@ class RestUtils
{
$realValue = self::MakeValue($sClass, $sAttCode, $value);
$oSearch->AddCondition($sAttCode, $realValue, '=');
if (is_object($value) || is_array($value))
{
$value = json_encode($value);
}
$aCriteriaReport[] = "$sAttCode: $value ($realValue)";
}
$oSet = new DBObjectSet($oSearch);

View File

@@ -1522,7 +1522,7 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
{
if (is_scalar($sValue))
{
$sHtml .= "<input type=\"hidden\" name=\"$sName\" value=\"$sValue\" />\n";
$sHtml .= "<input type=\"hidden\" name=\"$sName\" value=\"".htmlentities($sValue, ENT_QUOTES, 'UTF-8')."\" />\n";
}
}
$sHtml .= "<input type=\"hidden\" name=\"class\" value=\"$sClassName\" />\n";

View File

@@ -312,7 +312,7 @@ abstract class Dashboard
public function Render($oPage, $bEditMode = false, $aExtraParams = array())
{
$oPage->add('<h1>'.Dict::S($this->sTitle).'</h1>');
$oPage->add('<h1>'.htmlentities(Dict::S($this->sTitle), ENT_QUOTES, 'UTF-8', false).'</h1>');
$oLayout = new $this->sLayoutClass;
$oLayout->Render($oPage, $this->aCells, $bEditMode, $aExtraParams);
if (!$bEditMode)

View File

@@ -733,7 +733,8 @@ abstract class DashletGroupBy extends Dashlet
if (is_subclass_of($sAttType, 'AttributeFriendlyName')) continue;
if ($sAttType == 'AttributeExternalField') continue;
if (is_subclass_of($sAttType, 'AttributeExternalField')) continue;
if ($sAttType == 'AttributeOneWayPassword') continue;
$sLabel = $this->oModelReflection->GetLabel($sClass, $sAttCode);
$aGroupBy[$sAttCode] = $sLabel;
@@ -1570,7 +1571,7 @@ class DashletBadge extends Dashlet
$oPage->add('<p>');
$oPage->add(' <a>'.Dict::Format('UI:ClickToCreateNew', $sClassLabel).'</a>');
$oPage->add(' <br/>');
$oPage->add(' <a>Search for Server objects</a>');
$oPage->add(' <a>'.Dict::Format('UI:SearchFor_Class', $sClassLabel).'</a>');
$oPage->add('</p>');
$oPage->add('</div>');

View File

@@ -393,7 +393,7 @@ class DisplayBlock
{
if (isset($aExtraParams['group_by_label']))
{
$oGroupByExp = Expression::FromOQL($aExtraParams['group_by']);
$oGroupByExp = Expression::FromOQL($aExtraParams['group_by']);
$sGroupByLabel = $aExtraParams['group_by_label'];
}
else
@@ -404,6 +404,21 @@ class DisplayBlock
$sGroupByLabel = MetaModel::GetLabel($this->m_oFilter->GetClass(), $aExtraParams['group_by']);
}
// Security filtering
$aFields = $oGroupByExp->ListRequiredFields();
foreach($aFields as $sFieldAlias)
{
if (preg_match('/^([^.]+)\\.([^.]+)$/', $sFieldAlias, $aMatches))
{
$sFieldClass = $this->m_oFilter->GetClassName($aMatches[1]);
$oAttDef = MetaModel::GetAttributeDef($sFieldClass, $aMatches[2]);
if ($oAttDef instanceof AttributeOneWayPassword)
{
throw new Exception('Grouping on password fields is not supported.');
}
}
}
$aGroupBy = array();
$aGroupBy['grouped_by_1'] = $oGroupByExp;
$sSql = MetaModel::MakeGroupByQuery($this->m_oFilter, $aQueryParams, $aGroupBy, true);

View File

@@ -867,13 +867,11 @@ class DesignerTextField extends DesignerFormField
{
protected $sValidationPattern;
protected $aForbiddenValues;
protected $sExplainForbiddenValues;
public function __construct($sCode, $sLabel = '', $defaultValue = '')
{
parent::__construct($sCode, $sLabel, $defaultValue);
$this->sValidationPattern = '';
$this->aForbiddenValues = null;
$this->sExplainForbiddenValues = null;
$this->aForbiddenValues = array();
}
public function SetValidationPattern($sValidationPattern)
@@ -883,17 +881,17 @@ class DesignerTextField extends DesignerFormField
public function SetForbiddenValues($aValues, $sExplain)
{
$this->aForbiddenValues = $aValues;
$aForbiddenValues = $aValues;
$iDefaultKey = array_search($this->defaultValue, $this->aForbiddenValues);
$iDefaultKey = array_search($this->defaultValue, $aForbiddenValues);
if ($iDefaultKey !== false)
{
// The default (current) value is always allowed...
unset($this->aForbiddenValues[$iDefaultKey]);
unset($aForbiddenValues[$iDefaultKey]);
}
$this->sExplainForbiddenValues = $sExplain;
$this->aForbiddenValues[] = array('values' => $aForbiddenValues, 'message' => $sExplain);
}
public function Render(WebPage $oP, $sFormId, $sRenderMode='dialog')
@@ -911,17 +909,15 @@ class DesignerTextField extends DesignerFormField
if (is_array($this->aForbiddenValues))
{
$sForbiddenValues = json_encode($this->aForbiddenValues);
$sExplainForbiddenValues = addslashes($this->sExplainForbiddenValues);
}
else
{
$sForbiddenValues = 'null';
$sExplainForbiddenValues = 'null';
$sForbiddenValues = '[]'; //Empty JS array
}
$sMandatory = $this->bMandatory ? 'true' : 'false';
$oP->add_ready_script(
<<<EOF
$('#$sId').bind('change keyup validate', function() { ValidateWithPattern('$sId', $sMandatory, '$sPattern', $(this).closest('form').attr('id'), $sForbiddenValues, '$sExplainForbiddenValues'); } );
$('#$sId').bind('change keyup validate', function() { ValidateWithPattern('$sId', $sMandatory, '$sPattern', $(this).closest('form').attr('id'), $sForbiddenValues); } );
{
var myTimer = null;
$('#$sId').bind('keyup', function() { clearTimeout(myTimer); myTimer = setTimeout(function() { $('#$sId').trigger('change', {} ); }, 100); });
@@ -964,30 +960,35 @@ class DesignerLongTextField extends DesignerTextField
if (is_array($this->aForbiddenValues))
{
$sForbiddenValues = json_encode($this->aForbiddenValues);
$sExplainForbiddenValues = addslashes($this->sExplainForbiddenValues);
}
else
{
$sForbiddenValues = 'null';
$sExplainForbiddenValues = 'null';
$sForbiddenValues = '[]'; //Empty JS array
}
$sMandatory = $this->bMandatory ? 'true' : 'false';
$sReadOnly = $this->IsReadOnly() ? 'readonly' : '';
$oP->add_ready_script(
<<<EOF
$('#$sId').bind('change keyup validate', function() { ValidateWithPattern('$sId', $sMandatory, '$sPattern', $(this).closest('form').attr('id'), $sForbiddenValues, '$sExplainForbiddenValues'); } );
{
var myTimer = null;
$('#$sId').bind('keyup', function() { clearTimeout(myTimer); myTimer = setTimeout(function() { $('#$sId').trigger('change', {} ); }, 100); });
}
EOF
);
$sCSSClasses = '';
if (count($this->aCSSClasses) > 0)
{
$sCSSClasses = 'class="'.implode(' ', $this->aCSSClasses).'"';
}
return array('label' => $this->sLabel, 'value' => "<textarea $sCSSClasses id=\"$sId\" $sReadOnly name=\"$sName\">".htmlentities($this->defaultValue, ENT_QUOTES, 'UTF-8')."</textarea>");
if (!$this->IsReadOnly())
{
$oP->add_ready_script(
<<<EOF
$('#$sId').bind('change keyup validate', function() { ValidateWithPattern('$sId', $sMandatory, '$sPattern', $(this).closest('form').attr('id'), $sForbiddenValues); } );
{
var myTimer = null;
$('#$sId').bind('keyup', function() { clearTimeout(myTimer); myTimer = setTimeout(function() { $('#$sId').trigger('change', {} ); }, 100); });
}
EOF
);
$sValue = "<textarea $sCSSClasses id=\"$sId\" name=\"$sName\">".htmlentities($this->defaultValue, ENT_QUOTES, 'UTF-8')."</textarea>";
}
else
{
$sValue = "<div $sCSSClasses id=\"$sId\">".htmlentities($this->defaultValue, ENT_QUOTES, 'UTF-8')."</div>";
}
return array('label' => $this->sLabel, 'value' => $sValue);
}
}
@@ -1065,6 +1066,7 @@ class DesignerComboField extends DesignerFormField
protected $bMultipleSelection;
protected $bOtherChoices;
protected $sNullLabel;
protected $bSorted;
public function __construct($sCode, $sLabel = '', $defaultValue = '')
{
@@ -1075,6 +1077,7 @@ class DesignerComboField extends DesignerFormField
$this->sNullLabel = Dict::S('UI:SelectOne');
$this->bAutoApply = true;
$this->bSorted = true; // Sorted by default
}
public function SetAllowedValues($aAllowedValues)
@@ -1100,6 +1103,16 @@ class DesignerComboField extends DesignerFormField
$this->sNullLabel = $sLabel;
}
public function IsSorted()
{
return $this->bSorted;
}
public function SetSorted($bSorted)
{
$this->bSorted = $bSorted;
}
public function Render(WebPage $oP, $sFormId, $sRenderMode='dialog')
{
$sId = $this->oForm->GetFieldId($this->sCode);
@@ -1107,6 +1120,10 @@ class DesignerComboField extends DesignerFormField
$sChecked = $this->defaultValue ? 'checked' : '';
$sMandatory = $this->bMandatory ? 'true' : 'false';
$sReadOnly = $this->IsReadOnly() ? 'disabled="disabled"' : '';
if ($this->IsSorted())
{
asort($this->aAllowedValues);
}
$sCSSClasses = '';
if (count($this->aCSSClasses) > 0)
{
@@ -1428,13 +1445,37 @@ class DesignerFormSelectorField extends DesignerFormField
{
protected $aSubForms;
protected $defaultRealValue; // What's stored as default value is actually the index
protected $bSorted;
public function __construct($sCode, $sLabel = '', $defaultValue = '')
{
parent::__construct($sCode, $sLabel, 0);
$this->defaultRealValue = $defaultValue;
$this->aSubForms = array();
$this->bSorted = true;
}
public function IsSorted()
{
return $this->bSorted;
}
public function SetSorted($bSorted)
{
$this->bSorted = $bSorted;
}
/**
* Callback for sorting an array of $aFormData based ont he labels of the subforms
* @param unknown $aItem1
* @param unknown $aItem2
* @return number
*/
static function SortOnFormLabel($aItem1, $aItem2)
{
return strcasecmp($aItem1['label'], $aItem2['label']);
}
public function GetWidgetClass()
{
return 'selector_property_field';
@@ -1465,6 +1506,10 @@ class DesignerFormSelectorField extends DesignerFormField
$sCSSClasses = 'class="'.implode(' ', $this->aCSSClasses).'"';
}
if ($this->IsSorted())
{
uasort($this->aSubForms, array(get_class($this), 'SortOnFormLabel'));
}
if ($this->IsReadOnly())
{
@@ -1490,9 +1535,10 @@ class DesignerFormSelectorField extends DesignerFormField
$sHtml = "<select $sCSSClasses id=\"$sId\" name=\"$sName\" $sReadOnly>";
foreach($this->aSubForms as $iKey => $aFormData)
{
$sDisplayValue = htmlentities($aFormData['label'], ENT_QUOTES, 'UTF-8');;
$sDisplayValue = htmlentities($aFormData['label'], ENT_QUOTES, 'UTF-8');
$sValue = htmlentities($aFormData['value'], ENT_QUOTES, 'UTF-8');
$sSelected = ($iKey == $this->defaultValue) ? 'selected' : '';
$sHtml .= "<option value=\"$iKey\" $sSelected>".$sDisplayValue."</option>";
$sHtml .= "<option data-value=\"$sValue\" value=\"$iKey\" $sSelected>".$sDisplayValue."</option>";
}
$sHtml .= "</select>";
}

View File

@@ -305,16 +305,20 @@ class LoginWebPage extends NiceWebPage
{
$this->add("<p>".Dict::Format('UI:ResetPwd-Error-WrongLogin', $sAuthUser)."</p>\n");
}
elseif ($oUser->Get('reset_pwd_token') != $sToken)
{
$this->add("<p>".Dict::S('UI:ResetPwd-Error-InvalidToken')."</p>\n");
}
else
{
$this->add("<p>".Dict::Format('UI:ResetPwd-Error-EnterPassword', $oUser->GetFriendlyName())."</p>\n");
$sInconsistenPwdMsg = Dict::S('UI:Login:RetypePwdDoesNotMatch');
$this->add_script(
$oEncryptedToken = $oUser->Get('reset_pwd_token');
if (!$oEncryptedToken->CheckPassword($sToken))
{
$this->add("<p>".Dict::S('UI:ResetPwd-Error-InvalidToken')."</p>\n");
}
else
{
$this->add("<p>".Dict::Format('UI:ResetPwd-Error-EnterPassword', $oUser->GetFriendlyName())."</p>\n");
$sInconsistenPwdMsg = Dict::S('UI:Login:RetypePwdDoesNotMatch');
$this->add_script(
<<<EOF
function DoCheckPwd()
{
@@ -326,18 +330,19 @@ function DoCheckPwd()
return true;
}
EOF
);
$this->add("<form method=\"post\">\n");
$this->add("<table>\n");
$this->add("<tr><td style=\"text-align:right\"><label for=\"new_pwd\">".Dict::S('UI:Login:NewPasswordPrompt').":</label></td><td style=\"text-align:left\"><input type=\"password\" id=\"new_pwd\" name=\"new_pwd\" value=\"\" /></td></tr>\n");
$this->add("<tr><td style=\"text-align:right\"><label for=\"retype_new_pwd\">".Dict::S('UI:Login:RetypeNewPasswordPrompt').":</label></td><td style=\"text-align:left\"><input type=\"password\" id=\"retype_new_pwd\" name=\"retype_new_pwd\" value=\"\" /></td></tr>\n");
$this->add("<tr><td colspan=\"2\" class=\"center v-spacer\"><span class=\"btn_border\"><input type=\"submit\" onClick=\"return DoCheckPwd();\" value=\"".Dict::S('UI:Button:ChangePassword')."\" /></span></td></tr>\n");
$this->add("</table>\n");
$this->add("<input type=\"hidden\" name=\"loginop\" value=\"do_reset_pwd\" />\n");
$this->add("<input type=\"hidden\" name=\"auth_user\" value=\"".htmlentities($sAuthUser, ENT_QUOTES, 'UTF-8')."\" />\n");
$this->add("<input type=\"hidden\" name=\"token\" value=\"".htmlentities($sToken, ENT_QUOTES, 'UTF-8')."\" />\n");
$this->add("</form>\n");
$this->add("</div\n");
);
$this->add("<form method=\"post\">\n");
$this->add("<table>\n");
$this->add("<tr><td style=\"text-align:right\"><label for=\"new_pwd\">".Dict::S('UI:Login:NewPasswordPrompt').":</label></td><td style=\"text-align:left\"><input type=\"password\" id=\"new_pwd\" name=\"new_pwd\" value=\"\" /></td></tr>\n");
$this->add("<tr><td style=\"text-align:right\"><label for=\"retype_new_pwd\">".Dict::S('UI:Login:RetypeNewPasswordPrompt').":</label></td><td style=\"text-align:left\"><input type=\"password\" id=\"retype_new_pwd\" name=\"retype_new_pwd\" value=\"\" /></td></tr>\n");
$this->add("<tr><td colspan=\"2\" class=\"center v-spacer\"><span class=\"btn_border\"><input type=\"submit\" onClick=\"return DoCheckPwd();\" value=\"".Dict::S('UI:Button:ChangePassword')."\" /></span></td></tr>\n");
$this->add("</table>\n");
$this->add("<input type=\"hidden\" name=\"loginop\" value=\"do_reset_pwd\" />\n");
$this->add("<input type=\"hidden\" name=\"auth_user\" value=\"".htmlentities($sAuthUser, ENT_QUOTES, 'UTF-8')."\" />\n");
$this->add("<input type=\"hidden\" name=\"token\" value=\"".htmlentities($sToken, ENT_QUOTES, 'UTF-8')."\" />\n");
$this->add("</form>\n");
$this->add("</div\n");
}
}
}
@@ -357,21 +362,25 @@ EOF
{
$this->add("<p>".Dict::Format('UI:ResetPwd-Error-WrongLogin', $sAuthUser)."</p>\n");
}
elseif ($oUser->Get('reset_pwd_token') != $sToken)
{
$this->add("<p>".Dict::S('UI:ResetPwd-Error-InvalidToken')."</p>\n");
}
else
{
// Trash the token and change the password
$oUser->Set('reset_pwd_token', '');
$oUser->SetPassword($sNewPwd); // Does record the change into the DB
$this->add("<p>".Dict::S('UI:ResetPwd-Ready')."</p>");
$sUrl = utils::GetAbsoluteUrlAppRoot();
$this->add("<p><a href=\"$sUrl\">".Dict::S('UI:ResetPwd-Login')."</a></p>");
$oEncryptedPassword = $oUser->Get('reset_pwd_token');
if (!$oEncryptedPassword->CheckPassword($sToken))
{
$this->add("<p>".Dict::S('UI:ResetPwd-Error-InvalidToken')."</p>\n");
}
else
{
// Trash the token and change the password
$oUser->Set('reset_pwd_token', '');
$oUser->SetPassword($sNewPwd); // Does record the change into the DB
$this->add("<p>".Dict::S('UI:ResetPwd-Ready')."</p>");
$sUrl = utils::GetAbsoluteUrlAppRoot();
$this->add("<p><a href=\"$sUrl\">".Dict::S('UI:ResetPwd-Login')."</a></p>");
}
$this->add("</div\n");
}
$this->add("</div\n");
}
public function DisplayChangePwdForm($bFailedLogin = false)

View File

@@ -826,7 +826,7 @@ EOF
}
$sStepHistory = implode(',', $aPreviousSteps);
$this->add("<input type=\"hidden\" id=\"step_history\" name=\"step_history\" value=\"$sStepHistory\">");
$this->add("<input type=\"hidden\" id=\"step_history\" name=\"step_history\" value=\"".htmlentities($sStepHistory, ENT_QUOTES, 'UTF-8')."\">");
if (!is_null($sNextStep))
{

View File

@@ -28,10 +28,11 @@ require_once(APPROOT.'/core/cmdbobject.class.inc.php');
require_once(APPROOT.'/application/utils.inc.php');
session_name('itop-'.md5(APPROOT));
session_start();
if (isset($_REQUEST['switch_env']))
$sSwitchEnv = utils::ReadParam('switch_env', null);
if (($sSwitchEnv != null) && (file_exists(APPCONF.$sSwitchEnv.'/'.ITOP_CONFIG_FILE)))
{
$sEnv = $_REQUEST['switch_env'];
$_SESSION['itop_env'] = $sEnv;
$_SESSION['itop_env'] = $sSwitchEnv;
$sEnv = $sSwitchEnv;
// TODO: reset the credentials as well ??
}
else if (isset($_SESSION['itop_env']))

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2015 Combodo SARL
//
// This file is part of iTop.
//
@@ -19,7 +19,8 @@
/**
* This class records the pending "transactions" corresponding to forms that have not been
* submitted yet, in order to prevent double submissions. When created a transaction remains valid
* until the user's session expires
* until the user's session expires. This class is actually a wrapper to the underlying implementation
* which choice is configured via the parameter 'transaction_storage'
*
* @package iTop
* @copyright Copyright (C) 2010-2012 Combodo SARL
@@ -28,6 +29,81 @@
class privUITransaction
{
/**
* Create a new transaction id, store it in the session and return its id
* @param void
* @return int The identifier of the new transaction
*/
public static function GetNewTransactionId()
{
$bTransactionsEnabled = MetaModel::GetConfig()->Get('transactions_enabled');
if (!$bTransactionsEnabled)
{
return 'notransactions'; // Any value will do
}
$sClass = 'privUITransaction'.MetaModel::GetConfig()->Get('transaction_storage');
if (!class_exists($sClass, false))
{
IssueLog::Error("Incorrect value '".MetaModel::GetConfig()->Get('transaction_storage')."' for 'transaction_storage', the class '$sClass' does not exists. Using privUITransactionSession instead for storing sessions.");
$sClass = 'privUITransactionSession';
}
return (string)$sClass::GetNewTransactionId();
}
/**
* Check whether a transaction is valid or not and (optionally) remove the valid transaction from
* the session so that another call to IsTransactionValid for the same transaction id
* will return false
* @param int $id Identifier of the transaction, as returned by GetNewTransactionId
* @param bool $bRemoveTransaction True if the transaction must be removed
* @return bool True if the transaction is valid, false otherwise
*/
public static function IsTransactionValid($id, $bRemoveTransaction = true)
{
$bTransactionsEnabled = MetaModel::GetConfig()->Get('transactions_enabled');
if (!$bTransactionsEnabled)
{
return true; // All values are valid
}
$sClass = 'privUITransaction'.MetaModel::GetConfig()->Get('transaction_storage');
if (!class_exists($sClass, false))
{
$sClass = 'privUITransactionSession';
}
return $sClass::IsTransactionValid($id, $bRemoveTransaction);
}
/**
* Removes the transaction specified by its id
* @param int $id The Identifier (as returned by GetNewTranscationId) of the transaction to be removed.
* @return void
*/
public static function RemoveTransaction($id)
{
$bTransactionsEnabled = MetaModel::GetConfig()->Get('transactions_enabled');
if (!$bTransactionsEnabled)
{
return; // Nothing to do
}
$sClass = 'privUITransaction'.MetaModel::GetConfig()->Get('transaction_storage');
if (!class_exists($sClass, false))
{
$sClass = 'privUITransactionSession';
}
$sClass::RemoveTransaction($id);
}
}
/**
* The original (and by default) mechanism for storing transaction information
* as an array in the $_SESSION variable
*
*/
class privUITransactionSession
{
/**
* Create a new transaction id, store it in the session and return its id
@@ -99,4 +175,178 @@ class privUITransaction
}
}
}
?>
/**
* An alternate implementation for storing the transactions as temporary files
* Useful when using an in-memory storage for the session which do not
* guarantee mutual exclusion for writing
*/
class privUITransactionFile
{
/**
* Create a new transaction id, store it in the session and return its id
* @param void
* @return int The identifier of the new transaction
*/
public static function GetNewTransactionId()
{
if (!is_dir(APPROOT.'data/transactions'))
{
if (!is_writable(APPROOT.'data'))
{
throw new Exception('The directory "'.APPROOT.'data" must be writable to the application.');
}
if (!@mkdir(APPROOT.'data/transactions'))
{
throw new Exception('Failed to create the directory "'.APPROOT.'data/transactions". Ajust the rights on the parent directory or let an administrator create the transactions directory and give the web sever enough rights to write into it.');
}
}
if (!is_writable(APPROOT.'data/transactions'))
{
throw new Exception('The directory "'.APPROOT.'data/transactions" must be writable to the application.');
}
self::CleanupOldTransactions();
$id = basename(tempnam(APPROOT.'data/transactions', self::GetUserPrefix()));
self::Info('GetNewTransactionId: Created transaction: '.$id);
return (string)$id;
}
/**
* Check whether a transaction is valid or not and (optionally) remove the valid transaction from
* the session so that another call to IsTransactionValid for the same transaction id
* will return false
* @param int $id Identifier of the transaction, as returned by GetNewTransactionId
* @param bool $bRemoveTransaction True if the transaction must be removed
* @return bool True if the transaction is valid, false otherwise
*/
public static function IsTransactionValid($id, $bRemoveTransaction = true)
{
$sFilepath = APPROOT.'data/transactions/'.$id;
clearstatcache(true, $sFilepath);
$bResult = file_exists($sFilepath);
if ($bResult)
{
if ($bRemoveTransaction)
{
$bResult = @unlink($sFilepath);
if (!$bResult)
{
self::Error('IsTransactionValid: FAILED to remove transaction '.$id);
}
else
{
self::Info('IsTransactionValid: OK. Removed transaction: '.$id);
}
}
}
else
{
self::Info("IsTransactionValid: Transaction '$id' not found. Pending transactions for this user:\n".implode("\n", self::GetPendingTransactions()));
}
return $bResult;
}
/**
* Removes the transaction specified by its id
* @param int $id The Identifier (as returned by GetNewTransactionId) of the transaction to be removed.
* @return void
*/
public static function RemoveTransaction($id)
{
$bSuccess = true;
$sFilepath = APPROOT.'data/transactions/'.$id;
clearstatcache(true, $sFilepath);
if(!file_exists($sFilepath))
{
$bSuccess = false;
self::Error("RemoveTransaction: Transaction '$id' not found. Pending transactions for this user:\n".implode("\n", self::GetPendingTransactions()));
}
$bSuccess = @unlink($sFilepath);
if (!$bSuccess)
{
self::Error('RemoveTransaction: FAILED to remove transaction '.$id);
}
else
{
self::Info('RemoveTransaction: OK '.$id);
}
return $bSuccess;
}
/**
* Cleanup old transactions which have been pending since more than 24 hours
* Use filemtime instead of filectime since filectime may be affected by operations on the directory (like changing the access rights)
*/
protected static function CleanupOldTransactions()
{
$iLimit = time() - 24*3600;
clearstatcache();
$aTransactions = glob(APPROOT.'data/transactions/*-*');
foreach($aTransactions as $sFileName)
{
if (filemtime($sFileName) < $iLimit)
{
@unlink($sFileName);
self::Info('CleanupOldTransactions: Deleted transaction: '.$sFileName);
}
}
}
/**
* For debugging purposes: gets the pending transactions of the current user
* as an array, with the date of the creation of the transaction file
*/
protected static function GetPendingTransactions()
{
clearstatcache();
$aResult = array();
$aTransactions = glob(APPROOT.'data/transactions/'.self::GetUserPrefix().'*');
foreach($aTransactions as $sFileName)
{
$aResult[] = date('Y-m-d H:i:s', filemtime($sFileName)).' - '.basename($sFileName);
}
sort($aResult);
return $aResult;
}
protected static function GetUserPrefix()
{
$sPrefix = substr(UserRights::GetUser(), 0, 10);
$sPrefix = preg_replace('/[^a-zA-Z0-9-_]/', '_', $sPrefix);
return $sPrefix.'-';
}
protected static function Info($sText)
{
self::Write('Info | '.$sText);
}
protected static function Warning($sText)
{
self::Write('Warning | '.$sText);
}
protected static function Error($sText)
{
self::Write('Error | '.$sText);
}
protected static function Write($sText)
{
$bLogEnabled = MetaModel::GetConfig()->Get('log_transactions');
if ($bLogEnabled)
{
$hLogFile = @fopen(APPROOT.'log/transactions.log', 'a');
if ($hLogFile !== false)
{
flock($hLogFile, LOCK_EX);
$sDate = date('Y-m-d H:i:s');
fwrite($hLogFile, "$sDate | $sText\n");
fflush($hLogFile);
flock($hLogFile, LOCK_UN);
fclose($hLogFile);
}
}
}
}

View File

@@ -259,7 +259,7 @@ EOF
$sHTMLValue .= "<img id=\"mini_search_{$this->iId}\" style=\"border:0;vertical-align:middle;cursor:pointer;\" src=\"../images/mini_search.gif\" onClick=\"oACWidget_{$this->iId}.Search();\"/>&nbsp;";
// another hidden input to store & pass the object's Id
$sHTMLValue .= "<input type=\"hidden\" id=\"$this->iId\" name=\"{$sAttrFieldPrefix}{$sFieldName}\" value=\"$value\" />\n";
$sHTMLValue .= "<input type=\"hidden\" id=\"$this->iId\" name=\"{$sAttrFieldPrefix}{$sFieldName}\" value=\"".htmlentities($value, ENT_QUOTES, 'UTF-8')."\" />\n";
$JSSearchMode = $this->bSearchMode ? 'true' : 'false';
// Scripts to start the autocomplete and bind some events to it

View File

@@ -294,7 +294,7 @@ class UILinksWidgetDirect
$valuesDef = $oLinksetDef->GetValuesDef();
if ($valuesDef === null)
{
$oFilter = new DBObjectSearch($this->sLinkedClass);
$oFilter = new DBObjectSearch($sRemoteClass);
}
else
{

View File

@@ -487,6 +487,35 @@ abstract class AttributeDefinition
{
return $this->GetAsHTML($sValue, $oHostObject, $bLocalize);
}
/**
* Get various representations of the value, for insertion into a template (e.g. in Notifications)
* @param $value mixed The current value of the field
* @param $sVerb string The verb specifying the representation of the value
* @param $oHostObject DBObject The object
* @param $bLocalize bool Whether or not to localize the value
*/
public function GetForTemplate($value, $sVerb, $oHostObject = null, $bLocalize = true)
{
if ($this->IsScalar())
{
switch ($sVerb)
{
case '':
return $value;
case 'html':
return $this->GetAsHtml($value, $oHostObject, $bLocalize);
case 'label':
return $this->GetEditValue($value);
default:
throw new Exception("Unknown verb '$sVerb' for attribute ".$this->GetCode().' in class '.get_class($oHostObj));
}
}
return null;
}
public function GetAllowedValues($aArgs = array(), $sContains = '')
{
@@ -731,6 +760,46 @@ class AttributeLinkedSet extends AttributeDefinition
return $sRes;
}
/**
* Get various representations of the value, for insertion into a template (e.g. in Notifications)
* @param $value mixed The current value of the field
* @param $sVerb string The verb specifying the representation of the value
* @param $oHostObject DBObject The object
* @param $bLocalize bool Whether or not to localize the value
*/
public function GetForTemplate($value, $sVerb, $oHostObject = null, $bLocalize = true)
{
$sRemoteName = $this->IsIndirect() ? $this->GetExtKeyToRemote().'_friendlyname' : 'friendlyname';
$oLinkSet = clone $value; // Workaround/Safety net for Trac #887
$iLimit = MetaModel::GetConfig()->Get('max_linkset_output');
if ($iLimit > 0)
{
$oLinkSet->SetLimit($iLimit);
}
$aNames = $oLinkSet->GetColumnAsArray($sRemoteName);
if ($iLimit > 0)
{
$iTotal = $oLinkSet->Count();
if ($iTotal > count($aNames))
{
$aNames[] = '... '.Dict::Format('UI:TruncatedResults', count($aNames), $iTotal);
}
}
switch($sVerb)
{
case '':
return implode("\n", $aNames);
case 'html':
return '<ul><li>'.implode("</li><li>", $aNames).'</li></ul>';
default:
throw new Exception("Unknown verb '$sVerb' for attribute ".$this->GetCode().' in class '.get_class($oHostObj));
}
}
public function DuplicatesAllowed() {return false;} // No duplicates for 1:n links, never
public function GetImportColumns()
@@ -2094,6 +2163,35 @@ class AttributeCaseLog extends AttributeLongText
}
}
/**
* Get various representations of the value, for insertion into a template (e.g. in Notifications)
* @param $value mixed The current value of the field
* @param $sVerb string The verb specifying the representation of the value
* @param $oHostObject DBObject The object
* @param $bLocalize bool Whether or not to localize the value
*/
public function GetForTemplate($value, $sVerb, $oHostObject = null, $bLocalize = true)
{
switch($sVerb)
{
case '':
return $value->GetText();
case 'head':
return $value->GetLatestEntry();
case 'head_html':
return '<div class="caselog_entry">'.str_replace( array( "\r\n", "\n", "\r"), "<br/>", htmlentities($value->GetLatestEntry(), ENT_QUOTES, 'UTF-8')).'</div>';
case 'html':
return $value->GetAsEmailHtml();
default:
throw new Exception("Unknown verb '$sVerb' for attribute ".$this->GetCode().' in class '.get_class($oHostObj));
}
}
/**
* Helper to get a value that will be JSON encoded
* The operation is the opposite to FromJSONToValue

View File

@@ -809,6 +809,54 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
),
'transaction_storage' => array(
'type' => 'string',
'description' => 'The type of mechanism to use for storing the unique identifiers for transactions (Session|File).',
'default' => 'Session',
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
),
'transactions_enabled' => array(
'type' => 'bool',
'description' => 'Whether or not the whole mechanism to prevent multiple submissions of a page is enabled.',
'default' => true,
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
),
'log_transactions' => array(
'type' => 'bool',
'description' => 'Whether or not to enable the debug log for the transactions.',
'default' => false,
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
),
'concurrent_lock_enabled' => array(
'type' => 'bool',
'description' => 'Whether or not to activate the locking mechanism in order to prevent concurrent edition of the same object.',
'default' => true,
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => true,
),
'concurrent_lock_expiration_delay' => array(
'type' => 'integer',
'description' => 'Delay (in seconds) for a concurrent lock to expire',
'default' => 120,
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
),
'concurrent_lock_override_profiles' => array(
'type' => 'array',
'description' => 'The list of profiles allowed to "kill" a lock',
'default' => array('Administrator'),
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
),
);
public function IsProperty($sPropCode)
@@ -1462,6 +1510,8 @@ class Config
$aSettings['log_notification'] = $this->m_bLogNotification;
$aSettings['log_issue'] = $this->m_bLogIssue;
$aSettings['log_web_service'] = $this->m_bLogWebService;
$aSettings['log_queries'] = $this->m_bLogQueries;
$aSettings['query_cache_enabled'] = $this->m_bQueryCacheEnabled;
$aSettings['min_display_limit'] = $this->m_iMinDisplayLimit;
$aSettings['max_display_limit'] = $this->m_iMaxDisplayLimit;
$aSettings['standard_reload_interval'] = $this->m_iStandardReloadInterval;
@@ -1469,6 +1519,7 @@ class Config
$aSettings['secure_connection_required'] = $this->m_bSecureConnectionRequired;
$aSettings['default_language'] = $this->m_sDefaultLanguage;
$aSettings['allowed_login_types'] = $this->m_sAllowedLoginTypes;
$aSettings['ext_auth_variable'] = $this->m_sExtAuthVariable;
$aSettings['encryption_key'] = $this->m_sEncryptionKey;
$aSettings['csv_import_charsets'] = $this->m_aCharsets;
@@ -1534,6 +1585,8 @@ class Config
'log_notification' => $this->m_bLogNotification,
'log_issue' => $this->m_bLogIssue,
'log_web_service' => $this->m_bLogWebService,
'log_queries' => $this->m_bLogQueries,
'query_cache_enabled' => $this->m_bQueryCacheEnabled,
'secure_connection_required' => $this->m_bSecureConnectionRequired,
);
foreach($aBoolValues as $sKey => $bValue)
@@ -1572,6 +1625,7 @@ class Config
'db_collation' => $this->m_sDBCollation,
'default_language' => $this->m_sDefaultLanguage,
'allowed_login_types' => $this->m_sAllowedLoginTypes,
'ext_auth_variable' => $this->m_sExtAuthVariable,
'encryption_key' => $this->m_sEncryptionKey,
'csv_import_charsets' => $this->m_aCharsets,
);

View File

@@ -89,8 +89,6 @@ abstract class DBObject implements iDisplay
protected $m_aCheckIssues = null;
protected $m_aDeleteIssues = null;
protected $m_aAsArgs = null; // The current object as a standard argument (cache)
private $m_bFullyLoaded = false; // Compound objects can be partially loaded
private $m_aLoadedAtt = array(); // Compound objects can be partially loaded, array of sAttCode
protected $m_aModifiedAtt = array(); // list of (potentially) modified sAttCodes
@@ -413,7 +411,6 @@ abstract class DBObject implements iDisplay
// The object has changed, reset caches
$this->m_bCheckStatus = null;
$this->m_aAsArgs = null;
// Make sure we do not reload it anymore... before saving it
$this->RegisterAsDirty();
@@ -1570,9 +1567,6 @@ abstract class DBObject implements iDisplay
$this->DBWriteLinks();
$this->m_bIsInDB = true;
$this->m_bDirty = false;
// Arg cache invalidated (in particular, it needs the object key -could be improved later)
$this->m_aAsArgs = null;
$this->AfterInsert();
@@ -2270,84 +2264,94 @@ abstract class DBObject implements iDisplay
/*
* Create query parameters (SELECT ... WHERE service = :this->service_id)
* to be used with the APIs DBObjectSearch/DBObjectSet
*
* Starting 2.0.2 the parameters are computed on demand, at the lowest level,
* in VariableExpression::Render()
*/
/**
* Create query parameters (SELECT ... WHERE service = :this->service_id)
* to be used with the APIs DBObjectSearch/DBObjectSet
*
* Starting 2.0.2 the parameters are computed on demand, at the lowest level,
* in VariableExpression::Render()
*/
public function ToArgsForQuery($sArgName = 'this')
{
return array($sArgName.'->object()' => $this);
}
/*
* Create template placeholders
* An improvement could be to compute the values on demand
* (i.e. interpret the template to determine the placeholders)
*/
/**
* Create template placeholders: now equivalent to ToArgsForQuery since the actual
* template placeholders are computed on demand.
*/
public function ToArgs($sArgName = 'this')
{
if (is_null($this->m_aAsArgs))
return $this->ToArgsForQuery($sArgName);
}
public function GetForTemplate($sPlaceholderAttCode)
{
$ret = null;
if (($iPos = strpos($sPlaceholderAttCode, '->')) !== false)
{
$oKPI = new ExecutionKPI();
$aScalarArgs = $this->ToArgsForQuery($sArgName);
$aScalarArgs[$sArgName] = $this->GetKey();
$aScalarArgs[$sArgName.'->id'] = $this->GetKey();
$aScalarArgs[$sArgName.'->hyperlink()'] = $this->GetHyperlink('iTopStandardURLMaker', false);
$aScalarArgs[$sArgName.'->hyperlink(portal)'] = $this->GetHyperlink('PortalURLMaker', false);
$aScalarArgs[$sArgName.'->name()'] = $this->GetName();
$sClass = get_class($this);
foreach(MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef)
$sExtKeyAttCode = substr($sPlaceholderAttCode, 0, $iPos);
$sRemoteAttCode = substr($sPlaceholderAttCode, $iPos + 2);
if (!MetaModel::IsValidAttCode(get_class($this), $sExtKeyAttCode))
{
if ($oAttDef instanceof AttributeCaseLog)
{
$oCaseLog = $this->Get($sAttCode);
$aScalarArgs[$sArgName.'->'.$sAttCode] = $oCaseLog->GetText();
$sHead = $oCaseLog->GetLatestEntry();
$aScalarArgs[$sArgName.'->head('.$sAttCode.')'] = $sHead;
$aScalarArgs[$sArgName.'->head_html('.$sAttCode.')'] = '<div class="caselog_entry">'.str_replace(array("\r\n", "\n", "\r"), "<br/>", htmlentities($sHead, ENT_QUOTES, 'UTF-8')).'</div>';
$aScalarArgs[$sArgName.'->html('.$sAttCode.')'] = $oCaseLog->GetAsEmailHtml();
}
elseif ($oAttDef->IsScalar())
{
$aScalarArgs[$sArgName.'->'.$sAttCode] = $this->Get($sAttCode);
// #@# Note: This has been proven to be quite slow, this can slow down bulk load
$sAsHtml = $this->GetAsHtml($sAttCode);
$aScalarArgs[$sArgName.'->html('.$sAttCode.')'] = $sAsHtml;
$aScalarArgs[$sArgName.'->label('.$sAttCode.')'] = $this->GetEditValue($sAttCode); // "Nice" display value, but without HTML tags and entities
}
elseif ($oAttDef->IsLinkSet())
{
$sRemoteName = $oAttDef->IsIndirect() ? $oAttDef->GetExtKeyToRemote().'_friendlyname' : 'friendlyname';
throw new CoreException("Unknown attribute '$sExtKeyAttCode' for the class ".get_class($this));
}
$oKeyAttDef = MetaModel::GetAttributeDef(get_class($this), $sExtKeyAttCode);
if (!$oKeyAttDef instanceof AttributeExternalKey)
{
throw new CoreException("'$sExtKeyAttCode' is not an external key of the class ".get_class($this));
}
$sRemoteClass = $oKeyAttDef->GetTargetClass();
$oRemoteObj = MetaModel::GetObject($sRemoteClass, $this->GetStrict($sExtKeyAttCode), false);
if (is_null($oRemoteObj))
{
$ret = Dict::S('UI:UndefinedObject');
}
else
{
// Recurse
$ret = $oRemoteObj->GetForTemplate($sRemoteAttCode);
}
}
else
{
switch($sPlaceholderAttCode)
{
case 'id':
$ret = $this->GetKey();
break;
case 'hyperlink()':
$ret = $this->GetHyperlink('iTopStandardURLMaker', false);
break;
$oLinkSet = clone $this->Get($sAttCode); // Workaround/Safety net for Trac #887
$iLimit = MetaModel::GetConfig()->Get('max_linkset_output');
if ($iLimit > 0)
{
$oLinkSet->SetLimit($iLimit);
}
$aNames = $oLinkSet->GetColumnAsArray($sRemoteName);
if ($iLimit > 0)
{
$iTotal = $oLinkSet->Count();
if ($iTotal > count($aNames))
{
$aNames[] = '... '.Dict::Format('UI:TruncatedResults', count($aNames), $iTotal);
}
}
$sNames = implode("\n", $aNames);
$aScalarArgs[$sArgName.'->'.$sAttCode] = $sNames;
$aScalarArgs[$sArgName.'->html('.$sAttCode.')'] = '<ul><li>'.implode("</li><li>", $aNames).'</li></ul>';
case 'hyperlink(portal)':
$ret = $this->GetHyperlink('PortalURLMaker', false);
break;
case 'name()':
$ret = $this->GetName();
break;
default:
if (preg_match('/^([^(]+)\\((.+)\\)$/', $sPlaceholderAttCode, $aMatches))
{
$sVerb = $aMatches[1];
$sAttCode = $aMatches[2];
}
else
{
$sVerb = '';
$sAttCode = $sPlaceholderAttCode;
}
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
$ret = $oAttDef->GetForTemplate($this->Get($sAttCode), $sVerb, $this);
}
$this->m_aAsArgs = $aScalarArgs;
$oKPI->ComputeStats('ToArgs', get_class($this));
}
return $this->m_aAsArgs;
return $ret;
}
// To be optionaly overloaded

View File

@@ -53,9 +53,8 @@ class DBObjectSearch
public function __construct($sClass, $sClassAlias = null)
{
if (is_null($sClassAlias)) $sClassAlias = $sClass;
assert('is_string($sClass)');
assert('MetaModel::IsValidClass($sClass)'); // #@# could do better than an assert, or at least give the caller's reference
// => idee d'un assert avec call stack (autre utilisation = echec sur query SQL)
if(!is_string($sClass)) throw new Exception('DBObjectSearch::__construct called with a non-string parameter: $sClass = '.print_r($sClass, true));
if(!MetaModel::IsValidClass($sClass)) throw new Exception('DBObjectSearch::__construct called for an invalid class: "'.$sClass.'"');
$this->m_aSelectedClasses = array($sClassAlias => $sClass);
$this->m_aClasses = array($sClassAlias => $sClass);
@@ -449,7 +448,7 @@ class DBObjectSearch
public function AddCondition($sFilterCode, $value, $sOpCode = null)
{
MyHelpers::CheckKeyInArray('filter code', $sFilterCode, MetaModel::GetClassFilterDefs($this->GetClass()));
MyHelpers::CheckKeyInArray('filter code in class: '.$this->GetClass(), $sFilterCode, MetaModel::GetClassFilterDefs($this->GetClass()));
$oFilterDef = MetaModel::GetClassFilterDef($this->GetClass(), $sFilterCode);
$oField = new FieldExpression($sFilterCode, $this->GetClassAlias());

View File

@@ -59,8 +59,11 @@ class FileLog
$hLogFile = @fopen($this->m_sFile, 'a');
if ($hLogFile !== false)
{
flock($hLogFile, LOCK_EX);
$sDate = date('Y-m-d H:i:s');
fwrite($hLogFile, "$sDate | $sText\n");
fflush($hLogFile);
flock($hLogFile, LOCK_UN);
fclose($hLogFile);
}
}

View File

@@ -836,6 +836,10 @@ abstract class MetaModel
final static public function GetAttributeDef($sClass, $sAttCode)
{
self::_check_subclass($sClass);
if (!isset(self::$m_aAttribDefs[$sClass][$sAttCode]))
{
throw new Exception("Unknown attribute $sAttCode from class $sClass");
}
return self::$m_aAttribDefs[$sClass][$sAttCode];
}
@@ -3075,7 +3079,7 @@ abstract class MetaModel
$sExtAttCode = $oAtt->GetExtAttCode();
// Translate mainclass.extfield => remoteclassalias.remotefieldcode
$oRemoteAttDef = self::GetAttributeDef($sKeyClass, $sExtAttCode);
foreach ($oRemoteAttDef->GetSQLExpressions() as $sColID => $sRemoteAttExpr)
foreach ($oRemoteAttDef->GetSQLExpressions() as $sColId => $sRemoteAttExpr)
{
$aTranslateNow[$sTargetAlias][$sAttCode.$sColId] = new FieldExpression($sExtAttCode, $sKeyClassAlias);
//echo "<p><b>aTranslateNow[$sTargetAlias][$sAttCode.$sColId] = new FieldExpression($sExtAttCode, $sKeyClassAlias);</b></p>\n";
@@ -5416,7 +5420,7 @@ abstract class MetaModel
/**
* Replaces all the parameters by the values passed in the hash array
*/
static public function ApplyParams($aInput, $aParams)
static public function ApplyParams($sInput, $aParams)
{
// Declare magic parameters
$aParams['APP_URL'] = utils::GetAbsoluteUrlAppRoot();
@@ -5427,12 +5431,45 @@ abstract class MetaModel
foreach($aParams as $sSearch => $replace)
{
// Some environment parameters are objects, we just need scalars
if (is_object($replace)) continue;
$aSearches[] = '$'.$sSearch.'$';
$aReplacements[] = (string) $replace;
if (is_object($replace))
{
$iPos = strpos($sSearch, '->object()');
if ($iPos !== false)
{
// Expand the parameters for the object
$sName = substr($sSearch, 0, $iPos);
if (preg_match_all('/\\$'.$sName.'->([^\\$]+)\\$/', $sInput, $aMatches))
{
foreach($aMatches[1] as $sPlaceholderAttCode)
{
try
{
$sReplacement = $replace->GetForTemplate($sPlaceholderAttCode);
if ($sReplacement !== null)
{
$aReplacements[] = $sReplacement;
$aSearches[] = '$'.$sName.'->'.$sPlaceholderAttCode.'$';
}
}
catch(Exception $e)
{
// No replacement will occur
}
}
}
}
else
{
continue; // Ignore this non-scalar value
}
}
else
{
$aSearches[] = '$'.$sSearch.'$';
$aReplacements[] = (string) $replace;
}
}
return str_replace($aSearches, $aReplacements, $aInput);
return str_replace($aSearches, $aReplacements, $sInput);
}
/**

View File

@@ -69,7 +69,7 @@ abstract class QueryReflection
/**
* Throws an exception in case of an invalid syntax
*/
abstract public function __construct($sOQL);
abstract public function __construct($sOQL, ModelReflection $oModelReflection);
abstract public function GetClass();
abstract public function GetClassAlias();
@@ -222,7 +222,7 @@ class ModelReflectionRuntime extends ModelReflection
public function GetQuery($sOQL)
{
return new QueryReflectionRuntime($sOQL);
return new QueryReflectionRuntime($sOQL, $this);
}
public function DictString($sStringCode, $sDefault = null, $bUserLanguageOnly = false)
@@ -244,7 +244,7 @@ class QueryReflectionRuntime extends QueryReflection
/**
* throws an exception in case of a wrong syntax
*/
public function __construct($sOQL)
public function __construct($sOQL, ModelReflection $oModelReflection)
{
$this->oFilter = DBObjectSearch::FromOQL($sOQL);
}

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2013 Combodo SARL
// Copyright (C) 2013-2016 Combodo SARL
//
// This file is part of iTop.
//
@@ -24,7 +24,7 @@
* Relies on MySQL locks because the API sem_get is not always present in the
* installed PHP.
*
* @copyright Copyright (C) 2013 Combodo SARL
* @copyright Copyright (C) 2013-2016 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class iTopMutex
@@ -121,7 +121,41 @@ class iTopMutex
$this->bLocked = true;
self::$aAcquiredLocks[$this->sName]++;
}
return ($res === '1');
if (($res !== '1') && ($res !== '0'))
{
IssueLog::Error('GET_LOCK('.$this->sName.', 0) returned: '.var_export($res, true).'. Expected values are: 0, 1 or null !!');
}
return ($res !== '0');
}
/**
* Check if the mutex is locked WITHOUT TRYING TO ACQUIRE IT
* @returns bool True if the mutex is in use, false otherwise
*/
public function IsLocked()
{
if ($this->bLocked)
{
return true; // Already acquired
}
if (self::$aAcquiredLocks[$this->sName] > 0)
{
return true;
}
$res = $this->QueryToScalar("SELECT IS_FREE_LOCK('".$this->sName."')"); // IS_FREE_LOCK detects some error cases that IS_USED_LOCK do not detect
if (is_null($res))
{
$sMsg = "MySQL Error, IS_FREE_LOCK('".$this->sName."') returned null. Error (".mysqli_errno($this->hDBLink).") = '".mysqli_error($this->hDBLink)."'";
IssueLog::Error($sMsg);
throw new Exception($sMsg);
}
else if ($res == '1')
{
// Lock is free
return false;
}
return true;
}
/**

View File

@@ -384,7 +384,7 @@ class ormCaseLog {
}
public function AddLogEntryFromJSON($oJson)
public function AddLogEntryFromJSON($oJson, $bCheckUserId = true)
{
$sText = isset($oJson->message) ? $oJson->message : '';
@@ -394,16 +394,24 @@ class ormCaseLog {
{
throw new Exception("Only administrators can set the user id", RestResult::UNAUTHORIZED);
}
try
if ($bCheckUserId)
{
$oUser = RestUtils::FindObjectFromKey('User', $oJson->user_id);
try
{
$oUser = RestUtils::FindObjectFromKey('User', $oJson->user_id);
}
catch(Exception $e)
{
throw new Exception('user_id: '.$e->getMessage(), $e->getCode());
}
$iUserId = $oUser->GetKey();
$sOnBehalfOf = $oUser->GetFriendlyName();
}
catch(Exception $e)
else
{
throw new Exception('user_id: '.$e->getMessage(), $e->getCode());
$iUserId = $oJson->user_id;
$sOnBehalfOf = $oJson->user_login;
}
$iUserId = $oUser->GetKey();
$sOnBehalfOf = $oUser->GetFriendlyName();
}
else
{

View File

@@ -86,8 +86,9 @@ class ormStopWatch
* Get the working elapsed time since the start of the stop watch
* even if it is currently running
* @param oAttDef AttributeDefinition Attribute hosting the stop watch
* @param oObject Hosting object (used for query parameters)
*/
public function GetElapsedTime($oAttDef)
public function GetElapsedTime($oAttDef, $oObject)
{
if (is_null($this->iLastStart))
{
@@ -95,7 +96,7 @@ class ormStopWatch
}
else
{
$iElapsed = $this->ComputeDuration($this, $oAttDef, $this->iLastStart, time());
$iElapsed = $this->ComputeDuration($oObject, $oAttDef, $this->iLastStart, time());
return $this->iTimeSpent + $iElapsed;
}
}
@@ -330,7 +331,7 @@ class ormStopWatch
* It is the responsibility of the caller to compute the deadlines
* (to avoid computing twice for the same result)
*/
public function Start($oObject, $oAttDef)
public function Start($oObject, $oAttDef, $iNow = null)
{
if (!is_null($this->iLastStart))
{
@@ -338,11 +339,16 @@ class ormStopWatch
return false;
}
if (is_null($iNow))
{
$iNow = time();
}
if (is_null($this->iStarted))
{
$this->iStarted = time();
$this->iStarted = $iNow;
}
$this->iLastStart = time();
$this->iLastStart = $iNow;
$this->iStopped = null;
return true;

View File

@@ -400,7 +400,7 @@ abstract class UserInternal extends User
MetaModel::Init_InheritAttributes();
// When set, this token allows for password reset
MetaModel::Init_AddAttribute(new AttributeString("reset_pwd_token", array("allowed_values"=>null, "sql"=>"reset_pwd_token", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeOneWayPassword("reset_pwd_token", array("allowed_values"=>null, "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('contactid', 'first_name', 'email', 'login', 'language', 'profile_list', 'allowed_org_list')); // Attributes to be displayed for the complete details

View File

@@ -0,0 +1,30 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:UserExternal' => 'Extern Bruger',
'Class:UserExternal+' => 'Bruger udenfor iTop',
));
?>

View File

@@ -0,0 +1,32 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:UserLDAP' => 'LDAP-Bruger',
'Class:UserLDAP+' => 'Bruger der godkendes via LDAP',
'Class:UserLDAP/Attribute:password' => 'Password',
'Class:UserLDAP/Attribute:password+' => 'Brugerens password',
));
?>

View File

@@ -0,0 +1,32 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:UserLocal' => 'iTop-Bruger',
'Class:UserLocal+' => 'Bruger der godkendes af iTop',
'Class:UserLocal/Attribute:password' => 'Password',
'Class:UserLocal/Attribute:password+' => 'Brugerens password',
));
?>

View File

@@ -0,0 +1,40 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Attachments:TabTitle_Count' => 'Vedhæftninger (%1$d)',
'Attachments:EmptyTabTitle' => 'Vedhæftninger',
'Attachments:FieldsetTitle' => 'Vedhæftninger',
'Attachments:DeleteBtn' => 'Slet',
'Attachments:History_File_Added' => 'Vedhæftning %1$s tilføjet.',
'Attachments:History_File_Removed' => 'Vedhæftning %1$s fjernet.',
'Attachments:AddAttachment' => 'Vedhæft: ',
'Attachments:UploadNotAllowedOnThisSystem' => 'Upload IKKE tilladt i dette system.',
'Attachment:Max_Go' => '(Maksimal størrelse: %1$s GB)',
'Attachment:Max_Mo' => '(Maksimal størrelse: %1$s MB)',
'Attachment:Max_Ko' => '(Maksimal størrelse: %1$s KB)',
'Attachments:NoAttachment' => 'Intet vedhæftet. ',
));
?>

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2015 Combodo SARL
//
// This file is part of iTop.
//
@@ -250,6 +250,7 @@ EOF
$('#attachment_plugin').trigger('remove_attachment', [att_id]);
return false; // Do not submit the form !
}
function ajaxFileUpload()
{
//starting setting some animation when the ajax starts and completes
@@ -347,7 +348,7 @@ EOF
$sIcon = utils::GetAbsoluteUrlAppRoot().AttachmentPlugIn::GetFileIcon($sFileName);
$sDownloadLink = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php?operation=download_document&class=Attachment&id='.$iAttId.'&field=contents';
$sPreview = $oDoc->IsPreviewAvailable() ? 'true' : 'false';
$oPage->add('<div class="attachment" id="display_attachment_'.$iAttId.'"><a data-preview="'.$sPreview.'" href="'.$sDownloadLink.'"><img src="'.$sIcon.'"><br/>'.$sFileName.'<input id="attachment_'+data.result.att_id+'" type="hidden" name="attachments[]" value="'.$iAttId.'"/></a><br/>&nbsp;<input id="btn_remove_'.$iAttId.'" type="button" class="btn_hidden" value="Delete" onClick="RemoveAttachment('.$iAttId.');"/>&nbsp;</div>');
$oPage->add('<div class="attachment" id="display_attachment_'.$iAttId.'"><a data-preview="'.$sPreview.'" href="'.$sDownloadLink.'"><img src="'.$sIcon.'"><br/>'.$sFileName.'<input id="attachment_'.$iAttId.'" type="hidden" name="attachments[]" value="'.$iAttId.'"/></a><br/>&nbsp;<input id="btn_remove_'.$iAttId.'" type="button" class="btn_hidden" value="Delete" onClick="RemoveAttachment('.$iAttId.');"/>&nbsp;</div>');
$oPage->add_ready_script("$('#attachment_plugin').trigger('add_attachment', [$iAttId, '".addslashes($sFileName)."']);");
}
}
@@ -368,6 +369,7 @@ $oPage->add_ready_script(
url: GetAbsoluteUrlModulesRoot()+'itop-attachments/ajax.attachment.php',
formData: { operation: 'add', temp_id: '$sTempId', obj_class: '$sClass' },
dataType: 'json',
pasteZone: null, // Don't accept files via Chrome's copy/paste
done: function (e, data) {
if(typeof(data.result.error) != 'undefined')
{
@@ -383,7 +385,7 @@ $oPage->add_ready_script(
{
$('#display_attachment_'+data.result.att_id).hover( function() { $(this).children(':button').toggleClass('btn_hidden'); } );
}
$('#attachment_plugin').trigger('add_attachment', [data.result.att_id, data.msg]);
$('#attachment_plugin').trigger('add_attachment', [data.result.att_id, data.result.msg]);
}
}
},
@@ -440,7 +442,6 @@ EOF
);
$oPage->p('<span style="display:none;" id="attachment_loading">Loading, please wait...</span>');
$oPage->p('<input type="hidden" id="attachment_plugin" name="attachment_plugin"/>');
$oPage->add('</fieldset>');
if ($this->m_bDeleteEnabled)
{
$oPage->add_ready_script('$(".attachment").hover( function() {$(this).children(":button").toggleClass("btn_hidden"); } );');
@@ -466,7 +467,9 @@ EOF
$oPage->add('<div class="attachment" id="attachment_'.$iAttId.'"><a data-preview="'.$sPreview.'" href="'.$sDownloadLink.'"><img src="'.$sIcon.'"><br/>'.$sFileName.'</a><input type="hidden" name="attachments[]" value="'.$iAttId.'"/><br/>&nbsp;&nbsp;</div>');
}
}
$oPage->add('</span>');
}
$oPage->add('</fieldset>');
$sPreviewNotAvailable = addslashes(Dict::S('Attachments:PreviewNotAvailable'));
$iMaxWidth = MetaModel::GetModuleSetting('itop-attachments', 'preview_max_width', 290);
$oPage->add_ready_script("$(document).tooltip({ items: '.attachment a', position: { my: 'left top', at: 'right top', using: function( position, feedback ) { $( this ).css( position ); }}, content: function() { if ($(this).attr('data-preview') == 'true') { return('<img style=\"max-width:{$iMaxWidth}px\" src=\"'+$(this).attr('href')+'\"></img>');} else { return '$sPreviewNotAvailable'; }}});");

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2014 Combodo SARL
// Copyright (C) 2013-2016 Combodo SARL
//
// This file is part of iTop.
//
@@ -18,8 +18,7 @@
/**
* Backup from an interactive session
*
* @copyright Copyright (C) 2013 Combodo SARL
* @copyright Copyright (C) 2013-2016 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
@@ -77,9 +76,8 @@ try
$sEnvironment = utils::ReadParam('environment', 'production', false, 'raw_data');
$oRestoreMutex = new iTopMutex('restore.'.$sEnvironment);
if ($oRestoreMutex->TryLock())
if (!$oRestoreMutex->IsLocked())
{
$oRestoreMutex->Unlock();
$sFile = utils::ReadParam('file', '', false, 'raw_data');
$sToken = str_replace(' ', '', (string)microtime());
$sTokenFile = APPROOT.'/data/restore.'.$sToken.'.tok';

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2014 Combodo SARL
// Copyright (C) 2014-2016 Combodo SARL
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -29,24 +29,8 @@ class BackupHandler extends ModuleHandlerAPI
try
{
$oBackupMutex = new iTopMutex('backup.'.utils::GetCurrentEnvironment());
if ($oBackupMutex->TryLock())
{
$oBackupMutex->Unlock();
}
else
{
// Not needed: the DB dump is done in a single transaction
//MetaModel::GetConfig()->Set('access_mode', ACCESS_READONLY, 'itop-backup');
//MetaModel::GetConfig()->Set('access_message', ' - '.dict::S('bkp-backup-running'), 'itop-backup');
}
$oRestoreMutex = new iTopMutex('restore.'.utils::GetCurrentEnvironment());
if ($oRestoreMutex->TryLock())
{
$oRestoreMutex->Unlock();
}
else
if ($oRestoreMutex->IsLocked())
{
MetaModel::GetConfig()->Set('access_mode', ACCESS_READONLY, 'itop-backup');
MetaModel::GetConfig()->Set('access_message', ' - '.dict::S('bkp-restore-running'), 'itop-backup');

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2014 Combodo SARL
// Copyright (C) 2016 Combodo SARL
//
// This file is part of iTop.
//
@@ -20,7 +20,7 @@
/**
* Monitor the backup
*
* @copyright Copyright (C) 2013 Combodo SARL
* @copyright Copyright (C) 2016 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
@@ -169,14 +169,13 @@ try
}
$oRestoreMutex = new iTopMutex('restore.'.utils::GetCurrentEnvironment());
if ($oRestoreMutex->TryLock())
if ($oRestoreMutex->IsLocked())
{
$oRestoreMutex->Unlock();
$sDisableRestore = '';
$sDisableRestore = 'disabled="disabled"';
}
else
{
$sDisableRestore = 'disabled="disabled"';
$sDisableRestore = '';
}
// 1st table: list the backups made in the background
@@ -271,20 +270,12 @@ try
// Ongoing operation ?
//
$oBackupMutex = new iTopMutex('backup.'.utils::GetCurrentEnvironment());
if ($oBackupMutex->TryLock())
{
$oBackupMutex->Unlock();
}
else
if ($oBackupMutex->IsLocked())
{
$oP->p(Dict::S('bkp-backup-running'));
}
$oRestoreMutex = new iTopMutex('restore.'.utils::GetCurrentEnvironment());
if ($oRestoreMutex->TryLock())
{
$oRestoreMutex->Unlock();
}
else
if ($oRestoreMutex->IsLocked())
{
$oP->p(Dict::S('bkp-restore-running'));
}

View File

@@ -0,0 +1,247 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:RoutineChange' => 'Rutine Ændring',
'Class:RoutineChange+' => '',
'Class:RoutineChange/Stimulus:ev_assign' => 'Tildel',
'Class:RoutineChange/Stimulus:ev_assign+' => '',
'Class:RoutineChange/Stimulus:ev_reopen' => 'Genåben',
'Class:RoutineChange/Stimulus:ev_reopen+' => '',
'Class:RoutineChange/Stimulus:ev_plan' => 'Planlæg',
'Class:RoutineChange/Stimulus:ev_plan+' => '',
'Class:RoutineChange/Stimulus:ev_approve' => 'Godkend',
'Class:RoutineChange/Stimulus:ev_approve+' => '',
'Class:RoutineChange/Stimulus:ev_replan' => 'Genplanlæg',
'Class:RoutineChange/Stimulus:ev_replan+' => '',
'Class:RoutineChange/Stimulus:ev_notapprove' => 'Godkend Ikke',
'Class:RoutineChange/Stimulus:ev_notapprove+' => '',
'Class:RoutineChange/Stimulus:ev_implement' => 'Implementer',
'Class:RoutineChange/Stimulus:ev_implement+' => '',
'Class:RoutineChange/Stimulus:ev_monitor' => 'Overvåg',
'Class:RoutineChange/Stimulus:ev_monitor+' => '',
'Class:RoutineChange/Stimulus:ev_finish' => 'Afslut',
'Class:RoutineChange/Stimulus:ev_finish+' => '',
'Class:NormalChange' => 'Normal Ændring',
'Class:NormalChange+' => '',
'Class:NormalChange/Attribute:acceptance_date' => 'Dato for accept',
'Class:NormalChange/Attribute:acceptance_date+' => '',
'Class:NormalChange/Attribute:acceptance_comment' => 'Kommentar til accept',
'Class:NormalChange/Attribute:acceptance_comment+' => '',
'Class:NormalChange/Stimulus:ev_validate' => 'Valider',
'Class:NormalChange/Stimulus:ev_validate+' => '',
'Class:NormalChange/Stimulus:ev_reject' => 'Afslå',
'Class:NormalChange/Stimulus:ev_reject+' => '',
'Class:NormalChange/Stimulus:ev_assign' => 'Tildel',
'Class:NormalChange/Stimulus:ev_assign+' => '',
'Class:NormalChange/Stimulus:ev_reopen' => 'Genåben',
'Class:NormalChange/Stimulus:ev_reopen+' => '',
'Class:NormalChange/Stimulus:ev_plan' => 'Planlæg',
'Class:NormalChange/Stimulus:ev_plan+' => '',
'Class:NormalChange/Stimulus:ev_approve' => 'Godkend',
'Class:NormalChange/Stimulus:ev_approve+' => '',
'Class:NormalChange/Stimulus:ev_replan' => 'Genplanlæg',
'Class:NormalChange/Stimulus:ev_replan+' => '',
'Class:NormalChange/Stimulus:ev_notapprove' => 'Godkent Ikke',
'Class:NormalChange/Stimulus:ev_notapprove+' => '',
'Class:NormalChange/Stimulus:ev_implement' => 'Implementer',
'Class:NormalChange/Stimulus:ev_implement+' => '',
'Class:NormalChange/Stimulus:ev_monitor' => 'Overvåg',
'Class:NormalChange/Stimulus:ev_monitor+' => '',
'Class:NormalChange/Stimulus:ev_finish' => 'Afslut',
'Class:NormalChange/Stimulus:ev_finish+' => '',
'Class:EmergencyChange' => 'Emergency Ændring',
'Class:EmergencyChange+' => '',
'Class:EmergencyChange/Stimulus:ev_assign' => 'Tildel',
'Class:EmergencyChange/Stimulus:ev_assign+' => '',
'Class:EmergencyChange/Stimulus:ev_reopen' => 'Genåben',
'Class:EmergencyChange/Stimulus:ev_reopen+' => '',
'Class:EmergencyChange/Stimulus:ev_plan' => 'Planlæg',
'Class:EmergencyChange/Stimulus:ev_plan+' => '',
'Class:EmergencyChange/Stimulus:ev_approve' => 'Godkend',
'Class:EmergencyChange/Stimulus:ev_approve+' => '',
'Class:EmergencyChange/Stimulus:ev_replan' => 'Genplanlæg',
'Class:EmergencyChange/Stimulus:ev_replan+' => '',
'Class:EmergencyChange/Stimulus:ev_notapprove' => 'Godkend Ikke',
'Class:EmergencyChange/Stimulus:ev_notapprove+' => '',
'Class:EmergencyChange/Stimulus:ev_implement' => 'Implementer',
'Class:EmergencyChange/Stimulus:ev_implement+' => '',
'Class:EmergencyChange/Stimulus:ev_monitor' => 'Overvåg',
'Class:EmergencyChange/Stimulus:ev_monitor+' => '',
'Class:EmergencyChange/Stimulus:ev_finish' => 'Afslut',
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
'Menu:ChangeManagement' => 'Change Management',
'Menu:Change:Overview' => 'Oversigt',
'Menu:Change:Overview+' => '',
'Menu:NewChange' => 'Ny Change',
'Menu:NewChange+' => 'Opret en ny Change ticket',
'Menu:SearchChanges' => 'Søg efter Changes',
'Menu:SearchChanges+' => 'Søg efter Change Tickets',
'Menu:Change:Shortcuts' => 'Genveje',
'Menu:Change:Shortcuts+' => '',
'Menu:WaitingAcceptance' => 'Changes, som afventer accept',
'Menu:WaitingAcceptance+' => '',
'Menu:WaitingApproval' => 'Changes, som afventer godkendelse',
'Menu:WaitingApproval+' => '',
'Menu:Changes' => 'Offene Changes',
'Menu:Changes+' => 'Alle åbne Changes',
'Menu:MyChanges' => 'Mine Changes',
'Menu:MyChanges+' => 'Changes som er tildelt mig',
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => 'Changes de sidste 7 dage, efter kategori',
'UI-ChangeManagementOverview-Last-7-days' => 'Antal Changes de sidste 7 dage',
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => 'Changes de sidste 7 dage efter type',
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => 'Changes de sidste 7 dage efter status',
'Class:Change' => 'Change',
'Class:Change+' => '',
'Class:Change/Attribute:status' => 'Status',
'Class:Change/Attribute:status+' => '',
'Class:Change/Attribute:status/Value:new' => 'Ny',
'Class:Change/Attribute:status/Value:new+' => '',
'Class:Change/Attribute:status/Value:validated' => 'Valideret',
'Class:Change/Attribute:status/Value:validated+' => '',
'Class:Change/Attribute:status/Value:rejected' => 'Afslået',
'Class:Change/Attribute:status/Value:rejected+' => '',
'Class:Change/Attribute:status/Value:assigned' => 'Tildelt',
'Class:Change/Attribute:status/Value:assigned+' => '',
'Class:Change/Attribute:status/Value:plannedscheduled' => 'Planlagt og tidssat',
'Class:Change/Attribute:status/Value:plannedscheduled+' => '',
'Class:Change/Attribute:status/Value:approved' => 'Godkendt',
'Class:Change/Attribute:status/Value:approved+' => '',
'Class:Change/Attribute:status/Value:notapproved' => 'Ikke Godkendt',
'Class:Change/Attribute:status/Value:notapproved+' => '',
'Class:Change/Attribute:status/Value:implemented' => 'Implementeret',
'Class:Change/Attribute:status/Value:implemented+' => '',
'Class:Change/Attribute:status/Value:monitored' => 'Overvåget',
'Class:Change/Attribute:status/Value:monitored+' => '',
'Class:Change/Attribute:status/Value:closed' => 'Lukket',
'Class:Change/Attribute:status/Value:closed+' => '',
'Class:Change/Attribute:reason' => 'Årsag',
'Class:Change/Attribute:reason+' => '',
'Class:Change/Attribute:requestor_id' => 'Rekvirent',
'Class:Change/Attribute:requestor_id+' => '',
'Class:Change/Attribute:requestor_email' => 'Rekvirent e-mail',
'Class:Change/Attribute:requestor_email+' => '',
'Class:Change/Attribute:creation_date' => 'Oprettet dato',
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:impact' => 'Indvirkning',
'Class:Change/Attribute:impact+' => '',
'Class:Change/Attribute:supervisor_group_id' => 'Supervisor-Team',
'Class:Change/Attribute:supervisor_group_id+' => '',
'Class:Change/Attribute:supervisor_group_name' => 'Supervisor-Teamnavn',
'Class:Change/Attribute:supervisor_group_name+' => '',
'Class:Change/Attribute:supervisor_id' => 'Supervisor',
'Class:Change/Attribute:supervisor_id+' => '',
'Class:Change/Attribute:supervisor_email' => 'Supervisor e-mail',
'Class:Change/Attribute:supervisor_email+' => '',
'Class:Change/Attribute:manager_group_id' => 'Manager-Team',
'Class:Change/Attribute:manager_group_id+' => '',
'Class:Change/Attribute:manager_group_name' => 'Manager-Team',
'Class:Change/Attribute:manager_group_name+' => '',
'Class:Change/Attribute:manager_id' => 'Manager',
'Class:Change/Attribute:manager_id+' => '',
'Class:Change/Attribute:manager_email' => 'Manager',
'Class:Change/Attribute:manager_email+' => '',
'Class:Change/Attribute:outage' => 'Nedetid',
'Class:Change/Attribute:outage+' => '',
'Class:Change/Attribute:outage/Value:no' => 'Nej',
'Class:Change/Attribute:outage/Value:no+' => '',
'Class:Change/Attribute:outage/Value:yes' => 'Ja',
'Class:Change/Attribute:outage/Value:yes+' => '',
'Class:Change/Attribute:fallback' => 'Fallback-Plan',
'Class:Change/Attribute:fallback+' => '',
'Class:Change/Attribute:parent_id' => 'Parent Change',
'Class:Change/Attribute:parent_id+' => '',
'Class:Change/Attribute:parent_name' => 'Parent Change Ref',
'Class:Change/Attribute:parent_name+' => '',
'Class:Change/Attribute:related_request_list' => 'Relaterede Requests',
'Class:Change/Attribute:related_request_list+' => '',
'Class:Change/Attribute:related_problems_list' => 'Relaterede Problemer',
'Class:Change/Attribute:related_problems_list+' => '',
'Class:Change/Attribute:child_changes_list' => 'Afledte Changes',
'Class:Change/Attribute:child_changes_list+' => '',
'Class:Change/Attribute:parent_id_friendlyname' => 'Parent Friendly Name',
'Class:Change/Attribute:parent_id_friendlyname+' => '',
'Class:Change/Attribute:parent_id_finalclass_recall' => 'Change-Type',
'Class:Change/Attribute:parent_id_finalclass_recall+' => '',
'Class:Change/Stimulus:ev_validate' => 'Valider',
'Class:Change/Stimulus:ev_validate+' => '',
'Class:Change/Stimulus:ev_reject' => 'Afslå',
'Class:Change/Stimulus:ev_reject+' => '',
'Class:Change/Stimulus:ev_assign' => 'Tildel',
'Class:Change/Stimulus:ev_assign+' => '',
'Class:Change/Stimulus:ev_reopen' => 'Genåben',
'Class:Change/Stimulus:ev_reopen+' => '',
'Class:Change/Stimulus:ev_plan' => 'Planlæg',
'Class:Change/Stimulus:ev_plan+' => '',
'Class:Change/Stimulus:ev_approve' => 'Godkend',
'Class:Change/Stimulus:ev_approve+' => '',
'Class:Change/Stimulus:ev_replan' => 'Genplanlæg',
'Class:Change/Stimulus:ev_replan+' => '',
'Class:Change/Stimulus:ev_notapprove' => 'Afslå',
'Class:Change/Stimulus:ev_notapprove+' => '',
'Class:Change/Stimulus:ev_implement' => 'Implementer',
'Class:Change/Stimulus:ev_implement+' => '',
'Class:Change/Stimulus:ev_monitor' => 'Overvåg',
'Class:Change/Stimulus:ev_monitor+' => '',
'Class:Change/Stimulus:ev_finish' => 'Afslut',
'Class:Change/Stimulus:ev_finish+' => '',
'Class:RoutineChange/Stimulus:ev_validate' => 'Valider',
'Class:RoutineChange/Stimulus:ev_validate+' => '',
'Class:RoutineChange/Stimulus:ev_reject' => 'Afslå',
'Class:RoutineChange/Stimulus:ev_reject+' => '',
'Class:ApprovedChange' => 'Godkendte Changes',
'Class:ApprovedChange+' => '',
'Class:ApprovedChange/Attribute:approval_date' => 'Dato for godkendelse',
'Class:ApprovedChange/Attribute:approval_date+' => '',
'Class:ApprovedChange/Attribute:approval_comment' => 'Kommentar til godkendelsen',
'Class:ApprovedChange/Attribute:approval_comment+' => '',
'Class:ApprovedChange/Stimulus:ev_validate' => 'Valider',
'Class:ApprovedChange/Stimulus:ev_validate+' => '',
'Class:ApprovedChange/Stimulus:ev_reject' => 'Afslå',
'Class:ApprovedChange/Stimulus:ev_reject+' => '',
'Class:ApprovedChange/Stimulus:ev_assign' => 'Tildel',
'Class:ApprovedChange/Stimulus:ev_assign+' => '',
'Class:ApprovedChange/Stimulus:ev_reopen' => 'Genåben',
'Class:ApprovedChange/Stimulus:ev_reopen+' => '',
'Class:ApprovedChange/Stimulus:ev_plan' => 'Planlæg',
'Class:ApprovedChange/Stimulus:ev_plan+' => '',
'Class:ApprovedChange/Stimulus:ev_approve' => 'Godkend',
'Class:ApprovedChange/Stimulus:ev_approve+' => '',
'Class:ApprovedChange/Stimulus:ev_replan' => 'Genplanlæg',
'Class:ApprovedChange/Stimulus:ev_replan+' => '',
'Class:ApprovedChange/Stimulus:ev_notapprove' => 'Tilbagekald godkendelse',
'Class:ApprovedChange/Stimulus:ev_notapprove+' => '',
'Class:ApprovedChange/Stimulus:ev_implement' => 'Implementer',
'Class:ApprovedChange/Stimulus:ev_implement+' => '',
'Class:ApprovedChange/Stimulus:ev_monitor' => 'Overvåg',
'Class:ApprovedChange/Stimulus:ev_monitor+' => '',
'Class:ApprovedChange/Stimulus:ev_finish' => 'Afslut',
'Class:ApprovedChange/Stimulus:ev_finish+' => '',
'Class:EmergencyChange/Stimulus:ev_validate' => 'Valider',
'Class:EmergencyChange/Stimulus:ev_validate+' => '',
'Class:EmergencyChange/Stimulus:ev_reject' => 'Afslå',
'Class:EmergencyChange/Stimulus:ev_reject+' => '',
));
?>

View File

@@ -0,0 +1,115 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:Change' => 'Change',
'Class:Change+' => '',
'Class:Change/Attribute:status' => 'Status',
'Class:Change/Attribute:status+' => 'Status for emnet',
'Class:Change/Attribute:status/Value:new' => 'Ny',
'Class:Change/Attribute:status/Value:new+' => 'Opret ny',
'Class:Change/Attribute:status/Value:assigned' => 'Tildelt',
'Class:Change/Attribute:status/Value:assigned+' => '',
'Class:Change/Attribute:status/Value:planned' => 'Planlagt',
'Class:Change/Attribute:status/Value:planned+' => '',
'Class:Change/Attribute:status/Value:rejected' => 'Afslået',
'Class:Change/Attribute:status/Value:rejected+' => '',
'Class:Change/Attribute:status/Value:approved' => 'Godkendt',
'Class:Change/Attribute:status/Value:approved+' => '',
'Class:Change/Attribute:status/Value:closed' => 'Lukket',
'Class:Change/Attribute:status/Value:closed+' => '',
'Class:Change/Attribute:category' => 'Kategori',
'Class:Change/Attribute:category+' => '',
'Class:Change/Attribute:category/Value:application' => 'Applikation',
'Class:Change/Attribute:category/Value:application+' => '',
'Class:Change/Attribute:category/Value:hardware' => 'Hardware',
'Class:Change/Attribute:category/Value:hardware+' => '',
'Class:Change/Attribute:category/Value:network' => 'Netværk',
'Class:Change/Attribute:category/Value:network+' => '',
'Class:Change/Attribute:category/Value:other' => 'Andet',
'Class:Change/Attribute:category/Value:other+' => '',
'Class:Change/Attribute:category/Value:software' => 'Software',
'Class:Change/Attribute:category/Value:software+' => '',
'Class:Change/Attribute:category/Value:system' => 'System',
'Class:Change/Attribute:category/Value:system+' => '',
'Class:Change/Attribute:reject_reason' => 'Årsag til afslag',
'Class:Change/Attribute:reject_reason+' => '',
'Class:Change/Attribute:changemanager_id' => 'Change Manager',
'Class:Change/Attribute:changemanager_id+' => '',
'Class:Change/Attribute:parent_id' => 'Parent Change',
'Class:Change/Attribute:parent_id+' => '',
'Class:Change/Attribute:creation_date' => 'Oprettelsesdato',
'Class:Change/Attribute:creation_date+' => '',
'Class:Change/Attribute:approval_date' => 'Godkendelsesdato',
'Class:Change/Attribute:approval_date+' => '',
'Class:Change/Attribute:fallback_plan' => 'Fallback-Plan',
'Class:Change/Attribute:fallback_plan+' => '',
'Class:Change/Attribute:related_request_list' => 'Relaterede Requests',
'Class:Change/Attribute:related_request_list+' => '',
'Class:Change/Attribute:child_changes_list' => 'Afledte Changes',
'Class:Change/Attribute:child_changes_list+' => '',
'Class:Change/Stimulus:ev_assign' => 'Tildel',
'Class:Change/Stimulus:ev_assign+' => '',
'Class:Change/Stimulus:ev_plan' => 'Planlæg',
'Class:Change/Stimulus:ev_plan+' => '',
'Class:Change/Stimulus:ev_reject' => 'Afslåp',
'Class:Change/Stimulus:ev_reject+' => '',
'Class:Change/Stimulus:ev_reopen' => 'Genåben',
'Class:Change/Stimulus:ev_reopen+' => '',
'Class:Change/Stimulus:ev_approve' => 'Godkend',
'Class:Change/Stimulus:ev_approve+' => '',
'Class:Change/Stimulus:ev_finish' => 'Luk',
'Class:Change/Stimulus:ev_finish+' => '',
'Menu:ChangeManagement' => 'Change Management',
'Menu:Change:Overview' => 'Oversigt',
'Menu:Change:Overview+' => '',
'Menu:NewChange' => 'Ny Change',
'Menu:NewChange+' => '',
'Menu:SearchChanges' => 'Søg efter Changes',
'Menu:SearchChanges+' => '',
'Menu:Change:Shortcuts' => 'Genveje',
'Menu:Change:Shortcuts+' => '',
'Menu:WaitingAcceptance' => 'Changes der afventer accept',
'Menu:WaitingAcceptance+' => '',
'Menu:WaitingApproval' => 'Changes der afventer godkendelse',
'Menu:WaitingApproval+' => '',
'Menu:Changes' => 'Åbne Changes',
'Menu:Changes+' => '',
'Menu:MyChanges' => 'Changes tildelt til mig',
'Menu:MyChanges+' => '',
'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => 'Changes de sidste 7 dage efter kategori',
'UI-ChangeManagementOverview-Last-7-days' => 'Antal Changes i de sidste 7 dage',
'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => 'Changes de sidste 7 dage efter type',
'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => 'Changes de sidste 7 dage efter status',
'Class:Change/Attribute:changemanager_email' => 'Change Manager Email',
'Class:Change/Attribute:changemanager_email+' => '',
'Class:Change/Attribute:parent_name' => 'Parent Change ref',
'Class:Change/Attribute:parent_name+' => '',
'Class:Change/Attribute:related_incident_list' => 'Relaterede Incidents',
'Class:Change/Attribute:related_incident_list+' => '',
'Class:Change/Attribute:parent_id_friendlyname' => 'Parent Change Friendly Name',
'Class:Change/Attribute:parent_id_friendlyname+' => '',
));
?>

File diff suppressed because it is too large Load Diff

View File

@@ -7916,6 +7916,11 @@
<enable_permission>UR_ALLOWED_YES</enable_permission>
<enable_stimulus/>
</menu>
<menu id="CSVImport" xsi:type="WebPageMenuNode" _delta="define">
<rank>10</rank>
<parent>DataAdministration</parent>
<url>$pages/csvimport.php</url>
</menu>
<menu id="Audit" xsi:type="WebPageMenuNode" _delta="define">
<rank>33</rank>
<parent>DataAdministration</parent>

View File

@@ -1019,10 +1019,14 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Class:lnkGroupToCI/Attribute:group_name+' => '',
'Class:lnkGroupToCI/Attribute:ci_name' => 'Name',
'Class:lnkGroupToCI/Attribute:ci_name+' => '',
'Menu:DataAdministration' => 'Data Management',
'Menu:DataAdministration+' => 'Data Management',
'Menu:Catalogs' => 'Kataloge',
'Menu:Catalogs+' => 'Datentypen',
'Menu:Audit' => 'Audit',
'Menu:Audit+' => 'Audit',
'Menu:CSVImport' => 'CSV-Import',
'Menu:CSVImport+' => 'Massenerstellung oder -aktualisierung',
'Menu:Organization' => 'Organisationen',
'Menu:Organization+' => 'Alle Organisationen',
'Menu:Application' => 'Anwendungen',

View File

@@ -1770,10 +1770,14 @@ Dict::Add('EN US', 'English', 'English', array(
//
Dict::Add('EN US', 'English', 'English', array(
'Menu:DataAdministration' => 'Data administration',
'Menu:DataAdministration+' => 'Data administration',
'Menu:Catalogs' => 'Catalogs',
'Menu:Catalogs+' => 'Data types',
'Menu:Audit' => 'Audit',
'Menu:Audit+' => 'Audit',
'Menu:CSVImport' => 'CSV import',
'Menu:CSVImport+' => 'Bulk creation or update',
'Menu:Organization' => 'Organizations',
'Menu:Organization+' => 'All organizations',
'Menu:Application' => 'Applications',

View File

@@ -1768,10 +1768,14 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
//
Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
'Menu:DataAdministration' => 'Administración de Datos',
'Menu:DataAdministration+' => 'Administración de Datos',
'Menu:Catalogs' => 'Catálogos',
'Menu:Catalogs+' => 'Tipos de Datos',
'Menu:Audit' => 'Auditoría',
'Menu:Audit+' => 'Auditoría',
'Menu:CSVImport' => 'Importar CSV',
'Menu:CSVImport+' => 'Creación o Actualización Másiva',
'Menu:Organization' => 'Organizaciones',
'Menu:Organization+' => 'Organizaciones',
'Menu:Application' => 'Aplicaciones',

View File

@@ -1717,10 +1717,14 @@ Dict::Add('FR FR', 'French', 'Français', array(
Dict::Add('FR FR', 'French', 'Français', array(
'Menu:DataAdministration' => 'Administration des données',
'Menu:DataAdministration+' => 'Administration des données',
'Menu:Catalogs' => 'Catalogues',
'Menu:Catalogs+' => 'Types de données',
'Menu:Audit' => 'Audit',
'Menu:Audit+' => 'Audit',
'Menu:CSVImport' => 'Import CSV',
'Menu:CSVImport+' => 'Import ou mise à jour en masse',
'Menu:Organization' => 'Organisations',
'Menu:Organization+' => 'Toutes les organisations',
'Menu:Application' => 'Logiciels',

View File

@@ -641,10 +641,14 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Class:Subnet/Tab:FreeIPs' => 'Szabad IP-k',
'Class:Subnet/Tab:FreeIPs-count' => 'Szabad IP-k: %1$s',
'Class:Subnet/Tab:FreeIPs-explain' => '10 szabad IP cím kivonata',
'Menu:DataAdministration' => 'Adat adminisztráció',
'Menu:DataAdministration+' => '',
'Menu:Catalogs' => 'Katalógusok',
'Menu:Catalogs+' => '',
'Menu:Audit' => 'Audit',
'Menu:Audit+' => '',
'Menu:CSVImport' => 'CSV import',
'Menu:CSVImport+' => '',
'Menu:Organization' => 'Szervezet',
'Menu:Organization+' => '',
'Menu:Application' => 'Alkalmazások',

View File

@@ -641,10 +641,14 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Class:Subnet/Tab:FreeIPs' => 'IP liberi',
'Class:Subnet/Tab:FreeIPs-count' => 'IP liberi: %1$s',
'Class:Subnet/Tab:FreeIPs-explain' => 'Qui c\'è un estratto di 10 indirizzi IP liberi',
'Menu:DataAdministration' => 'Dati di amministrazione',
'Menu:DataAdministration+' => '',
'Menu:Catalogs' => 'Cataloghi',
'Menu:Catalogs+' => 'Tipi di dato',
'Menu:Audit' => 'Audit',
'Menu:Audit+' => 'Audit',
'Menu:CSVImport' => 'Importazione CSV',
'Menu:CSVImport+' => '',
'Menu:Organization' => 'Organizzazioni',
'Menu:Organization+' => 'Tutte le organizzazioni',
'Menu:Application' => 'Applicazioni',

View File

@@ -1012,10 +1012,14 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Class:lnkGroupToCI/Attribute:group_name+' => '',
'Class:lnkGroupToCI/Attribute:ci_name' => '名前',
'Class:lnkGroupToCI/Attribute:ci_name+' => '',
'Menu:DataAdministration' => 'データ管理',
'Menu:DataAdministration+' => 'データ管理',
'Menu:Catalogs' => 'カタログ',
'Menu:Catalogs+' => 'データタイプ',
'Menu:Audit' => '監査',
'Menu:Audit+' => '監査',
'Menu:CSVImport' => 'CSV インポート',
'Menu:CSVImport+' => '一括作成/一括更新',
'Menu:Organization' => '組織',
'Menu:Organization+' => '全組織',
'Menu:Application' => 'アプリケーション',

View File

@@ -1771,10 +1771,14 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
//
Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'Menu:DataAdministration' => 'Data administratie',
'Menu:DataAdministration+' => 'Data administratie',
'Menu:Catalogs' => 'Catalogus',
'Menu:Catalogs+' => 'Data typen',
'Menu:Audit' => 'Audit',
'Menu:Audit+' => 'Audit',
'Menu:CSVImport' => 'CSV import',
'Menu:CSVImport+' => 'Grootschalige aanmaak of update',
'Menu:Organization' => 'Organisaties',
'Menu:Organization+' => 'Alle organisaties',
'Menu:Application' => 'Applicaties',

View File

@@ -1764,17 +1764,20 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
//
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:DataAdministration' => 'Administração Dados',
'Menu:DataAdministration+' => 'Administração Dados',
'Menu:Catalogs' => 'Catálogos',
'Menu:Catalogs+' => 'Tipos dados',
'Menu:Audit' => 'Auditoria',
'Menu:Audit+' => 'Auditoria',
'Menu:CSVImport' => 'Importar CSV',
'Menu:CSVImport+' => 'Criação ou atualização em massa',
'Menu:Organization' => 'Organizações',
'Menu:Organization+' => 'Todas organizações',
'Menu:Application' => 'Applicações',
'Menu:Application+' => 'Todas aplicações',
'Menu:DBServer' => 'Serviços Banco de Dados',
'Menu:DBServer+' => 'Serviços Banco de Dados',
'Menu:Audit' => 'Auditoria',
'Menu:ConfigManagement' => 'Gerenciamento Configurações',
'Menu:ConfigManagement+' => 'Gerenciamento Configurações',
'Menu:ConfigManagementOverview' => 'Visão geral',

View File

@@ -1765,10 +1765,14 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
//
Dict::Add('RU RU', 'Russian', 'Русский', array(
'Menu:DataAdministration' => 'Административные данные',
'Menu:DataAdministration+' => 'Административные данные',
'Menu:Catalogs' => 'Каталоги',
'Menu:Catalogs+' => 'Каталоги',
'Menu:Audit' => 'Аудит',
'Menu:Audit+' => 'Аудит',
'Menu:CSVImport' => 'Импорт CSV',
'Menu:CSVImport+' => 'Пакетное создание или обновление',
'Menu:Organization' => 'Организации',
'Menu:Organization+' => 'Все организации',
'Menu:Application' => 'Приложения',

View File

@@ -990,10 +990,14 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
//
Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'Menu:DataAdministration' => 'Veri Yönetimi',
'Menu:DataAdministration+' => 'Veri Yönetimi',
'Menu:Catalogs' => 'Kataloglar',
'Menu:Catalogs+' => 'Veri tipleri',
'Menu:Audit' => 'Denetleme',
'Menu:Audit+' => 'Denetleme',
'Menu:CSVImport' => 'CSV dışardan al',
'Menu:CSVImport+' => 'Çoklu yaratım veya güncelleme',
'Menu:Organization' => 'Kurumlar',
'Menu:Organization+' => 'Tüm Kurumlar',
'Menu:Application' => 'Uygulamalar',

View File

@@ -992,10 +992,14 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
//
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:DataAdministration' => '数据管理',
'Menu:DataAdministration+' => '数据管理',
'Menu:Catalogs' => '目录',
'Menu:Catalogs+' => '数据类别',
'Menu:Audit' => '审计',
'Menu:Audit+' => '审计',
'Menu:CSVImport' => 'CSV 导入',
'Menu:CSVImport+' => '大批量创建或修改',
'Menu:Organization' => '组织',
'Menu:Organization+' => '所有组织',
'Menu:Application' => '应用程序',

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2014 Combodo SARL
// Copyright (C) 2014-2016 Combodo SARL
//
// This file is part of iTop.
//
@@ -105,6 +105,10 @@ try
{
$oP->add("<div class=\"header_message message_info\">Sorry, iTop is in <b>demonstration mode</b>: the configuration file cannot be edited.</div>");
}
if (MetaModel::GetModuleSetting('itop-config', 'config_editor', '') == 'disabled')
{
$oP->add("<div class=\"header_message message_info\">iTop interactive edition of the configuration as been disabled. See <tt>'config_editor' => 'disabled'</tt> in the configuration file.</div>");
}
else
{
$oP->add_style(
@@ -129,27 +133,50 @@ EOF
if ($sOperation == 'save')
{
$sConfig = utils::ReadParam('new_config', '', false, 'raw_data');
$sTransactionId = utils::ReadParam('transaction_id', '');
$sOrginalConfig = utils::ReadParam('prev_config', '', false, 'raw_data');
if ($sConfig == $sOrginalConfig)
if (!utils::IsTransactionValid($sTransactionId, true))
{
$oP->add('<div id="save_result" class="header_message">'.Dict::S('config-no-change').'</div>');
$oP->add("<div class=\"header_message message_info\">Error: invalid Transaction ID. The configuration was <b>NOT</b> modified.</div>");
}
else
{
try
if ($sConfig == $sOrginalConfig)
{
TestConfig($sConfig, $oP); // throws exceptions
@chmod($sConfigFile, 0770); // Allow overwriting the file
file_put_contents($sConfigFile, $sConfig);
@chmod($sConfigFile, 0444); // Read-only
$oP->p('<div id="save_result" class="header_message message_ok">'.Dict::S('Successfully recorded.').'</div>');
$sOrginalConfig = str_replace("\r\n", "\n", file_get_contents($sConfigFile));
$oP->add('<div id="save_result" class="header_message">'.Dict::S('config-no-change').'</div>');
}
catch (Exception $e)
else
{
$oP->p('<div id="save_result" class="header_message message_error">'.$e->getMessage().'</div>');
try
{
TestConfig($sConfig, $oP); // throws exceptions
@chmod($sConfigFile, 0770); // Allow overwriting the file
$sTmpFile = tempnam(SetupUtils::GetTmpDir(), 'itop-cfg-');
// Don't write the file as-is since it would allow to inject any kind of PHP code.
// Instead write the interpreted version of the file
// Note:
// The actual raw PHP code will anyhow be interpreted exactly twice: once in TestConfig() above
// and a second time during the load of the Config object below.
// If you are really concerned about an iTop administrator crafting some malicious
// PHP code inside the config file, then turn off the interactive configuration
// editor by adding the configuration parameter:
// 'itop-config' => array(
// 'config_editor' => 'disabled',
// )
file_put_contents($sTmpFile, $sConfig);
$oTempConfig = new Config($sTmpFile, true);
$oTempConfig->WriteToFile($sConfigFile);
@unlink($sTmpFile);
@chmod($sConfigFile, 0444); // Read-only
$oP->p('<div id="save_result" class="header_message message_ok">'.Dict::S('Successfully recorded.').'</div>');
$sOrginalConfig = str_replace("\r\n", "\n", file_get_contents($sConfigFile));
}
catch (Exception $e)
{
$oP->p('<div id="save_result" class="header_message message_error">'.$e->getMessage().'</div>');
}
}
}
}
@@ -164,6 +191,7 @@ EOF
$oP->p(Dict::S('config-edit-intro'));
$oP->add("<form method=\"POST\">");
$oP->add("<input type=\"hidden\" name=\"operation\" value=\"save\">");
$oP->add("<input type=\"hidden\" name=\"transaction_id\" value=\"".utils::GetNewTransactionId()."\">");
$oP->add("<input type=\"submit\" value=\"".Dict::S('config-apply')."\"><button onclick=\"ResetConfig(); return false;\">".Dict::S('config-cancel')."</button>");
$oP->add("<span class=\"current_line\">".Dict::Format('config-current-line', "<span class=\"line_number\"></span>")."</span>");
$oP->add("<input type=\"hidden\" id=\"prev_config\" name=\"prev_config\" value=\"$sOriginalConfigEscaped\">");

View File

@@ -0,0 +1,217 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:Incident' => 'Incident',
'Class:Incident+' => '',
'Class:Incident/Attribute:status' => 'Status',
'Class:Incident/Attribute:status+' => '',
'Class:Incident/Attribute:status/Value:new' => 'Ny',
'Class:Incident/Attribute:status/Value:new+' => '',
'Class:Incident/Attribute:status/Value:escalated_tto' => 'Eskaleret TTO',
'Class:Incident/Attribute:status/Value:escalated_tto+' => '',
'Class:Incident/Attribute:status/Value:assigned' => 'Tildelt',
'Class:Incident/Attribute:status/Value:assigned+' => '',
'Class:Incident/Attribute:status/Value:escalated_ttr' => 'Eskaleret TTR',
'Class:Incident/Attribute:status/Value:escalated_ttr+' => '',
'Class:Incident/Attribute:status/Value:pending' => 'Afventer',
'Class:Incident/Attribute:status/Value:pending+' => '',
'Class:Incident/Attribute:status/Value:resolved' => 'Løst',
'Class:Incident/Attribute:status/Value:resolved+' => '',
'Class:Incident/Attribute:status/Value:closed' => 'Lukket',
'Class:Incident/Attribute:status/Value:closed+' => '',
'Class:Incident/Attribute:impact' => 'Påvirkning',
'Class:Incident/Attribute:impact+' => '',
'Class:Incident/Attribute:impact/Value:1' => 'Afdeling',
'Class:Incident/Attribute:impact/Value:1+' => 'En afdeling er påvirket',
'Class:Incident/Attribute:impact/Value:2' => 'Service',
'Class:Incident/Attribute:impact/Value:2+' => 'En service er påvirket',
'Class:Incident/Attribute:impact/Value:3' => 'Person',
'Class:Incident/Attribute:impact/Value:3+' => 'En person er påvirket',
'Class:Incident/Attribute:priority' => 'Prioritet',
'Class:Incident/Attribute:priority+' => '',
'Class:Incident/Attribute:priority/Value:1' => 'Kritisk',
'Class:Incident/Attribute:priority/Value:1+' => '',
'Class:Incident/Attribute:priority/Value:2' => 'Høj',
'Class:Incident/Attribute:priority/Value:2+' => '',
'Class:Incident/Attribute:priority/Value:3' => 'Middel',
'Class:Incident/Attribute:priority/Value:3+' => '',
'Class:Incident/Attribute:priority/Value:4' => 'Lav',
'Class:Incident/Attribute:priority/Value:4+' => '',
'Class:Incident/Attribute:urgency' => 'Vigtighed',
'Class:Incident/Attribute:urgency+' => '',
'Class:Incident/Attribute:urgency/Value:1' => 'Kritisk',
'Class:Incident/Attribute:urgency/Value:1+' => '',
'Class:Incident/Attribute:urgency/Value:2' => 'Høj',
'Class:Incident/Attribute:urgency/Value:2+' => '',
'Class:Incident/Attribute:urgency/Value:3' => 'Middel',
'Class:Incident/Attribute:urgency/Value:3+' => '',
'Class:Incident/Attribute:urgency/Value:4' => 'Lav',
'Class:Incident/Attribute:urgency/Value:4+' => '',
'Class:Incident/Attribute:origin' => 'Oprindelse',
'Class:Incident/Attribute:origin+' => '',
'Class:Incident/Attribute:origin/Value:mail' => 'Mail',
'Class:Incident/Attribute:origin/Value:mail+' => '',
'Class:Incident/Attribute:origin/Value:monitoring' => 'Monitoring',
'Class:Incident/Attribute:origin/Value:monitoring+' => '',
'Class:Incident/Attribute:origin/Value:phone' => 'Telefon',
'Class:Incident/Attribute:origin/Value:phone+' => '',
'Class:Incident/Attribute:origin/Value:portal' => 'Portal',
'Class:Incident/Attribute:origin/Value:portal+' => '',
'Class:Incident/Attribute:service_id' => 'Ydelse',
'Class:Incident/Attribute:service_id+' => '',
'Class:Incident/Attribute:servicesubcategory_id' => 'Ydelse underkategori',
'Class:Incident/Attribute:servicesubcategory_id+' => '',
'Class:Incident/Attribute:escalation_flag' => 'Eskalations Flag',
'Class:Incident/Attribute:escalation_flag+' => '',
'Class:Incident/Attribute:escalation_flag/Value:no' => 'Nej',
'Class:Incident/Attribute:escalation_flag/Value:no+' => '',
'Class:Incident/Attribute:escalation_flag/Value:yes' => 'Ja',
'Class:Incident/Attribute:escalation_flag/Value:yes+' => '',
'Class:Incident/Attribute:escalation_reason' => 'Eskalationsgrund',
'Class:Incident/Attribute:escalation_reason+' => '',
'Class:Incident/Attribute:assignment_date' => 'Tildelt dato',
'Class:Incident/Attribute:assignment_date+' => '',
'Class:Incident/Attribute:resolution_date' => 'Løsnings dato',
'Class:Incident/Attribute:resolution_date+' => '',
'Class:Incident/Attribute:last_pending_date' => 'Sidste udsættelse dato',
'Class:Incident/Attribute:last_pending_date+' => '',
'Class:Incident/Attribute:cumulatedpending' => 'Akkumuleret ventetid',
'Class:Incident/Attribute:cumulatedpending+' => '',
'Class:Incident/Attribute:tto' => 'TTO (Time To Own)',
'Class:Incident/Attribute:tto+' => '',
'Class:Incident/Attribute:ttr' => 'TTR (Time To Resolve)',
'Class:Incident/Attribute:ttr+' => '',
'Class:Incident/Attribute:tto_escalation_deadline' => 'TTO-Deadline',
'Class:Incident/Attribute:tto_escalation_deadline+' => '',
'Class:Incident/Attribute:sla_tto_passed' => 'SLA TTO overskredet',
'Class:Incident/Attribute:sla_tto_passed+' => '',
'Class:Incident/Attribute:sla_tto_over' => 'Overskridelse SLA TTO',
'Class:Incident/Attribute:sla_tto_over+' => '',
'Class:Incident/Attribute:ttr_escalation_deadline' => 'TTR-Deadline',
'Class:Incident/Attribute:ttr_escalation_deadline+' => '',
'Class:Incident/Attribute:sla_ttr_passed' => 'SLA TTR overskredet',
'Class:Incident/Attribute:sla_ttr_passed+' => '',
'Class:Incident/Attribute:sla_ttr_over' => 'Overskridelse SLA TTR',
'Class:Incident/Attribute:sla_ttr_over+' => '',
'Class:Incident/Attribute:time_spent' => 'Tid forbrugt til løsning',
'Class:Incident/Attribute:time_spent+' => '',
'Class:Incident/Attribute:resolution_code' => 'Løsningskode',
'Class:Incident/Attribute:resolution_code+' => '',
'Class:Incident/Attribute:resolution_code/Value:assistance' => 'Assistance',
'Class:Incident/Attribute:resolution_code/Value:assistance+' => '',
'Class:Incident/Attribute:resolution_code/Value:bug fixed' => 'Bugfix',
'Class:Incident/Attribute:resolution_code/Value:bug fixed+' => '',
'Class:Incident/Attribute:resolution_code/Value:hardware repair' => 'Hardware Reparation',
'Class:Incident/Attribute:resolution_code/Value:hardware repair+' => '',
'Class:Incident/Attribute:resolution_code/Value:other' => 'Andet',
'Class:Incident/Attribute:resolution_code/Value:other+' => '',
'Class:Incident/Attribute:resolution_code/Value:software patch' => 'Software Patch',
'Class:Incident/Attribute:resolution_code/Value:software patch+' => '',
'Class:Incident/Attribute:resolution_code/Value:system update' => 'System Update',
'Class:Incident/Attribute:resolution_code/Value:system update+' => '',
'Class:Incident/Attribute:resolution_code/Value:training' => 'Uddannelse',
'Class:Incident/Attribute:resolution_code/Value:training+' => '',
'Class:Incident/Attribute:solution' => 'Løsning',
'Class:Incident/Attribute:solution+' => '',
'Class:Incident/Attribute:pending_reason' => 'Årsag til afventer',
'Class:Incident/Attribute:pending_reason+' => '',
'Class:Incident/Attribute:parent_incident_id' => 'Parent Incident',
'Class:Incident/Attribute:parent_incident_id+' => '',
'Class:Incident/Attribute:parent_change_id' => 'Parent Change',
'Class:Incident/Attribute:parent_change_id+' => '',
'Class:Incident/Attribute:child_incidents_list' => 'Afledte Incidents',
'Class:Incident/Attribute:child_incidents_list+' => '',
'Class:Incident/Attribute:public_log' => 'Offentlig Log',
'Class:Incident/Attribute:public_log+' => '',
'Class:Incident/Attribute:user_satisfaction' => 'Bruger tilfredshed',
'Class:Incident/Attribute:user_satisfaction+' => '',
'Class:Incident/Attribute:user_satisfaction/Value:1' => 'Meget tilfreds',
'Class:Incident/Attribute:user_satisfaction/Value:1+' => '',
'Class:Incident/Attribute:user_satisfaction/Value:2' => 'Tilfreds',
'Class:Incident/Attribute:user_satisfaction/Value:2+' => '',
'Class:Incident/Attribute:user_satisfaction/Value:3' => 'Nogenlunde tilfreds',
'Class:Incident/Attribute:user_satisfaction/Value:3+' => '',
'Class:Incident/Attribute:user_satisfaction/Value:4' => 'Meget utilfreds',
'Class:Incident/Attribute:user_satisfaction/Value:4+' => '',
'Class:Incident/Attribute:user_comment' => 'Bruger kommentar',
'Class:Incident/Attribute:user_comment+' => '',
'Class:Incident/Stimulus:ev_assign' => 'Tildelt',
'Class:Incident/Stimulus:ev_assign+' => '',
'Class:Incident/Stimulus:ev_reassign' => 'Forny tildeling',
'Class:Incident/Stimulus:ev_reassign+' => '',
'Class:Incident/Stimulus:ev_pending' => 'Afventer',
'Class:Incident/Stimulus:ev_pending+' => '',
'Class:Incident/Stimulus:ev_timeout' => 'Timeout',
'Class:Incident/Stimulus:ev_timeout+' => '',
'Class:Incident/Stimulus:ev_autoresolve' => 'Automatisk løst',
'Class:Incident/Stimulus:ev_autoresolve+' => '',
'Class:Incident/Stimulus:ev_autoclose' => 'Automatisk lukket',
'Class:Incident/Stimulus:ev_autoclose+' => '',
'Class:Incident/Stimulus:ev_resolve' => 'Marker som løst',
'Class:Incident/Stimulus:ev_resolve+' => '',
'Class:Incident/Stimulus:ev_close' => 'Luk denne Request',
'Class:Incident/Stimulus:ev_close+' => '',
'Class:Incident/Stimulus:ev_reopen' => 'Genåben',
'Class:Incident/Stimulus:ev_reopen+' => '',
'Menu:IncidentManagement' => 'Incident Management',
'Menu:IncidentManagement+' => '',
'Menu:Incident:Overview' => 'Oversigt',
'Menu:Incident:Overview+' => '',
'Menu:NewIncident' => 'Ny Incident',
'Menu:NewIncident+' => '',
'Menu:SearchIncidents' => 'Søg efter Incidents',
'Menu:SearchIncidents+' => '',
'Menu:Incident:Shortcuts' => 'Genveje',
'Menu:Incident:Shortcuts+' => '',
'Menu:Incident:MyIncidents' => 'Mine Incidents',
'Menu:Incident:MyIncidents+' => '',
'Menu:Incident:EscalatedIncidents' => 'Eskalerede Incidents',
'Menu:Incident:EscalatedIncidents+' => '',
'Menu:Incident:OpenIncidents' => 'Alle åbne Incidents',
'Menu:Incident:OpenIncidents+' => '',
'Menu:Incident:UnassignedIncidents' => 'Ikke tildelte Incidents',
'Menu:Incident:UnassignedIncidents+' => '',
'Menu:Incident:HelpdeskIncidents' => 'Level2 tildelte Incidents',
'Menu:Incident:HelpdeskIncidents+' => '',
'UI-IncidentManagementOverview-IncidentByPriority-last-14-days' => 'Incidents de sidste 14 dage efter prioritet',
'UI-IncidentManagementOverview-Last-14-days' => 'Antal Incidents de sidste 14 dage',
'UI-IncidentManagementOverview-OpenIncidentByStatus' => 'Åbne Incidents efter status',
'UI-IncidentManagementOverview-OpenIncidentByAgent' => 'Åbne Incidents efter tildelt til',
'UI-IncidentManagementOverview-OpenIncidentByCustomer' => 'Åbne Incidents efter bruger',
'Class:Incident/Attribute:status/Value:waiting_for_approval' => 'Afventer godkendelse',
'Class:Incident/Attribute:status/Value:waiting_for_approval+' => '',
'Class:Incident/Attribute:service_name' => 'Ydelsesnavn',
'Class:Incident/Attribute:service_name+' => '',
'Class:Incident/Attribute:servicesubcategory_name' => 'Ydelses underkategorinavn',
'Class:Incident/Attribute:servicesubcategory_name+' => '',
'Class:Incident/Attribute:parent_incident_ref' => 'Parent-Incident-Reference',
'Class:Incident/Attribute:parent_incident_ref+' => '',
'Class:Incident/Attribute:parent_change_ref' => 'Parent-Change-Reference',
'Class:Incident/Attribute:parent_change_ref+' => '',
'Class:Incident/Attribute:parent_incident_id_friendlyname' => 'Parent-Incident-Friendly Name',
'Class:Incident/Attribute:parent_incident_id_friendlyname+' => '',
));
?>

View File

@@ -0,0 +1,126 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:KnownError' => 'Known Error',
'Class:KnownError+' => 'Dokumenterede fejl for et bestående Issue',
'Class:KnownError/Attribute:name' => 'Navn',
'Class:KnownError/Attribute:name+' => '',
'Class:KnownError/Attribute:org_id' => 'Kunde',
'Class:KnownError/Attribute:org_id+' => '',
'Class:KnownError/Attribute:problem_id' => 'Tilhørende problem',
'Class:KnownError/Attribute:problem_id+' => '',
'Class:KnownError/Attribute:symptom' => 'Symptom',
'Class:KnownError/Attribute:symptom+' => '',
'Class:KnownError/Attribute:root_cause' => 'Grund årsag',
'Class:KnownError/Attribute:root_cause+' => '',
'Class:KnownError/Attribute:workaround' => 'Workaround',
'Class:KnownError/Attribute:workaround+' => '',
'Class:KnownError/Attribute:solution' => 'Løsning',
'Class:KnownError/Attribute:solution+' => '',
'Class:KnownError/Attribute:error_code' => 'Fejlkode',
'Class:KnownError/Attribute:error_code+' => '',
'Class:KnownError/Attribute:domain' => 'Område',
'Class:KnownError/Attribute:domain+' => '',
'Class:KnownError/Attribute:domain/Value:Application' => 'Anvendelse',
'Class:KnownError/Attribute:domain/Value:Application+' => 'Anvendelse',
'Class:KnownError/Attribute:domain/Value:Desktop' => 'Desktop',
'Class:KnownError/Attribute:domain/Value:Desktop+' => 'Desktop',
'Class:KnownError/Attribute:domain/Value:Network' => 'Netværk',
'Class:KnownError/Attribute:domain/Value:Network+' => 'Netværk',
'Class:KnownError/Attribute:domain/Value:Server' => 'Server',
'Class:KnownError/Attribute:domain/Value:Server+' => 'Server',
'Class:KnownError/Attribute:vendor' => 'Leverandør',
'Class:KnownError/Attribute:vendor+' => '',
'Class:KnownError/Attribute:model' => 'Model',
'Class:KnownError/Attribute:model+' => '',
'Class:KnownError/Attribute:version' => 'Version',
'Class:KnownError/Attribute:version+' => '',
'Class:KnownError/Attribute:ci_list' => 'CIs',
'Class:KnownError/Attribute:ci_list+' => '',
'Class:KnownError/Attribute:document_list' => 'Dokumenter',
'Class:KnownError/Attribute:document_list+' => '',
'Class:lnkErrorToFunctionalCI' => 'Sammenhæng Fejl/FunctionalCI',
'Class:lnkErrorToFunctionalCI+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id' => 'CI',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:error_id' => 'Fejl',
'Class:lnkErrorToFunctionalCI/Attribute:error_id+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:reason' => 'Årsag',
'Class:lnkErrorToFunctionalCI/Attribute:reason+' => '',
'Class:lnkDocumentToError' => 'Sammenhæng Dokumenter/Fejl',
'Class:lnkDocumentToError+' => '',
'Class:lnkDocumentToError/Attribute:document_id' => 'Dokument',
'Class:lnkDocumentToError/Attribute:document_id+' => '',
'Class:lnkDocumentToError/Attribute:error_id' => 'Fejl',
'Class:lnkDocumentToError/Attribute:error_id+' => '',
'Class:lnkDocumentToError/Attribute:link_type' => 'Sammenhængstype',
'Class:lnkDocumentToError/Attribute:link_type+' => '',
'Class:FAQ' => 'FAQ',
'Class:FAQ+' => '',
'Class:FAQ/Attribute:title' => 'Titel',
'Class:FAQ/Attribute:title+' => '',
'Class:FAQ/Attribute:summary' => 'Sammenfatning',
'Class:FAQ/Attribute:summary+' => '',
'Class:FAQ/Attribute:description' => 'Beskrivelse',
'Class:FAQ/Attribute:description+' => '',
'Class:FAQ/Attribute:category_id' => 'Kategori',
'Class:FAQ/Attribute:category_id+' => '',
'Class:FAQ/Attribute:error_code' => 'Fejlkode',
'Class:FAQ/Attribute:error_code+' => '',
'Class:FAQ/Attribute:key_words' => 'Nøgleord',
'Class:FAQ/Attribute:key_words+' => '',
'Class:FAQCategory' => 'FAQ-Kategori',
'Class:FAQCategory+' => '',
'Class:FAQCategory/Attribute:name' => 'Navn',
'Class:FAQCategory/Attribute:name+' => '',
'Class:FAQCategory/Attribute:faq_list' => 'FAQs',
'Class:FAQCategory/Attribute:faq_list+' => '',
'Class:KnownError/Attribute:cust_name' => 'Kundennavn',
'Class:KnownError/Attribute:cust_name+' => '',
'Class:KnownError/Attribute:problem_ref' => 'Reference',
'Class:KnownError/Attribute:problem_ref+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name' => 'CI-Navn',
'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name+' => '',
'Class:lnkErrorToFunctionalCI/Attribute:error_name' => 'Fejlnavn',
'Class:lnkErrorToFunctionalCI/Attribute:error_name+' => '',
'Class:lnkDocumentToError/Attribute:document_name' => 'Dokumentnavn',
'Class:lnkDocumentToError/Attribute:document_name+' => '',
'Class:lnkDocumentToError/Attribute:error_name' => 'Fejlnavn',
'Class:lnkDocumentToError/Attribute:error_name+' => '',
'Class:FAQ/Attribute:category_name' => 'Kategorinavn',
'Class:FAQ/Attribute:category_name+' => '',
'Menu:NewError' => 'Ny kendt fejl',
'Menu:NewError+' => '',
'Menu:SearchError' => 'Søg efter kendte fejl',
'Menu:SearchError+' => '',
'Menu:Problem:KnownErrors' => 'Alle kendte Fejl',
'Menu:Problem:KnownErrors+' => 'Alle kendte Fejl',
'Menu:FAQCategory' => 'FAQ-Kategorier',
'Menu:FAQCategory+' => '',
'Menu:FAQ' => 'FAQs',
'Menu:FAQ+' => '',
));
?>

View File

@@ -0,0 +1,119 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:Problem' => 'Problem',
'Class:Problem+' => '',
'Class:Problem/Attribute:status' => 'Status',
'Class:Problem/Attribute:status+' => '',
'Class:Problem/Attribute:status/Value:new' => 'Ny',
'Class:Problem/Attribute:status/Value:new+' => '',
'Class:Problem/Attribute:status/Value:assigned' => 'Tildelt',
'Class:Problem/Attribute:status/Value:assigned+' => '',
'Class:Problem/Attribute:status/Value:resolved' => 'Løst',
'Class:Problem/Attribute:status/Value:resolved+' => '',
'Class:Problem/Attribute:status/Value:closed' => 'Lukket',
'Class:Problem/Attribute:status/Value:closed+' => '',
'Class:Problem/Attribute:service_id' => 'Service',
'Class:Problem/Attribute:service_id+' => '',
'Class:Problem/Attribute:servicesubcategory_id' => 'Service Kategori',
'Class:Problem/Attribute:servicesubcategory_id+' => '',
'Class:Problem/Attribute:product' => 'Produkt',
'Class:Problem/Attribute:product+' => '',
'Class:Problem/Attribute:impact' => 'Påvirkning',
'Class:Problem/Attribute:impact+' => '',
'Class:Problem/Attribute:impact/Value:1' => 'Afdeling',
'Class:Problem/Attribute:impact/Value:1+' => 'En afdeling er påvirket',
'Class:Problem/Attribute:impact/Value:2' => 'Service',
'Class:Problem/Attribute:impact/Value:2+' => 'En service er påvirket',
'Class:Problem/Attribute:impact/Value:3' => 'Person',
'Class:Problem/Attribute:impact/Value:3+' => 'En person er påvirket',
'Class:Problem/Attribute:urgency' => 'Vigtighed',
'Class:Problem/Attribute:urgency+' => '',
'Class:Problem/Attribute:urgency/Value:1' => 'Lav',
'Class:Problem/Attribute:urgency/Value:1+' => 'Lav',
'Class:Problem/Attribute:urgency/Value:2' => 'Middel',
'Class:Problem/Attribute:urgency/Value:2+' => 'Middel',
'Class:Problem/Attribute:urgency/Value:3' => 'Høj',
'Class:Problem/Attribute:urgency/Value:3+' => 'Høj',
'Class:Problem/Attribute:urgency/Value:4' => '',
'Class:Problem/Attribute:urgency/Value:4+' => '',
'Class:Problem/Attribute:priority' => 'Prioritet',
'Class:Problem/Attribute:priority+' => '',
'Class:Problem/Attribute:priority/Value:1' => 'Lav',
'Class:Problem/Attribute:priority/Value:1+' => '',
'Class:Problem/Attribute:priority/Value:2' => 'Middel',
'Class:Problem/Attribute:priority/Value:2+' => '',
'Class:Problem/Attribute:priority/Value:3' => 'Høj',
'Class:Problem/Attribute:priority/Value:3+' => '',
'Class:Problem/Attribute:priority/Value:4' => '',
'Class:Problem/Attribute:priority/Value:4+' => '',
'Class:Problem/Attribute:related_change_id' => 'Relateret Change',
'Class:Problem/Attribute:related_change_id+' => '',
'Class:Problem/Attribute:assignment_date' => 'Dato tildelt',
'Class:Problem/Attribute:assignment_date+' => '',
'Class:Problem/Attribute:resolution_date' => 'Dato løst',
'Class:Problem/Attribute:resolution_date+' => '',
'Class:Problem/Attribute:knownerrors_list' => 'Known Errors',
'Class:Problem/Attribute:knownerrors_list+' => '',
'Class:Problem/Attribute:related_request_list' => 'Relateret Requests',
'Class:Problem/Attribute:related_request_list+' => '',
'Class:Problem/Stimulus:ev_assign' => 'Tildel',
'Class:Problem/Stimulus:ev_assign+' => '',
'Class:Problem/Stimulus:ev_reassign' => 'Forny tildeling',
'Class:Problem/Stimulus:ev_reassign+' => '',
'Class:Problem/Stimulus:ev_resolve' => 'Løs',
'Class:Problem/Stimulus:ev_resolve+' => '',
'Class:Problem/Stimulus:ev_close' => 'Luk',
'Class:Problem/Stimulus:ev_close+' => '',
'Menu:ProblemManagement' => 'Problem Management',
'Menu:ProblemManagement+' => 'Problem Management',
'Menu:Problem:Overview' => 'Oversigt',
'Menu:Problem:Overview+' => 'Oversigt',
'Menu:NewProblem' => 'Nyt Problem',
'Menu:NewProblem+' => 'Nyt Problem',
'Menu:SearchProblems' => 'Søg efter problem',
'Menu:SearchProblems+' => 'Søg efter problem',
'Menu:Problem:Shortcuts' => 'Genvej',
'Menu:Problem:MyProblems' => 'Mine Problemer',
'Menu:Problem:MyProblems+' => 'Mine Problemer',
'Menu:Problem:OpenProblems' => 'Alle uløste problemer',
'Menu:Problem:OpenProblems+' => 'Alle uløste problemer',
'UI-ProblemManagementOverview-ProblemByService' => 'Problemer efter ydelse',
'UI-ProblemManagementOverview-ProblemByService+' => 'Problemer efter ydelse',
'UI-ProblemManagementOverview-ProblemByPriority' => 'Problemer efter prioritet',
'UI-ProblemManagementOverview-ProblemByPriority+' => 'Problemer efter prioritet',
'UI-ProblemManagementOverview-ProblemUnassigned' => 'Ikke tildelte problemer',
'UI-ProblemManagementOverview-ProblemUnassigned+' => 'Ikke tildelte problemer',
'UI:ProblemMgmtMenuOverview:Title' => 'Dashboard for problem Management',
'UI:ProblemMgmtMenuOverview:Title+' => 'Dashboard for problem Management',
'Class:Problem/Attribute:service_name' => 'Navn',
'Class:Problem/Attribute:service_name+' => '',
'Class:Problem/Attribute:servicesubcategory_name' => 'Navn',
'Class:Problem/Attribute:servicesubcategory_name+' => '',
'Class:Problem/Attribute:related_change_ref' => 'Ref',
'Class:Problem/Attribute:related_change_ref+' => '',
));
?>

View File

@@ -228,7 +228,10 @@
<target>assigned</target>
<actions>
<action>
<verb>SetAssignedDate</verb>
<verb>SetCurrentDate</verb>
<params>
<param xsi:type="attcode">assignment_date</param>
</params>
</action>
</actions>
</transition>

View File

@@ -0,0 +1,244 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:UserRequest' => 'Brugerhenvendelse',
'Class:UserRequest+' => '',
'Class:UserRequest/Attribute:status' => 'Status',
'Class:UserRequest/Attribute:status+' => '',
'Class:UserRequest/Attribute:status/Value:new' => 'Ny',
'Class:UserRequest/Attribute:status/Value:new+' => '',
'Class:UserRequest/Attribute:status/Value:escalated_tto' => 'Eskaleret TTO',
'Class:UserRequest/Attribute:status/Value:escalated_tto+' => '',
'Class:UserRequest/Attribute:status/Value:assigned' => 'Tildelt',
'Class:UserRequest/Attribute:status/Value:assigned+' => '',
'Class:UserRequest/Attribute:status/Value:escalated_ttr' => 'Eskaleret TTR',
'Class:UserRequest/Attribute:status/Value:escalated_ttr+' => '',
'Class:UserRequest/Attribute:status/Value:waiting_for_approval' => 'Afventer godkendelse',
'Class:UserRequest/Attribute:status/Value:waiting_for_approval+' => '',
'Class:UserRequest/Attribute:status/Value:approved' => 'Godkendt',
'Class:UserRequest/Attribute:status/Value:approved+' => '',
'Class:UserRequest/Attribute:status/Value:rejected' => 'Afslået',
'Class:UserRequest/Attribute:status/Value:rejected+' => '',
'Class:UserRequest/Attribute:status/Value:pending' => 'Nedetid',
'Class:UserRequest/Attribute:status/Value:pending+' => '',
'Class:UserRequest/Attribute:status/Value:resolved' => 'Løst',
'Class:UserRequest/Attribute:status/Value:resolved+' => '',
'Class:UserRequest/Attribute:status/Value:closed' => 'Lukket',
'Class:UserRequest/Attribute:status/Value:closed+' => '',
'Class:UserRequest/Attribute:request_type' => 'Brugerhenvendelse type',
'Class:UserRequest/Attribute:request_type+' => '',
'Class:UserRequest/Attribute:request_type/Value:service_request' => 'Service anmodning',
'Class:UserRequest/Attribute:request_type/Value:service_request+' => '',
'Class:UserRequest/Attribute:impact' => 'Påvirkning',
'Class:UserRequest/Attribute:impact+' => '',
'Class:UserRequest/Attribute:impact/Value:1' => 'Afdeling',
'Class:UserRequest/Attribute:impact/Value:1+' => 'En afdeling er påvirket',
'Class:UserRequest/Attribute:impact/Value:2' => 'Service',
'Class:UserRequest/Attribute:impact/Value:2+' => 'En service er påvirket',
'Class:UserRequest/Attribute:impact/Value:3' => 'Person',
'Class:UserRequest/Attribute:impact/Value:3+' => 'En person er påvirket',
'Class:UserRequest/Attribute:priority' => 'Prioritet',
'Class:UserRequest/Attribute:priority+' => '',
'Class:UserRequest/Attribute:priority/Value:1' => 'Kritisk',
'Class:UserRequest/Attribute:priority/Value:1+' => '',
'Class:UserRequest/Attribute:priority/Value:2' => 'Høj',
'Class:UserRequest/Attribute:priority/Value:2+' => '',
'Class:UserRequest/Attribute:priority/Value:3' => 'Middel',
'Class:UserRequest/Attribute:priority/Value:3+' => '',
'Class:UserRequest/Attribute:priority/Value:4' => 'Lav',
'Class:UserRequest/Attribute:priority/Value:4+' => '',
'Class:UserRequest/Attribute:urgency' => 'Vigtighed',
'Class:UserRequest/Attribute:urgency+' => '',
'Class:UserRequest/Attribute:urgency/Value:1' => 'Kritisk',
'Class:UserRequest/Attribute:urgency/Value:1+' => '',
'Class:UserRequest/Attribute:urgency/Value:2' => 'Høj',
'Class:UserRequest/Attribute:urgency/Value:2+' => '',
'Class:UserRequest/Attribute:urgency/Value:3' => 'Middel',
'Class:UserRequest/Attribute:urgency/Value:3+' => '',
'Class:UserRequest/Attribute:urgency/Value:4' => 'Lav',
'Class:UserRequest/Attribute:urgency/Value:4+' => '',
'Class:UserRequest/Attribute:origin' => 'Oprindelse',
'Class:UserRequest/Attribute:origin+' => '',
'Class:UserRequest/Attribute:origin/Value:mail' => 'Mail',
'Class:UserRequest/Attribute:origin/Value:mail+' => '',
'Class:UserRequest/Attribute:origin/Value:phone' => 'Telefon',
'Class:UserRequest/Attribute:origin/Value:phone+' => '',
'Class:UserRequest/Attribute:origin/Value:portal' => 'Portal',
'Class:UserRequest/Attribute:origin/Value:portal+' => '',
'Class:UserRequest/Attribute:approver_id' => 'Godkender',
'Class:UserRequest/Attribute:approver_id+' => '',
'Class:UserRequest/Attribute:service_id' => 'Ydelse',
'Class:UserRequest/Attribute:service_id+' => '',
'Class:UserRequest/Attribute:servicesubcategory_id' => 'Ydelse underkategori',
'Class:UserRequest/Attribute:servicesubcategory_id+' => '',
'Class:UserRequest/Attribute:escalation_flag' => 'Eskalations Flag',
'Class:UserRequest/Attribute:escalation_flag+' => '',
'Class:UserRequest/Attribute:escalation_flag/Value:no' => 'Nej',
'Class:UserRequest/Attribute:escalation_flag/Value:no+' => '',
'Class:UserRequest/Attribute:escalation_flag/Value:yes' => 'Ja',
'Class:UserRequest/Attribute:escalation_flag/Value:yes+' => '',
'Class:UserRequest/Attribute:escalation_reason' => 'Eskalationsgrund',
'Class:UserRequest/Attribute:escalation_reason+' => '',
'Class:UserRequest/Attribute:assignment_date' => 'Tildelings dato',
'Class:UserRequest/Attribute:assignment_date+' => '',
'Class:UserRequest/Attribute:resolution_date' => 'Løst dato',
'Class:UserRequest/Attribute:resolution_date+' => '',
'Class:UserRequest/Attribute:last_pending_date' => 'Sidste udsættelsesdato',
'Class:UserRequest/Attribute:last_pending_date+' => '',
'Class:UserRequest/Attribute:cumulatedpending' => 'Akkumuleret nedetid',
'Class:UserRequest/Attribute:cumulatedpending+' => '',
'Class:UserRequest/Attribute:tto' => 'TTO (Time To Own)',
'Class:UserRequest/Attribute:tto+' => '',
'Class:UserRequest/Attribute:ttr' => 'TTR (Time To Resolve)',
'Class:UserRequest/Attribute:ttr+' => '',
'Class:UserRequest/Attribute:tto_escalation_deadline' => 'TTO Deadline',
'Class:UserRequest/Attribute:tto_escalation_deadline+' => '',
'Class:UserRequest/Attribute:sla_tto_passed' => 'SLA TTO overskredet',
'Class:UserRequest/Attribute:sla_tto_passed+' => '',
'Class:UserRequest/Attribute:sla_tto_over' => 'Overskridelse SLA TTO',
'Class:UserRequest/Attribute:sla_tto_over+' => '',
'Class:UserRequest/Attribute:ttr_escalation_deadline' => 'TTR Deadline',
'Class:UserRequest/Attribute:ttr_escalation_deadline+' => '',
'Class:UserRequest/Attribute:sla_ttr_passed' => 'SLA TTR overskredet',
'Class:UserRequest/Attribute:sla_ttr_passed+' => '',
'Class:UserRequest/Attribute:sla_ttr_over' => 'Overskridelse SLA TTR',
'Class:UserRequest/Attribute:sla_ttr_over+' => '',
'Class:UserRequest/Attribute:time_spent' => 'Tid forbrugt til løsning',
'Class:UserRequest/Attribute:time_spent+' => '',
'Class:UserRequest/Attribute:resolution_code' => 'Løsningskode',
'Class:UserRequest/Attribute:resolution_code+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:assistance' => 'Assistance',
'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 reparation',
'Class:UserRequest/Attribute:resolution_code/Value:hardware repair+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:other' => 'Andet',
'Class:UserRequest/Attribute:resolution_code/Value:other+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:software patch' => 'Software Patch',
'Class:UserRequest/Attribute:resolution_code/Value:software patch+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:system update' => 'System Update',
'Class:UserRequest/Attribute:resolution_code/Value:system update+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:training' => 'Uddannelse',
'Class:UserRequest/Attribute:resolution_code/Value:training+' => '',
'Class:UserRequest/Attribute:solution' => 'Løsning',
'Class:UserRequest/Attribute:solution+' => '',
'Class:UserRequest/Attribute:pending_reason' => 'Årsag til afventer',
'Class:UserRequest/Attribute:pending_reason+' => '',
'Class:UserRequest/Attribute:parent_request_id' => 'Parent Anmodning',
'Class:UserRequest/Attribute:parent_request_id+' => '',
'Class:UserRequest/Attribute:parent_problem_id' => 'Parent Problem',
'Class:UserRequest/Attribute:parent_problem_id+' => '',
'Class:UserRequest/Attribute:parent_change_id' => 'Parent Change',
'Class:UserRequest/Attribute:parent_change_id+' => '',
'Class:UserRequest/Attribute:related_request_list' => 'Afledte Anmodninger',
'Class:UserRequest/Attribute:related_request_list+' => '',
'Class:UserRequest/Attribute:public_log' => 'Offentlig Log',
'Class:UserRequest/Attribute:public_log+' => '',
'Class:UserRequest/Attribute:user_satisfaction' => 'Brugertilfredshed',
'Class:UserRequest/Attribute:user_satisfaction+' => '',
'Class:UserRequest/Attribute:user_satisfaction/Value:1' => 'Meget tilfreds',
'Class:UserRequest/Attribute:user_satisfaction/Value:1+' => '',
'Class:UserRequest/Attribute:user_satisfaction/Value:2' => 'Tilfreds',
'Class:UserRequest/Attribute:user_satisfaction/Value:2+' => '',
'Class:UserRequest/Attribute:user_satisfaction/Value:3' => 'Nogenlunde tilfreds',
'Class:UserRequest/Attribute:user_satisfaction/Value:3+' => '',
'Class:UserRequest/Attribute:user_satisfaction/Value:4' => 'Meget utilfreds',
'Class:UserRequest/Attribute:user_satisfaction/Value:4+' => '',
'Class:UserRequest/Attribute:user_comment' => 'Bruger kommentar',
'Class:UserRequest/Attribute:user_comment+' => '',
'Class:UserRequest/Stimulus:ev_assign' => 'Tildelt',
'Class:UserRequest/Stimulus:ev_assign+' => '',
'Class:UserRequest/Stimulus:ev_reassign' => 'Forny tildeling',
'Class:UserRequest/Stimulus:ev_reassign+' => '',
'Class:UserRequest/Stimulus:ev_approve' => 'Godkend',
'Class:UserRequest/Stimulus:ev_approve+' => '',
'Class:UserRequest/Stimulus:ev_reject' => 'Afslå',
'Class:UserRequest/Stimulus:ev_reject+' => '',
'Class:UserRequest/Stimulus:ev_pending' => 'Afventer',
'Class:UserRequest/Stimulus:ev_pending+' => '',
'Class:UserRequest/Stimulus:ev_timeout' => 'Timeout',
'Class:UserRequest/Stimulus:ev_timeout+' => '',
'Class:UserRequest/Stimulus:ev_autoresolve' => 'Automatisk løst',
'Class:UserRequest/Stimulus:ev_autoresolve+' => '',
'Class:UserRequest/Stimulus:ev_autoclose' => 'Automatisk lukket',
'Class:UserRequest/Stimulus:ev_autoclose+' => '',
'Class:UserRequest/Stimulus:ev_resolve' => 'Marker som løst',
'Class:UserRequest/Stimulus:ev_resolve+' => '',
'Class:UserRequest/Stimulus:ev_close' => 'Luk denne Anmodning',
'Class:UserRequest/Stimulus:ev_close+' => '',
'Class:UserRequest/Stimulus:ev_reopen' => 'Genåben',
'Class:UserRequest/Stimulus:ev_reopen+' => '',
'Class:UserRequest/Stimulus:ev_wait_for_approval' => 'Afventer godkendelse',
'Class:UserRequest/Stimulus:ev_wait_for_approval+' => '',
'Menu:RequestManagement' => 'Helpdesk',
'Menu:RequestManagement+' => '',
'Menu:RequestManagementProvider' => 'Helpdesk Leverandør',
'Menu:RequestManagementProvider+' => '',
'Menu:UserRequest:Provider' => 'Åbne brugerhenvendelser ved leverandør',
'Menu:UserRequest:Provider+' => '',
'Menu:UserRequest:Overview' => 'Oversigt',
'Menu:UserRequest:Overview+' => '',
'Menu:NewUserRequest' => 'Ny Bruger henvendelse',
'Menu:NewUserRequest+' => '',
'Menu:SearchUserRequests' => 'Søg efter brugerhenvendelser',
'Menu:SearchUserRequests+' => '',
'Menu:UserRequest:Shortcuts' => 'Genveje',
'Menu:UserRequest:Shortcuts+' => '',
'Menu:UserRequest:MyRequests' => 'Mine henvendelser',
'Menu:UserRequest:MyRequests+' => '',
'Menu:UserRequest:MySupportRequests' => 'Mine Support henvendelser',
'Menu:UserRequest:MySupportRequests+' => '',
'Menu:UserRequest:EscalatedRequests' => 'Eskalerede Brugerhenvendelser',
'Menu:UserRequest:EscalatedRequests+' => '',
'Menu:UserRequest:OpenRequests' => 'Alle åbne brugerhenvendelser',
'Menu:UserRequest:OpenRequests+' => '',
'UI:WelcomeMenu:MyAssignedCalls' => 'Mine tildelte henvendelser',
'UI-RequestManagementOverview-RequestByType-last-14-days' => 'Brugerhenvendelser de sidste 14 dage efter type',
'UI-RequestManagementOverview-Last-14-days' => 'Antal Brugerhenvendelser de sidste 14 dage',
'UI-RequestManagementOverview-OpenRequestByStatus' => 'Åbne brugerhenvendelser efter status',
'UI-RequestManagementOverview-OpenRequestByAgent' => 'Åbne brugerhenvendelser efter tildelt til',
'UI-RequestManagementOverview-OpenRequestByType' => 'Åbne brugerhenvendelser efter type',
'UI-RequestManagementOverview-OpenRequestByCustomer' => 'Åbne brugerhenvendelser efter bruger',
'Class:UserRequest:KnownErrorList' => 'Known Errors',
'Class:UserRequest/Attribute:origin/Value:monitoring' => 'Monitoring',
'Class:UserRequest/Attribute:origin/Value:monitoring+' => '',
'Class:UserRequest/Attribute:approver_email' => 'Godkender Email',
'Class:UserRequest/Attribute:approver_email+' => '',
'Class:UserRequest/Attribute:service_name' => 'Ydelses navn',
'Class:UserRequest/Attribute:service_name+' => '',
'Class:UserRequest/Attribute:servicesubcategory_name' => 'Ydelse underkategori navn',
'Class:UserRequest/Attribute:servicesubcategory_name+' => '',
'Class:UserRequest/Attribute:parent_request_ref' => 'Parent Brugerhenvendelse Reference',
'Class:UserRequest/Attribute:parent_request_ref+' => '',
'Class:UserRequest/Attribute:parent_problem_ref' => 'Parent Incident Reference',
'Class:UserRequest/Attribute:parent_problem_ref+' => '',
'Class:UserRequest/Attribute:parent_change_ref' => 'Parent Change Reference',
'Class:UserRequest/Attribute:parent_change_ref+' => '',
'Class:UserRequest/Attribute:parent_request_id_friendlyname' => 'Parent Brugerhenvendelse Id Friendly Name',
'Class:UserRequest/Attribute:parent_request_id_friendlyname+' => '',
));
?>

View File

@@ -0,0 +1,272 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:UserRequest' => 'Brugerhenvendelse',
'Class:UserRequest+' => '',
'Class:UserRequest/Attribute:status' => 'Status',
'Class:UserRequest/Attribute:status+' => '',
'Class:UserRequest/Attribute:status/Value:new' => 'Ny',
'Class:UserRequest/Attribute:status/Value:new+' => '',
'Class:UserRequest/Attribute:status/Value:escalated_tto' => 'Eskaleret TTO',
'Class:UserRequest/Attribute:status/Value:escalated_tto+' => '',
'Class:UserRequest/Attribute:status/Value:assigned' => 'Tildelt',
'Class:UserRequest/Attribute:status/Value:assigned+' => '',
'Class:UserRequest/Attribute:status/Value:escalated_ttr' => 'Eskaleret TTR',
'Class:UserRequest/Attribute:status/Value:escalated_ttr+' => '',
'Class:UserRequest/Attribute:status/Value:waiting_for_approval' => 'Afventer godkendelse',
'Class:UserRequest/Attribute:status/Value:waiting_for_approval+' => '',
'Class:UserRequest/Attribute:status/Value:approved' => 'Godkendt',
'Class:UserRequest/Attribute:status/Value:approved+' => '',
'Class:UserRequest/Attribute:status/Value:rejected' => 'Afslået',
'Class:UserRequest/Attribute:status/Value:rejected+' => '',
'Class:UserRequest/Attribute:status/Value:pending' => 'Nedetid',
'Class:UserRequest/Attribute:status/Value:pending+' => '',
'Class:UserRequest/Attribute:status/Value:resolved' => 'Løst',
'Class:UserRequest/Attribute:status/Value:resolved+' => '',
'Class:UserRequest/Attribute:status/Value:closed' => 'Lukket',
'Class:UserRequest/Attribute:status/Value:closed+' => '',
'Class:UserRequest/Attribute:request_type' => 'Request-Type',
'Class:UserRequest/Attribute:request_type+' => '',
'Class:UserRequest/Attribute:request_type/Value:incident' => 'Incident',
'Class:UserRequest/Attribute:request_type/Value:incident+' => '',
'Class:UserRequest/Attribute:request_type/Value:service_request' => 'Service Anmodning',
'Class:UserRequest/Attribute:request_type/Value:service_request+' => '',
'Class:UserRequest/Attribute:impact' => 'Påvirkning',
'Class:UserRequest/Attribute:impact+' => '',
'Class:UserRequest/Attribute:impact/Value:1' => 'Afdeling',
'Class:UserRequest/Attribute:impact/Value:1+' => 'En afdeling er påvirket',
'Class:UserRequest/Attribute:impact/Value:2' => 'Service',
'Class:UserRequest/Attribute:impact/Value:2+' => 'En service er påvirket',
'Class:UserRequest/Attribute:impact/Value:3' => 'Person',
'Class:UserRequest/Attribute:impact/Value:3+' => 'En person er påvirket',
'Class:UserRequest/Attribute:priority' => 'Prioritet',
'Class:UserRequest/Attribute:priority+' => '',
'Class:UserRequest/Attribute:priority/Value:1' => 'Kritisk',
'Class:UserRequest/Attribute:priority/Value:1+' => '',
'Class:UserRequest/Attribute:priority/Value:2' => 'Høj',
'Class:UserRequest/Attribute:priority/Value:2+' => '',
'Class:UserRequest/Attribute:priority/Value:3' => 'Middel',
'Class:UserRequest/Attribute:priority/Value:3+' => '',
'Class:UserRequest/Attribute:priority/Value:4' => 'Lav',
'Class:UserRequest/Attribute:priority/Value:4+' => '',
'Class:UserRequest/Attribute:urgency' => 'Vigtighed',
'Class:UserRequest/Attribute:urgency+' => '',
'Class:UserRequest/Attribute:urgency/Value:1' => 'Kritisk',
'Class:UserRequest/Attribute:urgency/Value:1+' => '',
'Class:UserRequest/Attribute:urgency/Value:2' => 'Høj',
'Class:UserRequest/Attribute:urgency/Value:2+' => '',
'Class:UserRequest/Attribute:urgency/Value:3' => 'Middel',
'Class:UserRequest/Attribute:urgency/Value:3+' => '',
'Class:UserRequest/Attribute:urgency/Value:4' => 'Lav',
'Class:UserRequest/Attribute:urgency/Value:4+' => '',
'Class:UserRequest/Attribute:origin' => 'Oprindelse',
'Class:UserRequest/Attribute:origin+' => '',
'Class:UserRequest/Attribute:origin/Value:mail' => 'Mail',
'Class:UserRequest/Attribute:origin/Value:mail+' => '',
'Class:UserRequest/Attribute:origin/Value:monitoring' => 'Monitoring',
'Class:UserRequest/Attribute:origin/Value:monitoring+' => '',
'Class:UserRequest/Attribute:origin/Value:phone' => 'Telefon',
'Class:UserRequest/Attribute:origin/Value:phone+' => '',
'Class:UserRequest/Attribute:origin/Value:portal' => 'Portal',
'Class:UserRequest/Attribute:origin/Value:portal+' => '',
'Class:UserRequest/Attribute:approver_id' => 'Godkender',
'Class:UserRequest/Attribute:approver_id+' => '',
'Class:UserRequest/Attribute:service_id' => 'Service',
'Class:UserRequest/Attribute:service_id+' => '',
'Class:UserRequest/Attribute:servicesubcategory_id' => 'Service Underkategori',
'Class:UserRequest/Attribute:servicesubcategory_id+' => '',
'Class:UserRequest/Attribute:escalation_flag' => 'Eskalations Flag',
'Class:UserRequest/Attribute:escalation_flag+' => '',
'Class:UserRequest/Attribute:escalation_flag/Value:no' => 'Nej',
'Class:UserRequest/Attribute:escalation_flag/Value:no+' => '',
'Class:UserRequest/Attribute:escalation_flag/Value:yes' => 'Ja',
'Class:UserRequest/Attribute:escalation_flag/Value:yes+' => '',
'Class:UserRequest/Attribute:escalation_reason' => 'Eskalationsgrund',
'Class:UserRequest/Attribute:escalation_reason+' => '',
'Class:UserRequest/Attribute:assignment_date' => 'Tildelt dato',
'Class:UserRequest/Attribute:assignment_date+' => '',
'Class:UserRequest/Attribute:resolution_date' => 'Løsningsdato',
'Class:UserRequest/Attribute:resolution_date+' => '',
'Class:UserRequest/Attribute:last_pending_date' => 'Sidste udsættelses dato',
'Class:UserRequest/Attribute:last_pending_date+' => '',
'Class:UserRequest/Attribute:cumulatedpending' => 'Akkumuleret nedetid',
'Class:UserRequest/Attribute:cumulatedpending+' => '',
'Class:UserRequest/Attribute:tto' => 'TTO (Time To Own)',
'Class:UserRequest/Attribute:tto+' => '',
'Class:UserRequest/Attribute:ttr' => 'TTR (Time To Resolve)',
'Class:UserRequest/Attribute:ttr+' => '',
'Class:UserRequest/Attribute:tto_escalation_deadline' => 'TTO Deadline',
'Class:UserRequest/Attribute:tto_escalation_deadline+' => '',
'Class:UserRequest/Attribute:sla_tto_passed' => 'SLA TTO passeret',
'Class:UserRequest/Attribute:sla_tto_passed+' => '',
'Class:UserRequest/Attribute:sla_tto_over' => 'SLA TTO overskredet',
'Class:UserRequest/Attribute:sla_tto_over+' => '',
'Class:UserRequest/Attribute:ttr_escalation_deadline' => 'TTR Deadline',
'Class:UserRequest/Attribute:ttr_escalation_deadline+' => '',
'Class:UserRequest/Attribute:sla_ttr_passed' => 'SLA TTR passeret',
'Class:UserRequest/Attribute:sla_ttr_passed+' => '',
'Class:UserRequest/Attribute:sla_ttr_over' => 'SLA TTR overskredet',
'Class:UserRequest/Attribute:sla_ttr_over+' => '',
'Class:UserRequest/Attribute:time_spent' => 'Løsningstid forbrugt',
'Class:UserRequest/Attribute:time_spent+' => '',
'Class:UserRequest/Attribute:resolution_code' => 'Løsnings Kode',
'Class:UserRequest/Attribute:resolution_code+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:assistance' => 'Assistance',
'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 Reparation',
'Class:UserRequest/Attribute:resolution_code/Value:hardware repair+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:other' => 'Andet',
'Class:UserRequest/Attribute:resolution_code/Value:other+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:software patch' => 'Software Patch',
'Class:UserRequest/Attribute:resolution_code/Value:software patch+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:system update' => 'System Update',
'Class:UserRequest/Attribute:resolution_code/Value:system update+' => '',
'Class:UserRequest/Attribute:resolution_code/Value:training' => 'Uddannelse',
'Class:UserRequest/Attribute:resolution_code/Value:training+' => '',
'Class:UserRequest/Attribute:solution' => 'Løsning',
'Class:UserRequest/Attribute:solution+' => '',
'Class:UserRequest/Attribute:pending_reason' => 'Udsættelsesgrund',
'Class:UserRequest/Attribute:pending_reason+' => '',
'Class:UserRequest/Attribute:parent_request_id' => 'Parent Anmodning',
'Class:UserRequest/Attribute:parent_request_id+' => '',
'Class:UserRequest/Attribute:parent_change_id' => 'Parent-Change',
'Class:UserRequest/Attribute:parent_change_id+' => '',
'Class:UserRequest/Attribute:related_request_list' => 'Afledte Anmodninger',
'Class:UserRequest/Attribute:related_request_list+' => '',
'Class:UserRequest/Attribute:public_log' => 'Offentlig Log',
'Class:UserRequest/Attribute:public_log+' => '',
'Class:UserRequest/Attribute:user_satisfaction' => 'Brugertilfredshed',
'Class:UserRequest/Attribute:user_satisfaction+' => '',
'Class:UserRequest/Attribute:user_satisfaction/Value:1' => 'Meget tilfreds',
'Class:UserRequest/Attribute:user_satisfaction/Value:1+' => '',
'Class:UserRequest/Attribute:user_satisfaction/Value:2' => 'Tilfreds',
'Class:UserRequest/Attribute:user_satisfaction/Value:2+' => '',
'Class:UserRequest/Attribute:user_satisfaction/Value:3' => 'Nogenlunde tilfreds',
'Class:UserRequest/Attribute:user_satisfaction/Value:3+' => '',
'Class:UserRequest/Attribute:user_satisfaction/Value:4' => 'Meget utilfreds',
'Class:UserRequest/Attribute:user_satisfaction/Value:4+' => '',
'Class:UserRequest/Attribute:user_comment' => 'Brugerkommentar',
'Class:UserRequest/Attribute:user_comment+' => '',
'Class:UserRequest/Stimulus:ev_assign' => 'Tildelt',
'Class:UserRequest/Stimulus:ev_assign+' => '',
'Class:UserRequest/Stimulus:ev_reassign' => 'Forny tildeling',
'Class:UserRequest/Stimulus:ev_reassign+' => '',
'Class:UserRequest/Stimulus:ev_approve' => 'Godkent',
'Class:UserRequest/Stimulus:ev_approve+' => '',
'Class:UserRequest/Stimulus:ev_reject' => 'Afslå',
'Class:UserRequest/Stimulus:ev_reject+' => '',
'Class:UserRequest/Stimulus:ev_pending' => 'Afventer',
'Class:UserRequest/Stimulus:ev_pending+' => '',
'Class:UserRequest/Stimulus:ev_timeout' => 'Timeout',
'Class:UserRequest/Stimulus:ev_timeout+' => '',
'Class:UserRequest/Stimulus:ev_autoresolve' => 'Automatisk løst',
'Class:UserRequest/Stimulus:ev_autoresolve+' => '',
'Class:UserRequest/Stimulus:ev_autoclose' => 'Automatisk lukket',
'Class:UserRequest/Stimulus:ev_autoclose+' => '',
'Class:UserRequest/Stimulus:ev_resolve' => 'Marker som løst',
'Class:UserRequest/Stimulus:ev_resolve+' => '',
'Class:UserRequest/Stimulus:ev_close' => 'Luk denne Request',
'Class:UserRequest/Stimulus:ev_close+' => '',
'Class:UserRequest/Stimulus:ev_reopen' => 'Genåben',
'Class:UserRequest/Stimulus:ev_reopen+' => '',
'Class:UserRequest/Stimulus:ev_wait_for_approval' => 'Afventer godkendelse',
'Class:UserRequest/Stimulus:ev_wait_for_approval+' => '',
'Menu:RequestManagement' => 'Helpdesk',
'Menu:RequestManagement+' => '',
'Menu:RequestManagementProvider' => 'Helpdesk Leverandør',
'Menu:RequestManagementProvider+' => '',
'Menu:UserRequest:Provider' => 'Åbne brugerhenvendelser ved leverandør',
'Menu:UserRequest:Provider+' => '',
'Menu:UserRequest:Overview' => 'Oversigt',
'Menu:UserRequest:Overview+' => '',
'Menu:NewUserRequest' => 'Ny Bruger henvendelse',
'Menu:NewUserRequest+' => '',
'Menu:SearchUserRequests' => 'Søg efter brugerhenvendelser',
'Menu:SearchUserRequests+' => '',
'Menu:UserRequest:Shortcuts' => 'Genveje',
'Menu:UserRequest:Shortcuts+' => '',
'Menu:UserRequest:MyRequests' => 'Mine henvendelser',
'Menu:UserRequest:MyRequests+' => '',
'Menu:UserRequest:MySupportRequests' => 'Mine Support-henvendelser',
'Menu:UserRequest:MySupportRequests+' => '',
'Menu:UserRequest:EscalatedRequests' => 'Eskalerede Brugerhenvendelser',
'Menu:UserRequest:EscalatedRequests+' => '',
'Menu:UserRequest:OpenRequests' => 'Alle åbne brugerhenvendelser',
'Menu:UserRequest:OpenRequests+' => '',
'UI:WelcomeMenu:MyAssignedCalls' => 'Mine tildelte henvendelser',
'UI-RequestManagementOverview-RequestByType-last-14-days' => 'Brugerhenvendelser de sidste 14 dage efter type',
'UI-RequestManagementOverview-Last-14-days' => 'Antal Brugerhenvendelser de sidste 14 dage',
'UI-RequestManagementOverview-OpenRequestByStatus' => 'Åbne brugerhenvendelser efter status',
'UI-RequestManagementOverview-OpenRequestByAgent' => 'Åbne brugerhenvendelser efter tildelt til',
'UI-RequestManagementOverview-OpenRequestByType' => 'Åbne brugerhenvendelser efter type',
'UI-RequestManagementOverview-OpenRequestByCustomer' => 'Åbne brugerhenvendelser efter bruger',
'Class:UserRequest:KnownErrorList' => 'KEndte fejl (Known Errors)',
'Menu:UserRequest:MyWorkOrders' => 'Mine tildelte arbejdsordre',
'Menu:UserRequest:MyWorkOrders+' => '',
'Class:Problem:KnownProblemList' => 'Kendte problemer',
'Class:UserRequest/Attribute:approver_email' => 'Godkender Email',
'Class:UserRequest/Attribute:approver_email+' => '',
'Class:UserRequest/Attribute:service_name' => 'Service Name',
'Class:UserRequest/Attribute:service_name+' => '',
'Class:UserRequest/Attribute:servicesubcategory_name' => 'Service Underkategori navn',
'Class:UserRequest/Attribute:servicesubcategory_name+' => '',
'Class:UserRequest/Attribute:parent_request_ref' => 'Reference Brugerhenvendelse',
'Class:UserRequest/Attribute:parent_request_ref+' => '',
'Class:UserRequest/Attribute:parent_problem_id' => 'Parent-Problem',
'Class:UserRequest/Attribute:parent_problem_id+' => '',
'Class:UserRequest/Attribute:parent_problem_ref' => 'Reference Problem',
'Class:UserRequest/Attribute:parent_problem_ref+' => '',
'Class:UserRequest/Attribute:parent_change_ref' => 'Reference Change',
'Class:UserRequest/Attribute:parent_change_ref+' => '',
'Class:UserRequest/Attribute:parent_request_id_friendlyname' => 'Parent Request ID Friendly Name',
'Class:UserRequest/Attribute:parent_request_id_friendlyname+' => '',
'Portal:TitleDetailsFor_Request' => 'Dealjer for Brugerhenvendelser',
'Portal:ButtonUpdate' => 'Opdater',
'Portal:ButtonClose' => 'Luk',
'Portal:ButtonReopen' => 'Genåben',
'Portal:ShowServices' => 'Service-Katalog',
'Portal:SelectRequestType' => 'Vælg henvendelses type',
'Portal:SelectServiceElementFrom_Service' => 'Vælg et Service-Element for %1$s',
'Portal:SelectRequestTemplate' => 'Vælg en skabelon for %1$s',
'Portal:ListServices' => 'Liste over ydelser',
'Portal:TitleDetailsFor_Service' => 'Detaljer for ydelser',
'Portal:Button:CreateRequestFromService' => 'Opret henvendelse fra Service',
'Portal:ListOpenRequests' => 'List åbne brugerhenvendelser',
'Portal:UserRequest:MoreInfo' => 'Yderligere informationer',
'Portal:Details-Service-Element' => 'Service Elementer',
'Portal:NoClosedTicket' => 'Ingen lukkede brugerhenvendelser',
'Portal:NoService' => 'Ingen ydelse',
'Portal:ListOpenProblems' => 'Åbne problemer',
'Portal:ShowProblem' => 'Problemer',
'Portal:ShowFaqs' => 'FAQs',
'Portal:NoOpenProblem' => 'Ingen åbne problemer',
'Portal:SelectLanguage' => 'Skift sprogindstilling',
'Portal:LanguageChangedTo_Lang' => 'Sprogindstilling ændres til: ',
'Portal:ChooseYourFavoriteLanguage' => 'Vælg dit foretrukne sprog',
));
?>

View File

@@ -0,0 +1,347 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:ContractType' => 'Kontrakt-Type',
'Class:ContractType+' => '',
'Class:CustomerContract' => 'Kundekontrakt',
'Class:CustomerContract+' => '',
'Class:CustomerContract/Attribute:services_list' => 'Ydelser',
'Class:CustomerContract/Attribute:services_list+' => '',
'Class:CustomerContract/Attribute:functionalcis_list' => 'CIs',
'Class:CustomerContract/Attribute:functionalcis_list+' => '',
'Class:CustomerContract/Attribute:providercontracts_list' => 'Leverandørkontrakter',
'Class:CustomerContract/Attribute:providercontracts_list+' => '',
'Class:ProviderContract' => 'Leverandørkontrakt',
'Class:ProviderContract+' => '',
'Class:ProviderContract/Attribute:functionalcis_list' => 'CIs',
'Class:ProviderContract/Attribute:functionalcis_list+' => '',
'Class:ProviderContract/Attribute:sla' => 'SLA',
'Class:ProviderContract/Attribute:sla+' => '',
'Class:ProviderContract/Attribute:coverage' => 'Servicetider',
'Class:ProviderContract/Attribute:coverage+' => '',
'Class:lnkContactToContract' => 'Sammenhæng Kontakt/Kontrakt',
'Class:lnkContactToContract+' => '',
'Class:lnkContactToContract/Attribute:contract_id' => 'Kontrakt',
'Class:lnkContactToContract/Attribute:contract_id+' => '',
'Class:lnkContactToContract/Attribute:contact_id' => 'Kontakt',
'Class:lnkContactToContract/Attribute:contact_id+' => '',
'Class:lnkContractToDocument' => 'Sammenhæng Kontrakt/Dokument',
'Class:lnkContractToDocument+' => '',
'Class:lnkContractToDocument/Attribute:contract_id' => 'Kontrakt',
'Class:lnkContractToDocument/Attribute:contract_id+' => '',
'Class:lnkContractToDocument/Attribute:document_id' => 'Dokument',
'Class:lnkContractToDocument/Attribute:document_id+' => '',
'Class:lnkFunctionalCIToProviderContract' => 'Sammenhæng FunctionalCI/Leverandørkontrakt',
'Class:lnkFunctionalCIToProviderContract+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => 'Leverandørkontrakt',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id' => 'CI',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id+' => '',
'Class:ServiceFamily' => 'Ydelsesfamilie',
'Class:ServiceFamily+' => '',
'Class:ServiceFamily/Attribute:name' => 'Navn',
'Class:ServiceFamily/Attribute:name+' => '',
'Class:ServiceFamily/Attribute:services_list' => 'Ydelser',
'Class:ServiceFamily/Attribute:services_list+' => '',
'Class:Service' => 'Ydelse',
'Class:Service+' => '',
'Class:Service/Attribute:name' => 'Navn',
'Class:Service/Attribute:name+' => '',
'Class:Service/Attribute:org_id' => 'Organisation',
'Class:Service/Attribute:org_id+' => '',
'Class:Service/Attribute:description' => 'Beskrivelse',
'Class:Service/Attribute:description+' => '',
'Class:Service/Attribute:documents_list' => 'Dokument',
'Class:Service/Attribute:documents_list+' => '',
'Class:Service/Attribute:contacts_list' => 'Kontakt',
'Class:Service/Attribute:contacts_list+' => '',
'Class:Service/Attribute:status' => 'Status',
'Class:Service/Attribute:status+' => '',
'Class:Service/Attribute:status/Value:implementation' => 'Implementering',
'Class:Service/Attribute:status/Value:implementation+' => '',
'Class:Service/Attribute:status/Value:obsolete' => 'Forældet',
'Class:Service/Attribute:status/Value:obsolete+' => '',
'Class:Service/Attribute:status/Value:production' => 'Produktion',
'Class:Service/Attribute:status/Value:production+' => '',
'Class:Service/Attribute:customercontracts_list' => 'Kundekontrakt',
'Class:Service/Attribute:customercontracts_list+' => '',
'Class:Service/Attribute:servicesubcategories_list' => 'Ydelses underkategorier',
'Class:Service/Attribute:servicesubcategories_list+' => '',
'Class:lnkDocumentToService' => 'Sammenhæng Dokument/Ydelse',
'Class:lnkDocumentToService+' => '',
'Class:lnkDocumentToService/Attribute:service_id' => 'Ydelse',
'Class:lnkDocumentToService/Attribute:service_id+' => '',
'Class:lnkDocumentToService/Attribute:document_id' => 'Dokument',
'Class:lnkDocumentToService/Attribute:document_id+' => '',
'Class:lnkContactToService' => 'Sammenhæng Kontakt/Ydelse',
'Class:lnkContactToService+' => '',
'Class:lnkContactToService/Attribute:service_id' => 'Ydelse',
'Class:lnkContactToService/Attribute:service_id+' => '',
'Class:lnkContactToService/Attribute:contact_id' => 'Kontakt',
'Class:lnkContactToService/Attribute:contact_id+' => '',
'Class:ServiceSubcategory' => 'Ydelses underkategori',
'Class:ServiceSubcategory+' => '',
'Class:ServiceSubcategory/Attribute:name' => 'Navn',
'Class:ServiceSubcategory/Attribute:name+' => '',
'Class:ServiceSubcategory/Attribute:description' => 'Beskrivelse',
'Class:ServiceSubcategory/Attribute:description+' => '',
'Class:ServiceSubcategory/Attribute:service_id' => 'Ydelse',
'Class:ServiceSubcategory/Attribute:service_id+' => '',
'Class:ServiceSubcategory/Attribute:request_type' => 'Anmodnings type',
'Class:ServiceSubcategory/Attribute:request_type+' => '',
'Class:ServiceSubcategory/Attribute:request_type/Value:incident' => 'Incident',
'Class:ServiceSubcategory/Attribute:request_type/Value:incident+' => '',
'Class:ServiceSubcategory/Attribute:request_type/Value:service_request' => 'Service Anmodning',
'Class:ServiceSubcategory/Attribute:request_type/Value:service_request+' => '',
'Class:ServiceSubcategory/Attribute:status' => 'Status',
'Class:ServiceSubcategory/Attribute:status+' => '',
'Class:ServiceSubcategory/Attribute:status/Value:implementation' => 'Implementering',
'Class:ServiceSubcategory/Attribute:status/Value:implementation+' => '',
'Class:ServiceSubcategory/Attribute:status/Value:obsolete' => 'Forældet',
'Class:ServiceSubcategory/Attribute:status/Value:obsolete+' => '',
'Class:ServiceSubcategory/Attribute:status/Value:production' => 'Produktion',
'Class:ServiceSubcategory/Attribute:status/Value:production+' => '',
'Class:SLA' => 'SLA',
'Class:SLA+' => '',
'Class:SLA/Attribute:name' => 'Navn',
'Class:SLA/Attribute:name+' => '',
'Class:SLA/Attribute:description' => 'Beskrivelse',
'Class:SLA/Attribute:description+' => '',
'Class:SLA/Attribute:org_id' => 'Organisation',
'Class:SLA/Attribute:org_id+' => '',
'Class:SLA/Attribute:slts_list' => 'SLTs',
'Class:SLA/Attribute:slts_list+' => '',
'Class:SLA/Attribute:customercontracts_list' => 'Kundekontrakt',
'Class:SLA/Attribute:customercontracts_list+' => '',
'Class:SLT' => 'SLT',
'Class:SLT+' => '',
'Class:SLT/Attribute:name' => 'Navn',
'Class:SLT/Attribute:name+' => '',
'Class:SLT/Attribute:priority' => 'Prioritet',
'Class:SLT/Attribute:priority+' => '',
'Class:SLT/Attribute:priority/Value:1' => 'Kritisk',
'Class:SLT/Attribute:priority/Value:1+' => '',
'Class:SLT/Attribute:priority/Value:2' => 'Høj',
'Class:SLT/Attribute:priority/Value:2+' => '',
'Class:SLT/Attribute:priority/Value:3' => 'Middel',
'Class:SLT/Attribute:priority/Value:3+' => '',
'Class:SLT/Attribute:priority/Value:4' => 'Lav',
'Class:SLT/Attribute:priority/Value:4+' => '',
'Class:SLT/Attribute:request_type' => 'Anmodnings type',
'Class:SLT/Attribute:request_type+' => '',
'Class:SLT/Attribute:request_type/Value:incident' => 'Incident',
'Class:SLT/Attribute:request_type/Value:incident+' => '',
'Class:SLT/Attribute:request_type/Value:service_request' => 'Service Anmodning',
'Class:SLT/Attribute:request_type/Value:service_request+' => '',
'Class:SLT/Attribute:metric' => 'Metrisk',
'Class:SLT/Attribute:metric+' => '',
'Class:SLT/Attribute:metric/Value:tto' => 'TTO (Time To Own)',
'Class:SLT/Attribute:metric/Value:tto+' => '',
'Class:SLT/Attribute:metric/Value:ttr' => 'TTR (Time To Resolve)',
'Class:SLT/Attribute:metric/Value:ttr+' => '',
'Class:SLT/Attribute:value' => 'Værdi',
'Class:SLT/Attribute:value+' => '',
'Class:SLT/Attribute:unit' => 'Enhed',
'Class:SLT/Attribute:unit+' => '',
'Class:SLT/Attribute:unit/Value:hours' => 'Timer',
'Class:SLT/Attribute:unit/Value:hours+' => '',
'Class:SLT/Attribute:unit/Value:minutes' => 'Minutter',
'Class:SLT/Attribute:unit/Value:minutes+' => '',
'Class:lnkSLAToSLT' => 'Sammenhæng SLA/SLT',
'Class:lnkSLAToSLT+' => '',
'Class:lnkSLAToSLT/Attribute:sla_id' => 'SLA',
'Class:lnkSLAToSLT/Attribute:sla_id+' => '',
'Class:lnkSLAToSLT/Attribute:slt_id' => 'SLT',
'Class:lnkSLAToSLT/Attribute:slt_id+' => '',
'Class:lnkCustomerContractToService' => 'Sammenhæng Kundekontrakt/Ydelse',
'Class:lnkCustomerContractToService+' => '',
'Class:lnkCustomerContractToService/Attribute:customercontract_id' => 'Kundekontrakt',
'Class:lnkCustomerContractToService/Attribute:customercontract_id+' => '',
'Class:lnkCustomerContractToService/Attribute:service_id' => 'Ydelse',
'Class:lnkCustomerContractToService/Attribute:service_id+' => '',
'Class:lnkCustomerContractToService/Attribute:sla_id' => 'SLA',
'Class:lnkCustomerContractToService/Attribute:sla_id+' => '',
'Class:lnkCustomerContractToProviderContract' => 'Sammenhæng Kundekontrakt/Leverandørkontrakt',
'Class:lnkCustomerContractToProviderContract+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_id' => 'Kundekontrakt',
'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_id+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_id' => 'Leverandørkontrakt',
'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_id+' => '',
'Class:lnkCustomerContractToFunctionalCI' => 'Sammenhæng Kundekontrakt/FunctionalCI',
'Class:lnkCustomerContractToFunctionalCI+' => '',
'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_id' => 'Kundekontrakt',
'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_id+' => '',
'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_id' => 'CI',
'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_id+' => '',
'Class:DeliveryModel' => 'Leverings model',
'Class:DeliveryModel+' => '',
'Class:DeliveryModel/Attribute:name' => 'Navn',
'Class:DeliveryModel/Attribute:name+' => '',
'Class:DeliveryModel/Attribute:org_id' => 'Organisation',
'Class:DeliveryModel/Attribute:org_id+' => '',
'Class:DeliveryModel/Attribute:description' => 'Beskrivelse',
'Class:DeliveryModel/Attribute:description+' => '',
'Class:DeliveryModel/Attribute:contacts_list' => 'Kontakt',
'Class:DeliveryModel/Attribute:contacts_list+' => '',
'Class:DeliveryModel/Attribute:customers_list' => 'Kunde',
'Class:DeliveryModel/Attribute:customers_list+' => '',
'Class:lnkDeliveryModelToContact' => 'Sammenhæng Leveringsmodel/Kontakt',
'Class:lnkDeliveryModelToContact+' => '',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id' => 'Leverings model',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id+' => '',
'Class:lnkDeliveryModelToContact/Attribute:contact_id' => 'Kontakt',
'Class:lnkDeliveryModelToContact/Attribute:contact_id+' => '',
'Class:lnkDeliveryModelToContact/Attribute:role_id' => 'Rolle',
'Class:lnkDeliveryModelToContact/Attribute:role_id+' => '',
'Menu:ServiceManagement' => 'Service-Management',
'Menu:ServiceManagement+' => '',
'Menu:Service:Overview' => 'Oversigt',
'Menu:Service:Overview+' => '',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Kontrakter efter Service Level',
'UI-ServiceManagementMenu-ContractsByStatus' => 'Kontrakter efter Status',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Kontrakter som udløber om mindre end 30 dage',
'Menu:ServiceType' => 'Ydelsestype',
'Menu:ServiceType+' => '',
'Menu:ProviderContract' => 'Leverandørkontrakter',
'Menu:ProviderContract+' => '',
'Menu:CustomerContract' => 'Kundekontrakter',
'Menu:CustomerContract+' => '',
'Menu:ServiceSubcategory' => 'Ydelses underkategori',
'Menu:ServiceSubcategory+' => '',
'Menu:Service' => 'Ydelser',
'Menu:Service+' => '',
'Menu:ServiceElement' => 'Ydelses elementer',
'Menu:ServiceElement+' => '',
'Menu:SLA' => 'SLAs',
'Menu:SLA+' => '',
'Menu:SLT' => 'SLTs',
'Menu:SLT+' => '',
'Menu:DeliveryModel' => 'Leveringsmodel',
'Menu:DeliveryModel+' => '',
'Class:Contract' => 'Kontrakt',
'Class:Contract+' => '',
'Class:Contract/Attribute:name' => 'Navn',
'Class:Contract/Attribute:name+' => '',
'Class:Contract/Attribute:org_id' => 'Organisation',
'Class:Contract/Attribute:org_id+' => '',
'Class:Contract/Attribute:organization_name' => 'Organisations navn',
'Class:Contract/Attribute:organization_name+' => '',
'Class:Contract/Attribute:contacts_list' => 'Kontakter',
'Class:Contract/Attribute:contacts_list+' => '',
'Class:Contract/Attribute:documents_list' => 'Dokumenter',
'Class:Contract/Attribute:documents_list+' => '',
'Class:Contract/Attribute:description' => 'Beskrivelse',
'Class:Contract/Attribute:description+' => '',
'Class:Contract/Attribute:start_date' => 'Startdato',
'Class:Contract/Attribute:start_date+' => '',
'Class:Contract/Attribute:end_date' => 'Slutdato',
'Class:Contract/Attribute:end_date+' => '',
'Class:Contract/Attribute:cost' => 'Omkostninger',
'Class:Contract/Attribute:cost+' => '',
'Class:Contract/Attribute:cost_currency' => 'Valuta',
'Class:Contract/Attribute:cost_currency+' => '',
'Class:Contract/Attribute:cost_currency/Value:dollars' => 'Dollar',
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '',
'Class:Contract/Attribute:cost_currency/Value:euros' => 'Euro',
'Class:Contract/Attribute:cost_currency/Value:euros+' => '',
'Class:Contract/Attribute:cost_currency/Value:kroner' => 'Kroner',
'Class:Contract/Attribute:cost_currency/Value:kroner+' => 'Danske kroner',
'Class:Contract/Attribute:contracttype_id' => 'Kontrakttype',
'Class:Contract/Attribute:contracttype_id+' => '',
'Class:Contract/Attribute:contracttype_name' => 'Kontrakt type navn',
'Class:Contract/Attribute:contracttype_name+' => '',
'Class:Contract/Attribute:billing_frequency' => 'Afregnings frekvens',
'Class:Contract/Attribute:billing_frequency+' => '',
'Class:Contract/Attribute:cost_unit' => 'Enhedsomkostninger',
'Class:Contract/Attribute:cost_unit+' => '',
'Class:Contract/Attribute:provider_id' => 'Leverandør',
'Class:Contract/Attribute:provider_id+' => '',
'Class:Contract/Attribute:provider_name' => 'Leverandør navn',
'Class:Contract/Attribute:provider_name+' => '',
'Class:Contract/Attribute:status' => 'Status',
'Class:Contract/Attribute:status+' => '',
'Class:Contract/Attribute:status/Value:implementation' => 'Implementering',
'Class:Contract/Attribute:status/Value:implementation+' => '',
'Class:Contract/Attribute:status/Value:obsolete' => 'Forældet',
'Class:Contract/Attribute:status/Value:obsolete+' => '',
'Class:Contract/Attribute:status/Value:production' => 'Produktion',
'Class:Contract/Attribute:status/Value:production+' => '',
'Class:Contract/Attribute:finalclass' => 'Kontrakttype',
'Class:Contract/Attribute:finalclass+' => '',
'Class:lnkContactToContract/Attribute:contract_name' => 'Kontrakt navn',
'Class:lnkContactToContract/Attribute:contract_name+' => '',
'Class:lnkContactToContract/Attribute:contact_name' => 'Kontakt navn',
'Class:lnkContactToContract/Attribute:contact_name+' => '',
'Class:lnkContractToDocument/Attribute:contract_name' => 'Kontrakt navn',
'Class:lnkContractToDocument/Attribute:contract_name+' => '',
'Class:lnkContractToDocument/Attribute:document_name' => 'Dokument navn',
'Class:lnkContractToDocument/Attribute:document_name+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name' => 'Leverandørkontrakt navn',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name' => 'CI navn',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name+' => '',
'Class:Service/Attribute:organization_name' => 'Navn',
'Class:Service/Attribute:organization_name+' => '',
'Class:lnkDocumentToService/Attribute:service_name' => 'Ydelses navn',
'Class:lnkDocumentToService/Attribute:service_name+' => '',
'Class:lnkDocumentToService/Attribute:document_name' => 'Dokument navn',
'Class:lnkDocumentToService/Attribute:document_name+' => '',
'Class:lnkContactToService/Attribute:service_name' => 'Ydelses navn',
'Class:lnkContactToService/Attribute:service_name+' => '',
'Class:lnkContactToService/Attribute:contact_name' => 'Kontakt navn',
'Class:lnkContactToService/Attribute:contact_name+' => '',
'Class:ServiceSubcategory/Attribute:service_name' => 'Ydelses navn',
'Class:ServiceSubcategory/Attribute:service_name+' => '',
'Class:SLA/Attribute:organization_name' => 'Organisations navn',
'Class:SLA/Attribute:organization_name+' => '',
'Class:lnkSLAToSLT/Attribute:sla_name' => 'SLA navn',
'Class:lnkSLAToSLT/Attribute:sla_name+' => '',
'Class:lnkSLAToSLT/Attribute:slt_name' => 'SLT navn',
'Class:lnkSLAToSLT/Attribute:slt_name+' => '',
'Class:lnkCustomerContractToService/Attribute:customercontract_name' => 'Kundekontrakt navn',
'Class:lnkCustomerContractToService/Attribute:customercontract_name+' => '',
'Class:lnkCustomerContractToService/Attribute:service_name' => 'Ydelses navn',
'Class:lnkCustomerContractToService/Attribute:service_name+' => '',
'Class:lnkCustomerContractToService/Attribute:sla_name' => 'SLA-Navn',
'Class:lnkCustomerContractToService/Attribute:sla_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_name' => 'Kundekontrakt navn',
'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_name+' => '',
'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_name' => 'Leverandørkontrakt navn',
'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_name+' => '',
'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_name' => 'Kundekontrakt navn',
'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_name+' => '',
'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_name' => 'CI navn',
'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_name+' => '',
'Class:DeliveryModel/Attribute:organization_name' => 'Organisations navn',
'Class:DeliveryModel/Attribute:organization_name+' => '',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name' => 'Leveringsmodel navn',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name+' => '',
'Class:lnkDeliveryModelToContact/Attribute:contact_name' => 'Kontaktnavn',
'Class:lnkDeliveryModelToContact/Attribute:contact_name+' => '',
'Class:lnkDeliveryModelToContact/Attribute:role_name' => 'Rolle navn',
'Class:lnkDeliveryModelToContact/Attribute:role_name+' => '',
));
?>

View File

@@ -0,0 +1,358 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:ContractType' => 'Kontrakt type',
'Class:ContractType+' => '',
'Class:CustomerContract' => 'Kunde kontrakt',
'Class:CustomerContract+' => '',
'Class:CustomerContract/Attribute:services_list' => 'Ydelser',
'Class:CustomerContract/Attribute:services_list+' => '',
'Class:ProviderContract' => 'Leverandør kontrakt',
'Class:ProviderContract+' => '',
'Class:ProviderContract/Attribute:functionalcis_list' => 'CIs',
'Class:ProviderContract/Attribute:functionalcis_list+' => 'Content Items',
'Class:ProviderContract/Attribute:sla' => 'SLA',
'Class:ProviderContract/Attribute:sla+' => 'Service Level Agreement',
'Class:ProviderContract/Attribute:coverage' => 'Dækning',
'Class:ProviderContract/Attribute:coverage+' => '',
'Class:lnkContactToContract' => 'Sammenhæng Kontakt/Kontrakt',
'Class:lnkContactToContract+' => '',
'Class:lnkContactToContract/Attribute:contract_id' => 'Kontrakt',
'Class:lnkContactToContract/Attribute:contract_id+' => '',
'Class:lnkContactToContract/Attribute:contact_id' => 'Kontakt',
'Class:lnkContactToContract/Attribute:contact_id+' => '',
'Class:lnkContractToDocument' => 'Sammenhæng Kontrakt/Dokument',
'Class:lnkContractToDocument+' => '',
'Class:lnkContractToDocument/Attribute:contract_id' => 'Kontrakt',
'Class:lnkContractToDocument/Attribute:contract_id+' => '',
'Class:lnkContractToDocument/Attribute:document_id' => 'Dokument',
'Class:lnkContractToDocument/Attribute:document_id+' => '',
'Class:lnkFunctionalCIToProviderContract' => 'Sammenhæng FunctionalCI/Leverandør Kontrakt',
'Class:lnkFunctionalCIToProviderContract+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => 'Leverandør kontrakt',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id' => 'CI',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id+' => '',
'Class:ServiceFamily' => 'Ydelses-familie',
'Class:ServiceFamily+' => '',
'Class:ServiceFamily/Attribute:name' => 'Navn',
'Class:ServiceFamily/Attribute:name+' => '',
'Class:ServiceFamily/Attribute:services_list' => 'Ydelser',
'Class:ServiceFamily/Attribute:services_list+' => '',
'Class:Service' => 'Ydelse',
'Class:Service+' => '',
'Class:Service/Attribute:name' => 'Navn',
'Class:Service/Attribute:name+' => '',
'Class:Service/Attribute:org_id' => 'Udbyder',
'Class:Service/Attribute:org_id+' => '',
'Class:Service/Attribute:servicefamily_id' => 'Service familie',
'Class:Service/Attribute:servicefamily_id+' => '',
'Class:Service/Attribute:description' => 'Beskrivelse',
'Class:Service/Attribute:description+' => '',
'Class:Service/Attribute:documents_list' => 'Dokumenter',
'Class:Service/Attribute:documents_list+' => '',
'Class:Service/Attribute:contacts_list' => 'Kontakter',
'Class:Service/Attribute:contacts_list+' => '',
'Class:Service/Attribute:status' => 'Status',
'Class:Service/Attribute:status+' => '',
'Class:Service/Attribute:status/Value:implementation' => 'Implementering',
'Class:Service/Attribute:status/Value:implementation+' => '',
'Class:Service/Attribute:status/Value:obsolete' => 'Forældet',
'Class:Service/Attribute:status/Value:obsolete+' => '',
'Class:Service/Attribute:status/Value:production' => 'Produktion',
'Class:Service/Attribute:status/Value:production+' => '',
'Class:Service/Attribute:customercontracts_list' => 'Kunde kontrakter',
'Class:Service/Attribute:customercontracts_list+' => '',
'Class:Service/Attribute:providercontracts_list' => 'Leverandør kontrakter',
'Class:Service/Attribute:providercontracts_list+' => '',
'Class:Service/Attribute:functionalcis_list' => 'Nødvendige CIs',
'Class:Service/Attribute:functionalcis_list+' => '',
'Class:Service/Attribute:servicesubcategories_list' => 'Ydelses subkategorier',
'Class:Service/Attribute:servicesubcategories_list+' => '',
'Class:lnkDocumentToService' => 'Sammenhæng Dokument/Ydelse',
'Class:lnkDocumentToService+' => '',
'Class:lnkDocumentToService/Attribute:service_id' => 'Ydelse',
'Class:lnkDocumentToService/Attribute:service_id+' => '',
'Class:lnkDocumentToService/Attribute:document_id' => 'Dokument',
'Class:lnkDocumentToService/Attribute:document_id+' => '',
'Class:lnkContactToService' => 'Sammenhæng Kontakt/Ydelse',
'Class:lnkContactToService+' => '',
'Class:lnkContactToService/Attribute:service_id' => 'Ydelse',
'Class:lnkContactToService/Attribute:service_id+' => '',
'Class:lnkContactToService/Attribute:contact_id' => 'Kontakt',
'Class:lnkContactToService/Attribute:contact_id+' => '',
'Class:ServiceSubcategory' => 'Ydelse underkategorier',
'Class:ServiceSubcategory+' => '',
'Class:ServiceSubcategory/Attribute:name' => 'Navn',
'Class:ServiceSubcategory/Attribute:name+' => '',
'Class:ServiceSubcategory/Attribute:description' => 'Beskrivelse',
'Class:ServiceSubcategory/Attribute:description+' => '',
'Class:ServiceSubcategory/Attribute:service_id' => 'Ydelse',
'Class:ServiceSubcategory/Attribute:service_id+' => '',
'Class:ServiceSubcategory/Attribute:request_type' => 'Anmodnings type',
'Class:ServiceSubcategory/Attribute:request_type+' => '',
'Class:ServiceSubcategory/Attribute:request_type/Value:incident' => 'Incident',
'Class:ServiceSubcategory/Attribute:request_type/Value:incident+' => '',
'Class:ServiceSubcategory/Attribute:request_type/Value:service_request' => 'Service Anmodning',
'Class:ServiceSubcategory/Attribute:request_type/Value:service_request+' => '',
'Class:ServiceSubcategory/Attribute:status' => 'Status',
'Class:ServiceSubcategory/Attribute:status+' => '',
'Class:ServiceSubcategory/Attribute:status/Value:implementation' => 'Implementering',
'Class:ServiceSubcategory/Attribute:status/Value:implementation+' => '',
'Class:ServiceSubcategory/Attribute:status/Value:obsolete' => 'Forældet',
'Class:ServiceSubcategory/Attribute:status/Value:obsolete+' => '',
'Class:ServiceSubcategory/Attribute:status/Value:production' => 'Produktion',
'Class:ServiceSubcategory/Attribute:status/Value:production+' => '',
'Class:SLA' => 'SLA',
'Class:SLA+' => '',
'Class:SLA/Attribute:name' => 'Navn',
'Class:SLA/Attribute:name+' => '',
'Class:SLA/Attribute:description' => 'Beskrivelse',
'Class:SLA/Attribute:description+' => '',
'Class:SLA/Attribute:org_id' => 'Leverandør',
'Class:SLA/Attribute:org_id+' => '',
'Class:SLA/Attribute:slts_list' => 'SLTs',
'Class:SLA/Attribute:slts_list+' => 'Service Level Threshholds:',
'Class:SLA/Attribute:customercontracts_list' => 'Kunde kontrakter',
'Class:SLA/Attribute:customercontracts_list+' => '',
'Class:SLT' => 'SLT',
'Class:SLT+' => 'Service Level Threshholds',
'Class:SLT/Attribute:name' => 'Navn',
'Class:SLT/Attribute:name+' => '',
'Class:SLT/Attribute:priority' => 'Prioritet',
'Class:SLT/Attribute:priority+' => '',
'Class:SLT/Attribute:priority/Value:1' => 'Kritisk',
'Class:SLT/Attribute:priority/Value:1+' => '',
'Class:SLT/Attribute:priority/Value:2' => 'Høj',
'Class:SLT/Attribute:priority/Value:2+' => '',
'Class:SLT/Attribute:priority/Value:3' => 'Middel',
'Class:SLT/Attribute:priority/Value:3+' => '',
'Class:SLT/Attribute:priority/Value:4' => 'Lav',
'Class:SLT/Attribute:priority/Value:4+' => '',
'Class:SLT/Attribute:request_type' => 'Anmodnings type',
'Class:SLT/Attribute:request_type+' => '',
'Class:SLT/Attribute:request_type/Value:incident' => 'Incident',
'Class:SLT/Attribute:request_type/Value:incident+' => '',
'Class:SLT/Attribute:request_type/Value:service_request' => 'Service Anmodning',
'Class:SLT/Attribute:request_type/Value:service_request+' => '',
'Class:SLT/Attribute:metric' => 'Metrisk',
'Class:SLT/Attribute:metric+' => '',
'Class:SLT/Attribute:metric/Value:tto' => 'TTO (Time To Own)',
'Class:SLT/Attribute:metric/Value:tto+' => '',
'Class:SLT/Attribute:metric/Value:ttr' => 'TTR (Time To Resolve)',
'Class:SLT/Attribute:metric/Value:ttr+' => '',
'Class:SLT/Attribute:value' => 'Værdi',
'Class:SLT/Attribute:value+' => '',
'Class:SLT/Attribute:unit' => 'Enhed',
'Class:SLT/Attribute:unit+' => '',
'Class:SLT/Attribute:unit/Value:hours' => 'Timer',
'Class:SLT/Attribute:unit/Value:hours+' => '',
'Class:SLT/Attribute:unit/Value:minutes' => 'Minutter',
'Class:SLT/Attribute:unit/Value:minutes+' => '',
'Class:lnkSLAToSLT' => 'Sammenhæng SLA/SLT',
'Class:lnkSLAToSLT+' => '',
'Class:lnkSLAToSLT/Attribute:sla_id' => 'SLA',
'Class:lnkSLAToSLT/Attribute:sla_id+' => '',
'Class:lnkSLAToSLT/Attribute:slt_id' => 'SLT',
'Class:lnkSLAToSLT/Attribute:slt_id+' => '',
'Class:lnkCustomerContractToService' => 'Sammenhæng Kunde kontrakt/Ydelse',
'Class:lnkCustomerContractToService+' => '',
'Class:lnkCustomerContractToService/Attribute:customercontract_id' => 'Kunde kontrakt',
'Class:lnkCustomerContractToService/Attribute:customercontract_id+' => '',
'Class:lnkCustomerContractToService/Attribute:service_id' => 'Ydelse',
'Class:lnkCustomerContractToService/Attribute:service_id+' => '',
'Class:lnkCustomerContractToService/Attribute:sla_id' => 'SLA',
'Class:lnkCustomerContractToService/Attribute:sla_id+' => '',
'Class:lnkProviderContractToService' => 'Sammenhæng Leverandør kontrakt/Ydelse',
'Class:lnkProviderContractToService+' => '',
'Class:lnkProviderContractToService/Attribute:service_id' => 'Ydelse',
'Class:lnkProviderContractToService/Attribute:service_id+' => '',
'Class:lnkProviderContractToService/Attribute:providercontract_id' => 'Leverandør kontrakt',
'Class:lnkProviderContractToService/Attribute:providercontract_id+' => '',
'Class:lnkFunctionalCIToService' => 'Sammenhæng FunctionalCI/Ydelse',
'Class:lnkFunctionalCIToService+' => '',
'Class:lnkFunctionalCIToService/Attribute:service_id' => 'Ydelse',
'Class:lnkFunctionalCIToService/Attribute:service_id+' => '',
'Class:lnkFunctionalCIToService/Attribute:functionalci_id' => 'CI',
'Class:lnkFunctionalCIToService/Attribute:functionalci_id+' => '',
'Class:DeliveryModel' => 'Leverings model',
'Class:DeliveryModel+' => '',
'Class:DeliveryModel/Attribute:name' => 'Navn',
'Class:DeliveryModel/Attribute:name+' => '',
'Class:DeliveryModel/Attribute:org_id' => 'Organisation',
'Class:DeliveryModel/Attribute:org_id+' => '',
'Class:DeliveryModel/Attribute:description' => 'Beskrivelse',
'Class:DeliveryModel/Attribute:description+' => '',
'Class:DeliveryModel/Attribute:contacts_list' => 'Kontakt',
'Class:DeliveryModel/Attribute:contacts_list+' => '',
'Class:DeliveryModel/Attribute:customers_list' => 'Kunde',
'Class:DeliveryModel/Attribute:customers_list+' => '',
'Class:lnkDeliveryModelToContact' => 'Sammenhæng Leverings model/Kontakt',
'Class:lnkDeliveryModelToContact+' => '',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id' => 'Leverings model',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id+' => '',
'Class:lnkDeliveryModelToContact/Attribute:contact_id' => 'Kontakt',
'Class:lnkDeliveryModelToContact/Attribute:contact_id+' => '',
'Class:lnkDeliveryModelToContact/Attribute:role_id' => 'Rolle',
'Class:lnkDeliveryModelToContact/Attribute:role_id+' => '',
'Menu:ServiceManagement' => 'Ydelses Management',
'Menu:ServiceManagement+' => 'Ydelses Management oversigt',
'Menu:Service:Overview' => 'Oversigt',
'Menu:Service:Overview+' => '',
'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Kontrakt(er) efter Service Level',
'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Kontrakt(er), der udløber om mindre end 30 dage',
'Menu:ServiceType' => 'Ydelses typer',
'Menu:ServiceType+' => 'Ydelses typer',
'Menu:ProviderContract' => 'Leverandør kontrakter',
'Menu:ProviderContract+' => 'Leverandør kontrakter',
'Menu:CustomerContract' => 'Kunde kontrakter',
'Menu:CustomerContract+' => 'Kunde kontrakter',
'Menu:ServiceSubcategory' => 'Ydelses underkategorier',
'Menu:ServiceSubcategory+' => 'Ydelses underkategorier',
'Menu:Service' => 'Ydelser',
'Menu:Service+' => 'Ydelser',
'Menu:ServiceElement' => 'Ydelses elementer',
'Menu:ServiceElement+' => '',
'Menu:SLA' => 'SLAs',
'Menu:SLA+' => 'Service Level Agreements',
'Menu:SLT' => 'SLTs',
'Menu:SLT+' => 'Service Level Targets',
'Menu:DeliveryModel' => 'Leverings model(ler)',
'Menu:DeliveryModel+' => '',
'Menu:ServiceFamily' => 'Ydelses familie(r)',
'Menu:ServiceFamily+' => '',
'Menu:Procedure' => 'Procedure katalog',
'Menu:Procedure+' => '',
'Class:Contract' => 'Kontrakt',
'Class:Contract+' => '',
'Class:Contract/Attribute:name' => 'Navn',
'Class:Contract/Attribute:name+' => '',
'Class:Contract/Attribute:org_id' => 'Kunde',
'Class:Contract/Attribute:org_id+' => '',
'Class:Contract/Attribute:organization_name' => 'Kunde navn',
'Class:Contract/Attribute:organization_name+' => '',
'Class:Contract/Attribute:contacts_list' => 'Kontakt',
'Class:Contract/Attribute:contacts_list+' => '',
'Class:Contract/Attribute:documents_list' => 'Dokument',
'Class:Contract/Attribute:documents_list+' => '',
'Class:Contract/Attribute:description' => 'Beskrivelse',
'Class:Contract/Attribute:description+' => '',
'Class:Contract/Attribute:start_date' => 'Startdato',
'Class:Contract/Attribute:start_date+' => '',
'Class:Contract/Attribute:end_date' => 'Udløbsdato',
'Class:Contract/Attribute:end_date+' => '',
'Class:Contract/Attribute:cost' => 'Omkostninger',
'Class:Contract/Attribute:cost+' => '',
'Class:Contract/Attribute:cost_currency' => 'Valuta',
'Class:Contract/Attribute:cost_currency+' => '',
'Class:Contract/Attribute:cost_currency/Value:dollars' => 'Dollar',
'Class:Contract/Attribute:cost_currency/Value:dollars+' => '',
'Class:Contract/Attribute:cost_currency/Value:euros' => 'Euro',
'Class:Contract/Attribute:cost_currency/Value:euros+' => '',
'Class:Contract/Attribute:cost_currency/Value:kroner' => 'Kroner',
'Class:Contract/Attribute:cost_currency/Value:kroner+' => 'Danske kroner',
'Class:Contract/Attribute:contracttype_id' => 'Kontrakt type',
'Class:Contract/Attribute:contracttype_id+' => '',
'Class:Contract/Attribute:contracttype_name' => 'Kontrakt type navn',
'Class:Contract/Attribute:contracttype_name+' => '',
'Class:Contract/Attribute:billing_frequency' => 'Afregnings frekvens',
'Class:Contract/Attribute:billing_frequency+' => '',
'Class:Contract/Attribute:cost_unit' => 'Enhedsomkostning',
'Class:Contract/Attribute:cost_unit+' => '',
'Class:Contract/Attribute:provider_id' => 'Leverandør',
'Class:Contract/Attribute:provider_id+' => '',
'Class:Contract/Attribute:provider_name' => 'Leverandør navn',
'Class:Contract/Attribute:provider_name+' => '',
'Class:Contract/Attribute:status' => 'Status',
'Class:Contract/Attribute:status+' => '',
'Class:Contract/Attribute:status/Value:implementation' => 'Implementering',
'Class:Contract/Attribute:status/Value:implementation+' => '',
'Class:Contract/Attribute:status/Value:obsolete' => 'Forældet',
'Class:Contract/Attribute:status/Value:obsolete+' => '',
'Class:Contract/Attribute:status/Value:production' => 'Produktion',
'Class:Contract/Attribute:status/Value:production+' => '',
'Class:Contract/Attribute:finalclass' => 'Type',
'Class:Contract/Attribute:finalclass+' => '',
'Class:ProviderContract/Attribute:contracttype_id' => 'Kontrakt type',
'Class:ProviderContract/Attribute:contracttype_id+' => '',
'Class:ProviderContract/Attribute:contracttype_name' => 'Kontrakt type navn',
'Class:ProviderContract/Attribute:contracttype_name+' => '',
'Class:lnkContactToContract/Attribute:contract_name' => 'Kontrakt navn',
'Class:lnkContactToContract/Attribute:contract_name+' => '',
'Class:lnkContactToContract/Attribute:contact_name' => 'Kontakt navn',
'Class:lnkContactToContract/Attribute:contact_name+' => '',
'Class:lnkContractToDocument/Attribute:contract_name' => 'Kontrakt navn',
'Class:lnkContractToDocument/Attribute:contract_name+' => '',
'Class:lnkContractToDocument/Attribute:document_name' => 'Dokument navn',
'Class:lnkContractToDocument/Attribute:document_name+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name' => 'Leverandør kontrakt navn',
'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name+' => '',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name' => 'CI navn',
'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name+' => '',
'Class:Service/Attribute:organization_name' => 'Leverandør navn',
'Class:Service/Attribute:organization_name+' => '',
'Class:Service/Attribute:servicefamily_name' => 'Ydelses familie navn',
'Class:Service/Attribute:servicefamily_name+' => '',
'Class:lnkDocumentToService/Attribute:service_name' => 'Ydelses navn',
'Class:lnkDocumentToService/Attribute:service_name+' => '',
'Class:lnkDocumentToService/Attribute:document_name' => 'Dokument navn',
'Class:lnkDocumentToService/Attribute:document_name+' => '',
'Class:lnkContactToService/Attribute:service_name' => 'Ydelses navn',
'Class:lnkContactToService/Attribute:service_name+' => '',
'Class:lnkContactToService/Attribute:contact_name' => 'Kontakt navn',
'Class:lnkContactToService/Attribute:contact_name+' => '',
'Class:ServiceSubcategory/Attribute:service_name' => 'Ydelse',
'Class:ServiceSubcategory/Attribute:service_name+' => '',
'Class:SLA/Attribute:organization_name' => 'Leverandør navn',
'Class:SLA/Attribute:organization_name+' => '',
'Class:lnkSLAToSLT/Attribute:sla_name' => 'SLA navn',
'Class:lnkSLAToSLT/Attribute:sla_name+' => '',
'Class:lnkSLAToSLT/Attribute:slt_name' => 'SLT navn',
'Class:lnkSLAToSLT/Attribute:slt_name+' => '',
'Class:lnkCustomerContractToService/Attribute:customercontract_name' => 'Kunde kontrakt navn',
'Class:lnkCustomerContractToService/Attribute:customercontract_name+' => '',
'Class:lnkCustomerContractToService/Attribute:service_name' => 'Ydelses navn',
'Class:lnkCustomerContractToService/Attribute:service_name+' => '',
'Class:lnkCustomerContractToService/Attribute:sla_name' => 'SLA navn',
'Class:lnkCustomerContractToService/Attribute:sla_name+' => '',
'Class:lnkProviderContractToService/Attribute:service_name' => 'Ydelses navn',
'Class:lnkProviderContractToService/Attribute:service_name+' => '',
'Class:lnkProviderContractToService/Attribute:providercontract_name' => 'Leverandør kontrakt navn',
'Class:lnkProviderContractToService/Attribute:providercontract_name+' => '',
'Class:lnkFunctionalCIToService/Attribute:service_name' => 'Ydelses navn',
'Class:lnkFunctionalCIToService/Attribute:service_name+' => '',
'Class:lnkFunctionalCIToService/Attribute:functionalci_name' => 'CI navn',
'Class:lnkFunctionalCIToService/Attribute:functionalci_name+' => '',
'Class:DeliveryModel/Attribute:organization_name' => 'Organisations navn',
'Class:DeliveryModel/Attribute:organization_name+' => '',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name' => 'Leverings model navn',
'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name+' => '',
'Class:lnkDeliveryModelToContact/Attribute:contact_name' => 'Kontakt navn',
'Class:lnkDeliveryModelToContact/Attribute:contact_name+' => '',
'Class:lnkDeliveryModelToContact/Attribute:role_name' => 'Rolle navn',
'Class:lnkDeliveryModelToContact/Attribute:role_name+' => '',
));
?>

View File

@@ -0,0 +1,138 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:Ticket' => 'Ticket',
'Class:Ticket+' => '',
'Class:Ticket/Attribute:ref' => 'Reference',
'Class:Ticket/Attribute:ref+' => '',
'Class:Ticket/Attribute:org_id' => 'Organisation',
'Class:Ticket/Attribute:org_id+' => '',
'Class:Ticket/Attribute:caller_id' => 'Bruger',
'Class:Ticket/Attribute:caller_id+' => '',
'Class:Ticket/Attribute:team_id' => 'Team',
'Class:Ticket/Attribute:team_id+' => '',
'Class:Ticket/Attribute:agent_id' => 'Tildelt til',
'Class:Ticket/Attribute:agent_id+' => '',
'Class:Ticket/Attribute:title' => 'Titel',
'Class:Ticket/Attribute:title+' => '',
'Class:Ticket/Attribute:description' => 'Beskrivelse',
'Class:Ticket/Attribute:description+' => '',
'Class:Ticket/Attribute:start_date' => 'Start dato',
'Class:Ticket/Attribute:start_date+' => '',
'Class:Ticket/Attribute:end_date' => 'Slut dato',
'Class:Ticket/Attribute:end_date+' => '',
'Class:Ticket/Attribute:last_update' => 'Sidste opdatering',
'Class:Ticket/Attribute:last_update+' => '',
'Class:Ticket/Attribute:close_date' => 'Lukket dato',
'Class:Ticket/Attribute:close_date+' => '',
'Class:Ticket/Attribute:private_log' => 'Privat Log',
'Class:Ticket/Attribute:private_log+' => '',
'Class:Ticket/Attribute:contacts_list' => 'Kontakt',
'Class:Ticket/Attribute:contacts_list+' => '',
'Class:Ticket/Attribute:functionalcis_list' => 'CIs',
'Class:Ticket/Attribute:functionalcis_list+' => '',
'Class:Ticket/Attribute:workorders_list' => 'Arbejdsordre',
'Class:Ticket/Attribute:workorders_list+' => '',
'Class:Ticket/Attribute:finalclass' => 'Type',
'Class:Ticket/Attribute:finalclass+' => '',
'Class:lnkContactToTicket' => 'Sammenhæng Kontakt/Ticket',
'Class:lnkContactToTicket+' => '',
'Class:lnkContactToTicket/Attribute:ticket_id' => 'Ticket',
'Class:lnkContactToTicket/Attribute:ticket_id+' => '',
'Class:lnkContactToTicket/Attribute:contact_id' => 'Kontakt',
'Class:lnkContactToTicket/Attribute:contact_id+' => '',
'Class:lnkContactToTicket/Attribute:role' => 'Rolle',
'Class:lnkContactToTicket/Attribute:role+' => '',
'Class:lnkFunctionalCIToTicket' => 'Sammenhæng FunctionalCI/Ticket',
'Class:lnkFunctionalCIToTicket+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id' => 'Ticket',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_id+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_id' => 'CI',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_id+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:impact' => 'Påvirkning',
'Class:lnkFunctionalCIToTicket/Attribute:impact+' => '',
'Class:WorkOrder' => 'Arbejdsordre',
'Class:WorkOrder+' => '',
'Class:WorkOrder/Attribute:name' => 'Navn',
'Class:WorkOrder/Attribute:name+' => '',
'Class:WorkOrder/Attribute:status' => 'Status',
'Class:WorkOrder/Attribute:status+' => '',
'Class:WorkOrder/Attribute:status/Value:open' => 'Åben',
'Class:WorkOrder/Attribute:status/Value:open+' => '',
'Class:WorkOrder/Attribute:status/Value:closed' => 'Lukket',
'Class:WorkOrder/Attribute:status/Value:closed+' => '',
'Class:WorkOrder/Attribute:description' => 'Beskrivelse',
'Class:WorkOrder/Attribute:description+' => '',
'Class:WorkOrder/Attribute:ticket_id' => 'Ticket',
'Class:WorkOrder/Attribute:ticket_id+' => '',
'Class:WorkOrder/Attribute:team_id' => 'Team',
'Class:WorkOrder/Attribute:team_id+' => '',
'Class:WorkOrder/Attribute:agent_id' => 'Tildelt til',
'Class:WorkOrder/Attribute:agent_id+' => '',
'Class:WorkOrder/Attribute:start_date' => 'Start dato',
'Class:WorkOrder/Attribute:start_date+' => '',
'Class:WorkOrder/Attribute:end_date' => 'Slut dato',
'Class:WorkOrder/Attribute:end_date+' => '',
'Class:WorkOrder/Attribute:log' => 'Log',
'Class:WorkOrder/Attribute:log+' => '',
'Class:WorkOrder/Stimulus:ev_close' => 'Luk',
'Class:WorkOrder/Stimulus:ev_close+' => '',
'Class:Ticket/Attribute:org_name' => 'Organisations navn',
'Class:Ticket/Attribute:org_name+' => '',
'Class:Ticket/Attribute:caller_name' => 'Bruger navn',
'Class:Ticket/Attribute:caller_name+' => '',
'Class:Ticket/Attribute:team_name' => 'Team navn',
'Class:Ticket/Attribute:team_name+' => '',
'Class:Ticket/Attribute:agent_name' => 'Tildelt til',
'Class:Ticket/Attribute:agent_name+' => '',
'Class:lnkContactToTicket/Attribute:ticket_ref' => 'Reference',
'Class:lnkContactToTicket/Attribute:ticket_ref+' => '',
'Class:lnkContactToTicket/Attribute:contact_email' => 'Kontakt Email',
'Class:lnkContactToTicket/Attribute:contact_email+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref' => 'Reference',
'Class:lnkFunctionalCIToTicket/Attribute:ticket_ref+' => '',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_name' => 'CI Navn',
'Class:lnkFunctionalCIToTicket/Attribute:functionalci_name+' => '',
'Class:WorkOrder/Attribute:ticket_ref' => 'Refererede Ticket',
'Class:WorkOrder/Attribute:ticket_ref+' => '',
'Class:WorkOrder/Attribute:team_name' => 'Team navn',
'Class:WorkOrder/Attribute:team_name+' => '',
'Class:WorkOrder/Attribute:agent_email' => 'Bruger Email',
'Class:WorkOrder/Attribute:agent_email+' => '',
'Ticket:baseinfo' => 'Almindelig information',
'Ticket:date' => 'Dato',
'Ticket:contact' => 'Kontakt',
'Ticket:moreinfo' => 'Yderligere information',
'Ticket:relation' => 'Betegnelse',
'Ticket:log' => 'Kommunikation',
'Ticket:Type' => 'Qualifikation',
'Ticket:support' => 'Support',
'Ticket:resolution' => 'Løsning',
'Ticket:SLA' => 'SLA Report',
'WorkOrder:Details' => 'Detaljer',
'WorkOrder:Moreinfo' => 'Yderligere information',
));
?>

View File

@@ -746,6 +746,16 @@
<argument id="1">
<type>attcode</type>
<mandatory>true</mandatory>
<type_restrictions>
<operation>deny</operation>
<types>
<type id="AttributeStopWatch"/>
<type id="AttributeSubItem"/>
<type id="AttributeExternalField"/>
<type id="AttributeLinkedSetIndirect"/>
<type id="AttributeLinkedSet"/>
</types>
</type_restrictions>
</argument>
<argument id="2">
<type>string</type>
@@ -758,6 +768,14 @@
<argument id="1">
<type>attcode</type>
<mandatory>true</mandatory>
<type_restrictions>
<operation>allow</operation>
<types>
<type id="AttributeDate"/>
<type id="AttributeDateTime"/>
<type id="AttributeString"/>
</types>
</type_restrictions>
</argument>
</arguments>
</method>
@@ -766,6 +784,14 @@
<argument id="1">
<type>attcode</type>
<mandatory>true</mandatory>
<type_restrictions>
<operation>allow</operation>
<types>
<type id="AttributeExternalKey"/>
<type id="AttributeInteger"/>
<type id="AttributeString"/>
</types>
</type_restrictions>
</argument>
</arguments>
</method>
@@ -774,10 +800,23 @@
<argument id="1">
<type>attcode</type>
<mandatory>true</mandatory>
<type_restrictions>
<operation>allow</operation>
<types>
<type id="AttributeDuration"/>
</types>
</type_restrictions>
</argument>
<argument id="2">
<type>attcode</type>
<mandatory>true</mandatory>
<type_restrictions>
<operation>allow</operation>
<types>
<type id="AttributeDate"/>
<type id="AttributeDateTime"/>
</types>
</type_restrictions>
</argument>
<argument id="3">
<type>string</type>
@@ -790,6 +829,28 @@
<argument id="1">
<type>attcode</type>
<mandatory>true</mandatory>
<type_restrictions>
<operation>deny</operation>
<types>
<type id="AttributeStopWatch"/>
<type id="AttributeSubItem"/>
<type id="AttributeExternalField"/>
</types>
</type_restrictions>
</argument>
</arguments>
</method>
<method id="ResetStopWatch">
<arguments>
<argument id="1">
<type>attcode</type>
<mandatory>true</mandatory>
<type_restrictions>
<operation>allow</operation>
<types>
<type id="AttributeStopWatch"/>
</types>
</type_restrictions>
</argument>
</arguments>
</method>
@@ -798,6 +859,14 @@
<argument id="1">
<type>attcode</type>
<mandatory>true</mandatory>
<type_restrictions>
<operation>deny</operation>
<types>
<type id="AttributeStopWatch"/>
<type id="AttributeSubItem"/>
<type id="AttributeExternalField"/>
</types>
</type_restrictions>
</argument>
<argument id="2">
<type>attcode</type>

View File

@@ -31,8 +31,6 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:AdminTools' => 'Admin-Tools',
'Menu:AdminTools+' => 'Administrationswerkzeuge',
'Menu:AdminTools?' => 'Werkzeuge, die nur für Benutzer mit Adminstratorprofil zugänglich sind',
'Menu:CSVImportMenu' => 'CSV-Import',
'Menu:CSVImportMenu+' => 'Massenerstellung oder -aktualisierung',
'Menu:DataModelMenu' => 'Datenmodell',
'Menu:DataModelMenu+' => 'Übersicht des Datenmodells',
'Menu:ExportMenu' => 'Export',
@@ -46,8 +44,6 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Menu:RunQueriesMenu+' => 'Eine beliebige Abfrage ausführen',
'Menu:QueryMenu' => 'Query-Bibliothek',
'Menu:QueryMenu+' => '',
'Menu:DataAdministration' => 'Data Management',
'Menu:DataAdministration+' => 'Data Management',
'Menu:UniversalSearchMenu' => 'Universelle Suche',
'Menu:UniversalSearchMenu+' => 'Suchen Sie nach beliebigen Inhalt...',
'Menu:UserManagementMenu' => 'User-Management',

View File

@@ -31,8 +31,6 @@ Dict::Add('EN US', 'English', 'English', array(
'Menu:AdminTools' => 'Admin tools',
'Menu:AdminTools+' => 'Administration tools',
'Menu:AdminTools?' => 'Tools accessible only to users having the administrator profile',
'Menu:CSVImportMenu' => 'CSV import',
'Menu:CSVImportMenu+' => 'Bulk creation or update',
'Menu:DataModelMenu' => 'Data Model',
'Menu:DataModelMenu+' => 'Overview of the Data Model',
'Menu:ExportMenu' => 'Export',
@@ -46,8 +44,6 @@ Dict::Add('EN US', 'English', 'English', array(
'Menu:RunQueriesMenu+' => 'Run any query',
'Menu:QueryMenu' => 'Query phrasebook',
'Menu:QueryMenu+' => 'Query phrasebook',
'Menu:DataAdministration' => 'Data administration',
'Menu:DataAdministration+' => 'Data administration',
'Menu:UniversalSearchMenu' => 'Universal Search',
'Menu:UniversalSearchMenu+' => 'Search for anything...',
'Menu:UserManagementMenu' => 'User Management',

View File

@@ -31,8 +31,6 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
'Menu:AdminTools' => 'Herramientas Administrativas',
'Menu:AdminTools+' => 'Herramientas Administrativas',
'Menu:AdminTools?' => 'Herramientas accesibles sólo a usuarios con Perfil de administrador',
'Menu:CSVImportMenu' => 'Importar CSV',
'Menu:CSVImportMenu+' => 'Creación o Actualización Másiva',
'Menu:DataModelMenu' => 'Modelo de Datos',
'Menu:DataModelMenu+' => 'Resumen del Modelo de Datos',
'Menu:ExportMenu' => 'Exportar',
@@ -46,8 +44,6 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
'Menu:RunQueriesMenu+' => 'Ejecutar Cualquier Consulta',
'Menu:QueryMenu' => 'Libreta de Consultas',
'Menu:QueryMenu+' => 'Libreta de Consultas',
'Menu:DataAdministration' => 'Administración de Datos',
'Menu:DataAdministration+' => 'Administración de Datos',
'Menu:UniversalSearchMenu' => 'Búsqueda Universal',
'Menu:UniversalSearchMenu+' => 'Buscar cualquier cosa',
'Menu:UserManagementMenu' => 'Administración de Usuarios',

View File

@@ -31,8 +31,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Menu:AdminTools' => 'Outils d\'admin',
'Menu:AdminTools+' => 'Outils d\'administration',
'Menu:AdminTools?' => 'Ces outils sont accessibles uniquement aux utilisateurs possédant le profil Administrateur.',
'Menu:CSVImportMenu' => 'Import CSV',
'Menu:CSVImportMenu+' => 'Import ou mise à jour en masse',
'Menu:DataModelMenu' => 'Modèle de Données',
'Menu:DataModelMenu+' => 'Résumé du Modèle de Données',
'Menu:ExportMenu' => 'Exportation',
@@ -46,8 +44,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Menu:RunQueriesMenu+' => 'Executer une requête OQL',
'Menu:QueryMenu' => 'Livre des requêtes',
'Menu:QueryMenu+' => 'Livre des requêtes',
'Menu:DataAdministration' => 'Administration des données',
'Menu:DataAdministration+' => 'Administration des données',
'Menu:UniversalSearchMenu' => 'Recherche Universelle',
'Menu:UniversalSearchMenu+' => 'Rechercher n\'importe quel objet...',
'Menu:UserManagementMenu' => 'Gestion des Utilisateurs',

View File

@@ -31,8 +31,6 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Menu:AdminTools' => 'Adminisztrációs eszközök',
'Menu:AdminTools+' => '',
'Menu:AdminTools?' => 'Eszközök csak az adminisztrátori profilhoz rendlet felhasználók számára elérhetők.',
'Menu:CSVImportMenu' => 'CSV import',
'Menu:CSVImportMenu+' => '',
'Menu:DataModelMenu' => 'Adatmodell',
'Menu:DataModelMenu+' => '',
'Menu:ExportMenu' => 'Export',
@@ -44,8 +42,6 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Menu:Notifications:Title' => 'Audit kategóriák',
'Menu:RunQueriesMenu' => 'Lekérdezés futtatás',
'Menu:RunQueriesMenu+' => '',
'Menu:DataAdministration' => 'Adat adminisztráció',
'Menu:DataAdministration+' => '',
'Menu:UniversalSearchMenu' => 'Univerzális keresés',
'Menu:UniversalSearchMenu+' => '',
'Menu:UserManagementMenu' => 'Felhasználó menedzsment',

View File

@@ -31,8 +31,6 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Menu:AdminTools' => 'Strumenti di amministrazione',
'Menu:AdminTools+' => '',
'Menu:AdminTools?' => 'Strumenti accessibile solo agli utenti con il profilo di amministratore',
'Menu:CSVImportMenu' => 'Importazione CSV',
'Menu:CSVImportMenu+' => '',
'Menu:DataModelMenu' => 'Modello Dati',
'Menu:DataModelMenu+' => '',
'Menu:ExportMenu' => 'Esporta',
@@ -44,8 +42,6 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Menu:Notifications:Title' => 'Categorie di Audit',
'Menu:RunQueriesMenu' => 'Esegui query',
'Menu:RunQueriesMenu+' => '',
'Menu:DataAdministration' => 'Dati di amministrazione',
'Menu:DataAdministration+' => '',
'Menu:UniversalSearchMenu' => 'Ricerca universale',
'Menu:UniversalSearchMenu+' => '',
'Menu:UserManagementMenu' => 'Gestione degli utenti',

View File

@@ -31,8 +31,6 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Menu:AdminTools' => '管理ツール',
'Menu:AdminTools+' => '管理ツール',
'Menu:AdminTools?' => 'このツールは管理者プロフィールを持つユーザのみアクセスが可能です。',
'Menu:CSVImportMenu' => 'CSV インポート',
'Menu:CSVImportMenu+' => '一括作成/一括更新',
'Menu:DataModelMenu' => 'データモデル',
'Menu:DataModelMenu+' => 'データモデル概要',
'Menu:ExportMenu' => 'エクスポート',
@@ -46,8 +44,6 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Menu:RunQueriesMenu+' => '任意のクエリを実行',
'Menu:QueryMenu' => 'クエリのフレーズブック',
'Menu:QueryMenu+' => 'クエリのフレーズブック',
'Menu:DataAdministration' => 'データ管理',
'Menu:DataAdministration+' => 'データ管理',
'Menu:UniversalSearchMenu' => '全検索',
'Menu:UniversalSearchMenu+' => '何か...検索',
'Menu:UserManagementMenu' => 'ユーザ管理',

View File

@@ -44,12 +44,6 @@ class ItopWelcome extends ModuleHandlerAPI
{
public static function OnMenuCreation()
{
//$oWelcomeMenu = new MenuGroup('WelcomeMenu', 10 /* fRank */);
//new DashboardMenuNode('WelcomeMenuPage', dirname(__FILE__).'/welcome_menu.xml', $oWelcomeMenu->GetIndex() /* oParent */, 1 /* fRank */);
$oToolsMenu = new MenuGroup('DataAdministration', 70 /* fRank */, 'Organization', UR_ACTION_MODIFY, UR_ALLOWED_YES|UR_ALLOWED_DEPENDS);
new WebPageMenuNode('CSVImportMenu', utils::GetAbsoluteUrlAppRoot().'pages/csvimport.php', $oToolsMenu->GetIndex(), 1 /* fRank */);
// Add the admin menus
if (UserRights::IsAdministrator())
{

View File

@@ -31,8 +31,6 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:AdminTools' => 'Ferramentas Administrativas',
'Menu:AdminTools+' => 'Ferramentas Administrativas',
'Menu:AdminTools?' => 'Ferramentas acessíveis apenas para usuários com o perfil do administrador',
'Menu:CSVImportMenu' => 'Importar CSV',
'Menu:CSVImportMenu+' => 'Criação ou atualização em massa',
'Menu:DataModelMenu' => 'Modelo Dados',
'Menu:DataModelMenu+' => 'Visão geral do Modelo Dados',
'Menu:ExportMenu' => 'Exportar',
@@ -46,8 +44,6 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Menu:RunQueriesMenu+' => 'Executar qualquer consulta',
'Menu:QueryMenu' => 'Consulta definida',
'Menu:QueryMenu+' => 'Consulta definida',
'Menu:DataAdministration' => 'Administração Dados',
'Menu:DataAdministration+' => 'Administração Dados',
'Menu:UniversalSearchMenu' => 'Pesquisa Universal',
'Menu:UniversalSearchMenu+' => 'Pesquisar por nada...',
'Menu:UserManagementMenu' => 'Gerenciamento Usuários',

View File

@@ -31,8 +31,6 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'Menu:AdminTools' => 'Инструменты админа',
'Menu:AdminTools+' => 'Административные инструменты',
'Menu:AdminTools?' => 'Инструменты доступны только для пользователей, имеющих профиль администратора',
'Menu:CSVImportMenu' => 'Импорт CSV',
'Menu:CSVImportMenu+' => 'Пакетное создание или обновление',
'Menu:DataModelMenu' => 'Модель данных',
'Menu:DataModelMenu+' => 'Обзор модели данных',
'Menu:ExportMenu' => 'Экспорт',
@@ -46,8 +44,6 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'Menu:RunQueriesMenu+' => 'Выполнение любых запросов',
'Menu:QueryMenu' => 'Книга запросов',
'Menu:QueryMenu+' => 'Query phrasebook',
'Menu:DataAdministration' => 'Административные данные',
'Menu:DataAdministration+' => 'Административные данные',
'Menu:UniversalSearchMenu' => 'Универсальный поиск',
'Menu:UniversalSearchMenu+' => 'Поиск чего угодно...',
'Menu:UserManagementMenu' => 'Управление пользователями',

View File

@@ -29,8 +29,6 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'Menu:AdminTools' => 'Yönetim Araçları',
'Menu:AdminTools+' => 'Yönetim Araçları',
'Menu:AdminTools?' => 'Yönetici profiline izin verilen araçlar',
'Menu:CSVImportMenu' => 'CSV dışardan al',
'Menu:CSVImportMenu+' => 'Çoklu yaratım veya güncelleme',
'Menu:DataModelMenu' => 'Veri Modeli',
'Menu:DataModelMenu+' => 'Veri Modeli Özeti',
'Menu:ExportMenu' => 'Dışarı ver',
@@ -42,8 +40,6 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'Menu:Notifications:Title' => 'Denetleme Kategorileri',
'Menu:RunQueriesMenu' => 'Sorgu çalıştır',
'Menu:RunQueriesMenu+' => 'Sorgu çalıştır',
'Menu:DataAdministration' => 'Veri Yönetimi',
'Menu:DataAdministration+' => 'Veri Yönetimi',
'Menu:UniversalSearchMenu' => 'Genel sorgu',
'Menu:UniversalSearchMenu+' => 'Herhangi bir arama...',
'Menu:UserManagementMenu' => 'Kullanıcı Yönetimi',

View File

@@ -29,8 +29,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:AdminTools' => '管理工具',
'Menu:AdminTools+' => '管理工具',
'Menu:AdminTools?' => '具有系统管理员简档的用户才能获得的工具',
'Menu:CSVImportMenu' => 'CSV 导入',
'Menu:CSVImportMenu+' => '大批量创建或修改',
'Menu:DataModelMenu' => '数据模型',
'Menu:DataModelMenu+' => '数据模型概览',
'Menu:ExportMenu' => '导出',
@@ -42,8 +40,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Menu:Notifications:Title' => '审计类目',
'Menu:RunQueriesMenu' => '运行查询',
'Menu:RunQueriesMenu+' => '运行任何查询',
'Menu:DataAdministration' => '数据管理',
'Menu:DataAdministration+' => '数据管理',
'Menu:UniversalSearchMenu' => '通用搜索',
'Menu:UniversalSearchMenu+' => '搜索所有...',
'Menu:UserManagementMenu' => '用户管理',

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,968 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
//
// 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/>
/**
* @author Erik Bøg <erik@boegmoeller.dk>
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @licence http://opensource.org/licenses/AGPL-3.0
*/
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Class:QueryOQL' => 'OQL forespørgsel',
'Class:QueryOQL+' => '',
'Class:QueryOQL/Attribute:oql' => 'Udtryk',
'Class:QueryOQL/Attribute:oql+' => '',
'Class:ShortcutOQL' => 'Søge resultat genvej',
'Class:ShortcutOQL+' => '',
'Class:ShortcutOQL/Attribute:oql' => 'Søgning',
'Class:ShortcutOQL/Attribute:oql+' => '',
'Class:AuditRule' => 'Audit-regel',
'Class:AuditRule+' => 'En regel til at efterprøve den angivne Audit-kategori med',
'Class:AuditRule/Attribute:name' => 'Regel Navn',
'Class:AuditRule/Attribute:name+' => 'Kort navn for denne regel',
'Class:AuditRule/Attribute:description' => 'Audit-regel beskrivelse',
'Class:AuditRule/Attribute:description+' => 'Udførlig beskrivelse af denne Audit-regel',
'Class:AuditRule/Attribute:query' => 'Søgning at udføre',
'Class:AuditRule/Attribute:query+' => 'Den OQL forespørgsel, der skal udføres',
'Class:AuditRule/Attribute:valid_flag' => 'Gyldige objekter?',
'Class:AuditRule/Attribute:valid_flag+' => 'Sand, hvis reglen returnerer et gyldigt objekt, ellers Falsk',
'Class:AuditRule/Attribute:valid_flag/Value:false' => 'Falsk',
'Class:AuditRule/Attribute:valid_flag/Value:false+' => 'Falsk',
'Class:AuditRule/Attribute:valid_flag/Value:true' => 'Sand',
'Class:AuditRule/Attribute:valid_flag/Value:true+' => 'Sand',
'Class:AuditRule/Attribute:category_id' => 'Kategori',
'Class:AuditRule/Attribute:category_id+' => 'Kategori for denne regel',
'Class:AuditCategory' => 'Audit-kategori',
'Class:AuditCategory+' => 'Udsnit af alle Audits',
'Class:AuditCategory/Attribute:name' => 'Kategori navn',
'Class:AuditCategory/Attribute:name+' => 'Kort navn for denne kategori',
'Class:AuditCategory/Attribute:description' => 'Beskrivelse af Audit-kategori',
'Class:AuditCategory/Attribute:description+' => 'Udførlig beskrivelse af denne Audit-kategori',
'Class:AuditCategory/Attribute:definition_set' => 'Definition Set',
'Class:AuditCategory/Attribute:definition_set+' => 'OQL begreber, der definerer omfanget af objekter, der skal auditeres',
'Class:AuditCategory/Attribute:rules_list' => 'Audit-regler',
'Class:AuditCategory/Attribute:rules_list+' => 'Audit-regler for denne kategori',
'Class:URP_Profiles' => 'Profil',
'Class:URP_Profiles+' => 'Brugerprofil',
'Class:URP_Profiles/Attribute:name' => 'Navn',
'Class:URP_Profiles/Attribute:name+' => 'Label',
'Class:URP_Profiles/Attribute:description' => 'Beskrivele',
'Class:URP_Profiles/Attribute:description+' => 'Kort beskrivelse',
'Class:URP_Profiles/Attribute:user_list' => 'Brugere',
'Class:URP_Profiles/Attribute:user_list+' => 'Personer, der har denne Rolle',
'Class:URP_UserProfile' => 'Brugerprofil',
'Class:URP_UserProfile+' => 'Brugerprofil',
'Class:URP_UserProfile/Attribute:userid' => 'Bruger',
'Class:URP_UserProfile/Attribute:userid+' => 'Brugerkonto',
'Class:URP_UserProfile/Attribute:profileid' => 'Profil',
'Class:URP_UserProfile/Attribute:profileid+' => 'Anvend profil',
'Class:URP_UserProfile/Attribute:reason' => 'Begrundelse',
'Class:URP_UserProfile/Attribute:reason+' => 'Begrundelse, hvorfor denne bruger skal have denne profil',
'Class:URP_UserOrg' => 'Bruger organisation(er)',
'Class:URP_UserOrg+' => 'Tilladte organisation(er)',
'Class:URP_UserOrg/Attribute:userid' => 'Bruger',
'Class:URP_UserOrg/Attribute:userid+' => '',
'Class:URP_UserOrg/Attribute:allowed_org_id' => 'Organisation',
'Class:URP_UserOrg/Attribute:allowed_org_id+' => '',
'Class:URP_UserOrg/Attribute:reason' => 'Begrundelse',
'Class:URP_UserOrg/Attribute:reason+' => '',
'Class:AuditRule/Attribute:category_name' => 'Kategori',
'Class:AuditRule/Attribute:category_name+' => 'Kategorinavn for denne regel',
'Class:Query' => 'Forespørgsel',
'Class:Query+' => '',
'Class:Query/Attribute:name' => 'Navn',
'Class:Query/Attribute:name+' => '',
'Class:Query/Attribute:description' => 'Beskrivelse',
'Class:Query/Attribute:description+' => '',
'Class:Query/Attribute:fields' => 'Felter',
'Class:Query/Attribute:fields+' => '',
'Class:User' => 'Bruger',
'Class:User+' => 'Bruger log in',
'Class:User/Attribute:finalclass' => 'Type af brugerkonto',
'Class:User/Attribute:finalclass+' => '',
'Class:User/Attribute:contactid' => 'kontakt (person)',
'Class:User/Attribute:contactid+' => 'Personlige oplysninger og virksomheds data',
'Class:User/Attribute:last_name' => 'Efternavn',
'Class:User/Attribute:last_name+' => 'Kontaktens efternavn',
'Class:User/Attribute:first_name' => 'Fornavn',
'Class:User/Attribute:first_name+' => 'Kontaktens fornavn',
'Class:User/Attribute:email' => 'Email-adresse',
'Class:User/Attribute:email+' => 'Kontaktens Email-adresse',
'Class:User/Attribute:login' => 'Login',
'Class:User/Attribute:login+' => 'Bruger navn',
'Class:User/Attribute:language' => 'Sprog',
'Class:User/Attribute:language+' => 'Bruger valgt sprog',
'Class:User/Attribute:language/Value:EN US' => 'Englsk',
'Class:User/Attribute:language/Value:EN US+' => 'English (U.S.)',
'Class:User/Attribute:language/Value:FR FR' => 'Fransk',
'Class:User/Attribute:language/Value:FR FR+' => 'French (France)',
'Class:User/Attribute:profile_list' => 'Profiler',
'Class:User/Attribute:profile_list+' => 'Roller, rettighedsstyring for denne person',
'Class:User/Attribute:allowed_org_list' => 'Tilladte organisation(er)',
'Class:User/Attribute:allowed_org_list+' => 'Brugeren har tilladelse til at se data om følgende organisationer. Hvis ingen organisation er vist, er der ingen indskrænkninger',
'Class:User/Error:LoginMustBeUnique' => 'Login skal være entydig - "%1s" er allerede i brug.',
'Class:User/Error:AtLeastOneProfileIsNeeded' => 'Mindst en profil skal knyttes til denne bruger.',
'Class:URP_Dimensions' => 'Dimension',
'Class:URP_Dimensions+' => 'Anvendelsesdimension (Fastlæggelse af siloer)',
'Class:URP_Dimensions/Attribute:name' => 'Navn',
'Class:URP_Dimensions/Attribute:name+' => 'Label',
'Class:URP_Dimensions/Attribute:description' => 'Beskrivelse',
'Class:URP_Dimensions/Attribute:description+' => 'Kort beskrivelse',
'Class:URP_Dimensions/Attribute:type' => 'Type',
'Class:URP_Dimensions/Attribute:type+' => 'Klassenavn eller datatype',
'Class:URP_UserProfile/Attribute:userlogin' => 'Login',
'Class:URP_UserProfile/Attribute:userlogin+' => 'Bruger login',
'Class:URP_UserProfile/Attribute:profile' => 'Profil',
'Class:URP_UserProfile/Attribute:profile+' => 'Profilnavn',
'Class:URP_UserOrg/Attribute:userlogin' => 'Login',
'Class:URP_UserOrg/Attribute:userlogin+' => '',
'Class:URP_UserOrg/Attribute:allowed_org_name' => 'Organisation',
'Class:URP_UserOrg/Attribute:allowed_org_name+' => '',
'Class:URP_ProfileProjection' => 'Profil_projection',
'Class:URP_ProfileProjection+' => 'Profilbillede',
'Class:URP_ProfileProjection/Attribute:dimensionid' => 'Dimension',
'Class:URP_ProfileProjection/Attribute:dimensionid+' => 'Anvendelsesdimension',
'Class:URP_ProfileProjection/Attribute:dimension' => 'Dimension',
'Class:URP_ProfileProjection/Attribute:dimension+' => 'Anvendelsesdimension',
'Class:URP_ProfileProjection/Attribute:profileid' => 'Profile',
'Class:URP_ProfileProjection/Attribute:profileid+' => 'Profil vilkår',
'Class:URP_ProfileProjection/Attribute:profile' => 'Profil',
'Class:URP_ProfileProjection/Attribute:profile+' => 'Profilnavn',
'Class:URP_ProfileProjection/Attribute:value' => 'Værdi udtryk',
'Class:URP_ProfileProjection/Attribute:value+' => 'OQL-udtryk (Benyttes af $user) | konstant | | + Attribut-Code',
'Class:URP_ProfileProjection/Attribute:attribute' => 'Attribut',
'Class:URP_ProfileProjection/Attribute:attribute+' => 'Mål for Attribut-kode (valgfri)',
'Class:URP_ClassProjection' => 'Klasse_projection',
'Class:URP_ClassProjection+' => 'Klassebillede',
'Class:URP_ClassProjection/Attribute:dimensionid' => 'Dimension',
'Class:URP_ClassProjection/Attribute:dimensionid+' => 'Anvendelsesdimension',
'Class:URP_ClassProjection/Attribute:dimension' => 'Dimension',
'Class:URP_ClassProjection/Attribute:dimension+' => 'Anvendelsesdimension',
'Class:URP_ClassProjection/Attribute:class' => 'Klasse',
'Class:URP_ClassProjection/Attribute:class+' => 'Målklasse',
'Class:URP_ClassProjection/Attribute:value' => 'Værdi udtryk',
'Class:URP_ClassProjection/Attribute:value+' => 'OQL-udtryk (Benyttes af $this) | konstant | | + Attribut-Code',
'Class:URP_ClassProjection/Attribute:attribute' => 'Attribut',
'Class:URP_ClassProjection/Attribute:attribute+' => 'Mål for Attribut-kode (valgfri)',
'Class:URP_ActionGrant' => 'Handlings godkendelser',
'Class:URP_ActionGrant+' => 'Tilladelser på klasser',
'Class:URP_ActionGrant/Attribute:profileid' => 'Profil',
'Class:URP_ActionGrant/Attribute:profileid+' => 'Anvendelsesprofil',
'Class:URP_ActionGrant/Attribute:profile' => 'Profil',
'Class:URP_ActionGrant/Attribute:profile+' => 'Anvendelsesprofil',
'Class:URP_ActionGrant/Attribute:class' => 'Klasse',
'Class:URP_ActionGrant/Attribute:class+' => 'Målklasse',
'Class:URP_ActionGrant/Attribute:permission' => 'Tilladelse',
'Class:URP_ActionGrant/Attribute:permission+' => 'Tilladt eller nægtet?',
'Class:URP_ActionGrant/Attribute:permission/Value:yes' => 'Ja',
'Class:URP_ActionGrant/Attribute:permission/Value:yes+' => 'Ja',
'Class:URP_ActionGrant/Attribute:permission/Value:no' => 'Nej',
'Class:URP_ActionGrant/Attribute:permission/Value:no+' => 'Nej',
'Class:URP_ActionGrant/Attribute:action' => 'Handling',
'Class:URP_ActionGrant/Attribute:action+' => 'Handling som skal udføres på den valgte klasse',
'Class:URP_StimulusGrant' => 'Tilladels til påvirkning',
'Class:URP_StimulusGrant+' => 'Tilladelserne til påvirkning af livscyklus af objektet',
'Class:URP_StimulusGrant/Attribute:profileid' => 'Profil',
'Class:URP_StimulusGrant/Attribute:profileid+' => 'Anvendelsesprofil',
'Class:URP_StimulusGrant/Attribute:profile' => 'Profil',
'Class:URP_StimulusGrant/Attribute:profile+' => 'Anvendelsesprofil',
'Class:URP_StimulusGrant/Attribute:class' => 'Klasse',
'Class:URP_StimulusGrant/Attribute:class+' => 'Målklasse',
'Class:URP_StimulusGrant/Attribute:permission' => 'Tilladelse',
'Class:URP_StimulusGrant/Attribute:permission+' => 'Tilladt eller nægtet?',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes' => 'Js',
'Class:URP_StimulusGrant/Attribute:permission/Value:yes+' => 'Ja',
'Class:URP_StimulusGrant/Attribute:permission/Value:no' => 'Nej',
'Class:URP_StimulusGrant/Attribute:permission/Value:no+' => 'Nej',
'Class:URP_StimulusGrant/Attribute:stimulus' => 'Påvirkning',
'Class:URP_StimulusGrant/Attribute:stimulus+' => 'Påvirknings-kode',
'Class:URP_AttributeGrant' => 'Godkendelse af Attributter',
'Class:URP_AttributeGrant+' => 'Godkendelse af Attributter',
'Class:URP_AttributeGrant/Attribute:actiongrantid' => 'Tillad handling',
'Class:URP_AttributeGrant/Attribute:actiongrantid+' => 'Tillad handling',
'Class:URP_AttributeGrant/Attribute:attcode' => 'Attribut',
'Class:URP_AttributeGrant/Attribute:attcode+' => 'Attribut-kode',
'Menu:WelcomeMenu' => 'Velkomen',
'Menu:WelcomeMenu+' => 'Velkommen til iTop',
'Menu:WelcomeMenuPage' => 'Velkomen',
'Menu:WelcomeMenuPage+' => 'Velkommen til iTop',
'UI:WelcomeMenu:Title' => 'Velkommen til iTop',
'UI:WelcomeMenu:LeftBlock' => '<p>iTop er en komplet, OpenSource, webbaseret IT-Service-Management-Værktøj.</p>
<ul>Den inkluderer:
<li>En komplet CMDB (Configuration management database) til at dokumentere og styre IT-portfolioen.</li>
<li>Et Incident management modul til brug for sporing og kommunikation omkring alle spørgsmål vedrørende IT.</li>
<li>Et change management modul til planlægning og sporing af ændringer i IT miljøet.</li>
<li>En "known error database" til brug for at mindske tiden for løsning af hændelser.</li>
<li>Et outage modul til dokumentation for planlagt nedetid og advisering af relevante kontakter.</li>
<li>Dashboards for hurtigt overblik over IT.</li>
</ul>
<p>Alle moduler kan installeres, step by step, uafhængigt af hinanden.</p>',
'UI:WelcomeMenu:RightBlock' => '<p>iTop er service udbyder orienteret, det tillader let IT teknikere at administrere flere kunder eller organisationer.
<ul>iTop, leverer et feature-rich sæt af forretnings processer som:
<li>Forøger IT administrationens effektivitet</li>
<li>Drives IT operations performance</li>
<li>Improves customer satisfaction and provides executives with insights into business performance.</li>
</ul>
</p>
<p>iTop is completely open to be integrated within your current IT Management infrastructure.</p>
<p>
<ul>Adopting this new generation of IT Operational portal will help you to:
<li>Better manage a more and more complex IT environment.</li>
<li>Implement ITIL processes at your own pace.</li>
<li>Manage the most important asset of your IT: Documentation.</li>
</ul>
</p>~~',
'UI:WelcomeMenu:AllOpenRequests' => 'Åbne anmodninger: %1$d',
'UI:WelcomeMenu:MyCalls' => 'Mine brugerhenvendelser',
'UI:WelcomeMenu:OpenIncidents' => 'Åbne Incidents: %1$d',
'UI:WelcomeMenu:AllConfigItems' => 'Configuration Items: %1$d',
'UI:WelcomeMenu:MyIncidents' => 'Incidents tildelt mig',
'UI:AllOrganizations' => ' Alle Organisationer',
'UI:YourSearch' => 'Din Søgning',
'UI:LoggedAsMessage' => 'Logget ind som %1$s',
'UI:LoggedAsMessage+Admin' => 'Logget ind som %1$s (Administrator)',
'UI:Button:Logoff' => 'Log ud',
'UI:Button:GlobalSearch' => 'Søg',
'UI:Button:Search' => ' Søg ',
'UI:Button:Query' => ' Forespørgsel ',
'UI:Button:Ok' => 'Ok',
'UI:Button:Save' => 'Gem',
'UI:Button:Cancel' => 'Afbryd',
'UI:Button:Apply' => 'Anvend',
'UI:Button:Back' => ' << Tilbage ',
'UI:Button:Restart' => ' |<< Start igen ',
'UI:Button:Next' => ' Næste >> ',
'UI:Button:Finish' => ' Afslut ',
'UI:Button:DoImport' => ' Kør Importen ! ',
'UI:Button:Done' => ' Færdig ',
'UI:Button:SimulateImport' => ' Simuler Importen ',
'UI:Button:Test' => 'Test!',
'UI:Button:Evaluate' => ' Evaluér ',
'UI:Button:AddObject' => ' Tilføj... ',
'UI:Button:BrowseObjects' => ' Gennemse... ',
'UI:Button:Add' => ' Tilføj ',
'UI:Button:AddToList' => ' << Tilføj ',
'UI:Button:RemoveFromList' => ' Fjern >> ',
'UI:Button:FilterList' => ' Filter... ',
'UI:Button:Create' => ' Opret ',
'UI:Button:Delete' => ' Slet! ',
'UI:Button:Rename' => ' Omdøb... ',
'UI:Button:ChangePassword' => ' Skift Password ',
'UI:Button:ResetPassword' => ' Reset Password ',
'UI:SearchToggle' => 'Søg',
'UI:ClickToCreateNew' => 'Opret nyt objekt af typen %1$s ',
'UI:SearchFor_Class' => 'Søg efter objekter af typen %1$s ',
'UI:NoObjectToDisplay' => 'Ingen objekter at vise.',
'UI:Error:MandatoryTemplateParameter_object_id' => 'Parameter objekt_id er obligatorisk når link_attr er specificeret. Tjek definitionen af display skabelonen.',
'UI:Error:MandatoryTemplateParameter_target_attr' => 'Parameter objekt_id er obligatorisk når link_attr er specificeret. Tjek definitionen af display skabelonen.',
'UI:Error:MandatoryTemplateParameter_group_by' => 'Parameter group_by er obligatorisk. Tjek definitionen af display skabelonen.',
'UI:Error:InvalidGroupByFields' => 'Ugyldig liste af felter at gruppere efter: "%1$s".',
'UI:Error:UnsupportedStyleOfBlock' => 'Fejl: ikke understøttet blokform: "%1$s".',
'UI:Error:IncorrectLinkDefinition_LinkedClass_Class' => 'Ukorrekt link definition: klassen af objekter, der skal styres: %1$s blev ikke fundet som fremmednøgle i klassen %2$s',
'UI:Error:Object_Class_Id_NotFound' => 'Objekt: %1$s:%2$d ikke fundet.',
'UI:Error:WizardCircularReferenceInDependencies' => 'Fejl: Circulær reference i afhængigheder mellem felterne, tjek datamodellen.',
'UI:Error:UploadedFileTooBig' => 'Den uploadede fil er for stor. (Max tilladt størrelse er %1$s). Kontakt din iTop administrator for at få ændret denne grænse limit. (Tjek PHP konfigurationen for upload_max_filesize og post_max_size på serveren).',
'UI:Error:UploadedFileTruncated.' => 'Den uploadede fil er blevet afkortet !',
'UI:Error:NoTmpDir' => 'Det midlertidige bibliotek er ikke defineret.',
'UI:Error:CannotWriteToTmp_Dir' => 'Kan ikke skrive den midlertidige fil til disken: upload_tmp_dir = "%1$s".',
'UI:Error:UploadStoppedByExtension_FileName' => 'Upload stoppet på grund af filtype. (Original fil navn = "%1$s").',
'UI:Error:UploadFailedUnknownCause_Code' => 'Fil upload fejlede, ukendt årsag. (Fejl kode = "%1$s").',
'UI:Error:1ParametersMissing' => 'Fejl: følgende parameter skal angives for denne operation: %1$s.',
'UI:Error:2ParametersMissing' => 'Fejl: følgende parametre skal angives for denne operation: %1$s and %2$s.',
'UI:Error:3ParametersMissing' => 'Fejl: følgende parametre skal angives for denne operation: %1$s, %2$s and %3$s.',
'UI:Error:4ParametersMissing' => 'Fejl: følgende parametre skal angives for denne operation: %1$s, %2$s, %3$s and %4$s.',
'UI:Error:IncorrectOQLQuery_Message' => 'Fejl: Ukorrekt OQL forespørgsel: %1$s',
'UI:Error:AnErrorOccuredWhileRunningTheQuery_Message' => 'Der opstod en fejl ved afvikling af forespørgslen: %1$s',
'UI:Error:ObjectAlreadyUpdated' => 'Fejl: objektet er allerede opdateret.',
'UI:Error:ObjectCannotBeUpdated' => 'Fejl: objektet kan ikke opdateres.',
'UI:Error:ObjectsAlreadyDeleted' => 'Fejl: objekterne er allerede slettet!',
'UI:Error:BulkDeleteNotAllowedOn_Class' => 'Du har ikke tilladelse til at foretage en masse sletning af objekter i klassen %1$s',
'UI:Error:DeleteNotAllowedOn_Class' => 'Du har ikke tilladelse til at slette objekter af klassen %1$s',
'UI:Error:BulkModifyNotAllowedOn_Class' => 'Du har ikke tilladelse til at foretage en masse opdatering af objekter i klassen %1$s',
'UI:Error:ObjectAlreadyCloned' => 'Fejl: objektet er allerede klonet!',
'UI:Error:ObjectAlreadyCreated' => 'Fejl: objektet er allerede oprettet!',
'UI:Error:Invalid_Stimulus_On_Object_In_State' => 'Fejl: ikke lovlig påvirkning "%1$s" på objekt %2$s i tilstand "%3$s".',
'UI:GroupBy:Count' => 'Antal',
'UI:GroupBy:Count+' => 'Antal af elementer',
'UI:CountOfObjects' => '%1$d objekter opfylder kriteriet.',
'UI_CountOfObjectsShort' => '%1$d objekter.',
'UI:NoObject_Class_ToDisplay' => 'Ingen objekter af typen %1$s at vise.',
'UI:History:LastModified_On_By' => 'Sidst ændret den %1$s af %2$s.',
'UI:HistoryTab' => 'Historik',
'UI:NotificationsTab' => 'Bemærkninger',
'UI:History:BulkImports' => 'Historik',
'UI:History:BulkImports+' => '',
'UI:History:BulkImportDetails' => 'Ændringer som følge af CSV import foretaget den %1$s (af %2$s)',
'UI:History:Date' => 'Dato',
'UI:History:Date+' => 'Dato for ændring',
'UI:History:User' => 'Bruger',
'UI:History:User+' => 'Bruger, som gennemførte ændringen',
'UI:History:Changes' => 'Ændringer',
'UI:History:Changes+' => 'Ændringer som er gennemført på objektet',
'UI:History:StatsCreations' => 'Oprettet',
'UI:History:StatsCreations+' => 'Antal oprettede objekter',
'UI:History:StatsModifs' => 'Modified',
'UI:History:StatsModifs+' => 'Antal modificerede objekter',
'UI:History:StatsDeletes' => 'Slettet',
'UI:History:StatsDeletes+' => 'Antal slettede objekter',
'UI:Loading' => 'Henter...',
'UI:Menu:Actions' => 'Handlinger',
'UI:Menu:OtherActions' => 'Andre handlinger',
'UI:Menu:New' => 'Ny...',
'UI:Menu:Add' => 'Tilføj...',
'UI:Menu:Manage' => 'Administrer...',
'UI:Menu:EMail' => 'eMail',
'UI:Menu:CSVExport' => 'CSV Eksport',
'UI:Menu:Modify' => 'Modificer...',
'UI:Menu:Delete' => 'Slet...',
'UI:Menu:BulkDelete' => 'Slet...',
'UI:UndefinedObject' => 'Ikke defineret',
'UI:Document:OpenInNewWindow:Download' => 'Åben i nyt vindue: %1$s, Download: %2$s',
'UI:SelectAllToggle+' => 'Alle vælg/fravælg',
'UI:SplitDateTime-Date' => 'Dato',
'UI:SplitDateTime-Time' => 'Tid',
'UI:TruncatedResults' => '%1$d objekter vist ud af %2$d',
'UI:DisplayAll' => 'Vis Alle',
'UI:CollapseList' => 'Fold sammen',
'UI:CountOfResults' => '%1$d objekt(er)',
'UI:ChangesLogTitle' => 'Ændrings log (%1$d):',
'UI:EmptyChangesLogTitle' => 'Ændrings log er tom',
'UI:SearchFor_Class_Objects' => 'Søg efter %1$s Objekter',
'UI:OQLQueryBuilderTitle' => 'OQL Query Builder',
'UI:OQLQueryTab' => 'OQL Query',
'UI:SimpleSearchTab' => 'Simpel Søgning',
'UI:Details+' => 'Detaljer',
'UI:SearchValue:Any' => '* Enhver *',
'UI:SearchValue:Mixed' => '* Blandet *',
'UI:SearchValue:NbSelected' => '# Valgte',
'UI:SelectOne' => '-- Vælg venligst --',
'UI:Login:Welcome' => 'Velkommen til iTop!',
'UI:Login:IncorrectLoginPassword' => 'Ukorrekt login/adgangskode, venligst prøv igen.',
'UI:Login:IdentifyYourself' => 'Identificer dig før du fortsætter',
'UI:Login:UserNamePrompt' => 'Bruger Navn',
'UI:Login:PasswordPrompt' => 'Adgangskode',
'UI:Login:About' => 'Om',
'UI:Login:ChangeYourPassword' => 'Skift Adgangskode',
'UI:Login:OldPasswordPrompt' => 'Gammel Adgangskode',
'UI:Login:NewPasswordPrompt' => 'Ny Adgangskode',
'UI:Login:RetypeNewPasswordPrompt' => 'Gentag ny adgangskode',
'UI:Login:IncorrectOldPassword' => 'Fejl: den gamle adgangskode er forkert',
'UI:LogOffMenu' => 'Log ud',
'UI:LogOff:ThankYou' => 'Tak for at du brugte iTop',
'UI:LogOff:ClickHereToLoginAgain' => 'Klik her for at logge ind igen...',
'UI:ChangePwdMenu' => 'Skift Adgangskode...',
'UI:Login:PasswordChanged' => 'Adgangskode oprettet med success!',
'UI:AccessRO-All' => 'iTop er skrivebeskyttet',
'UI:AccessRO-Users' => 'iTop er skrivebeskyttet for slutbrugere',
'UI:ApplicationEnvironment' => 'Applikations miljø: %1$s',
'UI:Login:RetypePwdDoesNotMatch' => 'Ny adgangskode og gentaget adgangskode passer ikke sammen!',
'UI:Button:Login' => 'Enter iTop',
'UI:Login:Error:AccessRestricted' => 'iTop adgang er begrænset. Venligst, kontakt en iTop administrator.',
'UI:Login:Error:AccessAdmin' => 'Adgang er begrænset til administratorer. Venligst, kontakt en iTop administrator.',
'UI:CSVImport:MappingSelectOne' => '-- Vælg venligst --',
'UI:CSVImport:MappingNotApplicable' => '-- ignorer dette felt --',
'UI:CSVImport:NoData' => 'Tomt data sæt..., venligst angiv nogle data!',
'UI:Title:DataPreview' => 'Data Preview',
'UI:CSVImport:ErrorOnlyOneColumn' => 'Fejl: Data indeholder kun en kolonne. Har du valgt den korrekte separator?',
'UI:CSVImport:FieldName' => 'Felt %1$d',
'UI:CSVImport:DataLine1' => 'Data Linje 1',
'UI:CSVImport:DataLine2' => 'Data Linje 2',
'UI:CSVImport:idField' => 'id (Primær Nøgle)',
'UI:Title:BulkImport' => 'iTop - Bulk import',
'UI:Title:BulkImport+' => 'CSV-Import assistent',
'UI:Title:BulkSynchro_nbItem_ofClass_class' => 'Synchronisering af %1$d objekter af klasse %2$s',
'UI:CSVImport:ClassesSelectOne' => '-- Vælg venligst --~~',
'UI:CSVImport:ErrorExtendedAttCode' => 'Intern fejl: "%1$s" er en ukorrekt kode fordi "%2$s" er IKKE en fremmed nøgle af klassen "%3$s"',
'UI:CSVImport:ObjectsWillStayUnchanged' => '%1$d objekt(er) vil forblive uændrede.',
'UI:CSVImport:ObjectsWillBeModified' => '%1$d objekt(er) vil blive ændret.',
'UI:CSVImport:ObjectsWillBeAdded' => '%1$d objekt(er) vil blive tilføjet.',
'UI:CSVImport:ObjectsWillHaveErrors' => '%1$d objekt(er) har fejl.',
'UI:CSVImport:ObjectsRemainedUnchanged' => '%1$d objekt(er) forbliver uændrede.',
'UI:CSVImport:ObjectsWereModified' => '%1$d objekt(er) blev ændret.',
'UI:CSVImport:ObjectsWereAdded' => '%1$d objekt(er) blev tilføjet.',
'UI:CSVImport:ObjectsHadErrors' => '%1$d objekt(er) har fejl.',
'UI:Title:CSVImportStep2' => 'Step 2 af 5: CSV data muligheder',
'UI:Title:CSVImportStep3' => 'Step 3 of 5: Data mapping',
'UI:Title:CSVImportStep4' => 'Step 4 of 5: Import simulering',
'UI:Title:CSVImportStep5' => 'Step 5 of 5: Import fuldført',
'UI:CSVImport:LinesNotImported' => 'Linjer som ikke kunne loades:',
'UI:CSVImport:LinesNotImported+' => 'Dele som ikke kunne importeres, da de indeholder fejl',
'UI:CSVImport:SeparatorComma+' => ', (komma)',
'UI:CSVImport:SeparatorSemicolon+' => '; (semikolon)',
'UI:CSVImport:SeparatorTab+' => 'Tabulator',
'UI:CSVImport:SeparatorOther' => 'Andre:',
'UI:CSVImport:QualifierDoubleQuote+' => '" (anførselstegn)',
'UI:CSVImport:QualifierSimpleQuote+' => '\' (enkelt citationstegn)',
'UI:CSVImport:QualifierOther' => 'Andre:',
'UI:CSVImport:TreatFirstLineAsHeader' => 'Betragt første linje som overskrift (kolonnenavne)',
'UI:CSVImport:Skip_N_LinesAtTheBeginning' => 'Spring %1$s linje(r) over i begyndelsen af filen.',
'UI:CSVImport:CSVDataPreview' => 'CSV Data eksempel',
'UI:CSVImport:SelectFile' => 'Vælg den fil , der skal importeres:',
'UI:CSVImport:Tab:LoadFromFile' => 'Indlæs fra fil',
'UI:CSVImport:Tab:CopyPaste' => 'Kopier og indsæt data',
'UI:CSVImport:Tab:Templates' => 'Skabelon(er)',
'UI:CSVImport:PasteData' => 'Indsæt de data der skal importeres:',
'UI:CSVImport:PickClassForTemplate' => 'Vælg den skabelon der skal hentes: ',
'UI:CSVImport:SeparatorCharacter' => 'Separator karakter:',
'UI:CSVImport:TextQualifierCharacter' => 'Tekst qualifier karakter',
'UI:CSVImport:CommentsAndHeader' => 'Kommentarer og header',
'UI:CSVImport:SelectClass' => 'Vælg den klasse, der skal importeres: ',
'UI:CSVImport:AdvancedMode' => 'Advanceret tilstand',
'UI:CSVImport:AdvancedMode+' => 'I den avancerede tilstand, kan "ID" (primær nøgle) af objekter bruges til at opdatere eller omdøbe ojekter. Allers kan kolonnen "ID" (hvis nogen) kun bruges som en søgekriterium og kan ikke kombineres med andre søgekriterier.',
'UI:CSVImport:SelectAClassFirst' => 'For at konfigurere mapning, vælg først en klasse.',
'UI:CSVImport:HeaderFields' => 'Felter',
'UI:CSVImport:HeaderMappings' => 'Mapninger',
'UI:CSVImport:HeaderSearch' => 'Søg?',
'UI:CSVImport:AlertIncompleteMapping' => 'Vælg venligst en mapning for hvert felt.',
'UI:CSVImport:AlertNoSearchCriteria' => 'Vælg venligst mindst et søgekriterie',
'UI:CSVImport:Encoding' => 'Karakter encoding',
'UI:UniversalSearchTitle' => 'iTop - Universal Søgning',
'UI:UniversalSearch:Error' => 'Fejl: %1$s',
'UI:UniversalSearch:LabelSelectTheClass' => 'Vælg klasse at søge efter: ',
'UI:CSVReport-Value-Modified' => 'Ændret',
'UI:CSVReport-Value-SetIssue' => 'Kunne ikke ændres - årsag: %1$s',
'UI:CSVReport-Value-ChangeIssue' => 'Kunne ikke ændres til %1$s - årsag: %2$s',
'UI:CSVReport-Value-NoMatch' => 'No match',
'UI:CSVReport-Value-Missing' => 'Mangler obligatorisk værdi',
'UI:CSVReport-Value-Ambiguous' => 'Tvetydig: fandt %1$s objekter',
'UI:CSVReport-Row-Unchanged' => 'Uændret',
'UI:CSVReport-Row-Created' => 'Oprettet',
'UI:CSVReport-Row-Updated' => 'Opdateret %1$d kolonne(r)',
'UI:CSVReport-Row-Disappeared' => 'Forsvundet, ændrede %1$d kolonne(r)',
'UI:CSVReport-Row-Issue' => 'Emne: %1$s',
'UI:CSVReport-Value-Issue-Null' => 'Null ikke tilladt',
'UI:CSVReport-Value-Issue-NotFound' => 'Objekt ikke fundet',
'UI:CSVReport-Value-Issue-FoundMany' => 'Fandt %1$d emner',
'UI:CSVReport-Value-Issue-Readonly' => 'Attributten \'%1$s\' er skrivebeskyttet og kan ikke ændres (nuværende værdi: %2$s, foreslået værdi: %3$s)',
'UI:CSVReport-Value-Issue-Format' => 'Fejl i behandling af input: %1$s',
'UI:CSVReport-Value-Issue-NoMatch' => 'Uventet værdi for attribut \'%1$s\': ingen emner fundet, tjek stavningen',
'UI:CSVReport-Value-Issue-Unknown' => 'Uventet værdi for attribut \'%1$s\': %2$s',
'UI:CSVReport-Row-Issue-Inconsistent' => 'Attributterne er ikke i overensstemmelse med hinanden: %1$s',
'UI:CSVReport-Row-Issue-Attribute' => 'Uventet attribut værdi(er)',
'UI:CSVReport-Row-Issue-MissingExtKey' => 'Kunne ikke oprettes, på grund af manglende fremmednøgle(r): %1$s',
'UI:CSVReport-Row-Issue-DateFormat' => 'Forkert dato format',
'UI:CSVReport-Row-Issue-Reconciliation' => 'Fejl ved forening',
'UI:CSVReport-Row-Issue-Ambiguous' => 'Tvetydig forening',
'UI:CSVReport-Row-Issue-Internal' => 'Intern fejl: %1$s, %2$s',
'UI:CSVReport-Icon-Unchanged' => 'Uændret',
'UI:CSVReport-Icon-Modified' => 'Ændret',
'UI:CSVReport-Icon-Missing' => 'Mangler',
'UI:CSVReport-Object-MissingToUpdate' => 'Mangler objekt: vil blive opdateret',
'UI:CSVReport-Object-MissingUpdated' => 'Manglende objekt: opdateret',
'UI:CSVReport-Icon-Created' => 'Oprettet',
'UI:CSVReport-Object-ToCreate' => 'Objekt vil blive oprettet',
'UI:CSVReport-Object-Created' => 'Objekt oprettet',
'UI:CSVReport-Icon-Error' => 'Fejl',
'UI:CSVReport-Object-Error' => 'FEJL: %1$s',
'UI:CSVReport-Object-Ambiguous' => 'TVETYDIG: %1$s',
'UI:CSVReport-Stats-Errors' => '%1$.0f %% af de hentede objekter har fejl og vil blive ignoreret',
'UI:CSVReport-Stats-Created' => '%1$.0f %% af de hentede objekter vil blive oprettet.',
'UI:CSVReport-Stats-Modified' => '%1$.0f %% af de hentede objekter vil blive ændret.',
'UI:CSVExport:AdvancedMode' => 'Advanceret tilstand',
'UI:CSVExport:AdvancedMode+' => '',
'UI:CSVExport:LostChars' => 'Encoding problem',
'UI:CSVExport:LostChars+' => '',
'UI:Audit:Title' => 'iTop - CMDB Audit',
'UI:Audit:InteractiveAudit' => 'Interaktiv Audit',
'UI:Audit:HeaderAuditRule' => 'Audit Regel',
'UI:Audit:HeaderNbObjects' => '# Objekt(er)',
'UI:Audit:HeaderNbErrors' => '# Fejl',
'UI:Audit:PercentageOk' => '% Ok',
'UI:Audit:ErrorIn_Rule_Reason' => 'OQL Fejl i regel %1$s: %2$s.',
'UI:Audit:ErrorIn_Category_Reason' => 'OQL Fejl i kategorien %1$s: %2$s.',
'UI:RunQuery:Title' => 'iTop - OQL Query Evaluering',
'UI:RunQuery:QueryExamples' => 'Query Eksempler',
'UI:RunQuery:HeaderPurpose' => 'Formål',
'UI:RunQuery:HeaderPurpose+' => 'Beskrivelse af forespørgslen',
'UI:RunQuery:HeaderOQLExpression' => 'OQL Udtryk',
'UI:RunQuery:HeaderOQLExpression+' => 'Forespørgslen i OQL syntaks',
'UI:RunQuery:ExpressionToEvaluate' => 'Udtryk der skal evalueres: ',
'UI:RunQuery:MoreInfo' => 'Mere information om forespørgslen: ',
'UI:RunQuery:DevelopedQuery' => 'Videreudviklet forespørgselsudtryk: ',
'UI:RunQuery:SerializedFilter' => 'Serielt filter: ',
'UI:RunQuery:Error' => 'Der opstod en fejl under afviklingen af forespøgrslen: %1$s',
'UI:Query:UrlForExcel' => 'URL til brug for MS-Excel web forespøgrsler',
'UI:Schema:Title' => 'iTop objekt skema',
'UI:Schema:CategoryMenuItem' => 'Kategori <b>%1$s</b>',
'UI:Schema:Relationships' => 'Relationer',
'UI:Schema:AbstractClass' => 'Abstrakt klasse: intet objekt fra denne klasse kan instantieres.',
'UI:Schema:NonAbstractClass' => 'Non abstrakt klasse: objekter fra denne klasse kan instantieres.',
'UI:Schema:ClassHierarchyTitle' => 'Klasse hierarki',
'UI:Schema:AllClasses' => 'Alle klasser',
'UI:Schema:ExternalKey_To' => 'Fremmednøgle til %1$s',
'UI:Schema:Columns_Description' => 'Kolonner: <em>%1$s</em>',
'UI:Schema:Default_Description' => 'Standard: "%1$s"',
'UI:Schema:NullAllowed' => 'Null Tilladt',
'UI:Schema:NullNotAllowed' => 'Null IKKE Tilladt',
'UI:Schema:Attributes' => 'Attributter',
'UI:Schema:AttributeCode' => 'Attribut Kode',
'UI:Schema:AttributeCode+' => 'Interne kode for attributter',
'UI:Schema:Label' => 'Label',
'UI:Schema:Label+' => 'Label for attributten',
'UI:Schema:Type' => 'Type',
'UI:Schema:Type+' => 'Datatype for attributten',
'UI:Schema:Origin' => 'Oprindelse',
'UI:Schema:Origin+' => 'Basisklasse, hvor denne attribut er defineret',
'UI:Schema:Description' => 'Beskrivelse',
'UI:Schema:Description+' => 'Beskrivelse af disse attributter',
'UI:Schema:AllowedValues' => 'Tilladte værdier',
'UI:Schema:AllowedValues+' => '',
'UI:Schema:MoreInfo' => 'Mere information',
'UI:Schema:MoreInfo+' => 'Mere information om dette felt',
'UI:Schema:SearchCriteria' => 'Søgekriterie',
'UI:Schema:FilterCode' => 'Filter kode',
'UI:Schema:FilterCode+' => 'Kode for dette søgekriterie',
'UI:Schema:FilterDescription' => 'Beskrivelse',
'UI:Schema:FilterDescription+' => 'Beskrivelse af dette søgekriterie',
'UI:Schema:AvailOperators' => 'Tilgængelige operatorer',
'UI:Schema:AvailOperators+' => 'Mulige operatorer for dette søgekriterie',
'UI:Schema:ChildClasses' => 'Child klasser',
'UI:Schema:ReferencingClasses' => 'Refererende klasser',
'UI:Schema:RelatedClasses' => 'Relaterede klasser',
'UI:Schema:LifeCycle' => 'Livs cyclus',
'UI:Schema:Triggers' => 'Triggere',
'UI:Schema:Relation_Code_Description' => 'Relation <em>%1$s</em> (%2$s)',
'UI:Schema:RelationDown_Description' => 'Ned: %1$s',
'UI:Schema:RelationUp_Description' => 'Op: %1$s',
'UI:Schema:RelationPropagates' => '%1$s: udbred til %2$d niveauer, forespørgsel: %3$s',
'UI:Schema:RelationDoesNotPropagate' => '%1$s: udbred ikke til (%2$d niveauer), forespørsel: %3$s',
'UI:Schema:Class_ReferencingClasses_From_By' => '%1$s bliver refereret af klasse %2$s via feltet %3$s',
'UI:Schema:Class_IsLinkedTo_Class_Via_ClassAndAttribute' => '%1$s er kædet til %2$s via %3$s::<em>%4$s</em>',
'UI:Schema:Links:1-n' => 'Klasser peger på %1$s (1:n links):',
'UI:Schema:Links:n-n' => 'Klasser kædet til %1$s (n:n links):',
'UI:Schema:Links:All' => 'Graf af alle relaterede klasser',
'UI:Schema:NoLifeCyle' => 'Der er ingen livscyclus defineret for denne klasse.',
'UI:Schema:LifeCycleTransitions' => 'Overgange',
'UI:Schema:LifeCyleAttributeOptions' => 'Attribut options',
'UI:Schema:LifeCycleHiddenAttribute' => 'Skjult',
'UI:Schema:LifeCycleReadOnlyAttribute' => 'Skrivebeskyttet',
'UI:Schema:LifeCycleMandatoryAttribute' => 'Obligatorisk',
'UI:Schema:LifeCycleAttributeMustChange' => 'Skal ændres',
'UI:Schema:LifeCycleAttributeMustPrompt' => 'Bruger vil blive bedt om at ændre værdien',
'UI:Schema:LifeCycleEmptyList' => 'Tom liste',
'UI:LinksWidget:Autocomplete+' => '',
'UI:Edit:TestQuery' => 'Test forespørgsel',
'UI:Combo:SelectValue' => '--- vælg en værdi ---',
'UI:Label:SelectedObjects' => 'Valgte objekter: ',
'UI:Label:AvailableObjects' => 'Tilgængelige objekter: ',
'UI:Link_Class_Attributes' => '%1$s attributer',
'UI:AddObjectsOf_Class_LinkedWith_Class_Instance' => 'Tilføj %1$s objekter kædet til %2$s: %3$s',
'UI:AddObjectsOf_Class_LinkedWith_Class' => 'Tilføj %1$s objekter til kæden til %2$s',
'UI:ManageObjectsOf_Class_LinkedWith_Class_Instance' => 'Administrer %1$s objekter kædet til %2$s: %3$s',
'UI:AddLinkedObjectsOf_Class' => 'Tilføj %1$ss...',
'UI:RemoveLinkedObjectsOf_Class' => 'Fjern valgte objekter',
'UI:Message:EmptyList:UseAdd' => 'Listen er tom, brug "Tilføj..." knappen for at tilføje elementer.',
'UI:Message:EmptyList:UseSearchForm' => 'Brug søgeformularen ovenfor, til søgning efter objekters som skal tilføjes.',
'UI:Wizard:FinalStepTitle' => 'Sidste skridt: bekræftelse',
'UI:Title:DeletionOf_Object' => 'Sletning af %1$s',
'UI:Title:BulkDeletionOf_Count_ObjectsOf_Class' => 'Massesletning af %1$d objekter af klassen %2$s',
'UI:Delete:NotAllowedToDelete' => 'Du har ikke tilladelse til at slette dette objekt',
'UI:Delete:NotAllowedToUpdate_Fields' => 'Du har ikke tilladelse til at opdatere følgende felt(er): %1$s',
'UI:Error:NotEnoughRightsToDelete' => 'Dette objekt kunne ikke slettes, fordi den nuværende bruger ikke har tilstrækkelige rettigheder',
'UI:Error:CannotDeleteBecause' => 'Dette objekt kunne ikke slettes fordi: %1$s',
'UI:Error:CannotDeleteBecauseOfDepencies' => 'Dette objekt kunne ikke slettes, fordi nogle manuelle operationer skal udføres først',
'UI:Error:CannotDeleteBecauseManualOpNeeded' => 'Dette objekt kunne ikke slettes, fordi nogle manuelle operationer skal udføres først',
'UI:Archive_User_OnBehalfOf_User' => '%1$s på vegne af %2$s',
'UI:Delete:Deleted' => 'Slettet',
'UI:Delete:AutomaticallyDeleted' => 'Automatisk slettet',
'UI:Delete:AutomaticResetOf_Fields' => 'Automatisk reset af felt(er): %1$s',
'UI:Delete:CleaningUpRefencesTo_Object' => 'Oprydning af alle referencer til %1$s...',
'UI:Delete:CleaningUpRefencesTo_Several_ObjectsOf_Class' => 'Oprydning af alle referencer til %1$d objekter af klasse %2$s...',
'UI:Delete:Done+' => '',
'UI:Delete:_Name_Class_Deleted' => '%1$s - %2$s slettet.',
'UI:Delete:ConfirmDeletionOf_Name' => 'Sletning af %1$s',
'UI:Delete:ConfirmDeletionOf_Count_ObjectsOf_Class' => 'Sletning af %1$d objekter af klasse %2$s',
'UI:Delete:CannotDeleteBecause' => 'Kunne ikke slettes: %1$s',
'UI:Delete:ShouldBeDeletedAtomaticallyButNotPossible' => 'Bør automatisk slettes, men dette ikke er muligt: %1$s',
'UI:Delete:MustBeDeletedManuallyButNotPossible' => 'Bør automatisk slettes, men dette ikke er muligt: %1$s',
'UI:Delete:WillBeDeletedAutomatically' => 'Vil automatisk blive slettet',
'UI:Delete:MustBeDeletedManually' => 'Skal slettes manuelt',
'UI:Delete:CannotUpdateBecause_Issue' => 'Skulle blive automatisk opdateret, men: %1$s',
'UI:Delete:WillAutomaticallyUpdate_Fields' => 'Vil blive automatisk opdateret (reset: %1$s)',
'UI:Delete:Count_Objects/LinksReferencing_Object' => '%1$d objekter/links refererer %2$s',
'UI:Delete:Count_Objects/LinksReferencingTheObjects' => '%1$d objekter/links refererer til nogle af de objekter som slettes',
'UI:Delete:ReferencesMustBeDeletedToEnsureIntegrity' => 'For at sikre Database integritet, skal alle referencer slettes',
'UI:Delete:Consequence+' => '',
'UI:Delete:SorryDeletionNotAllowed' => 'Beklager, du har ikke tilladelse til at slette dette objekt, se the detaljeret forklaring ovenfor',
'UI:Delete:PleaseDoTheManualOperations' => 'Venligst foretag den manuelle opreration som er nævnt ovenfor, før sletning af objektet',
'UI:Delect:Confirm_Object' => 'Venligst bekræft at du ønsker at slette %1$s.',
'UI:Delect:Confirm_Count_ObjectsOf_Class' => 'Venligst bekræft at du ønsker at slette følgende %1$d objekter af klassen %2$s.',
'UI:WelcomeToITop' => 'Velkommen til iTop',
'UI:DetailsPageTitle' => 'iTop - %1$s - %2$s detaljer',
'UI:ErrorPageTitle' => 'iTop - Fejl',
'UI:ObjectDoesNotExist' => 'Beklager, dette objekt eksisterer ikke (eller du har ikke tilladelse til at se det).',
'UI:SearchResultsPageTitle' => 'iTop - Søge Resultater',
'UI:Search:NoSearch' => 'Intet at søge efter',
'UI:FullTextSearchTitle_Text' => 'Resultater for "%1$s":',
'UI:Search:Count_ObjectsOf_Class_Found' => '%1$d objekt(er) af klasse %2$s fundet.',
'UI:Search:NoObjectFound' => 'Intet objekt fundet.',
'UI:ModificationPageTitle_Object_Class' => 'iTop - %1$s - %2$s ændring',
'UI:ModificationTitle_Class_Object' => 'Ændring af %1$s: <span class=\"hilite\">%2$s</span>',
'UI:ClonePageTitle_Object_Class' => 'iTop - Clone %1$s - %2$s ændring',
'UI:CloneTitle_Class_Object' => 'Clone af %1$s: <span class=\"hilite\">%2$s</span>~~',
'UI:CreationPageTitle_Class' => 'iTop - Oprettelse af ny %1$s ',
'UI:CreationTitle_Class' => 'Oprettelse af ny %1$s',
'UI:SelectTheTypeOf_Class_ToCreate' => 'Vælg type af %1$s for oprettelse:',
'UI:Class_Object_NotUpdated' => 'Ingen ændring, %1$s (%2$s) er <strong>not</strong> ændret.',
'UI:Class_Object_Updated' => '%1$s (%2$s) opdateret.',
'UI:BulkDeletePageTitle' => 'iTop - Massesletning',
'UI:BulkDeleteTitle' => 'Vælg objekt som ønskes slettet:',
'UI:PageTitle:ObjectCreated' => 'iTop Objekt Oprettet.',
'UI:Title:Object_Of_Class_Created' => '%1$s - %2$s oprettet.',
'UI:Apply_Stimulus_On_Object_In_State_ToTarget_State' => 'Anvender %1$s på objekt: %2$s i tilstand %3$s for sluttilstand: %4$s.',
'UI:ObjectCouldNotBeWritten' => 'Objektet kunne ikke skrives: %1$s',
'UI:PageTitle:FatalError' => 'iTop - Fatal Fejl',
'UI:SystemIntrusion' => 'Adgang nægtet. Du prøver at udføre en handling som du ikke har tilladelse til.',
'UI:FatalErrorMessage' => 'Fatal fejl, iTop kan ikke fortsætte.',
'UI:Error_Details' => 'Fejl: %1$s.',
'UI:PageTitle:ClassProjections' => 'iTop bruger styring - klasse projection',
'UI:PageTitle:ProfileProjections' => 'iTop bruger styring - profil projection',
'UI:UserManagement:Class' => 'Klasse',
'UI:UserManagement:Class+' => '',
'UI:UserManagement:ProjectedObject' => 'Objekt',
'UI:UserManagement:ProjectedObject+' => '',
'UI:UserManagement:AnyObject' => '* enhver *',
'UI:UserManagement:User' => 'Bruger',
'UI:UserManagement:User+' => '',
'UI:UserManagement:Profile' => 'Profil',
'UI:UserManagement:Profile+' => '',
'UI:UserManagement:Action:Read' => 'Læs',
'UI:UserManagement:Action:Read+' => '',
'UI:UserManagement:Action:Modify' => 'Ændring',
'UI:UserManagement:Action:Modify+' => '',
'UI:UserManagement:Action:Delete' => 'Slet',
'UI:UserManagement:Action:Delete+' => '',
'UI:UserManagement:Action:BulkRead' => 'Masselæsning (Export)',
'UI:UserManagement:Action:BulkRead+' => '',
'UI:UserManagement:Action:BulkModify' => 'Masseændring',
'UI:UserManagement:Action:BulkModify+' => '',
'UI:UserManagement:Action:BulkDelete' => 'Massesletning',
'UI:UserManagement:Action:BulkDelete+' => '',
'UI:UserManagement:Action:Stimuli' => 'Påvirkning',
'UI:UserManagement:Action:Stimuli+' => '',
'UI:UserManagement:Action' => 'Handling',
'UI:UserManagement:Action+' => '',
'UI:UserManagement:TitleActions' => 'Handlinger',
'UI:UserManagement:Permission' => 'Tilladelse',
'UI:UserManagement:Permission+' => '',
'UI:UserManagement:Attributes' => 'Attributter',
'UI:UserManagement:ActionAllowed:Yes' => 'Ja',
'UI:UserManagement:ActionAllowed:No' => 'Nej',
'UI:UserManagement:AdminProfile+' => '',
'UI:UserManagement:NoLifeCycleApplicable' => 'N/A',
'UI:UserManagement:NoLifeCycleApplicable+' => '',
'UI:UserManagement:GrantMatrix' => 'Grant Matrix',
'UI:UserManagement:LinkBetween_User_And_Profile' => 'Link mellem %1$s and %2$s',
'UI:UserManagement:LinkBetween_User_And_Org' => 'Link mellem %1$s og %2$s',
'Menu:AdminTools' => 'Admin værktøjer',
'Menu:AdminTools+' => '',
'Menu:AdminTools?' => 'Værktøjer kun tilgængelige for brugere med administrator profil',
'UI:ChangeManagementMenu' => 'Change Management',
'UI:ChangeManagementMenu+' => '',
'UI:ChangeManagementMenu:Title' => 'Changes Overblik',
'UI-ChangeManagementMenu-ChangesByType' => 'Changes efter type',
'UI-ChangeManagementMenu-ChangesByStatus' => 'Changes efter status',
'UI-ChangeManagementMenu-ChangesByWorkgroup' => 'Changes efter workgroup',
'UI-ChangeManagementMenu-ChangesNotYetAssigned' => 'Changes endnu ikke tildelt',
'UI:ConfigurationManagementMenu' => 'Configuration Management',
'UI:ConfigurationManagementMenu+' => '',
'UI:ConfigurationManagementMenu:Title' => 'Infrastruktur Overblik',
'UI-ConfigurationManagementMenu-InfraByType' => 'Infrastruktur objekter efter type',
'UI-ConfigurationManagementMenu-InfraByStatus' => 'Infrastruktur objekter efter status',
'UI:ConfigMgmtMenuOverview:Title' => 'Dashboard for Configuration Management',
'UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus' => 'Configuration Items efter status',
'UI-ConfigMgmtMenuOverview-FunctionalCIByType' => 'Configuration Items efter type',
'UI:RequestMgmtMenuOverview:Title' => 'Dashboard for Anmodnings styring',
'UI-RequestManagementOverview-RequestByService' => 'Bruger anmodninger efter service',
'UI-RequestManagementOverview-RequestByPriority' => 'Bruger anmodninger efter prioritet',
'UI-RequestManagementOverview-RequestUnassigned' => 'Bruger anmodninger endnu ikke tildelt',
'UI:IncidentMgmtMenuOverview:Title' => 'Dashboard for Incident Management',
'UI-IncidentManagementOverview-IncidentByService' => 'Incidents efter service',
'UI-IncidentManagementOverview-IncidentByPriority' => 'Incidents efter prioritet',
'UI-IncidentManagementOverview-IncidentUnassigned' => 'Incidents endnu ikke tildelt',
'UI:ChangeMgmtMenuOverview:Title' => 'Dashboard for Change Management~~',
'UI-ChangeManagementOverview-ChangeByType' => 'Changes efter type',
'UI-ChangeManagementOverview-ChangeUnassigned' => 'Changes endnu ikke tildelt',
'UI-ChangeManagementOverview-ChangeWithOutage' => 'Udfald på grund af changes (ændringer)',
'UI:ServiceMgmtMenuOverview:Title' => 'Dashboard for Service Management',
'UI-ServiceManagementOverview-CustomerContractToRenew' => 'Kunde kontrakter til fornyelse indenfor 30 dage',
'UI-ServiceManagementOverview-ProviderContractToRenew' => 'Leverandør kontrakter til fornyelse indenfor 30 dage',
'UI:ContactsMenu' => 'Kontakter',
'UI:ContactsMenu+' => '',
'UI:ContactsMenu:Title' => 'Kontakter Overblik',
'UI-ContactsMenu-ContactsByLocation' => 'Kontakter efter lokation',
'UI-ContactsMenu-ContactsByType' => 'Kontakter efter type',
'UI-ContactsMenu-ContactsByStatus' => 'Kontakter efter status',
'Menu:CSVImportMenu' => 'CSV import',
'Menu:CSVImportMenu+' => '',
'Menu:DataModelMenu' => 'Data Model',
'Menu:DataModelMenu+' => '',
'Menu:ExportMenu' => 'Export',
'Menu:ExportMenu+' => '',
'Menu:NotificationsMenu' => 'Notifikationer',
'Menu:NotificationsMenu+' => '',
'UI:NotificationsMenu:Title' => 'Konfiguration af <span class="hilite">Notifikationer</span>~~',
'UI:NotificationsMenu:Help' => 'Hjælp',
'UI:NotificationsMenu:HelpContent' => '<p>I iTop er notifikationer fuldt modificerbare. De er baseret på to sæt af objekter: <i>triggers og handlinger</i>.</p>
<p><i><b>Triggers</b></i> definerer hvornår en notifikation skal udføres. Der er 5 typer af triggers til at dække 3 forskellige faser for et objekts livscyclus:
<ol>
<li>the "Ved objekts oprettelse" triggers udføres når et objekt af den specificerede klasse oprettes</li>
<li>the "Ved indtræden i en tilstand" triggers udløses før et objekt af den givne klasse indtræder i en specifik tilstand (kommende fra en anden tilstand)</li>
<li>the "Ved forladelse af en tilstand" triggers udløses når et objekt af den givne klasse forlader en specifik tilstand</li>
<li>the "Ved grænseværdi" triggers udløses når en grænseværdi for TTR eller TTO er nået</li>
<li>the "Ved portal opdatering" triggers udløses når en ticket opdateres fra portalen</li>
</ol>
</p>
<p>
<i><b>Handlinger</b></i> definer de handlinger som udføres når triggeren udløses. For nuværende er der kun en handling, som består af at sende en email besked.
Sådanne handlinger definerer den skabelon som bruges til afsendelse af email såvel som andre parametre indhold i beskeden, modtger, vigtighed, etc.
</p>
<p>En speciel side: <a href="../setup/email.test.php" target="_blank">email.test.php</a> er til rådighed for test og problemløsning af PHP mail konfigurationen.</p>
<p>For udførelse, handlinger skal være knyttet til triggers.
Ved tilknytningen til en trigger, bliver hver handling tildelt et "rækkefølge" nummer, der specificerer i hvilken rækkefølge handlingerne udføres.</p>',
'UI:NotificationsMenu:Triggers' => 'Triggers',
'UI:NotificationsMenu:AvailableTriggers' => 'Tilgængelige triggers',
'UI:NotificationsMenu:OnCreate' => 'Når et objekt oprettes',
'UI:NotificationsMenu:OnStateEnter' => 'Når et objekt indtræder i en give tilstand',
'UI:NotificationsMenu:OnStateLeave' => 'Når et objekt forlader en give tilstand',
'UI:NotificationsMenu:Actions' => 'Handlinger',
'UI:NotificationsMenu:AvailableActions' => 'Tilgængelige handlinger',
'Menu:AuditCategories' => 'Audit Kategorier',
'Menu:AuditCategories+' => '',
'Menu:Notifications:Title' => 'Audit Kategorier',
'Menu:RunQueriesMenu' => 'Kør forespørgsler',
'Menu:RunQueriesMenu+' => '',
'Menu:QueryMenu' => 'Query parlør',
'Menu:QueryMenu+' => '',
'Menu:DataAdministration' => 'Data administration',
'Menu:DataAdministration+' => '',
'Menu:UniversalSearchMenu' => 'Universal Søgning',
'Menu:UniversalSearchMenu+' => '',
'Menu:ApplicationLogMenu' => 'Log de l\'application',
'Menu:ApplicationLogMenu+' => '',
'Menu:ApplicationLogMenu:Title' => 'Log de l\'application',
'Menu:UserManagementMenu' => 'Bruger styring',
'Menu:UserManagementMenu+' => '',
'Menu:ProfilesMenu' => 'Profiler',
'Menu:ProfilesMenu+' => '',
'Menu:ProfilesMenu:Title' => 'Profiler',
'Menu:UserAccountsMenu' => 'Bruger konti',
'Menu:UserAccountsMenu+' => '',
'Menu:UserAccountsMenu:Title' => 'Bruger konti',
'UI:iTopVersion:Short' => 'iTop version %1$s',
'UI:iTopVersion:Long' => 'iTop version %1$s-%2$s built on %3$s',
'UI:PropertiesTab' => 'Egenskaber',
'UI:OpenDocumentInNewWindow_' => 'Åbn dette dokument i et nyt vindue: %1$s',
'UI:DownloadDocument_' => 'Hent dette dokument: %1$s',
'UI:Document:NoPreview' => 'Forhåndsvisning er ikke tilgængelig for denne dokumenttype',
'UI:Download-CSV' => 'Download %1$s',
'UI:DeadlineMissedBy_duration' => 'Overskredet med %1$s',
'UI:Deadline_LessThan1Min' => '< 1 min',
'UI:Deadline_Minutes' => '%1$d min',
'UI:Deadline_Hours_Minutes' => '%1$dh %2$dmin',
'UI:Deadline_Days_Hours_Minutes' => '%1$dd %2$dh %3$dmin',
'UI:Help' => 'Hjælp',
'UI:PasswordConfirm' => '(Bekræft)',
'UI:BeforeAdding_Class_ObjectsSaveThisObject' => 'Gem dette objekt, før der tilføjes flere %1$s objekter.',
'UI:DisplayThisMessageAtStartup' => 'Vis denne beksed ved start',
'UI:RelationshipGraph' => 'Grafisk visning',
'UI:RelationshipList' => 'Liste',
'UI:OperationCancelled' => 'Handling afbrudt',
'UI:ElementsDisplayed' => 'Filtrering',
'Portal:Title' => 'iTop bruger portal',
'Portal:NoRequestMgmt' => 'Kære %1$s, du er blevet omdirigeret til denne side, fordi din konto er konfigureret med profilen \'Portal user\'. Desværre er iTop ikke installeret med denne funktionalitet \'Request Management\'. Venligst kontakt din administrator.',
'Portal:Refresh' => 'Opdater',
'Portal:Back' => 'Tilbage',
'Portal:WelcomeUserOrg' => 'Velkommen %1$s, fra %2$s',
'Portal:ShowOngoing' => 'Vis åbne anmodninger',
'Portal:ShowClosed' => 'Vis lukkede anmodninger',
'Portal:CreateNewRequest' => 'Opret ny anmodning',
'Portal:ChangeMyPassword' => 'Skift password',
'Portal:Disconnect' => 'Disconnect',
'Portal:OpenRequests' => 'Mine åbne anmodninger',
'Portal:ClosedRequests' => 'Mine lukkede anmodninger',
'Portal:ResolvedRequests' => 'Mine løste anmodninger',
'Portal:SelectService' => 'Vælg en ydelse fra kataloget:',
'Portal:PleaseSelectOneService' => 'Vælg venligst en ydelse',
'Portal:SelectSubcategoryFrom_Service' => 'Vælg en under-kategori for ydelsen %1$s:',
'Portal:PleaseSelectAServiceSubCategory' => 'Vælg venligst en under-kategori',
'Portal:DescriptionOfTheRequest' => 'Indtast beskrivelse af din anmodning:',
'Portal:TitleRequestDetailsFor_Request' => 'Detaljer for anmodning %1$s:',
'Portal:NoOpenRequest' => 'Ingen anmodning i denne kategori',
'Portal:NoClosedRequest' => 'Ingen anmodning i denne kategori',
'Portal:Button:ReopenTicket' => 'Genåben denne ticket',
'Portal:Button:CloseTicket' => 'Luk denne ticket',
'Portal:Button:UpdateRequest' => 'Opdater denne anmodning',
'Portal:EnterYourCommentsOnTicket' => 'Indtast din kommentar til løsningen af denne:',
'Portal:ErrorNoContactForThisUser' => 'Fejl: nuværnede bruger er ikke tilknyttet en Kontact/Person. Kontakt venligst din administrator.',
'Portal:Attachments' => 'Vedhæftninger',
'Portal:AddAttachment' => ' Vedhæft fil ',
'Portal:RemoveAttachment' => ' Fjern vedhæftning ',
'Portal:Attachment_No_To_Ticket_Name' => 'Vedhæftning #%1$d til %2$s (%3$s)',
'Enum:Undefined' => 'Udefineret',
'UI:DurationForm_Days_Hours_Minutes_Seconds' => '%1$s Dage %2$s Timer %3$s Minutter %4$s Sekunder',
'UI:ModifyAllPageTitle' => 'Modificer Alle',
'UI:Modify_N_ObjectsOf_Class' => 'Ændrer %1$d objekter af klasse %2$s',
'UI:Modify_M_ObjectsOf_Class_OutOf_N' => 'Ændrer %1$d objekter af klasse %2$s ud af %3$d',
'UI:Menu:ModifyAll' => 'Modificer...',
'UI:Button:ModifyAll' => 'Modificer Alle',
'UI:Button:PreviewModifications' => 'Preview Ændringer >>',
'UI:ModifiedObject' => 'Objekt Ændret',
'UI:BulkModifyStatus' => 'Operation',
'UI:BulkModifyStatus+' => '',
'UI:BulkModifyErrors' => 'Fejl (hvis nogen)',
'UI:BulkModifyErrors+' => '',
'UI:BulkModifyStatusOk' => 'Ok',
'UI:BulkModifyStatusError' => 'Fejl',
'UI:BulkModifyStatusModified' => 'Ændret',
'UI:BulkModifyStatusSkipped' => 'Sprunget over',
'UI:BulkModify_Count_DistinctValues' => '%1$d distinkte værdier:',
'UI:BulkModify:Value_Exists_N_Times' => '%1$s, %2$d gang(e)',
'UI:BulkModify:N_MoreValues' => '%1$d flere værdier...',
'UI:AttemptingToSetAReadOnlyAttribute_Name' => 'Forsøger at skrivebeskytte feltet: %1$s',
'UI:FailedToApplyStimuli' => 'Handlingen fejlede.',
'UI:StimulusModify_N_ObjectsOf_Class' => '%1$s: Ændrer %2$d objekter af klasse %3$s',
'UI:CaseLogTypeYourTextHere' => 'Skriv din tekst her:',
'UI:CaseLog:DateFormat' => 'Y-m-d H:i:s',
'UI:CaseLog:Header_Date_UserName' => '%1$s - %2$s:',
'UI:CaseLog:InitialValue' => 'Begyndelses værdi:',
'UI:AttemptingToSetASlaveAttribute_Name' => 'Feltet %1$s er skrivebeskyttet, fordi det administreres af data synchronization. Værdien er ikke sat.',
'UI:ActionNotAllowed' => 'Du har ikke tilladelse til at foretage denne handling op disse objekter.',
'UI:BulkAction:NoObjectSelected' => 'Vælg venligst mindst et objekt for at foretage denne handling',
'UI:AttemptingToChangeASlaveAttribute_Name' => 'Feltet %1$s er skrivebeskyttet, fordi det administreres af data synchronization. Værdien forbliver uændret.',
'UI:Pagination:HeaderSelection' => 'Total: %1$s objekter (%2$s objekter valgt).',
'UI:Pagination:HeaderNoSelection' => 'Total: %1$s objekter.',
'UI:Pagination:PageSize' => '%1$s objekter per side',
'UI:Pagination:PagesLabel' => 'Sider:',
'UI:Pagination:All' => 'Alle',
'UI:HierarchyOf_Class' => 'Hierarchy af %1$s',
'UI:Preferences' => 'Indstillinger...',
'UI:FavoriteOrganizations' => 'Favorit Organisationer',
'UI:FavoriteOrganizations+' => '',
'UI:FavoriteLanguage' => 'Sprog i brugergrænseflade',
'UI:Favorites:SelectYourLanguage' => 'Vælg dit foretrukne sprog',
'UI:FavoriteOtherSettings' => 'Andre indstillinger',
'UI:Favorites:Default_X_ItemsPerPage' => 'Default længde for lister: %1$s emner per side',
'UI:NavigateAwayConfirmationMessage' => 'Enhver ændring vil blive kasseret.',
'UI:CancelConfirmationMessage' => 'Du vil miste dine ændringer. Fortsæt alligevel?',
'UI:AutoApplyConfirmationMessage' => 'Nogle ændringer er ikke gemt endnu. Ønsker du at itop skal tage hensyn til dem?',
'UI:Create_Class_InState' => 'Opret %1$s i tilstand: ',
'UI:OrderByHint_Values' => 'Sorterings orden: %1$s',
'UI:Menu:AddToDashboard' => 'Tilføj til Dashboard...',
'UI:Button:Refresh' => 'Opdater',
'UI:ConfigureThisList' => 'Konfigurer denne liste...',
'UI:ListConfigurationTitle' => 'Liste Konfiguration',
'UI:ColumnsAndSortOrder' => 'Kolonner og sortering:',
'UI:UseDefaultSettings' => 'Brug de anbefalede indstillinger',
'UI:UseSpecificSettings' => 'Brug følgende indstillinger:',
'UI:Display_X_ItemsPerPage' => 'Vis %1$s emner per side',
'UI:UseSavetheSettings' => 'Gem indstillinger',
'UI:OnlyForThisList' => 'Kun for denne liste',
'UI:ForAllLists' => 'For alle lister',
'UI:ExtKey_AsLink' => '%1$s (Link)',
'UI:ExtKey_AsFriendlyName' => '%1$s (Friendly Name)',
'UI:ExtField_AsRemoteField' => '%1$s (%2$s)',
'UI:Button:MoveUp' => 'Ryk Op',
'UI:Button:MoveDown' => 'Ryk Ned',
'UI:OQL:UnknownClassAndFix' => 'Ukendt klasse "%1$s". Forsøg "%2$s" i stedet for.',
'UI:OQL:UnknownClassNoFix' => 'Ukendt klasse "%1$s"',
'UI:Dashboard:Edit' => 'Rediger denne side...',
'UI:Dashboard:Revert' => 'Tilbage til original version...',
'UI:Dashboard:RevertConfirm' => 'Enhver ændring foretaget i den oprindelige version vil blive tabt. Bekræft venligst at du ønsker dette.',
'UI:ExportDashBoard' => 'Exporter til fil',
'UI:ImportDashBoard' => 'Importer fra fil...',
'UI:ImportDashboardTitle' => 'Importer Fra Fil',
'UI:ImportDashboardText' => 'Vælg en dashboard fil til import:',
'UI:DashletCreation:Title' => 'Opret en ny Dashlet',
'UI:DashletCreation:Dashboard' => 'Dashboard',
'UI:DashletCreation:DashletType' => 'Dashlet Type',
'UI:DashletCreation:EditNow' => 'Rediger Dashboard',
'UI:DashboardEdit:Title' => 'Dashboard Editor',
'UI:DashboardEdit:DashboardTitle' => 'Titel',
'UI:DashboardEdit:Layout' => 'Layout',
'UI:DashboardEdit:Properties' => 'Dashboard Egenskaber',
'UI:DashboardEdit:Dashlets' => 'Tilgængelige Dashlets',
'UI:DashboardEdit:DashletProperties' => 'Dashlet Egenskaber',
'UI:Form:Property' => 'Egenskab',
'UI:Form:Value' => 'Værdi',
'UI:DashletPlainText:Label' => 'Tekst',
'UI:DashletPlainText:Description' => 'Plain text (ingen formatering)',
'UI:DashletPlainText:Prop-Text' => 'Tekst',
'UI:DashletPlainText:Prop-Text:Default' => 'Indtast venligst noget tekst her...',
'UI:DashletObjectList:Label' => 'Objekt liste',
'UI:DashletObjectList:Description' => 'Objekt liste dashlet',
'UI:DashletObjectList:Prop-Title' => 'Titel',
'UI:DashletObjectList:Prop-Query' => 'Forespørgsel',
'UI:DashletObjectList:Prop-Menu' => 'Menu',
'UI:DashletGroupBy:Prop-Title' => 'Titel',
'UI:DashletGroupBy:Prop-Query' => 'Forespørgsel',
'UI:DashletGroupBy:Prop-Style' => 'Style',
'UI:DashletGroupBy:Prop-GroupBy' => 'Grupper efter...',
'UI:DashletGroupBy:Prop-GroupBy:Hour' => 'Timer af %1$s (0-23)',
'UI:DashletGroupBy:Prop-GroupBy:Month' => 'Måned af %1$s (1 - 12)',
'UI:DashletGroupBy:Prop-GroupBy:DayOfWeek' => 'Ugedag for %1$s',
'UI:DashletGroupBy:Prop-GroupBy:DayOfMonth' => 'Dag i måneden for %1$s',
'UI:DashletGroupBy:Prop-GroupBy:Select-Hour' => '%1$s (time)',
'UI:DashletGroupBy:Prop-GroupBy:Select-Month' => '%1$s (måned)',
'UI:DashletGroupBy:Prop-GroupBy:Select-DayOfWeek' => '%1$s (ugedag)',
'UI:DashletGroupBy:Prop-GroupBy:Select-DayOfMonth' => '%1$s (dag i måned)',
'UI:DashletGroupBy:MissingGroupBy' => 'Vælg venligst det felt, somobjekterne skal grupperes efter',
'UI:DashletGroupByPie:Label' => 'Pie Chart',
'UI:DashletGroupByPie:Description' => 'Pie Chart',
'UI:DashletGroupByBars:Label' => 'Bar Chart',
'UI:DashletGroupByBars:Description' => 'Bar Chart',
'UI:DashletGroupByTable:Label' => 'Grupper Efter (tabel)',
'UI:DashletGroupByTable:Description' => 'Liste (Grupperet efter felt)',
'UI:DashletHeaderStatic:Label' => 'Header',
'UI:DashletHeaderStatic:Description' => 'Vis en horisontal separator',
'UI:DashletHeaderStatic:Prop-Title' => 'Titel',
'UI:DashletHeaderStatic:Prop-Title:Default' => 'Kontakter',
'UI:DashletHeaderStatic:Prop-Icon' => 'Ikon',
'UI:DashletHeaderDynamic:Label' => 'Header med statistik',
'UI:DashletHeaderDynamic:Description' => 'Header med stats (grupperet efter...)',
'UI:DashletHeaderDynamic:Prop-Title' => 'Titel',
'UI:DashletHeaderDynamic:Prop-Title:Default' => 'Kontakter',
'UI:DashletHeaderDynamic:Prop-Icon' => 'Ikon',
'UI:DashletHeaderDynamic:Prop-Subtitle' => 'Undertitel',
'UI:DashletHeaderDynamic:Prop-Subtitle:Default' => 'Kontakter',
'UI:DashletHeaderDynamic:Prop-Query' => 'Forespørgsel',
'UI:DashletHeaderDynamic:Prop-GroupBy' => 'Gruper efter',
'UI:DashletHeaderDynamic:Prop-Values' => 'Værdier',
'UI:DashletBadge:Label' => 'Badge',
'UI:DashletBadge:Description' => 'Objekt Ikon med ny/søg',
'UI:DashletBadge:Prop-Class' => 'Klasse',
'DayOfWeek-Sunday' => 'Søndag',
'DayOfWeek-Monday' => 'Mandag',
'DayOfWeek-Tuesday' => 'Tirsdag',
'DayOfWeek-Wednesday' => 'Onsdag',
'DayOfWeek-Thursday' => 'Torsdag',
'DayOfWeek-Friday' => 'Fredag',
'DayOfWeek-Saturday' => 'Lørdag',
'UI:Menu:ShortcutList' => 'Opret Genvej...',
'UI:ShortcutRenameDlg:Title' => 'Omdøb genvej',
'UI:ShortcutListDlg:Title' => 'Opret en genvej for denne liste',
'UI:ShortcutDelete:Confirm' => 'Bekræft venligst at du ønsker at slette genvej(e).',
'Menu:MyShortcuts' => 'Mine Genveje',
'Class:Shortcut' => 'Genvej',
'Class:Shortcut+' => '',
'Class:Shortcut/Attribute:name' => 'Navn',
'Class:Shortcut/Attribute:name+' => '',
'UI:FillAllMandatoryFields' => 'Venligst udfyld alle obligatoriske felter.',
));
?>

View File

@@ -883,9 +883,6 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'UI-ContactsMenu-ContactsByType' => 'Contacten aan de hand van type',
'UI-ContactsMenu-ContactsByStatus' => 'Contacten aan de hand van status',
'Menu:CSVImportMenu' => 'CSV import',
'Menu:CSVImportMenu+' => 'Grootschalige aanmaak of update',
'Menu:DataModelMenu' => 'Data Model',
'Menu:DataModelMenu+' => 'Overzicht van het Data Model',
@@ -930,9 +927,6 @@ Indien gekoppeld aan een Trigger, wordt aan elke actie een "orde" nummer gegeven
'Menu:QueryMenu' => 'Query phrasebook',
'Menu:QueryMenu+' => 'Query phrasebook',
'Menu:DataAdministration' => 'Data administratie',
'Menu:DataAdministration+' => 'Data administratie',
'Menu:UniversalSearchMenu' => 'Universele Zoekopdracht',
'Menu:UniversalSearchMenu+' => 'Zoek naar alles...',

View File

@@ -238,8 +238,12 @@ $(function()
}
);
oParams.operation = 'searchObjectsToAdd2';
oParams['class'] = this.options.class_name;
oParams.real_class = '';
if ((oParams['class'] != undefined) && (oParams['class'] != ''))
{
oParams.real_class = oParams['class'];
}
oParams['class'] = this.options.class_name;
oParams.att_code = this.options.att_code;
oParams.iInputId = this.id;
if (this.options.oWizardHelper)

View File

@@ -225,6 +225,7 @@ $(function()
_do_submit: function()
{
var oData = {};
var me = this;
this.element.closest('form').find(':input[type=hidden]').each(function()
{
// Hidden form fields
@@ -232,7 +233,7 @@ $(function()
});
this.element.closest('form').find('.itop-property-field').each(function()
{
var oWidget = $(this).data('itopProperty_field');
var oWidget = me._get_widget($(this));
if (oWidget && oWidget._is_visible())
{
var oVal = oWidget._get_committed_value();
@@ -264,6 +265,15 @@ $(function()
{
var oField = $('#'+this.options.field_id, this.element);
oField.trigger('validate');
},
_get_widget: function(element)
{
var oWidget = element.data('itopProperty_field');
if (oWidget == undefined)
{
oWidget = element.data('itopSelector_property_field');
}
return oWidget;
}
});
});
@@ -331,9 +341,19 @@ $(function()
$('tr[data-path^="'+sSelector+'"]').each(function() {
if($(this).is(':visible'))
{
var oPropField = $(this).closest('.itop-property-field');
oPropField.property_field('option', {can_apply: !me.bModified, parent_selector: '#'+me.element.attr('id') });
oPropField.property_field('validate');
var oWidget = me._get_widget($(this).closest('.itop-property-field'));
if (oWidget)
{
try
{
oWidget._setOptions({can_apply: !me.bModified, parent_selector: '#'+me.element.attr('id') });
oWidget.validate();
}
catch(e)
{
// Do nothing, form in read-only mode
}
}
}
});
},
@@ -385,21 +405,21 @@ $(function()
$('tr[data-path^="'+sSelector+'"]').each(function() {
if($(this).is(':visible'))
{
var sName = $(this).closest('.itop-property-field').property_field('mark_as_applied').property_field('get_field_name');
if (typeof sName == 'string')
var oWidget = me._get_widget($(this).closest('.itop-property-field'));
if (oWidget)
{
aUpdated.push(sName);
oWidget.mark_as_applied();
sName = oWidget.get_field_name();
if (typeof sName == 'string')
{
aUpdated.push(sName);
}
}
}
});
this.element.closest('form').find('.itop-property-field').each(function()
{
var oWidget = $(this).data('itopProperty_field');
if (!oWidget)
{
// try the form selector widget
oWidget = $(this).data('itopSelector_property_field');
}
var oWidget = me._get_widget($(this));
if (oWidget && oWidget._is_visible())
{
var oVal = oWidget._get_committed_value();
@@ -426,12 +446,16 @@ $(function()
sFormId = this.element.closest('form').attr('id');
oFormValidation[sFormId] = [];
this.options.can_apply = true;
var sSelector = this.options.data_selector
var sSelector = this.options.data_selector;
var me = this;
$('tr[data-path^="'+sSelector+'"]').each(function() {
if($(this).is(':visible'))
{
var oPropField = $(this).closest('.itop-property-field');
oPropField.property_field('validate');
var oWidget = me._get_widget($(this).closest('.itop-property-field'));
if (oWidget)
{
oWidget.validate();
}
}
});
this.options.can_apply = (oFormValidation[sFormId].length == 0); // apply allowed only if no error
@@ -442,7 +466,7 @@ $(function()
var oFormValidation = {};
function ValidateWithPattern(sFieldId, bMandatory, sPattern, sFormId, aForbiddenValues, sExplainForbiddenValues)
function ValidateWithPattern(sFieldId, bMandatory, sPattern, sFormId, aForbiddenValues)
{
var currentVal = $('#'+sFieldId).val();
var bValid = true;
@@ -461,11 +485,14 @@ function ValidateWithPattern(sFieldId, bMandatory, sPattern, sFormId, aForbidden
{
for(var i in aForbiddenValues)
{
if (aForbiddenValues[i] == currentVal)
for(j in aForbiddenValues[i].values)
{
bValid = false;
sMessage = sExplainForbiddenValues;
break;
if (aForbiddenValues[i].values[j] == currentVal)
{
bValid = false;
sMessage = aForbiddenValues[i].message;
break;
}
}
}
}
@@ -598,7 +625,7 @@ function ReadFormParams(sFormId)
{
var oMap = { };
$('#'+sFormId+' :input').each( function() {
if ($(this).parent().is(':visible'))
if ($(this).parent().is(':visible') && !$(this).prop('disabled'))
{
var sName = $(this).attr('name');
if (sName && sName != '')

View File

@@ -200,13 +200,18 @@ function ReloadSearchForm(divId, sClassName, sBaseClass, sContext)
for(var index = 0; index < aSubmit.length; index++)
{
// Restore the previously bound submit handlers
var sEventName = 'submit';
if ((aSubmit[index].namespace != undefined) && (aSubmit[index].namespace != ''))
{
sEventName += '.'+aSubmit[index].namespace;
}
if (aSubmit[index].data != undefined)
{
oForm.bind('submit.'+aSubmit[index].namespace, aSubmit[index].data, aSubmit[index].handler)
oForm.bind(sEventName, aSubmit[index].data, aSubmit[index].handler)
}
else
{
oForm.bind('submit.'+aSubmit[index].namespace, aSubmit[index].handler)
oForm.bind(sEventName, aSubmit[index].handler)
}
}
}

View File

@@ -601,6 +601,7 @@ try
if ($iErrors == 0)
{
$oP->set_title(Dict::S('UI:SearchResultsPageTitle'));
$oP->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/xlsx-export.js'); // Since the results are loaded asynchronously they don't do this on their own
$oP->add("<div style=\"padding: 10px;\">\n");
$oP->add("<div class=\"header_message\" id=\"full_text_progress\" style=\"position: fixed; background-color: #cccccc; opacity: 0.7; padding: 1.5em;\">\n");
$oP->add('<img id="full_text_indicator" src="../images/indicator.gif">&nbsp;<span style="padding: 1.5em;">'.Dict::Format('UI:Search:Ongoing', htmlentities($sFullText, ENT_QUOTES, 'UTF-8')).'</span>');
@@ -1654,4 +1655,4 @@ catch(Exception $e)
IssueLog::Error($e->getMessage());
}
}
?>
?>

View File

@@ -1,4 +1,4 @@
iTop - version 2.1.0 - 16-Dec-2014
iTop - version 2.1.0 - 18-Dec-2014
Readme file
1. ABOUT THIS RELEASE
@@ -30,7 +30,8 @@ This version brings a number of bug fixes since 2.0.3 and a few enhancements, na
- A rudimentary configuration file editor (for administrators)
- Automated data backups, and manual backup/restore
- Excel exports
- Dutch translation contributed by Remie Malik from Linprofs (www.linprofs.com)
- Dutch localization contributed by Remie Malik from Linprofs (www.linprofs.com)
- Danish localization contributed by Erik Bøg
... and about 80 bug fixes!
@@ -63,7 +64,8 @@ Stephan Rickauer, Tobias Glemser and Sabri Saleh for their consulting about iTop
Claudio Cesar Sanchez Tejeda for his contribution to bug fixes on the export and data synchronization
Bruno Cornec for his support and contribution to the Linux packaging of iTop
Jean-François Bilger for providing a fix for an unsuspected SQL bug
Remie Malik from Linprofs for the Dutch translation
Remie Malik from Linprofs for the Dutch translation
Erik Bøg for the Danish translation
2. INSTALLATION
============
@@ -284,6 +286,7 @@ Prevent the JS validation (on focus) to create multiple entries for the same fie
#1037 Refresh "priority" when either "impact" or "urgency" changes.
#1038 Duplicate column name (service name) when importing service subcategories
#1040 The graphical display of "impact/depends on" is not consistent with the "list" tab
#1041 Protect against XSS injections
Extending the data model
@@ -293,6 +296,8 @@ Extending the data model
User rights: deny on a parent class must give DENY even if the class is explicitely ALLOW on the same profile (that was already working if the rules are given on several profiles). Added a config flag to force the legacy algorithm (user_rights_legacy, defaulting to false)
#1029 Got rid of tags <format> that were not used at all and that were really misleading extension developers
#1032 When adding a case log, existing objects could not be displayed anymore!
Advanced customization: a stop watch can be started in the past (incident ticket created from an alarm)
Improved the XML format, changing from 1.0 to 1.1
- The change is ascendant compatible (automatically converted into 1.1 by ModelFactory) and thus sould be transparent: could may leave your extensions unchanged if you do not need to benefit from the new format
@@ -302,7 +307,6 @@ Improved the XML format, changing from 1.0 to 1.1
- Added an id on the transitions to allow a finer granularity for the deltas.
- Rework of the lifecycle/actions to ease the extensibility (Generic handlers replacing the specific ones: Rest, Copy, SetCurrentDate, SetCurrentUser, SetElapsedTime)
Internals
----------------------
Protected the property fields against the collision of ids within the same page (even if that is a bug, make it work not too bad!)

View File

@@ -1092,6 +1092,10 @@ EOF;
$sIcon = $sModuleRelativeDir.'/'.$sIcon;
$sIcon = "utils::GetAbsoluteUrlModulesRoot().'$sIcon'";
}
else
{
$sIcon = "''";
}
switch($sColor)
{
// Known PHP constants: keep the literal value as-is

View File

@@ -272,11 +272,10 @@ class ModelFactory
if (($oSourceNode->tagName == 'class') && ($oSourceNode->parentNode->tagName == 'classes') && ($oSourceNode->parentNode->parentNode->tagName == 'itop_design'))
{
$sParentId = $oSourceNode->GetChildText('parent');
if ($oSourceNode->getAttribute('_delta') == 'define')
{
// This tag is organized in hierarchy: determine the real parent node (as a subnode of the current node)
$sParentId = $oSourceNode->GetChildText('parent');
$oTargetParentNode = $oTarget->GetNodeById('/itop_design/classes//class', $sParentId)->item(0);
if (!$oTargetParentNode)
@@ -298,6 +297,13 @@ class ModelFactory
else
{
$oTargetParentNode = $oTargetNode->parentNode;
if (($oSourceNode->getAttribute('_delta') == 'redefine') && ($oTargetParentNode->getAttribute('id') != $sParentId))
{
// A class that has moved <=> deletion and creation elsewhere
$oTargetParentNode = $oTarget->GetNodeById('/itop_design/classes//class', $sParentId)->item(0);
$oTargetNode->Delete();
$oSourceNode->setAttribute('_delta', 'define');
}
}
}
@@ -860,19 +866,56 @@ EOF
}
/**
* Import the node into the delta
*/
protected function SetDeltaFlags($oNodeClone)
{
$sAlteration = $oNodeClone->getAttribute('_alteration');
$oNodeClone->removeAttribute('_alteration');
if ($oNodeClone->hasAttribute('_old_id'))
{
$oNodeClone->setAttribute('_rename_from', $oNodeClone->getAttribute('_old_id'));
$oNodeClone->removeAttribute('_old_id');
}
switch ($sAlteration)
{
case '':
if ($oNodeClone->hasAttribute('id'))
{
$oNodeClone->setAttribute('_delta', 'must_exist');
}
break;
case 'added':
$oNodeClone->setAttribute('_delta', 'define');
break;
case 'replaced':
$oNodeClone->setAttribute('_delta', 'redefine');
break;
case 'removed':
$oNodeClone->setAttribute('_delta', 'delete');
break;
case 'needed':
$oNodeClone->setAttribute('_delta', 'define_if_not_exists');
break;
}
return $oNodeClone;
}
/**
* Create path for the delta
* @param Array aMovedClasses The classes that have been moved in the hierarchy (deleted + created elsewhere)
* @param DOMDocument oTargetDoc Where to attach the top of the hierarchy
* @param MFElement oNode The node to import with its path
*/
protected function ImportNodeAndPathDelta($oTargetDoc, $oNode)
protected function ImportNodeAndPathDelta($aMovedClasses, $oTargetDoc, $oNode)
{
// Preliminary: skip the parent if this node is organized hierarchically into the DOM
// Only class nodes are organized this way
$oParent = $oNode->parentNode;
if ($oNode->tagName == 'class')
if ($oNode->IsClassNode())
{
while (($oParent instanceof DOMElement) && ($oParent->tagName == $oNode->tagName) && $oParent->hasAttribute('id'))
while (($oParent instanceof DOMElement) && ($oParent->IsClassNode()))
{
$oParent = $oParent->parentNode;
}
@@ -880,64 +923,71 @@ EOF
// Recursively create the path for the parent
if ($oParent instanceof DOMElement)
{
$oParentClone = $this->ImportNodeAndPathDelta($oTargetDoc, $oParent);
$oParentClone = $this->ImportNodeAndPathDelta($aMovedClasses, $oTargetDoc, $oParent);
}
else
{
// We've reached the top let's add the node into the root recipient
$oParentClone = $oTargetDoc;
}
// Look for the node into the parent node
// Note: this is an identified weakness of the algorithm,
// because for each node modified, and each node of its path
// we will have to lookup for the existing entry
// Anyhow, this loop is quite quick to execute because in the delta
// the number of nodes is limited
$oNodeClone = null;
foreach ($oParentClone->childNodes as $oChild)
$sAlteration = $oNode->getAttribute('_alteration');
if ($oNode->IsClassNode() && ($sAlteration != ''))
{
if (($oChild instanceof DOMElement) && ($oChild->tagName == $oNode->tagName))
{
if (!$oNode->hasAttribute('id') || ($oNode->getAttribute('id') == $oChild->getAttribute('id')))
{
$oNodeClone = $oChild;
break;
}
}
}
if (!$oNodeClone)
{
$sAlteration = $oNode->getAttribute('_alteration');
$bCopyContents = ($sAlteration == 'replaced') || ($sAlteration == 'added') || ($sAlteration == 'needed');
$oNodeClone = $oTargetDoc->importNode($oNode->cloneNode($bCopyContents), $bCopyContents);
$oNodeClone->removeAttribute('_alteration');
if ($oNodeClone->hasAttribute('_old_id'))
{
$oNodeClone->setAttribute('_rename_from', $oNodeClone->getAttribute('_old_id'));
$oNodeClone->removeAttribute('_old_id');
}
switch ($sAlteration)
{
case '':
if ($oNodeClone->hasAttribute('id'))
{
$oNodeClone->setAttribute('_delta', 'must_exist');
}
break;
case 'added':
$oNodeClone->setAttribute('_delta', 'define');
break;
case 'replaced':
$oNodeClone->setAttribute('_delta', 'redefine');
break;
case 'removed':
$oNodeClone->setAttribute('_delta', 'delete');
break;
case 'needed':
$oNodeClone->setAttribute('_delta', 'define_if_not_exists');
break;
}
// Handle the moved classes
//
// Import the whole root node
$oNodeClone = $oTargetDoc->importNode($oNode->cloneNode(true), true);
$oParentClone->appendChild($oNodeClone);
$this->SetDeltaFlags($oNodeClone);
// Handle the moved classes found under the root node (or the root node itself)
foreach($oNodeClone->GetNodes("descendant-or-self::class[@id]", false) as $oClassNode)
{
if (array_key_exists($oClassNode->getAttribute('id'), $aMovedClasses))
{
if ($sAlteration == 'removed')
{
// Remove that node: this specification will be overriden by the 'replaced' spec (see below)
$oClassNode->parentNode->removeChild($oClassNode);
}
else
{
// Move the class at the root, with the flag 'modified'
$oParentClone->appendChild($oClassNode);
$oClassNode->setAttribute('_alteration', 'replaced');
$this->SetDeltaFlags($oClassNode);
}
}
}
}
else
{
// Look for the node into the parent node
// Note: this is an identified weakness of the algorithm,
// because for each node modified, and each node of its path
// we will have to lookup for the existing entry
// Anyhow, this loop is quite quick to execute because in the delta
// the number of nodes is limited
$oNodeClone = null;
foreach ($oParentClone->childNodes as $oChild)
{
if (($oChild instanceof DOMElement) && ($oChild->tagName == $oNode->tagName))
{
if (!$oNode->hasAttribute('id') || ($oNode->getAttribute('id') == $oChild->getAttribute('id')))
{
$oNodeClone = $oChild;
break;
}
}
}
if (!$oNodeClone)
{
$bCopyContents = ($sAlteration == 'replaced') || ($sAlteration == 'added') || ($sAlteration == 'needed');
$oNodeClone = $oTargetDoc->importNode($oNode->cloneNode($bCopyContents), $bCopyContents);
$this->SetDeltaFlags($oNodeClone);
$oParentClone->appendChild($oNodeClone);
}
}
return $oNodeClone;
}
@@ -962,9 +1012,24 @@ EOF
public function GetDeltaDocument($aNodesToIgnore = array(), $aAttributes = null)
{
$oDelta = new MFDocument();
// Handle classes moved from one parent to another
// This will be done in two steps:
// 1) Identify the moved classes (marked as deleted under the original parent, and created under the new parent)
// 2) When importing those "moved" classes into the delta (see ImportNodeAndPathDelta), extract them from the hierarchy (the alteration can be done at an upper level in the hierarchy) and mark them as "modified"
$aMovedClasses = array();
foreach($this->GetNodes("/itop_design/classes//class/class[@_alteration='removed']", null, false) as $oNode)
{
$sId = $oNode->getAttribute('id');
if ($this->GetNodes("/itop_design/classes//class/class[@id='$sId']/properties", null, false)->length > 0)
{
$aMovedClasses[$sId] = true;
}
}
foreach($this->ListChanges() as $oAlteredNode)
{
$this->ImportNodeAndPathDelta($oDelta, $oAlteredNode);
$this->ImportNodeAndPathDelta($aMovedClasses, $oDelta, $oAlteredNode);
}
foreach($aNodesToIgnore as $sXPath)
{
@@ -1173,9 +1238,9 @@ EOF;
* @param string $sXPath A XPath expression
* @return DOMNodeList
*/
public function GetNodes($sXPath, $oContextNode = null)
public function GetNodes($sXPath, $oContextNode = null, $bSafe = true)
{
return $this->oDOMDocument->GetNodes($sXPath, $oContextNode);
return $this->oDOMDocument->GetNodes($sXPath, $oContextNode, $bSafe);
}
}
@@ -1199,9 +1264,9 @@ class MFElement extends DOMElement
* @param string $sXPath A XPath expression
* @return DOMNodeList
*/
public function GetNodes($sXPath)
public function GetNodes($sXPath, $bSafe = true)
{
return $this->ownerDocument->GetNodes($sXPath, $this);
return $this->ownerDocument->GetNodes($sXPath, $this, $bSafe);
}
/**
@@ -1274,7 +1339,7 @@ class MFElement extends DOMElement
$sText = null;
foreach($this->childNodes as $oChildNode)
{
if ($oChildNode instanceof DOMCharacterData) // Base class of DOMText and DOMCdataSection
if ($oChildNode instanceof DOMText)
{
if (is_null($sText)) $sText = '';
$sText .= $oChildNode->wholeText;
@@ -1614,16 +1679,16 @@ class MFElement extends DOMElement
/**
* Check that the current node is actually a class node, under classes
*/
protected function IsClassNode()
public function IsClassNode()
{
if ($this->tagName == 'class')
{
if (($this->parentNode->tagName == 'classes') && ($this->parentNode->parentNode->tagName == 'itop_design') ) // Beware: classes/class also exists in the group definition
{
return true;
}
return $this->parentNode->IsClassNode();
}
elseif (($this->tagName == 'classes') && ($this->parentNode->tagName == 'itop_design') ) // Beware: classes/class also exists in the group definition
{
return true;
}
else
{
return false;

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2016 Combodo SARL
//
// This file is part of iTop.
//
@@ -18,7 +18,7 @@
/**
* All the steps of the iTop installation wizard
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2016 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
@@ -623,11 +623,7 @@ EOF
$this->oWizard->GetParameter('db_user', ''),
$this->oWizard->GetParameter('db_pwd', '')
);
if ($oMutex->TryLock())
{
$oMutex->Unlock();
}
else
if ($oMutex->IsLocked())
{
$oPage->p("<img src=\"../images/error.png\"/>&nbsp;An iTop CRON process is being executed on the target database. It is highly recommended to stop any iTop CRON process prior to running the setup program.");
}