Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > PHP: Общие вопросы > Нужен совет по переводу сайта на ин. языки |
Автор: rodendron 13.2.2006, 10:36 |
Добрый день, хотел получить консультацию. Ситуация следующая. Имеется сайт на английском языке. Хотелось бы его перевести еще и на немецкий. Мною был сделан файл языка, который теперь в каждой страничке подтягивается как инклуд. Теперь как его правильно подключить? Я знаю как сделать точно: на всех страницах сайта, где имеются ссылки, дописать еще и "?lang=$lang", это помимо "?page=$i" и т.д. НО, это технически сложно, потому что на сайте имеются также формы регистрации, и придется в каждой форме вставлять "<input type=hidden name=lang value=$lang>". Думал решить проблему с помощью сессий, но чего-то не понял как ее переприсваивать - ее можно только разрушить и создать. Да и сессии по идее тоже не выход. Как вариант, еще обдумывал создание поддоменов. То есть, http://de.mydomain.com, но если переводить сайт на множество языков, то необходимо создавать и множество доменом. Но это технически неразрешимо - количество возмжных саб-доменов меньше, чем требования по количеству языков на сайте в будущем. Посовейтуйте пожалуйста возможное решение. Заранее благодарен. |
Автор: rodendron 13.2.2006, 11:05 |
Dave, Как будет производиться смена языка? Чтобы я мог его сменить, при этом остаться на той же странце, на которой и находился. |
Автор: Dave 13.2.2006, 13:02 | ||
Делай редирект на ту же страницу с параметром языка. То есть ссылка переключения языков не должна быть статической а динамической, подставляй в нее полный текущий урл добавляя в конце переменную с идентификатором языка. |
Автор: rodendron 13.2.2006, 14:17 | ||||||
Если не сложно, скинь пожалуйста какой-нибудь простенький пример. Заранее благодарен. |
Автор: z-END 13.2.2006, 14:34 |
а может проще через mod_rewrite сделать? |
Автор: Kefir 13.2.2006, 20:02 | ||
rodendron,
Вот простенький пример который ты просил. Второй блок - if, а не elseif, т.к. в случае если в ГЕТ был язык, но этот язык не валидный мы должны проверить текущий язык и так или иначе поставить какой-нибудь язык. |
Автор: rodendron 13.2.2006, 21:09 | ||||
Kefir, Спасибки. По логике так и должно бвть. Но у меня чего-то не работает. Добавил еще в конец твоего кода
Правда все равно не помогает. Только помле кода session_register() у меня создалась переменная $lang. До этого и она была пуста. Может я чего не так делаю? Добавлено @ 21:12
$lang тут пустой... |
Автор: Kefir 13.2.2006, 21:22 | ||
название переменной, в которой хранится язык - $_SESSION['lang'] ![]()
И ещё - насколько я помню (не ручаюсь) - разхработчики ПХП писали о нежелательности использования session_register и $_SESSION в одном и том же коде. |
Автор: CyClon 13.2.2006, 22:57 |
Прогонять сайт через какой-нибудь он-лайн переводчик, далее загружать все с помощью fopen и выводить. ИМХО. А вообще сделать несоклько языковых файлов, где все слова определены константами, в COOKIE и БД хранить инфу о языке юзера. |
Автор: Kefir 13.2.2006, 23:10 | ||||
CyClon, вопрос не в том как организовать сам перевод, а как организовать хранение переменной языка.
хранить такую инфу в печеньках - можно, но на мой взгляд неудобно, хотя плюсы в этом, конечно есть.
![]() |
Автор: rodendron 14.2.2006, 00:23 | ||
Kefir, Все равно пусто ![]()
Проверил, что последний if срабатывает, но вот присвоения значения не происходит. Может ли что-то быть с версией php? У менян а работе на денвере вроде что-то пытается работать. А на сайте на valehost почему-то ничего не происходит, да и к тому же еще и ссылка потом становиться некрасивой и кончается на PHPSESID. Я конечно понимаю, что надо как-то обозначить uid, но не так же страшно и коряво... |
Автор: Kefir 14.2.2006, 00:27 | ||||
rodendron, посмотри на две строки:
Тебе ничего странным не кажется? ![]() |
Автор: rodendron 14.2.2006, 00:41 |
Kefir, Уф ну и нахимичил я там, пока тестировал. Спасибки огромное! Исправил. Все стало выводиться. Добавлено @ 00:51 Kefir, Можно еще несколько вопросов параллельно? Я когда писал диплом - вылавливал данные из форм так: $lang = $_GET['lang'] или $lang = $_POST['lang'] Сечас столкнулся с тем, что можно это не определять. То есть просто использовать в программе $lang и он сам его определяет. Это с чем может быть связано? Заранее благодарен. |
Автор: rodendron 14.2.2006, 00:58 |
А второй вопрос - от "...?PHPSESSID=0dd036d784580773d14be950db2b4401" никак нельзя избавиться? |
Автор: Kefir 14.2.2006, 01:05 | ||||||
rodendron,
Это связано в тем, что в ПХП.ини есть такой опшн - register_globals ( = On/Off). Если он включён, то для каждого элемента, например, $_POST, будет создана переменная с именем равным ключу (если есть $_POST['lang'], то будет создана переменная $lang с точно таким же значением). Это фича выключена на большинстве хостингов. Всегда используй $_POST/$_GET а не надуйся на включённые register_globals. Добавлено @ 01:06
Тут дело в том, что у ПХП невелик выбор способов запоминания SID (номер сессии): или печеньки, или передавать в УРЛе. если ты не хочешь, чтобы ПХП передавал этот номер в УРЛе, тогда надо сделать так:
Неудобство в том, что если куки отключены - то сессии работать не будут. |
Автор: rodendron 14.2.2006, 01:20 | ||
В строке браузера когда осуществляю перехрд по ссылке. Скажем так - сразу после 1-ого перехода по ссылке. |
Автор: Kefir 14.2.2006, 01:24 |
rodendron, см. моё предыдущее сообщение ![]() Добавлено @ 01:26 Подробнее http://ee.php.net/session |
Автор: rodendron 14.2.2006, 01:35 |
Kefir, Еще раз спасибо тебе огромное! Подрасту - повышу тебе обязательно репутацию;) По поводу строчки в алресе я все понял. Жаль, но к куки мне привязываться нельзя. Так что оставлю как есть. |
Автор: rodendron 14.2.2006, 01:56 |
Kefir, Бдмн нмкак мне не везет... Сдаюсь... Когда ручками в строке браузера набивал DE - он мне менял язык, сейчас сделал по ссылке - он в никакую......... ?lang=DE&PHPSESSID=a999476c09237943b35e8ae93854505d $lang все равно рано EN... ставлю руками ?lang=DE и нажимаю enter - у меня все ок! Получается что когда есть сессия переменная не перезаписывается? Или я лпять что-то не так делаю? --- Все решилось. Хостер зараза в это время чудил. Сорьки. Еще раз чпачибо! |
Автор: Dave 14.2.2006, 10:01 | ||
Это связано с настройками пхп, а именно register_globals, у тебя эта опция включена, почитай про эту опцию и все станет ясно. |
Автор: CoderUA 14.2.2006, 22:10 | ||||||
Подскажите, плиз, где можно детальнее почитать про организацию мультиязычного движка? Добавлено @ 22:20 По поводу эмуляции директивы register_globals on Если есть необходимость, то можно почитать!!! Есть в PHP такая интересная директива, под названием register_globals, определенная в php.ini. Директива указывает компилятору, что значения входящих (глобальных) переменных следует изъять из их системных массивов и представить в виде самостоятельных переменных. К таким данным относится все, что передается в скрипт "снаружи": данные из форм, данные из URL, cookie и так далее. Лично мне эта директива нравится, ибо она экономит время написания скриптов и делает их более читаемыми. Сравните сами, что выглядит приятнее и удобнее для глаза: Здравствуйте, уважаемый <?=$_COOKIE['username']>>, мы рады вам! Здравствуйте, уважаемый <?=$username?>, мы рады вам! Вообще, лично я люблю PHP в основном за его удобочитаемость и быстрое написание. Тем не менее, в каждой удобной фишке обязательно таится какая-нибудь гадость. Не обошлось без неприятностей и с регистрацией глобальных переменных. Невнимательные программисты оставляли в своих скриптах дыры, которые можно было обнаружить и использовать со стороны пользователя. Проще говоря, если переменная внутри скрипта участвовала в работе, но не устанавливалась этим же скриптом, ее можно было установить "снаружи", передав ее имя и значение в скрипт через URL, cookie или еще как-нибудь. Эта дыра, которую записали в разряд "дыр в PHP" лично я считаю дырой в программировании, а не в языке, вынудила разработчиков PHP рекомендовать отключение register_globals. Что тут же было воспринято общественность как руководство к действию: все стали выключать регистрацию глобальных переменных на своих серверах. Может быть это и не так уж плохо, судить не буду, ведь ради безопасности иногда возводят и городят гораздо больше, чем код самой задачи. Но повальный отказ от регистрации глобальных переменных привело к новой проблеме - многие скрипты надо переписывать чуть ли не с нуля, ибо надо проверить каждую строку, найти все используемые переменные и поменять их на "защищенные" аналоги. Насколько я понимаю, подобная задача, в конце концов, сводится к тому, чтобы в начале работы скрипта присвоить привычным переменным их значения из глобальных массивов $_REQUEST, $_POST, $_GET, $_COOKIE, $_SERVER и т.д. Так к чему же я веду. А вот к чему... Нормальный программист не должен допускать дыр в своих скриптах, подобных дырам на основе автоматической регистрации глобальных переменных, но разве это будет волновать администратора сервера, на котором решено разместить код? Нет, это его не волнует и он по-своему прав. Поэтому, если вы написали на заказ программу с использованием глобальных переменных, а заказчик решил установить ее на сервере, где запрещена их регистрация, то ничего работать не будет - у вас проблемы. Если вы решили перенести все свои проекты на новый хостинг, а провайдер запрещает использовать регистрацию глобальных переменных - у вас проблемы. Как быть? Не вычитывать же десятки, сотни, а иногда и тысячи страниц кода в поисках использования глобальных переменных. Я предлагаю следующее решение. Надо просто эмулировать работу register_globals в одном отдельно взятом скрипте или в начале объектно-ориентированной стркутуры. Как это сделать. Да не очень уж и сложно. Давайте рассуждать логически: имена переменных и их значения содержатся в соответствующих глобальных массивах. Как правило, используется массив $_REQUEST, который объединяет в себе все переменных GET, POST и COOKIE. Т.е. все, что передается скрипту из браузера, то, с чем работают скрипты. Значит, надо извлечь из массива имена переменных, значения переменных и присвоить первому - второе. Извлечь - не проблема, для этого подойдет функция перебора всех ячеек массива foreach(), но как присвоить? Если у нас в $_REQUEST[username] содержится "atos", то как программно создать переменную $username со значением "atos"? Мы же не можем заранее знать, какие имена переменных будут в массиве $_REQUEST. Вот тут нам поможет изумительная функция eval(), которая редко используется в обычном программировании, но буквально незаменима в некоторых случаях. О самой функции стоит написать отдельно, поэтому скажу только пару слов для тех, кто с ней не знаком. Функция eval() заставляет PHP рассматривать обыкновенный текст, содержащийся в переменной, как фрагмент PHP-кода. Говоря языком примеров, результаты работы строк echo 'Hello, User!'; и
будет идентичными. Вот eval() и поможет нам объявить все переменные из массива $_REQUEST. Выглядит это совсем коротко:
Вставьте этот цикл в самом начале вашего скрипта; он переберет массив глобальных переменных и объявит их не хуже register_globals. А может быть даже и лучше, т.к. глобальных массивов много, а вытаскивать переменные не обязательно из всех. Как правило, данных из массива $_REQUEST - вполне достаточно. Однако, не стоит забывать и о безопасности вашего кода. Обратите внимание на специфику работы функции eval() - она обработает весь код, переданный ей в качестве параметра. Будьте осторожны, примите меры безопастности, чтобы злоумышленник не подсунул в качестве названия или содержимого переменной кусок своего php-кода или просто неверные данные, способные вызвать ошибку (например, имя переменной, начинающее с цифры или другого неразрешенного символа). 09.02.2003 P.S. После опубликования этой заметки, на форуме не один раз высказывались мысли о том, что вариант с eval() - не самый лучший. Лично я предпочитаю оставлять для себя "путь к отступлению", и eval() как раз привлекателен тем, что позволяет полностью контролировать процесс, добавляя необходимые проверки и ограничения в процедуру или наоборот - расширяя возможности кода. Например, можно добавить логирование регистрации отдельных переменных, чтобы знать - кто, куда, откуда, зачем, или четко запретить к регистрации определенные имена переменных или другие данные. Впрочем, у каждого метода есть свои плюсы и свои минусы - думайте сами, решайте сами - как поется в известной песне. Метод "переменные переменных".
Как видите, тоже простой метод, основанный на том, что значение переменной $k используется в качестве имени новой переменной. Удобно. Отличается автоматической регистрацией не только переменных, но и массивов. В случае с методом eval() придется проверять каждую переменную на is_array() и разворачивать (регистрировать) ее дополнительно, если такой массив вам нужен. И самый простой метод - extract(). Весь код нашего примера будет выглядеть так: extract($_REQUEST); Это самый "тупой" метод, "разворачивающий" в переменные все, что содержится в массиве $_REQUEST. Нет абсолютно никакой гибкости в этом подходе - повлиять на регистрацию переменных или ввести какой-либо контроль вы не сможете, но выглядит очень лаконично. И, наконец, не забывайте о том, что register_globals можно активировать не только в конфигурационном файле Apache, но и в файле .htaccess вашего сайта. |
Автор: Kefir 14.2.2006, 23:18 |
CoderUA, давай теперь будем постить страницами тексты из мануалов и статей, информация в которых довольно однобокая. Акцию можно назвать "Зафлудим темы форума!". В следующий раз делай, пожалуйста http://kurepin.ru/php/zametki/register_globals/. Например, утверждение о том, что extract - тупая и негибкая ф-ция - абсолютно голословно. Главное - правильно читать мануал. И ещё - организация многоязычного сайта очень сходна с организацией обычного сайта. Появляется параметр языка и, естесственно встаёт вопрос кодировок - я предпочитаю утф (как и большинство). Если у тебя возникают вопросы по какому-то конкретному аспекту этого дела - создай новую тему и спрашивай там.. |
Автор: CoderUA 15.2.2006, 21:11 |
Kefir, сорри, у меня просто был текст, и я не знал откуда он, иначе естественно кинул бы линк! |