Merge branch 'develop' of github.com:octobercms/october into develop

This commit is contained in:
alekseybobkov 2014-08-29 14:16:33 +11:00
commit 012d5a4d1c
46 changed files with 1467 additions and 203 deletions

View File

@ -1,3 +1,15 @@
* **Build 14x** (2014-08-xx)
- Components and variables can now be accessed in the page code section via `$this->foo` in addition to `$this['foo']`.
- AJAX handlers in the CMS can now invoke the page cycle without rendering the page using `$this->pageCycle()`.
* **Build 139** (2014-08-18)
- List widget has been refactored to improve efficiency.
- Added new list column type `nameFrom` (take name from X attribute) as an alternative to `select`.
* **Build 137** (2014-08-14)
- Lists now support Filters (see Backend > Lists docs).
- Numerous hard coded phrases converted to localized strings.
* **Build 132** (2014-08-03)
- New system logging pages: Event log, Request log and Access log.

View File

@ -1,6 +1,6 @@
/*
* Ajax Popup plugin
*
*
* Data attributes:
* - data-control="popup" - enables the ajax popup plugin
* - data-ajax="popup-content.htm" - ajax content to load
@ -99,14 +99,18 @@
this.$el.request(this.options.handler, {
data: this.options.extraData,
success: function(data, textStatus, jqXHR) {
self.setContent(data.result)
$(window).trigger('ajaxUpdateComplete', [this, data, textStatus, jqXHR])
self.triggerEvent('popupComplete')
this.success(data, textStatus, jqXHR).done(function(){
self.setContent(data.result)
$(window).trigger('ajaxUpdateComplete', [this, data, textStatus, jqXHR])
self.triggerEvent('popupComplete')
})
},
error: function(jqXHR, textStatus, errorThrown) {
alert(jqXHR.responseText.length ? jqXHR.responseText : jqXHR.statusText)
self.hide()
self.triggerEvent('popupError')
this.error(jqXHR, textStatus, errorThrown).done(function(){
alert(jqXHR.responseText.length ? jqXHR.responseText : jqXHR.statusText)
self.hide()
self.triggerEvent('popupError')
})
}
})
@ -168,7 +172,7 @@
this.$backdrop = null;
}
}
Popup.prototype.setLoading = function(val) {
if (!this.$backdrop)
return;

View File

@ -154,7 +154,7 @@ class FormController extends ControllerBehavior
$this->controller->formAfterSave($model);
$this->controller->formAfterCreate($model);
Flash::success($this->getLang('create[flash-save]', 'backend::lang.form.create_success'));
Flash::success($this->getLang('create[flashSave]', 'backend::lang.form.create_success'));
if ($redirect = $this->makeRedirect('create', $model))
return $redirect;
@ -207,7 +207,7 @@ class FormController extends ControllerBehavior
$this->controller->formAfterSave($model);
$this->controller->formAfterUpdate($model);
Flash::success($this->getLang('update[flash-save]', 'backend::lang.form.update_success'));
Flash::success($this->getLang('update[flashSave]', 'backend::lang.form.update_success'));
if ($redirect = $this->makeRedirect('update', $model))
return $redirect;
@ -228,7 +228,7 @@ class FormController extends ControllerBehavior
$this->controller->formAfterDelete($model);
Flash::success($this->getLang('update[flash-delete]', 'backend::lang.form.delete_success'));
Flash::success($this->getLang('update[flashDelete]', 'backend::lang.form.delete_success'));
if ($redirect = $this->makeRedirect('delete', $model))
return $redirect;

View File

@ -247,7 +247,7 @@ class Controller extends Extendable
/**
* Invokes the current controller action without rendering a view,
* used by AJAX handler who may rely on the logic inside the action.
* used by AJAX handler that may rely on the logic inside the action.
*/
public function pageAction()
{

View File

@ -41,7 +41,14 @@ class ListColumn
public $sortable = true;
/**
* @var string Custom SQL for selecting this record value.
* @var string Model attribute to use for the display value, this will
* override any $sqlSelect definition.
*/
public $nameFrom;
/**
* @var string Custom SQL for selecting this record display value,
* the @ symbol is replaced with the table name.
*/
public $sqlSelect;
@ -103,6 +110,7 @@ class ListColumn
if (isset($config['searchable'])) $this->searchable = $config['searchable'];
if (isset($config['sortable'])) $this->sortable = $config['sortable'];
if (isset($config['invisible'])) $this->invisible = $config['invisible'];
if (isset($config['nameFrom'])) $this->nameFrom = $config['nameFrom'];
if (isset($config['select'])) $this->sqlSelect = $config['select'];
if (isset($config['relation'])) $this->relation = $config['relation'];
if (isset($config['format'])) $this->format = $config['format'];

View File

@ -55,13 +55,13 @@ class EditorPreferences extends Controller
$this->vars['language'] = 'css';
$this->vars['margin'] = 0;
$this->getClassExtension('Backend.Behaviors.FormController')->update();
$this->asExtension('FormController')->update();
$this->pageTitle = Lang::get('backend::lang.editor.menu_label');
}
public function index_onSave()
{
return $this->getClassExtension('Backend.Behaviors.FormController')->update_onSave();
return $this->asExtension('FormController')->update_onSave();
}
public function formFindModelObject()

View File

@ -49,7 +49,7 @@ class Users extends Controller
if ($context != 'myaccount' && $recordId == $this->user->id)
return Redirect::to(Backend::url('backend/users/myaccount'));
return $this->getClassExtension('Backend.Behaviors.FormController')->update($recordId, $context);
return $this->asExtension('FormController')->update($recordId, $context);
}
/**
@ -68,7 +68,7 @@ class Users extends Controller
*/
public function myaccount_onSave()
{
$result = $this->getClassExtension('Backend.Behaviors.FormController')->update_onSave($this->user->id, 'myaccount');
$result = $this->asExtension('FormController')->update_onSave($this->user->id, 'myaccount');
/*
* If the password or login name has been updated, reauthenticate the user

View File

@ -47,6 +47,7 @@ return [
'menu_label' => 'Dashboard',
'widget_label' => 'Widget',
'widget_width' => 'Width',
'full_width' => 'full width',
'add_widget' => 'Add widget',
'widget_inspector_title' => 'Widget configuration',
'widget_inspector_description' => 'Configure the report widget',
@ -119,15 +120,13 @@ return [
'setup_title' => 'List Setup',
'setup_help' => 'Use checkboxes to select columns you want to see in the list. You can change position of columns by dragging them up or down.',
'records_per_page' => 'Records per page',
'records_per_page_help' => 'Select the number of records per page to display. Please note that high number of records on a single page can reduce performance.',
'apply_changes' => 'Apply changes',
'cancel' => 'Cancel'
'records_per_page_help' => 'Select the number of records per page to display. Please note that high number of records on a single page can reduce performance.'
],
'fileupload' => [
'attachment' => 'Attachment',
'help' => 'Add a title and description for this attachment.',
'title_label' => 'Title',
'description_label' => 'Description'
'attachment' => 'Attachment',
'help' => 'Add a title and description for this attachment.',
'title_label' => 'Title',
'description_label' => 'Description'
],
'form' => [
'create_title' => "New :name",
@ -163,6 +162,7 @@ return [
'select' => 'Select',
'select_all' => 'all',
'select_none' => 'none',
'select_placeholder' => 'please select',
'insert_row' => 'Insert Row',
'delete_row' => 'Delete Row'
],

View File

@ -113,9 +113,7 @@ return [
'setup_title' => 'Configura elenco',
'setup_help' => 'Utilizza le checkbox per selezionare le colonne che vuoi visualizzare nell\'elenco. Puoi cambiare la posizione delle colonne trascinandole verso l\'alto o il basso.',
'records_per_page' => 'Record per pagina',
'records_per_page_help' => 'Seleziona il numero di record da visualizzare su ogni pagina. Ricorda che un numero elevato di record in una singola pagina può ridurre le prestazioni.',
'apply_changes' => 'Applica modifiche',
'cancel' => 'Annulla'
'records_per_page_help' => 'Seleziona il numero di record da visualizzare su ogni pagina. Ricorda che un numero elevato di record in una singola pagina può ridurre le prestazioni.'
],
'form' => [
'create_title' => "Nuovo :name",

View File

@ -14,7 +14,7 @@ return [
'access_denied' => [
'label' => "Toegang geweigerd",
'help' => "Je hebt niet de benodigde rechten om deze pagina te bekijken.",
'cms_link' => "Ga naar CMS backend",
'cms_link' => "Ga naar CMS",
],
],
'partial' => [
@ -25,18 +25,18 @@ return [
'login' => 'Inloggen',
'reset' => 'Wissen',
'restore' => 'Herstellen',
'login_placeholder' => 'gebruikersnaam',
'password_placeholder' => 'wachtwoord',
'login_placeholder' => 'Gebruikersnaam',
'password_placeholder' => 'Wachtwoord',
'forgot_password' => "Wachtwoord vergeten?",
'enter_email' => "Vul het e-mailadres in",
'enter_login' => "Vul de gebruikersnaam in",
'email_placeholder' => "e-mail",
'enter_email' => "Vul jouw e-mailadres in",
'enter_login' => "Vul jouw gebruikersnaam in",
'email_placeholder' => "E-mailadres",
'enter_new_password' => "Vul een nieuw wachtwoord in",
'password_reset' => "Herstel Wachtwoord",
'password_reset' => "Herstel wachtwoord",
'restore_success' => "Een e-mail met instructies om het wachtwoord te herstellen is verzonden naar jouw e-mailadres.",
'restore_error' => "Een gebruiker met de gebruikersnaam ':login' is niet gevonden",
'reset_success' => "Het wachtwoord is succesvol hersteld. Je kan nu inloggen",
'reset_error' => "Ongeldige wachtwoordherstelinformatie aangeboden. Probeer overnieuw!",
'reset_success' => "Het wachtwoord is succesvol hersteld. Je kunt nu inloggen",
'reset_error' => "Ongeldige herstelinformatie aangeboden. Probeer het opnieuw!",
'reset_fail' => "Het is niet mogelijk het wachtwoord te herstellen!",
'apply' => 'Toepassen',
'cancel' => 'Annuleren',
@ -45,36 +45,59 @@ return [
],
'dashboard' => [
'menu_label' => 'Overzicht',
'widget_label' => 'Widget',
'widget_width' => 'Breedte',
'full_width' => 'Volledige breedte',
'add_widget' => 'Widget toevoegen',
'widget_inspector_title' => 'Widget configuratie',
'widget_inspector_description' => 'Configureer de rapportage widget',
'widget_columns_label' => 'Breedte :columns',
'widget_columns_description' => 'De widget breedte, een getal tussen 1 en 10.',
'widget_columns_error' => 'Voer een getal tussen 1 en 10 in als widget breedte.',
'columns' => '{1} kolom|[2,Inf] kolommen',
'widget_new_row_label' => 'Forceer nieuwe rij',
'widget_new_row_description' => 'Plaats de widget in een nieuwe rij.',
'widget_title_label' => 'Widget titel',
'widget_title_error' => 'Een widget title is verplicht.',
'status' => [
'widget_title_default' => 'Systeem status',
'online' => 'online',
'update_available' => '{0} updates beschikbaar!|{1} update beschikbaar!|[2,Inf] updates beschikbaar!',
]
],
'user' => [
'name' => 'Beheerder',
'menu_label' => 'Beheerders',
'list_title' => 'Beheer Beheerders',
'new' => 'Nieuwe Beheerder',
'menu_description' => 'Beheer beheerders, groepen en rechten.',
'list_title' => 'Beheer beheerders',
'new' => 'Nieuwe beheerder',
'login' => "Gebruikersnaam",
'first_name' => "Voornaam",
'last_name' => "Achternaam",
'full_name' => "Volledige Naam",
'email' => "E-mail",
'full_name' => "Volledige naam",
'email' => "E-mailadres",
'groups' => "Groepen",
'groups_comment' => "Voeg de gebruiker eventueel toe aan gebruikersgroepen.",
'groups_comment' => "Selecteer de groepen waar deze gebruiker bij hoort.",
'avatar' => "Avatar",
'password' => "Wachtwoord",
'password_confirmation' => "Bevestig Wachtwoord",
'superuser' => "Speciale Gebruiker",
'password_confirmation' => "Bevestig wachtwoord",
'superuser' => "Supergebruiker",
'superuser_comment' => "Vink deze optie aan om de gebruiker volledige rechten tot het systeem te geven.",
'send_invite' => 'Stuur uitnodiging per e-mail',
'send_invite_comment' => 'Vink deze optie aan om de gebruiker een uitnodiging per e-mail te sturen',
'delete_confirm' => 'Weet je zeker dat je deze beheerder wilt verwijderen?',
'return' => 'Terug naar beheerdersoverzicht',
'return' => 'Terug naar het beheerdersoverzicht',
'allow' => 'Toestaat',
'inherit' => 'Overerven',
'deny' => 'Weigeren',
'group' => [
'name' => 'Groep',
'name_field' => 'Naam',
'menu_label' => 'Groepen',
'list_title' => 'Beheer Groepen',
'new' => 'Nieuwe Beheerdersgroep',
'list_title' => 'Beheer groepen',
'new' => 'Nieuwe beheerdersgroep',
'delete_confirm' => 'Weet je zeker dat je deze beheerdersgroep wilt verwijderen?',
'return' => 'Terug naar groepenoverzicht',
'return' => 'Terug naar het groepenoverzicht',
],
'preferences' => [
'not_authenticated' => 'Er is geen geauthenticeerde gebruiker om gegevens voor te laden of op te slaan.'
@ -85,14 +108,28 @@ return [
'search_prompt' => 'Zoeken...',
'no_records' => 'Er zijn geen resultaten gevonden.',
'missing_model' => 'Geen model opgegeven voor het gedrag (behavior) van de lijst gebruikt in :class.',
'missing_column' => 'Er zijn geen kolommen voor :columns opgegeven.',
'missing_columns' => 'Er zijn geen kolommen opgegeven voor de lijst in :class.',
'missing_column' => 'Er zijn geen kolomdefinities voor :columns.',
'missing_columns' => 'De gebruikte lijst in :class heeft geen kolommen gedefineerd.',
'missing_definition' => "Het gedrag (behavior) van de lijst bevat geen kolom voor ':field'.",
'behavior_not_ready' => 'Gedrag (behavior) van de lijst is niet geladen. Controleer of makeLists() in de controller is aangeroepen.',
'invalid_column_datetime' => "Column value ':column' is not a DateTime object, are you missing a \$dates reference in the Model?",
'invalid_column_datetime' => "De waarde van kolom ':column' is geen DateTime object, mist er een \$dates referentie in het Model?",
'pagination' => 'Getoonde resultaten: :from-:to van :total',
'prev_page' => 'Vorige pagina',
'next_page' => 'Volgende pagina',
'loading' => 'Laden...',
'setup_title' => 'Lijst instellingen',
'setup_help' => 'Selecteer door middel van vinkjes de kolommen welke je in de lijst wilt zien. Je kunt de volgorde van kolommen veranderen door ze omhoog of omlaag te slepen.',
'records_per_page' => 'Resultaten per pagina',
'records_per_page_help' => 'Selecteer het aantal resultaten dat per pagina getoond moet worden. Let op: een hoog getal kan voor prestatieproblemen zorgen.'
],
'fileupload' => [
'attachment' => 'Bijlage',
'help' => 'Voeg een titel en omschrijving toe aan deze bijlage.',
'title_label' => 'Titel',
'description_label' => 'Omschrijving'
],
'form' => [
'create_title' => "Maak :name",
'create_title' => "Nieuwe :name",
'update_title' => "Bewerk :name",
'preview_title' => "Bekijk :name",
'create_success' => ':name is succesvol aangemaakt',
@ -113,6 +150,7 @@ return [
'undefined_tab' => 'Overig',
'field_off' => 'Uit',
'field_on' => 'Aan',
'add' => 'Toevoegen',
'apply' => 'Toepassen',
'cancel' => 'Annuleren',
'close' => 'Sluiten',
@ -120,14 +158,26 @@ return [
'or' => 'of',
'confirm_tab_close' => 'Weet je zeker dat je dit tabblad wilt sluiten? Niet opgeslagen wijzigingen gaan verloren.',
'behavior_not_ready' => 'Gedrag (behavior) van het formulier is niet geladen. Controleer of initForm() in de controller is aangeroepen.',
'preview_no_files_message' => 'Bestanden zijn niet geüploadet',
'select' => 'Selecteer',
'select_all' => 'alles',
'select_none' => 'niets',
'select_placeholder' => 'selecteer',
'insert_row' => 'Rij invoegen',
'delete_row' => 'Rij verwijderen'
],
'relation' => [
'missing_definition' => "Het gedrag (behavior) van de relatie bevat geen kolom voor ':field'.",
'missing_model' => "Geen model opgegeven voor het gedrag (behavior) van relatie gebruikt in :class.",
'invalid_action_single' => "Deze actie kan niet worden uitgevoerd op een enkele (singular) relatie.",
'invalid_action_multi' => "Deze actie kan niet worden uitgevoerd op meerdere (multiple) relatie.",
'help' => "Klik op een item om toe te voegen",
'related_data' => "Gerelateerde :name data",
'add' => "Toevoegen",
'add_name' => ":name Toevoegen",
'add_selected' => "Selectie toevoegen",
'add_a_new' => "Nieuwe :name toevoegen",
'cancel' => "Annuleer",
'add_name' => ":name toevoegen",
'create' => "Maken",
'create_name' => "Maak :name",
'update' => "Update",
@ -136,6 +186,7 @@ return [
'remove_name' => "Verwijder :name",
'delete' => "Wissen",
'delete_name' => "Wis :name",
'delete_confirm' => "Weet je het zeker?",
],
'model' => [
'name' => "Model",
@ -143,25 +194,54 @@ return [
'missing_id' => "Record ID van het model is niet opgegeven.",
'missing_relation' => "Model ':class' bevat geen definitie voor ':relation'.",
'invalid_class' => "Model :model gebruikt in :class is ongeldig. Het moet de \Model klasse erven (inherit).",
'mass_assignment_failed' => "Mass assignment failed for Model attribute ':attribute'.",
'mass_assignment_failed' => "Massa toewijzing voor Model attribute ':attribute' mislukt.",
],
'warnings' => [
'tips' => 'Systeem configuratie tips',
'tips_description' => 'Er zijn fouten opgetreden in uw systeem. Los deze problemen op om uw systeem goed te configureren.',
'tips_description' => 'Er zijn problemen gevonden waar je aandacht aan moet besteden om uw systeem goed te configureren.',
'permissions' => 'De map :name of de submapen zijn niet schrijfbaar voor PHP. Zet de bijhorende rechten voor de webserver in deze map.',
'extension' => 'De PHP extensie :name is niet geinstalleerd. Installeer deze versie en activeer de extensie.'
'extension' => 'De PHP extensie :name is niet geïnstalleerd. Installeer deze bibliotheek en activeer de extensie.'
],
'editor' => [
'menu_label' => 'Bewerker instellingen',
'menu_description' => 'Beheer code bewerker instellingen.',
'font_size' => 'Lettertype grootte',
'tab_size' => 'Tab positie',
'menu_description' => 'Beheer bewerker instellingen, zoals lettergrootte en kleurschema.',
'font_size' => 'Lettergrootte',
'tab_size' => 'Tab grootte',
'use_hard_tabs' => 'Inspringen met tabs',
'code_folding' => 'Code invouwing',
'word_wrap' => 'Tekstterugloop',
'highlight_active_line' => 'Markeer actieve lijnen',
'show_invisibles' => 'Toon verborgen karakters',
'show_gutter' => 'Toon regelnummers',
'show_gutter' => 'Toon "goot"',
'theme' => 'Kleurschema',
],
];
'tooltips' => [
'preview_website' => 'Voorvertoning website'
],
'mysettings' => [
'menu_label' => 'Mijn instellingen',
'menu_description' => 'Instellingen gerelateerd aan jouw beheeraccount',
],
'myaccount' => [
'menu_label' => 'Mijn account',
'menu_description' => 'Werk accountinstellingen zoals naam, e-mailadres en wachtwoord bij.',
'menu_keywords' => 'security login'
],
'backend_preferences' => [
'menu_label' => 'CMS voorkeuren',
'menu_description' => 'Beheer taalvoorkeur en de weergave van het CMS.',
'locale' => 'Taal',
'locale_comment' => 'Selecteer jouw gewenste taal.',
],
'access_log' => [
'hint' => 'Dit logboek toont een lijst met succesvolle inlogpogingen door beheerders. Registraties blijven :days dagen bewaard..',
'menu_label' => 'Toegangslogboek',
'menu_description' => 'Bekijk een lijst met succesvolle inlogpogingen van gebruikers.',
'created_at' => 'Datum & tijd',
'login' => 'Gebruikersnaam',
'ip_address' => 'IP-adres',
'first_name' => 'Voornaam',
'last_name' => 'Achternaam',
'email' => 'E-mailadres',
],
];

View File

@ -0,0 +1,227 @@
<?php
return [
'field' => [
'invalid_type' => 'Tipul campului folosit este invalid - :type.',
'options_method_not_exists' => 'Clasa model :model trebuie sa defineasca o metoda :method() returnand optiuni pentru campul ":field".',
],
'widget' => [
'not_registered' => "Un nume de clasa de widget ':name' nu a fost inregistrat",
'not_bound' => "Un widget cu numele de clasa ':name' nu a fost mapat la controller",
],
'page' => [
'untitled' => "Fara titlu",
'access_denied' => [
'label' => "Acces restrictionat",
'help' => "Nu aveti permisiuni pentru a vizualiza aceasta pagina.",
'cms_link' => "Inapoi in panoul de administrare",
],
],
'partial' => [
'not_found' => "Partialul ':name' nu a fost gasit.",
],
'account' => [
'sign_out' => 'Deconectare',
'login' => 'Login',
'reset' => 'Resetare',
'restore' => 'Restaurare',
'login_placeholder' => 'login',
'password_placeholder' => 'password',
'forgot_password' => "Ati uitat parola?",
'enter_email' => "Introduceti email",
'enter_login' => "Introduceti login",
'email_placeholder' => "email",
'enter_new_password' => "Introduceti o noua parola",
'password_reset' => "Resetare parola",
'restore_success' => "Un mesaj a fost trimis catre adresa de email cu instructiuni pentru resetarea parolei.",
'restore_error' => "Utilizatorul ':login' nu a fost gasit in sistem.",
'reset_success' => "Parola a fost resetata cu succes. Va puteti conecta.",
'reset_error' => "Date invalide pentru resetarea parolei. Va rugam incercati din nou!",
'reset_fail' => "Eroare la resetarea parolei!",
'apply' => 'Aplicare',
'cancel' => 'Anulare',
'delete' => 'Stergere',
'ok' => 'OK',
],
'dashboard' => [
'menu_label' => 'Dashboard',
'widget_label' => 'Widget',
'widget_width' => 'Latime',
'add_widget' => 'Adauga widget',
'widget_inspector_title' => 'Configurare widget',
'widget_inspector_description' => 'Configurare raport widget',
'widget_columns_label' => 'Latime :columns',
'widget_columns_description' => 'Latime widget, un numar intre 1 si 10.',
'widget_columns_error' => 'Va rugam sa introduceti latimea widget-ului ca un numar intre 1 si 10.',
'columns' => '{1} coloana|[2,Inf] coloane',
'widget_new_row_label' => 'Forteaza rand nou',
'widget_new_row_description' => 'Amplasare widget pe un rand nou.',
'widget_title_label' => 'Titlu widget',
'widget_title_error' => 'Titlul widget-ului este necesar.',
'status' => [
'widget_title_default' => 'Status sistem',
'online' => 'online',
'update_available' => '{0} actualizari disponibile!|{1} actualizare disponibila!|[2,Inf] actualizari disponibile!',
]
],
'user' => [
'name' => 'Administrator',
'menu_label' => 'Administratori',
'menu_description' => 'Gestionare administratori, grupuri si permisiuni.',
'list_title' => 'Gestionare Administratori',
'new' => 'Administrator nou',
'login' => "Login",
'first_name' => "Prenume",
'last_name' => "Nume",
'full_name' => "Nume complet",
'email' => "Email",
'groups' => "Grupuri",
'groups_comment' => "Specificati grupurile aferente acestei persoane.",
'avatar' => "Avatar",
'password' => "Parola",
'password_confirmation' => "Confirmare Parola",
'superuser' => "Super Utilizator",
'superuser_comment' => "Bifati aceasta bifa pentru a permite acestei persoane sa aiba acces deplin.",
'send_invite' => 'Trimitere invitatie prin email',
'send_invite_comment' => 'Folositi aceasta bifa pentru a trimite o invitatie prin email catre utilizator',
'delete_confirm' => 'Sunteti sigur(a) ca vreti sa stergeti acest administrator?',
'return' => 'Intoarcere la lista de administratori',
'group' => [
'name' => 'Grup',
'name_field' => 'Nume',
'menu_label' => 'Grupuri',
'list_title' => 'Gestionare Grupuri',
'new' => 'Grup Nou de Administratori',
'delete_confirm' => 'Sunteti sigur(a) ca vreti sa stergeti acest grup de administratori?',
'return' => 'Intoarcere la lista de grupuri',
],
'preferences' => [
'not_authenticated' => 'Nu exista niciun utilizator autentificat pentru care sa se incarce sau salveze preferinte.'
]
],
'list' => [
'default_title' => 'Lista',
'search_prompt' => 'Cautare...',
'no_records' => 'Nu exista inregistari pentru aceasta fereastra.',
'missing_model' => 'Lista folosita in clasa :class nu are un model definit.',
'missing_column' => 'Nu exista denifitii pentru coloana :columns.',
'missing_columns' => 'Lista folosita in clasa :class nu are coloane definite.',
'missing_definition' => "Lista nu contine o coloana pentru campul ':field'.",
'behavior_not_ready' => 'Setarile initiale ale listei nu au fost definite, verificati existenta functiei makeLists() in controller.',
'invalid_column_datetime' => "Valoarea coloanei ':column' nu este un obiect de tip DateTime, verificati existenta unei referinte \$dates in Model?",
'pagination' => 'Afisare inregistrari: :from-:to din :total',
'setup_title' => 'Setare lista',
'setup_help' => 'Folositi bife pentru a selecta coloanele pe care doriti sa le vedeti in lista. Puteti modifica pozitia coloanelor glisandu-le in sus sau in jos.',
'records_per_page' => 'Inregistari pe pagina',
'records_per_page_help' => 'Selectati numarul de inregistari care sa fie afisat pe pagina. Sa tineti cont de faptul ca un numar mare de inregistari pe o singura pagina poate sa reduca performanta.',
'apply_changes' => 'Aplicare schimbari',
'cancel' => 'Anulare'
],
'form' => [
'create_title' => "Nou :name",
'update_title' => "Editare :name",
'preview_title' => "Previzualizare :name",
'create_success' => ':name a fost creat cu succes',
'update_success' => ':name a fost actualizat cu succes',
'delete_success' => ':name a fost sters cu succes',
'missing_id' => "ID-ul inregistrarii formularului nu a fost specificat.",
'missing_model' => 'Formularul folosit in clasa :class nu are un model definit.',
'missing_definition' => "Formularul nu contine un camp pentru campul ':field'.",
'not_found' => 'Inregistrarea formularului cu ID-ul :id nu a putut fi gasita.',
'create' => 'Creare',
'create_and_close' => 'Creare si inchidere',
'creating' => 'Se creeaza...',
'save' => 'Salvare',
'save_and_close' => 'Salvare si inchidere',
'saving' => 'Se salveaza...',
'delete' => 'Stergere',
'deleting' => 'Se sterge...',
'undefined_tab' => 'Altele',
'field_off' => 'Dezactivat',
'field_on' => 'Activat',
'add' => 'Adaugare',
'apply' => 'Aplicare',
'cancel' => 'Anulare',
'close' => 'Inchidere',
'ok' => 'OK',
'or' => 'sau',
'confirm_tab_close' => 'Sunteti sigur(a) ca doriti sa inchideti acest tab? Modificarile nesalvate vor fi pierdute.',
'behavior_not_ready' => 'Setarile initiale ale formularului nu au fost definite, verificati existenta functiei initForm() in controller.',
'preview_no_files_message' => 'Fisierele nu au fost incarcate',
'select' => 'Selectare',
'select_all' => 'toate',
'select_none' => 'niciunul',
],
'relation' => [
'missing_definition' => "Relatia nu contine definitii pentru campul ':field'.",
'missing_model' => "Relatia folosita in clasa :class nu are un model definit.",
'invalid_action_single' => "Aceasta actiune nu poate fi realizata pentru o relatie singulara.",
'invalid_action_multi' => "Aceasta actiune nu poate fi realizata pentru o relatie multipla.",
'add' => "Adaugare",
'add_name' => "Adaugare :name",
'create' => "Creare",
'create_name' => "Creare :name",
'update' => "Actualizare",
'update_name' => "Actualizare :name",
'remove' => "Inlaturare",
'remove_name' => "Inlaturare :name",
'delete' => "Stergere",
'delete_name' => "Stergere :name",
],
'model' => [
'name' => "Model",
'not_found' => "Modelul ':class' cu ID-ul :id nu a putut fi gasit",
'missing_id' => "Nu exista niciun ID specificat pentru care sa se realizeze cautarea inregistrarii modelului.",
'missing_relation' => "Modelul ':class' nu contine o definitie pentru relatia ':relation'.",
'invalid_class' => "Modelul :model folosit in clasa :class nu este valid, trebuie sa mosteneasca clasa \Model.",
'mass_assignment_failed' => "Atribuirea in masa a esuat pentru atributul modelului ':attribute'.",
],
'warnings' => [
'tips' => 'Sfaturi pentru configurarea sistemului',
'tips_description' => 'Exista anumite conditii care necesita atentie pentru a configura sistemul corect.',
'permissions' => 'Directorul :name si subdirectoarele sale nu au permisiuni de scriere pentru PHP. Va rugam sa setati permisiunile corespunzatoare pentru acest director.',
'extension' => 'Libraria PHP :name nu este instalata. Va rugam sa instalati aceasta librarie si apoi sa activati extensia.'
],
'editor' => [
'menu_label' => 'Preferinte Editor Cod',
'menu_description' => 'Personalizati preferintele editorului de cod, preferinte precum dimensiunea fontului si culorile folosite.',
'font_size' => 'Dimensiune font',
'tab_size' => 'Lungime tab',
'use_hard_tabs' => 'Indentare folosind tab-uri',
'code_folding' => 'Code folding',
'word_wrap' => 'Word wrap',
'highlight_active_line' => 'Evidentiere linie activa',
'show_invisibles' => 'Arata caractere invizibile',
'show_gutter' => 'Afiseaza panou',
'theme' => 'Schema culori',
],
'tooltips' => [
'preview_website' => 'Previzualizare site'
],
'mysettings' => [
'menu_label' => 'Setarile mele',
'menu_description' => 'Setarile in legatura cu contul de administrare',
],
'myaccount' => [
'menu_label' => 'Contul meu',
'menu_description' => 'Actualizati datele contului, precum nume, adresa de email si parola.',
'menu_keywords' => 'securitate login'
],
'backend_preferences' => [
'menu_label' => 'Preferinte administrare',
'menu_description' => 'Gestionati preferinte limba si setari aspect panou de administrare.',
'locale' => 'Limba',
'locale_comment' => 'Selectati limba dorita.',
],
'access_log' => [
'hint' => 'Acest jurnal afiseaza o lista de conectari reusite, realizate de catre administratori. Inregistrarile sunt pastrate pentru un numar total de :days zile.',
'menu_label' => 'Jurnal acces',
'menu_description' => 'Vizualizati o lista de conectari reusite, realizate de catre administratori.',
'created_at' => 'Data & Ora',
'login' => 'Login',
'ip_address' => 'Adresa IP',
'first_name' => 'Prenume',
'last_name' => 'Nume',
'email' => 'Email',
],
];

View File

@ -47,7 +47,23 @@ return [
'menu_label' => 'Панель управления',
'widget_label' => 'Виджет',
'widget_width' => 'Ширина',
'full_width' => 'полная ширина',
'add_widget' => 'Добавить виджет',
'widget_inspector_title' => 'Конфигурации виджета',
'widget_inspector_description' => 'Настройка отображения виджета',
'widget_columns_label' => 'Ширина :columns',
'widget_columns_description' => 'Ширина виджета может варьироваться от 1 до 10.',
'widget_columns_error' => 'Пожалуйста, выберите ширину виджета.',
'columns' => '{1} колонка|[2,4] колонки|[5,Inf] колонок',
'widget_new_row_label' => 'Новая строка',
'widget_new_row_description' => 'Поставить виджет с новой строки.',
'widget_title_label' => 'Заголовок',
'widget_title_error' => 'Заголовок виджета обязателен.',
'status' => [
'widget_title_default' => 'Статус системы',
'online' => 'Онлайн',
'update_available' => '{0} нет новый обновлений!|{1} доступно новое обновление!|[2,Inf] доступны новые обновления!',
]
],
'user' => [
'name' => 'Администратора',
@ -71,6 +87,9 @@ return [
'send_invite_comment' => 'Используйте эту опцию, чтобы отправить приглашение пользователю по электронной почте',
'delete_confirm' => 'Вы действительно хотите удалить этого администратора?',
'return' => 'Вернуться к списку администраторов',
'allow' => 'Разрешить',
'inherit' => 'Наследовать',
'deny' => 'Запретить',
'group' => [
'name' => 'Группы',
'name_field' => 'Название',
@ -94,6 +113,20 @@ return [
'missing_definition' => "Поведение списка не содержит столбец для ':field'.",
'behavior_not_ready' => 'Поведение списка не было инициализировано, проверьте вызов makeLists() в вашем контроллере.',
'invalid_column_datetime' => "Значение столбца ':column' не является объектом DateTime. Отсутствует \$dates ссылка в модели?",
'pagination' => 'Отображено записей: :from-:to из :total',
'prev_page' => 'Предыдущая страница',
'next_page' => 'Следующая страница',
'loading' => 'Загрузка...',
'setup_title' => 'Настройка списка',
'setup_help' => 'Используйте флажки для выбора колонок, которые вы хотите видеть в списке. Вы можете изменить положение столбцов, перетаскивая их вверх или вниз.',
'records_per_page' => 'Записей на странице',
'records_per_page_help' => 'Выберите количество записей на странице для отображения. Обратите внимание, что большое количество записей на одной странице может привести к снижению производительности.'
],
'fileupload' => [
'attachment' => 'Приложение',
'help' => 'Добавьте заголовок и описание для этого вложения.',
'title_label' => 'Название',
'description_label' => 'Описание'
],
'form' => [
'create_title' => "Создание :name",
@ -129,14 +162,22 @@ return [
'select' => 'Выбрать',
'select_all' => 'все',
'select_none' => 'ничего',
'select_placeholder' => 'Пожалуйста, выберите',
'insert_row' => 'Вставить строку',
'delete_row' => 'Удалить строку'
],
'relation' => [
'missing_definition' => "Поведение отношения не содержит определения для ':field'.",
'missing_model' => "Для поведения отношения, используемого в :class не определена модель.",
'invalid_action_single' => "Это действие не может быть выполнено для особого отношения.",
'invalid_action_multi' => "Это действие не может быть выполнено для множественных отношений.",
'help' => "Нажмите на элемент, который нужно добавить",
'related_data' => "Связанные :name данные",
'add' => "Добавить",
'add_name' => "Добавление :name",
'add_selected' => "Добавить выбранные",
'add_a_new' => "Добавить новый :name",
'cancel' => "Отмена",
'add_name' => "Добавить :name",
'create' => "Создать",
'create_name' => "Создание :name",
'update' => "Update",
@ -145,6 +186,7 @@ return [
'remove_name' => "Удаление :name",
'delete' => "Удалить",
'delete_name' => "Удаление :name",
'delete_confirm' => "Вы уверены?",
],
'model' => [
'name' => "Модель",

View File

@ -38,6 +38,7 @@ class BackendPreferences extends Model
'de' => [Lang::get('system::lang.locale.de'), 'flag-de'],
'fr' => [Lang::get('system::lang.locale.fr'), 'flag-fr'],
'it' => [Lang::get('system::lang.locale.it'), 'flag-it'],
'ro' => [Lang::get('system::lang.locale.ro'), 'flag-ro'],
];
// Sort the locales alphabetically

View File

@ -45,7 +45,7 @@ class Form extends WidgetBase
/**
* @var array Collection of all fields used in this form.
*/
protected $allFields = [];
protected $fields = [];
/**
* @var array Collection of all form widgets used in this form.
@ -179,10 +179,10 @@ class Form extends WidgetBase
public function renderField($field, $options = [])
{
if (is_string($field)) {
if (!isset($this->allFields[$field]))
if (!isset($this->fields[$field]))
throw new ApplicationException(Lang::get('backend::lang.form.missing_definition', compact('field')));
$field = $this->allFields[$field];
$field = $this->fields[$field];
}
if (!isset($options['useContainer'])) $options['useContainer'] = true;
@ -241,7 +241,7 @@ class Form extends WidgetBase
$this->model->fill($data);
$this->data = (object) array_merge((array) $this->data, (array) $data);
foreach ($this->allFields as $field)
foreach ($this->fields as $field)
$field->value = $this->getFieldValue($field);
return $data;
@ -274,10 +274,10 @@ class Form extends WidgetBase
if (($updateFields = post('fields')) && is_array($updateFields)) {
foreach ($updateFields as $field) {
if (!isset($this->allFields[$field]))
if (!isset($this->fields[$field]))
continue;
$fieldObject = $this->allFields[$field];
$fieldObject = $this->fields[$field];
$result['#' . $fieldObject->getId('group')] = $this->makePartial('field', ['field' => $fieldObject]);
}
}
@ -357,7 +357,7 @@ class Form extends WidgetBase
/*
* Bind all form widgets to controller
*/
foreach ($this->allFields as $field) {
foreach ($this->fields as $field) {
if ($field->type != 'widget')
continue;
@ -413,7 +413,7 @@ class Form extends WidgetBase
continue;
}
$this->allFields[$name] = $fieldObj;
$this->fields[$name] = $fieldObj;
switch (strtolower($addToArea)) {
case 'primary':
@ -589,7 +589,7 @@ class Form extends WidgetBase
*/
public function getFields()
{
return $this->allFields;
return $this->fields;
}
/**
@ -599,7 +599,7 @@ class Form extends WidgetBase
*/
public function getField($field)
{
return $this->allFields[$field];
return $this->fields[$field];
}
/**
@ -621,10 +621,10 @@ class Form extends WidgetBase
public function getFieldValue($field)
{
if (is_string($field)) {
if (!isset($this->allFields[$field]))
if (!isset($this->fields[$field]))
throw new ApplicationException(Lang::get('backend::lang.form.missing_definition', compact('field')));
$field = $this->allFields[$field];
$field = $this->fields[$field];
}
$columnName = $field->columnName;
@ -694,7 +694,7 @@ class Form extends WidgetBase
* Boolean fields (checkbox, switch) won't be present value FALSE
* Number fields should be converted to integers
*/
foreach ($this->allFields as $field) {
foreach ($this->fields as $field) {
if (!in_array($field->type, ['switch', 'checkbox', 'number']))
continue;

View File

@ -46,7 +46,7 @@ class Lists extends WidgetBase
protected $visibleColumns;
/**
* @var array All available columns.
* @var array Collection of all list columns used in this list.
*/
protected $columns;
@ -265,9 +265,10 @@ class Lists extends WidgetBase
protected function prepareModel()
{
$query = $this->model->newQuery();
$selects = [$this->model->getTable().'.*'];
$tables = ['base'=>$this->model->getTable()];
$primaryTable = $this->model->getTable();
$selects = [$primaryTable.'.*'];
$joins = [];
$withs = [];
/*
* Extensibility
@ -276,70 +277,134 @@ class Lists extends WidgetBase
$this->fireEvent('list.extendQueryBefore', [$query]);
/*
* Related custom selects, must come first
* Prepare searchable column names
*/
foreach ($this->getVisibleListColumns() as $column) {
if (!isset($column->relation) || !isset($column->sqlSelect))
continue;
$primarySearchable = [];
$relationSearchable = [];
if (!$this->model->hasRelation($column->relation))
throw new ApplicationException(Lang::get('backend::lang.model.missing_relation', ['class'=>get_class($this->model), 'relation'=>$column->relation]));
$columnsToSearch = [];
if (!empty($this->searchTerm) && ($searchableColumns = $this->getSearchableColumns())) {
foreach ($searchableColumns as $column) {
/*
* Related
*/
if ($this->isColumnRelated($column)) {
$table = $this->model->makeRelation($column->relation)->getTable();
$columnName = isset($column->sqlSelect)
? DbDongle::raw($this->parseTableName($column->sqlSelect, $table))
: $table . '.' . $column->nameFrom;
$alias = Db::getQueryGrammar()->wrap($column->columnName);
$table = $this->model->makeRelation($column->relation)->getTable();
$relationType = $this->model->getRelationType($column->relation);
$sqlSelect = $this->parseTableName($column->sqlSelect, $table);
$relationSearchable[$column->relation][] = $columnName;
}
/*
* Primary
*/
else {
$columnName = isset($column->sqlSelect)
? DbDongle::raw($this->parseTableName($column->sqlSelect, $primaryTable))
: $primaryTable . '.' . $column->columnName;
if (in_array($relationType, ['hasMany', 'belongsToMany', 'morphToMany', 'morphedByMany', 'morphMany', 'attachMany', 'hasManyThrough']))
$selects[] = DbDongle::raw("group_concat(" . $sqlSelect . " separator ', ') as ". $alias);
else
$selects[] = DbDongle::raw($sqlSelect . ' as '. $alias);
$joins[] = $column->relation;
$tables[$column->relation] = $table;
$primarySearchable[] = $columnName;
}
}
}
if ($joins)
$query->joinWith(array_unique($joins), false);
/*
* Prepare related eager loads (withs) and custom selects (joins)
*/
foreach ($this->getVisibleListColumns() as $column) {
if (!$this->isColumnRelated($column) || (!isset($column->sqlSelect) && !isset($column->nameFrom)))
continue;
if (isset($column->nameFrom))
$withs[] = $column->relation;
$joins[] = $column->relation;
}
/*
* Include any relation constraints
*/
if ($joins) {
foreach (array_unique($joins) as $join) {
/*
* Apply a supplied search term for relation columns and
* constrain the query only if there is something to search for
*/
$columnsToSearch = array_get($relationSearchable, $join, []);
if (count($columnsToSearch) > 0) {
$query->whereHas($join, function($_query) use ($columnsToSearch) {
$_query->searchWhere($this->searchTerm, $columnsToSearch);
});
}
}
}
/*
* Add eager loads to the query
*/
if ($withs) {
$query->with(array_unique($withs));
}
/*
* Custom select queries
*/
foreach ($this->getVisibleListColumns() as $column) {
if (!isset($column->sqlSelect) || isset($column->relation))
if (!isset($column->sqlSelect))
continue;
$alias = Db::getQueryGrammar()->wrap($column->columnName);
$sqlSelect = $this->parseTableName($column->sqlSelect, $tables['base']);
$selects[] = DbDongle::raw($sqlSelect . ' as '. $alias);
/*
* Relation column
*/
if (isset($column->relation)) {
$table = $this->model->makeRelation($column->relation)->getTable();
$relationType = $this->model->getRelationType($column->relation);
$sqlSelect = $this->parseTableName($column->sqlSelect, $table);
/*
* Manipulate a count query for the sub query
*/
$relationObj = $this->model->{$column->relation}();
$countQuery = $relationObj->getRelationCountQuery($relationObj->getRelated()->newQuery(), $query);
$joinSql = $this->isColumnRelated($column, true)
? DbDongle::raw("group_concat(" . $sqlSelect . " separator ', ')")
: DbDongle::raw($sqlSelect);
$joinSql = $countQuery->select($joinSql)->toSql();
$selects[] = Db::raw("(".$joinSql.") as ".$alias);
}
/*
* Primary column
*/
else {
$sqlSelect = $this->parseTableName($column->sqlSelect, $primaryTable);
$selects[] = DbDongle::raw($sqlSelect . ' as '. $alias);
}
}
/*
* Handle a supplied search term
* Apply a supplied search term for primary columns
*/
if (!empty($this->searchTerm) && ($searchableColumns = $this->getSearchableColumns())) {
$query->orWhere(function($innerQuery) use ($searchableColumns, $tables) {
$columnsToSearch = [];
foreach ($searchableColumns as $column) {
if (isset($column->sqlSelect)) {
$table = (isset($column->relation)) ? $tables[$column->relation] : 'base';
$columnName = DbDongle::raw($this->parseTableName($column->sqlSelect, $table));
}
else
$columnName = $tables['base'] . '.' . $column->columnName;
$columnsToSearch[] = $columnName;
}
$innerQuery->searchWhere($this->searchTerm, $columnsToSearch);
if (count($primarySearchable) > 0) {
$query->orWhere(function($innerQuery) use ($primarySearchable) {
$innerQuery->searchWhere($this->searchTerm, $primarySearchable);
});
}
/*
* Handle sorting
* Apply sorting
*/
if ($sortColumn = $this->getSortColumn()) {
if (($column = array_get($this->columns, $sortColumn)) && $column->sqlSelect)
$sortColumn = $column->sqlSelect;
$query->orderBy($sortColumn, $this->sortDirection);
}
@ -350,15 +415,17 @@ class Lists extends WidgetBase
$callback($query);
}
/*
* Add custom selects
*/
$query->select($selects);
/*
* Extensibility
*/
Event::fire('backend.list.extendQuery', [$this, $query]);
$this->fireEvent('list.extendQuery', [$query]);
// Grouping due to the joinWith() call
$query->select($selects);
$query->groupBy($this->model->getQualifiedKeyName());
return $query;
}
@ -414,12 +481,31 @@ class Lists extends WidgetBase
return Html::attributes(['onclick' => $recordOnClick]);
}
/**
* Get all the registered columns for the instance.
* @return array
*/
public function getColumns()
{
return $this->columns ?: $this->defineListColumns();
}
/**
* Get a specified column object
* @param string $column
* @return mixed
*/
public function getColumn($column)
{
return $this->columns[$column];
}
/**
* Returns the list columns that are visible by list settings or default
*/
protected function getVisibleListColumns()
{
$definitions = $this->getListColumns();
$definitions = $this->defineListColumns();
$columns = [];
/*
@ -457,7 +543,7 @@ class Lists extends WidgetBase
/**
* Builds an array of list columns with keys as the column name and values as a ListColumn object.
*/
protected function getListColumns()
protected function defineListColumns()
{
if (!isset($this->config->columns) || !is_array($this->config->columns) || !count($this->config->columns))
throw new ApplicationException(Lang::get('backend::lang.list.missing_columns', ['class'=>get_class($this->controller)]));
@ -555,16 +641,33 @@ class Lists extends WidgetBase
*/
public function getColumnValue($record, $column)
{
$columnName = $column->columnName;
/*
* If the column is a relation, it will be a custom select,
* Handle taking name from model attribute.
*/
if ($column->nameFrom) {
if (!array_key_exists($columnName, $record->getRelations()))
$value = null;
elseif ($this->isColumnRelated($column, true))
$value = implode(', ', $record->{$columnName}->lists($column->nameFrom));
elseif ($this->isColumnRelated($column))
$value = $record->{$columnName}->{$column->nameFrom};
else
$value = $record->{$column->nameFrom};
}
/*
* Otherwise, if the column is a relation, it will be a custom select,
* so prevent the Model from attempting to load the relation
* if the value is NULL.
*/
$columnName = $column->columnName;
if ($record->hasRelation($columnName) && array_key_exists($columnName, $record->attributes))
$value = $record->attributes[$columnName];
else
$value = $record->{$columnName};
else {
if ($record->hasRelation($columnName) && array_key_exists($columnName, $record->attributes))
$value = $record->attributes[$columnName];
else
$value = $record->{$columnName};
}
if (method_exists($this, 'eval'. studly_case($column->type) .'TypeValue'))
$value = $this->{'eval'. studly_case($column->type) .'TypeValue'}($record, $column, $value);
@ -613,6 +716,9 @@ class Lists extends WidgetBase
{
return $this->controller->makePartial($column->path ?: $column->columnName, [
'listColumn' => $column,
'listRecord' => $record,
'listValue' => $value,
'column' => $column,
'record' => $record,
'value' => $value
]);
@ -738,7 +844,7 @@ class Lists extends WidgetBase
*/
protected function getSearchableColumns()
{
$columns = $this->columns ?: $this->getListColumns();
$columns = $this->getColumns();
$searchable = [];
foreach ($columns as $column) {
@ -848,7 +954,7 @@ class Lists extends WidgetBase
if ($this->sortableColumns !== null)
return $this->sortableColumns;
$columns = $this->columns ?: $this->getListColumns();
$columns = $this->getColumns();
$sortable = [];
foreach ($columns as $column) {
@ -912,12 +1018,12 @@ class Lists extends WidgetBase
/*
* Force all columns invisible
*/
$allColumns = $this->getListColumns();
foreach ($allColumns as $column) {
$columns = $this->defineListColumns();
foreach ($columns as $column) {
$column->invisible = true;
}
return array_merge($allColumns, $this->getVisibleListColumns());
return array_merge($columns, $this->getVisibleListColumns());
}
//
@ -962,4 +1068,38 @@ class Lists extends WidgetBase
return $this->onRefresh();
}
//
// Helpers
//
/**
* Check if column refers to a relation of the model
* @param ListColumn $column List column object
* @param boolean $multi If set, returns true only if the relation is a "multiple relation type"
* @return boolean
*/
protected function isColumnRelated($column, $multi = false)
{
if (!isset($column->relation))
return false;
if (!$this->model->hasRelation($column->relation))
throw new ApplicationException(Lang::get('backend::lang.model.missing_relation', ['class'=>get_class($this->model), 'relation'=>$column->relation]));
if (!$multi)
return true;
$relationType = $this->model->getRelationType($column->relation);
return in_array($relationType, [
'hasMany',
'belongsToMany',
'morphToMany',
'morphedByMany',
'morphMany',
'attachMany',
'hasManyThrough'
]);
}
}

View File

@ -117,7 +117,7 @@ class ReportContainer extends WidgetBase
{
$sizes = [];
for ($i = 1; $i <= 10; $i++)
$sizes[$i] = $i < 10 ? $i : $i.' (full width)';
$sizes[$i] = $i < 10 ? $i : $i.' (' . Lang::get('backend::lang.dashboard.full_width') . ')';
$this->vars['sizes'] = $sizes;
$this->vars['widgets'] = WidgetManager::instance()->listReportWidgets();

View File

@ -1,2 +1,9 @@
<!-- Partial -->
<?= $this->controller->makePartial($field->path ?: $field->columnName) ?>
<?= $this->controller->makePartial($field->path ?: $field->columnName, [
'formModel' => $formModel,
'formField' => $field,
'formValue' => $field->value,
'model' => $formModel,
'field' => $field,
'value' => $field->value
]) ?>

View File

@ -54,13 +54,13 @@
data-request="<?= $this->getEventHandler('onApplySetup') ?>"
data-dismiss="popup"
data-stripe-load-indicator>
<?= e(trans('backend::lang.list.apply_changes')) ?>
<?= e(trans('backend::lang.form.apply')) ?>
</button>
<button
type="button"
class="btn btn-default"
data-dismiss="popup">
<?= e(trans('backend::lang.list.cancel')) ?>
<?= e(trans('backend::lang.form.cancel')) ?>
</button>
</div>
<?= Form::close() ?>

View File

@ -10,7 +10,7 @@
<div class="modal-body">
<div class="form-group">
<label><?= e(trans('backend::lang.dashboard.widget_label')) ?></label>
<select class="form-control custom-select" name="className" data-placeholder="please select">
<select class="form-control custom-select" name="className" data-placeholder="<?= e(trans('backend::lang.form.select_placeholder')) ?>">
<option></option>
<?php foreach ($widgets as $className => $widgetInfo):?>
<option value="<?= e($className) ?>"><?= isset($widgetInfo['label']) ? e(trans($widgetInfo['label'])) : $className ?></option>

View File

@ -107,13 +107,21 @@ class CodeBase extends Extendable implements ArrayAccess
/**
* This object is referenced as $this->page in Cms\Classes\ComponentBase,
* so to avoid $this->page->page this method will proxy there.
* so to avoid $this->page->page this method will proxy there. This is also
* used as a helper for accessing controller variables/components easier
* in the page code, eg. $this->foo instead of $this['foo']
* @param string $name
* @return void
*/
public function __get($name)
{
return $this->page->{$name};
if (($value = $this->page->{$name}) !== null)
return $value;
if (array_key_exists($name, $this->controller->vars))
return $this[$name];
return null;
}
/**

View File

@ -195,6 +195,15 @@ class Controller extends BaseController
$this->pageObj->onInit();
CmsException::unmask();
/*
* Extensibility
*/
if ($event = $this->fireEvent('page.init', [$url, $page], true))
return $event;
if ($event = Event::fire('cms.page.init', [$this, $url, $page], true))
return $event;
/*
* Execute AJAX event
*/
@ -255,7 +264,10 @@ class Controller extends BaseController
{
$this->loader = new TwigLoader();
$options = ['auto_reload' => true];
$options = [
'auto_reload' => true,
'debug' => Config::get('app.debug', false),
];
if (!Config::get('cms.twigNoCache'))
$options['cache'] = storage_path().'/twig';
@ -481,6 +493,15 @@ class Controller extends BaseController
return false;
}
/**
* Invokes the current page cycle without rendering the page,
* used by AJAX handler that may rely on the logic inside the action.
*/
public function pageCycle()
{
return $this->execPageCycle();
}
/**
* Executes the page life cycle.
* Creates an object from the PHP sections of the page and
@ -548,7 +569,18 @@ class Controller extends BaseController
*/
public function renderPage()
{
return $this->pageContents;
$contents = $this->pageContents;
/*
* Extensibility
*/
if ($event = $this->fireEvent('page.render', [$contents], true))
return $event;
if ($event = Event::fire('cms.page.render', [$this, $contents], true))
return $event;
return $contents;
}
/**

View File

@ -15,7 +15,7 @@ class Page extends CmsCompoundObject
{
protected $settingsValidationRules = [
'title' => 'required',
'url' => ['required', 'regex:/^\/[a-z0-9\/\:_\-\*\[\]\+\?\|]*$/i']
'url' => ['required', 'regex:/^\/[a-z0-9\/\:_\-\*\[\]\+\?\|\.]*$/i']
];
/**

View File

@ -83,7 +83,6 @@ class Router
/*
* Find the page by URL and cache the route
*/
if (!$fileName) {
$router = $this->getRouterObject();
@ -105,9 +104,8 @@ class Router
}
/*
* Return the page
* Return the page
*/
if ($fileName) {
if (($page = Page::loadCached($this->theme, $fileName)) === null) {
/*
@ -232,6 +230,16 @@ class Router
Cache::forget($this->getCacheKey('cms-url-list'));
}
/**
* Sets the current routing parameters.
* @param array $parameters
* @return array
*/
public function setParameters(array $parameters)
{
$this->parameters = $parameters;
}
/**
* Returns the current routing parameters.
* @return array

View File

@ -162,15 +162,15 @@ class Index extends Controller
/*
* Extensibility
*/
Event::fire('cms.template.save', [$this, $type]);
$this->fireEvent('cms.template.save', [$type]);
Event::fire('cms.template.save', [$this, $template, $type]);
$this->fireEvent('template.save', [$template, $type]);
Flash::success(Lang::get('cms::lang.template.saved'));
$result = [
'templatePath' => $template->fileName,
'templatePath' => $template->fileName,
'templateMtime' => $template->mtime,
'tabTitle' => $this->getTabTitle($type, $template)
'tabTitle' => $this->getTabTitle($type, $template)
];
if ($type == 'page') {
@ -235,7 +235,7 @@ class Index extends Controller
* Extensibility
*/
Event::fire('cms.template.delete', [$this, $type]);
$this->fireEvent('cms.template.delete', [$type]);
$this->fireEvent('template.delete', [$type]);
return [
'deleted' => $deleted,
@ -256,7 +256,7 @@ class Index extends Controller
* Extensibility
*/
Event::fire('cms.template.delete', [$this, $type]);
$this->fireEvent('cms.template.delete', [$type]);
$this->fireEvent('template.delete', [$type]);
}
public function onGetTemplateList()

View File

@ -34,7 +34,7 @@ return [
'menu_label' => 'Seiten',
'no_list_records' => 'Keine Seiten gefunden',
'new' => 'Neue Seite',
'invalid_url' => 'Ungültiges URL-Format. Die URL muss mit einem Slash beginnen und darf nur Ziffern, lateinische Zeichen und die folgenden Symbole beinhalten: _-[]:?|/+*',
'invalid_url' => 'Ungültiges URL-Format. Die URL muss mit einem Slash beginnen und darf nur Ziffern, lateinische Zeichen und die folgenden Symbole beinhalten: ._-[]:?|/+*',
'delete_confirm_multiple' => 'Wollen Sie die ausgewählten Seiten wirklich löschen?',
'delete_confirm_single' => 'Wollen Sie diese Seite wirklich löschen?',
'no_layout' => '-- Kein Layout --'

View File

@ -40,7 +40,7 @@ return [
'menu_label' => 'Pages',
'no_list_records' => 'No pages found',
'new' => 'New page',
'invalid_url' => 'Invalid URL format. The URL should start with the forward slash symbol and can contain digits, Latin letters and the following symbols: _-[]:?|/+*',
'invalid_url' => 'Invalid URL format. The URL should start with the forward slash symbol and can contain digits, Latin letters and the following symbols: ._-[]:?|/+*',
'delete_confirm_multiple' => 'Do you really want to delete selected pages?',
'delete_confirm_single' => 'Do you really want delete this page?',
'no_layout' => '-- no layout --'

View File

@ -40,7 +40,7 @@ return [
'menu_label' => 'Pages',
'no_list_records' => 'Aucune page trouvée',
'new' => 'Nouvelle page',
'invalid_url' => 'Format d\'URL invalide. L\'URL doit commencer par un / et peut contenit des chiffres, des lettres et les symboles suivants: _-[]:?|/+*',
'invalid_url' => 'Format d\'URL invalide. L\'URL doit commencer par un / et peut contenit des chiffres, des lettres et les symboles suivants: ._-[]:?|/+*',
'delete_confirm_multiple' => 'Voulez-vous vraiment supprimer les pages sélectionnées ?',
'delete_confirm_single' => 'Voulez-vous vraiment supprimer cette page ?',
'no_layout' => '-- aucun layout --'

View File

@ -40,7 +40,7 @@ return [
'menu_label' => 'Pagine',
'no_list_records' => 'Pagine non trovate',
'new' => 'Nuova pagina',
'invalid_url' => 'Formato URL non valido. L\'URL deve iniziare con una barra e può contenere numeri, lettere e i seguenti simboli: _-[]:?|/+*',
'invalid_url' => 'Formato URL non valido. L\'URL deve iniziare con una barra e può contenere numeri, lettere e i seguenti simboli: ._-[]:?|/+*',
'delete_confirm_multiple' => 'Sei sicuro di voler eliminare le pagine selezionate?',
'delete_confirm_single' => 'Sei sicuro di voler eliminare questa pagina?',
'no_layout' => '-- nessun layout --'

View File

@ -34,7 +34,7 @@ return [
'menu_label' => 'ページ',
'no_list_records' => 'ページが見つかりません',
'new' => '新ページ',
'invalid_url' => '正しくないURL形式。URLはスラッシュ(/)で始まり、数字、ラテン文字、_-[]:?|/+*で構成します。',
'invalid_url' => '正しくないURL形式。URLはスラッシュ(/)で始まり、数字、ラテン文字、._-[]:?|/+*で構成します。',
'delete_confirm_multiple' => '指定した全ページを本当に削除しますか?',
'delete_confirm_single' => '本当にこのページを削除しますか?',
'no_layout' => '-- レイアウト無し --'

View File

@ -5,27 +5,33 @@ return [
'invalid_file' => 'Ongeldige bestandsnaam: :name. Bestandsnamen mogen enkel bestaan uit letters, cijfers, underscores, streepjes en punten. Voorbeelden van correcte bestandsnamen: pagina.htm, pagina, map/pagina',
'invalid_property' => 'Parameter ":name" kan niet worden gewijzigd',
'file_already_exists' => 'Bestand ":name" bestaat al.',
'error_saving' => 'Bestand opslaan mislukt: ":name".',
'error_creating_directory' => 'Map aanmaken mislukt: ":name"',
'error_saving' => 'Bestand opslaan mislukt: ":name". Controleer de schrijfrechten.',
'error_creating_directory' => 'Map aanmaken mislukt: ":name". Controleer de schrijfrechten.',
'invalid_file_extension'=>'Ongeldige bestandsextensie: :invalid. Toegestane extensies zijn: :allowed.',
'error_deleting' => 'Fout bij het verwijderen van template: ":name".',
'error_deleting' => 'Fout bij het verwijderen van template: ":name". Controleer de schrijfrechten.',
'delete_success' => 'Templates zijn succesvol verwijderd: :count.',
'file_name_required' => 'Het invullen van een bestandsnaam is verplicht.'
],
'theme' => [
'active' => [
'not_set' => "Er is geen actief thema geselecteerd.",
'not_found' => "Het actieve thema is niet gevonden.",
],
'edit' => [
'not_set' => "Er is geen thema ingesteld om te kunnen bewerken.",
'not_found' => "Het te bewerken thema is niet gevonden.",
'not_match' => "Het object dat je probeert te openen behoort niet tot het te bewerken thema. Herlaad de pagina."
]
],
'settings_menu' => 'Front-end thema',
'settings_menu_description' => 'Bekijk de lijst met geïnstalleerde themas en selecteer een beschikbaar thema.',
'find_more_themes' => 'Vind meer thema\'s op de OctoberCMS thema marktplaats.',
'activate_button' => 'Activeer',
'active_button' => 'Activeer',
],
'page' => [
'not_found' => [
'label' => "Pagina niet gevonden",
'help' => "De opgevraagde pagina bestaat niet.",
'help' => "De opgevraagde pagina kan niet worden gevonden.",
],
'custom_error' => [
'label' => "Paginafout",
@ -34,7 +40,7 @@ return [
'menu_label' => 'Pagina\'s',
'no_list_records' => 'Geen pagina\'s gevonden',
'new' => 'Nieuwe pagina',
'invalid_url' => 'Ongeldig URL formaat. De URL moet beginnen met een schuine streep en mag enkel bestaan uit letters, cijfers en de volgende tekens: _-[]:?|/+*',
'invalid_url' => 'Ongeldig URL formaat. De URL moet beginnen met een schuine streep en mag enkel bestaan uit letters, cijfers en de volgende tekens: ._-[]:?|/+*',
'delete_confirm_multiple' => 'Weet je zeker dat je de geselecteerde pagina\'s wilt verwijderen?',
'delete_confirm_single' => 'Weet je zeker dat je deze pagina wilt verwijderen?',
'no_layout' => '-- geen layout --'
@ -88,11 +94,15 @@ return [
'description' => 'Omschrijving',
'preview' => 'Voorbeeld',
'meta' => 'Meta',
'meta_title' => 'Meta Titel',
'meta_description' => 'Meta Omschrijving',
'meta_title' => 'Meta titel',
'meta_description' => 'Meta omschrijving',
'markup' => 'Opmaak',
'code' => 'Code',
'content' => 'Content',
'hidden' => 'Verborgen',
'hidden_comment' => 'Verborgen pagina zijn alleen toegankelijk voor ingelogde gebruikers.',
'enter_fullscreen' => 'Volledig scherm starten',
'exit_fullscreen' => 'Volledig scherm afsluiten',
],
'asset' => [
'menu_label' => "Middelen",
@ -101,9 +111,12 @@ return [
'upload_files' => 'Bestand(en) uploaden',
'create_file' => 'Nieuw bestand',
'create_directory' => 'Nieuwe map',
'directory_popup_title' => 'Nieuwe map',
'directory_name' => 'Mapnaam',
'rename' => 'Hernoemen',
'delete' => 'Verwijderen',
'move' => 'Verplaatsen',
'select' => 'Selecteren',
'new' => 'Nieuw bestand',
'rename_popup_title' => 'Hernoemen',
'rename_new_name' => 'Nieuwe naam',
@ -116,7 +129,7 @@ return [
'already_exists' => 'Bestand of map met deze naam bestaat al',
'error_renaming' => 'Fout bij hernoemen van bestand of map',
'name_cant_be_empty' => 'De naam mag niet leeg zijn',
'too_large' => 'Het geüploade bestand is te groot. De maximaal toegestane bestandsgrootte is :max_size',
'too_large' => 'Het geüploadete bestand is te groot. De maximaal toegestane bestandsgrootte is :max_size',
'type_not_allowed' => 'Enkel de volgende bestandstypen zijn toegestaand: :allowed_types',
'file_not_valid' => 'Bestand is ongeldig',
'error_uploading_file' => 'Fout tijdens uploaden bestand ":name": :error',
@ -135,7 +148,7 @@ return [
'component' => [
'menu_label' => "Componenten",
'unnamed' => "Naamloos",
'no_description' => "Geen beschrijviging opgegeven",
'no_description' => "Geen beschrijving opgegeven",
'alias' => "Alias",
'alias_description' => "Een unieke naam voor dit component voor gebruik in de code van een pagina of layout.",
'validation_message' => "Een alias voor het component is verplicht en mag alleen bestaan uit letters, cijfers en underscores. De alias moet beginnen met een letter.",
@ -148,5 +161,13 @@ return [
'invalid_type' => "Onbekend type template.",
'not_found' => "De opgevraagde template is niet gevonden.",
'saved'=> "De template is succesvol opgeslagen."
],
'permissions' => [
'manage_content' => 'Beheer inhoud',
'manage_assets' => 'Beheer middelen',
'manage_pages' => 'Beheer pagina\'s',
'manage_layouts' => 'Beheer layouts',
'manage_partials' => 'Beheer sjablonen',
'manage_themes' => 'Beheer thema\'s'
]
];

View File

@ -33,7 +33,7 @@ return [
],
'menu_label' => 'Páginas',
'no_list_records' => 'Nenhuma página foi encontradas',
'invalid_url' => 'Formato de URL inválido. O URL deve começar com o símbolo de barra e pode conter dígitos, letras latinas e os seguintes símbolos: _-[]:?|/+*',
'invalid_url' => 'Formato de URL inválido. O URL deve começar com o símbolo de barra e pode conter dígitos, letras latinas e os seguintes símbolos: ._-[]:?|/+*',
'delete_confirm_multiple' => 'Você realmente quer excluir as páginas selecionadas?',
'delete_confirm_single' => 'Você realmente quer excluir esta página?',
'no_layout' => '-- sem layout --'

View File

@ -0,0 +1,170 @@
<?php
return [
'cms_object' => [
'invalid_file' => 'Nume de fisier invalid: :name. Numele de fisiere pot sa contina doar caractere alfanumerice, linii si puncte. Unele exemple de nume de fisiere corecte: pagina_1.htm, pagina-2, subdirector/pagina',
'invalid_property' => 'Proprietatea ":name" nu poate fi setata',
'file_already_exists' => 'Fisierul ":name" deja exista.',
'error_saving' => 'Eroare la salvarea fisierului ":name". Verificati permisiunile de scriere.',
'error_creating_directory' => 'Eroare la crearea directorului :name. Verificati permisiunile de scriere.',
'invalid_file_extension'=>'Extensie de fisier invalida: :invalid. Extensiile permise sunt: :allowed.',
'error_deleting' => 'Eroare la stergerea fisierului sablon ":name". Verificati permisiunile de scriere.',
'delete_success' => 'Sabloanele au fost sterse cu succes, in total: :count.',
'file_name_required' => 'Campul nume fisier este necesar.'
],
'theme' => [
'active' => [
'not_set' => "Tema activa nu este setata.",
'not_found' => "Tema activa nu a fost gasita.",
],
'edit' => [
'not_set' => "Tema de editare nu este setata.",
'not_found' => "Tema de editare nu a fost gasita.",
'not_match' => "Obiectul pe care incercati sa-l accesati nu apartine temei care este in curs de editare. Va rugam reincarcati pagina."
],
'settings_menu' => 'Tema Front-end',
'settings_menu_description' => 'Previzualizati lista de teme instalate si selectati o tema activa.',
'find_more_themes' => 'Gasiti mai multe teme in "Piata OctoberCMS".',
'activate_button' => 'Activare',
'active_button' => 'Activare',
],
'page' => [
'not_found' => [
'label' => "Pagina negasita",
'help' => "Pagina cautata nu a putut fi gasita.",
],
'custom_error' => [
'label' => "Eroare pagina",
'help' => "Ne cerem scuze, dar a aparut o problema si pagina nu poate fi afisata.",
],
'menu_label' => 'Pagini',
'no_list_records' => 'Nu au fost gasite pagini',
'new' => 'Pagina noua',
'invalid_url' => 'Format URL invalid. URL-ul ar trebui sa inceapa cu un slash ( / ) si poate sa contina cifre, caractere latine si urmatoarele simboluri: ._-[]:?|/+*',
'delete_confirm_multiple' => 'Vreti sa stergeti paginile selectate?',
'delete_confirm_single' => 'Vreti sa stergeti aceasta pagina?',
'no_layout' => '-- fara macheta --'
],
'layout' => [
'not_found' => "Macheta ':name' nu a fost gasita",
'menu_label' => 'Machete',
'no_list_records' => 'Nu au fost gasite machete',
'new' => 'Macheta noua',
'delete_confirm_multiple' => 'Vreti sa stergeti machetele selectate?',
'delete_confirm_single' => 'Vreti sa stergeti macheta selectata?'
],
'partial' => [
'invalid_name' => "Nume invalid pentru componenta partiala: :name.",
'not_found' => "Componenta partiala ':name' nu a fost gasita.",
'menu_label' => 'Componente partiale',
'no_list_records' => 'Nu au fost gasite componente partiale',
'delete_confirm_multiple' => 'Vreti sa stergeti componentele partiale selectate?',
'delete_confirm_single' => 'Vreti sa stergeti aceasta componenta partiala?',
'new' => 'Componenta partiala noua'
],
'content' => [
'not_found' => "Fisierul de continut ':name' nu a fost gasit.",
'menu_label' => 'Continut',
'no_list_records' => 'Nu au fost gasite fisiere de continut',
'delete_confirm_multiple' => 'Vreti sa stergeti fisierele si directoarele cu continut?',
'delete_confirm_single' => 'Vreti sa stergeti acest fisier cu continut?',
'new' => 'Fisier nou cu continut'
],
'ajax_handler' => [
'invalid_name' => "Nume Functie AJAX invalid: :name.",
'not_found' => "Functia AJAX ':name' nu a fost gasita.",
],
'combiner' => [
'not_found' => "Fisierul compus ':name' nu a fost gasit.",
],
'cms' => [
'menu_label' => "CMS"
],
'sidebar' => [
'add' => 'Adaugare',
'search' => 'Cautare...'
],
'editor' => [
'settings' => 'Setari',
'title' => 'Titlu',
'new_title' => 'Titlu de pagina noua',
'url' => 'URL',
'filename' => 'Nume fisier',
'layout' => 'Macheta',
'description' => 'Descriere',
'preview' => 'Previzualizare',
'meta' => 'Meta',
'meta_title' => 'Titlu Meta',
'meta_description' => 'Descriere Meta',
'markup' => 'Markup',
'code' => 'Cod',
'content' => 'Continut',
'hidden' => 'Ascuns',
'hidden_comment' => 'Fisierele ascunse sunt vizibile doar administratorilor logati in sistem',
'enter_fullscreen' => 'Intrare in mod ecran complet',
'exit_fullscreen' => 'Iesire din mod ecran complet'
],
'asset' => [
'menu_label' => "Fisiere design",
'drop_down_add_title' => 'Adaure...',
'drop_down_operation_title' => 'Actiune...',
'upload_files' => 'Incarcare fisier(e)',
'create_file' => 'Creare fisier',
'create_directory' => 'Creare director',
'rename' => 'Redenumire',
'delete' => 'Stergere',
'move' => 'Mutare',
'new' => 'Fisier nou',
'rename_popup_title' => 'Redenumire',
'rename_new_name' => 'Nume nou',
'invalid_path' => 'Calea poate sa contina doar cifre, caractere latine, spatii si urmatoarele simboluri: ._-/',
'error_deleting_file' => 'Eroare la stergerea fisierului :name.',
'error_deleting_dir_not_empty' => 'Eroare la stergerea directorului :name. Directorul nu este gol.',
'error_deleting_dir' => 'Eroare la stergerea fisierului :name.',
'invalid_name' => 'Numele poate sa contina doar cifre, caractere latine si urmatoarele simboluri: ._-',
'original_not_found' => 'Fisierul sau directorul original nu a fost gasit',
'already_exists' => 'Fisierul sau directorul cu acest nume exista deja',
'error_renaming' => 'Eroare la redenumirea fisierului sau directorului',
'name_cant_be_empty' => 'Numele nu poate fi gol',
'too_large' => 'Fisierul incarcat este prea mare. Dimensiunea maxima permisa este: :max_size',
'type_not_allowed' => 'Doar urmatoarele tipuri de fisiere sunt permise: :allowed_types',
'file_not_valid' => 'Fisierul nu este valid',
'error_uploading_file' => 'Eroare la incarcarea fisierului ":name", eroare: :error',
'move_please_select' => 'selectati',
'move_destination' => 'Director destinatie',
'move_popup_title' => 'Mutare fisiere',
'move_button' => 'Mutare',
'selected_files_not_found' => 'Fisierele selectate nu au fost gasite',
'select_destination_dir' => 'Selectati un director pentru destinatie',
'destination_not_found' => 'Directorul destinatie nu a fost gasit',
'error_moving_file' => 'Eroare la mutarea fisierului :file',
'error_moving_directory' => 'Eroare la mutarea directorului :dir',
'error_deleting_directory' => 'Eroare la stergerea directorului original :dir',
'path' => 'Cale'
],
'component' => [
'menu_label' => "Componente",
'unnamed' => "Fara nume",
'no_description' => "Nicio descriere furnizata",
'alias' => "Alias",
'alias_description' => "Numele unic dat acestei componente atunci cand este folosita intr-o pagina sau intr-o macheta.",
'validation_message' => "Aliasul componentei este necesar si poate sa contina doar caractere latine, cifre si caractere underscore. Denumirile are trebui sa inceapa cu un caracter latin.",
'invalid_request' => "Sablonul nu a putut fi salvat din cauza datelor invalide ale componentei.",
'no_records' => 'Nicio componenta nu a fost gasita',
'not_found' => "Componenta ':name' nu a fost gasita.",
'method_not_found' => "Componenta ':name' nu contine nicio metoda ':method'.",
],
'template' => [
'invalid_type' => "Tip de sablon necunoscut.",
'not_found' => "Sablonul solicitat nu a fost gasit.",
'saved'=> "Sablonul a fost salvat cu succes."
],
'permissions' => [
'manage_content' => 'Gestioneaza continut',
'manage_assets' => 'Gestioneaza fisiere design',
'manage_pages' => 'Gestioneaza pagini',
'manage_layouts' => 'Gestioneaza machete',
'manage_partials' => 'Gestioneaza componente partiale',
'manage_themes' => 'Gestioneaza teme'
]
];

View File

@ -40,7 +40,7 @@ return [
'menu_label' => 'Страницы',
'no_list_records' => 'Страницы не найдены',
'new' => 'Новая страница',
'invalid_url' => 'Неверный формат адреса. Адрес страницы должен начинаться со знака / и может содержать цифры, латинские буквы, и следующие знаки: _-[]:?|/+*',
'invalid_url' => 'Неверный формат адреса. Адрес страницы должен начинаться со знака / и может содержать цифры, латинские буквы, и следующие знаки: ._-[]:?|/+*',
'delete_confirm_multiple' => 'Вы действительно хотите удалить выделенные страницы?',
'delete_confirm_single' => 'Вы действительно хотите удалить эту страницу?',
'no_layout' => '-- без шаблона --'
@ -100,7 +100,9 @@ return [
'code' => 'Код',
'content' => 'Содержание',
'hidden' => 'Скрытая страница',
'hidden_comment' => 'Скрытые страницы доступны только для вошедших в систему пользователей.'
'hidden_comment' => 'Скрытые страницы доступны только для вошедших в систему пользователей.',
'enter_fullscreen' => 'Войти в полноэкранный режим',
'exit_fullscreen' => 'Выйти из полноэкранного режима'
],
'asset' => [
'menu_label' => "Ресурсы",
@ -109,9 +111,12 @@ return [
'upload_files' => 'Загрузить файл(ы)',
'create_file' => 'Создать файл',
'create_directory' => 'Создать директорию',
'directory_popup_title' => 'Новая директория',
'directory_name' => 'Имя директории',
'rename' => 'Переименовать',
'delete' => 'Удалить',
'move' => 'Переместить',
'select' => 'Выбрать',
'new' => 'Новый файл',
'rename_popup_title' => 'Переименовать',
'rename_new_name' => 'Новое имя',
@ -156,5 +161,13 @@ return [
'invalid_type' => "Неизвестный тип шаблона.",
'not_found' => "Запрошенный шаблон не найден.",
'saved'=> "Шаблон был успешно сохранен."
],
'permissions' => [
'manage_content' => 'Управление контентом',
'manage_assets' => 'Управление файлами',
'manage_pages' => 'Управление страницами',
'manage_layouts' => 'Управление шаблонами',
'manage_partials' => 'Управление фрагментами',
'manage_themes' => 'Управление темами'
]
];

View File

@ -34,7 +34,7 @@ return [
'menu_label' => 'Sidor',
'no_list_records' => 'Inga sidor funna',
'new' => 'Ny sida',
'invalid_url' => 'Felaktigt URL-format. URLen skall starta med ett / och kan innehålla siffror, bokstäver och följande tecken: _-[]:?|/+*',
'invalid_url' => 'Felaktigt URL-format. URLen skall starta med ett / och kan innehålla siffror, bokstäver och följande tecken: ._-[]:?|/+*',
'delete_confirm_multiple' => 'Vill du verkligen radera markerade sidor?',
'delete_confirm_single' => 'Vill du verkligen radera denna sida?',
'no_layout' => '-- ingen layout --'

View File

@ -34,7 +34,7 @@ return [
'menu_label' => 'Sayfalar',
'no_list_records' => 'Hiç sayfa yok.',
'new' => 'Sayfa oluştur',
'invalid_url' => 'Hata URL formatı. The URL should start with the forward slash symbol and can contain digits, Latin letters and the following symbols: _-[]:?|/+*',
'invalid_url' => 'Hata URL formatı. The URL should start with the forward slash symbol and can contain digits, Latin letters and the following symbols: ._-[]:?|/+*',
'delete_confirm_multiple' => 'Seçili sayfaları silmek istediğinize emin misiniz?',
'delete_confirm_single' => 'Bu sayfayı silmek istediğinize emin misiniz?',
'no_layout' => '-- şablon yok --'

View File

@ -48,7 +48,7 @@ class MailTemplates extends Controller
/* @todo Remove line if year >= 2015 */ if (!\System\Models\MailLayout::whereCode('default')->count()) { \Eloquent::unguard(); with(new \System\Database\Seeds\SeedSetupMailLayouts)->run(); }
MailTemplate::syncAll();
$this->getClassExtension('Backend.Behaviors.ListController')->index();
$this->asExtension('ListController')->index();
$this->bodyClass = 'compact-container';
}

View File

@ -45,7 +45,7 @@ class RequestLogs extends Controller
public function onEmptyLog()
{
RequestLog::truncate();
Flash::success(Lang::get('system::lang.event_log.empty_success'));
Flash::success(Lang::get('system::lang.request_log.empty_success'));
return $this->listRefresh();
}

View File

@ -59,7 +59,7 @@ class Updates extends Controller
$this->vars['project_id'] = Parameters::get('system::project.id');
$this->vars['project_name'] = Parameters::get('system::project.name');
$this->vars['project_owner'] = Parameters::get('system::project.owner');
return $this->getClassExtension('Backend.Behaviors.ListController')->index();
return $this->asExtension('ListController')->index();
}
/**
@ -69,7 +69,7 @@ class Updates extends Controller
{
$this->pageTitle = Lang::get('system::lang.plugins.manage');
PluginManager::instance()->clearDisabledCache();
return $this->getClassExtension('Backend.Behaviors.ListController')->index();
return $this->asExtension('ListController')->index();
}
/**

View File

@ -9,6 +9,9 @@ recordUrl: system/requestlogs/preview/:id
noRecordsMessage: backend::lang.list.no_records
recordsPerPage: 30
showSetup: true
defaultSort:
column: count
direction: desc
toolbar:
buttons: list_toolbar

View File

@ -16,6 +16,7 @@ return [
'ru' => 'Russian',
'fr' => 'French',
'it' => 'Italian',
'ro' => 'Romana',
],
'directory' => [
'create_fail' => "Cannot create directory: :name",

View File

@ -3,7 +3,20 @@
return [
'app' => [
'name' => 'October CMS',
'motto' => 'Getting back to basics',
'motto' => 'Terug naar de basis',
],
'locale' => [
'en' => 'Engels',
'nl' => 'Nederlands',
'ja' => 'Japans',
'se' => 'Zweeds',
'tr' => 'Turks',
'br' => 'Braziliaans Portugees',
'de' => 'Duits',
'ru' => 'Russisch',
'fr' => 'Frans',
'it' => 'Italiaans',
'ro' => 'Roemeens',
],
'directory' => [
'create_fail' => "Map aanmaken mislukt: :name",
@ -14,26 +27,58 @@ return [
'system' => [
'name' => 'Systeem',
'menu_label' => 'Systeem',
'categories' => [
'cms' => 'CMS',
'misc' => 'Misc',
'logs' => 'Logboeken',
'mail' => 'E-mail',
'shop' => 'Winkel',
'team' => 'Team',
'users' => 'Gebruikers',
'system' => 'Systeem',
'social' => 'Sociaal',
'events' => 'Events',
'customers' => 'Klanten',
'my_settings' => 'Mijn instellingen',
],
],
'plugin' => [
'unnamed' => 'Naamloze plugin',
'name' => [
'label' => 'Plugin Naam',
'help' => 'Gebruik bij het invoeren van de naam de unieke code van de plugin. Voorbeeld: RainLab.Blog',
'label' => 'Plugin naam',
'help' => 'Gebruik bij het invoeren van de naam de unieke code van de plugin. Bijvoorbeeld: RainLab.Blog',
],
],
'plugins' => [
'manage' => 'Beheer plugins',
'enable_or_disable' => 'In- of uitschakelen',
'enable_or_disable_title' => 'Schakel plugins in of uit',
'remove' => 'Verwijder',
'refresh' => 'Ververs',
'disabled_label' => 'Uitschakelen',
'disabled_help' => 'Plugins welke uitschakelt zijn worden genegeerd door de applicatie.',
'selected_amount' => 'Geselecteerde plugins: :amount',
'remove_confirm' => 'Weet je het zeker?',
'remove_success' => "Gekozen plugins succesvol verwijderd uit het systeem.",
'refresh_confirm' => 'Weet je het zeker?',
'refresh_success' => "Gekozen plugins succesvol ververst in het systeem.",
'disable_confirm' => 'Weet je het zeker?',
'disable_success' => "Gekozen plugins succesvol uitgeschakeld.",
'enable_success' => "Gekozen plugins succesvol ingeschakeld.",
'unknown_plugin' => "Plugin is verwijderd van het bestandssysteem.",
],
'project' => [
'name' => 'Project',
'owner_label' => 'Eigenaar',
'attach' => 'Project Koppelen',
'detach' => 'Project Ontkoppelen',
'attach' => 'Project koppelen',
'detach' => 'Project ontkoppelen',
'none' => 'Geen',
'id' => [
'label' => 'Project ID',
'help' => 'Hoe vind je jouw Project ID',
'help' => 'Hoe achterhaal je jouw Project ID',
'missing' => 'Voer een Project ID in.',
],
'detach_confirm' => 'Are you sure you want to detach this project?',
'detach_confirm' => 'Weet je zeker dat je dit project wilt ontkoppelen?',
'unbind_success' => 'Project is succesvol ontkoppeld.',
],
'settings' => [
@ -41,37 +86,63 @@ return [
'missing_model' => 'De instellingenpagina mist de definitie van een Model.',
'update_success' => 'Instellingen voor :name zijn succesvol bijgewerkt.',
'return' => 'Terug naar systeeminstellingen',
'search' => 'Zoeken',
],
'email' => [
'menu_label' => 'E-mailinstellingen',
'menu_description' => 'Beheer e-mailinstellingen.',
'general' => 'Algemeen',
'method' => 'Email Methode',
'sender_name' => 'Naam Afzender',
'sender_email' => 'E-mailadres Afzender',
'method' => 'E-mail methode',
'sender_name' => 'Naam afzender',
'sender_email' => 'E-mailadres afzender',
'smtp' => 'SMTP',
'smtp_address' => 'SMTP Adres',
'smtp_address' => 'SMTP adres',
'smtp_authorization' => 'SMTP authenticatie vereist',
'smtp_authorization_comment' => 'Vink deze optie aan indien de SMTP server authenticatie vereist.',
'smtp_username' => 'Gebruikersnaam',
'smtp_password' => 'Wachtwoord',
'smtp_port' => 'SMTP Poort',
'smtp_port' => 'SMTP poort',
'smtp_ssl' => 'SSL verbinding vereist',
'sendmail' => 'Sendmail',
'sendmail_path' => 'Pad naar Sendmail',
'sendmail_path_comment' => 'Geef hier het volledige pad op naar de Sendmail-applicatie.',
],
'mail_templates' => [
'menu_label' => 'E-mail templates',
'menu_description' => 'Modify the mail templates that are sent to users and administrators, manage email layouts.',
'new_template' => 'Nieuwe template',
'new_layout' => 'Nieuwe layout',
'template' => 'Template',
'templates' => 'Templates',
'menu_layouts_label' => 'E-mail layouts',
'layout' => 'Layout',
'layouts' => 'Layouts',
'name' => 'Naam',
'name_comment' => 'Unieke naam welke gebruikt wordt om naar deze template te refereren',
'code' => 'Code',
'code_comment' => 'Unieke code welke gebruikt wordt om naar deze template te refereren',
'subject' => 'Onderwerp',
'subject_comment' => 'E-mail onderwerp',
'description' => 'Omschrijving',
'content_html' => 'HTML',
'content_css' => 'CSS',
'content_text' => 'Platte tekst',
'test_send' => 'Stuur testbericht',
'test_success' => 'Het testbericht is succesvol verzonden.',
'return' => 'Terug naar templatelijst'
],
'install' => [
'project_label' => 'Koppel aan Project',
'plugin_label' => 'Installeer Plugin',
'project_label' => 'Koppel aan project',
'plugin_label' => 'Installeer plugin',
'missing_plugin_name' => 'Voer een naam van een plugin in om deze te installeren.',
'install_completing' => 'Afronden installatieproces',
'install_completing' => 'Bezig met het afronden van het installatieproces',
'install_success' => 'De plugin is succesvol geïnstalleerd.',
],
'updates' => [
'title' => 'Beheer Updates',
'title' => 'Beheer updates',
'name' => 'Applicatie-update',
'menu_label' => 'Updates',
'menu_description' => 'Update het systeem, beheer en installeer plugins en thema\'s.',
'check_label' => 'Controleer op updates',
'retry_label' => 'Probeer nogmaals',
'plugin_name' => 'Naam',
@ -82,13 +153,17 @@ return [
'core_build_old' => 'Huidige build :build',
'core_build_new' => 'Build :build',
'core_build_new_help' => 'De meest recente versie is beschikbaar.',
'core_downloading' => 'Applicatiebestanden downloaden',
'core_extracting' => 'Applicatiebestanden uitpakken',
'plugin_downloading' => 'Plugin downloaden: :name',
'plugin_extracting' => 'Uitpakken plugin: :name',
'core_downloading' => 'Applicatiebestanden aan het downloaden',
'core_extracting' => 'Applicatiebestanden aan het uitpakken',
'plugin_downloading' => 'Plugin aan het downloaden: :name',
'plugin_extracting' => 'Uitpakken aan het plugin: :name',
'plugin_version_none' => 'Nieuwe plugin',
'plugin_version_old' => 'Huidig v:version',
'plugin_version_new' => 'v:version',
'theme_label' => 'Thema',
'theme_new_install' => 'Nieuwe thema-installatie.',
'theme_downloading' => 'Thema aan het downloaden: :name',
'theme_extracting' => 'Thema aan het uitpakken: :name',
'update_label' => 'Applicatie bijwerken',
'update_completing' => 'Afronden updateproces',
'update_loading' => 'Beschikbare updates laden...',
@ -113,13 +188,49 @@ return [
'file_corrupt' => 'Door server aangeboden bestand is corrupt.',
],
'behavior' => [
'missing_property' => 'Klasse :class moet variabele $:property bevatten gebruikt door het gedag (behavior) :behavior.',
'missing_property' => 'Klasse :class moet variabele $:property bevatten welke gebruikt wordt door het gedrag (behavior) :behavior.',
],
'config' => [
'not_found' => 'Kan het configuratiebestand :file gedefinieerd door :file niet vinden.',
'not_found' => 'Kan het configuratiebestand :file gedefinieerd voor :location niet vinden.',
'required' => 'Configuratie gebruikt in :location moet de waarde :property toewijzen.',
],
'zip' => [
'extract_failed' => "Kan het corebestand ':file' niet uitpakken.",
],
'event_log' => [
'hint' => 'Dit logboek toont een lijst met potentiële fouten zoals exceptions of debuginformatie, welke voorkomen in de applicatie.',
'menu_label' => 'Gebeurtenissenlogboek',
'menu_description' => 'Bekijk systeemberichten met de geregistreerde tijd en detail.',
'empty_link' => 'Gebeurtenissenlogboek legen',
'empty_loading' => 'Bezig met het gebeurtenissenlogboek legen...',
'empty_success' => 'Het gebeurtenissenlogboek legen is gelukt.',
'return_link' => 'Terug naar gebeurtenissenlogboek',
'id' => 'ID',
'id_label' => 'Gebeurtenis ID',
'created_at' => 'Datum & tijd',
'message' => 'Bericht',
'level' => 'Level',
],
'request_log' => [
'hint' => 'Dit logboek toont een lijst met pagina aanvragen welke mogelijk aandacht vereisen. Bijvoorbeeld: Een bezoeker opent een CMS pagina welke niet gevonden kan worden, een aantekening wordt gemaakt met statuscode 404.',
'menu_label' => 'Aanvragenlogboek',
'menu_description' => 'Bekijk foutieve of doorverwezen aanvragen zoals \'Pagina niet gevonden (404)\'.',
'empty_link' => 'Aanvragenlogboek legen',
'empty_loading' => 'Bezig met het aanvragenlogboek legen...',
'empty_success' => 'Het aanvragenlogboek legen is gelukt.',
'return_link' => 'Terug naar het aanvragenlogboek',
'id' => 'ID',
'id_label' => 'Log ID',
'count' => 'Aantal',
'referer' => 'Verwijzingen',
'url' => 'URL',
'status_code' => 'Status',
],
'permissions' => [
'manage_system_settings' => 'Beheer systeeminstellingen',
'manage_software_updates' => 'Beheer applicatie updates',
'manage_mail_templates' => 'Beheer e-mailtemplates',
'manage_other_administrators' => 'Beheer mede-beheerders',
'view_the_dashboard' => 'Bekijk het dashboard'
]
];

View File

@ -41,8 +41,8 @@ return array(
"ip" => "Het IP-adres van :attribute is ongeldig.",
"max" => array(
"numeric" => "De waarde van :attribute mag niet hoger zijn dan :max.",
"file" => "De bestandsgrootte van :attribute mag niet hoger zijn dan :max kilobytes.",
"string" => "Het aantal tekens van :attribute mag niet hoger zijn dan :max tekens.",
"file" => "De bestandsgrootte van :attribute mag niet groter zijn dan :max kilobytes.",
"string" => "Het aantal tekens van :attribute mag niet groter zijn dan :max tekens.",
"array" => "Het veld :attribute mag niet meer dan :max objecten bevatten.",
),
"mimes" => "Het bestand van :attribute mag enkel zijn van het type: :values.",

View File

@ -0,0 +1,232 @@
<?php
return [
'app' => [
'name' => 'October CMS',
'motto' => 'Intoarcerea la elementele de baza',
],
'locale' => [
'en' => 'Engleza',
'nl' => 'Olandeza',
'ja' => 'Japoneza',
'sv' => 'Suedeza',
'tr' => 'Turca',
'br' => 'Portugheza (Brazilia)',
'de' => 'Germana',
'ru' => 'Rusa',
'fr' => 'Franceza',
'ro' => 'Romana'
],
'directory' => [
'create_fail' => "Nu se poate crea directorul: :name",
],
'file' => [
'create_fail' => "Nu se poate crea fisierul: :name",
],
'system' => [
'name' => 'Sistem',
'menu_label' => 'Sistem',
'categories' => [
'cms' => 'CMS',
'misc' => 'Altele',
'logs' => 'Jurnal',
'mail' => 'Mail',
'shop' => 'Magazin',
'team' => 'Echipa',
'users' => 'Utilizatori',
'system' => 'Sistem',
'social' => 'Social',
'events' => 'Evenimente',
'customers' => 'Clienti',
'my_settings' => 'Setarile mele',
],
],
'plugin' => [
'unnamed' => 'Plugin fara nume',
'name' => [
'label' => 'Nume Plugin',
'help' => 'Denumiti plugin-ul dupa codul sau unic. De exemplu, RainLab.Blog',
],
],
'plugins' => [
'manage' => 'Gestionare plugin-uri',
'enable_or_disable' => 'Activare sau dezactivare',
'enable_or_disable_title' => 'Activare sau dezactivare plugin-uri',
'remove' => 'Inlaturare',
'refresh' => 'Reimprospatare',
'disabled_label' => 'Dezactivat',
'disabled_help' => 'Plugin-urile care sunt dezactivate sunt ignorate de catre aplicatie.',
'selected_amount' => 'Plugin-uri selectate: :amount',
'remove_success' => "Plugin-urile respective au fost inlaturate cu succes din sistem.",
'refresh_success' => "Plugin-urile respective au fost actualizate cu succes.",
'disable_success' => "Plugin-urile respective au fost dezactivate cu succes.",
'enable_success' => "Plugin-urile respective au fost activate cu succes.",
'unknown_plugin' => "Plugin-ul a fost inlaturat din sistemul de fisiere.",
],
'project' => [
'name' => 'Proiect',
'owner_label' => 'Proprietar',
'attach' => 'Atasare Proiect',
'detach' => 'Detasare Proiect',
'none' => 'Niciunul',
'id' => [
'label' => 'ID Proiect',
'help' => 'Cum sa gasiti ID-ul Proiectului',
'missing' => 'Va rugam sa specificati un ID de Proiect.',
],
'detach_confirm' => 'Sunteti sigur(a) ca doriti sa detasati acest proiect?',
'unbind_success' => 'Proiectul a fost detasat cu succes.',
],
'settings' => [
'menu_label' => 'Setari',
'missing_model' => 'Paginii de setari ii lipseste o definitie de Model.',
'update_success' => 'Setarile pentru :name au fost actualizate cu succes.',
'return' => 'Intoarcere la setarile sistemului.',
'search' => 'Cautare'
],
'mail' => [
'menu_label' => 'Configuratie Email',
'menu_description' => 'Administrare configuratie email.',
'general' => 'General',
'method' => 'Metoda trimitere email',
'sender_name' => 'Nume expeditor',
'sender_email' => 'Email expeditor',
'smtp' => 'SMTP',
'smtp_address' => 'Adresa SMTP',
'smtp_authorization' => 'Autorizatie SMTP necesara',
'smtp_authorization_comment' => 'Utilizati aceasta bifa daca serverul SMTP necesita autorizatie.',
'smtp_username' => 'Utilizator',
'smtp_password' => 'Parola',
'smtp_port' => 'Port SMTP',
'smtp_ssl' => 'Conexiune SSL necesara',
'sendmail' => 'Sendmail',
'sendmail_path' => 'Cale catre Sendmail',
'sendmail_path_comment' => 'Va rugam sa specificati calea catre programul sendmail.',
],
'mail_templates' => [
'menu_label' => 'Sabloane email',
'menu_description' => 'Modificati sabloanele de email care sunt trimise catre utilizatori si administratori, administrati aspectul email-urilor.',
'new_template' => 'Sablon nou',
'new_layout' => 'Macheta noua',
'template' => 'Sablon',
'templates' => 'Sabloane',
'menu_layouts_label' => 'Machete email',
'layout' => 'Macheta',
'layouts' => 'Machete',
'name' => 'Nume',
'name_comment' => 'Nume unic folosit ca referinta la acest sablon',
'code' => 'Cod',
'code_comment' => 'Cod unic folosit ca referinta la acest sablon',
'subject' => 'Subiect',
'subject_comment' => 'Subiect mesaj Email',
'description' => 'Descriere',
'content_html' => 'HTML',
'content_css' => 'CSS',
'content_text' => 'Text simplu',
'test_send' => 'Trimitere mesaj de test',
'test_success' => 'Mesajul de test a fost trimis cu succes.',
'return' => 'Intoarcere la lista de sabloane'
],
'install' => [
'project_label' => 'Atasare la Proiect',
'plugin_label' => 'Instalare Plugin',
'missing_plugin_name' => 'Va rugam sa specificati un nume de Plugin pentru instalare.',
'install_completing' => 'Se finalizeaza procesul de instalare',
'install_success' => 'Acest plugin a fost instalat cu succes.',
],
'updates' => [
'title' => 'Gestioneaza Actualizari',
'name' => 'Actualizare Software',
'menu_label' => 'Actualizari',
'menu_description' => 'Actualizati sistemul, gestionati si instalati plugin-uri si teme.',
'check_label' => 'Cauta actualizari disponibile',
'retry_label' => 'Incercati din nou',
'plugin_name' => 'Nume',
'plugin_description' => 'Descriere',
'plugin_version' => 'Versiune',
'plugin_author' => 'Autor',
'core_build' => 'Versiune curenta',
'core_build_old' => 'Versiune curenta :build',
'core_build_new' => 'Versiune :build',
'core_build_new_help' => 'Ultima versiune este disponibila.',
'core_downloading' => 'Se descarca fisierele aplicatiei',
'core_extracting' => 'Se dezarhiveaza fisierele aplicatiei',
'plugin_downloading' => 'Se descarca plugin-ul: :name',
'plugin_extracting' => 'Se dezarhiveaza plugin-ul: :name',
'plugin_version_none' => 'Plugin nou',
'plugin_version_old' => 'Versiune v:version',
'plugin_version_new' => 'v:version',
'theme_label' => 'Tema',
'theme_new_install' => 'Instalare tema noua.',
'theme_downloading' => 'Se descarca tema: :name',
'theme_extracting' => 'Se dezarhiveaza tema: :name',
'update_label' => 'Actualizare software',
'update_completing' => 'Se finalizeaza procesul de actualizare',
'update_loading' => 'Se incarca actualizarile disponibile...',
'update_success' => 'Procesul de actualizare a fost finalizat cu succes.',
'update_failed_label' => 'Actualizarea a esuat',
'force_label' => 'Forteaza actualizarea',
'found' => [
'label' => 'Au fost gasite noi actualizari!',
'help' => 'Apasati pe "Actualizare software" pentru a incepe procesul de actualizare.',
],
'none' => [
'label' => 'Nu exista actualizari',
'help' => 'Nu au fost gasite actualizari disponibile.',
],
],
'server' => [
'connect_error' => 'Eroare la conectarea la server.',
'response_not_found' => 'Serverul de actualizari nu a putut fi contactat.',
'response_invalid' => 'Raspuns invalid de la server.',
'response_empty' => 'Raspuns gol de la server.',
'file_error' => 'Serverul a esuat sa livreze pachetul software.',
'file_corrupt' => 'Fisierul de pe server este corupt.',
],
'behavior' => [
'missing_property' => 'Clasa :class trebuie sa defineasca proprietatea $:property folosita pentru caracteristica :behavior.',
],
'config' => [
'not_found' => 'Nu a fost gasit fisierul de configurare :file definit pentru :location.',
'required' => "Configuratia folosita in :location trebuie sa furnizeze o valoare ':property'.",
],
'zip' => [
'extract_failed' => "Nu s-a putut extrage fisierul de baza ':file'.",
],
'event_log' => [
'hint' => 'Acest jurnal afiseaza o lista de erori potentiale in aplicatie, cum ar fi exceptii sau informatie pentru depanare.',
'menu_label' => 'Jurnal evenimente',
'menu_description' => 'Vizualizati mesajele jurnalului de sistem cu inregistrarile de timp si detaliile aferente.',
'empty_link' => 'Golire jurnal de evenimente',
'empty_loading' => 'Se goleste jurnalul de evenimente...',
'empty_success' => 'Jurnalul de evenimente a fost golit cu succes.',
'return_link' => 'Intoarcere la jurnalul de evenimente',
'id' => 'ID',
'id_label' => 'ID eveniment',
'created_at' => 'Data & Ora',
'message' => 'Mesaj',
'level' => 'Nivel',
],
'request_log' => [
'hint' => 'Acest jurnal afiseaza o lista de cereri efectuate de browser care pot sa necesite atentie. De exemplu, daca un vizitator deschide o pagina in CMS care nu poate fi gasita, o inregistrare va fi creata cu un cod de status 404.',
'menu_label' => 'Jurnal cereri',
'menu_description' => 'Vizualizare cereri esuate sau redirectate, precum Pagini care nu au fost gasite (404).',
'empty_link' => 'Golire jurnal de cereri',
'empty_loading' => 'Se goleste jurnalul de cereri...',
'empty_success' => 'Jurnalul cu cereri a fost golit cu succes.',
'return_link' => 'Intoarcere la jurnal de cereri',
'id' => 'ID',
'id_label' => 'ID Jurnal',
'count' => 'Contor',
'referer' => 'Refereri',
'url' => 'URL',
'status_code' => 'Status',
],
'permissions' => [
'manage_system_settings' => 'Gestioneaza setarile sistemului',
'manage_software_updates' => 'Gestioneaza actualizarile software',
'manage_mail_templates' => 'Gestioneaza sabloanele de email',
'manage_other_administrators' => 'Gestioneaza alti administratori',
'view_the_dashboard' => 'Vizualizare panou de control'
]
];

View File

@ -0,0 +1,98 @@
<?php
return array(
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| such as the size rules. Feel free to tweak each of these messages.
|
*/
"accepted" => "Atributul :attribute trebuie sa fie acceptat.",
"active_url" => "Atributul :attribute nu este un URL valid.",
"after" => "Atributul :attribute trebuie sa fie o data dupa data de :date.",
"alpha" => "Atributul :attribute poate sa contina doar litere.",
"alpha_dash" => "Atributul :attribute poate sa contina doar litere, numere, si liniute.",
"alpha_num" => "Atributul :attribute poate sa contina doar litere si numere.",
"array" => "Atributul :attribute trebuie sa fie de tip array.",
"before" => "Atributul :attribute trebuie sa fie o data inainte de data de :date.",
"between" => array(
"numeric" => "Atributul :attribute trebuie sa fie intre :min - :max.",
"file" => "Atributul :attribute trebuie sa fie intre :min - :max kilobytes.",
"string" => "Atributul :attribute trebuie sa fie intre :min - :max caractere.",
"array" => "Atributul :attribute trebuie sa aiba intre :min - :max elemente.",
),
"confirmed" => "Atributul :attribute de confirmare nu se potriveste.",
"date" => "Atributul :attribute nu este o data valida.",
"date_format" => "Atributul :attribute nu se potriveste cu formatul :format.",
"different" => "Atributele :attribute si :other trebuie sa fie diferite.",
"digits" => "Atributul :attribute trebuie sa aiba :digits cifre.",
"digits_between" => "Atributul :attribute trebuie sa fie intre :min si :max cifre.",
"email" => "Formatul atributului :attribute este invalid.",
"exists" => "Atributul selectat :attribute este invalid.",
"image" => "Atributul :attribute trebuie sa fie o imagine.",
"in" => "Atributul selectat :attribute este invalid.",
"integer" => "Atributul :attribute trebuie sa fie un numar.",
"ip" => "Atributul :attribute trebuie sa fie o adresa IP valida.",
"max" => array(
"numeric" => "Atributul :attribute nu poate fi mai mare de :max.",
"file" => "Atributul :attribute nu poate fi mai mare de :max kilobytes.",
"string" => "Atributul :attribute nu poate fi mai mare de :max caractere.",
"array" => "Atributul :attribute nu poate avea mai mult de :max elemente.",
),
"mimes" => "Atributul :attribute trebuie sa fie un fisier de tipul: :values.",
"min" => array(
"numeric" => "Atributul :attribute trebuie sa aiba cel putin :min caractere",
"file" => "Atributul :attribute trebuie sa aiba cel putin :min kilobytes.",
"string" => "Atributul :attribute trebuie sa aiba cel putin :min caractere.",
"array" => "Atributul :attribute trebuie sa aiba cel putin :min elemente.",
),
"not_in" => "Atributul selectat :attribute este invalid.",
"numeric" => "Atributul :attribute trebuie sa fie un numar.",
"regex" => "Formatul atributului :attribute este invalid.",
"required" => "Campul atributului :attribute este necesar.",
"required_if" => "Campul atributului :attribute este necesar cand atributul :other are valoarea :value.",
"required_with" => "Campul atributului :attribute este necesar cand valorea :values este prezenta.",
"required_without" => "Campul atributului :attribute este necesar cand valoarea :values nu este prezenta.",
"same" => "Atributele :attribute si :other trebuie sa corespunda.",
"size" => array(
"numeric" => "Atributul :attribute trebuie sa aiba dimensiunea :size.",
"file" => "Atributul :attribute trebuie sa aiba dimensiunea :size kilobytes.",
"string" => "Atributul :attribute trebuie sa aiba :size caractere.",
"array" => "Atributul :attribute trebuie sa contina :size elemente.",
),
"unique" => "Atributul :attribute exista deja.",
"url" => "Formatul atributului :attribute este invalid.",
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => array(),
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => array(),
);

View File

@ -15,6 +15,8 @@ return [
'de' => 'German',
'ru' => 'Russian',
'fr' => 'French',
'it' => 'Italian',
'ro' => 'Romana',
],
'directory' => [
'create_fail' => "Невозможно создать директорию: :name",
@ -25,6 +27,20 @@ return [
'system' => [
'name' => 'Система',
'menu_label' => 'Система',
'categories' => [
'cms' => 'CMS',
'misc' => 'Разное',
'logs' => 'Логи',
'mail' => 'Почта',
'shop' => 'Магазин',
'team' => 'Команда',
'users' => 'Пользователи',
'system' => 'Система',
'social' => 'Социальное',
'events' => 'События',
'customers' => 'Клиентское',
'my_settings' => 'Мои настройки',
],
],
'plugin' => [
'unnamed' => 'Безымянный плагин',
@ -42,8 +58,11 @@ return [
'disabled_label' => 'Отключить',
'disabled_help' => 'Отключенные плагины будут игнорироваться.',
'selected_amount' => 'Выбрано плагинов: :amount',
'remove_confirm' => 'Вы уверены?',
'remove_success' => "Выбранные плагины успешно удалены.",
'refresh_confirm' => 'Вы уверены?',
'refresh_success' => "Выбранные плагины успешно обновлены.",
'disable_confirm' => 'Вы уверены?',
'disable_success' => "Плагин успешно отключен.",
'enable_success' => "Плагин успешно включен.",
'unknown_plugin' => "Плагин был удален из файловой системы.",
@ -207,4 +226,11 @@ return [
'url' => 'Адрес',
'status_code' => 'Статус',
],
'permissions' => [
'manage_system_settings' => 'Настройка системных параметров',
'manage_software_updates' => 'Управлять обновлениями',
'manage_mail_templates' => 'Управление почтовыми шаблонами',
'manage_other_administrators' => 'Управление другими администраторами',
'view_the_dashboard' => 'Просмотр приборной панели'
]
];

View File

@ -38,13 +38,21 @@ trait AssetMaker
if ($type != null) $type = strtolower($type);
$result = null;
$reserved = ['build'];
$pathCache = [];
if ($type == null || $type == 'css'){
foreach ($this->assets['css'] as $asset) {
/*
* Prevent duplicates
*/
$path = $this->getAssetEntryBuildPath($asset);
if (isset($pathCache[$path])) continue;
$pathCache[$path] = true;
$attributes = HTML::attributes(array_merge([
'rel' => 'stylesheet',
'href' => $this->getAssetEntryBuildPath($asset)
'href' => $path
],
array_except($asset['attributes'], $reserved)
));
@ -56,9 +64,16 @@ trait AssetMaker
if ($type == null || $type == 'rss'){
foreach ($this->assets['rss'] as $asset) {
/*
* Prevent duplicates
*/
$path = $this->getAssetEntryBuildPath($asset);
if (isset($pathCache[$path])) continue;
$pathCache[$path] = true;
$attributes = HTML::attributes(array_merge([
'rel' => 'alternate',
'href' => $this->getAssetEntryBuildPath($asset),
'href' => $path,
'title' => 'RSS',
'type' => 'application/rss+xml'
],
@ -72,8 +87,15 @@ trait AssetMaker
if ($type == null || $type == 'js') {
foreach ($this->assets['js'] as $asset) {
/*
* Prevent duplicates
*/
$path = $this->getAssetEntryBuildPath($asset);
if (isset($pathCache[$path])) continue;
$pathCache[$path] = true;
$attributes = HTML::attributes(array_merge([
'src' => $this->getAssetEntryBuildPath($asset)
'src' => $path
],
array_except($asset['attributes'], $reserved)
));