diff --git a/application/config/version.php b/application/config/version.php index 55f37a7e222..09ec7f5167a 100644 --- a/application/config/version.php +++ b/application/config/version.php @@ -16,5 +16,5 @@ $config['buildnumber'] = ''; $config['updatable'] = true; $config['templateapiversion'] = 3; -$config['assetsversionnumber'] = '30366'; +$config['assetsversionnumber'] = '30367'; return $config; diff --git a/application/controllers/QuotasController.php b/application/controllers/QuotasController.php index a5d23b830cb..160bc0206d2 100644 --- a/application/controllers/QuotasController.php +++ b/application/controllers/QuotasController.php @@ -36,7 +36,7 @@ public function actionIndex($surveyid) { $surveyid = sanitize_int($surveyid); if (!Permission::model()->hasSurveyPermission($surveyid, 'quotas')) { - throw new CHttpException(403, gT("You do not have permission on this survey.")); + throw new CHttpException(403, gT("You do not have permission for this survey.")); } $oSurvey = Survey::model()->findByPk($surveyid); $aData['surveyid'] = $oSurvey->sid; @@ -104,8 +104,8 @@ public function actionIndex($surveyid) public function actionQuickCSVReport($surveyid) { $surveyid = sanitize_int($surveyid); - if (!Permission::model()->hasSurveyPermission($surveyId, 'quotas')) { - throw new CHttpException(403, gT("You do not have permission on this survey.")); + if (!Permission::model()->hasSurveyPermission($surveyid, 'quotas')) { + throw new CHttpException(403, gT("You do not have permission for this survey.")); } $oSurvey = Survey::model()->findByPk($surveyid); @@ -133,7 +133,7 @@ public function actionAddNewQuota($surveyid) { $surveyid = sanitize_int($surveyid); if (!Permission::model()->hasSurveyPermission($surveyid, 'quotas', 'create')) { - throw new CHttpException(403, gT("You do not have permission on this survey.")); + throw new CHttpException(403, gT("You do not have permission for this survey.")); } Yii::app()->loadHelper('admin.htmleditor'); @@ -435,7 +435,7 @@ private function getQuotaWithPermission($quotaId, $sPermission = 'read') throw new CHttpException(404, gT("Quota not found.")); } if (!Permission::model()->hasSurveyPermission($oQuota->sid, 'quotas', $sPermission)) { - throw new CHttpException(403, gT("You do not have permission on this quota.")); + throw new CHttpException(403, gT("You do not have permission for this quota.")); } return $oQuota; } diff --git a/application/controllers/UserGroupController.php b/application/controllers/UserGroupController.php index 6a352aaaf44..0de8f0d1bfb 100644 --- a/application/controllers/UserGroupController.php +++ b/application/controllers/UserGroupController.php @@ -118,7 +118,7 @@ public function actionViewGroup($ugid, bool $header = false) || ($userGroup->hasUser(Yii::app()->user->id) && Permission::model()->hasGlobalPermission('usergroups', 'read')) // inside group and have global UserGroup view ) ) { - throw new CHttpException(403, gT("Access forbidden: you do not have permission to view this user group.")); + throw new CHttpException(403, gT("No access : you do not have permission to this users group.")); } $aData = []; @@ -471,7 +471,7 @@ public function actionMailToAllUsersInGroup(int $ugid) !Permission::model()->hasGlobalPermission('superadmin', 'read') // User is not a superadmin && $userGroup->owner_id != $currentUserId // User is not owner ) { - throw new CHttpException(403, gT("Access forbidden: you do not have permission to send emails to all users.")); + throw new CHttpException(403, gT("No access : you do not have permission to send emails to all users.")); } $redirectUrl = App()->createUrl("userGroup/viewGroup", ['ugid' => $ugid]); $aData = []; diff --git a/application/controllers/UserManagementController.php b/application/controllers/UserManagementController.php index e3290b6c860..24fab82a056 100644 --- a/application/controllers/UserManagementController.php +++ b/application/controllers/UserManagementController.php @@ -1324,13 +1324,13 @@ public function actionBatchApplyRoles() $aResults[$sItem]['title'] = $model->users_name; if ($model->uid == Yii::app()->user->id) { $aResults[$sItem]['result'] = false; - $aResults[$sItem]['error'] = gT("You can not update your own roles."); + $aResults[$sItem]['error'] = gT("You are not allowed to update your own roles."); continue; } $userManager = new UserManager(Yii::app()->user, $model); if (!$userManager->canAssignRole()) { $aResults[$sItem]['result'] = false; - $aResults[$sItem]['error'] = gT('You can not set role to this user.'); + $aResults[$sItem]['error'] = gT('You are not allowed to assign a role to this user.'); } else { foreach ($aUserRoleIds as $iUserRoleId) { $aResults[$sItem]['result'] = Permissiontemplates::model()->applyToUser($sItem, $iUserRoleId); diff --git a/application/core/LSYii_Application.php b/application/core/LSYii_Application.php index 5300b6e782b..f816fe174bb 100644 --- a/application/core/LSYii_Application.php +++ b/application/core/LSYii_Application.php @@ -591,44 +591,4 @@ private function setSessionByDB($aApplicationConfig) 'lifetime' => $lifetime ]); } - - /** - * Creates an absolute URL based on the given controller and action information. - * @param string $route the URL route. This should be in the format of 'ControllerID/ActionID'. - * @param array $params additional GET parameters (name=>value). Both the name and value will be URL-encoded. - * @param string $schema schema to use (e.g. http, https). If empty, the schema used for the current request will be used. - * @param string $ampersand the token separating name-value pairs in the URL. - * @return string the constructed URL - */ - public function createPublicUrl($route, $params = array(), $schema = '', $ampersand = '&') - { - $sPublicUrl = $this->getPublicBaseUrl(true); - $sActualBaseUrl = Yii::app()->getBaseUrl(true); - if ($sPublicUrl !== $sActualBaseUrl) { - $url = parent::createAbsoluteUrl($route, $params, $schema, $ampersand); - if (substr((string)$url, 0, strlen((string)$sActualBaseUrl)) == $sActualBaseUrl) { - $url = substr((string)$url, strlen((string)$sActualBaseUrl)); - } - return trim((string)$sPublicUrl, "/") . $url; - } else { - return parent::createAbsoluteUrl($route, $params, $schema, $ampersand); - } - } - - /** - * Returns the relative URL for the application while - * considering if a "publicurl" config parameter is set to a valid url - * @param boolean $absolute whether to return an absolute URL. Defaults to false, meaning returning a relative one. - * @return string the relative or the configured public URL for the application - */ - public function getPublicBaseUrl($absolute = false) - { - $sPublicUrl = Yii::app()->getConfig("publicurl"); - $aPublicUrl = parse_url($sPublicUrl); - $baseUrl = parent::getBaseUrl($absolute); - if (isset($aPublicUrl['scheme']) && isset($aPublicUrl['host'])) { - $baseUrl = $sPublicUrl; - } - return $baseUrl; - } } diff --git a/application/core/QuestionTypes/Date/RenderDate.php b/application/core/QuestionTypes/Date/RenderDate.php index db86820b488..c14b6569437 100644 --- a/application/core/QuestionTypes/Date/RenderDate.php +++ b/application/core/QuestionTypes/Date/RenderDate.php @@ -128,7 +128,13 @@ private function getDaySelect($iCurrent) { return Yii::app()->twigRenderer->renderQuestion( $this->getMainView() . '/dropdown/rows/day', - array('dayId' => $this->sSGQA, 'currentday' => $iCurrent), + array( + 'dayId' => $this->sSGQA, + 'currentday' => $iCurrent, + 'lang' => [ + 'Day' => gT("Day") + ] + ), true ); } @@ -138,7 +144,14 @@ private function getMonthSelect($iCurrent) return Yii::app()->twigRenderer->renderQuestion( $this->getMainView() . '/dropdown/rows/month', - array('monthId' => $this->sSGQA, 'currentmonth' => $iCurrent, 'montharray' => $this->getTranslatorData()['montharray']), + array( + 'monthId' => $this->sSGQA, + 'currentmonth' => $iCurrent, + 'montharray' => $this->getTranslatorData()['montharray'], + 'lang' => [ + 'Month' => gT("Month") + ] + ), true ); } @@ -185,7 +198,10 @@ private function getYearSelect($iCurrent) 'yearmax' => $yearmax, 'reverse' => $reverse, 'yearmin' => $yearmin, - 'step' => $step + 'step' => $step, + 'lang' => [ + 'Year' => gT("Year") + ] ), true ); @@ -195,7 +211,14 @@ private function getHourSelect($iCurrent, $datepart) { return Yii::app()->twigRenderer->renderQuestion( $this->getMainView() . '/dropdown/rows/hour', - array('hourId' => $this->sSGQA, 'currenthour' => $iCurrent, 'datepart' => $datepart), + array( + 'hourId' => $this->sSGQA, + 'currenthour' => $iCurrent, + 'datepart' => $datepart, + 'lang' => [ + 'Hour' => gT("Hour") + ] + ), true ); } @@ -208,7 +231,10 @@ private function getMinuteSelect($iCurrent, $datepart) 'minuteId' => $this->sSGQA, 'currentminute' => $iCurrent, 'dropdown_dates_minute_step' => $this->getQuestionAttribute('dropdown_dates_minute_step'), - 'datepart' => $datepart + 'datepart' => $datepart, + 'lang' => [ + 'Minute' => gT("Minute") + ] ), true ); @@ -325,8 +351,7 @@ public function renderDropdownDates($dateoutput, $coreClass) LSYii_ClientScript::POS_POSTSCRIPT, true ); - - + // ==> answer $answer = Yii::app()->twigRenderer->renderQuestion( $this->getMainView() . '/dropdown/answer', @@ -339,6 +364,14 @@ public function renderDropdownDates($dateoutput, $coreClass) 'checkconditionFunction' => $this->checkconditionFunction . '(this.value, this.name, this.type)', 'dateformatdetails' => $this->aDateformatDetails['jsdate'], 'dateformat' => $this->aDateformatDetails['jsdate'], + /* language part, to be translated (see issue #19294) */ + 'lang' => [ + 'Day' => gT("Day"), + 'Month' => gT("Month"), + 'Year' => gT("Year"), + 'Hour' => gT("Hour"), + 'Minute' => gT("Minute"), + ] ), true ); diff --git a/application/core/Traits/LSApplicationTrait.php b/application/core/Traits/LSApplicationTrait.php index 7db6f7b9fb1..f27f7db8743 100644 --- a/application/core/Traits/LSApplicationTrait.php +++ b/application/core/Traits/LSApplicationTrait.php @@ -35,4 +35,44 @@ public function getCurrentUserId() } return $this->currentUserId; } + + /** + * Creates an absolute URL based on the given controller and action information. + * @param string $route the URL route. This should be in the format of 'ControllerID/ActionID'. + * @param array $params additional GET parameters (name=>value). Both the name and value will be URL-encoded. + * @param string $schema schema to use (e.g. http, https). If empty, the schema used for the current request will be used. + * @param string $ampersand the token separating name-value pairs in the URL. + * @return string the constructed URL + */ + public function createPublicUrl($route, $params = array(), $schema = '', $ampersand = '&') + { + $sPublicUrl = $this->getPublicBaseUrl(true); + $sActualBaseUrl = $this->getBaseUrl(true); + if ($sPublicUrl !== $sActualBaseUrl) { + $url = $this->createAbsoluteUrl($route, $params, $schema, $ampersand); + if (substr((string)$url, 0, strlen((string)$sActualBaseUrl)) == $sActualBaseUrl) { + $url = substr((string)$url, strlen((string)$sActualBaseUrl)); + } + return trim((string)$sPublicUrl, "/") . $url; + } else { + return $this->createAbsoluteUrl($route, $params, $schema, $ampersand); + } + } + + /** + * Returns the relative URL for the application while + * considering if a "publicurl" config parameter is set to a valid url + * @param boolean $absolute whether to return an absolute URL. Defaults to false, meaning returning a relative one. + * @return string the relative or the configured public URL for the application + */ + public function getPublicBaseUrl($absolute = false) + { + $sPublicUrl = Yii::app()->getConfig("publicurl"); + $aPublicUrl = parse_url($sPublicUrl); + $baseUrl = $this->getBaseUrl($absolute); + if (isset($aPublicUrl['scheme']) && isset($aPublicUrl['host'])) { + $baseUrl = $sPublicUrl; + } + return $baseUrl; + } } diff --git a/application/core/plugins/AzureOAuthSMTP/AzureOAuthSMTP.php b/application/core/plugins/AzureOAuthSMTP/AzureOAuthSMTP.php index d1f9ae4dbdb..68c531cf335 100644 --- a/application/core/plugins/AzureOAuthSMTP/AzureOAuthSMTP.php +++ b/application/core/plugins/AzureOAuthSMTP/AzureOAuthSMTP.php @@ -66,7 +66,7 @@ public function beforeActivate() if (!(PHP_VERSION_ID >= 70300)) { $event = $this->getEvent(); $event->set('success', false); - $event->set('message', gT("This plugin requires PHP 7.3 or above.")); + $event->set('message', gT("This plugin requires PHP version 7.3 or higher.")); } } @@ -265,7 +265,7 @@ protected function afterRefreshTokenRetrieved($provider, $token) */ protected function getDisplayName() { - return gT('Azure'); + return 'Azure'; } /** diff --git a/application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php b/application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php index d7e9041970c..e71414fcdb9 100644 --- a/application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php +++ b/application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php @@ -76,8 +76,7 @@ private function getHelpContent() gT("Setup the OAuth 2.0 Web Application in %s."), gT("Google Cloud Platform Console"), gT("Redirect URI:"), - gT("You can find more details %s."), - gT("here"), + gT("You can find more details %shere%s."), gT("Activate the plugin."), gT("Set the 'Client ID' and 'Client Secret' below and save the settings."), gT("Click the 'Get Token' button to open Google's consent screen in a new window."), @@ -220,7 +219,7 @@ public function beforeEmailDispatch() */ protected function getDisplayName() { - return gT('Google'); + return 'Google'; } public function beforePrepareRedirectToAuthPage() diff --git a/application/core/plugins/GoogleOAuthSMTP/views/Help.twig b/application/core/plugins/GoogleOAuthSMTP/views/Help.twig index 334d22f5068..b78a4a66744 100644 --- a/application/core/plugins/GoogleOAuthSMTP/views/Help.twig +++ b/application/core/plugins/GoogleOAuthSMTP/views/Help.twig @@ -20,7 +20,7 @@
  • {{ sprintf(gT("Setup the OAuth 2.0 Web Application in %s."), '' ~ gT("Google Cloud Platform Console") ~ ' ') }}
    {{ gT("Redirect URI:") }} {{ redirectUri }}
    -
    {{ sprintf(gT("You can find more details %s."), '' ~ gT("here") ~ ' ') }}
    +
    {{ sprintf(gT("You can find more details %shere%s"), '', ' ') }}
  • {{ gT("Activate the plugin.") }}
  • {{ gT("Set the 'Client ID' and 'Client Secret' below and save the settings.") }}
  • diff --git a/application/extensions/AccordionWidget/AccordionWidget.php b/application/extensions/AccordionWidget/AccordionWidget.php index d98d3a95cc7..e52568f0bab 100644 --- a/application/extensions/AccordionWidget/AccordionWidget.php +++ b/application/extensions/AccordionWidget/AccordionWidget.php @@ -26,7 +26,7 @@ public function normaliseItems($items) 'id' => $item['id'] ?? $this->id . '_item_' . bin2hex(random_bytes(2)), 'title' => $item['title'] ?? null, 'content' => $item['content'] ?? null, - 'open' => $item['open'] ?? false, + 'open' => $item['open'] ?? true, 'style' => $item['style'] ?? '' ]; }, $items); diff --git a/application/extensions/AccordionWidget/views/accordion.php b/application/extensions/AccordionWidget/views/accordion.php index 582565cfdc5..e17676a436b 100644 --- a/application/extensions/AccordionWidget/views/accordion.php +++ b/application/extensions/AccordionWidget/views/accordion.php @@ -3,18 +3,18 @@

    diff --git a/application/helpers/admin/export/CsvWriter.php b/application/helpers/admin/export/CsvWriter.php index 73cada7f3a5..f79ee9a2031 100644 --- a/application/helpers/admin/export/CsvWriter.php +++ b/application/helpers/admin/export/CsvWriter.php @@ -96,11 +96,14 @@ public function close() /** * Returns the value with all necessary escaping needed to place it into a CSV string. * - * @param string $value + * @param string|null $value * @return string */ protected function csvEscape($value) { + if (is_null($value)) { + return ''; + } $sString = preg_replace(array('~\R~u'), array("\n"), $value); return '"' . str_replace('"', '""', $sString) . '"'; } diff --git a/application/helpers/admin/export/SurveyObj.php b/application/helpers/admin/export/SurveyObj.php index 6a5058df999..1e73d0c9377 100644 --- a/application/helpers/admin/export/SurveyObj.php +++ b/application/helpers/admin/export/SurveyObj.php @@ -77,18 +77,19 @@ class SurveyObj * but could also be a comment entered by a participant. * * @param string $fieldName - * @param string $answerCode + * @param string|null $answerCode * @param Translator $translator * @param string $sLanguageCode - * @return string (or false) + * @return string */ public function getFullAnswer($fieldName, $answerCode, Translator $translator, $sLanguageCode) { - $fullAnswer = null; + $fullAnswer = ''; $fieldType = $this->fieldMap[$fieldName]['type']; $question = $this->fieldMap[$fieldName]; $questionId = $question['qid']; - $answer = null; + $answer = ''; + $answerCode = strval($answerCode); if ($questionId) { $answers = $this->getAnswers($questionId); if (isset($answers[$answerCode])) { @@ -129,7 +130,7 @@ public function getFullAnswer($fieldName, $answerCode, Translator $translator, $ if (array_key_exists($answerCode, $answers)) { $fullAnswer = $answers[$answerCode]; } else { - $fullAnswer = null; + $fullAnswer = ''; } break; @@ -252,11 +253,14 @@ public function getFullAnswer($fieldName, $answerCode, Translator $translator, $ * Returns the short answer for the question. * * @param string $sFieldName - * @param string $sValue + * @param string|null $sValue * @return string */ public function getShortAnswer($sFieldName, $sValue) { + if (is_null($sValue)) { + return ""; + } $aQuestion = $this->fieldMap[$sFieldName]; $sFieldType = $aQuestion['type']; diff --git a/application/helpers/admin/exportresults_helper.php b/application/helpers/admin/exportresults_helper.php index 9fb6ba6fd36..c55fc8cdcde 100644 --- a/application/helpers/admin/exportresults_helper.php +++ b/application/helpers/admin/exportresults_helper.php @@ -105,7 +105,7 @@ function exportResponses($iSurveyId, $sLanguageCode, $sExportPlugin, FormattingO $writer->init($survey, $sLanguageCode, $oOptions); $countResponsesCommand = $surveyDao->loadSurveyResults($survey, $oOptions->responseMinRecord, $oOptions->responseMaxRecord, $sFilter, $oOptions->responseCompletionState, $oOptions->selectedColumns, $oOptions->aResponses); - $countResponsesCommand->order = null; + $countResponsesCommand->order = false; $countResponsesCommand->select('count(*)'); $responseCount = $countResponsesCommand->queryScalar(); $maxRows = 100; diff --git a/application/helpers/update/updates/Update_617.php b/application/helpers/update/updates/Update_617.php index 0622c6ca83b..ae01ef09a8d 100644 --- a/application/helpers/update/updates/Update_617.php +++ b/application/helpers/update/updates/Update_617.php @@ -23,11 +23,11 @@ public function up(): void private function deleteDuplicateTemplateConfigurationEntries(): void { $aKeepIds = $this->db->createCommand() - ->select("MAX(id) AS maxRecordId") + ->select("MAX(id) AS maxrecordid") ->from("{{template_configuration}}") ->group(['template_name', 'sid', 'gsid', 'uid']) ->queryAll(); - $aKeepIds = array_column($aKeepIds, 'maxRecordId'); + $aKeepIds = array_column($aKeepIds, 'maxrecordid'); $criteria = $this->db->getCommandBuilder()->createCriteria(); $criteria->select = 'id, template_name, sid, gsid, uid'; $criteria->addNotInCondition('id', $aKeepIds); diff --git a/application/libraries/PluginManager/SmtpOAuthPluginBase.php b/application/libraries/PluginManager/SmtpOAuthPluginBase.php index 77b00ee2146..e5a1a6f75e8 100644 --- a/application/libraries/PluginManager/SmtpOAuthPluginBase.php +++ b/application/libraries/PluginManager/SmtpOAuthPluginBase.php @@ -341,8 +341,8 @@ public function getPluginSettings($getValues = true) if (!empty($emailAddress)) { $settings['currentEmail'] = [ 'type' => 'string', - 'label' => gT('Saved Token Owner'), - 'help' => gT('This is the email address used to create the current authentication token. Please note all emails will be sent from this address.'), + 'label' => gT('Token owner email address'), + 'help' => gT('This is the email address used to create the current authentication token. Please note that all emails will be sent from this address.'), 'htmlOptions' => [ 'readonly' => true, ], diff --git a/application/models/Survey.php b/application/models/Survey.php index f335293bd4c..340cf734065 100644 --- a/application/models/Survey.php +++ b/application/models/Survey.php @@ -2192,7 +2192,7 @@ public static function getPermissionData() 'import' => false, 'export' => false, 'title' => gT("Survey"), - 'description' => gT("Permission on survey (delete). Read permission is used to give access to this group."), + 'description' => gT("Permission for survey access. Read permission is a requirement to give any further permission to a survey."), 'img' => ' ri-list-check', ), 'surveyactivation' => array( diff --git a/application/models/User.php b/application/models/User.php index f4cddde6fac..77dc98c5f42 100644 --- a/application/models/User.php +++ b/application/models/User.php @@ -132,6 +132,12 @@ public function rules() /** @inheritdoc */ public function scopes() { + if (App()->getConfig("DBVersion") < 495) { + /* No expires column before 495 */ + return array( + 'active' => [] + ); + } return array( 'active' => array( 'condition' => "expires > :now OR expires IS NULL", diff --git a/application/models/services/Quotas.php b/application/models/services/Quotas.php index 364e2cc77a1..ef9f09071be 100644 --- a/application/models/services/Quotas.php +++ b/application/models/services/Quotas.php @@ -321,7 +321,7 @@ public function multipleItemsAction($aQuotaIds, $action, $languageSettings = []) /** @var \Quota $oQuota */ $oQuota = \Quota::model()->findByPk($iQuotaId); if (empty($oQuota) || $oQuota->sid != $this->survey->sid) { - $errors [] = gT("Invalid quota id"); + $errors [] = gT("Invalid quota ID"); } switch ($action) { case 'activate': diff --git a/application/views/SurveysGroupsPermission/subviews/viewCurrents.php b/application/views/SurveysGroupsPermission/subviews/viewCurrents.php index b900bd2795f..af8d247cb0c 100644 --- a/application/views/SurveysGroupsPermission/subviews/viewCurrents.php +++ b/application/views/SurveysGroupsPermission/subviews/viewCurrents.php @@ -1,6 +1,6 @@

    -

    > +
    $aGroup) : ?>
    diff --git a/application/views/admin/export/statistics_view.php b/application/views/admin/export/statistics_view.php index 3fd43e7e1af..3327b6089ed 100644 --- a/application/views/admin/export/statistics_view.php +++ b/application/views/admin/export/statistics_view.php @@ -36,6 +36,7 @@ [ 'id' => 'general-filters-item', 'title' => 'General filters', + 'open' => $filterchoice_state == '' && empty($summary), 'content' => $this->renderPartial( '/admin/export/statistics_subviews/_general_filters', array( @@ -56,6 +57,7 @@ [ 'id' => 'response-filters-item', 'title' => 'Response filters', + 'open' => $filterchoice_state == '' && empty($summary), 'content' => $this->renderPartial( '/admin/export/statistics_subviews/_response_filters', array( diff --git a/application/views/installer/precheck_view.php b/application/views/installer/precheck_view.php index 15990a295f9..8499ce7b0e6 100644 --- a/application/views/installer/precheck_view.php +++ b/application/views/installer/precheck_view.php @@ -126,7 +126,7 @@ - + isCollatorPresent ? $iconOk : $iconFail ?> diff --git a/application/views/responses/partial/responseListTable.php b/application/views/responses/partial/responseListTable.php index 879139040be..0e7b997f00c 100644 --- a/application/views/responses/partial/responseListTable.php +++ b/application/views/responses/partial/responseListTable.php @@ -222,8 +222,9 @@ ['afterquestion' => "
    ", 'separator' => ['', '
    ']]); if (!isset($filteredColumns) || in_array($column->name, $filteredColumns)) { + $encodedTitle = CHtml::encode($colTitle) == '' ? ' ' : CHtml::encode($colTitle); $aColumns[] = [ - 'header' => '
    ' . $colName . '
    ' . $colDetails . $encryptionSymbol . '
    ', + 'header' => '
    ' . $colName . '
    ' . $colDetails . $encryptionSymbol . '
    ', 'headerHtmlOptions' => ['style' => 'min-width: 350px;'], 'name' => $column->name, 'type' => 'raw', diff --git a/application/views/responses/partial/topbarBtns/leftSideButtons.php b/application/views/responses/partial/topbarBtns/leftSideButtons.php index e3cf0384b7b..86b52cbe02b 100644 --- a/application/views/responses/partial/topbarBtns/leftSideButtons.php +++ b/application/views/responses/partial/topbarBtns/leftSideButtons.php @@ -1,4 +1,12 @@ widget( 'ext.ButtonWidget.ButtonWidget', @@ -16,8 +24,7 @@ ); } -if ($hasResponsesExportPermission) { ?> - renderPartial( '/responses/partial/topbarBtns/responsesExportDropdownItems', get_defined_vars(), @@ -34,11 +41,9 @@ 'class' => 'btn btn-outline-secondary', ], ]); - ?> - - renderPartial( '/responses/partial/topbarBtns/responsesImportDropdownItems', get_defined_vars(), @@ -55,8 +60,48 @@ 'class' => 'btn btn-outline-secondary', ], ]); + } + +if ($hasStatisticsReadPermission) { + if ($oSurvey->getIsSaveTimings()) { + $this->widget( + 'ext.ButtonWidget.ButtonWidget', + [ + 'name' => 'response-timingStatistics', + 'id' => 'response-timingStatistics', + 'text' => gT('Timing statistics'), + 'icon' => 'ri-time-line', + 'link' => App()->createUrl("responses/time/", ['surveyId' => $oSurvey->sid]), + 'htmlOptions' => [ + 'class' => 'btn btn-outline-secondary', + 'role' => 'button' + ], + ] + ); + } else { + ?> + " + data-bs-toggle="tooltip" data-bs-placement="bottom"> + widget( + 'ext.ButtonWidget.ButtonWidget', + [ + 'name' => 'response-timingStatistics', + 'id' => 'response-timingStatistics', + 'text' => gT('Timing statistics'), + 'icon' => 'ri-time-line', + 'htmlOptions' => [ + 'class' => 'btn btn-outline-secondary', + 'role' => 'button', + 'disabled' => 'disabled' + ], + ] + ); ?> - + isAnonymized && $oSurvey->isTokenAnswersPersistence) { @@ -76,8 +121,8 @@ ); } else { // Show a disabled button if the survey is anonymized or token persistence is disabled - ?> - " style="display: inline-block" data-bs-toggle="tooltip" data-bs-placement="bottom"> + ?> + " data-bs-toggle="tooltip" data-bs-placement="bottom"> widget( 'ext.ButtonWidget.ButtonWidget', diff --git a/assets/packages/datetimepicker/datepickerInit.js b/assets/packages/datetimepicker/datepickerInit.js index 3397aa43e8f..020dced7723 100644 --- a/assets/packages/datetimepicker/datepickerInit.js +++ b/assets/packages/datetimepicker/datepickerInit.js @@ -105,9 +105,9 @@ function initDatePicker(element, locale, dateFormat) { locale = getValueFromConfigObject(options, 'locale', locale); let config = getConfig(options, locale,dateFormat); let constName = 'picker_' + element.id; - + let elementDate = element.value; pickers[constName] = new tempusDominus.TempusDominus(element, config); - setDatePickerFormat(pickers[constName], dateFormat, element.value); + setDatePickerFormat(pickers[constName], dateFormat, elementDate); attachCalendarIconToDatepicker(options); if(getValueFromConfigObject(options, 'allowinputtoggle', false)) { fixAllowInputToggle(element.id); diff --git a/assets/scripts/admin/statistics.js b/assets/scripts/admin/statistics.js index 6e9755d63f3..ba0a05d20a3 100644 --- a/assets/scripts/admin/statistics.js +++ b/assets/scripts/admin/statistics.js @@ -1,13 +1,13 @@ -function toggleSection(chevron, section) { - section.toggle(); - chevron.toggleClass('fa-chevron-up').toggleClass('fa-chevron-down'); -} - -function hideSection(chevron, section) { - section.hide(); - chevron.removeClass('fa-chevron-up'); - chevron.addClass('fa-chevron-down'); +function hideSection(section) { + var collapsible = document.getElementById(section); + // Try to get the bootstrap collapse instance + var bsCollapse = bootstrap.Collapse.getInstance(collapsible); + // If there is no previous instance, create a new one + if (!bsCollapse) { + bsCollapse = new bootstrap.Collapse(collapsible); + } + bsCollapse.hide(); } /** @@ -264,24 +264,10 @@ LS.Statistics2 = function () { $('#statisticsoutput .row').first().find('.chartjs-container').loadGraph(); } - $('#generalfilters-chevron').click(function () { - toggleSection($('#generalfilters-chevron'), $('#statisticsgeneralfilters')); - }); - - $('#responsefilters-chevron').click(function () { - toggleSection($('#responsefilters-chevron'), $('#filterchoices')); - }); - - $('#statistics-render-chevron').click(function () { - toggleSection($('#statistics-render-chevron'), $('#statisticsoutput')); - }); - $('#generate-statistics').submit(function () { - hideSection($('#generalfilters-chevron'), $('#statisticsgeneralfilters')); - hideSection($('#responsefilters-chevron'), $('#filterchoices')) + hideSection('general-filters-item-body'); + hideSection('response-filters-item-body'); $('#statisticsoutput').show(); - $('#statistics-render-chevron').removeClass('fa-chevron-up'); - $('#statistics-render-chevron').addClass('fa-chevron-down'); $('#view-stats-alert-info').hide(); $('#statsContainerLoading').show(); if ($('input[name=outputtype]:checked').val() != 'html') { @@ -293,13 +279,6 @@ LS.Statistics2 = function () { //alert('ok'); }); - $('.group-question-chevron').click(function () { - //alert('ok'); - $group_to_hide = $('#' + $(this).data('grouptohide')); - toggleSection($(this), $group_to_hide) - //$('#'+group_to_hide).hide(); - }); - // If the graph are displayed if ($('.chartjs-container').length > 0) { diff --git a/docs/release_notes.txt b/docs/release_notes.txt index e61a126e596..328df9b98ee 100644 --- a/docs/release_notes.txt +++ b/docs/release_notes.txt @@ -34,6 +34,26 @@ Thank you to everyone who helped with this new release! CHANGE LOG ------------------------------------------------------ +Changes from 6.3.8 (build 231204) to 6.3.9 (build 231211) December 11, 2023 +-Fixed issue: Unable to update from pre 495 version (#3607) (Denis Chenu) +-Fixed issue #CT-531: not able to download quickCSVReport (Patrick Teichmann) +-Fixed issue #CT-531: Timing statistics button is missing from the responses view (Patrick Teichmann) +-Fixed issue #CT-531: Popover error on empty string in responsesListTable (twilligls) +-Fixed issue #19262: Invalid fruity_twentythree template directory on PostgreSQL (#3642) (Olle Härstedt) +-Fixed issue #18961: {SURVEYURL} didn't work with plugin using cli event (Gabriel Jenik) +#Updated translation: Slovak by jelen1 +#Updated translation: Polish by elissa +#Updated translation: Polish (Informal) by elissa +#Updated translation: Korean by modernity4r +#Updated translation: Japanese by d_inoue, nomoto +#Updated translation: Hungarian by kkd, tkazinczy +#Updated translation: Hebrew by neaman +#Updated translation: German by c_schmitz +#Updated translation: Finnish by Jmantysalo +#Updated translation: Czech by jelen1 +#Updated translation: Czech (Informal) by jelen1 + + Changes from 6.3.7 (build 231127) to 6.3.8 (build 231204) December 4, 2023 +New feature #18880: New imagefile option type for theme options (#3621) (Gabriel Jenik) -Fixed issue 19255: PHP8.1 + debug : survey with only start date broke survey listing (#3629) (Denis Chenu) diff --git a/locale/_template/limesurvey.pot b/locale/_template/limesurvey.pot index 293980be807..4bc85696773 100644 --- a/locale/_template/limesurvey.pot +++ b/locale/_template/limesurvey.pot @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: LimeSurvey language file\n" "Report-Msgid-Bugs-To: http://translate.limesurvey.org/\n" -"POT-Creation-Date: 2023-12-04 11:49:57+00:00\n" +"POT-Creation-Date: 2023-12-11 11:48:10+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -1450,7 +1450,7 @@ msgstr "" #: application/controllers/QuotasController.php:39 #: application/controllers/QuotasController.php:108 #: application/controllers/QuotasController.php:136 -msgid "You do not have permission on this survey." +msgid "You do not have permission for this survey." msgstr "" #: application/controllers/QuotasController.php:89 @@ -1535,7 +1535,7 @@ msgid "Quota not found." msgstr "" #: application/controllers/QuotasController.php:438 -msgid "You do not have permission on this quota." +msgid "You do not have permission for this quota." msgstr "" #: application/controllers/RegisterController.php:166 @@ -1660,8 +1660,8 @@ msgstr "" #: application/controllers/ResponsesController.php:158 #: application/core/plugins/TwoFactorAdminLogin/models/TFAUser.php:118 #: application/core/plugins/TwoFactorAdminLogin/models/TFAUserKey.php:115 -#: application/models/User.php:152 application/models/User.php:719 -#: application/models/User.php:809 +#: application/models/User.php:158 application/models/User.php:725 +#: application/models/User.php:815 #: application/views/admin/token/massive_actions/_selector.php:78 #: application/views/admin/user/modifyuser.php:37 #: application/views/responses/partial/responseListTable.php:183 @@ -1839,8 +1839,8 @@ msgstr "" #: application/models/SurveymenuEntries.php:194 #: application/models/SurveymenuEntries.php:207 #: application/models/SurveysGroups.php:181 -#: application/models/TokenDynamic.php:763 application/models/User.php:775 -#: application/models/User.php:797 +#: application/models/TokenDynamic.php:763 application/models/User.php:781 +#: application/models/User.php:803 #: application/views/SurveysGroupsPermission/subviews/currentUsersList.php:7 #: application/views/admin/emailtemplates/email_language_template_tab.php:102 #: application/views/admin/labels/_labelviewtabcontent_view.php:21 @@ -1851,7 +1851,7 @@ msgstr "" #: application/views/questionAdministration/partial/groupView.php:143 #: application/views/questionGroupsAdministration/listquestiongroups.php:115 #: application/views/quotas/index.php:96 -#: application/views/responses/partial/responseListTable.php:249 +#: application/views/responses/partial/responseListTable.php:250 #: application/views/surveyPermissions/_overview_table.php:12 #: application/views/surveyPermissions/index.php:111 msgid "Action" @@ -2244,7 +2244,7 @@ msgstr "" #: application/views/questionAdministration/partial/topbarBtns/questionToolsDropdownItems.php:26 #: application/views/questionGroupsAdministration/partial/topbarBtns/groupToolsDropdownItems.php:16 #: application/views/responses/massive_actions/_selector.php:79 -#: application/views/responses/partial/topbarBtns/leftSideButtons.php:29 +#: application/views/responses/partial/topbarBtns/leftSideButtons.php:36 #: application/views/surveyAdministration/partial/topbar/surveyTopbarRight_view.php:116 #: application/views/surveyAdministration/partial/topbar_tokens/leftSideButtons.php:49 #: application/views/surveyPermissions/partial/editpermission.php:21 @@ -2294,8 +2294,8 @@ msgstr "" #: application/models/TemplateManifest.php:687 #: application/models/TemplateManifest.php:689 #: application/models/TemplateManifest.php:692 -#: application/models/TokenDynamic.php:876 application/models/User.php:983 -#: application/models/User.php:989 application/models/UserGroup.php:374 +#: application/models/TokenDynamic.php:876 application/models/User.php:989 +#: application/models/User.php:995 application/models/UserGroup.php:374 #: application/views/SurveysGroupsPermission/subviews/currentUsersList.php:39 #: application/views/SurveysGroupsPermission/subviews/currentUsersList.php:40 #: application/views/admin/conditions/includes/conditions_edit.php:8 @@ -2937,7 +2937,7 @@ msgid "Inherit" msgstr "" #: application/controllers/SurveyAdministrationController.php:3164 -#: application/models/User.php:157 +#: application/models/User.php:163 msgid "Date format" msgstr "" @@ -3084,7 +3084,7 @@ msgstr "" #: application/views/questionGroupsAdministration/partial/topbarBtns/addGroupTopbarRight_view.php:11 #: application/views/questionGroupsAdministration/partial/topbarBtns/editGroupTopbarRight_view.php:62 #: application/views/quickTranslation/translateformheader_view.php:56 -#: application/views/responses/partial/responseListTable.php:330 +#: application/views/responses/partial/responseListTable.php:331 #: application/views/surveyAdministration/addPanelIntegrationParameter_view.php:65 #: application/views/surveyAdministration/partial/topbar/surveyTopbarRight_view.php:78 #: application/views/surveyAdministration/partial/topbarBtns_create_survey/rightSideButtons.php:24 @@ -3603,7 +3603,7 @@ msgid "User group not found." msgstr "" #: application/controllers/UserGroupController.php:121 -msgid "No access : you do not have permission to this users group." +msgid "No access: You do not have permission to this user group." msgstr "" #: application/controllers/UserGroupController.php:156 @@ -3698,7 +3698,7 @@ msgid "Failed to remove user." msgstr "" #: application/controllers/UserGroupController.php:474 -msgid "No access : you do not have permission to send emails to all users." +msgid "No access: You do not have permission to send emails to all users." msgstr "" #: application/controllers/UserGroupController.php:491 @@ -3789,8 +3789,8 @@ msgstr "" #: application/controllers/UserManagementController.php:1197 #: application/core/plugins/TwoFactorAdminLogin/models/TFAUser.php:17 #: application/core/plugins/TwoFactorAdminLogin/models/TFAUserKey.php:48 -#: application/models/User.php:146 application/models/User.php:711 -#: application/models/User.php:801 +#: application/models/User.php:152 application/models/User.php:717 +#: application/models/User.php:807 msgid "User ID" msgstr "" @@ -3805,8 +3805,8 @@ msgstr "" #: application/core/plugins/Authdb/Authdb.php:135 #: application/core/plugins/TwoFactorAdminLogin/models/TFAUser.php:110 #: application/core/plugins/TwoFactorAdminLogin/models/TFAUserKey.php:105 -#: application/models/User.php:147 application/models/User.php:715 -#: application/models/User.php:805 +#: application/models/User.php:153 application/models/User.php:721 +#: application/models/User.php:811 #: application/views/SurveysGroupsPermission/subviews/currentUsersList.php:8 #: application/views/admin/authentication/forgotpassword.php:35 #: application/views/admin/user/modifyuser.php:26 @@ -3862,11 +3862,11 @@ msgid "Usergroup updated" msgstr "" #: application/controllers/UserManagementController.php:1183 -msgid "You can not update your own roles." +msgid "You are not allowed to update your own roles." msgstr "" #: application/controllers/UserManagementController.php:1189 -msgid "You can not set role to this user." +msgid "You are not allowed to assign a role to this user." msgstr "" #: application/controllers/UserManagementController.php:1203 @@ -4674,7 +4674,7 @@ msgstr "" #: application/controllers/admin/DataEntry.php:2483 #: application/views/admin/dataentry/caption_view.php:5 #: application/views/admin/dataentry/dataentry_header_view.php:3 -#: application/views/responses/partial/topbarBtns/leftSideButtons.php:8 +#: application/views/responses/partial/topbarBtns/leftSideButtons.php:16 msgid "Data entry" msgstr "" @@ -5683,7 +5683,7 @@ msgstr "" #: application/views/questionGroupsAdministration/partial/topbarBtns/editGroupTopbarRight_view.php:28 #: application/views/quotas/index.php:130 #: application/views/quotas/index.php:131 -#: application/views/responses/partial/responseListTable.php:328 +#: application/views/responses/partial/responseListTable.php:329 #: application/views/responses/partial/topbarBtns/responseViewTopbarRight_view.php:118 #: application/views/surveyAdministration/afterDeactivateSurvey_view.php:35 #: application/views/surveyAdministration/partial/_modalActivateSuccess.php:40 @@ -8701,7 +8701,7 @@ msgstr "" #: application/core/plugins/AuthLDAP/AuthLDAP.php:379 #: application/core/plugins/Authdb/Authdb.php:136 -#: application/libraries/Save.php:217 application/models/User.php:148 +#: application/libraries/Save.php:217 application/models/User.php:154 #: application/views/admin/authentication/newPassword.php:35 #: application/views/admin/user/modifyuser.php:55 #: application/views/userManagement/partial/createdrandoms.php:30 @@ -8782,7 +8782,7 @@ msgid "The server key is not currently set. If you set this plugin as default yo msgstr "" #: application/core/plugins/AzureOAuthSMTP/AzureOAuthSMTP.php:69 -msgid "This plugin requires PHP 7.3 or above." +msgid "This plugin requires PHP version 7.3 or higher." msgstr "" #: application/core/plugins/AzureOAuthSMTP/AzureOAuthSMTP.php:81 @@ -8827,14 +8827,10 @@ msgid "Instructions:" msgstr "" #: application/core/plugins/AzureOAuthSMTP/AzureOAuthSMTP.php:206 -#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:182 +#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:181 msgid "The %s plugin is not configured correctly. Please check the plugin settings." msgstr "" -#: application/core/plugins/AzureOAuthSMTP/AzureOAuthSMTP.php:268 -msgid "Azure" -msgstr "" - #: application/core/plugins/AzureOAuthSMTP/AzureOAuthSMTP.php:293 msgid "Azure doesn't accept redirect URIs with query parameters when using personal accounts. This plugin will not work properly with the current URL manager configuration." msgstr "" @@ -8926,37 +8922,29 @@ msgid "Redirect URI:" msgstr "" #: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:79 -msgid "You can find more details %s." +msgid "You can find more details %shere%s." msgstr "" #: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:80 -msgid "here" -msgstr "" - -#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:81 msgid "Activate the plugin." msgstr "" -#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:82 +#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:81 msgid "Set the 'Client ID' and 'Client Secret' below and save the settings." msgstr "" -#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:83 +#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:82 msgid "Click the 'Get Token' button to open Google's consent screen in a new window." msgstr "" -#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:84 +#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:83 msgid "Follow the steps in the consent screen and check the requested permissions." msgstr "" -#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:85 +#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:84 msgid "Switch the 'Enabled' setting to 'On' and save." msgstr "" -#: application/core/plugins/GoogleOAuthSMTP/GoogleOAuthSMTP.php:223 -msgid "Google" -msgstr "" - #: application/core/plugins/PasswordRequirement/PasswordRequirement.php:157 msgid "The password does require at least one digit" msgstr "" @@ -9081,8 +9069,8 @@ msgstr "" #: application/core/plugins/TwoFactorAdminLogin/models/TFAUser.php:114 #: application/core/plugins/TwoFactorAdminLogin/models/TFAUserKey.php:110 -#: application/models/User.php:149 application/models/User.php:723 -#: application/models/User.php:813 +#: application/models/User.php:155 application/models/User.php:729 +#: application/models/User.php:819 #: application/views/SurveysGroupsPermission/subviews/currentUsersList.php:9 #: application/views/admin/user/modifyuser.php:45 #: application/views/surveyPermissions/_overview_table.php:15 @@ -9141,7 +9129,7 @@ msgstr "" #: application/views/quotas/index.php:44 #: application/views/responses/browsetimerow_view.php:25 #: application/views/responses/partial/notSubmittedResponseListTable.php:14 -#: application/views/responses/partial/responseListTable.php:272 +#: application/views/responses/partial/responseListTable.php:273 #: application/views/surveyAdministration/listSurveys_view.php:39 #: application/views/themeOptions/installedthemelist.php:27 #: application/views/themeOptions/surveythemelist.php:27 @@ -9179,7 +9167,7 @@ msgstr "" #: application/views/quotas/index.php:45 #: application/views/responses/browsetimerow_view.php:26 #: application/views/responses/partial/notSubmittedResponseListTable.php:15 -#: application/views/responses/partial/responseListTable.php:273 +#: application/views/responses/partial/responseListTable.php:274 #: application/views/surveyAdministration/listSurveys_view.php:41 #: application/views/themeOptions/installedthemelist.php:28 #: application/views/themeOptions/surveythemelist.php:27 @@ -9613,7 +9601,7 @@ msgstr "" #: application/views/admin/user/setuserpermissions.php:30 #: application/views/questionAdministration/partial/topbarBtns/importQuestionTopbarRight_view.php:8 #: application/views/questionGroupsAdministration/partial/topbarBtns/importGroupTopbarRight_view.php:8 -#: application/views/responses/partial/topbarBtns/leftSideButtons.php:50 +#: application/views/responses/partial/topbarBtns/leftSideButtons.php:55 #: application/views/surveyAdministration/partial/topbar/surveyTopbarRight_view.php:136 #: application/views/surveyAdministration/tab_survey_view.php:32 #: application/views/surveyAdministration/tab_survey_view.php:66 @@ -9713,7 +9701,7 @@ msgid "This will update the survey group for all selected surveys." msgstr "" #: application/extensions/admin/survey/ListSurveysWidget/views/massive_actions/_expiry_dialog.php:15 -#: application/models/User.php:161 +#: application/models/User.php:167 #: application/views/admin/survey/subview/accordion/_publication_panel.php:49 msgid "Expiry date/time:" msgstr "" @@ -14322,11 +14310,11 @@ msgid "Get new token" msgstr "" #: application/libraries/PluginManager/SmtpOAuthPluginBase.php:344 -msgid "Saved Token Owner" +msgid "Token owner email address" msgstr "" #: application/libraries/PluginManager/SmtpOAuthPluginBase.php:345 -msgid "This is the email address used to create the current authentication token. Please note all emails will be sent from this address." +msgid "This is the email address used to create the current authentication token. Please note that all emails will be sent from this address." msgstr "" #: application/libraries/Save.php:142 @@ -14387,7 +14375,7 @@ msgstr "" #: application/models/Participant.php:198 #: application/models/QuestionGroupL10n.php:81 #: application/models/SurveymenuEntries.php:197 -#: application/models/TokenDynamic.php:673 application/models/User.php:151 +#: application/models/TokenDynamic.php:673 application/models/User.php:157 #: application/views/admin/authentication/ajaxLogin.php:80 #: application/views/admin/authentication/login.php:95 #: application/views/admin/globalsettings/globalSettings_view.php:21 @@ -14681,8 +14669,8 @@ msgstr "" #: application/models/Participant.php:202 application/models/Surveymenu.php:350 #: application/models/SurveymenuEntries.php:205 -#: application/models/SurveysGroups.php:104 application/models/User.php:727 -#: application/models/User.php:830 +#: application/models/SurveysGroups.php:104 application/models/User.php:733 +#: application/models/User.php:836 msgid "Created on" msgstr "" @@ -14789,7 +14777,7 @@ msgstr "" msgid "Use internal database authentication" msgstr "" -#: application/models/Permission.php:660 application/models/User.php:544 +#: application/models/Permission.php:660 application/models/User.php:550 #: application/views/SurveysGroupsPermission/subviews/currentUsersList.php:22 #: application/views/SurveysGroupsPermission/subviews/currentUsersList.php:23 #: application/views/surveyPermissions/_overview_table.php:37 @@ -15422,7 +15410,7 @@ msgid "Permission to view statistics" msgstr "" #: application/models/Survey.php:2195 -msgid "Permission on survey (delete). Read permission is used to give access to this group." +msgid "Permission for survey access. Read permission is a requirement to give any further permission to a survey." msgstr "" #: application/models/Survey.php:2204 @@ -15616,8 +15604,8 @@ msgstr "" #: application/models/Surveymenu.php:351 #: application/models/SurveymenuEntries.php:206 -#: application/models/SurveysGroups.php:106 application/models/User.php:732 -#: application/models/User.php:825 +#: application/models/SurveysGroups.php:106 application/models/User.php:738 +#: application/models/User.php:831 msgid "Created by" msgstr "" @@ -16165,162 +16153,162 @@ msgstr "" msgid "Settings" msgstr "" -#: application/models/User.php:150 +#: application/models/User.php:156 msgid "Parent user" msgstr "" -#: application/models/User.php:153 +#: application/models/User.php:159 msgid "Editor mode" msgstr "" -#: application/models/User.php:154 +#: application/models/User.php:160 msgid "Template editor mode" msgstr "" -#: application/models/User.php:155 +#: application/models/User.php:161 msgid "Question selector mode" msgstr "" -#: application/models/User.php:156 +#: application/models/User.php:162 msgid "One-time password" msgstr "" -#: application/models/User.php:158 +#: application/models/User.php:164 msgid "Created at" msgstr "" -#: application/models/User.php:159 +#: application/models/User.php:165 msgid "Modified at" msgstr "" -#: application/models/User.php:160 +#: application/models/User.php:166 msgid "Last recorded login" msgstr "" -#: application/models/User.php:334 +#: application/models/User.php:340 msgid "Password must be at least %d character long|Password must be at least %d characters long" msgstr "" -#: application/models/User.php:339 +#: application/models/User.php:345 msgid "Password must be at most %d character long|Password must be at most %d characters long" msgstr "" -#: application/models/User.php:344 +#: application/models/User.php:350 msgid "Password must include at least %d lowercase letter|Password must include at least %d lowercase letters" msgstr "" -#: application/models/User.php:349 +#: application/models/User.php:355 msgid "Password must include at least %d uppercase letter|Password must include at least %d uppercase letters" msgstr "" -#: application/models/User.php:354 +#: application/models/User.php:360 msgid "Password must include at least %d number|Password must include at least %d numbers" msgstr "" -#: application/models/User.php:359 +#: application/models/User.php:365 msgid "Password must include at least %d special character|Password must include at least %d special characters" msgstr "" -#: application/models/User.php:390 +#: application/models/User.php:396 msgid "Your new password was not saved because the old password was wrong." msgstr "" -#: application/models/User.php:393 +#: application/models/User.php:399 msgid "Your new password was not saved because it matches the old password." msgstr "" -#: application/models/User.php:396 +#: application/models/User.php:402 msgid "Your new password was not saved because the passwords did not match." msgstr "" -#: application/models/User.php:399 +#: application/models/User.php:405 msgid "The new password can not be empty." msgstr "" -#: application/models/User.php:412 +#: application/models/User.php:418 msgid "A password must meet the following requirements: " msgstr "" -#: application/models/User.php:414 +#: application/models/User.php:420 msgid "At least %d character long.|At least %d characters long." msgstr "" -#: application/models/User.php:417 +#: application/models/User.php:423 msgid "At most %d character long.|At most %d characters long." msgstr "" -#: application/models/User.php:421 +#: application/models/User.php:427 msgid "Exactly %d character long.|Exactly %d characters long." msgstr "" -#: application/models/User.php:423 +#: application/models/User.php:429 msgid "Between %d and %d characters long." msgstr "" -#: application/models/User.php:427 +#: application/models/User.php:433 msgid "At least %d lower case letter.|At least %d lower case letters." msgstr "" -#: application/models/User.php:430 +#: application/models/User.php:436 msgid "At least %d upper case letter.|At least %d upper case letters." msgstr "" -#: application/models/User.php:433 +#: application/models/User.php:439 msgid "At least %d number.|At least %d numbers." msgstr "" -#: application/models/User.php:436 +#: application/models/User.php:442 msgid "At least %d special character.|At least %d special characters." msgstr "" -#: application/models/User.php:522 +#: application/models/User.php:528 #: application/views/userManagement/partial/showuser.php:4 msgid "User details" msgstr "" -#: application/models/User.php:568 +#: application/models/User.php:574 msgid "User role" msgstr "" -#: application/models/User.php:577 +#: application/models/User.php:583 #: application/views/userManagement/partial/addedituser.php:4 msgid "Edit user" msgstr "" -#: application/models/User.php:587 +#: application/models/User.php:593 msgid "Template permissions" msgstr "" -#: application/models/User.php:601 +#: application/models/User.php:607 msgid "Take ownership" msgstr "" -#: application/models/User.php:612 +#: application/models/User.php:618 msgid "Do you want to take ownership of this user?" msgstr "" -#: application/models/User.php:628 application/views/admin/user/deluser.php:30 +#: application/models/User.php:634 application/views/admin/user/deluser.php:30 #: application/views/userManagement/partial/transfersurveys.php:36 msgid "Delete User" msgstr "" -#: application/models/User.php:746 application/models/User.php:819 +#: application/models/User.php:752 application/models/User.php:825 msgid "No of surveys" msgstr "" -#: application/models/User.php:759 +#: application/models/User.php:765 msgid "Usergroups" msgstr "" -#: application/models/User.php:769 +#: application/models/User.php:775 msgid "Applied role" msgstr "" -#: application/models/User.php:940 +#: application/models/User.php:946 msgid "%s (%s)" msgstr "" -#: application/models/User.php:993 +#: application/models/User.php:999 msgid "Are you sure you want to delete user '%s' from user group '%s'?" msgstr "" @@ -16538,7 +16526,7 @@ msgid "Sorry your responses have exceeded a quota on this survey." msgstr "" #: application/models/services/Quotas.php:324 -msgid "Invalid quota id" +msgid "Invalid quota ID" msgstr "" #: application/models/services/Quotas.php:354 @@ -16627,7 +16615,7 @@ msgid "Users listed here can see groups in lists, and view group descriptions & msgstr "" #: application/views/SurveysGroupsPermission/subviews/viewCurrents.php:3 -msgid "This survey group is shown for users with any permission on the survey group, user with any permission on one survey inside this group, or if this group was configured to be available." +msgid "This survey group is shown for users with any permission to the survey group, user with any permission to one survey inside this group, or if this group was configured to be available." msgstr "" #: application/views/SurveysGroupsPermission/subviews/viewCurrents.php:17 @@ -17344,8 +17332,8 @@ msgid "View this record" msgstr "" #: application/views/admin/dataentry/iteratesurvey.php:2 -#: application/views/responses/partial/topbarBtns/leftSideButtons.php:68 -#: application/views/responses/partial/topbarBtns/leftSideButtons.php:87 +#: application/views/responses/partial/topbarBtns/leftSideButtons.php:113 +#: application/views/responses/partial/topbarBtns/leftSideButtons.php:132 msgid "Iterate survey" msgstr "" @@ -17975,7 +17963,7 @@ msgstr "" #: application/views/admin/token/browse.php:93 #: application/views/admin/token/surveyParticipantView.php:169 #: application/views/admin/update/updater/_right_container.php:10 -#: application/views/responses/partial/responseListTable.php:314 +#: application/views/responses/partial/responseListTable.php:315 msgid "Please wait, loading data..." msgstr "" @@ -21624,7 +21612,7 @@ msgstr "" #: application/views/admin/token/browse.php:87 #: application/views/admin/token/surveyParticipantView.php:163 #: application/views/admin/token/tokenform.php:14 -#: application/views/responses/partial/responseListTable.php:308 +#: application/views/responses/partial/responseListTable.php:309 msgid "Edit survey participant" msgstr "" @@ -23337,7 +23325,7 @@ msgid "The GD extension found doesn't support JPEG" msgstr "" #: application/views/installer/precheck_view.php:129 -msgid "PHP Collate library (language sort order)" +msgid "PHP Intl library" msgstr "" #: application/views/installer/precheck_view.php:134 @@ -24047,7 +24035,16 @@ msgstr "" msgid "Total responses" msgstr "" -#: application/views/responses/partial/topbarBtns/leftSideButtons.php:80 +#: application/views/responses/partial/topbarBtns/leftSideButtons.php:72 +#: application/views/responses/partial/topbarBtns/leftSideButtons.php:91 +msgid "Timing statistics" +msgstr "" + +#: application/views/responses/partial/topbarBtns/leftSideButtons.php:83 +msgid "Timing statistics are disabled for this survey." +msgstr "" + +#: application/views/responses/partial/topbarBtns/leftSideButtons.php:125 msgid "This survey is anonymized and/or token persistence is disabled." msgstr "" diff --git a/locale/cs-informal/cs-informal.mo b/locale/cs-informal/cs-informal.mo index 3372cbd0dce..311f7027971 100644 Binary files a/locale/cs-informal/cs-informal.mo and b/locale/cs-informal/cs-informal.mo differ diff --git a/locale/cs/cs.mo b/locale/cs/cs.mo index 18a017a22bd..69f457e98aa 100644 Binary files a/locale/cs/cs.mo and b/locale/cs/cs.mo differ diff --git a/locale/de/de.mo b/locale/de/de.mo index 1f73267ad43..6688cbf2a9f 100644 Binary files a/locale/de/de.mo and b/locale/de/de.mo differ diff --git a/locale/fi/fi.mo b/locale/fi/fi.mo index 14ea9f3f808..afd33cfe9a2 100644 Binary files a/locale/fi/fi.mo and b/locale/fi/fi.mo differ diff --git a/locale/he/he.mo b/locale/he/he.mo index 4a6a055c801..accb9528ed7 100644 Binary files a/locale/he/he.mo and b/locale/he/he.mo differ diff --git a/locale/hu/hu.mo b/locale/hu/hu.mo index 5e5fc1b8baa..99ff551d760 100644 Binary files a/locale/hu/hu.mo and b/locale/hu/hu.mo differ diff --git a/locale/ja/ja.mo b/locale/ja/ja.mo index e8fbbe6fdc2..63dfecc88d1 100644 Binary files a/locale/ja/ja.mo and b/locale/ja/ja.mo differ diff --git a/locale/ko/ko.mo b/locale/ko/ko.mo index 2e0d07d35cc..0734f36a0c4 100644 Binary files a/locale/ko/ko.mo and b/locale/ko/ko.mo differ diff --git a/locale/pl-informal/pl-informal.mo b/locale/pl-informal/pl-informal.mo index 1555b05c205..961065a235d 100644 Binary files a/locale/pl-informal/pl-informal.mo and b/locale/pl-informal/pl-informal.mo differ diff --git a/locale/pl/pl.mo b/locale/pl/pl.mo index 0e6828a0d00..c2b9736d46b 100644 Binary files a/locale/pl/pl.mo and b/locale/pl/pl.mo differ diff --git a/locale/sk/sk.mo b/locale/sk/sk.mo index 8ecc686dffa..4569cb72bc5 100644 Binary files a/locale/sk/sk.mo and b/locale/sk/sk.mo differ