+
{% if configItem.element == 'area' %}
{{ macros.generateTextarea(configItem.label, key, configurationData[key]) }}
{% elseif configItem.element == 'checkbox' %}
diff --git a/phpmyfaq/src/phpMyFAQ/Controller/AbstractController.php b/phpmyfaq/src/phpMyFAQ/Controller/AbstractController.php
index 09b2146d6a..4aca5a586a 100644
--- a/phpmyfaq/src/phpMyFAQ/Controller/AbstractController.php
+++ b/phpmyfaq/src/phpMyFAQ/Controller/AbstractController.php
@@ -24,6 +24,7 @@
use phpMyFAQ\Enums\PermissionType;
use phpMyFAQ\Filter;
use phpMyFAQ\Template\TemplateException;
+use phpMyFAQ\Template\TranslateTwigExtension;
use phpMyFAQ\Template\TwigWrapper;
use phpMyFAQ\User\CurrentUser;
use Symfony\Component\HttpFoundation\JsonResponse;
@@ -69,6 +70,7 @@ public function render(string $pathToTwigFile, array $templateVars = [], Respons
$response ??= new Response();
$twigWrapper = new TwigWrapper(PMF_ROOT_DIR . '/assets/templates');
$twigWrapper->addExtension(new DebugExtension());
+ $twigWrapper->addExtension(new TranslateTwigExtension());
$template = $twigWrapper->loadTemplate($pathToTwigFile);
$response->setContent($template->render($templateVars));
diff --git a/phpmyfaq/src/phpMyFAQ/Controller/Administration/ConfigurationTabController.php b/phpmyfaq/src/phpMyFAQ/Controller/Administration/ConfigurationTabController.php
index 1365cfdb46..564c73d3c7 100644
--- a/phpmyfaq/src/phpMyFAQ/Controller/Administration/ConfigurationTabController.php
+++ b/phpmyfaq/src/phpMyFAQ/Controller/Administration/ConfigurationTabController.php
@@ -60,7 +60,8 @@ public function list(Request $request): Response
'ldapSupport' => extension_loaded('ldap'),
'useSslForLogins' => Request::createFromGlobals()->isSecure(),
'useSslOnly' => Request::createFromGlobals()->isSecure(),
- 'ssoSupport' => Request::createFromGlobals()->server->get('REMOTE_USER')
+ 'ssoSupport' => Request::createFromGlobals()->server->get('REMOTE_USER'),
+ 'buttonTes'
]
]
);
diff --git a/phpmyfaq/src/phpMyFAQ/Faq/Statistics.php b/phpmyfaq/src/phpMyFAQ/Faq/Statistics.php
index ba6ccf346b..1501f18c6b 100644
--- a/phpmyfaq/src/phpMyFAQ/Faq/Statistics.php
+++ b/phpmyfaq/src/phpMyFAQ/Faq/Statistics.php
@@ -38,7 +38,7 @@ class Statistics
private array $groups;
/** Flag for Group support. */
- private bool $groupSupport;
+ private bool $groupSupport = false;
/** Plural form support. */
private readonly Plurals $plurals;
diff --git a/phpmyfaq/src/phpMyFAQ/Template/TranslateTwigExtension.php b/phpmyfaq/src/phpMyFAQ/Template/TranslateTwigExtension.php
new file mode 100644
index 0000000000..768fea1d2c
--- /dev/null
+++ b/phpmyfaq/src/phpMyFAQ/Template/TranslateTwigExtension.php
@@ -0,0 +1,47 @@
+
+ * @copyright 2024 phpMyFAQ Team
+ * @license https://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0
+ * @link https://www.phpmyfaq.de
+ * @since 2024-04-21
+ */
+
+declare(strict_types=1);
+
+namespace phpMyFAQ\Template;
+
+use phpMyFAQ\Translation;
+use Twig\Extension\AbstractExtension;
+use Twig\TwigFunction;
+use Twig\TwigFilter;
+
+class TranslateTwigExtension extends AbstractExtension
+{
+ public function getFunctions(): array
+ {
+ return [
+ new TwigFunction('translate', $this->translate(...)),
+ ];
+ }
+
+ public function getFilters(): array
+ {
+ return [
+ new TwigFilter('translate', $this->translate(...)),
+ ];
+ }
+
+ public function translate(string $translationKey): string
+ {
+ return Translation::get($translationKey);
+ }
+}
diff --git a/phpmyfaq/translations/language_de.php b/phpmyfaq/translations/language_de.php
index 3ae4732a85..10c359fd1b 100755
--- a/phpmyfaq/translations/language_de.php
+++ b/phpmyfaq/translations/language_de.php
@@ -1437,5 +1437,6 @@
$PMF_LANG['msgNoLogMeOut'] = 'Nein, logge mich aus';
$PMF_LANG['msgYesKeepMeLoggedIn'] = 'Ja, ich will eingeloggt bleiben';
$PMF_LANG['msgTrendingFAQs'] = 'FAQ Trends';
+$PMF_LANG['msgGenerateApiClientToken'] = 'Erstelle einen API Client Token';
return $PMF_LANG;
diff --git a/phpmyfaq/translations/language_en.php b/phpmyfaq/translations/language_en.php
index 7d7a831bbd..83038aa706 100644
--- a/phpmyfaq/translations/language_en.php
+++ b/phpmyfaq/translations/language_en.php
@@ -1457,5 +1457,6 @@
$PMF_LANG['msgNoLogMeOut'] = 'No, log me out';
$PMF_LANG['msgYesKeepMeLoggedIn'] = 'Yes, keep me logged in';
$PMF_LANG['msgTrendingFAQs'] = 'Trending FAQs';
+$PMF_LANG['msgGenerateApiClientToken'] = 'Generate API Client Token';
return $PMF_LANG;
diff --git a/tests/phpMyFAQ/Template/TranslateTwigExtensionTest.php b/tests/phpMyFAQ/Template/TranslateTwigExtensionTest.php
new file mode 100644
index 0000000000..39874a8f5b
--- /dev/null
+++ b/tests/phpMyFAQ/Template/TranslateTwigExtensionTest.php
@@ -0,0 +1,56 @@
+setLanguagesDir(PMF_TRANSLATION_DIR)
+ ->setDefaultLanguage('en')
+ ->setCurrentLanguage('en')
+ ->setMultiByteLanguage();
+
+ $this->translateTwigExtension = new TranslateTwigExtension();
+ }
+ public function testGetFunctions(): void
+ {
+ $functions = $this->translateTwigExtension->getFunctions();
+
+ $this->assertIsArray($functions);
+ $this->assertCount(1, $functions);
+ $this->assertEquals('translate', $functions[0]->getName());
+ }
+
+ public function testGetFilters(): void
+ {
+ $filters = $this->translateTwigExtension->getFilters();
+
+ $this->assertCount(1, $filters);
+
+ $this->assertInstanceOf(TwigFilter::class, $filters[0]);
+ $this->assertEquals('translate', $filters[0]->getName());
+ }
+
+ public function testTranslate(): void
+ {
+ $translationKey = 'msgCategory';
+ $expectedTranslation = 'Categories';
+
+ $actualTranslation = $this->translateTwigExtension->translate($translationKey);
+
+ $this->assertEquals($expectedTranslation, $actualTranslation);
+ }
+}