';
-
- // php version ...
- $isOk = version_compare(PHP_VERSION, '8.4', '>=');
- $listOk &= $isOk;
- $listHasErrors |= ! $isOk;
- $testOutput .= getStatus($isOk, 'Supported PHP version', 'Berta needs PHP >= 8.4 support on server. Ask your server administrator to enable supported PHP version.');
-
- // multibyte ...
- $isOk = function_exists('mb_ereg_replace') && function_exists('mb_strlen') && function_exists('mb_substr');
- $listOk &= $isOk;
- $listHasErrors |= ! $isOk;
- $testOutput .= getStatus($isOk, 'Server supports international characters', 'Berta cannot function properly without unicode text support. Please ask your server administrator for PHP Multibyte support.');
-
- // GD ...
- $gdInfo = function_exists('gd_info') ? gd_info() : false;
- $isOk = (bool) $gdInfo;
- $listOk &= $isOk;
- $listHasErrors |= ! $isOk;
- $testOutput .= getStatus($isOk, 'PHP Graphics library installed', 'Berta won\'t be able to resize and make thumbnails for images you will upload. Ask your server administrator for PHP GD support.');
-
- // GD formats ...
- if ($gdInfo) {
- $gdInfo['JPEG Support'] = isset($gdInfo['JPEG Support']) ? $gdInfo['JPEG Support'] : (isset($gdInfo['JPG Support']) ? $gdInfo['JPG Support'] : false);
- $listOk &= $gdInfo['JPEG Support'];
- $listHasErrors |= (! $gdInfo['GIF Read Support'] || ! $gdInfo['JPEG Support'] || ! $gdInfo['PNG Support']);
- $testOutput .= getStatus($gdInfo['GIF Read Support'], 'GIF read support', 'You won\'t be able to upload GIF images for your website', true, false);
- $testOutput .= getStatus($gdInfo['JPEG Support'], 'JPEG support', 'You won\'t be able to upload JPEG images for your website. Berta won\'t be able to make thumbnails for your images... bad! Ask your server administrator for JPEG support.', true);
- $testOutput .= getStatus($gdInfo['PNG Support'], 'PNG support', 'You won\'t be able to upload PNG images for your website', true, false);
- }
-
- // upload sizes ...
- $isOk = floatval(ini_get('upload_max_filesize')) >= 256 && floatval(ini_get('post_max_size')) >= 256;
- /* $listOk &= $isOk; */ $listHasErrors |= ! $isOk;
- $testOutput .= getStatus($isOk, 'Large file uploads (for videos) allowed',
- 'Your server runs PHP in CGI mode, which doesn\'t allow tweaking PHP options in .htaccess files. Please tell this to your server administrator and ask for bigger file uploads (over 200Mb for larger videos).', false, false);
-
- $testOutput .= '
Have you installed your website properly?
';
-
- // storage writable ...
- $isOk = file_exists($SITE_ROOT_PATH . 'storage') && is_writable($SITE_ROOT_PATH . 'storage');
- $listOk &= $isOk;
- $listHasErrors |= ! $isOk;
- $testOutput .= getStatus($isOk, 'Storage folder exists and is writable', 'Please make sure the folder called "storage" in your Berta installation exists and is writable. Check step (3) in the installing instructions (located in the INSTALL folder) for details.');
-
- $testOutput .= '
';
- $testOutput .= '
A green YES means that you don\'t even need to read what it is about - it\'s just all fine. A yellow NO means that ' .
- 'Berta will still work, but the feature will not be available to you. The red NO is the bad one - if there is one, it will have a suggestion ' .
- 'what can be done to correct the situation.
';
-
- // if the test was ok without any warnings then redirect to the next step
- if ($listOk && ! $listHasErrors) {
- header('Location: .?_berta_install_step=2' . (! empty($options['MULTISITE']) ? '&site=' . $options['MULTISITE'] : ''));
- exit;
- }
-}
-
-$version = $options['version'];
-
-?>
-
-
-
-settings->get('texts', 'pageTitle') ?> / welcome
-
-
-
-
-
-
-
-
Berta is already installed. Please delete folder named INSTALL in your Berta's root folder!
-
-
-
-
-
-
-
- Note: This check-list is displayed only once. To re-enable it you will need to manually edit settings.xml file in your storage folder and delete the row that looks like ' . htmlspecialchars('') . '.';
-
- if (! $listHasErrors) {
-
- // normally this is not visible because of a redirect earlier...
-
- echo '
';
- echo '
Welcome!
';
- echo '
Berta has completed a small test to see if it has everything it needs. It turns out that everything is just perfect.
Berta has completed a small test to see if it has everything it needs.
';
- echo '
It appears that there are some issues with the server or the installation. You will be able to use Berta, although with limited functionality. Please take a look at the results below.
Berta has completed a small test to see if it has everything it needs.
';
- echo '
It turns out that there are some problems with the server or with the installation. Please take a look at the results below and follow the suggestions for each error, and then come back again!
+ Berta has checked if it has everything it needs, and found problems
+ with the server or the installation. Follow the suggestions below,
+ then check again.
+
+ } @else {
+
+ Berta has checked if it has everything it needs. You can use Berta,
+ but some features will not be available.
+
+ }
+ `,
+ standalone: false,
+})
+export class ServerRequirementsComponent implements OnInit {
+ groups: RequirementGroup[] = [];
+ hasFatal = false;
+ isVisible = false;
+ isChecking = false;
+ showPassed = false;
+ passedCount = 0;
+
+ constructor(
+ private service: ServerRequirementsService,
+ private store: Store,
+ private router: Router,
+ ) {}
+
+ ngOnInit() {
+ this.check();
+ }
+
+ check() {
+ this.isChecking = true;
+ this.service
+ .check()
+ .pipe(finalize(() => (this.isChecking = false)))
+ .subscribe((response) => this.update(response));
+ }
+
+ continueAnyway() {
+ try {
+ sessionStorage.setItem(DISMISSED_STORAGE_KEY, '1');
+ } catch {
+ // Storage unavailable, dismiss for this page load only
+ }
+ this.isVisible = false;
+ }
+
+ private update(response: RequirementsResponse) {
+ this.redirectToLogin(response);
+
+ const requirements = response.installed ? [] : response.requirements;
+ const failed = requirements.filter((requirement) => !requirement.ok);
+
+ this.hasFatal = failed.some((requirement) => requirement.fatal);
+ this.passedCount = requirements.length - failed.length;
+ this.groups = [
+ this.buildGroup('Server', 'server', requirements),
+ this.buildGroup('Installation', 'installation', requirements),
+ ];
+ this.isVisible =
+ failed.length > 0 && (this.hasFatal || !this.isDismissed());
+ }
+
+ /**
+ * The editor's root route shows a blank preview while the site is not
+ * installed, so logged out visitors go straight to the login screen.
+ */
+ private redirectToLogin(response: RequirementsResponse) {
+ if (
+ response.installed === false &&
+ !this.store.selectSnapshot(UserState.isLoggedIn) &&
+ this.router.url.split('?')[0] === '/'
+ ) {
+ this.router.navigate(['/login'], { queryParamsHandling: 'preserve' });
+ }
+ }
+
+ private buildGroup(
+ title: string,
+ group: RequirementModel['group'],
+ requirements: RequirementModel[],
+ ): RequirementGroup {
+ const inGroup = requirements.filter(
+ (requirement) => requirement.group === group,
+ );
+
+ return {
+ title,
+ // Fatal failures first
+ failed: inGroup
+ .filter((requirement) => !requirement.ok)
+ .sort((a, b) => Number(b.fatal) - Number(a.fatal)),
+ passed: inGroup.filter((requirement) => requirement.ok),
+ };
+ }
+
+ private isDismissed(): boolean {
+ try {
+ return sessionStorage.getItem(DISMISSED_STORAGE_KEY) === '1';
+ } catch {
+ return false;
+ }
+ }
+}
diff --git a/editor/src/app/setup/server-requirements/server-requirements.interface.ts b/editor/src/app/setup/server-requirements/server-requirements.interface.ts
new file mode 100644
index 000000000..1554719c6
--- /dev/null
+++ b/editor/src/app/setup/server-requirements/server-requirements.interface.ts
@@ -0,0 +1,14 @@
+export interface RequirementModel {
+ key: string;
+ group: 'server' | 'installation';
+ label: string;
+ ok: boolean;
+ fatal: boolean;
+ message: string;
+}
+
+export interface RequirementsResponse {
+ /** `null` when the API could not boot and the installed state is unknown */
+ installed: boolean | null;
+ requirements: RequirementModel[];
+}
diff --git a/editor/src/app/setup/server-requirements/server-requirements.service.spec.ts b/editor/src/app/setup/server-requirements/server-requirements.service.spec.ts
new file mode 100644
index 000000000..cbe5b2357
--- /dev/null
+++ b/editor/src/app/setup/server-requirements/server-requirements.service.spec.ts
@@ -0,0 +1,90 @@
+import { TestBed } from '@angular/core/testing';
+import { provideHttpClient } from '@angular/common/http';
+import {
+ HttpTestingController,
+ provideHttpClientTesting,
+} from '@angular/common/http/testing';
+import { ServerRequirementsService } from './server-requirements.service';
+import { RequirementsResponse } from './server-requirements.interface';
+
+describe('ServerRequirementsService', () => {
+ let service: ServerRequirementsService;
+ let http: HttpTestingController;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [provideHttpClient(), provideHttpClientTesting()],
+ });
+ service = TestBed.inject(ServerRequirementsService);
+ http = TestBed.inject(HttpTestingController);
+ });
+
+ afterEach(() => http.verify());
+
+ it('returns the requirements', () => {
+ const body: RequirementsResponse = { installed: false, requirements: [] };
+ let result: RequirementsResponse;
+
+ service.check().subscribe((response) => (result = response));
+ http.expectOne('/_api/v1/requirements').flush(body);
+
+ expect(result).toEqual(body);
+ });
+
+ it('checks the installed state again on every call', () => {
+ const values: boolean[] = [];
+
+ service.isNotInstalled().subscribe((value) => values.push(value));
+ http
+ .expectOne('/_api/v1/requirements')
+ .flush({ installed: false, requirements: [] });
+
+ // Setup finished in the meantime, e.g. logout after the setup wizard
+ service.isNotInstalled().subscribe((value) => values.push(value));
+ http
+ .expectOne('/_api/v1/requirements')
+ .flush({ installed: true, requirements: [] });
+
+ expect(values).toEqual([true, false]);
+ });
+
+ it('uses the requirements payload of the pre-boot guard error', () => {
+ const body: RequirementsResponse = {
+ installed: null,
+ requirements: [
+ {
+ key: 'php',
+ group: 'server',
+ label: 'PHP',
+ ok: false,
+ fatal: true,
+ message: 'Too old',
+ },
+ ],
+ };
+ let result: RequirementsResponse;
+
+ service.check().subscribe((response) => (result = response));
+ http
+ .expectOne('/_api/v1/requirements')
+ .flush(body, { status: 503, statusText: 'Service Unavailable' });
+
+ expect(result).toEqual(body);
+ });
+
+ it('reports an unreadable API error as a warning, never blocking', () => {
+ let result: RequirementsResponse;
+
+ service.check().subscribe((response) => (result = response));
+ http.expectOne('/_api/v1/requirements').flush('Composer detected issues', {
+ status: 500,
+ statusText: 'Server Error',
+ });
+
+ expect(result.installed).toBeNull();
+ expect(result.requirements.length).toBe(1);
+ expect(result.requirements[0].ok).toBeFalse();
+ expect(result.requirements[0].fatal).toBeFalse();
+ expect(result.requirements[0].message).toContain('500');
+ });
+});
diff --git a/editor/src/app/setup/server-requirements/server-requirements.service.ts b/editor/src/app/setup/server-requirements/server-requirements.service.ts
new file mode 100644
index 000000000..51d70388c
--- /dev/null
+++ b/editor/src/app/setup/server-requirements/server-requirements.service.ts
@@ -0,0 +1,56 @@
+import { HttpClient, HttpErrorResponse } from '@angular/common/http';
+import { Injectable } from '@angular/core';
+import { Observable, of } from 'rxjs';
+import { catchError, map } from 'rxjs/operators';
+import { RequirementsResponse } from './server-requirements.interface';
+
+@Injectable({
+ providedIn: 'root',
+})
+export class ServerRequirementsService {
+ constructor(private http: HttpClient) {}
+
+ check(): Observable {
+ return this.http
+ .get('/_api/v1/requirements')
+ .pipe(
+ catchError((error: HttpErrorResponse) =>
+ of(this.getErrorResponse(error)),
+ ),
+ );
+ }
+
+ /** Fresh on every call, the site gets installed during the session */
+ isNotInstalled(): Observable {
+ return this.check().pipe(map((response) => response.installed === false));
+ }
+
+ /**
+ * The API answers with the requirements payload even when Laravel can't
+ * boot (see `_api_app/bootstrap/requirements_guard.php`). Any other error
+ * may be temporary (network, proxy) and also happens on installed sites, so
+ * it is reported as a dismissible warning instead of blocking the editor.
+ */
+ private getErrorResponse(error: HttpErrorResponse): RequirementsResponse {
+ if (Array.isArray(error.error?.requirements)) {
+ return error.error as RequirementsResponse;
+ }
+
+ return {
+ installed: null,
+ requirements: [
+ {
+ key: 'api',
+ group: 'server',
+ label: 'Server requirements checked',
+ ok: false,
+ fatal: false,
+ message:
+ 'Berta could not check the server requirements' +
+ (error.status ? ` (error ${error.status})` : '') +
+ ". If the editor doesn't work, check the server's PHP error log.",
+ },
+ ],
+ };
+ }
+}
diff --git a/editor/src/app/setup/setup-wizard.component.ts b/editor/src/app/setup/setup-wizard.component.ts
index 6ceba1775..f38400fb8 100644
--- a/editor/src/app/setup/setup-wizard.component.ts
+++ b/editor/src/app/setup/setup-wizard.component.ts
@@ -34,12 +34,9 @@ interface WizardFields {
}
/**
- * Real Angular replacement for the legacy first-run setup page
- * (`INSTALL/includes/wizzard.php`), which rendered its 3 fields as
- * `xEditable`-class inline-edit spans inside the preview iframe. Reuses the
- * exact same `` input components and `UpdateSiteSettingsAction`
- * the normal Settings page (`SiteSettingsComponent`) already uses for these
- * same fields, so only the presentation changes, not the save mechanism.
+ * First-run setup wizard, shown while the site is not installed. Reuses the
+ * same `` input components and `UpdateSiteSettingsAction` the
+ * normal Settings page (`SiteSettingsComponent`) uses for these fields.
*/
@Component({
selector: 'berta-setup-wizard',
diff --git a/editor/src/styles/_login.scss b/editor/src/styles/_login.scss
index 968998e33..b0af3ca45 100644
--- a/editor/src/styles/_login.scss
+++ b/editor/src/styles/_login.scss
@@ -103,6 +103,11 @@ berta-login {
}
}
+ .setup-notice {
+ font-size: variables.$input-font-size;
+ margin: 0 1.3em;
+ }
+
.error-message {
color: variables.$error-color;
font-size: variables.$input-font-size;
diff --git a/editor/src/styles/_server-requirements.scss b/editor/src/styles/_server-requirements.scss
new file mode 100644
index 000000000..e260eb312
--- /dev/null
+++ b/editor/src/styles/_server-requirements.scss
@@ -0,0 +1,107 @@
+@use "variables";
+
+// Blocks the whole editor, including the header, sidebar and preview
+.server-requirements-overlay {
+ background: rgba(variables.$black, 0.3);
+ inset: 0;
+ position: fixed;
+ z-index: 60;
+}
+
+.server-requirements {
+ background-color: variables.$white;
+ border-radius: variables.$border-radius;
+ box-sizing: border-box;
+ color: variables.$grey-90;
+ font-size: variables.$input-font-size;
+ left: 50%;
+ max-height: calc(100% - 2rem);
+ max-width: calc(100% - 2rem);
+ overflow-y: auto;
+ padding: 1.3rem;
+ position: fixed;
+ top: 50%;
+ transform: translate(-50%, -50%);
+ width: 560px;
+ z-index: 61;
+
+ h2 {
+ font-size: 1.5rem;
+ margin: 0 0 0.75rem;
+ }
+
+ h3 {
+ border-bottom: 1px solid variables.$grey-10;
+ font-size: 1rem;
+ margin: 1.3rem 0 0;
+ padding-bottom: 0.5rem;
+ }
+
+ ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ }
+
+ li {
+ border-bottom: 1px solid variables.$grey-10;
+ display: flex;
+ gap: 0.75rem;
+ padding: 0.6rem 0;
+ }
+
+ .status {
+ border-radius: variables.$border-radius;
+ color: variables.$white;
+ flex-shrink: 0;
+ font-size: 0.75rem;
+ font-weight: bold;
+ height: fit-content;
+ padding: 0.2em 0;
+ text-align: center;
+ width: 2.75rem;
+ }
+
+ .ok .status {
+ background-color: variables.$success-color;
+ }
+
+ .warning .status {
+ background-color: variables.$warn-color;
+ }
+
+ .fail .status {
+ background-color: variables.$error-color;
+ }
+
+ .message {
+ color: variables.$grey-80;
+ margin-top: 0.25rem;
+ }
+
+ .fail .message {
+ color: variables.$error-color;
+ }
+
+ .toggle-passed {
+ background: none;
+ color: variables.$grey-80;
+ cursor: pointer;
+ font-size: inherit;
+ margin-top: 0.75rem;
+ padding: 0;
+ text-decoration: underline;
+
+ &:hover {
+ color: variables.$berta-accent;
+ }
+ }
+
+ .actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.75rem;
+ justify-content: flex-end;
+ margin-top: 1.3rem;
+ }
+}
diff --git a/editor/src/styles/_variables.scss b/editor/src/styles/_variables.scss
index fb268a56a..2761beea0 100644
--- a/editor/src/styles/_variables.scss
+++ b/editor/src/styles/_variables.scss
@@ -5,6 +5,7 @@ $white: #fff;
$black: #000;
$error-color: #f00;
$warn-color: #ff800c;
+$success-color: #1e9e46;
$facebook-color: #3b5998;
$google-color: #4285f4;
diff --git a/editor/src/styles/styles.scss b/editor/src/styles/styles.scss
index e8a057901..60ca8b39e 100644
--- a/editor/src/styles/styles.scss
+++ b/editor/src/styles/styles.scss
@@ -14,6 +14,7 @@
@use "login";
@use "account";
@use "popup";
+@use "server-requirements";
@use "media";
@use "entry-gallery-editor";
@use "entry-gallery-image-editor";
diff --git a/engine/_classes/class.bertautils.php b/engine/_classes/class.bertautils.php
index c0d934db5..1ef4b76bf 100644
--- a/engine/_classes/class.bertautils.php
+++ b/engine/_classes/class.bertautils.php
@@ -304,7 +304,7 @@ public static function logEvent($action = '')
'host' => $_SERVER['HTTP_HOST'],
'action' => $action,
];
- $url = 'http://hosting.berta.me/stats';
+ $url = 'https://hosting.berta.me/stats';
$ch = curl_init();
$timeout = 30;
curl_setopt($ch, CURLOPT_URL, $url);
diff --git a/engine/inc.editor_redirect.php b/engine/inc.editor_redirect.php
new file mode 100644
index 000000000..19583178e
--- /dev/null
+++ b/engine/inc.editor_redirect.php
@@ -0,0 +1,19 @@
+Berta'
+ . ''
+ . '';
+}
diff --git a/engine/inc.engineprefs.php b/engine/inc.engineprefs.php
index a4f735927..576d88aaa 100644
--- a/engine/inc.engineprefs.php
+++ b/engine/inc.engineprefs.php
@@ -104,18 +104,6 @@
*/
require 'inc.hosting.php';
-// if hosted on HIP, need to show "hosted on HIP"
-// $options['hip_ipaddr'] = array('85.31.99.218', '85.31.102.201');
-$options['hip_ipaddr'] = [];
-
-// external
-$options['remote_update_uri'] = [
- 'http://www.berta.me/news_ticker_videos_update.php',
-];
-foreach ($options['hip_ipaddr'] as $ip) {
- $options['remote_update_uri'][] = 'http://' . $ip . '/berta-remote/news_ticker_videos_update.php';
-}
-
$options['images']['small_width'] = 200;
$options['images']['small_height'] = 200;
diff --git a/engine/inc.page.php b/engine/inc.page.php
index 44a5c51c5..94a5ec1fa 100644
--- a/engine/inc.page.php
+++ b/engine/inc.page.php
@@ -60,17 +60,6 @@
$ENGINE_ROOT_URL = $SITE_ROOT_URL . 'engine/';
}
-$hasSupportedPhpVersion = version_compare(PHP_VERSION, '8.4', '>=');
-
-if (! $hasSupportedPhpVersion) {
- if (file_exists($SITE_ROOT_PATH . 'INSTALL/includes/first_visit_serverreqs.php')) {
- $CHECK_INCLUDED = true;
- include $SITE_ROOT_PATH . 'INSTALL/includes/first_visit_serverreqs.php';
- } else {
- exit('Berta needs PHP >= 8.4 support on server.');
- }
-}
-
include 'inc.error_handling.php';
include_once 'inc.functions.php';
@@ -143,35 +132,12 @@ function addSlashesRecursive($var)
define('SETTINGS_INSTALLREQUIRED', true);
}
if (SETTINGS_INSTALLREQUIRED && ! $berta->settings->get('berta', 'installed')) {
- if ($berta->security->userLoggedIn) {
- $step = ! empty($_REQUEST['_berta_install_step']) ? (int) $_REQUEST['_berta_install_step'] : 1;
- if ($step < 1) {
- $step = 1;
- }
- if ($step > 2) {
- $step = 2;
- }
-
- switch ($step) {
- case 1:
- if (file_exists($SITE_ROOT_PATH . 'INSTALL/includes/check.php')) {
- $CHECK_INCLUDED = true;
- include $SITE_ROOT_PATH . 'INSTALL/includes/check.php';
- exit;
- }
- break;
- case 2:
- exit;
- }
- } else {
- if (file_exists($SITE_ROOT_PATH . 'INSTALL/includes/first_visit.php')) {
- $CHECK_INCLUDED = true;
- include $SITE_ROOT_PATH . 'INSTALL/includes/first_visit.php';
- } else {
- exit('Berta not installed.');
- }
- exit;
+ // Logged in users get the requirements check and the setup wizard in the Angular editor,
+ // the site itself has nothing to render yet.
+ if (! $berta->security->userLoggedIn) {
+ bertaRenderEditorRedirect($ENGINE_ROOT_URL . 'login' . (! empty($options['MULTISITE']) ? '?site=' . rawurlencode($options['MULTISITE']) : ''));
}
+ exit;
}
// check installation ------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/engine/lang/en.php b/engine/lang/en.php
index 6eafadea4..1fb5c0160 100644
--- a/engine/lang/en.php
+++ b/engine/lang/en.php
@@ -1,7 +1,7 @@
'Built with Berta.me',
+ 'berta_copyright_text' => 'Built with Berta.me',
'margins_help_text' => 'Margins are tricky. Use px or em as units. You can set margins in 4 ways, by entering: 1 value - sets top, right, bottom and left margins to the same value. Example: 10px. 2 values - sets top and bottom margins to the first value, left and right - to the second. Example: 0 5px. 3 values - sets top margin to the first value, left and right - to the second, bottom - to the third value. Example: 10px 0 20px. 4 values - sets all margins in the following order: top, right, bottom, left. Example: 10px 0 20px 2px.',
'units_help_text' => 'Valid units for any numerical value are: px - pixels. Example: 10px. By using just numbers value WILL NOT change. em - 1em = one length of letter M in the font used. Example: 1em % - percent of the font size or percent of the dimensions of the container element (e.g. the page etc.)',
@@ -12,20 +12,13 @@
'password_help_text' => 'Password must be at least 6 characters long and containing alphanumeric (A-Z, a-z, 0-9) characters.',
- 'welcome_text__not_installed' => '
Thank you for choosing Berta.me!
-
Your site is not yet set up. Please log in to create your website.
',
-
- 'welcome_text__not_supported' => '
Thank you for choosing Berta.me!
-
This server does not meet Berta\'s requirements.
- Please check that PHP version 5 or above is installed on the server.
',
- 'setup_info_text' => 'Click on yellow fields to edit. Press ENTER or click outside a yellow field to save your entry. This way you can edit content in Berta.me.',
'googleFont_description' => 'Type in any google font name. To check available fonts go to Google Fonts. Remember – google font overrides system font. Leave empty if you want to use system font. Example: Marvel, Marvel:700italic or Josefin Slab:700italic',
'description_tagsMenu_x' => 'Submenu X position in pixels (i.e. 10px)',
'description_tagsMenu_y' => 'Submenu Y position in pixels (i.e. 10px)',
'description_menu_position' => 'Menu position',
'description_banner' => 'Banners are images which are visible in all sections. Use it for buttons or social icons in your site. Displayed image will be half of the original size, full size will be used for hi-res displays.',
- 'description_banner_link' => 'Banner link \'http://\' should be in front of the address',
+ 'description_banner_link' => 'Banner link \'https://\' should be in front of the address',
'description_language' => 'Choose language of interface.',
'Heading position' => 'Heading position fixed or absolute. Fixed always stays in one place, absolute moves together with content.',
'description_heading_position' => 'Heading position fixed or absolute. Fixed always stays in one place, absolute moves together with content.',
diff --git a/engine/lang/es.php b/engine/lang/es.php
index 1e6ea204e..9d86dce61 100644
--- a/engine/lang/es.php
+++ b/engine/lang/es.php
@@ -1,7 +1,7 @@
'Construido con Berta.me',
+ 'berta_copyright_text' => 'Construido con Berta.me',
'margins_help_text' => 'Los márgenes son difíciles. Usa px o em como unidades. Puede establecer los márgenes de 4 maneras, by entering: 1 value - Establece la parte superior, los márgenes derecho, inferior e izquierdo con el mismo valor. Ejemplo: 10px. 2 valores - establece los márgenes superior e inferior al primer valor, izquierda y derecha - a la segunda. Ejemplo: 0 5px. 3 values - establecer el margen superior al primer valor, izquierda y derecha - a la segunda, parte inferior - al tercer valor. Ejemplo: 10px 0 20px. 4 valores - establece los márgenes en el siguiente orden: arriba, derecha, abajo, izquierda. Ejemplo: 10px 0 20px 2px.',
'units_help_text' => 'Las unidades válidas para cualquier valor numérico son: px - pixels. Ejemplo: 10px. Mediante el uso de sólo los valores de los números, NO VA A CAMBIAR. em - 1em = un tramo de la letra M en la fuente utilizada. Ejemlo: 1em % - un porcentaje del tamaño de la fuente o un porcentaje de las dimensiones del elemento de contenedor (por ejemplo: la página, etc)',
@@ -11,22 +11,13 @@
'password_help_text' => 'La contraseña debe tener como mínimo 6 caracteres y que contiene alfanuméricos (A-Z, a-z, 0-9) caracteres.',
- 'welcome_text__not_installed' => '
¡Gracias por elegir Berta.me!
-
Berta no esta instalado. Por favor, iniciar sesion y siga el procedimiento de instalación.
',
-
- 'welcome_text__not_supported' => '
¡Gracias por elegir Berta.me!
-
Este servidor no cumple los requisitos Berta\'s.
- Compruebe que PHP versión 5 o superior este instalado en el servidor.
',
- 'setup_info_text' => 'Haga clic en los campos con fondo amarillo para modificarlas.
- A continuación, pulse Intro o haga clic en cualquier lugar fuera del campo para guardar.
- De esta manera, será a través de su sitio - todo lo que tiene un fondo de color amarillo es editable. También será capaz de cambiar esta configuración más tarde.',
'googleFont_description' => 'Escriba un nombre de fuente google fuente. Para comprobar las fuentes disponibles vaya a Google Fonts. Recuerde - fuente del sistema anula la google fuente. Dejar en blanco si desea utilizar la fuente del sistema. Ejemplo: Marvel, Marvel:700italic or Josefin Slab:700italic',
'description_tagsMenu_x' => 'Submenu X posición en píxeles (es decir, 10px)',
'description_tagsMenu_y' => 'Submenu Y posición en píxeles (es decir, 10px)',
'description_menu_position' => 'Posición de menú',
'description_banner' => 'Banners are images which are visible in all sections. Use it for buttons or social icons in your site. Displayed image will be half of the original size, full size will be used for hi-res displays.',
- 'description_banner_link' => 'Enlace banner \'http://\' debe estar al frente de la dirección',
+ 'description_banner_link' => 'Enlace banner \'https://\' debe estar al frente de la dirección',
'description_language' => 'Elija el idioma de la interfaz de Berta. Actualiza sitio, para aplicar.',
'Heading position' => 'Fija o absoluta la posición de la cabecera. Fijo siempre se queda en un solo lugar, absoluta se mueve junto con el contenido.',
'description_heading_position' => 'Fija o absoluta la posición de la cabecera. Fijo siempre se queda en un solo lugar, absoluta se mueve junto con el contenido.',
diff --git a/engine/lang/fr.php b/engine/lang/fr.php
index 9b1803804..5d596b9e7 100644
--- a/engine/lang/fr.php
+++ b/engine/lang/fr.php
@@ -1,7 +1,7 @@
'Développé avec Berta.me',
+ 'berta_copyright_text' => 'Développé avec Berta.me',
// Translations from the top "admin" menu
@@ -25,29 +25,6 @@
'Logout ok. Please wait...' => 'Déconnexion. Merci de patienter…',
'Log in' => 'Se connecter',
- // First visit
-
- 'welcome' => 'Bienvenue !',
- 'welcome_text__not_installed' => '
Merci d\'avoir choisi Berta.me!
-
Berta n\'est pas encore installé. Merci de vous connecter et de suivre la procédure d\'installation.
',
-
- 'welcome_text__not_supported' => '
Merci d\'avoir choisi Berta.me!
-
Ce serveur n\'est pas compatible avec Berta.
- Merci de vérifier que la version de PHP installée sur le serveur est égale ou supérieure à 5.
',
-
- 'Setup your site' => 'Paramétrez votre site',
- 'setup_info_text' => 'Cliquez sur les champs sur fond jaune pour les éditer.
- Puis, appuyez sur Entrée ou cliquez ailleurs pour enregistrer.
- Chaque élément de votre site ayant un fond jaune est donc modifiable. Vous serez en mesure de changer ces paramètres plus tard.',
- 'What is the title of your site?' => 'Quel est le titre de votre site ,',
- 'Site title will be visible in all sections of your site.' => 'Le titre du site est visible dans toutes les sections du site',
- 'What is your name?' => 'Quel est votre nom ?',
- 'It will appear in the copyright notice in the footer. You may leave it blank.' => 'Votre nom sera affiché dans la note de copyright en bas de site. Vous pouvez laisser le champ vide.',
- 'What is this website about?' => 'En une phrase, décrivez votre site.',
- 'It will appear under your site name in search engine results.' => 'Cela aparaitra en dessous du titre de votre site dans les moteurs de recherche.',
- 'Note: the fields that already have value appear yellow only when you roll over them with your mouse. Click on the text below to edit.' => 'À noter : Les champs déjà saisis n’aparaissent en jaune qu’au survol. Cliquez sur le texte survolé pour l’éditer.',
- 'Done!' => 'Fait !',
-
// Translatins from sections editor (sections.php)
/* title */
@@ -164,8 +141,6 @@
/* setting name */
'Is enabled by default' => 'Activée par défaut',
/* setting name */
- 'Background color' => 'Couleur de fond',
- /* setting name */
'Image numbers' => 'Numéros d’image',
/* setting name */
'Caption alignment' => 'Alignement de la légende',
@@ -465,7 +440,7 @@
'description_menu_position' => 'Position du menu',
'description_banner' => 'Banners are images which are visible in all sections. Use it for buttons or social icons in your site. Displayed image will be half of the original size, full size will be used for hi-res displays.',
- 'description_banner_link' => 'N’oubliez pas « http:// » devant les liens de bannière.',
+ 'description_banner_link' => 'N’oubliez pas « https:// » devant les liens de bannière.',
'description_language' => 'Choisissez votre langue pour l’interface de Berta. Rafraîchissez la page pour pour appliquer les modifications.',
'Heading position' => 'Position de l’entête',
'description_heading_position' => 'Position de la description d’entête : fixe (Fixed) ou absolue (Absolute). La position fixe restera toujours en place sur la page, la positions absolue se déplace avec le contenu au défilement.',
diff --git a/engine/lang/lv.php b/engine/lang/lv.php
index 38202df4c..4b132e2d7 100644
--- a/engine/lang/lv.php
+++ b/engine/lang/lv.php
@@ -1,7 +1,7 @@
'Berta.me',
+ 'berta_copyright_text' => 'Berta.me',
// Translations from the top "admin" menu
@@ -25,27 +25,6 @@
'Logout ok. Please wait...' => 'Lūdzu, uzgaidi...',
'Log in' => 'Ielogoties',
- // First visit
-
- 'welcome' => 'Esi sveicināts!',
- 'welcome_text__not_installed' => '
Paldies, ka izvēlējies Berta.me!
-
Berta nav uzstādīta. Lūdzu ielogojies un seko uzstādīšanas procedūrai.
',
-
- 'welcome_text__not_supported' => '
Paldies, ka izvēlējies Berta.me!
-
This server does not meet Berta\'s requirements.
- Please check that PHP version 5 or above is installed on the server.
',
-
- 'Setup your site' => 'Setup your site',
- 'setup_info_text' => 'Dzeltenās krāsas lauki ir labojami. Lai saglabātu ierakstu, nospied ENTER vai klikšķini ārpus datu lauka. Šādi iespējams ievadīt vai labot saturu Berta.me rīkā.',
- 'What is the title of your site?' => 'Kāds ir tavas lapas virsraksts?',
- 'Site title will be visible in all sections of your site.' => 'Lapas virsraksts būs redzams visās sadaļās',
- 'What is your name?' => 'Ievadi savu vārdu',
- 'It will appear in the copyright notice in the footer. You may leave it blank.' => 'Vārds tiks pievienots pie (c) simbola lapas apakšā. Lauku var atstāt arī tukšu.',
- 'What is this website about?' => 'Lapas apraksts.',
- 'It will appear under your site name in search engine results.' => 'Meklētāj-programmās tas parādīsies zem tavas lapas nosaukuma kā apraksts.',
- 'Note: the fields that already have value appear yellow only when you roll over them with your mouse. Click on the text below to edit.' => 'Piezīme: aizpildītie lauki kļūst dzelteni tiem uzbraucot ar peles kursoru. Klikšķini uz teksta zemāk, lai labotu.',
- 'Done!' => 'Darīts!',
-
// Translatins from sections editor (sections.php)
/* title */
@@ -176,8 +155,6 @@
'Is enabled by default' => 'Pēc noklusējuma ieslēgts',
/* help text */
'Enables gallery fullscreen mode for new entries.' => 'Ieslēdz galerijas pilnekrāna režīmu jauniem ierakstiem.',
- /* setting name */
- 'Background color' => 'fona krāsa',
/* help text */
'Color of the fullscreen gallery background.' => 'Galerijas pilnekrāna fona krāsa.',
/* setting name */
@@ -485,7 +462,7 @@
'description_tagsMenu_y' => 'Apakšizvēlnes Y pozīcija pikseļos (piem.: 50px)',
'description_menu_position' => 'Izvēlnes pozicionēšana',
'description_banner' => 'Banners are images which are visible in all sections. Use it for buttons or social icons in your site. Displayed image will be half of the original size, full size will be used for hi-res displays.',
- 'description_banner_link' => 'Bannera saite. Adreses priekšā neaizmirsti pievienot http:// (piem.: http://www.berta.me)',
+ 'description_banner_link' => 'Bannera saite. Adreses priekšā neaizmirsti pievienot https:// (piem.: https://www.berta.me)',
'description_language' => 'Izvēlies interfeisa valodu.',
'Heading position' => 'Galvenes pozīcija',
'description_heading_position' => 'Galvenes novietojums, fiksēts vai nefiksēts',
@@ -542,7 +519,6 @@
'Discount in precents when user enters valid promo code' => 'Atlaides procentuāls apjoms uz precēm, ja pircējs ievadījis pareizu kodu.',
'Weight units' => 'Svara mērvienība',
'Weight units (g, oz) used for postage cost calculation.' => 'Svara mērvienība (g, oz), kas tie lietota pie pasta izdevumu aprēķina.',
- 'Design' => 'Dizains',
'Shop entry width' => 'Veikala ieraksta platums',
'Title' => 'Virsraksts',
'What is SEO?' => 'Kas ir SEO?',
diff --git a/engine/lang/nl.php b/engine/lang/nl.php
index 5bee55a8e..2105dbf09 100644
--- a/engine/lang/nl.php
+++ b/engine/lang/nl.php
@@ -1,7 +1,7 @@
'Gemaakt met Berta.me',
+ 'berta_copyright_text' => 'Gemaakt met Berta.me',
// Translations from the top "admin" menu
@@ -25,29 +25,6 @@
'Logout ok. Please wait...' => 'Uitloggen. Wacht even A.U.B.…',
'Log in' => 'Inloggen',
- // First visit
-
- 'welcome' => 'Welkom!',
- 'welcome_text__not_installed' => '
Goed dat je Berta.me gebruikt!
-
Berta is nog niet geconfigureerd. Log in en volg de set up procedure.
',
-
- 'welcome_text__not_supported' => '
Goed dat je Berta.me gebruikt!
-
Deze server voldoet helaas niet aan Berta\'s minimum eisen.
- PHP versie 5 of hoger moet op de server geinstalleerd zijn.
',
-
- 'Setup your site' => 'Richt jouw site in',
- 'setup_info_text' => 'Klik op de geelgekleurde velden om deze te editen.
- Om te bewaren toets Enter of klik buiten het geelgekleurde veld.
- Dit werkt zo door de hele site; alles met een gele achtergrondkleur is editable. Je kan deze instellingen later ook veranderen.',
- 'What is the title of your site?' => 'Wat is de titel (naam) van jouw site?',
- 'Site title will be visible in all sections of your site.' => 'De titel (naam) van jouw site is zichtbaar in alle Sections van jouw site.',
- 'What is your name?' => 'Wat is jouw naam?',
- 'It will appear in the copyright notice in the footer. You may leave it blank.' => 'Jouw naam wordt in de copyright-notice onderin (in de footer) het beeld gezet. Je mag dit ook leeg laten.',
- 'What is this website about?' => 'Hoe zou je -in één zin- jouw site beschrijven?',
- 'It will appear under your site name in search engine results.' => 'Dit zal verschijnen als samenvatting onder de sitenaam in de (Google) zoekresultaten.',
- 'Note: the fields that already have value appear yellow only when you roll over them with your mouse. Click on the text below to edit.' => 'Tip: de velden die al een waarde hebben verschijnen alleen als gele velden als je eroverheen gaat met je cursor . Klik op[ onderstaande tekst om deze aan te passen.',
- 'Done!' => 'Klaar!',
-
// Translatins from sections editor (sections.php)
/* title */
@@ -260,8 +237,6 @@
/* setting tab */
'Background' => 'Background',
- /* setting name */
- 'Background color' => 'Background color',
/* help text */
'IMPORTANT! These settings will be overwritten, if you are using background gallery feature. You access it by clicking "edit background gallery" button in each section.' => 'Belangrijk! Deze instellingen worden overschreven als je de background gallery gebruikt. Je kan deze openen met de "edit background" button rechtbovenin je scherm in elke Section.',
/* setting name */
@@ -297,7 +272,7 @@
/* help name */
'Content width if layout is centered.' => 'Breedte van de content als deze gecentreerd is.',
/* setting name */
- 'Centered content width' => 'Centering guides kleurschema',
+ 'Centering guides color tone' => 'Centering guides kleurschema',
/* help name */
'Color tone for centering guides (dark for bright background colors, bright for dark background colors).' => 'Kleurschema voor de centering guides (dark voor heldere backgroundcolors, bright voor donkere backgroundcolors).',
@@ -494,7 +469,7 @@
'description_tagsMenu_y' => 'Submenu Y positie in pixels (bijv. 10px)',
'description_menu_position' => 'Menu positie',
'description_banner' => 'Banners are images which are visible in all sections. Use it for buttons or social icons in your site. Displayed image will be half of the original size, full size will be used for hi-res displays.',
- 'description_banner_link' => 'Banner link \'http://\' moet zich voor het adres bevinden',
+ 'description_banner_link' => 'Banner link \'https://\' moet zich voor het adres bevinden',
'description_language' => 'Kies hier de taal van de Berta interface. Refresh site om toe te passen.',
'Heading position' => 'Heading positie fixed of absolute. Fixed blijft altijd op dezelfde plaats, absolute beweegt mee met de content.',
'description_heading_position' => 'Heading positie fixed of absolute. Fixed blijft altijd op dezelfde plaats, absolute beweegt mee met de content.',
diff --git a/engine/lang/pl.php b/engine/lang/pl.php
index e07d239ff..5f8e2dc10 100644
--- a/engine/lang/pl.php
+++ b/engine/lang/pl.php
@@ -1,7 +1,7 @@
'Berta.me',
+ 'berta_copyright_text' => 'Berta.me',
// Translations from the top "admin" menu
@@ -25,29 +25,6 @@
'Logout ok. Please wait...' => 'Proszę, czekać...',
'Log in' => 'Zalogować się',
- // First visit
-
- 'welcome' => 'Witamy!',
- 'welcome_text__not_installed' => '
Dziękujemy, że wybrałeś Berta.me!
-
Berta nie jest zainstalowana. Proszę zaloguj się i przejdź proces instalacji.
',
-
- 'welcome_text__not_supported' => '
Dziękujemy, że wybrałeś Berta.me!
-
This server does not meet Berta\'s requirements.
- Please check that PHP version 5 or above is installed on the server.
',
-
- 'Setup your site' => 'Setup your site',
- 'setup_info_text' => 'Click on the fields with yellow background to edit them.
- Then press Enter or click anywhere outside the field to save.
- This way it will be throughout your site — all that has a yellow background is editable. You will also be able to change these settings later.',
- 'What is the title of your site?' => 'Jaki jest tytuł twojej strony?',
- 'Site title will be visible in all sections of your site.' => 'Tytuł strony będzie widoczny w każdym dziale',
- 'What is your name?' => 'Wprowadź swoje imię',
- 'It will appear in the copyright notice in the footer. You may leave it blank.' => 'Imię będzie dodane do symbolu (c) na dole strony. Pole można również zostawić puste.',
- 'What is this website about?' => 'Jak byś opisał swoją stronę w jednym zdaniu?',
- 'It will appear under your site name in search engine results.' => 'To pojawi się w wyszukiwarce pod tytułem twojej strony jako opis.',
- 'Note: the fields that already have value appear yellow only when you roll over them with your mouse. Click on the text below to edit.' => 'Uwaga: wypełnione pole stają się żółte przy najechaniu na nich kursorem myszki. Klikaj na tekście poniżej, aby poprawiać.',
- 'Done!' => 'Wykonane!',
-
// Translatins from sections editor (sections.php)
/* title */
@@ -245,8 +222,6 @@
/* setting tab */
'Background' => 'Tło',
- /* setting name */
- 'Background color' => 'Kolor tła',
/* help text */
'IMPORTANT! These settings will be overwritten, if you are using background gallery feature. You access it by clicking "edit background gallery" button in each section.' => 'UWAGA! Te ustawienia nie są brane pod uwagę, jeżeli jest używana galeria tła.',
/* setting name */
@@ -477,7 +452,7 @@
'description_tagsMenu_y' => 'Pozycja Y w menu podrzędnym w pikselach (np.: 50px)',
'description_menu_position' => 'Pozycjonowanie menu',
'description_banner' => 'Banners are images which are visible in all sections. Use it for buttons or social icons in your site. Displayed image will be half of the original size, full size will be used for hi-res displays.',
- 'description_banner_link' => 'Link banera. Przed adresem nie zapomnij dodać http:// (piem.: http://www.berta.me)',
+ 'description_banner_link' => 'Link banera. Przed adresem nie zapomnij dodać https:// (piem.: https://www.berta.me)',
'description_language' => 'Choose language of interface.',
'Heading position' => 'Pozycja nagłówka',
'description_heading_position' => 'Pozycja nagłówka, niezmienna lub zmienna',
@@ -534,7 +509,6 @@
'Discount in precents when user enters valid promo code' => 'Wartość rabatu w procentach na towary, jeżeli kupujący wprowadził poprawny kod.',
'Weight units' => 'Jednostka wagi',
'Weight units (g, oz) used for postage cost calculation.' => 'Jednostka wagi (g, oz), która jest używana, obliczając koszty wysyłki pocztowej.',
- 'Design' => 'Projekt',
'Shop entry width' => 'Szerokość wpisu sklepu',
'section_type' => 'Type',
'section_type_tip' => 'Defines the layout and functionality of the section.',
diff --git a/engine/lang/ru.php b/engine/lang/ru.php
index dc775e282..1aaa76a72 100644
--- a/engine/lang/ru.php
+++ b/engine/lang/ru.php
@@ -1,7 +1,7 @@
'Berta.me',
+ 'berta_copyright_text' => 'Berta.me',
// Translations from the top "admin" menu
@@ -25,29 +25,6 @@
'Logout ok. Please wait...' => 'Пожалуйста, подождите...',
'Log in' => 'Войти',
- // First visit
-
- 'welcome' => 'Добро пожаловать!',
- 'welcome_text__not_installed' => '
Благодарим, что выбрали Berta.me!
-
Berta не установлена. Пожалуйста войдите и следуйте процедуре установки.
',
-
- 'welcome_text__not_supported' => '
Благодарим, что выбрали Berta.me!
-
Этот сервер не соответствует требованиями Berta.
- Пожалуйста, проверьте, чтобы на сервере была установлена версия PHP 5 или выше.
',
-
- 'Setup your site' => 'Установка сайта',
- 'setup_info_text' => 'Нажмите на поля, выделенные желтым, чтобы редактировать.
- Затем нажмите Enter или кликните в любой точке вне поля, чтобы сохранить изменения.
- Таким образом это будет отображаться на вашей странице — все, выделенное желтым, редактируется. Вы сможете изменить эти настройки позже.',
- 'What is the title of your site?' => 'Как будет называться сайт?',
- 'Site title will be visible in all sections of your site.' => 'Название сайта будет отображаться во всех разделах',
- 'What is your name?' => 'Как ваше имя?',
- 'It will appear in the copyright notice in the footer. You may leave it blank.' => 'Ваше имя будет отображаться с символом(c) внизу сайта. Можете оставить это поле пустым.',
- 'What is this website about?' => 'Опишите ваш сайт одним предложением',
- 'It will appear under your site name in search engine results.' => 'Описание будет отображаться в поисковых системах под названием сайта.',
- 'Note: the fields that already have value appear yellow only when you roll over them with your mouse. Click on the text below to edit.' => 'Примечание: заполненные поля становятся желтыми, только при наведении курсора мыши. Нажмите на текст ниже, чтобы редактировать.',
- 'Done!' => 'Готово!',
-
// Translatins from sections editor (sections.php)
/* title */
@@ -245,8 +222,6 @@
/* setting tab */
'Background' => 'Фон',
- /* setting name */
- 'Background color' => 'Цвет фона',
/* help text */
'IMPORTANT! These settings will be overwritten, if you are using background gallery feature. You access it by clicking "edit background gallery" button in each section.' => 'ВАЖНО! Данные настройки не активны, если использована функция фоновой галереи. Перейти к редактированию можно по кнопке "редактировать фоновую галерею".',
/* setting name */
@@ -466,7 +441,7 @@
'description_tagsMenu_y' => 'Положение подменю на оси Y в пикселях (например: 50px)',
'description_menu_position' => 'Позиционирование меню',
'description_banner' => 'Banners are images which are visible in all sections. Use it for buttons or social icons in your site. Displayed image will be half of the original size, full size will be used for hi-res displays.',
- 'description_banner_link' => 'Ссылка баннера. Добавьте http:// перед адресом ссылки (например: http://www.berta.me)',
+ 'description_banner_link' => 'Ссылка баннера. Добавьте https:// перед адресом ссылки (например: https://www.berta.me)',
'description_language' => 'Выберите язык интерфейса berta. Обновите страницу, чтобы активировать изменения.',
'Heading position' => 'Положение заголовка',
'description_heading_position' => 'Положение шапки, фиксированное или нефиксированное ',
diff --git a/engine/loader.helper.php b/engine/loader.helper.php
index b3456de68..466e29662 100644
--- a/engine/loader.helper.php
+++ b/engine/loader.helper.php
@@ -6,6 +6,18 @@
use Illuminate\Http\Request;
+require_once __DIR__ . '/inc.editor_redirect.php';
+
+// Laravel can't boot on a too old PHP or without vendor/, send visitors to the
+// editor, which shows the failed requirements
+$bertaFailedRequirements = require __DIR__ . '/../_api_app/bootstrap/requirements_check.php';
+if ($bertaFailedRequirements) {
+ http_response_code(503);
+ bertaRenderEditorRedirect((! empty($ENGINE_ROOT_URL) ? $ENGINE_ROOT_URL : (! empty($SITE_ROOT_URL) ? $SITE_ROOT_URL : '/') . 'engine/') . 'login');
+ exit;
+}
+unset($bertaFailedRequirements);
+
require_once __DIR__ . '/../_api_app/bootstrap/load_app.php';
(require_once __DIR__ . '/../_api_app/bootstrap/app.php')->handle(Request::capture());