Merge pull request #74 from getgrav/feature/translate-admin

Merge the feature/translate branch.
- Adds translation of the whole admin interface, blueprints included.
- Adds editing of content in multiple languages.
This commit is contained in:
Flavio Copes
2015-08-18 20:37:09 +02:00
53 changed files with 1089 additions and 299 deletions

View File

@@ -291,6 +291,7 @@ class AdminPlugin extends Plugin
protected function initializeAdmin()
{
$this->enable([
'onTwigExtensions' => ['onTwigExtensions', 1000],
'onPagesInitialized' => ['onPagesInitialized', 1000],
'onTwigTemplatePaths' => ['onTwigTemplatePaths', 1000],
'onTwigSiteVariables' => ['onTwigSiteVariables', 1000],
@@ -335,4 +336,13 @@ class AdminPlugin extends Plugin
// Get theme for admin
$this->theme = $this->config->get('plugins.admin.theme', 'grav');
}
/**
* Add Twig Extensions
*/
public function onTwigExtensions()
{
require_once(__DIR__.'/twig/AdminTwigExtension.php');
$this->grav['twig']->twig->addExtension(new AdminTwigExtension());
}
}

View File

@@ -69,6 +69,11 @@ class Admin
*/
public $user;
/**
* @var Lang
*/
protected $lang;
/**
* @var Grav\Common\GPM\GPM
*/
@@ -88,10 +93,28 @@ class Admin
$this->base = $base;
$this->location = $location;
$this->route = $route;
$this->uri = $this->grav['uri'];
$this->session = $this->grav['session'];
$this->user = $this->grav['user'];
$language = $this->grav['language'];
if ($language->enabled()) {
$this->multilang = true;
$this->languages_enabled = $this->grav['config']->get('system.languages.supported', []);
//Set the currently active language for the admin
$language = $this->grav['uri']->param('lang');
if (!$language) {
$language = $this->session->admin_lang;
}
$this->grav['language']->setActive($language ?: 'en');
} else {
$this->grav['language']->setActive('en');
$this->multilang = false;
}
}
/**
@@ -155,9 +178,7 @@ class Admin
/** @var Grav $grav */
$grav = $this->grav;
$l = $this->grav['language'];
$this->setMessage($l->translate('LOGIN_LOGGED_IN'), 'info');
$this->setMessage($this->grav['language']->translate('PLUGIN_ADMIN.LOGIN_LOGGED_IN', [$this->user->language]), 'info');
$redirect_route = $this->uri->route();
$grav->redirect($redirect_route);
@@ -573,6 +594,11 @@ class Admin
return $page;
}
/**
* Return the languages available in the admin
*
* @return array
*/
public static function adminLanguages()
{
$languages = [];
@@ -583,6 +609,22 @@ class Admin
return $languages;
}
/**
* Return the languages available in the site
*
* @return array
*/
public static function siteLanguages()
{
$languages = [];
$lang_data = Grav::instance()['config']->get('system.languages.supported', []);
foreach ($lang_data as $index => $lang) {
$languages[$lang] = LanguageCodes::getNativeName($lang);
}
return $languages;
}
/**
* Static helper method to return current route.
*
@@ -609,6 +651,11 @@ class Admin
}
}
/**
* Renders phpinfo
*
* @return string The phpinfo() output
*/
function phpinfo() {
ob_start();
phpinfo();
@@ -618,4 +665,51 @@ class Admin
$pinfo = preg_replace( '%^.*<body>(.*)</body>.*$%ms','$1',$pinfo);
return $pinfo;
}
/**
* Translate a string to the user-defined language
*
* @param $string the string to translate
*/
public function translate($string) {
return $this->_translate($string, [$this->grav['user']->authenticated ? $this->grav['user']->language : 'en']);
}
public function _translate($args, Array $languages = null, $array_support = false, $html_out = false)
{
if (is_array($args)) {
$lookup = array_shift($args);
} else {
$lookup = $args;
$args = [];
}
if ($lookup) {
if (empty($languages)) {
if ($this->grav['config']->get('system.languages.translations_fallback', true)) {
$languages = $this->grav['language']->getFallbackLanguages();
} else {
$languages = (array)$this->grav['language']->getDefault();
}
} else {
$languages = ['en'];
}
} else {
$languages = ['en'];
}
foreach ((array)$languages as $lang) {
$translation = $this->grav['language']->getTranslation($lang, $lookup, $array_support);
if ($translation) {
if (count($args) >= 1) {
return vsprintf($translation, $args);
} else {
return $translation;
}
}
}
return $lookup;
}
}

View File

@@ -129,12 +129,10 @@ class AdminController
*/
protected function taskLogin()
{
$l = $this->grav['language'];
if ($this->admin->authenticate($this->post)) {
// should never reach here, redirects first
} else {
$this->admin->setMessage($l->translate('LOGIN_FAILED'), 'error');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.LOGIN_FAILED'), 'error');
}
return true;
@@ -147,10 +145,8 @@ class AdminController
*/
protected function taskLogout()
{
$l = $this->grav['language'];
$this->admin->session()->invalidate()->start();
$this->admin->setMessage($l->translate('LOGGED_OUT'), 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.LOGGED_OUT'), 'info');
$this->setRedirect('/logout');
return true;
@@ -163,27 +159,25 @@ class AdminController
*/
protected function taskForgot()
{
$l = $this->grav['language'];
$data = $this->post;
$username = isset($data['username']) ? $data['username'] : '';
$user = !empty($username) ? User::load($username) : null;
if (!isset($this->grav['Email'])) {
$this->admin->setMessage($l->translate('FORGOT_EMAIL_NOT_CONFIGURED'), 'error');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.FORGOT_EMAIL_NOT_CONFIGURED'), 'error');
$this->setRedirect('/');
return true;
}
if (!$user || !$user->exists()) {
$this->admin->setMessage($l->translate(['FORGOT_USERNAME_DOES_NOT_EXIST', $username]), 'error');
$this->admin->setMessage($this->admin->translate(['PLUGIN_ADMIN.FORGOT_USERNAME_DOES_NOT_EXIST', $username]), 'error');
$this->setRedirect('/forgot');
return true;
}
if (empty($user->email)) {
$this->admin->setMessage($l->translate(['FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL', $username]), 'error');
$this->admin->setMessage($this->admin->translate(['PLUGIN_ADMIN.FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL', $username]), 'error');
$this->setRedirect('/forgot');
return true;
}
@@ -202,8 +196,8 @@ class AdminController
$from = $this->grav['config']->get('plugins.email.from', 'noreply@getgrav.org');
$to = $user->email;
$subject = $l->translate(['FORGOT_EMAIL_SUBJECT', $sitename]);
$content = $l->translate(['FORGOT_EMAIL_BODY', $fullname, $reset_link, $author, $sitename]);
$subject = $this->admin->translate(['PLUGIN_ADMIN.FORGOT_EMAIL_SUBJECT', $sitename]);
$content = $this->admin->translate(['PLUGIN_ADMIN.FORGOT_EMAIL_BODY', $fullname, $reset_link, $author, $sitename]);
$body = $this->grav['twig']->processTemplate('email/base.html.twig', ['content' => $content]);
@@ -214,9 +208,9 @@ class AdminController
$sent = $this->grav['Email']->send($message);
if ($sent < 1) {
$this->admin->setMessage($l->translate('FORGOT_FAILED_TO_EMAIL'), 'error');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.FORGOT_FAILED_TO_EMAIL'), 'error');
} else {
$this->admin->setMessage($l->translate(['FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL', $to]), 'info');
$this->admin->setMessage($this->admin->translate(['PLUGIN_ADMIN.FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL', $to]), 'info');
}
$this->setRedirect('/');
@@ -230,8 +224,6 @@ class AdminController
*/
public function taskReset()
{
$l = $this->grav['language'];
$data = $this->post;
if (isset($data['password'])) {
@@ -245,7 +237,7 @@ class AdminController
if ($good_token === $token) {
if (time() > $expire) {
$this->admin->setMessage($l->translate('RESET_LINK_EXPIRED'), 'error');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_LINK_EXPIRED'), 'error');
$this->setRedirect('/forgot');
return true;
}
@@ -258,13 +250,13 @@ class AdminController
$user->filter();
$user->save();
$this->admin->setMessage($l->translate('RESET_PASSWORD_RESET'), 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_PASSWORD_RESET'), 'info');
$this->setRedirect('/');
return true;
}
}
$this->admin->setMessage($l->translate('RESET_INVALID_LINK'), 'error');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_INVALID_LINK'), 'error');
$this->setRedirect('/forgot');
return true;
@@ -273,7 +265,7 @@ class AdminController
$token = $this->grav['uri']->param('token');
if (empty($user) || empty($token)) {
$this->admin->setMessage($l->translate('RESET_INVALID_LINK'), 'error');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.RESET_INVALID_LINK'), 'error');
$this->setRedirect('/forgot');
return true;
}
@@ -306,9 +298,9 @@ class AdminController
$results = Cache::clearCache($clear);
if (count($results) > 0) {
$this->admin->json_response = ['status' => 'success', 'message' => 'Cache cleared <br />Method: ' . $clear . ''];
$this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.CACHE_CLEARED') . ' <br />' . $this->admin->translate('PLUGIN_ADMIN.METHOD') . ': ' . $clear . ''];
} else {
$this->admin->json_response = ['status' => 'error', 'message' => 'Error clearing cache'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.ERROR_CLEARING_CACHE')];
}
return true;
@@ -338,7 +330,7 @@ class AdminController
} catch (\Exception $e) {
$this->admin->json_response = [
'status' => 'error',
'message' => 'An error occured. '. $e->getMessage()
'message' => $this->admin->translate('PLUGIN_ADMIN.AN_ERROR_OCCURRED') . '. '. $e->getMessage()
];
return true;
@@ -355,7 +347,7 @@ class AdminController
$this->admin->json_response = [
'status' => 'success',
'message' => 'Your backup is ready for download. <a href="'.$url.'" class="button">Download backup</a>',
'message' => $this->admin->translate('PLUGIN_ADMIN.YOUR_BACKUP_IS_READY_FOR_DOWNLOAD') . '. <a href="'.$url.'" class="button">' . $this->admin->translate('PLUGIN_ADMIN.DOWNLOAD_BACKUP') .'</a>',
'toastr' => [
'timeOut' => 0,
'closeButton' => true
@@ -412,7 +404,7 @@ class AdminController
$this->admin->json_response = [
'status' => 'success',
'message' => 'Pages filtered',
'message' => $this->admin->translate('PLUGIN_ADMIN.PAGES_FILTERED'),
'results' => $results
];
$this->admin->collection = $collection;
@@ -432,7 +424,7 @@ class AdminController
$page = $this->admin->page(true);
if (!$page) {
$this->admin->json_response = ['status' => 'error', 'message' => 'No Page found'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND')];
return false;
}
@@ -460,7 +452,7 @@ class AdminController
$config = $this->grav['config'];
if (!isset($_FILES['file']['error']) || is_array($_FILES['file']['error'])) {
$this->admin->json_response = ['status' => 'error', 'message' => 'Invalid Parameters'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.INVALID_PARAMETERS')];
return;
}
@@ -469,21 +461,21 @@ class AdminController
case UPLOAD_ERR_OK:
break;
case UPLOAD_ERR_NO_FILE:
$this->admin->json_response = ['status' => 'error', 'message' => 'No files sent'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_FILES_SENT')];
return;
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
$this->admin->json_response = ['status' => 'error', 'message' => 'Exceeded filesize limit.'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.EXCEEDED_FILESIZE_LIMIT')];
return;
default:
$this->admin->json_response = ['status' => 'error', 'message' => 'Unkown errors'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.UNKNOWN_ERRORS')];
return;
}
$grav_limit = $config->get('system.media.upload_limit', 0);
// You should also check filesize here.
if ($grav_limit > 0 && $_FILES['file']['size'] > grav_limit) {
$this->admin->json_response = ['status' => 'error', 'message' => 'Exceeded Grav filesize limit.'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.EXCEEDED_GRAV_FILESIZE_LIMIT')];
return;
}
@@ -494,18 +486,18 @@ class AdminController
// If not a supported type, return
if (!$config->get("media.{$fileExt}")) {
$this->admin->json_response = ['status' => 'error', 'message' => 'Unsupported file type: '.$fileExt];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.UNSUPPORTED_FILE_TYPE') . ': '.$fileExt];
return;
}
// Upload it
if (!move_uploaded_file($_FILES['file']['tmp_name'], sprintf('%s/%s', $page->path(), $_FILES['file']['name']))) {
$this->admin->json_response = ['status' => 'error', 'message' => 'Failed to move uploaded file.'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.FAILED_TO_MOVE_UPLOADED_FILE')];
return;
}
$this->admin->json_response = ['status' => 'success', 'message' => 'File uploaded successfully'];
$this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_UPLOADED_SUCCESSFULLY')];
return;
}
@@ -524,7 +516,7 @@ class AdminController
$page = $this->admin->page(true);
if (!$page) {
$this->admin->json_response = ['status' => 'error', 'message' => 'No Page found'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND')];
return false;
}
@@ -534,15 +526,15 @@ class AdminController
if (file_exists($targetPath)) {
if (unlink($targetPath)) {
$this->admin->json_response = ['status' => 'success', 'message' => 'File deleted: '.$filename];
$this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_DELETED') . ': '.$filename];
} else {
$this->admin->json_response = ['status' => 'error', 'message' => 'File could not be deleted: '.$filename];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_COULD_NOT_BE_DELETED') . ': '.$filename];
}
} else {
$this->admin->json_response = ['status' => 'error', 'message' => 'File not found: '.$filename];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_NOT_FOUND') . ': '.$filename];
}
} else {
$this->admin->json_response = ['status' => 'error', 'message' => 'No file found'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_FILE_FOUND')];
}
return true;
@@ -561,7 +553,7 @@ class AdminController
$page = $this->admin->page(true);
if (!$page) {
$this->admin->json_response = ['status' => 'error', 'message' => 'No Page found'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.NO_PAGE_FOUND')];
return false;
}
@@ -596,7 +588,7 @@ class AdminController
$this->post = array('enabled' => 1, '_redirect' => 'plugins');
$obj = $this->prepareData();
$obj->save();
$this->admin->setMessage('Successfully enabled plugin', 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_ENABLED_PLUGIN'), 'info');
return true;
}
@@ -620,7 +612,7 @@ class AdminController
$this->post = array('enabled' => 0, '_redirect' => 'plugins');
$obj = $this->prepareData();
$obj->save();
$this->admin->setMessage('Successfully disabled plugin', 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_DISABLED_PLUGIN'), 'info');
return true;
}
@@ -659,7 +651,7 @@ class AdminController
// TODO: find out why reload and save doesn't always update the object itself (and remove this workaround).
$config->set('system.pages.theme', $name);
$this->admin->setMessage('Successfully changed default theme.', 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_CHANGED_THEME'), 'info');
return true;
}
@@ -683,9 +675,9 @@ class AdminController
$result = \Grav\Plugin\Admin\Gpm::install($package, []);
if ($result) {
$this->admin->setMessage("Installation successful.", 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_SUCCESSFUL'), 'info');
} else {
$this->admin->setMessage("Installation failed.", 'error');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_FAILED'), 'error');
}
$this->post = array('_redirect' => $this->view . '/' . $this->route);
@@ -709,9 +701,9 @@ class AdminController
$result = \Grav\Plugin\Admin\Gpm::selfupgrade();
if ($result) {
$this->admin->json_response = ['status' => 'success', 'message' => 'Grav was successfully updated to '];
$this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.GRAV_WAS_SUCCESSFULLY_UPDATED_TO') . ' '];
} else {
$this->admin->json_response = ['status' => 'error', 'message' => 'Grav update failed <br>' . Installer::lastErrorMsg()];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.GRAV_UPDATE_FAILED') . ' <br>' . Installer::lastErrorMsg()];
}
return true;
@@ -755,16 +747,16 @@ class AdminController
if ($this->view === 'update') {
if ($result) {
$this->admin->json_response = ['status' => 'success', 'message' => 'Everything updated'];
$this->admin->json_response = ['status' => 'success', 'message' => $this->admin->translate('PLUGIN_ADMIN.EVERYTHING_UPDATED')];
} else {
$this->admin->json_response = ['status' => 'error', 'message' => 'Updates failed'];
$this->admin->json_response = ['status' => 'error', 'message' => $this->admin->translate('PLUGIN_ADMIN.UPDATES_FAILED')];
}
} else {
if ($result) {
$this->admin->setMessage("Installation successful.", 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_SUCCESSFUL'), 'info');
} else {
$this->admin->setMessage("Installation failed.", 'error');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_FAILED'), 'error');
}
$this->post = array('_redirect' => $this->view . '/' . $this->route);
@@ -792,9 +784,9 @@ class AdminController
$result = \Grav\Plugin\Admin\Gpm::uninstall($package, []);
if ($result) {
$this->admin->setMessage("Uninstall successful.", 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_SUCCESSFUL'), 'info');
} else {
$this->admin->setMessage("Uninstall failed.", 'error');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSTALLATION_FAILED'), 'error');
}
$this->post = array('_redirect' => $this->view);
@@ -866,7 +858,7 @@ class AdminController
if ($obj) {
$obj->save(true);
$this->admin->setMessage('Successfully saved', 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_SAVED'), 'info');
}
if ($this->view != 'pages') {
@@ -970,7 +962,7 @@ class AdminController
$page->save();
// Enqueue message and redirect to new location.
$this->admin->setMessage('Successfully copied', 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_COPIED'), 'info');
$this->setRedirect($this->view . '/' . $parent->route() . '/'. $page->slug());
} catch (\Exception $e) {
@@ -996,7 +988,7 @@ class AdminController
return false;
}
$this->admin->setMessage('Reordering was successful', 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.REORDERING_WAS_SUCCESSFUL'), 'info');
return true;
}
@@ -1032,7 +1024,7 @@ class AdminController
$redirect = 'pages';
}
$this->admin->setMessage('Successfully deleted', 'info');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_DELETED'), 'info');
$this->setRedirect($redirect);
} catch (\Exception $e) {
@@ -1042,6 +1034,21 @@ class AdminController
return true;
}
protected function taskSwitchlanguage() {
$language = $this->grav['uri']->param('lang');
if ($language) {
$this->grav['session']->admin_lang = $language ?: 'en';
}
$redirect = 'pages';
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.SUCCESSFULLY_SWITCHED_LANGUAGE'), 'info');
$this->setRedirect($redirect);
return true;
}
/**
* Prepare and return POST data.
*
@@ -1155,7 +1162,12 @@ class AdminController
if (isset($input['type']) && !empty($input['type'])) {
$type = (string) strtolower($input['type']);
$name = preg_replace('|.*/|', '', $type) . '.md';
$name = preg_replace('|.*/|', '', $type);
$language = $this->grav['language'];
if ($language->enabled()) {
$name .= '.' . $language->getLanguage();
}
$name .= '.md';
$page->name($name);
$page->template($type);
}
@@ -1213,9 +1225,9 @@ class AdminController
{
if (!$this->admin->authorise($permissions)) {
if ($this->grav['uri']->extension() === 'json')
$this->admin->json_response = ['status' => 'unauthorized', 'message' => 'You have insufficient permissions for task ' . $task . '.'];
$this->admin->json_response = ['status' => 'unauthorized', 'message' => $this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') . ' ' . $task . '.'];
else
$this->admin->setMessage('You have insufficient permissions for task ' . $task . '.', 'error');
$this->admin->setMessage($this->admin->translate('PLUGIN_ADMIN.INSUFFICIENT_PERMISSIONS_FOR_TASK') . ' ' . $task . '.', 'error');
return false;
}

View File

@@ -118,7 +118,7 @@ class Popularity
$data = array();
foreach ($chart_data as $date => $count) {
$labels[] = date('D', strtotime($date));
$labels[] = self::getGrav()['grav']['admin']->translate(['PLUGIN_ADMIN.' . strtoupper(date('D', strtotime($date)))]);
$data[] = $count;
}

View File

@@ -1,29 +1,424 @@
en:
ADMIN_BETA_MSG: This is a Beta release! Use this in production at your own risk...
ADMIN_REPORT_ISSUE: Found an issue? Please report it on GitHub.
EMAIL_FOOTER: <a href="http://getgrav.org">Powered by Grav</a> - The Modern Flat File CMS
LOGIN_BTN: Login
LOGIN_BTN_FORGOT: Forgot
LOGIN_BTN_RESET: Reset Password
LOGIN_BTN_SEND_INSTRUCTIONS: Send Reset Instructions
LOGIN_LOGGED_IN: You have been successfully logged in
LOGIN_FAILED: Login failed
LOGGED_OUT: You have been logged out
RESET_LINK_EXPIRED: Reset link has expired, please try again
RESET_PASSWORD_RESET: Password has been reset
RESET_INVALID_LINK: Invalid reset link used, please try again
FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: Instructions to reset your password have been sent via email to %s
FORGOT_FAILED_TO_EMAIL: Failed to email instructions, please try again later
FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: Cannot reset password for %s, no email address is set
FORGOT_USERNAME_DOES_NOT_EXIST: User with username <b>%s</b> does not exist
FORGOT_EMAIL_NOT_CONFIGURED: Cannot reset password. This site is not configured to send emails
FORGOT_EMAIL_SUBJECT: %s Password Reset Request
FORGOT_EMAIL_BODY: <h1>Password Reset</h1><p>Dear %1$s,</p><p>A request was made on <b>%4$s</b> to reset your password.</p><p><br /><a href="%2$s" class="btn-primary">Click this to reset your password</a><br /><br /></p><p>Alternatively, copy the following URL into your browser's address bar:</p> <p>%2$s</p><p><br />Kind regards,<br /><br />%3$s</p>
PLUGIN_ADMIN:
ADMIN_BETA_MSG: This is a Beta release! Use this in production at your own risk...
ADMIN_REPORT_ISSUE: Found an issue? Please report it on GitHub.
EMAIL_FOOTER: <a href="http://getgrav.org">Powered by Grav</a> - The Modern Flat File CMS
LOGIN_BTN: Login
LOGIN_BTN_FORGOT: Forgot
LOGIN_BTN_RESET: Reset Password
LOGIN_BTN_SEND_INSTRUCTIONS: Send Reset Instructions
LOGIN_LOGGED_IN: You have been successfully logged in
LOGIN_FAILED: Login failed
LOGGED_OUT: You have been logged out
RESET_LINK_EXPIRED: Reset link has expired, please try again
RESET_PASSWORD_RESET: Password has been reset
RESET_INVALID_LINK: Invalid reset link used, please try again
FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: Instructions to reset your password have been sent via email to %s
FORGOT_FAILED_TO_EMAIL: Failed to email instructions, please try again later
FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: Cannot reset password for %s, no email address is set
FORGOT_USERNAME_DOES_NOT_EXIST: User with username <b>%s</b> does not exist
FORGOT_EMAIL_NOT_CONFIGURED: Cannot reset password. This site is not configured to send emails
FORGOT_EMAIL_SUBJECT: %s Password Reset Request
FORGOT_EMAIL_BODY: <h1>Password Reset</h1><p>Dear %1$s,</p><p>A request was made on <b>%4$s</b> to reset your password.</p><p><br /><a href="%2$s" class="btn-primary">Click this to reset your password</a><br /><br /></p><p>Alternatively, copy the following URL into your browser's address bar:</p> <p>%2$s</p><p><br />Kind regards,<br /><br />%3$s</p>
MANAGE_PAGES: Manage Pages
CONFIGURATION: Configuration
PAGES: Pages
PLUGINS: Plugins
PLUGIN: Plugin
THEMES: Themes
LOGOUT: Logout
BACK: Back
ADD_PAGE: Add Page
ADD_MODULAR: Add Modular
MOVE: Move
DELETE: Delete
SAVE: Save
NORMAL: Normal
EXPERT: Expert
EXPAND_ALL: Expand All
COLLAPSE_ALL: Collapse All
ERROR: Error
CLOSE: Close
CANCEL: Cancel
CONTINUE: Continue
MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_TITLE: Confirmation Required
MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_DESC: Are you sure you want to delete this page and all it's children? This action cannot be undone.
MODAL_CHANGED_DETECTED_TITLE: Changes Detected
MODAL_CHANGED_DETECTED_DESC: You have unsaved changes. Are you sure you want to leave without saving?
MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE: Confirmation Required
MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC: Are you sure you want to delete this file? This action cannot be undone.
ADD_FILTERS: Add Filters
SEARCH_PAGES: Search Pages
VERSION: Version
WAS_MADE_WITH: Was made with
BY: By
UPDATE_THEME: Update Theme
UPDATE_PLUGIN: Update Plugin
OF_THIS_THEME_IS_NOW_AVAILABLE: of this theme is now available
OF_THIS_PLUGIN_IS_NOW_AVAILABLE: of this plugin is now available
VERSION: Version
AUTHOR: Author
HOMEPAGE: Homepage
DEMO: Demo
BUG_TRACKER: Bug Tracker
KEYWORDS: Keywords
LICENCE: Licence
DESCRIPTION: Description
README: Readme
REMOVE_THEME: Remove Theme
INSTALL_THEME: Install Theme
THEME: Theme
BACK_TO_THEMES: Back to Themes
BACK_TO_PLUGINS: Back to Plugins
CHECK_FOR_UPDATES: Check for Updates
ADD: Add
CLEAR_CACHE: Clear Cache
CLEAR_CACHE_ALL_CACHE: All Cache
CLEAR_CACHE_ASSETS_ONLY: Assets Only
CLEAR_CACHE_IMAGES_ONLY: Images Only
CLEAR_CACHE_CACHE_ONLY: Cache Only
CHECK_FOR_UPDATES: Check for Updates
DASHBOARD: Dashboard
UPDATES_AVAILABLE: Updates Available
DAYS: Days
UPDATE: Update
BACKUP: Backup
STATISTICS: Statistics
TODAY: Today
WEEK: Week
MONTH: Month
LATEST_PAGE_UPDATES: Latest Page Updates
MAINTENANCE: Maintenance
UPDATED: Updated
MON: Mon
TUE: Tue
WED: Wed
THU: Thu
FRI: Fri
SAT: Sat
SUN: Sun
COPY: Copy
EDIT: Edit
CREATE: Create
GRAV_ADMIN: Grav Admin
GRAV_OFFICIAL_PLUGIN: Grav Official Plugin
GRAV_OFFICIAL_THEME: Grav Official Theme
PLUGIN_SYMBOLICALLY_LINKED: This plugin is symbolically linked. Updates won't be detected.
THEME_SYMBOLICALLY_LINKED: This theme is symbolically linked. Updates won't be detected
REMOVE_PLUGIN: Remove Plugin
INSTALL_PLUGIN: Install Plugin
AVAILABLE: Available
INSTALLED: Installed
INSTALL: Install
ACTIVE_THEME: Active Theme
SWITCHING_TO: Switching to
SWITCHING_TO_DESCRIPTION: By switching to a different theme, there is no guarantee that all the layout pages are supported, potentially causing errors when trying to load said pages.
SWITCHING_TO_CONFIRMATION: Do you want to continue and switch to the theme
CREATE_NEW_USER: Create New User
REMOVE_USER: Remove User
ACCESS_DENIED: Access denied
ACCOUNT_NOT_ADMIN: your account does not have administrator permissions
PHP_INFO: PHP Info
INSTALLER: Installer
AVAILABLE_THEMES: Available Themes
AVAILABLE_PLUGINS: Available Plugins
INSTALLED_THEMES: Installed Themes
INSTALLED_PLUGINS: Installed Plugins
BROWSE_ERROR_LOGS: Browse Error Logs
SITE: Site
INFO: Info
SYSTEM: System
USER: User
ADD_ACCOUNT: Add Account
SWITCH_LANGUAGE: Switch Language
SUCCESSFULLY_ENABLED_PLUGIN: Successfully enabled plugin
SUCCESSFULLY_DISABLED_PLUGIN: Successfully disabled plugin
SUCCESSFULLY_CHANGED_THEME: Successfully changed default theme
INSTALLATION_FAILED: Installation failed
INSTALLATION_SUCCESSFUL: Installation successful
SUCCESSFULLY_SAVED: Successfully saved
SUCCESSFULLY_COPIED: Successfully copied
REORDERING_WAS_SUCCESSFUL: Reordering was successful
SUCCESSFULLY_DELETED: Successfully deleted
SUCCESSFULLY_SWITCHED_LANGUAGE: Successfully switched language
INSUFFICIENT_PERMISSIONS_FOR_TASK: You have insufficient permissions for task
CACHE_CLEARED: Cache cleared
METHOD: Method
ERROR_CLEARING_CACHE: Error clearing cache
AN_ERROR_OCCURRED: An error occurred
YOUR_BACKUP_IS_READY_FOR_DOWNLOAD: Your backup is ready for download
DOWNLOAD_BACKUP: Download backup
PAGES_FILTERED: Pages filtered
NO_PAGE_FOUND: No Page found
INVALID_PARAMETERS: Invalid Parameters
NO_FILES_SENT: No files sent
EXCEEDED_FILESIZE_LIMIT: Exceeded filesize limit
UNKNOWN_ERRORS: Unkown errors
EXCEEDED_GRAV_FILESIZSE_LIMIT: Exceeded Grav filesize limit.
UNSUPPORTED_FILE_TYPE: Unsupported file type
FAILED_TO_MOVE_UPLOADED_FILE: Failed to move uploaded file.
FILE_UPLOADED_SUCCESSFULLY: File uploaded successfully
FILE_DELETED: File deleted
FILE_COULD_NOT_BE_DELETED: File could not be deleted
FILE_NOT_FOUND: File not found
NO_FILE_FOUND: No file found
GRAV_WAS_SUCCESSFULLY_UPDATED_TO: Grav was successfully updated to
GRAV_UPDATE_FAILED: Grav update failed
EVERYTHING_UPDATED: Everything updated
UPDATES_FAILED: Updates failed
AVATAR_BY: Avatar by
LAST_BACKUP: Last Backup
FULL_NAME: Full name
USERNAME: Username
EMAIL: Email
PASSWORD: Password
TITLE: Title
LANGUAGE: Language
ACCOUNT: Account
EMAIL_VALIDATION_MESSAGE: Must be a valid email address
PASSWORD_VALIDATION_MESSAGE: Password must contain at least one number and one uppercase and lowercase letter, and at least 8 or more characters
LANGUAGE_HELP: Set the favorite language
ADD_ACCOUNT: Add Account
MEDIA: Media
SITE: Site
DEFAULTS: Defaults
SITE_TITLE: Site Title
SITE_TITLE_PLACEHOLDER: Site wide title
SITE_TITLE_HELP: Default title for your site, often used in themes
DEFAULT_AUTHOR: Default Author
DEFAULT_AUTHOR_HELP: "A default author name, often used in themes or page content"
DEFAULT_EMAIL: Default Email
DEFAULT_EMAIL_HELP: "A default email to reference in themes or pages"
TAXONOMY_TYPES: Taxonomy Types
TAXONOMY_TYPES_HELP: "Taxonomy types must be defined here if you wish to use them in pages"
PAGE_SUMMARY: Page Summary
ENABLED: Enabled
ENABLED_HELP: "Enable page summary (the summary returns the same as the page content)"
YES: Yes
NO: No
SUMMARY_SIZE: Summary Size
SUMMARY_SIZE_HELP: "The amount of characters of a page to use as a content summary"
FORMAT: Format
FORMAT_HELP: short = use the first occurrence of delimiter or size; long = summary delimiter will be ignored
SHORT: Short
LONG: Long
DELIMITER: Delimiter
DELIMITER_HELP: "The summary delimiter (default '===')"
METADATA: Metadata
METADATA_HELP: "Default metadata values that will be displayed on every page unless overridden by the page"
NAME: Name
CONTENT: Content
REDIRECTS_AND_ROUTES: Redirects & Routes
CUSTOM_REDIRECTS: Custom Redirects
CUSTOM_REDIRECTS_HELP: "routes to redirect to other pages. Standard Regex replacement is valid"
CUSTOM_REDIRECTS_PLACEHOLDER_KEY: /your/alias
CUSTOM_REDIRECTS_PLACEHOLDER_VALUE: /your/redirect
CUSTOM_ROUTES: Custom Routes
CUSTOM_ROUTES_HELP: "routes to alias to other pages. Standard Regex replacement is valid"
CUSTOM_ROUTES_PLACEHOLDER_KEY: /your/alias
CUSTOM_ROUTES_PLACEHOLDER_VALUE: /your/route
FILE_STREAMS: File Streams
DEFAULT: Default
TITLE: Title
PAGE_MEDIA: Page Media
OPTIONS: Options
PUBLISHED: Published
PUBLISHED_HELP: "By default, a page is published unless you explicitly set published: false or via a publish_date being in the future, or unpublish_date in the past"
DATE: Date
DATE_HELP: "The date variable allows you to specifically set a date associated with this page."
PUBLISHED_DATE: Published Date
PUBLISHED_DATE_HELP: "Can provide a date to automatically trigger publication."
UNPUBLISHED_DATE: Unpublished Date
UNPUBLISHED_DATE_HELP: "can provide a date to automatically trigger un-publication."
ROBOTS: Robots
TAXONOMIES: Taxonomies
TAXONOMY: Taxonomy
ADVANCED: Advanced
SETTINGS: Settings
FOLDER_NUMERIC_PREFIX: Folder Numeric Prefix
FOLDER_NUMERIC_PREFIX_HELP: Numeric prefix that provides manual ordering and implies visibility
FOLDER_NAME: Folder Name
FOLDER_NAME_HELP: "The folder name that will be stored in the filesystem for this page"
PARENT: Parent
DEFAULT_OPTION_ROOT: '- Root -'
DEFAULT_OPTION_SELECT: '- Select -'
DISPLAY_TEMPLATE: Display Template
DISPLAY_TEMPLATE_HELP: "The page type that translates into which twig template renders the page"
BODY_CLASSES: Body Classes
ORDERING: Ordering
PAGE_ORDER: Page Order
OVERRIDES: Overrides
MENU: Menu
MENU_HELP: "The string to be used in a menu. If not set, <b>Title</b> will be used."
SLUG: Slug
SLUG_HELP: "The slug variable allows you to specifically set the page's portion of the URL"
SLUG_VALIDATE_MESSAGE: A slug must contain only lowercase alphanumeric characters and dashes
PROCESS: Process
PROCESS_HELP: "Control how pages are processed. Can be set per-page rather than globally"
DEFAULT_CHILD_TYPE: Default Child Type
USE_GLOBAL: Use Global
ROUTABLE: Routable
ROUTABLE_HELP: If this page is reachable by a URL
CACHING: Caching
VISIBLE: Visible
VISIBLE_HELP: "Determines if a page is visible in the navigation."
DISABLED: Disabled
ITEMS: Items
ORDER_BY: Order By
FOLDER: Folder
TITLE: Title
DATE: Date
DEFAULT: Default
ORDER: Order
ASCENDING: Ascending
DESCENDING: Descending
ADD_MODULAR_CONTENT: Add Modular Content
PAGE_TITLE: Page Title
PAGE_TITLE_HELP: "The title of the page"
PAGE: Page
MODULAR_TEMPLATE: Modular Template
FRONTMATTER: Frontmatter
FILENAME: Filename
PARENT_PAGE: Parent Page
HOME_PAGE: Home page
HOME_PAGE_HELP: "The page that Grav will use as the default landing page"
DEFAULT_THEME: Default theme
DEFAULT_THEME_HELP: "Set the default theme for Grav to use (default is Antimatter)"
TIMEZONE: Timezone
TIMEZONE_HELP: "Override the default timezone the server"
SHORT_DATE_FORMAT: Short date format
SHORT_DATE_FORMAT_HELP: "Set the short date format that can be used by themes"
LONG_DATE_FORMAT: Long date format
LONG_DATE_FORMAT_HELP: "Set the long date format that can be used by themes"
DEFAULT_ORDERING: Default ordering
DEFAULT_ORDERING_HELP: "Pages in a list will render using this order unless it is overridden"
DEFAULT_ORDERING_DEFAULT: Default - based on folder name
DEFAULT_ORDERING_FOLDER: Folder - based on prefix-less folder name
DEFAULT_ORDERING_TITLE: Title - based on title field in header
DEFAULT_ORDERING_DATE: Date - based on date field in header
DEFAULT_ORDER_DIRECTION: Default order direction
DEFAULT_ORDER_DIRECTION_HELP: "The direction of pages in a list"
DEFAULT_PAGE_COUNT: Default page count
DEFAULT_PAGE_COUNT_HELP: "Default maximum pages count in a list"
DATE_BASED_PUBLISHING: Date-based publishing
DATE_BASED_PUBLISHING_HELP: "Automatically (un)publish posts based on their date"
EVENTS: Events
EVENTS_HELP: "Enable or Disable specific events. Disabling these can break plugins"
REDIRECT_DEFAULT_ROUTE: Redirect default route
REDIRECT_DEFAULT_ROUTE_HELP: "Automatically redirect to a page's default route"
LANGUAGES: Languages
SUPPORTED: Supported
SUPPORTED_HELP: "Comma separated list of 2 letter language codes (for example 'en,fr,de')"
TRANSLATIONS_ENABLED: Translations enabled
TRANSLATIONS_ENABLED_HELP: "Support translations in Grav, plugins and extensions"
TRANSLATIONS_FALLBACK: Translations fallback
TRANSLATIONS_FALLBACK_HELP: "Fallback through supported translations if active language doesn't exist"
ACTIVE_LANGUAGE_IN_SESSION: Active language in session
ACTIVE_LANGUAGE_IN_SESSION_HELP: "Store the active language in the session"
HOME_REDIRECT_INCLUDE_LANGUAGE: Home redirect include language
HOME_REDIRECT_INCLUDE_LANGUAGE_HELP : "Include language in home redirect (/en)"
HOME_REDIRECT_INCLUDE_ROUTE: Home redirect include route
HOME_REDIRECT_INCLUDE_ROUTE: "Include route in home redirect (/blog)"
HTTP_HEADERS: HTTP Headers
EXPIRES: Expires
EXPIRES_HELP: "Sets the expires header. The value is in seconds."
LAST_MODIFIED: Last modified
LAST_MODIFIED_HELP: "Sets the last modified header that can help optimize proxy and browser caching"
ETAG: ETag
ETAG_HELP: "Sets the etag header to help identify when a page has been modified"
VARY_ACCEPT_ENCODING: Vary accept encoding
VARY_ACCEPT_ENCODING_HELP: "Sets the `Vary: Accept Encoding` header to help with proxy and CDN caching"
MARKDOWN_EXTRA_HELP: "Enable default support for Markdown Extra - https://michelf.ca/projects/php-markdown/extra/"
AUTO_LINE_BREAKS: Auto line breaks
AUTO_LINE_BREAKS_HELP: "Enable support for automatic line breaks in markdown"
AUTO_URL_LINKS: Auto URL links
AUTO_URL_LINKS_HELP: "Enable automatic conversion of URLs into HTML hyperlinks"
ESCAPE_MARKUP: Escape markup
ESCAPE_MARKUP_HELP: "Escape markup tags into HTML entities"
CACHING_HELP: "Global ON/OFF switch to enable/disable Grav caching"
CACHE_CHECK_METHOD: Cache check method
CACHE_CHECK_METHOD: "Select the method that Grav uses to check if page files have been modified."
CACHE_DRIVER: Cache driver
CACHE_DRIVER_HELP: "Choose which cache driver Grav should use. 'Auto Detect' attempts to find the best for you"
CACHE_PREFIX: Cache prefix
CACHE_PREFIX_HELP: "An identifier for part of the Grav key. Don't change unless you know what your doing."
CACHE_PREFIX_PLACEHOLDER: "Derived from base URL (override by entering random string)"
LIFETIME: Lifetime
LIFETIME_HELP: "Sets the cache lifetime in seconds. 0 = infinite"
GZIP_COMPRESSION: Gzip compression
GZIP_COMPRESSION_HELP: "Enable GZip compression of the Grav page for increased performance."
TWIG_TEMPLATING: Twig Templating
TWIG_CACHING: Twig caching
TWIG_CACHING_HELP: "Control the Twig caching mechanism. Leave this enabled for best performance."
TWIG_DEBUG: Twig debug
TWIG_DEBUG_HELP: "Allows the option of not loading the Twig Debugger extension"
DETECT_CHANGES: Detect changes
DETECT_CHANGES_HELP: "Twig will automatically recompile the Twig cache if it detects any changes in Twig templates"
AUTOESCAPE_VARIABLES: Autoescape variables
AUTOESCAPE_VARIABLES_HELP: "Autoescapes all variables. This will break your site most likely"
ASSETS: Assets
CSS_PIPELINE: CSS pipeline
CSS_PIPELINE_HELP: "The CSS pipeline is the unification of multiple CSS resources into one file"
CSS_MINIFY: CSS minify
CSS_MINIFY_HELP: "Minify the CSS during pipelining"
CSS_MINIFY_WINDOWS_OVERRIDE: CSS minify Windows override
CSS_MINIFY_WINDOWS_OVERRIDE_HELP: "Minify Override for Windows platforms. False by default due to ThreadStackSize"
CSS_REWRITE: CSS rewrite
CSS_REWRITE_HELP: "Rewrite any CSS relative URLs during pipelining"
JAVASCRIPT_PIPELINE: JavaScript pipeline
JAVASCRIPT_PIPELINE_HELP: "The JS pipeline is the unification of multiple JS resources into one file"
JAVASCRIPT_MINIFY: JavaScript minify
JAVASCRIPT_MINIFY_HELP: "Minify the JS during pipelining"
ENABLED_TIMESTAMPS_ON_ASSETS: Enable timestamps on assets
ENABLED_TIMESTAMPS_ON_ASSETS_HELP: "Enable asset timestamps"
COLLECTIONS: Collections
ERROR_HANDLER: Error handler
DISPLAY_ERRORS: Display errors
DISPLAY_ERRORS_HELP: "Display full backtrace-style error page"
LOG_ERRORS: Log errors
LOG_ERRORS_HELP: "Log errors to /logs folder"
DEBUGGER: Debugger
DEBUGGER_HELP: "Enable Grav debugger and following settings"
DEBUG_TWIG: Debug Twig
DEBUG_TWIG_HELP: "Enable debugging of Twig templates"
SHUTDOWN_CLOSE_CONNECTION: Shutdown close connection
SHUTDOWN_CLOSE_CONNECTION_HELP: "Close the connection before calling onShutdown(). false for debugging"
DEFAULT_IMAGE_QUALITY: Default image quality
DEFAULT_IMAGE_QUALITY_HELP: "Default image quality to use when resampling or caching images (85%)"
CACHE_ALL: Cache all images
CACHE_ALL_HELP: "Run all images through Grav's cache system even if they have no media manipulations"
IMAGES_DEBUG: Image debug watermark
IMAGES_DEBUG_HELP: "Show an overlay over images indicating the pixel depth of the image when working with retina for example"
UPLOAD_LIMIT: File upload limit
UPLOAD_LIMIT_HELP: "Set maximum upload size in bytes (0 is unlimited)"
ENABLE_MEDIA_TIMESTAMP: Enable timestamps on media
ENABLE_MEDIA_TIMESTAMP_HELP: "Appends a timestamp based on last modified date to each media item"
SESSION: Session
SESSION_ENABLED_HELP: "Enable session support within Grav"
TIMEOUT: Timeout
TIMEOUT_HELP: "Sets the session timeout in seconds"
SESSION_NAME_HELP: "An identifier used to form the name of the session cookie"
ABSOLUTE_URLS: Absolute URLs
ABSOLUTE_URLS_HELP: "Absolute or relative URLs for `base_url`"
PARAMETER_SEPARATOR: Parameter separator
PARAMETER_SEPARATOR_HELP: "Separater for passed parameters that can be changed for Apache on Windows"
TASK_COMPLETED: Task completed
EVERYTHING_UP_TO_DATE: Everything is up to date
UPDATES_ARE_AVAILABLE: updates are available
IS_AVAILABLE_FOR_UPDATE: is available for update
IS_NOW_AVAILABLE: is now available
CURRENT: Current
UPDATE_GRAV_NOW: Update Grav Now
GRAV_SYMBOLICALLY_LINKED: Grav is symbolically linked. Upgrade won\'t be available
UPDATING_PLEASE_WAIT: Updating... please wait, downloading
OF_THIS: of this
OF_YOUR: of your
HAVE_AN_UPDATE_AVAILABLE: have an update available
es:
ADMIN_BETA_MSG: ¡Está es una versión Beta! Utilízala bajo tu propio riesgo...
ADMIN_REPORT_ISSUE: ¿Encontraste algún problema de funcionamiento? Por favor, repórtalo en GitHub.
EMAIL_FOOTER: <a href="http://getgrav.org">Funcionando con Grav</a> - El CMS de archivos planos moderno
EMAIL_FOOTER: <a href="http://getgrav.org">Funcionando con Grav</a> - El CMS de archivos planos moderno
LOGIN_BTN: Login
LOGIN_BTN_FORGOT: Me olvidé
LOGIN_BTN_RESET: Restablecer contraseña
@@ -43,23 +438,216 @@ es:
FORGOT_EMAIL_BODY: <h1>Restablecimiento de contraseña</h1><p>Estimado %1$s,</p><p>Se ha realizado una petición el <b>%4$s</b> para restablecer tu contraseña.</p><p><br /><a href="%2$s" class="btn-primary">Pincha aquí para restablecer tu contraseña</a><br /><br /></p><p>Alternativamente, copia la siguiente URL en la barra de direcciones de tu navegador:</p> <p>%2$s</p><p><br />Atentamente,<br /><br />%3$s</p>
it:
ADMIN_BETA_MSG: Questa è una versione beta! Usare in produzione a proprio rischio e pericolo…
ADMIN_REPORT_ISSUE: Trovato un problema? Per favore, apri un ticket su GitHub
EMAIL_FOOTER: <a href="http://getgrav.org">Powered by Grav</a> - The Modern Flat File CMS
LOGIN_BTN: Login
LOGIN_BTN_FORGOT: Reset password
LOGIN_BTN_RESET: Resetta la password
LOGIN_BTN_SEND_INSTRUCTIONS: Invia istruzioni di reset
LOGIN_LOGGED_IN: Login effettuato con successo
LOGIN_FAILED: Login fallito
LOGGED_OUT: Sei stato disconnesso
RESET_LINK_EXPIRED: Il link di reset è scaduto, ritenta per favore
RESET_PASSWORD_RESET: La password è stata resettata
RESET_INVALID_LINK: Il link di reset non è valido, ritenta per favore
FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: Le istruzioni per resettare la password sono state inviate via email a %s
FORGOT_FAILED_TO_EMAIL: Invio della email fallito, per favore ritenta più tardi
FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: Impossibile resettare la password per %s, nessun indirizzo email impostato
FORGOT_USERNAME_DOES_NOT_EXIST: L'utente con username <b>%s</b> non esiste
FORGOT_EMAIL_NOT_CONFIGURED: Impossibile resettare la password. Il sito non è configurato per inviare email
FORGOT_EMAIL_SUBJECT: %s Richiesta di reset password
FORGOT_EMAIL_BODY: <h1>Reset password</h1><p>Caro %1$s,</p><p>Una richiesta di reset password è stata effettuata su <b>%4$s</b>.</p><p><br /><a href="%2$s" class="btn-primary">Clicca qui per resettare la tua password</a><br /><br /></p><p>In alternativa, copia il seguente URL nella barra indirizzi del tuo browser:</p> <p>%2$s</p><p><br />Cordiali saluti,<br /><br />%3$s</p>
PLUGIN_ADMIN:
ADMIN_BETA_MSG: Questa è una versione beta! Usare in produzione a proprio rischio e pericolo…
ADMIN_REPORT_ISSUE: Trovato un problema? Per favore, apri un ticket su GitHub
EMAIL_FOOTER: <a href="http://getgrav.org">Powered by Grav</a> - The Modern Flat File CMS
LOGIN_BTN_SEND_INSTRUCTIONS: Invia istruzioni di reset
LOGIN_LOGGED_IN: Login effettuato con successo
LOGIN_FAILED: Login fallito
LOGGED_OUT: Sei stato disconnesso
RESET_LINK_EXPIRED: Il link di reset è scaduto, ritenta per favore
RESET_PASSWORD_RESET: La password è stata resettata
RESET_INVALID_LINK: Il link di reset non è valido, ritenta per favore
FORGOT_INSTRUCTIONS_SENT_VIA_EMAIL: Le istruzioni per resettare la password sono state inviate via email a %s
FORGOT_FAILED_TO_EMAIL: Invio della email fallito, per favore ritenta più tardi
FORGOT_CANNOT_RESET_EMAIL_NO_EMAIL: Impossibile resettare la password per %s, nessun indirizzo email impostato
FORGOT_USERNAME_DOES_NOT_EXIST: L'utente con username <b>%s</b> non esiste
FORGOT_EMAIL_NOT_CONFIGURED: Impossibile resettare la password. Il sito non è configurato per inviare email
FORGOT_EMAIL_SUBJECT: %s Richiesta di reset password
FORGOT_EMAIL_BODY: <h1>Reset password</h1><p>Caro %1$s,</p><p>Una richiesta di reset password è stata effettuata su <b>%4$s</b>.</p><p><br /><a href="%2$s" class="btn-primary">Clicca qui per resettare la tua password</a><br /><br /></p><p>In alternativa, copia il seguente URL nella barra indirizzi del tuo browser:</p> <p>%2$s</p><p><br />Cordiali saluti,<br /><br />%3$s</p>
LOGIN_BTN: Login
LOGIN_BTN_FORGOT: Reset password
LOGIN_BTN_RESET: Resetta la password
MANAGE_PAGES: Gestione Pagine
CONFIGURATION: Settaggi
PAGES: Pagine
PLUGINS: Plugin
PLUGINS: Plugin
THEMES: Temi
LOGOUT: Logout
BACK: Indietro
ADD_PAGE: Aggiungi Pagina
ADD_MODULAR: Aggiungi Modular
MOVE: Sposta
DELETE: Elimina
SAVE: Salva
NORMAL: Normale
EXPERT: Esperto
EXPAND_ALL: Espandi tutto
COLLAPSE_ALL: Comprimi tutto
ERROR: Errore
CLOSE: Chiudi
CANCEL: Cancella
CONTINUE: Continua
MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_TITLE: Conferma richiesta
MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_DESC: Sicuro di voler eliminare questa pagina e tutte le sue sottopagine? Questa azione non può essere annullata.
MODAL_CHANGED_DETECTED_TITLE: Rilevate modifiche
MODAL_CHANGED_DETECTED_DESC: Vi sono cambiamenti non salvati. Sicuro di voler lasciare la pagina senza salvare?
MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE: Conferma richiesta
MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC: Sicuro di voler eliminare questo file? Questa azione non può essere annullata.
ADD_FILTERS: Aggiungi filtro
SEARCH_PAGES: Cerca pagine
VERSION: Versione
WAS_MADE_WITH: Prodotta con il
BY: Da
UPDATE_THEME: Aggiorna tema
OF_THIS_THEME_IS_NOW_AVAILABLE: di questo tema è ora disponibile
VERSION: Versione
AUTHOR: Autore
HOMEPAGE: Homepage
DEMO: Demo
BUG_TRACKER: Bug Tracker
KEYWORDS: Parole chiave
LICENCE: Licenza
DESCRIPTION: Descrizione
README: Readme
REMOVE_THEME: Rimuovo tema
INSTALL_THEME: Installa tema
THEME: Tema
BACK_TO_THEMES: Torna ai temi
BACK_TO_PLUGINS: Torna ai plugin
CHECK_FOR_UPDATES: Controlla aggiornamenti
ADD: Aggiungi
CLEAR_CACHE: Pulisci cache
CLEAR_CACHE_ALL_CACHE: Tutta la cache
CLEAR_CACHE_ASSETS_ONLY: Solo asset
CLEAR_CACHE_IMAGES_ONLY: Solo immagini
CLEAR_CACHE_CACHE_ONLY: Solo cache
CHECK_FOR_UPDATES: Controlla aggiornamenti
DASHBOARD: Dashboard
UPDATES_AVAILABLE: Aggiornamenti disponibili
DAYS: Giorni
UPDATE: Aggiorna
BACKUP: Backup
STATISTICS: Statistiche
TODAY: Oggi
WEEK: Settimana
MONTH: Mese
LATEST_PAGE_UPDATES: Ultimi aggiornamenti pagine
MAINTENANCE: Manutenzione
UPDATED: Aggiornato
MON: Lun
TUE: Mar
WED: Mer
THU: Gio
FRI: Ven
SAT: Sab
SUN: Dom
COPY: Copia
EDIT: Modifica
CREATE: Crea
GRAV_ADMIN: Grav Admin
GRAV_OFFICIAL_PLUGIN: Plugin Ufficiale Grav
GRAV_OFFICIAL_THEME: Tema Ufficiale Grav
PLUGIN_SYMBOLICALLY_LINKED: Questo plugin ha un link simbolico. Gli aggiornamenti non possono essere installati da qui
THEME_SYMBOLICALLY_LINKED: Questo tema ha un link simbolico. Gli aggiornamenti non possono essere installati da qui
REMOVE_PLUGIN: Rimuovi Plugin
INSTALL_PLUGIN: Installa Plugin
AVAILABLE: Disponibile
INSTALLED: Installato
INSTALL: Installa
ACTIVE_THEME: Tema attivo
SWITCHING_TO: Passare a
SWITCHING_TO_DESCRIPTION: Cambiando il tema, non è garantito che tutti i layout di pagina siano supportati, potenzialmente causando errori quando si tenta di caricare tali pagine.
SWITCHING_TO_CONFIRMATION: Vuoi continuare e passare al tema
CREATE_NEW_USER: Crea nuovo utente
REMOVE_USER: Rimuovi utente
ACCESS_DENIED: Accesso negato
ACCOUNT_NOT_ADMIN: il tuo account non ha permessi di amministratore
PHP_INFO: PHP Info
INSTALLER: Installazione
AVAILABLE_THEMES: Temi disponibili
AVAILABLE_PLUGINS: Plugin disponibili
INSTALLED_THEMES: Temi installati
INSTALLED_PLUGINS: Plugin installati
BROWSE_ERROR_LOGS: Vedi log errori
SITE: Sito
INFO: Info
SYSTEM: Sistema
USER: Utente
ADD_ACCOUNT: Aggiungi utente
SWITCH_LANGUAGE: Cambia lingua
SUCCESSFULLY_ENABLED_PLUGIN: Plugin abilitato con successo
SUCCESSFULLY_DISABLED_PLUGIN: Plugin disabilitato con successo
SUCCESSFULLY_CHANGED_THEME: Tema cambiato con successo
INSTALLATION_FAILED: Intallazione fallita
INSTALLATION_SUCCESSFUL: Installazione avvenuta con successo
SUCCESSFULLY_SAVED: Salvato con successo
SUCCESSFULLY_COPIED: Copiato con successo
REORDERING_WAS_SUCCESSFUL: Riordinato con successo
SUCCESSFULLY_DELETED: Eliminato con successo
SUCCESSFULLY_SWITCHED_LANGUAGE: Lingua cambiata con successo
INSUFFICIENT_PERMISSIONS_FOR_TASK: Permissi insufficenti per l'operazione
CACHE_CLEARED: Cache pulita
METHOD: Metodo
ERROR_CLEARING_CACHE: Errore nella pulizia della cache
AN_ERROR_OCCURRED: Errore rilevato
YOUR_BACKUP_IS_READY_FOR_DOWNLOAD: Il tuo backup è pronto per il download
DOWNLOAD_BACKUP: Scarica backup
PAGES_FILTERED: Pagine filtrate
NO_PAGE_FOUND: Nessuna pagina trovata
INVALID_PARAMETERS: Parametri invalidi
NO_FILES_SENT: Nessun file inviato
EXCEEDED_FILESIZE_LIMIT: Superati i limiti di dimensione file
UNKNOWN_ERRORS: Errore sconosciuto
EXCEEDED_GRAV_FILESIZE_LIMIT: Superato il limite di upload file
UNSUPPORTED_FILE_TYPE: Tipo di file non supportato
FAILED_TO_MOVE_UPLOADED_FILE: Fallito lo spostamento del file caricato
FILE_UPLOADED_SUCCESSFULLY: File caricato con successo
FILE_DELETED: File eliminato
FILE_COULD_NOT_BE_DELETED: Il file non può essere eliminato
FILE_NOT_FOUND: File non trovato
NO_FILE_FOUND: Nessun file trovato
GRAV_WAS_SUCCESSFULLY_UPDATED_TO: Grav è stato correttamente aggiornato a
GRAV_UPDATE_FAILED: Aggiornamento di Grav fallito
EVERYTHING_UPDATED: Tutto aggiornato
UPDATES_FAILED: Aggiornamento fallito
AVATAR_BY: Avatar da
LAST_BACKUP: Ultimo Backup
FULL_NAME: Nome completo
USERNAME: Nome utente
EMAIL: Email
PASSWORD: Password
TITLE: Titolo
LANGUAGE: Lingua
ACCOUNT: Account
EMAIL_VALIDATION_MESSAGE: Deve essere un indirizzo email valido
PASSWORD_VALIDATION_MESSAGE: La password deve contenere almeno un numero, una lettera maiuscola e una minuscola, ed essere lunga almeno 8 caratteri
LANGUAGE_HELP: Imposta la lingua preferita
DEFAULTS: Defaults
SITE_TITLE: Titolo del sito
SITE_TITLE_PLACEHOLDER: Titolo di tutto il sito
SITE_TITLE_HELP: Il titolo di default per il tuo sito, usato soprattutto dai temi
DEFAULT_AUTHOR: Autore predefinito
DEFAULT_AUTHOR_HELP: Un nome autore di default, usato dai temi o dal contenuto delle pagine
DEFAULT_EMAIL: Email predefinita
DEFAULT_EMAIL_HELP: Una email predefinita, usata dal tema o dalle pagine
TAXONOMY_TYPES: Tassonomie
TAXONOMY_TYPES_HELP: Le tassonomie devono essere definite qui per essere utilizzate nelle pagine
PAGE_SUMMARY: Sommario pagina
ENABLED: Abilitato
ENABLED_HELP: Abilita il sommario pagina (il sommario viene preso dal contenuto della pagina)
YES: Si
NO: No
SUMMARY_SIZE: Dimensione del sommario
SUMMARY_SIZE_HELP: Il numero di caratteri del contenuto della pagina da usare come sommario
FORMAT: Formato
FORMAT_HELP: corto = usa la prima occorrenza di un delimitatore o strings; lungo = il delimitatore di sommario verrà ignorato
SHORT: Corto
LONG: Lungo
DELIMITER: Delimitatore
DELIMITER_HELP: Il delimitatore di sommario (default '===')
METADATA: Metadata
METADATA_HELP: I valori metadata di default che saranno mostrati in ogni pagina se non vi è un override nella pagina
NAME: Nome
CONTENT: Contenuto
REDIRECTS_AND_ROUTES: Redirect & Route
CUSTOM_REDIRECTS: Redirect custom
CUSTOM_REDIRECTS_HELP: route impostate per redirigere gli alias indicati verso altre pagine. Regex accettate.
CUSTOM_REDIRECTS_PLACEHOLDER_KEY: /il-tuo/alias
CUSTOM_REDIRECTS_PLACEHOLDER_VALUE: /il-tuo/redirect
CUSTOM_ROUTES: Route custom
CUSTOM_ROUTES_HELP: route impostate per essere alias di altre pagine. Regex accettate.
CUSTOM_ROUTES_PLACEHOLDER_KEY: /il-tuo/alias
CUSTOM_ROUTES_PLACEHOLDER_VALUE: /la-tua/route

View File

@@ -737,13 +737,19 @@ form .checkboxes {
z-index: 10000; }
table,
tbody {
tbody,
thead {
display: inline-block;
width: 100%; }
.gpm-details {
width: 100%;
-webkit-box-flex: auto;
-moz-box-flex: auto;
box-flex: auto;
-webkit-flex: auto;
-moz-flex: auto;
-ms-flex: auto;
flex: auto; }
td {
@@ -907,6 +913,8 @@ tr {
color: #fff;
text-decoration: none;
background-color: #349886; }
.button-group .dropdown-menu.language-switcher a.active {
background-color: #349886; }
.open > .dropdown-menu {
display: block; }
@@ -1358,6 +1366,11 @@ tr {
left: 4px; }
.pages-list .row .hint:after, .pages-list .row [data-hint]:after {
border-radius: 2px; }
.pages-list .row .badge.lang {
background-color: gray;
color: white;
border-radius: 20%;
margin-left: 8px; }
.pages-list .page-tools {
display: inline-block;
float: right;

File diff suppressed because one or more lines are too long

View File

@@ -484,9 +484,12 @@ $(function () {
input.prop('checked', on);
input.prop('value', on ? 1 : 0);
$(this).css('opacity', on ? 1 : 0.7);
input.siblings('label').css('opacity', on ? 1 : 0.7);
$(this).parents('.form-label').siblings('.form-data').css('opacity', on ? 1 : 0.7);
});
// Thems Switcher Warning
// Themes Switcher Warning
$(document).on('mousedown', '[data-remodal-target="theme-switch-warn"]', function(e){
var name = $(e.target).closest('[data-gpm-theme]').find('.gpm-name a').text(),
remodal = $('.remodal.theme-switcher');

View File

@@ -100,6 +100,12 @@
background-color: $secondary-accent-bg;
}
}
&.language-switcher {
a.active {
background-color: #349886
}
}
}
}
@@ -114,4 +120,4 @@
bottom: 0;
left: 0;
z-index: 990;
}
}

View File

@@ -43,6 +43,13 @@
.hint:after, [data-hint]:after {
border-radius: 2px;
}
.badge.lang {
background-color: gray;
color: white;
border-radius: 20%;
margin-left: 8px;
}
}
.page-tools {

View File

@@ -1,13 +1,13 @@
table,
tbody {
tbody,
thead {
display: inline-block;
width: 100%;
}
.gpm-details {
width: 100%;
-webkit-flex: auto;
flex: auto;
@include flex(auto);
}
td {

View File

@@ -3,20 +3,20 @@
{% block titlebar %}
<div class="button-bar">
<div class="button-group">
<button data-clear-cache="{{ base_url_relative }}/cache.json/task{{ config.system.param_sep }}clearCache" class="button"><i class="fa fa-trash"></i> Clear Cache</button>
<button data-clear-cache="{{ base_url_relative }}/cache.json/task{{ config.system.param_sep }}clearCache" class="button"><i class="fa fa-trash"></i> {{ "PLUGIN_ADMIN.CLEAR_CACHE"|tu }}</button>
<button type="button" class="button dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-caret-down"></i>
</button>
<ul class="dropdown-menu">
<li><a data-clear-cache="{{ base_url_relative }}/cache.json/task{{ config.system.param_sep }}clearCache/cleartype:all" href="#">All Cache</a></li>
<li><a data-clear-cache="{{ base_url_relative }}/cache.json/task{{ config.system.param_sep }}clearCache/cleartype:assets-only" href="#">Assets Only</a></li>
<li><a data-clear-cache="{{ base_url_relative }}/cache.json/task{{ config.system.param_sep }}clearCache/cleartype:images-only" href="#">Images Only</a></li>
<li><a data-clear-cache="{{ base_url_relative }}/cache.json/task{{ config.system.param_sep }}clearCache/cleartype:cache-only" href="#">Cache Only</a></li>
<li><a data-clear-cache="{{ base_url_relative }}/cache.json/task{{ config.system.param_sep }}clearCache/cleartype:all" href="#">{{ "PLUGIN_ADMIN.CLEAR_CACHE_ALL_CACHE"|tu }}</a></li>
<li><a data-clear-cache="{{ base_url_relative }}/cache.json/task{{ config.system.param_sep }}clearCache/cleartype:assets-only" href="#">{{ "PLUGIN_ADMIN.CLEAR_CACHE_ASSETS_ONLY"|tu }}</a></li>
<li><a data-clear-cache="{{ base_url_relative }}/cache.json/task{{ config.system.param_sep }}clearCache/cleartype:images-only" href="#">{{ "PLUGIN_ADMIN.CLEAR_CACHE_IMAGES_ONLY"|tu }}</a></li>
<li><a data-clear-cache="{{ base_url_relative }}/cache.json/task{{ config.system.param_sep }}clearCache/cleartype:cache-only" href="#">{{ "PLUGIN_ADMIN.CLEAR_CACHE_CACHE_ONLY"|tu }}</a></li>
</ul>
</div>
<button data-gpm-checkupdates="" class="button"><i class="fa fa-refresh"></i> Check for Updates</button>
<button data-gpm-checkupdates="" class="button"><i class="fa fa-refresh"></i> {{ "PLUGIN_ADMIN.CHECK_FOR_UPDATES"|tu }}</button>
</div>
<h1><i class="fa fa-fw fa-th"></i> Dashboard</h1>
<h1><i class="fa fa-fw fa-th"></i> {{ "PLUGIN_ADMIN.DASHBOARD"|tu }}</h1>
{% endblock %}
{% block messages %}{% endblock %}
@@ -30,14 +30,14 @@
<div id="admin-dashboard">
<div id="updates" class="dashboard-item dashboard-left">
<div class="tertiary-accent default-box-shadow">
<h1>Maintenance</h1>
<h1>{{ "PLUGIN_ADMIN.MAINTENANCE"|tu }}</h1>
<div class="admin-update-charts">
<div class="updates-chart">
<div class="chart-wrapper">
<div class="ct-chart"></div>
<span class="numeric"><span>-</span><em>updated</em></span>
<span class="numeric"><span>-</span><em>{{ "PLUGIN_ADMIN.UPDATED"|tu|lower }}</em></span>
</div>
<p>Updates Available</p>
<p>{{ "PLUGIN_ADMIN.UPDATES_AVAILABLE"|tu }}</p>
</div>
<div class="backups-chart">
<div class="chart-wrapper">
@@ -56,20 +56,20 @@
};
Chartist.Pie('.backups-chart .ct-chart', data, options);
</script>
<span class="numeric">{{ backup.days }}<em>days</em></span>
<span class="numeric">{{ backup.days }}<em>{{ "PLUGIN_ADMIN.DAYS"|tu|lower }}</em></span>
</div>
<p>Last Backup</p>
<p>{{ "PLUGIN_ADMIN.LAST_BACKUP"|tu }}</p>
</div>
</div>
<div class="flush-bottom button-bar">
<button data-maintenance-update="{{ base_url_relative }}/update.json/task{{ config.system.param_sep }}update" class="button"><i class="fa fa-cloud-download"></i> Update</button>
<button data-ajax="{{ base_url_relative }}/backup.json/task{{ config.system.param_sep }}backup" class="button"><i class="fa fa-database"></i> Backup</button>
<button data-maintenance-update="{{ base_url_relative }}/update.json/task{{ config.system.param_sep }}update" class="button"><i class="fa fa-cloud-download"></i> {{ "PLUGIN_ADMIN.UPDATE"|tu }}</button>
<button data-ajax="{{ base_url_relative }}/backup.json/task{{ config.system.param_sep }}backup" class="button"><i class="fa fa-database"></i> {{ "PLUGIN_ADMIN.BACKUP"|tu }}</button>
</div>
</div>
</div>
<div id="popularity" class="dashboard-item dashboard-right">
<div class="secondary-accent default-box-shadow">
<h1>Statistics</h1>
<h1>{{ "PLUGIN_ADMIN.STATISTICS"|tu }}</h1>
<div class="ct-chart"></div>
<script>
var data = {
@@ -105,15 +105,15 @@
<div class="flush-bottom button-bar stats-bar">
<span class="stat">
<b>{{ popularity.getDailyTotal }}</b>
<i>Today</i>
<i>{{ "PLUGIN_ADMIN.TODAY"|tu }}</i>
</span>
<span class="stat">
<b>{{ popularity.getWeeklyTotal }}</b>
<i>Week</i>
<i>{{ "PLUGIN_ADMIN.WEEK"|tu }}</i>
</span>
<span class="stat">
<b>{{ popularity.getMonthlyTotal }}</b>
<i>Month</i>
<i>{{ "PLUGIN_ADMIN.MONTH"|tu }}</i>
</span>
</div>
</div>
@@ -125,13 +125,13 @@
{% include 'partials/messages.html.twig' %}
{% if config.plugins.admin.show_beta_msg %}
<div class="error alert"><i class="fa fa-exclamation-circle"></i> {{ 'ADMIN_BETA_MSG'|t }}</div>
<div class="error alert"><i class="fa fa-exclamation-circle"></i> {{ 'PLUGIN_ADMIN.ADMIN_BETA_MSG'|tu }}</div>
{% endif %}
<div id="latest">
<div class="button-bar">
<a class="button" href="{{ uri.route(true) }}/pages"><i class="fa fa-fw fa-file-text-o"></i>Manage Pages</a>
<a class="button" href="{{ uri.route(true) }}/pages"><i class="fa fa-fw fa-file-text-o"></i>{{ "PLUGIN_ADMIN.MANAGE_PAGES"|tu }}</a>
</div>
<h1>Latest Page Updates</h1>
<h1>{{ "PLUGIN_ADMIN.LATEST_PAGE_UPDATES"|tu }}</h1>
<table>
{% for latest in admin.latestPages %}
<tr><td class="double"><a href="{{ base_url }}/pages/{{ latest.route|trim('/') }}"><i class="fa fa-fw fa-file-o"></i> {{ latest.title }}</a></td><td class="double">{{ latest.route }}</td><td><b>{{ latest.modified|nicetime }}</b></td></tr>

View File

@@ -3,12 +3,12 @@
{% block content %}
<div class="admin-block">
<h1>
Access denied
{{ "PLUGIN_ADMIN.ACCESS_DENIED"|tu }}
</h1>
{% include 'partials/messages.html.twig' %}
<p>{{ admin.user.fullname }}, your account does not have administrator permissions. <a href="{{ base_url_relative }}/task{{ config.system.param_sep }}logout">Logout</a></p>
<p>{{ admin.user.fullname }}, {{ "PLUGIN_ADMIN.ACCOUNT_NOT_ADMIN"|tu }}. <a href="{{ base_url_relative }}/task{{ config.system.param_sep }}logout">{{ "PLUGIN_ADMIN.LOGOUT"|tu }}</a></p>
</div>
{% endblock %}

View File

@@ -179,7 +179,7 @@
<table>
<tr>
<td align="center">
{{ 'EMAIL_FOOTER'|t }}
{{ 'PLUGIN_ADMIN.EMAIL_FOOTER'|tu }}
</td>
</tr>
</table>

View File

@@ -9,7 +9,7 @@
{% endif %}
{% endfor %}
<div class="form-actions secondary-accent">
<button type="submit" class="button primary" name="task" value="forgot"><i class="fa fa-paper-plane"></i> {{ "LOGIN_BTN_SEND_INSTRUCTIONS"|t }}</button>
<button type="submit" class="button primary" name="task" value="forgot"><i class="fa fa-paper-plane"></i> {{ "PLUGIN_ADMIN.LOGIN_BTN_SEND_INSTRUCTIONS"|tu }}</button>
</div>
{% endblock %}

View File

@@ -20,9 +20,9 @@
<label class="{{ field.toggleable ? 'toggleable' : '' }}">
{% block label %}
{% if field.help %}
<span class="hint--bottom" data-hint="{{ field.help|e }}">{{ field.label }}</span>
<span class="hint--bottom" data-hint="{{ field.help|e }}">{{ field.label|tu }}</span>
{% else %}
{{ field.label }}
{{ field.label|tu }}
{% endif %}
{{ field.validate.required in ['on', 'true', 1] ? '<span class="required">*</span>' }}
{% endblock %}

View File

@@ -4,9 +4,9 @@
<div class="form-label block size-1-3 pure-u-1-3">
<label>
{% if field.help %}
<span class="tooltip" data-asTooltip-position="w" title="{{ field.help|e }}">{{ field.label }}</span>
<span class="tooltip" data-asTooltip-position="w" title="{{ field.help|e }}">{{ field.label|tu }}</span>
{% else %}
{{ field.label }}
{{ field.label|tu }}
{% endif %}
{{ field.validate.required in ['on', 'true', 1] ? '<span class="required">*</span>' }}
</label>

View File

@@ -4,9 +4,9 @@
<div class="form-label">
<label>
{% if field.help %}
<span class="tooltip" data-asTooltip-position="w" title="{{ field.help|e }}">{{ field.label }}</span>
<span class="tooltip" data-asTooltip-position="w" title="{{ field.help|e }}">{{ field.label|tu }}</span>
{% else %}
{{ field.label }}
{{ field.label|tu }}
{% endif %}
{{ field.validate.required in ['on', 'true', 1] ? '<span class="required">*</span>' }}
</label>

View File

@@ -7,9 +7,9 @@
<div class="form-label block size-1-4 pure-u-1-4">
<label>
{% if field.help %}
<span class="tooltip" data-asTooltip-position="w" title="{{ field.help|e }}">{{ field.label }}</span>
<span class="tooltip" data-asTooltip-position="w" title="{{ field.help|e }}">{{ field.label|tu }}</span>
{% else %}
{{ field.label }}
{{ field.label|tu }}
{% endif %}
{{ field.validate.required in ['on', 'true', 1] ? '<span class="required">*</span>' }}
</label>

View File

@@ -6,9 +6,9 @@
<div class="form-label block size-1-3 pure-u-1-3">
<label>
{% if field.help %}
<span class="tooltip" data-asTooltip-position="w" title="{{ field.help|e }}">{{ field.label }}</span>
<span class="tooltip" data-asTooltip-position="w" title="{{ field.help|e }}">{{ field.label|tu }}</span>
{% else %}
{{ field.label }}
{{ field.label|tu }}
{% endif %}
{{ field.validate.required in ['on', 'true', 1] ? '<span class="required">*</span>' }}
</label>

View File

@@ -4,9 +4,9 @@
<div class="form-label block size-1-3 pure-u-1-3">
<label>
{% if field.help %}
<span class="tooltip" data-asTooltip-position="w" title="{{ field.help|e }}">{{ field.label }}</span>
<span class="tooltip" data-asTooltip-position="w" title="{{ field.help|e }}">{{ field.label|tu }}</span>
{% else %}
{{ field.label }}
{{ field.label|tu }}
{% endif %}
{{ field.validate.required in ['on', 'true', 1] ? '<span class="required">*</span>' }}
</label>

View File

@@ -1,9 +1,9 @@
{% if field.title %}
<h1 {% if not field.underline %}class="no_underline"{% endif %}>{{ field.title }}</h1>
<h1 {% if not field.underline %}class="no_underline"{% endif %}>{{ field.title|tu }}</h1>
{% endif %}
{% if field.text %}
<p>{{ field.text }}<p>
<p>{{ field.text|tu }}<p>
{% endif %}
{% if field.fields %}

View File

@@ -15,7 +15,7 @@
{% if field.form %}form="{{ field.form }}"{% endif %}
>
{% for key, text in field.options %}
<option {% if key == value or text in value %}selected="selected"{% endif %} value="{{ field.multiple ? text : key }}">{{ text }}</option>
<option {% if key == value or text in value %}selected="selected"{% endif %} value="{{ field.multiple ? text : key }}">{{ text|tu }}</option>
{% endfor %}
</select>
</div>

View File

@@ -9,7 +9,7 @@
{% endif %}
{% if field.fields %}
{% for tab in field.fields %}<input type="radio" name="tab" id="tab{{ loop.index }}" class="tab-head" {{ active == loop.index ? 'checked="checked"' : '' }}/><label for="tab{{ loop.index }}">{{ tab.title }}</label>{% endfor %}
{% for tab in field.fields %}<input type="radio" name="tab" id="tab{{ loop.index }}" class="tab-head" {{ active == loop.index ? 'checked="checked"' : '' }}/><label for="tab{{ loop.index }}">{{ tab.title|tu }}</label>{% endfor %}
<div class="tab-body-wrapper">
{% for field in field.fields %}
{% set value = data.value(field.name) %}

View File

@@ -36,7 +36,7 @@
{% endif %}
{% if field.validate.required in ['on', 'true', 1] %}required="required"{% endif %}
/>
<label for="{{ id }}">{{ text }}</label>
<label for="{{ id }}">{{ text|tu }}</label>
{% endfor %}
<a></a>
</div>

View File

@@ -3,7 +3,7 @@
{% if exists %}
<div class="form-field">
<div class="form-data form-uploads-wrapper">
<h3>{{ field.label }}</h3>
<h3>{{ field.label|tu }}</h3>
<div id="gravDropzone" class="dropzone"></div>
<span>{{ value|join("\n") }}</span>
<script>

View File

@@ -2,9 +2,9 @@
{% block titlebar %}
<div class="button-bar">
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> Back</a>
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> {{ "PLUGIN_ADMIN.BACK"|tu }}</a>
</div>
<h1><i class="fa fa-fw fa-th"></i> Configuration - PHP Info</h1>
<h1><i class="fa fa-fw fa-th"></i> {{ "PLUGIN_ADMIN.CONFIGURATION"|tu }} - {{ "PLUGIN_ADMIN.PHP_INFO"|tu }}</h1>
{% endblock %}
{% block content_top %}

View File

@@ -1,11 +1,9 @@
{% extends 'partials/base.html.twig' %}
{% block content %}
<div class="admin-block">
<h1>
Installer
{{ "PLUGIN_ADMIN.INSTALLER"|tu }}
</h1>
{% include 'partials/messages.html.twig' %}

View File

@@ -9,8 +9,8 @@
{% endif %}
{% endfor %}
<div class="form-actions secondary-accent">
<a class="button secondary" href="{{ base_url_relative }}/forgot"><i class="fa fa-exclamation-circle"></i> {{ 'LOGIN_BTN_FORGOT'|t }}</a>
<button type="submit" class="button primary" name="task" value="login"><i class="fa fa-sign-in"></i> {{ 'LOGIN_BTN'|t }}</button>
<a class="button secondary" href="{{ base_url_relative }}/forgot"><i class="fa fa-exclamation-circle"></i> {{ 'PLUGIN_ADMIN.LOGIN_BTN_FORGOT'|tu }}</a>
<button type="submit" class="button primary" name="task" value="login"><i class="fa fa-sign-in"></i> {{ 'PLUGIN_ADMIN.LOGIN_BTN'|tu }}</button>
</div>
{% endblock %}

View File

@@ -10,7 +10,7 @@
{{ title }}
</h1>
<div class="info alert">{{ 'LOGGED_OUT'|t }}</div>
<div class="info alert">{{ 'PLUGIN_ADMIN.LOGGED_OUT'|tu }}</div>
{% include 'partials/messages.html.twig' %}
</section>
{% endblock %}

View File

@@ -6,7 +6,7 @@
<div class="admin-block">
<h1>
Browse Error Logs
{{ 'PLUGIN_ADMIN.BROWSE_ERROR_LOGS'|tu }}
</h1>
<table>

View File

@@ -19,6 +19,8 @@
{% set warn = config.plugins.admin.warnings.delete_page %}
{% set admin_lang = admin.session.admin_lang ?: 'en' %}
{% block stylesheets %}
{% if mode == 'edit' %}
{% do assets.addCss(theme_url~'/css/codemirror/codemirror.css') %}
@@ -38,7 +40,7 @@
{% set preview_link = '<a class="preview" href="'~ base_url_relative_frontend ~ (context.home ? '' : context.route) ~'"><i class="fa fa-fw fa-angle-double-right"></i></a>' %}
{% macro loop(page, base_url, depth, warn, separator) %}
{% macro loop(page, base_url, depth, warn, separator, admin_lang, default_site_lang) %}
{% for p in page.children() %}
{% set description = (not p.page ? 'Folder &bull; ' : 'Page &bull; ') ~
(p.modular ? 'Modular &bull; ' : '') ~
@@ -50,13 +52,19 @@
<span {{ p.children(0).count > 0 ? 'data-toggle="children"' : ''}} data-hint="{{ description|trim(' &bull; ') }}" class="hint--bottom">
<i class="page-icon fa fa-fw fa-circle-o {{ p.children(0).count > 0 ? 'children-closed' : ''}} {{ p.modular ? 'modular' : (not p.routable ? 'not-routable' : (not p.visible ? 'not-visible' : (not p.page ? 'folder' : ''))) }}"></i>
</span>
<a href="{{ base_url }}/pages/{{ p.route|trim('/') }}" class="page-edit">{{ p.menu }}</a>
{% if p.language == admin_lang %}
<a href="{{ base_url }}/pages/{{ p.route|trim('/') }}" class="page-edit">{{ p.menu }}</a>
{% else %}
{{ p.menu }} <span class="badge lang">{{p.language ?: default_site_lang}}</span>
{% endif %}
<span class="page-home">{{ p.home ? '<i class="fa fa-home"></i>' }}</span>
<span class="page-tools">
{% if warn %}
<a href="#delete" data-remodal-target="delete" data-delete-url="{{ base_url }}/pages/{{ p.route|trim('/') }}/task{{ separator }}delete" class="page-delete" ><i class="fa fa-close"></i></a>
{% else %}
<a href="{{ base_url }}/pages/{{ p.route|trim('/') }}/task{{ separator }}delete" class="page-delete" ><i class="fa fa-close"></i></a>
{% if p.language == admin_lang %}
{% if warn %}
<a href="#delete" data-remodal-target="delete" data-delete-url="{{ base_url }}/pages/{{ p.route|trim('/') }}/task{{ separator }}delete" class="page-delete" ><i class="fa fa-close"></i></a>
{% else %}
<a href="{{ base_url }}/pages/{{ p.route|trim('/') }}/task{{ separator }}delete" class="page-delete" ><i class="fa fa-close"></i></a>
{% endif %}
{% endif %}
</span>
<p class="page-route">{{ p.route }}</p>
@@ -64,7 +72,7 @@
{% if p.children().count > 0 %}
<ul class="depth-{{ depth + 1 }}" style="display:none;">
{{ _self.loop(p, base_url, depth + 1, warn, separator) }}
{{ _self.loop(p, base_url, depth + 1, warn, separator, admin_lang, default_site_lang) }}
</ul>
{% endif %}
</li>
@@ -75,36 +83,52 @@
{% block titlebar %}
<div class="button-bar">
{% if mode == 'list' %}
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> Back</a>
<a class="button" href="#modal" data-remodal-target="modal"><i class="fa fa-plus"></i> Add Page</a>
<a class="button" href="#modular" data-remodal-target="modular"><i class="fa fa-plus"></i> Add Modular</a>
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> {{ "PLUGIN_ADMIN.BACK"|tu }}</a>
<a class="button" href="#modal" data-remodal-target="modal"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.ADD_PAGE"|tu }}</a>
<a class="button" href="#modular" data-remodal-target="modular"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.ADD_MODULAR"|tu }}</a>
{% if admin.multilang %}
<div class="button-group">
<button type="button" class="button dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-language"></i> {{ "PLUGIN_ADMIN.SWITCH_LANGUAGE"|tu }} &nbsp; <i class="fa fa-caret-down"></i>
</button>
<ul class="dropdown-menu language-switcher">
{% for language in admin.languages_enabled %}
<li><a class="button {% if admin_lang == language %}active{% endif %}" href="{{ base_url_relative }}{{ theme.slug }}/pages/task{{ config.system.param_sep }}switchlanguage/lang{{ config.system.param_sep }}{{language}}">{{ admin.siteLanguages[language]|capitalize }}</a></li>
{% endfor %}
</ul>
</div>
{% endif %}
{% elseif mode == 'edit' %}
<a class="button" href="{{ base_url }}/pages"><i class="fa fa-reply"></i> Back</a>
<a class="button" href="{{ base_url }}/pages"><i class="fa fa-reply"></i> {{ "PLUGIN_ADMIN.BACK"|tu }}</a>
{% if exists %}
<a class="button" href="{{ uri.route(true) }}/task{{ config.system.param_sep }}copy" class="page-copy" ><i class="fa fa-copy"></i> Copy</a>
<a class="button" href="#" data-remodal-target="move"><i class="fa fa-arrows"></i> Move</a>
<a class="button" href="{{ uri.route(true) }}/task{{ config.system.param_sep }}copy" class="page-copy" ><i class="fa fa-copy"></i> {{ "PLUGIN_ADMIN.COPY"|tu }}</a>
<a class="button" href="#" data-remodal-target="move"><i class="fa fa-arrows"></i> {{ "PLUGIN_ADMIN.MOVE"|tu }}</a>
{% if warn %}
<a class="button" href="#delete" data-remodal-target="delete" data-delete-url="{{ uri.route(true) }}/task{{ config.system.param_sep }}delete"><i class="fa fa-close"></i> Delete</a>
<a class="button" href="#delete" data-remodal-target="delete" data-delete-url="{{ uri.route(true) }}/task{{ config.system.param_sep }}delete"><i class="fa fa-close"></i> {{ "PLUGIN_ADMIN.DELETE"|tu }}</a>
{% else %}
<a class="button" href="{{ uri.route(true) }}/task{{ config.system.param_sep }}delete" class="page-delete" ><i class="fa fa-close"></i></a>
{% endif %}
{% endif %}
<button class="button" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> Save</button>
<button class="button" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> {{ "PLUGIN_ADMIN.SAVE"|tu }}</button>
{% endif %}
</div>
{% if mode == 'new' %}
<h1><i class="fa fa-fw fa-file-text-o"></i> Add Page</h1>
<h1><i class="fa fa-fw fa-file-text-o"></i> {{ "PLUGIN_ADMIN.ADD_PAGE"|tu }}</h1>
{% elseif mode == 'edit' %}
<h1><i class="fa fa-fw fa-file-text-o"></i>
{{ context.exists ? "Edit '#{context.menu}'" ~ preview_link : "Create '#{context.menu}'" }}
{{ context.exists ? "PLUGIN_ADMIN.EDIT"|tu ~ " '#{context.menu}'" ~ preview_link : "PLUGIN_ADMIN.CREATE"|tu ~ " '#{context.menu}'" }}
</h1>
{% else %}
<h1><i class="fa fa-fw fa-file-text-o"></i> Manage Pages</h1>
<h1><i class="fa fa-fw fa-file-text-o"></i> {{ "PLUGIN_ADMIN.MANAGE_PAGES"|tu }}</h1>
{% endif %}
{% endblock %}
{% block content %}
{% set default_site_lang = grav.config.system.languages|first|first %}
<div class="admin-block clear">
{% include 'partials/messages.html.twig' %}
{% if mode == 'new' %}
@@ -115,9 +139,9 @@
<form id="admin-mode-toggle">
<div class="switch-toggle switch-grav">
<input type="radio" value="normal" data-leave-url="{{ uri.route(true) }}/mode:normal" id="normal" name="mode-switch" class="highlight" {% if admin.session.expert == '0' %} checked="checked"{% endif %}>
<label for="normal">Normal</label>
<label for="normal">{{ "PLUGIN_ADMIN.NORMAL"|tu }}</label>
<input type="radio" value="expert" data-leave-url="{{ uri.route(true) }}/mode:expert" id="expert" name="mode-switch" class="highlight" {% if admin.session.expert == '1' %} checked="checked"{% endif %}>
<label for="expert">Expert</label>
<label for="expert">{{ "PLUGIN_ADMIN.EXPERT"|tu }}</label>
<a></a>
</div>
</form>
@@ -132,28 +156,28 @@
{% else %}
<form id="page-filtering">
<div class="page-filters">
<input type="text" placeholder="Add Filters" class="page-filter" name="page-filter" />
<input type="text" placeholder="{{ "PLUGIN_ADMIN.ADD_FILTERS"|tu }}" class="page-filter" name="page-filter" />
</div>
<div class="page-search">
<input type="text" placeholder="Search Pages" name="page-search" />
<input type="text" placeholder="{{ "PLUGIN_ADMIN.SEARCH_PAGES"|tu }}" name="page-search" />
</div>
<div class="page-shortcuts">
<span class="button button-x-small" data-page-toggleall="expand"><i class="fa fa-fw fa-plus-circle"></i> Expand All</span>
<span class="button button-x-small" data-page-toggleall="collapse"><i class="fa fa-fw fa-minus-circle"></i> Collapse All</span>
<span class="button button-x-small" data-page-toggleall="expand"><i class="fa fa-fw fa-plus-circle"></i> {{ "PLUGIN_ADMIN.EXPAND_ALL"|tu }}</span>
<span class="button button-x-small" data-page-toggleall="collapse"><i class="fa fa-fw fa-minus-circle"></i> {{ "PLUGIN_ADMIN.COLLAPSE_ALL"|tu }}</span>
</div>
</form>
<ul class="pages-list depth-0">
{{ _self.loop(pages, base_url_relative, 0, warn, config.system.param_sep) }}
{{ _self.loop(pages, base_url_relative, 0, warn, config.system.param_sep, admin.session.admin_lang, default_site_lang) }}
</ul>
{% endif %}
</div>
<div class="remodal" data-remodal-id="generic" data-remodal-options="hashTracking: false">
<form>
<h1>Error</h1>
<h1>{{ "PLUGIN_ADMIN.ERROR"|tu }}</h1>
<div class="error-content"></div>
<div class="button-bar">
<a class="button remodal-confirm" href="#">Close</a>
<a class="button remodal-confirm" href="#">{{ "PLUGIN_ADMIN.CLOSE"|tu }}</a>
</div>
</form>
</div>
@@ -177,14 +201,14 @@
<div class="remodal" data-remodal-id="delete" data-remodal-options="hashTracking: false">
<form>
<h1>Confirmation Required</h1>
<h1>{{ "PLUGIN_ADMIN.MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_TITLE"|tu }}</h1>
<p class="bigger">
Are you sure you want to delete this page and all it's children? This action cannot be undone.
{{ "PLUGIN_ADMIN.MODAL_DELETE_PAGE_CONFIRMATION_REQUIRED_DESC"|tu }}
</p>
<br>
<div class="button-bar">
<a class="button secondary remodal-cancel" href="#"><i class="fa fa-fw fa-close"></i> Cancel</a>
<a class="button" data-delete-action href="#"><i class="fa fa-fw fa-check"></i>Continue</a>
<a class="button secondary remodal-cancel" href="#"><i class="fa fa-fw fa-close"></i> {{ "PLUGIN_ADMIN.CANCEL"|tu }}</a>
<a class="button" data-delete-action href="#"><i class="fa fa-fw fa-check"></i> {{ "PLUGIN_ADMIN.CONTINUE"|tu }}</a>
</div>
</form>
</div>
@@ -192,28 +216,28 @@
<div class="remodal" data-remodal-id="changes">
<form>
<h1>Changes Detected</h1>
<h1>{{ "PLUGIN_ADMIN.MODAL_CHANGED_DETECTED_TITLE"|tu }}</h1>
<p class="bigger">
You have unsaved changes. Are you sure you want to leave without saving?
{{ "PLUGIN_ADMIN.MODAL_CHANGED_DETECTED_DESC"|tu }}
</p>
<br>
<div class="button-bar">
<a class="button secondary" data-leave-action="cancel" href="#"><i class="fa fa-fw fa-close"></i> Cancel</a>
<a class="button" data-leave-action="continue" href="#"><i class="fa fa-fw fa-check"></i>Continue</a>
<a class="button secondary" data-leave-action="cancel" href="#"><i class="fa fa-fw fa-close"></i> {{ "PLUGIN_ADMIN.CANCEL"|tu }}</a>
<a class="button" data-leave-action="continue" href="#"><i class="fa fa-fw fa-check"></i> {{ "PLUGIN_ADMIN.CONTINUE"|tu }}</a>
</div>
</form>
</div>
<div class="remodal" data-remodal-id="delete-media" data-remodal-options="hashTracking: false">
<form>
<h1>Confirmation Required</h1>
<h1>{{ "PLUGIN_ADMIN.MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_TITLE"|tu }}</h1>
<p class="bigger">
Are you sure you want to delete this file? This action cannot be undone.
{{ "PLUGIN_ADMIN.MODAL_DELETE_FILE_CONFIRMATION_REQUIRED_DESC"|tu }}
</p>
<br>
<div class="button-bar">
<a class="button secondary remodal-cancel" href="#"><i class="fa fa-fw fa-close"></i> Cancel</a>
<a class="button remodal-confirm" href="#"><i class="fa fa-fw fa-check"></i>Continue</a>
<a class="button secondary remodal-cancel" href="#"><i class="fa fa-fw fa-close"></i> {{ "PLUGIN_ADMIN.CANCEL"|tu }}</a>
<a class="button remodal-confirm" href="#"><i class="fa fa-fw fa-check"></i> {{ "PLUGIN_ADMIN.CONTINUE"|tu }}</a>
</div>
</form>
</div>

View File

@@ -90,12 +90,12 @@
{% block content %}{% endblock %}
</div>
{% if config.plugins.admin.show_beta_msg %}
<div class="notice alert"><i class="fa fa-github"></i> <a href="https://github.com/getgrav/grav-plugin-admin/issues" target="_blank">{{ 'ADMIN_REPORT_ISSUE'|t }}</a></div>
<div class="notice alert"><i class="fa fa-github"></i> <a href="https://github.com/getgrav/grav-plugin-admin/issues" target="_blank">{{ 'PLUGIN_ADMIN.ADMIN_REPORT_ISSUE'|tu }}</a></div>
{% endif %}
{% block content_bottom %}{% endblock %}
</div>
<footer id="footer">
<a href="http://getgrav.org">Grav</a> version <span class="grav-version">{{ constant('GRAV_VERSION') }}</span> was made with <i class="fa fa-heart"></i> by <a href="http://www.rockettheme.com">RocketTheme</a>.
<a href="http://getgrav.org">Grav</a> {{ "PLUGIN_ADMIN.VERSION"|tu|lower }} <span class="grav-version">{{ constant('GRAV_VERSION') }}</span> {{ "PLUGIN_ADMIN.WAS_MADE_WITH"|tu|lower }} <i class="fa fa-heart"></i> {{ "PLUGIN_ADMIN.BY"|tu|lower }} <a href="http://www.rockettheme.com">RocketTheme</a>.
</footer>
</div>

View File

@@ -11,6 +11,6 @@
{% endfor %}
<div class="button-bar">
<button class="button primary" name="task" value="continue">Continue</button>
<button class="button primary" name="task" value="continue">{{ "PLUGIN_ADMIN.CONTINUE"|tu }}</button>
</div>
</form>

View File

@@ -11,8 +11,6 @@
{% endif %}
{% endfor %}
{% if data.extra %}
{% for name, value in data.extra %}
{% set field = {name: '_json.' ~ name} %}

View File

@@ -2,6 +2,6 @@
window.GravAdmin = window.GravAdmin || {};
window.GravAdmin.config = {
base_url_relative: '{{ base_url_relative }}',
param_sep: '{{ config.system.param_sep }}'
param_sep: '{{ config.system.param_sep }}'
};
</script>

View File

@@ -1,6 +1,6 @@
<nav id="admin-sidebar">
<div id="admin-logo">
<h3><a href="{{ base_url_relative }}">Grav Admin</a> <a target="_blank" href="{{ base_url_relative_frontend }}"><i class="fa fa-fw fa-angle-double-right"></i></a></h3>
<h3><a href="{{ base_url_relative }}">{{ "PLUGIN_ADMIN.GRAV_ADMIN"|tu }}</a> <a target="_blank" href="{{ base_url_relative_frontend }}"><i class="fa fa-fw fa-angle-double-right"></i></a></h3>
</div>
{#{% if admin.authorise %}#}
@@ -18,14 +18,14 @@
<ul id="admin-menu">
<li class="{{ (location == 'dashboard') ? 'selected' : '' }}">
<a href="{{ base_url_relative }}"><i class="fa fa-fw fa-th"></i> Dashboard</a>
<a href="{{ base_url_relative }}"><i class="fa fa-fw fa-th"></i> {{ "PLUGIN_ADMIN.DASHBOARD"|tu }}</a>
</li>
<li class="{{ (location == 'system' or location == 'site') ? 'selected' : '' }}">
<a href="{{ base_url_relative }}/system"><i class="fa fa-fw fa-wrench"></i> Configuration</a>
<a href="{{ base_url_relative }}/system"><i class="fa fa-fw fa-wrench"></i> {{ "PLUGIN_ADMIN.CONFIGURATION"|tu }}</a>
</li>
<li class="{{ (location == 'pages') ? 'selected' : '' }}">
<a href="{{ base_url_relative }}/pages">
<i class="fa fa-fw fa-file-text-o"></i> Pages
<i class="fa fa-fw fa-file-text-o"></i> {{ "PLUGIN_ADMIN.PAGES"|tu }}
<span class="badges">
<span class="badge count">{{ admin.routes|length }}</span>
</span>
@@ -33,7 +33,7 @@
</li>
<li class="{{ (location == 'plugins') ? 'selected' : '' }}">
<a href="{{ base_url_relative }}/plugins">
<i class="fa fa-fw fa-plug"></i> Plugins
<i class="fa fa-fw fa-plug"></i> {{ "PLUGIN_ADMIN.PLUGINS"|tu }}
<span class="badges">
<span class="badge updates"></span>
<span class="badge count">{{ admin.plugins|length }}</span>
@@ -43,7 +43,7 @@
</li>
<li class="{{ (location == 'themes') ? 'selected' : '' }}">
<a href="{{ base_url_relative }}/themes">
<i class="fa fa-fw fa-tint"></i> Themes
<i class="fa fa-fw fa-tint"></i> {{ "PLUGIN_ADMIN.THEMES"|tu }}
<span class="badges">
<span class="badge updates"></span>
<span class="badge count">{{ admin.themes|length }}</span>
@@ -62,7 +62,7 @@
</a>
</li> -->
<li>
<a href="{{ base_url_relative }}/task{{ config.system.param_sep }}logout"><i class="fa fa-fw fa-sign-out"></i> Logout</a>
<a href="{{ base_url_relative }}/task{{ config.system.param_sep }}logout"><i class="fa fa-fw fa-sign-out"></i> {{ "PLUGIN_ADMIN.LOGOUT"|tu }}</a>
</li>
</ul>
</nav>

View File

@@ -11,7 +11,7 @@
{% endfor %}
<div class="button-bar">
<a class="button secondary remodal-cancel" href="#"><i class="fa fa-fw fa-close"></i> Cancel</a>
<button class="button primary" name="task" value="continue" form="blueprints">Continue</button>
<a class="button secondary remodal-cancel" href="#"><i class="fa fa-fw fa-close"></i> {{ "PLUGIN_ADMIN.CANCEL"|tu }}</a>
<button class="button primary" name="task" value="continue" form="blueprints">{{ "PLUGIN_ADMIN.CONTINUE"|tu }}</button>
</div>
</form>

View File

@@ -1,7 +1,7 @@
<table>
{% if plugin.author %}
<tr>
<td>Author:</td>
<td>{{ "PLUGIN_ADMIN.AUTHOR"|tu }}:</td>
<td>
{% if plugin.author.url %}
<a href="{{ plugin.author.url }}" target="_blank">{{ plugin.author.name }}</a>
@@ -16,38 +16,38 @@
{% endif %}
{% if plugin.homepage %}
<tr>
<td>Homepage:</td>
<td>{{ "PLUGIN_ADMIN.HOMEPAGE"|tu }}:</td>
<td><a href="{{ plugin.homepage }}" target="_blank">{{ plugin.homepage }}</a></td>
</tr>
{% endif %}
{% if plugin.demo %}
<tr>
<td>Demo:</td>
<td>{{ "PLUGIN_ADMIN.DEMO"|tu }}:</td>
<td><a href="{{ plugin.demo }}" target="_blank">{{ plugin.demo }}</a></td>
</tr>
{% endif %}
{% if plugin.bugs %}
<tr>
<td>Bug Tracker:</td>
<td>{{ "PLUGIN_ADMIN.BUG_TRACKER"|tu }}:</td>
<td><a href="{{ plugin.bugs }}" target="_blank">{{ plugin.bugs }}</a></td>
</tr>
{% endif %}
{% if plugin.keywords %}
<tr>
<td>Keywords:</td>
<td>{{ "PLUGIN_ADMIN.KEYWORDS"|tu }}:</td>
<td>{{ plugin.keywords|join(', ') }}</td>
</tr>
{% endif %}
{% if plugin.license %}
<tr>
<td>License:</td>
<td>{{ "PLUGIN_ADMIN.LICENSE"|tu }}:</td>
<td>{{ plugin.license }}</td>
</tr>
{% endif %}
{% if plugin.description %}
<tr>
<td>Description:</td>
<td>{{ "PLUGIN_ADMIN.DESCRIPTION"|tu }}:</td>
<td>{{ plugin.description_html }}</td>
</tr>
{% endif %}
@@ -55,7 +55,7 @@
{% if plugin.readme or plugin.homepage %}
{% set readme_link = plugin.readme ?: plugin.homepage ~ '/blob/develop/README.md' %}
<tr>
<td>Readme:</td>
<td>{{ "PLUGIN_ADMIN.README"|tu }}:</td>
<td><a href="{{ readme_link }}" target="_blank">{{ readme_link }}</a></td>
</tr>
{% endif %}

View File

@@ -6,8 +6,8 @@
{% set remote = gpm.getRepositoryPlugin(admin.route) %}
<p>
<i class="fa fa-bullhorn"></i>
<strong>v{{ remote.available }}</strong> of this plugin is now available!
<button class="button button-small secondary" data-download="{{ remote.zipball_url }}">Update Plugin</button>
<strong>v{{ remote.available }}</strong> {{ "PLUGIN_ADMIN.OF_THIS_PLUGIN_IS_NOW_AVAILABLE"|tu }}!
<button class="button button-small secondary" data-download="{{ remote.zipball_url }}">{{ "PLUGIN_ADMIN.UPDATE_PLUGIN"|tu }}</button>
</p>
{% endif %}
</div>
@@ -15,17 +15,17 @@
<h1>
{{ plugin.name|e }}
{% if admin.isTeamGrav(plugin) %}
<small><span class="info-reverse"><i class="fa fa-check-circle" title="Grav Official Plugin"></i></span></small>
<small><span class="info-reverse"><i class="fa fa-check-circle" title="{{ "PLUGIN_ADMIN.GRAV_OFFICIAL_PLUGIN"|tu }}"></i></span></small>
{% endif %}
{% if plugin.symlink %}
<small class="hint--bottom" data-hint="This plugin is symbolically linked. Updates won't be detected.">
<small class="hint--bottom" data-hint="{{ "PLUGIN_ADMIN.PLUGIN_SYMBOLICALLY_LINKED"|tu }}">
<i class="fa fa-fw fa-link"></i>
</small>
{% endif %}
<small>{{ plugin.version ? 'v' ~ plugin.version|e }}</small>
</h1>
<div class="gpm-item-info">
<i class="gpm-item-icon fa fa-fw fa-{{ plugin.icon }}"></i>
<i class="gpm-item-icon fa fa-fw fa-{{ plugin.icon }}"></i>
{% include 'partials/plugin-data.html.twig' with { plugin: plugin } %}
</div>
@@ -35,10 +35,10 @@
<div class="button-bar danger">
<span class="danger-zone"></span>
<a class="button" href="{{ base_url_relative }}/plugins/{{ plugin.slug }}/task{{ config.system.param_sep }}uninstall"><i class="fa fa-fw fa-warning"></i>Remove Plugin</a>
<a class="button" href="{{ base_url_relative }}/plugins/{{ plugin.slug }}/task{{ config.system.param_sep }}uninstall"><i class="fa fa-fw fa-warning"></i>{{ "PLUGIN_ADMIN.REMOVE_PLUGIN"|tu }}</a>
</div>
{% else %}
<div class="button-bar success">
<a class="button" href="{{ base_url_relative }}/plugins/{{ plugin.slug }}/task{{ config.system.param_sep }}install"><i class="fa fa-fw fa-plus"></i>Install Plugin</a>
<a class="button" href="{{ base_url_relative }}/plugins/{{ plugin.slug }}/task{{ config.system.param_sep }}install"><i class="fa fa-fw fa-plus"></i>{{ "PLUGIN_ADMIN.INSTALL_PLUGIN"|tu }}</a>
</div>
{% endif %}

View File

@@ -1,7 +1,7 @@
<div class="grav-update plugins"></div>
<h1>
{{ installing ? 'Available' : 'Installed' }} Plugins
{{ installing ? "PLUGIN_ADMIN.AVAILABLE_PLUGINS"|tu : "PLUGIN_ADMIN.INSTALLED_PLUGINS"|tu }}
</h1>
<table>
@@ -14,7 +14,7 @@
<i class="fa fa-fw fa-{{ plugin.icon }}"></i>
<a href="{{ base_url_relative }}/plugins/{{ slug|url_encode }}">{{ plugin.name }}</a>
{% if admin.isTeamGrav(plugin) %}
<small><span class="info-reverse"><i class="fa fa-check-circle" title="Grav Official Plugin"></i></span></small>
<small><span class="info-reverse"><i class="fa fa-check-circle" title="{{ "PLUGIN_ADMIN.GRAV_OFFICIAL_PLUGIN"|tu }}"></i></span></small>
{% endif %}
{% if plugin.symlink %}
<span class="hint--bottom" data-hint="This plugin is symbolically linked. Updates won't be detected.">

View File

@@ -6,8 +6,8 @@
{% set remote = gpm.getRepositoryTheme(admin.route) %}
<p>
<i class="fa fa-bullhorn"></i>
<strong>v{{ remote.available }}</strong> of this theme is now available!
<button class="button button-small secondary" data-download="{{ remote.zipball_url }}">Update Theme</button>
<strong>v{{ remote.available }}</strong> {{ "PLUGIN_ADMIN.OF_THIS_THEME_IS_NOW_AVAILABLE"|tu }}!
<button class="button button-small secondary" data-download="{{ remote.zipball_url }}">{{ "PLUGIN_ADMIN.UPDATE_THEME"|tu }}</button>
</p>
{% endif %}
</div>
@@ -29,13 +29,13 @@
<table>
{% if theme.version %}
<tr>
<td>Version:</td>
<td>{{ "PLUGIN_ADMIN.VERSION"|tu }}:</td>
<td>{{ theme.version }}</td>
</tr>
{% endif %}
{% if theme.author %}
<tr>
<td>Author:</td>
<td>{{ "PLUGIN_ADMIN.AUTHOR"|tu }}:</td>
<td>
{% if theme.author.url %}
<a href="{{ theme.author.url }}" target="_blank">{{ theme.author.name }}</a>
@@ -50,37 +50,37 @@
{% endif %}
{% if theme.homepage %}
<tr>
<td>Homepage:</td>
<td>{{ "PLUGIN_ADMIN.HOMEPAGE"|tu }}:</td>
<td><a href="{{ theme.homepage }}" target="_blank">{{ theme.homepage }}</a></td>
</tr>
{% endif %}
{% if theme.demo %}
<tr>
<td>Demo:</td>
<td>{{ "PLUGIN_ADMIN.DEMO"|tu }}:</td>
<td><a href="{{ theme.demo }}" target="_blank">{{ theme.demo }}</a></td>
</tr>
{% endif %}
{% if theme.bugs %}
<tr>
<td>Bug Tracker:</td>
<td>{{ "PLUGIN_ADMIN.BUG_TRACKER"|tu }}:</td>
<td><a href="{{ theme.bugs }}" target="_blank">{{ theme.bugs }}</a></td>
</tr>
{% endif %}
{% if theme.keywords %}
<tr>
<td>Keywords:</td>
<td>{{ "PLUGIN_ADMIN.KEYWORDS"|tu }}:</td>
<td>{{ theme.keywords }}</td>
</tr>
{% endif %}
{% if theme.license %}
<tr>
<td>License:</td>
<td>{{ "PLUGIN_ADMIN.LICENCE"|tu }}:</td>
<td>{{ theme.license }}</td>
</tr>
{% endif %}
{% if theme.description %}
<tr>
<td>Description:</td>
<td>{{ "PLUGIN_ADMIN.DESCRIPTION"|tu }}:</td>
<td>{{ theme.description_html }}</td>
</tr>
{% endif %}
@@ -88,7 +88,7 @@
{% if theme.readme or theme.homepage %}
{% set readme_link = theme.readme ?: theme.homepage ~ '/blob/develop/README.md' %}
<tr>
<td>Readme:</td>
<td>{{ "PLUGIN_ADMIN.README"|tu }}:</td>
<td><a href="{{ readme_link }}" target="_blank">{{ readme_link }}</a></td>
</tr>
{% endif %}
@@ -102,12 +102,12 @@
{% if (config.get('system.pages.theme') != admin.route) %}
<div class="button-bar danger">
<span class="danger-zone"></span>
<a class="button" href="{{ base_url_relative }}/themes/{{ theme.slug }}/task{{ config.system.param_sep }}uninstall"><i class="fa fa-fw fa-warning"></i>Remove Theme</a>
<a class="button" href="{{ base_url_relative }}/themes/{{ theme.slug }}/task{{ config.system.param_sep }}uninstall"><i class="fa fa-fw fa-warning"></i>{{ "PLUGIN_ADMIN.REMOVE_THEME"|tu }}</a>
</div>
{% endif %}
{% else %}
<div class="button-bar success">
<a class="button" href="{{ base_url_relative }}/themes/{{ theme.slug }}/task{{ config.system.param_sep }}install"><i class="fa fa-fw fa-plus"></i>Install Theme</a>
<a class="button" href="{{ base_url_relative }}/themes/{{ theme.slug }}/task{{ config.system.param_sep }}install"><i class="fa fa-fw fa-plus"></i>{{ "PLUGIN_ADMIN.INSTALL_THEME"|tu }}</a>
</div>
{% endif %}

View File

@@ -1,7 +1,7 @@
<div class="grav-update themes"></div>
<h1>
{{ installing ? 'Available' : 'Installed' }} Themes
{{ installing ? "PLUGIN_ADMIN.AVAILABLE_THEMES"|tu : "PLUGIN_ADMIN.INSTALLED_THEMES"|tu }}
</h1>
<div class="themes card-row grid fixed-blocks pure-g">
@@ -16,10 +16,10 @@
<i class="fa fa-fw fa-{{ theme.icon }}"></i>
<a href="{{ base_url_relative }}/themes/{{ slug|url_encode }}">{{ theme.name }}</a>
{% if admin.isTeamGrav(theme) %}
<small><span class="info-reverse"><i class="fa fa-check-circle" title="Grav Official Theme"></i></span></small>
<small><span class="info-reverse"><i class="fa fa-check-circle" title="{{ "PLUGIN_ADMIN.GRAV_OFFICIAL_THEME"|tu }}"></i></span></small>
{% endif %}
{% if theme.symlink %}
<span class="hint--bottom" data-hint="This theme is symbolically linked. Updates won't be detected.">
<span class="hint--bottom" data-hint="{{ "PLUGIN_ADMIN.THEME_SYMBOLICALLY_LINKED"|tu }}">
<i class="fa fa-fw fa-link"></i>
</span>
{% endif %}
@@ -31,11 +31,11 @@
</div>
{% if (state == 'installing') %}
<div class="gpm-actions">
<a class="button" href="{{ base_url_relative }}/themes/{{ slug }}/task{{ config.system.param_sep }}install"><i class="fa fa-plus"></i> Install</a>
<a class="button" href="{{ base_url_relative }}/themes/{{ slug }}/task{{ config.system.param_sep }}install"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.INSTALL"|tu }}</a>
</div>
{% elseif state == 'active' %}
<div class="gpm-actions">
<i class="fa fa-star"></i> Active Theme
<i class="fa fa-star"></i> {{ "PLUGIN_ADMIN.ACTIVE_THEME"|tu }}
</div>
{% else %}
<a data-remodal-target="theme-switch-warn" href="{{ base_url_relative }}/themes/{{ slug }}/task{{ config.system.param_sep }}activate" class="gpm-actions">
@@ -51,16 +51,16 @@
<div class="remodal theme-switcher" data-remodal-id="theme-switch-warn" data-remodal-options="hashTracking: false">
<form>
<h1>Switching to <strong>{theme_name}</strong></h1>
<h1>{{ "PLUGIN_ADMIN.SWITCHING_TO"|tu }} <strong>{theme_name}</strong></h1>
<p class="bigger">
By switching to a different theme, there is no guarantee that all the layout pages are supported, potentially causing errors when trying to load said pages.
{{ "PLUGIN_ADMIN.SWITCHING_TO_DESCRIPTION"|tu }}
</p>
<p class="bigger">
Do you want to continue and switch to the theme <strong>{theme_name}</strong>?
{{ "PLUGIN_ADMIN.SWITCHING_TO_CONFIRMATION"|tu }} <strong>{theme_name}</strong>?
</p>
<br>
<div class="button-bar">
<a class="button secondary remodal-cancel" href="#"><i class="fa fa-fw fa-close"></i> Cancel</a>
<a class="button continue" href="#"><i class="fa fa-fw fa-check"></i>Continue</a>
<a class="button secondary remodal-cancel" href="#"><i class="fa fa-fw fa-close"></i> {{ "PLUGIN_ADMIN.CANCEL"|tu }}</a>
<a class="button continue" href="#"><i class="fa fa-fw fa-check"></i>{{ "PLUGIN_ADMIN.CONTINUE"|tu }}</a>
</form>
</div>

View File

@@ -10,6 +10,6 @@
{% if admin.authorise %}
<span class="user-details">
<img src="http://www.gravatar.com/avatar/{{ admin.user.email|md5 }}?s=50" /><span class="badge">6</span><span class="hide-small">Hi, {{ admin.user.fullname }}<span> <a href="{{ base_url_relative }}/task{{ config.system.param_sep }}logout">Logout</a>
<img src="http://www.gravatar.com/avatar/{{ admin.user.email|md5 }}?s=50" /><span class="badge">6</span><span class="hide-small">Hi, {{ admin.user.fullname }}<span> <a href="{{ base_url_relative }}/task{{ config.system.param_sep }}logout">{{ "PLUGIN_ADMIN.LOGOUT"|tu }}</a>
</span>
{% endif %}

View File

@@ -1,12 +1,12 @@
{% if user.exists %}
<div class="user-details">
<img src="http://www.gravatar.com/avatar/{{ user.email|md5 }}?s=128" />
<p class="gravatar">Avatar by <a href="http://gravatar.com" target="_blank">gravatar.com</a></p>
<p class="gravatar">{{ "PLUGIN_ADMIN.AVATAR_BY"|tu }} <a href="http://gravatar.com" target="_blank">gravatar.com</a></p>
<h2>{{ user.fullname }}</h2>
{% if user.title %}<h5>{{ user.title }}</h5>{% endif %}
</div>
{% else %}
<h1>Create new user</h1>
<h1>{{ "PLUGIN_ADMIN.CREATE_NEW_USER"|tu }}</h1>
{% endif %}
{% include 'partials/blueprints.html.twig' with { data: user, blueprints: user.blueprints } %}
@@ -14,6 +14,6 @@
{% if user.exists and admin.user.username != user.username %}
<div class="button-bar danger">
<span class="danger-zone"></span>
<a class="button" href="#"><i class="fa fa-fw fa-warning"></i>Remove User</a>
<a class="button" href="#"><i class="fa fa-fw fa-warning"></i>{{ "PLUGIN_ADMIN.REMOVE_USER"|tu }}</a>
</div>
{% endif %}

View File

@@ -18,27 +18,27 @@
{% if not admin.route or installing %}
<div class="button-bar">
{% if (installing) %}
<a class="button" href="{{ base_url_relative }}/plugins"><i class="fa fa-reply"></i> Back</a>
<a class="button" href="{{ base_url_relative }}/plugins"><i class="fa fa-reply"></i> {{ "PLUGIN_ADMIN.BACK"|tu }}</a>
{% else %}
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> Back</a>
<a class="button" href="{{ base_url_relative }}/plugins/install"><i class="fa fa-plus"></i> Add</a>
<button data-gpm-checkupdates="" class="button"><i class="fa fa-refresh"></i> Check for Updates</button>
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> {{ "PLUGIN_ADMIN.BACK"|tu }}</a>
<a class="button" href="{{ base_url_relative }}/plugins/install"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.ADD"|tu }}</a>
<button data-gpm-checkupdates="" class="button"><i class="fa fa-refresh"></i> {{ "PLUGIN_ADMIN.CHECK_FOR_UPDATES"|tu }}</button>
{% endif %}
</div>
<h1><i class="fa fa-fw fa-plug"></i> Plugins</h1>
<h1><i class="fa fa-fw fa-plug"></i> {{ "PLUGIN_ADMIN.PLUGINS"|tu }}</h1>
{% else %}
{% if (installed) %}
<div class="button-bar">
<a class="button" href="{{ base_url_relative }}/plugins"><i class="fa fa-arrow-left"></i> Back to Plugins</a>
<button class="button" type="submit" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> Save</button>
<a class="button" href="{{ base_url_relative }}/plugins"><i class="fa fa-arrow-left"></i> {{ "PLUGIN_ADMIN.BACK_TO_PLUGINS"|tu }}</a>
<button class="button" type="submit" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> {{ "PLUGIN_ADMIN.SAVE"|tu }}</button>
</div>
{% else %}
<div class="button-bar">
<a class="button" href="{{ base_url_relative }}/plugins/install"><i class="fa fa-arrow-left"></i> Back to Plugins</a>
<a class="button" href="{{ base_url_relative }}/plugins/install"><i class="fa fa-arrow-left"></i> {{ "PLUGIN_ADMIN.BACK_TO_PLUGINS"|tu }}</a>
</div>
{% endif %}
<h1><i class="fa fa-fw fa-plug"></i> Plugin: {{ plugin.name|e }}</h1>
<h1><i class="fa fa-fw fa-plug"></i> {{ "PLUGIN_ADMIN.PLUGIN"|tu }}: {{ plugin.name|e }}</h1>
{% endif %}
{% endblock %}

View File

@@ -11,7 +11,7 @@
{% endif %}
{% endfor %}
<div class="form-actions secondary-accent">
<button type="submit" class="button primary" name="task" value="reset"><i class="fa fa-key"></i> {{ 'LOGIN_BTN_RESET'|t }}</button>
<button type="submit" class="button primary" name="task" value="reset"><i class="fa fa-key"></i> {{ 'PLUGIN_ADMIN.LOGIN_BTN_RESET'|tu }}</button>
</div>
{% endblock %}

View File

@@ -2,17 +2,17 @@
{% block titlebar %}
<div class="button-bar">
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> Back</a>
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> {{ "PLUGIN_ADMIN.BACK"|tu }}</a>
<button class="button" type="submit" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> Save</button>
</div>
<h1><i class="fa fa-fw fa-th"></i> Configuration - Site</h1>
<h1><i class="fa fa-fw fa-th"></i> {{ "PLUGIN_ADMIN.CONFIGURATION"|tu }} - {{ "PLUGIN_ADMIN.SITE"|tu }}</h1>
{% endblock %}
{% block content_top %}
<ul class="tab-bar">
<li><a href="{{ base_url_relative }}/system">System</a></li>
<li class="active"><span>Site</span></li>
<li><a href="{{ base_url_relative }}/info">Info</a></li>
<li><a href="{{ base_url_relative }}/system">{{ "PLUGIN_ADMIN.SYSTEM"|tu }}</a></li>
<li class="active"><span>{{ "PLUGIN_ADMIN.SITE"|tu }}</span></li>
<li><a href="{{ base_url_relative }}/info">{{ "PLUGIN_ADMIN.INFO"|tu }}</a></li>
</ul>
{% endblock %}

View File

@@ -5,7 +5,7 @@
<div class="admin-block">
<h1>
Statistics
{{ "PLUGIN_ADMIN.STATISTICS"|tu }}
</h1>
{% include 'partials/messages.html.twig' %}

View File

@@ -2,17 +2,17 @@
{% block titlebar %}
<div class="button-bar">
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> Back</a>
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> {{ "PLUGIN_ADMIN.BACK"|tu }}</a>
<button class="button" type="submit" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> Save</button>
</div>
<h1><i class="fa fa-fw fa-th"></i> Configuration - System</h1>
<h1><i class="fa fa-fw fa-th"></i> {{ "PLUGIN_ADMIN.CONFIGURATION"|tu }} - {{ "PLUGIN_ADMIN.SYSTEM"|tu }}</h1>
{% endblock %}
{% block content_top %}
<ul class="tab-bar">
<li class="active"><span>System</span></li>
<li><a href="{{ base_url_relative }}/site">Site</a></li>
<li><a href="{{ base_url_relative }}/info">Info</a></li>
<li class="active"><span>{{ "PLUGIN_ADMIN.SYSTEM"|tu }}</span></li>
<li><a href="{{ base_url_relative }}/site">{{ "PLUGIN_ADMIN.SITE"|tu }}</a></li>
<li><a href="{{ base_url_relative }}/info">{{ "PLUGIN_ADMIN.INFO"|tu }}</a></li>
</ul>
{% endblock %}

View File

@@ -18,26 +18,26 @@
{% if not admin.route or installing %}
<div class="button-bar">
{% if (installing) %}
<a class="button" href="{{ base_url_relative }}/themes"><i class="fa fa-reply"></i> Back</a>
<a class="button" href="{{ base_url_relative }}/themes"><i class="fa fa-reply"></i> {{ "PLUGIN_ADMIN.BACK"|tu }}</a>
{% else %}
<a class="button" href="{{ base_url }}/"><i class="fa fa-reply"></i> Back</a>
<a class="button" href="{{ base_url_relative }}/themes/install"><i class="fa fa-plus"></i> Add</a>
<button data-gpm-checkupdates="" class="button"><i class="fa fa-refresh"></i> Check for Updates</button>
<a class="button" href="{{ base_url }}/"><i class="fa fa-reply"></i> {{ "PLUGIN_ADMIN.BACK"|tu }}</a>
<a class="button" href="{{ base_url_relative }}/themes/install"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.ADD"|tu }}</a>
<button data-gpm-checkupdates="" class="button"><i class="fa fa-refresh"></i> {{ "PLUGIN_ADMIN.CHECK_FOR_UPDATES"|tu }}</button>
{% endif %}
</div>
<h1><i class="fa fa-fw fa-plug"></i> Themes</h1>
<h1><i class="fa fa-fw fa-plug"></i> {{ "PLUGIN_ADMIN.THEMES"|tu }}</h1>
{% else %}
{% if (installed) %}
<div class="button-bar">
<a class="button" href="{{ base_url_relative }}/themes"><i class="fa fa-arrow-left"></i> Back to Themes</a>
<button class="button" type="submit" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> Save</button>
<a class="button" href="{{ base_url_relative }}/themes"><i class="fa fa-arrow-left"></i> {{ "PLUGIN_ADMIN.BACK_TO_THEMES"|tu }}</a>
<button class="button" type="submit" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> {{ "PLUGIN_ADMIN.SAVE"|tu }}</button>
</div>
{% else %}
<div class="button-bar">
<a class="button" href="{{ base_url_relative }}/themes/install"><i class="fa fa-arrow-left"></i> Back to Themes</a>
<a class="button" href="{{ base_url_relative }}/themes/install"><i class="fa fa-arrow-left"></i> {{ "PLUGIN_ADMIN.BACK_TO_THEMES"|tu }}</a>
</div>
{% endif %}
<h1><i class="fa fa-fw fa-plug"></i> Theme: {{ theme.name|e }}</h1>
<h1><i class="fa fa-fw fa-plug"></i> {{ "PLUGIN_ADMIN.THEME"|tu }}: {{ theme.name|e }}</h1>
{% endif %}
{% endblock %}

View File

@@ -7,15 +7,15 @@
{% block titlebar %}
{% if not admin.route %}
<div class="button-bar">
<a class="button" href="#modal" data-remodal-target="modal"><i class="fa fa-plus"></i> Add Account</a>
<a class="button" href="#modal" data-remodal-target="modal"><i class="fa fa-plus"></i> {{ "PLUGIN_ADMIN.ADD_ACCOUNT"|tu }}</a>
</div>
<h1><i class="fa fa-fw fa-child"></i> Users</h1>
{% else %}
<div class="button-bar">
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> Back</a>
<button class="button" type="submit" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> Save</button>
<a class="button" href="{{ base_url }}"><i class="fa fa-reply"></i> {{ "PLUGIN_ADMIN.BACK"|tu }}</a>
<button class="button" type="submit" name="task" value="save" form="blueprints"><i class="fa fa-check"></i> {{ "PLUGIN_ADMIN.SAVE"|tu }}</button>
</div>
<h1><i class="fa fa-fw fa-user"></i> User: {{ user.username|e }}</h1>
<h1><i class="fa fa-fw fa-user"></i> {{ "PLUGIN_ADMIN.USER"|tu }}: {{ user.username|e }}</h1>
{% endif %}
{% endblock %}
@@ -26,7 +26,6 @@
{% if not admin.route %}
{% include 'partials/users-list.html.twig' %}
<div class="remodal" data-remodal-id="modal" data-remodal-options="hashTracking: false">
{% include 'partials/blueprints-new.html.twig' with { blueprints: admin.blueprints('user/account_new') } %}
</div>

View File

@@ -0,0 +1,38 @@
<?php
namespace Grav\Plugin;
use \Grav\Common\Grav;
class AdminTwigExtension extends \Twig_Extension
{
protected $grav;
public function __construct()
{
$this->grav = Grav::instance();
$this->lang = $this->grav['user']->language;
}
/**
* Returns extension name.
*
* @return string
*/
public function getName()
{
return 'AdminTwigExtension';
}
public function getFilters()
{
return [
new \Twig_SimpleFilter('tu', [$this, 'tuFilter']),
];
}
public function tuFilter()
{
return $this->grav['admin']->translate(func_get_args(), [$this->grav['user']->authenticated ? $this->lang : 'en']);
}
}