| # Based on Mojolicious::Plugin::Number::Commify | 
 | my $THOUSAND_SEP_RE = qr/( | 
 |   ^[-+]?           # beginning of number. | 
 |   \d+?             # first digits before first comma | 
 |   (?=              # followed by, (but not included in the match) : | 
 |     (?>(?:\d{3})+) # some positive multiple of three digits. | 
 |     (?!\d)         # an *exact* multiple, not x * 3 + 1 or whatever. | 
 |   )|               # or: | 
 |   \G\d{3}          # after the last group, get three digits | 
 |   (?=\d)           # but they have to have more digits after them. | 
 | )/x; | 
 |  | 
 | { | 
 |   _ => sub { $_->locale }, | 
 |   de => { | 
 |     numf => sub { | 
 |       shift; | 
 |       my %val = @_; | 
 |       my $num = $val{number} or return 0; | 
 |       $num =~ s/$THOUSAND_SEP_RE/$1\./g; | 
 |       return $num; | 
 |     }, | 
 |     numo => sub { | 
 |       shift; | 
 |       my %val = @_; | 
 |       my $day = $val{day} or return ''; | 
 |         return $day . '.'; | 
 |     }, | 
 |     about => 'Über KorAP', | 
 |     login => 'Anmelden', | 
 |     logout => 'Abmelden', | 
 |     register => 'Registrieren', | 
 |     pwdforgotten => 'Password vergessen?', | 
 |     # TODO: use document.write() refering to vc.getName()! | 
 |     searchjob => '»<%== $q %>« <% if (param("collection")) { %>im definierten Korpus <% } %>mit <%== loc("QL_" . $ql, "unbekannter Anfragesprache") %>', | 
 |     searchtitle => '<%= loc("en_korap_label") %>: Finde <%== loc("searchjob") %>', | 
 |     searchplaceholder => 'Finde ...', | 
 |     go => 'Los!', | 
 |     news => 'Neuigkeiten', | 
 |     in => 'in', | 
 |     by => 'von', | 
 |     page => { | 
 |       -sg => 'S.', | 
 |       pl => 'S.' | 
 |     }, | 
 |     pwd => 'Passwort', | 
 |     email => 'Email', | 
 |     username => 'Benutzername', | 
 |     upload => 'Hochladen', | 
 |     userormail => 'Benutzername oder Email', | 
 |     with => 'mit', | 
 |     glimpse => { | 
 |       desc => 'Zeige nur die ersten Treffer in beliebiger Reihenfolge' | 
 |     }, | 
 |     activateJS => 'Für den vollen Funktionsumfang aktivieren Sie bitte JavaScript!', | 
 |     faq => 'FAQ', | 
 |     tutorial => 'Hilfe', | 
 |     tour => 'Tour', | 
 |     notAvailInCorpus => 'Im vorliegenden Korpus nicht verfügbar', | 
 |     pubOn => 'veröffentlicht am', | 
 |     matchCount => 'Treffer', | 
 |     noMatches => 'Es wurden keine Treffer für <%== loc("searchjob") %> gefunden.', | 
 |     moreMatches => { | 
 |       -short => 'mehr als', | 
 |       long => 'Dieser Wert gibt die Mindestanzahl an Treffern wieder. Die tatsächliche Trefferanzahl kann aufgrund von Sucheinschränkungen nicht angezeigt werden.', | 
 |     }, | 
 |     notFound => '404 - Seite nicht gefunden', | 
 |     notIssued => 'Die Aktion konnte nicht durchgeführt werden.', | 
 |     backendNotAvailable => 'Das Backend ist nicht verfügbar unter <code><%= app->korap->api =></code>!', | 
 |     jsFile => 'kalamar-<%= $Kalamar::VERSION %>-de.js', | 
 |     underConstruction => 'In Vorbereitung!', | 
 |     korap => { | 
 |       -short => 'KorAP', | 
 |       desc => '<%= loc "en_korap_label" %> - Korpusanalyseplattform der nächsten Generation', | 
 |       overview => '<%= loc "en_korap_label" %> - Übersicht', | 
 |       keywords => 'KorAP, DeReKo, Korpussuche, IDS Mannheim, Leibniz-Institut für Deutsche Sprache', | 
 |     }, | 
 |     privacy => 'Datenschutz', | 
 |     imprint => 'Impressum', | 
 |     settings => 'Einstellungen', | 
 |     'oclock' => 'Uhr', | 
 |     maintenanceWork => { | 
 |       time => 'Wartungsfenster', | 
 |       desc => 'Aufgrund von Wartungsarbeiten wird es zu Unterbrechungen des Dienstes kommen.', | 
 |     }, | 
 |     Template => { | 
 |       intro => 'de/intro', | 
 |       doc => { | 
 |         ql => { | 
 |           '.' => 'de/doc/ql', | 
 |           'poliqarp-plus' => 'de/doc/ql/poliqarp-plus', | 
 |           'cosmas-2' => 'de/doc/ql/cosmas-2', | 
 |           'regexp' => 'de/doc/ql/regexp', | 
 |           'fcsql' => 'de/doc/ql/fcsql', | 
 |           'cql' => 'de/doc/ql/cql', | 
 |           'annis' => 'de/doc/ql/annis' | 
 |         }, | 
 |         api => { | 
 |           'koralquery' => 'de/doc/api/koralquery' | 
 |         }, | 
 |         data => { | 
 |           'annotation' => 'de/doc/data/annotation' | 
 |         }, | 
 |         development => { | 
 |           'kalamar' => 'de/doc/development/kalamar', | 
 |           'karang' => 'de/doc/development/karang', | 
 |           'koral' => 'de/doc/development/koral', | 
 |           'krill' => 'de/doc/development/krill', | 
 |           'kustvakt' => 'de/doc/development/kustvakt' | 
 |         } | 
 |       } | 
 |     }, | 
 |     Nav => { | 
 |       'ql' => 'Anfragesprachen', | 
 |       '#queryterms' => 'Suchbegriffe', | 
 |       '#logical-operators' => 'Logische Operatoren', | 
 |       '#distance-operators' =>  'Abstandsoperatoren', | 
 |       '#annotation-operators' =>  'Annotationsoperatoren', | 
 |       '#combination-operators'=>  'Kombinationsoperatoren', | 
 |       '#area-operators' =>  'Textbereich-Operatoren', | 
 |       '#segments' => 'Einfache Segmente', | 
 |       '#complex' => 'Komplexe Segmente', | 
 |       '#spans' => 'Span-Segmente', | 
 |       '#paradigmatic-operators' => 'Paradigmatische Operatoren', | 
 |       '#syntagmatic-operators' => 'Syntagmatische Operatoren', | 
 |       '#class-operators' => 'Klassen-Operatoren', | 
 |       'regexp' => 'Reguläre Ausdrücke', | 
 |       'data' => 'Korpusdaten', | 
 |       'corpus' => 'Korpora', | 
 |       'annotation' => 'Annotationen', | 
 |       '#default-foundries' => 'Standard Foundries', | 
 |       'development' => 'Entwicklung', | 
 |       'faq' => 'FAQ', | 
 |     }, | 
 |     QL => { | 
 |       cqp => 'CQP (neu)' | 
 |     } | 
 |   }, | 
 |   -en => { | 
 |     jsFile => 'kalamar-<%= $Kalamar::VERSION %>-en.js', | 
 |     numf => sub { | 
 |       shift; | 
 |       my %val = @_; | 
 |       my $num = $val{number} or return 0; | 
 |       $num =~ s/$THOUSAND_SEP_RE/$1\,/g; | 
 |       return $num; | 
 |     }, | 
 |     numo => sub { | 
 |       shift; | 
 |       my %val = @_; | 
 |       my $day = $val{day} or return ''; | 
 |       if ($day > 3) { | 
 |         return $day . 'th'; | 
 |       } elsif ($day == 3) { | 
 |         return '3rd'; | 
 |       } elsif ($day == 2) { | 
 |         return '2nd'; | 
 |       }; | 
 |       return '1st'; | 
 |     }, | 
 |     about => 'About KorAP', | 
 |     login => 'Login', | 
 |     logout => 'Logout', | 
 |     register => 'Register', | 
 |     pwdforgotten => 'Password forgotten?', | 
 |     go => 'Go!', | 
 |     news => 'News', | 
 |     # TODO: use document.write() refering to vc.getName()! | 
 |     searchjob => '»<%== $q %>« <% if (param("collection")) { %>in the defined corpus <% } %>with <%== loc("QL_". $ql, "unknown query language") %>', | 
 |     searchtitle => '<%= loc("korap_label") %>: Find <%== loc("searchjob") %>', | 
 |     searchplaceholder => 'Find ...', | 
 |     in => 'in', | 
 |     by => 'by', | 
 |     page => { | 
 |       -sg => 'p.', | 
 |       pl  => 'pp.', | 
 |     }, | 
 |     pwd => 'Password', | 
 |     email => 'Email', | 
 |     username => 'Username', | 
 |     upload => 'Upload', | 
 |     userormail => 'Username or Email', | 
 |     with => 'with', | 
 |     notAvailInCorpus => 'Not available in the current corpus', | 
 |     pubOn => 'published on', | 
 |     matchCount => '<%= quant($found, "match", "matches") %>', | 
 |     noMatches => 'There were no matches found for <%== loc("searchjob") %>.', | 
 |     moreMatches => { | 
 |       -short => 'more than', | 
 |       long => 'This value represents the minimum number of matches in the database. The exact number cannot be displayed due to search restrictions.', | 
 |     }, | 
 |  | 
 |     notFound => '404 - Page not found', | 
 |     notIssued => 'Unable to perform the action.', | 
 |     backendNotAvailable => 'The backend is not available at <code><%= app->korap->api %></code>!', | 
 |     glimpse => { | 
 |       -short => 'Glimpse', | 
 |       desc => 'Just show the first matches in arbitrary order' | 
 |     }, | 
 |     activateJS => 'To make use of all features, please activate JavaScript!', | 
 |     faq => 'FAQ', | 
 |     'oclock' => 'o\'clock', | 
 |     underConstruction => 'Under Construction!', | 
 |     tutorial => 'Help', | 
 |     tour => 'Tour', | 
 |     korap => { | 
 |       -short => 'KorAP', | 
 |       label => '<%= loc "korap_short" %><% if (loc("title_addon")) { %>-<%= loc("title_addon") %><% } %>', | 
 |       desc => '<%= loc "korap_label" %> - Corpus Analysis Platform', | 
 |       overview => '<%= loc "korap_label" %> - Overview', | 
 |       region => 'DE-BW', | 
 |       placename => 'Mannheim', | 
 |       keywords => 'KorAP, DeReKo, Corpus Query Platform, IDS Mannheim, Leibniz Institute for the German Language' | 
 |     }, | 
 |     QL => { | 
 |       poliqarp => 'Poliqarp', | 
 |       cosmas2 => 'Cosmas II', | 
 |       annis => 'Annis QL', | 
 |       cqp => 'CQP (new)', | 
 |       cql => 'CQL v1.2', | 
 |       fcsql => 'FCSQL' | 
 |     }, | 
 |     privacy => 'Privacy', | 
 |     imprint => 'Imprint', | 
 |     settings => 'Settings', | 
 |     maintenanceWork => { | 
 |       time => 'Maintenance', | 
 |       desc => 'Due to maintenance work the service will be interrupted.', | 
 |     }, | 
 |     Template => { | 
 |       intro => 'intro', | 
 |       doc => { | 
 |         ql => { | 
 |           '.' => 'doc/ql', | 
 |           'poliqarp-plus' => 'doc/ql/poliqarp-plus', | 
 |           'cosmas-2' => 'doc/ql/cosmas-2', | 
 |           'regexp' => 'doc/ql/regexp', | 
 |           'fcsql' => 'doc/ql/fcsql', | 
 |           'cql' => 'doc/ql/cql', | 
 |           'annis' => 'doc/ql/annis' | 
 |         }, | 
 |         api => { | 
 |           'koralquery' => 'doc/api/koralquery' | 
 |         }, | 
 |         data => { | 
 |           'annotation' => 'doc/data/annotation' | 
 |         }, | 
 |         development => { | 
 |           'kalamar' => 'doc/development/kalamar', | 
 |           'karang' => 'doc/development/karang', | 
 |           'koral' => 'doc/development/koral', | 
 |           'krill' => 'doc/development/krill', | 
 |           'kustvakt' => 'doc/development/kustvakt' | 
 |         } | 
 |       } | 
 |     }, | 
 |     Nav => { | 
 |       'ql' => 'Query Languages', | 
 |       '#queryterms' => 'Query Terms', | 
 |       '#logical-operators' => 'Logical Operators', | 
 |       '#distance-operators' =>  'Distance Operators', | 
 |       '#annotation-operators' =>  'Annotation Operators', | 
 |       '#combination-operators'=>  'Combination Operators', | 
 |       '#area-operators' =>  'Area Operators', | 
 |       '#segments' => 'Simple Segments', | 
 |       '#complex' => 'Complex Segments', | 
 |       '#spans' => 'Span Segments', | 
 |       '#paradigmatic-operators' => 'Paradigmatic Operators', | 
 |       '#syntagmatic-operators' => 'Syntagmatic Operators', | 
 |       '#class-operators' => 'Class Operators', | 
 |       'regexp' => 'Regular Expressions', | 
 |       'data' => 'Corpus Data', | 
 |       'corpus' => 'Corpora', | 
 |       'annotation' => 'Annotations', | 
 |       '#default-foundries' => 'Default Foundries', | 
 |       'development' => 'Development', | 
 |       'faq' => 'FAQ' | 
 |     } | 
 |   }, | 
 |   Piwik => { | 
 |     en => { | 
 |       'HowToOptOut' => 'How to opt-out from Piwik/Matomo tracking?' | 
 |     }, | 
 |     de => { | 
 |       'HowToOptOut' => 'Wie kann ich die Weitergabe meiner Daten per Matomo/Piwik unterbinden?' | 
 |     } | 
 |   } | 
 | }; |