Changeset - 106323ecfdfa
[Not reviewed]
Merge default
2 34 1
Thomas De Schampheleire - 6 years ago 2020-05-06 20:36:23
thomas.de_schampheleire@nokia.com
merge stable
14 files changed:
0 comments (0 inline, 0 general)
.hgtags
Show inline comments
 
c097458480a5972dd75d5695b61e855fd0ab371e rhodecode-0.0.0.7.0
 
8bdec09436cb7e4a764bd2ba50b84060e30eb34f rhodecode-0.0.0.7.1
 
1a18994cdc3bdd156ee93c7c0fb8d94a88f1f640 rhodecode-0.0.0.7.2
 
a3a7c3e03b76ee264a828cb1087970bb98bbffcd rhodecode-0.0.0.7.3
 
58b46f9194c347641bfc9a26697ef413a4761971 rhodecode-0.0.0.7.4
 
710e7a75bb6b8346cee3bd0ddda67592e4790268 rhodecode-0.0.0.7.5
 
ca80f8c0056211dad33483a50b913593516d7a6c rhodecode-0.0.0.7.6
 
0cf49c29c846fefeb4e1a222e4b1850e9e3eaa62 rhodecode-0.0.0.7.7
 
702c7e565c56a49c89414e81f28571c8e5b67408 rhodecode-0.0.0.7.8
 
c12f4d19c95065f313eefcd45eac9ef507f5fa55 rhodecode-0.0.0.7.9
 
558eb7c5028f24a90b5466ed16be13b213ba1fc2 rhodecode-0.0.0.8.0
 
a9814a642e11092b243ca01721254a04633a0ffc rhodecode-0.0.0.8.1
 
ccbe729908844884aea89d00fb14a6cb92e10c06 rhodecode-0.0.0.8.2
 
ca41d544dbdfd2f81bd0304168492a26276aadb6 rhodecode-0.0.0.8.3
 
2fa16ec5822da0c6fade3dd1ed9b6c0655e5dbbf rhodecode-0.0.0.8.4
 
16ba57d8fe2317c49dbd422afd07ab497687aa02 rhodecode-0.0.0.8.5
 
53128b6b9a4ddb6ee9554cbb83a082a6d1316b42 rhodecode-0.0.1.0.0rc4
 
afd98d1f817e6a6b52172735c22160239e615a6b rhodecode-0.0.1.0.0
 
bee56f209c40a6880f2f633b02227b5ee1f8ff5a rhodecode-0.0.1.0.1
 
d85b0948e53925ebbbc49e9f7967013a04f866e9 rhodecode-0.0.1.0.2
 
d9c8dddb96af521e346f05b88d515c536eef3d17 rhodecode-0.0.1.1.0
 
344f748517814ed0408a49e392dc625f4cc37fdc rhodecode-0.0.1.1.1
 
6c01c12eafb8cc72d4c4cbd121400fad755b2862 rhodecode-0.0.1.1.2
 
4fa80e0484ef5c33feaa9c39fc66916f410ba353 rhodecode-0.0.1.1.3
 
cb77867d69d3c5931712aac486c980a42ee90745 rhodecode-0.0.1.1.5
 
cb77867d69d3c5931712aac486c980a42ee90745 rhodecode-0.0.1.1.5
 
008bdfdd95c8bd31ae6d89f76c75c1f49cbcd0bc rhodecode-0.0.1.1.5
 
c5af1d3c861fb36b156224e75c2f55a97f54657d rhodecode-0.0.1.1.6
 
7327a0d1584cf28d33e738048af1f6809d499451 rhodecode-0.0.1.1.7
 
bd102f45950f779995a1beae42b6eb099cdd27b3 rhodecode-0.0.1.1.7
 
c8974135732aa0ceb841cee6df66e29f089b4963 rhodecode-0.0.1.1.8
 
c252049af24cd98eef5f4143fa3abbff3c912e29 rhodecode-0.0.1.2.0
 
0b8fba8ab90b01f811a50e6e7384989cced21d38 rhodecode-0.0.1.2.1
 
22273bec00ba2fd860c60a9277d3d7229e288e18 rhodecode-0.0.1.2.2
 
1ff606a7858dbd8a5f70b3da5cc89524bd0d84f9 rhodecode-0.0.1.2.3
 
a7a282a902b207ce34e830d643c79b7ab52e3b35 rhodecode-0.0.1.2.4
 
b6b611e7722e754abebaae6e265cbb4c823d344d rhodecode-0.0.1.2.5
 
dbc82e3362a25d2aece42060089824c4342efd17 rhodecode-0.0.1.3.0
 
79a95f338fd0115b2cdb77118f39e17d22ff505c rhodecode-0.0.1.3.1
 
9ab21c5ddb84935bea5c743b4e147ed5a398b30c rhodecode-0.0.1.3.2
 
934906f028b582a254e0028ba25e5d20dd32b9cd rhodecode-0.0.1.3.3
 
af21362474e3ab5aa0e2fbb1c872356f2c16c4f3 rhodecode-0.0.1.3.4
 
0e2792e04bd316fe64335cbe6a476031ac60b29b rhodecode-0.0.1.3.5
 
edfff9f37916389144d3a3644d0a7d7adfd79b11 rhodecode-0.0.1.3.6
 
9ae95fdeca184f2404205645f06c6597b74ef2db rhodecode-0.0.1.4.0
 
909143a4dde53c46d4f24abb426ec870471c7de1 rhodecode-0.0.1.4.1
 
d998cc84cf726798486a438763053f0e1dc1b646 rhodecode-0.0.1.4.2
 
3f5d40b9dd99ccb009ea2211ee2d4b594c634946 rhodecode-0.0.1.4.3
 
3148c08cf86f1849917e2d50f7ab7766c1550b0a rhodecode-0.0.1.4.4
 
a5f0bc867edc88be23eb808693e5393a97d4c54a rhodecode-0.0.1.5.0
 
3259dc7caea48687eab018ee646ae6ad7e7ef377 rhodecode-0.0.1.5.1
 
efe23d6c178c11d575a0214181276a3452776e48 rhodecode-0.0.1.5.2
 
1a498b11f1540f5b94b6f6009298f5dc3eaad9e9 rhodecode-0.0.1.5.3
 
3447862ad8c9ceba85857774c526e39fde3a2281 rhodecode-0.0.1.5.4
 
c15d7b336af58df9f1bbc8f8957464e7ea618d4c rhodecode-0.0.1.6.0rc1
 
78b53ee0d247f90d51b028307ff5717851b6c265 rhodecode-0.0.1.6.0
 
351ad34d56321349ff5bd38f537bd768b8efef2e rhodecode-0.0.1.7.0
 
1f71ef689d2a3c9978cea6591a1f4e9107a5ca83 rhodecode-0.0.1.7.1
 
cc48c1541c7e2e84114bf92a0f9cd4b8b1341545 0.0
 
d17e88a1a88a29f6fac948c94498129e405a40d3 0.1
 
ad0ce803b40cb17fc3988373052943e041030b02 0.2
 
c6e32714336345403adf76abb6ebf9b8116fcdc7 0.2.1
 
14f488a5dc4ca6647bc6acf12534fd137e968aa8 0.2.2
 
9b3e9e242f5c97cc0c7657e5ac93dce7de61ca16 0.3
 
9bf8eb837e785b6856ccfac264e977ce3ebe1535 0.3.1
 
a84d40e9481fcea4dafadee86b03f0dd401527d6 0.3.2
 
64ea7ea0923618a0c117acebb816a6f0d162bfdb 0.3.3
 
cf635c823ea059cc3a1581b82d8672e46b682384 0.3.4
 
4cca4cc6a0a97f4c4763317184cd41aca4297630 0.3.5
 
082c9b8f0f17bd34740eb90c69bdc4c80d4b5b31 0.3.6
 
a18445b85d407294da0b7f1d8be3bedef5ffdea6 0.3.7
 
8db761c407685e7b08b800c947890035b0d67025 0.4.0rc1
 
60f726162fd6c515bd819feb423be73cad01d7d3 0.4.0rc2
 
19086c5de05f4984d7a90cd31624c45dd893f6bb 0.4.0
 
da65398a62fff50f3d241796cbf17acdea2092ef 0.4.1
 
bfa0b0a814644f0af3f492d17a9ed169cc3b89fe 0.5.0
 
d01a8e92936dbd62c76505432f60efba432e9397 0.5.1
 
aa0a637fa6f635a5e024fa56b19ed2a2dacca857 0.5.2
 
9f5ca9088067618d79129d224c35c818bd2d2f12 0.6.0
CONTRIBUTORS
Show inline comments
 
List of contributors to Kallithea project:
 

	
 
    Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> 2014-2020
 
    Mads Kiilerich <mads@kiilerich.com> 2016-2020
 
    Asterios Dimitriou <steve@pci.gr> 2016-2017 2020
 
    Private <adamantine.sword@gmail.com> 2019-2020
 
    Dennis Fink <dennis.fink@c3l.lu> 2020
 
    Étienne Gilli <etienne@gilli.io> 2020
 
    J. Lavoie <j.lavoie@net-c.ca> 2020
 
    robertus <robertuss12@gmail.com> 2020
 
    Ross Thomas <ross@lns-nevasoft.com> 2020
 
    Andrej Shadura <andrew@shadura.me> 2012 2014-2017 2019
 
    Étienne Gilli <etienne.gilli@gmail.com> 2015-2017 2019
 
    Allan Nordhøy <epost@anotheragency.no> 2017-2019
 
    ssantos <ssantos@web.de> 2018-2019
 
    Adi Kriegisch <adi@cg.tuwien.ac.at> 2019
 
    Danni Randeris <danniranderis@gmail.com> 2019
 
    Edmund Wong <ewong@crazy-cat.org> 2019
 
    Elizabeth Sherrock <lizzyd710@gmail.com> 2019
 
    Hüseyin Tunç <huseyin.tunc@bulutfon.com> 2019
 
    leela <53352@protonmail.com> 2019
 
    Manuel Jacob <me@manueljacob.de> 2019
 
    Mateusz Mendel <mendelm9@gmail.com> 2019
 
    Nathan <bonnemainsnathan@gmail.com> 2019
 
    Oleksandr Shtalinberg <o.shtalinberg@gmail.com> 2019
 
    Private <adamantine.sword@gmail.com> 2019
 
    THANOS SIOURDAKIS <siourdakisthanos@gmail.com> 2019
 
    Wolfgang Scherer <wolfgang.scherer@gmx.de> 2019
 
    Христо Станев <hstanev@gmail.com> 2019
 
    Dominik Ruf <dominikruf@gmail.com> 2012 2014-2018
 
    Michal Čihař <michal@cihar.com> 2014-2015 2018
 
    Branko Majic <branko@majic.rs> 2015 2018
 
    Chris Rule <crule@aegistg.com> 2018
 
    Jesús Sánchez <jsanchezfdz95@gmail.com> 2018
 
    Patrick Vane <patrick_vane@lowentry.com> 2018
 
    Pheng Heong Tan <phtan90@gmail.com> 2018
 
    Максим Якимчук <xpinovo@gmail.com> 2018
 
    Марс Ямбар <mjambarmeta@gmail.com> 2018
 
    Mads Kiilerich <madski@unity3d.com> 2012-2017
 
    Unity Technologies 2012-2017
 
    Søren Løvborg <sorenl@unity3d.com> 2015-2017
 
    Sam Jaques <sam.jaques@me.com> 2015 2017
 
    Asterios Dimitriou <steve@pci.gr> 2016-2017
 
    Alessandro Molina <alessandro.molina@axant.it> 2017
 
    Anton Schur <tonich.sh@gmail.com> 2017
 
    Ching-Chen Mao <mao@lins.fju.edu.tw> 2017
 
    Eivind Tagseth <eivindt@gmail.com> 2017
 
    FUJIWARA Katsunori <foozy@lares.dti.ne.jp> 2017
 
    Holger Schramm <info@schramm.by> 2017
 
    Karl Goetz <karl@kgoetz.id.au> 2017
 
    Lars Kruse <devel@sumpfralle.de> 2017
 
    Marko Semet <markosemet@googlemail.com> 2017
 
    Viktar Vauchkevich <victorenator@gmail.com> 2017
 
    Takumi IINO <trot.thunder@gmail.com> 2012-2016
 
    Jan Heylen <heyleke@gmail.com> 2015-2016
 
    Robert Martinez <ntttq@inboxen.org> 2015-2016
 
    Robert Rauch <mail@robertrauch.de> 2015-2016
 
    Angel Ezquerra <angel.ezquerra@gmail.com> 2016
 
    Anton Shestakov <av6@dwimlabs.net> 2016
 
    Brandon Jones <bjones14@gmail.com> 2016
 
    Kateryna Musina <kateryna@unity3d.com> 2016
 
    Konstantin Veretennicov <kveretennicov@gmail.com> 2016
 
    Oscar Curero <oscar@naiandei.net> 2016
 
    Robert James Dennington <tinytimrob@googlemail.com> 2016
 
    timeless@gmail.com 2016
 
    YFdyh000 <yfdyh000@gmail.com> 2016
 
    Aras Pranckevičius <aras@unity3d.com> 2012-2013 2015
 
    Sean Farley <sean.michael.farley@gmail.com> 2013-2015
 
    Bradley M. Kuhn <bkuhn@sfconservancy.org> 2014-2015
 
    Christian Oyarzun <oyarzun@gmail.com> 2014-2015
 
    Joseph Rivera <rivera.d.joseph@gmail.com> 2014-2015
 
    Anatoly Bubenkov <bubenkoff@gmail.com> 2015
 
    Andrew Bartlett <abartlet@catalyst.net.nz> 2015
 
    Balázs Úr <urbalazs@gmail.com> 2015
 
    Ben Finney <ben@benfinney.id.au> 2015
 
    Daniel Hobley <danielh@unity3d.com> 2015
 
    David Avigni <david.avigni@ankapi.com> 2015
 
    Denis Blanchette <dblanchette@coveo.com> 2015
 
    duanhongyi <duanhongyi@doopai.com> 2015
 
    EriCSN Chang <ericsning@gmail.com> 2015
 
    Grzegorz Krason <grzegorz.krason@gmail.com> 2015
 
    Jiří Suchan <yed@vanyli.net> 2015
 
    Kazunari Kobayashi <kobanari@nifty.com> 2015
 
    Kevin Bullock <kbullock@ringworld.org> 2015
 
    kobanari <kobanari@nifty.com> 2015
 
    Marc Abramowitz <marc@marc-abramowitz.com> 2015
 
    Marc Villetard <marc.villetard@gmail.com> 2015
 
    Matthias Zilk <matthias.zilk@gmail.com> 2015
 
    Michael Pohl <michael@mipapo.de> 2015
 
    Michael V. DePalatis <mike@depalatis.net> 2015
 
    Morten Skaaning <mortens@unity3d.com> 2015
 
    Nick High <nick@silverchip.org> 2015
 
    Niemand Jedermann <predatorix@web.de> 2015
 
    Peter Vitt <petervitt@web.de> 2015
 
    Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> 2015
 
    Tuux <tuxa@galaxie.eu.org> 2015
 
    Viktar Palstsiuk <vipals@gmail.com> 2015
 
    Ante Ilic <ante@unity3d.com> 2014
 
    Calinou <calinou@opmbx.org> 2014
 
    Daniel Anderson <daniel@dattrix.com> 2014
 
    Henrik Stuart <hg@hstuart.dk> 2014
 
    Ingo von Borstel <kallithea@planetmaker.de> 2014
 
    invision70 <invision70@gmail.com> 2014
 
    Jelmer Vernooij <jelmer@samba.org> 2014
 
    Jim Hague <jim.hague@acm.org> 2014
 
    Matt Fellows <kallithea@matt-fellows.me.uk> 2014
 
    Max Roman <max@choloclos.se> 2014
 
    Na'Tosha Bard <natosha@unity3d.com> 2014
 
    Rasmus Selsmark <rasmuss@unity3d.com> 2014
 
    SkryabinD <skryabind@gmail.com> 2014
 
    Tim Freund <tim@freunds.net> 2014
 
    Travis Burtrum <android@moparisthebest.com> 2014
 
    whosaysni <whosaysni@gmail.com> 2014
 
    Zoltan Gyarmati <mr.zoltan.gyarmati@gmail.com> 2014
 
    Marcin Kuźmiński <marcin@python-works.com> 2010-2013
 
    Nemcio <areczek01@gmail.com> 2012-2013
 
    xpol <xpolife@gmail.com> 2012-2013
 
    Andrey Mivrenik <myvrenik@gmail.com> 2013
 
    Aparkar <aparkar@icloud.com> 2013
 
    ArcheR <aleclitvinov1980@gmail.com> 2013
 
    Dennis Brakhane <brakhane@googlemail.com> 2013
 
    gnustavo <gustavo@gnustavo.com> 2013
 
    Grzegorz Rożniecki <xaerxess@gmail.com> 2013
 
    Ilya Beda <ir4y.ix@gmail.com> 2013
 
    ivlevdenis <ivlevdenis.ru@gmail.com> 2013
 
    Jonathan Sternberg <jonathansternberg@gmail.com> 2013
 
    Leonardo Carneiro <leonardo@unity3d.com> 2013
 
    Magnus Ericmats <magnus.ericmats@gmail.com> 2013
 
    Martin Vium <martinv@unity3d.com> 2013
 
    Mikhail Zholobov <legal90@gmail.com> 2013
 
    mokeev1995 <mokeev_andre@mail.ru> 2013
 
    Ruslan Bekenev <furyinbox@gmail.com> 2013
 
    shirou - しろう 2013
 
    Simon Lopez <simon.lopez@slopez.org> 2013
 
    softforwinxp <softforwinxp@gmail.com> 2013
 
    stephanj <info@stephan-jauernick.de> 2013
 
    Ton Plomp <tcplomp@gmail.com> 2013
 
    zhmylove <zhmylove@narod.ru> 2013
 
    こいんとす <tkondou@gmail.com> 2013
MANIFEST.in
Show inline comments
 
include           .coveragerc
 
include           .eslintrc.js
 
include           Apache-License-2.0.txt
 
include           CONTRIBUTORS
 
include           COPYING
 
include           Jenkinsfile
 
include           LICENSE-MERGELY.html
 
include           LICENSE.md
 
include           MIT-Permissive-License.txt
 
include           README.rst
 
include           conftest.py
 
include           dev_requirements.txt
 
include           development.ini
 
include           pytest.ini
 
include           requirements.txt
 
include           tox.ini
 
recursive-include docs *
 
recursive-include init.d *
 
recursive-include kallithea/alembic *
 
include           kallithea/bin/ldap_sync.conf
 
include           kallithea/lib/paster_commands/template.ini.mako
 
recursive-include kallithea/front-end *
 
recursive-include kallithea/i18n *
 
recursive-include kallithea/public *
 
recursive-include kallithea/templates *
 
recursive-include kallithea/tests/fixtures *
 
recursive-include kallithea/tests/scripts *
 
include           kallithea/tests/models/test_dump_html_mails.ref.html
 
include           kallithea/tests/performance/test_vcs.py
 
include           kallithea/tests/vcs/aconfig
 
recursive-include scripts *
docs/contributing.rst
Show inline comments
 
@@ -176,150 +176,150 @@ might give feedback that requests polish
 
changes when we apply them.
 

	
 
We try to make sure we have consensus on the direction the project is taking.
 
Everything non-sensitive should be discussed in public -- preferably on the
 
mailing list.  We aim at having all non-trivial changes reviewed by at least
 
one other core developer before pushing. Obvious non-controversial changes will
 
be handled more casually.
 

	
 
There is a main development branch ("default") which is generally stable so that
 
it can be (and is) used in production. There is also a "stable" branch that is
 
almost exclusively reserved for bug fixes or trivial changes. Experimental
 
changes should live elsewhere (for example in a pull request) until they are
 
ready.
 

	
 
.. _coding-guidelines:
 

	
 

	
 
Coding guidelines
 
-----------------
 

	
 
We don't have a formal coding/formatting standard. We are currently using a mix
 
of Mercurial's (https://www.mercurial-scm.org/wiki/CodingStyle), pep8, and
 
consistency with existing code. Run ``scripts/run-all-cleanup`` before
 
committing to ensure some basic code formatting consistency.
 

	
 
We support Python 3.6 and later.
 

	
 
We try to support the most common modern web browsers. IE9 is still supported
 
to the extent it is feasible, IE8 is not.
 

	
 
We primarily support Linux and OS X on the server side but Windows should also work.
 

	
 
HTML templates should use 2 spaces for indentation ... but be pragmatic. We
 
should use templates cleverly and avoid duplication. We should use reasonable
 
semantic markup with element classes and IDs that can be used for styling and testing.
 
We should only use inline styles in places where it really is semantic (such as
 
``display: none``).
 

	
 
JavaScript must use ``;`` between/after statements. Indentation 4 spaces. Inline
 
multiline functions should be indented two levels -- one for the ``()`` and one for
 
``{}``.
 
Variables holding jQuery objects should be named with a leading ``$``.
 

	
 
Commit messages should have a leading short line summarizing the changes. For
 
bug fixes, put ``(Issue #123)`` at the end of this line.
 

	
 
Use American English grammar and spelling overall. Use `English title case`_ for
 
page titles, button labels, headers, and 'labels' for fields in forms.
 

	
 
.. _English title case: https://en.wikipedia.org/wiki/Capitalization#Title_case
 

	
 
Template helpers (that is, everything in ``kallithea.lib.helpers``)
 
should only be referenced from templates. If you need to call a
 
helper from the Python code, consider moving the function somewhere
 
else (e.g. to the model).
 

	
 
Notes on the SQLAlchemy session
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

	
 
Each HTTP request runs inside an independent SQLAlchemy session (as well
 
as in an independent database transaction). ``Session`` is the session manager
 
and factory. ``Session()`` will create a new session on-demand or return the
 
current session for the active thread. Many database operations are methods on
 
such session instances. The session will generally be removed by
 
TurboGears automatically.
 

	
 
Database model objects
 
(almost) always belong to a particular SQLAlchemy session, which means
 
that SQLAlchemy will ensure that they're kept in sync with the database
 
(but also means that they cannot be shared across requests).
 

	
 
Objects can be added to the session using ``Session().add``, but this is
 
rarely needed:
 

	
 
* When creating a database object by calling the constructor directly,
 
  it must explicitly be added to the session.
 

	
 
* When creating an object using a factory function (like
 
  ``create_repo``), the returned object has already (by convention)
 
  been added to the session, and should not be added again.
 

	
 
* When getting an object from the session (via ``Session().query`` or
 
  any of the utility functions that look up objects in the database),
 
  it's already part of the session, and should not be added again.
 
  SQLAlchemy monitors attribute modifications automatically for all
 
  objects it knows about and syncs them to the database.
 

	
 
SQLAlchemy also flushes changes to the database automatically; manually
 
calling ``Session().flush`` is usually only necessary when the Python
 
code needs the database to assign an "auto-increment" primary key ID to
 
a freshly created model object (before flushing, the ID attribute will
 
be ``None``).
 

	
 
Debugging
 
^^^^^^^^^
 

	
 
A good way to trace what Kallithea is doing is to keep an eye on the output of
 
stdout/stderr from the server process. Perhaps change ``my.ini`` to log at
 
A good way to trace what Kallithea is doing is to keep an eye on the output on
 
stdout/stderr of the server process. Perhaps change ``my.ini`` to log at
 
``DEBUG`` or ``INFO`` level, especially ``[logger_kallithea]``, but perhaps
 
also other loggers. It is often easier to add additional ``log`` or ``print``
 
statements than to use a Python debugger.
 

	
 
Sometimes it is simpler to disable ``errorpage.enabled`` and perhaps also
 
``trace_errors.enable`` to expose raw errors instead of adding extra
 
processing. Enabling ``debug`` can be helpful for showing and exploring
 
tracebacks in the browser, but is also insecure and will add extra processing.
 

	
 
TurboGears2 DebugBar
 
^^^^^^^^^^^^^^^^^^^^
 

	
 
It is possible to enable the TurboGears2-provided DebugBar_, a toolbar overlayed
 
over the Kallithea web interface, allowing you to see:
 

	
 
* timing information of the current request, including profiling information
 
* request data, including GET data, POST data, cookies, headers and environment
 
  variables
 
* a list of executed database queries, including timing and result values
 

	
 
DebugBar is only activated when ``debug = true`` is set in the configuration
 
file. This is important, because the DebugBar toolbar will be visible for all
 
users, and allow them to see information they should not be allowed to see. Like
 
is anyway the case for ``debug = true``, do not use this in production!
 

	
 
To enable DebugBar, install ``tgext.debugbar`` and ``kajiki`` (typically via
 
``pip``) and restart Kallithea (in debug mode).
 

	
 

	
 
"Roadmap"
 
---------
 

	
 
We do not have a road map but are waiting for your contributions. Refer to the
 
wiki_ for some ideas of places we might want to go -- contributions in these
 
areas are very welcome.
 

	
 

	
 
Thank you for your contribution!
 
--------------------------------
 

	
 

	
 
.. _Weblate: http://weblate.org/
 
.. _issue tracking: https://bitbucket.org/conservancy/kallithea/issues?status=new&status=open
 
.. _pull requests: https://bitbucket.org/conservancy/kallithea/pull-requests
 
.. _bitbucket: http://bitbucket.org/
 
.. _mailing list: http://lists.sfconservancy.org/mailman/listinfo/kallithea-general
 
.. _kallithea-general: http://lists.sfconservancy.org/mailman/listinfo/kallithea-general
 
.. _Hosted Weblate: https://hosted.weblate.org/projects/kallithea/kallithea/
 
.. _wiki: https://bitbucket.org/conservancy/kallithea/wiki/Home
 
.. _DebugBar: https://github.com/TurboGears/tgext.debugbar
 
.. _Quick Start: https://www.mercurial-scm.org/wiki/QuickStart
 
.. _Beginners Guide: https://www.mercurial-scm.org/wiki/BeginnersGuides
docs/dev/i18n.rst
Show inline comments
 
file renamed from kallithea/i18n/how_to to docs/dev/i18n.rst
 
.. _translations:
 

	
 
============
 
Translations
 
============
 

	
 
Translations are available on Hosted Weblate at the following URL:
 

	
 
    https://hosted.weblate.org/projects/kallithea/kallithea/
 

	
 
Registered users may contribute to the existing languages, or request a new
 
language translation.
 

	
 

	
 
Translating using Weblate
 
-------------------------
 

	
 
Weblate_ offers a simple and easy to use interface featuring glossary, machine
 
translation, suggestions based on similar translations in other projects,
 
automatic checks etc. Weblate imports the source code tree directly from
 
the version control system, and commits edits back from time to time.
 

	
 
When registering at Weblate, make sure you use the name and email address you
 
prefer to be used when your changes are committed. We can and probably will
 
amend changesets coming from Weblate, but having things right from the beginning
 
makes things easier.
 

	
 
Weblate performs sanity checks all the time and tries to prevent you from ignoring
 
them. Most common mistakes are inconsistent punctuation, whitespace, missing or extra
 
format parameters, untranslated strings copied into the translation. Please perform
 
necessary corrections when they're needed, or override the false positives.
 

	
 

	
 
Merging translations from Weblate (admin-only)
 
----------------------------------------------
 

	
 
Weblate rebases its changes every time it pulls from our repository. Pulls are triggered
 
by a web hook from Our Own Kallithea every time it receives new commits. Usually merging
 
the new translations is a straightforward process consisting of a pull from the Weblate-hosted
 
repository which is available under the Data Exports tab in the Weblate interface.
 

	
 
Weblate tries to minimise the number of commits, but that doesn't always work, especially
 
when two translators work with different languages at more or less the same time.
 
It makes sense sometimes to re-order or fold commits by the same author when they touch
 
just the same language translation. That, however, may confuse Weblate sometimes, in
 
which case it should be manually convinced it has to discard the commits it created by
 
using its administrative interface.
 

	
 

	
 
Regenerating translations after source code changes (admin-only)
 
----------------------------------------------------------------
 

	
 
When the Kallithea source code changes, both the location as the content of
 
translation strings can change. It is therefore necessary to regularly
 
regenerate the `kallithea.pot` file containing these strings, as well as aligning
 
the translation files (`*.po`).
 

	
 
First update the translation strings::
 

	
 
    python3 setup.py extract_messages
 

	
 
Then regenerate the translation files. This could either be done with `python3
 
setup.py update_catalog` or with `msgmerge` from the `gettext` package. As
 
Weblate is also touching these translation files, it is preferred to use the
 
same tools (`msgmerge`) and settings as Weblate to minimize the diff::
 

	
 
    find kallithea/i18n -name kallithea.po | xargs -I '{}' \
 
        msgmerge --width=76 --backup=none --previous --update '{}' \
 
        kallithea/i18n/kallithea.pot
 

	
 

	
 
Manual creation of a new language translation
 
---------------------------------------------
 

	
 
In the prepared development environment, run the following to ensure
 
all translation strings are extracted and up-to-date::
 

	
 
    python3 setup.py extract_messages
 

	
 
Create new language by executing following command::
 

	
 
    python3 setup.py init_catalog -l <new_language_code>
 

	
 
This creates a new translation under directory `kallithea/i18n/<new_language_code>`
 
based on the translation template file, `kallithea/i18n/kallithea.pot`.
 

	
 
Edit the new PO file located in `LC_MESSAGES` directory with poedit or your
 
favorite PO files editor. After you finished with the translations, check the
 
translation file for errors by executing::
 

	
 
    msgfmt -f -c kallithea/i18n/<new_language_code>/LC_MESSAGES/<updated_file.po>
 

	
 
Finally, compile the translations::
 

	
 
    python3 setup.py compile_catalog -l <new_language_code>
 

	
 

	
 
Manually updating translations
 
------------------------------
 

	
 
Extract the latest versions of strings for translation by running::
 

	
 
    python3 setup.py extract_messages
 

	
 
Update the PO file by doing::
 

	
 
    python3 setup.py update_catalog -l <new_language_code>
 

	
 
Edit the newly updated translation file. Repeat all steps after the
 
`init_catalog` step from the 'new translation' instructions above.
 

	
 

	
 
Testing translations
 
--------------------
 

	
 
Edit `kallithea/tests/conftest.py` and set `i18n.lang` to `<new_language_code>`
 
and run Kallithea tests by executing::
 

	
 
    py.test
 

	
 

	
 
Managing translations with scripts/i18n tooling
 
-----------------------------------------------
 

	
 
The general idea with the ``scripts/i18n`` tooling is to keep changes in the
 
main repository focussed on actual and reviewable changes with minimal noise.
 
Noisy generated or redundant localization changes (that are useful when
 
translations) are contained in the ``kallithea-i18n`` repo on the ``i18n``
 
branch. The translation files in the main repository have no line numbers, no
 
untranslated entries, no fuzzy entries, no unused entries, and no constantly
 
changing records of "latest" this and that (name, date, version, etc).
 

	
 
The branches in the main repo (``default`` and ``stable``) will thus only have
 
stripped ``.pot`` and ``.po`` files: an (almost) empty
 
``kallithea/i18n/kallithea.pot`` file, and minimal ``.po`` files. There are no
 
binary ``.mo`` files in any repo - these are only generated when packaging for
 
release (or locally if installing from source).
 

	
 
Generally, ``kallithea/i18n/`` should not be changed on the ``default`` and
 
``stable`` branches at all. The ``i18n`` branch should *only* change
 
``kallithea/i18n/`` . If there are changesets with exceptions from that, these
 
changesets should probably be grafted/redone in the "right" place.
 

	
 
The basic flow is thus:
 

	
 
0. All weblate translation is done on the ``i18n`` branch which generally is
 
   based on the ``stable`` branch.
 
1. Graft the essential part of all new changes on the ``i18n`` branch to
 
   ``stable`` (while normalizing to current stripped state of stable).
 
2. Merge from ``stable`` to ``i18n`` (while normalizing to the resulting
 
   unstripped and fully ``msgmerge``'d state and ``.pot``-updating state).
 
3. Verify that the content of the ``i18n`` branch will give exactly the content
 
   of the ``stable`` branch after stripping. If there is a diff, something has
 
   to be fixed in one way or the other ... and the whole process should
 
   probably be redone.
 

	
 
Translate
 
^^^^^^^^^
 

	
 
First land full translation changes in the ``kallithea-i18n`` repo on the
 
``i18n`` branch. That can be done in pretty much any way you want. If changes
 
for some reason have to be grafted or merged, there might be odd conflicts due
 
to all the noise. Conflicts on the full ``i18n`` branch can perhaps be resolved
 
more easily using non-stripping normalization before merging::
 

	
 
  python3 setup.py extract_messages && cp kallithea/i18n/kallithea.pot full.pot && hg revert kallithea/i18n/kallithea.pot -r .
 
  hg resolve kallithea/i18n/ --tool X --config merge-tools.X.executable=python3 --config merge-tools.X.args='scripts/i18n normalized-merge --merge-pot-file full.pot $local $base $other $output'
 

	
 
Land in main repository - stripped
 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

	
 
When the full i18n changes have landed on the ``i18n`` branch, prepare to land
 
them on ``stable``::
 

	
 
  hg up -cr stable
 
  python3 setup.py extract_messages && cp kallithea/i18n/kallithea.pot full.pot && hg revert kallithea/i18n/kallithea.pot
 

	
 
Consider all new ``i18n`` changes since last merge from ``stable``::
 

	
 
  hg log -G --style compact -r 'only("i18n", children(::stable))'
 

	
 
Graft them one by one (or in collapsed chunks) while normalizing.
 

	
 
If the graft has conflicts, use the ``scripts/i18n`` normalization tool to
 
apply ``msgmerge`` and strip before doing 3-way merge and resolving conflicts::
 

	
 
  hg resolve kallithea/i18n/ --tool X --config merge-tools.X.executable=python3 --config merge-tools.X.args='scripts/i18n normalized-merge --merge-pot-file full.pot --strip $local $base $other $output'
 

	
 
When all conflicts have been resolved, continue the graft::
 

	
 
  hg graft --continue
 

	
 
Then make sure any non-conflicting files are normalized and stripped too::
 

	
 
  scripts/i18n normalize-po-files --strip --merge-pot-file full.pot kallithea/i18n/*/LC_MESSAGES/kallithea.po
 
  hg ci --amend --config ui.editor=true
 

	
 
When things have been grafted to the ``stable`` branch, clean up history if
 
necessary: clean up the author and commit message when necessary, and perhaps
 
merge multiple changesets from same contributor.
 

	
 
Merge back to ``i18n``
 
^^^^^^^^^^^^^^^^^^^^^^
 

	
 
For any i18n changes that for some reason have been done on the ``stable``
 
branch, apply them manually on the ``i18n`` branch too - perhaps by grafting
 
and editing manually. The merge done in this step will `not` take care of it.
 
If the verification step done a bit later points out that something has been
 
missed, strip and go back to this point.
 

	
 
Then merge back to the ``i18n`` branch using normalization while keeping the
 
full ``.po`` files, and updating the full ``.pot`` and ``.po`` to current
 
state::
 

	
 
  hg up -cr i18n
 
  hg merge stable --tool internal:fail
 
  hg revert kallithea/i18n/*/LC_MESSAGES/*.po -r .
 
  hg resolve -m kallithea/i18n/*/LC_MESSAGES/*.po
 
  hg resolve -l  # verify all conflicts have been resolved
 
  python3 setup.py extract_messages && cp kallithea/i18n/kallithea.pot full.pot
 
  scripts/i18n normalize-po-files --merge-pot-file full.pot kallithea/i18n/*/LC_MESSAGES/kallithea.po
 
  hg commit  # "Merge from stable"
 

	
 
Note: ``normalize-po-files`` can also pretty much be done manually with::
 

	
 
  for po in kallithea/i18n/*/LC_MESSAGES/kallithea.po; do msgmerge --width=76 --backup=none --previous --update $po full.pot ; done
 

	
 
Note: Additional merges from ``stable`` to ``i18n`` can be done any time.
 

	
 
Verify
 
^^^^^^
 

	
 
Verify things are in sync between the full ``i18n`` branch and the stripped
 
``stable`` branch::
 

	
 
  hg up -cr stable
 
  hg revert -a -r i18n
 
  python3 setup.py extract_messages && cp kallithea/i18n/kallithea.pot full.pot && hg revert kallithea/i18n/kallithea.pot
 
  scripts/i18n normalize-po-files --strip --merge-pot-file full.pot kallithea/i18n/*/LC_MESSAGES/kallithea.po
 
  hg diff
 

	
 
If there is a diff, figure out where it came from, go back and fix the root
 
cause, and redo the graft/merge.
 

	
 
Push
 
^^^^
 

	
 
The changes on the ``stable`` branch should now be ready for pushing - verify
 
the actual changes with a thorough review of::
 

	
 
  hg out -pvr stable
 

	
 
When ``stable`` changes have been pushed, also push the ``i18n`` branch to the
 
``kallithea-i18n`` repo so Weblate can see it.
 

	
 

	
 
.. _Weblate: http://weblate.org/
docs/dev/translation.rst
Show inline comments
 
deleted file
docs/index.rst
Show inline comments
 
.. _index:
 

	
 
#######################
 
Kallithea Documentation
 
#######################
 

	
 
* :ref:`genindex`
 
* :ref:`search`
 

	
 

	
 
Readme
 
******
 

	
 
.. toctree::
 
   :maxdepth: 1
 

	
 
   readme
 

	
 

	
 
Administrator guide
 
*******************
 

	
 
**Installation and upgrade**
 

	
 
.. toctree::
 
   :maxdepth: 1
 

	
 
   overview
 
   installation
 
   installation_win
 
   installation_win_old
 
   installation_iis
 
   installation_puppet
 
   upgrade
 

	
 
**Setup and configuration**
 

	
 
.. toctree::
 
   :maxdepth: 1
 

	
 
   setup
 
   administrator_guide/auth
 
   administrator_guide/vcs_setup
 
   usage/email
 
   usage/customization
 

	
 
**Maintenance**
 

	
 
.. toctree::
 
   :maxdepth: 1
 

	
 
   usage/backup
 
   usage/performance
 
   usage/debugging
 
   usage/troubleshooting
 

	
 

	
 
User guide
 
**********
 

	
 
.. toctree::
 
   :maxdepth: 1
 

	
 
   usage/general
 
   usage/vcs_notes
 
   usage/statistics
 
   api/api
 

	
 

	
 
Developer guide
 
***************
 

	
 
.. toctree::
 
   :maxdepth: 1
 

	
 
   contributing
 
   dev/translation
 
   dev/i18n
 
   dev/dbmigrations
 

	
 

	
 
.. _python: http://www.python.org/
 
.. _django: http://www.djangoproject.com/
 
.. _mercurial: https://www.mercurial-scm.org/
 
.. _bitbucket: http://bitbucket.org/
 
.. _subversion: http://subversion.tigris.org/
 
.. _git: http://git-scm.com/
 
.. _celery: http://celeryproject.org/
 
.. _Sphinx: http://sphinx.pocoo.org/
 
.. _vcs: http://pypi.python.org/pypi/vcs
docs/setup.rst
Show inline comments
 
@@ -60,192 +60,202 @@ Finally, prepare the front-end by runnin
 

	
 
You are now ready to use Kallithea. To run it simply execute::
 

	
 
    gearbox serve -c my.ini
 

	
 
- This command runs the Kallithea server. The web app should be available at
 
  http://127.0.0.1:5000. The IP address and port is configurable via the
 
  configuration file created in the previous step.
 
- Log in to Kallithea using the admin account created when running ``db-create``.
 
- The default permissions on each repository is read, and the owner is admin.
 
  Remember to update these if needed.
 
- In the admin panel you can toggle LDAP, anonymous, and permissions
 
  settings, as well as edit more advanced options on users and
 
  repositories.
 

	
 

	
 
Internationalization (i18n support)
 
-----------------------------------
 

	
 
The Kallithea web interface is automatically displayed in the user's preferred
 
language, as indicated by the browser. Thus, different users may see the
 
application in different languages. If the requested language is not available
 
(because the translation file for that language does not yet exist or is
 
incomplete), English is used.
 

	
 
If you want to disable automatic language detection and instead configure a
 
fixed language regardless of user preference, set ``i18n.enabled = false`` and
 
specify another language by setting ``i18n.lang`` in the Kallithea
 
configuration file.
 

	
 

	
 
Using Kallithea with SSH
 
------------------------
 

	
 
Kallithea supports repository access via SSH key based authentication.
 
This means:
 

	
 
- repository URLs like ``ssh://kallithea@example.com/name/of/repository``
 

	
 
- all network traffic for both read and write happens over the SSH protocol on
 
  port 22, without using HTTP/HTTPS nor the Kallithea WSGI application
 

	
 
- encryption and authentication protocols are managed by the system's ``sshd``
 
  process, with all users using the same Kallithea system user (e.g.
 
  ``kallithea``) when connecting to the SSH server, but with users' public keys
 
  in the Kallithea system user's `.ssh/authorized_keys` file granting each user
 
  sandboxed access to the repositories.
 

	
 
- users and admins can manage SSH public keys in the web UI
 

	
 
- in their SSH client configuration, users can configure how the client should
 
  control access to their SSH key - without passphrase, with passphrase, and
 
  optionally with passphrase caching in the local shell session (``ssh-agent``).
 
  This is standard SSH functionality, not something Kallithea provides or
 
  interferes with.
 

	
 
- network communication between client and server happens in a bidirectional
 
  stateful stream, and will in some cases be faster than HTTP/HTTPS with several
 
  stateless round-trips.
 

	
 
.. note:: At this moment, repository access via SSH has been tested on Unix
 
    only. Windows users that care about SSH are invited to test it and report
 
    problems, ideally contributing patches that solve these problems.
 

	
 
Users and admins can upload SSH public keys (e.g. ``.ssh/id_rsa.pub``) through
 
the web interface. The server's ``.ssh/authorized_keys`` file is automatically
 
maintained with an entry for each SSH key. Each entry will tell ``sshd`` to run
 
``kallithea-cli`` with the ``ssh-serve`` sub-command and the right Kallithea user ID
 
when encountering the corresponding SSH key.
 

	
 
To enable SSH repository access, Kallithea must be configured with the path to
 
the ``.ssh/authorized_keys`` file for the Kallithea user, and the path to the
 
``kallithea-cli`` command. Put something like this in the ``.ini`` file::
 

	
 
    ssh_enabled = true
 
    ssh_authorized_keys = /home/kallithea/.ssh/authorized_keys
 
    kallithea_cli_path = /srv/kallithea/venv/bin/kallithea-cli
 

	
 
The SSH service must be running, and the Kallithea user account must be active
 
(not necessarily with password access, but public key access must be enabled),
 
all file permissions must be set as sshd wants it, and ``authorized_keys`` must
 
be writeable by the Kallithea user.
 

	
 
.. note:: The ``authorized_keys`` file will be rewritten from scratch on
 
    each update. If it already exists with other data, Kallithea will not
 
    overwrite the existing ``authorized_keys``, and the server process will
 
    instead throw an exception. The system administrator thus cannot ssh
 
    directly to the Kallithea user but must use su/sudo from another account.
 

	
 
    If ``/home/kallithea/.ssh/`` (the directory of the path specified in the
 
    ``ssh_authorized_keys`` setting of the ``.ini`` file) does not exist as a
 
    directory, Kallithea will attempt to create it. If that path exists but is
 
    *not* a directory, or is not readable-writable-executable by the server
 
    process, the server process will raise an exception each time it attempts to
 
    write the ``authorized_keys`` file.
 

	
 
.. note:: It is possible to configure the SSH server to look for authorized
 
   keys in multiple files, for example reserving ``ssh/authorized_keys`` to be
 
   used for normal SSH and with Kallithea using
 
   ``.ssh/authorized_keys_kallithea``. In ``/etc/ssh/sshd_config`` set
 
   ``AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys_kallithea``
 
   and restart sshd, and in ``my.ini`` set ``ssh_authorized_keys =
 
   /home/kallithea/.ssh/authorized_keys_kallithea``. Note that this new
 
   location will apply to all system users, and that multiple entries for the
 
   same SSH key will shadow each other.
 

	
 
.. warning:: The handling of SSH access is steered directly by the command
 
    specified in the ``authorized_keys`` file. There is no interaction with the
 
    web UI.  Once SSH access is correctly configured and enabled, it will work
 
    regardless of whether the Kallithea web process is actually running. Hence,
 
    if you want to perform repository or server maintenance and want to fully
 
    disable all access to the repositories, disable SSH access by setting
 
    ``ssh_enabled = false`` in the correct ``.ini`` file (i.e. the ``.ini`` file
 
    specified in the ``authorized_keys`` file.)
 

	
 
The ``authorized_keys`` file can be updated manually with ``kallithea-cli
 
ssh-update-authorized-keys -c my.ini``. This command is not needed in normal
 
operation but is for example useful after changing SSH-related settings in the
 
``.ini`` file or renaming that file. (The path to the ``.ini`` file is used in
 
the generated ``authorized_keys`` file).
 

	
 

	
 
Setting up Whoosh full text search
 
----------------------------------
 

	
 
Kallithea provides full text search of repositories using `Whoosh`__.
 

	
 
.. __: https://whoosh.readthedocs.io/en/latest/
 

	
 
For an incremental index build, run::
 

	
 
    kallithea-cli index-create -c my.ini
 

	
 
For a full index rebuild, run::
 

	
 
    kallithea-cli index-create -c my.ini --full
 

	
 
The ``--repo-location`` option allows the location of the repositories to be overridden;
 
usually, the location is retrieved from the Kallithea database.
 

	
 
The ``--index-only`` option can be used to limit the indexed repositories to a comma-separated list::
 

	
 
    kallithea-cli index-create -c my.ini --index-only=vcs,kallithea
 

	
 
To keep your index up-to-date it is necessary to do periodic index builds;
 
for this, it is recommended to use a crontab entry. Example::
 

	
 
    0  3  *  *  *  /path/to/virtualenv/bin/kallithea-cli index-create -c /path/to/kallithea/my.ini
 

	
 
When using incremental mode (the default), Whoosh will check the last
 
modification date of each file and add it to be reindexed if a newer file is
 
available. The indexing daemon checks for any removed files and removes them
 
from index.
 

	
 
If you want to rebuild the index from scratch, you can use the ``-f`` flag as above,
 
or in the admin panel you can check the "build from scratch" checkbox.
 

	
 

	
 
Integration with issue trackers
 
-------------------------------
 

	
 
Kallithea provides a simple integration with issue trackers. It's possible
 
to define a regular expression that will match an issue ID in commit messages,
 
and have that replaced with a URL to the issue.
 

	
 
This is achieved with following three variables in the ini file::
 

	
 
    issue_pat = #(\d+)
 
    issue_server_link = https://issues.example.com/{repo}/issue/\1
 
    issue_sub =
 

	
 
``issue_pat`` is the regular expression describing which strings in
 
commit messages will be treated as issue references. The expression can/should
 
have one or more parenthesized groups that can later be referred to in
 
``issue_server_link`` and ``issue_sub`` (see below). If you prefer, named groups
 
can be used instead of simple parenthesized groups.
 

	
 
If the pattern should only match if it is preceded by whitespace, add the
 
following string before the actual pattern: ``(?:^|(?<=\s))``.
 
If the pattern should only match if it is followed by whitespace, add the
 
following string after the actual pattern: ``(?:$|(?=\s))``.
 
These expressions use lookbehind and lookahead assertions of the Python regular
 
expression module to avoid the whitespace to be part of the actual pattern,
 
otherwise the link text will also contain that whitespace.
 

	
 
Matched issue references are replaced with the link specified in
 
``issue_server_link``, in which any backreferences are resolved. Backreferences
 
can be ``\1``, ``\2``, ... or for named groups ``\g<groupname>``.
 
The special token ``{repo}`` is replaced with the full repository path
 
(including repository groups), while token ``{repo_name}`` is replaced with the
 
repository name (without repository groups).
 

	
 
The link text is determined by ``issue_sub``, which can be a string containing
 
backreferences to the groups specified in ``issue_pat``. If ``issue_sub`` is
 
empty, then the text matched by ``issue_pat`` is used verbatim.
 

	
 
The example settings shown above match issues in the format ``#<number>``.
 
This will cause the text ``#300`` to be transformed into a link:
 

	
 
.. code-block:: html
 

	
 
  <a href="https://issues.example.com/example_repo/issue/300">#300</a>
kallithea/__init__.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
"""
 
kallithea
 
~~~~~~~~~
 

	
 
Kallithea, a web based repository management system.
 

	
 
Versioning implementation: http://www.python.org/dev/peps/pep-0386/
 

	
 
This file was forked by the Kallithea project in July 2014.
 
Original author and date, and relevant copyright and licensing information is below:
 
:created_on: Apr 9, 2010
 
:author: marcink
 
:copyright: (c) 2013 RhodeCode GmbH, (C) 2014 Bradley M. Kuhn, and others.
 
:license: GPLv3, see LICENSE.md for more details.
 
"""
 

	
 
import platform
 
import sys
 

	
 

	
 
if sys.version_info < (3, 6):
 
    raise Exception('Kallithea requires python 3.6 or later')
 

	
 
VERSION = (0, 5, 99)
 
VERSION = (0, 6, 0)
 
BACKENDS = {
 
    'hg': 'Mercurial repository',
 
    'git': 'Git repository',
 
}
 

	
 
CELERY_APP = None  # set to Celery app instance if using Celery
 
CELERY_EAGER = False
 

	
 
CONFIG = {}
 

	
 
# Linked module for extensions
 
EXTENSIONS = {}
 

	
 
__version__ = '.'.join(str(each) for each in VERSION)
 
__platform__ = platform.system()
 
__license__ = 'GPLv3'
 
__py_version__ = sys.version_info
 
__author__ = "Various Authors"
 
__url__ = 'https://kallithea-scm.org/'
 

	
 
is_windows = __platform__ in ['Windows']
 
is_unix = not is_windows
kallithea/controllers/error.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
"""
 
kallithea.controllers.error
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

	
 
Kallithea error controller
 

	
 
This file was forked by the Kallithea project in July 2014.
 
Original author and date, and relevant copyright and licensing information is below:
 
:created_on: Dec 8, 2010
 
:author: marcink
 
:copyright: (c) 2013 RhodeCode GmbH, and others.
 
:license: GPLv3, see LICENSE.md for more details.
 
"""
 

	
 
import html
 
import logging
 

	
 
from tg import config, expose, request
 
from tg import tmpl_context as c
 
from tg.i18n import ugettext as _
 

	
 
from kallithea.lib.base import BaseController
 

	
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
class ErrorController(BaseController):
 
    """Generates error documents as and when they are required.
 

	
 
    The ErrorDocuments middleware forwards to ErrorController when error
 
    The errorpage middleware renders /error/document when error
 
    related status codes are returned from the application.
 

	
 
    This behavior can be altered by changing the parameters to the
 
    ErrorDocuments middleware in your config/middleware.py file.
 
    """
 

	
 
    def _before(self, *args, **kwargs):
 
        # disable all base actions since we don't need them here
 
        pass
 

	
 
    @expose('/errors/error_document.html')
 
    def document(self, *args, **kwargs):
 
        resp = request.environ.get('tg.original_response')
 
        c.site_name = config.get('title')
 

	
 
        log.debug('### %s ###', resp and resp.status or 'no response')
 

	
 
        e = request.environ
 
        c.serv_p = r'%(protocol)s://%(host)s/' % {
 
            'protocol': e.get('wsgi.url_scheme'),
 
            'host': e.get('HTTP_HOST'), }
 
        if resp:
 
            c.error_message = html.escape(request.GET.get('code', str(resp.status)))
 
            c.error_explanation = self.get_error_explanation(resp.status_int)
 
        else:
 
            c.error_message = _('No response')
 
            c.error_explanation = _('Unknown error')
 

	
 
        return dict()
 

	
 
    def get_error_explanation(self, code):
 
        """ get the error explanations of int codes
 
            [400, 401, 403, 404, 500]"""
 
        try:
 
            code = int(code)
 
        except ValueError:
 
            code = 500
 

	
 
        if code == 400:
 
            return _('The request could not be understood by the server'
 
                     ' due to malformed syntax.')
 
        if code == 401:
 
            return _('Unauthorized access to resource')
 
        if code == 403:
 
            return _("You don't have permission to view this page")
 
        if code == 404:
 
            return _('The resource could not be found')
 
        if code == 500:
 
            return _('The server encountered an unexpected condition'
 
                     ' which prevented it from fulfilling the request.')
kallithea/controllers/root.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
from tg import config
 
from tgext.routes import RoutedController
 

	
 
from kallithea.config.routing import make_map
 
from kallithea.controllers.error import ErrorController
 
from kallithea.lib.base import BaseController
 

	
 

	
 
# This is the main Kallithea entry point; TurboGears will forward all requests
 
# to an instance of 'controller.root.RootController' in the configured
 
# 'application' module (set by app_cfg.py).  Requests are forwarded to
 
# controllers based on the routing mapper that lives in this root instance.
 
# The mapper is configured using routes defined in routing.py.  This use of the
 
# 'mapper' attribute is a feature of tgext.routes, which is activated by
 
# inheriting from its RoutedController class.
 
class RootController(RoutedController, BaseController):
 

	
 
    def __init__(self):
 
        self.mapper = make_map(config)
 

	
 
        # the following assignment hooks in error handling
 
        # The URL '/error/document' (the default TG errorpage.path) should be handled by ErrorController.document
 
        self.error = ErrorController()
kallithea/i18n/be/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -357,198 +357,192 @@ msgstr "Уключана"
 
msgid "Global permissions updated successfully"
 
msgstr "Глабальныя прывілеі паспяхова абноўленыя"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Адбылася памылка падчас абнаўлення прывілеяў"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Адбылася памылка пры стварэнні групы рэпазітароў %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Створаная новая група рэпазітароў %s"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Група рэпазітароў %s абноўленая"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Адбылася памылка пры абнаўленні групы рэпазітароў %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Група ўтрымлівае %s рэпазітароў і не можа быць выдаленая"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Група ўтрымлівае ў сабе %s падгруп і не можа быць выдаленая"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Група рэпазітароў %s выдаленая"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Памылка пры выдаленні групы рэпазітароў %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Адміністратар не можа адклікаць свае прывелеі"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Прывілеі групы рэпазітароў абноўленыя"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Памылка пры водгуку прывелея"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Памылка пры стварэнні рэпазітара %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Рэпазітар %s створаны з %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Зроблены форк рэпазітара %s на %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Рэпазітар %s створаны"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Рэпазітар %s паспяхова абноўлены"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Памылка падчас абнаўлення рэпазітара %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Форкі %s адлучаныя"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Выдаленыя форки рэпазітара %s"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Рэпазітар %s выдалены"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Немагчыма выдаліць %s, ён усё яшчэ мае форкі"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Памылка падчас выдалення %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Прывілеі рэпазітара абноўленыя"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Памылка пры выдаленні поля"
 

	
 
msgid "-- Not a fork --"
 
msgstr "-- Не форк --"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "Бачнасць рэпазітара ў публічным часопісе абноўлена"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr "Памылка пры даданні рэпазітара ў агульнадаступны часопіс"
 

	
 
msgid "Nothing"
 
msgstr "Нічога"
 

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "Рэпазітар %s адзначаны як форк %s"
 

	
 
msgid "An error occurred during this operation"
 
msgstr "Памылка пры выкананні аперацыі"
 

	
 
msgid "Cache invalidation successful"
 
msgstr "Кэш скінуты"
 

	
 
msgid "An error occurred during cache invalidation"
 
msgstr "Памылка пры скіданні кэша"
 

	
 
msgid "Pulled from remote location"
 
msgstr "Занесеныя змены з аддаленага рэпазітара"
 

	
 
msgid "An error occurred during pull from remote location"
 
msgstr "Памылка пры занясенні змен з аддаленага рэпазітара"
 

	
 
msgid "An error occurred during deletion of repository stats"
 
msgstr "Адбылася памылка пры выдаленні статыстыкі рэпазітара"
 

	
 
msgid "Updated VCS settings"
 
msgstr "Абноўлены налады VCS"
 

	
 
msgid ""
 
"Unable to activate hgsubversion support. The \"hgsubversion\" library is "
 
"missing"
 
msgstr ""
 
"Немагчыма ўключыць падтрымку hgsubversion. Бібліятэка hgsubversion "
 
"адсутнічае"
 

	
 
msgid "Error occurred while updating application settings"
 
msgstr "Памылка пры абнаўленні наладаў праграмы"
 

	
 
msgid "Repositories successfully rescanned. Added: %s. Removed: %s."
 
msgstr "Рэпазітары паспяхова перасканаваныя, дададзена: %s, выдалена: %s."
 

	
 
msgid "Invalidated %s repositories"
 
msgstr "Скінуць кэш для %s рэпазітароў"
 

	
 
msgid "Updated application settings"
 
msgstr "Абноўленыя налады праграмы"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Налады візуалізацыі абноўленыя"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "Адбылася памылка пры абнаўленні наладаў візуалізацыі"
 

	
 
msgid "Please enter email address"
 
msgstr "Калі ласка, увядзіце e-mail-адрас"
 

	
 
msgid "Send email task created"
 
msgstr "Задача адпраўкі e-mail створаная"
 

	
 
msgid "Added new hook"
 
msgstr "Дададзены новы хук"
 

	
 
msgid "Updated hooks"
 
msgstr "Абноўленыя хукі"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Памылка пры стварэнні хука"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Запланаванае пераіндэксаванне базы Whoosh"
 

	
 
msgid "Created user group %s"
 
msgstr "Створана група карыстальнікаў %s"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "Памылка пры стварэнні групы карыстальнікаў %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Група карыстальнікаў %s абноўленая"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr "Памылка пры абнаўленні групы карыстальнікаў %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Група карыстальнікаў паспяхова выдаленая"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Памылка пры выдаленні групы карыстальнікаў"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "Мэтавая група не можа быць той жа самай"
 

	
 
msgid "User group permissions updated"
 
msgstr "Прывілеі групы карыстальнікаў абноўленыя"
 

	
 
msgid "Updated permissions"
 
msgstr "Абноўленыя прывілеі"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Памылка пры захаванні прывілеяў"
 

	
 
msgid "Created user %s"
 
msgstr "Карыстальнік %s створаны"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Памылка пры стварэнні карыстальніка %s"
 

	
 
msgid "User updated successfully"
 
msgstr "Карыстальнік паспяхова абноўлены"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Карыстальнік паспяхова выдалены"
 
@@ -1403,453 +1397,436 @@ msgstr "Новы IP-адрас"
 
msgid "Repository Groups"
 
msgstr "Групы рэпазітароў"
 

	
 
msgid "Group name"
 
msgstr "Імя групы"
 

	
 
msgid "Group parent"
 
msgstr "Бацькоўская група"
 

	
 
msgid "%s Repository Group Settings"
 
msgstr "Налады групы рэпазітароў %s"
 

	
 
msgid "Add Child Group"
 
msgstr "Дадаць падгрупу"
 

	
 
msgid "Settings"
 
msgstr "Налады"
 

	
 
msgid "Advanced"
 
msgstr "Дадаткова"
 

	
 
msgid "Permissions"
 
msgstr "Прывілеі"
 

	
 
msgid "Repository Group: %s"
 
msgstr "Група рэпазітароў: %s"
 

	
 
msgid "Top level repositories"
 
msgstr "Рэпазітары верхняга ўзроўню"
 

	
 
msgid "Created on"
 
msgstr "Створана"
 

	
 
msgid "Confirm to delete this group: %s with %s repository"
 
msgid_plural "Confirm to delete this group: %s with %s repositories"
 
msgstr[0] "Пацвердзіце выдаленне групы %s, утрымоўвалай %s рэпазітар"
 
msgstr[1] "Пацвердзіце выдаленне групы %s, утрымоўвалай %s рэпазітара"
 
msgstr[2] "Пацвердзіце выдаленне групы %s, утрымоўвалай %s рэпазітароў"
 

	
 
msgid "Delete this repository group"
 
msgstr "Выдаліць гэту групу рэпазітароў"
 

	
 
msgid "User/User Group"
 
msgstr "Карыстальнік/група карыстальнікаў"
 

	
 
msgid "Default"
 
msgstr "Па змоўчанні"
 

	
 
msgid "Revoke"
 
msgstr "Адклікаць"
 

	
 
msgid "Add new"
 
msgstr "Дадаць новы"
 

	
 
msgid "Both"
 
msgstr "Абедзьве"
 

	
 
msgid "Remove this group"
 
msgstr "Выдаліць гэту групу"
 

	
 
msgid "Confirm to delete this group"
 
msgstr "Пацвердзіце выдаленне гэтай групы карыстальнікаў"
 

	
 
msgid "Repository Groups Administration"
 
msgstr "Адміністраванне груп рэпазітароў"
 

	
 
msgid "Number of Top-level Repositories"
 
msgstr "Лік рэпазітароў верхняга ўзроўня"
 

	
 
msgid ""
 
"Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr ""
 
"Кароткае і асэнсаванае. Для разгорнутага апісання выкарыстоўвайце файл "
 
"README."
 

	
 
msgid "Optionally select a group to put this repository into."
 
msgstr "Апцыянальна абраць групу, у якую змясціць дадзены рэпазітар."
 

	
 
msgid "Type of repository to create."
 
msgstr "Тып стваранага рэпазітара."
 

	
 
msgid "Landing revision"
 
msgstr "Рэвізія для выгрузкі"
 

	
 
msgid "%s Creating Repository"
 
msgstr "Стварэнне рэпазітара %s"
 

	
 
msgid "Creating repository"
 
msgstr "Стварэнне рэпазітара"
 

	
 
msgid "%s Repository Settings"
 
msgstr "Налады рэпазітара %s"
 

	
 
msgid "Extra Fields"
 
msgstr "Дадатковыя палі"
 

	
 
msgid "Caches"
 
msgstr "Кэшы"
 

	
 
msgid "Remote"
 
msgstr "Выдалены"
 

	
 
msgid "Statistics"
 
msgstr "Статыстыка"
 

	
 
msgid "Parent"
 
msgstr "Бацькоўская група"
 

	
 
msgid "Set"
 
msgstr "Набор"
 

	
 
msgid "Manually set this repository as a fork of another from the list."
 
msgstr "Уручную зрабіць гэты рэпазітар форкам выбранага са спісу."
 

	
 
msgid "Public Journal Visibility"
 
msgstr "Доступ да публічнага журналу"
 

	
 
msgid "Remove from public journal"
 
msgstr "Выдаліць з агульнадаступнага журналу"
 

	
 
msgid "Add to Public Journal"
 
msgstr "Дадаць у публічны журнал"
 

	
 
msgid ""
 
"All actions done in this repository will be visible to everyone in the "
 
"public journal."
 
msgstr ""
 
"Усе выконваемыя з гэтым рэпазітаром дзеянні будуць адлюстроўвацца ў "
 
"публічным журнал."
 

	
 
msgid "Confirm to delete this repository: %s"
 
msgstr "Пацвердзіце выдаленне гэтага рэпазітара: %s"
 

	
 
msgid "Delete this Repository"
 
msgstr "Выдаліць гэты рэпазітар"
 

	
 
msgid "This repository has %s fork"
 
msgid_plural "This repository has %s forks"
 
msgstr[0] "Дадзены рэпазітар мае %s копію"
 
msgstr[1] "Дадзены рэпазітар мае %s копіі"
 
msgstr[2] "Дадзены рэпазітар мае %s копій"
 

	
 
msgid "Detach forks"
 
msgstr "Адлучыць форкі"
 

	
 
msgid "Delete forks"
 
msgstr "Выдаліць форкі"
 

	
 
msgid "Invalidate Repository Cache"
 
msgstr "Скінуць кэш рэпазітара"
 

	
 
msgid ""
 
"Manually invalidate cache for this repository. On first access, the "
 
"repository will be cached again."
 
msgstr "Ручное скіданне кэша рэпазітара. Пры першым доступе кэш адновіцца."
 

	
 
msgid "List of Cached Values"
 
msgstr "Спіс кэшаваных значэнняў"
 

	
 
msgid "Prefix"
 
msgstr "Прэфікс"
 

	
 
msgid "Key"
 
msgstr "Ключ"
 

	
 
msgid "Active"
 
msgstr "Актыўны"
 

	
 
msgid "Confirm to delete this field: %s"
 
msgstr "Пацвердзіце выдаленне гэтага поля: %s"
 

	
 
msgid "New field key"
 
msgstr "Ключ"
 

	
 
msgid "New field label"
 
msgstr "Імя поля"
 

	
 
msgid "Enter short label"
 
msgstr "Увядзіце кароткае імя поля"
 

	
 
msgid "New field description"
 
msgstr "Апісанне поля"
 

	
 
msgid "Enter description of a field"
 
msgstr "Увядзіце апісанне поля"
 

	
 
msgid "Extra fields are disabled."
 
msgstr "Дадатковыя палі адключаныя."
 

	
 
msgid "Private Repository"
 
msgstr "Прыватны рэпазітар"
 

	
 
msgid "Remote repository URL"
 
msgstr "URL аддаленага рэпазітара"
 

	
 
msgid "Pull Changes from Remote Repository"
 
msgstr "Занесці змены з аддаленага рэпазітара"
 

	
 
msgid "Confirm to pull changes from remote repository."
 
msgstr "Пацвердзіце спампоўку змен з аддаленага рэпазітара."
 

	
 
msgid "Remote repository"
 
msgstr "Аддалены рэпазітар"
 

	
 
msgid "Repository URL"
 
msgstr "URL рэпазітара"
 

	
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr ""
 
"Рэвізія па змоўчанні, з якой будзе рабіцца выгрузка файлаў пры спампоўцы"
 

	
 
msgid "Change owner of this repository."
 
msgstr "Змяніць уладальніка рэпазітара."
 

	
 
msgid "Reset Statistics"
 
msgstr "Скід статыстыкі"
 

	
 
msgid "Confirm to remove current statistics."
 
msgstr "Пацвердзіце скіданне статыстыкі."
 

	
 
msgid "Repositories Administration"
 
msgstr "Адміністраванне рэпазітароў"
 

	
 
msgid "State"
 
msgstr "Стан"
 

	
 
msgid "Settings Administration"
 
msgstr "Адміністраванне налад"
 

	
 
msgid "Hooks"
 
msgstr "Хукі"
 

	
 
msgid "Full Text Search"
 
msgstr "Паўнатэкставы пошук"
 

	
 
msgid "System Info"
 
msgstr "Інфармацыя пра сістэму"
 

	
 
msgid "Send test email to"
 
msgstr "Адаслаць тэставае паведамленне на"
 

	
 
msgid "Send"
 
msgstr "Адправіць"
 

	
 
msgid "Site branding"
 
msgstr "Брэндынг сайта"
 

	
 
msgid "HTTP authentication realm"
 
msgstr "Прывітанне для HTTP-аўтэнтыфікацыі"
 

	
 
msgid "Save Settings"
 
msgstr "Захаваць налады"
 

	
 
msgid "Custom Hooks"
 
msgstr "Карыстальніцкія хукі"
 

	
 
msgid "Failed to remove hook"
 
msgstr "Не атрымалася выдаліць хук"
 

	
 
msgid "Delete records of missing repositories"
 
msgstr "Сцерці запісы пра выдаленыя рэпазітары"
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Скінуць кэш для ўсіх рэпазітароў"
 

	
 
msgid "Check this to reload data and clear cache keys for all repositories."
 
msgstr "Скінуць кэш для ўсіх рэпазітароў."
 

	
 
msgid "Index build option"
 
msgstr "Опцыі стварэння індэксу"
 

	
 
msgid "Build from scratch"
 
msgstr "Зборка з нуля"
 

	
 
msgid "Reindex"
 
msgstr "Перабудаваць індэкс"
 

	
 
msgid "Checking for updates..."
 
msgstr "Праверка абнаўленняў..."
 

	
 
msgid "Kallithea version"
 
msgstr "Версія Kallithea"
 

	
 
msgid "Platform"
 
msgstr "Платформа"
 

	
 
msgid "Git version"
 
msgstr "Версія Git"
 

	
 
msgid "Show repository size after push"
 
msgstr "Паказваць памер рэпазітара пасля адпраўкі"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "Абнаўляць рэпазітар пасля адпраўкі (hg update)"
 

	
 
msgid "Mercurial extensions"
 
msgstr "Пашырэнні Mercurial"
 

	
 
msgid "Enable largefiles extension"
 
msgstr "Уключыць падтрымку вялікіх файлаў"
 

	
 
msgid "Enable hgsubversion extension"
 
msgstr "Уключыць падтрымку hgsubversion"
 

	
 
msgid "Location of repositories"
 
msgstr "Месцазнаходжанне рэпазітароў"
 

	
 
msgid ""
 
"Click to unlock. You must restart Kallithea in order to make this setting "
 
"take effect."
 
msgstr ""
 
"Націсніце для разблакавання. Змены набудуць моц пасля перазагрузкі "
 
"Kallithea."
 

	
 
msgid "General"
 
msgstr "Галоўнае"
 

	
 
msgid "Use repository extra fields"
 
msgstr "Выкарыстоўваць дадатковыя палі ў рэпазітарах"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr "Дазваляе захоўваць дадатковыя палі ў рэпазітарах."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Адлюстроўваць версію Kallithea"
 

	
 
msgid ""
 
"Shows or hides a version number of Kallithea displayed in the footer."
 
msgstr "Паказвае або хавае нумар версіі Kallithea ў ніжняй частцы старонкі."
 

	
 
msgid "Icons"
 
msgstr "Абразкі"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Паказваць абразкі публічных рэпазітароў"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Паказваць абразкі прыватных рэпазітароў"
 

	
 
msgid "Show public/private icons next to repository names."
 
msgstr "Паказваць абразкі публічных рэпазітароў."
 

	
 
msgid "Meta Tagging"
 
msgstr "Метатэгаванне"
 

	
 
msgid "Add user group"
 
msgstr "Дадаць групу карыстальнікаў"
 

	
 
msgid "User Groups"
 
msgstr "Групы карыстальнікаў"
 

	
 
msgid "Add User Group"
 
msgstr "Дадаць групу карыстальнікаў"
 

	
 
msgid "Short, optional description for this user group."
 
msgstr "Кароткае дадатковае апісанне для гэтай групы карыстальнікаў."
 

	
 
msgid "Active"
 
msgstr "Актыўны"
 

	
 
msgid "Show Members"
 
msgstr "Паказаць удзельнікаў"
 

	
 
msgid "Members"
 
msgstr "Удзельнікі"
 

	
 
msgid "Confirm to delete this user group: %s"
 
msgstr "Пацвердзіце выдаленне наступнай групы карыстальнікаў: %s"
 

	
 
msgid "Delete this user group"
 
msgstr "Выдаліць гэтую групу карыстальнікаў"
 

	
 
msgid "No members yet"
 
msgstr "Няма ўдзельнікаў"
 

	
 
msgid "Chosen group members"
 
msgstr "Абраныя ўдзельнікі групы"
 

	
 
msgid "Available members"
 
msgstr "Даступныя ўдзельнікі"
 

	
 
msgid "User Groups Administration"
 
msgstr "Адміністраванне груп карыстальнікаў"
 

	
 
msgid "Add user"
 
msgstr "Дадаць карыстальніка"
 

	
 
msgid "Users"
 
msgstr "Карыстальнікі"
 

	
 
msgid "Add User"
 
msgstr "Дадаць карыстальніка"
 

	
 
msgid "Password confirmation"
 
msgstr "Пацверджанне пароля"
 

	
 
msgid "User: %s"
 
msgstr "Карыстальнік: %s"
 

	
 
msgid "Last Login"
 
msgstr "Апошні ўваход"
 

	
 
msgid "Confirm to delete this user: %s"
 
msgstr "Пацвердзіце выдаленне карыстальніка %s"
 

	
 
msgid "Delete this user"
 
msgstr "Выдаліць гэтага карыстальніка"
 

	
 
msgid "New password confirmation"
 
msgstr "Пацвердзіце новы пароль"
 

	
 
msgid "Users Administration"
 
msgstr "Адміністраванне карыстальнікаў"
 

	
 
msgid "Server instance: %s"
 
msgstr "Асобнік сервера: %s"
 

	
 
msgid "Support"
 
msgstr "Падтрымка"
 

	
 
msgid "Mercurial repository"
 
msgstr "Рэпазітар Mercurial"
 

	
 
msgid "Git repository"
 
msgstr "Git рэпазітар"
 

	
 
msgid "Create Fork"
 
msgstr "Стварыць форк"
 

	
 
msgid "Summary"
 
msgstr "Агульныя звесткі"
 

	
 
msgid "Changelog"
 
msgstr "Гісторыя змен"
 

	
 
msgid "Files"
 
msgstr "Файлы"
 

	
 
msgid "Show Pull Requests for %s"
 
msgstr "Паказаць pull-запыты для %s"
 

	
 
msgid "Pull Requests"
 
msgstr "Pull-запыты"
 

	
 
msgid "Options"
 
msgstr "Опцыі"
 

	
 
msgid "Compare Fork"
 
msgstr "Параўнаць форк"
 

	
 
msgid "Compare"
 
msgstr "Параўнаць"
 

	
 
msgid "Search"
 
msgstr "Пошук"
 

	
kallithea/i18n/da/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -393,198 +393,192 @@ msgstr "Der opstod en fejl under oprette
 

	
 
msgid "Created repository group %s"
 
msgstr "Oprettet repository-gruppen %s"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Opdateret repository-gruppen %s"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Der opstod en fejl under opdatering af repository-gruppen %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Denne gruppe indeholder %s repositories og kan ikke slettes"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Denne gruppe indeholder %s undergrupper og kan ikke slettes"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Fjernet repository-gruppen %s"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Der opstod en fejl under sletning af repository-gruppen %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Kan ikke tilbagekalde tilladelse for én selv som admin"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Repository-gruppe tilladelser opdateret"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Der opstod en fejl under tilbagekaldelse af tilladelse"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Fejl ved oprettelse af repository %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Oprettet repository %s fra %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Forked repository %s som %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Oprettet repository %s"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Repository %s opdateret"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Der opstod en fejl under opdatering af repository %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Fraskilt %s forks"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Slettet %s forks"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Slettet repository %s"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Kan ikke slette repository %s, da den stadig har forks"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Der opstod en fejl under sletning af %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Repository tilladelser opdateret"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Feltvaliderings fejl: %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Der opstod en fejl under oprettelse af felt: %r"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Der opstod en fejl under fjernelse af feltet"
 

	
 
msgid "-- Not a fork --"
 
msgstr "-- Ikke en fork --"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "Opdateret repository's synlighed i den offentlige journal"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr ""
 
"Der opstod en fejl under indstilling af dette repository, i den "
 
"offentlige journal"
 

	
 
msgid "Nothing"
 
msgstr "Intet"
 

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "Mærket repository %s som fork af %s"
 

	
 
msgid "An error occurred during this operation"
 
msgstr "Der opstod en fejl under denne operation"
 

	
 
msgid "Cache invalidation successful"
 
msgstr "Ugyldiggørelse af cache er succesfuld"
 

	
 
msgid "An error occurred during cache invalidation"
 
msgstr "Der opstod en fejl under cache ugyldiggørelse"
 

	
 
msgid "An error occurred during pull from remote location"
 
msgstr "Der opstod en fejl under pull fra remote placering"
 

	
 
msgid "An error occurred during deletion of repository stats"
 
msgstr "Der opstod en fejl under sletning af repository statistik"
 

	
 
msgid "Updated VCS settings"
 
msgstr "Opdateret VCS-indstillinger"
 

	
 
msgid ""
 
"Unable to activate hgsubversion support. The \"hgsubversion\" library is "
 
"missing"
 
msgstr ""
 
"Ude af stand til at aktivere hgsubversion understøttelse. \"hgsubversion"
 
"\" biblioteket mangler"
 

	
 
msgid "Error occurred while updating application settings"
 
msgstr "Der opstod en fejl ved opdatering af applikationsindstillinger"
 

	
 
msgid "Repositories successfully rescanned. Added: %s. Removed: %s."
 
msgstr "Repositories genscannet successfuldt. Tilføjet: %s. Fjernet: %s."
 

	
 
msgid "Invalidated %s repositories"
 
msgstr "Ugyldiggjort %s repositories"
 

	
 
msgid "Updated application settings"
 
msgstr "Opdateret applikationsindstillinger"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Opdateret visualiseringsindstillinger"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "Der opstod en fejl under opdatering af visualiseringsindstillinger"
 

	
 
msgid "Please enter email address"
 
msgstr "Indtast email-adresse"
 

	
 
msgid "Send email task created"
 
msgstr "Send email-opgave oprettet"
 

	
 
msgid "Added new hook"
 
msgstr "Tilføjet nyt hook"
 

	
 
msgid "Updated hooks"
 
msgstr "Opdateret hooks"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Der opstod en fejl under oprettelse af et hook"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Whoosh reindex-opgave skeduleret"
 

	
 
msgid "Created user group %s"
 
msgstr "Oprettet brugergruppe %s"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "Der opstod en fejl under oprettelse af brugergruppe %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Opdateret brugergruppe %s"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr "Der opstod en fejl under opdatering af brugergruppe %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Brugergruppe slettet succesfuldt"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Der opstod en fejl under sletning af brugergruppe"
 

	
 
msgid "User group permissions updated"
 
msgstr "Brugergrupper-tilladelser opdateret"
 

	
 
msgid "Updated permissions"
 
msgstr "Tilladelser opdateret"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Der opstod en fejl under gemning af tilladelser"
 

	
 
msgid "Created user %s"
 
msgstr "Bruger %s oprettet"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Der opstod en fejl under oprettelse af bruger %s"
 

	
 
msgid "User updated successfully"
 
msgstr "Bruger opdateret"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Slettet bruger"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Der opstod en fejl under sletning af bruger %s"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "Standardbrugeren kan ikke redigeres"
kallithea/i18n/de/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -225,396 +225,390 @@ msgstr "Keine Beschreibung"
 

	
 
msgid "Pull request updated"
 
msgstr "Pull Request aktualisiert"
 

	
 
msgid "Successfully deleted pull request"
 
msgstr "Erfolgreich Pull-Request gelöscht"
 

	
 
msgid "Revision %s not found in %s"
 
msgstr "Die Revision %s konnte in %s nicht gefunden werden"
 

	
 
msgid "This pull request has already been merged to %s."
 
msgstr "Dieser Pull Request wurde bereits in %s integriert."
 

	
 
msgid "This pull request has been closed and can not be updated."
 
msgstr ""
 
"Dieser Pull Request wurde geschlossen und kann daher nicht aktualisiert "
 
"werden."
 

	
 
msgid "Note: Branch %s has another head: %s."
 
msgstr "Hinweis: Branch %s hat einen anderen Head: %s."
 

	
 
msgid "The diff can't be shown - the PR revisions could not be found."
 
msgstr ""
 
"Der diff kann nicht angezeigt werden. Die Pull Request Revisionen konnten "
 
"nicht gefunden werden."
 

	
 
msgid "Invalid search query. Try quoting it."
 
msgstr ""
 
"Ungültige Suchanfrage. Versuchen sie es in Anführungzeichen zu setzen."
 

	
 
msgid "The server has no search index."
 
msgstr "Der Server hat keinen Suchindex."
 

	
 
msgid "An error occurred during search operation."
 
msgstr "Während der Suchoperation trat ein Fehler auf."
 

	
 
msgid "No data ready yet"
 
msgstr "Es stehen noch keine Daten zur Verfügung"
 

	
 
msgid "Statistics are disabled for this repository"
 
msgstr "Statistiken sind deaktiviert für dieses Repository"
 

	
 
msgid "Auth settings updated successfully"
 
msgstr "Anmeldeeinstellungen erfolgreich geändert"
 

	
 
msgid "error occurred during update of auth settings"
 
msgstr "Fehler bei der Änderung der Anmeldeeinstellungen aufgetreten"
 

	
 
msgid "Default settings updated successfully"
 
msgstr "Standardeinstellungen erfolgreich geupdated"
 

	
 
msgid "Error occurred during update of defaults"
 
msgstr "Ein Fehler trat beim updaten der Standardeinstellungen auf"
 

	
 
msgid "Forever"
 
msgstr "Immer"
 

	
 
msgid "5 minutes"
 
msgstr "5 Minuten"
 

	
 
msgid "1 hour"
 
msgstr "1 Stunde"
 

	
 
msgid "1 day"
 
msgstr "1 Tag"
 

	
 
msgid "1 month"
 
msgstr "1 Monat"
 

	
 
msgid "Lifetime"
 
msgstr "Lebenszeit"
 

	
 
msgid "Error occurred during gist creation"
 
msgstr "Ein fehler trat auf bei der Erstellung des gist"
 

	
 
msgid "Deleted gist %s"
 
msgstr "gist %s gelöscht"
 

	
 
msgid "Unmodified"
 
msgstr "Ungeändert"
 

	
 
msgid "Successfully updated gist content"
 
msgstr "Erfolgreich Kerninhalt aktualisiert"
 

	
 
msgid "Successfully updated gist data"
 
msgstr "Erfolgreich Kerndaten aktualisiert"
 

	
 
msgid "Error occurred during update of gist %s"
 
msgstr "Fehler beim Aktualisieren der Kerndaten %s"
 

	
 
msgid "You can't edit this user since it's crucial for entire application"
 
msgstr ""
 
"Sie können diesen Benutzer nicht editieren, da er von entscheidender "
 
"Bedeutung für die ganze Applikation ist"
 

	
 
msgid "Your account was updated successfully"
 
msgstr "Ihr Account wurde erfolgreich aktualisiert"
 
msgstr "Ihr Konto wurde erfolgreich aktualisiert"
 

	
 
msgid "Error occurred during update of user %s"
 
msgstr "Fehler beim Aktualisieren der Benutzer %s"
 

	
 
msgid "Error occurred during update of user password"
 
msgstr "Fehler bei der Änderung des Kennworts"
 

	
 
msgid "Added email %s to user"
 
msgstr "Die EMail Addresse %s wurde zum Benutzer hinzugefügt"
 
msgstr "Die E-Mail-Addresse %s wurde zum Benutzer hinzugefügt"
 

	
 
msgid "An error occurred during email saving"
 
msgstr "Währen der Speicherung der EMail Addresse trat ein Fehler auf"
 
msgstr "Währen der Speicherung der E-Mail-Addresse trat ein Fehler auf"
 

	
 
msgid "Removed email from user"
 
msgstr "Die EMail Addresse wurde vom Benutzer entfernt"
 
msgstr "Die E-Mail-Addresse wurde vom Benutzer entfernt"
 

	
 
msgid "API key successfully created"
 
msgstr "API Key wurde erfolgreich erstellt"
 

	
 
msgid "API key successfully reset"
 
msgstr "API-Schlüssel erfolgreich zurückgesetzt"
 

	
 
msgid "API key successfully deleted"
 
msgstr "API-Schlüssel erfolgreich gelöscht"
 

	
 
msgid "Read"
 
msgstr "Lesen"
 

	
 
msgid "Write"
 
msgstr "Schreiben"
 

	
 
msgid "Admin"
 
msgstr "Admin"
 

	
 
msgid "Disabled"
 
msgstr "Deaktiviert"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Erlaubt mit manueller Kontoaktivierung"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Erlaubt mit automatischer Kontoaktivierung"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Manuelle Aktivierung externen Kontos"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Automatische Aktivierung externen Kontos"
 

	
 
msgid "Enabled"
 
msgstr "Aktiviert"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Globale Berechtigungen erfolgreich geändert"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Fehler bei der Änderung der globalen Berechtigungen"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Fehler bei der Erstellung der Repositoriumsgruppe %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Repositoriumsgruppe %s erstellt"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Repositoriumsgruppe %s aktualisiert"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Fehler bei der Aktualisierung der Repositoriumsgruppe %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Die Gruppe enthält %s Repositorys und kann nicht gelöscht werden"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Diese Gruppe enthält %s Untergruppen und kann nicht gelöscht werden"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Repositoriumsgruppe %s entfernt"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Fehler beim Löschen der Repositoriumsgruppe %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Als Administrator kann man sich keine Berechtigungen entziehen"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Berechtigungen der Repositoriumsgruppe aktualisiert"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Fehler beim Entzug der Berechtigungen"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Fehler beim Erstellen des Repositoriums %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Repositorium %s von %s erstellt"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Aufgespaltenes Repositorium %s zu %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Repositorium erzeugt %s"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Repository %s wurde erfolgreich aktualisiert"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Fehler bei der Aktualisierung des Repositoriums %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "%s Spaltung abgetrennt"
 

	
 
msgid "Deleted %s forks"
 
msgstr "%s Spaltung gelöscht"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Repositorium %s gelöscht"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "%s konnte nicht gelöscht werden, da es noch Forks besitzt"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Beim Löschen von %s trat ein Fehler auf"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Repositoriumsberechtigungen aktualisiert"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Feldvalidierung fehlgeschlagen: %s"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Fehler beim Entfernen des Feldes"
 

	
 
msgid "-- Not a fork --"
 
msgstr "-- Keine Abspaltung --"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "Sichtbarkeit des Repositorys im Öffentlichen Logbuch aktualisiert"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr ""
 
"Es trat ein Fehler während der Aktualisierung der Sicherbarkeit dieses "
 
"Repositorys im Öffentlichen Logbuch auf"
 

	
 
msgid "Nothing"
 
msgstr "Nichts"
 

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "Markiere Repository %s als Abzweig von Repository %s"
 

	
 
msgid "An error occurred during this operation"
 
msgstr "Während dieser operation trat ein Fehler auf"
 

	
 
msgid "Cache invalidation successful"
 
msgstr "Cache Entfernung war erfolgreich"
 

	
 
msgid "An error occurred during cache invalidation"
 
msgstr "Währen der Cache Invalidierung trat ein Fehler auf"
 

	
 
msgid "Pulled from remote location"
 
msgstr "Von entferntem Ort übertragen"
 

	
 
msgid "An error occurred during pull from remote location"
 
msgstr ""
 
"Es trat ein Fehler auf während das Repository von einem Entfernten "
 
"Speicherort übertragen wurde"
 

	
 
msgid "An error occurred during deletion of repository stats"
 
msgstr "Während des löschens der Repository Statistiken trat ein Fehler auf"
 

	
 
msgid "Updated VCS settings"
 
msgstr "VCS-Einstellungen aktualisiert"
 

	
 
msgid ""
 
"Unable to activate hgsubversion support. The \"hgsubversion\" library is "
 
"missing"
 
msgstr ""
 
"hgsubversion-Unterstützung konnte nicht aktiviert werden. Die "
 
"\"hgsubversion\"-Bibliothek fehlt"
 

	
 
msgid "Error occurred while updating application settings"
 
msgstr ""
 
"Ein Fehler ist während der Aktualisierung der Applikationseinstellungen "
 
"aufgetreten"
 

	
 
msgid "Repositories successfully rescanned. Added: %s. Removed: %s."
 
msgstr ""
 
"Die Repositories wurden erfolgreich überprüft. Hinzugefügt: %s. Entfernt: "
 
"%s."
 

	
 
msgid "Updated application settings"
 
msgstr "Anwendungseinstellungen aktualisiert"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Visualisierungseinstellungen aktualisiert"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr ""
 
"Es ist ein Fehler während der Aktualisierung der Layouteinstellung "
 
"aufgetreten"
 

	
 
msgid "Please enter email address"
 
msgstr "Bitte gebe eine E-Mailadresse an"
 
msgstr "Bitte geben Sie eine E-Mail-Adresse an"
 

	
 
msgid "Send email task created"
 
msgstr "Task zum Versenden von E-Mails erstellt"
 

	
 
msgid "Builtin hooks are read-only. Please use another hook name."
 
msgstr ""
 
"Die eingebauten Hooks sind schreibgeschützt. Bitte verwenden Sie einen "
 
"anderen Hook-Namen."
 

	
 
msgid "Added new hook"
 
msgstr "Neuer Hook hinzugefügt"
 

	
 
msgid "Updated hooks"
 
msgstr "Die Hooks wurden aktutalisiert"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Während der Erzeugung des Hooks ist ein Fehler aufgetreten"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Whoosh Reindizierungs Aufgabe wurde zur Ausführung geplant"
 

	
 
msgid "Created user group %s"
 
msgstr "Nutzergruppe %s erstellt"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr ""
 
"Es ist ein Fehler während der Erstellung der Nutzergruppe %s aufgetreten"
 

	
 
msgid "Updated user group %s"
 
msgstr "Aktualisierte Nutzergruppe %s"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr ""
 
"Während des Updates der Benutzergruppe %s ist ein Fehler aufgetreten"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Die Nutzergruppe wurde erfolgreich entfernt"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr "Während des Löschens der Benutzergruppe ist ein Fehler aufgetreten"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "Zielgruppe kann nicht die gleiche Gruppe sein"
 

	
 
msgid "User group permissions updated"
 
msgstr "Berechtigungen der Benutzergruppe wurden aktualisiert"
 

	
 
msgid "Updated permissions"
 
msgstr "Berechtigungen wurden aktualisiert"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr ""
 
"Es ist ein Fehler während des Speicherns der Berechtigungen aufgetreten"
 

	
 
msgid "Created user %s"
 
msgstr "Nutzer %s erstellt"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Während des Erstellens des Benutzers %s ist ein Fehler aufgetreten"
 

	
 
msgid "User updated successfully"
 
msgstr "Der Benutzer wurde erfolgreich aktualisiert"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Der Nutzer wurde erfolgreich gelöscht"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Während der Löschen des Benutzers trat ein Fehler auf"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "Der Standard-Benutzer kann nicht bearbeitet werden"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "Die IP-Adresse %s wurde zur Nutzerwhitelist hinzugefügt"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Während des Speicherns der IP-Adresse ist ein Fehler aufgetreten"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "IP-Adresse wurde von der Nutzerwhitelist entfernt"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr ""
 
"Sie müssen ein Registrierter Nutzer sein um diese Aktion durchzuführen"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Sie müssen sich anmelden um diese Seite aufzurufen"
 

	
 
msgid ""
 
"CSRF token leak has been detected - all form tokens have been expired"
 
msgstr ""
 
"Es wurde ein CSRF Leck entdeckt. Alle Formular Token sind abgelaufen"
 

	
 
msgid "Repository not found in the filesystem"
 
msgstr "Das Repository konnte nicht im Filesystem gefunden werden"
 

	
 
@@ -962,293 +956,306 @@ msgstr ""
 
msgid "Password reset link"
 
msgstr "Link zum Zurücksetzen des Passworts"
 

	
 
msgid ""
 
"The password to your account %s has been changed using password reset "
 
"form."
 
msgstr ""
 
"Das Passwort für dein Konto %s wurde mit dem Formular zum Zurücksetzen "
 
"des Passworts geändert."
 

	
 
msgid "Value cannot be an empty list"
 
msgstr "Eine leere Liste ist kein gültiger Wert"
 

	
 
msgid "Username \"%(username)s\" already exists"
 
msgstr "Benutezrname \"%(username)s\" existiert bereits"
 

	
 
msgid "The input is not valid"
 
msgstr "Die Eingabe ist nicht gültig"
 

	
 
msgid "Username %(username)s is not valid"
 
msgstr "Benutzername \"%(username)s\" ist ungültig"
 

	
 
msgid "Invalid user group name"
 
msgstr "Ungültiger Benutzergruppenname"
 

	
 
msgid "User group \"%(usergroup)s\" already exists"
 
msgstr "Benutzergruppe \"%(usergroup)s\" existiert bereits"
 

	
 
msgid ""
 
"user group name may only contain alphanumeric characters underscores, "
 
"periods or dashes and must begin with alphanumeric character"
 
msgstr ""
 
"Der Name einer Benutzergruppe darf nur alphanumerische Zeichen, "
 
"Unterstriche, Punkte oder Bindestriche enthalten und muss mit einem "
 
"alphanumerischen Zeichen beginnen"
 

	
 
msgid "Cannot assign this group as parent"
 
msgstr "Kann diese Gruppe nicht als vorgesetzt setzen"
 

	
 
msgid "Group \"%(group_name)s\" already exists"
 
msgstr "Gruppe \"%(group_name)s\" existiert bereits"
 

	
 
msgid "Repository with name \"%(group_name)s\" already exists"
 
msgstr "Es gibt bereits ein Repository mit \"%(group_name)s\""
 

	
 
msgid "Invalid characters (non-ascii) in password"
 
msgstr "Üngültige(nicht ASCII) Zeichen im Passwort"
 

	
 
msgid "Invalid old password"
 
msgstr "Ungültiges altes Passwort"
 

	
 
msgid "Passwords do not match"
 
msgstr "Die Passwörter stimmen nicht überein"
 

	
 
msgid "Repository named %(repo)s already exists"
 
msgstr "Es gibt bereits ein Repository mit \"%(repo)s\""
 

	
 
msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 
msgstr ""
 
"Es gibt bereits ein Repository mit \"%(repo)s\" in der Gruppe \"%(group)s"
 
"\""
 

	
 
msgid "Repository group with name \"%(repo)s\" already exists"
 
msgstr "Eine Repositorygruppe mit dem Namen \"%(repo)s\" existiert bereits"
 

	
 
msgid "Invalid repository URL"
 
msgstr "Ungültige Repository-URL"
 

	
 
msgid ""
 
"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
 
"svn+https URL"
 
msgstr ""
 
"Ungültige Repository-URL. Es muss eine gültige http, https, ssh, svn+http "
 
"oder svn+https URL sein"
 

	
 
msgid "Fork has to be the same type as parent"
 
msgstr "Forke um den selben typ wie der Vorgesetze zu haben"
 

	
 
msgid "You don't have permissions to create repository in this group"
 
msgstr ""
 
"Du hast nicht die erforderlichen Berechtigungen, um in dieser Gruppe ein "
 
"Repository zu erzeugen"
 

	
 
msgid "no permission to create repository in root location"
 
msgstr "keine Berechtigung, um ein Repository auf höchster Ebene anzulegen"
 

	
 
msgid "You don't have permissions to create a group in this location"
 
msgstr ""
 
"Sie haben keine Berechtigung, um an diesem Ort ein Repository anzulegen"
 

	
 
msgid "This username or user group name is not valid"
 
msgstr "Dieser Benutzername oder Benutzergruppenname ist nicht gültig"
 

	
 
msgid "This is not a valid path"
 
msgstr "Dies ist ein Ungültiger Pfad"
 

	
 
msgid "This email address is already in use"
 
msgstr "Diese E-Mail-Addresse ist bereits in Benutzung"
 

	
 
msgid "Email address \"%(email)s\" not found"
 
msgstr "E-Mail-Addresse „%(email)s“ existiert nicht."
 

	
 
msgid ""
 
"The LDAP Login attribute of the CN must be specified - this is the name "
 
"of the attribute that is equivalent to \"username\""
 
msgstr ""
 
"Das LDAP-Login-Attribut des CN muss angeben werden - Es ist der Name des "
 
"Attributes äquivalent zu \"Benutzername\""
 

	
 
msgid "Please enter a valid IPv4 or IPv6 address"
 
msgstr "Bitte eine gültige IPv4- oder IPv6-Adresse angeben"
 

	
 
msgid ""
 
"The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 
msgstr ""
 
"Die Größe (in Bits) des Netzwerks muss im Bereich 0-32 liegen (nicht "
 
"%(bits)r)"
 

	
 
msgid "Key name can only consist of letters, underscore, dash or numbers"
 
msgstr ""
 
"Der Name eines Schlüssels darf nur aus Buchstaben, Ziffern, Unterstrich "
 
"und Bindestrich bestehen"
 

	
 
msgid "Filename cannot be inside a directory"
 
msgstr "Dateiname darf kein Unterverzeichnis enthalten"
 

	
 
msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 
msgstr ""
 
"Die Plug-Ins %(loaded)s und %(next_to_load)s exportieren beide den selben "
 
"Namen"
 

	
 
msgid "About"
 
msgstr "Über"
 

	
 
msgid "Add Repository"
 
msgstr "Repository hinzufügen"
 

	
 
msgid "Add Repository Group"
 
msgstr "Repositorygruppe hinzufügen"
 

	
 
msgid "You have admin right to this group, and can edit it"
 
msgstr "Du hast Adminrechte für diese Gruppe und kannst sie editieren"
 

	
 
msgid "Edit Repository Group"
 
msgstr "Repositorygruppe bearbeiten"
 

	
 
msgid "Repository"
 
msgstr "Repository"
 

	
 
msgid "Description"
 
msgstr "Beschreibung"
 

	
 
msgid "Last Change"
 
msgstr "Letzte Änderung"
 

	
 
msgid "Tip"
 
msgstr "Tipp"
 

	
 
msgid "Owner"
 
msgstr "Besitzer"
 

	
 
msgid "Log In"
 
msgstr "Log In"
 

	
 
msgid "Log In to %s"
 
msgstr "Log In in %s"
 

	
 
msgid "Username"
 
msgstr "Benutzername"
 

	
 
msgid "Password"
 
msgstr "Passwort"
 

	
 
msgid "Stay logged in after browser restart"
 
msgstr "Nach dem Neustart des Browsers eingeloggt bleiben"
 

	
 
msgid "Forgot your password ?"
 
msgstr "Passowrt Vergessen?"
 

	
 
msgid "Don't have an account ?"
 
msgstr "Kein Account?"
 

	
 
msgid "Sign In"
 
msgstr "Einloggen"
 

	
 
msgid "Password Reset"
 
msgstr "Passwort zurücksetzen"
 

	
 
msgid "Reset Your Password to %s"
 
msgstr "Setze dein Passwort auf %s zurück"
 

	
 
msgid "Reset Your Password"
 
msgstr "Setze dein Passwort zurück"
 

	
 
msgid "Email Address"
 
msgstr "E-Mailadresse"
 
msgstr "E-Mail-Adresse"
 

	
 
msgid "Captcha"
 
msgstr "CAPTCHA"
 

	
 
msgid "Send Password Reset Email"
 
msgstr "E-Mail zum Zurücksetzen des Passworts anfordern"
 

	
 
msgid ""
 
"A password reset link will be sent to the specified email address if it "
 
"is registered in the system."
 
msgstr ""
 
"Ein Link zum Zurücksetzen des Passworts wird an die angegebene E-Mail-"
 
"Adresse gesendet, wenn diese im System registriert ist."
 

	
 
msgid "You are about to set a new password for the email address %s."
 
msgstr ""
 
"Du bist dabei, ein neues Passwort für die E-Mail-Adresse %s festzulegen."
 

	
 
msgid ""
 
"Note that you must use the same browser session for this as the one used "
 
"to request the password reset."
 
msgstr ""
 
"Beachten Sie, dass Sie dafür die gleiche Browsersitzung verwenden müssen, "
 
"mit der Sie das Zurücksetzen des Passworts beantragt haben."
 

	
 
msgid "Code you received in the email"
 
msgstr "Code, den du in der E-Mail erhalten hast"
 

	
 
msgid "Confirm"
 
msgstr "Bestätigen"
 

	
 
msgid "Sign Up"
 
msgstr "Registrieren"
 

	
 
msgid "Sign Up to %s"
 
msgstr "Registrieren für %s"
 

	
 
msgid "Re-enter password"
 
msgstr "Passwort erneut eingeben"
 

	
 
msgid "First Name"
 
msgstr "Vorname"
 

	
 
msgid "Last Name"
 
msgstr "Nachname"
 

	
 
msgid "Email"
 
msgstr "E-Mail"
 

	
 
msgid "Registered accounts are ready to use and need no further action."
 
msgstr "Registrierte Konten können ohne weitere Aktion genutzt werden."
 

	
 
msgid "Please wait for an administrator to activate your account."
 
msgstr ""
 
"Bitte warten Sie auf die Aktivierung Ihres Benutzerkontos durch einen "
 
"Administrator."
 

	
 
msgid "Admin Journal"
 
msgstr "Admin-Logbuch"
 

	
 
msgid "journal filter..."
 
msgstr "Logbuch filter..."
 

	
 
msgid "Filter"
 
msgstr "Filter"
 

	
 
msgid "%s Entry"
 
msgid_plural "%s Entries"
 
msgstr[0] "%s Eintrag"
 
msgstr[1] "%s Einträge"
 

	
 
msgid "Action"
 
msgstr "Aktion"
 

	
 
msgid "Date"
 
msgstr "Datum"
 

	
 
msgid "From IP"
 
msgstr "Von IP"
 

	
 
msgid "No actions yet"
 
msgstr "Es sind bisher keine Aktionen passiert"
 

	
 
msgid "Authentication Settings"
 
msgstr "Authentifizierungseinstellungen"
 

	
 
msgid "Authentication"
 
msgstr "Authentifizierung"
 

	
 
msgid "Authentication Plugins"
 
msgstr "Plug-Ins zur Authentifizierung"
 

	
 
msgid "Enabled Plugins"
 
msgstr "Aktivierte Plugins"
 

	
 
msgid "Available built-in plugins"
 
msgstr "Verfügbare mitgelieferte Plug-Ins"
 

	
 
msgid "Plugin"
 
msgstr "Plugin"
 

	
 
msgid "Save"
 
msgstr "Speichern"
 

	
 
msgid "Repository Defaults"
 
msgstr "Repositorystandards"
 

	
 
msgid "Type"
 
msgstr "Typ"
 

	
 
@@ -1343,193 +1350,193 @@ msgstr "Öffentlicher Gist"
 

	
 
msgid "Private Gist"
 
msgstr "Privater Gist"
 

	
 
msgid "Delete"
 
msgstr "Löschen"
 

	
 
msgid "Confirm to delete this Gist"
 
msgstr "Löschen des Gists bestätigen"
 

	
 
msgid "Edit"
 
msgstr "Bearbeiten"
 

	
 
msgid "Show as Raw"
 
msgstr "Als Raw anzeigen"
 

	
 
msgid "created"
 
msgstr "erstellt"
 

	
 
msgid "Show as raw"
 
msgstr "Als Raw anzeigen"
 

	
 
msgid "My Account"
 
msgstr "Mein Account"
 

	
 
msgid "Profile"
 
msgstr "Profil"
 

	
 
msgid "Email Addresses"
 
msgstr "E-Mail-Adressen"
 

	
 
msgid "API Keys"
 
msgstr "API Keys"
 

	
 
msgid "Owned Repositories"
 
msgstr "Eigene Repositories"
 

	
 
msgid "Watched Repositories"
 
msgstr "Beobachtete Repositories"
 

	
 
msgid "Show Permissions"
 
msgstr "Berechtigungen anzeigen"
 

	
 
msgid "Built-in"
 
msgstr "Mitgeliefert"
 

	
 
msgid "Confirm to reset this API key: %s"
 
msgstr "Zurücksetzen des API-Schlüssels \"%s\" bestätigen"
 

	
 
msgid "Expired"
 
msgstr "Verfallen"
 

	
 
msgid "Confirm to remove this API key: %s"
 
msgstr "Entfernen des API-Schlüssels \"%s\" bestätigen"
 

	
 
msgid "Remove"
 
msgstr "Entfernen"
 

	
 
msgid "No additional API keys specified"
 
msgstr "Keine weiteren API-Schlüssel angegeben"
 

	
 
msgid "New API key"
 
msgstr "Neuer API-Schlüssel"
 

	
 
msgid "Add"
 
msgstr "Hinzufügen"
 

	
 
msgid ""
 
"\n"
 
"API keys are used to let scripts or services access %s using your\n"
 
"account, as if you had provided the script or service with your actual\n"
 
"password.\n"
 
msgstr ""
 
"\n"
 
"API-Schlüssel werden verwendet, um Skripten oder Diensten denselben\n"
 
"Zugang zu %s zu gewähren, den Sie mit Eingabe Ihres Passworts\n"
 
"erlangen würden.\n"
 

	
 
msgid ""
 
"\n"
 
"Like passwords, API keys should therefore never be shared with others,\n"
 
"nor passed to untrusted scripts or services. If such sharing should\n"
 
"happen anyway, reset the API key on this page to prevent further use.\n"
 
msgstr ""
 
"\n"
 
"Ebenso wie Passworte, sollten API-Schlüssel somit niemals mit anderen\n"
 
"geteilt oder von nicht-vertrauenswürdigen Skripten oder Diensten\n"
 
"verwendet werden. Falls ein solcher Zugriff zwischenzeitlich passiert "
 
"sein\n"
 
"sollte, dann können Sie hier den API-Schlüssel zurücksetzen, um weiteren\n"
 
"Missbrauchen zu verhindern.\n"
 

	
 
msgid "Primary"
 
msgstr "Primär"
 

	
 
msgid "Confirm to delete this email: %s"
 
msgstr "Löschen der E-Mail \"%s\" bestätigen"
 
msgstr "Löschen der E-Mail %s bestätigen"
 

	
 
msgid "No additional emails specified."
 
msgstr "Keine weiteren E-Mails spezifiziert."
 

	
 
msgid "New email address"
 
msgstr "Neue E-Mailadresse"
 

	
 
msgid "Change Your Account Password"
 
msgstr "Passwort des Benutzerkontos ändern"
 

	
 
msgid "Current password"
 
msgstr "Aktuelles Passwort"
 

	
 
msgid "New password"
 
msgstr "Neues Passwort"
 

	
 
msgid "Confirm new password"
 
msgstr "Bestätige neues Passwort"
 

	
 
msgid ""
 
"This account is managed with %s and the password cannot be changed here"
 
msgstr ""
 
"Dieser Account wird mit %s verwaltet - daher kann das Passwort nicht "
 
"geändert werden"
 

	
 
msgid "Gravatar"
 
msgstr "Gravatar"
 

	
 
msgid "Change %s avatar at"
 
msgstr "Benutzerbild %s ändern unter"
 

	
 
msgid "Avatars are disabled"
 
msgstr "Avatare sind deaktiviert"
 

	
 
msgid "Repositories You Own"
 
msgstr "Repositories in Ihrem Besitz"
 

	
 
msgid "Name"
 
msgstr "Name"
 

	
 
msgid "Repositories You are Watching"
 
msgstr "Repositories, denen Sie folgen"
 

	
 
msgid "Default Permissions"
 
msgstr "Standardrechte"
 

	
 
msgid "Global"
 
msgstr "Global"
 

	
 
msgid "IP Whitelist"
 
msgstr "IP Whitelist"
 

	
 
msgid "Anonymous access"
 
msgstr "Anonymer Zugang"
 

	
 
msgid ""
 
"Allow access to Kallithea without needing to log in. Anonymous users use "
 
"%s user permissions."
 
msgstr ""
 
"Unauthentifizierten Zugriff auf Kallithea erlauben. Anonyme Benutzer "
 
"verwenden %s Benutzerrechte."
 

	
 
msgid ""
 
"All default permissions on each repository will be reset to chosen "
 
"permission, note that all custom default permission on repositories will "
 
"be lost"
 
msgstr ""
 
"Alle Standardrechte jedes Repositorys werden auf die gewählten Rechte "
 
"gesetzt. Beachten Sie, dass alle spezifischen Standardrechte der "
 
"Repositories verloren gehen"
 

	
 
msgid "Apply to all existing repositories"
 
msgstr "Auf alle bestehenden Repositories anwenden"
 

	
 
msgid "Permissions for the Default user on new repositories."
 
msgstr "Berechtigungen für neue Repositories des Vorgabe-Benutzers."
 

	
 
msgid "Repository group"
 
msgstr "Repository Gruppe"
 

	
 
msgid ""
 
"All default permissions on each repository group will be reset to chosen "
 
"permission, note that all custom default permission on repository groups "
 
"will be lost"
 
msgstr ""
 
"Alle Standardrechte jeder Repositorygruppe werden auf die gewählten "
 
"Rechte gesetzt. Beachten Sie, dass all spezifischen Standardrechte der "
 
"Repositorygruppen verloren gehen"
 

	
 
msgid "Apply to all existing repository groups"
 
msgstr "Auf alle bestehenden Repository-Gruppen anwenden"
 

	
 
msgid "Permissions for the Default user on new repository groups."
 
msgstr "Berechtigungen des Vorgabe-Benutzers für neue Repository-Gruppen."
 

	
 
msgid "User group"
 
@@ -1671,278 +1678,256 @@ msgstr "Vorgabe"
 
msgid "Revoke"
 
msgstr "Zurückziehen"
 

	
 
msgid "Add new"
 
msgstr "Neues hinzufügen"
 

	
 
msgid "Apply to children"
 
msgstr "Auf untergeordnete Elemente anwenden"
 

	
 
msgid "Both"
 
msgstr "Beide"
 

	
 
msgid ""
 
"Set or revoke permission to all children of that group, including non-"
 
"private repositories and other groups if selected."
 
msgstr ""
 
"Setzen oder zurückziehen von Berechtigungen bezüglich aller "
 
"untergeordneten Elemente, einschließlich nicht-privater Repositories und "
 
"anderer Gruppen, falls ausgewählt."
 

	
 
msgid "Remove this group"
 
msgstr "Diese Gruppe löschen"
 

	
 
msgid "Confirm to delete this group"
 
msgstr "Löschen der Gruppe bestätigen"
 

	
 
msgid "Repository group %s"
 
msgstr "Repository-Gruppe %s"
 

	
 
msgid "Repository Groups Administration"
 
msgstr "Repositorygruppenverwaltung"
 

	
 
msgid "Number of Top-level Repositories"
 
msgstr "Anzahl der Repositories oberster Ebene"
 

	
 
msgid "Clone remote repository"
 
msgstr "Entferntes Repository clonen"
 

	
 
msgid ""
 
"Optional: URL of a remote repository. If set, the repository will be "
 
"created as a clone from this URL."
 
msgstr ""
 
"Optional: URL eines entfernten Repositories. Falls gesetzt, dann wird das "
 
"Repository als Clon von dieser URL erstellt."
 

	
 
msgid ""
 
"Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr ""
 
"Halten Sie es kurz und prägnant. Benutzen Sie eine README-Datei für "
 
"längere Beschreibungen."
 

	
 
msgid "Optionally select a group to put this repository into."
 
msgstr ""
 
"Wähle bei Bedarf eine Gruppe, der dieses Repository zugeordnet werden "
 
"soll."
 

	
 
msgid "Type of repository to create."
 
msgstr "Repository Typ der erstellt werden soll."
 

	
 
msgid "Landing revision"
 
msgstr "Start Revision"
 

	
 
msgid ""
 
"Default revision for files page, downloads, full text search index and "
 
"readme generation"
 
msgstr ""
 
"Vorgabe-Revision für Datei-Seiten, Downloads, Volltext-Indizierung und "
 
"Doku-Erzeugung"
 

	
 
msgid "%s Creating Repository"
 
msgstr "%s Erstelle Repository"
 

	
 
msgid "Creating repository"
 
msgstr "Repository erzeugen"
 

	
 
msgid ""
 
"Repository \"%(repo_name)s\" is being created, you will be redirected "
 
"when this process is finished.repo_name"
 
msgstr ""
 
"Repository \"%(repo_name)s\" wird erzeugt. Sie werden dorthin umgeleitet, "
 
"sobald der Prozess abgeschlossen ist."
 

	
 
msgid ""
 
"We're sorry but error occurred during this operation. Please check your "
 
"Kallithea server logs, or contact administrator."
 
msgstr ""
 
"Bedauerlicherweise ist bei dieser Operation ein Fehler aufgetreten. Bitte "
 
"prüfen Sie die Kallithea-Server-Logs or kontaktieren Sie die "
 
"Administrierenden."
 

	
 
msgid "%s Repository Settings"
 
msgstr "%s Repositoryeinstellungen"
 

	
 
msgid "Extra Fields"
 
msgstr "Extra-Feld"
 

	
 
msgid "Caches"
 
msgstr "Zwischenspeicher"
 

	
 
msgid "Remote"
 
msgstr "Entfernt"
 

	
 
msgid "Statistics"
 
msgstr "Statistiken"
 

	
 
msgid "Parent"
 
msgstr "Übergeordnet"
 

	
 
msgid "Set"
 
msgstr "Setzen"
 

	
 
msgid "Manually set this repository as a fork of another from the list."
 
msgstr ""
 
"Manuell dieses Repository als Fork einem anderen aus der List zuordnen."
 

	
 
msgid "Public Journal Visibility"
 
msgstr "Sichtbarkeit des öffentlichen Logbuches"
 

	
 
msgid "Remove from public journal"
 
msgstr "Entferne aus dem Öffentlichen Logbuch"
 

	
 
msgid "Add to Public Journal"
 
msgstr "Zum öffentlichen Logbuch hinzufügen"
 

	
 
msgid ""
 
"All actions done in this repository will be visible to everyone in the "
 
"public journal."
 
msgstr ""
 
"Alle Aktionen, die in diesem Repository ausgeführt wurden, sind im "
 
"öffentlichen Logbuch für jeden einsehbar."
 

	
 
msgid "Confirm to delete this repository: %s"
 
msgstr "Löschen des Repositorys bestätigen: %s"
 

	
 
msgid "Delete this Repository"
 
msgstr "Dieses Repository löschen"
 

	
 
msgid "This repository has %s fork"
 
msgid_plural "This repository has %s forks"
 
msgstr[0] "Dieses Repository hat %s Fork"
 
msgstr[1] "Dieses Repository hat %s Forks"
 

	
 
msgid "Detach forks"
 
msgstr "Fork abtrennen"
 

	
 
msgid "Delete forks"
 
msgstr "Forks löschen"
 

	
 
msgid ""
 
"The deleted repository will be moved away and hidden until the "
 
"administrator expires it. The administrator can both permanently delete "
 
"it or restore it."
 
msgstr ""
 
"Das gelöschte Repository wird beiseitegelegt und versteckt, bis ein "
 
"Administrierender es verfallen lässt. Der Administrierende kann es sowohl "
 
"permanent löschen oder wiederherstellen."
 

	
 
msgid "Invalidate Repository Cache"
 
msgstr "Ungültiger Repositorycache"
 

	
 
msgid ""
 
"Manually invalidate cache for this repository. On first access, the "
 
"repository will be cached again."
 
msgstr ""
 
"Manuell den Zwischenspeicher für dieses Repository verfallen lassen. Beim "
 
"ersten Zugriff wird der Zwischenspeicher erneut aufgefüllt."
 

	
 
msgid "List of Cached Values"
 
msgstr "Liste der zwischengespeicherten Werte"
 

	
 
msgid "Prefix"
 
msgstr "Präfix"
 
msgid "Label"
 
msgstr "Bezeichnung"
 

	
 
msgid "Key"
 
msgstr "Schlüssel"
 

	
 
msgid "Active"
 
msgstr "Aktiv"
 

	
 
msgid "Label"
 
msgstr "Bezeichnung"
 

	
 
msgid "Confirm to delete this field: %s"
 
msgstr "Löschen des Felds bestätigen: %s"
 

	
 
msgid "New field key"
 
msgstr "Eindeutiges Kennzeichen des neuen Felds"
 

	
 
msgid "New field label"
 
msgstr "Neue Bezeichnung des Felds"
 

	
 
msgid "Enter short label"
 
msgstr "Eingabe einer kurzen Bezeichnung"
 

	
 
msgid "New field description"
 
msgstr "Beschreibung des neuen Felds"
 

	
 
msgid "Enter description of a field"
 
msgstr "Beschreibung eines Felds eingeben"
 

	
 
msgid "Extra fields are disabled."
 
msgstr "Zusatzfelder sind deaktiviert."
 

	
 
msgid "Private Repository"
 
msgstr "Privates Repository"
 

	
 
msgid "Fork of repository"
 
msgstr "Fork des Repository"
 

	
 
msgid "Remote repository URL"
 
msgstr "URL des entfernten Repository"
 

	
 
msgid "Pull Changes from Remote Repository"
 
msgstr "Hole Änderungen vom entfernten Repository"
 

	
 
msgid "Confirm to pull changes from remote repository."
 
msgstr "Bestätige die Abholung von Änderungen vom entfernten Repository."
 

	
 
msgid "This repository does not have a remote repository URL."
 
msgstr "Für dieses Repository ist keine nicht-lokale URL angegeben."
 

	
 
msgid ""
 
"In case this repository is renamed or moved into another group the "
 
"repository URL changes.\n"
 
"                               Using the above permanent URL guarantees "
 
"that this repository always will be accessible on that URL.\n"
 
"                               This is useful for CI systems, or any "
 
"other cases that you need to hardcode the URL into a 3rd party service."
 
msgstr ""
 
"Falls dieses Repository umbenannt oder in eine andere Gruppe verschoben "
 
"wird, ändert sich seine URL.\n"
 
"Die Verwendung der permanenten URL garantiert, dass dieses Repository "
 
"immer über diese URL erreichbar sein wird.\n"
 
"Dies ist insbesondere für CI-Systeme oder in Fällen nützlich, in denen "
 
"die URL des Repositories bei Dritten dauerhaft eingetragen wird."
 

	
 
msgid "Remote repository"
 
msgstr "Entferntes Repository"
 

	
 
msgid "Repository URL"
 
msgstr "Repository URL"
 

	
 
msgid ""
 
"Optional: URL of a remote repository. If set, the repository can be "
 
"pulled from this URL."
 
msgstr ""
 
"Optional: URL eines entfernten Repositories. Falls gesetzt, dann kann das "
 
"Repository von dieser URL bezogen werden."
 

	
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr "Standardrevision für Dateiseite, Downloads, Whoosh und Readme"
 

	
 
msgid "Type name of user"
 
msgstr "Typname des Benutzers"
 

	
 
msgid "Change owner of this repository."
 
msgstr "Besitzer des Repositorys ändern."
 

	
 
msgid "Processed commits"
 
msgstr "Verarbeitete Commits"
 

	
 
msgid "Processed progress"
 
msgstr "Verarbeiteter Fortschritt"
 

	
 
msgid "Reset Statistics"
 
msgstr "Statistiken zurücksetzen"
 

	
 
msgid "Confirm to remove current statistics."
 
msgstr "Bestätigen Sie, um die aktuellen Statistiken zu entfernen."
 

	
 
msgid "Repositories Administration"
 
msgstr "Repositoryverwaltung"
 

	
 
msgid "State"
 
msgstr "Zustand"
 

	
 
msgid "Settings Administration"
 
msgstr "Einstellungsverwaltung"
 
@@ -2159,192 +2144,195 @@ msgstr ""
 
"Repository."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Zeige Kallithea-Version"
 

	
 
msgid ""
 
"Shows or hides a version number of Kallithea displayed in the footer."
 
msgstr ""
 
"Zeigt oder verbirgt eine Versionsnummer von Kallithea, die in der "
 
"Fußzeile angezeigt wird."
 

	
 
msgid "Show user Gravatars"
 
msgstr "Benutzer Gravatare anzeigen"
 

	
 
msgid ""
 
"Gravatar URL allows you to use another avatar server application.\n"
 
"                                                        The following "
 
"variables of the URL will be replaced accordingly.\n"
 
"                                                        {scheme}    "
 
"'http' or 'https' sent from running Kallithea server,\n"
 
"                                                        {email}     user "
 
"email,\n"
 
"                                                        {md5email}  md5 "
 
"hash of the user email (like at gravatar.com),\n"
 
"                                                        {size}      size "
 
"of the image that is expected from the server application,\n"
 
"                                                        {netloc}    "
 
"network location/server host of running Kallithea server"
 
msgstr ""
 
"Gravatar URL ermöglicht es Ihnen, eine andere Avatar-Serveranwendung zu "
 
"verwenden.\n"
 
"                                                        Die folgenden "
 
"Variablen der URL werden entsprechend ersetzt.\n"
 
"                                                        {scheme}    "
 
"'http' oder'https', die vom laufenden Kallithea-Server gesendet werden,\n"
 
"                                                        {email}    "
 
"Benutzer-E-Mail,\n"
 
"                                                        {md5email}  md5 "
 
"Hash der Benutzer-E-Mail (wie bei gravatar.com),\n"
 
"                                                        {size}       "
 
"Größe des Bildes, das von der Serveranwendung erwartet wird,\n"
 
"                                                        {netloc}    "
 
"Netzwerkstandort/Server-Host des laufenden Kallithea-Servers"
 

	
 
msgid ""
 
"Number of items displayed in the repository pages before pagination is "
 
"shown."
 
msgstr ""
 
"Anzahl der Elemente, die auf den Repository-Seiten angezeigt werden, "
 
"bevor der Seitenumbruch angezeigt wird."
 

	
 
msgid "Admin page size"
 
msgstr "Größe der Admin-Seite"
 

	
 
msgid ""
 
"Number of items displayed in the admin pages grids before pagination is "
 
"shown."
 
msgstr ""
 
"Anzahl der Elemente, die in den Gittern der Admin-Seiten angezeigt "
 
"werden, bevor der Seitenumbruch angezeigt wird."
 

	
 
msgid "Icons"
 
msgstr "Icons"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Öffentliches Repository-Symbol in Repositories anzeigen"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Privates Repository-Symbol in Repositories anzeigen"
 

	
 
msgid "Show public/private icons next to repository names."
 
msgstr ""
 
"Zeigt öffentliche/private Symbole neben den Namen der Repositories an."
 

	
 
msgid ""
 
"Parses meta tags from the repository description field and turns them "
 
"into colored tags."
 
msgstr ""
 
"Analysiert Meta-Tags aus dem Beschreibungsfeld des Repositorys und "
 
"verwandelt sie in farbige Tags."
 

	
 
msgid "Stylify recognised meta tags:"
 
msgstr "Erkannte Meta-Tags stilisieren:"
 

	
 
msgid "Add user group"
 
msgstr "Benutzergruppe hinzufügen"
 

	
 
msgid "User Groups"
 
msgstr "Benutzergruppen"
 

	
 
msgid "Add User Group"
 
msgstr "Benutzergruppe hinzufügen"
 

	
 
msgid "Short, optional description for this user group."
 
msgstr "Kurze, optionale Beschreibung für diese Benutzergruppe."
 

	
 
msgid "Active"
 
msgstr "Aktiv"
 

	
 
msgid "User Group: %s"
 
msgstr "Benutzergruppe: %s"
 

	
 
msgid "Members"
 
msgstr "Mitglieder"
 

	
 
msgid "Confirm to delete this user group: %s"
 
msgstr "Bestätigen, um diese Benutzergruppe zu löschen: %s"
 

	
 
msgid "Delete this user group"
 
msgstr "Diese Benutzergruppe löschen"
 

	
 
msgid "No members yet"
 
msgstr "Noch keine Mitglieder"
 

	
 
msgid "Chosen group members"
 
msgstr "Ausgewählte Grppenmitglieder"
 

	
 
msgid "Available members"
 
msgstr "Verfügbare Mitglieder"
 

	
 
msgid "User Groups Administration"
 
msgstr "Benutzergruppenverwaltung"
 

	
 
msgid "Add user"
 
msgstr "Benutzer hinzufügen"
 

	
 
msgid "Users"
 
msgstr "Benutzer"
 

	
 
msgid "Add User"
 
msgstr "Benutzer hinzufügen"
 

	
 
msgid "Password confirmation"
 
msgstr "Passwortbestätigung"
 

	
 
msgid "Emails"
 
msgstr "E-Mails"
 

	
 
msgid "User: %s"
 
msgstr "Benutzer: %s"
 

	
 
msgid "Last Login"
 
msgstr "Letzter Login"
 

	
 
msgid "Member of User Groups"
 
msgstr "Mitglieder der Benutzergruppe"
 

	
 
msgid "Delete this user"
 
msgstr "Diesen Benutzer löschen"
 

	
 
msgid "Users Administration"
 
msgstr "Benutzerverwaltung"
 

	
 
msgid "Auth Type"
 
msgstr "Authentifizierungsart"
 

	
 
msgid "Support"
 
msgstr "Support"
 

	
 
msgid "Mercurial repository"
 
msgstr "Mercurial Repository"
 

	
 
msgid "Git repository"
 
msgstr "Git Repository"
 

	
 
msgid "Create Fork"
 
msgstr "Fork erstellen"
 

	
 
msgid "Summary"
 
msgstr "Zusammenfassung"
 

	
 
msgid "Files"
 
msgstr "Dateien"
 

	
 
msgid "Pull Requests"
 
msgstr "Pull Requests"
 

	
 
msgid "Options"
 
msgstr "Optionen"
 

	
 
msgid "Compare Fork"
 
msgstr "Fork vergleichen"
 

	
 
msgid "No matches found"
 
msgstr "Keine Übereinstimmungen gefunden"
 

	
 
msgid "Public journal"
 
msgstr "Öffentliches Logbuch"
 

	
 
msgid "My Pull Requests"
 
msgstr "Meine Pull Requests"
 

	
 
msgid "Not Logged In"
 
msgstr "Nicht eingeloggt"
 

	
 
@@ -2360,262 +2348,268 @@ msgstr "Einen weiteren Kommentar hinzufügen"
 
msgid "Group"
 
msgstr "Gruppe"
 

	
 
msgid "Confirm to revoke permission for {0}: {1} ?"
 
msgstr "Widerruf der Rechte für {0}: {1} bestätigen?"
 

	
 
msgid "Select changeset"
 
msgstr "Änderungssätze auswählen"
 

	
 
msgid "Specify changeset"
 
msgstr "Changeset angeben"
 

	
 
msgid "Click to sort ascending"
 
msgstr "Klicken um Aufsteigend zu Sortieren"
 

	
 
msgid "Click to sort descending"
 
msgstr "Klicken um Absteigend zu Sortieren"
 

	
 
msgid "No records found."
 
msgstr "Keine Datensätze gefunden."
 

	
 
msgid "Data error."
 
msgstr "Datenfehler."
 

	
 
msgid "Loading..."
 
msgstr "Lade..."
 

	
 
msgid "Go to tip of repository"
 
msgstr "Gehe zum Tip des Repositorys"
 

	
 
msgid "There are no changes yet"
 
msgstr "Bisher gibt es keine Änderungen"
 

	
 
msgid "Branch %s"
 
msgstr "Branch %s"
 

	
 
msgid "No title"
 
msgstr "Kein Titel"
 

	
 
msgid "Delete comment?"
 
msgstr "Kommentar löschen?"
 

	
 
msgid "Set changeset status"
 
msgstr "Setze Changesetstatus"
 

	
 
msgid "No change"
 
msgstr "Keine Änderungen"
 

	
 
msgid "Close"
 
msgstr "Schließen"
 

	
 
msgid "Comment"
 
msgstr "Kommentar"
 

	
 
msgid "%d comment"
 
msgid_plural "%d comments"
 
msgstr[0] "%d Kommentar"
 
msgstr[1] "%d Kommentare"
 

	
 
msgid "%d inline"
 
msgid_plural "%d inline"
 
msgstr[0] "%d inline"
 
msgstr[1] "%d inline"
 

	
 
msgid "%d general"
 
msgid_plural "%d general"
 
msgstr[0] "%d generell"
 
msgstr[1] "%d generell"
 

	
 
msgid "Deleted"
 
msgstr "Gelöscht"
 

	
 
msgid "Renamed"
 
msgstr "Umbenannt"
 

	
 
msgid "%s changesets"
 
msgstr "%s Changesets"
 

	
 
msgid "behind"
 
msgstr "zurück"
 

	
 
msgid "Public repository"
 
msgstr "Öffenentliches Repository"
 

	
 
msgid "Subscribe to %s rss feed"
 
msgstr "Abonniere den %s RSS Feed"
 

	
 
msgid "Subscribe to %s atom feed"
 
msgstr "Abonniere den %s ATOM Feed"
 

	
 
msgid "Hello %s"
 
msgstr "Hallo %s"
 

	
 
msgid "or"
 
msgstr "oder"
 

	
 
msgid "Upload File"
 
msgstr "Datei hochladen"
 

	
 
msgid "Commit Changes"
 
msgstr "Änderungen einchecken"
 

	
 
msgid "Size"
 
msgstr "Größe"
 

	
 
msgid "Last Modified"
 
msgstr "Zuletzt geändert"
 

	
 
msgid "Delete file"
 
msgstr "Datei löschen"
 

	
 
msgid "%s author"
 
msgid_plural "%s authors"
 
msgstr[0] "%s Autor"
 
msgstr[1] "%s Autoren"
 

	
 
msgid "Go Back"
 
msgstr "Zurück"
 

	
 
msgid "Private"
 
msgstr "Privat"
 

	
 
msgid "Copy permissions"
 
msgstr "Berechtigungen kopieren"
 

	
 
msgid "ATOM journal feed"
 
msgstr "ATOM Logbuch Feed"
 

	
 
msgid "RSS journal feed"
 
msgstr "RSS Logbuch Feed"
 

	
 
msgid "My Repositories"
 
msgstr "Meine Repositories"
 

	
 
msgid "ATOM public journal feed"
 
msgstr "ATOM Feed für das Öffentliche Logbuch"
 

	
 
msgid "RSS public journal feed"
 
msgstr "RSS Feed für das Öffentliche Logbuch"
 

	
 
msgid "New Pull Request"
 
msgstr "Neuer Pull Request"
 

	
 
msgid "Title"
 
msgstr "Titel"
 

	
 
msgid "Revision"
 
msgstr "Revision"
 

	
 
msgid "Age"
 
msgstr "Alter"
 

	
 
msgid "Delete Pull Request"
 
msgstr "Pull Request löschen"
 

	
 
msgid "Summarize the changes"
 
msgstr "Zusammenfassung der Änderungen"
 

	
 
msgid "on"
 
msgstr "in"
 

	
 
msgid "Cancel Changes"
 
msgstr "Änderungen verwerfen"
 

	
 
msgid "Remove reviewer"
 
msgstr "Reviewer entfernen"
 

	
 
msgid "Potential Reviewers"
 
msgstr "Potentielle Reviewer"
 

	
 
msgid "Pull Request Content"
 
msgstr "Inhalt des Pull Requests"
 

	
 
msgid "Pull Requests to '%s'"
 
msgstr "Pull Requests für '%s'"
 

	
 
msgid "Open New Pull Request"
 
msgstr "Einen neuen Pull Request eröffnen"
 

	
 
msgid "Show Pull Requests to %s"
 
msgstr "Zeige Pull Requests für '%s'"
 

	
 
msgid "Show Pull Requests from '%s'"
 
msgstr "Zeige Pull Requests von '%s'"
 

	
 
msgid "Pull Requests Created by Me"
 
msgstr "Von mir erstellte Pull Requests"
 

	
 
msgid "Search in All Repositories"
 
msgstr "Suche in allen Repositories"
 

	
 
msgid "Search term"
 
msgstr "Suchbegriff"
 

	
 
msgid "Search in"
 
msgstr "Suchen in"
 

	
 
msgid "File contents"
 
msgstr "Dateiinhalt"
 

	
 
msgid "Commit messages"
 
msgstr "Commit Nachrichten"
 

	
 
msgid "File names"
 
msgstr "Dateinamen"
 

	
 
msgid "Permission denied"
 
msgstr "Zugriff verweigert"
 

	
 
msgid "Enable"
 
msgstr "Aktiviere"
 

	
 
msgid "files"
 
msgstr "Dateien"
 

	
 
msgid "Show more"
 
msgstr "Mehr anzeigen"
 

	
 
msgid "commits"
 
msgstr "Commits"
 

	
 
msgid "files added"
 
msgstr "Dateien hinzugefügt"
 

	
 
msgid "files changed"
 
msgstr "Dateien geändert"
 

	
 
msgid "files removed"
 
msgstr "Dateien entfernt"
 

	
 
msgid "commit"
 
msgstr "Commit"
 

	
 
msgid "file added"
 
msgstr "Datei hinzugefügt"
 

	
 
msgid "file changed"
 
msgstr "Datei geändert"
 

	
 
msgid "file removed"
 
msgstr "Datei entfernt"
 

	
 
msgid "Clone from"
 
msgstr "Clone von"
 

	
 
msgid "Clone URL"
 
msgstr "Clone-URL"
 

	
 
msgid "Download as zip"
 
msgstr "Herunterladen als zip"
 

	
 
msgid "Feed"
 
msgstr "Feed"
 

	
 
msgid "Latest Changes"
 
msgstr "Letzte Änderungen"
 

	
 
msgid "Quick Start"
 
msgstr "Schnelleinstieg"
 

	
 
msgid "Add or upload files directly via Kallithea"
 
msgstr "Dateien direkt über Kallithea hinzufügen oder hochladen"
 

	
 
msgid "Readme file from revision %s:%s"
 
msgstr "Liesmich-Datei von Revision %s:%s"
 

	
 
msgid "Download %s as %s"
 
msgstr "%s als %s herunterladen"

Changeset was too big and was cut off... Show full diff anyway

0 comments (0 inline, 0 general)