1) В самом начале скрипта напишите вызов функции:
ob_start();
чтобы весь вывод кешировался и возвращался браузеру в конце работы скрипта.
Это поможет избавиться от warning-ов «Cannot modify header information...», чтобы они пока не мешались…
Если всеравно такие warnings будут, то значит что-то все-таки выводится перед вызовом ob_start(). Например, что-то может быть перед первым "<?php" (это могут быть невидивые символы utf8)
2) Сама по себе функция «не работать» не может, если она объявлена и вызывается. Поэтому просто «дебажте код» — добавьте во все ключевые места (перед вызовом, в самой функции в начале вызова, в тело if которые должно выполниться и т.д.) echo «XX\n»;
XX — числа по порядку или слова. И проанализируйте, что будет выведено.
Если нету других способов дебага, то этот способ помогает быстро локализовать место, где код невыполняется как хотелось бы…
Также, может помочь вывод var_dump($_COOKIE); чтобы быть уверенным что кука пришла от браузера.
И еще, на всякий случай, в строке:
$lang = $_GET['lang'];
если атрибут «lang» не передан в URL, то в этом месте будет ошибчка — нет такого index в массиве.
Надо бы, по хорошему, что-то типа этого:
$lang = isset($_GET['lang'])? $_GET['lang']: '';