Мультиязычность

320
04 ноября 2017, 15:38

Подскажите, пожалуйста, как правильно впилить мультиязычность.
В строке адреса \домен\lang\controller\action\id, если нет lang - редирект на "правильный" адрес. Язык по-умолчанию - вызов константы Config::SITE_LANGUAGE
Второй день траю, никак не идёт

index.php

ini_set('error_reporting', E_ALL);
require_once dirname(__DIR__) . '/vendor/twig/twig/lib/Twig/Autoloader.php';
Twig_Autoloader::register();
spl_autoload_register(function ($class) {
    $root = dirname(__DIR__);
    $file = $root . '/' . str_replace('\\', '/', $class) . '.php';
    if (is_readable($file)) {
        require_once $file;
    }
});
set_error_handler('Core\Error::errorHandler');
set_exception_handler('Core\Error::exceptionHandler');
$router = new Core\Router();
$router->addRoutes('', ['controller' => 'Home', 'action' => 'index']);
$router->addRoutes('{controller}',  ['action' => 'index']);
$router->addRoutes('{controller}/', ['action' => 'index']);
$router->addRoutes('{controller}/{action}');
$router->addRoutes('{controller}/{action}/');
$router->addRoutes('{controller}/{action}/{id:\d+}');
$router->addRoutes('{controller}/{action}/{id:\d+}/');
$router->dispatch($_SERVER['QUERY_STRING']);

router.php

namespace Core;
/**
 * Class Router
 * @package Core
 */
class Router
{
    protected $routes = [];
    protected $parameters = [];
    /**
     * @param $route
     * @param array $parameters
     */
    public function addRoutes($route, $parameters = [])
    {
        $route = preg_replace('/\//', '\\/', $route);
        $route = preg_replace('/\{([a-z]+)\}/', '(?P<\1>[a-z-]+)', $route);
        $route = preg_replace('/\{([a-z]+):([^\}]+)\}/', '(?P<\1>\2)', $route);
        $route = '/^' . $route . '$/i';
        $this  -> routes[$route] = $parameters;
    }
    /**
     * @return array
     */
    public function getRoutes()
    {
        return $this -> routes;
    }
    /**
     * @return array
     */
    public function getParameters()
    {
        return $this -> parameters;
    }
    /**
     * @param $url
     * @throws \Exception
     */
    public function dispatch($url)
    {
        $url = $this->removeQueryStringVariables($url);
        if ($this->matchRoutes($url)) {
            $controller = $this -> parameters['controller'] . 'Controller';
            $controller = $this -> convertToStudlyCaps($controller);
            $controller = $this -> getNamespaces() . $controller;
            if (class_exists($controller)) {
                $controller_object = new $controller($this -> parameters);
                $action = $this -> parameters['action'];
                $action = $this -> convertToCamelCase($action);
                if (is_callable([$controller_object, $action]) && !isset($this -> parameters['id'])) {
                    $controller_object -> $action();
                }
                elseif (is_callable([$controller_object, $action]) && isset($this -> parameters['id'])) {
                    $id = $this -> parameters['id'];
                    $controller_object -> $action($id);
                }
                else {
                    throw new \Exception("Метода $action (в контроллере $controller_object) нет");
                }
            } else {
                throw new \Exception("Контроллер $controller не найден");
            }
        } else {
            throw new \Exception('Роута нет', 404);
        }
    }
    /**
     * @param $url
     * @return string
     */
    protected function removeQueryStringVariables($url)
    {
        if ($url != '') {
            $parts = explode('&', $url, 2);
            if (strpos($parts[0], '=') === false) {
                $url = $parts[0];
            } else {
                $url = '';
            }
        }
        return $url;
    }
    /**
     * @param $url
     * @return bool
     */
    public function matchRoutes($url)
    {
        foreach ($this -> routes as $route => $parameters) {
            if (preg_match($route, $url, $matches)) {
                foreach ($matches as $key => $match) {
                    if (is_string($key)) {
                        $parameters[$key] = $match;
                    }
                }
                $this -> parameters = $parameters;
                return true;
            }
        }
    }
    /**
     * @param $string
     * @return mixed
     */
    protected function convertToStudlyCaps($string)
    {
        return str_replace(' ', '', ucwords(str_replace('-', ' ', $string)));
    }
    /**
     * @return string
     */
    protected function getNamespaces()
    {
        $namespace = 'App\Controllers\\';
        if (array_key_exists('namespace', $this -> parameters)) {
            $namespace .= $this -> parameters['namespace'] . '\\';
        }
        return $namespace;
    }
    /**
     * @param $string
     * @return string
     */
    protected function convertToCamelCase($string)
    {
        return lcfirst($this -> convertToStudlyCaps($string));
    }
}
READ ALSO
Авторизация пользователя в modx REVO

Авторизация пользователя в modx REVO

ЗдравствуйтеС modx revo знаком слабо, но есть задача: сделать закрытую страничку, доступ к которой будет только для авторизованных пользователей

290
Сессия или Куки?

Сессия или Куки?

Добрый день, появилась задача сделать одноразовую форму обратной связи, и я не могу решить, что лучше использовать кукки или сессию, для проверки...

242
php запрос soap

php запрос soap

Здравствуйте!

258
Use of undefined constant php

Use of undefined constant php

Делаю самую простую валидацию e-mail:

206