Merge branch 'master' into develop

# Conflicts:
#	datamodels/2.x/itop-attachments/nl.dict.itop-attachments.php
This commit is contained in:
Pierre Goiffon
2019-03-15 17:23:04 +01:00
53 changed files with 457 additions and 303 deletions

View File

@@ -37,6 +37,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'Attachment:Max_Ko' => '(Maximální velikost souboru: %1$s KiB)',
'Attachments:NoAttachment' => 'Žádná příloha. ',
'Attachments:PreviewNotAvailable' => 'Pro tento typ přílohy není náhled k dispozici.',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -34,6 +34,7 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Attachment:Max_Ko' => '(Maksimal størrelse: %1$s KB)',
'Attachments:NoAttachment' => 'Intet vedhæftet. ',
'Attachments:PreviewNotAvailable' => 'Preview not available for this type of attachment.~~',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -36,6 +36,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Attachment:Max_Ko' => '(Maximale Dateigröße: %1$s KB)',
'Attachments:NoAttachment' => 'Kein Attachment. ',
'Attachments:PreviewNotAvailable' => 'Vorschau für diesen Attachment-Typ nicht verfügbar.',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -35,6 +35,7 @@ Dict::Add('EN US', 'English', 'English', array(
'Attachment:Max_Ko' => '(Maximum file size: %1$s Ko)',
'Attachments:NoAttachment' => 'No attachment. ',
'Attachments:PreviewNotAvailable' => 'Preview not available for this type of attachment.',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s',
));
//

View File

@@ -36,6 +36,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellaño', array(
'Attachment:Max_Ko' => '(Tamaño Máximo de Archivo: %1$s Kb)',
'Attachments:NoAttachment' => 'No hay Anexo. ',
'Attachments:PreviewNotAvailable' => 'Vista preliminar no disponible para este tipo de Anexo.',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -35,6 +35,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Attachment:Max_Ko' => '(Taille de fichier max.: %1$s Kb)',
'Attachments:NoAttachment' => 'Aucune pièce jointe.',
'Attachments:PreviewNotAvailable' => 'Pas d\'aperçu pour ce type de pièce jointe.',
'Attachments:Error:FileTooLarge' => 'Le fichier est trop gros pour être chargé. %1$s',
));
//

View File

@@ -34,6 +34,7 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Attachment:Max_Ko' => '(Maximum file size: %1$s Ko)~~',
'Attachments:NoAttachment' => 'No attachment. ~~',
'Attachments:PreviewNotAvailable' => 'Preview not available for this type of attachment.~~',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -34,6 +34,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Attachment:Max_Ko' => '(Maximum file size: %1$s Ko)~~',
'Attachments:NoAttachment' => 'No attachment. ~~',
'Attachments:PreviewNotAvailable' => 'Preview not available for this type of attachment.~~',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -33,6 +33,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Attachment:Max_Ko' => '(最大ファイルサイズ: %1$s KB)',
'Attachments:NoAttachment' => '添付はありません。',
'Attachments:PreviewNotAvailable' => 'Preview not available for this type of attachment.~~',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -54,16 +54,42 @@ class AttachmentPlugIn implements iApplicationUIExtension, iApplicationObjectExt
}
}
protected function GetMaxUpload()
/**
* Returns the value of "upload_max_filesize" in bytes if upload allowed, false otherwise.
*
* @since 2.6.1
*
* @return number|boolean
*/
public static function GetMaxUploadSize()
{
$iMaxUpload = ini_get('upload_max_filesize');
$sMaxUpload = ini_get('upload_max_filesize');
if (!$sMaxUpload)
{
$result = false;
}
else
{
$result = utils::ConvertToBytes($sMaxUpload);
}
return $result;
}
/**
* Returns the max. file upload size allowed as a dictionary entry
*
* @return string
*/
public static function GetMaxUpload()
{
$iMaxUpload = static::GetMaxUploadSize();
if (!$iMaxUpload)
{
$sRet = Dict::S('Attachments:UploadNotAllowedOnThisSystem');
}
else
{
$iMaxUpload = utils::ConvertToBytes($iMaxUpload);
if ($iMaxUpload > 1024*1024*1024)
{
$sRet = Dict::Format('Attachment:Max_Go', sprintf('%0.2f', $iMaxUpload/(1024*1024*1024)));
@@ -327,13 +353,16 @@ EOF
}
}
$oPage->add('</span>');
$oPage->add('<div style="clear:both"></div>');
$sMaxUpload = $this->GetMaxUpload();
$oPage->p(Dict::S('Attachments:AddAttachment').'<input type="file" name="file" id="file"><span style="display:none;" id="attachment_loading">&nbsp;<img src="../images/indicator.gif"></span> '.$sMaxUpload);
$oPage->add('</span>');
$oPage->add('<div style="clear:both"></div>');
$iMaxUploadInBytes = $this->GetMaxUploadSize();
$sMaxUploadLabel = $this->GetMaxUpload();
$sFileTooBigLabel = Dict::Format('Attachments:Error:FileTooLarge', $sMaxUploadLabel);
$sFileTooBigLabelForJS = addslashes($sFileTooBigLabel);
$oPage->p(Dict::S('Attachments:AddAttachment').'<input type="file" name="file" id="file"><span style="display:none;" id="attachment_loading">&nbsp;<img src="../images/indicator.gif"></span> '.$sMaxUploadLabel);
$oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery.iframe-transport.js');
$oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery.fileupload.js');
$oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery.fileupload.js');
$sDownloadLink = utils::GetAbsoluteUrlAppRoot().ATTACHMENT_DOWNLOAD_URL;
$oPage->add_ready_script(
@@ -362,6 +391,21 @@ EOF
}
}
},
send: function(e, data){
// Don't send attachment if size is greater than PHP post_max_size, otherwise it will break the request and all its parameters (\$_REQUEST, \$_POST, ...)
// Note: We loop on the files as the data structures is an array but in this case, we only upload 1 file at a time.
var iTotalSizeInBytes = 0;
for(var i = 0; i < data.files.length; i++)
{
iTotalSizeInBytes += data.files[i].size;
}
if(iTotalSizeInBytes > $iMaxUploadInBytes)
{
alert('$sFileTooBigLabelForJS');
return false;
}
},
start: function() {
$('#attachment_loading').show();
},

View File

@@ -41,7 +41,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'Attachments:PreviewNotAvailable' => 'Een voorbeeld is niet beschikbaar voor dit type bijlage.',
'Class:Attachment' => 'Bijlage',
'Class:Attachment+' => '',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -35,6 +35,7 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Attachment:Max_Ko' => '(Tamanho máximo arquivo: %1$s Kb)',
'Attachments:NoAttachment' => 'Nenhum anexo. ',
'Attachments:PreviewNotAvailable' => 'Preview not available for this type of attachment.~~',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -22,6 +22,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'Attachment:Max_Ko' => '(Максимальный размер файла: %1$s кБ)',
'Attachments:NoAttachment' => 'Нет вложений.',
'Attachments:PreviewNotAvailable' => 'Предварительный просмотр не доступен для этого типа вложений.',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -34,6 +34,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'Attachment:Max_Ko' => '(Maximum file size: %1$s Ko)~~',
'Attachments:NoAttachment' => 'No attachment. ~~',
'Attachments:PreviewNotAvailable' => 'Preview not available for this type of attachment.~~',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -34,6 +34,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Attachment:Max_Ko' => '(最大文件尺寸: %1$s KB)',
'Attachments:NoAttachment' => '没有附件. ',
'Attachments:PreviewNotAvailable' => '该附件类型不支持预览.',
'Attachments:Error:FileTooLarge' => 'File is too large to be uploaded. %1$s~~',
));
//

View File

@@ -21,4 +21,5 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'config-reverted' => 'The configuration has been reverted.~~',
'config-parse-error' => 'Řádek %2$d: %1$s.<br/>Soubor nebyl uložen.',
'config-current-line' => 'Řádek: %1$s',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -34,4 +34,5 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
'config-reverted' => 'The configuration has been reverted.~~',
'config-parse-error' => 'Line %2$d: %1$s.<br/>The file has NOT been updated.~~',
'config-current-line' => 'Editing line: %1$s~~',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -36,4 +36,5 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'config-reverted' => 'Die Konfiguration wurde zurückgesetzt',
'config-parse-error' => 'Zeile %2$d: %1$s.<br/>Die Datei wurde nicht aktualisiert.',
'config-current-line' => 'Editiere Zeile: %1$s',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -34,4 +34,5 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellaño', array(
'config-reverted' => 'La configuración ha sido revertida.',
'config-parse-error' => 'Línea %2$d: %1$s.<br/>El archivo NO ha sido actualizado.',
'config-current-line' => 'Editando línea: %1$s',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -34,4 +34,5 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'config-reverted' => 'The configuration has been reverted.~~',
'config-parse-error' => 'Line %2$d: %1$s.<br/>The file has NOT been updated.~~',
'config-current-line' => 'Editing line: %1$s~~',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -34,4 +34,5 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'config-reverted' => 'The configuration has been reverted.~~',
'config-parse-error' => 'Line %2$d: %1$s.<br/>The file has NOT been updated.~~',
'config-current-line' => 'Editing line: %1$s~~',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -34,4 +34,5 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'config-reverted' => 'The configuration has been reverted.~~',
'config-parse-error' => 'Line %2$d: %1$s.<br/>The file has NOT been updated.~~',
'config-current-line' => 'Editing line: %1$s~~',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -35,4 +35,5 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'config-reverted' => 'De wijzigingen zijn ongedaan gemaakt.',
'config-parse-error' => 'Regel %2$d: %1$s.<br/>Het bestand werd <b>NIET</b> opgeslagen.',
'config-current-line' => 'Huidige regel: %1$s',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -34,4 +34,5 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'config-reverted' => 'The configuration has been reverted.~~',
'config-parse-error' => 'Line %2$d: %1$s.<br/>The file has NOT been updated.~~',
'config-current-line' => 'Editing line: %1$s~~',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -22,4 +22,5 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'config-reverted' => 'The configuration has been reverted.~~',
'config-parse-error' => 'Строка %2$d: %1$s.<br/>Файл не был обновлен.',
'config-current-line' => 'Редактируемая строка: %1$s',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -34,4 +34,5 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'config-reverted' => 'The configuration has been reverted.~~',
'config-parse-error' => 'Line %2$d: %1$s.<br/>The file has NOT been updated.~~',
'config-current-line' => 'Editing line: %1$s~~',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -34,4 +34,5 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'config-reverted' => '配置文件已恢复.',
'config-parse-error' => '第 %2$d 行: %1$s.<br/>配置文件尚未更新.',
'config-current-line' => '正在编辑第 %1$s 行',
'config-saved-warning-db-password' => 'Successfully recorded, but the backup won\'t work due to unsupported characters in the database password.~~',
));

View File

@@ -40,6 +40,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'Portal:Button:Delete' => 'Smazat',
'Portal:EnvironmentBanner:Title' => 'You are currently in <strong>%1$s</strong> mode~~',
'Portal:EnvironmentBanner:GoToProduction' => 'Go back to PRODUCTION mode~~',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => 'Authentication~~',
'Error:HTTP:404' => 'Stránka nenalezena',
'Error:HTTP:500' => 'Jejda! Nastal problém',

View File

@@ -37,6 +37,7 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Portal:Button:Delete' => 'Delete~~',
'Portal:EnvironmentBanner:Title' => 'You are currently in <strong>%1$s</strong> mode~~',
'Portal:EnvironmentBanner:GoToProduction' => 'Go back to PRODUCTION mode~~',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => 'Authentication~~',
'Error:HTTP:404' => 'Page not found~~',
'Error:HTTP:500' => 'Oops! An error has occured.~~',

View File

@@ -37,6 +37,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Portal:Button:Delete' => 'Löschen',
'Portal:EnvironmentBanner:Title' => 'Sie sind im Moment im <strong>%1$s</strong> Modus',
'Portal:EnvironmentBanner:GoToProduction' => 'Zurück zum PRODUCTION Modus',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => 'Authentifizierung',
'Error:HTTP:404' => 'Seite nicht gefunden.',
'Error:HTTP:500' => 'Oops! Es ist ein Fehler aufgetreten.',

View File

@@ -38,6 +38,7 @@ Dict::Add('EN US', 'English', 'English', array(
'Portal:Button:Delete' => 'Delete',
'Portal:EnvironmentBanner:Title' => 'You are currently in <strong>%1$s</strong> mode',
'Portal:EnvironmentBanner:GoToProduction' => 'Go back to PRODUCTION mode',
'Error:HTTP:400' => 'Bad request',
'Error:HTTP:401' => 'Authentication',
'Error:HTTP:404' => 'Page not found',
'Error:HTTP:500' => 'Oops! An error has occured.',

View File

@@ -36,6 +36,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellaño', array(
'Portal:Button:Delete' => 'Borrar',
'Portal:EnvironmentBanner:Title' => 'Se encuentra en modo <strong>%1$s</strong>',
'Portal:EnvironmentBanner:GoToProduction' => 'Regresar a modo PRODUCTION',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => 'Autenticación',
'Error:HTTP:404' => 'Página no encontrada',
'Error:HTTP:500' => '¡Vaya! Ha ocurrido un error.',

View File

@@ -36,6 +36,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Portal:Button:Delete' => 'Supprimer',
'Portal:EnvironmentBanner:Title' => 'Vous êtes dans le mode <strong>%1$s</strong>',
'Portal:EnvironmentBanner:GoToProduction' => 'Retourner au mode PRODUCTION',
'Error:HTTP:400' => 'Requête incorrecte',
'Error:HTTP:401' => 'Authentification',
'Error:HTTP:404' => 'Page non trouvée',
'Error:HTTP:500' => 'Oups ! Une erreur est survenue.',

View File

@@ -37,6 +37,7 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Portal:Button:Delete' => 'Delete~~',
'Portal:EnvironmentBanner:Title' => 'You are currently in <strong>%1$s</strong> mode~~',
'Portal:EnvironmentBanner:GoToProduction' => 'Go back to PRODUCTION mode~~',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => 'Authentication~~',
'Error:HTTP:404' => 'Page not found~~',
'Error:HTTP:500' => 'Oops! An error has occured.~~',

View File

@@ -37,6 +37,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Portal:Button:Delete' => 'Delete~~',
'Portal:EnvironmentBanner:Title' => 'You are currently in <strong>%1$s</strong> mode~~',
'Portal:EnvironmentBanner:GoToProduction' => 'Go back to PRODUCTION mode~~',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => 'Authentication~~',
'Error:HTTP:404' => 'Page not found~~',
'Error:HTTP:500' => 'Oops! An error has occured.~~',

View File

@@ -37,6 +37,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Portal:Button:Delete' => 'Delete~~',
'Portal:EnvironmentBanner:Title' => 'You are currently in <strong>%1$s</strong> mode~~',
'Portal:EnvironmentBanner:GoToProduction' => 'Go back to PRODUCTION mode~~',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => 'Authentication~~',
'Error:HTTP:404' => 'Page not found~~',
'Error:HTTP:500' => 'Oops! An error has occured.~~',

View File

@@ -37,6 +37,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'Portal:Button:Delete' => 'Verwijderen',
'Portal:EnvironmentBanner:Title' => 'Je werkt momenteel in de <strong>%1$s</strong>-omgeving',
'Portal:EnvironmentBanner:GoToProduction' => 'Keer terug naar de productie-omgeving',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => 'Aanmelden is vereist',
'Error:HTTP:404' => 'Pagina kan niet worden gevonden',
'Error:HTTP:500' => 'Oeps! Er is een fout opgetreden',

View File

@@ -893,7 +893,7 @@ class ManageBrickController extends BrickController
$aGroupingTabsValues[$aDistinctResult['grouped_by_1']] = array(
'value' => $aDistinctResult['grouped_by_1'],
'label_html' => $sHtmlLabel,
'label' => strip_tags($sHtmlLabel),
'label' => strip_tags(html_entity_decode($sHtmlLabel, ENT_QUOTES, 'UTF-8')),
'condition' => $oConditionQuery,
'count' => $aDistinctResult['_itop_count_'],
);

View File

@@ -1383,7 +1383,7 @@ class ObjectController extends AbstractController
break;
default:
$oApp->abort(403);
$oApp->abort(403, Dict::S('Error:HTTP:400'));
break;
}

View File

@@ -123,7 +123,7 @@
</div>
</form>
{% else %}
{{ 'Brick:Portal:UserProfile:Password:CantChangeContactAdministrator'|dict_s }}
{{ 'Brick:Portal:UserProfile:Password:CantChangeContactAdministrator'|dict_format(constant('ITOP_APPLICATION_SHORT')) }}
{% endif %}
</div>
</div>

View File

@@ -93,7 +93,7 @@ $oApp->before(function(Symfony\Component\HttpFoundation\Request $oRequest, Silex
$iLogonRes = LoginWebPage::DoLoginEx(PORTAL_ID, false, $iExitMethod);
if( ($iExitMethod === LoginWebPage::EXIT_RETURN) && ($iLogonRes != 0) )
{
die(Dict::S('Portal:ErrorUserLoggedOut'));
$oApp->abort(401);
}
// - User must be associated with a Contact
if (UserRights::GetContactId() == 0)

View File

@@ -36,6 +36,7 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Portal:Button:Delete' => 'Deletar',
'Portal:EnvironmentBanner:Title' => 'Você está atualmente em <strong>%1$s</strong>',
'Portal:EnvironmentBanner:GoToProduction' => 'Volte para o modo PRODUÇÃO',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => 'Autenticação',
'Error:HTTP:404' => 'Está página não existe',
'Error:HTTP:500' => 'Oops! Ocorreu um erro, informe a T.I.',

View File

@@ -25,6 +25,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'Portal:Button:Delete' => 'Удалить',
'Portal:EnvironmentBanner:Title' => 'You are currently in <strong>%1$s</strong> mode~~',
'Portal:EnvironmentBanner:GoToProduction' => 'Go back to PRODUCTION mode~~',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => 'Ошибка аутентификации',
'Error:HTTP:404' => 'Страница не найдена',
'Error:HTTP:500' => 'Упс! Произошла ошибка.',

View File

@@ -37,6 +37,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'Portal:Button:Delete' => 'Delete~~',
'Portal:EnvironmentBanner:Title' => 'You are currently in <strong>%1$s</strong> mode~~',
'Portal:EnvironmentBanner:GoToProduction' => 'Go back to PRODUCTION mode~~',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => 'Authentication~~',
'Error:HTTP:404' => 'Page not found~~',
'Error:HTTP:500' => 'Oops! An error has occured.~~',

View File

@@ -37,6 +37,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Portal:Button:Delete' => '删除',
'Portal:EnvironmentBanner:Title' => '您目前处于 <strong>%1$s</strong> 模式',
'Portal:EnvironmentBanner:GoToProduction' => '回到产品模式',
'Error:HTTP:400' => 'Bad request~~',
'Error:HTTP:401' => '认证',
'Error:HTTP:404' => '页面找不到',
'Error:HTTP:500' => 'Oops! 发生了一个错误.',

View File

@@ -172,50 +172,50 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'WorkOrder:Moreinfo' => 'Дополнительная информация',
'Tickets:ResolvedFrom' => 'Автоматическое решение из %1$s',
'Class:cmdbAbstractObject/Method:Set' => 'Установить',
'Class:cmdbAbstractObject/Method:Set+' => 'Установить поле со статичным значением',
'Class:cmdbAbstractObject/Method:Set/Param:1' => 'Целевое поле',
'Class:cmdbAbstractObject/Method:Set/Param:1+' => 'Установить поле, в текущем объекте ',
'Class:cmdbAbstractObject/Method:Set/Param:2' => 'Значение',
'Class:cmdbAbstractObject/Method:Set/Param:2+' => 'Установить значение',
'Class:cmdbAbstractObject/Method:SetCurrentDate' => 'Установить текущую дату',
'Class:cmdbAbstractObject/Method:SetCurrentDate+' => 'Установить поле с текущей датой и временем',
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1' => 'Целевое поле',
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1+' => 'Установить поле, в текущем объекте',
'Class:cmdbAbstractObject/Method:SetCurrentUser' => 'Установитьтекущегопользователя',
'Class:cmdbAbstractObject/Method:SetCurrentUser+' => 'Установить поле с текущим вошедшим пользователем',
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1' => 'Целевое поле',
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1+' => 'Установить поле, в текущем объекте. Если поле является строкой, тогда будет использоваться псевдоним, в противном случае будет использоваться идентификатор. Псевдонимом является имя человека, если оно связано с пользователем, в иных случаях - это логин.',
'Class:cmdbAbstractObject/Method:SetCurrentPerson' => 'Установитьтекущуюперсону',
'Class:cmdbAbstractObject/Method:SetCurrentPerson+' => ' Установить поле с текущим вошедшим человеком ("человек" связан с "пользователь").',
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1' => 'Целевое поле',
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1+' => 'Установить поле, в текущем объекте. Если поле является строкой, тогда будет использоваться псевдоним, в противном случае будет использоваться идентификатор. Псевдонимом является имя человека, если оно связано с пользователем, в иных случаях - это логин.',
'Class:cmdbAbstractObject/Method:SetElapsedTime' => 'Установитьистекшеевремя',
'Class:cmdbAbstractObject/Method:SetElapsedTime+' => 'Установить поле с временем (секунды), истекающее с даты, задданой ',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1' => 'Целевое поле',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1+' => 'Установить поле, в текущем объекте ',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2' => 'Ссылочное поле',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2+' => 'Поле, откуда берется референсная дата',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3' => 'Рабочие часы',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3+' => 'Оставьте пустым, чтобы полагаться на стандартную схему рабочих часов, или установите значение «DefaultWorkingTimeComputer», чтобы принудительно настроить схему 24x7',
'Class:cmdbAbstractObject/Method:Reset' => 'Сброс',
'Class:cmdbAbstractObject/Method:Reset+' => 'Сбросить поле до его стандартного значения ',
'Class:cmdbAbstractObject/Method:Reset/Param:1' => 'Целевое поле',
'Class:cmdbAbstractObject/Method:Reset/Param:1+' => 'Сбросить поле, в текущем объекте',
'Class:cmdbAbstractObject/Method:Copy' => 'Копировать',
'Class:cmdbAbstractObject/Method:Copy+' => 'Скопировать значение с поля на другое поле',
'Class:cmdbAbstractObject/Method:Copy/Param:1' => 'Целевое поле',
'Class:cmdbAbstractObject/Method:Copy/Param:1+' => 'Установить поле, в текущем объекте ',
'Class:cmdbAbstractObject/Method:Copy/Param:2' => 'Исходное поле ',
'Class:cmdbAbstractObject/Method:Copy/Param:2+' => 'Присвоить значение поля, в текущем объекте',
'Class:cmdbAbstractObject/Method:Set' => 'Set~~',
'Class:cmdbAbstractObject/Method:Set+' => 'Set a field with a static value~~',
'Class:cmdbAbstractObject/Method:Set/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:Set/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:Set/Param:2' => 'Value~~',
'Class:cmdbAbstractObject/Method:Set/Param:2+' => 'The value to set~~',
'Class:cmdbAbstractObject/Method:SetCurrentDate' => 'SetCurrentDate~~',
'Class:cmdbAbstractObject/Method:SetCurrentDate+' => 'Set a field with the current date and time~~',
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetCurrentDate/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:SetCurrentUser' => 'SetCurrentUser~~',
'Class:cmdbAbstractObject/Method:SetCurrentUser+' => 'Set a field with the currently logged in user~~',
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetCurrentUser/Param:1+' => 'The field to set, in the current object. If the field is a string then the friendly name will be used, otherwise the identifier will be used. That friendly name is the name of the person if any is attached to the user, otherwise it is the login.~~',
'Class:cmdbAbstractObject/Method:SetCurrentPerson' => 'SetCurrentPerson~~',
'Class:cmdbAbstractObject/Method:SetCurrentPerson+' => 'Set a field with the currently logged in person (the "person" attached to the logged in "user").~~',
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetCurrentPerson/Param:1+' => 'The field to set, in the current object. If the field is a string then the friendly name will be used, otherwise the identifier will be used.~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime' => 'SetElapsedTime~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime+' => 'Set a field with the time (seconds) elapsed since a date given by another field~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2' => 'Reference Field~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:2+' => 'The field from which to get the reference date~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3' => 'Working Hours~~',
'Class:cmdbAbstractObject/Method:SetElapsedTime/Param:3+' => 'Leave empty to rely on the standard working hours scheme, or set to "DefaultWorkingTimeComputer" to force a 24x7 scheme~~',
'Class:cmdbAbstractObject/Method:Reset' => 'Reset~~',
'Class:cmdbAbstractObject/Method:Reset+' => 'Reset a field to its default value~~',
'Class:cmdbAbstractObject/Method:Reset/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:Reset/Param:1+' => 'The field to reset, in the current object~~',
'Class:cmdbAbstractObject/Method:Copy' => 'Copy~~',
'Class:cmdbAbstractObject/Method:Copy+' => 'Copy the value of a field to another field~~',
'Class:cmdbAbstractObject/Method:Copy/Param:1' => 'Target Field~~',
'Class:cmdbAbstractObject/Method:Copy/Param:1+' => 'The field to set, in the current object~~',
'Class:cmdbAbstractObject/Method:Copy/Param:2' => 'Source Field~~',
'Class:cmdbAbstractObject/Method:Copy/Param:2+' => 'The field to get the value from, in the current object~~',
'Class:cmdbAbstractObject/Method:ApplyStimulus' => 'ApplyStimulus~~',
'Class:cmdbAbstractObject/Method:ApplyStimulus+' => 'Apply the specified stimulus to the current object~~',
'Class:cmdbAbstractObject/Method:ApplyStimulus/Param:1' => 'Stimulus code~~',
'Class:cmdbAbstractObject/Method:ApplyStimulus/Param:1+' => 'A valid stimulus code for the current class~~',
'Class:ResponseTicketTTO/Interface:iMetricComputer' => 'Время создания тикета до его назначения',
'Class:ResponseTicketTTO/Interface:iMetricComputer+' => 'TTO Цель, основанная на SLT типа ТТО',
'Class:ResponseTicketTTR/Interface:iMetricComputer' => 'Время решения',
'Class:ResponseTicketTTR/Interface:iMetricComputer+' => 'Цель основанная на SLT типа TTR',
'Class:ResponseTicketTTO/Interface:iMetricComputer' => 'Time To Own~~',
'Class:ResponseTicketTTO/Interface:iMetricComputer+' => 'Goal based on a SLT of type TTO~~',
'Class:ResponseTicketTTR/Interface:iMetricComputer' => 'Time To Resolve~~',
'Class:ResponseTicketTTR/Interface:iMetricComputer+' => 'Goal based on a SLT of type TTR~~',
'portal:itop-portal' => 'Пользовательский портал', // This is the portal name that will be displayed in portal dispatcher (eg. URL in menus)
'Page:DefaultTitle' => '%1$s - Пользовательский портал',