v2.6.1d (Lyra): Plugin i18n, plugin editor vernieuwd, media invoegen

Plugin internationalisatie: plugins hebben eigen language/ mappen. Systeem
plugins volgen admin taal (admin.php), content plugins volgen content taal
(site.php). Fallback chain: geselecteerd -> plugin default_language -> CMS
default. PluginManager/AdminPluginAPI/CMSAPI uitgebreid met
getPluginTranslations()/t(). plugin.json settings ondersteunen
label_key/help_key/option_label_key.

Plugin uniformiteit: alle 6 plugins hebben uniforme structuur (README.md,
assets/.gitkeep, language/nl|en/). plugins/README.md herschreven.
guide plugin-development.md (NL+EN) volledig herschreven.

Plugin editor vernieuwd: geneste bestandsbrowser zijbalk, nieuw bestand
aanmaken, uploaden naar assets/, verwijderen en verplaatsen. Nieuwe routes:
plugins-file-upload, plugins-file-delete, plugins-file-move. Path-traversal
bescherming + protected plugins geblokkeerd.

Media invoegen in editor: nieuw /admin/media-list JSON endpoint + herbruikbare
_media-modal.twig include. Plugin-context scant assets/ map. editor-toolbar.js
modeMap uitgebreid voor css/scss/js/json.

Plugin overzicht knoppen: alleen iconen met title/aria-label.

Tests: pentest 30/30, WCAG 2.1 AA 25/25.
This commit is contained in:
2026-08-18 13:49:52 +00:00
parent 10c72de859
commit 5edc929c13
64 changed files with 3503 additions and 366 deletions
+55
View File
@@ -8,11 +8,24 @@ class AdminPluginAPI implements PluginAPIInterface
{
private array $config;
private string $projectRoot;
private string $adminLanguage;
private ?PluginManager $pluginManager = null;
public function __construct(array $siteConfig, string $projectRoot = '')
{
$this->config = $siteConfig;
$this->projectRoot = $projectRoot !== '' ? $projectRoot : dirname(__DIR__, 3);
$this->adminLanguage = $siteConfig['admin_language']
?? ($siteConfig['language']['default'] ?? 'nl');
}
/**
* Inject the admin PluginManager so plugins can resolve their own
* translations through the same fallback chain.
*/
public function setPluginManager(PluginManager $pm): void
{
$this->pluginManager = $pm;
}
/**
@@ -79,4 +92,46 @@ class AdminPluginAPI implements PluginAPIInterface
}
return ['version' => '0.0.0'];
}
/**
* Get the active admin language code (e.g. 'nl', 'en').
* System plugins should use this to resolve their translations.
*/
public function getAdminLanguage(): string
{
return $this->adminLanguage;
}
/**
* Get the translations for a plugin in the admin context.
*
* Fallback chain (handled by PluginManager):
* requested language -> plugin default_language -> empty array.
*
* @param string $pluginName Plugin directory name
* @param string|null $lang Override language; defaults to the active admin language
* @return array Translations [key => value]
*/
public function getPluginTranslations(string $pluginName, ?string $lang = null): array
{
if ($this->pluginManager === null) {
return [];
}
$lang = $lang ?? $this->adminLanguage;
return $this->pluginManager->getPluginTranslations($pluginName, $lang, 'admin');
}
/**
* Translate a single key for a plugin in the admin context.
*
* @param string $key Translation key
* @param string $pluginName Plugin directory name
* @param string|null $lang Override language; defaults to the active admin language
* @return string Translated string, or $key if not found
*/
public function t(string $key, string $pluginName, ?string $lang = null): string
{
$t = $this->getPluginTranslations($pluginName, $lang);
return $t[$key] ?? $key;
}
}