Kaynağa Gözat

[DOCUMENTATION] German:

- sync up to r16625

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@16840 44c647ce-9c0f-0410-b52a-842ac1e357ba
thomas 16 yıl önce
ebeveyn
işleme
06858d1ce1

+ 193 - 0
documentation/manual/de/module_specs/Zend_Ldap-API.xml

@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- EN-Revision: 16617 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.ldap.api" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <title>API overview</title>
+
+    <sect2 id="zend.ldap.api.configuration">
+        <title>Configuration / options</title>
+
+        <para>
+            The <classname>Zend_Ldap</classname> component accepts an array of options either
+            supplied to the constructor or through the <methodname>setOptions()</methodname>
+            method. The permitted options are as follows:
+        </para>
+
+        <table id="zend.ldap.api.configuration.table">
+            <title>Zend_Ldap Options</title>
+
+            <tgroup cols="2">
+                <thead>
+                    <row>
+                        <entry>Name</entry>
+                        <entry>Description</entry>
+                    </row>
+                </thead>
+                <tbody>
+                    <row>
+                        <entry>host</entry>
+                        <entry>
+                            The default hostname of <acronym>LDAP</acronym> server if not
+                            supplied to <methodname>connect()</methodname> (also may be used
+                            when trying to canonicalize usernames in
+                            <methodname>bind()</methodname>).
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>port</entry>
+                        <entry>
+                            Default port of <acronym>LDAP</acronym> server if not supplied to
+                            <methodname>connect()</methodname>.
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>useStartTls</entry>
+                        <entry>
+                            Whether or not the <acronym>LDAP</acronym> client should use
+                            <acronym>TLS</acronym> (aka <acronym>SSLv2</acronym>) encrypted
+                            transport. A value of <constant>TRUE</constant> is strongly favored
+                            in production environments to prevent passwords from be transmitted in
+                            clear text. The default value is <constant>FALSE</constant>, as servers
+                            frequently require that a certificate be installed separately after
+                            installation. The <emphasis>useSsl</emphasis> and
+                            <emphasis>useStartTls</emphasis> options are mutually exclusive.
+                            The <emphasis>useStartTls</emphasis> option should be favored
+                            over <emphasis>useSsl</emphasis> but not all servers support
+                            this newer mechanism.
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>useSsl</entry>
+                        <entry>
+                            Whether or not the <acronym>LDAP</acronym> client should use
+                            <acronym>SSL</acronym> encrypted transport. The
+                            <emphasis>useSsl</emphasis> and <emphasis>useStartTls</emphasis>
+                            options are mutually exclusive.
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>username</entry>
+                        <entry>
+                            The default credentials username. Some servers require that this
+                            be in DN form. This must be given in DN form if the
+                            <acronym>LDAP</acronym> server requires a DN to bind and binding
+                            should be possible with simple usernames.
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>password</entry>
+                        <entry>
+                            The default credentials password (used only with username
+                            above).
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>bindRequiresDn</entry>
+                        <entry>
+                            If <constant>TRUE</constant>, this instructs
+                            <classname>Zend_Ldap</classname> to retrieve the DN for the
+                            account used to bind if the username is not
+                            already in DN form. The default value is <constant>FALSE</constant>.
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>baseDn</entry>
+                        <entry>
+                            The default base DN used for searching (e.g., for accounts).
+                            This option is required for most account related operations and should
+                            indicate the DN under which accounts are located.
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>accountCanonicalForm</entry>
+                        <entry>
+                            A small integer indicating the form to which account names
+                            should be canonicalized. See the <link
+                                linkend="zend.ldap.introduction.theory-of-operations.account-name-canonicalization"><emphasis>Account
+                                Name Canonicalization</emphasis></link>
+                            section below.
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>accountDomainName</entry>
+                        <entry>
+                            The FQDN domain for which the target <acronym>LDAP</acronym> server
+                            is an authority (e.g., example.com).
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>accountDomainNameShort</entry>
+                        <entry>
+                            The 'short' domain for which the target <acronym>LDAP</acronym> server
+                            is an authority. This is usually used to specify the NetBIOS
+                            domain name for Windows networks but may also be used by non-AD servers.
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>accountFilterFormat</entry>
+                        <entry>
+                            The <acronym>LDAP</acronym> search filter used to search for accounts.
+                            This string is a <ulink
+                                url="http://php.net/sprintf"><code>sprintf()</code></ulink>
+                            style expression that must contain one '<emphasis>%s</emphasis>' to
+                            accommodate the username. The default value is
+                            '<emphasis>(&amp;(objectClass=user)(sAMAccountName=%s))</emphasis>'
+                            unless <emphasis>bindRequiresDn</emphasis> is set to
+                            <constant>TRUE</constant>, in which case the default is
+                            '<emphasis>(&amp;(objectClass=posixAccount)(uid=%s))</emphasis>'.
+                            Users of custom schemas may need to change this option.
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>allowEmptyPassword</entry>
+                        <entry>
+                            Some <acronym>LDAP</acronym> servers can be configured to accept an
+                            empty string password as an anonymous bind. This behavior is almost
+                            always undesirable. For this reason, empty passwords are explicitly
+                            disallowed. Set this value to <constant>TRUE</constant> to allow an
+                            empty string password to be submitted during the bind.
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>optReferrals</entry>
+                        <entry>
+                            If set to <constant>TRUE</constant>, this option indicates to the
+                            <acronym>LDAP</acronym> client that referrals should be followed.
+                            The default value is <constant>FALSE</constant>.
+                        </entry>
+                    </row>
+                    <row>
+                        <entry>tryUsernameSplit</entry>
+                        <entry>
+                            If set to <constant>FALSE</constant>, this option indicates that the
+                            given username should not be split at the first <emphasis>@</emphasis>
+                            or <emphasis>\</emphasis> character to separate the username from
+                            the domain during the binding-procedure. This allows the user to
+                            use usernames that contain an <emphasis>@</emphasis> or
+                            <emphasis>\</emphasis> character that do not
+                            inherit some domain-information, e.g. using email-addresses for
+                            binding. The default value is <constant>TRUE</constant>.
+                        </entry>
+                    </row>
+                </tbody>
+            </tgroup>
+        </table>
+    </sect2>
+
+    <sect2 id="zend.ldap.api.reference">
+        <title>API Reference</title>
+
+        <note>
+            <para>Method names in <emphasis>italics</emphasis> are static methods.</para>
+        </note>
+
+        <xi:include href="Zend_Ldap-API-Ldap.xml" />
+        <xi:include href="Zend_Ldap-API-Ldap-Attribute.xml" />
+        <xi:include href="Zend_Ldap-API-Ldap-Dn.xml" />
+        <xi:include href="Zend_Ldap-API-Ldap-Filter.xml" />
+        <xi:include href="Zend_Ldap-API-Ldap-Node.xml" />
+        <xi:include href="Zend_Ldap-API-Ldap-Node-RootDse.xml" />
+        <xi:include href="Zend_Ldap-API-Ldap-Node-Schema.xml" />
+        <xi:include href="Zend_Ldap-API-Ldap-Ldif-Encoder.xml" />
+    </sect2>
+</sect1>

+ 328 - 0
documentation/manual/de/module_specs/Zend_Ldap-Introduction.xml

@@ -0,0 +1,328 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 16617 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.ldap.introduction">
+    <title>Introduction</title>
+
+    <para>
+        <classname>Zend_Ldap</classname> is a class for performing <acronym>LDAP</acronym>
+        operations including but not limited to binding, searching and modifying entries
+        in an <acronym>LDAP</acronym> directory.
+    </para>
+
+    <sect2 id="zend.ldap.introduction.theory-of-operations">
+        <title>Theory of operation</title>
+
+        <para>
+            This component currently consists of the main <classname>Zend_Ldap</classname> class,
+            that conceptually represents a binding to a single <acronym>LDAP</acronym> server
+            and allows for executing operations against a <acronym>LDAP</acronym> server such
+            as OpenLDAP or ActiveDirectory (AD) servers. The parameters for binding may be
+            provided explicitly or in the form of an options array.
+            <classname>Zend_Ldap_Node</classname> provides an object-oriented interface
+            for single <acronym>LDAP</acronym> nodes and can be used to form a basis for an
+            active-record-like interface for a <acronym>LDAP</acronym>-based domain model.
+        </para>
+
+        <para>
+            The component provides several helper classes to perform operations on
+            <acronym>LDAP</acronym> entries (<classname>Zend_Ldap_Attribute</classname>) such as
+            setting and retrieving attributes (date values, passwords, boolean values, ...), to
+            create and modify <acronym>LDAP</acronym> filter strings
+            (<classname>Zend_Ldap_Filter</classname>) and to manipulate <acronym>LDAP</acronym>
+            distinguished names (DN) (<classname>Zend_Ldap_Dn</classname>).
+        </para>
+
+        <para>
+            Additionally the component abstracts <acronym>LDAP</acronym> schema browsing
+            for OpenLDAP and ActiveDirectoy servers <classname>Zend_Ldap_Node_Schema</classname>
+            and server information retrieval for OpenLDAP-, ActiveDirectory- and Novell
+            eDirectory servers (<classname>Zend_Ldap_Node_RootDse</classname>).
+        </para>
+
+        <para>
+            Using the <classname>Zend_Ldap</classname> class depends on the type of
+            <acronym>LDAP</acronym> server and is best summarized with some simple examples.
+        </para>
+
+        <para>
+            If you are using OpenLDAP, a simple example looks like the following
+            (note that the <emphasis>bindRequiresDn</emphasis> option is important if you are
+            <emphasis>not</emphasis> using AD):
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$options = array(
+    'host'              => 's0.foo.net',
+    'username'          => 'CN=user1,DC=foo,DC=net',
+    'password'          => 'pass1',
+    'bindRequiresDn'    => true,
+    'accountDomainName' => 'foo.net',
+    'baseDn'            => 'OU=Sales,DC=foo,DC=net',
+);
+$ldap = new Zend_Ldap($options);
+$acctname = $ldap->getCanonicalAccountName('abaker',
+                                           Zend_Ldap::ACCTNAME_FORM_DN);
+echo "$acctname\n";
+]]></programlisting>
+
+        <para>
+            If you are using Microsoft AD a simple example is:
+        </para>
+
+        <programlisting language="php"><![CDATA[
+$options = array(
+    'host'                   => 'dc1.w.net',
+    'useStartTls'            => true,
+    'username'               => 'user1@w.net',
+    'password'               => 'pass1',
+    'accountDomainName'      => 'w.net',
+    'accountDomainNameShort' => 'W',
+    'baseDn'                 => 'CN=Users,DC=w,DC=net',
+);
+$ldap = new Zend_Ldap($options);
+$acctname = $ldap->getCanonicalAccountName('bcarter',
+                                           Zend_Ldap::ACCTNAME_FORM_DN);
+echo "$acctname\n";
+]]></programlisting>
+
+        <para>
+            Note that we use the <methodname>getCanonicalAccountName()</methodname> method
+            to retrieve the account DN here only because that is what exercises the
+            most of what little code is currently present in this class.
+        </para>
+
+        <sect3 id="zend.ldap.introduction.theory-of-operations.automatic-username-canonicalization">
+            <title>Automatic Username Canonicalization When Binding</title>
+
+            <para>
+                If <methodname>bind()</methodname> is called with a non-DN username but
+                <emphasis>bindRequiresDN</emphasis> is <constant>TRUE</constant> and no username in
+                DN form was supplied as an option, the bind will fail. However, if a username in DN
+                form is supplied in the options array, <classname>Zend_Ldap</classname> will
+                first bind with that username, retrieve the account DN for the username
+                supplied to <methodname>bind()</methodname> and then re-bind with that DN.
+            </para>
+
+            <para>
+                This behavior is critical to <link
+                    linkend="zend.auth.adapter.ldap"><classname>Zend_Auth_Adapter_Ldap</classname></link>,
+                which passes the username supplied by the user directly to
+                <methodname>bind()</methodname>.
+            </para>
+
+            <para>
+                The following example illustrates how the non-DN username
+                '<emphasis>abaker</emphasis>' can be used with <methodname>bind()</methodname>:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$options = array(
+        'host'              => 's0.foo.net',
+        'username'          => 'CN=user1,DC=foo,DC=net',
+        'password'          => 'pass1',
+        'bindRequiresDn'    => true,
+        'accountDomainName' => 'foo.net',
+        'baseDn'            => 'OU=Sales,DC=foo,DC=net',
+);
+$ldap = new Zend_Ldap($options);
+$ldap->bind('abaker', 'moonbike55');
+$acctname = $ldap->getCanonicalAccountName('abaker',
+                                           Zend_Ldap::ACCTNAME_FORM_DN);
+echo "$acctname\n";
+]]></programlisting>
+
+            <para>
+                The <methodname>bind()</methodname> call in this example sees that
+                the username '<emphasis>abaker</emphasis>' is not in DN form, finds
+                <emphasis>bindRequiresDn</emphasis> is <constant>TRUE</constant>, uses
+                '<command>CN=user1,DC=foo,DC=net</command>' and '<emphasis>pass1</emphasis>' to
+                bind, retrieves the DN for '<emphasis>abaker</emphasis>', unbinds and then rebinds
+                with the newly discovered
+                '<command>CN=Alice Baker,OU=Sales,DC=foo,DC=net</command>'.
+            </para>
+        </sect3>
+
+        <sect3 id="zend.ldap.introduction.theory-of-operations.account-name-canonicalization">
+            <title>Account Name Canonicalization</title>
+
+            <para>
+                The <emphasis>accountDomainName</emphasis> and
+                <emphasis>accountDomainNameShort</emphasis>
+                options are used for two purposes: (1) they facilitate multi-domain
+                authentication and failover capability, and (2) they are also used to
+                canonicalize usernames. Specifically, names are canonicalized to the
+                form specified by the <emphasis>accountCanonicalForm</emphasis> option.
+                This option may one of the following values:
+            </para>
+
+            <table id="zend.ldap.using.theory-of-operation.account-name-canonicalization.table">
+                <title>Options for accountCanonicalForm</title>
+                <tgroup cols="3">
+                    <thead>
+                        <row>
+                            <entry>Name</entry>
+                            <entry>Value</entry>
+                            <entry>Example</entry>
+                        </row>
+                    </thead>
+                    <tbody>
+                        <row>
+                            <entry>
+                                <constant>ACCTNAME_FORM_DN</constant>
+                            </entry>
+                            <entry>1</entry>
+                            <entry>CN=Alice Baker,CN=Users,DC=example,DC=com</entry>
+                        </row>
+                        <row>
+                            <entry>
+                                <constant>ACCTNAME_FORM_USERNAME</constant>
+                            </entry>
+                            <entry>2</entry>
+                            <entry>abaker</entry>
+                        </row>
+                        <row>
+                            <entry>
+                                <constant>ACCTNAME_FORM_BACKSLASH</constant>
+                            </entry>
+                            <entry>3</entry>
+                            <entry>EXAMPLE\abaker</entry>
+                        </row>
+                        <row>
+                            <entry>
+                                <constant>ACCTNAME_FORM_PRINCIPAL</constant>
+                            </entry>
+                            <entry>4</entry>
+                            <entry><filename>abaker@example.com</filename></entry>
+                        </row>
+                    </tbody>
+                </tgroup>
+            </table>
+
+            <para>
+                The default canonicalization depends on what account domain name options
+                were supplied. If <emphasis>accountDomainNameShort</emphasis> was supplied, the
+                default <emphasis>accountCanonicalForm</emphasis> value is
+                <constant>ACCTNAME_FORM_BACKSLASH</constant>. Otherwise, if
+                <emphasis>accountDomainName</emphasis> was supplied, the
+                default is <constant>ACCTNAME_FORM_PRINCIPAL</constant>.
+            </para>
+
+            <para>
+                Account name canonicalization ensures that the string used to identify
+                an account is consistent regardless of what was supplied to
+                <methodname>bind()</methodname>. For example, if the user supplies an account
+                name of <filename>abaker@example.com</filename> or just
+                <emphasis>abaker</emphasis> and the <emphasis>accountCanonicalForm</emphasis>
+                is set to 3, the resulting canonicalized name would be
+                <emphasis>EXAMPLE\abaker</emphasis>.
+            </para>
+        </sect3>
+
+        <sect3 id="zend.ldap.introduction.theory-of-operations.multi-domain-failover">
+            <title>Multi-domain Authentication and Failover</title>
+
+            <para>
+                The <classname>Zend_Ldap</classname> component by itself makes no attempt
+                to authenticate with multiple servers. However, <classname>Zend_Ldap</classname>
+                is specifically designed to handle this scenario gracefully. The
+                required technique is to simply iterate over an array of arrays of serve
+                 options and attempt to bind with each server. As described above
+                 <methodname>bind()</methodname> will automatically canonicalize each name, so
+                it does not matter if the user passes <filename>abaker@foo.net</filename> or
+                <emphasis>W\bcarter</emphasis> or <emphasis>cdavis</emphasis> - the
+                <methodname>bind()</methodname> method will only succeed if the credentials were
+                successfully used in the bind.
+            </para>
+
+            <para>
+                Consider the following example that illustrates the technique required to
+                implement multi-domain authentication and failover:
+            </para>
+
+            <programlisting language="php"><![CDATA[
+$acctname = 'W\\user2';
+$password = 'pass2';
+
+$multiOptions = array(
+    'server1' => array(
+        'host'                   => 's0.foo.net',
+        'username'               => 'CN=user1,DC=foo,DC=net',
+        'password'               => 'pass1',
+        'bindRequiresDn'         => true,
+        'accountDomainName'      => 'foo.net',
+        'accountDomainNameShort' => 'FOO',
+        'accountCanonicalForm'   => 4, // ACCT_FORM_PRINCIPAL
+        'baseDn'                 => 'OU=Sales,DC=foo,DC=net',
+    ),
+    'server2' => array(
+        'host'                   => 'dc1.w.net',
+        'useSsl'                 => true,
+        'username'               => 'user1@w.net',
+        'password'               => 'pass1',
+        'accountDomainName'      => 'w.net',
+        'accountDomainNameShort' => 'W',
+        'accountCanonicalForm'   => 4, // ACCT_FORM_PRINCIPAL
+        'baseDn'                 => 'CN=Users,DC=w,DC=net',
+    ),
+);
+
+$ldap = new Zend_Ldap();
+
+foreach ($multiOptions as $name => $options) {
+
+    echo "Trying to bind using server options for '$name'\n";
+
+    $ldap->setOptions($options);
+    try {
+        $ldap->bind($acctname, $password);
+        $acctname = $ldap->getCanonicalAccountName($acctname);
+        echo "SUCCESS: authenticated $acctname\n";
+        return;
+    } catch (Zend_Ldap_Exception $zle) {
+        echo '  ' . $zle->getMessage() . "\n";
+        if ($zle->getCode() === Zend_Ldap_Exception::LDAP_X_DOMAIN_MISMATCH) {
+            continue;
+        }
+    }
+}
+]]></programlisting>
+
+            <para>
+                If the bind fails for any reason, the next set of server options is tried.
+            </para>
+
+            <para>
+                The <methodname>getCanonicalAccountName()</methodname> call gets the canonical
+                account name that the application would presumably use to associate data with such
+                as preferences. The <emphasis>accountCanonicalForm = 4</emphasis> in all server
+                options ensures that the canonical form is consistent regardless of which
+                server was ultimately used.
+            </para>
+
+            <para>
+                The special <constant>LDAP_X_DOMAIN_MISMATCH</constant> exception occurs when an
+                account name with a domain component was supplied (e.g.,
+                <filename>abaker@foo.net</filename> or <emphasis>FOO\abaker</emphasis> and not just
+                <emphasis>abaker</emphasis>) but the domain component did not match either domain
+                in the currently selected server options. This exception indicates
+                that the server is not an authority for the account. In this
+                case, the bind will not be performed, thereby eliminating unnecessary
+                communication with the server. Note that the <emphasis>continue</emphasis>
+                instruction has no effect in this example, but in practice for error handling and
+                debugging purposes, you will probably want to check for
+                <constant>LDAP_X_DOMAIN_MISMATCH</constant> as well as
+                <constant>LDAP_NO_SUCH_OBJECT</constant> and
+                <constant>LDAP_INVALID_CREDENTIALS</constant>.
+            </para>
+
+            <para>
+                The above code is very similar to code used within <link
+                    linkend="zend.auth.adapter.ldap"><classname>Zend_Auth_Adapter_Ldap</classname></link>.
+                In fact, we recommend that you simply use that authentication adapter for
+                multi-domain + failover <acronym>LDAP</acronym> based authentication
+                (or copy the code).
+            </para>
+        </sect3>
+    </sect2>
+</sect1>

+ 130 - 0
documentation/manual/de/module_specs/Zend_Ldap-LDIF.xml

@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 16617 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.ldap.ldif">
+    <title>Serializing LDAP data to and from LDIF</title>
+    <sect2 id="zend.ldap.ldif.encode">
+        <title>Serialize a LDAP entry to LDIF</title>
+
+        <programlisting language="php"><![CDATA[
+$data = array(
+    'dn'                         => 'uid=rogasawara,ou=営業部,o=Airius',
+    'objectclass'                => array('top',
+                                          'person',
+                                          'organizationalPerson',
+                                          'inetOrgPerson'),
+    'uid'                        => array('rogasawara'),
+    'mail'                       => array('rogasawara@airius.co.jp'),
+    'givenname;lang-ja'          => array('ロドニー'),
+    'sn;lang-ja'                 => array('小笠原'),
+    'cn;lang-ja'                 => array('小笠原 ロドニー'),
+    'title;lang-ja'              => array('営業部 部長'),
+    'preferredlanguage'          => array('ja'),
+    'givenname'                  => array('ロドニー'),
+    'sn'                         => array('小笠原'),
+    'cn'                         => array('小笠原 ロドニー'),
+    'title'                      => array('営業部 部長'),
+    'givenname;lang-ja;phonetic' => array('ろどにー'),
+    'sn;lang-ja;phonetic'        => array('おがさわら'),
+    'cn;lang-ja;phonetic'        => array('おがさわら ろどにー'),
+    'title;lang-ja;phonetic'     => array('えいぎょうぶ ぶちょう'),
+    'givenname;lang-en'          => array('Rodney'),
+    'sn;lang-en'                 => array('Ogasawara'),
+    'cn;lang-en'                 => array('Rodney Ogasawara'),
+    'title;lang-en'              => array('Sales, Director'),
+);
+$ldif = Zend_Ldap_Ldif_Encoder::encode($data, array('sort' => false,
+                                                    'version' => null));
+/*
+$ldif contains:
+dn:: dWlkPXJvZ2FzYXdhcmEsb3U95Za25qWt6YOoLG89QWlyaXVz
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+uid: rogasawara
+mail: rogasawara@airius.co.jp
+givenname;lang-ja:: 44Ot44OJ44OL44O8
+sn;lang-ja:: 5bCP56yg5Y6f
+cn;lang-ja:: 5bCP56yg5Y6fIOODreODieODi+ODvA==
+title;lang-ja:: 5Za25qWt6YOoIOmDqOmVtw==
+preferredlanguage: ja
+givenname:: 44Ot44OJ44OL44O8
+sn:: 5bCP56yg5Y6f
+cn:: 5bCP56yg5Y6fIOODreODieODi+ODvA==
+title:: 5Za25qWt6YOoIOmDqOmVtw==
+givenname;lang-ja;phonetic:: 44KN44Gp44Gr44O8
+sn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJ
+cn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJIOOCjeOBqeOBq+ODvA==
+title;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2IOOBtuOBoeOCh+OBhg==
+givenname;lang-en: Rodney
+sn;lang-en: Ogasawara
+cn;lang-en: Rodney Ogasawara
+title;lang-en: Sales, Director
+*/
+]]></programlisting>
+
+    </sect2>
+
+    <sect2 id="zend.ldap.ldif.decode">
+        <title>Deserialize a LDIF string into a LDAP entry</title>
+
+        <programlisting language="php"><![CDATA[
+$ldif = "dn:: dWlkPXJvZ2FzYXdhcmEsb3U95Za25qWt6YOoLG89QWlyaXVz
+objectclass: top
+objectclass: person
+objectclass: organizationalPerson
+objectclass: inetOrgPerson
+uid: rogasawara
+mail: rogasawara@airius.co.jp
+givenname;lang-ja:: 44Ot44OJ44OL44O8
+sn;lang-ja:: 5bCP56yg5Y6f
+cn;lang-ja:: 5bCP56yg5Y6fIOODreODieODi+ODvA==
+title;lang-ja:: 5Za25qWt6YOoIOmDqOmVtw==
+preferredlanguage: ja
+givenname:: 44Ot44OJ44OL44O8
+sn:: 5bCP56yg5Y6f
+cn:: 5bCP56yg5Y6fIOODreODieODi+ODvA==
+title:: 5Za25qWt6YOoIOmDqOmVtw==
+givenname;lang-ja;phonetic:: 44KN44Gp44Gr44O8
+sn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJ
+cn;lang-ja;phonetic:: 44GK44GM44GV44KP44KJIOOCjeOBqeOBq+ODvA==
+title;lang-ja;phonetic:: 44GI44GE44GO44KH44GG44G2IOOBtuOBoeOCh+OBhg==
+givenname;lang-en: Rodney
+sn;lang-en: Ogasawara
+cn;lang-en: Rodney Ogasawara
+title;lang-en: Sales, Director";
+$data = Zend_Ldap_Ldif_Encoder::decode($ldif);
+/*
+$data = array(
+    'dn'                         => 'uid=rogasawara,ou=営業部,o=Airius',
+    'objectclass'                => array('top',
+                                          'person',
+                                          'organizationalPerson',
+                                          'inetOrgPerson'),
+    'uid'                        => array('rogasawara'),
+    'mail'                       => array('rogasawara@airius.co.jp'),
+    'givenname;lang-ja'          => array('ロドニー'),
+    'sn;lang-ja'                 => array('小笠原'),
+    'cn;lang-ja'                 => array('小笠原 ロドニー'),
+    'title;lang-ja'              => array('営業部 部長'),
+    'preferredlanguage'          => array('ja'),
+    'givenname'                  => array('ロドニー'),
+    'sn'                         => array('小笠原'),
+    'cn'                         => array('小笠原 ロドニー'),
+    'title'                      => array('営業部 部長'),
+    'givenname;lang-ja;phonetic' => array('ろどにー'),
+    'sn;lang-ja;phonetic'        => array('おがさわら'),
+    'cn;lang-ja;phonetic'        => array('おがさわら ろどにー'),
+    'title;lang-ja;phonetic'     => array('えいぎょうぶ ぶちょう'),
+    'givenname;lang-en'          => array('Rodney'),
+    'sn;lang-en'                 => array('Ogasawara'),
+    'cn;lang-en'                 => array('Rodney Ogasawara'),
+    'title;lang-en'              => array('Sales, Director'),
+);
+*/
+]]></programlisting>
+
+    </sect2>
+</sect1>
+

+ 57 - 0
documentation/manual/de/module_specs/Zend_Ldap-Node.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 16617 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.ldap.node">
+    <title>Object oriented access to the LDAP tree using Zend_Ldap_Node</title>
+    <sect2 id="zend.ldap.node.basic">
+        <title>Basic CRUD operations</title>
+        <sect3 id="zend.ldap.node.basic.retrieve">
+            <title>Retrieving data from the LDAP</title>
+            <sect4 id="zend.ldap.node.basic.retrieve.dn">
+                <title>Getting a node by its DN</title>
+                <para/>
+            </sect4>
+            <sect4 id="zend.ldap.node.basic.retrieve.search">
+                <title>Searching a node's subtree</title>
+                <para/>
+            </sect4>
+        </sect3>
+        <sect3 id="zend.ldap.node.basic.add">
+            <title>Adding a new node to the LDAP</title>
+            <para/>
+        </sect3>
+        <sect3 id="zend.ldap.node.basic.delete">
+            <title>Deleting a node from the LDAP</title>
+            <para/>
+        </sect3>
+        <sect3 id="zend.ldap.node.basic.update">
+            <title>Updating a node on the LDAP</title>
+            <para/>
+        </sect3>
+    </sect2>
+    <sect2 id="zend.ldap.node.extended">
+        <title>Extended operations</title>
+        <sect3 id="zend.ldap.node.extended.copy-and-move">
+            <title>Copy and move nodes in the LDAP</title>
+            <para/>
+        </sect3>
+    </sect2>
+    <sect2 id="zend.ldap.node.traversal">
+        <title>Tree traversal</title>
+
+            <example>
+            <title>Traverse LDAP tree recursively</title>
+<programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$ldap->bind();
+$ri = new RecursiveIteratorIterator($ldap->getBaseNode(),
+                                    RecursiveIteratorIterator::SELF_FIRST);
+foreach ($ri as $rdn => $n) {
+    var_dump($n);
+}
+]]></programlisting>
+            </example>
+
+    </sect2>
+</sect1>

+ 79 - 0
documentation/manual/de/module_specs/Zend_Ldap-Server.xml

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 16617 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.ldap.server">
+    <title>Getting information from the LDAP server</title>
+    <sect2 id="zend.ldap.server.rootdse">
+        <title>RootDSE</title>
+
+        <para>
+            See the following documents for more information on the attributes contained within
+            the RootDSE for a given <acronym>LDAP</acronym> server.
+        </para>
+
+        <itemizedlist>
+            <listitem>
+                <para>
+                    <ulink url="http://www.zytrax.com/books/ldap/ch3/#operational">OpenLDAP</ulink>
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <ulink
+                        url="http://msdn.microsoft.com/en-us/library/ms684291(VS.85).aspx">Microsoft
+                        ActiveDirectory</ulink>
+                </para>
+            </listitem>
+            <listitem>
+                <para>
+                    <ulink
+                        url="http://www.novell.com/documentation/edir88/edir88/index.html?page=/documentation/edir88/edir88/data/ah59jqq.html">Novell
+                        eDirectory</ulink>
+                </para>
+            </listitem>
+        </itemizedlist>
+
+        <example id="zend.ldap.server.rootdse.getting">
+            <title>Getting hands on the RootDSE</title>
+            <programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$rootdse = $ldap->getRootDse();
+$serverType = $rootdse->getServerType();
+]]></programlisting>
+        </example>
+    </sect2>
+
+    <sect2 id="zend.ldap.server.schema">
+        <title>Schema Browsing</title>
+
+        <example id="zend.ldap.server.schema.getting">
+            <title>Getting hands on the server schema</title>
+            <programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$schema = $ldap->getSchema();
+$classes = $schema->getObjectClasses();
+]]></programlisting>
+        </example>
+
+        <sect3 id="zend.ldap.server.schema.openldap">
+            <title>OpenLDAP</title>
+            <para/>
+        </sect3>
+
+        <sect3 id="zend.ldap.server.schema.activedirectory">
+            <title>ActiveDirectory</title>
+            <note>
+                <title>Schema browsing on ActiveDirectory servers</title>
+                <para>
+                    Due to restrictions on Microsoft ActiveDirectory servers regarding
+                    the number of entries returned by generic search routines and due to
+                    the structure of the ActiveDirectory schema repository, schema browsing
+                    is currently <emphasis>not</emphasis> available for Microsoft
+                    ActiveDirectory servers.
+                </para>
+            </note>
+        </sect3>
+    </sect2>
+</sect1>

+ 54 - 0
documentation/manual/de/module_specs/Zend_Ldap-Tools.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 16617 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.ldap.tools">
+    <title>Tools</title>
+
+    <sect2 id="zend.ldap.tools.dn">
+        <title>Creation and modification of DN strings</title>
+        <para/>
+    </sect2>
+
+    <sect2 id="zend.ldap.tools.filter">
+        <title>Using the filter API to create search filters</title>
+
+        <example>
+            <title>Create simple LDAP filters</title>
+            <programlisting language="php"><![CDATA[
+$f1  = Zend_Ldap_Filter::equals('name', 'value');         // (name=value)
+$f2  = Zend_Ldap_Filter::begins('name', 'value');         // (name=value*)
+$f3  = Zend_Ldap_Filter::ends('name', 'value');           // (name=*value)
+$f4  = Zend_Ldap_Filter::contains('name', 'value');       // (name=*value*)
+$f5  = Zend_Ldap_Filter::greater('name', 'value');        // (name>value)
+$f6  = Zend_Ldap_Filter::greaterOrEqual('name', 'value'); // (name>=value)
+$f7  = Zend_Ldap_Filter::less('name', 'value');           // (name<value)
+$f8  = Zend_Ldap_Filter::lessOrEqual('name', 'value');    // (name<=value)
+$f9  = Zend_Ldap_Filter::approx('name', 'value');         // (name~=value)
+$f10 = Zend_Ldap_Filter::any('name');                     // (name=*)
+]]></programlisting>
+        </example>
+
+        <example>
+            <title>Create more complex LDAP filters</title>
+            <programlisting language="php"><![CDATA[
+$f1 = Zend_Ldap_Filter::ends('name', 'value')->negate(); // (!(name=*value))
+
+$f2 = Zend_Ldap_Filter::equals('name', 'value');
+$f3 = Zend_Ldap_Filter::begins('name', 'value');
+$f4 = Zend_Ldap_Filter::ends('name', 'value');
+
+// (&(name=value)(name=value*)(name=*value))
+$f5 = Zend_Ldap_Filter::andFilter($f2, $f3, $f4);
+
+// (|(name=value)(name=value*)(name=*value))
+$f6 = Zend_Ldap_Filter::orFilter($f2, $f3, $f4);
+]]></programlisting>
+
+        </example>
+    </sect2>
+
+    <sect2 id="zend.ldap.tools.attribute">
+        <title>Modify LDAP entries using the Attribute API</title>
+        <para/>
+    </sect2>
+</sect1>

+ 165 - 0
documentation/manual/de/module_specs/Zend_Ldap-Usage.xml

@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 16617 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.ldap.usage">
+    <title>Usage Scenarios</title>
+    <sect2 id="zend.ldap.usage.authentication">
+        <title>Authentication scenarios</title>
+
+        <sect3 id="zend.ldap.usage.authentication.openldap">
+            <title>OpenLDAP</title>
+            <para/>
+        </sect3>
+
+        <sect3 id="zend.ldap.usage.authentication.activedirectory">
+            <title>ActiveDirectory</title>
+            <para/>
+        </sect3>
+    </sect2>
+
+    <sect2 id="zend.ldap.usage.basic">
+        <title>Basic CRUD operations</title>
+
+        <sect3 id="zend.ldap.usage.basic.retrieve">
+            <title>Retrieving data from the LDAP</title>
+            <example id="zend.ldap.usage.basic.retrieve.dn">
+                <title>Getting an entry by its DN</title>
+                <programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$ldap->bind();
+$hm = $ldap->getEntry('cn=Hugo Müller,ou=People,dc=my,dc=local');
+/*
+$hm is an array of the following structure
+array(
+    'dn'          => 'cn=Hugo Müller,ou=People,dc=my,dc=local',
+    'cn'          => array('Hugo Müller'),
+    'sn'          => array('Müller'),
+    'objectclass' => array('inetOrgPerson', 'top'),
+    ...
+)
+*/
+]]></programlisting>
+            </example>
+
+            <example id="zend.ldap.usage.basic.retrieve.exists">
+                <title>Check for the existence of a given DN</title>
+                <programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$ldap->bind();
+$isThere = $ldap->exists('cn=Hugo Müller,ou=People,dc=my,dc=local');
+]]></programlisting>
+            </example>
+
+            <example id="zend.ldap.usage.basic.retrieve.counting-children">
+                <title>Count children of a given DN</title>
+                <programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$ldap->bind();
+$childrenCount = $ldap->countChildren(
+                            'cn=Hugo Müller,ou=People,dc=my,dc=local');
+]]></programlisting>
+        </example>
+
+            <example id="zend.ldap.usage.basic.retrieve.search">
+                <title>Searching the LDAP tree</title>
+                <programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$ldap->bind();
+$result = $ldap->search('(objectclass=*)',
+                        'ou=People,dc=my,dc=local',
+                        Zend_Ldap_Ext::SEARCH_SCOPE_ONE);
+foreach ($result as $item) {
+    echo $item["dn"] . ': ' . $item['cn'][0] . PHP_EOL;
+}
+]]></programlisting>
+            </example>
+        </sect3>
+
+        <sect3 id="zend.ldap.usage.basic.add">
+            <title>Adding data to the LDAP</title>
+            <example>
+                <title>Add a new entry to the LDAP</title>
+                <programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$ldap->bind();
+$entry = array();
+Zend_Ldap_Attribute::setAttribute($entry, 'cn', 'Hans Meier');
+Zend_Ldap_Attribute::setAttribute($entry, 'sn', 'Meier');
+Zend_Ldap_Attribute::setAttribute($entry, 'objectClass', 'inetOrgPerson');
+$ldap->add('cn=Hans Meier,ou=People,dc=my,dc=local', $entry);
+]]></programlisting>
+                </example>
+        </sect3>
+
+        <sect3 id="zend.ldap.usage.basic.delete">
+            <title>Deleting from the LDAP</title>
+            <example>
+                <title>Delete an existing entry from the LDAP</title>
+                <programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$ldap->bind();
+$ldap->delete('cn=Hans Meier,ou=People,dc=my,dc=local');
+]]></programlisting>
+                </example>
+        </sect3>
+
+        <sect3 id="zend.ldap.usage.basic.update">
+            <title>Updating the LDAP</title>
+            <example>
+                <title>Update an existing entry on the LDAP</title>
+                <programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$ldap->bind();
+$hm = $ldap->getEntry('cn=Hugo Müller,ou=People,dc=my,dc=local');
+Zend_Ldap_Attribute::setAttribute($hm, 'mail', 'mueller@my.local');
+Zend_Ldap_Attribute::setPassword($hm,
+                                 'newPa$$w0rd',
+                                 Zend_Ldap_Attribute::PASSWORD_HASH_SHA1);
+$ldap->update('cn=Hugo Müller,ou=People,dc=my,dc=local', $hm);
+]]></programlisting>
+                </example>
+        </sect3>
+    </sect2>
+
+    <sect2 id="zend.ldap.usage.extended">
+        <title>Extended operations</title>
+
+        <sect3 id="zend.ldap.usage.extended.copy-and-move">
+            <title>Copy and move entries in the LDAP</title>
+
+            <example id="zend.ldap.usage.extended.copy-and-move.copy">
+                <title>Copy a LDAP entry recursively with all its descendants</title>
+                <programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$ldap->bind();
+$ldap->copy('cn=Hugo Müller,ou=People,dc=my,dc=local',
+            'cn=Hans Meier,ou=People,dc=my,dc=local',
+            true);
+]]></programlisting>
+            </example>
+
+            <example id="zend.ldap.usage.extended.copy-and-move.move-to-subtree">
+                <title>
+                    Move a LDAP entry recursively with all its descendants to a different subtree
+                </title>
+                <programlisting language="php"><![CDATA[
+$options = array(/* ... */);
+$ldap = new Zend_Ldap($options);
+$ldap->bind();
+$ldap->moveToSubtree('cn=Hugo Müller,ou=People,dc=my,dc=local',
+                     'ou=Dismissed,dc=my,dc=local',
+                     true);
+]]></programlisting>
+            </example>
+
+        </sect3>
+    </sect2>
+</sect1>

+ 23 - 22
documentation/manual/de/ref/overview.xml

@@ -1,32 +1,32 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 15571 -->
+<!-- EN-Revision: 16620 -->
 <!-- Reviewed: no -->
 <sect1 id="introduction.overview">
 
     <title>Übersicht</title>
 
     <para>
-        Zend Framework (ZF) ist ein Open Source Framework für die Entwicklung von Web Anwendungen
-        und Services mit PHP 5. ZF wurde durch Verwendung von 100% Objektorientiertem Code
-        implementiert. Die Komponenten Struktur von ZF ist einzigartig; jede Komponente wurde
-        entworfen mit wenig Anhängigkeiten zu anderen Komponenten. Diese lose gekoppelte
-        Architektur erlaubt es Entwicklern die Komponenten individuell zu verwenden. Wir nennen das
-        oft auch ein "use-at-will" Design.
+        Zend Framework ist ein Open Source Framework für die Entwicklung von Web Anwendungen
+        und Services mit PHP 5. Zend Framework wurde durch Verwendung von 100%
+        Objektorientiertem Code implementiert. Die Komponenten Struktur vom Zend Framework ist
+        einzigartig; jede Komponente wurde entworfen mit wenig Anhängigkeiten zu anderen
+        Komponenten. Diese lose gekoppelte Architektur erlaubt es Entwicklern die Komponenten
+        individuell zu verwenden. Wir nennen das oft auch ein "use-at-will" Design.
     </para>
     <para>
         Obwohl Sie separat verwendet werden können, formen die Zend Framework Komponenten in der
         Standard Bibliothek einen mächtigen und erweiterbaren Framework für Web Anwendungen wenn
-        Sie kombiniert werden. ZF bietet eine robuste, hoch performante MVC Implementation, eine
-        Datenbank Abstraktion die einfach zu verwenden ist, und eine Form Komponente die HTML Form
-        Darstellung, Prüfung und Filterung implementiert, damit Entwickler alle diese Operationen
-        konsolidieren können durch Verwendung eines einfach zu verwendenden, objekt-orientierten
-        Interfaces. Andere Komponenten wie <classname>Zend_Auth</classname> und
-        <classname>Zend_Acl</classname>, bieten Benutzer Authentifizierung und Authorisierung
-        gegenüber allen üblichen Arten von Zugangspunkten. Andere implementieren Client
-        Bibliotheken um einfach Zugang zu den am meisten üblichen Web Services verfügbar zu machen.
-        Was auch immer die eigene Anwendung benötigt, man findet eine Zend Framework Komponente mit
-        einer durchgehend getesteten Basis, die verwendet werden kann um die Entwicklungszeit
-        drastisch zu reduzieren.
+        Sie kombiniert werden. Zend Framework bietet eine robuste, hoch performante
+        <acronym>MVC</acronym> Implementation, eine Datenbank Abstraktion die einfach zu verwenden
+        ist, und eine Form Komponente die <acronym>HTML</acronym> Form Darstellung, Prüfung und
+        Filterung implementiert, damit Entwickler alle diese Operationen konsolidieren können durch
+        Verwendung eines einfach zu verwendenden, objekt-orientierten Interfaces. Andere
+        Komponenten wie <classname>Zend_Auth</classname> und <classname>Zend_Acl</classname>,
+        bieten Benutzer Authentifizierung und Authorisierung gegenüber allen üblichen Arten von
+        Zugangspunkten. Andere implementieren Client Bibliotheken um einfach Zugang zu den am
+        meisten üblichen Web Services verfügbar zu machen. Was auch immer die eigene Anwendung
+        benötigt, man findet eine Zend Framework Komponente mit einer durchgehend getesteten Basis,
+        die verwendet werden kann um die Entwicklungszeit drastisch zu reduzieren.
     </para>
     <para>
         Der prinzipielle Sponsor des Zend Framework Projektes ist
@@ -38,10 +38,11 @@
     </para>
     <para>
         Zend Framework könnte alle diese Features nicht ausliefern und supporten ohne die Hilfe
-        der lebhaften ZF Community. Community Mitglieder, einschließlich Entwicklern, sind selbst
-        erreichbar über <ulink url="http://framework.zend.com/archives">Mailing Listen</ulink>,
-        <ulink url="http://www.zftalk.com">IRC Kanälen</ulink>, und anderen Foren. Welche Frage
-        man auch immer über ZF hat, die Community ist immer da um diese zu beantworten.
+        der lebhaften Zend Framework Community. Community Mitglieder, einschließlich Entwicklern,
+        sind selbst erreichbar über <ulink
+            url="http://framework.zend.com/archives">Mailing Listen</ulink>, <ulink
+            url="http://www.zftalk.com">IRC Kanälen</ulink>, und anderen Foren. Welche Frage
+        man auch immer über Zend Framework hat, die Community ist immer da um diese zu beantworten.
     </para>
 </sect1>
 <!--

+ 39 - 34
documentation/manual/de/ref/performance-classloading.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 15617 -->
+<!-- EN-Revision: 16619 -->
 <!-- Reviewed: no -->
 <sect1 id="performance.classloading">
     <title>Laden von Klassen</title>
@@ -9,8 +9,8 @@
         feststellen das das Laden von Klassen relativ teuer ist im Zend Framework. Zwischen der
         reinen Anzahl von Klassendateien die für viele Komponenten geladen werden müssen, und der
         Verwendung von Plugins die keine 1:1 Verknüpfung zwischen Ihrem Klassennamen und dem
-        Dateisystem haben, können die Aufrufe zu <methodname>include_once</methodname> und
-        <methodname>require_once</methodname> problematisch sein. Diese Kapitel versucht einige
+        Dateisystem haben, können die Aufrufe zu <methodname>include_once()</methodname> und
+        <methodname>require_once()</methodname> problematisch sein. Diese Kapitel versucht einige
         konkrete Lösungen für diese Probleme zu geben.
     </para>
 
@@ -31,15 +31,17 @@
 
             <para>
                 Auch wenn das wie eine Mikro-Optimierung aussieht, ist es Fakt das wenn man es
-                nicht durchführt, die Vorteile von PHP's RealPath Cache sehr klein sind, und als
-                Ergebnis, das OpCode Caching nicht so schnell sein wird wie man erwarten könnte.
+                nicht durchführt, die Vorteile von <acronym>PHP</acronym>'s RealPath Cache sehr
+                klein sind, und als Ergebnis, das OpCode Caching nicht so schnell sein wird wie man
+                erwarten könnte.
             </para>
 
             <para>
                 Es gibt zwei einfache Wege um das Sicherzustellen. Erstens, kann man die Pfade in
-                der php.ini, httpd.conf, oder .htaccess Hardcoded hineinschreiben. Zweitens, kann
-                man PHP's <methodname>realpath()</methodname> Funktion verwendet wenn man den
-                include_path setzt:
+                der <filename>php.ini</filename>, <filename>httpd.conf</filename>, oder
+                <filename>.htaccess</filename> Hardcoded hineinschreiben. Zweitens, kann man
+                <acronym>PHP</acronym>'s <methodname>realpath()</methodname> Funktion verwendet
+                wenn man den include_path setzt:
             </para>
 
             <programlisting language="php"><![CDATA[
@@ -86,12 +88,12 @@ set_include_path(implode(PATH_SEPARATOR, $paths);
 
             <para>
                 Eine weitere Optimierung ist es Pfade zu kombinieren. Zum Beispiel folgt Zend
-                Framework der Namenskonvention von PEAR; deswegen kann man, wenn man PEAR
-                Bibliotheken verwendet (oder Bibliotheken von anderen Frameworks oder
-                Komponentenbibliotheken die dem PEAR CS folgen), versuchen alle diese Bibliotheken
-                in den gleichen include_path zu geben. Das kann oft durchgeführt werden indem etwas
-                einfaches wie ein SymLink auf eine oder mehrere Bibliotheken in ein generelles
-                Verzeichnis gelegt wird.
+                Framework der Namenskonvention von <acronym>PEAR</acronym>; deswegen kann man, wenn
+                man <acronym>PEAR</acronym> Bibliotheken verwendet (oder Bibliotheken von anderen
+                Frameworks oder Komponentenbibliotheken die dem <acronym>PEAR</acronym> CS folgen),
+                versuchen alle diese Bibliotheken in den gleichen include_path zu geben. Das kann
+                oft durchgeführt werden indem etwas einfaches wie ein SymLink auf eine oder mehrere
+                Bibliotheken in ein generelles Verzeichnis gelegt wird.
             </para>
         </sect3>
 
@@ -126,17 +128,17 @@ set_include_path(implode(PATH_SEPARATOR, $paths);
 
                 <para>
                     Fügen wir also alle diese Vorschläge zusammen. Unsere Annahme wird sein, das
-                    man ein oder mehrere PEAR Bibliotheken in Verbindung mit dem Zend Framework
-                    verwendet -- möglicherweise die PHPUnit und Archive_Tar Bibliotheken -- und
-                    das man offensichtlicherweise die Dateien relativ zur aktuellen Datei einfügen
-                    muß.
+                    man ein oder mehrere <acronym>PEAR</acronym> Bibliotheken in Verbindung mit dem
+                    Zend Framework verwendet -- möglicherweise die PHPUnit und
+                    <classname>Archive_Tar</classname> Bibliotheken -- und das man
+                    offensichtlicherweise die Dateien relativ zur aktuellen Datei einfügen muß.
                 </para>
 
                 <para>
                     Zuerst, erstellen wir ein Bibliotheksverzeichnis in unserem Projekt. Innerhalb
                     dieses Verzeichnisses, erstellen wir einen Symlink zu unserer Zend Framework
                     <filename>library/Zend</filename> Verzeichnis, wie auch dem notwendigen
-                    Verzeichnis von unserer PEAR Installation:
+                    Verzeichnis von unserer <acronym>PEAR</acronym> Installation:
                 </para>
 
                 <programlisting language="php"><![CDATA[
@@ -188,25 +190,27 @@ set_include_path(implode(PATH_SEPARATOR, $paths));
             des Ladens einer Klassendatei bis zum Letztmöglichen Moment zu verzögern -- bzw., wenn
             ein Objekt dieser Klasse instanziiert wird, wenn eine statische Klassenmethode
             aufgerufen wird, oder wenn auf eine Klassenkonstante oder statische Eigenschaft
-            referenziert wird. PHP unterstützt das durch Autoloading, welches es erlaubt ein oder
-            mehrere Callbacks zu definieren die in Reihenfolge aufgerufen werden um einen
-            Klassennamen mit einer Datei zu verbinden.
+            referenziert wird. <acronym>PHP</acronym> unterstützt das durch Autoloading, welches es
+            erlaubt ein oder mehrere Callbacks zu definieren die in Reihenfolge aufgerufen werden
+            um einen Klassennamen mit einer Datei zu verbinden.
         </para>
 
         <para>
             Trotzdem sind die meisten Vorteile man Autoloading erwarten könnte, hinfällig wenn der
-            Bibliothekscode weiterhin require_once Aufrufe durchführt -- was präzise der Fall ist
-            beim Zend Framework. Die Frage ist also: Wie kann man diese require_once Aufrufe
-            entfernen um die Geschwindigkeit vom Autoloader zu maximieren?
+            Bibliothekscode weiterhin <methodname>require_once()</methodname> Aufrufe durchführt --
+            was präzise der Fall ist beim Zend Framework. Die Frage ist also: Wie kann man diese
+            <methodname>require_once()</methodname> Aufrufe entfernen um die Geschwindigkeit vom
+            Autoloader zu maximieren?
         </para>
 
         <sect3 id="performance.classloading.striprequires.sed">
             <title>Aufrufe von require_once mit find und sed entfernen</title>
 
             <para>
-                Ein einfacher Weg um require_once Aufrufe zu entfernen ist die Verwendung der UNIX
-                Utilities 'find' und 'set' in Verbindung um jeden Aufruf auszukommentieren. Führe
-                die folgenden Anweisungen aus (wobei '%' der Shell Prompt ist):
+                Ein einfacher Weg um <methodname>require_once()</methodname> Aufrufe zu entfernen
+                ist die Verwendung der <acronym>UNIX</acronym> Utilities 'find' und 'set' in
+                Verbindung um jeden Aufruf auszukommentieren. Führe die folgenden Anweisungen aus
+                (wobei '%' der Shell Prompt ist):
             </para>
 
             <programlisting language="shell"><![CDATA[
@@ -217,8 +221,9 @@ set_include_path(implode(PATH_SEPARATOR, $paths));
 
             <para>
                 Dieser Ein-Zeiler (wegen der Lesbarkeit in zwei Zeilen gebrochen) geht durch jede
-                PHP Datei und sagt Ihr das jede Instanz von 'require_once' mit '// require_once'
-                ersetzt werden soll, was jede dieser Anweisungen effektiv auskommentiert.
+                <acronym>PHP</acronym> Datei und sagt Ihr das jede Instanz von 'require_once' mit
+                '// require_once' ersetzt werden soll, was jede dieser Anweisungen effektiv
+                auskommentiert.
             </para>
 
             <para>
@@ -307,10 +312,10 @@ Zend_Loader_Autoloader::getInstance();
 
             <para>
                 Zend Framework 1.7.0 fügt einen Include-File Cache zum PluginLoader hinzu. Diese
-                Funktionalität schreibt "include_once" Aufrufe in eine Datei, welche man dann in
-                der Bootstrap Datei einfügen (include) kann. Wärend das einen extra include_once
-                Aufruf im Code bedeutet, stellt es auch sicher das der PluginLoader so früh wie
-                möglich zurückkehrt.
+                Funktionalität schreibt "<methodname>include_once()</methodname>" Aufrufe in eine
+                Datei, welche man dann in der Bootstrap Datei einfügen (include) kann. Wärend das
+                einen extra <methodname>include_once()</methodname> Aufruf im Code bedeutet, stellt
+                es auch sicher das der PluginLoader so früh wie möglich zurückkehrt.
             </para>
 
             <para>