Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > многоязычность на сайте


Автор: DimaSiK 2.6.2007, 18:59
Подскажите, как правильно проектировать  сайт, который будет представлен сети на нескольких языках?, какие существуют нюансы, где хранить все языковую информацию сайта, как быстро подключатьб требуемый язык.

Автор: rMaveric 2.6.2007, 19:17
Как организовать структуру - твои личные проблемы. Как хочешь так и хранишь всю информацию. Если в БД, то можешь просто добавить поле язык и при выборке требуемых данных использовать именно его. Если хранишь инфу в файле, то самый простой способ - папка с кодом языка в тимплейтах и контенте.

Нюанс в принципе только один, как предложить пользователю использовать Язык. Я лично предпочитаю следующий алгоритм

1. Если у человека установлены предпочтения, то выставить язык согласно предпочтениям
2. Если у человека предпочтений нет, то посмотреть с какой он страны и выбрать наиболее подходящий для этой страны.
3. Если такого языка нет в качестве поддерживаемых сайтом, то ставим дефаултный (желательно английский или в некоторых случаях французский)
4. Не забыть в дизайне предусмотреть механизм смены языка.

Это для первого захода. А для последующих проще.
Отображать человеку на том языке, на котором он смотрел, когда заходил последний раз.

Еще ньюанс. Если хочешь делать хорошо, то ссылки у тебя должны быть все с указанием языка. Так например, когда человек заходит на индексную страницу например http://domain.com/, то скрипт определяет язык и сразу перенаправляет раздел этого языка, например http://domain.com/ru/

Это делается для того, чтобы поисковые системы видели нормально твой сайт на разных языках, а не путались, что сегодня им на этом адресе показали русский текст, на через неделю немецкий. Также такая схема позваолит делать линки людям с цитатами, т.к. они будут указывать у себя прямую ссылку с указанием языка всегда и не будет путаницы.

Ну а технически, повторюсь, делай как тебе нравится.

Автор: DimaSiK 2.6.2007, 20:02
Цитата

Если у человека предпочтений нет, то посмотреть с какой он страны и выбрать наиболее подходящий для этой страны.

У меня намечается максимум три языка - рус,укр и eng. Предложение очень хорошее насчет автоматического выбора языка, сразу же заинтересовало. Определение откуда человек приходит делается с помощью geoip?

Цитата

Как организовать структуру - твои личные проблемы.

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

Автор: Golda 2.6.2007, 20:45
rMaveric, добавлю к Вашему алгоритму еще один пункт. Кроме geoip, возможно, перед ним, можно использовать приоритеты броузера (Accept-Language header)). Спасибо за мысли о удобствах/неудобствах автоматического определения языка для поисковиков. Не думала об этом.


DimaSiK, вопрос организации многоязыкового сайта - это во многом, вопрос выбора шаблонов. Возможно, Вам будет интересно взглянуть на недавний опрос http://forum.vingrad.ru/forum/topic-153482.html.
Я предпочитаю вариант XML/XSL, при котором одному XSL-темплейту соответствуют несколько XML, отличающиеся языками. А подводные камни при работе с языками - как всегда - кодировки. Меньше проблем, если работать с UTF-8.

Автор: rMaveric 2.6.2007, 20:52
Цитата(DimaSiK @  2.6.2007,  20:02 Найти цитируемый пост)
У меня намечается максимум три языка - рус,укр и eng. Предложение очень хорошее насчет автоматического выбора языка, сразу же заинтересовало. Определение откуда человек приходит делается с помощью geoip?

много модулей есть, которые определяют нахождение человека, но далеко не все установлены у провайдеров, возможно прийдется использовать какое нибуть решение на php, если у прова не установлено ничего. А в общем geoip или mod_geo удовлетворят полностью.


Цитата(DimaSiK @  2.6.2007,  20:02 Найти цитируемый пост)
Всетаки хотелось узнать как правильно и как легче будет организовать многоязычность, высмысле легче для последующих и нежелательных изменений в структуре сайта. 

Заставляешь повторяться. Все зависит от структуры, какую ты выберешь для сайта. Если будешь использовать БД, то достаточно просто внести дополнительное поле указывающее язык. Можно создать отдельные таблицы для каждого языка, но смысла в этом не вижу. Эти два метода будут быстрыми, но тяжело будет делать перевод (учитывать все фразы). Можно таблицы контента сразу делать под несколько языков например
Код

|id|ru|ua|en|

А если БД использовать не хочешь (сайт более статистический, чем динамический или предполагаемый хостер не дает БД), то лучше всего создать папку для контента, а в ней подпапки для локализаций. Выбор за тобой... И до полного анализа задания определить что будет лучше невозможно.

Добавлено через 6 минут и 26 секунд
Цитата(Golda @  2.6.2007,  20:45 Найти цитируемый пост)
rMaveric, добавлю к Вашему алгоритму еще один пункт. Кроме geoip, возможно, перед ним, можно использовать приоритеты броузера (Accept-Language header)).


Цитата(rMaveric @  2.6.2007,  19:17 Найти цитируемый пост)
1. Если у человека установлены предпочтения, то выставить язык согласно предпочтениям

Первый пункт о предпочтениях и был о Accept-Language 

Автор: Golda 2.6.2007, 22:09
Цитата(rMaveric @  2.6.2007,  20:52 Найти цитируемый пост)
Цитата(rMaveric @  2.6.2007,  19:17 Найти цитируемый пост)
1. Если у человека установлены предпочтения, то выставить язык согласно предпочтениям

Первый пункт о предпочтениях и был о Accept-Language  


А ok, я думала, Вы имели ввиду какой-то вариант профиля пользовтеля, где он сам может указать свои предпочтения явно

Автор: DimaSiK 6.6.2007, 22:12
Страница ведь имеет два вида контента: контент - наполняющая сайт информация и контент - имена конпок, ссылки и так далее. Каким образом мне их разграничить по языкам?, стоит ли допустим все что касается кнопок, ссылок храняить как описание  в xml файлах, допустим rus_xml, eng_xml, а данные распределить в БД учитывая языки? 

Автор: Golda 6.6.2007, 22:46
Если контент предполагается обширный, будет быстро добваляться, статьи относительно независимы, важна возможность поиска... Вам к базам данных, и тот вариант, что Вы предложили, вполне нормален. Но продумайте, что именно будет единицами хранения в ячейках базы, как отделить контент от его оформления. Если важнее возможность добавления/редактирования страниц непрофессионалами, разделение труда между контенщиками и web-мастерами, страниц относительно немного, но они требуют принципиально разного оформления, выбирайте файловую систему и, как посоветовал rMaveric, лучше разделите контент по языковым папкам.

Автор: DimaSiK 6.6.2007, 23:46
Вот какое решение я надумал:
Значит существует директория language, в ней соответственно /eng /rus, в данных директориях лежат xml файлы описывающие все кнопки, ссылки, одним словом весь функционал. Причем каждый файл описывает одну страницу - main_eng.xml описывает main.php и так далее. БД реализована так же для поддержки языков. При первом заходе на main.php выбирается язык по умолчанию, например rus, далее топаем в нужную языковую директорию и загружаем нужный xml с помощью DOM - main_rus.xml. После этого выбираем нужные языковые данные из ДБ  и выставляем их в структуру загруженного xml. Последний этам это уже наложение XSLT на XML и отдача страницы в браузер. Помоему все получается все очень даже хорошо. Для добовления нового языка и новой страницы нужно добавить языковую директорию и xml файл, описывающий функционал страницы, а далее все описано выше. Скажите минусы моей затеи?  

Автор: Daevaorn 7.6.2007, 01:03
А в библиотеке php есть gettext? Если, есть то многие проблемы интернационализации пропадают.

Автор: DimaSiK 7.6.2007, 07:45
Нет, gettext не хочу пробовать!

Автор: rMaveric 7.6.2007, 07:56
1. Медленно
2. Для каждой страницы грузить отдельный файл необосновано слишком много повторений будет

Автор: Golda 7.6.2007, 08:37
DimaSiK, не очень поняла, зачем база данных, если для каждой страницы и так предполагается отдельный XML. Почему бы в нем же не хранить, кроме текстов элементов оформления, еще и сам контент? Я бы отделяла оформление от контента секциями в одном XML. Зачем морочить себе голову, поддерживая дополнительно еще и базу и замедляя формирование страниц (ведь при таком подходе нужно еще потратить время на формирования XML), уменьшая надежность (база данных - дополнительный элемент, за рабочим состоянием которого нужно следить), а возможно, и добавляя проблем с безопасностью. 

Впрочем, возможно, для Вас из каких-то соображений важно мпксимальное разделение контента и оформления. Например, важны возможности поиска, предоставляемые базой, изменением контента и оформления занимаются разные люди, часть страниц на самом деле задает не единственный варинт страницы, а целый класс, где содержимое меняется, а оформление остается... 

В общем, без анализа Вашей конкретной задачи правильность решения оценить нельзя. Но если принять за аксиому, что база данных нужна, описание звучит неплохо. Но сответую еще добавить какой-нибудь общий XML для каждого языка, чтобы не дублировать общие элементы оформления (текст копирайта, title илм его общая часть, текст пунктов меню... что-нибудь найдется). Также для системы в целом может понадобиться разделяемый XML для общих настроек (URL пунктов меню, непереводимые элементы оформления...) В принципе есть выбор, общие настройки можно хранить и в php-файле конфигурации, и в базе данных. Но на мой взгляд, настройкам, связанным с UI самое место в XML.

(Прочитала сообщение rMaveric).
1. Проблемы со скоростью можно решать кешированием на стороне сервера
2. Да, для XSL тоже часто получаются общие подключаемые файлы с темплейтами, а иногда имеет смысл создать дефолтовый XSL для самого распространенного варианта страниц

Автор: DimaSiK 7.6.2007, 09:18
2Golda Представь, если у меня будет хотя бы 100 новосетй, как думаешь лучше их хранить в БД или же в xml файлах, хотя бы если организовывать поиск по новостям?  Так как контентное наполнение будет довольно таки большим, я и решил, что лучше его хранить в БД, тем более оно будет на разных языках, не создавать же мне десятки xml файлов для этого, а потом смотреть где что находиться, выйдет путаница и в связи с количесвом даннм разростуться xml файлы.   

Автор: Golda 9.6.2007, 19:09
Согласна, лучше в базе. Соответсвенно xml и xsl-файлы должны определяться типом страницы (для каждой новости отдельный xml и xsl не нужен).


Автор: DimaSiK 9.6.2007, 21:19
Цитата(Golda @ 9.6.2007,  19:09)
Согласна, лучше в базе. Соответсвенно xml и xsl-файлы должны определяться типом страницы (для каждой новости отдельный xml и xsl не нужен).

Конечно не нужен, отдельный xml и xsl нужен только для основных сраниц(новостей, главной и так далее). Я так понимаю мой вариант не плохой и одобряется? 

Автор: Golda 9.6.2007, 22:11
Думаю, да. Если возникнут проблемы со скоростью, реализуйте средствами php кеширование на стороне сервера. Средствами php - чтобы сервер не запутался в случаях, когда на один и тот же запрос нужно выдавать разные страницы (страницы на разных языках). Но это я забегаю вперед. Проблемы надо решать по мере их поступления  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)