Translate example query documentation

Change-Id: I0578c2ffc4071b565e48dae5225dc12488bf8667
diff --git a/Changes b/Changes
index bf39da6..ecb78d3 100644
--- a/Changes
+++ b/Changes
@@ -1,7 +1,8 @@
-0.53 2024-02-27
+0.53 2024-03-14
         - Solve a potential timing issue in VC rendering. (diewald)
         - Update DeReKo link in corpus specific localization. (hebasta)
         - News and announcements are now displayed in Safari (fixes #208). (hebasta) 
+        - Translate example query documentation. (diewald)
 
 0.52 2023-11-29
         - Update Piwik dependency to point to matomo.js. (diewald)
diff --git a/Dockerfile b/Dockerfile
index 8c0da65..d4615f2 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -44,7 +44,7 @@
             curl && \
     set -o pipefail && \
     curl -L https://cpanmin.us | perl - App::cpanminus && \
-    cpanm https://github.com/Akron/Mojolicious-Plugin-Localize/archive/refs/tags/v0.21.tar.gz \
+    cpanm https://github.com/Akron/Mojolicious-Plugin-Localize/archive/refs/tags/v0.22.tar.gz \
           Cpanel::JSON::XS \
           EV \
           IO::Socket::Socks
diff --git a/Makefile.PL b/Makefile.PL
index 6039ff2..9717a58 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -42,7 +42,7 @@
     'Mojolicious::Plugin::Piwik' => 2.00,
 
     # Currently on GitHub only (github.com/akron)
-    'Mojolicious::Plugin::Localize' => 0.21
+    'Mojolicious::Plugin::Localize' => 0.22
   },
 
   META_MERGE   => {
diff --git a/kalamar.dict b/kalamar.dict
index 16c0a38..daf0698 100644
--- a/kalamar.dict
+++ b/kalamar.dict
@@ -78,6 +78,7 @@
       intro => 'de/intro',
       doc => {
         ql => {
+          '.' => 'de/doc/ql',
           'poliqarp-plus' => 'de/doc/ql/poliqarp-plus',
           'cosmas-2' => 'de/doc/ql/cosmas-2'
         },
@@ -207,6 +208,7 @@
       intro => 'intro',
       doc => {
         ql => {
+          '.' => 'doc/ql',
           'poliqarp-plus' => 'doc/ql/poliqarp-plus',
           'cosmas-2' => 'doc/ql/cosmas-2'
         },
diff --git a/t/doc.t b/t/doc.t
index b0f15c9..af5c2b0 100644
--- a/t/doc.t
+++ b/t/doc.t
@@ -12,7 +12,17 @@
 
 # Bug 2021-06-11
 $t->get_ok('/doc/ql/wildcards?cat=1')
-  ->status_is(404)
+  ->status_is(404) # ! Should be 404!
+  ;
+
+$t->get_ok('/doc/ql/')
+  ->status_is(200)
+  ->text_is('title','KorAP: Query Languages')
+  ;
+
+$t->get_ok('/doc/ql')
+  ->status_is(200)
+  ->text_is('title','KorAP: Query Languages')
   ;
 
 # Embedding
@@ -46,6 +56,16 @@
   ->status_is(200)
   ->text_is("title", "KorAP - Corpus Analysis Platform");
 
+$t->get_ok('/doc/ql/' => { 'Accept-Language' => 'de-DE, en-US, en' })
+  ->status_is(200)
+  ->text_is('title','KorAP: Anfragesprachen')
+  ->text_is('h3','Beispielanfragen')
+  ;
+
+$t->get_ok('/doc/ql' => { 'Accept-Language' => 'de-DE, en-US, en' })
+  ->status_is(200)
+  ->text_is('title','KorAP: Anfragesprachen')
+  ;
 
 # Pages
 $t->get_ok('/doc/ql/poliqarp-plus' => { 'Accept-Language' => 'en-US, en, de-DE' })
diff --git a/templates/de/doc/ql.html.ep b/templates/de/doc/ql.html.ep
new file mode 100644
index 0000000..4d79fa8
--- /dev/null
+++ b/templates/de/doc/ql.html.ep
@@ -0,0 +1,48 @@
+% layout 'main', title => 'KorAP: ' . loc('Nav_ql');
+
+%= page_title
+
+<p>
+  KorAP bietet für die Recherche mehrere Anfragesprachen an, wobei <%= embedded_link_to 'doc', 'Poliqarp', 'ql', 'poliqarp-plus' %>
+  derzeit die beste Unterstützung aufweist.
+  Poliqarp ist den Anfragesprachen der
+  <%= ext_link_to 'IMS Open Corpus Workbench (CWB)', "http://cwb.sourceforge.net/" %> und der
+  <%= ext_link_to 'SketchEngine', "https://www.sketchengine.eu/documentation/corpus-querying/" %> sehr ähnlich.
+  Die Sprache wurde ursprünglich für das
+  <%= ext_link_to 'Polnische National Korpus', "http://nkjp.pl/poliqarp/" %> entwickelt.
+</p>
+
+<section id="examples">
+  <h3>Beispielanfragen</h3>
+  
+  <p><strong><%= embedded_link_to 'doc', 'Poliqarp', 'ql', 'poliqarp-plus' %></strong>: Finde alle Vorkommen des Lemmas &quot;Baum&quot; (annotiert durch die <%= embedded_link_to 'doc', 'default foundry', 'data', 'annotation' %>).</p>
+  %= doc_query poliqarp => '[base=Baum]'
+
+  <p><strong><%= embedded_link_to 'doc', 'Poliqarp', 'ql', 'poliqarp-plus' %></strong>: Finde Adjektiv-Sequenzen (annotiert durch Treetagger), die eine Länge zwischen 3 und 5 Elementen haben.</p>
+  %= doc_query poliqarp => '[tt/p=ADJA]{3,5}'
+
+  <p><strong><%= embedded_link_to 'doc', 'Cosmas-II', 'ql', 'cosmas-2' %></strong>: Finde alle Vorkommen des Wortes &quot;der&quot; und des Wortes &quot;Baum&quot;, die in einem Abstand von maximal 5 Token zueinander stehen, wobei die Reihenfolge irrelevant ist.</p>
+  %= doc_query cosmas2 => 'der /w5 Baum'
+
+%#  <p><strong><%= embedded_link_to 'doc', 'Cosmas-II', 'ql', 'cosmas-2' %></strong>: Finde alle Vorkommen einer Wortfolge, dessen erstes Wort ein Adjektiv ist (annotiert durch Marmot), gefolgt von dem Wort &quot;Baum&quot; (wobei die Groß-/Kleinschreibung ignoriert werden kann). Zusätzlich soll diese Wortfolge innerhalb eines Satzes stehen (annotiert in der <%= embedded_link_to 'doc', 'default foundry', 'data', 'annotation' %>).</p>
+%#  <p><em>Bitte beachten</em>: Inkompatibilitäten von Anfragen mit anderen Systemen werden in Form von Warnungen ausgegeben.</p>
+%#  %= doc_query cosmas2 => 'MORPH(marmot/p=ADJA) $Baum #IN #ELEM(s)', cutoff => 1
+
+  <p><strong><%= embedded_link_to 'doc', 'Poliqarp+', 'ql', 'poliqarp-plus' %></strong>: Finde alle Nominalphrasen (annotiert von CoreNLP), die ein Adverb (annotiert von OpenNLP) enthalten, das von Treetagger als Wortart annotiert wurde, welche mit einem &quot;A&quot; beginnen muss (ausgedrückt durch einen regulären Ausdruck).</p>
+  %= doc_query poliqarp => 'contains(<corenlp/c=NP>,{[opennlp/p=ADV & tt/p="A.*"]})', cutoff => 1
+    
+  <p><strong><%= embedded_link_to 'doc', 'Poliqarp+', 'ql', 'poliqarp-plus' %></strong>: Finde alle Sätze (annotiert in der base foundry), die mit einer Wortfolge beginnen, die zunächst ein Wort im Präsens aufweist (annotiert durch Marmot) und von dem Lemma &quot;die&quot; (annotiert von der <%= embedded_link_to 'doc', 'default foundry', 'data', 'annotation' %>) gefolgt wird. Hebe beide Trefferwörter in unterschiedlichen Farben hervor.</p>
+  %= doc_query poliqarp => 'startswith(<base/s=s>, {1:[marmot/m=tense:pres]}{2:[base=die]})', cutoff => 1
+
+  <p><strong><%= embedded_link_to 'doc', 'Poliqarp+', 'ql', 'poliqarp-plus' %></strong>: Finde alle Wortfolgen eines Artikels, gefolgt von drei Adjektiven und einem Substantiv (alle annotiert von Treetagger), die einen Satz beenden (annotiert in der base foundry). Hebe alle Teile der Wortfolge farblich hervor.</p>
+  %= doc_query poliqarp => 'focus(3:endswith(<base/s=s>,{3:[tt/p=ART]{1:{2:[tt/p=ADJA]{3,4}}[tt/p=NN]}}))', cutoff => 1
+
+  <p><strong><%= embedded_link_to 'doc', 'Annis', 'ql', 'annis' %></strong>: Finde alle Vorkommen zweier aufeinanderfolgender Adverben (annotiert in der <%= embedded_link_to 'doc', 'default foundry', 'data', 'annotation' %>).</p>
+  %= doc_query annis => 'pos="ADV" & pos="ADV" & #1 . #2'
+
+  <p><strong><%= embedded_link_to 'doc', 'Annis', 'ql', 'annis' %></strong>: Finde alle Artikel, die von einem attributivem Possesivpronomen ausgehend (annotiert durch Treetagger) in einer Determiner-Relation (mit dem Label <code>DET</code> von Malt annotiert) stehen.</p>
+  %= doc_query annis => 'tt/p="PPOSAT" ->malt/d[func="DET"] node'
+
+  <p><strong><%= embedded_link_to 'doc', 'CQL', 'ql', 'cql' %></strong>: Finde alle Vorkommen der Wortfolge &quot;der alte Mann&quot;.</p>
+  %= doc_query cql => '"der alte Mann"'	
+</section>
diff --git a/templates/doc/ql.html.ep b/templates/doc/ql.html.ep
index c32453c..fe82e7a 100644
--- a/templates/doc/ql.html.ep
+++ b/templates/doc/ql.html.ep
@@ -27,9 +27,9 @@
   <p><strong><%= embedded_link_to 'doc', 'Cosmas-II', 'ql', 'cosmas-2' %></strong>: Find all occurrences of the words &quot;der&quot; and &quot;Baum&quot;, in case they are in a maximum distance of 5 tokens. The order is not relevant.</p>
   %= doc_query cosmas2 => 'der /w5 Baum'
 
-  <p><strong><%= embedded_link_to 'doc', 'Cosmas-II', 'ql', 'cosmas-2' %></strong>: Find all sequences of a word starting with a &quot;d&quot; (using a wildcard) followed by an adjective as annotated in the marmot foundry, followed by the word &quot;Baum&quot; (ignore the case), that is in a sentence element annotated by the <%= embedded_link_to 'doc', 'default foundry', 'data', 'annotation' %>.</p>
-  <p><em>Be aware</em>: Minor incompatibilities with implemented languages may be announced with warnings.</p>
-  %= doc_query cosmas2 => 'd* MORPH(marmot/p=ADJA) $Baum #IN #ELEM(s)'
+%#  <p><strong><%= embedded_link_to 'doc', 'Cosmas-II', 'ql', 'cosmas-2' %></strong>: Find all sequences of an adjective as annotated in the marmot foundry, followed by the word &quot;Baum&quot; (ignore the case), that is in a sentence element annotated by the <%= embedded_link_to 'doc', 'default foundry', 'data', 'annotation' %>.</p>
+%#  <p><em>Be aware</em>: Minor incompatibilities with implemented languages may be announced with warnings.</p>
+%#  %= doc_query cosmas2 => 'MORPH(marmot/p=ADJA) $Baum #IN #ELEM(s)', cutoff => 1
 
   <p><strong><%= embedded_link_to 'doc', 'Poliqarp+', 'ql', 'poliqarp-plus' %></strong>: Find all nominal phrases as annotated using CoreNLP, that contain an adverb as annotated by OpenNLP, that is annotated as something starting with an &quot;A&quot; using regular expressions in Treetagger.</p>
   %= doc_query poliqarp => 'contains(<corenlp/c=NP>,{[opennlp/p=ADV & tt/p="A.*"]})', cutoff => 1