# HG changeset patch # User Thomas De Schampheleire # Date 1588790183 -7200 # Node ID 106323ecfdfa05dae739ff85ccfa82459255e02a # Parent 90dd59c2a76ac90497885cbc6436d95cca8d7c14# Parent eed4281041774f299e416a6833132e981c1f6aee merge stable diff -r 90dd59c2a76a -r 106323ecfdfa .hgtags --- a/.hgtags Wed Apr 22 19:23:05 2020 +0200 +++ b/.hgtags Wed May 06 20:36:23 2020 +0200 @@ -76,3 +76,4 @@ bfa0b0a814644f0af3f492d17a9ed169cc3b89fe 0.5.0 d01a8e92936dbd62c76505432f60efba432e9397 0.5.1 aa0a637fa6f635a5e024fa56b19ed2a2dacca857 0.5.2 +9f5ca9088067618d79129d224c35c818bd2d2f12 0.6.0 diff -r 90dd59c2a76a -r 106323ecfdfa CONTRIBUTORS --- a/CONTRIBUTORS Wed Apr 22 19:23:05 2020 +0200 +++ b/CONTRIBUTORS Wed May 06 20:36:23 2020 +0200 @@ -2,7 +2,13 @@ Thomas De Schampheleire 2014-2020 Mads Kiilerich 2016-2020 + Asterios Dimitriou 2016-2017 2020 + Private 2019-2020 Dennis Fink 2020 + Étienne Gilli 2020 + J. Lavoie 2020 + robertus 2020 + Ross Thomas 2020 Andrej Shadura 2012 2014-2017 2019 Étienne Gilli 2015-2017 2019 Allan Nordhøy 2017-2019 @@ -17,7 +23,6 @@ Mateusz Mendel 2019 Nathan 2019 Oleksandr Shtalinberg 2019 - Private 2019 THANOS SIOURDAKIS 2019 Wolfgang Scherer 2019 Христо Станев 2019 @@ -34,7 +39,6 @@ Unity Technologies 2012-2017 Søren Løvborg 2015-2017 Sam Jaques 2015 2017 - Asterios Dimitriou 2016-2017 Alessandro Molina 2017 Anton Schur 2017 Ching-Chen Mao 2017 diff -r 90dd59c2a76a -r 106323ecfdfa MANIFEST.in --- a/MANIFEST.in Wed Apr 22 19:23:05 2020 +0200 +++ b/MANIFEST.in Wed May 06 20:36:23 2020 +0200 @@ -1,4 +1,5 @@ include .coveragerc +include .eslintrc.js include Apache-License-2.0.txt include CONTRIBUTORS include COPYING diff -r 90dd59c2a76a -r 106323ecfdfa docs/contributing.rst --- a/docs/contributing.rst Wed Apr 22 19:23:05 2020 +0200 +++ b/docs/contributing.rst Wed May 06 20:36:23 2020 +0200 @@ -269,8 +269,8 @@ 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. diff -r 90dd59c2a76a -r 106323ecfdfa docs/dev/i18n.rst --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/dev/i18n.rst Wed May 06 20:36:23 2020 +0200 @@ -0,0 +1,257 @@ +.. _translations: + +============ +Translations +============ + +Translations are available on Hosted Weblate at the following URL: + + https://hosted.weblate.org/projects/kallithea/kallithea/ + +Registered users may contribute to the existing languages, or request a new +language translation. + + +Translating using Weblate +------------------------- + +Weblate_ offers a simple and easy to use interface featuring glossary, machine +translation, suggestions based on similar translations in other projects, +automatic checks etc. Weblate imports the source code tree directly from +the version control system, and commits edits back from time to time. + +When registering at Weblate, make sure you use the name and email address you +prefer to be used when your changes are committed. We can and probably will +amend changesets coming from Weblate, but having things right from the beginning +makes things easier. + +Weblate performs sanity checks all the time and tries to prevent you from ignoring +them. Most common mistakes are inconsistent punctuation, whitespace, missing or extra +format parameters, untranslated strings copied into the translation. Please perform +necessary corrections when they're needed, or override the false positives. + + +Merging translations from Weblate (admin-only) +---------------------------------------------- + +Weblate rebases its changes every time it pulls from our repository. Pulls are triggered +by a web hook from Our Own Kallithea every time it receives new commits. Usually merging +the new translations is a straightforward process consisting of a pull from the Weblate-hosted +repository which is available under the Data Exports tab in the Weblate interface. + +Weblate tries to minimise the number of commits, but that doesn't always work, especially +when two translators work with different languages at more or less the same time. +It makes sense sometimes to re-order or fold commits by the same author when they touch +just the same language translation. That, however, may confuse Weblate sometimes, in +which case it should be manually convinced it has to discard the commits it created by +using its administrative interface. + + +Regenerating translations after source code changes (admin-only) +---------------------------------------------------------------- + +When the Kallithea source code changes, both the location as the content of +translation strings can change. It is therefore necessary to regularly +regenerate the `kallithea.pot` file containing these strings, as well as aligning +the translation files (`*.po`). + +First update the translation strings:: + + python3 setup.py extract_messages + +Then regenerate the translation files. This could either be done with `python3 +setup.py update_catalog` or with `msgmerge` from the `gettext` package. As +Weblate is also touching these translation files, it is preferred to use the +same tools (`msgmerge`) and settings as Weblate to minimize the diff:: + + find kallithea/i18n -name kallithea.po | xargs -I '{}' \ + msgmerge --width=76 --backup=none --previous --update '{}' \ + kallithea/i18n/kallithea.pot + + +Manual creation of a new language translation +--------------------------------------------- + +In the prepared development environment, run the following to ensure +all translation strings are extracted and up-to-date:: + + python3 setup.py extract_messages + +Create new language by executing following command:: + + python3 setup.py init_catalog -l + +This creates a new translation under directory `kallithea/i18n/` +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//LC_MESSAGES/ + +Finally, compile the translations:: + + python3 setup.py compile_catalog -l + + +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 + +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 `` +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/ diff -r 90dd59c2a76a -r 106323ecfdfa docs/dev/translation.rst --- a/docs/dev/translation.rst Wed Apr 22 19:23:05 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -.. _translations: -.. include:: ./../../kallithea/i18n/how_to diff -r 90dd59c2a76a -r 106323ecfdfa docs/index.rst --- a/docs/index.rst Wed Apr 22 19:23:05 2020 +0200 +++ b/docs/index.rst Wed May 06 20:36:23 2020 +0200 @@ -74,7 +74,7 @@ :maxdepth: 1 contributing - dev/translation + dev/i18n dev/dbmigrations diff -r 90dd59c2a76a -r 106323ecfdfa docs/setup.rst --- a/docs/setup.rst Wed Apr 22 19:23:05 2020 +0200 +++ b/docs/setup.rst Wed May 06 20:36:23 2020 +0200 @@ -153,6 +153,16 @@ 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 diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/__init__.py --- a/kallithea/__init__.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/__init__.py Wed May 06 20:36:23 2020 +0200 @@ -34,7 +34,7 @@ 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', diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/controllers/error.py --- a/kallithea/controllers/error.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/controllers/error.py Wed May 06 20:36:23 2020 +0200 @@ -41,11 +41,8 @@ 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): diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/controllers/root.py --- a/kallithea/controllers/root.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/controllers/root.py Wed May 06 20:36:23 2020 +0200 @@ -31,5 +31,5 @@ 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() diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/be/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/be/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/be/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -450,12 +450,6 @@ 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 "Занесеныя змены з аддаленага рэпазітара" @@ -1496,9 +1490,6 @@ msgid "Extra Fields" msgstr "Дадатковыя палі" -msgid "Caches" -msgstr "Кэшы" - msgid "Remote" msgstr "Выдалены" @@ -1548,26 +1539,9 @@ 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" @@ -1757,6 +1731,9 @@ msgid "Short, optional description for this user group." msgstr "Кароткае дадатковае апісанне для гэтай групы карыстальнікаў." +msgid "Active" +msgstr "Актыўны" + msgid "Show Members" msgstr "Паказаць удзельнікаў" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/da/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/da/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/da/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -486,12 +486,6 @@ 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" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/de/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/de/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/de/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -318,7 +318,7 @@ "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" @@ -327,13 +327,13 @@ 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" @@ -472,12 +472,6 @@ 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" @@ -521,7 +515,7 @@ "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" @@ -1055,6 +1049,12 @@ 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\"" @@ -1148,7 +1148,7 @@ msgstr "Setze dein Passwort zurück" msgid "Email Address" -msgstr "E-Mailadresse" +msgstr "E-Mail-Adresse" msgid "Captcha" msgstr "CAPTCHA" @@ -1156,6 +1156,13 @@ 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." @@ -1436,7 +1443,7 @@ 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." @@ -1764,9 +1771,6 @@ msgid "Extra Fields" msgstr "Extra-Feld" -msgid "Caches" -msgstr "Zwischenspeicher" - msgid "Remote" msgstr "Entfernt" @@ -1825,31 +1829,12 @@ "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" @@ -2252,6 +2237,9 @@ 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" @@ -2453,6 +2441,9 @@ msgid "or" msgstr "oder" +msgid "Upload File" +msgstr "Datei hochladen" + msgid "Commit Changes" msgstr "Änderungen einchecken" @@ -2614,6 +2605,9 @@ 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" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/el/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/el/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/el/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -28,12 +28,30 @@ 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 "" "Δεν μπορεί να γίνει σύγκριση αποθετηρίων χωρίς να χρησιμοποιηθεί κοινός " @@ -43,7 +61,7 @@ msgstr "Χωρίς απόκριση" msgid "Unknown error" -msgstr "Άγνωστο λάθος" +msgstr "Άγνωστο σφάλμα" msgid "" "The request could not be understood by the server due to malformed syntax." @@ -82,17 +100,25 @@ 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 "" @@ -100,7 +126,7 @@ "έγκυρη διακλάδωση" msgid "Edited file %s via Kallithea" -msgstr "Επεξεργασία αρχείου %s μέσω του Kallithea" +msgstr "Επεξεργασία αρχείου %s μέσω της Καλλιθέας" msgid "No changes" msgstr "Καμία αλλαγή" @@ -109,7 +135,7 @@ msgstr "Επιτυχής παράδοση σε %s" msgid "Added file via Kallithea" -msgstr "Προσθήκη αρχείου μέσω Kallithea" +msgstr "Προσθήκη αρχείου μέσω της Καλλιθέας" msgid "No content" msgstr "Χωρίς περιεχόμενο" @@ -144,7 +170,7 @@ msgstr "Ετικέτες" msgid "An error occurred during repository forking %s" -msgstr "Συνέβει ένα λάθος κατά την διακλάδωση του αποθετηρίου %s" +msgstr "Παρουσιάστηκε σφάλμα κατά την διακλάδωση του αποθετηρίου %s" msgid "Groups" msgstr "Ομάδες" @@ -204,14 +230,23 @@ 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 "Χωρίς περιγραφή" @@ -221,20 +256,52 @@ 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 "Δεν υπάρχουν ακόμα έτοιμα δεδομένα" @@ -246,13 +313,14 @@ 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 "Πάντα" @@ -273,7 +341,7 @@ msgstr "Διάρκεια ζωής" msgid "Error occurred during gist creation" -msgstr "Συνέβη μία βλάβη κατά τη δημιουργία του gist" +msgstr "Παρουσιάστηκε σφάλμα κατά τη δημιουργία του gist" msgid "Deleted gist %s" msgstr "Διαγράφηκε το gist %s" @@ -322,6 +390,12 @@ 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 "Ανάγνωση" @@ -353,10 +427,10 @@ 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" @@ -365,7 +439,7 @@ 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 αποθετήρια και δε μπορεί να διαγραφεί" @@ -377,7 +451,7 @@ msgstr "Αφαιρέθηκε η ομάδα αποθετηρίου %s" msgid "Error occurred during deletion of repository group %s" -msgstr "Συνέβει μια βλάβη κατά την διαγραφή της ομάδας αποθετηρίου %s" +msgstr "Παρουσιάστηκε σφάλμα κατά τη διαγραφή της ομάδας αποθετηρίων %s" msgid "Cannot revoke permission for yourself as admin" msgstr "Δεν μπορείτε να ανακαλέσετε την άδεια σας ως διαχειριστής" @@ -386,10 +460,10 @@ 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" @@ -404,7 +478,7 @@ msgstr "Το αποθετήριο %s ενημερώθηκε επιτυχώς" msgid "Error occurred during update of repository %s" -msgstr "Συνέβει μια βλάβη κατά την ενημέρωση του αποθετηρίου %s" +msgstr "Παρουσιάστηκε σφάλμα κατά την ενημέρωση του αποθετηρίου %s" msgid "Detached %s forks" msgstr "Αποσυνδέθηκαν %s κλώνοι" @@ -419,13 +493,19 @@ 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 "-- Όχι κλώνος --" @@ -435,7 +515,7 @@ msgid "An error occurred during setting this repository in public journal" msgstr "" -"Συνέβει μια βλάβη κατά την τοποθέτηση αυτού το αποθετηρίου στο δημόσιο " +"Παρουσιάστηκε σφάλμα κατά την τοποθέτηση αυτού το αποθετηρίου στο δημόσιο " "ημερολόγιο" msgid "Nothing" @@ -447,14 +527,3073 @@ 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} → {1}" +msgstr "Άνοιγμα νέου αιτήματος έλξης για {0} → {1}" + +msgid "Show Selected Changesets {0} → {1}" +msgstr "Εμφάνιση Επιλεγμένων Σετ Αλλαγών {0} → {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" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/fr/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/fr/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/fr/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -194,6 +194,9 @@ msgid "Journal" msgstr "Historique" +msgid "Authentication failed." +msgstr "Échec de l'authentification." + msgid "Bad captcha" msgstr "Mauvais captcha" @@ -394,6 +397,12 @@ 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" @@ -527,12 +536,6 @@ 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" @@ -680,6 +683,9 @@ 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" @@ -812,6 +818,29 @@ "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" @@ -1069,6 +1098,15 @@ 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" @@ -1563,6 +1601,9 @@ msgid "Email Addresses" msgstr "Adresses e-mail" +msgid "SSH Keys" +msgstr "Clés SSH" + msgid "API Keys" msgstr "Clés de l'API" @@ -1630,10 +1671,10 @@ 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" @@ -1670,6 +1711,21 @@ 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" @@ -1974,9 +2030,6 @@ msgid "Extra Fields" msgstr "Champs supplémentaires" -msgid "Caches" -msgstr "Caches" - msgid "Remote" msgstr "Dépôt distant" @@ -2035,31 +2088,12 @@ "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 ?" @@ -2100,6 +2134,9 @@ 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" @@ -2481,6 +2518,9 @@ 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" @@ -3097,12 +3137,18 @@ 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" @@ -3159,9 +3205,15 @@ 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" @@ -3190,7 +3242,7 @@ 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" @@ -3626,11 +3678,14 @@ 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" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/how_to --- a/kallithea/i18n/how_to Wed Apr 22 19:23:05 2020 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -============ -Translations -============ - -Translations are available on Hosted Weblate at the following URL: - - https://hosted.weblate.org/projects/kallithea/kallithea/ - -Registered users may contribute to the existing languages, or request a new -language translation. - - -Translating using Weblate -------------------------- - -Weblate_ offers a simple and easy to use interface featuring glossary, machine -translation, suggestions based on similar translations in other projects, -automatic checks etc. Weblate imports the source code tree directly from -the version control system, and commits edits back from time to time. - -When registering at Weblate, make sure you use the name and email address you -prefer to be used when your changes are committed. We can and probably will -amend changesets coming from Weblate, but having things right from the beginning -makes things easier. - -Weblate performs sanity checks all the time and tries to prevent you from ignoring -them. Most common mistakes are inconsistent punctuation, whitespace, missing or extra -format parameters, untranslated strings copied into the translation. Please perform -necessary corrections when they're needed, or override the false positives. - - -Merging translations from Weblate (admin-only) ----------------------------------------------- - -Weblate rebases its changes every time it pulls from our repository. Pulls are triggered -by a web hook from Our Own Kallithea every time it receives new commits. Usually merging -the new translations is a straightforward process consisting of a pull from the Weblate-hosted -repository which is available under the Data Exports tab in the Weblate interface. - -Weblate tries to minimise the number of commits, but that doesn't always work, especially -when two translators work with different languages at more or less the same time. -It makes sense sometimes to re-order or fold commits by the same author when they touch -just the same language translation. That, however, may confuse Weblate sometimes, in -which case it should be manually convinced it has to discard the commits it created by -using its administrative interface. - - -Regenerating translations after source code changes (admin-only) ----------------------------------------------------------------- - -When the Kallithea source code changes, both the location as the content of -translation strings can change. It is therefore necessary to regularly -regenerate the `kallithea.pot` file containing these strings, as well as aligning -the translation files (`*.po`). - -First update the translation strings:: - - python3 setup.py extract_messages - -Then regenerate the translation files. This could either be done with `python3 -setup.py update_catalog` or with `msgmerge` from the `gettext` package. As -Weblate is also touching these translation files, it is preferred to use the -same tools (`msgmerge`) and settings as Weblate to minimize the diff:: - - find kallithea/i18n -name kallithea.po | xargs -I '{}' \ - msgmerge --width=76 --backup=none --previous --update '{}' \ - kallithea/i18n/kallithea.pot - - -Manual creation of a new language translation ---------------------------------------------- - -In the prepared development environment, run the following to ensure -all translation strings are extracted and up-to-date:: - - python3 setup.py extract_messages - -Create new language by executing following command:: - - python3 setup.py init_catalog -l - -This creates a new translation under directory `kallithea/i18n/` -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//LC_MESSAGES/ - -Finally, compile the translations:: - - python3 setup.py compile_catalog -l - - -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 - -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 `` -and run Kallithea tests by executing:: - - py.test - - -.. _Weblate: http://weblate.org/ diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/ja/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/ja/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/ja/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -423,12 +423,6 @@ 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 "リモートから取得" @@ -1521,9 +1515,6 @@ msgid "Extra Fields" msgstr "拡張フィールド" -msgid "Caches" -msgstr "キャッシュ" - msgid "Remote" msgstr "リモート" @@ -1570,31 +1561,12 @@ 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" @@ -1922,6 +1894,9 @@ msgid "Short, optional description for this user group." msgstr "このユーザーグループの簡潔な説明を書いてください。" +msgid "Active" +msgstr "アクティブ" + msgid "%s user group settings" msgstr "%s ユーザーグループ設定" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/lb/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/lb/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/lb/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -13,5 +13,212 @@ 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" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/nb_NO/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/nb_NO/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/nb_NO/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -925,15 +925,12 @@ 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" @@ -1021,6 +1018,9 @@ msgid "Add User Group" msgstr "Legg til brukergruppe" +msgid "Active" +msgstr "Aktiv" + msgid "%s user group settings" msgstr "%s brukergruppeinnstillinger" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/pl/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/pl/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/pl/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -396,12 +396,6 @@ 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" @@ -1295,15 +1289,9 @@ 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" @@ -1399,6 +1387,9 @@ msgid "Add user group" msgstr "Dodaj grupę użytkowników" +msgid "Active" +msgstr "Aktywny" + msgid "Members" msgstr "Użytkownicy" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -306,9 +306,6 @@ 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" @@ -949,15 +946,9 @@ 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" @@ -1052,6 +1043,9 @@ msgid "Add user group" msgstr "Adicionar grupo de usuários" +msgid "Active" +msgstr "Ativo" + msgid "Members" msgstr "Membros" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/ru/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/ru/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/ru/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -515,12 +515,6 @@ 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 "Внесены изменения из удалённого репозитория" @@ -797,6 +791,13 @@ 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)'" @@ -1075,6 +1076,9 @@ 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 "Регистрация нового пользователя" @@ -1987,9 +1991,6 @@ msgid "Extra Fields" msgstr "Дополнительные поля" -msgid "Caches" -msgstr "Кэш" - msgid "Remote" msgstr "Удалённый репозиторий" @@ -2048,30 +2049,12 @@ "администратором. Администратор может либо удалить, либо восстановить " "репозиторий." -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" @@ -2545,6 +2528,9 @@ msgid "Short, optional description for this user group." msgstr "Краткое, опциональное описание этой группы." +msgid "Active" +msgstr "Активный" + msgid "%s user group settings" msgstr "Настройки группы %s" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/uk/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/uk/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/uk/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -503,12 +503,6 @@ 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 "Витягнуто з віддаленого місця" @@ -1144,9 +1138,6 @@ msgid "Extra Fields" msgstr "Додаткові поля" -msgid "Caches" -msgstr "Кеши" - msgid "Remote" msgstr "Віддалений" @@ -1190,31 +1181,12 @@ 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" @@ -1533,6 +1505,9 @@ msgid "Meta Tagging" msgstr "Мета-теги" +msgid "Active" +msgstr "Активний" + msgid "Files" msgstr "Файли" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -349,9 +349,6 @@ msgid "An error occurred during this operation" msgstr "在搜索操作中发生错误" -msgid "An error occurred during cache invalidation" -msgstr "清除缓存时发生错误" - msgid "Pulled from remote location" msgstr "成功拉取自远程路径" @@ -763,15 +760,9 @@ 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的默认修订版本" @@ -808,6 +799,9 @@ msgid "Show private repository icon on repositories" msgstr "显示私有版本库图标" +msgid "Active" +msgstr "启用" + msgid "Members" msgstr "成员" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/i18n/zh_TW/LC_MESSAGES/kallithea.po --- a/kallithea/i18n/zh_TW/LC_MESSAGES/kallithea.po Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/i18n/zh_TW/LC_MESSAGES/kallithea.po Wed May 06 20:36:23 2020 +0200 @@ -299,9 +299,6 @@ msgid "Remove from public journal" msgstr "從公開日誌移除" -msgid "Active" -msgstr "啟用" - msgid "Failed to remove hook" msgstr "移除hook失敗" @@ -314,6 +311,9 @@ msgid "Update repository after push (hg update)" msgstr "push後更新版本庫 (hg update)" +msgid "Active" +msgstr "啟用" + msgid "Members" msgstr "成員" diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/lib/helpers.py --- a/kallithea/lib/helpers.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/lib/helpers.py Wed May 06 20:36:23 2020 +0200 @@ -1191,18 +1191,27 @@ 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): diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/lib/hooks.py --- a/kallithea/lib/hooks.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/lib/hooks.py Wed May 06 20:36:23 2020 +0200 @@ -66,7 +66,10 @@ 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] @@ -103,12 +106,13 @@ 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) @@ -119,7 +123,7 @@ """ 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. """ diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/lib/inifile.py --- a/kallithea/lib/inifile.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/lib/inifile.py Wed May 06 20:36:23 2020 +0200 @@ -77,12 +77,13 @@ ... #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"'}, ... } @@ -96,6 +97,7 @@ variable2 = VAL2 first_extra = EXTRA + spacey = # FUNCTION RESULT @@ -114,6 +116,10 @@ variable6 = 6.2 variable7 = 7.0 #variable7 = 7.1 + #variable8 = 8.0 + + variable8 = None + variable9 = None [fourth-section] fourth = "four" @@ -160,6 +166,8 @@ 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) @@ -178,11 +186,12 @@ 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'''^ diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/templates/about.html --- a/kallithea/templates/about.html Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/templates/about.html Wed May 06 20:36:23 2020 +0200 @@ -26,9 +26,14 @@
  • Copyright © 2012–2020, Mads Kiilerich
  • Copyright © 2014–2020, Thomas De Schampheleire
  • +
  • Copyright © 2015–2017, 2019–2020, Étienne Gilli
  • +
  • Copyright © 2016–2017, 2020, Asterios Dimitriou
  • +
  • Copyright © 2019–2020, Private
  • Copyright © 2020, Dennis Fink
  • +
  • Copyright © 2020, J. Lavoie
  • +
  • Copyright © 2020, robertus
  • +
  • Copyright © 2020, Ross Thomas
  • Copyright © 2012, 2014–2017, 2019, Andrej Shadura
  • -
  • Copyright © 2015–2017, 2019, Étienne Gilli
  • Copyright © 2017–2019, Allan Nordhøy
  • Copyright © 2018–2019, ssantos
  • Copyright © 2019, Adi Kriegisch
  • @@ -41,7 +46,6 @@
  • Copyright © 2019, Mateusz Mendel
  • Copyright © 2019, Nathan
  • Copyright © 2019, Oleksandr Shtalinberg
  • -
  • Copyright © 2019, Private
  • Copyright © 2019, THANOS SIOURDAKIS
  • Copyright © 2019, Wolfgang Scherer
  • Copyright © 2019, Христо Станев
  • @@ -57,7 +61,6 @@
  • Copyright © 2012–2017, Unity Technologies
  • Copyright © 2015–2017, Søren Løvborg
  • Copyright © 2015, 2017, Sam Jaques
  • -
  • Copyright © 2016–2017, Asterios Dimitriou
  • Copyright © 2017, Alessandro Molina
  • Copyright © 2017, Anton Schur
  • Copyright © 2017, Ching-Chen Mao
  • diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/tests/api/api_base.py --- a/kallithea/tests/api/api_base.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/tests/api/api_base.py Wed May 06 20:36:23 2020 +0200 @@ -638,32 +638,32 @@ 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: diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/tests/functional/test_admin_auth_settings.py --- a/kallithea/tests/functional/test_admin_auth_settings.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/tests/functional/test_admin_auth_settings.py Wed May 06 20:36:23 2020 +0200 @@ -155,12 +155,12 @@ 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' diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/tests/functional/test_admin_settings.py --- a/kallithea/tests/functional/test_admin_settings.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/tests/functional/test_admin_settings.py Wed May 06 20:36:23 2020 +0200 @@ -46,8 +46,7 @@ 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', @@ -58,8 +57,7 @@ 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', diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/tests/models/test_permissions.py --- a/kallithea/tests/models/test_permissions.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/tests/models/test_permissions.py Wed May 06 20:36:23 2020 +0200 @@ -68,13 +68,7 @@ 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) @@ -85,12 +79,7 @@ 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) @@ -98,33 +87,24 @@ # 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 @@ -158,14 +138,7 @@ 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 @@ -189,24 +162,19 @@ 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, @@ -217,10 +185,12 @@ 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']) @@ -230,10 +200,12 @@ 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, @@ -244,20 +216,23 @@ 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, @@ -276,10 +251,10 @@ # 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, @@ -295,10 +270,10 @@ 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() @@ -516,7 +491,7 @@ 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') @@ -536,7 +511,7 @@ 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') diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/tests/models/test_repo_groups.py --- a/kallithea/tests/models/test_repo_groups.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/tests/models/test_repo_groups.py Wed May 06 20:36:23 2020 +0200 @@ -63,7 +63,7 @@ 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() diff -r 90dd59c2a76a -r 106323ecfdfa kallithea/tests/other/test_auth_ldap.py --- a/kallithea/tests/other/test_auth_ldap.py Wed Apr 22 19:23:05 2020 +0200 +++ b/kallithea/tests/other/test_auth_ldap.py Wed May 06 20:36:23 2020 +0200 @@ -24,7 +24,7 @@ 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, @@ -56,13 +56,13 @@ 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): @@ -85,7 +85,7 @@ 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. @@ -93,7 +93,7 @@ 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(): diff -r 90dd59c2a76a -r 106323ecfdfa scripts/contributor_data.py --- a/scripts/contributor_data.py Wed Apr 22 19:23:05 2020 +0200 +++ b/scripts/contributor_data.py Wed May 06 20:36:23 2020 +0200 @@ -40,6 +40,7 @@ name_fixes['Weblate'] = "<>" name_fixes['xpol'] = "xpol " name_fixes['Lars '] = "Lars Kruse " +name_fixes['Jeannette L'] = "J. Lavoie " # Some committer email address domains that indicate that another entity might # hold some copyright too: