From 8d4ef5daa7efb12c91474834d9b8e588fd96893f Mon Sep 17 00:00:00 2001 From: Mehmet Korkmaz Date: Thu, 28 Jan 2021 00:29:35 +0300 Subject: [PATCH] language selector middleware added --- composer.json | 7 +- .../Middleware/LanguageSelectorMiddleware.php | 76 +++++++++++++++++++ .../LanguageSelectorMiddlewareFactory.php | 18 +++++ 3 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 src/BackendBase/Shared/Middleware/LanguageSelectorMiddleware.php create mode 100644 src/BackendBase/Shared/Middleware/LanguageSelectorMiddlewareFactory.php diff --git a/composer.json b/composer.json index 602bb77..734c1a0 100644 --- a/composer.json +++ b/composer.json @@ -67,7 +67,7 @@ "laminas/laminas-diactoros": "^2.5.0", "laminas/laminas-inputfilter": "^2.11.0", "laminas/laminas-permissions-rbac": "^3.0.2", - "laminas/laminas-servicemanager": "^3.6.2", + "laminas/laminas-servicemanager": "^3.6.3", "laminas/laminas-stdlib": "^3.3.1", "lcobucci/jwt": "^4.0.0", "league/flysystem": "^1.1.3", @@ -76,7 +76,7 @@ "mezzio/mezzio-csrf": "^1.0.1", "mezzio/mezzio-fastroute": "^3.1.0", "mezzio/mezzio-helpers": "^5.4.0", - "mezzio/mezzio-problem-details": "^1.2.0", + "mezzio/mezzio-problem-details": "^1.3.0", "mezzio/mezzio-session-ext": "^1.10.0", "mezzio/mezzio-twigrenderer": "^2.6.1", "mkorkmaz/redislabs-rejson": "^1.0", @@ -108,12 +108,11 @@ "filp/whoops": "^2.9.2", "laminas/laminas-development-mode": "^3.3.0", "malukenho/mcbumpface": "^1.1.5", - "mezzio/mezzio-tooling": "^1.3.0", "phpunit/phpunit": "^9.5.1", "roave/security-advisories": "dev-master", "rskuipers/php-assumptions": "^0.8.0", "squizlabs/php_codesniffer": "^3.5.8", - "swoole/ide-helper": "^4.6.1" + "swoole/ide-helper": "^4.6.2" }, "autoload": { "psr-4": { diff --git a/src/BackendBase/Shared/Middleware/LanguageSelectorMiddleware.php b/src/BackendBase/Shared/Middleware/LanguageSelectorMiddleware.php new file mode 100644 index 0000000..ddec603 --- /dev/null +++ b/src/BackendBase/Shared/Middleware/LanguageSelectorMiddleware.php @@ -0,0 +1,76 @@ +config = $config; + } + + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface + { + $uri = $request->getUri(); + $url = $uri->getPath(); + $selectedLanguage = $this->config['multilingual']['default-language']; + if ($url !== '/') { + $urlParts = explode('/', trim($url, '/')); + $lang = array_shift($urlParts); + if (in_array($lang, $this->config['multilingual']['valid-languages'])) { + $selectedLanguage = $lang; + $request = $request->withUri($uri->withPath('/'. implode('/', $urlParts))); + } + } + $this->setLocale($selectedLanguage, $request->getAttribute('moduleName')); + + return $handler->handle($request->withAttribute('selectedLanguage', $selectedLanguage)); + } + + private function setLocale(string $locale, string $domain) : void + { + $localeFile = 'data/cache/locale/' . $locale . '/LC_MESSAGES/' . $domain . '.mo'; + if (! file_exists($localeFile)) { + return; + } + $modifiedTime = filemtime($localeFile); + $localeFileRuntime = 'data/cache/locale/' . $locale . '/LC_MESSAGES/' . $domain . '_' . $modifiedTime . '.mo'; + if (! file_exists($localeFileRuntime)) { + $dir = glob('data/cache/locale/' . $locale . '/LC_MESSAGES/' . $domain . '_*.mo'); + foreach ($dir as $file) { + unlink($file); + } + copy($localeFile, $localeFileRuntime); + } + $domain .='_' . $modifiedTime; + $lang = $locale . '.UTF8'; + putenv("LANG={$lang}"); + putenv("LANGUAGE={$lang}"); + setlocale(LC_ALL, $lang); + Locale::setDefault($locale . '.UTF-8'); + bindtextdomain($domain, 'data/cache/locale'); + bind_textdomain_codeset($domain, 'UTF-8'); + textdomain($domain); + } +} diff --git a/src/BackendBase/Shared/Middleware/LanguageSelectorMiddlewareFactory.php b/src/BackendBase/Shared/Middleware/LanguageSelectorMiddlewareFactory.php new file mode 100644 index 0000000..512462b --- /dev/null +++ b/src/BackendBase/Shared/Middleware/LanguageSelectorMiddlewareFactory.php @@ -0,0 +1,18 @@ +get('config')); + } +}