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 @@
{{ gT("Redirect URI:") }} {{ redirectUri }}
-
+ {{ 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 @@
= gT("Users listed here can see groups in lists, and view group descriptions & settings. This is the minimal permission - you have to use the delete action to remove this permission.") ?>
-
= gT("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."
+
= gT("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."
) ?>
>
+
$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 @@
- |
+ |
|
= $model->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