Три языка на сайте или более

Mondain

Новичок
Три языка на сайте или более

Привет всем. Я начинающий программист, и не могу понять как сделать сайт с тремя языками или более. RU/EN/DE. Тоесть жмешь index.php/?lang=ru и у тебя будет весь сайт по русски, а если index.php/?lang=en то по английски. Как можно такую вещь реализовать через пхп? Вот как на этом сайте: http://sport.tts.lt/
 

Фанат

oncle terrible
Команда форума
а чем отличается задание языка от любых других параметров?
 

webman

Новичок
так же как и на этом сайте :)
ну грубо говоря, и это мое мнение, что бы потом не ругали:) :
1) инфа которая отображается на сайте и, допустим, хранится в бд должна быть на 3х языках
2) название разделов менюшки и вообще вся статическая инфа хранится в массиве, например
$info['menu']['item1']['ru'] = 'Новости';
$info['menu']['item1']['eng'] = 'News';
и т.д.
взависимости от $_GET['lang'] выбирается статическая инфа для отображения типа:
$lang = (isset($_GET['lang'])) ? $_GET['lang'] : 'ru';
echo $info['menu']['item1'][$lang];
и добавляемая пользователем из БД читается например
SELECT news FROM news WHERE lang=$lang
ну вот я бы наверно так сделал, пока мне другой правильный вариант не покажут :)
 

Groove

Новичок
webman
по моему немного логичнее будет разнести на разные файлы с языковыми массивами.
/usr/www/sitename.com/lang/lang_en.php
/usr/www/sitename.com/lang/lang_ru.php
/usr/www/sitename.com/lang/lang_fr.php
/usr/www/sitename.com/lang/lang_ua.php

PHP:
//что это дает:
//к примеру основной язык английский, 
//значит подключаем его всегда по умолчанию
include_once('/usr/www/sitename.com/lang/lang_en.php');
$lang = (isset($_GET['lang'])) ? trim(strip_tags($_GET['lang'])) : 'en';
//проверяем наличие нужного файла локализации
$file_lang = '/usr/www/sitename.com/lang/lang_'.$lang.'.php';
if(('en'!=$lang) && (file_exists($file_lang))){
  //этим повторным подключением мы переписываем значения в языковом массиве
  include_once($file_lang);
}
/*
lang_en.php
*/
$LANG['news']   = 'News';
$LANG['forums'] = 'Forums';
$LANG['about']  = 'About us';
/*
lang_ru.php
*/
$LANG['news']   = 'Новости';
$LANG['about']  = 'О нас';

/*
итого, чтобы добавить язык мы должны просто тупо скопировать языковой файл по умолчанию и редактировать его
причем отсутствующие или не переведенные элементы будут на основном языке
как в примере выше в русском файле локализации отсутствует $LANG['forums'], 
значит на русской версии сайта будет "Forums" взято из файла по умолчанию
*/
 

webman

Новичок
ну я просто принцип описал :)

-~{}~ 01.10.05 22:57:

но все равно спасибо, в дальнейшем может понадобится
 

Mondain

Новичок
Спасибо всем кто помог. А если будет большой текст, то как это сделать? И как поставить чтобы русский был основным и ссылкой index.php/?lang=ru и т.д.
 

webman

Новичок
ну получается, что напишите все за меня :)
Groove написал как устанавливать язык по умолчанию
а на счет ссылок... ну можно, например, переменную текущего языка в сессии хранить
а какой большой текст например?
всмысле какая у него смыславая нагрузка(новости, статьи и т.д.)?
 

Mondain

Новичок
Новости и статьи. Я прошу помочь мне с этим, потому что я не смогу сделать :(
 

tolst

Новичок
в общем сделай нечто типо этого:
PHP:
<?php


session_start();
if ($_GET[language] != NULL){
   $_SESSION[lang] = $_GET[language]; // Меняем язык
} elseif ($_SESSION[lang] == NULL){
   $_SESSION[lang] = "RU"; // выставляем по умолчанию
}

// Тут инклуди как тебе выше показали файл с массивом надписей


?>
все ссылки как и прежде, а вот чтобы сменить нужно к скрипту GET параметр language приляпать, например index.php?language=en
 

webman

Новичок
новости и статьи хранить в БД на разных языках
потом выбирать что то типа этого
$news = 'news_'.$lang;
SELECT $news FROM table WHERE ...
ps: за тебя все делать ни кто не будет
 

tolst

Новичок
webman
> ps: за тебя все делать ни кто не будет

помоему уже всё за него сделали =))
 

SiMM

Новичок
tolst, в следующий раз не демонстрируйте корявый код.
[m]language.types.array#language.types.array.foo-bar[/m]
И хранить язык контента в сессии - это глупость. Посмотрите хотя бы на тот же php.net

-~{}~ 02.10.05 08:12:

Mondain, во-первых, тебе в твоих изысканиях может пригодиться [m]output_add_rewrite_var[/m], во-вторых
PHP:
if (!isset($_REQUEST['lang'])) {
  header('Location: '.$_SERVER['REQUEST_URI'].(strpos($_SERVER['REQUEST_URI'],'?')===false ? '?' : '&').'lang=ru');
  exit();
}
-~{}~ 02.10.05 08:20:

> потом выбирать что то типа этого
> $news = 'news_'.$lang;
> SELECT $news FROM table WHERE ...
Разумнее сделать в таблице lang_id, а не дублировать каждое из языковых полей по нескольку раз на разных языках. Да и поиск упроститься. Кроме того разумно добавить поле типа parent_id, указывающее на оригинальный вариант статьи.
 

Groove

Новичок
tolst
чтобы предупредить твой следующий возможный вопрос про то, почему нельзя хранить в сессии текущий язык как тебе уже сказал SiMM:
ведь ссылки используются не только для навигации по сайту, но и например для передачи третьим лицам и сохранения в Favotires, а если ты будешь сохранять ссылку, часть которой хранится в сессии, то при заходе на нее не будешь получать ожидаемое...
тоже самое касается и куков.

Поэтому

$lang = (isset($_GET['lang'])) ? trim(strip_tags($_GET['lang'])) : 'en';
output_add_rewrite_var('lang', $lang);
а затем везде в твоих статьях просто указываешь ссылку без указания языка, он выберется по желанию посетителя сам или если его устраивает язык по умолчанию - будет он.
Причем как ты можешь узнать из ссылки, которую тебе дал SiMM, будут переписаны только ЛОКАЛЬНЫЕ ссылки с твоего сайта и заменено (или оно просто аппендит точно не помню поправьте если что) значение текущего языка.
Т.е. в своей статье просто пишешь к примеру ссылку

<a href="/?m=about">О нас</a>

находясь на странице
http://sitename.com/?m=news&lang=ru

а при отдаче страницы пхп сам определит все локальные для твоего сайта ссылки и допишет/изменит в них параметр "lang" на "ru"
таким образом получится ссылка в статье будет на
<a href="/?m=about&lang=ru">О нас</a>

ясно?
 

SiMM

Новичок
> $lang = (isset($_GET['lang'])) ? trim(strip_tags($_GET['lang'])) : 'en';
Всё же правильнее делать редирект, дабы один и тот же контент не индексировался дважды. ИМХО.
 

Mondain

Новичок
Пожайлуста опиши как должно быть, где какой код и какие файлы.
 

Vetal

Новичок
люди потеют, статьи пишут, а никто не читает..

Mondain, вот возьми PHPIns!de
целый номер журнала об этом http://phpclub.ru/detail/magazine/2005/05/

p.s. а я кстати почитаю про оптимизацию postgresql ;)
http://phpclub.ru/detail/magazine/2005/08/
 

kvf77

Red Devil
Vetal

там немного о другом, как раз обсуждаемое здесь там опущено, я когда писал - не думал, что это может вызвать такие дискуссии, может напишу в ближайшее время свои идеи на сей счет.
 

Vetal

Новичок
я видел ещё другой номер журнала
там была только одна статья, но тоже хорошая
 
Сверху