Всем привет.
Планирую сделать второй язык для сайта (сейчас только русский)
Хочется немного автоматизма добавить – чтоб при заходе на сайт
человеку сразу выдавалась нужная языковая страница.Как делается данный метод не знаю. - в программирование слаб.
Пригодится любая помощь, совет, мануал.
Основные предположения и условия:1. Сайт не динамический – простой html и местами shtml
2. Смена языка есть ридерект на несколько вариантов:site.ru/en/
site.ru/en.html
en.site.ru3. Предполагаю что определить язык посетителя можно
с домена с которого он пришел
с браузера – вроде там есть такие «отметины»
с куки – если посетитель уже выбрал нужный язык
с geo-ip
Дополнительные условия:Пользование PHP возможно в зачатках – только для мультиязычности.
Предполагается что все должно быть на статике.
Возможно в будущем появится блог но вряд ли будут английские посты.
Хостинг виртуальный; доступа к настройкам апача нет.Вот вроде и все… ничего не забыл…
Всем откликнувшимся заранее большое спасибо!
>с домена с которого он пришелСтранный способ, но при желании можно проверять referrer при помощи mod_rewrite
>с браузера – вроде там есть такие «отметины»
это называется negotiation, работает если пользователь действительно указал нужный язык в настройках. Апач сам умеет с этим разбираться, смотрите http://httpd.apache.org/docs/2.2/mod/mod_negotiation.html
>с куки – если посетитель уже выбрал нужный язык
а вешать и проверять куку кто будет? В принципе javascript с этим справится и под ваше определение статики попадает.
>с geo-ip
Тут надо искать соответствующий mod к апачу, но установить его у вас все-равно не получится, так как нет доступа.
>Хостинг виртуальный; доступа к настройкам апача нет.
А .htaccess хоть разрешен?
разрешен...
>разрешен...что за дурные манеры пытаться делать все через жопу ....
ну если у тебя чисто статик дак сделай первую страницу страницей выбора языка и не парь людям мозг - иначе достоверно язык определить 100% не получится - браузер просто может отдавать язык установленный у него по умолчанию
Одно другому не мешает. Почему бы не попытаться отдать сразу правильный язык за счет mod_negotiation, а уж если не угадали, то пусть юзер сам по кнопке выбора языка кликает.
>Одно другому не мешает. Почему бы не попытаться отдать сразу правильный язык
>за счет mod_negotiation, а уж если не угадали, то пусть юзер
>сам по кнопке выбора языка кликает.Если это возможно... не можете помочь примерами...
(если они есть - не хочу вас сильно беспокоить...)
При ваших раскладах imho наиболее адекватно будет просто сделать выбор языка и ставить куку, ну и проверять ее ессно, если стоит то выбирать автоматически. Дешево и сердито, надежно, вполне нормально.
>При ваших раскладах imho наиболее адекватно будет просто сделать выбор языка и
>ставить куку, ну и проверять ее ессно, если стоит то выбирать
>автоматически. Дешево и сердито, надежно, вполне нормально.Если это возможно... не можете помочь примерами...
(если они есть - не хочу вас сильно беспокоить...)
Автоматическое (по куке) переключение лучше наверное было бы сделать чемнить типа 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>
>Автоматическое (по куке) переключение лучше наверное было бы сделать чемнить типа 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. как по вашем поисковики отнесутся к такому редиректу?Спасибо.
Скрипт не рассчитан на контент лежащий вне папок 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 лично я бы парсить не пытался, в третьих авторедирект по куке выполняется только по куке, не думаю что тут могут быть проблемы, но вообще не в курсе.
>Во первых можно рассмотреть использование mod_rewrite,Для меня оч хорошо
>Также можно предложить просто сделать в mysite/index.htm страничку с выбором языка, и ссылки с нее на /lang/index.htm'ы, дешево и сердито ;)
Сплеш странички не оч люблю
>по умолчанию (DirectoryIndex) для mysite указать mysite/en/index.htm,
Отлично
Большое спасибо!
Сегодня нашел небольшой пример приенения мод реврайта для переключения языка.
Еще не проверял так как пока пытаюсь понять перевод и правильность работы.
Следом за примером пришла идейка для мультиязычного сайта:1. человек заходит на сплеш страничку и выбирает на ней язык
2. как только он перешел в подкаталог /en/ или /ru/ открывается index.html
3. в index.html через <META HTTP-EQUIV="Set-Cookie" CONTENT="NAME=lang; EXPIRES=0; ... устнавливается lang=ru или lang=en4. Затем в корень сайта вешается .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]
>...Есть столько всего что должно было упростить жизнь, но вы до сих пор верите только в 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]
>Есть столько всего что должно было упростить жизнь, но вы до сих
>пор верите только в html и htaccess...:(
Пытаюсь уже год как взяться и поучить PHP но все нет времени :(
А недавно нарвался на кучку вирусов так PHP теперь боюсь - напишу чего... но с дырами.. и хана :/(Вы наверно же про php говорили?)
P.S. Ваш пример сегодня постараюсь посмотреть - если успею
Поизучал приер и не смог понять параметра/директивы:1. 7200 - это порт(тогда зачем) или установка времени действия куки(2часа вроде) ?
2. работа/редирект идет на ru.domain.com/ или domain.com/ru/ ?
3. зачем необхдимо повторение RewriteEngine On и RewriteBase / перед каждым блоком?Как я понял запись в куки произходит в зависимосте от той директории
в которой находится пользователь и дальше при запросе "корневого домена" идет редирект...
>Есть столько всего что должно было упростить жизнь, но вы до сих
>пор верите только в 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]
RewriteCond %{HTTP_COOKIE} CookieXXL_ [NC]У меня только так работает, с параметрами что-то перемудрили.