URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 6457
[ Назад ]

Исходное сообщение
"Как сделать мультиязычный сайт без PHP"

Отправлено blacks , 29-Июл-09 21:50 
Всем привет.
Планирую сделать второй язык для сайта (сейчас только русский)
Хочется немного автоматизма добавить – чтоб при заходе на сайт
человеку сразу выдавалась нужная языковая страница.

Как делается данный метод не знаю. - в программирование слаб.
Пригодится любая помощь, совет, мануал.


Основные предположения и условия:

1.    Сайт не динамический – простой html и местами shtml
2.    Смена языка есть ридерект на несколько вариантов:

site.ru/en/
site.ru/en.html
en.site.ru

3.    Предполагаю что определить язык посетителя можно

с домена  с которого он пришел
с браузера – вроде там есть такие «отметины»
с куки – если посетитель уже выбрал нужный язык
с geo-ip


Дополнительные условия:

Пользование PHP возможно в зачатках – только для мультиязычности.
Предполагается что все должно быть на статике.
Возможно в будущем появится блог но вряд ли будут английские посты.
Хостинг виртуальный; доступа к настройкам апача нет.

Вот вроде и все… ничего не забыл…
Всем откликнувшимся заранее большое спасибо!


Содержание

Сообщения в этом обсуждении
"Как сделать мультиязычный сайт без PHP"
Отправлено angra , 29-Июл-09 22:20 
>с домена  с которого он пришел

Странный способ, но при желании можно проверять referrer при помощи mod_rewrite

>с браузера – вроде там есть такие «отметины»

это называется negotiation, работает если пользователь действительно указал нужный язык в настройках. Апач сам умеет с этим разбираться, смотрите http://httpd.apache.org/docs/2.2/mod/mod_negotiation.html

>с куки – если посетитель уже выбрал нужный язык

а вешать и проверять куку кто будет? В принципе javascript с этим справится и под ваше определение статики попадает.

>с geo-ip

Тут надо искать соответствующий mod к апачу, но установить его у вас все-равно не получится, так как нет доступа.

>Хостинг виртуальный; доступа к настройкам апача нет.

А .htaccess хоть разрешен?


"Как сделать мультиязычный сайт без PHP"
Отправлено blacks , 30-Июл-09 04:28 
разрешен...

"Как сделать мультиязычный сайт без PHP"
Отправлено Pahanivo , 30-Июл-09 07:06 
>разрешен...

что за дурные манеры пытаться делать все через жопу ....
ну если у тебя чисто статик дак сделай первую страницу страницей выбора языка и не парь людям мозг - иначе достоверно язык определить 100% не получится - браузер просто может отдавать язык установленный у него по умолчанию


"Как сделать мультиязычный сайт без PHP"
Отправлено angra , 30-Июл-09 17:53 
Одно другому не мешает. Почему бы не попытаться отдать сразу правильный язык за счет mod_negotiation, а уж если не угадали, то пусть юзер сам по кнопке выбора языка кликает.

"Как сделать мультиязычный сайт без PHP"
Отправлено blacks , 31-Июл-09 03:46 
>Одно другому не мешает. Почему бы не попытаться отдать сразу правильный язык
>за счет mod_negotiation, а уж если не угадали, то пусть юзер
>сам по кнопке выбора языка кликает.

Если это возможно... не можете помочь примерами...
(если они есть - не хочу вас сильно беспокоить...)


"Как сделать мультиязычный сайт без PHP"
Отправлено Аноним , 30-Июл-09 11:21 
При ваших раскладах imho наиболее адекватно будет просто сделать выбор языка и ставить куку, ну и проверять ее ессно, если стоит то выбирать автоматически. Дешево и сердито, надежно, вполне нормально.

"Как сделать мультиязычный сайт без PHP"
Отправлено blacks , 31-Июл-09 03:48 
>При ваших раскладах imho наиболее адекватно будет просто сделать выбор языка и
>ставить куку, ну и проверять ее ессно, если стоит то выбирать
>автоматически. Дешево и сердито, надежно, вполне нормально.

Если это возможно... не можете помочь примерами...
(если они есть - не хочу вас сильно беспокоить...)


"Как сделать мультиязычный сайт без PHP"
Отправлено Аноним , 31-Июл-09 12:53 
Автоматическое (по куке) переключение лучше наверное было бы сделать чемнить типа mod_rewrite, но учитывая что с программированием, модулями и т.п. проблемы, привожу простейший вариант, все реализуется в одном месте, в JS подключаемом в начале каждой странички.

<html>
<!-- подразумевается что версии страниц для разных языков лежат в разных корневых папках,
  а файлы внутри них называются одинаково. Допустим папка для русских файлов - htdocs/mysite/ru/
  для английских - htdocs/mysite/en/ Внутри каждой из них есть index.htm, некая page1.htm и т.п. -->

<!-- далее скрипт содержащий функции работы с куками, они нам понадобятся -->
<script>
// cookieExpireTime - время жизни в часах (0 - до закрытия браузера)
function setCookie(cookieName, cookieContent, cookieExpireTime)
{
  if (cookieExpireTime > 0)
  {
    var expDate = new Date();
    expDate.setTime(expDate.getTime() + cookieExpireTime * 1000 * 60 * 60);
    var expires = expDate.toGMTString();
    document.cookie = cookieName + '=' + escape(cookieContent) + '; path=' + escape('/') + '; expires=' + expires;
  }
  else { document.cookie = cookieName + '=' + escape(cookieContent) + '; path=' + escape('/') + ''; }
}

function getCookie(cookieName)
{
  var ourCookie = document.cookie;
  if (!ourCookie || ourCookie == '') return '';
  ourCookie = ourCookie.split(';');
  var i = 0;
  var Cookie;
  while (i < ourCookie.length)
  {
    Cookie = ourCookie[i].split('=')[0];
    if (Cookie.charAt(0) == ' ') Cookie = Cookie.substring(1);
    if (Cookie == cookieName)
    {
      var res = ourCookie[i].split('=')[1];
      if (typeof res != 'undefined') return unescape(res); else return '';
    }
    i++;
  }
  return '';
}
</script>

<!-- далее скрипт осуществляющий автоматическое переключение языка по куке -->
<script>
  // читаем куку, если она не установлена получим пустую строку,
  // если установлена - получим установленный язык
  var cookiedLang = getCookie('mysiteLang');
  
  // если кука установлена то смотрим надо ли перейти к определенному языку,
  // или мы и так на нем
  if (cookiedLang)
  {
    // определяем текущий язык (находим в текущем URL mysite/какойтоязык/)
    var curLang = String(window.location).match(/mysite\/(\w+)\//i)[1];

    if (curLang != cookiedLang)
    {
      // надо перейти к языку определенному кукой, переходим
      // находим в текущем URL mysite/какойтоязык/ и заменяем его на mysite/cookiedLang/
      // после изменения браузер сам автоматически переходит на новый URL
      window.location = String(window.location).replace(/mysite\/\w+\//i, 'mysite/' + cookiedLang + '/');
    }
}
</script>

<!-- далее скрипт осуществляющий ручное переключение языка, в диве код визуализации переключателя -->
<script>
function doChange(lang)
{
  // устанавливаем куку
  setCookie('mysiteLang', lang, 24);  

  // находим в текущем URL mysite/какойтоязык/ и заменяем его на mysite/lang/
  // после изменения браузер сам автоматически переходит на новый URL
  window.location = String(window.location).replace(/mysite\/\w+\//i, 'mysite/' + lang + '/');
}
</script>

<div>
<a href="javascript:doChange('en');">EN</a>|<a href="javascript:doChange('ru');">RU</a>
</div>

<!-- вышепредставленные скрипты и див надо добавлять к каждой странице,
  проще всего наверное с помощью SSI (не пользую - не знаю), далее содержимое страницы -->
<h1>RU index.htm</h1>
Контент
</html>


"Как сделать мультиязычный сайт без PHP"
Отправлено blacks , 01-Авг-09 06:12 
>Автоматическое (по куке) переключение лучше наверное было бы сделать чемнить типа mod_rewrite,
>но учитывая что с программированием, модулями и т.п.

Огромное спасибо за пример!
Полазил по нему покапался по изучал что мог (яваскрипт как программирование не мое...)

Создал на денвере "сайт" mysite
В нем папочки ru и en
В каждую папочку по index.htm с вашим примером.

Если зайти по адресу mysite/en/ и начать переключать язык то все работает
Если пробовать переключать язык в главном индексе mysite/index.htm то нет
- редиректа нет

Пробовал сделать <a href="javascript:doChange('');">RU</a> - чтоб пере направление
в было на главную страницу - основной язык... перенаправляет но вот "оттуда" вернутся
на mysite/en/ не получается

В теории можно модреврайтом переправлять mysite/en/ на mysite/ ...
Но пока у меня сомнения в возможности и своих силах.

Появилось три вопроса:

1. Как сделать чтоб хотябы одни(лучше два) языка могли переключатся из корня сайта?
(может подправить код и придумать что-то с перфиксами вроде index-ru.html ?)

2. Можно ли в конструкции mysite/en/ mysite/ru/ модреврайтом перенаправлять
на en.mysite/  ru.mysite/ ?

3. Будет ли работать javascript:doChange('en'); если ее поставить в событие onClick
а в href="" прописать переход по ссылке?


P.S. как по вашем поисковики отнесутся к такому редиректу?

Спасибо.


"Как сделать мультиязычный сайт без PHP"
Отправлено Thirteensmay , 01-Авг-09 14:55 
Скрипт не рассчитан на контент лежащий вне папок en/ru, подразумевается что все лежит в них, случай с mysite/index.htm с этой точки зрения ошибочен. Основной момент заключается в необходимости определения текущего языка, в скрипте он определяется по имени папки, конечно можно модифицировать скрипт так чтобы отсутствие "языковой" папки трактовалось как какойто язык по умолчанию, соответственно в корне тогда должна лежать версия контента для этого языка, префиксы тогда ненужны, но код править в любом случае. Если не можете, предлагаю альтернативные варианты решения проблемы корневой директории: Во первых можно рассмотреть использование mod_rewrite, т.е. например по запросу mysite/index.htm перенаправлять на mysite/en/index.htm, но с mod_rewrite не работаю, конкретно говорить по этому поводу не могу, imho во первых лишняя заморочка, во вторых лишняя зависимость от mod_rewrite. Также можно предложить просто сделать в mysite/index.htm страничку с выбором языка, и ссылки с нее на /lang/index.htm'ы, дешево и сердито ;) Еще как вариант вообще без mysite/index.htm, но в качестве странички по умолчанию (DirectoryIndex) для mysite указать mysite/en/index.htm, вроде такое можно было делать, тогда при запросе mysite по умолчанию будет открываться /en/index.htm. Короче вариантов в общем то достаточно, выбирайте себе по вкусу ;) Если doChange() поставить в onClick то работать будет, но возможно не так как вы ожидаете, т.к. получится одновременный переход и по href и по window.location, поэкспериментируйте кто быстрее (если напрягает семантика или поисковики то можно переделать, тут есть варианты). По поводу поисковиков ничего конкретного сказать не могу, в моей практике такой вопрос обычно не стоит, а с теоретической точки зрения, ну вопервых зависит от поисковика, во вторых контент по ссылке типа javascript лично я бы парсить не пытался, в третьих авторедирект по куке выполняется только по куке, не думаю что тут могут быть проблемы, но вообще не в курсе.

"Как сделать мультиязычный сайт без PHP"
Отправлено blacks , 03-Авг-09 05:42 
>Во первых можно рассмотреть использование mod_rewrite,

Для меня оч хорошо

>Также можно предложить просто сделать в mysite/index.htm страничку с выбором языка, и ссылки с нее на /lang/index.htm'ы, дешево и сердито ;)

Сплеш странички не оч люблю

>по умолчанию (DirectoryIndex) для mysite указать mysite/en/index.htm,

Отлично

Большое спасибо!  


"Как сделать мультиязычный сайт без PHP"
Отправлено blacks , 03-Авг-09 05:51 
Сегодня нашел небольшой пример приенения мод реврайта для переключения языка.
Еще не проверял так как пока пытаюсь понять перевод и правильность работы.


Следом за примером пришла идейка для мультиязычного сайта:

1. человек заходит на сплеш страничку и выбирает на ней язык
2. как только он перешел в подкаталог /en/ или /ru/ открывается index.html
3. в index.html через <META HTTP-EQUIV="Set-Cookie" CONTENT="NAME=lang; EXPIRES=0; ... устнавливается lang=ru или lang=en

4. Затем в корень сайта вешается .htaccess из найденного примера который читает куки
и уже не открывает сайт с корня /  а открывает из /en/ или /ru/


Идея вроде мне нра... но вот смогу ли я ее воплотить...
Честно говоря даже не знаю точно - может ли htaccess читать куки - сижу изучаю.

Подскажите что не так, как решить задачку?


Привожу код htaccess:

RewriteEngine On
RewriteBase /
#
# Externally redirect to add missing trailing slash to non-file URLs
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) http://example.com/$1/ [R=301,L]
#
# Externally redirect to language subsite if cookie set
RewriteCond %{HTTP_COOKIE} ^lang=(en¦ru)$
RewriteRule ^$ http://example.com/%1/ [R=302,L]
#
# Externally redirect to remove leading www from all requests (if not already done by rules above)
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule (.*) http://example.com/$1 [R=301,L]
#
# Internally rewrite to relevant index page in the root
RewriteRule ^(en¦ru)/ index.$1.html [NC,L]


"Как сделать мультиязычный сайт без PHP"
Отправлено Alexander Driantsov , 03-Авг-09 09:38 
>...

Есть столько всего что должно было упростить жизнь, но вы до сих пор верите только в html и htaccess...

* Установить куку:

RewriteEngine On
RewriteBase /
RewriteRule ^(.*)(de|es|fr|it|ja|ru|en)/$ - [co=lang:$2:.domain.com:7200:/]


* прочитать значение куки
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_COOKIE} lang=([^;]+) [NC]
RewriteRule ^(.*)$ /$1?cookie-value=%1 [R,QSA,L]

* Редирект основаный на значении куки

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_COOKIE} lang=([^;]+) [NC]
RewriteRule ^(.*)$ /$1?lang=%1 [NC,L,QSA]

* Редирект если куки не существует

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_COOKIE}!^.*cookie-name.*$ [NC]
RewriteRule .* /index.html [NC,L]


"Как сделать мультиязычный сайт без PHP"
Отправлено blacks , 03-Авг-09 16:44 
>Есть столько всего что должно было упростить жизнь, но вы до сих
>пор верите только в html и htaccess...

:(
Пытаюсь уже год как взяться и поучить PHP но все нет времени :(
А недавно нарвался на кучку вирусов так PHP теперь боюсь - напишу чего... но с дырами.. и хана :/

(Вы наверно же про php говорили?)


P.S. Ваш пример сегодня постараюсь посмотреть - если успею


"Как сделать мультиязычный сайт без PHP"
Отправлено blacks , 03-Авг-09 18:20 
Поизучал приер и не смог понять параметра/директивы:

1. 7200 - это порт(тогда зачем) или установка времени действия куки(2часа вроде) ?
2. работа/редирект идет на ru.domain.com/ или domain.com/ru/ ?
3. зачем необхдимо повторение RewriteEngine On и RewriteBase / перед каждым блоком?

Как я понял запись в куки произходит в зависимосте от той директории
в которой находится пользователь и дальше при запросе "корневого домена" идет редирект...


"Как сделать мультиязычный сайт без PHP"
Отправлено blacks , 08-Авг-09 18:21 
>Есть столько всего что должно было упростить жизнь, но вы до сих
>пор верите только в html и htaccess...

Здравствуйте.

Собрал нижеследующий htaccess.

Создал сайт.
На сайте два каталога ru и en.
В каждый каталог + корень закинул данный htaccess и index.html
Пробовал пробовал.. ничего не происходит кроме как 500 ошибки
из-за строки RewriteRule ^(.*)(ru|en)/$ - [co=lang:$2:.site.spb.ru:7200:/]

Подскажите пожалуйста что я не так делаю?


RewriteEngine On
RewriteBase /

# Установить куку:
# This code sends the Set-Cookie header to create a cookie on the client with the value of a matching item in 2nd parantheses.
# lifetime это время жизни cookie в минутах,
RewriteRule ^(.*)(ru|en)/$ - [co=lang:$2:.site.spb.ru:7200:/]

# прочитать значение куки
RewriteCond %{HTTP_COOKIE} lang=([^;]+) [NC]
RewriteRule ^(.*)$ /$1?cookie-value=%1 [R,QSA,L]

# Редирект основаный на значении куки
RewriteCond %{HTTP_COOKIE} lang=([^;]+) [NC]
RewriteRule ^(.*)$ /$1?lang=%1 [NC,L,QSA]

# Редирект если куки не существует
RewriteCond %{HTTP_COOKIE}!^.*cookie-name.*$ [NC]
RewriteRule .* /index.html [NC,L]
    # RewriteRule .* /login-error/set-cookie-first.cgi [NC,L]


"Как сделать мультиязычный сайт без PHP"
Отправлено DJX , 19-Ноя-11 18:12 
RewriteCond %{HTTP_COOKIE}  CookieXXL_ [NC]

У меня только так работает, с параметрами что-то перемудрили.