Sign in to follow this  
valdemark

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

Recommended Posts

Сразу напишу, я чайник, и можно сказать "непонимэ" посему будьте любезны - поподробнее  :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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

: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

Share this post


Link to post
Share on other sites

Это... а зачем куки? Вот кусочек кода который я юзаю у себя на сайте (у меня 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/');}

Share this post


Link to post
Share on other sites

 

Это... а зачем куки? Вот кусочек кода который я юзаю у себя на сайте (у меня 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 можно вставить всякое, но раз так, продублирую, на случай отключенных кукисов...

Share this post


Link to post
Share on other sites
В GET можно вставить всякое

а куку типа подделать не реально? :)

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

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

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

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

Edited by Николя223

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By SuperSaimon
      Добрый день! Я начал изучать этот бандл. И столкнулся с непониманием логики заполнения статических страниц на сайте (информация на которых не меняется: "о нас", "контакты" и т.д.). Возникло сразу несколько вопросов: 1. Нужно ли создавать сущности для записи в бд данных с  этих страниц? Если с другим контентом на сайте я понимаю  что надо писать в бд(товары, категории и т.д.) , то тут я в замешательстве. 2. Если на странице имеется описание чего - либо со списком, то как это записать в бд и потом отобразить в твиге? Зарание спасибо и извиняюсь за глупый вопросы, если что. 
    • By Super_Saimon
      Добрый день! Есть задание - игра в города. Нужно из бд взять перечень городов и в момент ответа компьютера или игрока сравнивать города из списка, взятого из базы. Все, вроде, понятно, но столкнулся с проблемой, что некорректно удаляются города из массива, в котором хранится список городов из базы. Я использую этот массив чтобы знать когда игра закончилась и не повторялись города в ответах. Собственно, сам код без файла с подключением в бд. Там проблем я не обнаружил, массив городов функция возвращает корректный. Но удаление уже выбранных городов - проблема, которую никак не могу решить, вернее, понять в чем суть самой проблемы. Извиняюсь что выкладываю код в таком виде, не нашел аналога jsfiddle для php

       
      session_start();
      if(!empty($_GET['restart'])) {
          unset($_SESSION['cities']);
          unset($_SESSION['answer']);
          unset($_SESSION['incorrect_city']);
          unset($_SESSION['game_over']);
          header('Location: ./form.php');
          exit;
      }
      define('HOST', 'localhost');
      define('USER', 'root');
      define('PASSWORD', '');
      define('DATABASE', 'gamecity');
      $connect = mysqli_connect(HOST, USER, PASSWORD, DATABASE);
      function getCityFromDB($dbconfig) {
          $listOfCities = "SELECT * FROM city ORDER BY city_id ASC";
          $query = mysqli_query($dbconfig, $listOfCities);
          while($res[] = mysqli_fetch_assoc($query)) {
              $cities = $res;
          }
          foreach($cities as $key => $val) {
              foreach($val as $key2 => $val2) {
                  if($key2 == 'city_name') {
                      $city[] = $val2;
                  }
              }
          }
          return $city;
      }
      if (empty($_SESSION['cities'])) {
          $_SESSION['cities'] = getCityFromDB($connect);
      }
      if(!empty($_POST['send'])) {
          if (findCity($_POST['city'], $_SESSION['cities'])) {
              if (empty($_SESSION['answer'])) {
                  $_SESSION['answer'] = firstStep($_POST['city'], $_SESSION['cities']);
                  $temp = deleteCity($_SESSION['answer'], $_SESSION['cities']);
              }else {
                  $answer = answer($_POST['city'], $_SESSION['answer'], $_SESSION['cities']);
                  if($answer) {
                      $_SESSION['answer'] = $answer;
                      $temp = deleteCity($_SESSION['answer'], $_SESSION['cities']);
                  }else {
                      $_SESSION['game_over'] = 2;
                  }
              }
              if(!$temp){
                  $_SESSION['game_over'] = 1;
              }else {
                  $_SESSION['cities'] = $temp;
              }
          }else {
              $_SESSION['incorrect_city'] = 'Некорректный город';
          }
          header('Location: /form.php');
          exit;
      }
      function firstStep($userCity, $arrayOfCities) {
          $temp = '';
          if(!empty($userCity)) {
              foreach ($arrayOfCities as $key => $val) {
                  if(mb_strtoupper(mb_substr($userCity, -1, 1, 'utf-8')) == mb_substr($val, 0, 1, 'utf-8')) {
                      $temp .= $userCity . ',' . $val;
                      return $temp;
                  }
              }
          }
          return false;
      }
      function findCity ($city, $listCities) {
          foreach($listCities as $key => $val) {
              if($val == $city) {
                  return true;
              }
          }
          return false;
      }
      function answer($city, $answer, $arrayOfCities) {
          if(mb_substr($city, 0, 1, 'utf-8' ) == mb_strtoupper(mb_substr($answer, -1, 1, 'utf-8'))) {
              $char = mb_strtoupper(mb_substr($city, -1, 1, 'utf-8'));
              foreach($arrayOfCities as $key => $val) {
                  $temp = mb_strpos($val, $char, 0,'utf-8');
                  if ($temp !== false) {
                      $answer .= ',' . $city . ',' . $val;
                      break;
                  }
              }
              return $answer;
          }
          return false;
      }
      function deleteCity($town, $cities) {
          if (count($cities) > 0) {
              $town = explode(',', $town);
              $cities = array_values($cities);
              for($i = 0; $i < count($town); $i++) {
                  for($j = 0; $j < count($cities); $j++) {
                      if($town[$i] == $cities[$j]) {
                          unset($cities[$j]);
                      }
                  }
              }
              return $cities;
          }
          return false;
      }
    • By kuzia007
      Пример сайта по разработке reactiq точка net 
      Цена на разработку 70 000 рублей. Без дизайна и верстки, от вас нам нужен функционал 
      на фреймворке Lavarel 
      Нужно постараться уложиться в 20 дней по срокам. 
      Работа по Сделке без риска. B и больше ни как. 

      Основные моменты работы сайта: 
      авторизация сайта через стим 
      считывания апи через официальный сайт pubg 
      Трейдов скинов и все остальное не будет! 
      подключить систему оплат 
      создание личного кабинета для пользователя. 
      Есть полное ТЗ проекта, которое мы готовы упрощать на первом этапе.
      Готовы достойно оплачивать ваш труд! 
      Пишите в телеграм @evgensalyah
  • Member Statistics

    46,781
    Total Members
    3,128
    Most Online
    Agentbk
    Newest Member
    Agentbk
    Joined
  • Recently Browsing   0 members

    No registered users viewing this page.