Страница 1 из 1

Не работает GetText

Добавлено: 25 апр 2020, 06:12
DooglsGo
Привет всем, возникла проблема. Решил заняться переводом сайта с помощью GetText, включил расширение, на страницы заходит, всё хорошо, но, как меняю язык, ничего не происходит. Ну думаю, закешировались мы, перезапускаю сервер - ничего. Решил закинуть сайт на хостинг, там всё работает. В чём может быть проблема, может кто сталкивался?
Index.php:
<?php
	ini_set('html_errors', 0);
	ini_set('display_errors', 0);
	ini_set('log_errors', 1);
	ini_set('error_log', 'error_log.log');

	define('ROOT', dirname(__FILE__).'/');

	require ("config.php");
	$_STEAMAPI = $config['steam_api_key'];
	
	require ("classes/base.class.php");

	if (isset($_COOKIE['novostroi_lang'])) {
		$locale = $_COOKIE['novostroi_lang'];
	} elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
		$locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);
	}
	
	if (!Base::$langs[$locale]) {
		$locale = "ru_RU";
	}
	
	define('LANGUAGES_PATH', ROOT . '/langs'); 
	putenv("LC_ALL=" . $locale); 
	setlocale(LC_ALL, $locale, $locale); 
	bind_textdomain_codeset($locale, 'UTF-8'); 
	bindtextdomain($locale, LANGUAGES_PATH); 
	textdomain($locale);

	if (isset($_GET['page'])) $lnk = explode('/', $_GET['page']);

	Base::DetectTimeZone();
	Base::TakeClass('db');
	Base::TakeClass('user');
	Base::TakeClass('upload');
	Base::TakeClass('log');
	
	$main_page = 'home';
	$show_login = false;

	$db = new DB($config['db_base'], $config['db_host'], $config['db_user'], $config['db_pass'], $config['db_port']);
	$db->connect();

	try {
		$pdo = new PDO('mysql:host=' . $config['db_host'] . ';dbname=' . $config['db_base'] . ';charset=utf8', $config['db_user'], $config['db_pass']);
	} catch (PDOException $e) {
		print "Error!: " . $e->getMessage();
		die();
	}

	$query = $pdo->query("SELECT * FROM `groups` ORDER BY `id`");
	while ($group = $query->fetch(PDO::FETCH_LAZY))
		$groups[$group['txtid']] = (($locale != 'ru_RU') ? $group['name_en'] : $group['name']);

	$query = $pdo->query("SELECT * FROM `servers_info`");
	while ($server = $query->fetch(PDO::FETCH_LAZY)) 
		$servers[$server['server_id']] = array('id' => $server['server_id'], 'name' => $server['name'], 'ip' => $server['ip'], 'port' => $server['port'], 'owner' => $server['owner'], 'show' => $server['show'], 'type' => $server['type']);

	Base::TakeAuth();

	header('Content-Type: text/html; charset=utf-8');

	$mode = (isset($lnk[0]))? $lnk[0]: $main_page;

	include (file_exists(ROOT . "pages/$mode.php"))? (ROOT . "pages/$mode.php"): (ROOT . "pages/404.php");

Re: Не работает GetText

Добавлено: 27 май 2021, 08:20
blblago
Точно такая же проблема, на хостинге перевод работает, на OpenServer не подтягивается перевод, постоянно работает ru_RU файл.

Re: Не работает GetText

Добавлено: 05 июн 2021, 08:48
ERserver
Может быть так;
putenv('LANGUAGE=ru_RU');
В PHPInfo Есть?:
GetText Support => enabled 

Re: Не работает GetText

Добавлено: 29 ноя 2021, 13:36
mazai
Как я понимаю, под виндой это проблема, локали переключаются очень туго.
Для себя нашел решение, кривое, но работающее, придется языковые пакеты перекладывать и переименовывать, но для разработки - потянет, так лучше, чем никак. Если кто то сможет лучше, с удовольствием посмотрю рецепт.

Мое решение:
<?php
//$locale = 'ru_RU.utf8';
$locale = 'fr_FR.utf8';

// Много попыток прописать локаль, можно удалить
putenv("LANGUAGE=" . $locale);
putenv("LANG=" . $locale);
putenv("LC_ALL=" . $locale);
putenv("LC_MESSAGES=" . $locale);
setlocale(LC_ALL, $locale);
setlocale(LC_CTYPE, $locale);

if ($locale == 'ru_RU.utf8') {
  bindtextdomain("messages", "./locale/ru");
  textdomain("messages");
} elseif ($locale == 'fr_FR.utf8') {
  bindtextdomain("messages", "./locale/fr");
  textdomain("messages");
} else {
  // возвращаем английский язык
  bindtextdomain("messages", "");
}
?>
Структура папок при этом:
/
—locale
——fr
———ru_RU (* тут именно ru_RU)
————LC_MESSAGES
—————— messages.po
—————— messages.mo
——ru
———ru_RU
————LC_MESSAGES
—————— messages.po
—————— messages.mo

Ну, а на боевом сервере раскладываем языковые пакеты по нормальным позициям. Криво, но работает.