grisha2217
Проверенные
- Сообщения
- 913
- Решения
- 6
- Реакции
- 1,391
- Баллы
- 5,715
Занялся доработкой своего форума под англоязычную аудиторию, она маленькая, но присутствует, к тому же, мы заметили, имеет в карманах более крупные деньги. Пробую я зайти на свой сайт с дедика, и он открывается на русском языке... Причиной этому русский язык по дефолту в настройках (всё-таки 90+ процентов аудитории - русскоязычные), при этом у посетителя нет удобной кнопки сменить язык. Придумал решение определить язык пользователя исходя из полученных данных о его браузере. Как мы знаем, Xenforo использует фрейморк Zend, в нём есть готовый класс для определения "локали" посетителя - Zend_Locale.
Вот так можно получить язык посетителя:
$locale = new Zend_Locale();
Результатом может быть ru, ua, de и так далее...
Язык посетителя устанавливается в методе setVisitorLanguage() класса XenForo_Visitor, я немного переписал эту функцию, и вот, что получилось:
Тут мы проверяем, принадлежит ли пользователь группе "СНГ", если да, то ставим язык по дефолту (в моём случае это русский), в противном случае, ставим английский (у него ID 1):
Плагин мне было писать лень, если кому-то интересно, то напишите сами =)
В итоге: если на форум зайдет англоговорящий посетитель, ему откроется английская версия форума.
Вот так можно получить язык посетителя:
$locale = new Zend_Locale();
PHP:
$locale = new Zend_Locale();
$language = $locale->getLanguage();
Результатом может быть ru, ua, de и так далее...
Язык посетителя устанавливается в методе setVisitorLanguage() класса XenForo_Visitor, я немного переписал эту функцию, и вот, что получилось:
PHP:
public function setVisitorLanguage($languageId)
{
$languages = (XenForo_Application::isRegistered('languages')
? XenForo_Application::get('languages')
: XenForo_Model::create('XenForo_Model_Language')->getAllLanguagesForCache()
);
if ($languageId && !empty($languages[$languageId]))
{
$language = $languages[$languageId];
}
else
{
$locale = new Zend_Locale();
if (in_array($locale->getLanguage(), ['ru', 'ua', 'kz', 'by']))
{
$defaultLanguageId = XenForo_Application::get('options')->defaultLanguageId;
}
else
{
$defaultLanguageId = 1;
}
if (!empty($languages[$defaultLanguageId]))
{
$language = $languages[$defaultLanguageId];
}
else
{
$language = reset($languages);
}
}
if (!$language)
{
return; // this probably shouldn't happen
}
if (empty($language['phrase_cache']))
{
$language['phrase_cache'] = array();
}
$this->_language = $language;
XenForo_Phrase::setLanguageId($language['language_id']);
XenForo_Phrase::setPhrases($language['phrase_cache']);
XenForo_Locale::setDefaultLanguage($language);
}
Тут мы проверяем, принадлежит ли пользователь группе "СНГ", если да, то ставим язык по дефолту (в моём случае это русский), в противном случае, ставим английский (у него ID 1):
PHP:
if (in_array($locale->getLanguage(), ['ru', 'ua', 'kz', 'by']))
{
$defaultLanguageId = XenForo_Application::get('options')->defaultLanguageId;
}
else
{
$defaultLanguageId = 1;
}
Плагин мне было писать лень, если кому-то интересно, то напишите сами =)
В итоге: если на форум зайдет англоговорящий посетитель, ему откроется английская версия форума.