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
36 files changed with 3795 insertions and 367 deletions:
0 comments (0 inline, 0 general)
.hgtags
Show inline comments
 
@@ -31,48 +31,49 @@ bd102f45950f779995a1beae42b6eb099cdd27b3
 
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
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
 
@@ -224,98 +224,98 @@ page titles, button labels, headers, and
 

	
 
.. _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/
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)
 
@@ -72,49 +74,184 @@ Manual creation of a new language transl
 

	
 
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
 
@@ -29,61 +29,61 @@ Administrator guide
 
   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
 
@@ -108,96 +108,106 @@ This means:
 
- 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.
 

	
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
 
@@ -405,102 +405,96 @@ 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 "Абноўленыя хукі"
 
@@ -1451,168 +1445,148 @@ 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 "Скід статыстыкі"
 
@@ -1712,96 +1686,99 @@ msgid ""
 
"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 "Выдаліць гэтага карыстальніка"
 

	
kallithea/i18n/da/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -441,102 +441,96 @@ msgstr "Der opstod en fejl under opdater
 

	
 
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"
kallithea/i18n/de/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -273,112 +273,112 @@ 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"
 
@@ -427,146 +427,140 @@ msgstr "Repository %s wurde erfolgreich 
 

	
 
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"
 
@@ -1010,197 +1004,210 @@ 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..."
 
@@ -1391,97 +1398,97 @@ 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"
 
@@ -1719,182 +1726,160 @@ 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 "
 
@@ -2207,96 +2192,99 @@ 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"
 

	
 
@@ -2408,96 +2396,99 @@ 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"
 
@@ -2569,53 +2560,56 @@ 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"
kallithea/i18n/el/LC_MESSAGES/kallithea.po
Show inline comments
 
# Copyright (C) 2015 Various authors, licensing as GPLv3
 
# This file is distributed under the same license as the Kallithea project.
 

	
 
msgid ""
 
msgstr ""
 
"Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
 
"Language: el\n"
 
"MIME-Version: 1.0\n"
 
"Content-Type: text/plain; charset=UTF-8\n"
 
"Content-Transfer-Encoding: 8bit\n"
 
"Plural-Forms: nplurals=2; plural=n != 1;\n"
 

	
 
msgid "There are no changesets yet"
 
msgstr "Δεν υπάρχουν σετ αλλαγών ακόμα"
 

	
 
msgid "None"
 
msgstr "Χωρίς"
 

	
 
msgid "(closed)"
 
msgstr "(κλειστό)"
 

	
 
msgid "Show whitespace"
 
msgstr "Εμφάνιση κενού"
 

	
 
msgid "Ignore whitespace"
 
msgstr "Αγνόηση κενού"
 

	
 
msgid "Increase diff context to %(num)s lines"
 
msgstr "Αύξηση του diff πλαισίου σε %(num)s γραμμές"
 

	
 
msgid "No permission to change status"
 
msgstr "Χωρίς δικαιώματα αλλαγής της κατάστασης"
 

	
 
msgid "Successfully deleted pull request %s"
 
msgstr "Επιτυχής διαγραφή αιτήματος έλξης %s"
 

	
 
msgid "Such revision does not exist for this repository"
 
msgstr "Δεν υπάρχει τέτοια αναθεώρηση για αυτό το αποθετήριο"
 

	
 
msgid "Could not find other repository %s"
 
msgstr "Δεν βρέθηκε το αποθετήριο %s"
 

	
 
msgid "Cannot compare repositories of different types"
 
msgstr "Δεν μπορεί να γίνει σύγκριση αποθετηρίων διαφορετικού τύπου"
 

	
 
msgid "Cannot show empty diff"
 
msgstr "Δεν μπορεί να γίνει η εμφάνιση άδειου diff"
 

	
 
msgid "No ancestor found for merge diff"
 
msgstr "Δεν βρέθηκε πρόγονος για να συγχωνευθούν οι διαφορές"
 

	
 
msgid "Multiple merge ancestors found for merge compare"
 
msgstr "Βρέθηκαν πολλαπλοί πρόγονοι για σύγκριση της συγχώνευσης"
 

	
 
msgid "Cannot compare repositories without using common ancestor"
 
msgstr ""
 
"Δεν μπορεί να γίνει σύγκριση αποθετηρίων χωρίς να χρησιμοποιηθεί κοινός "
 
"πρόγονος"
 

	
 
msgid "No response"
 
msgstr "Χωρίς απόκριση"
 

	
 
msgid "Unknown error"
 
msgstr "Άγνωστο λάθος"
 
msgstr "Άγνωστο σφάλμα"
 

	
 
msgid ""
 
"The request could not be understood by the server due to malformed syntax."
 
msgstr ""
 
"Η αίτηση δεν  μπόρεσε να ερμηνευτεί από τον εξυπηρετητή λόγω κακής "
 
"διατύπωσης."
 

	
 
msgid "Unauthorized access to resource"
 
msgstr "Ανεξουσιοδοτημένη πρόσβαση στον πόρο"
 

	
 
msgid "You don't have permission to view this page"
 
msgstr "Δεν έχετε άδεια για να εμφανίσετε αυτή τη σελίδα"
 

	
 
msgid "The resource could not be found"
 
msgstr "Ο πόρος δεν μπορεί να βρεθεί"
 

	
 
msgid ""
 
"The server encountered an unexpected condition which prevented it from "
 
"fulfilling the request."
 
msgstr ""
 
"Ο εξυπηρετητής συνάντησε μια απρόσμενη κατάσταση που τον απέτρεψαν να "
 
"πραγματοποιήσει την αίτηση."
 

	
 
msgid "%s committed on %s"
 
msgstr "%s συνέβαλε στο %s"
 

	
 
msgid "Changeset was too big and was cut off..."
 
msgstr "Το σετ αλλαγών ήταν πολύ μεγάλο και περικόπηκε..."
 

	
 
msgid "%s %s feed"
 
msgstr "%s %s τροφοδοσία"
 

	
 
msgid "Changes on %s repository"
 
msgstr "Αλλαγές στο αποθετήριο %s"
 

	
 
msgid "Click here to add new file"
 
msgstr "Κλικ εδώ για προθήκη νέου αρχείου"
 

	
 
msgid "There are no files yet."
 
msgstr "Δεν υπάρχουν αρχεία ακόμα."
 

	
 
msgid "%s at %s"
 
msgstr "%s την %s"
 

	
 
msgid "You can only delete files with revision being a valid branch"
 
msgstr ""
 
"Μπορείτε να διαγράψετε μόνο αρχεία με αναθεώρηση που βρίσκονται σε έγκυρη "
 
"διακλάδωση"
 

	
 
msgid "Deleted file %s via Kallithea"
 
msgstr "Διαγραφή αρχείου %s μέσω του Kallithea"
 
msgstr "Διαγραφή αρχείου %s μέσω της Καλλιθέας"
 

	
 
msgid "Successfully deleted file %s"
 
msgstr "Επιτυχής διαγραφή αρχείου %s"
 

	
 
msgid "Error occurred during commit"
 
msgstr "Συνέβη λάθος κατά το commit"
 
msgstr "Παρουσιάστηκε σφάλμα κατά το commit"
 

	
 
msgid "You can only edit files with revision being a valid branch"
 
msgstr ""
 
"Μπορείτε να επεξεργαστείτε μόνο αρχεία σε αναθεώρηση που βρίσκονται σε "
 
"έγκυρη διακλάδωση"
 

	
 
msgid "Edited file %s via Kallithea"
 
msgstr "Επεξεργασία αρχείου %s μέσω του Kallithea"
 
msgstr "Επεξεργασία αρχείου %s μέσω της Καλλιθέας"
 

	
 
msgid "No changes"
 
msgstr "Καμία αλλαγή"
 

	
 
msgid "Successfully committed to %s"
 
msgstr "Επιτυχής παράδοση σε %s"
 

	
 
msgid "Added file via Kallithea"
 
msgstr "Προσθήκη αρχείου μέσω Kallithea"
 
msgstr "Προσθήκη αρχείου μέσω της Καλλιθέας"
 

	
 
msgid "No content"
 
msgstr "Χωρίς περιεχόμενο"
 

	
 
msgid "No filename"
 
msgstr "Χωρίς όνομα αρχείου"
 

	
 
msgid "Location must be relative path and must not contain .. in path"
 
msgstr ""
 
"Η τοποθεσία πρέπει να είναι σχετική διαδρομή και να μην περιέχει .. μέσα "
 
"της"
 

	
 
msgid "Downloads disabled"
 
msgstr "Οι μεταφορτώσεις απενεργοποιήθηκαν"
 

	
 
msgid "Unknown revision %s"
 
msgstr "Άγνωστη αναθεώρηση %s"
 

	
 
msgid "Empty repository"
 
msgstr "Άδειο αποθετήριο"
 

	
 
msgid "Unknown archive type"
 
msgstr "Άγνωστος τύπος αρχειοθέτησης"
 

	
 
msgid "Changesets"
 
msgstr "Σετ αλλαγών"
 

	
 
msgid "Branches"
 
msgstr "Κλάδοι"
 

	
 
msgid "Tags"
 
msgstr "Ετικέτες"
 

	
 
msgid "An error occurred during repository forking %s"
 
msgstr "Συνέβει ένα λάθος κατά την διακλάδωση του αποθετηρίου %s"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την διακλάδωση του αποθετηρίου %s"
 

	
 
msgid "Groups"
 
msgstr "Ομάδες"
 

	
 
msgid "Repositories"
 
msgstr "Αποθετήρια"
 

	
 
msgid "Branch"
 
msgstr "Κλάδος"
 

	
 
msgid "Closed Branches"
 
msgstr "Κλειστοί Κλάδοι"
 

	
 
msgid "Tag"
 
msgstr "Ετικέτα"
 

	
 
msgid "Bookmark"
 
msgstr "Σελιδοδείκτης"
 

	
 
msgid "Public Journal"
 
msgstr "Δημόσιο Ημερολόγιο"
 

	
 
msgid "Journal"
 
msgstr "Ημερολόγιο"
 

	
 
msgid "Bad captcha"
 
msgstr "Λάθος captcha"
 

	
 
msgid "You have successfully registered with %s"
 
msgstr "Εγγραφήκατε επιτυχώς στο %s"
 

	
 
msgid "A password reset confirmation code has been sent"
 
msgstr "Στάλθηκε ένας κωδικός επιβεβαίωσης επαναφοράς του συνθηματικού"
 

	
 
msgid "Invalid password reset token"
 
msgstr "Άκυρο τεκμήριο (token) επαναφοράς του συνθηματικού"
 

	
 
msgid "Successfully updated password"
 
msgstr "Το συνθηματικό ενημερώθηκε επιτυχώς"
 

	
 
msgid "Invalid reviewer \"%s\" specified"
 
msgstr "Καθορίστηκε άκυρος σχολιαστής \"%s\""
 

	
 
msgid "%s (closed)"
 
msgstr "%s (κλειστό)"
 

	
 
msgid "Changeset"
 
msgstr "Σετ αλλαγών"
 

	
 
msgid "Special"
 
msgstr "Ειδικός"
 

	
 
msgid "Peer branches"
 
msgstr "Ομότιμοι κλάδοι"
 

	
 
msgid "Bookmarks"
 
msgstr "Σελιδοδείκτες"
 

	
 
msgid "Error creating pull request: %s"
 
msgstr "Λάθος στη δημιουργία αιτήματος έλξης - pull request: %s"
 
msgstr "Σφάλμα στη δημιουργία αιτήματος έλξης - pull request: %s"
 

	
 
msgid "Error occurred while creating pull request"
 
msgstr "Λάθος κατά τη δημιουργία αιτήματος έλξης (pull request)"
 
msgstr "Παρουσιάστηκε σφάλμα κατά τη δημιουργία αίτησης έλξης"
 

	
 
msgid "Successfully opened new pull request"
 
msgstr "Ένα νέο αίτημα έλξης (pull request) δημιουργήθηκε επιτυχώς"
 

	
 
msgid "New pull request iteration created"
 
msgstr "Δημιουργήθηκε νέο αίτημα έλξης"
 

	
 
msgid "Meanwhile, the following reviewers have been added: %s"
 
msgstr "Εντωμεταξύ, οι ακόλουθοι κριτικοί προστέθηκαν: %s"
 

	
 
msgid "Meanwhile, the following reviewers have been removed: %s"
 
msgstr "Εντωμεταξύ, οι ακόλουθοι κριτικοί αφαιρέθηκαν: %s"
 

	
 
msgid "No description"
 
msgstr "Χωρίς περιγραφή"
 

	
 
msgid "Pull request updated"
 
msgstr "Ενημερώθηκε η αίτηση έλξης"
 

	
 
msgid "Successfully deleted pull request"
 
msgstr "Επιτυχής διαγραφή αιτήματος έλξης"
 

	
 
msgid "Revision %s not found in %s"
 
msgstr "Η αναθεώρηση %s δεν βρέθηκε στο %s"
 

	
 
msgid "Error: changesets not found when displaying pull request from %s."
 
msgstr ""
 
"Σφάλμα: τα σετ αλλαγών δεν βρέθηκαν όταν εμφανίζεται το αίτημα έλξης από "
 
"το %s."
 

	
 
msgid "This pull request has already been merged to %s."
 
msgstr "Το αίτημα έλξης έχει ήδη συγχωνευτεί με το %s."
 

	
 
msgid "This pull request has been closed and can not be updated."
 
msgstr "Αυτό το αίτημα έλξης έχει κλείσει και δεν μπορεί να ενημερωθεί."
 

	
 
msgid "The following additional changes are available on %s:"
 
msgstr "Οι επιπλέον ακόλουθες αλλαγές είναι διαθέσιμες στο %s:"
 

	
 
msgid "No additional changesets found for iterating on this pull request."
 
msgstr ""
 
"Δεν βρέθηκαν επιπλέον σετ αλλαγών στην προσέγγιση αυτού του αιτήματος "
 
"έλξης."
 

	
 
msgid "Note: Branch %s has another head: %s."
 
msgstr "Σημείωση: Ο κλάδος %s έχει άλλη κεφαλή (head): %s."
 

	
 
msgid "Git pull requests don't support iterating yet."
 
msgstr "Αιτήματα έλξης του git δεν υποστηρίζουν ακόμα ενημερώσεις."
 

	
 
msgid ""
 
"Error: some changesets not found when displaying pull request from %s."
 
msgstr ""
 
"Σφάλμα: κάποια σετ αλλαγών δεν βρέθηκαν όταν εμφανιζόταν αυτό το αίτημα "
 
"έλξης από το %s."
 

	
 
msgid "The diff can't be shown - the PR revisions could not be found."
 
msgstr ""
 
"Οι διαφορές δεν μπορούν να εμφανιστούν - οι αναθεωρήσεις δεν βρέθηκαν."
 

	
 
msgid "Invalid search query. Try quoting it."
 
msgstr "Άκυρο αίτημα αναζήτησης. Δοκιμάστε με εισαγωγικά."
 

	
 
msgid "The server has no search index."
 
msgstr "Ο διακομιστής δεν έχει ευρετήριο αναζήτησης."
 

	
 
msgid "An error occurred during search operation."
 
msgstr "Ένα λάθος συνέβη κατά την διαδικασία αναζήτησης."
 
msgstr "Παρουσιάστηκε σφάλμα κατά τη λειτουργία αναζήτησης."
 

	
 
msgid "No data ready yet"
 
msgstr "Δεν υπάρχουν ακόμα έτοιμα δεδομένα"
 

	
 
msgid "Statistics are disabled for this repository"
 
msgstr "Τα στατιστικά είναι απενεργοποιημένα για αυτό το αποθετήριο"
 

	
 
msgid "Auth settings updated successfully"
 
msgstr "Οι ρυθμίσεις εξουσιοδότησης ενημερώθηκαν επιτυχώς"
 

	
 
msgid "error occurred during update of auth settings"
 
msgstr "παρουσιάστηκε βλάβη κατά την ενημέρωση των ρυθμίσεων εξουσιοδότησης"
 
msgstr ""
 
"παρουσιάστηκε σφάλμα κατά την ενημέρωση των ρυθμίσεων εξουσιοδότησης"
 

	
 
msgid "Default settings updated successfully"
 
msgstr "Οι προεπιλεγμένες ρυθμίσεις ενημερώθηκαν επιτυχώς"
 

	
 
msgid "Error occurred during update of defaults"
 
msgstr "Συνέβη μία βλάβη κατά την ενημέρωση των προεπιλογών"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την ενημέρωση των προεπιλογών"
 

	
 
msgid "Forever"
 
msgstr "Πάντα"
 

	
 
msgid "5 minutes"
 
msgstr "5 λεπτά"
 

	
 
msgid "1 hour"
 
msgstr "1 ώρα"
 

	
 
msgid "1 day"
 
msgstr "1 ημέρα"
 

	
 
msgid "1 month"
 
msgstr "1 μήνας"
 

	
 
msgid "Lifetime"
 
msgstr "Διάρκεια ζωής"
 

	
 
msgid "Error occurred during gist creation"
 
msgstr "Συνέβη μία βλάβη κατά τη δημιουργία του gist"
 
msgstr "Παρουσιάστηκε σφάλμα κατά τη δημιουργία του gist"
 

	
 
msgid "Deleted gist %s"
 
msgstr "Διαγράφηκε το gist %s"
 

	
 
msgid "Unmodified"
 
msgstr "Mη τροποποιημένo"
 

	
 
msgid "Successfully updated gist content"
 
msgstr "Το περιεχόμενο του gist ενημερώθηκε επιτυχώς"
 

	
 
msgid "Successfully updated gist data"
 
msgstr "Τα δεδομένα του gist ενημερώθηκαν επιτυχώς"
 

	
 
msgid "Error occurred during update of gist %s"
 
msgstr "Σφάλμα συνέβη κατά την ενημέρωση του gist %s"
 

	
 
msgid "You can't edit this user since it's crucial for entire application"
 
msgstr ""
 
"Δεν μπορείτε να επεξεργαστείτε αυτόν το χρήστη καθώς είναι κρίσιμος για "
 
"όλη την εφαρμογή"
 

	
 
msgid "Your account was updated successfully"
 
msgstr "Ο λογαριασμός σας ενημερώθηκε επιτυχώς"
 

	
 
msgid "Error occurred during update of user %s"
 
msgstr "Συνέβη ένα σφάλμα κατά την ενημέρωση του χρήστη %s"
 

	
 
msgid "Error occurred during update of user password"
 
msgstr "Συνέβη ένα σφάλμα κατά την ενημέρωση του κωδικού του χρήστη"
 

	
 
msgid "Added email %s to user"
 
msgstr "Προστέθηκε το email %s στον χρήστη"
 

	
 
msgid "An error occurred during email saving"
 
msgstr "Συνέβη ένα σφάλμα κατά την αποθήκευση του email"
 

	
 
msgid "Removed email from user"
 
msgstr "Αφαιρέθηκε το email από τον χρήστη"
 

	
 
msgid "API key successfully created"
 
msgstr "Το API κλειδί δημιουργήθηκε επιτυχώς"
 

	
 
msgid "API key successfully reset"
 
msgstr "Το API κλειδί επαναφέρθηκε επιτυχώς"
 

	
 
msgid "API key successfully deleted"
 
msgstr "Το API κλειδί διαγράφηκε επιτυχώς"
 

	
 
msgid "SSH key %s successfully added"
 
msgstr "Το SSH κλειδί %s δημιουργήθηκε επιτυχώς"
 

	
 
msgid "SSH key successfully deleted"
 
msgstr "Το SSH κλειδί διαγράφηκε επιτυχώς"
 

	
 
msgid "Read"
 
msgstr "Ανάγνωση"
 

	
 
msgid "Write"
 
msgstr "Εγγραφή"
 

	
 
msgid "Admin"
 
msgstr "Διαχειριστής"
 

	
 
msgid "Disabled"
 
msgstr "Απενεργοποιημένο"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Επιτρέπεται με χειροποίητη ενεργοποίηση του λογαριασμού"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Επιτρέπεται με αυτόματη ενεργοποίηση του λογαριασμού"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Χειροποίητη ενεργοποίηση εξωτερικού λογαριασμού"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Αυτόματη ενεργοποίηση εξωτερικού λογαριασμού"
 

	
 
msgid "Enabled"
 
msgstr "Ενεργό"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Τα καθολικά δικαιώματα ενημερώθηκαν επιτυχώς"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Συνέβει μια βλάβη κατά την ενημέρωση των δικαιωμάτων"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την ενημέρωση δικαιωμάτων"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Συνέβει μια βλάβη κατά την δημιουργία της ομάδας αποθετηρίου %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"
 
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"
 
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 "Συνέβει μια βλάβη κατά την ανάκληση της άδειας"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την ανάκληση του δικαιώματος"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Βλάβη κατά τη δημιουργία του αποθετηρίου %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"
 
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"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την διαγραφή του %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Τα δικαιώματα του αποθετηρίου ενημερώθηκαν"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Σφάλμα στην επιβεβαίωση του πεδίου: %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Παρουσιάστηκε σφάλμα κατά τη δημιουργία πεδίου: %r"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Συνέβει μια βλάβη κατά την απομάκρυνση του πεδίου"
 
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 "Η ακύρωση της cache ήταν επιτυχής"
 

	
 
msgid "An error occurred during cache invalidation"
 
msgstr "Παρουσιάστηκε ένα σφάλμα κατά τη διάρκεια ακύρωσης της cache"
 
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 "Παρακαλώ εισάγετε την διεύθυνση ηλεκτρονικού ταχυδρομείου"
 

	
 
msgid "Send email task created"
 
msgstr "Δημιουργήθηκε η εργασία της αποστολής ηλεκτρονικού ταχυδρομείου"
 

	
 
msgid "Hook already exists"
 
msgstr "Το άγκιστρο υπάρχει ήδη"
 

	
 
msgid "Builtin hooks are read-only. Please use another hook name."
 
msgstr ""
 
"Τα ενσωματωμένα άγκιστρα είναι μόνο για ανάγνωση. Παρακαλώ δώστε άλλο "
 
"όνομα στο άγκιστρο."
 

	
 
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 "Ο χρήστης διαγράφηκε επιτυχώς"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Παρουσιάστηκε σφάλμα κατά τη διαγραφή του χρήστη"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "Δεν μπορεί να γίνει επεξεργασία στον προεπιλεγμένο χρήστη"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "Η IP διεύθυνση %s προστέθηκε στην λίστα επιτρεπόμενων του χρήστη"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την προσθήκη της IP διεύθυνσης"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "Η IP διεύθυνση αφαιρέθηκε από τη λίστα επιτρεπόμενων του χρήστη"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr ""
 
"Πρέπει να είστε εγγεγραμμένος χρήστης για να εκτελέσετε αυτή την ενέργεια"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Πρέπει να είστε συνδεμένος για να δείτε αυτήν τη σελίδα"
 

	
 
msgid ""
 
"CSRF token leak has been detected - all form tokens have been expired"
 
msgstr ""
 
"Εντοπίστηκε διαρροή ενός διακριτικού CSRF - όλα τα διακριτικά της φόρμας "
 
"έχουν λήξει"
 

	
 
msgid "Repository not found in the filesystem"
 
msgstr "Το αποθετήριο δε βρέθηκε στο σύστημα αρχείων"
 

	
 
msgid "Changeset for %s %s not found in %s"
 
msgstr "Το σετ αλλαγών για %s %sδεν βρέθηκε στο %s"
 

	
 
msgid "SSH access is disabled."
 
msgstr "Η πρόσβαση μέσω SSH είναι απενεργοποιημένη."
 

	
 
msgid "Binary file"
 
msgstr "Δυαδικό αρχείο"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Το σετ αλλαγών ήταν πολύ μεγάλο και αποκόπηκε, χρησιμοποιήστε το μενού "
 
"διαφορών για να εμφανίσετε τις διαφορές"
 

	
 
msgid "No changes detected"
 
msgstr "Δεν εντοπίστηκαν αλλαγές"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "Διαγραφή κλάδου: %s"
 

	
 
msgid "Created tag: %s"
 
msgstr "Δημιουργηθείσα ετικέτα: %s"
 

	
 
msgid "Changeset %s not found"
 
msgstr "Δεν βρέθηκε το σετ αλλαγών %s"
 

	
 
msgid "Show all combined changesets %s->%s"
 
msgstr "Εμφάνιση όλων των συνδυασμένων σετ αλλαγών %s->%s"
 

	
 
msgid "Compare view"
 
msgstr "Σύγκριση εμφάνισης"
 

	
 
msgid "and"
 
msgstr "και"
 

	
 
msgid "%s more"
 
msgstr "%s επιπλέον"
 

	
 
msgid "revisions"
 
msgstr "αναθεωρήσεις"
 

	
 
msgid "Fork name %s"
 
msgstr "Όνομα κλώνου %s"
 

	
 
msgid "Pull request %s"
 
msgstr "Αίτημα έλξης %s"
 

	
 
msgid "[deleted] repository"
 
msgstr "[διαγραμμένο] αποθετήριο"
 

	
 
msgid "[created] repository"
 
msgstr "[δημιουργημένο] αποθετήριο"
 

	
 
msgid "[updated] repository"
 
msgstr "[ενημερωμένο] αποθετήριο"
 

	
 
msgid "[downloaded] archive from repository"
 
msgstr "[λήψη] αρχείο από το αποθετήριο"
 

	
 
msgid "[delete] repository"
 
msgstr "[διαγραμμένο] αποθετήριο"
 

	
 
msgid " and %s more"
 
msgstr " και %s περισσότερα"
 

	
 
msgid "No files"
 
msgstr "Δεν υπάρχουν αρχεία"
 

	
 
msgid "new file"
 
msgstr "νέο αρχείο"
 

	
 
msgid "mod"
 
msgstr "τροποποιημένο"
 

	
 
msgid "del"
 
msgstr "διαγραμμένο"
 

	
 
msgid "rename"
 
msgstr "μετονομασμένο"
 

	
 
msgid "chmod"
 
msgstr "αλλ δικαιωμ"
 

	
 
msgid ""
 
"%s repository is not mapped to db perhaps it was created or renamed from "
 
"the filesystem please run the application again in order to rescan "
 
"repositories"
 
msgstr ""
 
"Το αποθετήριο δεδομένων %s δεν έχει αντιστοιχιστεί στη βάση δεδομένων. "
 
"Ίσως δημιουργήθηκε ή μετονομάστηκε από το σύστημα αρχείων. Εκτελέστε ξανά "
 
"την εφαρμογή για να σαρώσετε ξανά τα αποθετήρια δεδομένων"
 

	
 
msgid "SSH key is missing"
 
msgstr "Το κλειδί SSH λείπει"
 

	
 
msgid ""
 
"Incorrect SSH key - it must have both a key type and a base64 part, like "
 
"'ssh-rsa ASRNeaZu4FA...xlJp='"
 
msgstr ""
 
"Λανθασμένο κλειδί SSH - πρέπει να έχει έναν τύπο κλειδιού καθώς και ένα "
 
"τμήμα base64, όπως \"ssh-rsa ASRNeaZu4FA ... xlJp =\""
 

	
 
msgid "Incorrect SSH key - it must start with 'ssh-(rsa|dss|ed25519)'"
 
msgstr "Εσφαλμένο κλειδί SSH - πρέπει να ξεκινά με 'ssh-(rsa|dss|ed25519)'"
 

	
 
msgid "Incorrect SSH key - unexpected characters in base64 part %r"
 
msgstr ""
 
"Εσφαλμένο κλειδί SSH - μη αναμενόμενοι χαρακτήρες στο τμήμα base64 %r"
 

	
 
msgid "Incorrect SSH key - failed to decode base64 part %r"
 
msgstr ""
 
"Εσφαλμένο κλειδί SSH - απέτυχε η αποκωδικοποίηση του τμήματος base64 %r"
 

	
 
msgid "Incorrect SSH key - base64 part is not %r as claimed but %r"
 
msgstr ""
 
"Εσφαλμένο κλειδί SSH - το base64 μέρος δεν είναι %r όπως ζητήθηκε, αλλά %r"
 

	
 
msgid "%d year"
 
msgid_plural "%d years"
 
msgstr[0] "%d έτος"
 
msgstr[1] "%d έτη"
 

	
 
msgid "%d month"
 
msgid_plural "%d months"
 
msgstr[0] "%d μήνας"
 
msgstr[1] "%d μήνες"
 

	
 
msgid "%d day"
 
msgid_plural "%d days"
 
msgstr[0] "%d ημέρα"
 
msgstr[1] "%d ημέρες"
 

	
 
msgid "%d hour"
 
msgid_plural "%d hours"
 
msgstr[0] "%d ώρα"
 
msgstr[1] "%d ώρες"
 

	
 
msgid "%d minute"
 
msgid_plural "%d minutes"
 
msgstr[0] "%d λεπτό"
 
msgstr[1] "%d λεπτά"
 

	
 
msgid "%d second"
 
msgid_plural "%d seconds"
 
msgstr[0] "%d δευτερόλεπτο"
 
msgstr[1] "%d δευτερόλεπτα"
 

	
 
msgid "in %s"
 
msgstr "σε %s"
 

	
 
msgid "%s ago"
 
msgstr "%s πριν"
 

	
 
msgid "in %s and %s"
 
msgstr "σε %s και %s"
 

	
 
msgid "%s and %s ago"
 
msgstr "%s και %s πριν"
 

	
 
msgid "just now"
 
msgstr "μόλις τώρα"
 

	
 
msgid "on line %s"
 
msgstr "στη γραμμή %s"
 

	
 
msgid "[Mention]"
 
msgstr "[Αναφορά]"
 

	
 
msgid "top level"
 
msgstr "ανώτερο επίπεδο"
 

	
 
msgid "Kallithea Administrator"
 
msgstr "Διαχειριστής Καλλιθέας"
 

	
 
msgid "Default user has no access to new repositories"
 
msgstr "Ο προεπιλεγμένος χρήστης δεν έχει πρόσβαση σε νέα αποθετήρια"
 

	
 
msgid "Default user has read access to new repositories"
 
msgstr "Ο προεπιλεγμένος χρήστης έχει πρόσβαση ανάγνωσης σε νέα αποθετήρια"
 

	
 
msgid "Default user has write access to new repositories"
 
msgstr "Ο προεπιλεγμένος χρήστης έχει πρόσβαση εγγραφής σε νέα αποθετήρια"
 

	
 
msgid "Default user has admin access to new repositories"
 
msgstr ""
 
"Ο προεπιλεγμένος χρήστης έχει πρόσβαση διαχειριστή σε νέα αποθετήρια"
 

	
 
msgid "Default user has no access to new repository groups"
 
msgstr ""
 
"Ο προεπιλεγμένος χρήστης δεν έχει πρόσβαση σε νέες ομάδες αποθετηρίων"
 

	
 
msgid "Default user has read access to new repository groups"
 
msgstr ""
 
"Ο προεπιλεγμένος χρήστης έχει πρόσβαση ανάγνωσης σε νέες ομάδες "
 
"αποθετηρίων"
 

	
 
msgid "Default user has write access to new repository groups"
 
msgstr ""
 
"Ο προεπιλεγμένος χρήστης έχει πρόσβαση εγγραφής σε νέες ομάδες αποθετηρίων"
 

	
 
msgid "Default user has admin access to new repository groups"
 
msgstr ""
 
"Ο προεπιλεγμένος χρήστης έχει πρόσβαση διαχειριστή σε νέες ομάδες "
 
"αποθετηρίων"
 

	
 
msgid "Default user has no access to new user groups"
 
msgstr "Ο προεπιλεγμένος χρήστης δεν έχει πρόσβαση σε νέες ομάδες χρηστών"
 

	
 
msgid "Default user has read access to new user groups"
 
msgstr ""
 
"Ο προεπιλεγμένος χρήστης έχει πρόσβαση ανάγνωσης σε νέες ομάδες χρηστών"
 

	
 
msgid "Default user has write access to new user groups"
 
msgstr ""
 
"Ο προεπιλεγμένος χρήστης έχει πρόσβαση εγγραφής σε νέες ομάδες χρηστών"
 

	
 
msgid "Default user has admin access to new user groups"
 
msgstr ""
 
"Ο προεπιλεγμένος χρήστης έχει πρόσβαση διαχειριστή σε νέες ομάδες χρηστών"
 

	
 
msgid "Only admins can create repository groups"
 
msgstr "Μόνο οι διαχειριστές μπορούν να δημιουργήσουν ομάδες αποθετηρίων"
 

	
 
msgid "Non-admins can create repository groups"
 
msgstr "Οι μη διαχειριστές μπορούν να δημιουργήσουν ομάδες αποθετηρίων"
 

	
 
msgid "Only admins can create user groups"
 
msgstr "Μόνο οι διαχειριστές μπορούν να δημιουργήσουν ομάδες χρηστών"
 

	
 
msgid "Non-admins can create user groups"
 
msgstr "Οι μη διαχειριστές μπορούν να δημιουργήσουν ομάδες χρηστών"
 

	
 
msgid "Only admins can create top level repositories"
 
msgstr ""
 
"Μόνο οι διαχειριστές μπορούν να δημιουργήσουν αποθετήρια ανώτατου επιπέδου"
 

	
 
msgid "Non-admins can create top level repositories"
 
msgstr ""
 
"Οι μη διαχειριστές μπορούν να δημιουργήσουν αποθετήρια ανώτατου επιπέδου"
 

	
 
msgid ""
 
"Repository creation enabled with write permission to a repository group"
 
msgstr ""
 
"Η δημιουργία αποθετηρίου είναι ενεργοποιημένη με δικαιώματα εγγραφής σε "
 
"μια ομάδα αποθετηρίων"
 

	
 
msgid ""
 
"Repository creation disabled with write permission to a repository group"
 
msgstr ""
 
"Η δημιουργία αποθετηρίου απενεργοποιήθηκε με δικαιώματα εγγραφής σε μια "
 
"ομάδα αποθετηρίων"
 

	
 
msgid "Registration disabled"
 
msgstr "Η εγγραφή απενεργοποιήθηκε"
 

	
 
msgid "User registration with manual account activation"
 
msgstr "Εγγραφή χρήστη με χειροκίνητη ενεργοποίηση λογαριασμού"
 

	
 
msgid "User registration with automatic account activation"
 
msgstr "Εγγραφή χρήστη με αυτόματη ενεργοποίηση λογαριασμού"
 

	
 
msgid "Not reviewed"
 
msgstr "Δεν έχει ελεγχθεί"
 

	
 
msgid "Under review"
 
msgstr "Υπό εξέταση"
 

	
 
msgid "Not approved"
 
msgstr "Δεν έχει εγκριθεί"
 

	
 
msgid "Approved"
 
msgstr "Εγκρίθηκε"
 

	
 
msgid "Please enter a login"
 
msgstr "Παρακαλώ εισάγετε ένα όνομα χρήστη"
 

	
 
msgid "Enter a value %(min)i characters long or more"
 
msgstr "Εισαγάγετε μια τιμή με μήκος %(min)i χαρακτήρες ή περισσότερους"
 

	
 
msgid "Please enter a password"
 
msgstr "Παρακαλώ εισάγετε έναν κωδικό πρόσβασης"
 

	
 
msgid "Enter %(min)i characters or more"
 
msgstr "Εισαγάγετε %(min)i χαρακτήρες ή περισσότερους"
 

	
 
msgid "Name must not contain only digits"
 
msgstr "Το όνομα δεν πρέπει να περιέχει μόνο ψηφία"
 

	
 
msgid "New user %(new_username)s registered"
 
msgstr "Καταχωρήθηκε νέος χρήστης %(new_username)s"
 

	
 
msgid "Closing"
 
msgstr "Κλείσιμο"
 

	
 
msgid ""
 
"%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 
msgstr ""
 
"Ο χρήστης %(user)s θέλει να αναθεωρήσετε την αίτηση έλξης %(pr_nice_id)s: "
 
"%(pr_title)s"
 

	
 
msgid "Cannot create empty pull request"
 
msgstr "Δεν είναι δυνατή η δημιουργία κενής αίτησης έλξης"
 

	
 
msgid ""
 
"Cannot create pull request - criss cross merge detected, please merge a "
 
"later %s revision to %s"
 
msgstr ""
 
"Δεν είναι δυνατή η δημιουργία αίτησης έλξης - εντοπίστηκε διασταυρούμενη "
 
"συγχώνευση, παρακαλώ συγχωνεύστε μια μεταγενέστερη αναθεώρηση %s στο %s"
 

	
 
msgid "You are not authorized to create the pull request"
 
msgstr "Δεν έχετε εξουσιοδότηση για τη δημιουργία του αιτήματος έλξης"
 

	
 
msgid "Missing changesets since the previous iteration:"
 
msgstr "Λείπουν σετ αλλαγών από την προηγούμενη επανάληψη:"
 

	
 
msgid "New changesets on %s %s since the previous iteration:"
 
msgstr "Νέα σετ αλλαγών στο %s %s από την προηγούμενη επανάληψη:"
 

	
 
msgid "Ancestor didn't change - diff since previous iteration:"
 
msgstr "Ο πρόγονος δεν άλλαξε - διαφορά από την προηγούμενη επανάληψη:"
 

	
 
msgid ""
 
"This iteration is based on another %s revision and there is no simple "
 
"diff."
 
msgstr ""
 
"Αυτή η επανάληψη βασίζεται σε μια άλλη αναθεώρηση %s και δεν υπάρχει απλή "
 
"διαφορά."
 

	
 
msgid "No changes found on %s %s since previous iteration."
 
msgstr "Δεν βρέθηκαν αλλαγές στο %s %s από την προηγούμενη έκδοση."
 

	
 
msgid "Closed, next iteration: %s ."
 
msgstr "Κλειστή, επόμενη επανάληψη: %s ."
 

	
 
msgid "latest tip"
 
msgstr "τελευταία κεφαλή"
 

	
 
msgid "SSH key %r is invalid: %s"
 
msgstr "Το κλειδί SSH %r δεν είναι έγκυρο: %s"
 

	
 
msgid "SSH key %s is already used by %s"
 
msgstr "Το κλειδί SSH %s χρησιμοποιείται ήδη από το χρήστη %s"
 

	
 
msgid "SSH key with fingerprint %r found"
 
msgstr "Βρέθηκε κλειδί SSH με δακτυλικό αποτύπωμα %r"
 

	
 
msgid "New user registration"
 
msgstr "Εγγραφή νέου χρήστη"
 

	
 
msgid ""
 
"You can't remove this user since it is crucial for the entire application"
 
msgstr ""
 
"Δεν μπορείτε να καταργήσετε αυτόν το χρήστη, καθώς είναι ζωτικής σημασίας "
 
"για ολόκληρη την εφαρμογή"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repositories and cannot be removed. Switch "
 
"owners or remove those repositories: %s"
 
msgstr ""
 
"Ο χρήστης \"%s\" εξακολουθεί να κατέχει %s αποθετήρια και δεν είναι "
 
"δυνατόν να αφαιρεθεί. Αλλάξτε κάτοχο ή καταργείστε αυτά τα αποθετήρια: %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repository groups and cannot be removed. Switch "
 
"owners or remove those repository groups: %s"
 
msgstr ""
 
"Ο χρήστης \"%s\" εξακολουθεί να κατέχει %s ομάδες αποθετηρίων και δεν "
 
"είναι δυνατόν να αφαιρεθεί. Αλλάξτε κάτοχο ή καταργείστε αυτές τις "
 
"ομάδες: %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s user groups and cannot be removed. Switch "
 
"owners or remove those user groups: %s"
 
msgstr ""
 
"Ο χρήστης \"%s\" εξακολουθεί να κατέχει %s ομάδες χρηστών και δεν είναι "
 
"δυνατόν να αφαιρεθεί. Αλλάξτε κάτοχο ή αφαιρέστε αυτές τις ομάδες "
 
"χρηστών: %s"
 

	
 
msgid "Password reset link"
 
msgstr "Σύνδεσμος επαναφοράς κωδικού πρόσβασης"
 

	
 
msgid "Password reset notification"
 
msgstr "Ειδοποίηση επαναφοράς κωδικού πρόσβασης"
 

	
 
msgid ""
 
"The password to your account %s has been changed using password reset "
 
"form."
 
msgstr ""
 
"Ο κωδικός πρόσβασης στο λογαριασμό σας %s έχει αλλάξει χρησιμοποιώντας τη "
 
"φόρμα επαναφοράς κωδικού πρόσβασης."
 

	
 
msgid "Value cannot be an empty list"
 
msgstr "Η τιμή δεν μπορεί να είναι μια κενή λίστα"
 

	
 
msgid "Username \"%(username)s\" already exists"
 
msgstr "Το όνομα χρήστη \"%(username)s\" υπάρχει ήδη"
 

	
 
msgid "Username \"%(username)s\" cannot be used"
 
msgstr "Δεν είναι δυνατή η χρήση του ονόματος χρήστη \"%(username)s\""
 

	
 
msgid ""
 
"Username may only contain alphanumeric characters underscores, periods or "
 
"dashes and must begin with an alphanumeric character or underscore"
 
msgstr ""
 
"Το όνομα χρήστη μπορεί να περιέχει μόνο αλφαριθμητικούς χαρακτήρες, κάτω "
 
"παύλες, τελείες ή παύλες και πρέπει να ξεκινά με αλφαριθμητικό χαρακτήρα "
 
"ή κάτω παύλα"
 

	
 
msgid "The input is not valid"
 
msgstr "Η είσοδος δεν είναι έγκυρη"
 

	
 
msgid "Username %(username)s is not valid"
 
msgstr "Το όνομα χρήστη %(username)s δεν είναι έγκυρο"
 

	
 
msgid "Invalid user group name"
 
msgstr "Μη έγκυρο όνομα ομάδας χρηστών"
 

	
 
msgid "User group \"%(usergroup)s\" already exists"
 
msgstr "Η ομάδα χρηστών \"%(usergroup)s\" υπάρχει ήδη"
 

	
 
msgid ""
 
"user group name may only contain alphanumeric characters underscores, "
 
"periods or dashes and must begin with alphanumeric character"
 
msgstr ""
 
"Το όνομα της ομάδας χρηστών μπορεί να περιέχει μόνο αλφαριθμητικούς "
 
"χαρακτήρες, κάτω παύλες, τελείες ή παύλες και πρέπει να ξεκινά με "
 
"αλφαριθμητικό χαρακτήρα"
 

	
 
msgid "Cannot assign this group as parent"
 
msgstr "Δεν είναι δυνατή η εκχώρηση αυτής της ομάδας ως γονικής"
 

	
 
msgid "Group \"%(group_name)s\" already exists"
 
msgstr "Η ομάδα \"%(group_name)s\" υπάρχει ήδη"
 

	
 
msgid "Repository with name \"%(group_name)s\" already exists"
 
msgstr "Το αποθετήριο με όνομα \"%(group_name)s\" υπάρχει ήδη"
 

	
 
msgid "Invalid characters (non-ascii) in password"
 
msgstr "Μη έγκυροι χαρακτήρες (μη ascii) στον κωδικό πρόσβασης"
 

	
 
msgid "Invalid old password"
 
msgstr "Ο παλιός κωδικός πρόσβασης δεν είναι έγκυρος"
 

	
 
msgid "Passwords do not match"
 
msgstr "Οι κωδικοί πρόσβασης δεν ταιριάζουν"
 

	
 
msgid "Invalid username or password"
 
msgstr "Το όνομα χρήστη ή ο κωδικός πρόσβασης δεν είναι έγκυρος"
 

	
 
msgid "Repository name %(repo)s is not allowed"
 
msgstr "Δεν επιτρέπεται το %(repo)s ως όνομα του αποθετηρίου"
 

	
 
msgid "Repository named %(repo)s already exists"
 
msgstr "Το αποθετήριο με το όνομα %(repo)s υπάρχει ήδη"
 

	
 
msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 
msgstr "Το αποθετήριο \"%(repo)s\" υπάρχει ήδη στην ομάδα \"%(group)s\""
 

	
 
msgid "Repository group with name \"%(repo)s\" already exists"
 
msgstr "Η ομάδα αποθετηρίου με το όνομα \"%(repo)s\" υπάρχει ήδη"
 

	
 
msgid "Invalid repository URL"
 
msgstr "Μη έγκυρη διεύθυνση URL αποθετηρίου"
 

	
 
msgid ""
 
"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
 
"svn+https URL"
 
msgstr ""
 
"Μη έγκυρη διεύθυνση URL του αποθετηρίου. Πρέπει να είναι μια έγκυρη http, "
 
"https, ssh, svn+http ή svn+https διεύθυνση URL"
 

	
 
msgid "You don't have permissions to create repository in this group"
 
msgstr "Δεν έχετε δικαιώματα δημιουργίας αποθετηρίου σε αυτήν την ομάδα"
 

	
 
msgid "no permission to create repository in root location"
 
msgstr "Δεν υπάρχει δικαίωμα δημιουργίας αποθετηρίου στη ριζική τοποθεσία"
 

	
 
msgid "You don't have permissions to create a group in this location"
 
msgstr "Δεν έχετε δικαιώματα δημιουργίας ομάδας σε αυτήν την τοποθεσία"
 

	
 
msgid "This username or user group name is not valid"
 
msgstr "Αυτό το όνομα χρήστη ή το όνομα ομάδας χρηστών δεν είναι έγκυρο"
 

	
 
msgid "This is not a valid path"
 
msgstr "Αυτή η διαδρομή δεν είναι έγκυρη"
 

	
 
msgid "This email address is already in use"
 
msgstr "Αυτή η διεύθυνση ηλεκτρονικού ταχυδρομείου χρησιμοποιείται ήδη"
 

	
 
msgid "Email address \"%(email)s\" not found"
 
msgstr "Η διεύθυνση ηλεκτρονικού ταχυδρομείου \"%(email)s\" δεν βρέθηκε"
 

	
 
msgid ""
 
"The LDAP Login attribute of the CN must be specified - this is the name "
 
"of the attribute that is equivalent to \"username\""
 
msgstr ""
 
"Πρέπει να προσδιοριστεί το χαρακτηριστικό LDAP Login του CN - αυτό είναι "
 
"το όνομα του χαρακτηριστικού που είναι ισοδύναμο με το \"όνομα χρήστη\""
 

	
 
msgid "Please enter a valid IPv4 or IPv6 address"
 
msgstr "Παρακαλώ εισαγάγετε μια έγκυρη διεύθυνση IPv4 ή IPv6"
 

	
 
msgid ""
 
"The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 
msgstr ""
 
"Το μέγεθος δικτύου (bits) πρέπει να βρίσκεται εντός της περιοχής 0-32 "
 
"(όχι %(bits)r)"
 

	
 
msgid "Key name can only consist of letters, underscore, dash or numbers"
 
msgstr ""
 
"Το όνομα κλειδιού μπορεί να αποτελείται μόνο από γράμματα, κάτω παύλα, "
 
"παύλα ή αριθμούς"
 

	
 
msgid "Filename cannot be inside a directory"
 
msgstr "Το όνομα αρχείου δεν μπορεί να βρίσκεται μέσα σε έναν κατάλογο"
 

	
 
msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 
msgstr ""
 
"Τα πρόσθετα %(loaded)s και %(next_to_load)s εξάγουν και τα δύο το ίδιο "
 
"όνομα"
 

	
 
msgid "About"
 
msgstr "Σχετικά"
 

	
 
msgid "Add Repository"
 
msgstr "Προσθήκη Αποθετηρίου"
 

	
 
msgid "Add Repository Group"
 
msgstr "Προσθήκη Ομάδας Αποθετηρίων"
 

	
 
msgid "You have admin right to this group, and can edit it"
 
msgstr ""
 
"Έχετε δικαίωμα διαχειριστή σε αυτήν την ομάδα και μπορείτε να την "
 
"επεξεργαστείτε"
 

	
 
msgid "Edit Repository Group"
 
msgstr "Επεξεργασία Ομάδας Αποθετηρίων"
 

	
 
msgid "Repository"
 
msgstr "Αποθετήριο"
 

	
 
msgid "Description"
 
msgstr "Περιγραφή"
 

	
 
msgid "Last Change"
 
msgstr "Τελευταία Αλλαγή"
 

	
 
msgid "Tip"
 
msgstr "Κεφαλή"
 

	
 
msgid "Owner"
 
msgstr "Κάτοχος"
 

	
 
msgid "Log In"
 
msgstr "Σύνδεση"
 

	
 
msgid "Log In to %s"
 
msgstr "Συνδεθείτε στο %s"
 

	
 
msgid "Username"
 
msgstr "Όνομα χρήστη"
 

	
 
msgid "Password"
 
msgstr "Κωδικό πρόσβασης"
 

	
 
msgid "Stay logged in after browser restart"
 
msgstr ""
 
"Μείνετε συνδεδεμένοι μετά την επανεκκίνηση του προγράμματος περιήγησης"
 

	
 
msgid "Forgot your password ?"
 
msgstr "Ξεχάσατε τον κωδικό σας;"
 

	
 
msgid "Don't have an account ?"
 
msgstr "Δεν έχετε λογαριασμό;"
 

	
 
msgid "Sign In"
 
msgstr "Είσοδος"
 

	
 
msgid "Password Reset"
 
msgstr "Επαναφορά κωδικού"
 

	
 
msgid "Reset Your Password to %s"
 
msgstr "Επαναφορά του κωδικού πρόσβασής σας στο %s"
 

	
 
msgid "Reset Your Password"
 
msgstr "Επαναφορά του κωδικού πρόσβασής σας"
 

	
 
msgid "Email Address"
 
msgstr "Διεύθυνση ηλεκτρονικού ταχυδρομείου"
 

	
 
msgid "Captcha"
 
msgstr "Captcha"
 

	
 
msgid "Send Password Reset Email"
 
msgstr ""
 
"Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου για την επαναφορά του "
 
"κωδικού πρόσβασης"
 

	
 
msgid ""
 
"A password reset link will be sent to the specified email address if it "
 
"is registered in the system."
 
msgstr ""
 
"Ένας σύνδεσμος για την επαναφορά του κωδικού πρόσβασης θα σταλεί στην "
 
"καθορισμένη διεύθυνση ηλεκτρονικού ταχυδρομείου, εάν έχει καταχωρηθεί στο "
 
"σύστημα."
 

	
 
msgid "You are about to set a new password for the email address %s."
 
msgstr ""
 
"Πρόκειται να ορίσετε έναν νέο κωδικό πρόσβασης για τη διεύθυνση "
 
"ηλεκτρονικού ταχυδρομείου %s."
 

	
 
msgid ""
 
"Note that you must use the same browser session for this as the one used "
 
"to request the password reset."
 
msgstr ""
 
"Λάβετε υπόψη ότι πρέπει να χρησιμοποιήσετε την ίδια περίοδο λειτουργίας "
 
"του προγράμματος περιήγησης με αυτήν που χρησιμοποιήθηκε για να ζητήσετε "
 
"την επαναφορά του κωδικού πρόσβασης."
 

	
 
msgid "Code you received in the email"
 
msgstr "Κωδικός που λάβατε στο μήνυμα ηλεκτρονικού ταχυδρομείου"
 

	
 
msgid "New Password"
 
msgstr "Νέος Κωδικός"
 

	
 
msgid "Confirm New Password"
 
msgstr "Επιβεβαίωση Νέου Κωδικού Πρόσβασης"
 

	
 
msgid "Confirm"
 
msgstr "Επιβεβαίωση"
 

	
 
msgid "Sign Up"
 
msgstr "Εγγραφή"
 

	
 
msgid "Sign Up to %s"
 
msgstr "Εγγραφείτε στο %s"
 

	
 
msgid "Re-enter password"
 
msgstr "Εισαγάγετε ξανά τον κωδικό πρόσβασης"
 

	
 
msgid "First Name"
 
msgstr "Όνομα"
 

	
 
msgid "Last Name"
 
msgstr "Επώνυμο"
 

	
 
msgid "Email"
 
msgstr "Διεύθυνση Ηλεκτρονικού Ταχυδρομείου"
 

	
 
msgid "Registered accounts are ready to use and need no further action."
 
msgstr ""
 
"Οι εγγεγραμμένοι λογαριασμοί είναι έτοιμοι για χρήση και δεν χρειάζονται "
 
"περαιτέρω ενέργειες."
 

	
 
msgid "Please wait for an administrator to activate your account."
 
msgstr ""
 
"Περιμένετε έως ότου ένας διαχειριστής ενεργοποιήσει τον λογαριασμό σας."
 

	
 
msgid "Admin Journal"
 
msgstr "Ημερολόγιο Διαχειριστή"
 

	
 
msgid "journal filter..."
 
msgstr "φίλτρο εγγραφών..."
 

	
 
msgid "Filter"
 
msgstr "Φίλτρο"
 

	
 
msgid "%s Entry"
 
msgid_plural "%s Entries"
 
msgstr[0] "%s Καταχώρηση"
 
msgstr[1] "%s Καταχωρήσεις"
 

	
 
msgid "Action"
 
msgstr "Ενέργεια"
 

	
 
msgid "Date"
 
msgstr "Ημερομηνία"
 

	
 
msgid "From IP"
 
msgstr "Από IP"
 

	
 
msgid "No actions yet"
 
msgstr "Καμία ενέργεια ακόμα"
 

	
 
msgid "Authentication Settings"
 
msgstr "Ρυθμίσεις ελέγχου ταυτότητας"
 

	
 
msgid "Authentication"
 
msgstr "Έλεγχος ταυτότητας"
 

	
 
msgid "Authentication Plugins"
 
msgstr "Πρόσθετα ελέγχου ταυτότητας"
 

	
 
msgid "Enabled Plugins"
 
msgstr "Ενεργοποιημένα Πρόσθετα"
 

	
 
msgid ""
 
"Comma-separated list of plugins; Kallithea will try user authentication "
 
"in plugin order"
 
msgstr ""
 
"Λίστα πρόσθετων διαχωρισμένη με κόμματα. Η Καλλιθέα θα προσπαθήσει να "
 
"ελέγξει την ταυτότητα του χρήστη με τη σειρά του πρόσθετου"
 

	
 
msgid "Available built-in plugins"
 
msgstr "Διαθέσιμα ενσωματωμένα πρόσθετα"
 

	
 
msgid "Plugin"
 
msgstr "Πρόσθετο"
 

	
 
msgid "Save"
 
msgstr "Αποθήκευση"
 

	
 
msgid "Repository Defaults"
 
msgstr "Προεπιλογές Αποθετηρίου"
 

	
 
msgid "Type"
 
msgstr "Τύπος"
 

	
 
msgid "Private repository"
 
msgstr "Ιδιωτικό αποθετήριο"
 

	
 
msgid ""
 
"Private repositories are only visible to people explicitly added as "
 
"collaborators."
 
msgstr ""
 
"Τα ιδιωτικά αποθετήρια είναι ορατά μόνο σε άτομα που προστίθενται ρητά ως "
 
"συνεργάτες."
 

	
 
msgid "Enable statistics"
 
msgstr "Ενεργοποίηση στατιστικών"
 

	
 
msgid "Enable statistics window on summary page."
 
msgstr "Ενεργοποίηση παραθύρου στατιστικών στοιχείων στη σελίδα περίληψης."
 

	
 
msgid "Enable downloads"
 
msgstr "Ενεργοποίηση λήψεων"
 

	
 
msgid "Enable download menu on summary page."
 
msgstr "Ενεργοποίηση μενού λήψης στη σελίδα περίληψης."
 

	
 
msgid "Edit Gist"
 
msgstr "Επεξεργασία Gist"
 

	
 
msgid ""
 
"Gist was updated since you started editing. Copy your changes and click "
 
"%(here)s to reload new version."
 
msgstr ""
 
"Το gist ενημερώθηκε από τότε που αρχίσατε την επεξεργασία. Αντιγράψτε τις "
 
"αλλαγές σας και κάντε κλικ στο κουμπί %(here)s για να φορτώσετε τη νέα "
 
"έκδοση."
 

	
 
msgid "here"
 
msgstr "εδώ"
 

	
 
msgid "Gist description ..."
 
msgstr "Περιγραφή gist..."
 

	
 
msgid "Gist lifetime"
 
msgstr "Διάρκεια ζωής του gist"
 

	
 
msgid "Expires"
 
msgstr "Λήγει"
 

	
 
msgid "Never"
 
msgstr "Ποτέ"
 

	
 
msgid "Update Gist"
 
msgstr "Ενημέρωση του gist"
 

	
 
msgid "Cancel"
 
msgstr "Ακύρωση"
 

	
 
msgid "Private Gists for User %s"
 
msgstr "Ιδιωτικά gists για το χρήστη %s"
 

	
 
msgid "Public Gists for User %s"
 
msgstr "Δημόσια gists για το χρήστη %s"
 

	
 
msgid "Public Gists"
 
msgstr "Δημόσια Gists"
 

	
 
msgid "Create New Gist"
 
msgstr "Δημιουργία Νέου Gist"
 

	
 
msgid "Created"
 
msgstr "Δημιουργήθηκε"
 

	
 
msgid "There are no gists yet"
 
msgstr "Δεν υπάρχουν ακόμη gists"
 

	
 
msgid "New Gist"
 
msgstr "Νέο Gist"
 

	
 
msgid "Name this gist ..."
 
msgstr "Ονομάστε αυτό το gist..."
 

	
 
msgid "Create Private Gist"
 
msgstr "Δημιουργία Ιδιωτικού Gist"
 

	
 
msgid "Create Public Gist"
 
msgstr "Δημιουργία Δημόσιου Gist"
 

	
 
msgid "Reset"
 
msgstr "Επαναφορά"
 

	
 
msgid "Gist"
 
msgstr "Gist"
 

	
 
msgid "URL"
 
msgstr "URL"
 

	
 
msgid "Public Gist"
 
msgstr "Δημόσιο Gist"
 

	
 
msgid "Private Gist"
 
msgstr "Ιδιωτικό Gist"
 

	
 
msgid "Delete"
 
msgstr "Διαγραφή"
 

	
 
msgid "Confirm to delete this Gist"
 
msgstr "Επιβεβαίωση για διαγραφή αυτού του Gist"
 

	
 
msgid "Edit"
 
msgstr "Επεξεργασία"
 

	
 
msgid "Show as Raw"
 
msgstr "Ακατέργαστη Εμφάνιση"
 

	
 
msgid "created"
 
msgstr "δημιουργήθηκε"
 

	
 
msgid "Show as raw"
 
msgstr "Ακατέργαστη εμφάνιση"
 

	
 
msgid "My Account"
 
msgstr "Ο Λογαριασμός Μου"
 

	
 
msgid "Profile"
 
msgstr "Προφίλ"
 

	
 
msgid "Email Addresses"
 
msgstr "Διευθύνσεις ηλεκτρονικού ταχυδρομείου"
 

	
 
msgid "SSH Keys"
 
msgstr "Κλειδιά SSH"
 

	
 
msgid "API Keys"
 
msgstr "Κλειδιά API"
 

	
 
msgid "Owned Repositories"
 
msgstr "Αποθετήρια που μου Ανήκουν"
 

	
 
msgid "Watched Repositories"
 
msgstr "Αποθετήρια που Παρακολουθώ"
 

	
 
msgid "Show Permissions"
 
msgstr "Εμφάνιση Δικαιωμάτων"
 

	
 
msgid "Built-in"
 
msgstr "Ενσωματωμένο"
 

	
 
msgid "Confirm to reset this API key: %s"
 
msgstr "Επιβεβαίωση για επαναφορά αυτού του κλειδιού API: %s"
 

	
 
msgid "Expired"
 
msgstr "Έληξε"
 

	
 
msgid "Confirm to remove this API key: %s"
 
msgstr "Επιβεβαίωση κατάργησης αυτού του κλειδιού API: %s"
 

	
 
msgid "Remove"
 
msgstr "Κατάργηση"
 

	
 
msgid "No additional API keys specified"
 
msgstr "Δεν έχουν καθοριστεί πρόσθετα κλειδιά API"
 

	
 
msgid "New API key"
 
msgstr "Νέο κλειδί API"
 

	
 
msgid "Add"
 
msgstr "Προσθήκη"
 

	
 
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 χρησιμοποιούνται για να επιτρέπουν προγράμματα ή υπηρεσίες "
 
"να έχουν πρόσβαση στο %s χρησιμοποιώντας το λογαριασμό σας, σαν να "
 
"παρείχατε στο πρόγραμμα ή την υπηρεσία, τον πραγματικό σας κωδικό "
 
"πρόσβασης.\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"
 
"Όπως οι κωδικοί πρόσβασης, τα κλειδιά API δεν πρέπει επομένως να "
 
"κοινοποιούνται ποτέ σε άλλους,\n"
 
"ούτε να μεταβιβάζονται σε μη αξιόπιστα προγράμματα ή υπηρεσίες. Εάν μια "
 
"τέτοια κοινοποίηση πρέπει\n"
 
"γίνει, επαναφέρετε το κλειδί API σε αυτήν τη σελίδα για να αποφύγετε "
 
"περαιτέρω χρήση.\n"
 

	
 
msgid "Primary"
 
msgstr "Πρωτεύων"
 

	
 
msgid "Confirm to delete this email: %s"
 
msgstr ""
 
"Επιβεβαίωση διαγραφής αυτού του μηνύματος ηλεκτρονικού ταχυδρομείου: %s"
 

	
 
msgid "No additional emails specified."
 
msgstr "Δεν έχουν καθοριστεί πρόσθετα μηνύματα ηλεκτρονικού ταχυδρομείου."
 

	
 
msgid "New email address"
 
msgstr "Νέα διεύθυνση ηλεκτρονικού ταχυδρομείου"
 

	
 
msgid "Change Your Account Password"
 
msgstr "Αλλαγή του Κωδικού Πρόσβασης του Λογαριασμού σας"
 

	
 
msgid "Current password"
 
msgstr "Τρέχων κωδικός πρόσβασης"
 

	
 
msgid "New password"
 
msgstr "Νέος κωδικός πρόσβασης"
 

	
 
msgid "Confirm new password"
 
msgstr "Επιβεβαίωση νέου κωδικού πρόσβασης"
 

	
 
msgid ""
 
"This account is managed with %s and the password cannot be changed here"
 
msgstr ""
 
"Η διαχείριση αυτού του λογαριασμού γίνεται με %s και ο κωδικός πρόσβασης "
 
"δεν μπορεί να αλλάξει εδώ"
 

	
 
msgid "Current IP"
 
msgstr "Τρέχουσα IP"
 

	
 
msgid "Gravatar"
 
msgstr "Gravatar"
 

	
 
msgid "Change %s avatar at"
 
msgstr "Αλλαγή avatar %s στο"
 

	
 
msgid "Avatars are disabled"
 
msgstr "Τα Avatars είναι απενεργοποιημένα"
 

	
 
msgid "Repositories You Own"
 
msgstr "Αποθετήρια που σας ανήκουν"
 

	
 
msgid "Name"
 
msgstr "Όνομα"
 

	
 
msgid "Fingerprint"
 
msgstr "Αποτύπωμα"
 

	
 
msgid "Last Used"
 
msgstr "Τελευταία χρησιμοποιήθηκε"
 

	
 
msgid "Confirm to remove this SSH key: %s"
 
msgstr "Επιβεβαίωση κατάργησης αυτού του κλειδιού SSH: %s"
 

	
 
msgid "No SSH keys have been added"
 
msgstr "Δεν έχουν προστεθεί κλειδιά SSH"
 

	
 
msgid "New SSH key"
 
msgstr "Νέο κλειδί SSH"
 

	
 
msgid "Public key"
 
msgstr "Δημόσιο κλειδί"
 

	
 
msgid "Public key (contents of e.g. ~/.ssh/id_rsa.pub)"
 
msgstr "Δημόσιο κλειδί (περιεχόμενο π.χ. ~/.ssh/id_rsa.pub)"
 

	
 
msgid "Repositories You are Watching"
 
msgstr "Αποθετήρια που παρακολουθείτε"
 

	
 
msgid "Default Permissions"
 
msgstr "Προεπιλεγμένα Δικαιώματα"
 

	
 
msgid "Global"
 
msgstr "Γενικά"
 

	
 
msgid "IP Whitelist"
 
msgstr "Λίστα επιτρεπόμενων IP"
 

	
 
msgid "Anonymous access"
 
msgstr "Ανώνυμη πρόσβαση"
 

	
 
msgid "Allow anonymous access"
 
msgstr "Να επιτρέπεται η ανώνυμη πρόσβαση"
 

	
 
msgid ""
 
"Allow access to Kallithea without needing to log in. Anonymous users use "
 
"%s user permissions."
 
msgstr ""
 
"Να επιτρέπεται η πρόσβαση στην Καλλιθέα χωρίς να χρειάζεται να "
 
"συνδεθείτε. Οι ανώνυμοι χρήστες χρησιμοποιούν δικαιώματα χρήστη %s."
 

	
 
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 ""
 
"Όλα τα προεπιλεγμένα δικαιώματα σε κάθε αποθετήριο θα επαναφερθούν στα "
 
"επιλεγμένα δικαιώματα. Σημειώστε ότι όλα τα προσαρμοσμένα προεπιλεγμένα "
 
"δικαιώματα στα αποθετήρια θα χαθούν"
 

	
 
msgid "Apply to all existing repositories"
 
msgstr "Εφαρμογή σε όλα τα υπάρχοντα αποθετήρια"
 

	
 
msgid "Permissions for the Default user on new repositories."
 
msgstr "Δικαιώματα για τον προεπιλεγμένο χρήστη σε νέα αποθετήρια."
 

	
 
msgid "Repository group"
 
msgstr "Ομάδα αποθετηρίου"
 

	
 
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 ""
 
"Όλα τα προεπιλεγμένα δικαιώματα σε κάθε ομάδα αποθετηρίων θα επαναφερθούν "
 
"στα επιλεγμένα δικαιώματα. Σημειώστε ότι όλα τα προσαρμοσμένα "
 
"προεπιλεγμένα δικαιώματα στις ομάδες αποθετηρίων θα χαθούν"
 

	
 
msgid "Apply to all existing repository groups"
 
msgstr "Εφαρμογή σε όλες τις υπάρχουσες ομάδες αποθετηρίων"
 

	
 
msgid "Permissions for the Default user on new repository groups."
 
msgstr "Δικαιώματα για τον προεπιλεγμένο χρήστη σε νέες ομάδες αποθετηρίων."
 

	
 
msgid "User group"
 
msgstr "Ομάδα χρηστών"
 

	
 
msgid ""
 
"All default permissions on each user group will be reset to chosen "
 
"permission, note that all custom default permission on user groups will "
 
"be lost"
 
msgstr ""
 
"Όλα τα προεπιλεγμένα δικαιώματα σε κάθε ομάδα χρηστών θα επαναφερθούν στα "
 
"επιλεγμένα δικαιώματα. Σημειώστε ότι όλα τα προσαρμοσμένα προεπιλεγμένα "
 
"δικαιώματα στις ομάδες χρηστών θα χαθούν"
 

	
 
msgid "Apply to all existing user groups"
 
msgstr "Εφαρμογή σε όλες τις υπάρχουσες ομάδες χρηστών"
 

	
 
msgid "Permissions for the Default user on new user groups."
 
msgstr "Δικαιώματα για τον προεπιλεγμένο χρήστη σε νέες ομάδες χρηστών."
 

	
 
msgid "Top level repository creation"
 
msgstr "Δημιουργία αποθετηρίου ανώτατου επιπέδου"
 

	
 
msgid ""
 
"Enable this to allow non-admins to create repositories at the top level."
 
msgstr ""
 
"Ενεργοποιήστε αυτήν την επιλογή ώστε να επιτρέπεται σε μη διαχειριστές να "
 
"δημιουργούν αποθετήρια στο ανώτερο επίπεδο."
 

	
 
msgid ""
 
"Note: This will also give all users API access to create repositories "
 
"everywhere. That might change in future versions."
 
msgstr ""
 
"Σημείωση: Αυτό θα δώσει επίσης σε όλους τους χρήστες πρόσβαση API για τη "
 
"δημιουργία αποθετηρίων παντού. Αυτό μπορεί να αλλάξει σε μελλοντικές "
 
"εκδόσεις."
 

	
 
msgid "Repository creation with group write access"
 
msgstr "Δημιουργία αποθετηρίου με πρόσβαση εγγραφής ομάδας"
 

	
 
msgid ""
 
"With this, write permission to a repository group allows creating "
 
"repositories inside that group. Without this, group write permissions "
 
"mean nothing."
 
msgstr ""
 
"Με αυτό, η άδεια εγγραφής σε μια ομάδα αποθετηρίων επιτρέπει τη "
 
"δημιουργία αποθετηρίων εντός αυτής της ομάδας. Χωρίς αυτό, τα δικαιώματα "
 
"ομαδικής εγγραφής δεν σημαίνουν τίποτα."
 

	
 
msgid "User group creation"
 
msgstr "Δημιουργία ομάδας χρηστών"
 

	
 
msgid "Enable this to allow non-admins to create user groups."
 
msgstr ""
 
"Ενεργοποιήστε αυτήν την επιλογή για να επιτρέψετε σε μη διαχειριστές να "
 
"δημιουργούν ομάδες χρηστών."
 

	
 
msgid "Registration"
 
msgstr "Εγγραφή"
 

	
 
msgid "External auth account activation"
 
msgstr "Ενεργοποίηση λογαριασμού εξωτερικού ελέγχου"
 

	
 
msgid "Confirm to delete this IP address: %s"
 
msgstr "Επιβεβαίωση για διαγραφή αυτής της διεύθυνσης IP: %s"
 

	
 
msgid "All IP addresses are allowed."
 
msgstr "Επιτρέπονται όλες οι διευθύνσεις IP."
 

	
 
msgid "New IP address"
 
msgstr "Νέα διεύθυνση IP"
 

	
 
msgid "Repository Groups"
 
msgstr "Ομάδες Αποθετηρίου"
 

	
 
msgid "Group name"
 
msgstr "Όνομα ομάδας"
 

	
 
msgid "Group parent"
 
msgstr "Γονική ομάδα"
 

	
 
msgid "Copy parent group permissions"
 
msgstr "Αντιγραφή δικαιωμάτων γονικής ομάδας"
 

	
 
msgid "Copy permission set from parent repository group."
 
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 "Total repositories"
 
msgstr "Σύνολο αποθετηρίων"
 

	
 
msgid "Children groups"
 
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"
 

	
 
msgid "Delete this repository group"
 
msgstr "Διαγραφή αυτής της ομάδας αποθετηρίων"
 

	
 
msgid "Not visible"
 
msgstr "Μη ορατό"
 

	
 
msgid "Visible"
 
msgstr "Ορατό"
 

	
 
msgid "Add repos"
 
msgstr "Προσθήκη αποθετηρίων"
 

	
 
msgid "Add/Edit groups"
 
msgstr "Προσθήκη/Επεξεργασία ομάδων"
 

	
 
msgid "User/User Group"
 
msgstr "Χρήστης / Ομάδα χρηστών"
 

	
 
msgid "Default"
 
msgstr "Προεπιλογή"
 

	
 
msgid "Revoke"
 
msgstr "Ανακάλεσε"
 

	
 
msgid "Add new"
 
msgstr "Προσθήκη νέου"
 

	
 
msgid "Apply to children"
 
msgstr "Εφαρμογή στα θυγατρικά"
 

	
 
msgid "Both"
 
msgstr "Και τα δυο"
 

	
 
msgid ""
 
"Set or revoke permission to all children of that group, including non-"
 
"private repositories and other groups if selected."
 
msgstr ""
 
"Ορίστε ή ανακαλέστε τα θυγατρικά δικαιώματα αυτής της ομάδας, "
 
"συμπεριλαμβανομένων των μη ιδιωτικών αποθετηρίων και άλλων ομάδων, εάν "
 
"επιλεγεί."
 

	
 
msgid "Remove this group"
 
msgstr "Κατάργηση αυτής της ομάδας"
 

	
 
msgid "Confirm to delete this group"
 
msgstr "Επιβεβαιώστε για να διαγράψετε αυτή την ομάδα"
 

	
 
msgid "Repository group %s"
 
msgstr "Ομάδα αποθετηρίων %s"
 

	
 
msgid "Repository Groups Administration"
 
msgstr "Διαχείριση Ομάδων Αποθετηρίου"
 

	
 
msgid "Number of Top-level Repositories"
 
msgstr "Αριθμός αποθετηρίων ανώτατου επιπέδου"
 

	
 
msgid "Clone remote repository"
 
msgstr "Κλωνοποίηση απομακρυσμένου αποθετηρίου"
 

	
 
msgid ""
 
"Optional: URL of a remote repository. If set, the repository will be "
 
"created as a clone from this URL."
 
msgstr ""
 
"Προαιρετικό: Διεύθυνση URL ενός απομακρυσμένου αποθετηρίου. Εάν οριστεί, "
 
"το αποθετήριο θα δημιουργηθεί ως κλώνος από αυτήν τη διεύθυνση URL."
 

	
 
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 ""
 
"Default revision for files page, downloads, full text search index and "
 
"readme generation"
 
msgstr ""
 
"Προεπιλεγμένη αναθεώρηση για τη σελίδα αρχείων, λήψεων, ευρετήριο "
 
"αναζήτησης πλήρους κειμένου και δημιουργία readme"
 

	
 
msgid "%s Creating Repository"
 
msgstr "%s Δημιουργία Αποθετηρίου"
 

	
 
msgid "Creating repository"
 
msgstr "Δημιουργία αποθετηρίου"
 

	
 
msgid ""
 
"Repository \"%(repo_name)s\" is being created, you will be redirected "
 
"when this process is finished.repo_name"
 
msgstr ""
 
"Δημιουργείται το αποθετήριο \"%(repo_name)s\", θα ανακατευθυνθείτε όταν "
 
"ολοκληρωθεί αυτή η διαδικασία."
 

	
 
msgid ""
 
"We're sorry but error occurred during this operation. Please check your "
 
"Kallithea server logs, or contact administrator."
 
msgstr ""
 
"Λυπούμαστε, αλλά παρουσιάστηκε σφάλμα κατά τη διάρκεια αυτής της "
 
"λειτουργίας. Ελέγξτε τα αρχεία καταγραφής του διακομιστή Καλλιθέας ή "
 
"επικοινωνήστε με το διαχειριστή."
 

	
 
msgid "%s Repository Settings"
 
msgstr "Ρυθμίσεις Αποθετηρίου %s"
 

	
 
msgid "Extra Fields"
 
msgstr "Επιπλέον Πεδία"
 

	
 
msgid "Remote"
 
msgstr "Απομακρυσμένο"
 

	
 
msgid "Statistics"
 
msgstr "Στατιστικά"
 

	
 
msgid "Parent"
 
msgstr "Γονικό"
 

	
 
msgid "Set"
 
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 παράγωγα"
 

	
 
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 ""
 
"Το διαγραμμένο αποθετήριο θα απομακρυνθεί και θα κρυφτεί έως ότου το "
 
"λήξει ο διαχειριστής. Ο διαχειριστής μπορεί να το διαγράψει οριστικά ή να "
 
"το επαναφέρει."
 

	
 
msgid "Label"
 
msgstr "Ετικέτα"
 

	
 
msgid "Key"
 
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 "This repository does not have a remote repository URL."
 
msgstr ""
 
"Αυτό το αποθετήριο δεν έχει διεύθυνση URL απομακρυσμένου αποθετηρίου."
 

	
 
msgid "Permanent URL"
 
msgstr "Μόνιμη διεύθυνση URL"
 

	
 
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 ""
 
"Η διεύθυνση URL του αποθετηρίου αλλάζει όταν αυτό μετονομαστεί ή "
 
"μετακινηθεί σε άλλη ομάδα.\n"
 
"                               Η χρήση της παραπάνω μόνιμης διεύθυνσης "
 
"URL εγγυάται ότι αυτό το αποθετήριο θα είναι πάντα προσβάσιμο σε αυτήν τη "
 
"διεύθυνση URL.\n"
 
"                               Αυτό είναι χρήσιμο για συστήματα CI ή για "
 
"άλλες περιπτώσεις που χρειάζεστε να κωδικοποιήσετε τη διεύθυνση URL σε "
 
"κάποια υπηρεσία τρίτου μέρους."
 

	
 
msgid "Remote repository"
 
msgstr "Απομακρυσμένο αποθετήριο"
 

	
 
msgid "Repository URL"
 
msgstr "URL Αποθετηρίου"
 

	
 
msgid ""
 
"Optional: URL of a remote repository. If set, the repository can be "
 
"pulled from this URL."
 
msgstr ""
 
"Προαιρετικό: Διεύθυνση URL ενός απομακρυσμένου αποθετηρίου. Εάν οριστεί, "
 
"το αποθετήριο μπορεί να τραβηχτεί από αυτήν τη διεύθυνση URL."
 

	
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr ""
 
"Προεπιλεγμένη αναθεώρηση για τη σελίδα αρχείων, λήψεων, Whoosh και readme"
 

	
 
msgid "Type name of user"
 
msgstr "Πληκτρολογήστε το όνομα του χρήστη"
 

	
 
msgid "Change owner of this repository."
 
msgstr "Αλλάξτε τον κάτοχο αυτού του αποθετηρίου."
 

	
 
msgid "Processed commits"
 
msgstr "Επεξεργασμένα commits"
 

	
 
msgid "Processed progress"
 
msgstr "Επεξεργασμένη πρόοδος"
 

	
 
msgid "Reset Statistics"
 
msgstr "Επαναφορά Στατιστικών"
 

	
 
msgid "Confirm to remove current statistics."
 
msgstr "Επιβεβαιώστε την κατάργηση των τρεχόντων στατιστικών στοιχείων."
 

	
 
msgid "Repositories Administration"
 
msgstr "Διαχείριση Αποθετηρίων"
 

	
 
msgid "State"
 
msgstr "Κατάσταση"
 

	
 
msgid "Settings Administration"
 
msgstr "Διαχείριση Ρυθμίσεων"
 

	
 
msgid "VCS"
 
msgstr "VCS"
 

	
 
msgid "Remap and Rescan"
 
msgstr "Επανάληψη αντιστοίχισης και επανασάρωση"
 

	
 
msgid "Visual"
 
msgstr "Εμφάνιση"
 

	
 
msgid "Full Text Search"
 
msgstr "Αναζήτηση Πλήρους Κειμένου"
 

	
 
msgid "System Info"
 
msgstr "Πληροφορίες Συστήματος"
 

	
 
msgid "Send test email to"
 
msgstr "Αποστολή δοκιμαστικού μηνύματος ηλεκτρονικού ταχυδρομείου σε"
 

	
 
msgid "Send"
 
msgstr "Αποστολή"
 

	
 
msgid "Site branding"
 
msgstr "Επωνυμία ιστότοπου"
 

	
 
msgid "Set a custom title for your Kallithea Service."
 
msgstr "Ορίστε έναν προσαρμοσμένο τίτλο για την υπηρεσία της Καλλιθέα σας."
 

	
 
msgid "HTML/JavaScript/CSS customization block"
 
msgstr "Μπλοκ προσαρμογής HTML / JavaScript / CSS"
 

	
 
msgid ""
 
"HTML (possibly with                         JavaScript and/or CSS) that "
 
"will be added to the bottom                         of every page. This "
 
"can be used for web analytics                         systems, but also "
 
"to                         perform instance-specific customizations like "
 
"adding a                         project banner at the top of every page."
 
msgstr ""
 
"HTML (ενδεχομένως με JavaScript ή / και CSS) που θα προστεθούν στο κάτω "
 
"μέρος της κάθε σελίδας. Αυτό μπορεί να χρησιμοποιηθεί για web analytics, "
 
"αλλά και για την προσαρμογή της εμφάνισης, όπως η προσθήκη ενός banner "
 
"στο επάνω μέρος κάθε σελίδας."
 

	
 
msgid "ReCaptcha public key"
 
msgstr "Δημόσιο κλειδί ReCaptcha"
 

	
 
msgid "Public key for reCaptcha system."
 
msgstr "Δημόσιο κλειδί για το σύστημα reCaptcha."
 

	
 
msgid "ReCaptcha private key"
 
msgstr "Ιδιωτικό κλειδί ReCaptcha"
 

	
 
msgid ""
 
"Private key for reCaptcha system. Setting this value will enable captcha "
 
"on registration."
 
msgstr ""
 
"Ιδιωτικό κλειδί για το σύστημα reCaptcha. Ο καθορισμός αυτής της τιμής θα "
 
"ενεργοποιήσει το captcha κατά την εγγραφή."
 

	
 
msgid "Save Settings"
 
msgstr "Αποθήκευση Ρυθμίσεων"
 

	
 
msgid "Built-in Mercurial Hooks (Read-Only)"
 
msgstr "Ενσωματωμένοι Mercurial Hooks (μόνο για ανάγνωση)"
 

	
 
msgid "Rescan options"
 
msgstr "Επιλογές Επανασάρωσης"
 

	
 
msgid "Delete records of missing repositories"
 
msgstr "Διαγραφή εγγραφών αποθετηρίων που λείπουν"
 

	
 
msgid ""
 
"Check this option to remove all comments, pull requests and other records "
 
"related to repositories that no longer exist in the filesystem."
 
msgstr ""
 
"Επιλέξτε αυτήν την επιλογή για να καταργήσετε όλα τα σχόλια, να αιτήματα "
 
"έλξης και άλλες εγγραφές που σχετίζονται με αποθετήρια που δεν υπάρχουν "
 
"πλέον στο σύστημα αρχείων."
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Ακυρώνει την προσωρινή αποθήκευση για όλα τα αποθετήρια"
 

	
 
msgid "Check this to reload data and clear cache keys for all repositories."
 
msgstr ""
 
"Επιλέξτε αυτό για να φορτώσετε ξανά τα δεδομένα και να καταργήστε την "
 
"cache για όλα τα αποθετήρια."
 

	
 
msgid "Install Git hooks"
 
msgstr "Εγκατάσταση Git hooks"
 

	
 
msgid ""
 
"Verify if Kallithea's Git hooks are installed for each repository. "
 
"Current hooks will be updated to the latest version."
 
msgstr ""
 
"Επαληθεύστε εάν τα Git hooks της Καλλιθέας είναι εγκατεστημένα για κάθε "
 
"αποθετήριο. Τα τρέχοντα hooks θα ενημερωθούν στην τελευταία έκδοση."
 

	
 
msgid "Overwrite existing Git hooks"
 
msgstr "Αντικατάσταση υπαρχόντων Git hooks"
 

	
 
msgid ""
 
"If installing Git hooks, overwrite any existing hooks, even if they do "
 
"not seem to come from Kallithea. WARNING: This operation will destroy any "
 
"custom git hooks you may have deployed by hand!"
 
msgstr ""
 
"Εάν εγκαθιστάτε Git hooks, αντικαταστήστε τυχόν υπάρχοντα hooks, ακόμα κι "
 
"αν δεν φαίνεται να προέρχονται από την Καλλιθέα. ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Αυτή η "
 
"λειτουργία θα καταστρέψει τυχόν προσαρμοσμένα git hooks που μπορεί να "
 
"έχετε αναπτύξει με το χέρι!"
 

	
 
msgid "Rescan Repositories"
 
msgstr "Επανασάρωση αποθετηρίων"
 

	
 
msgid "Index build option"
 
msgstr "Επιλογή δημιουργίας ευρετηρίου"
 

	
 
msgid "Build from scratch"
 
msgstr "Κατασκευή από το μηδέν"
 

	
 
msgid ""
 
"This option completely reindexeses all of the repositories for proper "
 
"fulltext search capabilities."
 
msgstr ""
 
"Αυτή η επιλογή ξαναδημιουργεί πλήρως τα ευρετήρια σε όλα τα αποθετήρια "
 
"για δυνατότητα αναζήτησης πλήρους κειμένου."
 

	
 
msgid "Reindex"
 
msgstr "Αναδημιουργία ευρετηρίου"
 

	
 
msgid "Checking for updates..."
 
msgstr "Έλεγχος για ενημερώσεις..."
 

	
 
msgid "Kallithea version"
 
msgstr "Έκδοση Καλλιθέας"
 

	
 
msgid "Kallithea configuration file"
 
msgstr "Αρχείο διαμόρφωσης Καλλιθέας"
 

	
 
msgid "Python version"
 
msgstr "Έκδοση Python"
 

	
 
msgid "Platform"
 
msgstr "Πλατφόρμα"
 

	
 
msgid "Git version"
 
msgstr "Έκδοση Git"
 

	
 
msgid "Git path"
 
msgstr "Διαδρομή Git"
 

	
 
msgid "Python Packages"
 
msgstr "Πακέτα Python"
 

	
 
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 ""
 
"Requires hgsubversion library to be installed. Enables cloning of remote "
 
"Subversion repositories while converting them to Mercurial."
 
msgstr ""
 
"Απαιτεί την εγκατάσταση της βιβλιοθήκης hgsubversion. Ενεργοποιεί την "
 
"κλωνοποίηση απομακρυσμένων Subversion αποθετηρίων και τη μετατροπή τους "
 
"σε Mercurial."
 

	
 
msgid "Location of repositories"
 
msgstr "Τοποθεσία αποθετηρίων"
 

	
 
msgid ""
 
"Click to unlock. You must restart Kallithea in order to make this setting "
 
"take effect."
 
msgstr ""
 
"Κάντε κλικ για να ξεκλειδώσετε. Πρέπει να επανεκκινήσετε την Καλλιθέα για "
 
"να εφαρμοστεί αυτή η ρύθμιση."
 

	
 
msgid ""
 
"Filesystem location where repositories are stored. After changing this "
 
"value, a restart and rescan of the repository folder are both required."
 
msgstr ""
 
"Θέση συστήματος αρχείων όπου αποθηκεύονται τα αποθετήρια. Μετά την αλλαγή "
 
"αυτής της τιμής, απαιτείται επανεκκίνηση και σάρωση του φακέλου "
 
"αποθετηρίου."
 

	
 
msgid "General"
 
msgstr "Γενικά"
 

	
 
msgid "Use repository extra fields"
 
msgstr "Χρήση πρόσθετων πεδίων αποθετηρίου"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr ""
 
"Επιτρέπει την αποθήκευση πρόσθετων προσαρμοσμένων πεδίων ανά αποθετήριο."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Εμφάνιση της έκδοσης Καλλιθέας"
 

	
 
msgid ""
 
"Shows or hides a version number of Kallithea displayed in the footer."
 
msgstr ""
 
"Εμφανίζει ή αποκρύπτει τον αριθμό έκδοσης της Καλλιθέας που εμφανίζεται "
 
"στο υποσέλιδο."
 

	
 
msgid "Show user Gravatars"
 
msgstr "Εμφάνιση Gravatars του χρήστη"
 

	
 
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 σας επιτρέπει να χρησιμοποιήσετε avatar από έναν άλλο "
 
"διακομιστή.\n"
 
"                                                        Οι ακόλουθες "
 
"μεταβλητές της διεύθυνσης URL θα αντικατασταθούν ανάλογα.\n"
 
"                                                        {scheme} 'http' ή "
 
"'https' που αποστέλλεται από την εκτέλεση του διακομιστή της Καλλιθέας,\n"
 
"                                                        {email} "
 
"ηλεκτρονικό ταχυδρομείο,\n"
 
"                                                        {md5email} md5 "
 
"hash του email χρήστη (όπως στο gravatar.com),\n"
 
"                                                        {size} μέγεθος "
 
"της εικόνας που αναμένεται από το διακομιστή,\n"
 
"                                                        {netloc} θέση "
 
"δικτύου/διακομιστή που τρέχει την Καλλιθέα"
 

	
 
msgid "HTTP Clone URL"
 
msgstr "HTTP Clone URL"
 

	
 
msgid ""
 
"Schema of clone URL construction eg. '{scheme}://{user}@{netloc}/"
 
"{repo}'.\n"
 
"                                                    The following "
 
"variables are available:\n"
 
"                                                    {scheme} 'http' or "
 
"'https' sent from running Kallithea server,\n"
 
"                                                    {user}   current user "
 
"username,\n"
 
"                                                    {netloc} network "
 
"location/server host of running Kallithea server,\n"
 
"                                                    {repo}   full "
 
"repository name,\n"
 
"                                                    {repoid} ID of "
 
"repository, can be used to construct clone-by-id,\n"
 
"                                                    {system_user}  name "
 
"of the Kallithea system user,\n"
 
"                                                    {hostname}  server "
 
"hostname\n"
 
"                                                    "
 
msgstr ""
 
"Κατασκευή σχήματος του URL clone π.χ. '{scheme}}}{user}@{netloc}/"
 
"{repo}'.\n"
 
"                                                    Οι ακόλουθες "
 
"μεταβλητές είναι διαθέσιμες:\n"
 
"                                                    {scheme} 'http' ή "
 
"'https' αποστέλλεται από την εκτέλεση του διακομιστή της Καλλιθέας,\n"
 
"                                                    {user} τρέχον όνομα "
 
"χρήστη,\n"
 
"                                                    {netloc} θέση δικτύου/"
 
"κεντρικός υπολογιστής διακομιστή που τρέχει το διακομιστή της Καλλιθέας,\n"
 
"                                                    {repo} πλήρες όνομα "
 
"αποθετηρίου,\n"
 
"                                                    {repoid} ID του "
 
"αποθετηρίου, μπορεί να χρησιμοποιηθεί για την κατασκευή clone-by-id,\n"
 
"                                                    {system_user} όνομα "
 
"του χρήστη του συστήματος Καλλιθέας,\n"
 
"                                                    {hostname} όνομα του "
 
"διακομιστή\n"
 
"                                                    "
 

	
 
msgid "SSH Clone URL"
 
msgstr "SSH Clone URL"
 

	
 
msgid ""
 
"Schema for constructing SSH clone URL, eg. 'ssh://{system_user}"
 
"@{hostname}/{repo}'."
 
msgstr ""
 
"Κατασκευή σχήματος SSH clone URL, πχ. 'ssh://{system_user}@{hostname}/"
 
"{repo}'."
 

	
 
msgid "Repository page size"
 
msgstr "Μέγεθος σελίδας αποθετηρίου"
 

	
 
msgid ""
 
"Number of items displayed in the repository pages before pagination is "
 
"shown."
 
msgstr ""
 
"Ο αριθμός των αντικειμένων που εμφανίζονται στις σελίδες αποθετηρίου πριν "
 
"εφαρμοστεί η σελιδοποίηση."
 

	
 
msgid "Admin page size"
 
msgstr "Μέγεθος σελίδας διαχειριστή"
 

	
 
msgid ""
 
"Number of items displayed in the admin pages grids before pagination is "
 
"shown."
 
msgstr ""
 
"Ο αριθμός των στοιχείων που εμφανίζονται στα πλέγματα των σελίδων "
 
"διαχειριστή πριν εφαρμοστεί η σελιδοποίηση."
 

	
 
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 ""
 
"Parses meta tags from the repository description field and turns them "
 
"into colored tags."
 
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 "%s user group settings"
 
msgstr "Ρυθμίσεις ομάδας χρηστών %s"
 

	
 
msgid "Show Members"
 
msgstr "Εμφάνιση Μελών"
 

	
 
msgid "User Group: %s"
 
msgstr "Ομάδα Χρηστών: %s"
 

	
 
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 "%s user settings"
 
msgstr "Ρυθμίσεις χρήστη %s"
 

	
 
msgid "Emails"
 
msgstr "Μηνύματα ηλεκτρονικού ταχυδρομείου"
 

	
 
msgid "User: %s"
 
msgstr "Χρήστης: %s"
 

	
 
msgid "Source of Record"
 
msgstr "Προέλευση εγγραφής"
 

	
 
msgid "Last Login"
 
msgstr "Τελευταία Σύνδεση"
 

	
 
msgid "Member of User Groups"
 
msgstr "Μέλος των Ομάδων Χρηστών"
 

	
 
msgid "Confirm to delete this user: %s"
 
msgstr "Επιβεβαίωση διαγραφής αυτού του χρήστη: %s"
 

	
 
msgid "Delete this user"
 
msgstr "Διαγραφή αυτού του χρήστη"
 

	
 
msgid "Inherited from %s"
 
msgstr "Κληρονομήθηκε από %s"
 

	
 
msgid "New password confirmation"
 
msgstr "Επιβεβαίωση νέου κωδικού πρόσβασης"
 

	
 
msgid "Users Administration"
 
msgstr "Διαχείριση Χρηστών"
 

	
 
msgid "Auth Type"
 
msgstr "Τύπος Πιστοποίησης"
 

	
 
msgid "Server instance: %s"
 
msgstr "Παρουσία διακομιστή: %s"
 

	
 
msgid "Support"
 
msgstr "Υποστήριξη"
 

	
 
msgid "Mercurial repository"
 
msgstr "Αποθετήριο Mercurial"
 

	
 
msgid "Git repository"
 
msgstr "Αποθετήριο Git"
 

	
 
msgid "Summary"
 
msgstr "Περίληψη"
 

	
 
msgid "Changelog"
 
msgstr "Ιστορικό αλλαγών"
 

	
 
msgid "Files"
 
msgstr "Αρχεία"
 

	
 
msgid "Show Pull Requests for %s"
 
msgstr "Εμφάνιση Αιτήσεων Έλξης για %s"
 

	
 
msgid "Pull Requests"
 
msgstr "Αιτήματα Έλξης"
 

	
 
msgid "Options"
 
msgstr "Επιλογές"
 

	
 
msgid "Compare"
 
msgstr "Σύγκριση"
 

	
 
msgid "Search"
 
msgstr "Αναζήτηση"
 

	
 
msgid "Follow"
 
msgstr "Παρακολούθηση"
 

	
 
msgid "Unfollow"
 
msgstr "Κατάργηση παρακολούθησης"
 

	
 
msgid "Create Pull Request"
 
msgstr "Δημιουργία Αιτήματος Έλξης"
 

	
 
msgid "Switch To"
 
msgstr "Αλλαγή Σε"
 

	
 
msgid "No matches found"
 
msgstr "Δεν βρέθηκαν αντιστοιχίσεις"
 

	
 
msgid "Show recent activity"
 
msgstr "Εμφάνιση πρόσφατης δραστηριότητας"
 

	
 
msgid "Public journal"
 
msgstr "Δημόσιο Ημερολόγιο"
 

	
 
msgid "Show public gists"
 
msgstr "Εμφάνιση δημόσιων gists"
 

	
 
msgid "Gists"
 
msgstr "Gists"
 

	
 
msgid "All Public Gists"
 
msgstr "Όλα τα Δημόσια Gists"
 

	
 
msgid "My Public Gists"
 
msgstr "Τα Δημόσιά μου Gists"
 

	
 
msgid "My Private Gists"
 
msgstr "Τα Ιδιωτικά μου Gists"
 

	
 
msgid "Search in repositories"
 
msgstr "Αναζήτηση σε αποθετήρια"
 

	
 
msgid "My Pull Requests"
 
msgstr "Τα αιτήματά μου για έλξη"
 

	
 
msgid "Not Logged In"
 
msgstr "Δεν έχετε συνδεθεί"
 

	
 
msgid "Login to Your Account"
 
msgstr "Συνδεθείτε στο λογαριασμό σας"
 

	
 
msgid "Forgot password?"
 
msgstr "Ξεχάσατε τον κωδικό πρόσβασης;"
 

	
 
msgid "Don't have an account?"
 
msgstr "Δεν έχετε λογαριασμό;"
 

	
 
msgid "Log Out"
 
msgstr "Αποσύνδεση"
 

	
 
msgid "Parent rev."
 
msgstr "Γονική αναθ."
 

	
 
msgid "Child rev."
 
msgstr "Θυγατρική αναθ."
 

	
 
msgid "Create repositories"
 
msgstr "Δημιουργία αποθετηρίων"
 

	
 
msgid "Select this option to allow repository creation for this user"
 
msgstr ""
 
"Ενεργοποιήστε αυτήν την επιλογή για να επιτρέψετε τη δημιουργία "
 
"αποθετηρίου για αυτόν το χρήστη"
 

	
 
msgid "Create user groups"
 
msgstr "Δημιουργία ομάδων χρηστών"
 

	
 
msgid "Select this option to allow user group creation for this user"
 
msgstr ""
 
"Ενεργοποιήστε αυτήν την επιλογή για να επιτρέψετε τη δημιουργία ομάδας "
 
"χρηστών για αυτόν το χρήστη"
 

	
 
msgid "Show"
 
msgstr "Εμφάνιση"
 

	
 
msgid "No permissions defined yet"
 
msgstr "Δεν έχουν οριστεί ακόμα δικαιώματα"
 

	
 
msgid "Permission"
 
msgstr "Δικαίωμα"
 

	
 
msgid "Edit Permission"
 
msgstr "Επεξεργασία Δικαιώματος"
 

	
 
msgid "No permission defined"
 
msgstr "Δεν έχει οριστεί κανένα δικαίωμα"
 

	
 
msgid "Retry"
 
msgstr "Επανάληψη"
 

	
 
msgid "Submitting ..."
 
msgstr "Υποβολή..."
 

	
 
msgid "Unable to post"
 
msgstr "Δεν είναι δυνατή η δημοσίευση"
 

	
 
msgid "Add Another Comment"
 
msgstr "Προσθήκη και άλλου Σχολίου"
 

	
 
msgid "Stop following this repository"
 
msgstr "Διακοπή παρακολούθησης αυτού του αποθετηρίου"
 

	
 
msgid "Start following this repository"
 
msgstr "Έναρξη παρακολούθησης αυτού του αποθετηρίου"
 

	
 
msgid "Group"
 
msgstr "Ομάδα"
 

	
 
msgid "Loading ..."
 
msgstr "Φόρτωση..."
 

	
 
msgid "loading ..."
 
msgstr "φόρτωση ..."
 

	
 
msgid "Search truncated"
 
msgstr "Περικομμένη αναζήτηση"
 

	
 
msgid "No matching files"
 
msgstr "Δεν υπάρχουν αρχεία που να ταιριάζουν"
 

	
 
msgid "Open New Pull Request from {0}"
 
msgstr "Άνοιγμα νέας αίτησης έλξης από {0}"
 

	
 
msgid "Open New Pull Request for {0} &rarr; {1}"
 
msgstr "Άνοιγμα νέου αιτήματος έλξης για {0} &rarr; {1}"
 

	
 
msgid "Show Selected Changesets {0} &rarr; {1}"
 
msgstr "Εμφάνιση Επιλεγμένων Σετ Αλλαγών {0} &rarr; {1}"
 

	
 
msgid "Selection Link"
 
msgstr "Σύνδεσμος Επιλογής"
 

	
 
msgid "Collapse Diff"
 
msgstr "Σύμπτυξη Διαφοράς"
 

	
 
msgid "Expand Diff"
 
msgstr "Ανάπτυξη Διαφοράς"
 

	
 
msgid "No revisions"
 
msgstr "Χωρίς αναθεωρήσεις"
 

	
 
msgid "Type name of user or member to grant permission"
 
msgstr ""
 
"Πληκτρολογήστε το όνομα του χρήστη ή του μέλους για την εκχώρηση "
 
"δικαιωμάτων"
 

	
 
msgid "Failed to revoke permission"
 
msgstr "Απέτυχε η ανάκληση του δικαιωμάτος"
 

	
 
msgid "Confirm to revoke permission for {0}: {1} ?"
 
msgstr "Επιβεβαιώστε την ανάκληση του δικαιώματος για {0}: {1};"
 

	
 
msgid "Select changeset"
 
msgstr "Επιλογή σετ αλλαγών"
 

	
 
msgid "Specify changeset"
 
msgstr "Καθορισμός σετ αλλαγών"
 

	
 
msgid "Click to sort ascending"
 
msgstr "Κάντε κλικ για αύξουσα ταξινόμηση"
 

	
 
msgid "Click to sort descending"
 
msgstr "Κάντε κλικ για φθίνουσα ταξινόμηση"
 

	
 
msgid "No records found."
 
msgstr "Δεν βρέθηκαν εγγραφές."
 

	
 
msgid "Data error."
 
msgstr "Σφάλμα δεδομένων."
 

	
 
msgid "Loading..."
 
msgstr "Φόρτωση..."
 

	
 
msgid "%s Changelog"
 
msgstr "%s Αρχείο καταγραφής αλλαγών"
 

	
 
msgid "showing %d out of %d revision"
 
msgid_plural "showing %d out of %d revisions"
 
msgstr[0] "εμφάνιση %d από %d αναθεώρηση"
 
msgstr[1] "εμφάνιση %d από %d αναθεώρησεις"
 

	
 
msgid "Clear selection"
 
msgstr "Καθαρισμός επιλογής"
 

	
 
msgid "Go to tip of repository"
 
msgstr "Μετάβαση στην κεφαλή του αποθετηρίου"
 

	
 
msgid "Branch filter:"
 
msgstr "Φίλτρο κλάδου:"
 

	
 
msgid "There are no changes yet"
 
msgstr "Δεν υπάρχουν αλλαγές ακόμα"
 

	
 
msgid "Removed"
 
msgstr "Αφαιρέθηκε"
 

	
 
msgid "Changed"
 
msgstr "Αλλάχτηκε"
 

	
 
msgid "Added"
 
msgstr "Προστέθηκε"
 

	
 
msgid "Affected %s files"
 
msgstr "Επηρεάστηκαν %s αρχεία"
 

	
 
msgid "First (oldest) changeset in this list"
 
msgstr "Πρώτο (παλαιότερο) σετ αλλαγών σε αυτήν τη λίστα"
 

	
 
msgid "Last (most recent) changeset in this list"
 
msgstr "Τελευταίο (πιο πρόσφατο) σετ αλλαγών σε αυτήν τη λίστα"
 

	
 
msgid "Position in this list of changesets"
 
msgstr "Θέση σε αυτήν τη λίστα των αλλαγών"
 

	
 
msgid ""
 
"Changeset status: %s by %s\n"
 
"Click to open associated pull request %s"
 
msgstr ""
 
"Κατάσταση συνόλου αλλαγών: %s από %s\n"
 
"Κάντε κλικ για να ανοίξετε το συσχετισμένο αίτημα έλξης %s"
 

	
 
msgid "Changeset status: %s by %s"
 
msgstr "Κατάσταση σετ αλλαγών: %s από %s"
 

	
 
msgid "Expand commit message"
 
msgstr "Ανάπτυξη μηνύματος commit"
 

	
 
msgid "%s comments"
 
msgstr "%s σχόλια"
 

	
 
msgid "Bookmark %s"
 
msgstr "Σελιδοδείκτης %s"
 

	
 
msgid "Tag %s"
 
msgstr "Ετικέτα %s"
 

	
 
msgid "Branch %s"
 
msgstr "Κλάδος %s"
 

	
 
msgid "%s Changeset"
 
msgstr "Σετ αλλαγών %s"
 

	
 
msgid "Changeset status"
 
msgstr "Κατάσταση σετ αλλαγών"
 

	
 
msgid "Raw diff"
 
msgstr "Ακατέργαστη διαφορά"
 

	
 
msgid "Patch diff"
 
msgstr "Διαφορά κώδικα"
 

	
 
msgid "Download diff"
 
msgstr "Λήψη διαφοράς"
 

	
 
msgid "Merge"
 
msgstr "Συγχώνευση"
 

	
 
msgid "Replaced by:"
 
msgstr "Αντικαταστάθηκε από:"
 

	
 
msgid "Preceded by:"
 
msgstr "Προηγείται από:"
 

	
 
msgid "%s file changed"
 
msgid_plural "%s files changed"
 
msgstr[0] "Άλλαξε %s αρχείο"
 
msgstr[1] "Άλλαξαν %s αρχεία"
 

	
 
msgid "%s file changed with %s insertions and %s deletions"
 
msgid_plural "%s files changed with %s insertions and %s deletions"
 
msgstr[0] "Άλλαξε %s αρχείο με %s εισαγωγές και %s διαγραφές"
 
msgstr[1] "Άλλαξαν %s αρχεία με %s εισαγωγές και %s διαγραφές"
 

	
 
msgid "Show full diff anyway"
 
msgstr "Εμφάνιση πλήρους διαφοράς ούτως ή άλλως"
 

	
 
msgid "comment"
 
msgstr "σχόλιο"
 

	
 
msgid "on pull request"
 
msgstr "κατόπιν αιτήματος έλξης"
 

	
 
msgid "No title"
 
msgstr "Χωρίς τίτλο"
 

	
 
msgid "on this changeset"
 
msgstr "σε αυτό το σετ αλλαγών"
 

	
 
msgid "Delete comment?"
 
msgstr "Διαγραφή σχολίου;"
 

	
 
msgid "Status change"
 
msgstr "Αλλαγή κατάστασης"
 

	
 
msgid "Comments are in plain text. Use @username to notify another user."
 
msgstr ""
 
"Τα σχόλια είναι σε απλό κείμενο. Χρησιμοποιήστε @username για να "
 
"ειδοποιήσετε έναν άλλο χρήστη."
 

	
 
msgid "Set changeset status"
 
msgstr "Ορισμός κατάστασης σετ αλλαγών"
 

	
 
msgid "Vote for pull request status"
 
msgstr "Ψηφοφορία για την κατάσταση του αιτήματος έλξης"
 

	
 
msgid "No change"
 
msgstr "Καμία αλλαγή"
 

	
 
msgid "Finish pull request"
 
msgstr "Τερματισμός αιτήματος έλξης"
 

	
 
msgid "Close"
 
msgstr "Κλείσιμο"
 

	
 
msgid "Comment"
 
msgstr "Σχολιασμός"
 

	
 
msgid "You need to be logged in to comment."
 
msgstr "Πρέπει να είστε συνδεδεμένος για να σχολιάσετε."
 

	
 
msgid "Login now"
 
msgstr "Συνδεθείτε τώρα"
 

	
 
msgid "Hide"
 
msgstr "Απόκρυψη"
 

	
 
msgid "%d comment"
 
msgid_plural "%d comments"
 
msgstr[0] "%d σχόλιο"
 
msgstr[1] "%d σχόλια"
 

	
 
msgid "%d inline"
 
msgid_plural "%d inline"
 
msgstr[0] "%d ενσωματωμένο"
 
msgstr[1] "%d ενσωματωμένα"
 

	
 
msgid "%d general"
 
msgid_plural "%d general"
 
msgstr[0] "%d γενικά"
 
msgstr[1] "%d γενικά"
 

	
 
msgid "%s Changesets"
 
msgstr "Σετ αλλαγών του %s"
 

	
 
msgid "Changeset status: %s"
 
msgstr "Κατάσταση σετ αλλαγών: %s"
 

	
 
msgid "Files affected"
 
msgstr "Αρχεία που επηρεάστηκαν"
 

	
 
msgid "No file before"
 
msgstr "Δεν υπάρχει αρχείο πριν"
 

	
 
msgid "File before"
 
msgstr "Αρχείο πριν"
 

	
 
msgid "Modified"
 
msgstr "Τροποποιημένο"
 

	
 
msgid "Deleted"
 
msgstr "Διαγράφηκε"
 

	
 
msgid "Renamed"
 
msgstr "Μετονομάστηκε"
 

	
 
msgid "Unknown operation: %r"
 
msgstr "Άγνωστη λειτουργία: %r"
 

	
 
msgid "No file after"
 
msgstr "Δεν υπάρχει αρχείο μετά"
 

	
 
msgid "File after"
 
msgstr "Αρχείο μετά"
 

	
 
msgid "Show full diff for this file"
 
msgstr "Εμφάνιση πλήρους διαφοράς για αυτό το αρχείο"
 

	
 
msgid "Show full side-by-side diff for this file"
 
msgstr "Εμφάνιση πλήρους διαφοράς δίπλα-δίπλα για αυτό το αρχείο"
 

	
 
msgid "Show inline comments"
 
msgstr "Εμφάνιση ενσωματωμένων σχολίων"
 

	
 
msgid "No changesets"
 
msgstr "Χωρίς σετ αλλαγών"
 

	
 
msgid "Criss cross merge situation with multiple merge ancestors detected!"
 
msgstr ""
 
"Εντοπίστηκε κατάσταση διασταυρούμενης συγχώνευσης με πολλούς προγόνους "
 
"συγχώνευσης!"
 

	
 
msgid ""
 
"Please merge the target branch to your branch before creating a pull "
 
"request."
 
msgstr ""
 
"Παρακαλώ συγχωνεύστε τον κλάδο-στόχο στον κλάδο σας πριν δημιουργήσετε "
 
"ένα αίτημα έλξης."
 

	
 
msgid "Merge Ancestor"
 
msgstr "Πρόγονος Συγχώνευσης"
 

	
 
msgid "Show merge diff"
 
msgstr "Εμφάνιση διαφοράς συγχώνευσης"
 

	
 
msgid "is"
 
msgstr "είναι"
 

	
 
msgid "%s changesets"
 
msgstr "%s σετ αλλαγών"
 

	
 
msgid "behind"
 
msgstr "πίσω"
 

	
 
msgid "%s Compare"
 
msgstr "Σύγκριση %s"
 

	
 
msgid "Compare Revisions"
 
msgstr "Σύγκριση Αναθεωρήσεων"
 

	
 
msgid "Swap"
 
msgstr "Ανταλαγή"
 

	
 
msgid "Compare revisions, branches, bookmarks, or tags."
 
msgstr "Συγκρίνετε αναθεωρήσεις, κλάδους, σελιδοδείκτες ή ετικέτες."
 

	
 
msgid "Showing %s commit"
 
msgid_plural "Showing %s commits"
 
msgstr[0] "Εμφάνιση %s commit"
 
msgstr[1] "Εμφάνιση %s commits"
 

	
 
msgid "Show full diff"
 
msgstr "Εμφάνιση πλήρους διαφοράς"
 

	
 
msgid "Public repository"
 
msgstr "Δημόσιο αποθετήριο"
 

	
 
msgid "Repository creation in progress..."
 
msgstr "Η δημιουργία αποθετηρίου βρίσκεται σε εξέλιξη..."
 

	
 
msgid "No changesets yet"
 
msgstr "Δεν υπάρχουν ακόμα σετ αλλαγών"
 

	
 
msgid "Subscribe to %s rss feed"
 
msgstr "Εγγραφή στην τροφοδοσία rss του %s"
 

	
 
msgid "Subscribe to %s atom feed"
 
msgstr "Εγγραφή στην τροφοδοσία του %s atom"
 

	
 
msgid "Creating"
 
msgstr "Δημιουργία σε εξέλιξη"
 

	
 
msgid "Mention in Comment on Changeset \"%s\""
 
msgstr "Αναφορά στο Σχόλιο για το σετ αλλαγών \"%s\""
 

	
 
msgid "Comment on Changeset \"%s\""
 
msgstr "Σχόλιο για το σετ αλλαγών \"%s\""
 

	
 
msgid "Changeset on"
 
msgstr "Σετ αλλαγών σε"
 

	
 
msgid "branch"
 
msgstr "κλάδος"
 

	
 
msgid "by"
 
msgstr "από"
 

	
 
msgid "Status change:"
 
msgstr "Αλλαγή κατάστασης:"
 

	
 
msgid "The pull request has been closed."
 
msgstr "Το αίτημα έλξης έχει κλείσει."
 

	
 
msgid "Hello %s"
 
msgstr "Γεια σας %s"
 

	
 
msgid "We have received a request to reset the password for your account."
 
msgstr ""
 
"Λάβαμε ένα αίτημα για επαναφορά του κωδικού πρόσβασης για το λογαριασμό "
 
"σας."
 

	
 
msgid ""
 
"This account is however managed outside this system and the password "
 
"cannot be changed here."
 
msgstr ""
 
"Ωστόσο, η διαχείριση αυτού του λογαριασμού γίνεται εκτός αυτού του "
 
"συστήματος και ο κωδικός πρόσβασης δεν μπορεί να αλλάξει εδώ."
 

	
 
msgid "To set a new password, click the following link"
 
msgstr ""
 
"Για να ορίσετε έναν νέο κωδικό πρόσβασης, κάντε κλικ στον ακόλουθο "
 
"σύνδεσμο"
 

	
 
msgid ""
 
"Should you not be able to use the link above, please type the following "
 
"code into the password reset form"
 
msgstr ""
 
"Εάν δεν μπορείτε να χρησιμοποιήσετε τον παραπάνω σύνδεσμο, πληκτρολογήστε "
 
"τον ακόλουθο κώδικα στη φόρμα επαναφοράς κωδικού πρόσβασης"
 

	
 
msgid ""
 
"If it weren't you who requested the password reset, just disregard this "
 
"message."
 
msgstr ""
 
"Αν δεν ήσασταν εσείς που ζητήσατε την επαναφορά κωδικού πρόσβασης, απλώς "
 
"αγνοήστε αυτό το μήνυμα."
 

	
 
msgid "Mention on Pull Request %s \"%s\" by %s"
 
msgstr "Αναφορά στην αίτημα έλξης %s \"%s\" από %s"
 

	
 
msgid "Added as Reviewer of Pull Request %s \"%s\" by %s"
 
msgstr "Προστεθήκατε ως αναθεωρητής του αιτήματος έλξης %s \"%s\" από %s"
 

	
 
msgid "Pull request"
 
msgstr "Αίτημα έλξης"
 

	
 
msgid "from"
 
msgstr "από"
 

	
 
msgid "to"
 
msgstr "προς"
 

	
 
msgid "Mention in Comment on Pull Request %s \"%s\""
 
msgstr "Αναφορά στο σχόλιο για το αίτημα έλξης %s \"%s\""
 

	
 
msgid "Pull Request %s \"%s\" Closed"
 
msgstr "Το αίτημα έλξης %s \"%s\" είναι Κλειστό"
 

	
 
msgid "Comment on Pull Request %s \"%s\""
 
msgstr "Σχόλιο στην αίτηση έλξης %s \"%s\""
 

	
 
msgid "Full Name"
 
msgstr "Ονοματεπώνυμο"
 

	
 
msgid "%s File side-by-side diff"
 
msgstr "%s Αρχείο διαφοράς δίπλα-δίπλα"
 

	
 
msgid "File diff"
 
msgstr "Αρχείο διαφοράς"
 

	
 
msgid "%s File Diff"
 
msgstr "%s Αρχείο διαφοράς"
 

	
 
msgid "%s Files"
 
msgstr "%s Αρχεία"
 

	
 
msgid "%s Files Add"
 
msgstr "%s Προσθήκη Αρχείων"
 

	
 
msgid "Add New File"
 
msgstr "Προσθήκη Νέου Αρχείου"
 

	
 
msgid "Location"
 
msgstr "Τοποθεσία"
 

	
 
msgid "Enter filename..."
 
msgstr "Εισαγωγή ονόματος αρχείου..."
 

	
 
msgid "or"
 
msgstr "ή"
 

	
 
msgid "Upload File"
 
msgstr "Ανέβασμα Αρχείου"
 

	
 
msgid "Create New File"
 
msgstr "Δημιουργία Νέου Αρχείου"
 

	
 
msgid "New file type"
 
msgstr "Νέος τύπος αρχείου"
 

	
 
msgid "Commit Message"
 
msgstr "Μήνυμα Υποβολής"
 

	
 
msgid "Commit Changes"
 
msgstr "Υποβολή Των Αλλαγών"
 

	
 
msgid "Search File List"
 
msgstr "Αναζήτηση στη Λίστα Αρχείων"
 

	
 
msgid "Loading file list..."
 
msgstr "Φόρτωση λίστας αρχείων..."
 

	
 
msgid "Size"
 
msgstr "Μέγεθος"
 

	
 
msgid "Last Revision"
 
msgstr "Τελευταία Αναθεώρηση"
 

	
 
msgid "Last Modified"
 
msgstr "Τελευταία Τροποποίηση"
 

	
 
msgid "Last Committer"
 
msgstr "Τελευταίος Υποβάλλων"
 

	
 
msgid "%s Files Delete"
 
msgstr "%s Διαγραφή Αρχείων"
 

	
 
msgid "Delete file"
 
msgstr "Διαγραφή αρχείου"
 

	
 
msgid "%s File Edit"
 
msgstr "%s Επεξεργασία Αρχείου"
 

	
 
msgid "Edit file"
 
msgstr "Επεξεργασία αρχείου"
 

	
 
msgid "Show Annotation"
 
msgstr "Εμφάνιση Σχολιασμού"
 

	
 
msgid "Download as Raw"
 
msgstr "Λήψη ως ακατέργαστο"
 

	
 
msgid "Source"
 
msgstr "Πηγή"
 

	
 
msgid "%s author"
 
msgid_plural "%s authors"
 
msgstr[0] "%s συντάκτης"
 
msgstr[1] "%s συντάκτες"
 

	
 
msgid "Diff to Revision"
 
msgstr "Διαφορά σε Αναθεώρηση"
 

	
 
msgid "Show at Revision"
 
msgstr "Εμφάνιση στην Αναθεώρηση"
 

	
 
msgid "Show Full History"
 
msgstr "Εμφάνιση Πλήρους Ιστορικού"
 

	
 
msgid "Show Authors"
 
msgstr "Εμφάνιση Συντακτών"
 

	
 
msgid "Show Source"
 
msgstr "Εμφάνιση Πηγής"
 

	
 
msgid "Edit on Branch: %s"
 
msgstr "Επεξεργασία στον κλάδο: %s"
 

	
 
msgid "Editing binary files not allowed"
 
msgstr "Η επεξεργασία δυαδικών αρχείων δεν επιτρέπεται"
 

	
 
msgid "Editing files allowed only when on branch head revision"
 
msgstr ""
 
"Η επεξεργασία αρχείων επιτρέπεται μόνο σε αναθεώρηση επί της κεφαλής του "
 
"κλάδου"
 

	
 
msgid "Deleting files allowed only when on branch head revision"
 
msgstr ""
 
"Η διαγραφή αρχείων επιτρέπεται μόνο σε αναθεώρηση επί της κεφαλής του "
 
"κλάδου"
 

	
 
msgid "Binary file (%s)"
 
msgstr "Δυαδικό αρχείο (%s)"
 

	
 
msgid "File is too big to display."
 
msgstr "Το αρχείο είναι πολύ μεγάλο για προβολή."
 

	
 
msgid "Show full annotation anyway."
 
msgstr "Εμφάνιση πλήρους σχολιασμού ούτως ή άλλως."
 

	
 
msgid "Show as raw."
 
msgstr "Ακατέργαστη εμφάνιση."
 

	
 
msgid "annotation"
 
msgstr "σχολιασμός"
 

	
 
msgid "Go Back"
 
msgstr "Πήγαινε Πίσω"
 

	
 
msgid "No files at given path"
 
msgstr "Δεν υπάρχουν αρχεία στη δοσμένη διαδρομή"
 

	
 
msgid "%s Followers"
 
msgstr "%s Ακόλουθοι"
 

	
 
msgid "Followers"
 
msgstr "Ακόλουθοι"
 

	
 
msgid "Started following -"
 
msgstr "Ξεκίνησαν να ακολουθούν -"
 

	
 
msgid "Default revision for files page, downloads, whoosh, and readme."
 
msgstr ""
 
"Προεπιλεγμένη αναθεώρηση για τη σελίδα αρχείων, λήψεων, whoosh, και "
 
"readme."
 

	
 
msgid "Private"
 
msgstr "Ιδιωτικό"
 

	
 
msgid "Copy permissions"
 
msgstr "Αντιγραφή δικαιωμάτων"
 

	
 
msgid "Update after clone"
 
msgstr "Ενημέρωση μετά την κλωνοποίηση"
 

	
 
msgid "Checkout source after making a clone"
 
msgstr "Πηγαίνετε στον κώδικα μετά την κλωνοποίηση"
 

	
 
msgid "ATOM journal feed"
 
msgstr "Ημερολόγιο τροφοδοσίας ATOM"
 

	
 
msgid "RSS journal feed"
 
msgstr "Ημερολόγιο τροφοδοσίας RSS"
 

	
 
msgid "My Repositories"
 
msgstr "Τα αποθετήριά μου"
 

	
 
msgid "No entries yet"
 
msgstr "Δεν υπάρχουν ακόμη καταχωρήσεις"
 

	
 
msgid "ATOM public journal feed"
 
msgstr "Δημόσιο ημερολόγιο τροφοδοσίας ATOM"
 

	
 
msgid "RSS public journal feed"
 
msgstr "Δημόσιο ημερολόγιο τροφοδοσίας RSS"
 

	
 
msgid "New Pull Request"
 
msgstr "Νέο Αίτημα Έλξης"
 

	
 
msgid "Title"
 
msgstr "Τίτλος"
 

	
 
msgid "Summarize the changes - or leave empty"
 
msgstr "Συνοψίστε τις αλλαγές - ή αφήστε το κενό"
 

	
 
msgid "Write a short description on this pull request"
 
msgstr "Γράψτε μια σύντομη περιγραφή σχετικά με αυτό το αίτημα έλξης"
 

	
 
msgid "Changeset flow"
 
msgstr "Ροή σετ αλλαγών"
 

	
 
msgid "Origin repository"
 
msgstr "Αποθετήριο προέλευσης"
 

	
 
msgid "Revision"
 
msgstr "Αναθεώρηση"
 

	
 
msgid "Destination repository"
 
msgstr "Αποθετήριο προορισμού"
 

	
 
msgid "No entries"
 
msgstr "Χωρίς καταχωρήσεις"
 

	
 
msgid "Vote"
 
msgstr "Ψήφος"
 

	
 
msgid "Age"
 
msgstr "Ηλικία"
 

	
 
msgid "From"
 
msgstr "Από"
 

	
 
msgid "To"
 
msgstr "Προς"
 

	
 
msgid "You voted: %s"
 
msgstr "Ψηφίσατε: %s"
 

	
 
msgid "You didn't vote"
 
msgstr "Δεν ψηφίσατε"
 

	
 
msgid "(no title)"
 
msgstr "(χωρίς τίτλο)"
 

	
 
msgid "Closed"
 
msgstr "Κλειστό"
 

	
 
msgid "Delete Pull Request"
 
msgstr "Διαγραφή Αιτήματος Έλξης"
 

	
 
msgid "Confirm to delete this pull request"
 
msgstr "Επιβεβαίωση διαγραφής αυτού του αιτήματος έλξης"
 

	
 
msgid "Confirm again to delete this pull request with %s comments"
 
msgstr ""
 
"Επιβεβαίωση ξανά για τη διαγραφή αυτού του αιτήματος έλξης με %s σχόλια"
 

	
 
msgid "%s Pull Request %s"
 
msgstr "%s Αίτημα Έλξης %s"
 

	
 
msgid "Pull request %s from %s#%s"
 
msgstr "Αίτημα έλξης %s από %s#%s"
 

	
 
msgid "Summarize the changes"
 
msgstr "Σύνοψη των αλλαγών"
 

	
 
msgid "Voting Result"
 
msgstr "Αποτέλεσμα Ψηφοφορίας"
 

	
 
msgid "Pull request status calculated from votes"
 
msgstr "Η κατάσταση του αιτήματος έλξης υπολογισμένο από τις ψήφους"
 

	
 
msgid "Origin"
 
msgstr "Προέλευση"
 

	
 
msgid "on"
 
msgstr "επί"
 

	
 
msgid "Target"
 
msgstr "Στόχος"
 

	
 
msgid ""
 
"This is just a range of changesets and doesn't have a target or a real "
 
"merge ancestor."
 
msgstr ""
 
"Αυτό είναι μόνο μια σειρά από σετ αλλαγών και δεν έχει προορισμό ή "
 
"πραγματικό πρόγονο συγχώνευσης."
 

	
 
msgid "Pull changes"
 
msgstr "Τράβηγμα αλλαγών"
 

	
 
msgid "Next iteration"
 
msgstr "Επόμενη επανάληψη"
 

	
 
msgid "Current revision - no change"
 
msgstr "Τρέχουσα αναθεώρηση - καμία αλλαγή"
 

	
 
msgid ""
 
"Pull request iterations do not change content once created. Select a "
 
"revision to create a new iteration."
 
msgstr ""
 
"Οι επαναλήψεις αιτήσεων έλξης δεν αλλάζουν περιεχόμενο μετά τη δημιουργία "
 
"τους. Επιλέξτε μια αναθεώρηση για να δημιουργήσετε μια νέα επανάληψη."
 

	
 
msgid "Save Changes"
 
msgstr "Αποθήκευση Αλλαγών"
 

	
 
msgid "Create New Iteration with Changes"
 
msgstr "Δημιουργία Νέας Επανάληψης με τις Αλλαγές"
 

	
 
msgid "Cancel Changes"
 
msgstr "Ακύρωση Αλλαγών"
 

	
 
msgid "Reviewers"
 
msgstr "Επιθεωρητές"
 

	
 
msgid "Remove reviewer"
 
msgstr "Κατάργηση επιθεωρητή"
 

	
 
msgid "Type name of reviewer to add"
 
msgstr "Πληκτρολογήστε το όνομα του επιθεωρητή για προσθήκη"
 

	
 
msgid "Potential Reviewers"
 
msgstr "Πιθανοί Επιθεωρητές"
 

	
 
msgid "Click to add the repository owner as reviewer:"
 
msgstr ""
 
"Κάντε κλικ για να προσθέσετε τον κάτοχο του αποθετηρίου ως επιθεωρητή:"
 

	
 
msgid "Pull Request Content"
 
msgstr "Περιεχόμενο Αιτήματος Έλξης"
 

	
 
msgid "Common ancestor"
 
msgstr "Κοινός πρόγονος"
 

	
 
msgid "%s Pull Requests"
 
msgstr "%s Αιτήματα Έλξης"
 

	
 
msgid "Pull Requests from '%s'"
 
msgstr "Αιτήματα Έλξης από '%s'"
 

	
 
msgid "Pull Requests to '%s'"
 
msgstr "Αιτήματα Έλξης προς '%s'"
 

	
 
msgid "Open New Pull Request"
 
msgstr "Άνοιγμα Νέου Αιτήματος Έλξης"
 

	
 
msgid "Show Pull Requests to %s"
 
msgstr "Εμφάνιση Αιτημάτων Έλξης προς %s"
 

	
 
msgid "Show Pull Requests from '%s'"
 
msgstr "Εμφάνιση Αιτημάτων Έλξης από '%s'"
 

	
 
msgid "Hide closed pull requests (only show open pull requests)"
 
msgstr ""
 
"Απόκρυψη κλειστών αιτημάτων έλξης (εμφάνιση μόνο ανοικτών αιτημάτων έλξης)"
 

	
 
msgid "Show closed pull requests (in addition to open pull requests)"
 
msgstr ""
 
"Εμφάνιση κλειστών αιτημάτων έλξης (εκτός από τα ανοιχτά αιτήματα έλξης)"
 

	
 
msgid "Pull Requests Created by Me"
 
msgstr "Αιτήματα Έλξης που Δημιουργήθηκαν από Εμένα"
 

	
 
msgid "Pull Requests Needing My Review"
 
msgstr "Αιτήματα Έλξης που Χρειάζονται την Επιθεώρησή μου"
 

	
 
msgid "Pull Requests I Participate In"
 
msgstr "Αιτήματα Έλξης που Συμμετέχω"
 

	
 
msgid "%s Search"
 
msgstr "%s Αναζήτηση"
 

	
 
msgid "Search in All Repositories"
 
msgstr "Αναζήτηση σε Όλα τα Αποθετήρια"
 

	
 
msgid "Search term"
 
msgstr "Όρος αναζήτησης"
 

	
 
msgid "Search in"
 
msgstr "Αναζήτηση σε"
 

	
 
msgid "File contents"
 
msgstr "Περιεχόμενα αρχείου"
 

	
 
msgid "Commit messages"
 
msgstr "Μηνύματα commit"
 

	
 
msgid "File names"
 
msgstr "Ονόματα αρχείων"
 

	
 
msgid "Permission denied"
 
msgstr "Άρνηση δικαιώματος"
 

	
 
msgid "%s Statistics"
 
msgstr "%s Στατιστικά"
 

	
 
msgid "%s ATOM feed"
 
msgstr "%s Τροφοδοσία ATOM"
 

	
 
msgid "%s RSS feed"
 
msgstr "%s Τροφοδοσία RSS"
 

	
 
msgid "Enable"
 
msgstr "Ενεργοποίηση"
 

	
 
msgid "Stats gathered: "
 
msgstr "Στατιστικά που συγκεντρώθηκαν: "
 

	
 
msgid "files"
 
msgstr "αρχεία"
 

	
 
msgid "Show more"
 
msgstr "Εμφάνιση περισσότερων"
 

	
 
msgid "commits"
 
msgstr "commits"
 

	
 
msgid "files added"
 
msgstr "αρχεία που προστέθηκαν"
 

	
 
msgid "files changed"
 
msgstr "αρχεία που άλλαξαν"
 

	
 
msgid "files removed"
 
msgstr "αρχεία που αφαιρέθηκαν"
 

	
 
msgid "commit"
 
msgstr "commit"
 

	
 
msgid "file added"
 
msgstr "αρχείο προστέθηκε"
 

	
 
msgid "file changed"
 
msgstr "αρχείο άλλαξε"
 

	
 
msgid "file removed"
 
msgstr "αρχείο αφαιρέθηκε"
 

	
 
msgid "%s Summary"
 
msgstr "%s Σύνοψη"
 

	
 
msgid "Clone from"
 
msgstr "Κλώνος από"
 

	
 
msgid "Clone URL"
 
msgstr "Clone URL"
 

	
 
msgid "Use ID"
 
msgstr "Χρήση ID"
 

	
 
msgid "Use SSH"
 
msgstr "Χρήση SSH"
 

	
 
msgid "Use Name"
 
msgstr "Χρήση Ονόματος"
 

	
 
msgid "Use HTTP"
 
msgstr "Χρήση HTTP"
 

	
 
msgid "Trending files"
 
msgstr "Δημοφιλή αρχεία"
 

	
 
msgid "Download"
 
msgstr "Λήψη"
 

	
 
msgid "There are no downloads yet"
 
msgstr "Δεν υπάρχουν λήψεις ακόμα"
 

	
 
msgid "Downloads are disabled for this repository"
 
msgstr "Οι λήψεις είναι απενεργοποιημένες για αυτό το αποθετήριο"
 

	
 
msgid "Download as zip"
 
msgstr "Λήψη ως zip"
 

	
 
msgid "Check this to download archive with subrepos"
 
msgstr "Επιλέξτε αυτό για τη λήψη του αρχείου με τα υπο-αποθετήρια"
 

	
 
msgid "With subrepos"
 
msgstr "Με υπο-αποθετήρια"
 

	
 
msgid "Feed"
 
msgstr "Ροή"
 

	
 
msgid "Latest Changes"
 
msgstr "Τελευταίες Αλλαγές"
 

	
 
msgid "Quick Start"
 
msgstr "Γρήγορη Εκκίνηση"
 

	
 
msgid "Add or upload files directly via Kallithea"
 
msgstr "Προσθέστε ή ανεβάστε αρχεία απευθείας μέσω Καλλιθέας"
 

	
 
msgid "Push new repository"
 
msgstr "Ώθηση νέου αποθετηρίου"
 

	
 
msgid "Existing repository?"
 
msgstr "Υπάρχον αποθετήριο;"
 

	
 
msgid "Readme file from revision %s:%s"
 
msgstr "Αρχείο Readme από την αναθεώρηση %s:%s"
 

	
 
msgid "Download %s as %s"
 
msgstr "Λήψη %s ως %s"
kallithea/i18n/fr/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -149,96 +149,99 @@ msgstr ""
 
msgid "Downloads disabled"
 
msgstr "Les téléchargements sont désactivés"
 

	
 
msgid "Unknown revision %s"
 
msgstr "Révision %s inconnue"
 

	
 
msgid "Empty repository"
 
msgstr "Dépôt vide"
 

	
 
msgid "Unknown archive type"
 
msgstr "Type d’archive inconnu"
 

	
 
msgid "Changesets"
 
msgstr "Changesets"
 

	
 
msgid "Branches"
 
msgstr "Branches"
 

	
 
msgid "Tags"
 
msgstr "Tags"
 

	
 
msgid "An error occurred during repository forking %s"
 
msgstr "Une erreur est survenue durant le fork du dépôt %s"
 

	
 
msgid "Groups"
 
msgstr "Groupes"
 

	
 
msgid "Repositories"
 
msgstr "Dépôts"
 

	
 
msgid "Branch"
 
msgstr "Branche"
 

	
 
msgid "Closed Branches"
 
msgstr "Branches fermées"
 

	
 
msgid "Tag"
 
msgstr "Étiquette"
 

	
 
msgid "Bookmark"
 
msgstr "Signet"
 

	
 
msgid "Public Journal"
 
msgstr "Journal public"
 

	
 
msgid "Journal"
 
msgstr "Historique"
 

	
 
msgid "Authentication failed."
 
msgstr "Échec de l'authentification."
 

	
 
msgid "Bad captcha"
 
msgstr "Mauvais captcha"
 

	
 
msgid "You have successfully registered with %s"
 
msgstr "Vous vous êtes inscrit avec succès avec %s"
 

	
 
msgid "A password reset confirmation code has been sent"
 
msgstr ""
 
"Un lien de confirmation de réinitialisation de mot de passe a été envoyé"
 

	
 
msgid "Invalid password reset token"
 
msgstr "Clé de réinitialisation de mot de passe invalide"
 

	
 
msgid "Successfully updated password"
 
msgstr "Mot de passe mis à jour avec succès"
 

	
 
msgid "Invalid reviewer \"%s\" specified"
 
msgstr "Reviewer spécifié \"%s\" non valide"
 

	
 
msgid "%s (closed)"
 
msgstr "%s (fermé)"
 

	
 
msgid "Changeset"
 
msgstr "Changements"
 

	
 
msgid "Special"
 
msgstr "Spécial"
 

	
 
msgid "Peer branches"
 
msgstr "Branches appairées"
 

	
 
msgid "Bookmarks"
 
msgstr "Signets"
 

	
 
msgid "Error creating pull request: %s"
 
msgstr "Erreur de création de la demande de pull : %s"
 

	
 
msgid "Error occurred while creating pull request"
 
msgstr "Une erreur est survenue durant la création de la pull request"
 

	
 
msgid "Successfully opened new pull request"
 
msgstr "La requête de pull a été ouverte avec succès"
 

	
 
msgid "New pull request iteration created"
 
msgstr "Nouvelle itération de requête de pull créée"
 

	
 
msgid "Meanwhile, the following reviewers have been added: %s"
 
msgstr "Entretemps, les relecteurs suivants on été ajoutés : %s"
 
@@ -349,96 +352,102 @@ msgid "Deleted gist %s"
 
msgstr "Gist %s supprimé"
 

	
 
msgid "Unmodified"
 
msgstr "Non modifié"
 

	
 
msgid "Successfully updated gist content"
 
msgstr "Le contenu du gist a été mis à jour avec succès"
 

	
 
msgid "Successfully updated gist data"
 
msgstr "Les données du gist on été mises à jour avec succès"
 

	
 
msgid "Error occurred during update of gist %s"
 
msgstr "Une erreur est survenue durant la mise à jour du gist %s"
 

	
 
msgid "You can't edit this user since it's crucial for entire application"
 
msgstr ""
 
"Vous ne pouvez pas éditer cet utilisateur ; il est nécessaire pour le bon "
 
"fonctionnement de l’application"
 

	
 
msgid "Your account was updated successfully"
 
msgstr "Votre compte a été mis à jour avec succès"
 

	
 
msgid "Error occurred during update of user %s"
 
msgstr "Une erreur est survenue durant la mise à jour de l'utilisateur %s"
 

	
 
msgid "Error occurred during update of user password"
 
msgstr ""
 
"Une erreur est survenue durant la mise à jour du mot de passe de "
 
"l'utilisateur"
 

	
 
msgid "Added email %s to user"
 
msgstr "L’e-mail « %s » a été ajouté à l’utilisateur"
 

	
 
msgid "An error occurred during email saving"
 
msgstr "Une erreur est survenue durant l’enregistrement de l’e-mail"
 

	
 
msgid "Removed email from user"
 
msgstr "L’e-mail a été enlevé de l’utilisateur"
 

	
 
msgid "API key successfully created"
 
msgstr "Clé d'API créée avec succès"
 

	
 
msgid "API key successfully reset"
 
msgstr "Clé d'API remise à zéro avec succès"
 

	
 
msgid "API key successfully deleted"
 
msgstr "Clé d'API supprimée avec succès"
 

	
 
msgid "SSH key %s successfully added"
 
msgstr "Clé SSH %s ajoutée avec succès"
 

	
 
msgid "SSH key successfully deleted"
 
msgstr "Clé SSH supprimée avec succès"
 

	
 
msgid "Read"
 
msgstr "Lire"
 

	
 
msgid "Write"
 
msgstr "Écrire"
 

	
 
msgid "Admin"
 
msgstr "Administration"
 

	
 
msgid "Disabled"
 
msgstr "Interdite"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Autorisé avec activation de compte manuelle"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Autorisé avec activation de compte automatique"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Activation manuelle du compte externe"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Activation automatique du compte externe"
 

	
 
msgid "Enabled"
 
msgstr "Autorisée"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Permissions globales mises à jour avec succès"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Une erreur est survenue durant la mise à jour des permissions"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Une erreur est survenue durant la création du groupe de dépôts %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Groupe de dépôts %s créé"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Groupe de dépôts %s mis à jour"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr ""
 
"Une erreur est survenue durant la mise à jour du groupe de dépôts %s"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Ce groupe contient %s dépôts et ne peut être supprimé"
 
@@ -482,102 +491,96 @@ msgstr "Une erreur est survenue durant la mise à jour du dépôt %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "%s forks détachés"
 

	
 
msgid "Deleted %s forks"
 
msgstr "%s forks supprimés"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Dépôt %s supprimé"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Impossible de supprimer le dépôt %s : des forks y sont attachés"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Erreur pendant la suppression de %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Permissions du dépôt mises à jour"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Erreur de validation du champ : %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Une erreur est survenue durant la création du champ : %r"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Une erreur est survenue durant la suppression du champ"
 

	
 
msgid "-- Not a fork --"
 
msgstr "-- Pas un fork --"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "La visibilité du dépôt dans le journal public a été mise à jour"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr ""
 
"Une erreur est survenue durant la configuration du journal public pour ce "
 
"dépôt"
 

	
 
msgid "Nothing"
 
msgstr "[Aucun dépôt]"
 

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "Le dépôt %s a été marké comme fork de %s"
 

	
 
msgid "An error occurred during this operation"
 
msgstr "Une erreur est survenue durant cette opération"
 

	
 
msgid "Cache invalidation successful"
 
msgstr "Invalidation du cache réalisée avec succès"
 

	
 
msgid "An error occurred during cache invalidation"
 
msgstr "Une erreur est survenue durant l’invalidation du cache"
 

	
 
msgid "Pulled from remote location"
 
msgstr "Les changements distants ont été récupérés"
 

	
 
msgid "An error occurred during pull from remote location"
 
msgstr "Une erreur est survenue durant le pull depuis la source distante"
 

	
 
msgid "An error occurred during deletion of repository stats"
 
msgstr ""
 
"Une erreur est survenue durant la suppression des statistiques du dépôt"
 

	
 
msgid "Updated VCS settings"
 
msgstr "Réglages des gestionnaires de versions mis à jour"
 

	
 
msgid ""
 
"Unable to activate hgsubversion support. The \"hgsubversion\" library is "
 
"missing"
 
msgstr ""
 
"Impossible d'activer la prise en charge de hgsubversion. La bibliothèque "
 
"« hgsubversion » est manquante"
 

	
 
msgid "Error occurred while updating application settings"
 
msgstr ""
 
"Une erreur est survenue durant la mise à jour des réglages de "
 
"l'application"
 

	
 
msgid "Repositories successfully rescanned. Added: %s. Removed: %s."
 
msgstr "Dépôts ré-analysés avec succès. Ajouté : %s. Supprimé : %s."
 

	
 
msgid "Invalidated %s repositories"
 
msgstr "%s dépôts invalidés"
 

	
 
msgid "Updated application settings"
 
msgstr "Réglages mis à jour"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Réglages d’affichage mis à jour"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr ""
 
"Une erreur est survenue durant la mise à jour des réglages de "
 
"visualisation"
 

	
 
msgid "Please enter email address"
 
msgstr "Veuillez entrer votre adresse e-mail"
 

	
 
msgid "Send email task created"
 
msgstr "Tâche d'envoi d'e-mail créée"
 

	
 
@@ -635,96 +638,99 @@ msgid "An error occurred during permissi
 
msgstr "Une erreur est survenue durant l’enregistrement des permissions"
 

	
 
msgid "Created user %s"
 
msgstr "Utilisateur %s créé"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Une erreur est survenue durant la création de l'utilisateur %s"
 

	
 
msgid "User updated successfully"
 
msgstr "L’utilisateur a été mis à jour avec succès"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Utilisateur supprimé avec succès"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Une erreur est survenue durant la suppression de l’utilisateur"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "L'utilisateur par défaut ne peut pas être modifié"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "L'adresse IP %s a été ajoutée à la liste blanche"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Une erreur est survenue durant la sauvegarde d'IP"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "L'adresse IP a été supprimée de la liste blanche"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr ""
 
"Vous devez être un utilisateur enregistré pour effectuer cette action"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Vous devez être connecté pour visualiser cette page"
 

	
 
msgid ""
 
"CSRF token leak has been detected - all form tokens have been expired"
 
msgstr ""
 
"Une fuite de jeton CSRF a été détectée - tous les jetons de formulaire "
 
"sont considérés comme expirés"
 

	
 
msgid "Repository not found in the filesystem"
 
msgstr "Dépôt non trouvé sur le système de fichiers"
 

	
 
msgid "Changeset for %s %s not found in %s"
 
msgstr "Ensemble de changements pour %s %s non trouvé dans %s"
 

	
 
msgid "SSH access is disabled."
 
msgstr "L'accès SSH est désactivé."
 

	
 
msgid "Binary file"
 
msgstr "Fichier binaire"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Cet ensemble de changements était trop gros pour être affiché et a été "
 
"découpé, utilisez le menu « diff » pour afficher les différences"
 

	
 
msgid "No changes detected"
 
msgstr "Aucun changement détecté"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "Branche supprimée : %s"
 

	
 
msgid "Created tag: %s"
 
msgstr "Étiquette créée : %s"
 

	
 
msgid "Changeset %s not found"
 
msgstr "Ensemble de changements %s non trouvé"
 

	
 
msgid "Show all combined changesets %s->%s"
 
msgstr "Afficher les changements combinés %s->%s"
 

	
 
msgid "Compare view"
 
msgstr "Vue de comparaison"
 

	
 
msgid "and"
 
msgstr "et"
 

	
 
msgid "%s more"
 
msgstr "%s de plus"
 

	
 
msgid "revisions"
 
msgstr "révisions"
 

	
 
msgid "Fork name %s"
 
msgstr "Nom du fork %s"
 

	
 
msgid "Pull request %s"
 
msgstr "Requête de pull %s"
 

	
 
msgid "[deleted] repository"
 
msgstr "[a supprimé] le dépôt"
 

	
 
msgid "[created] repository"
 
msgstr "[a créé] le dépôt"
 

	
 
@@ -767,96 +773,119 @@ msgstr "[a fermé] la requête de pull de"
 
msgid "[pushed] into"
 
msgstr "[a pushé] dans"
 

	
 
msgid "[committed via Kallithea] into repository"
 
msgstr "[a commité via Kallithea] dans le dépôt"
 

	
 
msgid "[pulled from remote] into repository"
 
msgstr "[a pullé depuis un site distant] dans le dépôt"
 

	
 
msgid "[pulled] from"
 
msgstr "[a pullé] depuis"
 

	
 
msgid "[started following] repository"
 
msgstr "[suit maintenant] le dépôt"
 

	
 
msgid "[stopped following] repository"
 
msgstr "[ne suit plus] le dépôt"
 

	
 
msgid " and %s more"
 
msgstr " et %s de plus"
 

	
 
msgid "No files"
 
msgstr "Aucun fichier"
 

	
 
msgid "new file"
 
msgstr "nouveau fichier"
 

	
 
msgid "mod"
 
msgstr "mod"
 

	
 
msgid "del"
 
msgstr "suppr."
 

	
 
msgid "rename"
 
msgstr "renommer"
 

	
 
msgid "chmod"
 
msgstr "chmod"
 

	
 
msgid ""
 
"%s repository is not mapped to db perhaps it was created or renamed from "
 
"the filesystem please run the application again in order to rescan "
 
"repositories"
 
msgstr ""
 
"Le dépôt %s n’est pas représenté dans la base de données. Il a "
 
"probablement été créé ou renommé manuellement. Veuillez relancer "
 
"l’application pour rescanner les dépôts"
 

	
 
msgid "SSH key is missing"
 
msgstr "La clé SSH est manquante"
 

	
 
msgid ""
 
"Incorrect SSH key - it must have both a key type and a base64 part, like "
 
"'ssh-rsa ASRNeaZu4FA...xlJp='"
 
msgstr ""
 
"Clé SSH incorrecte – elle doit comporter à la fois un type de clé et une "
 
"partie base64, comme 'ssh-rsa ASRNeaZu4FA...xlJp='"
 

	
 
msgid "Incorrect SSH key - it must start with 'ssh-(rsa|dss|ed25519)'"
 
msgstr "Clé SSH incorrecte – elle doit commencer par « ssh-(rsa|dss|ed25519) »"
 

	
 
msgid "Incorrect SSH key - unexpected characters in base64 part %r"
 
msgstr "Clé SSH incorrecte – caractères inattendus dans la partie base 64 %r"
 

	
 
msgid "Incorrect SSH key - failed to decode base64 part %r"
 
msgstr "Clé SSH incorrecte – échec du décodage de la partie base64 %r"
 

	
 
msgid "Incorrect SSH key - base64 part is not %r as claimed but %r"
 
msgstr ""
 
"Clé SSH incorrecte – la partie base 64 n'est pas %r comme il est dit mais %r"
 

	
 
msgid "%d year"
 
msgid_plural "%d years"
 
msgstr[0] "%d an"
 
msgstr[1] "%d ans"
 

	
 
msgid "%d month"
 
msgid_plural "%d months"
 
msgstr[0] "%d mois"
 
msgstr[1] "%d mois"
 

	
 
msgid "%d day"
 
msgid_plural "%d days"
 
msgstr[0] "%d jour"
 
msgstr[1] "%d jours"
 

	
 
msgid "%d hour"
 
msgid_plural "%d hours"
 
msgstr[0] "%d heure"
 
msgstr[1] "%d heures"
 

	
 
msgid "%d minute"
 
msgid_plural "%d minutes"
 
msgstr[0] "%d minute"
 
msgstr[1] "%d minutes"
 

	
 
msgid "%d second"
 
msgid_plural "%d seconds"
 
msgstr[0] "%d seconde"
 
msgstr[1] "%d secondes"
 

	
 
msgid "in %s"
 
msgstr "dans %s"
 

	
 
msgid "%s ago"
 
msgstr "Il y a %s"
 

	
 
msgid "in %s and %s"
 
msgstr "dans %s et %s"
 

	
 
msgid "%s and %s ago"
 
msgstr "Il y a %s et %s"
 

	
 
msgid "just now"
 
msgstr "à l’instant"
 

	
 
msgid "on line %s"
 
msgstr "à la ligne %s"
 

	
 
@@ -1024,96 +1053,105 @@ msgstr ""
 

	
 
msgid "Closing"
 
msgstr "Fermeture"
 

	
 
msgid ""
 
"%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 
msgstr ""
 
"%(user)s veut que vous regardiez la demande de pull %(pr_nice_id)s : "
 
"%(pr_title)s"
 

	
 
msgid "Cannot create empty pull request"
 
msgstr "Impossible de créer une requête de pull vide"
 

	
 
msgid ""
 
"Cannot create pull request - criss cross merge detected, please merge a "
 
"later %s revision to %s"
 
msgstr ""
 
"Impossible de créer la requête de pull : fusion croisée détectée, merci "
 
"de fusionner une révision plus vieille de %s vers %s"
 

	
 
msgid "You are not authorized to create the pull request"
 
msgstr "Vous n'êtes pas autorisé à créer cette requête de pull"
 

	
 
msgid "Missing changesets since the previous iteration:"
 
msgstr "Changeset manquant depuis la précédente itération :"
 

	
 
msgid "New changesets on %s %s since the previous iteration:"
 
msgstr "Nouveau changeset sur %s %s depuis la précédente itération :"
 

	
 
msgid "Ancestor didn't change - diff since previous iteration:"
 
msgstr "L'ancêtre n'a pas changé - diff depuis l'itération précédente :"
 

	
 
msgid ""
 
"This iteration is based on another %s revision and there is no simple "
 
"diff."
 
msgstr ""
 
"Cette itération est basée sur une autre révision %s et il n'y a pas de "
 
"diff simple."
 

	
 
msgid "No changes found on %s %s since previous iteration."
 
msgstr "Aucun changement constaté sur %s %s depuis l'itération précédente."
 

	
 
msgid "Closed, next iteration: %s ."
 
msgstr "Fermé, itération suivante : %s."
 

	
 
msgid "latest tip"
 
msgstr "Dernier sommet"
 

	
 
msgid "SSH key %r is invalid: %s"
 
msgstr "La clé SSH %r est invalide : %s"
 

	
 
msgid "SSH key %s is already used by %s"
 
msgstr "La clé SSH %s est déjà utilisée par %s"
 

	
 
msgid "SSH key with fingerprint %r found"
 
msgstr "Clé SSH avec l'empreinte %r trouvée"
 

	
 
msgid "New user registration"
 
msgstr "Nouveau enregistrement d'utilisateur"
 

	
 
msgid ""
 
"You can't remove this user since it is crucial for the entire application"
 
msgstr ""
 
"Vous ne pouvez pas supprimer cet utilisateur ; il est nécessaire pour le "
 
"bon fonctionnement de l’application"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repositories and cannot be removed. Switch "
 
"owners or remove those repositories: %s"
 
msgstr ""
 
"L’utilisateur \"%s\" possède %s dépôts et ne peut être supprimé. Changez "
 
"les propriétaires ou supprimez ces dépôts : %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repository groups and cannot be removed. Switch "
 
"owners or remove those repository groups: %s"
 
msgstr ""
 
"L’utilisateur \"%s\" possède %s groupes de dépôt et ne peut être "
 
"supprimé. Changez les propriétaires ou supprimez ces dépôts : %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s user groups and cannot be removed. Switch "
 
"owners or remove those user groups: %s"
 
msgstr ""
 
"L’utilisateur « %s » possède %s groupes d'utilisateurs et ne peut pas "
 
"être supprimé. Changez les propriétaires de ces groupes d'utilisateurs ou "
 
"supprimez-les : %s"
 

	
 
msgid "Password reset link"
 
msgstr "Lien de remise à zéro du mot de passe"
 

	
 
msgid "Password reset notification"
 
msgstr "Notification de réinitialisation du mot de passe"
 

	
 
msgid ""
 
"The password to your account %s has been changed using password reset "
 
"form."
 
msgstr ""
 
"Le mot de passe de votre compte %s a été changé via le formulaire de "
 
"réinitialisation du mot de passe."
 

	
 
msgid "Value cannot be an empty list"
 
msgstr "Cette valeur ne peut être une liste vide"
 

	
 
msgid "Username \"%(username)s\" already exists"
 
@@ -1518,203 +1556,221 @@ msgstr "Nommer ce gist…"
 
msgid "Create Private Gist"
 
msgstr "Créer un gist privé"
 

	
 
msgid "Create Public Gist"
 
msgstr "Créer un gist public"
 

	
 
msgid "Reset"
 
msgstr "Réinitialiser"
 

	
 
msgid "Gist"
 
msgstr "Gist"
 

	
 
msgid "URL"
 
msgstr "URL"
 

	
 
msgid "Public Gist"
 
msgstr "Gist public"
 

	
 
msgid "Private Gist"
 
msgstr "Gist privé"
 

	
 
msgid "Delete"
 
msgstr "Supprimer"
 

	
 
msgid "Confirm to delete this Gist"
 
msgstr "Confirmer la supprisson de ce gist"
 

	
 
msgid "Edit"
 
msgstr "Modifier"
 

	
 
msgid "Show as Raw"
 
msgstr "Montrer en brut"
 

	
 
msgid "created"
 
msgstr "créé"
 

	
 
msgid "Show as raw"
 
msgstr "Montrer en brut"
 

	
 
msgid "My Account"
 
msgstr "Mon compte"
 

	
 
msgid "Profile"
 
msgstr "Profil"
 

	
 
msgid "Email Addresses"
 
msgstr "Adresses e-mail"
 

	
 
msgid "SSH Keys"
 
msgstr "Clés SSH"
 

	
 
msgid "API Keys"
 
msgstr "Clés de l'API"
 

	
 
msgid "Owned Repositories"
 
msgstr "Dépôts possédés"
 

	
 
msgid "Watched Repositories"
 
msgstr "Dépôts surveillés"
 

	
 
msgid "Show Permissions"
 
msgstr "Afficher les permissions"
 

	
 
msgid "Built-in"
 
msgstr "Inclus"
 

	
 
msgid "Confirm to reset this API key: %s"
 
msgstr "Confirmer la remise à zéro de cette clé d'API : %s"
 

	
 
msgid "Expired"
 
msgstr "a expiré"
 

	
 
msgid "Confirm to remove this API key: %s"
 
msgstr "Confirmer la suppression de cette clé d'API : %s"
 

	
 
msgid "Remove"
 
msgstr "Supprimer"
 

	
 
msgid "No additional API keys specified"
 
msgstr "Pas de clés d'API supplémentaires spécifiées"
 

	
 
msgid "New API key"
 
msgstr "Nouvelle clé d'API"
 

	
 
msgid "Add"
 
msgstr "Ajouter"
 

	
 
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"
 
"Les clés API sont utilisées pour permettre à des scripts et des services "
 
"d'accéder à %s en utilisant votre compte, comme si vous aviez fourni "
 
"votre mot de passe à ces scripts ou services.\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"
 
"Comme les mots de passe, les clés API ne devraient donc jamais être "
 
"diffusées à des tiers, ni passés à des scripts ou services auxquels vous "
 
"ne faites pas confiance. Si cette diffusion a tout de même lieu, vous "
 
"pouvez réinitialiser la clé API sur cette page pour qu'elle ne puisse "
 
"plus être utilisée.\n"
 

	
 
msgid "Primary"
 
msgstr "Primaire"
 

	
 
msgid "Confirm to delete this email: %s"
 
msgstr "Veuillez confirmer la suppression de l’e-mail : %s"
 

	
 
msgid "No additional emails specified."
 
msgstr "Pas d'adresse email supplémentaires spécifiées."
 
msgstr "Pas d'adresse e-mail supplémentaires spécifiées."
 

	
 
msgid "New email address"
 
msgstr "Nouvelle adrese"
 
msgstr "Nouvelle adresse e-mail"
 

	
 
msgid "Change Your Account Password"
 
msgstr "Changer le mot de passe de votre compte"
 

	
 
msgid "Current password"
 
msgstr "Mot de passe actuel"
 

	
 
msgid "New password"
 
msgstr "Nouveau mot de passe"
 

	
 
msgid "Confirm new password"
 
msgstr "Confirmer le nouveau mot de passe"
 

	
 
msgid ""
 
"This account is managed with %s and the password cannot be changed here"
 
msgstr ""
 
"Ce compte est géré avec %s et le mot de passe ne peut pas être changé ici"
 

	
 
msgid "Current IP"
 
msgstr "Adresse IP actuelle"
 

	
 
msgid "Gravatar"
 
msgstr "Gravatar"
 

	
 
msgid "Change %s avatar at"
 
msgstr "Changer l'avatar de %s sur"
 

	
 
msgid "Avatars are disabled"
 
msgstr "Les avatars sont désactivés"
 

	
 
msgid "Repositories You Own"
 
msgstr "Dépôts dont vous êtes le propriétaire"
 

	
 
msgid "Name"
 
msgstr "Nom"
 

	
 
msgid "Fingerprint"
 
msgstr "Empreinte"
 

	
 
msgid "Confirm to remove this SSH key: %s"
 
msgstr "Confirmer la suppression de cette clé SSH : %s"
 

	
 
msgid "No SSH keys have been added"
 
msgstr "Aucune clé SSH n'a été ajoutée"
 

	
 
msgid "New SSH key"
 
msgstr "Nouvelle clé SSH"
 

	
 
msgid "Public key"
 
msgstr "Clé publique"
 

	
 
msgid "Repositories You are Watching"
 
msgstr "Dépôts que vous surveillez"
 

	
 
msgid "Default Permissions"
 
msgstr "Permissions par défaut"
 

	
 
msgid "Global"
 
msgstr "Global"
 

	
 
msgid "IP Whitelist"
 
msgstr "Liste blanche d'adresses IP"
 

	
 
msgid "Anonymous access"
 
msgstr "Accès anonyme"
 

	
 
msgid "Allow anonymous access"
 
msgstr "Permettre l'accès anonyme"
 

	
 
msgid ""
 
"Allow access to Kallithea without needing to log in. Anonymous users use "
 
"%s user permissions."
 
msgstr ""
 
"Autoriser l'accès à Kallithea sans le besoin de se connecter. Les "
 
"utilisateurs anonymes ont les permissions de l'utilisateur %s."
 

	
 
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 ""
 
"Toutes les permissions par défaut de chaque dépôt vont être "
 
"réinitialisées aux valeurs choisies. Notez que toutes les permissions par "
 
"défaut personnalisées sur les dépôts seront perdues"
 

	
 
msgid "Apply to all existing repositories"
 
msgstr "Appliquer à tous les dépôts existants"
 

	
 
msgid "Permissions for the Default user on new repositories."
 
msgstr "Permissions pour l'utilisateur par défaut sur les nouveaux dépôts."
 

	
 
msgid "Repository group"
 
msgstr "Groupe de dépôt"
 

	
 
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 ""
 
@@ -1929,222 +1985,203 @@ msgid ""
 
"Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr ""
 
"Gardez cette description précise et concise. Utilisez un fichier README "
 
"pour des descriptions plus détaillées."
 

	
 
msgid "Optionally select a group to put this repository into."
 
msgstr "Sélectionnez un groupe (optionel) dans lequel sera placé le dépôt."
 

	
 
msgid "Type of repository to create."
 
msgstr "Type de dépôt à créer."
 

	
 
msgid "Landing revision"
 
msgstr "Révision d’arrivée"
 

	
 
msgid ""
 
"Default revision for files page, downloads, full text search index and "
 
"readme generation"
 
msgstr ""
 
"Révision par défaut pour les pages de fichiers, de téléchargement, de "
 
"l'index de recherche dans le texte complet, et de génération de "
 
"documentation (readme)"
 

	
 
msgid "%s Creating Repository"
 
msgstr "Création du dépôt %s"
 

	
 
msgid "Creating repository"
 
msgstr "Création du dépôt"
 

	
 
msgid ""
 
"Repository \"%(repo_name)s\" is being created, you will be redirected "
 
"when this process is finished.repo_name"
 
msgstr ""
 
"Le dépôt « %(repo_name)s » est en cours de création, vous allez être "
 
"redirigé quand cette opération sera terminée."
 

	
 
msgid ""
 
"We're sorry but error occurred during this operation. Please check your "
 
"Kallithea server logs, or contact administrator."
 
msgstr ""
 
"Désolé, une erreur est survenue pendant l'opération. Vérifiez les "
 
"journaux du serveur Kallithea, ou contactez votre administrateur."
 

	
 
msgid "%s Repository Settings"
 
msgstr "Réglages du dépôt %s"
 

	
 
msgid "Extra Fields"
 
msgstr "Champs supplémentaires"
 

	
 
msgid "Caches"
 
msgstr "Caches"
 

	
 
msgid "Remote"
 
msgstr "Dépôt distant"
 

	
 
msgid "Statistics"
 
msgstr "Statistiques"
 

	
 
msgid "Parent"
 
msgstr "Parent"
 

	
 
msgid "Set"
 
msgstr "Appliquer"
 

	
 
msgid "Manually set this repository as a fork of another from the list."
 
msgstr ""
 
"Marquer manuellement ce dépôt comme fork d’un autre dépôt de la liste."
 

	
 
msgid "Public Journal Visibility"
 
msgstr "Visibilité du journal public"
 

	
 
msgid "Remove from public journal"
 
msgstr "Supprimer du journal public"
 

	
 
msgid "Add to Public Journal"
 
msgstr "Ajouter au journal public"
 

	
 
msgid ""
 
"All actions done in this repository will be visible to everyone in the "
 
"public journal."
 
msgstr ""
 
"Les actions réalisées sur ce dépôt seront visibles à tous depuis le "
 
"journal public."
 

	
 
msgid "Confirm to delete this repository: %s"
 
msgstr "Voulez-vous vraiment supprimer le dépôt %s ?"
 

	
 
msgid "Delete this Repository"
 
msgstr "Supprimer ce dépôt"
 

	
 
msgid "This repository has %s fork"
 
msgid_plural "This repository has %s forks"
 
msgstr[0] "Ce dépôt a %s fork"
 
msgstr[1] "Ce dépôt a %s forks"
 

	
 
msgid "Detach forks"
 
msgstr "Détacher les forks"
 

	
 
msgid "Delete forks"
 
msgstr "Supprimer les forks"
 

	
 
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 ""
 
"Le dépôt supprimé sera mis de côté et caché jusqu'à ce que "
 
"l'administrateur le fasse expirer. L'administrateur peut soit le "
 
"supprimer définitivement, soit le restaurer."
 

	
 
msgid "Invalidate Repository Cache"
 
msgstr "Invalider le cache du dépôt"
 

	
 
msgid ""
 
"Manually invalidate cache for this repository. On first access, the "
 
"repository will be cached again."
 
msgstr ""
 
"Invalider manuellement le cache de ce dépôt. Au prochain accès sur ce "
 
"dépôt, il sera à nouveau mis en cache."
 

	
 
msgid "List of Cached Values"
 
msgstr "Liste des valeurs en cache"
 

	
 
msgid "Prefix"
 
msgstr "Préfixe"
 
msgid "Label"
 
msgstr "Libellé"
 

	
 
msgid "Key"
 
msgstr "Clé"
 

	
 
msgid "Active"
 
msgstr "Actif"
 

	
 
msgid "Label"
 
msgstr "Libellé"
 

	
 
msgid "Confirm to delete this field: %s"
 
msgstr "Voulez-vous vraiment supprimer ce champ : %s ?"
 

	
 
msgid "New field key"
 
msgstr "Clé du nouveau champ"
 

	
 
msgid "New field label"
 
msgstr "Libellé du nouveau champ"
 

	
 
msgid "Enter short label"
 
msgstr "Saisir un libellé court"
 

	
 
msgid "New field description"
 
msgstr "Description du nouveau champ"
 

	
 
msgid "Enter description of a field"
 
msgstr "Saisir la description du champ"
 

	
 
msgid "Extra fields are disabled."
 
msgstr "Les champs supplémentaires sont désactivés."
 

	
 
msgid "Private Repository"
 
msgstr "Dépôt privé"
 

	
 
msgid "Fork of repository"
 
msgstr "Forker du dépôt"
 

	
 
msgid "Remote repository URL"
 
msgstr "URL du dépôt distant"
 

	
 
msgid "Pull Changes from Remote Repository"
 
msgstr "Récupérer les modifications depuis le dépôt distant"
 

	
 
msgid "Confirm to pull changes from remote repository."
 
msgstr ""
 
"Voulez-vous vraiment récupérer les changements depuis le dépôt distant ?"
 

	
 
msgid "This repository does not have a remote repository URL."
 
msgstr "Ce dépôt n'a pas d'URL de dépôt distant."
 

	
 
msgid "Permanent URL"
 
msgstr "URL permanente"
 

	
 
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 ""
 
"Si ce dépôt est renommé ou déplacé dans un autre groupe, l'URL du dépôt "
 
"change.\n"
 
"                               L'utilisation de l'URL permanente ci-"
 
"dessus garantit que ce dépôt sera toujours accessible via cette URL.\n"
 
"                               Cela peut être utile pour les systèmes "
 
"d'intégration continue, ou dans tous les cas où vous devez saisir l'URL "
 
"« en dur » dans un service tiers."
 

	
 
msgid "Remote repository"
 
msgstr "Dépôt distant"
 

	
 
msgid "Repository URL"
 
msgstr "URL du dépôt"
 

	
 
msgid ""
 
"Optional: URL of a remote repository. If set, the repository can be "
 
"pulled from this URL."
 
msgstr ""
 
"Optionel : URL d'un dépôt distant. Si renseigné, le dépôt sera pullé à "
 
"partir de cette URL."
 

	
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr ""
 
"Révision par défaut pour les pages de fichiers, de téléchargements, de "
 
"recherche et de documentation"
 

	
 
msgid "Type name of user"
 
msgstr "Saisir le nom de l'utilisateur"
 

	
 
msgid "Change owner of this repository."
 
msgstr "Changer le propriétaire de ce dépôt."
 

	
 
msgid "Processed commits"
 
msgstr "Commits traités"
 

	
 
msgid "Processed progress"
 
msgstr "Avancement"
 

	
 
msgid "Reset Statistics"
 
msgstr "Remettre les statistiques à zéro"
 
@@ -2436,96 +2473,99 @@ msgstr ""
 

	
 
msgid "Admin page size"
 
msgstr "Taille de la page d'admin"
 

	
 
msgid ""
 
"Number of items displayed in the admin pages grids before pagination is "
 
"shown."
 
msgstr ""
 
"Nombre d'éléments affichés dans les grilles des pages admin avant "
 
"d'afficher la pagination."
 

	
 
msgid "Icons"
 
msgstr "Icônes"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Afficher l’icône de dépôt public sur les dépôts"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Afficher l’icône de dépôt privé sur les dépôts"
 

	
 
msgid "Show public/private icons next to repository names."
 
msgstr "Afficher l’icône « public/privé » à côté du nom des dépôts."
 

	
 
msgid "Meta Tagging"
 
msgstr "Meta-tagging"
 

	
 
msgid ""
 
"Parses meta tags from the repository description field and turns them "
 
"into colored tags."
 
msgstr ""
 
"Analyser les méta-tags dans le champ de description du dépôt et les "
 
"transformer en tags colorés."
 

	
 
msgid "Stylify recognised meta tags:"
 
msgstr "Styliser les méta-tags reconnus :"
 

	
 
msgid "Add user group"
 
msgstr "Ajouter un groupe d'utilisateurs"
 

	
 
msgid "User Groups"
 
msgstr "Groupes d'utilisateurs"
 

	
 
msgid "Add User Group"
 
msgstr "Ajouter un groupe d'utilisateurs"
 

	
 
msgid "Short, optional description for this user group."
 
msgstr "Description courte pour ce groupe d'utilisateur (optionnel)."
 

	
 
msgid "Active"
 
msgstr "Actif"
 

	
 
msgid "%s user group settings"
 
msgstr "Réglages du groupe d'utilisateurs %s"
 

	
 
msgid "Show Members"
 
msgstr "Afficher les membres"
 

	
 
msgid "User Group: %s"
 
msgstr "Groupe d'utilisateurs : %s"
 

	
 
msgid "Members"
 
msgstr "Membres"
 

	
 
msgid "Confirm to delete this user group: %s"
 
msgstr "Voulez-vous vraiment supprimer ce groupe utilisateur : %s ?"
 

	
 
msgid "Delete this user group"
 
msgstr "Supprimer ce groupe d'utilisateurs"
 

	
 
msgid "No members yet"
 
msgstr "Aucun membre pour l'instant"
 

	
 
msgid "Chosen group members"
 
msgstr "Membres de groupe sélectionnés"
 

	
 
msgid "Available members"
 
msgstr "Membres disponibles"
 

	
 
msgid "User Groups Administration"
 
msgstr "Administration des groupes d'utilisateurs"
 

	
 
msgid "Add user"
 
msgstr "Ajouter un utilisateur"
 

	
 
msgid "Users"
 
msgstr "Utilisateurs"
 

	
 
msgid "Add User"
 
msgstr "Ajouter un utilisateur"
 

	
 
msgid "Password confirmation"
 
msgstr "Confirmation"
 

	
 
msgid "%s user settings"
 
msgstr "Réglages de l'utilisateur %s"
 

	
 
msgid "Emails"
 
msgstr "E-mails"
 

	
 
@@ -3052,190 +3092,202 @@ msgstr "Comparer les révisions"
 

	
 
msgid "Swap"
 
msgstr "Échanger"
 

	
 
msgid "Compare revisions, branches, bookmarks, or tags."
 
msgstr "Comparer les révisions, les branches, les marque-pages ou les tags."
 

	
 
msgid "Showing %s commit"
 
msgid_plural "Showing %s commits"
 
msgstr[0] "Affichage de %s commit"
 
msgstr[1] "Affichage de %s commits"
 

	
 
msgid "Show full diff"
 
msgstr "Afficher le diff complet"
 

	
 
msgid "Public repository"
 
msgstr "Dépôt public"
 

	
 
msgid "Repository creation in progress..."
 
msgstr "Création du dépôt en cours..."
 

	
 
msgid "No changesets yet"
 
msgstr "Dépôt vide"
 

	
 
msgid "Subscribe to %s rss feed"
 
msgstr "S’abonner au flux RSS de %s"
 

	
 
msgid "Subscribe to %s atom feed"
 
msgstr "S’abonner au flux ATOM de %s"
 

	
 
msgid "Creating"
 
msgstr "En cours de création"
 

	
 
msgid "Mention in Comment on Changeset \"%s\""
 
msgstr "Mention dans le commentaire sur le changeset « %s »"
 

	
 
msgid "Comment on Changeset \"%s\""
 
msgstr "Commentaire sur le changeset « %s »"
 

	
 
msgid "Changeset on"
 
msgstr "Changeset sur"
 

	
 
msgid "branch"
 
msgstr "branche"
 

	
 
msgid "by"
 
msgstr "par"
 

	
 
msgid "View Comment"
 
msgstr "Afficher le commentaire"
 

	
 
msgid "Status change:"
 
msgstr "Changement de statut :"
 

	
 
msgid "The pull request has been closed."
 
msgstr "La requête de pull a été fermée."
 

	
 
msgid "Message"
 
msgstr "Message"
 

	
 
msgid "Hello %s"
 
msgstr "Bonjour %s"
 

	
 
msgid "We have received a request to reset the password for your account."
 
msgstr ""
 
"Nous avons reçu une demande de réinitialisation du mot de passe de votre "
 
"compte."
 

	
 
msgid ""
 
"This account is however managed outside this system and the password "
 
"cannot be changed here."
 
msgstr ""
 
"Cependant, ce compte est géré hors de ce système et le mot de passe ne "
 
"peut pas être changé ici."
 

	
 
msgid "To set a new password, click the following link"
 
msgstr "Pour choisir un nouveau mot de passe, cliquez sur le lien suivant"
 

	
 
msgid ""
 
"Should you not be able to use the link above, please type the following "
 
"code into the password reset form"
 
msgstr ""
 
"Si vous ne pouvez pas utiliser le lien ci-dessus, merci de saisir le code "
 
"suivant dans le formulaire de réinitialisation de mot de passe"
 

	
 
msgid ""
 
"If it weren't you who requested the password reset, just disregard this "
 
"message."
 
msgstr ""
 
"Si vous n'avez pas demandé la réinitialisation de votre mot de passe, ne "
 
"tenez pas compte de ce message."
 

	
 
msgid "Mention on Pull Request %s \"%s\" by %s"
 
msgstr "Mention sur la requête de pull %s « %s » par %s"
 

	
 
msgid "Added as Reviewer of Pull Request %s \"%s\" by %s"
 
msgstr "Ajouté comme relecteur de la requête de pull %s « %s » par %s"
 

	
 
msgid "Pull request"
 
msgstr "Requête de pull"
 

	
 
msgid "from"
 
msgstr "depuis"
 

	
 
msgid "to"
 
msgstr "vers"
 

	
 
msgid "Mention in Comment on Pull Request %s \"%s\""
 
msgstr "Mention dans le commentaire sur la requête de pull %s « %s »"
 

	
 
msgid "Pull Request %s \"%s\" Closed"
 
msgstr "Requête de pull %s « %s » fermée"
 

	
 
msgid "Comment on Pull Request %s \"%s\""
 
msgstr "Commentaire sur la requête de pull %s « %s »"
 

	
 
msgid "New User Registration"
 
msgstr "Nouvel enregistrement d'utilisateur"
 

	
 
msgid "Full Name"
 
msgstr "Nom complet"
 

	
 
msgid "View User Profile"
 
msgstr "Afficher le profil utilisateur"
 

	
 
msgid "%s File side-by-side diff"
 
msgstr "Diff côte-à-côte de fichier pour %s"
 

	
 
msgid "File diff"
 
msgstr "Diff de fichier"
 

	
 
msgid "%s File Diff"
 
msgstr "Diff de fichier pour %s"
 

	
 
msgid "%s Files"
 
msgstr "Fichiers de %s"
 

	
 
msgid "%s Files Add"
 
msgstr "Ajout de fichiers pour %s"
 

	
 
msgid "Add New File"
 
msgstr "Ajouter un nouveau fichier"
 

	
 
msgid "Location"
 
msgstr "Emplacement"
 

	
 
msgid "Enter filename..."
 
msgstr "Saisir le nom du fichier..."
 

	
 
msgid "or"
 
msgstr "ou"
 

	
 
msgid "Upload File"
 
msgstr "Uploader un fichier"
 
msgstr "Téléverser un fichier"
 

	
 
msgid "Create New File"
 
msgstr "Créer un nouveau fichier"
 

	
 
msgid "New file type"
 
msgstr "Type du nouveau fichier"
 

	
 
msgid "Commit Message"
 
msgstr "Message de commit"
 

	
 
msgid "Commit Changes"
 
msgstr "Commiter les changements"
 

	
 
msgid "Search File List"
 
msgstr "Rechercher dans la liste des fichiers"
 

	
 
msgid "Loading file list..."
 
msgstr "Chargement de la liste des fichiers…"
 

	
 
msgid "Size"
 
msgstr "Taille"
 

	
 
msgid "Last Revision"
 
msgstr "Dernière révision"
 

	
 
msgid "Last Modified"
 
msgstr "Dernière modification"
 

	
 
msgid "Last Committer"
 
msgstr "Dernier commiteur"
 

	
 
msgid "%s Files Delete"
 
msgstr "Suppression de fichiers pour %s"
 

	
 
msgid "Delete file"
 
msgstr "Supprimer le fichier"
 

	
 
msgid "%s File Edit"
 
msgstr "Édition de fichier pour %s"
 

	
 
msgid "Edit file"
 
msgstr "Éditer le fichier"
 

	
 
msgid "Show Annotation"
 
msgstr "Afficher l'annotation"
 

	
 
msgid "Download as Raw"
 
msgstr "Télécharger au format brut"
 
@@ -3581,93 +3633,96 @@ msgstr "Flux RSS pour %s"
 
msgid "Enable"
 
msgstr "Activer"
 

	
 
msgid "Stats gathered: "
 
msgstr "Statistiques obtenues : "
 

	
 
msgid "files"
 
msgstr "Fichiers"
 

	
 
msgid "Show more"
 
msgstr "Afficher plus"
 

	
 
msgid "commits"
 
msgstr "commits"
 

	
 
msgid "files added"
 
msgstr "fichiers ajoutés"
 

	
 
msgid "files changed"
 
msgstr "fichiers modifiés"
 

	
 
msgid "files removed"
 
msgstr "fichiers supprimés"
 

	
 
msgid "commit"
 
msgstr "commit"
 

	
 
msgid "file added"
 
msgstr "fichier ajouté"
 

	
 
msgid "file changed"
 
msgstr "fichié modifié"
 

	
 
msgid "file removed"
 
msgstr "fichier supprimé"
 

	
 
msgid "%s Summary"
 
msgstr "Résumé de %s"
 

	
 
msgid "Fork of"
 
msgstr "Fork de"
 

	
 
msgid "Clone from"
 
msgstr "Cloner depuis"
 

	
 
msgid "Clone URL"
 
msgstr "URL de clone"
 

	
 
msgid "Use Name"
 
msgstr "Utiliser le nom"
 

	
 
msgid "Trending files"
 
msgstr "Populaires"
 

	
 
msgid "Download"
 
msgstr "Téléchargements"
 
msgstr "Télécharger"
 

	
 
msgid "There are no downloads yet"
 
msgstr "Il n’y a pas encore de téléchargements proposés"
 

	
 
msgid "Downloads are disabled for this repository"
 
msgstr "Les téléchargements sont désactivés pour ce dépôt"
 

	
 
msgid "Download as zip"
 
msgstr "Télécharger en ZIP"
 

	
 
msgid "Check this to download archive with subrepos"
 
msgstr ""
 
"Télécharger une archive contenant également les sous-dépôts éventuels"
 

	
 
msgid "With subrepos"
 
msgstr "Avec les sous-dépôts"
 

	
 
msgid "Feed"
 
msgstr "Flux"
 

	
 
msgid "Latest Changes"
 
msgstr "Derniers changements"
 

	
 
msgid "Quick Start"
 
msgstr "Démarrage rapide"
 

	
 
msgid "Add or upload files directly via Kallithea"
 
msgstr "Ajouter ou téléverser des fichiers directement via Kallithea"
 

	
 
msgid "Push new repository"
 
msgstr "Pusher le nouveau dépôt"
 

	
 
msgid "Existing repository?"
 
msgstr "Le dépôt existe déjà ?"
 

	
 
msgid "Readme file from revision %s:%s"
 
msgstr "Fichier Lisez-moi de la revision %s:%s"
 

	
 
msgid "Download %s as %s"
 
msgstr "Télécharge %s comme %s"
kallithea/i18n/ja/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -378,102 +378,96 @@ 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 "Updated application settings"
 
msgstr "アプリケーション設定を更新しました"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "表示設定を更新しました"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "表示設定の更新中にエラーが発生しました"
 

	
 
msgid "Please enter email address"
 
msgstr "メールアドレスを入力してください"
 

	
 
msgid "Send email task created"
 
msgstr "メール送信タスクを作成しました"
 

	
 
msgid "Added new hook"
 
msgstr "新しいフックを追加しました"
 

	
 
msgid "Updated hooks"
 
msgstr "フックを更新しました"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "フックの作成中にエラーが発生しました"
 
@@ -1476,170 +1470,148 @@ msgstr "トップレベルリポジトリ数"
 

	
 
msgid "Clone remote repository"
 
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 ""
 
"Default revision for files page, downloads, full text search index and "
 
"readme generation"
 
msgstr ""
 
"ファイルページ、ダウンロード、全文検索インデックス、READMEなどの生成に使う"
 
"デフォルトのリビジョン"
 

	
 
msgid "Creating repository"
 
msgstr "リポジトリを作成中"
 

	
 
msgid ""
 
"Repository \"%(repo_name)s\" is being created, you will be redirected "
 
"when this process is finished.repo_name"
 
msgstr ""
 
"リポジトリ \"%(repo_name)s\" を作成中です。処理を完了したらリダイレクトし"
 
"ます。"
 

	
 
msgid ""
 
"We're sorry but error occurred during this operation. Please check your "
 
"Kallithea server logs, or contact administrator."
 
msgstr ""
 
"恐れいります。操作中にエラーが発生しました。 Kallithea サーバのログを"
 
"チェックするか、管理者に問い合わせてください。"
 

	
 
msgid "%s Repository Settings"
 
msgstr "%s リポジトリ設定"
 

	
 
msgid "Extra Fields"
 
msgstr "拡張フィールド"
 

	
 
msgid "Caches"
 
msgstr "キャッシュ"
 

	
 
msgid "Remote"
 
msgstr "リモート"
 

	
 
msgid "Statistics"
 
msgstr "統計"
 

	
 
msgid "Parent"
 
msgstr "Parent"
 

	
 
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 個のフォークがあります"
 

	
 
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 "Label"
 
msgstr "ラベル"
 

	
 
msgid "Key"
 
msgstr "キー"
 

	
 
msgid "Active"
 
msgstr "アクティブ"
 

	
 
msgid "Label"
 
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 "This repository does not have a remote repository URL."
 
msgstr "このリポジトリにリモートURLは設定されていません"
 

	
 
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 ""
 
"通常、リポジトリの名前を変更したり、別のグループに移動すると、リポジトリの"
 
"URLが変わります。\n"
 
"上のURLを使えば、常にリポジトリにアクセスできます。\n"
 
"この機能は、CIを使っている場合や、3rd pirtyのサービス向けにURLを固定化した"
 
@@ -1877,96 +1849,99 @@ msgstr "追加のカスタムフィールドをリポジトリ毎に保存することを許可します。"
 
msgid "Show Kallithea version"
 
msgstr "Kallitheaのバージョンを表示する"
 

	
 
msgid ""
 
"Shows or hides a version number of Kallithea displayed in the footer."
 
msgstr ""
 
"フッターに表示されるKallitheaのバージョン番号の表示、非表示を設定します。"
 

	
 
msgid ""
 
"Number of items displayed in the admin pages grids before pagination is "
 
"shown."
 
msgstr "管理ページで、ページ分割しないでグリッドに表示する項目の数"
 

	
 
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 ""
 
"Parses meta tags from the repository description field and turns them "
 
"into colored tags."
 
msgstr "リポジトリの説明のメタタグを解析して色つきのタグに変換します。"
 

	
 
msgid "Stylify recognised meta tags:"
 
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 "%s user group settings"
 
msgstr "%s ユーザーグループ設定"
 

	
 
msgid "Show Members"
 
msgstr "メンバーを表示"
 

	
 
msgid "User Group: %s"
 
msgstr "ユーサーグループ: %s"
 

	
 
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 "%s user settings"
 
msgstr "%s ユーザー設定"
 

	
 
msgid "Emails"
 
msgstr "メールアドレス"
 

	
kallithea/i18n/lb/LC_MESSAGES/kallithea.po
Show inline comments
 
# Copyright (C) 2020 Various authors, licensing as GPLv3
 
# This file is distributed under the same license as the Kallithea project.
 

	
 
msgid ""
 
msgstr ""
 
"Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
 
"Language: lb\n"
 
"MIME-Version: 1.0\n"
 
"Content-Type: text/plain; charset=UTF-8\n"
 
"Content-Transfer-Encoding: 8bit\n"
 
"Plural-Forms: nplurals=2; plural=n != 1;\n"
 

	
 
msgid "There are no changesets yet"
 
msgstr "Et sinn nach keng Ännerungen do"
 

	
 
msgid "None"
 
msgstr "Keng"
 

	
 
msgid "(closed)"
 
msgstr "(Zou)"
 

	
 
msgid "Show whitespace"
 
msgstr "Leerzeechen uweisen"
 

	
 
msgid "Ignore whitespace"
 
msgstr "Leerzechen ignoréieren"
 

	
 
msgid "No permission to change status"
 
msgstr "Keng Erlabnis fir den Status ze änneren"
 

	
 
msgid "No response"
 
msgstr "Keng Äntwert"
 

	
 
msgid "Unknown error"
 
msgstr "Onbekannten Feeler"
 

	
 
msgid "Click here to add new file"
 
msgstr "Klick hei fir eng Datei bäizefügen"
 

	
 
msgid "There are no files yet."
 
msgstr "Et sinn nach keng Dateien do."
 

	
 
msgid "No changes"
 
msgstr "Keng Ännerungen"
 

	
 
msgid "Added file via Kallithea"
 
msgstr "Datei iwwert Kallithea bäifügen"
 

	
 
msgid "No content"
 
msgstr "Keen Contenu"
 

	
 
msgid "No filename"
 
msgstr "Keen Dateinumm"
 

	
 
msgid "Downloads disabled"
 
msgstr "Eroflueden ausgeschalt"
 

	
 
msgid "Empty repository"
 
msgstr "Eidel Quell"
 

	
 
msgid "Changesets"
 
msgstr "Ännerungen"
 

	
 
msgid "Branches"
 
msgstr "Äascht"
 

	
 
msgid "Groups"
 
msgstr "Gruppen"
 

	
 
msgid "Repositories"
 
msgstr "Quellen"
 

	
 
msgid "Branch"
 
msgstr "Aascht"
 

	
 
msgid "Bookmark"
 
msgstr "Lieszeechen"
 

	
 
msgid "Public Journal"
 
msgstr "Ëffentleche Protokoll"
 

	
 
msgid "Journal"
 
msgstr "Protokoll"
 

	
 
msgid "You have successfully registered with %s"
 
msgstr "Dir sidd erfollegräich registréiert mat %s"
 

	
 
msgid "Successfully updated password"
 
msgstr "Passwuert erfollegräich erneiert"
 

	
 
msgid "%s (closed)"
 
msgstr "%s (Zou)"
 

	
 
msgid "Changeset"
 
msgstr "Ännerung"
 

	
 
msgid "Special"
 
msgstr "Spezial"
 

	
 
msgid "Bookmarks"
 
msgstr "Lieszeechen"
 

	
 
msgid "No description"
 
msgstr "Keng Beschreiwung"
 

	
 
msgid "No data ready yet"
 
msgstr "Daten sinn nach net prett"
 

	
 
msgid "Statistics are disabled for this repository"
 
msgstr "Statistike si fir des Quell ausgeschalt"
 

	
 
msgid "Forever"
 
msgstr "Éiweg"
 

	
 
msgid "5 minutes"
 
msgstr "5 Minutten"
 

	
 
msgid "1 hour"
 
msgstr "1 Stonn"
 

	
 
msgid "1 day"
 
msgstr "1 Dag"
 

	
 
msgid "1 month"
 
msgstr "1 Mount"
 

	
 
msgid "Lifetime"
 
msgstr "Liewenszäit"
 

	
 
msgid "Unmodified"
 
msgstr "Onmodifizéiert"
 

	
 
msgid "SSH key %s successfully added"
 
msgstr "SSH Schlëssel %s erfollegräich bäigefüügt"
 

	
 
msgid "SSH key successfully deleted"
 
msgstr "SSH Schlëssel erfollegräich geläscht"
 

	
 
msgid "Read"
 
msgstr "Liesen"
 

	
 
msgid "Write"
 
msgstr "Schreiwen"
 

	
 
msgid "Admin"
 
msgstr "Administrateur"
 

	
 
msgid "Disabled"
 
msgstr "Ausgeschalt"
 

	
 
msgid "Enabled"
 
msgstr "Aktivéiert"
 

	
 
msgid "Created repository %s"
 
msgstr "Quell %s erstallt"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Quell %s geläscht"
 

	
 
msgid "Nothing"
 
msgstr "Näischt"
 

	
 
msgid "Please enter email address"
 
msgstr "Wannechgelift E-Mail-Adress afügen"
 

	
 
msgid "SSH access is disabled."
 
msgstr "SSH Accès ass ausgeschalt."
 

	
 
msgid "Binary file"
 
msgstr "Binär Datei"
 

	
 
msgid "%d year"
 
msgid_plural "%d years"
 
msgstr[0] "%d Joer"
 
msgstr[1] "%d Joer"
 

	
 
msgid "%d month"
 
msgid_plural "%d months"
 
msgstr[0] "%d Mount"
 
msgstr[1] "%d Méint"
 

	
 
msgid "%d day"
 
msgid_plural "%d days"
 
msgstr[0] "%d Dag"
 
msgstr[1] "%d Deeg"
 

	
 
msgid "%d hour"
 
msgid_plural "%d hours"
 
msgstr[0] "%d Stonn"
 
msgstr[1] "%d Stonnen"
 

	
 
msgid "%d minute"
 
msgid_plural "%d minutes"
 
msgstr[0] "%d Minutt"
 
msgstr[1] "%d Minutten"
 

	
 
msgid "%d second"
 
msgid_plural "%d seconds"
 
msgstr[0] "%d Sekonn"
 
msgstr[1] "%d Sekonnen"
 

	
 
msgid "There are no gists yet"
 
msgstr "Et sinn nach keng Gists do"
 

	
 
msgid "There are no changes yet"
 
msgstr "Et sinn nach keng Ännerungen do"
 

	
 
msgid "Close"
 
msgstr "(Zou)"
 

	
 
msgid "No changesets"
 
msgstr "Keng Ännerungen"
 

	
 
msgid "No changesets yet"
 
msgstr "Nach keng Ännerungen do"
 

	
 
msgid "There are no forks yet"
 
msgstr "Et sinn nach keng Ofzweigungen do"
 

	
 
msgid "Closed"
 
msgstr "(Zou)"
 

	
 
msgid "There are no downloads yet"
 
msgstr "Et sinn nach keng Erofluedungen do"
kallithea/i18n/nb_NO/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -880,192 +880,192 @@ msgstr "Synlig"
 

	
 
msgid "Add repos"
 
msgstr "Legg til pakkebrønner"
 

	
 
msgid "Add/Edit groups"
 
msgstr "Legg til/rediger grupper"
 

	
 
msgid "User/User Group"
 
msgstr "Bruker/brukergruppe"
 

	
 
msgid "Default"
 
msgstr "Forvalg"
 

	
 
msgid "Revoke"
 
msgstr "Tilbakekall"
 

	
 
msgid "Add new"
 
msgstr "Legg til ny"
 

	
 
msgid "Both"
 
msgstr "Begge"
 

	
 
msgid "Remove this group"
 
msgstr "Fjern denne gruppen"
 

	
 
msgid "Confirm to delete this group"
 
msgstr "Bekreft sletting av denne gruppen"
 

	
 
msgid "Repository group %s"
 
msgstr "Pakkebrønnsgruppe %s"
 

	
 
msgid "Extra Fields"
 
msgstr "Ekstra felter"
 

	
 
msgid "Statistics"
 
msgstr "Statistikk"
 

	
 
msgid "Set"
 
msgstr "Sett"
 

	
 
msgid "This repository has %s fork"
 
msgid_plural "This repository has %s forks"
 
msgstr[0] "Denne pakkebrønnen har %s forgrening"
 
msgstr[1] "Denne pakkebrønnen har %s forgreninger"
 

	
 
msgid "Delete forks"
 
msgstr "Slett forgreninger"
 

	
 
msgid "Label"
 
msgstr "Etikett"
 

	
 
msgid "Key"
 
msgstr "Nøkkel"
 

	
 
msgid "Active"
 
msgstr "Aktiv"
 

	
 
msgid "Label"
 
msgstr "Etikett"
 

	
 
msgid "Confirm to delete this field: %s"
 
msgstr "Bekreft sletting av dette feltet: %s"
 

	
 
msgid "New field key"
 
msgstr "Ny feltnøkkel"
 

	
 
msgid "New field label"
 
msgstr "Ny feltetikett"
 

	
 
msgid "Enter short label"
 
msgstr "Skriv inn kort etikett"
 

	
 
msgid "New field description"
 
msgstr "Ny feltbeskrivelse"
 

	
 
msgid "Enter description of a field"
 
msgstr "Skriv inn beskrivelse for et felt"
 

	
 
msgid "Extra fields are disabled."
 
msgstr "Ekstra felter avskrudd."
 

	
 
msgid "Private Repository"
 
msgstr "Privat pakkebrønn"
 

	
 
msgid "Fork of repository"
 
msgstr "Forgrening av pakkebrønn"
 

	
 
msgid "Type name of user"
 
msgstr "Skriv inn brukerens navn"
 

	
 
msgid "Processed commits"
 
msgstr "Behandlede innsendelser"
 

	
 
msgid "Processed progress"
 
msgstr "Behandlingsframdrift"
 

	
 
msgid "Reset Statistics"
 
msgstr "Tilbakestill statistikk"
 

	
 
msgid "Settings Administration"
 
msgstr "Innstillingsadministrasjon"
 

	
 
msgid "VCS"
 
msgstr "VKS"
 

	
 
msgid "System Info"
 
msgstr "Systeminfo"
 

	
 
msgid "Send test email to"
 
msgstr "Send test-e-post til"
 

	
 
msgid "Send"
 
msgstr "Send"
 

	
 
msgid "Save Settings"
 
msgstr "Lagre innstillinger"
 

	
 
msgid "Python version"
 
msgstr "Python-versjon"
 

	
 
msgid "Platform"
 
msgstr "Plattform"
 

	
 
msgid "Git version"
 
msgstr "Git-versjon"
 

	
 
msgid "Git path"
 
msgstr "Git-sti"
 

	
 
msgid "Python Packages"
 
msgstr "Python-pakker"
 

	
 
msgid "General"
 
msgstr "Generelt"
 

	
 
msgid "Show user Gravatars"
 
msgstr "Vis bruker-Gravatarer"
 

	
 
msgid "Add user group"
 
msgstr "Legg til brukergruppe"
 

	
 
msgid "User Groups"
 
msgstr "Brukergrupper"
 

	
 
msgid "Add User Group"
 
msgstr "Legg til brukergruppe"
 

	
 
msgid "Active"
 
msgstr "Aktiv"
 

	
 
msgid "%s user group settings"
 
msgstr "%s brukergruppeinnstillinger"
 

	
 
msgid "Show Members"
 
msgstr "Vis medlemmer"
 

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

	
 
msgid "Members"
 
msgstr "Medlemmer"
 

	
 
msgid "Delete this user group"
 
msgstr "Slett denne brukergruppen"
 

	
 
msgid "No members yet"
 
msgstr "Ingen medlemmer enda"
 

	
 
msgid "Chosen group members"
 
msgstr "Valgte gruppemedlemmer"
 

	
 
msgid "Available members"
 
msgstr "Tilgjengelige medlemmer"
 

	
 
msgid "User Groups Administration"
 
msgstr "Brukergruppeadministrasjon"
 

	
 
msgid "Add user"
 
msgstr "Legg til bruker"
 

	
 
msgid "Users"
 
msgstr "Brukere"
 

	
 
msgid "Add User"
 
msgstr "Legg til bruker"
 

	
 
msgid "Password confirmation"
 
msgstr "Passordbekreftelse"
 

	
 
msgid "%s user settings"
 
msgstr "%s brukerinnstillinger"
 

	
 
msgid "Emails"
 
msgstr "E-poster"
 

	
 
msgid "User: %s"
 
msgstr "Bruker: %s"
 

	
kallithea/i18n/pl/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -351,102 +351,96 @@ msgstr "Repozytorium %s zostało pomyślnie zaktualizowane"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Wystąpił błąd podczas aktualizacji repozytorium %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Oderwane rozgałęzienie %s"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Usunięte rozgałęzienia %s"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Usunięte repozytorium %s"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr ""
 
"Nie można usunąć repozytorium %s nadal zawiera załączniki rozgałęzienia"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Wystąpił błąd podczas usuwania %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Uprawnienia repozytorium zostały zaktualizowane"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Wystąpił błąd podczas tworzenia pola: %r"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Wystąpił błąd podczas usuwania pola"
 

	
 
msgid "-- Not a fork --"
 
msgstr "-- Brak rozgałęzienia --"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "Zaktualizowano widoczność stron w publicznym dzienniku"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr ""
 
"Wystąpił błąd podczas ustawiania tego repozytorium w dzienniku publicznym"
 

	
 
msgid "Nothing"
 
msgstr "Brak"
 

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "Oznaczono %s repo jako rozwidlenie %s"
 

	
 
msgid "An error occurred during this operation"
 
msgstr "Wystąpił błąd podczas tej operacji"
 

	
 
msgid "Cache invalidation successful"
 
msgstr "Cache wyczyszczony poprawnie"
 

	
 
msgid "An error occurred during cache invalidation"
 
msgstr "Wystąpił błąd podczas unieważniania cache"
 

	
 
msgid "Pulled from remote location"
 
msgstr "Pobieranie z lokalizacji zdalnej"
 

	
 
msgid "An error occurred during pull from remote location"
 
msgstr "Wystąpił błąd podczas pobierania z lokalizacji zdalnej"
 

	
 
msgid "An error occurred during deletion of repository stats"
 
msgstr "Wystąpił błąd podczas usuwania z repozytorium statystyk"
 

	
 
msgid "Updated VCS settings"
 
msgstr "Aktualizacja ustawień VCS"
 

	
 
msgid "Error occurred while updating application settings"
 
msgstr "Wystąpił błąd podczas aktualizacji ustawień aplikacji"
 

	
 
msgid "Repositories successfully rescanned. Added: %s. Removed: %s."
 
msgstr ""
 
"Repozytoria z powodzeniem zostały ponownie zeskanowane dodano: %s, "
 
"usunięto: %s."
 

	
 
msgid "Invalidated %s repositories"
 
msgstr "Unieważnione %s repozytoria"
 

	
 
msgid "Updated application settings"
 
msgstr "Aktualizacja ustawień aplikacji"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Aktualizacja ustawień wizualizacji"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "Wystąpił błąd podczas aktualizacji ustawień wizualizacji"
 

	
 
msgid "Please enter email address"
 
msgstr "Proszę podać adres email"
 

	
 
msgid "Hook already exists"
 
msgstr "Hook już istnieje"
 

	
 
msgid "Added new hook"
 
msgstr "Dodano nowy hook"
 

	
 
msgid "Updated hooks"
 
msgstr "Aktualizacja hooku"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Wystąpił błąd podczas tworzenia hooku"
 

	
 
msgid "Whoosh reindex task scheduled"
 
@@ -1250,200 +1244,197 @@ msgid_plural "Confirm to delete this gro
 
msgstr[0] "Potwierdź żeby usunąć grupę %s wraz z %s repozytorium"
 
msgstr[1] "Potwierdź żeby usunąć grupę %s wraz z %s repozytoriami"
 
msgstr[2] "Potwierdź żeby usunąć grupę %s wraz z %s repozytoriami"
 

	
 
msgid "Delete this repository group"
 
msgstr "Usuń tę grupę repozytoriów"
 

	
 
msgid "Add new"
 
msgstr "Dodaj nowe"
 

	
 
msgid "Both"
 
msgstr "Oba"
 

	
 
msgid ""
 
"Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr ""
 
"Powinna być krótka i na temat. Użyj pliku README dla dłuższych opisów."
 

	
 
msgid "Optionally select a group to put this repository into."
 
msgstr "Opcjonalnie wybierz grupę do wprowadzenia tego repozytorium."
 

	
 
msgid "Type of repository to create."
 
msgstr "Rodzaj repozytorium do stworzenia."
 

	
 
msgid "Landing revision"
 
msgstr "Docelowa rewizja"
 

	
 
msgid "Remote"
 
msgstr "Zdalnie"
 

	
 
msgid "Statistics"
 
msgstr "Statystyki"
 

	
 
msgid "Set"
 
msgstr "Ustaw"
 

	
 
msgid "Remove from public journal"
 
msgstr "Usuń z dziennika publicznego"
 

	
 
msgid "Confirm to delete this repository: %s"
 
msgstr "Potwierdź usunięcie repozytorium: %s"
 

	
 
msgid "Detach forks"
 
msgstr "Ustaw jako rozwidlenie"
 

	
 
msgid "Delete forks"
 
msgstr "Usuń rozwidlenie"
 

	
 
msgid "Prefix"
 
msgstr "Prefiks"
 

	
 
msgid "Key"
 
msgstr "Klucz"
 

	
 
msgid "Active"
 
msgstr "Aktywny"
 

	
 
msgid "Confirm to delete this field: %s"
 
msgstr "Potwierdź, aby usunąć to pole: %s"
 

	
 
msgid "New field key"
 
msgstr "Nowe pole klucza"
 

	
 
msgid "New field label"
 
msgstr "Nowa etykieta pola"
 

	
 
msgid "Enter short label"
 
msgstr "Wpisz krótką etykietę"
 

	
 
msgid "New field description"
 
msgstr "Nowy opis pola"
 

	
 
msgid "Enter description of a field"
 
msgstr "Wprowadź opis pola"
 

	
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr "Wersja domyślna dla plików stronicowania, pobierania plików, readme"
 

	
 
msgid "Change owner of this repository."
 
msgstr "Zmiana właściciela tego repozytorium."
 

	
 
msgid "Hooks"
 
msgstr "Aktualizacja"
 

	
 
msgid "Send"
 
msgstr "Wyślij"
 

	
 
msgid "Site branding"
 
msgstr "Nazwa strony"
 

	
 
msgid "HTTP authentication realm"
 
msgstr "Sfera uwierzytelniania HTTP"
 

	
 
msgid "Failed to remove hook"
 
msgstr "Nie udało się usunąć hooka"
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Unieważnia cache dla wszystkich repozytoriów"
 

	
 
msgid "Index build option"
 
msgstr "Opcja odbudowy indeksowania"
 

	
 
msgid "Build from scratch"
 
msgstr "Buduj od podstaw"
 

	
 
msgid "Reindex"
 
msgstr "Indeksuj ponownie"
 

	
 
msgid "Show repository size after push"
 
msgstr "Pokaż rozmiar repozytorium po wysłaniu zmian"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "Aktualizacja repozytorium po wysłaniu zmian (aktualizacja hg)"
 

	
 
msgid "Enable largefiles extension"
 
msgstr "Rozszerzenia dużych plików"
 

	
 
msgid "Enable hgsubversion extension"
 
msgstr "Rozszerzenia hgsubversion"
 

	
 
msgid ""
 
"Click to unlock. You must restart Kallithea in order to make this setting "
 
"take effect."
 
msgstr ""
 
"Kliknij, aby odblokować. Musisz ponownie uruchomić Kallithea żeby "
 
"wprowadzić to ustawienie w życie."
 

	
 
msgid "General"
 
msgstr "Główne"
 

	
 
msgid "Use repository extra fields"
 
msgstr "Używaj w repozytorium dodatkowych pól"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr ""
 
"Umożliwia przechowywanie dodatkowych niestandardowych pól w repozytorium."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Pokaż wersję Kallithea"
 

	
 
msgid "Icons"
 
msgstr "Ikony"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Pokazuj w publicznym repo ikonę w repozytoriach"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Pokazuj w prywatnym repo ikonę w repozytoriach"
 

	
 
msgid "Add user group"
 
msgstr "Dodaj grupę użytkowników"
 

	
 
msgid "Active"
 
msgstr "Aktywny"
 

	
 
msgid "Members"
 
msgstr "Użytkownicy"
 

	
 
msgid "Confirm to delete this user group: %s"
 
msgstr "Potwierdź usunięcie grupy użytkowników: %s"
 

	
 
msgid "No members yet"
 
msgstr "Nie ma jeszcze żadnego użytkownika"
 

	
 
msgid "Chosen group members"
 
msgstr "Wybrane grupy użytkowników"
 

	
 
msgid "Available members"
 
msgstr "Dostępni użytkownicy"
 

	
 
msgid "Add user"
 
msgstr "Dodaj użytkownika"
 

	
 
msgid "Users"
 
msgstr "Użytkownicy"
 

	
 
msgid "Password confirmation"
 
msgstr "Potwierdzenie hasła"
 

	
 
msgid "Confirm to delete this user: %s"
 
msgstr "Potwierdź usunięcie tego użytkownika: %s"
 

	
 
msgid "New password confirmation"
 
msgstr "Potwierdzenie nowego hasła"
 

	
 
msgid "Server instance: %s"
 
msgstr "Wystąpienia serwera: %s"
 

	
 
msgid "Mercurial repository"
 
msgstr "Repozytorium mercurial"
 

	
 
msgid "Git repository"
 
msgstr "Repozytorium git"
 

	
 
msgid "Summary"
 
msgstr "Podsumowanie"
 

	
 
msgid "Changelog"
 
msgstr "Dziennik zmian"
 

	
 
msgid "Files"
 
msgstr "Pliki"
 

	
kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -261,99 +261,96 @@ msgstr "Ocorreu um erro durante a revocação das permissões"
 
msgid "Error creating repository %s"
 
msgstr "Erro ao criar repositório %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Repositório %s criado de %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Repositório %s bifurcado como %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Repositório %s criado"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Repositório %s atualizado com sucesso"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Ocorreu um erro durante a atualização do repositório %s"
 

	
 
msgid "Deleted %s forks"
 
msgstr "%s bifurcações excluídas"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Repositório %s excluído"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Ocorreu um erro durante a exclusão de %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Permissões do repositório atualizadas"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Ocorreu um erro durante a remoção do campo"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "Atualizada a visibilidade do repositório no diário público"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr "Ocorreu um erro ao ajustar esse repositório no diário público"
 

	
 
msgid "Nothing"
 
msgstr "Nada"
 

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "Marcado repositório %s como bifurcação de %s"
 

	
 
msgid "An error occurred during this operation"
 
msgstr "Ocorreu um erro durante essa operação"
 

	
 
msgid "An error occurred during cache invalidation"
 
msgstr "Ocorreu um erro ao invalidar o cache"
 

	
 
msgid "Pulled from remote location"
 
msgstr "Realizado pull de localização remota"
 

	
 
msgid "An error occurred during pull from remote location"
 
msgstr "Ocorreu um erro ao realizar pull de localização remota"
 

	
 
msgid "An error occurred during deletion of repository stats"
 
msgstr "Ocorreu um erro ao excluir estatísticas de repositório"
 

	
 
msgid "Updated VCS settings"
 
msgstr "Configurações de VCS atualizadas"
 

	
 
msgid "Error occurred while updating application settings"
 
msgstr ""
 
"Ocorreu um erro durante a atualização das configurações da aplicação"
 

	
 
msgid "Updated application settings"
 
msgstr "Configurações da aplicação atualizadas"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Configurações de visualização atualizadas"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr ""
 
"Ocorreu um erro durante a atualização das configurações de visualização"
 

	
 
msgid "Added new hook"
 
msgstr "Adicionado novo gancho"
 

	
 
msgid "Updated hooks"
 
msgstr "Atualizados os ganchos"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Ocorreu um erro durante a criação do hook"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Tarefa de reindexação do whoosh agendada"
 

	
 
msgid "Created user group %s"
 
msgstr "Grupo de usuários %s criado"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr "Ocorreu um erro durante a criação do grupo de usuários %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Grupo de usuários %s atualizado"
 

	
 
msgid "Error occurred during update of user group %s"
 
@@ -904,199 +901,196 @@ msgstr "Configurações"
 

	
 
msgid "Permissions"
 
msgstr "Permissões"
 

	
 
msgid "Created on"
 
msgstr "Criado em"
 

	
 
msgid "Confirm to delete this group: %s with %s repository"
 
msgid_plural "Confirm to delete this group: %s with %s repositories"
 
msgstr[0] "Confirme para excluir este grupo: %s com %s repositório"
 
msgstr[1] "Confirme para excluir este grupo: %s com %s repositórios"
 

	
 
msgid "Add new"
 
msgstr "Adicionar novo"
 

	
 
msgid ""
 
"Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr ""
 
"Seja sucinto e objetivo. Use um arquivo README para descrições mais "
 
"longas."
 

	
 
msgid "Optionally select a group to put this repository into."
 
msgstr "Opcionalmente selecione um grupo no qual colocar esse repositório."
 

	
 
msgid "Type of repository to create."
 
msgstr "Tipo de repositório a criar."
 

	
 
msgid "Landing revision"
 
msgstr "Revisão de pouso"
 

	
 
msgid "Remote"
 
msgstr "Remoto"
 

	
 
msgid "Statistics"
 
msgstr "Estatísticas"
 

	
 
msgid "Remove from public journal"
 
msgstr "Remover do diário público"
 

	
 
msgid "Confirm to delete this repository: %s"
 
msgstr "Confirma excluir esse repositório: %s"
 

	
 
msgid "Detach forks"
 
msgstr "Desassociar bifurcações"
 

	
 
msgid "Delete forks"
 
msgstr "Excluir bifurcações"
 

	
 
msgid "Prefix"
 
msgstr "Prefixo"
 

	
 
msgid "Key"
 
msgstr "Chave"
 

	
 
msgid "Active"
 
msgstr "Ativo"
 

	
 
msgid "Confirm to delete this field: %s"
 
msgstr "Confirme para excluir este campo: %s"
 

	
 
msgid "New field key"
 
msgstr "Próxima chave de campo"
 

	
 
msgid "New field label"
 
msgstr "Próximo rótulo de campo"
 

	
 
msgid "Enter short label"
 
msgstr "Entre com o rótulo curto"
 

	
 
msgid "New field description"
 
msgstr "Nova descrição de campo"
 

	
 
msgid "Enter description of a field"
 
msgstr "Entre com a descrição de um campo"
 

	
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr "Revisão padrão para página de arquivos, downloads, whoosh e readme"
 

	
 
msgid "Change owner of this repository."
 
msgstr "Mudar o dono desse repositório."
 

	
 
msgid "Hooks"
 
msgstr "Ganchos"
 

	
 
msgid "Send"
 
msgstr "Enviar"
 

	
 
msgid "Site branding"
 
msgstr "Marca do site"
 

	
 
msgid "HTTP authentication realm"
 
msgstr "Realm de autenticação HTTP"
 

	
 
msgid "Failed to remove hook"
 
msgstr "Falha ao remover gancho"
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Invalidar o cache para todos os repositórios"
 

	
 
msgid "Index build option"
 
msgstr "Opção de construção do índice"
 

	
 
msgid "Build from scratch"
 
msgstr "Construir do zero"
 

	
 
msgid "Reindex"
 
msgstr "Reindexar"
 

	
 
msgid "Show repository size after push"
 
msgstr "Mostrar tamanho do repositório após o push"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "Atualizar repositório após realizar push (hg update)"
 

	
 
msgid "Enable largefiles extension"
 
msgstr "Habilitar extensão largefiles"
 

	
 
msgid "Enable hgsubversion extension"
 
msgstr "Habilitar extensão hgsubversion"
 

	
 
msgid ""
 
"Click to unlock. You must restart Kallithea in order to make this setting "
 
"take effect."
 
msgstr ""
 
"Clique para destravar. Você deve reiniciar o Kallithea para que esta "
 
"configuração tenha efeito."
 

	
 
msgid "General"
 
msgstr "Geral"
 

	
 
msgid "Use repository extra fields"
 
msgstr "Usar campos extras do repositório"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr "Permite armazenar campos customizados adicionais por repositório."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Mostrar versão do Kallithea"
 

	
 
msgid "Icons"
 
msgstr "Ícones"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Mostrar ícone de repositório público nos repositórios"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Mostrar ícone de repositório privado nos repositórios"
 

	
 
msgid "Add user group"
 
msgstr "Adicionar grupo de usuários"
 

	
 
msgid "Active"
 
msgstr "Ativo"
 

	
 
msgid "Members"
 
msgstr "Membros"
 

	
 
msgid "Confirm to delete this user group: %s"
 
msgstr "Confirme para excluir este grupo de usuário: %s"
 

	
 
msgid "No members yet"
 
msgstr "Nenhum membro ainda"
 

	
 
msgid "Chosen group members"
 
msgstr "Membros escolhidos do grupo"
 

	
 
msgid "Available members"
 
msgstr "Membros disponíveis"
 

	
 
msgid "Add user"
 
msgstr "Adicionar usuário"
 

	
 
msgid "Users"
 
msgstr "Usuários"
 

	
 
msgid "Password confirmation"
 
msgstr "Confirmação de senha"
 

	
 
msgid "Confirm to delete this user: %s"
 
msgstr "Confirma excluir este usuário: %s"
 

	
 
msgid "New password confirmation"
 
msgstr "Confirmação de nova senha"
 

	
 
msgid "Server instance: %s"
 
msgstr "Instância de servidor: %s"
 

	
 
msgid "Mercurial repository"
 
msgstr "Repositório Mercurial"
 

	
 
msgid "Git repository"
 
msgstr "Repositório Git"
 

	
 
msgid "Summary"
 
msgstr "Sumário"
 

	
 
msgid "Changelog"
 
msgstr "Registro de alterações"
 

	
 
msgid "Files"
 
msgstr "Arquivos"
 

	
kallithea/i18n/ru/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -470,102 +470,96 @@ 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 "Field validation error: %s"
 
msgstr "Ошибка валидации поля: %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Произошла ошибка при создании поля: %r"
 

	
 
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 "Пожалуйста, введите адрес электронной почты"
 

	
 
msgid "Send email task created"
 
msgstr "Задача отправки Email создана"
 

	
 
msgid "Hook already exists"
 
msgstr "Хук уже существует"
 

	
 
msgid "Builtin hooks are read-only. Please use another hook name."
 
msgstr ""
 
@@ -752,96 +746,103 @@ msgstr "[отправлено] в"
 
msgid "[committed via Kallithea] into repository"
 
msgstr "[внесены изменения с помощью Kallithea] в репозитории"
 

	
 
msgid "[pulled from remote] into repository"
 
msgstr "[внесены изменения из удалённого репозитория] в репозиторий"
 

	
 
msgid "[pulled] from"
 
msgstr "[внесены изменения] из"
 

	
 
msgid "[started following] repository"
 
msgstr "[подписка] на репозиторий"
 

	
 
msgid "[stopped following] repository"
 
msgstr "[отписка] от репозитория"
 

	
 
msgid " and %s more"
 
msgstr " и на %s больше"
 

	
 
msgid "No files"
 
msgstr "Нет файлов"
 

	
 
msgid "new file"
 
msgstr "новый файл"
 

	
 
msgid "mod"
 
msgstr "изменён"
 

	
 
msgid "del"
 
msgstr "удалён"
 

	
 
msgid "rename"
 
msgstr "переименован"
 

	
 
msgid "chmod"
 
msgstr "chmod"
 

	
 
msgid ""
 
"%s repository is not mapped to db perhaps it was created or renamed from "
 
"the filesystem please run the application again in order to rescan "
 
"repositories"
 
msgstr ""
 
"Репозиторий %s отсутствует в базе данных; возможно, он был создан или "
 
"переименован из файловой системы. Пожалуйста, перезапустите приложение "
 
"для сканирования репозиториев"
 

	
 
msgid "SSH key is missing"
 
msgstr "Отсутствует ключ SSH"
 

	
 
msgid ""
 
"Incorrect SSH key - it must have both a key type and a base64 part, like "
 
"'ssh-rsa ASRNeaZu4FA...xlJp='"
 
msgstr ""
 
"Некорректный ключ SSH — должен присутствовать тип ключа и код base64, "
 
"например 'ssh-rsa ASRNeaZu4FA...xlJp='"
 

	
 
msgid "Incorrect SSH key - it must start with 'ssh-(rsa|dss|ed25519)'"
 
msgstr ""
 
"Некорректный ключ SSH — он должен начинаться с 'ssh-(rsa|dss|ed25519)'"
 

	
 
msgid "Incorrect SSH key - unexpected characters in base64 part %r"
 
msgstr ""
 
"Некорректный ключ SSH — присутствуют некорректные символы в коде base64 %r"
 

	
 
msgid "Incorrect SSH key - failed to decode base64 part %r"
 
msgstr "Некорректный ключ SSH — ошибка декодирования кода base64 %r"
 

	
 
msgid "Incorrect SSH key - base64 part is not %r as claimed but %r"
 
msgstr "Некорректный ключ SSH — код base64 соответствует не %r, а %r"
 

	
 
msgid "%d year"
 
msgid_plural "%d years"
 
msgstr[0] "%d год"
 
msgstr[1] "%d года"
 
msgstr[2] "%d лет"
 

	
 
msgid "%d month"
 
msgid_plural "%d months"
 
msgstr[0] "%d месяц"
 
msgstr[1] "%d месяца"
 
msgstr[2] "%d месяцев"
 

	
 
msgid "%d day"
 
msgid_plural "%d days"
 
msgstr[0] "%d день"
 
msgstr[1] "%d дня"
 
msgstr[2] "%d дней"
 

	
 
msgid "%d hour"
 
msgid_plural "%d hours"
 
msgstr[0] "%d час"
 
msgstr[1] "%d часа"
 
msgstr[2] "%d часов"
 

	
 
msgid "%d minute"
 
msgid_plural "%d minutes"
 
msgstr[0] "%d минута"
 
msgstr[1] "%d минуты"
 
msgstr[2] "%d минут"
 

	
 
msgid "%d second"
 
msgid_plural "%d seconds"
 
msgstr[0] "%d секунда"
 
msgstr[1] "%d секунды"
 
@@ -1030,96 +1031,99 @@ msgstr "Закрыт"
 
msgid ""
 
"%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 
msgstr ""
 
"%(user)s просит вас рассмотреть pull-запрос %(pr_nice_id)s: %(pr_title)s"
 

	
 
msgid "Cannot create empty pull request"
 
msgstr "Невозможно создать пустой pull-запрос"
 

	
 
msgid ""
 
"Cannot create pull request - criss cross merge detected, please merge a "
 
"later %s revision to %s"
 
msgstr ""
 
"Невозможно создать pull-запрос — обнаружено перекрёстное слияние. "
 
"Попробуйте слить более позднюю ревизию %s с %s"
 

	
 
msgid "You are not authorized to create the pull request"
 
msgstr "Недостаточно привилегий для создания pull-запроса"
 

	
 
msgid "Missing changesets since the previous iteration:"
 
msgstr "Отсутствующие ревизии относительно предыдущей итерации:"
 

	
 
msgid "New changesets on %s %s since the previous iteration:"
 
msgstr "Новые наборы изменений в %s %s относительно предыдущей итерации:"
 

	
 
msgid "Ancestor didn't change - diff since previous iteration:"
 
msgstr "Предок не изменился — разница с момента последней итерации:"
 

	
 
msgid ""
 
"This iteration is based on another %s revision and there is no simple "
 
"diff."
 
msgstr ""
 
"Эта итерация основана на другой ревизии %s, простой diff невозможен."
 

	
 
msgid "No changes found on %s %s since previous iteration."
 
msgstr "Нет изменений на %s %s относительно предыдущей итерации."
 

	
 
msgid "Closed, next iteration: %s ."
 
msgstr "Закрыто. Следующая итерация: %s."
 

	
 
msgid "latest tip"
 
msgstr "последняя версия"
 

	
 
msgid "SSH key %r is invalid: %s"
 
msgstr "Ошибка ключа SSH %r: %s"
 

	
 
msgid "SSH key %s is already used by %s"
 
msgstr "Ключ SSH %s уже используется пользователем %s"
 

	
 
msgid "SSH key with fingerprint %r found"
 
msgstr "Найден ключ SSH с отпечатком %r"
 

	
 
msgid "New user registration"
 
msgstr "Регистрация нового пользователя"
 

	
 
msgid ""
 
"You can't remove this user since it is crucial for the entire application"
 
msgstr ""
 
"Вы не можете удалить этого пользователя, поскольку это критично для "
 
"работы всего приложения"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repositories and cannot be removed. Switch "
 
"owners or remove those repositories: %s"
 
msgstr ""
 
"Пользователь \"%s\" всё ещё является владельцем %s репозиториев и поэтому "
 
"не может быть удалён. Смените владельца или удалите эти репозитории: %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repository groups and cannot be removed. Switch "
 
"owners or remove those repository groups: %s"
 
msgstr ""
 
"Пользователь \"%s\" всё ещё является владельцем %s групп репозиториев и "
 
"поэтому не может быть удалён. Смените владельца или удалите данные "
 
"группы: %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s user groups and cannot be removed. Switch "
 
"owners or remove those user groups: %s"
 
msgstr ""
 
"Пользователь \"%s\" всё ещё является владельцем %s групп пользователей и "
 
"поэтому не может быть удалён. Смените владельца или удалите данные "
 
"группы: %s"
 

	
 
msgid "Password reset link"
 
msgstr "Ссылка сброса пароля"
 

	
 
msgid "Password reset notification"
 
msgstr "Уведомление о сбросе пароля"
 

	
 
msgid ""
 
"The password to your account %s has been changed using password reset "
 
"form."
 
msgstr "Пароль к вашему аккаунту %s был изменён через форму сброса пароля."
 

	
 
msgid "Value cannot be an empty list"
 
msgstr "Значение не может быть пустым списком"
 

	
 
msgid "Username \"%(username)s\" already exists"
 
msgstr "Пользователь с именем \"%(username)s\" уже существует"
 
@@ -1942,181 +1946,160 @@ 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 ""
 
"Default revision for files page, downloads, full text search index and "
 
"readme generation"
 
msgstr ""
 
"Ревизия по умолчанию для страницы файлов, загрузки, полнотекстовый "
 
"поисковый индекс и генерация readme"
 

	
 
msgid "%s Creating Repository"
 
msgstr "Создание репозитория %s"
 

	
 
msgid "Creating repository"
 
msgstr "Создание репозитория"
 

	
 
msgid ""
 
"Repository \"%(repo_name)s\" is being created, you will be redirected "
 
"when this process is finished.repo_name"
 
msgstr ""
 
"Репозиторий «%(repo_name)s» создаётся. Вы будете перенаправлены, когда "
 
"процесс завершится."
 

	
 
msgid ""
 
"We're sorry but error occurred during this operation. Please check your "
 
"Kallithea server logs, or contact administrator."
 
msgstr ""
 
"К сожалению, во время данной операции произошла ошибка. Пожалуйста, "
 
"проверьте журнал сервера Kallithea или свяжитесь с администратором."
 

	
 
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 ""
 
"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 ""
 
"Удаляемый репозиторий будет перемещён и скрыт на срок, определяемый "
 
"администратором. Администратор может либо удалить, либо восстановить "
 
"репозиторий."
 

	
 
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 "Label"
 
msgstr "Имя"
 

	
 
msgid "Key"
 
msgstr "Ключ"
 

	
 
msgid "Active"
 
msgstr "Активный"
 

	
 
msgid "Label"
 
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 "Fork of repository"
 
msgstr "Форк репозитория"
 

	
 
msgid "Remote repository URL"
 
msgstr "Ссылка на удалённый репозиторий"
 

	
 
msgid "Pull Changes from Remote Repository"
 
msgstr "Изменения из удалённого репозитория"
 

	
 
msgid "Confirm to pull changes from remote repository."
 
msgstr "Подтвердите применение изменений из удалённого репозитория."
 

	
 
msgid "This repository does not have a remote repository URL."
 
msgstr "Данный репозиторий не имеет URL удалённого репозитория."
 

	
 
msgid "Permanent URL"
 
msgstr "Постоянный URL"
 

	
 
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 "
 
@@ -2500,96 +2483,99 @@ msgstr ""
 

	
 
msgid "Admin page size"
 
msgstr "Размер страницы администратора"
 

	
 
msgid ""
 
"Number of items displayed in the admin pages grids before pagination is "
 
"shown."
 
msgstr ""
 
"Количество элементов в сетке страницы администратора до появления "
 
"нумерации страниц."
 

	
 
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 ""
 
"Parses meta tags from the repository description field and turns them "
 
"into colored tags."
 
msgstr ""
 
"Анализирует мета-теги в поле описания репозитория и отображает их в виде "
 
"цветных тегов."
 

	
 
msgid "Stylify recognised meta tags:"
 
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 "%s user group settings"
 
msgstr "Настройки группы %s"
 

	
 
msgid "Show Members"
 
msgstr "Участники"
 

	
 
msgid "User Group: %s"
 
msgstr "Группа пользователей: %s"
 

	
 
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 "%s user settings"
 
msgstr "Настройки пользователя %s"
 

	
 
msgid "Emails"
 
msgstr "Электронная почта"
 

	
kallithea/i18n/uk/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -458,102 +458,96 @@ msgid "Error occurred during update of r
 
msgstr "Сталася помилка при оновленні репозиторію %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Від'єднано %s forks"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Видалено %s forks"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Видалений репозиторій %s"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Неможливо видалити репозиторій %s, що ще має forks"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Сталася помилка під час видалення %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Права доступів до репозиторіїв оновлено"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Помилка перевірки поля: %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Сталася помилка під час створення поля: %r"
 

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

	
 
msgid "-- Not a fork --"
 
msgstr "-- Не fork --"
 

	
 
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 "Будь ласка, введіть адресу електронної пошти"
 

	
 
msgid "Send email task created"
 
msgstr "Надіслати електронною поштою завдання створено"
 

	
 
msgid "Hook already exists"
 
msgstr "Hook вже існує"
 

	
 
msgid "Builtin hooks are read-only. Please use another hook name."
 
msgstr ""
 
@@ -1099,167 +1093,145 @@ msgstr "Адміністрування Груп Репозиторіїв"
 
msgid "Number of Top-level Repositories"
 
msgstr "Кількість репозиторіїв верхнього рівня"
 

	
 
msgid "Clone remote repository"
 
msgstr "Клонувати віддалений репозиторій"
 

	
 
msgid "Optionally select a group to put this repository into."
 
msgstr "За бажанням виберіть групу, в яку буде розміщено цей репозиторій."
 

	
 
msgid "Type of repository to create."
 
msgstr "Тип сховища для створення."
 

	
 
msgid "Landing revision"
 
msgstr "Цільова редакція"
 

	
 
msgid ""
 
"Default revision for files page, downloads, full text search index and "
 
"readme generation"
 
msgstr ""
 
"Стандартна редакція для файлів сторінок, завантажень, повнотекстового "
 
"індексу пошуку та генерації readme"
 

	
 
msgid "%s Creating Repository"
 
msgstr "%s створення репозиторію"
 

	
 
msgid "Creating repository"
 
msgstr "Створення репозиторію"
 

	
 
msgid ""
 
"Repository \"%(repo_name)s\" is being created, you will be redirected "
 
"when this process is finished.repo_name"
 
msgstr ""
 
"Репозиторій \"%(repo_name)s\" створюється, ви будете переспрямовані, коли "
 
"цей процес буде завершено.repo_name"
 

	
 
msgid ""
 
"We're sorry but error occurred during this operation. Please check your "
 
"Kallithea server logs, or contact administrator."
 
msgstr ""
 
"Вибачте, але помилка сталася під час виконання цієї операції. Будь ласка, "
 
"перевірте журнали сервера Kallithea або зверніться до адміністратора."
 

	
 
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 "Detach forks"
 
msgstr "Від'єднати forks"
 

	
 
msgid "Delete forks"
 
msgstr "Видалити forks"
 

	
 
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 "Label"
 
msgstr "Мітка"
 

	
 
msgid "Key"
 
msgstr "Ключ"
 

	
 
msgid "Active"
 
msgstr "Активний"
 

	
 
msgid "Label"
 
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 "Fork of 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 "This repository does not have a remote repository URL."
 
msgstr "У цьому сховищі немає URL-адреси віддаленого сховища."
 

	
 
msgid "Remote repository"
 
msgstr "Віддалений репозиторій"
 

	
 
msgid "Repository URL"
 
msgstr "URL репозиторію"
 

	
 
msgid ""
 
"Optional: URL of a remote repository. If set, the repository can be "
 
"pulled from this URL."
 
@@ -1488,96 +1460,99 @@ msgstr "Дозволяє зберігати додаткові настроювані поля для кожного сховища."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Показати версію Kallithea"
 

	
 
msgid ""
 
"Shows or hides a version number of Kallithea displayed in the footer."
 
msgstr ""
 
"Показує або приховує номер версії Kallithea, відображений у нижньому "
 
"колонтитулі."
 

	
 
msgid "Show user Gravatars"
 
msgstr "Показати Gravatars користувача"
 

	
 
msgid "Repository page size"
 
msgstr "Розмір сторінки репозиторію"
 

	
 
msgid ""
 
"Number of items displayed in the repository pages before pagination is "
 
"shown."
 
msgstr ""
 
"Кількість елементів, що відображаються на сторінках сховища перед "
 
"показаним нумерацією."
 

	
 
msgid "Admin page size"
 
msgstr "Розмір адмін сторінки"
 

	
 
msgid ""
 
"Number of items displayed in the admin pages grids before pagination is "
 
"shown."
 
msgstr ""
 
"Кількість елементів, що відображаються в сітках адміністратора сторінки "
 
"до відображення нумерації."
 

	
 
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 "Active"
 
msgstr "Активний"
 

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

	
 
msgid "Pull Requests"
 
msgstr "Запити Pull Requests"
 

	
 
msgid "Options"
 
msgstr "Параметри"
 

	
 
msgid "Compare Fork"
 
msgstr "Порівняти Вилки"
 

	
 
msgid "Compare"
 
msgstr "Порівняти"
 

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

	
 
msgid "Follow"
 
msgstr "Слідувати"
 

	
 
msgid "Unfollow"
 
msgstr "Не слідкувати"
 

	
 
msgid "Fork"
 
msgstr "Форк"
 

	
 
msgid "Create Pull Request"
 
msgstr "Створити Pull-Запит"
 

	
 
msgid "Switch To"
 
msgstr "Переключитися на"
 

	
 
msgid "No matches found"
 
msgstr "Збігів не знайдено"
 

	
 
msgid "Show recent activity"
 
msgstr "Показати недавню активність"
 

	
 
msgid "Public journal"
 
msgstr "Публічний журнал"
 

	
 
msgid "Gists"
 
msgstr "Gists"
 

	
 
msgid "Search in repositories"
 
msgstr "Пошук в репозиторіях"
 

	
kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -304,99 +304,96 @@ msgstr "管理"
 
msgid "Disabled"
 
msgstr "停用"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "已允许手动激活账号"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "已允许自动激活账号"
 

	
 
msgid "Manual activation of external account"
 
msgstr "外部账号手动激活"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "外部账号自动激活"
 

	
 
msgid "Enabled"
 
msgstr "启用"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "全局权限更新成功"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "权限更新时发生错误"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "这个组内有%s个版本库因而无法删除"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "版本库%s成功更新"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "在删除%s的时候发生错误"
 

	
 
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 "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 "成功更新版本控制系统设置"
 

	
 
msgid "Updated application settings"
 
msgstr "更新应用设置"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "成功更新可视化设置"
 

	
 
msgid "Added new hook"
 
msgstr "新建钩子"
 

	
 
msgid "Updated hooks"
 
msgstr "更新钩子"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "Whoosh重新索引任务调度"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "保存权限时发生错误"
 

	
 
msgid "User updated successfully"
 
msgstr "用户更新成功"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "删除用户时发生错误"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr "必须是注册用户才能进行此操作"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "必须登录才能访问该页面"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr "修订集过大并已被截断,使用差异菜单查看此差异"
 

	
 
msgid "No changes detected"
 
msgstr "未发现差异"
 
@@ -718,141 +715,138 @@ msgstr "版本库复刻"
 

	
 
msgid "Registration"
 
msgstr "注册"
 

	
 
msgid "Group name"
 
msgstr "组名"
 

	
 
msgid "Group parent"
 
msgstr "上级组"
 

	
 
msgid "Settings"
 
msgstr "设置"
 

	
 
msgid "Permissions"
 
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个版本库"
 

	
 
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 "Remote"
 
msgstr "远程"
 

	
 
msgid "Statistics"
 
msgstr "统计"
 

	
 
msgid "Remove from public journal"
 
msgstr "从公共日志删除"
 

	
 
msgid "Confirm to delete this repository: %s"
 
msgstr "确认删除版本库:%s"
 

	
 
msgid "Prefix"
 
msgstr "前缀"
 

	
 
msgid "Key"
 
msgstr "键"
 

	
 
msgid "Active"
 
msgstr "启用"
 

	
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr "文件浏览、下载、whoosh和README的默认修订版本"
 

	
 
msgid "Change owner of this repository."
 
msgstr "修改这个版本库的所有者。"
 

	
 
msgid "Hooks"
 
msgstr "钩子"
 

	
 
msgid "Send"
 
msgstr "发送"
 

	
 
msgid "Failed to remove hook"
 
msgstr "移除钩子失败"
 

	
 
msgid "Reindex"
 
msgstr "重新索引"
 

	
 
msgid "Show repository size after push"
 
msgstr "推送后显示版本库大小"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "推送后更新版本库(hg update)"
 

	
 
msgid "General"
 
msgstr "通用"
 

	
 
msgid "Icons"
 
msgstr "图标"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "显示公共版本库图标"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "显示私有版本库图标"
 

	
 
msgid "Active"
 
msgstr "启用"
 

	
 
msgid "Members"
 
msgstr "成员"
 

	
 
msgid "No members yet"
 
msgstr "还没有成员"
 

	
 
msgid "Available members"
 
msgstr "启用成员"
 

	
 
msgid "Add user"
 
msgstr "添加用户"
 

	
 
msgid "Users"
 
msgstr "用户"
 

	
 
msgid "Password confirmation"
 
msgstr "确认密码"
 

	
 
msgid "Confirm to delete this user: %s"
 
msgstr "确认删除用户:%s"
 

	
 
msgid "New password confirmation"
 
msgstr "确认新密码"
 

	
 
msgid "Mercurial repository"
 
msgstr "Mercurial版本库"
 

	
 
msgid "Git repository"
 
msgstr "Git版本库"
 

	
 
msgid "Summary"
 
msgstr "概况"
 

	
 
msgid "Changelog"
 
msgstr "修订记录"
 

	
 
msgid "Files"
 
msgstr "浏览"
 

	
 
msgid "Options"
 
msgstr "选项"
 

	
 
msgid "Compare"
 
msgstr "比较显示"
 

	
 
msgid "Search"
 
msgstr "搜索"
 

	
kallithea/i18n/zh_TW/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -254,111 +254,111 @@ msgstr "啟用統計"
 
msgid "Enable downloads"
 
msgstr "啟用下載"
 

	
 
msgid "Reset"
 
msgstr "重設"
 

	
 
msgid "Delete"
 
msgstr "移除"
 

	
 
msgid "My Account"
 
msgstr "我的帳號"
 

	
 
msgid "New password"
 
msgstr "新密碼"
 

	
 
msgid "Name"
 
msgstr "名稱"
 

	
 
msgid "Anonymous access"
 
msgstr "訪客權限"
 

	
 
msgid "Repository group"
 
msgstr "版本庫群組"
 

	
 
msgid "Registration"
 
msgstr "註冊"
 

	
 
msgid "Group name"
 
msgstr "群組名稱"
 

	
 
msgid "Group parent"
 
msgstr "父群組"
 

	
 
msgid "Settings"
 
msgstr "設定"
 

	
 
msgid "Permissions"
 
msgstr "權限"
 

	
 
msgid "Remote"
 
msgstr "遠端"
 

	
 
msgid "Statistics"
 
msgstr "統計"
 

	
 
msgid "Remove from public journal"
 
msgstr "從公開日誌移除"
 

	
 
msgid "Active"
 
msgstr "啟用"
 

	
 
msgid "Failed to remove hook"
 
msgstr "移除hook失敗"
 

	
 
msgid "Reindex"
 
msgstr "重新索引"
 

	
 
msgid "Show repository size after push"
 
msgstr "push 後顯示版本庫大小"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "push後更新版本庫 (hg update)"
 

	
 
msgid "Active"
 
msgstr "啟用"
 

	
 
msgid "Members"
 
msgstr "成員"
 

	
 
msgid "Available members"
 
msgstr "啟用的成員"
 

	
 
msgid "Add user"
 
msgstr "新增使用者"
 

	
 
msgid "Users"
 
msgstr "使用者"
 

	
 
msgid "Mercurial repository"
 
msgstr "Mercurial 版本庫"
 

	
 
msgid "Git repository"
 
msgstr "Git 版本庫"
 

	
 
msgid "Summary"
 
msgstr "概況"
 

	
 
msgid "Changelog"
 
msgstr "修改紀錄"
 

	
 
msgid "Files"
 
msgstr "檔案"
 

	
 
msgid "Options"
 
msgstr "選項"
 

	
 
msgid "Search"
 
msgstr "搜尋"
 

	
 
msgid "Fork"
 
msgstr "分支"
 

	
 
msgid "Public journal"
 
msgstr "公開日誌"
 

	
 
msgid "Log Out"
 
msgstr "登出"
 

	
 
msgid "Create repositories"
 
msgstr "建立版本庫"
 

	
 
msgid "Show"
 
msgstr "顯示"
 

	
kallithea/lib/helpers.py
Show inline comments
 
@@ -1146,108 +1146,117 @@ def urlify_text(s, repo_name=None, link_
 
    # &#123; risk to be seen as an issue reference due to the presence of '#'.)
 
    s = s.replace("&apos;", "&#39;")
 
    return literal(s)
 

	
 

	
 
def linkify_others(t, l):
 
    """Add a default link to html with links.
 
    HTML doesn't allow nesting of links, so the outer link must be broken up
 
    in pieces and give space for other links.
 
    """
 
    urls = re.compile(r'(\<a.*?\<\/a\>)',)
 
    links = []
 
    for e in urls.split(t):
 
        if e.strip() and not urls.match(e):
 
            links.append('<a class="message-link" href="%s">%s</a>' % (l, e))
 
        else:
 
            links.append(e)
 

	
 
    return ''.join(links)
 

	
 

	
 
# Global variable that will hold the actual urlify_issues function body.
 
# Will be set on first use when the global configuration has been read.
 
_urlify_issues_f = None
 

	
 

	
 
def urlify_issues(newtext, repo_name):
 
    """Urlify issue references according to .ini configuration"""
 
    global _urlify_issues_f
 
    if _urlify_issues_f is None:
 
        from kallithea import CONFIG
 
        from kallithea.model.db import URL_SEP
 
        assert CONFIG['sqlalchemy.url'] # make sure config has been loaded
 

	
 
        # Build chain of urlify functions, starting with not doing any transformation
 
        def tmp_urlify_issues_f(s):
 
            return s
 

	
 
        issue_pat_re = re.compile(r'issue_pat(.*)')
 
        for k in CONFIG:
 
            # Find all issue_pat* settings that also have corresponding server_link and prefix configuration
 
            m = issue_pat_re.match(k)
 
            if m is None:
 
                continue
 
            suffix = m.group(1)
 
            issue_pat = CONFIG.get(k)
 
            issue_server_link = CONFIG.get('issue_server_link%s' % suffix)
 
            issue_sub = CONFIG.get('issue_sub%s' % suffix)
 
            if not issue_pat or not issue_server_link or issue_sub is None: # issue_sub can be empty but should be present
 
                log.error('skipping incomplete issue pattern %r: %r -> %r %r', suffix, issue_pat, issue_server_link, issue_sub)
 
            issue_prefix = CONFIG.get('issue_prefix%s' % suffix)
 
            if issue_prefix:
 
                log.error('found unsupported issue_prefix%s = %r - use issue_sub%s instead', suffix, issue_prefix, suffix)
 
            if not issue_pat:
 
                log.error('skipping incomplete issue pattern %r: it needs a regexp', k)
 
                continue
 
            if not issue_server_link:
 
                log.error('skipping incomplete issue pattern %r: it needs issue_server_link%s', k, suffix)
 
                continue
 
            if issue_sub is None: # issue_sub can be empty but should be present
 
                log.error('skipping incomplete issue pattern %r: it needs (a potentially empty) issue_sub%s', k, suffix)
 
                continue
 

	
 
            # Wrap tmp_urlify_issues_f with substitution of this pattern, while making sure all loop variables (and compiled regexpes) are bound
 
            try:
 
                issue_re = re.compile(issue_pat)
 
            except re.error as e:
 
                log.error('skipping invalid issue pattern %r: %r -> %r %r. Error: %s', suffix, issue_pat, issue_server_link, issue_sub, str(e))
 
                log.error('skipping invalid issue pattern %r: %r -> %r %r. Error: %s', k, issue_pat, issue_server_link, issue_sub, str(e))
 
                continue
 

	
 
            log.debug('issue pattern %r: %r -> %r %r', suffix, issue_pat, issue_server_link, issue_sub)
 
            log.debug('issue pattern %r: %r -> %r %r', k, issue_pat, issue_server_link, issue_sub)
 

	
 
            def issues_replace(match_obj,
 
                               issue_server_link=issue_server_link, issue_sub=issue_sub):
 
                try:
 
                    issue_url = match_obj.expand(issue_server_link)
 
                except (IndexError, re.error) as e:
 
                    log.error('invalid issue_url setting %r -> %r %r. Error: %s', issue_pat, issue_server_link, issue_sub, str(e))
 
                    issue_url = issue_server_link
 
                issue_url = issue_url.replace('{repo}', repo_name)
 
                issue_url = issue_url.replace('{repo_name}', repo_name.split(URL_SEP)[-1])
 
                # if issue_sub is empty use the matched issue reference verbatim
 
                if not issue_sub:
 
                    issue_text = match_obj.group()
 
                else:
 
                    try:
 
                        issue_text = match_obj.expand(issue_sub)
 
                    except (IndexError, re.error) as e:
 
                        log.error('invalid issue_sub setting %r -> %r %r. Error: %s', issue_pat, issue_server_link, issue_sub, str(e))
 
                        issue_text = match_obj.group()
 

	
 
                return (
 
                    '<a class="issue-tracker-link" href="%(url)s">'
 
                    '%(text)s'
 
                    '</a>'
 
                    ) % {
 
                     'url': issue_url,
 
                     'text': issue_text,
 
                    }
 

	
 
            def tmp_urlify_issues_f(s, issue_re=issue_re, issues_replace=issues_replace, chain_f=tmp_urlify_issues_f):
 
                return issue_re.sub(issues_replace, chain_f(s))
 

	
 
        # Set tmp function globally - atomically
 
        _urlify_issues_f = tmp_urlify_issues_f
 

	
 
    return _urlify_issues_f(newtext)
 

	
 

	
 
def render_w_mentions(source, repo_name=None):
 
    """
 
    Render plain text with revision hashes and issue references urlified
 
    and with @mention highlighting.
 
    """
 
    s = safe_str(source)
 
    s = urlify_text(s, repo_name=repo_name)
 
    return literal('<div class="formatted-fixed">%s</div>' % s)
 

	
 

	
kallithea/lib/hooks.py
Show inline comments
 
@@ -21,150 +21,154 @@ This file was forked by the Kallithea pr
 
Original author and date, and relevant copyright and licensing information is below:
 
:created_on: Aug 6, 2010
 
:author: marcink
 
:copyright: (c) 2013 RhodeCode GmbH, and others.
 
:license: GPLv3, see LICENSE.md for more details.
 
"""
 

	
 
import os
 
import sys
 
import time
 

	
 
import mercurial.scmutil
 

	
 
from kallithea.lib import helpers as h
 
from kallithea.lib.exceptions import UserCreationError
 
from kallithea.lib.utils import action_logger, make_ui
 
from kallithea.lib.utils2 import HookEnvironmentError, ascii_str, get_hook_environment, safe_bytes, safe_str
 
from kallithea.lib.vcs.backends.base import EmptyChangeset
 
from kallithea.model.db import Repository, User
 

	
 

	
 
def _get_scm_size(alias, root_path):
 
    if not alias.startswith('.'):
 
        alias += '.'
 

	
 
    size_scm, size_root = 0, 0
 
    for path, dirs, files in os.walk(root_path):
 
        if path.find(alias) != -1:
 
            for f in files:
 
                try:
 
                    size_scm += os.path.getsize(os.path.join(path, f))
 
                except OSError:
 
                    pass
 
        else:
 
            for f in files:
 
                try:
 
                    size_root += os.path.getsize(os.path.join(path, f))
 
                except OSError:
 
                    pass
 

	
 
    size_scm_f = h.format_byte_size(size_scm)
 
    size_root_f = h.format_byte_size(size_root)
 
    size_total_f = h.format_byte_size(size_root + size_scm)
 

	
 
    return size_scm_f, size_root_f, size_total_f
 

	
 

	
 
def repo_size(ui, repo, hooktype=None, **kwargs):
 
    """Show size of Mercurial repository, to be called after push."""
 
    """Show size of Mercurial repository.
 

	
 
    Called as Mercurial hook changegroup.repo_size after push.
 
    """
 
    size_hg_f, size_root_f, size_total_f = _get_scm_size('.hg', safe_str(repo.root))
 

	
 
    last_cs = repo[len(repo) - 1]
 

	
 
    msg = ('Repository size .hg: %s Checkout: %s Total: %s\n'
 
           'Last revision is now r%s:%s\n') % (
 
        size_hg_f, size_root_f, size_total_f, last_cs.rev(), ascii_str(last_cs.hex())[:12]
 
    )
 
    ui.status(safe_bytes(msg))
 

	
 

	
 
def log_pull_action(ui, repo, **kwargs):
 
    """Logs user last pull action
 

	
 
    Called as Mercurial hook outgoing.pull_logger or from Kallithea before invoking Git.
 

	
 
    Does *not* use the action from the hook environment but is always 'pull'.
 
    """
 
    ex = get_hook_environment()
 

	
 
    user = User.get_by_username(ex.username)
 
    action = 'pull'
 
    action_logger(user, action, ex.repository, ex.ip, commit=True)
 
    # extension hook call
 
    from kallithea import EXTENSIONS
 
    callback = getattr(EXTENSIONS, 'PULL_HOOK', None)
 
    if callable(callback):
 
        kw = {}
 
        kw.update(ex)
 
        callback(**kw)
 

	
 
    return 0
 

	
 

	
 
def log_push_action(ui, repo, node, node_last, **kwargs):
 
    """
 
    Entry point for Mercurial hook changegroup.push_logger.
 
    Register that changes have been added to the repo - log the action *and* invalidate caches.
 
    Note: This hook is not only logging, but also the side effect invalidating
 
    caches! The function should perhaps be renamed.
 

	
 
    Called as Mercurial hook changegroup.kallithea_log_push_action .
 

	
 
    The pushed changesets is given by the revset 'node:node_last'.
 

	
 
    Note: This hook is not only logging, but also the side effect invalidating
 
    cahes! The function should perhaps be renamed.
 
    """
 
    revs = [ascii_str(repo[r].hex()) for r in mercurial.scmutil.revrange(repo, [b'%s:%s' % (node, node_last)])]
 
    process_pushed_raw_ids(revs)
 
    return 0
 

	
 

	
 
def process_pushed_raw_ids(revs):
 
    """
 
    Register that changes have been added to the repo - log the action *and* invalidate caches.
 

	
 
    Called from  Mercurial changegroup.push_logger calling hook log_push_action,
 
    Called from Mercurial changegroup.kallithea_log_push_action calling hook log_push_action,
 
    or from the Git post-receive hook calling handle_git_post_receive ...
 
    or from scm _handle_push.
 
    """
 
    ex = get_hook_environment()
 

	
 
    action = '%s:%s' % (ex.action, ','.join(revs))
 
    action_logger(ex.username, action, ex.repository, ex.ip, commit=True)
 

	
 
    from kallithea.model.scm import ScmModel
 
    ScmModel().mark_for_invalidation(ex.repository)
 

	
 
    # extension hook call
 
    from kallithea import EXTENSIONS
 
    callback = getattr(EXTENSIONS, 'PUSH_HOOK', None)
 
    if callable(callback):
 
        kw = {'pushed_revs': revs}
 
        kw.update(ex)
 
        callback(**kw)
 

	
 

	
 
def log_create_repository(repository_dict, created_by, **kwargs):
 
    """
 
    Post create repository Hook.
 

	
 
    :param repository: dict dump of repository object
 
    :param created_by: username who created repository
 

	
 
    available keys of repository_dict:
 

	
 
     'repo_type',
 
     'description',
 
     'private',
 
     'created_on',
 
     'enable_downloads',
 
     'repo_id',
 
     'owner_id',
 
     'enable_statistics',
 
     'clone_uri',
 
     'fork_id',
 
     'group_id',
 
     'repo_name'
 

	
 
    """
 
    from kallithea import EXTENSIONS
 
    callback = getattr(EXTENSIONS, 'CREATE_REPO_HOOK', None)
 
    if callable(callback):
 
        kw = {}
 
        kw.update(repository_dict)
kallithea/lib/inifile.py
Show inline comments
 
@@ -32,189 +32,198 @@ log = logging.getLogger(__name__)
 

	
 
template_file = os.path.join(
 
    os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
 
    'kallithea/lib/paster_commands/template.ini.mako')
 

	
 
default_variables = {
 
    'database_engine': 'sqlite',
 
    'http_server': 'waitress',
 
    'host': '127.0.0.1',
 
    'port': '5000',
 
    'uuid': lambda: 'VERY-SECRET',
 
}
 

	
 
variable_options = {
 
    'database_engine': ['sqlite', 'postgres', 'mysql'],
 
    'http_server': ['waitress', 'gearbox', 'gevent', 'gunicorn', 'uwsgi'],
 
}
 

	
 
def expand(template, mako_variable_values, settings):
 
    """Expand mako template and tweak it.
 
    Not entirely stable for random templates as input, but good enough for our
 
    single template.
 

	
 
    >>> template = '''
 
    ... [first-section]
 
    ...
 
    ... variable=${mako_variable}
 
    ... variable2  =\tvalue after tab
 
    ... ## This section had some whitespace and stuff
 
    ...
 
    ...
 
    ... # ${mako_function()}
 
    ... [second-section]
 
    ... %if conditional_options == 'option-a':
 
    ... # option a was chosen
 
    ... %elif conditional_options == 'option-b':
 
    ... some_variable = "never mind - option-b will not be used anyway ..."
 
    ... %endif
 
    ...
 
    ... [comment-section]
 
    ... #variable3 = 3.0
 
    ... #variable4 = 4.0
 
    ... #variable5 = 5.0
 
    ... variable5 = 5.1
 
    ... #variable6 = 6.0
 
    ... #variable6 = 6.1
 
    ... #variable7 = 7.0
 
    ... variable7 = 7.1
 
    ... variable8 = 8.0
 
    ... '''
 
    >>> mako_variable_values = {'mako_variable': 'VALUE', 'mako_function': (lambda: 'FUNCTION RESULT'),
 
    ...                         'conditional_options': 'option-a', 'http_server': 'nc'}
 
    >>> settings = { # only partially used
 
    ...     '[first-section]': {'variable2': 'VAL2', 'first_extra': 'EXTRA'},
 
    ...     '[comment-section]': {'variable3': '3.0', 'variable4': '4.1', 'variable5': '5.2', 'variable6': '6.2', 'variable7': '7.0'},
 
    ...     '[first-section]': {'variable2': 'VAL2', 'first_extra': 'EXTRA', 'spacey': ' '},
 
    ...     '[comment-section]': {'variable3': '3.0', 'variable4': '4.1', 'variable5': '5.2', 'variable6': '6.2', 'variable7': '7.0', 'variable8': None, 'variable9': None},
 
    ...     '[third-section]': {'third_extra': ' 3'},
 
    ...     '[fourth-section]': {'fourth_extra': '4', 'fourth': '"four"'},
 
    ... }
 
    >>> print(expand(template, mako_variable_values, settings))
 
    ERROR: http_server is 'nc' - it should be one of 'waitress', 'gearbox', 'gevent', 'gunicorn', 'uwsgi'
 
    <BLANKLINE>
 
    [first-section]
 
    <BLANKLINE>
 
    variable=VALUE
 
    #variable2  =    value after tab
 
    variable2 = VAL2
 
    <BLANKLINE>
 
    first_extra = EXTRA
 
    spacey =
 
    <BLANKLINE>
 
    <BLANKLINE>
 
    # FUNCTION RESULT
 
    [second-section]
 
    # option a was chosen
 
    <BLANKLINE>
 
    [comment-section]
 
    variable3 = 3.0
 
    #variable4 = 4.0
 
    variable4 = 4.1
 
    #variable5 = 5.0
 
    #variable5 = 5.1
 
    variable5 = 5.2
 
    #variable6 = 6.0
 
    #variable6 = 6.1
 
    variable6 = 6.2
 
    variable7 = 7.0
 
    #variable7 = 7.1
 
    #variable8 = 8.0
 
    <BLANKLINE>
 
    variable8 = None
 
    variable9 = None
 
    <BLANKLINE>
 
    [fourth-section]
 
    fourth = "four"
 
    fourth_extra = 4
 
    <BLANKLINE>
 
    [third-section]
 
    third_extra =  3
 
    <BLANKLINE>
 
    """
 
    mako_variables = dict(default_variables)
 
    mako_variables.update(mako_variable_values or {})
 
    settings = dict((k, dict(v)) for k, v in settings.items()) # deep copy before mutating
 

	
 
    for key, value in mako_variables.items():
 
        if key in variable_options:
 
            if value not in variable_options[key]:
 
                print('ERROR: %s is %r - it should be one of %s' %
 
                      (key, value, ', '.join(repr(x) for x in variable_options[key])))
 

	
 
    ini_lines = mako.template.Template(template).render(**mako_variables)
 

	
 
    def process_section(m):
 
        """process a ini section, replacing values as necessary"""
 
        sectionname, lines = m.groups()
 
        if sectionname in settings:
 
            section_settings = settings.pop(sectionname)
 
            add_after_key_value = {}  # map key to value it should be added after
 

	
 
            # 1st pass:
 
            # comment out lines with keys that have new values
 
            # find best line for keeping or un-commenting (because it has the right value) or adding after (because it is the last with other value)
 
            def comment_out(m):
 
                """process a section line if in section_settings and comment out and track in add_after_key_value"""
 
                line = m.group(0)
 
                comment, key, line_value = m.groups()
 
                if key not in section_settings:
 
                    return line
 
                new_value = section_settings[key]
 
                if line_value == new_value or add_after_key_value.get(key) != new_value:
 
                    add_after_key_value[key] = line_value
 
                if comment:
 
                    return line
 
                return '#' + line
 

	
 
            lines = re.sub(r'^(#)?([^#\n\s]*)[ \t]*=[ \t]*(.*)$', comment_out, lines, flags=re.MULTILINE)
 

	
 
            # 2nd pass:
 
            # find the best comment line and un-comment or add after
 
            def add_after_comment(m):
 
                """process a section comment line and add new value"""
 
                line = m.group(0)
 
                key, line_value = m.groups()
 
                if key not in section_settings:
 
                    return line
 
                if line_value != add_after_key_value.get(key):
 
                    return line
 
                new_value = section_settings[key]
 
                if new_value == line_value:
 
                    line = line.lstrip('#')
 
                else:
 
                    line += '\n%s = %s' % (key, new_value)
 
                section_settings.pop(key)
 
                return line
 

	
 
            lines = re.sub(r'^#([^#\n\s]*)[ \t]*=[ \t]*(.*)$', add_after_comment, lines, flags=re.MULTILINE)
 

	
 
            # add unused section settings
 
            # 3rd pass:
 
            # settings that haven't been consumed yet at is appended to section
 
            if section_settings:
 
                lines += '\n' + ''.join('%s = %s\n' % (key, value) for key, value in sorted(section_settings.items()))
 

	
 
        return sectionname + '\n' + lines
 
        return sectionname + '\n' + re.sub('[ \t]+\n', '\n', lines)
 

	
 
    # process sections until comments before next section or end
 
    ini_lines = re.sub(r'''^
 
        (\[.*\])\n
 
        # after the section name, a number of chunks with:
 
        (
 
            (?:
 
                # a number of comments or empty lines
 
                (?:[#].*\n|\n)*
 
                # one or more non-empty non-comments non-section-start lines
 
                (?:[^\n#[].*\n)+
 
                # a number of comments - not empty lines
 
                (?:[#].*\n)*
 
            )*
 
        )
 
        ''',
 
        process_section, ini_lines, flags=re.MULTILINE | re.VERBOSE) \
 
        + \
 
        ''.join(
 
            '\n' + sectionname + '\n' + ''.join('%s = %s\n' % (key, value) for key, value in sorted(section_settings.items()))
 
            for sectionname, section_settings in sorted(settings.items())
 
            if section_settings)
 

	
 
    return ini_lines
 

	
 

	
 
def create(dest_file, mako_variable_values, settings):
 
    """Create an ini file at dest_file"""
 
    with open(template_file, 'rb') as f:
 
        template = f.read().decode('utf-8')
 

	
 
    ini_lines = expand(template, mako_variable_values, settings)
 

	
 
    with open(dest_file, 'wb') as f:
 
        f.write(ini_lines.encode('utf-8'))
kallithea/templates/about.html
Show inline comments
 
## -*- coding: utf-8 -*-
 
<%inherit file="/base/base.html"/>
 
<%block name="title">
 
    ${_('About')}
 
</%block>
 
<%block name="header_menu">
 
    ${self.menu('about')}
 
</%block>
 
<%def name="main()">
 

	
 
<div class="panel panel-primary">
 
  <div class="panel-heading">
 
    <h5 class="panel-title">${_('About')} Kallithea</h5>
 
  </div>
 

	
 
  <div class="panel-body panel-about">
 
  <p><a href="https://kallithea-scm.org/">Kallithea</a> is a project of the
 
  <a href="http://sfconservancy.org/">Software Freedom Conservancy, Inc.</a>
 
  and is released under the terms of the
 
  <a href="http://www.gnu.org/copyleft/gpl.html">GNU General Public License,
 
  v 3.0 (GPLv3)</a>.</p>
 

	
 
  <p>Kallithea is copyrighted by various authors, including but not
 
  necessarily limited to the following:</p>
 
  <ul>
 

	
 
  <li>Copyright &copy; 2012&ndash;2020, Mads Kiilerich</li>
 
  <li>Copyright &copy; 2014&ndash;2020, Thomas De Schampheleire</li>
 
  <li>Copyright &copy; 2015&ndash;2017, 2019&ndash;2020, Étienne Gilli</li>
 
  <li>Copyright &copy; 2016&ndash;2017, 2020, Asterios Dimitriou</li>
 
  <li>Copyright &copy; 2019&ndash;2020, Private</li>
 
  <li>Copyright &copy; 2020, Dennis Fink</li>
 
  <li>Copyright &copy; 2020, J. Lavoie</li>
 
  <li>Copyright &copy; 2020, robertus</li>
 
  <li>Copyright &copy; 2020, Ross Thomas</li>
 
  <li>Copyright &copy; 2012, 2014&ndash;2017, 2019, Andrej Shadura</li>
 
  <li>Copyright &copy; 2015&ndash;2017, 2019, Étienne Gilli</li>
 
  <li>Copyright &copy; 2017&ndash;2019, Allan Nordhøy</li>
 
  <li>Copyright &copy; 2018&ndash;2019, ssantos</li>
 
  <li>Copyright &copy; 2019, Adi Kriegisch</li>
 
  <li>Copyright &copy; 2019, Danni Randeris</li>
 
  <li>Copyright &copy; 2019, Edmund Wong</li>
 
  <li>Copyright &copy; 2019, Elizabeth Sherrock</li>
 
  <li>Copyright &copy; 2019, Hüseyin Tunç</li>
 
  <li>Copyright &copy; 2019, leela</li>
 
  <li>Copyright &copy; 2019, Manuel Jacob</li>
 
  <li>Copyright &copy; 2019, Mateusz Mendel</li>
 
  <li>Copyright &copy; 2019, Nathan</li>
 
  <li>Copyright &copy; 2019, Oleksandr Shtalinberg</li>
 
  <li>Copyright &copy; 2019, Private</li>
 
  <li>Copyright &copy; 2019, THANOS SIOURDAKIS</li>
 
  <li>Copyright &copy; 2019, Wolfgang Scherer</li>
 
  <li>Copyright &copy; 2019, Христо Станев</li>
 
  <li>Copyright &copy; 2012, 2014&ndash;2018, Dominik Ruf</li>
 
  <li>Copyright &copy; 2014&ndash;2015, 2018, Michal Čihař</li>
 
  <li>Copyright &copy; 2015, 2018, Branko Majic</li>
 
  <li>Copyright &copy; 2018, Chris Rule</li>
 
  <li>Copyright &copy; 2018, Jesús Sánchez</li>
 
  <li>Copyright &copy; 2018, Patrick Vane</li>
 
  <li>Copyright &copy; 2018, Pheng Heong Tan</li>
 
  <li>Copyright &copy; 2018, Максим Якимчук</li>
 
  <li>Copyright &copy; 2018, Марс Ямбар</li>
 
  <li>Copyright &copy; 2012&ndash;2017, Unity Technologies</li>
 
  <li>Copyright &copy; 2015&ndash;2017, Søren Løvborg</li>
 
  <li>Copyright &copy; 2015, 2017, Sam Jaques</li>
 
  <li>Copyright &copy; 2016&ndash;2017, Asterios Dimitriou</li>
 
  <li>Copyright &copy; 2017, Alessandro Molina</li>
 
  <li>Copyright &copy; 2017, Anton Schur</li>
 
  <li>Copyright &copy; 2017, Ching-Chen Mao</li>
 
  <li>Copyright &copy; 2017, Eivind Tagseth</li>
 
  <li>Copyright &copy; 2017, FUJIWARA Katsunori</li>
 
  <li>Copyright &copy; 2017, Holger Schramm</li>
 
  <li>Copyright &copy; 2017, Karl Goetz</li>
 
  <li>Copyright &copy; 2017, Lars Kruse</li>
 
  <li>Copyright &copy; 2017, Marko Semet</li>
 
  <li>Copyright &copy; 2017, Viktar Vauchkevich</li>
 
  <li>Copyright &copy; 2012&ndash;2016, Takumi IINO</li>
 
  <li>Copyright &copy; 2015&ndash;2016, Jan Heylen</li>
 
  <li>Copyright &copy; 2015&ndash;2016, Robert Martinez</li>
 
  <li>Copyright &copy; 2015&ndash;2016, Robert Rauch</li>
 
  <li>Copyright &copy; 2016, Angel Ezquerra</li>
 
  <li>Copyright &copy; 2016, Anton Shestakov</li>
 
  <li>Copyright &copy; 2016, Brandon Jones</li>
 
  <li>Copyright &copy; 2016, Kateryna Musina</li>
 
  <li>Copyright &copy; 2016, Konstantin Veretennicov</li>
 
  <li>Copyright &copy; 2016, Oscar Curero</li>
 
  <li>Copyright &copy; 2016, Robert James Dennington</li>
 
  <li>Copyright &copy; 2016, timeless@gmail.com</li>
 
  <li>Copyright &copy; 2016, YFdyh000</li>
 
  <li>Copyright &copy; 2012&ndash;2013, 2015, Aras Pranckevičius</li>
 
  <li>Copyright &copy; 2014&ndash;2015, Bradley M. Kuhn</li>
 
  <li>Copyright &copy; 2014&ndash;2015, Christian Oyarzun</li>
 
  <li>Copyright &copy; 2014&ndash;2015, Joseph Rivera</li>
 
  <li>Copyright &copy; 2014&ndash;2015, Sean Farley</li>
 
  <li>Copyright &copy; 2015, Anatoly Bubenkov</li>
 
  <li>Copyright &copy; 2015, Andrew Bartlett</li>
 
  <li>Copyright &copy; 2015, Balázs Úr</li>
 
  <li>Copyright &copy; 2015, Ben Finney</li>
 
  <li>Copyright &copy; 2015, Daniel Hobley</li>
 
  <li>Copyright &copy; 2015, David Avigni</li>
 
  <li>Copyright &copy; 2015, Denis Blanchette</li>
 
  <li>Copyright &copy; 2015, duanhongyi</li>
 
  <li>Copyright &copy; 2015, EriCSN Chang</li>
 
  <li>Copyright &copy; 2015, Grzegorz Krason</li>
 
  <li>Copyright &copy; 2015, Jiří Suchan</li>
 
  <li>Copyright &copy; 2015, Kazunari Kobayashi</li>
 
  <li>Copyright &copy; 2015, Kevin Bullock</li>
 
  <li>Copyright &copy; 2015, kobanari</li>
 
  <li>Copyright &copy; 2015, Marc Abramowitz</li>
 
  <li>Copyright &copy; 2015, Marc Villetard</li>
 
  <li>Copyright &copy; 2015, Matthias Zilk</li>
 
  <li>Copyright &copy; 2015, Michael Pohl</li>
 
  <li>Copyright &copy; 2015, Michael V. DePalatis</li>
 
  <li>Copyright &copy; 2015, Morten Skaaning</li>
kallithea/tests/api/api_base.py
Show inline comments
 
@@ -593,122 +593,122 @@ class _BaseTestApi(object):
 
        members = []
 
        followers = []
 
        for user in repo.repo_to_perm:
 
            perm = user.permission.permission_name
 
            user = user.user
 
            user_data = {'name': user.username, 'type': "user",
 
                         'permission': perm}
 
            members.append(user_data)
 

	
 
        for user_group in repo.users_group_to_perm:
 
            perm = user_group.permission.permission_name
 
            user_group = user_group.users_group
 
            user_group_data = {'name': user_group.users_group_name,
 
                               'type': "user_group", 'permission': perm}
 
            members.append(user_group_data)
 

	
 
        for user in repo.followers:
 
            followers.append(user.user.get_api_data())
 

	
 
        ret['members'] = members
 
        ret['followers'] = followers
 

	
 
        expected = ret
 
        self._compare_ok(id_, expected, given=response.body)
 
        fixture.destroy_user_group(new_group)
 

	
 
        id_, params = _build_data(self.apikey, 'get_repo', repoid=self.REPO,
 
                                  with_revision_names=True,
 
                                  with_pullrequests=True)
 
        response = api_call(self, params)
 
        assert "v0.2.0" in response.json['result']['tags']
 
        assert 'pull_requests' in response.json['result']
 

	
 
    @base.parametrize('grant_perm', [
 
        ('repository.admin'),
 
        ('repository.write'),
 
        ('repository.read'),
 
    ])
 
    def test_api_get_repo_by_non_admin(self, grant_perm):
 
        RepoModel().grant_user_permission(repo=self.REPO,
 
                                          user=self.TEST_USER_LOGIN,
 
                                          perm=grant_perm)
 
        Session().commit()
 
        id_, params = _build_data(self.apikey_regular, 'get_repo',
 
                                  repoid=self.REPO)
 
        response = api_call(self, params)
 

	
 
        repo = RepoModel().get_by_repo_name(self.REPO)
 
        ret = repo.get_api_data()
 
        assert len(repo.repo_to_perm) >= 2  # make sure we actually are testing something - probably the default 2 permissions, possibly more
 

	
 
        expected = repo.get_api_data()
 

	
 
        members = []
 
        followers = []
 
        assert 2 == len(repo.repo_to_perm)
 
        for user in repo.repo_to_perm:
 
            perm = user.permission.permission_name
 
            user_obj = user.user
 
            user_data = {'name': user_obj.username, 'type': "user",
 
                         'permission': perm}
 
            members.append(user_data)
 

	
 
        for user_group in repo.users_group_to_perm:
 
            perm = user_group.permission.permission_name
 
            user_group_obj = user_group.users_group
 
            user_group_data = {'name': user_group_obj.users_group_name,
 
                               'type': "user_group", 'permission': perm}
 
            members.append(user_group_data)
 
        expected['members'] = members
 

	
 
        followers = []
 

	
 
        for user in repo.followers:
 
            followers.append(user.user.get_api_data())
 

	
 
        ret['members'] = members
 
        ret['followers'] = followers
 
        expected['followers'] = followers
 

	
 
        expected = ret
 
        try:
 
            self._compare_ok(id_, expected, given=response.body)
 
        finally:
 
            RepoModel().revoke_user_permission(self.REPO, self.TEST_USER_LOGIN)
 

	
 
    def test_api_get_repo_by_non_admin_no_permission_to_repo(self):
 
        RepoModel().grant_user_permission(repo=self.REPO,
 
                                          user=User.DEFAULT_USER_NAME,
 
                                          perm='repository.none')
 
        try:
 
            RepoModel().grant_user_permission(repo=self.REPO,
 
                                              user=self.TEST_USER_LOGIN,
 
                                              perm='repository.none')
 

	
 
            id_, params = _build_data(self.apikey_regular, 'get_repo',
 
                                      repoid=self.REPO)
 
            response = api_call(self, params)
 

	
 
            expected = 'repository `%s` does not exist' % (self.REPO)
 
            self._compare_error(id_, expected, given=response.body)
 
        finally:
 
            RepoModel().grant_user_permission(repo=self.REPO,
 
                                              user=User.DEFAULT_USER_NAME,
 
                                              perm='repository.read')
 

	
 
    def test_api_get_repo_that_doesn_not_exist(self):
 
        id_, params = _build_data(self.apikey, 'get_repo',
 
                                  repoid='no-such-repo')
 
        response = api_call(self, params)
 

	
 
        ret = 'repository `%s` does not exist' % 'no-such-repo'
 
        expected = ret
 
        self._compare_error(id_, expected, given=response.body)
 

	
 
    def test_api_get_repos(self):
 
        id_, params = _build_data(self.apikey, 'get_repos')
 
        response = api_call(self, params)
 

	
 
        expected = jsonify([
 
            repo.get_api_data()
 
            for repo in Repository.query()
 
        ])
 

	
 
        self._compare_ok(id_, expected, given=response.body)
 

	
 
    def test_api_get_repos_non_admin(self):
 
        id_, params = _build_data(self.apikey_regular, 'get_repos')
 
        response = api_call(self, params)
kallithea/tests/functional/test_admin_auth_settings.py
Show inline comments
 
@@ -110,102 +110,102 @@ class TestAuthSettingsController(base.Te
 
        pass
 

	
 
    def _container_auth_setup(self, **settings):
 
        self.log_user()
 

	
 
        params = self._enable_plugins('kallithea.lib.auth_modules.auth_internal,kallithea.lib.auth_modules.auth_container')
 
        params.update(settings)
 

	
 
        test_url = base.url(controller='admin/auth_settings',
 
                       action='auth_settings')
 

	
 
        response = self.app.post(url=test_url, params=params)
 
        response = response.follow()
 
        response.click('Log Out') # end admin login session
 

	
 
    def _container_auth_verify_login(self, resulting_username, **get_kwargs):
 
        response = self.app.get(
 
            url=base.url(controller='admin/my_account', action='my_account'),
 
            **get_kwargs
 
        )
 
        response.mustcontain('My Account %s' % resulting_username)
 

	
 
    def test_container_auth_login_header(self):
 
        self._container_auth_setup(
 
            auth_container_header='THE_USER_NAME',
 
            auth_container_email_header='',
 
            auth_container_firstname_header='',
 
            auth_container_lastname_header='',
 
            auth_container_fallback_header='',
 
            auth_container_clean_username='False',
 
        )
 
        self._container_auth_verify_login(
 
            extra_environ={'THE_USER_NAME': 'john@example.org'},
 
            resulting_username='john@example.org',
 
        )
 

	
 
    def test_container_auth_login_header_attr(self):
 
        self._container_auth_setup(
 
            auth_container_header='THE_USER_NAME',
 
            auth_container_email_header='THE_USER_EMAIL',
 
            auth_container_firstname_header='THE_USER_FIRSTNAME',
 
            auth_container_lastname_header='THE_USER_LASTNAME',
 
            auth_container_fallback_header='',
 
            auth_container_clean_username='False',
 
        )
 
        response = self.app.get(
 
            url=base.url(controller='admin/my_account', action='my_account'),
 
            extra_environ={'THE_USER_NAME': 'johnd',
 
                           'THE_USER_EMAIL': 'john@example.org',
 
                           'THE_USER_EMAIL': 'john2@example.org',
 
                           'THE_USER_FIRSTNAME': 'John',
 
                           'THE_USER_LASTNAME': 'Doe',
 
                           }
 
        )
 
        assert response.form['email'].value == 'john@example.org'
 
        assert response.form['email'].value == 'john2@example.org'
 
        assert response.form['firstname'].value == 'John'
 
        assert response.form['lastname'].value == 'Doe'
 

	
 
    def test_container_auth_login_fallback_header(self):
 
        self._container_auth_setup(
 
            auth_container_header='THE_USER_NAME',
 
            auth_container_email_header='',
 
            auth_container_firstname_header='',
 
            auth_container_lastname_header='',
 
            auth_container_fallback_header='HTTP_X_YZZY',
 
            auth_container_clean_username='False',
 
        )
 
        self._container_auth_verify_login(
 
            headers={'X-Yzzy': r'foo\bar'},
 
            resulting_username=r'foo\bar',
 
        )
 

	
 
    def test_container_auth_clean_username_at(self):
 
        self._container_auth_setup(
 
            auth_container_header='REMOTE_USER',
 
            auth_container_email_header='',
 
            auth_container_firstname_header='',
 
            auth_container_lastname_header='',
 
            auth_container_fallback_header='',
 
            auth_container_clean_username='True',
 
        )
 
        self._container_auth_verify_login(
 
            extra_environ={'REMOTE_USER': 'john@example.org'},
 
            resulting_username='john',
 
        )
 

	
 
    def test_container_auth_clean_username_backslash(self):
 
        self._container_auth_setup(
 
            auth_container_header='REMOTE_USER',
 
            auth_container_email_header='',
 
            auth_container_firstname_header='',
 
            auth_container_lastname_header='',
 
            auth_container_fallback_header='',
 
            auth_container_clean_username='True',
 
        )
 
        self._container_auth_verify_login(
 
            extra_environ={'REMOTE_USER': r'example\jane'},
 
            resulting_username=r'jane',
 
        )
 

	
 
    def test_container_auth_no_logout(self):
 
        self._container_auth_setup(
 
            auth_container_header='REMOTE_USER',
kallithea/tests/functional/test_admin_settings.py
Show inline comments
 
# -*- coding: utf-8 -*-
 

	
 
from kallithea.model.db import Setting, Ui
 
from kallithea.tests import base
 
from kallithea.tests.fixture import Fixture
 

	
 

	
 
fixture = Fixture()
 

	
 

	
 
class TestAdminSettingsController(base.TestController):
 

	
 
    def test_index_main(self):
 
        self.log_user()
 
        response = self.app.get(base.url('admin_settings'))
 

	
 
    def test_index_mapping(self):
 
        self.log_user()
 
        response = self.app.get(base.url('admin_settings_mapping'))
 

	
 
    def test_index_global(self):
 
        self.log_user()
 
        response = self.app.get(base.url('admin_settings_global'))
 

	
 
    def test_index_visual(self):
 
        self.log_user()
 
        response = self.app.get(base.url('admin_settings_visual'))
 

	
 
    def test_index_email(self):
 
        self.log_user()
 
        response = self.app.get(base.url('admin_settings_email'))
 

	
 
    def test_index_hooks(self):
 
        self.log_user()
 
        response = self.app.get(base.url('admin_settings_hooks'))
 

	
 
    def test_create_custom_hook(self):
 
        self.log_user()
 
        response = self.app.post(base.url('admin_settings_hooks'),
 
                                params=dict(new_hook_ui_key='test_hooks_1',
 
                                            new_hook_ui_value='cd %s' % base.TESTS_TMP_PATH,
 
                                            _session_csrf_secret_token=self.session_csrf_secret_token()))
 

	
 
        self.checkSessionFlash(response, 'Added new hook')
 
        response = response.follow()
 
        response.mustcontain('test_hooks_1')
 
        response.mustcontain('cd %s' % base.TESTS_TMP_PATH)
 

	
 
    def test_edit_custom_hook(self):
 
        self.log_user()
 
        # test_edit_custom_hook
 
        response = self.app.post(base.url('admin_settings_hooks'),
 
                                params=dict(hook_ui_key='test_hooks_1',
 
                                            hook_ui_value='old_value_of_hook_1',
 
                                            hook_ui_value_new='new_value_of_hook_1',
 
                                            _session_csrf_secret_token=self.session_csrf_secret_token()))
 

	
 
        response = response.follow()
 
        response.mustcontain('test_hooks_1')
 
        response.mustcontain('new_value_of_hook_1')
 

	
 
    def test_add_existing_custom_hook(self):
 
        self.log_user()
 
        # test_add_existing_custom_hook
 
        response = self.app.post(base.url('admin_settings_hooks'),
 
                                params=dict(new_hook_ui_key='test_hooks_1',
 
                                            new_hook_ui_value='attempted_new_value',
 
                                            _session_csrf_secret_token=self.session_csrf_secret_token()))
 

	
 
        self.checkSessionFlash(response, 'Hook already exists')
 
        response = response.follow()
 
        response.mustcontain('test_hooks_1')
 
        response.mustcontain('new_value_of_hook_1')
 

	
 
    def test_create_custom_hook_delete(self):
 
        self.log_user()
 
        response = self.app.post(base.url('admin_settings_hooks'),
 
                                params=dict(new_hook_ui_key='test_hooks_2',
 
                                            new_hook_ui_value='cd %s2' % base.TESTS_TMP_PATH,
 
                                            _session_csrf_secret_token=self.session_csrf_secret_token()))
 

	
 
        self.checkSessionFlash(response, 'Added new hook')
 
        response = response.follow()
 
        response.mustcontain('test_hooks_2')
 
        response.mustcontain('cd %s2' % base.TESTS_TMP_PATH)
 

	
 
        hook_id = Ui.get_by_key('hooks', 'test_hooks_2').ui_id
 
        ## delete
 
        self.app.post(base.url('admin_settings_hooks'),
 
                        params=dict(hook_id=hook_id, _session_csrf_secret_token=self.session_csrf_secret_token()))
 
        response = self.app.get(base.url('admin_settings_hooks'))
 
        response.mustcontain(no=['test_hooks_2'])
 
        response.mustcontain(no=['cd %s2' % base.TESTS_TMP_PATH])
 

	
 
    def test_add_existing_builtin_hook(self):
 
        self.log_user()
 
        response = self.app.post(base.url('admin_settings_hooks'),
 
                                params=dict(new_hook_ui_key='changegroup.update',
 
                                            new_hook_ui_value='attempted_new_value',
 
                                            _session_csrf_secret_token=self.session_csrf_secret_token()))
 

	
 
        self.checkSessionFlash(response, 'Builtin hooks are read-only')
 
        response = response.follow()
 
        response.mustcontain('changegroup.update')
 
        response.mustcontain('hg update &gt;&amp;2')
 

	
 
    def test_index_search(self):
 
        self.log_user()
 
        response = self.app.get(base.url('admin_settings_search'))
 

	
 
    def test_index_system(self):
 
        self.log_user()
kallithea/tests/models/test_permissions.py
Show inline comments
 
@@ -23,327 +23,302 @@ class TestPermissions(base.TestControlle
 
                                                     force=True)
 
        Session().commit()
 

	
 
    def setup_method(self, method):
 
        self.u1 = UserModel().create_or_update(
 
            username='u1', password='qweqwe',
 
            email='u1@example.com', firstname='u1', lastname='u1'
 
        )
 
        self.u2 = UserModel().create_or_update(
 
            username='u2', password='qweqwe',
 
            email='u2@example.com', firstname='u2', lastname='u2'
 
        )
 
        self.u3 = UserModel().create_or_update(
 
            username='u3', password='qweqwe',
 
            email='u3@example.com', firstname='u3', lastname='u3'
 
        )
 
        self.anon = User.get_default_user()
 
        self.a1 = UserModel().create_or_update(
 
            username='a1', password='qweqwe',
 
            email='a1@example.com', firstname='a1', lastname='a1', admin=True
 
        )
 
        Session().commit()
 

	
 
    def teardown_method(self, method):
 
        if hasattr(self, 'test_repo'):
 
            RepoModel().delete(repo=self.test_repo)
 

	
 
        UserModel().delete(self.u1)
 
        UserModel().delete(self.u2)
 
        UserModel().delete(self.u3)
 
        UserModel().delete(self.a1)
 

	
 
        Session().commit() # commit early to avoid SQLAlchemy warning from double cascade delete to users_groups_members
 

	
 
        if hasattr(self, 'g1'):
 
            RepoGroupModel().delete(self.g1.group_id)
 
        if hasattr(self, 'g2'):
 
            RepoGroupModel().delete(self.g2.group_id)
 

	
 
        if hasattr(self, 'ug2'):
 
            UserGroupModel().delete(self.ug2, force=True)
 
        if hasattr(self, 'ug1'):
 
            UserGroupModel().delete(self.ug1, force=True)
 

	
 
        Session().commit()
 

	
 
    def test_default_perms_set(self):
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        perms = {
 
            'repositories_groups': {},
 
            'global': set(['hg.create.repository', 'repository.read',
 
                           'hg.register.manual_activate']),
 
            'repositories': {base.HG_REPO: 'repository.read'}
 
        }
 
        assert u1_auth.permissions['repositories'][base.HG_REPO] == perms['repositories'][base.HG_REPO]
 
        assert u1_auth.permissions['repositories'][base.HG_REPO] == 'repository.read'
 
        new_perm = 'repository.write'
 
        RepoModel().grant_user_permission(repo=base.HG_REPO, user=self.u1,
 
                                          perm=new_perm)
 
        Session().commit()
 

	
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories'][base.HG_REPO] == new_perm
 

	
 
    def test_default_admin_perms_set(self):
 
        a1_auth = AuthUser(user_id=self.a1.user_id)
 
        perms = {
 
            'repositories_groups': {},
 
            'global': set(['hg.admin', 'hg.create.write_on_repogroup.true']),
 
            'repositories': {base.HG_REPO: 'repository.admin'}
 
        }
 
        assert a1_auth.permissions['repositories'][base.HG_REPO] == perms['repositories'][base.HG_REPO]
 
        assert a1_auth.permissions['repositories'][base.HG_REPO] == 'repository.admin'
 
        new_perm = 'repository.write'
 
        RepoModel().grant_user_permission(repo=base.HG_REPO, user=self.a1,
 
                                          perm=new_perm)
 
        Session().commit()
 
        # cannot really downgrade admins permissions !? they still gets set as
 
        # admin !
 
        u1_auth = AuthUser(user_id=self.a1.user_id)
 
        assert u1_auth.permissions['repositories'][base.HG_REPO] == perms['repositories'][base.HG_REPO]
 
        assert u1_auth.permissions['repositories'][base.HG_REPO] == 'repository.admin'
 

	
 
    def test_default_group_perms(self):
 
        self.g1 = fixture.create_repo_group('test1', skip_if_exists=True)
 
        self.g2 = fixture.create_repo_group('test2', skip_if_exists=True)
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        perms = {
 
            'repositories_groups': {'test1': 'group.read', 'test2': 'group.read'},
 
            'global': set(Permission.DEFAULT_USER_PERMISSIONS),
 
            'repositories': {base.HG_REPO: 'repository.read'}
 
        }
 
        assert u1_auth.permissions['repositories'][base.HG_REPO] == perms['repositories'][base.HG_REPO]
 
        assert u1_auth.permissions['repositories_groups'] == perms['repositories_groups']
 
        assert u1_auth.permissions['global'] == perms['global']
 
        assert u1_auth.permissions['repositories'][base.HG_REPO] == 'repository.read'
 
        assert u1_auth.permissions['repositories_groups'].get('test1') == 'group.read'
 
        assert u1_auth.permissions['repositories_groups'].get('test2') == 'group.read'
 
        assert u1_auth.permissions['global'] == set(Permission.DEFAULT_USER_PERMISSIONS)
 

	
 
    def test_default_admin_group_perms(self):
 
        self.g1 = fixture.create_repo_group('test1', skip_if_exists=True)
 
        self.g2 = fixture.create_repo_group('test2', skip_if_exists=True)
 
        a1_auth = AuthUser(user_id=self.a1.user_id)
 
        perms = {
 
            'repositories_groups': {'test1': 'group.admin', 'test2': 'group.admin'},
 
            'global': set(['hg.admin', 'hg.create.write_on_repogroup.true']),
 
            'repositories': {base.HG_REPO: 'repository.admin'}
 
        }
 

	
 
        assert a1_auth.permissions['repositories'][base.HG_REPO] == perms['repositories'][base.HG_REPO]
 
        assert a1_auth.permissions['repositories_groups'] == perms['repositories_groups']
 
        assert a1_auth.permissions['repositories'][base.HG_REPO] == 'repository.admin'
 
        assert a1_auth.permissions['repositories_groups'].get('test1') == 'group.admin'
 
        assert a1_auth.permissions['repositories_groups'].get('test2') == 'group.admin'
 

	
 
    def test_propagated_permission_from_users_group_by_explicit_perms_exist(self):
 
        # make group
 
        self.ug1 = fixture.create_user_group('G1')
 
        UserGroupModel().add_user_to_group(self.ug1, self.u1)
 

	
 
        # set user permission none
 
        RepoModel().grant_user_permission(repo=base.HG_REPO, user=self.u1, perm='repository.none')
 
        Session().commit()
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories'][base.HG_REPO] == 'repository.read' # inherit from default user
 

	
 
        # grant perm for group this should override permission from user
 
        RepoModel().grant_user_group_permission(repo=base.HG_REPO,
 
                                                 group_name=self.ug1,
 
                                                 perm='repository.write')
 

	
 
        # verify that user group permissions win
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories'][base.HG_REPO] == 'repository.write'
 

	
 
    def test_propagated_permission_from_users_group(self):
 
        # make group
 
        self.ug1 = fixture.create_user_group('G1')
 
        UserGroupModel().add_user_to_group(self.ug1, self.u3)
 

	
 
        # grant perm for group this should override default permission from user
 
        new_perm_gr = 'repository.write'
 
        RepoModel().grant_user_group_permission(repo=base.HG_REPO,
 
                                                 group_name=self.ug1,
 
                                                 perm=new_perm_gr)
 
        # check perms
 
        u3_auth = AuthUser(user_id=self.u3.user_id)
 
        perms = {
 
            'repositories_groups': {},
 
            'global': set(['hg.create.repository', 'repository.read',
 
                           'hg.register.manual_activate']),
 
            'repositories': {base.HG_REPO: 'repository.read'}
 
        }
 
        assert u3_auth.permissions['repositories'][base.HG_REPO] == new_perm_gr
 
        assert u3_auth.permissions['repositories_groups'] == perms['repositories_groups']
 

	
 
    def test_propagated_permission_from_users_group_lower_weight(self):
 
        # make group
 
        self.ug1 = fixture.create_user_group('G1')
 
        # add user to group
 
        UserGroupModel().add_user_to_group(self.ug1, self.u1)
 

	
 
        # set permission to lower
 
        new_perm_h = 'repository.write'
 
        RepoModel().grant_user_permission(repo=base.HG_REPO, user=self.u1,
 
                                          perm=new_perm_h)
 
        Session().commit()
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories'][base.HG_REPO] == new_perm_h
 

	
 
        # grant perm for group this should NOT override permission from user
 
        # since it's lower than granted
 
        new_perm_l = 'repository.read'
 
        RepoModel().grant_user_group_permission(repo=base.HG_REPO,
 
                                                 group_name=self.ug1,
 
                                                 perm=new_perm_l)
 
        # check perms
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        perms = {
 
            'repositories_groups': {},
 
            'global': set(['hg.create.repository', 'repository.read',
 
                           'hg.register.manual_activate']),
 
            'repositories': {base.HG_REPO: 'repository.write'}
 
        }
 
        assert u1_auth.permissions['repositories'][base.HG_REPO] == new_perm_h
 
        assert u1_auth.permissions['repositories_groups'] == perms['repositories_groups']
 

	
 
    def test_repo_in_group_permissions(self):
 
        self.g1 = fixture.create_repo_group('group1', skip_if_exists=True)
 
        self.g2 = fixture.create_repo_group('group2', skip_if_exists=True)
 
        # both perms should be read !
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories_groups'] == {'group1': 'group.read', 'group2': 'group.read'}
 
        assert u1_auth.permissions['repositories_groups'].get('group1') == 'group.read'
 
        assert u1_auth.permissions['repositories_groups'].get('group2') == 'group.read'
 

	
 
        a1_auth = AuthUser(user_id=self.anon.user_id)
 
        assert a1_auth.permissions['repositories_groups'] == {'group1': 'group.read', 'group2': 'group.read'}
 
        assert a1_auth.permissions['repositories_groups'].get('group1') == 'group.read'
 
        assert a1_auth.permissions['repositories_groups'].get('group2') == 'group.read'
 

	
 
        # Change perms to none for both groups
 
        RepoGroupModel().grant_user_permission(repo_group=self.g1,
 
                                               user=self.anon,
 
                                               perm='group.none')
 
        RepoGroupModel().grant_user_permission(repo_group=self.g2,
 
                                               user=self.anon,
 
                                               perm='group.none')
 

	
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories_groups'] == {'group1': 'group.none', 'group2': 'group.none'}
 
        assert u1_auth.permissions['repositories_groups'].get('group1') == 'group.none'
 
        assert u1_auth.permissions['repositories_groups'].get('group2') == 'group.none'
 

	
 
        a1_auth = AuthUser(user_id=self.anon.user_id)
 
        assert a1_auth.permissions['repositories_groups'] == {'group1': 'group.none', 'group2': 'group.none'}
 
        assert a1_auth.permissions['repositories_groups'].get('group1') == 'group.none'
 
        assert a1_auth.permissions['repositories_groups'].get('group2') == 'group.none'
 

	
 
        # add repo to group
 
        name = db.URL_SEP.join([self.g1.group_name, 'test_perm'])
 
        self.test_repo = fixture.create_repo(name=name,
 
                                             repo_type='hg',
 
                                             repo_group=self.g1,
 
                                             cur_user=self.u1,)
 

	
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories_groups'] == {'group1': 'group.none', 'group2': 'group.none'}
 
        assert u1_auth.permissions['repositories_groups'].get('group1') == 'group.none'
 
        assert u1_auth.permissions['repositories_groups'].get('group2') == 'group.none'
 

	
 
        a1_auth = AuthUser(user_id=self.anon.user_id)
 
        assert a1_auth.permissions['repositories_groups'] == {'group1': 'group.none', 'group2': 'group.none'}
 
        assert a1_auth.permissions['repositories_groups'].get('group1') == 'group.none'
 
        assert a1_auth.permissions['repositories_groups'].get('group2') == 'group.none'
 

	
 
        # grant permission for u2 !
 
        RepoGroupModel().grant_user_permission(repo_group=self.g1, user=self.u2,
 
                                               perm='group.read')
 
        RepoGroupModel().grant_user_permission(repo_group=self.g2, user=self.u2,
 
                                               perm='group.read')
 
        Session().commit()
 
        assert self.u1 != self.u2
 
        # u1 and anon should have not change perms while u2 should !
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories_groups'] == {'group1': 'group.none', 'group2': 'group.none'}
 
        assert u1_auth.permissions['repositories_groups'].get('group1') == 'group.none'
 
        assert u1_auth.permissions['repositories_groups'].get('group2') == 'group.none'
 

	
 
        u2_auth = AuthUser(user_id=self.u2.user_id)
 
        assert u2_auth.permissions['repositories_groups'] == {'group1': 'group.read', 'group2': 'group.read'}
 
        assert u2_auth.permissions['repositories_groups'].get('group1') == 'group.read'
 
        assert u2_auth.permissions['repositories_groups'].get('group2') == 'group.read'
 

	
 
        a1_auth = AuthUser(user_id=self.anon.user_id)
 
        assert a1_auth.permissions['repositories_groups'] == {'group1': 'group.none', 'group2': 'group.none'}
 
        assert a1_auth.permissions['repositories_groups'].get('group1') == 'group.none'
 
        assert a1_auth.permissions['repositories_groups'].get('group2') == 'group.none'
 

	
 
    def test_repo_group_user_as_user_group_member(self):
 
        # create Group1
 
        self.g1 = fixture.create_repo_group('group1', skip_if_exists=True)
 
        a1_auth = AuthUser(user_id=self.anon.user_id)
 

	
 
        assert a1_auth.permissions['repositories_groups'] == {'group1': 'group.read'}
 
        assert a1_auth.permissions['repositories_groups'].get('group1') == 'group.read'
 

	
 
        # set default permission to none
 
        RepoGroupModel().grant_user_permission(repo_group=self.g1,
 
                                               user=self.anon,
 
                                               perm='group.none')
 
        # make group
 
        self.ug1 = fixture.create_user_group('G1')
 
        # add user to group
 
        UserGroupModel().add_user_to_group(self.ug1, self.u1)
 
        Session().commit()
 

	
 
        # check if user is in the group
 
        members = [x.user_id for x in UserGroupModel().get(self.ug1.users_group_id).members]
 
        assert members == [self.u1.user_id]
 
        # add some user to that group
 

	
 
        # check his permissions
 
        a1_auth = AuthUser(user_id=self.anon.user_id)
 
        assert a1_auth.permissions['repositories_groups'] == {'group1': 'group.none'}
 
        assert a1_auth.permissions['repositories_groups'].get('group1') == 'group.none'
 

	
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories_groups'] == {'group1': 'group.none'}
 
        assert u1_auth.permissions['repositories_groups'].get('group1') == 'group.none'
 

	
 
        # grant ug1 read permissions for
 
        RepoGroupModel().grant_user_group_permission(repo_group=self.g1,
 
                                                      group_name=self.ug1,
 
                                                      perm='group.read')
 
        Session().commit()
 
        # check if the
 
        obj = Session().query(UserGroupRepoGroupToPerm) \
 
            .filter(UserGroupRepoGroupToPerm.group == self.g1) \
 
            .filter(UserGroupRepoGroupToPerm.users_group == self.ug1) \
 
            .scalar()
 
        assert obj.permission.permission_name == 'group.read'
 

	
 
        a1_auth = AuthUser(user_id=self.anon.user_id)
 

	
 
        assert a1_auth.permissions['repositories_groups'] == {'group1': 'group.none'}
 
        assert a1_auth.permissions['repositories_groups'].get('group1') == 'group.none'
 

	
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories_groups'] == {'group1': 'group.read'}
 
        assert u1_auth.permissions['repositories_groups'].get('group1') == 'group.read'
 

	
 
    def test_inherit_nice_permissions_from_default_user(self):
 
        user_model = UserModel()
 
        # enable fork and create on default user
 
        usr = 'default'
 
        user_model.revoke_perm(usr, 'hg.create.none')
 
        user_model.grant_perm(usr, 'hg.create.repository')
 
        user_model.revoke_perm(usr, 'hg.fork.none')
 
        user_model.grant_perm(usr, 'hg.fork.repository')
 
        Session().commit()
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        # this user will have inherited permissions from default user
 
        assert u1_auth.permissions['global'] == set(['hg.create.repository', 'hg.fork.repository',
 
                              'hg.register.manual_activate',
 
                              'hg.extern_activate.auto',
 
                              'repository.read', 'group.read',
 
                              'usergroup.read', 'hg.create.write_on_repogroup.true'])
 

	
 
    def test_inherit_sad_permissions_from_default_user(self):
 
        user_model = UserModel()
 
        # disable fork and create on default user
 
        usr = 'default'
 
        user_model.revoke_perm(usr, 'hg.create.repository')
 
        user_model.grant_perm(usr, 'hg.create.none')
 
        user_model.revoke_perm(usr, 'hg.fork.repository')
 
        user_model.grant_perm(usr, 'hg.fork.none')
 
        Session().commit()
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        # this user will have inherited permissions from default user
 
        assert u1_auth.permissions['global'] == set(['hg.create.none', 'hg.fork.none',
 
                              'hg.register.manual_activate',
 
                              'hg.extern_activate.auto',
 
                              'repository.read', 'group.read',
 
                              'usergroup.read', 'hg.create.write_on_repogroup.true'])
 

	
 
    def test_inherit_more_permissions_from_default_user(self):
 
        user_model = UserModel()
 
        # enable fork and create on default user
 
        usr = 'default'
 
        user_model.revoke_perm(usr, 'hg.create.none')
 
        user_model.grant_perm(usr, 'hg.create.repository')
 
        user_model.revoke_perm(usr, 'hg.fork.none')
 
        user_model.grant_perm(usr, 'hg.fork.repository')
 

	
 
        # disable global perms on specific user
 
        user_model.revoke_perm(self.u1, 'hg.create.repository')
 
        user_model.grant_perm(self.u1, 'hg.create.none')
 
        user_model.revoke_perm(self.u1, 'hg.fork.repository')
 
@@ -471,117 +446,117 @@ class TestPermissions(base.TestControlle
 
                                          user='default',
 
                                          perm='repository.write')
 
        Session().commit()
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories']['myownrepo'] == 'repository.write'
 

	
 
    def test_inactive_user_group_does_not_affect_repo_permissions_inverse(self):
 
        self.ug1 = fixture.create_user_group('G1')
 
        user_group_model = UserGroupModel()
 
        user_group_model.add_user_to_group(self.ug1, self.u1)
 
        user_group_model.update(self.ug1, {'users_group_active': False})
 

	
 
        # note: make u2 repo owner rather than u1, because the owner always has
 
        # admin permissions
 
        self.test_repo = fixture.create_repo(name='myownrepo',
 
                                             repo_type='hg',
 
                                             cur_user=self.u2)
 

	
 
        # enable only write access for user group on repo
 
        RepoModel().grant_user_group_permission(self.test_repo,
 
                                                group_name=self.ug1,
 
                                                perm='repository.write')
 
        # enable admin access for default user on repo
 
        RepoModel().grant_user_permission(self.test_repo,
 
                                          user='default',
 
                                          perm='repository.admin')
 
        Session().commit()
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories']['myownrepo'] == 'repository.admin'
 

	
 
    def test_inactive_user_group_does_not_affect_repo_group_permissions(self):
 
        self.ug1 = fixture.create_user_group('G1')
 
        user_group_model = UserGroupModel()
 
        user_group_model.add_user_to_group(self.ug1, self.u1)
 
        user_group_model.update(self.ug1, {'users_group_active': False})
 

	
 
        self.g1 = fixture.create_repo_group('group1', skip_if_exists=True)
 

	
 
        # enable admin access for user group on repo group
 
        RepoGroupModel().grant_user_group_permission(self.g1,
 
                                                     group_name=self.ug1,
 
                                                     perm='group.admin')
 
        # enable only write access for default user on repo group
 
        RepoGroupModel().grant_user_permission(self.g1,
 
                                               user='default',
 
                                               perm='group.write')
 
        Session().commit()
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories_groups'] == {'group1': 'group.write'}
 
        assert u1_auth.permissions['repositories_groups'].get('group1') == 'group.write'
 

	
 
    def test_inactive_user_group_does_not_affect_repo_group_permissions_inverse(self):
 
        self.ug1 = fixture.create_user_group('G1')
 
        user_group_model = UserGroupModel()
 
        user_group_model.add_user_to_group(self.ug1, self.u1)
 
        user_group_model.update(self.ug1, {'users_group_active': False})
 

	
 
        self.g1 = fixture.create_repo_group('group1', skip_if_exists=True)
 

	
 
        # enable only write access for user group on repo group
 
        RepoGroupModel().grant_user_group_permission(self.g1,
 
                                                     group_name=self.ug1,
 
                                                     perm='group.write')
 
        # enable admin access for default user on repo group
 
        RepoGroupModel().grant_user_permission(self.g1,
 
                                               user='default',
 
                                               perm='group.admin')
 
        Session().commit()
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['repositories_groups'] == {'group1': 'group.admin'}
 
        assert u1_auth.permissions['repositories_groups'].get('group1') == 'group.admin'
 

	
 
    def test_inactive_user_group_does_not_affect_user_group_permissions(self):
 
        self.ug1 = fixture.create_user_group('G1')
 
        user_group_model = UserGroupModel()
 
        user_group_model.add_user_to_group(self.ug1, self.u1)
 
        user_group_model.update(self.ug1, {'users_group_active': False})
 

	
 
        self.ug2 = fixture.create_user_group('G2')
 

	
 
        # enable admin access for user group on user group
 
        UserGroupModel().grant_user_group_permission(self.ug2,
 
                                                     user_group=self.ug1,
 
                                                     perm='usergroup.admin')
 
        # enable only write access for default user on user group
 
        UserGroupModel().grant_user_permission(self.ug2,
 
                                               user='default',
 
                                               perm='usergroup.write')
 
        Session().commit()
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['user_groups']['G1'] == 'usergroup.read'
 
        assert u1_auth.permissions['user_groups']['G2'] == 'usergroup.write'
 

	
 
    def test_inactive_user_group_does_not_affect_user_group_permissions_inverse(self):
 
        self.ug1 = fixture.create_user_group('G1')
 
        user_group_model = UserGroupModel()
 
        user_group_model.add_user_to_group(self.ug1, self.u1)
 
        user_group_model.update(self.ug1, {'users_group_active': False})
 

	
 
        self.ug2 = fixture.create_user_group('G2')
 

	
 
        # enable only write access for user group on user group
 
        UserGroupModel().grant_user_group_permission(self.ug2,
 
                                                     user_group=self.ug1,
 
                                                     perm='usergroup.write')
 
        # enable admin access for default user on user group
 
        UserGroupModel().grant_user_permission(self.ug2,
 
                                               user='default',
 
                                               perm='usergroup.admin')
 
        Session().commit()
 
        u1_auth = AuthUser(user_id=self.u1.user_id)
 
        assert u1_auth.permissions['user_groups']['G1'] == 'usergroup.read'
 
        assert u1_auth.permissions['user_groups']['G2'] == 'usergroup.admin'
 

	
 
    def test_owner_permissions_doesnot_get_overwritten_by_group(self):
 
        # create repo as USER,
 
        self.test_repo = fixture.create_repo(name='myownrepo',
 
                                             repo_type='hg',
 
                                             cur_user=self.u1)
kallithea/tests/models/test_repo_groups.py
Show inline comments
 
@@ -18,97 +18,97 @@ fixture = Fixture()
 
def _update_repo_group(id_, group_name, desc='desc', parent_id=None):
 
    form_data = dict(
 
        group_name=group_name,
 
        group_description=desc,
 
        parent_group_id=parent_id,
 
        )
 
    return RepoGroupModel().update(id_, form_data)
 

	
 

	
 
def _update_repo(name, **kwargs):
 
    if 'repo_name' not in kwargs:
 
        kwargs['repo_name'] = name
 
    if 'perms_new' not in kwargs:
 
        kwargs['perms_new'] = []
 
    if 'perms_updates' not in kwargs:
 
        kwargs['perms_updates'] = []
 
    r = RepoModel().update(name, **kwargs)
 
    return r
 

	
 

	
 
class TestRepoGroups(base.TestController):
 

	
 
    def setup_method(self, method):
 
        self.g1 = fixture.create_repo_group('test1', skip_if_exists=True)
 
        self.g2 = fixture.create_repo_group('test2', skip_if_exists=True)
 
        self.g3 = fixture.create_repo_group('test3', skip_if_exists=True)
 

	
 
    def teardown_method(self, method):
 
        Session.remove()
 

	
 
    def __check_path(self, *path):
 
        """
 
        Checks the path for existence !
 
        """
 
        path = [base.TESTS_TMP_PATH] + list(path)
 
        path = os.path.join(*path)
 
        return os.path.isdir(path)
 

	
 
    def __delete_group(self, id_):
 
        RepoGroupModel().delete(id_)
 

	
 
    def test_create_group(self):
 
        g = fixture.create_repo_group('newGroup')
 
        Session().commit()
 
        assert g.full_path == 'newGroup'
 

	
 
        assert self.__check_path('newGroup')
 

	
 
    def test_create_same_name_group(self):
 
        # test_create_same_name_group
 
        with pytest.raises(IntegrityError):
 
            fixture.create_repo_group('newGroup')
 
        Session().rollback()
 

	
 
    def test_same_subgroup(self):
 
        sg1 = fixture.create_repo_group('sub1', parent_group_id=self.g1.group_id)
 
        assert sg1.parent_group == self.g1
 
        assert sg1.full_path == 'test1/sub1'
 
        assert self.__check_path('test1', 'sub1')
 

	
 
        ssg1 = fixture.create_repo_group('subsub1', parent_group_id=sg1.group_id)
 
        assert ssg1.parent_group == sg1
 
        assert ssg1.full_path == 'test1/sub1/subsub1'
 
        assert self.__check_path('test1', 'sub1', 'subsub1')
 

	
 
    def test_remove_group(self):
 
        sg1 = fixture.create_repo_group('deleteme')
 
        self.__delete_group(sg1.group_id)
 

	
 
        assert RepoGroup.get(sg1.group_id) is None
 
        assert not self.__check_path('deteteme')
 

	
 
        sg1 = fixture.create_repo_group('deleteme', parent_group_id=self.g1.group_id)
 
        self.__delete_group(sg1.group_id)
 

	
 
        assert RepoGroup.get(sg1.group_id) is None
 
        assert not self.__check_path('test1', 'deteteme')
 

	
 
    def test_rename_single_group(self):
 
        sg1 = fixture.create_repo_group('initial')
 

	
 
        new_sg1 = _update_repo_group(sg1.group_id, 'after')
 
        assert self.__check_path('after')
 
        assert RepoGroup.get_by_group_name('initial') is None
 

	
 
    def test_update_group_parent(self):
 

	
 
        sg1 = fixture.create_repo_group('initial', parent_group_id=self.g1.group_id)
 

	
 
        new_sg1 = _update_repo_group(sg1.group_id, 'after', parent_id=self.g1.group_id)
 
        assert self.__check_path('test1', 'after')
 
        assert RepoGroup.get_by_group_name('test1/initial') is None
 

	
 
        new_sg1 = _update_repo_group(sg1.group_id, 'after', parent_id=self.g3.group_id)
 
        assert self.__check_path('test3', 'after')
 
        assert RepoGroup.get_by_group_name('test3/initial') == None
 

	
 
        new_sg1 = _update_repo_group(sg1.group_id, 'hello')
kallithea/tests/other/test_auth_ldap.py
Show inline comments
 
import uuid
 

	
 
import pytest
 

	
 
from kallithea.lib.auth_modules import auth_ldap, authenticate
 
from kallithea.model.db import User
 

	
 

	
 
@pytest.fixture
 
def arrange_ldap_auth(set_test_settings):
 
    set_test_settings(
 
        ('auth_plugins', 'kallithea.lib.auth_modules.auth_ldap', 'list'),
 
        ('auth_ldap_enabled', True, 'bool'),
 
        ('auth_ldap_attr_firstname', 'test_ldap_firstname'),
 
        ('auth_ldap_attr_lastname', 'test_ldap_lastname'),
 
        ('auth_ldap_attr_email', 'test_ldap_email'))
 

	
 

	
 
class _AuthLdapMock():
 

	
 
    def __init__(self, **kwargs):
 
        pass
 

	
 
    def authenticate_ldap(self, username, password):
 
        return 'spam dn', dict(test_ldap_firstname=['spam ldap first name'],
 
                               test_ldap_lastname=['spam ldap last name'],
 
                               test_ldap_email=['spam ldap email'])
 
                               test_ldap_email=['%s ldap email' % username])
 

	
 

	
 
def test_update_user_attributes_from_ldap(monkeypatch, create_test_user,
 
                                          arrange_ldap_auth):
 
    """Authenticate user with mocked LDAP, verify attributes are updated.
 
    """
 

	
 
    # Arrange test user.
 
    uniqifier = uuid.uuid4()
 
    username = 'test-user-{0}'.format(uniqifier)
 
    assert User.get_by_username(username) is None
 
    user_input = dict(username='test-user-{0}'.format(uniqifier),
 
                      password='spam password',
 
                      email='spam-email-{0}'.format(uniqifier),
 
                      firstname='spam first name',
 
                      lastname='spam last name',
 
                      active=True,
 
                      admin=False)
 
    user = create_test_user(user_input)
 

	
 
    # Arrange LDAP auth.
 
    monkeypatch.setattr(auth_ldap, 'AuthLdap', _AuthLdapMock)
 

	
 
    # Authenticate with LDAP.
 
    user_data = authenticate(username, 'password')
 

	
 
    # Verify that authenication succeeded and retrieved correct attributes
 
    # from LDAP.
 
    assert user_data is not None
 
    assert user_data.get('firstname') == 'spam ldap first name'
 
    assert user_data.get('lastname') == 'spam ldap last name'
 
    assert user_data.get('email') == 'spam ldap email'
 
    assert user_data.get('email') == '%s ldap email' % username
 

	
 
    # Verify that authentication overwrote user attributes with the ones
 
    # retrieved from LDAP.
 
    assert user.firstname == 'spam ldap first name'
 
    assert user.lastname == 'spam ldap last name'
 
    assert user.email == 'spam ldap email'
 
    assert user.email == '%s ldap email' % username
 

	
 

	
 
def test_init_user_attributes_from_ldap(monkeypatch, arrange_ldap_auth):
 
    """Authenticate unknown user with mocked LDAP, verify user is created.
 
    """
 

	
 
    # Arrange test user.
 
    uniqifier = uuid.uuid4()
 
    username = 'test-user-{0}'.format(uniqifier)
 
    assert User.get_by_username(username) is None
 

	
 
    # Arrange LDAP auth.
 
    monkeypatch.setattr(auth_ldap, 'AuthLdap', _AuthLdapMock)
 

	
 
    # Authenticate with LDAP.
 
    user_data = authenticate(username, 'password')
 

	
 
    # Verify that authenication succeeded and retrieved correct attributes
 
    # from LDAP.
 
    assert user_data is not None
 
    assert user_data.get('firstname') == 'spam ldap first name'
 
    assert user_data.get('lastname') == 'spam ldap last name'
 
    assert user_data.get('email') == 'spam ldap email'
 
    assert user_data.get('email') == '%s ldap email' % username
 

	
 
    # Verify that authentication created new user with attributes
 
    # retrieved from LDAP.
 
    new_user = User.get_by_username(username)
 
    assert new_user is not None
 
    assert new_user.firstname == 'spam ldap first name'
 
    assert new_user.lastname == 'spam ldap last name'
 
    assert new_user.email == 'spam ldap email'
 
    assert new_user.email == '%s ldap email' % username
 

	
 

	
 
class _AuthLdapNoEmailMock():
 

	
 
    def __init__(self, **kwargs):
 
        pass
 

	
 
    def authenticate_ldap(self, username, password):
 
        return 'spam dn', dict(test_ldap_firstname=['spam ldap first name'],
 
                               test_ldap_lastname=['spam ldap last name'],
 
                               test_ldap_email=[''])
 

	
 

	
 
def test_init_user_attributes_from_ldap_with_missing_email(monkeypatch,
 
                                                           arrange_ldap_auth):
 
    """Authenticate unknown user with mocked LDAP where email is missing.
 
    """
 

	
 
    # Arrange test user.
 
    uniqifier = uuid.uuid4()
 
    username = 'test-user-{0}'.format(uniqifier)
 
    assert User.get_by_username(username) is None
 

	
 
    # Arrange LDAP auth.
 
    monkeypatch.setattr(auth_ldap, 'AuthLdap', _AuthLdapNoEmailMock)
 

	
 
    # Authenticate with LDAP.
 
    user_data = authenticate(username, 'password')
 

	
 
    # Verify that authenication succeeded and retrieved correct attributes
 
    # from LDAP, with empty email.
 
    assert user_data is not None
 
    assert user_data.get('firstname') == 'spam ldap first name'
 
    assert user_data.get('lastname') == 'spam ldap last name'
 
    assert user_data.get('email') == ''
 

	
 
    # Verify that authentication created new user with attributes
 
    # retrieved from LDAP, with email == None.
 
    new_user = User.get_by_username(username)
 
    assert new_user is not None
 
    assert new_user.firstname == 'spam ldap first name'
 
    assert new_user.lastname == 'spam ldap last name'
 
    assert new_user.email is None
scripts/contributor_data.py
Show inline comments
 
# -*- coding: utf-8 -*-
 

	
 
# Some committers are so wrong that it doesn't point at any contributor:
 
total_ignore = set()
 
total_ignore.add('*** failed to import extension hggit: No module named hggit')
 
total_ignore.add('<>')
 

	
 
# Normalize some committer names where people have contributed under different
 
# names or email addresses:
 
name_fixes = {}
 
name_fixes['Andrew Shadura'] = "Andrej Shadura <andrew@shadura.me>"
 
name_fixes['aparkar'] = "Aparkar <aparkar@icloud.com>"
 
name_fixes['Aras Pranckevicius'] = "Aras Pranckevičius <aras@unity3d.com>"
 
name_fixes['Augosto Hermann'] = "Augusto Herrmann <augusto.herrmann@planejamento.gov.br>"
 
name_fixes['"Bradley M. Kuhn" <bkuhn@ebb.org>'] = "Bradley M. Kuhn <bkuhn@sfconservancy.org>"
 
name_fixes['dmitri.kuznetsov'] = "Dmitri Kuznetsov"
 
name_fixes['Dmitri Kuznetsov'] = "Dmitri Kuznetsov"
 
name_fixes['domruf'] = "Dominik Ruf <dominikruf@gmail.com>"
 
name_fixes['Ingo von borstel'] = "Ingo von Borstel <kallithea@planetmaker.de>"
 
name_fixes['Jan Heylen'] = "Jan Heylen <heyleke@gmail.com>"
 
name_fixes['Jason F. Harris'] = "Jason Harris <jason@jasonfharris.com>"
 
name_fixes['Jelmer Vernooij'] = "Jelmer Vernooij <jelmer@samba.org>"
 
name_fixes['jfh <jason@jasonfharris.com>'] = "Jason Harris <jason@jasonfharris.com>"
 
name_fixes['Leonardo Carneiro<leonardo@unity3d.com>'] = "Leonardo Carneiro <leonardo@unity3d.com>"
 
name_fixes['leonardo'] = "Leonardo Carneiro <leonardo@unity3d.com>"
 
name_fixes['Leonardo <leo@unity3d.com>'] = "Leonardo Carneiro <leonardo@unity3d.com>"
 
name_fixes['Les Peabody'] = "Les Peabody <lpeabody@gmail.com>"
 
name_fixes['"Lorenzo M. Catucci" <lorenzo@sancho.ccd.uniroma2.it>'] = "Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it>"
 
name_fixes['Lukasz Balcerzak'] = "Łukasz Balcerzak <lukaszbalcerzak@gmail.com>"
 
name_fixes['mao <mao@lins.fju.edu.tw>'] = "Ching-Chen Mao <mao@lins.fju.edu.tw>"
 
name_fixes['marcink'] = "Marcin Kuźmiński <marcin@python-works.com>"
 
name_fixes['Marcin Kuzminski'] = "Marcin Kuźmiński <marcin@python-works.com>"
 
name_fixes['mikespook'] = "mikespook <mikespook@gmail.com>"
 
name_fixes['nansenat16@null.tw'] = "nansenat16 <nansenat16@null.tw>"
 
name_fixes['Peter Vitt'] = "Peter Vitt <petervitt@web.de>"
 
name_fixes['philip.j@hostdime.com'] = "Philip Jameson <philip.j@hostdime.com>"
 
name_fixes['Søren Løvborg'] = "Søren Løvborg <sorenl@unity3d.com>"
 
name_fixes['Thomas De Schampheleire'] = "Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>"
 
name_fixes['Hosted Weblate'] = "<>"
 
name_fixes['Weblate'] = "<>"
 
name_fixes['xpol'] = "xpol <xpolife@gmail.com>"
 
name_fixes['Lars <devel@sumpfralle.de>'] = "Lars Kruse <devel@sumpfralle.de>"
 
name_fixes['Jeannette L'] = "J. Lavoie <j.lavoie@net-c.ca>"
 

	
 
# Some committer email address domains that indicate that another entity might
 
# hold some copyright too:
 
domain_extra = {}
 
domain_extra['unity3d.com'] = "Unity Technologies"
 
domain_extra['rhodecode.com'] = "RhodeCode GmbH"
 

	
 
# Repository history show some old contributions that traditionally hasn't been
 
# listed in about.html - preserve that:
 
no_about = set(total_ignore)
 
# The following contributors were traditionally not listed in about.html and it
 
# seems unclear if the copyright is personal or belongs to a company.
 
no_about.add(('Thayne Harbaugh <thayne@fusionio.com>', '2011'))
 
no_about.add(('Dies Koper <diesk@fast.au.fujitsu.com>', '2012'))
 
no_about.add(('Erwin Kroon <e.kroon@smartmetersolutions.nl>', '2012'))
 
no_about.add(('Vincent Caron <vcaron@bearstech.com>', '2012'))
 
# These contributors' contributions might be too small to be copyrightable:
 
no_about.add(('philip.j@hostdime.com', '2012'))
 
no_about.add(('Stefan Engel <mail@engel-stefan.de>', '2012'))
 
no_about.add(('Ton Plomp <tcplomp@gmail.com>', '2013'))
 
# Was reworked and contributed later and shadowed by other contributions:
 
no_about.add(('Sean Farley <sean.michael.farley@gmail.com>', '2013'))
 

	
 
# Contributors in about.html and CONTRIBUTORS not appearing in repository
 
# history:
 
other = [
 
    # Work folded into commits attributed to others:
 
    ('2013', 'Ilya Beda <ir4y.ix@gmail.com>'),
 
    ('2015', 'Bradley M. Kuhn <bkuhn@sfconservancy.org>'),
 
    # Translators previously listed in
 
    # kallithea/i18n/*/LC_MESSAGES/kallithea.po and originating from before the
 
    # use of Weblate.
 
    ('2012', 'Augusto Herrmann <augusto.herrmann@gmail.com>'),
 
    ('2012', 'Nemcio <areczek01@gmail.com>'),
 
    ('2012', 'Nemcio <bogdan114@g.pl>'),
 
    ('2013', 'Andrey Mivrenik <myvrenik@gmail.com>'),
 
    ('2013', 'ArcheR <aleclitvinov1980@gmail.com>'),
 
    ('2013', 'gnustavo <gustavo@gnustavo.com>'),
 
    ('2013', 'ivlevdenis <ivlevdenis.ru@gmail.com>'),
 
    ('2013', 'Mikhail Zholobov <legal90@gmail.com>'),
 
    ('2013', 'mokeev1995 <mokeev_andre@mail.ru>'),
 
    ('2013', 'Nemcio <areczek01@gmail.com>'),
 
    ('2013', 'Ruslan Bekenev <furyinbox@gmail.com>'),
 
    ('2013', 'shirou - しろう'),
 
    ('2013', 'softforwinxp <softforwinxp@gmail.com>'),
 
    ('2013', 'stephanj <info@stephan-jauernick.de>'),
 
    ('2013', 'zhmylove <zhmylove@narod.ru>'),
 
    ('2013', 'こいんとす <tkondou@gmail.com>'),
0 comments (0 inline, 0 general)