Лекции     Книги     Рефераты    
Диплом, курсовая на заказ

Создание мультиязычности на сайте

news date июля.07.2008    categories Web-программирование > PHP    comments (5)

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

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

Создаются на сервере папки с названием /ru, /eng, /fr и т.д. В каждую папку заносится по полной копии исходного сайта, затем каждая копия редактируется под соответствующий язык. Думаю, весь кошмар такой реализации понятен итак, но я выделю несколько моментов. Первое – если у вас сайт состоит из одной страницы «О Вас» – то реализовать её на нескольких языках таким способом, очень даже неплохой вариант. Но если сайт у Вас состоит из 200 страниц? Если Вас попросят добавить новый язык на Ваш сайт к завтрашнему дню – сможете? Нет, не сможете. Захотите исправить пару абзацев текста в одной из 1000 статей. Сколько у Вас уйдет на это времени для 5 копий сайтов на 5 языках? Думаю, ответы очевидны и этот способ уже Вам должен не нравиться.

Способ номер два. Продвинутый, хороший, ПОЧТИ оптимальный способ реализации мультиязычности.

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

phrase_id

phrase_name

phrase_rus

phrase_eng

0

page_title_1

Добро пожаловать!

Welcome!

1

page_header_1

О нас

About us

2

page_header_2

Как Ваши дела?

How are you?

Итак, ещё раз смысл данного решения. В наших html файлах, точнее *.tpl файлах (если Вам ещё не известно это расширение – ознакомьтесь с данной статьей) никакого текста нету! Ни буквы человеческого текста. Вместо текста у нас там идут константы, по типу page_title_1, page_header_2, page_text и т.д. и т.п. В нашем php файле мы извлекаем из таблицы всего два столбца – первый – это phrase_name (с именованием констант), второй – столбец, соответствующий выбранному языку на сайте (допустим, выбран английский, мы извлекаем phrase_eng). После этого, полученный массив имен фраз и их значений мы просто передаем нашему smarty шаблону, который уже вместо констант подставляет полученные значения фраз. Все готово – удобно, просто и хорошо. Теперь зададимся несколькими вопросами. Первое – как нам добавить новый язык? Для добавления нового языка, необходимо добавить новый столбец в нашу таблицу, в котором будут описаны все фразы на нужном нам языке. Чтобы это сделать, необходимо изменить базу данных, что представляет собой достаточно не тривиальный процесс. Попросить Вашего менеджера добавить новый язык на сайт – Вы уже не сможете. Наконец, существует достаточно большая практика, которая заключается в том, что пользователи сайта осуществляют перевод на свой язык сами. Для этого им необходимо предоставить список фраз всего сайта. Этот сбор прост – выбор из базы, но также требует некоторых усилий и времени. Рассмотрим способ, который лишен всех этих недостатков!

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

Первым делом, создаем папку на нашем сервере – я назову её configs. В ней размещаем файлы с расширением *.conf. Я создал RU_LANG.conf и EN_LANG.conf. Содержимое наших файлов будет представлять собой описание фраз-констант нашего сайта.

Файл RU_LANG.conf:

pageTitle = “Добро пожаловать на наш сайт!”

welcome = “Добро пожаловать, ”

already_registered = “Вы уже зарегистрированы в системе”

already_logged = “Вы уже авторизированы в системе”

menuTitle1 = “О нас”

menuTitle2 = “Регистрация”

menuTitle3 = “Авторизация”

page1_phrase1 = “Добро пожаловать на наш сайт!”

Файл EN_LANG.conf соответственно:

pageTitle = “Welcome to our home page!”

welcome = “Welcome, ”

already_registered = “You’ve already registered”

already_logged = “You’ve already logged in”

menuTitle1 = “About Us”

menuTitle2 = “Register”

menuTitle3 = “Login”

page1_phrase1 = “Welcome to our homepage!”

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

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

if ($_POST['change_lang'] == ‘true’)

{

$lang_id = $_POST['lang'];

$_SESSION['lang_id'] = $lang_id;

$tmp = file(“filenames2strings.conf”);

$i=0;

foreach($tmp as $v)

{

if ($i == $lang_id)

{

$tmp2 = explode(‘=’,$v);

$_SESSION['lang_fname'] = trim($tmp2[0]);

break;

}

$i++;

}

$this->smarty->assign(“fname”,$_SESSION['lang_fname']);

}

filename2strings.conf хранит следующие значения:

EN_LANG.conf=English

RU_LANG.conf=Русский

Строчку $this->smarty->assign Вы должны заменить на что-то типа $smart->assign(… Где $smart – объект smarty (как создать его описано здесь). После этого, наш шаблон будет знать, какой языковой файл ему подключить – его название будет храниться в переменной fname.

Пора создать сам наш шаблон. Он будет очень простым.

{config_load file=”$fname”}

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=Windows-1251″/>

<title>{#pageTitle#}</title>

</head>

<body>

<table width=”100%” cellpadding=”0″ cellspacing=”0″>

<tr>

<td>

<table width=”100%” border=”0″>

<tr>

<td>

<h1><a href=”#”>LOGO</a></h1>

</td>

<td align=”right”>

<form {$formSelectLanguage.attributes}/>

{$formSelectLanguage.lang.html}

<input type=”hidden” value=”true” name=”change_lang” id=”change_lang”/>

</form>

</td>

</tr>

</table>

</td>

</tr>

<tr>

<td>

{include file=”menu.tpl”}

</td>

</tr>

<tr>

<td>

{#page1_phrase1#}

</td>

</tr>

</table>

</body>

</html>

Разберём подробнее данный шаблон. Первой строчкой мы подключаем нужный нам языковой файл. В теге title мы указываем используя специальный smarty-синтаксис для конфигурационных констант title нашей страницы – {#pageTitle#} – где pageTitle – имя константы, описанной в языковых конфигурационных файлах. Далее в шаблоне у нас есть форма смены языков (если Вы захотите тестировать этот пример, уберите её, потому что она использует некоторые расширения библиотеки PEAR, о которых мы поговорим в других статьях), подключение файла с меню, и вывод ещё одной фразы на страницу. Все очень просто.

А теперь подумайте, насколько простой стала Ваша жизнь в плане администрирования языков на сайте. Во-первых, добавить новый язык просто как никогда: добавляете новый файл с переведёнными фразами. Добавляете одну строчку пояснений в файл filename2strings.conf. Все! Во-вторых, Вам написал посетитель сайта из Франции, который решил перевести сайт на свой язык. Вы просто пересылаете ему файл EN_LANG.conf – он переименовывает его в FR_LANG.conf, переводит все фразы с английского на французский и возвращает его Вам. После этого, через буквально 5 минут – новый язык на Вашем сайте уже доступен для всех!

Итак, подведём итог. Для реализации данного способа мультиязычности Вам необходимо создать языковые файлы, создать Smarty-шаблон, выбрать в php-скрипте имя файла, которое должно подключаться, передать его в шаблон и все!

Успехов Вам!


Обсуждения

5 комментариев к “Создание мультиязычности на сайте”
  1. shedy пишет:

    Отличный способ и отличный класс этот smarty и отличный сайт

  2. Андрей пишет:

    Спасибо за способ. Но всё же вопрос: что же не тривиального Вам видится в процессе добавления всего одного столбца в существующую БД? :) .

  3. Гость пишет:

    В процессе добавления – ничего не тривиального. А вот, когда захочется обновить/добавить/удалить значение – имхо гораздо проще это сделать с файлом.

  4. smertnik77 пишет:

    А как быть с кодировкой при аякс подгрузке? Какая универсальная кодировка для всех языков? Или к каждому своя?

  5. Дмитрий пишет:

    Способ работает исключительно для интерфейса и не работает для динамического контента вообще. Это я про тот, что тут очень подробно описан.

Добавить комментарий

Вы должны войти



© 2009 - 2010 | Webteach.ru | Образовательный портал