Jump to content
  • 0

Мультиязычность сайта на php


valdemark
 Share

Question

Сразу напишу, я чайник, и можно сказать "непонимэ" посему будьте любезны - поподробнее  :blush:

 

Дано: есть условная страница index.php на которой вывод сообщений нужно сделать на четырех или больше языках.

 

Нажатие кнопки запускает скрипт который записывает куку по которой определяется язык пользователя. 

 

Если кука не задана, язык выводится по умолчанию, если задана, то согласно значению куки. 

 

И как всегда что-то не работает... кука не пишется. А что не так я понять не могу... Уже пол дня верчу и так и этак...

 

 

Я накидал такой код:

<!DOCTYPE html><html> <head>  <meta charset="utf-8">  <title>Мультиязычность</title><script>   function is_en() {   var cookie_name = "lang"; // Имя куки   var lang_id = document.getElementById("button_en").value; //Получаем значение куки по нажатию на кнопку   expires = new Date();   expires.setTime(expires.getTime() + (1000 * 86400 * 365)); // Вычисляем срок хранения cookie   set_cookie(cookie_name, lang_id, expires); // Устанавливаем куку с помощью функции set_cookie   }   function is_ru() {   var cookie_name = "lang";    var lang_id = document.getElementById("button_ru").value;    expires = new Date();    expires.setTime(expires.getTime() + (1000 * 86400 * 365));    set_cookie(cookie_name, lang_id, expires);    }   function is_fr() {   var cookie_name = "lang";    var lang_id = document.getElementById("button_fr").value;    expires = new Date();    expires.setTime(expires.getTime() + (1000 * 86400 * 365));    set_cookie(cookie_name, lang_id, expires);    }   function is_de() {   var cookie_name = "lang";    var lang_id = document.getElementById("button_de").value;    expires = new Date();    expires.setTime(expires.getTime() + (1000 * 86400 * 365));    set_cookie(cookie_name, lang_id, expires);    </script>  <style>   </style> </head> <body>  <?php/*Проверяем есть ли кука*/  if (isset($_COOKIE['lang'])){         $langCode = $_COOKIE['lang']; /*если она есть выбираем файл языка по куке*/    }     else {         $langCode = 'ru'; /*если куки нет язык по умолчанию - русский*/    }   include $_SERVER['DOCUMENT_ROOT'].'/language/lang_'.$langCode.'.php'; /*присоединяем файл с языком*/  ?> <p> <?php echo $lang['error'];?> </p> <!-- Тут выводится мультиязычное сообщение --> <p> <?php echo $_COOKIE['lang'];?> </p> <!-- Тут я проверяю что за кука записана в текущий момент -->  <p><input type="button" id = "button_en" value="en" onclick="is_en()"></p> <p><input type="button" id = "button_ru" value="ru" onclick="is_ru()"></p><p><input type="button" id = "button_fr" value="fr" onclick="is_fr()"></p><p><input type="button" id = "button_de" value="de" onclick="is_de()"></p> </body></html>

и четыре языковых файла. следующего содержания

 
lang_ru.php
lang_en.php
lang_fr.php
lang_de.php
 
<?php $lang['error'] = "Ошибка";?>  и <?php $lang['error'] = "Error";?> и т.д.

:ph34r:  :ph34r:  :ph34r:  :blink:  :blink:  :blink:

 

Edited by valdemark
Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

1. Я бы посоветовал все же использовать ключ в адресе строки, для определения языка - это могут быть папки или GET параметры, если хочется использовать куки, попробуйте устанавливать их через PHP, ведь вам все равно придется перезагрузить страницу для того, чтобы язык сменился.

2. Идея с файлами идет в правильном направлении, потом можно будет перенести по такой же схеме и в БД

Link to comment
Share on other sites

  • 0

1. Я бы посоветовал все же использовать ключ в адресе строки, для определения языка - это могут быть папки или GET параметры, если хочется использовать куки, попробуйте устанавливать их через PHP, ведь вам все равно придется перезагрузить страницу для того, чтобы язык сменился.

2. Идея с файлами идет в правильном направлении, потом можно будет перенести по такой же схеме и в БД

 

Всю ночь не спал, голова уже не варит, не могли бы вы накидать тот же вариант с записью в куки с кнопки, но только с передачей через post?

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

Link to comment
Share on other sites

  • 0

Система работает, и меняет язык если его жестко задать, но она не записывает куки по нажатию кнопки. Дефакто нужен скрипт нажал кнопку name=EN  её value=en передалось в скрипт и он создал/перезаписал куку с именем lang со значением en.

 

Мой скрипт подхватит эту куку подставит ее значение в имя файла и загрузит нужный язык - и всё всем ПРОФИТ...

 

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

 

Этим способом можно перевести сайт на 100500 языков... 

Link to comment
Share on other sites

  • 0

:yahoo:  Я нашёл решение! Всё просто и красиво...

<!DOCTYPE html><html> <head>  <meta charset="utf-8">  <title>Мультиязычность</title><script> function SetLang(c_name,value,expiredays)	{		var exdate=new Date()		exdate.setDate(exdate.getDate()+expiredays)		document.cookie=c_name+ "=" +escape(value)+		((expiredays==null) ? "" : ";expires="+exdate.toGMTString())		window.location.reload(1);	}  </script>  <style>   </style> </head> <body>  <?php/*Проверяем есть ли кука*/  if (isset($_COOKIE['lang'])){         $langCode = $_COOKIE['lang']; /*если она есть выбираем файл языка по куке*/    }     else {         $langCode = 'ru'; /*если куки нет язык по умолчанию - русский*/    }   include $_SERVER['DOCUMENT_ROOT'].'/language/lang_'.$langCode.'.php'; /*присоединяем файл с языком*/  ?> <p> <?php echo $lang['error'];?> </p> <br> <a href="#" onClick="SetLang('lang','en','1')">EN</a><br> <a href="#" onClick="SetLang('lang','ru','1')">RU</a> <br> <a href="#" onClick="SetLang('lang','fr','1')">FR</a> <br> <a href="#" onClick="SetLang('lang','de','1')">DE</a> </body></html>
Edited by valdemark
Link to comment
Share on other sites

  • 0

Это... а зачем куки? Вот кусочек кода который я юзаю у себя на сайте (у меня 2 языка, но поправить не проблема):

$CIS = array('RUS','AZE','ARM','BLR','KAZ','KGZ','MDA','TJK','TKM','UZB','UKR');if (in_array($_SERVER['HTTP_X_GEO_COUNTRY'], $CIS)) {	header('Location: ru/');} else {	header('Location: en/');}
Link to comment
Share on other sites

  • 0

 

Это... а зачем куки? Вот кусочек кода который я юзаю у себя на сайте (у меня 2 языка, но поправить не проблема):

$CIS = array('RUS','AZE','ARM','BLR','KAZ','KGZ','MDA','TJK','TKM','UZB','UKR');if (in_array($_SERVER['HTTP_X_GEO_COUNTRY'], $CIS)) {	header('Location: ru/');} else {	header('Location: en/');}

Спасибо за код, но суть в том что вещь которую я делаю не должна автоматом определять язык пользователя. Т.к. она больше для туристов, которые приходят на сайт с разных терминалов, откуда угодно, где языки системы левые. Зашел, нажал на свой язык и профит... 

вам Switch правильно подсказал)))

Из куки перенесите в GET, у вас поисковики не будут индексировать все языки

В GET можно вставить всякое, но раз так, продублирую, на случай отключенных кукисов...

Link to comment
Share on other sites

  • 0

Как я у своей CMS сделал реализацию модуля.

Собственно просто - через админку в модуле  добавляются нужные языки, флажок. 

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

 

По началу тоже на кукках сделал, но быстро допер что не айс.

Если модуль включен - для каждой страницы добавляется префикс   /язык/

собственно, колличество возможных языков мы знаем. (можно через mod_rewrite добавить разбор и перенос в get, но не стал делать, так как модуль может быть выключен или удален, чтобы .httaccess не переписывать)

Просто разбирается первая ячейка, если там находится один из языков - то все ок. неизвестный - ошибка 404

Edited by Николя223
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • By Only091
      Помогите пожалуйста, не получается сделать постраничную навигацию. Делал все по урокам. в Итоге получилось сделать два разных каталога один с фильтрами другой с постраничной навигацией. И теперь я пытаюсь объединить два каталога. Но не получается. Сами файлы урока в архике каталог. Буду очень благодарен если мне помогут! catalog.phpcatalogDB.js
      каталог.7z
    • By stonelabs
      Всем привет!

      Наша компания (https://stone-labs.com/) ищет команды (!) разработчиков для реализации ряда заказных проектов. Местоположение не важно - мы практикуем удаленную работу.
       
      Обязательные требования:
      Laravel или Symfony frameworks jQuery (UI), JavaScript, Ajax, Bootstrap MySQL REST API, опыт внедрения Third-party APIs английский на уровне чтения и понимания технической документации опыт в разработке веб приложений и их архитектуры с нуля корректное использование git & pull request flow работа в дневное время во временной зоне UTC +3  
      Будет плюсом, если у вашей команды есть:
      опыт с GitLab CI/CD, Jenkins опыт с MySQL Cluster, MongoDB, PostgreSQL, Redis опыт с Vue.js опыт Linux администрирования, SSH, Nginx, DevOps  
      Если вам интересно сотрудничество, пожалуйста, пишите на наш ящик wanted@stone-labs.com 
    • By Defroing
      <form method="POST" action= "action_handler.php" id="form"> <section class="table_1"> <table class="iksweb"> <tbody> <tr> <td rowspan="3"><b>История компании «Mc donald's»</b> <h3 class="the">Кто основал компанию «Mc donald's»?</h3> <section class="conteiner"> <div class="checkbox"> <input type="checkbox" class="i-6" id="i6" value="0" name="formDoor[]"> <label for="i6" tabindex="12">Роналд Макдоналд</label> </div> <div class="checkbox"> <input type="checkbox" class="i-6" id="i7" value="0" name="formDoor[]"> <label for="i7" tabindex="13">Рэй Крок</label> </div> <div class="checkbox"> <input type="checkbox" class="i-6" id="checkbox_68" value="1" name="formDoor[]"> <label for="checkbox_68" tabindex="14">Братья Дик и Мак Макдоналд</label> </div> <div class="checkbox"> <input type="checkbox" class="i-6" id="checkbox_170" value="0" name="formDoor[]"> <label for="checkbox_170" tabindex="14">Клинт Иствуд</label> </div> <div class="out-block out-6"></div> </section> </td> </tr> </tbody> </table> <div class="dsw"> <button class="b-6" tabindex="11" id="btn-1" type="submit" name="formSubmit">Отправить</button> </div> </form> <?php mysql_connect("localhost", "root", ""); mysql_select_db('olala') or die(mysql_error()); if(isset($_GET['submit'])){ $arr=$_GET; foreach ($arr as $key => $value) { $reg="/^check/";//отбираю нужные элементы if( preg_match ($reg,$key )) { //$new_mass[]=$arr[$key]; //print_r($new_mass); echo $arr[$key]; $sql_1="INSERT INTO `table_one` (`name`) VALUES('$arr[$key]')"; mysql_query($sql_1) or die(mysql_error()); } } } ?>  Создаю опросник и хочу, чтобы чекбоксы заносились в БД(таблицу пока не создавал). Хотелось узнать на счёт php кода, сможете подсказать, что в нём не так (дать какие нибудь советы). В openserver опросник пока не выкладывал.
    • By seoww
      Доброго времени суток. Я не сильно знающий веб-разработчик, но учусь. Начал создавать интернет магазин. Написал код самого сайта, посмотрел видео как делаются интернет-магазины и теперь не могу разобраться с PhpMyAdmin. Я не понимаю как она взаимодействует с сайтом. В интернете погуглил, так ничего дельного найти и не смог. Помогите пожалуйста.
      P.S сильно в меня камни не кидайте, я только учусь 
      Всем добра!
    • By Gmansurov
      Нужно отправить текст на сайт, не знаю как это сделать и не могу найти форумы по этим темам. Google Cloud Platform. Помогите пожалуйста.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy