diff --git a/.gitmodules b/.gitmodules index 5ff1a52f0bd..af1a384f436 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ [submodule "lib/swordappv2"] path = lib/swordappv2 url = https://github.com/swordapp/swordappv2-php-library.git -[submodule "js/lib/jquery/plugins/spectrum"] - path = js/lib/jquery/plugins/spectrum - url = https://github.com/bgrins/spectrum.git +[submodule "js/lib/pnotify"] + path = js/lib/pnotify + url = https://github.com/sciactive/pnotify.git diff --git a/api/v1/_submissions/PKPBackendSubmissionsHandler.inc.php b/api/v1/_submissions/PKPBackendSubmissionsHandler.inc.php index 613cbc0a4c3..d94f87a5f41 100644 --- a/api/v1/_submissions/PKPBackendSubmissionsHandler.inc.php +++ b/api/v1/_submissions/PKPBackendSubmissionsHandler.inc.php @@ -187,7 +187,7 @@ public function deleteSubmission($slimRequest, $response, $args) { $submission = $submissionDao->getById($submissionId); if (!$submission) { - return $response->withStatus(404)->withJsonError('api.submissions.404.resourceNotFound'); + return $response->withStatus(404)->withJsonError('api.404.resourceNotFound'); } if ($context->getId() != $submission->getContextId()) { diff --git a/api/v1/contexts/PKPContextHandler.inc.php b/api/v1/contexts/PKPContextHandler.inc.php new file mode 100644 index 00000000000..7856fddbdc3 --- /dev/null +++ b/api/v1/contexts/PKPContextHandler.inc.php @@ -0,0 +1,490 @@ +_handlerPath = 'contexts'; + $roles = array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER); + $this->_endpoints = array( + 'GET' => array( + array( + 'pattern' => $this->getEndpointPattern(), + 'handler' => array($this, 'getContexts'), + 'roles' => $roles, + ), + array( + 'pattern' => $this->getEndpointPattern() . '/{contextId}', + 'handler' => array($this, 'getContext'), + 'roles' => $roles, + ), + array( + 'pattern' => $this->getEndpointPattern() . '/{contextId}/theme', + 'handler' => array($this, 'getTheme'), + 'roles' => $roles, + ), + ), + 'POST' => array( + array( + 'pattern' => $this->getEndpointPattern(), + 'handler' => array($this, 'addContext'), + 'roles' => array(ROLE_ID_SITE_ADMIN), + ), + ), + 'PUT' => array( + array( + 'pattern' => $this->getEndpointPattern() . '/{contextId}', + 'handler' => array($this, 'editContext'), + 'roles' => $roles, + ), + array( + 'pattern' => $this->getEndpointPattern() . '/{contextId}/theme', + 'handler' => array($this, 'editTheme'), + 'roles' => $roles, + ), + ), + 'DELETE' => array( + array( + 'pattern' => $this->getEndpointPattern() . '/{contextId}', + 'handler' => array($this, 'deleteContext'), + 'roles' => array(ROLE_ID_SITE_ADMIN), + ), + ), + ); + parent::__construct(); + } + + /** + * @copydoc PKPHandler::authorize + */ + public function authorize($request, &$args, $roleAssignments) { + import('lib.pkp.classes.security.authorization.PolicySet'); + $rolePolicy = new PolicySet(COMBINING_PERMIT_OVERRIDES); + + import('lib.pkp.classes.security.authorization.RoleBasedHandlerOperationPolicy'); + foreach ($roleAssignments as $role => $operations) { + $rolePolicy->addPolicy(new RoleBasedHandlerOperationPolicy($request, $role, $operations)); + } + $this->addPolicy($rolePolicy); + + return parent::authorize($request, $args, $roleAssignments); + } + + /** + * Get a collection of contexts + * + * @param $slimRequest Request Slim request object + * @param $response Response object + * @param $args array arguments + * @return Response + */ + public function getContexts($slimRequest, $response, $args) { + $request = $this->getRequest(); + $contextService = ServicesContainer::instance()->get('context'); + + $defaultParams = array( + 'count' => 20, + 'offset' => 0, + ); + + $requestParams = array_merge($defaultParams, $slimRequest->getQueryParams()); + + $allowedParams = array(); + + // Process query params to format incoming data as needed + foreach ($requestParams as $param => $val) { + switch ($param) { + case 'isEnabled': + $allowedParams[$param] = (bool) $val; + break; + + case 'searchPhrase': + $allowedParams[$param] = trim($val); + break; + + case 'count': + $allowedParams[$param] = min(100, (int) $val); + break; + + case 'offset': + $allowedParams[$param] = (int) $val; + break; + } + } + + \HookRegistry::call('API::contexts::params', array(&$allowedParams, $slimRequest)); + + // Anyone not a site admin should not be able to access contexts that are + // not enabled + if (empty($allowedParams['isEnabled'])) { + $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES); + $canAccessDisabledContexts = !empty(array_intersect(array(ROLE_ID_SITE_ADMIN), $userRoles)); + if (!$canAccessDisabledContexts) { + return $response->withStatus(403)->withJsonError('api.contexts.403.requestedDisabledContexts'); + } + } + + $items = array(); + $contexts = $contextService->getContexts($allowedParams); + if (!empty($contexts)) { + $propertyArgs = array( + 'request' => $request, + 'slimRequest' => $slimRequest, + ); + foreach ($contexts as $context) { + $items[] = $contextService->getSummaryProperties($context, $propertyArgs); + } + } + + $data = array( + 'itemsMax' => $contextService->getContextsMaxCount($allowedParams), + 'items' => $items, + ); + + return $response->withJson($data, 200); + } + + /** + * Get a single context + * @param $slimRequest Request Slim request object + * @param $response Response object + * @param array $args arguments + * + * @return Response + */ + public function getContext($slimRequest, $response, $args) { + $request = $this->getRequest(); + $user = $request->getUser(); + + $contextService = ServicesContainer::instance()->get('context'); + $context = $contextService->getContext((int) $args['contextId']); + + if (!$context) { + return $response->withStatus(404)->withJsonError('api.contexts.404.contextNotFound'); + } + + // Don't allow to get one context from a different context's endpoint + if ($request->getContext() && $request->getContext()->getId() !== $context->getId()) { + return $response->withStatus(403)->withJsonError('api.contexts.403.contextsDidNotMatch'); + } + + // A disabled journal can only be access by site admins and users with a + // manager role in that journal + if (!$context->getEnabled()) { + $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES); + if (!in_array(ROLE_ID_SITE_ADMIN, $userRoles)) { + $roleDao = DaoRegistry::getDao('RoleDAO'); + if (!$roleDao->userHasRole($context->getId(), $user->getId(), ROLE_ID_MANAGER)) { + return $response->withStatus(403)->withJsonError('api.contexts.403.notAllowed'); + } + } + } + + $data = $contextService->getFullProperties($context, array( + 'request' => $request, + 'slimRequest' => $slimRequest + )); + + return $response->withJson($data, 200); + } + + /** + * Get the theme and any theme options for a context + * @param $slimRequest Request Slim request object + * @param $response Response object + * @param array $args arguments + * + * @return Response + */ + public function getTheme($slimRequest, $response, $args) { + $request = $this->getRequest(); + $user = $request->getUser(); + + $contextService = ServicesContainer::instance()->get('context'); + $context = $contextService->getContext((int) $args['contextId']); + + if (!$context) { + return $response->withStatus(404)->withJsonError('api.contexts.404.contextNotFound'); + } + + // Don't allow to get one context from a different context's endpoint + if ($request->getContext() && $request->getContext()->getId() !== $context->getId()) { + return $response->withStatus(403)->withJsonError('api.contexts.403.contextsDidNotMatch'); + } + + // A disabled journal can only be access by site admins and users with a + // manager role in that journal + if (!$context->getEnabled()) { + $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES); + if (!in_array(ROLE_ID_SITE_ADMIN, $userRoles)) { + $roleDao = DaoRegistry::getDao('RoleDAO'); + if (!$roleDao->userHasRole($context->getId(), $user->getId(), ROLE_ID_MANAGER)) { + return $response->withStatus(403)->withJsonError('api.contexts.403.notAllowed'); + } + } + } + + $allThemes = PluginRegistry::loadCategory('themes', true); + $activeTheme = null; + foreach ($allThemes as $theme) { + if ($context->getData('themePluginPath') === $theme->getDirName()) { + $activeTheme = $theme; + break; + } + } + + if (!$activeTheme) { + return $response->withStatus(404)->withJsonError('api.themes.404.themeUnavailable'); + } + + $data = array_merge( + $activeTheme->getOptionValues($context->getId()), + ['themePluginPath' => $theme->getDirName()] + ); + + ksort($data); + + return $response->withJson($data, 200); + } + + /** + * Add a context + * @param $slimRequest Request Slim request object + * @param $response Response object + * @param array $args arguments + * + * @return Response + */ + public function addContext($slimRequest, $response, $args) { + $request = $this->getRequest(); + + // This endpoint is only available at the site-wide level + if ($request->getContext()) { + return $response->withStatus(404)->withJsonError('api.submissions.404.siteWideEndpoint'); + } + + $site = $request->getSite(); + $params = $this->convertStringsToSchema(SCHEMA_CONTEXT, $slimRequest->getParsedBody()); + + $primaryLocale = $site->getPrimaryLocale(); + $allowedLocales = $site->getSupportedLocales(); + $contextService = ServicesContainer::instance()->get('context'); + $errors = $contextService->validate(VALIDATE_ACTION_ADD, $params, $allowedLocales, $primaryLocale); + + if (!empty($errors)) { + return $response->withStatus(400)->withJson($errors); + } + + $context = Application::getContextDAO()->newDataObject(); + $context->_data = $params; + $context = $contextService->addContext($context, $request); + $contextProps = $contextService->getFullProperties($context, array( + 'request' => $request, + 'slimRequest' => $slimRequest + )); + + return $response->withJson($contextProps, 200); + } + + /** + * Edit a context + * @param $slimRequest Request Slim request object + * @param $response Response object + * @param array $args arguments + * + * @return Response + */ + public function editContext($slimRequest, $response, $args) { + $request = $this->getRequest(); + $requestContext = $request->getContext(); + + $contextId = (int) $args['contextId']; + + // Don't allow to get one context from a different context's endpoint + if ($request->getContext() && $request->getContext()->getId() !== $contextId) { + return $response->withStatus(403)->withJsonError('api.contexts.403.contextsDidNotMatch'); + } + + $contextService = ServicesContainer::instance()->get('context'); + $context = $contextService->getContext($contextId); + + if (!$context) { + return $response->withStatus(404)->withJsonError('api.contexts.404.contextNotFound'); + } + + $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES); + if (!$requestContext && !in_array(ROLE_ID_SITE_ADMIN, $userRoles)) { + return $response->withStatus(403)->withJsonError('api.contexts.403.notAllowedEdit'); + } + + $params = $this->convertStringsToSchema(SCHEMA_CONTEXT, $slimRequest->getParsedBody()); + $params['id'] = $contextId; + + $site = $request->getSite(); + $primaryLocale = $context->getPrimaryLocale(); + $allowedLocales = $context->getSupportedLocales(); + + $errors = $contextService->validate(VALIDATE_ACTION_EDIT, $params, $allowedLocales, $primaryLocale); + + if (!empty($errors)) { + return $response->withStatus(400)->withJson($errors); + } + $context = $contextService->editContext($context, $params, $request); + + $contextProps = $contextService->getFullProperties($context, array( + 'request' => $request, + 'slimRequest' => $slimRequest + )); + + return $response->withJson($contextProps, 200); + } + + /** + * Edit a context's theme and theme options + * @param $slimRequest Request Slim request object + * @param $response Response object + * @param array $args arguments + * + * @return Response + */ + public function editTheme($slimRequest, $response, $args) { + $request = $this->getRequest(); + $requestContext = $request->getContext(); + + $contextId = (int) $args['contextId']; + + // Don't allow to get one context from a different context's endpoint + if ($request->getContext() && $request->getContext()->getId() !== $contextId) { + return $response->withStatus(403)->withJsonError('api.contexts.403.contextsDidNotMatch'); + } + + $contextService = ServicesContainer::instance()->get('context'); + $context = $contextService->getContext($contextId); + + if (!$context) { + return $response->withStatus(404)->withJsonError('api.contexts.404.contextNotFound'); + } + + $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES); + if (!$requestContext && !in_array(ROLE_ID_SITE_ADMIN, $userRoles)) { + return $response->withStatus(403)->withJsonError('api.contexts.403.notAllowedEdit'); + } + + $params = $slimRequest->getParsedBody(); + + // Validate the themePluginPath and allow themes to perform their own validation + $themePluginPath = empty($params['themePluginPath']) ? null : $params['themePluginPath']; + if ($themePluginPath !== $context->getData('themePluginPath')) { + $errors = $contextService->validate( + VALIDATE_ACTION_EDIT, + ['themePluginPath' => $themePluginPath], + $context->getSupportedLocales(), + $context->getPrimaryLocale() + ); + if (!empty($errors)) { + return $response->withJson($errors, 400); + } + $newContext = $contextService->editContext($context, ['themePluginPath' => $themePluginPath], $request); + } + + // Get the appropriate theme plugin + $allThemes = PluginRegistry::loadCategory('themes', true); + $selectedTheme = null; + foreach ($allThemes as $theme) { + if ($themePluginPath === $theme->getDirName()) { + $selectedTheme = $theme; + break; + } + } + + // Run the theme's init() method if a new theme has been selected + if (isset($newContext)) { + $selectedTheme->init(); + } + + $errors = $selectedTheme->validateOptions($params, $themePluginPath, $context->getId(), $request); + if (!empty($errors)) { + return $response->withJson($errors, 400); + } + + // Only accept params that are defined in the theme options + $options = $selectedTheme->getOptionsConfig(); + foreach ($options as $optionName => $optionConfig) { + if (!array_key_exists($optionName, $params)) { + continue; + } + $selectedTheme->saveOption($optionName, $params[$optionName], $context->getId()); + } + + // Clear the template cache so that new settings can take effect + $templateMgr = TemplateManager::getManager(Application::getRequest()); + $templateMgr->clearTemplateCache(); + $templateMgr->clearCssCache(); + + $data = array_merge( + $selectedTheme->getOptionValues($context->getId()), + ['themePluginPath' => $themePluginPath] + ); + + ksort($data); + + return $response->withJson($data, 200); + } + + /** + * Delete a context + * @param $slimRequest Request Slim request object + * @param $response Response object + * @param array $args arguments + * + * @return Response + */ + public function deleteContext($slimRequest, $response, $args) { + + // This endpoint is only available at the site-wide level + if ($this->getRequest()->getContext()) { + return $response->withStatus(404)->withJsonError('api.submissions.404.siteWideEndpoint'); + } + + $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES); + if (!in_array(ROLE_ID_SITE_ADMIN, $userRoles)) { + $response->withStatus(403)->withJsonError('api.contexts.403.notAllowedDelete'); + } + + $contextId = (int) $args['contextId']; + + $contextService = ServicesContainer::instance()->get('context'); + $context = $contextService->getContext($contextId); + + if (!$context) { + return $response->withStatus(404)->withJsonError('api.contexts.404.contextNotFound'); + } + + $contextProps = $contextService->getSummaryProperties($context, array( + 'request' => $this->getRequest(), + 'slimRequest' => $slimRequest + )); + + $contextService->deleteContext($context); + + return $response->withJson($contextProps, 200); + } +} diff --git a/api/v1/temporaryFiles/PKPTemporaryFilesHandler.inc.php b/api/v1/temporaryFiles/PKPTemporaryFilesHandler.inc.php new file mode 100644 index 00000000000..32f90854884 --- /dev/null +++ b/api/v1/temporaryFiles/PKPTemporaryFilesHandler.inc.php @@ -0,0 +1,122 @@ +_handlerPath = 'temporaryFiles'; + $roles = array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_REVIEWER, ROLE_ID_AUTHOR, ROLE_ID_ASSISTANT); + $this->_endpoints = array( + 'OPTIONS' => array( + array( + 'pattern' => $this->getEndpointPattern(), + 'handler' => array($this, 'getOptions'), + 'roles' => $roles, + ), + ), + 'POST' => array( + array( + 'pattern' => $this->getEndpointPattern(), + 'handler' => array($this, 'uploadFile'), + 'roles' => $roles, + ), + ), + ); + + parent::__construct(); + } + + /** + * @copydoc PKPHandler::authorize + */ + public function authorize($request, &$args, $roleAssignments) { + import('lib.pkp.classes.security.authorization.PolicySet'); + $rolePolicy = new PolicySet(COMBINING_PERMIT_OVERRIDES); + + import('lib.pkp.classes.security.authorization.RoleBasedHandlerOperationPolicy'); + foreach($roleAssignments as $role => $operations) { + $rolePolicy->addPolicy(new RoleBasedHandlerOperationPolicy($request, $role, $operations)); + } + $this->addPolicy($rolePolicy); + + return parent::authorize($request, $args, $roleAssignments); + } + + /** + * A helper method which adds the necessary response headers to allow + * file uploads + * + * @param $response Response object + * @return Response + */ + private function getResponse($response) { + return $response->withHeader('Access-Control-Allow-Headers', 'Content-Type, X-Requested-With, X-PINGOTHER, X-File-Name, Cache-Control'); + } + + /** + * Upload a requested file + * + * @param $slimRequest Request Slim request object + * @param $response Response object + * @param $args array arguments + * @return Response + */ + public function uploadFile($slimRequest, $response, $args) { + $request = $this->getRequest(); + + if (empty($_FILES)) { + return $response->withStatus(400)->withJsonError('api.temporaryFiles.400.noUpload'); + } + + import('lib.pkp.classes.file.TemporaryFileManager'); + $temporaryFileManager = new TemporaryFileManager(); + $uploadedFile = $temporaryFileManager->handleUpload(key($_FILES), $request->getUser()->getId()); + + if ($uploadedFile === false) { + $errorCode = $_FILES[key($_FILES)]['error']; + switch ($errorCode) { + case UPLOAD_ERR_INI_SIZE: + case UPLOAD_ERR_FORM_SIZE: + return $response->withStatus(400)->withJsonError('api.temporaryFiles.400.fileSize', ['maxSize' => Application::getReadableMaxFileSize()]); + case UPLOAD_ERR_PARTIAL: + return $response->withStatus(400)->withJsonError('api.temporaryFiles.409.uploadFailed'); + case UPLOAD_ERR_NO_FILE: + return $response->withStatus(400)->withJsonError('api.temporaryFiles.400.noUpload'); + case UPLOAD_ERR_NO_TMP_DIR: + case UPLOAD_ERR_CANT_WRITE: + case UPLOAD_ERR_EXTENSION: + return $response->withStatus(400)->withJsonError('api.temporaryFiles.400.config'); + } + return $response->withStatus(400)->withJsonError('api.temporaryFiles.409.uploadFailed'); + } + + return $this->getResponse($response->withJson(['id' => $uploadedFile->getId()])); + } + + /** + * Respond affirmatively to a HTTP OPTIONS request with headers which allow + * file uploads + * + * @param $slimRequest Request Slim request object + * @param $response Response object + * @param $args array arguments + * @return Response + */ + public function getOptions($slimRequest, $response, $args) { + return $this->getResponse($response); + } +} diff --git a/api/v1/users/PKPUserHandler.inc.php b/api/v1/users/PKPUserHandler.inc.php index f634923d9e2..026d28b7a6f 100644 --- a/api/v1/users/PKPUserHandler.inc.php +++ b/api/v1/users/PKPUserHandler.inc.php @@ -70,7 +70,7 @@ public function getUsers($slimRequest, $response, $args) { $userService = ServicesContainer::instance()->get('user'); if (!$context) { - return $response->withStatus(404)->withJsonError('api.submissions.404.resourceNotFound'); + return $response->withStatus(404)->withJsonError('api.404.resourceNotFound'); } $params = $this->_buildListRequestParams($slimRequest); @@ -113,7 +113,7 @@ public function getUser($slimRequest, $response, $args) { } if (!$user) { - return $response->withStatus(404)->withJsonError('api.submissions.404.resourceNotFound'); + return $response->withStatus(404)->withJsonError('api.404.resourceNotFound'); } $data = $userService->getFullProperties($user, array( @@ -138,7 +138,7 @@ public function getReviewers($slimRequest, $response, $args) { $userService = ServicesContainer::instance()->get('user'); if (!$context) { - return $response->withStatus(404)->withJsonError('api.submissions.404.resourceNotFound'); + return $response->withStatus(404)->withJsonError('api.404.resourceNotFound'); } $params = $this->_buildReviewerListRequestParams($slimRequest); diff --git a/classes/admin/form/PKPSiteSettingsForm.inc.php b/classes/admin/form/PKPSiteSettingsForm.inc.php deleted file mode 100644 index a53dc248278..00000000000 --- a/classes/admin/form/PKPSiteSettingsForm.inc.php +++ /dev/null @@ -1,205 +0,0 @@ -siteSettingsDao = DAORegistry::getDAO('SiteSettingsDAO'); - - // Validation checks for this form - $this->addCheck(new FormValidatorLocale($this, 'title', 'required', 'admin.settings.form.titleRequired')); - $this->addCheck(new FormValidatorLocale($this, 'contactName', 'required', 'admin.settings.form.contactNameRequired')); - $this->addCheck(new FormValidatorLocaleEmail($this, 'contactEmail', 'required', 'admin.settings.form.contactEmailRequired')); - $this->addCheck(new FormValidatorCustom($this, 'minPasswordLength', 'required', 'admin.settings.form.minPasswordLengthRequired', function($l) { - return $l >= SITE_MIN_PASSWORD_LENGTH; - })); - $this->addCheck(new FormValidatorPost($this)); - $this->addCheck(new FormValidatorCSRF($this)); - } - - /** - * @copydoc Form::display - */ - function display($request = null, $template = null) { - $site = Request::getSite(); - $publicFileManager = new PublicFileManager(); - $siteStyleFilename = $publicFileManager->getSiteFilesPath() . '/' . $site->getSiteStyleFilename(); - $templateMgr = TemplateManager::getManager(); - $templateMgr->assign(array( - 'showThumbnail' => $site->getSetting('showThumbnail'), - 'showTitle' => $site->getSetting('showTitle'), - 'showDescription' => $site->getSetting('showDescription'), - 'originalStyleFilename' => $site->getOriginalStyleFilename(), - 'pageHeaderTitleImage' => $site->getSetting('pageHeaderTitleImage'), - 'styleFilename' => $site->getSiteStyleFilename(), - 'publicFilesDir' => Request::getBasePath() . '/' . $publicFileManager->getSiteFilesPath(), - 'dateStyleFileUploaded' => file_exists($siteStyleFilename)?filemtime($siteStyleFilename):null, - 'siteStyleFileExists' => file_exists($siteStyleFilename), - )); - return parent::display($request, $template); - } - - /** - * Initialize form data from current settings. - */ - function initData() { - $siteDao = DAORegistry::getDAO('SiteDAO'); - $site = $siteDao->getSite(); - - $data = array( - 'title' => $site->getSetting('title'), // Localized - 'intro' => $site->getSetting('intro'), // Localized - 'redirect' => $site->getRedirect(), - 'showThumbnail' => $site->getSetting('showThumbnail'), - 'showTitle' => $site->getSetting('showTitle'), - 'showDescription' => $site->getSetting('showDescription'), - 'about' => $site->getSetting('about'), // Localized - 'pageFooter' => $site->getSetting('pageFooter'), // Localized - 'contactName' => $site->getSetting('contactName'), // Localized - 'contactEmail' => $site->getSetting('contactEmail'), // Localized - 'minPasswordLength' => $site->getMinPasswordLength(), - 'pageHeaderTitleType' => $site->getSetting('pageHeaderTitleType'), // Localized - 'themePluginPath' => $site->getSetting('themePluginPath') - ); - - foreach ($data as $key => $value) { - $this->setData($key, $value); - } - } - - function getLocaleFieldNames() { - return array('title', 'pageHeaderTitleType', 'intro', 'about', 'contactName', 'contactEmail', 'pageFooter', 'privacyStatement'); - } - - /** - * Assign form data to user-submitted data. - */ - function readInputData() { - $this->readUserVars( - array('pageHeaderTitleType', 'title', 'intro', 'about', 'redirect', 'contactName', 'contactEmail', 'minPasswordLength', 'pageHeaderTitleImageAltText', 'showThumbnail', 'showTitle', 'showDescription', 'themePluginPath', 'pageFooter') - ); - } - - /** - * Save site settings. - */ - function execute() { - parent::execute(); - $siteDao = DAORegistry::getDAO('SiteDAO'); - $site = $siteDao->getSite(); - - $site->setRedirect($this->getData('redirect')); - $site->setMinPasswordLength($this->getData('minPasswordLength')); - - // Clear the template cache if theme has changed - if ($this->getData('themePluginPath') != $site->getSetting('themePluginPath')) { - $templateMgr = TemplateManager::getManager(Application::getRequest()); - $templateMgr->clearTemplateCache(); - $templateMgr->clearCssCache(); - } - - $siteSettingsDao = $this->siteSettingsDao; - foreach ($this->getLocaleFieldNames() as $setting) { - $siteSettingsDao->updateSetting($setting, $this->getData($setting), null, true); - } - - $setting = $site->getSetting('pageHeaderTitleImage'); - if (!empty($setting)) { - $imageAltText = $this->getData('pageHeaderTitleImageAltText'); - $locale = $this->getFormLocale(); - $setting[$locale]['altText'] = $imageAltText[$locale]; - $site->updateSetting('pageHeaderTitleImage', $setting, 'object', true); - } - - $site->updateSetting('showThumbnail', $this->getData('showThumbnail'), 'bool'); - $site->updateSetting('showTitle', $this->getData('showTitle'), 'bool'); - $site->updateSetting('showDescription', $this->getData('showDescription'), 'bool'); - - $siteDao->updateObject($site); - - return true; - } - - /** - * Uploads custom site stylesheet. - */ - function uploadSiteStyleSheet() { - import('classes.file.PublicFileManager'); - $publicFileManager = new PublicFileManager(); - $site = Request::getSite(); - if ($publicFileManager->uploadedFileExists('siteStyleSheet')) { - $type = $publicFileManager->getUploadedFileType('siteStyleSheet'); - if ($type != 'text/plain' && $type != 'text/css') { - return false; - } - - $uploadName = $site->getSiteStyleFilename(); - if ($publicFileManager->uploadSiteFile('siteStyleSheet', $uploadName)) { - $siteDao = DAORegistry::getDAO('SiteDAO'); - $site->setOriginalStyleFilename($publicFileManager->getUploadedFileName('siteStyleSheet')); - $siteDao->updateObject($site); - } - } - - return true; - } - - /** - * Uploads custom site logo. - */ - function uploadPageHeaderTitleImage($locale) { - import('classes.file.PublicFileManager'); - $publicFileManager = new PublicFileManager(); - $site = Request::getSite(); - if ($publicFileManager->uploadedFileExists('pageHeaderTitleImage')) { - $type = $publicFileManager->getUploadedFileType('pageHeaderTitleImage'); - $extension = $publicFileManager->getImageExtension($type); - if (!$extension) return false; - - $uploadName = 'pageHeaderTitleImage_' . $locale . $extension; - if ($publicFileManager->uploadSiteFile('pageHeaderTitleImage', $uploadName)) { - $siteDao = DAORegistry::getDAO('SiteDAO'); - $setting = $site->getSetting('pageHeaderTitleImage'); - list($width, $height) = getimagesize($publicFileManager->getSiteFilesPath() . '/' . $uploadName); - $setting[$locale] = array( - 'originalFilename' => $publicFileManager->getUploadedFileName('pageHeaderTitleImage'), - 'width' => $width, - 'height' => $height, - 'uploadName' => $uploadName, - 'dateUploaded' => Core::getCurrentDate() - ); - $site->updateSetting('pageHeaderTitleImage', $setting, 'object', true); - } - } - - return true; - } -} - - diff --git a/classes/context/Context.inc.php b/classes/context/Context.inc.php index 0591a6027b8..3b4106d3f40 100644 --- a/classes/context/Context.inc.php +++ b/classes/context/Context.inc.php @@ -21,7 +21,7 @@ class Context extends DataObject { * @return string */ function getLocalizedName($preferredLocale = null) { - return $this->getLocalizedSetting('name', $preferredLocale); + return $this->getLocalizedData('name', $preferredLocale); } /** @@ -36,7 +36,7 @@ function setName($name, $locale = null) { * get the name of the context */ function getName($locale = null) { - return $this->getSetting('name', $locale); + return $this->getData('name', $locale); } /** @@ -44,7 +44,7 @@ function getName($locale = null) { * @return string */ function getContactName() { - return $this->getSetting('contactName'); + return $this->getData('contactName'); } /** @@ -60,7 +60,7 @@ function setContactName($contactName) { * @return string */ function getContactEmail() { - return $this->getSetting('contactEmail'); + return $this->getData('contactEmail'); } /** @@ -157,7 +157,7 @@ function setSequence($sequence) { * @return string */ function getLocalizedDescription() { - return $this->getLocalizedSetting('description'); + return $this->getLocalizedData('description'); } /** @@ -165,7 +165,7 @@ function getLocalizedDescription() { * @return string */ function getLocalizedAcronym() { - return $this->getLocalizedSetting('acronym'); + return $this->getLocalizedData('acronym'); } /** @@ -174,7 +174,7 @@ function getLocalizedAcronym() { * @return string */ function getAcronym($locale) { - return $this->getSetting('acronym', $locale); + return $this->getData('acronym', $locale); } /** @@ -182,7 +182,7 @@ function getAcronym($locale) { * @return array */ function getSupportedFormLocales() { - return $this->getSetting('supportedFormLocales'); + return $this->getData('supportedFormLocales'); } /** @@ -215,7 +215,7 @@ function getSupportedFormLocaleNames() { * @return array */ function getSupportedSubmissionLocales() { - return $this->getSetting('supportedSubmissionLocales'); + return $this->getData('supportedSubmissionLocales'); } /** @@ -249,7 +249,7 @@ function getSupportedSubmissionLocaleNames() { * @return array */ function getSupportedLocales() { - return $this->getSetting('supportedLocales'); + return $this->getData('supportedLocales'); } /** @@ -286,33 +286,19 @@ function getAssocType() { } /** - * Get the settings DAO for this context object. - * @return DAO + * @deprecated Most settings should be available from self::getData(). In + * other cases, use the context settings DAO directly. */ - static function getSettingsDAO() { - assert(false); // Must be implemented by subclasses + function getSetting($name, $locale = null) { + return $this->getData($name, $locale); } /** - * Retrieve array of settings. - * @return array - */ - function &getSettings() { - $settingsDao = $this->getSettingsDAO(); - $settings =& $settingsDao->getSettings($this->getId()); - return $settings; - } - - /** - * Retrieve a context setting value. - * @param $name string - * @param $locale string - * @return mixed + * @deprecated Most settings should be available from self::getData(). In + * other cases, use the context settings DAO directly. */ - function &getSetting($name, $locale = null) { - $settingsDao = $this->getSettingsDAO(); - $setting =& $settingsDao->getSetting($this->getId(), $name, $locale); - return $setting; + function getLocalizedSetting($name, $locale = null) { + return $this->getLocalizedData($name, $locale); } /** @@ -323,23 +309,10 @@ function &getSetting($name, $locale = null) { * @param $isLocalized boolean optional */ function updateSetting($name, $value, $type = null, $isLocalized = false) { - $settingsDao = $this->getSettingsDAO(); + $settingsDao = Application::getContextSettingsDAO(); return $settingsDao->updateSetting($this->getId(), $name, $value, $type, $isLocalized); } - /** - * Get a localized context setting by name. - * @param $name string - * @return mixed - */ - function &getLocalizedSetting($name) { - $returner = $this->getSetting($name, AppLocale::getLocale()); - if ($returner === null) { - $returner = $this->getSetting($name, AppLocale::getPrimaryLocale()); - } - return $returner; - } - /** * Get context main page views. * @return int @@ -388,7 +361,7 @@ function getMetricTypes($withDisplayNames = false) { * type could be identified. */ function getDefaultMetricType() { - $defaultMetricType = $this->getSetting('defaultMetricType'); + $defaultMetricType = $this->getData('defaultMetricType'); // Check whether the selected metric type is valid. $availableMetrics = $this->getMetricTypes(); diff --git a/classes/context/ContextDAO.inc.php b/classes/context/ContextDAO.inc.php index cbe45bc3bef..9960a864877 100644 --- a/classes/context/ContextDAO.inc.php +++ b/classes/context/ContextDAO.inc.php @@ -13,9 +13,9 @@ * * @brief Operations for retrieving and modifying context objects. */ +import('lib.pkp.classes.db.SchemaDAO'); -abstract class ContextDAO extends DAO { - +abstract class ContextDAO extends SchemaDAO { /** * Retrieve a context by context ID. * @param $contextId int @@ -23,7 +23,7 @@ abstract class ContextDAO extends DAO { */ function getById($contextId) { $result = $this->retrieve( - 'SELECT * FROM ' . $this->_getTableName() . ' WHERE ' . $this->_getPrimaryKeyColumn() . ' = ?', + 'SELECT * FROM ' . $this->tableName . ' WHERE ' . $this->primaryKeyColumn . ' = ?', (int) $contextId ); @@ -57,66 +57,6 @@ function getLocaleFieldNames() { return array('name', 'description'); } - /** - * Internal function to return a Context object from a row. - * @param $row array - * @return Context - */ - function _fromRow($row) { - $context = $this->newDataObject(); - $context->setId($row[$this->_getPrimaryKeyColumn()]); - $context->setPath($row['path']); - $context->setSequence($row['seq']); - $this->getDataObjectSettings($this->_getSettingsTableName(), $this->_getPrimaryKeyColumn(), $row[$this->_getPrimaryKeyColumn()], $context); - return $context; - } - - /** - * Insert a new context. - * @param $context Context - * @return int Inserted context ID - */ - function insertObject($context) { - $this->update( - 'INSERT INTO ' . $this->_getTableName() . ' - (path, seq, enabled, primary_locale) - VALUES - (?, ?, ?, ?)', - array( - $context->getPath(), - (int) $context->getSequence(), - (int) $context->getEnabled(), - $context->getPrimaryLocale() - ) - ); - - $context->setId($this->getInsertId()); - return $context->getId(); - } - - /** - * Update an existing context. - * @param $press Press - */ - function updateObject($context) { - return $this->update( - 'UPDATE ' . $this->_getTableName() . ' - SET - path = ?, - seq = ?, - enabled = ?, - primary_locale = ? - WHERE ' . $this->_getPrimaryKeyColumn() . ' = ?', - array( - $context->getPath(), - (int) $context->getSequence(), - (int) $context->getEnabled(), - $context->getPrimaryLocale(), - (int) $context->getId() - ) - ); - } - /** * Check if a context exists with a specified path. * @param $path string the path for the context @@ -124,7 +64,7 @@ function updateObject($context) { */ function existsByPath($path) { $result = $this->retrieve( - 'SELECT COUNT(*) FROM ' . $this->_getTableName() . ' WHERE path = ?', + 'SELECT COUNT(*) FROM ' . $this->tableName . ' WHERE path = ?', (string) $path ); $returner = isset($result->fields[0]) && $result->fields[0] == 1 ? true : false; @@ -139,7 +79,7 @@ function existsByPath($path) { */ function getByPath($path) { $result = $this->retrieve( - 'SELECT * FROM ' . $this->_getTableName() . ' WHERE path = ?', + 'SELECT * FROM ' . $this->tableName . ' WHERE path = ?', (string) $path ); if ($result->RecordCount() == 0) return null; @@ -157,7 +97,7 @@ function getByPath($path) { */ function getAll($enabledOnly = false, $rangeInfo = null) { $result = $this->retrieveRange( - 'SELECT * FROM ' . $this->_getTableName() . + 'SELECT * FROM ' . $this->tableName . ($enabledOnly?' WHERE enabled = 1':'') . ' ORDER BY seq', false, @@ -181,10 +121,10 @@ function getAvailable($userId = null, $rangeInfo = null) { ); $result = $this->retrieveRange( - 'SELECT c.* FROM ' . $this->_getTableName() . ' c + 'SELECT c.* FROM ' . $this->tableName . ' c WHERE c.enabled = 1 ' . ($userId? - 'OR c.' . $this->_getPrimaryKeyColumn() . ' 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 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 = ?) ' :'') . 'ORDER BY seq', @@ -207,11 +147,11 @@ function getBySetting($settingName, $settingValue, $contextId = null) { if ($contextId) $params[] = $contextId; $result = $this->retrieve( - 'SELECT * FROM ' . $this->_getTableName() . ' AS c - LEFT JOIN ' . $this->_getSettingsTableName() . ' AS cs - ON c.' . $this->_getPrimaryKeyColumn() . ' = cs.' . $this->_getPrimaryKeyColumn() . + 'SELECT * FROM ' . $this->tableName . ' AS c + LEFT JOIN ' . $this->settingsTableName . ' AS cs + ON c.' . $this->primaryKeyColumn . ' = cs.' . $this->primaryKeyColumn . ' WHERE cs.setting_name = ? AND cs.setting_value = ?' . - ($contextId?' AND c.' . $this->_getPrimaryKeyColumn() . ' = ?':''), + ($contextId?' AND c.' . $this->primaryKeyColumn . ' = ?':''), $params ); @@ -224,41 +164,7 @@ function getBySetting($settingName, $settingValue, $contextId = null) { * @return int */ function getInsertId() { - return $this->_getInsertId($this->_getTableName(), $this->_getPrimaryKeyColumn()); - } - - /** - * Delete a context by object - * @param $context Context - */ - function deleteObject($context) { - $this->deleteById($context->getId()); - } - - /** - * Delete a context by ID. - * @param $contextId int - */ - function deleteById($contextId) { - $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); - $userGroupDao->deleteAssignmentsByContextId($contextId); - $userGroupDao->deleteByContextId($contextId); - - $genreDao = DAORegistry::getDAO('GenreDAO'); - $genreDao->deleteByContextId($contextId); - - $this->update( - 'DELETE FROM ' . $this->_getTableName() . ' WHERE ' . $this->_getPrimaryKeyColumn() . ' = ?', - (int) $contextId - ); - - // NavigationMenus - $navigationMenuDao = DAORegistry::getDAO('NavigationMenuDAO'); - $navigationMenuDao->deleteByContextId($contextId); - - // NavigationMenuItems - $navigationMenuItemDao = DAORegistry::getDAO('NavigationMenuItemDAO'); - $navigationMenuItemDao->deleteByContextId($contextId); + return $this->_getInsertId($this->tableName, $this->primaryKeyColumn); } /** @@ -266,13 +172,13 @@ function deleteById($contextId) { */ function resequence() { $result = $this->retrieve( - 'SELECT ' . $this->_getPrimaryKeyColumn() . ' FROM ' . $this->_getTableName() . ' ORDER BY seq' + 'SELECT ' . $this->primaryKeyColumn . ' FROM ' . $this->tableName . ' ORDER BY seq' ); for ($i=1; !$result->EOF; $i+=2) { list($contextId) = $result->fields; $this->update( - 'UPDATE ' . $this->_getTableName() . ' SET seq = ? WHERE ' . $this->_getPrimaryKeyColumn() . ' = ?', + 'UPDATE ' . $this->tableName . ' SET seq = ? WHERE ' . $this->primaryKeyColumn . ' = ?', array( $i, $contextId @@ -283,27 +189,6 @@ function resequence() { } $result->Close(); } - - // - // Protected methods - // - /** - * Get the table name for this context. - * @return string - */ - abstract protected function _getTableName(); - - /** - * Get the table name for this context's settings table. - * @return string - */ - abstract protected function _getSettingsTableName(); - - /** - * Get the name of the primary key column for this context. - * @return string - */ - abstract protected function _getPrimaryKeyColumn(); } diff --git a/classes/controllers/grid/feature/OrderListbuilderItemsFeature.inc.php b/classes/controllers/grid/feature/OrderListbuilderItemsFeature.inc.php deleted file mode 100644 index 2f7f06fdcf0..00000000000 --- a/classes/controllers/grid/feature/OrderListbuilderItemsFeature.inc.php +++ /dev/null @@ -1,40 +0,0 @@ -getAuthorizedContextObject(ASSOC_TYPE_PLUGIN); /* @var $plugin Plugin */ if ($request->checkCSRF() && $plugin->getCanEnable()) { $plugin->setEnabled(true); - $user = $request->getUser(); - $notificationManager = new NotificationManager(); - $notificationManager->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_PLUGIN_ENABLED, array('pluginName' => $plugin->getDisplayName())); + if (empty($args['disableNotification'])) { + $user = $request->getUser(); + $notificationManager = new NotificationManager(); + $notificationManager->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_PLUGIN_ENABLED, array('pluginName' => $plugin->getDisplayName())); + } + return DAO::getDataChangedEvent($request->getUserVar('plugin'), $request->getUserVar($this->getCategoryRowIdParameterName())); } - return DAO::getDataChangedEvent($request->getUserVar('plugin'), $request->getUserVar($this->getCategoryRowIdParameterName())); + return new JSONMessage(false); } /** @@ -261,11 +264,14 @@ function disable($args, $request) { $plugin = $this->getAuthorizedContextObject(ASSOC_TYPE_PLUGIN); /* @var $plugin Plugin */ if ($request->checkCSRF() && $plugin->getCanDisable()) { $plugin->setEnabled(false); - $user = $request->getUser(); - $notificationManager = new NotificationManager(); - $notificationManager->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_PLUGIN_DISABLED, array('pluginName' => $plugin->getDisplayName())); + if (empty($args['disableNotification'])) { + $user = $request->getUser(); + $notificationManager = new NotificationManager(); + $notificationManager->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_PLUGIN_DISABLED, array('pluginName' => $plugin->getDisplayName())); + } + return DAO::getDataChangedEvent($request->getUserVar('plugin'), $request->getUserVar($this->getCategoryRowIdParameterName())); } - return DAO::getDataChangedEvent($request->getUserVar('plugin'), $request->getUserVar($this->getCategoryRowIdParameterName())); + return new JSONMessage(false); } /** diff --git a/classes/controllers/listbuilder/ListbuilderList.inc.php b/classes/controllers/listbuilder/ListbuilderList.inc.php deleted file mode 100644 index 8bd7a92dc10..00000000000 --- a/classes/controllers/listbuilder/ListbuilderList.inc.php +++ /dev/null @@ -1,92 +0,0 @@ -setId($id); - $this->setTitle($title); - } - - - // - // Getters and setters - // - /** - * Get this list id. - * @return mixed - */ - function getId() { - return $this->_id; - } - - /** - * Set this list id. - * @param $id mixed - */ - function setId($id) { - $this->_id = $id; - } - - /** - * Get this list title. - * @return string - */ - function getTitle() { - return $this->_title; - } - - /** - * Set this list title. - * @param $title string - */ - function setTitle($title) { - $this->_title = $title; - } - - /** - * Get the loaded list data. - * @return array - */ - function getData() { - return $this->_data; - } - - /** - * Set the loaded list data. - * @param $data array - */ - function setData($listData) { - assert(is_array($listData)); - $this->_data = $listData; - } -} - - diff --git a/classes/controllers/listbuilder/MultipleListsListbuilderHandler.inc.php b/classes/controllers/listbuilder/MultipleListsListbuilderHandler.inc.php deleted file mode 100644 index d5ba51baae5..00000000000 --- a/classes/controllers/listbuilder/MultipleListsListbuilderHandler.inc.php +++ /dev/null @@ -1,193 +0,0 @@ -_template)) { - $this->setTemplate('controllers/listbuilder/multipleListsListbuilder.tpl'); - } - - return $this->_template; - } - - /** - * Get an array with all listbuilder lists. - * @return Array of ListbuilderList objects. - */ - function &getLists() { - return $this->_lists; - } - - - // - // Protected methods. - // - /** - * Add a list to listbuilder. - * @param $list ListbuilderList - */ - function addList($list) { - assert(is_a($list, 'ListbuilderList')); - - $currentLists = $this->getLists(); - if (!is_array($currentLists)) { - $currentLists = array(); - } - $currentLists[$list->getId()] = $list; - $this->_setLists($currentLists); - } - - /** - * @see GridHandler::loadData($request, $filter) - * You should not extend or override this method. - * All the data loading for this component is done - * using ListbuilderList objects. - */ - protected function loadData($request, $filter) { - // Give a chance to subclasses set data - // on their lists. - $this->setListsData($request, $filter); - - $data = array(); - $lists = $this->getLists(); - - foreach ($lists as $list) { - $data[$list->getId()] = $list->getData(); - } - - return $data; - } - - /** - * @copydoc ListbuilderHandler::initialize() - */ - function initialize($request, $args = null) { - // Basic configuration. - // Currently this component only works with - // these configurations, but, if needed, it's - // easy to adapt this class to work with the other - // listbuilders configuration. - parent::initialize($request, $args); - $this->setSourceType(LISTBUILDER_SOURCE_TYPE_NONE); - $this->setSaveType(LISTBUILDER_SAVE_TYPE_EXTERNAL); - } - - - // - // Publicly (remotely) available listbuilder functions - // - /** - * Fetch the listbuilder. - * @param $args array - * @param $request PKPRequest - */ - function fetch($args, $request) { - $templateMgr = TemplateManager::getManager($request); - $templateMgr->assign('lists', $this->getLists()); - - return parent::fetch($args, $request); - } - - - // - // Extended protected methods. - // - /** - * @see GridHandler::initFeatures() - */ - protected function initFeatures($request, $args) { - // Multiple lists listbuilder always have orderable rows. - // We don't have any other requirement for it. - import('lib.pkp.classes.controllers.grid.feature.OrderMultipleListsItemsFeature'); - return array(new OrderMultipleListsItemsFeature()); - } - - /** - * @see ListbuilderHandler::getRowInstance() - */ - protected function getRowInstance() { - $row = parent::getRowInstance(); - - // Currently we can't/don't need to delete a row inside multiple - // lists listbuilder. If we need, we have to adapt this class - // and its js handler. - $row->setHasDeleteItemLink(false); - return $row; - } - - /** - * @see GridHandler::renderGridBodyPartsInternally() - */ - protected function renderGridBodyPartsInternally($request) { - // Render the rows. - $listsRows = array(); - $gridData = $this->getGridDataElements($request); - foreach ($gridData as $listId => $elements) { - $listsRows[$listId] = $this->renderRowsInternally($request, $elements); - } - - $templateMgr = TemplateManager::getManager($request); - $templateMgr->assign('grid', $this); - $templateMgr->assign('listsRows', $listsRows); - - // In listbuilders we don't use the grid body. - return false; - } - - - // - // Protected template methods. - // - /** - * Implement to set data on each list. This - * will be used by the loadData method to retrieve - * the listbuilder data. - * @param $request Request - * @param $filter string - */ - protected function setListsData($request, $filter) { - assert(false); - } - - - // - // Private helper methods. - // - /** - * Set the array with all listbuilder lists. - * @param $lists Array of ListbuilderList objects. - */ - private function _setLists($lists) { - $this->_lists = $lists; - } -} - - diff --git a/classes/controllers/tab/settings/SettingsTabHandler.inc.php b/classes/controllers/tab/settings/SettingsTabHandler.inc.php deleted file mode 100644 index 42dcb6c833b..00000000000 --- a/classes/controllers/tab/settings/SettingsTabHandler.inc.php +++ /dev/null @@ -1,229 +0,0 @@ -addRoleAssignment( - $role, - array('saveFormData', 'showTab') - ); - } - - // - // Getters and Setters - // - /** - * Get the current tab name. - * @return string - */ - function getCurrentTab() { - return $this->_currentTab; - } - - /** - * Set the current tab name. - * @param $currentTab string - */ - function setCurrentTab($currentTab) { - $this->_currentTab = $currentTab; - } - - /** - * Get an array with current page tabs and its respective forms or templates. - * @return array - */ - function getPageTabs() { - return $this->_pageTabs; - } - - /** - * Set an array with current page tabs and its respective forms or templates. - * @param array - */ - function setPageTabs($pageTabs) { - $this->_pageTabs = $pageTabs; - } - - // - // Extended methods from Handler - // - /** - * @see PKPHandler::initialize() - */ - function initialize($request) { - $this->setCurrentTab($request->getUserVar('tab')); - } - - // - // Public handler methods - // - /** - * Show a tab. - * @param $args array - * @param $request PKPRequest - * @return JSONMessage JSON object - */ - function showTab($args, $request) { - $this->setupTemplate($request); - if ($this->_isValidTab()) { - if ($this->_isTabTemplate()) { - $this->setupTemplate($request, true); - $templateMgr = TemplateManager::getManager($request); - if ($this->_isManagementHandler()) { - // Pass to template if we are in wizard mode. - $templateMgr->assign('wizardMode', $this->getWizardMode()); - } - $templateMgr->assign('canEdit', true); - return $templateMgr->fetchJson($this->_getTabTemplate()); - } else { - $tabForm = $this->getTabForm(); - $tabForm->initData(); - return new JSONMessage(true, $tabForm->fetch($request)); - } - } - } - - /** - * Handle forms data (save or edit). - * @param $args array - * @param $request Request - * @return JSONMessage JSON object - */ - function saveFormData($args, $request) { - - if ($this->_isValidTab()) { - $tabForm = $this->getTabForm(); - - // Try to save the form data. - $tabForm->readInputData(); - if($tabForm->validate()) { - $result = $tabForm->execute(); - if ($result !== false) { - $notificationManager = new NotificationManager(); - $user = $request->getUser(); - $notificationManager->createTrivialNotification($user->getId()); - } - - if (is_a($result, 'JSONMessage')) { - return $result; - } - } else { - return new JSONMessage(true); - } - } - return new JSONMessage(); - } - - /** - * Return an instance of the form based on the current tab. - * @return Form - */ - function getTabForm() { - $currentTab = $this->getCurrentTab(); - $pageTabs = $this->getPageTabs(); - - // Search for a form using the tab name. - import($pageTabs[$currentTab]); - $tabFormClassName = $this->_getFormClassName($pageTabs[$currentTab]); - - if ($this->_isManagementHandler()) { - $tabForm = new $tabFormClassName($this->getWizardMode()); - } else { - $tabForm = new $tabFormClassName(); - } - - assert(is_a($tabForm, 'Form')); - - return $tabForm; - } - - - // - // Private helper methods. - // - /** - * Return the tab template file - * @return string - */ - function _getTabTemplate() { - $currentTab = $this->getCurrentTab(); - $pageTabs = $this->getPageTabs(); - - return $pageTabs[$currentTab]; - } - - /** - * Check if the current tab value exists in pageTabsAndForms array. - * @return boolean - */ - function _isValidTab() { - if (array_key_exists($this->getCurrentTab(), $this->getPageTabs())) { - return true; - } else { - assert(false); - return false; - } - } - - /** - * Check if the tab use a template or not. - * @return boolean - */ - function _isTabTemplate() { - $currentTab = $this->getCurrentTab(); - $pageTabs = $this->getPageTabs(); - - return (strstr($pageTabs[$currentTab], '.tpl')); - } - - /** - * Return the form class name based on the current tab name. - * @param $classPath string - * @return string - */ - function _getFormClassName($classPath) { - $needle = '.form.'; - $formClassName = strstr($classPath, $needle); - $formClassName = trim(str_replace($needle, ' ', $formClassName)); - return $formClassName; - } - - /** - * Check if this handles management settings. - * @return boolean - */ - function _isManagementHandler() { - return is_subclass_of($this, 'ManagerSettingsTabHandler'); - } -} - - diff --git a/classes/controllers/tab/settings/form/ContextSettingsForm.inc.php b/classes/controllers/tab/settings/form/ContextSettingsForm.inc.php deleted file mode 100644 index a83912d0aaf..00000000000 --- a/classes/controllers/tab/settings/form/ContextSettingsForm.inc.php +++ /dev/null @@ -1,142 +0,0 @@ -addCheck(new FormValidatorPost($this)); - $this->addCheck(new FormValidatorCSRF($this)); - $this->setSettings($settings); - $this->setWizardMode($wizardMode); - parent::__construct($template); - } - - - // - // Getters and Setters - // - /** - * Get if the current form is in wizard mode (hide advanced settings). - * @return boolean - */ - function getWizardMode() { - return $this->_wizardMode; - } - - /** - * Set if the current form is in wizard mode (hide advanced settings). - * @param $wizardMode boolean - */ - function setWizardMode($wizardMode) { - $this->_wizardMode = $wizardMode; - } - - /** - * Get settings array. - * @return array - */ - function getSettings() { - return $this->_settings; - } - - /** - * Set settings array. - * @param $settings array - */ - function setSettings($settings) { - $this->_settings = $settings; - } - - - // - // Implement template methods from Form. - // - /** - * @copydoc Form::initData() - */ - function initData() { - $request = Application::getRequest(); - $context = $request->getContext(); - $this->_data = $context->getSettings(); - } - - /** - * @see Form::readInputData() - */ - function readInputData() { - $this->readUserVars(array_keys($this->getSettings())); - } - - /** - * @see Form::fetch() - * @param $params array optional - */ - function fetch($request, $template = null, $display = false, $params = null) { - $templateMgr = TemplateManager::getManager($request); - - // Insert the wizardMode parameter in params array to pass to template. - $params = array_merge((array)$params, array('wizardMode' => $this->getWizardMode())); - - // Pass the parameters to template. - foreach($params as $tplVar => $value) { - $templateMgr->assign($tplVar, $value); - } - - return parent::fetch($request, $template, $display); - } - - /** - * @see Form::execute() - */ - function execute() { - parent::execute(); - $request = Application::getRequest(); - $context = $request->getContext(); - $settingsDao = $context->getSettingsDao(); - $settings = $this->getSettings(); - - foreach ($this->_data as $name => $value) { - if (isset($settings[$name])) { - $isLocalized = in_array($name, $this->getLocaleFieldNames()); - $settingsDao->updateSetting( - $context->getId(), - $name, - $value, - $settings[$name], - $isLocalized - ); - } - } - } -} - - diff --git a/classes/core/APIRouter.inc.php b/classes/core/APIRouter.inc.php index 722b998a1ea..aa7f6ad33ac 100644 --- a/classes/core/APIRouter.inc.php +++ b/classes/core/APIRouter.inc.php @@ -95,8 +95,14 @@ function route($request) { $sourceFile = sprintf('api/%s/%s/index.php', $this->getVersion(), $this->getEntity()); if (!file_exists($sourceFile)) { - $dispatcher = $this->getDispatcher(); - $dispatcher->handle404(); + AppLocale::requireComponents(LOCALE_COMPONENT_PKP_API, LOCALE_COMPONENT_APP_API); + http_response_code('404'); + header('Content-Type: application/json'); + echo json_encode([ + 'error' => 'api.404.endpointNotFound', + 'errorMessage' => __('api.404.endpointNotFound'), + ]); + exit; } if (!defined('SESSION_DISABLE_INIT')) { @@ -134,10 +140,14 @@ function getRequestedOp($request) { * @copydoc PKPRouter::handleAuthorizationFailure() */ function handleAuthorizationFailure($request, $authorizationMessage) { - $dispatcher = $this->getDispatcher(); - $dispatcher->handle404(); + AppLocale::requireComponents(LOCALE_COMPONENT_PKP_API, LOCALE_COMPONENT_APP_API); + http_response_code('403'); + header('Content-Type: application/json'); + echo json_encode([ + 'error' => 'api.403.unauthorized', + 'errorMessage' => __('api.403.unauthorized'), + ]); + exit; } } - - diff --git a/classes/core/Dispatcher.inc.php b/classes/core/Dispatcher.inc.php index 20382b547c0..134aa9ed5f4 100644 --- a/classes/core/Dispatcher.inc.php +++ b/classes/core/Dispatcher.inc.php @@ -131,6 +131,12 @@ function dispatch($request) { AppLocale::initialize($request); PluginRegistry::loadCategory('generic', true); + // Reload the context after generic plugins have loaded so that changes to + // the context schema can take place + import('classes.core.ServicesContainer'); + $contextSchema = \ServicesContainer::instance()->get('schema')->get(SCHEMA_CONTEXT, true); + $request->getRouter()->getContext($request, 1, true); + $router->route($request); } diff --git a/classes/core/PKPApplication.inc.php b/classes/core/PKPApplication.inc.php index cf7dde84b83..d7d306657bf 100644 --- a/classes/core/PKPApplication.inc.php +++ b/classes/core/PKPApplication.inc.php @@ -61,6 +61,13 @@ define('WORKFLOW_TYPE_EDITORIAL', 'editorial'); define('WORKFLOW_TYPE_AUTHOR', 'author'); +// Constant used to distinguish whether metadata is enabled and whether it +// should be requested or required during submission +define('METADATA_DISABLE', 0); +define('METADATA_ENABLE', 'enable'); +define('METADATA_REQUEST', 'request'); +define('METADATA_REQUIRE', 'require'); + interface iPKPApplicationInfoProvider { /** * Get the top-level context DAO. @@ -396,7 +403,6 @@ function getDAOMap() { 'ScheduledTaskDAO' => 'lib.pkp.classes.scheduledTask.ScheduledTaskDAO', 'SessionDAO' => 'lib.pkp.classes.session.SessionDAO', 'SiteDAO' => 'lib.pkp.classes.site.SiteDAO', - 'SiteSettingsDAO' => 'lib.pkp.classes.site.SiteSettingsDAO', 'StageAssignmentDAO' => 'lib.pkp.classes.stageAssignment.StageAssignmentDAO', 'SubEditorsDAO' => 'lib.pkp.classes.context.SubEditorsDAO', 'SubmissionAgencyDAO' => 'lib.pkp.classes.submission.SubmissionAgencyDAO', @@ -520,7 +526,7 @@ function getDefaultMetricType() { $request = $this->getRequest(); $site = $request->getSite(); if (!is_a($site, 'Site')) return null; - $defaultMetricType = $site->getSetting('defaultMetricType'); + $defaultMetricType = $site->getData('defaultMetricType'); // Check whether the selected metric type is valid. $availableMetrics = $this->getMetricTypes(); @@ -678,7 +684,13 @@ function getCCLicenseBadge($ccLicenseURL) { 'http://creativecommons.org/licenses/by-nc-sa/4.0' => 'submission.license.cc.by-nc-sa4.footer', 'http://creativecommons.org/licenses/by-nd/4.0' => 'submission.license.cc.by-nd4.footer', 'http://creativecommons.org/licenses/by/4.0' => 'submission.license.cc.by4.footer', - 'http://creativecommons.org/licenses/by-sa/4.0' => 'submission.license.cc.by-sa4.footer' + 'http://creativecommons.org/licenses/by-sa/4.0' => 'submission.license.cc.by-sa4.footer', + 'http://creativecommons.org/licenses/by-nc-nd/3.0' => 'submission.license.cc.by-nc-nd3.footer', + 'http://creativecommons.org/licenses/by-nc/3.0' => 'submission.license.cc.by-nc3.footer', + 'http://creativecommons.org/licenses/by-nc-sa/3.0' => 'submission.license.cc.by-nc-sa3.footer', + 'http://creativecommons.org/licenses/by-nd/3.0' => 'submission.license.cc.by-nd3.footer', + 'http://creativecommons.org/licenses/by/3.0' => 'submission.license.cc.by3.footer', + 'http://creativecommons.org/licenses/by-sa/3.0' => 'submission.license.cc.by-sa3.footer' ); if (isset($licenseKeyMap[$ccLicenseURL])) { @@ -721,6 +733,52 @@ static function getWorkflowTypeRoles() { ); return $workflowTypeRoles; } + + /** + * Get a human-readable version of the max file upload size + * + * @return string + */ + static function getReadableMaxFileSize() { + return strtolower(UPLOAD_MAX_FILESIZE) . 'b'; + } + + /** + * Convert the max upload size to an integer in MBs + * + * @return int + */ + static function getIntMaxFileMBs() { + $num = substr(UPLOAD_MAX_FILESIZE, 0, (strlen(UPLOAD_MAX_FILESIZE) - 1)); + $scale = strtolower(substr(UPLOAD_MAX_FILESIZE, -1)); + switch ($scale) { + case 'g': + $num = $num / 1024; + case 'k': + $num = $num * 1024; + } + return floor($num); + } + + /** + * Get the supported metadata setting names for this application + * + * @return array + */ + static function getMetadataFields() { + return [ + 'coverage', + 'languages', + 'rights', + 'source', + 'subjects', + 'type', + 'disciplines', + 'keywords', + 'agencies', + 'citations', + ]; + } } /** @@ -748,5 +806,3 @@ function define_exposed($name, $value) { // To expose ORDER_CATEGORY_GRID_... constants via JS import('lib.pkp.classes.controllers.grid.feature.OrderCategoryGridItemsFeature'); - - diff --git a/classes/core/PKPRequest.inc.php b/classes/core/PKPRequest.inc.php index 37aad703c2a..8dbaac6e37b 100644 --- a/classes/core/PKPRequest.inc.php +++ b/classes/core/PKPRequest.inc.php @@ -858,5 +858,3 @@ function &_delegateToRouter($method) { return $returner; } } - - diff --git a/classes/core/PKPRouter.inc.php b/classes/core/PKPRouter.inc.php index f9443e38ebb..132bdd5503f 100644 --- a/classes/core/PKPRouter.inc.php +++ b/classes/core/PKPRouter.inc.php @@ -220,16 +220,17 @@ function getRequestedContextPath($request, $requestedContextLevel = 1) { * A Generic call to a context defining object (e.g. a Press, a Conference, or a SchedConf) * @param $request PKPRequest the request to be routed * @param $requestedContextLevel int (optional) the desired context level + * @param $forceReload bool (optional) Force context to be pulled from db * @return object */ - function &getContext($request, $requestedContextLevel = 1) { + function &getContext($request, $requestedContextLevel = 1, $forceReload = false) { // Handle context depth 0 if (!$this->_contextDepth) { $nullVar = null; return $nullVar; } - if (!isset($this->_contexts[$requestedContextLevel])) { + if ($forceReload || !isset($this->_contexts[$requestedContextLevel])) { // Retrieve the requested context path (this validates the context level and the path) $path = $this->getRequestedContextPath($request, $requestedContextLevel); @@ -335,6 +336,38 @@ function url($request, $newContext = null, $handler = null, $op = null, $path = assert(false); } + /** + * Build a URL to an endpoint in the API + * + * This method builds the correct URL depending on whether disable_path_info + * and restful_urls are enabled in the config file. + * + * @param Request $request + * @param string $contextPath + * @param string $apiVersion + * @param string $baseEndpoint Example: 'submissions' + * @param string $endpointParams Example: '1', '1/galleys' + * @return string + */ + public function getApiUrl($request, $contextPath, $apiVersion, $baseEndpoint = '', $endpointParams = '') { + + $fullBaseEndpoint = sprintf('/%s/api/%s/%s', $contextPath, $apiVersion, $baseEndpoint); + + $baseUrl = $request->getBaseUrl(); + if (!$request->isRestfulUrlsEnabled()) { + $baseUrl .= '/index.php'; + } + + if ($request->isPathInfoEnabled()) { + if ($endpointParams) { + return sprintf('%s%s/%s', $baseUrl, $fullBaseEndpoint, $endpointParams); + } + return sprintf('%s%s', $baseUrl, $fullBaseEndpoint); + } + + return sprintf('%s?journal=%s&endpoint=%s/%s', $baseUrl, $contextPath, $fullBaseEndpoint, $endpointParams); + } + /** * Handle an authorization failure. * @param $request Request @@ -626,5 +659,3 @@ function _contextNameToContextLevel($contextName) { return $this->_flippedContextList[$contextName] + 1; } } - - diff --git a/classes/core/PKPString.inc.php b/classes/core/PKPString.inc.php index e00220210e1..9646d909b82 100644 --- a/classes/core/PKPString.inc.php +++ b/classes/core/PKPString.inc.php @@ -39,15 +39,6 @@ '(?:\?([^#]*))?' . // Query String '(?:\#((?:%[0-9a-f]{2}|[-a-z0-9_.!~*\'();/?:@\&=+$,])*))?'); // Fragment -// RFC-2822 email addresses -define('PCRE_EMAIL_ADDRESS', - '[-a-z0-9!#\$%&\'\*\+\/=\?\^_\`\{\|\}~]' . '+' . // One or more atom characters. - '(\.' . '[-a-z0-9!#\$%&\'\*\+\/=\?\^_\`\{\|\}~]' . '+)*'. // Followed by zero or more dot separated sets of one or more atom characters. - '@'. // Followed by an "at" character. - '(' . '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)' . '{1,63}\.)+'. // Followed by one or max 63 domain characters (dot separated). - '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)' . '{2,63}' // Must be followed by one set consisting a period of two or max 63 domain characters. - ); - // Two different types of camel case: one for class names and one for method names define ('CAMEL_CASE_HEAD_UP', 0x01); define ('CAMEL_CASE_HEAD_DOWN', 0x02); @@ -498,7 +489,7 @@ static function generateUUID() { /** * Matches each symbol of PHP strftime format string - * to jQuery Datepicker widget date format. + * to jQuery Datepicker widget date format. * @param $phpFormat string * @return string */ diff --git a/classes/db/DAO.inc.php b/classes/db/DAO.inc.php index 4ca18e77076..b6a0f16f586 100644 --- a/classes/db/DAO.inc.php +++ b/classes/db/DAO.inc.php @@ -340,15 +340,19 @@ function dateFromDB($d) { function convertFromDB($value, $type) { switch ($type) { case 'bool': + case 'boolean': $value = (bool) $value; break; case 'int': + case 'integer': $value = (int) $value; break; case 'float': + case 'number': $value = (float) $value; break; case 'object': + case 'array': $value = unserialize($value); break; case 'date': @@ -400,17 +404,21 @@ function convertToDB($value, &$type) { switch ($type) { case 'object': + case 'array': $value = serialize($value); break; case 'bool': + case 'boolean': // Cast to boolean, ensuring that string // "false" evaluates to boolean false $value = ($value && $value !== 'false') ? 1 : 0; break; case 'int': + case 'integer': $value = (int) $value; break; case 'float': + case 'number': $value = (float) $value; break; case 'date': diff --git a/classes/db/SchemaDAO.inc.php b/classes/db/SchemaDAO.inc.php new file mode 100644 index 00000000000..109da08b922 --- /dev/null +++ b/classes/db/SchemaDAO.inc.php @@ -0,0 +1,250 @@ +get('schema'); + $schema = $schemaService->get($this->schemaName); + $sanitizedProps = $schemaService->sanitize($this->schemaName, $object->_data); + + $primaryDbProps = []; + foreach ($this->primaryTableColumns as $propName => $columnName) { + if (isset($sanitizedProps[$propName])) { + $primaryDbProps[$columnName] = $sanitizedProps[$propName]; + } + } + + if (empty($primaryDbProps)) { + fatalError('Tried to insert ' . get_class($object) . ' without any properties for the ' . $this->tableName . ' table.'); + } + + $columnsList = join(', ', array_keys($primaryDbProps)); + $bindList = join(', ', array_fill(0, count($primaryDbProps), '?')); + $this->update("INSERT INTO $this->tableName ($columnsList) VALUES ($bindList)", array_values($primaryDbProps)); + + $object->setId($this->getInsertId()); + + // Add additional properties to settings table if they exist + if (count($sanitizedProps) !== count($primaryDbProps)) { + $columns = array($this->primaryKeyColumn, 'locale', 'setting_name', 'setting_value'); + $columnsList = join(', ', $columns); + $bindList = join(', ', array_fill(0, count($columns), '?')); + foreach ($schema->properties as $propName => $propSchema) { + if (!isset($sanitizedProps[$propName]) || array_key_exists($propName, $this->primaryTableColumns)) { + continue; + } + if (!empty($propSchema->multilingual)) { + foreach ($sanitizedProps[$propName] as $localeKey => $localeValue) { + $this->update("INSERT INTO $this->settingsTableName ($columnsList) VALUES ($bindList)", array( + $object->getId(), + $localeKey, + $propName, + $this->convertToDB($localeValue, $schema->properties->{$propName}->type), + )); + } + } else { + $this->update("INSERT INTO $this->settingsTableName ($columnsList) VALUES ($bindList)", array( + $object->getId(), + '', + $propName, + $this->convertToDB($sanitizedProps[$propName], $schema->properties->{$propName}->type), + )); + } + } + } + + return $object->getId(); + } + + /** + * Update an object + * + * When updating an object, we remove table rows for any settings which are + * no longer present. + * + * Multilingual fields are an exception to this. When a locale key is missing + * from the object, it is not removed from the database. This is to ensure + * that data from a locale which is later disabled is not automatically + * removed from the database, and will appear if the locale is re-enabled. + * + * To delete a value for a locale key, a null value must be passed. + * + * @param $object DataObject The object to insert into the database + */ + public function updateObject($object) { + $schemaService = ServicesContainer::instance()->get('schema'); + $schema = $schemaService->get($this->schemaName); + $sanitizedProps = $schemaService->sanitize($this->schemaName, $object->_data); + + $primaryDbProps = []; + foreach ($this->primaryTableColumns as $propName => $columnName) { + if ($propName !== 'id' && isset($sanitizedProps[$propName])) { + $primaryDbProps[$columnName] = $this->convertToDB($sanitizedProps[$propName], $schema->properties->{$propName}->type); + } + } + + $set = join('=?,', array_keys($primaryDbProps)) . '=?'; + $this->update( + "UPDATE $this->tableName SET $set WHERE $this->primaryKeyColumn = ?", + array_merge(array_values($primaryDbProps), array($object->getId())) + ); + + $deleteSettings = []; + $keyColumns = [$this->primaryKeyColumn, 'locale', 'setting_name']; + foreach ($schema->properties as $propName => $propSchema) { + if (array_key_exists($propName, $this->primaryTableColumns)) { + continue; + } elseif (!isset($sanitizedProps[$propName])) { + $deleteSettings[] = $propName; + continue; + } + if (!empty($propSchema->multilingual)) { + foreach ($sanitizedProps[$propName] as $localeKey => $localeValue) { + // Delete rows with a null value + if (is_null($localeValue)) { + $this->update("DELETE FROM $this->settingsTableName WHERE setting_name = ? AND locale = ?",[ + $propName, + $localeKey, + ]); + } else { + $updateArray = [ + $this->primaryKeyColumn => $object->getId(), + 'locale' => $localeKey, + 'setting_name' => $propName, + 'setting_value' => $this->convertToDB($localeValue, $schema->properties->{$propName}->type), + ]; + $this->replace($this->settingsTableName, $updateArray, $keyColumns); + } + } + } else { + $updateArray = [ + $this->primaryKeyColumn => $object->getId(), + 'locale' => '', + 'setting_name' => $propName, + 'setting_value' => $this->convertToDB($sanitizedProps[$propName], $schema->properties->{$propName}->type), + ]; + $this->replace($this->settingsTableName, $updateArray, $keyColumns); + } + } + + if (count($deleteSettings)) { + $deleteSettingNames = join(',', array_map(function($settingName) { + return "'$settingName'"; + }, $deleteSettings)); + $this->update("DELETE FROM $this->settingsTableName WHERE setting_name in ($deleteSettingNames)"); + } + } + + /** + * Delete an object + * + * A wrapper function for SchemaDAO::deleteObjectById(). + * + * @param $object DataObject The object to insert into the database + */ + public function deleteObject($object) { + $this->deleteById($object->getId()); + } + + /** + * Delete an object by its ID + * + * @param $objectId int + */ + public function deleteById($objectId) { + $this->update( + "DELETE FROM $this->tableName WHERE $this->primaryKeyColumn = ?", + (int) $objectId + ); + $this->update( + "DELETE FROM $this->settingsTableName WHERE $this->primaryKeyColumn = ?", + (int) $objectId + ); + } + + /** + * Return a DataObject from a result row + * + * @param $primaryRow array The result row from the primary table lookup + * @return DataObject + */ + public function _fromRow($primaryRow) { + $schemaService = ServicesContainer::instance()->get('schema'); + $schema = $schemaService->get($this->schemaName); + + $object = $this->newDataObject(); + + foreach ($this->primaryTableColumns as $propName => $column) { + if (isset($primaryRow[$column])) { + $object->setData( + $propName, + $this->convertFromDb($primaryRow[$column], $schema->properties->{$propName}->type) + ); + } + } + + $result = $this->retrieve( + "SELECT * FROM $this->settingsTableName WHERE $this->primaryKeyColumn = ?", + array($primaryRow[$this->primaryKeyColumn]) + ); + + while (!$result->EOF) { + $settingRow = $result->getRowAssoc(false); + if (!empty($schema->properties->{$settingRow['setting_name']})) { + $object->setData( + $settingRow['setting_name'], + $this->convertFromDB( + $settingRow['setting_value'], + $schema->properties->{$settingRow['setting_name']}->type + ), + empty($settingRow['locale']) ? null : $settingRow['locale'] + ); + } + $result->MoveNext(); + } + + return $object; + } +} diff --git a/classes/db/SettingsDAO.inc.php b/classes/db/SettingsDAO.inc.php index 56d85dda4d2..318509d80e0 100644 --- a/classes/db/SettingsDAO.inc.php +++ b/classes/db/SettingsDAO.inc.php @@ -261,153 +261,6 @@ function deleteById($id) { ); } - /** - * Used internally by reloadLocalizedSettingDefaults to perform variable and translation replacements. - * @param $rawInput string contains text including variable and/or translate replacements. - * @param $paramArray array contains variables for replacement - * @param $locale string contains the name of the locale that should be used for the translation - * @return string - */ - function _performLocalizedReplacement($rawInput, $paramArray = array(), $locale = null) { - // this only translates from the following locale files - AppLocale::requireComponents(LOCALE_COMPONENT_APP_DEFAULT, LOCALE_COMPONENT_PKP_COMMON, $locale); - $value = preg_replace_callback('{{translate key="([^"]+)"}}', function($matches) use ($locale) { - return __($matches[1], array(), $locale); - }, $rawInput); - - foreach ($paramArray as $pKey => $pValue) { - $value = str_replace('{$' . $pKey . '}', $pValue, $value); - } - return $value; - } - - /** - * Used internally by reloadLocalizedSettingDefaults to recursively build nested arrays. - * Deals with translation and variable replacement calls. - * @param $node object XMLNode tag - * @param $paramArray array Parameters to be replaced in key/value contents - * @param $locale string contains the name of the locale that should be used for the translation - */ - function &_buildLocalizedObject (&$node, $paramArray = array(), $locale = null) { - $value = array(); - foreach ($node->getChildren() as $element) { - $key = $element->getAttribute('key'); - $childArray = $element->getChildByName('array'); - if (isset($childArray)) { - $content = $this->_buildLocalizedObject($childArray, $paramArray, $locale); - } else { - $content = $this->_performLocalizedReplacement($element->getValue(), $paramArray, $locale); - } - if (!empty($key)) { - $key = $this->_performLocalizedReplacement($key, $paramArray, $locale); - $value[$key] = $content; - } else $value[] = $content; - } - return $value; - } - - /** - * Reload a default setting from an XML file. - * @param $id int ID for settings to apply to - * @param $filename string Name of XML file to parse and install - * @param $settingName string Name of the setting that is to be reloaded - * @param $paramArray array Optional parameters for variable replacement in settings - */ - function reloadDefaultSetting($id, $filename, $settingName, $paramArray) { - $xmlParser = new XMLParser(); - $tree = $xmlParser->parse($filename); - - if (!$tree) { - $xmlParser->destroy(); - return false; - } - - foreach ($tree->getChildren() as $setting) { - $nameNode = $setting->getChildByName('name'); - $valueNode = $setting->getChildByName('value'); - - if (isset($nameNode) && isset($valueNode)) { - - if ($nameNode->getValue() == $settingName) { - $type = $setting->getAttribute('type'); - $isLocaleField = $setting->getAttribute('locale'); - $name = $nameNode->getValue(); - - if ($type == 'object') { - $arrayNode = $valueNode->getChildByName('array'); - $value = $this->_buildObject($arrayNode, $paramArray); - } else { - $value = $this->_performReplacement($valueNode->getValue(), $paramArray); - } - - $this->updateSetting( - $id, - $name, - $isLocaleField?array(AppLocale::getLocale() => $value):$value, - $type, - $isLocaleField - ); - - $xmlParser->destroy(); - return true; - } - } - } - - $xmlParser->destroy(); - - } - - /** - * Install locale field only settings from an XML file. - * @param $id int ID for settings to apply to - * @param $filename string Name of XML file to parse and install - * @param $paramArray array Optional parameters for variable replacement in settings - * @param $locale string locale id for which settings will be loaded - */ - function reloadLocalizedDefaultSettings($id, $filename, $paramArray, $locale) { - $xmlParser = new XMLParser(); - $tree = $xmlParser->parse($filename); - - if (!$tree) { - $xmlParser->destroy(); - return false; - } - - foreach ($tree->getChildren() as $setting) { - $nameNode = $setting->getChildByName('name'); - $valueNode = $setting->getChildByName('value'); - - if (isset($nameNode) && isset($valueNode)) { - $type = $setting->getAttribute('type'); - $isLocaleField = $setting->getAttribute('locale'); - $name = $nameNode->getValue(); - - //skip all settings that are not locale fields - if (!$isLocaleField) continue; - - if ($type == 'object') { - $arrayNode = $valueNode->getChildByName('array'); - $value = $this->_buildLocalizedObject($arrayNode, $paramArray, $locale); - } else { - $value = $this->_performLocalizedReplacement($valueNode->getValue(), $paramArray, $locale); - } - - // Replace translate calls with translated content - $this->updateSetting( - $id, - $name, - array($locale => $value), - $type, - true - ); - } - } - - $xmlParser->destroy(); - - } - /** * Get the settings cache for a given ID * @param $id diff --git a/classes/file/FileManager.inc.php b/classes/file/FileManager.inc.php index 5d50d4688bd..e73a8a3a805 100644 --- a/classes/file/FileManager.inc.php +++ b/classes/file/FileManager.inc.php @@ -411,6 +411,8 @@ function getDocumentExtension($type) { return '.pdf'; case 'application/word': return '.doc'; + case 'text/css': + return '.css'; case 'text/html': return '.html'; case 'application/epub+zip': diff --git a/classes/file/TemporaryFileManager.inc.php b/classes/file/TemporaryFileManager.inc.php index 2fdad54e82f..f2a9cf8830f 100644 --- a/classes/file/TemporaryFileManager.inc.php +++ b/classes/file/TemporaryFileManager.inc.php @@ -76,7 +76,7 @@ function downloadById($fileId, $userId, $inline = false) { * Upload the file and add it to the database. * @param $fileName string index into the $_FILES array * @param $userId int - * @return object The new TemporaryFile or false on failure + * @return object|boolean The new TemporaryFile or false on failure */ function handleUpload($fileName, $userId) { // Get the file extension, then rename the file. diff --git a/classes/form/Form.inc.php b/classes/form/Form.inc.php index f35d79215db..f92fdb7898c 100644 --- a/classes/form/Form.inc.php +++ b/classes/form/Form.inc.php @@ -31,17 +31,14 @@ import('lib.pkp.classes.form.validation.FormValidatorControlledVocab'); import('lib.pkp.classes.form.validation.FormValidatorCustom'); import('lib.pkp.classes.form.validation.FormValidatorReCaptcha'); -import('lib.pkp.classes.form.validation.FormValidatorDate'); import('lib.pkp.classes.form.validation.FormValidatorEmail'); import('lib.pkp.classes.form.validation.FormValidatorInSet'); import('lib.pkp.classes.form.validation.FormValidatorLength'); -import('lib.pkp.classes.form.validation.FormValidatorListbuilder'); import('lib.pkp.classes.form.validation.FormValidatorLocale'); import('lib.pkp.classes.form.validation.FormValidatorLocaleEmail'); import('lib.pkp.classes.form.validation.FormValidatorCSRF'); import('lib.pkp.classes.form.validation.FormValidatorPost'); import('lib.pkp.classes.form.validation.FormValidatorRegExp'); -import('lib.pkp.classes.form.validation.FormValidatorUri'); import('lib.pkp.classes.form.validation.FormValidatorUrl'); import('lib.pkp.classes.form.validation.FormValidatorLocaleUrl'); import('lib.pkp.classes.form.validation.FormValidatorISSN'); diff --git a/classes/form/FormBuilderVocabulary.inc.php b/classes/form/FormBuilderVocabulary.inc.php index 3b9eed848df..e432ce06c4c 100644 --- a/classes/form/FormBuilderVocabulary.inc.php +++ b/classes/form/FormBuilderVocabulary.inc.php @@ -292,9 +292,6 @@ function smartyFBVElement($params, $smarty, $content = null) { case 'textarea': $content = $this->_smartyFBVTextArea($params, $smarty); break; - case 'colour': - $content = $this->_smartyFBVColour($params, $smarty); - break; default: assert(false); } @@ -475,46 +472,6 @@ function _smartyFBVTextArea($params, $smarty) { return $smarty->fetch('form/textarea.tpl'); } - /** - * Form colour input. - * parameters: disabled (optional), name (optional - assigned value of 'id' by default) - * @param $params array - * @param $smarty object - */ - function _smartyFBVColour($params, $smarty) { - $params['name'] = isset($params['name']) ? $params['name'] : $params['id']; - $params['subLabelTranslate'] = isset($params['subLabelTranslate']) ? (boolean) $params['subLabelTranslate'] : true; - $params['uniqId'] = uniqid(); - $smarty->assign('FBV_isPassword', isset($params['password']) ? true : false); - - $colourParams = ''; - $smarty->clearAssign(array('FBV_disabled', 'FBV_readonly', 'FBV_multilingual', 'FBV_name', 'FBV_value', 'FBV_label_content', 'FBV_uniqId', 'FBV_default')); - foreach ($params as $key => $value) { - switch ($key) { - case 'label': $smarty->assign('FBV_label_content', $this->_smartyFBVSubLabel($params, $smarty)); break; - case 'type': break; - case 'size': break; - case 'inline': break; - case 'subLabelTranslate': break; - case 'disabled': - case 'readonly': - case 'name': - case 'id': - case 'value': - case 'uniqId': - case 'default': - $smarty->assign('FBV_' . $key, $value); break; - break; - case 'required': if ($value != 'true') $colourParams .= 'required="' + htmlspecialchars($value, ENT_QUOTES, LOCALE_ENCODING) +'"'; break; - default: $colourParams .= htmlspecialchars($key, ENT_QUOTES, LOCALE_ENCODING) . '="' . htmlspecialchars($value, ENT_QUOTES, LOCALE_ENCODING). '" '; - } - } - - $smarty->assign('FBV_textInputParams', $colourParams); - - return $smarty->fetch('form/colour.tpl'); - } - /** * Hidden input element. * parameters: value, id, name (optional - assigned value of 'id' by default), disabled (optional), multilingual (optional) diff --git a/classes/form/validation/FormValidatorDate.inc.php b/classes/form/validation/FormValidatorDate.inc.php deleted file mode 100644 index 508f93cfae4..00000000000 --- a/classes/form/validation/FormValidatorDate.inc.php +++ /dev/null @@ -1,68 +0,0 @@ -_scopeMin = $dateScopeMin; - $this->_scopeMax = $dateScopeMax; - parent::__construct($form, $field, $type, $message, $validator); - } - - // - // Implement abstract methods from Validator - // - /** - * @see Validator::isValid() - * @param $value mixed - * @return boolean - */ - function isValid() { - // check if generally formatted as a date and if required - if (!parent::isValid()) return false; - // if parent::isValid is true and $value is empty, this value is optional - $fieldValue = $this->getFieldValue(); - if (!$fieldValue) return true; - - $validator = parent::getValidator(); - return $validator->isValid($fieldValue, $this->_scopeMin, $this->_scopeMax); - } -} - - diff --git a/classes/form/validation/FormValidatorListbuilder.inc.php b/classes/form/validation/FormValidatorListbuilder.inc.php deleted file mode 100644 index 28e3226e6cb..00000000000 --- a/classes/form/validation/FormValidatorListbuilder.inc.php +++ /dev/null @@ -1,49 +0,0 @@ -getFieldValue()); - return (is_object($value) && isset($value->numberOfRows) && $value->numberOfRows > 0); - } -} - - diff --git a/classes/form/validation/FormValidatorUri.inc.php b/classes/form/validation/FormValidatorUri.inc.php deleted file mode 100644 index 7ee517d6663..00000000000 --- a/classes/form/validation/FormValidatorUri.inc.php +++ /dev/null @@ -1,35 +0,0 @@ -_app = new \Slim\App(array( // Load custom response handler 'response' => function($c) { @@ -50,6 +52,7 @@ public function __construct() { )); $this->_app->add(new ApiAuthorizationMiddleware($this)); $this->_app->add(new ApiTokenDecodingMiddleware($this)); + $this->_app->add(new ApiCsrfMiddleware($this)); // remove trailing slashes $this->_app->add(function ($request, $response, $next) { $uri = $request->getUri(); @@ -88,6 +91,11 @@ public function __construct() { } return $next($request, $response); }); + // Allow remote requests to the API + $this->_app->add(function ($request, $response, $next) { + $response = $response->withHeader('Access-Control-Allow-Origin', '*'); + return $next($request, $response); + }); $this->_request = Application::getRequest(); $this->setupEndpoints(); } @@ -230,6 +238,112 @@ public function getParameter($parameterName, $default = null) { return $default; } -} + /** + * Convert string values in boolean, integer and number parameters to their + * appropriate type when the string is in a recognizable format. + * + * Converted booleans: False: "0", "false". True: "true", "1" + * Converted integers: Anything that passes ctype_digit() + * Converted floats: Anything that passes is_numeric() + * + * Empty strings will be converted to null. + * + * @param $schema string One of the SCHEMA_... constants + * @param $params array Key/value parameters to be validated + * @return array Converted parameters + */ + public function convertStringsToSchema($schema, $params) { + $schemaService = ServicesContainer::instance()->get('schema'); + $schema = $schemaService->get($schema); + foreach ($params as $paramName => $paramValue) { + if (!property_exists($schema->properties, $paramName)) { + continue; + } + if (!empty($schema->properties->{$paramName}->multilingual)) { + foreach ($paramValue as $localeKey => $localeValue) { + $params[$paramName][$localeKey] = $this->_convertStringsToSchema( + $localeValue, + $schema->properties->{$paramName}->type, + $schema->properties->{$paramName} + ); + } + } else { + $params[$paramName] = $this->_convertStringsToSchema( + $paramValue, + $schema->properties->{$paramName}->type, + $schema->properties->{$paramName} + ); + } + } + + return $params; + } + + /** + * Helper function to convert a string to a specified type if it meets + * certain conditions. + * + * This function can be called recursively on nested objects and arrays. + * + * @see self::convertStringsToTypes + * @param $value + * @param $type One of boolean, integer or number + */ + private function _convertStringsToSchema($value, $type, $schema) { + // Convert all empty strings to null + if (is_string($value) && !strlen($value)) { + return null; + } + switch ($type) { + case 'boolean': + if (is_string($value)) { + if ($value === 'true' || $value === '1') { + return true; + } elseif ($value === 'false' || $value === '0') { + return false; + } + } + break; + case 'integer': + if (is_string($value) && ctype_digit($value)) { + return (int) $value; + } + break; + case 'number': + if (is_string($value) && is_numeric($value)) { + return floatval($value); + } + break; + case 'array': + if (is_array($value)) { + $newArray = []; + if (is_array($schema->items)) { + foreach ($schema->items as $i => $itemSchema) { + $newArray[$i] = $this->_convertStringsToSchema($value[$i], $itemSchema->type, $itemSchema); + } + } else { + foreach ($value as $i => $v) { + $newArray[$i] = $this->_convertStringsToSchema($v, $schema->items->type, $schema->items); + } + } + return $newArray; + } + break; + case 'object': + if (is_array($value)) { + $newObject = []; + foreach ($schema->properties as $propName => $propSchema) { + if (!isset($value[$propName])) { + continue; + } + $newObject[$propName] = $this->_convertStringsToSchema($value[$propName], $propSchema->type, $propSchema); + } + return $value; + } + break; + } + return $value; + } +} diff --git a/classes/handler/PKPHandler.inc.php b/classes/handler/PKPHandler.inc.php index 8f5314cab6d..af2830a2899 100644 --- a/classes/handler/PKPHandler.inc.php +++ b/classes/handler/PKPHandler.inc.php @@ -408,7 +408,7 @@ static function getRangeInfo($request, $rangeName, $contextData = null) { } } - if ($context) $count = $context->getSetting('itemsPerPage'); + if ($context) $count = $context->getData('itemsPerPage'); if (!isset($count)) $count = Config::getVar('interface', 'items_per_page'); import('lib.pkp.classes.db.DBResultRange'); diff --git a/classes/i18n/PKPLocale.inc.php b/classes/i18n/PKPLocale.inc.php index 342b210c696..2d482e5aa9b 100644 --- a/classes/i18n/PKPLocale.inc.php +++ b/classes/i18n/PKPLocale.inc.php @@ -765,5 +765,3 @@ static function getTimeZone() { function __($key, $params = array(), $locale = null) { return AppLocale::translate($key, $params, $locale); } - - diff --git a/classes/install/PKPInstall.inc.php b/classes/install/PKPInstall.inc.php index 11cabc3096b..c7dd27dff5a 100644 --- a/classes/install/PKPInstall.inc.php +++ b/classes/install/PKPInstall.inc.php @@ -26,6 +26,7 @@ import('lib.pkp.classes.install.Installer'); +import('classes.core.ServicesContainer'); class PKPInstall extends Installer { @@ -299,10 +300,10 @@ function createData() { } // Install default site settings - $siteSettingsDao = DAORegistry::getDAO('SiteSettingsDAO'); - $siteSettingsDao->installSettings('registry/siteSettings.xml', array( - 'contactEmail' => $this->getParam('adminEmail') - )); + $schemaService = ServicesContainer::instance()->get('schema'); + $site = $schemaService->setDefaults(SCHEMA_SITE, $site, $site->getSupportedLocales(), $site->getPrimaryLocale()); + $site->setData('contactEmail', $this->getParam('adminEmail')); + $siteDao->updateobject($site); return true; } diff --git a/classes/linkAction/request/AjaxModal.inc.php b/classes/linkAction/request/AjaxModal.inc.php index 4510777def1..6022467c767 100644 --- a/classes/linkAction/request/AjaxModal.inc.php +++ b/classes/linkAction/request/AjaxModal.inc.php @@ -25,9 +25,14 @@ class AjaxModal extends Modal { * @param $title string (optional) The localized modal title. * @param $titleIcon string (optional) The icon to be used in the modal title bar. * @param $canClose boolean (optional) Whether the modal will have a close button. + * @param $closeOnFormSuccessId string (optional) Close the modal when the + * form with this id fires a formSuccess event. + * @param $closeCleanVueInstances array (optional) When the modal is closed + * destroy the registered vue instances with these ids */ - function __construct($url, $title = null, $titleIcon = null, $canClose = true) { - parent::__construct($title, $titleIcon, $canClose); + function __construct($url, $title = null, $titleIcon = null, $canClose = true, + $closeOnFormSuccessId = null, $closeCleanVueInstances = []) { + parent::__construct($title, $titleIcon, $canClose, $closeOnFormSuccessId, $closeCleanVueInstances); $this->_url = $url; } @@ -52,10 +57,12 @@ function getUrl() { * @see LinkActionRequest::getLocalizedOptions() */ function getLocalizedOptions() { - return array_merge(parent::getLocalizedOptions(), array( + return array_merge( + parent::getLocalizedOptions(), + array( 'modalHandler' => '$.pkp.controllers.modal.AjaxModalHandler', - 'url' => $this->getUrl())); + 'url' => $this->getUrl(), + ) + ); } } - - diff --git a/classes/linkAction/request/ConfirmationModal.inc.php b/classes/linkAction/request/ConfirmationModal.inc.php index cb8bf4c4fc7..d5dd842e052 100644 --- a/classes/linkAction/request/ConfirmationModal.inc.php +++ b/classes/linkAction/request/ConfirmationModal.inc.php @@ -51,10 +51,10 @@ class ConfirmationModal extends Modal { * for confirmation modals. Useful for modals that display * large blocks of text. */ - function __construct($dialogText, $title = null, $titleIcon = 'modal_confirm', $okButton = null, $cancelButton = null, $canClose = true, $width = MODAL_WIDTH_AUTO) { + function __construct($dialogText, $title = null, $titleIcon = 'modal_confirm', $okButton = null, $cancelButton = null, $canClose = true) { $title = (is_null($title) ? __('common.confirm') : $title); - parent::__construct($title, $titleIcon, $canClose, $width); + parent::__construct($title, $titleIcon, $canClose); $this->_okButton = (is_null($okButton) ? __('common.ok') : $okButton); $this->_cancelButton = (is_null($cancelButton) ? __('common.cancel') : $cancelButton); diff --git a/classes/linkAction/request/Modal.inc.php b/classes/linkAction/request/Modal.inc.php index ddb0416fce6..33bafe3b67f 100644 --- a/classes/linkAction/request/Modal.inc.php +++ b/classes/linkAction/request/Modal.inc.php @@ -28,8 +28,11 @@ class Modal extends LinkActionRequest { /** @var boolean Whether the modal has a close icon in the title bar. */ var $_canClose; - /** @var string The width of the modal */ - var $_width; + /** @var string The id of a form which should close the modal when completed */ + var $_closeOnFormSuccessId; + + /** @var array The id of any Vue instances that must be destroyed when modal closed */ + var $_closeCleanVueInstances; /** * Constructor @@ -39,13 +42,19 @@ class Modal extends LinkActionRequest { * @param $width int (optional) Override the default width of 'auto' * for confirmation modals. Useful for modals that display * large blocks of text. + * @param $closeOnFormSuccessId string (optional) Close the modal when the + * form with this id fires a formSuccess event. + * @param $closeCleanVueInstances array (optional) When the modal is closed + * destroy the registered vue instances with these ids */ - function __construct($title = null, $titleIcon = null, $canClose = true, $width = MODAL_WIDTH_DEFAULT) { + function __construct($title = null, $titleIcon = null, $canClose = true, + $closeOnFormSuccessId = null, $closeCleanVueInstances = []) { parent::__construct(); $this->_title = $title; $this->_titleIcon = $titleIcon; $this->_canClose = $canClose; - $this->_width = $width; + $this->_closeOnFormSuccessId = $closeOnFormSuccessId; + $this->_closeCleanVueInstances = $closeCleanVueInstances; // @todo this should be customizable via an option $this->_closeButtonText = __('common.closePanel'); } @@ -78,13 +87,6 @@ function getCanClose() { return $this->_canClose; } - /** - * Get the width of the modal. - */ - function getWidth() { - return $this->_width; - } - /** * Get the text to be displayed on the close button for screen readers */ @@ -111,10 +113,9 @@ function getLocalizedOptions() { 'title' => $this->getTitle(), 'titleIcon' => $this->getTitleIcon(), 'canClose' => ($this->getCanClose() ? '1' : '0'), - 'width' => $this->getWidth(), + 'closeOnFormSuccessId' => $this->_closeOnFormSuccessId, + 'closeCleanVueInstances' => $this->_closeCleanVueInstances, 'closeButtonText' => $this->getCloseButtonText(), ); } } - - diff --git a/classes/mail/MailTemplate.inc.php b/classes/mail/MailTemplate.inc.php index e4e4f69d5cf..09c2efe492c 100644 --- a/classes/mail/MailTemplate.inc.php +++ b/classes/mail/MailTemplate.inc.php @@ -93,11 +93,11 @@ function __construct($emailKey = null, $locale = null, $context = null, $include // Default "From" to user if available, otherwise site/context principal contact if ($user) { $this->setFrom($user->getEmail(), $user->getFullName()); - } elseif (is_null($context) || is_null($context->getSetting('contactEmail'))) { + } elseif (is_null($context) || is_null($context->getData('contactEmail'))) { $site = $request->getSite(); $this->setFrom($site->getLocalizedContactEmail(), $site->getLocalizedContactName()); } else { - $this->setFrom($context->getSetting('contactEmail'), $context->getSetting('contactName')); + $this->setFrom($context->getData('contactEmail'), $context->getData('contactName')); } if ($context) { @@ -148,7 +148,7 @@ function assignParams($params = array()) { // Add context-specific variables $dispatcher = $application->getDispatcher(); $params = array_merge(array( - 'principalContactSignature' => $this->context->getSetting('contactName'), + 'principalContactSignature' => $this->context->getData('contactName'), 'contextName' => $this->context->getLocalizedName(), 'contextUrl' => $dispatcher->url($request, ROUTE_PAGE, $this->context->getPath()), ), $params); @@ -183,43 +183,20 @@ function isEnabled() { return $this->enabled; } - /** - * Processes form-submitted addresses for inclusion in - * the recipient list - * @param $currentList array Current recipient/cc/bcc list - * @param $newAddresses array "Raw" form parameter for additional addresses - */ - function &processAddresses($currentList, &$newAddresses) { - foreach ($newAddresses as $newAddress) { - $regs = array(); - // Match the form "My Name " - if (PKPString::regexp_match_get('/^([^<>' . "\n" . ']*[^<> ' . "\n" . '])[ ]*<(?P' . PCRE_EMAIL_ADDRESS . ')>$/i', $newAddress, $regs)) { - $currentList[] = array('name' => $regs[1], 'email' => $regs['email']); - - } elseif (PKPString::regexp_match_get('/^' . PCRE_EMAIL_ADDRESS . ')>?$/i', $newAddress, $regs)) { - $currentList[] = array('name' => '', 'email' => $regs['email']); - - } elseif ($newAddress != '') { - $this->errorMessages[] = array('type' => MAIL_ERROR_INVALID_EMAIL, 'address' => $newAddress); - } - } - return $currentList; - } - /** * Send the email. * @return boolean false if there was a problem sending the email */ function send() { if (isset($this->context)) { - $signature = $this->context->getSetting('emailSignature'); + $signature = $this->context->getData('emailSignature'); if (strstr($this->getBody(), '{$templateSignature}') === false) { $this->setBody($this->getBody() . "
" . $signature); } else { $this->setBody(str_replace('{$templateSignature}', $signature, $this->getBody())); } - $envelopeSender = $this->context->getSetting('envelopeSender'); + $envelopeSender = $this->context->getData('envelopeSender'); if (!empty($envelopeSender) && Config::getVar('email', 'allow_envelope_sender')) $this->setEnvelopeSender($envelopeSender); } diff --git a/classes/metadata/DateStringNormalizerFilter.inc.php b/classes/metadata/DateStringNormalizerFilter.inc.php index 343feed1670..eb6ac48088f 100644 --- a/classes/metadata/DateStringNormalizerFilter.inc.php +++ b/classes/metadata/DateStringNormalizerFilter.inc.php @@ -15,7 +15,6 @@ */ import('lib.pkp.classes.filter.Filter'); -import('lib.pkp.classes.validation.ValidatorDate'); class DateStringNormalizerFilter extends Filter { /** diff --git a/classes/metadata/MetadataProperty.inc.php b/classes/metadata/MetadataProperty.inc.php index e3f0efd6ba9..64ca1f3cf65 100644 --- a/classes/metadata/MetadataProperty.inc.php +++ b/classes/metadata/MetadataProperty.inc.php @@ -368,10 +368,14 @@ function isValid($value, $locale = null) { break; case METADATA_PROPERTY_TYPE_URI: - // Validate with the URI validator - import('lib.pkp.classes.validation.ValidatorUri'); - $validator = new ValidatorUri(); - if ($validator->isValid($value)) return array(METADATA_PROPERTY_TYPE_URI => null); + import('lib.pkp.classes.validation.ValidatorFactory'); + $validator = ValidatorFactory::make( + array('uri' => $value), + array('uri' => 'url') + ); + if (!$validator->fails()) { + return array(METADATA_PROPERTY_TYPE_URI => null); + } break; case METADATA_PROPERTY_TYPE_DATE: diff --git a/classes/plugins/BlockPlugin.inc.php b/classes/plugins/BlockPlugin.inc.php index 9234340354f..246f6001917 100644 --- a/classes/plugins/BlockPlugin.inc.php +++ b/classes/plugins/BlockPlugin.inc.php @@ -23,74 +23,6 @@ abstract class BlockPlugin extends LazyLoadPlugin { // // Override public methods from Plugin // - - /** - * @copydoc Plugin::register() - */ - function register($category, $path, $mainContextId = null) { - $success = parent::register($category, $path, $mainContextId); - if ($success && $this->getEnabled($mainContextId)) { - $contextMap = $this->getContextMap(); - $blockContext = $this->getBlockContext(); - if (isset($contextMap[$blockContext])) { - $hookName = $contextMap[$blockContext]; - HookRegistry::register($hookName, array($this, 'callback'), HOOK_SEQUENCE_NORMAL + $this->getSeq()); - } - } - return $success; - } - - /** - * Override protected methods from Plugin - */ - /** - * @see Plugin::getSeq() - * - * NB: In the case of block plugins, higher numbers move - * plugins down the page compared to other blocks. - * - * @param $contextId int Context ID (journal/press) - */ - function getSeq($contextId = null) { - return $this->getSetting(is_null($contextId) ? $this->getCurrentContextId() : $contextId, 'seq'); - } - - /* - * Block Plugin specific methods - */ - /** - * Set the sequence information for this plugin. - * - * NB: In the case of block plugins, higher numbers move - * plugins down the page compared to other blocks. - * - * @param $seq int - * @param $contextId int Context ID (journal/press) - */ - function setSeq($seq, $contextId = null) { - return $this->updateSetting(is_null($contextId) ? $this->getCurrentContextId() : $contextId, 'seq', $seq, 'int'); - } - - /** - * Get the block context (e.g. BLOCK_CONTEXT_...) for this block. - * - * @param $contextId int Context ID (journal/press) - * @return int - */ - function getBlockContext($contextId = null) { - return $this->getSetting(is_null($contextId) ? $this->getCurrentContextId() : $contextId, 'context'); - } - - /** - * Set the block context (e.g. BLOCK_CONTEXT_...) for this block. - * - * @param $context int Sidebar context - * @param $contextId int Context ID (journal/press) - */ - function setBlockContext($context, $contextId = null) { - return $this->updateSetting(is_null($contextId) ? $this->getCurrentContextId() : $contextId, 'context', $context, 'int'); - } - /** * Determine whether or not this plugin is currently enabled. * @@ -121,23 +53,6 @@ function getSupportedContexts() { return array(BLOCK_CONTEXT_SIDEBAR); } - /** - * Get an associative array linking block context to hook name. - * - * @return array - */ - function &getContextMap() { - static $contextMap = array( - BLOCK_CONTEXT_SIDEBAR => 'Templates::Common::Sidebar', - ); - - $homepageHook = $this->_getContextSpecificHomepageHook(); - if ($homepageHook) $contextMap[BLOCK_CONTEXT_HOMEPAGE] = $homepageHook; - - HookRegistry::call('BlockPlugin::getContextMap', array($this, &$contextMap)); - return $contextMap; - } - /** * Get the filename of the template block. (Default behavior may * be overridden through some combination of this function and the @@ -162,38 +77,6 @@ function getContents($templateMgr, $request = null) { if ($blockTemplateFilename === null) return ''; return $templateMgr->fetch($this->getTemplateResource($blockTemplateFilename)); } - - /** - * Callback that renders the block. - * - * @param $hookName string - * @param $args array - * @return string - */ - function callback($hookName, $args) { - $params =& $args[0]; - $smarty =& $args[1]; - $output =& $args[2]; - $output .= $this->getContents($smarty, Application::getRequest()); - return false; - } - - /* - * Private helper methods - */ - /** - * The application specific context home page hook name. - * - * @return string - */ - function _getContextSpecificHomepageHook() { - $application = Application::getApplication(); - - if ($application->getContextDepth() == 0) return null; - - $contextList = $application->getContextList(); - return 'Templates::Index::'.array_shift($contextList); - } } diff --git a/classes/plugins/PaymethodPlugin.inc.php b/classes/plugins/PaymethodPlugin.inc.php index c54e3dc99e1..77f1bd261cd 100644 --- a/classes/plugins/PaymethodPlugin.inc.php +++ b/classes/plugins/PaymethodPlugin.inc.php @@ -16,13 +16,6 @@ import('lib.pkp.classes.plugins.LazyLoadPlugin'); abstract class PaymethodPlugin extends LazyLoadPlugin { - /** - * Get the settings form for this plugin. - * @param $context Context - * @return Form - */ - abstract function getSettingsForm($context); - /** * Get the payment form for this plugin. * @param $context Context @@ -39,6 +32,18 @@ abstract function getPaymentForm($context, $queuedPayment); function isConfigured($context) { return true; } + + /** + * Save settings for this payment method + * + * @param $params array Params that have already been + * @param $slimRequest Request Slim request object + * @param $request Request + * @return array List of errors + */ + public function saveSettings($params, $slimRequest, $request) { + assert(false); // implement in child classes + } } diff --git a/classes/plugins/Plugin.inc.php b/classes/plugins/Plugin.inc.php index 03fd92a13a0..0f15941fbf7 100644 --- a/classes/plugins/Plugin.inc.php +++ b/classes/plugins/Plugin.inc.php @@ -110,7 +110,7 @@ function register($category, $path, $mainContextId = null) { HookRegistry::register ('Installer::postInstall', array($this, 'installData')); } if ($this->getContextSpecificPluginSettingsFile()) { - HookRegistry::register ($this->_getContextSpecificInstallationHook(), array($this, 'installContextSpecificSettings')); + HookRegistry::register ('Context::add', array($this, 'installContextSpecificSettings')); } HookRegistry::register ('Installer::postInstall', array($this, 'installFilters')); @@ -313,6 +313,14 @@ function getPluginPath() { return $this->pluginPath; } + /** + * Get the directory name of the plugin + * @return String directory name + */ + function getDirName() { + return basename($this->pluginPath); + } + /** * Return the Resource Name for templates in this plugin, or if specified, the full resource locator * for a specific template. @@ -564,29 +572,28 @@ function installContextSpecificSettings($hookName, $args) { // install context specific settings. $application = Application::getApplication(); $contextDepth = $application->getContextDepth(); - if ($contextDepth > 0) { - $context =& $args[1]; - - // Make sure that this is really a new context - $isNewContext = isset($args[3]) ? $args[3] : true; - if (!$isNewContext) return false; - - // Install context specific settings - $pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO'); - switch ($contextDepth) { - case 1: - $pluginSettingsDao->installSettings($context->getId(), $this->getName(), $this->getContextSpecificPluginSettingsFile()); - break; - - case 2: - $pluginSettingsDao->installSettings($context->getId(), 0, $this->getName(), $this->getContextSpecificPluginSettingsFile()); - break; - - default: - // No application can have a context depth > 2 - assert(false); - } + if ($contextDepth < 1) { + return false; + } + + $context = $args[0]; + + // Install context specific settings + $pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO'); + switch ($contextDepth) { + case 1: + $pluginSettingsDao->installSettings($context->getId(), $this->getName(), $this->getContextSpecificPluginSettingsFile()); + break; + + case 2: + $pluginSettingsDao->installSettings($context->getId(), 0, $this->getName(), $this->getContextSpecificPluginSettingsFile()); + break; + + default: + // No application can have a context depth > 2 + assert(false); } + return false; } @@ -768,20 +775,6 @@ function &getRequest() { /* * Private helper methods */ - /** - * The application specific context installation hook. - * - * @return string - */ - function _getContextSpecificInstallationHook() { - $application = Application::getApplication(); - - if ($application->getContextDepth() == 0) return null; - - $contextList = $application->getContextList(); - return ucfirst(array_shift($contextList)).'SiteSettingsForm::execute'; - } - /** * Get a list of link actions for plugin management. * @param request PKPRequest diff --git a/classes/plugins/ThemePlugin.inc.php b/classes/plugins/ThemePlugin.inc.php index 0c3ef601bbc..e05649b8fa9 100644 --- a/classes/plugins/ThemePlugin.inc.php +++ b/classes/plugins/ThemePlugin.inc.php @@ -62,7 +62,7 @@ abstract class ThemePlugin extends LazyLoadPlugin { * A null value indicates that no lookup has occured. If no options are set, * the lookup will assign an empty array. * - * @var $optionValues null|array; + * @var $_optionValues null|array; */ private $_optionValues = null; @@ -86,13 +86,6 @@ function register($category, $path, $mainContextId = null) { // Allow themes to override plugin template files HookRegistry::register('TemplateResource::getFilename', array($this, '_overridePluginTemplates')); - // Save any theme options displayed on the appearance and site settings - // forms - HookRegistry::register('appearanceform::execute', array($this, 'saveOptionsForm')); - HookRegistry::register('appearanceform::readuservars', array($this, 'readOptionsFormUserVars')); - HookRegistry::register('sitesetupform::execute', array($this, 'saveOptionsForm')); - HookRegistry::register('sitesetupform::readuservars', array($this, 'readOptionsFormUserVars')); - return true; } @@ -148,10 +141,10 @@ public function isActive() { $request = Application::getRequest(); $context = $request->getContext(); if (is_a($context, 'Context')) { - $activeTheme = $context->getSetting('themePluginPath'); + $activeTheme = $context->getData('themePluginPath'); } else { $site = $request->getSite(); - $activeTheme = $site->getSetting('themePluginPath'); + $activeTheme = $site->getData('themePluginPath'); } return $activeTheme == basename($this->getPluginPath()); @@ -372,8 +365,7 @@ public function &getScript($name) { * colour and typography selectors. * * @param $name string Unique name for this setting - * @param $type string A pre-registered type of setting. Supported values: - * text|colour|radio. Default: `text` + * @param $type string One of the Field* class names * @param $args array Optional parameters defining this setting. Some setting * types may accept or require additional arguments. * `label` string Locale key for a label for this field. @@ -386,18 +378,57 @@ public function addOption($name, $type, $args = array()) { return; } - $this->options[$name] = array_merge( - array('type' => $type), - $args - ); + // Convert theme option types from before v3.2 + if (in_array($type, ['text', 'colour', 'radio'])) { + if (isset($args['label'])) { + $args['label'] = __($args['label']); + } + if (isset($args['description'])) { + $args['description'] = __($args['description']); + } + switch ($type) { + case 'text': + $type = 'FieldText'; + break; + case 'colour': + $type = 'FieldColor'; + break; + case 'radio': + $type = 'FieldOptions'; + $args['type'] = 'radio'; + if (!empty($args['options'])) { + $options = []; + foreach ($args['options'] as $optionValue => $optionLabel) { + $options[] = ['value' => $optionValue, 'label' => __($optionLabel)]; + } + $args['options'] = $options; + } + break; + } + } + + // Import the field classes + import('lib.pkp.components.forms.FormComponent'); + + if (!class_exists($type)) { + fatalError(sprintf( + 'The %s class was not found for the theme option, %s, defined by %s or one of its parent themes.', + $type, + $name, + $this->getDisplayName() + )); + } + + $this->options[$name] = new $type($name, $args); } /** * Get the value of an option or default if the option is not set * - * @param $name The name of the option value to retrieve + * @param $name string The name of the option value to retrieve * @return mixed The value of the option. Will return a default if set in - * the option config. False if no option exists + * the option config. False if no option exists. Null if no value or default + * exists. */ public function getOption($name) { @@ -408,10 +439,9 @@ public function getOption($name) { // Retrieve option values if they haven't been loaded yet if (is_null($this->_optionValues)) { - $pluginSettingsDAO = DAORegistry::getDAO('PluginSettingsDAO'); $context = Application::getRequest()->getContext(); - $contextId = $context ? $context->getId() : 0; - $this->_optionValues = $pluginSettingsDAO->getPluginSettings($contextId, $this->getName()); + $contextId = $context ? $context->getId() : CONTEXT_ID_NONE; + $this->_optionValues = $this->getOptionValues($contextId); } if (isset($this->_optionValues[$name])) { @@ -419,8 +449,12 @@ public function getOption($name) { } // Return a default if no value is set - $option = $this->getOptionConfig($name); - return $option && isset($option['default']) ? $option['default'] : null; + if (isset($this->options[$name])) { + $option = $this->options[$name]; + } elseif ($this->parent) { + $option = $this->parent->getOption($name); + } + return isset($option->default) ? $option->default : null; } /** @@ -465,18 +499,20 @@ public function getOptionsConfig() { /** * Modify option configuration settings * + * @deprecated Unnecessary since 3.2 because options are stored as objects, + * so changes can be made directly (via reference) and args don't need to be + * manually merged * @param $name The name of the option config to retrieve * @param $args The new configuration settings for this option * @return bool Whether the option was found and the config was updated. */ public function modifyOptionsConfig($name, $args = array()) { - - if (isset($this->options[$name])) { - $this->options[$name] = $args; - return true; + $option = $this->getOption($name); + foreach ($args as $key => $value) { + if (property_exists($option, $key)) { + $option->{$key} = $value; + } } - - return $this->parent ? $this->parent->modifyOptionsConfig($name, $args) : false; } /** @@ -501,27 +537,53 @@ public function removeOption($name) { * This retrieves a single array containing option values for this theme * and any parent themes. * + * @param $contextId int * @return array */ - public function getOptionValues() { + public function getOptionValues($contextId) { $pluginSettingsDAO = DAORegistry::getDAO('PluginSettingsDAO'); - $context = Application::getRequest()->getContext(); - $contextId = empty($context) ? 0 : $context->getId(); + $return = []; $values = $pluginSettingsDAO->getPluginSettings($contextId, $this->getName()); - $values = array_intersect_key($values, $this->options); + foreach ($this->options as $optionName => $optionConfig) { + $return[$optionName] = isset($values[$optionName]) ? $values[$optionName] : null; + } if (!$this->parent) { - return $values; + return $return; } return array_merge( - $this->parent->getOptionValues(), - $values + $this->parent->getOptionValues($contextId), + $return ); } + /** + * Overwrite this function to perform any validation on options before they + * are saved + * + * If this is a child theme, you must call $this->parent->validateOptions() to + * perform any validation defined on the parent theme. + * + * @param $options array Key/value list of options to validate + * @param $themePluginPath string The theme these options are for + * @param $contextId int The context these theme options are for, or + * CONTEXT_ID_NONE for the site-wide settings. + * @param $request Request + * @return array List of errors with option name as the key and the value as + * an array of error messages. Example: + * [ + * 'color' => [ + * 'This color is too dark for this area and some people will not be able to read it.', + * ] + * ] + */ + public function validateOptions($options, $themePluginPath, $contextId, $request) { + return []; + } + /** * Sanitize and save a theme option * @@ -538,87 +600,22 @@ public function saveOption($name, $value, $contextId = null) { return $this->parent ? $this->parent->saveOption($name, $value, $contextId) : false; } - $type = ''; - switch ($option['type']) { - case 'text' : - case 'select' : - case 'colour' : - $type = 'text'; - break; - } - if (is_null($contextId)) { $context = Application::getRequest()->getContext(); $contextId = $context->getId(); } - $this->updateSetting($contextId, $name, $value, $type); + $pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO'); - // Clear the template cache so that new settings can take effect - $templateMgr = TemplateManager::getManager(Application::getRequest()); - $templateMgr->clearTemplateCache(); - $templateMgr->clearCssCache(); - } - - /** - * Save options in any form - * - * This helper function allows you to save theme options attached to any - * form by hooking into the form's execute function. - * - * @see Form::execute() - * @param $hookName string - * @param $args array Arguments passed via the hook - * `form` Form The form object from which option values can be retrieved. - * `request` Request - */ - public function saveOptionsForm($hookName, $args) { - - $form = $args[0]; - - $options = $this->getOptionsConfig(); - - // Ensure theme options from the site-wide settings form are applied - // to the site-wide context - if ($hookName == 'sitesetupform::execute') { - $contextId = 0; - } - - foreach ($options as $optionName => $optionArgs) { - $value = $form->getData(THEME_OPTION_PREFIX . $optionName); - if ($value === null) { - continue; - } - if (isset($contextId)) { - $this->saveOption($optionName, $value, $contextId); - } else { - $this->saveOption($optionName, $value); - } + // Remove setting row for empty string values (but not all falsey values) + if ($value === '') { + $pluginSettingsDao->deleteSetting($contextId, $this->getName(), $name); + } else { + $type = $pluginSettingsDao->getType($value); + $value = $pluginSettingsDao->convertToDb($value, $type); + $this->updateSetting($contextId, $name, $value, $type); } - } - /** - * Retrieve user-entered values for options from any form - * - * This helper function allows you to hook into any form to add theme option - * values to the form's user input data. - * - * @see Form::readUserVar() - * @param $hookName string - * @param $args array Arguments passed via the hook - * `form` Form The form object from which option values can be retrieved. - * `vars` Array Key/value store of the user vars read by the form - */ - public function readOptionsFormUserVars($hookName, $args) { - - $form = $args[0]; - - $options = $this->getOptionsConfig(); - - foreach ($options as $optionName => $optionArgs) { - $fullOptionName = THEME_OPTION_PREFIX . $optionName; - $form->setData($fullOptionName, Application::getRequest()->getUserVar($fullOptionName)); - } } /** @@ -809,11 +806,11 @@ public function _getBaseDir($path = '') { * * @since 0.1 */ - function isColourDark( $colour, $limit = 130 ) { - $colour = str_replace( '#', '', $colour ); - $r = hexdec( substr( $colour, 0, 2 ) ); - $g = hexdec( substr( $colour, 2, 2 ) ); - $b = hexdec( substr( $colour, 4, 2 ) ); + public function isColourDark($color, $limit = 130) { + $color = str_replace('#', '', $color); + $r = hexdec(substr($color, 0, 2)); + $g = hexdec(substr($color, 2, 2)); + $b = hexdec(substr($color, 4, 2)); $contrast = sqrt( $r * $r * .241 + $g * $g * .691 + @@ -822,5 +819,3 @@ function isColourDark( $colour, $limit = 130 ) { return $contrast < $limit; } } - - diff --git a/classes/security/UserGroupDAO.inc.php b/classes/security/UserGroupDAO.inc.php index 8f5cc19ca49..52a2cb2aa00 100644 --- a/classes/security/UserGroupDAO.inc.php +++ b/classes/security/UserGroupDAO.inc.php @@ -725,7 +725,6 @@ function installSettings($contextId, $filename) { $abbrevKey = $setting->getAttribute('abbrev'); $permitSelfRegistration = $setting->getAttribute('permitSelfRegistration'); $defaultStages = explode(',', $setting->getAttribute('stages')); - $userGroup = $this->newDataObject(); // create a role associated with this user group $userGroup = $this->newDataObject(); diff --git a/classes/security/authorization/RestrictedSiteAccessPolicy.inc.php b/classes/security/authorization/RestrictedSiteAccessPolicy.inc.php index 8a01a031160..3a7964f9bae 100644 --- a/classes/security/authorization/RestrictedSiteAccessPolicy.inc.php +++ b/classes/security/authorization/RestrictedSiteAccessPolicy.inc.php @@ -41,7 +41,7 @@ function __construct($request) { */ function applies() { $context = $this->_router->getContext($this->_request); - return ( $context && $context->getSetting('restrictSiteAccess')); + return ( $context && $context->getData('restrictSiteAccess')); } /** diff --git a/classes/security/authorization/internal/ApiCsrfMiddleware.inc.php b/classes/security/authorization/internal/ApiCsrfMiddleware.inc.php new file mode 100644 index 00000000000..0ff467188d2 --- /dev/null +++ b/classes/security/authorization/internal/ApiCsrfMiddleware.inc.php @@ -0,0 +1,78 @@ +_handler = $handler; + } + + /** + * Middleware invokable function + * + * @param SlimRequest $slimRequest request + * @param SlimResponse $response response + * @param callable $next Next middleware + * @return SlimResponse + */ + public function __invoke($slimRequest, $response, $next) { + if ($this->_isCSRFRequired($slimRequest) && !$this->_isCSRFValid($slimRequest)) { + return $response->withJson([ + 'error' => 'form.csrfInvalid', + 'errorMessage' => __('form.csrfInvalid'), + ], 403); + } + $response = $next($slimRequest, $response); + return $response; + } + + /** + * Check if a CSRF token is required + * + * @param SlimRequest $slimRequest + * @return boolean + */ + protected function _isCSRFRequired($slimRequest) { + if ($this->_handler->getApiToken()) { + return false; + } + $server = $slimRequest->getServerParams(); + return !empty($server['REQUEST_METHOD']) && in_array($server['REQUEST_METHOD'], ['POST', 'PUT', 'DELETE']); + } + + /** + * Check if the CSRF token is present and valid + * + * @param SlimRequest $slimRequest + * @return boolean + */ + protected function _isCSRFValid($slimRequest) { + $server = $slimRequest->getServerParams(); + if (empty($server['HTTP_X_CSRF_TOKEN'])) { + return false; + } + $session = Application::getRequest()->getSession(); + return $session && $session->getCSRFToken() === $server['HTTP_X_CSRF_TOKEN']; + } +} diff --git a/classes/security/authorization/internal/SubmissionFileAssignedReviewerAccessPolicy.inc.php b/classes/security/authorization/internal/SubmissionFileAssignedReviewerAccessPolicy.inc.php index 10f573889ae..fe6013f397d 100644 --- a/classes/security/authorization/internal/SubmissionFileAssignedReviewerAccessPolicy.inc.php +++ b/classes/security/authorization/internal/SubmissionFileAssignedReviewerAccessPolicy.inc.php @@ -48,7 +48,7 @@ function effect() { $reviewAssignments = $reviewAssignmentDao->getByUserId($user->getId()); $reviewFilesDao = DAORegistry::getDAO('ReviewFilesDAO'); foreach ($reviewAssignments as $reviewAssignment) { - if ($context->getSetting('restrictReviewerFileAccess') && !$reviewAssignment->getDateConfirmed()) continue; + if ($context->getData('restrictReviewerFileAccess') && !$reviewAssignment->getDateConfirmed()) continue; if ( $submissionFile->getSubmissionId() == $reviewAssignment->getSubmissionId() && diff --git a/classes/security/authorization/internal/SubmissionRequiredPolicy.inc.php b/classes/security/authorization/internal/SubmissionRequiredPolicy.inc.php index 52eeaecd183..423ff13ffd7 100644 --- a/classes/security/authorization/internal/SubmissionRequiredPolicy.inc.php +++ b/classes/security/authorization/internal/SubmissionRequiredPolicy.inc.php @@ -50,7 +50,7 @@ function dataObjectEffect() { // Validate that this submission belongs to the current context. $context = $this->_request->getContext(); - if ($context->getId() !== $submission->getContextId()) return AUTHORIZATION_DENY; + if ($context->getId() != $submission->getContextId()) return AUTHORIZATION_DENY; // Save the submission to the authorization context. $this->addAuthorizedContextObject(ASSOC_TYPE_SUBMISSION, $submission); diff --git a/classes/services/AuthorService.inc.php b/classes/services/AuthorService.inc.php index 8cef7b3d652..fb8dd427df7 100644 --- a/classes/services/AuthorService.inc.php +++ b/classes/services/AuthorService.inc.php @@ -15,6 +15,7 @@ namespace PKP\Services; +use \ServicesContainer; use \PKP\Services\EntityProperties\PKPBaseEntityPropertyService; class AuthorService extends PKPBaseEntityPropertyService { @@ -61,10 +62,10 @@ public function getProperties($author, $props, $args = null) { case 'userGroupId': $values[$prop] = $author->getUserGroupId(); break; - case 'isBrowseable': + case 'includeInBrowse': $values[$prop] = (bool) $author->getIncludeInBrowse(); break; - case 'isPrimaryContact': + case 'primaryContact': $values[$prop] = (bool) $author->getPrimaryContact(); break; case 'biography': @@ -78,7 +79,12 @@ public function getProperties($author, $props, $args = null) { break; } + $locales = $args['request']->getContext()->getSupportedLocales(); + $values = ServicesContainer::instance()->get('schema')->addMissingMultilingualValues(SCHEMA_AUTHOR, $values, $locales); + \HookRegistry::call('Author::getProperties::values', array(&$values, $author, $props, $args)); + + ksort($values); } return $values; @@ -103,7 +109,7 @@ public function getSummaryProperties($author, $args = null) { public function getFullProperties($author, $args = null) { $props = array ( 'id','seq','givenName','familyName','fullName','country','email','url','userGroupId', - 'isBrowseable','isPrimaryContact','affiliation','biography','orcid', + 'includeInBrowse','primaryContact','affiliation','biography','orcid', ); \HookRegistry::call('Author::getProperties::fullProperties', array(&$props, $author, $args)); diff --git a/classes/services/PKPContextService.inc.php b/classes/services/PKPContextService.inc.php new file mode 100644 index 00000000000..1f2069ba5dd --- /dev/null +++ b/classes/services/PKPContextService.inc.php @@ -0,0 +1,701 @@ +_buildGetContextsQueryObject($args); + $contextListQO = $contextListQB->get(); + $range = $this->getRangeByArgs($args); + $contextDao = Application::getContextDAO(); + $result = $contextDao->retrieveRange($contextListQO->toSql(), $contextListQO->getBindings(), $range); + $queryResults = new DAOResultFactory($result, $contextDao, '_fromRow'); + + return $queryResults->toArray(); + } + + /** + * Get max count of contexts matching a query request + * + * @see self::getContexts() + * @return int + */ + public function getContextsMaxCount($args = array()) { + $contextListQB = $this->_buildGetContextsQueryObject($args); + $countQO = $contextListQB->countOnly()->get(); + $countRange = new DBResultRange($args['count'], 1); + $contextDao = Application::getContextDAO(); + $countResult = $contextDao->retrieveRange($countQO->toSql(), $countQO->getBindings(), $countRange); + $countQueryResults = new DAOResultFactory($countResult, $contextDao, '_fromRow'); + + return (int) $countQueryResults->getCount(); + } + + /** + * Build the contexts query object for getContexts requests + * + * @see self::getContexts() + * @return object Query object + */ + private function _buildGetContextsQueryObject($args = array()) { + + $defaultArgs = array( + 'isEnabled' => null, + 'searchPhrase' => null, + ); + + $args = array_merge($defaultArgs, $args); + + $contextListQB = $this->getContextListQueryBuilder(); + $contextListQB + ->filterByIsEnabled($args['isEnabled']) + ->searchPhrase($args['searchPhrase']); + + \HookRegistry::call('Context::getContexts::queryBuilder', array($contextListQB, $args)); + + return $contextListQB; + } + + /** + * Get a single context + * + * @param int $contextId + * @return Context|null + */ + public function getContext($contextId) { + return Application::getContextDAO()->getById($contextId); + } + + /** + * @copydoc \PKP\Services\EntityProperties\EntityPropertyInterface::getProperties() + */ + public function getProperties($context, $props, $args = null) { + $slimRequest = $args['slimRequest']; + $request = $args['request']; + $router = $request->getRouter(); + $dispatcher = $request->getDispatcher(); + + $values = array(); + + foreach ($props as $prop) { + switch ($prop) { + case 'url': + $values[$prop] = $dispatcher->url( + $request, + ROUTE_PAGE, + $context->getPath() + ); + break; + case '_href': + $values[$prop] = null; + if (!empty($slimRequest)) { + $route = $slimRequest->getAttribute('route'); + $arguments = $route->getArguments(); + $values[$prop] = $router->getApiUrl( + $request, + $arguments['contextPath'], + $arguments['version'], + 'contexts', + $context->getId() + ); + } + break; + default: + $values[$prop] = $context->getData($prop); + break; + } + } + + $supportedLocales = empty($args['supportedLocales']) ? $context->getSupportedLocales() : $args['supportedLocales']; + $values = ServicesContainer::instance()->get('schema')->addMissingMultilingualValues(SCHEMA_CONTEXT, $values, $supportedLocales); + + \HookRegistry::call('Context::getProperties', array(&$values, $context, $props, $args)); + + ksort($values); + + return $values; + } + + /** + * @copydoc \PKP\Services\EntityProperties\EntityPropertyInterface::getSummaryProperties() + */ + public function getSummaryProperties($context, $args = null) { + $props = ServicesContainer::instance() + ->get('schema') + ->getSummaryProps(SCHEMA_CONTEXT); + + return $this->getProperties($context, $props, $args); + } + + /** + * @copydoc \PKP\Services\EntityProperties\EntityPropertyInterface::getFullProperties() + */ + public function getFullProperties($context, $args = null) { + $props = ServicesContainer::instance() + ->get('schema') + ->getFullProps(SCHEMA_CONTEXT); + + return $this->getProperties($context, $props, $args); + } + + /** + * Helper function to return the app-specific context list query builder + * + * @return \PKP\Services\QueryBuilders\PKPContextListQueryBuilder + */ + abstract function getContextListQueryBuilder(); + + /** + * Validate the properties of a context + * + * Passes the properties through the SchemaService to validate them, and + * performs any additional checks needed to validate a context. + * + * This does NOT authenticate the current user to perform the action. + * + * @param $action string The type of action required. One of the + * VALIDATE_ACTION_... constants + * @param $props array The data to validate + * @param $allowedLocales array Which locales are allowed for this context + * @param $primaryLocale string + * @return array List of error messages. The array keys are property names + */ + public function validate($action, $props, $allowedLocales, $primaryLocale) { + \AppLocale::requireComponents( + LOCALE_COMPONENT_PKP_ADMIN, + LOCALE_COMPONENT_APP_ADMIN, + LOCALE_COMPONENT_PKP_MANAGER, + LOCALE_COMPONENT_APP_MANAGER + ); + $schemaService = ServicesContainer::instance()->get('schema'); + + import('lib.pkp.classes.validation.ValidatorFactory'); + $validator = \ValidatorFactory::make( + $props, + $schemaService->getValidationRules(SCHEMA_CONTEXT, $allowedLocales), + [ + 'path.regex' => __('admin.contexts.form.pathAlphaNumeric'), + 'primaryLocale.regex' => __('validator.localeKey'), + 'supportedFormLocales.regex' => __('validator.localeKey'), + 'supportedLocales.regex' => __('validator.localeKey'), + 'supportedSubmissionLocales.*.regex' => __('validator.localeKey'), + ] + ); + + // Check required fields if we're adding a context + if ($action === VALIDATE_ACTION_ADD) { + \ValidatorFactory::required( + $validator, + $schemaService->getRequiredProps(SCHEMA_CONTEXT), + $schemaService->getMultilingualProps(SCHEMA_CONTEXT), + $primaryLocale + ); + } + + // Check for input from disallowed locales + \ValidatorFactory::allowedLocales($validator, $schemaService->getMultilingualProps(SCHEMA_CONTEXT), $allowedLocales); + + // Don't allow an empty value for the primary locale of the name field + \ValidatorFactory::requirePrimaryLocale( + $validator, + ['name'], + $props, + $allowedLocales, + $primaryLocale + ); + + // Ensure that a path, if provided, does not already exist + $validator->after(function($validator) use ($action, $props) { + if (isset($props['path']) && !$validator->errors()->get('path')) { + $contextDao = Application::getContextDAO(); + $contextWithPath = $contextDao->getByPath($props['path']); + if ($contextWithPath) { + if (!($action === VALIDATE_ACTION_EDIT + && isset($props['id']) + && (int) $contextWithPath->getId() === $props['id'])) { + $validator->errors()->add('path', __('admin.contexts.form.pathExists')); + } + } + } + }); + + // If a new file has been uploaded, check that the temporary file exists and + // the current user owns it + $user = Application::getRequest()->getUser(); + \ValidatorFactory::temporaryFilesExist( + $validator, + ['favicon', 'homepageImage', 'pageHeaderLogoImage', 'styleSheet'], + ['favicon', 'homepageImage', 'pageHeaderLogoImage'], + $props, + $allowedLocales, + $user ? $user->getId() : null + ); + + // If sidebar blocks are passed, ensure the block plugin exists and is + // enabled + $validator->after(function($validator) use ($props) { + if (!empty($props['sidebar']) && !$validator->errors()->get('sidebar')) { + $plugins = \PluginRegistry::loadCategory('blocks', true); + foreach ($props['sidebar'] as $pluginName) { + if (empty($plugins[$pluginName])) { + $validator->errors()->add('sidebar', __('manager.setup.layout.sidebar.invalidBlock', ['name' => $pluginName])); + } + } + } + }); + + // Ensure the theme plugin is installed and enabled + $validator->after(function($validator) use ($props) { + if (!empty($props['themePluginPath']) && !$validator->errors()->get('themePluginPath')) { + $plugins = \PluginRegistry::loadCategory('themes', true); + $found = false; + foreach ($plugins as $plugin) { + if ($props['themePluginPath'] === $plugin->getDirName()) { + $found = true; + break; + } + } + if (!$found) { + $validator->errors()->add('themePluginPath', __('manager.setup.theme.notFound')); + } + } + }); + + if ($validator->fails()) { + $errors = $schemaService->formatValidationErrors($validator->errors(), $schemaService->get(SCHEMA_CONTEXT), $allowedLocales); + } + + \HookRegistry::call('Context::validate', array(&$errors, $action, $props, $allowedLocales, $primaryLocale)); + + return $errors; + } + + /** + * Add a new context + * + * This does not check if the user is authorized to add a context, or + * validate or sanitize this context. + * + * @param $context Context + * @param $request Request + * @return Context + */ + public function addContext($context, $request) { + $site = $request->getSite(); + $currentUser = $request->getUser(); + $contextDao = Application::getContextDAO(); + $contextSettingsDao = Application::getContextSettingsDAO(); + + if (!$context->getData('primaryLocale')) { + $context->setData('primaryLocale', $site->getPrimaryLocale()); + } + if (!$context->getData('supportedLocales')) { + $context->setData('supportedLocales', $site->getSupportedLocales()); + } + + // Specify values needed to render default locale strings + $localeParams = array( + 'indexUrl' => $request->getIndexUrl(), + 'journalPath' => $context->getData('path'), + 'primaryLocale' => $context->getData('primaryLocale'), + 'journalName' => $context->getData('name', $context->getPrimaryLocale()), + 'contextName' => $context->getData('name', $context->getPrimaryLocale()), + 'contextUrl' => $request->getDispatcher()->url( + $request, + ROUTE_PAGE, + $context->getPath() + ), + ); + + // Allow plugins to extend the $localeParams for new property defaults + \HookRegistry::call('Context::defaults::localeParams', array(&$localeParams, $context, $request)); + + $context = ServicesContainer::instance() + ->get('schema') + ->setDefaults( + SCHEMA_CONTEXT, + $context, + $context->getData('supportedLocales'), + $context->getData('primaryLocale'), + $localeParams + ); + + if (!$context->getData('supportedFormLocales')) { + $context->setData('supportedFormLocales', [$context->getData('primaryLocale')]); + } + if (!$context->getData('supportedSubmissionLocales')) { + $context->setData('supportedSubmissionLocales', [$context->getData('primaryLocale')]); + } + + $contextDao->insertObject($context); + $contextDao->resequence(); + + $context = $this->getContext($context->getId()); + + // Move uploaded files into place and update the settings + $supportedLocales = $context->getSupportedLocales(); + $fileUploadProps = ['favicon', 'homepageImage', 'pageHeaderLogoImage']; + $params = []; + foreach ($fileUploadProps as $fileUploadProp) { + $value = $context->getData($fileUploadProp); + if (empty($value)) { + continue; + } + foreach ($supportedLocales as $localeKey) { + if (!array_key_exists($localeKey, $value)) { + continue; + } + $value[$localeKey] = $this->_saveFileParam($context, $value[$localeKey], $fileUploadProp, $currentUser->getId(), $localeKey, true); + } + $params[$fileUploadProp] = $value; + } + if (!empty($params['styleSheet'])) { + $params['styleSheet'] = $this->_saveFileParam($context, $params['styleSheet'], 'styleSheet', $userId); + } + $context = $this->editContext($context, $params, $request); + + $genreDao = \DAORegistry::getDAO('GenreDAO'); + $genreDao->installDefaults($context->getId(), $context->getData('supportedLocales')); + + $userGroupDao = \DAORegistry::getDAO('UserGroupDAO'); + $userGroupDao->installSettings($context->getId(), 'registry/userGroups.xml'); + + $managerUserGroup = $userGroupDao->getDefaultByRoleId($context->getId(), ROLE_ID_MANAGER); + $userGroupDao->assignUserToGroup($currentUser->getId(), $managerUserGroup->getId()); + + import('lib.pkp.classes.file.FileManager'); + $fileManager = new \FileManager(); + foreach ($this->installFileDirs as $dir) { + $fileManager->mkdir(sprintf($dir, $this->contextsFileDirName, $context->getId())); + } + + $navigationMenuDao = \DAORegistry::getDAO('NavigationMenuDAO'); + $navigationMenuDao->installSettings($context->getId(), 'registry/navigationMenus.xml'); + + // Load all plugins so they can hook in and add their installation settings + \PluginRegistry::loadAllPlugins(); + + \HookRegistry::call('Context::add', array($context, $request)); + + return $context; + } + + /** + * Edit a context + * + * This does not check if the user is authorized to edit a context, or + * validate or sanitize the new content. + * + * @param $context Context The context to edit + * @param $params Array Key/value array of new data + * @param $request Request + * @return Context + */ + public function editContext($context, $params, $request) { + $contextDao = Application::getContextDao(); + + // Move uploaded files into place and update the params + $userId = $request->getUser() ? $request->getUser()->getId() : null; + $supportedLocales = $context->getSupportedLocales(); + $fileUploadParams = ['favicon', 'homepageImage', 'pageHeaderLogoImage']; + foreach ($fileUploadParams as $fileUploadParam) { + if (!array_key_exists($fileUploadParam, $params)) { + continue; + } + foreach ($supportedLocales as $localeKey) { + if (!array_key_exists($localeKey, $params[$fileUploadParam])) { + continue; + } + $params[$fileUploadParam][$localeKey] = $this->_saveFileParam($context, $params[$fileUploadParam][$localeKey], $fileUploadParam, $userId, $localeKey, true); + } + } + if (array_key_exists('styleSheet', $params)) { + $params['styleSheet'] = $this->_saveFileParam($context, $params['styleSheet'], 'styleSheet', $userId); + } + + $newContext = $contextDao->newDataObject(); + $newContext->_data = array_merge($context->_data, $params); + + \HookRegistry::call('Context::edit', array($newContext, $context, $params, $request)); + + $contextDao->updateObject($newContext); + $newContext = $this->getContext($newContext->getId()); + + return $newContext; + } + + /** + * Delete a context + * + * This does not check if the user is authorized to delete a context or if the + * context exists. + * + * @param $context Context + * @return boolean + */ + public function deleteContext($context) { + $contextDao = Application::getContextDao(); + $contextDao->deleteObject($context); + + $userGroupDao = \DAORegistry::getDAO('UserGroupDAO'); + $userGroupDao->deleteAssignmentsByContextId($context->getId()); + $userGroupDao->deleteByContextId($context->getId()); + + $genreDao = \DAORegistry::getDAO('GenreDAO'); + $genreDao->deleteByContextId($context->getId()); + + $announcementDao = \DAORegistry::getDAO('AnnouncementDAO'); + $announcementDao->deleteByAssoc(ASSOC_TYPE_JOURNAL, $context->getId()); + + $announcementTypeDao = \DAORegistry::getDAO('AnnouncementTypeDAO'); + $announcementTypeDao->deleteByAssoc(ASSOC_TYPE_JOURNAL, $context->getId()); + + $emailTemplateDao = \DAORegistry::getDAO('EmailTemplateDAO'); + $emailTemplateDao->deleteEmailTemplatesByContext($context->getId()); + + $pluginSettingsDao = \DAORegistry::getDAO('PluginSettingsDAO'); + $pluginSettingsDao->deleteByContextId($context->getId()); + + $reviewFormDao = \DAORegistry::getDAO('ReviewFormDAO'); + $reviewFormDao->deleteByAssoc(ASSOC_TYPE_JOURNAL, $context->getId()); + + $navigationMenuDao = \DAORegistry::getDAO('NavigationMenuDAO'); + $navigationMenuDao->deleteByContextId($context->getId()); + + $navigationMenuItemDao = \DAORegistry::getDAO('NavigationMenuItemDAO'); + $navigationMenuItemDao->deleteByContextId($context->getId()); + + import('lib.pkp.classes.file.FileManager'); + $fileManager = new \FileManager($context->getId()); + $contextPath = \Config::getVar('files', 'files_dir') . '/' . $this->contextsFileDirName . '/' . $context->getId(); + $fileManager->rmtree($contextPath); + + \HookRegistry::call('Context::delete', array($context)); + } + + /** + * Restore default values for context settings in a specific local + * + * Updates multilingual values of a context, restoring default values in a + * specific context. This may be useful when a new language has been added + * after a context has been created, or when translations change and a journal + * wants to take advantage of the new values. + * + * @param $context Context The context to restore default values for + * @param $request Request + * @param $locale string Locale key to restore defaults for. Example: `en__US` + */ + public function restoreLocaleDefaults($context, $request, $locale) { + \AppLocale::reloadLocale($locale); + \AppLocale::requireComponents(LOCALE_COMPONENT_PKP_DEFAULT, LOCALE_COMPONENT_APP_DEFAULT, $locale); + + // Specify values needed to render default locale strings + $localeParams = array( + 'indexUrl' => $request->getIndexUrl(), + 'journalPath' => $context->getData('path'), + 'primaryLocale' => $context->getData('primaryLocale'), + 'journalName' => $context->getData('name', $locale), + 'contextName' => $context->getData('name', $locale), + 'contextUrl' => $request->getDispatcher()->url( + $request, + ROUTE_PAGE, + $context->getPath() + ), + ); + + // Allow plugins to extend the $localeParams for new property defaults + \HookRegistry::call('Context::restoreLocaleDefaults::localeParams', array(&$localeParams, $context, $request, $locale)); + + $localeDefaults = ServicesContainer::instance() + ->get('schema') + ->getLocaleDefaults(SCHEMA_CONTEXT, $locale, $localeParams); + + $params = []; + foreach ($localeDefaults as $paramName => $value) { + $params[$paramName] = array_merge( + (array) $context->getData($paramName), + [$locale => $localeDefaults[$paramName]] + ); + } + + return $this->editContext($context, $params, $request); + } + + /** + * Move a temporary file to the context's public directory + * + * @param $context Context + * @param $temporaryFile TemporaryFile + * @param $fileNameBase string Unique identifier to use for the filename. The + * Extension and locale will be appended. + * @param $userId int ID of the user who uploaded the temporary file + * @param $localeKey string Example: en_US. Leave empty for a file that is + * not localized. + * @return string|boolean The new filename or false on failure + */ + public function moveTemporaryFile($context, $temporaryFile, $fileNameBase, $userId, $localeKey = '') { + import('classes.file.PublicFileManager'); + $publicFileManager = new \PublicFileManager(); + import('lib.pkp.classes.file.TemporaryFileManager'); + $temporaryFileManager = new \TemporaryFileManager(); + + $fileName = $fileNameBase; + if ($localeKey) { + $fileName .= '_' . $localeKey; + } + + $extension = $publicFileManager->getDocumentExtension($temporaryFile->getFileType()); + if (!$extension) { + $extension = $publicFileManager->getImageExtension($temporaryFile->getFileType()); + } + $fileName .= $extension; + + $result = $publicFileManager->copyContextFile( + $context->getAssoctype(), + $context->getId(), + $temporaryFile->getFilePath(), + $fileName + ); + + if (!$result) { + return false; + } + + $temporaryFileManager->deleteById($temporaryFile->getId(), $userId); + + return $fileName; + } + + /** + * Handle a context setting for an uploaded file + * + * - Moves the temporary file to the public directory + * - Resets the param value to what is expected to be stored in the db + * - If a null value is passed, deletes any existing file + * + * This method is protected because all operations which edit contexts should + * go through the addContext and editContext methods in order to ensure that + * the appropriate hooks are fired. + * + * @param $context Context The context being edited + * @param $value mixed The param value to be saved. Contains the temporary + * file ID if a new file has been uploaded. + * @param $settingName string The name of the setting to save, typically used + * in the filename. + * @param $userId integer ID of the user who owns the temporary file + * @param $localeKey string Optional. Used in the filename for multilingual + * properties. + * @param $isImage boolean Optional. For image files which return alt text, + * width, height, etc in the param value. + * @return string|array|null New param value or null on failure + */ + protected function _saveFileParam($context, $value, $settingName, $userId, $localeKey = '', $isImage = false) { + import('lib.pkp.classes.file.TemporaryFileManager'); + $temporaryFileManager = new \TemporaryFileManager(); + + // If the value is null, clean up any existing file in the system + if (is_null($value)) { + $setting = $context->getData($settingName, $localeKey); + if ($setting) { + $fileName = $isImage ? $setting['uploadName'] : $setting; + import('classes.file.PublicFileManager'); + $publicFileManager = new \PublicFileManager(); + $publicFileManager->removeContextFile($context->getAssoctype(), $context->getId(), $fileName); + } + return null; + } + + // Get uploaded file to move + if ($isImage) { + if (empty($value['temporaryFileId'])) { + return $value; // nothing to upload + } + $temporaryFileId = (int) $value['temporaryFileId']; + } else { + if (!ctype_digit($value)) { + return $value; // nothing to upload + } + $temporaryFileId = (int) $value; + } + + $temporaryFile = $temporaryFileManager->getFile($temporaryFileId, $userId); + $fileName = $this->moveTemporaryFile($context, $temporaryFile, $settingName, $userId, $localeKey); + + if ($fileName) { + // Get the details for image uploads + if ($isImage) { + import('classes.file.PublicFileManager'); + $publicFileManager = new \PublicFileManager(); + + $filePath = $publicFileManager->getContextFilesPath($context->getAssocType(), $context->getId()); + list($width, $height) = getimagesize($filePath . '/' . $fileName); + $altText = !empty($value['altText']) ? $value['altText'] : ''; + + return [ + 'name' => $temporaryFile->getOriginalFileName(), + 'uploadName' => $fileName, + 'width' => $width, + 'height' => $height, + 'dateUploaded' => \Core::getCurrentDate(), + 'altText' => $altText, + ]; + } else { + return $fileName; + } + } + + return false; + } +} diff --git a/classes/services/PKPNavigationMenuService.inc.php b/classes/services/PKPNavigationMenuService.inc.php index 340509a9c94..41f7734422b 100644 --- a/classes/services/PKPNavigationMenuService.inc.php +++ b/classes/services/PKPNavigationMenuService.inc.php @@ -146,16 +146,16 @@ function getDisplayStatus(&$navigationMenuItem, &$navigationMenu) { // Conditionally hide some items switch ($menuItemType) { case NMI_TYPE_ANNOUNCEMENTS: - $navigationMenuItem->setIsDisplayed($context && $context->getSetting('enableAnnouncements')); + $navigationMenuItem->setIsDisplayed($context && $context->getData('enableAnnouncements')); break; case NMI_TYPE_EDITORIAL_TEAM: - $navigationMenuItem->setIsDisplayed($context && $context->getLocalizedSetting('editorialTeam')); + $navigationMenuItem->setIsDisplayed($context && $context->getLocalizedData('editorialTeam')); break; case NMI_TYPE_CONTACT: - $navigationMenuItem->setIsDisplayed($context && ($context->getSetting('mailingAddress') || $context->getSetting('contactName'))); + $navigationMenuItem->setIsDisplayed($context && ($context->getData('mailingAddress') || $context->getData('contactName'))); break; case NMI_TYPE_USER_REGISTER: - $navigationMenuItem->setIsDisplayed(!$isUserLoggedIn && !($context && $context->getSetting('disableUserReg'))); + $navigationMenuItem->setIsDisplayed(!$isUserLoggedIn && !($context && $context->getData('disableUserReg'))); break; case NMI_TYPE_USER_LOGIN: $navigationMenuItem->setIsDisplayed(!$isUserLoggedIn); @@ -172,7 +172,7 @@ function getDisplayStatus(&$navigationMenuItem, &$navigationMenu) { $navigationMenuItem->setIsDisplayed($context); break; case NMI_TYPE_PRIVACY: - $navigationMenuItem->setIsDisplayed($context && $context->getLocalizedSetting('privacyStatement')); + $navigationMenuItem->setIsDisplayed($context && $context->getLocalizedData('privacyStatement')); break; } diff --git a/classes/services/PKPSchemaService.inc.php b/classes/services/PKPSchemaService.inc.php new file mode 100644 index 00000000000..5348a3cb03f --- /dev/null +++ b/classes/services/PKPSchemaService.inc.php @@ -0,0 +1,580 @@ +_schemas)) { + return $this->_schemas[$schemaName]; + } + + $schemaFile = sprintf('%s/lib/pkp/schemas/%s.json', BASE_SYS_DIR, $schemaName); + if (file_exists($schemaFile)) { + $schema = json_decode(file_get_contents($schemaFile)); + if (!$schema) { + fatalError('Schema failed to decode. This usually means it is invalid JSON. Requested: ' . $schemaFile . '. Last JSON error: ' . json_last_error()); + } + } else { + // allow plugins to create a custom schema and load it via hook + $schema = new \stdClass(); + } + + // Merge an app-specific schema file if it exists + $appSchemaFile = sprintf('%s/schemas/%s.json', BASE_SYS_DIR, $schemaName); + if (file_exists($appSchemaFile)) { + $appSchema = json_decode(file_get_contents($appSchemaFile)); + if (!$appSchema) { + fatalError('Schema failed to decode. This usually means it is invalid JSON. Requested: ' . $appSchemaFile . '. Last JSON error: ' . json_last_error()); + } + $schema = $this->merge($schema, $appSchema); + } + + \HookRegistry::call('Schema::get::' . $schemaName, $schema); + + $this->_schemas[$schemaName] = $schema; + + return $schema; + } + + /** + * Merge two schemas + * + * Merges the properties of two schemas, updating the title, description, + * and properties definitions. + * + * If both schemas contain definitions for the same property, the property + * definition in the additional schema will override the base schema. + * + * @param $baseSchema object The base schema + * @param $additionalSchema object The additional schema properties to apply + * to $baseSchema. + * @return object + */ + public function merge($baseSchema, $additionalSchema) { + $newSchema = clone $baseSchema; + if (!empty($additionalSchema->title)) { + $newSchema->title = $additionalSchema->title; + } + if (!empty($additionalSchema->description)) { + $newSchema->description = $additionalSchema->description; + } + if (!empty($additionalSchema->properties)) { + if (empty($newSchema->properties)) { + $newSchema->properties = new \stdClass(); + } + foreach ($additionalSchema->properties as $propName => $propSchema) { + $newSchema->properties->{$propName} = $propSchema; + } + } + + return $newSchema; + } + + /** + * Get the summary properties of a schema + * + * Gets the properties of a schema which are considered part of the summary + * view presented in an API. + * + * @param $schemaName string One of the SCHEMA_... constants + * @return array List of property names + */ + public function getSummaryProps($schemaName) { + $schema = $this->get($schemaName); + $props = []; + foreach ($schema->properties as $propName => $propSchema) { + if (property_exists($propSchema, 'apiSummary') && $propSchema->apiSummary) { + $props[] = $propName; + } + } + + return $props; + } + + /** + * Get all properties of a schema + * + * Gets the complete list of properties of a schema which are considered part + * of the full view prsented in an API. + * + * @param $schemaName string One of the SCHEMA_... constants + * @return array List of property names + */ + public function getFullProps($schemaName) { + $schema = $this->get($schemaName); + + return array_keys(get_object_vars($schema->properties)); + } + + /** + * Get required properties of a schema + * + * @param $schemaName string One of the SCHEMA_... constants + * @return array List of property names + */ + public function getRequiredProps($schemaName) { + $schema = $this->get($schemaName); + + if (!empty($schema->required)) { + return $schema->required; + } + return []; + } + + /** + * Get multilingual properties of a schema + * + * @param $schemaName string One of the SCHEMA_... constants + * @return array List of property names + */ + public function getMultilingualProps($schemaName) { + $schema = $this->get($schemaName); + + $multilingualProps = []; + foreach ($schema->properties as $propName => $propSchema) { + if (!empty($propSchema->multilingual)) { + $multilingualProps[] = $propName; + } + } + + return $multilingualProps; + } + + /** + * Sanitize properties according to a schema + * + * This method coerces properties to their appropriate type, and strips out + * properties that are not specified in the schema. + * + * @param $schemaName string One of the SCHEMA_... constants + * @param $props array Properties to be sanitized + * @return array The sanitized props + */ + public function sanitize($schemaName, $props) { + $schema = $this->get($schemaName); + $cleanProps = []; + + foreach ($props as $propName => $propValue) { + if (empty($schema->properties->{$propName}) + || empty($schema->properties->{$propName}->type) + || !empty($schema->properties->{$propName}->readonly)) { + continue; + } + $propSchema = $schema->properties->{$propName}; + if (!empty($propSchema->multilingual)) { + $values = is_array($propValue) ? $propValue : [$propValue]; + foreach ($propValue as $localeKey => $localeValue) { + $values[$localeKey] = $this->coerce($localeValue, $propSchema->type, $propSchema); + } + if (!empty($values)) { + $cleanProps[$propName] = $values; + } + } else { + $cleanProps[$propName] = $this->coerce($propValue, $propSchema->type, $propSchema); + } + } + + return $cleanProps; + } + + /** + * Coerce a value to a variable type + * + * It will leave null values alone. + * + * @param $value mixed + * @param $type string boolean, integer, number, string, array, object + * @param $schema object A schema defining this property + * @return mixed The value coerced to type + */ + public function coerce($value, $type, $schema) { + if (is_null($value)) { + return $value; + } + switch ($type) { + case 'boolean': + return (bool) $value; + case 'integer': + return (int) $value; + case 'number': + return (float) $value; + case 'string': + if (is_object($value) || is_array($value)) { + $value = serialize($value); + } + $value = (string) $value; + return get_magic_quotes_gpc() ? stripslashes($value) : $value; + case 'array': + $newArray = []; + if (is_array($schema->items)) { + foreach ($schema->items as $i => $itemSchema) { + $newArray[$i] = $this->coerce($value[$i], $itemSchema->type, $itemSchema); + } + } elseif (is_array($value)) { + foreach ($value as $i => $v) { + $newArray[$i] = $this->coerce($v, $schema->items->type, $schema->items); + } + } else { + $newArray[] = serialize($value); + } + return $newArray; + case 'object': + $newObject = []; // we handle JSON objects as assoc arrays in PHP + foreach ($schema->properties as $propName => $propSchema) { + if (!isset($value[$propName]) || !empty($propSchema->readOnly)) { + continue; + } + $newObject[$propName] = $this->coerce($value[$propName], $propSchema->type, $propSchema); + } + return $newObject; + } + fatalError('Requested variable coercion for a type that was not recognized: ' . $type); + } + + /** + * Get the validation rules for the properties of a schema + * + * These validation rules are returned in a format that is ready to be passed + * into ValidatorFactory::make(). + * + * @param $schemaName string One of the SCHEMA_... constants + * @param $allowedLocales array List of allowed locale keys. + * @return array List of validation rules for each property + */ + public function getValidationRules($schemaName, $allowedLocales) { + $schema = $this->get($schemaName); + + $rules = []; + foreach ($schema->properties as $propName => $propSchema) { + if (!empty($propSchema->multilingual)) { + foreach ($allowedLocales as $localeKey) { + $rules = $this->addPropValidationRules($rules, $propName . '.' . $localeKey, $propSchema); + } + } else { + $rules = $this->addPropValidationRules($rules, $propName, $propSchema); + } + } + + return $rules; + } + + /** + * Compile the validation rules for a single property's schema + * + * @param $propSchema object The property schema + * @return array List of Laravel-formatted validation rules + */ + public function addPropValidationRules($rules, $ruleKey, $propSchema) { + if (!empty($propSchema->readOnly)) { + return $rules; + } + switch ($propSchema->type) { + case 'boolean': + case 'integer': + case 'numeric': + case 'string': + $rules[$ruleKey] = [$propSchema->type]; + if (!empty($propSchema->validation)) { + $rules[$ruleKey] = array_merge($rules[$ruleKey], $propSchema->validation); + } + break; + case 'array': + if ($propSchema->items->type === 'object') { + $rules = $this->addPropValidationRules($rules, $ruleKey . '.*', $propSchema->items); + } else { + $rules[$ruleKey] = ['array']; + $rules[$ruleKey . '.*'] = [$propSchema->items->type]; + if (!empty($propSchema->items->validation)) { + $rules[$ruleKey . '.*'] = array_merge($rules[$ruleKey . '.*'], $propSchema->items->validation); + } + } + break; + case 'object': + foreach ($propSchema->properties as $subPropName => $subPropSchema) { + $rules = $this->addPropValidationRules($rules, $ruleKey . '.' . $subPropName, $subPropSchema); + } + break; + } + + return $rules; + } + + /** + * Format validation errors + * + * This method receives a (Laravel) MessageBag object and formats an error + * array to match the entity's schema. It converts Laravel's dot notation for + * objects and arrays: + * + * [ + * foo.en_US: ['Error message'], + * foo.fr_CA: ['Error message'], + * bar.0.baz: ['Error message'], + * ] + * + * Into an assoc array, collapsing subproperty errors into their parent prop: + * + * [ + * foo: [ + * en_US: ['Error message'], + * fr_CA: ['Error message'], + * ], + * bar: ['Error message'], + * ] + * + * @param $errorBag \Illuminate\Support\MessageBag + * @param $schema object The entity schema + * @return array + */ + public function formatValidationErrors($errorBag, $schema, $locales) { + $errors = $errorBag->getMessages(); + $formatted = []; + + foreach ($errors as $ruleKey => $messages) { + $ruleKeyParts = explode('.', $ruleKey); + $propName = $ruleKeyParts[0]; + if (!isset($formatted[$propName])) { + $formatted[$propName] = []; + } + if (!empty($schema->properties->{$propName}) && !empty($schema->properties->{$propName}->multilingual)) { + $localeKey = $ruleKeyParts[1]; + if (!isset($formatted[$propName][$localeKey])) { + $formatted[$propName][$localeKey] = []; + } + $formatted[$propName][$localeKey] = array_merge($formatted[$propName][$localeKey], $messages); + } else { + $formatted[$propName] = array_merge($formatted[$propName], $messages); + } + } + + return $formatted; + } + + /** + * Set default values for an object + * + * Get default values from an object's schema and set them for the passed + * object. + * + * localeParams are used to populate translation strings where default values + * rely on them. For example, a locale string like the following: + * + * "This email was sent on behalf of {$contextName}." + * + * Will expect a $localeParams value like this: + * + * ['contextName' => 'Journal of Public Knowledge'] + * + * @param $schemaName string One of the SCHEMA_... constants + * @param $object DataObject The object to be modified + * @param $supportedLocales array List of locale keys that shoud receive + * default content. Example: ['en_US', 'fr_CA'] + * @param $primaryLocale string Example: `en_US` + * @param $localeParams array Key/value params for the translation strings + * @return DataObject + */ + public function setDefaults($schemaName, $object, $supportedLocales, $primaryLocale, $localeParams = array()) { + $schema = $this->get($schemaName); + + // Ensure the locale files are loaded for all required locales + foreach ($supportedLocales as $localeKey) { + \AppLocale::requireComponents( + LOCALE_COMPONENT_PKP_DEFAULT, LOCALE_COMPONENT_APP_DEFAULT, + LOCALE_COMPONENT_PKP_COMMON, LOCALE_COMPONENT_APP_COMMON, + $localeKey + ); + } + + foreach ($schema->properties as $propName => $propSchema) { + // Don't override existing values + if (!is_null($object->getData($propName))) { + continue; + } + if (!property_exists($propSchema, 'default') && !property_exists($propSchema, 'defaultLocaleKey')) { + continue; + } + if (!empty($propSchema->multilingual)) { + $value = []; + foreach ($supportedLocales as $localeKey) { + $value[$localeKey] = $this->getDefault($propSchema, $localeParams, $localeKey); + } + } else { + $value = $this->getDefault($propSchema, $localeParams, $primaryLocale); + } + $object->setData($propName, $value); + } + + return $object; + } + + /** + * Get the default values for a specific locale + * + * @param $schemaName string One of the SCHEMA_... constants + * @param $locale string The locale key to get values for. Example: `en_US` + * @param $localeParams array Key/value params for the translation strings + * @return array Key/value of property defaults for the specified locale + */ + public function getLocaleDefaults($schemaName, $locale, $localeParams) { + $schema = $this->get($schemaName); + \AppLocale::requireComponents(LOCALE_COMPONENT_PKP_DEFAULT, LOCALE_COMPONENT_APP_DEFAULT, $locale); + + $defaults = []; + foreach ($schema->properties as $propName => $propSchema) { + if (empty($propSchema->multilingual) || empty($propSchema->defaultLocaleKey)) { + continue; + } + $defaults[$propName] = $this->getDefault($propSchema, $localeParams, $locale); + } + + return $defaults; + } + + /** + * Get a default value for a property based on the schema + * + * @param $propSchema object The schema definition for this property + * @param $localeParams array\null Optional. Key/value params for the translation strings + * @param $localeKey string|null Optional. The locale to translate into + * @return mixed Will return null if no default value is available + */ + public function getDefault($propSchema, $localeParams = null, $localeKey = null) { + switch ($propSchema->type) { + case 'boolean': + case 'integer': + case 'number': + case 'string': + if (property_exists($propSchema, 'default')) { + return $propSchema->default; + } elseif (property_exists($propSchema, 'defaultLocaleKey')) { + return __($propSchema->defaultLocaleKey, $localeParams, $localeKey); + } + break; + case 'array': + $value = []; + foreach ($propSchema->default as $default) { + $itemSchema = $propSchema->items; + $itemSchema->default = $default; + $value[] = $this->getDefault($itemSchema, $localeParams, $localeKey); + } + return $value; + case 'object': + $value = []; + foreach ($propSchema->properties as $subPropName => $subPropSchema) { + if (!property_exists($propSchema->default, $subPropName)) { + continue; + } + $defaultSubProp = $propSchema->default->{$subPropName}; + // If a prop is expected to be a string but the default value is an + // object with a `defaultLocaleKey` property, then we render that + // translation. Othewrise, we assign the values as-is and do not + // recursively check for nested objects/arrays inside of objects. + if ($subPropSchema->type === 'string' && is_object($defaultSubProp) && property_exists($defaultSubProp, 'defaultLocaleKey')) { + $value[$subPropName] = __($defaultSubProp->defaultLocaleKey, $localeParams, $localeKey); + } else { + $value[$subPropName] = $defaultSubProp; + } + } + return $value; + } + return null; + } + + /** + * Add multilingual props for missing values + * + * This method will take a set of property values and add empty entries for + * any locales that are missing. Given the following: + * + * $values = [ + * 'title' => [ + * 'en_US' => 'The Journal of Public Knowledge', + * ] + * ] + * + * If the locales en_US and fr_CA are requested, it will return the following: + * + * $values = [ + * 'title' => [ + * 'en_US' => 'The Journal of Public Knowledge', + * 'fr_CA' => '', + * ] + * ] + * + * This is primarily used to ensure API responses present a consistent data + * structure regardless of which properties have values. + * + * @param $schemaName string One of the SCHEMA_... constants + * @param $values array Key/value list of entity properties + * @param $$localeKeys array List of locale keys expected in the result + * @return array + */ + public function addMissingMultilingualValues($schemaName, $values, $localeKeys) { + $schema = $this->get($schemaName); + $multilingualProps = $this->getMultilingualProps($schemaName); + + foreach ($values as $key => $value) { + if (!in_array($key, $multilingualProps)) { + continue; + } + foreach ($localeKeys as $localeKey) { + if (is_array($value) && array_key_exists($localeKey, $value)) { + continue; + } + switch ($schema->properties->{$key}->type) { + case 'string': + $values[$key][$localeKey] = ''; + break; + case 'array': + $values[$key][$localeKey] = []; + break; + default: + $values[$key][$localeKey] = null; + } + } + } + + return $values; + } +} diff --git a/classes/services/PKPSiteService.inc.php b/classes/services/PKPSiteService.inc.php new file mode 100644 index 00000000000..0189e3c57d4 --- /dev/null +++ b/classes/services/PKPSiteService.inc.php @@ -0,0 +1,333 @@ +getSite(); + } + + /** + * @copydoc \PKP\Services\EntityProperties\EntityPropertyInterface::getProperties() + */ + public function getProperties($site, $props, $args = null) { + $request = $args['request']; + $router = $request->getRouter(); + $dispatcher = $request->getDispatcher(); + + $values = array(); + foreach ($props as $prop) { + $values[$prop] = $site->getData($prop); + } + + $values = ServicesContainer::instance()->get('schema')->addMissingMultilingualValues(SCHEMA_SITE, $values, $site->getSupportedLocales()); + + \HookRegistry::call('Site::getProperties', array(&$values, $site, $props, $args)); + + ksort($values); + + return $values; + } + + /** + * @copydoc \PKP\Services\EntityProperties\EntityPropertyInterface::getSummaryProperties() + */ + public function getSummaryProperties($site, $args = null) { + return $this->getFullProperties($site, $args); + } + + /** + * @copydoc \PKP\Services\EntityProperties\EntityPropertyInterface::getFullProperties() + */ + public function getFullProperties($site, $args = null) { + $props = ServicesContainer::instance() + ->get('schema') + ->getFullProps(SCHEMA_SITE); + + return $this->getProperties($site, $props, $args); + } + + /** + * Validate the properties of a site + * + * Passes the properties through the SchemaService to validate them, and + * performs any additional checks needed to validate a site. + * + * This does NOT authenticate the current user to perform the action. + * + * @param $props array The data to validate + * @param $allowedLocales array Which locales are allowed for this context + * @param $primaryLocale string + * @return array List of error messages. The array keys are property names + */ + public function validate($props, $allowedLocales, $primaryLocale) { + \AppLocale::requireComponents( + LOCALE_COMPONENT_PKP_ADMIN, + LOCALE_COMPONENT_APP_ADMIN, + LOCALE_COMPONENT_PKP_MANAGER, + LOCALE_COMPONENT_APP_MANAGER + ); + $schemaService = ServicesContainer::instance()->get('schema'); + + import('lib.pkp.classes.validation.ValidatorFactory'); + $validator = \ValidatorFactory::make( + $props, + $schemaService->getValidationRules(SCHEMA_SITE, $allowedLocales), + [ + 'primaryLocale.regex' => __('validator.localeKey'), + 'supportedLocales.regex' => __('validator.localeKey'), + ] + ); + + // Check for input from disallowed locales + \ValidatorFactory::allowedLocales( + $validator, + $schemaService->getMultilingualProps(SCHEMA_SITE), + $allowedLocales + ); + + // Don't allow an empty value for the primary locale for some fields + \ValidatorFactory::requirePrimaryLocale( + $validator, + ['title', 'contactName', 'contactEmail'], + $props, + $allowedLocales, + $primaryLocale + ); + + // If a new file has been uploaded, check that the temporary file exists and + // the current user owns it + $user = Application::getRequest()->getUser(); + \ValidatorFactory::temporaryFilesExist( + $validator, + ['pageHeaderTitleImage', 'styleSheet'], + ['pageHeaderTitleImage'], + $props, + $allowedLocales, + $user ? $user->getId() : null + ); + + // If sidebar blocks are passed, ensure the block plugin exists and is + // enabled + $validator->after(function($validator) use ($props) { + if (!empty($props['sidebar']) && !$validator->errors()->get('sidebar')) { + $plugins = \PluginRegistry::loadCategory('blocks', true); + foreach ($props['sidebar'] as $pluginName) { + if (empty($plugins[$pluginName])) { + $validator->errors()->add('sidebar', __('manager.setup.layout.sidebar.invalidBlock', ['name' => $pluginName])); + } + } + } + }); + + // Ensure the theme plugin is installed and enabled + $validator->after(function($validator) use ($props) { + if (!empty($props['themePluginPath']) && !$validator->errors()->get('themePluginPath')) { + $plugins = \PluginRegistry::loadCategory('themes', true); + $found = false; + foreach ($plugins as $plugin) { + if ($props['themePluginPath'] === $plugin->getDirName()) { + $found = true; + break; + } + } + if (!$found) { + $validator->errors()->add('themePluginPath', __('manager.setup.theme.notFound')); + } + } + }); + + if ($validator->fails()) { + $errors = $schemaService->formatValidationErrors($validator->errors(), $schemaService->get(SCHEMA_SITE), $allowedLocales); + } + + \HookRegistry::call('Site::validate', array(&$errors, $props, $allowedLocales, $primaryLocale)); + + return $errors; + } + + /** + * Edit the site + * + * This does not check if the user is authorized to edit the site, or validate or sanitize + * the new content. + * + * @param $site Context The context to edit + * @param $params Array Key/value array of new data + * @param $request Request + * @return Site + */ + public function editSite($site, $params, $request) { + $siteDao = DAORegistry::getDAO('SiteDAO'); + + // Move uploaded files into place and update the params + $userId = $request->getUser() ? $request->getUser()->getId() : null; + $supportedLocales = $site->getSupportedLocales(); + if (array_key_exists('pageHeaderTitleImage', $params)) { + foreach ($supportedLocales as $localeKey) { + if (!array_key_exists($localeKey, $params['pageHeaderTitleImage'])) { + continue; + } + $params['pageHeaderTitleImage'][$localeKey] = $this->_saveFileParam($site, $params['pageHeaderTitleImage'][$localeKey], 'pageHeaderTitleImage', $userId, $localeKey, true); + } + } + if (array_key_exists('styleSheet', $params)) { + $params['styleSheet'] = $this->_saveFileParam($site, $params['styleSheet'], 'styleSheet', $userId); + } + + $newSite = $siteDao->newDataObject(); + $newSite->_data = array_merge($site->_data, $params); + + \HookRegistry::call('Site::edit', array($newSite, $site, $params, $request)); + + $siteDao->updateObject($newSite); + $newSite = $this->getSite(); + + return $newSite; + } + + /** + * Move a temporary file to the site's public directory + * + * @param $context Context + * @param $temporaryFile TemporaryFile + * @param $fileNameBase string Unique identifier to use for the filename. The + * Extension and locale will be appended. + * @param $userId int ID of the user who uploaded the temporary file + * @param $localeKey string Example: en_US. Leave empty for a file that is + * not localized. + * @return string|boolean The new filename or false on failure + */ + public function moveTemporaryFile($context, $temporaryFile, $fileNameBase, $userId, $localeKey = '') { + import('classes.file.PublicFileManager'); + $publicFileManager = new \PublicFileManager(); + import('lib.pkp.classes.file.TemporaryFileManager'); + $temporaryFileManager = new \TemporaryFileManager(); + + $fileName = $fileNameBase; + if ($localeKey) { + $fileName .= '_' . $localeKey; + } + + $extension = $publicFileManager->getDocumentExtension($temporaryFile->getFileType()); + if (!$extension) { + $extension = $publicFileManager->getImageExtension($temporaryFile->getFileType()); + } + $fileName .= $extension; + + if (!$publicFileManager->copyFile($temporaryFile->getFilePath(), $publicFileManager->getSiteFilesPath() . '/' . $fileName)) { + return false; + } + + $temporaryFileManager->deleteById($temporaryFile->getId(), $userId); + + return $fileName; + } + + /** + * Handle a site setting for an uploaded file + * + * - Moves the temporary file to the public directory + * - Resets the param value to what is expected to be stored in the db + * + * This method is protected because all operations which edit the site should + * go through the editSite method in order to ensure that the appropriate hooks are fired. + * + * @param $site Site The site being edited + * @param $value mixed The param value to be saved. Contains the temporary + * file ID if a new file has been uploaded. + * @param $settingName string The name of the setting to save, typically used + * in the filename. + * @param $userId integer ID of the user who owns the temporary file + * @param $localeKey string Optional. Used in the filename for multilingual + * properties. + * @param $isImage boolean Optional. For image files which return alt text, + * width, height, etc in the param value. + * @return string|array|null New param value or null on failure + */ + protected function _saveFileParam($site, $value, $settingName, $userId, $localeKey = '', $isImage = false) { + import('lib.pkp.classes.file.TemporaryFileManager'); + $temporaryFileManager = new \TemporaryFileManager(); + + // If the value is null, clean up any existing file in the system + if (is_null($value)) { + $setting = $site->getData($settingName, $localeKey); + if ($setting) { + $fileName = $isImage ? $setting['uploadName'] : $setting; + import('classes.file.PublicFileManager'); + $publicFileManager = new \PublicFileManager(); + $publicFileManager->removeSiteFile($fileName); + } + return null; + } + + // Get uploaded file to move + if ($isImage) { + if (empty($value['temporaryFileId'])) { + return $value; // nothing to upload + } + $temporaryFileId = (int) $value['temporaryFileId']; + } else { + if (!ctype_digit($value)) { + return $value; // nothing to upload + } + $temporaryFileId = (int) $value; + } + + $temporaryFile = $temporaryFileManager->getFile($temporaryFileId, $userId); + $fileName = $this->moveTemporaryFile($site, $temporaryFile, $settingName, $userId, $localeKey); + + if ($fileName) { + // Get the details for image uploads + if ($isImage) { + import('classes.file.PublicFileManager'); + $publicFileManager = new \PublicFileManager(); + + list($width, $height) = getimagesize($publicFileManager->getSiteFilesPath() . '/' . $fileName); + $altText = !empty($value['altText']) ? $value['altText'] : ''; + + return [ + 'originalFilename' => $temporaryFile->getOriginalFileName(), + 'uploadName' => $fileName, + 'width' => $width, + 'height' => $height, + 'dateUploaded' => \Core::getCurrentDate(), + 'altText' => $altText, + ]; + } else { + return $fileName; + } + } + + return false; + } +} diff --git a/classes/services/PKPSubmissionService.inc.php b/classes/services/PKPSubmissionService.inc.php index 3c464902b62..c581d44276b 100644 --- a/classes/services/PKPSubmissionService.inc.php +++ b/classes/services/PKPSubmissionService.inc.php @@ -372,6 +372,7 @@ public function getProperties($submission, $props, $args = null) { $authorService = \ServicesContainer::instance()->get('author'); $request = \Application::getRequest(); $dispatcher = $request->getDispatcher(); + $router = $request->getRouter(); // Retrieve the submission's context for properties that require it if (array_intersect(array('urlAuthorWorkflow', 'urlEditorialWorkflow'), $props)) { @@ -461,10 +462,10 @@ public function getProperties($submission, $props, $args = null) { $values[$prop] = $submission->getDatePublished(); break; case 'status': - $values[$prop] = array( - 'id' => (int) $submission->getStatus(), - 'label' => __($submission->getStatusKey()), - ); + $values[$prop] = (int) $submission->getStatus(); + break; + case 'statusLabel': + $values[$prop] = __($submission->getStatusKey()); break; case 'submissionProgress': $values[$prop] = (int) $submission->getSubmissionProgress(); @@ -497,7 +498,7 @@ public function getProperties($submission, $props, $args = null) { if (!empty($args['slimRequest'])) { $route = $args['slimRequest']->getAttribute('route'); $arguments = $route->getArguments(); - $values[$prop] = $this->getAPIHref( + $values[$prop] = $router->getApiUrl( $args['request'], $arguments['contextPath'], $arguments['version'], @@ -518,8 +519,12 @@ public function getProperties($submission, $props, $args = null) { } } + $values = ServicesContainer::instance()->get('schema')->addMissingMultilingualValues(SCHEMA_SUBMISSION, $values, $request->getContext()->getSupportedLocales()); + \HookRegistry::call('Submission::getProperties::values', array(&$values, $submission, $props, $args)); + ksort($values); + return $values; } @@ -534,7 +539,7 @@ public function getSummaryProperties($submission, $args = null) { $props = array ( 'id','title','subtitle','fullTitle','prefix', - 'abstract','language','pages','datePublished','status', + 'abstract','language','pages','datePublished','status','statusLabel', 'submissionProgress','urlWorkflow','urlPublished','galleysSummary','_href', ); @@ -562,7 +567,7 @@ public function getFullProperties($submission, $args = null) { 'id','title','subtitle','fullTitle','prefix','abstract', 'discipline','subject','type','language','sponsor','pages', 'copyrightYear','licenseUrl','locale','dateSubmitted','dateStatusModified','lastModified','datePublished', - 'status','submissionProgress','urlWorkflow','urlPublished', + 'status','statusLabel','submissionProgress','urlWorkflow','urlPublished', 'galleys','_href', ); @@ -592,8 +597,9 @@ public function getBackendListProperties($submission, $args = null) { $currentUser = $request->getUser(); $props = array ( - 'id','fullTitle','status','submissionProgress','stages','reviewRounds','reviewAssignments', - 'locale', 'urlWorkflow','urlAuthorWorkflow','urlEditorialWorkflow','urlPublished','_href', + 'id','fullTitle','status','statusLabel','submissionProgress','stages', + 'reviewRounds','reviewAssignments','locale', 'urlWorkflow', + 'urlAuthorWorkflow','urlEditorialWorkflow','urlPublished','_href', ); if ($this->canUserViewAuthor($currentUser, $submission)) { @@ -682,7 +688,7 @@ public function getPropertyReviewRounds($submission) { * `assocType` int * `assocId` int * `stageId` int - * `sequence` int + * `seq` int * `closed` bool * }] * `statusId` int stage status. note: on review stage, this refers to the @@ -734,7 +740,7 @@ public function getPropertyStages($submission, $stageIds = null) { 'assocType' => (int) $query->getAssocType(), 'assocId' => (int) $query->getAssocId(), 'stageId' => $stageId, - 'sequence' => (int) $query->getSequence(), + 'seq' => (int) $query->getSequence(), 'closed' => (bool) $query->getIsClosed(), ); } diff --git a/classes/services/UserService.inc.php b/classes/services/UserService.inc.php index d83625658ba..628b0aecc31 100644 --- a/classes/services/UserService.inc.php +++ b/classes/services/UserService.inc.php @@ -18,6 +18,7 @@ use \DBResultRange; use \DAOResultFactory; use \DAORegistry; +use \ServicesContainer; use \PKP\Services\EntityProperties\PKPBaseEntityPropertyService; class UserService extends PKPBaseEntityPropertyService { @@ -199,6 +200,7 @@ public function getUser($userId) { public function getProperties($user, $props, $args = null) { $request = $args['request']; $context = $request->getContext(); + $router = $request->getRouter(); $values = array(); foreach ($props as $prop) { @@ -300,7 +302,7 @@ public function getProperties($user, $props, $args = null) { if (!empty($args['slimRequest'])) { $route = $args['slimRequest']->getAttribute('route'); $arguments = $route->getArguments(); - $values[$prop] = $this->getAPIHref( + $values[$prop] = $router->getApiUrl( $args['request'], $arguments['contextPath'], $arguments['version'], @@ -351,7 +353,11 @@ public function getProperties($user, $props, $args = null) { break; } + $values = ServicesContainer::instance()->get('schema')->addMissingMultilingualValues(SCHEMA_USER, $values, $context->getSupportedLocales()); + \HookRegistry::call('User::getProperties::values', array(&$values, $user, $props, $args)); + + ksort($values); } return $values; diff --git a/classes/services/entityProperties/PKPBaseEntityPropertyService.inc.php b/classes/services/entityProperties/PKPBaseEntityPropertyService.inc.php index a4dab6914fa..d6a7d170409 100644 --- a/classes/services/entityProperties/PKPBaseEntityPropertyService.inc.php +++ b/classes/services/entityProperties/PKPBaseEntityPropertyService.inc.php @@ -18,6 +18,11 @@ use \DBResultRange; use \PKP\Services\Exceptions\InvalidServiceException; +// The type of action against which data should be validated. When adding an +// entity, required properties must be present and not empty. +define('VALIDATE_ACTION_ADD', 'add'); +define('VALIDATE_ACTION_EDIT', 'edit'); + abstract class PKPBaseEntityPropertyService implements EntityPropertyInterface { /** @var object $service */ @@ -53,35 +58,9 @@ abstract public function getSummaryProperties($entity, $args = null); abstract public function getFullProperties($entity, $args = null); /** - * Build a URL to an object in the API - * - * This method builds the correct URL depending on whether disable_path_info - * is enabled in the config file. + * A helper function to retrieve the DBResultRange for a query from the + * request arguments. * - * @param Request $request - * @param string $contextPath - * @param string $apiVersion - * @param string $baseEndpoint Example: 'submissions' - * @param string $endpointParams Example: '1', '1/galleys' - * @return string - */ - public function getAPIHref($request, $contextPath, $apiVersion, $baseEndpoint = '', $endpointParams = '') { - - $fullBaseEndpoint = sprintf('/%s/api/%s/%s', $contextPath, $apiVersion, $baseEndpoint); - - $baseUrl = $request->getBaseUrl(); - if (!$request->isRestfulUrlsEnabled()) { - $baseUrl .= '/index.php'; - } - - if ($request->isPathInfoEnabled()) { - return sprintf('%s%s/%s', $baseUrl, $fullBaseEndpoint, $endpointParams); - } - - return sprintf('%s?journal=%s&endpoint=%s/%s', $baseUrl, $contextPath, $fullBaseEndpoint, $endpointParams); - } - - /** * @param $args array * @return string */ diff --git a/classes/services/queryBuilders/PKPContextListQueryBuilder.inc.php b/classes/services/queryBuilders/PKPContextListQueryBuilder.inc.php new file mode 100644 index 00000000000..bba7c7b8bfe --- /dev/null +++ b/classes/services/queryBuilders/PKPContextListQueryBuilder.inc.php @@ -0,0 +1,130 @@ +isEnabled = $isEnabled; + return $this; + } + + /** + * Set query search phrase + * + * @param $phrase string + * + * @return \PKP\Services\QueryBuilders\PKPContextListQueryBuilder + */ + public function searchPhrase($phrase) { + $this->searchPhrase = $phrase; + return $this; + } + + /** + * Whether to return only a count of results + * + * @param $enable bool + * + * @return \PKP\Services\QueryBuilders\PKPContextListQueryBuilder + */ + public function countOnly($enable = true) { + $this->countOnly = $enable; + return $this; + } + + /** + * Execute query builder + * + * @return object Query object + */ + public function get() { + $this->columns[] = 'c.*'; + $q = Capsule::table($this->db . ' as c') + ->leftJoin($this->dbSettings . ' as cs', 'cs.' . $this->dbIdColumn, '=', 'c.' . $this->dbIdColumn) + ->groupBy('c.' . $this->dbIdColumn); + + if (!empty($this->isEnabled)) { + $q->where('c.enabled', '=', 1); + } elseif ($this->isEnabled === false) { + $q->where('c.enabled', '!=', 1); + } + + // search phrase + if (!empty($this->searchPhrase)) { + $words = explode(' ', $this->searchPhrase); + if (count($words)) { + foreach ($words as $word) { + $q->where(function($q) use ($word) { + $q->where(function($q) use ($word) { + $q->where('cs.setting_name', 'name'); + $q->where('cs.setting_value', 'LIKE', "%{$word}%"); + }) + ->orWhere(function($q) use ($word) { + $q->where('cs.setting_name', 'description'); + $q->where('cs.setting_value', 'LIKE', "%{$word}%"); + }) + ->orWhere(function($q) use ($word) { + $q->where('cs.setting_name', 'acronym'); + $q->where('cs.setting_value', 'LIKE', "%{$word}%"); + }) + ->orWhere(function($q) use ($word) { + $q->where('cs.setting_name', 'abbreviation'); + $q->where('cs.setting_value', 'LIKE', "%{$word}%"); + }); + }); + } + } + } + + // Add app-specific query statements + \HookRegistry::call('Context::getContexts::queryObject', array(&$q, $this)); + + if (!empty($this->countOnly)) { + $q->select(Capsule::raw('count(*) as context_count')); + } else { + $q->select($this->columns); + } + + return $q; + } +} diff --git a/classes/site/Site.inc.php b/classes/site/Site.inc.php index 444d165e0df..3d76c64e54a 100644 --- a/classes/site/Site.inc.php +++ b/classes/site/Site.inc.php @@ -54,14 +54,14 @@ function &getSupportedLocaleNames() { * @param $locale string Locale code to return, if desired. */ function getTitle($locale = null) { - return $this->getSetting('title', $locale); + return $this->getData('title', $locale); } /** * Get localized site title. */ function getLocalizedTitle() { - return $this->getLocalizedSetting('title'); + return $this->getLocalizedData('title'); } /** @@ -69,44 +69,19 @@ function getLocalizedTitle() { * @return string */ function getLocalizedPageHeaderTitle() { - $typeArray = $this->getSetting('pageHeaderTitleType'); - $imageArray = $this->getSetting('pageHeaderTitleImage'); - $titleArray = $this->getSetting('title'); - - $title = null; - - foreach (array(AppLocale::getLocale(), AppLocale::getPrimaryLocale()) as $locale) { - if (isset($typeArray[$locale]) && $typeArray[$locale]) { - if (isset($imageArray[$locale])) $title = $imageArray[$locale]; - } - if (empty($title) && isset($titleArray[$locale])) $title = $titleArray[$locale]; - if (!empty($title)) return $title; + if ($this->getLocalizedData('pageHeaderTitleImage')) { + return $this->getLocalizedData('pageHeaderTitleImage'); } - return null; - } - - /** - * Get localized site logo type. - * @return boolean - */ - function getLocalizedPageHeaderTitleType() { - return $this->getLocalizedData('pageHeaderTitleType'); - } - - /** - * Get original site stylesheet filename. - * @return string - */ - function getOriginalStyleFilename() { - return $this->getData('originalStyleFilename'); - } - - /** - * Set original site stylesheet filename. - * @param $originalStyleFilename string - */ - function setOriginalStyleFilename($originalStyleFilename) { - $this->setData('originalStyleFilename', $originalStyleFilename); + if ($this->getData('pageHeaderTitleImage', AppLocale::getPrimaryLocale())) { + return $this->getData('pageHeaderTitleImage', AppLocale::getPrimaryLocale()); + } + if ($this->getLocalizedData('title')) { + return $this->getLocalizedData('title'); + } + if ($this->getData('title', AppLocale::getPrimaryLocale())) { + return $this->getData('title', AppLocale::getPrimaryLocale()); + } + return ''; } /** @@ -129,21 +104,21 @@ function setRedirect($redirect) { * Get localized site about statement. */ function getLocalizedAbout() { - return $this->getLocalizedSetting('about'); + return $this->getLocalizedData('about'); } /** * Get localized site contact name. */ function getLocalizedContactName() { - return $this->getLocalizedSetting('contactName'); + return $this->getLocalizedData('contactName'); } /** * Get localized site contact email. */ function getLocalizedContactEmail() { - return $this->getLocalizedSetting('contactEmail'); + return $this->getLocalizedData('contactEmail'); } /** @@ -211,51 +186,6 @@ function getSupportedLocales() { function setSupportedLocales($supportedLocales) { $this->setData('supportedLocales', $supportedLocales); } - - /** - * Get the local name under which the site-wide locale file is stored. - * @return string - */ - function getSiteStyleFilename() { - return 'sitestyle.css'; - } - - /** - * Retrieve a site setting value. - * @param $name string - * @param $locale string - * @return mixed - */ - function &getSetting($name, $locale = null) { - $siteSettingsDao = DAORegistry::getDAO('SiteSettingsDAO'); - $setting =& $siteSettingsDao->getSetting($name, $locale); - return $setting; - } - - /** - * Get a localized setting using the current locale. - * @param $name string Setting name - * @return mixed - */ - function getLocalizedSetting($name) { - $returner = $this->getSetting($name, AppLocale::getLocale()); - // If setting is defined for current locale, use it. - if ($returner !== null) return $returner; - // Alternately, fall back on primary locale. - return $this->getSetting($name, AppLocale::getPrimaryLocale()); - } - - /** - * Update a site setting value. - * @param $name string - * @param $value mixed - * @param $type string optional - * @param $isLocalized boolean optional - */ - function updateSetting($name, $value, $type = null, $isLocalized = false) { - $siteSettingsDao = DAORegistry::getDAO('SiteSettingsDAO'); - return $siteSettingsDao->updateSetting($name, $value, $type, $isLocalized); - } } diff --git a/classes/site/SiteDAO.inc.php b/classes/site/SiteDAO.inc.php index 21df2af8ace..ffb1f4f37f5 100644 --- a/classes/site/SiteDAO.inc.php +++ b/classes/site/SiteDAO.inc.php @@ -13,12 +13,21 @@ * * @brief Operations for retrieving and modifying the Site object. */ - - import('lib.pkp.classes.site.Site'); +import('classes.core.ServicesContainer'); class SiteDAO extends DAO { + /** @var array Maps schema properties for the primary table to their column names */ + var $primaryTableColumns = [ + 'redirect' => 'redirect', + 'primaryLocale' => 'primary_locale', + 'minPasswordLength' => 'min_password_length', + 'installedLocales' => 'installed_locales', + 'supportedLocales' => 'supported_locales', + ]; + + /** * Retrieve site information. * @return Site @@ -30,7 +39,7 @@ function &getSite() { ); if ($result->RecordCount() != 0) { - $site = $this->_returnSiteFromRow($result->GetRowAssoc(false)); + $site = $this->_fromRow($result->GetRowAssoc(false)); } $result->Close(); @@ -46,21 +55,53 @@ function newDataObject() { } /** - * Internal function to return a Site object from a row. - * @param $row array - * @param $callHook boolean - * @return Site + * @copydoc SchemaDAO::_fromRow() */ - function &_returnSiteFromRow($row, $callHook = true) { + function _fromRow($primaryRow, $callHook = true) { + $schemaService = ServicesContainer::instance()->get('schema'); + $schema = $schemaService->get(SCHEMA_SITE); + $site = $this->newDataObject(); - $site->setRedirect($row['redirect']); - $site->setMinPasswordLength($row['min_password_length']); - $site->setPrimaryLocale($row['primary_locale']); - $site->setOriginalStyleFilename($row['original_style_file_name']); - $site->setInstalledLocales(isset($row['installed_locales']) && !empty($row['installed_locales']) ? explode(':', $row['installed_locales']) : array()); - $site->setSupportedLocales(isset($row['supported_locales']) && !empty($row['supported_locales']) ? explode(':', $row['supported_locales']) : array()); - if ($callHook) HookRegistry::call('SiteDAO::_returnSiteFromRow', array(&$site, &$row)); + foreach ($this->primaryTableColumns as $propName => $column) { + if (isset($primaryRow[$column])) { + // Backwards-compatible handling of the installedLocales and + // supportedLocales data. Before 3.2, these were stored as colon-separated + // strings (eg - en_US:fr_CA:ar_IQ). In 3.2, these are migrated to + // serialized arrays defined by the site.json schema. However, some of the + // older upgrade scripts use site data before the migration is performed, + // so SiteDAO must be able to return the correct array before the data + // is migrated. This code checks the format and converts the old data so + // that calls to $site->getInstalledLocales() and + // $site->getSupportedLocales() return an appropriate array. + if (in_array($column, ['installed_locales', 'supported_locales']) && + !is_null($primaryRow[$column]) && strpos($primaryRow[$column], '{') === false) { + $site->setData($propName, explode(':', $primaryRow[$column])); + } else { + $site->setData( + $propName, + $this->convertFromDb($primaryRow[$column], $schema->properties->{$propName}->type) + ); + } + } + } + + $result = $this->retrieve("SELECT * FROM site_settings"); + + while (!$result->EOF) { + $settingRow = $result->getRowAssoc(false); + if (!empty($schema->properties->{$settingRow['setting_name']})) { + $site->setData( + $settingRow['setting_name'], + $this->convertFromDB( + $settingRow['setting_value'], + $schema->properties->{$settingRow['setting_name']}->type + ), + empty($settingRow['locale']) ? null : $settingRow['locale'] + ); + } + $result->MoveNext(); + } return $site; } @@ -72,45 +113,76 @@ function &_returnSiteFromRow($row, $callHook = true) { function insertSite(&$site) { $returner = $this->update( 'INSERT INTO site - (redirect, min_password_length, primary_locale, installed_locales, supported_locales, original_style_file_name) + (redirect, min_password_length, primary_locale, installed_locales, supported_locales) VALUES - (?, ?, ?, ?, ?, ?)', + (?, ?, ?, ?, ?)', array( $site->getRedirect(), (int) $site->getMinPasswordLength(), $site->getPrimaryLocale(), - join(':', $site->getInstalledLocales()), - join(':', $site->getSupportedLocales()), - $site->getOriginalStyleFilename() + $this->convertToDB($site->getInstalledLocales(), $type = 'array'), + $this->convertToDB($site->getInstalledLocales(), $type = 'array'), ) ); return $returner; } /** - * Update existing site information. - * @param $site Site + * @copydoc SchemaDAO::updateObject */ - function updateObject(&$site) { - return $this->update( - 'UPDATE site - SET - redirect = ?, - min_password_length = ?, - primary_locale = ?, - installed_locales = ?, - supported_locales = ?, - original_style_file_name = ?', - array( - $site->getRedirect(), - (int) $site->getMinPasswordLength(), - $site->getPrimaryLocale(), - join(':', $site->getInstalledLocales()), - join(':', $site->getSupportedLocales()), - $site->getOriginalStyleFilename() - ) - ); - } -} + public function updateObject($site) { + $schemaService = ServicesContainer::instance()->get('schema'); + $schema = $schemaService->get(SCHEMA_SITE); + $sanitizedProps = $schemaService->sanitize(SCHEMA_SITE, $site->_data); + $set = $params = []; + foreach ($this->primaryTableColumns as $propName => $column) { + $set[] = $column . ' = ?'; + $params[] = $this->convertToDb($sanitizedProps[$propName], $schema->properties->{$propName}->type); + } + $this->update("UPDATE site SET " . join(',', $set), $params); + + $deleteSettings = []; + $keyColumns = ['locale', 'setting_name']; + foreach ($schema->properties as $propName => $propSchema) { + if (array_key_exists($propName, $this->primaryTableColumns)) { + continue; + } elseif (!isset($sanitizedProps[$propName])) { + $deleteSettings[] = $propName; + continue; + } + if (!empty($propSchema->multilingual)) { + foreach ($sanitizedProps[$propName] as $localeKey => $localeValue) { + // Delete rows with a null value + if (is_null($localeValue)) { + $this->update("DELETE FROM site_settings WHERE setting_name = ? AND locale = ?",[ + $propName, + $localeKey, + ]); + } else { + $updateArray = [ + 'locale' => $localeKey, + 'setting_name' => $propName, + 'setting_value' => $this->convertToDB($localeValue, $schema->properties->{$propName}->type), + ]; + $result = $this->replace('site_settings', $updateArray, $keyColumns); + } + } + } else { + $updateArray = [ + 'locale' => '', + 'setting_name' => $propName, + 'setting_value' => $this->convertToDB($sanitizedProps[$propName], $schema->properties->{$propName}->type), + ]; + $this->replace('site_settings', $updateArray, $keyColumns); + } + } + if (count($deleteSettings)) { + $deleteSettingNames = join(',', array_map(function($settingName) { + return "'$settingName'"; + }, $deleteSettings)); + $this->update("DELETE FROM site_settings WHERE setting_name in ($deleteSettingNames)"); + } + } +} diff --git a/classes/site/SiteSettingsDAO.inc.php b/classes/site/SiteSettingsDAO.inc.php deleted file mode 100644 index 87af44b20fe..00000000000 --- a/classes/site/SiteSettingsDAO.inc.php +++ /dev/null @@ -1,244 +0,0 @@ -getFileCache( - 'siteSettings', 'site', - array($this, '_cacheMiss') - ); - } - return $settingCache; - } - - /** - * Retrieve a site setting value. - * @param $name string - * @param $locale string optional - * @return mixed - */ - function &getSetting($name, $locale = null) { - $cache = $this->_getCache(); - $returner = $cache->get($name); - if ($locale !== null) { - if (!isset($returner[$locale]) || !is_array($returner)) { - $returner = null; - return $returner; - } - return $returner[$locale]; - } - return $returner; - } - - function _cacheMiss($cache, $id) { - $settings = $this->getSiteSettings(); - if (!isset($settings[$id])) { - $cache->setCache($id, null); - return null; - } - return $settings[$id]; - } - - /** - * Retrieve and cache all settings for a site. - * @return array - */ - function &getSiteSettings() { - $siteSettings = array(); - - $result = $this->retrieve( - 'SELECT setting_name, setting_value, setting_type, locale FROM site_settings' - ); - - if ($result->RecordCount() == 0) { - $returner = null; - $result->Close(); - return $returner; - - } else { - while (!$result->EOF) { - $row = $result->getRowAssoc(false); - $value = $this->convertFromDB($row['setting_value'], $row['setting_type']); - if ($row['locale'] == '') $siteSettings[$row['setting_name']] = $value; - else $siteSettings[$row['setting_name']][$row['locale']] = $value; - $result->MoveNext(); - } - $result->Close(); - - $cache = $this->_getCache(); - $cache->setEntireCache($siteSettings); - - return $siteSettings; - } - } - - /** - * Add/update a site setting. - * @param $name string - * @param $value mixed - * @param $type string data type of the setting. If omitted, type will be guessed - * @param $isLocalized boolean - * @return boolean - */ - function updateSetting($name, $value, $type = null, $isLocalized = false) { - $returner = null; - $cache = $this->_getCache(); - $cache->setCache($name, $value); - - $keyFields = array('setting_name', 'locale'); - - if (!$isLocalized) { - $value = $this->convertToDB($value, $type); - $this->replace('site_settings', - array( - 'setting_name' => $name, - 'setting_value' => $value, - 'setting_type' => $type, - 'locale' => '' - ), - $keyFields - ); - $returner = true; - } else { - if (is_array($value)) foreach ($value as $locale => $localeValue) { - $this->update('DELETE FROM site_settings WHERE setting_name = ? AND locale = ?', array($name, $locale)); - if (empty($localeValue)) continue; - $type = null; - $returner = $this->update('INSERT INTO site_settings - (setting_name, setting_value, setting_type, locale) - VALUES (?, ?, ?, ?)', - array( - $name, $this->convertToDB($localeValue, $type), $type, $locale - ) - ); - } - } - return $returner; - } - - /** - * Delete a site setting. - * @param $name string - */ - function deleteSetting($name, $locale = null) { - $cache = $this->_getCache(); - $cache->setCache($name, null); - - $params = array($name); - $sql = 'DELETE FROM site_settings WHERE setting_name = ?'; - if ($locale !== null) { - $params[] = $locale; - $sql .= ' AND locale = ?'; - } - - return $this->update($sql, $params); - } - - /** - * Used internally by installSettings to perform variable and translation replacements. - * @param $rawInput string contains text including variable and/or translate replacements. - * @param $paramArray array contains variables for replacement - * @return string - */ - function _performReplacement($rawInput, $paramArray = array()) { - $value = preg_replace_callback('{{translate key="([^"]+)"}}', array($this, '_installer_regexp_callback'), $rawInput); - foreach ($paramArray as $pKey => $pValue) { - $value = str_replace('{$' . $pKey . '}', $pValue, $value); - } - return $value; - } - - /** - * Used internally by installSettings to recursively build nested arrays. - * Deals with translation and variable replacement calls. - * @param $node object XMLNode tag - * @param $paramArray array Parameters to be replaced in key/value contents - */ - function &_buildObject (&$node, $paramArray = array()) { - $value = array(); - foreach ($node->getChildren() as $element) { - $key = $element->getAttribute('key'); - $childArray =& $element->getChildByName('array'); - if (isset($childArray)) { - $content = $this->_buildObject($childArray, $paramArray); - } else { - $content = $this->_performReplacement($element->getValue(), $paramArray); - } - if (!empty($key)) { - $key = $this->_performReplacement($key, $paramArray); - $value[$key] = $content; - } else $value[] = $content; - } - return $value; - } - - /** - * Install site settings from an XML file. - * @param $filename string Name of XML file to parse and install - * @param $paramArray array Optional parameters for variable replacement in settings - */ - function installSettings($filename, $paramArray = array()) { - $xmlParser = new XMLParser(); - $tree = $xmlParser->parse($filename); - - if (!$tree) { - $xmlParser->destroy(); - return false; - } - - foreach ($tree->getChildren() as $setting) { - $nameNode =& $setting->getChildByName('name'); - $valueNode =& $setting->getChildByName('value'); - - if (isset($nameNode) && isset($valueNode)) { - $type = $setting->getAttribute('type'); - $isLocaleField = $setting->getAttribute('locale'); - $name =& $nameNode->getValue(); - - if ($type == 'object') { - $arrayNode =& $valueNode->getChildByName('array'); - $value = $this->_buildObject($arrayNode, $paramArray); - } else { - $value = $this->_performReplacement($valueNode->getValue(), $paramArray); - } - - // Replace translate calls with translated content - $this->updateSetting( - $name, - $isLocaleField?array(AppLocale::getLocale() => $value):$value, - $type, - $isLocaleField - ); - } - } - - $xmlParser->destroy(); - - } - - /** - * Used internally by site setting installation code to perform translation function. - */ - function _installer_regexp_callback($matches) { - return __($matches[1]); - } -} - - diff --git a/classes/submission/PKPSubmissionMetadataFormImplementation.inc.php b/classes/submission/PKPSubmissionMetadataFormImplementation.inc.php index cc143ca3d64..05d3d877b80 100644 --- a/classes/submission/PKPSubmissionMetadataFormImplementation.inc.php +++ b/classes/submission/PKPSubmissionMetadataFormImplementation.inc.php @@ -61,25 +61,27 @@ function() use ($submission) { $contextDao = Application::getContextDao(); $context = $contextDao->getById($submission->getContextId()); - import('lib.pkp.controllers.grid.settings.metadata.MetadataGridHandler'); - foreach (MetadataGridHandler::getNames() as $key => $name) { + $metadataFields = Application::getMetadataFields(); + foreach ($metadataFields as $field) { $requiredLocaleKey = 'submission.submit.form.'.$key.'Required'; - if ($context->getSetting($key . 'Required')) switch(1) { - case in_array($key, $this->getLocaleFieldNames()): - $this->_parentForm->addCheck(new FormValidatorLocale($this->_parentForm, $key, 'required', $requiredLocaleKey, $submission->getLocale())); - break; - case in_array($key, $this->getTagitFieldNames()): - $this->_parentForm->addCheck(new FormValidatorCustom($this->_parentForm, $key, 'required', $requiredLocaleKey, create_function('$key,$form,$name', '$data = $form->getData(\'keywords\'); return array_key_exists($name, $data);'), array($this->_parentForm, $submission->getLocale().'-'.$key))); - break; - case $key == 'citations': - $request = Application::getRequest(); - $user = $request->getUser(); - if ($user->hasRole(ROLE_ID_AUTHOR, $context->getId())) { - $this->_parentForm->addCheck(new FormValidator($this->_parentForm, $key, 'required', $requiredLocaleKey)); - } - break; - default: - $this->_parentForm->addCheck(new FormValidator($this->_parentForm, $key, 'required', $requiredLocaleKey)); + if ($context->getData($field) === METADATA_REQUIRE) { + switch(1) { + case in_array($field, $this->getLocaleFieldNames()): + $this->_parentForm->addCheck(new FormValidatorLocale($this->_parentForm, $field, 'required', $requiredLocaleKey, $submission->getLocale())); + break; + case in_array($field, $this->getTagitFieldNames()): + $this->_parentForm->addCheck(new FormValidatorCustom($this->_parentForm, $field, 'required', $requiredLocaleKey, create_function('$field,$form,$name', '$data = $form->getData(\'keywords\'); return array_key_exists($name, $data);'), array($this->_parentForm, $submission->getLocale().'-'.$field))); + break; + case $field == 'citations': + $request = Application::getRequest(); + $user = $request->getUser(); + if ($user->hasRole(ROLE_ID_AUTHOR, $context->getId())) { + $this->_parentForm->addCheck(new FormValidator($this->_parentForm, $field, 'required', $requiredLocaleKey)); + } + break; + default: + $this->_parentForm->addCheck(new FormValidator($this->_parentForm, $field, 'required', $requiredLocaleKey)); + } } } } @@ -174,7 +176,7 @@ function execute($submission, $request) { // Update submission locale $newLocale = $this->_parentForm->getData('locale'); $context = $request->getContext(); - $supportedSubmissionLocales = $context->getSetting('supportedSubmissionLocales'); + $supportedSubmissionLocales = $context->getData('supportedSubmissionLocales'); if (empty($supportedSubmissionLocales)) $supportedSubmissionLocales = array($context->getPrimaryLocale()); if (in_array($newLocale, $supportedSubmissionLocales)) $submission->setLocale($newLocale); @@ -229,5 +231,3 @@ function execute($submission, $request) { } } } - - diff --git a/classes/submission/action/EditorAction.inc.php b/classes/submission/action/EditorAction.inc.php index 1eff75708a1..5bb055ac666 100644 --- a/classes/submission/action/EditorAction.inc.php +++ b/classes/submission/action/EditorAction.inc.php @@ -213,11 +213,11 @@ function setDueDates($request, $submission, $reviewAssignment, $reviewDueDate, $ if ($reviewAssignment->getSubmissionId() == $submission->getId() && !HookRegistry::call('EditorAction::setDueDates', array(&$reviewAssignment, &$reviewer, &$reviewDueDate, &$responseDueDate))) { // Set the review due date - $defaultNumWeeks = $context->getSetting('numWeeksPerReview'); + $defaultNumWeeks = $context->getData('numWeeksPerReview'); $reviewAssignment->setDateDue($reviewDueDate); // Set the response due date - $defaultNumWeeks = $context->getSetting('numWeeksPerReponse'); + $defaultNumWeeks = $context->getData('numWeeksPerReponse'); $reviewAssignment->setDateResponseDue($responseDueDate); // update the assignment (with both the new dates) diff --git a/classes/submission/form/PKPSubmissionSubmitStep1Form.inc.php b/classes/submission/form/PKPSubmissionSubmitStep1Form.inc.php index 8c10902618f..a97d9c65045 100644 --- a/classes/submission/form/PKPSubmissionSubmitStep1Form.inc.php +++ b/classes/submission/form/PKPSubmissionSubmitStep1Form.inc.php @@ -28,13 +28,13 @@ function __construct($context, $submission = null) { $supportedSubmissionLocales = $context->getSupportedSubmissionLocales(); if (!is_array($supportedSubmissionLocales) || count($supportedSubmissionLocales) < 1) $supportedSubmissionLocales = array($context->getPrimaryLocale()); $this->addCheck(new FormValidatorInSet($this, 'locale', 'required', 'submission.submit.form.localeRequired', $supportedSubmissionLocales)); - if ((boolean) $context->getSetting('copyrightNoticeAgree')) { + if ((boolean) $context->getData('copyrightNotice')) { $this->addCheck(new FormValidator($this, 'copyrightNoticeAgree', 'required', 'submission.submit.copyrightNoticeAgreeRequired')); } $this->addCheck(new FormValidator($this, 'userGroupId', 'required', 'submission.submit.availableUserGroupsDescription')); $this->addCheck(new FormValidator($this, 'privacyConsent', 'required', 'user.profile.form.privacyConsentRequired')); - foreach ((array) $context->getLocalizedSetting('submissionChecklist') as $key => $checklistItem) { + foreach ((array) $context->getLocalizedData('submissionChecklist') as $key => $checklistItem) { $this->addCheck(new FormValidator($this, "checklist-$key", 'required', 'submission.submit.checklistErrors')); } } @@ -78,8 +78,8 @@ function fetch($request, $template = null, $display = false) { ); // if this context has a copyright notice that the author must agree to, present the form items. - if ((boolean) $this->context->getSetting('copyrightNoticeAgree')) { - $templateMgr->assign('copyrightNotice', $this->context->getLocalizedSetting('copyrightNotice')); + if ((boolean) $this->context->getData('copyrightNotice')) { + $templateMgr->assign('copyrightNotice', $this->context->getLocalizedData('copyrightNotice')); $templateMgr->assign('copyrightNoticeAgree', true); } @@ -179,7 +179,7 @@ function readInputData() { $vars = array( 'userGroupId', 'locale', 'copyrightNoticeAgree', 'commentsToEditor','privacyConsent' ); - foreach ((array) $this->context->getLocalizedSetting('submissionChecklist') as $key => $checklistItem) { + foreach ((array) $this->context->getLocalizedData('submissionChecklist') as $key => $checklistItem) { $vars[] = "checklist-$key"; } @@ -296,7 +296,7 @@ function execute() { $this->submission->stampStatusModified(); $this->submission->setSubmissionProgress($this->step + 1); $this->submission->setStageId(WORKFLOW_STAGE_ID_SUBMISSION); - $this->submission->setCopyrightNotice($this->context->getLocalizedSetting('copyrightNotice'), $this->getData('locale')); + $this->submission->setCopyrightNotice($this->context->getLocalizedData('copyrightNotice'), $this->getData('locale')); // Insert the submission $this->submissionId = $submissionDao->insertObject($this->submission); diff --git a/classes/submission/form/PKPSubmissionSubmitStep3Form.inc.php b/classes/submission/form/PKPSubmissionSubmitStep3Form.inc.php index d380fa7a186..0f6823c5ee1 100644 --- a/classes/submission/form/PKPSubmissionSubmitStep3Form.inc.php +++ b/classes/submission/form/PKPSubmissionSubmitStep3Form.inc.php @@ -15,9 +15,6 @@ import('lib.pkp.classes.submission.form.SubmissionSubmitForm'); -// This class contains a static method to describe metadata field settings -import('lib.pkp.controllers.grid.settings.metadata.MetadataGridHandler'); - class PKPSubmissionSubmitStep3Form extends SubmissionSubmitForm { /** @var SubmissionMetadataFormImplementation */ @@ -53,10 +50,11 @@ function fetch($request, $template = null, $display = false) { $context = $request->getContext(); // Tell the form what fields are enabled (and which of those are required) - foreach (array_keys(MetadataGridHandler::getNames()) as $field) { + $metadataFields = Application::getMetadataFields(); + foreach ($metadataFields as $field) { $templateMgr->assign(array( - $field . 'Enabled' => $context->getSetting($field . 'EnabledSubmission'), - $field . 'Required' => $context->getSetting($field . 'Required') + $field . 'Enabled' => $context->getData($field) === METADATA_REQUEST || $context->getData($field) === METADATA_REQUIRED, + $field . 'Required' => $context->getData($field) === METADATA_REQUIRED, )); } @@ -104,5 +102,3 @@ function execute() { return $this->submissionId; } } - - diff --git a/classes/submission/reviewer/ReviewerAction.inc.php b/classes/submission/reviewer/ReviewerAction.inc.php index 57b0509cf79..8306d3e026f 100644 --- a/classes/submission/reviewer/ReviewerAction.inc.php +++ b/classes/submission/reviewer/ReviewerAction.inc.php @@ -112,7 +112,7 @@ function getResponseEmail($submission, $reviewAssignment, $request, $decline) { } if (!$recipient) { $context = $request->getContext(); - $email->addRecipient($context->getSetting('contactEmail'), $context->getSetting('contactName')); + $email->addRecipient($context->getData('contactEmail'), $context->getData('contactName')); } // Get due date diff --git a/classes/submission/reviewer/form/ReviewerReviewStep1Form.inc.php b/classes/submission/reviewer/form/ReviewerReviewStep1Form.inc.php index 7e22c7a8036..f55fe58fdce 100644 --- a/classes/submission/reviewer/form/ReviewerReviewStep1Form.inc.php +++ b/classes/submission/reviewer/form/ReviewerReviewStep1Form.inc.php @@ -59,7 +59,7 @@ function fetch($request, $template = null, $display = false) { $templateMgr->assign(array( 'reviewAssignment' => $reviewAssignment, 'reviewRoundId' => $reviewAssignment->getReviewRoundId(), - 'restrictReviewerFileAccess' => $context->getSetting('restrictReviewerFileAccess'), + 'restrictReviewerFileAccess' => $context->getData('restrictReviewerFileAccess'), 'reviewMethod' => __($reviewAssignment->getReviewMethodKey()), )); @@ -78,7 +78,7 @@ function fetch($request, $template = null, $display = false) { $templateMgr->assign('viewMetadataAction', $viewMetadataLinkAction); // include the confirmation modal for competing interests if the context has them. - if ($context->getLocalizedSetting('competingInterests') != '') { + if ($context->getLocalizedData('competingInterests') != '') { import('lib.pkp.controllers.confirmationModal.linkAction.ViewCompetingInterestGuidelinesLinkAction'); $competingInterestsAction = new ViewCompetingInterestGuidelinesLinkAction($request); $templateMgr->assign('competingInterestsAction', $competingInterestsAction); diff --git a/classes/submission/reviewer/form/ReviewerReviewStep2Form.inc.php b/classes/submission/reviewer/form/ReviewerReviewStep2Form.inc.php index 5d99dcd758b..b94431b510c 100644 --- a/classes/submission/reviewer/form/ReviewerReviewStep2Form.inc.php +++ b/classes/submission/reviewer/form/ReviewerReviewStep2Form.inc.php @@ -36,7 +36,7 @@ function fetch($request, $template = null, $display = false) { $context = $this->request->getContext(); $reviewAssignment = $this->getReviewAssignment(); - $reviewerGuidelines = $context->getLocalizedSetting($reviewAssignment->getStageId()==WORKFLOW_STAGE_ID_INTERNAL_REVIEW?'internalReviewGuidelines':'reviewGuidelines'); + $reviewerGuidelines = $context->getLocalizedData($reviewAssignment->getStageId()==WORKFLOW_STAGE_ID_INTERNAL_REVIEW?'internalReviewGuidelines':'reviewGuidelines'); if (empty($reviewerGuidelines)) { $reviewerGuidelines = __('reviewer.submission.noGuidelines'); } diff --git a/classes/task/ReviewReminder.inc.php b/classes/task/ReviewReminder.inc.php index 1e56f02fbc8..446e9739a26 100644 --- a/classes/task/ReviewReminder.inc.php +++ b/classes/task/ReviewReminder.inc.php @@ -46,7 +46,7 @@ function sendReminder ($reviewAssignment, $submission, $context, $reminderType = import('lib.pkp.classes.mail.SubmissionMailTemplate'); $emailKey = $reminderType; - $reviewerAccessKeysEnabled = $context->getSetting('reviewerAccessKeysEnabled'); + $reviewerAccessKeysEnabled = $context->getData('reviewerAccessKeysEnabled'); switch (true) { case $reviewerAccessKeysEnabled && ($reminderType == REVIEW_REMIND_AUTO): $emailKey = 'REVIEW_REMIND_AUTO_ONECLICK'; @@ -61,7 +61,7 @@ function sendReminder ($reviewAssignment, $submission, $context, $reminderType = $email->addRecipient($reviewer->getEmail(), $reviewer->getFullName()); $email->setSubject($email->getSubject($context->getPrimaryLocale())); $email->setBody($email->getBody($context->getPrimaryLocale())); - $email->setFrom($context->getSetting('contactEmail'), $context->getSetting('contactName')); + $email->setFrom($context->getData('contactEmail'), $context->getData('contactName')); $reviewUrlArgs = array('submissionId' => $reviewAssignment->getSubmissionId()); if ($reviewerAccessKeysEnabled) { @@ -69,7 +69,7 @@ function sendReminder ($reviewAssignment, $submission, $context, $reminderType = $accessKeyManager = new AccessKeyManager(); // Key lifetime is the typical review period plus four weeks - $keyLifetime = ($context->getSetting('numWeeksPerReview') + 4) * 7; + $keyLifetime = ($context->getData('numWeeksPerReview') + 4) * 7; $accessKey = $accessKeyManager->createKey($context->getId(), $reviewer->getId(), $reviewId, $keyLifetime); $reviewUrlArgs = array_merge($reviewUrlArgs, array('reviewId' => $reviewId, 'key' => $accessKey)); } @@ -104,7 +104,7 @@ function sendReminder ($reviewAssignment, $submission, $context, $reminderType = 'reviewerUserName' => $reviewer->getUsername(), 'reviewDueDate' => $reviewDueDate, 'responseDueDate' => $responseDueDate, - 'editorialContactSignature' => $context->getSetting('contactName') . "\n" . $context->getLocalizedName(), + 'editorialContactSignature' => $context->getData('contactName') . "\n" . $context->getLocalizedName(), 'passwordResetUrl' => $dispatcher->url($request, ROUTE_PAGE, $context->getPath(), 'login', 'resetPassword', $reviewer->getUsername(), array('confirm' => Validation::generatePasswordResetHash($reviewer->getId()))), 'submissionReviewUrl' => $submissionReviewUrl, 'messageToReviewer' => __('reviewer.step1.requestBoilerplate'), @@ -153,8 +153,8 @@ function executeActions() { unset($context); $context = $contextDao->getById($submission->getContextId()); - $inviteReminderDays = $context->getSetting('numDaysBeforeInviteReminder'); - $submitReminderDays = $context->getSetting('numDaysBeforeSubmitReminder'); + $inviteReminderDays = $context->getData('numDaysBeforeInviteReminder'); + $submitReminderDays = $context->getData('numDaysBeforeSubmitReminder'); } $reminderType = false; diff --git a/classes/template/PKPTemplateManager.inc.php b/classes/template/PKPTemplateManager.inc.php index 334b284b46e..3929e2d804f 100644 --- a/classes/template/PKPTemplateManager.inc.php +++ b/classes/template/PKPTemplateManager.inc.php @@ -206,6 +206,22 @@ function initialize($request) { 'contexts' => 'backend', ) ); + + // A user-uploaded stylesheet + if ($currentContext) { + $contextStyleSheet = $currentContext->getData('styleSheet'); + if ($contextStyleSheet) { + import('classes.file.PublicFileManager'); + $publicFileManager = new PublicFileManager(); + $this->addStyleSheet( + 'contextStylesheet', + $request->getBaseUrl() . '/' . $publicFileManager->getContextFilesPath($currentContext->getAssocType(), $currentContext->getId()) . '/' . $contextStyleSheet, + array( + 'priority' => STYLE_SEQUENCE_LATE + ) + ); + } + } } // Add reading language flag based on locale @@ -222,22 +238,6 @@ function initialize($request) { ); } - // Register colour picker assets on the appearance page - $this->addJavaScript( - 'spectrum', - $request->getBaseUrl() . '/lib/pkp/js/lib/jquery/plugins/spectrum/spectrum.js', - array( - 'contexts' => array('backend-management-settings', 'backend-admin-settings', 'backend-admin-contexts'), - ) - ); - $this->addStyleSheet( - 'spectrum', - $request->getBaseUrl() . '/lib/pkp/js/lib/jquery/plugins/spectrum/spectrum.css', - array( - 'contexts' => array('backend-management-settings', 'backend-admin-settings', 'backend-admin-contexts'), - ) - ); - // Register recaptcha on relevant pages if (Config::getVar('captcha', 'recaptcha') && Config::getVar('captcha', 'captcha_on_register')) { $this->addJavaScript( @@ -251,8 +251,8 @@ function initialize($request) { // Register meta tags if (Config::getVar('general', 'installed')) { - if (($request->getRequestedPage()=='' || $request->getRequestedPage() == 'index') && $currentContext && $currentContext->getLocalizedSetting('searchDescription')) { - $this->addHeader('searchDescription', ''); + if (($request->getRequestedPage()=='' || $request->getRequestedPage() == 'index') && $currentContext && $currentContext->getLocalizedData('searchDescription')) { + $this->addHeader('searchDescription', ''); } $this->addHeader( @@ -264,7 +264,7 @@ function initialize($request) { ); if ($currentContext) { - $customHeaders = $currentContext->getLocalizedSetting('customHeaders'); + $customHeaders = $currentContext->getLocalizedData('customHeaders'); if (!empty($customHeaders)) { $this->addHeader('customHeaders', $customHeaders); } @@ -373,12 +373,20 @@ function initialize($request) { $this->assign('multipleContexts', $multipleContexts); } - // Load enabled block plugins and setup active sidebar variables - PluginRegistry::loadCategory('blocks', true); - $sidebarHooks = HookRegistry::getHooks('Templates::Common::Sidebar'); - $this->assign(array( - 'hasSidebar' => !empty($sidebarHooks), - )); + if (Config::getVar('general', 'installed')) { + // Respond to the sidebar hook + if ($currentContext) { + $this->assign('hasSidebar', !empty($currentContext->getData('sidebar'))); + } else { + $this->assign('hasSidebar', !empty($request->getSite()->getData('sidebar'))); + } + HookRegistry::register('Templates::Common::Sidebar', array($this, 'displaySidebar')); + + // Clear the cache whenever the active theme is changed + HookRegistry::register('Context::edit', array($this, 'clearThemeTemplateCache')); + HookRegistry::register('Site::edit', array($this, 'clearThemeTemplateCache')); + } + } @@ -681,6 +689,7 @@ function registerJSLibraryData() { import('lib.pkp.classes.security.Role'); $app_data = array( + 'cdnEnabled' => Config::getVar('general', 'enable_cdn'), 'currentLocale' => AppLocale::getLocale(), 'primaryLocale' => AppLocale::getPrimaryLocale(), 'baseUrl' => $this->_request->getBaseUrl(), @@ -688,7 +697,10 @@ function registerJSLibraryData() { 'apiBasePath' => '/api/v1', 'pathInfoEnabled' => Config::getVar('general', 'disable_path_info') ? false : true, 'restfulUrlsEnabled' => Config::getVar('general', 'restful_urls') ? true : false, + 'tinyMceContentCSS' => $this->_request->getBaseUrl() . '/plugins/generic/tinymce/styles/content.css', + 'tinyMceContentFont' => Config::getVar('general', 'enable_cdn') ? $this->_request->getBaseUrl() . '/plugins/generic/tinymce/styles/content-font.css' : '', ); + $output .= '$.pkp.app = ' . json_encode($app_data) . ';'; // Load exposed constants @@ -799,7 +811,7 @@ function getCompileId($resourceName) { if ( Config::getVar('general', 'installed' ) ) { $context = $this->_request->getContext(); if (is_a($context, 'Context')) { - $resourceName .= $context->getSetting('themePluginPath'); + $resourceName .= $context->getData('themePluginPath'); } } @@ -862,6 +874,26 @@ public function clearCssCache() { array_map('unlink', glob(CacheManager::getFileCachePath() . DIRECTORY_SEPARATOR . '*.' . CSS_FILENAME_SUFFIX)); } + /** + * Clear the cache when a context or site has changed it's active theme + * + * @param $hookName string + * @param $args array [ + * @option Context|Site The new values + * @option Context|Site The old values + * @option array Key/value of params that were modified + * @option Request + * ] + */ + public function clearThemeTemplateCache($hookName, $args) { + $newContextOrSite = $args[0]; + $contextOrSite = $args[1]; + if ($newContextOrSite->getData('themePluginPath') !== $contextOrSite->getData('themePluginPath')) { + $this->clearTemplateCache(); + $this->clearCssCache(); + } + } + /** * Return an instance of the template manager. * @param $request PKPRequest @@ -900,6 +932,45 @@ function getFBV() { return $this->_fbv; } + /** + * Display the sidebar + * + * @param $hookName string + * @param $args array [ + * @option array Params passed to the hook + * @option Smarty + * @option string The output + * ] + */ + public function displaySidebar($hookName, $args) { + $params =& $args[0]; + $smarty =& $args[1]; + $output =& $args[2]; + + if ($this->_request->getContext()) { + $blocks = $this->_request->getContext()->getData('sidebar'); + } else { + $blocks = $this->_request->getSite()->getData('sidebar'); + } + + if (empty($blocks)) { + return false; + } + + $plugins = PluginRegistry::loadCategory('blocks', true); + if (empty($plugins)) { + return false; + } + + foreach ($blocks as $pluginName) { + if (!empty($plugins[$pluginName])) { + $output .= $plugins[$pluginName]->getContents($smarty, $this->_request); + } + } + + return false; + } + // // Custom template functions, modifiers, etc. @@ -960,7 +1031,7 @@ function smartyNullLinkAction($params, $smarty) { } /** - * Smarty usage: {help file="someFile.md" section="someSection" textKey="some.text.key"} + * Smarty usage: {help file="someFile" section="someSection" textKey="some.text.key"} * * Custom Smarty function for displaying a context-sensitive help link. * @param $smarty Smarty @@ -1716,5 +1787,3 @@ function smartyPluckFiles($params, $smarty) { $smarty->assign($params['assign'], $matching_files); } } - - diff --git a/classes/user/form/RegistrationForm.inc.php b/classes/user/form/RegistrationForm.inc.php index 91519d81f1c..fcf35877d2a 100644 --- a/classes/user/form/RegistrationForm.inc.php +++ b/classes/user/form/RegistrationForm.inc.php @@ -336,8 +336,8 @@ function _setMailFrom($request, $mail) { $context = $request->getContext(); // Set the sender based on the current context - if ($context && $context->getSetting('supportEmail')) { - $mail->setReplyTo($context->getSetting('supportEmail'), $context->getSetting('supportName')); + if ($context && $context->getData('supportEmail')) { + $mail->setReplyTo($context->getData('supportEmail'), $context->getData('supportName')); } else { $mail->setReplyTo($site->getLocalizedContactEmail(), $site->getLocalizedContactName()); } diff --git a/classes/user/form/UserFormHelper.inc.php b/classes/user/form/UserFormHelper.inc.php index cad952533dd..a9ed8f0f424 100644 --- a/classes/user/form/UserFormHelper.inc.php +++ b/classes/user/form/UserFormHelper.inc.php @@ -32,7 +32,7 @@ function assignRoleContent($templateMgr, $request) { $contexts = $contextDao->getAll(true)->toArray(); $contextsWithUserRegistration = array(); foreach ($contexts as $context) { - if (!$context->getSetting('disableUserReg')) { + if (!$context->getData('disableUserReg')) { $contextsWithUserRegistration[] = $context; } } @@ -45,7 +45,7 @@ function assignRoleContent($templateMgr, $request) { $authorUserGroups = $reviewerUserGroups = $readerUserGroups = array(); $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); foreach ($contexts as $context) { - if ($context->getSetting('disableUserReg')) continue; + if ($context->getData('disableUserReg')) continue; $reviewerUserGroups[$context->getId()] = $userGroupDao->getByRoleId($context->getId(), ROLE_ID_REVIEWER)->toArray(); $authorUserGroups[$context->getId()] = $userGroupDao->getByRoleId($context->getId(), ROLE_ID_AUTHOR)->toArray(); $readerUserGroups[$context->getId()] = $userGroupDao->getByRoleId($context->getId(), ROLE_ID_READER)->toArray(); @@ -67,7 +67,7 @@ function saveRoleContent($form, $user) { $contextDao = Application::getContextDAO(); $contexts = $contextDao->getAll(true); while ($context = $contexts->next()) { - if ($context->getSetting('disableUserReg')) continue; + if ($context->getData('disableUserReg')) continue; foreach (array( array( diff --git a/classes/validation/Validator.inc.php b/classes/validation/Validator.inc.php index db72a4e4c34..33f2087cbf3 100644 --- a/classes/validation/Validator.inc.php +++ b/classes/validation/Validator.inc.php @@ -21,12 +21,6 @@ */ class Validator { - /** - * Constructor. - */ - function __construct() { - } - /** * Check whether the given value is valid. * @param $value mixed the value to be checked diff --git a/classes/validation/ValidatorDate.inc.php b/classes/validation/ValidatorDate.inc.php deleted file mode 100644 index ce4e1a0697f..00000000000 --- a/classes/validation/ValidatorDate.inc.php +++ /dev/null @@ -1,87 +0,0 @@ -getMatches(); - if (isset($dateMatches['month'])) { - if (($dateMatches['month'] >= 1 && $dateMatches['month'] <= 12) || $maxScope == VALIDATOR_DATE_SCOPE_YEAR ) { - if (isset($dateMatches['day'])) { - return (checkdate($dateMatches['month'], $dateMatches['day'], $dateMatches['year']) && $maxScope == VALIDATOR_DATE_SCOPE_DAY); - } else { - return $maxScope < VALIDATOR_DATE_SCOPE_YEAR && $minScope > VALIDATOR_DATE_SCOPE_DAY; - } - } else { - return false; - } - } else { - return ($minScope == VALIDATOR_DATE_SCOPE_YEAR); - } - } - - - // - // Public static methods - // - /** - * Return the regex for a date check. This can be called - * statically. - * @param $dateFormat integer one of the DATE_FORMAT_* ids. - * @return string - */ - function getRegexp($dateFormat = DATE_FORMAT_ISO) { - switch ($dateFormat) { - case DATE_FORMAT_ISO: - return '/(?P\d{4})(?:-(?P\d{2})(?:-(?P\d{2}))?)?/'; - break; - - default: - // FIXME: Additional date formats can be - // added to the case list as required. - assert(false); - } - } -} - diff --git a/classes/validation/ValidatorEmail.inc.php b/classes/validation/ValidatorEmail.inc.php index 224b29181a7..c1170526e7c 100644 --- a/classes/validation/ValidatorEmail.inc.php +++ b/classes/validation/ValidatorEmail.inc.php @@ -14,27 +14,19 @@ * @brief Validation check for email addresses. */ -import('lib.pkp.classes.validation.ValidatorRegExp'); +import('lib.pkp.classes.validation.Validator'); +import('lib.pkp.classes.validation.ValidatorFactory'); -class ValidatorEmail extends ValidatorRegExp { +class ValidatorEmail extends Validator { /** - * Constructor. + * @copydoc Validator::isValid() */ - function __construct() { - parent::__construct(ValidatorEmail::getRegexp()); - } - + function isValid($value) { + $validator = \ValidatorFactory::make( + ['value' => $value], + ['value' => 'email_or_localhost'] + ); - // - // Public static methods - // - /** - * Return the regex for an email check. - * @return string - */ - static function getRegexp() { - return '/^' . PCRE_EMAIL_ADDRESS . '$/i'; + return $validator->passes(); } } - - diff --git a/classes/validation/ValidatorFactory.inc.php b/classes/validation/ValidatorFactory.inc.php new file mode 100644 index 00000000000..06623780719 --- /dev/null +++ b/classes/validation/ValidatorFactory.inc.php @@ -0,0 +1,373 @@ +extend('email_or_localhost', function($attribute, $value, $parameters, $validator) use ($validation) { + $emailValidator = $validation->make( + ['value' => $value], + ['value' => 'email'] + ); + if ($emailValidator->passes()) { + return true; + } + $regexValidator = $validation->make( + ['value' => $value], + ['value' => ['regex:/^[-a-zA-Z0-9!#\$%&\'\*\+\.\/=\?\^_\`\{\|\}~]*(@localhost)$/']] + ); + if ($regexValidator->passes()) { + return true; + } + + return false; + }); + + // Add custom validation rule for ISSNs + $validation->extend('issn', function($attribute, $value, $parameters, $validator) use ($validation) { + $regexValidator = $validation->make(['value' => $value], ['value' => 'regex:/^(\d{4})-(\d{3}[\dX])$/']); + if ($regexValidator->fails()) { + return false; + } + // ISSN check digit: http://www.loc.gov/issn/basics/basics-checkdigit.html + $numbers = str_replace('-', '', $value); + $check = 0; + for ($i = 0; $i < 7; $i++) { + $check += $numbers[$i] * (8 - $i); + } + $check = $check % 11; + switch ($check) { + case 0: + $check = '0'; + break; + case 1: + $check = 'X'; + break; + default: + $check = (string) (11 - $check); + } + + return ($numbers[7] === $check); + }); + + // Add custom validation rule for orcids + $validation->extend('orcid', function($attribute, $value, $parameters, $validator) use ($validation) { + $orcidRegexValidator = $validation->make( + ['value' => $value], + ['value' => 'regex:/^http[s]?:\/\/orcid.org\/(\d{4})-(\d{4})-(\d{4})-(\d{3}[0-9X])$/'] + ); + if ($orcidRegexValidator->fails()) { + return false; + } + // ISNI check digit: http://www.isni.org/content/faq#FAQ16 + $digits = preg_replace("/[^0-9X]/", "", $value); + + $total = 0; + for ($i = 0; $i < 15; $i++) { + $total = ($total + $digits[$i]) * 2; + } + + $remainder = $total % 11; + $result = (12 - $remainder) % 11; + + return ($digits[15] == ($result == 10 ? 'X' : $result)); + }); + + // Add custom validation rule for currency + $validation->extend('currency', function($attribute, $value, $parameters, $validator) { + $currencyDao = \DAORegistry::getDAO('CurrencyDAO'); + $allowedCurrencies = array_map( + function ($currency) { + return $currency->getCodeAlpha(); + }, + $currencyDao->getCurrencies() + ); + return in_array($value, $allowedCurrencies); + }); + + $validator = $validation->make($props, $rules, ValidatorFactory::getMessages($messages)); + + return $validator; + } + + /** + * Compile translated error messages for each of the validation rules + * we support. + * + * @param $messages array List of error messages to override the defaults. + * @return array + */ + static public function getMessages($messages = []) { + + static $defaultMessages = []; + + if (empty($defaultMessages)) { + $defaultMessages = [ + 'accepted' => __('validator.accepted'), + 'active_url' => __('validator.active_url'), + 'after' => __('validator.after'), + 'alpha' => __('validator.alpha'), + 'alpha_dash' => __('validator.alpha_dash'), + 'alpha_num' => __('validator.alpha_num'), + 'array' => __('validator.array'), + 'before' => __('validator.before'), + 'between' => [ + 'numeric' => __('validator.between.numeric'), + 'file' => __('validator.between.file'), + 'string' => __('validator.between.string'), + 'array' => __('validator.between.array'), + ], + 'boolean' => __('validator.boolean'), + 'confirmed' => __('validator.confirmed'), + 'currency' => __('validator.currency'), + 'date' => __('validator.date'), + 'date_format' => __('validator.date_format'), + 'different' => __('validator.different'), + 'digits' => __('validator.digits'), + 'digits_between' => __('validator.digits_between'), + 'email' => __('validator.email'), + 'email_or_localhost' => __('validator.email'), + 'exists' => __('validator.exists'), + 'filled' => __('validator.filled'), + 'image' => __('validator.image'), + 'in' => __('validator.in'), + 'integer' => __('validator.integer'), + 'ip' => __('validator.ip'), + 'issn' => __('validator.issn'), + 'json' => __('validator.json'), + 'max' => [ + 'numeric' => __('validator.max.numeric'), + 'file' => __('validator.max.file'), + 'string' => __('validator.max.string'), + 'array' => __('validator.max.array'), + ], + 'mimes' => __('validator.mimes'), + 'min' => [ + 'numeric' => __('validator.min.numeric'), + 'file' => __('validator.min.file'), + 'string' => __('validator.min.string'), + 'array' => __('validator.min.array'), + ], + 'not_in' => __('validator.not_in'), + 'numeric' => __('validator.numeric'), + 'present' => __('validator.present'), + 'regex' => __('validator.regex'), + 'required' => __('validator.required'), + 'required_if' => __('validator.required_if'), + 'required_unless' => __('validator.required_unless'), + 'required_with' => __('validator.required_with'), + 'required_with_all' => __('validator.required_with_all'), + 'required_without' => __('validator.required_without'), + 'required_without_all' => __('validator.required_without_all'), + 'same' => __('validator.same'), + 'size' => [ + 'numeric' => __('validator.size.numeric'), + 'file' => __('validator.size.file'), + 'string' => __('validator.size.string'), + 'array' => __('validator.size.array'), + ], + 'string' => __('validator.string'), + 'timezone' => __('validator.timezone'), + 'unique' => __('validator.unique'), + 'url' => __('validator.url'), + ]; + } + + $messages = array_merge($defaultMessages, $messages); + + // Convert variables in translated strings from {$variable} syntax to + // Laravel's :variable syntax. + foreach ($messages as $rule => $message) { + if (is_string($message)) { + $messages[$rule] = self::convertMessageSyntax($message); + } else { + foreach ($message as $subRule => $subMessage) { + $messages[$rule][$subRule] = self::convertMessageSyntax($subMessage); + } + } + } + + return $messages; + } + + /** + * Convert variables in translated strings from {$variable} syntax to + * Laravel's :variable syntax + * + * @param $message string + * @return string + */ + static public function convertMessageSyntax($message) { + return preg_replace('/\{\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\}/', ':\1', $message); + } + + /** + * A wrapper method that calls $validator->after to check if required props + * are present + * + * @param $validator Illuminate\Validation\Validator + * @param $requiredProps array List of prop names + * @param $multilingualProps array List of prop names + * @param $primaryLocale string Primary locale code + */ + static public function required($validator, $requiredProps, $multilingualProps, $primaryLocale) { + $validator->after(function($validator) use ($requiredProps, $multilingualProps, $primaryLocale) { + $props = $validator->getData(); + foreach ($requiredProps as $requiredProp) { + if (empty($props[$requiredProp])) { + $errorKey = $requiredProp; + if (in_array($requiredProp, $multilingualProps)) { + $errorKey .= '.' . $primaryLocale; + } + $validator->errors()->add($errorKey, __('form.missingRequired')); + } + } + }); + } + + /** + * A wrapper method that calls $validator->after to check for data from + * locales that are not allowed + * + * @param $validator Illuminate\Validation\Validator + * @param $multilingualProps array List of prop names + * @param $allowedLocales array List of locale codes + */ + static public function allowedLocales($validator, $multilingualProps, $allowedLocales) { + $validator->after(function($validator) use ($multilingualProps, $allowedLocales) { + $props = $validator->getData(); + foreach ($props as $propName => $propValue) { + if (!in_array($propName, $multilingualProps)) { + continue; + } + if (!is_array($propValue)) { + $validator->errors()->add($propName . '.' . current($allowedLocales), __('validator.localeExpected')); + break; + } + foreach ($propValue as $localeKey => $localeValue) { + if (!in_array($localeKey, $allowedLocales)) { + $validator->errors()->add($propName . '.' . $localeKey, __('validator.locale')); + break; + } + } + } + }); + } + + /** + * A wrapper method that calls $validator->after to check for props where a + * value for the primary locale can not be empty when the prop is passed + * + * This is not the same as a required field, which should use the `required` + * property in the JSON schema. This only checks that the primary locale + * value is not empty when a primary locale value has been provided. + * + * @param $validator Illuminate\Validation\Validator + * @param $requiredProps array List of prop names that should be validated + * against this method. + * @param $props array Key/value list of props + * @param $allowedLocales array List of locale codes + * @param $primaryLocale string Locale code (en_US) for the primary locale + */ + static public function requirePrimaryLocale($validator, $requiredProps, $props, $allowedLocales, $primaryLocale) { + $validator->after(function($validator) use ($requiredProps, $props, $allowedLocales, $primaryLocale) { + foreach ($requiredProps as $propName) { + if (isset($props[$propName]) && array_key_exists($primaryLocale, $props[$propName]) && empty($props[$propName][$primaryLocale])) { + if (count($allowedLocales) === 1) { + $validator->errors()->add($propName, __('form.missingRequired')); + } else { + $allLocales = AppLocale::getAllLocales(); + $primaryLocaleName = $primaryLocale; + foreach ($allLocales as $locale => $name) { + if ($locale === $primaryLocale) { + $primaryLocaleName = $name; + } + } + $validator->errors()->add($propName . '.' . $primaryLocale, __('form.requirePrimaryLocale', array('language' => $primaryLocaleName))); + } + } + } + }); + } + + /** + * A wrapper method that validates the temporaryFileId of new file uploads + * when an object is edited + * + * @param $validator Illuminate\Validation\Validator + * @param $uploadProps array List of prop names that may include a + * a temporaryFileId + * @param $multilingualUploadProps array List of $uploadProps which are + * multiligual + * @param $props array Key/value list of props + * @param $allowedLocales array List of locale codes + * @param $userId int The user ID which owns the temporary files + */ + static public function temporaryFilesExist($validator, $uploadProps, $multilingualUploadProps, $props, $allowedLocales, $userId) { + $validator->after(function($validator) use ($uploadProps, $multilingualUploadProps, $props, $allowedLocales, $userId) { + import('lib.pkp.classes.file.TemporaryFileManager'); + $temporaryFileManager = new TemporaryFileManager(); + foreach ($uploadProps as $uploadProp) { + if (!isset($props[$uploadProp])) { + continue; + } + if (in_array($uploadProp, $multilingualUploadProps)) { + foreach ($allowedLocales as $localeKey) { + if (!isset($props[$uploadProp][$localeKey]) + || !isset($props[$uploadProp][$localeKey]['temporaryFileId']) + || $validator->errors()->get($uploadProp . '.' . $localeKey)) { + continue; + } + if (!$temporaryFileManager->getFile($props[$uploadProp][$localeKey]['temporaryFileId'], $userId)) { + $validator->errors()->add($uploadProp . '.' . $localeKey, __('manager.setup.noTemporaryFile')); + } + } + } else { + if (!$temporaryFileManager->getFile($props[$uploadProp], $userId)) { + $validator->errors()->add($uploadProp, __('manager.setup.noTemporaryFile')); + } + } + } + }); + } +} diff --git a/classes/validation/ValidatorISNI.inc.php b/classes/validation/ValidatorISNI.inc.php deleted file mode 100644 index 23392d4aabb..00000000000 --- a/classes/validation/ValidatorISNI.inc.php +++ /dev/null @@ -1,66 +0,0 @@ -getMatches(); - $match = $matches[0]; - - $total = 0; - for ($i=0; $i<15; $i++) { - $total = ($total + $match[$i]) *2; - } - - $remainder = $total % 11; - $result = (12 - $remainder) % 11; - - return ($match[15] == ($result==10 ? 'X' : $result)); - } - - // - // Public static methods - // - /** - * Return the regex for an ISNI check. This can be called - * statically. - * @return string - */ - static function getRegexp() { - return '/^(\d{15}[0-9X])$/'; - } -} - - diff --git a/classes/validation/ValidatorISSN.inc.php b/classes/validation/ValidatorISSN.inc.php index 09d4dd00f4a..8046d90f784 100644 --- a/classes/validation/ValidatorISSN.inc.php +++ b/classes/validation/ValidatorISSN.inc.php @@ -14,60 +14,20 @@ * @brief Validation check for ISSNs. */ -import('lib.pkp.classes.validation.ValidatorRegExp'); +import('lib.pkp.classes.validation.Validator'); +import('lib.pkp.classes.validation.ValidatorFactory'); -class ValidatorISSN extends ValidatorRegExp { +class ValidatorISSN extends Validator { /** - * Constructor. - */ - function __construct() { - parent::__construct(self::getRegexp()); - } - - - // - // Implement abstract methods from Validator - // - /** - * @see Validator::isValid() - * @param $value mixed - * @return boolean + * @copydoc Validator::isValid() */ function isValid($value) { - if (!parent::isValid($value)) return false; + $validator = \ValidatorFactory::make( + ['value' => $value], + ['value' => 'issn'] + ); - // Test the check digit - $matches = $this->getMatches(); - $issn = $matches[1] . $matches[2]; - - $check = 0; - for ($i=0; $i<7; $i++) { - $check += $issn[$i] * (8-$i); - } - $check = $check % 11; - switch ($check) { - case 0: - $check = '0'; - break; - case 1: - $check = 'X'; - break; - default: - $check = (string) (11 - $check); - } - return ($issn[7] === $check); - } - - // - // Public static methods - // - /** - * Return the regex for an ISSN check. This can be called - * statically. - * @return string - */ - static function getRegexp() { - return '/^(\d{4})-(\d{3}[\dX])$/'; + return $validator->passes(); } } diff --git a/classes/validation/ValidatorORCID.inc.php b/classes/validation/ValidatorORCID.inc.php index b51c02f2890..66f514284b8 100644 --- a/classes/validation/ValidatorORCID.inc.php +++ b/classes/validation/ValidatorORCID.inc.php @@ -14,49 +14,20 @@ * @brief Validation check for ORCID iDs. */ -import('lib.pkp.classes.validation.ValidatorRegExp'); +import('lib.pkp.classes.validation.Validator'); +import('lib.pkp.classes.validation.ValidatorFactory'); -class ValidatorORCID extends ValidatorRegExp { +class ValidatorORCID extends Validator { /** - * Constructor. - */ - function __construct() { - parent::__construct(self::getRegexp()); - } - - - // - // Implement abstract methods from Validator - // - /** - * @see Validator::isValid() - * @param $value mixed - * @return boolean + * @copydoc Validator::isValid() */ function isValid($value) { - if (!parent::isValid($value)) return false; + $validator = \ValidatorFactory::make( + ['value' => $value], + ['value' => 'orcid'] + ); - // Test the check digit - // ORCID is an extension of ISNI - // http://support.orcid.org/knowledgebase/articles/116780-structure-of-the-orcid-identifier - $matches = $this->getMatches(); - $orcid = $matches[1] . $matches[2] . $matches[3] . $matches[4]; - - import('lib.pkp.classes.validation.ValidatorISNI'); - $validator = new ValidatorISNI(); - return $validator->isValid($orcid); - } - - // - // Public static methods - // - /** - * Return the regex for an ORCID check. This can be called - * statically. - * @return string - */ - static function getRegexp() { - return '/^http[s]?:\/\/orcid.org\/(\d{4})-(\d{4})-(\d{4})-(\d{3}[0-9X])$/'; + return $validator->passes(); } } diff --git a/classes/validation/ValidatorRegExp.inc.php b/classes/validation/ValidatorRegExp.inc.php index 690056b4944..c6c547c1ce7 100644 --- a/classes/validation/ValidatorRegExp.inc.php +++ b/classes/validation/ValidatorRegExp.inc.php @@ -14,45 +14,31 @@ */ import ('lib.pkp.classes.validation.Validator'); +import('lib.pkp.classes.validation.ValidatorFactory'); class ValidatorRegExp extends Validator { /** @var The regular expression to match against the field value */ var $_regExp; - /** @var The matches for further (optional) processing by subclasses */ - var $_matches; - /** * Constructor. * @param $regExp string the regular expression (PCRE form) */ function __construct($regExp) { - parent::__construct(); $this->_regExp = $regExp; } - // - // Implement abstract methods from Validator - // /** - * @see Validator::isValid() - * @param $value mixed - * @return boolean + * @copydoc Validator::isValid() */ function isValid($value) { - return (boolean)PKPString::regexp_match_get($this->_regExp, $value, $this->_matches); - } - + $validator = \ValidatorFactory::make( + ['value' => $value], + ['value' => ['regex:' . $this->_regExp]] + ); - // - // Protected methods for use by sub-classes - // - /** - * Returns the reg-ex matches (if any) after isValid() was called. - */ - function getMatches() { - return $this->_matches; + return $validator->passes(); } } diff --git a/classes/validation/ValidatorRequireString.inc.php b/classes/validation/ValidatorRequireString.inc.php new file mode 100644 index 00000000000..8d84e411230 --- /dev/null +++ b/classes/validation/ValidatorRequireString.inc.php @@ -0,0 +1,23 @@ +getMatches(); - - // Check IPv4 address validity - if (!empty($matches[4])) { - $parts = explode('.', $matches[4]); - foreach ($parts as $part) { - if ($part > 255) { - return false; - } - } - } - - return true; - } - - // - // Public static methods - // - /** - * Return the regex for an URI check. This can be called - * statically. - * @param $allowedSchemes Array of strings to restrict accepted schemes to defined set, or null for any - * @return string - */ - static function getRegexp($allowedSchemes = null) { - if (is_array($allowedSchemes)) { - $schemesRegEx = '(?:(' . implode('|', $allowedSchemes) . '):)'; - $regEx = $schemesRegEx . substr(PCRE_URI, 24); - } else { - $regEx = PCRE_URI; - } - return '&^' . $regEx . '$&i'; - } -} - diff --git a/classes/validation/ValidatorUrl.inc.php b/classes/validation/ValidatorUrl.inc.php index 61c199b658e..3c2f7de3ef1 100644 --- a/classes/validation/ValidatorUrl.inc.php +++ b/classes/validation/ValidatorUrl.inc.php @@ -14,39 +14,20 @@ * @brief Validation check for URLs. */ -import('lib.pkp.classes.validation.ValidatorUri'); +import ('lib.pkp.classes.validation.Validator'); +import('lib.pkp.classes.validation.ValidatorFactory'); -class ValidatorUrl extends ValidatorUri { +class ValidatorUrl extends Validator { /** - * Constructor. + * @copydoc Validator::isValid() */ - function __construct() { - parent::__construct(ValidatorUrl::_getAllowedSchemes()); - } + function isValid($value) { + $validator = \ValidatorFactory::make( + ['value' => $value], + ['value' => 'url'] + ); - // - // Public static methods - // - /** - * @see ValidatorUri::getRegexp() - * @param $allowedSchemes Array of strings to restrict accepted schemes to defined set, or null for any allowed - * @return string - */ - static function getRegexp($allowedSchemes = null) { - if ($allowedSchemes === null) $allowedSchemes = self::_getAllowedSchemes(); - else $allowedSchemes = array_intersect(self::_getAllowedSchemes(), $allowedSchemes); - return parent::getRegexp($allowedSchemes); - } - - // - // Private static methods - // - /** - * Return allowed schemes - * @return array - */ - static function _getAllowedSchemes() { - return array('http', 'https', 'ftp'); + return $validator->passes(); } } diff --git a/components/forms/Field.inc.php b/components/forms/Field.inc.php new file mode 100644 index 00000000000..7d88fd697d4 --- /dev/null +++ b/components/forms/Field.inc.php @@ -0,0 +1,165 @@ + 'Label', 'fr_CA' => 'Étiquette'] */ + public $label = ''; + + /** @var string Field description */ + public $description; + + /** @var string Field tooltip */ + public $tooltip; + + /** @var string Field help topic. Refers to the /dev/docs file name without .md */ + public $helpTopic; + + /** @var string Field help section. An optional anchor link to open to when loading the helpTopic. */ + public $helpSection; + + /** @var string Which group should this field be placed in? */ + public $groupId; + + /** @var boolean Is this field required? */ + public $isRequired = false; + + /** @var boolean Is this field multilingual? */ + public $isMultilingual = false; + + /** @var mixed The value of this field. If multilingual, expects a key/value array: ['en_US', => 'English value', 'fr_CA' => 'French value'] */ + public $value; + + /** @var mixed A default for this field when no value is specified. */ + public $default; + + /** @var array Key/value translations required for this field. Array will be merged with all i18n keys in the form. */ + public $i18n = []; + + /** + * Only show this field when the field named here is not empty. Match an exact + * value by passing an array: + * + * $this->showWhen = ['fieldName', 'expectedValue']; + * + * @var string|array + */ + public $showWhen; + + /** @var array List of required properties for this field. */ + private $_requiredProperties = array('name', 'component'); + + /** + * Initialize the form field + * + * @param $name string + * @param $args array [ + * @option label string|object + * @option groupId string + * @option isRequired boolean + * @option isMultilingual boolean + * ] + */ + public function __construct($name, $args = array()) { + $this->name = $name; + foreach ($args as $key => $value) { + if (property_exists($this, $key)) { + $this->{$key} = $value; + } + } + } + + /** + * Get a configuration object representing this field to be passed to the UI + * Library + * + * @return array + */ + public function getConfig() { + if (!$this->validate()) { + fatalError('Form field configuration did not pass validation: ' . print_r($this, true)); + } + $config = array( + 'name' => $this->name, + 'component' => $this->component, + 'label' => $this->label, + ); + if (isset($this->description)) { + $config['description'] = $this->description; + } + if (isset($this->tooltip)) { + $config['tooltip'] = $this->tooltip; + } + if (isset($this->helpTopic)) { + $config['helpTopic'] = $this->helpTopic; + if ($this->helpSection) { + $config['helpSection'] = $this->helpSection; + } + } + if (isset($this->groupId)) { + $config['groupId'] = $this->groupId; + } + if (isset($this->isRequired)) { + $config['isRequired'] = $this->isRequired; + } + if (isset($this->isMultilingual)) { + $config['isMultilingual'] = $this->isMultilingual; + } + if (isset($this->showWhen)) { + $config['showWhen'] = $this->showWhen; + } + if (isset($this->value)) { + $config['value'] = $this->value; + } elseif (isset($this->default)) { + $config['value'] = $this->default; + } + return $config; + } + + /** + * Validate the field configuration + * + * Check that no required fields are missing + * + * @return boolean + */ + public function validate() { + foreach ($this->_requiredProperties as $property) { + if (!isset($this->{$property})) { + return false; + } + } + return true; + } + + /** + * Get a default empty value for this field type + * + * The UI Library expects to receive a value property for each field. If it's + * a multilingual field, it expects the value property to contain keys for + * each locale in the form. + * + * This function will provide a default empty value so that a form can fill + * in the empty values automatically. + * + * @return mixed + */ + public function getEmptyValue() { + return ''; + } +} diff --git a/components/forms/FieldColor.inc.php b/components/forms/FieldColor.inc.php new file mode 100644 index 00000000000..188c57560ec --- /dev/null +++ b/components/forms/FieldColor.inc.php @@ -0,0 +1,18 @@ +disabledValue; + $config['enabledOnlyValue'] = $this->enabledOnlyValue; + $config['submissionOptions'] = $this->submissionOptions; + + return $config; + } +} diff --git a/components/forms/FieldOptions.inc.php b/components/forms/FieldOptions.inc.php new file mode 100644 index 00000000000..ac39dfc70e5 --- /dev/null +++ b/components/forms/FieldOptions.inc.php @@ -0,0 +1,45 @@ +isOrderable) { + $this->i18n = array_merge([ + 'orderUp' => __('common.orderUp'), + 'orderDown' => __('common.orderDown'), + ], $this->i18n); + } + $config = parent::getConfig(); + $config['type'] = $this->type; + $config['isOrderable'] = $this->isOrderable; + $config['options'] = $this->options; + + return $config; + } +} diff --git a/components/forms/FieldRadioInput.inc.php b/components/forms/FieldRadioInput.inc.php new file mode 100644 index 00000000000..33fd4e2d26a --- /dev/null +++ b/components/forms/FieldRadioInput.inc.php @@ -0,0 +1,32 @@ +options; + + return $config; + } +} diff --git a/components/forms/FieldRichTextarea.inc.php b/components/forms/FieldRichTextarea.inc.php new file mode 100644 index 00000000000..9ef50eae6d4 --- /dev/null +++ b/components/forms/FieldRichTextarea.inc.php @@ -0,0 +1,51 @@ +size)) { + $config['size'] = $this->size; + } + if (!empty($this->toolbar)) { + $config['toolbar'] = $this->toolbar; + } + if (!empty($this->plugins)) { + $config['plugins'] = $this->plugins; + } + if (!empty($this->init)) { + $config['init'] = $this->init; + } + + return $config; + } +} diff --git a/components/forms/FieldSelect.inc.php b/components/forms/FieldSelect.inc.php new file mode 100644 index 00000000000..1c1205b7625 --- /dev/null +++ b/components/forms/FieldSelect.inc.php @@ -0,0 +1,31 @@ +options; + + return $config; + } +} diff --git a/components/forms/FieldShowEnsuringLink.inc.php b/components/forms/FieldShowEnsuringLink.inc.php new file mode 100644 index 00000000000..de70600c6d0 --- /dev/null +++ b/components/forms/FieldShowEnsuringLink.inc.php @@ -0,0 +1,33 @@ + be? */ + public $inputType = 'text'; + + /** @var string Accepts: `small`, `regular` or `large` */ + public $size; + + /** @var string A prefix to display before the input value */ + public $prefix; + + /** + * @copydoc Field::getConfig() + */ + public function getConfig() { + $config = parent::getConfig(); + $config['inputType'] = $this->inputType; + if (isset($this->size)) { + $config['size'] = $this->size; + } + if (isset($this->prefix)) { + $config['prefix'] = $this->prefix; + } + + return $config; + } +} diff --git a/components/forms/FieldTextarea.inc.php b/components/forms/FieldTextarea.inc.php new file mode 100644 index 00000000000..cef1392d837 --- /dev/null +++ b/components/forms/FieldTextarea.inc.php @@ -0,0 +1,33 @@ +size)) { + $config['size'] = $this->size; + } + + return $config; + } +} diff --git a/components/forms/FieldUpload.inc.php b/components/forms/FieldUpload.inc.php new file mode 100644 index 00000000000..0ef291d2daf --- /dev/null +++ b/components/forms/FieldUpload.inc.php @@ -0,0 +1,70 @@ +/temporaryFiles. + */ + public $options = []; + + /** + * @copydoc Field::__construct() + */ + public function __construct($name, $args = []) { + parent::__construct($name, $args); + $this->i18n = array_merge([ + 'uploadFile' => __('common.upload.addFile'), + 'remove' => __('common.remove'), + 'restore' => __('common.upload.restore'), + 'dropzoneDictDefaultMessage' => __('form.dropzone.dictDefaultMessage'), + 'dropzoneDictFallbackMessage' => __('form.dropzone.dictFallbackMessage'), + 'dropzoneDictFallbackText' => __('form.dropzone.dictFallbackText'), + 'dropzoneDictFileTooBig' => __('form.dropzone.dictFileTooBig'), + 'dropzoneDictInvalidFileType' => __('form.dropzone.dictInvalidFileType'), + 'dropzoneDictResponseError' => __('form.dropzone.dictResponseError'), + 'dropzoneDictCancelUpload' => __('form.dropzone.dictCancelUpload'), + 'dropzoneDictUploadCanceled' => __('form.dropzone.dictUploadCanceled'), + 'dropzoneDictCancelUploadConfirmation' => __('form.dropzone.dictCancelUploadConfirmation'), + 'dropzoneDictRemoveFile' => __('form.dropzone.dictRemoveFile'), + 'dropzoneDictMaxFilesExceeded' => __('form.dropzone.dictMaxFilesExceeded'), + ], $this->i18n); + } + + /** + * :copydoc Field::validate() + */ + public function validate() { + if (empty($this->options['url'])) { + return false; + } + return parent::validate(); + } + + /** + * @copydoc Field::getConfig() + */ + public function getConfig() { + $config = parent::getConfig(); + $this->options['maxFilesize'] = Application::getIntMaxFileMBs(); + $config['options'] = $this->options; + + return $config; + } +} diff --git a/components/forms/FieldUploadImage.inc.php b/components/forms/FieldUploadImage.inc.php new file mode 100644 index 00000000000..d60adcaf76c --- /dev/null +++ b/components/forms/FieldUploadImage.inc.php @@ -0,0 +1,53 @@ +i18n = array_merge([ + 'thumbnailDescription' => __('common.upload.thumbnailPreview'), + 'altTextLabel' => __('common.altText'), + 'altTextDescription' => __('common.altTextInstructions'), + ], $this->i18n); + } + + /** + * @copydoc Field::getConfig() + */ + public function getConfig() { + if (!array_key_exists('acceptedFiles', $this->options)) { + $this->options['acceptedFiles'] = 'image/*'; + } + $config = parent::getConfig(); + $config['baseUrl'] = $this->baseUrl; + + return $config; + } + + /** + * @copydoc Field::getEmptyValue() + */ + public function getEmptyValue() { + return null; + } +} diff --git a/components/forms/FormComponent.inc.php b/components/forms/FormComponent.inc.php new file mode 100644 index 00000000000..3966b99191b --- /dev/null +++ b/components/forms/FormComponent.inc.php @@ -0,0 +1,328 @@ +id = $id; + $this->action = $action; + $this->method = $method; + $this->successMessage = $successMessage; + $this->locales = $locales; + $this->i18n = $i18n; + } + + /** + * Add a form field + * + * @param $field Field + * @param $position array [ + * @option string One of `before` or `after` + * @option string The field to position it before or after + * ] + * @return FormComponent + */ + public function addField($field, $position = []) { + if (empty($position)) { + $this->fields[] = $field; + } else { + $this->fields = $this->addToPosition($position[1], $this->fields, $field, $position[0]); + } + return $this; + } + + /** + * Remove a form field + * + * @param $fieldName string + * @return FormComponent + */ + public function removeField($fieldName) { + $this->fields = array_filter($this->fields, function($field) use ($fieldName) { + return $field->name !== $fieldName; + }); + return $this; + } + + /** + * Add a form group + * + * @param $args array [ + * @option id string Required A unique ID for this form group + * @option label string A label to identify this group of fields. Will become the fieldset's + * @option description string A description of this group of fields. + * ] + * @param $position array [ + * @option string One of `before` or `after` + * @option string The group to position it before or after + * ] + * @return FormComponent + */ + public function addGroup($args, $position = []) { + if (empty($args['id'])) { + fatalError('Tried to add a form group without an id.'); + } + if (empty($position)) { + $this->groups[] = $args; + } else { + $this->groups = $this->addToPosition($position[1], $this->groups, $args, $position[0]); + } + return $this; + } + + /** + * Remove a form group + * + * @param $groupId string + * @return FormComponent + */ + public function removeGroup($groupId) { + $this->groups = array_filter($this->groups, function($group) use ($groupId) { + return $group['id'] !== $groupId; + }); + $this->fields = array_filter($this->fields, function($field) use ($groupId) { + return $field['groupId'] !== $groupId; + }); + return $this; + } + + /** + * Add a form page + * + * @param $args array [ + * @option id string Required A unique ID for this form page + * @option label string The name of the page to identify it in the page list + * @option submitButton array Required Assoc array defining submission/next button params. Supports any param of the Button component in the UI Library. + * @option previousButton array Assoc array defining button params to go back to the previous page. Supports any param of the Button component in the UI Library. + * ] + * @param $position array [ + * @option string One of `before` or `after` + * @option string The page to position it before or after + * ] + * @return FormComponent + */ + public function addPage($args, $position = []) { + if (empty($args['id'])) { + fatalError('Tried to add a form page without an id.'); + } + if (empty($position)) { + $this->pages[] = $args; + } else { + $this->pages = $this->addToPosition($position[1], $this->pages, $args, $position[0]); + } + return $this; + } + + /** + * Remove a form page + * + * @param $pageId string + * @return FormComponent + */ + public function removePage($pageId) { + $this->pages = array_filter($this->pages, function($page) use ($pageId) { + return $page['id'] !== $pageId; + }); + foreach ($this->groups as $group) { + if ($group['pageId'] === $pageId) { + $this->removeGroup($group['id']); + } + } + return $this; + } + + /** + * Add an field, group or page to a specific position in its array + * + * @param $id string The id of the item to position before or after + * @param $list array The list of fields, groups or pages + * @param $item array The item to insert + * @param $position string `before` or `after` + * @return array + */ + public function addToPosition($id, $list, $item, $position) { + $index = count($list); + foreach ($list as $key => $val) { + if ((is_a($val, 'Field') && $id === $val->name) || (!is_a($val, 'Field') && $id === $val['id'])) { + $index = $key; + break; + } + } + if (!$index && $position === 'before') { + array_unshift($list, $item); + return $list; + } + + $slice = $position === 'before' ? $index : $index + 1; + + return array_merge( + array_slice($list, 0, $slice), + [$item], + array_slice($list, $slice) + ); + } + + /** + * Retrieve the configuration data to be used when initializing this + * handler on the frontend + * + * @return array Configuration data + */ + public function getConfig() { + + if (empty($this->id) || empty($this->method) || empty($this->action) || empty($this->successMessage) || empty($this->fields)) { + fatalError('FormComponent::getConfig() was called but one or more required property is missing: id, method, action, successMessage, fields.'); + } + + \HookRegistry::call('Form::config::before', $this); + + // Add a default page/group if none exist + if (!$this->groups) { + $this->addGroup(array('id' => 'default')); + $this->fields = array_map(function($field) { + $field->groupId = 'default'; + return $field; + }, $this->fields); + } + + if (!$this->pages) { + $this->addPage(array('id' => 'default', 'submitButton' => array('label' => __('common.save')))); + $this->groups = array_map(function($group) { + $group['pageId'] = 'default'; + return $group; + }, $this->groups); + } + + $fieldsConfig = array_map([$this, 'getFieldConfig'], $this->fields); + + $session = Application::getRequest()->getSession(); + $csrfToken = $session ? $session->getCSRFToken() : ''; + + $this->i18n = array_merge([ + 'saving' => __('common.saving'), + 'errors' => __('form.errors'), + 'errorOne' => __('form.errorOne'), + 'errorMany' => __('form.errorMany'), + 'errorGoTo' => __('form.errorGoTo'), + 'errorA11y' => __('form.errorA11y'), + 'errorUnknown' => __('form.errorUnknown'), + 'successMessage' => $this->successMessage, + 'required' => __('common.required'), + 'missingRequired' => __('validator.required'), + 'help' => __('common.help'), + 'multilingualLabel' => __('form.multilingualLabel'), + 'multilingualProgress' => __('form.multilingualProgress'), + ], $this->i18n); + + $config = array( + 'id' => $this->id, + 'method' => $this->method, + 'action' => $this->action, + 'fields' => $fieldsConfig, + 'groups' => $this->groups, + 'pages' => $this->pages, + 'primaryLocale' => AppLocale::getPrimaryLocale(), + 'visibleLocales' => [AppLocale::getLocale()], + 'supportedFormLocales' => $this->locales, + 'errors' => new stdClass(), + 'csrfToken' => $csrfToken, + 'i18n' => $this->i18n, + ); + + \HookRegistry::call('Form::config::after', array(&$config, $this)); + + return $config; + } + + /** + * Compile a configuration array for a single field + * + * @param $field Field + * @return array + */ + public function getFieldConfig($field) { + $config = $field->getConfig(); + + // Pass all field translations up to the form + if (!empty($field->i18n)) { + $this->i18n = array_merge($this->i18n, $field->i18n); + } + + // Add a value property if the field does not include one + if (!array_key_exists('value', $config)) { + $config['value'] = $field->isMultilingual ? array() : $field->getEmptyValue(); + } + if ($field->isMultilingual) { + foreach ($this->locales as $locale) { + if (!array_key_exists($locale['key'], $config['value'])) { + $config['value'][$locale['key']] = $field->getEmptyValue(); + } + } + } + + return $config; + } +} diff --git a/components/forms/context/PKPAnnouncementSettingsForm.inc.php b/components/forms/context/PKPAnnouncementSettingsForm.inc.php new file mode 100644 index 00000000000..78f0f36c108 --- /dev/null +++ b/components/forms/context/PKPAnnouncementSettingsForm.inc.php @@ -0,0 +1,60 @@ +action = $action; + $this->successMessage = __('manager.setup.announcements.success'); + $this->locales = $locales; + + $this->addField(new FieldOptions('enableAnnouncements', [ + 'label' => __('manager.setup.announcements'), + 'description' => __('manager.setup.enableAnnouncements.description'), + 'options' => [ + ['value' => true, 'label' => __('manager.setup.enableAnnouncements.enable')] + ], + 'value' => (bool) $context->getData('enableAnnouncements'), + ])) + ->addField(new FieldRichTextArea('announcementsIntroduction', [ + 'label' => __('manager.setup.announcementsIntroduction'), + 'tooltip' => __('manager.setup.announcementsIntroduction.description'), + 'isMultilingual' => true, + 'value' => $context->getData('announcementsIntroduction'), + 'showWhen' => 'enableAnnouncements', + ])) + ->addField(new FieldText('numAnnouncementsHomepage', [ + 'label' => __('manager.setup.numAnnouncementsHomepage'), + 'description' => __('manager.setup.numAnnouncementsHomepage.description'), + 'size' => 'small', + 'value' => $context->getData('numAnnouncementsHomepage'), + 'showWhen' => 'enableAnnouncements', + ])); + } +} diff --git a/components/forms/context/PKPAppearanceAdvancedForm.inc.php b/components/forms/context/PKPAppearanceAdvancedForm.inc.php new file mode 100644 index 00000000000..2f82e577ea1 --- /dev/null +++ b/components/forms/context/PKPAppearanceAdvancedForm.inc.php @@ -0,0 +1,64 @@ +action = $action; + $this->successMessage = __('manager.setup.appearance.success'); + $this->locales = $locales; + + $this->addField(new FieldUpload('styleSheet', [ + 'label' => __('manager.setup.useStyleSheet'), + 'value' => $context->getData('styleSheet'), + 'options' => [ + 'url' => $temporaryFileApiUrl, + 'acceptedFiles' => '.css', + ], + ])) + ->addField(new FieldUploadImage('favicon', [ + 'label' => __('manager.setup.favicon'), + 'value' => $context->getData('favicon'), + 'isMultilingual' => true, + 'baseUrl' => $baseUrl, + 'options' => [ + 'url' => $temporaryFileApiUrl, + 'acceptedFiles' => 'image/x-icon,image/png,image/gif', + ], + ])) + ->addField(new FieldRichTextarea('additionalHomeContent', [ + 'label' => __('manager.setup.additionalContent'), + 'description' => __('manager.setup.additionalContent.description'), + 'isMultilingual' => true, + 'value' => $context->getData('additionalHomeContent'), + ])); + } +} diff --git a/components/forms/context/PKPAppearanceSetupForm.inc.php b/components/forms/context/PKPAppearanceSetupForm.inc.php new file mode 100644 index 00000000000..1e2f9eb796a --- /dev/null +++ b/components/forms/context/PKPAppearanceSetupForm.inc.php @@ -0,0 +1,83 @@ +action = $action; + $this->successMessage = __('manager.setup.appearance.success'); + $this->locales = $locales; + + $sidebarOptions = []; + $plugins = PluginRegistry::loadCategory('blocks', true); + foreach ($plugins as $pluginName => $plugin) { + $sidebarOptions[] = [ + 'value' => $pluginName, + 'label' => $plugin->getDisplayName(), + ]; + } + + $this->addField(new FieldUploadImage('pageHeaderLogoImage', [ + 'label' => __('manager.setup.logo'), + 'value' => $context->getData('pageHeaderLogoImage'), + 'isMultilingual' => true, + 'baseUrl' => $baseUrl, + 'options' => [ + 'url' => $temporaryFileApiUrl, + ], + ])) + ->addField(new FieldUploadImage('homepageImage', [ + 'label' => __('manager.setup.homepageImage'), + 'tooltip' => __('manager.setup.homepageImage.description'), + 'value' => $context->getData('homepageImage'), + 'isMultilingual' => true, + 'baseUrl' => $baseUrl, + 'options' => [ + 'url' => $temporaryFileApiUrl, + ], + ])) + ->addField(new FieldRichTextarea('pageFooter', [ + 'label' => __('manager.setup.pageFooter'), + 'tooltip' => __('manager.setup.pageFooter.description'), + 'isMultilingual' => true, + 'value' => $context->getData('pageFooter'), + ])) + ->addField(new FieldOptions('sidebar', [ + 'label' => __('manager.setup.layout.sidebar'), + 'isOrderable' => true, + 'value' => (array) $context->getData('sidebar'), + 'options' => $sidebarOptions, + ])); + + } + +} diff --git a/components/forms/context/PKPAuthorGuidelinesForm.inc.php b/components/forms/context/PKPAuthorGuidelinesForm.inc.php new file mode 100644 index 00000000000..4dd29e3240e --- /dev/null +++ b/components/forms/context/PKPAuthorGuidelinesForm.inc.php @@ -0,0 +1,50 @@ +action = $action; + $this->successMessage = __('manager.setup.authorGuidelines.success'); + $this->locales = $locales; + + $this->addField(new FieldRichTextArea('authorGuidelines', [ + 'label' => __('manager.setup.authorGuidelines'), + 'description' => __('manager.setup.authorGuidelines.description'), + 'isMultilingual' => true, + 'value' => $context->getData('authorGuidelines'), + ])) + ->addField(new FieldRichTextArea('copyrightNotice', [ + 'label' => __('manager.setup.copyrightNotice'), + 'description' => __('manager.setup.copyrightNotice.description'), + 'isMultilingual' => true, + 'value' => $context->getData('copyrightNotice'), + ])); + } +} diff --git a/components/forms/context/PKPContactForm.inc.php b/components/forms/context/PKPContactForm.inc.php new file mode 100644 index 00000000000..2f00da979c5 --- /dev/null +++ b/components/forms/context/PKPContactForm.inc.php @@ -0,0 +1,95 @@ +action = $action; + $this->successMessage = __('manager.setup.contact.success'); + $this->locales = $locales; + + $this->addGroup([ + 'id' => 'principal', + 'label' => __('manager.setup.principalContact'), + 'description' => __('manager.setup.principalContactDescription'), + ]) + ->addField(new FieldText('contactName', [ + 'label' => __('common.name'), + 'isRequired' => true, + 'groupId' => 'principal', + 'value' => $context->getData('contactName'), + ])) + ->addField(new FieldText('contactEmail', [ + 'label' => __('user.email'), + 'isRequired' => true, + 'groupId' => 'principal', + 'value' => $context->getData('contactEmail'), + ])) + ->addField(new FieldText('contactPhone', [ + 'label' => __('user.phone'), + 'groupId' => 'principal', + 'value' => $context->getData('contactPhone'), + ])) + ->addField(new FieldText('contactAffiliation', [ + 'label' => __('user.affiliation'), + 'isMultilingual' => true, + 'groupId' => 'principal', + 'value' => $context->getData('contactAffiliation'), + ])) + ->addField(new FieldTextarea('mailingAddress', [ + 'label' => __('common.mailingAddress'), + 'isRequired' => true, + 'size' => 'small', + 'groupId' => 'principal', + 'value' => $context->getData('mailingAddress'), + ])) + ->addGroup([ + 'id' => 'technical', + 'label' => __('manager.setup.technicalSupportContact'), + 'description' => __('manager.setup.technicalSupportContactDescription'), + ]) + ->addField(new FieldText('supportName', [ + 'label' => __('common.name'), + 'isRequired' => true, + 'groupId' => 'technical', + 'value' => $context->getData('supportName'), + ])) + ->addField(new FieldText('supportEmail', [ + 'label' => __('user.email'), + 'isRequired' => true, + 'groupId' => 'technical', + 'value' => $context->getData('supportEmail'), + ])) + ->addField(new FieldText('supportPhone', [ + 'label' => __('user.phone'), + 'groupId' => 'technical', + 'value' => $context->getData('supportPhone'), + ])); + } +} diff --git a/components/forms/context/PKPContextForm.inc.php b/components/forms/context/PKPContextForm.inc.php new file mode 100644 index 00000000000..125768129f9 --- /dev/null +++ b/components/forms/context/PKPContextForm.inc.php @@ -0,0 +1,67 @@ +action = $action; + $this->successMessage = $successMessage; + $this->locales = $locales; + $this->method = $context ? 'PUT' : 'POST'; + + $this->addField(new FieldText('name', [ + 'label' => __('manager.setup.journalTitle'), + 'isRequired' => true, + 'isMultilingual' => true, + 'value' => $context ? $context->getData('name') : null, + ])) + ->addField(new FieldText('acronym', [ + 'label' => __('manager.setup.journalInitials'), + 'size' => 'small', + 'isRequired' => true, + 'isMultilingual' => true, + 'groupId' => 'identity', + 'value' => $context ? $context->getData('acronym') : null, + ])) + ->addField(new FieldRichTextarea('description', [ + 'label' => __('admin.journals.journalDescription'), + 'isMultilingual' => true, + 'value' => $context ? $context->getData('description') : null, + ])) + ->addField(new FieldText('path', [ + 'label' => __('context.path'), + 'isRequired' => true, + 'value' => $context ? $context->getData('path') : null, + 'prefix' => $baseUrl . '/', + 'size' => 'large', + ])); + } +} diff --git a/components/forms/context/PKPEmailSetupForm.inc.php b/components/forms/context/PKPEmailSetupForm.inc.php new file mode 100644 index 00000000000..88490632ba4 --- /dev/null +++ b/components/forms/context/PKPEmailSetupForm.inc.php @@ -0,0 +1,58 @@ +action = $action; + $this->successMessage = __('manager.publication.emailSetup.success'); + $this->locales = $locales; + + $canEnvelopeSender = Config::getVar('email', 'allow_envelope_sender'); + + $this->addField(new FieldRichTextarea('emailSignature', [ + 'label' => __('manager.setup.emailSignature'), + 'tooltip' => __('manager.setup.emailSignature.description'), + 'value' => $context->getData('emailSignature'), + ])); + + if ($canEnvelopeSender) { + $this->addField(new FieldText('envelopeSender', [ + 'label' => __('manager.setup.emailBounceAddress'), + 'tooltip' => __('manager.setup.emailBounceAddress.description'), + 'value' => $context->getData('envelopeSender'), + ])); + } else { + $this->addField(new FieldHTML('envelopeSender', [ + 'label' => __('manager.setup.emailBounceAddress'), + 'value' => __('manager.setup.emailBounceAddress.disabled'), + ])); + } + } +} diff --git a/components/forms/context/PKPInformationForm.inc.php b/components/forms/context/PKPInformationForm.inc.php new file mode 100644 index 00000000000..6b2b931f765 --- /dev/null +++ b/components/forms/context/PKPInformationForm.inc.php @@ -0,0 +1,62 @@ +action = $action; + $this->successMessage = __('manager.setup.information.success'); + $this->locales = $locales; + + $this->addGroup([ + 'id' => 'descriptions', + 'label' => __('manager.setup.information.descriptionTitle'), + 'description' => __('manager.setup.information.description'), + ]) + ->addField(new FieldRichTextarea('readerInformation', [ + 'label' => __('manager.setup.information.forReaders'), + 'isMultilingual' => true, + 'groupId' => 'descriptions', + 'value' => $context->getData('readerInformation'), + ])) + ->addField(new FieldRichTextarea('authorInformation', [ + 'label' => __('manager.setup.information.forAuthors'), + 'isMultilingual' => true, + 'groupId' => 'descriptions', + 'value' => $context->getData('authorInformation'), + ])) + ->addField(new FieldRichTextarea('librarianInformation', [ + 'label' => __('manager.setup.information.forLibrarians'), + 'isMultilingual' => true, + 'groupId' => 'descriptions', + 'value' => $context->getData('librarianInformation'), + ])); + } +} diff --git a/components/forms/context/PKPLicenseForm.inc.php b/components/forms/context/PKPLicenseForm.inc.php new file mode 100644 index 00000000000..4e95a91b694 --- /dev/null +++ b/components/forms/context/PKPLicenseForm.inc.php @@ -0,0 +1,93 @@ +action = $action; + $this->successMessage = __('manager.distribution.license.success'); + $this->locales = $locales; + + $licenseOptions = Application::getCCLicenseOptions(); + $licenseUrlOptions = []; + foreach ($licenseOptions as $url => $label) { + $licenseUrlOptions[] = [ + 'value' => $url, + 'label' => __($label), + ]; + } + $licenseUrlOptions[] = [ + 'value' => 'other', + 'label' => __('manager.distribution.license.other'), + 'isInput' => true, + ]; + + $copyrightHolder = $context->getData('copyrightHolderType'); + if (!empty($copyrightHolder) && !in_array($copyrightHolder, ['author', 'context'])) { + $copyrightHolder = $context->getData('copyrightHolderOther'); + } + + $this->addField(new FieldRadioInput('copyrightHolder', [ + 'label' => __('submission.copyrightHolder'), + 'helpTopic' => 'settings', + 'helpSection' => 'copyright-v-license', + 'type' => 'radio', + 'options' => [ + ['value' => 'author', 'label' => __('user.role.author')], + ['value' => 'context', 'label' => __('context.context')], + ['value' => 'other', 'isInput' => true], + ], + 'value' => $copyrightHolder, + ])) + ->addField(new FieldRadioInput('licenseUrl', [ + 'label' => __('manager.distribution.license'), + 'helpTopic' => 'settings', + 'helpSection' => 'copyright-v-license', + 'type' => 'radio', + 'options' => $licenseUrlOptions, + 'value' => $context->getData('licenseUrl'), + ])) + ->addField(new FieldOptions('copyrightYearBasis', [ + 'label' => __('submission.copyrightYear'), + 'description' => __('manager.distribution.copyrightYearBasis.description'), + 'type' => 'radio', + 'options' => [ + ['value' => 'issue', 'label' => __('manager.distribution.copyrightYearBasis.issue')], + ['value' => 'submission', 'label' => __('manager.distribution.copyrightYearBasis.submission')], + ], + 'value' => $context->getData('copyrightYearBasis'), + ])) + ->addField(new FieldRichTextArea('licenseTerms', [ + 'label' => __('manager.distribution.licenseTerms'), + 'tooltip' => __('manager.distribution.licenseTerms.description'), + 'isMultilingual' => true, + 'value' => $context->getData('licenseTerms'), + ])); + } +} diff --git a/components/forms/context/PKPListsForm.inc.php b/components/forms/context/PKPListsForm.inc.php new file mode 100644 index 00000000000..65983552d7a --- /dev/null +++ b/components/forms/context/PKPListsForm.inc.php @@ -0,0 +1,53 @@ +action = $action; + $this->successMessage = __('manager.setup.lists.success'); + $this->locales = $locales; + + $this->addField(new FieldText('itemsPerPage', [ + 'label' => __('common.itemsPerPage'), + 'description' => __('manager.setup.itemsPerPage.description'), + 'isRequired' => true, + 'value' => $context->getData('itemsPerPage'), + 'size' => 'small', + ])) + ->addField(new FieldText('numPageLinks', [ + 'label' => __('manager.setup.numPageLinks'), + 'description' => __('manager.setup.numPageLinks.description'), + 'isRequired' => true, + 'value' => $context->getData('numPageLinks'), + 'size' => 'small', + ])); + } +} diff --git a/components/forms/context/PKPMastheadForm.inc.php b/components/forms/context/PKPMastheadForm.inc.php new file mode 100644 index 00000000000..002fd822ad2 --- /dev/null +++ b/components/forms/context/PKPMastheadForm.inc.php @@ -0,0 +1,87 @@ +action = $action; + $this->successMessage = __('manager.setup.masthead.success'); + $this->locales = $locales; + + $this->addGroup([ + 'id' => 'identity', + 'label' => __('manager.setup.identity'), + ]) + ->addField(new FieldText('name', [ + 'label' => __('manager.setup.contextName'), + 'size' => 'large', + 'isRequired' => true, + 'isMultilingual' => true, + 'groupId' => 'identity', + 'value' => $context->getData('name'), + ])) + ->addField(new FieldText('acronym', [ + 'label' => __('manager.setup.journalInitials'), + 'size' => 'small', + 'isRequired' => true, + 'isMultilingual' => true, + 'groupId' => 'identity', + 'value' => $context->getData('acronym'), + ])) + ->addGroup([ + 'id' => 'keyInfo', + 'label' => __('manager.setup.keyInfo'), + 'description' => __('manager.setup.keyInfo.description'), + ]) + ->addField(new FieldRichTextarea('description', [ + 'label' => __('manager.setup.journalSummary'), + 'isMultilingual' => true, + 'groupId' => 'keyInfo', + 'value' => $context->getData('description'), + ])) + ->addField(new FieldRichTextarea('editorialTeam', [ + 'label' => __('manager.setup.editorialTeam'), + 'isMultilingual' => true, + 'groupId' => 'keyInfo', + 'value' => $context->getData('editorialTeam'), + ])) + ->addGroup([ + 'id' => 'about', + 'label' => __('common.description'), + 'description' => __('manager.setup.journalAbout.description'), + ]) + ->addField(new FieldRichTextarea('about', [ + 'label' => __('manager.setup.journalAbout'), + 'isMultilingual' => true, + 'size' => 'large', + 'groupId' => 'about', + 'value' => $context->getData('about'), + ])); + } +} diff --git a/components/forms/context/PKPMetadataSettingsForm.inc.php b/components/forms/context/PKPMetadataSettingsForm.inc.php new file mode 100644 index 00000000000..aa21812b1cb --- /dev/null +++ b/components/forms/context/PKPMetadataSettingsForm.inc.php @@ -0,0 +1,167 @@ +action = $action; + $this->successMessage = __('manager.setup.metadata.success'); + + $this->addField(new FieldMetadataSetting('coverage', [ + 'label' => __('manager.setup.metadata.coverage'), + 'description' => __('manager.setup.metadata.coverage.description'), + 'options' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.coverage.enable')] + ], + 'submissionOptions' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.coverage.noRequest')], + ['value' => METADATA_REQUEST, 'label' => __('manager.setup.metadata.coverage.request')], + ['value' => METADATA_REQUIRE, 'label' => __('manager.setup.metadata.coverage.require')], + ], + 'value' => $context->getData('coverage') ? $context->getData('coverage') : METADATA_DISABLE, + ])) + ->addField(new FieldMetadataSetting('languages', [ + 'label' => __('common.languages'), + 'description' => __('manager.setup.metadata.languages.description'), + 'options' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.languages.enable')] + ], + 'submissionOptions' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.languages.noRequest')], + ['value' => METADATA_REQUEST, 'label' => __('manager.setup.metadata.languages.request')], + ['value' => METADATA_REQUIRE, 'label' => __('manager.setup.metadata.languages.require')], + ], + 'value' => $context->getData('languages') ? $context->getData('languages') : METADATA_DISABLE, + ])) + ->addField(new FieldMetadataSetting('rights', [ + 'label' => __('submission.rights'), + 'description' => __('manager.setup.metadata.rights.description'), + 'options' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.rights.enable')] + ], + 'submissionOptions' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.rights.noRequest')], + ['value' => METADATA_REQUEST, 'label' => __('manager.setup.metadata.rights.request')], + ['value' => METADATA_REQUIRE, 'label' => __('manager.setup.metadata.rights.require')], + ], + 'value' => $context->getData('rights') ? $context->getData('rights') : METADATA_DISABLE, + ])) + ->addField(new FieldMetadataSetting('source', [ + 'label' => __('submission.source'), + 'description' => __('manager.setup.metadata.source.description'), + 'options' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.source.enable')] + ], + 'submissionOptions' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.source.noRequest')], + ['value' => METADATA_REQUEST, 'label' => __('manager.setup.metadata.source.request')], + ['value' => METADATA_REQUIRE, 'label' => __('manager.setup.metadata.source.require')], + ], + 'value' => $context->getData('source') ? $context->getData('source') : METADATA_DISABLE, + ])) + ->addField(new FieldMetadataSetting('subjects', [ + 'label' => __('common.subjects'), + 'description' => __('manager.setup.metadata.subjects.description'), + 'options' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.subjects.enable')] + ], + 'submissionOptions' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.subjects.noRequest')], + ['value' => METADATA_REQUEST, 'label' => __('manager.setup.metadata.subjects.request')], + ['value' => METADATA_REQUIRE, 'label' => __('manager.setup.metadata.subjects.require')], + ], + 'value' => $context->getData('subjects') ? $context->getData('subjects') : METADATA_DISABLE, + ])) + ->addField(new FieldMetadataSetting('type', [ + 'label' => __('common.type'), + 'description' => __('manager.setup.metadata.type.description'), + 'options' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.type.enable')] + ], + 'submissionOptions' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.type.noRequest')], + ['value' => METADATA_REQUEST, 'label' => __('manager.setup.metadata.type.request')], + ['value' => METADATA_REQUIRE, 'label' => __('manager.setup.metadata.type.require')], + ], + 'value' => $context->getData('type') ? $context->getData('type') : METADATA_DISABLE, + ])) + ->addField(new FieldMetadataSetting('disciplines', [ + 'label' => __('search.discipline'), + 'description' => __('manager.setup.metadata.disciplines.description'), + 'options' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.disciplines.enable')] + ], + 'submissionOptions' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.disciplines.noRequest')], + ['value' => METADATA_REQUEST, 'label' => __('manager.setup.metadata.disciplines.request')], + ['value' => METADATA_REQUIRE, 'label' => __('manager.setup.metadata.disciplines.require')], + ], + 'value' => $context->getData('disciplines') ? $context->getData('disciplines') : METADATA_DISABLE, + ])) + ->addField(new FieldMetadataSetting('keywords', [ + 'label' => __('common.keywords'), + 'description' => __('manager.setup.metadata.keywords.description'), + 'options' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.keywords.enable')] + ], + 'submissionOptions' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.keywords.noRequest')], + ['value' => METADATA_REQUEST, 'label' => __('manager.setup.metadata.keywords.request')], + ['value' => METADATA_REQUIRE, 'label' => __('manager.setup.metadata.keywords.require')], + ], + 'value' => $context->getData('keywords') ? $context->getData('keywords') : METADATA_DISABLE, + ])) + ->addField(new FieldMetadataSetting('agencies', [ + 'label' => __('submission.supportingAgencies'), + 'description' => __('manager.setup.metadata.agencies.description'), + 'options' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.agencies.enable')] + ], + 'submissionOptions' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.agencies.noRequest')], + ['value' => METADATA_REQUEST, 'label' => __('manager.setup.metadata.agencies.request')], + ['value' => METADATA_REQUIRE, 'label' => __('manager.setup.metadata.agencies.require')], + ], + 'value' => $context->getData('agencies') ? $context->getData('agencies') : METADATA_DISABLE, + ])) + ->addField(new FieldMetadataSetting('citations', [ + 'label' => __('submission.citations'), + 'description' => __('manager.setup.metadata.citations.description'), + 'options' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.citations.enable')] + ], + 'submissionOptions' => [ + ['value' => METADATA_ENABLE, 'label' => __('manager.setup.metadata.citations.noRequest')], + ['value' => METADATA_REQUEST, 'label' => __('manager.setup.metadata.citations.request')], + ['value' => METADATA_REQUIRE, 'label' => __('manager.setup.metadata.citations.require')], + ], + 'value' => $context->getData('citations') ? $context->getData('citations') : METADATA_DISABLE, + ])); + } +} diff --git a/components/forms/context/PKPPrivacyForm.inc.php b/components/forms/context/PKPPrivacyForm.inc.php new file mode 100644 index 00000000000..75cd6517282 --- /dev/null +++ b/components/forms/context/PKPPrivacyForm.inc.php @@ -0,0 +1,44 @@ +action = $action; + $this->successMessage = __('manager.setup.privacyStatement.success'); + $this->locales = $locales; + + $this->addField(new FieldRichTextArea('privacyStatement', [ + 'label' => __('manager.setup.privacyStatement'), + 'description' => __('manager.setup.privacyStatement.description'), + 'isMultilingual' => true, + 'value' => $context->getData('privacyStatement'), + ])); + } +} diff --git a/components/forms/context/PKPReviewGuidanceForm.inc.php b/components/forms/context/PKPReviewGuidanceForm.inc.php new file mode 100644 index 00000000000..4461d4551fe --- /dev/null +++ b/components/forms/context/PKPReviewGuidanceForm.inc.php @@ -0,0 +1,58 @@ +action = $action; + $this->successMessage = __('manager.publication.reviewerGuidance.success'); + $this->locales = $locales; + + $this->addField(new FieldRichTextArea('reviewerGuidelines', [ + 'label' => __('manager.setup.reviewGuidelines'), + 'helpTopic' => 'settings', + 'helpSection' => 'workflow-review-guidelines', + 'isMultilingual' => true, + 'value' => $context->getData('reviewerGuidelines'), + ])) + ->addField(new FieldRichTextArea('competingInterests', [ + 'label' => __('manager.setup.competingInterests'), + 'helpTopic' => 'settings', + 'helpSection' => 'workflow-review-interests', + 'isMultilingual' => true, + 'value' => $context->getData('competingInterests'), + ])) + ->addField(new FieldShowEnsuringLink('showEnsuringLink', [ + 'options' => [ + ['value' => true, 'label' => __('manager.setup.reviewOptions.showBlindReviewLink')], + ], + 'value' => $context->getData('showEnsuringLink'), + ])); + } +} diff --git a/components/forms/context/PKPReviewSetupForm.inc.php b/components/forms/context/PKPReviewSetupForm.inc.php new file mode 100644 index 00000000000..2d283df08ed --- /dev/null +++ b/components/forms/context/PKPReviewSetupForm.inc.php @@ -0,0 +1,105 @@ +action = $action; + $this->successMessage = __('manager.publication.reviewSetup.success'); + $this->locales = $locales; + + // Load SUBMISSION_REVIEW_METHOD_... constants + import('lib.pkp.classes.submission.reviewAssignment.ReviewAssignment'); + + $this->addField(new FieldOptions('defaultReviewMode', [ + 'label' => __('manager.setup.reviewOptions.reviewMode'), + 'helpTopic' => 'settings', + 'helpSection' => 'workflow-review-mode', + 'type' => 'radio', + 'value' => $context->getData('defaultReviewMode'), + 'options' => [ + ['value' => SUBMISSION_REVIEW_METHOD_DOUBLEBLIND, 'label' => __('editor.submissionReview.doubleBlind')], + ['value' => SUBMISSION_REVIEW_METHOD_BLIND, 'label' => __('editor.submissionReview.blind')], + ['value' => SUBMISSION_REVIEW_METHOD_OPEN, 'label' => __('editor.submissionReview.open')], + ], + ])) + ->addField(new FieldOptions('restrictReviewerFileAccess', [ + 'label' => __('manager.setup.reviewOptions.restrictReviewerFileAccess'), + 'helpTopic' => 'settings', + 'helpSection' => 'workflow-review-file-access', + 'type' => 'checkbox', + 'value' => $context->getData('restrictReviewerFileAccess'), + 'options' => [ + ['value' => true, 'label' => __('manager.setup.reviewOptions.restrictReviewerFileAccess.description')], + ] + ])) + ->addField(new FieldOptions('reviewerAccessKeysEnabled', [ + 'label' => __('manager.setup.reviewOptions.reviewerAccessKeysEnabled'), + 'description' => __('manager.setup.reviewOptions.reviewerAccessKeysEnabled.description'), + 'type' => 'checkbox', + 'value' => $context->getData('reviewerAccessKeysEnabled'), + 'options' => [ + ['value' => true, 'label' => __('manager.setup.reviewOptions.reviewerAccessKeysEnabled.label')], + ] + ])) + ->addField(new FieldText('numWeeksPerResponse', [ + 'label' => __('manager.setup.reviewOptions.defaultReviewResponseTime'), + 'description' => __('manager.setup.reviewOptions.numWeeksPerResponse'), + 'value' => $context->getData('numWeeksPerResponse'), + 'size' => 'small', + ])) + ->addField(new FieldText('numWeeksPerReview', [ + 'label' => __('manager.setup.reviewOptions.defaultReviewCompletionTime'), + 'description' => __('manager.setup.reviewOptions.numWeeksPerReview'), + 'value' => $context->getData('numWeeksPerReview'), + 'size' => 'small', + ])); + + if (Config::getVar('general', 'scheduled_tasks')) { + $this->addField(new FieldText('numDaysBeforeInviteReminder', [ + 'label' => __('manager.setup.reviewOptions.reminders.response'), + 'description' => __('manager.setup.reviewOptions.reminders.response.description'), + 'value' => $context->getData('numDaysBeforeInviteReminder'), + 'size' => 'small', + ])) + ->addField(new FieldText('numDaysBeforeSubmitReminder', [ + 'label' => __('manager.setup.reviewOptions.reminders.submit'), + 'description' => __('manager.setup.reviewOptions.reminders.submit.description'), + 'value' => $context->getData('numDaysBeforeSubmitReminder'), + 'size' => 'small', + ])); + } else { + $this->addField(new FieldHTML('reviewRemindersDisabled', [ + 'label' => __('manager.setup.reviewOptions.automatedReminders'), + 'value' => __('manager.setup.reviewOptions.automatedRemindersDisabled'), + ])); + } + } +} diff --git a/components/forms/context/PKPSearchIndexingForm.inc.php b/components/forms/context/PKPSearchIndexingForm.inc.php new file mode 100644 index 00000000000..334e8b54bb4 --- /dev/null +++ b/components/forms/context/PKPSearchIndexingForm.inc.php @@ -0,0 +1,59 @@ +action = $action; + $this->successMessage = __('manager.setup.searchEngineIndexing.success'); + $this->locales = $locales; + + $this->addGroup([ + 'id' => 'search', + 'label' => __('manager.setup.searchEngineIndexing'), + 'description' => __('manager.setup.searchEngineIndexing.description', ['sitemapUrl' => $sitemapUrl]), + ]) + ->addField(new FieldText('searchDescription', [ + 'label' => __('common.description'), + 'tooltip' => __('manager.setup.searchDescription.description'), + 'isMultilingual' => true, + 'value' => $context->getData('searchDescription'), + 'groupId' => 'search', + ])) + ->addField(new FieldTextArea('customHeaders', [ + 'label' => __('manager.distribution.customHeaders'), + 'tooltip' => __('manager.distribution.customHeaders.description'), + 'isMultilingual' => true, + 'value' => $context->getData('customHeaders'), + 'groupId' => 'search', + ])); + } +} diff --git a/components/forms/context/PKPThemeForm.inc.php b/components/forms/context/PKPThemeForm.inc.php new file mode 100644 index 00000000000..6ed122307ae --- /dev/null +++ b/components/forms/context/PKPThemeForm.inc.php @@ -0,0 +1,151 @@ + element in the UI. + * + * This form works similarly to other form components, except that it keeps a + * separate store of fields for each theme's options. Only the active theme's + * fields are loaded into $this->fields. The UI component chooses + * which fields to display as the theme selection is changed. + */ +import('lib.pkp.components.forms.FormComponent'); + +define('FORM_THEME', 'theme'); + +class PKPThemeForm extends FormComponent { + /** @copydoc FormComponent::$id */ + public $id = FORM_THEME; + + /** @copydoc FormComponent::$method */ + public $method = 'PUT'; + + /** @var array A key/value store of theme option fields, keyed by theme name */ + public $themeFields = []; + + /** + * Constructor + * + * @param $action string URL to submit the form to + * @param $locales array Supported locales + * @param $publicUrl string The URL to view the public site or context. + * @param $context Context|null Journal/Press to change settings for, or null + * to change settings for the Site + */ + public function __construct($action, $locales, $publicUrl, $context = null) { + $this->action = $action; + $this->successMessage = __('manager.setup.theme.success', ['url' => $publicUrl]); + $this->locales = $locales; + + if (!empty($context)) { + $activeTheme = $context->getData('themePluginPath'); + $contextId = $context->getId(); + } else { + $activeTheme = Application::getRequest()->getSite()->getData('themePluginPath'); + $contextId = CONTEXT_ID_NONE; + } + + $themes = $themeOptions = []; + $plugins = PluginRegistry::loadCategory('themes', true); + foreach ($plugins as $plugin) { + $themes[] = [ + 'value' => $plugin->getDirName(), + 'label' => $plugin->getDisplayName(), + ]; + } + + $this->addField(new FieldSelect('themePluginPath', [ + 'label' => __('manager.setup.theme'), + 'description' => __('manager.setup.theme.description'), + 'options' => $themes, + 'value' => $activeTheme, + ])); + + // Add theme options for each theme + foreach ($plugins as $plugin) { + // Re-run the init functions for each theme so that any theme options + // are set up. Because this is run after PluginRegistry::loadCategory(), + // the scripts and styles won't actually be registered against the + // template manager. However, if PluginRegistry::loadCategory() is called + // again for the themes category, it can cause scripts and styles to be + // overwritten by inactive themes. + $plugin->init(); + $themeOptions = $plugin->getOptionsConfig(); + if (empty($themeOptions)) { + continue; + } + $themeOptionValues = $plugin->getOptionValues($contextId); + foreach ($themeOptions as $optionName => $optionField) { + $optionField->value = isset($themeOptionValues[$optionName]) ? $themeOptionValues[$optionName] : null; + $this->addThemeField($plugin->getDirName(), $optionField); + } + } + } + + /** + * Add a form field that should only appear when a particular theme is + * selected + * + * @param $theme string The theme's base plugin path + * @param $field Field + * @param $position array [ + * @option string One of `before` or `after` + * @option string The field to position it before or after + * ] + * @return FormComponent + */ + public function addThemeField($theme, $field, $position = []) { + if (empty($position)) { + if (!isset($this->themeFields[$theme])) { + $this->themeFields[$theme] = []; + } + $this->themeFields[$theme][] = $field; + } else { + $this->themeFields[$theme] = $this->addToPosition($position[1], $this->themeFields[$theme], $field, $position[0]); + } + return $this; + } + + /** + * @copydoc FormComponent::getConfig() + */ + public function getConfig() { + // Add the active theme's option fields to the fields array + $activeThemeField = array_filter($this->fields, function($field) { + return $field->name === 'themePluginPath'; + }); + $activeTheme = $activeThemeField[0]->value; + if (!empty($this->themeFields[$activeTheme])) { + $this->fields = array_merge($this->fields, $this->themeFields[$activeTheme]); + } + + $config = parent::getConfig(); + + // Set up field config for non-active fields + if (!$this->groups) { + $this->addGroup(array('id' => 'default')); + $this->fields = array_map(function($field) { + $field->groupId = 'default'; + return $field; + }, $this->fields); + } + $defaultGroupId = $this->groups[0]['id']; + $config['themeFields'] = array_map(function($themeOptions) use ($defaultGroupId) { + return array_map(function($themeOption) use ($defaultGroupId) { + $field = $this->getFieldConfig($themeOption); + $field['groupId'] = $defaultGroupId; + return $field; + }, $themeOptions); + }, $this->themeFields); + + return $config; + } +} diff --git a/components/forms/context/PKPUserAccessForm.inc.php b/components/forms/context/PKPUserAccessForm.inc.php new file mode 100644 index 00000000000..a736321e37f --- /dev/null +++ b/components/forms/context/PKPUserAccessForm.inc.php @@ -0,0 +1,54 @@ +action = $action; + $this->successMessage = __('manager.setup.contact.success'); + + $this->addField(new FieldOptions('restrictSiteAccess', [ + 'label' => __('manager.setup.siteAccess.view'), + 'value' => (bool) $context->getData('restrictSiteAccess'), + 'options' => [ + ['value' => true, 'label' => __('manager.setup.restrictSiteAccess')], + ], + ])) + ->addField(new FieldOptions('disableUserReg', [ + 'type' => 'radio', + 'label' => __('manager.setup.userRegistration'), + 'value' => (bool) $context->getData('disableUserReg'), + 'options' => [ + ['value' => false, 'label' => __('manager.setup.enableUserRegistration')], + ['value' => true, 'label' => __('manager.setup.disableUserRegistration')], + ], + ])); + } +} diff --git a/controllers/list/ListHandler.inc.php b/components/listPanels/ListPanel.inc.php similarity index 77% rename from controllers/list/ListHandler.inc.php rename to components/listPanels/ListPanel.inc.php index e92e6a1eb5f..cb891a403fb 100644 --- a/controllers/list/ListHandler.inc.php +++ b/components/listPanels/ListPanel.inc.php @@ -1,18 +1,18 @@ __('submission.list.reviewComplete'), 'filter' => __('common.filter'), 'filterRemove' => __('common.filterRemove'), - 'itemOrdererUp' => __('submission.list.itemOrdererUp'), - 'itemOrdererDown' => __('submission.list.itemOrdererDown'), + 'orderUp' => __('common.orderUp'), + 'orderDown' => __('common.orderDown'), 'viewSubmission' => __('submission.list.viewSubmission'), 'reviewsCompleted' => __('submission.list.reviewsCompleted'), 'revisionsSubmitted' => __('submission.list.revisionsSubmitted'), @@ -194,7 +194,7 @@ public function getConfig() { } /** - * @copydoc ListHandler::getItems() + * @copydoc ListPanel::getItems() */ public function getItems() { $request = Application::getRequest(); @@ -217,7 +217,7 @@ public function getItems() { } /** - * @copydoc ListHandler::getItemsMax() + * @copydoc ListPanel::getItemsMax() */ public function getItemsMax() { $request = Application::getRequest(); @@ -230,7 +230,7 @@ public function getItemsMax() { } /** - * @copydoc ListHandler::_getItemsParams() + * @copydoc ListPanel::_getItemsParams() */ protected function _getItemsParams() { return array_merge( diff --git a/controllers/list/submissions/SelectSubmissionsListHandler.inc.php b/components/listPanels/submissions/SelectSubmissionsListPanel.inc.php similarity index 69% rename from controllers/list/submissions/SelectSubmissionsListHandler.inc.php rename to components/listPanels/submissions/SelectSubmissionsListPanel.inc.php index acbffb439b3..f51ffb594d8 100644 --- a/controllers/list/submissions/SelectSubmissionsListHandler.inc.php +++ b/components/listPanels/submissions/SelectSubmissionsListPanel.inc.php @@ -1,25 +1,25 @@ =5.3.2" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "^6.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Inflector\\": "lib/" + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -320,7 +320,7 @@ "singularize", "string" ], - "time": "2015-11-06T14:35:42+00:00" + "time": "2017-07-22T12:18:28+00:00" }, { "name": "ezyang/htmlpurifier", @@ -417,26 +417,27 @@ }, { "name": "illuminate/container", - "version": "v5.4.36", + "version": "v5.5.44", "source": { "type": "git", "url": "https://github.com/illuminate/container.git", - "reference": "c5b8a02a34a52c307f16922334c355c5eef725a6" + "reference": "7917f4c86ecf7f4d0efcfd83248ad3e301e08858" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/container/zipball/c5b8a02a34a52c307f16922334c355c5eef725a6", - "reference": "c5b8a02a34a52c307f16922334c355c5eef725a6", + "url": "https://api.github.com/repos/illuminate/container/zipball/7917f4c86ecf7f4d0efcfd83248ad3e301e08858", + "reference": "7917f4c86ecf7f4d0efcfd83248ad3e301e08858", "shasum": "" }, "require": { - "illuminate/contracts": "5.4.*", - "php": ">=5.6.4" + "illuminate/contracts": "5.5.*", + "php": ">=7.0", + "psr/container": "~1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "5.5-dev" } }, "autoload": { @@ -456,29 +457,31 @@ ], "description": "The Illuminate Container package.", "homepage": "https://laravel.com", - "time": "2017-05-24T14:15:53+00:00" + "time": "2018-01-19T17:58:33+00:00" }, { "name": "illuminate/contracts", - "version": "v5.4.36", + "version": "v5.5.44", "source": { "type": "git", "url": "https://github.com/illuminate/contracts.git", - "reference": "67f642e018f3e95fb0b2ebffc206c3200391b1ab" + "reference": "b2a62b4a85485fca9cf5fa61a933ad64006ff528" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/67f642e018f3e95fb0b2ebffc206c3200391b1ab", - "reference": "67f642e018f3e95fb0b2ebffc206c3200391b1ab", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/b2a62b4a85485fca9cf5fa61a933ad64006ff528", + "reference": "b2a62b4a85485fca9cf5fa61a933ad64006ff528", "shasum": "" }, "require": { - "php": ">=5.6.4" + "php": ">=7.0", + "psr/container": "~1.0", + "psr/simple-cache": "~1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "5.5-dev" } }, "autoload": { @@ -498,41 +501,40 @@ ], "description": "The Illuminate Contracts package.", "homepage": "https://laravel.com", - "time": "2017-08-26T23:56:53+00:00" + "time": "2018-03-20T15:34:35+00:00" }, { "name": "illuminate/database", - "version": "v5.4.36", + "version": "v5.5.41", "source": { "type": "git", "url": "https://github.com/illuminate/database.git", - "reference": "405aa061a5bc8588cbf3a78fba383541a568e3fe" + "reference": "e42c6c1267696901a2649151ec995f0feae25dd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/database/zipball/405aa061a5bc8588cbf3a78fba383541a568e3fe", - "reference": "405aa061a5bc8588cbf3a78fba383541a568e3fe", + "url": "https://api.github.com/repos/illuminate/database/zipball/e42c6c1267696901a2649151ec995f0feae25dd9", + "reference": "e42c6c1267696901a2649151ec995f0feae25dd9", "shasum": "" }, "require": { - "illuminate/container": "5.4.*", - "illuminate/contracts": "5.4.*", - "illuminate/support": "5.4.*", - "nesbot/carbon": "~1.20", - "php": ">=5.6.4" + "illuminate/container": "5.5.*", + "illuminate/contracts": "5.5.*", + "illuminate/support": "5.5.*", + "php": ">=7.0" }, "suggest": { "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", - "illuminate/console": "Required to use the database commands (5.4.*).", - "illuminate/events": "Required to use the observers with Eloquent (5.4.*).", - "illuminate/filesystem": "Required to use the migrations (5.4.*).", - "illuminate/pagination": "Required to paginate the result set (5.4.*)." + "illuminate/console": "Required to use the database commands (5.5.*).", + "illuminate/events": "Required to use the observers with Eloquent (5.5.*).", + "illuminate/filesystem": "Required to use the migrations (5.5.*).", + "illuminate/pagination": "Required to paginate the result set (5.5.*)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "5.5-dev" } }, "autoload": { @@ -558,41 +560,91 @@ "orm", "sql" ], - "time": "2017-08-24T12:07:53+00:00" + "time": "2018-08-01T13:48:15+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "v5.5.44", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "b8c0e36d47cfde3a0727bc6e2057775ff98a1bcd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/b8c0e36d47cfde3a0727bc6e2057775ff98a1bcd", + "reference": "b8c0e36d47cfde3a0727bc6e2057775ff98a1bcd", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.5.*", + "illuminate/support": "5.5.*", + "php": ">=7.0", + "symfony/finder": "~3.3" + }, + "suggest": { + "league/flysystem": "Required to use the Flysystem local and FTP drivers (~1.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", + "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.5-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "time": "2018-02-07T00:04:00+00:00" }, { "name": "illuminate/support", - "version": "v5.4.36", + "version": "v5.5.44", "source": { "type": "git", "url": "https://github.com/illuminate/support.git", - "reference": "feab1d1495fd6d38970bd6c83586ba2ace8f299a" + "reference": "5c405512d75dcaf5d37791badce02d86ed8e4bc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/feab1d1495fd6d38970bd6c83586ba2ace8f299a", - "reference": "feab1d1495fd6d38970bd6c83586ba2ace8f299a", + "url": "https://api.github.com/repos/illuminate/support/zipball/5c405512d75dcaf5d37791badce02d86ed8e4bc4", + "reference": "5c405512d75dcaf5d37791badce02d86ed8e4bc4", "shasum": "" }, "require": { "doctrine/inflector": "~1.1", "ext-mbstring": "*", - "illuminate/contracts": "5.4.*", - "paragonie/random_compat": "~1.4|~2.0", - "php": ">=5.6.4" + "illuminate/contracts": "5.5.*", + "nesbot/carbon": "^1.24.1", + "php": ">=7.0" }, "replace": { - "tightenco/collect": "self.version" + "tightenco/collect": "<5.5.33" }, "suggest": { - "illuminate/filesystem": "Required to use the composer class (5.2.*).", - "symfony/process": "Required to use the composer class (~3.2).", - "symfony/var-dumper": "Required to use the dd function (~3.2)." + "illuminate/filesystem": "Required to use the composer class (5.5.*).", + "symfony/process": "Required to use the composer class (~3.3).", + "symfony/var-dumper": "Required to use the dd function (~3.3)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "5.5-dev" } }, "autoload": { @@ -615,7 +667,102 @@ ], "description": "The Illuminate Support package.", "homepage": "https://laravel.com", - "time": "2017-08-15T13:25:41+00:00" + "time": "2018-08-10T19:40:01+00:00" + }, + { + "name": "illuminate/translation", + "version": "v5.5.44", + "source": { + "type": "git", + "url": "https://github.com/illuminate/translation.git", + "reference": "587734f44981cae0a7d98c89bfead040059b1636" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/translation/zipball/587734f44981cae0a7d98c89bfead040059b1636", + "reference": "587734f44981cae0a7d98c89bfead040059b1636", + "shasum": "" + }, + "require": { + "illuminate/contracts": "5.5.*", + "illuminate/filesystem": "5.5.*", + "illuminate/support": "5.5.*", + "php": ">=7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.5-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Translation package.", + "homepage": "https://laravel.com", + "time": "2017-11-22T19:01:14+00:00" + }, + { + "name": "illuminate/validation", + "version": "v5.5.41", + "source": { + "type": "git", + "url": "https://github.com/illuminate/validation.git", + "reference": "62e5baba068ea000ae207a5d1d08b97530bb8df9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/validation/zipball/62e5baba068ea000ae207a5d1d08b97530bb8df9", + "reference": "62e5baba068ea000ae207a5d1d08b97530bb8df9", + "shasum": "" + }, + "require": { + "illuminate/container": "5.5.*", + "illuminate/contracts": "5.5.*", + "illuminate/support": "5.5.*", + "illuminate/translation": "5.5.*", + "php": ">=7.0", + "symfony/http-foundation": "~3.3" + }, + "suggest": { + "illuminate/database": "Required to use the database presence verifier (5.5.*)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.5-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Validation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Validation package.", + "homepage": "https://laravel.com", + "time": "2018-05-21T14:15:38+00:00" }, { "name": "michelf/php-markdown", @@ -864,33 +1011,29 @@ }, { "name": "paragonie/random_compat", - "version": "v2.0.17", + "version": "v9.99.99", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d" + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/29af24f25bab834fcbb38ad2a69fa93b867e070d", - "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", "shasum": "" }, "require": { - "php": ">=5.2.0" + "php": "^7" }, "require-dev": { - "phpunit/phpunit": "4.*|5.*" + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" }, "suggest": { "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, "type": "library", - "autoload": { - "files": [ - "lib/random.php" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" @@ -909,7 +1052,7 @@ "pseudorandom", "random" ], - "time": "2018-07-04T16:31:37+00:00" + "time": "2018-07-02T15:55:56+00:00" }, { "name": "phpmailer/phpmailer", @@ -1126,6 +1269,54 @@ ], "time": "2016-08-06T14:39:51+00:00" }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-10-23T01:57:42+00:00" + }, { "name": "slim/slim", "version": "3.11.0", @@ -1250,6 +1441,109 @@ ], "time": "2018-09-12T20:54:16+00:00" }, + { + "name": "symfony/finder", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/54ba444dddc5bd5708a34bd095ea67c6eb54644d", + "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2018-10-03T08:46:40+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v3.4.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "3a4498236ade473c52b92d509303e5fd1b211ab1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3a4498236ade473c52b92d509303e5fd1b211ab1", + "reference": "3a4498236ade473c52b92d509303e5fd1b211ab1", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php70": "~1.6" + }, + "require-dev": { + "symfony/expression-language": "~2.8|~3.0|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2018-10-03T08:48:18+00:00" + }, { "name": "symfony/polyfill-mbstring", "version": "v1.9.0", @@ -1309,6 +1603,65 @@ ], "time": "2018-08-06T14:22:27+00:00" }, + { + "name": "symfony/polyfill-php70", + "version": "v1.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "1e24b0c4a56d55aaf368763a06c6d1c7d3194934" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/1e24b0c4a56d55aaf368763a06c6d1c7d3194934", + "reference": "1e24b0c4a56d55aaf368763a06c6d1c7d3194934", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2018-08-06T14:22:27+00:00" + }, { "name": "symfony/translation", "version": "v3.4.17", @@ -1379,16 +1732,16 @@ }, { "name": "tinymce/tinymce", - "version": "4.8.3", + "version": "4.8.4", "source": { "type": "git", "url": "https://github.com/tinymce/tinymce-dist.git", - "reference": "e6ad606b0da07cc7d1847f01d5d89b42920d5bc2" + "reference": "bf8376eb0006effc20c10202bbb8abbfe4cfd310" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tinymce/tinymce-dist/zipball/e6ad606b0da07cc7d1847f01d5d89b42920d5bc2", - "reference": "e6ad606b0da07cc7d1847f01d5d89b42920d5bc2", + "url": "https://api.github.com/repos/tinymce/tinymce-dist/zipball/bf8376eb0006effc20c10202bbb8abbfe4cfd310", + "reference": "bf8376eb0006effc20c10202bbb8abbfe4cfd310", "shasum": "" }, "type": "component", @@ -1421,7 +1774,7 @@ "tinymce", "wysiwyg" ], - "time": "2018-09-13T14:31:22+00:00" + "time": "2018-10-23T12:33:19+00:00" } ], "packages-dev": [ @@ -1535,29 +1888,35 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "3.3.2", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2" + "reference": "94fd0001232e47129dd3504189fa1c7225010d08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bf329f6c1aadea3299f08ee804682b7c45b326a2", - "reference": "bf329f6c1aadea3299f08ee804682b7c45b326a2", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0", + "php": "^7.0", "phpdocumentor/reflection-common": "^1.0.0", "phpdocumentor/type-resolver": "^0.4.0", "webmozart/assert": "^1.0" }, "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^4.4" + "doctrine/instantiator": "~1.0.5", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.4" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": [ @@ -1576,7 +1935,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-10T14:09:06+00:00" + "time": "2017-11-30T07:14:17+00:00" }, { "name": "phpdocumentor/type-resolver", diff --git a/controllers/confirmationModal/linkAction/ViewCompetingInterestGuidelinesLinkAction.inc.php b/controllers/confirmationModal/linkAction/ViewCompetingInterestGuidelinesLinkAction.inc.php index 0c1584da3f4..73d2b54acb6 100644 --- a/controllers/confirmationModal/linkAction/ViewCompetingInterestGuidelinesLinkAction.inc.php +++ b/controllers/confirmationModal/linkAction/ViewCompetingInterestGuidelinesLinkAction.inc.php @@ -26,7 +26,7 @@ function __construct($request) { // Instantiate the view competing interests modal. import('lib.pkp.classes.linkAction.request.ConfirmationModal'); $viewCompetingInterestsModal = new ConfirmationModal( - $context->getLocalizedSetting('competingInterests'), + $context->getLocalizedData('competingInterests'), __('reviewer.submission.competingInterests'), null, null, false, false diff --git a/controllers/confirmationModal/linkAction/ViewReviewGuidelinesLinkAction.inc.php b/controllers/confirmationModal/linkAction/ViewReviewGuidelinesLinkAction.inc.php index 0fe5d69ef77..20900d01aa7 100644 --- a/controllers/confirmationModal/linkAction/ViewReviewGuidelinesLinkAction.inc.php +++ b/controllers/confirmationModal/linkAction/ViewReviewGuidelinesLinkAction.inc.php @@ -51,7 +51,7 @@ function __construct($request, $stageId) { * @return string? */ function getGuidelines() { - return $this->_context->getLocalizedSetting( + return $this->_context->getLocalizedData( $this->_stageId==WORKFLOW_STAGE_ID_EXTERNAL_REVIEW?'reviewGuidelines':'internalReviewGuidelines' ); } diff --git a/controllers/grid/admin/context/ContextGridHandler.inc.php b/controllers/grid/admin/context/ContextGridHandler.inc.php index 6b8c9fb0bba..ccd5874a4e6 100644 --- a/controllers/grid/admin/context/ContextGridHandler.inc.php +++ b/controllers/grid/admin/context/ContextGridHandler.inc.php @@ -75,8 +75,10 @@ function initialize($request, $args = null) { $router->url($request, null, null, 'createContext', null, null), __('admin.contexts.create'), 'modal_add_item', - true - ), + true, + 'context', + ['editContext'] + ), __('admin.contexts.create'), 'add_item' ) @@ -191,24 +193,6 @@ function users($args, $request) { $templateMgr = TemplateManager::getManager($request); $templateMgr->assign('oldUserId', (int) $request->getUserVar('oldUserId')); // for merging users. parent::setupTemplate($request); - return $templateMgr->fetchJson('core:controllers/tab/settings/users.tpl'); - } - - // - // Protected helper methods. - // - /** - * Return a redirect event. - * @param $request Request - * @param $newContextPath string - * @param $openWizard boolean - */ - protected function _getRedirectEvent($request, $newContextPath, $openWizard) { - $dispatcher = $request->getDispatcher(); - - $url = $dispatcher->url($request, ROUTE_PAGE, $newContextPath, 'admin', 'contexts', null, array('openWizard' => $openWizard)); - return $request->redirectUrlJson($url); + return $templateMgr->fetchJson('management/accessUsers.tpl'); } } - - diff --git a/controllers/grid/admin/context/ContextGridRow.inc.php b/controllers/grid/admin/context/ContextGridRow.inc.php index fa00d698314..b737c8c9af1 100644 --- a/controllers/grid/admin/context/ContextGridRow.inc.php +++ b/controllers/grid/admin/context/ContextGridRow.inc.php @@ -41,8 +41,10 @@ function initialize($request, $template = null) { $router->url($request, null, null, 'editContext', null, array('rowId' => $rowId)), __('grid.action.edit'), 'modal_edit', - true - ), + true, + 'context', + ['editContext'] + ), __('grid.action.edit'), 'edit' ) @@ -65,8 +67,7 @@ function initialize($request, $template = null) { $this->addAction( new LinkAction( 'wizard', - new RedirectAction( - $dispatcher->url($request, ROUTE_PAGE, $element->getPath(), 'admin', 'contexts', null, array('openWizard' => 1))), + new RedirectAction($dispatcher->url($request, ROUTE_PAGE, 'index', 'admin', 'wizard', $element->getId())), __('grid.action.wizard'), 'wrench' ) @@ -87,5 +88,3 @@ function initialize($request, $template = null) { } } - - diff --git a/controllers/grid/admin/context/form/ContextSiteSettingsForm.inc.php b/controllers/grid/admin/context/form/ContextSiteSettingsForm.inc.php deleted file mode 100644 index 50cfe126e04..00000000000 --- a/controllers/grid/admin/context/form/ContextSiteSettingsForm.inc.php +++ /dev/null @@ -1,131 +0,0 @@ -contextId = isset($contextId) ? (int) $contextId : null; - - // Validation checks for this form - $form = $this; - $this->addCheck(new FormValidatorLocale($this, 'name', 'required', 'admin.contexts.form.titleRequired')); - $this->addCheck(new FormValidator($this, 'path', 'required', 'admin.contexts.form.pathRequired')); - $this->addCheck(new FormValidatorRegExp($this, 'path', 'required', 'admin.contexts.form.pathAlphaNumeric', '/^[a-z0-9]+([\-_][a-z0-9]+)*$/i')); - $this->addCheck(new FormValidatorCustom($this, 'path', 'required', 'admin.contexts.form.pathExists', function($path) use ($form) { - $contextDao = Application::getContextDAO(); - return !$contextDao->existsByPath($path) || ($form->getData('oldPath') != null && $form->getData('oldPath') == $path); - })); - $this->addCheck(new FormValidatorPost($this)); - $this->addCheck(new FormValidatorCSRF($this)); - } - - /** - * @copydoc Form::fetch - */ - function fetch($request, $template = null, $display = false) { - $templateMgr = TemplateManager::getManager($request); - $templateMgr->assign('contextId', $this->contextId); - return parent::fetch($request, $template, $display); - } - - /** - * Initialize form data from current settings. - */ - function initData() { - if (isset($this->contextId)) { - $contextDao = Application::getContextDAO(); - $context = $contextDao->getById($this->contextId); - - $this->setData('name', $context->getName(null)); - $this->setData('description', $context->getDescription(null)); - $this->setData('path', $context->getPath()); - $this->setData('enabled', $context->getEnabled()); - } else { - $this->setData('enabled', 1); - } - } - - /** - * Assign form data to user-submitted data. - */ - function readInputData() { - $this->readUserVars(array('name', 'description', 'path', 'enabled')); - - if ($this->contextId) { - $contextDao = Application::getContextDAO(); - $context = $contextDao->getById($this->contextId); - if ($context) $this->setData('oldPath', $context->getPath()); - } - } - - /** - * Get a list of field names for which localized settings are used - * @return array - */ - function getLocaleFieldNames() { - return array('name', 'description'); - } - - /** - * Initially populate the user groups and assignments when creating a new context. - * @param $contextId int - */ - function _loadDefaultUserGroups($contextId) { - AppLocale::requireComponents(LOCALE_COMPONENT_APP_DEFAULT, LOCALE_COMPONENT_PKP_DEFAULT); - // Install default user groups - $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); - $userGroupDao->installSettings($contextId, 'registry/userGroups.xml'); - } - - /** - * Make the site administrator the manager of the newly created context. - * @param $contextId int - */ - function _assignManagerGroup($contextId) { - $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); - $sessionManager = SessionManager::getManager(); - $userSession = $sessionManager->getUserSession(); - if ($userSession->getUserId() != null && $userSession->getUserId() != 0 && !empty($contextId)) { - // get the default site admin user group - $managerUserGroup = $userGroupDao->getDefaultByRoleId($contextId, ROLE_ID_MANAGER); - $userGroupDao->assignUserToGroup($userSession->getUserId(), $managerUserGroup->getId()); - } - } - - /** - * Initially populate the navigationMenus and NavigationMenuItems when creating a new context. - * @param $contextId int - */ - function _loadDefaultNavigationMenus($contextId) { - AppLocale::requireComponents(LOCALE_COMPONENT_APP_DEFAULT, LOCALE_COMPONENT_PKP_DEFAULT); - // Install default user groups - $navigationMenuDao = DAORegistry::getDAO('NavigationMenuDAO'); - $navigationMenuDao->installSettings($contextId, 'registry/navigationMenus.xml'); - } -} - - diff --git a/controllers/grid/admin/languages/AdminLanguageGridHandler.inc.php b/controllers/grid/admin/languages/AdminLanguageGridHandler.inc.php index f298f06e0ac..cf5b24cb59d 100644 --- a/controllers/grid/admin/languages/AdminLanguageGridHandler.inc.php +++ b/controllers/grid/admin/languages/AdminLanguageGridHandler.inc.php @@ -31,7 +31,7 @@ function __construct() { 'fetchGrid', 'fetchRow', 'installLocale', 'saveInstallLocale', 'uninstallLocale', 'downloadLocale', 'disableLocale', 'enableLocale', - 'reloadLocale', 'setPrimaryLocale' + 'setPrimaryLocale' ) ); } @@ -123,13 +123,6 @@ public function initialize($request, $args = null) { // // Implement methods from GridHandler. // - /** - * @copydoc GridHandler::getRowInstance() - */ - protected function getRowInstance() { - return new LanguageGridRow(); - } - /** * @copydoc GridHandler::loadData() */ @@ -355,33 +348,6 @@ public function disableLocale($args, $request) { return new JSONMessage(false); } - /** - * Reload locale. - * @param $args array - * @param $request Request - * @return JSONMessage JSON object - */ - public function reloadLocale($args, $request) { - $site = $request->getSite(); - $locale = $request->getUserVar('rowId'); - - $gridData = $this->getGridDataElements($request); - if ($request->checkCSRF() && array_key_exists($locale, $gridData)) { - AppLocale::reloadLocale($locale); - $settingsDao = Application::getContextSettingsDAO(); - if ($request->getContext()) $settingsDao->reloadLocalizedDefaultContextSettings($request, $locale); - $notificationManager = new NotificationManager(); - $user = $request->getUser(); - $notificationManager->createTrivialNotification( - $user->getId(), NOTIFICATION_TYPE_SUCCESS, - array('contents' => __('notification.localeReloaded', array('locale' => $gridData[$locale]['name']))) - ); - return DAO::getDataChangedEvent($locale); - } - - return new JSONMessage(false); - } - /** * Set primary locale. @@ -467,7 +433,7 @@ protected function _updateContextLocaleSettings($request) { while ($context = $contexts->next()) { $primaryLocale = $context->getPrimaryLocale(); foreach (array('supportedLocales', 'supportedFormLocales', 'supportedSubmissionLocales') as $settingName) { - $localeList = $context->getSetting($settingName); + $localeList = $context->getData($settingName); if (is_array($localeList)) { $localeList = array_intersect($localeList, $siteSupportedLocales); diff --git a/controllers/grid/announcements/AnnouncementGridHandler.inc.php b/controllers/grid/announcements/AnnouncementGridHandler.inc.php index 8b92b688f75..0fec94f3f29 100644 --- a/controllers/grid/announcements/AnnouncementGridHandler.inc.php +++ b/controllers/grid/announcements/AnnouncementGridHandler.inc.php @@ -35,7 +35,7 @@ function authorize($request, &$args, $roleAssignments, $requireAnnouncementsEnab // Ensure announcements are enabled. $context = $request->getContext(); - if ($requireAnnouncementsEnabled && !$context->getSetting('enableAnnouncements')) { + if ($requireAnnouncementsEnabled && !$context->getData('enableAnnouncements')) { return false; } diff --git a/controllers/grid/announcements/ViewAnnouncementGridHandler.inc.php b/controllers/grid/announcements/ViewAnnouncementGridHandler.inc.php index f0e34cfff64..d6cf0994741 100644 --- a/controllers/grid/announcements/ViewAnnouncementGridHandler.inc.php +++ b/controllers/grid/announcements/ViewAnnouncementGridHandler.inc.php @@ -26,7 +26,7 @@ function initialize($request, $args = null) { $displayLimit = (boolean) $request->getUserVar('displayLimit'); if ($displayLimit) { $context = $request->getContext(); - $numAnnouncementsHomepage = $context->getSetting('numAnnouncementsHomepage'); + $numAnnouncementsHomepage = $context->getData('numAnnouncementsHomepage'); $gridElements = $this->getGridDataElements($request); if (count($gridElements) > $numAnnouncementsHomepage) { $dispatcher = $request->getDispatcher(); diff --git a/controllers/grid/files/review/ReviewerReviewFilesGridDataProvider.inc.php b/controllers/grid/files/review/ReviewerReviewFilesGridDataProvider.inc.php index 0f623f52067..65a72706ab6 100644 --- a/controllers/grid/files/review/ReviewerReviewFilesGridDataProvider.inc.php +++ b/controllers/grid/files/review/ReviewerReviewFilesGridDataProvider.inc.php @@ -35,7 +35,7 @@ function __construct() { function getAuthorizationPolicy($request, $args, $roleAssignments) { import('lib.pkp.classes.security.authorization.SubmissionAccessPolicy'); $context = $request->getContext(); - $policy = new SubmissionAccessPolicy($request, $args, $roleAssignments, 'submissionId', !$context->getSetting('restrictReviewerFileAccess')); + $policy = new SubmissionAccessPolicy($request, $args, $roleAssignments, 'submissionId', !$context->getData('restrictReviewerFileAccess')); $stageId = $request->getUserVar('stageId'); import('lib.pkp.classes.security.authorization.internal.WorkflowStageRequiredPolicy'); diff --git a/controllers/grid/files/submissionDocuments/SubmissionDocumentsFilesGridHandler.inc.php b/controllers/grid/files/submissionDocuments/SubmissionDocumentsFilesGridHandler.inc.php index 5bfe416a67f..ffab7136a37 100644 --- a/controllers/grid/files/submissionDocuments/SubmissionDocumentsFilesGridHandler.inc.php +++ b/controllers/grid/files/submissionDocuments/SubmissionDocumentsFilesGridHandler.inc.php @@ -117,9 +117,10 @@ protected function getRowInstance() { */ function viewLibrary($args, $request) { $templateMgr = TemplateManager::getManager($request); - $templateMgr->assign('canEdit', false); $templateMgr->assign('isModal', true); - return $templateMgr->fetchJson('controllers/tab/settings/library.tpl'); + $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES); + $templateMgr->assign('canEdit', !empty(array_intersect([ROLE_ID_ADMIN, ROLE_ID_MANAGER], $userRoles))); + return $templateMgr->fetchJson('controllers/modals/documentLibrary/publisherLibrary.tpl'); } /** @@ -145,5 +146,3 @@ function _getEditFileForm($context, $fileId) { return new EditLibraryFileForm($context->getId(), $fileId, $submission->getId()); } } - - diff --git a/controllers/grid/files/submissionDocuments/form/EditLibraryFileForm.inc.php b/controllers/grid/files/submissionDocuments/form/EditLibraryFileForm.inc.php index 68abed1c400..c03c2a2fae5 100644 --- a/controllers/grid/files/submissionDocuments/form/EditLibraryFileForm.inc.php +++ b/controllers/grid/files/submissionDocuments/form/EditLibraryFileForm.inc.php @@ -35,7 +35,7 @@ function __construct($contextId, $fileId, $submissionId) { $libraryFileDao = DAORegistry::getDAO('LibraryFileDAO'); $this->libraryFile = $libraryFileDao->getById($fileId); - if (!$this->libraryFile || $this->libraryFile->getContextId() !== $this->contextId || $this->libraryFile->getSubmissionId() !== $this->getSubmissionId()) { + if (!$this->libraryFile || $this->libraryFile->getContextId() != $this->contextId || $this->libraryFile->getSubmissionId() != $this->getSubmissionId()) { fatalError('Invalid library file!'); } } @@ -70,5 +70,3 @@ function getSubmissionId() { return $this->submissionId; } } - - diff --git a/controllers/grid/languages/LanguageGridHandler.inc.php b/controllers/grid/languages/LanguageGridHandler.inc.php index 3033b7a24fb..675287a1822 100644 --- a/controllers/grid/languages/LanguageGridHandler.inc.php +++ b/controllers/grid/languages/LanguageGridHandler.inc.php @@ -49,6 +49,13 @@ function initialize($request, $args = null) { $this->setTitle('common.languages'); } + /** + * @copydoc GridHandler::getRowInstance() + */ + protected function getRowInstance() { + return new LanguageGridRow(); + } + // // Public handler methods. // @@ -65,22 +72,26 @@ function saveLanguageSetting($args, $request) { $availableLocales = $this->getGridDataElements($request); $context = $request->getContext(); + import('classes.core.ServicesContainer'); + $contextService = ServicesContainer::instance()->get('context'); + $permittedSettings = array('supportedFormLocales', 'supportedSubmissionLocales', 'supportedLocales'); if (in_array($settingName, $permittedSettings) && $locale) { - $currentSettingValue = (array) $context->getSetting($settingName); + $currentSettingValue = (array) $context->getData($settingName); if (AppLocale::isLocaleValid($locale) && array_key_exists($locale, $availableLocales)) { if ($settingValue) { array_push($currentSettingValue, $locale); if ($settingName == 'supportedFormLocales') { // reload localized default context settings - $settingsDao = Application::getContextSettingsDAO(); - $settingsDao->reloadLocalizedDefaultContextSettings($request, $locale); + $contextService->restoreLocaleDefaults($context, $request, $locale); } elseif ($settingName == 'supportedSubmissionLocales') { // if a submission locale is enabled, and this locale is not in the form locales, add it - $supportedFormLocales = (array) $context->getSetting('supportedFormLocales'); + $supportedFormLocales = (array) $context->getData('supportedFormLocales'); if (!in_array($locale, $supportedFormLocales)) { array_push($supportedFormLocales, $locale); - $context->updateSetting('supportedFormLocales', $supportedFormLocales); + $context = $contextService->editContext($context, ['supportedFormLocales' => $supportedFormLocales], $request); + // reload localized default context settings + $contextService->restoreLocaleDefaults($context, $request, $locale); } } } else { @@ -88,23 +99,31 @@ function saveLanguageSetting($args, $request) { if ($key !== false) unset($currentSettingValue[$key]); if ($settingName == 'supportedFormLocales') { // if a form locale is disabled, disable it form submission locales as well - $supportedSubmissionLocales = (array) $context->getSetting('supportedSubmissionLocales'); + $supportedSubmissionLocales = (array) $context->getData('supportedSubmissionLocales'); $key = array_search($locale, $supportedSubmissionLocales); if ($key !== false) unset($supportedSubmissionLocales[$key]); - $context->updateSetting('supportedSubmissionLocales', $supportedSubmissionLocales); + $supportedSubmissionLocales = array_values($supportedSubmissionLocales); + $context = $contextService->editContext($context, ['supportedSubmissionLocales' => $supportedSubmissionLocales], $request); } } } } - $context->updateSetting($settingName, $currentSettingValue); + $context = $contextService->editContext($context, [$settingName => $currentSettingValue], $request); $notificationManager = new NotificationManager(); $user = $request->getUser(); $notificationManager->createTrivialNotification( $user->getId(), NOTIFICATION_TYPE_SUCCESS, array('contents' => __('notification.localeSettingsSaved'))); - return DAO::getDataChangedEvent($locale); + $localeNames = AppLocale::getAllLocales(); + $newFormLocales = array_map(function($localeKey) use ($localeNames) { + return ['key' => $localeKey, 'label' => $localeNames[$localeKey]]; + }, $context->getData('supportedFormLocales')); + + $json = DAO::getDataChangedEvent($locale); + $json->setGlobalEvent('set-form-languages', $newFormLocales); + return $json; } /** @@ -121,7 +140,7 @@ function setContextPrimaryLocale($args, $request) { if (AppLocale::isLocaleValid($locale) && array_key_exists($locale, $availableLocales)) { // Make sure at least the primary locale is chosen as available foreach (array('supportedLocales', 'supportedSubmissionLocales', 'supportedFormLocales') as $name) { - $$name = $context->getSetting($name); + $$name = $context->getData($name); if (!in_array($locale, $$name)) { array_push($$name, $locale); $context->updateSetting($name, $$name); @@ -129,7 +148,7 @@ function setContextPrimaryLocale($args, $request) { } $context->setPrimaryLocale($locale); - $contextDao = $context->getDAO(); + $contextDao = Application::getContextDAO(); $contextDao->updateObject($context); $notificationManager = new NotificationManager(); @@ -238,7 +257,8 @@ function addManagementData($request, $data) { if (is_array($data)) { foreach ($data as $locale => $localeData) { foreach (array('supportedFormLocales', 'supportedSubmissionLocales', 'supportedLocales') as $name) { - $data[$locale][$name] = in_array($locale, (array) $context->getSetting($name)); + $data[$locale][$name] = in_array($locale, $context->getData($name)); + // $data[$locale][$name] = in_array($locale, (array) $context->getData($name)); } } } else { @@ -248,5 +268,3 @@ function addManagementData($request, $data) { return $data; } } - - diff --git a/controllers/grid/languages/LanguageGridRow.inc.php b/controllers/grid/languages/LanguageGridRow.inc.php index 322fa220829..0537858096a 100644 --- a/controllers/grid/languages/LanguageGridRow.inc.php +++ b/controllers/grid/languages/LanguageGridRow.inc.php @@ -40,7 +40,7 @@ function initialize($request, $template = null) { ); if (Validation::isSiteAdmin()) { - if (!$rowData['primary']) { + if (!$request->getContext() && !$rowData['primary']) { $this->addAction( new LinkAction( 'uninstall', @@ -54,18 +54,20 @@ function initialize($request, $template = null) { 'delete') ); } - $this->addAction( - new LinkAction( - 'reload', - new RemoteActionConfirmationModal( - $request->getSession(), - __('manager.language.confirmDefaultSettingsOverwrite'), - __('manager.language.reloadLocalizedDefaultSettings'), - $router->url($request, null, null, 'reloadLocale', null, $actionArgs) - ), - __('manager.language.reloadLocalizedDefaultSettings') - ) - ); + if ($request->getContext()) { + $this->addAction( + new LinkAction( + 'reload', + new RemoteActionConfirmationModal( + $request->getSession(), + __('manager.language.confirmDefaultSettingsOverwrite'), + __('manager.language.reloadLocalizedDefaultSettings'), + $router->url($request, null, null, 'reloadLocale', null, $actionArgs) + ), + __('manager.language.reloadLocalizedDefaultSettings') + ) + ); + } } } } diff --git a/controllers/grid/languages/form/InstallLanguageForm.inc.php b/controllers/grid/languages/form/InstallLanguageForm.inc.php index 2b3bdf2126b..76bcd982d32 100644 --- a/controllers/grid/languages/form/InstallLanguageForm.inc.php +++ b/controllers/grid/languages/form/InstallLanguageForm.inc.php @@ -21,7 +21,7 @@ class InstallLanguageForm extends Form { /** * Constructor. */ - function __construct($wizardMode = false) { + function __construct() { parent::__construct('controllers/grid/languages/installLanguageForm.tpl'); } @@ -112,5 +112,3 @@ function execute() { } } } - - diff --git a/controllers/grid/navigationMenus/form/PKPNavigationMenuItemsForm.inc.php b/controllers/grid/navigationMenus/form/PKPNavigationMenuItemsForm.inc.php index 8fcf45b70ac..f7aec3f00ca 100644 --- a/controllers/grid/navigationMenus/form/PKPNavigationMenuItemsForm.inc.php +++ b/controllers/grid/navigationMenus/form/PKPNavigationMenuItemsForm.inc.php @@ -67,11 +67,11 @@ function fetch($request, $template = null, $display = false) { $context = $request->getContext(); if ($context) $templateMgr->assign('allowedVariables', array( - 'contactName' => __('plugins.generic.tinymce.variables.principalContactName', array('value' => $context->getSetting('contactName'))), - 'contactEmail' => __('plugins.generic.tinymce.variables.principalContactEmail', array('value' => $context->getSetting('contactEmail'))), - 'supportName' => __('plugins.generic.tinymce.variables.supportContactName', array('value' => $context->getSetting('supportName'))), - 'supportPhone' => __('plugins.generic.tinymce.variables.supportContactPhone', array('value' => $context->getSetting('supportPhone'))), - 'supportEmail' => __('plugins.generic.tinymce.variables.supportContactEmail', array('value' => $context->getSetting('supportEmail'))), + 'contactName' => __('plugins.generic.tinymce.variables.principalContactName', array('value' => $context->getData('contactName'))), + 'contactEmail' => __('plugins.generic.tinymce.variables.principalContactEmail', array('value' => $context->getData('contactEmail'))), + 'supportName' => __('plugins.generic.tinymce.variables.supportContactName', array('value' => $context->getData('supportName'))), + 'supportPhone' => __('plugins.generic.tinymce.variables.supportContactPhone', array('value' => $context->getData('supportPhone'))), + 'supportEmail' => __('plugins.generic.tinymce.variables.supportContactEmail', array('value' => $context->getData('supportEmail'))), )); import('classes.core.ServicesContainer'); $types = ServicesContainer::instance() diff --git a/controllers/grid/queries/form/QueryForm.inc.php b/controllers/grid/queries/form/QueryForm.inc.php index 916f9013f3c..84f30ae4e6d 100644 --- a/controllers/grid/queries/form/QueryForm.inc.php +++ b/controllers/grid/queries/form/QueryForm.inc.php @@ -257,8 +257,8 @@ function fetch($request, $template = null, $display = false, $actionArgs = array } } - import('lib.pkp.controllers.list.users.SelectUserListHandler'); - $queryParticipantsList = new SelectUserListHandler(array( + import('lib.pkp.components.listPanels.users.SelectUserListPanel'); + $queryParticipantsList = new SelectUserListPanel(array( 'title' => 'editor.submission.stageParticipants', 'inputName' => 'users[]', 'selected' => $selectedParticipants, @@ -299,7 +299,7 @@ function fetch($request, $template = null, $display = false, $actionArgs = array $templateMgr->assign(array( 'hasParticipants' => count($queryParticipantsListData['items']), - 'queryParticipantsListData' => json_encode($queryParticipantsListData), + 'queryParticipantsListData' => $queryParticipantsListData, )); } @@ -370,5 +370,3 @@ function execute() { } } } - - diff --git a/controllers/grid/settings/languages/ManageLanguageGridHandler.inc.php b/controllers/grid/settings/languages/ManageLanguageGridHandler.inc.php index 1347d290e22..486c49f97d2 100644 --- a/controllers/grid/settings/languages/ManageLanguageGridHandler.inc.php +++ b/controllers/grid/settings/languages/ManageLanguageGridHandler.inc.php @@ -23,7 +23,7 @@ function __construct() { parent::__construct(); $this->addRoleAssignment( array(ROLE_ID_MANAGER), - array('saveLanguageSetting', 'setContextPrimaryLocale', 'fetchGrid', 'fetchRow') + array('saveLanguageSetting', 'setContextPrimaryLocale', 'reloadLocale', 'fetchGrid', 'fetchRow') ); } @@ -77,6 +77,36 @@ function initialize($request, $args = null) { $this->addPrimaryColumn('contextPrimary'); $this->addManagementColumns(); } + + /** + * Reload locale. + * @param $args array + * @param $request Request + * @return JSONMessage JSON object + */ + public function reloadLocale($args, $request) { + $context = $request->getContext(); + $locale = $request->getUserVar('rowId'); + $gridData = $this->getGridDataElements($request); + + if (empty($context) || !$request->checkCSRF() || !array_key_exists($locale, $gridData)) { + return new JSONMessage(false); + } + + import('classes.core.ServicesContainer'); + $context = ServicesContainer::instance() + ->get('context') + ->restoreLocaleDefaults($context, $request, $locale); + + $notificationManager = new NotificationManager(); + $notificationManager->createTrivialNotification( + $request->getUser()->getId(), + NOTIFICATION_TYPE_SUCCESS, + array('contents' => __('notification.localeReloaded', array('locale' => $gridData[$locale]['name'], 'contextName' => $context->getLocalizedName()))) + ); + + return DAO::getDataChangedEvent($locale); + } } diff --git a/controllers/grid/settings/library/form/EditLibraryFileForm.inc.php b/controllers/grid/settings/library/form/EditLibraryFileForm.inc.php index a4116b27f68..f8fb88a7ee1 100644 --- a/controllers/grid/settings/library/form/EditLibraryFileForm.inc.php +++ b/controllers/grid/settings/library/form/EditLibraryFileForm.inc.php @@ -33,7 +33,7 @@ function __construct($contextId, $fileId) { $libraryFileDao = DAORegistry::getDAO('LibraryFileDAO'); $this->libraryFile = $libraryFileDao->getById($fileId); - if (!$this->libraryFile || $this->libraryFile->getContextId() !== $this->contextId) { + if (!$this->libraryFile || $this->libraryFile->getContextId() != $this->contextId) { fatalError('Invalid library file!'); } } @@ -61,5 +61,3 @@ function execute() { $libraryFileDao->updateObject($this->libraryFile); } } - - diff --git a/controllers/grid/settings/metadata/MetadataGridCellProvider.inc.php b/controllers/grid/settings/metadata/MetadataGridCellProvider.inc.php deleted file mode 100644 index 237d44a453f..00000000000 --- a/controllers/grid/settings/metadata/MetadataGridCellProvider.inc.php +++ /dev/null @@ -1,58 +0,0 @@ -_context = $context; - parent::__construct(); - } - - /** - * @copydoc GridCellProvider::getTemplateVarsFromRowColumn() - */ - function getTemplateVarsFromRowColumn($row, $column) { - $element = $row->getData(); - $columnId = $column->getId(); - switch ($columnId) { - case 'name': - return array('label' => $element['name']); - case 'submission': - $settingName = $row->getId() . 'EnabledSubmission'; // e.g. typeEnabledSubmission - $settingEnabled = $this->_context->getSetting($settingName); - return array('name' => $settingName, 'selected' => $settingEnabled?true:false); - case 'workflow': - $settingName = $row->getId() . 'EnabledWorkflow'; // e.g. typeEnabledWorkflow - $settingEnabled = $this->_context->getSetting($settingName); - return array('name' => $settingName, 'selected' => $settingEnabled?true:false); - case 'required': - $settingName = $row->getId() . 'Required'; // e.g. typeRequiredWorkflow - $settingEnabled = $this->_context->getSetting($settingName); - return array('name' => $settingName, 'selected' => $settingEnabled?true:false); - } - assert(false); - } -} - - diff --git a/controllers/grid/settings/metadata/MetadataGridHandler.inc.php b/controllers/grid/settings/metadata/MetadataGridHandler.inc.php deleted file mode 100644 index 0333110ce00..00000000000 --- a/controllers/grid/settings/metadata/MetadataGridHandler.inc.php +++ /dev/null @@ -1,122 +0,0 @@ -setTitle('submission.metadata'); - - $cellProvider = new MetadataGridCellProvider($request->getContext()); - - // Field name. - $this->addColumn( - new GridColumn( - 'name', - 'common.name', - null, - 'controllers/grid/gridCell.tpl', - $cellProvider, - array('width' => 60) - ) - ); - - $this->addColumn( - new GridColumn( - 'workflow', - 'common.enabled', - null, - 'controllers/grid/common/cell/selectStatusCell.tpl', - $cellProvider, - array('alignment' => 'center') - ) - ); - - $this->addColumn( - new GridColumn( - 'submission', - 'manager.setup.metadata.submission', - null, - 'controllers/grid/common/cell/selectStatusCell.tpl', - $cellProvider, - array('alignment' => 'center') - ) - ); - - $this->addColumn( - new GridColumn( - 'required', - 'common.required', - null, - 'controllers/grid/common/cell/selectStatusCell.tpl', - $cellProvider, - array('alignment' => 'center') - ) - ); - } - - /** - * Get the list of configurable metadata fields. - */ - static function getNames() { - return array( - 'coverage' => array('name' => __('rt.metadata.dublinCore.coverage')), - 'languages' => array('name' => __('rt.metadata.dublinCore.language')), - 'rights' => array('name' => __('rt.metadata.dublinCore.rights')), - 'source' => array('name' => __('rt.metadata.dublinCore.source')), - 'subjects' => array('name' => __('rt.metadata.dublinCore.subject')), - 'type' => array('name' => __('rt.metadata.dublinCore.type')), - 'disciplines' => array('name' => __('rt.metadata.pkp.discipline')), - 'keywords' => array('name' => __('rt.metadata.pkp.subject')), - 'agencies' => array('name' => __('submission.supportingAgencies')), - 'citations' => array('name' => __('submission.citations')), - ); - } - - /** - * @copydoc GridHandler::loadData() - */ - protected function loadData($request, $filter) { - return $this->getNames(); - } - - /** - * @see GridHandler::getJSHandler() - */ - public function getJSHandler() { - return '$.pkp.controllers.grid.settings.metadata.MetadataGridHandler'; - } -} - - diff --git a/controllers/grid/settings/roles/UserGroupGridHandler.inc.php b/controllers/grid/settings/roles/UserGroupGridHandler.inc.php index ddcd48bf27f..6414ba1d56b 100644 --- a/controllers/grid/settings/roles/UserGroupGridHandler.inc.php +++ b/controllers/grid/settings/roles/UserGroupGridHandler.inc.php @@ -279,7 +279,9 @@ function updateUserGroup($args, $request) { $userGroupForm->readInputData(); if($userGroupForm->validate()) { $userGroupForm->execute(); - return DAO::getDataChangedEvent(); + $json = DAO::getDataChangedEvent(); + $json->setGlobalEvent('userGroupUpdated'); + return $json; } else { return new JSONMessage(true, $userGroupForm->fetch($request)); } @@ -326,7 +328,9 @@ function removeUserGroup($args, $request) { } - return DAO::getDataChangedEvent($userGroup->getId()); + $json = DAO::getDataChangedEvent($userGroup->getId()); + $json->setGlobalEvent('userGroupUpdated'); + return $json; } /** @@ -412,5 +416,3 @@ private function _getContextId() { return $this->_contextId; } } - - diff --git a/controllers/grid/settings/sections/form/PKPSectionForm.inc.php b/controllers/grid/settings/sections/form/PKPSectionForm.inc.php index df2466a8e2c..fb98e303eb1 100644 --- a/controllers/grid/settings/sections/form/PKPSectionForm.inc.php +++ b/controllers/grid/settings/sections/form/PKPSectionForm.inc.php @@ -107,8 +107,8 @@ public function _getAssignedSubEditorIds($sectionId, $contextId) { * @return array */ public function _getSubEditorsListPanelData($contextId, $request) { - import('lib.pkp.controllers.list.users.SelectUserListHandler'); - $data = new SelectUserListHandler(array( + import('lib.pkp.components.listPanels.users.SelectUserListPanel'); + $data = new SelectUserListPanel(array( 'title' => 'user.role.subEditors', 'inputName' => 'subEditors[]', 'selected' => $this->getData('subEditors'), diff --git a/controllers/grid/settings/submissionChecklist/SubmissionChecklistGridHandler.inc.php b/controllers/grid/settings/submissionChecklist/SubmissionChecklistGridHandler.inc.php index e9debc734dc..5c63ce0d696 100644 --- a/controllers/grid/settings/submissionChecklist/SubmissionChecklistGridHandler.inc.php +++ b/controllers/grid/settings/submissionChecklist/SubmissionChecklistGridHandler.inc.php @@ -94,7 +94,7 @@ protected function loadData($request, $filter) { // Elements to be displayed in the grid $router = $request->getRouter(); $context = $router->getContext($request); - $submissionChecklist = $context->getSetting('submissionChecklist'); + $submissionChecklist = $context->getData('submissionChecklist'); return $submissionChecklist[AppLocale::getLocale()]; } @@ -167,7 +167,7 @@ function deleteItem($args, $request) { $context = $router->getContext($request); // get all of the submissionChecklists - $submissionChecklistAll = $context->getSetting('submissionChecklist'); + $submissionChecklistAll = $context->getData('submissionChecklist'); foreach (AppLocale::getSupportedLocales() as $locale => $name) { if ( isset($submissionChecklistAll[$locale][$rowId]) ) { @@ -200,7 +200,7 @@ function setDataElementSequence($request, $rowId, $gridDataElement, $newSequence $context = $router->getContext($request); // Get all of the submissionChecklists. - $submissionChecklistAll = $context->getSetting('submissionChecklist'); + $submissionChecklistAll = $context->getData('submissionChecklist'); $locale = AppLocale::getLocale(); if (isset($submissionChecklistAll[$locale][$rowId])) { diff --git a/controllers/grid/settings/submissionChecklist/form/SubmissionChecklistForm.inc.php b/controllers/grid/settings/submissionChecklist/form/SubmissionChecklistForm.inc.php index a4b6e68d313..1a585be3688 100644 --- a/controllers/grid/settings/submissionChecklist/form/SubmissionChecklistForm.inc.php +++ b/controllers/grid/settings/submissionChecklist/form/SubmissionChecklistForm.inc.php @@ -42,7 +42,7 @@ function initData($args) { $request = Application::getRequest(); $context = $request->getContext(); - $submissionChecklistAll = $context->getSetting('submissionChecklist'); + $submissionChecklistAll = $context->getData('submissionChecklist'); $checklistItem = array(); // preparea localizable array for this checklist Item foreach (AppLocale::getSupportedLocales() as $locale => $name) { @@ -92,7 +92,7 @@ function execute() { $request = Application::getRequest(); $router = $request->getRouter(); $context = $router->getContext($request); - $submissionChecklistAll = $context->getSetting('submissionChecklist'); + $submissionChecklistAll = $context->getData('submissionChecklist'); $locale = AppLocale::getPrimaryLocale(); //FIXME: a bit of kludge to get unique submissionChecklist id's $this->submissionChecklistId = ($this->submissionChecklistId != null ? $this->submissionChecklistId:(max(array_keys($submissionChecklistAll[$locale])) + 1)); diff --git a/controllers/grid/settings/user/form/UserDetailsForm.inc.php b/controllers/grid/settings/user/form/UserDetailsForm.inc.php index 05532a3eeed..e314054f7d4 100644 --- a/controllers/grid/settings/user/form/UserDetailsForm.inc.php +++ b/controllers/grid/settings/user/form/UserDetailsForm.inc.php @@ -329,7 +329,7 @@ function execute() { // Send welcome email to user import('lib.pkp.classes.mail.MailTemplate'); $mail = new MailTemplate('USER_REGISTER'); - $mail->setReplyTo($context->getSetting('contactEmail'), $context->getSetting('contactName')); + $mail->setReplyTo($context->getData('contactEmail'), $context->getData('contactName')); $mail->assignParams(array('username' => $this->getData('username'), 'password' => $password, 'userFullName' => $this->user->getFullName())); $mail->addRecipient($this->user->getEmail(), $this->user->getFullName()); $mail->send(); diff --git a/controllers/grid/settings/user/form/UserForm.inc.php b/controllers/grid/settings/user/form/UserForm.inc.php index 394e92e003c..1c62bd11737 100644 --- a/controllers/grid/settings/user/form/UserForm.inc.php +++ b/controllers/grid/settings/user/form/UserForm.inc.php @@ -68,15 +68,15 @@ public function display($request = null, $template = null) { $contextId = $context ? $context->getId() : CONTEXT_ID_NONE; $templateMgr = TemplateManager::getManager($request); - import('lib.pkp.controllers.list.users.SelectRoleListHandler'); - $selectRoleList = new SelectRoleListHandler(array( + import('lib.pkp.components.listPanels.users.SelectRoleListPanel'); + $selectRoleList = new SelectRoleListPanel(array( 'contextId' => $contextId, 'title' => 'grid.user.userRoles', 'inputName' => 'userGroupIds[]', 'selected' => $this->getData('userGroupIds'), )); $templateMgr->assign(array( - 'selectUserListData' => json_encode($selectRoleList->getConfig()), + 'selectUserListData' => $selectRoleList->getConfig(), )); return $this->fetch($request); @@ -103,5 +103,3 @@ function execute() { } } - - diff --git a/controllers/grid/users/reviewer/form/AdvancedSearchReviewerForm.inc.php b/controllers/grid/users/reviewer/form/AdvancedSearchReviewerForm.inc.php index d48db5257d5..14b5c377d5c 100644 --- a/controllers/grid/users/reviewer/form/AdvancedSearchReviewerForm.inc.php +++ b/controllers/grid/users/reviewer/form/AdvancedSearchReviewerForm.inc.php @@ -86,8 +86,8 @@ function fetch($request, $template = null, $display = false) { } $warnOnAssignment = array_map('intval', array_values(array_unique($warnOnAssignment))); - import('lib.pkp.controllers.list.users.SelectReviewerListHandler'); - $selectReviewerListHandler = new SelectReviewerListHandler(array( + import('lib.pkp.components.listPanels.users.SelectReviewerListPanel'); + $selectReviewerListPanel = new SelectReviewerListPanel(array( 'title' => 'editor.submission.findAndSelectReviewer', 'inputName' => 'reviewerId', 'inputType' => 'radio', @@ -95,7 +95,7 @@ function fetch($request, $template = null, $display = false) { 'warnOnAssignment' => $warnOnAssignment, )); $templateMgr = TemplateManager::getManager($request); - $templateMgr->assign('selectReviewerListData', $selectReviewerListHandler->getConfig()); + $templateMgr->assign('selectReviewerListData', $selectReviewerListPanel->getConfig()); // Only add actions to forms where user can operate. if (array_intersect($this->getUserRoles(), array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR))) { diff --git a/controllers/grid/users/reviewer/form/CreateReviewerForm.inc.php b/controllers/grid/users/reviewer/form/CreateReviewerForm.inc.php index 44c6f141d62..b4097ae5cf4 100644 --- a/controllers/grid/users/reviewer/form/CreateReviewerForm.inc.php +++ b/controllers/grid/users/reviewer/form/CreateReviewerForm.inc.php @@ -132,7 +132,7 @@ function execute() { if ($mail->isEnabled()) { $request = Application::getRequest(); $context = $request->getContext(); - $mail->setReplyTo($context->getSetting('contactEmail'), $context->getSetting('contactName')); + $mail->setReplyTo($context->getData('contactEmail'), $context->getData('contactName')); $mail->assignParams(array('username' => $this->getData('username'), 'password' => $password, 'userFullName' => $user->getFullName())); $mail->addRecipient($user->getEmail(), $user->getFullName()); $mail->send($request); diff --git a/controllers/grid/users/reviewer/form/ReviewReminderForm.inc.php b/controllers/grid/users/reviewer/form/ReviewReminderForm.inc.php index 248690e8573..7dccadad861 100644 --- a/controllers/grid/users/reviewer/form/ReviewReminderForm.inc.php +++ b/controllers/grid/users/reviewer/form/ReviewReminderForm.inc.php @@ -65,8 +65,8 @@ function initData() { import('lib.pkp.classes.mail.SubmissionMailTemplate'); $context = $request->getContext(); - $templateKey = $this->_getMailTemplateKey($context); - + $templateKey = $this->_getMailTemplateKey($context); + $email = new SubmissionMailTemplate($submission, $templateKey); // Format the review due date @@ -144,24 +144,24 @@ function execute() { import('lib.pkp.classes.mail.SubmissionMailTemplate'); $context = $request->getContext(); - $templateKey = $this->_getMailTemplateKey($context); + $templateKey = $this->_getMailTemplateKey($context); $email = new SubmissionMailTemplate($submission, $templateKey, null, null, null, false); - + $reviewUrlArgs = array('submissionId' => $reviewAssignment->getSubmissionId()); - if ($context->getSetting('reviewerAccessKeysEnabled')) { + if ($context->getData('reviewerAccessKeysEnabled')) { import('lib.pkp.classes.security.AccessKeyManager'); $accessKeyManager = new AccessKeyManager(); - $expiryDays = ($context->getSetting('numWeeksPerReview') + 4) * 7; + $expiryDays = ($context->getData('numWeeksPerReview') + 4) * 7; $accessKey = $accessKeyManager->createKey($context->getId(), $reviewerId, $reviewAssignment->getId(), $expiryDays); $reviewUrlArgs = array_merge($reviewUrlArgs, array('reviewId' => $reviewAssignment->getId(), 'key' => $accessKey)); - } + } $email->addRecipient($reviewer->getEmail(), $reviewer->getFullName()); $email->setBody($this->getData('message')); $email->assignParams(array( 'reviewerName' => $reviewer->getFullName(), 'reviewDueDate' => $reviewDueDate, - 'passwordResetUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'login', 'resetPassword', $reviewer->getUsername(), array('confirm' => Validation::generatePasswordResetHash($reviewer->getId()))), + 'passwordResetUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'login', 'resetPassword', $reviewer->getUsername(), array('confirm' => Validation::generatePasswordResetHash($reviewer->getId()))), 'submissionReviewUrl' => $dispatcher->url($request, ROUTE_PAGE, null, 'reviewer', 'submission', null, $reviewUrlArgs), 'editorialContactSignature' => $user->getContactSignature(), )); @@ -183,13 +183,13 @@ function execute() { */ function _getMailTemplateKey($context) { $templateKey = 'REVIEW_REMIND'; - if ($context->getSetting('reviewerAccessKeysEnabled')) { + if ($context->getData('reviewerAccessKeysEnabled')) { $templateKey = 'REVIEW_REMIND_ONECLICK'; } return $templateKey; - } - + } + } diff --git a/controllers/grid/users/reviewer/form/ReviewerForm.inc.php b/controllers/grid/users/reviewer/form/ReviewerForm.inc.php index b183fb6ab9c..3c65985369e 100644 --- a/controllers/grid/users/reviewer/form/ReviewerForm.inc.php +++ b/controllers/grid/users/reviewer/form/ReviewerForm.inc.php @@ -156,7 +156,7 @@ function initData() { $reviewFormId = $reviewAssignment->getReviewFormId(); } else { // Set default review method. - $reviewMethod = $context->getSetting('defaultReviewMode'); + $reviewMethod = $context->getData('defaultReviewMode'); if (!$reviewMethod) $reviewMethod = SUBMISSION_REVIEW_METHOD_BLIND; // If there is a section/series and it has a default @@ -171,14 +171,14 @@ function initData() { if (isset($reviewAssignment) && $reviewAssignment->getDueDate() != null) { $reviewDueDate = strftime(Config::getVar('general', 'date_format_short'), strtotime($reviewAssignment->getDueDate())); } else { - $numWeeks = (int) $context->getSetting('numWeeksPerReview'); + $numWeeks = (int) $context->getData('numWeeksPerReview'); if ($numWeeks<=0) $numWeeks=4; $reviewDueDate = strftime(Config::getVar('general', 'date_format_short'), strtotime('+' . $numWeeks . ' week')); } if (isset($reviewAssignment) && $reviewAssignment->getResponseDueDate() != null) { $responseDueDate = strftime(Config::getVar('general', 'date_format_short'), strtotime($reviewAssignment->getResponseDueDate())); } else { - $numWeeks = (int) $context->getSetting('numWeeksPerResponse'); + $numWeeks = (int) $context->getData('numWeeksPerResponse'); if ($numWeeks<=0) $numWeeks=3; $responseDueDate = strftime(Config::getVar('general', 'date_format_short'), strtotime('+' . $numWeeks . ' week')); } @@ -376,10 +376,10 @@ function execute() { // Set the additional arguments for the one click url $reviewUrlArgs = array('submissionId' => $this->getSubmissionId()); - if ($context->getSetting('reviewerAccessKeysEnabled')) { + if ($context->getData('reviewerAccessKeysEnabled')) { import('lib.pkp.classes.security.AccessKeyManager'); $accessKeyManager = new AccessKeyManager(); - $expiryDays = ($context->getSetting('numWeeksPerReview') + 4) * 7; + $expiryDays = ($context->getData('numWeeksPerReview') + 4) * 7; $accessKey = $accessKeyManager->createKey($context->getId(), $reviewerId, $reviewAssignment->getId(), $expiryDays); $reviewUrlArgs = array_merge($reviewUrlArgs, array('reviewId' => $reviewAssignment->getId(), 'key' => $accessKey)); } @@ -463,7 +463,7 @@ function _isValidReviewer($context, $submission, $reviewRound, $reviewerId) { * @return int Email template key */ function _getMailTemplateKey($context) { - $reviewerAccessKeysEnabled = $context->getSetting('reviewerAccessKeysEnabled'); + $reviewerAccessKeysEnabled = $context->getData('reviewerAccessKeysEnabled'); $round = $this->getReviewRound()->getRound(); switch(1) { diff --git a/controllers/listbuilder/admin/siteSetup/AdminBlockPluginsListbuilderHandler.inc.php b/controllers/listbuilder/admin/siteSetup/AdminBlockPluginsListbuilderHandler.inc.php deleted file mode 100644 index 5e6aec3e16a..00000000000 --- a/controllers/listbuilder/admin/siteSetup/AdminBlockPluginsListbuilderHandler.inc.php +++ /dev/null @@ -1,66 +0,0 @@ -addRoleAssignment( - array(ROLE_ID_SITE_ADMIN), - array('fetch') - ); - } - - /** - * @copydoc GridHandler::authorize() - */ - function authorize($request, &$args, $roleAssignments) { - import('lib.pkp.classes.security.authorization.PKPSiteAccessPolicy'); - $this->addPolicy(new PKPSiteAccessPolicy($request, array(), $roleAssignments)); - - return parent::authorize($request, $args, $roleAssignments); - } - - // - // Overridden template methods - // - /** - * @copydoc MultipleListsListbuilderHandler::setListsData() - */ - function setListsData($request, $filter) { - $sidebarBlockPlugins = $disabledBlockPlugins = array(); - $plugins = PluginRegistry::loadCategory('blocks'); - foreach ($plugins as $key => $junk) { - if (!$plugins[$key]->getEnabled(0) || $plugins[$key]->getBlockContext(0) == '') { - if (count(array_intersect($plugins[$key]->getSupportedContexts(), array(BLOCK_CONTEXT_SIDEBAR))) > 0) $disabledBlockPlugins[$key] = $plugins[$key]; - } else { - switch ($plugins[$key]->getBlockContext(0)) { - case BLOCK_CONTEXT_SIDEBAR: - $sidebarBlockPlugins[$key] = $plugins[$key]; - break; - } - } - } - - $lists = $this->getLists(); - $lists['sidebarContext']->setData($sidebarBlockPlugins); - $lists['unselected']->setData($disabledBlockPlugins); - } -} - - diff --git a/controllers/listbuilder/settings/BlockPluginsListbuilderGridCellProvider.inc.php b/controllers/listbuilder/settings/BlockPluginsListbuilderGridCellProvider.inc.php deleted file mode 100644 index cda665bdef5..00000000000 --- a/controllers/listbuilder/settings/BlockPluginsListbuilderGridCellProvider.inc.php +++ /dev/null @@ -1,40 +0,0 @@ -getData(); - $columnId = $column->getId(); - assert((is_a($plugin, 'Plugin')) && !empty($columnId)); - - return array('label' => $plugin->getDisplayName()); - } -} - - diff --git a/controllers/listbuilder/settings/BlockPluginsListbuilderHandler.inc.php b/controllers/listbuilder/settings/BlockPluginsListbuilderHandler.inc.php deleted file mode 100644 index 682ba2dc280..00000000000 --- a/controllers/listbuilder/settings/BlockPluginsListbuilderHandler.inc.php +++ /dev/null @@ -1,101 +0,0 @@ -addRoleAssignment( - array(ROLE_ID_MANAGER, ROLE_ID_SITE_ADMIN), - array('fetch') - ); - } - - /** - * @copydoc GridHandler::authorize() - */ - function authorize($request, &$args, $roleAssignments) { - $router = $request->getRouter(); - if (is_object($router->getContext($request))) { - import('lib.pkp.classes.security.authorization.ContextAccessPolicy'); - $this->addPolicy(new ContextAccessPolicy($request, $roleAssignments)); - } else { - import('lib.pkp.classes.security.authorization.PKPSiteAccessPolicy'); - $this->addPolicy(new PKPSiteAccessPolicy($request, array(), $roleAssignments)); - } - - return parent::authorize($request, $args, $roleAssignments); - } - - /** - * @copydoc ListbuilderHandler::initialize() - */ - function initialize($request, $args = null) { - parent::initialize($request, $args); - AppLocale::requireComponents(LOCALE_COMPONENT_PKP_MANAGER); - - // Basic configuration - $this->setTitle('manager.setup.layout.blockManagement'); - $this->setSaveFieldName('blocks'); - - // Name column - $nameColumn = new ListbuilderGridColumn($this, 'name', 'common.name'); - - // Add lists. - $this->addList(new ListbuilderList('sidebarContext', 'manager.setup.layout.sidebar')); - $this->addList(new ListbuilderList('unselected', 'manager.setup.layout.unselected')); - - import('lib.pkp.controllers.listbuilder.settings.BlockPluginsListbuilderGridCellProvider'); - $nameColumn->setCellProvider(new BlockPluginsListbuilderGridCellProvider()); - $this->addColumn($nameColumn); - } - - /** - * @copydoc ListbuilderHandler::canAddItems() - */ - public function canAddItems() { - return false; - } - - - // - // Overridden template methods - // - /** - * @copydoc MultipleListsListbuilderHandler::setListsData() - */ - function setListsData($request, $filter) { - $sidebarBlockPlugins = $disabledBlockPlugins = array(); - $plugins = PluginRegistry::loadCategory('blocks'); - foreach ($plugins as $key => $junk) { - if (!$plugins[$key]->getEnabled() || $plugins[$key]->getBlockContext() == '') { - if (count(array_intersect($plugins[$key]->getSupportedContexts(), array(BLOCK_CONTEXT_SIDEBAR))) > 0) $disabledBlockPlugins[$key] = $plugins[$key]; - } else switch ($plugins[$key]->getBlockContext()) { - case BLOCK_CONTEXT_SIDEBAR: - $sidebarBlockPlugins[$key] = $plugins[$key]; - break; - } - } - - $lists = $this->getLists(); - $lists['sidebarContext']->setData($sidebarBlockPlugins); - $lists['unselected']->setData($disabledBlockPlugins); - } -} - - diff --git a/controllers/modals/submissionMetadata/PublicationEntryHandler.inc.php b/controllers/modals/submissionMetadata/PublicationEntryHandler.inc.php index ebf930d2ebd..2cfdbd59ee4 100644 --- a/controllers/modals/submissionMetadata/PublicationEntryHandler.inc.php +++ b/controllers/modals/submissionMetadata/PublicationEntryHandler.inc.php @@ -113,7 +113,7 @@ function fetch($args, $request) { // Tell the template if citation field is enabled $context = $request->getContext(); $templateMgr->assign(array( - 'citationsEnabled' => $context->getSetting('citationsEnabledWorkflow'), + 'citationsEnabled' => !empty($context->getData('citations')), )); $this->setupTemplate($request); } @@ -128,5 +128,3 @@ function fetchFormatInfo($args, $request) { assert(false); // provided in sub classes, submission-specific. } } - - diff --git a/controllers/modals/submissionMetadata/form/PKPSubmissionMetadataViewForm.inc.php b/controllers/modals/submissionMetadata/form/PKPSubmissionMetadataViewForm.inc.php index ec42d88a8c9..c482784e9ef 100644 --- a/controllers/modals/submissionMetadata/form/PKPSubmissionMetadataViewForm.inc.php +++ b/controllers/modals/submissionMetadata/form/PKPSubmissionMetadataViewForm.inc.php @@ -129,18 +129,18 @@ function fetch($request, $template = null, $display = false) { )); // Tell the form what fields are enabled (and which of those are required) - import('lib.pkp.controllers.grid.settings.metadata.MetadataGridHandler'); $context = $request->getContext(); - foreach (array_keys(MetadataGridHandler::getNames()) as $field) { - $templateMgr->assign(array( - $field . 'Enabled' => $context->getSetting($field . 'EnabledWorkflow'), - $field . 'Required' => $context->getSetting($field . 'Required') - )); + $metadataFields = Application::getMetadataFields(); + foreach ($metadataFields as $field) { + $templateMgr->assign([ + $field . 'Enabled' => !empty($context->getData($field)), + $field . 'Required' => $context->getData($field) === METADATA_REQUIRE, + ]); } // Provide available submission languages. (Convert the array // of locale symbolic names xx_XX into an associative array // of symbolic names => readable names.) - $supportedSubmissionLocales = $context->getSetting('supportedSubmissionLocales'); + $supportedSubmissionLocales = $context->getData('supportedSubmissionLocales'); if (empty($supportedSubmissionLocales)) $supportedSubmissionLocales = array($context->getPrimaryLocale()); $templateMgr->assign( 'supportedSubmissionLocaleNames', @@ -170,5 +170,3 @@ function execute() { } } - - diff --git a/controllers/tab/publicationEntry/form/CitationsForm.inc.php b/controllers/tab/publicationEntry/form/CitationsForm.inc.php index 77fa0e50c04..8e5357284a3 100644 --- a/controllers/tab/publicationEntry/form/CitationsForm.inc.php +++ b/controllers/tab/publicationEntry/form/CitationsForm.inc.php @@ -49,7 +49,7 @@ function __construct($submission, $stageId, $tabPos, $formParams = null) { AppLocale::requireComponents(LOCALE_COMPONENT_PKP_EDITOR); - if ($context->getSetting('citationsRequired')) { + if ($context->getData('citations') === METADATA_REQUIRE) { $this->addCheck(new FormValidator($this, 'citations', 'required', 'common.required')); } $this->addCheck(new FormValidatorPost($this)); @@ -108,7 +108,7 @@ function fetch($request, $template = null, $display = false) { 'stageId' => $this->getStageId(), 'tabPos' => $this->getTabPosition(), 'formParams' => $this->getFormParams(), - 'citationsRequired' => $context->getSetting('citationsRequired'), + 'citationsRequired' => $context->getData('citationsRequired'), 'parsedCitations' => $parsedCitations, )); return parent::fetch($request, $template, $display); @@ -147,5 +147,3 @@ function execute() { } } - - diff --git a/controllers/tab/settings/AccessSettingsTabHandler.inc.php b/controllers/tab/settings/AccessSettingsTabHandler.inc.php deleted file mode 100644 index c352d9baa82..00000000000 --- a/controllers/tab/settings/AccessSettingsTabHandler.inc.php +++ /dev/null @@ -1,44 +0,0 @@ -setPageTabs(array( - 'users' => 'core:controllers/tab/settings/users.tpl', - 'roles' => 'core:controllers/tab/settings/roles.tpl', - 'siteAccessOptions' => 'controllers.tab.settings.siteAccessOptions.form.SiteAccessOptionsForm', - )); - } - - /** - * @see PKPHandler::setupTemplate() - * @param $request PKPKRequest - */ - function setupTemplate($request) { - $templateMgr = TemplateManager::getManager($request); - $templateMgr->assign('oldUserId', (int) $request->getUserVar('oldUserId')); // for merging users. - parent::setupTemplate($request); - } -} - - diff --git a/controllers/tab/settings/AdminSettingsTabHandler.inc.php b/controllers/tab/settings/AdminSettingsTabHandler.inc.php deleted file mode 100644 index 8e609b7d3e4..00000000000 --- a/controllers/tab/settings/AdminSettingsTabHandler.inc.php +++ /dev/null @@ -1,214 +0,0 @@ - 'class/template name') mappings - */ - function __construct($additionalTabs = array()) { - $role = array(ROLE_ID_SITE_ADMIN); - - $this->addRoleAssignment([ROLE_ID_MANAGER, ROLE_ID_SITE_ADMIN], - array( - 'showFileUploadForm', - 'uploadFile', - 'saveFile', - 'deleteFile', - 'fetchFile' - ) - ); - - parent::__construct($role); - $this->setPageTabs(array_merge($additionalTabs, array( - 'siteSetup' => 'lib.pkp.controllers.tab.settings.siteSetup.form.SiteSetupForm', - 'languages' => 'controllers/tab/admin/languages/languages.tpl', - 'plugins' => 'controllers/tab/admin/plugins/sitePlugins.tpl', - 'navigationMenus' => 'controllers/tab/settings/navigationMenus/form/navigationMenuSettingsForm.tpl', - ))); - } - - - // - // Extended methods from SettingsTabHandler - // - /** - * @see PKPHandler::authorize() - */ - function authorize($request, &$args, $roleAssignments) { - import('lib.pkp.classes.security.authorization.PolicySet'); - $rolePolicy = new PolicySet(COMBINING_PERMIT_OVERRIDES); - - import('lib.pkp.classes.security.authorization.RoleBasedHandlerOperationPolicy'); - foreach($roleAssignments as $role => $operations) { - $rolePolicy->addPolicy(new RoleBasedHandlerOperationPolicy($request, $role, $operations)); - } - $this->addPolicy($rolePolicy); - - return parent::authorize($request, $args, $roleAssignments); - } - - /** - * @copydoc PKPHandler::initialize() - */ - function initialize($request) { - parent::initialize($request); - - // Load grid-specific translations - AppLocale::requireComponents( - LOCALE_COMPONENT_PKP_ADMIN, - LOCALE_COMPONENT_APP_ADMIN, - LOCALE_COMPONENT_PKP_MANAGER, - LOCALE_COMPONENT_APP_MANAGER - ); - } - - - // - // Public methods. - // - /** - * Show the upload image form. - * @param $request Request - * @param $args array - * @return JSONMessage JSON object - */ - function showFileUploadForm($args, $request) { - $fileUploadForm = $this->_getFileUploadForm($request); - $fileUploadForm->initData(); - - return new JSONMessage(true, $fileUploadForm->fetch($request)); - } - - /** - * Upload a new file. - * @param $args array - * @param $request PKPRequest - * @return JSONMessage JSON object - */ - function uploadFile($args, $request) { - $fileUploadForm =& $this->_getFileUploadForm($request); - $temporaryFileId = $fileUploadForm->uploadFile($request); - - if ($temporaryFileId !== false) { - $json = new JSONMessage(); - $json->setAdditionalAttributes(array( - 'temporaryFileId' => $temporaryFileId - )); - return $json; - } else { - return new JSONMessage(false, __('common.uploadFailed')); - } - } - - /** - * Save an uploaded file. - * @param $args array - * @param $request PKPRequest - * @return JSONMessage JSON object - */ - function saveFile($args, $request) { - $fileUploadForm = $this->_getFileUploadForm($request); - $fileUploadForm->readInputData(); - - if ($fileUploadForm->validate()) { - if ($fileUploadForm->execute()) { - // Generate a JSON message with an event - $settingName = $request->getUserVar('fileSettingName'); - return DAO::getDataChangedEvent($settingName); - } - } - return new JSONMessage(false, __('common.invalidFileType')); - } - - /** - * Deletes a context image. - * @param $args array - * @param $request PKPRequest - * @return JSONMessage JSON object - */ - function deleteFile($args, $request) { - $settingName = $request->getUserVar('fileSettingName'); - - $tabForm = $this->getTabForm(); - $tabForm->initData(); - - if ($request->checkCSRF() && $tabForm->deleteFile($settingName, $request)) { - return DAO::getDataChangedEvent($settingName); - } - return new JSONMessage(false); - } - - /** - * Fetch a file that have been uploaded. - * - * @param $args array - * @param $request Request - * @return JSONMessage JSON object - */ - function fetchFile($args, $request) { - // Get the setting name. - $settingName = $args['settingName']; - - // Try to fetch the file. - $tabForm = $this->getTabForm(); - $tabForm->initData(); - - $renderedElement = $tabForm->renderFileView($settingName, $request); - - $json = new JSONMessage(); - if ($renderedElement == false) { - $json->setAdditionalAttributes(array('noData' => $settingName)); - } else { - $json->setElementId($settingName); - $json->setContent($renderedElement); - } - return $json; - } - - - // - // Private helper methods. - // - /** - * Returns a file upload form based on the uploaded file type. - * @param $request Request - * @return Form - */ - function &_getFileUploadForm($request) { - $settingName = $request->getUserVar('fileSettingName'); - $fileType = $request->getUserVar('fileType'); - - switch ($fileType) { - case 'image': - import('lib.pkp.controllers.tab.settings.siteSetup.form.NewSiteImageFileForm'); - $fileUploadForm = new NewSiteImageFileForm($settingName); - break; - case 'css': - import('lib.pkp.controllers.tab.settings.siteSetup.form.NewSiteCssFileForm'); - $fileUploadForm = new NewSiteCssFileForm($settingName); - break; - default: - assert(false); - break; - } - - return $fileUploadForm; - } -} diff --git a/controllers/tab/settings/ManagerSettingsTabHandler.inc.php b/controllers/tab/settings/ManagerSettingsTabHandler.inc.php deleted file mode 100644 index b84ae405a17..00000000000 --- a/controllers/tab/settings/ManagerSettingsTabHandler.inc.php +++ /dev/null @@ -1,79 +0,0 @@ -addPolicy(new ContextAccessPolicy($request, $roleAssignments)); - return parent::authorize($request, $args, $roleAssignments); - } - - - // - // Getters and Setters - // - /** - * Get if the current tab is in wizard mode. - * @return boolean - */ - function getWizardMode() { - return $this->_wizardMode; - } - - /** - * Set if the current tab is in wizard mode. - * @param $wizardMode boolean - */ - function setWizardMode($wizardMode) { - $this->_wizardMode = (boolean)$wizardMode; - } - - - // - // Extended methods from SettingsTabHandler - // - /** - * @copydoc SettingsTabHandler::initialize() - */ - function initialize($request) { - $this->setWizardMode($request->getUserVar('wizardMode')); - - parent::initialize($request); - - // Load handler specific translations. - AppLocale::requireComponents(LOCALE_COMPONENT_PKP_MANAGER, LOCALE_COMPONENT_APP_MANAGER, LOCALE_COMPONENT_PKP_GRID); - } -} - - diff --git a/controllers/tab/settings/PKPDistributionSettingsTabHandler.inc.php b/controllers/tab/settings/PKPDistributionSettingsTabHandler.inc.php deleted file mode 100644 index 0ca0f31d425..00000000000 --- a/controllers/tab/settings/PKPDistributionSettingsTabHandler.inc.php +++ /dev/null @@ -1,95 +0,0 @@ -addRoleAssignment( - ROLE_ID_MANAGER, - array('getPaymentMethods', 'getPaymentFormContents', 'resetPermissions') - ); - $this->setPageTabs(array( - 'indexing' => 'lib.pkp.controllers.tab.settings.contextIndexing.form.ContextIndexingForm', - 'paymentMethod' => 'lib.pkp.controllers.tab.settings.paymentMethod.form.PaymentMethodForm', - )); - } - - /** - * Expose payment methods via AHAX for selection on the payment tab. - * @param $args array - * @param $request PKPRequest - * @return JSONMessage JSON response. - */ - function getPaymentMethods($args, $request) { - // Expose names of payment plugins to template. - $pluginNames = array(__('manager.paymentMethod.none')); - $pluginNames += array_map( - function($a) { - return $a->getDisplayName(); - }, - PluginRegistry::loadCategory('paymethod') - ); - return new JSONMessage(true, $pluginNames); - } - - /** - * Get the form contents for the given payment method. - * @param $args array - * @param $request PKPRequest - * @return JSONMessage JSON response. - */ - function getPaymentFormContents($args, $request) { - $paymentPluginName = $request->getUserVar('paymentPluginName'); - $plugins = PluginRegistry::loadCategory('paymethod'); - if (!isset($plugins[$paymentPluginName])) { - // Invalid plugin name - return new JSONMessage(false); - } else { - // Fetch and return the JSON-encoded form contents - $plugin =& $plugins[$paymentPluginName]; - $form = $plugin->getSettingsForm($request->getContext()); - $form->initData(); - return new JSONMessage(true, $form->fetch($request)); - } - } - - /** - * Reset permissions data assigned to existing submissions. - * @param $args array - * @param $request PKPRequest - * @return JSONMessage JSON response. - */ - function resetPermissions($args, $request) { - $context = $request->getContext(); - $submissionDao = Application::getSubmissionDAO(); - $submissionDao->deletePermissions($context->getId()); - - $notificationManager = new NotificationManager(); - $user = $request->getUser(); - $notificationManager->createTrivialNotification($user->getId()); - - return new JSONMessage(true); - } -} - - diff --git a/controllers/tab/settings/affiliation/form/AffiliationForm.inc.php b/controllers/tab/settings/affiliation/form/AffiliationForm.inc.php deleted file mode 100644 index b44ba5c4ded..00000000000 --- a/controllers/tab/settings/affiliation/form/AffiliationForm.inc.php +++ /dev/null @@ -1,45 +0,0 @@ - 'string', - 'contributorNote' => 'string' - ); - - parent::__construct($settings, 'controllers/tab/settings/affiliation/form/affiliationForm.tpl', $wizardMode); - } - - - // - // Implement template methods from Form. - // - /** - * @copydoc Form::getLocaleFieldNames() - */ - function getLocaleFieldNames() { - return array('sponsorNote', 'contributorNote'); - } -} - - diff --git a/controllers/tab/settings/announcements/form/AnnouncementSettingsForm.inc.php b/controllers/tab/settings/announcements/form/AnnouncementSettingsForm.inc.php deleted file mode 100644 index 12aff5d5c01..00000000000 --- a/controllers/tab/settings/announcements/form/AnnouncementSettingsForm.inc.php +++ /dev/null @@ -1,66 +0,0 @@ - 'bool', - 'enableAnnouncementsHomepage' => 'bool', - 'numAnnouncementsHomepage' => 'int', - 'announcementsIntroduction' => 'string', - ); - - parent::__construct($settings, 'controllers/tab/settings/announcements/form/announcementSettingsForm.tpl', $wizardMode); - } - - - // - // Implement template methods from Form. - // - /** - * @copydoc Form::getLocaleFieldNames() - */ - function getLocaleFieldNames() { - return array('announcementsIntroduction'); - } - - - // - // Implement template methods from ContextSettingsForm. - // - /** - * @copydoc ContextSettingsForm::fetch() - */ - function fetch($request, $template = null, $display = false, $params = null) { - for($x = 1; $x < 11; $x++) { - $numAnnouncementsHomepageOptions[$x] = $x; - } - - $params = array( - 'numAnnouncementsHomepageOptions' => $numAnnouncementsHomepageOptions, - 'disableAnnouncementsHomepage' => !$this->getData('enableAnnouncementsHomepage') - ); - - return parent::fetch($request, $template, $display, $params); - } -} - - diff --git a/controllers/tab/settings/appearance/form/NewContextCssFileForm.inc.php b/controllers/tab/settings/appearance/form/NewContextCssFileForm.inc.php deleted file mode 100644 index 7d9cd04634e..00000000000 --- a/controllers/tab/settings/appearance/form/NewContextCssFileForm.inc.php +++ /dev/null @@ -1,84 +0,0 @@ -setFileSettingName($cssSettingName); - } - - - // - // Extend methods from SettingsFileUploadForm. - // - /** - * @copydoc SettingsFileUploadForm::fetch() - */ - function fetch($request, $template = null, $display = false, $params = null) { - $params = array('fileType' => 'css'); - return parent::fetch($request, $template, $display, $params); - } - - - // - // Extend methods from Form. - // - /** - * Save the new image file. - */ - function execute() { - $request = Application::getRequest(); - $temporaryFile = $this->fetchTemporaryFile($request); - - import('classes.file.PublicFileManager'); - $publicFileManager = new PublicFileManager(); - - if (is_a($temporaryFile, 'TemporaryFile')) { - $type = $temporaryFile->getFileType(); - if ($type != 'text/plain' && $type != 'text/css') { - return false; - } - - $settingName = $this->getFileSettingName(); - $uploadName = $settingName . '.css'; - $context = $request->getContext(); - if($publicFileManager->copyContextFile($context->getAssocType(), $context->getId(), $temporaryFile->getFilePath(), $uploadName)) { - $value = array( - 'name' => $temporaryFile->getOriginalFileName(), - 'uploadName' => $uploadName, - 'dateUploaded' => Core::getCurrentDate() - ); - - $settingsDao = $context->getSettingsDAO(); - $settingsDao->updateSetting($context->getId(), $settingName, $value, 'object'); - - // Clean up the temporary file - $this->removeTemporaryFile($request); - - return true; - } - } - return false; - } -} - - diff --git a/controllers/tab/settings/appearance/form/NewContextImageFileForm.inc.php b/controllers/tab/settings/appearance/form/NewContextImageFileForm.inc.php deleted file mode 100644 index 2bda6c95810..00000000000 --- a/controllers/tab/settings/appearance/form/NewContextImageFileForm.inc.php +++ /dev/null @@ -1,132 +0,0 @@ -setFileSettingName($imageSettingName); - } - - - // - // Extend methods from SettingsFileUploadForm. - // - /** - * @copydoc SettingsFileUploadForm::fetch() - */ - function fetch($request, $template = null, $display = false, $params = null) { - $params = array('fileType' => 'image'); - return parent::fetch($request, $template, $display, $params); - } - - - // - // Extend methods from Form. - // - /** - * @copydoc Form::getLocaleFieldNames() - */ - function getLocaleFieldNames() { - return array('imageAltText'); - } - - /** - * @copydoc SettingsFileUploadForm::initData() - */ - function initData() { - $request = Application::getRequest(); - $context = $request->getContext(); - $fileSettingName = $this->getFileSettingName(); - - $image = $context->getSetting($fileSettingName); - $imageAltText = array(); - - $supportedLocales = AppLocale::getSupportedLocales(); - foreach ($supportedLocales as $key => $locale) { - if (!isset($image[$key]['altText'])) continue; - $imageAltText[$key] = $image[$key]['altText']; - } - - $this->setData('imageAltText', $imageAltText); - } - - /** - * @copydoc Form::readInputData() - */ - function readInputData() { - $this->readUserVars(array('imageAltText')); - - parent::readInputData(); - } - - /** - * Save the new image file. - */ - function execute() { - $request = Application::getRequest(); - $temporaryFile = $this->fetchTemporaryFile($request); - - import('classes.file.PublicFileManager'); - $publicFileManager = new PublicFileManager(); - - if (is_a($temporaryFile, 'TemporaryFile')) { - $type = $temporaryFile->getFileType(); - $extension = $publicFileManager->getImageExtension($type); - if (!$extension) { - return false; - } - $locale = AppLocale::getLocale(); - $context = $request->getContext(); - - $uploadName = $this->getFileSettingName() . '_' . $locale . $extension; - if($publicFileManager->copyContextFile($context->getAssocType(), $context->getId(), $temporaryFile->getFilePath(), $uploadName)) { - - // Get image dimensions - $filePath = $publicFileManager->getContextFilesPath($context->getAssocType(), $context->getId()); - list($width, $height) = getimagesize($filePath . '/' . $uploadName); - - $value = $context->getSetting($this->getFileSettingName()); - $imageAltText = $this->getData('imageAltText'); - - $value[$locale] = array( - 'name' => $temporaryFile->getOriginalFileName(), - 'uploadName' => $uploadName, - 'width' => $width, - 'height' => $height, - 'dateUploaded' => Core::getCurrentDate(), - 'altText' => isset($imageAltText[$locale])?$imageAltText[$locale]:null - ); - - $settingsDao = $context->getSettingsDAO(); - $settingsDao->updateSetting($context->getId(), $this->getFileSettingName(), $value, 'object', true); - - // Clean up the temporary file. - $this->removeTemporaryFile($request); - - return true; - } - } - return false; - } -} - - diff --git a/controllers/tab/settings/appearance/form/PKPAppearanceForm.inc.php b/controllers/tab/settings/appearance/form/PKPAppearanceForm.inc.php deleted file mode 100644 index 7805b06d69a..00000000000 --- a/controllers/tab/settings/appearance/form/PKPAppearanceForm.inc.php +++ /dev/null @@ -1,350 +0,0 @@ - 'string', - 'pageHeader' => 'string', - 'pageFooter' => 'string', - 'navItems' => 'object', - 'itemsPerPage' => 'int', - 'numPageLinks' => 'int', - 'themePluginPath' => 'string', - )); - - AppLocale::requireComponents(LOCALE_COMPONENT_APP_COMMON); - - $themes = PluginRegistry::getPlugins('themes'); - if (is_null($themes)) { - PluginRegistry::loadCategory('themes', true); - } - - parent::__construct($settings, 'controllers/tab/settings/appearance/form/appearanceForm.tpl', $wizardMode); - } - - - // - // Getters and Setters - // - /** - * Get the images settings name (setting name => alt text locale key). - * @return array - */ - function getImagesSettingsName() { - return array( - 'homepageImage' => 'common.homepageImage.altText', - 'pageHeaderLogoImage' => 'common.pageHeaderLogo.altText', - 'favicon' => 'common.favicon.altText', - ); - } - - // - // Implement template methods from Form. - // - /** - * @copydoc Form::getLocaleFieldNames() - */ - function getLocaleFieldNames() { - return array( - 'additionalHomeContent', - 'pageHeader', - 'pageFooter', - ); - } - - - // - // Extend methods from ContextSettingsForm. - // - /** - * @copydoc ContextSettingsForm::fetch() - */ - function fetch($request, $template = null, $display = false, $params = null) { - // Get all upload form image link actions. - $uploadImageLinkActions = array(); - foreach ($this->getImagesSettingsName() as $settingName => $altText) { - $uploadImageLinkActions[$settingName] = $this->_getFileUploadLinkAction($settingName, 'image', $request); - } - // Get the css upload link action. - $uploadCssLinkAction = $this->_getFileUploadLinkAction('styleSheet', 'css', $request); - - $imagesViews = $this->_renderAllFormImagesViews($request); - $cssView = $this->renderFileView('styleSheet', $request); - - $templateMgr = TemplateManager::getManager($request); - $templateMgr->assign('uploadImageLinkActions', $uploadImageLinkActions); - $templateMgr->assign('uploadCssLinkAction', $uploadCssLinkAction); - - $themePlugins = PluginRegistry::getPlugins('themes'); - if (is_null($themePlugins)) { - $themePlugins = PluginRegistry::loadCategory('themes', true); - } - $enabledThemes = array(); - $activeThemeOptions = array(); - foreach ($themePlugins as $themePlugin) { - if ($themePlugin->getEnabled()) { - $enabledThemes[basename($themePlugin->getPluginPath())] = $themePlugin->getDisplayName(); - } - if ($themePlugin->isActive()) { - $activeThemeOptions = $themePlugin->getOptionsConfig(); - $activeThemeOptionsValues = $themePlugin->getOptionValues(); - foreach ($activeThemeOptions as $name => $option) { - $activeThemeOptions[$name]['value'] = isset($activeThemeOptionsValues[$name]) ? $activeThemeOptionsValues[$name] : ''; - } - } - } - $templateMgr->assign(array( - 'enabledThemes' => $enabledThemes, - 'activeThemeOptions' => $activeThemeOptions, - )); - - $params = array( - 'imagesViews' => $imagesViews, - 'styleSheetView' => $cssView, - 'locale' => AppLocale::getLocale() - ); - - return parent::fetch($request, $template, $display, $params); - } - - - // - // Public methods. - // - /** - * Render a template to show details about an uploaded file in the form - * and a link action to delete it. - * @param $fileSettingName string The uploaded file setting name. - * @param $request Request - * @return string - */ - function renderFileView($fileSettingName, $request) { - $file = $this->getData($fileSettingName); - $locale = AppLocale::getLocale(); - - // Check if the file is localized. - if (!is_null($file) && key_exists($locale, $file)) { - // We use the current localized file value. - $file = $file[$locale]; - } - - // Only render the file view if we have a file. - if (is_array($file)) { - $templateMgr = TemplateManager::getManager($request); - $deleteLinkAction = $this->_getDeleteFileLinkAction($fileSettingName, $request); - - // Get the right template to render the view. - $imagesSettingsName = $this->getImagesSettingsName(); - if (in_array($fileSettingName, array_keys($imagesSettingsName))) { - $template = 'controllers/tab/settings/formImageView.tpl'; - - // Get the common alternate text for the image. - $localeKey = $imagesSettingsName[$fileSettingName]; - $commonAltText = __($localeKey); - $templateMgr->assign('commonAltText', $commonAltText); - } else { - $template = 'controllers/tab/settings/formFileView.tpl'; - } - - $templateMgr->assign('file', $file); - $templateMgr->assign('deleteLinkAction', $deleteLinkAction); - $templateMgr->assign('fileSettingName', $fileSettingName); - - return $templateMgr->fetch($template); - } else { - return null; - } - } - - /** - * Delete an uploaded file. - * @param $fileSettingName string - * @param $request PKPRequest - * @return boolean - */ - function deleteFile($fileSettingName, $request) { - $context = $request->getContext(); - $locale = AppLocale::getLocale(); - - // Get the file. - $file = $this->getData($fileSettingName); - - // Check if the file is localized. - if (key_exists($locale, $file)) { - // We use the current localized file value. - $file = $file[$locale]; - } else { - $locale = null; - } - - // Deletes the file and its settings. - import('classes.file.PublicFileManager'); - $publicFileManager = new PublicFileManager(); - if ($publicFileManager->removeContextFile($context->getAssocType(), $context->getId(), $file['uploadName'])) { - $settingsDao = $context->getSettingsDao(); - $settingsDao->deleteSetting($context->getId(), $fileSettingName, $locale); - return true; - } else { - return false; - } - } - - /** - * @copydoc ContextSettingsForm::execute() - */ - function execute() { - $request = Application::getRequest(); - - // Clear the template cache if theme has changed - $context = $request->getContext(); - if ($this->getData('themePluginPath') != $context->getSetting('themePluginPath')) { - $templateMgr = TemplateManager::getManager($request); - $templateMgr->clearTemplateCache(); - $templateMgr->clearCssCache(); - } - - parent::execute(); - - // Save block plugins context positions. - import('lib.pkp.classes.controllers.listbuilder.ListbuilderHandler'); - ListbuilderHandler::unpack($request, $request->getUserVar('blocks'), array($this, 'deleteEntry'), array($this, 'insertEntry'), array($this, 'updateEntry')); - } - - /** - * Overriden method from ListbuilderHandler. - * @param $request Request - * @param $rowId mixed - * @param $newRowId array - */ - function updateEntry($request, $rowId, $newRowId) { - $plugins =& PluginRegistry::loadCategory('blocks'); - $plugin =& $plugins[$rowId]; // Ref hack - switch ($newRowId['listId']) { - case 'unselected': - $plugin->setEnabled(false); - break; - case 'sidebarContext': - $plugin->setEnabled(true); - $plugin->setBlockContext(BLOCK_CONTEXT_SIDEBAR); - $plugin->setSeq((int) $newRowId['sequence']); - break; - default: - assert(false); - } - } - - /** - * Avoid warnings when Listbuilder::unpack tries to call this method. - */ - function deleteEntry() { - return false; - } - - /** - * Avoid warnings when Listbuilder::unpack tries to call this method. - */ - function insertEntry() { - return false; - } - - - // - // Private helper methods - // - /** - * Render all form images views. - * @param $request Request - * @return array - */ - function _renderAllFormImagesViews($request) { - $imagesViews = array(); - foreach ($this->getImagesSettingsName() as $imageSettingName => $altText) { - $imagesViews[$imageSettingName] = $this->renderFileView($imageSettingName, $request); - } - - return $imagesViews; - } - - /** - * Get a link action for file upload. - * @param $settingName string - * @param $fileType string The uploaded file type. - * @param $request Request - * @return LinkAction - */ - function _getFileUploadLinkAction($settingName, $fileType, $request) { - $router = $request->getRouter(); - import('lib.pkp.classes.linkAction.request.AjaxModal'); - import('lib.pkp.classes.linkAction.LinkAction'); - return new LinkAction( - 'uploadFile-' . $settingName, - new AjaxModal( - $router->url( - $request, null, null, 'showFileUploadForm', null, array( - 'fileSettingName' => $settingName, - 'fileType' => $fileType - ) - ), - __('common.upload'), - 'modal_add_file' - ), - __('common.upload'), - 'add' - ); - } - - /** - * Get the delete file link action. - * @param $settingName string File setting name. - * @param $request Request - * @return LinkAction - */ - function _getDeleteFileLinkAction($settingName, $request) { - $router = $request->getRouter(); - import('lib.pkp.classes.linkAction.request.RemoteActionConfirmationModal'); - - return new LinkAction( - 'deleteFile-' . $settingName, - new RemoteActionConfirmationModal( - $request->getSession(), - __('common.confirmDelete'), null, - $router->url( - $request, null, null, 'deleteFile', null, array( - 'fileSettingName' => $settingName, - 'tab' => 'appearance' - ) - ), - 'modal_delete' - ), - __('common.delete'), - null - ); - } -} - - diff --git a/controllers/tab/settings/archiving/form/ArchivingForm.inc.php b/controllers/tab/settings/archiving/form/ArchivingForm.inc.php deleted file mode 100644 index 1bcd818d97b..00000000000 --- a/controllers/tab/settings/archiving/form/ArchivingForm.inc.php +++ /dev/null @@ -1,168 +0,0 @@ - 'bool', - 'enableClockss' => 'bool', - 'enablePln' => 'bool', - 'enablePortico' => 'bool' - ); - - $this->addCheck(new FormValidatorCSRF($this)); - - parent::__construct($settings, 'controllers/tab/settings/archiving/form/archivingForm.tpl', $wizardMode); - } - - /** - * @copydoc ContextSettingsForm::fetch() - */ - function fetch($request, $template = null, $display = false, $params = null) { - $isPLNPluginInstalled = false; - $isPLNPluginEnabled = false; - $isPorticoPluginInstalled = false; - - $context = $request->getContext(); - - // Get if PLNPlugin is installed - $versionDao = DAORegistry::getDAO('VersionDAO'); - $currentPLNVersion = $versionDao->getCurrentVersion("plugins.generic", "pln", true); - if (isset($currentPLNVersion)) { - $isPLNPluginInstalled = true; - } - - // Get if PLNPlugin is enabled - $pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO'); - if ($pluginSettingsDao->settingExists($context->getId(), 'plnplugin', 'enabled')) { - $isPLNPluginEnabled = $pluginSettingsDao->getSetting($context->getId(), 'plnplugin', 'enabled'); - } - - // Get if Portico is installed - $currentPorticoVersion = $versionDao->getCurrentVersion("plugins.importexport", "portico", true); - if (isset($currentPorticoVersion)) { - $isPorticoPluginInstalled = true; - } - - $plnSettingsShowAction = $this->_getPLNPluginSettingsLinkAction($request); - - $params = array( - 'isPLNPluginInstalled' => $isPLNPluginInstalled, - 'isPLNPluginEnabled' => $isPLNPluginEnabled, - 'isPorticoPluginInstalled' => $isPorticoPluginInstalled, - 'plnSettingsShowAction' => $plnSettingsShowAction, - ); - - return parent::fetch($request, $template, $display, $params); - } - - // - // Implement template methods from Form. - // - /** - * @copydoc Form::getLocaleFieldNames() - */ - function getLocaleFieldNames() { - return array('lockssLicense', 'clockssLicense'); - } - - /** - * @see Form::execute() - */ - function execute() { - parent::execute(); - - $request = Application::getRequest(); - $this->enablePlugin($request, 'plugins.generic', 'generic', 'pln', 'enablePln'); - $this->enablePlugin($request, 'plugins.importexport', 'importexport', 'portico', 'enablePortico'); - - return new JSONMessage(true, $this->fetch($request)); - } - - /** - * Get a link action for PLN Plugin Settings. - * @param $request Request - * @return LinkAction - */ - function _getPLNPluginSettingsLinkAction($request) { - $router = $request->getRouter(); - import('lib.pkp.classes.linkAction.request.AjaxModal'); - - $ajaxModal = new AjaxModal( - $router->url($request, null, 'grid.settings.plugins.SettingsPluginGridHandler', 'manage', null, array('verb' => 'settings', 'plugin' => 'plnplugin', 'category' => 'generic')), - 'PLN Plugin' - ); - - import('lib.pkp.classes.linkAction.LinkAction'); - $linkAction = new LinkAction( - 'pln-settings', - $ajaxModal, - __('manager.plugins.settings'), - null - ); - - return $linkAction; - } - - /** - * Enable plugin by using check box. - * @param $request Request - * @param $pluginType string - * @param $pluginCategory string - * @param $pluginName string - * @param $parameterName string - * - */ - function enablePlugin($request, $pluginType, $pluginCategory, $pluginName, $parameterName) { - $versionDao = DAORegistry::getDAO('VersionDAO'); - $product = $versionDao->getCurrentVersion($pluginType, $pluginName, true); - if (isset($product)) { - $plugin = PluginRegistry::loadPlugin($pluginCategory, $pluginName); - if ($plugin && is_object($plugin)) { - $notification = null; - - if (isset($this->_data[$parameterName])) { - if (!$plugin->getEnabled()) { - if ($plugin->getCanEnable()) { - $plugin->setEnabled(true); - $notification = NOTIFICATION_TYPE_PLUGIN_ENABLED; - } - } - } else { - if ($plugin->getEnabled()) { - if ($plugin->getCanDisable()) { - $plugin->setEnabled(false); - $notification = NOTIFICATION_TYPE_PLUGIN_DISABLED; - } - } - } - - if (isset($notification)) { - $user = $request->getUser(); - $notificationManager = new NotificationManager(); - $notificationManager->createTrivialNotification($user->getId(), $notification, array('pluginName' => $plugin->getDisplayName())); - } - } - } - } -} - - diff --git a/controllers/tab/settings/contact/form/ContactForm.inc.php b/controllers/tab/settings/contact/form/ContactForm.inc.php deleted file mode 100644 index c7019be6176..00000000000 --- a/controllers/tab/settings/contact/form/ContactForm.inc.php +++ /dev/null @@ -1,59 +0,0 @@ - 'string', - 'contactName' => 'string', - 'contactTitle' => 'string', - 'contactAffiliation' => 'string', - 'contactEmail' => 'string', - 'contactPhone' => 'string', - 'supportName' => 'string', - 'supportEmail' => 'string', - 'supportPhone' => 'string' - ); - - parent::__construct($settings, 'controllers/tab/settings/contact/form/contactForm.tpl', $wizardMode); - - $this->addCheck(new FormValidator($this, 'contactName', 'required', 'manager.setup.form.contactNameRequired')); - $this->addCheck(new FormValidatorEmail($this, 'contactEmail', 'required', 'manager.setup.form.contactEmailRequired')); - if (!$this->getWizardMode()) { - $this->addCheck(new FormValidator($this, 'mailingAddress', 'required', 'manager.setup.form.supportNameRequired')); - $this->addCheck(new FormValidator($this, 'supportName', 'required', 'manager.setup.form.supportNameRequired')); - $this->addCheck(new FormValidatorEmail($this, 'supportEmail', 'required', 'manager.setup.form.supportEmailRequired')); - } - } - - - // - // Implement template methods from Form. - // - /** - * @copydoc Form::getLocaleFieldNames() - */ - function getLocaleFieldNames() { - return array('contactTitle', 'contactAffiliation'); - } -} - - diff --git a/controllers/tab/settings/contextIndexing/form/ContextIndexingForm.inc.php b/controllers/tab/settings/contextIndexing/form/ContextIndexingForm.inc.php deleted file mode 100644 index a64a8be01d8..00000000000 --- a/controllers/tab/settings/contextIndexing/form/ContextIndexingForm.inc.php +++ /dev/null @@ -1,44 +0,0 @@ - 'string', - 'customHeaders' => 'string' - ); - - parent::__construct($settings, 'controllers/tab/settings/contextIndexing/form/contextIndexingForm.tpl', $wizardMode); - } - - - // - // Implement template methods from Form. - // - /** - * Get all locale field names - */ - function getLocaleFieldNames() { - return array('searchDescription', 'customHeaders'); - } -} - - diff --git a/controllers/tab/settings/emailTemplates/form/EmailTemplatesForm.inc.php b/controllers/tab/settings/emailTemplates/form/EmailTemplatesForm.inc.php deleted file mode 100644 index bbf7335eecb..00000000000 --- a/controllers/tab/settings/emailTemplates/form/EmailTemplatesForm.inc.php +++ /dev/null @@ -1,55 +0,0 @@ - 'string', - 'envelopeSender' => 'string' - ); - - $this->addCheck(new FormValidatorEmail($this, 'envelopeSender', 'optional', 'user.profile.form.emailRequired')); - - parent::__construct($settings, 'controllers/tab/settings/emailTemplates/form/emailTemplatesForm.tpl', $wizardMode); - } - - - // - // Implement template methods from Form. - // - /** - * @copydoc ContextSettingsForm::fetch() - */ - function fetch($request, $template = null, $display = false, $params = null) { - $context = $request->getContext(); - $dispatcher = $request->getDispatcher(); - return parent::fetch($request, $template, $display, array( - 'envelopeSenderDisabled' => !Config::getVar('email', 'allow_envelope_sender') || Config::getVar('email', 'force_default_envelope_sender') && Config::getVar('email', 'default_envelope_sender'), - 'emailVariables' => array( - 'contextName' => $context->getLocalizedName(), - 'senderName' => __('email.senderName'), - 'senderEmail' => __('email.senderEmail'), - ), - )); - } -} - - diff --git a/controllers/tab/settings/form/SettingsFileUploadForm.inc.php b/controllers/tab/settings/form/SettingsFileUploadForm.inc.php deleted file mode 100644 index 9b428b58072..00000000000 --- a/controllers/tab/settings/form/SettingsFileUploadForm.inc.php +++ /dev/null @@ -1,131 +0,0 @@ -addCheck(new FormValidator($this, 'temporaryFileId', 'required', 'manager.website.imageFileRequired')); - } - - - // - // Getters and setters. - // - /** - * Get the image that this form will upload a file to. - * @return string - */ - function getFileSettingName() { - return $this->_fileSettingName; - } - - /** - * Set the image that this form will upload a file to. - * @param $image string - */ - function setFileSettingName($fileSettingName) { - $this->_fileSettingName = $fileSettingName; - } - - - // - // Implement template methods from Form. - // - /** - * @copydoc Form::readInputData() - */ - function readInputData() { - $this->readUserVars(array('temporaryFileId')); - } - - /** - * @see Form::fetch() - * @param $params template parameters - */ - function fetch($request, $template = null, $display = false, $params = null) { - $templateMgr = TemplateManager::getManager($request); - - if (!is_null($params)) { - $templateMgr->assign($params); - } - $templateMgr->assign('fileSettingName', $this->getFileSettingName()); - - return parent::fetch($request, $template, $display); - } - - - // - // Public methods - // - /** - * Fecth the temporary file. - * @param $request Request - * @return TemporaryFile - */ - function fetchTemporaryFile($request) { - $user = $request->getUser(); - - $temporaryFileDao = DAORegistry::getDAO('TemporaryFileDAO'); - $temporaryFile = $temporaryFileDao->getTemporaryFile( - $this->getData('temporaryFileId'), - $user->getId() - ); - return $temporaryFile; - } - - /** - * Clean temporary file. - * @param $request Request - */ - function removeTemporaryFile($request) { - $user = $request->getUser(); - - import('lib.pkp.classes.file.TemporaryFileManager'); - $temporaryFileManager = new TemporaryFileManager(); - $temporaryFileManager->deleteById($this->getData('temporaryFileId'), $user->getId()); - } - - /** - * Upload a temporary file. - * @param $request Request - */ - function uploadFile($request) { - $user = $request->getUser(); - - import('lib.pkp.classes.file.TemporaryFileManager'); - $temporaryFileManager = new TemporaryFileManager(); - $temporaryFile = $temporaryFileManager->handleUpload('uploadedFile', $user->getId()); - - if ($temporaryFile) return $temporaryFile->getId(); - - return false; - } -} - - diff --git a/controllers/tab/settings/guidelines/form/GuidelinesForm.inc.php b/controllers/tab/settings/guidelines/form/GuidelinesForm.inc.php deleted file mode 100644 index 5aa56d2070b..00000000000 --- a/controllers/tab/settings/guidelines/form/GuidelinesForm.inc.php +++ /dev/null @@ -1,43 +0,0 @@ - 'string' - ); - - parent::__construct($settings, 'controllers/tab/settings/guidelines/form/guidelinesForm.tpl', $wizardMode); - } - - - // - // Implement template methods from Form. - // - /** - * @copydoc Form::getLocaleFieldNames() - */ - function getLocaleFieldNames() { - return array('authorGuidelines'); - } -} - - diff --git a/controllers/tab/settings/information/form/InformationForm.inc.php b/controllers/tab/settings/information/form/InformationForm.inc.php deleted file mode 100644 index 6303613b9ec..00000000000 --- a/controllers/tab/settings/information/form/InformationForm.inc.php +++ /dev/null @@ -1,45 +0,0 @@ - 'string', - 'authorInformation' => 'string', - 'librarianInformation' => 'string' - ); - - parent::__construct($settings, 'controllers/tab/settings/information/form/informationForm.tpl', $wizardMode); - } - - - // - // Implement template methods from Form. - // - /** - * @copydoc Form::getLocaleFieldNames() - */ - function getLocaleFieldNames() { - return array('readerInformation', 'authorInformation', 'librarianInformation'); - } -} - - diff --git a/controllers/tab/settings/navigationMenus/form/NavigationMenuSettingsForm.inc.php b/controllers/tab/settings/navigationMenus/form/NavigationMenuSettingsForm.inc.php deleted file mode 100644 index c78d1ed67d0..00000000000 --- a/controllers/tab/settings/navigationMenus/form/NavigationMenuSettingsForm.inc.php +++ /dev/null @@ -1,40 +0,0 @@ - 'bool', - 'paymentPluginName' => 'string', - 'currency' => 'string', - ); - - parent::__construct($settings, 'controllers/tab/settings/paymentMethod/form/paymentMethodForm.tpl', $wizardMode); - $this->paymentPlugins = PluginRegistry::loadCategory('paymethod'); - } - - /** - * @copydoc ContextSettingsForm::initData() - */ - function initData() { - parent::initData(); - $request = Application::getRequest(); - $paymentPluginName = $this->getData('paymentPluginName'); - if (!isset($this->paymentPlugins[$paymentPluginName])) return; - $plugin = $this->paymentPlugins[$paymentPluginName]; - $this->settingsForm = $plugin->getSettingsForm($request->getContext()); - $this->settingsForm->initData(); - } - - /** - * @copydoc ContextSettingsForm::fetch() - */ - function fetch($request, $template = null, $display = false, $params = null) { - $templateMgr = TemplateManager::getManager($request); - $currencyDao = DAORegistry::getDAO('CurrencyDAO'); - $currencies = array(); - foreach ($currencyDao->getCurrencies() as $currency) { - $currencies[$currency->getCodeAlpha()] = $currency->getName(); - } - $templateMgr->assign('currencies', $currencies); - return parent::fetch($request, $template, $display, $params); - } - - /** - * @copydoc ContextSettingsForm::readInputData() - */ - function readInputData() { - parent::readInputData(); - - $request = Application::getRequest(); - $paymentPluginName = $this->getData('paymentPluginName'); - if (!isset($this->paymentPlugins[$paymentPluginName])) return false; - $plugin = $this->paymentPlugins[$paymentPluginName]; - $this->settingsForm = $plugin->getSettingsForm($request->getContext()); - $this->settingsForm->readInputData(); - } - - /** - * @copydoc ContextSettingsForm::execute() - */ - function execute() { - $request = Application::getRequest(); - $context = $request->getContext(); - - // Get the selected payment plugin - $paymentPluginName = $this->getData('paymentPluginName'); - if (isset($this->paymentPlugins[$paymentPluginName])) { - $plugin = $this->paymentPlugins[$paymentPluginName]; - $this->settingsForm->execute(); - - // Remove notification. - $notificationDao = DAORegistry::getDAO('NotificationDAO'); - $notificationDao->deleteByAssoc($context->getAssocType(), $context->getId(), null, NOTIFICATION_TYPE_CONFIGURE_PAYMENT_METHOD, $context->getId()); - } else { - // Create notification. - $notificationMgr = new NotificationManager(); - $notificationMgr->createNotification($request, null, NOTIFICATION_TYPE_CONFIGURE_PAYMENT_METHOD, - $context->getId(), $context->getAssocType(), $context->getId(), NOTIFICATION_LEVEL_NORMAL); - } - - return parent::execute(); - } - - /** - * Validate the form. - * @copydoc Form::validate - */ - function validate($callHooks = true) { - if (!$this->settingsForm->validate()) { - foreach ($this->settingsForm->getErrorsArray() as $field => $message) { - $this->addError($field, $message); - } - } - return parent::validate($callHooks); - } -} - - diff --git a/controllers/tab/settings/permissions/form/PermissionSettingsForm.inc.php b/controllers/tab/settings/permissions/form/PermissionSettingsForm.inc.php deleted file mode 100644 index 1f50105a696..00000000000 --- a/controllers/tab/settings/permissions/form/PermissionSettingsForm.inc.php +++ /dev/null @@ -1,66 +0,0 @@ - 'string', - 'copyrightHolderOther' => 'string', - 'copyrightYearBasis' => 'string', - 'copyrightNotice' => 'string', - 'copyrightNoticeAgree' => 'bool', - 'licenseURL' => 'string', - ) - ), - 'controllers/tab/settings/permissions/form/permissionSettingsForm.tpl', - $wizardMode - ); - } - - - // - // Implement template methods from Form. - // - /** - * Get all locale field names - */ - function getLocaleFieldNames() { - return array('copyrightNotice', 'copyrightHolderOther'); - } - - /** - * @copydoc ContextSettingsForm::fetch - */ - function fetch($request, $template = null, $display = false, $params = null) { - $templateMgr = TemplateManager::getManager($request); - AppLocale::requireComponents(LOCALE_COMPONENT_PKP_SUBMISSION); - $templateMgr->assign('ccLicenseOptions', array_merge( - array('' => 'common.other'), - Application::getCCLicenseOptions() - )); - return parent::fetch($request, $template, $display, $params); - } -} - - diff --git a/controllers/tab/settings/reviewStage/form/PKPReviewStageForm.inc.php b/controllers/tab/settings/reviewStage/form/PKPReviewStageForm.inc.php deleted file mode 100644 index 266195e957e..00000000000 --- a/controllers/tab/settings/reviewStage/form/PKPReviewStageForm.inc.php +++ /dev/null @@ -1,82 +0,0 @@ - 'string', - 'competingInterests' => 'string', - 'numWeeksPerResponse' => 'int', - 'numWeeksPerReview' => 'int', - 'numDaysBeforeInviteReminder' => 'int', - 'numDaysBeforeSubmitReminder' => 'int', - 'showEnsuringLink' => 'bool', - 'reviewerCompetingInterestsRequired' => 'bool', - 'defaultReviewMode' => 'int', - ) - ), - $template, - $wizardMode - ); - } - - - // - // Implement template methods from Form. - // - /** - * @copydoc Form::getLocaleFieldNames() - */ - function getLocaleFieldNames() { - return array('reviewGuidelines', 'competingInterests'); - } - - /** - * @copydoc ContextSettingsForm::fetch() - */ - function fetch($request, $template = null, $display = false, $params = array()) { - $templateMgr = TemplateManager::getManager($request); - $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); - $templateMgr->assign(array( - 'numDaysBeforeInviteReminderValues' => array_combine(range(1, 10), range(1, 10)), - 'numDaysBeforeSubmitReminderValues' => array_combine(range(1, 10), range(1, 10)), - 'reviewMethodOptions' => $reviewAssignmentDao->getReviewMethodsTranslationKeys(), - )); - - import('lib.pkp.classes.linkAction.request.ConfirmationModal'); - import('lib.pkp.classes.linkAction.LinkAction'); - return parent::fetch($request, $template, $display, array_merge($params, array( - 'ensuringLink' => new LinkAction( - 'showReviewPolicy', - new ConfirmationModal( - __('review.blindPeerReview'), - __('review.ensuringBlindReview'), 'modal_information', null, null, true, MODAL_WIDTH_DEFAULT), - __('manager.setup.reviewOptions.showBlindReviewLink') - ), - 'scheduledTasksDisabled' => Config::getVar('general', 'scheduled_tasks') ? false : true, - ))); - } -} - - diff --git a/controllers/tab/settings/siteSetup/form/NewSiteCssFileForm.inc.php b/controllers/tab/settings/siteSetup/form/NewSiteCssFileForm.inc.php deleted file mode 100644 index 9bc4f5377d0..00000000000 --- a/controllers/tab/settings/siteSetup/form/NewSiteCssFileForm.inc.php +++ /dev/null @@ -1,79 +0,0 @@ -setFileSettingName($cssSettingName); - } - - - // - // Extend methods from SettingsFileUploadForm. - // - /** - * @copydoc SettingsFileUploadForm::fetch() - */ - function fetch($request, $template = null, $display = false, $params = null) { - $params = array('fileType' => 'css'); - return parent::fetch($request, $template, $display, $params); - } - - - // - // Extend methods from Form. - // - /** - * Save the new image file. - */ - function execute() { - $request = Application::getRequest(); - $temporaryFile = $this->fetchTemporaryFile($request); - - import('classes.file.PublicFileManager'); - $publicFileManager = new PublicFileManager(); - - if (is_a($temporaryFile, 'TemporaryFile')) { - $type = $temporaryFile->getFileType(); - if ($type != 'text/plain' && $type != 'text/css') { - return false; - } - - $settingName = $this->getFileSettingName(); - $site = $request->getSite(); - $uploadName = $site->getSiteStyleFilename(); - if($publicFileManager->copyFile($temporaryFile->getFilePath(), $publicFileManager->getSiteFilesPath() . '/' . $uploadName)) { - $siteDao = DAORegistry::getDAO('SiteDAO'); - $site->setOriginalStyleFilename($temporaryFile->getOriginalFileName()); - $siteDao->updateObject($site); - - // Clean up the temporary file - $this->removeTemporaryFile($request); - - return true; - } - } - return false; - } -} - - diff --git a/controllers/tab/settings/siteSetup/form/NewSiteImageFileForm.inc.php b/controllers/tab/settings/siteSetup/form/NewSiteImageFileForm.inc.php deleted file mode 100644 index 3c4b0f390ce..00000000000 --- a/controllers/tab/settings/siteSetup/form/NewSiteImageFileForm.inc.php +++ /dev/null @@ -1,128 +0,0 @@ -setFileSettingName($imageSettingName); - } - - - // - // Extend methods from Form. - // - /** - * @copydoc SettingsFileUploadForm::initData() - */ - function initData() { - $request = Application::getRequest(); - $site = $request->getSite(); - $fileSettingName = $this->getFileSettingName(); - - $image = $site->getSetting($fileSettingName); - $imageAltText = array(); - - $supportedLocales = AppLocale::getSupportedLocales(); - foreach ($supportedLocales as $key => $locale) { - if (isset($image[$key])) { - $imageAltText[$key] = $image[$key]['altText']; - } - } - - $this->setData('imageAltText', $imageAltText); - } - - // - // Extend methods from SettingsFileUploadForm. - // - /** - * @copydoc SettingsFileUploadForm::readInputData() - */ - function readInputData() { - $this->readUserVars(array('imageAltText')); - - parent::readInputData(); - } - - /** - * @copydoc SettingsFileUploadForm::fetch() - */ - function fetch($request, $template = null, $display = false, $params = null) { - $params = array('fileType' => 'image'); - return parent::fetch($request, $template, $display, $params); - } - - - // - // Extend methods from Form. - // - /** - * Save the new image file. - */ - function execute() { - $request = Application::getRequest(); - $temporaryFile = $this->fetchTemporaryFile($request); - - import('classes.file.PublicFileManager'); - $publicFileManager = new PublicFileManager(); - - if (is_a($temporaryFile, 'TemporaryFile')) { - $type = $temporaryFile->getFileType(); - $extension = $publicFileManager->getImageExtension($type); - if (!$extension) { - return false; - } - $locale = AppLocale::getLocale(); - $uploadName = $this->getFileSettingName() . '_' . $locale . $extension; - if ($publicFileManager->copyFile($temporaryFile->getFilePath(), $publicFileManager->getSiteFilesPath() . '/' . $uploadName)) { - - // Get image dimensions - $filePath = $publicFileManager->getSiteFilesPath(); - list($width, $height) = getimagesize($filePath . '/' . $uploadName); - - $site = $request->getSite(); - $siteDao = DAORegistry::getDAO('SiteDAO'); - $value = $site->getSetting($this->getFileSettingName()); - $imageAltText = $this->getData('imageAltText'); - - $value[$locale] = array( - 'originalFilename' => $temporaryFile->getOriginalFileName(), - 'uploadName' => $uploadName, - 'width' => $width, - 'height' => $height, - 'dateUploaded' => Core::getCurrentDate(), - 'altText' => $imageAltText[$locale] - ); - - $site->updateSetting($this->getFileSettingName(), $value, 'object', true); - - // Clean up the temporary file - $this->removeTemporaryFile($request); - - return true; - } - } - return false; - } -} - - diff --git a/controllers/tab/settings/siteSetup/form/SiteSetupForm.inc.php b/controllers/tab/settings/siteSetup/form/SiteSetupForm.inc.php deleted file mode 100644 index aa4a2e8b8dd..00000000000 --- a/controllers/tab/settings/siteSetup/form/SiteSetupForm.inc.php +++ /dev/null @@ -1,358 +0,0 @@ -getSite(); - $publicFileManager = new PublicFileManager(); - $contextDao = Application::getContextDAO(); - $contexts = $contextDao->getNames(); - $siteStyleFilename = $publicFileManager->getSiteFilesPath() . '/' . $site->getSiteStyleFilename(); - - $cssSettingName = 'siteStyleSheet'; - $imageSettingName = 'pageHeaderTitleImage'; - - // Get link actions. - $uploadCssLinkAction = $this->_getFileUploadLinkAction($cssSettingName, 'css', $request); - $uploadImageLinkAction = $this->_getFileUploadLinkAction($imageSettingName, 'image', $request); - - // Get the files view. - $cssView = $this->renderFileView($cssSettingName, $request); - $imageView = $this->renderFileView($imageSettingName, $request); - - $application = Application::getApplication(); - $templateMgr = TemplateManager::getManager($request); - $templateMgr->assign(array( - 'locale' => AppLocale::getLocale(), - 'siteStyleFileExists' => file_exists($siteStyleFilename), - 'uploadCssLinkAction' => $uploadCssLinkAction, - 'uploadImageLinkAction' => $uploadImageLinkAction, - 'cssView' => $cssView, - 'imageView' => $imageView, - 'redirectOptions' => $contexts, - 'pageHeaderTitleImage' => $site->getSetting($imageSettingName), - 'availableMetricTypes' => $application->getMetricTypes(true), - )); - - $themePlugins = PluginRegistry::getPlugins('themes'); - $enabledThemes = array(); - $activeThemeOptions = array(); - foreach ($themePlugins as $themePlugin) { - $enabledThemes[basename($themePlugin->getPluginPath())] = $themePlugin->getDisplayName(); - if ($themePlugin->isActive()) { - $activeThemeOptions = $themePlugin->getOptionsConfig(); - $activeThemeOptionsValues = $themePlugin->getOptionValues(); - foreach ($activeThemeOptions as $name => $option) { - $activeThemeOptions[$name]['value'] = isset($activeThemeOptionsValues[$name]) ? $activeThemeOptionsValues[$name] : ''; - } - } - } - $templateMgr->assign(array( - 'enabledThemes' => $enabledThemes, - 'activeThemeOptions' => $activeThemeOptions, - )); - - return parent::fetch($request, $template, $display); - } - - - // - // Extend method from PKPSiteSettingsForm - // - /** - * @copydoc PKPSiteSettingsForm::initData() - */ - function initData() { - $request = Application::getRequest(); - $site = $request->getSite(); - $publicFileManager = $publicFileManager = new PublicFileManager(); - $siteStyleFilename = $publicFileManager->getSiteFilesPath() . '/' . $site->getSiteStyleFilename(); - - // Get the files settings that can be uploaded within this form. - - // FIXME Change the way we get the style sheet setting when - // it's implemented in site settings table, like pageHeaderTitleImage. - $siteStyleSheet = null; - if (file_exists($siteStyleFilename)) { - $siteStyleSheet = array( - 'name' => $site->getOriginalStyleFilename(), - 'uploadName' => $site->getSiteStyleFilename(), - 'dateUploaded' => filemtime($siteStyleFilename), - ); - } - - $pageHeaderTitleImage = $site->getSetting('pageHeaderTitleImage'); - - $this->setData('siteStyleSheet', $siteStyleSheet); - $this->setData('pageHeaderTitleImage', $pageHeaderTitleImage); - $this->setData('themePluginPath', $site->getSetting('themePluginPath')); - $this->setData('defaultMetricType', $site->getSetting('defaultMetricType')); - $this->setData('privacyStatement', $site->getSetting('privacyStatement')); - - parent::initData(); - } - - /** - * Assign form data to user-submitted data. - */ - function readInputData() { - $this->readUserVars( - array('pageHeaderTitleType', 'title', 'about', 'redirect', 'contactName', - 'contactEmail', 'minPasswordLength', 'themePluginPath', - 'defaultMetricType', 'pageFooter', 'privacyStatement') - ); - } - - /** - * Save site settings. - */ - function execute() { - parent::execute(); - $siteDao = DAORegistry::getDAO('SiteDAO'); - $site = $siteDao->getSite(); - - $site->setRedirect($this->getData('redirect')); - $site->setMinPasswordLength($this->getData('minPasswordLength')); - - $siteSettingsDao = $this->siteSettingsDao; - foreach ($this->getLocaleFieldNames() as $setting) { - $siteSettingsDao->updateSetting($setting, $this->getData($setting), null, true); - } - - $siteSettingsDao->updateSetting('defaultMetricType', $this->getData('defaultMetricType')); - - // Activate the selected theme plugin - $selectedThemePluginPath = $this->getData('themePluginPath'); - $site->updateSetting('themePluginPath', $selectedThemePluginPath); - - $siteDao->updateObject($site); - - // Save block plugins context positions. - $request = Application::getRequest(); - import('lib.pkp.classes.controllers.listbuilder.ListbuilderHandler'); - ListbuilderHandler::unpack($request, $request->getUserVar('blocks'), array($this, 'deleteEntry'), array($this, 'insertEntry'), array($this, 'updateEntry')); - - return true; - } - - // - // Public methods. - // - /** - * Render a template to show details about an uploaded file in the form - * and a link action to delete it. - * @param $fileSettingName string The uploaded file setting name. - * @param $request Request - * @return string - */ - function renderFileView($fileSettingName, $request) { - $file = $this->getData($fileSettingName); - $locale = AppLocale::getLocale(); - - // Check if the file is localized. - if (!is_null($file) && key_exists($locale, $file)) { - // We use the current localized file value. - $file = $file[$locale]; - } - - // Only render the file view if we have a file. - if (is_array($file)) { - $templateMgr = TemplateManager::getManager($request); - $deleteLinkAction = $this->_getDeleteFileLinkAction($fileSettingName, $request); - - // Get the right template to render the view. - if ($fileSettingName == 'pageHeaderTitleImage') { - $template = 'controllers/tab/settings/formImageView.tpl'; - - // Get the common alternate text for the image. - $localeKey = 'admin.settings.homeHeaderImage.altText'; - $commonAltText = __($localeKey); - $templateMgr->assign('commonAltText', $commonAltText); - } else { - $template = 'controllers/tab/settings/formFileView.tpl'; - } - - $publicFileManager = $publicFileManager = new PublicFileManager(); - $templateMgr->assign(array( - 'publicFilesDir' => $request->getBasePath() . '/' . $publicFileManager->getSiteFilesPath(), - 'file' => $file, - 'deleteLinkAction' => $deleteLinkAction, - 'fileSettingName' => $fileSettingName, - )); - return $templateMgr->fetch($template); - } else { - return null; - } - } - - /** - * Delete an uploaded file. - * @param $fileSettingName string - * @return boolean - */ - function deleteFile($fileSettingName, $request) { - $locale = AppLocale::getLocale(); - - // Get the file. - $file = $this->getData($fileSettingName); - - // Check if the file is localized. - if (key_exists($locale, $file)) { - // We use the current localized file value. - $file = $file[$locale]; - } else { - $locale = null; - } - - // Deletes the file and its settings. - import('classes.file.PublicFileManager'); - $publicFileManager = new PublicFileManager(); - if ($publicFileManager->removeSiteFile($file['uploadName'])) { - $settingsDao = DAORegistry::getDAO('SiteSettingsDAO'); - $settingsDao->deleteSetting($fileSettingName, $locale); - return true; - } else { - return false; - } - } - - /** - * Overriden method from ListbuilderHandler. - * @param $request Request - * @param $rowId mixed - * @param $newRowId array - */ - function updateEntry($request, $rowId, $newRowId) { - $plugins =& PluginRegistry::loadCategory('blocks'); - $plugin =& $plugins[$rowId]; // Ref hack - switch ($newRowId['listId']) { - case 'unselected': - $plugin->setEnabled(false, 0); - break; - case 'sidebarContext': - $plugin->setEnabled(true, 0); - $plugin->setBlockContext(BLOCK_CONTEXT_SIDEBAR, 0); - $plugin->setSeq((int) $newRowId['sequence'], 0); - break; - default: - assert(false); - } - } - - /** - * Avoid warnings when Listbuilder::unpack tries to call this method. - */ - function deleteEntry() { - return false; - } - - /** - * Avoid warnings when Listbuilder::unpack tries to call this method. - */ - function insertEntry() { - return false; - } - - - // - // Private helper methods. - // - /** - * Get a link action for file upload. - * @param $settingName string - * @param $fileType string The uploaded file type. - * @param $request Request - * @return LinkAction - */ - function _getFileUploadLinkAction($settingName, $fileType, $request) { - $router = $request->getRouter(); - import('lib.pkp.classes.linkAction.request.AjaxModal'); - - $ajaxModal = new AjaxModal( - $router->url( - $request, null, null, 'showFileUploadForm', null, array( - 'fileSettingName' => $settingName, - 'fileType' => $fileType - ) - ) - ); - import('lib.pkp.classes.linkAction.LinkAction'); - $linkAction = new LinkAction( - 'uploadFile-' . $settingName, - $ajaxModal, - __('common.upload'), - null - ); - - return $linkAction; - } - - /** - * Get the delete file link action. - * @param $setttingName string File setting name. - * @param $request Request - * @return LinkAction - */ - function _getDeleteFileLinkAction($settingName, $request) { - $router = $request->getRouter(); - import('lib.pkp.classes.linkAction.request.RemoteActionConfirmationModal'); - - $confirmationModal = new RemoteActionConfirmationModal( - $request->getSession(), - __('common.confirmDelete'), null, - $router->url( - $request, null, null, 'deleteFile', null, array( - 'fileSettingName' => $settingName, - 'tab' => 'siteSetup' - ) - ) - ); - $linkAction = new LinkAction( - 'deleteFile-' . $settingName, - $confirmationModal, - __('common.delete'), - null - ); - - return $linkAction; - } -} - - diff --git a/controllers/tab/settings/submissionStage/form/SubmissionStageForm.inc.php b/controllers/tab/settings/submissionStage/form/SubmissionStageForm.inc.php deleted file mode 100644 index 418223575a1..00000000000 --- a/controllers/tab/settings/submissionStage/form/SubmissionStageForm.inc.php +++ /dev/null @@ -1,78 +0,0 @@ -addCheck(new FormValidatorEmail($this, 'copySubmissionAckAddress')); - - // Add the list of metadata field-related settings per the MetadataGridHandler - // e.g.: typeEnabledSubmission; typeEnabledWorkflow; typeRequired - $metadataFieldNames = array_keys(MetadataGridHandler::getNames()); - $metadataSettings = array_merge( - array_map(function($n) {return $n.'EnabledSubmission';}, $metadataFieldNames), - array_map(function($n) {return $n.'EnabledWorkflow';}, $metadataFieldNames), - array_map(function($n) {return $n.'Required';}, $metadataFieldNames) - ); - - parent::__construct( - array_merge( - array( - 'copySubmissionAckPrimaryContact' => 'bool', - 'copySubmissionAckAddress' => 'string', - 'authorGuidelines' => 'string', - 'privacyStatement' => 'string', - ), - array_combine($metadataSettings, array_fill(0, count($metadataSettings), 'bool')) - ), - 'controllers/tab/settings/submissionStage/form/submissionStageForm.tpl', - $wizardMode - ); - } - - /** - * @copydoc Form::getLocaleFieldNames() - */ - function getLocaleFieldNames() { - return array('authorGuidelines', 'privacyStatement'); - } - - /** - * @copydoc ContextSettingsForm::fetch() - */ - function fetch($request, $template = null, $display = false, $params = null) { - $templateMgr = TemplateManager::getManager($request); - - import('lib.pkp.classes.mail.MailTemplate'); - $mail = new MailTemplate('SUBMISSION_ACK'); - $templateMgr->assign(array( - 'submissionAckDisabled' => !$mail->isEnabled(), - 'enableContextPrivacyStatement' => !Config::getVar('general', 'sitewide_privacy_statement'), - )); - - return parent::fetch($request, $template, $display, $params); - } -} - - diff --git a/controllers/wizard/fileUpload/PKPFileUploadWizardHandler.inc.php b/controllers/wizard/fileUpload/PKPFileUploadWizardHandler.inc.php index 876b5a27ed3..7a749366a98 100644 --- a/controllers/wizard/fileUpload/PKPFileUploadWizardHandler.inc.php +++ b/controllers/wizard/fileUpload/PKPFileUploadWizardHandler.inc.php @@ -343,7 +343,7 @@ protected function _attachEntities($submissionFile) { if (in_array($uploader->getId(), $authorUserIds)) { import('lib.pkp.classes.mail.SubmissionMailTemplate'); $mail = new SubmissionMailTemplate($submission, 'REVISED_VERSION_NOTIFY'); - $mail->setReplyTo($context->getSetting('contactEmail'), $context->getSetting('contactName')); + $mail->setReplyTo($context->getData('contactEmail'), $context->getData('contactName')); // Get editors assigned to the submission, consider also the recommendOnly editors $userDao = DAORegistry::getDAO('UserDAO'); $editorsStageAssignments = $stageAssignmentDao->getEditorsAssignedToStage($submission->getId(), $this->getStageId()); @@ -356,7 +356,7 @@ protected function _attachEntities($submissionFile) { $submissionUrl = $dispatcher->url($request, ROUTE_PAGE, null, 'workflow', 'index', array($submission->getId(), $this->getStageId())); $mail->assignParams(array( 'authorName' => $uploader->getFullName(), - 'editorialContactSignature' => $context->getSetting('contactName'), + 'editorialContactSignature' => $context->getData('contactName'), 'submissionUrl' => $submissionUrl, )); $mail->send(); diff --git a/controllers/wizard/fileUpload/form/PKPSubmissionFilesUploadBaseForm.inc.php b/controllers/wizard/fileUpload/form/PKPSubmissionFilesUploadBaseForm.inc.php index 1684e498f6d..bf0cad2e210 100644 --- a/controllers/wizard/fileUpload/form/PKPSubmissionFilesUploadBaseForm.inc.php +++ b/controllers/wizard/fileUpload/form/PKPSubmissionFilesUploadBaseForm.inc.php @@ -282,7 +282,7 @@ function fetch($request, $template = null, $display = false) { // Show ensuring a blind review link. $context = $request->getContext(); - if ($context->getSetting('showEnsuringLink') && in_array($this->getStageId(), array(WORKFLOW_STAGE_ID_SUBMISSION, WORKFLOW_STAGE_ID_INTERNAL_REVIEW, WORKFLOW_STAGE_ID_EXTERNAL_REVIEW))) { + if ($context->getData('showEnsuringLink') && in_array($this->getStageId(), array(WORKFLOW_STAGE_ID_SUBMISSION, WORKFLOW_STAGE_ID_INTERNAL_REVIEW, WORKFLOW_STAGE_ID_EXTERNAL_REVIEW))) { import('lib.pkp.classes.linkAction.request.ConfirmationModal'); $ensuringLink = new LinkAction( 'addUser', diff --git a/controllers/wizard/settings/ContextSettingsWizardHandler.inc.php b/controllers/wizard/settings/ContextSettingsWizardHandler.inc.php deleted file mode 100644 index 2895052316e..00000000000 --- a/controllers/wizard/settings/ContextSettingsWizardHandler.inc.php +++ /dev/null @@ -1,71 +0,0 @@ -addRoleAssignment( - array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER), - array('startWizard') - ); - } - - - // - // Implement template methods from PKPHandler - // - /** - * @copydoc PKPHandler::authorize() - */ - function authorize($request, &$args, $roleAssignments) { - import('lib.pkp.classes.security.authorization.ContextAccessPolicy'); - $this->addPolicy(new ContextAccessPolicy($request, $roleAssignments)); - return parent::authorize($request, $args, $roleAssignments); - } - - - // - // Public handler methods - // - /** - * Displays the context settings wizard. - * @param $args array - * @param $request Request - * @return JSONMessage JSON object - */ - function startWizard($args, $request) { - $templateMgr = TemplateManager::getManager($request); - AppLocale::requireComponents( - LOCALE_COMPONENT_APP_MANAGER, - LOCALE_COMPONENT_PKP_MANAGER - ); - - $this->setupTemplate($request); - return $templateMgr->fetchJson('controllers/wizard/settings/settingsWizard.tpl'); - } -} - - diff --git a/includes/bootstrap.inc.php b/includes/bootstrap.inc.php index 74a02722601..f2ddd1488b2 100644 --- a/includes/bootstrap.inc.php +++ b/includes/bootstrap.inc.php @@ -53,5 +53,3 @@ import('classes.core.Application'); return new Application(); - - diff --git a/js/classes/features/OrderListbuilderItemsFeature.js b/js/classes/features/OrderListbuilderItemsFeature.js deleted file mode 100644 index 6e26217f36a..00000000000 --- a/js/classes/features/OrderListbuilderItemsFeature.js +++ /dev/null @@ -1,221 +0,0 @@ -/** - * @file js/classes/features/OrderListbuilderItemsFeature.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @class OrderListbuilderItemsFeature - * @ingroup js_classes_features - * - * @brief Feature for ordering grid items. - */ -(function($) { - - - /** - * @constructor - * @inheritDoc - * @extends $.pkp.classes.features.OrderItemsFeature - */ - $.pkp.classes.features.OrderListbuilderItemsFeature = - function(gridHandler, options) { - this.parent(gridHandler, options); - }; - $.pkp.classes.Helper.inherits( - $.pkp.classes.features.OrderListbuilderItemsFeature, - $.pkp.classes.features.OrderItemsFeature); - - - // - // Extended methods from OrderItemsFeature. - // - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype.addFeatureHtml = - function($gridElement, options) { - - var $itemSequenceInput, $gridRows, index, limit, $gridRow, - $itemSequenceInputClone; - - this.parent('addFeatureHtml', $gridElement, options); - - $itemSequenceInput = this.getSequenceInput_(); - $gridRows = this.gridHandler.getRows(); - for (index = 0, limit = $gridRows.length; index < limit; index++) { - $gridRow = $($gridRows[index]); - $itemSequenceInputClone = $itemSequenceInput.clone(); - - $('td.first_column', $gridRow).append($itemSequenceInputClone); - } - }; - - - /** - * Set up the sortable plugin. - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype. - setupSortablePlugin = function() { - this.applySortPlgOnElements( - this.getGridHtmlElement(), 'tr.orderable', null); - }; - - - // - // Extended methods from ToggleableOrderItemsFeature. - // - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype.init = - function() { - this.parent('init'); - this.toggleItemsDragMode(); - }; - - - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype.toggleState = - function(isOrdering) { - this.parent('toggleState', isOrdering); - this.toggleContentHandlers_(); - }; - - - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype.storeRowOrder = - function(index, $row) { - var seq = index + 1, - $orderableInput = $row.find('.itemSequence'), - $modifiedInput; - - $orderableInput.attr('value', seq); - $modifiedInput = $row.find('.isModified'); - $modifiedInput.attr('value', 1); - }; - - - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype.saveOrderHandler = - function() { - this.parent('saveOrderHandler'); - this.toggleState(false); - - return false; - }; - - - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype. - updateOrderCallback = function(contextElement, event, ui) { - - var $rows; - this.parent('updateOrderCallback'); - $rows = this.gridHandler.getRows(); - this.storeOrder($rows); - }; - - - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype. - clickOrderHandler = function() { - var $selects = $('select:visible', this.getGridHtmlElement()), - index, limit; - if ($selects.length > 0) { - for (index = 0, limit = $selects.length; index < limit; index++) { - this.gridHandler.saveRow($($selects[index]).parents('.gridRow')); - } - } - - return /** @type {boolean} */ (this.parent('clickOrderHandler')); - }; - - - // - // Implemented Feature template hook methods. - // - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype.addElement = - function($newElement) { - this.parent('addElement', $newElement); - this.formatAndStoreNewRow_($newElement); - return false; - }; - - - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype.replaceElement = - function($newContent) { - this.parent('replaceElement', $newContent); - this.formatAndStoreNewRow_($newContent); - return false; - }; - - - // - // Private helper methods. - // - /** - * Get the sequence input html element. - * @private - * @return {jQueryObject} Sequence input. - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype. - getSequenceInput_ = function() { - return $(''); - }; - - - /** - * Enable/disable row content handlers. - * @private - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype. - toggleContentHandlers_ = function() { - var $rows = this.gridHandler.getRows(), - index, limit, $row; - for (index = 0, limit = $rows.length; index < limit; index++) { - $row = $($rows[index]); - if (this.isOrdering) { - $row.find('.gridCellDisplay').unbind('click'); - } else { - this.gridHandler.attachContentHandlers_($row); - } - } - }; - - - /** - * Format and store new row. - * @private - * @param {jQueryObject} $row The new row element. - */ - $.pkp.classes.features.OrderListbuilderItemsFeature.prototype. - formatAndStoreNewRow_ = function($row) { - - var $rows; - - $row.children().after(this.getSequenceInput_()); - $rows = this.gridHandler.getRows(); - this.storeOrder($rows); - }; - - -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/js/classes/features/OrderMultipleListsItemsFeature.js b/js/classes/features/OrderMultipleListsItemsFeature.js deleted file mode 100644 index cad2c27b31b..00000000000 --- a/js/classes/features/OrderMultipleListsItemsFeature.js +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @file js/classes/features/OrderMultipleListsItemsFeature.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @class OrderMultipleListsItemsFeature - * @ingroup js_classes_features - * - * @brief Feature for ordering grid items. - */ -(function($) { - - - /** - * @constructor - * @inheritDoc - * @extends $.pkp.classes.features.OrderListbuilderItemsFeature - */ - $.pkp.classes.features.OrderMultipleListsItemsFeature = - function(gridHandler, options) { - this.parent(gridHandler, options); - }; - $.pkp.classes.Helper.inherits( - $.pkp.classes.features.OrderMultipleListsItemsFeature, - $.pkp.classes.features.OrderListbuilderItemsFeature); - - - // - // Extended methods from Feature. - // - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderMultipleListsItemsFeature.prototype.addFeatureHtml = - function($gridElement, options) { - - var $listInput, $gridRows, index, limit, $row, listId, $listInputClone; - this.parent('addFeatureHtml', $gridElement, options); - - $listInput = $(''); - $gridRows = this.gridHandler.getRows(); - for (index = 0, limit = $gridRows.length; index < limit; index++) { - $row = $($gridRows[index]); - listId = this.gridHandler.getListIdByRow($row); - $listInputClone = $listInput.clone(); - $listInputClone.attr('value', listId); - $('td.first_column', $row).append($listInputClone); - } - }; - - - // - // Extended methods from OrderListbuilderItemsFeature. - // - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderMultipleListsItemsFeature.prototype.storeRowOrder = - function(index, $row) { - - var $listInput, listId; - - this.parent('storeRowOrder', index, $row); - - $listInput = $row.find('.itemList'); - listId = this.gridHandler.getListIdByRow($row); - $listInput.attr('value', listId); - }; - - - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderMultipleListsItemsFeature.prototype. - setupSortablePlugin = function() { - - var $lists = this.gridHandler.getLists().find('tbody'), - extraParams = {connectWith: $lists}; - - this.applySortPlgOnElements($lists, 'tr.orderable', extraParams); - }; - - - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderMultipleListsItemsFeature.prototype. - dragStartCallback = function(contextElement, event, ui) { - var $list = this.gridHandler.getListByRow(ui.item); - this.gridHandler.toggleListNoItemsRow( - $list, 1, '.ui-sortable-placeholder, .ui-sortable-helper'); - }; - - - /** - * @inheritDoc - */ - $.pkp.classes.features.OrderMultipleListsItemsFeature.prototype. - dragStopCallback = function(contextElement, event, ui) { - var $list = this.gridHandler.getListByRow(ui.item); - this.gridHandler.toggleListNoItemsRow($list, 0, null); - }; - - -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/js/controllers/HelpPanelHandler.js b/js/controllers/HelpPanelHandler.js index 5c53ad3f783..e968bc1cbac 100644 --- a/js/controllers/HelpPanelHandler.js +++ b/js/controllers/HelpPanelHandler.js @@ -141,6 +141,14 @@ $.pkp.controllers.HelpPanelHandler.prototype.nextTopic_ = null; + /** + * Requested help section + * @private + * @type {string?} + */ + $.pkp.controllers.HelpPanelHandler.prototype.requestedSection_ = null; + + // // Private methods // @@ -178,6 +186,7 @@ // Load the appropriate help content this.loadHelpContent_(options.topic, this.helpLocale_); + this.requestedSection_ = options.section || ''; // Set focus inside the help panel (delay is required so that element is // visible when jQuery tries to focus on it) @@ -234,11 +243,11 @@ $element.find('.content').replaceWith( '
' + responseObject.content + '
'); - // If a hash was specified, scroll to the named anchor. + // If a section was specified, scroll to the named section. panel.scrollTop(0); - if (hashIndex !== -1) { + if (this.requestedSection_) { $targetHash = $element.find( - 'a[name=' + this.currentTopic_.substr(hashIndex + 1) + ']'); + 'a[name="' + this.requestedSection_ + '"]'); if ($targetHash.length) { panel.scrollTop($targetHash.offset().top - 50); } @@ -263,7 +272,10 @@ handleContentLinks_ = function(target, event) { var url = $(target).attr('href'), - urlParts; + urlParts, + topic, + locale, + topicParts; event.preventDefault(); @@ -271,10 +283,18 @@ // See: https://github.com/pkp/pkp-lib/issues/1032#issuecomment-199342940 if (url.substring(0, 4) == 'http') { window.open(url); - } else { - urlParts = url.split('/'); - this.loadHelpContent_(urlParts.slice(1).join('/'), urlParts[0]); + return false; + } + + urlParts = url.split('/'); + topic = urlParts.slice(1).join('/'); + locale = urlParts[0]; + if (topic.indexOf('#') > -1) { + topicParts = topic.split('#'); + topic = topicParts[0]; + this.requestedSection_ = topicParts[1]; } + this.loadHelpContent_(topic, locale); return false; }; diff --git a/js/controllers/SiteHandler.js b/js/controllers/SiteHandler.js index 029c458cc4f..8722a6f9fb7 100644 --- a/js/controllers/SiteHandler.js +++ b/js/controllers/SiteHandler.js @@ -58,6 +58,9 @@ this.trigger('notifyUser'); } + // Respond to `notify` events triggered on the global event bus + this.bindGlobal('notify', this.handleNotifyEvent); + // bind event handlers for form status change events. this.bind('formChanged', this.callbackWrapper( this.registerUnsavedFormElement_)); @@ -137,6 +140,12 @@ tinyMCE.PluginManager.load('pkpwordcount', $.pkp.app.baseUrl + '/plugins/generic/tinymce/plugins/pkpWordcount/plugin.js'); + + var contentCSS = $.pkp.app.tinyMceContentCSS; + if ($.pkp.app.cdnEnabled) { + contentCSS = contentCSS + ', ' + $.pkp.app.tinyMceContentFont; + } + var tinymceParams, tinymceParamDefaults = { width: '100%', resize: 'both', @@ -154,8 +163,7 @@ 'superscript subscript | link unlink code fullscreen | ' + 'jbimages | pkpTags', statusbar: false, - content_css: $.pkp.app.baseUrl + - '/plugins/generic/tinymce/styles/content.css' + content_css: contentCSS }; // Allow default params to be overridden @@ -630,6 +638,18 @@ }; + /** + * Display a floating notification message + * + * @param {Object} caller The object which triggered the event + * @param {Object} settings The PNotify settings + */ + $.pkp.controllers.SiteHandler.prototype.handleNotifyEvent = + function(caller, settings) { + pnotify = new PNotify(settings); + }; + + /** * Reacts to a modal being opened. Adds a class to the body representing * a modal open state. diff --git a/js/controllers/form/AjaxFormHandler.js b/js/controllers/form/AjaxFormHandler.js index 3e51ab3032a..1b82711df71 100644 --- a/js/controllers/form/AjaxFormHandler.js +++ b/js/controllers/form/AjaxFormHandler.js @@ -28,6 +28,10 @@ options.submitHandler = this.submitForm; this.parent($form, options); + if (typeof options.confirmText !== 'undefined') { + this.confirmText = options.confirmText; + } + this.bind('refreshForm', this.refreshFormHandler_); this.publishEvent('containerReloadRequested'); }; @@ -46,6 +50,15 @@ disableControlsOnSubmit = true; + /** + * A confirmation message to display before submitting the form + * @protected + * @type {string} + */ + $.pkp.controllers.form.AjaxFormHandler.prototype. + confirmText = ''; + + // // Public methods // @@ -65,8 +78,10 @@ this.disableFormControls(); - $.post($form.attr('action'), $form.serialize(), - this.callbackWrapper(this.handleResponse), 'json'); + if (!this.confirmText.length || confirm(this.confirmText)) { + $.post($form.attr('action'), $form.serialize(), + this.callbackWrapper(this.handleResponse), 'json'); + } }; diff --git a/js/controllers/form/ThemeOptionsHandler.js b/js/controllers/form/ThemeOptionsHandler.js deleted file mode 100644 index 48be5c440d3..00000000000 --- a/js/controllers/form/ThemeOptionsHandler.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file js/controllers/form/ThemeOptionsHandler.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @brief This handles theme options. When a new theme is selected, it removes - * the theme options because different themes may have different options. In - * the future it will automatically reload the new themes' options. - */ -(function($) { - - - /** - * @constructor - * - * @extends $.pkp.classes.Handler - * - * @param {jQueryObject} $container the wrapped HTML form element. - * @param {Object} options form options. - */ - $.pkp.controllers.form.ThemeOptionsHandler = function($container, options) { - this.parent($container, options); - var $activeThemeOptions, hexColour, self; - - $activeThemeOptions = $container.find('#activeThemeOptions'); - if ($activeThemeOptions.length) { - self = this; - $container.find('#themePluginPath').change(function(e) { - self.unbindPartial($activeThemeOptions); - $activeThemeOptions.empty(); - }); - $activeThemeOptions.find('input[type="color"]').each(function() { - var $colourInput = $(this); - $colourInput.spectrum({ - preferredFormat: 'hex', - showInitial: true, - showInput: true, - showButtons: false, - change: function(colour) { - /** @type {{toHexString: function()}} */ - hexColour = colour.toHexString(); - $colourInput.val(hexColour); - } - }); - }); - } - }; - $.pkp.classes.Helper.inherits( - $.pkp.controllers.form.ThemeOptionsHandler, - $.pkp.classes.Handler); - - -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/js/controllers/grid/settings/metadata/MetadataGridHandler.js b/js/controllers/grid/settings/metadata/MetadataGridHandler.js deleted file mode 100644 index f601e481512..00000000000 --- a/js/controllers/grid/settings/metadata/MetadataGridHandler.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * @file js/controllers/grid/metadata/MetadataGridHandler.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @class MetadataGridHandler - * @ingroup js_controllers_grid - * - * @brief Metadata grid handler. - */ -(function($) { - - // Define the namespace. - $.pkp.controllers.grid.settings.metadata = - $.pkp.controllers.grid.settings.metadata || {}; - - - - /** - * @constructor - * - * @extends $.pkp.controllers.grid.GridHandler - * - * @param {jQueryObject} $grid The grid this handler is - * attached to. - * @param {Object} options Grid handler configuration. - */ - $.pkp.controllers.grid.settings.metadata.MetadataGridHandler = - function($grid, options) { - - $grid.find(':checkbox').change( - this.callbackWrapper(this.checkboxHandler_)); - - this.parent($grid, options); - }; - $.pkp.classes.Helper.inherits($.pkp.controllers.grid.settings.metadata - .MetadataGridHandler, $.pkp.controllers.grid.GridHandler); - - - // - // Extended methods from GridHandler - // - /** - * @inheritDoc - */ - $.pkp.controllers.grid.settings.metadata.MetadataGridHandler. - prototype.initialize = function(options) { - - this.parent('initialize', options); - - // Initialize the controls with sensible readonly states - $(this.getHtmlElement()).find(':checkbox') - .change(); - }; - - - // - // Private methods. - // - /** - * Callback that will be activated when an "enabled" checkbox is clicked - * under the "submission" column - * - * @private - * - * @param {Object} callingContext The calling element or object. - * @param {Event=} opt_event The triggering event (e.g. a click on - * a button. - * @return {boolean} Should return false to stop event processing. - */ - $.pkp.controllers.grid.settings.metadata.MetadataGridHandler.prototype. - checkboxHandler_ = function(callingContext, opt_event) { - var $checkbox = $(callingContext), checked = $checkbox.is(':checked'), - $grid = $(this.getHtmlElement()), name = $checkbox.prop('name'); - - this.getRows().each(function() { - var fieldName = $(this).prop('id').split('-').pop(), - $enabled = $grid.find( - ':checkbox[name=' + fieldName + 'EnabledWorkflow]'), - $enabledSubmission = $grid.find( - ':checkbox[name=' + fieldName + 'EnabledSubmission]'), - $required = $grid.find( - ':checkbox[name=' + fieldName + 'Required]'); - - if ($enabledSubmission.prop('checked') || $required.prop('checked')) { - $enabled.prop('checked', true); - } - $enabled.prop('readonly', - $enabledSubmission.prop('checked') || $required.prop('checked')); - - if ($required.prop('checked')) { - $enabledSubmission.prop('checked', true); - } - $enabledSubmission.prop('readonly', $required.prop('checked')); - }); - return false; - }; -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/js/controllers/grid/users/UserGridHandler.js b/js/controllers/grid/users/UserGridHandler.js index 9e44ede7fe7..0d442ce36ec 100644 --- a/js/controllers/grid/users/UserGridHandler.js +++ b/js/controllers/grid/users/UserGridHandler.js @@ -38,6 +38,11 @@ this.refreshGridHandler(); }); + + // Refresh the grid when a user group has been added/edited + this.bindGlobal('userGroupUpdated', function() { + this.refreshGridHandler(); + }); }; $.pkp.classes.Helper.inherits($.pkp.controllers.grid.users.UserGridHandler, $.pkp.controllers.grid.GridHandler); diff --git a/js/controllers/listbuilder/MultipleListsListbuilderHandler.js b/js/controllers/listbuilder/MultipleListsListbuilderHandler.js deleted file mode 100644 index c7f8b990f90..00000000000 --- a/js/controllers/listbuilder/MultipleListsListbuilderHandler.js +++ /dev/null @@ -1,201 +0,0 @@ -/** - * @file js/controllers/listbuilder/MultipleListsListbuilderHandler.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @class MultipleListsListbuilderHandler - * @ingroup js_controllers_listbuilder - * - * @brief Multiple lists listbuilder handler. - */ -(function($) { - - - /** - * @constructor - * - * @extends $.pkp.controllers.listbuilder.ListbuilderHandler - * - * @param {jQueryObject} $listbuilder The listbuilder this handler is - * attached to. - * @param {Object} options Listbuilder handler configuration. - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler = - function($listbuilder, options) { - this.parent($listbuilder, options); - }; - $.pkp.classes.Helper.inherits( - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler, - $.pkp.controllers.listbuilder.ListbuilderHandler); - - - // - // Private properties - // - /** - * The list elements of this listbuilder. - * @private - * @type {jQueryObject} - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler.prototype. - $lists_ = null; - - - // - // Getters and setters. - // - /** - * Get passed list rows. - * @param {jQueryObject} $list JQuery List containing rows. - * @return {jQueryObject} JQuery rows objects. - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler.prototype. - getRowsByList = function($list) { - return $list.find('.gridRow'); - }; - - - /** - * Get list elements. - * @return {jQueryObject} The JQuery lists. - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler.prototype. - getLists = function() { - return this.$lists_; - }; - - - /** - * Set list elements based on lists id options. - * @param {Array} listsId Array of IDs. - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler.prototype. - setLists = function(listsId) { - var $lists = jQuery(), - index, $list; - - if (!$.isArray(listsId)) { - throw new Error('Lists id must be passed using an array object!'); - } - - for (index in listsId) { - $list = this.getListById(listsId[index]); - if (this.$lists_) { - this.$lists_ = this.$lists_.add($list); - } else { - this.$lists_ = $list; - } - } - }; - - - /** - * Get the list element by list id. - * @param {string} listId List ID. - * @return {jQueryObject} List element. - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler.prototype. - getListById = function(listId) { - var listElementId = this.getGridIdPrefix() + '-table-' + listId; - return $('#' + listElementId, this.getHtmlElement()); - }; - - - /** - * Get the list element of the passed row. - * @param {jQueryObject} $row JQuery row object. - * @return {jQueryObject} List JQuery element. - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler.prototype. - getListByRow = function($row) { - return $row.parents('table:first'); - }; - - - /** - * Get the passed row list id. - * @param {jQueryObject} $row JQuery row object. - * @return {string} List ID. - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler.prototype. - getListIdByRow = function($row) { - var $list = this.getListByRow($row); - return this.getListId($list); - }; - - - /** - * Get the passed list id. - * @param {jQueryObject} $list JQuery list object. - * @return {string} List ID. - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler.prototype. - getListId = function($list) { - var idPrefix = this.getGridIdPrefix() + '-table-', - listElementId = $list.attr('id'); - - return /** @type {string} */ (listElementId.slice(idPrefix.length)); - }; - - - /** - * Get no items row inside the passed list. - * @param {jQueryObject} $list JQuery list object. - * @return {jQueryObject} JQuery "no items" row. - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler.prototype. - getListNoItemsRow = function($list) { - return $list.find('tr.empty'); - }; - - - // - // Protected methods. - // - /** - * @inheritDoc - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler.prototype. - initialize = function(options) { - this.parent('initialize', options); - this.setLists(/** @type {{listsId: string}} */ options.listsId); - }; - - - // - // Public methods. - // - /** - * Show/hide the no items row, based on the number of grid rows - * inside the passed list. - * @param {jQueryObject} $list JQuery elements to scan. - * @param {number} limit The minimum number of elements inside the list to - * show the no items row. - * @param {string} $filterSelector optional Selector to filter the rows that - * this method will consider as list rows. If not passed, all grid rows inside - * the passed list will be considered. - */ - $.pkp.controllers.listbuilder.MultipleListsListbuilderHandler.prototype. - toggleListNoItemsRow = function($list, limit, $filterSelector) { - var $noItemsRow = this.getListNoItemsRow($list), - $listRows = this.getRowsByList($list); - - if ($filterSelector) { - $listRows = $listRows.not($filterSelector); - } - if ($listRows.length == limit) { - $noItemsRow.detach(); - $list.append($noItemsRow); - $noItemsRow.show(); - } else { - $noItemsRow.detach(); - $list.append($noItemsRow); - $noItemsRow.hide(); - } - }; - - -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/js/controllers/modal/ModalHandler.js b/js/controllers/modal/ModalHandler.js index 4d34ee12bd6..ce574b12e2c 100644 --- a/js/controllers/modal/ModalHandler.js +++ b/js/controllers/modal/ModalHandler.js @@ -67,8 +67,8 @@ this.publishEvent('updateHeader'); this.publishEvent('gridRefreshRequested'); - // Bind notify user event. this.bind('notifyUser', this.redirectNotifyUserEventHandler_); + this.bindGlobal('form-success', this.onFormSuccess_); }; $.pkp.classes.Helper.inherits($.pkp.controllers.modal.ModalHandler, $.pkp.classes.Handler); @@ -91,7 +91,9 @@ resizable: false, position: {my: 'center', at: 'center center-10%', of: window}, canClose: true, - closeCallback: false + closeCallback: false, + // Vue components to destroy when when modal is closed + closeCleanVueInstances: [] }; @@ -244,11 +246,19 @@ } } - // Hide the modal, remove it from the DOM and remove the handler once - // the CSS animation is complete + // Hide the modal, clean up any mounted vue instances, remove it from the + // DOM and remove the handler once the CSS animation is complete $modalElement.removeClass('is_visible'); this.trigger('pkpModalClose'); setTimeout(function() { + if (modalHandler.options.closeCleanVueInstances.length) { + for (var i = 0; i < modalHandler.options.closeCleanVueInstances.length; i++) { + var id = modalHandler.options.closeCleanVueInstances[i]; + if (typeof pkp.registry._instances[id] !== 'undefined') { + pkp.registry._instances[id].$destroy(); + } + } + } modalHandler.unbindPartial($modalElement); $modalElement.empty(); modalHandler.remove(); @@ -313,5 +323,22 @@ }; + /** + * Handler to listen to global form success events, and close when an event + * from a child form has been fired, and this form matches the config id + * + * @param {Object} source The Vue.js component which fired the event + * @param {Object} data Data attached to the event, which will include the + * form id. + */ + $.pkp.controllers.modal.ModalHandler.prototype.onFormSuccess_ = + function(source, formId) { + if (this.options.closeOnFormSuccessId && + this.options.closeOnFormSuccessId === formId) { + this.modalClose(); + } + }; + + /** @param {jQuery} $ jQuery closure. */ }(jQuery)); diff --git a/js/controllers/tab/settings/announcements/form/AnnouncementSettingsFormHandler.js b/js/controllers/tab/settings/announcements/form/AnnouncementSettingsFormHandler.js deleted file mode 100644 index 468904538a8..00000000000 --- a/js/controllers/tab/settings/announcements/form/AnnouncementSettingsFormHandler.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @defgroup js_controllers_tab_settings_announcements_form - */ -/** - * @file js/controllers/tab/settings/announcements/form/AnnouncementSettingsFormHandler.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @class AnnouncementSettingsFormHandler - * @ingroup js_controllers_tab_settings_announcements_form - * - * @brief Handle the press announcement settings form. - */ -(function($) { - - /** @type {Object} */ - $.pkp.controllers.tab.settings.announcements = - $.pkp.controllers.tab.settings.announcements || {form: { } }; - - - - /** - * @constructor - * - * @extends $.pkp.controllers.form.AjaxFormHandler - * - * @param {jQueryObject} $form the wrapped HTML form element. - * @param {Object} options form options. - */ - $.pkp.controllers.tab.settings.announcements.form. - AnnouncementSettingsFormHandler = function($form, options) { - - this.parent($form, options); - - // Attach form elements events. - $('#enableAnnouncementsHomepage', $form).click( - this.callbackWrapper(this.toggleEnableAnnouncementsHomepage)); - }; - $.pkp.classes.Helper.inherits( - $.pkp.controllers.tab.settings.announcements.form. - AnnouncementSettingsFormHandler, - $.pkp.controllers.form.AjaxFormHandler); - - - // - // Public methods. - // - /** - * Event handler that is called when the announcements are toggled. - * @param {HTMLElement} element The checkbox input element. - */ - $.pkp.controllers.tab.settings.announcements.form. - AnnouncementSettingsFormHandler.prototype. - toggleEnableAnnouncementsHomepage = function(element) { - var $numAnnouncementsHomepage = - $('#numAnnouncementsHomepage', this.getHtmlElement()); - if ($numAnnouncementsHomepage.attr('disabled')) { - $numAnnouncementsHomepage.removeAttr('disabled'); - } else { - $numAnnouncementsHomepage.attr('disabled', 'disabled'); - } - }; - - -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/js/controllers/tab/settings/archiving/form/ArchivingSettingsFormHandler.js b/js/controllers/tab/settings/archiving/form/ArchivingSettingsFormHandler.js deleted file mode 100644 index ec783e020a8..00000000000 --- a/js/controllers/tab/settings/archiving/form/ArchivingSettingsFormHandler.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @defgroup js_controllers_tab_settings_archiving_form - */ -/** - * @file js/controllers/tab/settings/archiving/form/ArchivingSettingsFormHandler.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @class ArchivingSettingsFormHandler - * @ingroup js_controllers_tab_settings_archiving_form - * - * @brief Handle the press archiving settings form. - */ -(function($) { - - /** @type {Object} */ - $.pkp.controllers.tab.settings.archiving = - $.pkp.controllers.tab.settings.archiving || { form: {} }; - - - - /** - * @constructor - * - * @extends $.pkp.controllers.form.AjaxFormHandler - * - * @param {jQueryObject} $form the wrapped HTML form element. - * @param {Object} options form options. - */ - $.pkp.controllers.tab.settings.archiving.form. - ArchivingSettingsFormHandler = function($form, options) { - - this.parent($form, options); - - $('.expand-others').click(function() { - $('#otherLockss').slideToggle('fast'); - }); - - var plnInstalled = $('#isPLNPluginInstalled').val(); - if (plnInstalled == '1') { - $('#otherLockss').hide(); - } - }; - - $.pkp.classes.Helper.inherits( - $.pkp.controllers.tab.settings.archiving.form. - ArchivingSettingsFormHandler, - $.pkp.controllers.form.AjaxFormHandler); -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/js/controllers/tab/settings/form/FileViewFormHandler.js b/js/controllers/tab/settings/form/FileViewFormHandler.js deleted file mode 100644 index f9379c04bd5..00000000000 --- a/js/controllers/tab/settings/form/FileViewFormHandler.js +++ /dev/null @@ -1,144 +0,0 @@ -/** - * @defgroup js_controllers_tab_settings_form - */ -// Create the namespace. -/** - * @file js/controllers/tab/settings/form/FileViewFormHandler.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @class FileViewFormHandler - * @ingroup js_controllers_tab_settings_form - * - * @brief This handles a form that needs to present information about - * uploaded files, and refresh itself when a file is saved, but refreshing - * only the uploaded file part. This is necessary when we don't want to - * fetch the entire form and unnecessarily fetch other widgets inside the - * form too (listbuilders or grids). - * - * To start the refresh, this class binds the 'dataChanged' event to know - * when the file is saved and the setting name of the file. So, this handler - * assumes that your save file action will trigger a 'dataChanged' event, - * and that this event will pass a parameter with the setting name of the file - * that have been uploaded. - * - */ -(function($) { - - /** @type {Object} */ - $.pkp.controllers.tab = - $.pkp.controllers.tab || - { settings: { form: { } } }; - - - - /** - * @constructor - * - * @extends $.pkp.controllers.form.AjaxFormHandler - * - * @param {jQueryObject} $form the wrapped HTML form element. - * @param {Object} options form options. - */ - $.pkp.controllers.tab.settings.form.FileViewFormHandler = - function($form, options) { - - this.parent($form, options); - - this.fetchFileUrl_ = options.fetchFileUrl; - - this.bind('dataChanged', this.refreshForm_); - }; - $.pkp.classes.Helper.inherits( - $.pkp.controllers.tab.settings.form.FileViewFormHandler, - $.pkp.controllers.form.AjaxFormHandler); - - - // - // Private properties - // - /** - * The url to fetch a file. - * @private - * @type {string?} - */ - $.pkp.controllers.tab.settings.form.FileViewFormHandler.prototype - .fetchFileUrl_ = null; - - - // - // Private helper methods - // - /** - * Refresh the form, fetching a file. - * - * @param {HTMLElement} sourceElement The element that - * issued the event. - * @param {Event} event The triggering event. - * @param {string} settingName The setting name of the uploaded file. - * @private - */ - $.pkp.controllers.tab.settings.form.FileViewFormHandler.prototype.refreshForm_ = - function(sourceElement, event, settingName) { - - $.get(this.fetchFileUrl_, {settingName: settingName}, - this.callbackWrapper(this.refreshResponseHandler_), 'json'); - - }; - - - /** - * Show the file rendered data in the form. - * - * @param {Object} ajaxContext The AJAX request context. - * @param {Object} jsonData A parsed JSON response object. - * @private - */ - $.pkp.controllers.tab.settings.form.FileViewFormHandler.prototype. - refreshResponseHandler_ = function(ajaxContext, jsonData) { - - var $fileElement, processedJsonData = - /** @type {{noData: string, elementId: string, content: string}} */ - this.handleJson(jsonData); - - if (processedJsonData.noData) { - - // The file setting data was deleted, we can remove - // its markup from the form. - $fileElement = this.getFileHtmlElement_(processedJsonData.noData); - this.unbindPartial($fileElement); - $fileElement.empty(); - } else { - - // The server returned mark-up to replace - // or insert the file data in form. - $fileElement = this.getFileHtmlElement_(processedJsonData.elementId); - this.unbindPartial($fileElement); - $fileElement.html(processedJsonData.content); - } - }; - - - /** - * Get the file HTML element that contains all the file data markup. - * We assume that the id of the file HTML element it is equal - * to the file setting name. - * - * @param {string} settingName The file setting name. - * @return {jQueryObject} JQuery element. - * @private - */ - $.pkp.controllers.tab.settings.form.FileViewFormHandler.prototype. - getFileHtmlElement_ = function(settingName) { - - var $form = this.getHtmlElement(), - $fileHtmlElement = $('#' + settingName, $form); - - return $fileHtmlElement; - }; - - -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/js/controllers/tab/settings/paymentMethod/PaymentMethodHandler.js b/js/controllers/tab/settings/paymentMethod/PaymentMethodHandler.js deleted file mode 100644 index 79e6ec99fb6..00000000000 --- a/js/controllers/tab/settings/paymentMethod/PaymentMethodHandler.js +++ /dev/null @@ -1,135 +0,0 @@ -/** - * @defgroup js_controllers_tab_settings_paymentMethod - */ -/** - * @file js/controllers/tab/settings/paymentMethod/PaymentMethodHandler.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @class PaymentMethodHandler - * @ingroup js_controllers_tab_settings_paymentMethod - * - * @brief JS controller for the payment method form. - */ -(function($) { - - /** @type {Object} */ - $.pkp.controllers.tab.settings.paymentMethod = - $.pkp.controllers.tab.settings.paymentMethod || - { }; - - - - /** - * @constructor - * - * @extends $.pkp.classes.Handler - * - * @param {jQueryObject} $containerForm A wrapped HTML element that - * represents the container form element. - * @param {Object} options Optional Options. - */ - $.pkp.controllers.tab.settings.paymentMethod.PaymentMethodHandler = - function($containerForm, options) { - this.parent($containerForm, options); - - // Save the URL template for the metadata form. - this.paymentMethodFormUrlTemplate_ = options.paymentMethodFormUrlTemplate; - - // Bind for a change in the selected plugin - this.bind('selectPaymentMethod', this.selectPaymentMethodHandler); - }; - $.pkp.classes.Helper.inherits( - $.pkp.controllers.tab.settings.paymentMethod.PaymentMethodHandler, - $.pkp.classes.Handler - ); - - - // - // Private properties - // - /** - * The URL template used to fetch the metadata edit form. - * @private - * @type {string} - */ - $.pkp.controllers.tab.settings.paymentMethod.PaymentMethodHandler. - prototype.paymentMethodFormUrlTemplate_ = ''; - - - // - // Private methods - // - /** - * Get the metadata edit form URL for the given stage and submission ID. - * - * @private - * @param {string} paymentPluginName The name of the payment plugin. - * @return {string} The URL for the fetch payment form contents op. - */ - $.pkp.controllers.tab.settings.paymentMethod.PaymentMethodHandler. - prototype.getPaymentMethodFormUrl_ = function(paymentPluginName) { - - // Set the hidden input to the new plugin name (used when saving the form) - $('#paymentPluginName').val(paymentPluginName); - - // Look for PAYMENT_PLUGIN_NAME token in the URL and replace - return this.paymentMethodFormUrlTemplate_. - replace('PAYMENT_PLUGIN_NAME', paymentPluginName); - }; - - - // - // Public methods - // - /** - * Handle the "submission selected" event triggered by the - * submission select form to load the respective metadata form. - * - * @param {$.pkp.controllers.form.AjaxFormHandler} callingForm The form - * that triggered the event. - * @param {Event} event The upload event. - * @param {string|number} paymentPluginName The name of the payment plugin. - */ - $.pkp.controllers.tab.settings.paymentMethod.PaymentMethodHandler. - prototype.selectPaymentMethodHandler = - function(callingForm, event, paymentPluginName) { - - if (paymentPluginName !== 0) { - // Fetch the form - $.get(this.getPaymentMethodFormUrl_( - /** @type {string} */ (paymentPluginName)), - this.callbackWrapper(this.showFetchedPaymentMethodForm_), 'json'); - } else { - // Else it was the placeholder; blank out the form - var $paymentMethodFormContainer = $('#paymentMethodFormContainer'); - $paymentMethodFormContainer.children().remove(); - } - }; - - - /** - * Show a fetched metadata edit form. - * - * @param {Object} ajaxContext The AJAX request context. - * @param {Object} jsonData A parsed JSON response object. - * @private - */ - $.pkp.controllers.tab.settings.paymentMethod.PaymentMethodHandler. - prototype.showFetchedPaymentMethodForm_ = function(ajaxContext, jsonData) { - - var processedJsonData = this.handleJson(jsonData), - // Find the container and remove all children. - $paymentMethodFormContainer = $('#paymentMethodFormContainer'); - - $paymentMethodFormContainer.children().remove(); - - // Replace it with the form content. - $paymentMethodFormContainer.append(processedJsonData.content); - }; - - -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/js/controllers/tab/settings/permissions/form/PermissionSettingsFormHandler.js b/js/controllers/tab/settings/permissions/form/PermissionSettingsFormHandler.js deleted file mode 100644 index c2d562f97f7..00000000000 --- a/js/controllers/tab/settings/permissions/form/PermissionSettingsFormHandler.js +++ /dev/null @@ -1,146 +0,0 @@ -/** - * @defgroup js_controllers_tab_settings_permissions_form - */ -/** - * @file js/controllers/tab/settings/permissions/form/PermissionSettingsFormHandler.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @class PermissionSettingsFormHandler - * @ingroup js_controllers_tab_settings_permissions_form - * - * @brief Handle the press permission settings form. - */ -(function($) { - - /** @type {Object} */ - $.pkp.controllers.tab.settings.permissions = - $.pkp.controllers.tab.settings.permissions || {form: { } }; - - - - /** - * @constructor - * - * @extends $.pkp.controllers.form.AjaxFormHandler - * - * @param {jQueryObject} $form the wrapped HTML form element. - * @param {Object} options form options. - */ - $.pkp.controllers.tab.settings.permissions.form. - PermissionSettingsFormHandler = function($form, options) { - - this.parent($form, options); - - // Handle events on license URL controls - $('#licenseURLSelect', $form).change( - this.callbackWrapper(this.licenseURLSelectChange)); - $('input[id^="licenseURL-"]', $form).keyup( - this.callbackWrapper(this.licenseURLOtherChange)); - - // Handle events on copyright holder type controls - $('input[id^="copyrightHolderType-"]', $form).change( - this.callbackWrapper(this.copyrightHolderRadioSelect)); - - // Handle events on copyright holder type controls - $('#resetPermissionsButton', $form).button().click( - this.callbackWrapper(this.resetPermissionsHandler)); - - - this.resetPermissionsUrl = options.resetPermissionsUrl; - this.resetPermissionsConfirmText = options.resetPermissionsConfirmText; - }; - $.pkp.classes.Helper.inherits( - $.pkp.controllers.tab.settings.permissions.form. - PermissionSettingsFormHandler, - $.pkp.controllers.form.AjaxFormHandler); - - - /** - * Reset permissions post URL - * @protected - * @type {string?} - */ - $.pkp.controllers.tab.settings.permissions.form.PermissionSettingsFormHandler. - prototype.resetPermissionsUrl = null; - - - /** - * Reset permissions confirmation message - * @protected - * @type {string?} - */ - $.pkp.controllers.tab.settings.permissions.form.PermissionSettingsFormHandler. - prototype.resetPermissionsConfirmText = null; - - - // - // Public methods. - // - /** - * Event handler that is called when the license URL select is changed. - * @param {HTMLElement} element The input element. - */ - $.pkp.controllers.tab.settings.permissions.form. - PermissionSettingsFormHandler.prototype. - licenseURLSelectChange = function(element) { - var $htmlElement = this.getHtmlElement(), - $licenseURLSelect = $htmlElement.find('#licenseURLSelect'), - $otherField = $htmlElement.find('input[id^="licenseURL-"]'); - $otherField.val(/** @type {string} */ ($licenseURLSelect.val())); - }; - - - /** - * Event handler that is called when the license URL "other" field is changed. - * @param {HTMLElement} element The input element. - */ - $.pkp.controllers.tab.settings.permissions.form. - PermissionSettingsFormHandler.prototype. - licenseURLOtherChange = function(element) { - var $licenseURLSelect = this.getHtmlElement().find('#licenseURLSelect'); - - // Select the "other" option in the dropdown. - $licenseURLSelect.val(''); - }; - - - /** - * Event handler that is called when a copyright holder radio is clicked. - * @param {HTMLElement} element The input element. - */ - $.pkp.controllers.tab.settings.permissions.form. - PermissionSettingsFormHandler.prototype. - copyrightHolderRadioSelect = function(element) { - var $htmlElement = this.getHtmlElement(), $element = $(element), - $copyrightHolderOther = $htmlElement.find( - 'input[id^="copyrightHolderOther-"]'); - - if ($element.val() === 'other') { - $copyrightHolderOther.removeAttr('disabled'); - } else { - $copyrightHolderOther.attr('disabled', 'disabled'); - } - }; - - - /** - * Event handler that is called when the "reset permissions" button is clicked. - * @param {HTMLElement} element The input element. - */ - $.pkp.controllers.tab.settings.permissions.form. - PermissionSettingsFormHandler.prototype. - resetPermissionsHandler = function(element) { - if (confirm(this.resetPermissionsConfirmText)) { - $.post(this.resetPermissionsUrl, {}, function() { - // A notification was posted; display it. - $('body').trigger('notifyUser'); - }); - } - }; - - -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/js/controllers/tab/settings/siteAccessOptions/form/SiteAccessOptionsFormHandler.js b/js/controllers/tab/settings/siteAccessOptions/form/SiteAccessOptionsFormHandler.js deleted file mode 100644 index 723f9c3718a..00000000000 --- a/js/controllers/tab/settings/siteAccessOptions/form/SiteAccessOptionsFormHandler.js +++ /dev/null @@ -1,105 +0,0 @@ -/** - * @defgroup js_controllers_tab_settings_siteAccessOptions_form - */ -/** - * @file js/controllers/tab/settings/siteAccessOptions/form/SiteAccessOptionsFormHandler.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @class SiteAccessOptionsFormHandler - * @ingroup js_controllers_tab_settings_siteAccessOptions_form - * - * @brief Handle the site access options form. - */ -(function($) { - - /** @type {Object} */ - $.pkp.controllers.tab.settings.siteAccessOptions = - $.pkp.controllers.tab.settings.siteAccessOptions || {form: { } }; - - - - /** - * @constructor - * - * @extends $.pkp.controllers.form.AjaxFormHandler - * - * @param {jQueryObject} $form the wrapped HTML form element. - * @param {Object} options form options. - */ - $.pkp.controllers.tab.settings.siteAccessOptions.form. - SiteAccessOptionsFormHandler = function($form, options) { - - this.parent($form, options); - - // Attach form elements events. - $('#disableUserReg-0', $form).click( - this.callbackWrapper(this.changeRegOptsState)); - $('#disableUserReg-1', $form).click( - this.callbackWrapper(this.changeRegOptsState)); - - }; - $.pkp.classes.Helper.inherits( - $.pkp.controllers.tab.settings.siteAccessOptions.form. - SiteAccessOptionsFormHandler, - $.pkp.controllers.form.AjaxFormHandler); - - - // - // Public methods. - // - /** - * Event handler that is called when the suggest username button is clicked. - * @param {HTMLElement} element The checkbox input element. - */ - $.pkp.controllers.tab.settings.siteAccessOptions.form. - SiteAccessOptionsFormHandler.prototype. - changeRegOptsState = function(element) { - if (element.id === 'disableUserReg-0') { - this.setRegOptsDisabled_(false); - } else { - this.setRegOptsDisabled_(true); - this.setRegOptsChecked_(false); - } - }; - - - // - // Private helper methods - // - /** - * Change the disabled state of the user registration options. - * @private - * @param {boolean} state The state of the disabled attribute. - */ - $.pkp.controllers.tab.settings.siteAccessOptions.form. - SiteAccessOptionsFormHandler.prototype. - setRegOptsDisabled_ = function(state) { - if (state) { - $('[id^="allow"]').attr('disabled', 'disabled'); - } else { - $('[id^="allow"]').removeAttr('disabled'); - } - }; - - - /** - * Change the checked state of the user registration options. - * @private - * @param {boolean} state The state of the checked attribute. - */ - $.pkp.controllers.tab.settings.siteAccessOptions.form. - SiteAccessOptionsFormHandler.prototype. - setRegOptsChecked_ = function(state) { - if (state) { - $('[id^="allow"]').attr('checked', 'checked'); - } else { - $('[id^="allow"]').removeAttr('checked'); - } - }; - - -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/js/controllers/tab/workflow/WorkflowTabHandler.js b/js/controllers/tab/workflow/WorkflowTabHandler.js index 55486bfddae..f1a590897a3 100644 --- a/js/controllers/tab/workflow/WorkflowTabHandler.js +++ b/js/controllers/tab/workflow/WorkflowTabHandler.js @@ -16,6 +16,10 @@ */ (function($) { + /** @type {Object} */ + $.pkp.controllers.tab = + $.pkp.controllers.tab || {}; + /** @type {Object} */ $.pkp.controllers.tab.workflow = $.pkp.controllers.tab.workflow || {}; diff --git a/js/lib/jquery/plugins/spectrum b/js/lib/jquery/plugins/spectrum deleted file mode 160000 index 74ccb0e48f4..00000000000 --- a/js/lib/jquery/plugins/spectrum +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 74ccb0e48f43a069b45c8b6cdf981a59ded3e271 diff --git a/js/load.js b/js/load.js index 30b20e445b1..9f064eb710f 100644 --- a/js/load.js +++ b/js/load.js @@ -11,10 +11,16 @@ // Vue lib and custom mixins import Vue from 'vue'; import GlobalMixins from '@/mixins/global.js'; +import VTooltip from 'v-tooltip'; +import VueScrollTo from 'vue-scrollto'; +import Tabs from 'vue-tabs-component'; // Helper for initializing and tracking Vue controllers import VueRegistry from './classes/VueRegistry.js'; +Vue.use(VTooltip, {defaultTrigger: 'click'}); +Vue.use(VueScrollTo); +Vue.use(Tabs); Vue.mixin(GlobalMixins); export default { diff --git a/js/pages/admin/ContextsHandler.js b/js/pages/admin/ContextsHandler.js deleted file mode 100644 index 493570db1c6..00000000000 --- a/js/pages/admin/ContextsHandler.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @defgroup js_pages_admin - */ -/** - * @file js/pages/admin/ContextsHandler.js - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @class ContextsHandler - * @ingroup js_pages_admin - * - * @brief Handler for the hosted contexts page. - * - */ -(function($) { - - /** @type {Object} */ - $.pkp.pages.admin = $.pkp.pages.admin || { }; - - - - /** - * @constructor - * - * @extends $.pkp.classes.Handler - * - * @param {jQueryObject} $contexts The HTML element encapsulating - * the contexts page. - * @param {Object} options Handler options. - */ - $.pkp.pages.admin.ContextsHandler = - function($contexts, options) { - - var $linkActionElement = $('#openWizard a'); - - if ($linkActionElement) { - // Hide the link to users. - $linkActionElement.attr('style', 'display:none'); - } - - this.parent($contexts, options); - }; - $.pkp.classes.Helper.inherits( - $.pkp.pages.admin.ContextsHandler, - $.pkp.classes.Handler); - - -/** @param {jQuery} $ jQuery closure. */ -}(jQuery)); diff --git a/locale/ar_IQ/admin.xml b/locale/ar_IQ/admin.xml index 088ba5c6a62..190e47d961e 100644 --- a/locale/ar_IQ/admin.xml +++ b/locale/ar_IQ/admin.xml @@ -65,20 +65,14 @@ رقم نسخة PHP منصة نظام التشغيل الإعدادات - عن أوصاف الموقع + عن أوصاف الموقع البريد الالكتروني لعنوان الاتصال الأساسي اسم عنوان الاتصال الأساسي - البريد الالكتروني لعنوان الاتصال الأساسي مطلوب حتماً. - اسم عنوان الاتصال الأساسي مطلوب حتماً. - عليك أن تحدد أقل طول مسموح به لكلمة المرور في الموقع بما لا يقل عن 4 حروف. - العنوان مطلوب حتماً. إن نظامك مهيأ لتسجيل أكثر من مقياس استعمال واحد. إحصائيات الاستعمال سيتم عرضها في عدة سياقات. هناك حالات لا بد فيها من استعمال إحصائية واحدة، مثلاً: عرض قائمة مرتبة بأكثر طلبات النشر استعمالاً أو عند تقييم نتائج البحث في الموقع. لطفاً، عليك اختيار أحد هذه المقاييس ليكون بمثابة المقياس الافتراضي. - شعار الموقع - صيغة ملف شعار الموقع غير صحيحة. الصيغ المقبولة هي .gif، .jpg، أو .png. المقدمة أقل طول لكلمة المرور لغة الموقع @@ -106,7 +100,7 @@ تتوفر نسخة محدثة إن نظامك مواكب لأحدث نسخة النسخة - + المسار الأساسي {$path} ينبغي أن يكون ضمن حافظة الملفات العمومية. حافظة الملفات {$path} ليست مساراً صحيحاً أو تتعذر قراءتها. الملف {$filename} تعذر نقله من {$currentFilePath} إلى {$destinationPath} diff --git a/locale/ar_IQ/api.xml b/locale/ar_IQ/api.xml index a32bc44d098..8d7e4f3af99 100644 --- a/locale/ar_IQ/api.xml +++ b/locale/ar_IQ/api.xml @@ -16,7 +16,7 @@ يمكنك فقط معاينة الطلبات غير المنشورة التي تم تعيينها لك. ليس بإمكانك حذف طلب النشر غير المضمن في هذا السياق. ليس لديك صلاحية حذف طلب النشر هذا. - الموارد التي تطلبتها غير متاحة حالياً. + الموارد التي تطلبتها غير متاحة حالياً. تعذر تنفيذ طلبك لأنه يفتقر إلى معلومات ضرورية. حدث خطأ غير متوقع. لطفاً، أعد تحميل الصفحة ثم حاول مرة أخرى. تعذر تنفيذ طلبك لأن رمز تعريف مرحلة طلب النشر غير صحيح. diff --git a/locale/ar_IQ/common.xml b/locale/ar_IQ/common.xml index 0c035cacdd6..f9573bdc637 100644 --- a/locale/ar_IQ/common.xml +++ b/locale/ar_IQ/common.xml @@ -56,7 +56,6 @@ of a the and an or nor but is if then else when at from by on off for in out over to into with و أو من إلى في على عن كل إلا معيَّن سابقاً النص البديل - لطفاً، زود الموقع بالنص البديل لهذه الصورة لضمان إمكانية وصول المستخدمين الذين يستعملون متصفحات لا تدعم الصور أو أجهزة مُعينة. و أجرِ اللازم عيِّن @@ -167,7 +166,6 @@ إبدأ قيد الإنجاز فقرة لكل صفحة - الصورة المصغرة الكلمات المفتاحية اللغة اللغات @@ -200,6 +198,8 @@ تمام خيارات ترتيب + زيادة موقع {$itemTitle} + تقليل موقع {$itemTitle} الاسم الأصلي للملف أو غير ذلك @@ -207,7 +207,6 @@ {$start}-{$end} من {$total} إستعرض المزيد من الصفحات الصفحة {$pageNumber} - شعار رأس الصفحة {$percentage}% البرنامج الإضافي البرنامج الإضافي "{$pluginName}" تم تمكينه. @@ -267,11 +266,8 @@ بلا عنوان محدث تاريخ الرفع - الملف المرفوع رفع تعذر رفع الملف أو تنقيحه. - لم يتم رفع الملف أو أن نوعيته خاطئة! - صورة الصفحة الرئيسية أعلى رفع الملف تغيير الملف @@ -339,7 +335,6 @@ هو يبدأ بـ لم يتم تقديم النموذج بالشكل الصحيح. - لم يتم تقديم النموذج بشكل صحيح. لا بد من تحميل ملف. (* مطلوب حتماً) إعادة التقديم diff --git a/locale/ar_IQ/manager.xml b/locale/ar_IQ/manager.xml index 856ff2a311a..5b20c4e67d7 100644 --- a/locale/ar_IQ/manager.xml +++ b/locale/ar_IQ/manager.xml @@ -213,27 +213,23 @@ ضيِّق النتائج حسب الدولة، المنطقة و/أو المدينة. الراعي المحتوى الإضافي - أي شيء تكتبه هنا سيظهر في صفحتك الرئيسية. - بيان الحقوق الفكرية - يتطلب من المؤلفين الموافقة على بيان الحقوق الفكرية كجزء من عملية التقديم. + أي شيء تكتبه هنا سيظهر في صفحتك الرئيسية. + بيان الحقوق الفكرية + يتطلب من المؤلفين الموافقة على بيان الحقوق الفكرية كجزء من عملية التقديم. إرشادات المؤلف الإرشادات الموصى بها تتضمن المعايير القياسية للسيرة والتنسيق جنباً إلى جنب مع أمثلة لتنسيقات شائعة من الاقتباسات التي بالإمكان استعمالها في المؤلفات. المصالح المتضاربة - ستتم مطالبة المحكمين بالإذعان لسياسة الكشف عن المصالح المتضاربة التي تحددها أدناه. حدث خطأ ما عند حذف هذه الفقرة. - صيغة الصورة المصغرة خاطئة. الصيغ المدعومة هي: .ico, .png, and .gif. + الصورة المصغرة التجميع حسب نوع الملف - صيغة ملف شعار رأس الصفحة الرئيسية غير صحيحة أو فشل تحميلها. الصيغ المدعومة هي: .gif، .jpg، أو .png. الصفحة الرئيسية - إرفع صورة لإظهارها في الصفحة الرئيسية. + إرفع صورة لإظهارها في الصفحة الرئيسية. صيغة ملف صورة الصفحة الرئيسية غير صحيحة أو فشل تحميلها. الصيغ المدعومة هي: .gif، .jpg، أو .png. صيغة ملف صورة عنوان رأس الصفحة الرئيسية غير صحيحة أو فشل تحميلها. الصيغ المدعومة هي: .gif، .jpg، أو .png. الأوصاف - النمط - يمكن تنصيب الأنماط الجديدة عبر باب الإضافة المتوضع في أعلى هذه الصفحة. - إدارة الشريط الجانبي + النمط + يمكن تنصيب الأنماط الجديدة عبر باب الإضافة المتوضع في أعلى هذه الصفحة. الشريط الجانبي - غير محددة تسجيل الوقائع والمراجعة الصورة المصغرة إشعار تقديم المؤلف لطلب نشر @@ -243,7 +239,7 @@ إذا كان مسموحاً بالوصول المفتوح المباشر إلى كل المحتوى المنشور، فبإمكانك إدخال وصف عن سياسة الوصول المفتوح التي تعمل بها. صيغة ملف شعار رأس الصفحة غير صحيحة أو فشل تحميلها. الصيغ المدعومة هي: .gif، .jpg، أو .png. نهاية الصفحة - أدخل أي صورة، نص، أو ترميز HTML ترغب أن يظهر عند الطرف الأسفل لموقعك. + أدخل أي صورة، نص، أو ترميز HTML ترغب أن يظهر عند الطرف الأسفل لموقعك. لخص سياسة التحكيم المناظر وإجراءاتها للقراء والمؤلفين. هذا الوصف عادة ما يتضمن الإشارة إلى عدد المحكمين الذين تتم الاستعانة بهم إعتيادياً لتحكيم مؤلَّف ما وتعريف بالمعايير الذي يُطلب منهم اتباعها عند التحكيم، والفترة المتوقع أن تستغرقها عملية اتخاذ القرار بشأنه، والمبادئ التي يتم على ضوئها انتخاب هؤلاء المحكمين. عنوان الاتصال الرئيسي أدخل تفاصيل العنوان التي عادة ما تكون لعضو أساسي في هيئة التحرير أو لرئيس التحرير أو لصاحب منصب إداري رئيسي، إذ أن هذا العنوان سيظهر علانية على موقعك. @@ -253,12 +249,9 @@ الأسابيع المسموح بها لإكمال مهمة التحكيم لا تذكرني مطلقاً الإعدادات الإفتراضية بالإمكان تعديلها لكل مهمة تحكيم خلال مرحلة التحرير. - أرسل تذكيراً إذا تأخر المحكم في الاستجابة لطلب التحكيم بعد مرور فترة (بالأيام) تتجاوز الموعد المحدد: - أرسل تذكيراً إذا لم يرسل المحكم توصيته بعد مرور فترة (بالأيام) من انقضاء فترة التحكيم: + أرسل تذكيراً إذا تأخر المحكم في الاستجابة لطلب التحكيم بعد مرور فترة (بالأيام) تتجاوز الموعد المحدد: + أرسل تذكيراً إذا لم يرسل المحكم توصيته بعد مرور فترة (بالأيام) من انقضاء فترة التحكيم: المواعيد النهائية للتحكيم إفتراضياً - أضف رابطاً عن "ضمان التحكيم السري" خلال رفع الملفات - خريطة الموقع - {$path}]]> وصف علاقة الجهة الراعية وسياستها أمثلة: الرابطات الطلابية، أقسام الجامعات، جهات متعاونة... وما شابه. يتم عرض هذه الجهات علانية في الموقع. مطورو مواقع الإنترنت ذوو الخبرة بإمكانهم رفع ملف أنماط بصيغة CSS لمزيد من التحكم بمظهر الموقع. @@ -366,7 +359,6 @@ لم يتم اختيار طريقة الدفع طريقة الدفع العملة - المدفوعات الحادثة مباشرة عبر هذا الموقع ستعتبر بالعملة المنتخبة. خيارات الدور diff --git a/locale/ar_IQ/reader.xml b/locale/ar_IQ/reader.xml index 5aafdf2b9dc..846c1f7fb8e 100644 --- a/locale/ar_IQ/reader.xml +++ b/locale/ar_IQ/reader.xml @@ -34,147 +34,4 @@ العنوان معاينة كل التعليقات النص الكامل: - أضف تعليقاً - الإعدادات - هل أنت متأكد من رغبتك في حذف هذا السياق وكل عمليات البحث المتعلقة به؟ - إنشاء سياق - تعديل السياق - البيانات الوصفية - استعمل أسماء المؤلفين كعبارات بحث إفتراضية لتمكين المستخدمين من العثور على الأعمال الأخرى لهؤلاء المؤلفين بشأن هذه الفقرة (أي، لسياق "الأعمال الأخرى") - استعمل أسماء المؤلفين كعبارات بحث إفتراضية وصِف السياق كعملية بحث عن الاقتباسات للمؤلَّف. - إعدادات أدوات القراءة للسماح بالنقر المزدوج على الكلمات لفتح هذا السياق.]]> - استعمل بيانات الفهرسة الجغرافية كعبارات البحث الإفتراضية. - الخيارات - الإدارة - - المشاركة - المشاركة ممكَّنة - addthis.com، ثم استعمل نسخ/لصق للنص البرمجي الخاص بالمشاركة من الزر أدناه.]]> - - الإعدادات الأساسية - اسم المستخدم لدى AddThis.com - نمط الزر - استعمل القائمة المنسدلة - الإعدادات المتقدمة (إختيارية) - أدبيات تخصيص AddThis.com كمرجع.]]> - العلامة - (قائمة تفصل مكوناتها الفارزة الإنجليزية)]]> - اللغة - الشعار - خلفية الشعار - لون الشعار - - أدوات القراءة - هل أنت متأكد من رغبتك في حذف عملية البحث هذه؟ - إنشاء عملية بحث - تعديل عملية البحث - الفقرات ذات الصلة - الملخص (يعرض ملخص الفقرة). - معاينة سياسة التحكيم. - عن المؤلف (يعرض عبارات السيرة الذاتية التي أدخلها المؤلف). - كيفية الاقتباس من الفقرة (يقدم تفاصيل سيرة الفقرة). - عبارات البحث (يتيح للقراء النقر المزدوج على أي كلمة ضمن الفقرة ومن ثم إرسال الكلمة إلى قاموس). - تعطيل الفقرات ذات الصلة - أبلغ المؤلف عبر البريد الالكتروني (يقود إلى قالب رسالة الكترونية معنونة إلى المؤلف). - إشعار زميل (يقود إلى قالب رسالة الكترونية تتضمن رابطاً إلى الفقرة). - العثور على المراجع. - نسخة الطباعة (يقدم نسخة قابلة للطبع للفقرة). - الملفات التكميلية (يعرض قائمة الملفات التي ضمنها المؤلف في طلبه للنشر). - فهرسة البيانات الوصفية (يعرض البيانات الوصفية لفهرسة الفقرة التي أدرجها المؤلف والنظام). - الحالة - إعداد AddThis - إكتملت المصادقة. - صحيح - {$url} غير صالح. - مصادقة روابط الإنترنت لأدوات القراءة - المصادقة - هل أنت متأكد من رغبتك في حذف هذه النسخة وكل السياقات وعمليات البحث ذات الصلة؟ - هل أنت متأكد من رغبتك في إجراء الاستعادة غير القابلة للتراجع لجميع النسخ عوداً إلى إفتراضاتها؟ إن كان كذلك، فعليك باختيار نسخة نشطة في صفحة الإعدادات. - إنشاء نسخة - تعديل النسخة - تصدير - استيراد نسخة - البيانات الوصفية - استعادة النُسخ إلى إفتراضياتها - عن المؤلف - صيغة الاقتباس - كيفية الاقتباس من الفقرة - على الإنترنت - الشبكة العنكبوتية - إشعار زميل - الاختصار - AND - إذا تمت فهرسة الفقرة في الباحث العلمي من Google، قد يُصاحبه رابط "مقتبس من قبل س"، الذي يقود إلى قائمة من الأعمال التي اقتبست منه. فضلاً عن ذلك، سيقوم الباحث العلمي من Google بإدراج كل الفقرات التي استشهدت بالعنوان والمؤلف. للوصول إلى المصادر على الإنترنت المتاحة حصرياً عبر مكتبتك البحثية، بإمكانك الذهاب إلى تفضيلاتك لخدمة الباحث العلمية وتفعيل روابط المكتبة لمؤسستك. - السياق - إذا كانت الفقرة هي ملف HTML (بدلاً من PDF)، النقر المزدوج على أي كلمة ضمن النص سيظهرها في إطار "تعريف الكلمة". بخلاف ذلك، يمكن إدخال الكلمات أو لصقها ضمن ذلك الإطار. لمعرفة المزيد عن المصدر الخاضع للبحث، أنقر على (عن). تم انتخاب هذه المصادر لعلاقتها بالموضوع ولكونها مفتوحة (مجانية) في كل أو بعض محتوياتها. - الوصف - الفرز - السياقات - عبارات البحث تم اختيارها من قبل المؤلف/المؤلفين. بالإمكان تعديلها أو حذفها من قبل القارئ، حيث أن عبارتين أو ثلاث قصار ودقيقة تنتج أفضل النتائج لعمليات البحث المكونة من تجميعها بأداة الاتحاد (AND). لمعرفة المزيد عن المصادر الخاضعة للبحث، أنقر على (عن). تم انتخاب هذه المصادر لعلاقتها بالموضوع ولكونها مفتوحة (مجانية) في كل أو بعض محتوياتها. - عبارات البحث - تحديد الكلمة - العنوان - مراسلة المؤلف - التسجيل]]> - تم إرسال رسالتك. - العثور على المراجع - الباحث العلمي من Google - أكاديمية Windows Live - عبارات البحث - مساهم - التغطية - التأريخ - الوصف - Dublin Core - الصيغة - المعرَّف - اللغة - الناشر - الصلة - الحقوق - المصدر - الموضوع - العنوان - النوع - البيانات الوصفية لهذه الوثيقة - الملخص - الحقوق الفكرية والصلاحيات - الموقع المكاني الجغرافي، الحقبة الزمنية، عينة البحث (الجنس، العمر... إلخ.). - (YYYY-MM-DD) - التخصصات العلمية - صيغة الملف - - فقرات البيانات الوصفية لمشروع المعرفة العامة - English=en - الوكالة المنظِّمة، الموقع - العنوان؛ المجلد؛ العدد (السنة) - الجهات الراعية - الكلمات المفتاحية - الملفات التكميلية - عنوان الوثيقة - النوع - معرَّف الموارد الموحد - نسخة الطباعة - أدوات القراءة - الفقرات ذات الصلة - سياسة التحكيم - الوصف - عمليات البحث - الفرز - عملية البحث - البيانات المطروحة - رابط البحث على الإنترنت - إفترح مصدراً - العنوان - رابط الإنترنت - تنزيل - الملفات التكميلية - فهرسة البيانات الوصفية - الوصف - المفتاح - اللغة - مجاميع الفقرات ذات الصلة - العنوان - النسخة - فهرسة البيانات الوصفية diff --git a/locale/ar_IQ/submission.xml b/locale/ar_IQ/submission.xml index f46a6ea5b0e..1deb492da14 100644 --- a/locale/ar_IQ/submission.xml +++ b/locale/ar_IQ/submission.xml @@ -618,8 +618,6 @@ استيجاب التحكيم التحكيم مسَلم أتريد حذف الطلب؟ - زيادة موقع {$itemTitle} - تقليل موقع {$itemTitle} معاينة الطلب مهام التحكيم مكتملة التحكيمات مسلَّمة diff --git a/locale/ca_ES/admin.xml b/locale/ca_ES/admin.xml index 5a42a98246b..dcf3397f607 100644 --- a/locale/ca_ES/admin.xml +++ b/locale/ca_ES/admin.xml @@ -31,7 +31,7 @@ Aquesta eina només copiarà els fitxers que no es trobin al fitxer d'estats d' Ús: {$scriptName} path/to/apache/log/file.log Ús (proessa tots els fitxers a un directori d'arxiu): {$scriptName} path/to/apache/directory -Ús (processa tots els fitxers a un directori de fitxers que comença amb la cadena anterior): {$scriptName} path/to/apache/directory starts_with_string +Ús (processa tots els fitxers a un directori de fitxers que comença amb la cadena anterior): {$scriptName} path/to/apache/directory starts_with_string Hi ha hagut un error: no s'ha pogut crear un directori temporal a {$tmpDir} Hi ha hagut un error: No s'ha pogut accedir al fitxer {$filePath} o no existeix. @@ -77,19 +77,13 @@ Aquesta eina només copiarà els fitxers que no es trobin al fitxer d'estats d' Versió de PHP Plataforma del SO Configuració - Quant a la descripció del lloc + Quant a la descripció del lloc Adreça electrònica del contacte principal Nom del contacte principal - Heu d’introduir l’adreça electrònica del contacte principal. - Heu d’introduir el nom del contacte principal. - Heu d’introduir una contrasenya de quatre caràcters com a mínim. - Cal que introduïu un títol. La instal·lació està configurada per enregistrar més d'una analítica web. Les estadístiques d'ús es mostraran en diversos contextos. Hi ha casos en què s'ha d'utilitzar una estadística d'ús, p.ex. per mostrar una llista ordenada de les trameses més emprades o bé per ordenar els resultats d'una cerca. Seleccioneu una de les analítiques configurades com a analítica per defecte. - Logotip del lloc - El format de la imatge utilitzada com a logotip al lloc web no és vàlid. Els formats acceptats són .gif, .jpg i .png. Introducció Longitud mínima de la contrasenya caràcters @@ -129,7 +123,7 @@ Aquesta eina només copiarà els fitxers que no es trobin al fitxer d'estats d' Aquesta eina només copiarà els fitxers que no es trobin al fitxer d'estats d'ús\n als directoris de càrrega (fase, processament, arxivar i rebutjar). Ús: {$scriptName} path/to/apache/log/file.log -Ús (s'estan processant tots els fitxers a un directori de fitxer): {$scriptName} path/to/apache/directory +Ús (s'estan processant tots els fitxers a un directori de fitxer): {$scriptName} path/to/apache/directory Hi ha hagut un error: no s'ha pogut crear un directori temporal a {$tmpDir} Hi ha hagut un error: el fitxer {$filePath} no existeix o bé no s'hi pot accedir. diff --git a/locale/ca_ES/common.xml b/locale/ca_ES/common.xml index 7e8bf0af114..c2f4d869f9b 100644 --- a/locale/ca_ES/common.xml +++ b/locale/ca_ES/common.xml @@ -54,7 +54,6 @@ de un una el la els les i o ni però és si llavors altre altra quan en des de per dins fora Assignat Text alternatiu - Si us plau, introduïu text alternatiu per a aquesta imatge per tal que sigui accessible per als usuaris/usuàries que fan servir navegadors només de text o dispositius d’assistència. i Aplica l’acció Assigna @@ -173,7 +172,6 @@ o Altres Endarrerit - Logotip per a la capçalera de pàgina Connector El mòdul «{$pluginName}» ha estat habilitat. S'ha desactivat el mòdul «{$pluginName}». @@ -224,13 +222,9 @@ No llegit Sense títol Actualitzat - Fitxer penjat Penja El fitxer no s’ha pogut carregar ni revisar. - {$supportName} per obtenir ajuda.]]> - No s’ha carregat cap fitxer o tipus de fitxer invàlid. Capçalera de la pàgina - Imatge de la pàgina d'inici Amunt URL Usuari/Usuària @@ -508,7 +502,6 @@ Activitat de la discussió. Discussió afegida. Assigna un corrector/a d'originals mitjançant l'opció "Afegir" de la llista de participants. - Icona de web Notificat: {$dateNotified} Pàgina {$pageNumber} {$percentage}% @@ -527,7 +520,6 @@ Nom del remitent Correu electrònic del remitent La URL especificada no és vàlida. Comprovi-la i torni a intentar-ho, si us plau. - El formulari no s'ha enviat correctament Previ Següent Afegeix nota diff --git a/locale/ca_ES/installer.xml b/locale/ca_ES/installer.xml index d9c9dc89640..3264ca8d6df 100644 --- a/locale/ca_ES/installer.xml +++ b/locale/ca_ES/installer.xml @@ -66,7 +66,6 @@ Identificador del dipòsit OAI El directori per als fitxers públics no existeix o no té permís d’escriptura. Notes de la versió - Configuració de seguretat Passos previs a la instal·lació 1. Els fitxers i directoris següents (i el seu contingut) han de tenir permisos d'escriptura.

diff --git a/locale/ca_ES/manager.xml b/locale/ca_ES/manager.xml index d4f54a6a3ff..ade284df04c 100644 --- a/locale/ca_ES/manager.xml +++ b/locale/ca_ES/manager.xml @@ -213,26 +213,23 @@ Patrocinadors Directrius per a l’autor/a Conflicte d’interessos - Es demanarà als revisors/oresque compleixin amb la política de divulgació de conflicte d'interessos que especifiqueu a continuació. + Icona de web Classificació dels tipus de fitxers Temps permès per rebre respostes de revisió (setmanes) Temps permès per completar les revisions (setmanes) No m'ho recordis - Envia un recordatori si el revisor/a no ha respost a una sol·licitud de revisió en el període següent (dies): - Envia un recordatori si el revisor/a no ha tramès una recomanació en el període següent (dies): + Envia un recordatori si el revisor/a no ha respost a una sol·licitud de revisió en el període següent (dies): + Envia un recordatori si el revisor/a no ha tramès una recomanació en el període següent (dies): Gèneres dependents Organitzacions patrocinadores Podeu afegir una nota per descriure la vostra política i relació de patrocini, que apareixerà amb la llista de patrocinadors/ores a la vostra pàgina d'Informació personal. Podeu afegir una nota per descriure la política i la relació que heu establert amb les vostres fonts de finançament, que apareixerà amb la llista de Fonts de finançament a la vostra pàgina d'Informació personal. Podeu carregar un fitxer de full d'estil en cascada (CSS) addicional per canviar l'aparença. S’ha produït un error en suprimir aquest element. - Ha fallat la càrrega de la imatge utilitzada com a logotip per a la capçalera de la pàgina inicial, o bé el format no és vàlid. Els formats acceptats són .gif, .jpg i .png. Ha fallat la càrrega de la imatge per a la capçalera de la pàgina inicial, o bé el format no és vàlid. Els formats acceptats són .gif, .jpg i .png. Ha fallat la càrrega de la imatge del títol per a la capçalera de la pàgina inicial, o bé el format no és vàlid. Els formats acceptats són .gif, .jpg i .png. - Tema - Trieu un tema d'entre els mòduls de tema disponibles. - Administració de la barra lateral - No seleccionada + Tema + Trieu un tema d'entre els mòduls de tema disponibles. Registre i control Ha fallat la càrrega de la imatge utilitzada com a logotip per a la capçalera de la pàgina, o bé el format no és vàlid. Els formats acceptats són .gif, .jpg i .png. Ha fallat la càrrega de la imatge del títol per a la capçalera de la pàgina inicial, o bé el format no és vàlid. Els formats acceptats són .gif, .jpg i .png. @@ -313,7 +310,6 @@ No s'ha seleccionat cap mètode de pagament Mètode de pagament Moneda - Els pagaments efectuats mitjançant aquest lloc web es denominaran en la moneda seleccionada. Opcions de rol diff --git a/locale/ca_ES/reader.xml b/locale/ca_ES/reader.xml index 51a10ff1591..ec0d9615a51 100644 --- a/locale/ca_ES/reader.xml +++ b/locale/ca_ES/reader.xml @@ -34,148 +34,4 @@ Títol Visualitza tots els comentaris Text complet: - Vull afegir un comentari - Configuració - Esteu segur/a que voleu suprimir aquest context i totes les cerques associades? - Crea un context - Edita el context - Metadades - Utilitza els noms dels autors/es com a termes predeterminats per a la cerca per a permetre als usuaris que cerquin altres obres dels autors d’aquest element (p. ex. en un context de tipus «Altres obres»). - Utilitza els noms dels autors/es com a termes predeterminats per a la cerca i descriu el context com a cerca per a les citacions de l’article. - Configuració RST.]]> - Utilitza les dades d’indexació geogràfica com a termes predeterminats per a la cerca. - Opcions - Gestió - - Compartició - Compartició habilitada - Addthis.com, i copieu i enganxeu a continuació el codi del botó «Compartició».]]> - - Configuració bàsica - Nom d’usuari/ària d’AddThis.com - Estil del botó - Utilitzeu el menú desplegable - Configuració avançada (opcional) - documentació de configuració d'AddThis.com per obtenir-ne més informació.]]> - Marca - (llista separada per comes)]]> - Llengua - Logotip - Fons del logotip - Color del logotip - - Eines de lectura - Esteu segur/a que voleu suprimir aquesta cerca? - Crea una cerca - Edita la cerca - Elements relacionats - Resum (presenta el resum de l’element). - Visualitzeu les polítiques per a la revisió - Quant a l’autor/a (mostra els resums biogràfics introduïts per l’autor/a). - Com s’ha de citar un element (proporciona detalls bibliogràfics per a l’element). - Cerca termes (permet que lectors/es facin doble clic a qualsevol paraula d’un element i l’enviïn a un diccionari). - Inhabilita els elements relacionats - Envia un missatge de correu electrònic a l’autor/a (obre una plantilla de missatge de correu electrònic amb l’adreça electrònica de l’autor/a). - Notifica a un col·lega (obre una plantilla de missatge de correu electrònic amb un enllaç a un element). - Cerca referències - Versió d’impressió (proporciona una versió adequada per a la impressió d’un element). - Fitxers addicionals (mostra la llista de fitxers de l’autor/a inclosos amb aquesta tramesa). - Metadades d’indexació (mostra les dades d’indexació de l’element proporcionades per l’autor/a i el sistema). - Estat - Configura AddThis - S’ha completat la validació. - D’acord - {$url} no és vàlid. - Valida els URL per a les eines de lectura - Valida - Esteu segur/a que voleu suprimir aquesta versió i tots els contextos i cerques associats? - Esteu segur/a que voleu restaurar totes les versions als valors predeterminats? Aquesta acció és irreversible. Si ho feu, haureu de triar una versió activa a la pàgina «Configuració». - Crea una versió - Edita la versió - Exporta - Importa la versió - Metadades - Restaura les versions als valors predeterminats - Quant a l’autor/a - Format de la citació - Com s’ha de citar un element - En línia - Web - Recomana-ho - Abrev. - I - Si l'article està indexat a Google Acadèmic, és possible que inclogui un enllaç «Citat per X» que dirigeixi a una llista de les obres que el citen. A més, Google Acadèmic llista tots els elements i en cita el títol i l'autor/a. Per accedir als recursos en línia que només siguin accessibles mitjançant la vostra biblioteca de recerca, aneu a la secció «Preferències acadèmiques» del Google Acadèmic i activeu l'opció «Enllaços de biblioteca» per a la vostra institució. - Context - Si l'article és un fitxer HTML i no un PDF, en fer doble clic damunt de qualsevol paraula del text, aquesta paraula s'afegirà al quadre «Paraula per definir». A més, també podeu escriure o enganxar paraules en aquest quadre. Feu clic a «Més informació» per obtenir més informació sobre el recurs cercat. Aquests recursos han estat seleccionats per la rellevància que tenen i perquè ofereixen accés lliure (gratuït) a tots o part dels continguts. - Descripció - Ordena - Contextos - Els termes de la cerca han estat seleccionats pels autors/ores. Els lectors/ores els poden modificar o eliminar tenint en compte que les millors cerques booleanes (amb l'operador AND) són les formades per dos o tres termes o frases precisos. Feu clic a «Més informació» per obtenir més informació sobre els recursos cercats. Aquests recursos han estat seleccionats per la rellevància que tenen i perquè ofereixen accés lliure (gratuït) a tots o part dels continguts. - Termes de la cerca - Paraula per definir - Títol - Envia un missatge a l’autor/a - registre]]> - S’ha enviat el missatge. - Cerca de referències - Google Acadèmic - Windows Live Academic - Cerca els termes - Col·laborador/a - Cobertura - Data - Descripció - Dublin Core - Format - Identificador - Llengua - Institució editora - Relació - Drets - Font - Matèria - Títol - Tipus - Metadades per a aquest document - Resum - Drets d’autoria i permisos - Ubicació geospacial, període cronològic, mostra de recerca (gènere, edat, etc.) - (AAAA-MM-DD) - Disciplines - Format del fitxer - - Elements de metadades del PKP - Anglès=en - Agència organitzadora, ubicació - Títol, vol., núm. (any) - Patrocinadors/es - Classificació per matèries - Paraules clau - Fitxers Fitxers - Títol del document - Tipus - Indicador universal de recursos - Versió d’impressió - Eines de lectura - Elements relacionats - Política de revisió - Descripció - Cerques - Ordena - Cerca - Publica les dades - Cerca un URL - Vull suggerir una font - Títol - URL - Baixa - Fitxers addicionals - Metadades d’indexació - Descripció - Clau - Configuració regional - Conjunts d’elements relacionats - Títol - Versió - Metadades d’indexació diff --git a/locale/cs_CZ/admin.xml b/locale/cs_CZ/admin.xml index 1acf9f01e2a..12caa20bc3a 100644 --- a/locale/cs_CZ/admin.xml +++ b/locale/cs_CZ/admin.xml @@ -47,15 +47,9 @@ Informace o serveru Verze PHP Platforma OS - O popisu stránky + O popisu stránky E-mail hlavní kontaktní osoby Jméno hlavní kontaktní osoby - Je vyžadován e-mail hlavní kontaktní osoby. - Je vyžadováno jméno hlavní kontaktní osoby. - Musíte zadat heslo o minimální délce 4 znaky. - Je vyžadován název. - Logo stránek - Neplatný formát obrázku loga stránky. Podporované formáty jsou .gif, .jpg, nebo .png. Úvod Minimální délka hesla Jazyk stránky diff --git a/locale/cs_CZ/common.xml b/locale/cs_CZ/common.xml index 2ea6ad68753..720910c1a81 100644 --- a/locale/cs_CZ/common.xml +++ b/locale/cs_CZ/common.xml @@ -40,7 +40,6 @@ A B C Č D Ď E É Ě F G H CH I Í J K L M N Ň O Ó P Q R Ř S Š T Ť U Ú Ů V W X Y Ý Z Ž Přiděleno Alternativní text - Uveďte prosím alternativní text pro tento obrázek, aby byla zaručena dostupnost pro uživatele s textovými prohlížeči nebo pomocnými zařízeními. a Provést akci Přidělit @@ -100,7 +99,7 @@ Jméno souboru Velikost souboru Typ souboru - {$username}, {$originalFilename} + {$username}, {$originalFilename} {$genre}, {$originalFilename} Výška Logo záhlaví domácí stránky @@ -134,7 +133,6 @@ Původní jméno souboru nebo Jiný - Logo záhlaví stránky Plugin Vydavatel Záznam @@ -165,7 +163,6 @@ Nezahájeno Bez názvu Aktualizováno - Nahraný soubor Nahrát Soubor nemohl být nahrán. Zkuste to prosím znovu nebo se obraťte na správce, pokud problém přetrvává. Nahoru @@ -343,7 +340,6 @@ Spustit Domů Položek na stránku - Favicon Méně Fakturační adresa (pokud se liší) Více @@ -381,8 +377,6 @@ Složka Nepřečteno Datum nahrání - Nebyl nahrán žádný soubor, nebo typ souboru je nesprávný! - Obrázek úvodní stránky Nahrát soubor Změnit soubor Sem přetáhněte soubor a pusťte jej pro nahrání @@ -404,7 +398,6 @@ Potvrdit Je třeba vložit emailovou adresu. Údaje v tomto formuláři se změnily. Chcete opravdu pokračovat bez uložení? - Formulář nebyl odeslán v pořádku. Je vyžadováno nahrání souboru. Byl nahrán neplatný obrázek. Přípustné formáty jsou .png, .gif nebo .jpg. Předešlý diff --git a/locale/cs_CZ/manager.xml b/locale/cs_CZ/manager.xml index ef515128f05..873855ed273 100644 --- a/locale/cs_CZ/manager.xml +++ b/locale/cs_CZ/manager.xml @@ -143,10 +143,8 @@ Čtenářské nástroje Role Při mazání této položky došlo k chybě. - Neplatný formát obrázku loga pro záhlaví domácí stránky. Podporované formáty jsou .gif, .jpg, nebo .png. Neplatný formát obrázku pro domácí stránku. Podporované formáty jsou .gif, .jpg, nebo .png. Neplatný formát obrázku názvu pro záhlaví domácí stránky. Podporované formáty jsou .gif, .jpg, nebo .png. - Nevybráno Zaznamenávání údajů a kontrola Neplatný formát obrázku loga pro záhlaví stránky. Podporované formáty jsou .gif, .jpg, nebo .png. @@ -293,15 +291,15 @@ výsledků vyhledávání. Zvolte jednu z nakonfigurovaných metrik jako výchoz Z´úžit výsledky podle státu, regionu a/nebo města. Sponzor Další obsah - Cokoliv, co zadáte zde, se objeví na domovské stránce časopisu. - Poznámka k copyrightu - Požádejte autory, aby souhlasili s oznámením o autorských právech v rámci procesu podání. + Cokoliv, co zadáte zde, se objeví na domovské stránce časopisu. + Poznámka k copyrightu + Požádejte autory, aby souhlasili s oznámením o autorských právech v rámci procesu podání. Jste si jisti, že chcete zakázat tento formulář recenzenta? Formulář již nebude k dispozici při nových přiřazeních recenzí. Neznámý nástroj nahrávání: {$param} Pokyny pro autory Doporučené pokyny zahrnují bibliografické a formátovací standardy spolu s příklady běžných formátů citací, které mají být použity při podání příspěvku. Konflikt zájmů - Neplatný formát favicon. Jsou přípustné pouze formáty .ico, .png a .gif. + Favicon Je třeba zvolit alespoň jednu roli, která bude přiřazena tomuto uživateli. Webové stránky Nastavení webových stránek @@ -344,7 +342,6 @@ výsledků vyhledávání. Zvolte jednu z nakonfigurovaných metrik jako výchoz Nebyla vybrána žádná metoda platby Metoda platby Měna - Platby uskutečněné přímo prostřednictvím této webové stránky budou účtovány ve vybrané měně. Lokalizace povolena. Lokalizace zakázána. {$locale} byla definována jako primární lokalizace. @@ -361,7 +358,7 @@ výsledků vyhledávání. Zvolte jednu z nakonfigurovaných metrik jako výchoz Politika otevřeného přístupu Pokud povolujete okamžitý volný přístup k publikovanému obsahu, můžete zde upřesnit vaši Open Access Policy. Patička stránek - Vložte libovolný obrázek, text nebo HTML kód, který se má objevit ve spodní části vašeho webu. + Vložte libovolný obrázek, text nebo HTML kód, který se má objevit ve spodní části vašeho webu. Definujte čtenářům a autorům principy recenzního procesu Tento popis by měl zahrnovat počet recenzentů, kteří se obvykle používají při kontrole příspěvku, kritéria, podle nichž jsou recenzenti požádáni o posuzování podání, očekávaný čas potřebný k provedení recenzí a zásady použité při výběru recenzentů. Hlavní kontakt Zadejte podrobnosti o kontaktech, obvykle na hlavního redaktora, na redakci nebo na administrativní pracovníky, které lze zobrazit na vašem veřejně přístupném webu. @@ -373,16 +370,14 @@ výsledků vyhledávání. Zvolte jednu z nakonfigurovaných metrik jako výchoz Výchozí hodnoty lze upravit pro každou recenzi během redakčního procesu. Seskupení podle typu souboru Obrázek na domácí stránku - Nahrajte obrázek, který se má zobrazovat na domácí stránce. + Nahrajte obrázek, který se má zobrazovat na domácí stránce. Popis - Téma - Nová témata mohou být nainstalována v rámci ouška "Pluginy" na vršku této stránky. - Správa postranních sloupců + Téma + Nová témata mohou být nainstalována v rámci ouška "Pluginy" na vršku této stránky. Postranní sloupec - Poslat připomenutí, pokud recenzent neodpověděl na žádost o recenzi během následujícího času (počtu dnů) po stanoveném datu: - Poslat připomenutí, pokud recenzent neodevzdal hotovou recenzi během následujícího času (počtu dnů) po stanoveném datu: + Poslat připomenutí, pokud recenzent neodpověděl na žádost o recenzi během následujícího času (počtu dnů) po stanoveném datu: + Poslat připomenutí, pokud recenzent neodevzdal hotovou recenzi během následujícího času (počtu dnů) po stanoveném datu: Výchozí termín pro recenze - Zobrazit odkaz na "Zajištění anonymních recenzí" během nahrávání příspěvku Popis vztahu ke sponzory a popis zásad Příklady: vědecké asociace, univerzitní oddělení, družstva atd. Sponzoři jsou veřejně zobrazováni. Zkušení vývojáři webu mohou nahrát soubor css a přizpůsobit tak vzhled webu. diff --git a/locale/cs_CZ/reader.xml b/locale/cs_CZ/reader.xml index 33bcf6641d4..aaa9e160c70 100644 --- a/locale/cs_CZ/reader.xml +++ b/locale/cs_CZ/reader.xml @@ -37,147 +37,4 @@ Název Zobrazit všechny komentáře Celý text: - Přidat komentář - Nastavení - Jste si jistí, že chcete smazat tento Kontext a všechna související Vyhledávání? - Vytvořit kontext - Upravit kontext - Metadata - Použít jména autora jako výchozí hledané výrazy s cílem umožnit uživatelům najít další práce autora této položky (např. pro kontext "Další práce") - Použít jména autora jako výchozí hledané výrazy a popsat kontext jako vyhledávání citací tohoto článku. - RST Nastavení, aby bylo umožněno dvojitým kliknutím na slovo otevřít tento kontext.]]> - Použít geografická indexační data jako výchozí termíny vyhledávání. - Možnosti - Správa - - Sdílení - Sdílení povoleno - addthis.com, a zkopírujte/vložte kód tlačítka Sdílení níže.]]> - - Základní nastavení - AddThis.com uživatelské jméno - Styl tlačítka - Použít rozevírací seznam - Pokročilá nastavení (volitelné) - AddThis.com customization documentation pro odkazy.]]> - Značka - (seznam oddělený čárkou)]]> - Jazyk - Logo - Pozadí loga - Barva loga - - Nástroje pro čtení - Jste si jisti, že chcete smazat toto vyhledávání? - Vytvořit vyhledávání - Upravit vyhledávání - Související položky - Abstrakt (představuje abstrakt položky). - O autorovi (zobrazí biografické údaje, které o sobě poskytl autor). - Jak citovat položku (poskytuje bibliografické podrobnosti pro položku). - Vyhledat pojmy (umožňuje čtenáři odeslat dvojklikem jakékoliv slovo v položce do slovníku). - Zakázat související položky - Poslat email autorovi (vede k šabloně emailu s emailovou adresou autora). - Oznámit kolegovi (vede k šabloně emailu s odkazem na položku). - Najít reference - Verze pro tisk (poskytne verzi položky optimalizovanou pro tisk). - Doplňkové soubory (zobrazí seznam souborů, které autor zaslal spolu s příspěvkem). - Metadata pro indexování (zobrazí metadata položky pro indexování dodaná autorem nebo systémem). - Status - Konfigurovat AddThis - Ověřování dokončeno. - OK - {$url} není platná. - Zkontrolovat platnost URL adres pro nástroje pro čtení - Ověřit - Jste si jistý, že chcete smazat tuto verzi a všechny související Kontexty a Vyhledávání? - Jste si jistý, že chcete nevratně obnovit všechny verze do jejich výchozí podoby? Pokud ano, budete muset vybrat aktivní verzi na stránce Nastavení. - Vytvořit verzi - Upravit verzi - Exportovat - Importovat verzi - Metadata - Obnovit výchozí verze - O autorovi - Citační formát - Jak citovat položku - Online - Web - Upozornit kolegu - Zkratka - A - Pokud je článek indexován v Google Scholar, může být doprovázen odkazem "Citováno X", který vede k seznamu prací, které ho citují. Stejně tak zobrazí Google Scholar všechny položky citující název a autora. Abyste se dostali k online zdrojům, které jsou dostupné pouze přes vaši knihovnu, budete možná moci aktivovat pro vaši instituci odkazy pro knihovnu v nastavení Google Scholar. - Kontext - Pokud je položka HTML soubor (spíše než PDF), zobrazí se slovo, na které poklepete, v políčku Word-to-Define. Jinak lze slova do políčka vepsat nebo nakopírovat. Více o vyhledaných zdrojích se dozvíte klinutím na O ZDROJÍCH. Tyto zdroje byly vybrány pro svou relevantnost a otevřený (volný) přístup k části nebo k celému svému obsahu. - Popis - Pořadí - Kontexty - Výrazy pro vyhledávání byly vybrány autorem(y). Čtenář je může upravit nebo smazat; dva nebo tři krátké přesné termíny nebo fráze přináší nejlepší Boolean (AND) vyhledávání. Více o vyhledaných zdrojích se dozvíte klinutím na O ZDROJÍCH. Tyto zdroje byly vybrány pro svou relevantnost a otevřený (volný) přístup k části nebo k celému svému obsahu. - Termíny vyhledávání - Slovo pro definování - Název - Napsat email autorovi - registraci]]> - Vaše zpráva byla odeslána. - Hledání referencí - Google Scholar - Windows Live Academic - Vyhledat termíny - Přispěvatel - Pokrytí - Datum - Popis - Dublin Core - Formát - Identifikátor - Jazyk - Vydavatel - Vztah - Práva - Zdroj - Předmět - Název - Typ - Metadata pro tento dokument - Abstrakt - Copyright a oprávnění - Zeměpisná lokalizace, časové období, výzkumný soubor (pohlaví, věk atd.) - (YYYY-MM-DD) - Obor(y) - Formát souboru - - Položky PKP metadat - English=en - Organizující agentura, umístění - Název časopisu/konference; vol., no. (rok) - Sponzor(ři) - Klíčové slovo(a) - Doplň. soubory - Název dokumentu - Typ - Univerzální identifikátor zdroje - Tištěná verze - Nástroje pro čtení - Související položky - Pravidla recenze - Popis - Vyhledávání - Pořadí - Vyhledávání - Odeslat data - Hledat URL - Navrhnout zdroj - Název - URL - Download - Doplňkové soubory - Metadata pro indexaci - Popis - Klíč - Lokalizace - Sada souvisejících položek - Název - Verze - Metadata pro indexaci - Prohlédněte si zásady pro recenze diff --git a/locale/da_DK/admin.xml b/locale/da_DK/admin.xml index 25e7805ceb9..4d06547e717 100644 --- a/locale/da_DK/admin.xml +++ b/locale/da_DK/admin.xml @@ -45,15 +45,9 @@ Serveroplysninger PHP-version Operativsystemplatform - Om webstedsbeskrivelsen + Om webstedsbeskrivelsen E-mail-adresse på primær kontaktperson Navn på primær kontaktperson - E-mail-adressen på den primære kontaktperson er påkrævet. - Navnet på den primære kontaktperson er påkrævet. - Du skal angive en adgangskode, der består af mindst 4 tegn. - En titel er påkrævet. - Websteds-logo - Ugyldigt billedformat for webstedslogo. De accepterede formater er .jpg eller .png. Introduktion Minimumlængde for adgangskode Sprog på websted diff --git a/locale/da_DK/api.xml b/locale/da_DK/api.xml index efbe35bdaf2..5797cee6377 100644 --- a/locale/da_DK/api.xml +++ b/locale/da_DK/api.xml @@ -16,7 +16,7 @@ Du kan kun se de ikke-publicerede indlæg, som du er blevet tildelt. Du kan ikke slette en indsendelse, der ikke er indsat i denne kontekst. Du har ikke tilladelse til at slette denne indsendelse. - Den ønskede ressource blev ikke fundet. + Den ønskede ressource blev ikke fundet. Din anmodning kunne ikke imødekommes, da de nødvendige oplysninger mangler. Den ønskede årgang, nummer eller år er ikke gyldigt. En uventet fejl opstod. Genindlæs siden og prøv igen. diff --git a/locale/da_DK/common.xml b/locale/da_DK/common.xml index aca90aae9a0..cd2007cd381 100644 --- a/locale/da_DK/common.xml +++ b/locale/da_DK/common.xml @@ -41,7 +41,6 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Æ Ø Å Tildelt Alternativ tekst - Angiv alternativ tekst for dette billede for at sikre tilgængelighed for brugere, som bruger tekst-browsere eller handicapvenlige hjælperedskaber. og Anvend handling Tildel @@ -115,10 +114,11 @@ Til Indstillinger Rækkefølge + Hæv placering af {$itemTitle} + Sænk placering af {$itemTitle} Oprindeligt filnavn eller Andet - Header-logo Plug-in Forlægger Post @@ -148,7 +148,6 @@ Ikke startet Ikke-navngivet Opdateret - Overført fil Overfør Op URL-adresse @@ -314,7 +313,6 @@ EksternURL Nulstil Ulæst - Filen blev ikke uploadet eller filen er ugyldig Plug-ins Udfyld venligst e-mailens emnefelt Indskriv venligst tekst i e-mailens tekstfelt @@ -365,8 +363,6 @@ Resumé Upload-tidspunkt Elementer pr. side - Billede på hjemmeside - Favicon Navn Betegnelse Under bedømmelse @@ -458,7 +454,6 @@ Afsenders navn Afsenders e-mail Den angivne URL er ugyldig. Tjek og prøv igen. - Formularen blev ikke sendt korrekt. En fil skal uploades. Sørg for at du har udfyldt feltet til beskeder og valgt mindst én modtager. Du er her: diff --git a/locale/da_DK/manager.xml b/locale/da_DK/manager.xml index fb213df20e8..62451f95bed 100644 --- a/locale/da_DK/manager.xml +++ b/locale/da_DK/manager.xml @@ -139,10 +139,8 @@ System-plug-ins Læseværktøjer Roller - Ugyldigt billedformat til logoet i sidehovedet på hjemmeside. De accepterede formater er .jpg eller .png. Ugyldigt billedformat til hjemmeside. De accepterede formater er .jpg eller .png. Ugyldigt billedformat til titlen i sidehovedet på hjemmeside. De accepterede formater er .jpg eller .png. - Ikke markeret Logføring og kontrol Ugyldigt billedformat til logoet i sidehovedet på side. De accepterede formater er .jpg eller .png. Statistikker og rapporter @@ -177,7 +175,6 @@ Hvis du nulstiller denne skabelon, vil alle data blive erstattet af standardinstillingerne, og evt. tilretninger vil gå tabt. Vil du bekræfte denne handling? Søg efter navn Brug nedenstående felt til at angive det maksimale antal ord, du ønsker at søge efter. Feltet er forudindstillet til at beregne et gennemsnit for formularens felter. - Sidemenu-administration Metadata plug-ins Metadata plug-ins implementerer ekstra metadata-standarder. OAI Metadata Format Plug-ins @@ -209,15 +206,15 @@ Information Logo Sidefod - Layout-tema - Nye layout-temaer kan installeres via linket 'Plug-ins' øverst på siden - Indsæt de billeder, den tekst eller HTML-kode, som ønskes placeret nederst på websitet + Layout-tema + Nye layout-temaer kan installeres via linket 'Plug-ins' øverst på siden + Indsæt de billeder, den tekst eller HTML-kode, som ønskes placeret nederst på websitet For yderligere at tilpasse websitets layout efter egne ønsker, kan erfarne webudviklere uploade en CSS-fil. Billede på hjemmeside - Upload et billede, der placeres på et fremtrædende sted på hjemmesiden. - Ugyldigt favicon-format. Følgende formater accepteres: .ico og .png. + Upload et billede, der placeres på et fremtrædende sted på hjemmesiden. + Favicon Yderligere indhold - Alt indhold vil blive vist på hjemmesiden. + Alt indhold vil blive vist på hjemmesiden. Workflow-indstillinger Indsendelse Bedømmelse @@ -234,11 +231,9 @@ Indsendelsesformular Kan ændres under den redaktionelle proces. Antal uger inden en accept eller et afslag skal foreligge - Send en påmindelse, hvis bedømmeren ikke har svaret på anmodningen inden for følgende tid (dage) efter forfaldsdato: + Send en påmindelse, hvis bedømmeren ikke har svaret på anmodningen inden for følgende tid (dage) efter forfaldsdato: Send aldrig rykker - Indsæt link til "Sikring af blind review" under uploadproces Konkurrerende interesser - Bedømmerne vil blive bedt om at respektere nedenstående erklæring om konkurrerende interesser. Bedømmelsestidsfrister Erklæring om konkurrerende interesser Anmod om en erklæring om konkurrerende interesser under bedømmelsesprocessen. @@ -250,18 +245,17 @@ Indeksering Betaling Valuta - Betalinger foretaget via dette website vil blive angivet i den valgte valuta. Betalingsmåde Ingen betalingsmåde valgt - Oplysninger om ophavsret - Kræv, at forfattere accepterer "Oplysninger om ophavsret" som en del af indsendelsesprocessen. + Oplysninger om ophavsret + Kræv, at forfattere accepterer "Oplysninger om ophavsret" som en del af indsendelsesprocessen. Indsæt URL fra licenswebside, hvis den er tilgængelig. Titel Forkortelse Rapportgenerator Systemet genererer rapporter, som registrerer de oplysninger, der er forbundet med brugen af webstedet og indsendelser over en given tidsperiode. Der genereres rapporter i CSV-format, og der kræves et regnearksprogram for at få vist disse rapporter. Generér brugerdefineret rapport - Send en påmindelse, hvis bedømmeren ikke har sendt en indstilling inden for følgende tid (dage) efter forfaldsdato: + Send en påmindelse, hvis bedømmeren ikke har sendt en indstilling inden for følgende tid (dage) efter forfaldsdato: Søg bruger via navn Skift Beskrivelser @@ -495,8 +489,6 @@ Dette link vil kun blive vist, når den besøgende ikke er logget ind. Link til side, der indeholder oplysninger om kontaktperson. Tidsskrift > Kontaktperson]]> - Sitemap - {$path}]]> Denne biblioteksfil kan være tilgængelig til download, hvis "Offentlig adgang" er aktiveret, på:
{$downloadUrl}

]]>
Vælg biblioteksfiler, der skal vedhæftes Nøgle @@ -508,7 +500,7 @@ Distribuering> Betaling.]]> Distribuering> Betalinger, og abonnementer kræves under Indstillinger> Distribution> Adgang.]]> Link til søgeside. - Denne erklæring vises under brugerregistrering, manuskriptindsendelse og på den offentligt tilgængelige privacy-sider om beskyttelse af personlige oplysninger. + Denne erklæring vises under brugerregistrering, manuskriptindsendelse og på den offentligt tilgængelige privacy-sider om beskyttelse af personlige oplysninger. I nogle retskredse er du forpligtet til at oplyse, hvordan du håndterer brugerdata i din datapolitik. Link til den side, der viser din erklæring om beskyttelse af personlige oplysninger Workflow > Indsendelser]]> diff --git a/locale/da_DK/reader.xml b/locale/da_DK/reader.xml index a9582525032..965e9b3fce0 100644 --- a/locale/da_DK/reader.xml +++ b/locale/da_DK/reader.xml @@ -34,145 +34,4 @@ Titel Vis alle kommentarer Fuld tekst: - Tilføj kommentar - Konfiguration - Er du sikker på, at du vil slette denne kontekst og alle tilknyttede søgninger? - Opret kontekst - Rediger kontekst - Metadata - Brug forfatternavne som standardsøgeord for at gøre det muligt for brugere at finde andre værker af forfatterne til dette element (f.eks. for konteksten "Andre værker") - Brug forfatternavne som standardsøgeord, og beskriv konteksten som en søgning efter citater til artiklen. - RST-indstillinger, hvis du vil tillade, at brugere kan dobbeltklikke på ord for at åbne denne kontekst.]]> - Brug geografiske indekseringsdata som standardsøgeord. - Indstillinger - Administration - Læseværktøjer - Er du sikker på, at du vil slette denne søgning? - Opret søgning - Rediger søgning - Relaterede elementer - Resumé (præsenterer et resumé af elementet). - Om forfatteren (viser de biografierklæringer, der er angivet af forfatteren). - Sådan citeres manuskriptet (indeholder bibliografiske oplysninger om manuskriptet). - Slå ord op (gør det muligt for læsere at dobbeltklikke på et ord i et element og sende ordet til en ordbog). - Deaktivér relaterede elementer - Send e-mail til forfatter (går til en e-mail-skabelon med forfatterens e-mail-adresse). - Underret kollega (går til en e-mail-skabelon med et link til elementet). - Find referencer - Udskriftsversion (er en printervenlig version af et element). - Supplerende filer (viser liste over de filer, som forfatteren har vedhæftet manuskriptet). - Indekseringsmetadata (viser elementets indekseringsmetadata, der er angivet af forfatteren og systemet). - Status - Valideringen er fuldført. - OK - {$url} er ikke gyldig. - Valider URL-adresser for læseværktøjer - Valider - Er du sikker på, at du vil slette denne version og alle tilknyttede kontekster og søgninger? - Er du sikker på, at du uigenkaldeligt vil gendanne alle versioner til deres standardindstillinger? Hvis det er tilfældet, skal du vælge en aktiv version på siden Indstillinger. - Opret version - Rediger version - Eksporter - Importer version - Metadata - Gendan versioner til standardindstillinger - Om forfatteren - Citatformat - Sådan citeres manuskript - Online - Underret kollega - Forkortelse - OG - Hvis artiklen er indekseret i Google Scholar, kan den være ledsaget af linket "Cited by X", der henviser til en liste over værker, hvor artiklen er citeret. I Google Scholar vises også en liste over alle de elementer, hvor titlen og forfatteren er citeret. Hvis du vil have adgang til onlineressourcer, der kun er tilgængelige via dit forskningsbibliotek, kan du gå til Scholar Preferences i Google Scholar og aktivere biblioteklinkene for din institution. - Kontekst - Hvis elementet er en HTML-fil (i stedet for en PDF-fil), skal du dobbeltklikke på et ord i teksten for at få det vist i feltet Ord, der skal defineres. Du kan også skrive eller indsætte ord i feltet. Klik på OM for at få mere at vide om de ressourcer, der blev søgt i. Disse ressourcer er valgt på baggrund af deres relevans og deres (gratis) Open Access til hele eller dele af deres indhold. - Beskrivelse - Rækkefølge - Kontekster - Søgeordene er valgt af forfatteren/forfatterne. De kan ændres eller slettes af læseren, da to eller tre korte, præcise ord eller udtryk resulterede i de bedste booleske (OG)-søgninger. Klik på OM for at få mere at vide om de ressourcer, der blev søgt i. Disse ressourcer er valgt på baggrund af deres relevans og (gratis) Open Access til hele eller dele af deres indhold. - Søgeord - Ord, der skal defineres - Titel - Send e-mail til forfatter - registrering]]> - Meddelelsen er sendt. - Søger efter referencer - Google Scholar - Windows Live Academic - Slå ord op - Bidragyder - Dækning - Dato - Beskrivelse - Dublin Core - Format - Id - Sprog - Forlægger - Relation - Rettigheder - Kilde - Emne - Titel - Type - Metadata for dette dokument - Resumé - Ophavsret og tilladelser - Geografisk placering, kronologisk periode, forskningseksempel (køn, alder osv.) - (ÅÅÅÅ-MM-DD) - Fagområde(r) - Filformat - Status og genre - PKP-metadataelementer - Engelsk=en - Organiserende instans, placering - Tidsskrift/konferencetitel; årg., nr. (år) - Sponsor(er) - Nøgleord - Supp. filer - Titel på dokument - Type - URI (Universal Resource Indicator) - Udskriftsversion - Læseværktøjer - Relaterede elementer - Bedømmelsespolitik - Beskrivelse - Søgninger - Rækkefølge - Søg - Send data - URL-søgeadresse - Foreslå en kilde - Titel - URL-adresse - Hent - Supplerende filer - Indekseringsmetadata - Beskrivelse - Nøgle - Landestandard - Relaterede elementsæt - Titel - Version - Indekseringsmetadata - Kommentartitel nødvendig. - Deling - Deling aktiveret - addthis.com og kopiere/indsætte koden til deleknappen herunder.]]> - Grundindstillinger - Brugernavn på AddThis.com - Knapstil - Anvend rullemenu - Avancerede indstillinger (valgfrit) - AddThis.com customization documentation for reference.]]> - Brand - (kommasepareret liste)]]> - Sprog - Logo - Logo-baggrund - Logo-farve - Konfigurer AddThis - Web - Se bedømmelsespolitik diff --git a/locale/da_DK/submission.xml b/locale/da_DK/submission.xml index 0de8e42f680..d186e5f626a 100644 --- a/locale/da_DK/submission.xml +++ b/locale/da_DK/submission.xml @@ -537,8 +537,6 @@ Svar forfalden Bedømmelse forfalden Slet indsendelse? - Hæv placering af {$itemTitle} - Sænk placering af {$itemTitle} Se indsendelse Angivne bedømmelser afsluttet Tilretninger indsendt @@ -563,7 +561,6 @@ Indtast et emne. Indtast et fagområde. Indtast et nøgleord. - Indtast en støtteorganisation. Indtast information om dækning. Indtast en type. Indtast en kilde. diff --git a/locale/de_DE/admin.xml b/locale/de_DE/admin.xml index 5f319785c28..146ee59a791 100644 --- a/locale/de_DE/admin.xml +++ b/locale/de_DE/admin.xml @@ -65,20 +65,14 @@ PHP-Version OS-Plattform Einstellungen - Beschreibung Über uns + Beschreibung Über uns E-Mail-Adresse des Hauptkontakts Name des Hauptkontakts - E-Mail-Adresse des Hauptkontakts erforderlich - Name des Hauptkontakts erforderlich - Ihr Passwort muss mindestens 4 Zeichen lang sein. - Ein Titel ist erforderlich. Ihre Installation ist so eingestellt, dass sie mehr als eine Nutzungsstatistik aufzeichnet. Nutzungsstatistiken werden in verschiedenen Kontexten angezeigt. Es gibt Fälle, in denen eine einzige Nutzungsstatistik benutzt werden muss, z.B. wenn eine sortierte Liste der am häufigsten genutzten Beiträge angezeigt werden soll oder um Suchergebnisse zu gewichten. Bitte wählen Sie eine der Nutzungsmetriken als Standard aus. - Logo der Website - Ungültiges Dateiformat für Logo der Website. Zulässige Formate sind .gif, .jpg und .png. Einführung Mindestlänge des Passworts Sprache der Website @@ -119,7 +113,7 @@ in das aktuelle Dateiverzeichnis innerhalb des Vorbereitungs-Verzeichnisses des Dieses Werkzeug wird nur Dateien kopieren, die nicht bereits in den usageStats-Verzeichnissen (Vorbereitung, Bearbeitung, Archiv, zurückgewiesen) sind. Benutzung: {$scriptName} path/to/apache/log/file.log -Benutzung (verarbeite alle Dateien in einem Verzeichnis): {$scriptName} path/to/apache/directory +Benutzung (verarbeite alle Dateien in einem Verzeichnis): {$scriptName} path/to/apache/directory Fehler: kann temporären Ordner {$tmpDir} nicht anlegen Fehler: Datei {$filePath} existiert nicht, oder es kann nicht auf sie zugegriffen werden. diff --git a/locale/de_DE/api.xml b/locale/de_DE/api.xml index 9b383e5f8cb..02a53f6b335 100644 --- a/locale/de_DE/api.xml +++ b/locale/de_DE/api.xml @@ -16,7 +16,7 @@ Sie können nur die Ihnen zugeordneten unveröffentlichten Einreichungen sehen. Sie können keine Einreichung löschen, die nicht diesem Kontext zugeordnet ist. Sie sind nicht berechtigt, diese Einreichung zu löschen. - Die angeforderte Ressource wurde nicht gefunden. + Die angeforderte Ressource wurde nicht gefunden. Ihre Anforderung konnte nicht ausgeführt werden, da notwendige Informationen fehlen. Band, Nummer oder Jahr ist nicht nicht gültig. Es ist ein unerwarteter Fehler aufgetreten. Bitte laden Sie die Seite neu und versuchen Sie es noch einmal. diff --git a/locale/de_DE/common.xml b/locale/de_DE/common.xml index 681cd5c2dee..869a0fa8264 100644 --- a/locale/de_DE/common.xml +++ b/locale/de_DE/common.xml @@ -56,7 +56,6 @@ von ein eine einer eines der die das und oder weder aber ist wenn als dann sonst durch in aus über zu zum zur mit Bereits zugewiesen Alternativtext - Bitte geben Sie einen Alternativtext für dieses Bild an um die Zugänglichkeit für Nutzer/innen mit Nur-Text-Browsern oder technischen Hilfsmitteln zu gewährleisten. und Anwenden Zuweisen @@ -167,7 +166,6 @@ Beginnen In Arbeit Einträge pro Seite - Favicon Schlagworte Sprache Sprachen @@ -201,6 +199,8 @@ OK Optionen Sortieren + Position von {$itemTitle} nach oben setzen + Position von {$itemTitle} nach unten setzen Ursprünglicher Dateiname oder Andere @@ -208,7 +208,6 @@ {$start}-{$end} von {$total} Zusätzliche Seiten durchstöbern Seite {$pageNumber} - Logo in der Kopfzeile {$percentage}% Plugin Das Plugin "{$pluginName}" ist aktiviert worden. @@ -268,11 +267,8 @@ Ohne Titel Aktualisiert Datum des Hochladens - Hochgeladene Datei Hochladen Die Datei konnte nicht hochgeladen werden. Bitte probieren Sie es erneut oder benachrichtigen Sie den/die Administrator/in, wenn das Problem weiter besteht. - Keine Datei hochgeladen oder ungültiger Dateityp! - Bild auf der Startseite Aufwärts Datei hochladen Datei ändern @@ -340,7 +336,6 @@ ist beginnt mit Das Formular wurde nicht ordnungsgemäß ausgefüllt. - Das Formular wurde nicht ordnungsgemäß übermittelt. Dateiupload ist erforderlich. Mit * gekennzeichnete Angaben sind Pflichtangaben. Erneut abschicken diff --git a/locale/de_DE/manager.xml b/locale/de_DE/manager.xml index 01158a6fc79..255458d2a7b 100644 --- a/locale/de_DE/manager.xml +++ b/locale/de_DE/manager.xml @@ -213,27 +213,23 @@ Ergebnisse nach Land, Region und/oder Stadt filtern.. Sponsor Weiterer Inhalt - Alle hier eingegebenen Inhalte werden auf Ihrer Homepage erscheinen. - Copyright-Vermerk - Autor/innen müssen im Einreichungsverfahren der Lizenz zustimmen. + Alle hier eingegebenen Inhalte werden auf Ihrer Homepage erscheinen. + Copyright-Vermerk + Autor/innen müssen im Einreichungsverfahren der Lizenz zustimmen. Autor/innen-Richtlinien Für die Richtlinien werden Standards für Bibliografie und Format sowie Beispiele für gängige Zitierformate, die in Einreichungen benutzt werden sollen, vorgeschlagen. Interessenkonflikte - Gutachter/innen werden aufgefordert, den Richtlinien zur Offenlegung von Interessenkonflikten zu entsprechen, die Sie unten angeben. Es gab einen Fehler beim Löschen dieses Eintrags. - Ungültiges Favicon-Format. Zulässige Formate sind .ico, .png und .gif. + Favicon Dateitypgruppierung - Das Format des Logos in der Kopfzeile der Startseite ist ungültig. Gültige Formate sind .gif, .jpg und .png. Startseitengrafik - Laden Sie eine Grafik hoch, die zentral auf Ihrer Homepage angezeigt werden soll. + Laden Sie eine Grafik hoch, die zentral auf Ihrer Homepage angezeigt werden soll. Das Format des Bildes auf der Startseite ist ungültig. Gültige Formate sind .gif, .jpg und .png. Das Format des Titelbildes in der Kopfzeile der Startseite ist ungültig. Gültige Formate sind .gif, .jpg und .png. Beschreibungen - Grafisches Thema - Wählen Sie ein Grafikthema aus den verfügbaren Thema-Plugins aus. - Verwaltung der Sidebar + Grafisches Thema + Wählen Sie ein Grafikthema aus den verfügbaren Thema-Plugins aus. Sidebar - Nicht ausgewählt Protokollieren und prüfen Logo Bestätigung der Beitragseinreichung durch die Autor/innen @@ -243,7 +239,7 @@ Wenn Sie sofortigen freien Zugang zu allen veröffentlichten Inhalten gewähren, geben Sie eine Beschreibung Ihrer Open-Access-Richtlinie ein. Ungültiges Format des Logos in der Kopfzeile. Gültige Formate sind .gif, .jpg und .png. Fußzeile - Geben Sie alle Grafiken, Text oder HTML-Code an, die Sie am Fuß Ihrer Website anzeigen möchten. + Geben Sie alle Grafiken, Text oder HTML-Code an, die Sie am Fuß Ihrer Website anzeigen möchten. Beschreiben Sie die Begutachtungsrichtlinien und die Abläufe für Leser/innen und Autor/innen. Diese Beschreibung enthält üblicherweise die Anzahl der Gutachter/innen, die typischerweise eine Einreichung begutachten, die Kriterien, anhand derer Gutachter/innen urteilen sollen, die erwartete Begutachtungsdauer und die Grundsätze der Gutachter/innenauswahl. Hauptkontakt Geben Sie Kontaktinformationen, üblicherweise für eine Hauptredaktion, Redaktionsleitung oder Redaktionsbüro, an, die auf Ihrer öffentlich zugänglichen Webseite angezeigt werden können. @@ -253,12 +249,9 @@ Zeit für Abschluss des Gutachtens (Wochen) Nie erinnern Die Standards können für jedes Gutachten im Rahmen des redaktionellen Prozesses angepasst werden. - Eine Erinnerung schicken, wenn ein/e Gutachter/in auf die Anfrage nicht innerhalb der genannten Zeit geantwortet hat (Tage): - Eine Erinnerung schicken, wenn ein/e Gutachter/in nicht innerhalb der genannten Zeit eine Empfehlung eingereicht hat (Tage): + Eine Erinnerung schicken, wenn ein/e Gutachter/in auf die Anfrage nicht innerhalb der genannten Zeit geantwortet hat (Tage): + Eine Erinnerung schicken, wenn ein/e Gutachter/in nicht innerhalb der genannten Zeit eine Empfehlung eingereicht hat (Tage): Standard-Fristen für Begutachtung - Einen Link zu "blinde Begutachtung gewährleisten" während des Uploads anzeigen - Sitemap - {$path} zur Verfügung.]]> Sie können einen Hinweis hinzufügen, wie Ihr Verhältnis zu Ihren Sponsoren ist; dieser Hinweis wird in der Sponsorenliste auf Ihrer "Über uns"-Seite erscheinen. Beispiele: Fachgesellschaften, Fachbereiche, Konsortien etc. Spnsoren werden öffentlich angezeigt. Sie können eine zusätzliche CSS-Datei hochladen, um das Aussehen anzupassen. @@ -366,7 +359,6 @@ Keine Zahlungsmethode ausgewählt Zahlungsmethode Währung - Zahlungen, die direkt über diese Website abgewickelt werden, werden in der ausgewählten Währung ausgewiesen. Rollen-Einstellungen @@ -490,7 +482,7 @@ Importierte/r Nutzer/in "{$username}" besitzt kein Passwort. Bitte überprüfen Sie Ihr Import-XML-Format. Nutzer/in wurde nicht importiert. Importierte/r Nutzer/in "{$username}" konnte nicht in der vorliegenden Form importiert werden. Ein neues Passwort wird an die E-Mail-Adresse der Nutzerin/des Nutzers geschickt. Nutzer/in wurde importiert. Importierte/r Nutzer/in "{$username}" hat ein ungültiges Klartext-Passwort. Nutzer/in wurde nicht importiert. - + Titel Pfad diff --git a/locale/de_DE/reader.xml b/locale/de_DE/reader.xml index 4c21198456f..d8ee5e357b6 100644 --- a/locale/de_DE/reader.xml +++ b/locale/de_DE/reader.xml @@ -34,147 +34,4 @@ Überschrift Alle Kommentare anzeigen Volltext: - Kommentar hinzufügen - Konfiguration - Sind Sie sicher, dass Sie diesen Kontext und alle mit ihm verbundenen Suchmöglichkeiten löschen möchten? - Kontext erstellen - Kontext bearbeiten - Metadaten - Autor/innen-Namen als Standardsuchbegriffe verwenden, um Benutzer/innen die Möglichkeit zu geben, weitere Arbeiten der Autor/innen zu diesem Thema zu finden (z.B. mit dem Kontext "Weitere Arbeiten"). - Autor/innen-Namen als Standardsuchbegriffe verwenden und Kontext als Suche nach Verweisen auf den Artikel beschreiben. - Lesewerkzeuge - Einstellungen aktiviert werden, damit der Kontext durch Doppelklicken auf ein Wort geöffnet wird.]]> - Geographische Indizierungsmerkmale als Standardsuchbegriff verwenden. - Optionen - Verwaltung - - Mit anderen teilen - Teilen aktiviert - addthis.com ein Konto einrichten und den Code für den Teilen-Knopf kopieren und einfügen.]]> - - Grundeinstellungen - AddThis.com-Benutzer/innenname - Art des Buttons - Drop-down-Menü verwenden - Erweiterte Einstellungen (optional) - Dokumentation zur AddThis-Anpassung für Hinweise.]]> - Marke - (Liste durch Kommata trennen)]]> - Sprache - Logo - Logo-Hintergrund - Logo-Farbe - - Lesewerkzeuge - Sind Sie sicher, dass Sie diese Suche löschen wollen? - Suche erstellen - Suche bearbeiten - Verwandte Beiträge - Abstract (zeigt das Abstract des Beitrags). - Begutachtungsrichtlinien anzeigen - Autor/in (zeigt biografische Angaben der Autorin/des Autors an) - Zitation (stellt bibliographische Angaben zur Verfügung) - Wortsuche (die Leserin/der Leser kann ein Wort im Artikel doppelklicken, das dann an ein Wörterbuch geschickt wird) - Werkzeuge für Verwandte Beiträge deaktivieren - E-Mail an Autor/in senden (öffnet eine E-Mail-Vorlage mit der E-Mail-Adresse der Autorin/des Autors) - Eine/n Kollege/in benachrichtigen (öffnet eine E-Mail-Vorlage mit einem Link zum Beitrag) - Verweise finden - Drucken (bietet eine druckerfreundliche Fassung an) - Zusatzdateien (zeigt eine Liste aller Zusatzdateien, die die Autorin/der Autor einem Artikel hinzugefügt hat) - Metadaten (zeigt die durch Autor/in und System bereitgestellten Metadaten für die Artikelindizierung an) - Status - AddThis konfigurieren - Bestätigung beendet. - OK - {$url} ist ungültig. - URL bestätigen - Bestätigen - Sind Sie sicher, dass Sie diese Version mit ihrem Kontext und allen verknüpften Suchmöglichkeiten löschen wollen? - Sind Sie sicher, dass Sie alle Versionen endgültig auf den Standard zurücksetzen wollen? In diesem Fall müssen Sie auf der Einstellungsseite eine aktive Version auswählen. - Version erstellen - Version bearbeiten - Exportieren - Version importieren - Metadaten - Versionen auf Standard zurücksetzen - Über die Autorin/den Autor - Zitierformat - Zitation - online - Web - Eine/n Kollege/in benachrichtigen - Abkürzung - UND - Falls der Beitrag bei Google Scholar verzeichnet ist, kann er mit einer "Zitiert durch X"-Link (Cited by X) versehen sein, der zu einer Liste der ihn zitierenden Arbeiten führt. Auch listet Google Scholar alle Arbeiten auf, die den Titel und die Autorin/den Autor bzw. die Autor/innen zitieren. Für den Zugang zu Internetressourcen, die nur über Ihre Forschungsbibliothek zugänglich sind, können Sie zu Präferenzen (Scholar Preference) in Google Scholar gehen und die Bibliotheksadresse Ihres Instituts aktivieren. - Kontext - Wenn es sich bei dem Beitrag um eine HTML-Datei (und nicht um eine PDF-Datei) handelt, auf ein beliebiges Wort im Text doppelklicken und es erscheint im Feld "Zu definierendes Wort". Es ist auch möglich, Worte in das Feld eintippen oder hineinkopieren.Um weitere Informationen zu den durchsuchten Quellen zu erhalten, gehen Sie zu "Über uns". Sie wurden nach ihrer Relevanz und wegen des freien Zugangs zu allen ihren Inhalten bzw. Teilen ihrer Inhalte ausgesucht. - Beschreibung - Ordnen - Kontexte - Die Suchbegriffe wurden von der Autorin/dem Autor bzw. den Autor/innen bestimmt und können von den Leser/innen geändert oder gelöscht werden. Zwei oder drei kurze und präzise Begriffe oder Wortfolgen ergeben die besten Bool'schen Suchen (UND). Um weitere Informationen zu den durchsuchten Quellen zu erhalten, gehen Sie zu "Über uns". Die Quellen wurden nach ihrer Sachdienlichkeit/Relevanz und wegen des freien (kostenlosen) Zugangs zu allen ihren Inhalten bzw. Teilen ihrer Inhalte ausgesucht. - Suchbegriffe - Zu definierendes Wort - Titel - E-Mail an Autor/in senden - Registrierung.]]> - Ihre Mitteilung wurde abgeschickt. - Quellen finden - Google Scholar - Windows Live Academic - Begriffe nachschlagen - Mitwirkende - Bereich - Datum - Beschreibung - Dublin Core - Format - Kennzeichnung - Sprache - Verlag, Organisation - Bezug - Rechte - Quelle - Gegenstand - Titel - Typ - Metadaten für dieses Dokument - Abstract - Copyright und Rechte - Geographisch-räumlicher Bereich, Zeitraum, Forschungssample (Geschlecht, Alter, etc.) - (JJJJ-MM-TT) - Fachgebiet(e) - Dateiformat - Status & Genre - PKP-Metadaten - Englisch=en - Verlag, Ort - Titel; Bd.; Nr. (Jahr) - Unterstützer/innen - Schlagwort(e) - Zusatzdateien - Titel des Dokuments - Typ - Universal Resource Indikator (URI) - Drucken - Lesewerkzeuge - Verwandte Beiträge - Richtlinien für die Begutachtung - Beschreibung - Suchen - Sortieren - Suche - Daten abschicken - URL-Suche - Quelle vorschlagen - Titel - URL - Herunterladen - Zusatzdateien - Metadaten - Beschreibung - Schlüssel - Regionaleinstellung - Verwandte Beiträge - Titel - Version - Metadaten indizieren diff --git a/locale/de_DE/submission.xml b/locale/de_DE/submission.xml index dbd3c6c40f8..08eedd9497d 100644 --- a/locale/de_DE/submission.xml +++ b/locale/de_DE/submission.xml @@ -383,7 +383,6 @@ Bitte geben Sie ein Thema ein. Bitte geben Sie ein Fachgebiet ein. Bitte geben Sie ein Schlagwort ein. - Bitte geben Sie eine unterstützende Organisation ein. Bitte geben Sie Informationen zum Abdeckungsbereich ein. Bitte geben Sie den Typ ein. Bitte geben Sie die Quelle ein. @@ -618,8 +617,6 @@ Gutachten fällig Gutachten eingereicht Einreichung löschen? - Position von {$itemTitle} nach oben setzen - Position von {$itemTitle} nach unten setzen Einreichung ansehen Zugeteilte Gutachten fertiggestellt Überarbeitungen eingereicht diff --git a/locale/el_GR/admin.xml b/locale/el_GR/admin.xml index 5d80eaa0eda..687ddf6c7e6 100644 --- a/locale/el_GR/admin.xml +++ b/locale/el_GR/admin.xml @@ -46,15 +46,9 @@ Πληροφορίες Server Έκδοση PHP Πλατφόρμα λειτουργικού συστήματος - Σχετικά με τον ιστότοπο + Σχετικά με τον ιστότοπο Email Υπεύθυνου Επικοινωνίας Όνοματεπώνυμο Υπεύθυνου Επικοινωνίας - Το email του Υπεύθυνου Επικοινωνίας είναι υποχρεωτικό. - Το Ονοματεπώνυμο του Υπεύθυνου Επικοινωνίας είναι υποχρεωτικό. - Πρέπει να εισάγετε έναν κωδικό πρόσβασης με ελάχιστο μήκος τουλάχιστον 4 χαρακτήρων. - Απαιτείται η συμπλήρωση του τίτλου. - Logo Ιστοτόπου - Μη έγκυρη μορφή αρχείου εικόνας λογοτύπου περιοδικού. Έγκυρες μορφές αρχείων είναι .gif, .jpg, ή .png. Εισαγωγή Ελάχιστο μήκος κωδικού πρόσβασης (password) χαρακτήρες diff --git a/locale/el_GR/common.xml b/locale/el_GR/common.xml index d5aa44c1381..d855a21e61f 100644 --- a/locale/el_GR/common.xml +++ b/locale/el_GR/common.xml @@ -45,7 +45,6 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω Ανατέθηκε Εναλλακτικό κείμενο - Σας παρακαλούμε εισάγετε ένα εναλλακτικό κείμενο για την εικόνα αυτή ώστε να διασφαλιστεί η προσβασιμότητα σε χρήστες που χρησιμοποιούν επιλογές "μόνο κείμενο" στους φυλλομετρητές τους ή βοηθητικές συσκευές. και Εφαρμογή Ενέργειας Ανάθεση @@ -125,7 +124,6 @@ Όνομα πρωτότυπου αρχείου ή Άλλο - Logo Κεφαλίδας Σελίδας Plugin Εκδότης Εγγραφή @@ -155,7 +153,6 @@ Δεν ενεργοποιήθηκε Χωρίς τίτλο Ενημερώθηκε - Ανέβασμα αρχείου Ανέβασμα Πάνω URL diff --git a/locale/el_GR/installer.xml b/locale/el_GR/installer.xml index 4272c493f1e..a43f4af9047 100644 --- a/locale/el_GR/installer.xml +++ b/locale/el_GR/installer.xml @@ -62,7 +62,6 @@ Αναγνωριστικό (identifier) OAI καταθετηρίου Ο κατάλογος των δημόσιων αρχείων δεν υπάρχει ή δεν είναι εγγράψιμος (writable). Σημιεώσεις έκδοσης - Ρυθμίσεις ασφαλείας {$file}.]]> Οι επιλεγμένες τοπικές ρυθμίσεις μπορεί να μην είναι ολοκλήρωμένες diff --git a/locale/el_GR/manager.xml b/locale/el_GR/manager.xml index 196075bec40..630aaf9ebee 100644 --- a/locale/el_GR/manager.xml +++ b/locale/el_GR/manager.xml @@ -139,10 +139,8 @@ Plugins συστήματος Εργαλεία Ανάγνωσης Ρόλοι - Μη έγκυρη μορφή αρχείου εικόνας λογοτύπου της κεφαλίδας της αρχικής σελίδας του περιοδικού. Έγκυρες μορφές αρχείων είναι .gif, .jpg, ή .png. Μη έγκυρη μορφή αρχείου εικόνας αρχικής σελίδας του περιοδικού. Έγκυρες μορφές αρχείων είναι .gif, .jpg, ή .png. Μη έγκυρη μορφή αρχείου εικόνας τίτλου της κεφαλίδας της αρχικής σελίδας του περιοδικού. Έγκυρες μορφές αρχείων είναι .gif, .jpg, ή .png. - Μη επιλεγμένο Σύνδεση και έλεγχος Μη έγκυρη μορφή εικόνας λογοτύπου της κεφαλίδας της σελίδας. Έγκυρες μορφές είναι .gif, .jpg, ή .png. Επιλέξτε ένα diff --git a/locale/el_GR/reader.xml b/locale/el_GR/reader.xml index 71d4c4be959..2643c311ace 100644 --- a/locale/el_GR/reader.xml +++ b/locale/el_GR/reader.xml @@ -34,144 +34,4 @@ Τίτλος Προβολή όλων των σχολίων Πλήρες Κείμενο: - Προσθήκη σχολίου - Ρυθμίσεις - Είστε βέβαιοι ότι επιθυμείτε να διαγράψετε το συγκεκριμένο πλαίσιο και όλες τις σχετικές αναζητήσεις; - Δημιουργία πλαισίου αναζήτησης - Διαμόρφωση πλαισίου αναζήτησης - Μεταδεδομένα - Χρησιμοποιήστε τα ονόματα συγγραφέα ως προεπιλεγμένους όρους αναζήτησης για να δώσετε δυνατότητα στους χρήστες να βρουν άλλα έργα από συγγραφείς για το συγκεκριμένο τεκμήριο (π.χ., για πλαίσιο «Άλλα έργα») - Χρησιμοποιήστε τα ονόματα συγγραφέα ως προεπιλεγμένους όρους αναζήτησης και περιγράψτε το πλαίσιο ως αναζήτηση για παραθέσεις στο άρθρο. - Ρυθμίσεις RST Για να μπορεί να πραγματοποιηθεί διπλό κλικ στις λέξεις για άνοιγμα του συγκειμένου αυτού.]]> - Χρησιμοποιήστε δεδομένα γεωγραφικής ευρετηρίασης προεπιλεγμένους όρους αναζήτησης. - Επιλογές - Διαχείριση - Εργαλεία ανάγνωσης - Είστε βέβαιοι ότι επιθυμείτε να διαγράψετε τη συγκεκριμένη αναζήτηση; - Δημιουργία αναζήτησης - Διαμόρφωση αναζήτησης - Σχετικά τεκμήρια - Απόσπασμα (παρουσιάζει την περίληψη του άρθρου). - Σχετικά με τον συγγραφέα (εμφανίζει βιογραφικά στοιχεία που έχουν καταχωρηθεί από τον συγγραφέα). - Πως να δημιουργήσετε βιβλιογραφική αναφορά ενός τεκμηρίου . - Όροι αναζήτησης σε λεξικό (παρέχει τη δυνατότητα στους χρήστες να κάνουν διπλό κλικ σε οποιαδήποτε λέξη σε ένα τεκμήριο και να αποστείλουν τη λέξη σε λεξικό). - Απενεργοποίηση Σχετιζόμεων Τεκμηρίων - Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου στον συγγραφέα (προσφέρει πρότυπο μηνύματος ηλεκτρονικού ταχυδρομείου του συγγραφέα με τη διεύθυνση του ηλεκτρονικού του ταχυδρομείου). - Γνωστοποίηση συναδέλφου (προσφέρει πρότυπο μηνύματος ηλεκτρονικού ταχυδρομείου με σύνδεσμο προς το τεκμήριο). - Εύρεση Αναφορών - Εκτυπώσιμη έκδοση (Δημιουργεί μια καλύτερα εκτυπώσιμη μορφή του τεκμηρίου). - Συμπληρωματικά αρχεία (εμφανίζει λίστα συπληρωτικών αρχείων που περιλαμβάνονται με την υποβολή). - Ευρετηρίαση μεταδεδομένων (εμφανίζει τα μεταδεδομένα ευρετηρίασης που παρέχονται από τον συγγραφέα και το σύστημα). - Κατάσταση - Η επικύρωση ολοκληρώθηκε. - OK - Το {$url} δεν είναι έγκυρο. - Επικύρωση URL για Εργαλεία ανάγνωσης - Επικύρωση - Είστε βέβαιοι ότι επιθυμείτε να διαγράψετε τη συγκεκριμένη έκδοση και όλα τα σχετικά περιεχόμενα και τις αναζητήσεις; - Είστε βέβαιοι ότι επιθυμείτε να επαναφέρετε οριστικά όλες τις εκδόσεις στις προεπιλεγμένες τιμές τους; Εάν ναι, θα πρέπει να επιλέξτε μια ενεργή έκδοση στη σελίδα Ρυθμίσεις. - Δημιουργία έκδοσης - Διαμόρφωση έκδοσης - Εξαγωγή - Εισαγωγή έκδοσης - Μεταδεδομένα - Επαναφορά εκδόσεων στις προεπιλεγμένες τιμές - Σχετικά με τον συγγραφέα - Μορφή Παραπομπής - Πως γίνεται παραπομπή τεκμηρίου - Online - Ενημέρωση συναδέλφου - Συντομογραφία - AND - Εάν το άρθρο έχει ευρετηριαστεί στο Google Scholar, μπορεί να συνοδεύεται από σύνδεσμο "Cited by X", που οδηγεί σε λίστα έργων που παραπέμπουν σε αυτό το άρθρο. Επίσης, το Google Scholar παρουσιάζει όλα τα τεκμήρια που παραθέτουν τον τίτλο και το συγγραφέα. Για πρόσβαση σε online πόρους που είναι αποκλειστικά διαθέσιμοι μέσω της βιβλιοθήκης σας, ενδέχεται να μπορείτε να μεταβείτε στις Προτιμήσεις Scholar στο Google Scholar και να ενεργοποιήσει τους Συνδέσμους βιβλιοθήκης (Library Links) για το ίδρυμα στο οποίο ανήκετε. - Πλαίσιο αναζήτησης - Εάν το τεκμήριο είναι αρχείο HTML (και όχι PDF), η πραγματοποίηση διπλού κλικ σε οποιαδήποτε λέξη του κειμένου θα την εμφανίζει στο πλαίσιο Λέξη-για-Πριοσδιορισμό (Word-to-Define). Σε διαφορετική περίπτωση, οι λέξεις, μπορούν να εκτυπωθούν ή να επικολληθούν στο πλαίσιο. Για περισσότερες πληροφορίες σχετικά με τους πόρους στους οποίους πραγματοποιήθηκε αναζήτηση, κάντε κλικ στο "ΣΧΕΤΙΚΑ". Οι πόροι αυτοί έχουν επιλεχθεί με βάση τη σχέση τους και την παροχή ανοικτής πρόσβασης σε όλα τα περιεχόμενα ή σε τμήμα αυτών. - Περιγραφή - Ταξινόμηση - Πλαίσια αναζήτησης - Οι όροι αναζήτησης έχουν επιλεγεί από τον/τους συγγραφέα(-είς). Μπορούν να τροποποιηθούν ή να διαγραφούν από τον αναγνώστη, καθώς 2 ή 3 σύντομοι και ακριβείς όροι ή φράσεις παρήγαγαν τις καλύτερες Boolean (AND) αναζητήσεις. Για περισσότερες πληροφορίες σχετικά με τους πόρους στους οποίους πραγματοποιήθηκε αναζήτηση, κάντε κλικ στο "ΣΧΕΤΙΚΑ". Οι πόροι αυτοί έχουν επιλεχθεί με βάση τη σχέση τους και την παροχή ανοικτής πρόσβασης σε όλα τα περιεχόμενα ή σε τμήμα αυτών. - Όροι αναζήτησης - Λέξη για προσδιορισμό - Τίτλος - Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου στον συγγραφέα - εγγραφή]]> - Το μήνυμα εστάλη. - Εύρεση Αναφορών - Google Scholar - Windows Live Academic - Όροι αναζήτησης - Συντελεστής - Κάλυψη - Ημερομηνία - Περιγραφή - Dublin Core - Μορφή - Αναγνωριστικό - Γλώσσα - Εκδότης - Σχέση - Δικαιώματα - Πηγή - Θέμα - Τίτλος - Τύπος - Μεταδεδομένα για το συγκεκριμένο έγγραφο - Περίληψη - Πνευματικά δικαιώματα και άδειες - Γεω-χωρική τοποθεσία, χρονολογική περίοδος, δείγμα έρευνας (φύλο, ηλικία, κτλ.) - (ΧΧΧΧ-MM-ΗΗ) - Κλάδος (-οι) - Μορφή αρχείου - Κατάσταση & φύλλο - Τεκμήρια μεταδεδομένων PKP - Αγγλικά=en - Φορέας οργάνωσης, τοποθεσία - Περιοδικό/τίτλος συνεδρίου, τόμος, αρ. (έτος) - Χορηγός(-οί) - Λέξη-κλειδί (λέξεις-κλειδιά) - Συμπλ. Αρχεία - Τίτλος εγγράφου - Τύπος - Universal Resource Indicator - Έντυπη Έκδοση - Εργαλεία ανάγνωσης - Σχετιζόμενα τεκμήρια - Πολιτική αξιολόγησης - Περιγραφή - Αναζητήσεις - Ταξινόμηση - Αναζήτηση - Καταχώριση δεδομένων - Αναζήτηση URL - Πρόταση πηγής - Τίτλος - URL - Κατέβασμα - Συμπληρωματικά αρχεία - Μεταδεδομένα ευρετηρίασης - Περιγραφή - Κλειδί - Τοπική ρύθμιση - Σύνολα σχετικών τεκμηρίων - Τίτλος - Έκδοση - Ευρετηρίαση μεταδεδομένων - Απαιτείται ένα τίτλος σχολίου. - Διαμοιρασμός (Sharing) - Ενεργοποίηση Διαμοιρασμού - addthis.com, και Αντιγράψτε και Επικολλήστε τον κώδικο του κουμπιού Διαμοιρασμού παρακάτω.]]> - Βασικές Ρυθμίσες - AddThis.com όνομα χρήστη - Στύλ κουμπιού - Χρήση drop-down μενού - Προωθημένες Ρυθμίσεις (προαιρετικά) - AddThis.com customization documentation για τεκμηρίωση.]]> - Brand - (comma separated list)]]> - Γλώσσα - Λογότυπο - Φόντο λογοτύπου - Χρώμα λογοτύπου - Ρύθμιση AddThis - Web diff --git a/locale/en_US/admin.xml b/locale/en_US/admin.xml index 9b5b957366f..94bfa0e9fd8 100644 --- a/locale/en_US/admin.xml +++ b/locale/en_US/admin.xml @@ -65,20 +65,14 @@ PHP version OS platform Settings - About the Site + About the Site Email of principal contact Name of principal contact - The email address of the principal contact is required. - The name of the principal contact is required. - You must enter a minimum password length of at least 4 characters. - A title is required. Your installation is configured to record more than one usage metric. Usage statistics will be displayed in several contexts. There are cases where a single usage statistic must be used, e.g. to display an ordered list of most-used submissions or to rank search results. Please select one of the configured metrics as a default. - Site Logo - Invalid site logo image format. Accepted formats are .gif, .jpg, or .png. Introduction Minimum password length (characters) Site language diff --git a/locale/en_US/api.xml b/locale/en_US/api.xml index eb1809b2ae8..e64e47a6bb9 100644 --- a/locale/en_US/api.xml +++ b/locale/en_US/api.xml @@ -12,12 +12,20 @@ --> + You are not authorized to access the requested resource. + The requested resource was not found. + The requested URL was not recognized. Your request was denied. This may be because your login has expired. Try reloading the page and trying again. You can only view unpublished submissions to which you have been assigned. You can not delete a submission that is not assigned to this context. You do not have permission to delete this submission. - The requested resource was not found. + This endpoint is not available from a context. It must be accessed from the site-wide namespace. Your request could not be fulfilled because it is missing required information. The requested volume, number or year is not valid. An unexpected error has occurred. Please reload the page and try again. + No file to be uploaded could be found with the request. + One or more files could not be uploaded. + Files larger than {$maxSize} can not be uploaded. + File could not be uploaded because of a server configuration error. Please contact the system administrator. + The active theme, {$themePluginPath}, is not enabled and may not be installed. diff --git a/locale/en_US/common.xml b/locale/en_US/common.xml index e32772cdb49..94f8c9195fd 100644 --- a/locale/en_US/common.xml +++ b/locale/en_US/common.xml @@ -56,7 +56,7 @@ of a the and an or nor but is if then else when at from by on off for in out over to into with Assigned Alternate text - To improve your search engine optimization and comply with WCAG standards, please describe any information that appears in this image which would be missed if the site was viewed in a text-only browser or with assistive devices. Example: "Our editor speaking at the PKP#2015 conference." + Describe this image for visitors viewing the site in a text-only browser or with assistive devices. Example: "Our editor speaking at the PKP conference." and Apply Action Assign @@ -167,7 +167,6 @@ Initiate In progress Items per page - Favicon Keywords Language Languages @@ -201,6 +200,8 @@ OK Options Order + Increase position of {$itemTitle} + Decrease position of {$itemTitle} Original file name or Other @@ -208,7 +209,6 @@ {$start}-{$end} of {$total} Browse additional pages Page {$pageNumber} - Page Header Logo {$percentage}% Plugin The plugin "{$pluginName}" has been enabled. @@ -268,13 +268,12 @@ Untitled Updated Uploaded date - Uploaded file Upload The file could not be uploaded or revised. - No file uploaded or invalid file type! - Homepage Image Up Upload File + Restore Original + Preview of the currently selected image. Change File Drag and drop a file here to begin upload URL @@ -332,22 +331,46 @@ Are you sure you want to submit this form? Confirm An email address is required. - The data on this form has changed. Do wish to continue without saving? + The data on this form has changed. Do you wish to continue without saving? + Only the following languages are allowed: {$languages}. + This property is not allowed. + Drop files here to upload + Your browser does not support drag'n'drop file uploads. + Please use the fallback form below to upload your files. + File is too big ({{filesize}}mb). Files larger than {{maxFilesize}}mb can not be uploaded. + Files of this type can not be uploaded. + Server responded with {{statusCode}} code. Please contact the system administrator if this problem persists. + Cancel upload + Upload canceled + Are you sure you want to cancel this upload? + Remove file + You can not upload any more files. + Go to {$fieldLabel}: {$errorMessage} + Jump to next error + Please correct one error. + Please correct {$count} errors. + The form was not saved because {$count} error(s) were encountered. Please correct these errors and try again. + An unexpected error occurred. You may have been logged out. Please reload the page and try again. Errors occurred processing this form To enter the information below in additional languages, first select the language. Form Language contains is + This field is required. starts with The form was not submitted properly. - The form was not submitted properly. + The form could not be submitted. You may have been logged out. Please reload the page and try again. A file upload is required. (* Required) + You must complete this field in {$language}. + You must provide a valid ID. Resubmit Use Save to upload file. Send Submit An invalid image was uploaded. Accepted formats are .png, .gif, or .jpg. + {$label} in {$localeName} + {$count}/{$total} languages completed Help Table of Contents Previous @@ -479,7 +502,7 @@ Published After Published Before Delete - Discipline(s) + Disciplines Full Text Index terms All index term fields @@ -562,4 +585,68 @@ Show more details about {$name} Hide expanded details about {$name} + + + Please accept this item.. + This is not a valid URL. + This date must be after {$date}. + This may only contain letters. + This may only contain letters, numbers, and dashes. + This may only contain letters and numbers. + This is not a valid array. + This date must be before {$date}. + This must be between {$min} and {$max}. + This must be between {$min} and {$max} kilobytes. + This must be between {$min} and {$max} characters. + This must have between {$min} and {$max} items. + This field must be true or false. + The confirmation for this field does not match. + This is not a valid currency. + This is not a valid date. + This does not match the format {$format}. + The {$attribute} and {$other} must be different. + This must be {$digits} digits long. + This must be between {$min} and {$max} digits. + This is not a valid email address. + The selected {$attribute} is invalid. + This field is required. + This must be an image. + The selected {$attribute} is invalid. + This is not a valid integer. + This is not a valid IP address. + This is not a valid ISSN. + This is not a valid JSON string. + This language is not accepted. + This field is multilingual. Separate values must be provided for each supported language. + Languages must be specified using the locale code. Examples: en_US, fr_CA, sr_RS@cyrillic. + This may not be greater than {$max}. + This may not be greater than {$max} kilobytes. + This may not be greater than {$max} characters. + This may not have more than {$max} items. + This must be a file of type {$values}. + This must be at least {$min}. + This must be at least {$min} kilobytes. + This must be at least {$min} characters. + This must have at least {$min} items. + The selected {$attribute} is invalid. + This is not a valid number. + This is not a valid ORCID. + The {$attribute} field must be present. + This is not formatted correctly. + This field is required. + This field is required when {$other} is {$value}. + This field is required unless {$other} is in {$values}. + This field is required when {$values} is present. + This field is required when {$values} is present. + This field is required when {$values} is not present. + This field is required when none of {$values} are present. + The {$attribute} and {$other} must match. + This must be {$size}. + This must be {$size} kilobytes. + This must be {$size} characters. + This must contain {$size} items. + This is not a valid string. + This is not a valid timezone. + The {$attribute} has already been taken. + This is not a valid URL. diff --git a/locale/en_US/manager.xml b/locale/en_US/manager.xml index 684672c59d6..b351c86750e 100644 --- a/locale/en_US/manager.xml +++ b/locale/en_US/manager.xml @@ -64,6 +64,11 @@ Editorial Production Emails + The email settings have been updated. + Reviewer Guidance + Reviewer guidance has been updated. + The review settings have been updated. + The review reminder details have been updated. Are you sure you want to delete this email template? Are you sure you want to reset this email template to its default values? Add Email Template @@ -77,7 +82,7 @@ Email Key An email with the given key already exists. Email keys must be unique. Email Template - Email Templates + Templates Enable this email template Enable You are about to enable this email. Do you want to confirm this operation? @@ -213,29 +218,29 @@ Narrow results by country, region and/or city. Sponsor Additional Content - Anything entered here will appear on your homepage. - Copyright Notice - Require authors to agree to the Copyright Notice as part of the submission process. + Anything entered here will appear on your homepage. + Advanced + The appearance settings have been updated. + Copyright Notice + Require authors to agree to the following copyright notice as part of the submission process. Author Guidelines Recommended guidelines include bibliographic and formatting standards alongside examples of common citation formats to be used in submissions. + The author guidelines have been successfully updated. + Checklist Competing Interests - Reviewers will be asked to comply with the competing interests disclosure policy you specify below. There was an error when deleting this item. - Invalid favicon format. Accepted formats are .ico, .png, and .gif. + Favicon File type grouping - Invalid homepage header logo image format or upload failed. Accepted formats are .gif, .jpg, or .png. Homepage Image - Upload an image to display prominently on the homepage. + Upload an image to display prominently on the homepage. Invalid homepage image format or upload failed. Accepted formats are .gif, .jpg, or .png. Invalid homepage header title image format or upload failed. Accepted formats are .gif, .jpg, or .png. Descriptions - Theme - New themes may be installed from the Plugins tab at the top of this page. - Sidebar management Sidebar - Unselected + The {$name} block can not be found. Please make sure the plugin is installed and enabled. Logging and Auditing Logo + The file you uploaded could not be found. Please try to upload it again. Notification of Author Submission Send a copy to this email address Authors are automatically sent an email acknowledging their submission. You may have copies of this email sent to the following: @@ -243,27 +248,33 @@ If providing immediate free access to all published content, you may enter a description of your Open Access Policy. Invalid page header logo image format or upload failed. Accepted formats are .gif, .jpg, or .png. Page Footer - Enter any images, text or HTML code that you'd like to appear at the bottom of your website. + Enter any images, text or HTML code that you'd like to appear at the bottom of your website. Outline the peer review policy and processes for readers and authors. This description often includes the number of reviewers typically used in reviewing a submission, the criteria by which reviewers are asked to judge submissions, expected time required to conduct the reviews, and the principles used to select reviewers. Principal Contact Enter contact details, typically for a principal editorship, managing editorship, or administrative staff position, which can be displayed on your publicly accessible website. Privacy Statement This statement will appear during user registration, author submission, and on the publicly available Privacy page. In some jurisdictions, you are legally required to disclose how you handle user data in this privacy policy. - Weeks allowed to accept or decline a review request + Default Response Deadline + Default Completion Deadline + Number of weeks to accept or decline a review request. Weeks allowed for review completion Never Remind Defaults can be modified for each review during the editorial process. - Send a reminder if a reviewer has not responded to a review request within the following time (days) after response due date: - Send a reminder if a reviewer has not submitted a recommendation within the following time (days) after review's due date: - Default Review Deadlines - Present a link to "Ensuring a Blind Review" during upload - Sitemap - {$path}]]> + Response Reminder + Send an email reminder if a reviewer has not responded to a review request this many days after the response due date. + Review Reminder + Send an email reminder if a reviewer has not submitted a recommendation within this many after the review's due date. + Default Review Mode + Ensuring a Blind Review during upload]]> Sponsor Relationship and Policy Description Examples: scholarly associations, university departments, cooperatives, etc. Sponsors are displayed publicly. Experienced web developers can upload a CSS file to further customize the website's appearance. Technical Support Contact A contact person who can assist editors, authors and reviewers with any problems they have submitting, editing, reviewing or publishing material. + View Now]]> + Theme + New themes may be installed from the Plugins tab at the top of this page. + The theme you selected is not installed or enabled. Site Access Options {$count} ({$percentage}%) {$numTotal} ({$numNew} new) @@ -353,12 +364,19 @@ {$locale} defined as primary locale. All selected locale(s) installed and activated. {$locale} locale uninstalled. - {$locale} locale reloaded. + {$locale} locale reloaded for {$contextName}. Locale settings saved. User edited. Indexing + License + The licensing details have been updated. + Other license URL + License Terms + Enter public licensing terms you would like to display alongside published work. + Custom Tags + Add custom HTML tags, also known as meta tags, that you would like to be inserted in the head of every page. Consult a technical advisor before adding tags here. Payments @@ -366,7 +384,6 @@ No payment method selected Payment Method Currency - Payments made directly through this website will be denominated in the selected currency. Role Options @@ -469,6 +486,59 @@ URL to a webpage describing the license, if available. Submission Form + The submission metadata has been updated successfully. + Coverage + Coverage will typically indicate a work's spatial location (a place name or geographic coordinates), temporal period (a period label, date, or date range) or jurisdiction (such as a named administrative entity). + Enable coverage metadata + Do not request coverage metadata from the author during submission. + Ask the author to suggest coverage metadata during submission. + Require the author to suggest coverage metadata before accepting their submission. + Keywords are typically one- to three-word phrases that are used to indicate the main topics of a submission. + Enable keyword metadata + Do not request keywords from the author during submission. + Ask the author to suggest keywords during submission. + Require the author to suggest keywords before accepting their submission. + Language indicates the work's primary language using a language code ("en") with an optional country code ("en_US"). + Enable language metadata + Do not request the submission's languages from the author during submission. + Ask the author to indication the submission's languages during submission. + Require the author to enter the submission's languages before accepting their submission. + Any rights held over the submission, which may include Intellectual Property Rights (IPR), Copyright, and various Property Rights. + Enable rights metadata + Do not request a rights disclosure from the author during submission. + Ask the author to disclose any prior access rights during submission. + Require the author to disclose any prior access rights before accepting their submission. + The source may be an ID, such as a DOI, of another work or resource from which the submission is derived. + Enable source metadata + Do not request a source URL from the author during submission. + Ask the author to provide a source URL during submission. + Require the author to provide a source URL before accepting their submission. + Subjects will be keywords, key phrases or classification codes that describe a topic of the submission. + Enable subject metadata + Do not request subjects from the author during submission. + Ask the author to provide subjects during submission. + Require the author to provide subjects before accepting their submission. + Dublin Core types.]]> + Enable type metadata + Do not request the type from the author during submission. + Ask the author to provide the type during submission. + Require the author to provide the type before accepting their submission. + Disciplines are types of study or branches of knowledge as described by university faculties and learned societies. + Enable disciplines metadata + Do not request disciplines from the author during submission. + Ask the author to provide disciplines during submission. + Require the author to provide disciplines before accepting their submission. + Supporting agencies may indicate the source of research funding or other institutional support that facilitated the research. + Enable supporting agencies metadata + Do not request supporting agencies from the author during submission. + Ask the author to disclose any supporting agencies during submission. + Require the author to disclose any supporting agencies before accepting their submission. + Collect a submission's references in a separate field. This may be required to comply with citation-tracking services such as Crossref. + Enable references metadata + Do not request references from the author during submission. + Ask the author to provide references during submission. + Require the author to provide references before accepting their submission. + Validation errors: Warnings encountered: @@ -491,11 +561,11 @@ The imported user "{$username}" has no password. Check your import XML format. The user has not been imported. The imported user "{$username}" password could not be imported as is. A new password is been send to the user email. The user has been imported. The imported user "{$username}" has a plain password that is not valid. The user has not been imported. - + Title Path - Navigation Menus + Navigation This page will be accessible at:
{$pagesPath}
...where %PATH% is the path entered above. Note: No two pages can have the same path. Using paths that are built into the system may cause you to lose access to important functions.

]]>
Content The path field must contain only alphanumeric characters plus '.', '/', '-', and '_'. diff --git a/locale/en_US/reader.xml b/locale/en_US/reader.xml index 1bbdcc80f58..70f1054fc13 100644 --- a/locale/en_US/reader.xml +++ b/locale/en_US/reader.xml @@ -34,147 +34,4 @@ Title View all comments Full Text: - Add comment - Configuration - Are you sure you wish to delete this Context and all associated Searches? - Create Context - Edit Context - Metadata - Use author names as default search terms to enable users to find other works by the authors for this item (e.g., for an "Other Works" context) - Use author names as default search terms and describe the context as a search for citations to the article. - RST Settings to allow double-clicking on words to open this context.]]> - Use geographical indexing data as default search terms. - Options - Management - - Sharing - Sharing Enabled - addthis.com, and copy/paste the Sharing button code below.]]> - - Basic Settings - AddThis.com user name - Button style - Use drop-down menu - Advanced Settings (optional) - AddThis.com customization documentation for reference.]]> - Brand - (comma separated list)]]> - Language - Logo - Logo background - Logo color - - Reading tools - Are you sure you wish to delete this Search? - Create Search - Edit Search - Related items - Abstract (presents the item's abstract). - View Review Policy - About the author (displays the bio statements entered by the author). - How to cite item (provides bibliographic detail for item). - Look up terms (enables readers to double-click on any word in an item and send the word to a dictionary). - Disable Related Items - Email the author (leads to an email template with author's email). - Notify a colleague (leads to an email template with link to item). - Find References - Print version (provides a printer-friendly version of an item). - Supplementary files (displays list of files author included with submission). - Indexing metadata (displays item's indexing metadata provided by author and system). - Status - Configure AddThis - Validation complete. - OK - {$url} is not valid. - Validate URLs for Reading Tools - Validate - Are you sure you wish to delete this Version and all associated Contexts and Searches? - Are you sure you wish to irreversibly restore all versions to their defaults? If so, you will need to choose an active Version on the Settings page. - Create Version - Edit Version - Export - Import Version - Metadata - Restore Versions to Defaults - About the author - Citation Format - How to cite item - Online - Web - Notify colleague - Abbrev - AND - If the article is indexed in Google Scholar, it may be accompanied by a "Cited by X" link, which leads to a list of works that cite it. As well, Google Scholar will list all items quoting the title and author. To access online resources that are only available through your research library, you may be able to go to Scholar Preferences in Google Scholar and activate the Library Links for your institution. - Context - If the item is a HTML file (rather than a PDF), double clicking on any word in the text will make it appear in the Word-to-Define box. Otherwise, words can be typed or pasted in the box. To learn more about the resource searched, click on ABOUT. These resources have been selected because of their relevance and their open (free) access to all or part of their contents. - Description - Order - Contexts - The search terms have been selected by the author(s). They can be altered or deleted by the reader, as two or three short, precise terms or phrases produced the best Boolean (AND) searches. To learn more about the resources searched, click on ABOUT. These resources have been selected for their relevance and open (free) access to all or part of their contents. - Search Terms - Word to define - Title - Email the author - registration]]> - Your message has been sent. - Finding References - Google Scholar - Windows Live Academic - Look up terms - Contributor - Coverage - Date - Description - Dublin Core - Format - Identifier - Language - Publisher - Relation - Rights - Source - Subject - Title - Type - Metadata for this Document - Abstract - Copyright and permissions - Geo-spatial location, chronological period, research sample (gender, age, etc.) - (YYYY-MM-DD) - Discipline(s) - File format - - PKP Metadata Items - English=en - Organizing agency, location - Title; vol., no. (year) - Sponsor(s) - Keyword(s) - Supp. Files - Title of document - Type - Uniform Resource Identifier - Print version - Reading Tools - Related items - Review policy - Description - Searches - Order - Search - Post data - Search URL - Suggest a source - Title - URL - Download - Supplementary files - Indexing metadata - Description - Key - Locale - Related Item Sets - Title - Version - Indexing metadata diff --git a/locale/en_US/submission.xml b/locale/en_US/submission.xml index ae87de1bb62..d2dead99a1b 100644 --- a/locale/en_US/submission.xml +++ b/locale/en_US/submission.xml @@ -383,7 +383,6 @@ Please enter a subject. Please enter a discipline. Please enter a keyword. - Please enter a supporting agency. Please enter the coverage information. Please enter the type. Please enter the source. @@ -589,6 +588,12 @@ Creative Commons License

This work is licensed under a Creative Commons Attribution-NoDerivatives 4.0 International License.

]]>
Creative Commons License

This work is licensed under a Creative Commons Attribution 4.0 International License.

]]>
Creative Commons License

This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

]]>
+ Creative Commons License

This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 3.0 International License.

]]>
+ Creative Commons License

This work is licensed under a Creative Commons Attribution-NonCommercial 3.0 International License.

]]>
+ Creative Commons License

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 International License.

]]>
+ Creative Commons License

This work is licensed under a Creative Commons Attribution-NoDerivatives 3.0 International License.

]]>
+ Creative Commons License

This work is licensed under a Creative Commons Attribution 3.0 International License.

]]>
+ Creative Commons License

This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 International License.

]]>
Pre-Review Discussions @@ -618,8 +623,6 @@ Review Due Review Submitted Delete submission? - Increase position of {$itemTitle} - Decrease position of {$itemTitle} View Submission Assigned reviews completed Revisions submitted diff --git a/locale/es_ES/admin.xml b/locale/es_ES/admin.xml index b95ac48ac7e..a13d4b28908 100644 --- a/locale/es_ES/admin.xml +++ b/locale/es_ES/admin.xml @@ -31,7 +31,7 @@ La herramienta solo copiará los archivos que aún no estén en los directorios Uso: {$scriptName} ruta/a/apache/log/file.log Uso (procesar todos los archivos de un directorio): {$scriptName} ruta/a/apache/directorio -Uso (procesar todos los archivos de un directorio que empieza con la cadena pasada): {$scriptName} ruta/a/apache/directorio empieza_con_cadena +Uso (procesar todos los archivos de un directorio que empieza con la cadena pasada): {$scriptName} ruta/a/apache/directorio empieza_con_cadena
Error: no se puede crear la carpeta temporal {$tmpDir} Error: el archivo {$filePath} no existe o no se puede acceder a él. @@ -75,19 +75,13 @@ Uso (procesar todos los archivos de un directorio que empieza con la cadena pasa Versión PHP Plataforma SO Ajustes - Descripción del sitio + Descripción del sitio Correo electrónico del contacto principal Nombre del contacto principal - Se necesita la dirección de correo electrónico del contacto principal. - Se necesita el nombre del contacto principal. - Debes introducir una contraseña de 4 caracteres como mínimo. - Es necesario introducir el título. Se ha configurado su instalación para registrar más de una métrica de uso. Se mostrarán las estadísticas de uso en varios contextos. En algunos casos deberá utilizarse una sola estadística de uso, p. ej., para mostrar una lista ordenada de los envíos más utilizados o para clasificar resultados de búsqueda. Seleccione una de las medidas configuradas como predeterminadas. - Logotipo del sitio - Formato de imagen del logotipo del sitio inválido. Formatos aceptados: .gif, .jpg y .png. Introducción Longitud mínima de la contraseña Idioma @@ -120,13 +114,13 @@ Uso (procesar todos los archivos de un directorio que empieza con la cadena pasa El archivo {$filename} no se pudo mover de {$currentFilePath} a {$destinationPath} El archivo {$filename} se ha procesado y archivado. Cargador de archivos - + Copie el archivo o los archivos de acceso de registro apache y filtre las entradas relacionadas con esta instalación en el directorio de archivo actual, dentro del directorio de fase UsageStatsPlugin. Debe ejecutarlo un usuario/a que tenga los permisos necesarios para la lectura de archivos de acceso de registro apache. La herramienta solo copiará archivos que aún no estén en los directorios de carga de archivo usageStats (fase, procesamiento, archivo, rechazar). Uso: {$scriptName} ruta/a/apache/log/file.log -Uso (procesamiento de todos los archivos dentro de un directorio): {$scriptName} ruta/a/apache/directorio +Uso (procesamiento de todos los archivos dentro de un directorio): {$scriptName} ruta/a/apache/directorio Error: no se puede crear la carpeta temporal {$tmpDir} Error: el archivo {$filePath} no existe o no se puede acceder a él. diff --git a/locale/es_ES/common.xml b/locale/es_ES/common.xml index c20051fc242..5edf2e8b2f3 100644 --- a/locale/es_ES/common.xml +++ b/locale/es_ES/common.xml @@ -54,7 +54,6 @@ de un una unos unas el la los las y o ni pero es si después además cuando en desde para por fuera dentro sobre a hasta con contra Asignado Texto alternativo - Por favor ingrese un texto alternativo para esta imagen para asegurar la accesibilidad a usuarios con navegadores de solo-texto o con dispositivos de ayuda y Continuar Asignar @@ -165,11 +164,12 @@ Aceptar Opciones Orden + Incrementar posición de {$itemTitle} + Decrementar posición de {$itemTitle} Nombre del archivo original o Otro Vencido - Logo del Encabezado de la Página Módulo El módulo "{$pluginName}" se ha activado. El módulo "{$pluginName}" se ha desactivado. @@ -218,11 +218,8 @@ No leído Sin título Actualizado - Fichero subido Subir No se ha podido subir el fichero. Por favor, inténtelo de nuevo o póngase en contacto con el administrador si el problema persiste. - No se cargó ningún archivo o tipo de archivo no válido. - Imagen de la página inicial Arriba URL Usuario/a @@ -454,7 +451,6 @@ Actualmente no posee los permisos suficientes para ver el envío. Edite su perfil para asegurarse de que le han concedido el rol apropiado en la opción "Registrarse como". El usuario/a actual no es el autor/a del envío solicitado. Compruebe que se ha identificado con la cuenta de usuario/a correcta. Inicio - Icono de página Página {$pageNumber} {$percentage}% Todo activo @@ -509,7 +505,6 @@ Debe completar la comprobación de validación utilizada para evitar envíos de spam. No superó la comprobación de validación utilizada para evitar envíos de spam. Descargar PDF - El formulario no se envió correctamente. Añadir nota Ir al contenido principal Ir al menú de navegación principal diff --git a/locale/es_ES/manager.xml b/locale/es_ES/manager.xml index 3c2fe427554..56bd8124b02 100644 --- a/locale/es_ES/manager.xml +++ b/locale/es_ES/manager.xml @@ -208,23 +208,19 @@ Patrocinador Directrices para autores Conflicto de intereses. - Se pedirá a los revisores/as que cumplan con la política de divulgación de conflictos de intereses que especifique a continuación. Agrupación de tipos de archivo Tiempo permitido para revisar las respuestas (semanas) Tiempo permitido para finalizar las respuestas (semanas) No recordar más - Envíe un recordatorio si el revisor/a no responde a una solicitud de revisión (días): - Envíe un recordatorio si el revisor/a no entrega una recomendación (días): + Envíe un recordatorio si el revisor/a no responde a una solicitud de revisión (días): + Envíe un recordatorio si el revisor/a no entrega una recomendación (días): Puede añadir una nota para describir su política y su relación con el patrocinador, esta aparecerá junto con la lista del patrocinador en su página Acerca de. Puede subir un hoja de estilo en cascada (CSS) adicional para cambiar la apariencia. Ha sucedido un error al borrar este ítem - Formato de la imagen del logotipo de cabecera de la página inicial inválido o error de subida. Formatos aceptados: .gif, .jpg y .png. Formato de la imagen del logotipo de cabecera de la página inicial inválido o error de subida. Formatos aceptados: .gif, .jpg y .png. Formato de la imagen del logotipo de cabecera de la página inicial inválido o error de subida. Formatos aceptados: .gif, .jpg y .png. - Tema - Elija un tema del conjunto de módulos de aspecto. - Gestión de la barra lateral - Sin seleccionar + Tema + Elija un tema del conjunto de módulos de aspecto. Registro y Auditoría Formato de imagen del logotipo de encabezado de página inválido o error de subida. Formatos aceptados: .gif, .jpg y .png. Opciones de acceso a sitio @@ -299,7 +295,6 @@ No se ha seleccionado una forma de pago Forma de pago Moneda - Los pagos realizados directamente desde este sitio web se realizarán en la moneda seleccionada. Opciones de rol @@ -350,13 +345,13 @@ Objeto no encontrado en la base de datos Ayer Contenido adicional - Cualquier elemento introducido aquí aparecerá en su página de inicio. - Aviso de derechos de autor - Es necesario que los autores acepten el aviso de derechos de autor como parte del proceso de envío. + Cualquier elemento introducido aquí aparecerá en su página de inicio. + Aviso de derechos de autor + Es necesario que los autores acepten el aviso de derechos de autor como parte del proceso de envío. Las directrices recomendadas incluyen estándares bibliográficos y de formateo junto con ejemplos de formatos de citas comunes para ser usados en los envíos. - Formato de icono de web inválido. Los formatos aceptados son .ico, .png y .gif. + Icono de página Imagen de inicio - Subir una imagen para visualizarla en primer plano en la página de inicio. + Subir una imagen para visualizarla en primer plano en la página de inicio. Descripciones Logo Notificación del envío del autor @@ -365,13 +360,12 @@ Política de acceso abierto Si proporciona acceso libre inmediato a todo el contenido publicado, debería introducir una descripción de su política de acceso abierto. Pie de página - Introduzca cualquier imagen, texto o código HTML que quiera que aparezca en la parte inferior de su sitio web. + Introduzca cualquier imagen, texto o código HTML que quiera que aparezca en la parte inferior de su sitio web. Contacto principal Introduzca los detalles de contacto usuales para el editor principal, el director editorial o el personal administrativo, los cuales se mostrarán en la parte accesible al público general de su sitio web. Declaración de privacidad Las condiciones predefinidas para cada revisión pueden ser modificadas durante el proceso editorial. Fechas límites de revisión por defecto - Muestra un enlace para "garantizar una revisión ciega" durante la subida Ejemplos: asociaciones escolares, departamentos universitarios, cooperativas, etc. Los patrocinadores se muestran públicamente. Contacto del soporte técnico Una persona de contacto que puede dar soporte a editores, autores y revisores con problemas al enviar, editar, revisar o publicar un material. diff --git a/locale/es_ES/reader.xml b/locale/es_ES/reader.xml index ae8a585dc16..6af39b1f6c2 100644 --- a/locale/es_ES/reader.xml +++ b/locale/es_ES/reader.xml @@ -34,164 +34,5 @@ Título Ver todos los comentarios Texto completo: - Añadir comentario - Configuración - ¿Seguro que quieres borrar este contexto y todas las búsquedas asociadas? - Crear contexto - Editar contexto - Metadatos - Usar nombres de autores como términos de búsqueda por defecto para permitir a los usuarios encontrar otros trabajos de los autores de este artículo (p.ej., para un contexto de "Otros trabajos") - Usar nombres de autores como términos de búsqueda por defecto y describir el contexto como búsqueda para citas al artículo. - Configuración RST para permitir que se abra el contexto al hacer doble clic sobre una palabra.]]> - Utilizar información geográfica de indexación como términos de búsqueda por defecto. - Opciones - Gestión - - Compartición - Habilitar compartición - addthis.com y copie/pegue el código del botón de Compartir que aparece debajo.]]> - - Configuraciones básicas - Usuario de AddThis.com - Estilo de botón - Usar el menú desplegable - Configuraciones avanzadas (opcional) - documentación de personalización de AddThis.com para más información.]]> - Marca - (lista separada por comas)]]> - Idioma - Logotipo - Fondo de logotipo - Color de logotipo - - Herramientas de lectura - ¿Seguro que quieres eliminar esta búsqueda? - Crear búsqueda - Editar búsqueda - Elementos relacionados - Resumen (resumen del elemento actual). - Ver política de revisión - Acerca del autor (muestra los datos biográficos introducidos por el autor). - Cómo citar elementos (proporciona detalles bibliográficos). - Definición de términos (permite a los lectores hacer doble clic en cualquier palabra y enviarla a un diccionario). - Desactivar elementos relacionados - Mandar correo electrónico al autor (permite al lector escribir un correo electrónico al autor en una plantilla). - Notificar a un amigo (permite al lector escribir un correo electrónico en una plantilla con un enlace al elemento). - Buscar referencias - Versión para imprimir (proporciona una versión para imprimir de un elemento). - Ver archivos complementarios (muestra una lista de archivos complementarios incluidos por el autor). - Información de indexación (muestra la información de indexación de un elemento generada por el autor y el sistema) - Estado - Configurar AddThis - Validación completada. - Aceptar - {$url} no es válido. - Validar URLs para las Herramientas de Lectura - Validar - ¿Seguro que quieres eliminar esta versión y todas las búsquedas y contextos asociados? - ¿Está seguro de que desea restaurar todas las versiones a los valores por defecto? En caso afirmativo, debe elegir una versión activa en la página de Configuración. - Crear versión - Editar versión - Exportar - Importar versión - Metadatos - Restaurar todas las versiones a los valores por defecto - Acerca del autor - Formato de cita - Cómo citar elementos - En línea - Web - Notificar a un amigo - Abreviatura - Y - Si el artículo está indexado en Google Académico, puede que vaya acompañado de un enlace de "Citado por X", el cual abre una lista de las obras que lo citan. Además, Google Académico enumerará todos los elementos que citen el título y al autor/a. Para acceder a los recursos en línea que solo estén disponibles a través de la biblioteca de investigación, puede ir a Configuración de Google Académico y activar los enlaces de bibliotecas de su institución. - Contexto - Si el elemento es un archivo HTML (en lugar de un PDF), al hacer doble clic en cualquier palabra del texto ésta se mostrará en el cuadro Palabra para definir. De lo contrario, es posible escribir o pegar las palabras en el cuadro. Para obtener más información acerca del recurso buscado, haga clic en ACERCA DE. Estos recursos se seleccionaron por su carácter relevante y por permitir el acceso abierto (libre) a una parte total o parcial del contenido. - Descripción - Orden - Contextos - El autor/es/a/as ha(n) seleccionado los términos de búsqueda. El lector/a puede cambiarlos o eliminarlos, ya que dos o tres términos o frases cortos y precisos dieron lugar a las mejores búsquedas booleanas (Y). Para obtener más información acerca del recurso buscado, haga clic en ACERCA DE. Estos recursos se seleccionaron por su carácter relevante y por permitir el acceso abierto (libre) a una parte total o parcial del contenido. - Términos de búsqueda - Definir palabra - Título - Mandar correo electrónico al autor - registrarse]]> - Tu mensaje ha sido enviado. - Buscar referencias - Google Académico - Windows Live Academic - Buscar palabras - Colaborador - Cobertura - Fecha - Descripción - Dublin Core - Formato - Identificador - Idioma - Editor - Relación - Derechos - Fuente - Materia - Título - Tipo - Metadatos para este documento - Resumen - Copyright y permisos - Localización geo-espacial, periodo cronológico, ejemplo de investigación (sexo, edad, etc.) - (AAAA-MM-DD) - Disciplina(s) - Formato del archivo - - Elementos de metadatos de PKP - Español=es - Agencia organizadora, ubicación - Título; vol., núm. (año) - Patrocinador(es) - Palabra(s) clave(s) - Arch. Archivos - Título del documento - Tipo - Indicador de Recursos Universal (URI) - Versión para imprimir - Herramientas de lectura - Elementos relacionados - Política de revisión - Descripción - Búsquedas - Orden - Buscar - Enviar información - Buscar URL - Sugerir una fuente - Título - URL - Descargar - Archivos complementarios - Información de indexación - Descripción - Clave - Configuración regional - Conjuntos de elementos relacionados - Título - Versión - Información de indexación Se requiere un título para el comentario. - Compartición - Habilitar compartición - addthis.com, y copia/pega el código que hay bajo el botón de Compartición.]]> - Configuraciones básicas - Usuario de AddThis.com - Estilo de botón - Usar el menú desplegable - Configuraciones avanzadas (opcional) - Marca - (lista separada por comas)]]> - Idioma - Logotipo - Fondo de logotipo - Color de logotipo - Configurar AddThis - Web diff --git a/locale/es_ES/submission.xml b/locale/es_ES/submission.xml index a4a6e0e485f..2cf29780fe7 100644 --- a/locale/es_ES/submission.xml +++ b/locale/es_ES/submission.xml @@ -647,8 +647,6 @@ Revisión esperada ¿Eliminar envío? Ver {$title} - Incrementar posición de {$itemTitle} - Decrementar posición de {$itemTitle} Ver Envío Revisiones asignadas completadas Revisiones enviadas diff --git a/locale/eu_ES/admin.xml b/locale/eu_ES/admin.xml index b6cba3fb9f0..75f39a62be3 100644 --- a/locale/eu_ES/admin.xml +++ b/locale/eu_ES/admin.xml @@ -46,15 +46,9 @@ Zerbitzariari buruzko informazioa PHP bertsioa SE plataforma - Guneari buruz + Guneari buruz Kontaktu nagusiaren helb. el. Kontaktu nagusiaren izena - Kontaktu nagusiaren helbide elektronikoa eman behar da. - Kontaktu nagusiaren izena eman behar da. - Gutxienez 4 karaktereko pasahitza idatzi behar duzu. - Titulu bat eman behar da. - Gunearen logoa - Logoaren irudi-formatua ez da baliozkoa: .gif, .jpg, edo .png formatuak bakarrik onartzen dira. Aurkezpenaa Pasahitzaren gutxieneko luzera karaktere diff --git a/locale/eu_ES/common.xml b/locale/eu_ES/common.xml index 0c1e5198882..9b85ae8c95f 100644 --- a/locale/eu_ES/common.xml +++ b/locale/eu_ES/common.xml @@ -42,7 +42,6 @@ A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z Esleituta Ordezko testua - Idatzi irudi honen ordezko testua, testu soileko arakatzailea edo gailu lagungarriak dituztenentzat. - Aplikatu ekintza Esleitu @@ -121,7 +120,6 @@ Jatorrizko izena edo Bestelakoak - Orri-buruko logoa Plugina Argitaratzailea Grabatu @@ -151,7 +149,6 @@ Hasi gabe Izengabea Eguneratuta - Kargatutako fitxategia Kargatu Gora URLa @@ -332,8 +329,6 @@ Itxi saioa Elementu Irakurri gabea - {$supportName}.]]> - Ez da fitxategirik kargagu edo fitxategi mota baliogabea da. Pluginak Mesedez, idatzi mezuaren gaia Mesedez, idatzi mezuaren testua diff --git a/locale/eu_ES/installer.xml b/locale/eu_ES/installer.xml index ca691ada53d..aca85150354 100644 --- a/locale/eu_ES/installer.xml +++ b/locale/eu_ES/installer.xml @@ -61,7 +61,6 @@ OAI gordailu-identifikatzailea Fitxategi publikoen direktorioa ez dago edo ez da idazgarria. Bertsio-oharrak - Segurtasun-ezarpenak {$file} txantiloia analizatzean.]]> Markatutako lokalak osatu gabe egon daitezke. OAI ezarpenak diff --git a/locale/eu_ES/manager.xml b/locale/eu_ES/manager.xml index 5213199eccc..2750dd81a18 100644 --- a/locale/eu_ES/manager.xml +++ b/locale/eu_ES/manager.xml @@ -138,10 +138,8 @@ Sistemaren pluginak Irakurtzeko tresnak Funtzioak - Hasierako orriaren goiburuko logoaren irudi-formatua ez da baliozkoa: .gif, .jpg, edo .png formatuak bakarrik onartzen dira. Hasierako orriaren goiburuko irudi-formatua ez da baliozkoa: .gif, .jpg, edo .png formatuak bakarrik onartzen dira. Hasierako orriaren goiburuko tituluaren irudi-formatua ez da baliozkoa: .gif, .jpg, edo .png formatuak bakarrik onartzen dira. - Hautatu gabe Log-erregistroa eta kontrola Orri-buruko logoaren irudi-formatua ez da baliozkoa: .gif, .jpg, edo .png formatuak bakarrik onartzen dira. Hautatu bat @@ -180,7 +178,6 @@ Erabili beheko inprimakia bilatu nahi dituzun hitzentzako gehienezko balioak ezartzeko. Inprimakiak eremu horietako batez besteko kalkulatuak ditu. Metadatuen pluginak Metadatuen pluginek metadatu estandar gehigarriak inplementatzen dituzte, - Alboko barraren kudeaketa OAI Metadatuen Formatuen Pluginak Formatuen plugin horiek metadatuak adierazten dituzte OAI komunikazioetan. Webgunea diff --git a/locale/eu_ES/reader.xml b/locale/eu_ES/reader.xml index 664bd0b6f72..fb6c6605063 100644 --- a/locale/eu_ES/reader.xml +++ b/locale/eu_ES/reader.xml @@ -34,145 +34,5 @@ Titulua Ikusi iruzkin guztiak Testu osoa: - Gehitu iruzkina - Konfigurazioa - Ziur zaude testuinguru hau eta asoziatuta dituen Bilaketak ezabatu nahi dituzula? - Sortu testuingurua - Editatu testuingurua - Metadatuak - Erabili egile-izena bilaketa-termino gisa, erabiltzaileek egilearen beste lan batzuk bilatu ahal izan ditzaten (adib., "Beste lan batzuk" testuingurua) - Erabili egile-izena bilaketa-termino lehenetsi gisa eta deskribatu testuingurua artikuluaren aipamenen bilaketa gisa. - Irakurtzeko tresnen ezarpenetan gaitu daiteke, hitz batean klik egindakoan testuingurua irekitzeko.]]> - Erabili datu geografiko indexatuak bilaketa-termino lehenetsi gisa. - Aukerak - Kudeaketa - Irakurtzeko tresnak - Ziur zaude bilaketa hau ezabatu nahi duzula? - Sortu bilaketa - Editatu bilaketa - Erlazionatutako lanak - Laburpena (lanaren laburpena edo abstract-a aurkezten du). - Egileari buruz (egileak sartutako azalpen biografikoak erakusten ditu). - Nola aipatu lanak (lanen bibliografia ematen du). - Kontsultatu terminoak (lan bateko hitz batean klik egin eta hitz hori hiztegi batean bilatzeko aukera ematen die irakurleei). - Desgaitu erlazionatutako lanak - Bidali mezua egileari (egilearen helbide elektronikoa jarrita daukan mezu-txantiloi batera eramaten du). - Jakinarazi lankide bati (estekatutako mezu-txantiloi batera eramaten du). - Bilatu erreferentziak - Fitxategi osagarriak (egileak lanarekin batera bidali dituen fitxategien zerrenda erakusten du). - Metadatuak (egileak eta sistemak lana indexatzeko emandako metadatuak erakusten ditu). - Egoera - Balidazioa bukatu da. - ADOS - {$url} ez da baliozkoa. - Balidatu Irakurtzeko tresnen URLak - Balidatu - Ziur zaude bertsio hau eta asoziatuta dituen Testuinguruak eta Bilaketak ezabatu nahi dituzula? - Ziur zaude bertsio guztiak balio lehenetsietara itzuli nahi dituzula? Horrela bada, Bertsio aktibo bat aukeratu beharko duzu Ezarpenen orrian. - Sortu bertsioa - Editatu bertsioa - Esportatu - Inportatu bertsioa - Metadatuak - Berrezarri bertsioen balio lehenetsiak - Egileari buruz - Aipamenen formatua - Nola aipatu lanak - Linean - Jakinarazi lankide bati - Laburd. - ETA - Artikulua Google Scholar-en indexatuta badago, "Xk aipatua" (Cited by X) esteka bat izan dezake, artikulua aipatzen duten lan guztietara joateko. Gainera, titulua eta egilea aipatzen duten lan guztien zerrenda emango du Google Scholar-ek. Zure bilaketa-liburutegitik bakarrik atzi daitezkeen lineako baliabideak badira, Google Scholar-eko Scholar Preferences-era joan eta zure erakunderako liburutegi-estekak aktibatzeko aukera izango duzu normalean. - Testuingurua - Artikulua HTML fitxategia bada (ez PDFa), testuko edozein hitzetan klik eginda hitzaren definizioa bilatzeko koadroa agertuko da. Bestela, hitzak koadroan idatzi edo itsatsi daitezke. Baliabideari buruzko informazio gehiago ikusteko, sakatu GURI BURUZ. Garrantziren arabera eta eduki osoa edo zati bat atzitzeko sarrera librearen (doakoaren) arabera hautatu dira baliabideak. - Azalpena - Ordena - Testuinguruak - Egileak hautatu ditu bilaketa-terminoak. Irakurleak aldatu edo ezabatu ditzake. Bi edo hiru termino edo esaldi labur izaten dira bilaketa boolear (ETA) onenak ematen dituztenak. Baliabideak bilatzeko informazio gehiago ikusteko, sakatu GURI BURUZ. Garrantziren arabera eta eduki osoa edo zati bat atzitzeko sarrera librearen (doakoaren) arabera hautatu dira baliabideak. - Bilaketa-terminoak - Definitzeko hitza - Titulua - Bidali mezua egileari - Erregistratzea eskatzen du]]> - Mezua bidali da. - Bilatu erreferentziak - Google Scholar - Windows Live Academic - Kontsultatu terminoak - Ekarpengilea - Estaldura - Data - Azalpena - Dublin Core - Formatua - Identifikatzailea - Hizkuntza - Argitaratzailea - Erlazioa - Eskubideak - Iturburua - Gaia - Titulua - Mota - Dokumentu honen metadatuak - Laburpena - Copyright eta baimenak - Kokapen geo-espaziala, garai kronologikoa, ikerketaren ezaugarriak (generoa, adina, etab.) - (UUUU-HH-EE) - Diziplina(k) - Fitxategi-formatua - Egoera eta generoa - PKP metadatuak - English=en - Agentzia antolatzailea, kokalekua - Aldizkari/konferentzia titulua; bol., zk. (urtea) - Babeslea(k) - Gako-hitza(k) - Fitxat. osag. - Dokumentuaren titulua - Mota - Universal Resource Indicator (URI) - Inprimatzeko bertsioa - Irakurtzeko tresnak - Erlazionatutako lanak - Ebaluazio-politika - Azalpena - Bilaketak - Ordenatu - Bilatu - Bidaltzeko datuak - Bilaketako URLa - Proposatu iturburu bat - Titulua - URLa - Deskargatu - Fitxategi osagarriak - Indexatzeko metadatuak - Azalpena - Gakoa - Localea - Erlazionatutako lanen multzoak - Titulua - Bertsioa - Indexatzeko metadatuak - Inprimatzeko bertsioa (lana inprimatzeko moduko bertsioan ematen du). Iruzkinaren titulua behar da. - Konpartitzea - Konpartitzea gaituta - addthis.com erabiliz, eta kopiatu/itsatsi beheko partekatze botoiaren kodea.]]> - Oinarrizko ezarpenak - AddThis.com erabiltzaile-izena - Botoi-estiloa - Erabili goitibeherako menua - Ezarpen aurreratuak (aukerakoa) - AddThis.com customization documentation erreferentzia gisa.]]> - Marka - (komaz bereizitako zerrenda)]]> - Hizkuntza - Logotipoa - Logotipoaren atzeko planoa - Logotipoaren kolorea - Konfiguratu AddThis - Web - Ikus berrikuspen politika diff --git a/locale/fa_IR/admin.xml b/locale/fa_IR/admin.xml index d4593df27cc..2ef62d88362 100644 --- a/locale/fa_IR/admin.xml +++ b/locale/fa_IR/admin.xml @@ -1,4 +1,4 @@ - + هنگام حذف این مورد خطایی رخ داد - نماد سایت (FAVICON) + Favicon هنگام حذف این فیلتر خطایی رخ داد. لطفاً این را به عنوان یک باگ گزارش کنید اتصال گر اطلاعات ثبت‌نام و تنظیمات اتصال گر @@ -244,17 +243,14 @@ سرویس‌های استخراج ارجاعات لطفاً انتخاب کنید ... دسته‌بندی نوع فایل - فرمت تصویر لوگوی سرتیتر صفحه خانگی نامعتبر است. فرمت‌های پشتیبانی شده عبارت است از: gif، png، jpg تصویر صفحه‌ی اصلی - آپلود یک تصویر برای نمایش دادن در صفحه‌ی اصلی + آپلود یک تصویر برای نمایش دادن در صفحه‌ی اصلی فرمت تصویر صفحه خانگی نامناسب است. فرمت‌های پشتیبانی شده عبارت است از: gif، png، jpg فرمت تصویر عنوان سرتیتر صفحه خانگی نامعتبر است. فرمت‌های پشتیبانی شده عبارت است از: gif، png، jpg توضیحات - پوسته سایت - ممکن است پوسته جدیدی از طریق بخش افزونه‌ها نصب شده باشد. - مدیریت نوار حاشیه + پوسته سایت + ممکن است پوسته جدیدی از طریق بخش افزونه‌ها نصب شده باشد. نوار حاشیه - انتخاب نشده ورود و حسابرسی لوگو اطلاع‌رسانی ارسال مقاله توسط نویسنده @@ -264,7 +260,7 @@ اگر به صورت آنی به محتویات انتشار یافته دسترسی آزاد می‌دهید. بهتر است در مورد سیاست‌های دسترسی آزاد خود توضیحی وارد کنید. فرمت لوگوی سرتیتر صفحات نامعتبر است. فرمت‌های قابل قبول عبارت است از: gif، png و jpg پاورقی - هر تصویر ، متن یا کد HTML که مایل هستید در قسمت پاوری قرار گیرد وارد نمایید + هر تصویر ، متن یا کد HTML که مایل هستید در قسمت پاوری قرار گیرد وارد نمایید کلیات سیاست داوری خود را برای خوانندگان و نویسندگان وارد کنید. این توضیح معمولاً شامل تعداد داورهای بررسی کننده هر مقاله، روش انتخاب آن‌ها و مدت زمان داوری است. تماس با مدیر اطلاعات تماس دبیران، ویراستاران یا عوامل اجرایی که به صورت عمومی در وب‌سایت در دسترس خواهد بود @@ -273,10 +269,9 @@ متوسط مهلت داوری هرگز یادآوری نکن مقادیر پیش‌فرض به ازای هر داوری می‌تواند ویرایش شود. - ارسال یادآوری برای داور در صورت عدم پاسخ به درخواست داوری در مهلت معین شده پس از (به ‌روز): - ارسال یادآوری برای داور در صورت عدم ارسال نتیجه داوری در مهلت معین شده پس از (به‌ روز): + ارسال یادآوری برای داور در صورت عدم پاسخ به درخواست داوری در مهلت معین شده پس از (به ‌روز): + ارسال یادآوری برای داور در صورت عدم ارسال نتیجه داوری در مهلت معین شده پس از (به‌ روز): مهلت پیش‌فرض انجام داوری - فراهم آوردن لینکی برای اطمینان از «محرمانگی داوری» در زمان آپلود قابل مرتب‌سازی بر اساس اجزاء سیاست‌های حمایت مالی و معنوی برای مثال: انجمن‌های علمی، دانشکده‌ها، تعاونی‌ها، و غیره. حامیان به طور عمومی نمایش داده می‌شوند. @@ -385,7 +380,6 @@ روش پرداختی انتخاب نشده است روش پرداخت واحد پول - پرداخت مستقیم با انتخاب واحد پول گزینه های نقش نمایش عنوان نقش را در فهرست مشارکت کننده diff --git a/locale/fa_IR/reader.xml b/locale/fa_IR/reader.xml index 095c8bdbd84..5a46b4a43bb 100644 --- a/locale/fa_IR/reader.xml +++ b/locale/fa_IR/reader.xml @@ -32,144 +32,4 @@ عنوان دیدن تمام نظرات تمام متن: - افزودن نظر - تنظیمات - آیا می‌خواهید این زمینه و تمام موارد همراه را حذف کنید؟ - ایجاد زمینه - ویرایش زمینه - فراداده - نام نویسندگان به عنوان کلمات مورد جستجوی پیش‌فرض بکار رود تا کاربران بتوانند دیگر کارهای نویسندگان مقاله مورد نظر را ببینند.) که همان "کارهای دیگر" میباشد). - نام نویسندگان به عنوان کلمات مورد جستجوی پیش‌فرض بکار رود و زمینه به معنای جستجوی موارد ارجاع به مقاله مورد نظر باشد. - تنظیمات RST فعال شود. در این صورت با کلیک دوبل بر روی کلمات پنجره تعریف کلمات باز میشود.]]> - داده های جغرافیائی نمایه شده به عنوان کلمات پیش‌فرض جستجو بکار رود. - گزینه‌ها - مدیریت - به اشتراک گذاری - فعال‌سازی به اشتراک گذاری - addthis.com و بگیرید . کد دکمه شراکت را در زیر کپی کنید.]]> - تنظیمات پایه - نام کاربری AddThis.com - استایل دکمه - استفاده از منوی کشوئی پائین کشیدنی - تنظیمات پیشرفته (اختیاری) - دستورالعمل های سایت AddThis.com .]]> - برند تجاری - (به صورت لیستی از کلمات جدا شده با کوما)]]> - زبان - لوگو - پس زمینه لوگو - رنگ لوگو - ابزارهای خواندن - آیا میخواهید این جستجو را حذف کنید؟ - ایجاد جستجو - ویرایش جستجو - موارد مربوطه - چکیده (چکیده مقاله را نشان میدهد.) - مشاهده سیاست‌های داوری - درباره نویسنده. (نمایش رزومه علمی نویسنده) - نحوه ارجاع به مقاله.(فراهم سازی جزئیات کتابشناختی مقاله) - تعریف واژه ها (خ.انندگان میتوانند با کلیک دوبل بر روی لغتها تعریف آن‌ها را در لغت نامه های آنلاین ببینند.) - غیرفعال ساختن موارد مربوطه - ارسال ایمیل برای نویسنده (صفحه ارسال ایمیل باز میشود و ادرس نویسنده و موضوع ایمیل به صورت خودکار وارد میشود.) - اطلاع به همکار (ایمیل باز میشود و متنی نشان داده میشود همراه با لینک مقاله) - یافتن مراجع - کلیشه چاپی. یک نسخه مناسب چاپ را نشان میدهد. - فایل های مکمل (لیست فایل های مکمل ارائه شده توسط نویسنده هنگام ارسال مقاله) - فراداده های نمایه (لیست فراداده های نمایه ارائه شده توسط نویسنده هنگام ارسال مقاله یا توسط سیستم) - وضعیت - پیکربندی AddThis - اعتبارسنجی کامل شد. - تایید - {$url} معتبر نیست. - اعتبارسنجی URLs برای ابزار های خواندن - اعتبارسنجی - آیا میخواهید این نسخه را همراه با تمام موارد وابسته به آن حذف کنید؟ - آیا میخواهید تمام نسخه ها را به حالت پیش‌فرض بر گردانید؟ در این صورت باید یک نسخه فعال را در صفحه تنظیمات انتخاب کنید. - ایجاد نسخه - ویرایش نسخه - برون دهی - درون‌ریزی نسخه - فراداده - برگرداندن نسخه ها به حالت پیش‌فرض - درباره نویسنده - سبک مرجع نویسی - چگونه به مقاله ارجاع بدهیم - آنلاین - وب - اطلاع به همکار - علامت اختصاری - و - اگر مقاله در Google Scholar نمایه باشد ممکن است همراه آن یک لینک «Cited by X» باشد که لیست مقالاتی که به آن مقاله ارجاع داده اند را نشان میدهد. برای دستیابی به منابع آنلاین که فقط از طریق کتابخانه پژوهشی شما در دسترس است ممکن است بتوانید به Scholar Preferences در Google Scholar رفته و لینک کتابخانه موسسه خودتان را فعال کنید. - زمینه - چنانچه مقاله مورد نظر یک فایل HTML باشد کلیک دوبل بر روی هر لغت در متن، موجب باز شدن پنجره تعریف لغات با انتخاب لغت مزبور برای جستجو میشود.در غیر این صورت میتوان کلمات مورد نظر را در جعبه جستجو تایپ کرد. برای اطلاع بیشتر در مورد منابع مورد جستجو بر روی «درباره» کلیک کنید. این منابع به خاطر مرتبط بودن آن‌ها و دسترسی آزاد به آن‌ها انتخاب شده اند. - توصیف - ترتیب - زمینه ها - کلمات جستجو توسط نویسنده انتخاب شده است. خواننده میتواند آن‌ها را به دلخواه تغییر دهد یا حذف کند. برای اطلاع بیشتر در مورد منابع مورد جستجو بر روی «درباره» را کلیک کنید. این منابع به خاطر مرتبط بودن آن‌ها و دسترسی آزاد به آن‌ها انتخاب شده اند. - واژه های جستجو - کلمه ای که باید تعریف شود - عنوان - ایمیل به نویسنده - ثبت‌نام لازم است.]]> - پیغام شما ارسال شد - یافتن مراجع - گو گل اسکولار - ویندوز آکادمیک - تعریف لغات - مولف - پوشش - تاریخ - توصیف - هسته دوبلین - فرمت - شناسه - زبان - ناشر - ارتباط - حقوق - منبع - موضوع - عنوان - نوع - فراداده این سند - چکیده - حق نشر و مجوزها - موقعیت جغرافیائی ، دوره زمانی ، نمونه پژوهش از نظر عواملی مثل جنسیت وسن و غیره. - (YYYY-MM-DD) - رشته تخصصی - فرمت فایل - - اقلام فراداده PKP - فارسی=fa - آزانس های سازمان دهنده، موقعیت - عنوان مجله یا کنفرانس، دوره، شماره، سال - حمایت کننده(گان) - کلید واژه(ها) - فایل های مکمل - عنوان سند - نوع - شناسه منبع جهانی - کلیشه چاپی - ابزارهای خواندن - موارد مربوطه - سیاست داوری - توصیف - جستجوها - ترتیب - جستجو - ارسال داده - URL جستجو - پیشنهاد یک منبع - عنوان - URL - دانلود - فایل های مکمل - نمایه‌سازی فراداده - توصیف - کلید - زبان - مجموعه موارد مشابه - عنوان - نسخه - مشاهده فراداده diff --git a/locale/fa_IR/submission.xml b/locale/fa_IR/submission.xml index 47c16c94693..80248d8351e 100644 --- a/locale/fa_IR/submission.xml +++ b/locale/fa_IR/submission.xml @@ -635,8 +635,6 @@ مهلت داوری حذف مقاله ارسالی؟ مشاهده مقالات ارسالی - افزایش موقعیت {$itemTitle} - کاهش موقعیت {$itemTitle} مشاهده مقالات ارسالی داوری انساب داده شده تکمیل شد. اصلاحات ارسال شد. diff --git a/locale/fi_FI/admin.xml b/locale/fi_FI/admin.xml index ce56b9fb0dc..8e5b49b7db6 100644 --- a/locale/fi_FI/admin.xml +++ b/locale/fi_FI/admin.xml @@ -64,18 +64,12 @@ PHP-versio Käyttöjärjestelmäalusta Asetukset - Tietoa sivustosta + Tietoa sivustosta Pääasiallisen yhteyshenkilön sähköposti Pääasiallinen yhteyshenkilön nimi - Pääasiallisen yhteyshenkilön sähköpostiosoite vaaditaan. - Pääasiallisen yhteyshenkilön nimi vaaditaan. - Anna salasanan vähimmäispituus (väh. 4 merkkiä). - Otsikko vaaditaan. Asennuksesi on määritetty tallentamaan useita käytön mittareita. Käyttötilastot näytetään useassa yhteydessä. Joissain tapauksissa on käytettävä yksittäistä käyttötilastoa, esim. silloin, kun näytetään käytetyimpien käsikirjoitusten järjestetty lista tai asetettaessa hakutuloksia paremmuusjärjestykseen. Valitse yksi määritetyistä mittareista oletukseksi. - Sivuston logo - Virheellinen sivuston logon kuvamuoto. Hyväksytyt muodot ovat .gif, .jpg ja .png. Esittely Salasanan vähimmäispituus (merkkiä) Sivuston kieli @@ -122,4 +116,4 @@ Virhe: ei voi suorittaa "{$utilPath}". Tarkista {$utilVar}-asetuksesi config.inc.php -tiedostosta. Kielialueita ei ole ladattavissa. Haluatko varmasti pysyvästi poistaa {$contextName} ja kaikki siihen liittyvät sisällöt? - \ No newline at end of file + diff --git a/locale/fi_FI/api.xml b/locale/fi_FI/api.xml index c2ff16462a3..1f98d774f62 100644 --- a/locale/fi_FI/api.xml +++ b/locale/fi_FI/api.xml @@ -16,7 +16,7 @@ Voit tarkastella ainoastaan sellaisia julkaisemattomia käsikirjoituksia, jotka on osoitettu sinulle. Et voi poistaa käsikirjoitusta, joka ei liity tähän julkaisuun. Sinulla ei ole lupaa poistaa tätä käsikirjoitusta. - Pyydettyä resurssia ei löytynyt. + Pyydettyä resurssia ei löytynyt. Pyyntöäsi ei voitu suorittaa, koska siitä puuttuu pakollisia tietoja. Tapahtui virhe. Ole hyvä yritä uudelleen. Pyyntöäsi ei voitu suorittaa, koska annettu työvaiheen tunniste on virheellinen. diff --git a/locale/fi_FI/common.xml b/locale/fi_FI/common.xml index a702496146f..46e8949be18 100644 --- a/locale/fi_FI/common.xml +++ b/locale/fi_FI/common.xml @@ -56,7 +56,6 @@ of a the and an or nor but is if then else when at from by on off for in out over to into with Valittu Vaihtoehtoinen teksti - Parantaaksesi hakukoneoptimointia sekä noudattaaksesi WCAG-standardeja kuvaile kaikkia tässä kuvassa näkyviä tietoja, joita ei nähdä sivustoa tekstipohjaisella selaimella tai apuvälineillä katseltaessa. Esimerkki: “Toimittajamme puhumassa PKP:n vuoden 2015 konferenssissa.” ja Toteuta toimenpide Osoita @@ -153,7 +152,6 @@ Aloita Käynnissä Kohteita per sivu - Favicon Avainsanat Kieli Kielet @@ -183,12 +181,13 @@ OK Valinnat Järjestä + Siirrä {$itemTitle} alas + Siirrä {$itemTitle} ylös Alkuperäinen tiedostonimi tai Muu Myöhässä Sivu {$pageNumber} - Sivun ylätunnisteen logo {$percentage} % Lisäosa "{$pluginName}"-lisäosa on otettu käyttöön. @@ -246,11 +245,8 @@ Nimetön Päivitetty Ladattu (pvm) - Ladattu tiedosto Lataa Tiedostoa ei voitu ladata tai korjata. - Tiedostoa ei ladattu tai virheellinen tiedostotyyppi! - Etusivun kuva Ylös Lataa tiedosto Vaihda tiedostoa @@ -317,7 +313,6 @@ on alkaa Lomaketta ei lähetetty oikein. - Lomaketta ei lähetetty oikein. Tiedoston lataaminen vaaditaan. (*Pakollinen tieto) Lähetä uudelleen diff --git a/locale/fi_FI/manager.xml b/locale/fi_FI/manager.xml index 970656e4142..02b3d0fb364 100644 --- a/locale/fi_FI/manager.xml +++ b/locale/fi_FI/manager.xml @@ -210,26 +210,22 @@ Rajaa tuloksia maan, alueen ja/tai kaupungin mukaan. Tukija Lisäsisältö - Kaikki tähän syötetty tieto näkyy etusivullasi. - Tekijänoikeushuomautus - Vaadi kirjoittajia hyväksymään tekijänoikeushuomautus osana käsikirjoituksen lähetysprosessia. + Kaikki tähän syötetty tieto näkyy etusivullasi. + Tekijänoikeushuomautus + Vaadi kirjoittajia hyväksymään tekijänoikeushuomautus osana käsikirjoituksen lähetysprosessia. Kirjoittajan ohjeet Suositellut ohjeet sisältävät bibliografisten ja muotoilustandardien lisäksi esimerkkejä tavallisista, käsikirjoituksissa käytettävistä viittausmuodoista. Sidonnaisuudet - Arvioijia pyydetään noudattamaan alla määrittämääsi tiedonantopolitiikkaa sidonnaisuuksien ilmoittamisen suhteen. Tätä kohdetta poistaessa tapahtui virhe. - Virheellinen favicon-muoto. Hyväksytyt muodot ovat .ico, .png ja .gif. + Favicon Tiedostotyyppien ryhmittely - Etusivun ylätunnisteen logon kuvamuoto on virheellinen tai lataus epäonnistui. Hyväksytyt muodot ovat .gif, .jpg ja .png. Etusivun kuva - Lataa kuva, joka näytetään näkyvästi etusivulla. + Lataa kuva, joka näytetään näkyvästi etusivulla. Etusivun kuvan muoto on virheellinen tai lataus epäonnistui. Hyväksytyt muodot ovat .gif, .jpg ja .png. Etusivun ylätunnisteen otsikkokuvan muoto on virheellinen tai lataus epäonnistui. Hyväksytyt muodot ovat .gif, .jpg ja .png. Kuvaukset - Teema - Uusia teemoja voidaan asentaa sivun yläreunasta löytyvältä Lisäosat-välilehdeltä. - Sivupalkin hallinnointi - Ei valittu + Teema + Uusia teemoja voidaan asentaa sivun yläreunasta löytyvältä Lisäosat-välilehdeltä. Kirjaaminen ja tarkastus Logo Ilmoitus kirjoittajan tekemästä käsikirjoituksen lähetyksestä @@ -239,7 +235,7 @@ Jos kaikki julkaistu sisältö on välittömästi vapaasti saatavilla, voit kirjoittaa kuvauksen soveltamastasi avoimen saatavuuden periaatteesta. Sivun ylätunnisteen logon kuvamuoto on virheellinen tai lataus epäonnistui. Hyväksytyt muodot ovat .gif, .jpg ja .png. Sivun alatunniste - Anna kuvia, tekstiä tai HTML-koodi, joiden haluat näkyvän sivustosi alareunassa. + Anna kuvia, tekstiä tai HTML-koodi, joiden haluat näkyvän sivustosi alareunassa. Esitä vertaisarvioinnin periaatteiden ja prosessien pääpiirteet lukijoille ja kirjoittajille. Tämä kuvaus voi sisältää tyypillisen arvioijien määrän käsikirjoitusta kohti, sovellettavat arviointikriteerit, arviointiin oletettavasti kuluvan ajan ja arvioijien valintaa koskevat periaatteet. Pääasiallinen yhteyshenkilö Anna yhteystiedot (yleensä pääasiallisen päätoimittajan, toimituspäällikön tai hallinnollisen työntekijän), jotka näytetään julkisella verkkosivustollasi. @@ -248,10 +244,9 @@ Arvioinnin suorittamiseen annettava aika (vk) Älä muistuta koskaan Jokaisen arvioinnin oletusarvoja voidaan muokata toimitusprosessin aikana. - Lähetä muistutus, jos arvioija ei ole vastannut arviointipyyntöön seuraavan ajan (pv) kuluttua vastauksen määräpäivästä: - Lähetä muistutus jos arvioija ei ole lähettänyt suositusta seuraavan ajan (pv) kuluttua arvioinnin määräpäivästä: + Lähetä muistutus, jos arvioija ei ole vastannut arviointipyyntöön seuraavan ajan (pv) kuluttua vastauksen määräpäivästä: + Lähetä muistutus jos arvioija ei ole lähettänyt suositusta seuraavan ajan (pv) kuluttua arvioinnin määräpäivästä: Arvioinnin oletusmääräajat - Näytä linkki “Sokkoarvioinnin varmistaminen” -kohtaan lataamisen yhteydessä Tukijasuhteiden ja -periaatteiden kuvaus Esimerkkejä: tieteelliset yhdistykset, yliopistojen laitokset, osuuskunnat jne. Tukijat näytetään julkisesti. Kokeneet www-kehittäjät voivat ladata CSS-tiedoston mukauttaakseen sivuston ulkoasua pidemmälle. @@ -356,7 +351,6 @@ Maksutapaa ei ole valittu Maksutapa Valuutta - Suoraan tämän sivuston kautta tehdyt maksut ilmoitetaan valitussa valuutassa. Rooleihin liittyvät valinnat @@ -513,8 +507,6 @@ Linkki kirjautumissivulle. Linkki rekisteröitymissivulle. Tällä roolilla voi tehdä vain toimituksellisia suosituksia. Suosituksen vahvistamiseen vaaditaan varsinainen toimittaja. - Sivustokartta - {$path}]]> Jos "Julkinen saatavuus" on valittuna, tiedosto on ladattavissa osoitteesta:
{$downloadUrl}

]]>
Valitse liitettävät tiedostot Avain diff --git a/locale/fi_FI/reader.xml b/locale/fi_FI/reader.xml index f0bf14fb007..8726c25f52d 100644 --- a/locale/fi_FI/reader.xml +++ b/locale/fi_FI/reader.xml @@ -10,7 +10,7 @@ * * Localization strings. --> - + Anonyymi käyttäjä "{$userName}" @@ -34,147 +34,4 @@ Otsikko Näytä kaikki kommentit Kokoteksti: - Lisää kommentti - Määritys - Haluatko varmasti poistaa tämän kontekstin ja kaikki siihen liittyvät haut? - Luo konteksti - Muokkaa kontekstia - Metatiedot - Käytä kirjoittajien nimiä oletushakusanoina, jotta käyttäjät voivat löytää muita tämän kohteen kirjoittajien töitä (esim. "Tekijän muita julkaisuja" -kohdassa). - Käytä kirjoittajien nimiä oletushakusanoina ja kuvaile kontekstia artikkeliin tehtyjen viittausten hakuna. - RST-asetukset -kohdassa, jotta sanoja kaksoisklikkaamalla voidaan avata tämä konteksti.]]> - Käytä maantieteellisiä indeksointitietoja oletushakusanoina. - Valinnat - Hallinnointi - - Jakaminen - Jakaminen otettu käyttöön - addthis.com saadaksesi tilin, ja kopioi/liitä jakamispainikkeen koodi alle.]]> - - Perusasetukset - AddThis.com -käyttäjätunnus - Painikkeen tyyli - Käytä pudotusvalikkoa - Lisäasetukset (valinnainen) - AddThis.comin mukautusohjeista.]]> - Tuotemerkki - (pilkuin eroteltu luettelo)]]> - Kieli - Logo - Logon tausta - Logon väri - - Lukutyökalut - Haluatko varmasti poistaa tämän haun? - Luo haku - Muokkaa hakua - Samankaltaiset sisällöt - Abstrakti (näyttää kohteen abstraktin). - Näytä arviointiperiaatteet - Tietoa kirjoittajasta (näyttää kirjoittajan itsestään antamat tiedot). - Kohteeseen viittaaminen (antaa kohteelle bibliografiset tiedot). - Etsi termejä (sallii lukijoiden kaksoisklikata mitä tahansa kohteen sanaa ja lähettää sanan sanakirjaan). - Poista “samankaltaiset sisällöt” käytöstä - Lähetä kirjoittajalle sähköpostia (vie sähköpostipohjaan, jossa on kirjoittajan sähköpostiosoite valmiina). - Ilmoita kollegalle (vie sähköpostipohjaan, jossa on valmiina linkki kohteeseen). - Etsi lähdeviitteitä - Tulostettava versio (kohteen tulostettavaksi sopiva versio). - Liitetiedostot (näyttää listan kirjoittajan käsikirjoitukseen liittämistä tiedostoista). - Indeksoinnin metatiedot (näyttää kirjoittajan ja järjestelmän kohteelle antamat indeksoinnin metatiedot). - Tila - Määritä AddThis - Vahvistus suoritettu. - OK - {$url} ei ole kelvollinen. - Vahvista lukutyökalujen URL-osoitteet - Vahvista - Haluatko varmasti poistaa tämän version ja kaikki siihen liittyvät kontekstit ja haut? - Haluatko varmasti palauttaa peruuttamattomasti kaikki versiot oletusarvoisiksi? Siinä tapauksessa sinun on valittava aktiivinen versio Asetukset-sivulta. - Luo versio - Muokkaa versiota - Vie - Tuo versio - Metatiedot - Palauta versiot oletusarvoisiksi - Tietoa kirjoittajasta - Viittausmuoto - Kohteeseen viittaaminen - Online - Verkko - Ilmoita kollegalle - Lyhenne - AND - Jos artikkeli on indeksoitu Google Scholarissa, sen yhteydessä saattaa olla "Viittausten määrä X"-linkki, joka johtaa artikkeliin viitanneiden töiden luetteloon. Lisäksi Google Scholar listaa kaikki kohteet, joissa mainitaan kyseinen artikkeli ja sen kirjoittaja. Päästäksesi sellaisiin online-nimikkeisiin, jotka ovat saatavilla vain oman tiedekirjastosi kautta, aktivoi ao. kirjastolinkit Google Scholarin asetuksissa. - Konteksti - Jos kohde on HTML-tiedosto (ei PDF), kaksoisklikkaamalla mitä tahansa sanaa tekstissä, saat sanan Määriteltävä sana -kenttään. Muussa tapauksessa sanat voidaan kirjoittaa tai liittää ruutuun. Saadaksesi lisätietoja haetusta resurssista klikkaa TIETOA-kohtaa. Nämä resurssit on valittu asiaankuuluvuutensa takia sekä siksi, että niiden sisältö on kokonaan tai osittain vapaasti (ilmaiseksi) saatavilla. - Kuvaus - Järjestys - Kontekstit - Hakusanat on valittu kirjoittajien toimesta. Lukija voi muuttaa tai poistaa niitä, sillä kaksi tai kolme lyhyttä ja tarkkaa termiä tai lauseketta tuottavat parhaan haun Boolen AND-operaattorilla. Saadaksesi lisätietoja haetuista resursseista klikkaa TIETOA-kohtaa. Nämä resurssit on valittu asiaankuuluvuutensa takia sekä siksi, että niiden sisältö on kokonaan tai osittain vapaasti (ilmaiseksi) saatavilla. - Hakusanat - Määriteltävä sana - Otsikko - Lähetä kirjoittajalle sähköpostia - rekisteröitymisen]]> - Viestisi on lähetetty. - Lähdeviitteiden etsiminen - Google Scholar - Windows Live Academic - Etsi termejä - Muu tekijä - Kattavuus - Päivämäärä - Kuvaus - Dublin Core - Formaatti - Identifiointitunnus - Kieli - Julkaisija - Suhde - Oikeudet - Lähde - Aihe - Otsikko - Laji - Tämän asiakirjan metatiedot - Abstrakti - Tekijänoikeudet ja luvat - Geospatiaalinen sijainti, kronologinen kausi, tutkimusotos (sukupuoli, ikä jne.) - (VVVV-KK-PP) - Tieteenala(t) - Tiedostomuoto - - PKP:n metatietojen kohdat - suomi=fi - Organisoiva taho, sijainti - Otsikko; vol, nro (vuosi) - Tukija(t) - Avainsana(t) - Liitetied. Tiedostot - Asiakirjan otsikko - Laji - URI-tunniste (Uniform Resource Identifier) - Tulostettava versio - Lukutyökalut - Samankaltaiset sisällöt - Arviointiperiaatteet - Kuvaus - Haut - Järjestys - Hae - Lähetä tiedot - Hae URL-osoitetta - Ehdota lähdettä - Otsikko - URL-osoite - Lataa - Liitetiedostot - Indeksoinnin metatiedot - Kuvaus - Avain - Kielialue - Samankaltaisten sisältöjen joukot - Otsikko - Versio - Indeksoinnin metatiedot - \ No newline at end of file + diff --git a/locale/fi_FI/submission.xml b/locale/fi_FI/submission.xml index 7feb5adbc18..a7ae1395bae 100644 --- a/locale/fi_FI/submission.xml +++ b/locale/fi_FI/submission.xml @@ -562,8 +562,6 @@ Tiedostot valmistettu Avoimet keskustelut Käsikirjoituksen lähetys pitää viimeistellä ennen kuin toimittaja tarkistaa sen. - Siirrä {$itemTitle} alas - Siirrä {$itemTitle} ylös Poista käsikirjoitus? Katso käsikirjoitusta {$count} / {$total} käsikirjoitusta @@ -607,7 +605,6 @@ Anna aihe Anna tieteenala Anna avainsana - Anna kannattajajärjestö Anna kattavuustiedot Anna tyyppi Anna lähde diff --git a/locale/fr_CA/admin.xml b/locale/fr_CA/admin.xml index 13d2aabda4f..118f15a461b 100644 --- a/locale/fr_CA/admin.xml +++ b/locale/fr_CA/admin.xml @@ -53,13 +53,9 @@ Information sur le serveur Version PHP Système d'exploitation - Description "À propos du site" + Description "À propos du site" Courriel du contact principal Nom du contact principal - Le courriel de la personne-ressource principale est obligatoire. - Le nom du contact principal est obligatoire. - Vous devez entrer un mot de passe d'au moins 4 caractères. - Le titre est obligatoire. @@ -68,8 +64,6 @@ Il y a des cas où une seule statistique d'utilisation doit être utilisée, par exemple pour afficher une liste ordonnée des soumissions les plus utilisées ou pour classer Les résultats de la recherche. Sélectionnez l'une des métriques configurées par défaut. - Logo du site - Le format de l'image du logo du site est invalide. Seuls les formats .gif, .jpg ou .png sont acceptés. Introduction Longueur minimum du mot de passe Enregistrer le site pour l'indexation (collecte de métadonnées) diff --git a/locale/fr_CA/common.xml b/locale/fr_CA/common.xml index e75e4866fb0..cd45da765fd 100644 --- a/locale/fr_CA/common.xml +++ b/locale/fr_CA/common.xml @@ -45,7 +45,6 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Déjà assigné Texte alternatif - Veuillez fournir un texte alternatif pour cette image afin d'assurer l'accessibilité aux utilisateurs de navigateurs textuels ou d'appareils et accessoires fonctionnels. et Appliquer l'action Ajouter @@ -126,10 +125,11 @@ Démarré Options Classer + Avancer la position de {$itemTitle} + Reculer la position de {$itemTitle} Nom original du fichier ou Autre - Logo de l'en-tête de la page Plugiciel Éditeur Qualité @@ -160,7 +160,6 @@ Non engagé Sans titre Mis à jour - Fichier téléversé Téléverser Haut Téléverser un fichier @@ -299,7 +298,6 @@ Aucun commentaire Courriel de l'expéditeur Nom de l'expéditeur - le formulaire n'a pas été soumis de la bonne façon. commence par L'URL indiquée n'est pas valide. Veuillez vérifier et essayer de nouveau. Fichiers d'évaluation mis à jour. @@ -424,7 +422,6 @@ Contenu Calendrier Hijri Refusé - Favicon Terminer La fenêtre pour téléverser un fichier système est en cours. Si elle n'apparait pas, il est probable qu'aucun de ses temps d'exécution ne soit supporté par ce navigateur. Veuillez contacter l'administrateur pour obtenir de l'aide. Continuer @@ -453,9 +450,6 @@ Sous-titre Élément Non lu - {$supportName} pour obtenir de l'aide.]]> - Aucun fichier n'a été téléchargé ou type de fichier invalide! - Image de la page d'accueil Modules externes Métrique Décompte diff --git a/locale/fr_CA/installer.xml b/locale/fr_CA/installer.xml index 6a92f9f2496..72c9e240e9d 100644 --- a/locale/fr_CA/installer.xml +++ b/locale/fr_CA/installer.xml @@ -61,7 +61,6 @@ Identifiant du dépôt OAI Le répertoire des fichiers publics n'existe pas ou n'est pas disponible en écriture. Instructions d'utilisation - Paramètres de sécurité {$file}.]]> Les langues sélectionnées peuvent être incomplètes. Paramètres OAI diff --git a/locale/fr_CA/manager.xml b/locale/fr_CA/manager.xml index 6392fe28da9..fb80a973792 100644 --- a/locale/fr_CA/manager.xml +++ b/locale/fr_CA/manager.xml @@ -142,12 +142,8 @@ Outils de lecture Rôles Groupement par type de fichier - Format d'image du logo de l'en-tête de la page d'accueil invalide. Les formats acceptés sont .gif, .jpg, ou .png. Format d'image de la page d'accueil invalide. Les formats acceptés sont .gif, .jpg, ou .png. Format d'image de l'en-tête de la page d'accueil invalide. Les formats acceptés sont .gif, .jpg, ou .png. - Encadré de gauche - Encadré de droite - Non sélectionné Journalisation et audit Format d'image du logo de l'en-tête de la page invalide. Les formats acceptés sont .gif, .jpg, ou .png. En sélectionner un @@ -265,8 +261,8 @@ Ne jamais rappeler Organismes commanditaires Citations - Thème - Choisir un thème parmi les modules d'extension de thèmes disponibles. + Thème + Choisir un thème parmi les modules d'extension de thèmes disponibles. Options d'accès au site Apparence Un fichier image est requis. Assurez-vous d'avoir choisi et téléchargé un fichier. @@ -283,11 +279,10 @@ Vous devez choisir au moins une colonne pour produire le rapport. Limiter les résultats selon le pays, la région ou la ville. Intérêts concurrents - Les évaluateurs devront respecter la politique de divulgation des intérêts concurrents que vous spécifiez ci-dessous. Délai de réponse alloué (semaines) Délai alloué pour la révision (semaines) - Envoyer un rappel si l'évaluateur n'a pas répondu à la demande d'évaluation dans le délai suivant (jours): - Envoyer un rappel si l'évaluateur n'a pas fait sa recommandation dans le délai suivant (jours): + Envoyer un rappel si l'évaluateur n'a pas répondu à la demande d'évaluation dans le délai suivant (jours): + Envoyer un rappel si l'évaluateur n'a pas fait sa recommandation dans le délai suivant (jours): Genres dépendants Vous pouvez ajouter une note décrivant votre politique en matière de commandite; celle-ci apparaitra dans la liste des commanditaires sur votre page À propos de. Vous pouvez ajouter une note décrivant votre rapport et votre politique entre vous et vos bailleurs de fonds; celle-ci apparaitra dans la liste des bailleurs de fonds sur votre page À propos de. @@ -301,7 +296,6 @@ Il arrive parfois qu'une seule statistique d'utilisation doit être utilisée, p Un ou plusieurs noms de villes, séparés par une virgule (ex.: Ville 1, Ville 2) L'adresse URL suivante peut être utilisée pour produire le rapport avec les configurations de formulaire actuelles. Il suffit de la copier, de la coller dans votre navigateur Web et d'entrer. Vous pouvez utiliser vos favoris pour conserver votre générateur d'URL pour les rapports personnalisés. Vous pouvez télécharger un fichier CSS (feuille de style en cascade) supplémentaire pour modifier l'apparence du site Web. - Gestion de la barre latérale Modules d'extension des métadonnées Les modules d'extension des métadonnées mettent en place des normes supplémentaires pour les métadonnées. Modules d'extension pour connecter à la base de données de citations @@ -352,7 +346,6 @@ Il arrive parfois qu'une seule statistique d'utilisation doit être utilisée, p Aucune méthode de paiement sélectionnée. Méthode de paiement Devise - Les paiements effectués directement sur le site Web seront dans la devise sélectionnée. Options du rôle Afficher le titre du rôle dans la liste des contributeurs Permettre à l'utilisateur de s'inscrire lui-même @@ -431,13 +424,13 @@ Il arrive parfois qu'une seule statistique d'utilisation doit être utilisée, p Objet introuvable dans la base de données. Hier Contenu additionnel - Tout ce que vous inscrirez ici apparaîtra sur votre page d'accueil. - Avis de droits d'auteur - Nécessite que les auteurs acceptent l'avis de droit d'auteur dans le cadre du processus de soumission. + Tout ce que vous inscrirez ici apparaîtra sur votre page d'accueil. + Avis de droits d'auteur + Nécessite que les auteurs acceptent l'avis de droit d'auteur dans le cadre du processus de soumission. Les lignes directrices comprennent des normes bibliographiques et de mise en forme, ainsi que des exemples de formats de citation communs à utiliser dans les soumissions. - Format de favicon invalide. Les formats acceptés sont .ico, .png, and .gif. + Favicon Image de la page d'accueil. - Téléverser une image qui sera afficher en pleine grandeur sur la page d'accueil. + Téléverser une image qui sera afficher en pleine grandeur sur la page d'accueil. Descriptions Logo Notification d'une soumission par auteur @@ -447,14 +440,13 @@ Il arrive parfois qu'une seule statistique d'utilisation doit être utilisée, p Politiques sur le libre accès Si vous fournissez un accès immédiat et gratuit à tout le contenu publié, vous pouvez inscrire une description de votre politique sur le libre accès. Pied de page - Entrer une image, du texte ou du code HTML que vous voudriez voir apparaître au bas de votre site web. + Entrer une image, du texte ou du code HTML que vous voudriez voir apparaître au bas de votre site web. Décrire la politique et les processus d'évaluation par les pairs pour les lecteurs et les auteurs. Cette description comprend souvent le nombre d'évaluateur impliqués dans l'évaluation d'une soumission, les critères par lesquels les évaluateurs sont invités à juger ces soumissions, le temps prévu pour effectuer les évaluations et enfin, les critères utilisés pour sélectionner les évaluateurs. Contact principal Entrer les coordonnées d'un membre de la rédaction ou du personnel administratif qui peuvent être affichées sur votre site Web. Déclaration de confidentialité Les valeurs par défauts peuvent être modifiées pour chaque évaluation durant le processus éditorial. Date limite par défaut des évaluations - Présenter un lien "Assurer une évaluation à l'aveugle" lors du téléchargement Exemples: associations ou sociétés savantes, départements universitaires, coopératives, etc. Les commanditaire sont affichés publiquement. Soutien technique Une personne-ressource qui peut aider les rédacteurs, les auteurs et les évaluateurs avec toutes difficultés rencontrées durant la soumission, l'évaluation, l'édition ou la publication. @@ -557,8 +549,6 @@ Il arrive parfois qu'une seule statistique d'utilisation doit être utilisée, p Ce lien ne sera affiché que si le visiteur s'est connecté. Ce lien ne sera affiché que si le visiteur ne s'est pas connecté. Cette déclaration apparaîtra lors de l'inscription de l'utilisateur, de la soumission d'un article et sur la Page de confidentialité accessible au public. Dans certaines juridictions, vous êtes légalement tenus de divulguer la manière dont vous gérez les données utilisateurs dans une politique de confidentialité. - Sitemap - {$path}]]> Ce fichier peut être accessible pour téléchargement, si "Accès public" est activé, à:
{$downloadUrl}

]]>
Sélectionner le fichier à joindre Clé diff --git a/locale/fr_CA/reader.xml b/locale/fr_CA/reader.xml index cce25d8ba47..2b454a91423 100644 --- a/locale/fr_CA/reader.xml +++ b/locale/fr_CA/reader.xml @@ -34,145 +34,5 @@ Titre Voir tous les commentaires Texte intégral : - Ajouter un commentaire - Configuration - Êtes-vous certain de vouloir supprimer ce contexte et toutes les recherches associées? - Créer le contexte - Modifier le contexte - Métadonnées - Utiliser les noms d'auteurs comme termes de recherche par défaut afin de permettre aux utilisateurs de trouver d'autres ouvrages de ces auteurs pour cet article (par ex., pour un contexte « Autres ouvrages ») - Utiliser les noms d'auteurs comme termes de recherche par défaut et décrire le contexte comme une recherche de citations de l'article. - Paramètres RST afin de permettre de double-cliquer sur des mots pour ouvrir ce contexte.]]> - Utiliser des données d'indexation géographiques comme termes de recherche par défaut. - Options - Gestion - Outils de lecture - Êtes-vous certain de vouloir supprimer cette recherche? - Créer une recherche - Modifier une recherche - Éléments connexes - Résumé (présente le résumé de l'article). - Biographie de l'auteur (affiche les notes biographiques saisies par l'auteur) - Comment citer un article (fournit les données bibliographiques pour un article) - Chercher les termes (permet au lecteur de double-cliquer sur n'importe quel mot dans un article pour en afficher la définition) - Désactiver les éléments connexes - Envoyer un courriel à l'auteur (mène à un modèle de courriel contenant le courriel de l'auteur) - Aviser un collègue (mène à un modèle de courriel contenant un lien vers l'article) - Trouver des références - Version imprimable (offre une version imprimable d'un article). - Fichiers supplémentaires (affiche une liste de fichiers que l'auteur a inclus avec sa soumission) - Indexer les métadonnées (affiche les métadonnées d'indexation d'un article fournies par l'auteur et le système) - Statut - Validation terminée. - OK - {$url} n'est pas valide. - Valider les adresses URL pour les outils de lecture - Valider - Êtes-vous certain de vouloir supprimer cette version ainsi que tous les contextes et recherches qui lui sont associés? - Êtes-vous certain de vouloir réinitialiser de façon irréversible toutes les versions à leur version par défaut? Si oui, vous devez sélectionner une version active dans la page des Paramètres. - Créer une version - Modifier la version - Exporter - Importer une version - Métadonnées - Réinitialiser les versions aux versions par défaut - À propos de l'auteur - Format de citation - Comment citer un article - En ligne - Aviser un collègue - Abrév. - ET - Si l'article est indexé dans Google Scholar, il peut être accompagné par un lien « Cité par X » qui mène à une liste des ouvrages qui le citent. Aussi Google Scholar listera tous les articles citant le titre et l'auteur. Pour accéder aux ressources en ligne qui sont seulement disponibles par l'intermédiaire de votre bibliothèque de recherche, vous pouvez aller dans les Préférences Scholar, dans Google Scholar, et activer les Liens vers des bibliothèques, pour votre institution. - Contexte - Si l'article est un fichier HTML (plutôt que PDF), en double-cliquant sur n'importe quel mot dans le texte, on le fait apparaître dans la boîte Mot-à-définir. Sinon, on peut saisir ou copier-coller un mot dans la case. Pour en apprendre plus sur la ressource recherchée, cliquer sur « À PROPOS ». Ces ressources ont été sélectionnées en raison de leur pertinence et de l'accès libre (gratuit) à une partie ou à la totalité de leur contenu. - Description - Classer - Contextes - Les termes de recherche ont été sélectionnés par le (ou les) auteur(s).Ils peuvent être modifiés ou supprimer par le lecteur, car deux ou trois court termes ou expressions précises produisent les meilleures recherches booléennes (ET). Pour en savoir plus sur la ressource recherchée, cliquer sur « À PROPOS ». Ces ressources ont été sélectionnées en raison de leur pertinence et de l'accès libre (gratuit) à une partie ou à la totalité de leur contenu. - Termes de recherche - Mot à définir - Titre - Envoyer un courriel à l'auteur - inscription]]> - Votre message a été envoyé. - Trouver les références - Google Scholar - Windows Live Academic - Rechercher les termes - Contributeur - Couverture - Date - Description - Dublin Core - Format - Identifiant - Langue - Éditeur - Relation - Droits - Source - Sujet - Titre - Type - Métadonnées pour ce document - Résumé - Droit d'auteur et autorisations - Localisation géo-spatiale, période chronologique, échantillon de recherche (sexe, âge, etc.) - (AAAA-MM-JJ) - Discipline(s) - Format de fichier - Statut & genre - Éléments de métadonnées PKP - Français=fr - Agence organisatrice, lieu - Titre de revue/conférence; vol., no. (année) - Commanditaire(s) - Mot(s)-clé(s) - Fichiers supp. - Titre du document - Type - URI - Version imprimable - Outils de lecture - Éléments connexes - Politique d'évaluation - Description - Recherches - Classer - Recherche - Publier les données - Rechercher un URL - Suggérer une source - Titre - URL - Télécharger - Fichiers supplémentaires - Indexation de métadonnées - Description - Clé - Langue - Ensembles d'éléments connexes - Titre - Version - Indexer les métadonnées Le titre du commentaire est obligatoire. - Partage - Partage activé - addthis.com, et copier/coller le code du bouton Partage ci-dessous.]]> - Paramètres de base - Nom d'utilisateur AddThis.com - Style du bouton - Utiliser le menu déroulant - Paramètres avancés (facultatif) - documentation de personnalisation AddThis.com pour référence.]]> - Marque - (liste séparée par des virgules)]]> - Langue - Logo - Arrière-plan du logo - Couleur du logo - Configurer AddThis - Web - Visionner la politique d'évaluation diff --git a/locale/fr_CA/submission.xml b/locale/fr_CA/submission.xml index 28f18565804..b7ad81bb50d 100644 --- a/locale/fr_CA/submission.xml +++ b/locale/fr_CA/submission.xml @@ -673,8 +673,6 @@ Évaluation due Supprimer la soumission? Voir la soumission - Avancer la position de {$itemTitle} - Reculer la position de {$itemTitle} Assigner les évaluations complétées Révisions soumises Les modifications ont été soumises diff --git a/locale/fr_FR/admin.xml b/locale/fr_FR/admin.xml index 9d786d8b9cb..85cd2d58e5d 100644 --- a/locale/fr_FR/admin.xml +++ b/locale/fr_FR/admin.xml @@ -53,13 +53,9 @@ Information sur le serveur Version PHP Système d'exploitation - Description "À propos du site" + Description "À propos du site" Courriel du contact principal Nom du contact principal - Le courriel de la personne-ressource principale est obligatoire. - Le nom du contact principal est obligatoire. - Vous devez entrer un mot de passe d'au moins 4 caractères. - Le titre est obligatoire. @@ -68,8 +64,6 @@ Il y a des cas où une seule statistique d'utilisation doit être utilisée, par exemple pour afficher une liste ordonnée des soumissions les plus utilisées ou pour classer Les résultats de la recherche. Sélectionnez l'une des métriques configurées par défaut. - Logo du site - Le format de l'image du logo du site est invalide. Seuls les formats .gif, .jpg ou .png sont acceptés. Introduction Longueur minimum du mot de passe Enregistrer le site pour l'indexation (collecte de métadonnées) diff --git a/locale/fr_FR/api.xml b/locale/fr_FR/api.xml index 902c7bc4344..ed17abf469c 100644 --- a/locale/fr_FR/api.xml +++ b/locale/fr_FR/api.xml @@ -16,7 +16,7 @@ Votre requête a été refusée. Peut-être que votre session a expiré. Essayez de recharger la page. Vous ne pouvez pas supprimer une soumission hors de ce contexte. Vous n'avez pas la permission de supprimer cette soumission - La ressource demandée n'existe pas + La ressource demandée n'existe pas La requête n'a pu être terminée par manque d'information Une erreur imprévue est survenu. Merci de recharger la page. La requête n'a pu être finalisée car le submission stage ID est invalide. diff --git a/locale/fr_FR/common.xml b/locale/fr_FR/common.xml index 5cef4921322..709680dabc2 100644 --- a/locale/fr_FR/common.xml +++ b/locale/fr_FR/common.xml @@ -45,7 +45,6 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Déjà assigné Texte alternatif - Veuillez fournir un texte alternatif pour cette image afin d'assurer l'accessibilité aux utilisateurs de navigateurs textuels ou d'appareils et accessoires fonctionnels. et Appliquer l'action Assigner @@ -129,10 +128,11 @@ Démarré Options Classer + Remonter {$itemTitle} + Descendre {$itemTitle} Nom original du fichier ou Autre - Logo de l'en-tête de la page Plugiciel Éditeur Qualité @@ -163,7 +163,6 @@ Non engagé Sans titre Mis à jour - Fichier transféré Transférer Haut Transférer un fichier @@ -302,7 +301,6 @@ Aucun commentaire Courriel de l'expéditeur Nom de l'expéditeur - le formulaire n'a pas été soumis de la bonne façon. commence par L'URL indiquée n'est pas valide. Veuillez vérifier et essayer de nouveau. Fichiers d'évaluation mis à jour. @@ -426,7 +424,6 @@ Contenu Calendrier Hijri Refusé - Favicon Terminer La fenêtre pour transférer un fichier système est en cours. Si elle n'apparait pas, il est probable qu'aucun de ses temps d'exécution ne soit supporté par ce navigateur. Veuillez contacter l'administrateur pour obtenir de l'aide. Continuer @@ -455,9 +452,6 @@ Sous-titre Élément Non lu - {$supportName} pour obtenir de l'aide.]]> - Aucun fichier n'a été transféré ou type de fichier invalide! - Image de la page d'accueil Modules externes Métrique Décompte diff --git a/locale/fr_FR/installer.xml b/locale/fr_FR/installer.xml index 0def8ad4fef..ee14735b920 100644 --- a/locale/fr_FR/installer.xml +++ b/locale/fr_FR/installer.xml @@ -61,7 +61,6 @@ Identifiant du dépôt OAI Le répertoire des fichiers publics n'existe pas ou n'est pas disponible en écriture. Instructions d'utilisation - Paramètres de sécurité {$file}.]]> Les langues sélectionnées peuvent être incomplètes. Paramètres OAI diff --git a/locale/fr_FR/manager.xml b/locale/fr_FR/manager.xml index 69ff9dfd0a7..af06cb98f3e 100644 --- a/locale/fr_FR/manager.xml +++ b/locale/fr_FR/manager.xml @@ -140,12 +140,7 @@ Outils de lecture Rôles Groupement par type de fichier - Format d'image du logo de l'en-tête de la page d'accueil invalide. Les formats acceptés sont .gif, .jpg, ou .png. - Format d'image de la page d'accueil invalide. Les formats acceptés sont .gif, .jpg, ou .png. Format d'image de l'en-tête de la page d'accueil invalide. Les formats acceptés sont .gif, .jpg, ou .png. - Encadré de gauche - Encadré de droite - Non sélectionné Journalisation et audit Format d'image du logo de l'en-tête de la page invalide. Les formats acceptés sont .gif, .jpg, ou .png. En sélectionner un @@ -223,8 +218,8 @@ Normes pour les auteurs Ne jamais rappeler Organismes commanditaires - Thème - Choisir un thème parmi les modules d'extension de thèmes disponibles. + Thème + Choisir un thème parmi les modules d'extension de thèmes disponibles. Options d'accès au site Apparence Un fichier image est requis. Assurez-vous d'avoir choisi et téléchargé un fichier. @@ -240,11 +235,10 @@ Vous devez choisir au moins une colonne pour produire le rapport. Limiter les résultats selon le pays, la région ou la ville. Intérêts concurrents - Les rapporteurs devront respecter la politique de divulgation des intérêts concurrents que vous spécifiez ci-dessous. Délai de réponse alloué (semaines) Délai alloué pour la révision (semaines) - Envoyer un rappel si le rapporteur n'a pas répondu à la demande d'examen dans le délai suivant (jours): - Envoyer un rappel si le rapporteur n'a pas fait sa recommandation dans le délai suivant (jours): + Envoyer un rappel si le rapporteur n'a pas répondu à la demande d'examen dans le délai suivant (jours): + Envoyer un rappel si le rapporteur n'a pas fait sa recommandation dans le délai suivant (jours): Genres dépendants Vous pouvez ajouter une note décrivant votre politique en matière de commandite; celle-ci apparaitra dans la liste des commanditaires sur votre page À propos de. Vous pouvez ajouter une note décrivant votre rapport et votre politique entre vous et vos bailleurs de fonds; celle-ci apparaitra dans la liste des bailleurs de fonds sur votre page À propos de. @@ -258,7 +252,6 @@ Il arrive parfois qu'une seule statistique d'utilisation doit être utilisée, p Un ou plusieurs noms de villes, séparés par une virgule (ex.: Ville 1, Ville 2) L'adresse URL suivante peut être utilisée pour produire le rapport avec les configurations de formulaire actuelles. Il suffit de la copier, de la coller dans votre navigateur Web et d'entrer. Vous pouvez utiliser vos favoris pour conserver votre générateur d'URL pour les rapports personnalisés. Vous pouvez télécharger un fichier de Feuilles de style en cascade (FSC) supplémentaire pour modifier l'apparence. - Gestion de la barre latérale Modules d'extension des métadonnées Les modules d'extension des métadonnées mettent en place des normes supplémentaires pour les métadonnées. Modules d'extension d'identificateur public @@ -305,7 +298,6 @@ Il arrive parfois qu'une seule statistique d'utilisation doit être utilisée, p Aucune méthode de paiement sélectionnée. Méthode de paiement Devise - Les paiements effectués directement sur le site Web seront dans la devise sélectionnée. Options du rôle Afficher le titre du rôle dans la liste des contributeurs Permettre à l'utilisateur de s'inscrire lui-même @@ -384,13 +376,13 @@ Il arrive parfois qu'une seule statistique d'utilisation doit être utilisée, p Objet introuvable dans la base de données. Hier Contenu additionnel - Tout ce que vous inscrirez ici apparaîtra sur votre page d'accueil. - Avis de droits d'auteur - Nécessite que les auteurs acceptent l'avis de droit d'auteur dans le cadre du processus de soumission. + Tout ce que vous inscrirez ici apparaîtra sur votre page d'accueil. + Avis de droits d'auteur + Nécessite que les auteurs acceptent l'avis de droit d'auteur dans le cadre du processus de soumission. Les lignes directrices comprennent des normes bibliographiques et de mise en forme, ainsi que des exemples de formats de citation communs à utiliser dans les soumissions. - Format de favicon invalide. Les formats acceptés sont .ico, .png, and .gif. + Favicon Image de la page d'accueil. - Téléverser une image qui sera afficher en pleine grandeur sur la page d'accueil. + Téléverser une image qui sera afficher en pleine grandeur sur la page d'accueil. Descriptions Logo Notification d'une soumission par auteur @@ -400,14 +392,13 @@ Il arrive parfois qu'une seule statistique d'utilisation doit être utilisée, p Politiques sur le libre accès Si vous fournissez un accès immédiat et gratuit à tout le contenu publié, vous pouvez inscrire une description de votre politique sur le libre accès. Pied de page - Entrer une image, du texte ou du code HTML que vous voudriez voir apparaître au bas de votre site web. + Entrer une image, du texte ou du code HTML que vous voudriez voir apparaître au bas de votre site web. Décrivez la politique et les processus d'examen par les pairs pour les lecteurs et les auteurs. Cette description comprend souvent le nombre de rapporteurs impliqués dans l'examen d'une soumission, les critères par lesquels les rapporteurs sont invités à juger ces soumissions, le temps prévu pour effectuer les évaluations et enfin, les critères utilisés pour sélectionner les rapporteurs. Contact principal Entrez les coordonnées d'un rédacteur en chef, d'un membre de la rédaction ou du personnel administratif qui peuvent être affichées sur la version public de votre site Web. Déclaration de confidentialité Les valeurs par défauts peuvent être modifiées pour chaque évaluation durant le processus éditorial. Date limite par défaut des évaluations - Présentez un lien "Assurer une évaluation à l'aveugle" lors du téléchargement Exemples: associations ou sociétés savantes, départements universitaires, coopératives, etc. Les commanditaire sont affichés publiquement. Support technique Une personne-ressource qui peut aider les rédacteurs en chef, les auteurs et les rapporteurs à résoudre des problèmes lors d'une soumission, de l'édition, de l'évaluation ou lors de la publication de documents. @@ -498,8 +489,6 @@ Il arrive parfois qu'une seule statistique d'utilisation doit être utilisée, p Revue.]]> Revue.]]> Revue.]]> - Sitemap - {$path}]]> Ce fichier sera accessible si l'accès public est activé à cette URL :
{$downloadUrl}

]]>
Sélectionner le fichier de bibliothèque à envoyer Clé diff --git a/locale/fr_FR/reader.xml b/locale/fr_FR/reader.xml index dce301f6866..8ea500f0af4 100644 --- a/locale/fr_FR/reader.xml +++ b/locale/fr_FR/reader.xml @@ -34,145 +34,5 @@ Titre Voir tous les commentaires Texte intégral : - Ajouter un commentaire - Configuration - Êtes-vous certain de vouloir supprimer ce contexte et toutes les recherches associées? - Créer le contexte - Modifier le contexte - Métadonnées - Utiliser les noms d'auteurs comme termes de recherche par défaut afin de permettre aux utilisateurs de trouver d'autres ouvrages de ces auteurs pour cet article (par ex., pour un contexte « Autres ouvrages ») - Utiliser les noms d'auteurs comme termes de recherche par défaut et décrire le contexte comme une recherche de citations de l'article. - Paramètres RST afin de permettre de double-cliquer sur des mots pour ouvrir ce contexte.]]> - Utiliser des données d'indexation géographiques comme termes de recherche par défaut. - Options - Gestion - Outils de lecture - Êtes-vous certain de vouloir supprimer cette recherche? - Créer une recherche - Modifier une recherche - Éléments connexes - Résumé (présente le résumé de l'article). - Biographie de l'auteur (affiche les notes biographiques saisies par l'auteur) - Comment citer un article (fournit les données bibliographiques pour un article) - Chercher les termes (permet au lecteur de double-cliquer sur n'importe quel mot dans un article pour en afficher la définition) - Désactiver les éléments connexes - Envoyer un courriel à l'auteur (mène à un modèle de courriel contenant le courriel de l'auteur) - Aviser un collègue (mène à un modèle de courriel contenant un lien vers l'article) - Trouver des références - Version imprimable (offre une version imprimable d'un article). - Fichiers supplémentaires (affiche une liste de fichiers que l'auteur a inclus avec sa soumission) - Indexer les métadonnées (affiche les métadonnées d'indexation d'un article fournies par l'auteur et le système) - Statut - Validation terminée. - OK - {$url} n'est pas valide. - Valider les adresses URL pour les outils de lecture - Valider - Êtes-vous certain de vouloir supprimer cette version ainsi que tous les contextes et recherches qui lui sont associés? - Êtes-vous certain de vouloir réinitialiser de façon irréversible toutes les versions à leur version par défaut? Si oui, vous devez sélectionner une version active dans la page des Paramètres. - Créer une version - Modifier la version - Exporter - Importer une version - Métadonnées - Réinitialiser les versions aux versions par défaut - À propos de l'auteur - Format de citation - Comment citer un article - En ligne - Aviser un collègue - Abrév. - ET - Si l'article est indexé dans Google Scholar, il peut être accompagné par un lien « Cité par X » qui mène à une liste des ouvrages qui le citent. Aussi Google Scholar listera tous les articles citant le titre et l'auteur. Pour accéder aux ressources en ligne qui sont seulement disponibles par l'intermédiaire de votre bibliothèque de recherche, vous pouvez aller dans les Préférences Scholar, dans Google Scholar, et activer les Liens vers des bibliothèques, pour votre institution. - Contexte - Si l'article est un fichier HTML (plutôt que PDF), en double-cliquant sur n'importe quel mot dans le texte, on le fait apparaître dans la boîte Mot-à-définir. Sinon, on peut saisir ou copier-coller un mot dans la case. Pour en apprendre plus sur la ressource recherchée, cliquer sur « À PROPOS ». Ces ressources ont été sélectionnées en raison de leur pertinence et de l'accès libre (gratuit) à une partie ou à la totalité de leur contenu. - Description - Classer - Contextes - Les termes de recherche ont été sélectionnés par le (ou les) auteur(s).Ils peuvent être modifiés ou supprimer par le lecteur, car deux ou trois court termes ou expressions précises produisent les meilleures recherches booléennes (ET). Pour en savoir plus sur la ressource recherchée, cliquer sur « À PROPOS ». Ces ressources ont été sélectionnées en raison de leur pertinence et de l'accès libre (gratuit) à une partie ou à la totalité de leur contenu. - Termes de recherche - Mot à définir - Titre - Envoyer un courriel à l'auteur - inscription]]> - Votre message a été envoyé. - Trouver les références - Google Scholar - Windows Live Academic - Rechercher les termes - Contributeur - Couverture - Date - Description - Dublin Core - Format - Identifiant - Langue - Éditeur - Relation - Droits - Source - Sujet - Titre - Type - Métadonnées pour ce document - Résumé - Droit d'auteur et autorisations - Localisation géo-spatiale, période chronologique, échantillon de recherche (sexe, âge, etc.) - (AAAA-MM-JJ) - Discipline(s) - Format de fichier - Statut & genre - Éléments de métadonnées PKP - Français=fr - Agence organisatrice, lieu - Titre de revue/conférence; vol., no. (année) - Commanditaire(s) - Mot(s)-clé(s) - Fichiers supp. - Titre du document - Type - URI - Version imprimable - Outils de lecture - Éléments connexes - Politique d'évaluation - Description - Recherches - Classer - Recherche - Publier les données - Rechercher un URL - Suggérer une source - Titre - URL - Télécharger - Fichiers supplémentaires - Indexation de métadonnées - Description - Clé - Langue - Ensembles d'éléments connexes - Titre - Version - Indexer les métadonnées Le titre du commentaire est obligatoire. - Partage - Partage activé - addthis.com, et copier/coller le code du bouton Partage ci-dessous.]]> - Paramètres de base - Nom d'utilisateur AddThis.com - Style du bouton - Utiliser le menu déroulant - Paramètres avancés (facultatif) - documentation de personnalisation AddThis.com pour référence.]]> - Marque - (liste séparée par des virgules)]]> - Langue - Logo - Arrière-plan du logo - Couleur du logo - Configurer AddThis - Web - Visionner la politique d'examen diff --git a/locale/fr_FR/submission.xml b/locale/fr_FR/submission.xml index 54280022e38..da185ff7ebf 100644 --- a/locale/fr_FR/submission.xml +++ b/locale/fr_FR/submission.xml @@ -277,7 +277,7 @@ En cours d'évaluation En attente de la décision du rédacteur en chef Non assigné - + Participants @@ -559,8 +559,6 @@ Voir Filtres Supprimer le filtre : {$filterTitle} - Remonter {$itemTitle} - Descendre {$itemTitle} Rapports effectués Fichiers prêts Discussions diff --git a/locale/hr_HR/admin.xml b/locale/hr_HR/admin.xml index 03540b607d1..3e6b601b677 100644 --- a/locale/hr_HR/admin.xml +++ b/locale/hr_HR/admin.xml @@ -45,15 +45,9 @@ Informacije poslužitelja Verzija PHP-a Platforma OS-a - Opis stranice + Opis stranice E-pošta glavnog kontakta Ime glavnog kontakta - Kontakt e-pošta upravitelja je obavezna. - Kontakt ime upravitelja je obavezno. - Morate unijeti minimalnu duljinu lozinke od najmanje 4 znaka. - Naziv je obavezan. - Logotip mrežne stranice - Neispravni format logotipa stranice. Sustav prihvaća .gif, .jpg ili .png formate. Uvod Minimalna duljina lozinke znakova diff --git a/locale/hr_HR/common.xml b/locale/hr_HR/common.xml index c2c89897b7c..a0ecf45c4d4 100644 --- a/locale/hr_HR/common.xml +++ b/locale/hr_HR/common.xml @@ -42,7 +42,6 @@ A B C Č Ć D Đ E F G H I J K L M N O P Q R S Š T U V W X Y Z Ž Pridruženo Zamjenski tekst - Molimo priložite zamjenski tekst za ovu sliku kako bi pristup sadržaju bio moguć i korisnicima sa tekstualnim preglednicima ili pomagalima za čitanje (npr. slijepim i slabovidnim osobama). Primjeni postupak Pridruži Upita @@ -120,7 +119,6 @@ Izvorno ime datoteke ili Ostalo - Logotip zaglavlja stranice Dodatak Nakladnik Zapiši @@ -150,7 +148,6 @@ Nezapočeto Bez naslova Obnovljeno - Poslana datoteka Pošalji datoteku Gore URL diff --git a/locale/hr_HR/installer.xml b/locale/hr_HR/installer.xml index e84e2cdcc58..ee4bbcf1bc1 100644 --- a/locale/hr_HR/installer.xml +++ b/locale/hr_HR/installer.xml @@ -63,5 +63,4 @@ Identifikator OAI repozitorija Direktorij javnih datoteka ne postoji ili se ne može pisati po njemu. Bilješke o izdanju - Sigurnosne postavke diff --git a/locale/hr_HR/manager.xml b/locale/hr_HR/manager.xml index 11d6b34f98c..b55d587b63b 100644 --- a/locale/hr_HR/manager.xml +++ b/locale/hr_HR/manager.xml @@ -132,7 +132,6 @@ Funkcionalni dodaci sustava Alati za čitanje Uloge - Neispravan format slike logotipa zaglavlja naslovne stranice. Prihvaćeni formati su .gif, .jpg, ili .png. Neispravan format slike naslovne stranice. Prihvaćeni formati su .gif, .jpg, ili .png. Neispravan format slike zaglavlja naslovne stranice. Prihvaćeni formati su .gif, .jpg, ili .png. Bilježenje uređivačkog postupka diff --git a/locale/hr_HR/reader.xml b/locale/hr_HR/reader.xml index 574d833d742..66aa79bfa8a 100644 --- a/locale/hr_HR/reader.xml +++ b/locale/hr_HR/reader.xml @@ -33,122 +33,4 @@ Odgovora Naslov Pregled svih komentara - Dodaj komentar - Konfiguracija - Jeste li sigurni da želite izbrisati ovu dopunu tekstu i sva pretraživanja vezana uz nju? - Kreiraj dopunu teksta - Metapodaci - Koristi imena autora kao pojmove za pretraživanje kako bi korisnici mogli pronaći druge radove autora ovog priloga (npr. za kontekst "drugi radovi"). - Koristi imena autora kao pojmove za pretraživanje i definiraj kontekst kao traženje radova koji citiraju ovaj članak. - opcijama alata za čitanje mora biti aktivirana kako bi se dvostrukim klikom na odabranu riječ omogućio pristup ovom kontekstu.]]> - Koristi geografski indeksirane podatke kao pojmove za ovo pretraživanje. - Mogućnosti - Upravljanje - Alati za čitanje - Jeste li sigurni da želite izbrisati ovo pretraživanje? - Kreirajte pretraživanje - Povezane stavke - Sažetak (prikazuje sažetak priloga). - O autoru (prikazuje biografske podatke koje je unio autor). - Bibliografska referenca priloga (pruža bibliografski zapis dotičnog priloga). - Definicije pojmova (omogućuje čitateljima da dvostrukim klikom na bilo koju riječ u prilogu izravno konzultiraju rječnik). - Onemogući povezane stavke - Pošalji e-poštu autoru (otvara korisniku predložak e-pošte naslovljen na autora). - Obavijesti kolegu (otvara korisniku predložak e-pošte s poveznicom na stavku). - Nađi reference - Verzija za ispis (otvara u novom prozoru tekst priloga optimiziran za ispis na pisaču - korisno za priloge u HTM formatu). - Dopunske datoteke (prikazuje listu datoteka koje je autor priložio uz prijavu). - Metapodaci priloga (prikazuje indeksirane metapodatke koje su unijeli autori ili generirao sustav). - Status - Provjera je završena. - URL-ove označene kao nevažeće poželjno je ručno provjeriti jer ovaj test nije 100% točan, posebno kod URL-ova koji se pretražuju pomoću POST upita.]]> - U redu - {$url} nije važeći. - Provjeri valjanost URL-ova alata za čitanje - Provjeri - Jeste li sigurni da želite izbrisati ovu verziju i sve dodatke i pretraživanja vezane uz nju? - Jeste li sigurni da želite nepovratno vratiti sve verzije u njihovo standardno stanje? Ako je tako,morat ćete odabrati aktivnu verziju u postavkama stranice. - Kreiraj verziju - Uredi verziju - Iznesi - Uvedi verziju - Metapodaci - O autoru - Bibliografski standard - Bibliografska referenca priloga - Online - Obavijesti kolegu - Kratica - I - Ako je članak indeksirao Google Scholar, može biti priloženo "citirao X" poveznicom koji vodi do liste radova koji su citirani. Isto tako, Google Scholar će izlistati sve stavke navodeći naslov i autora. Kako bi pristupili online izvorima koji su jedino dostupni preko vaše istraživačke knjižnice, možete otići na Scholar postavke u Google Scholar i aktivirati poveznice knjižnice za vašu instituciju. - Kontekst pretraživanja - Ako je stavka HTML datoteka (prije nego PDF), dvostrukim klikom na bilo koju riječ u tekstu pojavit će se u okviru Riječ-za-Definirati. Isto tako, riječi mogu biti napisane ili zalijepljene u okvir. Da biste saznali više o pretraženom izvoru, kliknite na O ČASOPISU. Ovi izvori su odabrani zbog svoje relevantnosti i svojeg otvorenog (besplatnog) pristupa cijelom ili djelomičnom sadržaju. - Opis - Redoslijed - Konteksti pretraživanja - Izraze za pretraživanje je odabrao autor(i). Njih može promijeniti ili izbrisati čitatelj, i to dva ili tri kraća, preciznija izraza ili fraze dobivene pretraživanjem uz pomoć Booleanove (I) algebre. Kako biste naučili više o pretraženim izvorima, kliknite na ABOUT. Ovi izvori su odabrani zbog svoje relevantnosti i otvorenog (besplatnog) pristupa njegovom cijelom ili djelomičnom sadržaju. - Tražite izraze - Riječ za definirati - Naslov - Pošalji e-poštu autoru - registrirati se]]> - Vaša poruka je poslana. - Traženje referenci - Google Scholar - Windows Live Academic - Definirani izrazi - Davatelj - Opseg - Datum - Opis - Dublin Core - Format - Identifikator - Jezik - Nakladnik - Relacija - Prava - Izvor - Tema - Naslov - Tip - Metapodaci za ovaj dokument - Sažetak - Autorsko pravo i dozvole - Geo-prostorna lokacija, kronološko razdoblje, istraživački uzorak (spol,starost, itd.) - (GGGG-MM-DD) - Disciplina(e) - Format datoteke - Status & žanr - PKP metapodaci stavki - Engleski=en - Organizacijska agencija, mjesto - Časopis/konferencijski naslov; vol., br. (godina) - Pokrovitelj(i) - Ključna riječ(i) - Dop. datoteke - Naslov dokumenta - Tip - Univerzalni pokazatelj izvora - Verzija za ispis - Povezane stavke - Politika recenzija - Opis - Pretraživanja - Redoslijed - Pretraživanje - Poslani podaci - Pretraživanje URL - Predložite izvor - Naslov - URL - Skinite - Dopunske datoteke - Indeksiranje metapodataka - Opis - Šifra - Jezik - Područja pretraživanja - Naslov - Indeksiranje metapodataka diff --git a/locale/id_ID/admin.xml b/locale/id_ID/admin.xml index 66dba5d2ee6..63077a23275 100644 --- a/locale/id_ID/admin.xml +++ b/locale/id_ID/admin.xml @@ -46,15 +46,9 @@ Informasi Server Versi PHP Platform OS - Deskripsi Situs + Deskripsi Situs Email Kontak Utama Nama Kontak Utama - Alamat email kontak utama diperlukan. - Nama kontak utama diperlukan. - Anda harus memasukkan panjang minimal kata sandi yaitu 4 karakter. - Judul diperlukan. - Logo Situs - Format gambar logo invalid. Format yang diterima adalah .gif, .jpg, atau .png. Pendahuluan Panjang Kata Sandi Min Karakter diff --git a/locale/id_ID/common.xml b/locale/id_ID/common.xml index 474c7dab97d..743f774a357 100644 --- a/locale/id_ID/common.xml +++ b/locale/id_ID/common.xml @@ -39,7 +39,6 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Ditugaskan Selang-seling teks - Merupakan teks pengganti gambar untuk penelusuran dengan perambah text-only. dan Terapkan Aksi Menugaskan @@ -147,7 +146,6 @@ Nama file asli atau Yang lain - Logo Header Halaman Plugin Plugin "{$pluginName}" aktif. Plugin "{$pluginName}" tidak aktif. @@ -183,7 +181,6 @@ Belum dimulai Tidak berjudul Updated - File yang diunggah Unggah file tidak bisa diunggah. Coba lagi atau hubungi administrator jika masalah tetap ada. Up diff --git a/locale/id_ID/manager.xml b/locale/id_ID/manager.xml index c3b0f1d4a3c..88867cd7080 100644 --- a/locale/id_ID/manager.xml +++ b/locale/id_ID/manager.xml @@ -142,7 +142,6 @@ Minat Mereview Peran Ada kesalahan saat menghapus item ini. - format gambar logo header beranda invalid atau unggahan gagal. Format yang diterima adalah .gif, .jpg, or .png. format gambar beranda invalid atau unggahan gagal. Format yang diterima adalah .gif, .jpg, or .png. format gambar judul header beranda invalid atau unggahan gagal. Format yang diterima adalah .gif, .jpg, or .png. Proses Login dan Audit diff --git a/locale/id_ID/reader.xml b/locale/id_ID/reader.xml index 90ffa1765b2..ffb4de25483 100644 --- a/locale/id_ID/reader.xml +++ b/locale/id_ID/reader.xml @@ -34,146 +34,4 @@ Judul Lihat semua komentar Teks Lengkap: - Tambah Komentar - Konfigurasi - Apakah Anda yakin Anda ingin menghapus konteks ini dan semua pencarian yang terkait? - Buat Konteks - Edit Konteks - Metadata - Gunakan nama penulis sebagai istilah pencarian default untuk memudahkan pengguna mencari karya penulis lain untuk item ini (contoh: untuk konteks "Karya Lain") - Gunakan nama penulis sebagai istilah pencarian default dan mendeskripsikan konteks sebagai pencarian untuk sitiran ke artikel. - Pengaturan RST untuk mengizinkan klik dua kali di kata untuk membuka konteks ini.]]> - Gunakan data pengindeksan geografis sebagai istilah pencarian default. - Pilihan - Manajemen - - Berbagi - Berbagi bisa - addthis.com, dan salin kode tombol Berbagi di bawah ini.]]> - - Pengaturan Dasar - AddThis.com Nama pengguna - Model Tombol - Gunakan menu drop-down - Pengaturan Tingkat Tinggi (pilihan) - AddThis.com dokumentasi penyesuaian untuk referensi.]]> - Merek - (gunakan koma untuk memisahkan daftar)]]> - Bahasa - Logo - Latar Belakang Logo - Warna Logo - - Alat Membaca - Apakah Anda yakin ingin menghapus pencarian ini? - Buat Pencarian - Edit Pencarian - Item Terkait - Sari (menampilkan sari item). - Tentang penulis (menampilkan biografi yang dimasukkan oleh penulis). - Bagaimana mengutip item (menyediakan detail bibliografi untuk item). - Mencari istilah (memudahkan pembaca untuk meng-klik dua kali di kata apapun di item dan mengirimkan kata tersebut ke kamus). - Membuat item terkait tidak aktif - Mengirimkan email ke penulis (terarah ke template email dengan email penulis). - Beritahu rekan kerja (terarah ke template email dengan tautan ke item). - Temukan Referensi - Versi Print (menyediakan versi item yang ramah-printer). - File Tambahan (menampilkan daftar file tambahan naskah). - Pengindeksan metadata (menampilkan pengindeksan metadata item yang disediakan oleh penulis dan sistem). - Status - Konfigurasi AddThis - Validasi selesai. - OK - {$url} tidak valid. - Validasi URL untuk Alat Membaca - Validasi - Apakah Anda yakin ingin menghapus versi ini dan semua pencarian dan konteks yang terkait? - Apakah Anda yakin ingin menyimpan ulang semua versi ke default mereka? Jika iya, Anda akan perlu memilih Versi aktif di halaman Pengaturan. - Buat Versi - Edit Versi - Ekspor - Impor Versi - Metadata - Menyimpan ulang Versi ke Default - Tentang Penulis - Format Sitiran - Bagaimana mengutip item - Online - Web - Beritahu rekan kerja - Singkatan - DAN - Jika artikel diindeks di Google Scholar, artikel ini bisa disertai dengan tautan "Dikutip oleh X", yang terarah ke daftar karya yang mengutipnya. Google Scholar juga akan mendaftar semua item yang mengutip judul dan penulis. Untuk mengakses sumber online yang hanya tersedia melalui perpustakaan riset Anda, Anda mungkin bisa ke Scholar Preferences di Google Scholar an mengaktifkan Library Links untuk institusi Anda. - Konteks - Jika item adalah file HTML (bukan PDF), klik dua kali di kata apapun di teks akan membuatnya ditampilkan di kotak Kata-untuk-didefinisikan. Sebaliknya, kata bisa diketik dan disalin di kotak. Untuk mempelajari lebih jauh tentang sumber yang dicari, klik TENTANG KAMI. Sumber ini telah dipilih karena relevansi mereka dan akses (bebas biaya) terbuka milik mereka ke seluruh atau sebagian isi mereka. - Deskripsi - Urutan - Konteks - Istilah pencarian telah dipilih oleh penulis (s). Mereka dapat diubah atau dihapus oleh pembaca, sebagai dua atau tiga singkat, tepat istilah atau frase menghasilkan Boolean terbaik (DAN) pencarian. Untuk mempelajari lebih lanjut tentang sumber daya dicari, klik pada TENTANG KAMI. Sumber daya ini telah dipilih untuk relevansi dan terbuka (gratis) akses ke semua atau sebagian dari isinya. - Cari Istilah - Kata untuk didefinisikan - Judul - Kirim email ke penulis - registrasi]]> - Pesan Anda telah dikirim. - Temukan referensi - Google Scholar - Windows Akademik Langsung - Cari Istilah - Kontributor - Cakupan - Tanggal - Deskripsi - Dublin Core - Format - Pengidentifikasi - Bahasa - Penerbit - Hubungan - Hak - Sumber - Subjek - Judul - Tipe - Metadata untuk dokumen ini - Sari - Hak cipta dan izin - Lokasi geo-spasial, periode kronologis, sampel riset (jenis kelamin, umur, dll.) - (YYYY-MM-DD) - Disiplin - Format file - - Item metadata PKP - English=en - Agen Pengorganisasian, lokasi - Jurnal/ Konferensi judul; vol., no. (tahun) - Sponsor - Kata Kunci - File tambahan - Judul dokumen - Tipe - Pengidentifikasi Sumber Seragam - Versi Print - Alat Membaca - Item terkait - Kebijakan Review - Deskripsi - Pencarian - Perintah - Cari - Memposting data - Cari URL - Sarankan sebuah sumber - Judul - URL - Unduh - File tambahan - metadata pengindeksan - Deskripsi - Kunci - Bahasa - Rangkaian item terkait - Judul - Versi - metadata pengindeksan diff --git a/locale/it_IT/admin.xml b/locale/it_IT/admin.xml index 10ba37f077f..2c5fb843922 100644 --- a/locale/it_IT/admin.xml +++ b/locale/it_IT/admin.xml @@ -44,15 +44,9 @@ Informazioni sul Server Versione di PHP Sistema operativo - Descrizione del sito + Descrizione del sito Email del contatto principale Nome del contatto principale - È richiesto l'indirizzo e-mail del contatto principale. - È richiesto il nome del contatto principale. - Devi inserire una password composta almeno da 4 caratteri. - È necessario inserire un titolo. - Logo del sito - Formato dell'immagine del logo del sito non valido. I formati accettati sono .gif, .jpg, o .png. Introduzione Lunghezza minima delle password Lingua del sito diff --git a/locale/it_IT/common.xml b/locale/it_IT/common.xml index 8558212655b..48b9f50054e 100644 --- a/locale/it_IT/common.xml +++ b/locale/it_IT/common.xml @@ -40,7 +40,6 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Assegnato Testo alternativo - Fornisci un testo alternativo all'immagine per assicurare l'accessibilità agli utenti con browser testuali o con dispositivi di supporto per la lettura e Esegui azione Assegnazione @@ -117,7 +116,6 @@ Nome originale del file o Altro - Logo per l'intestazione della pagina Plugin Editore Registra @@ -147,7 +145,6 @@ Non iniziato Senza titolo Aggiornato - File caricato Carica Su URL @@ -312,7 +309,6 @@ Remoto URL remota Non letto - Nessun file caricato o tipo di file non valido! Plugin Inserisci l'oggetto del messaggio Inserisci un testo nel messaggio diff --git a/locale/it_IT/manager.xml b/locale/it_IT/manager.xml index 5d373ac5a04..f2d194cfe2f 100644 --- a/locale/it_IT/manager.xml +++ b/locale/it_IT/manager.xml @@ -138,10 +138,8 @@ Plugin Strumenti di lettura Ruoli - Formato dell'immagine del logo per la testata dell'home page non valido. I formati accettati sono .gif, .jpg, o .png. Formato dell'immagine per l'home page non valido. I formati accettati sono .gif, .jpg, o .png. Formato dell'immagine-titolo per la testata dell'home page non valido. I formati accettati sono .gif, .jpg, o .png. - Non selezionato Registrazione e certificazione Formato dell'immagine del logo per la testata non valido. I formati accettati sono .gif, .jpg, o .png. @@ -176,7 +174,6 @@ Se resetti tutti i modelli, ogni modifica fatta nel frattempo andrà perduta. Confermi l'operazione? Se resetti questo modello, ogni modifica fatta nel frattempo andrà perduta. Confermi l'operazione? Usa il modulo sottostante per impostare il valore massimo di termini che vuoi cercare. Il modulo è pre-popolato con i valori medi per questi campi. - Gestione della barra laterale Plugin per i metadati I plugin per i metadati implementano schemi di metadati aggiuntivi OAI Metadata Format Plugins @@ -226,28 +223,25 @@ Linee guida per gli autori Le linee guida dovrebbero contenere informazioni sulle norme redazionali per la redazione del testo e della bibliografia, includendo esempi dei formati delle citazioni Conflitti di interessi - Richiedi ai revisori di accettare le seguenti norme sul conflitto di interessi - Formato della favicon non valido. I formati accettati sono .ico, .png e .gif. - Temi - Nuovi temi possomo essere installati nella sezione Plugin in cima a questa pagina + Favicon + Temi + Nuovi temi possomo essere installati nella sezione Plugin in cima a questa pagina Logo Notifiche per le proposte Invia una copia a questo indirizzo email Piè di pagina - Inserisci immagini, testo o codice HTML che vuoi compaia nel piè di pagina + Inserisci immagini, testo o codice HTML che vuoi compaia nel piè di pagina Settimane concesse per accettare o rifiutare una richiesta di revisione I valori impostati qui possono essere modificati durante il processo editoriale. - Invia un promemoria se il revisore non risponde ad una richiesta di revisione entro (n) giorni dopo la scadenza: - Invia un promemoria se il revisore non invia un parere entro (n) giorni dopo la scadenza: + Invia un promemoria se il revisore non risponde ad una richiesta di revisione entro (n) giorni dopo la scadenza: + Invia un promemoria se il revisore non invia un parere entro (n) giorni dopo la scadenza: Tempo per la revisione - Inserisci un link a "Come assicurare una peer review cieca" durante il caricamento di una proposta È possbile caricare un file CSS per personalizzare ulteriormente l'aspetto del sito Opzioni di accesso al sito Pagamenti Nessun metodo di pagamento selezionato Metodo di pagamento Valuta - I pagamenti effettuati direttamente sul sito saranno considerati nella seguente valuta: Opzioni per i ruoli Mostra questo ruolo nella lista dei collaboratori Consenti agli utenti di registrarsi in questo ruolo diff --git a/locale/it_IT/reader.xml b/locale/it_IT/reader.xml index 40a8f938570..a33e9a87735 100644 --- a/locale/it_IT/reader.xml +++ b/locale/it_IT/reader.xml @@ -34,145 +34,5 @@ Titolo Vedi tutti i commenti Full Text - Aggiungi un commento - Configurazione - Sei sicuro di voler cancellare questo contesto e tutte le relative Ricerche? - Crea il contesto - Modifica il contesto - Metadati - Utilizza i nomi degli autori come termini di default per la ricerca, in modo che gli utenti siano in grado di trovare altri documenti dell'autore in questione. (ad esempio in un contesto "altri documenti") - Usa i nomi dell'autore come termini di default della ricerca e descrivi il contesto come una ricerca per le citazioni di un articolo. - Impostazioni RST per aprire questo contesto facendo doppio-click sulle parole.]]> - Usa dati di indicizzazione geografica come termini di ricerca di default. - Opzioni - Gestione - Strumenti di lettura - Sei sicuro di voler cancellare questa Ricerca? - Crea una ricerca - Modifica la ricerca - Versione selezionata - Abstract (mostra l'abstract dell'articolo). - Informazioni sull'autore (Mostra le informazioni biografiche inserite dall'autore) - Come citare l'articolo (Mostra la citazione bibliografica dell'articolo) - Definizioni dei termini (facendo doppio-click su una parola di un documento, questa verrà inviata a un dizionario) - Disabilita gli strumenti di lettura - Scrivi all'autore (conduce il lettore a un modulo per l'invio di email all'autore dell'articolo) - Segnala a un collega (conduce il lettore a un modulo per l'invio di email di segnalazione dell'articolo ad amici o colleghi) - Trova riferimenti - Versione per la stampa (fornisce una versione facile da stampare di un articolo). - Vedi i file supplementari (Mostra un elenco di eventuali altri file che l'autore ha inserito nel documento) - Metadati (Mostra i metadati utilizzati per l'indicizzazione dell'articolo) - Stato - La validazione è stata completata. - OK - {$url} non è valido. - Validazione delle URL degli strumenti di lettura - Validazione - Sei sicuro di voler cancellare questa Versione con tutti i relativi Contesti e Ricerche? - Sei sicuro di voler reimpostare tutte le Versioni ai loro valori di default? Se sì seleziona una Versione attiva nella pagina delle impostazioni. - Crea una Versione - Modifica Versione - Esporta - Importa Versione - Metadati - Ripristina le Versioni di default - Informazioni sull'autore - Formato della citazione - Come citare l'articolo - Online - Segnala l'articolo a un collega - Abbreviazione - AND - Se l'articolo è indicizzato in Google Scholar, potrebbe essere accompagnato da un link "Citato da X", che porta a un elenco di tutti i lavori in cui viene citato. Inoltre, Google Scholar elenca tutti gli item che citano titolo e autori. Per accedere a risorse online che sono disponibili solo attraverso la tua biblioteca, potresti avere la possibilità di andare in Scholar Preferences in Google Scholar e attivare Library Links per il tuo istituto. - Contesto - Se l'articolo è in HTML, facendo doppio click su ogni parola nel testo questa appare nella casella parole da definire. Puoi anche digitare o incollare una parola nella casella. Quindi usare la funzione di ricerca per trovare la definizione per quella parola. Per saperne ancora sulle risorse cercate, clicca sul simbolo di informazione. Queste risorse sono state selezionate per la loro rilevanza e il loro libero accesso a tutto o a una parte dei loro contenuti. - Descrizione - Ordine - Contesti - I termini di ricerca sono stati selezionati dall'autore(i). Questi possono essere modificati o cancellati da lettore, dato che due o tre brevi, precisi termini o frasi producono le migliori ricerche Booleane (AND). Per saperne di più sulle risorse cercate, premere su ABOUT. queste risorse sono state selezionate per la loro rilevanza e accesso libero a tutto o parte dei loro contenuti. - Termini di ricerca - Parola da definire - Titolo - Invia un'email all'autore - registrazione]]> - Il tuo messaggio è stato inviato. - Trovare i riferimenti - Google Scholar - Windows Live Academic - Cerca parole - Collaboratore - Copertura - Data - Descrizione - Dublin Core - Formato - Identificatore - Lingua - Editore - Relazione - Diritti - Fonte - Soggetto - Titolo - Tipo - Metadati di questo documento - Abstract - Copyright e autorizzazioni - Localizzazione geospaziale, periodo cronologico, campioni di ricerca (sesso, età, etc.) - (AAAA-MM-GG) - Materia/e - Formato del file - - Metadati PKP dei documenti - English=en - Agenzia organizzatrice, luogo - Rivista/conferenza titolo; vol., n. (anno) - Sponsor - Parola(e) chiave - File supplementari - Titolo del documento - Type - URI - Versione per la stampa - Strumenti di lettura - Risorse correlate - Politiche di revisione - Descrizione - Ricerche - Ordine - Ricerca - Dati da inviare - URL di ricerca - Suggerisci una fonte - Titolo - URL - Scarica - File supplementari - Metadati - Descrizione - Chiave - Lingua - Set di elementi collegati - Titolo - Versione - Metadati - Condivisione - Condivisione attiva - AddThis.com user name - Utilizza un menu a tendina - Impostazioni avanzate (opzionali) - Marchio - (separati da virgole)]]> - Lingua - Logo - Sfondo del logo - Colore del logo - Configura AddThis Inserisci un titolo per il commento - addthis.com, e copia/incolla il codice del pulsante Sharing qui sotto.]]> - Impostazioni di base - Stile del bottone - AddThis.com customization documentation per informazioni.]]> - Web - Vedi le politiche di revisione diff --git a/locale/nb_NO/admin.xml b/locale/nb_NO/admin.xml index b5fed9d74d0..f5cb459fe2f 100644 --- a/locale/nb_NO/admin.xml +++ b/locale/nb_NO/admin.xml @@ -46,15 +46,9 @@ Serverinformasjon PHP-versjon OS-plattform - Om beskrivelsen av nettstedet + Om beskrivelsen av nettstedet E-postadresse til hovedkontaktperson Navn på hovedkontaktperson - E-postadressen til hovedkontaktpersonen er påkrevet. - Navnet til hovedkontaktpersonen er påkrevet. - Du må skrive inn en minste passordlengde på minst 4 tegn. - En tittel er påkrevet. - Nettstedets logo - Ugyldig filformat for nettstedets logobilde. Tillatte filformat er .gif, .jpg, eller .png. Innledning Minste passordlengde tegn diff --git a/locale/nb_NO/common.xml b/locale/nb_NO/common.xml index 5805db918bf..4c2b91ae1d4 100644 --- a/locale/nb_NO/common.xml +++ b/locale/nb_NO/common.xml @@ -42,7 +42,6 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Æ Ø Å Oppnevnt Alternativ tekst - Vennligst oppgi en alternativ tekst for å sikre tilgang for brukere med leseprogram uten bildefunksjon. og Utfør handling Oppnevn @@ -121,7 +120,6 @@ Opprinnelig filnavn eller Andre - Tidsskriftside: topplogo Plugin Utgiver Journalfør @@ -151,7 +149,6 @@ Ikke igangsatt Uten tittel Oppdatert - Opplastet fil Last opp Opp URL @@ -334,8 +331,6 @@ Innstillinger Oppsett Element - {$supportName} for hjelp.]]> - Ingen fil opplastet, eller feil filtype! Vennligst fyll ut emnefelt for e-post. Vennligst skriv inn innholdet i e-posten. Er du sikker på at du vil sende inn dette skjemaet? diff --git a/locale/nb_NO/installer.xml b/locale/nb_NO/installer.xml index c57eecd042f..6faafc341dd 100644 --- a/locale/nb_NO/installer.xml +++ b/locale/nb_NO/installer.xml @@ -61,7 +61,6 @@ OAI-arkividentifikator Mappen for offentlige filer finnes ikke eller er ikke overskrivbar. Releasenotater - Sikkerhetsinnstillinger {$file}.]]> Merkede lokaliseringsfiler kan være ukomplette. OAI-innstillinger diff --git a/locale/nb_NO/manager.xml b/locale/nb_NO/manager.xml index a96401ee559..03d9219c285 100644 --- a/locale/nb_NO/manager.xml +++ b/locale/nb_NO/manager.xml @@ -139,10 +139,8 @@ Programutvidelser Leseverktøy Roller - Ugyldig hjemmesidetopptekst logobildeformat. Aksepterte format er .gif, .jpg, eller .png. Ugyldig hjemmesidebildeformat. Aksepterte format er .gif, .jpg, eller .png. Ugyldig hjemmesidetopptekst tittelbildeformat. Aksepterte format er .gif, .jpg, eller .png. - Ikke valgt Logging og revisjon Ugyldig sidetopptekst logobildeformat. Aksepterte format er .gif, .jpg, eller .png. Statistikk og rapporter @@ -268,14 +266,13 @@ Avgrens resultatene etter land, region og/eller by. Sponsor Tilleggsinnhold - Alt som blir skrevet her vil bli vist på din hjemmeside. - Opphavsrettsnotis - Krev at forfatterne aksepterer opphavsrettsnotisen. + Alt som blir skrevet her vil bli vist på din hjemmeside. + Opphavsrettsnotis + Krev at forfatterne aksepterer opphavsrettsnotisen. Forfatterinstruks Forfatterinstruksen bør inneholde format- og bibliografistandarder i tillegg til eksempler på vanlige referansestiler som skal brukes i manuskriptet. Interessekonflikter - Fagfeller vil bli bedt om å akseptere erklæringen om interessekonflikter som blir spesifisert under. - Ugyldig favicon-format. Aksepterte format er .ico, .png og .gif. + Favicon Synlig (for forfattere) Lag et nytt vurderingsskjema Fagfellers erklæring om interessekonflikter @@ -283,7 +280,6 @@ URL til en nettside som beskriver lisensen, om mulig. Innsendingsskjema Valideringsfeil: - Betalinger gjort direkte gjennom dette nettstedet vil bli oppgitt med valgt valuta. Rollevalg Vis rolletittel i bidragsyterlisten Tillat brukere å registrere seg @@ -402,11 +398,10 @@ Programutvidelser for metadata implementerer ytterligere metadata-standarder Gruppering av filtyper Hjemmesidebilde - Last opp et bilde som skal vises på hjemmesiden. + Last opp et bilde som skal vises på hjemmesiden. Beskrivelser - Tema - Nye tema kan bli installert fra fanen for programutvidelser på toppen av denne siden. - Administrasjon av sidespalter + Tema + Nye tema kan bli installert fra fanen for programutvidelser på toppen av denne siden. Logo Melding om innsendt manuskript Send en kopi til tidsskriftets hovedkontakt, som ble oppgitt i Oppsett trinn 1 @@ -415,7 +410,7 @@ Open Access-retningslinjer Om tidsskriftet gir åpen tilgang til alt publisert innhold, skriv inn en erklæring om tidsskriftets retningslinjer for Open Access Bunntekst - Legg inn bilder, tekst eller HTML-kode som du ønsker skal vises nederst på nettsiden. + Legg inn bilder, tekst eller HTML-kode som du ønsker skal vises nederst på nettsiden. Beskriv tidsskriftets retningslinjer og fremgangsmåter for fagfellevurdering for lesere og forfattere. Denne beskrivelsen vil ofte inkludere tallet på fagfeller som vanligvis vurderer et manuskript, kriteriene for vurdering, forventet tidsbruk på vurderingene og prinsippene for å velge fagfeller. Hovedkontakt Skriv inn kontaktinformasjon, vanligvis for en hovedredaktør, redaksjonsleder, eller administrativt personell, som kan vises på den offentlig tilgjengelige nettsiden. @@ -424,10 +419,9 @@ Uker tillatt for å ferdigstille fagfellevurderingen. Ikke send påminnelse Standardverdien kan bli endret for hver vurdering i løpet av den redaksjonelle prosessen. - Send en påminnelse om en fagfelle ikke har svart på vurderingsforespørselen innen en tid (dager) etter oppdragets frist. - Send en påminnelse om en fagfelle ikke har sendt inn en anbefaling innen en tid (dager) etter oppdragets frist. + Send en påminnelse om en fagfelle ikke har svart på vurderingsforespørselen innen en tid (dager) etter oppdragets frist. + Send en påminnelse om en fagfelle ikke har sendt inn en anbefaling innen en tid (dager) etter oppdragets frist. Standardfrist for fagfellevurdering - Vis en lenke til "Sikre en anonym fagfellevurdering" under opplasting Beskrivelse av relasjon til sponsorer og retningslinjer Eksempler: vitenskapelige foreninger, institutter, organisasjoner osv. Sponsorer blir vist offentlig. Erfarne nettutviklere kan laste opp en CSS-fil for videre å tilpasse nettsidens utseende. diff --git a/locale/nb_NO/reader.xml b/locale/nb_NO/reader.xml index 6900596e69a..81ed5dddad1 100644 --- a/locale/nb_NO/reader.xml +++ b/locale/nb_NO/reader.xml @@ -34,145 +34,5 @@ Tittel Vis alle kommentarer Fulltekst: - Legg til kommentar - Konfigurasjon - Er du sikker på at du vil slette denne kontekst og alle tilknyttede søk? - Opprett kontekst - Rediger kontekst - Metadata - Bruk forfatternavn som default søkeord for å hjelpe brukere med å finne andre arbeider av forfatterene for dette elementet (for eks. for en "Andre arbeider"-kontekst) - Bruk forfatternavn som default søkeord, og beskriv konteksten som søk etter siteringer av artikkelen. - RST innstillinger for å tillate å dobbelklikke på ord for å åpne denne konteksten.]]> - Bruk greografiske indekseringsdata som default søkeord. - Valg - Administrasjon - Leseverktøy - Er du sikker på at du vil slette dette søket? - Opprett søk - Rediger søk - Relaterte elementer - Sammendrag (viser elementets sammendrag). - Om forfatteren (viser biografiske opplysninger forfatteren har skrevet inn). - Hvordan element skal siteres (gir bibliografiske detaljer for elementet). - Søk på ord (leseren kan dobbelklikke på ord i et element, og ordet blir sendt til et ordbokssøk). - Slå av relaterte elementer - E-post til forfatteren (åpner en e-postmal med forfatterens e-post). - Send beskjed til en kollega (åpner en e-postmal med lenke til elementet). - Finn henvisninger - Utskriftsversjon (Åpner en utskriftsvennlig versjon av elementet). - Tilleggsfiler (viser liste over de filene forfatteren har lagt ved manuskriptet). - Metadata for indeksering (viser elementets indekseringsmetadata, som er gitt av forfatteren og systemet). - Status - Validering fullført. - OK - {$url} er ikke gyldig. - Valider URL for leseverktøy - Valider - Er du sikker på at du vil slette denne versjonen og alle tilknyttete kontekster og søk? - Er du sikker på at du vil gjenopprette alle versjoner til default? NB: Denne handlingen kan ikke omgjøres. I så fall kommer du til å måtte velge en aktiv versjon på Innstillinger-siden. - Opprett versjon - Rediger versjon - Eksporter - Importer versjon - Metadata - Gjenopprett versjonene til default - Om forfatteren - Siteringsformat - Hvordan element skal siteres - Online - Send beskjed til kollega - Fork. - AND - Hvis artikkelen er indeksert i Google Scholar, kan den være vedlagt en "Cited by X" lenke, som fører til en liste av arbeider der artikkelen er sitert. Google Scholar kommer dessuten til å liste alle elementer både etter tittelen og forfatternavnet. For å få tilgang til nettressurser som du bare har tilgangsrett til gjennom biblioteket ditt, kan du gå til Scholar Preferences i Google Scholar og aktivere bibliotekslenker for din institusjon. - Kontekst - Hvis elementet er en HTML fil (heller enn en PDF), kan du ved å dobbelklikke et ord i teksten hente ordet til Ordboksøk-boksen. Du kan også skrive eller lime inn ord i boksen. For å få vite mer om søkeressursene, klikk på OM. Disse ressursene er valgt for sin relevans og frie tilgang til noe eller alt innhold. - Beskrivelse - Ordne - Kontekster - Søkeordene er valgt av forfatteren(e). De kan endres eller slettes av leseren, fordi to eller tre korte, presise ord eller fraser gir de beste Boolske (AND) søkene. For å få vite mer om søkeressursene, klikk på OM. Disse ressursene er valgt for sin relevans og frie tilgang til noe eller alt innhold. - Søkeord - Søkeord til ordbokssøk - Tittel - E-post til forfatteren - registrering]]> - Din melding er sendt. - Finn henvisninger - Google Scholar - Windows Live Academic - Ordboksøk - Bidragsyter - Dekning - Dato - Beskrivelse - Dublin Core - Format - Identifikator - Språk - Utgiver - Sammenheng - Rettigheter - Kilde - Emne - Tittel - Type - Metadata for dette dokumentet - Sammendrag - Copyright og lisenser - Dekning i både tid og rom, eller karakteristika ved materialet/utvalget - (ÅÅÅÅ-MM-DD) - Fag - Filformat - Status og genre - PKP metadataelement - Norsk=no - Organisasjon, sted - Tidsskrift/konferansetittel; vol., nr. (år) - Sponsor(er) - Emneord - Tilleggsfiler - Dokumenttittel - Type - Universal Resource Indicator - Utskriftsversjon - Leseverktøy - Relaterte elementer - Om fagvurderingsprosessen - Beskrivelse - Søk - Ordne - Søk - Send inn data - Søk URL - Foreslå en kilde - Tittel - URL - Last ned - Tilleggsfiler - Indekseringsmetadata - Beskrivelse - Nøkkel - Lokalinnstilling - Relaterte elementsett - Tittel - Versjon - Indekseringsmetadata En kommentartittel er påkrevd. - Deling - Deling er slått på - addthis.com, og kopiere inn nødvendig (program-)kode for Delingsknapp nedenfor.]]> - Basisinnstillinger - Brukernavn hos AddThis.com - Knappestil - Bruk rullegardinmeny - Avanserte innstillinger (valgfritt) - AddThis.com tilpasningsdokumentasjon for informasjon.]]> - Merke - (kommaseparert liste)]]> - Språk - Logo - Logobakgrunn - Logofarge - Konfigurer AddThis - Se retningslinjer for fagfellevurdering i dette tidsskriftet - Internett diff --git a/locale/nl_NL/admin.xml b/locale/nl_NL/admin.xml index b66fd941609..4b2357c5c3b 100644 --- a/locale/nl_NL/admin.xml +++ b/locale/nl_NL/admin.xml @@ -46,15 +46,9 @@ Server informatie PHP versie Besturingssysteem - Over de site-beschrijving + Over de site-beschrijving E-mail van de eerste contactpersoon Naam van de eerste contactpersoon - Het e-mail adres van de eerste contactpersoon is verplicht. - De naam van de eerste contactpersoon is verplicht. - U moet een wachtwoordlengte van minimaal 4 tekens opgeven. - Een titel is vereist. - Site logo - Onjuist bestandstype voor het site logo. Geldige types zijn .gif, .jpg, en .png. Introductie Minimale wachtwoordlengte tekens diff --git a/locale/nl_NL/common.xml b/locale/nl_NL/common.xml index 2d7c9051fd4..b5b126ed334 100644 --- a/locale/nl_NL/common.xml +++ b/locale/nl_NL/common.xml @@ -42,7 +42,6 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Toegewezen Alternatieve tekst - Geef de alternatieve tekst voor deze afbeelding om de toegankelijkheid voor gebruikers met tekst-browsers of hulpapparaten te waarborgen en Actie uitvoeren Wijs toe @@ -121,7 +120,6 @@ Originele bestandsnaam of Overig - Paginakop logo Plugin Uitgever Vastleggen @@ -151,7 +149,6 @@ Onbekend Zonder titel Bijgewerkt - Laad bestand Laden Omhoog URL @@ -324,7 +321,6 @@ Herinnering Element Ongelezen - Geen bestand geladen of onbekend bestandstype! Plugins Weet u zeker dat u dit formulier wilt insturen? een e-mail adres is verplicht @@ -345,7 +341,6 @@ Remote RemoteURL Uitloggen - {$supportName}voor assistentie.]]> Gegevens Inzendingen Publiek menu diff --git a/locale/nl_NL/installer.xml b/locale/nl_NL/installer.xml index 926113f9829..c59e09dbd31 100644 --- a/locale/nl_NL/installer.xml +++ b/locale/nl_NL/installer.xml @@ -61,7 +61,6 @@ OAI repository identificatie De map met publieke bestanden bestaat niet of er mag niet in geschreven worden. Over deze versie - Security instellingen {$file}.]]> De gemarkeerde talen zijn mogelijk incompleet OAI instellingen diff --git a/locale/nl_NL/manager.xml b/locale/nl_NL/manager.xml index d258e791cd5..05318bc86b5 100644 --- a/locale/nl_NL/manager.xml +++ b/locale/nl_NL/manager.xml @@ -139,10 +139,8 @@ Systeemplugins Leesgereedschappen Rollen - Onbruikbaar bestandsformaat voor het home-pagina koptekst-logo. Bruikbaar zijn .gif, .jpg of .png. Onbruikbaar bestandsformaat voor de home-pagina afbeelding. Bruikbaar zijn .gif, .jpg of .png. Onbruikbaar bestandsformaat voor de home-pagina koptitel. Bruikbaar zijn .gif, .jpg of .png. - Niet geselecteerd Logboek en controle Onbruikbaar bestandsformaat voor het paginakop-logo. Bruikbaar zijn .gif, .jpg of .png. Kies er een @@ -175,7 +173,6 @@ U staat op het punt deze e-mail in te schakelen. Wilt u deze bewerking bevestigen? Als u de sjablonen herstelt gaan alle modificaties aan de sjablonen verloren. Wilt deze bewerking bevestigen? Zoeken op naam - Beheer van de sidebar Metadata plugins Sjabloon berichtinhoud Als u dit sjabloon herstelt, wordt de inhoud teruggezet naar de standaardwaarde. Al uw aanpassingen gaan verloren. Wilt u deze bewerking bevestigen? diff --git a/locale/nl_NL/reader.xml b/locale/nl_NL/reader.xml index 139693c8614..7de77aaf1d1 100644 --- a/locale/nl_NL/reader.xml +++ b/locale/nl_NL/reader.xml @@ -34,145 +34,5 @@ Titel Bekijk alle reacties Volledige tekst: - Commentaar toevoegen - Configuratie - Weet u zeker dat u deze context en de daarmee geassocieerde zoekacties wilt verwijderen? - Maak context aan - Bewerk context - Metadata - Gebruik auteursnamen als standaard zoekterm om gebruikers andere werken van de auteurs van dit item te vinden (bv. voor een "Andere werken" context) - Gebruik auteursnamen als standaard zoektermen en beschrijf de context als zoeken naar citaties van het artikel. - RST instellingen om het mogelijk te maken dat dubbelklikken op woorden deze context opent.]]> - Gebruik geografische indexgegevens als standaard zoektermen. - Opties - Beheer - Leesgereedschappen - Weet u zeker dat u deze zoekvraag wilt verwijderen? - Zoekvraag aanmaken - Bewerk zoekvraag - Gerelateerde gegevens - Samenvatting (toont de samenvatting van het item). - Over de auteur (toont de biografie die de auteur heeft opgegeven). - Hoe te citeren (levert bibliografische details). - Zoek termen op (laat lezer dubbelklikken op ieder woord in een item en stuurt dat woord naar een woordenboek). - Gerelateerde items uitschakelen - E-mail de auteur (leidt naar een e-mail sjabloon met het e-mail adres van de auteur). - Stuur naar een collega (leidt naar een e-mail sjabloon met een link naar het item). - Zoek referenties - Afdrukversie (levert een versie die geschikt is voor afdrukken). - Aanvullende bestanden (Toont de lijst bestanden die de auteur aan de inzending heeft toegevoegd). - Metadata indexeren (toont de metadata voor indexeren zoals geleverd door de auteur en het systeem). - Status - Validatie gereed. - OK - {$url} is niet geldig. - Valideer URL's voor leesgereedschappen - Valideer - Weet u zeker dat u deze versie en alle geassocieerde contexten en zoekacties wilt verwijderen? - Wet u zeker dat u alle versies naar hun standaardwaarden terug wilt zetten? Als u dat doet moet een actieve versie kiezen op de Instellingen pagina. - Versie aanmaken - Bewerk versie - Exporteer - Importeer versie - Metadata - Herstel versies naar standaardwaarden - Over de Auteur - Citatie formaat - Hoe een item te citeren - Online - Bericht aan een collega - Afk. - EN - Als het artikel geïndexeerd is in Google Scholar kan het vergezeld gaan van een "Geciteerd door X" link, wat leidt naar een lijst werken die het citeren. Google Scholar toont ook alle items die de titel en auter citern. Om de online bronnen te benaderen die alleen toegankelijk zijn via uw bibliotheek kunt u naar Google Scholar Preferences in Google Scholar gaan en de Library Links voor uw instituut activeren. - Context - Als het item een HTML bestand is (en niet een PDF), doet dubbelklikken op een woord van de tekst het verschijnen in het te-definiëren-woord veld. Verder kunnen woorden in het veld ingevoerd of geplakt worden. Klik op OVER voor meer informatie over de doorzochte bronnen. Deze bronnen zijn uitgekozen vanwege hun relevantie en open (gratis) toegang tot alle of een gedeelte van hun inhoud. - Beschrijving - Volgorde - Contexten - De zoektermen zijn geselecteerd door de auteur(s). Ze kunnen gewijzigd of verwijderd worden door de lezer als twee of drie korte precieze termen of zinnen die de beste booleaanse (EN) zoekvraag opleverden. Klik op OVER voor meer informatie over de doorzochte bronnen. Deze bronnen zijn uitgekozen vanwege hun relevantie en open (gratis) toegang tot alle of een gedeelte van hun inhoud. - Zoektermen - Te definiëren woord - Titel - E-mail de auteur - registratie]]> - Uw bericht is verstuurd. - Referenties vinden - Google Scholar - Windows Live Academic - Termen opzoeken - Meewerker - Dekking - Datum - Beschrijving - Dublin Core - Formaat - Identificatie - Taal - Uitgever - Relatie - Rechten - Bron - Onderwerp - Titel - Type - Metadata voor dit document - Samenvatting - Auteursrecht en permissies - Geo-spatiale locatie, chronologische periode, steekproef (geslacht, leeftijd, enz.) - (JJJJ-MM-DD) - Discipline(s) - Bestandsformaat - - PKP Metadata Items - Engels=en - Organisator, locatie - Tijdschrift/conferentie titel; vol., no. (jaar) - Sponsor(s) - Trefwoord(en) - Aanv. bestanden - Titel van het document - Type - Universal Resource Indicator - Afdrukversie - Leesgereedschappen - Gerelateerde items - Reviewbeleid - Beschrijving - Zoekvragen - Volgorde - Zoek - Ingevoerde gegevens - Zoek URL - Suggereer een bron - Titel - URL - Download - Aanvullende bestanden - Metadata voor indexering - Beschrijving - Sleutel - Taal - Sets gerelateerde items - Titel - Versie - Indexeren van metadata - Geavanceerde instellingen (optioneel) - Merk - Taal - Logo - Logo-achtergrond - Logo kleur Een titel is verplicht - Delen - Delen ingeschakeld - Basisinstellingen - Knop-stijl - Gebruik drop-down menu - (lijst met komma's als scheider)]]> - AddThis.com gebruikersnaam - Configureer AddThis - AddThis.com customization documentation voor naslag.]]> - addthis.com en de Sharing knop code hieronder kopiëren en plakken.]]> - Web - Bekijk reviewbeleid diff --git a/locale/pl_PL/admin.xml b/locale/pl_PL/admin.xml index 1ee7bb74b7e..8bbd0911aa5 100644 --- a/locale/pl_PL/admin.xml +++ b/locale/pl_PL/admin.xml @@ -44,15 +44,9 @@ Informacje dotyczące serwera Wersja PHP System operacyjny - Opis strony + Opis strony Adres e-mail głównego administratora Nazwa głównego administratora - Adres e-mail głównego administratora jest wymagany. - Nazwa głównego administratora jest wymagana. - Musisz podać hasło o długości co najmniej 4 znaków. - Tytuł jest wymagany. - Logo strony - Niepoprawny format pliku. Akceptowane formaty to GIF, JPG, lub PNG. Wprowadzenie Minimalna długość hasła Język strony diff --git a/locale/pl_PL/api.xml b/locale/pl_PL/api.xml index c40ca1285b3..6587d10c796 100644 --- a/locale/pl_PL/api.xml +++ b/locale/pl_PL/api.xml @@ -16,7 +16,7 @@ Możesz wyświetlić tylko nieopublikowane, zgłoszone teksty do których zostałeś przydzielony. Nie możesz usunąć przesłanego tekstu, do którego nie zostałeś przydzielony(a) w tym kontekście. Nie posiadasz uprawnień do usunięcia tego przesłanego tekstu. - Zasób nie został odnaleziony. + Zasób nie został odnaleziony. Zapytanie nie mogło zostać spełnione, ponieważ brakuje wymaganych informacji. Zapytanie o wolumen, numer lub rok jest niepoprawne. Wystąpił nieznany błąd. Przeładuj stronę i spróbuj ponownie. diff --git a/locale/pl_PL/common.xml b/locale/pl_PL/common.xml index 96d6475d329..107052736c5 100644 --- a/locale/pl_PL/common.xml +++ b/locale/pl_PL/common.xml @@ -37,7 +37,6 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Przypisany Alternatywny tekst - Proszę wpisać zawartość obrazka w formie tekstu. oraz Zastosuj działanie Przypisz @@ -134,7 +133,6 @@ Nazwa pliku lub Inny - Nagłówek strony Wtyczka Wtyczka "{$pluginName}" została włączona. Wtyczka "{$pluginName}" zosała wyłączona. @@ -170,7 +168,6 @@ Niewprowadzone Bez nazwy Zaktualizowany - Przesłany plik Prześlij Plik nie może zostać przesłany. Spróbuj ponownie lub skontaktuj się z administratorem. W górę @@ -328,7 +325,6 @@ Zdalny URL Reset Nieczytany - Żaden plik nie został przesłany lub niepoprawny typ pliku! Wtyczki Metryka Zlicz @@ -396,7 +392,6 @@ Narzędzie do przesyłania plików jest ładowane. Jeżeli nie pojawi się po dłuższej chwili istnieje prawdopodobieństwo, że nie jest wspierane przez Twoją przeglądarkę. Gdyby tak się stało, skontaktuj się z administratorem w celu uzyskania pomocy. Strona domowa Elementów na stronę - Favicon Uwagi (żółty: nowe; niebieski: przeczytane; szary: brak) Powiadomiony: {$dateNotified} Strona {$pageNumber} @@ -417,7 +412,6 @@ Podtytuł Element Data przesłania - Obraz strony głównej Prześlij plik Zamień plik Przeciągnij i upuść plik tutaj, aby rozpocząć przesyłanie @@ -427,7 +421,6 @@ Nadawca Adres e-mail nadawcy Podany URL jest niepoprawny. Sprawdź adres i spróbuj ponownie. - Formularz nie został przesłany poprawnie. Plik jest wymagany. Poprzedni Następny diff --git a/locale/pl_PL/manager.xml b/locale/pl_PL/manager.xml index 8ed52d63f27..ca278d9dcad 100644 --- a/locale/pl_PL/manager.xml +++ b/locale/pl_PL/manager.xml @@ -146,10 +146,8 @@ Zainteresowania badawcze Role Wystąpił błąd podczas usuwania tego pliku. - Niepoprawny plik obrazu dla logo. Akceptowane formaty to GIF, JPG lub PNG. Niepoprawny plik dla obrazu strony głównej. Akceptowane formaty to GIF, JPG lub PNG. Niepoprawny plik dla obrazu tytułu nagłówka. Akceptowane formaty to GIF, JPG lub PNG. - Niezaznaczone Logowanie i audyt Niepoprawny plik obrazu dla logo. Akceptowane formaty to GIF, JPG lub PNG. @@ -180,8 +178,6 @@ Jeżeli usuniesz szablon, wszystkie wiadomości będą zresetowane do swojej domyślnej wartości. Czy chcesz kontynuować? Wyszukaj po imieniu Użyj formularza, aby określić maksymalną liczbę wartości dla wyszukiwanych terminów. Formularz sugeruje uśrednione wartości dla pól. - Podaj zainteresowania recenzenta, oddzielone przecinkami... - Zarządzanie paskiem bocznym Miasto Region Wtyczki metadanych @@ -241,20 +237,19 @@ Filtruj wyniki wg kraju, regionu oraz/lub miasta. Instytucja finansująca Dodatkowa zawartość - Treść tego pola zostanie wyświetlona na stronie głównej. - Informacja o prawach autorskich - Wymagaj od autorów, aby akceptowali informację o prawach autorskich jako element procesu zgłoszenia tekstu. + Treść tego pola zostanie wyświetlona na stronie głównej. + Informacja o prawach autorskich + Wymagaj od autorów, aby akceptowali informację o prawach autorskich jako element procesu zgłoszenia tekstu. Wytyczne dla autorów Wytyczne powinny zawierać opis standardów formatowania bibliografii oraz ogólnego formatowania tekstu w plikach zgłaszanego tekstu. Konflikt interesów - Recenzenci zostaną poproszeni o potwierdzenie, że nie występuje konflikt interesów. - Nieprawidłowy format favicony. Akceptowane formaty to ICO, PNG oraz GIF. + Favicon Grupowanie plików Obraz dla strony głównej - Prześlij obraz wyświetlany na stronie głównej. + Prześlij obraz wyświetlany na stronie głównej. Opisy - Motyw - Nowe motywy mogą zostać zainstalowane w zakładce Wtyczki dostępnej w nagłówku tej strony. + Motyw + Nowe motywy mogą zostać zainstalowane w zakładce Wtyczki dostępnej w nagłówku tej strony. Pasek boczny Logo Powiadomienia oraz zgłoszenia @@ -273,11 +268,9 @@ Liczba tygodni na ukończenie recenzji Nigdy nie przypominaj Domyślne ustawienia mogą zostać zmodyfikowane dla każdej recenzji w trakcie procesu redakcji. - Wyślij przypomnienie, jeśli recenzent nie odpowiedział na prośbę o wykonanie recenzji przez liczbę dni: - Wyślij przypomnienie, jeśli recenzent nie przesłał rekomendacji przekraczając termin o liczbę dni: + Wyślij przypomnienie, jeśli recenzent nie odpowiedział na prośbę o wykonanie recenzji przez liczbę dni: + Wyślij przypomnienie, jeśli recenzent nie przesłał rekomendacji przekraczając termin o liczbę dni: Domyślne ustawienia czasu na wykonanie recenzji - Wyświetl link do "Zapewnienie ślepej recenzji" podczas przesyłania - Sortowanie wg elementów Instytucje finansujące oraz zasady Przykłady: towarzystwa naukowe, wydziały uczelni, instytucje współpracujące itp. Instytucje finansujące są widoczne publicznie. Doświadczeni developerzy mogą przesłać plik CSS, aby wprowadzić zmiany w widoku strony niedostępne z poziomu OJS. @@ -356,7 +349,6 @@ Nie wybrano metod płatności Metoda płatności Waluta - Płatności realizowane przez stronę będą realizowane w wybranej walucie. Ustawienia roli Wyświetl nazwy ról na liście współpracowników Pozwól na samorejestrację użytkowników diff --git a/locale/pl_PL/reader.xml b/locale/pl_PL/reader.xml index f96fd695946..254e8b586a5 100644 --- a/locale/pl_PL/reader.xml +++ b/locale/pl_PL/reader.xml @@ -34,148 +34,4 @@ Tytuł Zobacz wszystkie komentarze Pełny tekst: - Dodaj komentarz: - Konfiguracja - Czy na pewno chcesz usunąć treść i związane z nią wyniki wyszukiwania? - Napisz tekst - Edytuj tekst - Metadane - Użyj nazwiska autora jako domyślnego terminu wyszukiwawczego. Umożliwi to odnalezienie innych prac autora, np. poprzez funkcję "inne prace" - Użyj nazwiska autora jako domyślnego terminu wyszukiwawczego i wskaż jako kontekst wyszukiwanie cytowań artykułu. - RST Settings, aby możliwe było uruchamianie kontekstu po podwójnym kliknięciu na słowo.]]> - Wykorzystaj indeksowane dane geograficzne jako domyślne terminy wyszukiwawcze. - Opcje - Zarządzanie - - Współdzielenie - Współdzielenie włączone - Aby umożliwić czytelnikom współdzielenie się artykułami opublikowanymi w czasopiśmie, zarejestruj się na stronie addthis.com, a następnie skopiuj i wklej poniżej kod pobrany ze strony. - - Ustawienia podstawowe - Nazwa użytkownika w AddThis.com - Styl przycisku - Użyj menu rozwijanego - Ustawienia zaawansowane (opcjonalnie) - AddThis.com dokumentację dostosowania do pozycji bibliograficznej.]]> - Brand - (pozycje na liście oddzielone przecinkami)]]> - Język - Logo - Tło logo - Kolor logo - - Narzędzia dla czytelników - Czy na pewno chcesz usunąć wyniki wyszukiwania? - Utwórz pytanie wyszukiwawcze - Edytuj pytanie wyszukiwawcze - Powiązane pozycje - Abstrakt (prezentuje abstrakt tekstu). - O autorze (prezentuje biogram podany przez autora). - Jak cytować (dostarcza opis bibliograficzny tekstu). - Wyszukaj słowa (włącza możliwość wyszukania przez czytelnika dowolnego słowa z pozycji, po podwójnym kliknięciu słowo jest kopiowane do słownika). - Wyłącz powiązane pozycje - E-mail do autora (umożliwia przesłanie wiadomości na adres e-mail autora). - Powiadom współpracownika (umożliwia przesłanie do dowolnej osoby wiadomości e-mail z linkiem do pozycji). - Znajdź pozycję w bazie. - Wersja do wydruku (wyświetla wersję tekstu do wydruku). - Dodatkowe pliki (wyświetla listę plików przesłanych przez autora). - Indeksowane metadane (wyświetla indeksowane metadane tekstu). - Status - Skonfiguruj AddThis - Uwierzytelnianie ukończone. - OK - {$url} nie jest poprawny. - Potwierdź URL dla Narzędzi dla czytelników - Uwierzytelnij. - Czy na pewno chcesz usunąć tę wersje i wszystkie powiązane z nią wyniki wyszukiwania? - Czy na pewno chcesz przywrócić ustawienia domyślne dla wszystkich wersji? Operacja jest nieodwracalna. Jeżeli tak, musisz wybrać aktywną wersję na stronie z ustawieniami. - Stwórz wersję - Edytuj wersję - Eksportuj - Importuj wersję - Metadane - Przywróć ustawienia domyślne dla wersji - O autorze - Format cytowania - Jak cytować publikację - Online - Web - Powiadom współpracownika - Skrót - ORAZ - Jeżeli artykuł jest zaindeksowany w Google Scholar, można do niego dołączyć link "Cytowany przez X", który kieruje do listy prac cytujących artykuł. Google Scholar zawiera również zestawienie prac cytowanych w pracy tego autora. Dostęp online do tych zasobów jest możliwy tylko poprzez bibliotekę naukową, możesz przejść do Scholar Preferences w serwisie Google Scholar i aktywować Library Links dla swojej instytucji. - Treść - Jeżeli plik jest dostępny w formacie HTML, podwójne kliknięcie na dowolne słowo spowoduje uruchomienie pola Słowo-do-zdefiniowania. Jeżeli nie jest, słowa mogą być skopiowane i wklejone do pola. Aby dowiedzieć się więcej o wyszukiwaniu w zasobach, kliknij ABOUT. Zasoby mogą być wybierane wg odpowiedniości lub dostępu (otwartemu, wolnemu) do całej treści lub jej części. - Opis - Porządek - Konteksty - Terminy wyszukiwawcze zostały wybrane przez autora(ów). Mogą być zmienione lub usunięte przez czytelnika, ponieważ dwa lub trzy krótkie terminy lub frazy powiązane za pomocą operatora ORAZ dają najlepsze wyszukiwania. Aby dowiedzieć się więcej o wyszukiwaniu w zasobach, kliknij O wyszukiwaniu. Zasoby mogą być wybierane wg odpowiedniości lub dostępu (otwartemu, wolnemu) do całej treści lub jej części. - Wyszukaj w zasadach - Słowo do zdefiniowania - Tytuł - E-mail do autora - rejestracja]]> - Wiadomość została wysłana. - Znajdź odwołania - Google Scholar - Windows Live Academic - Spójrz na zasady - Współpraca - Pokrycie - Data - Opis - Dublin Core - Format - Identyfikator - Język - Wydawca - Relacje - Prawa - Źródło - Przedmiot - Tytuł - Typ - Metadane dla dokumentu - Abstrakt - Prawa autorskie i zasady wykorzystania - Dane geolokalizacyjne, zasięg chronologiczny, próba badawcza (płeć, wiek itd.) - (RRRR-MM-DD) - Dyscyplina(y) - Format pliku - Status i rodzaj - Pozycje metadanych PKP - Polish=PL - Instytucja, miejsce - Tytuł czasopisma/konferencji; tom, nr (rok) - Instytucja(e) finansująca(e) - Klasyfikacja przedmiotowa - Słowo(a) kluczowe - Pliki pomocnicze - Tytuł dokumentu - Typ - Uniform Resource Identifier - Wersja drukowana - Narzędzia dla czytelników - Powiązane pozycje - Zasady recenzowania - Opis - Wyszukiwania - Porządek - Wyszukaj - Opublikuj dane - Wyszukaj wg WWW - Zaproponuj źródło - Tytuł - WWW - Pobierz - Pliki pomocnicze - Indeksowane metadane - Opis - Klucz - Lokalizacja - Zestawy pozycji powiązanych - Tytuł - Wersja - Indeksowane metadane - Zasady recenzji diff --git a/locale/pt_BR/admin.xml b/locale/pt_BR/admin.xml index f5063aceb2b..bc77aed48cf 100644 --- a/locale/pt_BR/admin.xml +++ b/locale/pt_BR/admin.xml @@ -65,20 +65,14 @@ Versão do PHP Sistema Operacional Configurações - Descrição sobre o Portal + Descrição sobre o Portal E-mail do Contato Principal Nome do contato principal - O e-mail do contato principal é obrigatório. - O nome do contato principal é obrigatório. - Informe uma quantidade mínima de caracteres para senhas. - Um título é obrigatório. Sua instalação está configurada para gravar mais de uma métrica de uso. Estatísticas de uso serão mostradas de diferentes modos. Existem casos onde uma única estatística de uso deve ser usada, por exemplo: para mostrar uma lista ordenada das submissões mais usadas ou para rankear resultados de busca. Por favor selecione uma das métricas configuradas como padrão. - Logo do Portal - Formato de imagem inválido. Formatos aceitáveis são .gif, .jpg ou .png. Verifique as configurações de mime_type, permissões e dono de pasta, e tamanho de arquivo permitido. Introdução Tamanho mínimo de senha caracteres @@ -130,5 +124,5 @@ Uso (processando todos os arquivos dentro de um diretório): {$scriptName} camin "{$utilPath}" retornou o seguinte erro após executado: {$output} Erro: não foi possível executar "{$utilPath}". Cheque a configuração de {$utilVar} em config.inc.php. Logotipo do Site - Sem idiomas disponíveis para download. + Sem idiomas disponíveis para download. diff --git a/locale/pt_BR/api.xml b/locale/pt_BR/api.xml index 1d1e20f8cef..6842d207e95 100644 --- a/locale/pt_BR/api.xml +++ b/locale/pt_BR/api.xml @@ -16,7 +16,7 @@ Você pode ver apenas submissões não publicadas as quais foi designada. Você não pode apagar uma submissão que não está associada a esse contexto. Você não tem permissões para apaar essa submissão. - O recurso requisitado não foi encontrado. + O recurso requisitado não foi encontrado. Seu pedido não pode ser atendido pois informação requerida está faltando. O volume requisitado, número ou ano não é válido. Ocorreu um erro não esperado. Por favor recarregue a página e tente novamente. Se o erro persistir contacte o suporte técnico. diff --git a/locale/pt_BR/common.xml b/locale/pt_BR/common.xml index 07049ceca59..077ec97a17b 100644 --- a/locale/pt_BR/common.xml +++ b/locale/pt_BR/common.xml @@ -56,7 +56,6 @@ da um o e um ou nem mas é se então senão quando na de por sobre para em fora sobre ao dentro com Já designado Texto alternativo - Informe um texto alternativo para a imagem, assegurando acessibilidade a usuários com navegadores de texto ou equipamentos de auxílio a necessidades especiais. e Aplicar ação Designar @@ -158,7 +157,6 @@ Iniciar Em andamento Itens por página - Favicon Palavras-chave Idioma Idiomas @@ -190,12 +188,13 @@ ok Opções Ordem + Aumentar posição de {$itemTitle} + Diminuir posição de {$itemTitle} Nome original do documento ou Outro Atrasado Página {$pageNumber} - Logo do cabeçalho da página {$percentage}% Plugin O Plugin "{$pluginName}" foi habilitado. @@ -251,12 +250,8 @@ Sem título Atualizado Data de envio - Arquivo enviado Transferir Não foi possível enviar o arquivo. Por favor, tente novamente ou entre em contato com o administrador se o problema persistir. - {$supportName} para auxílio.]]> - Nenhum arquivo enviado ou tipo de arquivo inválido! - Imagem da Homepage Acima/Subir Enviar arquivo Alterar arquivo @@ -539,7 +534,6 @@ A validação captcha não está configurada corretamente. Está faltando a chave secreta. Contate o administrador. A configuração do captcha deste site não está configurada corretamente. A chave secreta é inválida. Baixar PDF - O formulário não foi enviado corretamente. Adicionar Nota Ir para o conteúdo principal Ir para o menu de navegação principal diff --git a/locale/pt_BR/manager.xml b/locale/pt_BR/manager.xml index 47ad32f14c3..2145b4e8528 100644 --- a/locale/pt_BR/manager.xml +++ b/locale/pt_BR/manager.xml @@ -145,11 +145,8 @@ Solicitar alteração de senha no próximo acesso ao sistema. Ferramentas para Leitura Papéis - Formato de imagem inválido para o logo no cabeçalho da página inicial. Formatos aceitáveis são .gif, .jpg ou .png. Verifique as configurações de mime_type, permissão e dono de pasta, e tamanho de arquivo permitido. Formato de imagem inválido para a imagem da página inicial. Formatos aceitáveis são .gif, .jpg ou .png.Verifique as configurações de mime_type, permissão e dono de pasta, e tamanho de arquivo permitido. Formato de imagem inválido para o título no cabeçalho da página inicial. Formatos aceitáveis são .gif, .jpg ou .png. Verifique as configurações de mime_type, permissão e dono de pasta, e tamanho de arquivo permitido. - Barra esquerda - Não marcados Controle e Auditoria Formato de imagem inválido ou falha no envio para logo no cabeçalho de páginas internas. Formatos aceitáveis são .gif, .jpg ou .png. Verifique as configurações de mime_type, permissão e dono de pasta, e tamanho de arquivo permitido. @@ -186,7 +183,6 @@ Caso restaure este modelo, todos os dados da mensagem retornarão ao valor original, perdendo todas as alterações. Deseja confirmar esta operação? Buscar por Nome Use o formulário a seguir para definir os valores máximos para os termos pelos quais deseja buscar. O formulário está preenchido previamente com médias calculadas dos campos. - Gerenciamento da barra lateral Plugins de metadados Plugins de metadados implementam padrões adicionais de metadados. Plugins de Formatos de Metadados OAI @@ -230,17 +226,16 @@ Há casos em que uma única estatística de uso devem ser utilizada, por exemplo A seguinte URL pode ser usado para gerar o relatório com as definições atuais. Basta copiar ela e colar em seu navegador. Você pode usar seus favoritos para armazenar a URL do seu gerador de relatório personalizado. Restringir resultados por país, região e / ou cidade. Conflito de Interesses - Os avaliadores serão convidados a cumprir com a política de conflito de interesses especificada abaixo. Agrupamento por tipo de arquivo Tempo dado para respostas dos avaliadores (semanas) Tempo para término da avaliação (semanas) Nunca lembrar - Envie um lembrete se um avaliador não responder a um pedido de avaliação dentro do seguinte tempo (dias): - Envie um lembrete se um avaliadores não apresentar um parecer dentro do seguinte tempo (dias): + Envie um lembrete se um avaliador não responder a um pedido de avaliação dentro do seguinte tempo (dias): + Envie um lembrete se um avaliadores não apresentar um parecer dentro do seguinte tempo (dias): Você pode adicionar uma nota descrevendo sua política e relacionamento com o patrocinador, que irá aparecer junto à lista de patrocinadores na página Sobre. Você pode fazer upload do arquivo de folha de estilo adicional (CSS) para alterar a aparência. - Tema - Escolha um tema a partir da lista + Tema + Escolha um tema a partir da lista Opções de Acesso ao Site Plugins de Identificação Pública Estes plugins implementam o suporte para identificadores públicos. @@ -324,7 +319,6 @@ Há casos em que uma única estatística de uso devem ser utilizada, por exemplo Defina uma abreviatura única para o papel. Defina um nível de permissão para o papel. Defina um estágio a ser associado. - Os pagamentos feitos diretamente através deste site serão denominadas na moeda selecionada. Você está prestes a remover este papel deste contexto. Esta operação também vai apagar as definições relacionadas e todas as atribuições de usuários para este papel. Você quer continuar? Um arquivo de biblioteca é necessária. Certifique-se que você escolheu e enviou um arquivo. Um nome é necessário para este arquivo de biblioteca. @@ -417,13 +411,13 @@ Há casos em que uma única estatística de uso devem ser utilizada, por exemplo Não disponível Os itens em itálico e marcados com * representam dados que são opcionais para a atual forma de contar as estatísticas no sistema (tipo de métrica). Você pode ter estes dados ou não, dependendo da configuração do plugin de estatísticas. Conteúdo Adicional - O que for digitado aqui será exibido na sua página inicial. - Nota de direitos autorais - Exigir que os autores concordam com o Nota de direitos autorais, como parte do processo de submissão. + O que for digitado aqui será exibido na sua página inicial. + Nota de direitos autorais + Exigir que os autores concordam com o Nota de direitos autorais, como parte do processo de submissão. Diretrizes podem incluir normas bibliográficas e de formatação, junto de exemplos de formatos de citação comuns a serem usados nos envios dos manuscritos. - Formato favicon inválido. Formatos aceitos são .ico, .png e .gif. + Favicon Imagem da Página Inicial - Upload de uma imagem para exibir de forma destacada na página inicial. + Upload de uma imagem para exibir de forma destacada na página inicial. Descrições Logo Notificação do Autor da Submissão @@ -433,12 +427,11 @@ Há casos em que uma única estatística de uso devem ser utilizada, por exemplo Política de Acesso Aberto Se proporcionar livre acesso imediato a todo o conteúdo publicado, você pode inserir uma descrição da sua política de acesso aberto. Rodapé - Insira quaisquer imagens, texto ou código HTML que você gostaria de aparecer na parte inferior do seu site. + Insira quaisquer imagens, texto ou código HTML que você gostaria de aparecer na parte inferior do seu site. Descreva a política de avaliação por pares e processos para os leitores e autores. Esta descrição inclui muitas vezes o número de avaliadores normalmente utilizados na avaliação de uma submissão, os critérios pelos quais os avaliadores são convidados a julgar as inscrições, o tempo de espera necessário para conduzir as avaliações e os princípios usados para selecionar avaliadores. Contato Principal Padrões podem ser modificados para cada avaliação durante o processo editorial. Padrão dos Prazos de Avaliação - Apresentar um link para "Garantir uma Avaliação por Pares Cega" durante o carregamento Exemplos: associações acadêmicas, departamentos de universidades, cooperativas, etc. Os patrocinadores são exibidos ao público. Contato de Apoio Técnico Uma pessoa que pode ajudar editores, autores e avaliadores com quaisquer problemas que tenham na submissão, edição, avaliação e publicação dos documentos. diff --git a/locale/pt_BR/reader.xml b/locale/pt_BR/reader.xml index b87a157de94..18dd8ee55d1 100644 --- a/locale/pt_BR/reader.xml +++ b/locale/pt_BR/reader.xml @@ -33,145 +33,5 @@ Título Visualizar todos os comentários Texto completo: - Incluir comentário - Configuração - Deseja realmente excluir este Contexto e todas as pesquisas associadas? - Criar contexto - Editar contexto - Metadados - Nome do autor como termo de pesquisa padrão permite aos leitores encontrar outros trabalhos do autor (Ex.: para um contexto de "Outros Trabalhos") - Usar os nomes de autores como termos de pesquisa padrão e descreva o contexto como busca de citações para o artigo. - Configurações da Ferramenta de Leitura para permitir clique duplo em palavras do texto exibido para abrir este contexto.]]> - Usar dados de indexação geográfica como termos de pesquisa padrão. - Opções - Administração - Ferramenta de Leitura - Deseja realmente excluir esta pesquisa? - Criar pesquisa - Editar pesquisa - Itens relacionados - Resumo (apresenta o resumo do item). - Biografia do autor (exibe a biografia do autor alimentada no sistema). - Como citar este documento (exibe detalhes bibliográficos do documento). - Definição de palavra (permite aos leitores clicar duas vezes em um palavra para pesquisar em dicionários) - Desabilitar itens relacionados - E-mail ao autor (abre um formulário para comunicação direta com o autor) - Enviar para outros (abre um formulário para enviar o documento a outros leitores, com o título do documento no assunto da mensagem). - Pesquisar referências - Versão para impressão (apresenta ao leitor uma versão para impressão). - Exibir documentos suplementares (exibe a lista de todos os documentos suplementares incluídos pelo autor). - Exibir metadados (Exibe a informação de indexação incluída pelo autor e pelo sistema) - Situação - Validação concluída. - ok - {$url} é inválida. - Validar URLs - Validar - Deseja realmente excluir esta versão e todos os contextos e pesquisas associados? - Deseja realmente restaurar as versões padrão (ação irreversível)? Em caso positivo, escolha uma versão ativa em Configurações. - Criar versão - Editar versão - Exportar - Importar versão - Metadados - Restaurar versões para valores padrão - Exibir biografia do autor - Formato de citação - Como citar este documento - Online - Enviar para outros - Abreviatura - E - Caso o documento seja indexado pelo Google Acadêmico, o mesmo pode ser acompanhado por um hipertexto "Citado por X", que encaminhará à lista de trabalhos que fazem sua citação. O Google Acadêmico também listará todos os itens que citam o título e o autor. Para acessar recursos online disponíveis somente na sua biblioteca, podem ser habilitados Links de Biblioteca para sua instituição nas Preferências do Google Acadêmico. - Contexto - Clique duas vezes sobre qualquer palavra, de um documento em HTML (ao contrário do PDF), para que apareça na janela de definição de termos. É possível digitar ou colar uma palavra no campo. Utilize a função de pesquisa para procurar uma definição para o termo. Para saber mais sobre o recurso pesquisado, clique no símbolo de informação. Estes recursos foram escolhidos devido a sua relevância e acessibilidade aberta (gratuita) para todo ou parte do conteúdo. - Descrição - Ordem - Contextos - Os termos de pesquisa definidos pelo(s) autor(es) podem ser alterados pelo leitor. Para saber mais sobre o recurso pesquisado, clique no símbolo de informação. Estes recursos foram escolhidos devido a sua relevância e acessibilidade aberta (gratuita) para todo ou parte do conteúdo. - Pesquisar termos - Definir palavra - Título - E-mail ao autor - cadastro]]> - Mensagem enviada. - Encontrando referências - Google Acadêmico - Windows Live Acadêmico - Pesquisar palavra - Coautor - Cobertura - Data - Descrição - Dublin Core - Formato - Identificador - Idioma - Editora - Relacionamento - Direitos - Fonte - Assunto - Título - Tipo - Metadados do documento - Resumo - Direito autoral e permissões - Localização geográfica, cronológica, amostra (gênero, idade, etc.) - (YYYY-MM-DD) - Área(s) do Conhecimento - Formato do Documento - - Metadados para o PKP - Português=pt - Editora, localização - Título da Revista/conferência; V. N. ano - Patrocínio - Palavras-chave(s) - Docs. Sups. - Título do documento - Tipo - Identificador de Recurso Uniforme (URI) - Versão de Impressão - Ferramenta de Leitura - Itens relacionados - Política de Avaliação - Descrição - Pesquisas - Ordem - Pesquisa - Dados via POST - Pesquisar URL - Sugerir fonte - Título - URL - Baixar - Documentos Suplementares - Metadados - Descrição - Chave - Idioma - Conjuntos de itens relacionados - Título - Versão - Catalogação O título do comentário é obrigatório. - Compartilhamento - Compartilhamento habilitado - AddThis.com, e copie/cole o código de Compartilhar a seguir.]]> - Configurações Básicas - Usuário AddThis.com - Estilo do botão - Usar menu drop-down - Configurações avançadas (opcional) - Documentação de customização do AddThis.com para referência.]]> - Marca - (lista separada por vírgula)]]> - Idioma - Logo - Fundo do logo - Cor do logo - Configurar AddThis - Web - Ver política de avaliação diff --git a/locale/pt_BR/submission.xml b/locale/pt_BR/submission.xml index 5b8b9c75fca..74984232330 100644 --- a/locale/pt_BR/submission.xml +++ b/locale/pt_BR/submission.xml @@ -654,8 +654,6 @@ Prazo de Avaliação Apagar submissão? Ver {$title} - Aumentar posição de {$itemTitle} - Diminuir posição de {$itemTitle} Ver Submissão Avaliações completadas Avaliações enviadas diff --git a/locale/pt_PT/admin.xml b/locale/pt_PT/admin.xml index 95d21935aa7..a3ea2464ce7 100644 --- a/locale/pt_PT/admin.xml +++ b/locale/pt_PT/admin.xml @@ -44,15 +44,9 @@ Informações do Servidor Versão do PHP Sistema Operativo - Acerca do Portal + Acerca do Portal E-mail do Contacto Principal Nome do Contacto Principal - E-mail do contacto principal é obrigatório - Nome do contacto principal é obrigatório - A senha deve possuir no mínimo 4 caracteres. - Título obrigatório. - Logo do portal - Formato de imagem inválido. Formatos aceites são .gif, .jpg ou .png. Introdução Tamanho mínimo de senha Idioma do Portal diff --git a/locale/pt_PT/common.xml b/locale/pt_PT/common.xml index cde28e30b7e..f936cab477d 100644 --- a/locale/pt_PT/common.xml +++ b/locale/pt_PT/common.xml @@ -40,7 +40,6 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Já designado Texto alternativo - Indique um texto alternativo para a imagem, assegurando a acessibilidade a utilizadores com navegadores de texto ou equipamentos de auxílio a necessidades especiais. e Aplicar Acção Designar @@ -114,10 +113,11 @@ Activado Opções Ordem + Incrementar posição de {$itemTitle} + Decrementar posição de {$itemTitle} Nome original do ficheiro ou Outro - Logo do cabeçalho da página Plugin Editora Registar @@ -266,7 +266,6 @@ Re: Gerir Sem comentários - Ficheiro enviado iniciar por Exibir estas notificações no meu canal de notificações Ocorreu um erro ao confirmar a sua subscrição. @@ -307,7 +306,6 @@ Ir Home Artigos por página - Favicon Menos Mais Descrição @@ -364,8 +362,6 @@ Componente Não lido Data do upload - Nenhum ficheiro carregado ou tipo de ficheiro inválido! - Imagem da Homepage Upload Ficheiro Modificar Ficheiro Arrastar um ficheiro para aqui para iniciar o upload @@ -385,7 +381,6 @@ Confirmar É obrigat´ório o e-mail. A informação inserida no formulário foi modificada. Pretende avançar sem guardar as alterações? - O formulário não foi enviado. É obrigatório fazer upload de um ficheiro. Foi transferida uma imagem inválida. Os formatos aceites são .png, .gif, or .jpg. Anterior diff --git a/locale/pt_PT/manager.xml b/locale/pt_PT/manager.xml index 46c0185f3b8..1826b3bd9be 100644 --- a/locale/pt_PT/manager.xml +++ b/locale/pt_PT/manager.xml @@ -138,10 +138,8 @@ Plugins do Sistema Ferramentas para Leitura Papéis - O formato da imagem do logótipo do cabeçalho do homepage inválido ou o upload falhou. Os formatos pemritidos são .gif, .jpg ou .png. O formato da imagem da página inicial é inválido ou o upload falhou. Os formatos permitidos são .gif, .jpg ou .png. O formato da imagem do cabeçalho da página inicial é inválido ou o upload falhou. Os formatos permitidos são .gif, .jpg ou .png. - Não marcados Controle e Auditoria O formato da imagem do logótipo do cabeçalho da página é inválido ou o upload falhou. Os formatos permitidos são .gif, .jpg ou .png. @@ -288,21 +286,19 @@ Restringir resultados por país, região e/ou cidade. Patrocinador Conteúdo Adicional - Qualquer coisa inserida aqui aparecerá na sua página inicial. - Informação sobre Direitos de Autor - Exigir que os autores aceitem o Aviso de Direitos de Autor como parte do processo de submissão. + Qualquer coisa inserida aqui aparecerá na sua página inicial. + Informação sobre Direitos de Autor + Exigir que os autores aceitem o Aviso de Direitos de Autor como parte do processo de submissão. Directrizes Autor As directrizes recomendadas incluem normas bibliográficos e de formatação, juntamente com exemplos de formatos comuns de citação para serem usados na submissão de artigos. Interesses Concorrentes - Os revisores serão convidados a cumprir com a política de divulgação de interesses concorrentes que especificados abaixo. - Formato favicon inválido. Os formatos permitidos são .ico, .png, and .gif. + Favicon Agrupamento tipo de ficheiro Image Homepage - Carregue uma imagem para se exibir na página inicial. + Carregue uma imagem para se exibir na página inicial. Descrições - Tema - Podem ser instalados novos temas a partir do tabulador Plugins no topo desta página. - Administração Barral Lateral + Tema + Podem ser instalados novos temas a partir do tabulador Plugins no topo desta página. Barral Lateral Logótipo Notificação ou Submissão Autor @@ -311,7 +307,7 @@ Política de Acesso Aberto Se fornecer acesso gratuito imediato a todos os conteúdos publicados, pode inserir uma descrição da Política de Acesso Aberto. Rodapé - Insira qualquer imagem, texto ou código HTML que gostaria de aparecer no rodapé site. + Insira qualquer imagem, texto ou código HTML que gostaria de aparecer no rodapé site. Descreva a política e os processos de revisão pelos pares para leitores e autores. Esta descrição geralmente inclui o número de revisores tipicamente usado na revisão de uma submissão, os critérios pelos quais os revisores são convidados a julgar as submissões, o tempo esperado necessário para realizar as revisões e os princípios usados para seleccionar revisores. Contacto Principal Insira os detalhes de contato, geralmente informação sobre o Director, Editor principal, Corpo Editorial e equipa administrativa, que pode ser exibido no site acessível ao público. @@ -320,10 +316,9 @@ Semanas permitidas para concluir uma revisão Lembrete Os padrões para cada revisão podem ser modificados durante o processo editorial. - Enviar um lembrete se um revisor não tiver respondido a um pedido de revisão no prazo (dias) após a data de resposta devida: - Enviar um lembrete se um revisor não tiver enviado uma recomendação dentro do prazo (dias) após a data de vencimento da revisão: + Enviar um lembrete se um revisor não tiver respondido a um pedido de revisão no prazo (dias) após a data de resposta devida: + Enviar um lembrete se um revisor não tiver enviado uma recomendação dentro do prazo (dias) após a data de vencimento da revisão: Prazos de Revisão Padrão - Indicar um link para "Garantir uma revisão cega" durante o upload Plugins Metadados Os plugins de metadados implementam padrões adicionais de metadados. Relações com Patrocinadores e Descrição de Política @@ -402,7 +397,6 @@ Não foi seleccionado nenhum método de pagamento Método Pagamento Moeda - Os pagamentos efectuados directamente através deste site serão denominados na moeda seleccionada. Opções Papel Mostrar título do papel na lista de colaboradores Permitir auto registo @@ -441,8 +435,6 @@ Configurações do fluxo de trabalho Distribuição Tem de ser indicado um utilizador existente. - Mapa do Sítio - {$path}]]> Este plugin é desenvolvido e mantido pela equipa do Public Knowledge Project. Este plugin foi reviso e aprovado pela equipa do Public Knowledge Project. Este plugin é providenciado por um dos nossos parceiros. diff --git a/locale/pt_PT/reader.xml b/locale/pt_PT/reader.xml index 29986706666..ac38b0d676a 100644 --- a/locale/pt_PT/reader.xml +++ b/locale/pt_PT/reader.xml @@ -33,145 +33,5 @@ Título Visualizar todos os comentários Texto Completo: - Adicionar comentário - Configuração - Deseja realmente eliminar este Contexto e todas as Pesquisas associadas? - Criar Contexto - Editar Contexto - Metadados - Nome do autor como termo de pesquisa padrão permite aos leitores encontrar outros trabalhos do autor(Ex.: para um contexto de "Outros Trabalhos") - Use os nomes do autor como termos de pesquisa padrão e descreva o contexto como busca de citações para o artigo. - Configurações da Ferramenta de Leitura para permitir clique duplo em palavras do texto exibido para abrir este contexto.]]> - Usar dados de indexação geográfica como termos de pesquisa padrão. - Opções - Administração - Ferramenta de Leitura - Deseja realmente eliminar esta Pesquisa? - Criar Pesquisa - Editar Pesquisa - Itens Relacionados - Resumo (apresenta o resumo do item). - Biografia do Autor (Exibe a biografia do autor alimentada no sistema) - Como citar este documento (Exibe detalhes bibliográficos do documento). - Definição de palavra (Permite leitores clicar duas vezes em um palavra para pesquisa em dicionários) - Desactivar Itens Relacionados - E-mail ao autor (abre um formulário para comunicação directa com o autor) - Enviar para outros (abre um formulário para enviar o documento a outros leitores, com o título do documento no assunto da mensagem). - Pesquisar Referências - Versão para impressão (apresenta ao leitor uma versão para impressão). - Exibir documentos suplementares (exibe a lista de todos os documentos suplementares incluídos pelo autor). - Exibir metadados (Exibe a informação de indexação incluída pelo autor e pelo sistema) - Situação - Validação concluída. - OK - {$url} é inválido. - Validar URLs - Validar - Deseja realmente eliminar esta Versão e todos os Contextos e Pesquisas associados? - Deseja realmente restaurar as versões padrão (acção irreversível)? Em caso positivo, escolha uma Versão activa em Configurações. - Criar Versão - Editar Versão - Exportar - Importar Versão - Metadados - Restaurar Versões para o Padrão - Exibir biografia do autor - Formato de Citação - Como citar este documento - Online - Enviar para outros - Abreviatura - E - Caso o documento seja indexado pelo Google Académico, o mesmo pode ser acompanhado por um hipertexto "Citado por X", que encaminhará à lista de trabalhos que fazem a sua citação. O Google Académico também listará todos os artigos que citam o título e o autor. Para aceder a recursos on-line disponíveis somente na sua biblioteca, podem ser activados Links de Biblioteca para a sua instituição nas Preferências do Google Académico. - Contexto - Clique duas vezes sobre qualquer palavra, de um documento em HTML (ao contrário do PDF), para que apareça na janela de definição de termos. É possível inserir ou colar uma palavra no campo. Utilize a função de pesquisa para procurar uma definição para o termo. Para saber mais sobre o recurso pesquisado, clique no símbolo de informação. Estes recursos foram escolhidos devido à sua relevância e acessibilidade aberta (gratuita) para todo ou parte do conteúdo. - Descrição - Ordem - Contextos - Os termos de pesquisa definidos pelo(s) autor(es) podem ser alterados pelo leitor. Para saber mais sobre o recurso pesquisado, clique no símbolo de informação. Estes recursos foram escolhidos devido à sua relevância e acessibilidade aberta (gratuita) para todo ou parte do conteúdo. - Pesquisar termos - Definir palavra - Título - E-mail ao autor - registo]]> - Mensagem enviada. - Pesquisando Referências - Google Académico - Windows Live Académico - Pesquisar palavra - Colaborador - Cobertura - Data - Descrição - Dublin Core - Formato - Identificador - Idioma - Editora - Relacionados - Direitos - Fonte - Assunto - Título - Tipo - Metadados deste Documento - Resumo - Direitos de Autor e Permissões - Localização geográfica, cronológica, amostra (género, idade, etc.) - (YYYY-MM-DD) - Área(s) do Conhecimento - Formato do Documento - - Metadados para o PKP - Português=pt - Editora, localização - Título da Revista/Conferência; V., No. (ano) - Patrocínio - Palavras-chave(s) - Docs. Sups. - Título do documento - Tipo - Identificador Universal Único (URI) - Versão de Impressão - Ferramentas de Leitura - Itens relacionados - Política de Revisão - Descrição - Pesquisas - Ordem - Pesquisa - Dados via Post - Pesquisar URL - Sugerir fonte - Título - URL - Transferir - Documentos Suplementares - Metadados - Descrição - Chave - Idioma - Conjuntos de Itens Relacionados - Título - Versão - Exibir metadados É obrigatório o título do comentário. - Partilha - Partilha activada - AddThis.com, e copie/cole o código de Partilhar a seguir.]]> - Configurações Básicas - Utilizador AddThis.com - Estilo do botão - Usar menu drop-down - Configurações Avançadas (opcional) - Documentação de customização do AddThis.com para referência.]]> - Marca - (lista separada por vírgula)]]> - Idioma - Logótipo - Fundo do logótipo - Cor do logótipo - Configurar AddThis - Web - Ver Políticas Revisão diff --git a/locale/pt_PT/submission.xml b/locale/pt_PT/submission.xml index 1cdad679d16..4f5be361c43 100644 --- a/locale/pt_PT/submission.xml +++ b/locale/pt_PT/submission.xml @@ -512,7 +512,6 @@ Introduza um assunto. Introduza uma Área de Conhecimento. Introduza uma palavra-chave. - Introduza uma agência de suporte. Introduza a informação de cobertura. Introduza o tipo. Introduza a fonte. @@ -557,8 +556,6 @@ Revisão Até Revisão Enviada Apagar submissão? - Incrementar posição de {$itemTitle} - Decrementar posição de {$itemTitle} Ver Submissão Revisões atribuídas terminadas Revisões enviadas diff --git a/locale/ru_RU/admin.xml b/locale/ru_RU/admin.xml index 09c862c04d8..61c1a048be6 100644 --- a/locale/ru_RU/admin.xml +++ b/locale/ru_RU/admin.xml @@ -66,20 +66,14 @@ Версия PHP ОС платформы Настройки - О сайте + О сайте E-mail контактного лица Имя контактного лица - Адрес электронной почты контактного лица обязателен. - Имя контактного лица обязательно. - Вы должны ввести пароль, длина которого минимум 4 символа. - Название обязательно. Ваша инсталляция настроена на запись нескольких метрик использования. Статистика использования будет отображаться в нескольких контекстах. Есть случаи, когда должна быть использована только одна статистика использования, например, чтобы отобразить упорядоченный список наиболее используемых материалов или отранжировать результаты поиска. Пожалуйста, выберите одну из настроенных метрик в качестве метрики по умолчанию. - Логотип сайта - Неверный формат изображения логотипа сайта. Разрешенные форматы: .gif, .jpg или .png. Преамбула Минимальная длина пароля (в символах) Язык сайта @@ -120,7 +114,7 @@ Этот инструмент будет только копировать те файлы, которые еще не скопированы в каталоги загрузки файлов модуля «Статистика использования» (stage, processing, archive, reject). Вызов: {$scriptName} path/to/apache/log/file.log -Вызов (обработка всех файлов в каталоге): {$scriptName} path/to/apache/directory +Вызов (обработка всех файлов в каталоге): {$scriptName} path/to/apache/directory Ошибка: не могу создать временный каталог {$tmpDir} Ошибка: Файл {$filePath} не существует или к нему нет доступа. diff --git a/locale/ru_RU/api.xml b/locale/ru_RU/api.xml index b0f66961118..dd7968911e7 100644 --- a/locale/ru_RU/api.xml +++ b/locale/ru_RU/api.xml @@ -17,7 +17,7 @@ Вы можете только просматривать неопубликованные материалы, в которых вы были назначены. Вы не можете удалить материал, который не был назначен этому контексту. У вас нет прав на удаление этого материала. - Запрошенный ресурс не был найден. + Запрошенный ресурс не был найден. Ваш запрос не может быть выполнен, так как в нем отсутствует необходимая информация. Неправильно указан запрашиваемый том, номер или год. Произошла неожиданная ошибка. Пожалуйста, перезагрузите страницу и попробуйте снова. diff --git a/locale/ru_RU/common.xml b/locale/ru_RU/common.xml index d21f1129008..f9b1a927101 100644 --- a/locale/ru_RU/common.xml +++ b/locale/ru_RU/common.xml @@ -57,7 +57,6 @@ и или но если то иначе когда в на под из над с во Назначен Альтернативный текст - Чтобы улучшить оптимизацию для поисковых машин и соответствовать стандартам WCAG, пожалуйста, опишите то, что изображено на этой картинке, так как она будет пропущена, если сайт будет просматриваться через текстовый браузер или с помощью других вспомогательных устройств для людей с ограниченными возможностями. Например: «Наш редактор выступает на конференции PKP#2015». и Применить Назначить @@ -168,7 +167,6 @@ Начать В процессе Элементов на странице - Favicon Ключевые слова Язык Языки @@ -202,6 +200,8 @@ OK Параметры Сортировка + Поднять вверх «{$itemTitle}» + Опустить вниз «{$itemTitle}» Первоначальное название файла или Прочее @@ -209,7 +209,6 @@ {$start}-{$end} из {$total} Просмотреть другие страницы Страница {$pageNumber} - Логотип верхнего колонтитула страницы {$percentage}% Модуль Модуль «{$pluginName}» был включен. @@ -269,11 +268,8 @@ Без имени Обновлен Дата загрузки - Загруженный файл Загрузить на сервер Файл не может быть загружен или изменен. - Файл не был загружен или имеет неверный тип! - Изображение главной страницы Наверх Загрузить файл Изменить файл @@ -341,7 +337,6 @@ равно начинается с Форма не была отправлена надлежащим образом. - Форма не была отправлена надлежащим образом. Обязательно нужно загрузить файл. (* Обязательно) Отправить снова diff --git a/locale/ru_RU/manager.xml b/locale/ru_RU/manager.xml index d541da3edb9..6b2d03648da 100644 --- a/locale/ru_RU/manager.xml +++ b/locale/ru_RU/manager.xml @@ -214,27 +214,23 @@ Фильтровать результаты по странам, регионам и/или городам. Спонсорство Дополнительный контент - Все, что будет введено здесь, появится на главной странице. - Условия передачи авторских прав - Требовать от авторов принятия Условий передачи авторских прав в процессе отправки материала. + Все, что будет введено здесь, появится на главной странице. + Условия передачи авторских прав + Требовать от авторов принятия Условий передачи авторских прав в процессе отправки материала. Руководство для авторов Рекомендуемые правила оформления, включая стандарты форматирования текста и библиографических ссылок вместе с примерами оформления ссылок, которые часто встречаются в отправляемых материалах. Конфликт интересов - Рецензентов просят следовать Правилам декларирования конфликта интересов, которые вы описали ниже. Во время удаления этого объекта возникла ошибка. - Неправильный формат favicon. Допустимы форматы .ico, .png и .gif. + Favicon Группировка типов файлов - Неверный формат изображения логотипа для верхнего колонтитула домашней страницы или загрузка не удалась. Разрешенные форматы: .gif, .jpg или .png. Изображение на главной странице - Загрузите изображение для отображения его на главной странице. + Загрузите изображение для отображения его на главной странице. Неверный формат изображения для домашней страницы или загрузка не удалась. Разрешенные форматы: .gif, .jpg или .png. Неверный формат изображения заголовка для верхнего колонтитула домашней страницы или загрузка не удалась. Разрешенные форматы: .gif, .jpg или .png. Описания - Тема оформления - Новые темы могут быть установлены из вкладки «Модули» вверху на этой странице. - Управление боковыми панелями + Тема оформления + Новые темы могут быть установлены из вкладки «Модули» вверху на этой странице. Боковая панель - Не выбрано Ведение журнала и аудит Логотип Уведомление об отправке материала автором @@ -244,7 +240,7 @@ Если журнал предоставляет читателям немедленный свободный доступ ко всему опубликованному контенту, вы можете ввести описание ваших Правил открытого доступа. Неверный формат изображения логотипа для верхнего колонтитула страницы или загрузка не удалась. Разрешенные форматы: .gif, .jpg или .png. Нижний колонтитул страницы - Введите все изображения, текст или код HTML, который вы хотите показать в нижней части вашего сайта. + Введите все изображения, текст или код HTML, который вы хотите показать в нижней части вашего сайта. Опишите правила рецензирования журнала и процесс рецензирования для читателей и авторов. Это описание обычно включает в себя количество рецензентов, обычно дающих рецензии на материал, критерии, по которым рецензентов просят оценить материалы, примерное время выполнения рецензий и принципы подбора рецензентов. Контактное лицо (общие вопросы) Введите данные контактного лица, обычно это главный редактор, ответственный редактор или сотрудник администрации. Эти данные могут отображаться в открытом доступе на сайте. @@ -254,12 +250,9 @@ Недель на выполнение рецензии Никогда не напоминать Значения по умолчанию могут быть изменены для каждой рецензии в ходе редакционного процесса. - Отправить напоминание, если рецензент не ответил на запрос рецензии в течение следующего количества дней, после того как срок ответа на запрос прошел: - Отправить напоминание, если рецензент не отправил рекомендацию в течение следующего количества дней, после того как срок отправки рецензии прошел: + Отправить напоминание, если рецензент не ответил на запрос рецензии в течение следующего количества дней, после того как срок ответа на запрос прошел: + Отправить напоминание, если рецензент не отправил рекомендацию в течение следующего количества дней, после того как срок отправки рецензии прошел: Сроки рецензирования по умолчанию - Добавить ссылку на «Обеспечение слепого рецензирования» во время загрузки - Карта сайта - {$path}]]> Описание правил и отношений со спонсорами Примеры: общества ученых, подразделения университетов, объединения и т.д. Спонсоры показываются в открытом доступе на сайте. Опытные веб-разработчики могут загрузить файл CSS для дополнительной модификации внешнего вида сайта. @@ -367,7 +360,6 @@ Метод платежей не выбран Метод платедей Валюта - Платежи, выполненные напрямую через этот сайт, будут выставлены в выбранной валюте. Параметры роли @@ -492,7 +484,7 @@ У импортируемого пользователя «{$username}» нет пароля. Проверьте формат вашего файла XML для импорта. Пользователь не был импортирован. Пароль импортируемого пользователя «{$username}» не модет быть импортирован в данном виде. Новый пароль был отправлен на адрес электронной почты пользователя. Пользователь был импортирован. У импортируемого пользователя «{$username}» задан простой пароль, не соответствующий требованиям. Пользователь не был импортирован. - + Название Путь diff --git a/locale/ru_RU/reader.xml b/locale/ru_RU/reader.xml index aff4c1891fc..e2b1780d1d9 100644 --- a/locale/ru_RU/reader.xml +++ b/locale/ru_RU/reader.xml @@ -35,147 +35,4 @@ Заголовок Просмотреть все комментарии Полный текст: - Добавить комментарий - Настройка - Вы уверены, что хотите удалить этот контекст и все связанные с ним поисковые запросы? - Создать контекст - Редактировать контекст - Метаданные - Использовать по умолчанию имена авторов как ключевые слова для поиска, чтобы позволить пользователям найти другие работы авторов этого материала (например, для контекста «Другие работы») - Использовать по умолчанию имена имена авторов как ключевые слова для поиска и описать контекст как поиск ссылок на эту статью. - Настройках RST для того, чтобы разрешить открытие данного контекста двойным щелчком на словах.]]> - Использовать географические индексируемые данные как ключевые слова для поиска по умолчанию. - Параметры - Управление - - Поделиться - Включить возможность поделиться с другими - addthis.com и вставьте полученный там код кнопки «Sharing» ниже.]]> - - Основные настройки - Имя пользователя AddThis.com - Стиль кнопки - Использовать выпадающее меню - Дополнительные настройки (не обязательно) - документацию по настройке AddThis.com.]]> - Бренд - (список, разделенный запятыми)]]> - Язык - Логотип - Фон логотипа - Цвет логотипа - - Инструменты читателя - Вы уверены, что хотите удалить этот поисковый запрос? - Создать поисковый запрос - Редактировать поисковый запрос - Связанные элементы - Аннотация (представляет аннотацию материала). - Показать правила рецензирования - Об авторе(показывает биографическую информацию, введенную автором). - Как процитировать материал (показывает библиографическую ссылку на материал). - Посмотреть термины (дает читателям возможность вызова словаря двойным щелчком мыши на любом слове в материале). - Выключить связанные элементы - Отправить письмо автору (открывает шаблон письма электронной почты с адресом электронной почты автора). - Сообщить коллеге (открывает шаблон письма электронной почты со ссылкой на материал). - Найти ссылки - Версия для печати (отображает версию материала, удобную для печати). - Дополнительные файлы (показывает список файлов, включенных автором в отправляемый материал). - Метаданные для индексации (показывает используемые для индексации метаданные, предоставленные автором и системой). - Статус - Настроить AddThis - Проверка завершена. - ОК - {$url} является неправильным. - Проверить URL-адреса для инструментов читателя - Проверить - Вы уверены, что хотите удалить эту версию и все связанные с ней контексты и поисковые запросы? - Вы уверены, что хотите вернуть все версии к их стандартным настройкам? Если да, то вам нужно выбрать активную версию на странице «Настройки». - Создать версию - Редактировать версию - Экспортировать - Импортировать версию - Метаданные - Восстановить версии в значения по умолчанию - Об авторе - Формат библиографической ссылки - Как процитировать материал - Онлайн - Веб - Сообщить коллеге - Аббрев - AND - Если статья индексируется в Академии Google, она может сопровождаться ссылкой вида «Цитируется: X», которая ведет к списку работ, ссылающихся на данную. Так же, Академия Google будет показывать все материалы, где содержится название статьи и автор. Для доступа к онлайн-ресурсам, которые доступны только через вашу библиотеку, вам может потребоваться зайти в Настройки Академии и активировать «Библиотечные ссылки» для вашей организации. - Контекст - Если материал представлен в формате HTML (а не в формате PDF), двойной щелчок на любом слове в тексте приведет к тому, что оно появится в поле «Термин» (слова также могут быть набраны или скопированы в это поле). Чтобы узнать больше о ресурсе, используемом для поиска, щелкните на «О ресурсе». Эти ресурсы были выбраны исходя из их релевантности и предоставления открытого (свободного) доступа ко всему контенту этого ресурса или его части. - Описание - Порядок - Контексты - Ключевые слова были выбраны авторами. Они могут быть изменены или удалены читателем, так как два или три коротких термина или фразы позволяют наиболее точно проводить поиск по сочетанию слов (AND). Чтобы узнать больше о ресурсах, используемых для поиска, щелкните на «О ресурсе». Эти ресурсы были выбраны за их релевантность и предоставление открытого (свободного) доступа ко всему контенту этого ресурса или его части. - Ключевые слова - Термин - Название - Отправить письмо электронной почты автору - регистрация]]> - Ваше сообщение было отправлено. - Найти ссылки - Академия Google - Windows Live Academic - Посмотреть термины - Соисполнитель - Охват - Дата - Описание - Дублинское ядро (Dublin Core) - Формат - Идентификатор - Язык - Издатель - Отношение - Права - Источник - Предмет - Название - Тип - Метаданные для этого документа - Аннотация - Права и разрешения - Геопространственное расположение, хронологический период, исследуемый образец (пол, возраст и т. д.) - (ГГГГ-ММ-ДД) - Дисциплины - Формат файла - - Элементы метаданных PKP - Russian=ru, English=en - Организатор, место - Название; том, № (год) - Спонсоры - Ключевые слова - Дополнительные файлы - Название документа - Тип - Универсальный идентификатор ресурса (URI) - Версия для печати - Инструменты читателя - Связанные элементы - Правила рецензирования - Описание - Поисковые запросы - Порядок - Поиск - Данные для публикации - URL для поиска - Предложить источник - Название - URL - Скачать - Дополнительные файлы - Метаданные для индексирования - Описание - Ключ - Язык - Наборы связанных элементов - Название - Версия - Метаданные для индексирования diff --git a/locale/ru_RU/submission.xml b/locale/ru_RU/submission.xml index d2cf56959e6..6f6eca23159 100644 --- a/locale/ru_RU/submission.xml +++ b/locale/ru_RU/submission.xml @@ -384,7 +384,6 @@ Пожалуйста, укажите тему. Пожалуйста, укажите предмет. Пожалуйста, укажите ключевое слово. - Пожалуйста, укажите спонсоров. Пожалуйста, укаэите информацию об охвате. Пожалуйста, укажите тип. Пожалуйста, укажите источник. @@ -619,8 +618,6 @@ Срок сдачи рецензии Рецензия отправлена Удалить материал? - Поднять вверх «{$itemTitle}» - Опустить вниз «{$itemTitle}» Показать материал Завершено назначенных рецензий Отправлено новых версий diff --git a/locale/sl_SI/admin.xml b/locale/sl_SI/admin.xml index 3db19229d2a..d838804a189 100644 --- a/locale/sl_SI/admin.xml +++ b/locale/sl_SI/admin.xml @@ -10,8 +10,8 @@ * * Localization strings. --> - - + + Ime nastavitve Vrednost nastavitve @@ -65,19 +65,13 @@ PHP verzija OS platforma Nastavitve - O tem spletišču + O tem spletišču Email glavnega stika Ime glavnega stika - Zahtevan je email naslov glavnega stika. - Zahtevano je ime glavnega stika. - Zahtevana dolžina gesla je vsaj 4 znake. - Naslov je zahtevan. Vaša OJS namestitev beleži več kot le eno metriko uporabe, ki so prikazane v različnih kontekstih. V nekaterih primerih mora biti uporabljena le ena metrika (npr. vrstni red najbolj branih člankov ali vrstni red iskalnih rezultatof. Prosimo izberite eno od konfiguriranih metrik kot privzetot. - Logotip strani - Napačen format slike za logotip.Dovoljeni formati so .ico, .png, and .gif. Uvod Najmanjša dolžina gesla (znakov) Jezik spletišča diff --git a/locale/sl_SI/common.xml b/locale/sl_SI/common.xml index 328ce084399..b35381bb765 100644 --- a/locale/sl_SI/common.xml +++ b/locale/sl_SI/common.xml @@ -7,7 +7,7 @@ * Copyright (c) 2000-2017 John Willinsky * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. * - * Localization strings. + * Localization strings. --> Public Knowledge Project @@ -54,7 +54,6 @@ in ali ne toda je če potem drugače kdaj ob od na za k Dodeljeno Nadomestno besedilo - Prosimo dodajte nadomestno besedilo za to sliko, ki bo v pomoč uporabnikom z negrafičnimi brskalniki ali s pripomočki za branje (npr. slepi, slabovidni). in Potrdi akcijo Dodaj @@ -165,7 +164,6 @@ Začni V delu Postavk na stran - Favicon Ključne besede Jezik Jeziki @@ -202,7 +200,6 @@ Ostalo Zapadlo Stran {$pageNumber} - Logotip glave naslovne strani {$percentage}% Vtičnik Vtičnik "{$pluginName}" je bil omogočen. @@ -261,11 +258,8 @@ Brez naslova Posodobljeno Datum oddaje - Naložena datoteka Naloži Datoteke ni bilo mogoče naložiti oziroma posodobiti. - Datoteka ni dodana ali pa je napačnega tipa. - Slika domače strani Gor Naloži datoteko Spremeni datoteko @@ -332,7 +326,6 @@ je se začne z Ta obrazec ni bil pravilno poslan. - Obrazec ni bil pravilno poslan. Obvezno ddajte datoteko. (* obvezno) Ponovno pošlji @@ -549,7 +542,7 @@ Navigacijski meni je bil uspešno dodan Navigacijski meni je bil uspešno posodobljen Navigacijski meni je bil uspešno odstranjen - + Prikaži več podrobnosti o {$name} Skrij podrobnosti o {$name} diff --git a/locale/sl_SI/manager.xml b/locale/sl_SI/manager.xml index 0bafacae433..06643dac449 100644 --- a/locale/sl_SI/manager.xml +++ b/locale/sl_SI/manager.xml @@ -1,7 +1,7 @@ Med brisanjem je prišlo do napake. Napačen format favikona. Dovoljeni formati so .ico, .png in .gif. Ta filter se povezuje na OCLC servise xISBN in Worldcat (opcijsko).

@@ -227,12 +226,12 @@ Grupiranje po tipu datoteke Napačen format slike za logotip glave osnovne strani ali pa je prišlo do napake pri nalaganju. Dovoljeni formati so .gif, .jpg, or .png. Slika domače strani - Naloži sliko, ki se bo prikazovala na domači strani. + Naloži sliko, ki se bo prikazovala na domači strani. Napačen format slike za logotip osnovne strani ali pa je prišlo do napake pri nalaganju. Dovoljeni formati so .gif, .jpg, or .png. Napačen format slike za glavo osnovne strani ali pa je prišlo do napake pri nalaganju. Dovoljeni formati so .gif, .jpg, or .png. Opisi - Tema - Nove teme se lahko namestijo v zavihku Vtičniki na vrhu te strani. + Tema + Nove teme se lahko namestijo v zavihku Vtičniki na vrhu te strani. Upravljanje stranskih orodnih stolpcev Stranki orodni stolpec Neizbrano @@ -245,7 +244,7 @@ Če uporabljate politko takojšnjega prostega dostopa za vse objvaljene vsebine, lahko vpišete opis vaše politike odprtega dostopa. Napačen format slike za glavo strani ali pa je prišlo do napake pri nalaganju. Dovoljeni formati so .gif, .jpg, or .png. Noga strani - Vnesite slike, besedilo ali HTML kodo, za katero želite, da se pojavlja na dnu spletne strani. + Vnesite slike, besedilo ali HTML kodo, za katero želite, da se pojavlja na dnu spletne strani. Orišite recenzentsko politiko in postopek za bralce in avtorje.Ta oris pogosto vsebuje tipično število recenzentov za prispevek, kriterije po katerih recenzenti ocenjujejo prispevek, pričakovan čas opravljanja recenzije in način določanaj recenzentov. Glavni kontakt Vnesite podatke kontakta, tipično glavni urednik, vodja uredništva ali administrativna oseba, ki je lahko objavljena na javno dostopni spletni strani. @@ -368,7 +367,6 @@ Noben način plačila ni izbran Način plačila Valuta - Plačila, opravljena preko te spletne strani, bodo opravljena v izbrani valuti. Možnosti vloge diff --git a/locale/sl_SI/reader.xml b/locale/sl_SI/reader.xml index f1a90c9834d..3c9671f99ab 100644 --- a/locale/sl_SI/reader.xml +++ b/locale/sl_SI/reader.xml @@ -32,149 +32,4 @@ Naslov Poglej vse komentarje Celotno besedilo: - Dodaj komentar - Konfiguracija - Ali ste prepričani, da želite izbrisati ta kontekst in vsa povezana iskanja? - Ustvari kontekst - Uredi kontekst - Metapodatki - Uporabi imena avtorjev kot privzet iskalni pojem, da lahko uporabniki poiščejo druga dela teh avtorjev (npr. za kontekst "druga dela") - Uporabi avtorjevo ime kot pojem za iskanje in definiraj kontekst kot iskanje del, ki citirajo ta članek. - Uporabi označeno besedo kot iskalni pojem (npr. za kontekst "Definicija pojmov"). Da je omogočeno ta funkcionalnost z dvojnim klikom na besedo mora biti omogočena opcija "Definicija pojmov" v <a href="{$settingsUrl}">opcije orodja za branje</a> - RST nastavitvah, ki omogoča dvojni klik na besede za označitev.]]> - Uporabi geografsko indeksirane podatke kot iskalni pogoj. - Opcije - upravljanje - - Deljenje - Deljenje omogočeno - Da omogočite bralcem deljenje članka, se prijavite za račun na <a href="http://addthis.com">addthis.com</a> in kopirajte "Sharing button" kodo spodaj. - addthis.com in kopirajte "Sharing button" kodo spodaj.]]> - - Osnovne nastavitve - AddThis.com uporabniško ime - Stil gumba - Uporabi padajoči meni - Napredne nastavitve (opcijsko) - AddThis.com customization documentation za navodila.]]> - Znamka - (lista deljena z vejicami)]]> - Jezik - Logotip - Ozadje za logotip - Barva logotipa - - Orodja za branje - Ste prepričani, da želite izbrisati to iskanje? - Ustvari iskanje - Uredi iskanje - Podobne stvari - Povzetek prilog - Poglej politiko rezenziranja - O avtorju (poglej biografske podatke, ki jih je vnesel avtor) - Bibliografska referenca priloge - Definicija terminov (omogoča bralcu, da z dvojnim klikom na besedo pogledajo njen pomen v slovarju) - Onemogoči podobne stvari - E-pošta avtorju (odpre e-poštno predlogo z avtorjevim e-poštnim naslovom). - Opozori sodelavca (odpre e-poštno predlogo s povezavo na prilogo). - Poišči literaturo - Verzija za tisk (v novem oknu odpre prilogo v obliki prilagojene za tiskanje). - Dodatne datotek (prikaže spisek datotek, ki jih je avtor priložil ob oddaji). - Metapodatki (prikaže metapodatke, ki jih je vnesel avtor ali sistem). - Status - Nastavi AddThis - Preverjanje je končano. - OK - {$url} ni veljaven. - Preveri URL-je za bralna orodja - Preveri - Ali ste prepričani, da želite izbrisati to verzijo in vse pripadajoče kontekste in iskanja? - Ali ste prepričani, da želite nepovratno vrniti vse verzije na standardno stanje? V tem primeru boste morali izbrati aktivno verzijo na nastavitveni strani. - Ustvari verzijo - Uredi verzijo - Izvozi - Uvozi verzijo - Metapodatki - Povrni verzijo na privzeto stanje - O avtorju - Format citata - Bibliografska referenca priloge - Online - Web - Obvesti sodelavca - Skrajšava - IN - Če je bil članek indeksiran z Google Scholar, ima lahko priloženo "citiran v" povezavo, ki vodi do spiska del, ki citirajo članek. Pravtako bo Google Scholar izpisal vsa dela z naslovom in avtorjem. Do online verzije izvodov, ki so na voljo le preko vaše iskalne knjižnice, lahko pridete preko Scholar nastavitve v Google Scolar in aktiviranju linkov knjižnice za vašo institucijo. - Kontekst - Če gre za HTML datoteko (prej kot za PDF), lahko z dvojnim klikom na besedo v teksu prikličete besedo v Termin-za-definiranje okvir. Enako lahko besedo natipkate ali prilepite v okvir. Da bi videli več o iskanem viru, kliknite O REVIJI. Ti viri so bili izbrani zaradi njihove pomembnosti in možnostjo (brezplačnega) dostopa do njihovih delov ali celote. - Opis - Vrstni red - Kontekst - Izraze za iskanje je/so ibral(i) avtor(ji). Popravi ali izriše jih lahko tudi bralec, in to s pomočjo dveh ali treh krajših, preciznejših izrazov ali iskalnih fraz, dobljenih z uporabo Booleanove algebre. Če želite videti več o virih iskanja, kliknite na ABOUT. Ti viri so bili izbrani zaradi njihove pomembnosti in možnostjo (brezplačnega) dostopa do njihovih delov ali celote. - Iskalni termini - Beseda za definiranje - Naslov - E-pošta avtorju - registracijo]]> - Vaše sporočilo je bilo poslano. - Iskanje referenc - Google Scholar - Windows Live Academic - Pogoji iskanje - Kontributor - Pokritost - Datum - Opis - Dublin Core - Format - Identifikator - Jezik - Izdajatelj - Povezava - Pravice - Vir - Tema - Naslov - Tip - Metapodatki za ta dokument - Izvleček - Avtorske pravice in dovoljenja - Geo-prostorska lokacija, kronološko obdobje, raziskovalni vzrok (spol, starost, itd.) - (DD.MM.LLLL) - Veda(e) - Format datoteke - Status in žanr - PKP metapodatkovni pojmi - Angleško=en - Organizacijka agencija, location - Naslov; številka, leto - Sponzor(ji) - Ključne besede - Dodatne datoteke - Naslov dokumenta - Tip - Univerzalni identifikator vira - Verzija za tiskanje - Orodja za branje - Povezani predmeti - Politika za recenzijo - Opis - Iskanja - Vrstni red - Iskanje - Poslani podatki - Preišči URL - Predlagaj vir - Naslov - URL - Prevzemi - Dodatne datoteke - Indeksiranje metapodatkov - Opis - Ključ - Jezik - Podobna skupina predmetov - Naslov - Verzija - Indeksiranje metapodatkov
diff --git a/locale/sr_RS@cyrillic/admin.xml b/locale/sr_RS@cyrillic/admin.xml index 64242a1b628..0b67b8297bc 100644 --- a/locale/sr_RS@cyrillic/admin.xml +++ b/locale/sr_RS@cyrillic/admin.xml @@ -45,15 +45,9 @@ Информације о серверу Верзија PHP-a Платформа ОС-а - Опис сајта + Опис сајта Имејл главног контакта Име главног контакта - Контакт имејл управника је обавезан. - Контакт име управника је обавезно. - Морате унети минималну дужину лозинке од најмање 4 карактера. - Наслов је обавезан. - Лого сајта - Неисправан формат логоа сајта. Систем прихвата .gif, .jpg или .png формате. Увод Минимална дужина лозинке Региструјте сајт за индексирање (сакупљање метаподатака) diff --git a/locale/sr_RS@cyrillic/common.xml b/locale/sr_RS@cyrillic/common.xml index a855198c7c3..d6aa2634c50 100644 --- a/locale/sr_RS@cyrillic/common.xml +++ b/locale/sr_RS@cyrillic/common.xml @@ -38,7 +38,6 @@ А Б Ц Ч Ћ Д Ђ Е Ф Г Х И Ј К Л М Н О П Q Р С Ш Т У В W X Y З Ж Додељено Допунски описни текст - Молимо приложите допунски описни текст за ову слику како би приступ садржају био могућ и корисницима са текстуалним читачима или помагалима за читање (нпр. слепим и слабовидним особама). и Примени поступак Додели @@ -138,7 +137,6 @@ Оригинално име фајла или Остало - Лого заглавља странице Додатак Додатак "{$pluginName}" је омогућен. Додатак "{$pluginName}" је онемогућен. @@ -174,7 +172,6 @@ Незапочето Без наслова Ажурирано - Достављени фајл Достави Фајл не може да се достави. Покушајте опет или контактирајте администратора. Горе @@ -317,7 +314,6 @@ Удаљени URL Ресетуј Није прочитано - Фајл није достављен или је у погрешном формату! Додаци Додајте тему имејла. Додајте текст имејла. @@ -372,7 +368,6 @@ Системски постављач фајлова поставља фајл. Ако се не фајл не појави то вероватно значи да ваш интернет прегледач не подржава неки од његових процеса. Контактирајте администратора за подршку. Почетна Елемената по страници - Омиљена сличица-Favicon Обавештено: {$dateNotified} Страна {$pageNumber} {$percentage}% @@ -392,7 +387,6 @@ Поднаслов Компонента Датум достављања - Слика почетне странице Достави фајл Измени фајл Превуци фајл овде да започенш достављање @@ -406,7 +400,6 @@ Име пошиљаоца Имејл адреса пошиљаоца Дата URL адреса није исправна, проверите и покушајте поново. - Формулар није исправно унет. Неопходно је додавање фајла Претходно Следеће diff --git a/locale/sr_RS@cyrillic/manager.xml b/locale/sr_RS@cyrillic/manager.xml index e385918dd04..89f9a4b5360 100644 --- a/locale/sr_RS@cyrillic/manager.xml +++ b/locale/sr_RS@cyrillic/manager.xml @@ -143,11 +143,8 @@ Рецензентски интереси Улоге Дошло је до грешке приликом брисања ставке. - Неисправан формат логоа хедера почетне стране или слање није успело. Прихватљиви формати су .gif, .jpg, или .png. Неисправан формат слике хедера почетне стране или слање није успело. Прихватљиви формати су .gif, .jpg, или .png. Неисправан формат слике наслова хедера почетне стране или слање није успело. Прихватљиви формати су .gif, .jpg, или .png. - Леви бочни мени - Није обележено Евидентирање и ревизија Неисправан формат логоа хедера стране или слање није успело. Прихватљиви формати су .gif, .jpg, или .png. Статистике и Извештаји @@ -177,7 +174,6 @@ Уколико ресетујете све шаблоне, све модификације које сте урадили биће изгубљене, да ли сте сигурни да желите да наставите? Уколико ресетујете овај шаблон, сви подаци биће враћени на почетне вредности, а све промене ће бити изгубљене, да ли желите да наставите? Претражи по имену - Управљач бочног менија Додаци метаподатака Додаци метаподатака имплементирају додатне стандарде мета података. Додатак OAI формата метаподатака @@ -236,33 +232,32 @@ Или одаберите опсег по: По гео локацији Сузи резултате по земљи, региону и/или граду. - Све што унесете овде пиће приказано на почетној страници. - Напомена о ауторском праву - Захтевај од аутора да прихвате "Напомену о ауторским правим" као део процеса предаје рада. + Све што унесете овде пиће приказано на почетној страници. + Напомена о ауторском праву + Захтевај од аутора да прихвате "Напомену о ауторским правим" као део процеса предаје рада. Груписање докумената по типу - Доставите слику која ће бити видљива на почетној страници. + Доставите слику која ће бити видљива на почетној страници. Описи - Тема - Нове теме могу бити инсталиране коришћењем "Додатака" на врху странице. + Тема + Нове теме могу бити инсталиране коришћењем "Додатака" на врху странице. Обавештења о предајама радова аутора Пошаљи копију главном контакту који је наведен у 1. кораку. Пошаљи копију на ову имејл адресу Политика "Отвореног приступа" Подножје странице - Унесите слику, текст или HTML код који желите да се прикаже на дну вашег сајта. + Унесите слику, текст или HTML код који желите да се прикаже на дну вашег сајта. Главни контакт Изјава о приватности Број недеља дозвољених за прихватање или одбијање рецензентског захтева Број недеља дозвољених зазавршетак рецензије Никад не обавештавај Задата подешавања могу бити измењена за сваку рецензију током уредничког процеса. - Пошаљи подсетник уколико рецензент није одгворио на рецензентски захтев након (број дана) од рока за одговор: - Пошаљи подсетник уколико рецензент није дао препоруке након (број дана) од рока за за завршетак рецензије: + Пошаљи подсетник уколико рецензент није одгворио на рецензентски захтев након (број дана) од рока за одговор: + Пошаљи подсетник уколико рецензент није дао препоруке након (број дана) од рока за за завршетак рецензије: Предефинисани рокови рецензената Конакт за техничку подршку Контакт особа која може помоћи уредницима, ауторима и рецензентима са проблемима приликом предаје, уређивања и рецензирања материјала за објављивање. Опције приступа сајту - Прикажи линк ка "Обезбеђивање процеса слепе рецензије" приликом додавања Додатак јавних идентификатора Овај додатак уводи подршку за јавне идентификаторе. Обриши додатак @@ -409,7 +404,6 @@ Фајл библиотека је неопходан. Проверите да ли сте одабрали и на сервер поставили фајл. Потребно је име за овај фајл библиотеке. Тип фајла је неопходан за овај фајл библиотеке. - Плаћања која се реализују преко овог сајта ће бити конвертована у одабрану валуту. Ви желите да уклоните ову улогу из овог контекста. То ће избрисати сва повезана подешавања и све корисничке доделе овој улози. Да ли желите да наставите? Ова страница дозвољава Управнику да прегледа и потенцијално конфигурише додатке који су тренутно инсталирани. Додаци су подељени у категорије према својој функцији. Категорије су доле излистане и у свакој категроији се налази комплет додатака. Особа за одржавање @@ -424,8 +418,7 @@ Ауторима ће бити аутоматски послата порука потврђујући пријем пријављеног чланка. Можете копије ове поруке послати следећим: Ако омогућавате непосредан и директан приступ целокупном објављеном садржају можете унети опис ваше политике отвореног приступа. Препоручене смернице укључују библиографске стандарде и формате уз примере цитатних формата које треба користити у пријављеним чланцима. - Рецензенти ће морати да врше рецензију у складу са политиком објављивања сукоба интереса коју доле одредите. - Нисправан формат за favicon. Прихваћени формати су .ico, .png, and .gif. + Омиљена сличица-Favicon Следећи url се може користити за генерисање извештаја према тренутним подешавањима. Копирајте url у ваш интернет прегледач и притисните enter. Можете га меморисати и користити као ваш посебан генератор извештаја. По типу објекта и/или id објекта Ваш {$contextObjectName} је конфигурисан да забележи више од једног начина мерења употребе сајта. Статистика употребе ће бити приказана у неколико контекста. У неким случајевима један начин статистике мора бити употребљена, нпр. да се прикаже листа са пореданим резултатима највише употребљених пријављених чаланак или да се рангирају резултати претраге. Молимо вас да одаберет један од начина мерења као почетни. diff --git a/locale/sr_RS@cyrillic/reader.xml b/locale/sr_RS@cyrillic/reader.xml index 53dccfe03fb..719047563e7 100644 --- a/locale/sr_RS@cyrillic/reader.xml +++ b/locale/sr_RS@cyrillic/reader.xml @@ -35,147 +35,4 @@ Наслов Преглед свих коментара Цео текст: - Додај коментар - Конфигурација - Да ли сте сигурни да желите избрисати овај контекст и сва претраживања везана за њега? - Креирај контекст - Измени контекст - Метаподаци - Koristi имена аутора као појмове за претраживање како би корисници могли пронаћи друге радове аутора овог прилога (нпр. за контекст "други радови"). - Користи имена аутора као појмове за претраживање и дефиниши контекст као тражење радова који цитирају овај чланак. - опција алата за читање мора бити активирана како би се дуплим кликом на одабрану реч омогућио приступ овом контексту.]]> - Користи географски индексиране податке као појмове за ово претраживање. - Опције - Управљање - - Дељење - Дељење је омогућено - addthis.com и копирајте "Sharing button" код испод.]]> - - Основна подешавања - AddThis.com корисничко име - Стил дугмета - Користи падајући мени - Напредна подешавања (опционо) - AddThis.com документацију за прилагођавање за даља упутства.]]> - Бренд - (листа одвојена зарезом)]]> - Језик - Лого - Позадина логоа - Боја логоа - - Алатке за читање - Да ли сте сигурни да желите избрисати ово претраживање? - Креирајте претраживање - Измени претраживање - Повезане ставке - Апстракт (приказује апстракт прилога). - О аутору (приказује биографске податке које је унео аутор). - Библиографска референца прилога (пружа библиографски запис дотичног прилога). - Дефиниције појмова (омогућује читатељима да дуплим кликом на било коју реч у прилогу директно консултују речник). - Онемогући повезане ставке - Пошаљи имејл аутору (отвара кориснику шаблон имејла насловљен на аутора). - Обавести колегу (отвара кориснику шаблон имејла са линком на ставку). - Нађи референце - Верзија за испис (отвара у новом прозору текст прилога оптимизован за испис на штампачу - корисно за прилоге у HTM формату). - Додатни фајлови (приказује листу фајлова које је аутор приложио уз пријаву). - Метаподаци прилога (приказује индексиране метаподатке које су униели аутори или генерисао систем). - Статус - Подеси AddThis - Провера је завршена. - У реду - {$url} није важећи. - Proveri ispravnost URL-ова алата за читање - Провери - Да ли сте сигурни да желите избрисати ову верзију и све додатке и претраживања везане уз њу? - Да ли сте сигурни да желите неповратно вратити све верзије у њихово стандардно стање? Ако је тако, мораћете одабрати активну верзију у подешавањима странице. - Направи верзију - Уреди верзију - Извези - Увези верзију - Метаподаци - Врати верзију на основна подешавања - О аутору - Библиографски стандард - Библиографска референца прилога - Online - Web - Обавести колегу - Скраћеница - И - Ако је чланак индексирао Google Scholar, може бити приложено "цитирао X" линком који води до листе радова који су цитирани. Исто тако, Google Scholar ће излистати све ставке наводећи наслов и аутора. Како би приступили онлине изворима који су једино доступни преко ваше истраживачке библиотеке, можете отићи на Сцхолар поставке у Google Scholar и активирати линкове библиотеке за вашу институцију. - Контекст - Ако је ставка HTML fајл (пре него PDF), дуплим кликом на било коју реч у тексту појавиће се у оквиру Реч-за-Дефинисање. Исто тако, речи могу бити написане или залепљене у оквир. Да бисте сазнали више о претраженом извору, кликните на О ЧАСОПИСУ. Ови извори су одабрани због своје релевантности и свог отвореног (бесплатног) приступа целом или делимичном садржају. - Опис - Редосед - Контексти - Изразе за претраживање је одабрао аутор(и). Њих може променити или избрисати читатељ, и то два или три краћа, прецизнија израза или фразе добивене претраживањем уз помоћ Booleanove (I) algebre. Kako biste naučili više o pretraženim izvorima, kliknite na ABOUT. Ови извори су одабрани због своје релевантности и отвореног (бесплатног) приступа његовом целом или делимичном садржају. - Тражите изразе - Реч за дефинисање - Наслов - Пошаљи имејл аутору - регистрацију]]> - Ваша порука је послата. - Тражење референци - Google Scholar - Windows Live Academic - Дефинисани изрази - Даваоц - Покривеност - Датум - Опис - Dublin Core - Формат - Идентификатор - Језик - Издавач - Релација - Права - Извор - Тема - Наслов - Тип - Метаподаци за овај документ - Апстракт - Ауторска права и дозволе - Гео-просторна локација, хронолошко раздобље, истраживачки узорак (пол,старост, итд.) - (ДД.ММ:ГГГГ.) - Дисциплина(е) - Формат фајла - Статус и жанр - PKP метаподаци ставки - Енглески=en - Организациона агенција, место - Часопис/конференцијски наслов; вол., бр. (година) - Спонзор(и) - Кључна реч(и) - Дод. фајлови - Наслов документа - Тип - Универзални индикатор извора - Верзија за штампу - Алати за читање - Повезане ставке - Политика рецензија - Опис - Претраживања - Редослед - Претраживање - Послати подаци - Претражи URL - Предложи извор - Наслов - URL - Преузми - Додатни фајлови - Индексирање метаподатака - Опис - Кључ - Локализација - Подручја претраживања - Наслов - Верзија - Индексирање метаподатака - Прикажи политику рецензија
diff --git a/locale/sr_RS@latin/admin.xml b/locale/sr_RS@latin/admin.xml index be584275ff6..c3b274e2720 100644 --- a/locale/sr_RS@latin/admin.xml +++ b/locale/sr_RS@latin/admin.xml @@ -45,15 +45,9 @@ Informacije o serveru Verzija PHP-a Platforma OS-a - Opis sajta + Opis sajta Imejl glavnog kontakta Ime glavnog kontakta - Kontakt imejl upravnika je obavezan. - Kontakt ime upravnika je obavezno. - Morate uneti minimalnu dužinu lozinke od najmanje 4 karaktera. - Naslov je obavezan. - Logo sajta - Neispravan format logoa sajta. Sistem prihvata .gif, .jpg ili .png formate. Uvod Minimalna dužina lozinke Registrujte sajt za indeksiranje (sakupljanje metapodataka) diff --git a/locale/sr_RS@latin/common.xml b/locale/sr_RS@latin/common.xml index c9bb10e4f54..1fecaa4e391 100644 --- a/locale/sr_RS@latin/common.xml +++ b/locale/sr_RS@latin/common.xml @@ -38,7 +38,6 @@ A B C Č Ć D Đ E F G H I J K L M N O P Q R S Š T U V W X Y Z Ž Dodeljeno Dopunski opisni tekst - Molimo priložite dopunski opisni tekst za ovu sliku kako bi pristup sadržaju bio moguć i korisnicima sa tekstualnim čitačima ili pomagalima za čitanje (npr. slepim i slabovidnim osobama). i Primeni postupak Dodeli @@ -140,7 +139,6 @@ Originalno ime fajla ili Ostalo - Logo zaglavlja stranice Dodatak Dodatak "{$pluginName}" je omogućen. Dodatak "{$pluginName}" je onemogućen. @@ -177,7 +175,6 @@ Bez naslova Ažurirano - Dostavljeni fajl Dostavi Fajl ne može da se dostavi. Pokušajte opet ili kontaktirajte administratora. Gore @@ -323,7 +320,6 @@ Udaljeni URL Resetuj Nije pročitano - Fajl nije dostavljen ili je u pogrešnom formatu! Dodaci Dodajte temu imejla. Dodajte tekst imejla. @@ -380,7 +376,6 @@ Sistemski postavljač fajlova postavlja fajl. Ako se ne fajl ne pojavi to verovatno znači da vaš internet pregledač ne podržava neki od njegovih procesa. Kontaktirajte administratora za podršku. Početna Elemenata po stranici - Omiljena sličica-Favicon Obavešteno: {$dateNotified} Strana {$pageNumber} {$percentage}% @@ -400,7 +395,6 @@ Podnaslov Komponenta Datum dostavljanja - Slika početne stranice Dostavi fajl Izmeni fajl Prevuci fajl ovde da započneš dostavljanje @@ -415,7 +409,6 @@ Ime pošiljaoca Imejl adresa pošiljaoca Data URL adresa nije ispravna, proverite i pokušajte ponovo. - Formular nije ispravno unet. Neophodno je dodavanje fajla Prethodno Sledeće diff --git a/locale/sr_RS@latin/manager.xml b/locale/sr_RS@latin/manager.xml index a4129a8791e..7bf19ba5644 100644 --- a/locale/sr_RS@latin/manager.xml +++ b/locale/sr_RS@latin/manager.xml @@ -143,11 +143,8 @@ Recenzentski interesi Uloge Došlo je do greške prilikom brisanja stavke. - Neispravan format logoa hedera početne strane ili slanje nije uspelo. Prihvatljivi formati su .gif, .jpg, ili .png. Neispravan format slike hedera početne strane ili slanje nije uspelo. Prihvatljivi formati su .gif, .jpg, ili .png. Neispravan format slike naslova hedera početne strane ili slanje nije uspelo. Prihvatljivi formati su .gif, .jpg, ili .png. - Levi bočni meni - Nije obeleženo Evidentiranje i revizija Neispravan format logoa hedera strane ili slanje nije uspelo. Prihvatljivi formati su .gif, .jpg, или .png. Statistike i Izveštaji @@ -177,7 +174,6 @@ Ukoliko resetujete sve šablone, sve modifikacije koje ste uradili biće izgubljene, da li ste sigurni da želite da nastavite? Ukoliko resetujete ovaj šablon, svi podaci biće vraćeni na početne vrednosti, a sve promene će biti izgubljene, da li želite da nastavite? Pretraži po imenu - Upravljač bočnog menija Dodaci metapodataka Dodaci metapodataka implementiraju dodatne standarde meta podataka. Dodatak OAI formata metapodataka @@ -236,33 +232,32 @@ Ili odaberite opseg po: Po geo lokaciji Suzi rezultate po zemlji, regionu i/ili gradu. - Sve što unesete ovde biće prikazano na početnoj stranici. - Napomena o autorskom pravu - Zahtevaj od autora da prihvate "Napomenu o autorskim pravim" kao deo procesa predaje rada. + Sve što unesete ovde biće prikazano na početnoj stranici. + Napomena o autorskom pravu + Zahtevaj od autora da prihvate "Napomenu o autorskim pravim" kao deo procesa predaje rada. Grupisanje dokumenata po tipu - Dostavite sliku koja će biti vidljiva na početnoj stranici. + Dostavite sliku koja će biti vidljiva na početnoj stranici. Opisi - Tema - Nove teme mogu biti instalirane korišćenjem "Dodataka" na vrhu stranice. + Tema + Nove teme mogu biti instalirane korišćenjem "Dodataka" na vrhu stranice. Obaveštenja o predajama radova autora Pošalji kopiju glavnom kontaktu koji je naveden u 1. koraku. Pošalji kopiju na ovu imejl adresu Politika "Otvorenog pristupa" Podnožje stranice - Unesite sliku, tekst ili HTML kod koji želite da se prikaže na dnu vašeg sajta. + Unesite sliku, tekst ili HTML kod koji želite da se prikaže na dnu vašeg sajta. Glavni kontakt Izjava o privatnosti Broj nedelja dozvoljenih za prihvatanje ili odbijanje recenzentskog zahteva Broj nedelja dozvoljenih zazavršetak recenzije Nikad ne obaveštavaj Zadata podešavanja mogu biti izmenjena za svaku recenziju tokom uredničkog procesa. - Pošalji podsetnik ukoliko recenzent nije odgvorio na recenzentski zahtev nakon (broj dana) od roka za odgovor: - Pošalji podsetnik ukoliko recenzent nije dao preporuke nakon (broj dana) od roka za za završetak recenzije: + Pošalji podsetnik ukoliko recenzent nije odgvorio na recenzentski zahtev nakon (broj dana) od roka za odgovor: + Pošalji podsetnik ukoliko recenzent nije dao preporuke nakon (broj dana) od roka za za završetak recenzije: Predefinisani rokovi recenzenata Kontakt za tehničku podršku Kontakt osoba koja može pomoći urednicima, autorima i recenzentima sa problemima prilikom predaje, uređivanja i recenziranja materijala za objavljivanje. Оpcije pristupa sajtu - Prikaži link ka "Obezbeđivanje procesa slepe recenzije" prilikom dodavanja Dodatak javnih identifikatora Ovaj dodatak uvodi podršku za javne identifikatore. Obriši dodatak @@ -409,7 +404,6 @@ Fajl biblioteka je neophodan. Proverite da li ste odabrali i na server postavili fajl. Potrebno je ime za ovaj fajl biblioteke. Tip fajla je neophodan za ovaj fajl biblioteke. - Plaćanja koja se realizuju preko ovog sajta će biti konvertovana u odabranu valutu. Vi želite da uklonite ovu ulogu iz ovog konteksta. To će izbrisati sva povezana podešavanja i sve korisničke dodele ovoj ulozi. Da li želite da nastavite? Ova stranica dozvoljava Upravniku da pregleda i potencijalno konfiguriše dodatke koji su trenutno instalirani. Dodaci su podeljeni u kategorije prema svojoj funkciji. Kategorije su dole izlistane i u svakoj kategroiji se nalazi komplet dodataka. Osoba za održavanje @@ -424,8 +418,7 @@ Autorima će biti automatski poslata poruka potvrđujući prijem prijavljenog članka. Možete kopije ove poruke poslati sledećim: Ako omogućavate neposredan i direktan pristup celokupnom objavljenom sadržaju možete uneti opis vaše politike otvorenog pristupa. Preporučene smernice uključuju bibliografske standarde i formate uz primere citatnih formata koje treba koristiti u prijavljenim člancima. - Recenzenti će morati da vrše recenziju u skladu sa politikom objavljivanja sukoba interesa koju dole odredite. - Nispravan format za favicon. Prihvaćeni formati su .ico, .png, and .gif. + Omiljena sličica-Favicon Sledeći url se može koristiti za generisanje izveštaja prema trenutnim podešavanjima. Kopirajte url u vaš internet pregledač i pritisnite enter. Možete ga memorisati i koristiti kao vaš poseban generator izveštaja. Po tipu objekta i/ili id objekta Vaš {$contextObjectName} je konfigurisan da zabeleži više od jednog načina merenja upotrebe sajta. Statistika upotrebe će biti prikazana u nekoliko konteksta. U nekim slučajevima jedan način statistike mora biti upotrebljena, npr. da se prikaže lista sa poredanim rezultatima najviše upotrebljenih prijavljenih čalanak ili da se rangiraju rezultati pretrage. Molimo vas da odaberet jedan od načina merenja kao početni. diff --git a/locale/sr_RS@latin/reader.xml b/locale/sr_RS@latin/reader.xml index 4ad40618713..690e957e299 100644 --- a/locale/sr_RS@latin/reader.xml +++ b/locale/sr_RS@latin/reader.xml @@ -35,147 +35,4 @@ Naslov Pregled svih komentara Ceo tekst: - Dodaj komentar - Konfiguracija - Da li ste sigurni da želite izbrisati ovaj kontekst i sva pretraživanja vezana za njega? - Kreiraj kontekst - Izmeni kontekst - Metapodaci - Koristi imena autora kao pojmove za pretraživanje kako bi korisnici mogli pronaći druge radove autora ovog priloga (npr. za kontekst "drugi radovi"). - Koristi imena autora kao pojmove za pretraživanje i definiši kontekst kao traženje radova koji citiraju ovaj članak. - opcija alata za čitanje mora biti aktivirana kako bi se duplim klikom na odabranu reč omogućio pristup ovom kontekstu.]]> - Koristi geografski indeksirane podatke kao pojmove za ovo pretraživanje. - Opcije - Upravljanje - - Deljenje - Deljenje je omogućeno - addthis.com и kopirajte "Sharing button" код испод.]]> - - Osnovna podešavanja - AddThis.com korisničko ime - Stil dugmeta - Koristi padajući meni - Napredna podešavanja (opciono) - AddThis.com dokumentaciju za prilagođavanje za dalja uputstva.]]> - Brend - (lista odvojena zarezom)]]> - Jezik - Logo - Pozadina logoa - Boja logoa - - Alatke za čitanje - Da li ste sigurni da želite izbrisati ovo pretraživanje? - Kreirajte pretraživanje - Izmeni pretraživanje - Povezane stavke - Apstrakt (prikazuje apstrakt priloga). - O autoru (prikazuje biografske podatke koje je uneo autor). - Bibliografska referenca priloga (pruža bibliografski zapis dotičnog priloga). - Definicije pojmova (omogućuje čitateljima da duplim klikom na bilo koju reč u prilogu direktno konsultuju rečnik). - Onemogući povezane stavke - Pošalji imejl autoru (otvara korisniku šablon imejla naslovljen na autora). - Obavesti kolegu (otvara korisniku šablon imejla sa linkom na stavku). - Nađi reference - Verzija za ispis (otvara u novom prozoru tekst priloga optimizovan za ispis na štampaču - korisno za priloge u HTM formatu). - Dodatni fajlovi (prikazuje listu fajlova koje je autor priložio uz prijavu). - Metapodaci priloga (prikazuje indeksirane metapodatke koje su unieli autori ili generisao sistem). - Status - Podesi AddThis - Provera je završena. - U redu - {$url} nije važeći. - Proveri ispravnost URL-ova alata za čitanje - Proveri - Da li ste sigurni da želite izbrisati ovu verziju i sve dodatke i pretraživanja vezane uz nju? - Da li ste sigurni da želite nepovratno vratiti sve verzije u njihovo standardno stanje? Ako je tako, moraćete odabrati aktivnu verziju u podešavanjima stranice. - Napravi verziju - Uredi verziju - Izvezi - Uvezi verziju - Metapodaci - Vrati verziju na osnovna podešavanja - O autoru - Bibliografski standard - Bibliografska referenca priloga - Online - Web - Obavesti kolegu - Skraćenica - I - Ako je članak indeksirao Google Scholar, može biti priloženo "citirao X" linkom koji vodi do liste radova koji su citirani. Isto tako, Google Scholar će izlistati sve stavke navodeći naslov i autora. Kako bi pristupili online izvorima koji su jedino dostupni preko vaše istraživačke biblioteke, možete otići na Scholar postavke u Google Scholar i aktivirati linkove biblioteke za vašu instituciju. - Kontekst - Ako je stavka HTML fajl (pre nego PDF), duplim klikom na bilo koju reč u tekstu pojaviće se u okviru Reč-za-Definisanje. Isto tako, reči mogu biti napisane ili zalepljene u okvir. Da biste saznali više o pretraženom izvoru, kliknite na O ČASOPISU. Ovi izvori su odabrani zbog svoje relevantnosti i svog otvorenog (besplatnog) pristupa celom ili delimičnom sadržaju. - Opis - Redosled - Konteksti - Izraze za pretraživanje je odabrao autor(i). Njih može promeniti ili izbrisati čitalac, i to dva ili tri kraća, preciznija izraza ili fraze dobivene pretraživanjem uz pomoć Booleanove (I) algebre. Kako biste naučili više o pretraženim izvorima, kliknite na ABOUT. Ovi izvori su odabrani zbog svoje relevantnosti i otvorenog (besplatnog) pristupa njegovom celom ili delimičnom sadržaju. - Tražite izraze - Reč za definisanje - Naslov - Pošalji imejl autoru - registraciju]]> - Vaša poruka je poslata. - Traženje referenci - Google Scholar - Windows Live Academic - Definisani izrazi - Saradnik - Pokrivenost - Datum - Opis - Dublin Core - Format - Identifikator - Jezik - Izdavač - Relacija - Prava - Izvor - Tema - Naslov - Tip - Metapodaci za ovaj dokument - Apstrakt - Autorska prava i dozvole - Geo-prostorna lokacija, hronološko razdoblje, istraživački uzorak (pol,starost, itd.) - (DD.MM:GGGG.) - Disciplina(e) - Format fajla - Status i žanr - PKP metapodaci stavki - Engleski=en - Organizaciona agencija, mesto - Časopis/konferencijski naslov; vol., br. (godina) - Sponzor(i) - Ključna reč(i) - Dod. fajlovi - Naslov dokumenta - Tip - Univerzalni indikator izvora - Verzija za štampu - Alati za čitanje - Povezane stavke - Politika recenzija - Opis - Pretraživanja - Redosled - Pretraživanje - Poslati podaci - Pretraži URL - Predloži izvor - Naslov - URL - Preuzmi - Dodatni fajlovi - Indeksiranje metapodataka - Opis - Ključ - Lokalizacija - Područja pretraživanja - Naslov - Verzija - Indeksiranje metapodataka - Prikaži politiku recenzija diff --git a/locale/sv_SE/admin.xml b/locale/sv_SE/admin.xml index 5374192b97d..52788da65ce 100644 --- a/locale/sv_SE/admin.xml +++ b/locale/sv_SE/admin.xml @@ -36,7 +36,7 @@ Kan ej öppna språkbeskrivning från PKP:s webbplats. Kan ej lägga till nya språk/regioner till språkregistreringsfilen, vanligtvis "registry/locales.xml". Det här kommer att vara förvalt språk/region för webbplatsen. Du kan inte inaktivera det utan att välja ett annat förvalt språk/region. - + Är du säker på att du vill uppdatera språkfilen? Tillgänglig språkspecifik information, t.ex. anpassade e-postformulär, kommer att raderas. Installerade språk/regioner Hantera språk/regioner @@ -65,20 +65,14 @@ PHP-version Operativsystem/plattform Inställningar - Om webbplatsen + Om webbplatsen E-postadress till primär kontakt Namn på primär kontakt - E-postadress till primär kontakt är obligatoriskt. - Namn på primär kontakt är obligatoriskt. - Du måste ange ett lösenord på minst fyra tecken. - Du måste ange titel. Din installation är konfigurerad för att registrera mer än ett mått på användning. Användningsstatistiken kommer att presenteras i flera sammanhang. Det finns fall där endast ett mått på användning måste användas, t.ex. för att visa en sorterad lista över de mest använda bidragen eller för att rangordna sökresultat. Välj ett av de konfigurerade värdena som default. - Webbplatslogotyp - Ogiltigt format för webbplatslogotyp. Tillåtna format är .gif, .jpg eller .png. Introduktion Minimilängd på lösenord (antal tecken) Språk för webbplatsen diff --git a/locale/sv_SE/api.xml b/locale/sv_SE/api.xml index ddd4235b106..3ad009c98a7 100644 --- a/locale/sv_SE/api.xml +++ b/locale/sv_SE/api.xml @@ -16,7 +16,7 @@ Du kan bara visa opublicerade bidrag som du själv blivit tilldelad. Du kan inte radera ett bidrag som inte är kopplat till den här kontexten. Du har inte behörighet att ta bort det här bidraget. - Den efterfrågade resursen kunde inte hittas. + Den efterfrågade resursen kunde inte hittas. Din förfrågan kunde inte fullföljas eftersom det saknar nödvändig information. Din förfrågan kunde inte fullföljas eftersom ID:t för bidragssteget är ogiltigt. Ett oväntat fel uppstod. Ladda om sidan och försök igen. diff --git a/locale/sv_SE/common.xml b/locale/sv_SE/common.xml index b1badaf62f4..a11d183ae79 100644 --- a/locale/sv_SE/common.xml +++ b/locale/sv_SE/common.xml @@ -56,7 +56,6 @@ av en det och eller men är om de annars när från av på av i ut över i med Tilldelat Alternativ text - För att förbättra sökmotoroptimeringen och följa Web Content Accessibility Guidelines-standarden (WCAG), vänligen beskriv den information som bilden innehåller och som skulle saknas om webbplatsen visades i en webbläsare med bara text eller med hjälpmedel (t.ex. skärmläsare). Ett exempel: "Vår redaktör talar på PKP#2015-konferensen". och Verkställ åtgärd Utse @@ -167,7 +166,6 @@ Påbörja Pågående Items per page - Adressikon (eng. "favicon") Nyckelord Språk Språk @@ -201,6 +199,8 @@ OK Alternativ Ordna + Flytta up {$itemTitle} i listan + Flytta ned {$itemTitle} i listan Ursprungligt filnamn eller Annat @@ -208,7 +208,6 @@ {$start}-{$end} av {$total} Bläddra bland ytterligare sidor Sida {$pageNumber} - Logotyp sidhuvud {$percentage}% Plugin Pluginet "{$pluginName}" har aktiverats. @@ -268,11 +267,8 @@ Utan titel Uppdaterad Uppladdningsdatum - Uppladdad fil Ladda upp Filen kunde inte laddas upp eller ändras. - Ingen fil uppladdad eller ogiltig filtyp! - Förstasidesbild Upp Ladda upp fil Ändra fil @@ -340,7 +336,6 @@ är börjar med Formuläret var inte korrekt ifyllt. - Formuläret var inte korrekt ifyllt. Filuppladdning är obligatorisk. (* obligatorisk) Skicka in igen diff --git a/locale/sv_SE/manager.xml b/locale/sv_SE/manager.xml index 3bdc099d401..66ac3676418 100644 --- a/locale/sv_SE/manager.xml +++ b/locale/sv_SE/manager.xml @@ -213,27 +213,23 @@ Avgränsa reslutat efter land, region och/eller stad. Sponsor Ytterligare innehåll - Det som fylls i här kommer att synas på din förstasida. - Upphovsrättsdeklaration - Kräv att författare godkänner upphovsrättsdeklarationen när bidrag skickas in. + Det som fylls i här kommer att synas på din förstasida. + Upphovsrättsdeklaration + Kräv att författare godkänner upphovsrättsdeklarationen när bidrag skickas in. Riktlinjer för författare Rekommenderade riktlinjer inkluderar bibliografi- och formateringsstandarder tillsammans med exempel på vanliga referensformat att använda vid inlämning av bidrag. Intressekonflikter - Granskare kommer att bli ombedda att acceptera policyn för intressekonflikter som du specificerar nedan. Ett fel uppstod vid borttagning av detta objekt. - Ogiltigt format för addressikon. Format som accepteras är .ico, .png, and .gif. + Adressikon (eng. "favicon") Gruppering av filtyper - Ogiltigt format för logotyp på förstasidans sidhuvud, eller misslyckad uppladdning. Godkända format är .gif, .jpg, och .png. Bild på förstasidan - Ladda upp en bild som får en framträdande plats på förstasidan. + Ladda upp en bild som får en framträdande plats på förstasidan. Ogiltigt format för bild på förstasidan, eller misslyckad uppladdning. Godkända format är .gif, .jpg, och .png. Ogiltigt format för titelbild på förstasidans sidhuvud. Godkända format är .gif, .jpg, och .png. Beskrivningar - Tema - Nya teman kan installeras från fliken Plugins högst upp på den här sidan. - Hantering av sidomeny + Tema + Nya teman kan installeras från fliken Plugins högst upp på den här sidan. Sidomeny - Ej vald Loggning och revidering Logotyp Avisering om bidrag från författare @@ -243,7 +239,7 @@ Om du ger omedelbar fri tillgång till allt publicerat innehåll, kan du fylla i open access-policy. Ogiltigt format för logotyp på sidhuvudet. Godkända format är .gif, .jpg, och .png. Sidfot - Lägg till bilder, text eller HTML-kod som du vill ska synas längst ned på din webbplats. + Lägg till bilder, text eller HTML-kod som du vill ska synas längst ned på din webbplats. Sammanfatta granskningspolicyn och -processen för läsare och författare. Den här beskrivningen innehåller ofta antal granskare som normalt används när ett bidrag granskas, kriterier som granskarna ombeds gå efter när de bedömer inskickade bidrag, förväntad tid som krävs för att genomföra granskningar, och principerna som används för att välja granskare. Primär kontakt Kontaktinformation till ex. primär redaktör, ansvarig redaktör eller administratör, som kan visas på din publika webbplats. @@ -253,12 +249,9 @@ Antal veckor tillåtna för granskning Påminn aldrig Defaultvärden kan ändras för varje granskning under redaktionsprocessen. - Skicka en påminnelse om granskaren inte har svarat på en granskningsförfrågan inom följande antal dagar efter deadline: - Skicka en påminnelse om granskaren inte har lämnat en rekommendation inom följande antal dagar efter deadline: + Skicka en påminnelse om granskaren inte har svarat på en granskningsförfrågan inom följande antal dagar efter deadline: + Skicka en påminnelse om granskaren inte har lämnat en rekommendation inom följande antal dagar efter deadline: Default-deadlines för granskning - Visa en länk till "Att garantera anonym granskning" vid uppladdning - Sitemap - {$path}]]> Sponsorrelation och policybeskrivning Exempel: vetenskapliga organisationer, universitetsinstitutioner, kooperativ etc. Sponsorer visas publikt. Erfarna webbutvecklare kan ladda upp en CSS-fil för att ytterligare anpassa webbplatsens utseende. @@ -366,7 +359,6 @@ Ingen betalningsmetod vald Betalningsmetod Valuta - Betalningar görs direkt via den här webbplatsen och i den valda valutan. Alternativ för roller @@ -489,7 +481,7 @@ Den importerade användaren "{$username}" saknar lösenord. Kolla formatet på din import-XML. Användaren importerades inte. Lösenordet för den importerade användaren "{$username}" kunde inte importerad i sin befintliga form. Användaren har fått ett nytt vlösenord via e-post. Användaren är importerad. Den importerade användaren "{$username}" har ett okrypterat lösenord, vilket inte är giltigt. Användaren importerades inte. - + Titel Sökväg diff --git a/locale/sv_SE/reader.xml b/locale/sv_SE/reader.xml index de12b3e1572..70c5dce5703 100644 --- a/locale/sv_SE/reader.xml +++ b/locale/sv_SE/reader.xml @@ -34,147 +34,4 @@ Titel Visa alla kommentarer Fulltext: - Lägg till kommentar - Konfiguration - Är du säker på att du vill ta bort den här kontexten och all tillhörande sökhistorik? - Skapa kontext - Redigera kontext - Metadata - Använd författarnamn som defaultsöktermer för att underlätta för användarna att hitta annat material av författaren (t.ex. för en "Andra artiklar"-kontext) - Använd förattarnamn som defaultsöktermer och beskriv kontexten som en sökning av citeringar av artikeln. - RST-inställningar för att tillåta att ord ska öppnas den kontexten om man dubbelklickar på dem.]]> - Använd geografisk indexeringsinformation som defaultsöktermer. - Alternativ - Administration - - Delning - Delning aktiverad - addthis.com, och klistra in Sharing button-koden nedan.]]> - - Grundinställningar - AddThis.com-användarnamn - Stil på knapp - Använd rullgardinsmeny - Avancerade inställningar (valfritt) - AddThis.coms anpassningsdokumentation för referens.]]> - Märke - (kommaseparerad lista)]]> - Språk - Logotyp - Bakgrund på logotyp - Färg på logotyp - - Läsverktyg - Är du säker på att du vill rensa den här sökningen? - Skapa sökning - Redigera sökning - Relaterat material - Abstract (visar materialets abstract). - Visa granskningspolicy - Om författaren (visar biografisk information som författaren angivit). - Så här citerar du materialet (visar bibliografiska detaljer om materialet). - Sök på ord (Gör det möjligt för läsare att dubbelklicka på vilket ord som helst i materialet för att slå upp det i ett uppslagsverk). - Inaktivera Relaterat material - Skicka e-postmeddelande till författaren (går till ett förifyllt e-postformulär med författarens e-postadress). - Tipsa en kollega (går till ett förifyllt e-postformulär med en länk till materialet). - Sök referenser - Uskriftsversion (ger en utskriftsvänlig version av materialet). - Tilläggsfiler (visar filer som författaren inkluderat i bidraget). - Metadata för indexering (visar materialets metadata för indexering, som angivits av författare och system). - Status - Konfigurera AddThis - Validering klar. - OK - {$url} är inte giltig. - Validera URL:er för Läsverktyg - Validera - Är du säker på att du vill radera den här versionen och alla tillhörande kontexter och sökhistorik? - Är du säker på att du vill återställa alla versioner till deras defaultvärden? Om du är säker behöver du välja en aktiv version på Inställningar-sidan. - Skapa version - Redigera version - Exportera - Importera version - Metadata - Återställ versioner till defaultvärden - Om författaren - Citeringsformat - Så här citerar du materialet - Online - Webb - Tipsa en kollega - Förkortning - OCH - Om artikeln är indexerad i Google Scholar kan den ha en "Cited by X"-länk i anslutning som leder till en lista över verk som har refererat till artikeln. Google Scholar även det material som citerar författaren eller titeln. För att komma åt e-resurser som endast är tillgängliga via ditt bibliotek kan du behöva gå till Scholar Preferences i Google Scholar och aktivera Library Links för din institution. - Kontext - Om materialet är en HTML-fil (och inte en PDF) kan man dubbelklicka på valfritt ord i texten för att lägga det i Ord att definiera-rutan. Man kan även skriva eller klistra in ord i fältet manuellt. För ytterligare information om sökresurserna, se OM. De här resurserna är valda utifrån sin relevans och deras öppna (fria) tillgång till delar av eller hela innehållet. - Beskrivning - Ordning - Kontexter - Söktermerna är valda av författaren/författarna. De kan ändras eller tas bort av läsaren eftersom två eller tre korta, precisa fraser ger de bästa Booleska (OCH) sökningarna. För ytterligare information om sökresurserna, se OM. De här resurserna är valda utifrån sin relevans och deras öppna (fria) tillgång till delar av eller hela innehållet. - Söktermer - Ord att definiera - Titel - Skicka e-postmeddelande till författaren - registrering]]> - Ditt meddelande har skickats. - Att hitta referenser - Google Scholar - Windows Live Academic - Slå upp ord - Medarbetare - Täckning - Datum - Beskrivning - Dublin Core - Format - Identifikator - Språk - Utgivare - Relation - Rättigheter - Källa - Ämne och nyckelord - Titel - Resurstyp - Metadata för det här dokumentet - Abstract - Upphovsrätt och tillstånd - Geografiskt område/plats, tidsperiod, urval (kön, ålder, etc.) - (ÅÅÅÅ-MM-DD) - Disciplin(er) - Filformat - - Metadata enheter - Engelska=en - Organisation, stad/plats - Titel; vol., nr. (år) - Sponsor(er) - Nyckelord - Tilläggsfiler - Dokumentets titel - Typ - Uniform Resource Identifier - Utskriftsversion - Läsverktyg - Relaterat material - Granskningspolicy - Beskrivning - Sökningar - Ordna - Sök - Skicka data - Sök URL - Föreslå en källa - Titel - URL - Ladda ned - Tilläggsfiler - Metadata för indexering - Beskrivning - Nyckel - Språk/region - Relaterat material - Titel - Version - Metadata för indexering diff --git a/locale/sv_SE/submission.xml b/locale/sv_SE/submission.xml index 4c9e17e3d3a..d404684d00f 100644 --- a/locale/sv_SE/submission.xml +++ b/locale/sv_SE/submission.xml @@ -383,7 +383,6 @@ Vänligen ange ett ämne. Vänligen ange en disciplin. Vänligen ange nyckelord. - Vänligen ange stödorganisation. Vänligen ange information om täckning. Vänligen ange typ. Vänligen ange källa. @@ -617,8 +616,6 @@ Deadline för granskning Granskning inskickad Radera bidrag? - Flytta up {$itemTitle} i listan - Flytta ned {$itemTitle} i listan Visa bidrag Tilldelade granskningar slutförda Bearbetningar insända diff --git a/locale/tr_TR/admin.xml b/locale/tr_TR/admin.xml index 5d2282b1fba..0a68c334bba 100644 --- a/locale/tr_TR/admin.xml +++ b/locale/tr_TR/admin.xml @@ -44,15 +44,9 @@ Sunucu Bilgisi PHP sürümü İşletim Sistemi Platformu - Site Tanımı Hakkında + Site Tanımı Hakkında Temel iletişim e-posta adresi İletişim için temel kişi adı - Temel iletişim e-posta adresi gerekiyor. - İletişim için temel kişi adı gerekiyor. - Şifre için en az dört karakter girmelisiniz. - Bir başlık gerekli. - Site Logosu - Geçersiz site logosu biçimi. Kabul edilebilir biçimler: .gif, .jpg veya .png. Giriş Şifre için en kısa karakter sayısı Site Dili diff --git a/locale/tr_TR/common.xml b/locale/tr_TR/common.xml index 7dae30801d5..5b507e66d45 100644 --- a/locale/tr_TR/common.xml +++ b/locale/tr_TR/common.xml @@ -37,7 +37,6 @@ A B C Ç D E F G Ğ H I İ J K L M N O Ö P Q R S Ş T U Ü V W X Y Z Atanmış Alternatif Metin - Salt metin tarayıcı veya yardımcı cihazlar ile kullanıcıların erişebilirliğini sağlamak için bu görüntü için alternatif bir metin giriniz. ve Eylemi Uygula Ata @@ -137,7 +136,6 @@ Orijinal dosya adı veya Diğer - Sayfa Üstü Logosu Eklentiler "{$pluginName}" eklentisi aktifleştirildi. "{$pluginName}" eklentisi kapatıldı. @@ -173,7 +171,6 @@ Başlatılmamış Başlıksız Güncellenmiş - Yüklenen dosya Dosya yükle Dosya yüklenemedi ve gözden geçirilemedi. Yukarı @@ -313,7 +310,6 @@ Uzak Uzak URL Okunmamış - Dosya yüklenemedi veya hatalı dosya türü! Eklentiler Lütfen bir e-posta konusu giriniz. Lütfen bir e-posta metni giriniz. @@ -467,7 +463,6 @@ Gönderici Adı Gönderici e-Postası Belirtilen URL geçersiz. Lütfen kontrol edip tekrar deneyin. - Form uygun şekilde sunulmadı. Bir dosya yüklemesi gereklidir. Önceki Sonraki diff --git a/locale/tr_TR/manager.xml b/locale/tr_TR/manager.xml index 5affe443d9d..430e2536225 100644 --- a/locale/tr_TR/manager.xml +++ b/locale/tr_TR/manager.xml @@ -143,12 +143,8 @@ İlgi Alanı Görevler Bu öğe silinirken bir hata oluştu. - Giriş sayfası başlık logosu için geçersiz dosya biçimi. Desteklenen dosya biçimleri .gif, .jpg, veya .png biçimleridir. - Giriş sayfası şekli için geçersiz dosya biçimi. Desteklenen dosya biçimleri .gif, .jpg, veya .png biçimleridir. Giriş sayfası şekli için geçersiz dosya biçimi. Desteklenen dosya biçimleri .gif, .jpg, veya .png biçimleridir. - Seçilmemiş Giriş ve Denetim - Giriş sayfası başlık logosu için geçersiz dosya biçimi. Desteklenen dosya biçimleri .gif, .jpg, veya .png biçimleridir. Giriş sayfası şekli için geçersiz dosya biçimi. Desteklenen dosya biçimleri .gif, .jpg, veya .png biçimleridir. Giriş sayfası şekli için geçersiz dosya biçimi. Desteklenen dosya biçimleri .gif, .jpg, veya .png biçimleridir. İstatistikler ve Raporlar @@ -179,7 +175,6 @@ If you reset this template, all message data will be reset to its default value, losing all modifications. Do you want to confirm this operation? Ada Göre Ara Use the form below to set the maximum values for the terms you wish to search for. The form is pre-populated with the calculated averages of those fields. - Yan Taraf Yönetimi Hatalı sayfa logo görseli veya hatalı yükleme. Kabul edilebilir biçimler: .gif, .jpg veya .png. Üst Veri Eklentileri Metadata Plugins implement additional meta-data standards. diff --git a/locale/tr_TR/reader.xml b/locale/tr_TR/reader.xml index 7fbeed0ed08..43f9d6832e1 100644 --- a/locale/tr_TR/reader.xml +++ b/locale/tr_TR/reader.xml @@ -34,146 +34,4 @@ Başlık Tüm yorumları gör Tam Metin: - Yorum ekle - Yapılandırma - Bu yapıyı ve tüm ilişkili aramaları silmek istediğinizden emin misiniz? - İçerik Oluştur - İçeriği Düzenle - Üst Veri - Okuyucuların diğer makalelere ulaşabilmesi için yazar adını arama terimi olarak kullan (Örneğin; "Diğer Çalışmaları" gibi bir çerik kullanarak) - Yazar adını arama terimi olarak kullan ve içeriği makale kaynaklarına arama bağlantısı olarak ekle. - RST Ayarları sayfasından etkinleştirilmelidir.]]> - Varsayılan arama terimi olarak coğrafi indeksleme verilerini kullan. - Seçenekler - Yönetim - - Paylaşım - Paylaşım Etkinleştirildi - addthis.com adresine bir hesap ile giriş yapın ve paylaşım butonu kodunu kopyalayıp aşağıya yapıştırın.]]> - Temel Ayarlar - AddThis.com kullanıcı adı - Buton Biçimi - Açılır menüyü kullan - Gelişmiş Ayarlar (isteğe bağlı) - AddThis.com özelleştirilmiş belgelerine bakınız.]]> - Marka - (virgül ile ayırın)]]> - Dil - Logo - Logo arka planı - Logo rengi - - Okuma araçları - Bu Aramayı silmek istediğinizden emin misiniz? - Arama Oluştur - Arama Düzenle - İlişkili seçenekler - Özet (Öğenin özetini gösterir). - Yazar hakkında (yazar tarafından girilen biyografi bilgilerini gösterir). - Öğeyi nasıl kaynak gösteririm (öğe için bibliyografik detay sağlar). - Terimlere bak (bir öğe içindeki herhangi bir kelimeyi çift tıklayabilmesi için okuyucuları etkinleştir ve kelimeyi bir elektronik sözcükte arayabilmesini sağla). - İlişkili Seçenekleri Pasifleştir - Yazara e-posta gönder (yazarın e-posta adresini içeren bir ön tanımlı e-posta formu ile yazara e-posta gönderilmesini sağlar). - Meslekdaşına bildir (yazıya bağlantı veren ön tanımlı bir e-posta oluşturarak bir meslekdaşına haber verme olanağı sağlar). - Referansları Bul - Basılı sürüm (bir öğenin yazıcı dostu sürümünü sağlar). - Ek dosyalar (yazar gönderilerindeki ek dosyaların listesini görüntüler). - Dizinleme üst verisi (yazar ve sistem tarafından oluşturulan öğe dizinleme üst verisini gösterir). - Durum - "AddThis" Yapılandırma - Doğrulama Tamamlandı. - Evet - {$url} geçerli değil. - Okuma araçları için doğrulama URL'leri - Doğrulama - Bu sürümü silmek istediğinizden emin misiniz? Sürümün silinmesi ilişkili tüm içerik ve aramaları silecektir. - Tüm seçenekleri ön tanımlı biçime döndürmek istediğinizden emin misiniz? Eğer eminseniz düzenleme sayfasından bir etkin sürüm seçmeniz gerekir. - Sürüm Oluştur - Sürümü Düzenle - İhraç - Alınan Sürüm - Üst Veri - Varsayılan Sürümleri Yeniden Yükle - Yazar hakkında - Atıf Biçimi - Nasıl kaynak gösteririm - Çevrimiçi - Web - Meslektaşını haberdar et - Kısaltma - VE - Makale Google Akademikte dizinlendiğinde, X kişi tarafından atıf yapılan bağalntı eşlik edebilir ve atıf yapılan çalışmaların bağlantısını sağlar. Google Akademik tüm alıntı yapılan öğelerin başlık ve yazarlarını listeler. Sadece araştırma kütüphaneniz aracılığıyla çevrimiçi kaynaklara erişim için, Google Akademik'te akademik tercihlere gidin ve kurumunuz için kütüphane bağlantılarını etkinleştirin. - İçerik - Eğer öğe HTML dosyasıysa (PDF yerine) herhangi bir kelime çift kilk edilince kelime tanımlama kutusunda görüntülenir. Ayrıca kelimeler kutuya yapıştırılabilir veya yazılabilir. Kaynak arama hakkında daha fazlasını öğrenmek için HAKKINDA'ya klik edebilirsiniz. Bu kaynaklar ilgililik, açık erişim ve içindekiler bölümü için seçilmiştir. - Tanım - Düzen - İçerikler - Bu arama terimleri yazar(lar) tarafından seçilmiştir. Terimler okuyucular tarfından değiştirilebilir veya silinebilir, iki veya üç kısa, kesin terimler veya ifadeler en iyi Boolean (VE) aramalar için üretilmiş gibidir. Kaynak arama hakkında daha fazlasının öğrenmek için HAKKINDA'ya tıklayabilirsiniz. Bu kaynaklar ilgililik, açık erişim ve içindekiler bölümü için seçilmiştir. - Arama Terimleri - Sözcük Tanımla - Başlık - Yazara e-posta gönder - Kayıt gerekli.]]> - Mesajınız gönderildi. - Referans Bulma - Google Akademik - Windows Live Akademik - Terimlere Bakınız - Katkıda Bulunan - Kapsam - Tarih - Tanım - Dublin Core - Biçim - Tanımlayıcı - Dil - Yayıncı - İlişki - Haklar - Kaynak - Konu - Başlık - Tür - Dokümanın Üst Verisi - Özet - Telif hakkı ve izinler - Coğrafik konum, kronolojik period, araştırma örneklemi (cinsiyet, yaş, vb.) - (YYYY-AA-GG) - Disiplin(ler) - Dosya biçimi - - PKP Üst Veri Öğeleri - İngilizce=en - Organizasyon ajansı yeri - Başlık; cilt, no. (yıl) - Destekleyen(ler) - Anahtar Kelime(ler) - Ek Dosyalar - Doküman Başlığı - Tür - Tekbiçim Kaynak Belirleyici - Basılı sürüm - Okuma Araçları - İlgili Başlıklar - Değerlendirme politikası - Açıklama - Aramalar - Sırala - Ara - Veri Gönder - URL Arama - Kaynak Öner - Başlık - URL - İndir - Ek dosyalar - Üst Veri Dizinleme - Açıklama - Anahtar - Yerel - İlgili Başlık Seti - Başlık - Sürüm - Üst veri dizinleme - Değerlendirme Politikasını Göster diff --git a/locale/uk_UA/admin.xml b/locale/uk_UA/admin.xml index 841b5ff9ba3..bac8e8eca03 100644 --- a/locale/uk_UA/admin.xml +++ b/locale/uk_UA/admin.xml @@ -65,20 +65,14 @@ Версія PHP Операційна платформа Налаштування - Інформація про сайт + Інформація про сайт Email основної контактної особи Ім'я основної контактної особи - Необхідно вказати адресу електронної пошти основної контактної особи. - Необхідно вказати ім'я основної контактної особи. - Необхідно вказати мінімальну довжину пароля (не менше 4 символів). - Необхідно вказати назву. Ваша установка налаштована для запису більш ніж одного показника використання. Статистика використання відображатиметься в декількох контекстах. Трапляються випадки, коли має бути використана лише одна статистика використання, наприклад, щоб відобразити впорядкований список матеріалів, які використовуються найчастіше або ранжувати результати пошуку. Будь ласка, оберіть одну з налаштованих метрик як усталену. - Логотип сайту - Неприпустимий формат зображення логотипу. Припустимі формати .gif, .jpg, або .png. Вступ Мінімальна довжина пароля Мова сайту diff --git a/locale/uk_UA/common.xml b/locale/uk_UA/common.xml index 141c4c0ad02..60a824be5e8 100644 --- a/locale/uk_UA/common.xml +++ b/locale/uk_UA/common.xml @@ -56,7 +56,6 @@ а або але бо в де для з з-під зі і із й коли крізь на не під при про у та там тоді що Призначений Альтернативний текст - Будь ласка, додайте до цього зображення альтернативний текст, щоби підвищити доступність для користувачів, які використовують текстові браузери та допоміжні пристрої. та Застосувати дію Призначити @@ -167,7 +166,6 @@ Розпочати Триває Об'єкти на сторінці - Іконка Ключові слова Мова Мови @@ -201,6 +199,8 @@ OK Опції Сортування + Підняти нагору {$itemTitle} + Опустити донизу {$itemTitle} Оригінальне ім'я файлу або Інше @@ -208,7 +208,6 @@ {$start}-{$end} з {$total} Переглянути додаткові сторінки Сторінка {$pageNumber} - Логотип заголовку сторінки {$percentage}% Модуль Модуль "{$pluginName}" був включений. @@ -268,11 +267,8 @@ Без заголовку Оновлено Дата завантаження - Завантажений файл Завантажити Цей файл не може бути завантажений або змінений. - Не завантажено жодного файлу або неправильний тип файлу! - Зображення домашньої сторінки Нагору Завантажити файл Змінити файл @@ -340,7 +336,6 @@ дорівнює починається з Форма не була надіслана належним чином. - Форма не була надіслана належним чином. Необхідно завантажити файл. (* обов'язкове) Відправити знову diff --git a/locale/uk_UA/manager.xml b/locale/uk_UA/manager.xml index 130d7eaf1e1..752adb4de85 100644 --- a/locale/uk_UA/manager.xml +++ b/locale/uk_UA/manager.xml @@ -213,27 +213,23 @@ Відібрати результати за країною, регіоном та/або містом. Спонсорство Додатковий вміст - Все, що вводиться тут, з'явиться на вашій домашній сторінці. - Умови передачі авторських прав - Вимагати в авторів погодитись із умовами передачі авторських прав в процесі подання матеріалів. + Все, що вводиться тут, з'явиться на вашій домашній сторінці. + Умови передачі авторських прав + Вимагати в авторів погодитись із умовами передачі авторських прав в процесі подання матеріалів. Довідник для авторів Рекомендовані правила містять бібліографічні стандарти та стандарти форматування разом із прикладами оформлення цитувань, котрі використовуватимуться під час подання матеріалів. Конфлікт інтересів - Рецензентів проситимуть дотримуватися правил декларування конфлікту інтересів, які ви навели нижче. Під час видалення цього об'єкту виникла помилка. - Неправильний формат favicon. Прийнятними форматами є .ico, .png та .gif. + Іконка Групування типів файлів - Завантаження невдале або неправильний формат зображення для логотипу заголовку домашньої сторінки. Прийнятними форматами є .gif, .jpg або .png. Зображення на домашній сторінці - Завантажте зображення для відображення на домашній сторінці. + Завантажте зображення для відображення на домашній сторінці. Завантаження невдале або неправильний формат зображення домашньої сторінки. Прийнятними форматами є .gif, .jpg або .png. Завантаження невдале або неправильний формат зображення для заголовку домашньої сторінки. Прийнятними форматами є .gif, .jpg або .png. Описи - Теми - Нові теми можуть бути встановлені на вкладці "Модулі" у верхній частині цієї сторінки. - Налаштування бічних панелей + Теми + Нові теми можуть бути встановлені на вкладці "Модулі" у верхній частині цієї сторінки. Бічна панель - Не вибрано Журналізація та аудит Логотип Повідомлення про подання матеріалів автором @@ -243,7 +239,7 @@ Якщо ви надаєте негайний вільний доступ до всього опублікованого вмісту, ви можете навести опис ваших правил відкритого доступу. Завантаження невдале або неправильний формат зображення для логотипу заголовку сторінки. Прийнятними форматами є .gif, .jpg або .png. Нижній колонтитул сторінки - Вкажіть будь-які зображення, текст або HTML-код, які ви хочете відобразити в нижній частині вашого веб-сайту. + Вкажіть будь-які зображення, текст або HTML-код, які ви хочете відобразити в нижній частині вашого веб-сайту. Опишіть правила та процес рецензування для читачів та авторів. Це опис переважно містить кількість рецензентів, які зазвичай долучаються до рецензування, критерії, за якими рецензентів просять оцінити подання, очікуваний час, необхідний для рецензування, та принципи відбору рецензентів. Контактна особа Введіть контактні дані, як правило, це головний редактор, керуючий редактор чи хтось з адміністрації. Ці дані можуть відображатися на вашому сайті у відкритому доступі. @@ -252,12 +248,9 @@ Тижнів на рецензування Ніколи не нагадувати Усталені значення, які можна змінити для кожної рецензії під час редакційного процесу. - Надсилати нагадування, якщо рецензент не відповів на запит на рецензування протягом наступного часу (днів) після закінчення терміну відповіді: - Надсилати нагадування, якщо рецензент не подав рекомендацію протягом наступного часу (днів) після закінчення терміну розгляду: + Надсилати нагадування, якщо рецензент не відповів на запит на рецензування протягом наступного часу (днів) після закінчення терміну відповіді: + Надсилати нагадування, якщо рецензент не подав рекомендацію протягом наступного часу (днів) після закінчення терміну розгляду: Усталений термін рецензування - Додати посилання "Забезпечення сліпого рецензування" під час завантаження - Мапа сайту - {$path}]]> Опис правил та стосунків зі спонсорами Приклади: наукові товариства, університетські підрозділи, спілки тощо. Інформація про спонсорів оприлюднюється у відкритому доступі. Досвідчені веб-розробники можуть завантажувати файл CSS для додаткового оформлення веб-сайту. @@ -365,7 +358,6 @@ Спосіб оплати не обрано Спосіб оплати Валюта - Платежі, здійснені безпосередньо через цей веб-сайт, будуть деноміновані у вибраній валюті. Параметри ролі diff --git a/locale/uk_UA/reader.xml b/locale/uk_UA/reader.xml index 61799be2bc7..6d23faf3963 100644 --- a/locale/uk_UA/reader.xml +++ b/locale/uk_UA/reader.xml @@ -34,147 +34,4 @@ Тема Дивитися всі коментарі Повний текст: - Додати коментар - Конфігурація - Ви впевнені, що хочете видалити цей контекст та всі асоційовані з ним пошуки? - Створити контекст - Редагувати контекст - Метадані - Використовувати імена авторів як пошукові терміни за замовчуванням, щоб дозволити користувачам шукати інші роботи авторів певної роботи (наприклад, для контексту "Інші праці") - Використовувати імена авторів як пошукові терміни за замовчуванням і визначити контекст як пошук цитат на статтю. - Налаштуваннях інструментів для читання.]]> - Використовувати географічні дані як пошукові терміни за замовчуванням. - Налаштування - Керування - - Рекомендації - Рекомендації включені - addthis.com, скопіюйте та вставте нижче код кнопки.]]> - - Базові налаштування - Ім'я користувача AddThis.com - Стиль кнопки - Використовувати спадаюче меню - Розширені налаштування (необов'язкове) - документацію з налаштувань AddThis.com.]]> - Бренд - (список, розділений комами)]]> - Мова - Логотип - Колір фону - Колір логотипу - - Інструментарій для читання - Ви впевнені, що хочете видалити цей пошук? - Створити пошук - Редагувати пошук - Споріднені об'єкти - Анотація (представляє анотацію роботи). - Дивитися політику рецензування - Про автора (представляє коротку біографію, надану автором). - Як цитувати роботу (надає бібліографічний опис роботи). - Визначення термінів (дозволяє читачам подвійним натисканням на словах у тексті проводити пошук слів у словнику). - Відключити споріднені об'єкти - Написати автору (завантажує шаблон листа на email автора). - Повідомити колегу (завантажує шаблон листа з посиланням на об'єкт). - Знайти посилання - Версія для друку (завантажує призначену для друку версію об'єкту). - Супровідні файли (відображає перелік файлів, які автор надіслав разом з рукописом). - Індексні метадані (відображає набори метаданих об'єкту, введені автором та згенеровані системою). - Статус - Конфігурувати AddThis - Перевірка завершена. - OK - Адреса {$url} некоректна. - Перевірити адреси URL для використання в інструментарії для читання - Перевірити - Ви впевнені, що хочете видалити цю версію і всі асоційовані з нею контексти та пошуки? - Ви впевнені, що хочете скинути всі версії до їх стандартних параметрів за замовчуванням? Якщо так, вам буде необхідно вибрати активну версію на сторінці налаштувань. - Створити версію - Редагувати версію - Експорт - Імпорт версії - Метадані - Скинути версії до стандартних - Про автора - Формат цитування - Як цитувати роботу - Онлайновий ресурс - Веб-ресурс - Повідомити колегу - Абревіатура - AND - Якщо стаття індексується системою Google Академія, вона може супроводжуватись посиланням "Cited by X", яке перенаправляє користувача до списку робіт, які її цитують. Google Академія формуватиме список з робіт, які згадують назву статті та автора. Для того, щоб організувати доступ до онлайнових ресурсів, використання яких можливе лише через вашу наукову бібліотеку, ви можете активувати відповідне Бібліотечне посилання у налаштуваннях системи Google Академія. - Контекст - Якщо стаття має HTML-гранку (не PDF), подвійним натисканням на будь-якому слові в тексті можна відкрити форму "Визначення слова". Крім того, слова можуть вручну копіюватись і вставлятись до форми. Для отримання додаткової інформації про джерела пошуку використовуйте посилання праворуч їх назв. Ці джерела були вибрані через їх релевантність та відкритість (безкоштовність) їх змісту. - Опис - Сортування - Контексти - Було використано пошукові терміни, визначені автором статті. Читач може редагувати список цих термінів. Пошукові терміни - це два-три слова або короткі фрази, які дають найбільш релевантні результати під час пошуку з булевим оператором AND. Для отримання додаткової інформації про джерела пошуку використовуйте посилання праворуч їх назв. Ці джерела були вибрані через їх релевантність та відкритість (безкоштовність) їх змісту. - Пошукові терміни - Визначення слова - Назва - Написати автору - реєстрація]]> - Ваше повідомлення було надіслане. - Пошук посилань - Google Академія - Windows Live Academic - Пошук термінів - Співвиконавець - Охоплення - Дата - Опис - Дублінське ядро - Формат - Ідентифікатор - Мова - Видавець - Відношення - Права - Джерело - Предмет - Назва - Тип ресурсу - Метадані для цього документу - Анотація - Авторські права та дозволи на використання - Географічне та хронологічне покриття, основні характеристики дослідження - (РРРР-ММ-ДД) - Дисципліни - Формат файлу - Статус і тип - Набір метаданих PKP - Українська=uk - Установа-видавець, адреса - Назва журналу/конференції; том, №. (рік) - Спонсори - Ключові слова - Супр. файли - Назва документу - Тип - Уніфікований ідентифікатор ресурсів (URI) - Версія для друку - Інструментарій для читання - Споріднені об'єкти - Політика рецензування - Опис - Пошуки - Сортування - Пошук - Відправити дані - Пошук URL - Запропонувати джерело - Назва - URL - Завантажити - Супровідні файли - Індексні метадані - Опис - Ключ - Локалізація - Набори споріднених об'єктів - Назва - Версія - Індексні метадані diff --git a/locale/uk_UA/submission.xml b/locale/uk_UA/submission.xml index 7c5019f52e2..30bad295271 100644 --- a/locale/uk_UA/submission.xml +++ b/locale/uk_UA/submission.xml @@ -378,7 +378,6 @@ Будь ласка, вкажіть тему. Будь ласка, вкажіть предмет. Будь ласка, вкажіть ключове слово. - Будь ласка, вкажіть спонсорів. Будь ласка, вкажіть інформацію про охоплення. Будь ласка, вкажіть тип. Будь ласка, вкажіть джерело. @@ -610,8 +609,6 @@ Термін відповіді на запит Термін подання рецензії Видалити подання? - Підняти нагору {$itemTitle} - Опустити донизу {$itemTitle} Переглянути подання Завершено призначених рецензій Надіслано нових версій diff --git a/locale/zh_CN/admin.xml b/locale/zh_CN/admin.xml index 83aece3cf8c..fac8fb5d37a 100644 --- a/locale/zh_CN/admin.xml +++ b/locale/zh_CN/admin.xml @@ -46,15 +46,9 @@ 服务器信息 PHP版本 OS平台 - 关于网站描述 + 关于网站描述 主要联络的电子邮件 主要的联系人名 - 主要联系人的电子邮件地址是必需的. - 主要联络人的姓名. - 您必须输入至少4个字符的最小密码长度. - 标题是必须的. - 网站Logo - 无效的网站Logo图片格式,只有如下格式允许 .gif, .jpg, or .png. 介绍 最小的密码长度 字符 diff --git a/locale/zh_CN/common.xml b/locale/zh_CN/common.xml index bc0433ea007..4b77874783a 100644 --- a/locale/zh_CN/common.xml +++ b/locale/zh_CN/common.xml @@ -38,7 +38,6 @@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 已经指派 替换文本 - 请提供这个图片替代文字,以确保为纯文本浏览器或辅助设备的用户可访问. 申请行动 指派 @@ -134,7 +133,6 @@ 源文件名 其他 - 页面投稿Logo 插件 出版社 记录 @@ -165,7 +163,6 @@ 未开始的 未命名的 已上传的 - 已上传的文件 上传 该文件无法上传。请重试或联系管理员如果问题仍然存在. @@ -327,7 +324,6 @@ 退出 元素 未读 - {$ supportName}请求援助。]]> 系统 用户管理 插件 @@ -345,7 +341,6 @@ 这个表单的数据已经改变。继续吗? 无效的图像上传,允许的格式有.png,.gif,或者.jpg 进入 - 没有文件上传或无效的文件类型! 管理 按作者 diff --git a/locale/zh_CN/installer.xml b/locale/zh_CN/installer.xml index 6f678b28b57..2bd3e22500e 100644 --- a/locale/zh_CN/installer.xml +++ b/locale/zh_CN/installer.xml @@ -63,7 +63,6 @@ OAI库标识符 Public的文件的目录不存在或不可写. 发行说明 - 安全设置 {$file}.]]> OAI 设置 diff --git a/locale/zh_CN/manager.xml b/locale/zh_CN/manager.xml index 219aa3879af..c0df8afd0c6 100644 --- a/locale/zh_CN/manager.xml +++ b/locale/zh_CN/manager.xml @@ -140,10 +140,8 @@ 系统插件 阅读工具 角色 - 无效的首页头部图片格式或者上传失败,有效的格式有 .gif, .jpg, or .png. 无效的首页图片格式或者上传失败,有效的格式有 .gif, .jpg, or .png. 无效的首页头部标题图片格式或者上传失败,有效的格式有 .gif, .jpg, or .png. - 没有选择的 日志记录与审计 无效的页面头部Logo图片格式或者上传失败,有效的格式有 .gif, .jpg, or .png. 选择 @@ -177,7 +175,6 @@ 你是即将启用此电子邮件。你要确认此操作? 如果您重置所有模板,所有的电子邮件模板的修改都将丢失。你要确认此操作? 如果重置这个模板,所有的消息数据将被重置为其默认值,失去了所有的修改。你要确认此操作? - 边栏管理 元数据插件 使用下表来设定您希望用来查询术语的最大值。此表已预先填充了这些领域的计算平均值。 元数据插件采用附加的元数据标准。 diff --git a/locale/zh_CN/reader.xml b/locale/zh_CN/reader.xml index df4d949e6ea..5575e4a1b25 100644 --- a/locale/zh_CN/reader.xml +++ b/locale/zh_CN/reader.xml @@ -35,147 +35,4 @@ 标题 查看所有评论 全文: - 添加评论 - 配置 - 你确定要删除此语境下所有相关的搜索? - 创建语境 - 编辑语境 - 源数据 - 使用作者姓名作为默认的搜索词,可以查找到该作者的其他作品. (例如为"其他作品"语境) - 使用作者名称作为预设的搜寻项目,并将文章脉络显示成一个搜寻项目以引用本文. - RST Settings启用才能允许双击文字来开启这个文章脉络。]]> - 以地理索引资料当作预设的搜寻项目. - 选项 - 管理 - - 分享 - 共享启用 - addthis.com, 并且复制/粘帖分享按钮代码到下面.]]> - - 基础设置 - AddThis.com user name - 按钮样式 - 使用下拉菜单 - 高级设置 (可选) - AddThis.com 定制文档.]]> - Brand - (逗号分隔的列表)]]> - 语言 - Logo - Logo 背景 - Logo 颜色 - - 阅读工具 - 您确认删除这个搜索? - 创建搜索 - 编辑搜索 - 相关项目 - 摘要 (介绍项目的摘要). - 关于作者 (显示由作者提供的简介). - 如何印证项目 (提供书目详细项目). - 查找名词 (使读者双击单词中的任何一个项目并把单词发送到词典). - 禁用相关项目 - 电子邮件通知作者(指向一个带有作者邮箱的电子邮件模板). - 通知同事 (指向一个的带有链接到项目的电子邮件模板). - 查找参考文献 - 打印版本 (提供一个项目的友好的打印版本). - 附件 (显示作者包含投稿的文件列表). - 索引的源数据 (显示由作者和系统提供的项目索引元数据). - 状态 - 配置 AddThis - 验证完成. - OK - {$url} 是无效的. - 为阅读工具验证URLs - 验证 - 您确定您希望删除这个版本以及所有相关的文章脉络和搜寻结果? - 您确定您希望进行不可逆的复原动作,回复所有版本到预设值?一旦如此,您将会需要在配置页面选择一个现有的版本. - 创建版本 - 编辑版本 - 导出 - 导入版本 - 源数据 - 恢复到默认版本 - 关于作者 - 印证格式 - 如何引证项目 - 在线 - 通知同事 - 缩写 - AND - 如果这份文章被Google学术搜寻(Google Scholar)索引,它会随附一个「由X引用」的链接,引导至一份引用本文的作品清单。同时Google学术搜寻会列出所有项目的引用标题与作者。要阅读只能透过您的搜寻数据库才能取得的线上资源,您或许可以到Google学术搜寻的「学术偏好配置」中,启用启用您服务单位的图书馆链接. - 语境 - 如果这个项目是一个HTML文件(而非PDF档),请双击文章中的任一个字汇,使其显示在「字词定义」对话框中。除此之外,可以在此对话框中键入或者贴上字汇。要学习更多关于搜寻资源的信息,请点击「介绍」。这些资源是基于其关连性与开放(自由)阅读所有或部分内容而被选取的. - 描述 - 顺序 - 语境 - 作者已经选择了搜寻词汇。读者可以变更或者删除它们,同时以两到三个准确的词汇或片语进行最佳的布尔逻辑(AND)搜寻。要学习更多关于搜寻资源的信息,请点击「介绍」。这些资源是基于其关连性与开放(自由)阅读所有或部分内容而被选取的. - 搜索项目 - Word to define - 标题 - 发送邮件给作者 - 注册]]> - 您的信息已发送. - 查找参考文献 - Google Scholar - Windows Live 学术 - 查找术语 - 合作者 - 范围 - 日期 - 描述 - Dublin Core - 格式 - 识别码 - 语言 - 出版商 - 关系 - 权力 - - 主题 - 标题 - 类型 - 这个文档的源数据 - 摘要 - 版权及权限 - 地理位置、年代时期、调查样本(性别、年纪等等) - (YYYY-MM-DD) - 学科 - 文件格式 - 现状与流派 - PKP源数据项目 - English=en - 组织机构,地点 - 期刊/会议标题 ; 卷., 期. (年) - 主管 - 关键词 - 补充文件 - 文档的标题 - 类型 - 环球资源指标 - 打印版本 - 阅读工具 - 相关项目 - 审查政策 - 描述 - 搜索 - 顺序 - 搜索 - 提交数据 - 搜索URL - 推荐一个源 - 标题 - URL - 下载 - 补充文件 - 索引源数据 - 描述 - - 语言环境 - 相关项目设置 - 标题 - 版本 - 索引源数据 - 互联网 - 审稿政策 diff --git a/pages/about/AboutContextHandler.inc.php b/pages/about/AboutContextHandler.inc.php index c6e95846598..c72f5280548 100644 --- a/pages/about/AboutContextHandler.inc.php +++ b/pages/about/AboutContextHandler.inc.php @@ -29,7 +29,7 @@ function __construct() { */ function authorize($request, &$args, $roleAssignments) { $context = $request->getContext(); - if (!$context || !$context->getSetting('restrictSiteAccess')) { + if (!$context || !$context->getData('restrictSiteAccess')) { $templateMgr = TemplateManager::getManager($request); $templateMgr->setCacheability(CACHEABILITY_PUBLIC); } @@ -71,13 +71,13 @@ function submissions($args, $request) { $this->setupTemplate($request); $context = $request->getContext(); - $checklist = $context->getLocalizedSetting('submissionChecklist'); + $checklist = $context->getLocalizedData('submissionChecklist'); if (!empty($checklist)) { ksort($checklist); reset($checklist); } - $templateMgr->assign( 'submissionChecklist', $context->getLocalizedSetting('submissionChecklist') ); + $templateMgr->assign( 'submissionChecklist', $context->getLocalizedData('submissionChecklist') ); $templateMgr->display('frontend/pages/submissions.tpl'); } @@ -92,15 +92,15 @@ function contact($args, $request) { $this->setupTemplate($request); $context = $request->getContext(); $templateMgr->assign(array( - 'mailingAddress' => $context->getSetting('mailingAddress'), - 'contactPhone' => $context->getSetting('contactPhone'), - 'contactEmail' => $context->getSetting('contactEmail'), - 'contactName' => $context->getSetting('contactName'), - 'supportName' => $context->getSetting('supportName'), - 'supportPhone' => $context->getSetting('supportPhone'), - 'supportEmail' => $context->getSetting('supportEmail'), - 'contactTitle' => $context->getLocalizedSetting('contactTitle'), - 'contactAffiliation' => $context->getLocalizedSetting('contactAffiliation'), + 'mailingAddress' => $context->getData('mailingAddress'), + 'contactPhone' => $context->getData('contactPhone'), + 'contactEmail' => $context->getData('contactEmail'), + 'contactName' => $context->getData('contactName'), + 'supportName' => $context->getData('supportName'), + 'supportPhone' => $context->getData('supportPhone'), + 'supportEmail' => $context->getData('supportEmail'), + 'contactTitle' => $context->getLocalizedData('contactTitle'), + 'contactAffiliation' => $context->getLocalizedData('contactAffiliation'), )); $templateMgr->display('frontend/pages/contact.tpl'); } diff --git a/pages/admin/AdminContextHandler.inc.php b/pages/admin/AdminContextHandler.inc.php deleted file mode 100644 index 20d0af27219..00000000000 --- a/pages/admin/AdminContextHandler.inc.php +++ /dev/null @@ -1,63 +0,0 @@ -addRoleAssignment( - array(ROLE_ID_SITE_ADMIN), - array('contexts') - ); - } - - /** - * Display a list of the contexts hosted on the site. - * @param $args array - * @param $request PKPRequest - */ - function contexts($args, $request) { - $this->setupTemplate($request); - $templateMgr = TemplateManager::getManager($request); - AppLocale::requireComponents(LOCALE_COMPONENT_PKP_MANAGER); - if ($request->getUserVar('openWizard')) { - // Get the open wizard link action. - import('lib.pkp.classes.linkAction.request.WizardModal'); - $dispatcher = $request->getDispatcher(); - $templateMgr->assign( - 'openWizardLinkAction', - new LinkAction( - 'openWizard', - new WizardModal( - $dispatcher->url($request, ROUTE_COMPONENT, null, - 'wizard.settings.ContextSettingsWizardHandler', 'startWizard', null), - __('manager.settings.wizard') - ), - __('manager.settings.wizard'), - null - ) - ); - } - - $templateMgr->display('admin/contexts.tpl'); - } -} - - diff --git a/pages/admin/AdminHandler.inc.php b/pages/admin/AdminHandler.inc.php index f8ceb4a55e9..8fcb4512fae 100644 --- a/pages/admin/AdminHandler.inc.php +++ b/pages/admin/AdminHandler.inc.php @@ -24,7 +24,7 @@ function __construct() { $this->addRoleAssignment( array(ROLE_ID_SITE_ADMIN), - array('index', 'settings') + array('index', 'contexts', 'settings', 'wizard') ); } @@ -66,6 +66,17 @@ function index($args, $request) { $templateMgr->display('admin/index.tpl'); } + /** + * Display a list of the contexts hosted on the site. + * @param $args array + * @param $request PKPRequest + */ + function contexts($args, $request) { + $this->setupTemplate($request); + $templateMgr = TemplateManager::getManager($request); + $templateMgr->display('admin/contexts.tpl'); + } + /** * Display the administration settings page. * @param $args array @@ -74,9 +85,104 @@ function index($args, $request) { function settings($args, $request) { $this->setupTemplate($request); $templateMgr = TemplateManager::getManager($request); + $site = $request->getSite(); + $router = $request->getRouter(); + + $apiUrl = $router->getApiUrl($request, '*', 'v1', 'site'); + $themeApiUrl = $router->getApiUrl($request, '*', 'v1', 'site', 'theme'); + $temporaryFileApiUrl = $router->getApiUrl($request, '*', 'v1', 'temporaryFiles'); + $siteUrl = $request->getBaseUrl(); + + import('classes.file.PublicFileManager'); + $publicFileManager = new PublicFileManager(); + $baseUrl = $request->getBaseUrl() . '/' . $publicFileManager->getSiteFilesPath(); + + $supportedLocales = $site->getSupportedLocales(); + $localeNames = AppLocale::getAllLocales(); + $locales = array_map(function($localeKey) use ($localeNames) { + return ['key' => $localeKey, 'label' => $localeNames[$localeKey]]; + }, $supportedLocales); + + import('components.forms.site.SiteAppearanceForm'); + $siteAppearanceForm = new SiteAppearanceForm($apiUrl, $locales, $site, $baseUrl, $temporaryFileApiUrl); + import('components.forms.site.SiteConfigForm'); + $siteConfigForm = new SiteConfigForm($apiUrl, $locales, $site); + import('components.forms.site.SiteInformationForm'); + $siteInformationForm = new SiteInformationForm($apiUrl, $locales, $site); + import('lib.pkp.components.forms.context.PKPThemeForm'); + $themeForm = new PKPThemeForm($themeApiUrl, $locales, $siteUrl); + + $settingsData = [ + 'forms' => [ + FORM_SITE_APPEARANCE => $siteAppearanceForm->getConfig(), + FORM_SITE_CONFIG => $siteConfigForm->getConfig(), + FORM_SITE_INFO => $siteInformationForm->getConfig(), + FORM_THEME => $themeForm->getConfig(), + ], + ]; + + $templateMgr->assign('settingsData', $settingsData); + $templateMgr->display('admin/settings.tpl'); } + /** + * Display a settings wizard for a journal + * + * @param $args array + * @param $request PKPRequest + */ + public function wizard($args, $request) { + $this->setupTemplate($request); + $router = $request->getRouter(); + + if (!isset($args[0]) || !ctype_digit($args[0])) { + $request->getDispatcher()->handle404(); + } + + import('classes.core.ServicesContainer'); + $contextService = ServicesContainer::instance()->get('context'); + $context = $contextService->getContext((int) $args[0]); + + if (empty($context)) { + $request->getDispatcher()->handle404(); + } + + $apiUrl = $router->getApiUrl($request, $context->getPath(), 'v1', 'contexts', $context->getId()); + $themeApiUrl = $router->getApiUrl($request, $context->getPath(), 'v1', 'contexts', $context->getId() . '/theme'); + $contextUrl = $router->url($request, $context->getPath()); + $sitemapUrl = $router->url($request, $context->getPath(), 'sitemap'); + + $supportedFormLocales = $context->getSupportedFormLocales(); + $localeNames = AppLocale::getAllLocales(); + $locales = array_map(function($localeKey) use ($localeNames) { + return ['key' => $localeKey, 'label' => $localeNames[$localeKey]]; + }, $supportedFormLocales); + + import('components.forms.context.ContextForm'); + $contextForm = new ContextForm($apiUrl, __('admin.contexts.form.edit.success'), $locales, $request->getBaseUrl(), $context); + import('lib.pkp.components.forms.context.PKPThemeForm'); + $themeForm = new PKPThemeForm($themeApiUrl, $locales, $contextUrl, $context); + import('lib.pkp.components.forms.context.PKPSearchIndexingForm'); + $indexingForm = new PKPSearchIndexingForm($apiUrl, $locales, $context, $sitemapUrl); + + $settingsData = [ + 'forms' => [ + FORM_CONTEXT => $contextForm->getConfig(), + FORM_SEARCH_INDEXING => $indexingForm->getConfig(), + FORM_THEME => $themeForm->getConfig(), + ], + ]; + + $templateMgr = TemplateManager::getManager($request); + $templateMgr->assign([ + 'settingsData' => $settingsData, + 'editContext' => $context, + ]); + + $templateMgr->display('admin/contextSettings.tpl'); + } + /** * Initialize the handler. * @param $request PKPRequest @@ -86,5 +192,3 @@ function initialize($request) { return parent::initialize($request); } } - - diff --git a/pages/admin/index.php b/pages/admin/index.php index e579c38c1e4..8802324a86e 100644 --- a/pages/admin/index.php +++ b/pages/admin/index.php @@ -18,13 +18,6 @@ switch ($op) { // - // Context Management - // - case 'contexts': - define('HANDLER_CLASS', 'AdminContextHandler'); - import('lib.pkp.pages.admin.AdminContextHandler'); - break; - // // Administrative functions // case 'systemInfo': @@ -38,14 +31,14 @@ import('lib.pkp.pages.admin.AdminFunctionsHandler'); break; // - // Main administration page + // Main administration pages // case 'index': + case 'contexts': case 'settings': case 'saveSettings': + case 'wizard': define('HANDLER_CLASS', 'AdminHandler'); import('lib.pkp.pages.admin.AdminHandler'); break; } - - diff --git a/pages/announcement/AnnouncementHandler.inc.php b/pages/announcement/AnnouncementHandler.inc.php index bcc632b2acd..f1c83a618aa 100644 --- a/pages/announcement/AnnouncementHandler.inc.php +++ b/pages/announcement/AnnouncementHandler.inc.php @@ -44,7 +44,7 @@ function index($args, $request) { $this->setupTemplate($request); $context = $request->getContext(); - $announcementsIntro = $context->getLocalizedSetting('announcementsIntroduction'); + $announcementsIntro = $context->getLocalizedData('announcementsIntroduction'); $templateMgr = TemplateManager::getManager($request); $templateMgr->assign('announcementsIntroduction', $announcementsIntro); diff --git a/pages/dashboard/DashboardHandler.inc.php b/pages/dashboard/DashboardHandler.inc.php index f97b6461b9c..9a973bf652e 100644 --- a/pages/dashboard/DashboardHandler.inc.php +++ b/pages/dashboard/DashboardHandler.inc.php @@ -49,23 +49,23 @@ function index($args, $request) { $currentUser = $request->getUser(); - import('controllers.list.submissions.SubmissionsListHandler'); + import('components.listPanels.submissions.SubmissionsListPanel'); // My Queue - $myQueueListHandler = new SubmissionsListHandler(array( + $myQueueListPanel = new SubmissionsListPanel(array( 'title' => 'common.queue.long.myAssigned', 'getParams' => array( 'status' => STATUS_QUEUED, 'assignedTo' => $request->getUser()->getId(), ), )); - $templateMgr->assign('myQueueListData', json_encode($myQueueListHandler->getConfig())); + $templateMgr->assign('myQueueListData', $myQueueListPanel->getConfig()); $userRoles = $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES); if (!empty(array_intersect(array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER), $userRoles))) { // Unassigned - $unassignedListHandler = new SubmissionsListHandler(array( + $unassignedListPanel = new SubmissionsListPanel(array( 'title' => 'common.queue.long.submissionsUnassigned', 'getParams' => array( 'status' => STATUS_QUEUED, @@ -73,17 +73,17 @@ function index($args, $request) { ), 'lazyLoad' => true, )); - $templateMgr->assign('unassignedListData', json_encode($unassignedListHandler->getConfig())); + $templateMgr->assign('unassignedListData', $unassignedListPanel->getConfig()); // Active - $activeListHandler = new SubmissionsListHandler(array( + $activeListPanel = new SubmissionsListPanel(array( 'title' => 'common.queue.long.active', 'getParams' => array( 'status' => STATUS_QUEUED, ), 'lazyLoad' => true, )); - $templateMgr->assign('activeListData', json_encode($activeListHandler->getConfig())); + $templateMgr->assign('activeListData', $activeListPanel->getConfig()); } // Archived @@ -97,8 +97,8 @@ function index($args, $request) { if (!$currentUser->hasRole(array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER), $request->getContext()->getId())) { $params['getParams']['assignedTo'] = $currentUser->getId(); } - $archivedListHandler = new SubmissionsListHandler($params); - $templateMgr->assign('archivedListData', json_encode($archivedListHandler->getConfig())); + $archivedListPanel = new SubmissionsListPanel($params); + $templateMgr->assign('archivedListData', $archivedListPanel->getConfig()); return $templateMgr->display('dashboard/index.tpl'); } @@ -125,5 +125,3 @@ function setupTemplate($request = null) { parent::setupTemplate($request); } } - - diff --git a/pages/help/HelpHandler.inc.php b/pages/help/HelpHandler.inc.php index c53f3305b79..e399ecb0229 100644 --- a/pages/help/HelpHandler.inc.php +++ b/pages/help/HelpHandler.inc.php @@ -31,29 +31,22 @@ function __construct() { */ function index($args, $request) { $path = 'docs/manual/'; - $filename = join('/', $request->getRequestedArgs()); - - // If a hash (anchor) was specified, discard it -- we don't need it here. - if ($hashIndex = strpos($filename, '#')) { - $hash = substr($filename, $hashIndex+1); - $filename = substr($filename, 0, $hashIndex); - } else { - $hash = null; - } + $urlPart = join('/', $request->getRequestedArgs()); + $filename = $urlPart . '.md'; $language = AppLocale::getIso1FromLocale(AppLocale::getLocale()); if (!file_exists($path . $language)) $language = 'en'; // Default if (!$filename || !preg_match('#^([[a-zA-Z0-9_-]+/)+[a-zA-Z0-9_-]+\.\w+$#', $filename) || !file_exists($path . $filename)) { - $request->redirect(null, null, null, array($language, 'SUMMARY.md')); + $request->redirect(null, null, null, array($language, 'SUMMARY')); } // Use the summary document to find next/previous links. // (Yes, we're grepping markdown outside the parser, but this is much faster.) $previousLink = $nextLink = null; - if (preg_match_all('/\(([^)]+\.md)\)/sm', file_get_contents($path . $language . '/SUMMARY.md'), $matches)) { + if (preg_match_all('/\(([^)]+)\)/sm', file_get_contents($path . $language . '/SUMMARY.md'), $matches)) { $matches = $matches[1]; - if (($i = array_search(substr($filename, strpos($filename, '/')+1), $matches)) !== false) { + if (($i = array_search(substr($urlPart, strpos($urlPart, '/')+1), $matches)) !== false) { if ($i>0) $previousLink = $matches[$i-1]; if ($iaddPolicy(new ContextAccessPolicy($request, $roleAssignments)); return parent::authorize($request, $args, $roleAssignments); } -} + /** + * Route requests to the appropriate operation. + * @param $args array + * @param $request PKPRequest + */ + function settings($args, $request) { + $path = array_shift($args); + switch($path) { + case 'index': + case '': + case 'context': + $this->context($args, $request); + break; + case 'website': + $this->website($args, $request); + break; + case 'workflow': + $this->workflow($args, $request); + break; + case 'distribution': + $this->distribution($args, $request); + break; + case 'access': + $this->access($args, $request); + break; + case 'announcements': + $this->announcements($args, $request); + break; + default: + $request->getDispatcher()->handle404(); + assert(false); + } + } + + /** + * Display settings for a journal/press + * @param $args array + * @param $request PKPRequest + */ + function context($args, $request) { + $templateMgr = TemplateManager::getManager($request); + $this->setupTemplate($request); + $context = $request->getContext(); + $router = $request->getRouter(); + + $apiUrl = $router->getApiUrl($request, $context->getPath(), 'v1', 'contexts', $context->getId()); + + $supportedFormLocales = $context->getSupportedFormLocales(); + $localeNames = AppLocale::getAllLocales(); + $locales = array_map(function($localeKey) use ($localeNames) { + return ['key' => $localeKey, 'label' => $localeNames[$localeKey]]; + }, $supportedFormLocales); + + import('lib.pkp.components.forms.context.PKPContactForm'); + $contactForm = new PKPContactForm($apiUrl, $locales, $context); + import('components.forms.context.MastheadForm'); + $mastheadForm = new MastheadForm($apiUrl, $locales, $context); + + $settingsData = [ + 'forms' => [ + FORM_CONTACT => $contactForm->getConfig(), + FORM_MASTHEAD => $mastheadForm->getConfig(), + ], + ]; + + $templateMgr->assign('settingsData', $settingsData); + + // Display a warning message if there is a new version of OJS available + if (Config::getVar('general', 'show_upgrade_warning')) { + import('lib.pkp.classes.site.VersionCheck'); + if ($latestVersion = VersionCheck::checkIfNewVersionExists()) { + $templateMgr->assign('newVersionAvailable', true); + $templateMgr->assign('latestVersion', $latestVersion); + $currentVersion = VersionCheck::getCurrentDBVersion(); + $templateMgr->assign('currentVersion', $currentVersion->getVersionString()); + + // Get contact information for site administrator + $roleDao = DAORegistry::getDAO('RoleDAO'); + $siteAdmins = $roleDao->getUsersByRoleId(ROLE_ID_SITE_ADMIN); + $templateMgr->assign('siteAdmin', $siteAdmins->next()); + } + } + + $templateMgr->display('management/context.tpl'); + } + + /** + * Display website settings + * @param $args array + * @param $request PKPRequest + */ + function website($args, $request) { + $templateMgr = TemplateManager::getManager($request); + $this->setupTemplate($request); + $context = $request->getContext(); + $router = $request->getRouter(); + + $contextApiUrl = $router->getApiUrl($request, $context->getPath(), 'v1', 'contexts', $context->getId()); + $themeApiUrl = $router->getApiUrl($request, $context->getPath(), 'v1', 'contexts', $context->getId() . '/theme'); + $temporaryFileApiUrl = $router->getApiUrl($request, $context->getPath(), 'v1', 'temporaryFiles'); + $contextUrl = $router->url($request, $context->getPath()); + + import('classes.file.PublicFileManager'); + $publicFileManager = new PublicFileManager(); + $baseUrl = $request->getBaseUrl() . '/' . $publicFileManager->getContextFilesPath($context->getAssocType(), $context->getId()); + + $supportedFormLocales = $context->getSupportedFormLocales(); + $localeNames = AppLocale::getAllLocales(); + $locales = array_map(function($localeKey) use ($localeNames) { + return ['key' => $localeKey, 'label' => $localeNames[$localeKey]]; + }, $supportedFormLocales); + + import('lib.pkp.components.forms.context.PKPAnnouncementSettingsForm'); + $announcementSettingsForm = new PKPAnnouncementSettingsForm($contextApiUrl, $locales, $context); + import('lib.pkp.components.forms.context.PKPAppearanceAdvancedForm'); + $appearanceAdvancedForm = new PKPAppearanceAdvancedForm($contextApiUrl, $locales, $context, $baseUrl, $temporaryFileApiUrl); + import('components.forms.context.AppearanceSetupForm'); + $appearanceSetupForm = new AppearanceSetupForm($contextApiUrl, $locales, $context, $baseUrl, $temporaryFileApiUrl); + import('lib.pkp.components.forms.context.PKPInformationForm'); + $informationForm = new PKPInformationForm($contextApiUrl, $locales, $context); + import('lib.pkp.components.forms.context.PKPListsForm'); + $listsForm = new PKPListsForm($contextApiUrl, $locales, $context); + import('lib.pkp.components.forms.context.PKPPrivacyForm'); + $privacyForm = new PKPPrivacyForm($contextApiUrl, $locales, $context); + import('lib.pkp.components.forms.context.PKPThemeForm'); + $themeForm = new PKPThemeForm($themeApiUrl, $locales, $contextUrl, $context); + + $settingsData = [ + 'forms' => [ + FORM_ANNOUNCEMENT_SETTINGS => $announcementSettingsForm->getConfig(), + FORM_APPEARANCE_ADVANCED => $appearanceAdvancedForm->getConfig(), + FORM_APPEARANCE_SETUP => $appearanceSetupForm->getConfig(), + FORM_INFORMATION => $informationForm->getConfig(), + FORM_LISTS => $listsForm->getConfig(), + FORM_PRIVACY => $privacyForm->getConfig(), + FORM_THEME => $themeForm->getConfig(), + ], + ]; + + $templateMgr->assign('settingsData', $settingsData); + + $templateMgr->display('management/website.tpl'); + } + + /** + * Display workflow settings + * @param $args array + * @param $request PKPRequest + */ + function workflow($args, $request) { + $templateMgr = TemplateManager::getManager($request); + $this->setupTemplate($request); + $context = $request->getContext(); + $router = $request->getRouter(); + $apiUrl = $router->getApiUrl($request, $context->getPath(), 'v1', 'contexts', $context->getId()); + + AppLocale::requireComponents( + LOCALE_COMPONENT_PKP_SUBMISSION, + LOCALE_COMPONENT_APP_SUBMISSION, + LOCALE_COMPONENT_PKP_EDITOR, + LOCALE_COMPONENT_APP_EDITOR, + LOCALE_COMPONENT_PKP_MANAGER, + LOCALE_COMPONENT_APP_MANAGER + ); + + $supportedFormLocales = $context->getSupportedFormLocales(); + $localeNames = AppLocale::getAllLocales(); + $locales = array_map(function($localeKey) use ($localeNames) { + return ['key' => $localeKey, 'label' => $localeNames[$localeKey]]; + }, $supportedFormLocales); + + import('lib.pkp.components.forms.context.PKPAuthorGuidelinesForm'); + $authorGuidelinesForm = new PKPAuthorGuidelinesForm($apiUrl, $locales, $context); + import('lib.pkp.components.forms.context.PKPMetadataSettingsForm'); + $metadataSettingsForm = new PKPMetadataSettingsForm($apiUrl, $context); + import('lib.pkp.components.forms.context.PKPEmailSetupForm'); + $emailSetupForm = new PKPEmailSetupForm($apiUrl, $locales, $context); + import('components.forms.context.ReviewGuidanceForm'); + $reviewGuidanceForm = new ReviewGuidanceForm($apiUrl, $locales, $context); + import('lib.pkp.components.forms.context.PKPReviewSetupForm'); + $reviewSetupForm = new PKPReviewSetupForm($apiUrl, $locales, $context); + + $settingsData = [ + 'forms' => [ + FORM_AUTHOR_GUIDELINES => $authorGuidelinesForm->getConfig(), + FORM_METADATA_SETTINGS => $metadataSettingsForm->getConfig(), + FORM_EMAIL_SETUP => $emailSetupForm->getConfig(), + FORM_REVIEW_GUIDANCE => $reviewGuidanceForm->getConfig(), + FORM_REVIEW_SETUP => $reviewSetupForm->getConfig(), + ], + ]; + $templateMgr->assign('settingsData', $settingsData); + + $templateMgr->display('management/workflow.tpl'); + } + + /** + * Display distribution settings + * @param $args array + * @param $request PKPRequest + */ + function distribution($args, $request) { + AppLocale::requireComponents(LOCALE_COMPONENT_PKP_SUBMISSION, LOCALE_COMPONENT_APP_SUBMISSION); + $templateMgr = TemplateManager::getManager($request); + $this->setupTemplate($request); + $context = $request->getContext(); + $router = $request->getRouter(); + $dispatcher = $request->getDispatcher(); + + $apiUrl = $router->getApiUrl($request, $context->getPath(), 'v1', 'contexts', $context->getId()); + $lockssUrl = $router->url($request, $context->getPath(), 'gateway', 'lockss'); + $clockssUrl = $router->url($request, $context->getPath(), 'gateway', 'clockss'); + $sitemapUrl = $router->url($request, $context->getPath(), 'sitemap'); + $paymentsUrl = $router->getApiUrl($request, $context->getPath(), 'v1', '_payments'); + + $supportedFormLocales = $context->getSupportedFormLocales(); + $localeNames = AppLocale::getAllLocales(); + $locales = array_map(function($localeKey) use ($localeNames) { + return ['key' => $localeKey, 'label' => $localeNames[$localeKey]]; + }, $supportedFormLocales); + + import('components.forms.context.ArchivingLockssForm'); + $archivingLockssForm = new ArchivingLockssForm($apiUrl, $locales, $context, $lockssUrl, $clockssUrl); + import('lib.pkp.components.forms.context.PKPLicenseForm'); + $licenseForm = new PKPLicenseForm($apiUrl, $locales, $context); + import('lib.pkp.components.forms.context.PKPSearchIndexingForm'); + $searchIndexingForm = new PKPSearchIndexingForm($apiUrl, $locales, $context, $sitemapUrl); + import('components.forms.context.AccessForm'); + $accessForm = new AccessForm($apiUrl, $locales, $context); + import('components.forms.context.PaymentSettingsForm'); + $paymentSettingsForm = new PaymentSettingsForm($apiUrl, $locales, $context); + + // Create a dummy "form" for the PKP Preservation Network settings. This + // form loads a single field which enables/disables the plugin, and does + // not need to be submitted. It's a dirty hack, but we can change this once + // an API is in place for plugins and plugin settings. + $versionDao = DAORegistry::getDAO('VersionDAO'); + $isPlnInstalled = $versionDao->getCurrentVersion('plugins.generic', 'pln', true); + $archivePnForm = new FormComponent('archivePn', 'PUT', 'dummy', 'dummy'); + $archivePnForm->addPage([ + 'id' => 'default', + 'submitButton' => null, + ]) + ->addGroup([ + 'id' => 'default', + 'pageId' => 'default', + ]); + + if (!$isPlnInstalled) { + $archivePnForm->addField(new FieldHTML('pn', [ + 'label' => __('manager.setup.plnPluginArchiving'), + 'value' => __('manager.setup.plnPluginNotInstalled'), + 'groupId' => 'default', + ])); + } else { + $plnPlugin = PluginRegistry::getPlugin('generic', 'plnplugin'); + $pnEnablePluginUrl = $dispatcher->url($request, ROUTE_COMPONENT, null, 'grid.settings.plugins.SettingsPluginGridHandler', 'enable', null, array('plugin' => 'plnplugin', 'category' => 'generic')); + $pnDisablePluginUrl = $dispatcher->url($request, ROUTE_COMPONENT, null, 'grid.settings.plugins.SettingsPluginGridHandler', 'disable', null, array('plugin' => 'plnplugin', 'category' => 'generic')); + $pnSettingsUrl = $dispatcher->url($request, ROUTE_COMPONENT, null, 'grid.settings.plugins.SettingsPluginGridHandler', 'manage', null, array('verb' => 'settings', 'plugin' => 'plnplugin', 'category' => 'generic')); + + $archivePnForm->addField(new FieldArchivingPn('pn', [ + 'label' => __('manager.setup.plnPluginArchiving'), + 'description' => __('manager.setup.plnDescription'), + 'terms' => __('manager.setup.plnSettingsDescription'), + 'options' => [ + [ + 'value' => true, + 'label' => __('manager.setup.plnPluginEnable'), + ], + ], + 'value' => (bool) $plnPlugin, + 'enablePluginUrl' => $pnEnablePluginUrl, + 'disablePluginUrl' => $pnDisablePluginUrl, + 'settingsUrl' => $pnSettingsUrl, + 'csrfToken' => $request->getSession()->getCSRFToken(), + 'groupId' => 'default', + 'i18n' => [ + 'enablePluginError' => __('api.submissions.unknownError'), + 'enablePluginSuccess' => __('common.pluginEnabled', ['pluginName' => __('manager.setup.plnPluginArchiving')]), + 'disablePluginSuccess' => __('common.pluginDisabled', ['pluginName' => __('manager.setup.plnPluginArchiving')]), + ], + ])); + } + + $settingsData = [ + 'forms' => [ + FORM_ARCHIVING_LOCKSS => $archivingLockssForm->getConfig(), + $archivePnForm->id => $archivePnForm->getConfig(), + FORM_LICENSE => $licenseForm->getConfig(), + FORM_SEARCH_INDEXING => $searchIndexingForm->getConfig(), + FORM_ACCESS => $accessForm->getConfig(), + FORM_PAYMENT_SETTINGS => $paymentSettingsForm->getConfig(), + ], + ]; + $templateMgr->assign('settingsData', $settingsData); + } + + /** + * Display list of announcements and announcement types + * @param $args array + * @param $request PKPRequest + */ + function announcements($args, $request) { + $templateMgr = TemplateManager::getManager($request); + $this->setupTemplate($request); + + $templateMgr->display('management/announcements.tpl'); + } + + /** + * Display Access and Security page. + * @param $args array + * @param $request PKPRequest + */ + function access($args, $request) { + $templateMgr = TemplateManager::getManager($request); + $this->setupTemplate($request); + $context = $request->getContext(); + $router = $request->getRouter(); + + $apiUrl = $router->getApiUrl($request, $context->getPath(), 'v1', 'contexts', $context->getId()); + + import('components.forms.context.UserAccessForm'); + $userAccessForm = new UserAccessForm($apiUrl, $context); + + $settingsData = [ + 'forms' => [ + FORM_USER_ACCESS => $userAccessForm->getConfig(), + ], + ]; + $templateMgr->assign('settingsData', $settingsData); + + $templateMgr->display('management/access.tpl'); + } +} diff --git a/pages/management/PKPToolsHandler.inc.php b/pages/management/PKPToolsHandler.inc.php index 353b2480104..96dc51548c1 100644 --- a/pages/management/PKPToolsHandler.inc.php +++ b/pages/management/PKPToolsHandler.inc.php @@ -26,7 +26,7 @@ function __construct() { parent::__construct(); $this->addRoleAssignment( ROLE_ID_MANAGER, - array('tools', 'statistics', 'importexport') + array('tools', 'statistics', 'importexport', 'permissions') ); } @@ -65,6 +65,12 @@ function tools($args, $request) { break; case 'saveStatisticsSettings': return $this->saveStatisticsSettings($args, $request); + case 'permissions': + $this->permissions($args, $request); + break; + case 'resetPermissions': + $this->resetPermissions($args, $request); + break; default: assert(false); } @@ -119,7 +125,7 @@ function statistics($args, $request) { $reportPlugins = PluginRegistry::loadCategory('reports'); $templateMgr->assign('reportPlugins', $reportPlugins); - $templateMgr->assign('defaultMetricType', $context->getSetting('defaultMetricType')); + $templateMgr->assign('defaultMetricType', $context->getData('defaultMetricType')); $availableMetricTypes = $context->getMetricTypes(true); $templateMgr->assign('availableMetricTypes', $availableMetricTypes); if (count($availableMetricTypes) > 1) { @@ -397,6 +403,45 @@ protected function hasAppStatsSettings() { return false; } + /** + * Display the permissipns area. + * @param $args array + * @param $request PKPRequest + */ + function permissions($args, $request) { + $this->setupTemplate($request); + + $templateMgr = TemplateManager::getManager($request); + + return $templateMgr->fetchJson('management/tools/permissions.tpl'); + } + + /** + * Reset article/monograph permissions + * @param $args array + * @param $request PKPRequest + */ + function resetPermissions($args, $request) { + if (!$request->checkCSRF()) return new JSONMessage(false); + + $context = $request->getContext(); + if (!$context) { + return; + } + + $submissionDao = Application::getSubmissionDAO(); + $submissionDao->deletePermissions($context->getId()); + + $user = $request->getUser(); + NotificationManager::createTrivialNotification($user->getId(), NOTIFICATION_TYPE_SUCCESS, array('contents' => __('manager.setup.resetPermissions.success'))); + + // This is an ugly hack to force the PageHandler to return JSON, so this + // method can communicate properly with the AjaxFormHandler. Returning a + // JSONMessage, or JSONMessage::toString(), doesn't seem to do it. + echo json_encode(true); + die; + } + } diff --git a/pages/navigationMenu/NavigationMenuItemHandler.inc.php b/pages/navigationMenu/NavigationMenuItemHandler.inc.php index 548ca9a0579..642da5dc74e 100644 --- a/pages/navigationMenu/NavigationMenuItemHandler.inc.php +++ b/pages/navigationMenu/NavigationMenuItemHandler.inc.php @@ -74,11 +74,11 @@ function preview($args, $request) { $vars = array(); if ($context) { $vars = array( - '{$contactName}' => $context->getSetting('contactName'), - '{$contactEmail}' => $context->getSetting('contactEmail'), - '{$supportName}' => $context->getSetting('supportName'), - '{$supportPhone}' => $context->getSetting('supportPhone'), - '{$supportEmail}' => $context->getSetting('supportEmail'), + '{$contactName}' => $context->getData('contactName'), + '{$contactEmail}' => $context->getData('contactEmail'), + '{$supportName}' => $context->getData('supportName'), + '{$supportPhone}' => $context->getData('supportPhone'), + '{$supportEmail}' => $context->getData('supportEmail'), ); } @@ -115,11 +115,11 @@ function view($args, $request) { $vars = array(); if ($context) $vars = array( - '{$contactName}' => $context->getSetting('contactName'), - '{$contactEmail}' => $context->getSetting('contactEmail'), - '{$supportName}' => $context->getSetting('supportName'), - '{$supportPhone}' => $context->getSetting('supportPhone'), - '{$supportEmail}' => $context->getSetting('supportEmail'), + '{$contactName}' => $context->getData('contactName'), + '{$contactEmail}' => $context->getData('contactEmail'), + '{$supportName}' => $context->getData('supportName'), + '{$supportPhone}' => $context->getData('supportPhone'), + '{$supportEmail}' => $context->getData('supportEmail'), ); $templateMgr->assign('content', strtr(self::$nmi->getLocalizedContent(), $vars)); diff --git a/pages/sitemap/PKPSitemapHandler.inc.php b/pages/sitemap/PKPSitemapHandler.inc.php index 68fa5f9edb6..48720574633 100644 --- a/pages/sitemap/PKPSitemapHandler.inc.php +++ b/pages/sitemap/PKPSitemapHandler.inc.php @@ -82,13 +82,13 @@ function _createContextSitemap($request) { // Context home $root->appendChild($this->_createUrlTree($doc, $request->url($context->getPath()))); // User register - if ($context->getSetting('disableUserReg') != 1) { + if ($context->getData('disableUserReg') != 1) { $root->appendChild($this->_createUrlTree($doc, $request->url($context->getPath(), 'user', 'register'))); } // User login $root->appendChild($this->_createUrlTree($doc, $request->url($context->getPath(), 'login'))); // Announcements - if ($context->getSetting('enableAnnouncements') == 1) { + if ($context->getData('enableAnnouncements') == 1) { $root->appendChild($this->_createUrlTree($doc, $request->url($context->getPath(), 'announcement'))); $announcementDao = DAORegistry::getDAO('AnnouncementDAO'); $contextAssocType = Application::getContextAssocType(); @@ -98,17 +98,17 @@ function _createContextSitemap($request) { } } // About: context - if (!empty($context->getSetting('about'))) { + if (!empty($context->getData('about'))) { $root->appendChild($this->_createUrlTree($doc, $request->url($context->getPath(), 'about'))); } // About: submissions $root->appendChild($this->_createUrlTree($doc, $request->url($context->getPath(), 'about', 'submissions'))); // About: editorial team - if (!empty($context->getSetting('editorialTeam'))) { + if (!empty($context->getData('editorialTeam'))) { $root->appendChild($this->_createUrlTree($doc, $request->url($context->getPath(), 'about', 'editorialTeam'))); } // About: contact - if (!empty($context->getSetting('mailingAddress')) || !empty($context->getSetting('contactName'))) { + if (!empty($context->getData('mailingAddress')) || !empty($context->getData('contactName'))) { $root->appendChild($this->_createUrlTree($doc, $request->url($context->getPath(), 'about', 'contact'))); } // Custom pages (navigation menu items) diff --git a/pages/user/RegistrationHandler.inc.php b/pages/user/RegistrationHandler.inc.php index 330616644ae..d6d4a87a248 100644 --- a/pages/user/RegistrationHandler.inc.php +++ b/pages/user/RegistrationHandler.inc.php @@ -169,14 +169,14 @@ function validate($request) { $contexts = $contextDao->getAll(true)->toArray(); $contextsForRegistration = array(); foreach($contexts as $context) { - if (!$context->getSetting('disableUserReg')) { + if (!$context->getData('disableUserReg')) { $contextsForRegistration[] = $context; } } if (empty($contextsForRegistration)) { $disableUserReg = true; } - } elseif($context->getSetting('disableUserReg')) { + } elseif($context->getData('disableUserReg')) { $disableUserReg = true; } diff --git a/plugins/importexport/users/filter/UserXmlPKPUserFilter.inc.php b/plugins/importexport/users/filter/UserXmlPKPUserFilter.inc.php index 33a8ad225e1..263493ba834 100644 --- a/plugins/importexport/users/filter/UserXmlPKPUserFilter.inc.php +++ b/plugins/importexport/users/filter/UserXmlPKPUserFilter.inc.php @@ -248,7 +248,7 @@ function parseUser($node) { if ($password) { import('lib.pkp.classes.mail.MailTemplate'); $mail = new MailTemplate('USER_REGISTER'); - $mail->setReplyTo($context->getSetting('contactEmail'), $context->getSetting('contactName')); + $mail->setReplyTo($context->getData('contactEmail'), $context->getData('contactName')); $mail->assignParams(array('username' => $user->getUsername(), 'password' => $password, 'userFullName' => $user->getFullName())); $mail->addRecipient($user->getEmail(), $user->getFullName()); $mail->send(); diff --git a/schemas/author.json b/schemas/author.json new file mode 100644 index 00000000000..12a3bc34c04 --- /dev/null +++ b/schemas/author.json @@ -0,0 +1,62 @@ +{ + "title": "Author", + "description": "An author of a submission.", + "properties": { + "id": { + "type": "integer", + "apiSummary": true + }, + "seq": { + "type": "integer", + "apiSummary": true + }, + "givenName": { + "$ref": "#/definitions/LocaleObject" + }, + "familyName": { + "$ref": "#/definitions/LocaleObject" + }, + "fullName": { + "type": "string", + "apiSummary": true, + "readOnly": true + }, + "country": { + "type": "string" + }, + "email": { + "type": "string", + "validation": [ + "email_or_localhost" + ] + }, + "url": { + "type": "string", + "validation": [ + "url" + ] + }, + "userGroupId": { + "type": "integer" + }, + "includeInBrowse": { + "type": "boolean" + }, + "primaryContact": { + "type": "boolean" + }, + "biography": { + "$ref": "#/definitions/LocaleObject" + }, + "affilation": { + "$ref": "#/definitions/LocaleObject" + }, + "orcid": { + "type": "string", + "apiSummary": true, + "validation": [ + "orcid" + ] + } + } +} diff --git a/schemas/context.json b/schemas/context.json new file mode 100644 index 00000000000..7623419ad85 --- /dev/null +++ b/schemas/context.json @@ -0,0 +1,703 @@ +{ + "title": "Context", + "description": "A journal or press.", + "type": "object", + "required": [ + "path", + "name" + ], + "properties": { + "_href": { + "type": "string", + "format": "uri", + "readOnly": true, + "apiSummary": true + }, + "about": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "acronym": { + "type": "string", + "multilingual": true, + "apiSummary": true, + "validation": [ + "nullable" + ] + }, + "additionalHomeContent": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "agencies": { + "type": "string", + "description": "Enable agencies metadata. `0` is disabled. `enable` will make it available in the workflow. `request` will allow an author to enter a value during submission. `require` will require that the author enter a value during submission.", + "validation": [ + "nullable", + "in:0,enable,request,require" + ] + }, + "announcementsIntroduction": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "authorGuidelines": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "authorInformation": { + "type": "string", + "multilingual": true, + "defaultLocaleKey": "default.contextSettings.forAuthors", + "validation": [ + "nullable" + ] + }, + "citations": { + "type": "string", + "description": "Enable citations metadata. `0` is disabled. `enable` will make it available in the workflow. `request` will allow an author to enter a value during submission. `require` will require that the author enter a value during submission.", + "validation": [ + "nullable", + "in:0,enable,request,require" + ] + }, + "competingInterests": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "contactAffiliation": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "contactEmail": { + "type": "string", + "validation": [ + "nullable", + "email_or_localhost" + ] + }, + "contactName": { + "type": "string", + "validation": [ + "nullable" + ] + }, + "contactPhone": { + "type": "string", + "validation": [ + "nullable" + ] + }, + "copyrightHolderType": { + "type": "string", + "validation": [ + "nullable", + "in:author,context,other" + ] + }, + "copyrightHolderOther": { + "type": "string", + "validation": [ + "nullable" + ] + }, + "copyrightNotice": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "copyrightYearBasis": { + "type": "string", + "validation": [ + "nullable" + ] + }, + "coverage": { + "type": "string", + "description": "Enable coverage metadata. `0` is disabled. `enable` will make it available in the workflow. `request` will allow an author to enter a value during submission. `require` will require that the author enter a value during submission.", + "validation": [ + "nullable", + "" + ] + }, + "customHeaders": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "defaultReviewMode": { + "type": "integer", + "default": 2, + "validation": [ + "nullable", + "in:1,2,3" + ] + }, + "defaultMetricType": { + "type": "string", + "validation": [ + "nullable" + ] + }, + "description": { + "type": "string", + "multilingual": true, + "apiSummary": true, + "validation": [ + "nullable" + ] + }, + "disableUserReg": { + "type": "boolean", + "validation": [ + "nullable" + ] + }, + "disciplines": { + "type": "string", + "description": "Enable disciplines metadata. `0` is disabled. `enable` will make it available in the workflow. `request` will allow an author to enter a value during submission. `require` will require that the author enter a value during submission.", + "validation": [ + "nullable", + "in:0,enable,request,require" + ] + }, + "editorialTeam": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "emailSignature": { + "type": "string", + "defaultLocaleKey": "default.journalSettings.emailSignature", + "validation": [ + "nullable" + ] + }, + "enableAnnouncements": { + "type": "boolean", + "validation": [ + "nullable" + ] + }, + "enableClockss": { + "type": "boolean", + "validation": [ + "nullable" + ] + }, + "enabled": { + "type": "boolean", + "apiSummary": true + }, + "enableLockss": { + "type": "boolean", + "validation": [ + "nullable" + ] + }, + "envelopeSender": { + "type": "string", + "validation": [ + "nullable", + "email_or_localhost" + ] + }, + "favicon": { + "type": "object", + "multilingual": true, + "validation": [ + "nullable" + ], + "properties": { + "temporaryFileId": { + "type": "integer", + "writeOnly": true + }, + "name": { + "type": "string" + }, + "uploadName": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + }, + "dateUploaded": { + "type": "string" + }, + "altText": { + "type": "string" + } + } + }, + "homepageImage": { + "type": "object", + "multilingual": true, + "validation": [ + "nullable" + ], + "properties": { + "temporaryFileId": { + "type": "integer", + "writeOnly": true + }, + "name": { + "type": "string" + }, + "uploadName": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + }, + "dateUploaded": { + "type": "string" + }, + "altText": { + "type": "string" + } + } + }, + "id": { + "type": "integer", + "readOnly": true, + "apiSummary": true + }, + "itemsPerPage": { + "type": "integer", + "default": 25, + "validation": [ + "nullable", + "min:1" + ] + }, + "keywords": { + "type": "string", + "default": 2, + "description": "Enable keywords metadata. `0` is disabled. `enable` will make it available in the workflow. `request` will allow an author to enter a value during submission. `require` will require that the author enter a value during submission.", + "validation": [ + "nullable", + "in:0,enable,request,require" + ] + }, + "languages": { + "type": "string", + "description": "Enable languages metadata. `0` is disabled. `enable` will make it available in the workflow. `request` will allow an author to enter a value during submission. `require` will require that the author enter a value during submission.", + "validation": [ + "nullable", + "in:0,enable,request,require" + ] + }, + "librarianInformation": { + "type": "string", + "multilingual": true, + "defaultLocaleKey": "default.contextSettings.forLibrarians", + "validation": [ + "nullable" + ] + }, + "licenseTerms": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "licenseUrl": { + "type": "string", + "validation": [ + "nullable", + "url" + ] + }, + "mailingAddress": { + "type": "string", + "validation": [ + "nullable" + ] + }, + "name": { + "type": "string", + "multilingual": true, + "apiSummary": true, + "validation": [ + "nullable" + ] + }, + "numAnnouncementsHomepage": { + "type": "integer", + "validation": [ + "nullable", + "min:0" + ] + }, + "numDaysBeforeInviteReminder": { + "type": "integer", + "validation": [ + "nullable", + "min:0" + ] + }, + "numDaysBeforeSubmitReminder": { + "type": "integer", + "validation": [ + "nullable", + "min:0" + ] + }, + "numPageLinks": { + "type": "integer", + "default": 10, + "validation": [ + "nullable", + "min:1" + ] + }, + "numWeeksPerResponse": { + "type": "integer", + "validation": [ + "nullable", + "min:0" + ] + }, + "numWeeksPerReview": { + "type": "integer", + "default": 4, + "validation": [ + "nullable", + "min:0" + ] + }, + "openAccessPolicy": { + "type": "string", + "multilingual": true, + "defaultLocaleKey": "default.journalSettings.openAccessPolicy", + "validation": [ + "nullable" + ] + }, + "pageFooter": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "pageHeaderLogoImage": { + "type": "object", + "multilingual": true, + "validation": [ + "nullable" + ], + "properties": { + "temporaryFileId": { + "type": "integer", + "writeOnly": true + }, + "name": { + "type": "string" + }, + "uploadName": { + "type": "string" + }, + "width": { + "type": "integer" + }, + "height": { + "type": "integer" + }, + "dateUploaded": { + "type": "string" + }, + "altText": { + "type": "string" + } + } + }, + "path": { + "type": "string", + "validation": [ + "regex:/^[a-z0-9]+([\\-_][a-z0-9]+)*$/" + ], + "apiSummary": true + }, + "primaryLocale": { + "type": "string", + "validation": [ + "regex:/^[a-z]{2}_[A-Z]{2}(@[a-z]{0,})?$/" + ] + }, + "privacyStatement": { + "type": "string", + "multilingual": true, + "defaultLocaleKey": "default.journalSettings.privacyStatement", + "validation": [ + "nullable" + ] + }, + "publisherInstitution": { + "type": "string", + "validation": [ + "nullable" + ] + }, + "publishingMode": { + "type": "integer", + "validation": [ + "nullable", + "in:0,1,2" + ] + }, + "rateReviewerOnQuality": { + "type": "boolean", + "validation": [ + "nullable" + ] + }, + "readerInformation": { + "type": "string", + "multilingual": true, + "defaultLocaleKey": "default.contextSettings.forReaders", + "validation": [ + "nullable" + ] + }, + "restrictReviewerFileAccess": { + "type": "boolean", + "validation": [ + "nullable" + ] + }, + "restrictSiteAccess": { + "type": "boolean", + "validation": [ + "nullable" + ] + }, + "reviewerAccessKeysEnabled": { + "type": "boolean", + "validation": [ + "nullable" + ] + }, + "reviewerCompetingInterestsRequired": { + "type": "boolean", + "validation": [ + "nullable" + ] + }, + "reviewGuidelines": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "rights": { + "type": "string", + "description": "Enable rights metadata. `0` is disabled. `enable` will make it available in the workflow. `request` will allow an author to enter a value during submission. `require` will require that the author enter a value during submission.", + "validation": [ + "nullable", + "in:0,enable,request,require" + ] + }, + "searchDescription": { + "type": "string", + "multilingual": true, + "validation": [ + "nullable" + ] + }, + "seq": { + "type": "integer", + "apiSummary": true, + "validation": [ + "min:0" + ] + }, + "showEnsuringLink": { + "type": "boolean", + "validation": [ + "nullable" + ] + }, + "sidebar": { + "type": "array", + "items": { + "type": "string", + "validation": [ + "alpha_num" + ] + } + }, + "source": { + "type": "string", + "description": "Enable source metadata. `0` is disabled. `enable` will make it available in the workflow. `request` will allow an author to enter a value during submission. `require` will require that the author enter a value during submission.", + "validation": [ + "nullable", + "in:0,enable,request,require" + ] + }, + "styleSheet": { + "type": "string", + "validation": [ + "nullable" + ] + }, + "subjects": { + "type": "string", + "description": "Enable subjects metadata. `0` is disabled. `enable` will make it available in the workflow. `request` will allow an author to enter a value during submission. `require` will require that the author enter a value during submission.", + "validation": [ + "nullable", + "in:0,enable,request,require" + ] + }, + "submissionChecklist": { + "type": "array", + "multilingual": true, + "validation": [ + "nullable" + ], + "items": { + "type": "object", + "properties": { + "order": { + "type": "integer", + "validation": [ + "nullable", + "min:0" + ] + }, + "content": { + "type": "string" + } + } + }, + "default": [ + { + "order": 1, + "content": { + "defaultLocaleKey": "default.journalSettings.checklist.notPreviouslyPublished" + } + }, + { + "order": 2, + "content": { + "defaultLocaleKey": "default.journalSettings.checklist.fileFormat" + } + }, + { + "order": 3, + "content": { + "defaultLocaleKey": "default.journalSettings.checklist.addressesLinked" + } + }, + { + "order": 4, + "content": { + "defaultLocaleKey": "default.journalSettings.checklist.submissionAppearance" + } + }, + { + "order": 5, + "content": { + "defaultLocaleKey": "default.journalSettings.checklist.bibliographicRequirements" + } + } + ] + }, + "supportedFormLocales": { + "type": "array", + "items": { + "type": "string", + "validation": [ + "regex:/^[a-z]{2}_[A-Z]{2}(@[a-z]{0,})?$/" + ] + } + }, + "supportedLocales": { + "type": "array", + "items": { + "type": "string", + "validation": [ + "regex:/^[a-z]{2}_[A-Z]{2}(@[a-z]{0,})?$/" + ] + } + }, + "supportedSubmissionLocales": { + "type": "array", + "items": { + "type": "string", + "validation": [ + "regex:/^[a-z]{2}_[A-Z]{2}(@[a-z]{0,})?$/" + ] + } + }, + "supportEmail": { + "type": "string", + "validation": [ + "nullable", + "email_or_localhost" + ] + }, + "supportName": { + "type": "string", + "validation": [ + "nullable" + ] + }, + "supportPhone": { + "type": "string", + "validation": [ + "nullable" + ] + }, + "themePluginPath": { + "type": "string", + "default": "default" + }, + "type": { + "type": "string", + "description": "Enable types metadata. `0` is disabled. `enable` will make it available in the workflow. `request` will allow an author to enter a value during submission. `require` will require that the author enter a value during submission.", + "validation": [ + "nullable", + "in:0,enable,request,require" + ] + }, + "url": { + "type": "string", + "readOnly": true, + "apiSummary": true + } + } +} diff --git a/schemas/galley.json b/schemas/galley.json new file mode 100644 index 00000000000..441f0d5d83d --- /dev/null +++ b/schemas/galley.json @@ -0,0 +1,45 @@ +{ + "title": "Galley", + "description": "A galley representing a published file, such as a PDF or XML file.", + "properties": { + "_parent": { + "type": "string", + "readOnly": true + }, + "dependentFiles": { + "type": "array", + "readOnly": true, + "items": { + "$ref": "#/definitions/SubmissionFile" + } + }, + "file": { + "type": "object", + "readOnly": true, + "$ref": "#/definitions/SubmissionFile" + }, + "id": { + "type": "integer" + }, + "locale": { + "type": "string" + }, + "label": { + "type": "string", + "multilingual": true + }, + "seq": { + "type": "integer" + }, + "urlRemote": { + "type": "string", + "validation": [ + "url" + ] + }, + "urlPublished": { + "type": "string", + "readOnly": true + } + } +} diff --git a/schemas/reviewRound.json b/schemas/reviewRound.json new file mode 100644 index 00000000000..152819fd100 --- /dev/null +++ b/schemas/reviewRound.json @@ -0,0 +1,22 @@ +{ + "title": "Review Round", + "description": "A round of review assignments in the review stage.", + "properties": { + "id": { + "type": "integer" + }, + "round": { + "type": "integer" + }, + "stageId": { + "type": "integer" + }, + "status": { + "type": "string", + "readOnly": true + }, + "statusId": { + "type": "integer" + } + } +} diff --git a/schemas/submission.json b/schemas/submission.json new file mode 100644 index 00000000000..4876bb9bca9 --- /dev/null +++ b/schemas/submission.json @@ -0,0 +1,281 @@ +{ + "title": "Submission", + "description": "A submission to the journal or press, including published submissions.", + "properties": { + "_href": { + "type": "string", + "readOnly": true, + "apiSummary": true + }, + "abstract": { + "apiSummary": true, + "$ref": "#/definitions/LocaleObject" + }, + "authors": { + "type": "array", + "apiSummary": true, + "items": { + "$ref": "#/definitions/Author" + } + }, + "authorString": { + "type": "string", + "apiSummary": true, + "readOnly": true + }, + "copyrightHolder": { + "$ref": "#/definitions/LocaleObject" + }, + "copyrightYear": { + "type": "string" + }, + "coverImageUrl": { + "apiSummary": true, + "$ref": "#/definitions/LocaleObject" + }, + "coverImageAltText": { + "apiSummary": true, + "$ref": "#/definitions/LocaleObject" + }, + "datePublished": { + "type": "string", + "apiSummary": true, + "validation": [ + "date:Y-m-d H:i:s" + ] + }, + "dateStatusModified": { + "type": "string", + "validation": [ + "date:Y-m-d H:i:s" + ] + }, + "dateSubmitted": { + "type": "string", + "validation": [ + "date:Y-m-d H:i:s" + ] + }, + "discipline": { + "$ref": "#/definitions/LocaleObject" + }, + "doi": { + "type": "string", + "apiSummary": true + }, + "fulltitle": { + "$ref": "#/definitions/LocaleObject", + "apiSummary": true, + "readOnly": true + }, + "galleys": { + "type": "array", + "apiSummary": true, + "items": { + "$ref": "#/definitions/Galley" + } + }, + "id": { + "type": "integer", + "apiSummary": true + }, + "issue": { + "apiSummary": true, + "$ref": "#/definitions/IssueSummary" + }, + "language": { + "type": "string", + "apiSummary": true + }, + "lastModified": { + "type": "string", + "validation": [ + "date:Y-m-d H:i:s" + ] + }, + "licenseUrl": { + "type": "string", + "validation": [ + "url" + ] + }, + "locale": { + "type": "string" + }, + "pages": { + "type": "string", + "apiSummary": true + }, + "prefix": { + "apiSummary": true, + "$ref": "#/definitions/LocaleObject" + }, + "reviewRounds": { + "type": "array", + "readOnly": true, + "items": { + "$ref": "#/definitions/ReviewRound" + } + }, + "reviewAssignments": { + "type": "array", + "readOnly": "true", + "items": { + "type": "object", + "properties": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "isCurrentUserAssigned": { + "type": "integer", + "readOnly": true + }, + "status": { + "type": "integer", + "readOnly": true + }, + "statusLabel": { + "type": "integer", + "readOnly": true + }, + "dateDue": { + "type": "integer", + "validation": [ + "date|Y-m-d H:i:s" + ] + }, + "dateResponseDue": { + "type": "integer", + "validation": [ + "date|Y-m-d H:i:s" + ] + }, + "round": { + "type": "integer" + }, + "reviewRoundId": { + "type": "integer" + } + } + } + } + }, + "section": { + "apiSummary": true, + "$ref": "#/definitions/SectionSummary" + }, + "shortAuthorString": { + "type": "string", + "apiSummary": true, + "readOnly": true + }, + "sponsor": { + "$ref": "#/definitions/LocaleObject" + }, + "stages": { + "type": "array", + "readOnly": true, + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "label": { + "type": "string" + }, + "isActiveStage": { + "type": "boolean" + }, + "currentUserAssignedRoles": { + "type": "array", + "items": { + "type": "integer" + } + }, + "status": { + "type": "string" + }, + "statusId": { + "type": "integer" + }, + "files": { + "type": "object", + "properties": { + "count": { + "type": "integer" + } + } + }, + "queries": { + "type": "array", + "items": { + "id": { + "type": "integer" + }, + "assocType": { + "type": "integer" + }, + "assocId": { + "type": "integer" + }, + "stageId": { + "type": "integer" + }, + "seq": { + "type": "integer" + }, + "closed": { + "type": "boolean" + } + } + } + } + } + }, + "status": { + "type": "integer", + "apiSummary": true, + "validation": [ + "in:1,2,3,4" + ] + }, + "statusLabel": { + "type": "string", + "apiSummary": true + }, + "subject": { + "$ref": "#/definitions/LocaleObject" + }, + "submissionProgress": { + "type": "integer", + "apiSummary": true, + "validation": [ + "in:0,1,2,3,4" + ] + }, + "subtitle": { + "apiSummary": true, + "$ref": "#/definitions/LocaleObject" + }, + "title": { + "apiSummary": true, + "$ref": "#/definitions/LocaleObject" + }, + "type": { + "$ref": "#/definitions/LocaleObject" + }, + "urlWorkflow": { + "type": "string", + "apiSummary": true, + "readOnly": true + }, + "urlPublished": { + "type": "string", + "apiSummary": true, + "readOnly": true + } + } +} diff --git a/schemas/submissionFile.json b/schemas/submissionFile.json new file mode 100644 index 00000000000..c595d460c04 --- /dev/null +++ b/schemas/submissionFile.json @@ -0,0 +1,77 @@ +{ + "title": "Submission File", + "description": "A submission file including associated metadata.", + "properties": { + "id": { + "type": "integer" + }, + "revision": { + "type": "integer" + }, + "fileStage": { + "type": "integer" + }, + "fileName": { + "type": "string" + }, + "genreId": { + "type": "integer" + }, + "metadata": { + "type": "object", + "properties": { + "description": { + "$ref": "#/definitions/LocaleObject" + }, + "creator": { + "$ref": "#/definitions/LocaleObject" + }, + "publisher": { + "$ref": "#/definitions/LocaleObject" + }, + "source": { + "$ref": "#/definitions/LocaleObject" + }, + "subject": { + "$ref": "#/definitions/LocaleObject" + }, + "sponsor": { + "$ref": "#/definitions/LocaleObject" + }, + "dateCreated": { + "type": "string", + "validation": [ + "date:Y-m-d" + ] + }, + "language": { + "type": "string" + }, + "caption": { + "type": "string" + }, + "credit": { + "type": "string" + }, + "copyrightOwner": { + "type": "string" + }, + "terms": { + "type": "string" + }, + "width": { + "type": "string" + }, + "height": { + "type": "string" + }, + "physicalWidth": { + "type": "string" + }, + "physicalHeight": { + "type": "string" + } + } + } + } +} diff --git a/schemas/user.json b/schemas/user.json new file mode 100644 index 00000000000..a115ff4a582 --- /dev/null +++ b/schemas/user.json @@ -0,0 +1,124 @@ +{ + "title": "User", + "description": "A registered user.", + "properties": { + "_href": { + "type": "string", + "apiSummary": true, + "readOnly": true + }, + "affiliation": { + "$ref": "#/definitions/LocaleObject" + }, + "authId": { + "type": "integer" + }, + "authString": { + "type": "string" + }, + "billingAddress": { + "type": "string" + }, + "biography": { + "$ref": "#/definitions/LocaleObject" + }, + "country": { + "type": "string" + }, + "dateRegistered": { + "type": "string", + "validation": [ + "date:Y-m-d H:i:s" + ] + }, + "dateValidated": { + "type": "string", + "validation": [ + "date:Y-m-d H:i:s" + ] + }, + "dateLastRegistered": { + "type": "string", + "validation": [ + "date:Y-m-d H:i:s" + ] + }, + "disabled": { + "type": "boolean", + "apiSummary": true + }, + "disabledReason": { + "type": "string" + }, + "email": { + "type": "string", + "apiSummary": true, + "validation": [ + "email_or_localhost" + ] + }, + "familyName": { + "$ref": "#/definitions/LocaleObject" + }, + "fullName": { + "type": "string", + "apiSummary": true, + "readOnly": true + }, + "givenName": { + "$ref": "#/definitions/LocaleObject" + }, + "gossip": { + "$ref": "#/definitions/LocaleObject" + }, + "groups": { + "type": "array", + "apiSummary": true, + "readOnly": true, + "items": { + "$ref": "#/definitions/UserGroup" + } + }, + "id": { + "type": "integer", + "apiSummary": true, + "readOnly": true + }, + "interests": { + "type": "array", + "readOnly": true, + "items": { + "$ref": "#/definitions/UserInterest" + } + }, + "mailingAddress": { + "type": "string" + }, + "mustChangePassword": { + "type": "boolean" + }, + "orcid": { + "type": "string", + "apiSummary": true, + "validation": [ + "orcid" + ] + }, + "phone": { + "type": "string" + }, + "signature": { + "$ref": "#/definitions/LocaleObject" + }, + "url": { + "type": "string", + "validation": [ + "url" + ] + }, + "userName": { + "type": "string", + "apiSummary": true + } + } +} diff --git a/schemas/userGroup.json b/schemas/userGroup.json new file mode 100644 index 00000000000..bda0c2d6ed9 --- /dev/null +++ b/schemas/userGroup.json @@ -0,0 +1,30 @@ +{ + "title": "UserGroup", + "description": "A user group assigned to one of the allowed roles.", + "properties": { + "abbrev": { + "$ref": "#/definitions/LocaleObject" + }, + "id": { + "type": "integer" + }, + "name": { + "$ref": "#/definitions/LocaleObject" + }, + "permitSelfRegistration": { + "type": "boolean" + }, + "recommendOnly": { + "type": "boolean" + }, + "roleId": { + "type": "integer", + "validation": [ + "in:16,1,17,65536,4096,4097,1048576,209715" + ] + }, + "showTitle": { + "type": "boolean" + } + } +} diff --git a/styles/controllers/grid/grid.less b/styles/controllers/grid/grid.less index d588d9e2240..bb8922153c7 100644 --- a/styles/controllers/grid/grid.less +++ b/styles/controllers/grid/grid.less @@ -610,6 +610,10 @@ word-break: break-word; } +/* Fix strange grid float issue when placed inside subtabs */ +[id*="GridContainer"] .header { + max-height: 48px; +} // TODO check if these styles can be removed .pkp_controllers_grid { diff --git a/styles/controllers/modal.less b/styles/controllers/modal.less index bb377605378..d6f1dfb5277 100644 --- a/styles/controllers/modal.less +++ b/styles/controllers/modal.less @@ -158,3 +158,8 @@ &:extend(.pkp_form .pkp_spinner); } } + +// Vue.js forms inside modals +.pkp_modal .pkpForm { + margin: -@base; +} diff --git a/styles/controllers/notification.less b/styles/controllers/notification.less index 9a78faae50a..b7ded39a495 100644 --- a/styles/controllers/notification.less +++ b/styles/controllers/notification.less @@ -133,11 +133,13 @@ .notifyError .ui-pnotify-text, .notifyFormError .ui-pnotify-text, .notifyWarning .ui-pnotify-text, -.notifyForbidden .ui-pnotify-text { +.notifyForbidden .ui-pnotify-text, +.alert-danger .ui-pnotify-text { background: @no; } -.notifySuccess .ui-pnotify-text { +.notifySuccess .ui-pnotify-text, +.alert-success .ui-pnotify-text { background: @yes; } diff --git a/styles/helpers.less b/styles/helpers.less index 05117880ccd..11e2ebc8f08 100644 --- a/styles/helpers.less +++ b/styles/helpers.less @@ -257,6 +257,20 @@ line-height: @line-tiny; font-weight: @bold; text-decoration: none; + border: none; + box-shadow: none; + color: @primary; + + &:hover, + &:focus { + color: @primary-lift; + } + + &:focus { + outline: 0; + box-shadow: 0 0 0 @radius @primary; + border-radius: @radius; + } } // A small help link that attaches to a tab diff --git a/styles/pages/admin.less b/styles/pages/admin.less index 21dc3384416..a11839de86f 100644 --- a/styles/pages/admin.less +++ b/styles/pages/admin.less @@ -10,7 +10,11 @@ */ .pkp_page_admin { - ul:not(.ui-tabs-nav):not(.ui-sortable) { + ul:not(.ui-tabs-nav):not(.ui-sortable):not(.tabs-component-tabs) { &:extend(.pkp_unstyled_list); } + + &.pkp_page_content { + background: @lift; + } } diff --git a/styles/pages/index.less b/styles/pages/index.less index 932ff49505e..f0cc350452a 100644 --- a/styles/pages/index.less +++ b/styles/pages/index.less @@ -11,4 +11,5 @@ @import "admin.less"; @import "dashboard.less"; @import "settings.less"; +@import "tools.less"; @import "workflow.less"; diff --git a/styles/pages/settings.less b/styles/pages/settings.less index 4db86168815..6d1030b9f4d 100644 --- a/styles/pages/settings.less +++ b/styles/pages/settings.less @@ -34,16 +34,6 @@ color: @text-light-rgba; } -#announcementTypeGridContainer { - margin-top: @double; -} - -// Settings > Journal > Sponsor -// Collapses unnecessary grid bottom margins -#affiliationForm .pkp_controllers_grid { - margin-bottom: 0; -} - // Settings > Workflow > Publication > Review Form Item > Form Items #ReviewFormElementsGridContainer tbody:not(.empty) td:first-child p { margin-top: 0; diff --git a/styles/pages/tools.less b/styles/pages/tools.less new file mode 100644 index 00000000000..cd5ba7b4a35 --- /dev/null +++ b/styles/pages/tools.less @@ -0,0 +1,29 @@ +/** + * @file styles/pages/tools.less + * + * Copyright (c) 2014-2018 Simon Fraser University + * Copyright (c) 2003-2018 John Willinsky + * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. + * + * @brief Styles for the tool pages + * + */ +.pkp_op_tools { + + .pkp_page_content { + padding: 0; + } + + .pkp_page_statistics { + padding: @double; + background: @lift; + } + + .pkp_help_link + h3 { + margin-top: 0; + } + + ul:not(.ui-tabs-nav):not(.ui-sortable):not(.tabs-component-tabs) { + &:extend(.pkp_unstyled_list); + } +} diff --git a/styles/pages/workflow.less b/styles/pages/workflow.less index 183b2ba8b30..a918aaa71fc 100644 --- a/styles/pages/workflow.less +++ b/styles/pages/workflow.less @@ -55,7 +55,7 @@ line-height: @pkp_submission_actions_height; padding-left: @double; padding-right: @double; - background: @primary; + border-bottom: @bg-border-light; text-align: right; li { @@ -63,22 +63,35 @@ } a { + position: relative; display: block; padding-left: 1em; padding-right: 1em; font-size: @font-sml; font-weight: @bold; - color: #fff; text-decoration: none; - text-shadow: 0 2px 0 rgba(0,0,0,0.2); - &:hover, + &:before { + position: absolute; + content: ''; + top: 100%; + left: 50%; + width: 25%; + height: 2px; + background: transparent; + transition: width 0.2s; + transform: translateX(-50%); + } + &:focus { - background: @bg; - color: @primary; - text-shadow: 0 2px 0 rgba(255,255,255,0.4); outline: 0; } + + &:hover:before, + &:focus:before { + width: 100%; + background: @primary; + } } } diff --git a/styles/structure/body.less b/styles/structure/body.less index 4d3e0e48009..f2bee1e0d24 100644 --- a/styles/structure/body.less +++ b/styles/structure/body.less @@ -18,7 +18,7 @@ body { position: relative; height: auto; min-height: 100%; - background: @lift; + background: @bg; font-family: @font; font-size: @font-base; line-height: @double; @@ -59,7 +59,14 @@ img { .pkp_structure_page { margin-left: 192px; - padding: @double 0 228px; + padding: @double 0; + background: @bg; +} + +.pkp_structure_content { + margin-left: auto; + margin-right: auto; + max-width: 992px; } // Panel wrapper when supporting context sidebar diff --git a/styles/structure/foot.less b/styles/structure/foot.less index bb69f9a8849..705d1a33e63 100644 --- a/styles/structure/foot.less +++ b/styles/structure/foot.less @@ -11,14 +11,10 @@ */ .pkp_structure_footer { - position: absolute; - bottom: 0; - right: 0; - width: 100%; - height: 129px; + position: relative; padding: @double; - background: @bg; - text-align: right; + text-align: center; + margin-top: @double * 2; } .pkp_brand_footer { diff --git a/templates/admin/contextSettings.tpl b/templates/admin/contextSettings.tpl new file mode 100644 index 00000000000..3d43aabf12a --- /dev/null +++ b/templates/admin/contextSettings.tpl @@ -0,0 +1,74 @@ +{** + * templates/admin/contextSettings.tpl + * + * Copyright (c) 2014-2018 Simon Fraser University + * Copyright (c) 2003-2018 John Willinsky + * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. + * + * @brief Admin page for configuring high-level details about a context. + * + * @uses $editContext Context The context that is being edited. + *} +{include file="common/header.tpl" pageTitle="manager.settings.wizard"} + +{assign var="uuid" value=""|uniqid|escape} +
+ + + + + + + + + + + {capture assign=languagesUrl}{url router=$smarty.const.ROUTE_COMPONENT context=$editContext->getPath() component="grid.settings.languages.ManageLanguageGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="languageGridContainer" url=$languagesUrl} + + + + + {call_hook name="Template::Settings::admin::contextSettings::setup"} + + + + + + {capture assign=pluginGridUrl}{url router=$smarty.const.ROUTE_COMPONENT context=$editContext->getPath() component="grid.settings.plugins.SettingsPluginGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="pluginGridContainer" url=$pluginGridUrl} + + + {capture assign=pluginGalleryGridUrl}{url router=$smarty.const.ROUTE_COMPONENT context=$editContext->getPath() component="grid.plugins.PluginGalleryGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="pluginGalleryGridContainer" url=$pluginGalleryGridUrl} + + {call_hook name="Template::Settings::admin::contextSettings::plugins"} + + + + {capture assign=usersUrl}{url router=$smarty.const.ROUTE_COMPONENT context=$editContext->getPath() component="grid.settings.user.UserGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="userGridContainer" url=$usersUrl} + + {call_hook name="Template::Settings::admin::contextSettings"} + +
+ + +{include file="common/footer.tpl"} diff --git a/templates/admin/editContext.tpl b/templates/admin/editContext.tpl new file mode 100644 index 00000000000..3caf04c617d --- /dev/null +++ b/templates/admin/editContext.tpl @@ -0,0 +1,24 @@ +{** + * templates/admin/editContext.tpl + * + * Copyright (c) 2014-2018 Simon Fraser University + * Copyright (c) 2003-2018 John Willinsky + * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. + * + * @brief Display the form to add or edit a context + *} +
+ {if $isAddingNewContext} + +
+ diff --git a/templates/common/header.tpl b/templates/common/header.tpl index acd95992849..373c73d0fdf 100644 --- a/templates/common/header.tpl +++ b/templates/common/header.tpl @@ -41,7 +41,7 @@ {/if} {if $displayPageHeaderLogo && is_array($displayPageHeaderLogo)} - + {else} @@ -73,20 +73,28 @@ {if array_intersect(array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR, ROLE_ID_ASSISTANT, ROLE_ID_REVIEWER, ROLE_ID_AUTHOR), (array)$userRoles)}
  • - {translate key="navigation.submissions"} + {translate key="announcement.announcements"}
  • {/if} {$appSpecificMenuItems} + {if array_intersect(array(ROLE_ID_MANAGER), (array)$userRoles) && $currentContext && $currentContext->getData('enableAnnouncements')} +
  • + + {translate key="manager.setup.announcements"} + +
  • + {/if} + {if array_intersect(array(ROLE_ID_MANAGER), (array)$userRoles)} @@ -103,6 +111,7 @@ {/if} diff --git a/templates/common/helpLink.tpl b/templates/common/helpLink.tpl index a3d5480fb44..4bdf967521b 100644 --- a/templates/common/helpLink.tpl +++ b/templates/common/helpLink.tpl @@ -14,11 +14,11 @@ * @uses $helpTextKey string Locale key for the link text * @uses $helpClass string Class to add to the help link *} - + diff --git a/templates/controllers/grid/files/submissionDocuments/form/editFileForm.tpl b/templates/controllers/grid/files/submissionDocuments/form/editFileForm.tpl index c5013da9879..593d2ad2cb4 100644 --- a/templates/controllers/grid/files/submissionDocuments/form/editFileForm.tpl +++ b/templates/controllers/grid/files/submissionDocuments/form/editFileForm.tpl @@ -51,6 +51,7 @@ {/fbvFormSection} {/fbvFormArea} +

    {translate key="common.requiredField"}

    + {fbvFormButtons} -

    {translate key="common.requiredField"}

    diff --git a/templates/controllers/grid/queries/form/queryForm.tpl b/templates/controllers/grid/queries/form/queryForm.tpl index f0b5e4c853a..21e63037b9c 100644 --- a/templates/controllers/grid/queries/form/queryForm.tpl +++ b/templates/controllers/grid/queries/form/queryForm.tpl @@ -36,7 +36,7 @@ {assign var="uuid" value=""|uniqid|escape}
    {/fbvFormSection} diff --git a/templates/controllers/grid/settings/library/form/editFileForm.tpl b/templates/controllers/grid/settings/library/form/editFileForm.tpl index e376c668dab..3f882bcb5ae 100644 --- a/templates/controllers/grid/settings/library/form/editFileForm.tpl +++ b/templates/controllers/grid/settings/library/form/editFileForm.tpl @@ -59,6 +59,7 @@

    {/fbvFormSection} +

    {translate key="common.requiredField"}

    + {fbvFormButtons} -

    {translate key="common.requiredField"}

    diff --git a/templates/controllers/grid/settings/user/form/userDetailsForm.tpl b/templates/controllers/grid/settings/user/form/userDetailsForm.tpl index 2215f5b280b..04a7eb4f324 100644 --- a/templates/controllers/grid/settings/user/form/userDetailsForm.tpl +++ b/templates/controllers/grid/settings/user/form/userDetailsForm.tpl @@ -58,7 +58,7 @@ {assign var="uuid" value=""|uniqid|escape}
    {/fbvFormSection} diff --git a/templates/controllers/grid/settings/user/form/userRoleForm.tpl b/templates/controllers/grid/settings/user/form/userRoleForm.tpl index e84d2a599a0..6ac855c6a71 100644 --- a/templates/controllers/grid/settings/user/form/userRoleForm.tpl +++ b/templates/controllers/grid/settings/user/form/userRoleForm.tpl @@ -26,7 +26,7 @@ {assign var="uuid" value=""|uniqid|escape}
    {/fbvFormSection} diff --git a/templates/controllers/grid/users/stageParticipant/addParticipantForm.tpl b/templates/controllers/grid/users/stageParticipant/addParticipantForm.tpl index ec33f01a00f..65e9a057dcd 100644 --- a/templates/controllers/grid/users/stageParticipant/addParticipantForm.tpl +++ b/templates/controllers/grid/users/stageParticipant/addParticipantForm.tpl @@ -10,7 +10,7 @@ *} {* Help link *} -{help file="editorial-workflow.md" section="participants" class="pkp_help_modal"} +{help file="editorial-workflow" section="participants" class="pkp_help_modal"} - - -
    - - {* Use this disabled input to store LB deletions. See ListbuilderHandler.js *} - - -
    - {include file="controllers/grid/gridHeader.tpl"} - {foreach from=$lists item=list} - {assign var=listId value=$list->getId()} -
    - {if $grid->getActions($smarty.const.GRID_ACTION_POSITION_ABOVE)} - {include file="controllers/grid/gridActionsAbove.tpl" actions=$grid->getActions($smarty.const.GRID_ACTION_POSITION_ABOVE) gridId=$gridId} - {/if} - {if $list->getTitle()} -
    - {$list->getTitle()|translate} -
    - {/if} - {assign var=gridTableId value=$staticId|concat:"-table-":$listId} - {include file="controllers/listbuilder/listbuilderTable.tpl" gridTableId=$gridTableId rows=$listsRows[$listId]} -
    - {/foreach} -
    -
    diff --git a/templates/controllers/modals/documentLibrary/documentLibrary.tpl b/templates/controllers/modals/documentLibrary/documentLibrary.tpl index def8171b080..0cfc7b0917b 100644 --- a/templates/controllers/modals/documentLibrary/documentLibrary.tpl +++ b/templates/controllers/modals/documentLibrary/documentLibrary.tpl @@ -8,7 +8,7 @@ * Document library *} -{help file="editorial-workflow.md" section="submission-library" class="pkp_help_modal"} +{help file="editorial-workflow" section="submission-library" class="pkp_help_modal"} {capture assign=submissionLibraryGridUrl}{url submissionId=$submission->getId() router=$smarty.const.ROUTE_COMPONENT component="grid.files.submissionDocuments.SubmissionDocumentsFilesGridHandler" op="fetchGrid" escape=false}{/capture} {load_url_in_div id="submissionLibraryGridContainer" url=$submissionLibraryGridUrl} diff --git a/templates/controllers/tab/settings/library.tpl b/templates/controllers/modals/documentLibrary/publisherLibrary.tpl similarity index 58% rename from templates/controllers/tab/settings/library.tpl rename to templates/controllers/modals/documentLibrary/publisherLibrary.tpl index 638b7b54310..e94c6fe1f0b 100644 --- a/templates/controllers/tab/settings/library.tpl +++ b/templates/controllers/modals/documentLibrary/publisherLibrary.tpl @@ -1,21 +1,17 @@ {** - * controllers/tab/settings/library.tpl + * controllers/modals/documentLibrary/publisherLibrary.tpl * * Copyright (c) 2014-2018 Simon Fraser University * Copyright (c) 2003-2018 John Willinsky * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. * - * File library management. + * @brief Show a grid to manage files in the publisher library * - * @uses $isModal bool True if this template is loaded inside of a modal. + * @uses $canEdit bool True if the current user can add/edit the files. *} {* Help Link *} -{assign var=helpClass value="pkp_help_tab"} -{if $isModal} - {assign var=helpClass value="pkp_help_modal"} -{/if} -{help file="settings.md" section="workflow-library" class=$helpClass} +{help file="settings" section="workflow-library" class="pkp_help_modal"} {capture assign=libraryGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.library.LibraryFileAdminGridHandler" op="fetchGrid" canEdit=$canEdit escape=false}{/capture} {load_url_in_div id="libraryGridDiv" url=$libraryGridUrl} diff --git a/templates/controllers/tab/admin/languages/languages.tpl b/templates/controllers/tab/admin/languages/languages.tpl deleted file mode 100644 index 08d08247291..00000000000 --- a/templates/controllers/tab/admin/languages/languages.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{** - * controllers/tab/admin/languages/languages.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Language administration. - *} -{capture assign=languagesUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.admin.languages.AdminLanguageGridHandler" op="fetchGrid" escape=false}{/capture} -{load_url_in_div id="languageGridContainer" url=$languagesUrl} diff --git a/templates/controllers/tab/admin/plugins/sitePlugins.tpl b/templates/controllers/tab/admin/plugins/sitePlugins.tpl deleted file mode 100644 index b0051ff9d13..00000000000 --- a/templates/controllers/tab/admin/plugins/sitePlugins.tpl +++ /dev/null @@ -1,11 +0,0 @@ -{** - * templates/controllers/tab/admin/plugins/sitePlugins.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * List available plugins. - *} -{capture assign=pluginGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.admin.plugins.AdminPluginGridHandler" op="fetchGrid" escape=false}{/capture} -{load_url_in_div id="pluginGridContainer" url=$pluginGridUrl} diff --git a/templates/controllers/tab/settings/announcements/form/announcementSettingsForm.tpl b/templates/controllers/tab/settings/announcements/form/announcementSettingsForm.tpl deleted file mode 100644 index 2a876945c17..00000000000 --- a/templates/controllers/tab/settings/announcements/form/announcementSettingsForm.tpl +++ /dev/null @@ -1,49 +0,0 @@ -{** - * controllers/tab/settings/announcements/form/announcementSettingsForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Announcement settings form. - * - *} - -{* Help Link *} -{help file="settings.md" section="website" class="pkp_help_tab"} - - - -
    - {csrf} - {include file="controllers/notification/inPlaceNotification.tpl" notificationId="announcementSettingsFormNotification"} - - {fbvFormArea id="announcements" title="manager.setup.announcements"} - {fbvFormSection list=true description="manager.setup.announcementsDescription"} - {fbvElement type="checkbox" id="enableAnnouncements" label="manager.setup.enableAnnouncements" value="1" checked=$enableAnnouncements} - {fbvElement type="checkbox" id="enableAnnouncementsHomepage" label="manager.setup.enableAnnouncementsHomepage1" value="1" checked=$enableAnnouncementsHomepage inline=true} - {fbvElement type="select" id="numAnnouncementsHomepage" from=$numAnnouncementsHomepageOptions selected=$numAnnouncementsHomepage defaultValue="1" translate=false disabled=$disableAnnouncementsHomepage inline=true} - {translate key="manager.setup.enableAnnouncementsHomepage2"} - {/fbvFormSection} - {fbvFormSection description="manager.setup.announcementsIntroductionDescription"} - {fbvElement type="textarea" multilingual="true" id="announcementsIntroduction" value=$announcementsIntroduction rich=true} - {/fbvFormSection} - {/fbvFormArea} - - {capture assign=announcementTypeGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.announcements.AnnouncementTypeGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="announcementTypeGridContainer" url=$announcementTypeGridUrl} - - {capture assign=announcementGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.announcements.ManageAnnouncementGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="announcementGridContainer" url=$announcementGridUrl} - - {fbvFormButtons id="announcementSettingsFormSubmit" submitText="common.save" hideCancel=true} -
    diff --git a/templates/controllers/tab/settings/appearance/form/additionalHomepageContent.tpl b/templates/controllers/tab/settings/appearance/form/additionalHomepageContent.tpl deleted file mode 100644 index 6146ff295d8..00000000000 --- a/templates/controllers/tab/settings/appearance/form/additionalHomepageContent.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{** - * controllers/tab/settings/appearance/form/additionalHomepageContent.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @brief TinyMCE field for adding additional content to the homepage - * - *} -{fbvFormSection for="additionalHomeContent" label="manager.setup.additionalContent" description="manager.setup.additionalContentDescription"} - {fbvElement type="textarea" multilingual=true name="additionalHomeContent" id="additionalHomeContent" value=$additionalHomeContent rich=true} -{/fbvFormSection} diff --git a/templates/controllers/tab/settings/appearance/form/favicon.tpl b/templates/controllers/tab/settings/appearance/form/favicon.tpl deleted file mode 100644 index d43d7db3f19..00000000000 --- a/templates/controllers/tab/settings/appearance/form/favicon.tpl +++ /dev/null @@ -1,19 +0,0 @@ -{** - * controllers/tab/settings/appearance/form/favicon.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @brief Form fields for uploading a journal favicon - * - *} -{assign var="uploadImageFieldId" value=$uploadImageLinkActions.favicon->getId()} -{fbvFormSection for="$uploadImageFieldId" label="manager.setup.favicon" description="manager.setup.faviconDescription"} -
    - {$imagesViews.favicon} -
    -
    - {include file="linkAction/linkAction.tpl" action=$uploadImageLinkActions.favicon contextId="appearanceForm"} -
    -{/fbvFormSection} diff --git a/templates/controllers/tab/settings/appearance/form/footer.tpl b/templates/controllers/tab/settings/appearance/form/footer.tpl deleted file mode 100644 index de2bc43c73f..00000000000 --- a/templates/controllers/tab/settings/appearance/form/footer.tpl +++ /dev/null @@ -1,15 +0,0 @@ -{** - * controllers/tab/settings/appearance/form/footer.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @brief Form fields for adding custom content to the frontend footer - * - *} -{fbvFormArea id="pageFooterContainer" title="manager.setup.pageFooter"} - {fbvFormSection description="manager.setup.pageFooterDescription"} - {fbvElement type="textarea" multilingual=true name="pageFooter" id="pageFooter" value=$pageFooter rich=true} - {/fbvFormSection} -{/fbvFormArea} diff --git a/templates/controllers/tab/settings/appearance/form/header.tpl b/templates/controllers/tab/settings/appearance/form/header.tpl deleted file mode 100644 index e885f5b9958..00000000000 --- a/templates/controllers/tab/settings/appearance/form/header.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{** - * controllers/tab/settings/appearance/form/header.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @brief Form fields for configuring the frontend header - * - *} -{fbvFormSection label="manager.setup.logo" class=$wizardClass} -
    - {$imagesViews.pageHeaderLogoImage} -
    -
    - {include file="linkAction/linkAction.tpl" action=$uploadImageLinkActions.pageHeaderLogoImage contextId="appearanceForm"} -
    -{/fbvFormSection} diff --git a/templates/controllers/tab/settings/appearance/form/homepageImage.tpl b/templates/controllers/tab/settings/appearance/form/homepageImage.tpl deleted file mode 100644 index 4b3ff084e95..00000000000 --- a/templates/controllers/tab/settings/appearance/form/homepageImage.tpl +++ /dev/null @@ -1,19 +0,0 @@ -{** - * controllers/tab/settings/appearance/form/homepageImage.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @brief Form fields for uploading a frontend homepage image - * - *} -{assign var="uploadImageFieldId" value=$uploadImageLinkActions.homepageImage->getId()} -{fbvFormSection for="$uploadImageFieldId" label="manager.setup.homepageImage" description="manager.setup.homepageImageDescription"} -
    - {$imagesViews.homepageImage} -
    -
    - {include file="linkAction/linkAction.tpl" action=$uploadImageLinkActions.homepageImage contextId="appearanceForm"} -
    -{/fbvFormSection} diff --git a/templates/controllers/tab/settings/appearance/form/lists.tpl b/templates/controllers/tab/settings/appearance/form/lists.tpl deleted file mode 100644 index c0e376f28ad..00000000000 --- a/templates/controllers/tab/settings/appearance/form/lists.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{** - * controllers/tab/settings/appearance/form/lists.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @brief Form fields for setting list options - * - *} -{fbvFormArea id="advancedAppearanceSettings" title="manager.setup.lists"} - {fbvFormSection description="manager.setup.listsDescription"} - {fbvElement type="text" id="itemsPerPage" value=$itemsPerPage size=$fbvStyles.size.SMALL label="common.itemsPerPage"} - {/fbvFormSection} - {fbvFormSection} - {fbvElement type="text" id="numPageLinks" value=$numPageLinks size=$fbvStyles.size.SMALL label="manager.setup.numPageLinks"} - {/fbvFormSection} -{/fbvFormArea} diff --git a/templates/controllers/tab/settings/appearance/form/setup.tpl b/templates/controllers/tab/settings/appearance/form/setup.tpl deleted file mode 100644 index d43278fdf2e..00000000000 --- a/templates/controllers/tab/settings/appearance/form/setup.tpl +++ /dev/null @@ -1,27 +0,0 @@ -{** - * controllers/tab/settings/appearance/form/setup.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @brief Common setup required for the appearance settings form. - * - *} - - -{* In wizard mode, these fields should be hidden *} -{if $wizardMode} - {assign var="wizardClass" value="is_wizard_mode"} -{else} - {assign var="wizardClass" value=""} -{/if} diff --git a/templates/controllers/tab/settings/appearance/form/sidebar.tpl b/templates/controllers/tab/settings/appearance/form/sidebar.tpl deleted file mode 100644 index b5d54a03262..00000000000 --- a/templates/controllers/tab/settings/appearance/form/sidebar.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{** - * controllers/tab/settings/appearance/form/sidebar.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @brief Form fields for configuring the sidebars - * - *} -{if $isSiteSidebar} - {assign var=component value="listbuilder.admin.siteSetup.AdminBlockPluginsListbuilderHandler"} -{else} - {assign var=component value="listbuilder.settings.BlockPluginsListbuilderHandler"} -{/if} -{capture assign=blockPluginsUrl}{url router=$smarty.const.ROUTE_COMPONENT component=$component op="fetch" escape=false}{/capture} -{load_url_in_div id="blockPluginsContainer" url=$blockPluginsUrl} diff --git a/templates/controllers/tab/settings/appearance/form/stylesheet.tpl b/templates/controllers/tab/settings/appearance/form/stylesheet.tpl deleted file mode 100644 index 268bd4d7d8c..00000000000 --- a/templates/controllers/tab/settings/appearance/form/stylesheet.tpl +++ /dev/null @@ -1,19 +0,0 @@ -{** - * controllers/tab/settings/appearance/form/stylesheet.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @brief Form fields for uploading a custom frontend stylesheet - * - *} -{assign var="stylesheetFieldId" value=$uploadCssLinkAction->getId()} -{fbvFormSection label="manager.setup.useStyleSheet" for=$stylesheetFieldId description="manager.setup.styleSheetDescription"} -
    - {$styleSheetView} -
    -
    - {include file="linkAction/linkAction.tpl" action=$uploadCssLinkAction contextId="appearanceForm"} -
    -{/fbvFormSection} diff --git a/templates/controllers/tab/settings/appearance/form/theme.tpl b/templates/controllers/tab/settings/appearance/form/theme.tpl deleted file mode 100644 index d507e4732ce..00000000000 --- a/templates/controllers/tab/settings/appearance/form/theme.tpl +++ /dev/null @@ -1,52 +0,0 @@ -{** - * controllers/tab/settings/appearance/form/theme.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * @brief Form fields for selecting the frontend theme - * - *} - - -{fbvFormArea id="selectTheme"} - {if $wizardMode}{* Suppress the "click the plugins tab" message in the wizard *} - {assign var="themeDescription" value=""} - {else} - {assign var="themeDescription" value="manager.setup.layout.themeDescription"} - {/if} - {fbvFormSection label="manager.setup.layout.theme" for="themePluginPath" description=$themeDescription} - {fbvElement type="select" id="themePluginPath" from=$enabledThemes selected=$themePluginPath translate=false} - {/fbvFormSection} - - {if count($activeThemeOptions)} - {fbvFormArea id="activeThemeOptions"} - {foreach from=$activeThemeOptions key=themeOptionName item=themeOption} - - {if $themeOption.type == 'text'} - {fbvFormSection label=$themeOption.label} - {fbvElement type="text" id=$smarty.const.THEME_OPTION_PREFIX|concat:$themeOptionName value=$themeOption.value|escape label=$themeOption.description} - {/fbvFormSection} - - {elseif $themeOption.type == 'radio'} - {fbvFormSection label=$themeOption.label list=true} - {foreach from=$themeOption.options key=themeOptionItemName item=themeOptionItem} - {fbvElement type="radio" id=$smarty.const.THEME_OPTION_PREFIX|concat:$themeOptionName|concat:$themeOptionItemName name=$smarty.const.THEME_OPTION_PREFIX|concat:$themeOptionName value=$themeOptionItemName checked=$themeOption.value|compare:$themeOptionItemName label=$themeOptionItem} - {/foreach} - {/fbvFormSection} - - {elseif $themeOption.type == 'colour'} - {fbvFormSection label=$themeOption.label} - {fbvElement type="colour" id=$smarty.const.THEME_OPTION_PREFIX|concat:$themeOptionName value=$themeOption.value|escape default=$themeOption.default label=$themeOption.description} - {/fbvFormSection} - {/if} - {/foreach} - {/fbvFormArea} - {/if} -{/fbvFormArea} diff --git a/templates/controllers/tab/settings/archiving/form/archivingForm.tpl b/templates/controllers/tab/settings/archiving/form/archivingForm.tpl deleted file mode 100644 index 804c8c6a535..00000000000 --- a/templates/controllers/tab/settings/archiving/form/archivingForm.tpl +++ /dev/null @@ -1,101 +0,0 @@ -{** - * controllers/tab/settings/archiving/form/archivingForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Archiving settings form. - * - *} - -{* Help Link *} -{help file="settings.md" section="website" class="pkp_help_tab"} - - - -
    - {csrf} - {include file="controllers/notification/inPlaceNotification.tpl" notificationId="archivingFormNotification"} - - - - - {if $isPLNPluginInstalled} - {fbvFormArea id="mainLockss"} - {fbvFormArea title="manager.setup.plnPluginArchiving" id="plnArea"} - {translate key="manager.setup.plnDescription"} - - {fbvFormSection list="true" translate=false} - {capture assign="enablePLNArchivingLabel"}{translate key="manager.setup.plnPluginEnable"}{/capture} - {fbvElement type="checkbox" id="enablePln" value="1" checked=$isPLNPluginEnabled label=$enablePLNArchivingLabel translate=false} - {/fbvFormSection} - {/fbvFormArea} - {if $isPLNPluginEnabled} - {fbvFormSection translate=false} - {translate key="manager.setup.plnSettingsDescription"} - -
    - {include file="linkAction/linkAction.tpl" action=$plnSettingsShowAction contextId="archivingForm"} -
    - {/fbvFormSection} - - {fbvFormSection translate=false} - {capture assign=depositsGridUrl}{url component="plugins.generic.pln.controllers.grid.PLNStatusGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="depositsGridContainer" url=$depositsGridUrl} - {/fbvFormSection} - {/if} - {/fbvFormArea} -

    - {translate key="manager.setup.otherLockss"} -

    - {else} - {fbvFormArea title="manager.setup.plnPluginArchiving" id="plnPluginArchivingArea"} - {translate key="manager.setup.plnPluginNotInstalled"} - {/fbvFormArea} - {/if} - - {fbvFormArea id="otherLockss"} - {fbvFormArea title="manager.setup.lockssTitle" id="lockss_description"} - {translate key="manager.setup.lockssDescription"} - - {fbvFormSection list="true" translate=false} - {capture assign="lockssUrl"}{url router=$smarty.const.ROUTE_PAGE page="gateway" op="lockss"}{/capture} - {capture assign="enableLockssLabel"}{translate key="manager.setup.lockssEnable" lockssUrl=$lockssUrl}{/capture} - {fbvElement type="checkbox" id="enableLockss" value="1" checked=$enableLockss label=$enableLockssLabel translate=false} - {/fbvFormSection} - {/fbvFormArea} - - {fbvFormArea title="manager.setup.clockssTitle" id="clockss_description"} - {translate key="manager.setup.clockssDescription"} - - {fbvFormSection list="true" translate=false} - {capture assign="clockssUrl"}{url router=$smarty.const.ROUTE_PAGE page="gateway" op="clockss"}{/capture} - {capture assign="enableClockssLabel"}{translate key="manager.setup.clockssEnable" clockssUrl=$clockssUrl}{/capture} - {fbvElement type="checkbox" id="enableClockss" value="1" checked=$enableClockss label=$enableClockssLabel translate=false} - {/fbvFormSection} - {/fbvFormArea} - - {if $isPorticoPluginInstalled} - {fbvFormArea title="manager.setup.porticoTitle" id="portico_description"} - {translate key="manager.setup.porticoDescription"} - - {fbvFormSection list="true" translate=false} - {capture assign="enablePorticoLabel"}{translate key="manager.setup.porticoEnable"}{/capture} - {fbvElement type="checkbox" id="enablePortico" value="1" checked=$enablePortico label=$enablePorticoLabel translate=false} - {/fbvFormSection} - {/fbvFormArea} - {/if} - {/fbvFormArea} - - {fbvFormButtons id="archivingFormSubmit" submitText="common.save" hideCancel=true} -
    diff --git a/templates/controllers/tab/settings/contact/form/contactForm.tpl b/templates/controllers/tab/settings/contact/form/contactForm.tpl deleted file mode 100644 index 02a29ba1b72..00000000000 --- a/templates/controllers/tab/settings/contact/form/contactForm.tpl +++ /dev/null @@ -1,61 +0,0 @@ -{** - * controllers/tab/settings/contact/form/contactForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Contact management form. - * - *} - -{* Help Link *} -{help file="settings.md" section="context" class="pkp_help_tab"} - - - -
    - {csrf} - - {include file="controllers/notification/inPlaceNotification.tpl" notificationId="contactFormNotification"} - {include file="controllers/tab/settings/wizardMode.tpl" wizardMode=$wizardMode} - - {if !$wizardMode} - {fbvFormSection title="common.mailingAddress" required=true} - {fbvElement type="textarea" id="mailingAddress" value=$mailingAddress height=$fbvStyles.height.SHORT required=true} - {/fbvFormSection} - {/if} - - {fbvFormArea title="manager.setup.principalContact" id="principalContactArea"} - {fbvFormSection description="manager.setup.principalContactDescription"} - {fbvElement type="text" label="user.name" required=true id="contactName" value=$contactName maxlength="60" inline=true size=$fbvStyles.size.MEDIUM} - {fbvElement type="text" label="user.title" multilingual=true name="contactTitle" id="contactTitle" value=$contactTitle maxlength="90" inline=true size=$fbvStyles.size.MEDIUM} - {/fbvFormSection} - {fbvFormSection} - {fbvElement type="text" label="user.email" required=true id="contactEmail" value=$contactEmail maxlength="90" inline=true size=$fbvStyles.size.MEDIUM} - {fbvElement type="text" label="user.phone" id="contactPhone" value=$contactPhone maxlength="24" inline=true size=$fbvStyles.size.MEDIUM} - {/fbvFormSection} - {fbvElement type="text" label="user.affiliation" multilingual=true name="contactAffiliation" id="contactAffiliation" value=$contactAffiliation maxlength="90"} - {/fbvFormArea} - - {if !$wizardMode} - {fbvFormArea title="manager.setup.technicalSupportContact" class=$wizardClass id="technicalContactArea"} - {fbvFormSection description="manager.setup.technicalSupportContactDescription"} - {fbvElement type="text" label="user.name" required=true id="supportName" value=$supportName maxlength="60" inline=true size=$fbvStyles.size.MEDIUM} - {fbvElement type="text" label="user.email" required=true id="supportEmail" value=$supportEmail maxlength="60" inline=true size=$fbvStyles.size.MEDIUM} - {/fbvFormSection} - {fbvFormSection} - {fbvElement type="text" label="user.phone" id="supportPhone" value=$supportPhone maxlength="24" inline=true size=$fbvStyles.size.MEDIUM} - {/fbvFormSection} - {/fbvFormArea} - {/if} - - {if !$wizardMode} - {fbvFormButtons id="contactFormSubmit" submitText="common.save" hideCancel=true} - {/if} -
    diff --git a/templates/controllers/tab/settings/contextIndexing/form/contextIndexingForm.tpl b/templates/controllers/tab/settings/contextIndexing/form/contextIndexingForm.tpl deleted file mode 100644 index 03142282981..00000000000 --- a/templates/controllers/tab/settings/contextIndexing/form/contextIndexingForm.tpl +++ /dev/null @@ -1,43 +0,0 @@ -{** - * controllers/tab/settings/contextIndexing/form/contextIndexingForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Indexing management form. - * - *} - -{* Help Link *} -{help file="settings.md" section="distribution" class="pkp_help_tab"} - - - -
    - {csrf} - {include file="controllers/notification/inPlaceNotification.tpl" notificationId="contextIndexingFormNotification"} - {include file="controllers/tab/settings/wizardMode.tpl" wizardMode=$wizardMode} - - {fbvFormArea id="searchEngineIndexing"} - {fbvFormSection title="common.description" description="manager.setup.searchEngineIndexingDescription" label="manager.setup.searchEngineIndexing"} - {fbvElement type="text" multilingual="true" id="searchDescription" name="searchDescription" value=$searchDescription size=$fbvStyles.size.LARGE} - {/fbvFormSection} - {fbvFormSection label="manager.setup.customTags" description="manager.setup.customTagsDescription"} - {fbvElement type="textarea" multilingual="true" id="customHeaders" name="customHeaders" value=$customHeaders} - {/fbvFormSection} - {fbvFormSection label="manager.setup.searchEngineIndexing.sitemap"} - {capture assign=sitemapPath}{url router=$smarty.const.ROUTE_PAGE page="sitemap"}{/capture} -
    {translate key="manager.setup.searchEngineIndexing.sitemapDescription" path=$sitemapPath}
    - {/fbvFormSection} - {/fbvFormArea} - - {if !$wizardMode} - {fbvFormButtons id="contextIndexingFormSubmit" submitText="common.save" hideCancel=true} - {/if} -
    diff --git a/templates/controllers/tab/settings/emailTemplates/form/emailTemplatesForm.tpl b/templates/controllers/tab/settings/emailTemplates/form/emailTemplatesForm.tpl deleted file mode 100644 index 8e16cf7bc95..00000000000 --- a/templates/controllers/tab/settings/emailTemplates/form/emailTemplatesForm.tpl +++ /dev/null @@ -1,42 +0,0 @@ -{** - * controllers/tab/settings/emailTemplates/form/emailTemplatesForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Email templates management form. - * - *} - -{* Help Link *} -{help file="settings.md" section="workflow-emails" class="pkp_help_tab"} - - - -
    - {csrf} - {include file="controllers/notification/inPlaceNotification.tpl" notificationId="emailTemplatesFormNotification"} - - {fbvFormSection label="manager.setup.emailSignature" for="emailSignature" description="manager.setup.emailSignatureDescription"} - {fbvElement type="textarea" id="emailSignature" value=$emailSignature size=$fbvStyles.size.LARGE rich=true variables=$emailVariables} - {/fbvFormSection} - {fbvFormSection label="manager.setup.emailBounceAddress" for="envelopeSender" description="manager.setup.emailBounceAddressDescription"} - - {if $envelopeSenderDisabled} - {fbvElement type="text" id="envelopeSender" value=$envelopeSender maxlength="90" disabled=$envelopeSenderDisabled size=$fbvStyles.size.LARGE label="manager.setup.emailBounceAddressDisabled"} - {else} - {fbvElement type="text" id="envelopeSender" value=$envelopeSender maxlength="90" disabled=$envelopeSenderDisabled size=$fbvStyles.size.LARGE} - {/if} - {/fbvFormSection} - - {capture assign=preparedEmailsGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.preparedEmails.preparedEmailsGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="preparedEmailsGridDiv" url=$preparedEmailsGridUrl} - - {fbvFormButtons id="emailTemplatesFormSubmit" submitText="common.save" hideCancel=true} -
    diff --git a/templates/controllers/tab/settings/form/newFileUploadForm.tpl b/templates/controllers/tab/settings/form/newFileUploadForm.tpl deleted file mode 100644 index ec98f0a56b8..00000000000 --- a/templates/controllers/tab/settings/form/newFileUploadForm.tpl +++ /dev/null @@ -1,44 +0,0 @@ -{** - * templates/controllers/tab/settings/form/newFileUploadForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * File upload form. - *} - - - -
    - {csrf} - - {fbvFormArea id="file"} - {fbvFormSection title="common.file"} - {include file="controllers/fileUploadContainer.tpl" id="plupload"} - {/fbvFormSection} - {/fbvFormArea} - - {fbvFormButtons} -
    diff --git a/templates/controllers/tab/settings/form/newImageFileUploadForm.tpl b/templates/controllers/tab/settings/form/newImageFileUploadForm.tpl deleted file mode 100644 index eda80707738..00000000000 --- a/templates/controllers/tab/settings/form/newImageFileUploadForm.tpl +++ /dev/null @@ -1,47 +0,0 @@ -{** - * templates/controllers/tab/settings/form/newImageFileUploadForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Image file upload form. - *} - - - -
    - {csrf} - - {fbvFormArea id="file"} - {fbvFormSection title="common.file"} - {include file="controllers/fileUploadContainer.tpl" id="plupload"} - {/fbvFormSection} - {/fbvFormArea} - {fbvFormArea id="extraFileData"} - {fbvFormSection title="common.altText"} - {fbvElement type="text" label="common.altTextInstructions" multilingual=true id="imageAltText" value=$imageAltText} - {/fbvFormSection} - {/fbvFormArea} - - {fbvFormButtons} -
    diff --git a/templates/controllers/tab/settings/formFileView.tpl b/templates/controllers/tab/settings/formFileView.tpl deleted file mode 100644 index 8e9afcfd9c8..00000000000 --- a/templates/controllers/tab/settings/formFileView.tpl +++ /dev/null @@ -1,32 +0,0 @@ -{** - * controllers/tab/settings/formImageView.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Form file view. - * - *} - -
    - -
    - - {translate key="common.fileName"} - - - {$file.name|escape} - - - {translate key="common.uploadedDate"} - - - {$file.dateUploaded|date_format:$datetimeFormatShort} - - -
    - {include file="linkAction/linkAction.tpl" action=$deleteLinkAction contextId=$fileSettingName} -
    -
    -
    diff --git a/templates/controllers/tab/settings/formImageView.tpl b/templates/controllers/tab/settings/formImageView.tpl deleted file mode 100644 index 52a403ff52f..00000000000 --- a/templates/controllers/tab/settings/formImageView.tpl +++ /dev/null @@ -1,42 +0,0 @@ -{** - * controllers/tab/settings/formImageView.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Form image view. - * - *} - -
    - -
    - {$commonAltText} -
    - -
    - - {translate key="common.fileName"} - - - {$file.name|escape} - - - {translate key="common.uploadedDate"} - - - {$file.dateUploaded|date_format:$datetimeFormatShort} - - - {translate key="common.altText"} - - - {$file.altText|escape} - - -
    - {include file="linkAction/linkAction.tpl" action=$deleteLinkAction contextId=$fileSettingName} -
    -
    -
    diff --git a/templates/controllers/tab/settings/genres.tpl b/templates/controllers/tab/settings/genres.tpl deleted file mode 100644 index 90125c20964..00000000000 --- a/templates/controllers/tab/settings/genres.tpl +++ /dev/null @@ -1,18 +0,0 @@ -{** - * controllers/tab/settings/genres.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Publication process genres (submission file types). - * - *} - -{* Help Link *} -{help file="settings.md" section="workflow-components" class="pkp_help_tab"} - -
    - {capture assign=genresUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.genre.GenreGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="genresContainer" url=$genresUrl} -
    diff --git a/templates/controllers/tab/settings/information/form/informationForm.tpl b/templates/controllers/tab/settings/information/form/informationForm.tpl deleted file mode 100644 index fd3479b3d5d..00000000000 --- a/templates/controllers/tab/settings/information/form/informationForm.tpl +++ /dev/null @@ -1,43 +0,0 @@ -{** - * controllers/tab/settings/information/form/informationForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Information management form. - * - *} - -{* Help Link *} -{help file="settings.md" section="website" class="pkp_help_tab"} - - - -
    - {csrf} - - {include file="controllers/notification/inPlaceNotification.tpl" notificationId="informationFormNotification"} - - {fbvFormArea id="information"} - {fbvFormSection label="manager.setup.information.descriptionTitle" for="readerInformation" description="manager.setup.information.description"}{/fbvFormSection} - {fbvFormSection label="manager.setup.information.forReaders" for="readerInformation"} - {fbvElement type="textarea" multilingual=true id="readerInformation" value=$readerInformation rich=true} - {/fbvFormSection} - {fbvFormSection label="manager.setup.information.forAuthors" for="authorInformation"} - {fbvElement type="textarea" multilingual=true id="authorInformation" value=$authorInformation rich=true} - {/fbvFormSection} - {fbvFormSection label="manager.setup.information.forLibrarians" for="librarianInformation"} - {fbvElement type="textarea" multilingual=true id="librarianInformation" value=$librarianInformation rich=true} - {/fbvFormSection} - {/fbvFormArea} - - {fbvFormButtons id="informationFormSubmit" submitText="common.save" hideCancel=true} -
    diff --git a/templates/controllers/tab/settings/languages/languages.tpl b/templates/controllers/tab/settings/languages/languages.tpl deleted file mode 100644 index b13f25dfb6c..00000000000 --- a/templates/controllers/tab/settings/languages/languages.tpl +++ /dev/null @@ -1,20 +0,0 @@ -{** - * controllers/tab/settings/languages/languages.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Admin/manage language settings. - *} - -{* Help Link *} -{help file="settings.md" section="website" class="pkp_help_tab"} - -{if in_array(ROLE_ID_SITE_ADMIN, (array)$userRoles) && !$multipleContexts} - {capture assign=languagesUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.admin.languages.AdminLanguageGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="languageGridContainer" url=$languagesUrl} -{else} - {capture assign=languagesUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.languages.ManageLanguageGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="languageGridContainer" url=$languagesUrl} -{/if} diff --git a/templates/controllers/tab/settings/navigationMenus/form/navigationMenuSettingsForm.tpl b/templates/controllers/tab/settings/navigationMenus/form/navigationMenuSettingsForm.tpl deleted file mode 100644 index 7c8d0aae770..00000000000 --- a/templates/controllers/tab/settings/navigationMenus/form/navigationMenuSettingsForm.tpl +++ /dev/null @@ -1,32 +0,0 @@ -{** - * controllers/tab/settings/navigationMenus/form/NavigationMenuSettingsForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * NavigationMenus settings form. - * - *} - -{* Help Link *} -{help file="settings.md" section="website" class="pkp_help_tab"} - - - - diff --git a/templates/controllers/tab/settings/paymentMethod/form/paymentMethodForm.tpl b/templates/controllers/tab/settings/paymentMethod/form/paymentMethodForm.tpl deleted file mode 100644 index 40ee72e71b7..00000000000 --- a/templates/controllers/tab/settings/paymentMethod/form/paymentMethodForm.tpl +++ /dev/null @@ -1,69 +0,0 @@ -{** - * controllers/tab/settings/paymentMethod/form/paymentMethodForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Payment method management form. - * - *} - -{* Help Link *} -{help file="settings.md" section="distribution" class="pkp_help_tab"} - - - -
    -
    - {csrf} - - {include file="controllers/notification/inPlaceNotification.tpl" notificationId="paymentMethodFormNotification"} - {include file="controllers/tab/settings/wizardMode.tpl" wizardMode=$wizardMode} - {fbvFormArea id="paymentMethod"} - {fbvFormSection title="manager.payment.generalOptions" list=true} - {fbvElement type="checkbox" name="paymentsEnabled" id="paymentsEnabled" checked=$paymentsEnabled label="manager.payment.options.enablePayments" value="1"} - {/fbvFormSection} - {fbvFormSection label="manager.paymentMethod.currency" description="manager.paymentMethod.currency.description"} - {fbvElement required="true" type="select" id="currency" from=$currencies selected=$currency translate=false} - {/fbvFormSection} -
    - {fbvFormSection label="manager.paymentMethod.method"} - {fbvElement type="select" id="pluginSelect" from=$pluginNames translate=false} - {/fbvFormSection} -
    - {/fbvFormArea} - - {fbvFormArea id="paymentMethodFormContainer"} - {* The form will be loaded into this container *} - {/fbvFormArea} - -
    - - {if !$wizardMode} - {fbvFormButtons id="paymentFormSubmit" submitText="common.save" hideCancel=true} - {/if} -
    -

    {translate key="common.requiredField"}

    -
    diff --git a/templates/controllers/tab/settings/permissions/form/permissionSettingsForm.tpl b/templates/controllers/tab/settings/permissions/form/permissionSettingsForm.tpl deleted file mode 100644 index 93bce63dc42..00000000000 --- a/templates/controllers/tab/settings/permissions/form/permissionSettingsForm.tpl +++ /dev/null @@ -1,74 +0,0 @@ -{** - * controllers/tab/settings/permissionSettings/form/permissionSettingsForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Indexing management form. - * - *} - -{* Help Link *} -{help file="settings.md" section="distribution" class="pkp_help_tab"} - - - -
    - {csrf} - {include file="controllers/notification/inPlaceNotification.tpl" notificationId="permissionSettingsFormNotification"} - {include file="controllers/tab/settings/wizardMode.tpl" wizardMode=$wizardMode} - - {fbvFormArea id="permissionSettings"} - {fbvFormSection label="manager.setup.authorCopyrightNotice" description=$authorCopyrightNoticeDescription} - {fbvElement type="textarea" multilingual=true name="copyrightNotice" id="copyrightNotice" value=$copyrightNotice rich=true} - {/fbvFormSection} - - {fbvFormSection list=true} - {fbvElement type="checkbox" id="copyrightNoticeAgree" value="1" checked=$copyrightNoticeAgree label="manager.setup.authorCopyrightNoticeAgree"} - {/fbvFormSection} - - - {$additionalFormContent} - {/fbvFormArea} - - {fbvFormArea id="copyrightHolderSettings" title="submission.copyrightHolder"} - {fbvFormSection list=true} - {fbvElement type="radio" id="copyrightHolderType-author" name="copyrightHolderType" value="author" checked=$copyrightHolderType|compare:"author" label="user.role.author"} - {fbvElement type="radio" id="copyrightHolderType-context" name="copyrightHolderType" value="context" checked=$copyrightHolderType|compare:"context" label="context.context"} - {fbvElement type="radio" id="copyrightHolderType-author" name="copyrightHolderType" value="other" checked=$copyrightHolderType|compare:"other" label="common.other"} - {/fbvFormSection} - {fbvFormSection size=$fbvStyles.size.MEDIUM inline=true} - {fbvElement type="text" id="copyrightHolderOther" name="copyrightHolderOther" value=$copyrightHolderOther multilingual=true label="common.other" disabled=$copyrightHolderType|compare:"other":false:true} - {/fbvFormSection} - {/fbvFormArea} - - {fbvFormArea id="licenseSettings"} - {fbvFormSection title="submission.license"} - {fbvElement type="select" id="licenseURLSelect" from=$ccLicenseOptions selected=$licenseURL size=$fbvStyles.size.MEDIUM inline=true} - {fbvElement type="text" id="licenseURL" name="licenseURL" value=$licenseURL label="manager.setup.licenseURLDescription" size=$fbvStyles.size.MEDIUM inline=true} - {/fbvFormSection} - {/fbvFormArea} - - {if !$wizardMode} - {fbvFormSection title="manager.setup.resetPermissions"} -

    {translate key="manager.setup.resetPermissions.description"}

    - {fbvElement type="button" id="resetPermissionsButton" label="manager.setup.resetPermissions"} - {/fbvFormSection} - {fbvFormSection class="formButtons"} - {assign var=buttonId value="submitFormButton"|concat:"-"|uniqid} - {fbvElement type="submit" class="submitFormButton" id=$buttonId label="common.save"} - {/fbvFormSection} - {/if} -
    diff --git a/templates/controllers/tab/settings/plugins/plugins.tpl b/templates/controllers/tab/settings/plugins/plugins.tpl deleted file mode 100644 index 5955f662028..00000000000 --- a/templates/controllers/tab/settings/plugins/plugins.tpl +++ /dev/null @@ -1,34 +0,0 @@ -{** - * templates/controllers/tab/settings/plugins/plugins.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * List installed and available plugins in a tabbed interface. - *} - -{* Help Link *} -{help file="settings.md" section="website" class="pkp_help_tab"} - - - -
    - -
    - {capture assign=pluginGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.plugins.SettingsPluginGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="pluginGridContainer" url=$pluginGridUrl} -
    -
    - {capture assign=pluginGalleryGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.plugins.PluginGalleryGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="pluginGalleryGridContainer" url=$pluginGalleryGridUrl} -
    -
    diff --git a/templates/controllers/tab/settings/policies/form/policiesForm.tpl b/templates/controllers/tab/settings/policies/form/policiesForm.tpl deleted file mode 100644 index 747983af68e..00000000000 --- a/templates/controllers/tab/settings/policies/form/policiesForm.tpl +++ /dev/null @@ -1,60 +0,0 @@ -{** - * controllers/tab/settings/policies/form/policiesForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Policies management form. - * - *} - -{* Help Link *} -{help file="settings.md" section="context" class="pkp_help_tab"} - - - -
    - {csrf} - - {include file="controllers/notification/inPlaceNotification.tpl" notificationId="policiesFormNotification"} - {include file="controllers/tab/settings/wizardMode.tpl" wizardMode=$wizardMode} - - {fbvFormArea id="policiesFormArea"} - {fbvFormSection label="manager.setup.privacyStatement" description="manager.setup.privacyStatement.description"} - {fbvElement type="textarea" multilingual=true rich=true name="privacyStatement" id="privacyStatement" value=$privacyStatement} - {/fbvFormSection} - - {* In wizard mode, these fields should be hidden *} - {if $wizardMode} - {assign var="wizardClasses" value="is_wizard_mode"} - {else} - {assign var="wizardClasses" value=""} - {/if} - {fbvFormSection label="manager.setup.focusAndScope" description="manager.setup.focusAndScope.description" class=$wizardClasses} - {fbvElement type="textarea" multilingual=true name="focusScopeDesc" id="focusScopeDesc" value=$focusScopeDesc rich=true} - {/fbvFormSection} - {fbvFormSection label="manager.setup.openAccessPolicy" description="manager.setup.openAccessPolicy.description" class=$wizardClasses} - {capture assign="accessAndSecurityUrl"}{url page="settings" op="access"}{/capture} - {capture assign="securitySettingsNote"}{translate key="manager.setup.securitySettings.note" accessAndSecurityUrl=$accessAndSecurityUrl}{/capture} - {fbvElement type="textarea" multilingual="true" name="openAccessPolicy" id="openAccessPolicy" value=$openAccessPolicy rich=true} - {/fbvFormSection} - {fbvFormSection label="manager.setup.reviewPolicy" description="manager.setup.peerReview.description" class=$wizardClasses} - {fbvElement type="textarea" multilingual=true name="reviewPolicy" id="reviewPolicy" value=$reviewPolicy rich=true} - {/fbvFormSection} - {fbvFormSection label="manager.setup.competingInterests" description="manager.setup.competingInterestsDescription" class=$wizardClasses} - {fbvElement type="textarea" multilingual="true" id="competingInterestsPolicy" rich=true value=$competingInterestsPolicy} - {/fbvFormSection} - - {$additionalFormContent} - {/fbvFormArea} - - {if !$wizardMode} - {fbvFormButtons id="policiesFormSubmit" submitText="common.save" hideCancel=true} - {/if} -
    diff --git a/templates/controllers/tab/settings/reviewStage/form/reviewStageForm.tpl b/templates/controllers/tab/settings/reviewStage/form/reviewStageForm.tpl deleted file mode 100644 index c57a6dc0a61..00000000000 --- a/templates/controllers/tab/settings/reviewStage/form/reviewStageForm.tpl +++ /dev/null @@ -1,93 +0,0 @@ -{** - * controllers/tab/settings/reviewStage/form/reviewStageForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Review stage management form. - * - *} - -{* Help Link *} -{help file="settings.md" section="workflow-review" class="pkp_help_tab"} - - - -
    - {csrf} - {include file="controllers/notification/inPlaceNotification.tpl" notificationId="reviewStageFormNotification"} - {include file="controllers/tab/settings/wizardMode.tpl" wizardMode=$wizardMode} - - - {* In wizard mode, these fields should be hidden *} - {if $wizardMode} - {assign var="wizardClass" value="is_wizard_mode"} - {else} - {assign var="wizardClass" value=""} - {/if} - - {fbvFormArea id="reviewOptions" title="manager.setup.reviewOptions.reviewTime" class=$wizardClass} - - {fbvFormSection description="manager.setup.reviewOptions.noteOnModification"} - {fbvElement type="text" label="manager.setup.reviewOptions.numWeeksPerResponse" name="numWeeksPerResponse" id="numWeeksPerResponse" value=$numWeeksPerResponse size=$fbvStyles.size.SMALL inline=true} - {fbvElement type="text" label="manager.setup.reviewOptions.numWeeksPerReview" name="numWeeksPerReview" id="numWeeksPerReview" value=$numWeeksPerReview size=$fbvStyles.size.SMALL inline=true} - {/fbvFormSection} - - {fbvFormSection label="manager.setup.reviewOptions.automatedReminders" description="manager.setup.reviewOptions.automatedRemindersDisabled"}{/fbvFormSection} - - {capture assign="reminderDefault"}{translate key="manager.setup.reviewOptions.neverSendReminder"}{/capture} - - {fbvFormSection description="manager.setup.reviewOptions.remindForInvite"} - {if $scheduledTasksDisabled}{assign var="disabled" value=true}{else}{assign var="disabled" value=false}{/if} - {fbvElement type="select" from=$numDaysBeforeInviteReminderValues selected=$numDaysBeforeInviteReminder defaultValue="" defaultLabel=$reminderDefault id="numDaysBeforeInviteReminder" disabled=$disabled translate=false size=$fbvStyles.size.SMALL inline=true} - {/fbvFormSection} - - {fbvFormSection description="manager.setup.reviewOptions.remindForSubmit"} - {if $scheduledTasksDisabled}{assign var="disabled" value=true}{else}{assign var="disabled" value=false}{/if} - {fbvElement type="select" from=$numDaysBeforeSubmitReminderValues selected=$numDaysBeforeSubmitReminder defaultValue="" defaultLabel=$reminderDefault id="numDaysBeforeSubmitReminder" disabled=$disabled translate=false size=$fbvStyles.size.SMALL inline=true} - {/fbvFormSection} - {/fbvFormArea} - - {capture assign=reviewFormsUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.reviewForms.ReviewFormGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="reviewFormGridContainer" url=$reviewFormsUrl} - - {fbvFormArea id="reviewProcessDetails" class=$wizardClass} - {capture assign="ensureLink"}{include file="linkAction/linkAction.tpl" action=$ensuringLink contextId="uploadForm"}{/capture} - {fbvFormSection for="showEnsuringLink" label="manager.setup.reviewOptions.blindReview" list=true} - {fbvElement type="checkbox" id="showEnsuringLink" value="1" checked=$showEnsuringLink label=$ensureLink translate=false keepLabelHtml=true} - {/fbvFormSection} - {/fbvFormArea} - - {fbvFormArea id="review" class=$wizardClass} - {fbvFormSection label="manager.setup.competingInterests" for="competingInterests" description="manager.setup.competingInterestsDescription"} - {fbvElement type="textarea" multilingual="true" id="competingInterests" value=$competingInterests rich=true} - {/fbvFormSection} - {fbvFormSection for="reviewerCompetingInterestsRequired" list=true label="manager.setup.reviewerCompetingInterestsRequired.description"} - {fbvElement type="checkbox" id="reviewerCompetingInterestsRequired" checked=$reviewerCompetingInterestsRequired label="manager.setup.competingInterests.required" inline=true} - {/fbvFormSection} - - {$additionalReviewFormContents} - - {fbvFormSection label="manager.setup.reviewGuidelines" for="reviewGuidelines" description="manager.setup.reviewGuidelinesDescription"} - {fbvElement type="textarea" multilingual="true" name="reviewGuidelines" id="reviewGuidelines" value=$reviewGuidelines rich=true} - {/fbvFormSection} - {/fbvFormArea} - - {fbvFormArea id="reviewOptions" title="manager.setup.reviewOptions"} - {fbvFormSection} - {fbvElement type="select" from=$reviewMethodOptions selected=$defaultReviewMode id="defaultReviewMode" size=$fbvStyles.size.SMALL inline=true} - {/fbvFormSection} - - {$additionalReviewFormOptions} - {/fbvFormArea} - - {if !$wizardMode} - {fbvFormButtons id="reviewStageFormSubmit" submitText="common.save" hideCancel=true} - {/if} -
    diff --git a/templates/controllers/tab/settings/roles.tpl b/templates/controllers/tab/settings/roles.tpl deleted file mode 100644 index 044e9f937b9..00000000000 --- a/templates/controllers/tab/settings/roles.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{** - * controllers/tab/settings/roles.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Page for managing user groups and stages assignments. - *} - -{* Help Link *} -{help file="users-and-roles.md" section="roles" class="pkp_help_tab"} - -
    - {capture assign=rolesUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.roles.UserGroupGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="roleGridContainer" url=$rolesUrl} -
    diff --git a/templates/controllers/tab/settings/submissionStage/form/submissionStageForm.tpl b/templates/controllers/tab/settings/submissionStage/form/submissionStageForm.tpl deleted file mode 100644 index fc1a4cf8714..00000000000 --- a/templates/controllers/tab/settings/submissionStage/form/submissionStageForm.tpl +++ /dev/null @@ -1,61 +0,0 @@ -{** - * controllers/tab/settings/submissionStage/form/submissionStageForm.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Submission stage management form. - * - *} - -{* Help Link *} -{help file="settings.md" section="workflow-submission" class="pkp_help_tab"} - - - -
    - {csrf} - {include file="controllers/notification/inPlaceNotification.tpl" notificationId="submissionStageFormNotification"} - - {fbvFormArea id="authorGuidelinesArea"} - {fbvFormSection label="manager.setup.authorGuidelines" description="manager.setup.authorGuidelines.description"} - {fbvElement type="textarea" multilingual=true name="authorGuidelines" id="authorGuidelines" value=$authorGuidelines rich=true} - {/fbvFormSection} - {/fbvFormArea} - - {capture assign=submissionChecklistGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.submissionChecklist.SubmissionChecklistGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="submissionChecklistGridDiv" url=$submissionChecklistGridUrl} - - {fbvFormArea id="notificationSettings"} - {fbvFormSection label="manager.setup.notifications" for="copySubmissionAckPrimaryContact" description="manager.setup.notifications.description" list=true} - {fbvElement type="checkbox" id="copySubmissionAckPrimaryContact" disabled=$submissionAckDisabled checked=$copySubmissionAckPrimaryContact label="manager.setup.notifications.copyPrimaryContact"} - {/fbvFormSection} - {fbvFormSection} - {fbvElement type="text" disabled=$submissionAckDisabled id="copySubmissionAckAddress" value=$copySubmissionAckAddress size=$fbvStyles.size.MEDIUM label="manager.setup.notifications.copySpecifiedAddress"} - {/fbvFormSection} - {if $submissionAckDisabled} - {translate key="manager.setup.notifications.submissionAckDisabled"} - {/if} - {/fbvFormArea} - - {capture assign=metadataGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.metadata.MetadataGridHandler" op="fetchGrid" escape=false}{/capture} - {load_url_in_div id="metadataGridContainer" url=$metadataGridUrl} - - {if $enableContextPrivacyStatement} - {fbvFormArea id="privacyStatementArea"} - {fbvFormSection label="manager.setup.privacyStatement" description="manager.setup.privacyStatement.description"} - {fbvElement type="textarea" multilingual=true name="privacyStatement" id="privacyStatement" value=$privacyStatement rich=true} - {/fbvFormSection} - {/fbvFormArea} - {/if} - - {if !$wizardMode} - {fbvFormButtons id="submissionStageFormSubmit" submitText="common.save" hideCancel=true} - {/if} -
    diff --git a/templates/controllers/tab/settings/wizardMode.tpl b/templates/controllers/tab/settings/wizardMode.tpl deleted file mode 100644 index 0fb7846dda8..00000000000 --- a/templates/controllers/tab/settings/wizardMode.tpl +++ /dev/null @@ -1,12 +0,0 @@ -{** - * controllers/tab/settings/wizardMode.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Hidden input to store the wizard mode variable state, used in settings templates. - * - *} - -{fbvElement type="hidden" id="wizardMode" name="wizardMode" value=$wizardMode} diff --git a/templates/dashboard/index.tpl b/templates/dashboard/index.tpl index 7ea5d87d756..26a6b3aa377 100644 --- a/templates/dashboard/index.tpl +++ b/templates/dashboard/index.tpl @@ -25,47 +25,47 @@
  • {translate key="navigation.archives"}
  • - {help file="submissions.md" class="pkp_help_tab"} + {help file="submissions" class="pkp_help_tab"}
    {assign var="uuid" value=""|uniqid|escape}
    {if array_intersect(array(ROLE_ID_SITE_ADMIN, ROLE_ID_MANAGER), (array)$userRoles)}
    - {help file="submissions.md" section="unassigned" class="pkp_help_tab"} + {help file="submissions" section="unassigned" class="pkp_help_tab"}
    {assign var="uuid" value=""|uniqid|escape}
    - {help file="submissions.md" section="active" class="pkp_help_tab"} + {help file="submissions" section="active" class="pkp_help_tab"}
    {assign var="uuid" value=""|uniqid|escape}
    {/if}
    - {help file="submissions.md" section="archives" class="pkp_help_tab"} + {help file="submissions" section="archives" class="pkp_help_tab"}
    {assign var="uuid" value=""|uniqid|escape}
    diff --git a/templates/form/colour.tpl b/templates/form/colour.tpl deleted file mode 100644 index c483f90f8c7..00000000000 --- a/templates/form/colour.tpl +++ /dev/null @@ -1,26 +0,0 @@ -{** - * templates/form/colour.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Form color input that uses the HTML element. For - * browsers that don't support this element, we load the Spectrum jQuery lib: - * https://github.com/bgrins/spectrum - *} - -{assign var="uniqId" value="-"|concat:$FBV_uniqId|escape} - - - {$FBV_label_content} -
    diff --git a/templates/frontend/components/header.tpl b/templates/frontend/components/header.tpl index 9638d2856fa..3f3485c7975 100644 --- a/templates/frontend/components/header.tpl +++ b/templates/frontend/components/header.tpl @@ -52,7 +52,7 @@ {/capture} {if $displayPageHeaderLogo && is_array($displayPageHeaderLogo)} - + {elseif $displayPageHeaderTitle && !$displayPageHeaderLogo && is_string($displayPageHeaderTitle)} {$displayPageHeaderTitle} @@ -90,7 +90,7 @@ {/if} - + diff --git a/templates/frontend/pages/about.tpl b/templates/frontend/pages/about.tpl index a7f891afa34..2241f40655d 100644 --- a/templates/frontend/pages/about.tpl +++ b/templates/frontend/pages/about.tpl @@ -16,7 +16,7 @@ {include file="frontend/components/breadcrumbs.tpl" currentTitleKey="about.aboutContext"} {include file="frontend/components/editLink.tpl" page="management" op="settings" path="context" anchor="masthead" sectionTitleKey="about.aboutContext"} - {$currentContext->getLocalizedSetting('about')} + {$currentContext->getLocalizedData('about')} {include file="frontend/components/footer.tpl"} diff --git a/templates/frontend/pages/editorialTeam.tpl b/templates/frontend/pages/editorialTeam.tpl index 023e4d37eb3..1fba60fcef8 100644 --- a/templates/frontend/pages/editorialTeam.tpl +++ b/templates/frontend/pages/editorialTeam.tpl @@ -14,7 +14,7 @@
    {include file="frontend/components/breadcrumbs.tpl" currentTitleKey="about.editorialTeam"} {include file="frontend/components/editLink.tpl" page="management" op="settings" path="context" anchor="masthead" sectionTitleKey="about.editorialTeam"} - {$currentContext->getLocalizedSetting('editorialTeam')} + {$currentContext->getLocalizedData('editorialTeam')}
    {include file="frontend/components/footer.tpl"} diff --git a/templates/frontend/pages/privacy.tpl b/templates/frontend/pages/privacy.tpl index 808306a6534..37feb58a83f 100644 --- a/templates/frontend/pages/privacy.tpl +++ b/templates/frontend/pages/privacy.tpl @@ -13,7 +13,7 @@
    {include file="frontend/components/breadcrumbs.tpl" currentTitleKey="manager.setup.privacyStatement"} - {$privacyStatement} + {$currentContext->getLocalizedData('privacyStatement')}
    {include file="frontend/components/footer.tpl"} diff --git a/templates/frontend/pages/submissions.tpl b/templates/frontend/pages/submissions.tpl index bc6fc389cd7..f2408882c68 100644 --- a/templates/frontend/pages/submissions.tpl +++ b/templates/frontend/pages/submissions.tpl @@ -47,33 +47,33 @@ {/if} - {if $currentContext->getLocalizedSetting('authorGuidelines')} + {if $currentContext->getLocalizedData('authorGuidelines')}

    {translate key="about.authorGuidelines"} {include file="frontend/components/editLink.tpl" page="management" op="settings" path="publication" anchor="submissionStage" sectionTitleKey="about.authorGuidelines"}

    - {$currentContext->getLocalizedSetting('authorGuidelines')} + {$currentContext->getLocalizedData('authorGuidelines')}
    {/if} - {if $currentContext->getLocalizedSetting('copyrightNotice')} + {if $currentContext->getLocalizedData('copyrightNotice')} {/if} - {if $currentContext->getLocalizedSetting('privacyStatement')} -
    + {if $currentContext->getLocalizedData('privacyStatement')} +

    {translate key="about.privacyStatement"} {include file="frontend/components/editLink.tpl" page="management" op="settings" path="publication" anchor="submissionStage" sectionTitleKey="about.privacyStatement"}

    - {$currentContext->getLocalizedSetting('privacyStatement')} + {$currentContext->getLocalizedData('privacyStatement')}
    {/if} diff --git a/templates/management/access.tpl b/templates/management/access.tpl new file mode 100644 index 00000000000..c656364a038 --- /dev/null +++ b/templates/management/access.tpl @@ -0,0 +1,40 @@ +{** + * templates/management/access.tpl + * + * Copyright (c) 2014-2018 Simon Fraser University + * Copyright (c) 2003-2018 John Willinsky + * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. + * + * @brief The users, roles and site access settings page. + *} +{include file="common/header.tpl" pageTitle="navigation.access"} + + +{assign var="uuid" value=""|uniqid|escape} +
    + + + {include file="management/accessUsers.tpl"} + + + {help file="users-and-roles" section="roles" class="pkp_help_tab"} + {capture assign=rolesUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.roles.UserGroupGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="roleGridContainer" url=$rolesUrl} + + + {help file="users-and-roles" section="accessOptions" class="pkp_help_tab"} + + + {call_hook name="Template::Settings::access"} + +
    + + +{include file="common/footer.tpl"} diff --git a/templates/controllers/tab/settings/users.tpl b/templates/management/accessUsers.tpl similarity index 61% rename from templates/controllers/tab/settings/users.tpl rename to templates/management/accessUsers.tpl index f6e528be210..3f24cb8aef7 100644 --- a/templates/controllers/tab/settings/users.tpl +++ b/templates/management/accessUsers.tpl @@ -1,17 +1,15 @@ {** - * controllers/tab/settings/users.tpl + * controllers/tab/settings/accessUsers.tpl * * Copyright (c) 2014-2018 Simon Fraser University * Copyright (c) 2003-2018 John Willinsky * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. * - * User management. - * + * @brief The users grid *} {* Help Link *} -{help file="users-and-roles.md" section="users" class="pkp_help_tab"} +{help file="users-and-roles" section="users" class="pkp_help_tab"} {capture assign=usersUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.user.UserGridHandler" op="fetchGrid" oldUserId=$oldUserId escape=false}{/capture} -{assign var=gridContainerId value="userGridContainer"} -{load_url_in_div id=$gridContainerId url=$usersUrl} +{load_url_in_div id="userGridContainer" url=$usersUrl} diff --git a/templates/management/announcements.tpl b/templates/management/announcements.tpl new file mode 100644 index 00000000000..22e7ee02d06 --- /dev/null +++ b/templates/management/announcements.tpl @@ -0,0 +1,30 @@ +{** + * templates/management/announcements.tpl + * + * Copyright (c) 2014-2018 Simon Fraser University + * Copyright (c) 2003-2018 John Willinsky + * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. + * + * @brief Add and edit announcements and announcement types + *} +{include file="common/header.tpl" pageTitle="manager.setup.announcements"} + +{assign var="uuid" value=""|uniqid|escape} +
    + + + {capture assign=announcementGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.announcements.ManageAnnouncementGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="announcementGridContainer" url=$announcementGridUrl} + + + {capture assign=announcementTypeGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.announcements.AnnouncementTypeGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="announcementTypeGridContainer" url=$announcementTypeGridUrl} + + {call_hook name="Template::Announcements"} + +
    + + +{include file="common/footer.tpl"} diff --git a/templates/management/distribution.tpl b/templates/management/distribution.tpl new file mode 100644 index 00000000000..0680b726c99 --- /dev/null +++ b/templates/management/distribution.tpl @@ -0,0 +1,54 @@ +{** + * templates/management/distribution.tpl + * + * Copyright (c) 2014-2018 Simon Fraser University + * Copyright (c) 2003-2018 John Willinsky + * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. + * + * The distribution settings page. + *} +{include file="common/header.tpl" pageTitle="manager.distribution.title"} + +{assign var="uuid" value=""|uniqid|escape} +
    + + + {help file="settings" section="distribution" class="pkp_help_tab"} + + + + + + + + {call_hook name="Template::Settings::distribution::permissions"} + + + + {help file="settings" section="distribution" class="pkp_help_tab"} + + {call_hook name="Template::Settings::distribution::indexing"} + + {call_hook name="Template::Settings::distribution"} + +
    + + +{include file="common/footer.tpl"} diff --git a/templates/management/settings/access.tpl b/templates/management/settings/access.tpl deleted file mode 100644 index bbe6d82c659..00000000000 --- a/templates/management/settings/access.tpl +++ /dev/null @@ -1,33 +0,0 @@ -{** - * templates/management/settings/access.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2003-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Access and Security page. - *} - -{strip} -{assign var="pageTitle" value="navigation.access"} -{include file="common/header.tpl"} -{/strip} - - -
    - -
    - -{include file="common/footer.tpl"} diff --git a/templates/management/tools/importexport.tpl b/templates/management/tools/importexport.tpl index a8091eab922..e0fba36db58 100644 --- a/templates/management/tools/importexport.tpl +++ b/templates/management/tools/importexport.tpl @@ -8,7 +8,7 @@ * List available import/export plugins. *}
    - {help file="tools.md" section="import-export" class="pkp_help_tab"} + {help file="tools" section="import-export" class="pkp_help_tab"}
    diff --git a/templates/management/tools/permissions.tpl b/templates/management/tools/permissions.tpl new file mode 100644 index 00000000000..b823c4b403c --- /dev/null +++ b/templates/management/tools/permissions.tpl @@ -0,0 +1,33 @@ +{** + * templates/management/tools/permissions.tpl + * + * Copyright (c) 2013-2018 Simon Fraser University + * Copyright (c) 2003-2018 John Willinsky + * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. + * + * Display the permissions tool page. + * + *} +
    + {help file="tools" class="pkp_help_tab"} + +

    {translate key="manager.setup.resetPermissions"}

    +

    {translate key="manager.setup.resetPermissions.description"}

    + + + +
    + {csrf} + {fbvElement type="submit" id="resetPermissionsFormButton" label="manager.setup.resetPermissions"} +
    +
    diff --git a/templates/management/tools/reportGenerator.tpl b/templates/management/tools/reportGenerator.tpl index 6c7a2a1f978..191678349fc 100644 --- a/templates/management/tools/reportGenerator.tpl +++ b/templates/management/tools/reportGenerator.tpl @@ -1,5 +1,5 @@ {** - * templates/manager/statistics/reportGenerator.tpl + * templates/management/statistics/reportGenerator.tpl * * Copyright (c) 2013-2018 Simon Fraser University * Copyright (c) 2003-2018 John Willinsky diff --git a/templates/management/tools/statistics.tpl b/templates/management/tools/statistics.tpl index 15a5870c9f3..3a1a429f131 100644 --- a/templates/management/tools/statistics.tpl +++ b/templates/management/tools/statistics.tpl @@ -9,7 +9,7 @@ * *}
    - {help file="tools.md" section="statistics" class="pkp_help_tab"} + {help file="tools" section="statistics" class="pkp_help_tab"} {if $showMetricTypeSelector || $appSettings} {include file="management/tools/form/statisticsSettingsForm.tpl"} diff --git a/templates/management/website.tpl b/templates/management/website.tpl new file mode 100644 index 00000000000..33e36c9431d --- /dev/null +++ b/templates/management/website.tpl @@ -0,0 +1,114 @@ +{** + * templates/management/website.tpl + * + * Copyright (c) 2014-2018 Simon Fraser University + * Copyright (c) 2003-2018 John Willinsky + * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. + * + * The website settings page. + *} +{include file="common/header.tpl" pageTitle="manager.website.title"} + +{assign var="uuid" value=""|uniqid|escape} +
    + + + {help file="settings" section="website" class="pkp_help_tab"} + + + + + + + + + + + {call_hook name="Template::Settings::website::appearance"} + + + + {help file="settings" section="website" class="pkp_help_tab"} + + + + + + {capture assign=languagesUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.languages.ManageLanguageGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="languageGridContainer" url=$languagesUrl} + + + {capture assign=navigationMenusGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.navigationMenus.NavigationMenusGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="navigationMenuGridContainer" url=$navigationMenusGridUrl} + {capture assign=navigationMenuItemsGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.navigationMenus.NavigationMenuItemsGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="navigationMenuItemsGridContainer" url=$navigationMenuItemsGridUrl} + + + + + + + + + + + {call_hook name="Template::Settings::website::setup"} + + + + {help file="settings" section="website" class="pkp_help_tab"} + + + {capture assign=pluginGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.plugins.SettingsPluginGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="pluginGridContainer" url=$pluginGridUrl} + + + {capture assign=pluginGalleryGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.plugins.PluginGalleryGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="pluginGalleryGridContainer" url=$pluginGalleryGridUrl} + + {call_hook name="Template::Settings::website::plugins"} + + + {call_hook name="Template::Settings::website"} + +
    + + +{include file="common/footer.tpl"} diff --git a/templates/management/workflow.tpl b/templates/management/workflow.tpl new file mode 100644 index 00000000000..f650d4690f4 --- /dev/null +++ b/templates/management/workflow.tpl @@ -0,0 +1,101 @@ +{** + * templates/management/workflow.tpl + * + * Copyright (c) 2014-2018 Simon Fraser University + * Copyright (c) 2003-2018 John Willinsky + * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. + * + * @brief The workflow settings page. + *} +{include file="common/header.tpl" pageTitle="manager.workflow.title"} + +{assign var="uuid" value=""|uniqid|escape} +
    + + + {help file="settings" section="workflow-submission" class="pkp_help_tab"} + + + + + + {capture assign=genresUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.genre.GenreGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="genresGridContainer" url=$genresUrl} + + + {capture assign=submissionChecklistGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.submissionChecklist.SubmissionChecklistGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="submissionChecklistGridContainer" url=$submissionChecklistGridUrl} + + + + + {call_hook name="Template::Settings::workflow::submission"} + + + + {help file="settings" section="workflow-review" class="pkp_help_tab"} + + + + + + + + + {capture assign=reviewFormsUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.reviewForms.ReviewFormGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="reviewFormGridContainer" url=$reviewFormsUrl} + + {call_hook name="Template::Settings::workflow::review"} + + + + {help file="settings" section="workflow-library" class="pkp_help_tab"} + {capture assign=libraryGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.library.LibraryFileAdminGridHandler" op="fetchGrid" canEdit=true escape=false}{/capture} + {load_url_in_div id="libraryGridDiv" url=$libraryGridUrl} + + + {help file="settings" section="workflow-emails" class="pkp_help_tab"} + + + + + + {capture assign=preparedEmailsGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.settings.preparedEmails.preparedEmailsGridHandler" op="fetchGrid" escape=false}{/capture} + {load_url_in_div id="preparedEmailsGridDiv" url=$preparedEmailsGridUrl} + + {call_hook name="Template::Settings::workflow::emails"} + + + {call_hook name="Template::Settings::workflow"} + +
    + + +{include file="common/footer.tpl"} diff --git a/templates/manager/announcement/announcementTypes.tpl b/templates/manager/announcement/announcementTypes.tpl deleted file mode 100644 index bab9875b6d7..00000000000 --- a/templates/manager/announcement/announcementTypes.tpl +++ /dev/null @@ -1,21 +0,0 @@ -{** - * lib/pkp/templates/manager/announcement/announcementTypes.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Display list of announcement types in management. - * - *} -{include file="common/header.tpl" pageTitle="manager.announcementTypes" pageId="manager.announcementTypes"} - - - -{capture assign=announcementTypeGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.announcements.AnnouncementTypeGridHandler" op="fetchGrid" escape=false}{/capture} -{load_url_in_div id="announcementTypeGridContainer" url=$announcementTypeGridUrl} - -{include file="common/footer.tpl"} diff --git a/templates/manager/announcement/announcements.tpl b/templates/manager/announcement/announcements.tpl deleted file mode 100644 index 97fc43694b3..00000000000 --- a/templates/manager/announcement/announcements.tpl +++ /dev/null @@ -1,21 +0,0 @@ -{** - * lib/pkp/templates/announcement/announcements.tpl - * - * Copyright (c) 2014-2018 Simon Fraser University - * Copyright (c) 2000-2018 John Willinsky - * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. - * - * Display list of announcements in management. - * - *} -{include file="common/header.tpl" pageTitle="manager.announcements" pageId="manager.announcements"} - - - -{capture assign=announcementGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.announcements.ManageAnnouncementGridHandler" op="fetchGrid" escape=false}{/capture} -{load_url_in_div id="announcementGridContainer" url=$announcementGridUrl} - -{include file="common/footer.tpl"} diff --git a/templates/reviewer/review/step1.tpl b/templates/reviewer/review/step1.tpl index eefcdc509cd..1b726269242 100644 --- a/templates/reviewer/review/step1.tpl +++ b/templates/reviewer/review/step1.tpl @@ -35,7 +35,7 @@ {fbvFormSection label="editor.submissionReview.reviewType"} {$reviewMethod|escape} {/fbvFormSection} - + {if !$restrictReviewerFileAccess} {capture assign=reviewFilesGridUrl}{url router=$smarty.const.ROUTE_COMPONENT component="grid.files.review.ReviewerReviewFilesGridHandler" op="fetchGrid" submissionId=$submission->getId() stageId=$reviewAssignment->getStageId() reviewRoundId=$reviewRoundId reviewAssignmentId=$reviewAssignment->getId() escape=false}{/capture} {load_url_in_div id="reviewFilesStep1" url=$reviewFilesGridUrl} @@ -70,7 +70,7 @@ {assign var="hasCI" value=false} {assign var="noCI" value=true} {/if} - {if $hasCI || $currentContext->getSetting('reviewerCompetingInterestsRequired')} + {if $hasCI || $currentContext->getData('reviewerCompetingInterestsRequired')} {fbvFormSection list=true} {fbvElement type="radio" value="noCompetingInterests" id="noCompetingInterests" name="competingInterestOption" checked=$noCI label="reviewer.submission.noCompetingInterests" disabled=$reviewIsComplete}

    @@ -82,7 +82,7 @@ {/fbvFormSection} {/if} - {if !$reviewAssignment->getDeclined() && !$reviewAssignment->getDateConfirmed() && $currentContext->getSetting('privacyStatement')} + {if !$reviewAssignment->getDeclined() && !$reviewAssignment->getDateConfirmed() && $currentContext->getData('privacyStatement')} {fbvFormSection list=true} {capture assign="privacyUrl"}{url router=$smarty.const.ROUTE_PAGE page="about" op="privacy"}{/capture} {capture assign="privacyLabel"}{translate key="user.register.form.privacyConsent" privacyUrl=$privacyUrl}{/capture} diff --git a/templates/submission/form/step1.tpl b/templates/submission/form/step1.tpl index 122b380e4e7..b627baf0a3f 100644 --- a/templates/submission/form/step1.tpl +++ b/templates/submission/form/step1.tpl @@ -30,9 +30,9 @@ {$additionalFormContent2} {* Submission checklist *} - {if $currentContext->getLocalizedSetting('submissionChecklist')} + {if $currentContext->getLocalizedData('submissionChecklist')} {fbvFormSection list="true" label="submission.submit.submissionChecklist" description="submission.submit.submissionChecklistDescription" id="pkp_submissionChecklist"} - {foreach name=checklist from=$currentContext->getLocalizedSetting('submissionChecklist') key=checklistId item=checklistItem} + {foreach name=checklist from=$currentContext->getLocalizedData('submissionChecklist') key=checklistId item=checklistItem} {fbvElement type="checkbox" id="checklist-$checklistId" required=true value=1 label=$checklistItem.content translate=false checked=false} {/foreach} {/fbvFormSection} @@ -81,7 +81,7 @@ {/if} {/if} - {if $copyrightNoticeAgree} + {if $copyrightNotice} {fbvFormSection title="submission.submit.copyrightNoticeAgreementLabel"} {$copyrightNotice} {fbvFormSection list="true"} diff --git a/templates/submission/submissionMetadataFormFields.tpl b/templates/submission/submissionMetadataFormFields.tpl index 3a7146e7c6d..5be1f2b5388 100644 --- a/templates/submission/submissionMetadataFormFields.tpl +++ b/templates/submission/submissionMetadataFormFields.tpl @@ -15,7 +15,7 @@ {assign var=citationsEnabled value=false} {/if} {if $coverageEnabled || $typeEnabled || $sourceEnabled || $rightsEnabled || - $languagesEnabled || $subjectsEnabled || $keywordsEnabled || $agenciesEnabled || ($citationsEnabled && !$metadataModal) || $disciplinesEnabled} + $languagesEnabled || $subjectsEnabled || $keywordsEnabled || ($citationsEnabled && !$metadataModal) || $disciplinesEnabled} {fbvFormSection title="submission.metadata"}

    {translate key="submission.metadataDescription"}

    {/fbvFormSection} @@ -45,7 +45,7 @@ {/fbvFormArea} {/if} -{if $languagesEnabled || $subjectsEnabled || $keywordsEnabled || $agenciesEnabled || ($citationsEnabled && !$metadataModal) || $disciplinesEnabled} +{if $languagesEnabled || $subjectsEnabled || $keywordsEnabled || ($citationsEnabled && !$metadataModal) || $disciplinesEnabled} {fbvFormArea id="tagitFields" title="submission.submit.metadataForm"} {if $languagesEnabled} {$languagesField} @@ -65,11 +65,6 @@ {fbvElement type="keyword" id="keywords" multilingual=true current=$keywords disabled=$readOnly required=$keywordsRequired} {/fbvFormSection} {/if} - {if $agenciesEnabled} - {fbvFormSection label="submission.supportingAgencies"} - {fbvElement type="keyword" id="agencies" multilingual=true current=$agencies disabled=$readOnly required=$agenciesRequired} - {/fbvFormSection} - {/if} {if $citationsEnabled && !$metadataModal} {fbvFormSection label="submission.citations"} {fbvElement type="textarea" id="citations" value=$citations multilingual=false disabled=$readOnly required=$citationsRequired} diff --git a/templates/user/apiProfileForm.tpl b/templates/user/apiProfileForm.tpl index 7121660f5cb..2379d07022c 100644 --- a/templates/user/apiProfileForm.tpl +++ b/templates/user/apiProfileForm.tpl @@ -9,7 +9,7 @@ *} {* Help Link *} -{help file="user-profile.md" class="pkp_help_tab"} +{help file="user-profile" class="pkp_help_tab"}