Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/67: Рейтинг темы: голосов - 67, средняя оценка - 4.87
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762

двуязычный сайт

31.08.2012, 02:20. Показов 12921. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сейчас делаю сайт на русском и английском.
И вот возник какой вопрос как правильнее реализовать двуязычность, с точки зрения функциональности, быстродействия, индексирования поисковиками и т.д.
Есть варианты сделать субдомен для английского, либо просто разместить в разные папки английские и русские страницы, и третий вариант(который почему то мне ближе) сделать все на одних и тех же страницах но в зависимости от того какой язык в куках выводить соответственно разные строки.
Возможно есть и другие варианты более правильные , но мне они пока в голову не пришли.
Просветите , кто понимает в этом.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.08.2012, 02:20
Ответы с готовыми решениями:

Сайт после 5 секунд заходит на другой сайт (взломали сайт)
Когда я открою свое сайт он после 5 секунд заходит на другой сайт (взломали сайт) там написано что взломали турецкие хакеры.. Как лечить...

Создать сайт, оформленный как новостной сайт или блог
Подготовить для сайта базу данных “новости автоспорта”. Сайт должен быть оформлен или как новостной сайт или блог. В состав одной новости...

Хочу разработать с нуля сайт, похожий на сайт знакомств. Что для этого нужно?
Хочу разработать с нуля сайт, похожий на сайт знакомств. Что для этого нужно? Без использования готовых движков. Поделитесь пожалуйста...

20
31 / 31 / 2
Регистрация: 06.08.2012
Сообщений: 155
31.08.2012, 02:49
Сделать папку lang/ в ней eng.php и rus.php
В них создаешь массивы с одинаковыми(!) имена, например:
Русский:
PHP
1
$lang['header'] = "Мой сайт";
Английский:
PHP
1
$lang['header'] = "My Site";
Прописываешь это всё в страницу, например:
HTML5
1
2
3
...
<title> <? php echo $lang['header']; ?> </title>
...
и в зависимости от условия инклюдишь разные файлы, например:
PHP
1
if($chosen_lang == "rus"){ include 'rus.php'; } else { include 'eng.php'; }
Ну я думаю понятно, по какому принципу работать.
2
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,844
31.08.2012, 10:36
лучше ключ использовать английскую версию
русский:
PHP
1
$lang['my site'] = "Мой сайт";
и к примеру немецкий :
PHP
1
$lang['my site'] = "Meine website";
а выводить функцией , в которую подаешь ключ , и если значения не будет то выводим ключ , тоесть если вдруг забыли добавить в какойто ланг фразу ,то она появится на английском.
1
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
31.08.2012, 11:24  [ТС]
хм интересная версия, но что то я не совсем уловил, какие у нее преимущества, скажем по сравнению с той что бы написать например так
PHP
1
<title><?php if($_COOCKIE['lang']=='ru')echo "Мой Cайт";else echo "My Site"?></title>
по обьему написаного кода это будет даже меньше, так как не нужно создавать 2 дополнительные страницы и заносить их в массивы, а потом выводить значения из них.
Да и как мне кажется можно и запутаться в названиях, если под каждую фразу создавать отдельный массив?
Но вот как это скажется на быстродействии сайта и на индексировании поиисковиками в одном и другом варианте.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
31.08.2012, 11:29
создаете в БД две одинаковые по структуре таблицы, но с содержанием на разных языках (к примеру со столбцами id,url,title,content,left_menu,right_men u,footer) и затем просто извлекаете из нужной таблицы данные.

Добавлено через 1 минуту
зависит, собственно, от самой структуры сайта. Сколько точек входа у вас, паттерн-непаттерн, и т.д.
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,844
31.08.2012, 11:31
предположим на вашем сайте в 1000 местах нужно вставить фразы:
1. что проще
PHP
1
<title><?php if($_COOCKIE['lang']=='ru')echo "Мой Cайт";else echo "My Site"?></title>
или прописывать
PHP
1
<title><?= LoadLang('My Site'); ?></title>
2. вам надо поменять (заменить) фразу , как удбнее рыскать по всем файлам сайта , искать и править все места где эта фраза , или заглянуть в 1 файл языков и там поменять ,и сразу заменится на всех страницах сайта

3. что читабельнее , гора ифов с кучей вложений где черт ногу сломит , или грамотно распределеннеы файлы
/языки
/стили
/картинки
/класы
/шаблоны
/ещеченить
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
31.08.2012, 11:36
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if(!isset($_COOKIE['lang'])) {
$table = 'english'; #язык по дефолту
}
else {
if($_COOKIE['lang'] == 'english') $table = 'english';
else $table = 'russian';
#очищаешь и экранируешь для запроса
#если много языков - лучше через switch-case
}
if(!isset($_GET['cat'])) {
#главная страница
$query = "SELECT * FROM `{$table}` WHERE `url`='index'";
}
else {
$url = stripslashes(strip_tags(trim($_GET['cat'])));
if(empty($url)) $url = 'index'; #на всякий, вдруг что ввели
else {
#очищаешь и экранируешь для запроса
$query = "SELECT * FROM `{$table}` WHERE `url`='{$url}'";
}
}
#выполняешь запрос от $query и выводишь найденную инфу
если по простому
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,844
31.08.2012, 11:42
KOPOJI , предлагаешь все фразы сайта держать в базе , тоесть там например чтобы валуе на кнопу найти "отправить" или "send" обращатся к базе , выполнять запрос и фетчить его ? в резултате все альты , тайтлы , пункты меню .. этож порядка 1000 запросов на страницу ...
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
31.08.2012, 11:57
crautcher, это на простой сайт, где немного запросов будет.
0
67 / 60 / 25
Регистрация: 05.05.2009
Сообщений: 131
31.08.2012, 12:21
Выборка из базы производится один раз - выбираются все ключи и значения для выбранного языка и потом подставляются везде, где надо.
По сути получается то-же самое, что и подключить php файл с массивом, только при хранении фраз в базе их проще править/добавлять, особенно если языков больше двух.
Таблицу проще использовать одну, просто с полями значений под каждый язык (это более простой вариант - при добавлении языка придётся добавлять столбец в таблицу)

keyvalue_rusvalue_eng
my siteМой сайтMy site
helloПриветствиеHello

При такой организации не возникает проблем с синхронизацией массивов, когда в русском массиве ключ есть, а в английском нету.
Получать массив фраз для выбранного языка таким запросом
PHP
1
$q = "SELECT `key`, `value_".$lang."` AS `value` FROM `languages`";
Добавлено через 6 минут
Кстати, запоминать язык в куках не лучший вариант. Кинуть кому-то ссылку на определённую языковую версию не получится, да и поисковики второй язык либо не найдут, либо найдут, но не обрадуются, найдя по одной и той-же ссылке два разных контента.
лучше использовать явное указание языка в ссылках
0
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
31.08.2012, 12:32  [ТС]
crautcher, да пожалуй все таки этот подход более правильный, с ним и намного проще будет добавить например третий язык.
НО, если с вариантом который предложил spyeye, все ясно то в Вашем варианте я что то не совсем понимаю механизма как именно должна быть написана функция LoadLang
Я как понял страницы с массивами нужно инклудить именно в функцию а не на страницу, и далее от того какой язык выбран функция будет возвращать элемент массива или из папки en или из папки ru.
Если это так то каким образом можно выбирать массивы из разных папок у которых абсолютно одинаковое имя, как именно это реализовать в коде?
Или тогда вообще не имеет смысла делать им одинаковые имена, а сделать массивы с названиями en и ru , но с одинаковыми ключами?

Добавлено через 9 минут
Цитата Сообщение от Darevill Посмотреть сообщение

Добавлено через 6 минут
Кстати, запоминать язык в куках не лучший вариант. Кинуть кому-то ссылку на определённую языковую версию не получится, да и поисковики второй язык либо не найдут, либо найдут, но не обрадуются, найдя по одной и той-же ссылке два разных контента.
лучше использовать явное указание языка в ссылках
Т.е, Вы считаете, что лучше сделать разные папки для ru и en?
mysite.com/ru и mysite.com/en?
или добавить субдомен для английского?
mysite.com и en.mysite.com?
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,844
31.08.2012, 12:32
дак в функции тоже самое условие будет только если нету такого элемента отдаём ключ
PHP
1
2
3
4
5
6
7
8
9
LoadLang ($key)
{
static $lang = false;
 if (!$lang && isset($_COOKIE['lang']) && file_exists( 'langs/'.$_COOKIE['lang'] . '.php'))
 {
   $lang = include 'langs/'.$_COOKIE['lang'] . '.php';
 }
return (isset($lang[$key])) ? $lang[$key] : $key;
}
0
67 / 60 / 25
Регистрация: 05.05.2009
Сообщений: 131
31.08.2012, 12:56
Цитата Сообщение от alpex Посмотреть сообщение
Т.е, Вы считаете, что лучше сделать разные папки для ru и en?
mysite.com/ru и mysite.com/en?
или добавить субдомен для английского?
mysite.com и en.mysite.com?
Да, выбранный язык, если он отличается от языка по умолчанию, должен отображаться в ссылке
0
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
01.09.2012, 08:30  [ТС]
Вообщем думал думал и решил все таки делать как описывал crautcher, почему то мне кажется что это самый нормальный в моей ситуации подход.
Хотя конечно вот это замечание
Кстати, запоминать язык в куках не лучший вариант. Кинуть кому-то ссылку на определённую языковую версию не получится, да и поисковики второй язык либо не найдут, либо найдут, но не обрадуются, найдя по одной и той-же ссылке два разных контента.
лучше использовать явное указание языка в ссылках
вносит смуту в мои мысли

Добавлено через 14 часов 15 минут
мда начал делать но вот трабл не видно массива который находится в файле который инклудится, т.е

lang.php
PHP
1
2
$param = array(
"speed" => "Скорость",);
файл selector.php
PHP
1
2
include ('lang.php');
echo $param['speed'];
получается ошибка Notice: Undefined variable: speed in selector.php

Я как подозреваю, что с ООП подходом можно с этим легко разобратся при помощи public, но как быть с процедурным подходом, как сделать что бы было видно переменную?

Добавлено через 14 минут
Я в принципе нашел способ но подозреваю , что это не совсем правильно или может даже совсем не правильно:
lang.php
PHP
1
2
3
4
5
6
function lang($key){
$param = array(
"speed" => " Скорость",);
$key = $param['$key'];
return $key;
}
В таком подходе вообще не иммеет смысла создать массив, можно делать все при помощи переменных.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
01.09.2012, 09:04
должно все работать так. может быть он у вас по другому называется, не lang.php?
0
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
01.09.2012, 09:16  [ТС]
Да нет пути правильно приписаны, ведь я когда поменял функции все стало выводится.
и это уже не первый раз такое , я когда начинал авторизацию писать, тоже хотел с одного файла в другой передать переменную, при помощи include , но тоже тогда не было видно.
Может у меня какие то настройки на денвере стоят не так как нужно? хотя я ничего не менял после установки, есть ли в настройках сервера какая то функция которая отвечает за глобальность переменных, нy что то типа short_open_tag?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
01.09.2012, 09:26
они и не должны быть глобальными. конструкция include - это тоже самое что если бы вы весь код вставили прямо в скрипте.
P.S. у меня кстати все работает, специально еще проверил на всякий случай
0
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
01.09.2012, 09:28  [ТС]
только что попробовал на хостере действительно все работает, значит проблема имеено у меня где то в настройках сервера
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
01.09.2012, 09:31
http://www.php.net/manual/ru/function.include.php
Когда файл включается, его код наследует ту же область видимости переменых, что и строка, на которой произошло включение. Все переменные, доступные на этой строке во включащем файле будут также доступны во включаемом файле. Однако все функции и классы, объявленные во включаемом файле, будут доступны в глобальной области видимости.
Добавлено через 1 минуту
эмм.. пропишите вверху скрипта эти две строчки
PHP
1
2
ini_set('display_errors','On');
error_reporting(E_ALL|E_STRICT);
и include замените на require

Добавлено через 40 секунд
ошибки какие нибудь появляются?
1
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
01.09.2012, 10:08  [ТС]
Ошибка только одна идет в принципе та же что и была, вот дословно то что показывает
Notice: Undefined variable: param in Z:\home\localhost\www\php\streetsql\bloc ks\selector.php on line 19
от смены require и include ничего не меняется
вот 19 строка
PHP
1
<tr><td class='left'><?php echo $param['speed']?></td><td class='right'><?=$speed?></td></tr>
Добавлено через 16 минут
хм вообщем если я делаю именно так как я написал в посте т.е специально создаю два файла и проверяю то все работает.
А если вставляю в сайт то не хочет,но дело в том что у меня там немного по другому, т.е есть файл parts.php к которому я подключаю файл с функциями selector.php а уже к этому файлу подключаю ru.php который из папки lang, и вот так с двойным инклудом работать не хочет даже если подключить ru.php и к parts.php и к selector.php

Добавлено через 11 минут
все разобрался в своей тупости
я инклудил файл с массивом в начале файла а потом открывал функцию и в ней выводил данные, ну и соответственно внутри функции этот массив не был виден
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.09.2012, 10:08
Помогаю со студенческими работами здесь

Покрашился сайт, Что-то накосячил, сайт не доступен
Поменял пароль в базе php.admin и теперь сайт не доступен, пишет Error establishing a database connection. Больше ничего не менял. ...

Двуязычный сайт
Делаю вторую версию сайта, на английском. На том же домене. Будет ли адсенс показывать объявления на английском? ( Поставила блок 10 минут...

Яндекс и двуязычный сайт
Как относится Яндекс к двуязычным сайтам? К русским страницам я добавляю белорусские. Не ухудшит ли это положение в поиске? Как...

Двуязычный сайт и Гугл.
Хотелось бы знать мнение специалистов по поводу переделки русскоязычного сайта в двуязычный. Читал тему трех годичной давности и всетаки...

Как сделать двуязычный сайт?
Необходимо создать сайт, каждая страница которого представлена на двух языках: русском и английском. Сайт чисто информационный, основная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru