A PHP Error was encountered

Severity: 8192

Message: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead.

Filename: mysql/mysql_driver.php

Line Number: 303

Многоязычный сайт на PHP

Многоязычный сайт на PHP

Автор: Mowshon.
Опубликовано 19 сентября 2011
в рубрике PHP, Примеры

Просмотров: 6643.
Подписаться на комментарии по RSS.

Многоязычный сайт на PHP

На многих сайтах вы наверное видите где-то в углу флаги других стран, при нажатии на них сразу меняется язык сайта. Это и есть "многоязычный сайт", это очень удобно если ваш сайт посещают например русские, украинцы, румыны. В данном случае нужно написать сайт который по требованию пользователя менял язык сайт в требуемый. Каждый язык должен иметь свой собственный файл где будет хранится массив языка. Выбранный язык будет запоминаться в сессии и при каждом обращении к сайту язык останется без изменений.

Скачать сразу архив с примером

Пароль: live-code.ru

Структура сайта:

lang / lang.ru.php

lang / lang.ua.php

lang / lang.ro.php

index.php

Для начало, мы создадим языковые файлы для каждого языка и сохраним их в папку lang

- Русский языковый файл (lang / lang.ru.php)

<?php
/** ----------------------
 ** Русский языковый файл
 ** Источник: live-code.ru
 ** ----------------------*/
$Lang = array(
 "title" 	=> "Мой многоязычный сайт на PHP",
 "header_title" => "Многоязычный сайт",
 "site_slogan"	=> "Сайт программиста",
 
 // Меню
 "index_menu"	=> "Главная страница",
 "contact_menu" => "Контакты",
 "site_map"	=> "Карта сайта",
 "advertisement"=> "Реклама",
);
?>

- Украинский языковый файл (lang / lang.ua.php)

<?php
/** ----------------------
 ** Украинский языковый файл
 ** Источник: live-code.ru
 ** ----------------------*/
$Lang = array(
 "title" 	=> "Мій багатомовний сайт на PHP",
 "header_title" => "Багатомовний сайт",
 "site_slogan"	=> "Сайт програміста",
 
 // Меню
 "index_menu"	=> "Головна сторінка",
 "contact_menu" => "Контакти",
 "site_map"	=> "Карта сайту",
 "advertisement"=> "Реклама",
);
?>

- Румынский языковый файл (lang / lang.ro.php)

<?php
/** ----------------------
 ** Румынский языковый файл
 ** Источник: live-code.ru
 ** ----------------------*/
$Lang = array(
 "title" 	=> "Site-ul meu multilingvist pe PHP",
 "header_title" => "Site-ul poliglot",
 "site_slogan"	=> "Site-ul programistului",
 
 // Меню
 "index_menu"	=> "Pagina principala",
 "contact_menu" => "Contacte",
 "site_map"	=> "Mapa Site-ului",
 "advertisement"=> "Reclama",
);
?>

Теперь создаем главный файл index.php который будет вызывать языковый файл в зависимости от выбора пользователя.

<?php
@session_start();
// Массив доступных для выбора языков
$LangArray = array("ru", "ua", "ro");
// Язык по умолчанию
$DefaultLang = "ru";
// Если язык уже выбран и сохранен в сессии отправляем его скрипту
if(@$_SESSION['NowLang']) {
	// Проверяем если выбранный язык доступен для выбора
	if(!in_array($_SESSION['NowLang'], $LangArray)) {
		// Неправильный выбор, возвращаем язык по умолчанию
		$_SESSION['NowLang'] = $DefaultLang;
	}
}
 else {
 	$_SESSION['NowLang'] = $DefaultLang;
 }
// Выбранный язык отправлен скрипту через GET
$language = addslashes($_GET['lang']);
if($language) {
	// Проверяем если выбранный язык доступен для выбора
	if(!in_array($language, $LangArray)) {
		// Неправильный выбор, возвращаем язык по умолчанию
		$_SESSION['NowLang'] = $DefaultLang;
	}
	 else {
	 	// Сохраняем язык в сессии
	 	$_SESSION['NowLang'] = $language;
	 }
}
// Открываем текущий язык
$CurentLang = addslashes($_SESSION['NowLang']);
include_once ("lang/lang.".$CurentLang.".php");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><?php echo $Lang['title']; ?></title>
<style type="text/css">
body {margin:0; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:14px; color:#000000;}
h1, h2, h3 {margin:0;}
a {color:#FFFFFF; text-decoration:none;}
img {border:0;}
.header {height:100px; text-align:center; padding:25px; background:#CCCCCC;}
.menu {background:#666666; height:30px; text-align:center;}
.content {padding-left:100px; padding:50px;}
.footer { background:#CCCCCC; padding:10px; text-align:center; border-top: 1px solid #000000;}
</style>
</head>
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td class="header">
		<h1><?php echo $Lang['header_title']; ?></h1>
		<h3><?php echo $Lang['site_slogan']; ?></h3>
	</td>
  </tr>
  <tr>
    <td class="menu"><a href="index.php"><?php echo $Lang['index_menu']; ?></a> | <a href="index.php"><?php echo $Lang['contact_menu']; ?></a> | 
	<a href="index.php"><?php echo $Lang['site_map']; ?></a> | <a href="index.php"><?php echo $Lang['advertisement']; ?></a>
	<a href="index.php?lang=ru"><img src="img/ru.png"></a> 
	<a href="index.php?lang=ua"><img src="img/ua.png"></a> 
	<a href="index.php?lang=ro"><img src="img/ro.png"></a>
	</td>
  </tr>
  <tr>
    <td class="content">Данный сайт является примером мультиязычного сайта. Нажимаем на флаги вышеуказанных трех стран и увидем смену языка на сайте</td>
  </tr>
  <tr>
    <td class="footer"> Coding & Design: Live-Code.ru</td>
  </tr>
</table>
</body>
</html>

Вот скрин сайта который у нас получился в конечном итоге:

Пример: многоязычный сайт на PHP

Теперь когда мы будем переходить по ссылкам

site.com/index.php?lang=ru (Будет русский язык, скрипт загрузит файл lang.ru.php)

и так далее для каждого языка (ru, ua, ro).

Спонсор статьи: английский по скайпу
Вопросы и может быть советы по улучшению скрипта можете оставить в комментариях ниже.

Комментариев: 31

  1. Igor | 21.09.2011 в 01:33:43 | #1

    Спасибо за статьи!

    Хотел что то подомное сделать недавно но не знал как именно это реализовать.

    Теперь более менее понял картину как должен работать многоязычный сайт.

  2. Дмитрий | 18.12.2011 в 17:33:48 | #2

    Автор респект тебе и уважуха, ты представляешь мне даже на php su не помогли с этой проблемой по разноязычности, уважуха вам парни я хоть пример ее работы увидел за что большое вам спасибо!

  3. Mowshon | 18.12.2011 в 18:20:31 | #3

    Дмитрий, рад был Вам помочь wink

  4. Дмитрий | 27.12.2011 в 04:21:12 | #4

    Возникла проблема, не могу решить.

    При первом входе на сайт выдает

    Warning: include_once(lang/lang..php) [function.include-once]: failed to open stream: No such file or directory in /home/virtwww/w_remontpc-lviv-ua_02813c27/http/demo2/about.php on line 33

    Warning: include_once() [function.include]: Failed opening 'lang/lang..php' for inclusion (include_path='.:') in /home/virtwww/w_remontpc-lviv-ua_02813c27/http/demo2/about.php on line 33

    но когда вручную воткнуть язык ?lang=ru, например проблема исчезает в любом браузере

    вот сайт http://remontpc.lviv.ua/demo2/about.php

    СПАСИБО!

  5. Mowshon | 27.12.2011 в 12:24:16 | #5

    Warning: include_once(lang/lang..php) [function.include-once]: No such file or directory

    Проблема в сессиях, они у Вас не создаются. Проверьте в файле about.php если есть инициализация сессии: session_start();

    Если нет то вставьте после <?php функцию session_start();

    Посмотрите верхние строчки файла index.php в примере выше и сделайте так-же в файле about.php у Вас.

  6. irina | 08.01.2012 в 21:35:32 | #6

    в чём может быть дело,если вылетает ошибка : Notice: Undefined index: lang in C:\xampp\htdocs\Rroject_Site\index.php on line ..

  7. Mowshon | 10.01.2012 в 14:22:41 | #7

    irina, данная ошибка не является критической, дело в уровне обработки ошибок он у Вас самый первый, это значит, что любые ошибки или недочеты будут засвечены компилятором. Программистам следуем работать в таком режиме т.к. помогает обнаружить маленькие ошибки.

    Теперь решение Вашей проблемы.

    В файле index.php после <?php добавьте код: error_reporting(E_ALL ^ E_NOTICE);

    получится следующее:

    <?php
    error_reporting(E_ALL ^ E_NOTICE);
    @session_start();
    ...

    Совет: Когда указывается сообщение с ошибкой, если хотите чтобы Вам быстро помогли то нужно указать и строку где возникла ошибка "on line .."

    Если останутся вопросы, пишите.

  8. Swat | 11.03.2012 в 13:10:12 | #8

    Добрый день! Подскажите, пожалуйста! Все сделал по Вашей инструкции, но сверху над страницей показывает ошибку:

    Warning: main(lang/lang..php): failed to open stream: No such file or directory in z:\home\localhost\www\minisite\index.php on line 21

    Warning: main(): Failed opening 'lang/lang..php' for inclusion (include_path='.;/usr/local/php/PEAR') in z:\home\localhost\www\minisite\index.php on line 21

    Как её решить?

  9. Swat | 11.03.2012 в 13:21:13 | #9

    session_start(); - в верхней строчке есть

  10. Mowshon | 11.03.2012 в 13:53:19 | #10

    Swat, попробуйте убрать от session_start(); символ @

    Это даст возможность выявить сообщение о ошибке если она заключается в session_start

  11. Swat | 11.03.2012 в 21:03:51 | #11

    Убрал, но не помогло. Может ещё есть какой-нибудь метод?

  12. Swat | 11.03.2012 в 21:07:23 | #12

    И ещё: когда набираю http://localhost/minisite/index.php?lang=en -то, пропадает ошибка, а когда без lang=en - остается.

  13. Swat | 11.03.2012 в 23:46:36 | #13

    А где у Вас в примере скрипт вот этого:"Многоязычный сайт

    Сайт программиста"

    Потому что в себя на сайте я вставляю : вместо какого-нибудь слова. Может поэтому у меня ошибка?

  14. Swat | 11.03.2012 в 23:49:46 | #14

    А где у Вас в примере скрипт вот этого:"Многоязычный сайт

    Сайт программиста"

    Потому что в себя на сайте я вставляю :/**/ вместо какого-нибудь слова. Может поэтому у меня ошибка?

  15. Swat | 11.03.2012 в 23:55:08 | #15

    В предыдущем комментарии вместо - /**/

    вывожу в "php" ($Lang['название слова']);

  16. Mowshon | 12.03.2012 в 02:00:03 | #16

    Swat, обновил архив попробуйте скачать и поставить заново. Попробуйте кликать по флагам стран и по внутренним ссылкам, если язык остается тем который Вы выбрали значит все хорошо, если же язык меняется на русский даже когда был выбран другой, то это уже проблемы с Cookie у браузера.

  17. Swat | 12.03.2012 в 12:58:21 | #17

    Большое, Вам, спасибо! Все работает!! Ошибок НЕТ!

  18. Swat | 12.03.2012 в 13:00:32 | #18

    А ещё подскажите, как перевести материал который лежит в БД (статьи, которые я добавляю на сайт)?

  19. Sergey | 12.03.2012 в 13:45:45 | #19

    Весьма благодарен автору за статью! Буду признателен если ответите на вопрос который как я понимаю похож на Swat. Т.е. если в базе прописана категория товаров магазина, то как быть с ее переводом. Слышал что надо как-то прописывать в базе дополнительное поле на нужном языке. Но как это все делается подскажите пожалуйста.

  20. Mowshon | 12.03.2012 в 17:34:17 | #20

    Swat, Sergey, Чтобы создать динамические многоязычные статьи, очевиднее всего это создать в базе сайта таблицу статей с полями `text_ru`, `text_ua`...

    Эти поля будут содержать текст в разных языках. Минус такого метода в том, что при добавлении нового языка, придется делать изменения в базе во всех статьях(переписать).

    С точки зрения SEO, такой метод неправильный, не понятно к какому типу стран нужно вывести ваш сайт. Не весь материал будет адекватно воспринят.

    Можно для каждого языка в отдельности делать свой под домен, ru.site.com

    Каждый сайт со своей базой с конкретным языком. Тогда домен с префиксом "ru" будет пользоваться успехом в Яндекс и в русском Google, домен с префиксом "en, eu, de" будет востребован в англоязычных и в европейских регионов поисковиков Google, Yahoo.

    Многоязычный сайт, подходит для статического проекта, которые предоставляют какие либо услуги для широкого круга людей, для информационных порталов нужно четко выбрать язык в котором развивается проект иначе будет весьма проблематично поддерживать данный портал(проект).

  21. Sergey | 12.03.2012 в 23:16:49 | #21

    Большое человеческое Спасибо! В общем направление понял! У меня речь идет лишь о категориях товара которые находятся в базе, а остальная информация реализуется в описанном вами варианте на разных языковых файлах. И все же было бы очень даже не плохо, если бы вы в качестве примера показали допустим как строятся запросы к базе с разными языковыми полями. Т.е. вот в том примере который у вас описан выше допустим там помимо файлов какая-то часть информации находится в базе...(в полях `text_ru`, `text_ua`) чтобы не изобретать подскажите пожалуйста как измениться код.

  22. Mowshon | 13.03.2012 в 00:06:31 | #22

    Запросы могут выглядеть так:

    $Goods = mysql_fetch_array(mysql_query("SELECT `text_{$CurentLang}` AS `text` FROM `goods` WHERE `id`='111'", $Connect));
    echo $Goods['text'];

    $CurentLang - текущий язык (ru, ro, ua)

  23. Swat | 02.04.2012 в 18:19:41 | #23

    Подскажите что в запросе не так, у меня перевод сайта построен по вашему методу описаному выше:

    $result = mysql_query("SELECT  `title_{$CurentLang}`,`text_{$CurentLang}` FROM new AS `title`,`text` WHERE `id`='$id'", $db);
    $myrow = mysql_fetch_array($result);

    echo $myrow['title']; - но ничего не выводится

    в БД у меня есть поля title_ua,text_ua,title_ru,text_ru,title_en,text_en,

  24. Mowshon | 02.04.2012 в 18:31:19 | #24

    Swat, постараюсь подробно объяснить. В запросе Вы делаете вывод данных из таблицы по полям `title_{$CurentLang}`,`text_{$CurentLang}` к примеру, это может быть title_ua, text_ua. На выход из массива, Вы просите от него вывести $myrow['title'] хотя в запросе такое поле нет, там только $myrow['title_ua'] и $myrow['text_ua'].

    В моем примере запрос был:

    SELECT `text_{$CurentLang}` AS `text`

    Есть 2 способа получить данные из базу:

    $result = mysql_query("SELECT  `title_{$CurentLang}`,`text_{$CurentLang}` FROM new WHERE `id`='$id'", $db);
    $myrow = mysql_fetch_array($result);
    echo $myrow['title_'.$CurentLang];

    2-й способ:

    $result = mysql_query("SELECT  `title_{$CurentLang}` AS `title`,`text_{$CurentLang}` AS `text` FROM `new` WHERE `id`='$id'", $db);
    $myrow = mysql_fetch_array($result);
    echo $myrow['title'];
  25. Swat | 02.04.2012 в 18:51:33 | #25

    сделал 2-мя способами выдает ошибку в 48 строке где прописан код

  26. Mowshon | 02.04.2012 в 19:18:56 | #26

    Покажите сообщение о ошибке и какой код на строке 48.

  27. Swat | 03.04.2012 в 10:20:04 | #27

    Вот ошибка если вставляю первый способ :

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in z:\home\localhost\www\minisite\admin\news.php on line 48

    строка 48:

    $myrow = mysql_fetch_array($result);

    Если вставляю второй способ ошибку не показывает, но не отображает данные

  28. Mowshon | 04.04.2012 в 00:24:16 | #28

    Первый запрос немного откорректировал

    <?php$result = mysql_query("SELECT  `title_{$CurentLang}`,`text_{$CurentLang}` FROM `new` WHERE `id`='$id'", $db);
    $myrow = mysql_fetch_array($result);
    echo $myrow['title_'.$CurentLang];

    Проверьте, чтобы у вас было подключение с БД, и чтобы существовала таблица `new` с полями title_(ua или ru, en) и т.д.

    Если не отображает возможно их нет. Если хотите увидеть какие данные находится в массиве воспользуйтесь print_r();

    print_r($myrow);
  29. Alexander | 14.04.2012 в 23:22:37 | #29

    Когда то еще давно делал что-то похожее, но данные хранил в бд...после в нужном случае извлекал из категорий префиксы, допустим

    $abc[prefix(из бд)] = text(из бд тож)...очень классно получалось, а главное быстро и переводить возможность была "онлайн" через интерфейс...после пришлось дорабатывать, допустим, нужно было значение в тексте вставить, написал парсер и использовал при выборке сразу заменял...

    Привет, {name}! примерно так то...

    Вобщем больше экспериментируйте, не бойтесь ошибок, ведь это опыт, а для программиста это самое важное!

  30. Mowshon | 15.04.2012 в 14:59:39 | #30

    Alexander, языковые данные сайта есть возможность хранить в базе и в файлах, я для себя выбрал хранить их в отдельных файлах. При сбое или поломки таблицы с языковыми данными пользователи не смогут нормально работать с сайтом без внятных названиях ссылок или отсутствия сообщении об ошибке.

    Где хранить данные языка сайта решает каждый по своему, в силу своей логики и принципам.

  31. Maxim | 13.05.2012 в 20:42:40 | #31

    Спасибо большое автору. но есть вопрос, у меня есть 2 файла php из одного в другой подгружается часть кода. Я вставил в оба файла код и на локальном сервере (Denwer) все отлично работает, а вот если все загрузить на сервер хостера, то в подгружаемых данных изменение не происходят (подгружается язык по умолчанию) помогите понять в чем дело.

Оставьте комментарий!

Гость
Комментатор / хотите им стать

Чтобы стать комментатором введите email и пароль. Напишите комментарий. В дальшейшем ваша связка email-пароль, позволит вам комментировать и редактировать свои данные. Не забудьте про активацию (инструкция придет на ящик, указанный при регистрации).

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)