Алексей Гоголев
Глава 3. Запускаем symfony
Как стало ясным из предыдущих глав, фреймворк symfony это совокупность файлов написанных на PHP. Их использует проект symfony. Установить symfony означает получить эти файлы и сделать их доступными для проекта.Symfony нужен PHP5, так как фреймворк написан на PHP5. Убедится в том, что PHP установлен, можно набрав в консоли команду:
> php -v
PHP 5.2.0 (cli) (built: Nov 2 2006 11:57:36)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies
Если версия не ниже 5.0, то вы готовы к установке, которая описывается в этой главе.
Установка Sandbox
sandbox — (англ.) песочница для детских игр
Если вы хотите увидеть на что способен symfony, возможно понадобится быстрая установка. В таком случае, вам подойдет sandbox.
Sandbox это обыкновенный архив. Он содержит пустой проект symfony, и включает в себя все необходимые библиотеки (symfony, pake, lime, Creole, Propel, и Phing), стандартное приложение (default application), и базовую конфигурацию. Для работы sandbox версии, не нужны какие либо специфические настройки сервера или дополнительные пакеты.
Для установки скачайте sandbox архив по ссылке http://www.symfony-project.com/get/sf_sandbox.tgz и распакуйте в корневую web директорию вашего сервера (обычно web/ или www/; проще говоря, в директорию на которую указывает DocumentRoot). Для простоты изложения будем считать, что архив был распакован в директорию sf_sandbox/.
Все файлы содержатся в корневой web директории — это нормально для рабочей машины (localhost), но плохо для реального сервера. Ведь тогда вся начинка приложения доступна пользователю.
Убедиться в успешной установке можно через интерфейс командной строки, который предоставляет symfony. Зайдите в свежесозданную директорию sf_sandbox/ и наберите следующие команды:
Для *nix систем:
> ./symfony -V
Для Windows:
> symfony -V
Вы должны увидеть номер версии sandbox:
symfony version 1.0.0
Теперь можно убедиться, что сервер настроен правильно, запросив URL:
http://localhost/sf_sandbox/web/frontend_dev.php/
Вы должны увидеть поздравительную страницу (congratulations page), изображненную на Рисунке 3–1. Это означает что установка завершена. Если странички нет, сообщение об ошибке подскажет какие изменения в настройках необходимы. Также можно обратиться к разделу «Устранение неисправностей» этой главы.
Рисунок 3–1 – Поздравительная страница sandbox
Sandbox предназначен для тренировки с symfony на локальной машине, а не для разработки сложных приложений, которые должны реально работать в сети. Однако, версия symfony заключенная в sandbox полнофункциональна и эквивалентна версии, которую можно установить через PEAR.
Чтобы удалить sandbox, просто удалите директорию sf_sandbox/.
Установка Библиотек Symfony
Когда вы будете разрабатывать приложение, вам возможно понадобится установить symfony дважды: один раз на рабочую машину (development environment), и еще один раз на хостинг (host server). Для каждого случая, можно избежать повторений, и хранить все файлы symfony в одном месте, независимо от того, разрабатывайте вы одно приложение или несколько.
Symfony развивается очень быстро, новая стабильная версия (stable version) может появится всего через несколько дней после вашей первой установки фреймворка. И в ваших интересах как можно быстрее обновить (upgrade) symfony. Это еще одна причина, по которой все проекты должны использовать один экземпляр библиотек symfony.
Для реальной разработки установить библиотеки можно двумя способами:
- Установка через PEAR, рекомендуется в большинстве случаев. Библиотеки легко обновлять и они могут быть используемы несколькими проектами сразу. Процесс установки — простой.
- Установка через Subversion (SVN) подразумевает, что вы опытный PHP разработчик, который хочет использовать преимущества последних патчев (patch), добавлять в фреймворк свои возможности (feature), и/или помогать развивать symfony.
Symfony интегрирует несколько других пакетов:
- pake, это CLI утилита.
- lime, утилита для юнит тестирования.
- Creole это database abstraction layer. Как и PHP Data Objects (PDO), он является прослойкой между кодом разработчика и SQL запросами к базе. Благодаря Creole в любой момент можно перейти на другую базу данных.
- Propel — ORM. Благодаря Propel запросы к базе осуществляются на «объектном» языке.
- Phing, CLI для Propel.
Pake и lime разработаны командой symfony. Creole, Propel, и Phing сделаны другой командой и выпущены с лицензией GNU Lesser Public General License (LGPL). Symfony связан со всеми этими пакетами.
Установка Symfony через PEAR
Пакет symfony в PEAR содержит библиотеки symfony, и все от чего они зависят. Он также содержит скрипт, который расширит возможности CLI, добавив команды symfony. Первый шаг установки — найти канал symfony в PEAR, с помощью команды:
> pear channel-discover pear.symfony-project.com
Чтобы посмотреть список библиотек доступных через этот канал, воспользуйтесь командой:
> pear remote-list -c symfony
Теперь вы готовы установить последнюю стабильную версию symfony (stable version). Введите команду:
> pear install symfony/symfony
downloading symfony-1.0.0.tgz ... Starting to download symfony-1.0.0.tgz (1,283,270 bytes) ................................................................. ................................................................. .............done: 1,283,270 bytes install ok: channel://pear.symfony-project.com/symfony-1.0.0
Вот и все. Файлы symfony и CLI теперь установлены. Убедится в том, что установка прошла успешно можно запросив версию фреймворка, через команду консоли:
> symfony -V symfony version 1.0.0
Если вы хотите установить бета версию, с самыми свежими исправлениями и улучшениями, следует использовать команду pear install symfony/symfony-beta вместо pear install symfony/symfony.
Бета версии не вполне стабильны, и не рекомендуются для установки на реальные сервера.
Библиотеки symfony будут установлены в следующие директории:
- $php_dir/symfony/ содержит основные библиотеки.
- $data_dir/symfony/ содержит базовую структуру для приложений symfony; стандартные модули (default modules); и настройки, данные i18n, и пр.
- $doc_dir/symfony/ содержит документацию.
- $test_dir/symfony/ содержит юнит тесты.
Переменные _dir являются частью настроек PEAR. Чтобы увидеть значения переменных воспользуйтесь командой:
> pear config-show
Установка Symfony из SVN Репозитория
Для реальных серверов (production server), если вы решили отказаться от PEAR, можно скачать последнюю версию библиотек symfony напрямую из Subversion репозитория symfony, воспользовавшись командой checkout:
> mkdir /path/to/symfony > cd /path/to/symfony > svn checkout http://svn.symfony-project.com/tags/RELEASE_1_0_0/ .
Команды symfony, доступные в случае установки через PEAR, фактически вызывают скрипт /path/to/symfony/data/bin/symfony. То есть, следующее будет эквивалентным команде symfony –V :
> php /path/to/symfony/data/bin/symfony -V symfony version 1.0.0
Если вы выбрали установку через SVN, то возможно у вас уже есть проект symfony. Для того чтобы проект мог использовать все необходимые библиотеки, нужно задать две переменные в файле config/config.php как показано ниже:
<?php
$sf_symfony_lib_dir = '/path/to/symfony/lib/';
$sf_symfony_data_dir = '/path/to/symfony/data/';
В Главе 19 описываются другие способы указать проекту на файлы symfony (в том числе через symbolic link и relative path)
Вы также можете скачать PEAR пакет (http://pear.symfony-project.com/get/symfony-1.0.0.tgz) и распаковать его. Результат будет таким же, как если бы вы сделали checkout.
Создание Приложения
Как стало ясно из Главы 2, связанные между собой приложения содержатся в одном проекте. Все приложения проекта используют базу данных. Для того чтобы создать приложение, сначала нужно создать проект.
Создание Проекта
Любой проект symfony имеет определенную файловую структуру. Благодаря командам консоли создание проекта автоматизировано — symfony сам построит дерево директорий и выставит права доступа. Чтобы создать проект нужно создать новую директорию и воспользоваться командой symfony.
В случае установки через PEAR, следует использовать такие команды:
> mkdir ~/myproject > cd ~/myproject > symfony init-project myproject
Если symfony установлен через SVN, то создать проект можно с помощью таких команд:
> mkdir ~/myproject > cd ~/myproject > php /path/to/symfony/data/bin/symfony init-project myproject
Команды symfony следует вызывать из корневой директории проекта (myproject/ в предыдущих примерах), поскольку выполняемые командой действия касаются конкретного проекта.
Symfony создаст следующие директории:
apps/ batch/ cache/ config/ data/ doc/ lib/ log/ plugins/ test/ web/
Команда init-project добавит скрипт symfony в корень проекта. Этот php скрипт делает то же, что и команды symfony установленные через PEAR. Теперь вы можете вызывать php symfony вместо symfony, если использовать команды консоли symfony нельзя (в случае установки через SVN).
Создание Приложения (Application)
Пока что проект пуст и смотреть в нем нечего. Нужно создать хотя бы одно приложение (application). Чтоб инициализировать приложение (application) используйте команду symfony init-app, дописав в качестве аргумента имя:
> symfony init-app myapp
Эта команда создаст директорию myapp/ в папке apps/, со стандартным набором поддиректорий и конфигурационными файлами, которые содержат настройки приложения по умолчанию:
apps/ myapp/ config/ i18n/ lib/ modules/ templates/
Также в папке web/ будут созданы два PHP файла соответствующее двум фронт-контроллерам (front controller) — по одному на режим:
web/ index.php myapp_dev.php
Index.php это фронт-контроллер свежесозданного приложения, соответствующий рабочей среде (production front controller). Так как myapp это первое приложение, symfony создал файл index.php вместо myapp.php (В дальнейшем, если вы, например, создадите приложение newmyapp, новый рабочий фронт-контроллер будет называться newmyapp.php). Для того чтобы запустить приложение в режиме разработки (development environment), запустите myapp_dev.php. Вы узнаете больше об этих режимах в Главе 5.
Приведу здесь переводы терминов:
- Production environment — рабочяя среда, рабочий режим
- Development environment — среда разработки, режим разработки
переводчик
Настройка Веб Сервера
Скрипты хранящиеся в директории web/ это точки входа в приложение. Для того чтоб пользователь мог достичь их из Internet, необходимо настроить веб сервер. На вашем сервере разработки, так же как и на профессиональных хостингах, у вас возможно есть доступ к настройкам Apache и вы можете настроить свой виртуальный хост (virtual host). Но в случае shared-host сервера, вы располагаете только файлом .htaccess.
Настройка Виртуального Хоста
В листинге 3–1 приведен пример добавления нового виртуального хоста (virtual host) для сервера Apache.
Листинг 3–1 – Пример настроек Apache, в файле apache/conf/httpd.conf
<VirtualHost *:80> ServerName myapp.example.com DocumentRoot "/home/steve/myproject/web" DirectoryIndex index.php Alias /sf /$sf_symfony_data_dir/web/sf <Directory "/$sf_symfony_data_dir/web/sf"> AllowOverride All Allow from All </Directory> <Directory "/home/steve/myproject/web"> AllowOverride All Allow from All </Directory> </VirtualHost>
В листинге 3–1, путь /path/to/symfony/data нужно заменить на реальный путь. Например, в случае PEAR установки и *nix системы, будет что-то вроде этого:
Alias /sf /usr/local/lib/php/data/symfony/web/sf
Прописывать alias для директории web/sf/ не обязательно. Но этот alias позволит Apache находить изображения, таблицы стилей, и .js файлы. Все это понадобится для панели отладки, генератора админинтерфейса, стандартных страничек symfony, и для использования Ajax. Как альтернатива alias можно создать символическую ссылку (symbolic link, symlink) или же скопировать директорию /path/to/symfony/data/web/sf/ в myproject/web/sf/.
Осталось только перезапустить Apache и все. Новое приложение можно вызвать, набрав в браузере URL:
http://localhost/myapp_dev.php/
Вы должны увидеть поздравительную страницу похожую на ту, что была приведена выше на Рисунке 3–1.
URL Rewriting
Symfony использует URL rewriting для отображения «красивых url» (smart URLs) — осмысленные адреса, удобные для поисковых машин (search engine), скрывают всю техническую информацию от пользователя. Подробнее об этой возможности (routing) в Главе 9.
Если ваш Apache скомпилирован без модуля mod_rewrite, убедитесь что у вас есть установленный mod_rewrite Dynamic Shared Object (DSO), и следующие строки присутствуют в httpd.conf:
AddModule mod_rewrite.c LoadModule rewrite_module modules/mod_rewrite.so
Для Internet Information Services (IIS), вам понадобится установленный и запущенный isapi/rewrite. Детальная инструкция по установке для IIS доступна на сайте проекта.
Настройка Shared-Host Сервера
Установка приложения на shared-host чуть сложнее, так как структура директорий фиксирована и вы не можете ее поменять.
Заниматься разработкой и тестированием непосредственно на shared-host — плохая привычка. Одна из причин — приложение еще не закончено, но уже доступно извне. Это открывает внутреннюю работу и делает видимыми дыры в системе безопасности (security). Еще одна причина — shared-host часто не обеспечивает достаточного быстродействия для работы над приложением с использованием инструментов отладки. Вы не должны начинать разработку с установки на shared-host, лучше работать над приложением на своей локальной машине, и после того как проект будет закончен, установить его на shared-host. Глава 16 описывает методы и средства установки проекта на реальные сервера.
Представим на минутку, что web директория на shared-host называется www/ вместо web/, и что у вас есть доступ только к файлу .htaccess, но не к httpd.conf.
К счастью, в проекте symfony любой путь к директории можно задать. Глава 19 расскажет больше об этом. В нашем же случае мы можем поменять имя web директории с web/ на www/, и соответственно перенастроить проект, как показано в листинге 3–2. Эти строки должны быть добавлены в конец файла config.php.
Листинг 3–2 – Изменение настроек структуры директорий, в файле apps/myapp/config/config.php
$sf_root_dir = sfConfig::get('sf_root_dir');
sfConfig::add(array(
'sf_web_dir_name' => $sf_web_dir_name = 'www',
'sf_web_dir' => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_web_dir_name,
'sf_upload_dir' => $sf_root_dir.DIRECTORY_SEPARATOR.$sf_web_dir_name.
DIRECTORY_SEPARATOR.sfConfig::get('sf_upload_dir_name'),
));
По умолчанию web директория проекта содержит файл .htaccess. Содержимое файла приведено в листинге 3–3. Изменяйте его по мере необходимости, для того чтоб ваш проект соответствовал правилам shared-host.
Листинг 3–3 – Содержимое .htaccess, в myproject/www/.htaccess
Options +FollowSymLinks +ExecCGI <IfModule mod_rewrite.c> RewriteEngine On # we skip all files with .something RewriteCond %{REQUEST_URI} ..+$ RewriteCond %{REQUEST_URI} !.html$ RewriteRule .* - [L] # we check if the .html version is here (caching) RewriteRule ^$ index.html [QSA] RewriteRule ^([^.]+)$ $1.html [QSA] RewriteCond %{REQUEST_FILENAME} !-f # no, so we redirect to our front web controller RewriteRule ^(.*)$ index.php [QSA,L] </IfModule> # big crash from our front web controller ErrorDocument 500 "<h2>Application error</h2>symfony applicationfailed to start properly"
Теперь можно просмотреть ваше приложение. Загрузите поздравительную страничку запросив URL:
http://www.example.com/myapp_dev.php/
Другие Настройки Сервера
Symfony может быть настроен и про другому. Например, можно использовать alias вместо виртуального хоста (virtual host), для настройки сервера. Также можно запускать приложения symfony на сервере IIS. Путей много, их описание не является целью этой книги. Обратитесь к wiki (http://www.symfony-project.com/trac/wiki), если вас интересуют специфические конфигурации сервера. Wiki содержит много пошаговых туториалов и инструкций.
Устранение проблем (Troubleshooting)
Если вы столкнулись с проблемами во время установки, попытайтесь извлечь максимальную пользу из информации об ошибках, которая будет отображена в вашем браузере или консоли (шелле). Часто эта информация содержит необходимые объяснения, или даже ссылки на конкретные веб странички посвященные данной ошибке.
Типичные проблемы
Если у вас все еще есть проблемы с запуском symfony, проверьте следующее:
- Некоторые установки php включают в себя команды PHP4 и PHP5. В этом случае в консоли следует использовать не php, а php5. Попробуйте вызвать php5 symfony вместо команды symfony. Возможно еще понадобится добавить SetEnv PHP_VER 5 в настройки .htaccess, или переименовать скрипты директории web/ с .php на php5. Ошибка, которую выдает PHP4, пытаясь получить доступ к symfony, выглядит примерно так:
Parse error, unexpected #039;,', expecting '(' in .../symfony.php on line 19.
- Предел памяти, определенный в php.ini, должен быть не меньше 16M. Часто симптомом этой проблемы является сообщение об ошибке при установке через PEAR или при использовании командной строки:
Allowed memory size of 8388608 bytes exhausted
- Настройка zend.ze1_compatibility_mode в php.ini должна быть отключена (выставлено значение off). Если же эта установка включена, то при попытке запустить скрипт в браузере, возникнет ошибка implicit cloning:
Strict Standards: Implicit cloning object of class #039;sfTimer'because of 'zend.ze1_compatibility_mode'
- Сервер должен иметь права на запись в директории log/ и cache/. Попытка запустить приложение symfony в браузере, не настроив права доступа к этим папкам, приведет к следующей ошибке:
sfCacheException [message] Unable to write cache file"/usr/myproject/cache/frontend/prod/config/config_config_handlers.yml.php"
- Include path вашей системы должен содержать путь к команде php, а include path в php.ini путь к PEAR (если вы используйте PEAR).
- Иногда сервер использует несколько php.ini (например, в случае пакета WAMP). Вызовите phpinfo(), чтоб узнать какой именно php.ini используется вашим приложением.
Для улучшения быстродействия, настоятельно рекомендуется выставить установки magic_quotes_gpc и register_globals на значение off в вашем php.ini
Ресурсы Symfony
Возможно кто-то уже сталкивался с вашей проблемой, и для нее уже есть готовые решения. Поискать их можно тут:
- Форум symfony посвященный установке (http://www.symfony-project.com/forum/) содержит много информации касательно платформ, установки
- Можно найти ответ на свой вопрос в архивах писем из рассылки (users mailing-list) по адресу http://groups.google.fr/group/symfony-users.
- Wiki (http://www.symfony-project.com/trac/wiki#Installingsymfony) содержит пошаговые туториалы и инструкции об установке, написанные пользователями.
Если вы все же не нашли решения свей проблемы, вынесете ее на обсуждение в сообщество symfony (symfony community). Вы можете задать вопрос на форуме, отослать письмо в список рассылки (mailing list), или даже обсудить все вживую с наиболее активными участниками сообщества в IRC канале #symfony.
Контроль Версий (Source Versioning)
После того как проект создан рекомендуется начать процесс контроля версий (source versioning). Система контроля версий хранит след всех изменений сделанных в коде, обеспечивает доступ к предыдущим версиям проекта, упрощает наложение заплаток (patching), и обеспечивает эффективную работу команды. Symfony поддерживает CVS, хотя рекомендуется использовать Subversion (http://subversion.tigris.org/). Следующие примеры иллюстрируют команды Subversion, и подразумевают, что вы уже установили сервер Subversion и теперь хотите создать новый репозиторий для вашего проекта. Для пользователей Windows рекомендуется использовать клиент TortoiseSVN (http://tortoisesvn.tigris.org/). Обратитесь к документации Subversion, чтоб узнать больше о контроле версий и используемых командах.
Немного ссылок на википедию
переводчик
Следующий пример подразумевает, что $SVNREP_DIR задана как переменная среды (environment variable). Если же это не сделано, то просто замените $SVNREP_DIR на реальный путь к репозиторию.
В дальнейшем важно понимать, что и репозиторий и проект, который мы стремимся добавить в репозиторий, находятся на одной машине
переводчик
Итак, давайте создадим новый репозиторий для проекта myproject.
> svnadmin create $SVNREP_DIR/myproject
Затем базовая структура репозитория создается из директорий trunk, tags, и branches следующей длинной командой:
> svn mkdir -m "layout creation" file:///$SVNREP_DIR/myproject/trunk file:///$SVNREP_DIR/myproject/tags file:///$SVNREP_DIR/myproject/branches
Теперь приступим к первой ревизии (revision). Необходимо импортировать все файлы проекта, кроме файлов кэша и журналов событий (логов):
> cd ~/myproject > rm -rf cache/* > rm -rf log/* > svn import -m "initial import" . file:///$SVNREP_DIR/myproject/trunk
Проверим успешно ли прошла передача файлов, набрав в консоли:
> svn ls file:///$SVNREP_DIR/myproject/trunk/
Похоже все прошло успешно. Теперь в репозитории хранится контрольная версия (и история) всех файлов вашего проекта. Далее нужно установить соответствие между файлами исходной папки /myproject/ и файлами хранящимися в репозитории. Чтобы сделать это, прежде всего переименуйте директорию myproject/ (если все пойдет по плану, скоро вы ее удалите) и сделайте checkout в новую директорию.
Прокомментирую этот абзац. Дело в том, что после импорта проекта в репозиторий, соответствие межу файлами исходного проекта и файлами проекта хранящегося в репозитории все еще не установлено. Чтобы установить это соответствие исходная директория с проектом удаляется, и делается checkout в новую директорию. Таким образом, в новую папку скачиваются файлы проекта из репозитория, и в итоге мы имеем рабочую версию проекта, «связанную» с проектом хранящимся в репозитории.
переводчик
> cd ~ > mv myproject myproject.origin > svn co file:///$SVNREP_DIR/myproject/trunk myproject > ls myproject
Вот и все. Теперь вы можете работать с файлами в папке /myproject/, и фиксировать (commit) изменения в репозитории. Не забудьте удалить бесполезную теперь директорию myproject.origin/.
Осталось сделать последние шаги. Если вы фиксируйте (commit) вашу рабочую версию в репозитории, то будут переданы и нежелательные файлы, такие как файлы папок cache/ и log/. Поэтому нужно задать перечень директорий и файлов которые нужно игнорировать (ignore list). Также нужно снова выставить права на запись для папок cache/ и log/.
> cd ~/myproject > chmod 777 cache > chmod 777 log > svn propedit svn:ignore log > svn propedit svn:ignore cache
Должен открыться, заданный для SVN, текстовый редактор по умолчанию. Если этого не произошло, используйте ваш любимый редактор, прописав его в команде:
> export SVN_EDITOR=<name of editor>
> svn propedit svn:ignore log
> svn propedit svn:ignore cache
Теперь просто добавьте все поддиректории myproject/, которые должны игнорироваться SVN при фиксации (commit):
*
Сохраните и выйдете. Вот и все.
Итого
Чтоб играться и исследовать symfony больше всего подходит заранее настроенный sandbox.
Установка через PEAR или через SVN подойдет для реальной разработки, или в случае установки на сервер. Вы получите установленные библиотеки symfony, но вам понадобится создать проект и приложение самому. Последний шаг — конфигурация веб сервера, которая допускает множество вариантов. Symfony отлично работает если настроить виртуальный хост (virtual host), именно это решение рекомендовано.
Если в процессе установки возникли ошибки, вы можете найти множество туториалов и ответов на часто задаваемые вопросы на сайте symfony. Если решение не найдено, обсудите вашу проблему в сообществе symfony, и вы быстро получите нужный ответ.
Хорошей идеей будет поставить свежесозданный проект на контроль версий.
Теперь вы готовы использовать symfony, и можно приступить к разработке базового веб приложения.
Последние комментарии:
Task "init-project" is not defined. | Charger |
---|---|
symfony version 1.4.9 Выполняю symfony init-project MyProj получаю Task init-project is not defined. в инете видел решение, использовать команду symfony generate::project MyProj и она сработала. А почему так? Я что-то не настроил, или команда init-project уже не поддерживается? |
|
Как начать? | Карим |
Только начал изучать фреймворк. Я не пойму как начать). Вот скачал, установил, все отлично. Но дальше надо команды отправлять, куда их отправлять в командную строку? Если нет, то распишите пожалуиста для новичков, буду благодарен. | |
проблема с установкой | alexber220 |
скачал http://www.symfony-project.org/get/sf_sandbox.tgz распаковал tar -xzf ./sf_sandbox.tgz -p хостинг PeterHost php5 только как cgi запускается в .htaccess добавил AddType php5-script .php Action php5-script /cgi-php/php5 открываю http://1111.ru/sf_sandbox/web/index.php говорит Oops! Page Not Found из консоли $ ./symfony -v PHP Parse error: syntax error, unexpected T_STATIC, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /home/alexber/www/site1/public_html/sf_sandbox/data/symfony/bin/symfony.php on line 42 нид хелп как такое лечится? |
|
битое ссылко | Vit228 |
Лишний символ в ссылке на «черепашек» http://tortoisesvn.tigris.org/) з.ы. Спасибо парни за ваш труд! |
|
Спасибо | Alex |
Выражаю огромную благодарность автору перевода. Спасибо Алексей за твой труд! Я хоть и читаю на английском, но на родном языке все же читать комфортнее. |
|
Обсудить (комментариев: 7)