Browse Source

Russian Documentation:
- Sync

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@15578 44c647ce-9c0f-0410-b52a-842ac1e357ba

irina 16 years ago
parent
commit
27c2aa9630
21 changed files with 1135 additions and 691 deletions
  1. 2 0
      documentation/manual/ru/manual.xml.in
  2. 11 11
      documentation/manual/ru/module_specs/Zend_Acl-Advanced.xml
  3. 9 13
      documentation/manual/ru/module_specs/Zend_Acl-Refining.xml
  4. 33 36
      documentation/manual/ru/module_specs/Zend_Acl.xml
  5. 37 17
      documentation/manual/ru/module_specs/Zend_Cache-Backends.xml
  6. 46 53
      documentation/manual/ru/module_specs/Zend_Cache-Frontends.xml
  7. 12 13
      documentation/manual/ru/module_specs/Zend_Cache-Introduction.xml
  8. 29 22
      documentation/manual/ru/module_specs/Zend_Cache-Theory.xml
  9. 17 19
      documentation/manual/ru/module_specs/Zend_Config-Introduction.xml
  10. 20 20
      documentation/manual/ru/module_specs/Zend_Config-TheoryOfOperation.xml
  11. 12 13
      documentation/manual/ru/module_specs/Zend_Config_Ini.xml
  12. 18 18
      documentation/manual/ru/module_specs/Zend_Config_Writer.xml
  13. 55 22
      documentation/manual/ru/module_specs/Zend_Config_Xml.xml
  14. 20 27
      documentation/manual/ru/module_specs/Zend_Filter-FilterChains.xml
  15. 18 26
      documentation/manual/ru/module_specs/Zend_Filter-WritingFilters.xml
  16. 108 51
      documentation/manual/ru/module_specs/Zend_Filter.xml
  17. 86 151
      documentation/manual/ru/module_specs/Zend_Uri.xml
  18. 20 50
      documentation/manual/ru/module_specs/Zend_Validate-ValidatorChains.xml
  19. 256 40
      documentation/manual/ru/module_specs/Zend_Validate-WritingValidators.xml
  20. 310 62
      documentation/manual/ru/module_specs/Zend_Validate.xml
  21. 16 27
      documentation/manual/ru/module_specs/Zend_Version.xml

+ 2 - 0
documentation/manual/ru/manual.xml.in

@@ -1542,11 +1542,13 @@
                 <xi:include href="../en/module_specs/Zend_Tool_Project-Providers.xml" />
             </xi:fallback>
         </xi:include>
+        <!--
         <xi:include href="module_specs/Zend_Tool_Project-Internals.xml">
             <xi:fallback>
                 <xi:include href="../en/module_specs/Zend_Tool_Project-Internals.xml" />
             </xi:fallback>
         </xi:include>
+        -->
     </chapter>
 
     <chapter id="zend.translate">

+ 11 - 11
documentation/manual/ru/module_specs/Zend_Acl-Advanced.xml

@@ -1,3 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.acl.advanced">
 
     <title>Продвинутое использование</title>
@@ -7,20 +9,20 @@
         <title>Постоянное хранение данных ACL</title>
 
         <para>
-            Zend_Acl спроектирован таким образом, что не требует для хранения
+            <classname>Zend_Acl</classname> спроектирован таким образом, что не требует для хранения
             данных ACL использования строго определенных технологий хранения -
             таких, как база данных или сервер кеша. Его реализация на чистом PHP
             позволяет создавать административные инструменты под управлением
-            Zend_Acl с относительной простотой и гибкостью.
+            <classname>Zend_Acl</classname> с относительной простотой и гибкостью.
             Многие ситуации требуют некоторой интерактивной поддержки от ACL, и
-            Zend_Acl предоставляет методы для настройки, произведения запросов,
+            <classname>Zend_Acl</classname> предоставляет методы для настройки, произведения запросов,
             контроля доступа приложением.
        </para>
 
         <para>
             Тем не менее, хранение данных ACL остается задачей разработчика,
             т.к. случаи использования могут сильно варьироваться в различных
-            ситуациях. Поскольку Zend_Acl доступен для сериализации, то можно
+            ситуациях. Поскольку <classname>Zend_Acl</classname> доступен для сериализации, то можно
             сериализовать объекты ACL через PHP-функцию
             <ulink url="http://php.net/serialize"><code>serialize()</code></ulink>,
             и результаты можно хранить там, где пожелает разработчик - например,
@@ -38,14 +40,14 @@
             быть не безусловным, а зависеть от различных критериев. Например,
             определенный доступ должен быть разрешен, но только с 8:00 до 17:00.
             Другой пример - доступ должен быть запрещен, если запрос поступил
-            с IP-адреса, находящегося в "черном списке". Zend_Acl имеет
+            с IP-адреса, находящегося в "черном списке". <classname>Zend_Acl</classname> имеет
             встроеную поддержку для применения правил, основанных на любых
             нужных разработчику условиях.
         </para>
 
         <para>
-            Zend_Acl предоставляет поддержку условных правил с помощью
-            интерфейса <code>Zend_Acl_Assert_Interface</code>.
+            <classname>Zend_Acl</classname> предоставляет поддержку условных правил с помощью
+            интерфейса <classname>Zend_Acl_Assert_Interface</classname>.
             Чтобы использовать интерфейс утверждений, разработчик должен
             написать класс, который реализует метод <code>assert()</code>
             интерфейса:
@@ -67,8 +69,7 @@ class CleanIPAssertion implements Zend_Acl_Assert_Interface
         // ...
     }
 }
-]]>
-        </programlisting>
+]]></programlisting>
 
         <para>
             После объявления класса утверждения разработчик должен передавать
@@ -80,8 +81,7 @@ class CleanIPAssertion implements Zend_Acl_Assert_Interface
         <programlisting role="php"><![CDATA[
 $acl = new Zend_Acl();
 $acl->allow(null, null, null, new CleanIPAssertion());
-]]>
-        </programlisting>
+]]></programlisting>
 
         <para>
             Код выше создает условное правило, разрешающее

+ 9 - 13
documentation/manual/ru/module_specs/Zend_Acl-Refining.xml

@@ -1,3 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.acl.refining">
 
     <title>Настройка управления доступом</title>
@@ -13,7 +15,7 @@
             различные привилегии могут быть разрешены в ACL (ко всем ресурсам).
             Но на практике средства управления доступом
             имеют тенденцию к тому, чтобы иметь исключения из правил и различную
-            степень сложности. Zend_Acl позволяет производить
+            степень сложности. <classname>Zend_Acl</classname> позволяет производить
             детализацию просто и гибко.
         </para>
 
@@ -45,8 +47,7 @@
         <programlisting role="php"><![CDATA[
 // Новая группа 'маркетинг' наследует права от группы 'сотрудник'
 $acl->addRole(new Zend_Acl_Role('marketing'), 'staff');
-]]>
-        </programlisting>
+]]></programlisting>
 
         <para>
             Далее обратите внимание, что указанные выше права доступа имеют
@@ -68,8 +69,7 @@ $acl->add(new Zend_Acl_Resource('latest'), 'news');
 
 // объявления
 $acl->add(new Zend_Acl_Resource('announcement'), 'news');
-]]>
-        </programlisting>
+]]></programlisting>
 
         <para>
             Затем определяются более точные правила для целевых областей ACL.
@@ -88,8 +88,7 @@ $acl->deny('staff', 'latest', 'revise');
 
 // Всем, включая администраторов, не разрешается удалять объявления
 $acl->deny(null, 'announcement', 'archive');
-]]>
-        </programlisting>
+]]></programlisting>
 
         <para>
             Теперь мы можем производить запросы к ACL с учетом последних
@@ -128,8 +127,7 @@ echo $acl->isAllowed('editor', 'announcement', 'archive') ?
 echo $acl->isAllowed('administrator', 'announcement', 'archive') ?
      "разрешен" : "запрещен";
 // запрещен
-]]>
-        </programlisting>
+]]></programlisting>
 
     </sect2>
 
@@ -167,8 +165,7 @@ echo $acl->isAllowed('marketing', 'newsletter', 'publish') ?
 echo $acl->isAllowed('marketing', 'newsletter', 'archive') ?
      "разрешен" : "запрещен";
 // запрещен
-]]>
-        </programlisting>
+]]></programlisting>
 
         <para>
             Привилегии могут модифицироваться в порядке возрастания, как показано выше, но параметр <code>null</code>
@@ -190,8 +187,7 @@ echo $acl->isAllowed('marketing', 'latest', 'archive') ?
 echo $acl->isAllowed('marketing', 'latest', 'anything') ?
      "разрешен" : "запрещен";
 // разрешен
-]]>
-        </programlisting>
+]]></programlisting>
 
     </sect2>
 

+ 33 - 36
documentation/manual/ru/module_specs/Zend_Acl.xml

@@ -1,8 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.acl.introduction">
     <title>Введение</title>
 
     <para>
-        Zend_Acl предоставляет легковесную и гибкую реализацию списка прав
+        <classname>Zend_Acl</classname> предоставляет легковесную и гибкую реализацию списка прав
         доступа (ACL) и управления привилегиями. Приложение может использовать
         такие списки для контроля доступа одних объектов к другим - защищенным.
     </para>
@@ -12,19 +14,19 @@
         <itemizedlist>
             <listitem>
                 <para>
-                    <emphasis role="strong">Ресурс</emphasis> - объект, доступ к
+                    <emphasis>Ресурс</emphasis> - объект, доступ к
                     которому контролируется.
                 </para>
             </listitem>
             <listitem>
                 <para>
-                    <emphasis role="strong">Роль</emphasis> - объект, который
-                    может запросить доступ к ресурсу.
+                    <emphasis>Роль</emphasis> - объект, который
+                    может запрашивать доступ к ресурсу.
                 </para>
             </listitem>
         </itemizedlist>
 
-        Говоря проще, <emphasis role="strong">роли запрашивают доступ к
+        Говоря проще, <emphasis>роли запрашивают доступ к
         ресурсам</emphasis>.
         Например, если парковщик запрашивает доступ к автомобилю, то
         парковщик - это роль, а автомобиль - ресурс, поскольку доступ к
@@ -39,17 +41,17 @@
     <sect2 id="zend.acl.introduction.resources">
         <title>Ресурсы</title>
         <para>
-            Создать ресурс в Zend_Acl очень просто. Zend_Acl предоставляет
-            интерфейс ресурса <code>Zend_Acl_Resource_Interface</code> для
+            Создать ресурс в <classname>Zend_Acl</classname> очень просто. <classname>Zend_Acl</classname> предоставляет
+            интерфейс ресурса <classname>Zend_Acl_Resource_Interface</classname> для
             облегчения процесса создания ресурса. Этот интерфейс содержит только
             один метод, <code>getResourceId()</code>. Классу достаточно
-            реализовывать этот интерфейс для того, чтобы Zend_Acl рассматривал
-            объект этого класса как ресурс. Кроме того, Zend_Acl
+            реализовывать этот интерфейс для того, чтобы <classname>Zend_Acl</classname> рассматривал
+            объект этого класса как ресурс. Кроме того, <classname>Zend_Acl</classname>
             предоставляет <code>Zend_Acl_Resource</code> в качестве базового
             класса, который разработчики могут расширять по желанию.
         </para>
         <para>
-            Zend_Acl предусматривает древовидную структуру, в которую могут
+            <classname>Zend_Acl</classname> предоставляет древовидную структуру, в которую могут
             добавляться различные ресурсы. В этой структуре они могут быть
             организованы от общих (корень дерева) к специфическим
             (листья дерева). При запросах к определенным ресурсам в иерархии
@@ -59,14 +61,14 @@
             правило должно действовать в каждом здании города, то проще
             прикрепить его к городу, чем крепить к каждому зданию в городе.
             Однако, для некоторых зданий могут потребоваться исключения из этого
-            правила, в Zend_Acl это достигается путем закрепления исключений за
+            правила, в <classname>Zend_Acl</classname> это достигается путем закрепления исключений за
             каждым зданием, требующим исключений из правила.
             Ресурс может наследовать только от одного родительского ресурса,
             однако сам родительский ресурс может,
             в свою очередь, наследовать от другого родительского ресурса и т.д.
         </para>
         <para>
-            Zend_Acl также поддерживает права доступа к ресурсам (например,
+            <classname>Zend_Acl</classname> также поддерживает права доступа к ресурсам (например,
             "создание", "чтение", "обновление", "удаление"),
             разработчик может присваивать правила, которые будут влиять на все
             или определенные права доступа к ресурсу.
@@ -78,13 +80,13 @@
         <para>
             Как и в случае с ресурсами, создавать роль тоже очень просто.
             Все роли должны реализовывать интерфейс
-            <code>Zend_Acl_Role_Interface</code>. Этот интерфейс содержит
-            единственный метод <code>getRoleId()</code>. Кроме того, Zend_Acl
-            предоставляет <code>Zend_Acl_Role</code> в качестве базового класса,
+            <classname>Zend_Acl_Role_Interface</classname>. Этот интерфейс содержит
+            единственный метод <code>getRoleId()</code>. Кроме того, <classname>Zend_Acl</classname>
+            предоставляет <classname>Zend_Acl_Role</classname> в качестве базового класса,
             который разработчики могут расширять по желанию.
         </para>
         <para>
-            В Zend_Acl роль может наследовать от одной или от нескольких
+            В <classname>Zend_Acl</classname> роль может наследовать от одной или от нескольких
             ролей. Это реализовано для поддержки
             наследования правил между ролями. Например, пользовательская роль,
             такая как "Салли", может принадлежать одной или нескольким
@@ -97,7 +99,7 @@
         <para>
             Хотя множественное наследование ролей - очень полезная возможность,
             она также усложняет разработку. Следующий пример демонстрирует
-            неопределенное условие и показывает как Zend_Acl решает эту
+            неопределенное условие и показывает, как <classname>Zend_Acl</classname> решает эту
             проблему.
         </para>
         <example id="zend.acl.introduction.roles.example.multiple_inheritance">
@@ -109,7 +111,7 @@
                 Далее создается "<code>someUser</code>", он наследует от этих
                 только что созданных трех ролей. Порядок, в котором эти роли
                 появляются в массиве <code>$parents</code>,
-                важен. При необходимости Zend_Acl ищет правила доступа не
+                важен. При необходимости <classname>Zend_Acl</classname> ищет правила доступа не
                 только для запрашиваемых ролей (в нашем случае,
                 "<code>someUser</code>"), но и для ролей, от которых
                 запрашиваемая роль унаследована
@@ -132,22 +134,21 @@ $acl->deny('guest', 'someResource');
 $acl->allow('member', 'someResource');
 
 echo $acl->isAllowed('someUser', 'someResource') ? 'разрешен' : 'запрещен';
-]]>
-            </programlisting>
+]]></programlisting>
             <para>
                 Поскольку нет правил, определенных специально для роли
                 "<code>someUser</code>" и ресурса
-                "<code>someResource</code>", то Zend_Acl должен производить
+                "<code>someResource</code>", то <classname>Zend_Acl</classname> должен производить
                 поиск правил, которые могут быть определены для ролей,
                 от которых "<code>someUser</code>" наследуется. Сперва
                 проверяется роль "<code>admin</code>", и обнаруживается, что
                 для нее не определены правила доступа. Затем проверяется роль
-                "<code>member</code>", и Zend_Acl обнаруживает, что есть правило
+                "<code>member</code>", и <classname>Zend_Acl</classname> обнаруживает, что есть правило
                 разрешающее доступ для "<code>member</code>" к
                 "<code>someResource</code>".
             </para>
             <para>
-                Если бы Zend_Acl продолжил поиск правил, определенных для
+                Если бы <classname>Zend_Acl</classname> продолжил поиск правил, определенных для
                 родительских ролей, то обнаружил бы, что для
                 "<code>guest</code>" запрещен доступ к
                 "<code>someResource</code>". Это пример показывает противоречие,
@@ -156,7 +157,7 @@ echo $acl->isAllowed('someUser', 'someResource') ? 'разрешен' : 'зап
                 Конфликт произошел по причине наследования от нескольких ролей.
             </para>
             <para>
-                Zend_Acl решает эту неоднозначность, завершая запрос, как только
+                <classname>Zend_Acl</classname> решает эту неоднозначность, завершая запрос, как только
                 находит первое правило, которое может быть применено к запросу.
                 В этом случае, если роль "<code>member</code>"
                 проверяется раньше, чем роль "<code>guest</code>", то
@@ -187,13 +188,12 @@ echo $acl->isAllowed('someUser', 'someResource') ? 'разрешен' : 'зап
 
         <programlisting role="php"><![CDATA[
 $acl = new Zend_Acl();
-]]>
-        </programlisting>
+]]></programlisting>
 
         <note>
             <para>
                 До тех пор, пока разработчик не определит какое-либо правило,
-                разрешающее доступ, Zend_Acl отказывает всем ролям в доступе ко
+                разрешающее доступ, <classname>Zend_Acl</classname> отказывает всем ролям в доступе ко
                 всем привилегиям на все ресурсы.
             </para>
         </note>
@@ -257,9 +257,9 @@ $acl = new Zend_Acl();
         </table>
 
         <para>
-            Для этого примера мы используем <code>Zend_Acl_Role</code>, но можно
+            Для этого примера мы используем <classname>Zend_Acl_Role</classname>, но можно
             было бы использовать любой другой класс,
-            реализующий интерфейс <code>Zend_Acl_Role_Interface</code>.
+            реализующий интерфейс <classname>Zend_Acl_Role_Interface</classname>.
             Эти группы могут быть добавлены в реестр ролей
             следующим образом:
         </para>
@@ -285,8 +285,7 @@ $acl->addRole(new Zend_Acl_Role('editor'), 'staff');
 
 // Администатор не наследует управление доступом
 $acl->addRole(new Zend_Acl_Role('administrator'));
-]]>
-        </programlisting>
+]]></programlisting>
 
     </sect2>
 
@@ -298,7 +297,7 @@ $acl->addRole(new Zend_Acl_Role('administrator'));
             правила, по которым роли будут иметь доступ к ресурсам. Вы, должно
             быть, заметили, что мы не определили ни одного отдельного ресурса
             для этого примера, это упрощает демонстрацию того, что правила
-            применяются ко всем ресурсам. Zend_Acl предоставляет реализацию,
+            применяются ко всем ресурсам. <classname>Zend_Acl</classname> предоставляет реализацию,
             посредством которой правила должны передаваться
             от общих к специфическим, минимизируя таким образом количество
             необходимых правил, так как
@@ -339,8 +338,7 @@ $acl->allow('staff', null, array('edit', 'submit', 'revise'));
 $acl->allow('editor', null, array('publish', 'archive', 'delete'));
 
 // Администратор не наследует ничего, но обладает всеми привилегиями
-$acl->allow('administrator');]]>
-        </programlisting>
+$acl->allow('administrator');]]></programlisting>
 
         <para>
             Значение <code>null</code> в вызовах
@@ -393,8 +391,7 @@ echo $acl->isAllowed('administrator') ?
 echo $acl->isAllowed('administrator', null, 'update') ?
      "разрешен" : "запрещен";
 // разрешен потому, что администратор обладает всеми привилегиями
-]]>
-        </programlisting>
+]]></programlisting>
 
     </sect2>
 </sect1>

+ 37 - 17
documentation/manual/ru/module_specs/Zend_Cache-Backends.xml

@@ -1,3 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.cache.backends">
     <title>Бэкэнды Zend_Cache</title>
     <para>
@@ -5,7 +7,7 @@
         предоставляют больше функциональных возможностей.
     </para>
     <sect2 id="zend.cache.backends.file">
-        <title><code>Zend_Cache_Backend_File</code></title>
+        <title>Zend_Cache_Backend_File</title>
         <para>
             Этот расширенный бэкэнд хранит записи кэша в файлах (в выбранной
             директории).
@@ -14,7 +16,7 @@
             Доступные опции:
         </para>
         <table id="zend.cache.backends.file.table">
-            <title>Опции <code>Zend_Cache_Backend_File</code></title>
+            <title>Опции Zend_Cache_Backend_File</title>
             <tgroup cols="4">
                  <thead>
                      <row>
@@ -113,7 +115,7 @@
           </table>
     </sect2>
     <sect2 id="zend.cache.backends.sqlite">
-        <title><code>Zend_Cache_Backend_Sqlite</code></title>
+        <title>Zend_Cache_Backend_Sqlite</title>
         <para>
             Этот расширенный бэкэнд хранит записи кэша в базе данных SQLite.
         </para>
@@ -121,7 +123,7 @@
             Доступные опции:
         </para>
         <table id="zend.cache.backends.sqlite.table">
-            <title>Опции <code>Zend_Cache_Backend_Sqlite</code></title>
+            <title>Опции Zend_Cache_Backend_Sqlite</title>
             <tgroup cols="4">
                  <thead>
                      <row>
@@ -162,7 +164,7 @@
           </table>
     </sect2>
     <sect2 id="zend.cache.backends.memcached">
-        <title><code>Zend_Cache_Backend_Memcached</code></title>
+        <title>Zend_Cache_Backend_Memcached</title>
         <para>
             Этот расширенный бэкэнд хранит записи кэша в сервере memcached.
             <ulink url="http://www.danga.com/memcached/">memcached</ulink> —
@@ -179,7 +181,7 @@
             Доступные опции:
         </para>
         <table id="zend.cache.backends.memcached.table">
-            <title>Опции <code>Zend_Cache_Backend_Memcached</code></title>
+            <title>Опции Zend_Cache_Backend_Memcached</title>
             <tgroup cols="4">
                  <thead>
                      <row>
@@ -196,7 +198,7 @@
                           <entry>
                             <code>
                               array(array('host' => 'localhost', 'port' => 11211, 'persistent' => true, 'weight' => 1,
-                              'timeout' => 5, 'retry_interval' => 15, 'status' => true , 'failure_callback' => '' ))
+                              'timeout' => 5, 'retry_interval' => 15, 'status' => true, 'failure_callback' => '' ))
                             </code>
                           </entry>
                           <entry>
@@ -210,7 +212,7 @@
                               'timeout' => (int) : таймаут сервера memcached,
                               'retry_interval' => (int) : интервал между повторными попытками,
                               'status' => (bool) : статус сервера memcached,
-                              'failure_callback' => (callback) : callback сервера memcached
+                              'failure_callback' => (callback) : обратный вызов сервера memcached
                           </entry>
                       </row>
                       <row>
@@ -227,7 +229,7 @@
                           <entry><code>boolean</code></entry>
                           <entry><code>false</code></entry>
                           <entry>
-                             true, если нужно включить режим
+                             <code>true</code>, если нужно включить режим
                              совместимости со старыми серверами и расширениями
                              memcache
                           </entry>
@@ -237,7 +239,7 @@
           </table>
     </sect2>
     <sect2 id="zend.cache.backends.apc">
-        <title><code>Zend_Cache_Backend_Apc</code></title>
+        <title>Zend_Cache_Backend_Apc</title>
         <para>
             Этот расширенный бэкэнд хранит записи кэша в совместно используемой
             памяти через расширение
@@ -255,7 +257,7 @@
         </para>
     </sect2>
     <sect2 id="zend.cache.backends.xcache">
-        <title><code>Zend_Cache_Backend_Xcache</code></title>
+        <title>Zend_Cache_Backend_Xcache</title>
         <para>
             Этот бэкэнд хранит записи кэша в совместно используемой
             памяти через расширение
@@ -271,7 +273,7 @@
             Доступные опции:
         </para>
         <table id="zend.cache.backends.xcache.table">
-            <title>Опции <code>Zend_Cache_Backend_Xcache</code></title>
+            <title>Опции Zend_Cache_Backend_Xcache</title>
             <tgroup cols="4">
                  <thead>
                      <row>
@@ -304,7 +306,7 @@
           </table>
     </sect2>
     <sect2 id="zend.cache.backends.platform">
-        <title><code>Zend_Cache_Backend_ZendPlatform</code></title>
+        <title>Zend_Cache_Backend_ZendPlatform</title>
         <para>
             Этот бэкэнд использует API
             <ulink url="http://www.zend.com/products/platform">Zend
@@ -323,14 +325,13 @@
         </para>
         <programlisting role="php"><![CDATA[
 $cache = Zend_Cache::factory('Core', 'Zend Platform');
-]]>
-        </programlisting>
+]]></programlisting>
         <para>
             Нет специальных опций для этого бэкэнда.
         </para>
     </sect2>
     <sect2 id="zend.cache.backends.twolevels">
-        <title><code>Zend_Cache_Backend_TwoLevels</code></title>
+        <title>Zend_Cache_Backend_TwoLevels</title>
         <para>
             Этот расширенный бэкэнд является гибридным. Он сохраняет записи кэша
             через два других бэкэнда: быстрый, но ограниченный в функциональных
@@ -346,7 +347,7 @@ $cache = Zend_Cache::factory('Core', 'Zend Platform');
             Доступные опции:
         </para>
         <table id="zend.cache.backends.twolevels.table">
-            <title>Опции <code>Zend_Cache_Backend_TwoLevels</code></title>
+            <title>Опции Zend_Cache_Backend_TwoLevels</title>
             <tgroup cols="4">
                  <thead>
                       <row>
@@ -460,6 +461,25 @@ $cache = Zend_Cache::factory('Core', 'Zend Platform');
               </tgroup>
           </table>
     </sect2>
+    <sect2 id="zend.cache.backends.zendserver">
+        <title>Zend_Cache_Backend_ZendServer_Disk и Zend_Cache_Backend_ZendServer_ShMem</title>
+        <para>
+            Эти бэкэнды служат для сохранения записей кэша через соответствующую
+            возможность <ulink url="http://www.zend.com/en/products/server/downloads-all?zfs=zf_download">Zend Server</ulink>.
+        </para>
+        <para>
+            Будьте осторожны - в настоящий момент этот бэкэнд не поддерживает
+            теги, так же, как и аргумент "doNotTestCacheValidity=true".
+        </para>
+        <para>
+            Этот бэкэнд работает только в среде Zend Server с запросами,
+            производимыми через HTTP(S), и не работает в случае скриптов,
+            запускаемых через командную строку.
+        </para>
+        <para>
+            Нет специальных опций для этого бэкэнда.
+        </para>
+    </sect2>
 </sect1>
 <!--
 vim:se ts=4 sw=4 et:

+ 46 - 53
documentation/manual/ru/module_specs/Zend_Cache-Frontends.xml

@@ -1,19 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.cache.frontends">
     <title>Фронтэнды Zend_Cache</title>
 
     <sect2 id="zend.cache.frontends.core">
-        <title><code>Zend_Cache_Core</code></title>
+        <title>Zend_Cache_Core</title>
         <sect3 id="zend.cache.frontends.core.introduction">
             <title>Введение</title>
             <para>
-                Фронтэнд <code>Zend_Cache_Core</code> является особым,
+                Фронтэнд <classname>Zend_Cache_Core</classname> является особым,
                 так как это ядро всего модуля. Это фронтэнд общего назначения и
                 он расширяется другими классами.
             </para>
             <note>
                 <para>
                     Все фронтэнды наследуют от класса
-                    <code>Zend_Cache_Core</code>, поэтому его методы и опции,
+                    <classname>Zend_Cache_Core</classname>, поэтому его методы и опции,
                     описанные ниже, должны быть доступны в других фронтэндах и
                     не будут описываться далее.
                 </para>
@@ -26,7 +28,7 @@
                 предыдущих примерах.
             </para>
             <table id="zend.cache.frontends.core.options.table">
-                <title>Опции <code>Zend_Cache_Core</code></title>
+                <title>Опции Zend_Cache_Core</title>
                 <tgroup cols="4">
                      <thead>
                           <row>
@@ -81,7 +83,7 @@
                               <entry>
                                  Если установлен в <code>true</code>, то
                                  включается логирование через
-                                 <code>Zend_Log</code> (но система будет
+                                 <classname>Zend_Log</classname> (но система будет
                                  работать медленнее).
                               </entry>
                           </row>
@@ -170,8 +172,7 @@ if (!($data = $cache->load($id))) {
 }
 
 // [...] делаем что-либо с данными (отображение, передача и т.д.)
-]]>
-            </programlisting>
+]]></programlisting>
             <para>
                 Если вы хотите закэшировать несколько блоков или экземпляров
                 данных, то принцип будет тот же:
@@ -210,8 +211,7 @@ if (!($data = $cache->load($id2))) {
     $cache->save($data);
 
 }
-echo($data);]]>
-            </programlisting>
+echo($data);]]></programlisting>
             <para>
                 Если вы хотите кэшировать специальные значения (булево
                 значение через опцию "automatic_serialization") или пустую
@@ -254,17 +254,16 @@ if (!($cache->test($id))) {
 }
 
 // делаем что-либо с данными
-]]>
-            </programlisting>
+]]></programlisting>
         </sect3>
     </sect2>
 
     <sect2 id="zend.cache.frontends.output">
-        <title><code>Zend_Cache_Frontend_Output</code></title>
+        <title>Zend_Cache_Frontend_Output</title>
         <sect3 id="zend.cache.frontends.output.introduction">
             <title>Введение</title>
             <para>
-                <code>Zend_Cache_Frontend_Output</code> является фронтэндом,
+                <classname>Zend_Cache_Frontend_Output</classname> является фронтэндом,
                 собирающим выходные данные. Он использует буферизацию вывода
                 (output buffering) в PHP для сохранения всего, что выводится
                 между его методами <code>start()</code> и <code>end()</code>.
@@ -274,7 +273,7 @@ if (!($cache->test($id))) {
             <title>Доступные опции</title>
             <para>
                 Этот фронтэнд не имеет каких-либо специальных опций, отличных
-                от опций <code>Zend_Cache_Core</code>.
+                от опций <classname>Zend_Cache_Core</classname>.
             </para>
         </sect3>
 
@@ -298,8 +297,7 @@ if (!($cache->start('mypage'))) {
 }
 
 echo 'This is never cached ('.time().').';
-]]>
-            </programlisting>
+]]></programlisting>
             <para>
                 Используя эту форму, довольно легко установить кэширование
                 вывода в уже работающем проекте с незначительным рефакторингом
@@ -309,11 +307,11 @@ echo 'This is never cached ('.time().').';
     </sect2>
 
     <sect2 id="zend.cache.frontends.function">
-        <title><code>Zend_Cache_Frontend_Function</code></title>
+        <title>Zend_Cache_Frontend_Function</title>
         <sect3 id="zend.cache.frontends.function.introduction">
             <title>Введение</title>
             <para>
-                <code>Zend_Cache_Frontend_Function</code> сохраняет в кэш
+                <classname>Zend_Cache_Frontend_Function</classname> сохраняет в кэш
                 результаты вызова функции. Он имеет единственный основной метод
                 <code>call()</code>, который принимает имя функции и параметры
                 вызова в виде массива.
@@ -322,7 +320,7 @@ echo 'This is never cached ('.time().').';
         <sect3 id="zend.cache.frontends.function.options">
             <title>Доступные опции</title>
             <table id="zend.cache.frontends.function.options.table">
-                <title>Опции <code>Zend_Cache_Frontend_Function</code></title>
+                <title>Опции Zend_Cache_Frontend_Function</title>
                 <tgroup cols="4">
                      <thead>
                           <row>
@@ -378,10 +376,9 @@ $cache->call('veryExpensiveFunc', $params);
 // veryExpensiveFunc(1, 'foo', 'bar'),
 // то вы должны использовать
 // $cache->call('veryExpensiveFunc', array(1, 'foo', 'bar'))
-]]>
-            </programlisting>
+]]></programlisting>
             <para>
-                <code>Zend_Cache_Frontend_Function</code> достаточно
+                <classname>Zend_Cache_Frontend_Function</classname> достаточно
                 интеллектуален, чтобы кэшировать как возвращаемое функцией
                 значение, так и данные, выводимые внутри нее.
             </para>
@@ -400,19 +397,19 @@ $cache->call('veryExpensiveFunc', $params);
     </sect2>
 
     <sect2 id="zend.cache.frontends.class">
-        <title><code>Zend_Cache_Frontend_Class</code></title>
+        <title>Zend_Cache_Frontend_Class</title>
         <sect3 id="zend.cache.frontends.class.introduction">
             <title>Введение</title>
             <para>
-                <code>Zend_Cache_Frontend_Class</code> отличается от
-                <code>Zend_Cache_Frontend_Function</code> тем, что позволяет
+                <classname>Zend_Cache_Frontend_Class</classname> отличается от
+                <classname>Zend_Cache_Frontend_Function</classname> тем, что позволяет
                 кэшировать объекты и статические вызовы методов.
             </para>
         </sect3>
         <sect3 id="zend.cache.frontends.class.options">
             <title>Доступные опции</title>
             <table id="zend.cache.frontends.class.options.table">
-                <title>Опции <code>Zend_Cache_Frontend_Class</code></title>
+                <title>Опции Zend_Cache_Frontend_Class</title>
                 <tgroup cols="4">
                      <thead>
                           <row>
@@ -491,8 +488,7 @@ $frontendOptions = array(
 
 // Кэшируемый вызов
 $result = $cache->foobar('1', '2');
-]]>
-            </programlisting>
+]]></programlisting>
             <para>
                 Кэширование обычных вызовов методов:
             </para>
@@ -517,17 +513,16 @@ $frontendOptions = array(
 
 // Кэшируемый вызов
 $result = $cache->foobar2('1', '2');
-]]>
-            </programlisting>
+]]></programlisting>
         </sect3>
     </sect2>
 
     <sect2 id="zend.cache.frontends.file">
-        <title><code>Zend_Cache_Frontend_File</code></title>
+        <title>Zend_Cache_Frontend_File</title>
         <sect3 id="zend.cache.frontends.file.introduction">
             <title>Введение</title>
             <para>
-                <code>Zend_Cache_Frontend_File</code> является фронтэндом,
+                <classname>Zend_Cache_Frontend_File</classname> является фронтэндом,
                 который управляется временем изменения "ведущего файла".
                 Он очень полезен для кэширования конфигураций или шаблонов.
                 Можно использовать несколько ведущих файлов.
@@ -535,8 +530,8 @@ $result = $cache->foobar2('1', '2');
             <para>
                 Например, у вас есть конфигурационный файл XML. Он парсится
                 функцией, которая возвращает объект конфигурации
-                (наподобие <code>Zend_Config</code>). С помощью
-                <code>Zend_Cache_Frontend_File</code> вы можете сохранять объект
+                (наподобие <classname>Zend_Config</classname>). С помощью
+                <classname>Zend_Cache_Frontend_File</classname> вы можете сохранять объект
                 конфигурации в кэш, чтобы избежать повторного парсинга
                 конфигурационного файла XML. Время жизни кэша будет зависеть
                 от ведущего файла - если конфигурационный
@@ -546,7 +541,7 @@ $result = $cache->foobar2('1', '2');
         <sect3 id="zend.cache.frontends.file.options">
             <title>Доступные опции</title>
             <table id="zend.cache.frontends.file.options.table">
-                <title>Опции <code>Zend_Cache_Frontend_File</code></title>
+                <title>Опции Zend_Cache_Frontend_File</title>
                 <tgroup cols="4">
                      <thead>
                           <row>
@@ -558,7 +553,8 @@ $result = $cache->foobar2('1', '2');
                      </thead>
                      <tbody>
                           <row>
-                              <entry><code>master_file</code> (не рекомендуется к использованию)</entry>
+                              <entry><code>master_file</code>
+                                  (не рекомендуется к использованию)</entry>
                               <entry><code>string</code></entry>
                               <entry><code></code></entry>
                               <entry>
@@ -601,7 +597,7 @@ $result = $cache->foobar2('1', '2');
             <title>Примеры</title>
             <para>
                 Этот фронтэнд используется так же, как и
-                <code>Zend_Cache_Core</code>. Специальные примеры не нужны,
+                <classname>Zend_Cache_Core</classname>. Специальные примеры не нужны,
                 единственное, что надо сделать — это указать
                 <code>masterFile</code> при использовании фабрики.
             </para>
@@ -609,14 +605,14 @@ $result = $cache->foobar2('1', '2');
     </sect2>
 
     <sect2 id="zend.cache.frontends.page">
-        <title><code>Zend_Cache_Frontend_Page</code></title>
+        <title>Zend_Cache_Frontend_Page</title>
         <sect3 id="zend.cache.frontends.page.introduction">
             <title>Введение</title>
             <para>
-                <code>Zend_Cache_Frontend_Page</code> похож на
-                <code>Zend_Cache_Frontend_Output</code>,
+                <classname>Zend_Cache_Frontend_Page</classname> похож на
+                <classname>Zend_Cache_Frontend_Output</classname>,
                 но предназначена для кэширования целых страниц.
-                <code>Zend_Cache_Frontend_Page</code>
+                <classname>Zend_Cache_Frontend_Page</classname>
                 нельзя использовать для кэширования отдельных блоков.
             </para>
             <para>
@@ -639,7 +635,7 @@ $result = $cache->foobar2('1', '2');
         <sect3 id="zend.cache.frontends.page.options">
             <title>Доступные опции</title>
             <table id="zend.cache.frontends.page.options.table">
-                <title>Опции <code>Zend_Cache_Frontend_Page</code></title>
+                <title>Опции Zend_Cache_Frontend_Page</title>
                 <tgroup cols="4">
                      <thead>
                           <row>
@@ -835,10 +831,10 @@ $result = $cache->foobar2('1', '2');
                                   этого массива являются регулярные выражения
                                   (PCRE), значениями — ассоциативные массивы со
                                   специальными опциями, которые устанавливаются,
-                                  если $_SERVER['REQUEST_URI']
+                                  если <code>$_SERVER['REQUEST_URI']</code>
                                   соответствует регулярному выражению
                                   (см. default_options в этом списке доступных
-                                  опций). Если $_SERVER['REQUEST_URI']
+                                  опций). Если <code>$_SERVER['REQUEST_URI']</code>
                                   соответствует нескольким регулярным
                                   выражениям, то используется только последнее
                                   из них.
@@ -861,7 +857,7 @@ $result = $cache->foobar2('1', '2');
         <sect3 id="zend.cache.frontends.page.examples">
             <title>Примеры</title>
             <para>
-                Использование <code>Zend_Cache_Frontend_Page</code> довольно
+                Использование <classname>Zend_Cache_Frontend_Page</classname> довольно
                 простое:
             </para>
             <programlisting role="php"><![CDATA[
@@ -872,12 +868,11 @@ $cache->start();
 // и выполнение скрипта на этом прекращается
 
 // остальная часть страницы ...
-]]>
-            </programlisting>
+]]></programlisting>
             <para>
                 Более сложный пример, показывающий способ создания
                 централизованного управления кэшированием в загрузочном файле
-                (например, для использования с <code>Zend_Controller</code>).
+                (например, для использования с <classname>Zend_Controller</classname>).
             </para>
             <programlisting role="php"><![CDATA[
 /*
@@ -928,11 +923,10 @@ $cache->start();
 
 // [...] конец загрузочного файла
 // (этот код не исполняется, если есть попадание в кэш)
-]]>
-            </programlisting>
+]]></programlisting>
         </sect3>
         <sect3 id="zend.cache.frontends.page.cancel">
-            <title>Специальный метод отмены</title>
+            <title>Отмена кэширования</title>
             <para>
                 В некоторых случаях может потребоваться отменить текущий
                 процесс кэширования - например, если используется код
@@ -952,8 +946,7 @@ if ($someTest) {
 }
 
 // [...]
-]]>
-            </programlisting>
+]]></programlisting>
         </sect3>
     </sect2>
 </sect1>

+ 12 - 13
documentation/manual/ru/module_specs/Zend_Cache-Introduction.xml

@@ -1,7 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.cache.introduction">
     <title>Введение</title>
     <para>
-        <code>Zend_Cache</code> предназначен для кэширования любых данных.
+        <classname>Zend_Cache</classname> предназначен для кэширования любых данных.
     </para>
     <para>
         Управление кэшированием в Zend Framework производится через фронтэнды
@@ -12,14 +14,14 @@
         (например: "удалить все записи кэша, помеченные данным тегом").
     </para>
     <para>
-        Ядро модуля (<code>Zend_Cache_Core</code>) является гибким,
+        Ядро модуля (<classname>Zend_Cache_Core</classname>) является гибким,
         универсальным и конфигурируемым. Кроме этого, для особых нужд есть
         фронтэнды, расширяющие
-        <code>Zend_Cache_Core</code>: <code>Output</code>, <code>File</code>,
-        <code>Function</code> и <code>Class</code>.
+        <classname>Zend_Cache_Core</classname>: <classname>Output</classname>,
+        <classname>File</classname>, <code>Function</code> и <code>Class</code>.
     </para>
     <example id="zend.cache.introduction.example-1">
-        <title>Получение фронтэнда с помощью <code>Zend_Cache::factory()</code></title>
+        <title>Получение фронтэнда с помощью Zend_Cache::factory()</title>
         <para>
             <code>Zend_Cache::factory()</code> инстанцирует нужные объекты и
             связывает их. В этом первом примере мы будем использовать
@@ -40,8 +42,7 @@ $cache = Zend_Cache::factory('Core',
                              'File',
                              $frontendOptions,
                              $backendOptions);
-]]>
-        </programlisting>
+]]></programlisting>
     </example>
 
     <note>
@@ -87,12 +88,11 @@ if(!$result = $cache->load('myresult')) {
 }
 
 print_r($result);
-]]>
-        </programlisting>
+]]></programlisting>
     </example>
 
     <example id="zend.cache.introduction.example-3">
-        <title>Кэширование вывода с помощью фронтэнда <code>Zend_Cache</code></title>
+        <title>Кэширование вывода с помощью фронтэнда Zend_Cache</title>
         <para>
             Мы размечаем участки, выходные данные которых хотим поместить в кэш,
             добавлением условной логики, окружая участок методами
@@ -129,8 +129,7 @@ if(!$cache->start('mypage')) {
 }
 
 echo 'This is never cached ('.time().').';
-]]>
-       </programlisting>
+]]></programlisting>
        <para>
            Обратите внимание, что мы выводим результат <code>time()</code>
            дважды - это демонстрация на примере динамических данных. Попробуйте
@@ -145,7 +144,7 @@ echo 'This is never cached ('.time().').';
        </para>
     </example>
     <note><para>
-        Когда используете <code>Zend_Cache</code>, уделяйте внимание
+        Когда используете <classname>Zend_Cache</classname>, уделяйте внимание
         идентификатору кэша (передается методам <code>save()</code> и
         <code>start()</code>). Он должен быть уникальным для каждого кэшируемого
         ресурса, иначе не связанные записи кэша могут затирать друг

+ 29 - 22
documentation/manual/ru/module_specs/Zend_Cache-Theory.xml

@@ -1,7 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.cache.theory">
     <title>Теория кэширования</title>
     <para>
-        Есть три ключевых понятия в <code>Zend_Cache</code>. Первое — уникальный
+        Есть три ключевых понятия в <classname>Zend_Cache</classname>. Первое — уникальный
         идентификатор (строка), который служит для идентификации записей кэша.
         Второе — это директива <code>'lifetime'</code>, которую вы могли видеть
         в предыдущих примерах; она определяет, в течение какого времени
@@ -13,7 +15,7 @@
         если это имеет смысл для данного фронэнда. Это дает конечным
         пользователям возможность включать части кода, которые нужно
         кэшировать (и затем пропускать) в операторы <code>if(){ ... }</code>,
-        где условием является сам метод <code>Zend_Cache</code>. Но в конце
+        где условием является сам метод <classname>Zend_Cache</classname>. Но в конце
         этих блоков вы должны сохранять то, что было сгенерировано (например,
         методом <code>Zend_Cache_Core::save()</code>).
     </para>
@@ -31,10 +33,10 @@
         то бэкэнд автоматически извлечет запись из кэша.
     </para></note>
     <sect2 id="zend.cache.factory">
-        <title>Фабричный метод <code>Zend_Cache</code></title>
+        <title>Фабричный метод Zend_Cache</title>
         <para>
             Корректным способом создания рабочего экземпляра
-            фронтэнда <code>Zend_Cache</code> является код показанный в
+            фронтэнда <classname>Zend_Cache</classname> является код показанный в
             следующем примере:
         </para>
         <programlisting role="php"><![CDATA[
@@ -52,9 +54,11 @@ $backendOptions = array([...]);
 
 // Создаем экземпляр
 // (два последних аргумента являются необязательными)
-$cache = Zend_Cache::factory($frontendName, $backendName, $frontendOptions, $backendOptions);
-]]>
-        </programlisting>
+$cache = Zend_Cache::factory($frontendName,
+                             $backendName,
+                             $frontendOptions,
+                             $backendOptions);
+]]></programlisting>
         <para>
             В последующих примерах мы предполагаем, что переменная
             <code>$cache</code> содержит инстанцированный, как показано в
@@ -78,8 +82,7 @@ $cache = Zend_Cache::factory($frontendName, $backendName, $frontendOptions, $bac
         </para>
         <programlisting role="php"><![CDATA[
 $cache->save($huge_data, 'myUniqueID', array('tagA', 'tagB', 'tagC'));
-]]>
-        </programlisting>
+]]></programlisting>
         <note>
             <para>
                 Метод <code>save()</code> принимает также необязательный
@@ -98,8 +101,7 @@ $cache->save($huge_data, 'myUniqueID', array('tagA', 'tagB', 'tagC'));
         </para>
         <programlisting role="php"><![CDATA[
 $cache->remove('idToRemove');
-]]>
-        </programlisting>
+]]></programlisting>
         <para>
             Для того, чтобы одновременно удалить или сделать
             недействительными несколько записей кэша, вы можете использовать
@@ -111,30 +113,35 @@ $cache->clean(Zend_Cache::CLEANING_MODE_ALL);
 
 // удаление только устаревших записей
 $cache->clean(Zend_Cache::CLEANING_MODE_OLD);
-]]>
-        </programlisting>
+]]></programlisting>
         <para>
             Если вы хотите удалить записи кэша, помеченные тегами 'tagA' и 'tagC':
         </para>
         <programlisting role="php"><![CDATA[
-$cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('tagA', 'tagC'));
-]]>
-        </programlisting>
+$cache->clean(
+    Zend_Cache::CLEANING_MODE_MATCHING_TAG,
+    array('tagA', 'tagC')
+);
+]]></programlisting>
         <para>
             Если вы хотите удалить записи кэша, <emphasis>не</emphasis> помеченные тегами 'tagA' и 'tagC':
             If you want to remove cache entries not matching the tags 'tagA' or 'tagC':
         </para>
         <programlisting role="php"><![CDATA[
-$cache->clean(Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG, array('tagA', 'tagC'));
-]]>
-        </programlisting>
+$cache->clean(
+    Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG,
+    array('tagA', 'tagC')
+);
+]]></programlisting>
         <para>
             Если вы хотите удалить записи кэша, помеченные тегами 'tagA' <emphasis>или</emphasis> 'tagC':
         </para>
         <programlisting role="php"><![CDATA[
-$cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, array('tagA', 'tagC'));
-]]>
-        </programlisting>
+$cache->clean(
+    Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG,
+    array('tagA', 'tagC')
+);
+]]></programlisting>
         <para>
             Доступные режимы очищения: <code>CLEANING_MODE_ALL</code> (удалить
             все), <code>CLEANING_MODE_OLD</code> (удалить устаревшие),

+ 17 - 19
documentation/manual/ru/module_specs/Zend_Config-Introduction.xml

@@ -1,25 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.config.introduction">
     <title>Введение</title>
     <para>
-        <code>Zend_Config</code> создан для того, чтобы сделать более
+        <classname>Zend_Config</classname> создан для того, чтобы сделать более
         простым доступ к конфигурационным данным и их использование внутри приложения.
         Он предоставляет основанный на вложенных свойствах объектов пользовательский
         интерфейс для доступа к конфигурационным данным внутри приложения.
         Конфигурационные данные могут храниться на различных носителях информации,
         поддерживающих хранение данных в виде иерархии. На данный момент
-        <code>Zend_Config</code> предоставляет адаптеры для конфигурационных
+        <classname>Zend_Config</classname> предоставляет адаптеры для конфигурационных
         данных, хранящихся в текстовых файлах:
-        <link linkend="zend.config.adapters.ini"><code>Zend_Config_Ini</code></link>
-        и <link linkend="zend.config.adapters.xml"><code>Zend_Config_Xml</code></link>.
+        <link linkend="zend.config.adapters.ini"><classname>Zend_Config_Ini</classname></link>
+        и <link linkend="zend.config.adapters.xml"><classname>Zend_Config_Xml</classname></link>.
     </para>
     <example id="zend.config.introduction.example.using">
-        <title>Использование <code>Zend_Config</code></title>
+        <title>Использование Zend_Config</title>
         <para>
             Обычно предполагается, что используется один из классов адаптеров, например,
-            <link linkend="zend.config.adapters.ini"><code>Zend_Config_Ini</code></link>
-            или <link linkend="zend.config.adapters.xml"><code>Zend_Config_Xml</code></link>.
+            <link linkend="zend.config.adapters.ini"><classname>Zend_Config_Ini</classname></link>
+            или <link linkend="zend.config.adapters.xml"><classname>Zend_Config_Xml</classname></link>.
             Но если конфигурационные данные доступны в виде массива PHP,
-            то можно передавать эти данные конструктору <code>Zend_Config</code>,
+            то можно передавать эти данные конструктору <classname>Zend_Config</classname>,
             чтобы использовать преимущества простого объектно-ориентированного
             интерфейса.
         </para>
@@ -52,30 +54,28 @@ $db = Zend_Db::factory($config->database->adapter,
 // Альтернативный способ - просто передавайте объект Zend_Config.
 // Фабрика Zend_Db знает, как его интерпретировать.
 $db = Zend_Db::factory($config->database);
-]]>
-        </programlisting>
+]]></programlisting>
     </example>
     <para>
-        Как показано в предыдущем примере, в <code>Zend_Config</code> для
+        Как показано в предыдущем примере, в <classname>Zend_Config</classname> для
         доступа к конфигурационным данным, переданным его конструктору,
         используется синтаксис вложенных свойств объектов.
     </para>
     <para>
         Кроме объектно-ориентированного доступа к значениям данных,
-        <code>Zend_Config</code> также предоставляет метод <code>get()</code>,
+        <classname>Zend_Config</classname> также предоставляет метод <code>get()</code>,
         который будет возвращать значение по умолчанию, если элемент
         данных не существует. Например:
     </para>
     <programlisting role="php"><![CDATA[
 $host = $config->database->get('host', 'localhost');
-]]>
-    </programlisting>
+]]></programlisting>
     <example id="zend.config.introduction.example.file.php">
-        <title>Использование <code>Zend_Config</code> с конфигурационным файлом PHP</title>
+        <title>Использование Zend_Config с конфигурационным файлом PHP</title>
         <para>
             Часто требуется использовать конфигурационный файл,
             основанный на "чистом" PHP. Следующий код показывает, как просто
-            этого достичь.
+            этого достичь:
         </para>
         <programlisting role="php"><![CDATA[
 // config.php
@@ -93,13 +93,11 @@ return array(
 );]]></programlisting>
         <programlisting role="php"><![CDATA[
 // Использование конфигурации
-require_once 'Zend/Config.php';
 $config = new Zend_Config(require 'config.php');
 
 // Вывод элемента конфигурационных данных (результатом будет 'www.example.com')
 echo $config->webhost;
-]]>
-        </programlisting>
+]]></programlisting>
     </example>
 </sect1>
 <!--

+ 20 - 20
documentation/manual/ru/module_specs/Zend_Config-TheoryOfOperation.xml

@@ -1,56 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.config.theory_of_operation">
     <title>Теоретические основы работы с Zend_Config</title>
     <para>
-        Конфигурационные данные передаются конструктору <code>Zend_Config</code>
+        Конфигурационные данные передаются конструктору <classname>Zend_Config</classname>
         в виде ассоциативного массива, который может быть многомерным, что
         дает возможность организовывать данные от общего к частному. Классы
         адаптеров преобразуют конфигурационные данные из хранилища в
-        ассоциативный массив для конструктора <code>Zend_Config</code>.
+        ассоциативный массив для конструктора <classname>Zend_Config</classname>.
         Можно также передавать массивы непосредственно конструктору
-        <code>Zend_Config</code>
+        <classname>Zend_Config</classname>
         без использования класса адаптера, т.к. это может быть наиболее
         подходящим решением в некоторых ситуациях.
     </para>
-
     <para>
         Каждое значение массива конфигурационных значений становится свойством
-        объекта <code>Zend_Config</code>. Ключ массива используется как имя
+        объекта <classname>Zend_Config</classname>. Ключ массива используется как имя
         свойства. Если значение само является массивом, то соответствующее
-        свойство создается как объект <code>Zend_Config</code>, который
+        свойство создается как объект <classname>Zend_Config</classname>, который
         заполняется данными этого массива. Это производится рекурсивно, т.о.,
         иерархия конфигурационных данных может иметь любой уровень вложенности.
     </para>
-
     <para>
-        <code>Zend_Config</code> реализует интерфейсы <code>Countable</code>
+        <classname>Zend_Config</classname> реализует интерфейсы <code>Countable</code>
         и <code>Iterator</code> для того, чтобы обеспечить простой доступ
         к конфигурационным данным. Поэтому с объектами
-        <code>Zend_Config</code> можно использовать функцию
+        <classname>Zend_Config</classname> можно использовать функцию
         <ulink url="http://php.net/count"><code>count()</code></ulink> и
         такие конструкции языка PHP, как
         <ulink url="http://php.net/foreach"><code>foreach</code></ulink>.
     </para>
     <para>
-        По умолчанию через <code>Zend_Config</code> конфигурационные данные
+        По умолчанию через <classname>Zend_Config</classname> конфигурационные данные
         доступны только для чтения, и операция присваивания (например,
         <code>$config->database->host = 'example.com'</code>)
         вызовет исключение. Тем не менее, это поведение
         может быть отменено при вызове конструктора, и тогда
         можно будет изменять конфигурационные данные.
-        Если модификации разрешены, то <code>Zend_Config</code> также
+        Если модификации разрешены, то <classname>Zend_Config</classname> также
         поддерживает уничтожение значений
         (т.е. <code>unset($config->database->host);</code>).
         Метод <code>readOnly()</code> может использоваться для определения того,
-        был ли разрешены модификации в данном объекте <code>Zend_Config</code>.
+        был ли разрешены модификации в данном объекте <classname>Zend_Config</classname>.
         Метод <code>setReadOnly()</code> запрещает все дальнейшие изменения в
-        объекте <code>Zend_Config</code>, который был создан с разрешением
+        объекте <classname>Zend_Config</classname>, который был создан с разрешением
         изменений.
         <note>
             <para>
                 Важно не путать изменение данных в памяти с сохранением
                 конфигурационных данных на физическом носителе данных. Создание
                 и изменение конфигурационных данных на различных
-                носителях данных не входит в сферу назначений <code>Zend_Config</code>.
+                носителях данных не входит в сферу назначений <classname>Zend_Config</classname>.
                 Для создания и изменения конфигурационных данных на различных
                 носителях информации можно использовать
                 сторонние разработки с открытым исходным кодом.
@@ -58,18 +58,18 @@
         </note>
     </para>
     <para>
-        Классы адаптеров наследуют от класса <code>Zend_Config</code>,
+        Классы адаптеров наследуют от класса <classname>Zend_Config</classname>,
         и, следовательно, имеют тот же функционал.
     </para>
     <para>
-        Семейство классов <code>Zend_Config</code> позволяет
+        Семейство классов <classname>Zend_Config</classname> позволяет
         организовывать конфигурационные данные, разбивая их на разделы.
-        В объекты адаптеров <code>Zend_Config</code> можно загружать
+        В объекты адаптеров <classname>Zend_Config</classname> можно загружать
         один определенный раздел, несколько разделов или все разделы
         данных (если не указан раздел).
     </para>
     <para>
-        Классы адаптеров <code>Zend_Config</code> поддерживают единую модель
+        Классы адаптеров <classname>Zend_Config</classname> поддерживают единую модель
         наследования, которая позволяет одному разделу наследовать
         конфигурационные данные из другого. Это сделано для того, чтобы
         уменьшить или устранить необходимость дублирования конфигурационных
@@ -80,7 +80,7 @@
         C наследует напрямую от разделов A и B) не поддерживается.
     </para>
     <para>
-        Если вы имеете два объекта <code>Zend_Config</code>, то можете объединить
+        Если вы имеете два объекта <classname>Zend_Config</classname>, то можете объединить
         их в один, используя функцию <code>merge()</code>. Например, имея
         <code>$config</code> и <code>$localConfig</code> вы можете объединить
         данные из <code>$localConfig</code> с данными из <code>$config</code>,
@@ -89,7 +89,7 @@
         <code>$config</code>.
         <note>
             <para>
-                Объект <code>Zend_Config</code>, который выполняет объединение,
+                Объект <classname>Zend_Config</classname>, который выполняет объединение,
                 должен быть создан с разрешением модификаций путем передачи
                 <code>true</code> в качестве второго параметра конструктора.
                 После того, как объединение будет завершено, можно использовать

+ 12 - 13
documentation/manual/ru/module_specs/Zend_Config_Ini.xml

@@ -1,7 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.config.adapters.ini">
     <title>Zend_Config_Ini</title>
     <para>
-        <code>Zend_Config_Ini</code> дает разработчикам возможность хранить
+        <classname>Zend_Config_Ini</classname> дает разработчикам возможность хранить
         конфигурационные данные в знакомом большинству формате INI и считывать
         их в приложении с использованием синтаксиса вложенных свойств объекта.
         Формат INI специализируется на обеспечении иерархии конфигурационных
@@ -15,11 +17,11 @@
     <note>
         <title>Синтаксический разбор INI-файла</title>
         <para>
-            <code>Zend_Config_Ini</code> использует функцию PHP
+            <classname>Zend_Config_Ini</classname> использует функцию PHP
             <ulink url="http://php.net/parse_ini_file"><code>parse_ini_file()</code></ulink>.
             Пожалуйста, почитайте документацию, чтобы получить представление об
             особенностях ее поведения, которые распространяются и на
-            <code>Zend_Config_Ini</code> — например, о том, как обрабатываются
+            <classname>Zend_Config_Ini</classname> — например, о том, как обрабатываются
             специальные значения <code>true</code>, <code>false</code>, <code>yes</code>,
             <code>no</code> и <code>null</code>.
         </para>
@@ -30,21 +32,20 @@
             По умолчанию разделителем ключей является символ точки
             (<code>.</code>). Он может быть заменен на любой другой путем
             изменения ключа <code>'nestSeparator'</code> в массиве
-            <code>$options</code> при создании объекта <code>Zend_Config_Ini</code>.
+            <code>$options</code> при создании объекта <classname>Zend_Config_Ini</classname>.
             Например:
             <programlisting role="php"><![CDATA[
 $options['nestSeparator'] = ':';
 $config = new Zend_Config_Ini('/path/to/config.ini',
                               'staging',
                               $options);
-]]>
-            </programlisting>
+]]></programlisting>
         </para>
     </note>
     <example id="zend.config.adapters.ini.example.using">
-        <title>Использование <code>Zend_Config_Ini</code></title>
+        <title>Использование Zend_Config_Ini</title>
         <para>
-            Данный пример демонстрирует использование <code>Zend_Config_Ini</code>
+            Данный пример демонстрирует использование <classname>Zend_Config_Ini</classname>
             для загрузки конфигурационных данных из файла INI. В этом примере
             используются конфигурационные данные для производственной и
             промежуточной систем. Поскольку конфигурационные данные для
@@ -72,8 +73,7 @@ database.params.dbname   = dbname
 database.params.host     = dev.example.com
 database.params.username = devuser
 database.params.password = devsecret
-]]>
-</programlisting>
+]]></programlisting>
         <para>
             Далее предположим, что разработчику приложения нужны "промежуточные"
             конфигурационные данные из файла INI. Загрузить эти данные,
@@ -84,15 +84,14 @@ $config = new Zend_Config_Ini('/path/to/config.ini', 'staging');
 
 echo $config->database->params->host;   // выведет "dev.example.com"
 echo $config->database->params->dbname; // выведет "dbname"
-]]>
-        </programlisting>
+]]></programlisting>
     </example>
     <note>
     <table id="zend.config.adapters.ini.table">
         <title>Параметры конструктора Zend_Config_Ini</title>
         <tgroup cols="2">
             <thead>
-                  <row>
+                <row>
                     <entry>Параметр</entry>
                     <entry>Примечание</entry>
                 </row>

+ 18 - 18
documentation/manual/ru/module_specs/Zend_Config_Writer.xml

@@ -1,11 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.config.writer.introduction">
     <title>Zend_Config_Writer</title>
     <para>
-        <code>Zend_Config_Writer</code> позволяет создавать конфигурационные
-        файлы из объектов <code>Zend_Config</code>.
+        <classname>Zend_Config_Writer</classname> позволяет создавать конфигурационные
+        файлы из объектов <classname>Zend_Config</classname>.
         Он работает и без использования адаптеров и, таким образом, очень прост
         в использовании.
-        По умолчанию <code>Zend_Config_Writer</code> поставляется с тремя
+        По умолчанию <classname>Zend_Config_Writer</classname> поставляется с тремя
         адаптерами, которые используются одинаково. Вы инстанцируете класс для
         записи с опциями, которыми могут быть <code>filename</code>
         (имя файла) и <code>config</code> (конфигурационные данные).
@@ -13,48 +15,48 @@
         создает конфигурационный файл. Вы можете также передавать
         <code>$filename</code> и <code>$config</code> непосредственно
         методу <code>write()</code>. В настоящее время вместе с
-        <code>Zend_Config_Writer</code> поставляются следующие адаптеры:
+        <classname>Zend_Config_Writer</classname> поставляются следующие адаптеры:
     </para>
 
     <itemizedlist>
         <listitem>
             <para>
-                <code>Zend_Config_Writer_Array</code>
+                <classname>Zend_Config_Writer_Array</classname>
             </para>
         </listitem>
         <listitem>
             <para>
-                <code>Zend_Config_Writer_Ini</code>
+                <classname>Zend_Config_Writer_Ini</classname>
             </para>
         </listitem>
         <listitem>
             <para>
-                <code>Zend_Config_Writer_Xml</code>
+                <classname>Zend_Config_Writer_Xml</classname>
             </para>
         </listitem>
     </itemizedlist>
 
     <para>
-        В качестве исключения <code>Zend_Config_Writer_Ini</code> имеет
+        В качестве исключения <classname>Zend_Config_Writer_Ini</classname> имеет
         еще один опциональный параметр <code>nestSeparator</code>, через
         который указывается символ-разделитель для узлов.
-        По умолчанию это точка, как и в <code>Zend_Config_Ini</code>.
+        По умолчанию это точка, как и в <classname>Zend_Config_Ini</classname>.
     </para>
 
     <para>
-        При изменении или создании объекта <code>Zend_Config</code> следует
-        знать следующее.
+        При изменении или создании объекта <classname>Zend_Config</classname>
+        следует знать следующее.
         Для того, чтобы создать или изменить значение, устанавливайте
-        параметр объекта <code>Zend_Config</code> через аксессор
+        параметр объекта <classname>Zend_Config</classname> через аксессор
         <code>-&gt;</code>. Для того, чтобы создать раздел в корне или
         ветку, создавайте новый массив
         (<code>$config-&gt;branch = array();</code>). Для того, чтобы
         указать, от какого раздела наследует другой, вызывайте метод в корне
-        объекта <code>Zend_Config</code>.
+        объекта <classname>Zend_Config</classname>.
     </para>
 
     <example id="zend.config.writer.example.using">
-        <title>Использование <code>Zend_Config_Writer</code></title>
+        <title>Использование Zend_Config_Writer</title>
         <para>
             Этот пример демонстрирует использование
             <code>Zend_Config_Writer_Xml</code> для создания нового
@@ -90,8 +92,7 @@ $writer->setConfig($config)
 // в)
 $writer = new Zend_Config_Writer_Xml();
 $writer->write('config.xml', $config);
-]]>
-        </programlisting>
+]]></programlisting>
         <para>
             В этом примере создается конфигурационный
             XML-файл с "промежуточным" (staging) и "производственным"
@@ -121,8 +122,7 @@ $config->production->hostname = 'foobar';
 $writer = new Zend_Config_Writer_Ini(array('config'   => $config,
                                            'filename' => 'config.ini'));
 $writer->write();
-]]>
-        </programlisting>
+]]></programlisting>
     </example>
 
     <note>

+ 55 - 22
documentation/manual/ru/module_specs/Zend_Config_Xml.xml

@@ -1,30 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.config.adapters.xml">
     <title>Zend_Config_Xml</title>
     <para>
-        <code>Zend_Config_Xml</code> дает разработчикам возможность хранить
-        конфигурационные данные в простом формате XML и читать их посредством синтаксиса
-        вложенных свойств объектов. Корневой элемент файла XML не имеет значения
-        и ему может быть дано любое имя. Первый уровень элементов XML
-        соответствует разделам конфигурационных данных. Формат XML поддерживает
-        иерархическую организацию данных через вложенность элементов
-        ниже элементов уровня разделов. Содержимое конечного элемента соответствует
-        значению элемента конфигурационных данных. Наследование разделов
-        поддерживается через специальный атрибут <code>extends</code>, значение
-        атрибута соответствует разделу, данные которого наследуются в
+        <classname>Zend_Config_Xml</classname> дает разработчикам возможность
+        хранить конфигурационные данные в простом формате XML и читать их
+        посредством синтаксиса вложенных свойств объектов.
+        Корневой элемент в файле или строке с XML не имеет значения и ему
+        может быть дано любое имя. Первый уровень
+        элементов XML соответствует разделам конфигурационных данных. Формат
+        XML поддерживает иерархическую организацию данных через вложенность
+        элементов ниже элементов уровня разделов. Содержимое конечного элемента
+        соответствует значению элемента конфигурационных данных. Наследование
+        разделов поддерживается через специальный атрибут <code>extends</code>,
+        значение атрибута соответствует разделу, данные которого наследуются в
         раздел с этим атрибутом.
     </para>
     <note>
         <title>Тип возвращаемых данных</title>
         <para>
-            Конфигурационные данные, прочитанные в <code>Zend_Config_Xml</code>,
+            Конфигурационные данные, прочитанные в <classname>Zend_Config_Xml</classname>,
             всегда возвращаются как строки. Приведение данных из строк к требуемым
             типам предоставляется разработчикам.
         </para>
     </note>
     <example id="zend.config.adapters.xml.example.using">
-        <title>Использование <code>Zend_Config_Xml</code></title>
+        <title>Использование Zend_Config_Xml</title>
         <para>
-            Данный пример демонстрирует основы использования <code>Zend_Config_Xml</code>
+            Данный пример демонстрирует основы использования <classname>Zend_Config_Xml</classname>
             для загрузки конфигурационных данных из файла XML. В этом примере
             используются конфигурационные данные для производственной и
             промежуточной систем. Поскольку конфигурационные данные
@@ -60,8 +63,7 @@
             </params>
         </database>
     </staging>
-]]>
-</programlisting>
+]]></programlisting>
         <para>
             Далее предположим, что разработчику приложения нужны "промежуточные"
             конфигурационные данные из файла XML. Загрузить эти данные, указав
@@ -72,11 +74,10 @@ $config = new Zend_Config_Xml('/path/to/config.xml', 'staging');
 
 echo $config->database->params->host;   // выведет "dev.example.com"
 echo $config->database->params->dbname; // выведет "dbname"
-]]>
-        </programlisting>
+]]></programlisting>
     </example>
     <example id="zend.config.adapters.xml.example.attributes">
-        <title>Использование тегов в <code>Zend_Config_Xml</code></title>
+        <title>Использование тегов в <classname>Zend_Config_Xml</classname></title>
         <para>
             Zend_Config_Xml также поддерживает два дополнительных способа
             определения узлов в конфигурации. В обоих способах используются
@@ -102,8 +103,7 @@ echo $config->database->params->dbname; // выведет "dbname"
         </database>
     </staging>
 </configdata>
-]]>
-</programlisting>
+]]></programlisting>
         <para>
             Другой способ не делает конфигурацию заметно короче, но
             облегчает ее поддержку благодаря тому, что не нужно писать имена
@@ -135,9 +135,42 @@ echo $config->database->params->dbname; // выведет "dbname"
         </database>
     </staging>
 </configdata>
-]]>
-</programlisting>
+]]></programlisting>
     </example>
+    <note>
+        <title>Передача строки с XML</title>
+        <para>
+            <classname>Zend_Config_Xml</classname> также может загружать
+            XML непосредственно из строки, которая может быть получена,
+            например, из базы данных. Строка передается конструктору в качестве
+            первого параметра и должна начинаться с символов
+            <code>'&lt;?xml'</code>:
+        </para>
+        <programlisting role="xml"><![CDATA[
+$string = <<<EOT
+<?xml version="1.0"?>
+<config>
+    <production>
+        <db>
+            <adapter value="pdo_mysql"/>
+            <params>
+                <host value="db.example.com"/>
+            </params>
+        </db>
+    </production>
+    <staging extends="production">
+        <db>
+            <params>
+                <host value="dev.example.com"/>
+            </params>
+        </db>
+    </staging>
+</config>
+EOT;
+
+$config = new Zend_Config_Xml($string, 'staging');
+]]></programlisting>
+    </note>
 </sect1>
 <!--
 vim:se ts=4 sw=4 et:

+ 20 - 27
documentation/manual/ru/module_specs/Zend_Filter-FilterChains.xml

@@ -1,45 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.filter.filter_chains">
 
-    <title>Цепочки фильтров<!--Filter Chains--></title>
+    <title>Цепочки фильтров</title>
 
     <para>
-        Часто к одним и тем же данным должно быть применено несколько фильтров в определенном порядке. Например, форма аутентификации должна принимать имя пользователя, состояшее только из алфавитных символов в нижнем регистре. <code>Zend_Filter</code> предоставляет простой метод, посредством которого составляется цепочка фильтров. Следующий код показывает, как создать цепочку из двух фильтров для имени пользователя.
-<!--
-        Often multiple filters should be applied to some value in a particular order. For example, a
-        login form accepts a username that should be only lowercase, alphabetic characters.
-        <code>Zend_Filter</code> provides a simple method by which filters may be chained together. The
-        following code illustrates how to chain together two filters for the submitted username:
--->
-        <programlisting role="php"><![CDATA[<?php
-// Предоставляет возможность создания цепочек фильтров
-require_once 'Zend/Filter.php';
-
-// Фильтры, нужные для примера
-require_once 'Zend/Filter/Alpha.php';
-require_once 'Zend/Filter/StringToLower.php';
-
+        Довольно часто встречается ситуация, когда к одним и тем же данным нужно
+        применить несколько фильтров в определенном порядке.
+        Например, форма аутентификации должна принимать имя пользователя,
+        состояшее только из алфавитных символов в нижнем регистре.
+        <classname>Zend_Filter</classname> предоставляет простой метод, через который
+        составляется цепочка из фильтров. Следующий код демонстрирует
+        создание цепочки из двух фильтров для имени пользователя:
+        
+        <programlisting role="php"><![CDATA[
 // Создание цепочки фильтров и добавление в нее фильтров
 $filterChain = new Zend_Filter();
 $filterChain->addFilter(new Zend_Filter_Alpha())
             ->addFilter(new Zend_Filter_StringToLower());
 
 // Фильтрация имени пользователя
-$username = $filterChain->filter($_POST['username']);]]></programlisting>
+$username = $filterChain->filter($_POST['username']);
+]]></programlisting>
 
         Фильтры применяются в том же порядке, в котором они были добавлены в
-        <code>Zend_Filter</code>. В примере выше из имени пользователя сначала удаляются все неалфавитные символы, затем все символы в верхнем регистре приводятся к нижнему.
-<!--
-        Filters are run in the order they were added to <code>Zend_Filter</code>. In the above example, the
-        username is first removed of any non-alphabetic characters, and then any uppercase characters are
-        converted to lowercase.
--->
+        <classname>Zend_Filter</classname>. В примере выше из имени пользователя
+        сначала удаляются все неалфавитные символы, затем все символы
+        приводятся к нижнему регистру.
+
     </para>
 
     <para>
-        Все объекты, реализующие интерфейс <code>Zend_Filter_Interface</code>, могут использоваться в цепочке фильтров.
-<!--
-        Any object that implements <code>Zend_Filter_Interface</code> may be used in a filter chain.
--->
+        Все объекты, реализующие интерфейс <classname>Zend_Filter_Interface</classname>,
+        могут использоваться в цепочке фильтров.
     </para>
 
 </sect1>

+ 18 - 26
documentation/manual/ru/module_specs/Zend_Filter-WritingFilters.xml

@@ -1,34 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.filter.writing_filters">
 
-    <title>Написание фильтров<!--Writing Filters--></title>
+    <title>Написание фильтров</title>
 
     <para>
-        Zend_Filter предоставляет набор наиболее часто используемых фильтров, но разработчикам для решения определенных задач может потребоваться написать свои фильтры. Написание своих фильтров облегчается реализацией интерфейса <code>Zend_Filter_Interface</code>.
-<!--
-        Zend_Filter supplies a set of commonly needed filters, but developers will often need to write custom
-        filters for their particular use cases. The task of writing a custom filter is facilitated by
-        implementing <code>Zend_Filter_Interface</code>.
--->
+        <classname>Zend_Filter</classname> предоставляет набор наиболее часто
+        используемых фильтров, но в некоторых случаях может потребоваться
+        написание своих фильтров. Эта задача облегчается
+        реализацией интерфейса <classname>Zend_Filter_Interface</classname>.
     </para>
 
     <para>
-        <code>Zend_Filter_Interface</code> определяет единственный метод <code>filter()</code>, который может быть реализован своими классами. Объект класса, реализующего данный интерфейс, может быть добавлен в цепочку фильтров через метод <code>Zend_Filter::addFilter()</code>.
-<!--
-        <code>Zend_Filter_Interface</code> defines a single method, <code>filter()</code>, that may be
-        implemented by user classes. An object that implements this interface may be added to a filter chain
-        with <code>Zend_Filter::addFilter()</code>.
--->
+        <classname>Zend_Filter_Interface</classname> определяет единственный метод
+        <code>filter()</code>, который должен быть реализован классом фильтра.
+        Объект класса, реализующего данный интерфейс, может быть добавлен в
+        цепочку фильтров через метод <code>Zend_Filter::addFilter()</code>.
     </para>
 
     <para>
-        Следующий пример демонстрирует, как можно писать свои фильтры:
-<!--
-        The following example demonstrates how to write a custom filter:
--->
-
-        <programlisting role="php"><![CDATA[<?php
-require_once 'Zend/Filter/Interface.php';
+        Следующий пример демонстрирует, как можно создавать свои фильтры:
 
+        <programlisting role="php"><![CDATA[
 class MyFilter implements Zend_Filter_Interface
 {
     public function filter($value)
@@ -38,19 +31,18 @@ class MyFilter implements Zend_Filter_Interface
 
         return $valueFiltered;
     }
-}]]></programlisting>
+}
+]]></programlisting>
 
     </para>
 
     <para>
         Добавление экземпляра этого фильтра в цепочку фильтров:
-<!--
-        To add an instance of the above filter to a filter chain:
--->
 
-        <programlisting role="php"><![CDATA[<?php
+        <programlisting role="php"><![CDATA[
 $filterChain = new Zend_Filter();
-$filterChain->addFilter(new MyFilter());]]></programlisting>
+$filterChain->addFilter(new MyFilter());
+]]></programlisting>
 
     </para>
 

+ 108 - 51
documentation/manual/ru/module_specs/Zend_Filter.xml

@@ -1,70 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.filter.introduction">
 
     <title>Введение</title>
 
     <para>
-        Компонента Zend_Filter предоставляет набор наиболее часто используемых фильтров данных. Она также предоставляет простой механизм формирования цепочки фильтров данных, посредством которого которому одни и те же данные могут обрабатывать несколько фильтров в порядке, заданном пользователем.
-<!--
-        The Zend_Filter component provides a set of commonly needed data filters. It also provides a simple
-        filter chaining mechanism by which multiple filters may be applied to a single datum in a
-        user-defined order.
--->
+        Компонента <classname>Zend_Filter</classname> предоставляет набор наиболее часто используемых
+        фильтров данных. Она также предоставляет простой механизм формирования
+        цепочек фильтров данных, с использованием которого одни и те же
+        данные могут обрабатываться несколькими фильтрами в порядке, заданном
+        пользователем.
     </para>
 
-    <para>
-        <emphasis role="strong">Что такое фильтр?<!--What is a filter?--></emphasis>
-    </para>
+    <sect2 id="zend.filter.introduction.definition">
 
-    <para>
-        В материальном мире фильтр обычно используется для удаления нежелательных частей ввода. Желаемые части ввода проходят сквозь фильтр как вывод фильтра (например, кофе). В таких сценариях фильтр является опрератором, который выделяет подмножество ввода. Этот тип фильтра полезен для веб-приложений - удаление недопустимого ввода, лишних пробельных символов и т.д.
-<!--
-        In the physical world, a filter is typically used for removing unwanted portions of input, and the
-        desired portion of the input passes through as filter output (e.g., coffee). In such scenarios, a
-        filter is an operator that produces a subset of the input. This type of filtering is useful for web
-        applications - removing illegal input, trimming unnecessary white space, etc.
--->
-    </para>
+        <title>Что есть фильтр?</title>
 
-    <para>
-        Это базовое определение фильтра может быть расширено включением общих преобразований ввода. Часто встречающееся в веб-приложениях преобразование - экранирование сущностей HTML (HTML entities). Например, если поле формы автоматически заполняется ненадежными данными (пример, данными из веб-броузера), то это значение не должно включать в себя сущности HTML, либо эти сущности должны быть экранированы, для предотвращения нежелательного поведения и угроз безопасности. В соответствии с этими требованиями сущности HTML должны быть удалены или экранированы - выбор подхода зависит от ситуации. Фильтр, который экранирует сущности HTML, тем не менее, преобразовывает ввод (например, "<code>&amp;</code>" преобразовывается в "<code>&amp;amp;</code>"). Поддержка таких случаев использования важна для веб-разработчиков и "фильтрация" в контексте использования Zend_Filter подразумевает выполнение некоторых преобразований над входными данными.
-<!--
-        This basic definition of a filter may be extended to include generalized transformations upon input.
-        A common transformation applied in web applications is the escaping of HTML entities. For example, if
-        a form field is automatically populated with untrusted input (e.g., from a web browser), this value
-        should either be free of HTML entities or contain only escaped HTML entities, in order to prevent
-        undesired behavior and security vulnerabilities. To meet this requirement, HTML entities that appear
-        in the input must either be removed or escaped. Of course, which approach is more appropriate depends
-        on the situation. A filter that removes the HTML entities operates within the scope of the first
-        definition of filter - an operator that produces a subset of the input. A filter that escapes the
-        HTML entities, however, transforms the input (e.g., "<code>&amp;</code>" is transformed to
-        "<code>&amp;amp;</code>"). Supporting such use cases for web developers is important, and "to
-        filter," in the context of using Zend_Filter, means to perform some transformations upon input data.
--->
-    </para>
+        <para>
+            В материальном мире фильтр обычно используется для удаления
+            нежелательных частей ввода. Желаемые части ввода проходят сквозь
+            фильтр и являются выводом фильтра. В таких сценариях фильтр
+            является опрератором, который выделяет подмножество ввода. Этот
+            тип фильтра полезен для веб-приложений - удаление недопустимого
+            ввода, лишних пробельных символов и т.д.
+        </para>
+    
+        <para>
+            Это базовое определение фильтра может быть расширено включением
+            общих преобразований ввода. Часто встречающееся в веб-приложениях
+            преобразование - экранирование сущностей HTML (HTML entities).
+            Например, если поле формы автоматически заполняется ненадежными
+            данными (например, данными из веб-броузера), то это значение не
+            должно включать в себя сущности HTML, либо эти сущности должны
+            быть экранированы, для предотвращения нежелательного поведения
+            и угроз безопасности. В соответствии с этими требованиями сущности
+            HTML должны быть удалены или экранированы - выбор подхода зависит
+            от ситуации. Фильтр, который экранирует сущности HTML, тем не
+            менее, преобразовывает ввод (например, "<code>&amp;</code>"
+            преобразовывается в "<code>&amp;amp;</code>"). Поддержка таких
+            случаев использования важна для веб-разработчиков и "фильтрация"
+            в контексте использования <classname>Zend_Filter</classname> подразумевает выполнение
+            некоторых преобразований над входными данными.
+        </para>
 
-    <para>
-        Такое определение фильтра дает основу для <code>Zend_Filter_Interface</code>, который требует от классов фильтров реализации одного метода с именем <code>filter()</code>.
-<!--
-        Having this filter definition established provides the foundation for
-        <code>Zend_Filter_Interface</code>, which requires a single method named <code>filter()</code> to be
-        implemented by a filter class.
--->
-    </para>
+    </sect2>
 
-    <para>
-        Ниже приведен пример использования фильтра с двумя вариантами входных данных - амперсандом (<code>&amp;</code>) и двойными кавычками (<code>&quot;</code>).
-<!--
-        Following is a basic example of using a filter upon two input data, the ampersand (<code>&amp;</code>)
-        and double quote (<code>&quot;</code>) characters:
--->
-        <programlisting role="php"><![CDATA[<?php
-require_once 'Zend/Filter/HtmlEntities.php';
+    <sect2 id="zend.filter.introduction.using">
+
+        <title>Основы использования фильтров</title>
+
+        <para>
+            Такое определение фильтра дает основу для
+            <classname>Zend_Filter_Interface</classname>, который требует
+            от классов фильтров реализации одного метода с именем
+            <code>filter()</code>.
+        </para>
+    
+        <para>
+            Ниже приведен пример использования фильтра с двумя вариантами
+            входных данных - амперсандом (<code>&amp;</code>) и двойными
+            кавычками (<code>&quot;</code>).
+            
+            <programlisting role="php"><![CDATA[
 $htmlEntities = new Zend_Filter_HtmlEntities();
+
 echo $htmlEntities->filter('&'); // &amp;
-echo $htmlEntities->filter('"'); // &quot;]]></programlisting>
+echo $htmlEntities->filter('"'); // &quot;
+]]></programlisting>
 
     </para>
 
+    </sect2>
+    
+    <sect2 id="zend.filter.introduction.static">
+
+        <title>Использование статического метода get()</title>
+
+        <para>
+            Каждый раз загружать нужный класс фильтра и создавать его экземпляр
+            довольно неудобно, поэтому был создан статический метод
+            <code>Zend_Filter::get()</code>, который можно использовать как
+            альтернативный способ вызова.
+            Первым агрументом этого метода является значение входных данных,
+            которое требуется передать методу <code>filter()</code>. Вторым
+            аргументом является строка, которая соответствует базовому имени
+            класса фильтра относительно пространства имен <classname>Zend_Filter</classname>.
+            Метод <code>get()</code> автоматически загружает класс,
+            создает его экземпляр и применяет метод <code>filter()</code> к
+            входным данным.
+
+            <programlisting role="php"><![CDATA[
+echo Zend_Filter::get('&', 'HtmlEntities');
+]]></programlisting>
+
+        </para>
+
+        <para>
+            Можно также передавать массив аргументов для конструктора, если это
+            необходимо для используемого класса фильтра.
+
+            <programlisting role="php"><![CDATA[
+echo Zend_Filter::get('"', 'HtmlEntities', array(ENT_QUOTES));
+]]></programlisting>
+
+        </para>
+
+        <para>
+            Использование метода <code>get()</code> может быть удобным для
+            единичного вызова фильтра. Но если нужно пропустить через один и
+            тот же фильтр несколько значений, то более эффективным будет
+            создавать экземпляр фильтра и вызывать его метод
+            <code>filter()</code>, как это было показано в первом примере.
+        </para>
+
+        <para>
+            <classname>Zend_Filter_Input</classname> также позволяет инстанцировать и запускать
+            несколько фильтров и валидаторов для обработки наборов
+            данных. Более подробную информацию читайте в
+            <xref linkend="zend.filter.input" />.
+        </para>
+
+    </sect2>
+
 </sect1>
 <!--
 vim:se ts=4 sw=4 et:

+ 86 - 151
documentation/manual/ru/module_specs/Zend_Uri.xml

@@ -1,72 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.uri.chapter">
   <title>Zend_Uri</title>
 
   <sect2 id="zend.uri.overview">
-    <title>Обзор<!--Overview--></title>
+    <title>Обзор</title>
 
     <para>
-      <code>Zend_Uri</code> является компонентой, которая призвана облегчить
+      <classname>Zend_Uri</classname> является компонентой, которая призвана облегчить
       работу с URI (<ulink url="http://www.w3.org/Addressing/">Uniform Resource
-      Identifiers</ulink>) и их валидацию. <code>Zend_Uri</code> был создан для
-      обслуживания других компонент, таких, как <code>Zend_Http_Client</code>,
+      Identifiers</ulink>) и их валидацию. <classname>Zend_Uri</classname> был создан для
+      обслуживания других компонент, таких, как <classname>Zend_Http_Client</classname>,
       но полезен и как отдельная утилита.
-<!--
-      <code>Zend_Uri</code> is a component that aids in manipulating and
-      validating <ulink url="http://www.w3.org/Addressing/">Uniform Resource
-      Identifiers</ulink> (URIs). <code>Zend_Uri</code> exists primarily to
-      service other components such as <code>Zend_Http_Client</code> but is
-      also useful as a standalone utility.
--->
     </para>
 
     <para>
       URI всегда начинаются со схемы, после которой следует двоеточие. Структура
-      для разных схем может сильно отличаться. Класс <code>Zend_Uri</code>
+      для разных схем может сильно отличаться. Класс <classname>Zend_Uri</classname>
       предоставляет фабрику (паттерн factory), которая возвращает его подклассы,
       специализирующиеся в различных схемах. Подклассы называются
-      <code>Zend_Uri_&lt;scheme&gt;</code>, где <code>&lt;scheme&gt;</code> -
+      <classname>Zend_Uri_&lt;scheme&gt;</classname>, где <code>&lt;scheme&gt;</code> -
       схема в нижнем регистре, с прописной первой буквой. Исключением из этого
       правила является HTTPS, который обрабатывается подклассом
-      <code>Zend_Uri_Http</code>.
-<!--
-      URIs always begin with a scheme, followed by a colon. The construction
-      of the many different schemes varies significantly.  The
-      <code>Zend_Uri</code> class provides a factory that returns a subclass of
-      itself which specializes in each scheme.  The subclass
-      will be named <code>Zend_Uri_&lt;scheme&gt;</code>, where
-      <code>&lt;scheme&gt;</code> is the scheme lowercased with the first
-      letter capitalized. An exception to this rule is HTTPS, which is also
-      handled by <code>Zend_Uri_Http</code>.
--->
+      <classname>Zend_Uri_Http</classname>.
     </para>
   </sect2>
 
   <sect2 id="zend.uri.creation">
-    <title>Создание нового URI<!--Creating a New URI--></title>
+    <title>Создание нового URI</title>
 
     <para>
-      <code>Zend_Uri</code> будет строить с нуля новый URI, если
+      <classname>Zend_Uri</classname> будет строить с нуля новый URI, если
       <code>Zend_Uri::factory()</code> была передана только схема.
-<!--
-      <code>Zend_Uri</code> will build a new URI from scratch if only a scheme
-      is passed to <code>Zend_Uri::factory()</code>.
--->
     </para>
 
-    <example>
-      <title>Создание нового URI с <code>Zend_Uri::factory()</code><!--Creating a New URI with <code>Zend_Uri::factory()</code>--></title>
+    <example id="zend.uri.creation.example-1">
+      <title>Создание нового URI с Zend_Uri::factory()</title>
 
       <programlisting role="php"><![CDATA[
-<?php
-
-require_once 'Zend/Uri.php';
-
 // Для того, чтобы создать с нуля новый URI, передайте только схему.
 $uri = Zend_Uri::factory('http');
 
 // $uri является экземпляром Zend_Uri_Http
-
-?>]]></programlisting>
+]]></programlisting>
     </example>
 
     <para>
@@ -74,231 +50,190 @@ $uri = Zend_Uri::factory('http');
       <code>Zend_Uri::factory()</code> только схему. <footnote><para>На момент
       написания этой документации Zend_Uri поддерживает только схемы HTTP и
       HTTPS.</para></footnote>. При передаче не поддерживаемой схемы
-      генерируется исключение <code>Zend_Uri_Exception</code>.
-<!--
-      To create a new URI from scratch, pass only the scheme to
-      <code>Zend_Uri::factory()</code><footnote><para>At the time of writing,
-      Zend_Uri only supports the HTTP and HTTPS schemes.</para></footnote> .
-      If an unsupported scheme is passed, a <code>Zend_Uri_Exception</code>
-      will be thrown.
--->
+      генерируется исключение <classname>Zend_Uri_Exception</classname>.
     </para>
 
     <para>
       Если переданные схема или URI поддерживаются, то
       <code>Zend_Uri::factory()</code> вернет свой подкласс, который
       специализируется на данной схеме.
-<!--
-      If the scheme or URI passed is supported,
-      <code>Zend_Uri::factory()</code> will return a subclass of itself that
-      specializes in the scheme to be created.
--->
     </para>
   </sect2>
 
   <sect2 id="zend.uri.manipulation">
-    <title>Работа с существующим URI<!--Manipulating an Existing URI--></title>
+    <title>Работа с существующим URI</title>
 
     <para>
       Для того, чтобы работать с существующим URI, передайте его весь целиком
       <code>Zend_Uri::factory()</code>.
-<!--
-      To manipulate an existing URI, pass the entire URI to
-      <code>Zend_Uri::factory()</code>.
--->
     </para>
 
-    <example>
-      <title>Работа с существующим URI с <code>Zend_Uri::factory()</code><!--Manipulating an Existing URI with <code>Zend_Uri::factory()</code>--></title>
+    <example id="zend.uri.manipulation.example-1">
+      <title>Работа с существующим URI через Zend_Uri::factory()</title>
 
     <programlisting role="php"><![CDATA[
-<?php
-
-require_once 'Zend/Uri.php';
-
 // Чтобы работать с существующим URI, передайте его как параметр
 $uri = Zend_Uri::factory('http://www.zend.com');
 
 // $uri является экземпляром Zend_Uri_Http
-
-?>]]></programlisting>
+]]></programlisting>
     </example>
 
     <para>
       URI будет распарсен и проверен на валидность. Если он оказался невалидным,
       то сразу же будет сгенерировано исключение
-      <code>Zend_Uri_Exception</code>. Иначе <code>Zend_Uri::factory()</code>
+      <classname>Zend_Uri_Exception</classname>. Иначе <code>Zend_Uri::factory()</code>
       вернет свой подкласс, который специализируется на данной схеме.
-<!--
-      The URI will be parsed and validated. If it is found to be invalid, a
-      <code>Zend_Uri_Exception</code> will be thrown immediately. Otherwise,
-      <code>Zend_Uri::factory()</code> will return a subclass of itself that
-      specializes in the scheme to be manipulated.
--->
     </para>
   </sect2>
 
   <sect2 id="zend.uri.validation">
-    <title>Проверка URI<!--URI Validation--></title>
+    <title>Проверка URI</title>
 
     <para>
       Функция <code>Zend_Uri::check()</code> может использоваться в том случае,
       когда нужна только проверка существующего URI.
-<!--
-      The <code>Zend_Uri::check()</code> function can be used if only
-      validation of an existing URI is needed.
--->
     </para>
 
-    <example>
-      <title>Проверка URI с помощью <code>Zend_Uri::check()</code><!--URI Validation with <code>Zend_Uri::check()</code>--></title>
+    <example id="zend.uri.validation.example-1">
+      <title>Проверка URI с помощью Zend_Uri::check()</title>
 
     <programlisting role="php"><![CDATA[
-<?php
-
-require_once 'Zend/Uri.php';
-
 // Проверка, является ли данный URI синтаксически корректным
 $valid = Zend_Uri::check('http://uri.in.question');
 
 // $valid равен TRUE при валидном URI, иначе FALSE
-
-?>]]></programlisting>
+]]></programlisting>
     </example>
 
     <para>
       <code>Zend_Uri::check()</code> возвращает булево значение, использование
       этой функции более удобно, чем вызов <code>Zend_Uri::factory()</code> и
       отлов исключения.
-<!--
-      <code>Zend_Uri::check()</code> returns a boolean,
-      which is more convenient than using <code>Zend_Uri::factory()</code>
-      and catching the exception.
--->
     </para>
+
+    <sect3 id="zend.uri.validation.allowunwise">
+        <title>Разрешение использования "неумных" символов в URI</title>
+
+        <para>
+            По умолчанию <classname>Zend_Uri</classname> не будет принимать
+            следующие символы, которые в спецификации определены как "неумные"
+            (unwise) и невалидные: <code>"{", "}", "|", "\", "^", "`"</code>.
+            Тем не менее, многие реализации принимают эти символы как валидные.
+        </para>
+
+        <para>
+            Можно заставить <classname>Zend_Uri</classname> принимать эти
+            символы путем установки 'allow_unwise' в TRUE, используя метод
+            <code>Zend_Uri::setConfig()</code>:
+        </para>
+
+        <example id="zend.uri.validation.allowunwise.example-1">
+            <title>Разрешение использования спецсимволов в URI</title>
+            <programlisting role="php"><![CDATA[
+// Содержит символ '|'
+// Обычно такой вызов будет возвращать 'false':
+$valid = Zend_Uri::check('http://example.com/?q=this|that');
+
+// Тем не менее, вы можете разрешить "неумные" символы
+Zend_Uri::setConfig(array('allow_unwise' => true));
+// будет возвращать 'true'
+$valid = Zend_Uri::check('http://example.com/?q=this|that');
+
+// Установка 'allow_unwise' обратно в FALSE
+Zend_Uri::setConfig(array('allow_unwise' => false));
+]]></programlisting>
+        </example>
+
+        <note>
+            <para>
+                <code>Zend_Uri::setConfig()</code> глобально устанавливает опции
+                конфигурации. Рекомендуется сбрасывать опцию
+                'allow_unwise' в 'false', как показано в примере выше,
+                если только вы не хотите разрешить использование "неумных"
+                символов на все время во всем приложении.
+            </para>
+        </note>
+    </sect3>
   </sect2>
 
   <sect2 id="zend.uri.instance-methods">
-    <title>Общие методы<!--Common Instance Methods--></title>
+    <title>Общие методы экземпляров</title>
 
     <para>
-      Каждый экземпляр подкласса <code>Zend_Uri</code> (т.е.
-      <code>Zend_Uri_Http</code>) имеет несколько методов экземпляров, которые
-      полезны для работы с любыми видами URI.
-<!--
-      Every instance of a <code>Zend_Uri</code> subclass (e.g.
-      <code>Zend_Uri_Http</code>) has several instance methods that are useful
-      for working with any kind of URI.
--->
+      Каждый экземпляр подкласса <classname>Zend_Uri</classname> (например,
+      <classname>Zend_Uri_Http</classname>) имеет несколько методов,
+      полезных для работы с любыми видами URI.
     </para>
 
     <sect3 id="zend.uri.instance-methods.getscheme">
-      <title>Получение схемы URI<!--Getting the Scheme of the URI--></title>
+      <title>Получение схемы URI</title>
 
       <para>
         Схема URI – часть URI, завершающаяся двоеточием. Например, схемой в
         <code>http://www.zend.com</code> является <code>http</code>.
-<!--
-        The scheme of the URI is the part of the URI that precedes the colon.  For example,
-        the scheme of <code>http://www.zend.com</code> is <code>http</code>.
--->
       </para>
 
-      <example>
-        <title>Получение схемы из объекта <code>Zend_Uri_*</code><!--Getting the Scheme from a <code>Zend_Uri_*</code> Object--></title>
+      <example id="zend.uri.instance-methods.getscheme.example-1">
+        <title>Получение схемы из объекта Zend_Uri_*</title>
 
         <programlisting role="php"><![CDATA[
-<?php
-
-require_once 'Zend/Uri.php';
-
 $uri = Zend_Uri::factory('http://www.zend.com');
 
 $scheme = $uri->getScheme();  // "http"
-
-?>]]></programlisting>
+]]></programlisting>
     </example>
 
       <para>
         Метод экземпляра <code>getScheme()</code> возвращает схему из URI.
-<!--
-        The <code>getScheme()</code> instance method returns only the scheme part of
-        the URI object.
--->
       </para>
 
     </sect3>
 
     <sect3 id="zend.uri.instance-methods.geturi">
-      <title>Получение всего URI<!--Getting the Entire URI--></title>
+      <title>Получение всего URI</title>
 
-      <example>
-        <title>Получение всего URI из объекта <code>Zend_Uri_*</code><!--Getting the Entire URI from a <code>Zend_Uri_*</code> Object--></title>
+      <example id="zend.uri.instance-methods.geturi.example-1">
+        <title>Получение всего URI из объекта Zend_Uri_*</title>
 
         <programlisting role="php"><![CDATA[
-<?php
-
-require_once 'Zend/Uri.php';
-
 $uri = Zend_Uri::factory('http://www.zend.com');
 
 echo $uri->getUri();  // "http://www.zend.com"
-
-?>]]></programlisting>
+]]></programlisting>
       </example>
 
       <para>
         Метод <code>getUri()</code> возвращает строковое представление всего
         URI.
-<!--
-        The <code>getUri()</code> method returns the string representation
-        of the entire URI.
--->
       </para>
     </sect3>
 
     <sect3 id="zend.uri.instance-methods.valid">
-      <title>Проверка URI на валидность<!--Validating the URI--></title>
+      <title>Проверка URI на валидность</title>
 
       <para>
         <code>Zend_Uri::factory()</code> всегда производит синтаксическую
         проверку переданных ему URI и не будет создавать новый экземпляр
-        подкласса <code>Zend_Uri</code>, если данный URI не прошел проверку.
+        подкласса <classname>Zend_Uri</classname>, если данный URI не прошел проверку.
         Тем не менее, после того, как был инстанцирован подкласс
-        <code>Zend_Uri</code> для нового URI или на основе уже существующего,
+        <classname>Zend_Uri</classname> для нового URI или на основе уже существующего,
         в результате манипуляций с ним этот URI может стать невалидным.
-<!--
-        <code>Zend_Uri::factory()</code> will always validate any URI passed
-        to it and will not instantiate a new <code>Zend_Uri</code> subclass
-        if the given URI is found to be invalid. However, after the
-        <code>Zend_Uri</code> subclass is instantiated for a new URI or a
-        valid existing one, it is possible that the URI can then later become
-        invalid after it is manipulated.
--->
       </para>
 
-      <example>
-        <title>Проверка объекта <code>Zend_Uri_*</code><!--Validating a <code>Zend_Uri_*</code> Object--></title>
+      <example id="zend.uri.instance-methods.valid.example-1">
+        <title>Проверка объекта Zend_Uri_*</title>
 
         <programlisting role="php"><![CDATA[
-<?php
-
-require_once 'Zend/Uri.php';
-
 $uri = Zend_Uri::factory('http://www.zend.com');
 
 $isValid = $uri->valid();  // TRUE
-
-?>]]></programlisting>
+]]></programlisting>
       </example>
 
       <para>
         Метод <code>valid()</code> дает возможность проверить, является ли URI
         по-прежнему валидным.
-<!--
-        The <code>valid()</code> instance method provides a means to check that the
-        URI object is still valid.
--->
       </para>
     </sect3>
 

+ 20 - 50
documentation/manual/ru/module_specs/Zend_Validate-ValidatorChains.xml

@@ -1,6 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.validate.validator_chains">
 
-    <title>Цепочки валидаторов<!--Validator Chains--></title>
+    <title>Цепочки валидаторов</title>
 
     <para>
         Часто к одному и тому же значению должно быть применено несколько
@@ -9,22 +11,8 @@
         <link linkend="zend.validate.introduction">введения</link>, где имя
         пользователя должно быть длиной от 6 до 12 символов и состоять только из
         алфавитно-цифровых символов:
-<!--
-        Often multiple validations should be applied to some value in a particular order. The following code
-        demonstrates a way to solve the example from the
-        <link linkend="zend.validate.introduction">introduction</link>, where a username must be between 6 and
-        12 alphanumeric characters:
--->
-
-        <programlisting role="php"><![CDATA[<?php
-
-// Предоставляет возможность создания цепочек валидаторов
-require_once 'Zend/Validate.php';
-
-// Валидаторы, нужные для примера
-require_once 'Zend/Validate/StringLength.php';
-require_once 'Zend/Validate/Alnum.php';
 
+        <programlisting role="php"><![CDATA[
 // Создает цепочку валидаторов и добавляет валидаторы в нее
 $validatorChain = new Zend_Validate();
 $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12))
@@ -39,60 +27,42 @@ if ($validatorChain->isValid($username)) {
         echo "$message\n";
     }
 }
-
-?>]]></programlisting>
+]]></programlisting>
 
         Валидаторы применяются в том же порядке, в котором они были добавлены в
-        <code>Zend_Validate</code>. В примере выше сначала проверяется,
+        <classname>Zend_Validate</classname>. В примере выше сначала проверяется,
         находится ли длина имени пользователя в пределах 6-12 символов, затем
         проверяется, содержит ли имя пользователя только алфавитно-цифровые
         символы. Вторая проверка проводится независимо от того, была ли успешно
-        пройдена первая проверка или нет. Это означает, что если обе валидации
-        не выли пройдены, то <code>getMessages()</code> вернет сообщения об
+        пройдена первая проверка. Это означает, что если обе валидации
+        не были пройдены, то <code>getMessages()</code> вернет сообщения об
         ошибках валидации от обоих валидаторов.
-<!--
-        Validators are run in the order they were added to <code>Zend_Validate</code>. In the above example,
-        the username is first checked to ensure that its length is between 6 and 12 characters, and then it is
-        checked to ensure that it contains only alphanumeric characters. The second validation, for
-        alphanumeric characters, is performed regardless of whether the first validation, for length between 6
-        and 12 characters, succeeds. This means that if both validations fail, <code>getMessages()</code> will
-        return failure messages from both validators.
--->
     </para>
 
     <para>
         В некоторых случаях имеет смысл прерывать валидацию, если данные не
         прошли проверку каким-либо валидатором в цепочке.
-        <code>Zend_Validate</code> поддерживает такие случаи использования с
+        <classname>Zend_Validate</classname> обеспечивает эту возможность с
         помощью второго параметра метода <code>addValidator()</code>. При
         установке <code>$breakChainOnFailure</code> в <code>true</code>,
         добавленный валидатор будет прерывать выполнение цепочки валидаций в
-        случае неудачи, что позволяет избежать выполнение других валидаций,
-        которые были бы неуместными в такой ситуации. В примере, переписанном
-        как показано ниже, проверка на алфавитно-цифровые символы не должна
-        производиться, если не была пройдена проверка на длину строки.
-<!--
-        In some cases it makes sense to have a validator break the chain if its validation process
-        fails. <code>Zend_Validate</code> supports such use cases with the second parameter to the
-        <code>addValidator()</code> method. By setting <code>$breakChainOnFailure</code> to <code>true</code>,
-        the added validator will break the chain execution upon failure, which avoids running any other
-        validations that are determined to be unnecessary or inappropriate for the situation. If the above
-        example were written as follows, then the alphanumeric validation would not occur if the string length
-        validation fails:
--->
+        случае неудачи. Это позволяет избежать выполнения других валидаций,
+        которые были бы излишними или неподходящими в данной ситуации.
+        Ниже приводится переписанный пример, в котором проверка на
+        алфавитно-цифровые символы не должна
+        производиться, если не была пройдена проверка на длину строки:
 
-        <programlisting role="php"><![CDATA[<?php
+        <programlisting role="php"><![CDATA[
 $validatorChain->addValidator(new Zend_Validate_StringLength(6, 12), true)
-               ->addValidator(new Zend_Validate_Alnum());]]></programlisting>
+        ->addValidator(new Zend_Validate_Alnum());
+]]></programlisting>
 
     </para>
 
     <para>
-        Любые объекты, реализующие <code>Zend_Validate_Interface</code>, могут
-        быть использованы в цепочке валидаторов.
-<!--
-        Any object that implements <code>Zend_Validate_Interface</code> may be used in a validator chain.
--->
+        Любые объекты, реализующие
+        <classname>Zend_Validate_Interface</classname>, могут быть
+        использованы в цепочке валидаторов.
     </para>
 
 </sect1>

+ 256 - 40
documentation/manual/ru/module_specs/Zend_Validate-WritingValidators.xml

@@ -1,77 +1,293 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.validate.writing_validators">
 
-    <title>Написание валидаторов<!--Writing Validators--></title>
+    <title>Написание валидаторов</title>
 
     <para>
-        Zend_Validate предоставляет набор наиболее часто используемых валидаторов, но разработчики часто сталкиваются с такими ситуациями, когда требуется написание своих валидаторов. Написание своих валидаторов облегчается реализацией интерфейса <code>Zend_Validate_Interface</code>.
-<!--
-        Zend_Validate supplies a set of commonly needed validators, but inevitably, developers will wish to
-        write custom validators for their particular needs. The task of writing a custom validator is
-        facilitated by implementing <code>Zend_Validate_Interface</code>.
--->
+        <classname>Zend_Validate</classname> предоставляет набор наиболее
+        часто используемых валидаторов, но разработчики часто сталкиваются
+        с такими ситуациями, когда требуется написание своих валидаторов.
+        В этом разделе описан процесс написания своих валидаторов.
     </para>
 
     <para>
-        <code>Zend_Validate_Interface</code> определяет два метода: <code>isValid()</code> и <code>getMessages()</code>, которые могут быть реализованы своими классами. Объект, реализующий данный интерфейс, может быть добавлен в цепочку валидаторов через метод <code>Zend_Validate::addValidator()</code>.
-<!--
-        <code>Zend_Validate_Interface</code> defines two methods, <code>isValid()</code> and
-        <code>getMessages()</code>, that may be implemented by user classes. An object that implements this
-        interface may be added to a validator chain with <code>Zend_Validate::addValidator()</code>.
--->
+        <classname>Zend_Validate_Interface</classname> определяет три метода:
+        <code>isValid()</code>, <code>getMessages()</code> и
+        <code>getErrors()</code>, они должны
+        реализовываться в ваших классах валидации.
+        Объект, реализующий данный интерфейс, может быть добавлен в цепочку
+        валидаторов через метод <code>Zend_Validate::addValidator()</code>,
+        также такие объекты могут использоваться с классом
+        <link linkend="zend.filter.input"><classname>Zend_Filter_Input</classname></link>.
     </para>
 
     <para>
-        Следующий пример демонстрирует, как можно писать свои валидаторы:
-<!--
-        The following example demonstrates how a custom validator might be written:
--->
+        Как вы наверное уже поняли из приведенного выше описания
+        интерфейса <classname>Zend_Validate_Interface</classname>,
+        классы валидации, предоставляемые Zend Framework, возвращают
+        булево значение, означающее успех/неуспех валидации.
+        Они также предоставляют информацию о том
+        <emphasis role="bold">почему</emphasis> переданное значение не прошло
+        валидацию. Возможность узнать причину того, почему значение не проходит
+        валидацию, может быть полезна для различных целей, как, например,
+        создание статистики для анализа удобства использования приложения.
+    </para>
 
-        <programlisting role="php"><![CDATA[<?php
+    <para>
+        Базовый функционал для сообщений об ошибке валидации реализован в
+        классе <classname>Zend_Validate_Abstract</classname>.
+        Для того, чтобы использовать этот функционал при создании класса
+        валидации, просто наследуйте свой класс от
+        <classname>Zend_Validate_Abstract</classname>.
+        В классе-наследнике вы можете реализовать логику метода
+        <code>isValid()</code>, а также определить шаблоны и переменные
+        сообщений, которые соответствуют различным типам ошибок валидации.
+        Если значение не проходит проверку, то <code>isValid()</code> должен
+        возвращать <code>false</code>. Если значение проходит проверку, то
+        <code>isValid()</code> должен возвращать <code>true</code>.
+    </para>
 
-require_once 'Zend/Validate/Interface.php';
+    <para>
+        Обычно метод <code>isValid()</code> не должен бросать никаких
+        исключений, за исключением тех ситуаций, когда невозможно определить,
+        является ли валидным входное значение или нет.
+        Например, бросок исключения уместен в случае,
+        когда невозможно открыть файл (недоступен сервер LDAP,
+        нет соединения с базой данных), и процесс валидации не может быть
+        продолжен.
+    </para>
+
+    <example id="zend.validate.writing_validators.example.simple">
+
+        <title>Создание простого класса валидации</title>
 
-class MyValidator implements Zend_Validate_Interface
+        <para>
+            Следующий пример демонстрирует создание простейшего валидатора.
+            В данном случае правила валидации просты - входное значение
+            должно иметь тип <code>float</code>.
+
+            <programlisting role="php"><![CDATA[
+class MyValid_Float extends Zend_Validate_Abstract
 {
-    protected $_messages = array();
+    const FLOAT = 'float';
+
+    protected $_messageTemplates = array(
+        self::FLOAT => "'%value%' не является числом с плавающей точкой"
+    );
 
     public function isValid($value)
     {
-        $this->_messages = array();
+        $this->_setValue($value);
 
-        // нахождение результата проверки $requirement
-
-        if (!$requirement) {
-            $this->_messages[] = "Reason validation failed";
+        if (!is_float($value)) {
+            $this->_error();
             return false;
         }
 
         return true;
     }
+}
+]]></programlisting>
 
-    public function getMessages()
+            В данном классе определен шаблон для единственного сообщения
+            об ошибке валидации, который включает в себя встроенный "магический"
+            параметр <code>%value%</code>.
+            Вызов <code>_setValue()</code> подготавливает объект к подстановке
+            проверяемого значения в сообщение об ошибке.
+            Вызов <code>_error()</code> устанавливает причину ошибки валидации.
+            Поскольку в этом классе только одно сообщение об ошибке,
+            то нет необходимости передавать методу <code>_error()</code>
+            имя шаблона сообщения об ошибке.
+        </para>
+
+    </example>
+
+    <example id="zend.validate.writing_validators.example.conditions.dependent">
+
+        <title>Написание классов валидации с подчиненными условиями</title>
+
+        <para>
+            Следующий пример демонстрирует более сложный набор правил валидации,
+            где требуется, чтобы входное значение было числом, находящимся
+            в диапазоне между минимальным и максимальным значениями.
+            Значение может не пройти валидацию по одной из следующих причин:
+
+            <itemizedlist>
+                <listitem>
+                    <para>Значение не является числом.</para>
+                </listitem>
+                <listitem>
+                    <para>Значение меньше минимально допустимого.</para>
+                </listitem>
+                <listitem>
+                    <para>Значение больше максимально допустимого.</para>
+                </listitem>
+            </itemizedlist>
+        </para>
+
+        <para>
+            Эти возможные причины переводятся в определения в классе:
+
+            <programlisting role="php"><![CDATA[
+class MyValid_NumericBetween extends Zend_Validate_Abstract
+{
+    const MSG_NUMERIC = 'msgNumeric';
+    const MSG_MINIMUM = 'msgMinimum';
+    const MSG_MAXIMUM = 'msgMaximum';
+
+    public $minimum = 0;
+    public $maximum = 100;
+
+    protected $_messageVariables = array(
+        'min' => 'minimum',
+        'max' => 'maximum'
+    );
+
+    protected $_messageTemplates = array(
+        self::MSG_NUMERIC => "'%value%' не является числом",
+        self::MSG_MINIMUM => "'%value%' должен быть не меньше '%min%'",
+        self::MSG_MAXIMUM => "'%value%' должен быть не больше '%max%'"
+    );
+
+    public function isValid($value)
     {
-        return $this->_messages;
+        $this->_setValue($value);
+
+        if (!is_numeric($value)) {
+            $this->_error(self::MSG_NUMERIC);
+            return false;
+        }
+
+        if ($value < $this->minimum) {
+            $this->_error(self::MSG_MINIMUM);
+            return false;
+        }
+
+        if ($value > $this->maximum) {
+            $this->_error(self::MSG_MAXIMUM);
+            return false;
+        }
+
+        return true;
     }
 }
+]]></programlisting>
 
-?>]]></programlisting>
+            Открытые свойства <code>$minimum</code> и <code>$maximum</code>
+            были созданы для установки нижней и верхней границ диапазона
+            соответственно.
+            В классе также определены две переменные сообщений, которые
+            соответствуют этим открытым свойствам и позволяют использовать
+            <code>min</code> и <code>max</code>
+            в качестве магических параметров в шаблонах сообщений, так же,
+            как и <code>value</code>.
+        </para>
 
-    </para>
+        <para>
+            Обратите вмимание, что если какая-либо из проверок в методе
+            <code>isValid()</code> не была пройдена, то подготавливается
+            соответствующее сообщение и метод сразу же возвращает
+            <code>false</code>.
+            Таким образом, эти правила валидации являются
+            последовательно-зависимыми. Это значит, что если одна из проверок не
+            была пройден, то нет необходимости производить последующие проверки.
+            Но это не обязательный случай, в следующем примере показан
+            класс с независимыми правилами валидации, где объект
+            валидации может возвращать несколько причин, по которым валидация
+            не была пройдена.
+        </para>
 
-    <para>
-        Добавление экземпляра только что написанного класса валидатора в цепочку валидаторов:
-<!--
-        To add an instance of the above validator to a validator chain:
--->
+    </example>
 
-        <programlisting role="php"><![CDATA[<?php
+    <example id="zend.validate.writing_validators.example.conditions.independent">
 
-$validatorChain = new Zend_Validate();
-$validatorChain->addValidator(new MyValidator());
+        <title>Валидация с независимыми условиями и возвратом нескольких причин непрохождения валидации</title>
 
-?>]]></programlisting>
+        <para>
+            Рассмотрим написание класса валидации для обеспечения стойкости
+            пароля, где от пользователя требуется
+            выбрать пароль, который соответствует определенным критериям в целях
+            защиты пользовательского аккаунта.
+            Предположим, что критерии безопасности требуют, чтобы пароль:
 
-    </para>
+            <itemizedlist>
+                <listitem>
+                    <para>был длиной как минимум 8 символов,</para>
+                </listitem>
+                <listitem>
+                    <para>содержал как минимум одну букву в верхнем регистре,</para>
+                </listitem>
+                <listitem>
+                    <para>содержал как минимум одну букву в нижнем регистре,</para>
+                </listitem>
+                <listitem>
+                    <para>содержал как минимум один цифровой символ.</para>
+                </listitem>
+            </itemizedlist>
+        </para>
+
+        <para>
+            Следующий класс реализует эти критерии валидации:
+
+            <programlisting role="php"><![CDATA[
+class MyValid_PasswordStrength extends Zend_Validate_Abstract
+{
+    const LENGTH = 'length';
+    const UPPER  = 'upper';
+    const LOWER  = 'lower';
+    const DIGIT  = 'digit';
+
+    protected $_messageTemplates = array(
+        self::LENGTH => "'%value%' должен быть длиной как минимум 8 символов",
+        self::UPPER  => "'%value%' должен содержать как минимум одну букву в верхнем регистре",
+        self::LOWER  => "'%value%' должен содержать как минимум одну букву в нижнем регистре",
+        self::DIGIT  => "'%value%' должен содержать как минимум один цифровой символ"
+    );
+
+    public function isValid($value)
+    {
+        $this->_setValue($value);
+
+        $isValid = true;
+
+        if (strlen($value) < 8) {
+            $this->_error(self::LENGTH);
+            $isValid = false;
+        }
+
+        if (!preg_match('/[A-Z]/', $value)) {
+            $this->_error(self::UPPER);
+            $isValid = false;
+        }
+
+        if (!preg_match('/[a-z]/', $value)) {
+            $this->_error(self::LOWER);
+            $isValid = false;
+        }
+
+        if (!preg_match('/\d/', $value)) {
+            $this->_error(self::DIGIT);
+            $isValid = false;
+        }
+
+        return $isValid;
+    }
+}
+]]></programlisting>
+
+            Обратите внимание, что эти четыре проверки в методе
+            <code>isValid()</code> не сразу же возвращают <code>false</code>.
+            Это позволяет классу валидации предоставлять
+            <emphasis role="bold">все</emphasis> причины того, почему
+            введенный пароль не отвечает требованиям валидации.
+            Если, например, пользователь введет строку "<code>#$%</code>"
+            в качестве пароля, то после <code>isValid()</code>
+            вызов <code>getMessages()</code> вернет все четыре
+            сообщения ошибки валидации.
+        </para>
+
+    </example>
 
 </sect1>
 <!--

+ 310 - 62
documentation/manual/ru/module_specs/Zend_Validate.xml

@@ -1,88 +1,336 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.validate.introduction">
 
-    <title>Введение<!--Introduction--></title>
+    <title>Введение</title>
 
     <para>
-        Компонента Zend_Validate предоставляет набор наиболее часто используемых валидаторов. Она также предоставляет простой механизм формирования цепочки валидаторов, посредством которого к одним и тем же данным может быть применено несколько валидаторов в порядке, заданном пользователем.
-<!--
-        The Zend_Validate component provides a set of commonly needed validators. It also provides a simple
-        validator chaining mechanism by which multiple validators may be applied to a single datum in a
-        user-defined order.
--->
-    </para>
-
-    <para>
-        Что такое валидатор?
-<!--
-        <emphasis role="strong">What is a validator?</emphasis>
--->
+        Компонента <classname>Zend_Validate</classname> предоставляет набор наиболее часто
+        используемых валидаторов. Она также предоставляет простой механизм
+        формирования цепочки валидаторов, посредством которого к одним и
+        тем же данным может быть применено несколько валидаторов в порядке,
+        заданном пользователем.
     </para>
 
-    <para>
-        Валидатор проверяет входные данные на предмет соответствия некоторым требованиям и возвращает результат булевого типа. Если входные данные не соответствуют требованиям, то валидатор может предоставить информацию о том, какому требованию (требованиям) не соответствуют входные данные.
-<!--
-        A validator examines its input with respect to some requirements and produces a boolean result -
-        whether the input successfully validates against the requirements. If the input does not meet the
-        requirements, a validator may additionally provide information about which requirement(s) the input
-        does not meet.
--->
-    </para>
+    <sect2 id="zend.validate.introduction.definition">
+    
+        <title>Что такое валидатор?</title>
+    
+        <para>
+            Валидатор проверяет входные данные на предмет соответствия
+            требованиям и возвращает результат булевого типа. Если входные
+            данные не соответствуют требованиям, то валидатор может
+            предоставить информацию о том, какому требованию (требованиям)
+            не соответствуют входные данные.
+        </para>
+    
+        <para>
+            Например, веб-приложение может требовать, чтобы имя пользователя
+            было длиной от 6 до 12 символов и содержало только
+            алфавитно-цифровые символы. Для того, чтобы проверить,
+            соответствует ли имя пользователя этим требованиям, можно
+            использовать валидатор. Если выбранное имя пользователя не
+            соответствует одному из требований (или обоим требованиям),
+            то будет также полезно знать, каким именно требованиям не
+            соответствует имя пользователя.
+        </para>
+    
+    </sect2>
 
-    <para>
-        Например, веб-приложение может требовать, чтобы имя пользователя было длиной от 6 до 12 символов и содержало только алфавитно-цифровые символы. Для того, чтобы проверить, соответствует ли имя пользователя этим требованиям, можно использовать валидатор. Если выбранное имя пользователя не соответствует одному из требований (или обоим требованиям), то будет также полезно знать, каким именно требованиям не соответствует имя пользователя.
-<!--
-        For example, a web application might require that a username be between six and twelve characters in
-        length and may only contain alphanumeric characters. A validator can be used for ensuring that
-        usernames meet these requirements. If a chosen username does not meet one or both of the requirements,
-        it would be useful to know which of the requirements the username fails to meet.
--->
-    </para>
+    <sect2 id="zend.validate.introduction.using">
 
-    <para>
-        Такое определение валидации дает основу для <code>Zend_Validate_Interface</code>, который определяет два метода - <code>isValid()</code> и <code>getMessages()</code>. Метод <code>isValid()</code> выполняет валидацию переданного значения, возвращая <code>true</code> тогда и только тогда, когда значение прошло проверку по критериям валидации. Если <code>isValid()</code> возвращает <code>false</code>, то <code>getMessages()</code> используется для получения массива сообщений, объясняющих, по каким причинам валидация не была пройдена.
-<!--
-        Having defined validation in this way provides the foundation for
-        <code>Zend_Validate_Interface</code>, which defines two methods, <code>isValid()</code> and
-        <code>getMessages()</code>. The <code>isValid()</code> method performs validation upon the provided
-        value, returning <code>true</code> if and only if the value passes against the validation criteria. If
-        <code>isValid()</code> returns <code>false</code>, the <code>getMessages()</code> is provided to
-        return an array of messages explaining the reason(s) for validation failure.
--->
-    </para>
+        <title>Базовое использование валидаторов</title>
 
-    <note>
         <para>
-            <code>getMessages()</code> возвращает сообщения ошибок валидации только для последнего вызова <code>isValid()</code>, поскольку <code>isValid()</code> удаляет все сообщения, существующие с предыдущего вызова <code>isValid()</code>.
-<!--
-            The <code>getMessages()</code> returns validation failure messages for the most recent
-            <code>isValid()</code> call only, since <code>isValid()</code> clears any messages existing from a previous <code>isValid()</code> call.
--->
+            Такое определение валидации дает основу для
+            <classname>Zend_Validate_Interface</classname>, который определяет два
+            метода - <code>isValid()</code> и <code>getMessages()</code>.
+            Метод <code>isValid()</code> выполняет валидацию переданного
+            значения, возвращая <code>true</code> тогда и только тогда, когда
+            значение прошло проверку по критериям валидации.
+        </para>
+        
+        <para>
+            Если <code>isValid()</code> возвращает <code>false</code>, то
+            <code>getMessages()</code> возвращает массив
+            сообщений, поясняющих, по каким причинам валидация не была
+            пройдена.
+            Ключи массива являются короткими строками, идентифицирующими
+            причины, по которым не была пройдена валидация. Значения массива
+            являются строками сообщений, понятных человеку.
+            Ключи и значения зависят от класса валидатора - каждый класс
+            валидатора определяет собственный набор сообщений об ошибке и
+            уникальных ключей-идентификаторов.
+            Каждый класс также определяет константы, соответствующие
+            идентификаторам причин, по которым валидация не была пройдена.
         </para>
-    </note>
-
-    <para>
-        Следующий пример демонстрирует проверку адреса e-mail:
-<!--
-        The following example illustrates validation of an e-mail address:
--->
 
-        <programlisting role="php"><![CDATA[<?php
+        <note>
+            <para>
+                Метод <code>getMessages()</code> возвращает сообщения ошибок
+                валидации только для последнего вызова <code>isValid()</code>.
+                Любой вызов метода <code>isValid()</code> стирает все сообщения
+                и ошибки с его прошлого вызова, т.к. вероятно,
+                что отдельные вызовы <code>isValid()</code> производятся для
+                различных входных значений.
+            </para>
+        </note>
 
-require_once 'Zend/Validate/EmailAddress.php';
+        <para>
+            Следующий пример демонстрирует проверку адреса e-mail:
+    
+            <programlisting role="php"><![CDATA[
 $validator = new Zend_Validate_EmailAddress();
+
 if ($validator->isValid($email)) {
     // email прошел валидацию
 } else {
     // email не прошел валидацию; вывод причин этого
-    foreach ($validator->getMessages() as $message) {
-        echo "$message\n";
+    foreach ($validator->getMessages() as $messageId => $message) {
+        echo "Validation failure '$messageId': $message\n";
     }
 }
+]]></programlisting>
+    
+        </para>
 
-?>]]></programlisting>
+    </sect2>
 
-    </para>
+    <sect2 id="zend.validate.introduction.messages">
+
+        <title>Установка собственных сообщений от ошибках</title>
+
+        <para>
+            Классы валидации предоставляют метод <code>setMessage()</code>,
+            с помощью которого вы можете устанавливать формат сообщения,
+            возвращаемого методом <code>getMessages()</code> в случае,
+            если валидация не была пройдена.
+            Первый аргумент этого метода является строкой, содержащей текст
+            сообщения об ошибке.
+            Вы можете включать в нее маркеры, которые будут замещаться данными,
+            относящимися к валидатору.
+            Маркер <code>%value%</code> поддерживается всеми валидаторами, он
+            заменяется значением, который вы передали методу
+            <code>isValid()</code>. Другие маркеры могут поддерживаться не во
+            всех валидаторах. Например, <code>%max%</code>
+            является маркером, поддерживаемым валидатором
+            <classname>Zend_Validate_LessThan</classname>.
+            Метод <code>getMessageVariables()</code> возвращает массив маркеров,
+            поддерживаемых валидатором.
+        </para>
+
+        <para>
+            Второй необязательный аргумент является строкой, которую нужно
+            установить в качестве идентификатора шаблона сообщения,
+            это может быть полезным в том случае, когда класс валидации
+            предусматривает несколько причин, по которым валидация может быть не
+            пройдена.
+            Если вы опустите второй аргумент, то <code>setMessage()</code>
+            предполагает, что переданное вами сообщение должно
+            использоваться в качестве первого шаблона сообщения, объявленного
+            в классе валидации.
+            Многие классы валидации имеют только один шаблон
+            сообщения об ошибке, поэтому в большинстве случаев нет необходимости
+            указывать, какой именно шаблон требуется изменить.
+        </para>
+
+        <para>
+            <programlisting role="php"><![CDATA[
+$validator = new Zend_Validate_StringLength(8);
+
+$validator->setMessage(
+    'Строка \'%value%\' слишком короткая. Она должна быть длиной как минимум ' .
+    '%min% символов',
+    Zend_Validate_StringLength::TOO_SHORT);
+
+if (!$validator->isValid('слово')) {
+    $messages = $validator->getMessages();
+    echo current($messages);
+
+    // "Строка 'слово' слишком короткая. Она должна быть длиной как минимум
+    // 8 символов"
+}
+]]></programlisting>
+        </para>
+
+        <para>
+            Вы можете устанавливать несколько сообщений сразу, используя
+            метод <code>setMessages()</code>. Его аргумент является массивом,
+            содержащим пары ключ/значение.
+
+            <programlisting role="php"><![CDATA[
+$validator = new Zend_Validate_StringLength(8, 12);
+
+$validator->setMessages( array(
+    Zend_Validate_StringLength::TOO_SHORT =>
+        'Строка \'%value%\' слишком короткая',
+    Zend_Validate_StringLength::TOO_LONG  =>
+        'Строка \'%value%\' слишком длинная'
+));
+]]></programlisting>
+
+        </para>
+
+        <para>
+            Если ваше приложение требует большей гибкости, ...
+            то вы можете использовать доступ к свойствам под теми же именами,
+            что и метки сообщения, поддерживаемые данным классом валидации.
+            Свойство <code>value</code> всегда доступно в валидаторах, это
+            значение, которое вы передали в качестве аргумента метода
+            <code>isValid()</code>. Другие свойства могут поддерживаться не
+            всеми классами валидации.
+
+            <programlisting role="php"><![CDATA[
+$validator = new Zend_Validate_StringLength(8, 12);
+
+if (!validator->isValid('слово')) {
+    echo 'Слово не прошедшее проверку: '
+        . $validator->value
+        . '; его длина не находится в диапазоне между '
+        . $validator->min
+        . ' и '
+        . $validator->max
+        . " символами\n";
+}
+]]></programlisting>
+        </para>
+
+    </sect2>
+
+    <sect2 id="zend.validate.introduction.static">
+
+        <title>Использование статического метода is()</title>
+
+        <para>
+            Если неудобно каждый раз загружать требуемый класс валидации и
+            создавать его экземпляр, то можно использовать статический метод
+            <code>Zend_Validate::is()</code> в качестве
+            альтернативного способа вызова.
+            Первый аргумент этого метода является входным значением,
+            которое вы передавали бы методу <code>isValid()</code>.
+            Второй аргумент является строкой, которая соответствует базовому
+            имени класса валидации относительно пространства имен
+            <code>Zend_Validate</code>. Метод <code>is()</code> автоматически
+            загружает класс, создает его экземпляр и применяет метод
+            <code>isValid()</code> к входным данным.
+
+            <programlisting role="php"><![CDATA[
+if (Zend_Validate::is($email, 'EmailAddress')) {
+    // Да, похоже, email валиден
+}
+]]></programlisting>
+
+        </para>
+
+        <para>
+            Вы можете также передавать массив аргументов конструктора,
+            если они нужны для данного класса валидации.
+
+            <programlisting role="php"><![CDATA[
+if (Zend_Validate::is($value, 'Between', array(1, 12))) {
+    // Да, $value имеет значение в диапазоне между 1 и 12
+}
+]]></programlisting>
+
+        </para>
+
+        <para>
+            Метод <code>is()</code> возвращает значение булевого типа,
+            как и метод <code>isValid()</code>.
+            При использовании статического метода <code>is()</code>
+            сообщения ошибки валидации не доступны.
+        </para>
+
+        <para>
+            Вариант со статическим методом может быть удобным при единичном
+            вызове валидатора, но если вам нужно применить валидацию
+            к нескольким входным значениям, то более эффективным будет
+            использование варианта с инстанцированием.
+        </para>
+
+        <para>
+            Кроме того, класс <classname>Zend_Filter_Input</classname>
+            позволяет инстанцировать и запускать более одного класса фильтра и
+            валидации для обработки набора входных данных. Читайте
+            <xref linkend="zend.filter.input" />.
+        </para>
+
+    </sect2>
+
+
+    <sect2 id="zend.validate.introduction.translation">
+
+        <title>Перевод сообщений</title>
+
+        <para>
+            Классы валидации предоставляют метод <code>setTranslator()</code>,
+            с помощью которого вы можете устанавливать экземпляр класса
+            <classname>Zend_Translate</classname>, который будет переводить
+            сообщения в случае ошибки валидации.
+            Метод <code>getTranslator()</code> возвращает установленный
+            экземпляр переводчика.
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$validator = new Zend_Validate_StringLength(8, 12);
+$translate = new Zend_Translate(
+    'array',
+    array(Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''),
+    'en'
+);
+
+$validator->setTranslator($translate);
+]]></programlisting>
+
+        <para>
+            С помощью статического метода <code>setDefaultTranslator()</code>
+            вы можете установить экземпляр
+            <classname>Zend_Translate</classname>, который будет использоваться
+            во всех классах валидации, и извлекать его с помощью
+            <code>getDefaultTranslator()</code>.
+            Это избавляет от установки вручную переводчика для всех классов
+            валидации и упрощает ваш код.
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$translate = new Zend_Translate(
+    'array',
+    array(Zend_Validate_StringLength::TOO_SHORT => 'Translated \'%value%\''),
+    'en'
+);
+Zend_Validate::setDefaultTranslator($translate);
+]]></programlisting>
+
+        <note>
+            <para>
+                Если вы установили глобальную для всего приложения локаль
+                через <classname>Zend_Registry</classname>, то эта локаль
+                будет использоваться по умолчанию в переводчике.
+            </para>
+        </note>
+
+        <para>
+            Иногда бывает необходимым отключить переводчика в валидаторе.
+            Для этого используйте метод <code>setDisableTranslator()</code>,
+            который принимает булево значение. Для получения установленного
+            значения используйте <code>translatorIsDisabled()</code>.
+        </para>
+
+        <programlisting role="php"><![CDATA[
+$validator = new Zend_Validate_StringLength(8, 12);
+if (!$validator->isTranslatorDisabled()) {
+    $validator->setDisableTranslator();
+}
+]]></programlisting>
+
+        <para>
+            Вы можете также использовать переводчика вместо установки
+            собственных сообщений через метод <code>setMessage()</code>. Но при
+            этом имейте в виду, что переводчик обрабатывает и сообщения, которые
+            вы установили самостоятельно.
+        </para>
 
+    </sect2>
 </sect1>
 <!--
 vim:se ts=4 sw=4 et:

+ 16 - 27
documentation/manual/ru/module_specs/Zend_Version.xml

@@ -1,43 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
 <sect1 id="zend.version.reading">
 
-    <title>Получение версии Zend Framework<!--Reading the Zend Framework Version--></title>
+    <title>Получение версии Zend Framework</title>
 
     <para>
-        Константа класса <code>Zend_Version::VERSION</code> содержит строку,
-        которая показывает номер текущей версии Zend Framework. Например,
-        "0.9.0beta".
-<!--
-        The class constant <code>Zend_Version::VERSION</code>
-        contains a string that identifies the current version
-        number of Zend Framework.  For example, "0.9.0beta".
--->
+        <classname>Zend_Version</classname> имеет константу
+        <code>Zend_Version::VERSION</code>, которая содержит строку
+        с номером версии текущей инсталляции Zend Framework.
+        Например, <classname>Zend_Version::VERSION</classname> может содержать
+        "1.7.4".
     </para>
 
     <para>
         Статический метод <code>Zend_Version::compareVersion($version)</code>
         основан на PHP-функции <ulink url="http://php.net/version_compare"><code>version_compare()</code></ulink>.
-        Метод возвращает -1, если версия <code>$version</code>
-        более поздняя, чем текущая версия Zend Framework; 0, если они
-        одинаковые и +1, если версия более ранняя, чем текущая.
-<!--
-        The static method <code>Zend_Version::compareVersion($version)</code>
-        is based on the PHP function
-        <ulink url="http://php.net/version_compare"><code>version_compare()</code></ulink>.
-        The method returns -1 if the specified <code>$version</code>
-        is older than the Zend Framework version, 0 if they are the same,
-        and +1 if the specified <code>$version</code> is newer than the
-        Zend Framework version.
--->
+        Метод возвращает -1, если указанная версия
+        более поздняя, чем версия установленного Zend Framework; 0, если они
+        одинаковые, и +1, если указанная версия более ранняя, чем версия
+        установленного Zend Framework.
     </para>
 
     <example id="zend.version.reading.example">
-        <title>Пример использования метода compareVersion()<!--Example of compareVersion() method--></title>
-        <programlisting role="php"><![CDATA[<?php
-
+        <title>Пример использования метода compareVersion()</title>
+        <programlisting role="php"><![CDATA[
 // возвращает -1, 0 или 1
-$cmp = Zend_Version::compareVersion('1.0.0');
-
-?>]]></programlisting>
+$cmp = Zend_Version::compareVersion('2.0.0');
+]]></programlisting>
     </example>
 
 </sect1>