Procházet zdrojové kódy

[DOCUMENTATION] Brazilian Portuguese:
added some translations

by erickwilder
module_specs/Zend_Acl-Advanced.xml
module_specs/Zend_Acl-Refining.xml
module_specs/Zend_Acl.xml

by flaviosilveira
tutorials/paginator-intro.xml
tutorials/paginator-simple.xml

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

mauriciofauth před 14 roky
rodič
revize
e9e7d42f84

+ 104 - 0
documentation/manual/pt-br/module_specs/Zend_Acl-Advanced.xml

@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.acl.advanced">
+    <title>Uso Avançado</title>
+
+    <sect2 id="zend.acl.advanced.storing">
+        <title>Armazenando ACL para Persistência de Dados</title>
+
+        <para>
+            <classname>Zend_Acl</classname> foi projetado de uma maneira que não requer nenhuma
+            teconologia de backend em particular, como um banco de dados ou servidor de cache, para
+            armazenamento de dados <acronym>ACL</acronym>. Sua implementação completamente em
+            <acronym>PHP</acronym> permite que ferramentas personalizadas de admnistração sejam
+            construídas sob <classname>Zend_Acl</classname> com relativa facilidade e flexibilidade.
+            Muitas situações necessitam de alguma forma de manutenção da <acronym>ACL</acronym> e
+            <classname>Zend_Acl</classname> fornece métodos para estabelecer e consultar os
+            controles de acesso de uma aplicação.
+        </para>
+
+        <para>
+            O armazenamento dos dados da <acronym>ACL</acronym> é uma tarefa deixada para o
+            desenvolvedor, visto que espera-se que os casos de uso possam variar muito de acordo com
+            situações diversas. Por conta de <classname>Zend_Acl</classname> ser serializável,
+            objetos <acronym>ACL</acronym> podem ser serializados com a função
+            <ulink url="http://php.net/serialize"><methodname>serialize()</methodname></ulink> do
+            <acronym>PHP</acronym> e o resultado pode ser armazenado em qualquer lugar que o
+            desenvolvedor desejar, como um arquivo, banco de dados ou mecanismo de cache.
+        </para>
+    </sect2>
+
+    <sect2 id="zend.acl.advanced.assertions">
+        <title>Escrevendo Regras ACL Condicionais com Asserções</title>
+
+        <para>
+            Algumas vezes uma regra para permitir ou negar acesso de um papel a um recurso não deve
+            ser absoluta, mas dependente de vários critérios. Por exemplo, suponha que certo acesso
+            deva ser liberado, mas somente entre o horário entre 8h00 e 17h00. Outro exemplo seria
+            negar um acesso por conta de uma requisição vinda de um <acronym>IP</acronym> que foi
+            identificado como fonte de abuso. <classname>Zend_Acl</classname> foi construído para 
+            suportar a implementação de regras baseadas em quaisquer condições que o desenvolvedor
+            necessitar.
+        </para>
+
+        <para>
+            <classname>Zend_Acl</classname> fornece suporte para regras condicionais com
+            <classname>Zend_Acl_Assert_Interface</classname>. Para utilizar a interface de asserção
+            de regra, o desenvolvedor escreve uma classe que implemente o método
+            <methodname>assert()</methodname> da interface:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+class CleanIPAssertion implements Zend_Acl_Assert_Interface
+{
+    public function assert(Zend_Acl $acl,
+                           Zend_Acl_Role_Interface $role = null,
+                           Zend_Acl_Resource_Interface $resource = null,
+                           $privilege = null)
+    {
+        return $this->_isCleanIP($_SERVER['REMOTE_ADDR']);
+    }
+
+    protected function _isCleanIP($ip)
+    {
+        // ...
+    }
+}
+]]></programlisting>
+
+        <para>
+            Uma vez que uma classe de asserção está disponível, o desenvolvedor deve fornecer uma
+            instância de classe de asserção ao atribuir regras condicionais. Uma regra criada com
+            uma asserção somente se aplica quando o método de asserção retorna
+            <constant>TRUE</constant>.
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$acl = new Zend_Acl();
+$acl->allow(null, null, null, new CleanIPAssertion());
+]]></programlisting>
+
+        <para>
+            O código acima cria uma regra condicional que permite acesso a todos os priviégios, para
+            tudo e para todos, exceto quando o <acronym>IP</acronym> solicitante está em uma
+            "lista negra". Se a requisição vem de um <acronym>IP</acronym> que não é considerado
+            "confiável" a regra não se aplicará. Um vez que a regra se aplica a todos os papéis,
+            todos os recursos e todos os privilégios, um <acronym>IP</acronym> "não confiável"
+            resultará em uma recusa de acesso. Contudo, este é um caso especial, e deve ser
+            entendido que para todos os outros casos (ex., quando um papel específico, recurso ou
+            privilégio é especificado para a regra), um asserção falsa resultará na regra não sendo
+            aplicada, e outras regras serão utilizadas para determinar se o acesso é permitido ou
+            negado.
+        </para>
+
+        <para>
+            Ao método <methodname>assert()</methodname> de um objeto de asserção é passada a
+            <acronym>ACL</acronym>, o papel, recurso e privilégio de que a consulta de autorização
+            (ex., <methodname>isAllowed()</methodname>) se aplica, a fim de fornecer um contexto
+            para que a classe de asserção possa determinar se suas condições são necessárias. 
+        </para>
+    </sect2>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 183 - 0
documentation/manual/pt-br/module_specs/Zend_Acl-Refining.xml

@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.acl.refining">
+    <title>Refinando Controles de Acesso</title>
+
+    <sect2 id="zend.acl.refining.precise">
+        <title>Controles de Acesso Precisos</title>
+
+        <para>
+            A <acronym>ACL</acronym> básica definida na
+            <link linkend="zend.acl.introduction">seção anterior</link> mostra como vários
+            privilégios podem ser permitidos em toda a <acronym>ACL</acronym> (todos os recursos).
+            Contudo, na prática, controles de acesso tendem a possuir exceções e diversos níveis
+            de complexidade. <classname>Zend_Acl</classname> permite a você realizar estas melhorias
+            de uma forma simples e flexível.
+        </para>
+
+        <para>
+            Para o <acronym>CMS</acronym> de exemplo, foi determinado que, embora o grupo 'equipe'
+            cubra as necessidades da grande maioria dos usuários, há necessidade de um novo
+            grupo 'marketing', que necessita de acesso a newsletter e últimas notícias no
+            <acronym>CMS</acronym>. O grupo é quase auto-suficiente e terá a habilidade de publicar
+            e arquivar tanto newsletters como últimas notícias.
+        </para>
+
+        <para>
+            Adicionalmente, também foi solicitado que o grupo 'equipe' tenha acesso liberado para
+            visualizar notícias mas não possam revisar as notícias mais recentes. Finalmente, deve
+            ser impossível para qualquer um (inclusive adminsitradores) arquivar qualquer notícia
+            de 'comunicado', pois eles ficam visíveis por somente 1 ou 2 dias.
+        </para>
+
+        <para>
+            Primeiro, revisamos o registro de papéis para refletir estas alterações. Determinamos
+            que o grupo 'marketing' tem o mesmo conjunto básico de permissões que 'equipe',
+            portanto definimos 'marketing' de modo a herdar as permissões de 'equipe':
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// O novo grupo 'marketing' herda permissões de 'equipe'
+$acl->addRole(new Zend_Acl_Role('marketing'), 'equipe');
+]]></programlisting>
+
+        <para>
+            Em seguida, note que os controles de acesso acima se referem a recursos específicos
+            (ex., "newsletter", "últimas notícias", "comunicados"). Agora vamos adicionar esses
+            recursos:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Create Resources for the rules
+
+// newsletter
+$acl->addResource(new Zend_Acl_Resource('newsletter'));
+
+// Notícias
+$acl->addResource(new Zend_Acl_Resource('notícias'));
+
+// Últimas notícias
+$acl->addResource(new Zend_Acl_Resource('últimas'), 'notícias');
+
+// Comunicados
+$acl->addResource(new Zend_Acl_Resource('comunicados'), 'notícias');
+]]></programlisting>
+
+        <para>
+            Então é simplesmente uma questão de definição dessas regras mais específicas para as
+            áreas da <acronym>ACL</acronym>:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Marketing deve publicar e arquivar newsletters e últimas notícias
+$acl->allow('marketing',
+            array('newsletter', 'últimas'),
+            array('publicar', 'arquivar'));
+
+// 'Equipe' (e 'Marketing', por herança) são negados a revisar últimas
+//notícias
+$acl->deny('equipe', 'últimas', 'revisar');
+
+// Todos (incluindo administradores) não podem arquivar notícias de comunicados
+$acl->deny(null, 'comunicados', 'arquivar');
+]]></programlisting>
+
+        <para>
+            Agora podemos consultar a <acronym>ACL</acronym>, respeitando as últimas alterações:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+echo $acl->isAllowed('equipe', 'newsletter', 'publicar') ?
+     "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('marketing', 'newsletter', 'publicar') ?
+     "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('equipe', 'últimas', 'publicar') ?
+     "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('marketing', 'últimas', 'publicar') ?
+     "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('marketing', 'últimas', 'arquivar') ?
+     "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('marketing', 'últimas', 'revisar') ?
+     "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('editor', 'comunicados', 'arquivar') ?
+     "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('administrador', 'comunicados', 'arquivar') ?
+     "permitido" : "negado";
+// negado
+]]></programlisting>
+    </sect2>
+
+    <sect2 id="zend.acl.refining.removing">
+        <title>Removendo Controles de Acesso</title>
+
+        <para>
+            Para remover um ou mais regras de acesso da <acronym>ACL</acronym>, simplesmente use os
+            métodos disponíveis <methodname>removeAllow()</methodname> ou
+            <methodname>removeDeny()</methodname>. Assim como <methodname>allow()</methodname> e
+            <methodname>deny()</methodname>, você pode fornecer um valor <constant>NULL</constant>
+            para indicar aplicação a todos os papéis, recursos e/ou privilégios:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Remove a recusa de revisão de últimas notícias para 'equipe' (e marketing,
+// por herança)
+$acl->removeDeny('equipe', 'últimas', 'revisar');
+
+echo $acl->isAllowed('marketing', 'últimas', 'revisar') ?
+     "permitido" : "negado";
+// permitido
+
+// Remove a permissão para publicar e arquivar newsletters para 'marketing'
+$acl->removeAllow('marketing',
+                  'newsletter',
+                  array('publicar', 'arquivar'));
+
+echo $acl->isAllowed('marketing', 'newsletter', 'publicar') ?
+     "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('marketing', 'newsletter', 'arquivar') ?
+     "permitido" : "negado";
+// negado
+]]></programlisting>
+
+        <para>
+            Privilégios podem ser modificados incrementalmente, como indicado acima, mas um valor
+            <constant>NULL</constant> para privilégios sobrescreve tais mudanças incrementais:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+// Concede a 'marketing' todas as permissões sobre 'últimas notícias'
+$acl->allow('marketing', 'últimas');
+
+echo $acl->isAllowed('marketing', 'últimas', 'publicar') ?
+     "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('marketing', 'últimas', 'arquivar') ?
+     "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('marketing', 'útlimas', 'qualquer coisa') ?
+     "permitido" : "negado";
+// permitido
+]]></programlisting>
+    </sect2>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 390 - 0
documentation/manual/pt-br/module_specs/Zend_Acl.xml

@@ -0,0 +1,390 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Reviewed: no -->
+<sect1 id="zend.acl.introduction">
+    <title>Introdução</title>
+
+    <para>
+        <classname>Zend_Acl</classname> fornece uma implementação de lista de controle de acesso 
+        (<acronym>ACL</acronym>, na sigla em inglês) leve e flexível para a gestão privilégios. 
+        Em geral, uma aplicação pode utilizar essa <acronym>ACL</acronym> para controlar o acesso a
+        determinados objetos protegidos por outros objetos requerentes.
+    </para>
+
+    <para>
+        Para o propósito desta documentação:
+    </para>
+
+    <itemizedlist>
+        <listitem>
+            <para>
+                Um <emphasis>recurso</emphasis> é um objeto cujo acesso é controlado
+            </para>
+        </listitem>
+
+        <listitem>
+            <para>
+                Um <emphasis>papel</emphasis> é um objeto que pode solicitar acesso a um Recurso.
+            </para>
+        </listitem>
+    </itemizedlist>
+
+    <para>
+        De modo simples, <emphasis>papéis requisitam acesso a recursos</emphasis>. Por exemplo, se
+        um atendente de estacionamento solicita acesso ao um carro, o atendente é o papel
+        requisitante e o carro é o recurso, pois o acesso ao carro pode não ser garantido a qualquer
+        um.
+    </para>
+
+    <para>
+        Através da especificação e uso de uma <acronym>ACL</acronym>, uma aplicação pode controlar
+        como os papéis têm acesso aos recursos.
+    </para>
+
+    <sect2 id="zend.acl.introduction.resources">
+        <title>Recursos</title>
+
+        <para>
+            A criação de um recurso em <classname>Zend_Acl</classname> é muito simples.
+            <classname>Zend_Acl</classname> fornece um meio,
+            <classname>Zend_Acl_Resource_Interface</classname>, para facilitar a criação de recursos
+            em uma aplicação. Uma classe precisa apenas implementar esta interface, que consiste em
+            um único método, <methodname>getResourceId()</methodname>, para que
+            <classname>Zend_Acl</classname> reconheça o objeto como um recurso. Adicionalmente,
+            <classname>Zend_Acl_Resource</classname> é fornecida por <classname>Zend_Acl</classname>
+            como uma implementação básica de recurso para que desenvolvedores a extendam conforme
+            necessário.
+        </para>
+        
+        <para>
+            <classname>Zend_Acl</classname> fornece uma estrutura de árvore na qual múltiplos
+            recursos podem ser adicionados. Como os recursos são armazenados em uma estrutura de
+            árvore, eles podem ser organizados do geral (em direção à raiz da árvore) para o 
+            específico (em direção às folhas da árvore). Consultas em um recurso específico irá 
+            automaticamente pesquisar sua hierarquia por regras definidas em recursos ancenstrais,
+            permitindo herança simplificada de regras. Por exemplo, se uma regra deve ser aplicada a
+            cada construção em uma cidade, pode-se simplesmente aplicar a regra à cidade, ao invés 
+            de atribuir a mesma regra para cada construção. Contudo, algumas construções podem 
+            necessitar de exceções para tal regra e isto pode ser feito em 
+            <classname>Zend_Acl</classname> atribuindo tal exceção a cada construção que a 
+            necessite. Um recurso pode descender de apenas um recurso pai, embora este recurso pai
+            pode possuir seu próprio pai, etc.
+        </para>
+
+        <para>
+            <classname>Zend_Acl</classname> também suporta privilégios em recursos (ex., "criar",
+            "ler", "atualizar", "excluir") e o desenvolvedor pode atribuir regras que afetam todos
+            os privilégios ou apenas privilégios específicos em um ou mais recursos.
+        </para>
+    </sect2>
+
+    <sect2 id="zend.acl.introduction.roles">
+        <title>Papéis</title>
+
+        <para>
+            Assim como recursos, criar um papel é também muito simples. Todos os papéis devem
+            implementar <classname>Zend_Acl_Role_Interface</classname>. Esta interface consiste
+            em um único método, <methodname>getRoleId()</methodname>. Adicionalmente,
+            <classname>Zend_Acl_Role</classname> é fornecida por <classname>Zend_Acl</classname>
+            como uma implementação de papel básica da qual desenvolvedores podem extender,
+            quando necessário.
+        </para>
+
+        <para>
+            Em <classname>Zend_Acl</classname>, um papel pode derivar de um ou mais papéis. Isto
+            é para suportar herança de regras através de papéis. Por exemplo, um papel de usuário,
+            tal como "sally", pode derivar de um ou mais papéis pai, como "editor" e
+            "administrador". O desenvolvedor pode atribuir regras para "editor" e "administrador"
+            separadamente, e "sally" herdará tais regras de ambos, sem a necessidade de atribuir
+            regras diretamente a "sally".
+        </para>
+
+        <para>
+            Embora a abilidade de herdaer de múltiplios papéis seja muito útil, herança múltipla
+            também introduz algum grau de complexidade. O exemplo a seguir ilustra a condição
+            ambígua e como <classname>Zend_Acl</classname> a soluciona.
+        </para>
+
+        <example id="zend.acl.introduction.roles.example.multiple_inheritance">
+            <title>Herança múltipla através de Papéis</title>
+
+            <para>
+                O código a seguir define três papéis fundamentais - "visitante", "membro" e
+                "admin" - dos quais outros papéis irão descender. Então, um papel identificado por
+                "algumUsuario" é estabelecido e descende dos outros três papéis. A ordem em que
+                estes papéis aparecem no array <varname>$parents</varname> é importante. Quando
+                necessário, <classname>Zend_Acl</classname> procura por regras de acesso definidas
+                não somente para o papél consultado (aqui, "algumUsuario"), mas também em papéis
+                do qual o papel consultado descende (aqui, "visitante", "membro" e "admin"): 
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$acl = new Zend_Acl();
+
+$acl->addRole(new Zend_Acl_Role('visitante'))
+    ->addRole(new Zend_Acl_Role('membro'))
+    ->addRole(new Zend_Acl_Role('admin'));
+
+$parents = array('visitante', 'membro', 'admin');
+$acl->addRole(new Zend_Acl_Role('algumUsuario'), $parents);
+
+$acl->add(new Zend_Acl_Resource('algumRecurso'));
+
+$acl->deny('visitante', 'algumRecurso');
+$acl->allow('membro', 'algumRecurso');
+
+echo $acl->isAllowed('algumUsuario', 'algumRecurso') ? 'permitido' : 'negado';
+]]></programlisting>
+
+            <para>
+                Como não há regra especificamente definida para o papel "algumUsuario" e
+                "algumRecurso", <classname>Zend_Acl</classname> deve procurar por regras que tenham
+                sido definidas para papéis dos quais "algumUsuario" descende. Primeiro, o papel
+                "admin" é visitado e não há regra de acesso definida para ele. Depois, o papel
+                "membro" é visitado e <classname>Zend_Acl</classname> verifica que há uma regra
+                especificando que "membro" tem acesso permitido a "algumRecurso".
+            </para>
+
+            <para>
+                Se <classname>Zend_Acl</classname> continuar examinando as regras definidas para
+                outros papéis pai, contudo, ela encontrará que "visitante" tem acesso negado a
+                "algumRecurso". Este é o fato que introduz uma ambiguidade, pois agora
+                "algumUsuario" possui, ao mesmo tempo, acesso negado e permitido a "algumRecurso",
+                pelo motivo de herdar regras conflitantes de diferentes papéis pai.
+            </para>
+
+            <para>
+                <classname>Zend_Acl</classname> soluciona esta ambiguidade concluindo a consulta
+                quando ela encontra a primeira regra diretamente aplicável a consulta. Neste caso,
+                como o papel "membro" é examinado antes do papel "visitante", o código de exemplo
+                exibirá "permitido". 
+            </para>
+        </example>
+
+        <note>
+            <para>
+                Quando especificando múltiplos pais para um papel, tenha em mente que o último pai
+                listado será o primeiro buscado para regras aplicáveis a uma consulta de
+                autorização.
+            </para>
+        </note>
+    </sect2>
+
+    <sect2 id="zend.acl.introduction.creating">
+        <title>Criando Listas de Controle de Acesso</title>
+
+        <para>
+            Uma Lista de Controle de Acesso (<acronym>ACL</acronym>, na sigla em inglês) pode
+            representar qualquer conjunto de objetos físicos ou virtuais que você desejar. Contudo,
+            para o propósito de demonstração, criaremos uma <acronym>ACL</acronym> básica de um
+            Sistema de Gerenciamento de Conteúdo (<acronym>CMS</acronym>, na sigla em inglês) que
+            mentém diversas camadas de grupos através de uma grande variedade de áreas. Para criar
+            um novo objeto <acronym>ACL</acronym>, instanciamos a <acronym>ACL</acronym> sem
+            parâmetros:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$acl = new Zend_Acl();
+]]></programlisting>
+
+        <note>
+            <para>
+                A menos que um desenvolvedor especifique uma regra "allow" (permitir - em inglês),
+                <classname>Zend_Acl</classname> negará acesso a todo privilégio em todo recurso para
+                todo papel.
+            </para>
+        </note>
+    </sect2>
+
+    <sect2 id="zend.acl.introduction.role_registry">
+        <title>Registrando Papéis</title>
+        
+        <para>
+            O <acronym>CMS</acronym> irá quase sempre necessitar de uma hierarquia de permissões
+            para determinar as capacidades de autoridade de seus usuários. Pode haver um grupo
+            'Visitante' para permitir acesso limitado para demonstrações, um grupo 'Equipe' para
+            que a maioria dos usuários do <acronym>CMS</acronym> que executam grande parte das
+            operações diárias, um grupo 'Editor' responsável pela publicação, revisão, arquivamento
+            e exclusão de conteúdo, e finalmente um grupo 'Administrador' cujas tarefas podem
+            incluir todas as de outros grupos bem como a manutenção de informações sensíveis,
+            gerenciamento de usuários, configuração de back-end, dados de configuração, cópias de
+            segurança e exportação. Este conjunto de permissões podem ser representadas em um
+            registro de papéis, permitindo a cada grupo herdar privilégios de grupos 'pai', assim
+            como fornecer privilégios distintos para grupos únicos. As permissões podem ser
+            expressas como:
+        </para>
+
+        <table id="zend.acl.introduction.role_registry.table.example_cms_access_controls">
+            <title>Controles de Acesso para um CMS de Exemplo</title>
+            <tgroup cols="3">
+                <thead>
+                    <row>
+                        <entry>Nome</entry>
+                        <entry>Permissões Únicas</entry>
+                        <entry>Permissões herdadas de</entry>
+                    </row>
+                </thead>
+
+                <tbody>
+                    <row>
+                        <entry>Visitante</entry>
+                        <entry>Visualizar</entry>
+                        <entry>N/D</entry>
+                    </row>
+
+                    <row>
+                        <entry>Equipe</entry>
+                        <entry>Editar, Enviar, Revisar</entry>
+                        <entry>Visitante</entry>
+                    </row>
+
+                    <row>
+                        <entry>Editor</entry>
+                        <entry>Publicar, Arquivar, Excluir</entry>
+                        <entry>Equipe</entry>
+                    </row>
+
+                    <row>
+                        <entry>Administrador</entry>
+                        <entry>(Todos os acessos garantidos)</entry>
+                        <entry>N/D</entry>
+                    </row>
+                </tbody>
+            </tgroup>
+        </table>
+
+        <para>
+            Para este exemplo, <classname>Zend_Acl_Role</classname> é usado, mas qualquer objeto
+            que implemente <classname>Zend_Acl_Role_Interface</classname> é aceitável. Estes
+            grupos podem ser adicionados ao registro de papéis, como a seguir:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$acl = new Zend_Acl();
+// Adiciona grupos ao registro de papéis usando Zend_Acl_Role
+// 'Visitante' não herda controles de acesso
+$roleGuest = new Zend_Acl_Role('visitante');
+$acl->addRole($roleGuest);
+
+// 'Equipe' descende de 'Visitante'
+$acl->addRole(new Zend_Acl_Role('equipe'), $roleGuest);
+
+/*
+Alternativamente, o código acima poderia ser escrito como:
+$acl->addRole(new Zend_Acl_Role('equipe'), 'visitante');
+*/
+
+// 'Editor' descende de 'Equipe'
+$acl->addRole(new Zend_Acl_Role('editor'), 'equipe');
+
+// 'Administrador' não herda controles de acesso
+$acl->addRole(new Zend_Acl_Role('administrator'));
+]]></programlisting>
+    </sect2>
+
+    <sect2 id="zend.acl.introduction.defining">
+        <title>Definindo Controles de Acesso</title>
+        <para>
+            Agora que a <acronym>ACL</acronym> contém os papéis relevantes, regras podem ser
+            estabelecidas para definir quais recursos podem ser acessados por quais papéis. Você
+            pode notar que não definimos nenhum recurso em particular para este exemplo, que é
+            simplificado para ilustrar que regras se aplicam a todos os recursos.
+            <classname>Zend_Acl</classname> fornece uma implementação onde regras necessitam apenas
+            serem atribuidas do caso geral para o específico, minimizando o número de regras
+            necessárias, pois recursos e papéis herdam regras definidas em seus ancestrais.
+        </para>
+        
+        <note>
+            <para>
+                Em geral, <classname>Zend_Acl</classname> obedecerá uma regra dada se e somente se
+                uma regra mais específica não for aplicável.
+            </para>
+        </note>
+
+        <para>
+            Consequentemente, podemos definir um conjunto razoavelmente complexo de regras com o
+            mínimo de código. Para aplicar as permissões básicas, tal como definido acima:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$acl = new Zend_Acl();
+
+$roleGuest = new Zend_Acl_Role('visitante');
+$acl->addRole($roleGuest);
+$acl->addRole(new Zend_Acl_Role('equipe'), $roleGuest);
+$acl->addRole(new Zend_Acl_Role('editor'), 'equipe');
+$acl->addRole(new Zend_Acl_Role('administrador'));
+
+// 'Visitante' pode apenas visualizar conteúdo
+$acl->allow($roleGuest, null, 'visualizar');
+
+/*
+Alternatively, the above could be written:
+$acl->allow('visitante', null, 'visualizar');
+//*/
+
+// 'Equipe' herda privilégios de 'Visitante', porém precisa de 
+// privilégios adicionais
+$acl->allow('equipe', null, array('editar', 'enviar', 'revisar'));
+
+// 'Editor' herda os privilégios visualizar, editar, enviar, e revisar de
+// 'Equipe', mas também precisa de privilégios adicionais
+$acl->allow('editor', null, array('publicar', 'arquivar', 'excluir'));
+
+// Administrador não herda nada, mas têm acesso a tudo
+$acl->allow('administrador');
+]]></programlisting>
+
+        <para>
+            Os valores <constant>NULL</constant> nas chamadas <methodname>allow()</methodname>
+            acima indicam que as regras para permitir acesso se aplicam a todos os recursos.
+        </para>
+    </sect2>
+
+    <sect2 id="zend.acl.introduction.querying">
+        <title>Consultando uma ACL</title>
+
+        <para>
+            Temos agora uma <acronym>ACL</acronym> flexível que pode ser usada para determinar quais
+            solicitantes têm permissão para executar funções através da aplicação web.
+            Realizar consultas é bastante simples usando o método 
+            <methodname>isAllowed()</methodname>:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+echo $acl->isAllowed('visitante', null, 'visualizar') ?
+     "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('equipe', null, 'publicar') ?
+     "permitido" : "negado";
+// negado
+
+echo $acl->isAllowed('equipe', null, 'revisar') ?
+     "permitido" : "negado";
+// permitido
+
+echo $acl->isAllowed('editor', null, 'visualizar') ?
+     "permitido" : "negado";
+// 'permitido' por conta da herança de 'visitante'
+
+echo $acl->isAllowed('editor', null, 'atualizar') ?
+     "permitido" : "negado";
+// 'negado' pois não há regra 'atualizar'
+
+echo $acl->isAllowed('administrador', null, 'visualizar') ?
+     "permitido" : "negado";
+// permitido, pois administrador é permitido a todos os privilégios
+
+echo $acl->isAllowed('administrador') ?
+     "permitido" : "negado";
+// permitido, pois administrador é permitido a todos os privilégios
+
+echo $acl->isAllowed('administrador', null, 'atualizar') ?
+     "permitido" : "negado";
+// permitido, pois administrador é permitido a todos os privilégios
+]]></programlisting>
+    </sect2>
+</sect1>
+<!--
+vim:se ts=4 sw=4 et:
+-->

+ 1 - 1
documentation/manual/pt-br/ref/documentation-standard.xml

@@ -376,7 +376,7 @@ $render = "xxx";
             <para>
                 A tag <emphasis>&lt;programlisting&gt;</emphasis> deve conter o atributo "language"
                 com um valor correspondente ao conteúdo do código de exemplo. Os valores típicos
-                incluem "css", "html", "ini", "javascript", "php", "text", e "xml". 
+                incluem "css", "html", "ini", "javascript", "php", "text", e "xml".
             </para>
 
             <programlisting language="xml"><![CDATA[

+ 37 - 0
documentation/manual/pt-br/tutorials/paginator-intro.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 19998 -->
+<!-- Reviewed: no -->
+<sect1 id="learning.paginator.intro">
+    <title>Introdução</title>
+
+    <para>
+        Vamos dizer que você esteja criando um blog que vai ter em sua home uma vasta
+        sequência de artigos. Há uma boa chance de você não querer que todos os
+        artigos de seu blog apareçam em uma única página quando alguém o visita.
+        Uma solução óbvia seria mostrar apenas uma pequena parte dos artigos do blog
+        na tela, e permitir que o usuário navegue entre as diferentes páginas, assim como
+        seu site de busca preferido mostra os resultados quando você faz uma pesquisa.
+        <classname>Zend_Paginator</classname> foi projetado para ajudar você a dividir grandes
+        quantidades de dados em porções menores, de maneira fácil, com mais consistência,
+        e menos duplicidade de código.
+    </para>
+
+    <para>
+        O <classname>Zend_Paginator</classname> faz uso de adaptadores para suportar inúmeros tipos
+        de dados e estilos de rolagem que suportam várias maneiras de mostrar ao seu usuário quais
+        páginas estão disponíveis. Nas próximas etapas desse texto nós vamos dar uma olhada de perto
+        nessas coisas e como elas podem ajudar você a tirar o máximo do <classname>Zend_Paginator</classname>.
+    </para>
+
+    <para>
+        Antes de nos aprofundar, vamos primeiro dar uma olhada em alguns exemplos simples.
+        Depois disso, vamos ver como o <classname>Zend_Paginator</classname> suporta as formas
+        mais comuns de se paginar resultados vindos de uma consulta ao banco de dados.
+    </para>
+
+    <para>
+        Está introdução te dá um rápido resumo sobre <classname>Zend_Paginator</classname>.
+        Para começar e dar uma olhada em alguns trechos de código, vamos ver alguns exemplos
+        simples.
+    </para>
+</sect1>

+ 125 - 0
documentation/manual/pt-br/tutorials/paginator-simple.xml

@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 20876 -->
+<!-- Reviewed: no -->
+<sect1 id="learning.paginator.simple">
+    <title>Exemplos simples</title>
+
+    <para>
+        No primeiro exemplo nós não faremos nada espetacular, mas com certeza isso vai
+        te dar uma boa idéia do que o <classname>Zend_Paginator</classname> é capaz de fazer.
+        Vamos pensar em um array chamado $data, com números de 1 a 100 dentro dele, que
+        queremos dividir em algumas páginas. Podemos usar o método estático
+        <methodname>factory()</methodname> da classe <classname>Zend_Paginator</classname>
+        para ter um objeto <classname>Zend_Paginator</classname> com nosso array dentro dele.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+// Cria um array com números de 1 a 100
+$data = range(1, 100);
+
+// Cria um objeto Paginator usando o método factory do Zend_Paginator
+$paginator = Zend_Paginator::factory($data);
+]]></programlisting>
+
+    <para>
+        Estamos quase lá! A variável $paginator agora contém uma referência para o
+        objeto Paginator. Por padrão ele é configurado para mostrar 10 items por página.
+        Para mostrar os items para a página atual, tudo que você tem a fazer é colocar
+        o objeto Paginator dentro de um laço foreach. Por padrão a página ativa será a
+        primeira caso nada esteja especificado. Nós vamos ver como você pode
+        especificar uma página mais tarde. O trecho abaixo vai mostrar uma lista fora de 
+        ordem contendo números de 1 a 10, os quais são os números da primeira página.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+// Criando array com números de 1 a 100
+$data = range(1, 100);
+
+// Cria um objeto Paginator usando o método factory do Zend_Paginator
+$paginator = Zend_Paginator::factory($data);
+
+?><ul><?php
+
+// Insere cada item para a página atual dentro de uma tag <li>
+foreach ($paginator as $item) {
+    echo '<li>' . $item . '</li>';
+}
+
+?></ul>
+]]></programlisting>
+
+    <para>
+        Agora vamos tentar trazer os items da segunda página. Você pode usar o método
+        <methodname>setCurrentPageNumber()</methodname> para selecionar qual página você quer ver.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+// Criando array com números de 1 a 100
+$data = range(1, 100);
+
+// Cria um objeto Paginator usando o método factory do Zend_Paginator
+$paginator = Zend_Paginator::factory($data);
+
+// Seleciona a segunda página
+$paginator->setCurrentPageNumber(2);
+
+?><ul><?php
+
+// Insere cada item para a página atual dentro de uma tag <li>
+foreach ($paginator as $item) {
+    echo '<li>' . $item . '</li>';
+}
+
+?></ul>
+]]></programlisting>
+
+    <para>
+        Como esperado, esse trecho de código vai montar uma lista não ordenada com números
+        do 11 ao 20.
+    </para>
+
+    <para>
+        Esse simples exemplo demonstra um pouco do que pode ser feito com
+        <classname>Zend_Paginator</classname>. Entretanto, uma aplicação de verdade raramente
+        lê seus dados de um array estático, então a próxima sessão é responsável por mostrar
+        como você pode usar o <classname>Zend_Paginator</classname> para paginar resultados de
+        uma consulta vindo do banco de dados. Antes de prosseguir, tenha certeza de estar
+        familiarizado com a maneira com que o <classname>Zend_Db_Select</classname> funciona!
+    </para>
+
+    <para>
+        Em nossa base de exemplos nos vamos ter uma tabela com posts de um blog chamada 'posts'.
+        A tabela 'posts' tem quatro colunas: id, titulo, texto, data_criacao.
+        Vamos dar uma olhada em um exemplo simples.
+    </para>
+
+    <programlisting language="php"><![CDATA[
+// Criando uma consulta. $db é o objeto Zend_Db_Adapter, que assumimos
+// que já exista em seu código.
+$select = $db->select()->from('posts')->order('data_criacao DESC');
+
+// Cria um objeto Paginator usando o método factory do Zend_Paginator
+$paginator = Zend_Paginator::factory($select);
+
+// Seleciona a segunda página
+$paginator->setCurrentPageNumber(2);
+
+?><ul><?php
+
+// Insere cada item para a página atual dentro de uma tag <li>
+foreach ($paginator as $item) {
+    echo '<li>' . $item->title . '</li>';
+}
+
+?></ul>
+]]></programlisting>
+
+    <para>
+        Como você pode ver, esse exemplo não é tão diferente do anterior.
+        A única diferença é que você passa um objeto <classname>Zend_Db_Select</classname> para o
+        método <methodname>factory()</methodname> da classe paginator ao invés de um array.
+        Para mais detalhes de como o adaptador de banco de dados executa a sua consulta de maneira
+        eficiente, veja o capítulo <classname>Zend_Paginator</classname> no manual de referência
+        sobre os adaptadores DbSelect e DbTableSelect.
+    </para>
+</sect1>