diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index be508cdd7f2..85d9ab6857a 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -1,54 +1,20 @@
-on: [push,pull_request]
-name: ops
+on: [push, pull_request]
+name: upgrade
 jobs:
-  validate:
-    name: validate
-    runs-on: ubuntu-latest
-    strategy:
-      fail-fast: false
-      matrix:
-        application: ['ojs','omp','ops']
-        php-version: [ '8.1','8.2' ]
-    steps:
-      - uses: withanage/validate-action@v1
-        with:
-          application: '${{matrix.application}}'
-          repository: '${{github.repository_owner}}'
-          branch: '${{ github.head_ref || github.ref_name }}'
-  test:
-    name: test
-    runs-on: ubuntu-latest
-    # needs: validate
-    strategy:
-      fail-fast: false
-      matrix:
-        application: ['ojs','omp','ops']
-        php-version: [ '8.1','8.2' ]
-        database: [ 'pgsql', 'mysql','mariadb']
-    steps:
-      - uses: actions/checkout@v4
-
-      - uses: withanage/test-action@v1
-        with:
-          application: '${{matrix.application}}'
-          repository: '${{github.repository_owner}}'
-          branch: '${{ github.head_ref || github.ref_name }}'
   upgrade:
-    name: upgrade
     runs-on: ubuntu-latest
-    # needs: test
     strategy:
       fail-fast: false
       matrix:
-        application: ['ojs','omp','ops']
-        dataset-branch: [ 'stable-3_4_0','stable-3_3_0','stable-3_2_1','stable-3_2_0' ]
-        database: [ 'pgsql','mysql']
-        php-version: [ '8.1' ]
+        application: ['omp','ojs','ops']
+        database: ['pgsql','mysql']
+        php-version: [ '8.1' ,'8.2']
 
+    name: upgrade
     steps:
-      - uses: withanage/upgrade-action@v1
+      - uses: xmlFlow/upgrade-action@v1
         with:
-          application: '${{matrix.application}}'
-          repository: '${{github.repository_owner}}'
-          branch: '${{ github.head_ref || github.ref_name }}'
-
+          application:  ${{matrix.application}}
+          repository: 'pkp'
+          branch: 'main'
+          upgrade: true
diff --git a/api/v1/jats/PKPJatsController.php b/api/v1/jats/PKPJatsController.php
new file mode 100644
index 00000000000..6f99918b925
--- /dev/null
+++ b/api/v1/jats/PKPJatsController.php
@@ -0,0 +1,218 @@
+<?php
+
+/**
+ * @file api/v1/jats/PKPJatsController.php
+ *
+ * Copyright (c) 2023 Simon Fraser University
+ * Copyright (c) 2023 John Willinsky
+ * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
+ *
+ * @class PKPJatsController
+ *
+ * @ingroup api_v1_jats
+ *
+ * @brief Handle API requests for JATS File operations.
+ *
+ */
+
+namespace PKP\API\v1\jats;
+
+use APP\core\Application;
+use APP\facades\Repo;
+use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Request;
+use Illuminate\Http\Response;
+use Illuminate\Support\Facades\Route;
+use PKP\core\PKPBaseController;
+use PKP\core\PKPRequest;
+use PKP\db\DAORegistry;
+use PKP\security\authorization\ContextAccessPolicy;
+use PKP\security\authorization\internal\SubmissionFileStageAccessPolicy;
+use PKP\security\authorization\PublicationAccessPolicy;
+use PKP\security\authorization\PublicationWritePolicy;
+use PKP\security\authorization\SubmissionFileAccessPolicy;
+use PKP\security\authorization\UserRolesRequiredPolicy;
+use PKP\security\Role;
+use PKP\services\PKPSchemaService;
+use PKP\submissionFile\SubmissionFile;
+
+class PKPJatsController extends PKPBaseController
+{
+    /**
+     * @copydoc \PKP\core\PKPBaseController::getHandlerPath()
+     */
+    public function getHandlerPath(): string
+    {
+        return 'submissions/{submissionId}/publications/{publicationId}/jats';
+    }
+
+    /**
+     * @copydoc \PKP\core\PKPBaseController::getRouteGroupMiddleware()
+     */
+    public function getRouteGroupMiddleware(): array
+    {
+        return [
+            'has.user',
+            'has.context',
+        ];
+    }
+
+    public function getGroupRoutes(): void
+    {
+        Route::middleware([
+            self::roleAuthorizer([
+                Role::ROLE_ID_MANAGER,
+                Role::ROLE_ID_SITE_ADMIN,
+                Role::ROLE_ID_SUB_EDITOR,
+                Role::ROLE_ID_ASSISTANT,
+                Role::ROLE_ID_AUTHOR,
+            ]),
+        ])->group(function () {
+
+            Route::get('', $this->get(...))
+                ->name('publication.jats.get');
+
+            Route::post('', $this->add(...))
+                ->name('publication.jats.add');
+
+            Route::delete('', $this->delete(...))
+                ->name('publication.jats.delete');
+
+        })->whereNumber(['submissionId', 'publicationId']);
+    }
+
+    /**
+     * @copydoc \PKP\core\PKPBaseController::authorize()
+     */
+    public function authorize(PKPRequest $request, array &$args, array $roleAssignments): bool
+    {
+        $illuminateRequest = $args[0]; /** @var \Illuminate\Http\Request $illuminateRequest */
+        $actionName = static::getRouteActionName($illuminateRequest);
+
+        $this->addPolicy(new UserRolesRequiredPolicy($request), true);
+
+        $this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
+
+        if ($actionName === 'get') {
+            $this->addPolicy(new PublicationAccessPolicy($request, $args, $roleAssignments));
+        } else {
+            $this->addPolicy(new PublicationWritePolicy($request, $args, $roleAssignments));
+        }
+
+        if ($actionName === 'add') {
+            $params = $illuminateRequest->input();
+            $fileStage = isset($params['fileStage']) ? (int) $params['fileStage'] : SubmissionFile::SUBMISSION_FILE_JATS;
+            $this->addPolicy(
+                new SubmissionFileStageAccessPolicy(
+                    $fileStage,
+                    SubmissionFileAccessPolicy::SUBMISSION_FILE_ACCESS_MODIFY,
+                    'api.submissionFiles.403.unauthorizedFileStageIdWrite'
+                )
+            );
+        }
+
+        return parent::authorize($request, $args, $roleAssignments);
+    }
+
+    /**
+     * Get JATS XML Files
+     */
+    public function get(Request $illuminateRequest): JsonResponse
+    {
+        $submission = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_SUBMISSION);
+        $publication = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_PUBLICATION);
+
+        if (!$publication) {
+            return response()->json([
+                'error' => __('api.404.resourceNotFound'),
+            ], Response::HTTP_NOT_FOUND);
+        }
+
+        $context = Application::get()->getRequest()->getContext();
+        $genreDao = DAORegistry::getDAO('GenreDAO');
+        $genres = $genreDao->getEnabledByContextId($context->getId());
+
+        $jatsFile = Repo::jats()
+            ->getJatsFile($publication->getId(), $submission->getId(), $genres->toArray());
+
+        $jatsFilesProp = Repo::jats()
+            ->summarize($jatsFile);
+
+        return response()->json($jatsFilesProp, Response::HTTP_OK);
+    }
+
+    /**
+     * Add a JATS XML Submission File to a publication
+     */
+    public function add(Request $illuminateRequest): JsonResponse
+    {
+        $submission = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_SUBMISSION);
+        $publication = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_PUBLICATION);
+
+        if (empty($_FILES)) {
+            return response()->json([
+                'error' => __('api.files.400.noUpload'),
+            ], Response::HTTP_BAD_REQUEST);
+        }
+
+        if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) {
+            return $this->getUploadErrorResponse($_FILES['file']['error']);
+        }
+
+        $params = $this->convertStringsToSchema(PKPSchemaService::SCHEMA_SUBMISSION_FILE, $illuminateRequest->input());
+
+        Repo::jats()
+            ->addJatsFile(
+                $_FILES['file']['tmp_name'],
+                $_FILES['file']['name'],
+                $publication->getId(),
+                $submission->getId(),
+                SubmissionFile::SUBMISSION_FILE_JATS,
+                $params);
+
+        $context = Application::get()->getRequest()->getContext();
+        $genreDao = DAORegistry::getDAO('GenreDAO');
+        $genres = $genreDao->getEnabledByContextId($context->getId());
+
+        $jatsFile = Repo::jats()
+            ->getJatsFile($publication->getId(), $submission->getId(), $genres->toArray());
+
+        $jatsFilesProp = Repo::jats()
+            ->summarize($jatsFile);
+        
+        return response()->json($jatsFilesProp, Response::HTTP_OK);
+    }
+
+    /**
+     * Delete the publication's JATS Submission file
+     */
+    public function delete(Request $illuminateRequest): JsonResponse
+    {
+        $submission = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_SUBMISSION);
+        $publication = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_PUBLICATION);
+
+        $context = Application::get()->getRequest()->getContext();
+        $genreDao = DAORegistry::getDAO('GenreDAO');
+        $genres = $genreDao->getEnabledByContextId($context->getId());
+
+        $jatsFile = Repo::jats()
+            ->getJatsFile($publication->getId(), $submission->getId(), $genres->toArray());
+        
+        if (!$jatsFile->submissionFile) {
+            return response()->json([
+                'error' => __('api.404.resourceNotFound'),
+            ], Response::HTTP_NOT_FOUND);
+        }
+
+        Repo::submissionFile()
+            ->delete($jatsFile->submissionFile);
+
+        $jatsFile = Repo::jats()
+            ->getJatsFile($publication->getId(), $submission->getId(), $genres->toArray());
+
+        $jatsFilesProp = Repo::jats()
+            ->summarize($jatsFile);
+        
+        return response()->json($jatsFilesProp, Response::HTTP_OK);
+    }
+}
diff --git a/api/v1/submissions/PKPSubmissionController.php b/api/v1/submissions/PKPSubmissionController.php
index 09ef8c0b9de..2ee104139e6 100644
--- a/api/v1/submissions/PKPSubmissionController.php
+++ b/api/v1/submissions/PKPSubmissionController.php
@@ -292,9 +292,6 @@ public function getGroupRoutes(): void
             ]);
     }
 
-
-
-
     /**
      * @copydoc \PKP\core\PKPBaseController::authorize()
      */
@@ -838,6 +835,7 @@ public function getParticipants(Request $illuminateRequest): JsonResponse
         $request = Application::get()->getRequest();
         $context = $request->getContext();
         $submission = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_SUBMISSION);
+        $args = $illuminateRequest->input();
         $stageId = $args['stageId'] ?? null;
 
         if (!$submission || $submission->getData('contextId') !== $context->getId()) {
@@ -1591,8 +1589,11 @@ public function saveContributorsOrder(Request $illuminateRequest): JsonResponse
             ->filterByPublicationIds([$publication->getId()])
             ->getMany();
 
+        $authorsArray = Repo::author()->getSchemaMap()->summarizeMany($authors)->toArray();
+        $indexedArray = array_values($authorsArray);
+
         return response()->json(
-            Repo::author()->getSchemaMap()->summarizeMany($authors),
+            $indexedArray,
             Response::HTTP_OK
         );
     }
diff --git a/classes/author/Author.php b/classes/author/Author.php
index d812ffe2254..2580825406b 100644
--- a/classes/author/Author.php
+++ b/classes/author/Author.php
@@ -228,4 +228,32 @@ public function getLocalizedUserGroupName()
         $userGroup = $this->getUserGroup();
         return $userGroup->getLocalizedName();
     }
+
+    /**
+     * Get competing interests.
+     *
+     * @return string|array|null
+     */
+    public function getCompetingInterests(?string $locale)
+    {
+        return $this->getData('competingInterests', $locale);
+    }
+
+    /**
+     * Set competing interests.
+     *
+     * @param $competingInterests string|array|null
+     */
+    public function setCompetingInterests($competingInterests, ?string $locale)
+    {
+        $this->setData('competingInterests', $competingInterests, $locale);
+    }
+
+    /**
+     * Get a localized version competing interest statement
+     */
+    public function getLocalizedCompetingInterests(): ?string
+    {
+        return $this->getLocalizedData('competingInterests');
+    }
 }
diff --git a/classes/cliTool/CommandLineTool.php b/classes/cliTool/CommandLineTool.php
index 689a2f748d9..3040257d402 100644
--- a/classes/cliTool/CommandLineTool.php
+++ b/classes/cliTool/CommandLineTool.php
@@ -30,7 +30,6 @@
 use PKP\config\Config;
 use PKP\core\Registry;
 use PKP\plugins\PluginRegistry;
-use PKP\security\Role;
 use PKP\session\SessionManager;
 use PKP\user\User;
 
@@ -109,7 +108,6 @@ private function checkArgsForUsername()
 
             unset($this->argv[$usernameKeyPos]);
         }
-
         if ($this->username) {
             $user = Repo::user()->getByUsername($this->username, true);
 
@@ -117,18 +115,11 @@ private function checkArgsForUsername()
         }
 
         if (!$this->user) {
-            $adminGroups = Repo::userGroup()->getArrayIdByRoleId(Role::ROLE_ID_SITE_ADMIN);
-
-            if (count($adminGroups)) {
-                $groupUsers = Repo::user()->getCollector()
-                    ->filterByUserGroupIds([$adminGroups[0]])
-                    ->getMany();
-
-                if ($groupUsers->isNotEmpty()) {
-                    $this->setUser($groupUsers->first());
-                } else {
-                    $this->exitWithUsageMessage();
-                }
+            $adminUsers = Repo::user()->getAdminUsers();
+            if ($adminUsers->isNotEmpty()) {
+                $this->setUser($adminUsers->first());
+            } else {
+                $this->exitWithUsageMessage();
             }
         }
     }
diff --git a/classes/components/PublicationSectionJats.php b/classes/components/PublicationSectionJats.php
new file mode 100644
index 00000000000..5384f68a236
--- /dev/null
+++ b/classes/components/PublicationSectionJats.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * @file classes/components/PublicationSectionJats.php
+ *
+ * Copyright (c) 2014-2021 Simon Fraser University
+ * Copyright (c) 2000-2021 John Willinsky
+ * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
+ *
+ * @class PublicationSectionJats
+ *
+ * @ingroup classes_components
+ *
+ * @brief A Panel component for viewing and managing publication's JATS Files
+ */
+
+namespace PKP\components;
+
+use APP\core\Application;
+use APP\facades\Repo;
+use APP\publication\Publication;
+use APP\submission\Submission;
+use PKP\context\Context;
+use PKP\submissionFile\SubmissionFile;
+
+class PublicationSectionJats
+{
+    public function __construct(
+        public string $id,
+        public string $title,
+        public Submission $submission,
+        public Context $context,
+        public bool $canEditPublication = false,
+        public Publication $publication
+    ) {
+    }
+
+    /**
+     * @copydoc ListPanel::getConfig()
+     */
+    public function getConfig()
+    {
+        $config = [];
+
+        $config = array_merge(
+            $config,
+            [
+                'title' => $this->title,
+                'id' => $this->id,
+                'canEditPublication' => $this->canEditPublication,
+                'publicationApiUrlFormat' => $this->getPublicationUrlFormat(),
+                'fileStage' => SubmissionFile::SUBMISSION_FILE_JATS,
+                'downloadDefaultJatsFileName' => Repo::jats()->getDefaultJatsFileName($this->publication->getId()),
+            ]
+        );
+
+        return $config;
+    }
+
+    /**
+     * Get an example of the url to a publication's API endpoint,
+     * with a placeholder instead of the publication id, eg:
+     *
+     * http://example.org/api/v1/submissions/1/publications/{$publicationId}
+     */
+    protected function getPublicationUrlFormat(): string
+    {
+        return Application::get()->getRequest()->getDispatcher()->url(
+            Application::get()->getRequest(),
+            Application::ROUTE_API,
+            $this->context->getPath(),
+            'submissions/' . $this->submission->getId() . '/publications/{$publicationId}/jats'
+        );
+    }
+}
diff --git a/classes/components/forms/context/PKPMetadataSettingsForm.php b/classes/components/forms/context/PKPMetadataSettingsForm.php
index 0914288b8ad..3bcd3281b74 100644
--- a/classes/components/forms/context/PKPMetadataSettingsForm.php
+++ b/classes/components/forms/context/PKPMetadataSettingsForm.php
@@ -147,6 +147,16 @@ public function __construct($action, $context)
                 ],
                 'value' => $context->getData('type') ? $context->getData('type') : Context::METADATA_DISABLE,
             ]))
+            ->addField(new FieldOptions('requireAuthorCompetingInterests', [
+                'label' => __('manager.setup.competingInterests'),
+                'options' => [
+                    [
+                        'value' => 'true',
+                        'label' => __('manager.setup.competingInterests.requireAuthors'),
+                    ],
+                ],
+                'value' => (bool) $context->getData('requireAuthorCompetingInterests'),
+            ]))
             ->addField(new FieldMetadataSetting('citations', [
                 'label' => __('submission.citations'),
                 'description' => __('manager.setup.metadata.citations.description'),
diff --git a/classes/components/forms/publication/ContributorForm.php b/classes/components/forms/publication/ContributorForm.php
index e7c6b954500..79a40bceb20 100644
--- a/classes/components/forms/publication/ContributorForm.php
+++ b/classes/components/forms/publication/ContributorForm.php
@@ -97,11 +97,18 @@ public function __construct(string $action, array $locales, Submission $submissi
             ]))
             ->addField(new FieldText('orcid', [
                 'label' => __('user.orcid'),
-            ]))
-            ->addField(new FieldRichTextarea('biography', [
-                'label' => __('user.biography'),
+            ]));
+        if ($context->getSetting('requireAuthorCompetingInterests')) {
+            $this->addField(new FieldRichTextarea('competingInterests', [
+                'label' => __('author.competingInterests'),
+                'description' => __('author.competingInterests.description'),
                 'isMultilingual' => true,
-            ]))
+            ]));
+        }
+        $this->addField(new FieldRichTextarea('biography', [
+            'label' => __('user.biography'),
+            'isMultilingual' => true,
+        ]))
             ->addField(new FieldText('affiliation', [
                 'label' => __('user.affiliation'),
                 'isMultilingual' => true,
diff --git a/classes/context/ContextDAO.php b/classes/context/ContextDAO.php
index 824a4b8935b..153055a7573 100644
--- a/classes/context/ContextDAO.php
+++ b/classes/context/ContextDAO.php
@@ -19,6 +19,7 @@
 namespace PKP\context;
 
 use Illuminate\Support\Facades\DB;
+use PKP\core\Core;
 use PKP\db\DAOResultFactory;
 use PKP\db\SchemaDAO;
 use PKP\security\Role;
@@ -137,9 +138,10 @@ public function getAvailable($userId = null, $rangeInfo = null)
     {
         $params = [];
         if ($userId) {
+            $currentDateTime = Core::getCurrentDate();
             $params = array_merge(
                 $params,
-                [(int) $userId, (int) $userId, (int) Role::ROLE_ID_SITE_ADMIN]
+                [(int) $userId, (int) $userId, (int) Role::ROLE_ID_SITE_ADMIN, $currentDateTime, $currentDateTime]
             );
         }
 
@@ -147,8 +149,8 @@ public function getAvailable($userId = null, $rangeInfo = null)
             'SELECT c.* FROM ' . $this->tableName . ' c
 			WHERE	' .
                 ($userId ?
-                    'c.' . $this->primaryKeyColumn . ' IN (SELECT DISTINCT ug.context_id FROM user_groups ug JOIN user_user_groups uug ON (ug.user_group_id = uug.user_group_id) WHERE uug.user_id = ?)
-					OR ? IN (SELECT user_id FROM user_groups ug JOIN user_user_groups uug ON (ug.user_group_id = uug.user_group_id) WHERE ug.role_id = ?)'
+                    'c.' . $this->primaryKeyColumn . ' IN (SELECT DISTINCT ug.context_id FROM user_groups ug JOIN user_user_groups uug ON (ug.user_group_id = uug.user_group_id) WHERE uug.user_id = ? AND (uug.date_start IS NULL OR uug.date_start <= ?) AND (uug.date_end IS NULL OR uug.date_end > ?))
+					OR ? IN (SELECT user_id FROM user_groups ug JOIN user_user_groups uug ON (ug.user_group_id = uug.user_group_id) WHERE ug.role_id = ? AND (uug.date_start IS NULL OR uug.date_start <= ?) AND (uug.date_end IS NULL OR uug.date_end > ?))'
                 : 'c.enabled = 1') .
             ' ORDER BY seq',
             $params,
diff --git a/classes/core/PKPApplication.php b/classes/core/PKPApplication.php
index eab71650bc6..9a69c314650 100644
--- a/classes/core/PKPApplication.php
+++ b/classes/core/PKPApplication.php
@@ -333,7 +333,7 @@ public function getHttpClient()
      */
     public function getRequest()
     {
-        $request = & Registry::get('request', true, null); // Ref req'd
+        $request = &Registry::get('request', true, null); // Ref req'd
 
         if (is_null($request)) {
             // Implicitly set request by ref in the registry
@@ -350,7 +350,7 @@ public function getRequest()
      */
     public function getDispatcher()
     {
-        $dispatcher = & Registry::get('dispatcher', true, null); // Ref req'd
+        $dispatcher = &Registry::get('dispatcher', true, null); // Ref req'd
         if (is_null($dispatcher)) {
             // Implicitly set dispatcher by ref in the registry
             $dispatcher = new Dispatcher();
@@ -468,7 +468,6 @@ public function getCurrentVersion()
     public function getDAOMap()
     {
         return [
-            'AnnouncementDAO' => 'PKP\announcement\AnnouncementDAO',
             'AnnouncementTypeDAO' => 'PKP\announcement\AnnouncementTypeDAO',
             'CitationDAO' => 'PKP\citation\CitationDAO',
             'ControlledVocabDAO' => 'PKP\controlledVocab\ControlledVocabDAO',
@@ -490,7 +489,6 @@ public function getDAOMap()
             'NotificationSubscriptionSettingsDAO' => 'PKP\notification\NotificationSubscriptionSettingsDAO',
             'PluginGalleryDAO' => 'PKP\plugins\PluginGalleryDAO',
             'PluginSettingsDAO' => 'PKP\plugins\PluginSettingsDAO',
-            'PublicationDAO' => 'APP\publication\PublicationDAO',
             'QueuedPaymentDAO' => 'PKP\payment\QueuedPaymentDAO',
             'ReviewFilesDAO' => 'PKP\submission\ReviewFilesDAO',
             'ReviewFormDAO' => 'PKP\reviewForm\ReviewFormDAO',
@@ -516,7 +514,6 @@ public function getDAOMap()
             'SubmissionSubjectEntryDAO' => 'PKP\submission\SubmissionSubjectEntryDAO',
             'TemporaryFileDAO' => 'PKP\file\TemporaryFileDAO',
             'TemporaryInstitutionsDAO' => 'PKP\statistics\TemporaryInstitutionsDAO',
-            'UserStageAssignmentDAO' => 'PKP\user\UserStageAssignmentDAO',
             'VersionDAO' => 'PKP\site\VersionDAO',
             'WorkflowStageDAO' => 'PKP\workflow\WorkflowStageDAO',
             'XMLDAO' => 'PKP\db\XMLDAO',
@@ -533,7 +530,7 @@ public function getDAOMap()
      */
     public function getQualifiedDAOName($name)
     {
-        $map = & Registry::get('daoMap', true, $this->getDAOMap()); // Ref req'd
+        $map = &Registry::get('daoMap', true, $this->getDAOMap()); // Ref req'd
         if (isset($map[$name])) {
             return $map[$name];
         }
diff --git a/classes/facades/Repo.php b/classes/facades/Repo.php
index 6142f56b567..33e23f23c8c 100644
--- a/classes/facades/Repo.php
+++ b/classes/facades/Repo.php
@@ -37,6 +37,7 @@
 use PKP\log\event\Repository as EventLogRepository;
 use PKP\submissionFile\Repository as SubmissionFileRepository;
 use PKP\userGroup\Repository as UserGroupRepository;
+use PKP\jats\Repository as JatsRepository;
 
 class Repo
 {
@@ -104,4 +105,9 @@ public static function highlight(): HighlightRepository
     {
         return app(HighlightRepository::class);
     }
+
+    public static function jats(): JatsRepository
+    {
+        return app(JatsRepository::class);
+    }
 }
diff --git a/classes/file/PKPLibraryFileManager.php b/classes/file/PKPLibraryFileManager.php
index d18fc94067c..4cbf3ce6e8d 100644
--- a/classes/file/PKPLibraryFileManager.php
+++ b/classes/file/PKPLibraryFileManager.php
@@ -18,6 +18,7 @@
 
 use PKP\context\LibraryFile;
 use PKP\context\LibraryFileDAO;
+use PKP\file\TemporaryFile;
 use PKP\core\PKPString;
 use PKP\db\DAORegistry;
 
@@ -112,16 +113,47 @@ public function &copyFromTemporaryFile(&$temporaryFile, $libraryFileType)
         $libraryFileDao = DAORegistry::getDAO('LibraryFileDAO'); /** @var LibraryFileDAO $libraryFileDao */
         $libraryFile = $libraryFileDao->newDataObject();
 
+        $libraryFile = $this->assignFromTemporaryFile($temporaryFile, $libraryFileType, $libraryFile);
+        if (!$this->copyFile($temporaryFile->getFilePath(), $this->getBasePath() . $libraryFile->getServerFileName())) {
+            return false;
+        }
+
+        return $libraryFile;
+    }
+
+    /**
+     * Routine to replace a library file from a temporary file.
+     * @param $libraryFileType int LIBRARY_FILE_TYPE_...
+     * @return LibraryFile|false the updated LibraryFile, or false on error
+     */
+    function replaceFromTemporaryFile(TemporaryFile $temporaryFile, int $libraryFileType, LibraryFile $libraryFile) {
+        $originalServerFilename = $libraryFile->getServerFileName();
+
+        $libraryFile = $this->assignFromTemporaryFile($temporaryFile, $libraryFileType, $libraryFile);
+        if (!$this->copyFile($temporaryFile->getFilePath(), $this->getBasePath() . $libraryFile->getServerFileName())) {
+                return false;
+        }
+
+        if ($originalServerFilename !== $libraryFile->getServerFileName()) {
+                unlink($this->getBasePath() . $originalServerFilename);
+        }
+        return $libraryFile;
+    }
+
+    /**
+     * Routine to assign metadata to a library file from a temporary file
+     * @param $temporaryFile TemporaryFile
+     * @param $libraryFileType int LIBRARY_FILE_TYPE_...
+     * @param $libraryFile LibraryFile 
+     * @return LibraryFile the updated LibraryFile
+     */
+    function &assignFromTemporaryFile($temporaryFile, $libraryFileType, $libraryFile) {
         $libraryFile->setDateUploaded($temporaryFile->getDateUploaded());
         $libraryFile->setDateModified($temporaryFile->getDateUploaded());
         $libraryFile->setFileType($temporaryFile->getFileType());
         $libraryFile->setFileSize($temporaryFile->getFileSize());
         $libraryFile->setServerFileName($this->generateFileName($libraryFileType, $temporaryFile->getOriginalFileName()));
         $libraryFile->setOriginalFileName($temporaryFile->getOriginalFileName());
-        if (!$this->copyFile($temporaryFile->getFilePath(), $this->getBasePath() . $libraryFile->getServerFileName())) {
-            return false;
-        }
-
         return $libraryFile;
     }
 
diff --git a/classes/jats/JatsFile.php b/classes/jats/JatsFile.php
new file mode 100644
index 00000000000..461af050812
--- /dev/null
+++ b/classes/jats/JatsFile.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @file classes/jats/JatsFile.php
+ *
+ * Copyright (c) 2014-2021 Simon Fraser University
+ * Copyright (c) 2003-2021 John Willinsky
+ * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
+ *
+ * @class JatsFile
+ *
+ * @ingroup jats
+ *
+ * @brief JatsFile file class.
+ */
+
+namespace PKP\jats;
+
+use APP\facades\Repo;
+use PKP\jats\exceptions\UnableToCreateJATSContentException;
+use PKP\submissionFile\exceptions\UnableToCreateFileContentException;
+use PKP\submissionFile\SubmissionFile;
+
+class JatsFile
+{
+    public ?string $loadingContentError = null;
+    public ?string $jatsContent = null;
+    public bool $isDefaultContent = true;
+    public array $props = [];
+
+    public function __construct(
+        public int $publicationId,
+        public ?int $submissionId = null, 
+        public ?SubmissionFile $submissionFile = null, 
+        public array $genres = []
+    ) 
+    {
+        try {
+            if ($submissionFile) {
+                $this->isDefaultContent = false;
+
+                $this->jatsContent = Repo::submissionFile()
+                    ->getSubmissionFileContent($submissionFile);
+            } else {
+                $this->jatsContent = Repo::jats()
+                    ->createDefaultJatsContent($publicationId, $submissionId);
+            }
+        } catch (UnableToCreateFileContentException | UnableToCreateJATSContentException $e) {
+            $this->loadingContentError = $e->getMessage();
+        }
+        
+    }
+}
diff --git a/classes/jats/Repository.php b/classes/jats/Repository.php
new file mode 100644
index 00000000000..04bbf561617
--- /dev/null
+++ b/classes/jats/Repository.php
@@ -0,0 +1,239 @@
+<?php
+/**
+ * @file classes/jats/Repository.php
+ *
+ * Copyright (c) 2014-2021 Simon Fraser University
+ * Copyright (c) 2000-2021 John Willinsky
+ * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
+ *
+ * @class Repository
+ *
+ * @brief A repository to find and manage JATS files.
+ */
+
+namespace PKP\jats;
+
+use APP\core\Application;
+use APP\core\Services;
+use APP\facades\Repo;
+use APP\plugins\generic\jatsTemplate\classes\Article;
+use Exception;
+use PKP\db\DAORegistry;
+use PKP\file\FileManager;
+use PKP\jats\exceptions\UnableToCreateJATSContentException;
+use PKP\submissionFile\SubmissionFile;
+use Throwable;
+
+
+class Repository
+{
+    /**
+     * Summarize the JatsFile along with the jatsContent
+     */
+    public function summarize(JatsFile $jatsFile): array
+    {
+        $fileProps = [];
+        if (!$jatsFile->isDefaultContent) {
+            $fileProps = Repo::submissionFile()
+                ->getSchemaMap()
+                ->summarize($jatsFile->submissionFile, $jatsFile->genres);
+        }
+
+        if ($jatsFile->jatsContent) {
+            $fileProps['jatsContent'] = $jatsFile->jatsContent;
+        }
+
+        $fileProps['isDefaultContent'] = $jatsFile->isDefaultContent;
+
+        if ($jatsFile->loadingContentError) {
+            $fileProps['loadingContentError'] = $jatsFile->loadingContentError;
+        }
+
+        return $fileProps;
+    }
+
+    /**
+     * Returns the SubmissionFile, if any, that corresponds to the JATS contents of the given submission/publication
+     */
+    public function getJatsFile(int $publicationId, ?int $submissionId = null, array $genres): ?JatsFile
+    {
+        $submissionFileQuery = Repo::submissionFile()
+            ->getCollector()
+            ->filterByFileStages([SubmissionFile::SUBMISSION_FILE_JATS])
+            ->filterByAssoc(Application::ASSOC_TYPE_PUBLICATION, [$publicationId]);
+        
+        if ($submissionId) {
+            $submissionFileQuery = $submissionFileQuery->filterBySubmissionIds([$submissionId]);
+        }
+
+        $submissionFile = $submissionFileQuery
+            ->getMany()
+            ->first();
+
+        return new JatsFile(
+            $publicationId, 
+            $submissionId, 
+            $submissionFile, 
+            $genres
+        );
+    }
+
+    /**
+     * Returns the name of the file that will contain the default JATS content 
+     */
+    public function getDefaultJatsFileName(int $publicationId): string
+    {
+        return 'jats-' . $publicationId . '-' . date('Ymd-His') . '.xml';
+    }
+
+    /**
+     * Creates the default JATS XML Content from the given submission/publication metadata
+     *
+     * @throws \PKP\jats\exceptions\UnableToCreateJATSContentException If the default JATS creation fails
+     */
+    public function createDefaultJatsContent(int $publicationId, ?int $submissionId = null): string
+    {
+        $publication = Repo::publication()->get($publicationId, $submissionId);
+        $submission = Repo::submission()->get($publication->getData('submissionId'));
+
+        $context = Services::get('context')->get($submission->getData('contextId'));
+        $section = Repo::section()->get($submission->getSectionId());
+
+        $issue = null;
+        if ($publication->getData('issueId')) {
+            $issue = Repo::issue()->get($publication->getData('issueId'));
+        }
+
+        try {
+            $exportXml = $this->convertSubmissionToJatsXml($submission, $context, $section, $issue, $publication, Application::get()->getRequest());
+        } catch (Throwable $e) {
+            throw new UnableToCreateJATSContentException($e);
+        }
+
+        return $exportXml;
+    }
+
+    /**
+     * Base function that will add a new JATS file
+     */
+    public function addJatsFile(
+        string $fileTmpName,
+        string $fileName,
+        int $publicationId, 
+        ?int $submissionId = null, 
+        int $type = SubmissionFile::SUBMISSION_FILE_JATS,
+        array $params = []
+    ): JatsFile
+    {
+        $publication = Repo::publication()->get($publicationId, $submissionId);
+        $submission = Repo::submission()->get($publication->getData('submissionId'));
+
+        $context = Application::get()->getRequest()->getContext();
+        $user = Application::get()->getRequest()->getUser();
+
+        // If no genre has been set and there is only one genre possible, set it automatically
+        /** @var GenreDAO */
+        $genreDao = DAORegistry::getDAO('GenreDAO');
+        $genres = $genreDao->getEnabledByContextId($context->getId());
+
+        $existingJatsFile = $this->getJatsFile($publicationId, $submissionId, $genres->toArray());
+        if (!$existingJatsFile->isDefaultContent) {
+            throw new Exception('A JATS file already exists');
+        }
+
+        $fileManager = new FileManager();
+        $extension = $fileManager->parseFileExtension($fileName);
+
+        $submissionDir = Repo::submissionFile()
+            ->getSubmissionDir(
+                $submission->getData('contextId'),
+                $submission->getId()
+            );
+
+        $fileId = Services::get('file')->add(
+            $fileTmpName,
+            $submissionDir . '/' . uniqid() . '.' . $extension
+        );
+
+        $params['fileId'] = $fileId;
+        $params['submissionId'] = $submission->getId();
+        $params['uploaderUserId'] = $user->getId();
+        $params['fileStage'] = $type;
+
+        $primaryLocale = $context->getPrimaryLocale();
+        $allowedLocales = $context->getData('supportedSubmissionLocales');
+
+        $params['name'] = null;
+        $params['name'][$primaryLocale] = $fileName;
+
+        if (empty($params['genreId'])) {
+        
+            [$firstGenre, $secondGenre] = [$genres->next(), $genres->next()];
+            if ($firstGenre && !$secondGenre) {
+                $params['genreId'] = $firstGenre->getId();
+            }
+        }
+
+        $params['assocType'] = Application::ASSOC_TYPE_PUBLICATION;
+        $params['assocId'] = $publication->getId();
+
+        $errors = Repo::submissionFile()
+            ->validate(
+                null,
+                $params,
+                $allowedLocales,
+                $primaryLocale
+            );
+
+        if (!empty($errors)) {
+            Services::get('file')->delete($fileId);
+            throw new Exception(''. implode(', ', $errors));
+        }
+
+        $submissionFile = Repo::submissionFile()
+            ->newDataObject($params);
+
+        $submissionFileId = Repo::submissionFile()
+            ->add($submissionFile);
+
+        $jatsFile = Repo::jats()
+            ->getJatsFile($publication->getId(), $submission->getId(), $genres->toArray());
+
+        return $jatsFile;
+    }
+
+    /**
+     * Given a submission and a publication this function returns the JATS XML contents provided by the 
+     * submission/publication metadata
+     *
+     * @throws \PKP\jats\exceptions\UnableToCreateJATSContentException If the default JATS creation fails
+     */
+    protected function convertSubmissionToJatsXml($submission, $journal, $section, $issue, $publication, $request): string
+    {
+        if (!class_exists(\APP\plugins\generic\jatsTemplate\classes\Article::class)) {
+            throw new UnableToCreateJATSContentException();
+        }
+
+        $articleJats = new Article();
+
+        $articleJats->preserveWhiteSpace = false;
+        $articleJats->formatOutput = true;
+
+        $articleJats->convertSubmission($submission, $journal, $section, $issue, $publication, $request);
+
+        $formattedXml = $articleJats->saveXML();
+
+        return $formattedXml;
+    }
+
+    /**
+     * Get all valid file stages
+     *
+     * Valid file stages should be passed through
+     * the hook SubmissionFile::fileStages.
+     * @return array
+     */
+    public function getFileStages(): array {
+        return [SubmissionFile::SUBMISSION_FILE_JATS];
+    }
+}
diff --git a/classes/jats/exceptions/UnableToCreateJATSContentException.php b/classes/jats/exceptions/UnableToCreateJATSContentException.php
new file mode 100644
index 00000000000..cba4f67d1e9
--- /dev/null
+++ b/classes/jats/exceptions/UnableToCreateJATSContentException.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * @file classes/jats/exceptions/UnableToCreateJATSContentException.php
+ *
+ * Copyright (c) 2014-2022 Simon Fraser University
+ * Copyright (c) 2000-2022 John Willinsky
+ * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
+ *
+ * @class UnableToCreateJATSContentException
+ *
+ * @brief Exception for failure to create a Publication's JATS Content.
+ */
+
+namespace PKP\jats\exceptions;
+
+use Exception;
+
+class UnableToCreateJATSContentException extends Exception
+{
+
+    public function __construct(public ?Exception $innerException = null)
+    {
+        parent::__construct(__('publication.jats.defaultContentCreationError'), null, $innerException);
+    }
+}
diff --git a/classes/migration/install/RolesAndUserGroupsMigration.php b/classes/migration/install/RolesAndUserGroupsMigration.php
index 56cb46e674f..7512a9937af 100644
--- a/classes/migration/install/RolesAndUserGroupsMigration.php
+++ b/classes/migration/install/RolesAndUserGroupsMigration.php
@@ -63,7 +63,8 @@ public function up(): void
             $table->foreign('user_id', 'user_user_groups_user_id')->references('user_id')->on('users')->onDelete('cascade');
             $table->index(['user_id'], 'user_user_groups_user_id');
 
-            $table->unique(['user_group_id', 'user_id'], 'user_user_groups_unique');
+            $table->datetime('date_start')->nullable();
+            $table->datetime('date_end')->nullable();
         });
 
         Schema::create('user_group_stage', function (Blueprint $table) {
diff --git a/classes/migration/upgrade/v3_4_0/I7249_UpdateUsersUniqueIndex_v3_1.php b/classes/migration/upgrade/v3_4_0/I7249_UpdateUsersUniqueIndex_v3_1.php
index 4a2d3fa5c9e..025d8a49c6f 100644
--- a/classes/migration/upgrade/v3_4_0/I7249_UpdateUsersUniqueIndex_v3_1.php
+++ b/classes/migration/upgrade/v3_4_0/I7249_UpdateUsersUniqueIndex_v3_1.php
@@ -23,8 +23,8 @@ public function up(): void
     {
         switch (DB::getDriverName()) {
             case 'pgsql':
-                DB::unprepared('DROP INDEX users_username;');
-                DB::unprepared('DROP INDEX users_email;');
+                DB::unprepared('DROP INDEX IF EXISTS users_username;');
+                DB::unprepared('DROP INDEX IF EXISTS users_email;');
 
                 DB::unprepared('CREATE UNIQUE INDEX users_username on users (LOWER(username));');
                 DB::unprepared('CREATE UNIQUE INDEX users_email on users (LOWER(email));');
@@ -36,8 +36,8 @@ public function down(): void
     {
         switch (DB::getDriverName()) {
             case 'pgsql':
-                DB::unprepared('DROP INDEX users_username;');
-                DB::unprepared('DROP INDEX users_email;');
+                DB::unprepared('DROP INDEX IF EXISTS users_username;');
+                DB::unprepared('DROP INDEX IF EXISTS users_email;');
 
                 DB::unprepared('CREATE UNIQUE INDEX users_username on users (username);');
                 DB::unprepared('CREATE UNIQUE INDEX users_email on users (email);');
diff --git a/classes/migration/upgrade/v3_5_0/I9462_UserUserGroups.php b/classes/migration/upgrade/v3_5_0/I9462_UserUserGroups.php
new file mode 100644
index 00000000000..02a1cf04531
--- /dev/null
+++ b/classes/migration/upgrade/v3_5_0/I9462_UserUserGroups.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * @file classes/migration/upgrade/v3_5_0/I9462_UserUserGroups.php
+ *
+ * Copyright (c) 2023 Simon Fraser University
+ * Copyright (c) 2023 John Willinsky
+ * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
+ *
+ * @class I9462_UserUserGroups
+ *
+ * @brief Add start and end date to the user_user_groups table.
+ */
+
+namespace PKP\migration\upgrade\v3_5_0;
+
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+use PKP\migration\Migration;
+
+class I9462_UserUserGroups extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('user_user_groups', function (Blueprint $table) {
+            $table->datetime('date_start')->nullable();
+            $table->datetime('date_end')->nullable();
+            $table->dropUnique('user_user_groups_unique');
+        });
+    }
+
+    /**
+     * Reverse the migration.
+     */
+    public function down(): void
+    {
+        Schema::table('user_user_groups', function (Blueprint $table) {
+            if (Schema::hasColumn($table->getTable(), 'date_start')) {
+                $table->dropColumn('date_start');
+            };
+            if (Schema::hasColumn($table->getTable(), 'date_end')) {
+                $table->dropColumn('date_end');
+            };
+            $sm = Schema::getConnection()->getDoctrineSchemaManager();
+            $indexesFound = $sm->listTableIndexes('user_user_groups');
+            if (!array_key_exists('user_user_groups_unique', $indexesFound)) {
+                $table->unique(['user_group_id', 'user_id'], 'user_user_groups_unique');
+            }
+        });
+    }
+}
diff --git a/classes/notification/NotificationSubscriptionSettingsDAO.php b/classes/notification/NotificationSubscriptionSettingsDAO.php
index 1e507fd15d5..a33b14e79f4 100644
--- a/classes/notification/NotificationSubscriptionSettingsDAO.php
+++ b/classes/notification/NotificationSubscriptionSettingsDAO.php
@@ -23,6 +23,7 @@
 use Illuminate\Database\Query\Builder;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\DB;
+use PKP\core\Core;
 
 class NotificationSubscriptionSettingsDAO extends \PKP\db\DAO
 {
@@ -185,6 +186,7 @@ public function insertNewRSSToken($userId, $contextId)
      */
     public function getSubscribedUserIds(array $blockedNotificationKey, array $blockedNotificationType, array $contextIds, ?array $roleIds = null): Collection
     {
+        $currentDateTime = Core::getCurrentDate();
         return DB::table('users as u')->select('u.user_id')
             ->whereNotIn(
                 'u.user_id',
@@ -196,6 +198,14 @@ public function getSubscribedUserIds(array $blockedNotificationKey, array $block
                 fn (Builder $q) => $q->from('user_user_groups', 'uug')
                     ->join('user_groups AS ug', 'uug.user_group_id', '=', 'ug.user_group_id')
                     ->whereColumn('uug.user_id', '=', 'u.user_id')
+                    ->where(
+                        fn (Builder $q) => $q->where('uug.date_start', '<=', $currentDateTime)
+                            ->orWhereNull('uug.date_start')
+                    )
+                    ->where(
+                        fn (Builder $q) => $q->where('uug.date_end', '>', $currentDateTime)
+                            ->orWhereNull('uug.date_end')
+                    )
                     ->whereIn('ug.context_id', $contextIds)
                     ->when(!is_null($roleIds), fn (Builder $q) => $q->whereIn('ug.role_id', $roleIds))
             )->pluck('user_id');
diff --git a/classes/plugins/PluginGalleryDAO.php b/classes/plugins/PluginGalleryDAO.php
index c176b16cdce..3079a78be53 100644
--- a/classes/plugins/PluginGalleryDAO.php
+++ b/classes/plugins/PluginGalleryDAO.php
@@ -150,7 +150,7 @@ function (FileCache $cache) {
      */
     private function _getDocument()
     {
-        $doc = new DOMDocument('1.0');
+        $doc = new DOMDocument('1.0', 'utf-8');
         $doc->loadXML($this->getCachedDocument());
 
         return $doc;
diff --git a/classes/publication/Repository.php b/classes/publication/Repository.php
index 5acdb7f14e3..18d40bce863 100644
--- a/classes/publication/Repository.php
+++ b/classes/publication/Repository.php
@@ -350,6 +350,17 @@ public function version(Publication $publication): int
             $citationDao->importCitations($newPublication->getId(), $newPublication->getData('citationsRaw'));
         }
 
+        $genreDao = DAORegistry::getDAO('GenreDAO');
+        $genres = $genreDao->getEnabledByContextId($context->getId());
+
+        $jatsFile = Repo::jats()
+            ->getJatsFile($publication->getId(), null, $genres->toArray());
+
+        if (!$jatsFile->isDefaultContent) {
+            Repo::submissionFile()
+                ->versionSubmissionFile($jatsFile->submissionFile, $newPublication);
+        }
+
         $newPublication = Repo::publication()->get($newPublication->getId());
 
         Hook::call('Publication::version', [&$newPublication, $publication]);
diff --git a/classes/security/RoleDAO.php b/classes/security/RoleDAO.php
index c1ee3deaa28..17f19ace1c7 100644
--- a/classes/security/RoleDAO.php
+++ b/classes/security/RoleDAO.php
@@ -19,6 +19,7 @@
 namespace PKP\security;
 
 use APP\facades\Repo;
+use PKP\core\Core;
 use PKP\db\DAO;
 use PKP\db\DAORegistry;
 
@@ -45,18 +46,19 @@ public function newDataObject()
      */
     public function userHasRole($contextId, $userId, $roleId)
     {
+        $currentDateTime = Core::getCurrentDate();
         $roleId = is_array($roleId) ? join(',', array_map('intval', $roleId)) : (int) $roleId;
         $result = $this->retrieve(
             'SELECT count(*) AS row_count FROM user_groups ug JOIN user_user_groups uug ON ug.user_group_id = uug.user_group_id
-			WHERE ug.context_id = ? AND uug.user_id = ? AND ug.role_id IN (' . $roleId . ')',
-            [(int) $contextId, (int) $userId]
+			WHERE ug.context_id = ? AND uug.user_id = ? AND (uug.date_start IS NULL OR uug.date_start <= ?) AND (uug.date_end IS NULL OR uug.date_end > ?) AND ug.role_id IN (' . $roleId . ')',
+            [(int) $contextId, (int) $userId, $currentDateTime, $currentDateTime]
         );
         $row = (array) $result->current();
         return $row && $row['row_count'];
     }
 
     /**
-     * Return an array of row objects corresponding to the roles a given use has
+     * Return an array of row objects corresponding to the roles a given user has
      *
      * @param int $userId
      * @param int $contextId
@@ -65,7 +67,8 @@ public function userHasRole($contextId, $userId, $roleId)
      */
     public function getByUserId($userId, $contextId = null)
     {
-        $params = [(int) $userId];
+        $currentDateTime = Core::getCurrentDate();
+        $params = [(int) $userId, $currentDateTime, $currentDateTime];
         if ($contextId !== null) {
             $params[] = (int) $contextId;
         }
@@ -73,7 +76,7 @@ public function getByUserId($userId, $contextId = null)
             'SELECT	DISTINCT ug.role_id AS role_id
 			FROM	user_groups ug
 				JOIN user_user_groups uug ON ug.user_group_id = uug.user_group_id
-			WHERE	uug.user_id = ?' . ($contextId !== null ? ' AND ug.context_id = ?' : ''),
+			WHERE	uug.user_id = ? AND (uug.date_start IS NULL OR uug.date_start <= ?) AND (uug.date_end IS NULL OR uug.date_end > ?)' . ($contextId !== null ? ' AND ug.context_id = ?' : ''),
             $params
         );
 
diff --git a/classes/services/queryBuilders/PKPContextQueryBuilder.php b/classes/services/queryBuilders/PKPContextQueryBuilder.php
index ff520c31cdb..acbb5dd49e6 100644
--- a/classes/services/queryBuilders/PKPContextQueryBuilder.php
+++ b/classes/services/queryBuilders/PKPContextQueryBuilder.php
@@ -15,7 +15,9 @@
 
 namespace PKP\services\queryBuilders;
 
+use Illuminate\Database\Query\Builder;
 use Illuminate\Support\Facades\DB;
+use PKP\core\Core;
 use PKP\plugins\Hook;
 use PKP\security\Role;
 use PKP\services\queryBuilders\interfaces\EntityQueryBuilderInterface;
@@ -146,6 +148,7 @@ public function getManySummary()
      */
     public function getQuery()
     {
+        $currentDateTime = Core::getCurrentDate();
         $this->columns[] = 'c.*';
         $q = DB::table($this->db . ' as c');
 
@@ -156,21 +159,38 @@ public function getQuery()
         }
 
         // Filter for user id if present
-        $q->when(!empty($this->userId), function ($q) {
-            $q->whereIn('c.' . $this->dbIdColumn, function ($q) {
+        $q->when(
+            !empty($this->userId),
+            fn (Builder $q) =>
+            $q->whereIn(
+                'c.' . $this->dbIdColumn,
+                fn (Builder $q) =>
                 $q->select('context_id')
                     ->from('user_groups')
-                    ->where(function ($q) {
+                    ->where(
+                        fn (Builder $q) =>
                         $q->where('role_id', '=', Role::ROLE_ID_MANAGER)
-                            ->orWhere('c.enabled', '=', 1);
-                    })
-                    ->whereIn('user_group_id', function ($q) {
+                            ->orWhere('c.enabled', '=', 1)
+                    )
+                    ->whereIn(
+                        'user_group_id',
+                        fn (Builder $q) =>
                         $q->select('user_group_id')
                             ->from('user_user_groups')
-                            ->where('user_id', '=', $this->userId);
-                    });
-            });
-        });
+                            ->where('user_id', '=', $this->userId)
+                            ->where(
+                                fn (Builder $q) =>
+                                $q->where('date_start', '<=', $currentDateTime)
+                                    ->orWhereNull('date_start')
+                            )
+                            ->where(
+                                fn (Builder $q) =>
+                                $q->where('date_end', '>', $currentDateTime)
+                                    ->orWhereNull('date_end')
+                            )
+                    )
+            )
+        );
 
         // search phrase
         $q->when($this->searchPhrase !== null, function ($query) {
diff --git a/classes/statistics/PKPTemporaryTotalsDAO.php b/classes/statistics/PKPTemporaryTotalsDAO.php
index 7716ad53d0a..41d2fe8c2f1 100644
--- a/classes/statistics/PKPTemporaryTotalsDAO.php
+++ b/classes/statistics/PKPTemporaryTotalsDAO.php
@@ -23,6 +23,7 @@
 namespace PKP\statistics;
 
 use APP\core\Application;
+use DateTimeImmutable;
 use Illuminate\Support\Facades\DB;
 use PKP\config\Config;
 use PKP\db\DAORegistry;
@@ -107,8 +108,8 @@ public function removeDoubleClicks(int $counterDoubleClickTimeFilter): void
      */
     public function compileContextMetrics(string $loadId): void
     {
-        $date = substr($loadId, -12, 8);
-        DB::table('metrics_context')->where('load_id', '=', $loadId)->orWhere('date', '=', DB::raw("DATE({$date})"))->delete();
+        $date = DateTimeImmutable::createFromFormat('Ymd', substr($loadId, -12, 8));
+        DB::table('metrics_context')->where('load_id', '=', $loadId)->orWhereDate('date', '=', $date)->delete();
         $selectContextMetrics = DB::table($this->table)
             ->select(DB::raw('load_id, context_id, DATE(date) as date, count(*) as metric'))
             ->where('load_id', '=', $loadId)
@@ -122,8 +123,8 @@ public function compileContextMetrics(string $loadId): void
      */
     public function compileSubmissionMetrics(string $loadId): void
     {
-        $date = substr($loadId, -12, 8);
-        DB::table('metrics_submission')->where('load_id', '=', $loadId)->orWhere('date', '=', DB::raw("DATE({$date})"))->delete();
+        $date = DateTimeImmutable::createFromFormat('Ymd', substr($loadId, -12, 8));
+        DB::table('metrics_submission')->where('load_id', '=', $loadId)->orWhereDate('date', '=', $date)->delete();
         $selectSubmissionMetrics = DB::table($this->table)
             ->select(DB::raw('load_id, context_id, submission_id, assoc_type, DATE(date) as date, count(*) as metric'))
             ->where('load_id', '=', $loadId)
@@ -151,18 +152,18 @@ public function compileSubmissionMetrics(string $loadId): void
     // The total metrics will be loaded here (s. load... functions below), unique metrics are loaded in UnsageStatsUnique... classes
     public function deleteSubmissionGeoDailyByLoadId(string $loadId): void
     {
-        $date = substr($loadId, -12, 8);
-        DB::table('metrics_submission_geo_daily')->where('load_id', '=', $loadId)->orWhere('date', '=', DB::raw("DATE({$date})"))->delete();
+        $date = DateTimeImmutable::createFromFormat('Ymd', substr($loadId, -12, 8));
+        DB::table('metrics_submission_geo_daily')->where('load_id', '=', $loadId)->orWhereDate('date', '=', $date)->delete();
     }
     public function deleteCounterSubmissionDailyByLoadId(string $loadId): void
     {
-        $date = substr($loadId, -12, 8);
-        DB::table('metrics_counter_submission_daily')->where('load_id', '=', $loadId)->orWhere('date', '=', DB::raw("DATE({$date})"))->delete();
+        $date = DateTimeImmutable::createFromFormat('Ymd', substr($loadId, -12, 8));
+        DB::table('metrics_counter_submission_daily')->where('load_id', '=', $loadId)->orWhereDate('date', '=', $date)->delete();
     }
     public function deleteCounterSubmissionInstitutionDailyByLoadId(string $loadId): void
     {
-        $date = substr($loadId, -12, 8);
-        DB::table('metrics_counter_submission_institution_daily')->where('load_id', '=', $loadId)->orWhere('date', '=', DB::raw("DATE({$date})"))->delete();
+        $date = DateTimeImmutable::createFromFormat('Ymd', substr($loadId, -12, 8));
+        DB::table('metrics_counter_submission_institution_daily')->where('load_id', '=', $loadId)->orWhereDate('date', '=', $date)->delete();
     }
 
     /**
diff --git a/classes/submissionFile/Repository.php b/classes/submissionFile/Repository.php
index 640a72fc938..a66a9b5c90b 100644
--- a/classes/submissionFile/Repository.php
+++ b/classes/submissionFile/Repository.php
@@ -19,13 +19,16 @@
 use APP\facades\Repo;
 use APP\notification\Notification;
 use APP\notification\NotificationManager;
+use APP\publication\Publication;
 use Exception;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Mail;
+use PKP\config\Config;
 use PKP\core\Core;
 use PKP\core\PKPApplication;
 use PKP\db\DAORegistry;
+use PKP\file\FileManager;
 use PKP\log\event\SubmissionFileEventLogEntry;
 use PKP\log\SubmissionEmailLogDAO;
 use PKP\log\SubmissionEmailLogEntry;
@@ -40,6 +43,7 @@
 use PKP\services\PKPSchemaService;
 use PKP\stageAssignment\StageAssignmentDAO;
 use PKP\submission\reviewRound\ReviewRoundDAO;
+use PKP\submissionFile\exceptions\UnableToCreateFileContentException;
 use PKP\submissionFile\maps\Schema;
 use PKP\validation\ValidatorFactory;
 
@@ -662,7 +666,8 @@ public function getWorkflowStageId(SubmissionFile $submissionFile): ?int
 
         if (
             $fileStage === SubmissionFile::SUBMISSION_FILE_PROOF ||
-            $fileStage === SubmissionFile::SUBMISSION_FILE_PRODUCTION_READY
+            $fileStage === SubmissionFile::SUBMISSION_FILE_PRODUCTION_READY ||
+            $fileStage === SubmissionFile::SUBMISSION_FILE_JATS
         ) {
             return WORKFLOW_STAGE_ID_PRODUCTION;
         }
@@ -843,4 +848,64 @@ protected function getSubmissionFileLogData(SubmissionFile $submissionFile): arr
             'username' => $user?->getUsername(),
         ];
     }
+
+    /**
+     * Can be used to copy a SubmissionFile to another SubmissionFile along with the corresponding file
+     */
+    public function versionSubmissionFile(
+        SubmissionFile $submissionFile,
+        Publication $newPublication
+    ): SubmissionFile
+    {
+        $newSubmissionFile = clone $submissionFile;
+
+        $oldFileId = $submissionFile->getData('fileId');
+
+        $oldFile = Services::get('file')->get($oldFileId);
+
+        $submission = Repo::submission()->get($newPublication->getData('submissionId'));
+
+        $fileManager = new FileManager();
+        $extension = $fileManager->parseFileExtension($oldFile->path);
+
+        $submissionDir = Repo::submissionFile()
+            ->getSubmissionDir(
+                $submission->getData('contextId'),
+                $newPublication->getData('submissionId')
+            );
+
+        $newFileId = Services::get('file')->add(
+            Config::getVar('files', 'files_dir') . '/' . $oldFile->path,
+            $submissionDir . '/' . uniqid() . '.' . $extension
+        );
+
+        $newSubmissionFile->setData('id', null);
+        $newSubmissionFile->setData('assocId', $newPublication->getId());
+        $newSubmissionFile->setData('fileId', $newFileId);
+
+        $submissionFileId = Repo::submissionFile()
+            ->add($newSubmissionFile);
+
+        $submissionFile = Repo::submissionFile()
+            ->get($submissionFileId);
+
+        return $submissionFile;
+    }
+
+    /**
+     * Returns jatsContent for Submission files that correspond to the content of the file
+     *
+     * @throws \PKP\submissionFile\exceptions\UnableToCreateFileContentException If the default JATS creation fails
+     */
+    public function getSubmissionFileContent(SubmissionFile $submissionFile): string | false
+    {
+        $fileName = Config::getVar('files', 'files_dir') . '/' . $submissionFile->getData('path') .'';
+        $retValue = file_get_contents($fileName);
+
+        if ($retValue === false) {
+            throw new UnableToCreateFileContentException($fileName);
+        }
+
+        return $retValue;
+    }
 }
diff --git a/classes/submissionFile/SubmissionFile.php b/classes/submissionFile/SubmissionFile.php
index bdd41e612d9..5dc94715124 100644
--- a/classes/submissionFile/SubmissionFile.php
+++ b/classes/submissionFile/SubmissionFile.php
@@ -38,6 +38,7 @@ class SubmissionFile extends \PKP\core\DataObject
     public const SUBMISSION_FILE_QUERY = 18;
     public const SUBMISSION_FILE_INTERNAL_REVIEW_FILE = 19;
     public const SUBMISSION_FILE_INTERNAL_REVIEW_REVISION = 20;
+    public const SUBMISSION_FILE_JATS = 21;
 
     public const INTERNAL_REVIEW_STAGES = [
         SubmissionFile::SUBMISSION_FILE_INTERNAL_REVIEW_FILE,
diff --git a/classes/submissionFile/exceptions/UnableToCreateFileContentException.php b/classes/submissionFile/exceptions/UnableToCreateFileContentException.php
new file mode 100644
index 00000000000..48cd15254b7
--- /dev/null
+++ b/classes/submissionFile/exceptions/UnableToCreateFileContentException.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * @file classes/jats/exceptions/UnableToCreateFileContentException.php
+ *
+ * Copyright (c) 2014-2022 Simon Fraser University
+ * Copyright (c) 2000-2022 John Willinsky
+ * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
+ *
+ * @class UnableToCreateFileContentException
+ *
+ * @brief Exception for failure to create a Submission File's content
+ */
+
+namespace PKP\submissionFile\exceptions;
+
+use Exception;
+
+class UnableToCreateFileContentException extends Exception
+{
+
+    public function __construct(string $fileName, public ?Exception $innerException = null)
+    {
+        parent::__construct(__('submission.files.content.error', ['fileName' => $fileName]), null, $innerException);
+    }
+}
diff --git a/classes/user/Collector.php b/classes/user/Collector.php
index db0b1272b2f..d953739d3f5 100644
--- a/classes/user/Collector.php
+++ b/classes/user/Collector.php
@@ -22,12 +22,13 @@
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\LazyCollection;
 use InvalidArgumentException;
-use PKP\config\Config;
+use PKP\core\Core;
 use PKP\core\interfaces\CollectorInterface;
 use PKP\core\PKPString;
 use PKP\facades\Locale;
 use PKP\identity\Identity;
 use PKP\plugins\Hook;
+use PKP\userGroup\relationships\enums\UserUserGroupStatus;
 
 /**
  * @template T of User
@@ -74,6 +75,7 @@ class Collector implements CollectorInterface
     public ?array $reviewsActive = null;
     public ?int $count = null;
     public ?int $offset = null;
+    public UserUserGroupStatus $userUserGroupStatus = UserUserGroupStatus::STATUS_ACTIVE;
 
     /**
      * Constructor
@@ -264,6 +266,15 @@ public function filterExcludeRoles(?array $excludedRoles): self
         return $this;
     }
 
+    /**
+     * Filter by user's role status
+     */
+    public function filterByUserUserGroupStatus(UserUserGroupStatus $userUserGroupStatus): self
+    {
+        $this->userUserGroupStatus = $userUserGroupStatus;
+        return $this;
+    }
+
     /**
      * Retrieve assigned users by submission and stage IDs.
      * (Replaces UserStageAssignmentDAO::getUsersBySubmissionAndStageId)
@@ -446,6 +457,7 @@ protected function buildUserGroupFilter(Builder $query): self
         if ($this->userGroupIds === null && $this->roleIds === null && $this->contextIds === null && $this->workflowStageIds === null) {
             return $this;
         }
+        $currentDateTime = Core::getCurrentDate();
         $query->whereExists(
             fn (Builder $query) => $query->from('user_user_groups', 'uug')
                 ->join('user_groups AS ug', 'uug.user_group_id', '=', 'ug.user_group_id')
@@ -460,6 +472,26 @@ protected function buildUserGroupFilter(Builder $query): self
                 ->when($this->excludeRoles !== null, fn ($query) => $query->whereNotIn('ug.role_id', $this->excludeRoles))
                 ->when($this->roleIds !== null, fn ($query) => $query->whereIn('ug.role_id', $this->roleIds))
                 ->when($this->contextIds !== null, fn ($query) => $query->whereIn('ug.context_id', $this->contextIds))
+                ->when(
+                    $this->userUserGroupStatus === UserUserGroupStatus::STATUS_ACTIVE,
+                    fn (Builder $query) =>
+                    $query->where(
+                        fn (Builder $query) =>
+                        $query->where('uug.date_start', '<=', $currentDateTime)
+                            ->orWhereNull('uug.date_start')
+                    )
+                        ->where(
+                            fn (Builder $query) =>
+                            $query->where('uug.date_end', '>', $currentDateTime)
+                                ->orWhereNull('uug.date_end')
+                        )
+                )
+                ->when(
+                    $this->userUserGroupStatus === UserUserGroupStatus::STATUS_ENDED,
+                    fn (Builder $query) =>
+                    $query->whereNotNull('uug.date_end')
+                        ->where('uug.date_end', '<=', $currentDateTime)
+                )
         );
         return $this;
     }
@@ -488,6 +520,7 @@ protected function buildExcludedSubmissionStagesFilter(Builder $query): self
         if ($this->excludeSubmissionStage === null) {
             return $this;
         }
+        $currentDateTime = Core::getCurrentDate();
         $query->whereExists(
             fn (Builder $query) => $query->from('user_user_groups', 'uug')
                 ->join('user_group_stage AS ugs', 'ugs.user_group_id', '=', 'uug.user_group_id')
@@ -501,6 +534,26 @@ protected function buildExcludedSubmissionStagesFilter(Builder $query): self
                 ->where('uug.user_group_id', '=', $this->excludeSubmissionStage['user_group_id'])
                 ->where('ugs.stage_id', '=', $this->excludeSubmissionStage['stage_id'])
                 ->whereNull('sa.user_group_id')
+                ->when(
+                    $this->userUserGroupStatus === UserUserGroupStatus::STATUS_ACTIVE,
+                    fn (Builder $query) =>
+                    $query->where(
+                        fn (Builder $query) =>
+                        $query->where('uug.date_start', '<=', $currentDateTime)
+                            ->orWhereNull('uug.date_start')
+                    )
+                        ->where(
+                            fn (Builder $query) =>
+                            $query->where('uug.date_end', '>', $currentDateTime)
+                                ->orWhereNull('uug.date_end')
+                        )
+                )
+                ->when(
+                    $this->userUserGroupStatus === UserUserGroupStatus::STATUS_ENDED,
+                    fn (Builder $query) =>
+                    $query->whereNotNull('uug.date_end')
+                        ->where('uug.date_end', '<=', $currentDateTime)
+                )
         );
         return $this;
     }
diff --git a/classes/user/DAO.php b/classes/user/DAO.php
index c4afc37b1e8..3db3bf8172f 100644
--- a/classes/user/DAO.php
+++ b/classes/user/DAO.php
@@ -20,12 +20,14 @@
 
 use APP\facades\Repo;
 use Carbon\Carbon;
+use Illuminate\Database\Query\Builder;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\LazyCollection;
 use PKP\core\DataObject;
 use PKP\core\EntityDAO;
 use PKP\identity\Identity;
+use PKP\security\Role;
 
 /**
  * @template T of User
@@ -352,4 +354,28 @@ public function deleteUnvalidatedExpiredUsers(Carbon $dateTillValid, array $excl
 
         return $users->count();
     }
+
+    /** Get admin users */
+    public function getAdminUsers(): LazyCollection
+    {
+        $adminGroups = Repo::userGroup()->getArrayIdByRoleId(Role::ROLE_ID_SITE_ADMIN);
+        $rows = collect();
+        if (count($adminGroups)) {
+            $rows = DB::table('users', 'u')
+                ->select('u.*')
+                ->where('u.disabled', '=', 0)
+                ->whereExists(
+                    fn (Builder $query) => $query->from('user_user_groups', 'uug')
+                        ->join('user_groups AS ug', 'uug.user_group_id', '=', 'ug.user_group_id')
+                        ->whereColumn('uug.user_id', '=', 'u.user_id')
+                        ->whereIn('uug.user_group_id', $adminGroups)
+                )
+                ->get();
+        }
+        return LazyCollection::make(function () use ($rows) {
+            foreach ($rows as $row) {
+                yield $row->user_id => $this->fromRow($row);
+            }
+        });
+    }
 }
diff --git a/classes/user/Repository.php b/classes/user/Repository.php
index 8a51aa91307..20bd2fe1a4d 100644
--- a/classes/user/Repository.php
+++ b/classes/user/Repository.php
@@ -17,6 +17,7 @@
 use APP\facades\Repo;
 use APP\submission\Submission;
 use Carbon\Carbon;
+use Illuminate\Support\LazyCollection;
 use PKP\context\Context;
 use PKP\context\SubEditorsDAO;
 use PKP\core\PKPApplication;
@@ -419,4 +420,10 @@ public function deleteUnvalidatedExpiredUsers(Carbon $dateTillValid, array $excl
     {
         return $this->dao->deleteUnvalidatedExpiredUsers($dateTillValid, $excludableUsersId);
     }
+
+    /** Get admin users */
+    public function getAdminUsers(): LazyCollection
+    {
+        return $this->dao->getAdminUsers();
+    }
 }
diff --git a/classes/user/UserStageAssignmentDAO.php b/classes/user/UserStageAssignmentDAO.php
deleted file mode 100644
index b0dc45e359f..00000000000
--- a/classes/user/UserStageAssignmentDAO.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-
-/**
- * @file classes/user/UserStageAssignmentDAO.php
- *
- * Copyright (c) 2014-2021 Simon Fraser University
- * Copyright (c) 2000-2021 John Willinsky
- * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
- *
- * @class UserStageAssignmentDAO
- *
- * @ingroup user
- *
- * @brief Operations for users as related to their stage assignments
- */
-
-namespace PKP\user;
-
-use APP\core\Application;
-use PKP\db\DAO;
-use PKP\db\DAOResultFactory;
-use PKP\db\DBResultRange;
-use PKP\facades\Locale;
-use PKP\identity\Identity;
-
-/**
- * @deprecated 3.4.0
- * @see \PKP\user\Collector
- */
-class UserStageAssignmentDAO extends DAO
-{
-    /**
-     * Delete a stage assignment by Id.
-     *
-     * @param int $assignmentId
-     *
-     * @return bool
-     */
-    public function deleteAssignment($assignmentId)
-    {
-        return $this->update('DELETE FROM stage_assignments WHERE stage_assignment_id = ?', [(int) $assignmentId]);
-    }
-
-    /**
-     * Retrieve a set of users of a user group not assigned to a given submission stage and matching the specified settings.
-     *
-     * @todo Not working and not being used, probably can be removed
-     *
-     * @param int $submissionId
-     * @param int $stageId
-     * @param int $userGroupId
-     * @param string|null $name Partial string match with user name
-     * @param ?DBResultRange $rangeInfo
-     *
-     * @return DAOResultFactory Object
-     */
-    public function filterUsersNotAssignedToStageInUserGroup($submissionId, $stageId, $userGroupId, $name = null, $rangeInfo = null)
-    {
-        $site = Application::get()->getRequest()->getSite();
-        $primaryLocale = $site->getPrimaryLocale();
-        $locale = Locale::getLocale();
-        $params = [
-            (int) $submissionId,
-            (int) $stageId,
-            Identity::IDENTITY_SETTING_GIVENNAME, $primaryLocale,
-            Identity::IDENTITY_SETTING_FAMILYNAME, $primaryLocale,
-            Identity::IDENTITY_SETTING_GIVENNAME, $locale,
-            Identity::IDENTITY_SETTING_FAMILYNAME, $locale,
-            (int) $userGroupId,
-        ];
-        if ($name !== null) {
-            $params = array_merge($params, array_fill(0, 6, '%' . (string) $name . '%'));
-        }
-        $result = $this->retrieveRange(
-            $sql = 'SELECT	u.*
-			FROM	users u
-				LEFT JOIN user_user_groups uug ON (u.user_id = uug.user_id)
-				LEFT JOIN stage_assignments s ON (s.user_id = uug.user_id AND s.user_group_id = uug.user_group_id AND s.submission_id = ?)
-				JOIN user_group_stage ugs ON (uug.user_group_id = ugs.user_group_id AND ugs.stage_id = ?)
-				LEFT JOIN user_settings usgs_pl ON (usgs_pl.user_id = u.user_id AND usgs_pl.setting_name = ? AND usgs_pl.locale = ?)
-				LEFT JOIN user_settings usfs_pl ON (usfs_pl.user_id = u.user_id AND usfs_pl.setting_name = ? AND usfs_pl.locale = ?)
-				LEFT JOIN user_settings usgs_l ON (usgs_l.user_id = u.user_id AND usgs_l.setting_name = ? AND usgs_l.locale = ?)
-				LEFT JOIN user_settings usfs_l ON (usfs_l.user_id = u.user_id AND usfs_l.setting_name = ? AND usfs_l.locale = ?)
-
-			WHERE	uug.user_group_id = ? AND
-				s.user_group_id IS NULL'
-                . ($name !== null ? ' AND (usgs_pl.setting_value LIKE ? OR usgs_l.setting_value LIKE ? OR usfs_pl.setting_value LIKE ? OR usfs_l.setting_value LIKE ? OR u.username LIKE ? OR u.email LIKE ?)' : '')
-            . ' ORDER BY COALESCE(usfs_l.setting_value, usfs_pl.setting_value)',
-            $params,
-            $rangeInfo
-        );
-        return new DAOResultFactory($result, $this, '_returnUserFromRowWithData', [], $sql, $params, $rangeInfo);
-    }
-}
-
-if (!PKP_STRICT_MODE) {
-    class_alias('\PKP\user\UserStageAssignmentDAO', '\UserStageAssignmentDAO');
-}
diff --git a/classes/user/form/UserFormHelper.php b/classes/user/form/UserFormHelper.php
index 8791981f8a7..bcca06406ca 100644
--- a/classes/user/form/UserFormHelper.php
+++ b/classes/user/form/UserFormHelper.php
@@ -115,7 +115,7 @@ public function saveRoleContent($form, $user)
                     if (!$inGroup && array_key_exists($groupId, $groupFormData)) {
                         Repo::userGroup()->assignUserToGroup($user->getId(), $groupId);
                     } elseif ($inGroup && !array_key_exists($groupId, $groupFormData)) {
-                        Repo::userGroup()->removeUserFromGroup($user->getId(), $groupId, $context->getId());
+                        Repo::userGroup()->endAssignments($context->getId(), $user->getId(), $groupId);
                     }
                 }
             }
diff --git a/classes/userGroup/Collector.php b/classes/userGroup/Collector.php
index e01f770d965..095771d84d3 100644
--- a/classes/userGroup/Collector.php
+++ b/classes/userGroup/Collector.php
@@ -17,8 +17,10 @@
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\LazyCollection;
+use PKP\core\Core;
 use PKP\core\interfaces\CollectorInterface;
 use PKP\plugins\Hook;
+use PKP\userGroup\relationships\enums\UserUserGroupStatus;
 
 /**
  * @template T of UserGroup
@@ -59,6 +61,9 @@ class Collector implements CollectorInterface
 
     public ?int $offset = null;
 
+    public UserUserGroupStatus $userUserGroupStatus = UserUserGroupStatus::STATUS_ACTIVE;
+
+
     public function __construct(DAO $dao)
     {
         $this->dao = $dao;
@@ -186,6 +191,15 @@ public function filterByUserIds(?array $userIds): self
         return $this;
     }
 
+    /**
+     * Filter by user's role status
+     */
+    public function filterByUserUserGroupStatus(UserUserGroupStatus $userUserGroupStatus): self
+    {
+        $this->userUserGroupStatus = $userUserGroupStatus;
+        return $this;
+    }
+
     /**
      * Include orderBy columns to the collector query
      */
@@ -231,6 +245,22 @@ public function getQueryBuilder(): Builder
         if (isset($this->userIds)) {
             $q->join('user_user_groups as uug', 'ug.user_group_id', '=', 'uug.user_group_id');
             $q->whereIn('uug.user_id', $this->userIds);
+            $currentDateTime = Core::getCurrentDate();
+            if ($this->userUserGroupStatus === UserUserGroupStatus::STATUS_ENDED) {
+                $q->whereNotNull('uug.date_end')
+                    ->where('uug.date_end', '<=', $currentDateTime);
+            } elseif ($this->userUserGroupStatus === UserUserGroupStatus::STATUS_ACTIVE) {
+                $q->where(
+                    fn (Builder $q) =>
+                    $q->where('uug.date_start', '<=', $currentDateTime)
+                        ->orWhereNull('uug.date_start')
+                )
+                    ->where(
+                        fn (Builder $q) =>
+                        $q->where('uug.date_end', '>', $currentDateTime)
+                            ->orWhereNull('uug.date_end')
+                    );
+            }
         }
 
         if (isset($this->publicationIds)) {
diff --git a/classes/userGroup/DAO.php b/classes/userGroup/DAO.php
index ec8854073b7..1814464e9a7 100644
--- a/classes/userGroup/DAO.php
+++ b/classes/userGroup/DAO.php
@@ -20,6 +20,7 @@
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\LazyCollection;
+use PKP\core\Core;
 use PKP\core\EntityDAO;
 use PKP\core\traits\EntityWithParent;
 use PKP\services\PKPSchemaService;
@@ -152,11 +153,22 @@ public function delete(UserGroup $userGroup)
      */
     public function getUserCountByContextId(?int $contextId = null): Collection
     {
+        $currentDateTime = Core::getCurrentDate();
         return DB::table('user_groups', 'ug')
             ->join('user_user_groups AS uug', 'uug.user_group_id', '=', 'ug.user_group_id')
             ->join('users AS u', 'u.user_id', '=', 'uug.user_id')
             ->when($contextId !== null, fn (Builder $query) => $query->where('ug.context_id', '=', $contextId))
             ->where('u.disabled', '=', 0)
+            ->where(
+                fn (Builder $q) =>
+                $q->where('uug.date_start', '<=', $currentDateTime)
+                    ->orWhereNull('uug.date_start')
+            )
+            ->where(
+                fn (Builder $q) =>
+                $q->where('uug.date_end', '>', $currentDateTime)
+                    ->orWhereNull('uug.date_end')
+            )
             ->groupBy('ug.user_group_id')
             ->select('ug.user_group_id')
             ->selectRaw('COUNT(0) AS count')
diff --git a/classes/userGroup/Repository.php b/classes/userGroup/Repository.php
index e1802b00d4e..d57299247a5 100644
--- a/classes/userGroup/Repository.php
+++ b/classes/userGroup/Repository.php
@@ -18,11 +18,13 @@
 use APP\facades\Repo;
 use Illuminate\Support\Collection;
 use Illuminate\Support\LazyCollection;
+use PKP\core\Core;
 use PKP\db\DAORegistry;
 use PKP\plugins\Hook;
 use PKP\security\Role;
 use PKP\services\PKPSchemaService;
 use PKP\site\SiteDAO;
+use PKP\userGroup\relationships\enums\UserUserGroupStatus;
 use PKP\userGroup\relationships\UserGroupStage;
 use PKP\userGroup\relationships\UserUserGroup;
 use PKP\validation\ValidatorFactory;
@@ -220,15 +222,16 @@ public function getByRoleIds(array $roleIds, int $contextId, ?bool $default = nu
     }
 
     /**
-    * Return all user groups ids for a user id
+    * Return all, active or ended user groups ids for a user id
     *
     * @return LazyCollection<int,UserGroup>
     */
-    public function userUserGroups(int $userId, ?int $contextId = null): LazyCollection
+    public function userUserGroups(int $userId, ?int $contextId = null, ?UserUserGroupStatus $userUserGroupStatus = UserUserGroupStatus::STATUS_ACTIVE): LazyCollection
     {
         $collector = Repo::userGroup()
             ->getCollector()
-            ->filterByUserIds([$userId]);
+            ->filterByUserIds([$userId])
+            ->filterByUserUserGroupStatus($userUserGroupStatus);
 
         if ($contextId) {
             $collector->filterByContextIds([$contextId]);
@@ -244,6 +247,7 @@ public function userInGroup(int $userId, int $userGroupId): bool
     {
         return UserUserGroup::withUserId($userId)
             ->withUserGroupId($userGroupId)
+            ->withActive()
             ->get()
             ->isNotEmpty();
     }
@@ -262,20 +266,14 @@ public function contextHasGroup(int $contextId, int $userGroupId): bool
 
     public function assignUserToGroup(int $userId, int $userGroupId): UserUserGroup
     {
+        $dateStart = Core::getCurrentDate();
         return UserUserGroup::create([
             'userId' => $userId,
-            'userGroupId' => $userGroupId
+            'userGroupId' => $userGroupId,
+            'dateStart' => $dateStart
         ]);
     }
 
-    public function removeUserFromGroup($userId, $userGroupId, $contextId): bool
-    {
-        return UserUserGroup::withUserId($userId)
-            ->withUserGroupId($userGroupId)
-            ->withContextId($contextId)
-            ->delete();
-    }
-
     public function deleteAssignmentsByUserId(int $userId, ?int $userGroupId = null): bool
     {
         $query = UserUserGroup::withUserId($userId);
@@ -287,15 +285,16 @@ public function deleteAssignmentsByUserId(int $userId, ?int $userGroupId = null)
         return $query->delete();
     }
 
-    public function deleteAssignmentsByContextId(int $contextId, ?int $userId = null): bool
+    public function endAssignments(int $contextId, int $userId, ?int $userGroupId = null): void
     {
-        $userUserGroups = UserUserGroup::withContextId($contextId);
-
-        if ($userId) {
-            $userUserGroups->withUserId($userId);
+        $dateEnd = Core::getCurrentDate();
+        $query = UserUserGroup::withContextId($contextId)
+            ->withUserId($userId)
+            ->withActive();
+        if ($userGroupId) {
+            $query->withUserGroupId($userGroupId);
         }
-
-        return $userUserGroups->delete();
+        $query->update(['date_end' => $dateEnd]);
     }
 
     /**
diff --git a/classes/userGroup/relationships/UserUserGroup.php b/classes/userGroup/relationships/UserUserGroup.php
index 9e05a74c911..5e8660b9330 100644
--- a/classes/userGroup/relationships/UserUserGroup.php
+++ b/classes/userGroup/relationships/UserUserGroup.php
@@ -17,13 +17,14 @@
 use APP\facades\Repo;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Casts\Attribute;
+use PKP\core\Core;
 
 class UserUserGroup extends \Illuminate\Database\Eloquent\Model
 {
     public $timestamps = false;
     public $incrementing = false;
     protected $primaryKey = null;
-    protected $fillable = ['userGroupId', 'userId'];
+    protected $fillable = ['userGroupId', 'userId', 'dateStart', 'dateEnd'];
 
     public function user(): Attribute
     {
@@ -57,6 +58,22 @@ public function userGroupId(): Attribute
         );
     }
 
+    public function dateStart(): Attribute
+    {
+        return Attribute::make(
+            get: fn ($userGroup, $attributes) => $attributes['date_start'],
+            set: fn ($value) => ['date_start' => $value]
+        );
+    }
+
+    public function dateEnd(): Attribute
+    {
+        return Attribute::make(
+            get: fn ($userGroup, $attributes) => $attributes['date_end'],
+            set: fn ($value) => ['date_end' => $value]
+        );
+    }
+
     public function scopeWithUserId(Builder $query, int $userId): Builder
     {
         return $query->where('user_user_groups.user_id', $userId);
@@ -67,6 +84,28 @@ public function scopeWithUserGroupId(Builder $query, int $userGroupId): Builder
         return $query->where('user_user_groups.user_group_id', $userGroupId);
     }
 
+    public function scopeWithActive(Builder $query): Builder
+    {
+        $currentDateTime = Core::getCurrentDate();
+        return $query->where(
+            fn (Builder $query) =>
+            $query->where('user_user_groups.date_start', '<=', $currentDateTime)
+                ->orWhereNull('user_user_groups.date_start')
+        )
+            ->where(
+                fn (Builder $query) =>
+                $query->where('user_user_groups.date_end', '>', $currentDateTime)
+                    ->orWhereNull('user_user_groups.date_end')
+            );
+    }
+
+    public function scopeWithEnded(Builder $query): Builder
+    {
+        $currentDateTime = Core::getCurrentDate();
+        return $query->whereNotNull('user_user_groups.date_end')
+            ->where('user_user_groups.date_end', '<=', $currentDateTime);
+    }
+
     public function scopeWithContextId(Builder $query, int $contextId): Builder
     {
         return $query
diff --git a/classes/userGroup/relationships/enums/UserUserGroupStatus.php b/classes/userGroup/relationships/enums/UserUserGroupStatus.php
new file mode 100644
index 00000000000..39631dac5bd
--- /dev/null
+++ b/classes/userGroup/relationships/enums/UserUserGroupStatus.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file classes/userGroup/relationships/enums/UserUserGroupStatus.php
+ *
+ * Copyright (c) 2023 Simon Fraser University
+ * Copyright (c) 2023 John Willinsky
+ * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
+ *
+ * @class UserUserGroupStatus
+ *
+ * @brief Enumeration for user user group statuses
+ */
+
+namespace PKP\userGroup\relationships\enums;
+
+enum UserUserGroupStatus: string
+{
+    case STATUS_ACTIVE = 'active';
+    case STATUS_ENDED = 'ended';
+    case STATUS_ALL = 'all';
+}
diff --git a/classes/xslt/XMLTypeDescription.php b/classes/xslt/XMLTypeDescription.php
index 605ca9142f6..3640ea67ea1 100644
--- a/classes/xslt/XMLTypeDescription.php
+++ b/classes/xslt/XMLTypeDescription.php
@@ -120,7 +120,7 @@ public function checkType($object)
 
         // Validation - requires DOMDocument
         if (is_string($object)) {
-            $xmlDom = new DOMDocument();
+            $xmlDom = new DOMDocument('1.0', 'utf-8');
             $xmlDom->loadXML($object);
         } else {
             $xmlDom = & $object;
diff --git a/controllers/grid/settings/library/form/EditLibraryFileForm.php b/controllers/grid/settings/library/form/EditLibraryFileForm.php
index 0866f03c08f..982630d178b 100644
--- a/controllers/grid/settings/library/form/EditLibraryFileForm.php
+++ b/controllers/grid/settings/library/form/EditLibraryFileForm.php
@@ -16,10 +16,13 @@
 
 namespace PKP\controllers\grid\settings\library\form;
 
+use APP\core\Application;
+use APP\file\LibraryFileManager;
 use PKP\context\LibraryFile;
 use PKP\context\LibraryFileDAO;
 use PKP\controllers\grid\files\form\LibraryFileForm;
 use PKP\db\DAORegistry;
+use PKP\file\TemporaryFileManager;
 
 class EditLibraryFileForm extends LibraryFileForm
 {
@@ -46,6 +49,15 @@ public function __construct($contextId, $fileId)
         }
     }
 
+    /**
+     * Assign form data to user-submitted data.
+     * @see Form::readInputData()
+     */
+    function readInputData() {
+        $this->readUserVars(array('temporaryFileId'));
+        return parent::readInputData();
+    }
+
     /**
      * Initialize form data from current settings.
      */
@@ -55,6 +67,7 @@ public function initData()
             'libraryFileName' => $this->libraryFile->getName(null), // Localized
             'libraryFile' => $this->libraryFile, // For read-only info
             'publicAccess' => $this->libraryFile->getPublicAccess() ? true : false,
+            'temporaryFileId' => null,
         ];
     }
 
@@ -63,6 +76,24 @@ public function initData()
      */
     public function execute(...$functionArgs)
     {
+        $userId = Application::get()->getRequest()->getUser()->getId();
+
+        // Fetch the temporary file storing the uploaded library file
+        $temporaryFileDao = DAORegistry::getDAO('TemporaryFileDAO'); /* @var $temporaryFileDao TemporaryFileDAO */
+        $temporaryFile = $temporaryFileDao->getTemporaryFile(
+            $this->getData('temporaryFileId'),
+            $userId
+        );
+        if ($temporaryFile) {
+            $libraryFileDao = DAORegistry::getDAO('LibraryFileDAO'); /* @var $libraryFileDao LibraryFileDAO */
+            $libraryFileManager = new LibraryFileManager($this->contextId);
+
+            // Convert the temporary file to a library file and store
+            $this->libraryFile = $libraryFileManager->replaceFromTemporaryFile($temporaryFile, $this->getData('fileType'), $this->libraryFile);
+            // Clean up the temporary file
+            $temporaryFileManager = new TemporaryFileManager();
+            $temporaryFileManager->deleteById($this->getData('temporaryFileId'), $userId);
+        }
         $this->libraryFile->setName($this->getData('libraryFileName'), null); // Localized
         $this->libraryFile->setType($this->getData('fileType'));
         $this->libraryFile->setPublicAccess($this->getData('publicAccess'));
diff --git a/controllers/grid/settings/user/UserGridHandler.php b/controllers/grid/settings/user/UserGridHandler.php
index ca1519c2429..fee15e91c02 100644
--- a/controllers/grid/settings/user/UserGridHandler.php
+++ b/controllers/grid/settings/user/UserGridHandler.php
@@ -551,16 +551,16 @@ public function removeUser($args, $request)
             return new JSONMessage(false, __('grid.user.cannotAdminister'));
         }
 
-        // Remove user from all user group assignments for this context.
-        // Check if this user has any user group assignments for this context.
-        $userGroupCount = Repo::userGroup()
+        // End all active user group assignments for this context.
+        // Check if this user has any active user group assignments for this context.
+        $activeUserGroupCount = Repo::userGroup()
             ->userUserGroups($userId, $context->getId())
             ->count();
 
-        if (!$userGroupCount) {
+        if (!$activeUserGroupCount) {
             return new JSONMessage(false, __('grid.user.userNoRoles'));
         } else {
-            Repo::userGroup()->deleteAssignmentsByContextId($context->getId(), $userId);
+            Repo::userGroup()->endAssignments($context->getId(), $userId);
 
             return \PKP\db\DAO::getDataChangedEvent($userId);
         }
diff --git a/controllers/grid/settings/user/form/UserForm.php b/controllers/grid/settings/user/form/UserForm.php
index 9f0b9429cfa..02cd06e540a 100644
--- a/controllers/grid/settings/user/form/UserForm.php
+++ b/controllers/grid/settings/user/form/UserForm.php
@@ -16,7 +16,6 @@
 
 namespace PKP\controllers\grid\settings\user\form;
 
-use APP\core\Application;
 use APP\core\Request;
 use APP\facades\Repo;
 use APP\template\TemplateManager;
@@ -120,17 +119,26 @@ public function saveUserGroupAssignments(Request $request): void
             return;
         }
 
-        Repo::userGroup()
-            ->deleteAssignmentsByContextId(
-                Application::get()->getRequest()->getContext()->getId(),
-                $this->userId
-            );
-
-
         if ($this->getData('userGroupIds')) {
             $contextId = $request->getContext()->getId();
 
-            collect($this->getData('userGroupIds'))
+            $oldUserGroupIds = [];
+            $oldUserGroups = Repo::userGroup()->userUserGroups($this->userId);
+            foreach ($oldUserGroups as $oldUserGroup) {
+                $oldUserGroupIds[] = $oldUserGroup->getId();
+            }
+
+            $userGroupsToEnd = array_diff($oldUserGroupIds, $this->getData('userGroupIds'));
+            collect($userGroupsToEnd)
+                ->each(
+                    fn ($userGroupId) =>
+                    Repo::userGroup()->contextHasGroup($contextId, $userGroupId)
+                        ? Repo::userGroup()->endAssignments($contextId, $this->userId, $userGroupId)
+                        : null
+                );
+
+            $userGroupsToAdd = array_diff($this->getData('userGroupIds'), $oldUserGroupIds);
+            collect($userGroupsToAdd)
                 ->each(
                     fn ($userGroupId) =>
                     Repo::userGroup()->contextHasGroup($contextId, $userGroupId)
diff --git a/controllers/grid/users/author/form/PKPAuthorForm.php b/controllers/grid/users/author/form/PKPAuthorForm.php
index aae3472fa55..e13282b6e9d 100644
--- a/controllers/grid/users/author/form/PKPAuthorForm.php
+++ b/controllers/grid/users/author/form/PKPAuthorForm.php
@@ -76,7 +76,6 @@ public function __construct($publication, $author)
     /**
      * Get the author
      *
-     * @return Author
      */
     public function getAuthor(): ?Author
     {
@@ -135,6 +134,7 @@ public function initData()
                 'email' => $author->getEmail(),
                 'userUrl' => $author->getUrl(),
                 'orcid' => $author->getOrcid(),
+                'competingInterests' => $author->getCompetingInterests(null),
                 'userGroupId' => $author->getUserGroupId(),
                 'biography' => $author->getBiography(null),
                 'primaryContact' => $this->getPublication()->getData('primaryContactId') === $author->getId(),
@@ -155,7 +155,8 @@ public function initData()
      */
     public function fetch($request, $template = null, $display = false)
     {
-        $authorUserGroups = Repo::userGroup()->getByRoleIds([Role::ROLE_ID_AUTHOR], $request->getContext()->getId());
+        $context = $request->getContext();
+        $authorUserGroups = Repo::userGroup()->getByRoleIds([Role::ROLE_ID_AUTHOR], $context->getId());
         $publication = $this->getPublication();
         $countries = [];
         foreach (Locale::getCountries() as $country) {
@@ -168,6 +169,7 @@ public function fetch($request, $template = null, $display = false)
             'publicationId' => $publication->getId(),
             'countries' => $countries,
             'authorUserGroups' => $authorUserGroups,
+            'requireAuthorCompetingInterests' => $context->getData('requireAuthorCompetingInterests'),
         ]);
 
         return parent::fetch($request, $template, $display);
@@ -190,6 +192,7 @@ public function readInputData()
             'email',
             'userUrl',
             'orcid',
+            'competingInterests',
             'userGroupId',
             'biography',
             'primaryContact',
@@ -205,6 +208,8 @@ public function readInputData()
     public function execute(...$functionParams)
     {
         $publication = $this->getPublication(); /** @var Publication $publication */
+        $submission = Repo::submission()->get($publication->getData('submissionId'));
+        $context = Services::get('context')->get($submission->getData('contextId'));
 
         $author = $this->getAuthor();
         if (!$author) {
@@ -229,6 +234,9 @@ public function execute(...$functionParams)
         $author->setEmail($this->getData('email'));
         $author->setUrl($this->getData('userUrl'));
         $author->setOrcid($this->getData('orcid'));
+        if ($context->getData('requireAuthorCompetingInterests')) {
+            $author->setCompetingInterests($this->getData('competingInterests'), null);
+        }
         $author->setUserGroupId($this->getData('userGroupId'));
         $author->setBiography($this->getData('biography'), null); // localized
         $author->setIncludeInBrowse(($this->getData('includeInBrowse') ? true : false));
@@ -244,8 +252,6 @@ public function execute(...$functionParams)
         }
 
         if ($this->getData('primaryContact')) {
-            $submission = Repo::submission()->get($publication->getData('submissionId'));
-            $context = Services::get('context')->get($submission->getData('contextId'));
             $params = ['primaryContactId' => $authorId];
             $errors = Repo::publication()->validate(
                 $publication,
diff --git a/controllers/grid/users/stageParticipant/StageParticipantGridCellProvider.php b/controllers/grid/users/stageParticipant/StageParticipantGridCellProvider.php
index e05d74e6bb6..e55b7560097 100644
--- a/controllers/grid/users/stageParticipant/StageParticipantGridCellProvider.php
+++ b/controllers/grid/users/stageParticipant/StageParticipantGridCellProvider.php
@@ -40,8 +40,9 @@ public function getTemplateVarsFromRowColumn($row, $column)
             case 'participants':
                 $stageAssignment = $row->getData();
                 $user = Repo::user()->get($stageAssignment->getUserId(), true);
+                $active = Repo::userGroup()->userInGroup($user->getId(), $stageAssignment->getUserGroupId());
                 assert($user);
-                return ['label' => $user ? $user->getFullName() : ''];
+                return ['label' => $user ? $user->getFullName() . (!$active ? ' (' . __('user.role.ended') . ')' : '') : ''];
             default:
                 assert(false);
         }
diff --git a/js/load.js b/js/load.js
index 85113b16e00..c325d331412 100644
--- a/js/load.js
+++ b/js/load.js
@@ -92,6 +92,8 @@ import FieldText from '@/components/Form/fields/FieldText.vue';
 import FieldTextarea from '@/components/Form/fields/FieldTextarea.vue';
 import FieldUpload from '@/components/Form/fields/FieldUpload.vue';
 import FieldUploadImage from '@/components/Form/fields/FieldUploadImage.vue';
+import VueHighlightJS from 'vue3-highlightjs';
+import 'highlight.js/styles/default.css';
 
 // Panel components from UI Library
 import ListPanel from '@/components/ListPanel/ListPanel.vue';
@@ -233,6 +235,8 @@ function pkpCreateVueApp(createAppArgs) {
 		vueApp.component(componentName, allGlobalComponents[componentName]);
 	});
 
+	vueApp.use(VueHighlightJS);
+
 	return vueApp;
 }
 
diff --git a/locale/ar/manager.po b/locale/ar/manager.po
index de9bfadfe94..f5e4cd5a7c4 100644
--- a/locale/ar/manager.po
+++ b/locale/ar/manager.po
@@ -3539,3 +3539,7 @@ msgstr ""
 
 msgid "emailTemplate.variable.activateUrl"
 msgstr "رابط التحقق من حساب البريد الالكتروني"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"يتطلب تقديم المؤلفين لبيان المصالح المتضاربة (CI) مع طلبات النشر الخاصة بهم."
diff --git a/locale/az/manager.po b/locale/az/manager.po
index c9bf3b25cde..03d31100dea 100644
--- a/locale/az/manager.po
+++ b/locale/az/manager.po
@@ -3906,3 +3906,8 @@ msgid "manager.plugins.pleaseUpgrade"
 msgstr ""
 "Plugin artıq mövcuddur, lakin quraşdırılmış versiyadan daha yenidir.  Zəhmət "
 "olmasa bunun əvəzinə yeniləyin"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Müəlliflərin məqalə ilə birlikdə mənfəət münaqişəsi bildirişi faylı "
+"göndərmələri gərəklidir."
diff --git a/locale/be@cyrillic/manager.po b/locale/be@cyrillic/manager.po
index 0b4926ad85a..4b69a78f6b0 100644
--- a/locale/be@cyrillic/manager.po
+++ b/locale/be@cyrillic/manager.po
@@ -3053,3 +3053,8 @@ msgstr ""
 
 msgid "mailable.submissionNeedsEditor.name"
 msgstr ""
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Патрабаваць ад аўтараў падаваць Дэкларацыю аб канфлікце інтарэсаў разам з "
+"адпраўляемым матэрыялам."
diff --git a/locale/bg/common.po b/locale/bg/common.po
index e1e5f94ef17..c8768a8e3a0 100644
--- a/locale/bg/common.po
+++ b/locale/bg/common.po
@@ -1,7 +1,7 @@
 # Cyril Kamburov <cc@intermedia.bg>, 2021, 2022, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-10-18 10:06+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Cyril Kamburov <cc@intermedia.bg>\n"
 "Language-Team: Bulgarian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "common/bg/>\n"
@@ -10,7 +10,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "common.publicKnowledgeProject"
 msgstr "Проект Публично Познание (Public Knowledge Project)"
@@ -1685,7 +1685,7 @@ msgid "search.cli.rebuildIndex.error"
 msgstr "грешка"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} статии са индексирани"
+msgstr "{$numIndexed} статии са насрочени за индексиране"
 
 msgid "search.coverage"
 msgstr "Обхват"
@@ -2278,3 +2278,9 @@ msgstr "Маркиране"
 
 msgid "common.highlights"
 msgstr "Маркирани"
+
+msgid "showAll"
+msgstr "Показване на всичко"
+
+msgid "showLess"
+msgstr "Показване по-малко"
diff --git a/locale/bg/editor.po b/locale/bg/editor.po
index 9942d28afdb..c464eddf407 100644
--- a/locale/bg/editor.po
+++ b/locale/bg/editor.po
@@ -1,7 +1,7 @@
 # Cyril Kamburov <cc@intermedia.bg>, 2022, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-03-06 23:07+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Cyril Kamburov <cc@intermedia.bg>\n"
 "Language-Team: Bulgarian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "editor/bg/>\n"
@@ -10,7 +10,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "editor.submissionArchive.confirmDelete"
 msgstr ""
@@ -621,3 +621,6 @@ msgstr "Пропускане на този имейл"
 
 msgid "editor.decision.stepError"
 msgstr "Имаше проблем със стъпка {$stepName}."
+
+msgid "reviewer.list.reviewerSameInstitution"
+msgstr "Същата институция като автора"
diff --git a/locale/bg/manager.po b/locale/bg/manager.po
index 4bc8eca532e..91812c3dcca 100644
--- a/locale/bg/manager.po
+++ b/locale/bg/manager.po
@@ -2,7 +2,7 @@
 # Albena Vassileva <albena.ava@gmail.com>, 2022.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-10-18 10:06+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Cyril Kamburov <cc@intermedia.bg>\n"
 "Language-Team: Bulgarian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "manager/bg/>\n"
@@ -11,7 +11,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "manager.website.information"
 msgstr "Информация"
@@ -3804,3 +3804,16 @@ msgstr "Заглавие на бутона"
 msgid "manager.highlights.urlText.description"
 msgstr ""
 "Етикетът, като например \"Прочетете повече\", за бутона към маркирания обект."
+
+msgid "manager.announcements.notEnabled"
+msgstr ""
+"Трябва да <a href=\"#announcements/announcement-settings\">активирате "
+"съобщенията</a>."
+
+msgid "manager.image"
+msgstr "Изображение"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Изисквайте подаването на авторите да подадат декларация за конкурентни "
+"интереси (CI) с тяхното подаване на материали."
diff --git a/locale/bg/submission.po b/locale/bg/submission.po
index 083e0966da2..4ab7defad57 100644
--- a/locale/bg/submission.po
+++ b/locale/bg/submission.po
@@ -1,7 +1,7 @@
 # Cyril Kamburov <cc@intermedia.bg>, 2022, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-04-04 20:27+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Cyril Kamburov <cc@intermedia.bg>\n"
 "Language-Team: Bulgarian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "submission/bg/>\n"
@@ -10,7 +10,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "author.editPublishedDisabled"
 msgstr ""
@@ -2739,3 +2739,9 @@ msgstr "Файл с материали за статия"
 
 msgid "editor.submission.roundStatus.returnedToReview"
 msgstr "Върнат обратно в кръг за рецензиране."
+
+msgid "submission.authors.label"
+msgstr "Автори"
+
+msgid "submission.author.list"
+msgstr "Списък на изпращащи автори"
diff --git a/locale/bs/manager.po b/locale/bs/manager.po
index 922f0eeccd5..0a05a2e8fbd 100644
--- a/locale/bs/manager.po
+++ b/locale/bs/manager.po
@@ -3161,3 +3161,8 @@ msgstr ""
 #~ msgstr ""
 #~ "Ovim obrascem e-pošte urednik rubrike podsjeća recenzenta da rok za "
 #~ "izradu recenzije istekao."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Zahtijevaj od autora da prilikom prijave svog rukopisa ispune izjavu o "
+"sukobu interesa."
diff --git a/locale/ca/manager.po b/locale/ca/manager.po
index 43a8915c9b3..a901ddfc726 100644
--- a/locale/ca/manager.po
+++ b/locale/ca/manager.po
@@ -3653,3 +3653,8 @@ msgstr ""
 #~ "Aquest missatge de correu electrònic té un editor de secció com a "
 #~ "remitent i s'envia a un revisor per a recordar-li que ha superat la data "
 #~ "de venciment per a lliurar la revisió."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Demana als autors/ores que presentin una declaració de conflictes "
+"d’interessos (CI) juntament amb la tramesa."
diff --git a/locale/ckb/manager.po b/locale/ckb/manager.po
index 14ae6243cfd..e5470e01219 100644
--- a/locale/ckb/manager.po
+++ b/locale/ckb/manager.po
@@ -3170,3 +3170,8 @@ msgstr ""
 #~ msgstr ""
 #~ "ئەم ئیمەیڵە لە لایەن سەرنوسەری بەشەوە بۆ هەڵسەنگێنەر دەنێردرێت وەک "
 #~ "بیرخەرەوەیەکی کاتی هەڵسەنگاندنەکە."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"داوا لە توێژەرە پێشکەشکراوەکان بکە بۆ ئەوەی (CI) لەگەڵ پێشکەشکردنەکانیان "
+"داخل بکەن."
diff --git a/locale/cs/admin.po b/locale/cs/admin.po
index d88e1781182..6dec17def6a 100644
--- a/locale/cs/admin.po
+++ b/locale/cs/admin.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:40+00:00\n"
-"PO-Revision-Date: 2023-09-30 06:06+0000\n"
+"PO-Revision-Date: 2023-12-03 14:39+0000\n"
 "Last-Translator: Jiří Dlouhý <jiri.dlouhy@czp.cuni.cz>\n"
 "Language-Team: Czech <http://translate.pkp.sfu.ca/projects/pkp-lib/admin/cs/>"
 "\n"
@@ -13,7 +13,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "admin.systemInfo.settingName"
 msgstr "Nastavení - název"
@@ -919,3 +919,14 @@ msgstr "Spustit deamon worker pro testovací frontu"
 
 msgid "admin.settings.statistics.sushiPlatform.isSiteSushiPlatform"
 msgstr "Použijte stránky jako platformu pro všechny časopisy."
+
+msgid "admin.settings.sharedReviewerStatistics.disable"
+msgstr "Zakázat souhrnné statistiky recenzentů"
+
+msgid "admin.settings.sharedReviewerStatistics"
+msgstr "Statistika recenzenta"
+
+msgid "admin.settings.sharedReviewerStatistics.description"
+msgstr ""
+"V instalaci s více kontexty lze statistiky recenzentů, například počet "
+"odeslaných recenzí, zobrazit buď jednotlivě pro každý kontext, nebo souhrnně."
diff --git a/locale/cs/common.po b/locale/cs/common.po
index 523c9809534..ea8fa839d66 100644
--- a/locale/cs/common.po
+++ b/locale/cs/common.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:40+00:00\n"
-"PO-Revision-Date: 2023-11-17 15:38+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Jiří Dlouhý <jiri.dlouhy@czp.cuni.cz>\n"
 "Language-Team: Czech <http://translate.pkp.sfu.ca/projects/pkp-lib/common/cs/"
 ">\n"
@@ -1684,7 +1684,7 @@ msgid "search.cli.rebuildIndex.error"
 msgstr "chyba"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} článků bylo indexováno"
+msgstr "{$numIndexed} článků plánovaných k indexaci"
 
 msgid "search.coverage"
 msgstr "Pokrytí"
diff --git a/locale/cs/manager.po b/locale/cs/manager.po
index 234153e3a6b..996dbb81ec0 100644
--- a/locale/cs/manager.po
+++ b/locale/cs/manager.po
@@ -5,7 +5,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:41+00:00\n"
-"PO-Revision-Date: 2023-10-12 23:26+0000\n"
+"PO-Revision-Date: 2023-11-27 16:38+0000\n"
 "Last-Translator: Jiří Dlouhý <jiri.dlouhy@czp.cuni.cz>\n"
 "Language-Team: Czech <http://translate.pkp.sfu.ca/projects/pkp-lib/manager/"
 "cs/>\n"
@@ -14,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "manager.website.information"
 msgstr "Informace"
@@ -3693,3 +3693,15 @@ msgstr "Štítek tlačítka"
 
 msgid "manager.highlights.urlText.description"
 msgstr "Označení tlačítka ve zvýraznění, například Číst více."
+
+msgid "manager.announcements.notEnabled"
+msgstr ""
+"Musíte <a href=\"#announcements/announcement-settings\">povolit oznámení</a>."
+
+msgid "manager.image"
+msgstr "Obrázek"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Požadovat od autorů, aby spolu s příspěvkem zaslali soubor s prohlášením o "
+"střetu zájmů."
diff --git a/locale/cs/submission.po b/locale/cs/submission.po
index 3ad15791428..5d931a1c8d6 100644
--- a/locale/cs/submission.po
+++ b/locale/cs/submission.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:41+00:00\n"
-"PO-Revision-Date: 2023-05-26 22:09+0000\n"
+"PO-Revision-Date: 2023-11-27 16:38+0000\n"
 "Last-Translator: Jiří Dlouhý <jiri.dlouhy@czp.cuni.cz>\n"
 "Language-Team: Czech <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "submission/cs/>\n"
@@ -13,7 +13,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "author.editPublishedDisabled"
 msgstr "Autory této publikace nelze upravovat, protože již byla publikována."
@@ -1152,7 +1152,7 @@ msgid "submission.submit.contributorRole"
 msgstr "Role přispěvatele"
 
 msgid "submission.submit.addAuthor"
-msgstr "Přidat autora"
+msgstr "Přidat přispěvatele"
 
 msgid "submission.submit.form.languagesRequired"
 msgstr "Vložte, prosím, jazyk."
@@ -2718,3 +2718,9 @@ msgstr "Soubor s příspěvkem"
 
 msgid "editor.submission.roundStatus.returnedToReview"
 msgstr "Vrátit se zpět k recenzi."
+
+msgid "submission.authors.label"
+msgstr "Autoři"
+
+msgid "submission.author.list"
+msgstr "Seznam autorů příspěvku"
diff --git a/locale/da/admin.po b/locale/da/admin.po
index d0f70987e7f..70c982f8b67 100644
--- a/locale/da/admin.po
+++ b/locale/da/admin.po
@@ -5,7 +5,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:41+00:00\n"
-"PO-Revision-Date: 2023-09-30 06:06+0000\n"
+"PO-Revision-Date: 2023-11-30 07:38+0000\n"
 "Last-Translator: Alexandra Fogtmann-Schulz <alfo@kb.dk>\n"
 "Language-Team: Danish <http://translate.pkp.sfu.ca/projects/pkp-lib/admin/da/"
 ">\n"
@@ -14,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "admin.systemInfo.settingName"
 msgstr "Navn på indstilling"
@@ -926,3 +926,9 @@ msgstr "Kør \"worker deamon\" i testkø"
 
 msgid "admin.settings.statistics.sushiPlatform.isSiteSushiPlatform"
 msgstr "Brug hjemmesiden som platform for alle tidsskrifter."
+
+msgid "admin.settings.sharedReviewerStatistics.disable"
+msgstr "Deaktiver samlet bedømmerstatistik"
+
+msgid "admin.settings.sharedReviewerStatistics"
+msgstr "Bedømmerstatistik"
diff --git a/locale/da/common.po b/locale/da/common.po
index 23655990c49..8bbfe1d1c88 100644
--- a/locale/da/common.po
+++ b/locale/da/common.po
@@ -6,7 +6,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:42+00:00\n"
-"PO-Revision-Date: 2023-11-17 15:38+0000\n"
+"PO-Revision-Date: 2023-11-20 15:17+0000\n"
 "Last-Translator: Alexandra Fogtmann-Schulz <alfo@kb.dk>\n"
 "Language-Team: Danish <http://translate.pkp.sfu.ca/projects/pkp-lib/common/"
 "da/>\n"
@@ -1684,7 +1684,7 @@ msgid "search.cli.rebuildIndex.error"
 msgstr "fejl"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} artikler indekseret"
+msgstr "{$numIndexed} artikler planlagt til indeksering"
 
 msgid "search.coverage"
 msgstr "Dækning"
diff --git a/locale/da/manager.po b/locale/da/manager.po
index f64eba67545..1e8562f624f 100644
--- a/locale/da/manager.po
+++ b/locale/da/manager.po
@@ -3744,3 +3744,8 @@ msgid "manager.announcements.notEnabled"
 msgstr ""
 "Du skal <a href=\"#announcements/announcement-settings\">aktivere "
 "meddelelser</a>."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Kræv, at forfattere, der fremsender et manuskript, skal indsende en "
+"erklæring om konkurrerende interesser sammen med deres manuskript."
diff --git a/locale/da/submission.po b/locale/da/submission.po
index 40e43293caa..5b5dc42e2db 100644
--- a/locale/da/submission.po
+++ b/locale/da/submission.po
@@ -6,7 +6,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:43+00:00\n"
-"PO-Revision-Date: 2023-11-10 23:16+0000\n"
+"PO-Revision-Date: 2023-11-22 15:18+0000\n"
 "Last-Translator: Alexandra Fogtmann-Schulz <alfo@kb.dk>\n"
 "Language-Team: Danish <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "submission/da/>\n"
@@ -2064,8 +2064,8 @@ msgstr ""
 
 msgid "log.review.reviewConfirmed"
 msgstr ""
-"Redaktør {$userName} har valideret en {$round}-bedømmelsen i forbindelse med "
-"indsendelse {$submissionId}."
+"Redaktør {$userName} har valideret runde {$round}-bedømmelsen i forbindelse "
+"med indsendelse {$submissionId}."
 
 msgid "log.review.reviewReady"
 msgstr ""
diff --git a/locale/de/manager.po b/locale/de/manager.po
index 1e6a4a05ef0..337690c6964 100644
--- a/locale/de/manager.po
+++ b/locale/de/manager.po
@@ -3781,3 +3781,8 @@ msgid "plugins.importexport.native.error.submissionFileRevisionMissing"
 msgstr ""
 "Die Überarbeitung {$revision} der Einreichungsdatei {$id} wurde "
 "übersprungen, da die Datei nicht unter dem Pfad \"{$path}\" gefunden wurde."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Verlangen Sie von Autor/innen, die einen Beitrag einreichen wollen, "
+"zusätzlich eine Erklärung zu möglicherweise bestehenden Interessenkonflikten."
diff --git a/locale/el/manager.po b/locale/el/manager.po
index 4d9bdcdbe76..e970199a11f 100644
--- a/locale/el/manager.po
+++ b/locale/el/manager.po
@@ -3492,3 +3492,8 @@ msgstr ""
 #~ msgstr ""
 #~ "Το παρόν μήνυμα αποστέλλεται από τον Επιμελητή Ενότητας στον Αξιολογητή, "
 #~ "ως υπενθύμιση ότι η αξιολόγηση εκκρεμεί."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Απαιτείται από τους Συγγραφείς να καταθέτουν Δήλωση Αντικρουόμενων "
+"Συμφερόντων μαζί με την υποβολή."
diff --git a/locale/en/manager.po b/locale/en/manager.po
index 587ef6ebcb1..3db82af2ee0 100644
--- a/locale/en/manager.po
+++ b/locale/en/manager.po
@@ -3519,3 +3519,6 @@ msgstr "Assign Editor"
 
 msgid "mailable.submissionNeedsEditor.name"
 msgstr "Submission Needs Editor"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr "Require submitting Authors to file a Competing Interest (CI) statement with their submission."
diff --git a/locale/en/submission.po b/locale/en/submission.po
index 7b3fca6a6ef..d2f61c6594d 100644
--- a/locale/en/submission.po
+++ b/locale/en/submission.po
@@ -2395,3 +2395,33 @@ msgstr "Pending"
 
 msgid "submission.dashboard.view.reviewAssignments.archived"
 msgstr "Completed / Declined"
+
+msgid "publication.jats"
+msgstr "JATS XML"
+
+msgid "publication.jats.confirmDeleteFileTitle"
+msgstr "Confirm deleting JATS XML"
+
+msgid "publication.jats.confirmDeleteFileMessage"
+msgstr "You are about to remove the existing JATS XML File from this publication. Are you sure?"
+
+msgid "publication.jats.confirmDeleteFileButton"
+msgstr "Delete JATS File"
+
+msgid "publication.jats.autoCreatedMessage"
+msgstr "This JATS file is generated automatically by the submission metadata"
+
+msgid "publication.jats.lastModified"
+msgstr "Last Modification at {$modificationDate} by {$username}"
+
+msgid "publication.jats.defaultContentCreationError"
+msgstr "An error occured when trying to create the default JATS content. Please make sure that the JatsTemplate plugin is installed."
+
+msgid "submission.files.content.error"
+msgstr "The content of the submission file '{$fileName}' could not be retrieved."
+
+msgid "author.competingInterests"
+msgstr "Competing Interests"
+
+msgid "author.competingInterests.description"
+msgstr "Please disclose any competing interests this author may have with the research subject."
diff --git a/locale/en/user.po b/locale/en/user.po
index 3e86305a91d..d0fff832699 100644
--- a/locale/en/user.po
+++ b/locale/en/user.po
@@ -425,6 +425,9 @@ msgstr "Layout Editor"
 msgid "user.role.layoutEditors"
 msgstr "Layout Editors"
 
+msgid "user.role.ended"
+msgstr "Role ended"
+
 msgid "user.roles"
 msgstr "Roles"
 
diff --git a/locale/es/manager.po b/locale/es/manager.po
index 6f825eccdb7..9c9d31bf560 100644
--- a/locale/es/manager.po
+++ b/locale/es/manager.po
@@ -3783,3 +3783,8 @@ msgstr ""
 
 msgid "emailTemplate.variable.activateUrl"
 msgstr "Enlace para validar una cuenta de correo electrónico"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Pedir a los autores/as que adjunten una declaración de conflicto de "
+"intereses a su envío."
diff --git a/locale/eu/default.po b/locale/eu/default.po
new file mode 100644
index 00000000000..600910c265c
--- /dev/null
+++ b/locale/eu/default.po
@@ -0,0 +1,34 @@
+# Informatikaria <informatikaria@ueu.eus>, 2023.
+msgid ""
+msgstr ""
+"PO-Revision-Date: 2023-12-12 14:15+0000\n"
+"Last-Translator: Informatikaria <informatikaria@ueu.eus>\n"
+"Language-Team: Basque <http://translate.pkp.sfu.ca/projects/pkp-lib/default/"
+"eu/>\n"
+"Language: eu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.18.2\n"
+
+msgid "default.groups.name.siteAdmin"
+msgstr "Guneko kudeatzailea"
+
+msgid "default.groups.plural.siteAdmin"
+msgstr "Guneko kudeatzaileak"
+
+msgid "default.groups.abbrev.productionEditor"
+msgstr "ProdE."
+
+msgid "default.groups.name.copyeditor"
+msgstr "Kopien editorea"
+
+msgid "default.groups.plural.copyeditor"
+msgstr "Kopien editoreak"
+
+msgid "default.groups.abbrev.copyeditor"
+msgstr "CE."
+
+msgid "default.groups.name.reader"
+msgstr "Irakurlea"
diff --git a/locale/eu/manager.po b/locale/eu/manager.po
index d47e42e73bc..67446aa5056 100644
--- a/locale/eu/manager.po
+++ b/locale/eu/manager.po
@@ -1,12 +1,13 @@
 # Aitor Renobales <aitor.renobales@ehu.eus>, 2022.
 # Josu Acosta <josuacostacalvo@gmail.com>, 2023.
+# Informatikaria <informatikaria@ueu.eus>, 2023.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:45+00:00\n"
-"PO-Revision-Date: 2023-09-13 06:06+0000\n"
-"Last-Translator: Josu Acosta <josuacostacalvo@gmail.com>\n"
+"PO-Revision-Date: 2023-12-12 14:59+0000\n"
+"Last-Translator: Informatikaria <informatikaria@ueu.eus>\n"
 "Language-Team: Basque <http://translate.pkp.sfu.ca/projects/pkp-lib/manager/"
 "eu/>\n"
 "Language: eu\n"
@@ -14,7 +15,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "manager.website.information"
 msgstr ""
@@ -534,7 +535,7 @@ msgid "manager.language.forms"
 msgstr ""
 
 msgid "manager.language.reloadLocalizedDefaultSettings"
-msgstr ""
+msgstr "Berreskuratu balio lehenetsiak"
 
 msgid "manager.languages.alternateLocaleInstructions"
 msgstr ""
@@ -3192,3 +3193,8 @@ msgstr ""
 #~ msgstr ""
 #~ "Mezu hau Ataleko editoreak Ebaluatzaileari bidaltzen dio, ebaluazioa "
 #~ "egiteko epea pasatu dela gogorarazteko."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Eskatu lana bidaltzen duten egileei Interes-gatazkari buruzko deklarazio bat "
+"erants dezatela bidalketan."
diff --git a/locale/eu/user.po b/locale/eu/user.po
index 63c6797e884..6bb34fa4683 100644
--- a/locale/eu/user.po
+++ b/locale/eu/user.po
@@ -1,11 +1,12 @@
 # Josu Acosta <josuacostacalvo@gmail.com>, 2023.
+# Informatikaria <informatikaria@ueu.eus>, 2023.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:45+00:00\n"
-"PO-Revision-Date: 2023-06-23 08:49+0000\n"
-"Last-Translator: Josu Acosta <josuacostacalvo@gmail.com>\n"
+"PO-Revision-Date: 2023-12-21 14:31+0000\n"
+"Last-Translator: Informatikaria <informatikaria@ueu.eus>\n"
 "Language-Team: Basque <http://translate.pkp.sfu.ca/projects/pkp-lib/user/eu/>"
 "\n"
 "Language: eu\n"
@@ -13,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "user.accountInformation"
 msgstr "Kontuaren informazioa"
@@ -53,6 +54,8 @@ msgstr "Une honetako eginkizunak ez du eragiketa hori egiteko baimenik."
 
 msgid "user.authorization.assignedStageRoleBasedAccessDenied"
 msgstr ""
+"Bidalketa honetarako esleituta duzun rolak ez du baimenik eragiketa hau "
+"egiteko."
 
 msgid "user.authorization.userGroupRequired"
 msgstr ""
@@ -71,13 +74,13 @@ msgid "user.authorization.workflowStageRequired"
 msgstr "Ez da lan-fluxuaren etaparik zehaztu."
 
 msgid "user.authorization.pluginRequired"
-msgstr ""
+msgstr "Ez da gehigarri bat zehaztu eta beharrezkoa da."
 
 msgid "user.authorization.invalidReviewAssignment"
-msgstr ""
+msgstr "Ez duzu baimenik berrikuspen esleipen hau atzitzeko."
 
 msgid "user.authorization.submissionQuery"
-msgstr ""
+msgstr "Ez daukazu baimenik eztabaida honetan sartzeko."
 
 msgid "user.biography"
 msgstr "Biografia"
@@ -98,10 +101,10 @@ msgid "user.editMyProfile"
 msgstr "Editatu nire profila"
 
 msgid "user.email"
-msgstr "Helb. el."
+msgstr "E-posta helbidea"
 
 msgid "user.givenName"
-msgstr ""
+msgstr "Ponte-izena"
 
 msgid "user.interests"
 msgstr "Ebaluatzeko interesak"
@@ -116,7 +119,7 @@ msgid "user.group"
 msgstr "Erabiltzaile taldea"
 
 msgid "user.familyName"
-msgstr ""
+msgstr "Lehenengo abizena"
 
 msgid "user.profile.form.profileImageInvalid"
 msgstr ""
@@ -452,7 +455,7 @@ msgid "user.profile.identity"
 msgstr ""
 
 msgid "user.profile.contact"
-msgstr ""
+msgstr "Kontaktua"
 
 msgid "user.profile.public"
 msgstr ""
diff --git a/locale/fa/manager.po b/locale/fa/manager.po
index aab71f12d2c..a21c88a5098 100644
--- a/locale/fa/manager.po
+++ b/locale/fa/manager.po
@@ -3385,3 +3385,8 @@ msgstr ""
 #, fuzzy
 #~ msgid "emails.reviewRemind.body"
 #~ msgstr "ایمیلی از طرف دبیر یا دبیر بخش به داور برای یادآوری انجام داوری"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"لازم است که نویسنده ارسال کننده مقاله بیانیه تعارض منافع در رابطه با مقاله "
+"خود را ارسال کند."
diff --git a/locale/fi/admin.po b/locale/fi/admin.po
index 81445a9aede..d976c59da15 100644
--- a/locale/fi/admin.po
+++ b/locale/fi/admin.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:47+00:00\n"
-"PO-Revision-Date: 2023-03-02 13:56+0000\n"
+"PO-Revision-Date: 2023-12-03 14:39+0000\n"
 "Last-Translator: Antti-Jussi Nygård <ajnyga@gmail.com>\n"
 "Language-Team: Finnish <http://translate.pkp.sfu.ca/projects/pkp-lib/admin/"
 "fi/>\n"
@@ -13,7 +13,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "admin.systemInfo.settingName"
 msgstr "Asetuksen nimi"
@@ -550,7 +550,7 @@ msgstr ""
 "Lähetä saatavilla olevat työt jonoon. Jos haluat lähettää työn tiettyyn "
 "jonoon, anna parametri --queue=QUEUE_NAME. Voit myös vain antaa parametrin --"
 "test suorittaaksesi testityön ja parametrin --once suorittaaksesi yhden työn "
-"kerrallaan"
+"kerrallaan."
 
 msgid "admin.cli.tool.jobs.available.options.run.completed.description"
 msgstr "Suoritettu loppuun {$jobCount}-työtä jonosta {$queueName}."
@@ -901,3 +901,18 @@ msgstr "Töiden välissä odotettavien sekuntien määrä [oletus : '{$default}'
 
 msgid "admin.cli.tool.jobs.work.option.test.description"
 msgstr "Aja testijonon työt"
+
+msgid "admin.settings.sharedReviewerStatistics"
+msgstr "Arvioijatilastot"
+
+msgid "admin.settings.sharedReviewerStatistics.disable"
+msgstr "Poista arvioijatilastot käytöstä"
+
+msgid "admin.settings.statistics.sushiPlatform.isSiteSushiPlatform"
+msgstr "Käytä sivustoa alustana kaikille julkaisuille."
+
+msgid "admin.settings.sharedReviewerStatistics.description"
+msgstr ""
+"Usean kontekstin asennuksessa arvioijatilastot, kuten lähetettyjen "
+"arviointien määrä, voidaan näyttää joko erikseen kunkin kontekstin osalta "
+"tai kootusti koko sivuston laajuudelta."
diff --git a/locale/fi/api.po b/locale/fi/api.po
index 05f3c7b9b12..094a6c5dfa7 100644
--- a/locale/fi/api.po
+++ b/locale/fi/api.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:47+00:00\n"
-"PO-Revision-Date: 2023-05-23 06:10+0000\n"
+"PO-Revision-Date: 2023-12-03 14:39+0000\n"
 "Last-Translator: Antti-Jussi Nygård <ajnyga@gmail.com>\n"
 "Language-Team: Finnish <http://translate.pkp.sfu.ca/projects/pkp-lib/api/fi/>"
 "\n"
@@ -13,7 +13,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "api.400.paramNotSupported"
 msgstr "Parametria {$param} ei tueta."
@@ -360,3 +360,18 @@ msgstr "Yhtä tai useampaa tiedostoa ei voitu ladata."
 
 msgid "api.temporaryFiles.400.noUpload"
 msgstr "Pyynnöstä ei löytynyt ladattavaa tiedostoa."
+
+msgid "api.highlights.400.orderHighlightNotFound"
+msgstr ""
+"Nostojen järjestystä ei voitu tallentaa, koska yhtä tai useampaa nostoa ei "
+"löytynyt."
+
+msgid "api.400.errorUploadingImage"
+msgstr "Kuvan lataamisessa tapahtui virhe."
+
+msgid "api.highlights.400.noOrderData"
+msgstr ""
+"Nostojen järjestystä ei voitu tallentaa, koska järjestystietoja ei löytynyt."
+
+msgid "api.highlights.404.highlightNotFound"
+msgstr "Pyytämääsi nostoa ei löytynyt."
diff --git a/locale/fi/common.po b/locale/fi/common.po
index edd7cc60f44..267bd2e2aa2 100644
--- a/locale/fi/common.po
+++ b/locale/fi/common.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:47+00:00\n"
-"PO-Revision-Date: 2023-02-27 15:42+0000\n"
+"PO-Revision-Date: 2023-12-21 17:52+0000\n"
 "Last-Translator: Antti-Jussi Nygård <ajnyga@gmail.com>\n"
 "Language-Team: Finnish <http://translate.pkp.sfu.ca/projects/pkp-lib/common/"
 "fi/>\n"
@@ -13,7 +13,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "common.publicKnowledgeProject"
 msgstr "Public Knowledge Project"
@@ -103,7 +103,7 @@ msgid "common.grid"
 msgstr "Kehikko"
 
 msgid "common.confirmDelete"
-msgstr "Haluatko varmasti poistaa tämän kohteen? Tätä toimintoa ei voi kumota."
+msgstr "Haluatko varmasti poistaa tämän kohteen? Tätä toimintoa ei voi perua."
 
 msgid "common.abstract"
 msgstr "Abstrakti"
@@ -520,7 +520,7 @@ msgid "common.keywords"
 msgstr "Avainsanat"
 
 msgid "common.label"
-msgstr "Nimike"
+msgstr "Selite"
 
 msgid "common.language"
 msgstr "Kieli"
@@ -771,7 +771,9 @@ msgid "common.replaceFile"
 msgstr "Korvaa tiedosto"
 
 msgid "common.requiredField"
-msgstr "*Pakollinen kenttä"
+msgstr ""
+"Pakolliset kentät on merkitty tähdellä: <abbr class=\"required\" title="
+"\"required\">*</abbr>"
 
 msgid "common.required"
 msgstr "Vaaditaan"
@@ -1674,7 +1676,7 @@ msgid "search.cli.rebuildIndex.error"
 msgstr "virhe"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} artikkelia indeksoitu"
+msgstr "{$numIndexed} artikkelia ajoitettu indeksoitavaksi"
 
 msgid "search.coverage"
 msgstr "Kattavuus"
@@ -2278,3 +2280,15 @@ msgstr "Kirjoittajaa muokattu."
 
 #~ msgid "common.captchaField"
 #~ msgstr "Vahvistus"
+
+msgid "showLess"
+msgstr "Näytä vähemmän"
+
+msgid "common.highlight"
+msgstr "Nosto"
+
+msgid "showAll"
+msgstr "Näytä kaikki"
+
+msgid "common.highlights"
+msgstr "Nostot"
diff --git a/locale/fi/editor.po b/locale/fi/editor.po
index ccd7c66687f..bee3036b16c 100644
--- a/locale/fi/editor.po
+++ b/locale/fi/editor.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:47+00:00\n"
-"PO-Revision-Date: 2023-05-23 23:45+0000\n"
+"PO-Revision-Date: 2023-12-03 14:39+0000\n"
 "Last-Translator: Antti-Jussi Nygård <ajnyga@gmail.com>\n"
 "Language-Team: Finnish <http://translate.pkp.sfu.ca/projects/pkp-lib/editor/"
 "fi/>\n"
@@ -13,7 +13,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "editor.submissionArchive.confirmDelete"
 msgstr "Haluatko varmasti poistaa tämän käsikirjoituksen pysyvästi?"
@@ -609,3 +609,6 @@ msgstr "Ohita tämä sähköposti"
 
 msgid "editor.decision.stepError"
 msgstr "Askeleen {$stepName} kanssa oli ongelma."
+
+msgid "reviewer.list.reviewerSameInstitution"
+msgstr "Sama instituutio kuin kirjoittajalla"
diff --git a/locale/fi/installer.po b/locale/fi/installer.po
index 294d06abddc..3bd4bbd37fb 100644
--- a/locale/fi/installer.po
+++ b/locale/fi/installer.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:48+00:00\n"
-"PO-Revision-Date: 2023-02-27 15:42+0000\n"
+"PO-Revision-Date: 2023-12-03 14:39+0000\n"
 "Last-Translator: Antti-Jussi Nygård <ajnyga@gmail.com>\n"
 "Language-Team: Finnish <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "installer/fi/>\n"
@@ -13,7 +13,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "installer.additionalLocales"
 msgstr "Muut kielialueet"
@@ -248,3 +248,6 @@ msgstr ""
 #~ msgstr ""
 #~ "Koodaus, jota käytetään selaimiin lähettäviin ja niistä vastaanotettaviin "
 #~ "tietoihin."
+
+msgid "installer.miscSettings"
+msgstr "Muut asetukset"
diff --git a/locale/fi/manager.po b/locale/fi/manager.po
index 9c6652713cc..d2d4208e3cc 100644
--- a/locale/fi/manager.po
+++ b/locale/fi/manager.po
@@ -5,7 +5,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:48+00:00\n"
-"PO-Revision-Date: 2023-06-01 13:49+0000\n"
+"PO-Revision-Date: 2023-12-03 14:39+0000\n"
 "Last-Translator: Antti-Jussi Nygård <ajnyga@gmail.com>\n"
 "Language-Team: Finnish <http://translate.pkp.sfu.ca/projects/pkp-lib/manager/"
 "fi/>\n"
@@ -14,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "manager.website.information"
 msgstr "Tietoja"
@@ -3697,3 +3697,45 @@ msgstr ""
 #~ msgstr ""
 #~ "This email is sent by a Section Editor to remind a reviewer that their "
 #~ "review is due."
+
+msgid "manager.announcements.notEnabled"
+msgstr ""
+"<a href=\"#announcements/announcement-settings\">Ota ilmoitukset "
+"käyttöön</a>."
+
+msgid "manager.image"
+msgstr "Kuva"
+
+msgid "emailTemplate.variable.activateUrl"
+msgstr "Linkki sähköpostitilin vahvistukseen"
+
+msgid "manager.highlights.add"
+msgstr "Lisää nosto"
+
+msgid "manager.highlights.confirmDelete"
+msgstr "Haluatko varmasti poistaa {$title}? Tätä toimintoa ei voi perua."
+
+msgid "manager.highlights.delete"
+msgstr "Poista nosto"
+
+msgid "manager.highlights.edit"
+msgstr "Muokkaa nostoa"
+
+msgid "manager.highlights.image"
+msgstr "Kuva"
+
+msgid "manager.highlights.url.description"
+msgstr ""
+"Täydellinen URL-osoite nostoon tulevalle painikkeelle, mukaan lukien "
+"https://."
+
+msgid "manager.highlights.urlText"
+msgstr "Painikkeen selite"
+
+msgid "manager.highlights.urlText.description"
+msgstr "Painikkeeseen tuleva selite, esimerkiksi Lue lisää."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Vaadi käsikirjoituksen lähettäviä kirjoittajia jättämään Sidonnaisuudet-"
+"lausunto lähetyksen yhteydessä."
diff --git a/locale/fi/reader.po b/locale/fi/reader.po
index b8a993419e1..4faec802047 100644
--- a/locale/fi/reader.po
+++ b/locale/fi/reader.po
@@ -1,18 +1,19 @@
+# Antti-Jussi Nygård <ajnyga@gmail.com>, 2023.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:48+00:00\n"
-"PO-Revision-Date: 2020-08-25 06:33+0000\n"
-"Last-Translator: Hannu Toivonen <hannu.toivonen@helsinki.fi>\n"
+"PO-Revision-Date: 2023-12-03 14:39+0000\n"
+"Last-Translator: Antti-Jussi Nygård <ajnyga@gmail.com>\n"
 "Language-Team: Finnish <http://translate.pkp.sfu.ca/projects/pkp-lib/reader/"
 "fi/>\n"
-"Language: fi_FI\n"
+"Language: fi\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.9.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "comments.anonymous"
 msgstr "Anonyymi käyttäjä"
@@ -35,7 +36,7 @@ msgid "comments.delete"
 msgstr "Poista tämä kommentti"
 
 msgid "comments.email"
-msgstr "Lähettäjän sähköposti"
+msgstr "Kommentoijan sähköposti"
 
 msgid "comments.emailReply"
 msgstr "Lähetä sähköpostivastaus"
@@ -47,7 +48,7 @@ msgid "comments.inResponseTo"
 msgstr "Vastauksena viestiin <a href=\"{$url}\">{$title}</a>"
 
 msgid "comments.name"
-msgstr "Lähettäjän nimi"
+msgstr "Kommentoijan nimi"
 
 msgid "comments.noComments"
 msgstr "Yhtään lukijakommenttia ei ole lähetetty."
diff --git a/locale/fi/submission.po b/locale/fi/submission.po
index 18ae1af5db8..41df663830d 100644
--- a/locale/fi/submission.po
+++ b/locale/fi/submission.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:48+00:00\n"
-"PO-Revision-Date: 2023-05-29 19:34+0000\n"
+"PO-Revision-Date: 2023-12-03 14:39+0000\n"
 "Last-Translator: Antti-Jussi Nygård <ajnyga@gmail.com>\n"
 "Language-Team: Finnish <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "submission/fi/>\n"
@@ -13,7 +13,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "author.editPublishedDisabled"
 msgstr ""
@@ -2718,3 +2718,9 @@ msgstr "Palautettu arviointivaiheeseen."
 
 #~ msgid "publication.citations.success"
 #~ msgstr "Viitteet on päivitetty."
+
+msgid "submission.authors.label"
+msgstr "Kirjoittajat"
+
+msgid "submission.author.list"
+msgstr "Käsikirjoituksen kirjoittajaluettelo"
diff --git a/locale/fr_CA/manager.po b/locale/fr_CA/manager.po
index be2ff523a9a..0895f931cdf 100644
--- a/locale/fr_CA/manager.po
+++ b/locale/fr_CA/manager.po
@@ -3821,3 +3821,8 @@ msgstr ""
 
 msgid "manager.highlights.image"
 msgstr "Image"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Les auteurs-es soumissionnaires doivent déposer une déclaration de conflits "
+"d'intérêts avec leur soumission."
diff --git a/locale/fr_FR/common.po b/locale/fr_FR/common.po
index 6e554b60f2d..382bc7d8c5f 100644
--- a/locale/fr_FR/common.po
+++ b/locale/fr_FR/common.po
@@ -8,8 +8,8 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:49+00:00\n"
-"PO-Revision-Date: 2023-10-01 15:06+0000\n"
-"Last-Translator: Germán Huélamo Bautista <germanhuelamo@gmail.com>\n"
+"PO-Revision-Date: 2023-11-24 19:27+0000\n"
+"Last-Translator: Jean-Blaise Claivaz <jean-blaise.claivaz@unige.ch>\n"
 "Language-Team: French <http://translate.pkp.sfu.ca/projects/pkp-lib/common/"
 "fr_FR/>\n"
 "Language: fr_FR\n"
@@ -17,10 +17,10 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "common.publicKnowledgeProject"
-msgstr "Projet de connaissances publiques (Public Knowledge Project)"
+msgstr "Public Knowledge Project"
 
 msgid "common.currentStyleSheet"
 msgstr "Feuille de style actuelle"
@@ -68,7 +68,7 @@ msgid "announcement.announcementsHome"
 msgstr "Annonces"
 
 msgid "announcement.moreAnnouncements"
-msgstr "Encore plus d'annonces..."
+msgstr "Plus d'annonces..."
 
 msgid "announcement.noneExist"
 msgstr "Aucune annonce n'a été publiée."
@@ -175,9 +175,9 @@ msgstr "Texte alternatif"
 
 msgid "common.altTextInstructions"
 msgstr ""
-"Décrivez cette image pour les utilisateurs et utilisatrices visitant ce site "
-"dans un navigateur textuel où à l'aide d'un dispositif d'assistance. Par "
-"exemple : « Notre rédacteur intervient lors de la conférence PKP »."
+"Décrivez cette image pour les utilisateurs et utilisatrices qui visitent ce "
+"site avec un navigateur textuel ou à l'aide d'un dispositif d'assistance. "
+"Par exemple : « Notre rédacteur intervient lors de la conférence PKP. »"
 
 msgid "common.and"
 msgstr "et"
@@ -780,7 +780,9 @@ msgid "common.replaceFile"
 msgstr "Remplacer le fichier"
 
 msgid "common.requiredField"
-msgstr "* Indique un champ obligatoire"
+msgstr ""
+"<abbr class=\"required\" title=\"required\">*</abbr> Indique un champ "
+"obligatoire"
 
 msgid "common.required"
 msgstr "Obligatoire"
@@ -1702,7 +1704,7 @@ msgid "search.cli.rebuildIndex.error"
 msgstr "Erreur"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} articles indexés"
+msgstr "{$numIndexed} articles prévus pour l'indexation"
 
 msgid "search.coverage"
 msgstr "Couverture"
@@ -1921,7 +1923,7 @@ msgid "timeZone"
 msgstr "Fuseau horaire"
 
 msgid "user.email"
-msgstr "Adresse de courriel"
+msgstr "Courriel"
 
 msgid "user.authorization.submissionFile"
 msgstr "L'utilisateur actuel n'a pas accès au fichier de soumission spécifié."
@@ -2404,3 +2406,15 @@ msgstr "Auteur modifié."
 #~ msgstr ""
 #~ "Une erreur inattendue est survenue. Vous avez peut-être été déconnecté ou "
 #~ "déconnectée. Veuillez recharger la page et essayer de nouveau."
+
+msgid "showLess"
+msgstr "Montrer moins"
+
+msgid "common.highlight"
+msgstr "Mise en évidence"
+
+msgid "showAll"
+msgstr "Montrer tous"
+
+msgid "common.highlights"
+msgstr "Mises en évidence"
diff --git a/locale/fr_FR/manager.po b/locale/fr_FR/manager.po
index 61b1940518f..9f65c6095b4 100644
--- a/locale/fr_FR/manager.po
+++ b/locale/fr_FR/manager.po
@@ -3884,3 +3884,8 @@ msgstr ""
 
 msgid "emailTemplate.variable.activateUrl"
 msgstr "Le lien pour valider un compte de messagerie"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Les auteurs soumissionnaires doivent déposer une déclaration de conflits "
+"d'intérêts (CI) avec leur soumission."
diff --git a/locale/fr_FR/submission.po b/locale/fr_FR/submission.po
index 2072a929a83..d876829c8ad 100644
--- a/locale/fr_FR/submission.po
+++ b/locale/fr_FR/submission.po
@@ -8,8 +8,8 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:50+00:00\n"
-"PO-Revision-Date: 2023-10-01 15:06+0000\n"
-"Last-Translator: Germán Huélamo Bautista <germanhuelamo@gmail.com>\n"
+"PO-Revision-Date: 2023-11-24 19:27+0000\n"
+"Last-Translator: Jean-Blaise Claivaz <jean-blaise.claivaz@unige.ch>\n"
 "Language-Team: French <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "submission/fr_FR/>\n"
 "Language: fr_FR\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "author.editPublishedDisabled"
 msgstr ""
@@ -1971,8 +1971,8 @@ msgstr ""
 
 msgid "submission.event.fileAuditorAdded"
 msgstr ""
-"« {$userFullName} » ({$username}) a été ajouté à titre de vérificateur du fichier "
-"« {$filename} »."
+"« {$userFullName} » ({$username}) a été ajouté à titre de vérificateur du "
+"fichier « {$filename}. »"
 
 msgid "submission.event.fileAuditorCleared"
 msgstr ""
@@ -1984,11 +1984,13 @@ msgstr ""
 "« {$filename} »."
 
 msgid "submission.event.signoffSignoff"
-msgstr "« {$userFullName} » ({$username}) a fermé la session pour « {$filename} »."
+msgstr ""
+"« {$userFullName} » ({$username}) a fermé la session pour « {$filename}. »"
 
 msgid "submission.event.proofsApproved"
 msgstr ""
-"« {$userFullName} » ({$username}) a approuvé les épreuves pour « {$publicationFormatName} »."
+"« {$userFullName} » ({$username}) a approuvé les épreuves pour « "
+"{$publicationFormatName}. »"
 
 msgid "submission.overview"
 msgstr "Aperçu de la soumission"
@@ -2888,3 +2890,9 @@ msgid "submission.query.allowedEditTime"
 msgstr ""
 "Vous pouvez mettre à jour cette discussion pendant "
 "{$allowedEditTimeNoticeLimit} minutes."
+
+msgid "submission.authors.label"
+msgstr "Auteurs/trices"
+
+msgid "submission.author.list"
+msgstr "Liste des soumissionnaires"
diff --git a/locale/gd/manager.po b/locale/gd/manager.po
index 7ccdca0eca5..8775700546e 100644
--- a/locale/gd/manager.po
+++ b/locale/gd/manager.po
@@ -3119,3 +3119,6 @@ msgstr ""
 #~ msgstr ""
 #~ "Thèid am post-d seo a chur gu lèirmheasaiche le deasaiche earrainn airson "
 #~ "cur na c(h)uimhne gu bheil an lèirmheas aca ri lìbhrigeadh."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
diff --git a/locale/gl/manager.po b/locale/gl/manager.po
index 11a30bc3c4e..8c46883b7af 100644
--- a/locale/gl/manager.po
+++ b/locale/gl/manager.po
@@ -3432,3 +3432,8 @@ msgstr ""
 #~ msgstr ""
 #~ "Este correo electrónico é enviado polo Editor/a de Sección a un revisor/a "
 #~ "para lembrarlle que superou a data de entrega da revisión."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Pedir aos autores/as que presenten unha declaración de conflitos de "
+"intereses (CI) xuntamente co seu envío."
diff --git a/locale/he/manager.po b/locale/he/manager.po
index 289f37d873c..6e064763787 100644
--- a/locale/he/manager.po
+++ b/locale/he/manager.po
@@ -3091,3 +3091,6 @@ msgstr ""
 #, fuzzy
 #~ msgid "emails.reviewRemind.body"
 #~ msgstr "דוא\"ל זה נשלח על ידי עורך מדור להזכיר מבקר שהביקורת שלהם נובעת."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
diff --git a/locale/hi/manager.po b/locale/hi/manager.po
index 2f1258e26ed..935d0dfd12e 100644
--- a/locale/hi/manager.po
+++ b/locale/hi/manager.po
@@ -3174,3 +3174,8 @@ msgstr ""
 #~ msgstr ""
 #~ "यह ईमेल एक अनुभाग संपादक द्वारा एक समीक्षक को याद दिलाने के लिए भेजा जाता है कि "
 #~ "उनकी समीक्षा होने वाली है."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"अपने जमा करने के साथ एक प्रतियोगी ब्याज (CI) बयान दर्ज करने के लिए लेखकों को प्रस्तुत करने "
+"की आवश्यकता है।"
diff --git a/locale/hr/manager.po b/locale/hr/manager.po
index acd5c060f53..473fc4cc826 100644
--- a/locale/hr/manager.po
+++ b/locale/hr/manager.po
@@ -3593,3 +3593,8 @@ msgstr "Potreban je urednik podneska"
 #~ msgstr ""
 #~ "Stavka koja 1) ima DOI dodijeljene za sve omogućene vrste DOI i 2) nije "
 #~ "objavljena"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Zahtijevaj od autora da prilikom prijave svog rukopisa ispune izjavu o "
+"sukobu interesa."
diff --git a/locale/hu/manager.po b/locale/hu/manager.po
index 93af1685f9d..34647222c38 100644
--- a/locale/hu/manager.po
+++ b/locale/hu/manager.po
@@ -3856,3 +3856,8 @@ msgstr ""
 #~ msgstr ""
 #~ "Ezt az emailt a Rovatszerkesztő küldi a Szakmai Lektornak, hogy "
 #~ "emlékeztesse a lektorálási határidőre."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"A cikket beadó szerzők felszólítása az összeférhetetlenségi nyilatkozat "
+"benyújtására."
diff --git a/locale/hy/admin.po b/locale/hy/admin.po
index 4337dcddbea..26aaacc7269 100644
--- a/locale/hy/admin.po
+++ b/locale/hy/admin.po
@@ -2,7 +2,7 @@
 # Tigran Zargaryan <tigran@flib.sci.am>, 2022, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-10-03 07:06+0000\n"
+"PO-Revision-Date: 2023-12-03 14:39+0000\n"
 "Last-Translator: Tigran Zargaryan <tigran@flib.sci.am>\n"
 "Language-Team: Armenian <http://translate.pkp.sfu.ca/projects/pkp-lib/admin/"
 "hy/>\n"
@@ -11,7 +11,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "admin.systemInfo.settingName"
 msgstr "Անվան կարգավորում"
@@ -934,3 +934,15 @@ msgstr "Գործարկեք աշխատողի deamon -ը փորձարկման հե
 
 msgid "admin.settings.statistics.sushiPlatform.isSiteSushiPlatform"
 msgstr "Օգտագործեք կայքը որպես հարթակ բոլոր ամսագրերի համար:"
+
+msgid "admin.settings.sharedReviewerStatistics.disable"
+msgstr "Անջատել գրախոսի ընդհանուր վիճակագրությունը"
+
+msgid "admin.settings.sharedReviewerStatistics"
+msgstr "Գրախոսի վիճակագրություն"
+
+msgid "admin.settings.sharedReviewerStatistics.description"
+msgstr ""
+"Բազմահամատեքստային տեղադրման ժամանակ գրախոսի վիճակագրությունը, ինչպիսին է "
+"ներկայացված գրախոսությունների քանակը, կարող է ցուցադրվել կա՛մ առանձին-"
+"առանձին յուրաքանչյուր համատեքստի համար, կա՛մ խմբավորված:"
diff --git a/locale/hy/common.po b/locale/hy/common.po
index 5df678cf0c4..473bb3cf560 100644
--- a/locale/hy/common.po
+++ b/locale/hy/common.po
@@ -4,7 +4,7 @@
 # Martin Brändle <martin.braendle@uzh.ch>, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-11-17 15:38+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Tigran Zargaryan <tigran@flib.sci.am>\n"
 "Language-Team: Armenian <http://translate.pkp.sfu.ca/projects/pkp-lib/common/"
 "hy/>\n"
@@ -1683,7 +1683,7 @@ msgid "search.cli.rebuildIndex.error"
 msgstr "սխալ"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} ինդեքսավորված հոդված"
+msgstr "{$numIndexed} հոդվածներ, որոնք նախատեսված են ինդեքսավորման համար"
 
 msgid "search.coverage"
 msgstr "Արդյունք"
diff --git a/locale/hy/manager.po b/locale/hy/manager.po
index 8094504efa3..2a17015f3cd 100644
--- a/locale/hy/manager.po
+++ b/locale/hy/manager.po
@@ -3731,3 +3731,8 @@ msgid "manager.announcements.notEnabled"
 msgstr ""
 "Դուք պետք է թույլատրեք <a href=\"#announcements/announcement-settings\""
 ">հայտարարությունները</a>:"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Ներկայացնող Հեղինակներից պահանջեք տրամադրել Շահերի բախման (CI) "
+"հայտարարությունը իրենց առաքած նյութերի հետ միասին:"
diff --git a/locale/id/manager.po b/locale/id/manager.po
index 25070f66971..00e252a0412 100644
--- a/locale/id/manager.po
+++ b/locale/id/manager.po
@@ -3412,3 +3412,8 @@ msgstr ""
 #~ "Email ini dikirim oleh Editor untuk mengingatkan reviewer bahwa batas "
 #~ "reviewnya telah habis. Email ini digunakan ketika editor secara manual "
 #~ "mengirimkan pengingat kepada reviewer"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Mengharuskan Penulis untuk memberikan pernyataan Konflik Kepentingan dalam "
+"naskah mereka."
diff --git a/locale/is/manager.po b/locale/is/manager.po
index 769dec2bb72..dfb06168c58 100644
--- a/locale/is/manager.po
+++ b/locale/is/manager.po
@@ -3376,3 +3376,8 @@ msgstr ""
 
 #~ msgid "emailTemplate.variable.recipient.submissionReviewUrl"
 #~ msgstr "Vefslóð á ritrýniverkefnið"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Biðja höfunda sem senda inn efni að skrá um leið yfirlýsingu vegna "
+"hagsmunaárekstra."
diff --git a/locale/it/manager.po b/locale/it/manager.po
index cb6184a4ee3..98718293715 100644
--- a/locale/it/manager.po
+++ b/locale/it/manager.po
@@ -3510,3 +3510,8 @@ msgstr ""
 #~ msgstr ""
 #~ "Questa email viene mandata da un editor per ricordare al revisore che è "
 #~ "attesa la revisione."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Richiedi agli autori di inviare una dichiarazione di assenza di conflitto di "
+"interessi durante l'invio della proposta."
diff --git a/locale/ja/manager.po b/locale/ja/manager.po
index 76ed733d9dd..d50e67621d6 100644
--- a/locale/ja/manager.po
+++ b/locale/ja/manager.po
@@ -3363,3 +3363,7 @@ msgstr ""
 #~ msgstr ""
 #~ "このメールは、セクション編集者から査読者に査読期限日が過ぎたことを督促する"
 #~ "ものです。"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"投稿する著者に、投稿時に競合する利益(CI)に関する声明を提出するよう求める。"
diff --git a/locale/ka/manager.po b/locale/ka/manager.po
index de50f43ca34..0a0b7345f28 100644
--- a/locale/ka/manager.po
+++ b/locale/ka/manager.po
@@ -3561,3 +3561,8 @@ msgstr ""
 
 #~ msgid "manager.setup.enableDois.enable"
 #~ msgstr "DOI-ების ჩართვა"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"ავტორებისაგან ინტერესთა კონფლიქტის დეკლარაციის წარმოდგენა, გამოგზავნილ "
+"მასალასთან ერთად."
diff --git a/locale/kk/manager.po b/locale/kk/manager.po
index 4a73a645737..53374291d35 100644
--- a/locale/kk/manager.po
+++ b/locale/kk/manager.po
@@ -3542,3 +3542,8 @@ msgstr ""
 #~ msgstr ""
 #~ "Бұл электрондық хатты Редактор рецензентке материалдардың қарастырылуы "
 #~ "тиіс екенін еске салу үшін жібереді"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Требовать от авторов представлять Декларацию о конфликте интересов вместе с "
+"отправляемым материалом."
diff --git a/locale/ko/manager.po b/locale/ko/manager.po
index 1b2b6bc15da..ba029dec63b 100644
--- a/locale/ko/manager.po
+++ b/locale/ko/manager.po
@@ -3052,3 +3052,6 @@ msgstr ""
 
 msgid "mailable.submissionNeedsEditor.name"
 msgstr ""
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
diff --git a/locale/ky/api.po b/locale/ky/api.po
new file mode 100644
index 00000000000..3c70c3b32f6
--- /dev/null
+++ b/locale/ky/api.po
@@ -0,0 +1,3 @@
+# Russian Agency for Digital Standardization <info@rads-doi.org>, 2023.
+msgid ""
+msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit"
diff --git a/locale/ky/common.po b/locale/ky/common.po
new file mode 100644
index 00000000000..2de3cd59461
--- /dev/null
+++ b/locale/ky/common.po
@@ -0,0 +1,3 @@
+# Emma U <emmaupkp@gmail.com>, 2023.
+msgid ""
+msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit"
diff --git a/locale/ky/editor.po b/locale/ky/editor.po
new file mode 100644
index 00000000000..3c70c3b32f6
--- /dev/null
+++ b/locale/ky/editor.po
@@ -0,0 +1,3 @@
+# Russian Agency for Digital Standardization <info@rads-doi.org>, 2023.
+msgid ""
+msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit"
diff --git a/locale/lt/manager.po b/locale/lt/manager.po
index 0d253f4e03e..9e9ec68cf2d 100644
--- a/locale/lt/manager.po
+++ b/locale/lt/manager.po
@@ -3071,3 +3071,6 @@ msgstr ""
 
 #~ msgid "doi.displayName"
 #~ msgstr "DOI"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
diff --git a/locale/lv/admin.po b/locale/lv/admin.po
index f18b7ecedac..fb533b233d6 100644
--- a/locale/lv/admin.po
+++ b/locale/lv/admin.po
@@ -2,7 +2,7 @@
 # Ieva Tiltina <pastala@gmail.com>, 2022, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-11-03 11:03+0000\n"
+"PO-Revision-Date: 2023-12-09 07:38+0000\n"
 "Last-Translator: Ieva Tiltina <pastala@gmail.com>\n"
 "Language-Team: Latvian <http://translate.pkp.sfu.ca/projects/pkp-lib/admin/"
 "lv/>\n"
@@ -28,7 +28,7 @@ msgstr "Dzēst kešatmiņas"
 
 msgid "admin.deleteCache.description"
 msgstr ""
-"Izdzēsiet kešatmiņas failus no sistēmas. Tas jādara tikai izstrādes vidēs."
+"Izdzēsiet kešatmiņas datnes no sistēmas. Tas jādara tikai izstrādes vidēs."
 
 msgid "admin.clearDataCache"
 msgstr "Notīrīt Datu Kešatmiņu"
@@ -38,7 +38,7 @@ msgstr "Notīrīt Veidņu Kešatmiņu"
 
 msgid "admin.configFileUpdatedInstructions"
 msgstr ""
-"Jūsu konfigurācijas fails ir veiksmīgi atjaunināts. Lūdzu, ņemiet vērā, ja "
+"Jūsu konfigurācijas datne ir veiksmīgi atjaunināta. Lūdzu, ņemiet vērā, ja "
 "jūsu vietne vairs nedarbojas pareizi, iespējams, būs manuāli jālabo "
 "konfigurācija, rediģējot <tt>config.inc.php</tt>."
 
@@ -52,7 +52,7 @@ msgstr ""
 "atkārtoti (ieskaitot jūs)."
 
 msgid "admin.contentsOfConfigFile"
-msgstr "Konfigurācijas faila saturs"
+msgstr "Konfigurācijas datnes saturs"
 
 msgid "admin.contexts.confirmDelete"
 msgstr ""
@@ -83,8 +83,8 @@ msgstr ""
 
 msgid "admin.languages.cantDisable"
 msgstr ""
-"Šī ir vietnes primārā lokalizācija. Jūs nevarat to atspējot, kamēr nav "
-"izvēlēta cita primārā lokalizācija."
+"Šī lokalizācija ir vietnes primārā valoda. Jūs nevarat to atspējot, kamēr "
+"nav izvēlēta cita primārā lokalizācija."
 
 msgid "admin.languages.confirmSitePrimaryLocaleChange"
 msgstr ""
@@ -157,6 +157,8 @@ msgstr ""
 
 msgid "admin.scheduledTask.editorialReminder.logEnd"
 msgstr ""
+"Dispečēti {$count} darbuzdevumi, lai nosūtītu redakcionālos e-pasta "
+"atgādinājumus lietotājiem {$userIds} kontekstā {$contextId}"
 
 msgid "admin.scheduledTask.confirmClearLogs"
 msgstr ""
@@ -187,6 +189,7 @@ msgstr ""
 
 msgid "admin.scheduledTask.removeFailedJobs"
 msgstr ""
+"Noņemt vecākos nesekmīgos darbuzdevumus no nesekmīgo darbuzdevumu saraksta."
 
 msgid "admin.scheduledTask.processQueueJobs"
 msgstr ""
diff --git a/locale/lv/api.po b/locale/lv/api.po
index cfb133715d7..1f1b2e896dc 100644
--- a/locale/lv/api.po
+++ b/locale/lv/api.po
@@ -1,8 +1,353 @@
 # Ieva Tiltina <pastala@gmail.com>, 2023.
 msgid ""
 msgstr ""
+"PO-Revision-Date: 2023-12-09 07:39+0000\n"
+"Last-Translator: Ieva Tiltina <pastala@gmail.com>\n"
+"Language-Team: Latvian <http://translate.pkp.sfu.ca/projects/pkp-lib/api/lv/>"
+"\n"
 "Language: lv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Weblate\n"
+"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= "
+"19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n"
+"X-Generator: Weblate 4.18.2\n"
+
+msgid "api.400.paramNotSupported"
+msgstr "Parametrs {$param} nav atbalstīts."
+
+msgid "api.400.propReadOnly"
+msgstr "Īpašību {$prop} nevar mainīt."
+
+msgid "api.400.requireEmailSubjectBody"
+msgstr "Jums jānorāda e-pasta temats un saturs."
+
+msgid "api.files.400.notAllowedCreatedAt"
+msgstr "Nav iespējams mainīt tā izveidošanas laiku."
+
+msgid "api.400.errorUploadingImage"
+msgstr "Kļūda, augšupielādējot šo attēlu."
+
+msgid "api.400.invalidApiToken"
+msgstr ""
+"API marķieri (token) nevarēja apstiprināt. Tas var liecināt par kļūdu API "
+"marķierī vai par to, ka API marķieris vairs nav derīgs."
+
+msgid "api.400.tokenCouldNotBeDecoded"
+msgstr "Marķieri ApiToken nevarēja atšifrēt šādas kļūdas dēļ: {$error}"
+
+msgid "api.dois.403.prefixRequired"
+msgstr "DOI prefikss ir nepieciešams, lai ģenerētu DOI."
+
+msgid "api.dois.404.doiNotFound"
+msgstr "Jūsu pieprasītais DOI nav atrasts."
+
+msgid "api.dois.404.submissionNotFound"
+msgstr "Jūsu pieprasītais iesniegtais materiāls netika atrasts."
+
+msgid "api.dois.400.creationFailed"
+msgstr "Radās kļūda, un DOI objektu neizdevās izveidot."
+
+msgid "api.dois.400.xmlExportFailed"
+msgstr "Radās XML validācijas kļūda, un XML nevarēja eksportēt."
+
+msgid "api.dois.404.noPubObjectIncluded"
+msgstr "Pieprasījumam nebija pievienoti derīgi publicēšanas objekti."
+
+msgid "api.dois.400.invalidPubObjectIncluded"
+msgstr ""
+"Pieprasījumam tika pievienots viens vai vairāki nederīgi publicēšanas "
+"objekti."
+
+msgid "api.dois.400.invalidPluginType"
+msgstr ""
+"Pašlaik konfigurētajam spraudnim jābūt reģistrācijas aģentūras spraudnim."
+
+msgid "api.decisions.403.alreadyPublished"
+msgstr ""
+"Jūs nevarat reģistrēt lēmumu vai ieteikt lēmumu par šo materiālu, jo tas jau "
+"ir publicēts."
+
+msgid "api.emails.400.missingSubject"
+msgstr "Jums ir jānorāda e-pasta temats."
+
+msgid "api.emails.400.missingUserGroups"
+msgstr "Jums jānorāda lietotāju lomas, kam jāsaņem šis e-pasts."
+
+msgid "api.emails.403.notAllowedUserGroup"
+msgstr ""
+"Jums nav atļauts sūtīt e-pastu lietotājiem, kuriem ir viena vai vairākas "
+"atlasītās lomas."
+
+msgid "api.emailTemplates.400.invalidContext"
+msgstr "Tas nav derīgs konteksts."
+
+msgid "api.emailTemplates.404.templateNotFound"
+msgstr "Jūsu pieprasītā e-pasta veidne netika atrasta."
+
+msgid "api.files.400.noUpload"
+msgstr "Pieprasījumam nav atrasta neviena augšupielādējama datne."
+
+msgid "api.files.400.uploadFailed"
+msgstr "Nebija iespējams augšupielādēt vienu vai vairākas datnes."
+
+msgid "api.highlights.400.noOrderData"
+msgstr ""
+"Iezīmēto kārtību nevar saglabāt, jo nav atrasta informācija par kārtošanu."
+
+msgid "api.highlights.400.orderHighlightNotFound"
+msgstr ""
+"Iezīmēto kārtību nevar saglabāt, jo nebija iespējams atrast vienu vai "
+"vairākus iezīmētos elementus."
+
+msgid "api.highlights.404.highlightNotFound"
+msgstr "Jūsu pieprasīto iezīmēto elementu nebija iespējams atrast."
+
+msgid "api.publication.403.alreadyUnpublished"
+msgstr "Publikācija, kuras publicēšanu vēlaties atcelt, nav publicēta."
+
+msgid "api.publication.403.cantEditStatus"
+msgstr ""
+"Statusu nevar mainīt tieši, izmantojot API. Tā vietā izmantojiet /publish un "
+"/unpublish galapunktus."
+
+msgid "api.publication.403.cantDeletePublished"
+msgstr "Lai šo publikāciju varētu dzēst, tās publicēšana ir jāatceļ."
+
+msgid "api.publicFiles.403.unauthorized"
+msgstr "Jums nav atļauts augšupielādēt failus."
+
+msgid "api.publicFiles.413.noDirSpace"
+msgstr ""
+"Lietotāja direktorijā nav pietiekami daudz vietas. Jūsu augšupielādētās "
+"datnes izmērs ir {$fileUploadSize}kb, un jums ir palicis {$dirSizeLeft}kb."
+
+msgid "api.stats.400.wrongDateFormat"
+msgstr "Datumam jābūt formātā GGGG-MM-DD."
+
+msgid "api.stats.400.wrongDateRange"
+msgstr "Sākuma datums nedrīkst būt vēlāks par beigu datumu."
+
+msgid "api.stats.400.wrongTimelineInterval"
+msgstr "Pieprasījums nebija derīgs. Laika intervālam jābūt `day` vai `month`."
+
+msgid "api.stats.400.invalidOrderDirection"
+msgstr ""
+"Pieprasījums nebija derīgs. Parametram OrderDirection jābūt `desc` vai `asc`."
+
+msgid "api.submissionFiles.400.missingReviewRoundAssocType"
+msgstr "Pieprasot datnes recenzēšanas posmā, ir jānorāda recenzēšanas kārta."
+
+msgid "api.submissionFiles.400.noFileStageId"
+msgstr "Jānorāda posms, kurā šobrīd ir datne."
+
+msgid "api.dois.403.pubTypeNotRecognized"
+msgstr "Publikācijas veids netika atpazīts."
+
+msgid "api.files.400.fileSize"
+msgstr "Datnes, kas lielākas par {$maxSize}, nevar augšupielādēt."
+
+msgid "api.dois.404.contextNotFound"
+msgstr ""
+"Šis galapunkts nav pieejams no vietnes mēroga nosaukumu telpas, un tas "
+"jāpieprasa konkrētam kontekstam."
+
+msgid "api.files.400.config"
+msgstr ""
+"Datni nav iespējams augšupielādēt servera konfigurācijas kļūdas dēļ. Lūdzu, "
+"sazinieties ar sistēmas administratoru."
+
+msgid "api.dois.404.pubObjectNotFound"
+msgstr "Netika atrasts pieprasītais publikācijas objekts."
+
+msgid "api.dois.400.noUnpublishedItems"
+msgstr ""
+"Nepublicētus vienumus nevar eksportēt/deponēt. Lūdzu, noņemiet nepublicēto "
+"vienumu atlasi un mēģiniet vēlreiz."
+
+msgid "api.publication.403.alreadyPublished"
+msgstr "Publikācija, kuru vēlaties publicēt, jau ir publicēta."
+
+msgid "api.dois.400.markRegisteredFailed"
+msgstr ""
+"Notika kļūda, un daži no iesniegtajiem vienumiem netika atzīmēti kā "
+"reģistrēti."
+
+msgid "api.publication.403.cantEditPublished"
+msgstr "Šo publikāciju nevar rediģēt, jo tā jau ir publicēta."
+
+msgid "api.dois.400.depositFailed"
+msgstr ""
+"Dažus vienumus neizdevās veiksmīgi deponēt. Lūdzu, pārbaudiet atsevišķus "
+"vienumus, lai uzzinātu, kādi ir to īpašie kļūdu paziņojumi."
+
+msgid "api.publicFiles.400.extensionNotSupported"
+msgstr "Var augšupielādēt tikai šādus datņu tipus: {$fileTypes}."
+
+msgid "api.emails.400.missingBody"
+msgstr "Jums jāpievieno e-pasta saturs."
+
+msgid "api.publicFiles.400.invalidImage"
+msgstr "Augšupielādētais attēls nav derīgs."
+
+msgid "api.emailTemplates.400.invalidAlternateTo"
+msgstr "Šī nav noklusējuma e-pasta veidne zināmam e-pastam."
+
+msgid "api.publicFiles.400.mimeTypeNotMatched"
+msgstr ""
+"Jūsu augšupielādētā datne neatbilst datnes paplašinājumam. Tā var notikt, ja "
+"datnes nosaukums ir mainīts uz nesaderīgu tipu, piemēram, mainot foto.png uz "
+"foto.jpg."
+
+msgid "api.publicFiles.500.badFilesDir"
+msgstr ""
+"Publisko datņu direktorija nav atrasta vai tajā nav iespējams saglabāt "
+"datnes. Lūdzu, sazinieties ar administratoru, lai atrisinātu šo problēmu."
+
+msgid "api.stats.400.earlyDateRange"
+msgstr "Sākuma datums nevar būt agrāks par 2001-01-01."
+
+msgid "api.stats.400.lateDateRange"
+msgstr "Beigu datums nedrīkst būt vēlāks par vakardienu."
+
+msgid "api.stats.400.invalidTimelineInterval"
+msgstr "Pieprasījums nebija derīgs. Laika intervālam jābūt `day` vai `month`."
+
+msgid "api.submissionFiles.400.assocTypeAndIdRequired"
+msgstr ""
+"Nevar mainīt datnes sasaisti, nenorādot parametrus assocType un assocId."
+
+msgid "api.submissionFiles.400.badDependentFileAssocType"
+msgstr "Datni no šī posma nevar sasaistīt ar citu iesniegtā materiāla datni."
+
+msgid "api.submissionFiles.400.badNoteAssocType"
+msgstr "Datni no šī posma nevar sasaistīt ar diskusiju piezīmi."
+
+msgid "api.submissionFiles.400.badReviewAssignmentAssocType"
+msgstr "Datni no šī posma nevar saistīt ar recenzēšanas piešķīrumu."
+
+msgid "api.submissionFiles.400.badReviewRoundAssocType"
+msgstr "Datni no šī posma nevar saistīt ar recenzēšanas kārtu."
+
+msgid "api.403.unauthorized"
+msgstr "Jums nav tiesību piekļūt pieprasītajam resursam."
+
+msgid "api.404.resourceNotFound"
+msgstr "Pieprasītais resurss nav atrasts."
+
+msgid "api.404.endpointNotFound"
+msgstr "Pieprasītais URL netika atpazīts."
+
+msgid "api.announcements.404.announcementNotFound"
+msgstr "Jūsu pieprasītais paziņojums nav atrasts."
+
+msgid "api.institutions.404.institutionNotFound"
+msgstr "Jūsu pieprasītā iestāde nav atrasta."
+
+msgid "api.contexts.400.localesNotSupported"
+msgstr "Nav atbalstītas šādas vietējās valodas: {$locales}."
+
+msgid "api.dois.403.editItemOutOfContext"
+msgstr "Nevar rediģēt elementa DOI, kas nav šajā kontekstā."
+
+msgid "api.submissionFiles.400.invalidFileStage"
+msgstr "Jūsu norādītais faila posms nav derīgs."
+
+msgid "api.submissionsFiles.400.noParams"
+msgstr "Pieprasījumā rediģēt šo failu netika atrastas nekādas izmaiņas."
+
+msgid "api.submissionFiles.400.reviewRoundIdRequired"
+msgstr ""
+"Pārvietojot failu uz šo posmu, ir jānorāda recenzēšanas kārtas "
+"identifikators."
+
+msgid "api.submissionFiles.400.reviewRoundSubmissionNotMatch"
+msgstr "Jūsu norādītā recenzēšanas kārta nav daļa no šī iesniegtā materiāla."
+
+msgid "api.submissionFiles.403.unauthorizedFileStageId"
+msgstr "Jums nav atļauts piekļūt šiem failiem."
+
+msgid "api.submissionFiles.403.unauthorizedReviewRound"
+msgstr "Jums nav atļauts piekļūt failiem šajā recenzēšanas kārtā."
+
+msgid "api.submissions.400.missingRequired"
+msgstr ""
+"Jūsu pieprasījumu nevar izpildīt, jo tajā trūkst nepieciešamās informācijas."
+
+msgid "api.submissions.400.invalidIssueIdentifiers"
+msgstr "Pieprasītais sējums, numurs vai gads nav derīgs."
+
+msgid "api.submissions.403.deleteSubmissionOutOfContext"
+msgstr ""
+"Jūs nevarat dzēst iesniegto materiālu, kas nav piešķirts šim kontekstam."
+
+msgid "api.submissions.403.requestedOthersUnpublishedSubmissions"
+msgstr ""
+"Jūs varat apskatīt tikai tos nepublicētos materiālus, kas jums ir piešķirti."
+
+msgid "api.submissions.403.unauthorizedDeleteSubmission"
+msgstr "Jums nav tiesību dzēst šo iesniegto materiālu."
+
+msgid "api.submissions.403.userCantEdit"
+msgstr "Jums nav atļauts rediģēt šo publikāciju."
+
+msgid "api.themes.404.themeUnavailable"
+msgstr ""
+"Aktīvā tēma {$themePluginPath} nav iespējota un, iespējams, nav instalēta."
+
+msgid "api.vocabs.400.localeNotSupported"
+msgstr "Lokāle {$locale} nav atbalstīta."
+
+msgid "api.jobs.404.failedJobNotFound"
+msgstr "Nesekmīgais darbuzdevums nav atrodams neveiksmīgo darbu sarakstā."
+
+msgid "api.jobs.406.failedJobEmpty"
+msgstr "Sarakstā nav atrasts neviens nesekmīgs darbuzdevums."
+
+msgid "api.jobs.400.failedJobRedispatchedFailed"
+msgstr "Nav iespējams pārdispečēt nesekmīgo darbuzdevumu."
+
+msgid "api.jobs.200.allFailedJobRedispatchedSucceed"
+msgstr ""
+"Visi redispečējamie nesekmīgie darbuzdevumi ar derīgu vērtumu (payload) ir "
+"veiksmīgi atkārtoti iekļauti rindā."
+
+msgid "api.jobs.400.failedJobDeleteFailed"
+msgstr ""
+"Nav iespējams izdzēst nesekmīgo darbuzdevumu no nesekmīgo darbu saraksta."
+
+msgid "api.submissionFiles.403.unauthorizedFileStageIdWrite"
+msgstr "Jums nav atļauts pievienot un rediģēt šos failus."
+
+msgid "api.500.apiSecretKeyMissing"
+msgstr ""
+"API marķieri (token) nevar izmantot, lai piekļūtu šai vietnei, jo vietnes "
+"administrators nav konfigurējis slepeno atslēgu."
+
+msgid "api.submissions.400.invalidSubmitAs"
+msgstr "Šajā lietotāja lomā jums nav atļauts iesniegt materiālus."
+
+msgid "api.submissions.403.csrfTokenFailure"
+msgstr ""
+"Jūsu pieprasījums tika noraidīts. Iespējams, tas ir tāpēc, ka jūsu "
+"pieteikšanās ir beigusies. Pārlādējiet lapu un mēģiniet vēlreiz."
+
+msgid "api.submissions.404.siteWideEndpoint"
+msgstr ""
+"Šis galapunkts (endpoint) nav pieejams no konteksta. Tam var piekļūt no "
+"vietnes mēroga nosaukumu telpas (site-wide namespace)."
+
+msgid "api.mailables.404.mailableNotFound"
+msgstr "Jūsu pieprasītais e-pasts netika atrasts."
+
+msgid "api.jobs.406.failedJobPayloadMissing"
+msgstr ""
+"Nesekmīgajam darbuzdevumamam trūkst vērtuma (payload), lai to varētu "
+"pārdispečēt."
+
+msgid "api.jobs.200.failedJobRedispatchedSucceed"
+msgstr "Neveiksmīgais darbuzdevums veiksmīgi pārdispečēts."
+
+msgid "api.jobs.200.failedJobDeleteSucceed"
+msgstr ""
+"Nesekmīgais darbuzdevums veiksmīgi dzēsts no nesekmīgo darbuzdevumu saraksta."
diff --git a/locale/lv/common.po b/locale/lv/common.po
index 659b026d8ca..e6a844037fb 100644
--- a/locale/lv/common.po
+++ b/locale/lv/common.po
@@ -1,7 +1,7 @@
 # Ieva Tiltina <pastala@gmail.com>, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-11-03 11:03+0000\n"
+"PO-Revision-Date: 2023-12-05 23:17+0000\n"
 "Last-Translator: Ieva Tiltina <pastala@gmail.com>\n"
 "Language-Team: Latvian <http://translate.pkp.sfu.ca/projects/pkp-lib/common/"
 "lv/>\n"
@@ -629,7 +629,9 @@ msgid "common.removeSelection"
 msgstr "Noņemt atlasi"
 
 msgid "common.requiredField"
-msgstr "* Apzīmē obligāto lauku"
+msgstr ""
+"Obligātie lauki ir atzīmēti ar zvaigznīti: <abbr class=\"required\" title="
+"\"required\">*</abbr>"
 
 msgid "common.required"
 msgstr "Obligāts"
@@ -1755,7 +1757,7 @@ msgid "search.advancedSearchLess"
 msgstr "Paslēpt papildu meklēšanas iespējas"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} indeksēti raksti"
+msgstr "{$numIndexed} indeksācijai plānotie raksti"
 
 msgid "navigation.infoForReaders"
 msgstr "Lasītājiem"
@@ -2278,3 +2280,9 @@ msgstr ""
 
 msgid "validator.digits_between"
 msgstr "Tam jābūt starp {$min} un {$max} cipariem."
+
+msgid "showLess"
+msgstr "Rādīt mazāk"
+
+msgid "showAll"
+msgstr "Rādīt visu"
diff --git a/locale/lv/default.po b/locale/lv/default.po
index cafd6dff239..0a82374e1b2 100644
--- a/locale/lv/default.po
+++ b/locale/lv/default.po
@@ -1,7 +1,7 @@
 # Ieva Tiltina <pastala@gmail.com>, 2022, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-11-01 14:38+0000\n"
+"PO-Revision-Date: 2023-12-09 07:38+0000\n"
 "Last-Translator: Ieva Tiltina <pastala@gmail.com>\n"
 "Language-Team: Latvian <http://translate.pkp.sfu.ca/projects/pkp-lib/default/"
 "lv/>\n"
@@ -17,7 +17,7 @@ msgid "default.groups.name.siteAdmin"
 msgstr "Vietnes pārvaldnieks"
 
 msgid "default.groups.plural.siteAdmin"
-msgstr "Vietnes pārvaldnieki"
+msgstr "Vietnes administratori"
 
 msgid "default.groups.name.productionEditor"
 msgstr "Izstrādes redaktors"
diff --git a/locale/lv/editor.po b/locale/lv/editor.po
index 214a5a161b2..7d74f27c860 100644
--- a/locale/lv/editor.po
+++ b/locale/lv/editor.po
@@ -2,7 +2,7 @@
 # Gints Buda <gints.buda@gmail.com>, 2022.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-11-01 14:38+0000\n"
+"PO-Revision-Date: 2023-12-09 07:38+0000\n"
 "Last-Translator: Ieva Tiltina <pastala@gmail.com>\n"
 "Language-Team: Latvian <http://translate.pkp.sfu.ca/projects/pkp-lib/editor/"
 "lv/>\n"
@@ -459,15 +459,15 @@ msgid "editor.submission.createNewRound"
 msgstr "Izveidot jaunu recenzēšanas kārtu"
 
 msgid "editor.article.reviewForms"
-msgstr "Recenzenta formas"
+msgstr "Recenzijas veidlapas"
 
 msgid "editor.article.selectReviewForm"
-msgstr "Izvēlēties recenzenta forma"
+msgstr "Izvēlēties recenzijas veidlapu"
 
 msgid "editor.article.confirmChangeReviewForm"
 msgstr ""
-"Brīdinājums: Recenzenta formas maiņa ietekmēs visas atbildes, ko recenzenti "
-"ir snieguši, izmantojot šo formu. Vai tiešām vēlaties turpināt?"
+"Brīdinājums: Recenzijas veidlapas maiņa ietekmēs visas atbildes, ko "
+"recenzenti ir snieguši, izmantojot šo veidlapu. Vai tiešām vēlaties turpināt?"
 
 msgid "editor.submission.noReviewerFilesSelected"
 msgstr "Nav atlasītu failu"
@@ -613,3 +613,6 @@ msgstr "Izlaist šo e-pastu"
 
 msgid "editor.decision.stepError"
 msgstr "Radās problēma ar soli {$stepName}."
+
+msgid "reviewer.list.reviewerSameInstitution"
+msgstr "Tā pati iestāde, kas autoram"
diff --git a/locale/lv/grid.po b/locale/lv/grid.po
index d22d206d75e..8ac039f240f 100644
--- a/locale/lv/grid.po
+++ b/locale/lv/grid.po
@@ -1,7 +1,7 @@
 # Ieva Tiltina <pastala@gmail.com>, 2022, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-11-01 14:38+0000\n"
+"PO-Revision-Date: 2023-12-09 07:39+0000\n"
 "Last-Translator: Ieva Tiltina <pastala@gmail.com>\n"
 "Language-Team: Latvian <http://translate.pkp.sfu.ca/projects/pkp-lib/grid/lv/"
 ">\n"
@@ -416,7 +416,7 @@ msgid "grid.action.newVersion"
 msgstr "Izveidot jaunu versiju"
 
 msgid "grid.reviewForm.title"
-msgstr "Recenzenta forma"
+msgstr "Recenzijas veidlapas"
 
 msgid "grid.reviewFormElement.responseItems"
 msgstr "Atbildes iespējas"
diff --git a/locale/lv/manager.po b/locale/lv/manager.po
index 3d6f657e135..66679697f63 100644
--- a/locale/lv/manager.po
+++ b/locale/lv/manager.po
@@ -1,7 +1,7 @@
 # Ieva Tiltina <pastala@gmail.com>, 2022, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-11-03 11:03+0000\n"
+"PO-Revision-Date: 2023-12-09 07:39+0000\n"
 "Last-Translator: Ieva Tiltina <pastala@gmail.com>\n"
 "Language-Team: Latvian <http://translate.pkp.sfu.ca/projects/pkp-lib/manager/"
 "lv/>\n"
@@ -767,9 +767,9 @@ msgstr "Recenzenta intereses"
 
 msgid "manager.reviewerSearch.form.instructions"
 msgstr ""
-"Izmantojiet tālāk norādīto formu, lai iestatītu maksimālās vērtības "
-"terminiem, kurus vēlaties meklēt.  Forma ir iepriekš aizpildīta ar "
-"aprēķinātajiem šo lauku vidējiem lielumiem."
+"Izmantojiet tālāk norādīto veidlapu, lai iestatītu maksimālās vērtības "
+"terminiem, kurus vēlaties meklēt. Veidlapa ir iepriekš aizpildīta ar "
+"aprēķinātiem šo lauku vidējiem lielumiem."
 
 msgid "manager.roles"
 msgstr "Lomas"
@@ -1353,7 +1353,7 @@ msgid "manager.siteAccessOptions.siteAccessOptions"
 msgstr "Vietnes piekļuves iespējas"
 
 msgid "manager.statistics.statistics.count.value"
-msgstr "{$count} ({$percentage}%)"
+msgstr "{$count} ({$percentage} %)"
 
 msgid "manager.statistics.statistics.totalNewValue"
 msgstr "{$numTotal} ({$numNew} jaunu)"
@@ -1468,81 +1468,89 @@ msgstr "Spraudnis \"{$pluginName}\" veiksmīgi dzēsts"
 
 msgid "manager.plugins.description"
 msgstr ""
+"Šajā lapā pārvaldnieks var pārskatīt un, iespējams, konfigurēt pašlaik "
+"instalētos spraudņus. Spraudņi ir sadalīti kategorijās atbilstoši to "
+"funkcijām. Kategorijas uzskaitītas tālāk, un katrā kategorijā ir norādīts "
+"tās pašreizējais spraudņu komplekts."
 
 msgid "manager.plugins.doesNotExist"
-msgstr ""
+msgstr "Spraudnis \"{$pluginName}\" nepastāv"
 
 msgid "manager.plugins.fileSelectError"
-msgstr ""
+msgstr "Lūdzu, vispirms izvēlieties datni"
 
 msgid "manager.plugins.upload"
-msgstr ""
+msgstr "Augšupielādēt jaunu spraudni"
 
 msgid "manager.plugins.uploadDescription"
 msgstr ""
+"Šī veidlapa ļauj augšupielādēt un instalēt jaunu spraudni. Lūdzu, "
+"pārliecinieties, ka spraudnis ir saspiests kā .tar.gz fails."
 
 msgid "manager.plugins.uploadFailed"
-msgstr ""
+msgstr "Lūdzu, pārliecinieties, ka fails augšupielādei ir atlasīts ."
 
 msgid "manager.plugins.installed"
-msgstr ""
+msgstr "Uzstādītie spraudņi"
 
 msgid "manager.plugins.pluginGallery"
-msgstr ""
+msgstr "Spraudņu galerija"
 
 msgid "manager.plugins.pluginGallery.overview"
-msgstr ""
+msgstr "Pārskats"
 
 msgid "manager.plugins.pluginGallery.installation"
-msgstr ""
+msgstr "Uzstādīšana"
 
 msgid "manager.plugins.pluginGallery.latestCompatible"
-msgstr ""
+msgstr "Jaunākais saderīgais laidiens"
 
 msgid "manager.plugins.pluginGallery.certifications.official"
-msgstr ""
+msgstr "Oficiāls"
 
 msgid "manager.plugins.pluginGallery.certifications.official.description"
-msgstr ""
+msgstr "Šo spraudni izstrādā un uztur Public Knowledge Project komanda."
 
 msgid "manager.plugins.pluginGallery.certifications.reviewed"
-msgstr ""
+msgstr "Recenzēts"
 
 msgid "manager.plugins.pluginGallery.certifications.reviewed.description"
 msgstr ""
+"Šo spraudni ir pārskatījusi un apstiprinājusi Public Knowledge Project "
+"komanda."
 
 msgid "manager.plugins.pluginGallery.certifications.partner"
-msgstr ""
+msgstr "Sadarbības partneri"
 
 msgid "manager.plugins.pluginGallery.certifications.partner.description"
-msgstr ""
+msgstr "Šo spraudni nodrošina viens no mūsu izstrādes partneriem."
 
 msgid "manager.plugins.pluginGallery.maintainer"
-msgstr ""
+msgstr "Uzturētājs"
 
 msgid "manager.plugins.pluginGallery.version"
-msgstr ""
+msgstr "Versija v{$version} izlaista {$date}"
 
 msgid "manager.plugins.pluginGallery.homepage"
-msgstr ""
+msgstr "Mājas lapa"
 
 msgid "manager.plugins.pluginGallery.summary"
-msgstr ""
+msgstr "Kopsavilkums"
 
 msgid "manager.plugins.pluginGallery.status"
-msgstr ""
+msgstr "Satuss"
 
 msgid "manager.plugins.noInstalledVersion"
-msgstr ""
+msgstr "Spraudnis vēl nav instalēts."
 
 msgid "manager.plugins.noCompatibleVersion"
-msgstr ""
+msgstr "Pašlaik nav pieejama šī spraudņa saderīga versija."
 
 msgid "manager.plugins.installedVersionNewer"
-msgstr ""
+msgstr "Spraudnis jau ir instalēts un ir jaunāks par galerijā pieejamo versiju."
 
 msgid "manager.plugins.installedVersionOlder"
-msgstr ""
+msgstr "Spraudnis jau ir instalēts, bet to var atjaunināt uz jaunāku versiju."
 
 msgid "manager.plugins.installedVersionNewest"
 msgstr "Spraudnis jau ir instalēts un atjaunināts."
@@ -1609,217 +1617,248 @@ msgid "manager.plugins.uploadPluginDir"
 msgstr "Atlasīt spraudņa datni"
 
 msgid "manager.plugins.versionFileInvalid"
-msgstr ""
+msgstr "version.xml spraudņu direktorijā satur nederīgus datus."
 
 msgid "manager.plugins.versionFileNotFound"
-msgstr ""
+msgstr "version.xml nav atrasts spraudņu direktorijā"
 
 msgid "notification.localeEnabled"
-msgstr ""
+msgstr "Lokalizācija iespējota."
 
 msgid "notification.localeDisabled"
-msgstr ""
+msgstr "Lokalizācija atspējota."
 
 msgid "notification.primaryLocaleDefined"
-msgstr ""
+msgstr "Lokalizācija {$locale} uzstādīta kā primārā valoda."
 
 msgid "notification.localeInstalled"
-msgstr ""
+msgstr "Visas atlasītās lokalizācijas ir uzstādītas un aktivizētas."
 
 msgid "notification.localeUninstalled"
-msgstr ""
+msgstr "Lokalizācija {$locale} atiestatīta."
 
 msgid "notification.localeReloaded"
-msgstr ""
+msgstr "Lokalizācija {$locale} pārielādēta kontekstā {$contextName}."
 
 msgid "notification.localeSettingsSaved"
-msgstr ""
+msgstr "Lokalizācijas iestatījumi saglabāti."
 
 msgid "notification.localeSettingsCannotBeSaved"
 msgstr ""
+"Valodas iestatījumus neizdevās saglabāt. Vismaz vienai valodai jābūt "
+"iespējotai katram parametram"
 
 msgid "notification.editedUser"
-msgstr ""
+msgstr "Lietotājs rediģēts."
 
 msgid "manager.distribution.license"
-msgstr ""
+msgstr "Licence"
 
 msgid "manager.distribution.license.other"
-msgstr ""
+msgstr "Citas licences URL"
 
 msgid "manager.distribution.licenseTerms"
-msgstr ""
+msgstr "Licences nosacījumi"
 
 msgid "manager.distribution.licenseTerms.description"
 msgstr ""
+"Ievadiet publiskās licencēšanas nosacījumus, kurus vēlaties parādīt kopā ar "
+"publicēto darbu."
 
 msgid "manager.distribution.customHeaders"
-msgstr ""
+msgstr "Pielāgotās birkas (tags)"
 
 msgid "manager.distribution.customHeaders.description"
 msgstr ""
+"Pievienojiet pielāgotas HTML birkas (tags), dēvētas arī par meta tagiem, "
+"kuras vēlaties ievietot katras lapas galvenē. Pirms pievienojiet birkas, "
+"konsultējieties ar tehnisko konsultantu."
 
 msgid "manager.paymentMethod"
-msgstr ""
+msgstr "Maksājumi"
 
 msgid "manager.paymentMethod.title"
-msgstr ""
+msgstr "Maksājumu metodes"
 
 msgid "manager.paymentMethod.none"
-msgstr ""
+msgstr "Nav izvēlēta maksājuma metode"
 
 msgid "manager.paymentMethod.method"
-msgstr ""
+msgstr "Maksājuma metode"
 
 msgid "manager.paymentMethod.currency"
-msgstr ""
+msgstr "Valūta"
 
 msgid "settings.roles.roleOptions"
-msgstr ""
+msgstr "Lomas iestatījumi"
 
 msgid "settings.roles.showTitles"
 msgstr "Rādīt lomas nosaukumu ieguldītāju sarakstā"
 
 msgid "settings.roles.permitSelfRegistration"
-msgstr ""
+msgstr "Atļaut lietotāja pašreģistrāciju"
 
 msgid "settings.roles.recommendOnly"
 msgstr ""
+"Šai lomai atļauts tikai ieteikt recenzenta lēmumu, un galīgo lēmumu varēs "
+"reģistrēt tikai pilnvarots redaktors."
 
 msgid "settings.roles.roleName"
-msgstr ""
+msgstr "Lomas nosaukums"
 
 msgid "settings.roles.roleAbbrev"
-msgstr ""
+msgstr "Abreviatūra"
 
 msgid "settings.roles.assignedStages"
-msgstr ""
+msgstr "Piešķirtie posmi"
 
 msgid "settings.roles.stages"
-msgstr ""
+msgstr "Posmi"
 
 msgid "settings.roles.roleDetails"
-msgstr ""
+msgstr "Sīkāka informācija par lomu"
 
 msgid "settings.roles.from"
-msgstr ""
+msgstr "Atļauju līmenis"
 
 msgid "settings.roles.removeText"
 msgstr ""
+"Jūs gatavojaties noņemt šo lomu no šī konteksta. Šī darbība dzēsīs arī "
+"saistītos iestatījumus un visus šai lomai piešķirtos lietotājus. Vai "
+"vēlaties turpināt?"
 
 msgid "settings.roles.nameRequired"
-msgstr ""
+msgstr "Jums jādefinē lomas nosaukums."
 
 msgid "settings.roles.abbrevRequired"
-msgstr ""
+msgstr "Jums jādefinē lomas abreviatūra."
 
 msgid "settings.roles.uniqueName"
-msgstr ""
+msgstr "Jums jādefinē unikāls lomas nosaukums."
 
 msgid "settings.roles.uniqueAbbrev"
-msgstr ""
+msgstr "Jums jādefinē unikāla lomas abreviatūra."
 
 msgid "settings.roles.roleIdRequired"
-msgstr ""
+msgstr "Jums jādefinē lomas atļauju līmenis."
 
 msgid "settings.roles.stageIdRequired"
-msgstr ""
+msgstr "Jums jādefinē posms piešķīrumam."
 
 msgid "settings.roles.permitMetadataEdit"
-msgstr ""
+msgstr "Atļaut iesniegtā materiāla metadatu rediģēšanu."
 
 msgid "settings.libraryFiles.fileRequired"
 msgstr ""
+"Ir nepieciešams bibliotēkas fails. Lūdzu, pārliecinieties, ka esat "
+"izvēlējies un augšupielādējis failu."
 
 msgid "settings.libraryFiles.nameRequired"
-msgstr ""
+msgstr "Šim bibliotēkas failam ir jānorāda nosaukums."
 
 msgid "settings.libraryFiles.typeRequired"
-msgstr ""
+msgstr "Šim bibliotēkas failam ir nepieciešams faila tips."
 
 msgid "settings.libraryFiles.category.contracts"
-msgstr ""
+msgstr "Līgumi"
 
 msgid "settings.libraryFiles.category.marketing"
-msgstr ""
+msgstr "Mārketings"
 
 msgid "settings.libraryFiles.category.permissions"
-msgstr ""
+msgstr "Atļaujas"
 
 msgid "settings.libraryFiles.category.reports"
-msgstr ""
+msgstr "Pārskati"
 
 msgid "settings.libraryFiles.category.other"
-msgstr ""
+msgstr "Citi"
 
 msgid "settings.libraryFiles.public.viewInstructions"
 msgstr ""
+"<p>Šo bibliotēkas failu var lejupielādēt, ja ir iespējota \"Publiskā "
+"piekļuve\": <blockquote>{$downloadUrl}</blockquote></p>"
 
 msgid "settings.libraryFiles.public.selectLibraryFiles"
-msgstr ""
+msgstr "Atlasiet bibliotēkas failus, ko pievienot"
 
 msgid "grid.action.addGenre"
-msgstr ""
+msgstr "Pievienot komponentu"
 
 msgid "grid.action.editGenre"
-msgstr ""
+msgstr "Rediģēt šo komponentu"
 
 msgid "grid.action.deleteGenre"
-msgstr ""
+msgstr "Dzēst šo komponentu"
 
 msgid "grid.action.restoreGenres"
-msgstr ""
+msgstr "Atjaunot komponentu noklusējuma iestatījumus"
 
 msgid "manager.setup.genres.label"
-msgstr ""
+msgstr "Faila tips"
 
 msgid "manager.setup.genres.dependent"
 msgstr ""
+"Tie ir atkarīgi faili, piemēram, attēli, kas tiek rādīti HTML failā, un tie "
+"netiks parādīti kopā ar publicēto saturu."
 
 msgid "manager.setup.genres.supplementary"
 msgstr ""
+"Tie ir papildu faili, piemēram, datu kopas un pētniecības materiāli, un tie "
+"tiks rādīti atsevišķi no galvenajiem publikācijas failiem."
 
 msgid "manager.setup.genres.key"
-msgstr ""
+msgstr "Atslēga"
 
 msgid "manager.setup.genres.key.description"
-msgstr ""
+msgstr "Neobligāts īss simbolisks šā žanra identifikators."
 
 msgid "manager.setup.genres.key.exists"
-msgstr ""
+msgstr "Atslēga jau pastāv."
 
 msgid "manager.setup.genres.key.alphaNumeric"
 msgstr ""
+"Atslēgā var būt tikai burtciparu rakstzīmes, pasvītrojumzīmes un defises, un "
+"tai jāsākas un jābeidzas ar burta vai cipara rakstzīmi."
 
 msgid "manager.setup.genres.metatadata"
-msgstr ""
+msgstr "Faila metadati"
 
 msgid "manager.setup.genres.metatadata.description"
 msgstr ""
+"Izvēlieties metadatu veidu, ko šīs datnes var saņemt. Galvenajām "
+"publikācijas datnēm, piemēram, lejupielādējamām PDF datnēm, jāizvēlas "
+"\"Dokuments\", lai šīs datnes pārmantotu metadatus no publikācijas. Citos "
+"gadījumos vairumam datņu tipu izvēlieties \"Papildu saturs\". \"Artwork\" ("
+"\"Grafiskā datne\") ir piemērots datnēm, kurām nepieciešami atsevišķi "
+"kredīta, virsraksta un licencēšanas metadati."
 
 msgid "manager.setup.genres.submitRequired.label"
-msgstr ""
+msgstr "Pieprasīt ar iesniegtajiem materiāliem"
 
 msgid "manager.setup.genres.submitRequired.description"
 msgstr ""
+"Vai katrā jaunā iesniegumā būtu jāpieprasa vismaz viena no šīm datnēm? Ja "
+"izvēlēsieties \"jā\", autoriem nebūs atļauts iesniegt materiālu, kamēr viņi "
+"nebūs augšupielādējuši vismaz vienu šāda tipa datni."
 
 msgid "manager.setup.genres.submitRequired.yes"
-msgstr ""
+msgstr "Jā, pieprasīt, lai autori augšupielādē vienu vai vairākas šādas datnes."
 
 msgid "manager.setup.genres.submitRequired.no"
-msgstr ""
+msgstr "Nē, atļaut iesniegt materiālus bez šādām datnēm."
 
 msgid "manager.settings.wizard"
-msgstr ""
+msgstr "Iestatījumu vednis"
 
 msgid "manager.users.roleRequired"
-msgstr ""
+msgstr "Jums jāizvēlas vismaz viena loma, kas tiks saistīta ar šo lietotāju."
 
 msgid "manager.website"
-msgstr ""
+msgstr "Tīmekļa vietne"
 
 msgid "manager.website.title"
-msgstr ""
+msgstr "Tīmekļa vietnes iestatījumi"
 
 msgid "manager.workflow"
 msgstr "Darbplūsma"
@@ -1828,43 +1867,47 @@ msgid "manager.workflow.title"
 msgstr "Darbplūsmas uzstādījumi"
 
 msgid "manager.distribution"
-msgstr ""
+msgstr "Izplatīšana"
 
 msgid "manager.distribution.title"
-msgstr ""
+msgstr "Izplatīšanas uzstādījumi"
 
 msgid "manager.reviewForms"
-msgstr ""
+msgstr "Recenzijas veidlapas"
 
 msgid "manager.reviewForms.confirmActivate"
 msgstr ""
+"Vai tiešām vēlaties aktivizēt šo recenzijas veidlapu? Tiklīdz tā būs "
+"piešķirta recenzēšanai, to vairs nevarēsiet deaktivizēt."
 
 msgid "manager.reviewForms.confirmDeactivate"
 msgstr ""
+"Vai tiešām vēlaties deaktivizēt šo recenzijas veidlapu? Tā vairs nebūs "
+"pieejama jauniem recenzēšanas uzdevumiem."
 
 msgid "manager.reviewForms.confirmCopy"
-msgstr ""
+msgstr "Vai tiešām vēlaties izveidot šīs recenzijas veidlapas kopiju?"
 
 msgid "manager.reviewForms.completed"
-msgstr ""
+msgstr "Izpildīts"
 
 msgid "manager.reviewForms.confirmDelete"
-msgstr ""
+msgstr "Vai tiešām vēlaties izdzēst šo recenzijas veidlapu?"
 
 msgid "manager.reviewForms.create"
-msgstr ""
+msgstr "Izveidot recenzijas veidlapu"
 
 msgid "manager.reviewForms.description"
-msgstr ""
+msgstr "Apraksts un instrukcijas"
 
 msgid "manager.reviewForms.edit"
-msgstr ""
+msgstr "Recenzijas veidlapa"
 
 msgid "manager.reviewForms.form.titleRequired"
-msgstr ""
+msgstr "Recenzijas veidlapai nepieciešams nosaukums."
 
 msgid "manager.reviewForms.inReview"
-msgstr ""
+msgstr "Recenzēšanā"
 
 msgid "manager.reviewForms.list.description"
 msgstr ""
@@ -1876,100 +1919,102 @@ msgid "manager.reviewForms.noneCreated"
 msgstr ""
 
 msgid "manager.reviewForms.noneUsed"
-msgstr ""
+msgstr "Recenzijas veidlapas nav izmantotas."
 
 msgid "manager.reviewForms.preview"
-msgstr ""
+msgstr "Veidlapas priekšskatījums"
 
 msgid "manager.reviewForms.reviewFormData"
-msgstr ""
+msgstr "Recenzijas veidlapas dati"
 
 msgid "manager.reviewForms.title"
-msgstr ""
+msgstr "Virsraksts"
 
 msgid "manager.reviewFormElement.changeType"
-msgstr ""
+msgstr "Veidlapas elementa tipa maiņa.."
 
 msgid "manager.reviewFormElements"
-msgstr ""
+msgstr "Veidlapas elementi"
 
 msgid "manager.reviewFormElements.addResponseItem"
-msgstr ""
+msgstr "Pievienot atlasi"
 
 msgid "manager.reviewFormElements.checkboxes"
-msgstr ""
+msgstr "Izvēles rūtiņas (varat izvēlēties vienu vai vairākas)"
 
 msgid "manager.reviewFormElements.chooseType"
-msgstr ""
+msgstr "Izvēlēties elementa tipu"
 
 msgid "manager.reviewFormElements.confirmDelete"
-msgstr ""
+msgstr "Apstiprināt publicētās veidlapas elementa dzēšanu..."
 
 msgid "manager.reviewFormElements.copyTo"
-msgstr ""
+msgstr "Kopēt uz:"
 
 msgid "manager.reviewFormElements.create"
-msgstr ""
+msgstr "Izveidot jaunu elementu"
 
 msgid "manager.reviewFormElements.dropdownbox"
-msgstr ""
+msgstr "Nolaižamais izvēles lodziņš"
 
 msgid "manager.reviewFormElements.edit"
-msgstr ""
+msgstr "Rediģēt veidlapas elementu"
 
 msgid "manager.reviewFormElements.elementType"
-msgstr ""
+msgstr "Elementa tips"
 
 msgid "manager.reviewFormElements.form.elementTypeRequired"
-msgstr ""
+msgstr "Veidlapas elementam ir jānorāda elementa tips."
 
 msgid "manager.reviewFormElements.form.questionRequired"
-msgstr ""
+msgstr "Veidlapas elementam ir nepieciešams jautājums."
 
 msgid "manager.reviewFormElements.noneCreated"
-msgstr ""
+msgstr "Nav izveidoti veidlapas elementi."
 
 msgid "manager.reviewFormElements.possibleResponse"
-msgstr ""
+msgstr "Atlase"
 
 msgid "manager.reviewFormElements.question"
-msgstr ""
+msgstr "Elements"
 
 msgid "manager.reviewFormElements.description"
-msgstr ""
+msgstr "Apraksts"
 
 msgid "manager.reviewFormElements.radiobuttons"
-msgstr ""
+msgstr "Radio pogas (var izvēlēties tikai vienu)"
 
 msgid "manager.reviewFormElements.required"
-msgstr ""
+msgstr "Recenzentiem jāaizpilda elements"
 
 msgid "manager.reviewFormElements.included"
-msgstr ""
+msgstr "Iekļauts ziņā autoram"
 
 msgid "manager.reviewFormElements.smalltextfield"
-msgstr ""
+msgstr "Viena vārda teksta lauks"
 
 msgid "manager.reviewFormElements.textarea"
 msgstr "Paplašinātais teksta lauks"
 
 msgid "manager.reviewFormElements.textfield"
-msgstr ""
+msgstr "Vienas rindas teksta lauks"
 
 msgid "manager.reviewFormElements.viewable"
-msgstr ""
+msgstr "Redzams (autoriem)"
 
 msgid "grid.action.createReviewForm"
-msgstr ""
+msgstr "Izveidot jaunu recenzijas veidlapu"
 
 msgid "manager.setup.competingInterests.required"
 msgstr ""
+"Pieprasīt recenzēšanas laikā iesniegt apliecinājumu par interešu konflikta "
+"neesamību."
 
 msgid "manager.setup.licenseURLDescription"
-msgstr ""
+msgstr "URL uz tīmekļa vietni, kurā aprakstīta licence, ja pieejams."
 
 msgid "manager.setup.metadata.submission"
-msgstr ""
+msgstr "Materiāla iesniegšanas veidlapa"
 
 msgid "manager.setup.metadata.coverage"
 msgstr "Aptvērums"
@@ -1989,57 +2034,90 @@ msgstr ""
 "Neprasīt autoram sniegt aptvēruma metadatus materiāla iesniegšanas laikā."
 
 msgid "manager.setup.metadata.coverage.request"
-msgstr "Lūgt autoru sniegt aptvēruma metadatus materiāla iesniegšanas laikā."
+msgstr "Aicināt autoru materiāla iesniegšanas laikā sniegt aptvēruma metadatus."
 
 msgid "manager.setup.metadata.coverage.require"
 msgstr ""
-"Pieprasīt autoram sniegt aptvēruma metadatu ieteikumus materiāla "
-"iesniegšanas laikā."
+"Pieprasīt autoram materiāla iesniegšanas laikā sniegt aptvēruma metadatu "
+"ieteikumus."
 
 msgid "manager.setup.metadata.keywords.description"
 msgstr ""
+"Atslēgvārdi – parasti viena līdz trīs vārdu frāzes, ko izmanto, lai norādītu "
+"materiāla galvenās tēmas."
 
 msgid "manager.setup.metadata.keywords.enable"
-msgstr ""
+msgstr "Iespējot atslēgvārdu metadatus"
 
 msgid "manager.setup.metadata.keywords.noRequest"
-msgstr ""
+msgstr "Iesniegšanas laikā autoram nepieprasīt atslēgvārdus."
 
 msgid "manager.setup.metadata.keywords.request"
-msgstr ""
+msgstr "Aicināt autoru materiāla iesniegšanas laikā norādīt atslēgvārdus."
 
 msgid "manager.setup.metadata.keywords.require"
+msgstr "Pieprasīt autoram pirms materiāla pieņemšanas norādīt atslēgvārdus."
+
+msgid "manager.setup.metadata.languages.description"
 msgstr ""
+"Valoda norāda darba galveno valodu, izmantojot valodas kodu (\"lv\") ar "
+"izvēles valsts kodu (\"lv_LV\")."
+
+msgid "manager.setup.metadata.languages.enable"
+msgstr "Iespējot valodas metadatus"
+
+msgid "manager.setup.metadata.languages.noRequest"
+msgstr ""
+"Nepieprasīt autoram materiāla iesniegšanas laikā norādīt iesniegtā materiāla "
+"valodas."
+
+msgid "manager.setup.metadata.languages.request"
+msgstr ""
+"Aicināt autoru materiāla iesniegšanas laikā norādīt iesniegtā materiāla "
+"valodas."
+
+msgid "manager.setup.metadata.languages.require"
+msgstr ""
+"Pieprasīt autoram pirms materiāla pieņemšanas ievadīt iesniegtā materiāla "
+"valodas."
 
 msgid "manager.setup.metadata.rights.description"
 msgstr ""
+"Jebkuras tiesības, kas attiecas uz iesniegto materiālu, tostarp intelektuālā "
+"īpašuma tiesības, autortiesības un dažādas īpašumtiesības."
 
 msgid "manager.setup.metadata.rights.enable"
-msgstr ""
+msgstr "Iespējot tiesību metadatus"
 
 msgid "manager.setup.metadata.rights.noRequest"
-msgstr ""
+msgstr "Nepieprasīt autoram materiāla iesniegšanas laikā atklāt savas tiesības."
 
 msgid "manager.setup.metadata.rights.request"
 msgstr ""
+"Aicināt autoru materiāla iesniegšanas laikā atklāt jau pastāvošas piekļuves "
+"tiesības."
 
 msgid "manager.setup.metadata.rights.require"
 msgstr ""
+"Pieprasīt autoram pirms iesniegtā materiāla pieņemšanas atklāt visas "
+"pastāvošās piekļuves tiesības."
 
 msgid "manager.setup.metadata.source.description"
 msgstr ""
+"Avots var būt cita darba vai resursa ID, piemēram, DOI, no kura iesniegtais "
+"materiāls ir atvasināts."
 
 msgid "manager.setup.metadata.source.enable"
-msgstr ""
+msgstr "Iespējot avota metadatus"
 
 msgid "manager.setup.metadata.source.noRequest"
-msgstr ""
+msgstr "Nepieprasīt autoram avota URL adresi materiāla iesniegšanas laikā."
 
 msgid "manager.setup.metadata.source.request"
-msgstr ""
+msgstr "Aicināt autoru materiāla iesniegšanas laikā norādīt avota URL adresi."
 
 msgid "manager.setup.metadata.source.require"
-msgstr ""
+msgstr "Pieprasīt autoram pirms materiāla pieņemšanas norādīt avota URL adresi."
 
 msgid "manager.setup.metadata.subjects.description"
 msgstr ""
@@ -2051,7 +2129,7 @@ msgid "manager.setup.metadata.subjects.noRequest"
 msgstr ""
 
 msgid "manager.setup.metadata.subjects.request"
-msgstr ""
+msgstr "Aicināt autoru materiāla iesniegšanas laikā norādīt tematu."
 
 msgid "manager.setup.metadata.subjects.require"
 msgstr ""
@@ -2066,7 +2144,7 @@ msgid "manager.setup.metadata.type.noRequest"
 msgstr ""
 
 msgid "manager.setup.metadata.type.request"
-msgstr ""
+msgstr "Aicināt autoru materiāla iesniegšanas laikā norādīt tipu."
 
 msgid "manager.setup.metadata.type.require"
 msgstr ""
@@ -2081,7 +2159,7 @@ msgid "manager.setup.metadata.disciplines.noRequest"
 msgstr ""
 
 msgid "manager.setup.metadata.disciplines.request"
-msgstr ""
+msgstr "Aicināt autoru materiāla iesniegšanas laikā norādīt nozari."
 
 msgid "manager.setup.metadata.disciplines.require"
 msgstr ""
@@ -2097,6 +2175,8 @@ msgstr ""
 
 msgid "manager.setup.metadata.agencies.request"
 msgstr ""
+"Aicināt autoru materiāla iesniegšanas laikā norādīt informāciju par atbalsta "
+"aģentūrām."
 
 msgid "manager.setup.metadata.agencies.require"
 msgstr ""
@@ -2112,6 +2192,7 @@ msgstr ""
 
 msgid "manager.setup.metadata.citations.request"
 msgstr ""
+"Aicināt autoru materiāla iesniegšanas laikā norādīt bibliogrāfiskās atsauces."
 
 msgid "manager.setup.metadata.citations.require"
 msgstr ""
@@ -2127,6 +2208,8 @@ msgstr ""
 
 msgid "manager.setup.metadata.dataAvailability.request"
 msgstr ""
+"Aicināt autoru materiāla iesniegšanas laikā norādīt datu pieejamības "
+"paziņojumu."
 
 msgid "manager.setup.metadata.dataAvailability.require"
 msgstr ""
@@ -2342,9 +2425,14 @@ msgstr ""
 
 msgid "manager.navigationMenus.subscriptions.conditionalWarning"
 msgstr ""
+"Šī saite tiks rādīta tikai tad, ja sadaļā Iestatījumi > Izplatīšana > "
+"Maksājumi ir iespējoti maksājumi."
 
 msgid "manager.navigationMenus.mySubscriptions.conditionalWarning"
 msgstr ""
+"Šī saite tiks parādīta tikai tad, ja apmeklētājs ir pieteicies, ja sadaļā "
+"Iestatījumi > Izplatīšana > Maksājumi ir iespējoti maksājumi un ja sadaļā "
+"Iestatījumi > Izplatīšana > Piekļuve ir nepieciešami abonementi."
 
 msgid "manager.navigationMenus.search.description"
 msgstr ""
@@ -3358,3 +3446,16 @@ msgstr "Vai tiešām vēlaties dzēst {$title}? Šo darbību nevar atsaukt."
 
 msgid "manager.highlights.url.description"
 msgstr "Pilns izceltās pogas URL, tostarp https://."
+
+msgid "manager.image"
+msgstr "Attēls"
+
+msgid "manager.announcements.notEnabled"
+msgstr ""
+"Jums ir <a href=\"#announcements/announcement-settings\">jāiespējo "
+"paziņojumi</a>."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Prasība autoriem kopā ar manuskriptu iesniegt apliecinājumu par interešu "
+"konflikta neesamību."
diff --git a/locale/lv/reviewer.po b/locale/lv/reviewer.po
index 902b09da3c0..d57a54b57ee 100644
--- a/locale/lv/reviewer.po
+++ b/locale/lv/reviewer.po
@@ -1,7 +1,7 @@
 # Ieva Tiltina <pastala@gmail.com>, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-11-01 14:38+0000\n"
+"PO-Revision-Date: 2023-12-09 07:39+0000\n"
 "Last-Translator: Ieva Tiltina <pastala@gmail.com>\n"
 "Language-Team: Latvian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "reviewer/lv/>\n"
@@ -87,8 +87,8 @@ msgstr ""
 
 msgid "reviewer.submission.reviewDescription"
 msgstr ""
-"Ievadiet (vai ielīmējiet) savu atsauksmi par šo materiālu zemāk redzamajā "
-"formā."
+"Ievadiet (vai ielīmējiet) savu recenziju par šo materiālu zemāk redzamajā "
+"veidlapā."
 
 msgid "reviewer.complete"
 msgstr "Recenzija iesniegta"
diff --git a/locale/lv/submission.po b/locale/lv/submission.po
index 4be8efd434b..74ce5dbc5f9 100644
--- a/locale/lv/submission.po
+++ b/locale/lv/submission.po
@@ -1,7 +1,7 @@
 # Ieva Tiltina <pastala@gmail.com>, 2022, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-11-03 11:03+0000\n"
+"PO-Revision-Date: 2023-12-09 07:39+0000\n"
 "Last-Translator: Ieva Tiltina <pastala@gmail.com>\n"
 "Language-Team: Latvian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "submission/lv/>\n"
@@ -2277,7 +2277,7 @@ msgid "submission.review.status.complete"
 msgstr "Recenzēšana pabeigta."
 
 msgid "submission.art"
-msgstr "Attēls"
+msgstr "Grafiskā datne"
 
 msgid "submission.supplementary"
 msgstr "Papildu saturs"
@@ -2292,13 +2292,13 @@ msgid "submission.supplementary.publisher"
 msgstr "Izdevējs"
 
 msgid "submission.reviewForm"
-msgstr "Recenzenta forma"
+msgstr "Recenzijas veidlapa"
 
 msgid "submission.reviewFormResponse"
-msgstr "Recenzenta formas atbilde"
+msgstr "Recenzijas veidlapas atbilde"
 
 msgid "grid.action.createReviewFormElement"
-msgstr "Izveidot jaunu recenzenta formas elementu"
+msgstr "Izveidot jaunu recenzijas veidlapas elementu"
 
 msgid "grid.action.editMetadata"
 msgstr "Rediģēt metadatus"
@@ -2661,3 +2661,9 @@ msgstr "Dokuments"
 
 msgid "grid.category.categories"
 msgstr "Kategorijas"
+
+msgid "submission.authors.label"
+msgstr "Autori"
+
+msgid "submission.author.list"
+msgstr "Iesniegto materiālu autoru saraksts"
diff --git a/locale/lv/user.po b/locale/lv/user.po
index 80cf8d52f7a..48417515d37 100644
--- a/locale/lv/user.po
+++ b/locale/lv/user.po
@@ -1,7 +1,7 @@
 # Ieva Tiltina <pastala@gmail.com>, 2022, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-11-03 11:03+0000\n"
+"PO-Revision-Date: 2023-12-09 07:39+0000\n"
 "Last-Translator: Ieva Tiltina <pastala@gmail.com>\n"
 "Language-Team: Latvian <http://translate.pkp.sfu.ca/projects/pkp-lib/user/lv/"
 ">\n"
diff --git a/locale/mk/admin.po b/locale/mk/admin.po
index 7d85bf771bc..563866af18f 100644
--- a/locale/mk/admin.po
+++ b/locale/mk/admin.po
@@ -1,8 +1,9 @@
 # Emilija Andonoska <emilija-andonoska@hotmail.com>, 2023.
+# Mirko Spiroski <mspiroski@id-press.eu>, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-03-17 13:48+0000\n"
-"Last-Translator: Emilija Andonoska <emilija-andonoska@hotmail.com>\n"
+"PO-Revision-Date: 2023-12-11 11:51+0000\n"
+"Last-Translator: Mirko Spiroski <mspiroski@id-press.eu>\n"
 "Language-Team: Macedonian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "admin/mk/>\n"
 "Language: mk\n"
@@ -10,7 +11,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "admin.systemInfo.settingName"
 msgstr "Име на подесувањето"
@@ -554,7 +555,7 @@ msgstr ""
 
 msgid "admin.cli.tool.jobs.available.options.run.description"
 msgstr ""
-"Испратете достапни работни места во редот. ако сакате да испратите работа во "
+"Испратете достапни работни места во редот. За да испратите работа во "
 "одредена редица, поминете го параметарот --queue=QUEUE_NAME. Исто така, може "
 "само да помине --тест за да се изврши тест-задачата и --еднаш за да се "
 "изврши една работа во исто време"
@@ -937,3 +938,18 @@ msgstr "Стартувај го работникот daemon за тест ред
 
 #~ msgid "admin.languages.download"
 #~ msgstr "Симнете локализација"
+
+msgid "admin.settings.statistics.sushiPlatform.isSiteSushiPlatform"
+msgstr "Користи ја страницата како платформа за сите списанија."
+
+msgid "admin.settings.sharedReviewerStatistics"
+msgstr "Статистика за рецензенти"
+
+msgid "admin.settings.sharedReviewerStatistics.description"
+msgstr ""
+"Во мултиконтекстната инсталација, статистиката на рецензентите, како што е "
+"бројот на поднесени критики, може да се прикаже или поединечно за секој "
+"контекст или збирно."
+
+msgid "admin.settings.sharedReviewerStatistics.disable"
+msgstr "Оневозможи збирна статистика на рецензентите"
diff --git a/locale/mk/api.po b/locale/mk/api.po
index 43e51a561fe..a9918a9b694 100644
--- a/locale/mk/api.po
+++ b/locale/mk/api.po
@@ -2,7 +2,7 @@
 # Mirko Spiroski <mspiroski@id-press.eu>, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-05-06 11:49+0000\n"
+"PO-Revision-Date: 2023-11-21 21:11+0000\n"
 "Last-Translator: Mirko Spiroski <mspiroski@id-press.eu>\n"
 "Language-Team: Macedonian <http://translate.pkp.sfu.ca/projects/pkp-lib/api/"
 "mk/>\n"
@@ -11,7 +11,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "api.400.paramNotSupported"
 msgstr "Параметарот {$param} не е поддржан."
@@ -371,3 +371,17 @@ msgstr "Неуспешната работа е успешно избришана
 #~ msgstr ""
 #~ "Се случи неочекувана грешка. Вчитајте ја страницата повторно и обидете се "
 #~ "повторно."
+
+msgid "api.400.errorUploadingImage"
+msgstr "Има грешка при внесување на оваа слика."
+
+msgid "api.highlights.400.noOrderData"
+msgstr "Потенцираниот ред не може да се сними затоа што не е најден редослед."
+
+msgid "api.highlights.400.orderHighlightNotFound"
+msgstr ""
+"Потенцираниот ред не може да се сними затоа што едно или повеќе потенцирања "
+"не се најдени."
+
+msgid "api.highlights.404.highlightNotFound"
+msgstr "Потенцирањето што го барате не е најдено."
diff --git a/locale/mk/common.po b/locale/mk/common.po
index 522ccea21fd..7f6eae6608a 100644
--- a/locale/mk/common.po
+++ b/locale/mk/common.po
@@ -1,10 +1,10 @@
-# Mirko Spiroski <mspiroski@id-press.eu>, 2021.
+# Mirko Spiroski <mspiroski@id-press.eu>, 2021, 2023.
 # Emilija Andonoska <emilija-andonoska@hotmail.com>, 2023.
 # Teodora Fildishevska <t.fildishevska@gmail.com>, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-03-31 08:40+0000\n"
-"Last-Translator: Teodora Fildishevska <t.fildishevska@gmail.com>\n"
+"PO-Revision-Date: 2023-11-27 16:38+0000\n"
+"Last-Translator: Mirko Spiroski <mspiroski@id-press.eu>\n"
 "Language-Team: Macedonian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "common/mk/>\n"
 "Language: mk\n"
@@ -12,7 +12,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "common.publicKnowledgeProject"
 msgstr "Проект за општо знаење"
@@ -774,7 +774,9 @@ msgid "common.replaceFile"
 msgstr "Замени фајл"
 
 msgid "common.requiredField"
-msgstr "* означува задолжително поле"
+msgstr ""
+"Потребните полиња се означени со ѕвездичка: <abbr class=\"required\" title="
+"\"required\">*</abbr>"
 
 msgid "common.required"
 msgstr "Задолжително"
@@ -1687,7 +1689,7 @@ msgid "search.cli.rebuildIndex.error"
 msgstr "грешка"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} статии индексирани"
+msgstr "{$numIndexed} статии планирани за индексирање"
 
 msgid "search.coverage"
 msgstr "Покритие"
@@ -2349,3 +2351,15 @@ msgstr "Авторот е уреден."
 
 #~ msgid "search.noKeywordError"
 #~ msgstr "Мора да внесете барем еден клучен збор за пребарување."
+
+msgid "showAll"
+msgstr "Прикажи ги сите"
+
+msgid "showLess"
+msgstr "Прикажи помалку"
+
+msgid "common.highlight"
+msgstr "Потенцирање"
+
+msgid "common.highlights"
+msgstr "Потенцирања"
diff --git a/locale/mk/editor.po b/locale/mk/editor.po
index c1ab4826752..e06cf5915a5 100644
--- a/locale/mk/editor.po
+++ b/locale/mk/editor.po
@@ -1,8 +1,9 @@
 # Emilija Andonoska <emilija-andonoska@hotmail.com>, 2023.
+# Mirko Spiroski <mspiroski@id-press.eu>, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-03-15 15:39+0000\n"
-"Last-Translator: Emilija Andonoska <emilija-andonoska@hotmail.com>\n"
+"PO-Revision-Date: 2023-11-21 21:11+0000\n"
+"Last-Translator: Mirko Spiroski <mspiroski@id-press.eu>\n"
 "Language-Team: Macedonian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "editor/mk/>\n"
 "Language: mk\n"
@@ -10,7 +11,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "editor.submissionArchive.confirmDelete"
 msgstr "Дали сте сигурни дека сакате трајно да го избришете овој поднесок?"
@@ -621,3 +622,6 @@ msgstr "Имаше проблем со чекорот {$stepName}."
 
 #~ msgid "reviewer.list.count"
 #~ msgstr "{$count} рецензенти"
+
+msgid "reviewer.list.reviewerSameInstitution"
+msgstr "Иста институција како автор"
diff --git a/locale/mk/manager.po b/locale/mk/manager.po
index f8a1622ffb5..ea3e22017cb 100644
--- a/locale/mk/manager.po
+++ b/locale/mk/manager.po
@@ -2,7 +2,7 @@
 # Emilija Andonoska <emilija-andonoska@hotmail.com>, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-08-01 08:25+0000\n"
+"PO-Revision-Date: 2023-11-27 16:39+0000\n"
 "Last-Translator: Mirko Spiroski <mspiroski@id-press.eu>\n"
 "Language-Team: Macedonian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "manager/mk/>\n"
@@ -11,7 +11,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "manager.website.information"
 msgstr "Информација"
@@ -1573,8 +1573,7 @@ msgstr ""
 "Плагинот е веќе инсталиран и е понова од верзијата достапна во галеријата."
 
 msgid "manager.plugins.installedVersionOlder"
-msgstr ""
-"Плагинот е веќе инсталиран и е понова од верзијата достапна во галеријата."
+msgstr "Плагинот е веќе инсталиран, но може да се обнови со понова верзија."
 
 msgid "manager.plugins.installedVersionNewest"
 msgstr "Плагинот веќе инсталиран и ажуриран."
@@ -3687,3 +3686,42 @@ msgstr ""
 
 msgid "emailTemplate.variable.activateUrl"
 msgstr "Линк за валидација на и-мејл"
+
+msgid "manager.announcements.notEnabled"
+msgstr ""
+"Мора да <a href=\"#announcements/announcement-settings\">овозможите "
+"најава</a>."
+
+msgid "manager.image"
+msgstr "Слика"
+
+msgid "manager.highlights.add"
+msgstr "Додади потенцирање"
+
+msgid "manager.highlights.confirmDelete"
+msgstr ""
+"Сигурни сте дека саката да го избришете {$title}? Оваа постапка не може да "
+"се отповика."
+
+msgid "manager.highlights.delete"
+msgstr "Избриши Потенцирање"
+
+msgid "manager.highlights.edit"
+msgstr "Поправи Потенцирање"
+
+msgid "manager.highlights.image"
+msgstr "Слика"
+
+msgid "manager.highlights.url.description"
+msgstr "Целосен УРЛ, вклучувајќи https://, за копчето во потенцирање."
+
+msgid "manager.highlights.urlText"
+msgstr "Ознака на Копче"
+
+msgid "manager.highlights.urlText.description"
+msgstr "Ознака, како Прочитај Повеќе, за копчето во потенцирање."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Потребно е да ги доставите авторите да поднесат изјава за натпреварувачки "
+"интерес (КИ) со нивно поднесување."
diff --git a/locale/mk/submission.po b/locale/mk/submission.po
index a6ef077fd19..50500d75134 100644
--- a/locale/mk/submission.po
+++ b/locale/mk/submission.po
@@ -2,7 +2,7 @@
 # Mirko Spiroski <mspiroski@id-press.eu>, 2023.
 msgid ""
 msgstr ""
-"PO-Revision-Date: 2023-08-01 08:25+0000\n"
+"PO-Revision-Date: 2023-11-21 21:11+0000\n"
 "Last-Translator: Mirko Spiroski <mspiroski@id-press.eu>\n"
 "Language-Team: Macedonian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "submission/mk/>\n"
@@ -11,7 +11,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "author.editPublishedDisabled"
 msgstr "Не може да се уредува затоа што списанието веќе е објавено."
@@ -2684,3 +2684,9 @@ msgstr "Фајлот на поднесокот"
 
 msgid "editor.submission.roundStatus.returnedToReview"
 msgstr "Врати назад за рецензирање."
+
+msgid "submission.authors.label"
+msgstr "Автори"
+
+msgid "submission.author.list"
+msgstr "Поднеси Листа на автори"
diff --git a/locale/mn/manager.po b/locale/mn/manager.po
index d1b45945db0..6ed35fa32d1 100644
--- a/locale/mn/manager.po
+++ b/locale/mn/manager.po
@@ -3046,3 +3046,6 @@ msgstr ""
 
 msgid "mailable.submissionNeedsEditor.name"
 msgstr ""
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
diff --git a/locale/ms/manager.po b/locale/ms/manager.po
index ea7a0099b33..488bdbac09b 100644
--- a/locale/ms/manager.po
+++ b/locale/ms/manager.po
@@ -3422,3 +3422,8 @@ msgstr ""
 #~ msgstr ""
 #~ "E-mel ini dihantar oleh Editor Bahagian untuk mengingatkan pengulas "
 #~ "bahawa ulasan tamat."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Wajib mengemukakan Pengarang untuk mengemukakan pernyataan Konflik "
+"Kepentingan dengan penyerahannya."
diff --git a/locale/nb/manager.po b/locale/nb/manager.po
index fff01b38187..f9ed58a1a32 100644
--- a/locale/nb/manager.po
+++ b/locale/nb/manager.po
@@ -3474,3 +3474,8 @@ msgstr ""
 #~ msgstr ""
 #~ "Denne e-posten sendes av en redaktør til en fagfelle for å minne om at "
 #~ "fagfellevurderingen ventes ferdigstilt innen fristen."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Krev at forfattere som sender inn manuskript samtidig sender inn en "
+"<I>«Erklæring om interessekonflikter»</I>."
diff --git a/locale/nl/manager.po b/locale/nl/manager.po
index 977956d93aa..7d89aa766c8 100644
--- a/locale/nl/manager.po
+++ b/locale/nl/manager.po
@@ -3398,3 +3398,8 @@ msgstr ""
 #~ msgstr ""
 #~ "Deze e-mail wordt door de sectieredacteur verstuurd om een reviewer eraan "
 #~ "te herinneren dat de afgesproken reviewperiode verstreken is."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Verplicht auteurs een verklaring omtrent  strijdige belangen in te dienen "
+"met hun inzending."
diff --git a/locale/pl/manager.po b/locale/pl/manager.po
index 4d54825e207..3f59666325f 100644
--- a/locale/pl/manager.po
+++ b/locale/pl/manager.po
@@ -3743,3 +3743,6 @@ msgid "plugins.importexport.common.error.publicationCoverImageMissing"
 msgstr ""
 "Obraz okładki publikacji {$id} nie został wyeksportowany, ponieważ "
 "zawierający go plik nie został znaleziony w ścieżce \"{$path}\"."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr "Wymagaj od autorów oświadczenia o zbieżności zainteresowań."
diff --git a/locale/pt_BR/common.po b/locale/pt_BR/common.po
index 22011d577ee..689472d7c6d 100644
--- a/locale/pt_BR/common.po
+++ b/locale/pt_BR/common.po
@@ -7,16 +7,16 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-09-30T11:54:13-07:00\n"
-"PO-Revision-Date: 2023-02-23 08:16+0000\n"
+"PO-Revision-Date: 2023-11-23 15:46+0000\n"
 "Last-Translator: Diego José Macêdo <diegojmacedo@gmail.com>\n"
-"Language-Team: Portuguese (Brazil) <http://translate.pkp.sfu.ca/projects/pkp-"
-"lib/common/pt_BR/>\n"
+"Language-Team: Portuguese (Brazil) <http://translate.pkp.sfu.ca/projects/"
+"pkp-lib/common/pt_BR/>\n"
 "Language: pt_BR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "common.publicKnowledgeProject"
 msgstr "Public Knowledge Project"
@@ -531,7 +531,7 @@ msgid "common.languages"
 msgstr "Idiomas"
 
 msgid "common.lastSaved"
-msgstr "Último salvo {$quando}"
+msgstr "Último salvo {$when}"
 
 msgid "common.lastActivity"
 msgstr "Última atividade registrada em {$date}."
@@ -911,7 +911,7 @@ msgstr "Alterações não salvas"
 
 msgid "common.unsavedChangesMessage"
 msgstr ""
-"Encontramos alterações não salvas de {$quando}. Isso pode acontecer se você "
+"Encontramos alterações não salvas de {$when}. Isso pode acontecer se você "
 "perder a conexão com o servidor durante o trabalho. A restauração dessas "
 "alterações pode substituir quaisquer alterações feitas desde então. Gostaria "
 "de restaurar essas alterações agora?"
diff --git a/locale/pt_BR/manager.po b/locale/pt_BR/manager.po
index bf506703890..913fc068b1d 100644
--- a/locale/pt_BR/manager.po
+++ b/locale/pt_BR/manager.po
@@ -3712,3 +3712,8 @@ msgstr ""
 
 msgid "emailTemplate.variable.activateUrl"
 msgstr "O link para validar uma conta de e-mail"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Exigir dos autores o registro de conflito de interesses (CI) junto com a "
+"submissão."
diff --git a/locale/pt_PT/common.po b/locale/pt_PT/common.po
index c2dac9543b9..3d57d446389 100644
--- a/locale/pt_PT/common.po
+++ b/locale/pt_PT/common.po
@@ -5,7 +5,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:58+00:00\n"
-"PO-Revision-Date: 2023-10-31 11:06+0000\n"
+"PO-Revision-Date: 2023-11-27 16:38+0000\n"
 "Last-Translator: José Carvalho <jcarvalho@keep.pt>\n"
 "Language-Team: Portuguese (Portugal) <http://translate.pkp.sfu.ca/projects/"
 "pkp-lib/common/pt_PT/>\n"
@@ -14,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "common.publicKnowledgeProject"
 msgstr "Public Knowledge Project"
@@ -773,7 +773,9 @@ msgid "common.replaceFile"
 msgstr "Substituir ficheiro"
 
 msgid "common.requiredField"
-msgstr "* Indica campo obrigatório"
+msgstr ""
+"Os campos obrigatórios são identificados com <abbr class=\"required\" title="
+"\"required\">*</abbr>"
 
 msgid "common.required"
 msgstr "Obrigatório"
@@ -1687,7 +1689,7 @@ msgid "search.cli.rebuildIndex.error"
 msgstr "erro"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} artigos indexados"
+msgstr "{$numIndexed} artigos agendados para indexação"
 
 msgid "search.coverage"
 msgstr "Cobertura"
@@ -2313,3 +2315,9 @@ msgstr "Destaque"
 
 msgid "common.highlights"
 msgstr "Destaques"
+
+msgid "showAll"
+msgstr "Mostrar tudo"
+
+msgid "showLess"
+msgstr "Mostrar menos"
diff --git a/locale/pt_PT/editor.po b/locale/pt_PT/editor.po
index c0be0a64089..c18aff43782 100644
--- a/locale/pt_PT/editor.po
+++ b/locale/pt_PT/editor.po
@@ -6,8 +6,8 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:58+00:00\n"
-"PO-Revision-Date: 2023-04-21 23:28+0000\n"
-"Last-Translator: Judite Leite de Oliveira Dias <judite.dias@usdb.uminho.pt>\n"
+"PO-Revision-Date: 2023-11-27 16:38+0000\n"
+"Last-Translator: José Carvalho <jcarvalho@keep.pt>\n"
 "Language-Team: Portuguese (Portugal) <http://translate.pkp.sfu.ca/projects/"
 "pkp-lib/editor/pt_PT/>\n"
 "Language: pt_PT\n"
@@ -15,7 +15,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "editor.submissionArchive.confirmDelete"
 msgstr "Deseja realmente eliminar esta submissão?"
@@ -619,3 +619,6 @@ msgstr "Não enviar e-mail"
 
 msgid "editor.decision.stepError"
 msgstr "Houve um problema com a etapa {$stepName}."
+
+msgid "reviewer.list.reviewerSameInstitution"
+msgstr "Mesma afiliação do autor"
diff --git a/locale/pt_PT/manager.po b/locale/pt_PT/manager.po
index 53c4db65f03..d79d400e875 100644
--- a/locale/pt_PT/manager.po
+++ b/locale/pt_PT/manager.po
@@ -8,7 +8,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:58+00:00\n"
-"PO-Revision-Date: 2023-10-31 11:06+0000\n"
+"PO-Revision-Date: 2023-11-27 16:38+0000\n"
 "Last-Translator: José Carvalho <jcarvalho@keep.pt>\n"
 "Language-Team: Portuguese (Portugal) <http://translate.pkp.sfu.ca/projects/"
 "pkp-lib/manager/pt_PT/>\n"
@@ -17,7 +17,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "manager.website.information"
 msgstr "Informação"
@@ -3714,3 +3714,15 @@ msgstr "Apagar Destaque"
 
 msgid "manager.highlights.edit"
 msgstr "Editar Destaque"
+
+msgid "manager.announcements.notEnabled"
+msgstr ""
+"Deve <a href=\"#announcements/announcement-settings\">ativar as notícias</a>."
+
+msgid "manager.image"
+msgstr "Imagem"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Exigir aos Autores o registo de Conflito de Interesses (CI) juntamente com a "
+"submissão."
diff --git a/locale/pt_PT/submission.po b/locale/pt_PT/submission.po
index bd57f9aedce..dc0fcf6a598 100644
--- a/locale/pt_PT/submission.po
+++ b/locale/pt_PT/submission.po
@@ -5,8 +5,8 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:59+00:00\n"
-"PO-Revision-Date: 2023-04-21 23:28+0000\n"
-"Last-Translator: Carla Marques <carla.marques@usdb.uminho.pt>\n"
+"PO-Revision-Date: 2023-11-27 16:38+0000\n"
+"Last-Translator: José Carvalho <jcarvalho@keep.pt>\n"
 "Language-Team: Portuguese (Portugal) <http://translate.pkp.sfu.ca/projects/"
 "pkp-lib/submission/pt_PT/>\n"
 "Language: pt_PT\n"
@@ -14,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.13.1\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "author.editPublishedDisabled"
 msgstr ""
@@ -2705,3 +2705,9 @@ msgstr "Regressou para revisão."
 
 #~ msgid "editor.submission.decision.backToSubmission"
 #~ msgstr "Voltar à Submissão"
+
+msgid "submission.authors.label"
+msgstr "Autores"
+
+msgid "submission.author.list"
+msgstr "Lista de Autores"
diff --git a/locale/ro/manager.po b/locale/ro/manager.po
index fb3e5fc49e9..716eef23772 100644
--- a/locale/ro/manager.po
+++ b/locale/ro/manager.po
@@ -3479,3 +3479,8 @@ msgstr ""
 #~ "Acest email este trimis de un editor pentru a reaminti evaluatorului că "
 #~ "evaluarea sa trebuia trimisă. Acest email este utilizat atunci când un "
 #~ "editor trimite manual un memento evaluatorului"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Solicitați autorilor care înregistrează manuscrise să depună o declarație de "
+"interes (CI) odată cu transmiterea lor."
diff --git a/locale/ru/admin.po b/locale/ru/admin.po
index c23b366d65c..f782318044f 100644
--- a/locale/ru/admin.po
+++ b/locale/ru/admin.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:59+00:00\n"
-"PO-Revision-Date: 2023-05-01 13:49+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Pavel Pisklakov <ppv1979@mail.ru>\n"
 "Language-Team: Russian <http://translate.pkp.sfu.ca/projects/pkp-lib/admin/"
 "ru/>\n"
@@ -12,9 +12,9 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.13.1\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "admin.systemInfo.settingName"
 msgstr "Задаем название"
@@ -561,7 +561,7 @@ msgstr ""
 "Добавление доступных задач в очередь. Если вы хотите добавить задачу в "
 "определенную очередь, передайте параметр --queue=QUEUE_NAME. Также можно "
 "просто передать --test для запуска тестовой задачи и --once для запуска "
-"одной задачи за раз"
+"одной задачи за раз."
 
 msgid "admin.cli.tool.jobs.available.options.run.completed.description"
 msgstr "Завершено выполнение {$jobCount} задач в очереди с именем {$queueName}."
@@ -928,3 +928,6 @@ msgstr ""
 
 msgid "admin.cli.tool.jobs.work.option.test.description"
 msgstr "Запустить рабочий сервис-демон для тестовой очереди"
+
+msgid "admin.settings.statistics.sushiPlatform.isSiteSushiPlatform"
+msgstr "Использовать сайт как платформу для всех журналов."
diff --git a/locale/ru/api.po b/locale/ru/api.po
index a5b6d636121..16e7901360b 100644
--- a/locale/ru/api.po
+++ b/locale/ru/api.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:59+00:00\n"
-"PO-Revision-Date: 2023-05-01 13:49+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Pavel Pisklakov <ppv1979@mail.ru>\n"
 "Language-Team: Russian <http://translate.pkp.sfu.ca/projects/pkp-lib/api/ru/>"
 "\n"
@@ -12,9 +12,9 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.13.1\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "api.400.paramNotSupported"
 msgstr "Параметр «{$param}» не поддерживается."
@@ -360,3 +360,19 @@ msgid "api.jobs.200.failedJobDeleteSucceed"
 msgstr ""
 "Задача, завершившаяся неудачей, была успешно удалена из списка задач, "
 "завершившихся неудачей."
+
+msgid "api.400.errorUploadingImage"
+msgstr "При загрузке этого изображения произошла ошибка."
+
+msgid "api.highlights.400.noOrderData"
+msgstr ""
+"Не удалось сохранить порядок выделения, так как не найдена упорядоченная "
+"информация."
+
+msgid "api.highlights.400.orderHighlightNotFound"
+msgstr ""
+"Не удалось сохранить порядок выделения, так как одно или несколько выделений "
+"не были найдены."
+
+msgid "api.highlights.404.highlightNotFound"
+msgstr "Запрашиваемое вами выделение не найдено."
diff --git a/locale/ru/common.po b/locale/ru/common.po
index 7b464298794..c6374040e21 100644
--- a/locale/ru/common.po
+++ b/locale/ru/common.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:49:59+00:00\n"
-"PO-Revision-Date: 2023-05-01 13:49+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Pavel Pisklakov <ppv1979@mail.ru>\n"
 "Language-Team: Russian <http://translate.pkp.sfu.ca/projects/pkp-lib/common/"
 "ru/>\n"
@@ -12,9 +12,9 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.13.1\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "common.publicKnowledgeProject"
 msgstr "Public Knowledge Project"
@@ -773,7 +773,9 @@ msgid "common.replaceFile"
 msgstr "Заменить файл"
 
 msgid "common.requiredField"
-msgstr "* обозначает обязательное поле"
+msgstr ""
+"Обязательные поля обозначены звёздочкой: <abbr class=\"required\" title="
+"\"required\">*</abbr>"
 
 msgid "common.required"
 msgstr "Обязательно"
@@ -1690,7 +1692,7 @@ msgid "search.cli.rebuildIndex.error"
 msgstr "ошибка"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} статей проиндексировано"
+msgstr "{$numIndexed} статей запланировано для индексации"
 
 msgid "search.coverage"
 msgstr "Охват"
@@ -2300,3 +2302,15 @@ msgstr "Автор отредактирован."
 
 #~ msgid "common.captchaField"
 #~ msgstr "Проверка"
+
+msgid "showLess"
+msgstr "Показать меньше"
+
+msgid "showAll"
+msgstr "Показать всё"
+
+msgid "common.highlight"
+msgstr "Выделение"
+
+msgid "common.highlights"
+msgstr "Выделения"
diff --git a/locale/ru/editor.po b/locale/ru/editor.po
index be9b290fb5a..6eb9bb8888b 100644
--- a/locale/ru/editor.po
+++ b/locale/ru/editor.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:50:00+00:00\n"
-"PO-Revision-Date: 2023-05-01 13:49+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Pavel Pisklakov <ppv1979@mail.ru>\n"
 "Language-Team: Russian <http://translate.pkp.sfu.ca/projects/pkp-lib/editor/"
 "ru/>\n"
@@ -12,9 +12,9 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.13.1\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "editor.submissionArchive.confirmDelete"
 msgstr "Вы уверены, что хотите навсегда удалить этот материал?"
@@ -629,3 +629,6 @@ msgstr "Пропустить это письмо"
 
 msgid "editor.decision.stepError"
 msgstr "Возникла проблема с шагом {$stepName}."
+
+msgid "reviewer.list.reviewerSameInstitution"
+msgstr "Та же организация, что и у автора"
diff --git a/locale/ru/manager.po b/locale/ru/manager.po
index 426bd43b108..35c3d914fc8 100644
--- a/locale/ru/manager.po
+++ b/locale/ru/manager.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:50:00+00:00\n"
-"PO-Revision-Date: 2023-08-01 08:25+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Pavel Pisklakov <ppv1979@mail.ru>\n"
 "Language-Team: Russian <http://translate.pkp.sfu.ca/projects/pkp-lib/manager/"
 "ru/>\n"
@@ -12,9 +12,9 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.13.1\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "manager.website.information"
 msgstr "Информация"
@@ -3696,3 +3696,41 @@ msgstr ""
 
 msgid "emailTemplate.variable.activateUrl"
 msgstr "Ссылка для подтверждения адреса электронной почты"
+
+msgid "manager.announcements.notEnabled"
+msgstr ""
+"Вы должны <a href=\"#announcements/announcement-settings\">включить "
+"объявления</a>."
+
+msgid "manager.highlights.url.description"
+msgstr "Полный URL, включая https://, для кнопки в выделении."
+
+msgid "manager.highlights.urlText.description"
+msgstr "Надпись, например, «Читать далее», для кнопки в выделении."
+
+msgid "manager.image"
+msgstr "Изорбажение"
+
+msgid "manager.highlights.add"
+msgstr "Добавить выделение"
+
+msgid "manager.highlights.confirmDelete"
+msgstr ""
+"Вы уверены, что хотите удалить {$title}? Это действие не может быть отменено."
+
+msgid "manager.highlights.delete"
+msgstr "Удалить выделение"
+
+msgid "manager.highlights.edit"
+msgstr "Редактировать выделение"
+
+msgid "manager.highlights.image"
+msgstr "Изображение"
+
+msgid "manager.highlights.urlText"
+msgstr "Надпись кнопки"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Требовать от авторов представлять Декларацию о конфликте интересов вместе с "
+"отправляемым материалом."
diff --git a/locale/ru/submission.po b/locale/ru/submission.po
index 05ec702ef99..5327c07a8e5 100644
--- a/locale/ru/submission.po
+++ b/locale/ru/submission.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:50:00+00:00\n"
-"PO-Revision-Date: 2023-05-26 22:09+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Pavel Pisklakov <ppv1979@mail.ru>\n"
 "Language-Team: Russian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "submission/ru/>\n"
@@ -12,9 +12,9 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.13.1\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "author.editPublishedDisabled"
 msgstr ""
@@ -2723,3 +2723,9 @@ msgstr "Отправляемый файл"
 
 msgid "editor.submission.roundStatus.returnedToReview"
 msgstr "Возвращён на этап рецензирования."
+
+msgid "submission.authors.label"
+msgstr "Авторы"
+
+msgid "submission.author.list"
+msgstr "Список авторов публикации"
diff --git a/locale/se/admin.po b/locale/se/admin.po
new file mode 100644
index 00000000000..65f6922d0a5
--- /dev/null
+++ b/locale/se/admin.po
@@ -0,0 +1,3 @@
+# Aysa Ekanger <aysa.ekanger@uit.no>, 2023.
+msgid ""
+msgstr "X-Generator: Weblate\nMIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit"
diff --git a/locale/sk/manager.po b/locale/sk/manager.po
index 0f706e4c33d..268692b77c7 100644
--- a/locale/sk/manager.po
+++ b/locale/sk/manager.po
@@ -3118,3 +3118,8 @@ msgstr ""
 #~ msgstr ""
 #~ "Tento email posiela editor sekcie recenzentovi, aby mu pripomenul, že "
 #~ "vypršal termín pre spracovanie recenzie."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Požadovať od autorov, aby spolu s príspevkom zaslali súbor s vyhlásením o "
+"konflikte záujmov."
diff --git a/locale/sl/admin.po b/locale/sl/admin.po
index af3aee892b5..433b772ad7f 100644
--- a/locale/sl/admin.po
+++ b/locale/sl/admin.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:50:01+00:00\n"
-"PO-Revision-Date: 2023-10-28 15:06+0000\n"
+"PO-Revision-Date: 2023-12-10 11:39+0000\n"
 "Last-Translator: Primož Svetek <primoz.svetek@gmail.com>\n"
 "Language-Team: Slovenian <http://translate.pkp.sfu.ca/projects/pkp-lib/admin/"
 "sl/>\n"
@@ -12,9 +12,9 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
-"%100==4 ? 2 : 3;\n"
-"X-Generator: Weblate 4.13.1\n"
+"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
+"n%100==4 ? 2 : 3;\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "admin.systemInfo.settingName"
 msgstr "Ime nastavitve"
@@ -918,3 +918,15 @@ msgstr "Zaženi \"delavca\" za testno čakalno vrsto"
 
 msgid "admin.settings.statistics.sushiPlatform.isSiteSushiPlatform"
 msgstr "Uporabite spletišče kot platformo za vse revije."
+
+msgid "admin.settings.sharedReviewerStatistics"
+msgstr "Recenzentske statistike"
+
+msgid "admin.settings.sharedReviewerStatistics.description"
+msgstr ""
+"Pri namestitvah z več revijami se lahko recenzentske statistike, kot je "
+"število opravljenih recenzij, prikazujejo za vsako revijo posebej ali kot "
+"agregirano."
+
+msgid "admin.settings.sharedReviewerStatistics.disable"
+msgstr "Onemogoči agregirane recenzentske statistike"
diff --git a/locale/sl/common.po b/locale/sl/common.po
index df072f535df..5edbd2ef21f 100644
--- a/locale/sl/common.po
+++ b/locale/sl/common.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:50:01+00:00\n"
-"PO-Revision-Date: 2023-11-10 23:16+0000\n"
+"PO-Revision-Date: 2023-11-24 19:27+0000\n"
 "Last-Translator: Primož Svetek <primoz.svetek@gmail.com>\n"
 "Language-Team: Slovenian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "common/sl/>\n"
@@ -771,7 +771,9 @@ msgid "common.replaceFile"
 msgstr "Zamenjaj datoteko"
 
 msgid "common.requiredField"
-msgstr "* označuje obvezno polje"
+msgstr ""
+"Obvezno polje je označno z zvezdico: <abbr class=\"required\" title=\"obvezno"
+"\">*</abbr>"
 
 msgid "common.required"
 msgstr "Obvezno"
@@ -1675,7 +1677,7 @@ msgid "search.cli.rebuildIndex.error"
 msgstr "napaka"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} prispevkov je bilo indeksiranih"
+msgstr "{$numIndexed} prispevkov je pripravljenih za indeksiranje"
 
 msgid "search.coverage"
 msgstr "Pokritost"
@@ -1687,7 +1689,7 @@ msgid "search.dateFrom"
 msgstr "Od"
 
 msgid "search.dateTo"
-msgstr "Do"
+msgstr "Objavljeno pred"
 
 msgid "search.deleteFilter"
 msgstr "Briši"
diff --git a/locale/sl/manager.po b/locale/sl/manager.po
index bd304a33787..e5031de352e 100644
--- a/locale/sl/manager.po
+++ b/locale/sl/manager.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:50:02+00:00\n"
-"PO-Revision-Date: 2023-11-10 23:16+0000\n"
+"PO-Revision-Date: 2023-11-24 19:27+0000\n"
 "Last-Translator: Primož Svetek <primoz.svetek@gmail.com>\n"
 "Language-Team: Slovenian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "manager/sl/>\n"
@@ -3207,7 +3207,7 @@ msgstr ""
 "Ta email obvešča avtorje, da je bil njihov prispevek poslan v produkcijo."
 
 msgid "mailable.decision.skipReview.notifyAuthor.name"
-msgstr "Recenzija izpuščena"
+msgstr "Prispevek sprejet (brez recenzije)"
 
 msgid "mailable.decision.skipReview.notifyAuthor.description"
 msgstr ""
@@ -3713,3 +3713,8 @@ msgstr ""
 
 msgid "manager.image"
 msgstr "Slika"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Zahtevaj od avtorjev izjavo o konfliktu interesov med procesom oddaje "
+"prispevka."
diff --git a/locale/sl/submission.po b/locale/sl/submission.po
index 3ebfc58b4de..5d28d0a2647 100644
--- a/locale/sl/submission.po
+++ b/locale/sl/submission.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:50:02+00:00\n"
-"PO-Revision-Date: 2023-11-10 23:16+0000\n"
+"PO-Revision-Date: 2023-12-10 11:39+0000\n"
 "Last-Translator: Primož Svetek <primoz.svetek@gmail.com>\n"
 "Language-Team: Slovenian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "submission/sl/>\n"
@@ -2199,11 +2199,12 @@ msgstr ""
 
 msgid "submission.license.cc.by-sa4.footer"
 msgstr ""
-"<a rel=\"license\" href=\"https://creativecommons.org/licenses/by-sa/4.0/"
-"\"><img alt=\"Creative Commons licenca\" src=\"//i.creativecommons.org/l/by-"
-"sa/4.0/88x31.png\" /></a><p>To delo je licencirano pod <a rel=\"license\" "
-"href=\"https://creativecommons.org/licenses/by-sa/4.0/\">Creative Commons "
-"Priznanje avtorstva-Deljenje pod enakimi 4.0 mednarodno licenco</a>.</p>"
+"<a rel=\"license\" href=\"https://creativecommons.org/licenses/by-sa/4.0/\""
+"><img alt=\"Creative Commons licenca\" src=\"//i.creativecommons.org/l/by-sa/"
+"4.0/88x31.png\" /></a><p>To delo je licencirano pod <a rel=\"license\" href="
+"\"https://creativecommons.org/licenses/by-sa/4.0/\">Creative Commons "
+"Priznanje avtorstva-Deljenje pod enakimi pogoji 4.0 mednarodno "
+"licenco</a>.</p>"
 
 msgid "submission.license.cc.by-nc-nd3.footer"
 msgstr ""
diff --git a/locale/sr@cyrillic/manager.po b/locale/sr@cyrillic/manager.po
index 5a9710d2f39..aa72ab63a76 100644
--- a/locale/sr@cyrillic/manager.po
+++ b/locale/sr@cyrillic/manager.po
@@ -3199,3 +3199,8 @@ msgstr ""
 
 #~ msgid "about.editorialPOLICY"
 #~ msgstr "about.editorialPOLICY"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Захтевајте од аутора да у току пријаве чланка потврде изјаву о Конфликту "
+"интереса."
diff --git a/locale/sr@latin/manager.po b/locale/sr@latin/manager.po
index 5222364e117..00ba7ead3df 100644
--- a/locale/sr@latin/manager.po
+++ b/locale/sr@latin/manager.po
@@ -3205,3 +3205,8 @@ msgstr ""
 
 #~ msgid "manager.plugins.pluginGallery.date"
 #~ msgstr "Datum objavljivanja: {$date}"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Zahtevajte od autora da u toku prijave članka potvrde izjavu o Konfliktu "
+"interesa."
diff --git a/locale/sv/manager.po b/locale/sv/manager.po
index 1850da80edf..4637809117a 100644
--- a/locale/sv/manager.po
+++ b/locale/sv/manager.po
@@ -3572,3 +3572,8 @@ msgstr ""
 #~ msgstr ""
 #~ "Det här e-postmeddelandet meddelar automatiskt anknutna redaktörer om en "
 #~ "ny version av publikationen"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Författare måste skicka in en intressekonfliktsförklaring i samband med att "
+"bidraget skickas in."
diff --git a/locale/tr/manager.po b/locale/tr/manager.po
index da59d0613b4..bd0a57a0472 100644
--- a/locale/tr/manager.po
+++ b/locale/tr/manager.po
@@ -3562,3 +3562,8 @@ msgstr ""
 
 #~ msgid "emailTemplate.variable.statisticsReportNotify.publicationStatsLink"
 #~ msgstr "Yayımlanan makale istatistikleri sayfasına bağlantı"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Yazarların gönderileriyle birlikte bir Çıkar Çatışması bildirimi dosyası "
+"göndermeleri gereklidir."
diff --git a/locale/uk/admin.po b/locale/uk/admin.po
index b6332c70bee..40191557e87 100644
--- a/locale/uk/admin.po
+++ b/locale/uk/admin.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:50:08+00:00\n"
-"PO-Revision-Date: 2023-09-30 06:06+0000\n"
+"PO-Revision-Date: 2023-11-28 23:45+0000\n"
 "Last-Translator: Petro Bilous <petrobilous@ukr.net>\n"
 "Language-Team: Ukrainian <http://translate.pkp.sfu.ca/projects/pkp-lib/admin/"
 "uk/>\n"
@@ -12,9 +12,9 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.13.1\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.18.2\n"
 
 msgid "admin.systemInfo.settingName"
 msgstr "Назва налаштування"
@@ -951,3 +951,15 @@ msgstr "Запустити worker deamon для черги тестів"
 
 msgid "admin.settings.statistics.sushiPlatform.isSiteSushiPlatform"
 msgstr "Використовувати вебсайт як платформу для всіх журналів."
+
+msgid "admin.settings.sharedReviewerStatistics.disable"
+msgstr "Вимкнути сукупну статистику рецензентів"
+
+msgid "admin.settings.sharedReviewerStatistics"
+msgstr "Статистика рецензента"
+
+msgid "admin.settings.sharedReviewerStatistics.description"
+msgstr ""
+"У багатоконтекстній інсталяції статистику рецензента, наприклад кількість "
+"надісланих рецензій, можна відображати окремо для кожного контексту або "
+"сукупно."
diff --git a/locale/uk/common.po b/locale/uk/common.po
index d25f2b565cc..ba438c2e27c 100644
--- a/locale/uk/common.po
+++ b/locale/uk/common.po
@@ -4,7 +4,7 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-11-19T10:50:08+00:00\n"
-"PO-Revision-Date: 2023-11-17 15:38+0000\n"
+"PO-Revision-Date: 2023-11-19 14:38+0000\n"
 "Last-Translator: Petro Bilous <petrobilous@ukr.net>\n"
 "Language-Team: Ukrainian <http://translate.pkp.sfu.ca/projects/pkp-lib/"
 "common/uk/>\n"
@@ -1680,7 +1680,7 @@ msgid "search.cli.rebuildIndex.error"
 msgstr "помилка"
 
 msgid "search.cli.rebuildIndex.result"
-msgstr "{$numIndexed} статті індексовані"
+msgstr "{$numIndexed} статей заплановано до індексації"
 
 msgid "search.coverage"
 msgstr "Тематичне покриття"
diff --git a/locale/uk/manager.po b/locale/uk/manager.po
index e7dc60d19db..c790ff18e8b 100644
--- a/locale/uk/manager.po
+++ b/locale/uk/manager.po
@@ -3762,3 +3762,8 @@ msgid "manager.announcements.notEnabled"
 msgstr ""
 "Ви повинні <a href=\"#announcements/announcement-settings\">активувати "
 "оголошення</a>."
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Вимагати від авторів декларувати відсутність конфлікту інтересів щодо "
+"поданих матеріалів."
diff --git a/locale/uz@cyrillic/manager.po b/locale/uz@cyrillic/manager.po
index d1b45945db0..6ed35fa32d1 100644
--- a/locale/uz@cyrillic/manager.po
+++ b/locale/uz@cyrillic/manager.po
@@ -3046,3 +3046,6 @@ msgstr ""
 
 msgid "mailable.submissionNeedsEditor.name"
 msgstr ""
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
diff --git a/locale/uz@latin/manager.po b/locale/uz@latin/manager.po
index 57348078826..99ca1a64ce0 100644
--- a/locale/uz@latin/manager.po
+++ b/locale/uz@latin/manager.po
@@ -3137,3 +3137,8 @@ msgstr ""
 
 #~ msgid "stats.donwloads"
 #~ msgstr "Qoralama nusxa ko'rinishlarining nashri"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Mualliflardan raqobatbardosh qiziqish (CI) to'g'risidagi bayonotni taqdim "
+"etishni talab qiling."
diff --git a/locale/vi/manager.po b/locale/vi/manager.po
index ff084248a41..b88d2ca59a7 100644
--- a/locale/vi/manager.po
+++ b/locale/vi/manager.po
@@ -3417,3 +3417,7 @@ msgstr ""
 #~ "Email này được gửi bởi một Biên tập viên để nhắc nhở người review rằng "
 #~ "review của họ đến hạn nộp. Email này được sử dụng khi Biên tập viên gửi "
 #~ "nhắc nhở đến người review một cách thủ công"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"Yêu cầu tác giả gửi một tuyên bố xung đột lợi ích (CI) với bài gửi của họ."
diff --git a/locale/zh_CN/manager.po b/locale/zh_CN/manager.po
index 7265674e59c..8b47d50c553 100644
--- a/locale/zh_CN/manager.po
+++ b/locale/zh_CN/manager.po
@@ -3211,3 +3211,6 @@ msgstr ""
 #~ msgid "emails.reviewRemind.body"
 #~ msgstr ""
 #~ "这封电子邮件是由区段编辑发出,提醒一位审查人他们的审查工作已经到期。"
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr "要求投稿作者提供一个利益冲突(CI)的文字声明。"
diff --git a/locale/zh_Hant/manager.po b/locale/zh_Hant/manager.po
index 96dacdab5aa..7eed9678703 100644
--- a/locale/zh_Hant/manager.po
+++ b/locale/zh_Hant/manager.po
@@ -3054,3 +3054,7 @@ msgstr ""
 
 msgid "mailable.submissionNeedsEditor.name"
 msgstr ""
+
+msgid "manager.setup.competingInterests.requireAuthors"
+msgstr ""
+"要求提交作者投稿時,同時提供一個利益衝突(Competing Interest, 簡稱CI)聲明。"
diff --git a/pages/dashboard/DashboardHandlerNext.php b/pages/dashboard/DashboardHandlerNext.php
index c106507c154..61548a45252 100644
--- a/pages/dashboard/DashboardHandlerNext.php
+++ b/pages/dashboard/DashboardHandlerNext.php
@@ -122,7 +122,7 @@ public function index($args, $request)
         $genres = $genreDao->getByContextId($context->getId())->toArray();
 
         $templateMgr->setState([
-            'storeData' => [
+            'pageInitConfig' => [
                 'apiUrl' => $apiUrl,
                 'assignParticipantUrl' => $dispatcher->url(
                     $request,
diff --git a/pages/login/LoginHandler.php b/pages/login/LoginHandler.php
index 38faf80c5a3..e75c72304e5 100644
--- a/pages/login/LoginHandler.php
+++ b/pages/login/LoginHandler.php
@@ -142,8 +142,11 @@ public function signIn($args, $request)
             }
         }
 
+        $username = $request->getUserVar('username');
         $reason = null;
-        $user = $error ? false : Validation::login($request->getUserVar('username'), $request->getUserVar('password'), $reason, !!$request->getUserVar('remember'));
+        $user = $error || !strlen($username ?? '')
+            ? null
+            : Validation::login($username, $request->getUserVar('password'), $reason, !!$request->getUserVar('remember'));
         if ($user) {
             if ($user->getMustChangePassword()) {
                 // User must change their password in order to log in
@@ -170,7 +173,7 @@ public function signIn($args, $request)
 
 
         $templateMgr->assign([
-            'username' => $request->getUserVar('username'),
+            'username' => $username,
             'remember' => $request->getUserVar('remember'),
             'source' => $request->getUserVar('source'),
             'showRemember' => Config::getVar('general', 'session_lifetime') > 0,
@@ -224,7 +227,7 @@ public function requestResetPassword($args, $request)
         $user = Repo::user()->getByEmail($email, true); /** @var User $user */
 
         if ($user !== null) {
-            
+
             if ($user->getDisabled()) {
                 $templateMgr
                     ->assign([
@@ -234,7 +237,7 @@ public function requestResetPassword($args, $request)
                             : __('user.login.accountDisabledWithReason', ['reason' => htmlspecialchars($reason)])
                     ])
                     ->display('frontend/pages/userLostPassword.tpl');
-    
+
                 return;
             }
 
diff --git a/pages/workflow/PKPWorkflowHandler.php b/pages/workflow/PKPWorkflowHandler.php
index c5a291340ab..59c6ca22096 100644
--- a/pages/workflow/PKPWorkflowHandler.php
+++ b/pages/workflow/PKPWorkflowHandler.php
@@ -32,6 +32,7 @@
 use PKP\components\forms\publication\PKPPublicationLicenseForm;
 use PKP\components\forms\publication\TitleAbstractForm;
 use PKP\components\listPanels\ContributorsListPanel;
+use PKP\components\PublicationSectionJats;
 use PKP\context\Context;
 use PKP\core\JSONMessage;
 use PKP\core\PKPApplication;
@@ -850,6 +851,20 @@ protected function getContributorsListPanel(Submission $submission, Context $con
         );
     }
 
+    /**
+     * Get the contributor list panel
+     */
+    protected function getJatsPanel(Submission $submission, Context $context, bool $canEditPublication, Publication $publication): PublicationSectionJats
+    {
+        return new PublicationSectionJats(
+            'jats',
+            __('publication.jats'),
+            $submission,
+            $context,
+            $canEditPublication,
+            $publication
+        );
+    }
 
     //
     // Abstract protected methods.
diff --git a/plugins/importexport/native/filter/NativeImportFilter.php b/plugins/importexport/native/filter/NativeImportFilter.php
index 52b4fd61749..1f5fc17e4fd 100644
--- a/plugins/importexport/native/filter/NativeImportFilter.php
+++ b/plugins/importexport/native/filter/NativeImportFilter.php
@@ -36,7 +36,7 @@ public function &process(&$document)
         // If necessary, convert $document to a DOMDocument.
         if (is_string($document)) {
             $xmlString = $document;
-            $document = new \DOMDocument();
+            $document = new \DOMDocument('1.0', 'utf-8');
             $document->loadXml($xmlString);
         }
         assert($document instanceof \DOMDocument);
@@ -118,7 +118,7 @@ public function parseLocalizedContent($element)
      */
     public function importWithXMLNode($n, $filter = null)
     {
-        $doc = new \DOMDocument();
+        $doc = new \DOMDocument('1.0', 'utf-8');
         $doc->appendChild($doc->importNode($n, true));
         $importFilter = null;
         if ($filter) {
diff --git a/plugins/importexport/native/filter/NativeXmlSubmissionFilter.php b/plugins/importexport/native/filter/NativeXmlSubmissionFilter.php
index 4680393a05d..d012ee943e7 100644
--- a/plugins/importexport/native/filter/NativeXmlSubmissionFilter.php
+++ b/plugins/importexport/native/filter/NativeXmlSubmissionFilter.php
@@ -212,7 +212,7 @@ public function parseChild($n, $submission)
         $importFilter = $this->getImportFilter($n->tagName);
         assert(isset($importFilter)); // There should be a filter
 
-        $submissionChildDoc = new \DOMDocument();
+        $submissionChildDoc = new \DOMDocument('1.0', 'utf-8');
         $submissionChildDoc->appendChild($submissionChildDoc->importNode($n, true));
         $ret = $importFilter->execute($submissionChildDoc);
 
diff --git a/plugins/importexport/native/filter/PKPAuthorNativeXmlFilter.php b/plugins/importexport/native/filter/PKPAuthorNativeXmlFilter.php
index 44ff4c29ee8..9738aa5a47e 100644
--- a/plugins/importexport/native/filter/PKPAuthorNativeXmlFilter.php
+++ b/plugins/importexport/native/filter/PKPAuthorNativeXmlFilter.php
@@ -47,7 +47,7 @@ public function __construct($filterGroup)
     public function &process(&$authors)
     {
         // Create the XML document
-        $doc = new \DOMDocument('1.0');
+        $doc = new \DOMDocument('1.0', 'utf-8');
         $doc->preserveWhiteSpace = false;
         $doc->formatOutput = true;
         $deployment = $this->getDeployment();
diff --git a/plugins/importexport/native/filter/PKPPublicationNativeXmlFilter.php b/plugins/importexport/native/filter/PKPPublicationNativeXmlFilter.php
index aca62e1a792..d81176156e1 100644
--- a/plugins/importexport/native/filter/PKPPublicationNativeXmlFilter.php
+++ b/plugins/importexport/native/filter/PKPPublicationNativeXmlFilter.php
@@ -55,7 +55,7 @@ public function __construct($filterGroup)
     public function &process(&$entity)
     {
         // Create the XML document
-        $doc = new \DOMDocument('1.0');
+        $doc = new \DOMDocument('1.0', 'utf-8');
         $doc->preserveWhiteSpace = false;
         $doc->formatOutput = true;
         $deployment = $this->getDeployment();
diff --git a/plugins/importexport/native/filter/RepresentationNativeXmlFilter.php b/plugins/importexport/native/filter/RepresentationNativeXmlFilter.php
index d2a59fd4484..5aba03b15c2 100644
--- a/plugins/importexport/native/filter/RepresentationNativeXmlFilter.php
+++ b/plugins/importexport/native/filter/RepresentationNativeXmlFilter.php
@@ -46,7 +46,7 @@ public function __construct($filterGroup)
     public function &process(&$representation)
     {
         // Create the XML document
-        $doc = new \DOMDocument('1.0');
+        $doc = new \DOMDocument('1.0', 'utf-8');
         $doc->preserveWhiteSpace = false;
         $doc->formatOutput = true;
         $deployment = $this->getDeployment();
diff --git a/plugins/importexport/native/filter/SubmissionFileNativeXmlFilter.php b/plugins/importexport/native/filter/SubmissionFileNativeXmlFilter.php
index b785e300b70..b4c22b9f3fb 100644
--- a/plugins/importexport/native/filter/SubmissionFileNativeXmlFilter.php
+++ b/plugins/importexport/native/filter/SubmissionFileNativeXmlFilter.php
@@ -54,7 +54,7 @@ public function __construct($filterGroup)
     public function &process(&$submissionFile)
     {
         // Create the XML document
-        $doc = new DOMDocument('1.0');
+        $doc = new DOMDocument('1.0', 'utf-8');
         $doc->preserveWhiteSpace = false;
         $doc->formatOutput = true;
         $deployment = $this->getDeployment();
diff --git a/plugins/importexport/native/filter/SubmissionNativeXmlFilter.php b/plugins/importexport/native/filter/SubmissionNativeXmlFilter.php
index efb22ce27d6..e439cfb4e80 100644
--- a/plugins/importexport/native/filter/SubmissionNativeXmlFilter.php
+++ b/plugins/importexport/native/filter/SubmissionNativeXmlFilter.php
@@ -55,7 +55,7 @@ public function __construct($filterGroup)
     public function &process(&$submissions)
     {
         // Create the XML document
-        $doc = new DOMDocument('1.0');
+        $doc = new DOMDocument('1.0', 'utf-8');
         $doc->preserveWhiteSpace = false;
         $doc->formatOutput = true;
         $deployment = $this->getDeployment();
diff --git a/plugins/importexport/users/filter/PKPUserUserXmlFilter.php b/plugins/importexport/users/filter/PKPUserUserXmlFilter.php
index dfd61392429..e4725534866 100644
--- a/plugins/importexport/users/filter/PKPUserUserXmlFilter.php
+++ b/plugins/importexport/users/filter/PKPUserUserXmlFilter.php
@@ -50,7 +50,7 @@ public function __construct($filterGroup)
     public function &process(&$users)
     {
         // Create the XML document
-        $doc = new DOMDocument('1.0');
+        $doc = new DOMDocument('1.0', 'utf-8');
         $deployment = $this->getDeployment();
 
         $rootNode = $doc->createElementNS($deployment->getNamespace(), 'PKPUsers');
diff --git a/plugins/importexport/users/filter/UserGroupNativeXmlFilter.php b/plugins/importexport/users/filter/UserGroupNativeXmlFilter.php
index 6817c8bb109..eac5a815f4c 100644
--- a/plugins/importexport/users/filter/UserGroupNativeXmlFilter.php
+++ b/plugins/importexport/users/filter/UserGroupNativeXmlFilter.php
@@ -47,7 +47,7 @@ public function __construct($filterGroup)
     public function &process(&$userGroups)
     {
         // Create the XML document
-        $doc = new DOMDocument('1.0');
+        $doc = new DOMDocument('1.0', 'utf-8');
         $deployment = $this->getDeployment();
 
         // Multiple authors; wrap in a <authors> element
diff --git a/plugins/importexport/users/filter/UserXmlPKPUserFilter.php b/plugins/importexport/users/filter/UserXmlPKPUserFilter.php
index a18d4ca26a8..6c2726731c4 100644
--- a/plugins/importexport/users/filter/UserXmlPKPUserFilter.php
+++ b/plugins/importexport/users/filter/UserXmlPKPUserFilter.php
@@ -69,7 +69,7 @@ public function parseUserGroup($node)
         assert(count($importFilters) == 1); // Assert only a single unserialization filter
         $importFilter = array_shift($importFilters);
         $importFilter->setDeployment($this->getDeployment());
-        $userGroupDoc = new \DOMDocument();
+        $userGroupDoc = new \DOMDocument('1.0', 'utf-8');
         $userGroupDoc->appendChild($userGroupDoc->importNode($node, true));
         return $importFilter->execute($userGroupDoc);
     }
diff --git a/schemas/author.json b/schemas/author.json
index e8d83c61c49..3c4201fe12e 100644
--- a/schemas/author.json
+++ b/schemas/author.json
@@ -25,6 +25,11 @@
 				"nullable"
 			]
 		},
+		"competingInterests": {
+			"type": "string",
+			"description": "A declaration of potential competing interests.",
+			"multilingual": "true"
+		},
 		"country": {
 			"type": "string",
 			"description": "The author's country in a two-letter code (ISO 3166-1). See [all codes](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements).",
diff --git a/schemas/context.json b/schemas/context.json
index 979283a531f..f56fbbb62a0 100644
--- a/schemas/context.json
+++ b/schemas/context.json
@@ -261,6 +261,12 @@
 				"in:0,enable,request,require"
 			]
 		},
+		"requireAuthorCompetingInterests": {
+			"type": "boolean",
+			"validation": [
+				"nullable"
+			]
+		},
 		"editorialTeam": {
 			"type": "string",
 			"multilingual": true,
diff --git a/schemas/submissionFile.json b/schemas/submissionFile.json
index 12c1fe4ce2b..9ace44f835b 100644
--- a/schemas/submissionFile.json
+++ b/schemas/submissionFile.json
@@ -27,7 +27,7 @@
 			"apiSummary": true,
 			"description": "Used with `assocId` to associate this file with an object such as a galley. One of the following constants: `ASSOC_TYPE_SUBMISSION_FILE` (dependent files), `ASSOC_TYPE_REVIEW_ASSIGNMENT` (files uploaded by a reviewer), `ASSOC_TYPE_NOTE` (files uploaded with a discussion), `ASSOC_TYPE_REPRESENTATION` (files uploaded to a galley or publication format), `ASSOC_TYPE_REVIEW_ROUND` (review files and revisions for a particular review round).",
 			"validation": [
-				"in:515,517,520,521,523"
+				"in:515,517,520,521,523,1048588"
 			]
 		},
 		"caption": {
@@ -118,7 +118,7 @@
 			"type": "integer",
 			"apiSummary": true,
 			"validation": [
-				"in:2,3,4,5,6,7,8,9,10,11,13,15,17,18"
+				"in:2,3,4,5,6,7,8,9,10,11,13,15,17,18,19,20,21"
 			]
 		},
 		"genreId": {
diff --git a/templates/controllers/grid/settings/library/form/editFileForm.tpl b/templates/controllers/grid/settings/library/form/editFileForm.tpl
index 4689cd6000e..676dbfad57d 100644
--- a/templates/controllers/grid/settings/library/form/editFileForm.tpl
+++ b/templates/controllers/grid/settings/library/form/editFileForm.tpl
@@ -12,13 +12,21 @@
 	// Attach the file upload form handler.
 	$(function() {ldelim}
 		$('#uploadForm').pkpHandler(
-			'$.pkp.controllers.form.AjaxFormHandler'
+		'$.pkp.controllers.form.FileUploadFormHandler',
+			{ldelim}
+				$uploader: $('#plupload'),
+				uploaderOptions: {ldelim}
+					uploadUrl: {url|json_encode op="uploadFile" fileType=$fileType escape=false},
+					baseUrl: {$baseUrl|json_encode}
+				{rdelim}
+			{rdelim}
 		);
 	{rdelim});
 </script>
 
 <form class="pkp_form" id="uploadForm" action="{url op="updateFile" fileId=$libraryFile->getId()}" method="post">
 	{csrf}
+	<input type="hidden" name="temporaryFileId" id="temporaryFileId" value="" />
 	{fbvFormArea id="name"}
 		{fbvFormSection title="common.name" required=true}
 			{fbvElement type="text" id="libraryFileName" value=$libraryFileName maxlength="255" multilingual=true required=true}
@@ -46,6 +54,10 @@
 				<td class="label">{translate key="common.dateUploaded"}</td>
 				<td class="value">{$libraryFile->getDateUploaded()|date_format:$datetimeFormatShort}</td>
 			</tr>
+			<tr valign="top">
+				<td class="label">{translate key="common.replaceFile"}</td>
+				<td class="value">{include file="controllers/fileUploadContainer.tpl" id="plupload"}</td>
+			</tr>
 			</table>
 		{/fbvFormSection}
 	{/fbvFormArea}
diff --git a/templates/controllers/grid/users/author/form/authorForm.tpl b/templates/controllers/grid/users/author/form/authorForm.tpl
index b1496f2d18e..b8a7fa861d1 100644
--- a/templates/controllers/grid/users/author/form/authorForm.tpl
+++ b/templates/controllers/grid/users/author/form/authorForm.tpl
@@ -39,6 +39,11 @@
 	}
 
 	{fbvFormArea id="submissionSpecific"}
+		{if $requireAuthorCompetingInterests}
+			{fbvFormSection title="author.competingInterests"}
+				{fbvElement id="competingInterests" type="textarea" multilingual=true rich=true label="author.competingInterests.description" value=$competingInterests}
+			{/fbvFormSection}
+		{/if}
 		{fbvFormSection id="userGroupId" title="submission.submit.contributorRole" list=true required=true}
 			{foreach from=$authorUserGroups item=$userGroup}
 				{if $userGroupId == $userGroup->getId()}{assign var="checked" value=true}{else}{assign var="checked" value=false}{/if}
diff --git a/templates/dashboard/editors.tpl b/templates/dashboard/editors.tpl
index ae538e1a764..73c065a44ce 100644
--- a/templates/dashboard/editors.tpl
+++ b/templates/dashboard/editors.tpl
@@ -10,5 +10,5 @@
 {extends file="layouts/backend.tpl"}
 
 {block name="page"}
-	<submissions-page :store-data="storeData" />
+	<submissions-page v-bind="pageInitConfig" />
 {/block}
diff --git a/templates/stats/context.tpl b/templates/stats/context.tpl
index e33db92b21e..e76d707ff18 100644
--- a/templates/stats/context.tpl
+++ b/templates/stats/context.tpl
@@ -165,7 +165,7 @@
 								:row="row"
 								:tabindex="!rowIndex && !columnIndex ? 0 : -1"
 							>
-								<template v-if="column.name === 'title'">
+								<template #default v-if="column.name === 'title'">
 									<a
 										:href="row.url"
 										class="pkpStats__itemLink"
diff --git a/templates/stats/editorial.tpl b/templates/stats/editorial.tpl
index b85ceb19807..8fe38446000 100644
--- a/templates/stats/editorial.tpl
+++ b/templates/stats/editorial.tpl
@@ -115,7 +115,7 @@
 									:row="row"
 									:tabindex="!rowIndex && !columnIndex ? 0 : -1"
 								>
-									<template v-if="column.name === 'name'">
+									<template #default v-if="column.name === 'name'">
 										{{ row.name }}
 										<tooltip v-if="row.description"
 											:label="t('stats.descriptionForStat', {ldelim}stat: row.name{rdelim})"
diff --git a/templates/submission/review-contributors.tpl b/templates/submission/review-contributors.tpl
index ec479b2e86b..155a0f57c26 100644
--- a/templates/submission/review-contributors.tpl
+++ b/templates/submission/review-contributors.tpl
@@ -66,6 +66,7 @@
                     <badge>{{ localize(author.userGroupName) }}</badge>
                 </span>
             </li>
+            {call_hook name="Template::SubmissionWizard::Section::Review::Contributors" submission=$submission step=$step.id}
         </ul>
     </div>
 </div>
\ No newline at end of file
diff --git a/templates/submission/review-details.tpl b/templates/submission/review-details.tpl
index 6eaeed8e3a4..ba756ce9d47 100644
--- a/templates/submission/review-details.tpl
+++ b/templates/submission/review-details.tpl
@@ -68,6 +68,7 @@
                     </div>
                 {/if}
             {/if}
+            {call_hook name="Template::SubmissionWizard::Section::Review::Details" submission=$submission step=$step.id}
         </div>
     </div>
 {/foreach}
\ No newline at end of file
diff --git a/templates/submission/review-editors.tpl b/templates/submission/review-editors.tpl
index eca30781f8d..e052ad9064f 100644
--- a/templates/submission/review-editors.tpl
+++ b/templates/submission/review-editors.tpl
@@ -94,6 +94,7 @@
                     </div>
                 </div>
             {/if}
+            {call_hook name="Template::SubmissionWizard::Section::Review::Editors" submission=$submission step=$step.id}
         </div>
     </div>
 {/foreach}
\ No newline at end of file
diff --git a/templates/submission/review-files.tpl b/templates/submission/review-files.tpl
index 5af68b723c4..6e7ece7d6fc 100644
--- a/templates/submission/review-files.tpl
+++ b/templates/submission/review-files.tpl
@@ -55,6 +55,7 @@
                     </badge>
                 </span>
             </li>
+            {call_hook name="Template::SubmissionWizard::Section::Review::Files" submission=$submission step=$step.id}
         </ul>
     </div>
 </div>
\ No newline at end of file
diff --git a/templates/submission/wizard.tpl b/templates/submission/wizard.tpl
index f201da676f7..5d89d756ff2 100644
--- a/templates/submission/wizard.tpl
+++ b/templates/submission/wizard.tpl
@@ -108,14 +108,12 @@
                             >
                                 {translate key="submission.wizard.errors"}
                             </notification>
-                            <template>
-                                {foreach from=$reviewSteps item=$step}
-                                    {if $step.reviewTemplate}
-                                        {include file=$step.reviewTemplate}
-                                    {/if}
-                                    {call_hook name="Template::SubmissionWizard::Section::Review" submission=$submission step=$step.id}
-                                {/foreach}
-                            </template>
+                            {foreach from=$reviewSteps item=$step}
+                                {if $step.reviewTemplate}
+                                    {include file=$step.reviewTemplate}
+                                {/if}
+                                {call_hook name="Template::SubmissionWizard::Section::Review" submission=$submission step=$step.id}
+                            {/foreach}
                             <transition name="submissionWizard__reviewLoading">
                                 <span
                                     v-if="isAutosaving || isValidating"
diff --git a/tests/classes/xslt/XMLTypeDescriptionTest.php b/tests/classes/xslt/XMLTypeDescriptionTest.php
index 258f5f76ea4..42be17a0704 100644
--- a/tests/classes/xslt/XMLTypeDescriptionTest.php
+++ b/tests/classes/xslt/XMLTypeDescriptionTest.php
@@ -44,7 +44,7 @@ public function testInstantiateAndCheck()
 
         // Test with dtd validation
         $typeDescription = new XMLTypeDescription('dtd');
-        $testXmlDom = new \DOMDocument();
+        $testXmlDom = new \DOMDocument('1.0', 'utf-8');
         $testXmlDom->load(dirname(__FILE__) . '/dtdsample-valid.xml');
         self::assertTrue($typeDescription->isCompatible($testXmlDom));
         $testXmlDom->load(dirname(__FILE__) . '/dtdsample-invalid.xml');
@@ -58,7 +58,7 @@ public function testInstantiateAndCheck()
 
         // Test with xsd validation
         $typeDescription = new XMLTypeDescription('schema(' . dirname(__FILE__) . '/xsdsample.xsd)');
-        $testXmlDom = new \DOMDocument();
+        $testXmlDom = new \DOMDocument('1.0', 'utf-8');
         $testXmlDom->load(dirname(__FILE__) . '/xsdsample-valid.xml');
         self::assertTrue($typeDescription->isCompatible($testXmlDom));
         $testXmlDom->load(dirname(__FILE__) . '/xsdsample-invalid.xml');
@@ -66,7 +66,7 @@ public function testInstantiateAndCheck()
 
         // Test with rng validation
         $typeDescription = new XMLTypeDescription('relax-ng(' . dirname(__FILE__) . '/rngsample.rng)');
-        $testXmlDom = new \DOMDocument();
+        $testXmlDom = new \DOMDocument('1.0', 'utf-8');
         $testXmlDom->load(dirname(__FILE__) . '/rngsample-valid.xml');
         self::assertTrue($typeDescription->isCompatible($testXmlDom));
         $testXmlDom->load(dirname(__FILE__) . '/rngsample-invalid.xml');
@@ -89,7 +89,7 @@ public function testInstantiateAndCheck()
 
         // Test without schema validation
         $typeDescription = new XMLTypeDescription('*');
-        $testXmlDom = new \DOMDocument();
+        $testXmlDom = new \DOMDocument('1.0', 'utf-8');
         $testXmlDom->load(dirname(__FILE__) . '/rngsample-valid.xml');
         self::assertTrue($typeDescription->isCompatible($testXmlDom));
         $testXmlDom->load(dirname(__FILE__) . '/rngsample-invalid.xml');
diff --git a/tests/plugins/PluginTestCase.php b/tests/plugins/PluginTestCase.php
index 67d818bb66e..b334bb90b21 100644
--- a/tests/plugins/PluginTestCase.php
+++ b/tests/plugins/PluginTestCase.php
@@ -141,7 +141,7 @@ protected function validateXmlConfig($configFiles)
     {
         foreach ($configFiles as $configFile) {
             if (file_exists($configFile)) {
-                $xmlDom = new \DOMDocument();
+                $xmlDom = new \DOMDocument('1.0', 'utf-8');
                 $xmlDom->load($configFile);
                 self::assertTrue($xmlDom->validate());
                 unset($xmlDom);