Всем привет! Я начинаю ряд публикаций в помощь разработчикам. Каждый пост будет решать одну проблему, размер которой может быть 1 строчка, а может быть 1 Мб кода... Посты делятся на 3 части: 1) Описание проблемы 2) Размышление на тему 3) Решение проблемы
Как узнать текущий язык на сайте? Как выбирается язык на сайте? Как правильно подключить
Весьма часто при разработке хочется сделать lang-файл для своих модулей, но как получить текущий язык сайта? Видел в интернете предлагают использовать $config['langs']. Значение действительно по началу выдаёт то, что нужно - огорчу, это язык по-умолчанию и не имеет ничего общего с текущим языкам. Просто мало кто тестирует сайт сразу на 2 языках...
Со сменой языка на сайте вообще полная задница... Понятия языка там нет вообще - вместо этого используется шаблоны...
Как же это работает? На сайте язык выбирается на основании настроек шаблона в админ-панели. Т.е. каждый шаблон может работать только с 1 языком - ну не труба ли? Чтобы добавить ещё один язык - создайте копию шаблона и в настройках вбейте другой язык. В коде это выглядит так:
Ок, а что с админкой? Вот сколько CMS не встречал - в админке всегда всё хуже, чем в пользовательской части... Но не в этот раз. DLE полностью поддерживает смену языков в админ-панели... В коде это выглядит так:
Так как же определить текущий язык?
Да очень просто. В пользовательской части проверяем $config["lang_" . $config['skin']], $config['skin'] - содержит название шаблона, ну а $config["lang_" . $config['skin']] - язык. Если язык не указан - то можно забрать из $config['langs']. В админке всё ещё проще - тупо забираем $selected_language.
И так, как же правильно подключить свой языковой файл?
В пользовательской части не будем оригинальничать и воспользуемся вариантом разработчика:
В админской части всё примерно так же:
Это интересно:
Разработчик ДЛЕ очень странно ведёт себя с подключением файлов. Так в модуле "Список действий в админпанели" подключение языка выглядит так:
Если где-то подменить $selected_language (каким-нить модулем) - то язык не подключится...
Возникает вопрос: Если ты так доверяешь переменной $selected_language, что не задаёшь варианта "иначе" - зачем проверка? И почему мы не делаем вариант "инваче", ведь если if вернёт flse, то язык не подключится вообще...
Есть идеи для следующей статьи - пиши в личку!
Как узнать текущий язык на сайте? Как выбирается язык на сайте? Как правильно подключить
Весьма часто при разработке хочется сделать lang-файл для своих модулей, но как получить текущий язык сайта? Видел в интернете предлагают использовать $config['langs']. Значение действительно по началу выдаёт то, что нужно - огорчу, это язык по-умолчанию и не имеет ничего общего с текущим языкам. Просто мало кто тестирует сайт сразу на 2 языках...
Со сменой языка на сайте вообще полная задница... Понятия языка там нет вообще - вместо этого используется шаблоны...
Как же это работает? На сайте язык выбирается на основании настроек шаблона в админ-панели. Т.е. каждый шаблон может работать только с 1 языком - ну не труба ли? Чтобы добавить ещё один язык - создайте копию шаблона и в настройках вбейте другой язык. В коде это выглядит так:
PHP:
if (isset ( $config["lang_" . $config['skin']] ) and $config["lang_" . $config['skin']] != '') {
if ( file_exists( ROOT_DIR . '/language/' . $config["lang_" . $config['skin']] . '/website.lng' ) ) {
include_once ROOT_DIR . '/language/' . $config["lang_" . $config['skin']] . '/website.lng';
} else die("Language file not found");
} else {
include_once ROOT_DIR . '/language/' . $config['langs'] . '/website.lng';
}
PHP:
$selected_language = $config['langs'];
if (isset( $_POST['selected_language'] )) {
$_POST['selected_language'] = totranslit( $_POST['selected_language'], false, false );
if ($_POST['selected_language'] != "" AND @is_dir ( ROOT_DIR . '/language/' . $_POST['selected_language'] )) {
$selected_language = $_POST['selected_language'];
set_cookie ( "selected_language", $selected_language, 365 );
}
} elseif (isset( $_COOKIE['selected_language'] )) {
$_COOKIE['selected_language'] = totranslit( $_COOKIE['selected_language'], false, false );
if ($_COOKIE['selected_language'] != "" AND @is_dir ( ROOT_DIR . '/language/' . $_COOKIE['selected_language'] )) {
$selected_language = $_COOKIE['selected_language'];
}
}
if ( file_exists( ROOT_DIR . '/language/' . $selected_language . '/adminpanel.lng' ) ) {
require_once (ROOT_DIR . '/language/' . $selected_language . '/adminpanel.lng');
} else die("Language file not found");
Да очень просто. В пользовательской части проверяем $config["lang_" . $config['skin']], $config['skin'] - содержит название шаблона, ну а $config["lang_" . $config['skin']] - язык. Если язык не указан - то можно забрать из $config['langs']. В админке всё ещё проще - тупо забираем $selected_language.
И так, как же правильно подключить свой языковой файл?
В пользовательской части не будем оригинальничать и воспользуемся вариантом разработчика:
PHP:
if (isset ( $config["lang_" . $config['skin']] ) and $config["lang_" . $config['skin']] != '') {
if ( file_exists( ROOT_DIR . '/language/' . $config["lang_" . $config['skin']] . '/file.lng' ) ) {
include_once ROOT_DIR . '/language/' . $config["lang_" . $config['skin']] . '/file.lng';
} else die("Language file not found");
} else {
include_once ROOT_DIR . '/language/' . $config['langs'] . '/file.lng';
}
PHP:
if ( file_exists( ROOT_DIR . '/language/' . $selected_language . '/file.lng' ) ) {
require_once (ROOT_DIR . '/language/' . $selected_language . '/file.lng');
}
else {
include_once ROOT_DIR . '/language/' . $config['langs'] . '/file.lng';
}
Разработчик ДЛЕ очень странно ведёт себя с подключением файлов. Так в модуле "Список действий в админпанели" подключение языка выглядит так:
PHP:
if ( file_exists( ROOT_DIR . '/language/' . $selected_language . '/adminlogs.lng' ) ) {
require_once (ROOT_DIR . '/language/' . $selected_language . '/adminlogs.lng');
}
Возникает вопрос: Если ты так доверяешь переменной $selected_language, что не задаёшь варианта "иначе" - зачем проверка? И почему мы не делаем вариант "инваче", ведь если if вернёт flse, то язык не подключится вообще...
Есть идеи для следующей статьи - пиши в личку!