Как реализовать локализацию через URL

145
12 марта 2019, 11:00

На сайте реализовано три локализации. ru, de и en. Английский является основным. Пользователь первый раз заходит на главную страницу сайта по адресу http://mysite.com/, отправляя запрос Accept-Language: fr;q=0.9. Так как французкий не реализован, то его перенаправляет на английскую версию http://mysite.com/en/. На сайте есть форма поиска которая отправляет POST запрос на URL /search. На сервере отсутсвует сохранение состояния(сессии и аналоги)

Пробовал реализовать через .htaccess, но не знаю как правильно реализовать генерацию URL для форм и как передавать локаль. А также как подставить локаль в URL, если пользователь перейдет по ссылке без локали http://mysite.com/faq

RewriteEngine On
#Локаль по умолчанию
RewriteCond %{HTTP:Accept-Language} !^(ru|de) [NC]
RewriteRule ^$ /en/ [L,R=302]
RewriteCond %{HTTP:Accept-Language} ^ru [NC]
RewriteRule ^$ /ru/ [L,R=302]
RewriteCond %{HTTP:Accept-Language} ^de [NC]
RewriteRule ^$ /de/ [L,R=302]
#Перенаправлять все запросы на единую точку входа
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
Answer 1

Решил с помощью PHP

class T {
    public static $lang;
    public static function init(array $languages, $defaultLanguage, $delimiter = '/') {
        $url = ltrim($_SERVER['REQUEST_URI'], $delimiter);
        $parts = explode($delimiter, $url);
        $lang = array_shift($parts);
        if (!in_array($lang, $languages)) {
            $prefLocales = array_reduce(explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']), function ($res, $el) {
                list($l, $q) = array_merge(explode(';q=', $el), [1]);
                $res[$l] = (float)$q;
                return $res;
            }, []);
            arsort($prefLocales);
            $lang = $defaultLanguage;
            foreach (array_keys($prefLocales) as $l) {
                if (in_array($l, $languages)) {
                    $lang = $l;
                    break;
                }
            }
            header("Location: {$delimiter}{$lang}{$delimiter}{$url}");
            exit();
        }
        $_SERVER['REQUEST_URI'] = $delimiter . implode($delimiter, $parts);
        self::$lang = $lang;
    }
}

Все запросы направляются на единую точку входа

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

Все ссылки правятся с помощью JS, либо дописываются на беке

<?php T::init(['en','de','ru'], 'en'); ?>
<!DOCTYPE html>
<html lang="<?= T::getLang() ?>">
<body>
<form action="/<?= T::getLang() ?>/search" method="POST" >
     <input type="text" name="term"/>
     <button type="submit">Search</button>
</form>
</body>
</html>
READ ALSO
Вывести результат функции PHP до её вызова

Вывести результат функции PHP до её вызова

Вопрос такой: есть ли способ, с которым я бы мог задать параметры в функцию после <h1>123</h1> , а результат бы вывелся перед этими цифрами?

163
Вывод meta_query

Вывод meta_query

Возникла проблема:

138
Что такое полиморфизм и какие его основные виды?

Что такое полиморфизм и какие его основные виды?

Начинаю путь программистаСказали выучить полиморфизм

273
не работает Php exec

не работает Php exec

Пытаюсь выполнить команды например:

164