How to Add PHP Multilingual Support to a Website

Are you interested in having a multilingual website? This is a tutorial that shows you how you can do that in PHP.


The first thing we need to do is to create a couple of files that will contain the text for each of the languages that will be supported by the website. For demo purpose I have chosen English, Spanish and German. Make a directory named “directory”. In this directory create 3 files:, lang.en.php, and In our main file (index.php) we will include a file (common.php) containing a piece of code that gets the requested language. Here’s the content of those 3 language files:


Language: English

$lang = array();

$lang['PAGE_TITLE'] = 'My website page title';
$lang['HEADER_TITLE'] = 'My website header title';
$lang['SITE_NAME'] = 'My Website';
$lang['SLOGAN'] = 'My slogan here';
$lang['HEADING'] = 'Heading';

// Menu

$lang['MENU_HOME'] = 'Home';
$lang['MENU_ABOUT_US'] = 'About Us';
$lang['MENU_OUR_PRODUCTS'] = 'Our products';
$lang['MENU_CONTACT_US'] = 'Contact Us';
$lang['MENU_ADVERTISE'] = 'Advertise';
$lang['MENU_SITE_MAP'] = 'Site Map';

Language: Spanish

$lang = array();

$lang['PAGE_TITLE'] = 'Título de la página de mi sitio web';
$lang['HEADER_TITLE'] = 'Mi sitio web de la cabecera título';
$lang['SITE_NAME'] = 'Mi Sitio Web';
$lang['SLOGAN'] = 'Mi lema aquí';
$lang['HEADING'] = 'Título';

// Menu

$lang['MENU_HOME'] = 'Inicio';
$lang['MENU_ABOUT_US'] = 'Sobre Nosotros';
$lang['MENU_OUR_PRODUCTS'] = 'Nuestros productos';
$lang['MENU_CONTACT_US'] = 'Contáctenos';
$lang['MENU_ADVERTISE'] = 'Publicidad';
$lang['MENU_SITE_MAP'] = 'Mapa del Sitio';

Language: German

$lang = array();

$lang['PAGE_TITLE'] = 'Meine Webseite Titel';
$lang['HEADER_TITLE'] = 'Meine Website-Header Titel';
$lang['SITE_NAME'] = 'Meine Website';
$lang['SLOGAN'] = 'Mein Slogan hier';
$lang['HEADING'] = 'Position';

// Menu

$lang['MENU_HOME'] = 'Heim';
$lang['MENU_ABOUT_US'] = 'Über uns';
$lang['MENU_OUR_PRODUCTS'] = 'Unsere Produkte';
$lang['MENU_CONTACT_US'] = 'Kontaktieren Sie uns';
$lang['MENU_ADVERTISE'] = 'Werben';
$lang['MENU_SITE_MAP'] = 'Site Karte';

As you can notice, some constants are created using the define() function. In every file the defined constants have the same name, bu the values is different. We will output the values of the constants inside the index.php file. Therefore we will see different text every time we will call other language file.

Determine the right language

Let’s analyze the common.php file:

header('Cache-control: private'); // IE 6 FIX

$lang = $_GET['lang'];

// register the session and set the cookie
$_SESSION['lang'] = $lang;

setcookie('lang', $lang, time() + (3600 * 24 * 30));
else if(isSet($_SESSION['lang']))
$lang = $_SESSION['lang'];
else if(isSet($_COOKIE['lang']))
$lang = $_COOKIE['lang'];
$lang = 'en';

switch ($lang) {
  case 'en':
  $lang_file = 'lang.en.php';

  case 'de':
  $lang_file = '';

  case 'es':
  $lang_file = '';

  $lang_file = 'lang.en.php';


include_once 'languages/'.$lang_file;

After we determine the value of $lang, we use switch() to compare its value with some different values, and execute a different piece of code depending on which value it equals to. After the value of the $lang_file is determined, the script will include the necessary language file. As you can see I have used sessions to register the value of $lang. This way users can navigate through the whole site and see the content in the chosen language (lang=[language here] does not need to be passed in every URL). Additionally, I have used cookies to store the selected language in users computer for 30 days. When the visitor will come back he will see the site in the language that he previously selected.

How if the website’s language requested?

In this demo I have chosen to use some image flags, each image having a link to index.php?lang=[LANG HERE]. So, to see the site in german we will use the German image flag which links to index.php?lang=de.

Lastly, the constants values should be outputted in the page. Examples:

for document title

<title><?php echo $lang['PAGE_TITLE']; ?></title>

for header menu

      <li><a href="/"><?php echo $lang['MENU_HOME']; ?></a></li>
      <li><a href="about_us"><?php echo $lang['MENU_ABOUT_US']; ?></a></li>
	  <li><a href="our_products"><?php echo $lang['MENU_OUR_PRODUCTS']; ?></a></li>
      <li><a href="contact_us"><?php echo $lang['MENU_CONTACT_US']; ?></a></li>
      <li><a href="advertise"><?php echo $lang['MENU_ADVERTISE']; ?></a></li>	
      <li><a href="sitemap"><?php echo $lang['MENU_SITE_MAP']; ?></a></li>

Comment via Facebook



  1. says

    This may works out for a couple of pages, but not for much, ( except the menu and static stuff ) as the page title is vital for SEO, and every page having the same title will really be a problem.

    Furthermore you’d need to write all your content in 3 languages and associate that with the pages that should display that content later on. Better is to have a nice – maybe written by your own – CMS that really does nothing else than “spit” out requested content in the requested language on the appropriate page.

    We use a small CMS for our news section, which supports 3 languages. Using such a thing together with your approach then makes sense. It displays contents on our different language websites accordingly.

  2. Ulle says

    I wonder could that be changed so when changing the language, the hrefs of the header change aswell as the title of the link? that way i could simply just add


    and with include, bring in different texts to the body area, according to the language:

    include ($lang.”/etusivu.html”);

    That way, I dont need to define different words for different languages, since all words will be in separate .php or .html file.

    • GabrielGabriel says

      It’s good to have a certain order of the files and keep each language words in separate files. I have seen many professional applications built this way and I really recommend this practice. I don’t like the idea of changing the links inside the page. I believe it’s better to use specific links or (flag) images to set the desired language.

      • Ulle says


        I aggree on the point: of using specific links or imgs to set the language, but the href that i want to change is the menu’s links “home, links, contact, etc” :) could that be possible with your script? Im a newbie sorta with php.

        Thanks :)

  3. says


    Using constants is just the simplest way of localizing your content. Personally I got realy fond of the way WordPress has incorporated localisation. Somewhat simplified but everywhere you want to use a localized string you just wrap it in __() or _e():
    to echo a localized string. The function _e($str) knows if a translated version of the string is present in your translation set. If so the translation is outputted, otherwise the unaltered text. This makes sure you never get ugly constant warnings in your interface.
    Using any of the dozens of ways you can easily hook your __() and _e() implementation to your prefered dictionairy method of choice. Be it ini files, or xml files, or when you are up to it going with gettext (.po/.me and .pot files, with POEdit).
    This post is okee for just a simple site, but when you get into larger sites, you need to get a more sound and less error prone approach.

    My 2cts


  4. says

    Great tutorial. It’s what the feature I am looking for for my dating website.

    Can you tell us a bit further how do replace the flag icon with the dropdown box option.

  5. Peter says


    Is it actually possible instead of redirecting each language link to the index

    Instead of <a href="?lang=en" rel="nofollow">


    lt;a href="<?php $_SERVER[‘PHP_SELF’]?>" rel="nofollow">?lang=nl">

  6. says

    I do like this but I prefer to do this a different way and I think it keeps files more organized but I’m not sure how to do it. Perhaps someone can tell me.

    I want to have each language files in their own folder (en/ and fr/) for english and french for example. I want to be able to click on the image/text and have the page I’m currently on change to the same page but in a different language. So essentially, we are just changing the folder name from en to fr.
    Can anyone please tell me how to do this? A sample site here but it’s in ASP code (
    Thank you in advance.

    • says

      hey like your site loos great – looking to do something similar with ours but possibly using sessions and cookies so you would not have to duplicate pages i.e. index_en && index_fr etc..

  7. Marzio says

    Very usefull tutorial!
    I have a doubt. How can I add to this code a php function to identify the default browser language?

  8. says

    Hi @ e11world

    That’s fairly easy. Create a new directory/folder and named it to english for english and spanish for spanish and german for german and so on.

    After that, create lang.en.php, and Rename these files like lang.en.php into english.php and so on and put them in their respective directories.

    Next step, you’ll have to modify the common.php.

    Look for line 29 $lang_file = ‘lang.en.php'; and replace with this code below:

    $lang_file = ‘english'; //let’s remove the .php extension instead^^

    Do this for the other languages you like.

    Now, go into line 45 and change this code: include_once ‘languages/’.$lang_file;

    into this code below:

    include_once ‘languages/’.$lang_file.’/’.$lang_file.’.php';

    You now have languages in each directories. It’s more clean and cumpty this way specially when you suddenly decided to separate each language section in each files, you’re translator won’t have a hard way.
    To change language, use the below code.


    To replace it with drop down menu, you’ll have to use this example code below:

    function jump(menu){
    var loc = menu[menu.selectedIndex].value.split(“|”);
    if(loc.length == 2)[1], loc[0]);

    <option value="_top|?&lang=en” >English
    <option value="_top|?&lang=de” >German
    <option value="_top|?&lang=es” >Spanish

    It will repeat the requested language over and over until you click other links. I know, the javascript is old but i used it to my site. It’s good and it’s not jquery.

    Hi @ Peter

    It’s quite easy, omit the index.php so instead of index.php?lang=en it would be better this way ?&lang=es and you won’t be redirected in the index.php for changing language! It will repeat the requested language over and over again but atleast it wort. Hope other users will find a better way and please mail me @ brixter.deleon[@]

    Hi @ Marzio

    It’s already in there. Take a good close look at line 40. If the script can’t find the language requested by the user, it will automatically call on the default which is the english. So when a user submitted lang?=justajoke, the script will automatically call in the default which is the english language.

    Anyways, nice tutorial kudos to the author.

    • says

      Thanks for the help. I actually found many sites offering the same way you suggested here but it’s not what I want and I found another way to do this exactly how I want. Thanks!

  9. Morris says

    I wanted to know if it is possible to use this define method but instead of having text, direct it to an image. If i have a menu that is constructed of images, how would I come about doing that?


  10. says

    Ah what you mean is that instead of text links you used image links like those buttons?

    Here is the answer, you can define it like this:

    Follow above instructions, then create a image link like below:

    define(‘LANG_HEADING’, ”);

    Hope that clears out your question,

  11. laur says


    Tell me how can i make to appear German character.
    Ex: In demo website on menu “About us”, if i change on German language it appear ? instead the special character. what can i do?

  12. Frank says

    Hi there,

    This is a great tutorial, but I have one question. Is it possible to fallback to the English text if the translated text for the chosen language is not available?


  13. says

    Great script! Would really like to get this to work.
    Standalone it works.

    But when I try to work it into my site I’m getting header errors.

    Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at /opt/www/mashamotoltd2/web/ in /opt/www/mashamotoltd2/web/ on line 2

    Warning: Cannot modify header information – headers already sent by (output started at /opt/www/mashamotoltd2/web/ in /opt/www/mashamotoltd2/web/ on line 3

    Warning: Cannot modify header information – headers already sent by (output started at /opt/www/mashamotoltd2/web/ in /opt/www/mashamotoltd2/web/ on line 12

    These 3 lines give me the “headers already sent” error


    header(‘Cache-control: private’); // IE 6 FIX

    setcookie(“lang”, $lang, time() + (3600 * 24));

    Could anyone please tell me how to solve this?

    • Tempest says

      Arthur, are you saving your web page as a UTF-8 or ANSI? UTF-8 will create that issue too. Try saving your page again but with a ANSI encoding.

  14. says

    I haven’t saw this error (as posted by Author) in my local apache server but it displays in the internet.

    Warning: Cannot modify header information – headers already sent by (output started at /opt/www/mashamotoltd2/web/ in /opt/www/mashamotoltd2/web/ on line 12

    I guess saving the file as ANSI works. thanks @ tempest.

  15. Serpant says

    Hello is this script SEO friendly ?
    If it is then how i can make a sitemap icluding the 3 different languages ?

  16. says

    “As you can see I have used sessions to register the value of $lang. This way users can navigate through the whole site and see the content in the chosen language”

    The above seems not to work for me. I have 2 languages. If i switch on index.php from English to Dutch it translates the menu, but if I click on a menu item it opens the page with the menu in English. Why is it not opening the page with the menu in Dutch?

      • Tomi says

        I got it. Simple solution.
        I removed the <a href> codes from my main file (index.php for example) and put them (plus "?lang=en" at the end of url)in each language (translation) php.

        like this:

        In "index.php"
        <li><?php echo $lang['MENU_HOME']; ?></li>

        In "lang.en.php"
        $lang['MENU_HOME'] = '<a href="index.php?lang=en" target="_self">Home</a>';

        In ""
        $lang['MENU_HOME'] = '<a href="index.php?lang=jp" target="_self">%u30DB%u30FC%u30E0</a>';

        and now it's working!

    • Gabriel C.Gabriel C. says

      I would like to see this in action. This way I could help you with this problem. I have re-tested the script and it does work fine for me. So, consider giving me the URL to the page where you have used this script.

  17. says

    Esta bien el manual para multiples idiomas,

    pero por ejemplo como seria si el usuario tiene una pagina web que busca desde la base de datos

    y lo imprime en la pantalla, como seria en ense caso el cambio del idioma?

    en mi caso

    y publica toda la linea de CATNAME que son 5 datos, como seria para cambiar eso?

  18. Deni says

    Hello ,

    I am php beginner. I want to develop website which having multi-languages(Ex. English,Thai,Swedish etc).

    I have data files that I inserted into database. By using that database how I develop website?

    please give me all configuration detatils. or if possible give me url of such examples.

    Thanks in advance…..

  19. tara says

    Hello! This is great tutorial! Thank you!

    I want to realise a language switcher using your tutorial.

    I have 3 languages in the site. Only 2 languages should be shown and the third is active as content on the site.

    When is clicked other language, switcher show only non active languages.

    How can be realised? Thank you in advance.

  20. says

    Great script and I’ve used it with succes. I want to change something, but I don’t know how to do it. I’ve tried lots of things but I’m just not good enough yet at php.

    I’m trying to use the browser user information to see where he is from and automatically redirect this person to this language.

    Reason being I get a lot of english mail from native customers.

    I don’t like to use javescript, so modifying the script is the only way. Who here could help me.

    There are many scripts out there, I just didn’t managed to implement one.

    I know it has something to do with $HTTP_SERVER_VARS[‘HTTP_ACCEPT_LANGUAGE’]


    • Gabriel C.Gabriel C. says

      In this tutorial, I’ve used images instead of text to switch to different languages. Do you want to show different images in the page for each language? If that’s what you want you can just embed the HTML code for the images you want in the languages pages, e.g.

      This could be set in lang.en.php:
      $lang['FRONT_PAGE_IMAGE'] = '<img src="" width="500" height="200" border="0">';

      • Mike says

        Hi, yes that was what I meant, however when I use the above code it just shows the code instead of the image. What I am I doing wrong?

        Thanks for the help

  21. Steve says


    Great article, well done on the tutorial. However, 1 recurring question that I feel was not addressed in the thread is how this implementation gels with SEO and Google spiders? Is this a friendly solution for SEO purposes and if not, what extensions should be made to it in order to become more SEO friendly.


    • Gabriel C.Gabriel C. says

      If the content is the same, but written in another language, I don’t believe it should be a problem. In my opinion, it’s they are relevant results for Search Engines. I suggest you using friendly URLs such as I would not be worried about duplicate content.

  22. says

    I tried to use yhis way at mt site
    but i always fail to make the lang change work correctly

    i use this

    include "lang.class";
    $_GET['lang'] = $_COOKIE['lang'];
    $_GET['lang'] = "en";
    setcookie("lang", 'en', time()+360000, '/', $_SERVER['SERVER_NAME']);
    setcookie("lang", $_GET['lang'], time()+360000, '/', $_SERVER['SERVER_NAME']);
    $_lang = new Lang($_GET['lang']);

    but if you add the slash or anything after the index.php?lang=en or index.php?lang=gr

    i have error

    Warning: fopen(languages/gr1.lang) [function.fopen]: failed to open stream: No such file or directory in /home/thecscom/domains/ on line 68

    Warning: fclose(): supplied argument is not a valid stream resource in /home/thecscom/domains/ on line 80

    is there a way to beat this?

  23. says

    This is part of the lang class i use

    * get the text from the file
    function GetLanguages() {
    while (false !== ($file = readdir($lang_folder))) {
    if (($file!='.') and ($file!='..') and preg_match("/.lang$/",$file)) {
    $lines = file($this->directory."/".$file);
    $name = 'Ismeretlen';
    foreach ($lines as $line) {
    if(substr($line,0,5) == 'name ') {
    $this->languages[substr($file,0,strpos($file,'.'))] = substr($line,7,-1);

    * Load the language file
    function LoadLangFile() {
    $prefix = "";
    $file = $this->directory."/".$this->lang.".lang";
    $open = fopen($file, "r");
    if ($open) {
    while (!feof($open)) {
    $buffer = fgets($open, 4096);
    if((substr($buffer,0,1) == "\n") || (!substr($buffer,0,1))) continue;
    if(substr($buffer,0,1) == '[') $prefix = substr($buffer,1,-2);
    else {
    list($key,$value) = preg_split("/ = /", $buffer);
    $this->text[$prefix."_".$key] = substr($value,0,-1);

    * The Constructor
    * @parameters
    * $lang ~ tha code of language
    * $dir ~ base directory of language files

    function Lang($lang, $dir = "") {
    $this->lang = $lang;
    if(!empty($dir)) $this->directory = $dir;

    if some could help that would be very nice

  24. Alice says

    Wow.It’s nice to see the codes though its crazy a bit. Haha. Nice blog, i learned something some of the php codes, maybe i’ll apply it in the future 😀

  25. Rose says

    I learned a lot, i have my programming language maybe i’ll apply it to my project in web programming. thanks for this nice blog.

  26. Natalie says

    It makes me dizzy reading those codes, but i remember i have a friend who is a programmer. Maybe i’ll try to use this codes to showcase to him that i also learned something. Hehe. This is great 😀

  27. James says

    Thank you, can i use these codes for my upcoming project in PHP subject? This is really nice. Thanks in advice, nice blog. :)

  28. Makcum says

    I have used this code with 4 lang website, and having problem:

    You are on different from default ENG Language page and want to go to another page DE for example,
    going on DE page resets this page back to default ENG language and to see it again on DE or any other lang u have to press again.

    • George says

      Hello, I’m having this problem also.
      A have a small site with pages like index.php, contact.php, product.php. In each page a include menu.php and in menu.php a include common.php.

      I think is a problem with session_start() but i dont know how to fix it.

    • Xenn says

      I try to add to, for example, something like this:

      $lang_url = '?lang=de';

      The same I use in other languages and than for links in nav I use this:

      href="ponuka.php<?php echo $lang_url; ?>"

      I know that isn’t professional solution but it works for me :)

  29. Daniel Medina says

    Thank you for this tutorial / article.
    I am learning PHP and this gave me a mighty help to what I do.

  30. Justin says

    This tutorial was great, but sort of skipped over the entire issue of encoding + how to integrate languages such as Russian / Chinese….

  31. Peter says

    Thanks a lot for this great tutorial!!

    2 little questions:
    – is there a way to change the code in a way that when changing the language, the user stays on the same page instead of jumping to the index page?
    – how can special caracters be displayed they look kind of funny (even in the example)

    thanks a bunch

      • Tom says

        Another way to solve the special character problem is by using htmlentities() arround each of the strings with special chars. This is a safer way, as a browser may display UTF-8 characters as non-UTF-8, even when the file is saved as UTF-8.

  32. hasan says

    The script is able to be mounted on wordpress,
    to the system how, if the web owner wants to rewrite the language in translated or all languages ​​will automatically change all when the flag at the click ..?
    Thank you very much

    • Gabriel C.Gabriel C. says

      The script is just a basic example of how you can make a website multi-lingual. It’s not a good idea to mount it on WordPress, as there are other alternative methods especially made to work with WordPress. Take a look at the following post: (you can Google more about it as well “wordpress multiple languages”)!

  33. Mauro says

    Is it possible to output the language data from a database? Instead of controllin the data directelly in the php language page making it communicate in the database. Whit the finality of controlling it in the backoffice.

    • Gabriel C.Gabriel C. says

      The requested value has to be checked. If something else is typed in the URL bar such as /?lang=foo then the include_once function will trigger an error. That’s why the switch case is added: for verification!

  34. says

    Thanks for this tut!

    I have some issue’s though. Can’t figure it out. First of all, let me say that the folder & file structure is the same as in the demo.

    But somehow it just doesn’t show the languages. I started over like 4 times, but can’t find what’s wrong…

    I have altered the ‘common.php’ to make the default language dutch and the available languages, but nothing drastic:

    Now when I go to my website, it shows every element, but not the texts. The Dutch texts are only showing a D, and the English texts only an E.

    Furthermore I get an error that the include (as called on line 41 of the common.php) can not be performed?

    Anybody an idea? Suggestions are more then welcome!


    • Floris says

      I have the same problem too, with dutch language. If I switch "include_once ‘common.php';" to "include_once ‘languages/lang/en.php';" it doesn’t show anything… So, the problem isn’t common.php, but the request in the index or the language files, I guess…

  35. dasky says

    I’m a rookie in designing websites and I love this tutorial.
    But I have a question according to the links in the header.

    So if I’m correct I just replace for example the ‘#’ in the header menu (menu_home) to ‘./index.php’. Can I just rely on the language cookie that has been set, or do I have to add something extra at the back like ‘./index.php?lang=[..] to keep it on the right language?

    I apologize if it was a dumb question.

  36. says

    Hi :) I’ve been using this script for a while and really like it.

    I just wanted to know how to make it automatically detect the language of the browser or the OS, cause everytime i visit my website, it display in English.

    Thanks 😀

  37. says

    Saved me hours and hours of work. And one look it tells me that it can easily be converted for $l_files = etc and should blend in nicely with what I am trying to do.

    Thanks for the script, now all I have to do is apply it to my games demo site.

    • solovi says

      hi soravit I notice that you seem to have fix your problem in your website, since I have the same problem could you explain how you resolve it, thanks.

  38. RIck says

    its a great tutorial but only change the languages on the first page

    using other pages not working the language change

    i had tried few options not working at all
    first page works perfect

    i want to load from the first page change on first page
    and all the other pages change the language as well

    if anyone can help me out


  39. Tuga says

    this software works with the front page where the language is installed click the language and changes perfect

    when you navigate on other pages the language don’t change at all

    i would like to ask for any help of language change on all the pages if possible
    sooner change language on the front page all the other pages will change language as well
    its not working with this

  40. mohit says

    I have created multilanguage feature on our project, its working fine, but now in coding file
    it shows diffirent font for russian language.

    $lang[‘Email Notification’]=’Уведомление по электронной почте';

    but correct means in russian language is :
    $lang[‘Email Notification’]=’Уведомление по электронной почте';

    How this is possible to show me correct font as per language


Leave a Reply

Your email address will not be published. Required fields are marked *