@Epileptoid
Менеджер проектов

Как показывать языковые версии сайта средставами php?

Адрес url подбирается исходя из настроек языка в браузере пользователя. Можно ли средствами php (без применения редиректов в .htaccess) реализовать 3 языка на сайте?
чтобы было так:
site.de/ - немецкая версия
site.de/ru/ - русская версия
site.de/en/ - английская версия
А не так:
site.de/de/
site.de/ru/
site.de/en/
  • Вопрос задан
  • 351 просмотр
Пригласить эксперта
Ответы на вопрос 2
ArsenBespalov
@ArsenBespalov
Сам себе разработчик
Можно, но все по большей части зависит от CMS движка вашего сайта, если вы занимаетесь изобретением велосипеда, тогда вот вам с ходу набросанная реализация того, о чем вы говорите:

class Language
{
	var $language = null;

	public function __construct()
	{
		if (($list = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']))) {
			if (preg_match_all('/([a-z]{1,8}(?:-[a-z]{1,8})?)(?:;q=([0-9.]+))?/', $list, $list)) {
				$this->language = array_combine($list[1], $list[2]);
				foreach ($this->language as $n => $v)
					$this->language[$n] = $v ? $v : 1;
				arsort($this->language, SORT_NUMERIC);
			}
		} else $this->language = array();
	}

	public function getBestMatch($default, $langs)
	{
		$languages=array();
		foreach ($langs as $lang => $alias) {
			if (is_array($alias)) {
				foreach ($alias as $alias_lang) {
					$languages[strtolower($alias_lang)] = strtolower($lang);
				}
			}else $languages[strtolower($alias)]=strtolower($lang);
		}
		foreach ($this->language as $l => $v) {
			$s = strtok($l, '-'); // убираем то что идет после тире в языках вида "en-us, ru-ru"
			if (isset($languages[$s]))
				return $languages[$s];
		}
		return $default;
	}
}


Вот таким образом уже будете использовать:
// Определяем для кого будет выбираться русский язык
$site_langs = array('ru' => array('ru', 'be', 'uk', 'ky', 'ab', 'mo', 'et', 'lv'));

// Опеределяем язык пользователя и выбираем нужный для сайта
$user_lang = new Language();
$current_lang = $user_lang->getBestMatch('de', $site_langs);

// Отправляем пользователя на нужный язык для его локали.
if ($user_uri == '/') {
    if ($current_lang != 'de') {
        header("Location: http://site.de/" . $current_lang . "/");
    }
}
Ответ написан
Комментировать
@a_ovchinnikov
Web developer
А почему Вас не устраивает редирект на уровне веб-сервера? Если используете nginx, то там это сделать не составит никакого труда, а самое главное - будет работать куда быстрее, чем реализация на PHP.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы