Как сделать мультиязычный сайт
Наверняка, Вы видели сайты, которые сделаны на нескольких языках. Это очень хорошо, поскольку количество трафика может резко возрасти, а это резко возрастающий доход. Поэтому серьёзно задумайтесь о мультиязычности, а вот, как сделать мультиязычный сайт, я постараюсь сейчас объяснить.
Вообще, существует множество способов сделать сайт на нескольких языках, однако, я приведу, на мой взгляд, самый простой и универсальный способ. Первым делом необходимо создать ini-файлы с языковыми константами. Например, такой:
HELLO=Привет
Пусть этот файл называется "ru.ini". Теперь создадим файл для английского языка:
HELLO=Hello
Этот файл мы назовём "en.ini". Теперь нам нужно как-то определять, какой язык хочет пользователь. Для этого есть GET-параметры, в котором мы передаём код языка (допустим, "ru" или "en"). Далее мы в зависимости от значения GET-параметра, берём нужный файл и выводим языковую константу, а значение подставится автоматически. Чтобы стало понятно, привожу код:
<?php
$lang = isset($_GET["lang"])? $_GET["lang"]: "ru"; //Берём значение GET-параметра, либо, если его нет, то устанавливаем русский
$array = parse_ini_file($lang.".ini"); //Открываем соответствующий языковой файл
echo $array["HELLO"]; //Выводим значение языковой константы
?>
Как Вы уже догадались, будет выведено "Привет", если передано значение "ru", либо "Hello", если передано значение "en". Разумеется, вместо GET-параметров Вы можете использовать, например, сессию. Всё очень просто, а уже эту готовую базу, можно использовать и успешно применять в огромных проектах.
-
- Михаил Русаков
Комментарии (51):
мне кажется сессии удобнее использовать
Ответить
Я тоже так думаю, но почему-то GET-параметры чаще используются для мультиязычности.
Ответить
Так таким способом когда переходишь на другую страницу, становится снова стандарт. Как сделать чтобы все сохранялось пока не изменить язык?
Ответить
а как быть с мета тегами в слуае если урл один и тот же, ведь поисковики считают страницу ../ru и .../en разными а если с куки то они просто не просканируют старницы с другими языками, или я чего о не знаю?
Ответить
Можно ли в базе хранить английские тексты, и вытягивать их когда надо?
Ответить
Алексей! Вы должны боротся за каждый килобайт информации! Так будут экономичнее расходоватся ресурсы вашей системы.
Ответить
Да, можете. Ведь бывают не только пункты в меню переведённые (для них база совсем не нужна), а вот если у Вас и много статей на разных языках, то, конечно, храните их в базе данных.
Ответить
А что будет быстрее, isset или array_key_exists? Я обычно работаю со вторым, у меня получается вот так: $var = array_key_exists("var",$get)?$_GET["var"]:NULL;
Ответить
Не знаю, какая быстрее, но я привык к isset(), как к более универсальной.
Ответить
а как создать меню для пользеватиля чтоб он мог выберать из списка язык для сайта ?
Ответить
Создайте обычное меню на HTML, где просто вставьте ссылки с соответствующими GET-запросами.
Ответить
?lang=en спасибо
Ответить
а как переводить (заменять) большие тексты? нопримкр который хрониться в базе даных и 4ерез GET-параметры вывести
Ответить
В этой базе должна быть аналогичная таблица с такими же текстами, но на другом языке. И при анализе языка, нужно делать выборку из соответствующей таблицы.
Ответить
как сделать чтобы .ini вытаскивались к примеру из папки lang
Ответить
Всё точно так же, просто пиписываете ещё и адрес. "нужный_адрес".$lang.".ini"
Ответить
ставил только выдает ошибку вот пример че не так делаю $array = parse_ini_file("leang"$lang.".ini"); где-leang имя папки где лежат файлы папка в корне вот ошибка Parse error: syntax error, unexpected T_VARIABLE in Z:\home\invest\www\index.php on line 3
Ответить
Точку Вы не поставили между строкой и переменной $lang
Ответить
сделал вот так заработало("leang/".$lang.".ini");
Ответить
можно ли сделать чтобы автоматом определяло если СНГ трафика то руский остальные английский
Ответить
Можно по IP адресу определять страну и сразу выставлять нужные настройки. http://myrusakov.ru/php-ip-user.html
Ответить
Не подскажите почему код неработает если языковые файлы ini сохранены в формате UTF-8?То есть вообще например ничего не выводит? Если сохранять в Ansi то работает... Ведь это немаловажно для мультиязычности.
Ответить
Ваш сайт должен быть в одной кодировке. Нельзя делать так, чтобы в одном месте был UTF-8, а где-нибудь в другом месте ANSI.
Ответить
Так и есть сайт в UTF-8! На сайте прописано <meta http-equiv="Content-Type" content="text/html; charset=utf-8">. Но это все равно не работает то есть вообще ничего не выводит! Если ini сохранить в Ansi а сайт оставить в кодировке UTF-8 то тогда выводит кракозябры. Если сайт в ANSI и ini файл Ansi тогда нормально. Если сайт в UTF-8 и файл ini в UTF-8 тогда вообще ничего не выводит. Тестировал на разных машинах в разных браузерах в разных веб-серверах везде делает, как описано выше. Как быть?
Ответить
http://myrusakov.ru/php-encoding-problems.html
Ответить
Все ясно! В приведенной Вами ссылке была вторая причина. ini файл нужно сохранить как "Преобразовать в UTF-8 без BOM". Спасибо!
Ответить
Я сейчас делаю социалку, и пока что 3 языка, но я храню все в отдельном файле в переменных или масивах. Подскажите может лучше переделать на .ini???
Ответить
Лучше переделать на ini.
Ответить
это будет безопасней???
Ответить
Причём тут безопасность? Это будет логичнее с точки зрения грамотного кода.
Ответить
спасибо, буду переделывать.
Ответить
Михаил, тема понравилась. Но есть еще важный вопрос. Вить большинство сайтов (форумы,блоги) используют мультиязычность. Очень важным элементом является то что выбранный язык всегда хранится в адресе страницы и так на какую либо страницу. Пример: http://mysite.com/ru/ или http://mysite.com/?lang=ru или http://mysite.com/index.php?lang=ru Мне не обязательно знать как делать ЧПУ (потом разберусь). А вот как постоянно хранить переменную в ссылке, вот это меня ооочень волнует!
Ответить
Можно записывать в cookie язык и не менять его до тех пор, пока пользователь не выберет другой язык. Тогда в каждой ссылке держать язык необязательно.
Ответить
До этого как ни странно, я уже давно догодался. А вот если я хочу показать тему человеку, и отправляю ему ссылу (допустим на русскоязычный форум). Но в ссылке не указан выбранный язык, т.е. русский. И человек по стандарту попадает на английский форум. Например: http://mysite.ru/index.php?lang=ru&post=1 http://mysite.ru/index.php?post=1 В данном примере разные страницы. Т.е допустим что у этого сайта стандартный АНГЛийский язык. Человек нажимая по первой ссылке перейдет туда, куда этого хочет тот который дал ему эту ссылку. А нажатие по второй ссылке приведет его на какую то английскую тему. И будет что то: - А чо там все на англ? - Та не, у меня всё на русском. - Та не ври. Ну в общем я думаю вы поняли меня что мне надо методом GET передавать выбранную языковую часть сайта.
Ответить
Можно по IP определять, какой у человека язык. Или ставить язык по умолчанию, а если в GET что-то указано, то брать его.
Ответить
Одскажите как экранировать к примеру апостроф в eu.ini да еще если в предложение получается предлог on вылетает ошибка экранировать таким способом /' или /on получается но слеш тоже тогда появляется в предложении
Ответить
Все решение нашол "'" и "on"
Ответить
Здравствуйте, Михаил Русаков, посвятите пожалуйста видео урок как создаются многоязычные сайты, так как информация на ваше сайте не совсем понятна. Не очень понятно куда нужно вставлять эти тексты и куда. С уважением Евгений Голубев.
Ответить
http://myrusakov.ru/php-how-study.html
Ответить
Простое решение мультиязычности - http://sli.su
Ответить
А как насчет СЕО? Будут эти файлы ini просканированны поисковиками как контент?
Ответить
Если сделать ссылки на различные языки, то всё будет проиндексировано.
Ответить
Михаил, вот у Google есть приложение для перевода текста прямо на сайте, например есть статья, она сразу же переводится при просьбе пользователя, это лучше, чем то, что у Вас?
Ответить
Перевод от Google ужасен, как и у любого другого автоматического переводчика.
Ответить
Помогите пожалуйста сделать навигацию на этот код более 12 страниц т.е что-то типа этого (<< [Первая] < [Предыдущая] 1 2 3 4 5 6 7 8 9 10 [Следующая] > [Последняя] >>)сайт kulturanevel.ru <div align="center"> <p><a href="index.html" title="" class="стиль57">1 </a><a href="indexdek.html" title="" class="стиль57">2</a> <a href="indexnoyabr.html" title="" class="стиль57">3</a> <a href="indexokt.html" title="" class="стиль57">4</a> <a href="indexavg.html" title="" class="стиль57">5</a> <a href="indexiul.html" title="" class="стиль57">6</a> <a href="indexiun.html" title="" class="стиль57">7</a> <a href="index0.html" title="" class="стиль57">8</a> <a href="index1.html" title="" class="стиль57">9</a> <a href="index2.html" title="" class="стиль57">10</a> <a href="index3.html" title="" class="стиль57">11</a> <a href="index4.html" title="" class="стиль57">12</a></p> </div> ПОМОГИТЕ ПОЖАЛУЙСТА!
Ответить
Владимир, добрый день, на нашем сайте есть статья по данной тематике: http://myrusakov.ru/php-page-navigation.html
Ответить
Можно ли в этот код вставить (ПЕРВАЯ) (ПРЕДЫДУЩАЯ) (СЛЕДУЮЩАЯ)(ПОСЛЕДНЯЯ) если будет к примеру 20 страниц, сможет ли этот код работать. (<< [Первая] < [Предыдущая] 1 2 3 4 5 6 7 8 9 10 [Следующая] > [Последняя] Сейчас там просто ссылки на странички.
Ответить
Владимир, нет конечно
Ответить
А есть что-то подобное для организации мультиязычности в JAVA скриптах? Например если скрипт выводит информацию или что-то запрашивает у пользователя, то это также должно быть на языке страницы. Можно конечно массив констант выводить в скрытом поле страницы, а скрипт будет вытаскивать нужные значения, но это грабли... Может есть более изящное решение
Ответить
Сделал всё как надо и добавил ссылку вида ?lang=en. При обновлении страницы всё нормально, но при переходе на другую устанавливается русский. Как избавиться от этого? Я даже буду согласен на постоянное отражение переменных в адресе типа mysite.ru/index.php?lang=en Так же проблема в том, что если не устанавливать значение GET параметра или перейти на url вида ?lang=god и любой другой не существующий, то весь текст на сайте пропадает совсем. Как установить язык по-умолчанию чтобы этого небыло? Помогите пожалуйста Может использовать куки?
Ответить
FlixTheBro потому, что условие неправильное(он буде искать любое значение файла которое вводишь, а так как нету god.ini отсюда и пустой текст), надо ещё дописать && $_GET['lang']==en и в сессию занести значение и усе.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.