Now this is something,
print_r($_SESSION) after a click on the english link (set_lang.php above):
Array ( [lang] => dn )
your problem starts here in set_lang.php . Maybe a session is started from a file that is included and this should not happen!
If set_lang is not included make sure a start_session exist there, also put a print_r there too, you could even compare the session ids too:
let's say this is index.php
<?php
session_start();
?>
<a href='set_lang.php?sess=<?PHP echo session_id();?>'>lang</a>
and this set_lang.php
<?PHP
session_start();
echo 'this is session id from index.php: ',$_GET['sess'],
'and this is session id in set_lang.php:',session_id(),
'and this is the print_r:<br><pre>';
print_r($_SESSION);
?>
you should see the same session id.
But while all these might help you I will take it a step further, use single entry point, do not call php script directly like this
<a href=somescript.php>link</a>
(unless you are doing some ajax) instead you always call some php script through index.php like this:
<a href=index.php?target=somescript.php>link</a>
This way you will have the session start placed only once in the index.php, the login check can be done in index.php too.
=======================Edit More Info Added=========================================
A fast google search.. found this small single entry tutorial http://www.renownedmedia.com/blog/php-navigation-system-using-single-entry-point/ there could be better ones.
Even better it would be switching to an mvc framework (that includes the single entry point philosophy) but because the learning curve is more steep at least start with the single entry point.
============ReEdit more info added again==========================================
A good option then would be to replicate this problem again but out of your project context, take as less as possible code from your project in new created files and try to create the problem again. keep it as simple as possible just try to create the error again