На сайте реализовано три локализации. 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
Решил с помощью 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>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Вопрос такой: есть ли способ, с которым я бы мог задать параметры в функцию после <h1>123</h1> , а результат бы вывелся перед этими цифрами?
Начинаю путь программистаСказали выучить полиморфизм