Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions formwork/config/site.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
author: ''

languages:
available: []
httpPreferred: false

defaultTemplate: page

description: ''
Expand Down
4 changes: 0 additions & 4 deletions formwork/config/system.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,6 @@ images:
preserveExifData: true
clearCacheByDefault: false

languages:
available: { }
httpPreferred: false

metadata:
setGenerator: true

Expand Down
11 changes: 7 additions & 4 deletions formwork/routes.php
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<?php

use Formwork\Cms\Site;
use Formwork\Config\Config;
use Formwork\Controllers\ErrorsControllerInterface;
use Formwork\Http\RedirectResponse;
use Formwork\Http\Request;
use Formwork\Http\ResponseStatus;
use Formwork\Languages\Languages;
use Formwork\Router\Router;
use Formwork\Security\CsrfToken;
use Formwork\Utils\FileSystem;
Expand Down Expand Up @@ -92,10 +92,13 @@
],

'language' => [
'action' => function (Config $config, Request $request, Router $router, Languages $languages) {
if (($requested = $languages->requested()) !== null) {
'action' => function (Config $config, Request $request, Router $router, Site $site) {
if (!$site->languages()->hasMultiple()) {
return;
}
if (($requested = $site->languages()->requested()) !== null) {
$router->setRequest(Str::removeStart($router->request(), '/' . $requested));
} elseif (($preferred = $languages->preferred()) !== null) {
} elseif (($preferred = $site->languages()->preferred()) !== null) {
// Don't redirect if we are in Panel
if ($config->get('system.panel.enabled') && $router->requestHasPrefix($config->get('system.panel.root'))) {
return;
Expand Down
21 changes: 0 additions & 21 deletions formwork/schemes/config/system.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,6 @@ layout:
label: '{{panel.options.system.content}}'
fields: [pages.content.safeMode]

languages:
collapsible: true
label: '{{panel.options.system.languages}}'
fields: [languages.available, languages.httpPreferred]

files:
collapsible: true
label: '{{panel.options.system.files}}'
Expand Down Expand Up @@ -81,22 +76,6 @@ fields:
1: '{{panel.options.system.content.safeMode.enabled}}'
0: '{{panel.options.system.content.safeMode.disabled}}'

languages.available:
type: tags
label: '{{panel.options.system.languages.availableLanguages}}'
icon: translate
placeholder: '{{panel.options.system.languages.availableLanguages.noLanguages}}'
pattern: '^[a-z]{2,3}$'
translate: [label, placeholder]
options@: languages.names

languages.httpPreferred:
type: togglegroup
label: '{{panel.options.system.languages.preferredLanguage}}'
options:
1: '{{panel.options.system.languages.preferredLanguage.enabled}}'
0: '{{panel.options.system.languages.preferredLanguage.disabled}}'

files.allowedExtensions:
type: tags
label: '{{panel.options.system.files.allowedExtensions}}'
Expand Down
9 changes: 3 additions & 6 deletions formwork/src/Cms/App.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
use Formwork\Http\Request;
use Formwork\Http\Response;
use Formwork\Images\ImageFactory;
use Formwork\Languages\Languages;
use Formwork\Languages\LanguagesFactory;
use Formwork\Pages\PageCollectionFactory;
use Formwork\Pages\PageFactory;
use Formwork\Pages\PaginationFactory;
Expand All @@ -25,7 +25,6 @@
use Formwork\Security\CsrfToken;
use Formwork\Services\Container;
use Formwork\Services\Loaders\ConfigServiceLoader;
use Formwork\Services\Loaders\LanguagesServiceLoader;
use Formwork\Services\Loaders\PanelServiceLoader;
use Formwork\Services\Loaders\SchemesServiceLoader;
use Formwork\Services\Loaders\SiteServiceLoader;
Expand Down Expand Up @@ -204,10 +203,6 @@ private function loadServices(Container $container): void
$container->define(Router::class)
->alias('router');

$container->define(Languages::class)
->loader(LanguagesServiceLoader::class)
->alias('languages');

$container->define(Translations::class)
->loader(TranslationsServiceLoader::class)
->alias('translations');
Expand All @@ -222,6 +217,8 @@ private function loadServices(Container $container): void

$container->define(PageCollectionFactory::class);

$container->define(LanguagesFactory::class);

$container->define(Site::class)
->loader(SiteServiceLoader::class)
->alias('site');
Expand Down
18 changes: 17 additions & 1 deletion formwork/src/Cms/Site.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Formwork\Files\FileCollection;
use Formwork\Files\FileFactory;
use Formwork\Languages\Languages;
use Formwork\Languages\LanguagesFactory;
use Formwork\Metadata\MetadataCollection;
use Formwork\Model\Model;
use Formwork\Pages\ContentFile;
Expand Down Expand Up @@ -119,6 +120,7 @@ public function __construct(
array $data,
protected App $app,
protected Config $config,
protected LanguagesFactory $languagesFactory,
protected PageFactory $pageFactory,
protected PageCollectionFactory $pageCollectionFactory,
) {
Expand Down Expand Up @@ -463,7 +465,6 @@ public function schemes(): Schemes
public function load(): void
{
$this->scheme = $this->app->schemes()->get('config.site');
$this->languages = $this->app->getService(Languages::class);
$this->templates = $this->app->getService(Templates::class);
$this->users = $this->app->getService(Users::class);

Expand Down Expand Up @@ -502,6 +503,21 @@ public function files(): FileCollection
return $this->files = new FileCollection($files);
}

/**
* Set languages
*
* @param array{available: list<string>, httpPreferred: bool, default?: string} $config
*/
protected function setLanguages(array $config): void
{
$this->data['languages'] = $config;
$this->languages = $this->languagesFactory->make($config);

if (($currentTranslation = $this->languages->current() ?? $this->languages->default()) !== null) {
$this->app->translations()->setCurrent($currentTranslation->code());
}
}

/**
* @param array<string, mixed> $metadata
*/
Expand Down
8 changes: 8 additions & 0 deletions formwork/src/Languages/Languages.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,14 @@ public function isDefault(): bool
return $this->current === $this->default;
}

/**
* Return if there are multiple languages available
*/
public function hasMultiple(): bool
{
return count($this->available) > 1;
}

/**
* Get the proper `Language` instance
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,31 @@
<?php

namespace Formwork\Services\Loaders;
namespace Formwork\Languages;

use Formwork\Config\Config;
use Formwork\Http\Request;
use Formwork\Languages\Languages;
use Formwork\Services\Container;
use Formwork\Services\ServiceLoaderInterface;

final class LanguagesServiceLoader implements ServiceLoaderInterface
final class LanguagesFactory
{
public function __construct(
private Config $config,
private Container $container,
private Request $request,
) {}

public function load(Container $container): Languages
/**
* Create a new Languages instance
*
* @param array{available: list<string>, httpPreferred: bool, default?: string} $config
*/
public function make(array $config): Languages
{
/**
* @var array<string> $available
*/
$available = (array) $this->config->get('system.languages.available');
['available' => $available, 'httpPreferred' => $httpPreferred] = $config;

if (preg_match('~^/(' . implode('|', $available) . ')/~i', $this->request->uri(), $matches)) {
$requested = $current = $matches[1];
}

if ($this->config->get('system.languages.httpPreferred')) {
if ($httpPreferred) {
$languages = $this->request->languages();
foreach (array_keys($languages) as $code) {
if (in_array($code, $available, true)) {
Expand All @@ -36,9 +35,9 @@ public function load(Container $container): Languages
}
}

return $container->build(Languages::class, ['options' => [
return $this->container->build(Languages::class, ['options' => [
'available' => $available,
'default' => $this->config->get('system.languages.default', $available[0] ?? null),
'default' => $config['default'] ?? $available[0] ?? null,
'current' => $current ?? null,
'requested' => $requested ?? null,
'preferred' => $preferred ?? null,
Expand Down
4 changes: 2 additions & 2 deletions formwork/src/Panel/Controllers/PagesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ public function edit(RouteParams $routeParams): Response
}

if ($routeParams->has('language')) {
if (empty($this->config->get('system.languages.available'))) {
if (!$this->site->languages()->hasMultiple()) {
if ($page->route() === null) {
throw new UnexpectedValueException('Unexpected missing page route');
}
Expand All @@ -119,7 +119,7 @@ public function edit(RouteParams $routeParams): Response

$language = $routeParams->get('language');

if (!in_array($language, $this->config->get('system.languages.available'), true)) {
if (!$this->site->languages()->available()->has($language)) {
$this->panel->notify($this->translate('panel.pages.page.cannotEdit.invalidLanguage', $language), 'error');
if ($page->route() === null) {
throw new UnexpectedValueException('Unexpected missing page route');
Expand Down
3 changes: 0 additions & 3 deletions formwork/src/Services/Loaders/TranslationsServiceLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace Formwork\Services\Loaders;

use Formwork\Config\Config;
use Formwork\Languages\Languages;
use Formwork\Services\Container;
use Formwork\Services\ResolutionAwareServiceLoaderInterface;
use Formwork\Translations\Translations;
Expand All @@ -12,7 +11,6 @@ final class TranslationsServiceLoader implements ResolutionAwareServiceLoaderInt
{
public function __construct(
private Config $config,
private Languages $languages,
) {}

public function load(Container $container): object
Expand All @@ -27,6 +25,5 @@ public function onResolved(object $service, Container $container): void
{
$service->loadFromPath($this->config->get('system.translations.paths.system'));
$service->loadFromPath($this->config->get('system.translations.paths.site'));
$service->setCurrent($this->languages->current() ?? $this->config->get('system.translations.fallback'));
}
}
12 changes: 6 additions & 6 deletions panel/translations/de.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -184,12 +184,6 @@ panel.options.system.images.jpegSaveProgressive.disabled: Deaktiviert
panel.options.system.images.jpegSaveProgressive.enabled: Aktiviert
panel.options.system.images.pngCompressionLevel: PNG-Kompressionsniveau
panel.options.system.images.webpQuality: WebP-Qualität
panel.options.system.languages: Sprachen
panel.options.system.languages.availableLanguages: Verfügbare Sprachen
panel.options.system.languages.availableLanguages.noLanguages: Keine Sprachen
panel.options.system.languages.preferredLanguage: Bevorzugte Browsersprache verwenden
panel.options.system.languages.preferredLanguage.disabled: Deaktiviert
panel.options.system.languages.preferredLanguage.enabled: Aktiviert
panel.options.system.uploads.processImages: Hochgeladene Bilder verarbeiten (optimieren)
panel.options.system.uploads.processImages.disabled: Deaktiviert
panel.options.system.uploads.processImages.enabled: Aktiviert
Expand Down Expand Up @@ -263,6 +257,12 @@ panel.register.createUser: Formwork ist installiert, aber es wurden keine Benutz
panel.register.register: Neuen Benutzer registrieren
panel.request.error.postMaxSize: Die HTTP-POST-Anfrage überschreitet die maximal zulässige Größe
panel.sections.toggle: Abschnitt umschalten
panel.site.languages: Sprachen
panel.site.languages.availableLanguages: Verfügbare Sprachen
panel.site.languages.availableLanguages.noLanguages: Keine Sprachen
panel.site.languages.preferredLanguage: Bevorzugte Browsersprache verwenden
panel.site.languages.preferredLanguage.disabled: Deaktiviert
panel.site.languages.preferredLanguage.enabled: Aktiviert
panel.statistics.devices: Geräte
panel.statistics.devices.type: Typ
panel.statistics.devices.type.desktop: Desktop
Expand Down
12 changes: 6 additions & 6 deletions panel/translations/en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -184,12 +184,6 @@ panel.options.system.images.jpegSaveProgressive.disabled: Disabled
panel.options.system.images.jpegSaveProgressive.enabled: Enabled
panel.options.system.images.pngCompressionLevel: PNG compression level
panel.options.system.images.webpQuality: WebP quality
panel.options.system.languages: Languages
panel.options.system.languages.availableLanguages: Available languages
panel.options.system.languages.availableLanguages.noLanguages: No languages
panel.options.system.languages.preferredLanguage: Use browser prefered language
panel.options.system.languages.preferredLanguage.disabled: Disabled
panel.options.system.languages.preferredLanguage.enabled: Enabled
panel.options.system.uploads.processImages: Process (optimize) uploaded images
panel.options.system.uploads.processImages.disabled: Disabled
panel.options.system.uploads.processImages.enabled: Enabled
Expand Down Expand Up @@ -263,6 +257,12 @@ panel.register.createUser: Formwork is installed but no users were found. Please
panel.register.register: Register new user
panel.request.error.postMaxSize: The HTTP POST request exceeds the maximum allowed size
panel.sections.toggle: Toggle section
panel.site.languages: Languages
panel.site.languages.availableLanguages: Available languages
panel.site.languages.availableLanguages.noLanguages: No languages
panel.site.languages.preferredLanguage: Use browser preferred language
panel.site.languages.preferredLanguage.disabled: Disabled
panel.site.languages.preferredLanguage.enabled: Enabled
panel.statistics.devices: Devices
panel.statistics.devices.type: Type
panel.statistics.devices.type.desktop: Desktop
Expand Down
12 changes: 6 additions & 6 deletions panel/translations/es.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -184,12 +184,6 @@ panel.options.system.images.jpegSaveProgressive.disabled: Desactivado
panel.options.system.images.jpegSaveProgressive.enabled: Activado
panel.options.system.images.pngCompressionLevel: Nivel de compresión PNG
panel.options.system.images.webpQuality: Calidad WebP
panel.options.system.languages: Idiomas
panel.options.system.languages.availableLanguages: Idiomas disponibles
panel.options.system.languages.availableLanguages.noLanguages: Sin idiomas
panel.options.system.languages.preferredLanguage: Usar idioma preferido del navegador
panel.options.system.languages.preferredLanguage.disabled: Desactivado
panel.options.system.languages.preferredLanguage.enabled: Activado
panel.options.system.uploads.processImages: Procesar (optimizar) imágenes cargadas
panel.options.system.uploads.processImages.disabled: Desactivado
panel.options.system.uploads.processImages.enabled: Activado
Expand Down Expand Up @@ -263,6 +257,12 @@ panel.register.createUser: Formwork está instalado pero no se encontraron usuar
panel.register.register: Registrar nuevo usuario
panel.request.error.postMaxSize: La solicitud POST excede el tamaño máximo permitido
panel.sections.toggle: Alternar sección
panel.site.languages: Idiomas
panel.site.languages.availableLanguages: Idiomas disponibles
panel.site.languages.availableLanguages.noLanguages: Sin idiomas
panel.site.languages.preferredLanguage: Usar idioma preferido del navegador
panel.site.languages.preferredLanguage.disabled: Desactivado
panel.site.languages.preferredLanguage.enabled: Activado
panel.statistics.devices: Dispositivos
panel.statistics.devices.type: Tipo
panel.statistics.devices.type.desktop: Ordenador
Expand Down
12 changes: 6 additions & 6 deletions panel/translations/fr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -184,12 +184,6 @@ panel.options.system.images.jpegSaveProgressive.disabled: Désactivé
panel.options.system.images.jpegSaveProgressive.enabled: Activé
panel.options.system.images.pngCompressionLevel: Niveau de compression PNG
panel.options.system.images.webpQuality: Qualité WebP
panel.options.system.languages: Langues
panel.options.system.languages.availableLanguages: Langues disponibles
panel.options.system.languages.availableLanguages.noLanguages: Aucune langue
panel.options.system.languages.preferredLanguage: Utiliser la langue préférée du navigateur
panel.options.system.languages.preferredLanguage.disabled: Désactivé
panel.options.system.languages.preferredLanguage.enabled: Activé
panel.options.system.uploads.processImages: Traitement (optimisé) des images envoyées
panel.options.system.uploads.processImages.disabled: Désactivé
panel.options.system.uploads.processImages.enabled: Activé
Expand Down Expand Up @@ -263,6 +257,12 @@ panel.register.createUser: Le compte panel est installé mais aucun utilisateur
panel.register.register: Enregistrer un nouvel utilisateur
panel.request.error.postMaxSize: La demande HTTP POST dépasse la taille maximale autorisée
panel.sections.toggle: Afficher/Masquer la section
panel.site.languages: Langues
panel.site.languages.availableLanguages: Langues disponibles
panel.site.languages.availableLanguages.noLanguages: Aucune langue
panel.site.languages.preferredLanguage: Utiliser la langue préférée du navigateur
panel.site.languages.preferredLanguage.disabled: Désactivé
panel.site.languages.preferredLanguage.enabled: Activé
panel.statistics.devices: Appareils
panel.statistics.devices.type: Type
panel.statistics.devices.type.desktop: Ordinateur
Expand Down
Loading