diff --git a/phpmyfaq/assets/templates/admin/configuration/macros.twig b/phpmyfaq/assets/templates/admin/configuration/macros.twig index 1bc04ffbae..6c7e5ec756 100644 --- a/phpmyfaq/assets/templates/admin/configuration/macros.twig +++ b/phpmyfaq/assets/templates/admin/configuration/macros.twig @@ -51,11 +51,14 @@
- + {% if key == 'api.apiClientToken' %}
- +
{% endif %}
@@ -66,7 +69,10 @@ {# button #} {% macro sendTestMailButton(label, key) %} - + {% endmacro %} diff --git a/phpmyfaq/assets/templates/admin/configuration/tab-list.twig b/phpmyfaq/assets/templates/admin/configuration/tab-list.twig index 9173af1d6e..42759cbffb 100644 --- a/phpmyfaq/assets/templates/admin/configuration/tab-list.twig +++ b/phpmyfaq/assets/templates/admin/configuration/tab-list.twig @@ -2,7 +2,7 @@ {% for key, configItem in configurationList %}
-
+
{% 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); + } +}