Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 42298d2c

Von Moritz Bunkus vor mehr als 5 Jahren hinzugefügt

  • ID 42298d2ceb5206a3d8df0a5cd9989eff5ebb843e
  • Vorgänger 60b17b30
  • Nachfolger 822f5cf7

Dokumentation: HTML & PDF gebaut

Unterschiede anzeigen:

doc/html/ch04s04.html
1 1
<html><head>
2 2
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
3
   <title>4.4. Translations and languages</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.3: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch04.html" title="Kapitel 4. Entwicklerdokumentation"><link rel="prev" href="ch04s03.html" title="4.3. SQL-Upgradedateien"><link rel="next" href="ch04s05.html" title="4.5. Die kivitendo-Test-Suite"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">4.4. Translations and languages</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s03.html">Zurück</a>&nbsp;</td><th width="60%" align="center">Kapitel 4. Entwicklerdokumentation</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch04s05.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="4.4. Translations and languages"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="translations-languages"></a>4.4. Translations and languages</h2></div></div></div><div class="sect2" title="4.4.1. Introduction"><div class="titlepage"><div><div><h3 class="title"><a name="translations-languages.introduction"></a>4.4.1. Introduction</h3></div></div></div><div class="note" title="Anmerkung" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Anmerkung]" src="system/docbook-xsl/images/note.png"></td><th align="left">Anmerkung</th></tr><tr><td align="left" valign="top"><p>Dieser Abschnitt ist in Englisch geschrieben, um
4
          internationalen Übersetzern die Arbeit zu erleichtern.</p></td></tr></table></div><p>This section describes how localization packages in kivitendo
5
        are built. Currently the only language fully supported is German, and
6
        since most of the internal messages are held in English the English
7
        version is usable too.</p></div><div class="sect2" title="4.4.2. Character set"><div class="titlepage"><div><div><h3 class="title"><a name="translations-languages.character-set"></a>4.4.2. Character set</h3></div></div></div><p>All files included in a language pack must use UTF-8 as their
8
        encoding.</p></div><div class="sect2" title="4.4.3. File structure"><div class="titlepage"><div><div><h3 class="title"><a name="translations-languages.file-structure"></a>4.4.3. File structure</h3></div></div></div><p>The structure of locales in kivitendo is:</p><pre class="programlisting">kivitendo/locale/&lt;langcode&gt;/</pre><p>where &lt;langcode&gt; stands for an abbreviation of the
9
        language package. The builtin packages use two letter <a class="ulink" href="http://en.wikipedia.org/wiki/ISO_639-1" target="_top">ISO 639-1</a> codes,
10
        but the actual name is not relevant for the program and can easily be
11
        extended to <a class="ulink" href="http://en.wikipedia.org/wiki/IETF_language_tag" target="_top">IETF language
12
        tags</a> (i.e. "en_GB"). In fact the original language packages
13
        from SQL Ledger are named in this way.</p><p>In such a language directory the following files are
14
        recognized:</p><div class="variablelist"><dl><dt><span class="term">LANGUAGE</span></dt><dd><p>This file is mandatory.</p><p>The <code class="filename">LANGUAGE</code> file contains the self
15
              descripted name of the language. It should contain a native
16
              representation first, and in parenthesis an english translation
17
              after that. Example:</p><pre class="programlisting">Deutsch (German)</pre></dd><dt><span class="term">all</span></dt><dd><p>This file is mandatory.</p><p>The central translation file. It is essentially an inline
18
              Perl script autogenerated by <span class="command"><strong>locales.pl</strong></span>. To
19
              generate it, generate the directory and the two files mentioned
20
              above, and execute the following command:</p><pre class="programlisting">scripts/locales.pl &lt;langcode&gt;</pre><p>Otherwise you can simply copy one of the other languages.
21
              You will be told how many are missing like this:</p><pre class="programlisting">$ scripts/locales.pl en
22
English - 0.6% - 2015/2028 missing</pre><p>A file named "<code class="filename">missing</code>" will be
23
              generated and can be edited. You can also edit the
24
              "<code class="filename">all</code>" file directly. Edit everything you
25
              like to fit the target language and execute
26
              <span class="command"><strong>locales.pl</strong></span> again. See how the missing words
27
              get fewer.</p></dd><dt><span class="term">Num2text</span></dt><dd><p>Legacy code from SQL Ledger. It provides a means for
28
              numbers to be converted into natural language, like
29
              <code class="literal">1523 =&gt; one thousand five hundred twenty
30
              three</code>. If you want to provide it, it must be inlinable
31
              Perl code which provides a <code class="function">num2text</code> sub. If
32
              an <code class="function">init</code> sub exists it will be executed
33
              first.</p><p>Only used in the check and receipt printing module.</p></dd><dt><span class="term">special_chars</span></dt><dd><p>kivitendo comes with a lot of interfaces to different
34
              formats, some of which are rather picky with their accepted
35
              charset. The <code class="filename">special_chars</code> file contains a
36
              listing of chars not suited for different file format and
37
              provides substitutions. It is written in "Simple Ini" style,
38
              containing a block for every file format.</p><p>First entry should be the order of substitution for
39
              entries as a whitespace separated list. All entries are
40
              interpolated, so <code class="literal">\n</code>, <code class="literal">\x20</code>
41
              and <code class="literal">\\</code> all work.</p><p>After that every entry is a special char that should be
42
              translated when writing text into such a file.</p><p>Example:</p><pre class="programlisting">[Template/XML]
43
order=&amp; &lt; &gt; \n
44
&amp;=&amp;amp;
45
&lt;=&amp;lt;
46
&gt;=&amp;gt;
47
\n=&lt;br&gt;</pre><p>Note the importance of the order in this example.
48
              Substituting &lt; and &gt; befor &amp; would lead to $gt; become
49
              &amp;amp;gt;</p><p>For a list of valid formats, see the German
50
              <code class="filename">special_chars</code> entry. As of this writing the
51
              following are recognized:</p><pre class="programlisting">HTML
52
URL@HTML
53
Template/HTML
54
Template/XML
55
Template/LaTeX
56
Template/OpenDocument
57
filenames</pre><p>The last of which is very machine dependant. Remember that
58
              a lot of characters are forbidden by some filesystems, for
59
              example MS Windows doesn't like ':' in its files where Linux
60
              doesn't mind that. If you want the files created with your
61
              language pack to be portable, find all chars that could cause
62
              trouble.</p></dd><dt><span class="term">missing</span></dt><dd><p>This file is not a part of the language package
63
              itself.</p><p>This is a file generated by
64
              <span class="command"><strong>scripts/locales.pl</strong></span> while processing your
65
              locales. It's only to have the missing entries singled out and
66
              does not belong to a language package.</p></dd><dt><span class="term">lost</span></dt><dd><p>This file is not a part of the language package
67
              itself.</p><p>Another file generated by
68
              <span class="command"><strong>scripts/locales.pl</strong></span>. If for any reason a
69
              translation does not appear anymore and can be deleted, it gets
70
              moved here. The last 50 or so entries deleted are saved here in
71
              case you made a typo, so that you don't have to translate
72
              everything again. If a tranlsation is missing, the lost file is
73
              checked first. If you maintain a language package, you might
74
              want to keep this safe somewhere.</p></dd><dt><span class="term">more/all</span></dt><dd><p>This subdir and file is not a part of the language package
75
              itself.</p><p>If the directory more exists and contains a file called
76
              all it will be parsed in addition to the mandatory all (see
77
              above). The file is useful if you want to change some
78
              translations for the current installation without conflicting
79
              further upgrades. The file is not autogenerated and has the same
80
              format as the all, but needs another key (more_texts). See the
81
              german translation for an example or copy the following code:
82
              </p><pre class="programlisting">
83
#!/usr/bin/perl
84
# -*- coding: utf-8; -*-
85
# vim: fenc=utf-8
3
   <title>4.4. SQL-Upgradedateien</title><link rel="stylesheet" type="text/css" href="style.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.1-RC2"><link rel="home" href="index.html" title="kivitendo 3.5.3: Installation, Konfiguration, Entwicklung"><link rel="up" href="ch04.html" title="Kapitel 4. Entwicklerdokumentation"><link rel="prev" href="ch04s03.html" title="4.3. Programmatische API-Aufrufe"><link rel="next" href="ch04s05.html" title="4.5. Translations and languages"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">4.4. SQL-Upgradedateien</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s03.html">Zurück</a>&nbsp;</td><th width="60%" align="center">Kapitel 4. Entwicklerdokumentation</th><td width="20%" align="right">&nbsp;<a accesskey="n" href="ch04s05.html">Weiter</a></td></tr></table><hr></div><div class="sect1" title="4.4. SQL-Upgradedateien"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="db-upgrade-files"></a>4.4. SQL-Upgradedateien</h2></div></div></div><div class="sect2" title="4.4.1. Einführung"><div class="titlepage"><div><div><h3 class="title"><a name="db-upgrade-files.introduction"></a>4.4.1. Einführung</h3></div></div></div><p>Datenbankupgrades werden über einzelne Upgrade-Scripte
4
        gesteuert, die sich im Verzeichnis
5
        <code class="filename">sql/Pg-upgrade2</code> befinden. In diesem Verzeichnis
6
        muss pro Datenbankupgrade eine Datei existieren, die neben den
7
        eigentlich auszuführenden SQL- oder Perl-Befehlen einige
8
        Kontrollinformationen enthält.</p><p>Kontrollinformationen definieren Abhängigkeiten und Prioritäten,
9
        sodass Datenbankscripte zwar in einer sicheren Reihenfolge ausgeführt
10
        werden (z.B. darf ein <code class="literal">ALTER TABLE</code> erst ausgeführt
11
        werden, wenn die Tabelle mit <code class="literal">CREATE TABLE</code> angelegt
12
        wurde), diese Reihenfolge aber so flexibel ist, dass man keine
13
        Versionsnummern braucht.</p><p>kivitendo merkt sich dabei, welches der Upgradescripte in
14
        <code class="filename">sql/Pg-upgrade2</code> bereits durchgeführt wurde und
15
        führt diese nicht erneut aus. Dazu dient die Tabelle
16
        "<code class="literal">schema_info</code>", die bei der Anmeldung automatisch
17
        angelegt wird.</p></div><div class="sect2" title="4.4.2. Format der Kontrollinformationen"><div class="titlepage"><div><div><h3 class="title"><a name="db-upgrade-files.format"></a>4.4.2. Format der Kontrollinformationen</h3></div></div></div><p>Die Kontrollinformationen sollten sich am Anfang der jeweiligen
18
        Upgradedatei befinden. Jede Zeile, die Kontrollinformationen enthält,
19
        hat dabei das folgende Format:</p><p>Für SQL-Upgradedateien:</p><pre class="programlisting">-- @key: value</pre><p>Für Perl-Upgradedateien:</p><pre class="programlisting"># @key: value</pre><p>Leerzeichen vor "<code class="varname">value</code>" werden
20
        entfernt.</p><p>Die folgenden Schlüsselworte werden verarbeitet:</p><div class="variablelist"><dl><dt><span class="term">
21
                     <code class="varname">tag</code>
22
                  </span></dt><dd><p>Wird zwingend benötigt. Dies ist der "Name" des Upgrades.
23
              Dieser "tag" kann von anderen Kontrolldateien in ihren
24
              Abhängigkeiten verwendet werden (Schlüsselwort
25
              "<code class="varname">depends</code>"). Der "tag" ist auch der Name, der
26
              in der Datenbank eingetragen wird.</p><p>Normalerweise sollte die Kontrolldatei genau so heißen wie
27
              der "tag", nur mit der Endung ".sql" bzw. "pl".</p><p>Ein Tag darf nur aus alphanumerischen Zeichen sowie den
28
              Zeichen _ - ( ) bestehen. Insbesondere sind Leerzeichen nicht
29
              erlaubt und sollten stattdessen mit Unterstrichen ersetzt
30
              werden.</p></dd><dt><span class="term">
31
                     <code class="varname">charset</code>
32
                  </span></dt><dd><p>Empfohlen. Gibt den Zeichensatz an, in dem das Script
33
              geschrieben wurde, z.B. "<code class="literal">UTF-8</code>". Aus
34
              Kompatibilitätsgründen mit alten Upgrade-Scripten wird bei
35
              Abwesenheit des Tags für SQL-Upgradedateien der Zeichensatz
36
              "<code class="literal">ISO-8859-15</code>" angenommen. Perl-Upgradescripte
37
              hingegen müssen immer in UTF-8 encodiert sein und sollten
38
              demnach auch ein "<code class="literal">use utf8;</code>"
39
              enthalten.</p></dd><dt><span class="term">
40
                     <code class="varname">description</code>
41
                  </span></dt><dd><p>Benötigt. Eine Beschreibung, was in diesem Update
42
              passiert. Diese wird dem Benutzer beim eigentlichen
43
              Datenbankupdate angezeigt. Während der Tag in Englisch gehalten
44
              sein sollte, sollte die Beschreibung auf Deutsch
45
              erfolgen.</p></dd><dt><span class="term">
46
                     <code class="varname">depends</code>
47
                  </span></dt><dd><p>Optional. Eine mit Leerzeichen getrennte Liste von "tags",
48
              von denen dieses Upgradescript abhängt. kivitendo stellt sicher,
49
              dass die in dieser Liste aufgeführten Scripte bereits
50
              durchgeführt wurden, bevor dieses Script ausgeführt wird.</p><p>Abhängigkeiten werden rekursiv betrachtet. Wenn also ein
51
              Script "b" existiert, das von Änderungen in "a" abhängt, und
52
              eine neue Kontrolldatei für "c" erstellt wird, die von
53
              Änderungen in "a" und "b" abhängt, so genügt es, in "c" nur den
54
              Tag "b" als Abhängigkeit zu definieren.</p><p>Es ist nicht erlaubt, sich selbst referenzierende
55
              Abhängigkeiten zu definieren (z.B. "a" -&gt; "b", "b" -&gt; "c"
56
              und "c" -&gt; "a").</p></dd><dt><span class="term">
57
                     <code class="varname">priority</code>
58
                  </span></dt><dd><p>Optional. Ein Zahlenwert, der die Reihenfolge bestimmt, in
59
              der Scripte ausgeführt werden, die die gleichen
60
              Abhängigkeitstiefen besitzen. Fehlt dieser Parameter, so wird
61
              der Wert 1000 benutzt.</p><p>Dies ist reine Kosmetik. Für echte Reihenfolgen muss
62
              "depends" benutzt werden. kivitendo sortiert die auszuführenden
63
              Scripte zuerst nach der Abhängigkeitstiefe (wenn "z" von "y"
64
              abhängt und "y" von "x", so hat "z" eine Abhängigkeitstiefe von
65
              2, "y" von 1 und "x" von 0. "x" würde hier zuerst ausgeführt,
66
              dann "y", dann "z"), dann nach der Priorität und bei gleicher
67
              Priorität alphabetisch nach dem "tag".</p></dd><dt><span class="term">
68
                     <code class="varname">ignore</code>
69
                  </span></dt><dd><p>Optional. Falls der Wert auf 1 (true) steht, wird das
70
              Skript bei der Anmeldung ignoriert und entsprechend nicht
71
              ausgeführt.</p></dd></dl></div></div><div class="sect2" title="4.4.3. Format von in Perl geschriebenen Datenbankupgradescripten"><div class="titlepage"><div><div><h3 class="title"><a name="db-upgrade-files.format-perl-files"></a>4.4.3. Format von in Perl geschriebenen
72
        Datenbankupgradescripten</h3></div></div></div><p>In Perl geschriebene Datenbankscripte werden nicht einfach so
73
        ausgeführt sondern müssen sich an gewisse Konventionen halten. Dafür
74
        bekommen sie aber auch einige Komfortfunktionen bereitgestellt.</p><p>Ein Upgradescript stellt dabei eine vollständige Objektklasse
75
        dar, die vom Elternobjekt "<code class="literal">SL::DBUpgrade2::Base</code>"
76
        erben und eine Funktion namens "<code class="literal">run</code>" zur Verfügung
77
        stellen muss. Das Script wird ausgeführt, indem eine Instanz dieser
78
        Klasse erzeugt und darauf die erwähnte "<code class="literal">run</code>"
79
        aufgerufen wird.</p><p>Zu beachten ist, dass sich der Paketname der Datei aus dem Wert
80
        für "<code class="literal">@tag</code>" ableitet. Dabei werden alle Zeichen, die
81
        in Paketnamen ungültig wären (gerade Bindestriche), durch Unterstriche
82
        ersetzt. Insgesamt sieht der Paketname wie folgt aus:
83
        "<code class="literal">SL::DBUpgrade2::tag</code>".</p><p>Welche Komfortfunktionen zur Verfügung stehen, erfahren Sie in
84
        der Perl-Dokumentation zum oben genannten Modul; aufzurufen mit
85
        "<span class="command"><strong>perldoc SL/DBUpgrade2/Base.pm</strong></span>".</p><p>Ein Mindestgerüst eines gültigen Perl-Upgradescriptes sieht wie
86
        folgt aus:</p><pre class="programlisting"># @tag: beispiel-upgrade-file42
87
# @description: Ein schönes Beispielscript
88
# @depends: release_3_1_0
89
package SL::DBUpgrade2::beispiel_upgrade_file42;
86 90

  
91
use strict;
87 92
use utf8;
88 93

  
89
# These are additional texts for custom translations.
90
# The format is the same as for the normal file all, only
91
# with another key (more_texts instead of texts).
92
# The file has the form of 'english text'  =&gt; 'foreign text',
94
use parent qw(SL::DBUpgrade2::Base);
93 95

  
94
$self-&gt;{more_texts} = {
96
sub run {
97
  my ($self) = @_;
95 98

  
96
  'Ship via'                    =&gt; 'Terms of delivery',
97
  'Shipping Point'              =&gt; 'Delivery time',
99
  # hier Aktionen ausführen
100

  
101
  return 1;
98 102
}
99
              </pre><p>
100
                     </p></dd></dl></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch04s03.html">Zurück</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch04.html">Nach oben</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch04s05.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">4.3. SQL-Upgradedateien&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Zum Anfang</a></td><td width="40%" align="right" valign="top">&nbsp;4.5. Die kivitendo-Test-Suite</td></tr></table></div></body></html>
103

  
104
1;
105
</pre></div><div class="sect2" title="4.4.4. Hilfsscript dbupgrade2_tool.pl"><div class="titlepage"><div><div><h3 class="title"><a name="db-upgrade-files.dbupgrade-tool"></a>4.4.4. Hilfsscript dbupgrade2_tool.pl</h3></div></div></div><p>Um die Arbeit mit den Abhängigkeiten etwas zu erleichtern,
106
        existiert ein Hilfsscript namens
107
        "<code class="filename">scripts/dbupgrade2_tool.pl</code>". Es muss aus dem
108
        kivitendo-ERP-Basisverzeichnis heraus aufgerufen werden. Dieses Tool
109
        liest alle Datenbankupgradescripte aus dem Verzeichnis
110
        <code class="filename">sql/Pg-upgrade2</code> aus. Es benutzt dafür die
111
        gleichen Methoden wie kivitendo selber, sodass alle Fehlersituationen
112
        von der Kommandozeile überprüft werden können.</p><p>Wird dem Script kein weiterer Parameter übergeben, so wird nur
113
        eine Überprüfung der Felder und Abhängigkeiten vorgenommen. Man kann
114
        sich aber auch Informationen auf verschiedene Art ausgeben
115
        lassen:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Listenform: "<span class="command"><strong>./scripts/dbupgrade2_tool.pl
116
            --list</strong></span>"</p><p>Gibt eine Liste aller Scripte aus. Die Liste ist in der
117
            Reihenfolge sortiert, in der kivitendo die Scripte ausführen
118
            würde. Es werden neben der Listenposition der Tag, die
119
            Abhängigkeitstiefe und die Priorität ausgegeben.</p></li><li class="listitem"><p>Baumform: "<span class="command"><strong>./scripts/dbupgrade2_tool.pl
120
            --tree</strong></span>"</p><p>Listet alle Tags in Baumform basierend auf den
121
            Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte, von
122
            denen keine anderen abhängen. Die Unterknoten sind Scripte, die
123
            beim übergeordneten Script als Abhängigkeit eingetragen
124
            sind.</p></li><li class="listitem"><p><a name="db-upgrade-files.dbupgrade-tool.reverse-tree"></a>Umgekehrte Baumform: "<span class="command"><strong>./scripts/dbupgrade2_tool.pl
125
            --rtree</strong></span>"</p><p>Listet alle Tags in Baumform basierend auf den
126
            Abhängigkeiten auf. Die "Wurzelknoten" sind dabei die Scripte mit
127
            der geringsten Abhängigkeitstiefe. Die Unterknoten sind Scripte,
128
            die das übergeordnete Script als Abhängigkeit eingetragen
129
            haben.</p></li><li class="listitem"><p>Baumform mit Postscriptausgabe:
130
            "<span class="command"><strong>./scripts/dbupgrade2_tool.pl
131
            --graphviz</strong></span>"</p><p>Benötigt das Tool "<span class="command"><strong>graphviz</strong></span>", um mit
132
            seiner Hilfe die <a class="link" href="ch04s04.html#db-upgrade-files.dbupgrade-tool.reverse-tree">umgekehrte
133
            Baumform</a> in eine Postscriptdatei namens
134
            "<code class="filename">db_dependencies.ps</code>" auszugeben. Dies ist
135
            vermutlich die übersichtlichste Form, weil hierbei jeder Knoten
136
            nur einmal ausgegeben wird. Bei den Textmodusbaumformen hingegen
137
            können Knoten und all ihre Abhängigkeiten mehrfach ausgegeben
138
            werden.</p></li><li class="listitem"><p>Scripte, von denen kein anderes Script abhängt:
139
            "<span class="command"><strong>./scripts/dbupgrade2_tool.pl --nodeps</strong></span>"</p><p>Listet die Tags aller Scripte auf, von denen keine anderen
140
            Scripte abhängen.</p></li></ul></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch04s03.html">Zurück</a>&nbsp;</td><td width="20%" align="center"><a accesskey="u" href="ch04.html">Nach oben</a></td><td width="40%" align="right">&nbsp;<a accesskey="n" href="ch04s05.html">Weiter</a></td></tr><tr><td width="40%" align="left" valign="top">4.3. Programmatische API-Aufrufe&nbsp;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Zum Anfang</a></td><td width="40%" align="right" valign="top">&nbsp;4.5. Translations and languages</td></tr></table></div></body></html>

Auch abrufbar als: Unified diff